aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-x.gitignore5
-rw-r--r--.travis.yml162
-rw-r--r--CHANGELOG79
-rw-r--r--Zotlabs/Access/AccessList.php128
-rw-r--r--Zotlabs/Daemon/Cron.php3
-rw-r--r--Zotlabs/Daemon/Cron_daily.php7
-rw-r--r--Zotlabs/Daemon/Notifier.php60
-rw-r--r--Zotlabs/Daemon/Onepoll.php24
-rw-r--r--Zotlabs/Lib/Apps.php26
-rw-r--r--Zotlabs/Lib/DB_Upgrade.php119
-rw-r--r--Zotlabs/Lib/Enotify.php9
-rw-r--r--Zotlabs/Lib/MarkdownSoap.php103
-rw-r--r--Zotlabs/Lib/NativeWiki.php4
-rw-r--r--Zotlabs/Lib/NativeWikiPage.php79
-rw-r--r--Zotlabs/Lib/ThreadItem.php19
-rw-r--r--Zotlabs/Module/Admin/Plugins.php82
-rw-r--r--Zotlabs/Module/Admin/Site.php15
-rw-r--r--Zotlabs/Module/Admin/Themes.php87
-rw-r--r--Zotlabs/Module/Bookmarks.php3
-rw-r--r--Zotlabs/Module/Cal.php3
-rw-r--r--Zotlabs/Module/Channel.php3
-rw-r--r--Zotlabs/Module/Chat.php3
-rw-r--r--Zotlabs/Module/Cloud.php2
-rw-r--r--Zotlabs/Module/Connections.php4
-rw-r--r--Zotlabs/Module/Connedit.php79
-rw-r--r--Zotlabs/Module/Cover_photo.php64
-rw-r--r--Zotlabs/Module/Directory.php1
-rw-r--r--Zotlabs/Module/Display.php1
-rw-r--r--Zotlabs/Module/Editblock.php7
-rw-r--r--Zotlabs/Module/Editlayout.php1
-rw-r--r--Zotlabs/Module/Editpost.php13
-rw-r--r--Zotlabs/Module/Editwebpage.php19
-rw-r--r--Zotlabs/Module/Embedphotos.php1
-rw-r--r--Zotlabs/Module/Feed.php49
-rw-r--r--Zotlabs/Module/File_upload.php9
-rw-r--r--Zotlabs/Module/Filer.php4
-rw-r--r--Zotlabs/Module/Filestorage.php2
-rw-r--r--Zotlabs/Module/Hcard.php10
-rw-r--r--Zotlabs/Module/Impel.php14
-rw-r--r--Zotlabs/Module/Import.php243
-rw-r--r--Zotlabs/Module/Import_items.php94
-rw-r--r--Zotlabs/Module/Item.php43
-rw-r--r--Zotlabs/Module/Layouts.php1
-rw-r--r--Zotlabs/Module/Lockview.php22
-rw-r--r--Zotlabs/Module/Mail.php62
-rw-r--r--Zotlabs/Module/Manage.php160
-rw-r--r--Zotlabs/Module/Network.php25
-rw-r--r--Zotlabs/Module/Notifications.php2
-rw-r--r--Zotlabs/Module/Ofeed.php48
-rw-r--r--Zotlabs/Module/Photo.php7
-rw-r--r--Zotlabs/Module/Photos.php241
-rw-r--r--Zotlabs/Module/Profile.php2
-rw-r--r--Zotlabs/Module/Profile_photo.php12
-rw-r--r--Zotlabs/Module/Profiles.php41
-rw-r--r--Zotlabs/Module/Pubstream.php1
-rw-r--r--Zotlabs/Module/Search.php1
-rw-r--r--Zotlabs/Module/Settings/Channel.php6
-rw-r--r--Zotlabs/Module/Setup.php9
-rw-r--r--Zotlabs/Module/Sharedwithme.php3
-rw-r--r--Zotlabs/Module/Suggest.php4
-rw-r--r--Zotlabs/Module/Viewsrc.php13
-rw-r--r--Zotlabs/Module/Webpages.php6
-rw-r--r--Zotlabs/Module/Wfinger.php61
-rw-r--r--Zotlabs/Module/Wiki.php41
-rw-r--r--Zotlabs/Module/Xrd.php2
-rw-r--r--Zotlabs/Module/Zotfeed.php3
-rw-r--r--Zotlabs/Render/Comanche.php61
-rw-r--r--Zotlabs/Storage/Browser.php14
-rw-r--r--Zotlabs/Storage/Directory.php64
-rw-r--r--Zotlabs/Storage/File.php12
-rw-r--r--Zotlabs/Web/Router.php8
-rw-r--r--Zotlabs/Web/WebServer.php19
-rw-r--r--Zotlabs/Widget/Activity.php61
-rw-r--r--Zotlabs/Widget/Admin.php68
-rw-r--r--Zotlabs/Widget/Affinity.php60
-rw-r--r--Zotlabs/Widget/Album.php106
-rw-r--r--Zotlabs/Widget/Appcategories.php49
-rw-r--r--Zotlabs/Widget/Appcloud.php13
-rw-r--r--Zotlabs/Widget/Archive.php55
-rw-r--r--Zotlabs/Widget/Bookmarkedchats.php28
-rw-r--r--Zotlabs/Widget/Catcloud_wall.php19
-rw-r--r--Zotlabs/Widget/Categories.php23
-rw-r--r--Zotlabs/Widget/Chatroom_list.php24
-rw-r--r--Zotlabs/Widget/Chatroom_members.php15
-rw-r--r--Zotlabs/Widget/Clock.php63
-rw-r--r--Zotlabs/Widget/Collections.php51
-rw-r--r--Zotlabs/Widget/Conversations.php74
-rw-r--r--Zotlabs/Widget/Cover_photo.php59
-rw-r--r--Zotlabs/Widget/Design_tools.php21
-rw-r--r--Zotlabs/Widget/Dirsort.php11
-rw-r--r--Zotlabs/Widget/Dirtags.php13
-rw-r--r--Zotlabs/Widget/Eventstools.php19
-rw-r--r--Zotlabs/Widget/Filer.php36
-rw-r--r--Zotlabs/Widget/Findpeople.php12
-rw-r--r--Zotlabs/Widget/Follow.php37
-rw-r--r--Zotlabs/Widget/Forums.php97
-rw-r--r--Zotlabs/Widget/Fullprofile.php16
-rw-r--r--Zotlabs/Widget/Helpindex.php45
-rw-r--r--Zotlabs/Widget/Item.php54
-rw-r--r--Zotlabs/Widget/Mailmenu.php36
-rw-r--r--Zotlabs/Widget/Menu_preview.php16
-rw-r--r--Zotlabs/Widget/Notes.php23
-rw-r--r--Zotlabs/Widget/Photo.php55
-rw-r--r--Zotlabs/Widget/Photo_albums.php25
-rw-r--r--Zotlabs/Widget/Photo_rand.php66
-rw-r--r--Zotlabs/Widget/Profile.php13
-rw-r--r--Zotlabs/Widget/Pubsites.php16
-rw-r--r--Zotlabs/Widget/Random_block.php46
-rw-r--r--Zotlabs/Widget/Rating.php67
-rw-r--r--Zotlabs/Widget/Savedsearch.php91
-rw-r--r--Zotlabs/Widget/Settings_menu.php137
-rw-r--r--Zotlabs/Widget/Shortprofile.php18
-rw-r--r--Zotlabs/Widget/Sitesearch.php38
-rw-r--r--Zotlabs/Widget/Suggestedchats.php37
-rw-r--r--Zotlabs/Widget/Suggestions.php58
-rw-r--r--Zotlabs/Widget/Tagcloud.php33
-rw-r--r--Zotlabs/Widget/Tagcloud_wall.php20
-rw-r--r--Zotlabs/Widget/Tasklist.php30
-rw-r--r--Zotlabs/Widget/Vcard.php12
-rw-r--r--Zotlabs/Widget/Website_portation_tools.php22
-rw-r--r--Zotlabs/Widget/Wiki_list.php23
-rw-r--r--Zotlabs/Widget/Wiki_page_history.php27
-rw-r--r--Zotlabs/Widget/Wiki_pages.php66
-rw-r--r--Zotlabs/Widget/Zcard.php11
-rw-r--r--Zotlabs/Zot/Finger.php4
-rw-r--r--Zotlabs/Zot/Receiver.php4
-rw-r--r--app/admin.pngbin2852 -> 0 bytes
-rw-r--r--app/features.apd6
-rw-r--r--app/features.pngbin8542 -> 0 bytes
-rw-r--r--app/login.apd5
-rw-r--r--app/manage.apd6
-rw-r--r--app/manage.pngbin7355 -> 0 bytes
-rw-r--r--app/profile.apd6
-rw-r--r--app/profile.pngbin3550 -> 0 bytes
-rw-r--r--app/settings.apd6
-rw-r--r--app/settings.pngbin7958 -> 0 bytes
-rwxr-xr-xboot.php275
-rw-r--r--composer.json22
-rw-r--r--composer.lock3695
-rw-r--r--doc/Widgets.md1
-rw-r--r--doc/about/hubzilla_project.bb3
-rw-r--r--doc/database/db_account.bb1
-rw-r--r--doc/dev-function-overview.md4
-rw-r--r--doc/developer/api_zot.bb2
-rw-r--r--doc/hook/author_is_pmable.bb14
-rw-r--r--doc/hook/probe_well_known.bb3
-rw-r--r--doc/hooklist.bb8
-rw-r--r--doc/member/member_guide.bb2
-rw-r--r--doc/toc.html70
-rw-r--r--images/emoji/0023-20e3.pngbin604 -> 0 bytes
-rw-r--r--images/emoji/0023.pngbin634 -> 0 bytes
-rw-r--r--images/emoji/002a-20e3.pngbin627 -> 0 bytes
-rw-r--r--images/emoji/002a.pngbin645 -> 0 bytes
-rw-r--r--images/emoji/0030-20e3.pngbin560 -> 0 bytes
-rw-r--r--images/emoji/0030.pngbin573 -> 0 bytes
-rw-r--r--images/emoji/0031-20e3.pngbin442 -> 0 bytes
-rw-r--r--images/emoji/0031.pngbin505 -> 0 bytes
-rw-r--r--images/emoji/0032-20e3.pngbin567 -> 0 bytes
-rw-r--r--images/emoji/0032.pngbin604 -> 0 bytes
-rw-r--r--images/emoji/0033-20e3.pngbin602 -> 0 bytes
-rw-r--r--images/emoji/0033.pngbin644 -> 0 bytes
-rw-r--r--images/emoji/0034-20e3.pngbin497 -> 0 bytes
-rw-r--r--images/emoji/0034.pngbin542 -> 0 bytes
-rw-r--r--images/emoji/0035-20e3.pngbin577 -> 0 bytes
-rw-r--r--images/emoji/0035.pngbin615 -> 0 bytes
-rw-r--r--images/emoji/0036-20e3.pngbin612 -> 0 bytes
-rw-r--r--images/emoji/0036.pngbin649 -> 0 bytes
-rw-r--r--images/emoji/0037-20e3.pngbin522 -> 0 bytes
-rw-r--r--images/emoji/0037.pngbin559 -> 0 bytes
-rw-r--r--images/emoji/0038-20e3.pngbin608 -> 0 bytes
-rw-r--r--images/emoji/0038.pngbin646 -> 0 bytes
-rw-r--r--images/emoji/0039-20e3.pngbin607 -> 0 bytes
-rw-r--r--images/emoji/0039.pngbin654 -> 0 bytes
-rw-r--r--images/emoji/00a9.pngbin530 -> 0 bytes
-rw-r--r--images/emoji/00ae.pngbin547 -> 0 bytes
-rw-r--r--images/emoji/1f004.pngbin951 -> 0 bytes
-rw-r--r--images/emoji/1f0cf.pngbin1091 -> 0 bytes
-rw-r--r--images/emoji/1f170.pngbin469 -> 0 bytes
-rw-r--r--images/emoji/1f171.pngbin391 -> 0 bytes
-rw-r--r--images/emoji/1f17e.pngbin425 -> 0 bytes
-rw-r--r--images/emoji/1f17f.pngbin385 -> 0 bytes
-rw-r--r--images/emoji/1f18e.pngbin505 -> 0 bytes
-rw-r--r--images/emoji/1f191.pngbin393 -> 0 bytes
-rw-r--r--images/emoji/1f192.pngbin396 -> 0 bytes
-rw-r--r--images/emoji/1f193.pngbin370 -> 0 bytes
-rw-r--r--images/emoji/1f194.pngbin348 -> 0 bytes
-rw-r--r--images/emoji/1f195.pngbin486 -> 0 bytes
-rw-r--r--images/emoji/1f196.pngbin445 -> 0 bytes
-rw-r--r--images/emoji/1f197.pngbin511 -> 0 bytes
-rw-r--r--images/emoji/1f198.pngbin604 -> 0 bytes
-rw-r--r--images/emoji/1f199.pngbin405 -> 0 bytes
-rw-r--r--images/emoji/1f19a.pngbin604 -> 0 bytes
-rw-r--r--images/emoji/1f1e6-1f1e8.pngbin1935 -> 0 bytes
-rw-r--r--images/emoji/1f1e6-1f1e9.pngbin1285 -> 0 bytes
-rw-r--r--images/emoji/1f1e6-1f1ea.pngbin544 -> 0 bytes
-rw-r--r--images/emoji/1f1e6-1f1eb.pngbin942 -> 0 bytes
-rw-r--r--images/emoji/1f1e6-1f1ec.pngbin913 -> 0 bytes
-rw-r--r--images/emoji/1f1e6-1f1ee.pngbin1056 -> 0 bytes
-rw-r--r--images/emoji/1f1e6-1f1f1.pngbin905 -> 0 bytes
-rw-r--r--images/emoji/1f1e6-1f1f2.pngbin514 -> 0 bytes
-rw-r--r--images/emoji/1f1e6-1f1f4.pngbin997 -> 0 bytes
-rw-r--r--images/emoji/1f1e6-1f1f6.pngbin657 -> 0 bytes
-rw-r--r--images/emoji/1f1e6-1f1f7.pngbin975 -> 0 bytes
-rw-r--r--images/emoji/1f1e6-1f1f8.pngbin1489 -> 0 bytes
-rw-r--r--images/emoji/1f1e6-1f1f9.pngbin430 -> 0 bytes
-rw-r--r--images/emoji/1f1e6-1f1fa.pngbin962 -> 0 bytes
-rw-r--r--images/emoji/1f1e6-1f1fc.pngbin709 -> 0 bytes
-rw-r--r--images/emoji/1f1e6-1f1fd.pngbin496 -> 0 bytes
-rw-r--r--images/emoji/1f1e6-1f1ff.pngbin709 -> 0 bytes
-rw-r--r--images/emoji/1f1e7-1f1e6.pngbin848 -> 0 bytes
-rw-r--r--images/emoji/1f1e7-1f1e7.pngbin789 -> 0 bytes
-rw-r--r--images/emoji/1f1e7-1f1e9.pngbin490 -> 0 bytes
-rw-r--r--images/emoji/1f1e7-1f1ea.pngbin444 -> 0 bytes
-rw-r--r--images/emoji/1f1e7-1f1eb.pngbin717 -> 0 bytes
-rw-r--r--images/emoji/1f1e7-1f1ec.pngbin513 -> 0 bytes
-rw-r--r--images/emoji/1f1e7-1f1ed.pngbin593 -> 0 bytes
-rw-r--r--images/emoji/1f1e7-1f1ee.pngbin795 -> 0 bytes
-rw-r--r--images/emoji/1f1e7-1f1ef.pngbin554 -> 0 bytes
-rw-r--r--images/emoji/1f1e7-1f1f1.pngbin1692 -> 0 bytes
-rw-r--r--images/emoji/1f1e7-1f1f2.pngbin1374 -> 0 bytes
-rw-r--r--images/emoji/1f1e7-1f1f3.pngbin1358 -> 0 bytes
-rw-r--r--images/emoji/1f1e7-1f1f4.pngbin1132 -> 0 bytes
-rw-r--r--images/emoji/1f1e7-1f1f6.pngbin1144 -> 0 bytes
-rw-r--r--images/emoji/1f1e7-1f1f7.pngbin819 -> 0 bytes
-rw-r--r--images/emoji/1f1e7-1f1f8.pngbin448 -> 0 bytes
-rw-r--r--images/emoji/1f1e7-1f1f9.pngbin1214 -> 0 bytes
-rw-r--r--images/emoji/1f1e7-1f1fb.pngbin495 -> 0 bytes
-rw-r--r--images/emoji/1f1e7-1f1fc.pngbin391 -> 0 bytes
-rw-r--r--images/emoji/1f1e7-1f1fe.pngbin1120 -> 0 bytes
-rw-r--r--images/emoji/1f1e7-1f1ff.pngbin1597 -> 0 bytes
-rw-r--r--images/emoji/1f1e7.pngbin572 -> 0 bytes
-rw-r--r--images/emoji/1f1e8-1f1e6.pngbin755 -> 0 bytes
-rw-r--r--images/emoji/1f1e8-1f1e8.pngbin851 -> 0 bytes
-rw-r--r--images/emoji/1f1e8-1f1e9.pngbin707 -> 0 bytes
-rw-r--r--images/emoji/1f1e8-1f1eb.pngbin673 -> 0 bytes
-rw-r--r--images/emoji/1f1e8-1f1ec.pngbin586 -> 0 bytes
-rw-r--r--images/emoji/1f1e8-1f1ed.pngbin390 -> 0 bytes
-rw-r--r--images/emoji/1f1e8-1f1ee.pngbin440 -> 0 bytes
-rw-r--r--images/emoji/1f1e8-1f1f0.pngbin1083 -> 0 bytes
-rw-r--r--images/emoji/1f1e8-1f1f1.pngbin748 -> 0 bytes
-rw-r--r--images/emoji/1f1e8-1f1f2.pngbin627 -> 0 bytes
-rw-r--r--images/emoji/1f1e8-1f1f3.pngbin676 -> 0 bytes
-rw-r--r--images/emoji/1f1e8-1f1f4.pngbin524 -> 0 bytes
-rw-r--r--images/emoji/1f1e8-1f1f5.pngbin443 -> 0 bytes
-rw-r--r--images/emoji/1f1e8-1f1f7.pngbin419 -> 0 bytes
-rw-r--r--images/emoji/1f1e8-1f1fa.pngbin586 -> 0 bytes
-rw-r--r--images/emoji/1f1e8-1f1fb.pngbin642 -> 0 bytes
-rw-r--r--images/emoji/1f1e8-1f1fc.pngbin665 -> 0 bytes
-rw-r--r--images/emoji/1f1e8-1f1fd.pngbin1142 -> 0 bytes
-rw-r--r--images/emoji/1f1e8-1f1fe.pngbin830 -> 0 bytes
-rw-r--r--images/emoji/1f1e8-1f1ff.pngbin600 -> 0 bytes
-rw-r--r--images/emoji/1f1e8.pngbin612 -> 0 bytes
-rw-r--r--images/emoji/1f1e9-1f1ea.pngbin502 -> 0 bytes
-rw-r--r--images/emoji/1f1e9-1f1ec.pngbin1918 -> 0 bytes
-rw-r--r--images/emoji/1f1e9-1f1ef.pngbin753 -> 0 bytes
-rw-r--r--images/emoji/1f1e9-1f1f0.pngbin450 -> 0 bytes
-rw-r--r--images/emoji/1f1e9-1f1f2.pngbin1077 -> 0 bytes
-rw-r--r--images/emoji/1f1e9-1f1f4.pngbin1135 -> 0 bytes
-rw-r--r--images/emoji/1f1e9-1f1ff.pngbin734 -> 0 bytes
-rw-r--r--images/emoji/1f1e9.pngbin561 -> 0 bytes
-rw-r--r--images/emoji/1f1ea-1f1e6.pngbin1338 -> 0 bytes
-rw-r--r--images/emoji/1f1ea-1f1e8.pngbin1431 -> 0 bytes
-rw-r--r--images/emoji/1f1ea-1f1ea.pngbin512 -> 0 bytes
-rw-r--r--images/emoji/1f1ea-1f1ec.pngbin818 -> 0 bytes
-rw-r--r--images/emoji/1f1ea-1f1ed.pngbin742 -> 0 bytes
-rw-r--r--images/emoji/1f1ea-1f1f7.pngbin1218 -> 0 bytes
-rw-r--r--images/emoji/1f1ea-1f1f8.pngbin1338 -> 0 bytes
-rw-r--r--images/emoji/1f1ea-1f1f9.pngbin947 -> 0 bytes
-rw-r--r--images/emoji/1f1ea-1f1fa.pngbin760 -> 0 bytes
-rw-r--r--images/emoji/1f1ea.pngbin443 -> 0 bytes
-rw-r--r--images/emoji/1f1eb-1f1ee.pngbin487 -> 0 bytes
-rw-r--r--images/emoji/1f1eb-1f1ef.pngbin1381 -> 0 bytes
-rw-r--r--images/emoji/1f1eb-1f1f0.pngbin1558 -> 0 bytes
-rw-r--r--images/emoji/1f1eb-1f1f2.pngbin554 -> 0 bytes
-rw-r--r--images/emoji/1f1eb-1f1f4.pngbin495 -> 0 bytes
-rw-r--r--images/emoji/1f1eb-1f1f7.pngbin443 -> 0 bytes
-rw-r--r--images/emoji/1f1eb.pngbin462 -> 0 bytes
-rw-r--r--images/emoji/1f1ec-1f1e6.pngbin512 -> 0 bytes
-rw-r--r--images/emoji/1f1ec-1f1e7.pngbin919 -> 0 bytes
-rw-r--r--images/emoji/1f1ec-1f1e9.pngbin1017 -> 0 bytes
-rw-r--r--images/emoji/1f1ec-1f1ea.pngbin583 -> 0 bytes
-rw-r--r--images/emoji/1f1ec-1f1eb.pngbin865 -> 0 bytes
-rw-r--r--images/emoji/1f1ec-1f1ec.pngbin521 -> 0 bytes
-rw-r--r--images/emoji/1f1ec-1f1ed.pngbin723 -> 0 bytes
-rw-r--r--images/emoji/1f1ec-1f1ee.pngbin1053 -> 0 bytes
-rw-r--r--images/emoji/1f1ec-1f1f1.pngbin700 -> 0 bytes
-rw-r--r--images/emoji/1f1ec-1f1f2.pngbin501 -> 0 bytes
-rw-r--r--images/emoji/1f1ec-1f1f3.pngbin434 -> 0 bytes
-rw-r--r--images/emoji/1f1ec-1f1f5.pngbin1587 -> 0 bytes
-rw-r--r--images/emoji/1f1ec-1f1f6.pngbin1132 -> 0 bytes
-rw-r--r--images/emoji/1f1ec-1f1f7.pngbin549 -> 0 bytes
-rw-r--r--images/emoji/1f1ec-1f1f8.pngbin2115 -> 0 bytes
-rw-r--r--images/emoji/1f1ec-1f1f9.pngbin1087 -> 0 bytes
-rw-r--r--images/emoji/1f1ec-1f1fa.pngbin1045 -> 0 bytes
-rw-r--r--images/emoji/1f1ec-1f1fc.pngbin705 -> 0 bytes
-rw-r--r--images/emoji/1f1ec-1f1fe.pngbin690 -> 0 bytes
-rw-r--r--images/emoji/1f1ec.pngbin644 -> 0 bytes
-rw-r--r--images/emoji/1f1ed-1f1f0.pngbin759 -> 0 bytes
-rw-r--r--images/emoji/1f1ed-1f1f2.pngbin1036 -> 0 bytes
-rw-r--r--images/emoji/1f1ed-1f1f3.pngbin513 -> 0 bytes
-rw-r--r--images/emoji/1f1ed-1f1f7.pngbin1411 -> 0 bytes
-rw-r--r--images/emoji/1f1ed-1f1f9.pngbin1205 -> 0 bytes
-rw-r--r--images/emoji/1f1ed-1f1fa.pngbin513 -> 0 bytes
-rw-r--r--images/emoji/1f1ed.pngbin434 -> 0 bytes
-rw-r--r--images/emoji/1f1ee-1f1e8.pngbin1330 -> 0 bytes
-rw-r--r--images/emoji/1f1ee-1f1e9.pngbin498 -> 0 bytes
-rw-r--r--images/emoji/1f1ee-1f1ea.pngbin478 -> 0 bytes
-rw-r--r--images/emoji/1f1ee-1f1f1.pngbin658 -> 0 bytes
-rw-r--r--images/emoji/1f1ee-1f1f2.pngbin976 -> 0 bytes
-rw-r--r--images/emoji/1f1ee-1f1f3.pngbin773 -> 0 bytes
-rw-r--r--images/emoji/1f1ee-1f1f4.pngbin1918 -> 0 bytes
-rw-r--r--images/emoji/1f1ee-1f1f6.pngbin811 -> 0 bytes
-rw-r--r--images/emoji/1f1ee-1f1f7.pngbin1036 -> 0 bytes
-rw-r--r--images/emoji/1f1ee-1f1f8.pngbin491 -> 0 bytes
-rw-r--r--images/emoji/1f1ee-1f1f9.pngbin472 -> 0 bytes
-rw-r--r--images/emoji/1f1ee.pngbin395 -> 0 bytes
-rw-r--r--images/emoji/1f1ef-1f1ea.pngbin956 -> 0 bytes
-rw-r--r--images/emoji/1f1ef-1f1f2.pngbin837 -> 0 bytes
-rw-r--r--images/emoji/1f1ef-1f1f4.pngbin740 -> 0 bytes
-rw-r--r--images/emoji/1f1ef-1f1f5.pngbin455 -> 0 bytes
-rw-r--r--images/emoji/1f1ef.pngbin527 -> 0 bytes
-rw-r--r--images/emoji/1f1f0-1f1ea.pngbin1160 -> 0 bytes
-rw-r--r--images/emoji/1f1f0-1f1ec.pngbin1081 -> 0 bytes
-rw-r--r--images/emoji/1f1f0-1f1ed.pngbin872 -> 0 bytes
-rw-r--r--images/emoji/1f1f0-1f1ee.pngbin1375 -> 0 bytes
-rw-r--r--images/emoji/1f1f0-1f1f2.pngbin783 -> 0 bytes
-rw-r--r--images/emoji/1f1f0-1f1f3.pngbin1316 -> 0 bytes
-rw-r--r--images/emoji/1f1f0-1f1f5.pngbin696 -> 0 bytes
-rw-r--r--images/emoji/1f1f0-1f1f7.pngbin968 -> 0 bytes
-rw-r--r--images/emoji/1f1f0-1f1fc.pngbin560 -> 0 bytes
-rw-r--r--images/emoji/1f1f0-1f1fe.pngbin1671 -> 0 bytes
-rw-r--r--images/emoji/1f1f0-1f1ff.pngbin1136 -> 0 bytes
-rw-r--r--images/emoji/1f1f0.pngbin582 -> 0 bytes
-rw-r--r--images/emoji/1f1f1-1f1e6.pngbin479 -> 0 bytes
-rw-r--r--images/emoji/1f1f1-1f1e7.pngbin740 -> 0 bytes
-rw-r--r--images/emoji/1f1f1-1f1e8.pngbin561 -> 0 bytes
-rw-r--r--images/emoji/1f1f1-1f1ee.pngbin946 -> 0 bytes
-rw-r--r--images/emoji/1f1f1-1f1f0.pngbin974 -> 0 bytes
-rw-r--r--images/emoji/1f1f1-1f1f7.pngbin772 -> 0 bytes
-rw-r--r--images/emoji/1f1f1-1f1f8.pngbin775 -> 0 bytes
-rw-r--r--images/emoji/1f1f1-1f1f9.pngbin510 -> 0 bytes
-rw-r--r--images/emoji/1f1f1-1f1fa.pngbin512 -> 0 bytes
-rw-r--r--images/emoji/1f1f1-1f1fb.pngbin388 -> 0 bytes
-rw-r--r--images/emoji/1f1f1-1f1fe.pngbin685 -> 0 bytes
-rw-r--r--images/emoji/1f1f1.pngbin436 -> 0 bytes
-rw-r--r--images/emoji/1f1f2-1f1e6.pngbin626 -> 0 bytes
-rw-r--r--images/emoji/1f1f2-1f1e8.pngbin528 -> 0 bytes
-rw-r--r--images/emoji/1f1f2-1f1e9.pngbin1170 -> 0 bytes
-rw-r--r--images/emoji/1f1f2-1f1ea.pngbin1074 -> 0 bytes
-rw-r--r--images/emoji/1f1f2-1f1eb.pngbin443 -> 0 bytes
-rw-r--r--images/emoji/1f1f2-1f1ec.pngbin556 -> 0 bytes
-rw-r--r--images/emoji/1f1f2-1f1ed.pngbin1138 -> 0 bytes
-rw-r--r--images/emoji/1f1f2-1f1f0.pngbin1023 -> 0 bytes
-rw-r--r--images/emoji/1f1f2-1f1f1.pngbin440 -> 0 bytes
-rw-r--r--images/emoji/1f1f2-1f1f2.pngbin937 -> 0 bytes
-rw-r--r--images/emoji/1f1f2-1f1f3.pngbin698 -> 0 bytes
-rw-r--r--images/emoji/1f1f2-1f1f4.pngbin792 -> 0 bytes
-rw-r--r--images/emoji/1f1f2-1f1f5.pngbin1797 -> 0 bytes
-rw-r--r--images/emoji/1f1f2-1f1f6.pngbin780 -> 0 bytes
-rw-r--r--images/emoji/1f1f2-1f1f7.pngbin657 -> 0 bytes
-rw-r--r--images/emoji/1f1f2-1f1f8.pngbin1477 -> 0 bytes
-rw-r--r--images/emoji/1f1f2-1f1f9.pngbin799 -> 0 bytes
-rw-r--r--images/emoji/1f1f2-1f1fa.pngbin544 -> 0 bytes
-rw-r--r--images/emoji/1f1f2-1f1fb.pngbin598 -> 0 bytes
-rw-r--r--images/emoji/1f1f2-1f1fc.pngbin825 -> 0 bytes
-rw-r--r--images/emoji/1f1f2-1f1fd.pngbin951 -> 0 bytes
-rw-r--r--images/emoji/1f1f2-1f1fe.pngbin775 -> 0 bytes
-rw-r--r--images/emoji/1f1f2-1f1ff.pngbin1159 -> 0 bytes
-rw-r--r--images/emoji/1f1f2.pngbin666 -> 0 bytes
-rw-r--r--images/emoji/1f1f3-1f1e6.pngbin1249 -> 0 bytes
-rw-r--r--images/emoji/1f1f3-1f1e8.pngbin1151 -> 0 bytes
-rw-r--r--images/emoji/1f1f3-1f1ea.pngbin593 -> 0 bytes
-rw-r--r--images/emoji/1f1f3-1f1eb.pngbin877 -> 0 bytes
-rw-r--r--images/emoji/1f1f3-1f1ec.pngbin438 -> 0 bytes
-rw-r--r--images/emoji/1f1f3-1f1ee.pngbin823 -> 0 bytes
-rw-r--r--images/emoji/1f1f3-1f1f1.pngbin499 -> 0 bytes
-rw-r--r--images/emoji/1f1f3-1f1f4.pngbin484 -> 0 bytes
-rw-r--r--images/emoji/1f1f3-1f1f5.pngbin802 -> 0 bytes
-rw-r--r--images/emoji/1f1f3-1f1f7.pngbin529 -> 0 bytes
-rw-r--r--images/emoji/1f1f3-1f1fa.pngbin1128 -> 0 bytes
-rw-r--r--images/emoji/1f1f3-1f1ff.pngbin1099 -> 0 bytes
-rw-r--r--images/emoji/1f1f3.pngbin579 -> 0 bytes
-rw-r--r--images/emoji/1f1f4-1f1f2.pngbin754 -> 0 bytes
-rw-r--r--images/emoji/1f1f4.pngbin607 -> 0 bytes
-rw-r--r--images/emoji/1f1f5-1f1e6.pngbin830 -> 0 bytes
-rw-r--r--images/emoji/1f1f5-1f1ea.pngbin439 -> 0 bytes
-rw-r--r--images/emoji/1f1f5-1f1eb.pngbin1091 -> 0 bytes
-rw-r--r--images/emoji/1f1f5-1f1ec.pngbin1076 -> 0 bytes
-rw-r--r--images/emoji/1f1f5-1f1ed.pngbin867 -> 0 bytes
-rw-r--r--images/emoji/1f1f5-1f1f0.pngbin753 -> 0 bytes
-rw-r--r--images/emoji/1f1f5-1f1f1.pngbin522 -> 0 bytes
-rw-r--r--images/emoji/1f1f5-1f1f2.pngbin2314 -> 0 bytes
-rw-r--r--images/emoji/1f1f5-1f1f3.pngbin1896 -> 0 bytes
-rw-r--r--images/emoji/1f1f5-1f1f7.pngbin605 -> 0 bytes
-rw-r--r--images/emoji/1f1f5-1f1f8.pngbin574 -> 0 bytes
-rw-r--r--images/emoji/1f1f5-1f1f9.pngbin1055 -> 0 bytes
-rw-r--r--images/emoji/1f1f5-1f1fc.pngbin475 -> 0 bytes
-rw-r--r--images/emoji/1f1f5-1f1fe.pngbin1085 -> 0 bytes
-rw-r--r--images/emoji/1f1f5.pngbin541 -> 0 bytes
-rw-r--r--images/emoji/1f1f6-1f1e6.pngbin657 -> 0 bytes
-rw-r--r--images/emoji/1f1f6.pngbin659 -> 0 bytes
-rw-r--r--images/emoji/1f1f7-1f1ea.pngbin837 -> 0 bytes
-rw-r--r--images/emoji/1f1f7-1f1f4.pngbin441 -> 0 bytes
-rw-r--r--images/emoji/1f1f7-1f1f8.pngbin1237 -> 0 bytes
-rw-r--r--images/emoji/1f1f7-1f1fa.pngbin496 -> 0 bytes
-rw-r--r--images/emoji/1f1f7-1f1fc.pngbin940 -> 0 bytes
-rw-r--r--images/emoji/1f1f7.pngbin580 -> 0 bytes
-rw-r--r--images/emoji/1f1f8-1f1e6.pngbin781 -> 0 bytes
-rw-r--r--images/emoji/1f1f8-1f1e7.pngbin1102 -> 0 bytes
-rw-r--r--images/emoji/1f1f8-1f1e8.pngbin1073 -> 0 bytes
-rw-r--r--images/emoji/1f1f8-1f1e9.pngbin578 -> 0 bytes
-rw-r--r--images/emoji/1f1f8-1f1ea.pngbin455 -> 0 bytes
-rw-r--r--images/emoji/1f1f8-1f1ec.pngbin730 -> 0 bytes
-rw-r--r--images/emoji/1f1f8-1f1ed.pngbin1369 -> 0 bytes
-rw-r--r--images/emoji/1f1f8-1f1ee.pngbin1030 -> 0 bytes
-rw-r--r--images/emoji/1f1f8-1f1ef.pngbin495 -> 0 bytes
-rw-r--r--images/emoji/1f1f8-1f1f0.pngbin780 -> 0 bytes
-rw-r--r--images/emoji/1f1f8-1f1f1.pngbin510 -> 0 bytes
-rw-r--r--images/emoji/1f1f8-1f1f2.pngbin2001 -> 0 bytes
-rw-r--r--images/emoji/1f1f8-1f1f3.pngbin621 -> 0 bytes
-rw-r--r--images/emoji/1f1f8-1f1f4.pngbin609 -> 0 bytes
-rw-r--r--images/emoji/1f1f8-1f1f7.pngbin650 -> 0 bytes
-rw-r--r--images/emoji/1f1f8-1f1f8.pngbin722 -> 0 bytes
-rw-r--r--images/emoji/1f1f8-1f1f9.pngbin562 -> 0 bytes
-rw-r--r--images/emoji/1f1f8-1f1fb.pngbin1125 -> 0 bytes
-rw-r--r--images/emoji/1f1f8-1f1fd.pngbin1195 -> 0 bytes
-rw-r--r--images/emoji/1f1f8-1f1fe.pngbin696 -> 0 bytes
-rw-r--r--images/emoji/1f1f8-1f1ff.pngbin1102 -> 0 bytes
-rw-r--r--images/emoji/1f1f8.pngbin653 -> 0 bytes
-rw-r--r--images/emoji/1f1f9-1f1e6.pngbin1907 -> 0 bytes
-rw-r--r--images/emoji/1f1f9-1f1e8.pngbin1538 -> 0 bytes
-rw-r--r--images/emoji/1f1f9-1f1e9.pngbin443 -> 0 bytes
-rw-r--r--images/emoji/1f1f9-1f1eb.pngbin857 -> 0 bytes
-rw-r--r--images/emoji/1f1f9-1f1ec.pngbin790 -> 0 bytes
-rw-r--r--images/emoji/1f1f9-1f1ed.pngbin421 -> 0 bytes
-rw-r--r--images/emoji/1f1f9-1f1ef.pngbin906 -> 0 bytes
-rw-r--r--images/emoji/1f1f9-1f1f0.pngbin835 -> 0 bytes
-rw-r--r--images/emoji/1f1f9-1f1f1.pngbin849 -> 0 bytes
-rw-r--r--images/emoji/1f1f9-1f1f2.pngbin1178 -> 0 bytes
-rw-r--r--images/emoji/1f1f9-1f1f3.pngbin625 -> 0 bytes
-rw-r--r--images/emoji/1f1f9-1f1f4.pngbin553 -> 0 bytes
-rw-r--r--images/emoji/1f1f9-1f1f7.pngbin576 -> 0 bytes
-rw-r--r--images/emoji/1f1f9-1f1f9.pngbin604 -> 0 bytes
-rw-r--r--images/emoji/1f1f9-1f1fb.pngbin1120 -> 0 bytes
-rw-r--r--images/emoji/1f1f9-1f1fc.pngbin761 -> 0 bytes
-rw-r--r--images/emoji/1f1f9-1f1ff.pngbin1061 -> 0 bytes
-rw-r--r--images/emoji/1f1f9.pngbin453 -> 0 bytes
-rw-r--r--images/emoji/1f1fa-1f1e6.pngbin528 -> 0 bytes
-rw-r--r--images/emoji/1f1fa-1f1ec.pngbin887 -> 0 bytes
-rw-r--r--images/emoji/1f1fa-1f1f2.pngbin776 -> 0 bytes
-rw-r--r--images/emoji/1f1fa-1f1f8.pngbin776 -> 0 bytes
-rw-r--r--images/emoji/1f1fa-1f1fe.pngbin966 -> 0 bytes
-rw-r--r--images/emoji/1f1fa-1f1ff.pngbin750 -> 0 bytes
-rw-r--r--images/emoji/1f1fa.pngbin544 -> 0 bytes
-rw-r--r--images/emoji/1f1fb-1f1e6.pngbin1335 -> 0 bytes
-rw-r--r--images/emoji/1f1fb-1f1e8.pngbin897 -> 0 bytes
-rw-r--r--images/emoji/1f1fb-1f1ea.pngbin748 -> 0 bytes
-rw-r--r--images/emoji/1f1fb-1f1ec.pngbin1789 -> 0 bytes
-rw-r--r--images/emoji/1f1fb-1f1ee.pngbin1380 -> 0 bytes
-rw-r--r--images/emoji/1f1fb-1f1f3.pngbin583 -> 0 bytes
-rw-r--r--images/emoji/1f1fb-1f1fa.pngbin844 -> 0 bytes
-rw-r--r--images/emoji/1f1fb.pngbin632 -> 0 bytes
-rw-r--r--images/emoji/1f1fc-1f1eb.pngbin443 -> 0 bytes
-rw-r--r--images/emoji/1f1fc-1f1f8.pngbin634 -> 0 bytes
-rw-r--r--images/emoji/1f1fc.pngbin737 -> 0 bytes
-rw-r--r--images/emoji/1f1fd-1f1f0.pngbin722 -> 0 bytes
-rw-r--r--images/emoji/1f1fd.pngbin635 -> 0 bytes
-rw-r--r--images/emoji/1f1fe-1f1ea.pngbin507 -> 0 bytes
-rw-r--r--images/emoji/1f1fe-1f1f9.pngbin1627 -> 0 bytes
-rw-r--r--images/emoji/1f1fe.pngbin590 -> 0 bytes
-rw-r--r--images/emoji/1f1ff-1f1e6.pngbin676 -> 0 bytes
-rw-r--r--images/emoji/1f1ff-1f1f2.pngbin881 -> 0 bytes
-rw-r--r--images/emoji/1f1ff-1f1fc.pngbin993 -> 0 bytes
-rw-r--r--images/emoji/1f1ff.pngbin571 -> 0 bytes
-rw-r--r--images/emoji/1f201.pngbin266 -> 0 bytes
-rw-r--r--images/emoji/1f202.pngbin420 -> 0 bytes
-rw-r--r--images/emoji/1f21a.pngbin534 -> 0 bytes
-rw-r--r--images/emoji/1f22f.pngbin504 -> 0 bytes
-rw-r--r--images/emoji/1f232.pngbin584 -> 0 bytes
-rw-r--r--images/emoji/1f233.pngbin456 -> 0 bytes
-rw-r--r--images/emoji/1f234.pngbin484 -> 0 bytes
-rw-r--r--images/emoji/1f235.pngbin564 -> 0 bytes
-rw-r--r--images/emoji/1f236.pngbin434 -> 0 bytes
-rw-r--r--images/emoji/1f237.pngbin409 -> 0 bytes
-rw-r--r--images/emoji/1f238.pngbin306 -> 0 bytes
-rw-r--r--images/emoji/1f239.pngbin411 -> 0 bytes
-rw-r--r--images/emoji/1f23a.pngbin460 -> 0 bytes
-rw-r--r--images/emoji/1f250.pngbin716 -> 0 bytes
-rw-r--r--images/emoji/1f251.pngbin491 -> 0 bytes
-rw-r--r--images/emoji/1f300.pngbin797 -> 0 bytes
-rw-r--r--images/emoji/1f301.pngbin1069 -> 0 bytes
-rw-r--r--images/emoji/1f302.pngbin1002 -> 0 bytes
-rw-r--r--images/emoji/1f303.pngbin835 -> 0 bytes
-rw-r--r--images/emoji/1f304.pngbin1578 -> 0 bytes
-rw-r--r--images/emoji/1f305.pngbin812 -> 0 bytes
-rw-r--r--images/emoji/1f306.pngbin431 -> 0 bytes
-rw-r--r--images/emoji/1f307.pngbin997 -> 0 bytes
-rw-r--r--images/emoji/1f308.pngbin1299 -> 0 bytes
-rw-r--r--images/emoji/1f309.pngbin637 -> 0 bytes
-rw-r--r--images/emoji/1f30a.pngbin1018 -> 0 bytes
-rw-r--r--images/emoji/1f30b.pngbin1259 -> 0 bytes
-rw-r--r--images/emoji/1f30c.pngbin622 -> 0 bytes
-rw-r--r--images/emoji/1f30d.pngbin978 -> 0 bytes
-rw-r--r--images/emoji/1f30e.pngbin1031 -> 0 bytes
-rw-r--r--images/emoji/1f30f.pngbin966 -> 0 bytes
-rw-r--r--images/emoji/1f310.pngbin796 -> 0 bytes
-rw-r--r--images/emoji/1f311.pngbin829 -> 0 bytes
-rw-r--r--images/emoji/1f312.pngbin1200 -> 0 bytes
-rw-r--r--images/emoji/1f313.pngbin1152 -> 0 bytes
-rw-r--r--images/emoji/1f314.pngbin1229 -> 0 bytes
-rw-r--r--images/emoji/1f315.pngbin841 -> 0 bytes
-rw-r--r--images/emoji/1f316.pngbin1211 -> 0 bytes
-rw-r--r--images/emoji/1f317.pngbin1180 -> 0 bytes
-rw-r--r--images/emoji/1f318.pngbin1213 -> 0 bytes
-rw-r--r--images/emoji/1f319.pngbin446 -> 0 bytes
-rw-r--r--images/emoji/1f31a.pngbin975 -> 0 bytes
-rw-r--r--images/emoji/1f31b.pngbin1068 -> 0 bytes
-rw-r--r--images/emoji/1f31c.pngbin1030 -> 0 bytes
-rw-r--r--images/emoji/1f31d.pngbin1186 -> 0 bytes
-rw-r--r--images/emoji/1f31e.pngbin741 -> 0 bytes
-rw-r--r--images/emoji/1f31f.pngbin732 -> 0 bytes
-rw-r--r--images/emoji/1f320.pngbin1048 -> 0 bytes
-rw-r--r--images/emoji/1f321.pngbin759 -> 0 bytes
-rw-r--r--images/emoji/1f324.pngbin989 -> 0 bytes
-rw-r--r--images/emoji/1f325.pngbin968 -> 0 bytes
-rw-r--r--images/emoji/1f326.pngbin1161 -> 0 bytes
-rw-r--r--images/emoji/1f327.pngbin876 -> 0 bytes
-rw-r--r--images/emoji/1f328.pngbin823 -> 0 bytes
-rw-r--r--images/emoji/1f329.pngbin767 -> 0 bytes
-rw-r--r--images/emoji/1f32a.pngbin1519 -> 0 bytes
-rw-r--r--images/emoji/1f32b.pngbin713 -> 0 bytes
-rw-r--r--images/emoji/1f32c.pngbin1827 -> 0 bytes
-rw-r--r--images/emoji/1f32d.pngbin1770 -> 0 bytes
-rw-r--r--images/emoji/1f32e.pngbin3045 -> 0 bytes
-rw-r--r--images/emoji/1f32f.pngbin2938 -> 0 bytes
-rw-r--r--images/emoji/1f330.pngbin1339 -> 0 bytes
-rw-r--r--images/emoji/1f331.pngbin749 -> 0 bytes
-rw-r--r--images/emoji/1f332.pngbin719 -> 0 bytes
-rw-r--r--images/emoji/1f333.pngbin1270 -> 0 bytes
-rw-r--r--images/emoji/1f334.pngbin1452 -> 0 bytes
-rw-r--r--images/emoji/1f335.pngbin628 -> 0 bytes
-rw-r--r--images/emoji/1f336.pngbin677 -> 0 bytes
-rw-r--r--images/emoji/1f337.pngbin1065 -> 0 bytes
-rw-r--r--images/emoji/1f338.pngbin1129 -> 0 bytes
-rw-r--r--images/emoji/1f339.pngbin1182 -> 0 bytes
-rw-r--r--images/emoji/1f33a.pngbin1815 -> 0 bytes
-rw-r--r--images/emoji/1f33b.pngbin1915 -> 0 bytes
-rw-r--r--images/emoji/1f33c.pngbin867 -> 0 bytes
-rw-r--r--images/emoji/1f33d.pngbin1547 -> 0 bytes
-rw-r--r--images/emoji/1f33e.pngbin1422 -> 0 bytes
-rw-r--r--images/emoji/1f33f.pngbin886 -> 0 bytes
-rw-r--r--images/emoji/1f340.pngbin1156 -> 0 bytes
-rw-r--r--images/emoji/1f341.pngbin1117 -> 0 bytes
-rw-r--r--images/emoji/1f342.pngbin951 -> 0 bytes
-rw-r--r--images/emoji/1f343.pngbin993 -> 0 bytes
-rw-r--r--images/emoji/1f344.pngbin1024 -> 0 bytes
-rw-r--r--images/emoji/1f345.pngbin1055 -> 0 bytes
-rw-r--r--images/emoji/1f346.pngbin773 -> 0 bytes
-rw-r--r--images/emoji/1f347.pngbin1552 -> 0 bytes
-rw-r--r--images/emoji/1f348.pngbin2005 -> 0 bytes
-rw-r--r--images/emoji/1f349.pngbin1275 -> 0 bytes
-rw-r--r--images/emoji/1f34a.pngbin1184 -> 0 bytes
-rw-r--r--images/emoji/1f34b.pngbin1033 -> 0 bytes
-rw-r--r--images/emoji/1f34c.pngbin1157 -> 0 bytes
-rw-r--r--images/emoji/1f34d.pngbin1643 -> 0 bytes
-rw-r--r--images/emoji/1f34e.pngbin655 -> 0 bytes
-rw-r--r--images/emoji/1f34f.pngbin656 -> 0 bytes
-rw-r--r--images/emoji/1f350.pngbin747 -> 0 bytes
-rw-r--r--images/emoji/1f351.pngbin1189 -> 0 bytes
-rw-r--r--images/emoji/1f352.pngbin1211 -> 0 bytes
-rw-r--r--images/emoji/1f353.pngbin1206 -> 0 bytes
-rw-r--r--images/emoji/1f354.pngbin1974 -> 0 bytes
-rw-r--r--images/emoji/1f355.pngbin2009 -> 0 bytes
-rw-r--r--images/emoji/1f356.pngbin1465 -> 0 bytes
-rw-r--r--images/emoji/1f357.pngbin925 -> 0 bytes
-rw-r--r--images/emoji/1f358.pngbin1443 -> 0 bytes
-rw-r--r--images/emoji/1f359.pngbin1091 -> 0 bytes
-rw-r--r--images/emoji/1f35a.pngbin1195 -> 0 bytes
-rw-r--r--images/emoji/1f35b.pngbin1754 -> 0 bytes
-rw-r--r--images/emoji/1f35c.pngbin1992 -> 0 bytes
-rw-r--r--images/emoji/1f35d.pngbin1797 -> 0 bytes
-rw-r--r--images/emoji/1f35e.pngbin1419 -> 0 bytes
-rw-r--r--images/emoji/1f35f.pngbin1874 -> 0 bytes
-rw-r--r--images/emoji/1f360.pngbin951 -> 0 bytes
-rw-r--r--images/emoji/1f361.pngbin802 -> 0 bytes
-rw-r--r--images/emoji/1f362.pngbin794 -> 0 bytes
-rw-r--r--images/emoji/1f363.pngbin2101 -> 0 bytes
-rw-r--r--images/emoji/1f364.pngbin1241 -> 0 bytes
-rw-r--r--images/emoji/1f365.pngbin1245 -> 0 bytes
-rw-r--r--images/emoji/1f366.pngbin1502 -> 0 bytes
-rw-r--r--images/emoji/1f367.pngbin997 -> 0 bytes
-rw-r--r--images/emoji/1f368.pngbin1780 -> 0 bytes
-rw-r--r--images/emoji/1f369.pngbin1322 -> 0 bytes
-rw-r--r--images/emoji/1f36a.pngbin1351 -> 0 bytes
-rw-r--r--images/emoji/1f36b.pngbin771 -> 0 bytes
-rw-r--r--images/emoji/1f36c.pngbin1054 -> 0 bytes
-rw-r--r--images/emoji/1f36d.pngbin2164 -> 0 bytes
-rw-r--r--images/emoji/1f36e.pngbin1273 -> 0 bytes
-rw-r--r--images/emoji/1f36f.pngbin1217 -> 0 bytes
-rw-r--r--images/emoji/1f370.pngbin2266 -> 0 bytes
-rw-r--r--images/emoji/1f371.pngbin1128 -> 0 bytes
-rw-r--r--images/emoji/1f372.pngbin1960 -> 0 bytes
-rw-r--r--images/emoji/1f373.pngbin764 -> 0 bytes
-rw-r--r--images/emoji/1f374.pngbin668 -> 0 bytes
-rw-r--r--images/emoji/1f375.pngbin1297 -> 0 bytes
-rw-r--r--images/emoji/1f376.pngbin826 -> 0 bytes
-rw-r--r--images/emoji/1f377.pngbin655 -> 0 bytes
-rw-r--r--images/emoji/1f378.pngbin1027 -> 0 bytes
-rw-r--r--images/emoji/1f379.pngbin1428 -> 0 bytes
-rw-r--r--images/emoji/1f37a.pngbin1340 -> 0 bytes
-rw-r--r--images/emoji/1f37b.pngbin2100 -> 0 bytes
-rw-r--r--images/emoji/1f37c.pngbin818 -> 0 bytes
-rw-r--r--images/emoji/1f37d.pngbin976 -> 0 bytes
-rw-r--r--images/emoji/1f37f.pngbin1844 -> 0 bytes
-rw-r--r--images/emoji/1f380.pngbin968 -> 0 bytes
-rw-r--r--images/emoji/1f381.pngbin1966 -> 0 bytes
-rw-r--r--images/emoji/1f382.pngbin2219 -> 0 bytes
-rw-r--r--images/emoji/1f383.pngbin2289 -> 0 bytes
-rw-r--r--images/emoji/1f384.pngbin1542 -> 0 bytes
-rw-r--r--images/emoji/1f385-1f3fb.pngbin1588 -> 0 bytes
-rw-r--r--images/emoji/1f385-1f3fc.pngbin1579 -> 0 bytes
-rw-r--r--images/emoji/1f385-1f3fd.pngbin1579 -> 0 bytes
-rw-r--r--images/emoji/1f385-1f3fe.pngbin1579 -> 0 bytes
-rw-r--r--images/emoji/1f385-1f3ff.pngbin1579 -> 0 bytes
-rw-r--r--images/emoji/1f385.pngbin1588 -> 0 bytes
-rw-r--r--images/emoji/1f386.pngbin1365 -> 0 bytes
-rw-r--r--images/emoji/1f387.pngbin910 -> 0 bytes
-rw-r--r--images/emoji/1f388.pngbin501 -> 0 bytes
-rw-r--r--images/emoji/1f389.pngbin1778 -> 0 bytes
-rw-r--r--images/emoji/1f38a.pngbin1703 -> 0 bytes
-rw-r--r--images/emoji/1f38b.pngbin1479 -> 0 bytes
-rw-r--r--images/emoji/1f38c.pngbin1239 -> 0 bytes
-rw-r--r--images/emoji/1f38d.pngbin1947 -> 0 bytes
-rw-r--r--images/emoji/1f38e.pngbin2249 -> 0 bytes
-rw-r--r--images/emoji/1f38f.pngbin1725 -> 0 bytes
-rw-r--r--images/emoji/1f390.pngbin1046 -> 0 bytes
-rw-r--r--images/emoji/1f391.pngbin1350 -> 0 bytes
-rw-r--r--images/emoji/1f392.pngbin1490 -> 0 bytes
-rw-r--r--images/emoji/1f393.pngbin710 -> 0 bytes
-rw-r--r--images/emoji/1f396.pngbin949 -> 0 bytes
-rw-r--r--images/emoji/1f397.pngbin921 -> 0 bytes
-rw-r--r--images/emoji/1f399.pngbin839 -> 0 bytes
-rw-r--r--images/emoji/1f39a.pngbin454 -> 0 bytes
-rw-r--r--images/emoji/1f39b.pngbin1104 -> 0 bytes
-rw-r--r--images/emoji/1f39e.pngbin560 -> 0 bytes
-rw-r--r--images/emoji/1f39f.pngbin1750 -> 0 bytes
-rw-r--r--images/emoji/1f3a0.pngbin1739 -> 0 bytes
-rw-r--r--images/emoji/1f3a1.pngbin2185 -> 0 bytes
-rw-r--r--images/emoji/1f3a2.pngbin1724 -> 0 bytes
-rw-r--r--images/emoji/1f3a3.pngbin1442 -> 0 bytes
-rw-r--r--images/emoji/1f3a4.pngbin1165 -> 0 bytes
-rw-r--r--images/emoji/1f3a5.pngbin576 -> 0 bytes
-rw-r--r--images/emoji/1f3a6.pngbin585 -> 0 bytes
-rw-r--r--images/emoji/1f3a7.pngbin1202 -> 0 bytes
-rw-r--r--images/emoji/1f3a8.pngbin1455 -> 0 bytes
-rw-r--r--images/emoji/1f3a9.pngbin845 -> 0 bytes
-rw-r--r--images/emoji/1f3aa.pngbin1369 -> 0 bytes
-rw-r--r--images/emoji/1f3ab.pngbin763 -> 0 bytes
-rw-r--r--images/emoji/1f3ac.pngbin1535 -> 0 bytes
-rw-r--r--images/emoji/1f3ad.pngbin1971 -> 0 bytes
-rw-r--r--images/emoji/1f3ae.pngbin765 -> 0 bytes
-rw-r--r--images/emoji/1f3af.pngbin1374 -> 0 bytes
-rw-r--r--images/emoji/1f3b0.pngbin1648 -> 0 bytes
-rw-r--r--images/emoji/1f3b1.pngbin810 -> 0 bytes
-rw-r--r--images/emoji/1f3b2.pngbin1136 -> 0 bytes
-rw-r--r--images/emoji/1f3b3.pngbin1426 -> 0 bytes
-rw-r--r--images/emoji/1f3b4.pngbin449 -> 0 bytes
-rw-r--r--images/emoji/1f3b5.pngbin419 -> 0 bytes
-rw-r--r--images/emoji/1f3b6.pngbin501 -> 0 bytes
-rw-r--r--images/emoji/1f3b7.pngbin1442 -> 0 bytes
-rw-r--r--images/emoji/1f3b8.pngbin1056 -> 0 bytes
-rw-r--r--images/emoji/1f3b9.pngbin1695 -> 0 bytes
-rw-r--r--images/emoji/1f3ba.pngbin1286 -> 0 bytes
-rw-r--r--images/emoji/1f3bb.pngbin1156 -> 0 bytes
-rw-r--r--images/emoji/1f3bc.pngbin1289 -> 0 bytes
-rw-r--r--images/emoji/1f3bd.pngbin784 -> 0 bytes
-rw-r--r--images/emoji/1f3be.pngbin1561 -> 0 bytes
-rw-r--r--images/emoji/1f3bf.pngbin1762 -> 0 bytes
-rw-r--r--images/emoji/1f3c0.pngbin1546 -> 0 bytes
-rw-r--r--images/emoji/1f3c1.pngbin787 -> 0 bytes
-rw-r--r--images/emoji/1f3c2.pngbin2020 -> 0 bytes
-rw-r--r--images/emoji/1f3c3-1f3fb.pngbin1163 -> 0 bytes
-rw-r--r--images/emoji/1f3c3-1f3fc.pngbin1162 -> 0 bytes
-rw-r--r--images/emoji/1f3c3-1f3fd.pngbin1151 -> 0 bytes
-rw-r--r--images/emoji/1f3c3-1f3fe.pngbin1156 -> 0 bytes
-rw-r--r--images/emoji/1f3c3-1f3ff.pngbin1145 -> 0 bytes
-rw-r--r--images/emoji/1f3c3.pngbin1161 -> 0 bytes
-rw-r--r--images/emoji/1f3c4-1f3fb.pngbin1781 -> 0 bytes
-rw-r--r--images/emoji/1f3c4-1f3fc.pngbin1769 -> 0 bytes
-rw-r--r--images/emoji/1f3c4-1f3fd.pngbin1777 -> 0 bytes
-rw-r--r--images/emoji/1f3c4-1f3fe.pngbin1784 -> 0 bytes
-rw-r--r--images/emoji/1f3c4-1f3ff.pngbin1782 -> 0 bytes
-rw-r--r--images/emoji/1f3c4.pngbin1777 -> 0 bytes
-rw-r--r--images/emoji/1f3c5.pngbin1702 -> 0 bytes
-rw-r--r--images/emoji/1f3c6.pngbin863 -> 0 bytes
-rw-r--r--images/emoji/1f3c7-1f3fb.pngbin2099 -> 0 bytes
-rw-r--r--images/emoji/1f3c7-1f3fc.pngbin2103 -> 0 bytes
-rw-r--r--images/emoji/1f3c7-1f3fd.pngbin2090 -> 0 bytes
-rw-r--r--images/emoji/1f3c7-1f3fe.pngbin2090 -> 0 bytes
-rw-r--r--images/emoji/1f3c7-1f3ff.pngbin2085 -> 0 bytes
-rw-r--r--images/emoji/1f3c7.pngbin2096 -> 0 bytes
-rw-r--r--images/emoji/1f3c8.pngbin958 -> 0 bytes
-rw-r--r--images/emoji/1f3c9.pngbin1620 -> 0 bytes
-rw-r--r--images/emoji/1f3ca-1f3fb.pngbin1184 -> 0 bytes
-rw-r--r--images/emoji/1f3ca-1f3fc.pngbin1184 -> 0 bytes
-rw-r--r--images/emoji/1f3ca-1f3fd.pngbin1184 -> 0 bytes
-rw-r--r--images/emoji/1f3ca-1f3fe.pngbin1184 -> 0 bytes
-rw-r--r--images/emoji/1f3ca-1f3ff.pngbin1184 -> 0 bytes
-rw-r--r--images/emoji/1f3ca.pngbin1184 -> 0 bytes
-rw-r--r--images/emoji/1f3cb-1f3fb.pngbin1346 -> 0 bytes
-rw-r--r--images/emoji/1f3cb-1f3fc.pngbin1347 -> 0 bytes
-rw-r--r--images/emoji/1f3cb-1f3fd.pngbin1339 -> 0 bytes
-rw-r--r--images/emoji/1f3cb-1f3fe.pngbin1343 -> 0 bytes
-rw-r--r--images/emoji/1f3cb-1f3ff.pngbin1337 -> 0 bytes
-rw-r--r--images/emoji/1f3cb.pngbin1356 -> 0 bytes
-rw-r--r--images/emoji/1f3cc.pngbin1189 -> 0 bytes
-rw-r--r--images/emoji/1f3cd.pngbin2081 -> 0 bytes
-rw-r--r--images/emoji/1f3ce.pngbin2140 -> 0 bytes
-rw-r--r--images/emoji/1f3cf.pngbin1060 -> 0 bytes
-rw-r--r--images/emoji/1f3d0.pngbin1204 -> 0 bytes
-rw-r--r--images/emoji/1f3d1.pngbin947 -> 0 bytes
-rw-r--r--images/emoji/1f3d2.pngbin1010 -> 0 bytes
-rw-r--r--images/emoji/1f3d3.pngbin823 -> 0 bytes
-rw-r--r--images/emoji/1f3d4.pngbin1194 -> 0 bytes
-rw-r--r--images/emoji/1f3d5.pngbin1515 -> 0 bytes
-rw-r--r--images/emoji/1f3d6.pngbin942 -> 0 bytes
-rw-r--r--images/emoji/1f3d7.pngbin668 -> 0 bytes
-rw-r--r--images/emoji/1f3d8.pngbin981 -> 0 bytes
-rw-r--r--images/emoji/1f3d9.pngbin599 -> 0 bytes
-rw-r--r--images/emoji/1f3da.pngbin1606 -> 0 bytes
-rw-r--r--images/emoji/1f3db.pngbin1006 -> 0 bytes
-rw-r--r--images/emoji/1f3dc.pngbin1443 -> 0 bytes
-rw-r--r--images/emoji/1f3dd.pngbin1273 -> 0 bytes
-rw-r--r--images/emoji/1f3de.pngbin929 -> 0 bytes
-rw-r--r--images/emoji/1f3df.pngbin1516 -> 0 bytes
-rw-r--r--images/emoji/1f3e0.pngbin863 -> 0 bytes
-rw-r--r--images/emoji/1f3e1.pngbin1614 -> 0 bytes
-rw-r--r--images/emoji/1f3e2.pngbin524 -> 0 bytes
-rw-r--r--images/emoji/1f3e3.pngbin676 -> 0 bytes
-rw-r--r--images/emoji/1f3e4.pngbin551 -> 0 bytes
-rw-r--r--images/emoji/1f3e5.pngbin530 -> 0 bytes
-rw-r--r--images/emoji/1f3e6.pngbin1358 -> 0 bytes
-rw-r--r--images/emoji/1f3e7.pngbin1397 -> 0 bytes
-rw-r--r--images/emoji/1f3e8.pngbin1322 -> 0 bytes
-rw-r--r--images/emoji/1f3e9.pngbin372 -> 0 bytes
-rw-r--r--images/emoji/1f3ea.pngbin528 -> 0 bytes
-rw-r--r--images/emoji/1f3eb.pngbin1234 -> 0 bytes
-rw-r--r--images/emoji/1f3ec.pngbin673 -> 0 bytes
-rw-r--r--images/emoji/1f3ed.pngbin936 -> 0 bytes
-rw-r--r--images/emoji/1f3ee.pngbin1228 -> 0 bytes
-rw-r--r--images/emoji/1f3ef.pngbin1404 -> 0 bytes
-rw-r--r--images/emoji/1f3f0.pngbin965 -> 0 bytes
-rw-r--r--images/emoji/1f3f3.pngbin699 -> 0 bytes
-rw-r--r--images/emoji/1f3f4.pngbin702 -> 0 bytes
-rw-r--r--images/emoji/1f3f5.pngbin1023 -> 0 bytes
-rw-r--r--images/emoji/1f3f7.pngbin669 -> 0 bytes
-rw-r--r--images/emoji/1f3f8.pngbin1255 -> 0 bytes
-rw-r--r--images/emoji/1f3f9.pngbin1402 -> 0 bytes
-rw-r--r--images/emoji/1f3fa.pngbin1044 -> 0 bytes
-rw-r--r--images/emoji/1f400.pngbin1193 -> 0 bytes
-rw-r--r--images/emoji/1f401.pngbin1324 -> 0 bytes
-rw-r--r--images/emoji/1f402.pngbin1436 -> 0 bytes
-rw-r--r--images/emoji/1f403.pngbin1536 -> 0 bytes
-rw-r--r--images/emoji/1f404.pngbin1810 -> 0 bytes
-rw-r--r--images/emoji/1f405.pngbin2623 -> 0 bytes
-rw-r--r--images/emoji/1f406.pngbin2222 -> 0 bytes
-rw-r--r--images/emoji/1f407.pngbin1805 -> 0 bytes
-rw-r--r--images/emoji/1f408.pngbin1781 -> 0 bytes
-rw-r--r--images/emoji/1f409.pngbin1575 -> 0 bytes
-rw-r--r--images/emoji/1f40a.pngbin2408 -> 0 bytes
-rw-r--r--images/emoji/1f40b.pngbin1196 -> 0 bytes
-rw-r--r--images/emoji/1f40c.pngbin1731 -> 0 bytes
-rw-r--r--images/emoji/1f40d.pngbin1579 -> 0 bytes
-rw-r--r--images/emoji/1f40e.pngbin1404 -> 0 bytes
-rw-r--r--images/emoji/1f40f.pngbin1951 -> 0 bytes
-rw-r--r--images/emoji/1f410.pngbin981 -> 0 bytes
-rw-r--r--images/emoji/1f411.pngbin1374 -> 0 bytes
-rw-r--r--images/emoji/1f412.pngbin1349 -> 0 bytes
-rw-r--r--images/emoji/1f413.pngbin1333 -> 0 bytes
-rw-r--r--images/emoji/1f414.pngbin1267 -> 0 bytes
-rw-r--r--images/emoji/1f415.pngbin2085 -> 0 bytes
-rw-r--r--images/emoji/1f416.pngbin1548 -> 0 bytes
-rw-r--r--images/emoji/1f417.pngbin1368 -> 0 bytes
-rw-r--r--images/emoji/1f418.pngbin1293 -> 0 bytes
-rw-r--r--images/emoji/1f419.pngbin1188 -> 0 bytes
-rw-r--r--images/emoji/1f41a.pngbin1497 -> 0 bytes
-rw-r--r--images/emoji/1f41b.pngbin1604 -> 0 bytes
-rw-r--r--images/emoji/1f41c.pngbin1412 -> 0 bytes
-rw-r--r--images/emoji/1f41d.pngbin1383 -> 0 bytes
-rw-r--r--images/emoji/1f41e.pngbin1288 -> 0 bytes
-rw-r--r--images/emoji/1f41f.pngbin1080 -> 0 bytes
-rw-r--r--images/emoji/1f420.pngbin1676 -> 0 bytes
-rw-r--r--images/emoji/1f421.pngbin1621 -> 0 bytes
-rw-r--r--images/emoji/1f422.pngbin1516 -> 0 bytes
-rw-r--r--images/emoji/1f423.pngbin1599 -> 0 bytes
-rw-r--r--images/emoji/1f424.pngbin1181 -> 0 bytes
-rw-r--r--images/emoji/1f425.pngbin1174 -> 0 bytes
-rw-r--r--images/emoji/1f426.pngbin1068 -> 0 bytes
-rw-r--r--images/emoji/1f427.pngbin1034 -> 0 bytes
-rw-r--r--images/emoji/1f428.pngbin1430 -> 0 bytes
-rw-r--r--images/emoji/1f429.pngbin1531 -> 0 bytes
-rw-r--r--images/emoji/1f42a.pngbin1515 -> 0 bytes
-rw-r--r--images/emoji/1f42b.pngbin1190 -> 0 bytes
-rw-r--r--images/emoji/1f42c.pngbin1700 -> 0 bytes
-rw-r--r--images/emoji/1f42d.pngbin1246 -> 0 bytes
-rw-r--r--images/emoji/1f42e.pngbin1641 -> 0 bytes
-rw-r--r--images/emoji/1f42f.pngbin2104 -> 0 bytes
-rw-r--r--images/emoji/1f430.pngbin1661 -> 0 bytes
-rw-r--r--images/emoji/1f431.pngbin1358 -> 0 bytes
-rw-r--r--images/emoji/1f432.pngbin1769 -> 0 bytes
-rw-r--r--images/emoji/1f433.pngbin1578 -> 0 bytes
-rw-r--r--images/emoji/1f434.pngbin1695 -> 0 bytes
-rw-r--r--images/emoji/1f435.pngbin1027 -> 0 bytes
-rw-r--r--images/emoji/1f436.pngbin1680 -> 0 bytes
-rw-r--r--images/emoji/1f437.pngbin1138 -> 0 bytes
-rw-r--r--images/emoji/1f438.pngbin897 -> 0 bytes
-rw-r--r--images/emoji/1f439.pngbin1280 -> 0 bytes
-rw-r--r--images/emoji/1f43a.pngbin1528 -> 0 bytes
-rw-r--r--images/emoji/1f43b.pngbin1023 -> 0 bytes
-rw-r--r--images/emoji/1f43c.pngbin1478 -> 0 bytes
-rw-r--r--images/emoji/1f43d.pngbin820 -> 0 bytes
-rw-r--r--images/emoji/1f43e.pngbin603 -> 0 bytes
-rw-r--r--images/emoji/1f43f.pngbin1459 -> 0 bytes
-rw-r--r--images/emoji/1f440.pngbin791 -> 0 bytes
-rw-r--r--images/emoji/1f441-1f5e8.pngbin698 -> 0 bytes
-rw-r--r--images/emoji/1f441.pngbin664 -> 0 bytes
-rw-r--r--images/emoji/1f442-1f3fb.pngbin860 -> 0 bytes
-rw-r--r--images/emoji/1f442-1f3fc.pngbin860 -> 0 bytes
-rw-r--r--images/emoji/1f442-1f3fd.pngbin860 -> 0 bytes
-rw-r--r--images/emoji/1f442-1f3fe.pngbin860 -> 0 bytes
-rw-r--r--images/emoji/1f442-1f3ff.pngbin860 -> 0 bytes
-rw-r--r--images/emoji/1f442.pngbin860 -> 0 bytes
-rw-r--r--images/emoji/1f443-1f3fb.pngbin703 -> 0 bytes
-rw-r--r--images/emoji/1f443-1f3fc.pngbin703 -> 0 bytes
-rw-r--r--images/emoji/1f443-1f3fd.pngbin703 -> 0 bytes
-rw-r--r--images/emoji/1f443-1f3fe.pngbin703 -> 0 bytes
-rw-r--r--images/emoji/1f443-1f3ff.pngbin703 -> 0 bytes
-rw-r--r--images/emoji/1f443.pngbin703 -> 0 bytes
-rw-r--r--images/emoji/1f444.pngbin599 -> 0 bytes
-rw-r--r--images/emoji/1f445.pngbin599 -> 0 bytes
-rw-r--r--images/emoji/1f446-1f3fb.pngbin822 -> 0 bytes
-rw-r--r--images/emoji/1f446-1f3fc.pngbin822 -> 0 bytes
-rw-r--r--images/emoji/1f446-1f3fd.pngbin871 -> 0 bytes
-rw-r--r--images/emoji/1f446-1f3fe.pngbin822 -> 0 bytes
-rw-r--r--images/emoji/1f446-1f3ff.pngbin822 -> 0 bytes
-rw-r--r--images/emoji/1f446.pngbin822 -> 0 bytes
-rw-r--r--images/emoji/1f447-1f3fb.pngbin856 -> 0 bytes
-rw-r--r--images/emoji/1f447-1f3fc.pngbin856 -> 0 bytes
-rw-r--r--images/emoji/1f447-1f3fd.pngbin858 -> 0 bytes
-rw-r--r--images/emoji/1f447-1f3fe.pngbin856 -> 0 bytes
-rw-r--r--images/emoji/1f447-1f3ff.pngbin856 -> 0 bytes
-rw-r--r--images/emoji/1f447.pngbin853 -> 0 bytes
-rw-r--r--images/emoji/1f448-1f3fb.pngbin832 -> 0 bytes
-rw-r--r--images/emoji/1f448-1f3fc.pngbin830 -> 0 bytes
-rw-r--r--images/emoji/1f448-1f3fd.pngbin830 -> 0 bytes
-rw-r--r--images/emoji/1f448-1f3fe.pngbin830 -> 0 bytes
-rw-r--r--images/emoji/1f448-1f3ff.pngbin832 -> 0 bytes
-rw-r--r--images/emoji/1f448.pngbin825 -> 0 bytes
-rw-r--r--images/emoji/1f449-1f3fb.pngbin805 -> 0 bytes
-rw-r--r--images/emoji/1f449-1f3fc.pngbin805 -> 0 bytes
-rw-r--r--images/emoji/1f449-1f3fd.pngbin805 -> 0 bytes
-rw-r--r--images/emoji/1f449-1f3fe.pngbin805 -> 0 bytes
-rw-r--r--images/emoji/1f449-1f3ff.pngbin805 -> 0 bytes
-rw-r--r--images/emoji/1f449.pngbin805 -> 0 bytes
-rw-r--r--images/emoji/1f44a-1f3fb.pngbin838 -> 0 bytes
-rw-r--r--images/emoji/1f44a-1f3fc.pngbin838 -> 0 bytes
-rw-r--r--images/emoji/1f44a-1f3fd.pngbin838 -> 0 bytes
-rw-r--r--images/emoji/1f44a-1f3fe.pngbin838 -> 0 bytes
-rw-r--r--images/emoji/1f44a-1f3ff.pngbin838 -> 0 bytes
-rw-r--r--images/emoji/1f44a.pngbin838 -> 0 bytes
-rw-r--r--images/emoji/1f44b-1f3fb.pngbin1311 -> 0 bytes
-rw-r--r--images/emoji/1f44b-1f3fc.pngbin1311 -> 0 bytes
-rw-r--r--images/emoji/1f44b-1f3fd.pngbin1295 -> 0 bytes
-rw-r--r--images/emoji/1f44b-1f3fe.pngbin1311 -> 0 bytes
-rw-r--r--images/emoji/1f44b-1f3ff.pngbin1311 -> 0 bytes
-rw-r--r--images/emoji/1f44b.pngbin1311 -> 0 bytes
-rw-r--r--images/emoji/1f44c-1f3fb.pngbin979 -> 0 bytes
-rw-r--r--images/emoji/1f44c-1f3fc.pngbin979 -> 0 bytes
-rw-r--r--images/emoji/1f44c-1f3fd.pngbin979 -> 0 bytes
-rw-r--r--images/emoji/1f44c-1f3fe.pngbin979 -> 0 bytes
-rw-r--r--images/emoji/1f44c-1f3ff.pngbin979 -> 0 bytes
-rw-r--r--images/emoji/1f44c.pngbin979 -> 0 bytes
-rw-r--r--images/emoji/1f44d-1f3fb.pngbin814 -> 0 bytes
-rw-r--r--images/emoji/1f44d-1f3fc.pngbin814 -> 0 bytes
-rw-r--r--images/emoji/1f44d-1f3fd.pngbin814 -> 0 bytes
-rw-r--r--images/emoji/1f44d-1f3fe.pngbin814 -> 0 bytes
-rw-r--r--images/emoji/1f44d-1f3ff.pngbin814 -> 0 bytes
-rw-r--r--images/emoji/1f44d.pngbin814 -> 0 bytes
-rw-r--r--images/emoji/1f44e-1f3fb.pngbin815 -> 0 bytes
-rw-r--r--images/emoji/1f44e-1f3fc.pngbin815 -> 0 bytes
-rw-r--r--images/emoji/1f44e-1f3fd.pngbin815 -> 0 bytes
-rw-r--r--images/emoji/1f44e-1f3fe.pngbin815 -> 0 bytes
-rw-r--r--images/emoji/1f44e-1f3ff.pngbin815 -> 0 bytes
-rw-r--r--images/emoji/1f44e.pngbin815 -> 0 bytes
-rw-r--r--images/emoji/1f44f-1f3fb.pngbin1460 -> 0 bytes
-rw-r--r--images/emoji/1f44f-1f3fc.pngbin1460 -> 0 bytes
-rw-r--r--images/emoji/1f44f-1f3fd.pngbin1460 -> 0 bytes
-rw-r--r--images/emoji/1f44f-1f3fe.pngbin1459 -> 0 bytes
-rw-r--r--images/emoji/1f44f-1f3ff.pngbin1445 -> 0 bytes
-rw-r--r--images/emoji/1f450-1f3fb.pngbin1053 -> 0 bytes
-rw-r--r--images/emoji/1f450-1f3fc.pngbin1053 -> 0 bytes
-rw-r--r--images/emoji/1f450-1f3fd.pngbin1053 -> 0 bytes
-rw-r--r--images/emoji/1f450-1f3fe.pngbin1053 -> 0 bytes
-rw-r--r--images/emoji/1f450-1f3ff.pngbin1053 -> 0 bytes
-rw-r--r--images/emoji/1f450.pngbin1053 -> 0 bytes
-rw-r--r--images/emoji/1f451.pngbin1534 -> 0 bytes
-rw-r--r--images/emoji/1f452.pngbin1553 -> 0 bytes
-rw-r--r--images/emoji/1f453.pngbin577 -> 0 bytes
-rw-r--r--images/emoji/1f454.pngbin995 -> 0 bytes
-rw-r--r--images/emoji/1f455.pngbin670 -> 0 bytes
-rw-r--r--images/emoji/1f456.pngbin1158 -> 0 bytes
-rw-r--r--images/emoji/1f457.pngbin1001 -> 0 bytes
-rw-r--r--images/emoji/1f458.pngbin1539 -> 0 bytes
-rw-r--r--images/emoji/1f459.pngbin613 -> 0 bytes
-rw-r--r--images/emoji/1f45a.pngbin1042 -> 0 bytes
-rw-r--r--images/emoji/1f45b.pngbin1558 -> 0 bytes
-rw-r--r--images/emoji/1f45c.pngbin1285 -> 0 bytes
-rw-r--r--images/emoji/1f45d.pngbin1259 -> 0 bytes
-rw-r--r--images/emoji/1f45e.pngbin1652 -> 0 bytes
-rw-r--r--images/emoji/1f45f.pngbin1595 -> 0 bytes
-rw-r--r--images/emoji/1f460.pngbin1008 -> 0 bytes
-rw-r--r--images/emoji/1f461.pngbin1180 -> 0 bytes
-rw-r--r--images/emoji/1f462.pngbin662 -> 0 bytes
-rw-r--r--images/emoji/1f463.pngbin621 -> 0 bytes
-rw-r--r--images/emoji/1f464.pngbin426 -> 0 bytes
-rw-r--r--images/emoji/1f465.pngbin526 -> 0 bytes
-rw-r--r--images/emoji/1f466-1f3fb.pngbin876 -> 0 bytes
-rw-r--r--images/emoji/1f466-1f3fc.pngbin876 -> 0 bytes
-rw-r--r--images/emoji/1f466-1f3fd.pngbin876 -> 0 bytes
-rw-r--r--images/emoji/1f466-1f3fe.pngbin870 -> 0 bytes
-rw-r--r--images/emoji/1f466-1f3ff.pngbin873 -> 0 bytes
-rw-r--r--images/emoji/1f466.pngbin881 -> 0 bytes
-rw-r--r--images/emoji/1f467-1f3fb.pngbin1260 -> 0 bytes
-rw-r--r--images/emoji/1f467-1f3fc.pngbin1255 -> 0 bytes
-rw-r--r--images/emoji/1f467-1f3fd.pngbin1255 -> 0 bytes
-rw-r--r--images/emoji/1f467-1f3fe.pngbin1241 -> 0 bytes
-rw-r--r--images/emoji/1f467-1f3ff.pngbin1245 -> 0 bytes
-rw-r--r--images/emoji/1f467.pngbin1262 -> 0 bytes
-rw-r--r--images/emoji/1f468-1f3fb.pngbin1069 -> 0 bytes
-rw-r--r--images/emoji/1f468-1f3fc.pngbin1069 -> 0 bytes
-rw-r--r--images/emoji/1f468-1f3fd.pngbin1069 -> 0 bytes
-rw-r--r--images/emoji/1f468-1f3fe.pngbin1069 -> 0 bytes
-rw-r--r--images/emoji/1f468-1f3ff.pngbin1087 -> 0 bytes
-rw-r--r--images/emoji/1f468-1f468-1f466-1f466.pngbin1354 -> 0 bytes
-rw-r--r--images/emoji/1f468-1f468-1f466.pngbin1206 -> 0 bytes
-rw-r--r--images/emoji/1f468-1f468-1f467-1f466.pngbin1626 -> 0 bytes
-rw-r--r--images/emoji/1f468-1f468-1f467-1f467.pngbin1448 -> 0 bytes
-rw-r--r--images/emoji/1f468-1f468-1f467.pngbin1362 -> 0 bytes
-rw-r--r--images/emoji/1f468-1f469-1f466-1f466.pngbin1641 -> 0 bytes
-rw-r--r--images/emoji/1f468-1f469-1f467-1f466.pngbin1838 -> 0 bytes
-rw-r--r--images/emoji/1f468-1f469-1f467-1f467.pngbin1739 -> 0 bytes
-rw-r--r--images/emoji/1f468-1f469-1f467.pngbin1555 -> 0 bytes
-rw-r--r--images/emoji/1f468-2764-1f468.pngbin1091 -> 0 bytes
-rw-r--r--images/emoji/1f468-2764-1f48b-1f468.pngbin1269 -> 0 bytes
-rw-r--r--images/emoji/1f468.pngbin1092 -> 0 bytes
-rw-r--r--images/emoji/1f469-1f3fb.pngbin1212 -> 0 bytes
-rw-r--r--images/emoji/1f469-1f3fc.pngbin1212 -> 0 bytes
-rw-r--r--images/emoji/1f469-1f3fd.pngbin1206 -> 0 bytes
-rw-r--r--images/emoji/1f469-1f3fe.pngbin1197 -> 0 bytes
-rw-r--r--images/emoji/1f469-1f3ff.pngbin1203 -> 0 bytes
-rw-r--r--images/emoji/1f469-1f469-1f466-1f466.pngbin1297 -> 0 bytes
-rw-r--r--images/emoji/1f469-1f469-1f466.pngbin1155 -> 0 bytes
-rw-r--r--images/emoji/1f469-1f469-1f467-1f466.pngbin1550 -> 0 bytes
-rw-r--r--images/emoji/1f469-1f469-1f467-1f467.pngbin1374 -> 0 bytes
-rw-r--r--images/emoji/1f469-1f469-1f467.pngbin1290 -> 0 bytes
-rw-r--r--images/emoji/1f469-2764-1f469.pngbin1034 -> 0 bytes
-rw-r--r--images/emoji/1f469-2764-1f48b-1f469.pngbin1150 -> 0 bytes
-rw-r--r--images/emoji/1f469.pngbin1212 -> 0 bytes
-rw-r--r--images/emoji/1f46a.pngbin1437 -> 0 bytes
-rw-r--r--images/emoji/1f46b.pngbin1538 -> 0 bytes
-rw-r--r--images/emoji/1f46c.pngbin1347 -> 0 bytes
-rw-r--r--images/emoji/1f46d.pngbin1547 -> 0 bytes
-rw-r--r--images/emoji/1f46e-1f3fb.pngbin1421 -> 0 bytes
-rw-r--r--images/emoji/1f46e-1f3fc.pngbin1424 -> 0 bytes
-rw-r--r--images/emoji/1f46e-1f3fd.pngbin1422 -> 0 bytes
-rw-r--r--images/emoji/1f46e-1f3fe.pngbin1422 -> 0 bytes
-rw-r--r--images/emoji/1f46e-1f3ff.pngbin1434 -> 0 bytes
-rw-r--r--images/emoji/1f46e.pngbin1442 -> 0 bytes
-rw-r--r--images/emoji/1f46f.pngbin1876 -> 0 bytes
-rw-r--r--images/emoji/1f470-1f3fb.pngbin2464 -> 0 bytes
-rw-r--r--images/emoji/1f470-1f3fc.pngbin2457 -> 0 bytes
-rw-r--r--images/emoji/1f470-1f3fd.pngbin2463 -> 0 bytes
-rw-r--r--images/emoji/1f470-1f3fe.pngbin2463 -> 0 bytes
-rw-r--r--images/emoji/1f470-1f3ff.pngbin2462 -> 0 bytes
-rw-r--r--images/emoji/1f470.pngbin2452 -> 0 bytes
-rw-r--r--images/emoji/1f471-1f3fb.pngbin1181 -> 0 bytes
-rw-r--r--images/emoji/1f471-1f3fc.pngbin1181 -> 0 bytes
-rw-r--r--images/emoji/1f471-1f3fd.pngbin1181 -> 0 bytes
-rw-r--r--images/emoji/1f471-1f3fe.pngbin1189 -> 0 bytes
-rw-r--r--images/emoji/1f471-1f3ff.pngbin1214 -> 0 bytes
-rw-r--r--images/emoji/1f471.pngbin1205 -> 0 bytes
-rw-r--r--images/emoji/1f472-1f3fb.pngbin1328 -> 0 bytes
-rw-r--r--images/emoji/1f472-1f3fc.pngbin1332 -> 0 bytes
-rw-r--r--images/emoji/1f472-1f3fd.pngbin1329 -> 0 bytes
-rw-r--r--images/emoji/1f472-1f3fe.pngbin1325 -> 0 bytes
-rw-r--r--images/emoji/1f472-1f3ff.pngbin1337 -> 0 bytes
-rw-r--r--images/emoji/1f472.pngbin1339 -> 0 bytes
-rw-r--r--images/emoji/1f473-1f3fb.pngbin1584 -> 0 bytes
-rw-r--r--images/emoji/1f473-1f3fc.pngbin1591 -> 0 bytes
-rw-r--r--images/emoji/1f473-1f3fd.pngbin1584 -> 0 bytes
-rw-r--r--images/emoji/1f473-1f3fe.pngbin1583 -> 0 bytes
-rw-r--r--images/emoji/1f473-1f3ff.pngbin1607 -> 0 bytes
-rw-r--r--images/emoji/1f473.pngbin1619 -> 0 bytes
-rw-r--r--images/emoji/1f474-1f3fb.pngbin1256 -> 0 bytes
-rw-r--r--images/emoji/1f474-1f3fc.pngbin1256 -> 0 bytes
-rw-r--r--images/emoji/1f474-1f3fd.pngbin1256 -> 0 bytes
-rw-r--r--images/emoji/1f474-1f3fe.pngbin1254 -> 0 bytes
-rw-r--r--images/emoji/1f474-1f3ff.pngbin1254 -> 0 bytes
-rw-r--r--images/emoji/1f474.pngbin1256 -> 0 bytes
-rw-r--r--images/emoji/1f475-1f3fb.pngbin1562 -> 0 bytes
-rw-r--r--images/emoji/1f475-1f3fc.pngbin1564 -> 0 bytes
-rw-r--r--images/emoji/1f475-1f3fd.pngbin1555 -> 0 bytes
-rw-r--r--images/emoji/1f475-1f3fe.pngbin1563 -> 0 bytes
-rw-r--r--images/emoji/1f475-1f3ff.pngbin1544 -> 0 bytes
-rw-r--r--images/emoji/1f475.pngbin1472 -> 0 bytes
-rw-r--r--images/emoji/1f476-1f3fb.pngbin1394 -> 0 bytes
-rw-r--r--images/emoji/1f476-1f3fc.pngbin1394 -> 0 bytes
-rw-r--r--images/emoji/1f476-1f3fd.pngbin1405 -> 0 bytes
-rw-r--r--images/emoji/1f476-1f3fe.pngbin1414 -> 0 bytes
-rw-r--r--images/emoji/1f476-1f3ff.pngbin1408 -> 0 bytes
-rw-r--r--images/emoji/1f476.pngbin1383 -> 0 bytes
-rw-r--r--images/emoji/1f477-1f3fb.pngbin1102 -> 0 bytes
-rw-r--r--images/emoji/1f477-1f3fc.pngbin1102 -> 0 bytes
-rw-r--r--images/emoji/1f477-1f3fd.pngbin1102 -> 0 bytes
-rw-r--r--images/emoji/1f477-1f3fe.pngbin1095 -> 0 bytes
-rw-r--r--images/emoji/1f477-1f3ff.pngbin1119 -> 0 bytes
-rw-r--r--images/emoji/1f477.pngbin1126 -> 0 bytes
-rw-r--r--images/emoji/1f478-1f3fb.pngbin1814 -> 0 bytes
-rw-r--r--images/emoji/1f478-1f3fc.pngbin1808 -> 0 bytes
-rw-r--r--images/emoji/1f478-1f3fd.pngbin1808 -> 0 bytes
-rw-r--r--images/emoji/1f478-1f3fe.pngbin1813 -> 0 bytes
-rw-r--r--images/emoji/1f478-1f3ff.pngbin1812 -> 0 bytes
-rw-r--r--images/emoji/1f478.pngbin1816 -> 0 bytes
-rw-r--r--images/emoji/1f479.pngbin1864 -> 0 bytes
-rw-r--r--images/emoji/1f47a.pngbin1563 -> 0 bytes
-rw-r--r--images/emoji/1f47b.pngbin1468 -> 0 bytes
-rw-r--r--images/emoji/1f47c-1f3fb.pngbin2088 -> 0 bytes
-rw-r--r--images/emoji/1f47c-1f3fc.pngbin2075 -> 0 bytes
-rw-r--r--images/emoji/1f47c-1f3fd.pngbin2078 -> 0 bytes
-rw-r--r--images/emoji/1f47c-1f3fe.pngbin2076 -> 0 bytes
-rw-r--r--images/emoji/1f47c-1f3ff.pngbin2078 -> 0 bytes
-rw-r--r--images/emoji/1f47c.pngbin2077 -> 0 bytes
-rw-r--r--images/emoji/1f47d.pngbin839 -> 0 bytes
-rw-r--r--images/emoji/1f47e.pngbin1325 -> 0 bytes
-rw-r--r--images/emoji/1f47f.pngbin1990 -> 0 bytes
-rw-r--r--images/emoji/1f480.pngbin628 -> 0 bytes
-rw-r--r--images/emoji/1f481-1f3fb.pngbin1597 -> 0 bytes
-rw-r--r--images/emoji/1f481-1f3fc.pngbin1591 -> 0 bytes
-rw-r--r--images/emoji/1f481-1f3fd.pngbin1580 -> 0 bytes
-rw-r--r--images/emoji/1f481-1f3fe.pngbin1578 -> 0 bytes
-rw-r--r--images/emoji/1f481-1f3ff.pngbin1588 -> 0 bytes
-rw-r--r--images/emoji/1f481.pngbin1585 -> 0 bytes
-rw-r--r--images/emoji/1f482-1f3fb.pngbin1122 -> 0 bytes
-rw-r--r--images/emoji/1f482-1f3fc.pngbin1164 -> 0 bytes
-rw-r--r--images/emoji/1f482-1f3fd.pngbin1164 -> 0 bytes
-rw-r--r--images/emoji/1f482-1f3fe.pngbin1157 -> 0 bytes
-rw-r--r--images/emoji/1f482-1f3ff.pngbin1167 -> 0 bytes
-rw-r--r--images/emoji/1f482.pngbin1140 -> 0 bytes
-rw-r--r--images/emoji/1f483-1f3fb.pngbin1421 -> 0 bytes
-rw-r--r--images/emoji/1f483-1f3fc.pngbin1423 -> 0 bytes
-rw-r--r--images/emoji/1f483-1f3fd.pngbin1429 -> 0 bytes
-rw-r--r--images/emoji/1f483-1f3fe.pngbin1428 -> 0 bytes
-rw-r--r--images/emoji/1f483-1f3ff.pngbin1418 -> 0 bytes
-rw-r--r--images/emoji/1f483.pngbin1406 -> 0 bytes
-rw-r--r--images/emoji/1f484.pngbin549 -> 0 bytes
-rw-r--r--images/emoji/1f485-1f3fb.pngbin1717 -> 0 bytes
-rw-r--r--images/emoji/1f485-1f3fc.pngbin1716 -> 0 bytes
-rw-r--r--images/emoji/1f485-1f3fd.pngbin1733 -> 0 bytes
-rw-r--r--images/emoji/1f485-1f3fe.pngbin1730 -> 0 bytes
-rw-r--r--images/emoji/1f485-1f3ff.pngbin1719 -> 0 bytes
-rw-r--r--images/emoji/1f485.pngbin1639 -> 0 bytes
-rw-r--r--images/emoji/1f486-1f3fb.pngbin1585 -> 0 bytes
-rw-r--r--images/emoji/1f486-1f3fc.pngbin1565 -> 0 bytes
-rw-r--r--images/emoji/1f486-1f3fd.pngbin1554 -> 0 bytes
-rw-r--r--images/emoji/1f486-1f3fe.pngbin1550 -> 0 bytes
-rw-r--r--images/emoji/1f486-1f3ff.pngbin1557 -> 0 bytes
-rw-r--r--images/emoji/1f486.pngbin1572 -> 0 bytes
-rw-r--r--images/emoji/1f487-1f3fb.pngbin1945 -> 0 bytes
-rw-r--r--images/emoji/1f487-1f3fc.pngbin1936 -> 0 bytes
-rw-r--r--images/emoji/1f487-1f3fd.pngbin1923 -> 0 bytes
-rw-r--r--images/emoji/1f487-1f3fe.pngbin1904 -> 0 bytes
-rw-r--r--images/emoji/1f487-1f3ff.pngbin1920 -> 0 bytes
-rw-r--r--images/emoji/1f487.pngbin1935 -> 0 bytes
-rw-r--r--images/emoji/1f488.pngbin820 -> 0 bytes
-rw-r--r--images/emoji/1f489.pngbin737 -> 0 bytes
-rw-r--r--images/emoji/1f48a.pngbin442 -> 0 bytes
-rw-r--r--images/emoji/1f48c.pngbin923 -> 0 bytes
-rw-r--r--images/emoji/1f48d.pngbin1113 -> 0 bytes
-rw-r--r--images/emoji/1f48e.pngbin715 -> 0 bytes
-rw-r--r--images/emoji/1f48f.pngbin1380 -> 0 bytes
-rw-r--r--images/emoji/1f490.pngbin1662 -> 0 bytes
-rw-r--r--images/emoji/1f491.pngbin1285 -> 0 bytes
-rw-r--r--images/emoji/1f492.pngbin1260 -> 0 bytes
-rw-r--r--images/emoji/1f493.pngbin699 -> 0 bytes
-rw-r--r--images/emoji/1f494.pngbin556 -> 0 bytes
-rw-r--r--images/emoji/1f495.pngbin493 -> 0 bytes
-rw-r--r--images/emoji/1f496.pngbin821 -> 0 bytes
-rw-r--r--images/emoji/1f497.pngbin675 -> 0 bytes
-rw-r--r--images/emoji/1f498.pngbin846 -> 0 bytes
-rw-r--r--images/emoji/1f499.pngbin435 -> 0 bytes
-rw-r--r--images/emoji/1f49a.pngbin435 -> 0 bytes
-rw-r--r--images/emoji/1f49b.pngbin435 -> 0 bytes
-rw-r--r--images/emoji/1f49c.pngbin435 -> 0 bytes
-rw-r--r--images/emoji/1f49d.pngbin1141 -> 0 bytes
-rw-r--r--images/emoji/1f49e.pngbin920 -> 0 bytes
-rw-r--r--images/emoji/1f49f.pngbin557 -> 0 bytes
-rw-r--r--images/emoji/1f4a0.pngbin693 -> 0 bytes
-rw-r--r--images/emoji/1f4a1.pngbin805 -> 0 bytes
-rw-r--r--images/emoji/1f4a2.pngbin594 -> 0 bytes
-rw-r--r--images/emoji/1f4a3.pngbin702 -> 0 bytes
-rw-r--r--images/emoji/1f4a4.pngbin540 -> 0 bytes
-rw-r--r--images/emoji/1f4a5.pngbin1110 -> 0 bytes
-rw-r--r--images/emoji/1f4a6.pngbin549 -> 0 bytes
-rw-r--r--images/emoji/1f4a7.pngbin411 -> 0 bytes
-rw-r--r--images/emoji/1f4a8.pngbin840 -> 0 bytes
-rw-r--r--images/emoji/1f4a9.pngbin1273 -> 0 bytes
-rw-r--r--images/emoji/1f4aa-1f3fb.pngbin1012 -> 0 bytes
-rw-r--r--images/emoji/1f4aa-1f3fc.pngbin1012 -> 0 bytes
-rw-r--r--images/emoji/1f4aa-1f3fd.pngbin1012 -> 0 bytes
-rw-r--r--images/emoji/1f4aa-1f3fe.pngbin1012 -> 0 bytes
-rw-r--r--images/emoji/1f4aa-1f3ff.pngbin1012 -> 0 bytes
-rw-r--r--images/emoji/1f4aa.pngbin1012 -> 0 bytes
-rw-r--r--images/emoji/1f4ab.pngbin795 -> 0 bytes
-rw-r--r--images/emoji/1f4ac.pngbin384 -> 0 bytes
-rw-r--r--images/emoji/1f4ad.pngbin489 -> 0 bytes
-rw-r--r--images/emoji/1f4ae.pngbin941 -> 0 bytes
-rw-r--r--images/emoji/1f4af.pngbin793 -> 0 bytes
-rw-r--r--images/emoji/1f4b0.pngbin2310 -> 0 bytes
-rw-r--r--images/emoji/1f4b1.pngbin576 -> 0 bytes
-rw-r--r--images/emoji/1f4b2.pngbin429 -> 0 bytes
-rw-r--r--images/emoji/1f4b3.pngbin1012 -> 0 bytes
-rw-r--r--images/emoji/1f4b4.pngbin421 -> 0 bytes
-rw-r--r--images/emoji/1f4b5.pngbin405 -> 0 bytes
-rw-r--r--images/emoji/1f4b6.pngbin460 -> 0 bytes
-rw-r--r--images/emoji/1f4b7.pngbin452 -> 0 bytes
-rw-r--r--images/emoji/1f4b8.pngbin2327 -> 0 bytes
-rw-r--r--images/emoji/1f4b9.pngbin724 -> 0 bytes
-rw-r--r--images/emoji/1f4ba.pngbin884 -> 0 bytes
-rw-r--r--images/emoji/1f4bb.pngbin369 -> 0 bytes
-rw-r--r--images/emoji/1f4bc.pngbin1275 -> 0 bytes
-rw-r--r--images/emoji/1f4bd.pngbin522 -> 0 bytes
-rw-r--r--images/emoji/1f4be.pngbin258 -> 0 bytes
-rw-r--r--images/emoji/1f4bf.pngbin908 -> 0 bytes
-rw-r--r--images/emoji/1f4c0.pngbin933 -> 0 bytes
-rw-r--r--images/emoji/1f4c1.pngbin1445 -> 0 bytes
-rw-r--r--images/emoji/1f4c2.pngbin755 -> 0 bytes
-rw-r--r--images/emoji/1f4c3.pngbin1157 -> 0 bytes
-rw-r--r--images/emoji/1f4c4.pngbin1110 -> 0 bytes
-rw-r--r--images/emoji/1f4c5.pngbin788 -> 0 bytes
-rw-r--r--images/emoji/1f4c6.pngbin2077 -> 0 bytes
-rw-r--r--images/emoji/1f4c7.pngbin1929 -> 0 bytes
-rw-r--r--images/emoji/1f4c8.pngbin688 -> 0 bytes
-rw-r--r--images/emoji/1f4c9.pngbin709 -> 0 bytes
-rw-r--r--images/emoji/1f4ca.pngbin408 -> 0 bytes
-rw-r--r--images/emoji/1f4cb.pngbin1349 -> 0 bytes
-rw-r--r--images/emoji/1f4cc.pngbin640 -> 0 bytes
-rw-r--r--images/emoji/1f4cd.pngbin455 -> 0 bytes
-rw-r--r--images/emoji/1f4ce.pngbin439 -> 0 bytes
-rw-r--r--images/emoji/1f4cf.pngbin1406 -> 0 bytes
-rw-r--r--images/emoji/1f4d0.pngbin369 -> 0 bytes
-rw-r--r--images/emoji/1f4d1.pngbin1398 -> 0 bytes
-rw-r--r--images/emoji/1f4d2.pngbin1530 -> 0 bytes
-rw-r--r--images/emoji/1f4d3.pngbin1215 -> 0 bytes
-rw-r--r--images/emoji/1f4d4.pngbin1782 -> 0 bytes
-rw-r--r--images/emoji/1f4d5.pngbin1359 -> 0 bytes
-rw-r--r--images/emoji/1f4d6.pngbin1716 -> 0 bytes
-rw-r--r--images/emoji/1f4d7.pngbin1366 -> 0 bytes
-rw-r--r--images/emoji/1f4d8.pngbin1348 -> 0 bytes
-rw-r--r--images/emoji/1f4d9.pngbin1329 -> 0 bytes
-rw-r--r--images/emoji/1f4da.pngbin2474 -> 0 bytes
-rw-r--r--images/emoji/1f4db.pngbin632 -> 0 bytes
-rw-r--r--images/emoji/1f4dc.pngbin989 -> 0 bytes
-rw-r--r--images/emoji/1f4dd.pngbin1625 -> 0 bytes
-rw-r--r--images/emoji/1f4de.pngbin941 -> 0 bytes
-rw-r--r--images/emoji/1f4df.pngbin553 -> 0 bytes
-rw-r--r--images/emoji/1f4e0.pngbin1188 -> 0 bytes
-rw-r--r--images/emoji/1f4e1.pngbin1173 -> 0 bytes
-rw-r--r--images/emoji/1f4e2.pngbin1316 -> 0 bytes
-rw-r--r--images/emoji/1f4e3.pngbin1751 -> 0 bytes
-rw-r--r--images/emoji/1f4e4.pngbin1002 -> 0 bytes
-rw-r--r--images/emoji/1f4e5.pngbin1029 -> 0 bytes
-rw-r--r--images/emoji/1f4e6.pngbin950 -> 0 bytes
-rw-r--r--images/emoji/1f4e7.pngbin1196 -> 0 bytes
-rw-r--r--images/emoji/1f4e8.pngbin1129 -> 0 bytes
-rw-r--r--images/emoji/1f4e9.pngbin1062 -> 0 bytes
-rw-r--r--images/emoji/1f4ea.pngbin1192 -> 0 bytes
-rw-r--r--images/emoji/1f4eb.pngbin1166 -> 0 bytes
-rw-r--r--images/emoji/1f4ec.pngbin1307 -> 0 bytes
-rw-r--r--images/emoji/1f4ed.pngbin960 -> 0 bytes
-rw-r--r--images/emoji/1f4ee.pngbin1077 -> 0 bytes
-rw-r--r--images/emoji/1f4ef.pngbin809 -> 0 bytes
-rw-r--r--images/emoji/1f4f0.pngbin1178 -> 0 bytes
-rw-r--r--images/emoji/1f4f1.pngbin695 -> 0 bytes
-rw-r--r--images/emoji/1f4f2.pngbin815 -> 0 bytes
-rw-r--r--images/emoji/1f4f3.pngbin683 -> 0 bytes
-rw-r--r--images/emoji/1f4f4.pngbin621 -> 0 bytes
-rw-r--r--images/emoji/1f4f5.pngbin790 -> 0 bytes
-rw-r--r--images/emoji/1f4f6.pngbin445 -> 0 bytes
-rw-r--r--images/emoji/1f4f7.pngbin1783 -> 0 bytes
-rw-r--r--images/emoji/1f4f8.pngbin2097 -> 0 bytes
-rw-r--r--images/emoji/1f4f9.pngbin1613 -> 0 bytes
-rw-r--r--images/emoji/1f4fa.pngbin776 -> 0 bytes
-rw-r--r--images/emoji/1f4fb.pngbin851 -> 0 bytes
-rw-r--r--images/emoji/1f4fc.pngbin632 -> 0 bytes
-rw-r--r--images/emoji/1f4fd.pngbin943 -> 0 bytes
-rw-r--r--images/emoji/1f4ff.pngbin1059 -> 0 bytes
-rw-r--r--images/emoji/1f500.pngbin574 -> 0 bytes
-rw-r--r--images/emoji/1f501.pngbin644 -> 0 bytes
-rw-r--r--images/emoji/1f502.pngbin688 -> 0 bytes
-rw-r--r--images/emoji/1f503.pngbin519 -> 0 bytes
-rw-r--r--images/emoji/1f504.pngbin693 -> 0 bytes
-rw-r--r--images/emoji/1f505.pngbin431 -> 0 bytes
-rw-r--r--images/emoji/1f506.pngbin474 -> 0 bytes
-rw-r--r--images/emoji/1f507.pngbin823 -> 0 bytes
-rw-r--r--images/emoji/1f508.pngbin575 -> 0 bytes
-rw-r--r--images/emoji/1f509.pngbin690 -> 0 bytes
-rw-r--r--images/emoji/1f50a.pngbin977 -> 0 bytes
-rw-r--r--images/emoji/1f50b.pngbin228 -> 0 bytes
-rw-r--r--images/emoji/1f50c.pngbin548 -> 0 bytes
-rw-r--r--images/emoji/1f50d.pngbin1240 -> 0 bytes
-rw-r--r--images/emoji/1f50e.pngbin1251 -> 0 bytes
-rw-r--r--images/emoji/1f50f.pngbin1123 -> 0 bytes
-rw-r--r--images/emoji/1f510.pngbin1250 -> 0 bytes
-rw-r--r--images/emoji/1f511.pngbin770 -> 0 bytes
-rw-r--r--images/emoji/1f512.pngbin986 -> 0 bytes
-rw-r--r--images/emoji/1f513.pngbin856 -> 0 bytes
-rw-r--r--images/emoji/1f514.pngbin1497 -> 0 bytes
-rw-r--r--images/emoji/1f515.pngbin823 -> 0 bytes
-rw-r--r--images/emoji/1f516.pngbin747 -> 0 bytes
-rw-r--r--images/emoji/1f517.pngbin477 -> 0 bytes
-rw-r--r--images/emoji/1f518.pngbin674 -> 0 bytes
-rw-r--r--images/emoji/1f519.pngbin562 -> 0 bytes
-rw-r--r--images/emoji/1f51a.pngbin393 -> 0 bytes
-rw-r--r--images/emoji/1f51b.pngbin459 -> 0 bytes
-rw-r--r--images/emoji/1f51c.pngbin483 -> 0 bytes
-rw-r--r--images/emoji/1f51d.pngbin389 -> 0 bytes
-rw-r--r--images/emoji/1f51e.pngbin863 -> 0 bytes
-rw-r--r--images/emoji/1f51f.pngbin621 -> 0 bytes
-rw-r--r--images/emoji/1f520.pngbin805 -> 0 bytes
-rw-r--r--images/emoji/1f521.pngbin670 -> 0 bytes
-rw-r--r--images/emoji/1f522.pngbin676 -> 0 bytes
-rw-r--r--images/emoji/1f523.pngbin746 -> 0 bytes
-rw-r--r--images/emoji/1f524.pngbin646 -> 0 bytes
-rw-r--r--images/emoji/1f525.pngbin1020 -> 0 bytes
-rw-r--r--images/emoji/1f526.pngbin964 -> 0 bytes
-rw-r--r--images/emoji/1f527.pngbin418 -> 0 bytes
-rw-r--r--images/emoji/1f528.pngbin834 -> 0 bytes
-rw-r--r--images/emoji/1f529.pngbin899 -> 0 bytes
-rw-r--r--images/emoji/1f52a.pngbin616 -> 0 bytes
-rw-r--r--images/emoji/1f52b.pngbin1859 -> 0 bytes
-rw-r--r--images/emoji/1f52c.pngbin1113 -> 0 bytes
-rw-r--r--images/emoji/1f52d.pngbin1256 -> 0 bytes
-rw-r--r--images/emoji/1f52e.pngbin1914 -> 0 bytes
-rw-r--r--images/emoji/1f52f.pngbin540 -> 0 bytes
-rw-r--r--images/emoji/1f530.pngbin545 -> 0 bytes
-rw-r--r--images/emoji/1f531.pngbin668 -> 0 bytes
-rw-r--r--images/emoji/1f532.pngbin122 -> 0 bytes
-rw-r--r--images/emoji/1f533.pngbin122 -> 0 bytes
-rw-r--r--images/emoji/1f534.pngbin374 -> 0 bytes
-rw-r--r--images/emoji/1f535.pngbin371 -> 0 bytes
-rw-r--r--images/emoji/1f536.pngbin248 -> 0 bytes
-rw-r--r--images/emoji/1f537.pngbin245 -> 0 bytes
-rw-r--r--images/emoji/1f538.pngbin194 -> 0 bytes
-rw-r--r--images/emoji/1f539.pngbin191 -> 0 bytes
-rw-r--r--images/emoji/1f53a.pngbin273 -> 0 bytes
-rw-r--r--images/emoji/1f53b.pngbin291 -> 0 bytes
-rw-r--r--images/emoji/1f53c.pngbin454 -> 0 bytes
-rw-r--r--images/emoji/1f53d.pngbin455 -> 0 bytes
-rw-r--r--images/emoji/1f549.pngbin773 -> 0 bytes
-rw-r--r--images/emoji/1f54a.pngbin967 -> 0 bytes
-rw-r--r--images/emoji/1f54b.pngbin1251 -> 0 bytes
-rw-r--r--images/emoji/1f54c.pngbin984 -> 0 bytes
-rw-r--r--images/emoji/1f54d.pngbin1309 -> 0 bytes
-rw-r--r--images/emoji/1f54e.pngbin1279 -> 0 bytes
-rw-r--r--images/emoji/1f550.pngbin586 -> 0 bytes
-rw-r--r--images/emoji/1f551.pngbin591 -> 0 bytes
-rw-r--r--images/emoji/1f552.pngbin482 -> 0 bytes
-rw-r--r--images/emoji/1f553.pngbin592 -> 0 bytes
-rw-r--r--images/emoji/1f554.pngbin585 -> 0 bytes
-rw-r--r--images/emoji/1f555.pngbin466 -> 0 bytes
-rw-r--r--images/emoji/1f556.pngbin581 -> 0 bytes
-rw-r--r--images/emoji/1f557.pngbin590 -> 0 bytes
-rw-r--r--images/emoji/1f558.pngbin484 -> 0 bytes
-rw-r--r--images/emoji/1f559.pngbin593 -> 0 bytes
-rw-r--r--images/emoji/1f55a.pngbin590 -> 0 bytes
-rw-r--r--images/emoji/1f55b.pngbin480 -> 0 bytes
-rw-r--r--images/emoji/1f55c.pngbin526 -> 0 bytes
-rw-r--r--images/emoji/1f55d.pngbin576 -> 0 bytes
-rw-r--r--images/emoji/1f55e.pngbin568 -> 0 bytes
-rw-r--r--images/emoji/1f55f.pngbin531 -> 0 bytes
-rw-r--r--images/emoji/1f560.pngbin552 -> 0 bytes
-rw-r--r--images/emoji/1f561.pngbin536 -> 0 bytes
-rw-r--r--images/emoji/1f562.pngbin531 -> 0 bytes
-rw-r--r--images/emoji/1f563.pngbin570 -> 0 bytes
-rw-r--r--images/emoji/1f564.pngbin576 -> 0 bytes
-rw-r--r--images/emoji/1f565.pngbin530 -> 0 bytes
-rw-r--r--images/emoji/1f566.pngbin583 -> 0 bytes
-rw-r--r--images/emoji/1f567.pngbin579 -> 0 bytes
-rw-r--r--images/emoji/1f56f.pngbin1250 -> 0 bytes
-rw-r--r--images/emoji/1f570.pngbin592 -> 0 bytes
-rw-r--r--images/emoji/1f573.pngbin1390 -> 0 bytes
-rw-r--r--images/emoji/1f574.pngbin914 -> 0 bytes
-rw-r--r--images/emoji/1f575-1f3fb.pngbin1639 -> 0 bytes
-rw-r--r--images/emoji/1f575-1f3fc.pngbin1636 -> 0 bytes
-rw-r--r--images/emoji/1f575-1f3fd.pngbin1647 -> 0 bytes
-rw-r--r--images/emoji/1f575-1f3fe.pngbin1639 -> 0 bytes
-rw-r--r--images/emoji/1f575-1f3ff.pngbin1639 -> 0 bytes
-rw-r--r--images/emoji/1f575.pngbin1650 -> 0 bytes
-rw-r--r--images/emoji/1f576.pngbin829 -> 0 bytes
-rw-r--r--images/emoji/1f577.pngbin1724 -> 0 bytes
-rw-r--r--images/emoji/1f578.pngbin929 -> 0 bytes
-rw-r--r--images/emoji/1f579.pngbin1039 -> 0 bytes
-rw-r--r--images/emoji/1f57a-1f3fb.pngbin1404 -> 0 bytes
-rw-r--r--images/emoji/1f57a-1f3fc.pngbin1402 -> 0 bytes
-rw-r--r--images/emoji/1f57a-1f3fd.pngbin1409 -> 0 bytes
-rw-r--r--images/emoji/1f57a-1f3fe.pngbin1421 -> 0 bytes
-rw-r--r--images/emoji/1f57a-1f3ff.pngbin1418 -> 0 bytes
-rw-r--r--images/emoji/1f57a.pngbin1400 -> 0 bytes
-rw-r--r--images/emoji/1f587.pngbin642 -> 0 bytes
-rw-r--r--images/emoji/1f58a.pngbin696 -> 0 bytes
-rw-r--r--images/emoji/1f58b.pngbin623 -> 0 bytes
-rw-r--r--images/emoji/1f58c.pngbin950 -> 0 bytes
-rw-r--r--images/emoji/1f58d.pngbin633 -> 0 bytes
-rw-r--r--images/emoji/1f590-1f3fb.pngbin1081 -> 0 bytes
-rw-r--r--images/emoji/1f590-1f3fc.pngbin1081 -> 0 bytes
-rw-r--r--images/emoji/1f590-1f3fd.pngbin1081 -> 0 bytes
-rw-r--r--images/emoji/1f590-1f3fe.pngbin1081 -> 0 bytes
-rw-r--r--images/emoji/1f590-1f3ff.pngbin1081 -> 0 bytes
-rw-r--r--images/emoji/1f590.pngbin1081 -> 0 bytes
-rw-r--r--images/emoji/1f595-1f3fb.pngbin892 -> 0 bytes
-rw-r--r--images/emoji/1f595-1f3fc.pngbin892 -> 0 bytes
-rw-r--r--images/emoji/1f595-1f3fd.pngbin892 -> 0 bytes
-rw-r--r--images/emoji/1f595-1f3fe.pngbin892 -> 0 bytes
-rw-r--r--images/emoji/1f595-1f3ff.pngbin892 -> 0 bytes
-rw-r--r--images/emoji/1f595.pngbin893 -> 0 bytes
-rw-r--r--images/emoji/1f596-1f3fb.pngbin1083 -> 0 bytes
-rw-r--r--images/emoji/1f596-1f3fc.pngbin1083 -> 0 bytes
-rw-r--r--images/emoji/1f596-1f3fd.pngbin1083 -> 0 bytes
-rw-r--r--images/emoji/1f596-1f3fe.pngbin1083 -> 0 bytes
-rw-r--r--images/emoji/1f596-1f3ff.pngbin1083 -> 0 bytes
-rw-r--r--images/emoji/1f596.pngbin1083 -> 0 bytes
-rw-r--r--images/emoji/1f5a4.pngbin435 -> 0 bytes
-rw-r--r--images/emoji/1f5a5.pngbin311 -> 0 bytes
-rw-r--r--images/emoji/1f5a8.pngbin926 -> 0 bytes
-rw-r--r--images/emoji/1f5b1.pngbin934 -> 0 bytes
-rw-r--r--images/emoji/1f5b2.pngbin892 -> 0 bytes
-rw-r--r--images/emoji/1f5bc.pngbin514 -> 0 bytes
-rw-r--r--images/emoji/1f5c2.pngbin810 -> 0 bytes
-rw-r--r--images/emoji/1f5c3.pngbin1523 -> 0 bytes
-rw-r--r--images/emoji/1f5c4.pngbin1420 -> 0 bytes
-rw-r--r--images/emoji/1f5d1.pngbin2414 -> 0 bytes
-rw-r--r--images/emoji/1f5d2.pngbin1377 -> 0 bytes
-rw-r--r--images/emoji/1f5d3.pngbin1491 -> 0 bytes
-rw-r--r--images/emoji/1f5dc.pngbin1614 -> 0 bytes
-rw-r--r--images/emoji/1f5dd.pngbin593 -> 0 bytes
-rw-r--r--images/emoji/1f5de.pngbin1046 -> 0 bytes
-rw-r--r--images/emoji/1f5e1.pngbin916 -> 0 bytes
-rw-r--r--images/emoji/1f5e3.pngbin531 -> 0 bytes
-rw-r--r--images/emoji/1f5e8.pngbin390 -> 0 bytes
-rw-r--r--images/emoji/1f5ef.pngbin551 -> 0 bytes
-rw-r--r--images/emoji/1f5f3.pngbin1355 -> 0 bytes
-rw-r--r--images/emoji/1f5fa.pngbin2352 -> 0 bytes
-rw-r--r--images/emoji/1f5fb.pngbin881 -> 0 bytes
-rw-r--r--images/emoji/1f5fc.pngbin765 -> 0 bytes
-rw-r--r--images/emoji/1f5fd.pngbin1145 -> 0 bytes
-rw-r--r--images/emoji/1f5fe.pngbin539 -> 0 bytes
-rw-r--r--images/emoji/1f5ff.pngbin1593 -> 0 bytes
-rw-r--r--images/emoji/1f600.pngbin810 -> 0 bytes
-rw-r--r--images/emoji/1f601.pngbin767 -> 0 bytes
-rw-r--r--images/emoji/1f602.pngbin1136 -> 0 bytes
-rw-r--r--images/emoji/1f603.pngbin686 -> 0 bytes
-rw-r--r--images/emoji/1f604.pngbin737 -> 0 bytes
-rw-r--r--images/emoji/1f605.pngbin851 -> 0 bytes
-rw-r--r--images/emoji/1f609.pngbin746 -> 0 bytes
-rw-r--r--images/emoji/1f60b.pngbin896 -> 0 bytes
-rw-r--r--images/emoji/1f60c.pngbin785 -> 0 bytes
-rw-r--r--images/emoji/1f60d.pngbin1069 -> 0 bytes
-rw-r--r--images/emoji/1f60e.pngbin824 -> 0 bytes
-rw-r--r--images/emoji/1f60f.pngbin775 -> 0 bytes
-rw-r--r--images/emoji/1f610.pngbin517 -> 0 bytes
-rw-r--r--images/emoji/1f611.pngbin438 -> 0 bytes
-rw-r--r--images/emoji/1f612.pngbin632 -> 0 bytes
-rw-r--r--images/emoji/1f613.pngbin861 -> 0 bytes
-rw-r--r--images/emoji/1f614.pngbin718 -> 0 bytes
-rw-r--r--images/emoji/1f615.pngbin647 -> 0 bytes
-rw-r--r--images/emoji/1f616.pngbin844 -> 0 bytes
-rw-r--r--images/emoji/1f617.pngbin738 -> 0 bytes
-rw-r--r--images/emoji/1f618.pngbin843 -> 0 bytes
-rw-r--r--images/emoji/1f619.pngbin648 -> 0 bytes
-rw-r--r--images/emoji/1f61a.pngbin888 -> 0 bytes
-rw-r--r--images/emoji/1f61b.pngbin752 -> 0 bytes
-rw-r--r--images/emoji/1f61d.pngbin867 -> 0 bytes
-rw-r--r--images/emoji/1f61f.pngbin715 -> 0 bytes
-rw-r--r--images/emoji/1f620.pngbin845 -> 0 bytes
-rw-r--r--images/emoji/1f621.pngbin845 -> 0 bytes
-rw-r--r--images/emoji/1f622.pngbin1123 -> 0 bytes
-rw-r--r--images/emoji/1f623.pngbin891 -> 0 bytes
-rw-r--r--images/emoji/1f624.pngbin1532 -> 0 bytes
-rw-r--r--images/emoji/1f625.pngbin835 -> 0 bytes
-rw-r--r--images/emoji/1f626.pngbin633 -> 0 bytes
-rw-r--r--images/emoji/1f627.pngbin821 -> 0 bytes
-rw-r--r--images/emoji/1f628.pngbin1002 -> 0 bytes
-rw-r--r--images/emoji/1f629.pngbin871 -> 0 bytes
-rw-r--r--images/emoji/1f62a.pngbin1185 -> 0 bytes
-rw-r--r--images/emoji/1f62b.pngbin1132 -> 0 bytes
-rw-r--r--images/emoji/1f62c.pngbin694 -> 0 bytes
-rw-r--r--images/emoji/1f62d.pngbin1241 -> 0 bytes
-rw-r--r--images/emoji/1f62f.pngbin634 -> 0 bytes
-rw-r--r--images/emoji/1f630.pngbin971 -> 0 bytes
-rw-r--r--images/emoji/1f631.pngbin1588 -> 0 bytes
-rw-r--r--images/emoji/1f632.pngbin862 -> 0 bytes
-rw-r--r--images/emoji/1f633.pngbin1127 -> 0 bytes
-rw-r--r--images/emoji/1f635.pngbin710 -> 0 bytes
-rw-r--r--images/emoji/1f636.pngbin465 -> 0 bytes
-rw-r--r--images/emoji/1f637.pngbin1323 -> 0 bytes
-rw-r--r--images/emoji/1f638.pngbin1407 -> 0 bytes
-rw-r--r--images/emoji/1f639.pngbin1633 -> 0 bytes
-rw-r--r--images/emoji/1f63a.pngbin1677 -> 0 bytes
-rw-r--r--images/emoji/1f63b.pngbin1513 -> 0 bytes
-rw-r--r--images/emoji/1f63c.pngbin1665 -> 0 bytes
-rw-r--r--images/emoji/1f63d.pngbin1469 -> 0 bytes
-rw-r--r--images/emoji/1f63e.pngbin1675 -> 0 bytes
-rw-r--r--images/emoji/1f63f.pngbin1876 -> 0 bytes
-rw-r--r--images/emoji/1f640.pngbin2120 -> 0 bytes
-rw-r--r--images/emoji/1f641.pngbin580 -> 0 bytes
-rw-r--r--images/emoji/1f642.pngbin600 -> 0 bytes
-rw-r--r--images/emoji/1f643.pngbin602 -> 0 bytes
-rw-r--r--images/emoji/1f644.pngbin743 -> 0 bytes
-rw-r--r--images/emoji/1f645-1f3fb.pngbin1768 -> 0 bytes
-rw-r--r--images/emoji/1f645-1f3fc.pngbin1756 -> 0 bytes
-rw-r--r--images/emoji/1f645-1f3fd.pngbin1766 -> 0 bytes
-rw-r--r--images/emoji/1f645-1f3fe.pngbin1786 -> 0 bytes
-rw-r--r--images/emoji/1f645-1f3ff.pngbin1786 -> 0 bytes
-rw-r--r--images/emoji/1f645.pngbin1751 -> 0 bytes
-rw-r--r--images/emoji/1f646-1f3fb.pngbin1702 -> 0 bytes
-rw-r--r--images/emoji/1f646-1f3fc.pngbin1695 -> 0 bytes
-rw-r--r--images/emoji/1f646-1f3fd.pngbin1699 -> 0 bytes
-rw-r--r--images/emoji/1f646-1f3fe.pngbin1692 -> 0 bytes
-rw-r--r--images/emoji/1f646-1f3ff.pngbin1702 -> 0 bytes
-rw-r--r--images/emoji/1f646.pngbin1702 -> 0 bytes
-rw-r--r--images/emoji/1f647-1f3fb.pngbin1396 -> 0 bytes
-rw-r--r--images/emoji/1f647-1f3fc.pngbin1396 -> 0 bytes
-rw-r--r--images/emoji/1f647-1f3fd.pngbin1396 -> 0 bytes
-rw-r--r--images/emoji/1f647-1f3fe.pngbin1396 -> 0 bytes
-rw-r--r--images/emoji/1f647-1f3ff.pngbin1396 -> 0 bytes
-rw-r--r--images/emoji/1f647.pngbin1396 -> 0 bytes
-rw-r--r--images/emoji/1f648.pngbin1227 -> 0 bytes
-rw-r--r--images/emoji/1f649.pngbin1210 -> 0 bytes
-rw-r--r--images/emoji/1f64a.pngbin1503 -> 0 bytes
-rw-r--r--images/emoji/1f64b-1f3fb.pngbin1678 -> 0 bytes
-rw-r--r--images/emoji/1f64b-1f3fc.pngbin1665 -> 0 bytes
-rw-r--r--images/emoji/1f64b-1f3fd.pngbin1661 -> 0 bytes
-rw-r--r--images/emoji/1f64b-1f3fe.pngbin1658 -> 0 bytes
-rw-r--r--images/emoji/1f64b-1f3ff.pngbin1661 -> 0 bytes
-rw-r--r--images/emoji/1f64b.pngbin1669 -> 0 bytes
-rw-r--r--images/emoji/1f64c-1f3fb.pngbin1098 -> 0 bytes
-rw-r--r--images/emoji/1f64c-1f3fc.pngbin1098 -> 0 bytes
-rw-r--r--images/emoji/1f64c-1f3fd.pngbin1098 -> 0 bytes
-rw-r--r--images/emoji/1f64c-1f3fe.pngbin1098 -> 0 bytes
-rw-r--r--images/emoji/1f64c-1f3ff.pngbin1098 -> 0 bytes
-rw-r--r--images/emoji/1f64c.pngbin1098 -> 0 bytes
-rw-r--r--images/emoji/1f64d-1f3fb.pngbin1141 -> 0 bytes
-rw-r--r--images/emoji/1f64d-1f3fc.pngbin1141 -> 0 bytes
-rw-r--r--images/emoji/1f64d-1f3fd.pngbin1141 -> 0 bytes
-rw-r--r--images/emoji/1f64d-1f3fe.pngbin1109 -> 0 bytes
-rw-r--r--images/emoji/1f64d-1f3ff.pngbin1114 -> 0 bytes
-rw-r--r--images/emoji/1f64d.pngbin1148 -> 0 bytes
-rw-r--r--images/emoji/1f64e-1f3fb.pngbin1309 -> 0 bytes
-rw-r--r--images/emoji/1f64e-1f3fc.pngbin1292 -> 0 bytes
-rw-r--r--images/emoji/1f64e-1f3fd.pngbin1305 -> 0 bytes
-rw-r--r--images/emoji/1f64e-1f3fe.pngbin1296 -> 0 bytes
-rw-r--r--images/emoji/1f64e-1f3ff.pngbin1303 -> 0 bytes
-rw-r--r--images/emoji/1f64e.pngbin1297 -> 0 bytes
-rw-r--r--images/emoji/1f64f-1f3fb.pngbin1131 -> 0 bytes
-rw-r--r--images/emoji/1f64f-1f3fc.pngbin1134 -> 0 bytes
-rw-r--r--images/emoji/1f64f-1f3fd.pngbin1137 -> 0 bytes
-rw-r--r--images/emoji/1f64f-1f3fe.pngbin1126 -> 0 bytes
-rw-r--r--images/emoji/1f64f-1f3ff.pngbin1117 -> 0 bytes
-rw-r--r--images/emoji/1f64f.pngbin1122 -> 0 bytes
-rw-r--r--images/emoji/1f680.pngbin1639 -> 0 bytes
-rw-r--r--images/emoji/1f681.pngbin1098 -> 0 bytes
-rw-r--r--images/emoji/1f682.pngbin1736 -> 0 bytes
-rw-r--r--images/emoji/1f683.pngbin847 -> 0 bytes
-rw-r--r--images/emoji/1f684.pngbin1538 -> 0 bytes
-rw-r--r--images/emoji/1f685.pngbin1450 -> 0 bytes
-rw-r--r--images/emoji/1f686.pngbin1501 -> 0 bytes
-rw-r--r--images/emoji/1f687.pngbin1020 -> 0 bytes
-rw-r--r--images/emoji/1f688.pngbin902 -> 0 bytes
-rw-r--r--images/emoji/1f689.pngbin1336 -> 0 bytes
-rw-r--r--images/emoji/1f68a.pngbin1065 -> 0 bytes
-rw-r--r--images/emoji/1f68b.pngbin1031 -> 0 bytes
-rw-r--r--images/emoji/1f68c.pngbin1086 -> 0 bytes
-rw-r--r--images/emoji/1f68d.pngbin964 -> 0 bytes
-rw-r--r--images/emoji/1f68e.pngbin1168 -> 0 bytes
-rw-r--r--images/emoji/1f68f.pngbin626 -> 0 bytes
-rw-r--r--images/emoji/1f690.pngbin1256 -> 0 bytes
-rw-r--r--images/emoji/1f691.pngbin1238 -> 0 bytes
-rw-r--r--images/emoji/1f692.pngbin1658 -> 0 bytes
-rw-r--r--images/emoji/1f693.pngbin1431 -> 0 bytes
-rw-r--r--images/emoji/1f694.pngbin1548 -> 0 bytes
-rw-r--r--images/emoji/1f695.pngbin1230 -> 0 bytes
-rw-r--r--images/emoji/1f696.pngbin1410 -> 0 bytes
-rw-r--r--images/emoji/1f697.pngbin1065 -> 0 bytes
-rw-r--r--images/emoji/1f698.pngbin1238 -> 0 bytes
-rw-r--r--images/emoji/1f699.pngbin1275 -> 0 bytes
-rw-r--r--images/emoji/1f69a.pngbin1367 -> 0 bytes
-rw-r--r--images/emoji/1f69b.pngbin1711 -> 0 bytes
-rw-r--r--images/emoji/1f69c.pngbin1192 -> 0 bytes
-rw-r--r--images/emoji/1f69d.pngbin1068 -> 0 bytes
-rw-r--r--images/emoji/1f69e.pngbin1320 -> 0 bytes
-rw-r--r--images/emoji/1f69f.pngbin927 -> 0 bytes
-rw-r--r--images/emoji/1f6a0.pngbin811 -> 0 bytes
-rw-r--r--images/emoji/1f6a1.pngbin759 -> 0 bytes
-rw-r--r--images/emoji/1f6a2.pngbin1405 -> 0 bytes
-rw-r--r--images/emoji/1f6a3-1f3fb.pngbin1972 -> 0 bytes
-rw-r--r--images/emoji/1f6a3-1f3fc.pngbin1972 -> 0 bytes
-rw-r--r--images/emoji/1f6a3-1f3fd.pngbin1967 -> 0 bytes
-rw-r--r--images/emoji/1f6a3-1f3fe.pngbin1974 -> 0 bytes
-rw-r--r--images/emoji/1f6a3-1f3ff.pngbin1971 -> 0 bytes
-rw-r--r--images/emoji/1f6a3.pngbin1963 -> 0 bytes
-rw-r--r--images/emoji/1f6a4.pngbin1255 -> 0 bytes
-rw-r--r--images/emoji/1f6a5.pngbin590 -> 0 bytes
-rw-r--r--images/emoji/1f6a6.pngbin752 -> 0 bytes
-rw-r--r--images/emoji/1f6a7.pngbin1083 -> 0 bytes
-rw-r--r--images/emoji/1f6a8.pngbin1969 -> 0 bytes
-rw-r--r--images/emoji/1f6a9.pngbin415 -> 0 bytes
-rw-r--r--images/emoji/1f6aa.pngbin1105 -> 0 bytes
-rw-r--r--images/emoji/1f6ab.pngbin555 -> 0 bytes
-rw-r--r--images/emoji/1f6ac.pngbin417 -> 0 bytes
-rw-r--r--images/emoji/1f6ad.pngbin1140 -> 0 bytes
-rw-r--r--images/emoji/1f6ae.pngbin650 -> 0 bytes
-rw-r--r--images/emoji/1f6af.pngbin1010 -> 0 bytes
-rw-r--r--images/emoji/1f6b0.pngbin633 -> 0 bytes
-rw-r--r--images/emoji/1f6b1.pngbin827 -> 0 bytes
-rw-r--r--images/emoji/1f6b2.pngbin1506 -> 0 bytes
-rw-r--r--images/emoji/1f6b3.pngbin998 -> 0 bytes
-rw-r--r--images/emoji/1f6b4-1f3fb.pngbin1860 -> 0 bytes
-rw-r--r--images/emoji/1f6b4-1f3fc.pngbin1866 -> 0 bytes
-rw-r--r--images/emoji/1f6b4-1f3fd.pngbin1851 -> 0 bytes
-rw-r--r--images/emoji/1f6b4-1f3fe.pngbin1852 -> 0 bytes
-rw-r--r--images/emoji/1f6b4-1f3ff.pngbin1840 -> 0 bytes
-rw-r--r--images/emoji/1f6b4.pngbin1911 -> 0 bytes
-rw-r--r--images/emoji/1f6b5-1f3fb.pngbin2294 -> 0 bytes
-rw-r--r--images/emoji/1f6b5-1f3fc.pngbin2298 -> 0 bytes
-rw-r--r--images/emoji/1f6b5-1f3fd.pngbin2284 -> 0 bytes
-rw-r--r--images/emoji/1f6b5-1f3fe.pngbin2288 -> 0 bytes
-rw-r--r--images/emoji/1f6b5-1f3ff.pngbin2281 -> 0 bytes
-rw-r--r--images/emoji/1f6b5.pngbin2288 -> 0 bytes
-rw-r--r--images/emoji/1f6b6-1f3fb.pngbin1084 -> 0 bytes
-rw-r--r--images/emoji/1f6b6-1f3fc.pngbin1084 -> 0 bytes
-rw-r--r--images/emoji/1f6b6-1f3fd.pngbin1066 -> 0 bytes
-rw-r--r--images/emoji/1f6b6-1f3fe.pngbin1075 -> 0 bytes
-rw-r--r--images/emoji/1f6b6-1f3ff.pngbin1065 -> 0 bytes
-rw-r--r--images/emoji/1f6b6.pngbin1082 -> 0 bytes
-rw-r--r--images/emoji/1f6b7.pngbin875 -> 0 bytes
-rw-r--r--images/emoji/1f6b8.pngbin778 -> 0 bytes
-rw-r--r--images/emoji/1f6b9.pngbin561 -> 0 bytes
-rw-r--r--images/emoji/1f6ba.pngbin577 -> 0 bytes
-rw-r--r--images/emoji/1f6bb.pngbin676 -> 0 bytes
-rw-r--r--images/emoji/1f6bc.pngbin665 -> 0 bytes
-rw-r--r--images/emoji/1f6bd.pngbin726 -> 0 bytes
-rw-r--r--images/emoji/1f6be.pngbin752 -> 0 bytes
-rw-r--r--images/emoji/1f6bf.pngbin2537 -> 0 bytes
-rw-r--r--images/emoji/1f6c0-1f3fb.pngbin1235 -> 0 bytes
-rw-r--r--images/emoji/1f6c0-1f3fc.pngbin1231 -> 0 bytes
-rw-r--r--images/emoji/1f6c0-1f3fd.pngbin1236 -> 0 bytes
-rw-r--r--images/emoji/1f6c0-1f3fe.pngbin1252 -> 0 bytes
-rw-r--r--images/emoji/1f6c0-1f3ff.pngbin1239 -> 0 bytes
-rw-r--r--images/emoji/1f6c0.pngbin1238 -> 0 bytes
-rw-r--r--images/emoji/1f6c1.pngbin767 -> 0 bytes
-rw-r--r--images/emoji/1f6c2.pngbin683 -> 0 bytes
-rw-r--r--images/emoji/1f6c3.pngbin648 -> 0 bytes
-rw-r--r--images/emoji/1f6c4.pngbin490 -> 0 bytes
-rw-r--r--images/emoji/1f6c5.pngbin576 -> 0 bytes
-rw-r--r--images/emoji/1f6cb.pngbin1362 -> 0 bytes
-rw-r--r--images/emoji/1f6cc.pngbin926 -> 0 bytes
-rw-r--r--images/emoji/1f6cd.pngbin1234 -> 0 bytes
-rw-r--r--images/emoji/1f6ce.pngbin891 -> 0 bytes
-rw-r--r--images/emoji/1f6cf.pngbin1573 -> 0 bytes
-rw-r--r--images/emoji/1f6d0.pngbin487 -> 0 bytes
-rw-r--r--images/emoji/1f6d1.pngbin260 -> 0 bytes
-rw-r--r--images/emoji/1f6d2.pngbin1072 -> 0 bytes
-rw-r--r--images/emoji/1f6e0.pngbin1225 -> 0 bytes
-rw-r--r--images/emoji/1f6e1.pngbin1602 -> 0 bytes
-rw-r--r--images/emoji/1f6e2.pngbin674 -> 0 bytes
-rw-r--r--images/emoji/1f6e3.pngbin1102 -> 0 bytes
-rw-r--r--images/emoji/1f6e4.pngbin1552 -> 0 bytes
-rw-r--r--images/emoji/1f6e5.pngbin990 -> 0 bytes
-rw-r--r--images/emoji/1f6e9.pngbin1229 -> 0 bytes
-rw-r--r--images/emoji/1f6eb.pngbin1111 -> 0 bytes
-rw-r--r--images/emoji/1f6ec.pngbin1101 -> 0 bytes
-rw-r--r--images/emoji/1f6f0.pngbin762 -> 0 bytes
-rw-r--r--images/emoji/1f6f3.pngbin2272 -> 0 bytes
-rw-r--r--images/emoji/1f6f4.pngbin1228 -> 0 bytes
-rw-r--r--images/emoji/1f6f5.pngbin1207 -> 0 bytes
-rw-r--r--images/emoji/1f6f6.pngbin1244 -> 0 bytes
-rw-r--r--images/emoji/1f910.pngbin722 -> 0 bytes
-rw-r--r--images/emoji/1f911.pngbin967 -> 0 bytes
-rw-r--r--images/emoji/1f912.pngbin1507 -> 0 bytes
-rw-r--r--images/emoji/1f913.pngbin975 -> 0 bytes
-rw-r--r--images/emoji/1f914.pngbin1345 -> 0 bytes
-rw-r--r--images/emoji/1f915.pngbin1201 -> 0 bytes
-rw-r--r--images/emoji/1f916.pngbin1228 -> 0 bytes
-rw-r--r--images/emoji/1f917.pngbin1427 -> 0 bytes
-rw-r--r--images/emoji/1f918-1f3fb.pngbin894 -> 0 bytes
-rw-r--r--images/emoji/1f918-1f3fc.pngbin888 -> 0 bytes
-rw-r--r--images/emoji/1f918-1f3fd.pngbin894 -> 0 bytes
-rw-r--r--images/emoji/1f918-1f3fe.pngbin888 -> 0 bytes
-rw-r--r--images/emoji/1f918-1f3ff.pngbin894 -> 0 bytes
-rw-r--r--images/emoji/1f918.pngbin894 -> 0 bytes
-rw-r--r--images/emoji/1f919-1f3fb.pngbin893 -> 0 bytes
-rw-r--r--images/emoji/1f919-1f3fc.pngbin891 -> 0 bytes
-rw-r--r--images/emoji/1f919-1f3fd.pngbin891 -> 0 bytes
-rw-r--r--images/emoji/1f919-1f3fe.pngbin891 -> 0 bytes
-rw-r--r--images/emoji/1f919-1f3ff.pngbin893 -> 0 bytes
-rw-r--r--images/emoji/1f919.pngbin894 -> 0 bytes
-rw-r--r--images/emoji/1f91a-1f3fb.pngbin848 -> 0 bytes
-rw-r--r--images/emoji/1f91a-1f3fc.pngbin848 -> 0 bytes
-rw-r--r--images/emoji/1f91a-1f3fd.pngbin848 -> 0 bytes
-rw-r--r--images/emoji/1f91a-1f3fe.pngbin848 -> 0 bytes
-rw-r--r--images/emoji/1f91a-1f3ff.pngbin848 -> 0 bytes
-rw-r--r--images/emoji/1f91a.pngbin848 -> 0 bytes
-rw-r--r--images/emoji/1f91b-1f3fb.pngbin960 -> 0 bytes
-rw-r--r--images/emoji/1f91b-1f3fc.pngbin972 -> 0 bytes
-rw-r--r--images/emoji/1f91b-1f3fd.pngbin960 -> 0 bytes
-rw-r--r--images/emoji/1f91b-1f3fe.pngbin960 -> 0 bytes
-rw-r--r--images/emoji/1f91b-1f3ff.pngbin976 -> 0 bytes
-rw-r--r--images/emoji/1f91b.pngbin972 -> 0 bytes
-rw-r--r--images/emoji/1f91c-1f3fb.pngbin964 -> 0 bytes
-rw-r--r--images/emoji/1f91c-1f3fc.pngbin964 -> 0 bytes
-rw-r--r--images/emoji/1f91c-1f3fd.pngbin964 -> 0 bytes
-rw-r--r--images/emoji/1f91c-1f3fe.pngbin964 -> 0 bytes
-rw-r--r--images/emoji/1f91c-1f3ff.pngbin964 -> 0 bytes
-rw-r--r--images/emoji/1f91c.pngbin975 -> 0 bytes
-rw-r--r--images/emoji/1f91d-1f3fb.pngbin1384 -> 0 bytes
-rw-r--r--images/emoji/1f91d-1f3fc.pngbin1384 -> 0 bytes
-rw-r--r--images/emoji/1f91d-1f3fd.pngbin1384 -> 0 bytes
-rw-r--r--images/emoji/1f91d-1f3fe.pngbin1384 -> 0 bytes
-rw-r--r--images/emoji/1f91d-1f3ff.pngbin1384 -> 0 bytes
-rw-r--r--images/emoji/1f91d.pngbin1369 -> 0 bytes
-rw-r--r--images/emoji/1f91e-1f3fb.pngbin1047 -> 0 bytes
-rw-r--r--images/emoji/1f91e-1f3fc.pngbin1050 -> 0 bytes
-rw-r--r--images/emoji/1f91e-1f3fd.pngbin1050 -> 0 bytes
-rw-r--r--images/emoji/1f91e-1f3fe.pngbin1046 -> 0 bytes
-rw-r--r--images/emoji/1f91e-1f3ff.pngbin1050 -> 0 bytes
-rw-r--r--images/emoji/1f91e.pngbin1050 -> 0 bytes
-rw-r--r--images/emoji/1f920.pngbin1361 -> 0 bytes
-rw-r--r--images/emoji/1f921.pngbin1820 -> 0 bytes
-rw-r--r--images/emoji/1f922.pngbin965 -> 0 bytes
-rw-r--r--images/emoji/1f923.pngbin1760 -> 0 bytes
-rw-r--r--images/emoji/1f924.pngbin1049 -> 0 bytes
-rw-r--r--images/emoji/1f925.pngbin1103 -> 0 bytes
-rw-r--r--images/emoji/1f926-1f3fb.pngbin1563 -> 0 bytes
-rw-r--r--images/emoji/1f926-1f3fc.pngbin1548 -> 0 bytes
-rw-r--r--images/emoji/1f926-1f3fd.pngbin1550 -> 0 bytes
-rw-r--r--images/emoji/1f926-1f3fe.pngbin1553 -> 0 bytes
-rw-r--r--images/emoji/1f926-1f3ff.pngbin1532 -> 0 bytes
-rw-r--r--images/emoji/1f926.pngbin1523 -> 0 bytes
-rw-r--r--images/emoji/1f927.pngbin1292 -> 0 bytes
-rw-r--r--images/emoji/1f930-1f3fb.pngbin1255 -> 0 bytes
-rw-r--r--images/emoji/1f930-1f3fc.pngbin1246 -> 0 bytes
-rw-r--r--images/emoji/1f930-1f3fd.pngbin1237 -> 0 bytes
-rw-r--r--images/emoji/1f930-1f3fe.pngbin1246 -> 0 bytes
-rw-r--r--images/emoji/1f930-1f3ff.pngbin1235 -> 0 bytes
-rw-r--r--images/emoji/1f930.pngbin1252 -> 0 bytes
-rw-r--r--images/emoji/1f933-1f3fb.pngbin1166 -> 0 bytes
-rw-r--r--images/emoji/1f933-1f3fc.pngbin1167 -> 0 bytes
-rw-r--r--images/emoji/1f933-1f3fd.pngbin1154 -> 0 bytes
-rw-r--r--images/emoji/1f933-1f3fe.pngbin1153 -> 0 bytes
-rw-r--r--images/emoji/1f933-1f3ff.pngbin1148 -> 0 bytes
-rw-r--r--images/emoji/1f933.pngbin1160 -> 0 bytes
-rw-r--r--images/emoji/1f934-1f3fb.pngbin1622 -> 0 bytes
-rw-r--r--images/emoji/1f934-1f3fc.pngbin1621 -> 0 bytes
-rw-r--r--images/emoji/1f934-1f3fd.pngbin1623 -> 0 bytes
-rw-r--r--images/emoji/1f934-1f3fe.pngbin1619 -> 0 bytes
-rw-r--r--images/emoji/1f934-1f3ff.pngbin1616 -> 0 bytes
-rw-r--r--images/emoji/1f934.pngbin1616 -> 0 bytes
-rw-r--r--images/emoji/1f935-1f3fb.pngbin1307 -> 0 bytes
-rw-r--r--images/emoji/1f935-1f3fc.pngbin1307 -> 0 bytes
-rw-r--r--images/emoji/1f935-1f3fd.pngbin1307 -> 0 bytes
-rw-r--r--images/emoji/1f935-1f3fe.pngbin1307 -> 0 bytes
-rw-r--r--images/emoji/1f935-1f3ff.pngbin1302 -> 0 bytes
-rw-r--r--images/emoji/1f935.pngbin1307 -> 0 bytes
-rw-r--r--images/emoji/1f936-1f3fb.pngbin1999 -> 0 bytes
-rw-r--r--images/emoji/1f936-1f3fc.pngbin2006 -> 0 bytes
-rw-r--r--images/emoji/1f936-1f3fd.pngbin2018 -> 0 bytes
-rw-r--r--images/emoji/1f936-1f3fe.pngbin2016 -> 0 bytes
-rw-r--r--images/emoji/1f936-1f3ff.pngbin2016 -> 0 bytes
-rw-r--r--images/emoji/1f936.pngbin2206 -> 0 bytes
-rw-r--r--images/emoji/1f937-1f3fb.pngbin1676 -> 0 bytes
-rw-r--r--images/emoji/1f937-1f3fc.pngbin1675 -> 0 bytes
-rw-r--r--images/emoji/1f937-1f3fd.pngbin1679 -> 0 bytes
-rw-r--r--images/emoji/1f937-1f3fe.pngbin1641 -> 0 bytes
-rw-r--r--images/emoji/1f937-1f3ff.pngbin1635 -> 0 bytes
-rw-r--r--images/emoji/1f937.pngbin1671 -> 0 bytes
-rw-r--r--images/emoji/1f938-1f3fb.pngbin1234 -> 0 bytes
-rw-r--r--images/emoji/1f938-1f3fc.pngbin1235 -> 0 bytes
-rw-r--r--images/emoji/1f938-1f3fd.pngbin1229 -> 0 bytes
-rw-r--r--images/emoji/1f938-1f3fe.pngbin1227 -> 0 bytes
-rw-r--r--images/emoji/1f938-1f3ff.pngbin1214 -> 0 bytes
-rw-r--r--images/emoji/1f938.pngbin1233 -> 0 bytes
-rw-r--r--images/emoji/1f939-1f3fb.pngbin1171 -> 0 bytes
-rw-r--r--images/emoji/1f939-1f3fc.pngbin1160 -> 0 bytes
-rw-r--r--images/emoji/1f939-1f3fd.pngbin1170 -> 0 bytes
-rw-r--r--images/emoji/1f939-1f3fe.pngbin1167 -> 0 bytes
-rw-r--r--images/emoji/1f939-1f3ff.pngbin1161 -> 0 bytes
-rw-r--r--images/emoji/1f939.pngbin1165 -> 0 bytes
-rw-r--r--images/emoji/1f93a.pngbin1871 -> 0 bytes
-rw-r--r--images/emoji/1f93b-1f3fb.pngbin2045 -> 0 bytes
-rw-r--r--images/emoji/1f93b-1f3fc.pngbin2049 -> 0 bytes
-rw-r--r--images/emoji/1f93b-1f3fd.pngbin2039 -> 0 bytes
-rw-r--r--images/emoji/1f93b-1f3fe.pngbin2042 -> 0 bytes
-rw-r--r--images/emoji/1f93b-1f3ff.pngbin2035 -> 0 bytes
-rw-r--r--images/emoji/1f93b.pngbin2556 -> 0 bytes
-rw-r--r--images/emoji/1f93c-1f3fb.pngbin2563 -> 0 bytes
-rw-r--r--images/emoji/1f93c-1f3fc.pngbin2553 -> 0 bytes
-rw-r--r--images/emoji/1f93c-1f3fd.pngbin2541 -> 0 bytes
-rw-r--r--images/emoji/1f93c-1f3fe.pngbin2553 -> 0 bytes
-rw-r--r--images/emoji/1f93c-1f3ff.pngbin2542 -> 0 bytes
-rw-r--r--images/emoji/1f93c.pngbin1575 -> 0 bytes
-rw-r--r--images/emoji/1f93d-1f3fb.pngbin1758 -> 0 bytes
-rw-r--r--images/emoji/1f93d-1f3fc.pngbin1757 -> 0 bytes
-rw-r--r--images/emoji/1f93d-1f3fd.pngbin1760 -> 0 bytes
-rw-r--r--images/emoji/1f93d-1f3fe.pngbin1749 -> 0 bytes
-rw-r--r--images/emoji/1f93d-1f3ff.pngbin1749 -> 0 bytes
-rw-r--r--images/emoji/1f93d.pngbin1412 -> 0 bytes
-rw-r--r--images/emoji/1f93e-1f3fb.pngbin1646 -> 0 bytes
-rw-r--r--images/emoji/1f93e-1f3fc.pngbin1629 -> 0 bytes
-rw-r--r--images/emoji/1f93e-1f3fd.pngbin1639 -> 0 bytes
-rw-r--r--images/emoji/1f93e-1f3fe.pngbin1634 -> 0 bytes
-rw-r--r--images/emoji/1f93e-1f3ff.pngbin1606 -> 0 bytes
-rw-r--r--images/emoji/1f93e.pngbin1755 -> 0 bytes
-rw-r--r--images/emoji/1f93f.pngbin1636 -> 0 bytes
-rw-r--r--images/emoji/1f940.pngbin1349 -> 0 bytes
-rw-r--r--images/emoji/1f942.pngbin1986 -> 0 bytes
-rw-r--r--images/emoji/1f943.pngbin2312 -> 0 bytes
-rw-r--r--images/emoji/1f944.pngbin700 -> 0 bytes
-rw-r--r--images/emoji/1f945.pngbin1244 -> 0 bytes
-rw-r--r--images/emoji/1f946.pngbin828 -> 0 bytes
-rw-r--r--images/emoji/1f947.pngbin1421 -> 0 bytes
-rw-r--r--images/emoji/1f948.pngbin1514 -> 0 bytes
-rw-r--r--images/emoji/1f949.pngbin1531 -> 0 bytes
-rw-r--r--images/emoji/1f950.pngbin1315 -> 0 bytes
-rw-r--r--images/emoji/1f951.pngbin1523 -> 0 bytes
-rw-r--r--images/emoji/1f952.pngbin1358 -> 0 bytes
-rw-r--r--images/emoji/1f953.pngbin2148 -> 0 bytes
-rw-r--r--images/emoji/1f954.pngbin1247 -> 0 bytes
-rw-r--r--images/emoji/1f955.pngbin1236 -> 0 bytes
-rw-r--r--images/emoji/1f956.pngbin1556 -> 0 bytes
-rw-r--r--images/emoji/1f957.pngbin2398 -> 0 bytes
-rw-r--r--images/emoji/1f958.pngbin1738 -> 0 bytes
-rw-r--r--images/emoji/1f959.pngbin2160 -> 0 bytes
-rw-r--r--images/emoji/1f95a.pngbin710 -> 0 bytes
-rw-r--r--images/emoji/1f95b.pngbin1224 -> 0 bytes
-rw-r--r--images/emoji/1f95c.pngbin3266 -> 0 bytes
-rw-r--r--images/emoji/1f95d.pngbin1896 -> 0 bytes
-rw-r--r--images/emoji/1f95e.pngbin3661 -> 0 bytes
-rw-r--r--images/emoji/1f960.pngbin2051 -> 0 bytes
-rw-r--r--images/emoji/1f961.pngbin1344 -> 0 bytes
-rw-r--r--images/emoji/1f980.pngbin1488 -> 0 bytes
-rw-r--r--images/emoji/1f981.pngbin1728 -> 0 bytes
-rw-r--r--images/emoji/1f982.pngbin1503 -> 0 bytes
-rw-r--r--images/emoji/1f983.pngbin1240 -> 0 bytes
-rw-r--r--images/emoji/1f984.pngbin2107 -> 0 bytes
-rw-r--r--images/emoji/1f985.pngbin2222 -> 0 bytes
-rw-r--r--images/emoji/1f986.pngbin1729 -> 0 bytes
-rw-r--r--images/emoji/1f987.pngbin1194 -> 0 bytes
-rw-r--r--images/emoji/1f988.pngbin1811 -> 0 bytes
-rw-r--r--images/emoji/1f989.pngbin2046 -> 0 bytes
-rw-r--r--images/emoji/1f98a.pngbin1557 -> 0 bytes
-rw-r--r--images/emoji/1f98b.pngbin1981 -> 0 bytes
-rw-r--r--images/emoji/1f98c.pngbin1608 -> 0 bytes
-rw-r--r--images/emoji/1f98d.pngbin1096 -> 0 bytes
-rw-r--r--images/emoji/1f98e.pngbin1709 -> 0 bytes
-rw-r--r--images/emoji/1f98f.pngbin1558 -> 0 bytes
-rw-r--r--images/emoji/1f990.pngbin1376 -> 0 bytes
-rw-r--r--images/emoji/1f991.pngbin1395 -> 0 bytes
-rw-r--r--images/emoji/1f9c0.pngbin1697 -> 0 bytes
-rw-r--r--images/emoji/203c.pngbin390 -> 0 bytes
-rw-r--r--images/emoji/2049.pngbin601 -> 0 bytes
-rw-r--r--images/emoji/2122.pngbin300 -> 0 bytes
-rw-r--r--images/emoji/2139.pngbin506 -> 0 bytes
-rw-r--r--images/emoji/2194.pngbin495 -> 0 bytes
-rw-r--r--images/emoji/2195.pngbin474 -> 0 bytes
-rw-r--r--images/emoji/2196.pngbin521 -> 0 bytes
-rw-r--r--images/emoji/2197.pngbin524 -> 0 bytes
-rw-r--r--images/emoji/2198.pngbin526 -> 0 bytes
-rw-r--r--images/emoji/2199.pngbin520 -> 0 bytes
-rw-r--r--images/emoji/21a9.pngbin643 -> 0 bytes
-rw-r--r--images/emoji/21aa.pngbin644 -> 0 bytes
-rw-r--r--images/emoji/231a.pngbin785 -> 0 bytes
-rw-r--r--images/emoji/231b.pngbin800 -> 0 bytes
-rw-r--r--images/emoji/2328.pngbin429 -> 0 bytes
-rw-r--r--images/emoji/23cf.pngbin548 -> 0 bytes
-rw-r--r--images/emoji/23e9.pngbin523 -> 0 bytes
-rw-r--r--images/emoji/23ea.pngbin523 -> 0 bytes
-rw-r--r--images/emoji/23eb.pngbin535 -> 0 bytes
-rw-r--r--images/emoji/23ec.pngbin543 -> 0 bytes
-rw-r--r--images/emoji/23ed.pngbin551 -> 0 bytes
-rw-r--r--images/emoji/23ee.pngbin549 -> 0 bytes
-rw-r--r--images/emoji/23ef.pngbin509 -> 0 bytes
-rw-r--r--images/emoji/23f0.pngbin1044 -> 0 bytes
-rw-r--r--images/emoji/23f1.pngbin1330 -> 0 bytes
-rw-r--r--images/emoji/23f2.pngbin1897 -> 0 bytes
-rw-r--r--images/emoji/23f3.pngbin847 -> 0 bytes
-rw-r--r--images/emoji/23f8.pngbin395 -> 0 bytes
-rw-r--r--images/emoji/23f9.pngbin385 -> 0 bytes
-rw-r--r--images/emoji/23fa.pngbin475 -> 0 bytes
-rw-r--r--images/emoji/24c2.pngbin500 -> 0 bytes
-rw-r--r--images/emoji/25aa.pngbin108 -> 0 bytes
-rw-r--r--images/emoji/25ab.pngbin108 -> 0 bytes
-rw-r--r--images/emoji/25b6.pngbin429 -> 0 bytes
-rw-r--r--images/emoji/25c0.pngbin429 -> 0 bytes
-rw-r--r--images/emoji/25fb.pngbin108 -> 0 bytes
-rw-r--r--images/emoji/25fc.pngbin108 -> 0 bytes
-rw-r--r--images/emoji/25fd.pngbin110 -> 0 bytes
-rw-r--r--images/emoji/25fe.pngbin110 -> 0 bytes
-rw-r--r--images/emoji/2600.pngbin746 -> 0 bytes
-rw-r--r--images/emoji/2601.pngbin626 -> 0 bytes
-rw-r--r--images/emoji/2602.pngbin897 -> 0 bytes
-rw-r--r--images/emoji/2603.pngbin2176 -> 0 bytes
-rw-r--r--images/emoji/2604.pngbin1821 -> 0 bytes
-rw-r--r--images/emoji/260e.pngbin1761 -> 0 bytes
-rw-r--r--images/emoji/2611.pngbin639 -> 0 bytes
-rw-r--r--images/emoji/2614.pngbin1229 -> 0 bytes
-rw-r--r--images/emoji/2615.pngbin1679 -> 0 bytes
-rw-r--r--images/emoji/2618.pngbin1023 -> 0 bytes
-rw-r--r--images/emoji/261d-1f3fb.pngbin820 -> 0 bytes
-rw-r--r--images/emoji/261d-1f3fc.pngbin820 -> 0 bytes
-rw-r--r--images/emoji/261d-1f3fd.pngbin820 -> 0 bytes
-rw-r--r--images/emoji/261d-1f3fe.pngbin820 -> 0 bytes
-rw-r--r--images/emoji/261d-1f3ff.pngbin820 -> 0 bytes
-rw-r--r--images/emoji/261d.pngbin819 -> 0 bytes
-rw-r--r--images/emoji/2620.pngbin726 -> 0 bytes
-rw-r--r--images/emoji/2622.pngbin858 -> 0 bytes
-rw-r--r--images/emoji/2623.pngbin794 -> 0 bytes
-rw-r--r--images/emoji/2626.pngbin239 -> 0 bytes
-rw-r--r--images/emoji/262a.pngbin490 -> 0 bytes
-rw-r--r--images/emoji/262e.pngbin933 -> 0 bytes
-rw-r--r--images/emoji/262f.pngbin776 -> 0 bytes
-rw-r--r--images/emoji/2638.pngbin666 -> 0 bytes
-rw-r--r--images/emoji/2639.pngbin589 -> 0 bytes
-rw-r--r--images/emoji/263a.pngbin636 -> 0 bytes
-rw-r--r--images/emoji/2648.pngbin711 -> 0 bytes
-rw-r--r--images/emoji/2649.pngbin701 -> 0 bytes
-rw-r--r--images/emoji/264a.pngbin547 -> 0 bytes
-rw-r--r--images/emoji/264b.pngbin729 -> 0 bytes
-rw-r--r--images/emoji/264c.pngbin745 -> 0 bytes
-rw-r--r--images/emoji/264d.pngbin618 -> 0 bytes
-rw-r--r--images/emoji/264e.pngbin657 -> 0 bytes
-rw-r--r--images/emoji/264f.pngbin612 -> 0 bytes
-rw-r--r--images/emoji/2650.pngbin602 -> 0 bytes
-rw-r--r--images/emoji/2651.pngbin688 -> 0 bytes
-rw-r--r--images/emoji/2652.pngbin648 -> 0 bytes
-rw-r--r--images/emoji/2653.pngbin678 -> 0 bytes
-rw-r--r--images/emoji/2660.pngbin454 -> 0 bytes
-rw-r--r--images/emoji/2663.pngbin458 -> 0 bytes
-rw-r--r--images/emoji/2666.pngbin247 -> 0 bytes
-rw-r--r--images/emoji/2668.pngbin733 -> 0 bytes
-rw-r--r--images/emoji/267b.pngbin914 -> 0 bytes
-rw-r--r--images/emoji/267f.pngbin683 -> 0 bytes
-rw-r--r--images/emoji/2692.pngbin1068 -> 0 bytes
-rw-r--r--images/emoji/2693.pngbin779 -> 0 bytes
-rw-r--r--images/emoji/2694.pngbin1591 -> 0 bytes
-rw-r--r--images/emoji/2696.pngbin1181 -> 0 bytes
-rw-r--r--images/emoji/2697.pngbin953 -> 0 bytes
-rw-r--r--images/emoji/2699.pngbin747 -> 0 bytes
-rw-r--r--images/emoji/269b.pngbin912 -> 0 bytes
-rw-r--r--images/emoji/269c.pngbin632 -> 0 bytes
-rw-r--r--images/emoji/26a0.pngbin565 -> 0 bytes
-rw-r--r--images/emoji/26a1.pngbin413 -> 0 bytes
-rw-r--r--images/emoji/26aa.pngbin351 -> 0 bytes
-rw-r--r--images/emoji/26ab.pngbin374 -> 0 bytes
-rw-r--r--images/emoji/26b0.pngbin2195 -> 0 bytes
-rw-r--r--images/emoji/26b1.pngbin742 -> 0 bytes
-rw-r--r--images/emoji/26bd.pngbin1034 -> 0 bytes
-rw-r--r--images/emoji/26be.pngbin1185 -> 0 bytes
-rw-r--r--images/emoji/26c4.pngbin1481 -> 0 bytes
-rw-r--r--images/emoji/26c5.pngbin977 -> 0 bytes
-rw-r--r--images/emoji/26c8.pngbin1020 -> 0 bytes
-rw-r--r--images/emoji/26ce.pngbin723 -> 0 bytes
-rw-r--r--images/emoji/26cf.pngbin1023 -> 0 bytes
-rw-r--r--images/emoji/26d1.pngbin1014 -> 0 bytes
-rw-r--r--images/emoji/26d3.pngbin708 -> 0 bytes
-rw-r--r--images/emoji/26d4.pngbin377 -> 0 bytes
-rw-r--r--images/emoji/26e9.pngbin579 -> 0 bytes
-rw-r--r--images/emoji/26ea.pngbin1302 -> 0 bytes
-rw-r--r--images/emoji/26f0.pngbin1409 -> 0 bytes
-rw-r--r--images/emoji/26f1.pngbin1488 -> 0 bytes
-rw-r--r--images/emoji/26f2.pngbin1768 -> 0 bytes
-rw-r--r--images/emoji/26f3.pngbin823 -> 0 bytes
-rw-r--r--images/emoji/26f4.pngbin528 -> 0 bytes
-rw-r--r--images/emoji/26f5.pngbin1274 -> 0 bytes
-rw-r--r--images/emoji/26f7.pngbin1539 -> 0 bytes
-rw-r--r--images/emoji/26f8.pngbin1576 -> 0 bytes
-rw-r--r--images/emoji/26f9-1f3fb.pngbin1493 -> 0 bytes
-rw-r--r--images/emoji/26f9-1f3fc.pngbin1493 -> 0 bytes
-rw-r--r--images/emoji/26f9-1f3fd.pngbin1492 -> 0 bytes
-rw-r--r--images/emoji/26f9-1f3fe.pngbin1494 -> 0 bytes
-rw-r--r--images/emoji/26f9-1f3ff.pngbin1479 -> 0 bytes
-rw-r--r--images/emoji/26f9.pngbin1493 -> 0 bytes
-rw-r--r--images/emoji/26fa.pngbin1684 -> 0 bytes
-rw-r--r--images/emoji/26fd.pngbin864 -> 0 bytes
-rw-r--r--images/emoji/2702.pngbin937 -> 0 bytes
-rw-r--r--images/emoji/2705.pngbin547 -> 0 bytes
-rw-r--r--images/emoji/2708.pngbin1152 -> 0 bytes
-rw-r--r--images/emoji/2709.pngbin916 -> 0 bytes
-rw-r--r--images/emoji/270a-1f3fb.pngbin1014 -> 0 bytes
-rw-r--r--images/emoji/270a-1f3fc.pngbin1014 -> 0 bytes
-rw-r--r--images/emoji/270a-1f3fd.pngbin1014 -> 0 bytes
-rw-r--r--images/emoji/270a-1f3fe.pngbin1014 -> 0 bytes
-rw-r--r--images/emoji/270a-1f3ff.pngbin1014 -> 0 bytes
-rw-r--r--images/emoji/270a.pngbin1014 -> 0 bytes
-rw-r--r--images/emoji/270b-1f3fb.pngbin791 -> 0 bytes
-rw-r--r--images/emoji/270b-1f3fc.pngbin791 -> 0 bytes
-rw-r--r--images/emoji/270b-1f3fd.pngbin791 -> 0 bytes
-rw-r--r--images/emoji/270b-1f3fe.pngbin791 -> 0 bytes
-rw-r--r--images/emoji/270b-1f3ff.pngbin791 -> 0 bytes
-rw-r--r--images/emoji/270b.pngbin791 -> 0 bytes
-rw-r--r--images/emoji/270c-1f3fb.pngbin1009 -> 0 bytes
-rw-r--r--images/emoji/270c-1f3fc.pngbin1009 -> 0 bytes
-rw-r--r--images/emoji/270c-1f3fd.pngbin1009 -> 0 bytes
-rw-r--r--images/emoji/270c-1f3fe.pngbin1009 -> 0 bytes
-rw-r--r--images/emoji/270c-1f3ff.pngbin1009 -> 0 bytes
-rw-r--r--images/emoji/270c.pngbin1009 -> 0 bytes
-rw-r--r--images/emoji/270d-1f3fb.pngbin988 -> 0 bytes
-rw-r--r--images/emoji/270d-1f3fc.pngbin987 -> 0 bytes
-rw-r--r--images/emoji/270d-1f3fd.pngbin977 -> 0 bytes
-rw-r--r--images/emoji/270d-1f3fe.pngbin973 -> 0 bytes
-rw-r--r--images/emoji/270d-1f3ff.pngbin970 -> 0 bytes
-rw-r--r--images/emoji/270d.pngbin1001 -> 0 bytes
-rw-r--r--images/emoji/270f.pngbin654 -> 0 bytes
-rw-r--r--images/emoji/2712.pngbin620 -> 0 bytes
-rw-r--r--images/emoji/2714.pngbin438 -> 0 bytes
-rw-r--r--images/emoji/2716.pngbin298 -> 0 bytes
-rw-r--r--images/emoji/271d.pngbin408 -> 0 bytes
-rw-r--r--images/emoji/2721.pngbin491 -> 0 bytes
-rw-r--r--images/emoji/2728.pngbin651 -> 0 bytes
-rw-r--r--images/emoji/2733.pngbin493 -> 0 bytes
-rw-r--r--images/emoji/2734.pngbin493 -> 0 bytes
-rw-r--r--images/emoji/2744.pngbin691 -> 0 bytes
-rw-r--r--images/emoji/2747.pngbin663 -> 0 bytes
-rw-r--r--images/emoji/274c.pngbin298 -> 0 bytes
-rw-r--r--images/emoji/274e.pngbin370 -> 0 bytes
-rw-r--r--images/emoji/2753.pngbin449 -> 0 bytes
-rw-r--r--images/emoji/2754.pngbin449 -> 0 bytes
-rw-r--r--images/emoji/2755.pngbin354 -> 0 bytes
-rw-r--r--images/emoji/2757.pngbin354 -> 0 bytes
-rw-r--r--images/emoji/2763.pngbin471 -> 0 bytes
-rw-r--r--images/emoji/2764.pngbin435 -> 0 bytes
-rw-r--r--images/emoji/2795.pngbin115 -> 0 bytes
-rw-r--r--images/emoji/2796.pngbin108 -> 0 bytes
-rw-r--r--images/emoji/2797.pngbin204 -> 0 bytes
-rw-r--r--images/emoji/27a1.pngbin468 -> 0 bytes
-rw-r--r--images/emoji/27b0.pngbin545 -> 0 bytes
-rw-r--r--images/emoji/27bf.pngbin550 -> 0 bytes
-rw-r--r--images/emoji/2934.pngbin559 -> 0 bytes
-rw-r--r--images/emoji/2935.pngbin563 -> 0 bytes
-rw-r--r--images/emoji/2b05.pngbin471 -> 0 bytes
-rw-r--r--images/emoji/2b06.pngbin507 -> 0 bytes
-rw-r--r--images/emoji/2b07.pngbin512 -> 0 bytes
-rw-r--r--images/emoji/2b1b.pngbin110 -> 0 bytes
-rw-r--r--images/emoji/2b1c.pngbin110 -> 0 bytes
-rw-r--r--images/emoji/2b50.pngbin456 -> 0 bytes
-rw-r--r--images/emoji/2b55.pngbin475 -> 0 bytes
-rw-r--r--images/emoji/3030.pngbin359 -> 0 bytes
-rw-r--r--images/emoji/303d.pngbin521 -> 0 bytes
-rw-r--r--images/emoji/3297.pngbin729 -> 0 bytes
-rw-r--r--images/emoji/3299.pngbin857 -> 0 bytes
-rw-r--r--include/attach.php133
-rw-r--r--include/bbcode.php2
-rw-r--r--include/channel.php402
-rw-r--r--include/connections.php245
-rw-r--r--include/conversation.php209
-rw-r--r--include/crypto.php44
-rwxr-xr-xinclude/dba/dba_driver.php10
-rw-r--r--include/dir_fns.php31
-rw-r--r--include/environment.php2
-rw-r--r--include/event.php151
-rw-r--r--include/feedutils.php602
-rw-r--r--include/follow.php2
-rw-r--r--include/help.php16
-rw-r--r--include/hubloc.php129
-rw-r--r--include/import.php633
-rwxr-xr-xinclude/items.php279
-rw-r--r--include/markdown.php55
-rw-r--r--include/message.php23
-rw-r--r--include/nav.php247
-rw-r--r--include/network.php610
-rwxr-xr-xinclude/oembed.php11
-rw-r--r--include/permissions.php7
-rw-r--r--include/photo/photo_driver.php89
-rw-r--r--include/photos.php81
-rwxr-xr-xinclude/plugin.php1
-rw-r--r--include/probe.php99
-rw-r--r--include/queue_fn.php12
-rw-r--r--include/security.php56
-rw-r--r--include/text.php164
-rw-r--r--include/widgets.php1721
-rw-r--r--include/zot.php105
-rw-r--r--install/schema_mysql.sql460
-rw-r--r--install/schema_postgres.sql440
-rw-r--r--install/update.php43
-rw-r--r--library/HTMLPurifier.composer.php4
-rw-r--r--library/HTMLPurifier.includes.php229
-rw-r--r--library/HTMLPurifier.php292
-rw-r--r--library/HTMLPurifier.safe-includes.php223
-rw-r--r--library/HTMLPurifier/Arborize.php71
-rw-r--r--library/HTMLPurifier/AttrCollections.php143
-rw-r--r--library/HTMLPurifier/AttrDef.php138
-rw-r--r--library/HTMLPurifier/AttrDef/CSS.php106
-rw-r--r--library/HTMLPurifier/AttrDef/CSS/Color.php105
-rw-r--r--library/HTMLPurifier/AttrDef/CSS/Multiple.php71
-rw-r--r--library/HTMLPurifier/AttrDef/CSS/URI.php74
-rw-r--r--library/HTMLPurifier/AttrDef/HTML/Bool.php51
-rw-r--r--library/HTMLPurifier/AttrDef/HTML/ID.php105
-rw-r--r--library/HTMLPurifier/AttrDef/URI/Host.php128
-rw-r--r--library/HTMLPurifier/AttrTransform/ImgRequired.php48
-rw-r--r--library/HTMLPurifier/CSSDefinition.php474
-rw-r--r--library/HTMLPurifier/ChildDef/List.php86
-rw-r--r--library/HTMLPurifier/ChildDef/Table.php224
-rw-r--r--library/HTMLPurifier/Config.php911
-rw-r--r--library/HTMLPurifier/ConfigSchema/schema.serbin15000 -> 0 bytes
-rw-r--r--library/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPermissions.txt11
-rw-r--r--library/HTMLPurifier/ConfigSchema/schema/HTML.CustomDoctype.txt9
-rw-r--r--library/HTMLPurifier/ConfigSchema/schema/URI.AllowedSchemes.txt17
-rw-r--r--library/HTMLPurifier/ConfigSchema/schema/URI.DefaultScheme.txt10
-rw-r--r--library/HTMLPurifier/DefinitionCache.php129
-rw-r--r--library/HTMLPurifier/DefinitionCache/Serializer.php285
-rw-r--r--library/HTMLPurifier/Encoder.php611
-rw-r--r--library/HTMLPurifier/EntityParser.php153
-rw-r--r--library/HTMLPurifier/Filter/ExtractStyleBlocks.php338
-rw-r--r--library/HTMLPurifier/Filter/YouTube.php65
-rw-r--r--library/HTMLPurifier/HTMLModuleManager.php459
-rw-r--r--library/HTMLPurifier/Injector/Linkify.php59
-rw-r--r--library/HTMLPurifier/Injector/RemoveEmpty.php101
-rw-r--r--library/HTMLPurifier/Injector/SafeObject.php121
-rw-r--r--library/HTMLPurifier/Lexer.php357
-rw-r--r--library/HTMLPurifier/Lexer/DOMLex.php280
-rw-r--r--library/HTMLPurifier/Lexer/DirectLex.php539
-rw-r--r--library/HTMLPurifier/Lexer/PH5P.php4788
-rw-r--r--library/HTMLPurifier/Printer/ConfigForm.php447
-rw-r--r--library/HTMLPurifier/Strategy/MakeWellFormed.php600
-rw-r--r--library/HTMLPurifier/Token.php100
-rw-r--r--library/HTMLPurifier/URI.php314
-rw-r--r--library/HTMLPurifier/URIScheme/data.php127
-rw-r--r--library/bootstrap/css/bootstrap-grid.css2082
-rw-r--r--library/bootstrap/css/bootstrap-grid.css.map1
-rw-r--r--library/bootstrap/css/bootstrap-grid.min.css1
-rw-r--r--library/bootstrap/css/bootstrap-grid.min.css.map1
-rw-r--r--library/bootstrap/css/bootstrap-reboot.css329
-rw-r--r--library/bootstrap/css/bootstrap-reboot.css.map1
-rw-r--r--library/bootstrap/css/bootstrap-reboot.min.css1
-rw-r--r--library/bootstrap/css/bootstrap-reboot.min.css.map1
-rw-r--r--library/bootstrap/css/bootstrap-theme.css587
-rw-r--r--library/bootstrap/css/bootstrap-theme.css.map1
-rw-r--r--library/bootstrap/css/bootstrap-theme.min.css6
-rw-r--r--library/bootstrap/css/bootstrap-theme.min.css.map1
-rw-r--r--library/bootstrap/css/bootstrap.css12251
-rw-r--r--library/bootstrap/css/bootstrap.css.map2
-rw-r--r--library/bootstrap/css/bootstrap.min.css8
-rw-r--r--library/bootstrap/css/bootstrap.min.css.map2
-rw-r--r--library/bootstrap/fonts/glyphicons-halflings-regular.eotbin20127 -> 0 bytes
-rw-r--r--library/bootstrap/fonts/glyphicons-halflings-regular.svg288
-rw-r--r--library/bootstrap/fonts/glyphicons-halflings-regular.ttfbin45404 -> 0 bytes
-rw-r--r--library/bootstrap/fonts/glyphicons-halflings-regular.woffbin23424 -> 0 bytes
-rw-r--r--library/bootstrap/fonts/glyphicons-halflings-regular.woff2bin18028 -> 0 bytes
-rw-r--r--library/bootstrap/js/bootstrap.js4810
-rw-r--r--library/bootstrap/js/bootstrap.min.js10
-rw-r--r--library/emoji.json1
-rw-r--r--library/fullcalendar/CHANGELOG.txt21
-rw-r--r--library/fullcalendar/fullcalendar.css6
-rw-r--r--library/fullcalendar/fullcalendar.js1109
-rw-r--r--library/fullcalendar/fullcalendar.min.css6
-rw-r--r--library/fullcalendar/fullcalendar.min.js16
-rw-r--r--library/fullcalendar/fullcalendar.print.css6
-rw-r--r--library/fullcalendar/fullcalendar.print.min.css6
-rw-r--r--library/fullcalendar/gcal.js6
-rw-r--r--library/fullcalendar/gcal.min.js6
-rw-r--r--library/fullcalendar/locale-all.js8
-rw-r--r--library/htmlpurifier-4.6.0-lite/INSTALL374
-rw-r--r--library/htmlpurifier-4.6.0-lite/NEWS1078
-rw-r--r--library/jquery-textcomplete/LICENSE21
-rw-r--r--library/jquery-textcomplete/jquery.textcomplete.js157
-rw-r--r--library/jquery-textcomplete/jquery.textcomplete.min.js4
-rw-r--r--library/jquery-textcomplete/jquery.textcomplete.min.map1
-rw-r--r--library/markdown.php2932
-rw-r--r--library/markdownify/TODO29
-rw-r--r--library/markdownify/example.php51
-rw-r--r--library/markdownify/markdownify.php1197
-rwxr-xr-xlibrary/markdownify/markdownify_cli.php33
-rw-r--r--library/markdownify/markdownify_extra.php489
-rw-r--r--library/markdownify/parsehtml/parsehtml.php618
-rw-r--r--library/simplepie/README.markdown53
-rw-r--r--library/simplepie/compatibility_test/COMPATIBILITY README.txt7
-rw-r--r--library/simplepie/compatibility_test/sp_compatibility_test.php330
-rw-r--r--library/simplepie/create.php178
-rw-r--r--library/simplepie/db.sql38
-rw-r--r--library/simplepie/idn/idna_convert.class.php969
-rw-r--r--library/simplepie/simplepie.inc15150
l---------tests/phpunit-mariadb.xml1
-rw-r--r--tests/phpunit-mysql.xml37
-rw-r--r--tests/phpunit-pgsql.xml34
-rwxr-xr-xtests/travis/gen_apidocs.sh69
-rwxr-xr-xtests/travis/prepare.sh35
-rwxr-xr-xtests/travis/prepare_mysql.sh48
-rwxr-xr-xtests/travis/prepare_pgsql.sh44
-rw-r--r--tests/unit/Access/AccessListTest.php189
-rw-r--r--tests/unit/Lib/PermissionDescriptionTest.php131
-rw-r--r--tests/unit/TextTest.php33
-rw-r--r--tests/unit/includes/FeedutilsText.php55
-rw-r--r--tests/unit/includes/TextTest.php84
-rw-r--r--tests/unit/template_test.php6
-rw-r--r--util/Doxyfile12
-rw-r--r--util/Doxygen_phpvarfilter.php18
-rw-r--r--util/db_update.php3
-rwxr-xr-xutil/fresh2
-rw-r--r--util/hmessages.po13503
-rw-r--r--util/typo.php25
-rw-r--r--vendor/autoload.php2
-rw-r--r--vendor/bshaffer/oauth2-server-php/CHANGELOG.md182
-rw-r--r--vendor/bshaffer/oauth2-server-php/LICENSE21
-rw-r--r--vendor/bshaffer/oauth2-server-php/README.md8
-rw-r--r--vendor/bshaffer/oauth2-server-php/composer.json34
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Autoloader.php48
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/ClientAssertionType/ClientAssertionTypeInterface.php15
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/ClientAssertionType/HttpBasic.php123
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Controller/AuthorizeController.php393
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Controller/AuthorizeControllerInterface.php43
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Controller/ResourceController.php111
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Controller/ResourceControllerInterface.php26
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Controller/TokenController.php295
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Controller/TokenControllerInterface.php32
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Encryption/EncryptionInterface.php11
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Encryption/FirebaseJwt.php47
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Encryption/Jwt.php173
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/GrantType/AuthorizationCode.php100
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/GrantType/ClientCredentials.php67
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/GrantType/GrantTypeInterface.php20
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/GrantType/JwtBearer.php226
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/GrantType/RefreshToken.php111
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/GrantType/UserCredentials.php83
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Controller/AuthorizeController.php106
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Controller/AuthorizeControllerInterface.php10
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Controller/UserInfoController.php58
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Controller/UserInfoControllerInterface.php23
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/GrantType/AuthorizationCode.php33
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/AuthorizationCode.php60
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/AuthorizationCodeInterface.php27
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/CodeIdToken.php24
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/CodeIdTokenInterface.php9
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/IdToken.php124
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/IdTokenInterface.php29
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/IdTokenToken.php27
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/IdTokenTokenInterface.php9
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Storage/AuthorizationCodeInterface.php37
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Storage/UserClaimsInterface.php38
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Request.php213
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/RequestInterface.php16
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Response.php369
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/ResponseInterface.php24
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/AccessToken.php194
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/AccessTokenInterface.php34
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/AuthorizationCode.php100
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/AuthorizationCodeInterface.php30
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/JwtAccessToken.php124
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/ResponseTypeInterface.php8
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Scope.php103
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/ScopeInterface.php40
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Server.php879
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/AccessTokenInterface.php64
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/AuthorizationCodeInterface.php86
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/Cassandra.php480
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/ClientCredentialsInterface.php49
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/ClientInterface.php66
-rwxr-xr-xvendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/CouchbaseDB.php331
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/DynamoDB.php540
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/JwtAccessToken.php88
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/JwtAccessTokenInterface.php14
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/JwtBearerInterface.php74
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/Memory.php381
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/Mongo.php392
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/MongoDB.php380
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/Pdo.php553
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/PublicKeyInterface.php16
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/Redis.php321
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/RefreshTokenInterface.php82
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/ScopeInterface.php46
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/UserCredentialsInterface.php52
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/TokenType/Bearer.php130
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/TokenType/Mac.php22
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/TokenType/TokenTypeInterface.php21
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/AutoloadTest.php16
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/Controller/AuthorizeControllerTest.php492
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/Controller/ResourceControllerTest.php176
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/Controller/TokenControllerTest.php289
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/Encryption/FirebaseJwtTest.php102
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/Encryption/JwtTest.php102
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/GrantType/AuthorizationCodeTest.php223
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/GrantType/ClientCredentialsTest.php159
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/GrantType/ImplicitTest.php143
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/GrantType/JwtBearerTest.php360
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/GrantType/RefreshTokenTest.php204
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/GrantType/UserCredentialsTest.php172
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/Controller/AuthorizeControllerTest.php182
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/Controller/UserInfoControllerTest.php44
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/GrantType/AuthorizationCodeTest.php57
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/ResponseType/CodeIdTokenTest.php182
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/ResponseType/IdTokenTest.php184
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/ResponseType/IdTokenTokenTest.php91
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/Storage/AuthorizationCodeTest.php95
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/Storage/UserClaimsTest.php41
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/RequestTest.php98
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/ResponseTest.php17
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/ResponseType/AccessTokenTest.php107
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/ResponseType/JwtAccessTokenTest.php160
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/ScopeTest.php42
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/ServerTest.php684
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/AccessTokenTest.php102
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/AuthorizationCodeTest.php106
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/ClientCredentialsTest.php28
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/ClientTest.php110
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/DynamoDBTest.php40
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/JwtAccessTokenTest.php41
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/JwtBearerTest.php25
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/PdoTest.php39
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/PublicKeyTest.php29
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/RefreshTokenTest.php41
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/ScopeTest.php53
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/UserCredentialsTest.php40
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/TokenType/BearerTest.php58
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/bootstrap.php12
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/cleanup.php15
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/config/keys/id_rsa15
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/config/keys/id_rsa.pub16
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/config/storage.json188
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/lib/OAuth2/Request/TestRequest.php61
-rwxr-xr-xvendor/bshaffer/oauth2-server-php/test/lib/OAuth2/Storage/BaseTest.php36
-rwxr-xr-xvendor/bshaffer/oauth2-server-php/test/lib/OAuth2/Storage/Bootstrap.php967
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/lib/OAuth2/Storage/NullStorage.php32
-rw-r--r--vendor/composer/ClassLoader.php46
-rw-r--r--vendor/composer/LICENSE2
-rw-r--r--vendor/composer/autoload_classmap.php407
-rw-r--r--vendor/composer/autoload_files.php1
-rw-r--r--vendor/composer/autoload_namespaces.php4
-rw-r--r--vendor/composer/autoload_psr4.php2
-rw-r--r--vendor/composer/autoload_real.php2
-rw-r--r--vendor/composer/autoload_static.php458
-rw-r--r--vendor/composer/installed.json297
-rw-r--r--vendor/ezyang/htmlpurifier/CREDITS (renamed from library/htmlpurifier-4.6.0-lite/CREDITS)0
-rw-r--r--vendor/ezyang/htmlpurifier/INSTALL373
-rw-r--r--vendor/ezyang/htmlpurifier/INSTALL.fr.utf860
-rw-r--r--vendor/ezyang/htmlpurifier/LICENSE (renamed from library/htmlpurifier-4.6.0-lite/LICENSE)0
-rw-r--r--vendor/ezyang/htmlpurifier/NEWS1168
-rw-r--r--vendor/ezyang/htmlpurifier/README.md29
-rw-r--r--vendor/ezyang/htmlpurifier/TODO150
-rw-r--r--vendor/ezyang/htmlpurifier/VERSION1
-rw-r--r--vendor/ezyang/htmlpurifier/WHATSNEW12
-rw-r--r--vendor/ezyang/htmlpurifier/WYSIWYG20
-rw-r--r--vendor/ezyang/htmlpurifier/composer.json25
-rw-r--r--vendor/ezyang/htmlpurifier/extras/ConfigDoc/HTMLXSLTProcessor.php91
-rw-r--r--vendor/ezyang/htmlpurifier/extras/FSTools.php164
-rw-r--r--vendor/ezyang/htmlpurifier/extras/FSTools/File.php141
-rw-r--r--vendor/ezyang/htmlpurifier/extras/HTMLPurifierExtras.auto.php11
-rw-r--r--vendor/ezyang/htmlpurifier/extras/HTMLPurifierExtras.autoload.php26
-rw-r--r--vendor/ezyang/htmlpurifier/extras/HTMLPurifierExtras.php31
-rw-r--r--vendor/ezyang/htmlpurifier/extras/README32
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier.auto.php (renamed from library/HTMLPurifier.auto.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier.autoload.php (renamed from library/HTMLPurifier.autoload.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier.composer.php4
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier.func.php (renamed from library/HTMLPurifier.func.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier.includes.php234
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier.kses.php (renamed from library/HTMLPurifier.kses.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier.path.php (renamed from library/HTMLPurifier.path.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier.php292
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier.safe-includes.php228
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Arborize.php71
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrCollections.php148
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef.php144
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS.php136
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/AlphaValue.php (renamed from library/HTMLPurifier/AttrDef/CSS/AlphaValue.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Background.php (renamed from library/HTMLPurifier/AttrDef/CSS/Background.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php (renamed from library/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Border.php (renamed from library/HTMLPurifier/AttrDef/CSS/Border.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Color.php161
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Composite.php (renamed from library/HTMLPurifier/AttrDef/CSS/Composite.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php (renamed from library/HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Filter.php (renamed from library/HTMLPurifier/AttrDef/CSS/Filter.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Font.php (renamed from library/HTMLPurifier/AttrDef/CSS/Font.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/FontFamily.php (renamed from library/HTMLPurifier/AttrDef/CSS/FontFamily.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Ident.php (renamed from library/HTMLPurifier/AttrDef/CSS/Ident.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/ImportantDecorator.php (renamed from library/HTMLPurifier/AttrDef/CSS/ImportantDecorator.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Length.php (renamed from library/HTMLPurifier/AttrDef/CSS/Length.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/ListStyle.php (renamed from library/HTMLPurifier/AttrDef/CSS/ListStyle.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Multiple.php71
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Number.php (renamed from library/HTMLPurifier/AttrDef/CSS/Number.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Percentage.php (renamed from library/HTMLPurifier/AttrDef/CSS/Percentage.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/TextDecoration.php (renamed from library/HTMLPurifier/AttrDef/CSS/TextDecoration.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/URI.php77
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Clone.php (renamed from library/HTMLPurifier/AttrDef/Clone.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Enum.php (renamed from library/HTMLPurifier/AttrDef/Enum.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Bool.php48
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Class.php (renamed from library/HTMLPurifier/AttrDef/HTML/Class.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Color.php (renamed from library/HTMLPurifier/AttrDef/HTML/Color.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/FrameTarget.php (renamed from library/HTMLPurifier/AttrDef/HTML/FrameTarget.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/ID.php113
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Length.php (renamed from library/HTMLPurifier/AttrDef/HTML/Length.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/LinkTypes.php (renamed from library/HTMLPurifier/AttrDef/HTML/LinkTypes.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/MultiLength.php (renamed from library/HTMLPurifier/AttrDef/HTML/MultiLength.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Nmtokens.php (renamed from library/HTMLPurifier/AttrDef/HTML/Nmtokens.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Pixels.php (renamed from library/HTMLPurifier/AttrDef/HTML/Pixels.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Integer.php (renamed from library/HTMLPurifier/AttrDef/Integer.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Lang.php (renamed from library/HTMLPurifier/AttrDef/Lang.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Switch.php (renamed from library/HTMLPurifier/AttrDef/Switch.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Text.php (renamed from library/HTMLPurifier/AttrDef/Text.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI.php (renamed from library/HTMLPurifier/AttrDef/URI.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Email.php (renamed from library/HTMLPurifier/AttrDef/URI/Email.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Email/SimpleCheck.php (renamed from library/HTMLPurifier/AttrDef/URI/Email/SimpleCheck.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Host.php138
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/IPv4.php (renamed from library/HTMLPurifier/AttrDef/URI/IPv4.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/IPv6.php (renamed from library/HTMLPurifier/AttrDef/URI/IPv6.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform.php (renamed from library/HTMLPurifier/AttrTransform.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Background.php (renamed from library/HTMLPurifier/AttrTransform/Background.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/BdoDir.php (renamed from library/HTMLPurifier/AttrTransform/BdoDir.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/BgColor.php (renamed from library/HTMLPurifier/AttrTransform/BgColor.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/BoolToCSS.php (renamed from library/HTMLPurifier/AttrTransform/BoolToCSS.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Border.php (renamed from library/HTMLPurifier/AttrTransform/Border.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/EnumToCSS.php (renamed from library/HTMLPurifier/AttrTransform/EnumToCSS.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ImgRequired.php47
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ImgSpace.php (renamed from library/HTMLPurifier/AttrTransform/ImgSpace.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Input.php (renamed from library/HTMLPurifier/AttrTransform/Input.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Lang.php (renamed from library/HTMLPurifier/AttrTransform/Lang.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Length.php (renamed from library/HTMLPurifier/AttrTransform/Length.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Name.php (renamed from library/HTMLPurifier/AttrTransform/Name.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/NameSync.php (renamed from library/HTMLPurifier/AttrTransform/NameSync.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Nofollow.php (renamed from library/HTMLPurifier/AttrTransform/Nofollow.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeEmbed.php (renamed from library/HTMLPurifier/AttrTransform/SafeEmbed.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeObject.php (renamed from library/HTMLPurifier/AttrTransform/SafeObject.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeParam.php (renamed from library/HTMLPurifier/AttrTransform/SafeParam.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ScriptRequired.php (renamed from library/HTMLPurifier/AttrTransform/ScriptRequired.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/TargetBlank.php (renamed from library/HTMLPurifier/AttrTransform/TargetBlank.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/TargetNoopener.php37
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/TargetNoreferrer.php37
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Textarea.php (renamed from library/HTMLPurifier/AttrTransform/Textarea.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTypes.php (renamed from library/HTMLPurifier/AttrTypes.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrValidator.php (renamed from library/HTMLPurifier/AttrValidator.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Bootstrap.php (renamed from library/HTMLPurifier/Bootstrap.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/CSSDefinition.php491
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef.php (renamed from library/HTMLPurifier/ChildDef.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Chameleon.php (renamed from library/HTMLPurifier/ChildDef/Chameleon.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Custom.php (renamed from library/HTMLPurifier/ChildDef/Custom.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Empty.php (renamed from library/HTMLPurifier/ChildDef/Empty.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/List.php92
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Optional.php (renamed from library/HTMLPurifier/ChildDef/Optional.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Required.php (renamed from library/HTMLPurifier/ChildDef/Required.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/StrictBlockquote.php (renamed from library/HTMLPurifier/ChildDef/StrictBlockquote.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Table.php224
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Config.php920
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema.php (renamed from library/HTMLPurifier/ConfigSchema.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Builder/ConfigSchema.php (renamed from library/HTMLPurifier/ConfigSchema/Builder/ConfigSchema.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Builder/Xml.php (renamed from library/HTMLPurifier/ConfigSchema/Builder/Xml.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Exception.php (renamed from library/HTMLPurifier/ConfigSchema/Exception.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange.php (renamed from library/HTMLPurifier/ConfigSchema/Interchange.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange/Directive.php (renamed from library/HTMLPurifier/ConfigSchema/Interchange/Directive.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange/Id.php (renamed from library/HTMLPurifier/ConfigSchema/Interchange/Id.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/InterchangeBuilder.php (renamed from library/HTMLPurifier/ConfigSchema/InterchangeBuilder.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Validator.php (renamed from library/HTMLPurifier/ConfigSchema/Validator.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/ValidatorAtom.php (renamed from library/HTMLPurifier/ConfigSchema/ValidatorAtom.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema.serbin0 -> 15923 bytes
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedClasses.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedClasses.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedFrameTargets.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedFrameTargets.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRel.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRel.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRev.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRev.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.ClassUseCDATA.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Attr.ClassUseCDATA.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultImageAlt.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultImageAlt.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImage.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImage.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImageAlt.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImageAlt.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultTextDir.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultTextDir.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.EnableID.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Attr.EnableID.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.ForbiddenClasses.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Attr.ForbiddenClasses.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.ID.HTML5.txt10
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklist.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklist.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklistRegexp.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklistRegexp.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefix.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefix.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefixLocal.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefixLocal.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.AutoParagraph.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/AutoFormat.AutoParagraph.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.Custom.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/AutoFormat.Custom.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.DisplayLinkURI.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/AutoFormat.DisplayLinkURI.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.Linkify.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/AutoFormat.Linkify.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.DocURL.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.DocURL.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.Predicate.txt14
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveSpansWithoutAttributes.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveSpansWithoutAttributes.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowDuplicates.txt11
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowImportant.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/CSS.AllowImportant.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowTricky.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/CSS.AllowTricky.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowedFonts.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/CSS.AllowedFonts.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowedProperties.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/CSS.AllowedProperties.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.DefinitionRev.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/CSS.DefinitionRev.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.ForbiddenProperties.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/CSS.ForbiddenProperties.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.MaxImgLength.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/CSS.MaxImgLength.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.Proprietary.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/CSS.Proprietary.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.Trusted.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/CSS.Trusted.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Cache.DefinitionImpl.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Cache.DefinitionImpl.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPath.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPath.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPermissions.txt16
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyFixLt.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyFixLt.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyRemoveScript.txt16
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.AllowHostnameUnderscore.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Core.AllowHostnameUnderscore.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.CollectErrors.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Core.CollectErrors.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.ColorKeywords.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Core.ColorKeywords.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.ConvertDocumentToFragment.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Core.ConvertDocumentToFragment.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.DirectLexLineNumberSyncInterval.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Core.DirectLexLineNumberSyncInterval.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.DisableExcludes.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Core.DisableExcludes.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EnableIDNA.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Core.EnableIDNA.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.Encoding.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Core.Encoding.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidChildren.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidChildren.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidTags.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidTags.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeNonASCIICharacters.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Core.EscapeNonASCIICharacters.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.HiddenElements.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Core.HiddenElements.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.Language.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Core.Language.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.LegacyEntityDecoder.txt36
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.LexerImpl.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Core.LexerImpl.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.MaintainLineNumbers.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Core.MaintainLineNumbers.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.NormalizeNewlines.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Core.NormalizeNewlines.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveInvalidImg.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Core.RemoveInvalidImg.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveProcessingInstructions.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Core.RemoveProcessingInstructions.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveScriptContents.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Core.RemoveScriptContents.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.Custom.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Filter.Custom.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Escaping.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Escaping.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Scope.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Scope.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.TidyImpl.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.TidyImpl.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.YouTube.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Filter.YouTube.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Allowed.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/HTML.Allowed.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedAttributes.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedAttributes.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedComments.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedComments.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedCommentsRegexp.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedCommentsRegexp.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedElements.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedElements.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedModules.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedModules.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Attr.Name.UseCDATA.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/HTML.Attr.Name.UseCDATA.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.BlockWrapper.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/HTML.BlockWrapper.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.CoreModules.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/HTML.CoreModules.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.CustomDoctype.txt9
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionID.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionID.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionRev.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionRev.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Doctype.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/HTML.Doctype.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.FlashAllowFullScreen.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/HTML.FlashAllowFullScreen.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenAttributes.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenAttributes.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenElements.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenElements.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.MaxImgLength.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/HTML.MaxImgLength.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Nofollow.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/HTML.Nofollow.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Parent.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/HTML.Parent.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Proprietary.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/HTML.Proprietary.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeEmbed.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/HTML.SafeEmbed.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeIframe.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/HTML.SafeIframe.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeObject.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/HTML.SafeObject.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeScripting.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/HTML.SafeScripting.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Strict.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/HTML.Strict.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TargetBlank.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/HTML.TargetBlank.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TargetNoopener.txt10
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TargetNoreferrer.txt9
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyAdd.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/HTML.TidyAdd.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyLevel.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/HTML.TidyLevel.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyRemove.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/HTML.TidyRemove.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Trusted.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/HTML.Trusted.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.XHTML.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/HTML.XHTML.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.CommentScriptContents.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Output.CommentScriptContents.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.FixInnerHTML.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Output.FixInnerHTML.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.FlashCompat.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Output.FlashCompat.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.Newline.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Output.Newline.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.SortAttr.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Output.SortAttr.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.TidyFormat.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Output.TidyFormat.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Test.ForceNoIconv.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Test.ForceNoIconv.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.AllowedSchemes.txt18
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Base.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/URI.Base.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefaultScheme.txt15
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionID.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionID.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionRev.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionRev.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Disable.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/URI.Disable.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternal.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternal.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternalResources.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternalResources.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DisableResources.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/URI.DisableResources.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Host.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/URI.Host.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.HostBlacklist.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/URI.HostBlacklist.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.MakeAbsolute.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/URI.MakeAbsolute.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Munge.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/URI.Munge.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.MungeResources.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/URI.MungeResources.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.MungeSecretKey.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/URI.MungeSecretKey.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.OverrideAllowedSchemes.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/URI.OverrideAllowedSchemes.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.SafeIframeRegexp.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/URI.SafeIframeRegexp.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/info.ini (renamed from library/HTMLPurifier/ConfigSchema/schema/info.ini)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ContentSets.php (renamed from library/HTMLPurifier/ContentSets.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Context.php (renamed from library/HTMLPurifier/Context.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Definition.php (renamed from library/HTMLPurifier/Definition.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache.php129
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator.php (renamed from library/HTMLPurifier/DefinitionCache/Decorator.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php (renamed from library/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Memory.php (renamed from library/HTMLPurifier/DefinitionCache/Decorator/Memory.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Template.php.in (renamed from library/HTMLPurifier/DefinitionCache/Decorator/Template.php.in)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Null.php (renamed from library/HTMLPurifier/DefinitionCache/Null.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Serializer.php306
-rwxr-xr-x[-rw-r--r--]vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Serializer/README (renamed from library/HTMLPurifier/DefinitionCache/Serializer/README)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCacheFactory.php (renamed from library/HTMLPurifier/DefinitionCacheFactory.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Doctype.php (renamed from library/HTMLPurifier/Doctype.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/DoctypeRegistry.php (renamed from library/HTMLPurifier/DoctypeRegistry.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ElementDef.php (renamed from library/HTMLPurifier/ElementDef.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Encoder.php617
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/EntityLookup.php (renamed from library/HTMLPurifier/EntityLookup.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/EntityLookup/entities.ser (renamed from library/HTMLPurifier/EntityLookup/entities.ser)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/EntityParser.php285
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ErrorCollector.php (renamed from library/HTMLPurifier/ErrorCollector.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ErrorStruct.php (renamed from library/HTMLPurifier/ErrorStruct.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Exception.php (renamed from library/HTMLPurifier/Exception.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Filter.php (renamed from library/HTMLPurifier/Filter.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Filter/ExtractStyleBlocks.php341
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Filter/YouTube.php65
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Generator.php (renamed from library/HTMLPurifier/Generator.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLDefinition.php (renamed from library/HTMLPurifier/HTMLDefinition.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule.php (renamed from library/HTMLPurifier/HTMLModule.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Bdo.php (renamed from library/HTMLPurifier/HTMLModule/Bdo.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/CommonAttributes.php (renamed from library/HTMLPurifier/HTMLModule/CommonAttributes.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Edit.php (renamed from library/HTMLPurifier/HTMLModule/Edit.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Forms.php (renamed from library/HTMLPurifier/HTMLModule/Forms.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Hypertext.php (renamed from library/HTMLPurifier/HTMLModule/Hypertext.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Iframe.php (renamed from library/HTMLPurifier/HTMLModule/Iframe.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Image.php (renamed from library/HTMLPurifier/HTMLModule/Image.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Legacy.php (renamed from library/HTMLPurifier/HTMLModule/Legacy.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/List.php (renamed from library/HTMLPurifier/HTMLModule/List.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Name.php (renamed from library/HTMLPurifier/HTMLModule/Name.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Nofollow.php (renamed from library/HTMLPurifier/HTMLModule/Nofollow.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php (renamed from library/HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Object.php (renamed from library/HTMLPurifier/HTMLModule/Object.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Presentation.php (renamed from library/HTMLPurifier/HTMLModule/Presentation.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Proprietary.php (renamed from library/HTMLPurifier/HTMLModule/Proprietary.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Ruby.php (renamed from library/HTMLPurifier/HTMLModule/Ruby.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeEmbed.php (renamed from library/HTMLPurifier/HTMLModule/SafeEmbed.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeObject.php (renamed from library/HTMLPurifier/HTMLModule/SafeObject.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeScripting.php (renamed from library/HTMLPurifier/HTMLModule/SafeScripting.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Scripting.php (renamed from library/HTMLPurifier/HTMLModule/Scripting.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/StyleAttribute.php (renamed from library/HTMLPurifier/HTMLModule/StyleAttribute.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tables.php (renamed from library/HTMLPurifier/HTMLModule/Tables.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Target.php (renamed from library/HTMLPurifier/HTMLModule/Target.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/TargetBlank.php (renamed from library/HTMLPurifier/HTMLModule/TargetBlank.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/TargetNoopener.php21
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/TargetNoreferrer.php21
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Text.php (renamed from library/HTMLPurifier/HTMLModule/Text.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy.php (renamed from library/HTMLPurifier/HTMLModule/Tidy.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Name.php (renamed from library/HTMLPurifier/HTMLModule/Tidy/Name.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Proprietary.php (renamed from library/HTMLPurifier/HTMLModule/Tidy/Proprietary.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Strict.php (renamed from library/HTMLPurifier/HTMLModule/Tidy/Strict.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Transitional.php (renamed from library/HTMLPurifier/HTMLModule/Tidy/Transitional.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/XHTML.php (renamed from library/HTMLPurifier/HTMLModule/Tidy/XHTML.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/XHTMLAndHTML4.php (renamed from library/HTMLPurifier/HTMLModule/Tidy/XHTMLAndHTML4.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/XMLCommonAttributes.php (renamed from library/HTMLPurifier/HTMLModule/XMLCommonAttributes.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModuleManager.php467
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/IDAccumulator.php (renamed from library/HTMLPurifier/IDAccumulator.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector.php (renamed from library/HTMLPurifier/Injector.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/AutoParagraph.php (renamed from library/HTMLPurifier/Injector/AutoParagraph.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/DisplayLinkURI.php (renamed from library/HTMLPurifier/Injector/DisplayLinkURI.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/Linkify.php64
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/PurifierLinkify.php (renamed from library/HTMLPurifier/Injector/PurifierLinkify.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/RemoveEmpty.php112
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/RemoveSpansWithoutAttributes.php (renamed from library/HTMLPurifier/Injector/RemoveSpansWithoutAttributes.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/SafeObject.php124
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Language.php (renamed from library/HTMLPurifier/Language.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Language/classes/en-x-test.php (renamed from library/HTMLPurifier/Language/classes/en-x-test.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Language/messages/en-x-test.php (renamed from library/HTMLPurifier/Language/messages/en-x-test.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Language/messages/en-x-testmini.php (renamed from library/HTMLPurifier/Language/messages/en-x-testmini.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Language/messages/en.php (renamed from library/HTMLPurifier/Language/messages/en.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/LanguageFactory.php (renamed from library/HTMLPurifier/LanguageFactory.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Length.php (renamed from library/HTMLPurifier/Length.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer.php382
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/DOMLex.php291
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/DirectLex.php539
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/PH5P.php4788
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Node.php (renamed from library/HTMLPurifier/Node.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Node/Comment.php (renamed from library/HTMLPurifier/Node/Comment.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Node/Element.php (renamed from library/HTMLPurifier/Node/Element.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Node/Text.php (renamed from library/HTMLPurifier/Node/Text.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/PercentEncoder.php (renamed from library/HTMLPurifier/PercentEncoder.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer.php (renamed from library/HTMLPurifier/Printer.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/CSSDefinition.php (renamed from library/HTMLPurifier/Printer/CSSDefinition.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.css (renamed from library/HTMLPurifier/Printer/ConfigForm.css)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.js (renamed from library/HTMLPurifier/Printer/ConfigForm.js)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.php451
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/HTMLDefinition.php (renamed from library/HTMLPurifier/Printer/HTMLDefinition.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/PropertyList.php (renamed from library/HTMLPurifier/PropertyList.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/PropertyListIterator.php (renamed from library/HTMLPurifier/PropertyListIterator.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Queue.php (renamed from library/HTMLPurifier/Queue.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy.php (renamed from library/HTMLPurifier/Strategy.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/Composite.php (renamed from library/HTMLPurifier/Strategy/Composite.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/Core.php (renamed from library/HTMLPurifier/Strategy/Core.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/FixNesting.php (renamed from library/HTMLPurifier/Strategy/FixNesting.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/MakeWellFormed.php659
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/RemoveForeignElements.php (renamed from library/HTMLPurifier/Strategy/RemoveForeignElements.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/ValidateAttributes.php (renamed from library/HTMLPurifier/Strategy/ValidateAttributes.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/StringHash.php (renamed from library/HTMLPurifier/StringHash.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/StringHashParser.php (renamed from library/HTMLPurifier/StringHashParser.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/TagTransform.php (renamed from library/HTMLPurifier/TagTransform.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/TagTransform/Font.php (renamed from library/HTMLPurifier/TagTransform/Font.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/TagTransform/Simple.php (renamed from library/HTMLPurifier/TagTransform/Simple.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token.php100
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/Comment.php (renamed from library/HTMLPurifier/Token/Comment.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/Empty.php (renamed from library/HTMLPurifier/Token/Empty.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/End.php (renamed from library/HTMLPurifier/Token/End.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/Start.php (renamed from library/HTMLPurifier/Token/Start.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/Tag.php (renamed from library/HTMLPurifier/Token/Tag.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/Text.php (renamed from library/HTMLPurifier/Token/Text.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/TokenFactory.php (renamed from library/HTMLPurifier/TokenFactory.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URI.php316
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIDefinition.php (renamed from library/HTMLPurifier/URIDefinition.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter.php (renamed from library/HTMLPurifier/URIFilter.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/DisableExternal.php (renamed from library/HTMLPurifier/URIFilter/DisableExternal.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/DisableExternalResources.php (renamed from library/HTMLPurifier/URIFilter/DisableExternalResources.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/DisableResources.php (renamed from library/HTMLPurifier/URIFilter/DisableResources.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/HostBlacklist.php (renamed from library/HTMLPurifier/URIFilter/HostBlacklist.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/MakeAbsolute.php (renamed from library/HTMLPurifier/URIFilter/MakeAbsolute.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/Munge.php (renamed from library/HTMLPurifier/URIFilter/Munge.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/SafeIframe.php (renamed from library/HTMLPurifier/URIFilter/SafeIframe.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIParser.php (renamed from library/HTMLPurifier/URIParser.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme.php (renamed from library/HTMLPurifier/URIScheme.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/data.php136
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/file.php (renamed from library/HTMLPurifier/URIScheme/file.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/ftp.php (renamed from library/HTMLPurifier/URIScheme/ftp.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/http.php (renamed from library/HTMLPurifier/URIScheme/http.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/https.php (renamed from library/HTMLPurifier/URIScheme/https.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/mailto.php (renamed from library/HTMLPurifier/URIScheme/mailto.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/news.php (renamed from library/HTMLPurifier/URIScheme/news.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/nntp.php (renamed from library/HTMLPurifier/URIScheme/nntp.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/tel.php46
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URISchemeRegistry.php (renamed from library/HTMLPurifier/URISchemeRegistry.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/UnitConverter.php (renamed from library/HTMLPurifier/UnitConverter.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/VarParser.php (renamed from library/HTMLPurifier/VarParser.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/VarParser/Flexible.php (renamed from library/HTMLPurifier/VarParser/Flexible.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/VarParser/Native.php (renamed from library/HTMLPurifier/VarParser/Native.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/VarParserException.php (renamed from library/HTMLPurifier/VarParserException.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Zipper.php (renamed from library/HTMLPurifier/Zipper.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/maintenance/.htaccess1
-rw-r--r--vendor/ezyang/htmlpurifier/maintenance/PH5P.patch102
-rw-r--r--vendor/ezyang/htmlpurifier/maintenance/PH5P.php3889
-rw-r--r--vendor/ezyang/htmlpurifier/maintenance/add-vimline.php130
-rw-r--r--vendor/ezyang/htmlpurifier/maintenance/common.php25
-rwxr-xr-xvendor/ezyang/htmlpurifier/maintenance/compile-doxygen.sh11
-rw-r--r--vendor/ezyang/htmlpurifier/maintenance/config-scanner.php155
-rwxr-xr-xvendor/ezyang/htmlpurifier/maintenance/flush-definition-cache.php42
-rw-r--r--vendor/ezyang/htmlpurifier/maintenance/flush.php30
-rwxr-xr-xvendor/ezyang/htmlpurifier/maintenance/generate-entity-file.php75
-rw-r--r--vendor/ezyang/htmlpurifier/maintenance/generate-includes.php192
-rw-r--r--vendor/ezyang/htmlpurifier/maintenance/generate-ph5p-patch.php22
-rw-r--r--vendor/ezyang/htmlpurifier/maintenance/generate-schema-cache.php45
-rwxr-xr-xvendor/ezyang/htmlpurifier/maintenance/generate-standalone.php159
-rwxr-xr-xvendor/ezyang/htmlpurifier/maintenance/merge-library.php11
-rw-r--r--vendor/ezyang/htmlpurifier/maintenance/old-extract-schema.php71
-rw-r--r--vendor/ezyang/htmlpurifier/maintenance/old-remove-require-once.php32
-rw-r--r--vendor/ezyang/htmlpurifier/maintenance/old-remove-schema-def.php32
-rwxr-xr-xvendor/ezyang/htmlpurifier/maintenance/regenerate-docs.sh5
-rw-r--r--vendor/ezyang/htmlpurifier/maintenance/remove-trailing-whitespace.php37
-rw-r--r--vendor/ezyang/htmlpurifier/maintenance/rename-config.php84
-rw-r--r--vendor/ezyang/htmlpurifier/maintenance/update-config.php34
-rw-r--r--vendor/ezyang/htmlpurifier/package.php61
-rw-r--r--vendor/ezyang/htmlpurifier/phpdoc.ini102
-rw-r--r--vendor/ezyang/htmlpurifier/plugins/modx.txt112
-rw-r--r--vendor/ezyang/htmlpurifier/plugins/phorum/.gitignore2
-rw-r--r--vendor/ezyang/htmlpurifier/plugins/phorum/Changelog27
-rw-r--r--vendor/ezyang/htmlpurifier/plugins/phorum/INSTALL84
-rw-r--r--vendor/ezyang/htmlpurifier/plugins/phorum/README45
-rw-r--r--vendor/ezyang/htmlpurifier/plugins/phorum/config.default.php57
-rw-r--r--vendor/ezyang/htmlpurifier/plugins/phorum/htmlpurifier.php316
-rw-r--r--vendor/ezyang/htmlpurifier/plugins/phorum/info.txt18
-rw-r--r--vendor/ezyang/htmlpurifier/plugins/phorum/init-config.php30
-rw-r--r--vendor/ezyang/htmlpurifier/plugins/phorum/migrate.bbcode.php31
-rw-r--r--vendor/ezyang/htmlpurifier/plugins/phorum/settings.php64
-rw-r--r--vendor/ezyang/htmlpurifier/plugins/phorum/settings/form.php95
-rw-r--r--vendor/ezyang/htmlpurifier/plugins/phorum/settings/migrate-sigs-form.php22
-rw-r--r--vendor/ezyang/htmlpurifier/plugins/phorum/settings/migrate-sigs.php79
-rw-r--r--vendor/ezyang/htmlpurifier/plugins/phorum/settings/save.php29
-rw-r--r--vendor/ezyang/htmlpurifier/release1-update.php110
-rw-r--r--vendor/ezyang/htmlpurifier/release2-tag.php22
-rw-r--r--vendor/ezyang/htmlpurifier/test-settings.sample.php74
-rw-r--r--vendor/ezyang/htmlpurifier/test-settings.travis.php72
-rw-r--r--vendor/michelf/php-markdown/License.md36
-rw-r--r--vendor/michelf/php-markdown/Michelf/Markdown.inc.php10
-rw-r--r--vendor/michelf/php-markdown/Michelf/Markdown.php1896
-rw-r--r--vendor/michelf/php-markdown/Michelf/MarkdownExtra.inc.php11
-rw-r--r--vendor/michelf/php-markdown/Michelf/MarkdownExtra.php1785
-rw-r--r--vendor/michelf/php-markdown/Michelf/MarkdownInterface.inc.php9
-rw-r--r--vendor/michelf/php-markdown/Michelf/MarkdownInterface.php38
-rw-r--r--vendor/michelf/php-markdown/Readme.md384
-rw-r--r--vendor/michelf/php-markdown/Readme.php31
-rw-r--r--vendor/michelf/php-markdown/composer.json31
-rw-r--r--vendor/pixel418/markdownify/CHANGELOG.md76
-rw-r--r--vendor/pixel418/markdownify/LICENSE (renamed from library/markdownify/LICENSE_LGPL.txt)0
-rw-r--r--vendor/pixel418/markdownify/README.md63
-rw-r--r--vendor/pixel418/markdownify/composer.json38
-rw-r--r--vendor/pixel418/markdownify/src/Converter.php1400
-rw-r--r--vendor/pixel418/markdownify/src/ConverterExtra.php573
-rw-r--r--vendor/pixel418/markdownify/src/Parser.php564
-rw-r--r--vendor/simplepie/simplepie/LICENSE.txt (renamed from library/simplepie/LICENSE.txt)0
-rw-r--r--vendor/simplepie/simplepie/README.markdown113
-rw-r--r--vendor/simplepie/simplepie/autoloader.php85
-rw-r--r--vendor/simplepie/simplepie/composer.json40
-rw-r--r--vendor/simplepie/simplepie/db.sql40
-rw-r--r--vendor/simplepie/simplepie/idn/LICENCE (renamed from library/simplepie/idn/LICENCE)0
-rw-r--r--vendor/simplepie/simplepie/idn/ReadMe.txt (renamed from library/simplepie/idn/ReadMe.txt)0
-rw-r--r--vendor/simplepie/simplepie/idn/idna_convert.class.php969
-rw-r--r--vendor/simplepie/simplepie/idn/npdata.ser (renamed from library/simplepie/idn/npdata.ser)0
-rwxr-xr-xvendor/simplepie/simplepie/library/SimplePie.php3303
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/Author.php156
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/Cache.php134
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/Cache/Base.php113
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/Cache/DB.php136
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/Cache/File.php164
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/Cache/Memcache.php180
-rwxr-xr-xvendor/simplepie/simplepie/library/SimplePie/Cache/Memcached.php166
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/Cache/MySQL.php454
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/Cache/Redis.php166
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/Caption.php209
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/Category.php163
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/Content/Type/Sniffer.php331
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/Copyright.php129
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/Core.php56
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/Credit.php155
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/Decode/HTML/Entities.php615
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/Enclosure.php1379
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/Exception.php51
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/File.php306
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/HTTP/Parser.php499
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/IRI.php1257
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/Item.php3009
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/Locator.php429
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/Misc.php2279
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/Net/IPv6.php275
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/Parse/Date.php983
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/Parser.php656
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/Rating.php128
-rwxr-xr-xvendor/simplepie/simplepie/library/SimplePie/Registry.php224
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/Restriction.php154
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/Sanitize.php591
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/Source.php610
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/XML/Declaration/Parser.php361
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/gzdecode.php370
-rw-r--r--view/css/bootstrap-red.css89
-rw-r--r--view/css/conversation.css130
-rw-r--r--view/css/default.css4
-rw-r--r--view/css/mod_apps.css5
-rw-r--r--view/css/mod_chat.css4
-rw-r--r--view/css/mod_events.css5
-rw-r--r--view/css/mod_help.css8
-rw-r--r--view/css/mod_mail.css31
-rw-r--r--view/css/mod_setup.css6
-rw-r--r--view/css/mod_webpages.css16
-rw-r--r--view/css/mod_wiki.css1
-rw-r--r--view/css/widgets.css63
-rw-r--r--view/de/hmessages.po17472
-rw-r--r--view/de/hstrings.php4145
-rw-r--r--view/es-es/hmessages.po17591
-rw-r--r--view/es-es/hstrings.php4256
-rw-r--r--view/fr/hmessages.po17475
-rw-r--r--view/fr/hstrings.php4164
-rw-r--r--view/js/acl.js20
-rw-r--r--view/js/autocomplete.js18
-rw-r--r--view/js/main.js6
-rw-r--r--view/js/mod_cloud.js2
-rw-r--r--view/js/mod_connedit.js2
-rw-r--r--view/js/mod_network.js1
-rw-r--r--view/js/mod_profiles.js4
-rw-r--r--view/nl/hmessages.po295
-rw-r--r--view/nl/hstrings.php4
-rw-r--r--view/php/default.php4
-rw-r--r--view/php/full.php2
-rw-r--r--view/theme/redbasic/css/narrow_navbar.css62
-rw-r--r--view/theme/redbasic/css/style.css911
-rw-r--r--view/theme/redbasic/js/redbasic.js41
-rw-r--r--view/theme/redbasic/php/config.php39
-rw-r--r--view/theme/redbasic/php/style.php111
-rw-r--r--view/theme/redbasic/php/theme.php4
-rw-r--r--view/theme/redbasic/tpl/theme_settings.tpl17
-rwxr-xr-xview/tpl/abook_edit.tpl61
-rwxr-xr-xview/tpl/acl_selector.tpl34
-rwxr-xr-xview/tpl/admin_accounts.tpl6
-rwxr-xr-xview/tpl/admin_aside.tpl18
-rwxr-xr-xview/tpl/admin_channels.tpl2
-rwxr-xr-xview/tpl/admin_plugins.tpl6
-rw-r--r--view/tpl/admin_profiles.tpl4
-rw-r--r--view/tpl/admin_queue.tpl2
-rwxr-xr-xview/tpl/admin_site.tpl8
-rw-r--r--view/tpl/app.tpl12
-rw-r--r--view/tpl/app_create.tpl4
-rwxr-xr-xview/tpl/atom_feed.tpl17
-rw-r--r--view/tpl/attach_edit.tpl8
-rw-r--r--view/tpl/blocklist.tpl10
-rwxr-xr-xview/tpl/build_query.tpl2
-rwxr-xr-xview/tpl/categories_widget.tpl6
-rwxr-xr-xview/tpl/channel_import.tpl5
-rwxr-xr-xview/tpl/channels.tpl2
-rw-r--r--view/tpl/chat.tpl66
-rw-r--r--view/tpl/chatroom_new.tpl2
-rw-r--r--view/tpl/chatroomlist.tpl6
-rw-r--r--view/tpl/chatrooms.tpl10
-rw-r--r--view/tpl/cloud_actionspanel.tpl6
-rw-r--r--view/tpl/cloud_directory.tpl12
-rw-r--r--view/tpl/cloud_header.tpl6
-rwxr-xr-xview/tpl/comment_item.tpl37
-rwxr-xr-xview/tpl/common_tabs.tpl17
-rwxr-xr-xview/tpl/connection_template.tpl12
-rwxr-xr-xview/tpl/connections.tpl18
-rwxr-xr-xview/tpl/conv_item.tpl165
-rwxr-xr-xview/tpl/conv_list.tpl256
-rwxr-xr-xview/tpl/cover_photo_widget.tpl30
-rw-r--r--view/tpl/design_tools.tpl14
-rwxr-xr-xview/tpl/directory_header.tpl18
-rwxr-xr-xview/tpl/direntry.tpl10
-rw-r--r--view/tpl/dreport.tpl2
-rwxr-xr-xview/tpl/edpost_head.tpl2
-rwxr-xr-xview/tpl/event.tpl6
-rwxr-xr-xview/tpl/event_cal.tpl2
-rwxr-xr-xview/tpl/event_form.tpl60
-rwxr-xr-xview/tpl/event_head.tpl1
-rwxr-xr-xview/tpl/events-js.tpl24
-rwxr-xr-xview/tpl/events_cal-js.tpl10
-rwxr-xr-xview/tpl/events_tools_side.tpl22
-rwxr-xr-xview/tpl/field_checkbox.tpl7
-rwxr-xr-xview/tpl/field_combobox.tpl33
-rwxr-xr-xview/tpl/field_input.tpl9
-rwxr-xr-xview/tpl/field_intcheckbox.tpl9
-rwxr-xr-xview/tpl/field_password.tpl8
-rwxr-xr-xview/tpl/field_select.tpl8
-rwxr-xr-xview/tpl/field_textarea.tpl8
-rwxr-xr-xview/tpl/field_yesno.tpl4
-rwxr-xr-xview/tpl/fileas_widget.tpl6
-rwxr-xr-xview/tpl/filer_dialog.tpl23
-rwxr-xr-xview/tpl/follow.tpl4
-rwxr-xr-xview/tpl/generic_links_widget.tpl4
-rw-r--r--view/tpl/generic_modal.tpl4
-rwxr-xr-xview/tpl/group_drop.tpl2
-rwxr-xr-xview/tpl/group_side.tpl14
-rw-r--r--view/tpl/hdr.tpl8
-rw-r--r--view/tpl/help.tpl4
-rw-r--r--view/tpl/item_attach.tpl2
-rw-r--r--view/tpl/item_categories.tpl6
-rw-r--r--view/tpl/item_filer.tpl6
-rwxr-xr-xview/tpl/item_import.tpl4
-rwxr-xr-xview/tpl/jot-header.tpl42
-rwxr-xr-xview/tpl/jot.tpl113
-rw-r--r--view/tpl/layoutlist.tpl12
-rwxr-xr-xview/tpl/like_noshare.tpl4
-rw-r--r--view/tpl/locmanage.tpl6
-rwxr-xr-xview/tpl/mail_conv.tpl57
-rwxr-xr-xview/tpl/mail_display.tpl6
-rwxr-xr-xview/tpl/mail_head.tpl2
-rwxr-xr-xview/tpl/mail_list.tpl4
-rw-r--r--view/tpl/menuedit.tpl2
-rw-r--r--view/tpl/menulist.tpl10
-rwxr-xr-xview/tpl/message_side.tpl10
-rw-r--r--view/tpl/mitemedit.tpl2
-rw-r--r--view/tpl/mitemlist.tpl4
-rwxr-xr-xview/tpl/myapps.tpl9
-rwxr-xr-xview/tpl/nav.tpl437
-rw-r--r--view/tpl/nav_login.tpl2
-rwxr-xr-xview/tpl/notifications.tpl20
-rwxr-xr-xview/tpl/notify.tpl4
-rw-r--r--view/tpl/nwiki_page_history.tpl10
-rw-r--r--view/tpl/page_display_empty.tpl1
-rwxr-xr-xview/tpl/peoplefind.tpl14
-rwxr-xr-xview/tpl/photo_album.tpl6
-rwxr-xr-xview/tpl/photo_albums.tpl8
-rwxr-xr-xview/tpl/photo_drop.tpl2
-rwxr-xr-xview/tpl/photo_view.tpl40
-rwxr-xr-xview/tpl/photos_recent.tpl2
-rwxr-xr-xview/tpl/photos_upload.tpl4
-rwxr-xr-xview/tpl/posted_date_widget.tpl20
-rwxr-xr-xview/tpl/profile_advanced.tpl52
-rwxr-xr-xview/tpl/profile_edit.tpl181
-rwxr-xr-xview/tpl/profile_listing_header.tpl2
-rw-r--r--view/tpl/profile_tabs.tpl5
-rwxr-xr-xview/tpl/prv_message.tpl54
-rw-r--r--view/tpl/saved_searches.tpl12
-rwxr-xr-xview/tpl/search_item.tpl66
-rw-r--r--view/tpl/searchbox.tpl6
-rwxr-xr-xview/tpl/settings.tpl22
-rwxr-xr-xview/tpl/settings_account.tpl2
-rwxr-xr-xview/tpl/settings_display.tpl8
-rwxr-xr-xview/tpl/settings_features.tpl2
-rwxr-xr-xview/tpl/settings_oauth.tpl4
-rw-r--r--view/tpl/sharedwithme.tpl10
-rw-r--r--view/tpl/show_thing.tpl4
-rwxr-xr-xview/tpl/suggest_friends.tpl4
-rw-r--r--view/tpl/thing_edit.tpl2
-rw-r--r--view/tpl/thing_input.tpl2
-rw-r--r--view/tpl/usermenu.tpl6
-rwxr-xr-xview/tpl/viewcontact_template.tpl22
-rw-r--r--view/tpl/webpage_export_list.tpl2
-rw-r--r--view/tpl/webpage_import.tpl2
-rw-r--r--view/tpl/webpagelist.tpl12
-rw-r--r--view/tpl/website_portation_tools.tpl128
-rw-r--r--view/tpl/wiki.tpl66
-rw-r--r--view/tpl/wiki_page_history.tpl4
-rw-r--r--view/tpl/wiki_page_list.tpl10
-rw-r--r--view/tpl/wikilist.tpl8
-rw-r--r--view/tpl/wikilist_widget.tpl4
2904 files changed, 133625 insertions, 93439 deletions
diff --git a/.gitignore b/.gitignore
index 75be5b0c2..050902f17 100755
--- a/.gitignore
+++ b/.gitignore
@@ -44,7 +44,8 @@ doc/html/
.zotshrc
# external repositories for themes/addons
extend/
-
+# files generated by phpunit
+tests/results/
## exclude IDE files
# config files and folders from Eclipse
@@ -63,6 +64,8 @@ nbproject/
## composer
# locally installed composer binary
composer.phar
+# allow composer.lock, as it is required to have a common state
+!composer.lock
# vendor/ is managed by composer, no need to include in our repository
# requires new deployment and needs discussion first
#vendor/
diff --git a/.travis.yml b/.travis.yml
index 2830d1b9f..53a0f73f7 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,44 +1,156 @@
+#
+# Travis-CI configuration file for Hubzilla
+#
+## configure things
+#
+
# see http://about.travis-ci.org/docs/user/languages/php/ for more hints
language: php
-# list any PHP version you want to test against
-php:
- # using major version aliases
+# use newer 'trusty' based distro, old one is 'precise'
+dist: trusty
+# use docker based containers
+sudo: false
+
+# Git branches whitelist to build on Travis CI
+branches:
+ only:
+ - master
+ - dev
+ # whitelist our tags for release deployments e.g. 2.2
+ - /^\d+\.\d+(\.\d+)?(-\S*)?$/
- # aliased to a recent 5.6.x version
- - 5.6
- # aliased to a recent 7.x version
- - 7.0
- # aliased to a recent hhvm version
- - hhvm
+# Install additional software
+addons:
+ # Install dependencies for generating API documentation with doxygen
+ apt:
+ packages:
+ - doxygen
+ - doxygen-latex
+ - graphviz
+ - ttf-liberation
-# optionally specify a list of environments, for example to test different RDBMS
-#env:
-# - DB=mysql
-# - DB=pgsql
+# enable and start databases on a per job basis
+#services:
+# - mariadb
+# - postgresql
+
+# any PHP version we want to test against, current stable phpunit requires PHP >= 7.0
+php:
+ - '7.0'
+ - '7.1'
+ # HHVM does not fulfil PHPUnit platform requirements as being compatible with PHP7 yet
+ #- 'hhvm'
-# optionally set up exclutions and allowed failures in the matrix
+# list of environments to test
+env:
+ global:
+ # used for doxygen deployment script
+ - DOXYFILE: $TRAVIS_BUILD_DIR/util/Doxyfile
+ # Uncomment if a newer/specific version of Doxygen should be used
+ #- DOXY_VER: 1.8.12
+ # Code Coverage is slow, no need to have it in every build
+ - PHPUCOV: "--no-coverage"
+ # use matrix only for PHP and MySQL, all other combinations added through includes
+ matrix:
+ # trusty default MySQL 5.6
+ - DB=mysql MYSQL_VERSION=5.6
+
+# Matrix configuration details
matrix:
+ fast_finish: true
+ # Additional check combinations
+ include:
+ # PHP7.1, mariadb 10.1
+ - php: '7.1'
+ env: DB=mariadb MARIADB_VERSION=10.1 CODECOV=1
+ # use mariadb instead of MySQL
+ addons:
+ mariadb: '10.1'
+ # PHP7.1, PostgreSQL 9.6
+ - php: '7.1'
+ env: DB=pgsql POSTGRESQL_VERSION=9.6
+ # Use newer postgres than 9.2 default
+ addons:
+ postgresql: '9.6'
+ services:
+ - postgresql
+ # PHP7.1, old precise distribution with MySQL 5.5
+ - php: '7.1'
+ env: DB=mysql MYSQL_VERSION=5.5
+ dist: precise
+ services:
+ - mysql
+ # Excludes from default matrix combinations
# exclude:
# - php: hhvm
# env: DB=pgsql # PDO driver for pgsql is unsupported by HHVM (3rd party install for support)
- allow_failures:
- - php: hhvm
-# execute any number of scripts before the test run, custom env's are available as variables
-#before_script:
-# - if [[ "$DB" == "pgsql" ]]; then psql -c "DROP DATABASE IF EXISTS hello_world_test;" -U postgres; fi
-# - if [[ "$DB" == "pgsql" ]]; then psql -c "create database hello_world_test;" -U postgres; fi
-# - if [[ "$DB" == "mysql" ]]; then mysql -e "create database IF NOT EXISTS hello_world_test;" -uroot; fi
+# cache composer downloads between runs
+cache:
+ directories:
+ - $HOME/.composer/cache
+ #- $HOME/doxygen/doxygen-$DOXY_VER/bin
+
+
+#
+## execute things
+#
+
+before_install:
+ - travis_retry composer self-update
+
+# Install composer dev libs
install:
- - composer require phpunit/phpunit
+ - travis_retry composer install --optimize-autoloader --no-progress
+
+# execute any number of scripts before the test run, custom env's are available as variables
+before_script:
+ # Use code coverage config for phpunit
+ - if [[ ! -z $CODECOV ]]; then export PHPUCOV=""; fi
+ # Some preparation tasks of environment
+ - ./tests/travis/prepare.sh
+ # DB specific prepare scripts
+ - if [[ "$DB" == "mysql" ]]; then ./tests/travis/prepare_mysql.sh; fi
+ - if [[ "$DB" == "mariadb" ]]; then ./tests/travis/prepare_mysql.sh; fi
+ - if [[ "$DB" == "pgsql" ]]; then ./tests/travis/prepare_pgsql.sh; fi
# omitting "script:" will default to phpunit
-# use the $DB env variable to determine the phpunit.xml to use
-script: vendor/bin/phpunit tests/unit/
+script: ./vendor/bin/phpunit $PHPUCOV -c tests/phpunit-$DB.xml
+
+after_success:
+ # Generate API documentation and deploy it to gh-pages
+ - ./tests/travis/gen_apidocs.sh
+#after_failure:
+
+# Deploying release and API documentation to GitHub
+#before_deploy:
+deploy:
+ - provider: pages
+ skip_cleanup: true
+ local_dir: $TRAVIS_BUILD_DIR/doc/html
+ github_token: $GH_TOKEN
+ on:
+ repo: redmatrix/hubzilla
+ branch: master
+ condition: '(-n "$GH_TOKEN") && ("$TRAVIS_JOB_NUMBER" == "${TRAVIS_BUILD_NUMBER}.1")'
+ # add API documentation to release, could also be used to provide full packages if we want to drop vendor from our repo
+ - provider: releases
+ skip_cleanup: true
+ api_key: $GH_TOKEN
+ file: 'doc/hubzilla-api-documentation.zip'
+ on:
+ repo: redmatrix/hubzilla
+ tags: true
+ condition: '(-n "$GH_TOKEN") && ("$TRAVIS_JOB_NUMBER" == "${TRAVIS_BUILD_NUMBER}.1")'
+#after_deploy:
+
+#after_script:
+
+
# configure notifications (email, IRC, campfire etc)
-notifications:
+#notifications:
# irc: "irc.freenode.org#yourfavouriteroomfortravis"
# a plugin/script to post to a hubzilla channel would be neat here
diff --git a/CHANGELOG b/CHANGELOG
index eb7a41c42..0a2024c9d 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,5 +1,82 @@
+Hubzilla 2.4 (2017-05-31)
+ - Silence php warning during install
+ - Implemented switch statement logic in Comanche layout parser
+ - Don't allow html in plugin comment blocks
+ - Handle Mastodon urls in markdown/bbcode conversion
+ - Get rid of edit activities
+ - Collapse sysapps if viewing a remote channel
+ - Various Doxygen fixes
+ - Update SimplePie library to version 1.5
+ - Add check for PHP zip extension during install
+ - Add unit tests for AccessList class
+ - Authenticate onepoll so we can receive private posts/comments in zotfeed
+ - Various postgres fixes
+ - Some work on preparing clientside e2ee
+ - Allow to set a default channel for the rare case where a default channel is not selected but channels actually exist
+ - Support reverse magic-auth in oembed requests
+ - Improved handling of Mastodon feeds
+ - When template "none" is used in a webpage layout, then the contents of the page should be the sole output, with no other code before or after the page element content
+ - If there is no site record, site_dead won't be 0, in a left join it will in fact be null. As long as it isn't 1, we should attempt delivery
+ - Order wiki pages by creation date
+ - Backend infrastructure for channel protection password; which will be used to optionally encrypt export files and resolve channel/identity ownership/hijacking disputes
+ - Don't allow any null fields in notify creation
+ - Webfinger cleanup
+ - Envelope privacy
+ - We do not parse the body in discover_by_url(), so no need to preserve iframes in SimplePie
+ - Correct the mastodon "boost" (aka 'share') author attribution by checking for share activities and pulling the original author info from the activity:object
+ - Only log zot_refresh content if json decode was successful
+ - Revisit the import_author_zot algorithm yet again. There was one bug that we weren't returning necessary information in the first SQL query - and performance/loading problem if one tries to refresh a dead site
+ - Import_author_xchan - since we rarely refresh zot-info for non-connections, force a cache reload once a week to catch things like profile photo updates and location changes
+ - Create site_store_lowlevel() to initialise data structures for the site table
+ - Change hook for perm_is_allowed while retaining backwards compatibility
+ - import_author_zot() - check for both hubloc and xchan entries. This should catch and repair entries which were subject to transient storage failures
+ - Import authors from any unrecognised network as network 'unknown'
+ - Crypto update - default is now aes-256-ctr
+ - Get rid of get_app()
+ - Add 'author_is_pmable()' function with plugin hooks to control whether or not to display a 'send mail' link in the thread author menu
+ - Provide platform specific install script
+ - Allow for project specific DB updates
+ - Get rid of davguest
+ - Move db_upgrade to zlib
+ - Add CSRF protection for import and import_items
+ - Add some documentation for import functions
+ - Do not allow creating two wikis with the same name
+ - Update textcomplete library to version 1.8.0
+ - Create channel_store_lowlevel()
+ - Allow setting the system email name/address/reply
+ - Use the same host macro for sender address as for reply_to address
+ - Use the relevant attach directory/path for photo albums instead of an album basename which may not be unique. Created an 'ellipsify()' function to shorten long names and keep the beginning and end intact
+ - Simplify the message signing spaghetti
+ - Class MarkdownSoap to safely store markdown by purifying and preserving (escaped) what may be unsafe code in codeblocks. The stored item needs to be unescaped just prior to calling the markdown-to-html processor
+ - Remove the unimplemented upload limit site settings from UI
+ - Cleanup code_allowed
+ - Move widgets to standalone classes
+ - Upgrade redbasic to bootstrap 4
+ - Updated HTML Purifier from 4.6.0 to 4.9.2 with better PHP7 compatibility
+ - Remove redundant and non-functional/broken check for successfully cloned channel record which was left over from an earlier method of creating the table; which was deprecated a few months back
+ - Update bshaffer/oauth2-server-php library
+ - Add unit test for purify_html()
+
+ Bugfixes
+ - Fix website export tool creating invalid zip file - issue #790
+ - Fix files not synced correctly - issue #769
+ - Fix empty ACL should not result in no ACL when uploading a file
+ - Fix cover photo was unintentionally disabled when block_public in effect
+ - Fix markdown autolinks - issue 752
+ - Fix connectDefaultShare generated js function, though it isn't obvious if we still use it
+ - Fix a couple more instances where we were still calling mail() directly for site critical messages
+ - Fix when clicking a notification to view a private mail message, actually view that message instead of the most recent
+ - Fix group by item query
+
+ Plugins/Addon
+ - smileybutton: do not load emojis
+ - pubsubhubbub: fixes associated with recent compatibility feed mods
+ - gnusoc: mastodon follow_activity compatibility issues
+ - gnusoc: add profile photo to feed meta
+ - gnusoc: add salmon link information to the public feed when GNU-Social is enabled
+ - chess: fix bugs when deleting games
+
Hubzilla 2.2 (2017-03-08)
- - Don't collapse long nsfw content if nsfw plugin is already collapsing it
- Provide version compatibility check for themes (minversion, maxversion)
- Use chanlink_hash() instead of chanlink_url() where appropriate
- Use head_add_link() for feed discovery
diff --git a/Zotlabs/Access/AccessList.php b/Zotlabs/Access/AccessList.php
index b073f9d3c..6471b0b1d 100644
--- a/Zotlabs/Access/AccessList.php
+++ b/Zotlabs/Access/AccessList.php
@@ -2,21 +2,55 @@
namespace Zotlabs\Access;
-
+/**
+ * @brief AccessList class.
+ *
+ * A class to hold an AccessList object with allowed and denied contacts and
+ * groups.
+ */
class AccessList {
-
+ /**
+ * @brief Allow contacts
+ * @var string
+ */
private $allow_cid;
+ /**
+ * @brief Allow groups
+ * @var string
+ */
private $allow_gid;
+ /**
+ * @brief Deny contacts
+ * @var string
+ */
private $deny_cid;
+ /**
+ * @brief Deny groups
+ * @var string
+ */
private $deny_gid;
+ /**
+ * @brief Indicates if we are using the default constructor values or
+ * values that have been set explicitly.
+ * @var boolean
+ */
+ private $explicit;
- /* indicates if we are using the default constructor values or values that have been set explicitly. */
-
- private $explicit;
+ /**
+ * @brief Constructor for AccessList class.
+ *
+ * @note The array to pass to the constructor is different from the array
+ * that you provide to the set() or set_from_array() functions.
+ *
+ * @param array $channel A channel array, where these entries are evaluated:
+ * * \e string \b channel_allow_cid => string of allowed cids
+ * * \e string \b channel_allow_gid => string of allowed gids
+ * * \e string \b channel_deny_cid => string of denied cids
+ * * \e string \b channel_deny_gid => string of denied gids
+ */
function __construct($channel) {
-
- if($channel) {
+ if($channel) {
$this->allow_cid = $channel['channel_allow_cid'];
$this->allow_gid = $channel['channel_allow_gid'];
$this->deny_cid = $channel['channel_deny_cid'];
@@ -32,61 +66,95 @@ class AccessList {
$this->explicit = false;
}
+ /**
+ * @brief Get if we are using the default constructor values
+ * or values that have been set explicitly.
+ *
+ * @return boolean
+ */
function get_explicit() {
return $this->explicit;
}
/**
- * Set AccessList from strings such as those in already
- * existing stored data items
+ * @brief Set access list from strings such as those in already
+ * existing stored data items.
+ *
+ * @note The array to pass to this set function is different from the array
+ * that you provide to the constructor or set_from_array().
+ *
+ * @param array $arr
+ * * \e string \b allow_cid => string of allowed cids
+ * * \e string \b allow_gid => string of allowed gids
+ * * \e string \b deny_cid => string of denied cids
+ * * \e string \b deny_gid => string of denied gids
+ * @param boolean $explicit (optional) default true
*/
-
- function set($arr,$explicit = true) {
+ function set($arr, $explicit = true) {
$this->allow_cid = $arr['allow_cid'];
$this->allow_gid = $arr['allow_gid'];
$this->deny_cid = $arr['deny_cid'];
$this->deny_gid = $arr['deny_gid'];
- $this->explicit = $explicit;
+ $this->explicit = $explicit;
}
/**
- * return an array consisting of the current
- * access list components where the elements
- * are directly storable.
+ * @brief Return an array consisting of the current access list components
+ * where the elements are directly storable.
+ *
+ * @return Associative array with:
+ * * \e string \b allow_cid => string of allowed cids
+ * * \e string \b allow_gid => string of allowed gids
+ * * \e string \b deny_cid => string of denied cids
+ * * \e string \b deny_gid => string of denied gids
*/
-
function get() {
- return array(
+ return [
'allow_cid' => $this->allow_cid,
'allow_gid' => $this->allow_gid,
'deny_cid' => $this->deny_cid,
'deny_gid' => $this->deny_gid,
- );
+ ];
}
/**
- * Set AccessList from arrays, such as those provided by
- * acl_selector(). For convenience, a string (or non-array) input is
- * assumed to be a comma-separated list and auto-converted into an array.
- */
-
- function set_from_array($arr,$explicit = true) {
- $this->allow_cid = perms2str((is_array($arr['contact_allow']))
- ? $arr['contact_allow'] : explode(',',$arr['contact_allow']));
+ * @brief Set access list components from arrays, such as those provided by
+ * acl_selector().
+ *
+ * For convenience, a string (or non-array) input is assumed to be a
+ * comma-separated list and auto-converted into an array.
+ *
+ * @note The array to pass to this set function is different from the array
+ * that you provide to the constructor or set().
+ *
+ * @param array $arr An associative array with:
+ * * \e array|string \b contact_allow => array with cids or comma-seperated string
+ * * \e array|string \b group_allow => array with gids or comma-seperated string
+ * * \e array|string \b contact_deny => array with cids or comma-seperated string
+ * * \e array|string \b group_deny => array with gids or comma-seperated string
+ * @param boolean $explicit (optional) default true
+ */
+ function set_from_array($arr, $explicit = true) {
+ $this->allow_cid = perms2str((is_array($arr['contact_allow']))
+ ? $arr['contact_allow'] : explode(',', $arr['contact_allow']));
$this->allow_gid = perms2str((is_array($arr['group_allow']))
- ? $arr['group_allow'] : explode(',',$arr['group_allow']));
+ ? $arr['group_allow'] : explode(',', $arr['group_allow']));
$this->deny_cid = perms2str((is_array($arr['contact_deny']))
- ? $arr['contact_deny'] : explode(',',$arr['contact_deny']));
+ ? $arr['contact_deny'] : explode(',', $arr['contact_deny']));
$this->deny_gid = perms2str((is_array($arr['group_deny']))
- ? $arr['group_deny'] : explode(',',$arr['group_deny']));
+ ? $arr['group_deny'] : explode(',', $arr['group_deny']));
$this->explicit = $explicit;
}
+ /**
+ * @brief Returns true if any access lists component is set.
+ *
+ * @return boolean Return true if any of allow_* deny_* values is set.
+ */
function is_private() {
return (($this->allow_cid || $this->allow_gid || $this->deny_cid || $this->deny_gid) ? true : false);
}
}
-
diff --git a/Zotlabs/Daemon/Cron.php b/Zotlabs/Daemon/Cron.php
index 350dda7a0..c84708ba4 100644
--- a/Zotlabs/Daemon/Cron.php
+++ b/Zotlabs/Daemon/Cron.php
@@ -121,6 +121,9 @@ class Cron {
}
}
+ require_once('include/attach.php');
+ attach_upgrade();
+
$abandon_days = intval(get_config('system','account_abandon_days'));
if($abandon_days < 1)
$abandon_days = 0;
diff --git a/Zotlabs/Daemon/Cron_daily.php b/Zotlabs/Daemon/Cron_daily.php
index 0f0001890..038790572 100644
--- a/Zotlabs/Daemon/Cron_daily.php
+++ b/Zotlabs/Daemon/Cron_daily.php
@@ -38,6 +38,13 @@ class Cron_daily {
db_utcnow(), db_quoteinterval('30 DAY')
);
+ // expire any unread notifications over a year old
+
+ q("delete from notify where seen = 0 and created < %s - INTERVAL %s",
+ db_utcnow(), db_quoteinterval('1 YEAR')
+ );
+
+
//update statistics in config
require_once('include/statistics_fns.php');
update_channels_total_stat();
diff --git a/Zotlabs/Daemon/Notifier.php b/Zotlabs/Daemon/Notifier.php
index 63ced4f56..3afe1a5dc 100644
--- a/Zotlabs/Daemon/Notifier.php
+++ b/Zotlabs/Daemon/Notifier.php
@@ -5,6 +5,11 @@ namespace Zotlabs\Daemon;
require_once('include/queue_fn.php');
require_once('include/html2plain.php');
require_once('include/conversation.php');
+require_once('include/zot.php');
+require_once('include/items.php');
+require_once('include/bbcode.php');
+
+
/*
* This file was at one time responsible for doing all deliveries, but this caused
@@ -68,13 +73,6 @@ require_once('include/conversation.php');
*/
-require_once('include/zot.php');
-require_once('include/queue_fn.php');
-require_once('include/datetime.php');
-require_once('include/items.php');
-require_once('include/bbcode.php');
-require_once('include/channel.php');
-
class Notifier {
@@ -98,16 +96,6 @@ class Notifier {
$deliveries = array();
- $dead_hubs = array();
-
- $dh = q("select site_url from site where site_dead = 1");
- if($dh) {
- foreach($dh as $dead) {
- $dead_hubs[] = $dead['site_url'];
- }
- }
-
-
$request = false;
$mail = false;
$top_level = false;
@@ -489,10 +477,10 @@ class Notifier {
// Now we have collected recipients (except for external mentions, FIXME)
- // Let's reduce this to a set of hubs.
+ // Let's reduce this to a set of hubs; checking that the site is not dead.
$r = q("select hubloc.*, site.site_crypto from hubloc left join site on site_url = hubloc_url where hubloc_hash in (" . implode(',',$recipients) . ")
- and hubloc_error = 0 and hubloc_deleted = 0"
+ and hubloc_error = 0 and hubloc_deleted = 0 and ( site_dead = 0 OR site_dead is null ) "
);
@@ -506,23 +494,31 @@ class Notifier {
/**
- * Reduce the hubs to those that are unique. For zot hubs, we need to verify uniqueness by the sitekey, since it may have been
- * a re-install which has not yet been detected and pruned.
+ * Reduce the hubs to those that are unique. For zot hubs, we need to verify uniqueness by the sitekey,
+ * since it may have been a re-install which has not yet been detected and pruned.
* For other networks which don't have or require sitekeys, we'll have to use the URL
*/
- $hublist = array(); // this provides an easily printable list for the logs
- $dhubs = array(); // delivery hubs where we store our resulting unique array
- $keys = array(); // array of keys to check uniquness for zot hubs
- $urls = array(); // array of urls to check uniqueness of hubs from other networks
-
+ $hublist = []; // this provides an easily printable list for the logs
+ $dhubs = []; // delivery hubs where we store our resulting unique array
+ $keys = []; // array of keys to check uniquness for zot hubs
+ $urls = []; // array of urls to check uniqueness of hubs from other networks
+ $hub_env = []; // per-hub envelope so we don't broadcast the entire envelope to all
foreach($hubs as $hub) {
- if(in_array($hub['hubloc_url'],$dead_hubs)) {
- logger('skipping dead hub: ' . $hub['hubloc_url'], LOGGER_DEBUG, LOG_INFO);
- continue;
+
+ if($env_recips) {
+ foreach($env_recips as $er) {
+ if($hub['hubloc_hash'] === $er['hash']) {
+ if(! array_key_exists($hub['hubloc_host'] . $hub['hubloc_sitekey'], $hub_env)) {
+ $hub_env[$hub['hubloc_host'] . $hub['hubloc_sitekey']] = [];
+ }
+ $hub_env[$hub['hubloc_host'] . $hub['hubloc_sitekey']][] = $er;
+ }
+ }
}
+
if($hub['hubloc_network'] == 'zot') {
if(! in_array($hub['hubloc_sitekey'],$keys)) {
@@ -603,7 +599,8 @@ class Notifier {
$packet = zot_build_packet($channel,$packet_type,(($packet_recips) ? $packet_recips : null));
}
elseif($packet_type === 'request') {
- $packet = zot_build_packet($channel,$packet_type,$env_recips,$hub['hubloc_sitekey'],$hub['site_crypto'],
+ $env = (($hub_env && $hub_env[$hub['hubloc_host'] . $hub['hubloc_sitekey']]) ? $hub_env[$hub['hubloc_host'] . $hub['hubloc_sitekey']] : '');
+ $packet = zot_build_packet($channel,$packet_type,$env,$hub['hubloc_sitekey'],$hub['site_crypto'],
$hash, array('message_id' => $request_message_id)
);
}
@@ -618,7 +615,8 @@ class Notifier {
));
}
else {
- $packet = zot_build_packet($channel,'notify',$env_recips,(($private) ? $hub['hubloc_sitekey'] : null), $hub['site_crypto'],$hash);
+ $env = (($hub_env && $hub_env[$hub['hubloc_host'] . $hub['hubloc_sitekey']]) ? $hub_env[$hub['hubloc_host'] . $hub['hubloc_sitekey']] : '');
+ $packet = zot_build_packet($channel,'notify',$env,(($private) ? $hub['hubloc_sitekey'] : null), $hub['site_crypto'],$hash);
queue_insert(array(
'hash' => $hash,
'account_id' => $target_item['aid'],
diff --git a/Zotlabs/Daemon/Onepoll.php b/Zotlabs/Daemon/Onepoll.php
index 33b244dc5..920916828 100644
--- a/Zotlabs/Daemon/Onepoll.php
+++ b/Zotlabs/Daemon/Onepoll.php
@@ -118,13 +118,29 @@ class Onepoll {
if($fetch_feed) {
- $feedurl = str_replace('/poco/','/zotfeed/',$contact['xchan_connurl']);
- $feedurl .= '?f=&mindate=' . urlencode($last_update);
+ if(strpos($contact['xchan_connurl'],z_root()) === 0) {
+ // local channel - save a network fetch
+ $c = channelx_by_hash($contact['xchan_hash']);
+ if($c) {
+ $x = [
+ 'success' => true,
+ 'body' => json_encode( [
+ 'success' => true,
+ 'messages' => zot_feed($c['channel_id'], $importer['xchan_hash'], [ 'mindate' => $last_update ])
+ ])
+ ];
+ }
+ }
+ else {
+ // remote fetch
- $x = z_fetch_url($feedurl);
+ $feedurl = str_replace('/poco/','/zotfeed/',$contact['xchan_connurl']);
+ $feedurl .= '?f=&mindate=' . urlencode($last_update) . '&zid=' . $importer['channel_address'] . '@' . \App::get_hostname();
+ $recurse = 0;
+ $x = z_fetch_url($feedurl, false, $recurse, [ 'session' => true ]);
+ }
logger('feed_update: ' . print_r($x,true), LOGGER_DATA);
-
}
if(($x) && ($x['success'])) {
diff --git a/Zotlabs/Lib/Apps.php b/Zotlabs/Lib/Apps.php
index 0ca2f7a99..2ace361ca 100644
--- a/Zotlabs/Lib/Apps.php
+++ b/Zotlabs/Lib/Apps.php
@@ -34,7 +34,7 @@ class Apps {
if($files) {
foreach($files as $f) {
$path = explode('/',$f);
- $plugin = $path[1];
+ $plugin = trim($path[1]);
if(plugin_is_installed($plugin)) {
$x = self::parse_app_description($f,$translate);
if($x) {
@@ -219,7 +219,7 @@ class Apps {
'Suggest Channels' => t('Suggest Channels'),
'Login' => t('Login'),
'Channel Manager' => t('Channel Manager'),
- 'Grid' => t('Grid'),
+ 'Grid' => t('Activity'),
'Settings' => t('Settings'),
'Files' => t('Files'),
'Webpages' => t('Webpages'),
@@ -245,9 +245,19 @@ class Apps {
'Profile Photo' => t('Profile Photo')
);
- if(array_key_exists($arr['name'],$apps)) {
- $arr['name'] = $apps[$arr['name']];
+ if(array_key_exists('name',$arr)) {
+ if(array_key_exists($arr['name'],$apps)) {
+ $arr['name'] = $apps[$arr['name']];
+ }
+ }
+ else {
+ for($x = 0; $x < count($arr); $x++) {
+ if(array_key_exists($arr[$x]['name'],$apps)) {
+ $arr[$x]['name'] = $apps[$arr[$x]['name']];
+ }
+ }
}
+
}
@@ -275,7 +285,7 @@ class Apps {
self::translate_system_apps($papp);
- if(($papp['plugin']) && (! plugin_is_installed($papp['plugin'])))
+ if(trim($papp['plugin']) && (! plugin_is_installed(trim($papp['plugin']))))
return '';
$papp['papp'] = self::papp_encode($papp);
@@ -565,7 +575,7 @@ class Apps {
$darray['app_addr'] = ((x($arr,'addr')) ? escape_tags($arr['addr']) : '');
$darray['app_price'] = ((x($arr,'price')) ? escape_tags($arr['price']) : '');
$darray['app_page'] = ((x($arr,'page')) ? escape_tags($arr['page']) : '');
- $darray['app_plugin'] = ((x($arr,'plugin')) ? escape_tags($arr['plugin']) : '');
+ $darray['app_plugin'] = ((x($arr,'plugin')) ? escape_tags(trim($arr['plugin'])) : '');
$darray['app_requires'] = ((x($arr,'requires')) ? escape_tags($arr['requires']) : '');
$darray['app_system'] = ((x($arr,'system')) ? intval($arr['system']) : 0);
$darray['app_deleted'] = ((x($arr,'deleted')) ? intval($arr['deleted']) : 0);
@@ -643,7 +653,7 @@ class Apps {
$darray['app_addr'] = ((x($arr,'addr')) ? escape_tags($arr['addr']) : '');
$darray['app_price'] = ((x($arr,'price')) ? escape_tags($arr['price']) : '');
$darray['app_page'] = ((x($arr,'page')) ? escape_tags($arr['page']) : '');
- $darray['app_plugin'] = ((x($arr,'plugin')) ? escape_tags($arr['plugin']) : '');
+ $darray['app_plugin'] = ((x($arr,'plugin')) ? escape_tags(trim($arr['plugin'])) : '');
$darray['app_requires'] = ((x($arr,'requires')) ? escape_tags($arr['requires']) : '');
$darray['app_system'] = ((x($arr,'system')) ? intval($arr['system']) : 0);
$darray['app_deleted'] = ((x($arr,'deleted')) ? intval($arr['deleted']) : 0);
@@ -753,7 +763,7 @@ class Apps {
$ret['system'] = $app['app_system'];
if($app['app_plugin'])
- $ret['plugin'] = $app['app_plugin'];
+ $ret['plugin'] = trim($app['app_plugin']);
if($app['app_deleted'])
$ret['deleted'] = $app['app_deleted'];
diff --git a/Zotlabs/Lib/DB_Upgrade.php b/Zotlabs/Lib/DB_Upgrade.php
new file mode 100644
index 000000000..bb72e7a05
--- /dev/null
+++ b/Zotlabs/Lib/DB_Upgrade.php
@@ -0,0 +1,119 @@
+<?php
+
+namespace Zotlabs\Lib;
+
+
+class DB_Upgrade {
+
+ public $config_name = '';
+ public $func_prefix = '';
+
+ function __construct($db_revision) {
+
+ $update_file = 'install/' . PLATFORM_NAME . '/update.php';
+ if(! file_exists($update_file)) {
+ $update_file = 'install/update.php';
+ $this->config_name = 'db_version';
+ $this->func_prefix = 'update_r';
+ }
+ else {
+ $this->config_name = PLATFORM_NAME . '_db_version';
+ $this->func_prefix = PLATFORM_NAME . '_update_';
+ }
+
+ $build = get_config('system', $this->config_name, 0);
+ if(! intval($build))
+ $build = set_config('system', $this->config_name, $db_revision);
+
+ if($build == $db_revision) {
+ // Nothing to be done.
+ return;
+ }
+ else {
+ $stored = intval($build);
+ if(! $stored) {
+ logger('Critical: check_config unable to determine database schema version');
+ return;
+ }
+
+ $current = intval($db_revision);
+
+ if(($stored < $current) && file_exists($update_file)) {
+
+ Config::Load('database');
+
+ // We're reporting a different version than what is currently installed.
+ // Run any existing update scripts to bring the database up to current.
+
+ require_once($update_file);
+
+ // make sure that boot.php and update.php are the same release, we might be
+ // updating from git right this very second and the correct version of the update.php
+ // file may not be here yet. This can happen on a very busy site.
+
+ if($db_revision == UPDATE_VERSION) {
+ for($x = $stored; $x < $current; $x ++) {
+ $func = $this->func_prefix . $x;
+ if(function_exists($func)) {
+ // There could be a lot of processes running or about to run.
+ // We want exactly one process to run the update command.
+ // So store the fact that we're taking responsibility
+ // after first checking to see if somebody else already has.
+
+ // If the update fails or times-out completely you may need to
+ // delete the config entry to try again.
+
+ if(get_config('database', $func))
+ break;
+ set_config('database',$func, '1');
+ // call the specific update
+
+ $retval = $func();
+ if($retval) {
+
+ // Prevent sending hundreds of thousands of emails by creating
+ // a lockfile.
+
+ $lockfile = 'store/[data]/mailsent';
+
+ if ((file_exists($lockfile)) && (filemtime($lockfile) > (time() - 86400)))
+ return;
+ @unlink($lockfile);
+ //send the administrator an e-mail
+ file_put_contents($lockfile, $x);
+
+ $r = q("select account_language from account where account_email = '%s' limit 1",
+ dbesc(\App::$config['system']['admin_email'])
+ );
+ push_lang(($r) ? $r[0]['account_language'] : 'en');
+
+ z_mail(
+ [
+ 'toEmail' => \App::$config['system']['admin_email'],
+ 'messageSubject' => sprintf( t('Update Error at %s'), z_root()),
+ 'textVersion' => replace_macros(get_intltext_template('update_fail_eml.tpl'),
+ [
+ '$sitename' => \App::$config['system']['sitename'],
+ '$siteurl' => z_root(),
+ '$update' => $x,
+ '$error' => sprintf( t('Update %s failed. See error logs.'), $x)
+ ]
+ )
+ ]
+ );
+
+ //try the logger
+ logger('CRITICAL: Update Failed: ' . $x);
+ pop_lang();
+ }
+ else {
+ set_config('database',$func, 'success');
+ }
+ }
+ }
+ set_config('system', $this->config_name, $db_revision);
+ }
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/Zotlabs/Lib/Enotify.php b/Zotlabs/Lib/Enotify.php
index 257687567..a10675a87 100644
--- a/Zotlabs/Lib/Enotify.php
+++ b/Zotlabs/Lib/Enotify.php
@@ -67,7 +67,7 @@ class Enotify {
$sender_name = $product;
$hostname = \App::get_hostname();
if(strpos($hostname,':'))
- $hostname = substr($hostname,0,strpos($hostname,':'));
+ $hostname = substr($hostname,0,strpos($hostname,':'));
// Do not translate 'noreply' as it must be a legal 7-bit email address
@@ -77,7 +77,7 @@ class Enotify {
$sender_email = get_config('system','from_email');
if(! $sender_email)
- $sender_email = 'Administrator' . '@' . \App::get_hostname();
+ $sender_email = 'Administrator' . '@' . $hostname;
$sender_name = get_config('system','from_email_name');
if(! $sender_name)
@@ -495,13 +495,14 @@ class Enotify {
}
}
- $r = q("insert into notify (hash,xname,url,photo,created,aid,uid,link,parent,seen,ntype,verb,otype)
- values('%s','%s','%s','%s','%s',%d,%d,'%s','%s',%d,%d,'%s','%s')",
+ $r = q("insert into notify (hash,xname,url,photo,created,msg,aid,uid,link,parent,seen,ntype,verb,otype)
+ values('%s','%s','%s','%s','%s','%s',%d,%d,'%s','%s',%d,%d,'%s','%s')",
dbesc($datarray['hash']),
dbesc($datarray['xname']),
dbesc($datarray['url']),
dbesc($datarray['photo']),
dbesc($datarray['created']),
+ dbesc(''), // will fill this in below after the record is created
intval($datarray['aid']),
intval($datarray['uid']),
dbesc($datarray['link']),
diff --git a/Zotlabs/Lib/MarkdownSoap.php b/Zotlabs/Lib/MarkdownSoap.php
new file mode 100644
index 000000000..534ad819f
--- /dev/null
+++ b/Zotlabs/Lib/MarkdownSoap.php
@@ -0,0 +1,103 @@
+<?php
+
+namespace Zotlabs\Lib;
+
+/**
+ * MarkdownSoap
+ * Purify Markdown for storage
+ * $x = new MarkdownSoap($string_to_be_cleansed);
+ * $text = $x->clean();
+ *
+ * What this does:
+ * 1. extracts code blocks and privately escapes them from processing
+ * 2. Run html purifier on the content
+ * 3. put back the code blocks
+ * 4. run htmlspecialchars on the entire content for safe storage
+ *
+ * At render time:
+ * $markdown = \Zotlabs\Lib\MarkdownSoap::unescape($text);
+ * $html = \Michelf\MarkdownExtra::DefaultTransform($markdown);
+ */
+
+
+
+class MarkdownSoap {
+
+ private $token;
+
+ private $str;
+
+ function __construct($s) {
+ $this->str = $s;
+ $this->token = random_string(20);
+ }
+
+
+ function clean() {
+
+ $x = $this->extract_code($this->str);
+
+ $x = $this->purify($x);
+
+ $x = $this->putback_code($x);
+
+ $x = $this->escape($x);
+
+ return $x;
+ }
+
+ function extract_code($s) {
+
+ $text = preg_replace_callback('{
+ (?:\n\n|\A\n?)
+ ( # $1 = the code block -- one or more lines, starting with a space/tab
+ (?>
+ [ ]{'.'4'.'} # Lines must start with a tab or a tab-width of spaces
+ .*\n+
+ )+
+ )
+ ((?=^[ ]{0,'.'4'.'}\S)|\Z) # Lookahead for non-space at line-start, or end of doc
+ }xm',
+ [ $this , 'encode_code' ], $s);
+
+ return $text;
+ }
+
+ function encode_code($matches) {
+ return $this->token . ';' . base64_encode($matches[0]) . ';' ;
+ }
+
+ function decode_code($matches) {
+ return base64_decode($matches[1]);
+ }
+
+ function putback_code($s) {
+ $text = preg_replace_callback('{' . $this->token . '\;(.*?)\;}xm',[ $this, 'decode_code' ], $s);
+ return $text;
+ }
+
+ function purify($s) {
+ $s = $this->protect_autolinks($s);
+ $s = purify_html($s);
+ $s = $this->unprotect_autolinks($s);
+ return $s;
+ }
+
+ function protect_autolinks($s) {
+ $s = preg_replace('/\<(https?\:\/\/)(.*?)\>/','[$1$2]($1$2)',$s);
+ return $s;
+ }
+
+ function unprotect_autolinks($s) {
+ return $s;
+
+ }
+
+ function escape($s) {
+ return htmlspecialchars($s,ENT_QUOTES);
+ }
+
+ static public function unescape($s) {
+ return htmlspecialchars_decode($s,ENT_QUOTES);
+ }
+}
diff --git a/Zotlabs/Lib/NativeWiki.php b/Zotlabs/Lib/NativeWiki.php
index 7786ec25a..4301feaa0 100644
--- a/Zotlabs/Lib/NativeWiki.php
+++ b/Zotlabs/Lib/NativeWiki.php
@@ -101,11 +101,11 @@ class NativeWiki {
static public function sync_a_wiki_item($uid,$id,$resource_id) {
- $r = q("SELECT * from item WHERE uid = %d AND ( id = %d OR ( resource_type = '%s' and resource_id = %d )) ",
+ $r = q("SELECT * from item WHERE uid = %d AND ( id = %d OR ( resource_type = '%s' and resource_id = '%s' )) ",
intval($uid),
intval($id),
dbesc(NWIKI_ITEM_RESOURCE_TYPE),
- intval($resource_id)
+ dbesc($resource_id)
);
if($r) {
xchan_query($r);
diff --git a/Zotlabs/Lib/NativeWikiPage.php b/Zotlabs/Lib/NativeWikiPage.php
index 4086a023e..ed3df436c 100644
--- a/Zotlabs/Lib/NativeWikiPage.php
+++ b/Zotlabs/Lib/NativeWikiPage.php
@@ -21,12 +21,23 @@ class NativeWikiPage {
$sql_extra = item_permissions_sql($channel_id,$observer_hash);
$r = q("select * from item where resource_type = 'nwikipage' and resource_id = '%s' and uid = %d and item_deleted = 0
- $sql_extra group by mid",
+ $sql_extra order by created asc",
dbesc($resource_id),
intval($channel_id)
);
if($r) {
- $items = fetch_post_tags($r,true);
+ $x = [];
+ $y = [];
+
+ foreach($r as $rv) {
+ if(! in_array($rv['mid'],$x)) {
+ $y[] = $rv;
+ $x[] = $rv['mid'];
+ }
+ }
+
+ $items = fetch_post_tags($y,true);
+
foreach($items as $page_item) {
$title = get_iconfig($page_item['id'],'nwikipage','pagetitle',t('(No Title)'));
if(urldecode($title) !== 'Home') {
@@ -156,7 +167,7 @@ class NativeWikiPage {
$content = $item['body'];
return [
- 'content' => json_encode($content),
+ 'content' => $content,
'mimeType' => $w['mimeType'],
'message' => '',
'success' => true
@@ -307,48 +318,22 @@ class NativeWikiPage {
return null;
}
-
-
- static public function prepare_content($s) {
-
- $text = preg_replace_callback('{
- (?:\n\n|\A\n?)
- ( # $1 = the code block -- one or more lines, starting with a space/tab
- (?>
- [ ]{'.'4'.'} # Lines must start with a tab or a tab-width of spaces
- .*\n+
- )+
- )
- ((?=^[ ]{0,'.'4'.'}\S)|\Z) # Lookahead for non-space at line-start, or end of doc
- }xm',
- 'self::nwiki_prepare_content_callback', $s);
-
- return $text;
- }
-
- static public function nwiki_prepare_content_callback($matches) {
- $codeblock = $matches[1];
-
- $codeblock = htmlspecialchars($codeblock, ENT_NOQUOTES, UTF8, false);
- return "\n\n" . $codeblock ;
- }
-
-
-
static public function save_page($arr) {
- $pageUrlName = ((array_key_exists('pageUrlName',$arr)) ? $arr['pageUrlName'] : '');
- $content = ((array_key_exists('content',$arr)) ? purify_html(Zlib\NativeWikiPage::prepare_content($arr['content'])) : '');
- $resource_id = ((array_key_exists('resource_id',$arr)) ? $arr['resource_id'] : '');
+ $pageUrlName = ((array_key_exists('pageUrlName',$arr)) ? $arr['pageUrlName'] : '');
+ $content = ((array_key_exists('content',$arr)) ? $arr['content'] : '');
+ $resource_id = ((array_key_exists('resource_id',$arr)) ? $arr['resource_id'] : '');
$observer_hash = ((array_key_exists('observer_hash',$arr)) ? $arr['observer_hash'] : '');
$channel_id = ((array_key_exists('channel_id',$arr)) ? $arr['channel_id'] : 0);
- $revision = ((array_key_exists('revision',$arr)) ? $arr['revision'] : 0);
+ $revision = ((array_key_exists('revision',$arr)) ? $arr['revision'] : 0);
$w = Zlib\NativeWiki::get_wiki($channel_id, $observer_hash, $resource_id);
if (!$w['wiki']) {
return array('message' => t('Error reading wiki'), 'success' => false);
}
+
+ $mimetype = $w['mimeType'];
// fetch the most recently saved revision.
@@ -367,6 +352,7 @@ class NativeWikiPage {
$item['author_xchan'] = $observer_hash;
$item['revision'] = (($arr['revision']) ? intval($arr['revision']) + 1 : intval($item['revision']) + 1);
$item['edited'] = datetime_convert();
+ $item['mimetype'] = $mimetype;
if($item['iconfig'] && is_array($item['iconfig']) && count($item['iconfig'])) {
for($x = 0; $x < count($item['iconfig']); $x ++) {
@@ -534,6 +520,29 @@ class NativeWikiPage {
}
return $s;
}
+
+ static public function render_page_history($arr) {
+
+ $pageUrlName = ((array_key_exists('pageUrlName', $arr)) ? $arr['pageUrlName'] : '');
+ $resource_id = ((array_key_exists('resource_id', $arr)) ? $arr['resource_id'] : '');
+
+ $pageHistory = self::page_history([
+ 'channel_id' => \App::$profile_uid,
+ 'observer_hash' => get_observer_hash(),
+ 'resource_id' => $resource_id,
+ 'pageUrlName' => $pageUrlName
+ ]);
+
+ return replace_macros(get_markup_template('nwiki_page_history.tpl'), array(
+ '$pageHistory' => $pageHistory['history'],
+ '$permsWrite' => $arr['permsWrite'],
+ '$name_lbl' => t('Name'),
+ '$msg_label' => t('Message','wiki_history')
+ ));
+
+ }
+
+
/**
* Replace the instances of the string [toc] with a list element that will be populated by
diff --git a/Zotlabs/Lib/ThreadItem.php b/Zotlabs/Lib/ThreadItem.php
index 07b782309..5910ea672 100644
--- a/Zotlabs/Lib/ThreadItem.php
+++ b/Zotlabs/Lib/ThreadItem.php
@@ -82,7 +82,8 @@ class ThreadItem {
$dropping = false;
$star = false;
$isstarred = "unstarred fa-star-o";
- $indent = '';
+ $is_comment = false;
+ $is_item = false;
$osparkle = '';
$total_children = $this->count_descendants();
$unseen_comments = (($item['real_uid']) ? 0 : $this->count_unseen_descendants());
@@ -183,7 +184,7 @@ class ThreadItem {
$like_list = ((x($conv_responses['like'],$item['mid'])) ? $conv_responses['like'][$item['mid'] . '-l'] : '');
if (count($like_list) > MAX_LIKERS) {
$like_list_part = array_slice($like_list, 0, MAX_LIKERS);
- array_push($like_list_part, '<a href="#" data-toggle="modal" data-target="#likeModal-' . $this->get_id() . '"><b>' . t('View all') . '</b></a>');
+ array_push($like_list_part, '<a class="dropdown-item" href="#" data-toggle="modal" data-target="#likeModal-' . $this->get_id() . '"><b>' . t('View all') . '</b></a>');
} else {
$like_list_part = '';
}
@@ -195,7 +196,7 @@ class ThreadItem {
$dislike_button_label = tt('Dislike','Dislikes',$dislike_count,'noun');
if (count($dislike_list) > MAX_LIKERS) {
$dislike_list_part = array_slice($dislike_list, 0, MAX_LIKERS);
- array_push($dislike_list_part, '<a href="#" data-toggle="modal" data-target="#dislikeModal-' . $this->get_id() . '"><b>' . t('View all') . '</b></a>');
+ array_push($dislike_list_part, '<a class="dropdown-item" href="#" data-toggle="modal" data-target="#dislikeModal-' . $this->get_id() . '"><b>' . t('View all') . '</b></a>');
} else {
$dislike_list_part = '';
}
@@ -232,7 +233,7 @@ class ThreadItem {
}
}
else {
- $indent = 'comment';
+ $is_comment = true;
}
@@ -276,13 +277,13 @@ class ThreadItem {
$keep_reports = intval(get_config('system','expire_delivery_reports'));
if($keep_reports === 0)
- $keep_reports = 30;
+ $keep_reports = 10;
if((! get_config('system','disable_dreport')) && strcmp(datetime_convert('UTC','UTC',$item['created']),datetime_convert('UTC','UTC',"now - $keep_reports days")) > 0)
$dreport = t('Delivery Report');
if(strcmp(datetime_convert('UTC','UTC',$item['created']),datetime_convert('UTC','UTC','now - 12 hours')) > 0)
- $indent .= ' shiny';
+ $is_new = true;
localize_item($item);
@@ -337,7 +338,6 @@ class ThreadItem {
'profile_url' => $profile_link,
'thread_action_menu' => thread_action_menu($item,$conv->get_mode()),
'thread_author_menu' => thread_author_menu($item,$conv->get_mode()),
- 'item_photo_menu' => item_photo_menu($item),
'dreport' => $dreport,
'name' => $profile_name,
'thumb' => $profile_avatar,
@@ -361,7 +361,8 @@ class ThreadItem {
'attend_title' => t('Attendance Options'),
'vote_label' => t('Vote'),
'vote_title' => t('Voting Options'),
- 'indent' => $indent,
+ 'is_comment' => $is_comment,
+ 'is_new' => $is_new,
'owner_url' => $this->get_owner_url(),
'owner_photo' => $this->get_owner_photo(),
'owner_name' => $this->get_owner_name(),
@@ -407,7 +408,7 @@ class ThreadItem {
'showlike' => $showlike,
'showdislike' => $showdislike,
'comment' => $this->get_comment_box($indent),
- 'previewing' => ($conv->is_preview() ? ' preview ' : ''),
+ 'previewing' => ($conv->is_preview() ? true : false ),
'wait' => t('Please wait'),
'submid' => str_replace(['+','='], ['',''], base64_encode(substr($item['mid'],0,32))),
'thread_level' => $thread_level
diff --git a/Zotlabs/Module/Admin/Plugins.php b/Zotlabs/Module/Admin/Plugins.php
index 527e96496..feb29e9d6 100644
--- a/Zotlabs/Module/Admin/Plugins.php
+++ b/Zotlabs/Module/Admin/Plugins.php
@@ -3,10 +3,14 @@
namespace Zotlabs\Module\Admin;
use \Zotlabs\Storage\GitRepo as GitRepo;
+use \Michelf\MarkdownExtra;
class Plugins {
-
+ /**
+ * @brief
+ *
+ */
function post() {
if(argc() > 2 && is_file("addon/" . argv(2) . "/" . argv(2) . ".php")) {
@@ -15,16 +19,15 @@ class Plugins {
$func = argv(2) . '_plugin_admin_post';
$func($a);
}
-
- goaway(z_root() . '/admin/plugins/' . argv(2) );
+ goaway(z_root() . '/admin/plugins/' . argv(2) );
}
elseif(argc() > 2) {
switch(argv(2)) {
case 'updaterepo':
if (array_key_exists('repoName', $_REQUEST)) {
$repoName = $_REQUEST['repoName'];
- }
+ }
else {
json_return_and_die(array('message' => 'No repo name provided.', 'success' => false));
}
@@ -101,16 +104,15 @@ class Plugins {
logger('Repo directory not writable to web server: ' . $repoDir);
json_return_and_die(array('message' => 'Repo directory not writable to web server.', 'success' => false));
}
- // TODO: remove directory and unlink /addon/files
+ /// @TODO remove directory and unlink /addon/files
if (rrmdir($repoDir)) {
json_return_and_die(array('message' => 'Repo deleted.', 'success' => true));
} else {
json_return_and_die(array('message' => 'Error deleting addon repo.', 'success' => false));
}
case 'installrepo':
- require_once('library/markdown.php');
if (array_key_exists('repoURL', $_REQUEST)) {
- require_once('library/PHPGit.autoload.php'); // Load PHPGit dependencies
+ require_once('library/PHPGit.autoload.php'); // Load PHPGit dependencies
$repoURL = $_REQUEST['repoURL'];
$extendDir = 'store/[data]/git/sys/extend';
$addonDir = $extendDir . '/addon';
@@ -170,9 +172,8 @@ class Plugins {
json_return_and_die(array('repo' => $repo, 'message' => '', 'success' => true));
}
case 'addrepo':
- require_once('library/markdown.php');
if (array_key_exists('repoURL', $_REQUEST)) {
- require_once('library/PHPGit.autoload.php'); // Load PHPGit dependencies
+ require_once('library/PHPGit.autoload.php'); // Load PHPGit dependencies
$repoURL = $_REQUEST['repoURL'];
$extendDir = 'store/[data]/git/sys/extend';
$addonDir = $extendDir . '/addon';
@@ -225,7 +226,7 @@ class Plugins {
$repo['readme'] = $repo['manifest'] = null;
foreach ($git->git->tree('master') as $object) {
if ($object['type'] == 'blob' && (strtolower($object['file']) === 'readme.md' || strtolower($object['file']) === 'readme')) {
- $repo['readme'] = Markdown($git->git->cat->blob($object['hash']));
+ $repo['readme'] = MarkdownExtra::defaultTransform($git->git->cat->blob($object['hash']));
} else if ($object['type'] == 'blob' && strtolower($object['file']) === 'manifest.json') {
$repo['manifest'] = $git->git->cat->blob($object['hash']);
}
@@ -241,7 +242,11 @@ class Plugins {
}
}
-
+ /**
+ * @brief Plugins admin page.
+ *
+ * @return string with parsed HTML
+ */
function get() {
/*
@@ -254,13 +259,13 @@ class Plugins {
notice( t("Item not found.") );
return '';
}
-
+
$enabled = in_array($plugin,\App::$plugins);
$info = get_plugin_info($plugin);
$x = check_plugin_versions($info);
-
+
// disable plugins which are installed but incompatible versions
-
+
if($enabled && ! $x) {
$enabled = false;
$idz = array_search($plugin, \App::$plugins);
@@ -271,7 +276,7 @@ class Plugins {
}
}
$info['disabled'] = 1-intval($x);
-
+
if (x($_GET,"a") && $_GET['a']=="t"){
check_form_security_token_redirectOnErr('/admin/plugins', 'admin_plugins', 't');
$pinstalled = false;
@@ -297,9 +302,9 @@ class Plugins {
}
goaway(z_root() . '/admin/plugins' );
}
+
// display plugin details
- require_once('library/markdown.php');
-
+
if (in_array($plugin, \App::$plugins)){
$status = 'on';
$action = t('Disable');
@@ -307,21 +312,21 @@ class Plugins {
$status = 'off';
$action = t('Enable');
}
-
+
$readme = null;
if (is_file("addon/$plugin/README.md")){
$readme = file_get_contents("addon/$plugin/README.md");
- $readme = Markdown($readme);
+ $readme = MarkdownExtra::defaultTransform($readme);
} else if (is_file("addon/$plugin/README")){
$readme = "<pre>". file_get_contents("addon/$plugin/README") ."</pre>";
}
-
+
$admin_form = '';
-
+
$r = q("select * from addon where plugin_admin = 1 and aname = '%s' limit 1",
dbesc($plugin)
);
-
+
if($r) {
@require_once("addon/$plugin/$plugin.php");
if(function_exists($plugin.'_plugin_admin')) {
@@ -329,8 +334,8 @@ class Plugins {
$func($a, $admin_form);
}
}
-
-
+
+
$t = get_markup_template('admin_plugins_details.tpl');
return replace_macros($t, array(
'$title' => t('Administration'),
@@ -338,7 +343,7 @@ class Plugins {
'$toggle' => t('Toggle'),
'$settings' => t('Settings'),
'$baseurl' => z_root(),
-
+
'$plugin' => $plugin,
'$status' => $status,
'$action' => $action,
@@ -351,17 +356,17 @@ class Plugins {
'$str_serverroles' => t('Compatible Server Roles: '),
'$str_requires' => t('Requires: '),
'$disabled' => t('Disabled - version incompatibility'),
-
+
'$admin_form' => $admin_form,
'$function' => 'plugins',
'$screenshot' => '',
'$readme' => $readme,
-
+
'$form_security_token' => get_form_security_token('admin_plugins'),
));
}
-
-
+
+
/*
* List plugins
*/
@@ -374,9 +379,9 @@ class Plugins {
$info = get_plugin_info($id);
$enabled = in_array($id,\App::$plugins);
$x = check_plugin_versions($info);
-
+
// disable plugins which are installed but incompatible versions
-
+
if($enabled && ! $x) {
$enabled = false;
$idz = array_search($id, \App::$plugins);
@@ -387,19 +392,19 @@ class Plugins {
}
}
$info['disabled'] = 1-intval($x);
-
+
$plugins[] = array( $id, (($enabled)?"on":"off") , $info);
}
}
}
-
+
usort($plugins,'self::plugin_sort');
$allowManageRepos = false;
if(is_writable('extend/addon') && is_writable('store/[data]')) {
$allowManageRepos = true;
- }
-
+ }
+
$admin_plugins_add_repo_form= replace_macros(
get_markup_template('admin_plugins_addrepo.tpl'), array(
'$post' => 'admin/plugins/addrepo',
@@ -418,14 +423,14 @@ class Plugins {
'$cancel' => t('Cancel')
)
);
-
+
$reponames = $this->listAddonRepos();
$addonrepos = [];
foreach($reponames as $repo) {
$addonrepos[] = array('name' => $repo, 'description' => '');
- // TODO: Parse repo info to provide more information about repos
+ /// @TODO Parse repo info to provide more information about repos
}
-
+
$t = get_markup_template('admin_plugins.tpl');
return replace_macros($t, array(
'$title' => t('Administration'),
@@ -471,5 +476,4 @@ class Plugins {
return(strcmp(strtolower($a[2]['name']),strtolower($b[2]['name'])));
}
-
} \ No newline at end of file
diff --git a/Zotlabs/Module/Admin/Site.php b/Zotlabs/Module/Admin/Site.php
index b71e63030..d05e70aa9 100644
--- a/Zotlabs/Module/Admin/Site.php
+++ b/Zotlabs/Module/Admin/Site.php
@@ -48,6 +48,10 @@ class Site {
$no_community_page = !((x($_POST,'no_community_page')) ? True : False);
$default_expire_days = ((array_key_exists('default_expire_days',$_POST)) ? intval($_POST['default_expire_days']) : 0);
+ $reply_address = ((array_key_exists('reply_address',$_POST) && trim($_POST['reply_address'])) ? trim($_POST['reply_address']) : 'noreply@' . \App::get_hostname());
+ $from_email = ((array_key_exists('from_email',$_POST) && trim($_POST['from_email'])) ? trim($_POST['from_email']) : 'Administrator@' . \App::get_hostname());
+ $from_email_name = ((array_key_exists('from_email_name',$_POST) && trim($_POST['from_email_name'])) ? trim($_POST['from_email_name']) : \Zotlabs\Lib\System::get_site_name());
+
$verifyssl = ((x($_POST,'verifyssl')) ? True : False);
$proxyuser = ((x($_POST,'proxyuser')) ? notags(trim($_POST['proxyuser'])) : '');
$proxy = ((x($_POST,'proxy')) ? notags(trim($_POST['proxy'])) : '');
@@ -77,8 +81,15 @@ class Site {
set_config('system', 'enable_context_help', $enable_context_help);
set_config('system', 'verify_email', $verify_email);
set_config('system', 'default_expire_days', $default_expire_days);
+ set_config('system', 'reply_address', $reply_address);
+ set_config('system', 'from_email', $from_email);
+ set_config('system', 'from_email_name' , $from_email_name);
+
+
set_config('system', 'techlevel_lock', $techlevel_lock);
+
+
if(! is_null($techlevel))
set_config('system', 'techlevel', $techlevel);
@@ -304,6 +315,10 @@ class Site {
'$login_on_homepage' => array('login_on_homepage', t("Login on Homepage"),((intval($homelogin) || $homelogin === false) ? 1 : '') , t("Present a login box to visitors on the home page if no other content has been configured.")),
'$enable_context_help' => array('enable_context_help', t("Enable context help"),((intval($enable_context_help) === 1 || $enable_context_help === false) ? 1 : 0) , t("Display contextual help for the current page when the help button is pressed.")),
+ '$reply_address' => [ 'reply_address', t('Reply-to email address for system generated email.'), get_config('system','reply_address','noreply@' . \App::get_hostname()),'' ],
+ '$from_email' => [ 'from_email', t('Sender (From) email address for system generated email.'), get_config('system','from_email','Administrator@' . \App::get_hostname()),'' ],
+ '$from_email_name' => [ 'from_email_name', t('Name of email sender for system generated email.'), get_config('system','from_email_name',\Zotlabs\Lib\System::get_site_name()),'' ],
+
'$directory_server' => (($dir_choices) ? array('directory_server', t("Directory Server URL"), get_config('system','directory_server'), t("Default directory server"), $dir_choices) : null),
'$proxyuser' => array('proxyuser', t("Proxy user"), get_config('system','proxyuser'), ""),
diff --git a/Zotlabs/Module/Admin/Themes.php b/Zotlabs/Module/Admin/Themes.php
index fc908ec8b..8e72a1318 100644
--- a/Zotlabs/Module/Admin/Themes.php
+++ b/Zotlabs/Module/Admin/Themes.php
@@ -2,38 +2,41 @@
namespace Zotlabs\Module\Admin;
+use \Michelf\MarkdownExtra;
+/**
+ * @brief Admin area theme settings.
+ */
class Themes {
+ /**
+ * @brief
+ *
+ */
function post() {
$theme = argv(2);
if (is_file("view/theme/$theme/php/config.php")){
require_once("view/theme/$theme/php/config.php");
- // fixme add parent theme if derived
- if (function_exists("theme_admin_post")){
+ /// @FIXME add parent theme if derived
+ if (function_exists('theme_admin_post')){
theme_admin_post($a);
}
}
info(t('Theme settings updated.'));
- if(is_ajax())
+ if(is_ajax())
return;
-
+
goaway(z_root() . '/admin/themes/' . $theme );
}
-
-
-
/**
* @brief Themes admin page.
*
- * @return string
+ * @return string with parsed HTML
*/
-
function get(){
-
$allowed_themes_str = get_config('system', 'allowed_themes');
$allowed_themes_raw = explode(',', $allowed_themes_str);
$allowed_themes = array();
@@ -41,7 +44,7 @@ class Themes {
foreach($allowed_themes_raw as $x)
if(strlen(trim($x)))
$allowed_themes[] = trim($x);
-
+
$themes = array();
$files = glob('view/theme/*');
if($files) {
@@ -53,56 +56,55 @@ class Themes {
$themes[] = array('name' => $f, 'experimental' => $is_experimental, 'supported' => $is_supported, 'allowed' => $is_allowed);
}
}
-
+
if(! count($themes)) {
notice( t('No themes found.'));
return '';
}
-
+
/*
* Single theme
*/
-
+
if (\App::$argc == 3){
$theme = \App::$argv[2];
if(! is_dir("view/theme/$theme")){
notice( t("Item not found.") );
return '';
}
-
+
if (x($_GET,"a") && $_GET['a']=="t"){
check_form_security_token_redirectOnErr('/admin/themes', 'admin_themes', 't');
-
+
// Toggle theme status
-
+
$this->toggle_theme($themes, $theme, $result);
$s = $this->rebuild_theme_table($themes);
if($result)
info( sprintf('Theme %s enabled.', $theme));
else
info( sprintf('Theme %s disabled.', $theme));
-
+
set_config('system', 'allowed_themes', $s);
goaway(z_root() . '/admin/themes' );
}
-
+
// display theme details
- require_once('library/markdown.php');
-
+
if ($this->theme_status($themes,$theme)) {
$status="on"; $action= t("Disable");
} else {
$status="off"; $action= t("Enable");
}
-
+
$readme=Null;
if (is_file("view/theme/$theme/README.md")){
$readme = file_get_contents("view/theme/$theme/README.md");
- $readme = Markdown($readme);
+ $readme = MarkdownExtra::defaultTransform($readme);
} else if (is_file("view/theme/$theme/README")){
- $readme = "<pre>". file_get_contents("view/theme/$theme/README") ."</pre>";
+ $readme = '<pre>'. file_get_contents("view/theme/$theme/README") .'</pre>';
}
-
+
$admin_form = '';
if (is_file("view/theme/$theme/php/config.php")){
require_once("view/theme/$theme/php/config.php");
@@ -110,11 +112,11 @@ class Themes {
$admin_form = theme_admin($a);
}
}
-
+
$screenshot = array( get_theme_screenshot($theme), t('Screenshot'));
if(! stristr($screenshot[0],$theme))
$screenshot = null;
-
+
$t = get_markup_template('admin_plugins_details.tpl');
return replace_macros($t, array(
'$title' => t('Administration'),
@@ -122,7 +124,7 @@ class Themes {
'$toggle' => t('Toggle'),
'$settings' => t('Settings'),
'$baseurl' => z_root(),
-
+
'$plugin' => $theme,
'$status' => $status,
'$action' => $action,
@@ -133,22 +135,22 @@ class Themes {
'$str_maintainer' => t('Maintainer: '),
'$screenshot' => $screenshot,
'$readme' => $readme,
-
+
'$form_security_token' => get_form_security_token('admin_themes'),
));
}
-
+
/*
* List themes
*/
-
+
$xthemes = array();
if($themes) {
foreach($themes as $th) {
$xthemes[] = array($th['name'],(($th['allowed']) ? "on" : "off"), get_theme_info($th['name']));
}
}
-
+
$t = get_markup_template('admin_plugins.tpl');
return replace_macros($t, array(
'$title' => t('Administration'),
@@ -162,13 +164,14 @@ class Themes {
'$form_security_token' => get_form_security_token('admin_themes'),
));
}
-
/**
- * @param array $themes
- * @param string $th
- * @param int $result
+ * @brief Toggle a theme.
+ *
+ * @param array &$themes
+ * @param[in] string $th
+ * @param[out] int &$result
*/
function toggle_theme(&$themes, $th, &$result) {
for($x = 0; $x < count($themes); $x ++) {
@@ -184,7 +187,7 @@ class Themes {
}
}
}
-
+
/**
* @param array $themes
* @param string $th
@@ -203,8 +206,7 @@ class Themes {
}
return 0;
}
-
-
+
/**
* @param array $themes
* @return string
@@ -222,12 +224,5 @@ class Themes {
}
return $o;
}
-
-
-
-
-
-
-
}
diff --git a/Zotlabs/Module/Bookmarks.php b/Zotlabs/Module/Bookmarks.php
index 733bfd4e3..682f8e76c 100644
--- a/Zotlabs/Module/Bookmarks.php
+++ b/Zotlabs/Module/Bookmarks.php
@@ -68,7 +68,8 @@ class Bookmarks extends \Zotlabs\Web\Controller {
$channel = \App::get_channel();
- $o = profile_tabs($a,true,$channel['channel_address']);
+ //$o = profile_tabs($a,true,$channel['channel_address']);
+ $o = '';
$o .= '<div class="generic-content-wrapper-styled">';
diff --git a/Zotlabs/Module/Cal.php b/Zotlabs/Module/Cal.php
index b982d19a8..41676ce02 100644
--- a/Zotlabs/Module/Cal.php
+++ b/Zotlabs/Module/Cal.php
@@ -86,7 +86,8 @@ class Cal extends \Zotlabs\Web\Controller {
$o = '';
- $tabs = profile_tabs($a, True, $channel['channel_address']);
+ //$tabs = profile_tabs($a, True, $channel['channel_address']);
+ $tabs = '';
$mode = 'view';
$y = 0;
diff --git a/Zotlabs/Module/Channel.php b/Zotlabs/Module/Channel.php
index 0d20e0080..61df35a60 100644
--- a/Zotlabs/Module/Channel.php
+++ b/Zotlabs/Module/Channel.php
@@ -121,7 +121,7 @@ class Channel extends \Zotlabs\Web\Controller {
$static = channel_manual_conv_update(\App::$profile['profile_uid']);
- $o .= profile_tabs($a, $is_owner, \App::$profile['channel_address']);
+ //$o .= profile_tabs($a, $is_owner, \App::$profile['channel_address']);
$o .= common_friends_visitor_widget(\App::$profile['profile_uid']);
@@ -321,6 +321,7 @@ class Channel extends \Zotlabs\Web\Controller {
'$static' => $static,
'$page' => ((\App::$pager['page'] != 1) ? \App::$pager['page'] : 1),
'$search' => '',
+ '$xchan' => '',
'$order' => '',
'$list' => ((x($_REQUEST,'list')) ? intval($_REQUEST['list']) : 0),
'$file' => '',
diff --git a/Zotlabs/Module/Chat.php b/Zotlabs/Module/Chat.php
index febfd51e5..23a3e65da 100644
--- a/Zotlabs/Module/Chat.php
+++ b/Zotlabs/Module/Chat.php
@@ -210,7 +210,8 @@ class Chat extends \Zotlabs\Web\Controller {
require_once('include/conversation.php');
- $o = profile_tabs($a,((local_channel() && local_channel() == \App::$profile['profile_uid']) ? true : false),\App::$profile['channel_address']);
+ //$o = profile_tabs($a,((local_channel() && local_channel() == \App::$profile['profile_uid']) ? true : false),\App::$profile['channel_address']);
+ $o = '';
if(! feature_enabled(\App::$profile['profile_uid'],'ajaxchat')) {
notice( t('Feature disabled.') . EOL);
diff --git a/Zotlabs/Module/Cloud.php b/Zotlabs/Module/Cloud.php
index 2b6d7bcbe..7370eeda3 100644
--- a/Zotlabs/Module/Cloud.php
+++ b/Zotlabs/Module/Cloud.php
@@ -60,11 +60,9 @@ class Cloud extends \Zotlabs\Web\Controller {
$_SERVER['QUERY_STRING'] = str_replace(array('?f=', '&f='), array('', ''), $_SERVER['QUERY_STRING']);
$_SERVER['QUERY_STRING'] = strip_zids($_SERVER['QUERY_STRING']);
- $_SERVER['QUERY_STRING'] = preg_replace('/[\?&]davguest=(.*?)([\?&]|$)/ism', '', $_SERVER['QUERY_STRING']);
$_SERVER['REQUEST_URI'] = str_replace(array('?f=', '&f='), array('', ''), $_SERVER['REQUEST_URI']);
$_SERVER['REQUEST_URI'] = strip_zids($_SERVER['REQUEST_URI']);
- $_SERVER['REQUEST_URI'] = preg_replace('/[\?&]davguest=(.*?)([\?&]|$)/ism', '', $_SERVER['REQUEST_URI']);
$rootDirectory = new \Zotlabs\Storage\Directory('/', $auth);
diff --git a/Zotlabs/Module/Connections.php b/Zotlabs/Module/Connections.php
index e8a92e8b7..b079ae860 100644
--- a/Zotlabs/Module/Connections.php
+++ b/Zotlabs/Module/Connections.php
@@ -5,10 +5,6 @@ namespace Zotlabs\Module;
require_once('include/socgraph.php');
require_once('include/selectors.php');
require_once('include/group.php');
-require_once('include/contact_widgets.php');
-require_once('include/zot.php');
-require_once('include/widgets.php');
-
class Connections extends \Zotlabs\Web\Controller {
diff --git a/Zotlabs/Module/Connedit.php b/Zotlabs/Module/Connedit.php
index 7a753c286..484e69b52 100644
--- a/Zotlabs/Module/Connedit.php
+++ b/Zotlabs/Module/Connedit.php
@@ -11,9 +11,6 @@ namespace Zotlabs\Module;
require_once('include/socgraph.php');
require_once('include/selectors.php');
require_once('include/group.php');
-require_once('include/contact_widgets.php');
-require_once('include/zot.php');
-require_once('include/widgets.php');
require_once('include/photos.php');
@@ -391,30 +388,22 @@ class Connedit extends \Zotlabs\Web\Controller {
$section = ((array_key_exists('section',$_REQUEST)) ? $_REQUEST['section'] : '');
$channel = \App::get_channel();
- $my_perms = get_channel_default_perms(local_channel());
- $role = get_pconfig(local_channel(),'system','permissions_role');
- if($role) {
- $x = \Zotlabs\Access\PermissionRoles::role_perms($role);
- if($x['perms_connect'])
- $my_perms = $x['perms_connect'];
- }
$yes_no = array(t('No'),t('Yes'));
- if($my_perms) {
- $o .= "<script>function connectDefaultShare() {
- \$('.abook-edit-me').each(function() {
- if(! $(this).is(':disabled'))
- $(this).prop('checked', false);
- });\n\n";
- $perms = get_perms();
- foreach($perms as $p => $v) {
- if($my_perms & $v[1]) {
- $o .= "\$('#me_id_perms_" . $p . "').prop('checked', true); \n";
- }
+ $connect_perms = \Zotlabs\Access\Permissions::connect_perms(local_channel());
+
+ $o .= "<script>function connectDefaultShare() {
+ \$('.abook-edit-me').each(function() {
+ if(! $(this).is(':disabled'))
+ $(this).prop('checked', false);
+ });\n\n";
+ foreach($connect_perms['perms'] as $p => $v) {
+ if($v) {
+ $o .= "\$('#me_id_perms_" . $p . "').prop('checked', true); \n";
}
- $o .= " }\n</script>\n";
}
+ $o .= " }\n</script>\n";
if(argc() == 3) {
@@ -441,6 +430,34 @@ class Connedit extends \Zotlabs\Web\Controller {
goaway(z_root() . '/connedit/' . $contact_id);
}
+
+ if($cmd === 'fetchvc') {
+ $url = str_replace('/channel/','/profile/',$orig_record[0]['xchan_url']) . '/vcard';
+ $recurse = 0;
+ $x = z_fetch_url(zid($url),false,$recurse,['session' => true]);
+ if($x['success']) {
+ $h = new \Zotlabs\Web\HTTPHeaders($x['header']);
+ $fields = $h->fetch();
+ if($fields) {
+ foreach($fields as $y) {
+ if(array_key_exists('content-type',$y)) {
+ $type = explode(';',trim($y['content-type']));
+ if($type && $type[0] === 'text/vcard' && $x['body']) {
+ $vc = \Sabre\VObject\Reader::read($x['body']);
+ $vcard = $vc->serialize();
+ if($vcard) {
+ set_abconfig(local_channel(),$orig_record[0]['abook_xchan'],'system','vcard',$vcard);
+ $this->connedit_clone($a);
+ }
+ }
+ }
+ }
+ }
+ }
+ goaway(z_root() . '/connedit/' . $contact_id);
+ }
+
+
if($cmd === 'resetphoto') {
q("update xchan set xchan_photo_date = '2001-01-01 00:00:00' where xchan_hash = '%s'",
dbesc($orig_record[0]['xchan_hash'])
@@ -582,6 +599,13 @@ class Connedit extends \Zotlabs\Web\Controller {
'sel' => '',
'title' => t('Fetch updated permissions'),
),
+
+ 'rephoto' => array(
+ 'label' => t('Refresh Photo'),
+ 'url' => z_root() . '/connedit/' . $contact['abook_id'] . '/resetphoto',
+ 'sel' => '',
+ 'title' => t('Fetch updated photo'),
+ ),
'recent' => array(
'label' => t('Recent Activity'),
@@ -631,6 +655,17 @@ class Connedit extends \Zotlabs\Web\Controller {
);
+
+ if($contact['xchan_network'] === 'zot') {
+ $tools['fetchvc'] = [
+ 'label' => t('Fetch Vcard'),
+ 'url' => z_root() . '/connedit/' . $contact['abook_id'] . '/fetchvc',
+ 'sel' => '',
+ 'title' => t('Fetch electronic calling card for this connection')
+ ];
+ }
+
+
$sections = [];
$sections['perms'] = [
diff --git a/Zotlabs/Module/Cover_photo.php b/Zotlabs/Module/Cover_photo.php
index 72ec1020d..47bce6c2b 100644
--- a/Zotlabs/Module/Cover_photo.php
+++ b/Zotlabs/Module/Cover_photo.php
@@ -23,19 +23,17 @@ require_once('include/channel.php');
class Cover_photo extends \Zotlabs\Web\Controller {
function init() {
-
if(! local_channel()) {
return;
}
$channel = \App::get_channel();
- profile_load($channel['channel_address']);
-
+ profile_load($channel['channel_address']);
}
- /* @brief Evaluate posted values
+ /**
+ * @brief Evaluate posted values
*
- * @param $a Current application
* @return void
*
*/
@@ -130,8 +128,15 @@ class Cover_photo extends \Zotlabs\Web\Controller {
$aid = get_account_id();
- $p = array('aid' => $aid, 'uid' => local_channel(), 'resource_id' => $base_image['resource_id'],
- 'filename' => $base_image['filename'], 'album' => t('Cover Photos'));
+ $p = [
+ 'aid' => $aid,
+ 'uid' => local_channel(),
+ 'resource_id' => $base_image['resource_id'],
+ 'filename' => $base_image['filename'],
+ 'album' => t('Cover Photos'),
+ 'os_path' => $base_image['os_path'],
+ 'display_path' => $base_image['display_path']
+ ];
$p['imgscale'] = 7;
$p['photo_usage'] = PHOTO_COVER;
@@ -195,11 +200,10 @@ class Cover_photo extends \Zotlabs\Web\Controller {
$os_storage = false;
foreach($i as $ii) {
- $smallest = intval($ii['imgscale']);
+ $smallest = intval($ii['imgscale']);
$os_storage = intval($ii['os_storage']);
- $imagedata = $ii['content'];
- $filetype = $ii['mimetype'];
-
+ $imagedata = $ii['content'];
+ $filetype = $ii['mimetype'];
}
}
@@ -263,10 +267,10 @@ class Cover_photo extends \Zotlabs\Web\Controller {
}
- /* @brief Generate content of profile-photo view
+ /**
+ * @brief Generate content of profile-photo view
*
- * @param $a Current application
- * @return void
+ * @return string
*
*/
@@ -350,15 +354,15 @@ class Cover_photo extends \Zotlabs\Web\Controller {
$tpl = get_markup_template('cover_photo.tpl');
$o .= replace_macros($tpl,array(
- '$user' => \App::$channel['channel_address'],
- '$lbl_upfile' => t('Upload File:'),
- '$lbl_profiles' => t('Select a profile:'),
- '$title' => t('Upload Cover Photo'),
- '$submit' => t('Upload'),
- '$profiles' => $profiles,
+ '$user' => \App::$channel['channel_address'],
+ '$lbl_upfile' => t('Upload File:'),
+ '$lbl_profiles' => t('Select a profile:'),
+ '$title' => t('Upload Cover Photo'),
+ '$submit' => t('Upload'),
+ '$profiles' => $profiles,
'$form_security_token' => get_form_security_token("cover_photo"),
- // FIXME - yuk
- '$select' => sprintf('%s %s', t('or'), ($newuser) ? '<a href="' . z_root() . '">' . t('skip this step') . '</a>' : '<a href="'. z_root() . '/photos/' . \App::$channel['channel_address'] . '">' . t('select a photo from your photo albums') . '</a>')
+ /// @FIXME - yuk
+ '$select' => sprintf('%s %s', t('or'), ($newuser) ? '<a href="' . z_root() . '">' . t('skip this step') . '</a>' : '<a href="'. z_root() . '/photos/' . \App::$channel['channel_address'] . '">' . t('select a photo from your photo albums') . '</a>')
));
call_hooks('cover_photo_content_end', $o);
@@ -370,14 +374,14 @@ class Cover_photo extends \Zotlabs\Web\Controller {
$resolution = 3;
$tpl = get_markup_template("cropcover.tpl");
$o .= replace_macros($tpl,array(
- '$filename' => $filename,
- '$profile' => intval($_REQUEST['profile']),
- '$resource' => \App::$data['imagecrop'] . '-3',
- '$image_url' => z_root() . '/photo/' . $filename,
- '$title' => t('Crop Image'),
- '$desc' => t('Please adjust the image cropping for optimum viewing.'),
+ '$filename' => $filename,
+ '$profile' => intval($_REQUEST['profile']),
+ '$resource' => \App::$data['imagecrop'] . '-3',
+ '$image_url' => z_root() . '/photo/' . $filename,
+ '$title' => t('Crop Image'),
+ '$desc' => t('Please adjust the image cropping for optimum viewing.'),
'$form_security_token' => get_form_security_token("cover_photo"),
- '$done' => t('Done Editing')
+ '$done' => t('Done Editing')
));
return $o;
}
@@ -393,8 +397,6 @@ class Cover_photo extends \Zotlabs\Web\Controller {
*
*/
-
-
function cover_photo_crop_ui_head(&$a, $ph, $hash, $smallest){
$max_length = get_config('system','max_image_length');
diff --git a/Zotlabs/Module/Directory.php b/Zotlabs/Module/Directory.php
index 59ae88857..edcf43cd6 100644
--- a/Zotlabs/Module/Directory.php
+++ b/Zotlabs/Module/Directory.php
@@ -4,7 +4,6 @@ namespace Zotlabs\Module;
require_once('include/socgraph.php');
require_once('include/dir_fns.php');
-require_once('include/widgets.php');
require_once('include/bbcode.php');
diff --git a/Zotlabs/Module/Display.php b/Zotlabs/Module/Display.php
index a4d59a1b6..815672091 100644
--- a/Zotlabs/Module/Display.php
+++ b/Zotlabs/Module/Display.php
@@ -165,6 +165,7 @@ class Display extends \Zotlabs\Web\Controller {
'$page' => ((\App::$pager['page'] != 1) ? \App::$pager['page'] : 1),
'$list' => ((x($_REQUEST,'list')) ? intval($_REQUEST['list']) : 0),
'$search' => '',
+ '$xchan' => '',
'$order' => '',
'$file' => '',
'$cats' => '',
diff --git a/Zotlabs/Module/Editblock.php b/Zotlabs/Module/Editblock.php
index 654e2251d..8a7e87a09 100644
--- a/Zotlabs/Module/Editblock.php
+++ b/Zotlabs/Module/Editblock.php
@@ -98,6 +98,11 @@ class Editblock extends \Zotlabs\Web\Controller {
$mimetype = $itm[0]['mimetype'];
+ $content = $itm[0]['body'];
+ if($itm[0]['mimetype'] === 'text/markdown')
+ $content = \Zotlabs\Lib\MarkdownSoap::unescape($itm[0]['body']);
+
+
$rp = 'blocks/' . $channel['channel_address'];
$x = array(
@@ -117,7 +122,7 @@ class Editblock extends \Zotlabs\Web\Controller {
'ptyp' => $itm[0]['type'],
'mimeselect' => true,
'mimetype' => $itm[0]['mimetype'],
- 'body' => undo_post_tagging($itm[0]['body']),
+ 'body' => undo_post_tagging($content),
'post_id' => $post_id,
'visitor' => true,
'title' => htmlspecialchars($itm[0]['title'],ENT_COMPAT,'UTF-8'),
diff --git a/Zotlabs/Module/Editlayout.php b/Zotlabs/Module/Editlayout.php
index ea637fcba..3d6a79507 100644
--- a/Zotlabs/Module/Editlayout.php
+++ b/Zotlabs/Module/Editlayout.php
@@ -119,6 +119,7 @@ class Editlayout extends \Zotlabs\Web\Controller {
'hide_weblink' => true,
'hide_attach' => true,
'hide_preview' => true,
+ 'disable_comments' => true,
'ptyp' => $itm[0]['obj_type'],
'body' => undo_post_tagging($itm[0]['body']),
'post_id' => $post_id,
diff --git a/Zotlabs/Module/Editpost.php b/Zotlabs/Module/Editpost.php
index d7612b165..629bdd3fd 100644
--- a/Zotlabs/Module/Editpost.php
+++ b/Zotlabs/Module/Editpost.php
@@ -31,7 +31,10 @@ class Editpost extends \Zotlabs\Web\Controller {
dbesc(get_observer_hash())
);
- if(! count($itm)) {
+ // don't allow web editing of potentially binary content (item_obscured = 1)
+ // @FIXME how do we do it instead?
+
+ if((! $itm) || intval($itm[0]['item_obscured'])) {
notice( t('Item is not editable') . EOL);
return;
}
@@ -44,14 +47,6 @@ class Editpost extends \Zotlabs\Web\Controller {
$channel = \App::get_channel();
- if(intval($itm[0]['item_obscured'])) {
- $key = get_config('system','prvkey');
- if($itm[0]['title'])
- $itm[0]['title'] = crypto_unencapsulate(json_decode($itm[0]['title'],true),$key);
- if($itm[0]['body'])
- $itm[0]['body'] = crypto_unencapsulate(json_decode($itm[0]['body'],true),$key);
- }
-
$category = '';
$catsenabled = ((feature_enabled($owner_uid,'categories')) ? 'categories' : '');
diff --git a/Zotlabs/Module/Editwebpage.php b/Zotlabs/Module/Editwebpage.php
index 97f4a32ff..db33cd1db 100644
--- a/Zotlabs/Module/Editwebpage.php
+++ b/Zotlabs/Module/Editwebpage.php
@@ -100,19 +100,14 @@ class Editwebpage extends \Zotlabs\Web\Controller {
intval($owner)
);
- if(! $itm) {
+ // don't allow web editing of potentially binary content (item_obscured = 1)
+ // @FIXME how do we do it instead?
+
+ if((! $itm) || intval($itm[0]['item_obscured'])) {
notice( t('Permission denied.') . EOL);
return;
}
- if(intval($itm[0]['item_obscured'])) {
- $key = get_config('system','prvkey');
- if($itm[0]['title'])
- $itm[0]['title'] = crypto_unencapsulate(json_decode($itm[0]['title'],true),$key);
- if($itm[0]['body'])
- $itm[0]['body'] = crypto_unencapsulate(json_decode($itm[0]['body'],true),$key);
- }
-
$item_id = q("select * from iconfig where cat = 'system' and k = 'WEBPAGE' and iid = %d limit 1",
intval($itm[0]['id'])
);
@@ -129,6 +124,10 @@ class Editwebpage extends \Zotlabs\Web\Controller {
}
$layout = $itm[0]['layout_mid'];
+
+ $content = $itm[0]['body'];
+ if($itm[0]['mimetype'] === 'text/markdown')
+ $content = \Zotlabs\Lib\MarkdownSoap::unescape($itm[0]['body']);
$rp = 'webpages/' . $which;
@@ -145,7 +144,7 @@ class Editwebpage extends \Zotlabs\Web\Controller {
'hide_location' => true,
'hide_voting' => true,
'ptyp' => $itm[0]['type'],
- 'body' => undo_post_tagging($itm[0]['body']),
+ 'body' => undo_post_tagging($content),
'post_id' => $post_id,
'visitor' => ($is_owner) ? true : false,
'acl' => populate_acl($itm[0],false,\Zotlabs\Lib\PermissionDescription::fromGlobalPermission('view_pages')),
diff --git a/Zotlabs/Module/Embedphotos.php b/Zotlabs/Module/Embedphotos.php
index 48667795c..c92af27d6 100644
--- a/Zotlabs/Module/Embedphotos.php
+++ b/Zotlabs/Module/Embedphotos.php
@@ -92,6 +92,7 @@ class Embedphotos extends \Zotlabs\Web\Controller {
* It is a limitation of the photo table using a name for a photo album instead of a folder hash
*/
if($album) {
+ require_once('include/attach.php');
$x = q("select hash from attach where filename = '%s' and uid = %d limit 1",
dbesc($album),
intval($owner_uid)
diff --git a/Zotlabs/Module/Feed.php b/Zotlabs/Module/Feed.php
index 47871eafb..06637b6d2 100644
--- a/Zotlabs/Module/Feed.php
+++ b/Zotlabs/Module/Feed.php
@@ -1,40 +1,41 @@
<?php
+
namespace Zotlabs\Module;
require_once('include/items.php');
-
class Feed extends \Zotlabs\Web\Controller {
function init() {
- $params = array();
-
- $params['begin'] = ((x($_REQUEST,'date_begin')) ? $_REQUEST['date_begin'] : NULL_DATE);
- $params['end'] = ((x($_REQUEST,'date_end')) ? $_REQUEST['date_end'] : '');
- $params['type'] = ((stristr(argv(0),'json')) ? 'json' : 'xml');
- $params['pages'] = ((x($_REQUEST,'pages')) ? intval($_REQUEST['pages']) : 0);
- $params['top'] = ((x($_REQUEST,'top')) ? intval($_REQUEST['top']) : 0);
- $params['start'] = ((x($params,'start')) ? intval($params['start']) : 0);
- $params['records'] = ((x($params,'records')) ? intval($params['records']) : 40);
- $params['direction'] = ((x($params,'direction')) ? dbesc($params['direction']) : 'desc');
- $params['cat'] = ((x($_REQUEST,'cat')) ? escape_tags($_REQUEST['cat']) : '');
-
- $channel = '';
+ $params = [];
+
+ $params['begin'] = ((x($_REQUEST,'date_begin')) ? $_REQUEST['date_begin'] : NULL_DATE);
+ $params['end'] = ((x($_REQUEST,'date_end')) ? $_REQUEST['date_end'] : '');
+ $params['type'] = ((stristr(argv(0),'json')) ? 'json' : 'xml');
+ $params['pages'] = ((x($_REQUEST,'pages')) ? intval($_REQUEST['pages']) : 0);
+ $params['top'] = ((x($_REQUEST,'top')) ? intval($_REQUEST['top']) : 0);
+ $params['start'] = ((x($params,'start')) ? intval($params['start']) : 0);
+ $params['records'] = ((x($params,'records')) ? intval($params['records']) : 40);
+ $params['direction'] = ((x($params,'direction')) ? dbesc($params['direction']) : 'desc');
+ $params['cat'] = ((x($_REQUEST,'cat')) ? escape_tags($_REQUEST['cat']) : '');
+ $params['compat'] = ((x($_REQUEST,'compat')) ? intval($_REQUEST['compat']) : 0);
+
+
if(argc() > 1) {
- $r = q("select * from channel left join xchan on channel_hash = xchan_hash where channel_address = '%s' limit 1",
- dbesc(argv(1))
- );
- if(!($r && count($r)))
+
+ if(observer_prohibited(true)) {
killme();
-
- $channel = $r[0];
-
- if(observer_prohibited(true))
+ }
+
+ $channel = channelx_by_nick(argv(1));
+ if(! $channel) {
killme();
+ }
+
- logger('mod_feed: public feed request from ' . $_SERVER['REMOTE_ADDR'] . ' for ' . $channel['channel_address']);
+ logger('public feed request from ' . $_SERVER['REMOTE_ADDR'] . ' for ' . $channel['channel_address']);
echo get_public_feed($channel,$params);
@@ -43,6 +44,4 @@ class Feed extends \Zotlabs\Web\Controller {
}
-
-
}
diff --git a/Zotlabs/Module/File_upload.php b/Zotlabs/Module/File_upload.php
index 769134808..29a7bd137 100644
--- a/Zotlabs/Module/File_upload.php
+++ b/Zotlabs/Module/File_upload.php
@@ -28,11 +28,12 @@ class File_upload extends \Zotlabs\Web\Controller {
$_REQUEST['group_deny'] = expand_acl($channel['channel_deny_gid']);
}
+ $_REQUEST['allow_cid'] = perms2str($_REQUEST['contact_allow']);
+ $_REQUEST['allow_gid'] = perms2str($_REQUEST['group_allow']);
+ $_REQUEST['deny_cid'] = perms2str($_REQUEST['contact_deny']);
+ $_REQUEST['deny_gid'] = perms2str($_REQUEST['group_deny']);
+
if($_REQUEST['filename']) {
- $_REQUEST['allow_cid'] = perms2str($_REQUEST['contact_allow']);
- $_REQUEST['allow_gid'] = perms2str($_REQUEST['group_allow']);
- $_REQUEST['deny_cid'] = perms2str($_REQUEST['contact_deny']);
- $_REQUEST['deny_gid'] = perms2str($_REQUEST['group_deny']);
$r = attach_mkdir($channel,get_observer_hash(),$_REQUEST);
}
else {
diff --git a/Zotlabs/Module/Filer.php b/Zotlabs/Module/Filer.php
index 6a57cdb2a..af59f28fb 100644
--- a/Zotlabs/Module/Filer.php
+++ b/Zotlabs/Module/Filer.php
@@ -49,8 +49,10 @@ class Filer extends \Zotlabs\Web\Controller {
}
$tpl = get_markup_template("filer_dialog.tpl");
$o = replace_macros($tpl, array(
- '$field' => array('term', t("Save to Folder:"), '', '', $filetags, t('- select -')),
+ '$field' => array('term', t('Enter a folder name'), '', '', $filetags, 'placeholder="' . t('or select an existing folder (doubleclick)') . '"'),
'$submit' => t('Save'),
+ '$title' => t('Save to Folder'),
+ '$cancel' => t('Cancel')
));
echo $o;
diff --git a/Zotlabs/Module/Filestorage.php b/Zotlabs/Module/Filestorage.php
index 874445145..785dff394 100644
--- a/Zotlabs/Module/Filestorage.php
+++ b/Zotlabs/Module/Filestorage.php
@@ -130,7 +130,7 @@ class Filestorage extends \Zotlabs\Web\Controller {
$f = $r[0];
$channel = \App::get_channel();
- $cloudpath = get_cloudpath($f) . (intval($f['is_dir']) ? '?f=&davguest=1' : '');
+ $cloudpath = get_cloudpath($f);
$parentpath = get_parent_cloudpath($channel['channel_id'], $channel['channel_address'], $f['hash']);
$aclselect_e = populate_acl($f, false, \Zotlabs\Lib\PermissionDescription::fromGlobalPermission('view_storage'));
diff --git a/Zotlabs/Module/Hcard.php b/Zotlabs/Module/Hcard.php
index ec9181f6a..13097939e 100644
--- a/Zotlabs/Module/Hcard.php
+++ b/Zotlabs/Module/Hcard.php
@@ -59,12 +59,10 @@ class Hcard extends \Zotlabs\Web\Controller {
}
- function get() {
-
- require_once('include/widgets.php');
- return widget_profile(array());
-
-
+ function get() {
+
+ $x = new \Zotlabs\Widget\Profile();
+ return $x->widget(array());
}
diff --git a/Zotlabs/Module/Impel.php b/Zotlabs/Module/Impel.php
index 197d9f859..77f488d26 100644
--- a/Zotlabs/Module/Impel.php
+++ b/Zotlabs/Module/Impel.php
@@ -144,18 +144,8 @@ class Impel extends \Zotlabs\Web\Controller {
// Verify ability to use html or php!!!
- $execflag = false;
-
- if($arr['mimetype'] === 'application/x-php') {
- $z = q("select account_id, account_roles, channel_pageflags from account left join channel on channel_account_id = account_id where channel_id = %d limit 1",
- intval(local_channel())
- );
-
- if($z && (($z[0]['account_roles'] & ACCOUNT_ROLE_ALLOWCODE) || ($z[0]['channel_pageflags'] & PAGE_ALLOWCODE))) {
- $execflag = true;
- }
- }
-
+ $execflag = ((intval($channel['channel_id']) == intval(local_channel()) && ($channel['channel_pageflags'] & PAGE_ALLOWCODE)) ? true : false);
+
$i = q("select id, edited, item_deleted from item where mid = '%s' and uid = %d limit 1",
dbesc($arr['mid']),
intval(local_channel())
diff --git a/Zotlabs/Module/Import.php b/Zotlabs/Module/Import.php
index 3969f25e0..ce3fd469a 100644
--- a/Zotlabs/Module/Import.php
+++ b/Zotlabs/Module/Import.php
@@ -2,26 +2,32 @@
namespace Zotlabs\Module;
-// Import a channel, either by direct file upload or via
-// connection to original server.
-
-
require_once('include/zot.php');
require_once('include/channel.php');
require_once('include/import.php');
require_once('include/perm_upgrade.php');
-
+/**
+ * @brief Module for channel import.
+ *
+ * Import a channel, either by direct file upload or via
+ * connection to another server.
+ */
class Import extends \Zotlabs\Web\Controller {
+ /**
+ * @brief Import channel into account.
+ *
+ * @param int $account_id
+ */
function import_account($account_id) {
-
+
if(! $account_id){
- logger("import_account: No account ID supplied");
+ logger('No account ID supplied');
return;
}
-
+
$max_friends = account_service_class_fetch($account_id,'total_channels');
$max_feeds = account_service_class_fetch($account_id,'total_feeds');
$data = null;
@@ -32,35 +38,39 @@ class Import extends \Zotlabs\Web\Controller {
$filename = basename($_FILES['filename']['name']);
$filesize = intval($_FILES['filename']['size']);
$filetype = $_FILES['filename']['type'];
-
+ // import channel from file
if($src) {
-
- // This is OS specific and could also fail if your tmpdir isn't very large
- // mostly used for Diaspora which exports gzipped files.
-
+
+ // This is OS specific and could also fail if your tmpdir isn't very
+ // large mostly used for Diaspora which exports gzipped files.
+
if(strpos($filename,'.gz')){
@rename($src,$src . '.gz');
@system('gunzip ' . escapeshellarg($src . '.gz'));
}
-
+
if($filesize) {
$data = @file_get_contents($src);
}
unlink($src);
}
-
+
+ // import channel from another server
if(! $src) {
$old_address = ((x($_REQUEST,'old_address')) ? $_REQUEST['old_address'] : '');
if(! $old_address) {
- logger('mod_import: nothing to import.');
+ logger('Nothing to import.');
notice( t('Nothing to import.') . EOL);
return;
+ } else if(strpos($old_address, 'ï¼ ')) {
+ // if you copy the identity address from your profile page, make it work for convenience
+ $old_address = str_replace('ï¼ ', '@', $old_address);
}
-
+
$email = ((x($_REQUEST,'email')) ? $_REQUEST['email'] : '');
$password = ((x($_REQUEST,'password')) ? $_REQUEST['password'] : '');
-
+
$channelname = substr($old_address,0,strpos($old_address,'@'));
$servername = substr($old_address,strpos($old_address,'@')+1);
@@ -73,6 +83,7 @@ class Import extends \Zotlabs\Web\Controller {
$api_path .= 'channel/export/basic?f=&channel=' . $channelname;
if($import_posts)
$api_path .= '&posts=1';
+
$binary = false;
$redirects = 0;
$opts = array('http_auth' => $email . ':' . $password);
@@ -85,19 +96,18 @@ class Import extends \Zotlabs\Web\Controller {
return;
}
}
-
+
if(! $data) {
- logger('mod_import: empty file.');
+ logger('Empty import file.');
notice( t('Imported file is empty.') . EOL);
return;
}
-
+
$data = json_decode($data,true);
-
- // logger('import: data: ' . print_r($data,true));
- // print_r($data);
-
-
+
+ //logger('import: data: ' . print_r($data,true));
+ //print_r($data);
+
if(! array_key_exists('compatibility',$data)) {
call_hooks('import_foreign_channel_data',$data);
if($data['handled'])
@@ -108,24 +118,24 @@ class Import extends \Zotlabs\Web\Controller {
$v1 = substr($data['compatibility']['database'],-4);
$v2 = substr(DB_UPDATE_VERSION,-4);
if($v2 > $v1) {
- $t = sprintf( t('Warning: Database versions differ by %1$d updates.'), $v2 - $v1 );
+ $t = sprintf( t('Warning: Database versions differ by %1$d updates.'), $v2 - $v1 );
notice($t);
}
if(array_key_exists('server_role',$data['compatibility']) && $data['compatibility']['server_role'] == 'basic')
$moving = true;
}
-
+
if($moving)
$seize = 1;
-
+
// import channel
-
+
$relocate = ((array_key_exists('relocate',$data)) ? $data['relocate'] : null);
if(array_key_exists('channel',$data)) {
-
+
$max_identities = account_service_class_fetch($account_id,'total_identities');
-
+
if($max_identities !== false) {
$r = q("select channel_id from channel where channel_account_id = %d",
intval($account_id)
@@ -137,46 +147,40 @@ class Import extends \Zotlabs\Web\Controller {
}
$channel = import_channel($data['channel'], $account_id, $seize);
-
}
else {
$moving = false;
$channel = \App::get_channel();
}
-
+
if(! $channel) {
- logger('mod_import: channel not found. ', print_r($channel,true));
+ logger('Channel not found. ', print_r($channel,true));
notice( t('No channel. Import failed.') . EOL);
return;
}
-
-
if(is_array($data['config'])) {
import_config($channel,$data['config']);
}
-
+
logger('import step 2');
-
-
-
if(array_key_exists('channel',$data)) {
if($data['photo']) {
require_once('include/photo/photo_driver.php');
import_channel_photo(base64url_decode($data['photo']['data']),$data['photo']['type'],$account_id,$channel['channel_id']);
}
-
+
if(is_array($data['profile']))
import_profiles($channel,$data['profile']);
}
-
+
logger('import step 3');
-
+
if(is_array($data['hubloc'])) {
import_hublocs($channel,$data['hubloc'],$seize,$moving);
}
-
+
logger('import step 4');
// create new hubloc for the new channel at this site
@@ -200,7 +204,7 @@ class Import extends \Zotlabs\Web\Controller {
);
// reset the original primary hubloc if it is being seized
-
+
if($seize) {
$r = q("update hubloc set hubloc_primary = 0 where hubloc_primary = 1 and hubloc_hash = '%s' and hubloc_url != '%s' ",
dbesc($channel['channel_hash']),
@@ -210,20 +214,18 @@ class Import extends \Zotlabs\Web\Controller {
}
logger('import step 5');
-
-
-
+
+
// import xchans and contact photos
-
+
if(array_key_exists('channel',$data) && $seize) {
-
+
// replace any existing xchan we may have on this site if we're seizing control
-
+
$r = q("delete from xchan where xchan_hash = '%s'",
dbesc($channel['channel_hash'])
);
-
$r = xchan_store_lowlevel(
[
'xchan_hash' => $channel['channel_hash'],
@@ -242,23 +244,22 @@ class Import extends \Zotlabs\Web\Controller {
'xchan_photo_date' => datetime_convert(),
'xchan_name_date' => datetime_convert()
]
- );
+ );
}
-
+
logger('import step 6');
-
-
+ // import xchans
$xchans = $data['xchan'];
if($xchans) {
foreach($xchans as $xchan) {
-
+
$hash = make_xchan_hash($xchan['xchan_guid'],$xchan['xchan_guid_sig']);
if($xchan['xchan_network'] === 'zot' && $hash !== $xchan['xchan_hash']) {
logger('forged xchan: ' . print_r($xchan,true));
continue;
}
-
+
if(! array_key_exists('xchan_hidden',$xchan)) {
$xchan['xchan_hidden'] = (($xchan['xchan_flags'] & 0x0001) ? 1 : 0);
$xchan['xchan_orphan'] = (($xchan['xchan_flags'] & 0x0002) ? 1 : 0);
@@ -268,22 +269,22 @@ class Import extends \Zotlabs\Web\Controller {
$xchan['xchan_pubforum'] = (($xchan['xchan_flags'] & 0x0020) ? 1 : 0);
$xchan['xchan_deleted'] = (($xchan['xchan_flags'] & 0x1000) ? 1 : 0);
}
-
+
$r = q("select xchan_hash from xchan where xchan_hash = '%s' limit 1",
dbesc($xchan['xchan_hash'])
);
if($r)
continue;
- create_table_from_array('xchan',$xchan);
-
+ create_table_from_array('xchan',$xchan);
+
require_once('include/photo/photo_driver.php');
$photos = import_xchan_photo($xchan['xchan_photo_l'],$xchan['xchan_hash']);
if($photos[4])
$photodate = NULL_DATE;
else
$photodate = $xchan['xchan_photo_date'];
-
+
$r = q("update xchan set xchan_photo_l = '%s', xchan_photo_m = '%s', xchan_photo_s = '%s', xchan_photo_mimetype = '%s', xchan_photo_date = '%s' where xchan_hash = '%s'",
dbesc($photos[0]),
dbesc($photos[1]),
@@ -292,33 +293,32 @@ class Import extends \Zotlabs\Web\Controller {
dbesc($photodate),
dbesc($xchan['xchan_hash'])
);
-
}
- logger('import step 7');
+ logger('import step 7');
}
-
$friends = 0;
$feeds = 0;
-
+
// import contacts
$abooks = $data['abook'];
if($abooks) {
foreach($abooks as $abook) {
$abook_copy = $abook;
-
+
$abconfig = null;
if(array_key_exists('abconfig',$abook) && is_array($abook['abconfig']) && count($abook['abconfig']))
$abconfig = $abook['abconfig'];
-
+
unset($abook['abook_id']);
unset($abook['abook_rating']);
unset($abook['abook_rating_text']);
unset($abook['abconfig']);
unset($abook['abook_their_perms']);
unset($abook['abook_my_perms']);
+ unset($abook['abook_not_here']);
$abook['abook_account'] = $account_id;
$abook['abook_channel'] = $channel['channel_id'];
@@ -332,7 +332,7 @@ class Import extends \Zotlabs\Web\Controller {
$abook['abook_self'] = (($abook['abook_flags'] & 0x0080 ) ? 1 : 0);
$abook['abook_feed'] = (($abook['abook_flags'] & 0x0100 ) ? 1 : 0);
}
-
+
if($abook['abook_self']) {
$role = get_pconfig($channel['channel_id'],'system','permissions_role');
if(($role === 'forum') || ($abook['abook_my_perms'] & PERMS_W_TAGWALL)) {
@@ -340,24 +340,24 @@ class Import extends \Zotlabs\Web\Controller {
dbesc($abook['abook_xchan'])
);
}
- }
+ }
else {
if($max_friends !== false && $friends > $max_friends)
continue;
if($max_feeds !== false && intval($abook['abook_feed']) && ($feeds > $max_feeds))
continue;
}
-
- create_table_from_array('abook',$abook);
+
+ abook_store_lowlevel($abook);
$friends ++;
if(intval($abook['abook_feed']))
$feeds ++;
translate_abook_perms_inbound($channel,$abook_copy);
-
+
if($abconfig) {
- // @fixme does not handle sync of del_abconfig
+ /// @FIXME does not handle sync of del_abconfig
foreach($abconfig as $abc) {
set_abconfig($channel['channel_id'],$abc['xchan'],$abc['cat'],$abc['k'],$abc['v']);
}
@@ -366,20 +366,21 @@ class Import extends \Zotlabs\Web\Controller {
logger('import step 8');
}
-
+
+ // import groups
$groups = $data['group'];
if($groups) {
$saved = array();
foreach($groups as $group) {
$saved[$group['hash']] = array('old' => $group['id']);
- if(array_key_exists('name',$group)) {
+ if(array_key_exists('name', $group)) {
$group['gname'] = $group['name'];
unset($group['name']);
}
unset($group['id']);
$group['uid'] = $channel['channel_id'];
- create_table_from_array('groups',$group);
+ create_table_from_array('groups', $group);
}
$r = q("select * from groups where uid = %d",
intval($channel['channel_id'])
@@ -388,10 +389,10 @@ class Import extends \Zotlabs\Web\Controller {
foreach($r as $rr) {
$saved[$rr['hash']]['new'] = $rr['id'];
}
- }
+ }
}
-
-
+
+ // import group members
$group_members = $data['group_member'];
if($group_members) {
foreach($group_members as $group_member) {
@@ -401,36 +402,36 @@ class Import extends \Zotlabs\Web\Controller {
if($x['old'] == $group_member['gid'])
$group_member['gid'] = $x['new'];
}
- create_table_from_array('group_member',$group_member);
+ create_table_from_array('group_member', $group_member);
}
}
logger('import step 9');
-
+
if(is_array($data['obj']))
import_objs($channel,$data['obj']);
-
+
if(is_array($data['likes']))
import_likes($channel,$data['likes']);
-
+
if(is_array($data['app']))
import_apps($channel,$data['app']);
-
+
if(is_array($data['chatroom']))
import_chatrooms($channel,$data['chatroom']);
-
+
if(is_array($data['conv']))
import_conv($channel,$data['conv']);
-
+
if(is_array($data['mail']))
import_mail($channel,$data['mail']);
-
+
if(is_array($data['event']))
import_events($channel,$data['event']);
-
+
if(is_array($data['event_item']))
import_items($channel,$data['event_item'],false,$relocate);
-
+
if(is_array($data['menu']))
import_menus($channel,$data['menu']);
@@ -439,56 +440,62 @@ class Import extends \Zotlabs\Web\Controller {
if(is_array($data['webpages']))
import_items($channel,$data['webpages'],false,$relocate);
-
+
$addon = array('channel' => $channel,'data' => $data);
call_hooks('import_channel',$addon);
-
+
$saved_notification_flags = notifications_off($channel['channel_id']);
-
+
if($import_posts && array_key_exists('item',$data) && $data['item'])
import_items($channel,$data['item'],false,$relocate);
-
+
notifications_on($channel['channel_id'],$saved_notification_flags);
-
-
+
if(array_key_exists('item_id',$data) && $data['item_id'])
import_item_ids($channel,$data['item_id']);
-
+
// send out refresh requests
// notify old server that it may no longer be primary.
-
+
\Zotlabs\Daemon\Master::Summon(array('Notifier','location',$channel['channel_id']));
-
+
// This will indirectly perform a refresh_all *and* update the directory
-
+
\Zotlabs\Daemon\Master::Summon(array('Directory', $channel['channel_id']));
-
-
+
+
notice( t('Import completed.') . EOL);
-
+
change_channel($channel['channel_id']);
-
+
goaway(z_root() . '/network' );
-
}
-
-
+
+ /**
+ * @brief Handle POST action on channel import page.
+ */
function post() {
-
$account_id = get_account_id();
if(! $account_id)
return;
-
+
+ check_form_security_token_redirectOnErr('/import', 'channel_import');
+
$this->import_account($account_id);
}
-
+
+ /**
+ * @brief Generate channel import page.
+ *
+ * @return string with parsed HTML.
+ */
function get() {
-
+
if(! get_account_id()) {
- notice( t('You must be logged in to use this feature.'));
+ notice( t('You must be logged in to use this feature.') . EOL);
return '';
}
-
+
$o = replace_macros(get_markup_template('channel_import.tpl'),array(
'$title' => t('Import Channel'),
'$desc' => t('Use this form to import an existing channel from a different server/hub. You may retrieve the channel identity from the old server/hub via the network or provide an export file.'),
@@ -501,14 +508,14 @@ class Import extends \Zotlabs\Web\Controller {
'$label_import_primary' => t('Make this hub my primary location'),
'$label_import_moving' => t('Move this channel (disable all previous locations)'),
'$label_import_posts' => t('Import a few months of posts if possible (limited by available memory'),
- '$pleasewait' => t('This process may take several minutes to complete. Please submit the form only once and leave this page open until finished.'),
+ '$pleasewait' => t('This process may take several minutes to complete. Please submit the form only once and leave this page open until finished.'),
'$email' => '',
'$pass' => '',
+ '$form_security_token' => get_form_security_token('channel_import'),
'$submit' => t('Submit')
));
-
+
return $o;
-
}
-
+
}
diff --git a/Zotlabs/Module/Import_items.php b/Zotlabs/Module/Import_items.php
index f20cbfe7e..c2b2506fe 100644
--- a/Zotlabs/Module/Import_items.php
+++ b/Zotlabs/Module/Import_items.php
@@ -3,54 +3,60 @@ namespace Zotlabs\Module;
require_once('include/import.php');
-
+/**
+ * @brief Module for importing items.
+ *
+ * Import existing posts and content from an export file.
+ */
class Import_items extends \Zotlabs\Web\Controller {
function post() {
-
+
if(! local_channel())
return;
-
+
+ check_form_security_token_redirectOnErr('/import_items', 'import_items');
+
$data = null;
-
+
$src = $_FILES['filename']['tmp_name'];
$filename = basename($_FILES['filename']['name']);
$filesize = intval($_FILES['filename']['size']);
$filetype = $_FILES['filename']['type'];
-
+
if($src) {
// This is OS specific and could also fail if your tmpdir isn't very large
// mostly used for Diaspora which exports gzipped files.
-
+
if(strpos($filename,'.gz')){
@rename($src,$src . '.gz');
@system('gunzip ' . escapeshellarg($src . '.gz'));
}
-
+
if($filesize) {
$data = @file_get_contents($src);
}
unlink($src);
}
-
+
if(! $src) {
-
+
$old_address = ((x($_REQUEST,'old_address')) ? $_REQUEST['old_address'] : '');
-
+
if(! $old_address) {
- logger('mod_import: nothing to import.');
+ logger('Nothing to import.');
notice( t('Nothing to import.') . EOL);
return;
}
-
+
$email = ((x($_REQUEST,'email')) ? $_REQUEST['email'] : '');
$password = ((x($_REQUEST,'password')) ? $_REQUEST['password'] : '');
-
+
$year = ((x($_REQUEST,'year')) ? $_REQUEST['year'] : '');
-
+
$channelname = substr($old_address,0,strpos($old_address,'@'));
$servername = substr($old_address,strpos($old_address,'@')+1);
-
+
$scheme = 'https://';
$api_path = '/api/red/channel/export/items?f=&channel=' . $channelname . '&year=' . intval($year);
$binary = false;
@@ -64,68 +70,66 @@ class Import_items extends \Zotlabs\Web\Controller {
$data = $ret['body'];
else
notice( t('Unable to download data from old server') . EOL);
-
}
-
+
if(! $data) {
- logger('mod_import: empty file.');
+ logger('Empty file.');
notice( t('Imported file is empty.') . EOL);
return;
}
-
- $data = json_decode($data,true);
-
- // logger('import: data: ' . print_r($data,true));
- // print_r($data);
-
+
+ $data = json_decode($data, true);
+
+ //logger('import: data: ' . print_r($data,true));
+ //print_r($data);
+
if(! is_array($data))
return;
-
+
if(array_key_exists('compatibility',$data) && array_key_exists('database',$data['compatibility'])) {
$v1 = substr($data['compatibility']['database'],-4);
$v2 = substr(DB_UPDATE_VERSION,-4);
if($v2 > $v1) {
- $t = sprintf( t('Warning: Database versions differ by %1$d updates.'), $v2 - $v1 );
- notice($t);
+ $t = sprintf( t('Warning: Database versions differ by %1$d updates.'), $v2 - $v1 );
+ notice($t . EOL);
}
}
-
+
$channel = \App::get_channel();
-
-
+
if(array_key_exists('item',$data) && $data['item']) {
import_items($channel,$data['item'],false,((array_key_exists('relocate',$data)) ? $data['relocate'] : null));
}
-
+
if(array_key_exists('item_id',$data) && $data['item_id']) {
import_item_ids($channel,$data['item_id']);
}
-
+
info( t('Import completed') . EOL);
- return;
}
-
-
-
-
+
+
+ /**
+ * @brief Generate item import page.
+ *
+ * @return string with parsed HTML.
+ */
function get() {
-
+
if(! local_channel()) {
notice( t('Permission denied') . EOL);
return login();
}
-
- $o = replace_macros(get_markup_template('item_import.tpl'),array(
+
+ $o = replace_macros(get_markup_template('item_import.tpl'), array(
'$title' => t('Import Items'),
'$desc' => t('Use this form to import existing posts and content from an export file.'),
'$label_filename' => t('File to Upload'),
+ '$form_security_token' => get_form_security_token('import_items'),
'$submit' => t('Submit')
));
-
+
return $o;
-
}
-
-
-
+
}
diff --git a/Zotlabs/Module/Item.php b/Zotlabs/Module/Item.php
index 6f54d3bb1..ec36c22d8 100644
--- a/Zotlabs/Module/Item.php
+++ b/Zotlabs/Module/Item.php
@@ -110,6 +110,7 @@ class Item extends \Zotlabs\Web\Controller {
$preview = ((x($_REQUEST,'preview')) ? intval($_REQUEST['preview']) : 0);
$categories = ((x($_REQUEST,'category')) ? escape_tags($_REQUEST['category']) : '');
$webpage = ((x($_REQUEST,'webpage')) ? intval($_REQUEST['webpage']) : 0);
+ $item_obscured = ((x($_REQUEST,'obscured')) ? intval($_REQUEST['obscured']) : 0);
$pagetitle = ((x($_REQUEST,'pagetitle')) ? escape_tags(urlencode($_REQUEST['pagetitle'])) : '');
$layout_mid = ((x($_REQUEST,'layout_mid')) ? escape_tags($_REQUEST['layout_mid']): '');
$plink = ((x($_REQUEST,'permalink')) ? escape_tags($_REQUEST['permalink']) : '');
@@ -471,24 +472,16 @@ class Item extends \Zotlabs\Web\Controller {
if(! $mimetype)
$mimetype = 'text/bbcode';
+
+ $execflag = ((intval($uid) == intval($profile_uid)
+ && ($channel['channel_pageflags'] & PAGE_ALLOWCODE)) ? true : false);
+
if($preview) {
- $body = z_input_filter($profile_uid,$body,$mimetype);
+ $body = z_input_filter($body,$mimetype,$execflag);
}
-
// Verify ability to use html or php!!!
- $execflag = false;
-
- $z = q("select account_id, account_roles, channel_pageflags from account left join channel on channel_account_id = account_id where channel_id = %d limit 1",
- intval($profile_uid)
- );
- if($z && (($z[0]['account_roles'] & ACCOUNT_ROLE_ALLOWCODE) || ($z[0]['channel_pageflags'] & PAGE_ALLOWCODE))) {
- if($uid && (get_account_id() == $z[0]['account_id'])) {
- $execflag = true;
- }
- }
-
$gacl = $acl->get();
$str_contact_allow = $gacl['allow_cid'];
$str_group_allow = $gacl['allow_gid'];
@@ -852,18 +845,6 @@ class Item extends \Zotlabs\Web\Controller {
if(mb_strlen($datarray['title']) > 255)
$datarray['title'] = mb_substr($datarray['title'],0,255);
- if(array_key_exists('item_private',$datarray) && $datarray['item_private']) {
-
- $datarray['body'] = trim(z_input_filter($datarray['uid'],$datarray['body'],$datarray['mimetype']));
-
- if($uid) {
- if($channel['channel_hash'] === $datarray['author_xchan']) {
- $datarray['sig'] = base64url_encode(rsa_sign($datarray['body'],$channel['channel_prvkey']));
- $datarray['item_verified'] = 1;
- }
- }
- }
-
if($webpage) {
Zlib\IConfig::Set($datarray,'system', webpage_to_namespace($webpage),
(($pagetitle) ? $pagetitle : substr($datarray['mid'],0,16)),true);
@@ -879,7 +860,17 @@ class Item extends \Zotlabs\Web\Controller {
$x = item_store_update($datarray,$execflag);
- item_create_edit_activity($x);
+ // We only need edit activities for other federated protocols
+ // which do not support edits natively. While this does federate
+ // edits, it presents a number of issues locally - such as #757 and #758.
+ // The SQL check for an edit activity would not perform that well so to fix these issues
+ // requires an additional item flag (perhaps 'item_edit_activity') that we can add to the
+ // query for searches and notifications.
+
+ // For now we'll just forget about trying to make edits work on network protocols that
+ // don't support them.
+
+ // item_create_edit_activity($x);
if(! $parent) {
$r = q("select * from item where id = %d",
diff --git a/Zotlabs/Module/Layouts.php b/Zotlabs/Module/Layouts.php
index c07f65ce1..34d754029 100644
--- a/Zotlabs/Module/Layouts.php
+++ b/Zotlabs/Module/Layouts.php
@@ -125,6 +125,7 @@ class Layouts extends \Zotlabs\Web\Controller {
'hide_weblink' => true,
'hide_attach' => true,
'hide_preview' => true,
+ 'disable_comments' => true,
'ptlabel' => t('Layout Name'),
'profile_uid' => intval($owner),
'expanded' => true,
diff --git a/Zotlabs/Module/Lockview.php b/Zotlabs/Module/Lockview.php
index fc7d5c7c8..466d16997 100644
--- a/Zotlabs/Module/Lockview.php
+++ b/Zotlabs/Module/Lockview.php
@@ -72,7 +72,7 @@ class Lockview extends \Zotlabs\Web\Controller {
}
if($uid != local_channel()) {
- echo '<li>' . t('Remote privacy information not available.') . '</li>';
+ echo '<div class="dropdown-item">' . t('Remote privacy information not available.') . '</div>';
killme();
}
@@ -84,7 +84,7 @@ class Lockview extends \Zotlabs\Web\Controller {
// as unknown specific recipients. The sender will have the visibility list and will fall through to the
// next section.
- echo '<li>' . translate_scope((! $item['public_policy']) ? 'specific' : $item['public_policy']) . '</li>';
+ echo '<div class="dropdown-item">' . translate_scope((! $item['public_policy']) ? 'specific' : $item['public_policy']) . '</div>';
killme();
}
@@ -93,7 +93,7 @@ class Lockview extends \Zotlabs\Web\Controller {
$deny_users = expand_acl($item['deny_cid']);
$deny_groups = expand_acl($item['deny_gid']);
- $o = '<li>' . t('Visible to:') . '</li>';
+ $o = '<div class="dropdown-item">' . t('Visible to:') . '</div>';
$l = array();
stringify_array_elms($allowed_groups,true);
@@ -114,24 +114,24 @@ class Lockview extends \Zotlabs\Web\Controller {
$r = q("SELECT profile_name FROM profile WHERE profile_guid IN ( " . implode(', ', $profile_groups) . " )");
if($r)
foreach($r as $rr)
- $l[] = '<li><b>' . t('Profile','acl') . ' ' . $rr['profile_name'] . '</b></li>';
+ $l[] = '<div class="dropdown-item"><b>' . t('Profile','acl') . ' ' . $rr['profile_name'] . '</b></div>';
}
if(count($allowed_groups)) {
$r = q("SELECT gname FROM groups WHERE hash IN ( " . implode(', ', $allowed_groups) . " )");
if($r)
foreach($r as $rr)
- $l[] = '<li><b>' . $rr['gname'] . '</b></li>';
+ $l[] = '<div class="dropdown-item"><b>' . $rr['gname'] . '</b></div>';
}
if(count($allowed_users)) {
$r = q("SELECT xchan_name FROM xchan WHERE xchan_hash IN ( " . implode(', ',$allowed_users) . " )");
if($r)
foreach($r as $rr)
- $l[] = '<li>' . $rr['xchan_name'] . '</li>';
+ $l[] = '<div class="dropdown-item">' . $rr['xchan_name'] . '</div>';
if($atokens) {
foreach($atokens as $at) {
if(in_array("'" . $at['xchan_hash'] . "'",$allowed_users)) {
- $l[] = '<li>' . $at['xchan_name'] . '</li>';
+ $l[] = '<div class="dropdown-item">' . $at['xchan_name'] . '</div>';
}
}
}
@@ -150,7 +150,7 @@ class Lockview extends \Zotlabs\Web\Controller {
$r = q("SELECT profile_name FROM profile WHERE profile_guid IN ( " . implode(', ', $profile_groups) . " )");
if($r)
foreach($r as $rr)
- $l[] = '<li><b><strike>' . t('Profile','acl') . ' ' . $rr['profile_name'] . '</strike></b></li>';
+ $l[] = '<div class="dropdown-item"><b><strike>' . t('Profile','acl') . ' ' . $rr['profile_name'] . '</strike></b></div>';
}
@@ -159,18 +159,18 @@ class Lockview extends \Zotlabs\Web\Controller {
$r = q("SELECT gname FROM groups WHERE hash IN ( " . implode(', ', $deny_groups) . " )");
if($r)
foreach($r as $rr)
- $l[] = '<li><b><strike>' . $rr['gname'] . '</strike></b></li>';
+ $l[] = '<div class="dropdown-item"><b><strike>' . $rr['gname'] . '</strike></b></div>';
}
if(count($deny_users)) {
$r = q("SELECT xchan_name FROM xchan WHERE xchan_hash IN ( " . implode(', ', $deny_users) . " )");
if($r)
foreach($r as $rr)
- $l[] = '<li><strike>' . $rr['xchan_name'] . '</strike></li>';
+ $l[] = '<div class="dropdown-item"><strike>' . $rr['xchan_name'] . '</strike></div>';
if($atokens) {
foreach($atokens as $at) {
if(in_array("'" . $at['xchan_hash'] . "'",$deny_users)) {
- $l[] = '<li><strike>' . $at['xchan_name'] . '</strike></li>';
+ $l[] = '<div class="dropdown-item"><strike>' . $at['xchan_name'] . '</strike></div>';
}
}
}
diff --git a/Zotlabs/Module/Mail.php b/Zotlabs/Module/Mail.php
index 459ce5acf..d605a78a9 100644
--- a/Zotlabs/Module/Mail.php
+++ b/Zotlabs/Module/Mail.php
@@ -113,18 +113,18 @@ class Mail extends \Zotlabs\Web\Controller {
if($preview) {
$mail = [
- 'mailbox' => 'outbox',
- 'id' => 0,
- 'mid' => 'M0',
- 'from_name' => $channel['xchan_name'],
- 'from_url' => $channel['xchan_url'],
- 'from_photo' => $channel['xchan_photo_s'],
- 'subject' => zidify_links(smilies(bbcode($subject))),
- 'body' => zidify_links(smilies(bbcode($body))),
+ 'mailbox' => 'outbox',
+ 'id' => 0,
+ 'mid' => 'M0',
+ 'from_name' => $channel['xchan_name'],
+ 'from_url' => $channel['xchan_url'],
+ 'from_photo' => $channel['xchan_photo_s'],
+ 'subject' => zidify_links(smilies(bbcode($subject))),
+ 'body' => zidify_links(smilies(bbcode($body))),
'attachments' => '',
- 'can_recall' => false,
+ 'can_recall' => false,
'is_recalled' => '',
- 'date' => datetime_convert('UTC',date_default_timezone_get(),$message['created'], 'c')
+ 'date' => datetime_convert('UTC',date_default_timezone_get(),$message['created'], 'c')
];
echo replace_macros(get_markup_template('mail_conv.tpl'), [ '$mail' => $mail ] );
@@ -178,6 +178,25 @@ class Mail extends \Zotlabs\Web\Controller {
'$header' => t('Messages'),
));
+ if(argc() == 3 && intval(argv(1)) && argv(2) === 'download') {
+
+ $r = q("select * from mail where id = %d and channel_id = %d",
+ intval(argv(1)),
+ intval(local_channel())
+ );
+
+ if($r) {
+
+ header('Content-type: ' . $r[0]['mail_mimetype']);
+ header('Content-disposition: attachment; filename="' . t('message') . '-' . $r[0]['id'] . '"' );
+ $body = (($r[0]['mail_obscured']) ? base64url_decode(str_rot47($r[0]['body'])) : $r[0]['body']);
+ echo $body;
+ killme();
+ }
+
+ }
+
+
if((argc() == 4) && (argv(2) === 'drop')) {
if(! intval(argv(3)))
return;
@@ -296,7 +315,9 @@ class Mail extends \Zotlabs\Web\Controller {
return $o;
}
-
+
+ $direct_mid = 0;
+
switch(argv(1)) {
case 'combined':
$mailbox = 'combined';
@@ -309,12 +330,22 @@ class Mail extends \Zotlabs\Web\Controller {
break;
default:
$mailbox = 'combined';
+
+ // notifications direct to mail/nn
+
+ if(intval(argv(1)))
+ $direct_mid = intval(argv(1));
break;
}
+
$last_message = private_messages_list(local_channel(), $mailbox, 0, 1);
-
+
$mid = ((argc() > 2) && (intval(argv(2)))) ? argv(2) : $last_message[0]['id'];
+
+ if($direct_mid)
+ $mid = $direct_mid;
+
$plaintext = true;
@@ -358,6 +389,11 @@ class Mail extends \Zotlabs\Web\Controller {
foreach($messages as $message) {
$s = theme_attachments($message);
+
+ if($message['mail_raw'])
+ $message['body'] = mail_prepare_binary([ 'id' => $message['id'] ]);
+ else
+ $message['body'] = zidify_links(smilies(bbcode($message['body'])));
$mails[] = array(
'mailbox' => $mailbox,
@@ -370,7 +406,7 @@ class Mail extends \Zotlabs\Web\Controller {
'to_url' => chanlink_hash($message['to_xchan']),
'to_photo' => $message['to']['xchan_photo_s'],
'subject' => $message['title'],
- 'body' => zidify_links(smilies(bbcode($message['body']))),
+ 'body' => $message['body'],
'attachments' => $s,
'delete' => t('Delete message'),
'dreport' => t('Delivery report'),
diff --git a/Zotlabs/Module/Manage.php b/Zotlabs/Module/Manage.php
index 3b7b3c3dd..e541ee077 100644
--- a/Zotlabs/Module/Manage.php
+++ b/Zotlabs/Module/Manage.php
@@ -46,107 +46,111 @@ class Manage extends \Zotlabs\Web\Controller {
$channels = null;
- if(local_channel()) {
- $r = q("select channel.*, xchan.* from channel left join xchan on channel.channel_hash = xchan.xchan_hash where channel.channel_account_id = %d and channel_removed = 0 order by channel_name ",
- intval(get_account_id())
- );
+ $r = q("select channel.*, xchan.* from channel left join xchan on channel.channel_hash = xchan.xchan_hash where channel.channel_account_id = %d and channel_removed = 0 order by channel_name ",
+ intval(get_account_id())
+ );
- $account = \App::get_account();
+ $account = \App::get_account();
- if($r && count($r)) {
- $channels = $r;
- for($x = 0; $x < count($channels); $x ++) {
- $channels[$x]['link'] = 'manage/' . intval($channels[$x]['channel_id']);
- $channels[$x]['default'] = (($channels[$x]['channel_id'] == $account['account_default_channel']) ? "1" : '');
- $channels[$x]['default_links'] = '1';
+ if($r && count($r)) {
+ $channels = $r;
+ for($x = 0; $x < count($channels); $x ++) {
+ $channels[$x]['link'] = 'manage/' . intval($channels[$x]['channel_id']);
+ $channels[$x]['default'] = (($channels[$x]['channel_id'] == $account['account_default_channel']) ? "1" : '');
+ $channels[$x]['default_links'] = '1';
- $c = q("SELECT id, item_wall FROM item
- WHERE item_unseen = 1 and uid = %d " . item_normal(),
- intval($channels[$x]['channel_id'])
- );
+ $c = q("SELECT id, item_wall FROM item
+ WHERE item_unseen = 1 and uid = %d " . item_normal(),
+ intval($channels[$x]['channel_id'])
+ );
- if($c) {
- foreach ($c as $it) {
- if(intval($it['item_wall']))
- $channels[$x]['home'] ++;
- else
- $channels[$x]['network'] ++;
- }
+ if($c) {
+ foreach ($c as $it) {
+ if(intval($it['item_wall']))
+ $channels[$x]['home'] ++;
+ else
+ $channels[$x]['network'] ++;
}
+ }
- $intr = q("SELECT COUNT(abook.abook_id) AS total FROM abook left join xchan on abook.abook_xchan = xchan.xchan_hash where abook_channel = %d and abook_pending = 1 and abook_self = 0 and abook_ignored = 0 and xchan_deleted = 0 and xchan_orphan = 0 ",
- intval($channels[$x]['channel_id'])
- );
+ $intr = q("SELECT COUNT(abook.abook_id) AS total FROM abook left join xchan on abook.abook_xchan = xchan.xchan_hash where abook_channel = %d and abook_pending = 1 and abook_self = 0 and abook_ignored = 0 and xchan_deleted = 0 and xchan_orphan = 0 ",
+ intval($channels[$x]['channel_id'])
+ );
- if($intr)
- $channels[$x]['intros'] = intval($intr[0]['total']);
+ if($intr)
+ $channels[$x]['intros'] = intval($intr[0]['total']);
- $mails = q("SELECT count(id) as total from mail WHERE channel_id = %d AND mail_seen = 0 and from_xchan != '%s' ",
- intval($channels[$x]['channel_id']),
- dbesc($channels[$x]['channel_hash'])
- );
+ $mails = q("SELECT count(id) as total from mail WHERE channel_id = %d AND mail_seen = 0 and from_xchan != '%s' ",
+ intval($channels[$x]['channel_id']),
+ dbesc($channels[$x]['channel_hash'])
+ );
- if($mails)
- $channels[$x]['mail'] = intval($mails[0]['total']);
+ if($mails)
+ $channels[$x]['mail'] = intval($mails[0]['total']);
- $events = q("SELECT etype, dtstart, adjust FROM event
- WHERE event.uid = %d AND dtstart < '%s' AND dtstart > '%s' and dismissed = 0
- ORDER BY dtstart ASC ",
- intval($channels[$x]['channel_id']),
- dbesc(datetime_convert('UTC', date_default_timezone_get(), 'now + 7 days')),
- dbesc(datetime_convert('UTC', date_default_timezone_get(), 'now - 1 days'))
- );
-
- if($events) {
- $channels[$x]['all_events'] = count($events);
-
- if($channels[$x]['all_events']) {
- $str_now = datetime_convert('UTC', date_default_timezone_get(), 'now', 'Y-m-d');
- foreach($events as $e) {
- $bd = false;
- if($e['etype'] === 'birthday') {
- $channels[$x]['birthdays'] ++;
- $bd = true;
- }
- else {
- $channels[$x]['events'] ++;
- }
- if(datetime_convert('UTC', ((intval($e['adjust'])) ? date_default_timezone_get() : 'UTC'), $e['dtstart'], 'Y-m-d') === $str_now) {
- $channels[$x]['all_events_today'] ++;
- if($bd)
- $channels[$x]['birthdays_today'] ++;
- else
- $channels[$x]['events_today'] ++;
- }
+ $events = q("SELECT etype, dtstart, adjust FROM event
+ WHERE event.uid = %d AND dtstart < '%s' AND dtstart > '%s' and dismissed = 0
+ ORDER BY dtstart ASC ",
+ intval($channels[$x]['channel_id']),
+ dbesc(datetime_convert('UTC', date_default_timezone_get(), 'now + 7 days')),
+ dbesc(datetime_convert('UTC', date_default_timezone_get(), 'now - 1 days'))
+ );
+
+ if($events) {
+ $channels[$x]['all_events'] = count($events);
+
+ if($channels[$x]['all_events']) {
+ $str_now = datetime_convert('UTC', date_default_timezone_get(), 'now', 'Y-m-d');
+ foreach($events as $e) {
+ $bd = false;
+ if($e['etype'] === 'birthday') {
+ $channels[$x]['birthdays'] ++;
+ $bd = true;
+ }
+ else {
+ $channels[$x]['events'] ++;
+ }
+ if(datetime_convert('UTC', ((intval($e['adjust'])) ? date_default_timezone_get() : 'UTC'), $e['dtstart'], 'Y-m-d') === $str_now) {
+ $channels[$x]['all_events_today'] ++;
+ if($bd)
+ $channels[$x]['birthdays_today'] ++;
+ else
+ $channels[$x]['events_today'] ++;
}
}
}
}
}
-
- $r = q("select count(channel_id) as total from channel where channel_account_id = %d and channel_removed = 0",
- intval(get_account_id())
- );
- $limit = account_service_class_fetch(get_account_id(),'total_identities');
- if($limit !== false) {
- $channel_usage_message = sprintf( t("You have created %1$.0f of %2$.0f allowed channels."), $r[0]['total'], $limit);
- }
- else {
- $channel_usage_message = '';
- }
+
+ }
+
+ $r = q("select count(channel_id) as total from channel where channel_account_id = %d and channel_removed = 0",
+ intval(get_account_id())
+ );
+ $limit = account_service_class_fetch(get_account_id(),'total_identities');
+ if($limit !== false) {
+ $channel_usage_message = sprintf( t("You have created %1$.0f of %2$.0f allowed channels."), $r[0]['total'], $limit);
}
+ else {
+ $channel_usage_message = '';
+ }
+
$create = array( 'new_channel', t('Create a new channel'), t('Create New'));
- $delegates = q("select * from abook left join xchan on abook_xchan = xchan_hash where
- abook_channel = %d and abook_xchan in ( select xchan from abconfig where chan = %d and cat = 'their_perms' and k = 'delegate' and v = '1' )",
- intval(local_channel()),
- intval(local_channel())
- );
+ $delegates = null;
+
+ if(local_channel()) {
+ $delegates = q("select * from abook left join xchan on abook_xchan = xchan_hash where
+ abook_channel = %d and abook_xchan in ( select xchan from abconfig where chan = %d and cat = 'their_perms' and k = 'delegate' and v = '1' )",
+ intval(local_channel()),
+ intval(local_channel())
+ );
+ }
if($delegates) {
for($x = 0; $x < count($delegates); $x ++) {
diff --git a/Zotlabs/Module/Network.php b/Zotlabs/Module/Network.php
index 8263420b6..1c7c70019 100644
--- a/Zotlabs/Module/Network.php
+++ b/Zotlabs/Module/Network.php
@@ -118,8 +118,8 @@ class Network extends \Zotlabs\Web\Controller {
$cmax = ((x($_GET,'cmax')) ? intval($_GET['cmax']) : 99);
$firehose = ((x($_GET,'fh')) ? intval($_GET['fh']) : 0);
$file = ((x($_GET,'file')) ? $_GET['file'] : '');
-
-
+ $xchan = ((x($_GET,'xchan')) ? $_GET['xchan'] : '');
+
$deftag = '';
if(x($_GET,'search') || x($_GET,'file'))
@@ -257,6 +257,26 @@ class Network extends \Zotlabs\Web\Controller {
goaway(z_root() . '/network');
}
}
+ elseif($xchan) {
+ $r = q("select * from xchan where xchan_hash = '%s'",
+ dbesc($xchan)
+ );
+ if($r) {
+ $sql_extra = " AND item.parent IN ( SELECT DISTINCT parent FROM item WHERE true $sql_options AND uid = " . intval(local_channel()) . " AND ( author_xchan = '" . dbesc($xchan) . "' or owner_xchan = '" . dbesc($xchan) . "' ) $item_normal ) ";
+ $title = replace_macros(get_markup_template("section_title.tpl"),array(
+ '$title' => '<a href="' . zid($r[0]['xchan_url']) . '" ><img src="' . zid($r[0]['xchan_photo_s']) . '" alt="' . urlencode($r[0]['xchan_name']) . '" /></a> <a href="' . zid($r[0]['xchan_url']) . '" >' . $r[0]['xchan_name'] . '</a>'
+ ));
+ $o = $tabs;
+ $o .= $title;
+ $o .= $status_editor;
+
+ }
+ else {
+ notice( t('Invalid channel.') . EOL);
+ goaway(z_root() . '/network');
+ }
+
+ }
if(x($category)) {
$sql_extra .= protect_sprintf(term_query('item', $category, TERM_CATEGORY));
@@ -302,6 +322,7 @@ class Network extends \Zotlabs\Web\Controller {
'$list' => ((x($_REQUEST,'list')) ? intval($_REQUEST['list']) : 0),
'$page' => ((\App::$pager['page'] != 1) ? \App::$pager['page'] : 1),
'$search' => (($search) ? $search : ''),
+ '$xchan' => $xchan,
'$order' => $order,
'$file' => $file,
'$cats' => $category,
diff --git a/Zotlabs/Module/Notifications.php b/Zotlabs/Module/Notifications.php
index e0313dd8b..652648701 100644
--- a/Zotlabs/Module/Notifications.php
+++ b/Zotlabs/Module/Notifications.php
@@ -40,7 +40,7 @@ class Notifications extends \Zotlabs\Web\Controller {
$o .= replace_macros(get_markup_template('notifications.tpl'),array(
'$notif_header' => t('System Notifications'),
- '$notif_link_mark_seen' => t('Mark all system notifications seen'),
+ '$notif_link_mark_seen' => t('Mark all seen'),
'$notif_content' => $notif_content,
'$notifications_available' => $notifications_available,
));
diff --git a/Zotlabs/Module/Ofeed.php b/Zotlabs/Module/Ofeed.php
new file mode 100644
index 000000000..2b7acff99
--- /dev/null
+++ b/Zotlabs/Module/Ofeed.php
@@ -0,0 +1,48 @@
+<?php
+
+namespace Zotlabs\Module;
+
+/* Ofeed: Broken feed for software which requires broken feeds */
+
+require_once('include/items.php');
+
+class Ofeed extends \Zotlabs\Web\Controller {
+
+ function init() {
+
+ $params = [];
+
+ $params['begin'] = ((x($_REQUEST,'date_begin')) ? $_REQUEST['date_begin'] : NULL_DATE);
+ $params['end'] = ((x($_REQUEST,'date_end')) ? $_REQUEST['date_end'] : '');
+ $params['type'] = ((stristr(argv(0),'json')) ? 'json' : 'xml');
+ $params['pages'] = ((x($_REQUEST,'pages')) ? intval($_REQUEST['pages']) : 0);
+ $params['top'] = ((x($_REQUEST,'top')) ? intval($_REQUEST['top']) : 0);
+ $params['start'] = ((x($params,'start')) ? intval($params['start']) : 0);
+ $params['records'] = ((x($params,'records')) ? intval($params['records']) : 40);
+ $params['direction'] = ((x($params,'direction')) ? dbesc($params['direction']) : 'desc');
+ $params['cat'] = ((x($_REQUEST,'cat')) ? escape_tags($_REQUEST['cat']) : '');
+ $params['compat'] = ((x($_REQUEST,'compat')) ? intval($_REQUEST['compat']) : 1);
+
+
+ if(argc() > 1) {
+
+ if(observer_prohibited(true)) {
+ killme();
+ }
+
+ $channel = channelx_by_nick(argv(1));
+ if(! $channel) {
+ killme();
+ }
+
+
+ logger('public feed request from ' . $_SERVER['REMOTE_ADDR'] . ' for ' . $channel['channel_address']);
+
+ echo get_public_feed($channel,$params);
+
+ killme();
+ }
+
+ }
+
+}
diff --git a/Zotlabs/Module/Photo.php b/Zotlabs/Module/Photo.php
index 256a51e71..dc4ae670e 100644
--- a/Zotlabs/Module/Photo.php
+++ b/Zotlabs/Module/Photo.php
@@ -127,7 +127,6 @@ class Photo extends \Zotlabs\Web\Controller {
}
}
-
$r = q("SELECT uid FROM photo WHERE resource_id = '%s' AND imgscale = %d LIMIT 1",
dbesc($photo),
intval($resolution)
@@ -150,12 +149,14 @@ class Photo extends \Zotlabs\Web\Controller {
$channel = channelx_by_n($r[0]['uid']);
// Now we'll see if we can access the photo
-
$r = q("SELECT * FROM photo WHERE resource_id = '%s' AND imgscale = %d $sql_extra LIMIT 1",
dbesc($photo),
intval($resolution)
);
-
+
+ if($r && $r[0]['photo_usage'] == PHOTO_COVER)
+ $allowed = 1;
+
$d = [ 'imgscale' => $resolution, 'resource_id' => $photo, 'photo' => $r, 'allowed' => $allowed ];
call_hooks('get_photo',$d);
diff --git a/Zotlabs/Module/Photos.php b/Zotlabs/Module/Photos.php
index 582174d0e..d993c481e 100644
--- a/Zotlabs/Module/Photos.php
+++ b/Zotlabs/Module/Photos.php
@@ -15,13 +15,10 @@ class Photos extends \Zotlabs\Web\Controller {
function init() {
-
if(observer_prohibited()) {
return;
}
- $o = '';
-
if(argc() > 1) {
$nick = argv(1);
@@ -54,7 +51,6 @@ class Photos extends \Zotlabs\Web\Controller {
logger('mod-photos: photos_post: begin' , LOGGER_DEBUG);
-
logger('mod_photos: REQUEST ' . print_r($_REQUEST,true), LOGGER_DATA);
logger('mod_photos: FILES ' . print_r($_FILES,true), LOGGER_DATA);
@@ -92,14 +88,9 @@ class Photos extends \Zotlabs\Web\Controller {
if((argc() > 3) && (argv(2) === 'album')) {
- $album = hex2bin(argv(3));
-
- if($album === t('Profile Photos')) {
- // not allowed
- goaway(z_root() . '/' . $_SESSION['photo_return']);
- }
-
- if(! photos_album_exists($page_owner_uid,$album)) {
+ $album = argv(3);
+
+ if(! photos_album_exists($page_owner_uid, get_observer_hash(), $album)) {
notice( t('Album not found.') . EOL);
goaway(z_root() . '/' . $_SESSION['photo_return']);
}
@@ -121,7 +112,7 @@ class Photos extends \Zotlabs\Web\Controller {
$folder_hash = '';
- $r = q("select * from attach where is_dir = 1 and uid = %d and filename = '%s'",
+ $r = q("select * from attach where is_dir = 1 and uid = %d and hash = '%s'",
intval($page_owner_uid),
dbesc($album)
);
@@ -129,14 +120,7 @@ class Photos extends \Zotlabs\Web\Controller {
notice( t('Album not found.') . EOL);
return;
}
- if(count($r) > 1) {
- notice( t('Multiple storage folders exist with this album name, but within different directories. Please remove the desired folder or folders using the Files manager') . EOL);
- return;
- }
- else {
- $folder_hash = $r[0]['hash'];
- }
-
+ $folder_hash = $r[0]['hash'];
$res = array();
@@ -468,7 +452,7 @@ class Photos extends \Zotlabs\Web\Controller {
* default post action - upload a photo
*/
- $channel = \App::$data['channel'];
+ $channel = \App::$data['channel'];
$observer = \App::$data['observer'];
$_REQUEST['source'] = 'photos';
@@ -485,12 +469,10 @@ class Photos extends \Zotlabs\Web\Controller {
if(! $r['success']) {
notice($r['message'] . EOL);
+ goaway(z_root() . '/photos/' . \App::$data['channel']['channel_address']);
}
-
- if($_REQUEST['newalbum'])
- goaway(z_root() . '/photos/' . \App::$data['channel']['channel_address'] . '/album/' . bin2hex($_REQUEST['newalbum']));
- else
- goaway(z_root() . '/photos/' . \App::$data['channel']['channel_address'] . '/album/' . bin2hex(datetime_convert('UTC',date_default_timezone_get(),'now', 'Y')));
+
+ goaway(z_root() . '/photos/' . \App::$data['channel']['channel_address'] . '/album/' . $r['data']['folder']);
}
@@ -569,7 +551,9 @@ class Photos extends \Zotlabs\Web\Controller {
return;
}
- $sql_extra = permissions_sql($owner_uid);
+ $sql_item = item_permissions_sql($owner_uid,get_observer_hash());
+ $sql_extra = permissions_sql($owner_uid,get_observer_hash(),'photo');
+ $sql_attach = permissions_sql($owner_uid,get_observer_hash(),'attach');
$o = "";
@@ -579,7 +563,7 @@ class Photos extends \Zotlabs\Web\Controller {
// tabs
$_is_owner = (local_channel() && (local_channel() == $owner_uid));
- $o .= profile_tabs($a,$_is_owner, \App::$data['channel']['channel_address']);
+ //$o .= profile_tabs($a,$_is_owner, \App::$data['channel']['channel_address']);
/**
* Display upload form
@@ -628,8 +612,14 @@ class Photos extends \Zotlabs\Web\Controller {
if(! $aclselect) {
$aclselect = '<input id="group_allow" type="hidden" name="allow_gid[]" value="" /><input id="contact_allow" type="hidden" name="allow_cid[]" value="" /><input id="group_deny" type="hidden" name="deny_gid[]" value="" /><input id="contact_deny" type="hidden" name="deny_cid[]" value="" />';
}
-
- $selname = (($datum) ? hex2bin($datum) : '');
+
+ $selname = '';
+
+ if($datum) {
+ $h = attach_by_hash_nodata($datum,get_observer_hash());
+ $selname = $h['data']['display_path'];
+ }
+
$albums = ((array_key_exists('albums', \App::$data)) ? \App::$data['albums'] : photos_albums_list(\App::$data['channel'],\App::$data['observer']));
@@ -680,29 +670,13 @@ class Photos extends \Zotlabs\Web\Controller {
if($datatype === 'album') {
- if(strlen($datum)) {
- if((strlen($datum) & 1) || (! ctype_xdigit($datum))) {
- notice( t('Album name could not be decoded') . EOL);
- logger('mod_photos: illegal album encoding: ' . $datum);
- $datum = '';
- goaway(z_root() . '/photos/' . \App::$data['channel']['channel_address']);
- }
- }
-
- $album = (($datum) ? hex2bin($datum) : '');
-
\App::$page['htmlhead'] .= "\r\n" . '<link rel="alternate" type="application/json+oembed" href="' . z_root() . '/oep?f=&url=' . urlencode(z_root() . '/' . \App::$cmd) . '" title="oembed" />' . "\r\n";
- //check if the album exists and if we have perms
- $r = q("SELECT album FROM photo WHERE uid = %d AND album = '%s' and is_nsfw = %d $sql_extra LIMIT 1",
- intval($owner_uid),
- dbesc($album),
- intval($unsafe)
- );
-
- if($r) {
+ if($x = photos_album_exists($owner_uid, get_observer_hash(), $datum)) {
\App::set_pager_itemspage(60);
- } else {
+ $album = $x['display_path'];
+ }
+ else {
goaway(z_root() . '/photos/' . \App::$data['channel']['channel_address']);
}
@@ -712,26 +686,26 @@ class Photos extends \Zotlabs\Web\Controller {
$order = 'DESC';
$r = q("SELECT p.resource_id, p.id, p.filename, p.mimetype, p.imgscale, p.description, p.created FROM photo p INNER JOIN
- (SELECT resource_id, max(imgscale) imgscale FROM photo WHERE uid = %d AND album = '%s' AND imgscale <= 4 AND photo_usage IN ( %d, %d ) and is_nsfw = %d $sql_extra GROUP BY resource_id) ph
+ (SELECT resource_id, max(imgscale) imgscale FROM photo left join attach on folder = '%s' and photo.resource_id = attach.hash WHERE attach.uid = %d AND imgscale <= 4 AND photo_usage IN ( %d, %d ) and is_nsfw = %d $sql_extra GROUP BY resource_id) ph
ON (p.resource_id = ph.resource_id AND p.imgscale = ph.imgscale)
ORDER BY created $order LIMIT %d OFFSET %d",
+ dbesc($datum),
intval($owner_uid),
- dbesc($album),
intval(PHOTO_NORMAL),
intval(PHOTO_PROFILE),
intval($unsafe),
intval(\App::$pager['itemspage']),
intval(\App::$pager['start'])
);
-
- //edit album name
+
+ // edit album name
$album_edit = null;
- if(($album !== t('Profile Photos')) && ($album !== 'Profile Photos') && ($album !== 'Contact Photos') && ($album !== t('Contact Photos'))) {
- if($can_post) {
- $album_e = $album;
- $albums = ((array_key_exists('albums', \App::$data)) ? \App::$data['albums'] : photos_albums_list(\App::$data['channel'],\App::$data['observer']));
+
+ if($can_post) {
+ $album_e = $album;
+ $albums = ((array_key_exists('albums', \App::$data)) ? \App::$data['albums'] : photos_albums_list(\App::$data['channel'],\App::$data['observer']));
- // @fixme - syncronise actions with DAV
+ // @fixme - syncronise actions with DAV
// $edit_tpl = get_markup_template('album_edit.tpl');
// $album_edit = replace_macros($edit_tpl,array(
@@ -745,13 +719,12 @@ class Photos extends \Zotlabs\Web\Controller {
// '$dropsubmit' => t('Delete Album')
// ));
- }
}
if($_GET['order'] === 'posted')
- $order = array(t('Show Newest First'), z_root() . '/photos/' . \App::$data['channel']['channel_address'] . '/album/' . bin2hex($album));
+ $order = array(t('Show Newest First'), z_root() . '/photos/' . \App::$data['channel']['channel_address'] . '/album/' . $datum);
else
- $order = array(t('Show Oldest First'), z_root() . '/photos/' . \App::$data['channel']['channel_address'] . '/album/' . bin2hex($album) . '?f=&order=posted');
+ $order = array(t('Show Oldest First'), z_root() . '/photos/' . \App::$data['channel']['channel_address'] . '/album/' . $datum . '?f=&order=posted');
$photos = array();
if(count($r)) {
@@ -805,10 +778,10 @@ class Photos extends \Zotlabs\Web\Controller {
$o .= replace_macros($tpl, array(
'$photos' => $photos,
'$album' => $album,
- '$album_id' => bin2hex($album),
+ '$album_id' => $datum,
'$album_edit' => array(t('Edit Album'), $album_edit),
'$can_post' => $can_post,
- '$upload' => array(t('Upload'), z_root() . '/photos/' . \App::$data['channel']['channel_address'] . '/upload/' . bin2hex($album)),
+ '$upload' => array(t('Upload'), z_root() . '/photos/' . \App::$data['channel']['channel_address'] . '/upload/' . $datum),
'$order' => $order,
'$upload_form' => $upload_form,
'$usage' => $usage_message
@@ -822,8 +795,6 @@ class Photos extends \Zotlabs\Web\Controller {
killme();
}
- // $o .= paginate($a);
-
return $o;
}
@@ -836,6 +807,11 @@ class Photos extends \Zotlabs\Web\Controller {
\App::$page['htmlhead'] .= "\r\n" . '<link rel="alternate" type="application/json+oembed" href="' . z_root() . '/oep?f=&url=' . urlencode(z_root() . '/' . \App::$cmd) . '" title="oembed" />' . "\r\n";
+ $x = q("select folder from attach where hash = '%s' and uid = %d $sql_attach limit 1",
+ dbesc($datum),
+ intval($owner_uid)
+ );
+
// fetch image, item containing image, then comments
$ph = q("SELECT id,aid,uid,xchan,resource_id,created,edited,title,description,album,filename,mimetype,height,width,filesize,imgscale,photo_usage,is_nsfw,allow_cid,allow_gid,deny_cid,deny_gid FROM photo WHERE uid = %d AND resource_id = '%s'
@@ -844,7 +820,7 @@ class Photos extends \Zotlabs\Web\Controller {
dbesc($datum)
);
- if(! $ph) {
+ if(! ($ph && $x)) {
/* Check again - this time without specifying permissions */
@@ -869,16 +845,16 @@ class Photos extends \Zotlabs\Web\Controller {
else
$order = 'DESC';
-
- $prvnxt = q("SELECT resource_id FROM photo WHERE album = '%s' AND uid = %d AND imgscale = 0
- $sql_extra ORDER BY created $order ",
- dbesc($ph[0]['album']),
+
+ $prvnxt = q("SELECT hash FROM attach WHERE folder = '%s' AND uid = %d AND is_photo = 1
+ $sql_attach ORDER BY created $order ",
+ dbesc($x[0]['folder']),
intval($owner_uid)
);
-
+
if(count($prvnxt)) {
for($z = 0; $z < count($prvnxt); $z++) {
- if($prvnxt[$z]['resource_id'] == $ph[0]['resource_id']) {
+ if($prvnxt[$z]['hash'] == $ph[0]['resource_id']) {
$prv = $z - 1;
$nxt = $z + 1;
if($prv < 0)
@@ -889,8 +865,8 @@ class Photos extends \Zotlabs\Web\Controller {
}
}
- $prevlink = z_root() . '/photos/' . \App::$data['channel']['channel_address'] . '/image/' . $prvnxt[$prv]['resource_id'] . (($_GET['order'] === 'posted') ? '?f=&order=posted' : '');
- $nextlink = z_root() . '/photos/' . \App::$data['channel']['channel_address'] . '/image/' . $prvnxt[$nxt]['resource_id'] . (($_GET['order'] === 'posted') ? '?f=&order=posted' : '');
+ $prevlink = z_root() . '/photos/' . \App::$data['channel']['channel_address'] . '/image/' . $prvnxt[$prv]['hash'] . (($_GET['order'] === 'posted') ? '?f=&order=posted' : '');
+ $nextlink = z_root() . '/photos/' . \App::$data['channel']['channel_address'] . '/image/' . $prvnxt[$nxt]['hash'] . (($_GET['order'] === 'posted') ? '?f=&order=posted' : '');
}
@@ -907,7 +883,7 @@ class Photos extends \Zotlabs\Web\Controller {
}
}
- $album_link = z_root() . '/photos/' . \App::$data['channel']['channel_address'] . '/album/' . bin2hex($ph[0]['album']);
+ $album_link = z_root() . '/photos/' . \App::$data['channel']['channel_address'] . '/album/' . $x[0]['folder'];
$tools = Null;
$lock = Null;
@@ -947,7 +923,7 @@ class Photos extends \Zotlabs\Web\Controller {
// Do we have an item for this photo?
$linked_items = q("SELECT * FROM item WHERE resource_id = '%s' and resource_type = 'photo'
- $sql_extra LIMIT 1",
+ $sql_item LIMIT 1",
dbesc($datum)
);
@@ -962,7 +938,7 @@ class Photos extends \Zotlabs\Web\Controller {
$item_normal = item_normal();
$r = q("select * from item where parent_mid = '%s'
- $item_normal and uid = %d $sql_extra ",
+ $item_normal and uid = %d $sql_item ",
dbesc($link_item['mid']),
intval($link_item['uid'])
@@ -1008,13 +984,6 @@ class Photos extends \Zotlabs\Web\Controller {
$edit = null;
if($can_post) {
- $m = q("select folder from attach where hash = '%s' and uid = %d limit 1",
- dbesc($ph[0]['resource_id']),
- intval($ph[0]['uid'])
- );
- if($m)
- $album_hash = $m[0]['folder'];
-
$album_e = $ph[0]['album'];
$caption_e = $ph[0]['description'];
$aclselect_e = (($_is_owner) ? populate_acl($ph[0], true, \Zotlabs\Lib\PermissionDescription::fromGlobalPermission('view_storage')) : '');
@@ -1024,35 +993,35 @@ class Photos extends \Zotlabs\Web\Controller {
$folder_list = attach_folder_select_list($ph[0]['uid']);
- $edit = array(
+ $edit = [
'edit' => t('Edit photo'),
'id' => $link_item['id'],
- 'rotatecw' => t('Rotate CW (right)'),
- 'rotateccw' => t('Rotate CCW (left)'),
- 'albums' => $albums['albums'],
- 'album' => $album_e,
- 'album_select' => [ 'move_to_album', t('Move photo to album'), $album_hash, '', $folder_list ],
- 'newalbum_label' => t('Enter a new album name'),
+ 'rotatecw' => t('Rotate CW (right)'),
+ 'rotateccw' => t('Rotate CCW (left)'),
+ 'albums' => $albums['albums'],
+ 'album' => $album_e,
+ 'album_select' => [ 'move_to_album', t('Move photo to album'), $x[0]['folder'], '', $folder_list ],
+ 'newalbum_label' => t('Enter a new album name'),
'newalbum_placeholder' => t('or select an existing one (doubleclick)'),
- 'nickname' => \App::$data['channel']['channel_address'],
- 'resource_id' => $ph[0]['resource_id'],
- 'capt_label' => t('Caption'),
- 'caption' => $caption_e,
- 'tag_label' => t('Add a Tag'),
- 'permissions' => t('Permissions'),
- 'aclselect' => $aclselect_e,
- 'allow_cid' => acl2json($ph[0]['allow_cid']),
- 'allow_gid' => acl2json($ph[0]['allow_gid']),
- 'deny_cid' => acl2json($ph[0]['deny_cid']),
- 'deny_gid' => acl2json($ph[0]['deny_gid']),
- 'lockstate' => $lockstate[0],
- 'help_tags' => t('Example: @bob, @Barbara_Jensen, @jim@example.com'),
- 'item_id' => ((count($linked_items)) ? $link_item['id'] : 0),
- 'adult_enabled' => feature_enabled($owner_uid,'adult_photo_flagging'),
- 'adult' => array('adult',t('Flag as adult in album view'), intval($ph[0]['is_nsfw']),''),
- 'submit' => t('Submit'),
- 'delete' => t('Delete Photo')
- );
+ 'nickname' => \App::$data['channel']['channel_address'],
+ 'resource_id' => $ph[0]['resource_id'],
+ 'capt_label' => t('Caption'),
+ 'caption' => $caption_e,
+ 'tag_label' => t('Add a Tag'),
+ 'permissions' => t('Permissions'),
+ 'aclselect' => $aclselect_e,
+ 'allow_cid' => acl2json($ph[0]['allow_cid']),
+ 'allow_gid' => acl2json($ph[0]['allow_gid']),
+ 'deny_cid' => acl2json($ph[0]['deny_cid']),
+ 'deny_gid' => acl2json($ph[0]['deny_gid']),
+ 'lockstate' => $lockstate[0],
+ 'help_tags' => t('Example: @bob, @Barbara_Jensen, @jim@example.com'),
+ 'item_id' => ((count($linked_items)) ? $link_item['id'] : 0),
+ 'adult_enabled' => feature_enabled($owner_uid,'adult_photo_flagging'),
+ 'adult' => array('adult',t('Flag as adult in album view'), intval($ph[0]['is_nsfw']),''),
+ 'submit' => t('Submit'),
+ 'delete' => t('Delete Photo')
+ ];
}
if(count($linked_items)) {
@@ -1066,13 +1035,13 @@ class Photos extends \Zotlabs\Web\Controller {
$likebuttons = '';
if($can_post || $can_comment) {
- $likebuttons = array(
- 'id' => $link_item['id'],
+ $likebuttons = [
+ 'id' => $link_item['id'],
'likethis' => t("I like this \x28toggle\x29"),
- 'nolike' => t("I don't like this \x28toggle\x29"),
- 'share' => t('Share'),
- 'wait' => t('Please wait')
- );
+ 'nolike' => t("I don't like this \x28toggle\x29"),
+ 'share' => t('Share'),
+ 'wait' => t('Please wait')
+ ];
}
$comments = '';
@@ -1277,25 +1246,13 @@ class Photos extends \Zotlabs\Web\Controller {
\App::$page['htmlhead'] .= "\r\n" . '<link rel="alternate" type="application/json+oembed" href="' . z_root() . '/oep?f=&url=' . urlencode(z_root() . '/' . \App::$cmd) . '" title="oembed" />' . "\r\n";
- /*
- $r = q("SELECT resource_id, max(imgscale) AS imgscale FROM photo WHERE uid = %d
- and photo_usage in ( %d, %d ) and is_nsfw = %d $sql_extra GROUP BY resource_id",
- intval(\App::$data['channel']['channel_id']),
- intval(PHOTO_NORMAL),
- intval(PHOTO_PROFILE),
- intval($unsafe)
- );
- if($r) {
- \App::set_pager_total(count($r));
- \App::set_pager_itemspage(60);
- }
- */
\App::set_pager_itemspage(60);
- $r = q("SELECT p.resource_id, p.id, p.filename, p.mimetype, p.album, p.imgscale, p.created FROM photo p
+ $r = q("SELECT p.resource_id, p.id, p.filename, p.mimetype, p.album, p.imgscale, p.created, p.display_path
+ FROM photo p
INNER JOIN ( SELECT resource_id, max(imgscale) imgscale FROM photo
- WHERE uid = %d AND photo_usage IN ( %d, %d )
+ WHERE photo.uid = %d AND photo_usage IN ( %d, %d )
AND is_nsfw = %d $sql_extra group by resource_id ) ph
ON (p.resource_id = ph.resource_id and p.imgscale = ph.imgscale)
ORDER by p.created DESC LIMIT %d OFFSET %d",
@@ -1313,21 +1270,19 @@ class Photos extends \Zotlabs\Web\Controller {
if($r) {
$twist = 'rotright';
foreach($r as $rr) {
+
+ if(! attach_can_view_folder(\App::$data['channel']['channel_id'],get_observer_hash(),$rr['resource_id']))
+ continue;
+
if($twist == 'rotright')
$twist = 'rotleft';
else
$twist = 'rotright';
$ext = $phototypes[$rr['mimetype']];
- if(\App::get_template_engine() === 'internal') {
- $alt_e = template_escape($rr['filename']);
- $name_e = template_escape($rr['album']);
- }
- else {
- $alt_e = $rr['filename'];
- $name_e = $rr['album'];
- }
-
+ $alt_e = $rr['filename'];
+ $name_e = dirname($rr['display_path']);
+
$photos[] = array(
'id' => $rr['id'],
'twist' => ' ' . $twist . rand(2,4),
@@ -1336,9 +1291,7 @@ class Photos extends \Zotlabs\Web\Controller {
'src' => z_root() . '/photo/' . $rr['resource_id'] . '-' . ((($rr['imgscale']) == 6) ? 4 : $rr['imgscale']) . '.' . $ext,
'alt' => $alt_e,
'album' => array(
- 'link' => z_root() . '/photos/' . \App::$data['channel']['channel_address'] . '/album/' . bin2hex($rr['album']),
'name' => $name_e,
- 'alt' => t('View Album'),
),
);
diff --git a/Zotlabs/Module/Profile.php b/Zotlabs/Module/Profile.php
index fda88da52..ab349b05d 100644
--- a/Zotlabs/Module/Profile.php
+++ b/Zotlabs/Module/Profile.php
@@ -101,7 +101,7 @@ class Profile extends \Zotlabs\Web\Controller {
return;
}
- $o .= profile_tabs($a, $is_owner, \App::$profile['channel_address']);
+ //$o .= profile_tabs($a, $is_owner, \App::$profile['channel_address']);
\App::$page['htmlhead'] .= "\r\n" . '<link rel="alternate" type="application/json+oembed" href="' . z_root() . '/oep?f=&url=' . urlencode(z_root() . '/' . \App::$query_string) . '" title="oembed" />' . "\r\n";
diff --git a/Zotlabs/Module/Profile_photo.php b/Zotlabs/Module/Profile_photo.php
index 438580917..e8f0e5186 100644
--- a/Zotlabs/Module/Profile_photo.php
+++ b/Zotlabs/Module/Profile_photo.php
@@ -108,11 +108,13 @@ class Profile_photo extends \Zotlabs\Web\Controller {
$aid = get_account_id();
$p = [
- 'aid' => $aid,
- 'uid' => local_channel(),
- 'resource_id' => $base_image['resource_id'],
- 'filename' => $base_image['filename'],
- 'album' => t('Profile Photos')
+ 'aid' => $aid,
+ 'uid' => local_channel(),
+ 'resource_id' => $base_image['resource_id'],
+ 'filename' => $base_image['filename'],
+ 'album' => t('Profile Photos'),
+ 'os_path' => $base_image['os_path'],
+ 'display_path' => $base_image['display_path']
];
$p['imgscale'] = PHOTO_RES_PROFILE_300;
diff --git a/Zotlabs/Module/Profiles.php b/Zotlabs/Module/Profiles.php
index 32e888f14..f6e8b11ed 100644
--- a/Zotlabs/Module/Profiles.php
+++ b/Zotlabs/Module/Profiles.php
@@ -317,8 +317,10 @@ class Profiles extends \Zotlabs\Web\Controller {
$hide_friends = ((intval($_POST['hide_friends'])) ? 1: 0);
+// start fresh and create a new vcard. TODO: preserve the original guid or whatever else needs saving
+// $orig_vcard = (($orig[0]['profile_vcard']) ? \Sabre\VObject\Reader::read($orig[0]['profile_vcard']) : null);
- $orig_vcard = (($orig[0]['profile_vcard']) ? \Sabre\VObject\Reader::read($orig[0]['profile_vcard']) : null);
+ $orig_vcard = null;
$channel = \App::get_channel();
@@ -330,13 +332,7 @@ class Profiles extends \Zotlabs\Web\Controller {
'photo' => $channel['xchan_photo_l'],
'adr' => [],
'adr_type' => [ $default_vcard_cat ],
- 'tel' => [],
- 'tel_type' => [ $default_vcard_cat ],
- 'email' => [],
- 'email_type' => [ $default_vcard_cat ],
- 'impp' => [],
- 'impp_type' => [ $default_vcard_cat ],
- 'url' => [],
+ 'url' => [ $homepage ],
'url_type' => [ $default_vcard_cat ]
];
@@ -350,9 +346,12 @@ class Profiles extends \Zotlabs\Web\Controller {
6 => $country_name
];
-
$profile_vcard = update_vcard($defcard,$orig_vcard);
+ $orig_vcard = \Sabre\VObject\Reader::read($profile_vcard);
+
+ $profile_vcard = update_vcard($_REQUEST,$orig_vcard);
+
require_once('include/text.php');
linkify_tags($a, $likes, local_channel());
@@ -700,6 +699,10 @@ class Profiles extends \Zotlabs\Web\Controller {
}
//logger('extra_fields: ' . print_r($extra_fields,true));
+
+ $vc = $r[0]['profile_vcard'];
+ $vctmp = (($vc) ? \Sabre\VObject\Reader::read($vc) : null);
+ $vcard = (($vctmp) ? get_vcard_array($vctmp,$r[0]['id']) : [] );
$f = get_config('system','birthday_input_format');
if(! $f)
@@ -717,6 +720,7 @@ class Profiles extends \Zotlabs\Web\Controller {
. get_form_security_token("profile_drop"),
'$fields' => $fields,
+ '$vcard' => $vcard,
'$guid' => $r[0]['profile_guid'],
'$banner' => t('Edit Profile Details'),
'$submit' => t('Submit'),
@@ -776,11 +780,28 @@ class Profiles extends \Zotlabs\Web\Controller {
'$film' => array('film', t('Film/Dance/Culture/Entertainment'), $r[0]['film']),
'$interest' => array('interest', t('Hobbies/Interests'), $r[0]['interest']),
'$romance' => array('romance',t('Love/Romance'), $r[0]['romance']),
- '$work' => array('work', t('Work/Employment'), $r[0]['employment']),
+ '$employ' => array('work', t('Work/Employment'), $r[0]['employment']),
'$education' => array('education', t('School/Education'), $r[0]['education']),
'$contact' => array('contact', t('Contact information and social networks'), $r[0]['contact']),
'$channels' => array('channels', t('My other channels'), $r[0]['channels']),
'$extra_fields' => $extra_fields,
+ '$comms' => t('Communications'),
+ '$tel_label' => t('Phone'),
+ '$email_label' => t('Email'),
+ '$impp_label' => t('Instant messenger'),
+ '$url_label' => t('Website'),
+ '$adr_label' => t('Address'),
+ '$note_label' => t('Note'),
+ '$mobile' => t('Mobile'),
+ '$home' => t('Home'),
+ '$work' => t('Work'),
+ '$other' => t('Other'),
+ '$add_card' => t('Add Contact'),
+ '$add_field' => t('Add Field'),
+ '$create' => t('Create'),
+ '$update' => t('Update'),
+ '$delete' => t('Delete'),
+ '$cancel' => t('Cancel'),
));
$arr = array('profile' => $r[0], 'entry' => $o);
diff --git a/Zotlabs/Module/Pubstream.php b/Zotlabs/Module/Pubstream.php
index 6c4d479d4..46210abb1 100644
--- a/Zotlabs/Module/Pubstream.php
+++ b/Zotlabs/Module/Pubstream.php
@@ -57,6 +57,7 @@ class Pubstream extends \Zotlabs\Web\Controller {
'$static' => $static,
'$page' => ((\App::$pager['page'] != 1) ? \App::$pager['page'] : 1),
'$search' => '',
+ '$xchan' => '',
'$order' => 'comment',
'$file' => '',
'$cats' => '',
diff --git a/Zotlabs/Module/Search.php b/Zotlabs/Module/Search.php
index 89eaa4ffa..aacdc88e7 100644
--- a/Zotlabs/Module/Search.php
+++ b/Zotlabs/Module/Search.php
@@ -130,6 +130,7 @@ class Search extends \Zotlabs\Web\Controller {
'$list' => ((x($_REQUEST,'list')) ? intval($_REQUEST['list']) : 0),
'$page' => ((\App::$pager['page'] != 1) ? \App::$pager['page'] : 1),
'$search' => (($tag) ? urlencode('#') : '') . $search,
+ '$xchan' => '',
'$order' => '',
'$file' => '',
'$cats' => '',
diff --git a/Zotlabs/Module/Settings/Channel.php b/Zotlabs/Module/Settings/Channel.php
index 5b9cfdaca..56a7d0d8e 100644
--- a/Zotlabs/Module/Settings/Channel.php
+++ b/Zotlabs/Module/Settings/Channel.php
@@ -277,8 +277,8 @@ class Channel {
if($email_changed && \App::$config['system']['register_policy'] == REGISTER_VERIFY) {
// FIXME - set to un-verified, blocked and redirect to logout
- // Why? Are we verifying people or email addresses?
-
+ // Q: Why? Are we verifying people or email addresses?
+ // A: the policy is to verify email addresses
}
goaway(z_root() . '/settings' );
@@ -575,7 +575,7 @@ class Channel {
'$removeme' => t('Remove Channel'),
'$removechannel' => t('Remove this channel.'),
'$firefoxshare' => t('Firefox Share $Projectname provider'),
- '$cal_first_day' => array('first_day', t('Start calendar week on monday'), ((get_pconfig(local_channel(),'system','cal_first_day')) ? 1 : ''), '', $yes_no),
+ '$cal_first_day' => array('first_day', t('Start calendar week on Monday'), ((get_pconfig(local_channel(),'system','cal_first_day')) ? 1 : ''), '', $yes_no),
));
call_hooks('settings_form',$o);
diff --git a/Zotlabs/Module/Setup.php b/Zotlabs/Module/Setup.php
index 9c688af01..d4c31fd4e 100644
--- a/Zotlabs/Module/Setup.php
+++ b/Zotlabs/Module/Setup.php
@@ -508,6 +508,7 @@ class Setup extends \Zotlabs\Web\Controller {
$this->check_add($ck_funcs, t('PDO database PHP module'), true, true);
$this->check_add($ck_funcs, t('mb_string PHP module'), true, true);
$this->check_add($ck_funcs, t('xml PHP module'), true, true);
+ $this->check_add($ck_funcs, t('zip PHP module'), true, true);
if(function_exists('apache_get_modules')){
if (! in_array('mod_rewrite', apache_get_modules())) {
@@ -550,8 +551,12 @@ class Setup extends \Zotlabs\Web\Controller {
$ck_funcs[4]['help'] = t('Error: mb_string PHP module required but not installed.');
}
if(! extension_loaded('xml')) {
+ $ck_funcs[5]['status'] = false;
+ $ck_funcs[5]['help'] = t('Error: xml PHP module required for DAV but not installed.');
+ }
+ if(! extension_loaded('zip')) {
$ck_funcs[6]['status'] = false;
- $ck_funcs[6]['help'] = t('Error: xml PHP module required for DAV but not installed.');
+ $ck_funcs[6]['help'] = t('Error: zip PHP module required but not installed.');
}
$checks = array_merge($checks, $ck_funcs);
@@ -624,7 +629,6 @@ class Setup extends \Zotlabs\Web\Controller {
* @param[out] array &$checks
*/
function check_htaccess(&$checks) {
- $a = get_app();
$status = true;
$help = '';
$ssl_error = false;
@@ -718,7 +722,6 @@ class Setup extends \Zotlabs\Web\Controller {
* @return string with parsed HTML
*/
function what_next() {
- $a = get_app();
// install the standard theme
set_config('system', 'allowed_themes', 'redbasic');
diff --git a/Zotlabs/Module/Sharedwithme.php b/Zotlabs/Module/Sharedwithme.php
index 25bc7dba3..5d6d0f7da 100644
--- a/Zotlabs/Module/Sharedwithme.php
+++ b/Zotlabs/Module/Sharedwithme.php
@@ -92,7 +92,8 @@ class Sharedwithme extends \Zotlabs\Web\Controller {
}
- $o = profile_tabs($a, $is_owner, $channel['channel_address']);
+ //$o = profile_tabs($a, $is_owner, $channel['channel_address']);
+ $o = '';
$o .= replace_macros(get_markup_template('sharedwithme.tpl'), array(
'$header' => t('Files: shared with me'),
diff --git a/Zotlabs/Module/Suggest.php b/Zotlabs/Module/Suggest.php
index 367308d90..2a69145ed 100644
--- a/Zotlabs/Module/Suggest.php
+++ b/Zotlabs/Module/Suggest.php
@@ -3,8 +3,6 @@ namespace Zotlabs\Module;
require_once('include/socgraph.php');
require_once('include/contact_widgets.php');
-require_once('include/widgets.php');
-
class Suggest extends \Zotlabs\Web\Controller {
@@ -23,7 +21,7 @@ class Suggest extends \Zotlabs\Web\Controller {
}
- function get() {
+ function get() {
$o = '';
if(! local_channel()) {
diff --git a/Zotlabs/Module/Viewsrc.php b/Zotlabs/Module/Viewsrc.php
index cb305efc6..54ab89e81 100644
--- a/Zotlabs/Module/Viewsrc.php
+++ b/Zotlabs/Module/Viewsrc.php
@@ -13,6 +13,7 @@ class Viewsrc extends \Zotlabs\Web\Controller {
$item_id = ((argc() > 1) ? intval(argv(1)) : 0);
$json = ((argc() > 2 && argv(2) === 'json') ? true : false);
+ $dload = ((argc() > 2 && argv(2) === 'download') ? true : false);
if(! local_channel()) {
notice( t('Permission denied.') . EOL);
@@ -27,7 +28,7 @@ class Viewsrc extends \Zotlabs\Web\Controller {
$item_normal = item_normal();
if(local_channel() && $item_id) {
- $r = q("select id, item_flags, item_obscured, body from item where uid in (%d , %d) and id = %d $item_normal limit 1",
+ $r = q("select id, item_flags, mimetype, item_obscured, body from item where uid in (%d , %d) and id = %d $item_normal limit 1",
intval(local_channel()),
intval($sys['channel_id']),
intval($item_id)
@@ -35,7 +36,15 @@ class Viewsrc extends \Zotlabs\Web\Controller {
if($r) {
if(intval($r[0]['item_obscured']))
- $r[0]['body'] = crypto_unencapsulate(json_decode($r[0]['body'],true),get_config('system','prvkey'));
+ $dload = true;
+
+ if($dload) {
+ header('Content-type: ' . $r[0]['mimetype']);
+ header('Content-disposition: attachment; filename="' . t('item') . '-' . $item_id . '"' );
+ echo $r[0]['body'];
+ killme();
+ }
+
$content = escape_tags($r[0]['body']);
$o = (($json) ? json_encode($content) : str_replace("\n",'<br />',$content));
diff --git a/Zotlabs/Module/Webpages.php b/Zotlabs/Module/Webpages.php
index 46b94f091..5e3091dfa 100644
--- a/Zotlabs/Module/Webpages.php
+++ b/Zotlabs/Module/Webpages.php
@@ -142,7 +142,8 @@ class Webpages extends \Zotlabs\Web\Controller {
$is_owner = ($uid && $uid == $owner);
- $o = profile_tabs($a, $is_owner, \App::$profile['channel_address']);
+ //$o = profile_tabs($a, $is_owner, \App::$profile['channel_address']);
+ $o = '';
$x = array(
'webpage' => ITEM_TYPE_WEBPAGE,
@@ -693,7 +694,8 @@ class Webpages extends \Zotlabs\Web\Controller {
}
rrmdir($zip_folderpath); rrmdir($tmp_folderpath); // delete temporary files
-
+ killme();
+
break;
default :
break;
diff --git a/Zotlabs/Module/Wfinger.php b/Zotlabs/Module/Wfinger.php
index 04eed47c3..9623a676b 100644
--- a/Zotlabs/Module/Wfinger.php
+++ b/Zotlabs/Module/Wfinger.php
@@ -38,6 +38,9 @@ class Wfinger extends \Zotlabs\Web\Controller {
$channel = str_replace('acct:','',$resource);
if(strpos($channel,'@') !== false) {
$host = substr($channel,strpos($channel,'@')+1);
+
+ // If the webfinger address points off site, redirect to the correct site
+
if(strcasecmp($host,\App::get_hostname())) {
goaway('https://' . $host . '/.well-known/webfinger?f=&resource=' . $resource . (($zot) ? '&zot=' . $zot : ''));
}
@@ -77,54 +80,60 @@ class Wfinger extends \Zotlabs\Web\Controller {
}
}
- $result['aliases'] = array();
+ $result['aliases'] = [];
- $result['properties'] = array(
- 'http://webfinger.net/ns/name' => $r[0]['channel_name'],
+ $result['properties'] = [
+ 'http://webfinger.net/ns/name' => $r[0]['channel_name'],
'http://xmlns.com/foaf/0.1/name' => $r[0]['channel_name']
- );
+ ];
foreach($aliases as $alias)
if($alias != $resource)
$result['aliases'][] = $alias;
- $result['links'] = array(
+ $result['links'] = [
- array(
- 'rel' => 'http://webfinger.net/rel/avatar',
+ [
+ 'rel' => 'http://webfinger.net/rel/avatar',
'type' => $r[0]['xchan_photo_mimetype'],
'href' => $r[0]['xchan_photo_l']
- ),
+ ],
- array(
- 'rel' => 'http://webfinger.net/rel/profile-page',
+ [
+ 'rel' => 'http://webfinger.net/rel/profile-page',
'href' => z_root() . '/profile/' . $r[0]['channel_address'],
- ),
+ ],
- array(
- 'rel' => 'http://webfinger.net/rel/blog',
+ [
+ 'rel' => 'http://schemas.google.com/g/2010#updates-from',
+ 'type' => 'application/atom+xml',
+ 'href' => z_root() . '/ofeed/' . $r[0]['channel_address']
+ ],
+
+ [
+ 'rel' => 'http://webfinger.net/rel/blog',
'href' => z_root() . '/channel/' . $r[0]['channel_address'],
- ),
+ ],
- array(
- 'rel' => 'http://ostatus.org/schema/1.0/subscribe',
+ [
+ 'rel' => 'http://ostatus.org/schema/1.0/subscribe',
'template' => z_root() . '/follow/url={uri}',
- ),
+ ],
- array(
- 'rel' => 'http://purl.org/zot/protocol',
+ [
+ 'rel' => 'http://purl.org/zot/protocol',
'href' => z_root() . '/.well-known/zot-info' . '?address=' . $r[0]['xchan_addr'],
- ),
+ ],
- array(
- 'rel' => 'magic-public-key',
+ [
+ 'rel' => 'magic-public-key',
'href' => 'data:application/magic-public-key,' . salmon_key($r[0]['channel_pubkey']),
- )
- );
+ ]
+ ];
if($zot) {
// get a zotinfo packet and return it with webfinger
- $result['zot'] = zotinfo(array('address' => $r[0]['xchan_addr']));
+ $result['zot'] = zotinfo( [ 'address' => $r[0]['xchan_addr'] ]);
}
}
else {
@@ -132,7 +141,7 @@ class Wfinger extends \Zotlabs\Web\Controller {
killme();
}
- $arr = array('channel' => $r[0], 'request' => $_REQUEST, 'result' => $result);
+ $arr = [ 'channel' => $r[0], 'request' => $_REQUEST, 'result' => $result ];
call_hooks('webfinger',$arr);
json_return_and_die($arr['result'],'application/jrd+json');
diff --git a/Zotlabs/Module/Wiki.php b/Zotlabs/Module/Wiki.php
index 15806ffc3..a1e377e68 100644
--- a/Zotlabs/Module/Wiki.php
+++ b/Zotlabs/Module/Wiki.php
@@ -3,6 +3,7 @@
namespace Zotlabs\Module;
use \Zotlabs\Lib as Zlib;
+use \Michelf\MarkdownExtra;
require_once('include/acl_selectors.php');
require_once('include/conversation.php');
@@ -106,7 +107,8 @@ class Wiki extends \Zotlabs\Web\Controller {
}
$is_owner = ((local_channel()) && (local_channel() == \App::$profile['profile_uid']) ? true : false);
- $o = profile_tabs($a, $is_owner, \App::$profile['channel_address']);
+ //$o = profile_tabs($a, $is_owner, \App::$profile['channel_address']);
+ $o = '';
// Download a wiki
/*
@@ -234,16 +236,17 @@ class Wiki extends \Zotlabs\Web\Controller {
$mimeType = $p['mimeType'];
- $rawContent = htmlspecialchars_decode(json_decode($p['content']),ENT_COMPAT);
+ $sampleContent = (($mimeType == 'text/bbcode') ? '[h3]' . t('New page') . '[/h3]' : '### ' . t('New page'));
+
+ $content = (($p['content'] == '') ? $sampleContent : $p['content']);
- $content = ($p['content'] !== '' ? $rawContent : '"# New page\n"');
// Render the Markdown-formatted page content in HTML
if($mimeType == 'text/bbcode') {
$renderedContent = Zlib\NativeWikiPage::convert_links(zidify_links(smilies(bbcode($content))), argv(0) . '/' . argv(1) . '/' . $wikiUrlName);
}
else {
- require_once('library/markdown.php');
- $html = Zlib\NativeWikiPage::generate_toc(zidify_text(purify_html(Markdown(Zlib\NativeWikiPage::bbcode($content)))));
+ $content = Zlib\MarkdownSoap::unescape($content);
+ $html = Zlib\NativeWikiPage::generate_toc(zidify_text(MarkdownExtra::defaultTransform(Zlib\NativeWikiPage::bbcode($content))));
$renderedContent = Zlib\NativeWikiPage::convert_links($html, argv(0) . '/' . argv(1) . '/' . $wikiUrlName);
}
$showPageControls = $wiki_editor;
@@ -252,6 +255,7 @@ class Wiki extends \Zotlabs\Web\Controller {
goaway('/' . argv(0) . '/' . argv(1) . '/' . $wikiUrlName . '/' . $pageUrlName);
}
+
$wikiModalID = random_string(3);
$wikiModal = replace_macros(get_markup_template('generic_modal.tpl'), array(
@@ -327,9 +331,12 @@ class Wiki extends \Zotlabs\Web\Controller {
$html = Zlib\NativeWikiPage::convert_links(zidify_links(smilies(bbcode($content))),$wikiURL);
}
else {
- require_once('library/markdown.php');
- $content = Zlib\NativeWikiPage::bbcode($content);
- $html = Zlib\NativeWikiPage::generate_toc(zidify_text(purify_html(Markdown($content))));
+ $bb = Zlib\NativeWikiPage::bbcode($content);
+ $x = new ZLib\MarkdownSoap($bb);
+ $md = $x->clean();
+ $md = ZLib\MarkdownSoap::unescape($md);
+ $html = MarkdownExtra::defaultTransform($md);
+ $html = Zlib\NativeWikiPage::generate_toc(zidify_text($html));
$html = Zlib\NativeWikiPage::convert_links($html,$wikiURL);
}
json_return_and_die(array('html' => $html, 'success' => true));
@@ -356,6 +363,14 @@ class Wiki extends \Zotlabs\Web\Controller {
if($wiki['urlName'] === '') {
notice( t('Error creating wiki. Invalid name.') . EOL);
goaway('/wiki');
+ return; //not reached
+ }
+
+ $exists = Zlib\NativeWiki::exists_by_name($owner['channel_id'], $wiki['urlName']);
+ if($exists['id']) {
+ notice( t('A wiki with this name already exists.') . EOL);
+ goaway('/wiki');
+ return; //not reached
}
// Get ACL for permissions
@@ -454,7 +469,11 @@ class Wiki extends \Zotlabs\Web\Controller {
json_return_and_die(array('pages' => null, 'message' => 'Permission denied.', 'success' => false));
}
- $page_list_html = widget_wiki_pages(array(
+ // @FIXME - we shouldn't invoke this if it isn't in the PDL or has been over-ridden
+
+ $x = new \Zotlabs\Widget\Wiki_pages();
+
+ $page_list_html = $x->widget(array(
'resource_id' => $resource_id,
'refresh' => true,
'channel' => argv(1)));
@@ -512,7 +531,6 @@ class Wiki extends \Zotlabs\Web\Controller {
$resource_id = $_POST['resource_id'];
$pageUrlName = $_POST['name'];
-
// Determine if observer has permission to read content
$perms = Zlib\NativeWiki::get_permissions($resource_id, intval($owner['channel_id']), $observer_hash);
@@ -521,11 +539,12 @@ class Wiki extends \Zotlabs\Web\Controller {
json_return_and_die(array('historyHTML' => '', 'message' => 'Permission denied.', 'success' => false));
}
- $historyHTML = widget_wiki_page_history(array(
+ $historyHTML = \Zotlabs\Lib\NativeWikiPage::render_page_history(array(
'resource_id' => $resource_id,
'pageUrlName' => $pageUrlName,
'permsWrite' => $perms['write']
));
+
json_return_and_die(array('historyHTML' => $historyHTML, 'message' => '', 'success' => true));
}
diff --git a/Zotlabs/Module/Xrd.php b/Zotlabs/Module/Xrd.php
index 3ed19962b..7b36576e0 100644
--- a/Zotlabs/Module/Xrd.php
+++ b/Zotlabs/Module/Xrd.php
@@ -57,7 +57,7 @@ class Xrd extends \Zotlabs\Web\Controller {
'$aliases' => $aliases,
'$profile_url' => z_root() . '/channel/' . $r[0]['channel_address'],
'$hcard_url' => z_root() . '/hcard/' . $r[0]['channel_address'],
- '$atom' => z_root() . '/feed/' . $r[0]['channel_address'],
+ '$atom' => z_root() . '/ofeed/' . $r[0]['channel_address'],
'$zot_post' => z_root() . '/post/' . $r[0]['channel_address'],
'$poco_url' => z_root() . '/poco/' . $r[0]['channel_address'],
'$photo' => z_root() . '/photo/profile/l/' . $r[0]['channel_id'],
diff --git a/Zotlabs/Module/Zotfeed.php b/Zotlabs/Module/Zotfeed.php
index 6b505c890..381e3acb2 100644
--- a/Zotlabs/Module/Zotfeed.php
+++ b/Zotlabs/Module/Zotfeed.php
@@ -22,7 +22,8 @@ class Zotfeed extends \Zotlabs\Web\Controller {
$observer = \App::get_observer();
-
+ logger('observer: ' . get_observer_hash(), LOGGER_DEBUG);
+
$channel_address = ((argc() > 1) ? argv(1) : '');
if($channel_address) {
$r = q("select channel_id, channel_name from channel where channel_address = '%s' and channel_removed = 0 limit 1",
diff --git a/Zotlabs/Render/Comanche.php b/Zotlabs/Render/Comanche.php
index 5826063fd..beee9796e 100644
--- a/Zotlabs/Render/Comanche.php
+++ b/Zotlabs/Render/Comanche.php
@@ -4,8 +4,6 @@ namespace Zotlabs\Render;
require_once('include/security.php');
require_once('include/menu.php');
-require_once('include/widgets.php');
-
class Comanche {
@@ -20,7 +18,49 @@ class Comanche {
$s = str_replace($mtch[0], '', $s);
}
}
-
+
+ /*
+ * This section supports the "switch" statement of the form given by the following
+ * example. The [default][/default] block must be the last in the arbitrary
+ * list of cases. The first case that matches the switch variable is used
+ * and the rest are not evaluated.
+ *
+ * [switch observer.language]
+ * [case de]
+ * [block]german-content[/block]
+ * [/case]
+ * [case es]
+ * [block]spanish-content[/block]
+ * [/case]
+ * [default]
+ * [block]english-content[/block]
+ * [/default]
+ * [/switch]
+ */
+
+ $cnt = preg_match_all("/\[switch (.*?)\](.*?)\[default\](.*?)\[\/default\]\s*\[\/switch\]/ism", $s, $matches, PREG_SET_ORDER);
+ if($cnt) {
+ foreach($matches as $mtch) {
+ $switch_done = 0;
+ $switch_var = $this->get_condition_var($mtch[1]);
+ $default = $mtch[3];
+ $cases = array();
+ $cntt = preg_match_all("/\[case (.*?)\](.*?)\[\/case\]/ism", $mtch[2], $cases, PREG_SET_ORDER);
+ if($cntt) {
+ foreach($cases as $case) {
+ if($case[1] === $switch_var) {
+ $switch_done = 1;
+ $s = str_replace($mtch[0], $case[2], $s);
+ break;
+ }
+ }
+ if($switch_done === 0) {
+ $s = str_replace($mtch[0], $default, $s);
+ }
+ }
+ }
+ }
+
$cnt = preg_match_all("/\[if (.*?)\](.*?)\[else\](.*?)\[\/if\]/ism", $s, $matches, PREG_SET_ORDER);
if($cnt) {
foreach($matches as $mtch) {
@@ -410,6 +450,21 @@ class Comanche {
}
}
+ $clsname = ucfirst($name);
+ $nsname = "\\Zotlabs\\Widget\\" . $clsname;
+
+ if(file_exists('Zotlabs/SiteWidget/' . $clsname . '.php'))
+ require_once('Zotlabs/SiteWidget/' . $clsname . '.php');
+ elseif(file_exists('Zotlabs/Widget/' . $clsname . '.php'))
+ require_once('Zotlabs/Widget/' . $clsname . '.php');
+ if(class_exists($nsname)) {
+ $x = new $nsname;
+ $f = 'widget';
+ if(method_exists($x,$f)) {
+ return $x->$f($vars);
+ }
+ }
+
$func = 'widget_' . trim($name);
if(! function_exists($func)) {
diff --git a/Zotlabs/Storage/Browser.php b/Zotlabs/Storage/Browser.php
index f527a6a44..7162161ef 100644
--- a/Zotlabs/Storage/Browser.php
+++ b/Zotlabs/Storage/Browser.php
@@ -84,7 +84,7 @@ class Browser extends DAV\Browser\Plugin {
require_once('include/conversation.php');
require_once('include/text.php');
if ($this->auth->owner_nick) {
- $html = profile_tabs(get_app(), (($is_owner) ? true : false), $this->auth->owner_nick);
+ $html = '';
}
$files = $this->server->getPropertiesForPath($path, array(
@@ -240,9 +240,11 @@ class Browser extends DAV\Browser\Plugin {
'$nick' => $this->auth->getCurrentUser()
));
- $a = get_app();
+
+ $a = false;
+
\App::$page['content'] = $html;
- load_pdl($a);
+ load_pdl();
$current_theme = \Zotlabs\Render\Theme::current();
@@ -255,7 +257,7 @@ class Browser extends DAV\Browser\Plugin {
}
}
$this->server->httpResponse->setHeader('Content-Security-Policy', "script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'");
- construct_page($a);
+ construct_page();
}
/**
@@ -322,12 +324,16 @@ class Browser extends DAV\Browser\Plugin {
if(strpos($path,$special) === 0)
$path = trim(substr($path,$count),'/');
+ $info = t('Please use DAV to upload large (video, audio) files.<br>See <a class="zrl" href="help/member/member_guide#Cloud_Desktop_Clients">Cloud Desktop Clients</a>');
+
+
$output .= replace_macros(get_markup_template('cloud_actionspanel.tpl'), array(
'$folder_header' => t('Create new folder'),
'$folder_submit' => t('Create'),
'$upload_header' => t('Upload file'),
'$upload_submit' => t('Upload'),
'$quota' => $quota,
+ '$info' => $info,
'$channick' => $this->auth->owner_nick,
'$aclselect' => $aclselect,
'$allow_cid' => acl2json($channel_acl['allow_cid']),
diff --git a/Zotlabs/Storage/Directory.php b/Zotlabs/Storage/Directory.php
index 5d078b04e..0ed7a3c68 100644
--- a/Zotlabs/Storage/Directory.php
+++ b/Zotlabs/Storage/Directory.php
@@ -49,7 +49,7 @@ class Directory extends DAV\Node implements DAV\ICollection, DAV\IQuota {
* @param BasicAuth &$auth_plugin
*/
public function __construct($ext_path, &$auth_plugin) {
-// $ext_path = urldecode($ext_path);
+ // $ext_path = urldecode($ext_path);
logger('directory ' . $ext_path, LOGGER_DATA);
$this->ext_path = $ext_path;
// remove "/cloud" from the beginning of the path
@@ -167,6 +167,14 @@ class Directory extends DAV\Node implements DAV\ICollection, DAV\IQuota {
intval($this->auth->owner_id)
);
+ $x = attach_syspaths($this->auth->owner_id,$this->folder_hash);
+
+ $y = q("update attach set display_path = '%s where hash = '%s' and uid = %d",
+ dbesc($x['path']),
+ dbesc($this->folder_hash),
+ intval($this->auth->owner_id)
+ );
+
$ch = channelx_by_n($this->auth->owner_id);
if ($ch) {
$sync = attach_export_data($ch, $this->folder_hash);
@@ -260,14 +268,18 @@ class Directory extends DAV\Node implements DAV\ICollection, DAV\IQuota {
dbesc($f),
dbesc(datetime_convert()),
dbesc(datetime_convert()),
- '', //TODO: use os_path
- '', //TODO: use display_path
+ '',
+ '',
dbesc($allow_cid),
dbesc($allow_gid),
dbesc($deny_cid),
dbesc($deny_gid)
);
+ // fetch the actual storage paths
+
+ $xpath = attach_syspaths($this->auth->owner_id, $hash);
+
// returns the number of bytes that were written to the file, or FALSE on failure
$size = file_put_contents($f, $data);
// delete attach entry if file_put_contents() failed
@@ -281,15 +293,17 @@ class Directory extends DAV\Node implements DAV\ICollection, DAV\IQuota {
$edited = datetime_convert();
$is_photo = 0;
- $x = @getimagesize($f);
- logger('getimagesize: ' . print_r($x,true), LOGGER_DATA);
- if (($x) && ($x[2] === IMAGETYPE_GIF || $x[2] === IMAGETYPE_JPEG || $x[2] === IMAGETYPE_PNG)) {
+ $gis = @getimagesize($f);
+ logger('getimagesize: ' . print_r($gis,true), LOGGER_DATA);
+ if (($gis) && ($gis[2] === IMAGETYPE_GIF || $gis[2] === IMAGETYPE_JPEG || $gis[2] === IMAGETYPE_PNG)) {
$is_photo = 1;
}
// updates entry with filesize and timestamp
- $d = q("UPDATE attach SET filesize = '%s', is_photo = %d, edited = '%s' WHERE hash = '%s' AND uid = %d",
+ $d = q("UPDATE attach SET filesize = '%s', os_path = '%s', display_path = '%s', is_photo = %d, edited = '%s' WHERE hash = '%s' AND uid = %d",
dbesc($size),
+ dbesc($xpath['os_path']),
+ dbesc($xpath['display_path']),
intval($is_photo),
dbesc($edited),
dbesc($hash),
@@ -312,29 +326,29 @@ class Directory extends DAV\Node implements DAV\ICollection, DAV\IQuota {
// check against service class quota
$limit = engr_units_to_bytes(service_class_fetch($c[0]['channel_id'], 'attach_upload_limit'));
if ($limit !== false) {
- $x = q("SELECT SUM(filesize) AS total FROM attach WHERE aid = %d ",
+ $z = q("SELECT SUM(filesize) AS total FROM attach WHERE aid = %d ",
intval($c[0]['channel_account_id'])
);
- if (($x) && ($x[0]['total'] + $size > $limit)) {
- logger('service class limit exceeded for ' . $c[0]['channel_name'] . ' total usage is ' . $x[0]['total'] . ' limit is ' . userReadableSize($limit));
+ if (($z) && ($z[0]['total'] + $size > $limit)) {
+ logger('service class limit exceeded for ' . $c[0]['channel_name'] . ' total usage is ' . $z[0]['total'] . ' limit is ' . userReadableSize($limit));
attach_delete($c[0]['channel_id'], $hash);
return;
}
}
- if ($is_photo) {
+ if($is_photo) {
$album = '';
if ($this->folder_hash) {
- $f1 = q("select filename from attach WHERE hash = '%s' AND uid = %d",
+ $f1 = q("select filename, display_path from attach WHERE hash = '%s' AND uid = %d",
dbesc($this->folder_hash),
intval($c[0]['channel_id'])
);
if ($f1)
- $album = $f1[0]['filename'];
+ $album = (($f1[0]['display_path']) ? $f1[0]['display_path'] : $f1[0]['filename']);
}
require_once('include/photos.php');
- $args = array( 'resource_id' => $hash, 'album' => $album, 'os_path' => $f, 'filename' => $name, 'getimagesize' => $x, 'directory' => $direct);
+ $args = array( 'resource_id' => $hash, 'album' => $album, 'os_syspath' => $f, 'os_path' => $xpath['os_path'], 'display_path' => $xpath['path'], 'filename' => $name, 'getimagesize' => $gis, 'directory' => $direct);
$p = photo_upload($c[0], \App::get_observer(), $args);
}
@@ -646,20 +660,24 @@ class Directory extends DAV\Node implements DAV\ICollection, DAV\IQuota {
logger("Path mismatch: $path !== /$file");
return NULL;
}
- if(ACTIVE_DBTYPE == DBTYPE_POSTGRES) {
- $prefix = 'DISTINCT ON (filename)';
- $suffix = 'ORDER BY filename';
- }
- else {
- $prefix = '';
- $suffix = 'GROUP BY filename';
- }
+
+ $prefix = '';
+ $suffix = '';
+
$r = q("select $prefix id, uid, hash, filename, filetype, filesize, revision, folder, flags, is_dir, created, edited from attach where folder = '%s' and uid = %d $perms $suffix",
dbesc($folder),
intval($channel_id)
);
foreach ($r as $rr) {
+
+ // @FIXME I don't think we use revisions currently in attach structures.
+ // In case we see any in the wild provide a unique filename. This
+ // name may or may not be accessible
+
+ if($rr['revision'])
+ $rr['filename'] .= '-' . $rr['revision'];
+
//logger('filename: ' . $rr['filename'], LOGGER_DEBUG);
if (intval($rr['is_dir'])) {
$ret[] = new Directory($path . '/' . $rr['filename'], $auth);
@@ -687,7 +705,7 @@ class Directory extends DAV\Node implements DAV\ICollection, DAV\IQuota {
$ret = array();
$r = q("SELECT channel_id, channel_address FROM channel WHERE channel_removed = 0
- AND channel_system = 0 AND NOT (channel_pageflags & %d)>0",
+ AND channel_system = 0 AND (channel_pageflags & %d) = 0",
intval(PAGE_HIDDEN)
);
diff --git a/Zotlabs/Storage/File.php b/Zotlabs/Storage/File.php
index d2bca3964..1475241ab 100644
--- a/Zotlabs/Storage/File.php
+++ b/Zotlabs/Storage/File.php
@@ -85,13 +85,23 @@ class File extends DAV\Node implements DAV\IFile {
intval($this->data['id'])
);
+ $x = attach_syspaths($this->auth->owner_id,$this->data['hash']);
+
+ $y = q("update attach set display_path = '%s where hash = '%s' and uid = %d",
+ dbesc($x['path']),
+ dbesc($this->data['hash']),
+ intval($this->auth->owner_id)
+ );
+
if($this->data->is_photo) {
- $r = q("update photo set filename = '%s' where resource_id = '%s' and uid = %d",
+ $r = q("update photo set filename = '%s', display_path = '%s' where resource_id = '%s' and uid = %d",
dbesc($newName),
+ dbesc($x['path']),
dbesc($this->data['hash']),
intval($this->auth->owner_id)
);
}
+
$ch = channelx_by_n($this->auth->owner_id);
if($ch) {
$sync = attach_export_data($ch,$this->data['hash']);
diff --git a/Zotlabs/Web/Router.php b/Zotlabs/Web/Router.php
index ba2e78b25..3190369c8 100644
--- a/Zotlabs/Web/Router.php
+++ b/Zotlabs/Web/Router.php
@@ -62,12 +62,6 @@ class Router {
}
}
- if((strpos($module,'admin') === 0) && (! is_site_admin())) {
- \App::$module_loaded = false;
- notice( t('Permission denied.') . EOL);
- goaway(z_root());
- }
-
/*
* If the site has a custom module to over-ride the standard module, use it.
* Otherwise, look for the standard program module
@@ -208,7 +202,7 @@ class Router {
* The member may have also created a customised PDL that's stored in the config
*/
- load_pdl($a);
+ load_pdl();
/*
* load current theme info
diff --git a/Zotlabs/Web/WebServer.php b/Zotlabs/Web/WebServer.php
index 5bb0e08e8..4e8dc6786 100644
--- a/Zotlabs/Web/WebServer.php
+++ b/Zotlabs/Web/WebServer.php
@@ -79,11 +79,6 @@ class WebServer {
if(! x($_SESSION, 'sysmsg_info'))
$_SESSION['sysmsg_info'] = array();
- /*
- * check_config() is responsible for running update scripts. These automatically
- * update the DB schema whenever we push a new one out. It also checks to see if
- * any plugins have been added or removed and reacts accordingly.
- */
if(\App::$install) {
@@ -91,8 +86,16 @@ class WebServer {
if(\App::$module != 'view')
\App::$module = 'setup';
}
- else
- check_config($a);
+ else {
+
+ /*
+ * check_config() is responsible for running update scripts. These automatically
+ * update the DB schema whenever we push a new one out. It also checks to see if
+ * any plugins have been added or removed and reacts accordingly.
+ */
+
+ check_config();
+ }
nav_set_selected('nothing');
@@ -130,7 +133,7 @@ class WebServer {
call_hooks('page_end', \App::$page['content']);
- construct_page($a);
+ construct_page();
killme();
}
diff --git a/Zotlabs/Widget/Activity.php b/Zotlabs/Widget/Activity.php
new file mode 100644
index 000000000..7264a3360
--- /dev/null
+++ b/Zotlabs/Widget/Activity.php
@@ -0,0 +1,61 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+class Activity {
+
+ function widget($arr) {
+
+ if(! local_channel())
+ return '';
+
+ $o = '';
+
+ if(is_array($arr) && array_key_exists('limit',$arr))
+ $limit = " limit " . intval($limit) . " ";
+ else
+ $limit = '';
+
+ $perms_sql = item_permissions_sql(local_channel()) . item_normal();
+
+ $r = q("select author_xchan from item where item_unseen = 1 and uid = %d $perms_sql",
+ intval(local_channel())
+ );
+
+ $contributors = [];
+ $arr = [];
+
+ if($r) {
+ foreach($r as $rv) {
+ if(array_key_exists($rv['author_xchan'],$contributors)) {
+ $contributors[$rv['author_xchan']] ++;
+ }
+ else {
+ $contributors[$rv['author_xchan']] = 1;
+ }
+ }
+ foreach($contributors as $k => $v) {
+ $arr[] = [ 'author_xchan' => $k, 'total' => $v ];
+ }
+ usort($arr,'total_sort');
+ xchan_query($arr);
+ }
+
+ $x = [ 'entries' => $arr ];
+ call_hooks('activity_widget',$x);
+ $arr = $x['entries'];
+
+ if($arr) {
+ $o .= '<div class="widget">';
+ $o .= '<h3>' . t('Activity','widget') . '</h3><ul class="nav nav-pills flex-column">';
+
+ foreach($arr as $rv) {
+ $o .= '<li class="nav-item"><a class="nav-link" href="network?f=&xchan=' . urlencode($rv['author_xchan']) . '" ><span class="badge badge-default float-right">' . ((intval($rv['total'])) ? intval($rv['total']) : '') . '</span><img src="' . $rv['author']['xchan_photo_s'] . '" class="menu-img-1" /> ' . $rv['author']['xchan_name'] . '</a></li>';
+ }
+ $o .= '</ul></div>';
+ }
+ return $o;
+ }
+
+}
+
diff --git a/Zotlabs/Widget/Admin.php b/Zotlabs/Widget/Admin.php
new file mode 100644
index 000000000..a761eebe3
--- /dev/null
+++ b/Zotlabs/Widget/Admin.php
@@ -0,0 +1,68 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+class Admin {
+
+ function widget($arr) {
+
+ /*
+ * Side bar links
+ */
+
+ if(! is_site_admin()) {
+ return '';
+ }
+
+ $o = '';
+
+ // array( url, name, extra css classes )
+
+ $aside = [
+ 'site' => array(z_root() . '/admin/site/', t('Site'), 'site'),
+ 'accounts' => array(z_root() . '/admin/accounts/', t('Accounts'), 'accounts', 'pending-update', t('Member registrations waiting for confirmation')),
+ 'channels' => array(z_root() . '/admin/channels/', t('Channels'), 'channels'),
+ 'security' => array(z_root() . '/admin/security/', t('Security'), 'security'),
+ 'features' => array(z_root() . '/admin/features/', t('Features'), 'features'),
+ 'plugins' => array(z_root() . '/admin/plugins/', t('Plugins'), 'plugins'),
+ 'themes' => array(z_root() . '/admin/themes/', t('Themes'), 'themes'),
+ 'queue' => array(z_root() . '/admin/queue', t('Inspect queue'), 'queue'),
+ 'profs' => array(z_root() . '/admin/profs', t('Profile Fields'), 'profs'),
+ 'dbsync' => array(z_root() . '/admin/dbsync/', t('DB updates'), 'dbsync')
+ ];
+
+ /* get plugins admin page */
+
+ $r = q("SELECT * FROM addon WHERE plugin_admin = 1");
+
+ $plugins = array();
+ if($r) {
+ foreach ($r as $h){
+ $plugin = $h['aname'];
+ $plugins[] = array(z_root() . '/admin/plugins/' . $plugin, $plugin, 'plugin');
+ // temp plugins with admin
+ \App::$plugins_admin[] = $plugin;
+ }
+ }
+
+ $logs = array(z_root() . '/admin/logs/', t('Logs'), 'logs');
+
+ $arr = array('links' => $aside,'plugins' => $plugins,'logs' => $logs);
+ call_hooks('admin_aside',$arr);
+
+ $o .= replace_macros(get_markup_template('admin_aside.tpl'), array(
+ '$admin' => $aside,
+ '$admtxt' => t('Admin'),
+ '$plugadmtxt' => t('Plugin Features'),
+ '$plugins' => $plugins,
+ '$logtxt' => t('Logs'),
+ '$logs' => $logs,
+ '$h_pending' => t('Member registrations waiting for confirmation'),
+ '$admurl'=> z_root() . '/admin/'
+ ));
+
+ return $o;
+
+ }
+}
+
diff --git a/Zotlabs/Widget/Affinity.php b/Zotlabs/Widget/Affinity.php
new file mode 100644
index 000000000..439ba1f33
--- /dev/null
+++ b/Zotlabs/Widget/Affinity.php
@@ -0,0 +1,60 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+class Affinity {
+
+ function widget($arr) {
+
+ if(! local_channel())
+ return '';
+
+ // Get default cmin value from pconfig, but allow GET parameter to override
+ $cmin = intval(get_pconfig(local_channel(),'affinity','cmin'));
+ $cmin = (($cmin) ? $cmin : 0);
+ $cmin = ((x($_REQUEST,'cmin')) ? intval($_REQUEST['cmin']) : $cmin);
+
+ // Get default cmax value from pconfig, but allow GET parameter to override
+ $cmax = intval(get_pconfig(local_channel(),'affinity','cmax'));
+ $cmax = (($cmax) ? $cmax : 99);
+ $cmax = ((x($_REQUEST,'cmax')) ? intval($_REQUEST['cmax']) : $cmax);
+
+
+ if(feature_enabled(local_channel(),'affinity')) {
+
+ $labels = array(
+ t('Me'),
+ t('Family'),
+ t('Friends'),
+ t('Acquaintances'),
+ t('All')
+ );
+ call_hooks('affinity_labels',$labels);
+ $label_str = '';
+
+ if($labels) {
+ foreach($labels as $l) {
+ if($label_str) {
+ $label_str .= ", '|'";
+ $label_str .= ", '" . $l . "'";
+ }
+ else
+ $label_str .= "'" . $l . "'";
+ }
+ }
+
+ $tpl = get_markup_template('main_slider.tpl');
+ $x = replace_macros($tpl,array(
+ '$val' => $cmin . ',' . $cmax,
+ '$refresh' => t('Refresh'),
+ '$labels' => $label_str,
+ ));
+
+ $arr = array('html' => $x);
+ call_hooks('main_slider',$arr);
+ return $arr['html'];
+ }
+ return '';
+ }
+}
+ \ No newline at end of file
diff --git a/Zotlabs/Widget/Album.php b/Zotlabs/Widget/Album.php
new file mode 100644
index 000000000..f359e6d0f
--- /dev/null
+++ b/Zotlabs/Widget/Album.php
@@ -0,0 +1,106 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+require_once('include/attach.php');
+
+class Album {
+
+ function widget($args) {
+
+
+ $owner_uid = \App::$profile_uid;
+ $sql_extra = permissions_sql($owner_uid);
+
+
+ if(! perm_is_allowed($owner_uid,get_observer_hash(),'view_storage'))
+ return '';
+
+ if($args['album'])
+ $album = $args['album'];
+ if($args['title'])
+ $title = $args['title'];
+
+ /**
+ * This may return incorrect permissions if you have multiple directories of the same name.
+ * It is a limitation of the photo table using a name for a photo album instead of a folder hash
+ */
+
+ if($album) {
+ $x = q("select hash from attach where filename = '%s' and uid = %d limit 1",
+ dbesc($album),
+ intval($owner_uid)
+ );
+ if($x) {
+ $y = attach_can_view_folder($owner_uid,get_observer_hash(),$x[0]['hash']);
+ if(! $y)
+ return '';
+ }
+ }
+
+ $order = 'DESC';
+
+ $r = q("SELECT p.resource_id, p.id, p.filename, p.mimetype, p.imgscale, p.description, p.created FROM photo p INNER JOIN
+ (SELECT resource_id, max(imgscale) imgscale FROM photo WHERE uid = %d AND album = '%s' AND imgscale <= 4 AND photo_usage IN ( %d, %d ) $sql_extra GROUP BY resource_id) ph
+ ON (p.resource_id = ph.resource_id AND p.imgscale = ph.imgscale)
+ ORDER BY created $order ",
+ intval($owner_uid),
+ dbesc($album),
+ intval(PHOTO_NORMAL),
+ intval(PHOTO_PROFILE)
+ );
+
+ //edit album name
+ $album_edit = null;
+
+ $photos = array();
+ if($r) {
+ $twist = 'rotright';
+ foreach($r as $rr) {
+
+ if($twist == 'rotright')
+ $twist = 'rotleft';
+ else
+ $twist = 'rotright';
+
+ $ext = $phototypes[$rr['mimetype']];
+
+ $imgalt_e = $rr['filename'];
+ $desc_e = $rr['description'];
+
+ $imagelink = (z_root() . '/photos/' . \App::$profile['channel_address'] . '/image/' . $rr['resource_id']);
+
+
+ $photos[] = array(
+ 'id' => $rr['id'],
+ 'twist' => ' ' . $twist . rand(2,4),
+ 'link' => $imagelink,
+ 'title' => t('View Photo'),
+ 'src' => z_root() . '/photo/' . $rr['resource_id'] . '-' . $rr['imgscale'] . '.' .$ext,
+ 'alt' => $imgalt_e,
+ 'desc'=> $desc_e,
+ 'ext' => $ext,
+ 'hash'=> $rr['resource_id'],
+ 'unknown' => t('Unknown')
+ );
+ }
+ }
+
+
+ $tpl = get_markup_template('photo_album.tpl');
+ $o .= replace_macros($tpl, array(
+ '$photos' => $photos,
+ '$album' => (($title) ? $title : $album),
+ '$album_id' => rand(),
+ '$album_edit' => array(t('Edit Album'), $album_edit),
+ '$can_post' => false,
+ '$upload' => array(t('Upload'), z_root() . '/photos/' . \App::$profile['channel_address'] . '/upload/' . bin2hex($album)),
+ '$order' => false,
+ '$upload_form' => $upload_form,
+ '$usage' => $usage_message
+ ));
+
+ return $o;
+ }
+}
+
diff --git a/Zotlabs/Widget/Appcategories.php b/Zotlabs/Widget/Appcategories.php
new file mode 100644
index 000000000..490ec1abc
--- /dev/null
+++ b/Zotlabs/Widget/Appcategories.php
@@ -0,0 +1,49 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+class Appcategories {
+
+ function widget($arr) {
+
+ if(! local_channel())
+ return '';
+
+ $selected = ((x($_REQUEST,'cat')) ? htmlspecialchars($_REQUEST['cat'],ENT_COMPAT,'UTF-8') : '');
+
+ // @FIXME ??? $srchurl undefined here - commented out until is reviewed
+ //$srchurl = rtrim(preg_replace('/cat\=[^\&].*?(\&|$)/is','',$srchurl),'&');
+ //$srchurl = str_replace(array('?f=','&f='),array('',''),$srchurl);
+
+ // Leaving this line which negates the effect of the two invalid lines prior
+ $srchurl = z_root() . '/apps';
+
+ $terms = array();
+
+ $r = q("select distinct(term.term)
+ from term join app on term.oid = app.id
+ where app_channel = %d
+ and term.uid = app_channel
+ and term.otype = %d
+ and term.term != 'nav_featured_app'
+ order by term.term asc",
+ intval(local_channel()),
+ intval(TERM_OBJ_APP)
+ );
+
+ if($r) {
+ foreach($r as $rr)
+ $terms[] = array('name' => $rr['term'], 'selected' => (($selected == $rr['term']) ? 'selected' : ''));
+
+ return replace_macros(get_markup_template('categories_widget.tpl'),array(
+ '$title' => t('Categories'),
+ '$desc' => '',
+ '$sel_all' => (($selected == '') ? 'selected' : ''),
+ '$all' => t('Everything'),
+ '$terms' => $terms,
+ '$base' => $srchurl,
+
+ ));
+ }
+ }
+}
diff --git a/Zotlabs/Widget/Appcloud.php b/Zotlabs/Widget/Appcloud.php
new file mode 100644
index 000000000..2a4671eee
--- /dev/null
+++ b/Zotlabs/Widget/Appcloud.php
@@ -0,0 +1,13 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+class Appcloud {
+
+ function widget($arr) {
+ if(! local_channel())
+ return '';
+ return app_tagblock(z_root() . '/apps');
+ }
+}
+
diff --git a/Zotlabs/Widget/Archive.php b/Zotlabs/Widget/Archive.php
new file mode 100644
index 000000000..c151ca563
--- /dev/null
+++ b/Zotlabs/Widget/Archive.php
@@ -0,0 +1,55 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+
+class Archive {
+
+ function widget($arr) {
+
+ $o = '';
+
+ if(! \App::$profile_uid) {
+ return '';
+ }
+
+ $uid = \App::$profile_uid;
+
+ if(! feature_enabled($uid,'archives'))
+ return '';
+
+ if(! perm_is_allowed($uid,get_observer_hash(),'view_stream'))
+ return '';
+
+ $wall = ((array_key_exists('wall', $arr)) ? intval($arr['wall']) : 0);
+ $style = ((array_key_exists('style', $arr)) ? $arr['style'] : 'select');
+ $showend = ((get_pconfig($uid,'system','archive_show_end_date')) ? true : false);
+ $mindate = get_pconfig($uid,'system','archive_mindate');
+ $visible_years = get_pconfig($uid,'system','archive_visible_years');
+ if(! $visible_years)
+ $visible_years = 5;
+
+ $url = z_root() . '/' . \App::$cmd;
+
+ $ret = list_post_dates($uid,$wall,$mindate);
+
+ if(! count($ret))
+ return '';
+
+ $cutoff_year = intval(datetime_convert('',date_default_timezone_get(),'now','Y')) - $visible_years;
+ $cutoff = ((array_key_exists($cutoff_year,$ret))? true : false);
+
+ $o = replace_macros(get_markup_template('posted_date_widget.tpl'),array(
+ '$title' => t('Archives'),
+ '$size' => $visible_years,
+ '$cutoff_year' => $cutoff_year,
+ '$cutoff' => $cutoff,
+ '$url' => $url,
+ '$style' => $style,
+ '$showend' => $showend,
+ '$dates' => $ret
+ ));
+ return $o;
+ }
+}
+
diff --git a/Zotlabs/Widget/Bookmarkedchats.php b/Zotlabs/Widget/Bookmarkedchats.php
new file mode 100644
index 000000000..d64bbdb4b
--- /dev/null
+++ b/Zotlabs/Widget/Bookmarkedchats.php
@@ -0,0 +1,28 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+class Bookmarkedchats {
+
+ function widget($arr) {
+
+ if(! feature_enabled(\App::$profile['profile_uid'],'ajaxchat'))
+ return '';
+
+ $h = get_observer_hash();
+ if(! $h)
+ return;
+ $r = q("select xchat_url, xchat_desc from xchat where xchat_xchan = '%s' order by xchat_desc",
+ dbesc($h)
+ );
+ if($r) {
+ for($x = 0; $x < count($r); $x ++) {
+ $r[$x]['xchat_url'] = zid($r[$x]['xchat_url']);
+ }
+ }
+ return replace_macros(get_markup_template('bookmarkedchats.tpl'),array(
+ '$header' => t('Bookmarked Chatrooms'),
+ '$rooms' => $r
+ ));
+ }
+}
diff --git a/Zotlabs/Widget/Catcloud_wall.php b/Zotlabs/Widget/Catcloud_wall.php
new file mode 100644
index 000000000..3795987cc
--- /dev/null
+++ b/Zotlabs/Widget/Catcloud_wall.php
@@ -0,0 +1,19 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+class Catcloud_wall {
+
+ function widget($arr) {
+
+ if((! \App::$profile['profile_uid']) || (! \App::$profile['channel_hash']))
+ return '';
+ if(! perm_is_allowed(\App::$profile['profile_uid'], get_observer_hash(), 'view_stream'))
+ return '';
+
+ $limit = ((array_key_exists('limit',$arr)) ? intval($arr['limit']) : 50);
+
+ return catblock(\App::$profile['profile_uid'], $limit, '', \App::$profile['channel_hash'], 'wall');
+ }
+
+}
diff --git a/Zotlabs/Widget/Categories.php b/Zotlabs/Widget/Categories.php
new file mode 100644
index 000000000..d1dcfda93
--- /dev/null
+++ b/Zotlabs/Widget/Categories.php
@@ -0,0 +1,23 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+require_once('include/contact_widgets.php');
+
+class Categories {
+
+ function widget($arr) {
+
+ if((! \App::$profile['profile_uid'])
+ || (! perm_is_allowed(\App::$profile['profile_uid'],get_observer_hash(),'view_stream'))) {
+ return '';
+ }
+
+ $cat = ((x($_REQUEST,'cat')) ? htmlspecialchars($_REQUEST['cat'],ENT_COMPAT,'UTF-8') : '');
+ $srchurl = \App::$query_string;
+ $srchurl = rtrim(preg_replace('/cat\=[^\&].*?(\&|$)/is','',$srchurl),'&');
+ $srchurl = str_replace(array('?f=','&f='),array('',''),$srchurl);
+
+ return categories_widget($srchurl, $cat);
+ }
+}
diff --git a/Zotlabs/Widget/Chatroom_list.php b/Zotlabs/Widget/Chatroom_list.php
new file mode 100644
index 000000000..e2aad0e05
--- /dev/null
+++ b/Zotlabs/Widget/Chatroom_list.php
@@ -0,0 +1,24 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+class Chatroom_list {
+
+ function widget($arr) {
+
+ if(! \App::$profile)
+ return '';
+
+ $r = \Zotlabs\Lib\Chatroom::roomlist(\App::$profile['profile_uid']);
+
+ if($r) {
+ return replace_macros(get_markup_template('chatroomlist.tpl'), array(
+ '$header' => t('Chatrooms'),
+ '$baseurl' => z_root(),
+ '$nickname' => \App::$profile['channel_address'],
+ '$items' => $r,
+ '$overview' => t('Overview')
+ ));
+ }
+ }
+}
diff --git a/Zotlabs/Widget/Chatroom_members.php b/Zotlabs/Widget/Chatroom_members.php
new file mode 100644
index 000000000..8ed77fb3c
--- /dev/null
+++ b/Zotlabs/Widget/Chatroom_members.php
@@ -0,0 +1,15 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+class Chatroom_members {
+
+ // The actual contents are filled in via AJAX
+
+ function widget() {
+ return replace_macros(get_markup_template('chatroom_members.tpl'), array(
+ '$header' => t('Chat Members')
+ ));
+ }
+
+}
diff --git a/Zotlabs/Widget/Clock.php b/Zotlabs/Widget/Clock.php
new file mode 100644
index 000000000..b63b5f748
--- /dev/null
+++ b/Zotlabs/Widget/Clock.php
@@ -0,0 +1,63 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+class Clock {
+
+ function widget($arr) {
+
+ $miltime = 0;
+ if(isset($arr['military']) && $arr['military'])
+ $miltime = 1;
+
+ $o = <<< EOT
+<div class="widget">
+<h3 class="clockface"></h3>
+<script>
+
+var timerID = null
+var timerRunning = false
+
+function stopclock(){
+ if(timerRunning)
+ clearTimeout(timerID)
+ timerRunning = false
+}
+
+function startclock(){
+ stopclock()
+ showtime()
+}
+
+function showtime(){
+ var now = new Date()
+ var hours = now.getHours()
+ var minutes = now.getMinutes()
+ var seconds = now.getSeconds()
+ var military = $miltime
+ var timeValue = ""
+ if(military)
+ timeValue = hours
+ else
+ timeValue = ((hours > 12) ? hours - 12 : hours)
+ timeValue += ((minutes < 10) ? ":0" : ":") + minutes
+// timeValue += ((seconds < 10) ? ":0" : ":") + seconds
+ if(! military)
+ timeValue += (hours >= 12) ? " P.M." : " A.M."
+ $('.clockface').html(timeValue)
+ timerID = setTimeout("showtime()",1000)
+ timerRunning = true
+}
+
+$(document).ready(function() {
+ startclock();
+});
+
+</script>
+</div>
+EOT;
+
+ return $o;
+ }
+}
+
diff --git a/Zotlabs/Widget/Collections.php b/Zotlabs/Widget/Collections.php
new file mode 100644
index 000000000..d2b29679a
--- /dev/null
+++ b/Zotlabs/Widget/Collections.php
@@ -0,0 +1,51 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+require_once('include/group.php');
+
+class Collections {
+
+ function widget($args) {
+
+ $mode = ((array_key_exists('mode',$args)) ? $args['mode'] : 'conversation');
+ switch($mode) {
+ case 'conversation':
+ $every = argv(0);
+ $each = argv(0);
+ $edit = true;
+ $current = $_REQUEST['gid'];
+ $abook_id = 0;
+ $wmode = 0;
+ break;
+ case 'connections':
+ $every = 'connections';
+ $each = 'group';
+ $edit = true;
+ $current = $_REQUEST['gid'];
+ $abook_id = 0;
+ $wmode = 0;
+ case 'groups':
+ $every = 'connections';
+ $each = argv(0);
+ $edit = false;
+ $current = intval(argv(1));
+ $abook_id = 0;
+ $wmode = 1;
+ break;
+ case 'abook':
+ $every = 'connections';
+ $each = 'group';
+ $edit = false;
+ $current = 0;
+ $abook_id = \App::$poi['abook_xchan'];
+ $wmode = 1;
+ break;
+ default:
+ return '';
+ break;
+ }
+
+ return group_side($every, $each, $edit, $current, $abook_id, $wmode);
+ }
+}
diff --git a/Zotlabs/Widget/Conversations.php b/Zotlabs/Widget/Conversations.php
new file mode 100644
index 000000000..27e517c02
--- /dev/null
+++ b/Zotlabs/Widget/Conversations.php
@@ -0,0 +1,74 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+class Conversations {
+
+ function widget($arr) {
+
+ if (! local_channel())
+ return;
+
+ if(argc() > 1) {
+
+ switch(argv(1)) {
+ case 'combined':
+ $mailbox = 'combined';
+ $header = t('Conversations');
+ break;
+ case 'inbox':
+ $mailbox = 'inbox';
+ $header = t('Received Messages');
+ break;
+ case 'outbox':
+ $mailbox = 'outbox';
+ $header = t('Sent Messages');
+ break;
+ default:
+ $mailbox = 'combined';
+ $header = t('Conversations');
+ break;
+ }
+
+ require_once('include/message.php');
+
+ // private_messages_list() can do other more complicated stuff, for now keep it simple
+ $r = private_messages_list(local_channel(), $mailbox, \App::$pager['start'], \App::$pager['itemspage']);
+
+ if(! $r) {
+ info( t('No messages.') . EOL);
+ return $o;
+ }
+
+ $messages = array();
+
+ foreach($r as $rr) {
+
+ $messages[] = array(
+ 'mailbox' => $mailbox,
+ 'id' => $rr['id'],
+ 'from_name' => $rr['from']['xchan_name'],
+ 'from_url' => chanlink_hash($rr['from_xchan']),
+ 'from_photo' => $rr['from']['xchan_photo_s'],
+ 'to_name' => $rr['to']['xchan_name'],
+ 'to_url' => chanlink_hash($rr['to_xchan']),
+ 'to_photo' => $rr['to']['xchan_photo_s'],
+ 'subject' => (($rr['seen']) ? $rr['title'] : '<strong>' . $rr['title'] . '</strong>'),
+ 'delete' => t('Delete conversation'),
+ 'body' => $rr['body'],
+ 'date' => datetime_convert('UTC',date_default_timezone_get(),$rr['created'], 'c'),
+ 'seen' => $rr['seen'],
+ 'selected' => ((argv(2)) ? (argv(2) == $rr['id']) : ($r[0]['id'] == $rr['id']))
+ );
+ }
+
+ $tpl = get_markup_template('mail_head.tpl');
+ $o .= replace_macros($tpl, array(
+ '$header' => $header,
+ '$messages' => $messages
+ ));
+
+ }
+ return $o;
+ }
+}
diff --git a/Zotlabs/Widget/Cover_photo.php b/Zotlabs/Widget/Cover_photo.php
new file mode 100644
index 000000000..d2eb1be92
--- /dev/null
+++ b/Zotlabs/Widget/Cover_photo.php
@@ -0,0 +1,59 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+class Cover_photo {
+
+ function widget($arr) {
+
+ require_once('include/channel.php');
+ $o = '';
+
+ if(\App::$module == 'channel' && $_REQUEST['mid'])
+ return '';
+
+ $channel_id = 0;
+ if(array_key_exists('channel_id', $arr) && intval($arr['channel_id']))
+ $channel_id = intval($arr['channel_id']);
+ if(! $channel_id)
+ $channel_id = \App::$profile_uid;
+ if(! $channel_id)
+ return '';
+
+ $channel = channelx_by_n($channel_id);
+
+ if(array_key_exists('style', $arr) && isset($arr['style']))
+ $style = $arr['style'];
+ else
+ $style = 'width:100%; height: auto;';
+
+ // ensure they can't sneak in an eval(js) function
+
+ if(strpbrk($style,'(\'"<>') !== false)
+ $style = '';
+
+ if(array_key_exists('title', $arr) && isset($arr['title']))
+ $title = $arr['title'];
+ else
+ $title = $channel['channel_name'];
+
+ if(array_key_exists('subtitle', $arr) && isset($arr['subtitle']))
+ $subtitle = $arr['subtitle'];
+ else
+ $subtitle = str_replace('@','&#x40;',$channel['xchan_addr']);
+
+ $c = get_cover_photo($channel_id,'html');
+
+ if($c) {
+ $photo_html = (($style) ? str_replace('alt=',' style="' . $style . '" alt=',$c) : $c);
+
+ $o = replace_macros(get_markup_template('cover_photo_widget.tpl'),array(
+ '$photo_html' => $photo_html,
+ '$title' => $title,
+ '$subtitle' => $subtitle,
+ '$hovertitle' => t('Click to show more'),
+ ));
+ }
+ return $o;
+ }
+}
diff --git a/Zotlabs/Widget/Design_tools.php b/Zotlabs/Widget/Design_tools.php
new file mode 100644
index 000000000..8ab6a235d
--- /dev/null
+++ b/Zotlabs/Widget/Design_tools.php
@@ -0,0 +1,21 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+class Design_tools {
+
+ function widget($arr) {
+
+ // mod menu doesn't load a profile. For any modules which load a profile, check it.
+ // otherwise local_channel() is sufficient for permissions.
+
+ if(\App::$profile['profile_uid'])
+ if((\App::$profile['profile_uid'] != local_channel()) && (! \App::$is_sys))
+ return '';
+
+ if(! local_channel())
+ return '';
+
+ return design_tools();
+ }
+} \ No newline at end of file
diff --git a/Zotlabs/Widget/Dirsort.php b/Zotlabs/Widget/Dirsort.php
new file mode 100644
index 000000000..e75a00e50
--- /dev/null
+++ b/Zotlabs/Widget/Dirsort.php
@@ -0,0 +1,11 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+require_once('include/dir_fns.php');
+
+class Dirsort {
+ function widget($arr) {
+ return dir_sort_links();
+ }
+}
diff --git a/Zotlabs/Widget/Dirtags.php b/Zotlabs/Widget/Dirtags.php
new file mode 100644
index 000000000..f211d5942
--- /dev/null
+++ b/Zotlabs/Widget/Dirtags.php
@@ -0,0 +1,13 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+require_once('include/dir_fns.php');
+
+class Dirtags {
+
+ function widget($arr) {
+ return dir_tagblock(z_root() . '/directory', null);
+ }
+
+}
diff --git a/Zotlabs/Widget/Eventstools.php b/Zotlabs/Widget/Eventstools.php
new file mode 100644
index 000000000..7efd3f72e
--- /dev/null
+++ b/Zotlabs/Widget/Eventstools.php
@@ -0,0 +1,19 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+class Eventstools {
+
+ function widget($arr) {
+
+ if(! local_channel())
+ return;
+
+ return replace_macros(get_markup_template('events_tools_side.tpl'), array(
+ '$title' => t('Events Tools'),
+ '$export' => t('Export Calendar'),
+ '$import' => t('Import Calendar'),
+ '$submit' => t('Submit')
+ ));
+ }
+}
diff --git a/Zotlabs/Widget/Filer.php b/Zotlabs/Widget/Filer.php
new file mode 100644
index 000000000..5d6f96a87
--- /dev/null
+++ b/Zotlabs/Widget/Filer.php
@@ -0,0 +1,36 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+require_once('include/contact_widgets.php');
+
+class Filer {
+
+ function widget($arr) {
+ if(! local_channel())
+ return '';
+
+
+ $selected = ((x($_REQUEST,'file')) ? $_REQUEST['file'] : '');
+
+ $terms = array();
+ $r = q("select distinct term from term where uid = %d and ttype = %d order by term asc",
+ intval(local_channel()),
+ intval(TERM_FILE)
+ );
+ if(! $r)
+ return;
+
+ foreach($r as $rr)
+ $terms[] = array('name' => $rr['term'], 'selected' => (($selected == $rr['term']) ? 'selected' : ''));
+
+ return replace_macros(get_markup_template('fileas_widget.tpl'),array(
+ '$title' => t('Saved Folders'),
+ '$desc' => '',
+ '$sel_all' => (($selected == '') ? 'selected' : ''),
+ '$all' => t('Everything'),
+ '$terms' => $terms,
+ '$base' => z_root() . '/' . \App::$cmd
+ ));
+ }
+}
diff --git a/Zotlabs/Widget/Findpeople.php b/Zotlabs/Widget/Findpeople.php
new file mode 100644
index 000000000..f450b96ae
--- /dev/null
+++ b/Zotlabs/Widget/Findpeople.php
@@ -0,0 +1,12 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+require_once('include/contact_widgets.php');
+
+class Findpeople {
+ function widget($arr) {
+ return findpeople_widget();
+ }
+}
+
diff --git a/Zotlabs/Widget/Follow.php b/Zotlabs/Widget/Follow.php
new file mode 100644
index 000000000..c4aecc8e1
--- /dev/null
+++ b/Zotlabs/Widget/Follow.php
@@ -0,0 +1,37 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+
+class Follow {
+
+ function widget($args) {
+ if(! local_channel())
+ return '';
+
+ $uid = \App::$channel['channel_id'];
+ $r = q("select count(*) as total from abook where abook_channel = %d and abook_self = 0 ",
+ intval($uid)
+ );
+
+ if($r)
+ $total_channels = $r[0]['total'];
+
+ $limit = service_class_fetch($uid,'total_channels');
+ if($limit !== false) {
+ $abook_usage_message = sprintf( t("You have %1$.0f of %2$.0f allowed connections."), $total_channels, $limit);
+ }
+ else {
+ $abook_usage_message = '';
+ }
+
+ return replace_macros(get_markup_template('follow.tpl'),array(
+ '$connect' => t('Add New Connection'),
+ '$desc' => t('Enter channel address'),
+ '$hint' => t('Examples: bob@example.com, https://example.com/barbara'),
+ '$follow' => t('Connect'),
+ '$abook_usage_message' => $abook_usage_message
+ ));
+ }
+}
+
diff --git a/Zotlabs/Widget/Forums.php b/Zotlabs/Widget/Forums.php
new file mode 100644
index 000000000..67e498b24
--- /dev/null
+++ b/Zotlabs/Widget/Forums.php
@@ -0,0 +1,97 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+class Forums {
+
+ function widget($arr) {
+
+ if(! local_channel())
+ return '';
+
+ $o = '';
+
+ if(is_array($arr) && array_key_exists('limit',$arr))
+ $limit = " limit " . intval($limit) . " ";
+ else
+ $limit = '';
+
+ $unseen = 0;
+ if(is_array($arr) && array_key_exists('unseen',$arr) && intval($arr['unseen']))
+ $unseen = 1;
+
+ $perms_sql = item_permissions_sql(local_channel()) . item_normal();
+
+ $xf = false;
+
+ $x1 = q("select xchan from abconfig where chan = %d and cat = 'their_perms' and k = 'send_stream' and v = '0'",
+ intval(local_channel())
+ );
+ if($x1) {
+ $xc = ids_to_querystr($x1,'xchan',true);
+ $x2 = q("select xchan from abconfig where chan = %d and cat = 'their_perms' and k = 'tag_deliver' and v = '1' and xchan in (" . $xc . ") ",
+ intval(local_channel())
+ );
+ if($x2)
+ $xf = ids_to_querystr($x2,'xchan',true);
+ }
+
+ $sql_extra = (($xf) ? " and ( xchan_hash in (" . $xf . ") or xchan_pubforum = 1 ) " : " and xchan_pubforum = 1 ");
+
+ $r1 = q("select abook_id, xchan_hash, xchan_name, xchan_url, xchan_photo_s from abook left join xchan on abook_xchan = xchan_hash where xchan_deleted = 0 and abook_channel = %d $sql_extra order by xchan_name $limit ",
+ intval(local_channel())
+ );
+ if(! $r1)
+ return $o;
+
+ $str = '';
+
+ // Trying to cram all this into a single query with joins and the proper group by's is tough.
+ // There also should be a way to update this via ajax.
+
+ for($x = 0; $x < count($r1); $x ++) {
+ $r = q("select sum(item_unseen) as unseen from item where owner_xchan = '%s' and uid = %d and item_unseen = 1 $perms_sql ",
+ dbesc($r1[$x]['xchan_hash']),
+ intval(local_channel())
+ );
+ if($r)
+ $r1[$x]['unseen'] = $r[0]['unseen'];
+
+ /**
+ * @FIXME
+ * This SQL makes the counts correct when you get forum posts arriving from different routes/sources
+ * (like personal channels). However the network query for these posts doesn't yet include this
+ * correction and it makes the SQL for that query pretty hairy so this is left as a future exercise.
+ * It may make more sense in that query to look for the mention in the body rather than another join,
+ * but that makes it very inefficient.
+ *
+ $r = q("select sum(item_unseen) as unseen from item left join term on oid = id where otype = %d and owner_xchan != '%s' and item.uid = %d and url = '%s' and ttype = %d $perms_sql ",
+ intval(TERM_OBJ_POST),
+ dbesc($r1[$x]['xchan_hash']),
+ intval(local_channel()),
+ dbesc($r1[$x]['xchan_url']),
+ intval(TERM_MENTION)
+ );
+ if($r)
+ $r1[$x]['unseen'] = ((array_key_exists('unseen',$r1[$x])) ? $r1[$x]['unseen'] + $r[0]['unseen'] : $r[0]['unseen']);
+ *
+ * end @FIXME
+ */
+
+ }
+
+ if($r1) {
+ $o .= '<div class="widget">';
+ $o .= '<h3>' . t('Forums') . '</h3><ul class="nav nav-pills flex-column">';
+
+ foreach($r1 as $rr) {
+ if($unseen && (! intval($rr['unseen'])))
+ continue;
+ $o .= '<li class="nav-item"><a class="nav-link" href="network?f=&pf=1&cid=' . $rr['abook_id'] . '" ><span class="badge badge-default float-right">' . ((intval($rr['unseen'])) ? intval($rr['unseen']) : '') . '</span><img class ="menu-img-1" src="' . $rr['xchan_photo_s'] . '" /> ' . $rr['xchan_name'] . '</a></li>';
+ }
+ $o .= '</ul></div>';
+ }
+ return $o;
+
+ }
+}
diff --git a/Zotlabs/Widget/Fullprofile.php b/Zotlabs/Widget/Fullprofile.php
new file mode 100644
index 000000000..d7340ef40
--- /dev/null
+++ b/Zotlabs/Widget/Fullprofile.php
@@ -0,0 +1,16 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+class Fullprofile {
+
+ function widget($arr) {
+
+ if(! \App::$profile['profile_uid'])
+ return;
+
+ $block = observer_prohibited();
+
+ return profile_sidebar(\App::$profile, $block);
+ }
+}
diff --git a/Zotlabs/Widget/Helpindex.php b/Zotlabs/Widget/Helpindex.php
new file mode 100644
index 000000000..f23e73e75
--- /dev/null
+++ b/Zotlabs/Widget/Helpindex.php
@@ -0,0 +1,45 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+class Helpindex {
+
+ function widget($arr) {
+
+ $o .= '<div class="widget">';
+
+ $level_0 = get_help_content('sitetoc');
+ if(! $level_0)
+ $level_0 = get_help_content('toc');
+
+ $level_0 = preg_replace('/\<ul(.*?)\>/','<ul class="nav nav-pills flex-column">',$level_0);
+
+ $levels = array();
+
+
+ if(argc() > 2) {
+ $path = '';
+ for($x = 1; $x < argc(); $x ++) {
+ $path .= argv($x) . '/';
+ $y = get_help_content($path . 'sitetoc');
+ if(! $y)
+ $y = get_help_content($path . 'toc');
+ if($y)
+ $levels[] = preg_replace('/\<ul(.*?)\>/','<ul class="nav nav-pills flex-column">',$y);
+ }
+ }
+
+ if($level_0)
+ $o .= $level_0;
+ if($levels) {
+ foreach($levels as $l) {
+ $o .= '<br /><br />';
+ $o .= $l;
+ }
+ }
+
+ $o .= '</div>';
+
+ return $o;
+ }
+}
diff --git a/Zotlabs/Widget/Item.php b/Zotlabs/Widget/Item.php
new file mode 100644
index 000000000..273d5649c
--- /dev/null
+++ b/Zotlabs/Widget/Item.php
@@ -0,0 +1,54 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+require_once('include/security.php');
+
+class Item {
+
+ function widget($arr) {
+
+ $channel_id = 0;
+ if(array_key_exists('channel_id',$arr) && intval($arr['channel_id']))
+ $channel_id = intval($arr['channel_id']);
+ if(! $channel_id)
+ $channel_id = \App::$profile_uid;
+ if(! $channel_id)
+ return '';
+
+
+ if((! $arr['mid']) && (! $arr['title']))
+ return '';
+
+ if(! perm_is_allowed($channel_id, get_observer_hash(), 'view_pages'))
+ return '';
+
+ $sql_extra = item_permissions_sql($channel_id);
+
+ if($arr['title']) {
+ $r = q("select item.* from item left join iconfig on item.id = iconfig.iid
+ where item.uid = %d and iconfig.cat = 'system' and iconfig.v = '%s'
+ and iconfig.k = 'WEBPAGE' and item_type = %d $sql_options $revision limit 1",
+ intval($channel_id),
+ dbesc($arr['title']),
+ intval(ITEM_TYPE_WEBPAGE)
+ );
+ }
+ else {
+ $r = q("select * from item where mid = '%s' and uid = %d and item_type = "
+ . intval(ITEM_TYPE_WEBPAGE) . " $sql_extra limit 1",
+ dbesc($arr['mid']),
+ intval($channel_id)
+ );
+ }
+
+ if(! $r)
+ return '';
+
+ xchan_query($r);
+ $r = fetch_post_tags($r, true);
+
+ $o = prepare_page($r[0]);
+ return $o;
+ }
+}
diff --git a/Zotlabs/Widget/Mailmenu.php b/Zotlabs/Widget/Mailmenu.php
new file mode 100644
index 000000000..512f7d9c0
--- /dev/null
+++ b/Zotlabs/Widget/Mailmenu.php
@@ -0,0 +1,36 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+class Mailmenu {
+
+ function widget($arr) {
+
+ if (! local_channel())
+ return;
+
+ return replace_macros(get_markup_template('message_side.tpl'), array(
+ '$title' => t('Private Mail Menu'),
+ '$combined' => array(
+ 'label' => t('Combined View'),
+ 'url' => z_root() . '/mail/combined',
+ 'sel' => (argv(1) == 'combined'),
+ ),
+ '$inbox' => array(
+ 'label' => t('Inbox'),
+ 'url' => z_root() . '/mail/inbox',
+ 'sel' => (argv(1) == 'inbox'),
+ ),
+ '$outbox' => array(
+ 'label' => t('Outbox'),
+ 'url' => z_root() . '/mail/outbox',
+ 'sel' => (argv(1) == 'outbox'),
+ ),
+ '$new' => array(
+ 'label' => t('New Message'),
+ 'url' => z_root() . '/mail/new',
+ 'sel'=> (argv(1) == 'new'),
+ )
+ ));
+ }
+}
diff --git a/Zotlabs/Widget/Menu_preview.php b/Zotlabs/Widget/Menu_preview.php
new file mode 100644
index 000000000..51218f6cf
--- /dev/null
+++ b/Zotlabs/Widget/Menu_preview.php
@@ -0,0 +1,16 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+require_once('include/menu.php');
+
+class Menu_preview {
+
+ function widget($arr) {
+ if(! \App::$data['menu_item'])
+ return;
+
+ return menu_render(\App::$data['menu_item']);
+ }
+
+}
diff --git a/Zotlabs/Widget/Notes.php b/Zotlabs/Widget/Notes.php
new file mode 100644
index 000000000..5c83a550f
--- /dev/null
+++ b/Zotlabs/Widget/Notes.php
@@ -0,0 +1,23 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+class Notes {
+
+ function widget($arr) {
+ if(! local_channel())
+ return '';
+ if(! feature_enabled(local_channel(),'private_notes'))
+ return '';
+
+ $text = get_pconfig(local_channel(),'notes','text');
+
+ $o = replace_macros(get_markup_template('notes.tpl'), array(
+ '$banner' => t('Notes'),
+ '$text' => $text,
+ '$save' => t('Save'),
+ ));
+
+ return $o;
+ }
+}
diff --git a/Zotlabs/Widget/Photo.php b/Zotlabs/Widget/Photo.php
new file mode 100644
index 000000000..10031f028
--- /dev/null
+++ b/Zotlabs/Widget/Photo.php
@@ -0,0 +1,55 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+
+class Photo {
+
+
+ /**
+ * @brief Widget to display a single photo.
+ *
+ * @param array $arr associative array with
+ * * \e string \b src URL of photo; URL must be an http or https URL
+ * * \e boolean \b zrl use zid in URL
+ * * \e string \b style CSS string
+ *
+ * @return string with parsed HTML
+ */
+
+ function widget($arr) {
+
+ $style = $zrl = false;
+
+ if(array_key_exists('src', $arr) && isset($arr['src']))
+ $url = $arr['src'];
+
+ if(strpos($url, 'http') !== 0)
+ return '';
+
+ if(array_key_exists('style', $arr) && isset($arr['style']))
+ $style = $arr['style'];
+
+ // ensure they can't sneak in an eval(js) function
+
+ if(strpbrk($style, '(\'"<>' ) !== false)
+ $style = '';
+
+ if(array_key_exists('zrl', $arr) && isset($arr['zrl']))
+ $zrl = (($arr['zrl']) ? true : false);
+
+ if($zrl)
+ $url = zid($url);
+
+ $o = '<div class="widget">';
+
+ $o .= '<img ' . (($zrl) ? ' class="zrl" ' : '')
+ . (($style) ? ' style="' . $style . '"' : '')
+ . ' src="' . $url . '" alt="' . t('photo/image') . '">';
+
+ $o .= '</div>';
+
+ return $o;
+ }
+}
+
diff --git a/Zotlabs/Widget/Photo_albums.php b/Zotlabs/Widget/Photo_albums.php
new file mode 100644
index 000000000..6df8ddf3c
--- /dev/null
+++ b/Zotlabs/Widget/Photo_albums.php
@@ -0,0 +1,25 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+require_once('include/photos.php');
+
+class Photo_albums {
+
+ function widget($arr) {
+
+ if(! \App::$profile['profile_uid'])
+ return '';
+
+ $channelx = channelx_by_n(\App::$profile['profile_uid']);
+
+ if((! $channelx) || (! perm_is_allowed(\App::$profile['profile_uid'], get_observer_hash(), 'view_storage')))
+ return '';
+
+ $sortkey = ((array_key_exists('sortkey',$arr)) ? $arr['sortkey'] : 'display_path');
+ $direction = ((array_key_exists('direction',$arr)) ? $arr['direction'] : 'asc');
+
+ return photos_album_widget($channelx, \App::get_observer(),$sortkey,$direction);
+ }
+}
+
diff --git a/Zotlabs/Widget/Photo_rand.php b/Zotlabs/Widget/Photo_rand.php
new file mode 100644
index 000000000..af80a3b9f
--- /dev/null
+++ b/Zotlabs/Widget/Photo_rand.php
@@ -0,0 +1,66 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+require_once('include/photos.php');
+
+class Photo_rand {
+
+ function widget($arr) {
+
+ $style = false;
+
+ if(array_key_exists('album', $arr) && isset($arr['album']))
+ $album = $arr['album'];
+ else
+ $album = '';
+
+ $channel_id = 0;
+ if(array_key_exists('channel_id', $arr) && intval($arr['channel_id']))
+ $channel_id = intval($arr['channel_id']);
+ if(! $channel_id)
+ $channel_id = \App::$profile_uid;
+ if(! $channel_id)
+ return '';
+
+ $scale = ((array_key_exists('scale',$arr)) ? intval($arr['scale']) : 0);
+
+ $ret = photos_list_photos(array('channel_id' => $channel_id),\App::get_observer(),$album);
+
+ $filtered = array();
+ if($ret['success'] && $ret['photos'])
+ foreach($ret['photos'] as $p)
+ if($p['imgscale'] == $scale)
+ $filtered[] = $p['src'];
+
+ if($filtered) {
+ $e = mt_rand(0, count($filtered) - 1);
+ $url = $filtered[$e];
+ }
+
+ if(strpos($url, 'http') !== 0)
+ return '';
+
+ if(array_key_exists('style', $arr) && isset($arr['style']))
+ $style = $arr['style'];
+
+ // ensure they can't sneak in an eval(js) function
+
+ if(strpos($style,'(') !== false)
+ return '';
+
+ $url = zid($url);
+
+ $o = '<div class="widget">';
+
+ $o .= '<img class="zrl" '
+ . (($style) ? ' style="' . $style . '"' : '')
+ . ' src="' . $url . '" alt="' . t('photo/image') . '">';
+
+ $o .= '</div>';
+
+ return $o;
+ }
+}
+
+
diff --git a/Zotlabs/Widget/Profile.php b/Zotlabs/Widget/Profile.php
new file mode 100644
index 000000000..bffd910b6
--- /dev/null
+++ b/Zotlabs/Widget/Profile.php
@@ -0,0 +1,13 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+
+class Profile {
+
+ function widget($args) {
+ $block = observer_prohibited();
+ return profile_sidebar(\App::$profile, $block, true);
+ }
+
+} \ No newline at end of file
diff --git a/Zotlabs/Widget/Pubsites.php b/Zotlabs/Widget/Pubsites.php
new file mode 100644
index 000000000..958ba68c2
--- /dev/null
+++ b/Zotlabs/Widget/Pubsites.php
@@ -0,0 +1,16 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+class Pubsites {
+
+ // used by site ratings pages to provide a return link
+
+ function widget($arr) {
+ if(\App::$poi)
+ return;
+ return '<div class="widget"><ul class="nav nav-pills"><li><a href="pubsites">' . t('Public Hubs') . '</a></li></ul></div>';
+ }
+}
+
+
diff --git a/Zotlabs/Widget/Random_block.php b/Zotlabs/Widget/Random_block.php
new file mode 100644
index 000000000..465a51f97
--- /dev/null
+++ b/Zotlabs/Widget/Random_block.php
@@ -0,0 +1,46 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+class Random_block {
+
+ function widget($arr) {
+
+ $channel_id = 0;
+ if(array_key_exists('channel_id',$arr) && intval($arr['channel_id']))
+ $channel_id = intval($arr['channel_id']);
+ if(! $channel_id)
+ $channel_id = \App::$profile_uid;
+ if(! $channel_id)
+ return '';
+
+ if(array_key_exists('contains',$arr))
+ $contains = $arr['contains'];
+
+ $o = '';
+
+ require_once('include/security.php');
+ $sql_options = item_permissions_sql($channel_id);
+
+ $randfunc = db_getfunc('RAND');
+
+ $r = q("select item.* from item left join iconfig on item.id = iconfig.iid
+ where item.uid = %d and iconfig.cat = 'system' and iconfig.v like '%s' and iconfig.k = 'BUILDBLOCK' and
+ item_type = %d $sql_options order by $randfunc limit 1",
+ intval($channel_id),
+ dbesc('%' . $contains . '%'),
+ intval(ITEM_TYPE_BLOCK)
+ );
+
+ if($r) {
+ $o = '<div class="widget bblock">';
+ if($r[0]['title'])
+ $o .= '<h3>' . $r[0]['title'] . '</h3>';
+
+ $o .= prepare_text($r[0]['body'],$r[0]['mimetype']);
+ $o .= '</div>';
+ }
+
+ return $o;
+ }
+}
diff --git a/Zotlabs/Widget/Rating.php b/Zotlabs/Widget/Rating.php
new file mode 100644
index 000000000..5e09f457b
--- /dev/null
+++ b/Zotlabs/Widget/Rating.php
@@ -0,0 +1,67 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+class Rating {
+
+ function widget($arr) {
+
+
+ $rating_enabled = get_config('system','rating_enabled');
+ if(! $rating_enabled) {
+ return;
+ }
+
+ if($arr['target'])
+ $hash = $arr['target'];
+ else
+ $hash = \App::$poi['xchan_hash'];
+
+ if(! $hash)
+ return;
+
+ $url = '';
+ $remote = false;
+
+ if(remote_channel() && ! local_channel()) {
+ $ob = \App::get_observer();
+ if($ob && $ob['xchan_url']) {
+ $p = parse_url($ob['xchan_url']);
+ if($p) {
+ $url = $p['scheme'] . '://' . $p['host'] . (($p['port']) ? ':' . $p['port'] : '');
+ $url .= '/rate?f=&target=' . urlencode($hash);
+ }
+ $remote = true;
+ }
+ }
+
+ $self = false;
+
+ if(local_channel()) {
+ $channel = \App::get_channel();
+
+ if($hash == $channel['channel_hash'])
+ $self = true;
+
+ head_add_js('ratings.js');
+ }
+
+
+ $o = '<div class="widget">';
+ $o .= '<h3>' . t('Rating Tools') . '</h3>';
+
+ if((($remote) || (local_channel())) && (! $self)) {
+ if($remote)
+ $o .= '<a class="btn btn-block btn-primary btn-sm" href="' . $url . '"><i class="fa fa-pencil"></i> ' . t('Rate Me') . '</a>';
+ else
+ $o .= '<div class="btn btn-block btn-primary btn-sm" onclick="doRatings(\'' . $hash . '\'); return false;"><i class="fa fa-pencil"></i> ' . t('Rate Me') . '</div>';
+ }
+
+ $o .= '<a class="btn btn-block btn-default btn-sm" href="ratings/' . $hash . '"><i class="fa fa-eye"></i> ' . t('View Ratings') . '</a>';
+ $o .= '</div>';
+
+ return $o;
+
+ }
+}
+
diff --git a/Zotlabs/Widget/Savedsearch.php b/Zotlabs/Widget/Savedsearch.php
new file mode 100644
index 000000000..378c27139
--- /dev/null
+++ b/Zotlabs/Widget/Savedsearch.php
@@ -0,0 +1,91 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+class Savedsearch {
+
+ function widget($arr) {
+
+ if((! local_channel()) || (! feature_enabled(local_channel(),'savedsearch')))
+ return '';
+
+ $search = ((x($_GET,'netsearch')) ? $_GET['netsearch'] : '');
+ if(! $search)
+ $search = ((x($_GET,'search')) ? $_GET['search'] : '');
+
+ if(x($_GET,'searchsave') && $search) {
+ $r = q("select * from term where uid = %d and ttype = %d and term = '%s' limit 1",
+ intval(local_channel()),
+ intval(TERM_SAVEDSEARCH),
+ dbesc($search)
+ );
+ if(! $r) {
+ q("insert into term ( uid,ttype,term ) values ( %d, %d, '%s') ",
+ intval(local_channel()),
+ intval(TERM_SAVEDSEARCH),
+ dbesc($search)
+ );
+ }
+ }
+
+ if(x($_GET,'searchremove') && $search) {
+ q("delete from term where uid = %d and ttype = %d and term = '%s'",
+ intval(local_channel()),
+ intval(TERM_SAVEDSEARCH),
+ dbesc($search)
+ );
+ $search = '';
+ }
+
+ $srchurl = \App::$query_string;
+
+ $srchurl = rtrim(preg_replace('/searchsave\=[^\&].*?(\&|$)/is','',$srchurl),'&');
+ $hasq = ((strpos($srchurl,'?') !== false) ? true : false);
+ $srchurl = rtrim(preg_replace('/searchremove\=[^\&].*?(\&|$)/is','',$srchurl),'&');
+
+ $srchurl = rtrim(preg_replace('/search\=[^\&].*?(\&|$)/is','',$srchurl),'&');
+ $srchurl = rtrim(preg_replace('/submit\=[^\&].*?(\&|$)/is','',$srchurl),'&');
+ $srchurl = str_replace(array('?f=','&f='),array('',''),$srchurl);
+
+
+ $hasq = ((strpos($srchurl,'?') !== false) ? true : false);
+ $hasamp = ((strpos($srchurl,'&') !== false) ? true : false);
+
+ if(($hasamp) && (! $hasq))
+ $srchurl = substr($srchurl,0,strpos($srchurl,'&')) . '?f=&' . substr($srchurl,strpos($srchurl,'&')+1);
+
+ $o = '';
+
+ $r = q("select tid,term from term WHERE uid = %d and ttype = %d ",
+ intval(local_channel()),
+ intval(TERM_SAVEDSEARCH)
+ );
+
+ $saved = array();
+
+ if(count($r)) {
+ foreach($r as $rr) {
+ $saved[] = array(
+ 'id' => $rr['tid'],
+ 'term' => $rr['term'],
+ 'dellink' => z_root() . '/' . $srchurl . (($hasq || $hasamp) ? '' : '?f=') . '&amp;searchremove=1&amp;search=' . urlencode($rr['term']),
+ 'srchlink' => z_root() . '/' . $srchurl . (($hasq || $hasamp) ? '' : '?f=') . '&amp;search=' . urlencode($rr['term']),
+ 'displayterm' => htmlspecialchars($rr['term'], ENT_COMPAT,'UTF-8'),
+ 'encodedterm' => urlencode($rr['term']),
+ 'delete' => t('Remove term'),
+ 'selected' => ($search==$rr['term']),
+ );
+ }
+ }
+
+ $tpl = get_markup_template("saved_searches.tpl");
+ $o = replace_macros($tpl, array(
+ '$title' => t('Saved Searches'),
+ '$add' => t('add'),
+ '$searchbox' => searchbox($search, 'netsearch-box', $srchurl . (($hasq) ? '' : '?f='), true),
+ '$saved' => $saved,
+ ));
+
+ return $o;
+ }
+}
diff --git a/Zotlabs/Widget/Settings_menu.php b/Zotlabs/Widget/Settings_menu.php
new file mode 100644
index 000000000..753390c23
--- /dev/null
+++ b/Zotlabs/Widget/Settings_menu.php
@@ -0,0 +1,137 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+class Settings_menu {
+
+ function widget($arr) {
+
+ if(! local_channel())
+ return;
+
+
+ $channel = \App::get_channel();
+
+ $abook_self_id = 0;
+
+ // Retrieve the 'self' address book entry for use in the auto-permissions link
+
+ $role = get_pconfig(local_channel(),'system','permissions_role');
+
+ $abk = q("select abook_id from abook where abook_channel = %d and abook_self = 1 limit 1",
+ intval(local_channel())
+ );
+ if($abk)
+ $abook_self_id = $abk[0]['abook_id'];
+
+ $x = q("select count(*) as total from hubloc where hubloc_hash = '%s' and hubloc_deleted = 0 ",
+ dbesc($channel['channel_hash'])
+ );
+
+ $hublocs = (($x && $x[0]['total'] > 1) ? true : false);
+
+ $tabs = array(
+ array(
+ 'label' => t('Account settings'),
+ 'url' => z_root().'/settings/account',
+ 'selected' => ((argv(1) === 'account') ? 'active' : ''),
+ ),
+
+ array(
+ 'label' => t('Channel settings'),
+ 'url' => z_root().'/settings/channel',
+ 'selected' => ((argv(1) === 'channel') ? 'active' : ''),
+ ),
+
+ );
+
+ if(get_account_techlevel() > 0 && get_features()) {
+ $tabs[] = array(
+ 'label' => t('Additional features'),
+ 'url' => z_root().'/settings/features',
+ 'selected' => ((argv(1) === 'features') ? 'active' : ''),
+ );
+ }
+
+ $tabs[] = array(
+ 'label' => t('Feature/Addon settings'),
+ 'url' => z_root().'/settings/featured',
+ 'selected' => ((argv(1) === 'featured') ? 'active' : ''),
+ );
+
+ $tabs[] = array(
+ 'label' => t('Display settings'),
+ 'url' => z_root().'/settings/display',
+ 'selected' => ((argv(1) === 'display') ? 'active' : ''),
+ );
+
+ if($hublocs) {
+ $tabs[] = array(
+ 'label' => t('Manage locations'),
+ 'url' => z_root() . '/locs',
+ 'selected' => ((argv(1) === 'locs') ? 'active' : ''),
+ );
+ }
+
+ $tabs[] = array(
+ 'label' => t('Export channel'),
+ 'url' => z_root() . '/uexport',
+ 'selected' => ''
+ );
+
+ $tabs[] = array(
+ 'label' => t('Connected apps'),
+ 'url' => z_root() . '/settings/oauth',
+ 'selected' => ((argv(1) === 'oauth') ? 'active' : ''),
+ );
+
+ if(get_account_techlevel() > 2) {
+ $tabs[] = array(
+ 'label' => t('Guest Access Tokens'),
+ 'url' => z_root() . '/settings/tokens',
+ 'selected' => ((argv(1) === 'tokens') ? 'active' : ''),
+ );
+ }
+
+ if(feature_enabled(local_channel(),'permcats')) {
+ $tabs[] = array(
+ 'label' => t('Permission Groups'),
+ 'url' => z_root() . '/settings/permcats',
+ 'selected' => ((argv(1) === 'permcats') ? 'active' : ''),
+ );
+ }
+
+
+ if($role === false || $role === 'custom') {
+ $tabs[] = array(
+ 'label' => t('Connection Default Permissions'),
+ 'url' => z_root() . '/connedit/' . $abook_self_id,
+ 'selected' => ''
+ );
+ }
+
+ if(feature_enabled(local_channel(),'premium_channel')) {
+ $tabs[] = array(
+ 'label' => t('Premium Channel Settings'),
+ 'url' => z_root() . '/connect/' . $channel['channel_address'],
+ 'selected' => ''
+ );
+ }
+
+ if(feature_enabled(local_channel(),'channel_sources')) {
+ $tabs[] = array(
+ 'label' => t('Channel Sources'),
+ 'url' => z_root() . '/sources',
+ 'selected' => ''
+ );
+ }
+
+ $tabtpl = get_markup_template("generic_links_widget.tpl");
+ return replace_macros($tabtpl, array(
+ '$title' => t('Settings'),
+ '$class' => 'settings-widget',
+ '$items' => $tabs,
+ ));
+ }
+
+} \ No newline at end of file
diff --git a/Zotlabs/Widget/Shortprofile.php b/Zotlabs/Widget/Shortprofile.php
new file mode 100644
index 000000000..9c2a46e75
--- /dev/null
+++ b/Zotlabs/Widget/Shortprofile.php
@@ -0,0 +1,18 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+class Shortprofile {
+
+ function widget($arr) {
+
+ if(! \App::$profile['profile_uid'])
+ return;
+
+ $block = observer_prohibited();
+
+ return profile_sidebar(\App::$profile, $block, true, true);
+ }
+
+}
+
diff --git a/Zotlabs/Widget/Sitesearch.php b/Zotlabs/Widget/Sitesearch.php
new file mode 100644
index 000000000..b3a25d76a
--- /dev/null
+++ b/Zotlabs/Widget/Sitesearch.php
@@ -0,0 +1,38 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+
+class Sitesearch {
+
+ function widget($arr) {
+
+ $search = ((x($_GET,'search')) ? $_GET['search'] : '');
+
+ $srchurl = \App::$query_string;
+
+ $srchurl = rtrim(preg_replace('/search\=[^\&].*?(\&|$)/is','',$srchurl),'&');
+ $srchurl = rtrim(preg_replace('/submit\=[^\&].*?(\&|$)/is','',$srchurl),'&');
+ $srchurl = str_replace(array('?f=','&f='),array('',''),$srchurl);
+
+
+ $hasq = ((strpos($srchurl,'?') !== false) ? true : false);
+ $hasamp = ((strpos($srchurl,'&') !== false) ? true : false);
+
+ if(($hasamp) && (! $hasq))
+ $srchurl = substr($srchurl,0,strpos($srchurl,'&')) . '?f=&' . substr($srchurl,strpos($srchurl,'&')+1);
+
+ $o = '';
+
+ $saved = array();
+
+ $tpl = get_markup_template("sitesearch.tpl");
+ $o = replace_macros($tpl, array(
+ '$title' => t('Search'),
+ '$searchbox' => searchbox($search, 'netsearch-box', $srchurl . (($hasq) ? '' : '?f='), false),
+ '$saved' => $saved,
+ ));
+
+ return $o;
+ }
+}
diff --git a/Zotlabs/Widget/Suggestedchats.php b/Zotlabs/Widget/Suggestedchats.php
new file mode 100644
index 000000000..7df42944d
--- /dev/null
+++ b/Zotlabs/Widget/Suggestedchats.php
@@ -0,0 +1,37 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+class Suggestedchats {
+
+ function widget($arr) {
+
+ if(! feature_enabled(\App::$profile['profile_uid'],'ajaxchat'))
+ return '';
+
+ // There are reports that this tool does not ever remove chatrooms on dead sites,
+ // and also will happily link to private chats which you cannot enter.
+ // For those reasons, it will be disabled until somebody decides it's worth
+ // fixing and comes up with a plan for doing so.
+
+ return '';
+
+ // probably should restrict this to your friends, but then the widget will only work
+ // if you are logged in locally.
+
+ $h = get_observer_hash();
+ if(! $h)
+ return;
+ $r = q("select xchat_url, xchat_desc, count(xchat_xchan) as total from xchat group by xchat_url, xchat_desc order by total desc, xchat_desc limit 24");
+ if($r) {
+ for($x = 0; $x < count($r); $x ++) {
+ $r[$x]['xchat_url'] = zid($r[$x]['xchat_url']);
+ }
+ }
+ return replace_macros(get_markup_template('bookmarkedchats.tpl'),array(
+ '$header' => t('Suggested Chatrooms'),
+ '$rooms' => $r
+ ));
+ }
+}
+
diff --git a/Zotlabs/Widget/Suggestions.php b/Zotlabs/Widget/Suggestions.php
new file mode 100644
index 000000000..5fb3d3e8b
--- /dev/null
+++ b/Zotlabs/Widget/Suggestions.php
@@ -0,0 +1,58 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+require_once('include/socgraph.php');
+
+
+class Suggestions {
+
+ function widget($arr) {
+
+ if((! local_channel()) || (! feature_enabled(local_channel(),'suggest')))
+ return '';
+
+
+ $r = suggestion_query(local_channel(),get_observer_hash(),0,20);
+
+ if(! $r) {
+ return;
+ }
+
+ $arr = array();
+
+ // Get two random entries from the top 20 returned.
+ // We'll grab the first one and the one immediately following.
+ // This will throw some entropy intot he situation so you won't
+ // be looking at the same two mug shots every time the widget runs
+
+ $index = ((count($r) > 2) ? mt_rand(0,count($r) - 2) : 0);
+
+ for($x = $index; $x <= ($index+1); $x ++) {
+ $rr = $r[$x];
+ if(! $rr['xchan_url'])
+ break;
+
+ $connlnk = z_root() . '/follow/?url=' . $rr['xchan_addr'];
+
+ $arr[] = array(
+ 'url' => chanlink_url($rr['xchan_url']),
+ 'profile' => $rr['xchan_url'],
+ 'name' => $rr['xchan_name'],
+ 'photo' => $rr['xchan_photo_m'],
+ 'ignlnk' => z_root() . '/directory?ignore=' . $rr['xchan_hash'],
+ 'conntxt' => t('Connect'),
+ 'connlnk' => $connlnk,
+ 'ignore' => t('Ignore/Hide')
+ );
+ }
+
+ $o = replace_macros(get_markup_template('suggest_widget.tpl'),array(
+ '$title' => t('Suggestions'),
+ '$more' => t('See more...'),
+ '$entries' => $arr
+ ));
+
+ return $o;
+ }
+}
diff --git a/Zotlabs/Widget/Tagcloud.php b/Zotlabs/Widget/Tagcloud.php
new file mode 100644
index 000000000..cf7a4932e
--- /dev/null
+++ b/Zotlabs/Widget/Tagcloud.php
@@ -0,0 +1,33 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+// @FIXME The problem with this widget is that we don't have a search function for webpages
+// that we can send the links to. Then we should also provide an option to search webpages
+// and conversations.
+
+class Tagcloud {
+
+ function widget($args) {
+
+ $o = '';
+ $uid = \App::$profile_uid;
+ $count = ((x($args,'count')) ? intval($args['count']) : 24);
+ $flags = 0;
+ $type = TERM_CATEGORY;
+
+ // @FIXME there exists no $authors variable
+ $r = tagadelic($uid, $count, $authors, $owner, $flags, ITEM_TYPE_WEBPAGE, $type);
+
+ // @FIXME this should use a template
+
+ if($r) {
+ $o = '<div class="tagblock widget"><h3>' . t('Categories') . '</h3><div class="tags" align="center">';
+ foreach($r as $rv) {
+ $o .= '<span class="tag' . $rv[2] . '">' . $rv[0] .' </span> ' . "\r\n";
+ }
+ $o .= '</div></div>';
+ }
+ return $o;
+ }
+}
diff --git a/Zotlabs/Widget/Tagcloud_wall.php b/Zotlabs/Widget/Tagcloud_wall.php
new file mode 100644
index 000000000..7cff6ce09
--- /dev/null
+++ b/Zotlabs/Widget/Tagcloud_wall.php
@@ -0,0 +1,20 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+class Tagcloud_wall {
+
+ function widget($arr) {
+
+ if((! \App::$profile['profile_uid']) || (! \App::$profile['channel_hash']))
+ return '';
+ if(! perm_is_allowed(\App::$profile['profile_uid'], get_observer_hash(), 'view_stream'))
+ return '';
+
+ $limit = ((array_key_exists('limit', $arr)) ? intval($arr['limit']) : 50);
+ if(feature_enabled(\App::$profile['profile_uid'], 'tagadelic'))
+ return wtagblock(\App::$profile['profile_uid'], $limit, '', \App::$profile['channel_hash'], 'wall');
+
+ return '';
+ }
+}
diff --git a/Zotlabs/Widget/Tasklist.php b/Zotlabs/Widget/Tasklist.php
new file mode 100644
index 000000000..6f7a8aaed
--- /dev/null
+++ b/Zotlabs/Widget/Tasklist.php
@@ -0,0 +1,30 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+require_once('include/event.php');
+
+class Tasklist {
+
+ function widget($arr) {
+
+ if (! local_channel())
+ return;
+
+ $o .= '<script>var tasksShowAll = 0; $(document).ready(function() { tasksFetch(); $("#tasklist-new-form").submit(function(event) { event.preventDefault(); $.post( "tasks/new", $("#tasklist-new-form").serialize(), function(data) { tasksFetch(); $("#tasklist-new-summary").val(""); } ); return false; } )});</script>';
+ $o .= '<script>function taskComplete(id) { $.post("tasks/complete/"+id, function(data) { tasksFetch();}); }
+ function tasksFetch() {
+ $.get("tasks/fetch" + ((tasksShowAll) ? "/all" : ""), function(data) {
+ $(".tasklist-tasks").html(data.html);
+ });
+ }
+ </script>';
+
+ $o .= '<div class="widget">' . '<h3>' . t('Tasks') . '</h3><div class="tasklist-tasks">';
+ $o .= '</div><form id="tasklist-new-form" action="" ><input id="tasklist-new-summary" type="text" name="summary" value="" /></form>';
+ $o .= '</div>';
+ return $o;
+
+ }
+}
+
diff --git a/Zotlabs/Widget/Vcard.php b/Zotlabs/Widget/Vcard.php
new file mode 100644
index 000000000..cab05dfdd
--- /dev/null
+++ b/Zotlabs/Widget/Vcard.php
@@ -0,0 +1,12 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+class Vcard {
+
+ function widget($arr) {
+ return vcard_from_xchan('', \App::get_observer());
+ }
+
+}
+
diff --git a/Zotlabs/Widget/Website_portation_tools.php b/Zotlabs/Widget/Website_portation_tools.php
new file mode 100644
index 000000000..1cf3bb78a
--- /dev/null
+++ b/Zotlabs/Widget/Website_portation_tools.php
@@ -0,0 +1,22 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+
+class Website_portation_tools {
+
+ function widget($arr) {
+
+ // mod menu doesn't load a profile. For any modules which load a profile, check it.
+ // otherwise local_channel() is sufficient for permissions.
+
+ if(\App::$profile['profile_uid'])
+ if((\App::$profile['profile_uid'] != local_channel()) && (! \App::$is_sys))
+ return '';
+
+ if(! local_channel())
+ return '';
+
+ return website_portation_tools();
+ }
+}
diff --git a/Zotlabs/Widget/Wiki_list.php b/Zotlabs/Widget/Wiki_list.php
new file mode 100644
index 000000000..62f32dbf0
--- /dev/null
+++ b/Zotlabs/Widget/Wiki_list.php
@@ -0,0 +1,23 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+class Wiki_list {
+
+ function widget($arr) {
+
+ $channel = channelx_by_n(\App::$profile_uid);
+
+ $wikis = \Zotlabs\Lib\NativeWiki::listwikis($channel,get_observer_hash());
+
+ if($wikis) {
+ return replace_macros(get_markup_template('wikilist_widget.tpl'), array(
+ '$header' => t('Wiki List'),
+ '$channel' => $channel['channel_address'],
+ '$wikis' => $wikis['wikis']
+ ));
+ }
+ return '';
+ }
+
+}
diff --git a/Zotlabs/Widget/Wiki_page_history.php b/Zotlabs/Widget/Wiki_page_history.php
new file mode 100644
index 000000000..dcec9a037
--- /dev/null
+++ b/Zotlabs/Widget/Wiki_page_history.php
@@ -0,0 +1,27 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+class Wiki_page_history {
+
+ function widget($arr) {
+
+ $pageUrlName = ((array_key_exists('pageUrlName', $arr)) ? $arr['pageUrlName'] : '');
+ $resource_id = ((array_key_exists('resource_id', $arr)) ? $arr['resource_id'] : '');
+
+ $pageHistory = \Zotlabs\Lib\NativeWikiPage::page_history([
+ 'channel_id' => \App::$profile_uid,
+ 'observer_hash' => get_observer_hash(),
+ 'resource_id' => $resource_id,
+ 'pageUrlName' => $pageUrlName
+ ]);
+
+ return replace_macros(get_markup_template('nwiki_page_history.tpl'), array(
+ '$pageHistory' => $pageHistory['history'],
+ '$permsWrite' => $arr['permsWrite'],
+ '$name_lbl' => t('Name'),
+ '$msg_label' => t('Message','wiki_history')
+ ));
+
+ }
+}
diff --git a/Zotlabs/Widget/Wiki_pages.php b/Zotlabs/Widget/Wiki_pages.php
new file mode 100644
index 000000000..f992b3f93
--- /dev/null
+++ b/Zotlabs/Widget/Wiki_pages.php
@@ -0,0 +1,66 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+
+class Wiki_pages {
+
+ function widget($arr) {
+
+ $channelname = ((array_key_exists('channel',$arr)) ? $arr['channel'] : '');
+ $c = channelx_by_nick($channelname);
+
+ if(! $c)
+ $c = \App::get_channel();
+
+ if(! $c)
+ return '';
+
+ $wikiname = '';
+ if(array_key_exists('refresh', $arr)) {
+ $not_refresh = (($arr['refresh']=== true) ? false : true);
+ }
+ else {
+ $not_refresh = true;
+ }
+
+ $pages = array();
+ if(! array_key_exists('resource_id', $arr)) {
+ $hide = true;
+ }
+ else {
+ $p = \Zotlabs\Lib\NativeWikiPage::page_list($c['channel_id'],get_observer_hash(),$arr['resource_id']);
+
+ if($p['pages']) {
+ $pages = $p['pages'];
+ $w = $p['wiki'];
+ // Wiki item record is $w['wiki']
+ $wikiname = $w['urlName'];
+ if (!$wikiname) {
+ $wikiname = '';
+ }
+ }
+ }
+
+
+ $can_create = perm_is_allowed(\App::$profile['uid'],get_observer_hash(),'write_wiki');
+
+ $can_delete = ((local_channel() && (local_channel() == \App::$profile['uid'])) ? true : false);
+
+ return replace_macros(get_markup_template('wiki_page_list.tpl'), array(
+ '$hide' => $hide,
+ '$resource_id' => $arr['resource_id'],
+ '$not_refresh' => $not_refresh,
+ '$header' => t('Wiki Pages'),
+ '$channel' => $channelname,
+ '$wikiname' => $wikiname,
+ '$pages' => $pages,
+ '$canadd' => $can_create,
+ '$candel' => $can_delete,
+ '$addnew' => t('Add new page'),
+ '$pageName' => array('pageName', t('Page name')),
+ ));
+ }
+}
+
+
diff --git a/Zotlabs/Widget/Zcard.php b/Zotlabs/Widget/Zcard.php
new file mode 100644
index 000000000..12e53eaab
--- /dev/null
+++ b/Zotlabs/Widget/Zcard.php
@@ -0,0 +1,11 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+class Zcard {
+
+ function widget($args) {
+ $channel = channelx_by_n(\App::$profile_uid);
+ return get_zcard($channel,get_observer_hash(),array('width' => 875));
+ }
+}
diff --git a/Zotlabs/Zot/Finger.php b/Zotlabs/Zot/Finger.php
index 7e0f5fb7c..9871b5bbd 100644
--- a/Zotlabs/Zot/Finger.php
+++ b/Zotlabs/Zot/Finger.php
@@ -123,9 +123,7 @@ class Finger {
}
else {
logger('No signed token from ' . $url . $rhs, LOGGER_NORMAL, LOG_WARNING);
- // after 2017-01-01 this will be a hard error unless you over-ride it.
- if((time() > 1483228800) && (! get_config('system', 'allow_unsigned_zotfinger')))
- return $ret;
+ return $ret;
}
}
diff --git a/Zotlabs/Zot/Receiver.php b/Zotlabs/Zot/Receiver.php
index 71d57eb35..0050a2559 100644
--- a/Zotlabs/Zot/Receiver.php
+++ b/Zotlabs/Zot/Receiver.php
@@ -138,7 +138,6 @@ class Receiver {
* This packet is optionally encrypted, which we will discover if the json has an 'iv' element.
* $contents => array( 'alg' => 'aes256cbc', 'iv' => initialisation vector, 'key' => decryption key, 'data' => encrypted data);
* $contents->iv and $contents->key are random strings encrypted with this site's RSA public key and then base64url encoded.
- * Currently only 'aes256cbc' is used, but this is extensible should that algorithm prove inadequate.
*
* Once decrypted, one will find the normal json_encoded zot message packet.
*
@@ -156,7 +155,8 @@ class Receiver {
* },
* "recipients": { optional recipient array },
* "callback":"\/post",
- * "version":1,
+ * "version":"1.2",
+ * "encryption":["aes256cbc"],
* "secret":"1eaa...",
* "secret_sig": "df89025470fac8..."
* }
diff --git a/app/admin.png b/app/admin.png
deleted file mode 100644
index cde922e8e..000000000
--- a/app/admin.png
+++ /dev/null
Binary files differ
diff --git a/app/features.apd b/app/features.apd
deleted file mode 100644
index bffbdffec..000000000
--- a/app/features.apd
+++ /dev/null
@@ -1,6 +0,0 @@
-version: 1
-url: $baseurl/settings/features
-requires: local_channel
-name: Features
-photo: icon:cogs
-categories: System
diff --git a/app/features.png b/app/features.png
deleted file mode 100644
index 5faf14bc3..000000000
--- a/app/features.png
+++ /dev/null
Binary files differ
diff --git a/app/login.apd b/app/login.apd
deleted file mode 100644
index 1cbb44f1b..000000000
--- a/app/login.apd
+++ /dev/null
@@ -1,5 +0,0 @@
-version: 1
-url: $baseurl/login
-requires: nologin
-name: Login
-photo: icon:sign-in
diff --git a/app/manage.apd b/app/manage.apd
deleted file mode 100644
index b525efa6c..000000000
--- a/app/manage.apd
+++ /dev/null
@@ -1,6 +0,0 @@
-version: 1
-url: $baseurl/manage
-requires: local_channel
-name: Channel Manager
-photo: icon:id-card-o
-categories: Personal
diff --git a/app/manage.png b/app/manage.png
deleted file mode 100644
index 38a4dcbae..000000000
--- a/app/manage.png
+++ /dev/null
Binary files differ
diff --git a/app/profile.apd b/app/profile.apd
deleted file mode 100644
index c8205df63..000000000
--- a/app/profile.apd
+++ /dev/null
@@ -1,6 +0,0 @@
-version: 1
-url: $baseurl/profile/$nick
-requires: local_channel
-name: View Profile
-photo: icon:user
-categories: Personal
diff --git a/app/profile.png b/app/profile.png
deleted file mode 100644
index e6e137c82..000000000
--- a/app/profile.png
+++ /dev/null
Binary files differ
diff --git a/app/settings.apd b/app/settings.apd
deleted file mode 100644
index b244f6774..000000000
--- a/app/settings.apd
+++ /dev/null
@@ -1,6 +0,0 @@
-version: 1
-url: $baseurl/settings
-requires: local_channel
-name: Settings
-photo: icon:cog
-categories: System
diff --git a/app/settings.png b/app/settings.png
deleted file mode 100644
index 2ba11a79a..000000000
--- a/app/settings.png
+++ /dev/null
Binary files differ
diff --git a/boot.php b/boot.php
index 585ba61df..63e9f9d1a 100755
--- a/boot.php
+++ b/boot.php
@@ -5,14 +5,13 @@
*/
/**
- * Hubzilla.
*
- * Hubzilla is an open source decentralised communications
+ * This is an open source decentralised communications
* platform combined with a decentralised identity/authentication framework
* wrapped in an extensible content management system, providing website designers
* the ability to embed fully decentralised communications and social tools
* into many traditional website designs (blogs, forums, small business
- * websites, charitable organisations, etc.). Hubzilla also provides DNS mobility
+ * websites, charitable organisations, etc.). Also provided is DNS mobility
* and internet scale privacy/access control.
*
* This allows any individual website to participate in a matrix of linked
@@ -47,13 +46,14 @@ require_once('include/account.php');
require_once('include/zid.php');
require_once('include/xchan.php');
require_once('include/hubloc.php');
+require_once('include/attach.php');
define ( 'PLATFORM_NAME', 'hubzilla' );
-define ( 'STD_VERSION', '2.2' );
+define ( 'STD_VERSION', '2.4' );
define ( 'ZOT_REVISION', '1.2' );
-define ( 'DB_UPDATE_VERSION', 1188 );
+define ( 'DB_UPDATE_VERSION', 1191 );
define ( 'PROJECT_BASE', __DIR__ );
@@ -126,7 +126,9 @@ define ( 'LANGUAGE_DETECT_MIN_CONFIDENCE', 0.01 );
* either more or less restrictive.
*/
-define ( 'STORAGE_DEFAULT_PERMISSIONS', 0770 );
+if(! defined('STORAGE_DEFAULT_PERMISSIONS')) {
+ define ( 'STORAGE_DEFAULT_PERMISSIONS', 0770 );
+}
/**
@@ -149,12 +151,6 @@ define ( 'MAX_IMAGE_LENGTH', -1 );
/**
- * Not yet used
- */
-
-define ( 'DEFAULT_DB_ENGINE', 'MyISAM' );
-
-/**
* log levels
*/
@@ -192,15 +188,6 @@ define ( 'ACCESS_FREE', 2 );
define ( 'ACCESS_TIERED', 3 );
/**
- * relationship types
- */
-
-define ( 'CONTACT_IS_FOLLOWER', 1);
-define ( 'CONTACT_IS_SHARING', 2);
-define ( 'CONTACT_IS_FRIEND', 3);
-
-
-/**
* DB update return values
*/
@@ -500,6 +487,7 @@ define ( 'ACTIVITY_JOIN', NAMESPACE_ACTIVITY_SCHEMA . 'join' );
define ( 'ACTIVITY_POST', NAMESPACE_ACTIVITY_SCHEMA . 'post' );
define ( 'ACTIVITY_UPDATE', NAMESPACE_ACTIVITY_SCHEMA . 'update' );
define ( 'ACTIVITY_TAG', NAMESPACE_ACTIVITY_SCHEMA . 'tag' );
+define ( 'ACTIVITY_SHARE', NAMESPACE_ACTIVITY_SCHEMA . 'share' );
define ( 'ACTIVITY_FAVORITE', NAMESPACE_ACTIVITY_SCHEMA . 'favorite' );
define ( 'ACTIVITY_CREATE', NAMESPACE_ACTIVITY_SCHEMA . 'create' );
define ( 'ACTIVITY_WIN', NAMESPACE_ACTIVITY_SCHEMA . 'win' );
@@ -527,14 +515,6 @@ define ( 'ACTIVITY_OBJ_LOCATION',NAMESPACE_ZOT . '/activity/location' );
define ( 'ACTIVITY_OBJ_FILE', NAMESPACE_ZOT . '/activity/file' );
/**
- * item weight for query ordering
- */
-
-define ( 'GRAVITY_PARENT', 0);
-define ( 'GRAVITY_LIKE', 3);
-define ( 'GRAVITY_COMMENT', 6);
-
-/**
* Account Flags
*/
@@ -549,7 +529,6 @@ define ( 'ACCOUNT_PENDING', 0x0010 );
* Account roles
*/
-define ( 'ACCOUNT_ROLE_ALLOWCODE', 0x0001 );
define ( 'ACCOUNT_ROLE_SYSTEM', 0x0002 );
define ( 'ACCOUNT_ROLE_DEVELOPER', 0x0004 );
define ( 'ACCOUNT_ROLE_ADMIN', 0x1000 );
@@ -559,16 +538,16 @@ define ( 'ACCOUNT_ROLE_ADMIN', 0x1000 );
*/
define ( 'ITEM_VISIBLE', 0x0000);
-//define ( 'ITEM_HIDDEN', 0x0001);
+define ( 'ITEM_HIDDEN', 0x0001);
define ( 'ITEM_BLOCKED', 0x0002);
define ( 'ITEM_MODERATED', 0x0004);
define ( 'ITEM_SPAM', 0x0008);
-//define ( 'ITEM_DELETED', 0x0010);
+define ( 'ITEM_DELETED', 0x0010);
define ( 'ITEM_UNPUBLISHED', 0x0020);
-//define ( 'ITEM_WEBPAGE', 0x0040); // is a static web page, not a conversational item
+define ( 'ITEM_WEBPAGE', 0x0040); // is a static web page, not a conversational item
define ( 'ITEM_DELAYED_PUBLISH', 0x0080);
define ( 'ITEM_BUILDBLOCK', 0x0100); // Named thusly to make sure nobody confuses this with ITEM_BLOCKED
-//define ( 'ITEM_PDL', 0x0200); // Page Description Language - e.g. Comanche
+define ( 'ITEM_PDL', 0x0200); // Page Description Language - e.g. Comanche
define ( 'ITEM_BUG', 0x0400); // Is a bug, can be used by the internal bug tracker
define ( 'ITEM_PENDING_REMOVE', 0x0800); // deleted, notification period has lapsed
define ( 'ITEM_DOC', 0x1000); // hubzilla only, define here so that item import does the right thing
@@ -642,9 +621,6 @@ function sys_boot() {
define( 'DEFAULT_NOTIFY_ICON', '/images/hz-white-32.png' );
}
- if(! defined('CRYPTO_ALGORITHM')) {
- define( 'CRYPTO_ALGORITHM', 'aes256cbc' );
- }
/*
* Try to open the database;
@@ -727,6 +703,7 @@ function startup() {
* which is now static (although currently constructed at startup). We are only converting
* 'system' config settings.
*/
+
class miniApp {
public $config = array('system' => array());
@@ -1282,18 +1259,6 @@ class App {
/**
- * @brief Retrieve the App structure.
- *
- * Useful in functions which require it but don't get it passed to them
- *
- * @return App
- */
-function get_app() {
- return $a;
-}
-
-
-/**
* @brief Multi-purpose function to check variable state.
*
* Usage: x($var) or $x($array, 'key')
@@ -1384,6 +1349,24 @@ function os_mkdir($path, $mode = 0777, $recursive = false) {
return $result;
}
+
+// recursively delete a directory
+function rrmdir($path) {
+ if(is_dir($path) === true) {
+ $files = array_diff(scandir($path), array('.', '..'));
+ foreach($files as $file) {
+ rrmdir(realpath($path) . '/' . $file);
+ }
+ return rmdir($path);
+ }
+ elseif(is_file($path) === true) {
+ return unlink($path);
+ }
+
+ return false;
+}
+
+
/**
* @brief Function to check if request was an AJAX (xmlhttprequest) request.
*
@@ -1398,11 +1381,7 @@ function is_ajax() {
// base url for use in cmdline programs which don't have
// $_SERVER variables, and synchronising the state of installed plugins.
-function check_config(&$a) {
-
- $build = get_config('system','db_version');
- if(! intval($build))
- $build = set_config('system','db_version',DB_UPDATE_VERSION);
+function check_config() {
$saved = get_config('system','urlverify');
if(! $saved)
@@ -1440,88 +1419,8 @@ function check_config(&$a) {
if (! $syschan_exists)
create_sys_channel();
- if($build != DB_UPDATE_VERSION) {
- $stored = intval($build);
- if(! $stored) {
- logger('Critical: check_config unable to determine database schema version');
- return;
- }
- $current = intval(DB_UPDATE_VERSION);
- if(($stored < $current) && file_exists('install/update.php')) {
-
- load_config('database');
-
- // We're reporting a different version than what is currently installed.
- // Run any existing update scripts to bring the database up to current.
- require_once('install/update.php');
-
- // make sure that boot.php and update.php are the same release, we might be
- // updating right this very second and the correct version of the update.php
- // file may not be here yet. This can happen on a very busy site.
-
- if(DB_UPDATE_VERSION == UPDATE_VERSION) {
- for($x = $stored; $x < $current; $x ++) {
- if(function_exists('update_r' . $x)) {
- // There could be a lot of processes running or about to run.
- // We want exactly one process to run the update command.
- // So store the fact that we're taking responsibility
- // after first checking to see if somebody else already has.
-
- // If the update fails or times-out completely you may need to
- // delete the config entry to try again.
-
- if(get_config('database','update_r' . $x))
- break;
- set_config('database','update_r' . $x, '1');
- // call the specific update
-
- $func = 'update_r' . $x;
- $retval = $func();
- if($retval) {
-
- // Prevent sending hundreds of thousands of emails by creating
- // a lockfile.
-
- $lockfile = 'store/[data]/mailsent';
-
- if ((file_exists($lockfile)) && (filemtime($lockfile) > (time() - 86400)))
- return;
- @unlink($lockfile);
- //send the administrator an e-mail
- file_put_contents($lockfile, $x);
-
- $r = q("select account_language from account where account_email = '%s' limit 1",
- dbesc(App::$config['system']['admin_email'])
- );
- push_lang(($r) ? $r[0]['account_language'] : 'en');
-
-
- $email_tpl = get_intltext_template("update_fail_eml.tpl");
- $email_msg = replace_macros($email_tpl, array(
- '$sitename' => App::$config['system']['sitename'],
- '$siteurl' => z_root(),
- '$update' => $x,
- '$error' => sprintf( t('Update %s failed. See error logs.'), $x)
- ));
-
- $subject = email_header_encode(sprintf(t('Update Error at %s'), z_root()));
-
- mail(App::$config['system']['admin_email'], $subject, $email_msg,
- 'From: Administrator' . '@' . $_SERVER['SERVER_NAME'] . "\n"
- . 'Content-type: text/plain; charset=UTF-8' . "\n"
- . 'Content-transfer-encoding: 8bit' );
- //try the logger
- logger('CRITICAL: Update Failed: ' . $x);
- pop_lang();
- }
- else
- set_config('database','update_r' . $x, 'success');
- }
- }
- set_config('system','db_version', DB_UPDATE_VERSION);
- }
- }
- }
+ $x = new \Zotlabs\Lib\DB_Upgrade(DB_UPDATE_VERSION);
+
/**
*
@@ -1806,18 +1705,6 @@ function local_channel() {
}
/**
- * local_user() got deprecated and replaced by local_channel().
- *
- * @deprecated since v2.1, use local_channel()
- * @see local_channel()
- */
-function local_user() {
- logger('local_user() is DEPRECATED, use local_channel()');
- return local_channel();
-}
-
-
-/**
* @brief Returns a xchan_hash (visitor_id) of remote authenticated visitor
* or false.
*
@@ -1839,18 +1726,6 @@ function remote_channel() {
}
/**
- * remote_user() got deprecated and replaced by remote_channel().
- *
- * @deprecated since v2.1, use remote_channel()
- * @see remote_channel()
- */
-function remote_user() {
- logger('remote_user() is DEPRECATED, use remote_channel()');
- return remote_channel();
-}
-
-
-/**
* Contents of $s are displayed prominently on the page the next time
* a page is loaded. Usually used for errors or alerts.
*
@@ -2142,7 +2017,7 @@ function curPageURL() {
*
* @return mixed
*/
-function get_custom_nav(&$a, $navname) {
+function get_custom_nav($navname) {
if (! $navname)
return App::$page['nav'];
// load custom nav menu by name here
@@ -2154,9 +2029,8 @@ function get_custom_nav(&$a, $navname) {
* If there is no parsed Comanche template already load a module's pdl file
* and parse it with Comanche.
*
- * @param App &$a global application object
*/
-function load_pdl(&$a) {
+function load_pdl() {
App::$comanche = new Zotlabs\Render\Comanche();
@@ -2183,7 +2057,7 @@ function load_pdl(&$a) {
}
-function exec_pdl(&$a) {
+function exec_pdl() {
if(App::$pdl) {
App::$comanche->parse(App::$pdl,1);
}
@@ -2195,11 +2069,10 @@ function exec_pdl(&$a) {
*
* Build the page - now that we have all the components
*
- * @param App &$a global application object
*/
-function construct_page(&$a) {
+function construct_page() {
- exec_pdl($a);
+ exec_pdl();
$comanche = ((count(App::$layout)) ? true : false);
@@ -2215,7 +2088,7 @@ function construct_page(&$a) {
if ($comanche) {
if (App::$layout['nav']) {
- App::$page['nav'] = get_custom_nav($a, App::$layout['nav']);
+ App::$page['nav'] = get_custom_nav(App::$layout['nav']);
}
}
@@ -2339,7 +2212,7 @@ function construct_page(&$a) {
}
/**
- * @brief Returns Hubzilla's root directory.
+ * @brief Returns appplication root directory.
*
* @return string
*/
@@ -2355,7 +2228,7 @@ function appdirpath() {
function head_set_icon($icon) {
App::$data['pageicon'] = $icon;
-// logger('head_set_icon: ' . $icon);
+
}
/**
@@ -2431,10 +2304,10 @@ function z_get_temp_dir() {
function z_check_cert() {
if(strpos(z_root(),'https://') !== false) {
- $x = z_fetch_url(z_root() . '/siteinfo/json');
+ $x = z_fetch_url(z_root() . '/siteinfo.json');
if(! $x['success']) {
$recurse = 0;
- $y = z_fetch_url(z_root() . '/siteinfo/json',false,$recurse,array('novalidate' => true));
+ $y = z_fetch_url(z_root() . '/siteinfo.json',false,$recurse,array('novalidate' => true));
if($y['success'])
cert_bad_email();
}
@@ -2445,23 +2318,23 @@ function z_check_cert() {
/**
* @brief Send email to admin if server has an invalid certificate.
*
- * If a Hubzilla hub is available over https it must have a publicly valid
- * certificate.
+ * If a hub is available over https it must have a publicly valid certificate.
*/
-function cert_bad_email() {
- $email_tpl = get_intltext_template("cert_bad_eml.tpl");
- $email_msg = replace_macros($email_tpl, array(
- '$sitename' => App::$config['system']['sitename'],
- '$siteurl' => z_root(),
- '$error' => t('Website SSL certificate is not valid. Please correct.')
- ));
-
- $subject = email_header_encode(sprintf(t('[hubzilla] Website SSL error for %s'), App::get_hostname()));
- mail(App::$config['system']['admin_email'], $subject, $email_msg,
- 'From: Administrator' . '@' . App::get_hostname() . "\n"
- . 'Content-type: text/plain; charset=UTF-8' . "\n"
- . 'Content-transfer-encoding: 8bit' );
+function cert_bad_email() {
+ return z_mail(
+ [
+ 'toEmail' => \App::$config['system']['admin_email'],
+ 'messageSubject' => sprintf(t('[$Projectname] Website SSL error for %s'), App::get_hostname()),
+ 'textVersion' => replace_macros(get_intltext_template('cert_bad_eml.tpl'),
+ [
+ '$sitename' => App::$config['system']['sitename'],
+ '$siteurl' => z_root(),
+ '$error' => t('Website SSL certificate is not valid. Please correct.')
+ ]
+ )
+ ]
+ );
}
@@ -2572,20 +2445,20 @@ function check_cron_broken() {
return;
}
- $email_tpl = get_intltext_template("cron_bad_eml.tpl");
- $email_msg = replace_macros($email_tpl, array(
- '$sitename' => App::$config['system']['sitename'],
- '$siteurl' => z_root(),
- '$error' => t('Cron/Scheduled tasks not running.'),
- '$lastdate' => (($d)? $d : t('never'))
- ));
-
- $subject = email_header_encode(sprintf(t('[hubzilla] Cron tasks not running on %s'), App::get_hostname()));
- mail(App::$config['system']['admin_email'], $subject, $email_msg,
- 'From: Administrator' . '@' . App::get_hostname() . "\n"
- . 'Content-type: text/plain; charset=UTF-8' . "\n"
- . 'Content-transfer-encoding: 8bit' );
- return;
+ return z_mail(
+ [
+ 'toEmail' => \App::$config['system']['admin_email'],
+ 'messageSubject' => sprintf(t('[$Projectname] Cron tasks not running on %s'), App::get_hostname()),
+ 'textVersion' => replace_macros(get_intltext_template('cron_bad_eml.tpl'),
+ [
+ '$sitename' => App::$config['system']['sitename'],
+ '$siteurl' => z_root(),
+ '$error' => t('Cron/Scheduled tasks not running.'),
+ '$lastdate' => (($d)? $d : t('never'))
+ ]
+ )
+ ]
+ );
}
diff --git a/composer.json b/composer.json
index abf583875..44606ff2b 100644
--- a/composer.json
+++ b/composer.json
@@ -28,14 +28,20 @@
"ext-mbstring" : "*",
"ext-xml" : "*",
"ext-openssl" : "*",
- "sabre/dav" : "~3.2"
+ "sabre/dav" : "~3.2",
+ "michelf/php-markdown" : "^1.7",
+ "pixel418/markdownify": "^2.2",
+ "bshaffer/oauth2-server-php": "^1.9",
+ "ezyang/htmlpurifier": "^4.9",
+ "simplepie/simplepie": "~1.5"
},
"require-dev" : {
- "php" : ">=5.6",
- "phpunit/phpunit" : "^5.6",
+ "php" : ">=7.0",
+ "phpunit/phpunit" : "^6.0",
"behat/behat" : "@stable",
"behat/mink-extension": "@stable",
- "behat/mink-goutte-driver": "@stable"
+ "behat/mink-goutte-driver": "@stable",
+ "php-mock/php-mock-phpunit": "^2.0"
},
"autoload" : {
"psr-4" : {
@@ -51,5 +57,9 @@
"minimum-stability" : "stable",
"config" : {
"notify-on-install" : false
- }
-} \ No newline at end of file
+ },
+ "repositories": [{
+ "type": "vcs",
+ "url": "https://github.com/simplepie/simplepie"
+ }]
+}
diff --git a/composer.lock b/composer.lock
new file mode 100644
index 000000000..bd902f197
--- /dev/null
+++ b/composer.lock
@@ -0,0 +1,3695 @@
+{
+ "_readme": [
+ "This file locks the dependencies of your project to a known state",
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
+ "This file is @generated automatically"
+ ],
+ "content-hash": "21511c39f481ecdc20210f885d840787",
+ "packages": [
+ {
+ "name": "bshaffer/oauth2-server-php",
+ "version": "v1.9.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/bshaffer/oauth2-server-php.git",
+ "reference": "8856aed1a98d6da596ae3f9b8095b5c7a1581697"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/bshaffer/oauth2-server-php/zipball/8856aed1a98d6da596ae3f9b8095b5c7a1581697",
+ "reference": "8856aed1a98d6da596ae3f9b8095b5c7a1581697",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.9"
+ },
+ "require-dev": {
+ "aws/aws-sdk-php": "~2.8",
+ "firebase/php-jwt": "~2.2",
+ "mongodb/mongodb": "^1.1",
+ "predis/predis": "dev-master",
+ "thobbs/phpcassa": "dev-master"
+ },
+ "suggest": {
+ "aws/aws-sdk-php": "~2.8 is required to use DynamoDB storage",
+ "firebase/php-jwt": "~1.1 is required to use MondoDB storage",
+ "predis/predis": "Required to use Redis storage",
+ "thobbs/phpcassa": "Required to use Cassandra storage"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-0": {
+ "OAuth2": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Brent Shaffer",
+ "email": "bshafs@gmail.com",
+ "homepage": "http://brentertainment.com"
+ }
+ ],
+ "description": "OAuth2 Server for PHP",
+ "homepage": "http://github.com/bshaffer/oauth2-server-php",
+ "keywords": [
+ "auth",
+ "oauth",
+ "oauth2"
+ ],
+ "time": "2017-01-06T23:20:00+00:00"
+ },
+ {
+ "name": "ezyang/htmlpurifier",
+ "version": "v4.9.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ezyang/htmlpurifier.git",
+ "reference": "6d50e5282afdfdfc3e0ff6d192aff56c5629b3d4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/6d50e5282afdfdfc3e0ff6d192aff56c5629b3d4",
+ "reference": "6d50e5282afdfdfc3e0ff6d192aff56c5629b3d4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.2"
+ },
+ "require-dev": {
+ "simpletest/simpletest": "^1.1"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-0": {
+ "HTMLPurifier": "library/"
+ },
+ "files": [
+ "library/HTMLPurifier.composer.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "LGPL"
+ ],
+ "authors": [
+ {
+ "name": "Edward Z. Yang",
+ "email": "admin@htmlpurifier.org",
+ "homepage": "http://ezyang.com"
+ }
+ ],
+ "description": "Standards compliant HTML filter written in PHP",
+ "homepage": "http://htmlpurifier.org/",
+ "keywords": [
+ "html"
+ ],
+ "time": "2017-03-13T06:30:53+00:00"
+ },
+ {
+ "name": "michelf/php-markdown",
+ "version": "1.7.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/michelf/php-markdown.git",
+ "reference": "1f51cc520948f66cd2af8cbc45a5ee175e774220"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/michelf/php-markdown/zipball/1f51cc520948f66cd2af8cbc45a5ee175e774220",
+ "reference": "1f51cc520948f66cd2af8cbc45a5ee175e774220",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-lib": "1.4.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Michelf": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Michel Fortin",
+ "email": "michel.fortin@michelf.ca",
+ "homepage": "https://michelf.ca/",
+ "role": "Developer"
+ },
+ {
+ "name": "John Gruber",
+ "homepage": "https://daringfireball.net/"
+ }
+ ],
+ "description": "PHP Markdown",
+ "homepage": "https://michelf.ca/projects/php-markdown/",
+ "keywords": [
+ "markdown"
+ ],
+ "time": "2016-10-29T18:58:20+00:00"
+ },
+ {
+ "name": "pixel418/markdownify",
+ "version": "v2.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Elephant418/Markdownify.git",
+ "reference": "0160677f04c784550dd10fd72fdf3994967db848"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Elephant418/Markdownify/zipball/0160677f04c784550dd10fd72fdf3994967db848",
+ "reference": "0160677f04c784550dd10fd72fdf3994967db848",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.8"
+ },
+ "type": "lib",
+ "autoload": {
+ "psr-4": {
+ "Markdownify\\": "src",
+ "Test\\Markdownify\\": "test"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "LGPL"
+ ],
+ "authors": [
+ {
+ "name": "Peter Kruithof",
+ "email": "pkruithof@gmail.com",
+ "homepage": "http://pkruithof.tumblr.com/"
+ },
+ {
+ "name": "Milian Wolff",
+ "email": "mail@milianw.de",
+ "homepage": "http://milianw.de"
+ },
+ {
+ "name": "Thomas Zilliox",
+ "email": "hello@tzi.fr",
+ "homepage": "http://tzi.fr"
+ }
+ ],
+ "description": "The HTML to Markdown converter for PHP ",
+ "homepage": "https://github.com/elephant418/Markdownify",
+ "keywords": [
+ "markdown",
+ "markdownify"
+ ],
+ "time": "2016-09-21T13:01:43+00:00"
+ },
+ {
+ "name": "psr/log",
+ "version": "1.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/log.git",
+ "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
+ "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Log\\": "Psr/Log/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for logging libraries",
+ "homepage": "https://github.com/php-fig/log",
+ "keywords": [
+ "log",
+ "psr",
+ "psr-3"
+ ],
+ "time": "2016-10-10T12:19:37+00:00"
+ },
+ {
+ "name": "sabre/dav",
+ "version": "3.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/fruux/sabre-dav.git",
+ "reference": "5b9737cc2f0182e368d14c80df7f6b2d77dc1457"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/fruux/sabre-dav/zipball/5b9737cc2f0182e368d14c80df7f6b2d77dc1457",
+ "reference": "5b9737cc2f0182e368d14c80df7f6b2d77dc1457",
+ "shasum": ""
+ },
+ "require": {
+ "ext-ctype": "*",
+ "ext-date": "*",
+ "ext-dom": "*",
+ "ext-iconv": "*",
+ "ext-mbstring": "*",
+ "ext-pcre": "*",
+ "ext-simplexml": "*",
+ "ext-spl": "*",
+ "lib-libxml": ">=2.7.0",
+ "php": ">=5.5.0",
+ "psr/log": "^1.0",
+ "sabre/event": ">=2.0.0, <4.0.0",
+ "sabre/http": "^4.2.1",
+ "sabre/uri": "^1.0.1",
+ "sabre/vobject": "^4.1.0",
+ "sabre/xml": "^1.4.0"
+ },
+ "require-dev": {
+ "evert/phpdoc-md": "~0.1.0",
+ "monolog/monolog": "^1.18",
+ "phpunit/phpunit": "> 4.8, <=6.0.0",
+ "sabre/cs": "~0.0.5"
+ },
+ "suggest": {
+ "ext-curl": "*",
+ "ext-pdo": "*"
+ },
+ "bin": [
+ "bin/sabredav",
+ "bin/naturalselection"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Sabre\\DAV\\": "lib/DAV/",
+ "Sabre\\DAVACL\\": "lib/DAVACL/",
+ "Sabre\\CalDAV\\": "lib/CalDAV/",
+ "Sabre\\CardDAV\\": "lib/CardDAV/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Evert Pot",
+ "email": "me@evertpot.com",
+ "homepage": "http://evertpot.com/",
+ "role": "Developer"
+ }
+ ],
+ "description": "WebDAV Framework for PHP",
+ "homepage": "http://sabre.io/",
+ "keywords": [
+ "CalDAV",
+ "CardDAV",
+ "WebDAV",
+ "framework",
+ "iCalendar"
+ ],
+ "time": "2016-06-28T02:44:05+00:00"
+ },
+ {
+ "name": "sabre/event",
+ "version": "3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/fruux/sabre-event.git",
+ "reference": "831d586f5a442dceacdcf5e9c4c36a4db99a3534"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/fruux/sabre-event/zipball/831d586f5a442dceacdcf5e9c4c36a4db99a3534",
+ "reference": "831d586f5a442dceacdcf5e9c4c36a4db99a3534",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "*",
+ "sabre/cs": "~0.0.4"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Sabre\\Event\\": "lib/"
+ },
+ "files": [
+ "lib/coroutine.php",
+ "lib/Loop/functions.php",
+ "lib/Promise/functions.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Evert Pot",
+ "email": "me@evertpot.com",
+ "homepage": "http://evertpot.com/",
+ "role": "Developer"
+ }
+ ],
+ "description": "sabre/event is a library for lightweight event-based programming",
+ "homepage": "http://sabre.io/event/",
+ "keywords": [
+ "EventEmitter",
+ "async",
+ "events",
+ "hooks",
+ "plugin",
+ "promise",
+ "signal"
+ ],
+ "time": "2015-11-05T20:14:39+00:00"
+ },
+ {
+ "name": "sabre/http",
+ "version": "4.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/fruux/sabre-http.git",
+ "reference": "2e93bc8321524c67be4ca5b8415daebd4c8bf85e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/fruux/sabre-http/zipball/2e93bc8321524c67be4ca5b8415daebd4c8bf85e",
+ "reference": "2e93bc8321524c67be4ca5b8415daebd4c8bf85e",
+ "shasum": ""
+ },
+ "require": {
+ "ext-mbstring": "*",
+ "php": ">=5.4",
+ "sabre/event": ">=1.0.0,<4.0.0",
+ "sabre/uri": "~1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.3",
+ "sabre/cs": "~0.0.1"
+ },
+ "suggest": {
+ "ext-curl": " to make http requests with the Client class"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "lib/functions.php"
+ ],
+ "psr-4": {
+ "Sabre\\HTTP\\": "lib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Evert Pot",
+ "email": "me@evertpot.com",
+ "homepage": "http://evertpot.com/",
+ "role": "Developer"
+ }
+ ],
+ "description": "The sabre/http library provides utilities for dealing with http requests and responses. ",
+ "homepage": "https://github.com/fruux/sabre-http",
+ "keywords": [
+ "http"
+ ],
+ "time": "2016-01-06T23:00:08+00:00"
+ },
+ {
+ "name": "sabre/uri",
+ "version": "1.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/fruux/sabre-uri.git",
+ "reference": "9012116434d84ef6e5e37a89dfdbfbe2204a8704"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/fruux/sabre-uri/zipball/9012116434d84ef6e5e37a89dfdbfbe2204a8704",
+ "reference": "9012116434d84ef6e5e37a89dfdbfbe2204a8704",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.4.7"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "*",
+ "sabre/cs": "~0.0.1"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "lib/functions.php"
+ ],
+ "psr-4": {
+ "Sabre\\Uri\\": "lib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Evert Pot",
+ "email": "me@evertpot.com",
+ "homepage": "http://evertpot.com/",
+ "role": "Developer"
+ }
+ ],
+ "description": "Functions for making sense out of URIs.",
+ "homepage": "http://sabre.io/uri/",
+ "keywords": [
+ "rfc3986",
+ "uri",
+ "url"
+ ],
+ "time": "2016-03-08T02:29:27+00:00"
+ },
+ {
+ "name": "sabre/vobject",
+ "version": "4.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/fruux/sabre-vobject.git",
+ "reference": "a3a59b06947f122af2d45d52b72172cdc1efd68f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/fruux/sabre-vobject/zipball/a3a59b06947f122af2d45d52b72172cdc1efd68f",
+ "reference": "a3a59b06947f122af2d45d52b72172cdc1efd68f",
+ "shasum": ""
+ },
+ "require": {
+ "ext-mbstring": "*",
+ "php": ">=5.5",
+ "sabre/xml": "~1.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "*",
+ "sabre/cs": "~0.0.3"
+ },
+ "suggest": {
+ "hoa/bench": "If you would like to run the benchmark scripts"
+ },
+ "bin": [
+ "bin/vobject",
+ "bin/generate_vcards"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Sabre\\VObject\\": "lib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Evert Pot",
+ "email": "me@evertpot.com",
+ "homepage": "http://evertpot.com/",
+ "role": "Developer"
+ },
+ {
+ "name": "Dominik Tobschall",
+ "email": "dominik@fruux.com",
+ "homepage": "http://tobschall.de/",
+ "role": "Developer"
+ },
+ {
+ "name": "Ivan Enderlin",
+ "email": "ivan.enderlin@hoa-project.net",
+ "homepage": "http://mnt.io/",
+ "role": "Developer"
+ }
+ ],
+ "description": "The VObject library for PHP allows you to easily parse and manipulate iCalendar and vCard objects",
+ "homepage": "http://sabre.io/vobject/",
+ "keywords": [
+ "availability",
+ "freebusy",
+ "iCalendar",
+ "ical",
+ "ics",
+ "jCal",
+ "jCard",
+ "recurrence",
+ "rfc2425",
+ "rfc2426",
+ "rfc2739",
+ "rfc4770",
+ "rfc5545",
+ "rfc5546",
+ "rfc6321",
+ "rfc6350",
+ "rfc6351",
+ "rfc6474",
+ "rfc6638",
+ "rfc6715",
+ "rfc6868",
+ "vCalendar",
+ "vCard",
+ "vcf",
+ "xCal",
+ "xCard"
+ ],
+ "time": "2016-07-15T19:52:17+00:00"
+ },
+ {
+ "name": "sabre/xml",
+ "version": "1.5.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/fruux/sabre-xml.git",
+ "reference": "59b20e5bbace9912607481634f97d05a776ffca7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/fruux/sabre-xml/zipball/59b20e5bbace9912607481634f97d05a776ffca7",
+ "reference": "59b20e5bbace9912607481634f97d05a776ffca7",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-xmlreader": "*",
+ "ext-xmlwriter": "*",
+ "lib-libxml": ">=2.6.20",
+ "php": ">=5.5.5",
+ "sabre/uri": ">=1.0,<3.0.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "*",
+ "sabre/cs": "~1.0.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Sabre\\Xml\\": "lib/"
+ },
+ "files": [
+ "lib/Deserializer/functions.php",
+ "lib/Serializer/functions.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Evert Pot",
+ "email": "me@evertpot.com",
+ "homepage": "http://evertpot.com/",
+ "role": "Developer"
+ },
+ {
+ "name": "Markus Staab",
+ "email": "markus.staab@redaxo.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "sabre/xml is an XML library that you may not hate.",
+ "homepage": "https://sabre.io/xml/",
+ "keywords": [
+ "XMLReader",
+ "XMLWriter",
+ "dom",
+ "xml"
+ ],
+ "time": "2016-10-09T22:57:52+00:00"
+ },
+ {
+ "name": "simplepie/simplepie",
+ "version": "1.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/simplepie/simplepie.git",
+ "reference": "5de5551953f95feef12cf355a7a26a70f94aa3ab"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/simplepie/simplepie/zipball/5de5551953f95feef12cf355a7a26a70f94aa3ab",
+ "reference": "5de5551953f95feef12cf355a7a26a70f94aa3ab",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4 || ~5"
+ },
+ "suggest": {
+ "mf2/mf2": "Microformat module that allows for parsing HTML for microformats"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-0": {
+ "SimplePie": "library"
+ }
+ },
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Ryan Parman",
+ "homepage": "http://ryanparman.com/",
+ "role": "Creator, alumnus developer"
+ },
+ {
+ "name": "Geoffrey Sneddon",
+ "homepage": "http://gsnedders.com/",
+ "role": "Alumnus developer"
+ },
+ {
+ "name": "Ryan McCue",
+ "email": "me@ryanmccue.info",
+ "homepage": "http://ryanmccue.info/",
+ "role": "Developer"
+ }
+ ],
+ "description": "A simple Atom/RSS parsing library for PHP",
+ "homepage": "http://simplepie.org/",
+ "keywords": [
+ "atom",
+ "feeds",
+ "rss"
+ ],
+ "support": {
+ "source": "https://github.com/simplepie/simplepie/tree/1.5",
+ "issues": "https://github.com/simplepie/simplepie/issues"
+ },
+ "time": "2017-04-17T07:29:31+00:00"
+ }
+ ],
+ "packages-dev": [
+ {
+ "name": "behat/behat",
+ "version": "v3.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Behat/Behat.git",
+ "reference": "15a3a1857457eaa29cdf41564a5e421effb09526"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Behat/Behat/zipball/15a3a1857457eaa29cdf41564a5e421effb09526",
+ "reference": "15a3a1857457eaa29cdf41564a5e421effb09526",
+ "shasum": ""
+ },
+ "require": {
+ "behat/gherkin": "^4.4.4",
+ "behat/transliterator": "~1.0",
+ "container-interop/container-interop": "^1.1",
+ "ext-mbstring": "*",
+ "php": ">=5.3.3",
+ "symfony/class-loader": "~2.1||~3.0",
+ "symfony/config": "~2.3||~3.0",
+ "symfony/console": "~2.5||~3.0",
+ "symfony/dependency-injection": "~2.1||~3.0",
+ "symfony/event-dispatcher": "~2.1||~3.0",
+ "symfony/translation": "~2.3||~3.0",
+ "symfony/yaml": "~2.1||~3.0"
+ },
+ "require-dev": {
+ "herrera-io/box": "~1.6.1",
+ "phpunit/phpunit": "~4.5",
+ "symfony/process": "~2.5|~3.0"
+ },
+ "suggest": {
+ "behat/mink-extension": "for integration with Mink testing framework",
+ "behat/symfony2-extension": "for integration with Symfony2 web framework",
+ "behat/yii-extension": "for integration with Yii web framework"
+ },
+ "bin": [
+ "bin/behat"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.2.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Behat\\Behat": "src/",
+ "Behat\\Testwork": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Konstantin Kudryashov",
+ "email": "ever.zet@gmail.com",
+ "homepage": "http://everzet.com"
+ }
+ ],
+ "description": "Scenario-oriented BDD framework for PHP 5.3",
+ "homepage": "http://behat.org/",
+ "keywords": [
+ "Agile",
+ "BDD",
+ "ScenarioBDD",
+ "Scrum",
+ "StoryBDD",
+ "User story",
+ "business",
+ "development",
+ "documentation",
+ "examples",
+ "symfony",
+ "testing"
+ ],
+ "time": "2016-12-25T13:43:52+00:00"
+ },
+ {
+ "name": "behat/gherkin",
+ "version": "v4.4.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Behat/Gherkin.git",
+ "reference": "5c14cff4f955b17d20d088dec1bde61c0539ec74"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Behat/Gherkin/zipball/5c14cff4f955b17d20d088dec1bde61c0539ec74",
+ "reference": "5c14cff4f955b17d20d088dec1bde61c0539ec74",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.5|~5",
+ "symfony/phpunit-bridge": "~2.7|~3",
+ "symfony/yaml": "~2.3|~3"
+ },
+ "suggest": {
+ "symfony/yaml": "If you want to parse features, represented in YAML files"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.4-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Behat\\Gherkin": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Konstantin Kudryashov",
+ "email": "ever.zet@gmail.com",
+ "homepage": "http://everzet.com"
+ }
+ ],
+ "description": "Gherkin DSL parser for PHP 5.3",
+ "homepage": "http://behat.org/",
+ "keywords": [
+ "BDD",
+ "Behat",
+ "Cucumber",
+ "DSL",
+ "gherkin",
+ "parser"
+ ],
+ "time": "2016-10-30T11:50:56+00:00"
+ },
+ {
+ "name": "behat/mink",
+ "version": "v1.7.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/minkphp/Mink.git",
+ "reference": "e6930b9c74693dff7f4e58577e1b1743399f3ff9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/minkphp/Mink/zipball/e6930b9c74693dff7f4e58577e1b1743399f3ff9",
+ "reference": "e6930b9c74693dff7f4e58577e1b1743399f3ff9",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.1",
+ "symfony/css-selector": "~2.1|~3.0"
+ },
+ "require-dev": {
+ "symfony/phpunit-bridge": "~2.7|~3.0"
+ },
+ "suggest": {
+ "behat/mink-browserkit-driver": "extremely fast headless driver for Symfony\\Kernel-based apps (Sf2, Silex)",
+ "behat/mink-goutte-driver": "fast headless driver for any app without JS emulation",
+ "behat/mink-selenium2-driver": "slow, but JS-enabled driver for any app (requires Selenium2)",
+ "behat/mink-zombie-driver": "fast and JS-enabled headless driver for any app (requires node.js)"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.7.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Behat\\Mink\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Konstantin Kudryashov",
+ "email": "ever.zet@gmail.com",
+ "homepage": "http://everzet.com"
+ }
+ ],
+ "description": "Browser controller/emulator abstraction for PHP",
+ "homepage": "http://mink.behat.org/",
+ "keywords": [
+ "browser",
+ "testing",
+ "web"
+ ],
+ "time": "2016-03-05T08:26:18+00:00"
+ },
+ {
+ "name": "behat/mink-browserkit-driver",
+ "version": "v1.3.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/minkphp/MinkBrowserKitDriver.git",
+ "reference": "10e67fb4a295efcd62ea0bf16025a85ea19534fb"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/minkphp/MinkBrowserKitDriver/zipball/10e67fb4a295efcd62ea0bf16025a85ea19534fb",
+ "reference": "10e67fb4a295efcd62ea0bf16025a85ea19534fb",
+ "shasum": ""
+ },
+ "require": {
+ "behat/mink": "^1.7.1@dev",
+ "php": ">=5.3.6",
+ "symfony/browser-kit": "~2.3|~3.0",
+ "symfony/dom-crawler": "~2.3|~3.0"
+ },
+ "require-dev": {
+ "silex/silex": "~1.2",
+ "symfony/phpunit-bridge": "~2.7|~3.0"
+ },
+ "type": "mink-driver",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.3.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Behat\\Mink\\Driver\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Konstantin Kudryashov",
+ "email": "ever.zet@gmail.com",
+ "homepage": "http://everzet.com"
+ }
+ ],
+ "description": "Symfony2 BrowserKit driver for Mink framework",
+ "homepage": "http://mink.behat.org/",
+ "keywords": [
+ "Mink",
+ "Symfony2",
+ "browser",
+ "testing"
+ ],
+ "time": "2016-03-05T08:59:47+00:00"
+ },
+ {
+ "name": "behat/mink-extension",
+ "version": "v2.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Behat/MinkExtension.git",
+ "reference": "5b4bda64ff456104564317e212c823e45cad9d59"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Behat/MinkExtension/zipball/5b4bda64ff456104564317e212c823e45cad9d59",
+ "reference": "5b4bda64ff456104564317e212c823e45cad9d59",
+ "shasum": ""
+ },
+ "require": {
+ "behat/behat": "~3.0,>=3.0.5",
+ "behat/mink": "~1.5",
+ "php": ">=5.3.2",
+ "symfony/config": "~2.2|~3.0"
+ },
+ "require-dev": {
+ "behat/mink-goutte-driver": "~1.1",
+ "phpspec/phpspec": "~2.0"
+ },
+ "type": "behat-extension",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Behat\\MinkExtension": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Christophe Coevoet",
+ "email": "stof@notk.org"
+ },
+ {
+ "name": "Konstantin Kudryashov",
+ "email": "ever.zet@gmail.com"
+ }
+ ],
+ "description": "Mink extension for Behat",
+ "homepage": "http://extensions.behat.org/mink",
+ "keywords": [
+ "browser",
+ "gui",
+ "test",
+ "web"
+ ],
+ "time": "2016-02-15T07:55:18+00:00"
+ },
+ {
+ "name": "behat/mink-goutte-driver",
+ "version": "v1.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/minkphp/MinkGoutteDriver.git",
+ "reference": "8b9ad6d2d95bc70b840d15323365f52fcdaea6ca"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/minkphp/MinkGoutteDriver/zipball/8b9ad6d2d95bc70b840d15323365f52fcdaea6ca",
+ "reference": "8b9ad6d2d95bc70b840d15323365f52fcdaea6ca",
+ "shasum": ""
+ },
+ "require": {
+ "behat/mink": "~1.6@dev",
+ "behat/mink-browserkit-driver": "~1.2@dev",
+ "fabpot/goutte": "~1.0.4|~2.0|~3.1",
+ "php": ">=5.3.1"
+ },
+ "require-dev": {
+ "symfony/phpunit-bridge": "~2.7|~3.0"
+ },
+ "type": "mink-driver",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.2.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Behat\\Mink\\Driver\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Konstantin Kudryashov",
+ "email": "ever.zet@gmail.com",
+ "homepage": "http://everzet.com"
+ }
+ ],
+ "description": "Goutte driver for Mink framework",
+ "homepage": "http://mink.behat.org/",
+ "keywords": [
+ "browser",
+ "goutte",
+ "headless",
+ "testing"
+ ],
+ "time": "2016-03-05T09:04:22+00:00"
+ },
+ {
+ "name": "behat/transliterator",
+ "version": "v1.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Behat/Transliterator.git",
+ "reference": "868e05be3a9f25ba6424c2dd4849567f50715003"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Behat/Transliterator/zipball/868e05be3a9f25ba6424c2dd4849567f50715003",
+ "reference": "868e05be3a9f25ba6424c2dd4849567f50715003",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Behat\\Transliterator": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "Artistic-1.0"
+ ],
+ "description": "String transliterator",
+ "keywords": [
+ "i18n",
+ "slug",
+ "transliterator"
+ ],
+ "time": "2015-09-28T16:26:35+00:00"
+ },
+ {
+ "name": "container-interop/container-interop",
+ "version": "1.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/container-interop/container-interop.git",
+ "reference": "79cbf1341c22ec75643d841642dd5d6acd83bdb8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/container-interop/container-interop/zipball/79cbf1341c22ec75643d841642dd5d6acd83bdb8",
+ "reference": "79cbf1341c22ec75643d841642dd5d6acd83bdb8",
+ "shasum": ""
+ },
+ "require": {
+ "psr/container": "^1.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Interop\\Container\\": "src/Interop/Container/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Promoting the interoperability of container objects (DIC, SL, etc.)",
+ "homepage": "https://github.com/container-interop/container-interop",
+ "time": "2017-02-14T19:40:03+00:00"
+ },
+ {
+ "name": "doctrine/instantiator",
+ "version": "1.0.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/instantiator.git",
+ "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d",
+ "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3,<8.0-DEV"
+ },
+ "require-dev": {
+ "athletic/athletic": "~0.1.8",
+ "ext-pdo": "*",
+ "ext-phar": "*",
+ "phpunit/phpunit": "~4.0",
+ "squizlabs/php_codesniffer": "~2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Marco Pivetta",
+ "email": "ocramius@gmail.com",
+ "homepage": "http://ocramius.github.com/"
+ }
+ ],
+ "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
+ "homepage": "https://github.com/doctrine/instantiator",
+ "keywords": [
+ "constructor",
+ "instantiate"
+ ],
+ "time": "2015-06-14T21:17:01+00:00"
+ },
+ {
+ "name": "fabpot/goutte",
+ "version": "v3.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/FriendsOfPHP/Goutte.git",
+ "reference": "db5c28f4a010b4161d507d5304e28a7ebf211638"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/FriendsOfPHP/Goutte/zipball/db5c28f4a010b4161d507d5304e28a7ebf211638",
+ "reference": "db5c28f4a010b4161d507d5304e28a7ebf211638",
+ "shasum": ""
+ },
+ "require": {
+ "guzzlehttp/guzzle": "^6.0",
+ "php": ">=5.5.0",
+ "symfony/browser-kit": "~2.1|~3.0",
+ "symfony/css-selector": "~2.1|~3.0",
+ "symfony/dom-crawler": "~2.1|~3.0"
+ },
+ "type": "application",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.2-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Goutte\\": "Goutte"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ }
+ ],
+ "description": "A simple PHP Web Scraper",
+ "homepage": "https://github.com/FriendsOfPHP/Goutte",
+ "keywords": [
+ "scraper"
+ ],
+ "time": "2017-01-03T13:21:43+00:00"
+ },
+ {
+ "name": "guzzlehttp/guzzle",
+ "version": "6.2.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/guzzle.git",
+ "reference": "8d6c6cc55186db87b7dc5009827429ba4e9dc006"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/guzzle/zipball/8d6c6cc55186db87b7dc5009827429ba4e9dc006",
+ "reference": "8d6c6cc55186db87b7dc5009827429ba4e9dc006",
+ "shasum": ""
+ },
+ "require": {
+ "guzzlehttp/promises": "^1.0",
+ "guzzlehttp/psr7": "^1.4",
+ "php": ">=5.5"
+ },
+ "require-dev": {
+ "ext-curl": "*",
+ "phpunit/phpunit": "^4.0",
+ "psr/log": "^1.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "6.2-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/functions_include.php"
+ ],
+ "psr-4": {
+ "GuzzleHttp\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ }
+ ],
+ "description": "Guzzle is a PHP HTTP client library",
+ "homepage": "http://guzzlephp.org/",
+ "keywords": [
+ "client",
+ "curl",
+ "framework",
+ "http",
+ "http client",
+ "rest",
+ "web service"
+ ],
+ "time": "2017-02-28T22:50:30+00:00"
+ },
+ {
+ "name": "guzzlehttp/promises",
+ "version": "v1.3.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/promises.git",
+ "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646",
+ "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "GuzzleHttp\\Promise\\": "src/"
+ },
+ "files": [
+ "src/functions_include.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ }
+ ],
+ "description": "Guzzle promises library",
+ "keywords": [
+ "promise"
+ ],
+ "time": "2016-12-20T10:07:11+00:00"
+ },
+ {
+ "name": "guzzlehttp/psr7",
+ "version": "1.4.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/psr7.git",
+ "reference": "0d6c7ca039329247e4f0f8f8f6506810e8248855"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/psr7/zipball/0d6c7ca039329247e4f0f8f8f6506810e8248855",
+ "reference": "0d6c7ca039329247e4f0f8f8f6506810e8248855",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.4.0",
+ "psr/http-message": "~1.0"
+ },
+ "provide": {
+ "psr/http-message-implementation": "1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "GuzzleHttp\\Psr7\\": "src/"
+ },
+ "files": [
+ "src/functions_include.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ },
+ {
+ "name": "Tobias Schultze",
+ "homepage": "https://github.com/Tobion"
+ }
+ ],
+ "description": "PSR-7 message implementation that also provides common utility methods",
+ "keywords": [
+ "http",
+ "message",
+ "request",
+ "response",
+ "stream",
+ "uri",
+ "url"
+ ],
+ "time": "2017-02-27T10:51:17+00:00"
+ },
+ {
+ "name": "myclabs/deep-copy",
+ "version": "1.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/myclabs/DeepCopy.git",
+ "reference": "5a5a9fc8025a08d8919be87d6884d5a92520cefe"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/5a5a9fc8025a08d8919be87d6884d5a92520cefe",
+ "reference": "5a5a9fc8025a08d8919be87d6884d5a92520cefe",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.4.0"
+ },
+ "require-dev": {
+ "doctrine/collections": "1.*",
+ "phpunit/phpunit": "~4.1"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "DeepCopy\\": "src/DeepCopy/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Create deep copies (clones) of your objects",
+ "homepage": "https://github.com/myclabs/DeepCopy",
+ "keywords": [
+ "clone",
+ "copy",
+ "duplicate",
+ "object",
+ "object graph"
+ ],
+ "time": "2017-01-26T22:05:40+00:00"
+ },
+ {
+ "name": "php-mock/php-mock",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-mock/php-mock.git",
+ "reference": "22d297231118e6fd5b9db087fbe1ef866c2b95d2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-mock/php-mock/zipball/22d297231118e6fd5b9db087fbe1ef866c2b95d2",
+ "reference": "22d297231118e6fd5b9db087fbe1ef866c2b95d2",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.6",
+ "phpunit/php-text-template": "^1"
+ },
+ "replace": {
+ "malkusch/php-mock": "*"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^5.7"
+ },
+ "suggest": {
+ "php-mock/php-mock-phpunit": "Allows integration into PHPUnit testcase with the trait PHPMock."
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "phpmock\\": [
+ "classes/",
+ "tests/"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "WTFPL"
+ ],
+ "authors": [
+ {
+ "name": "Markus Malkusch",
+ "email": "markus@malkusch.de",
+ "homepage": "http://markus.malkusch.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "PHP-Mock can mock built-in PHP functions (e.g. time()). PHP-Mock relies on PHP's namespace fallback policy. No further extension is needed.",
+ "homepage": "https://github.com/php-mock/php-mock",
+ "keywords": [
+ "BDD",
+ "TDD",
+ "function",
+ "mock",
+ "stub",
+ "test",
+ "test double"
+ ],
+ "time": "2017-02-17T20:52:52+00:00"
+ },
+ {
+ "name": "php-mock/php-mock-integration",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-mock/php-mock-integration.git",
+ "reference": "5a0d7d7755f823bc2a230cfa45058b40f9013bc4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-mock/php-mock-integration/zipball/5a0d7d7755f823bc2a230cfa45058b40f9013bc4",
+ "reference": "5a0d7d7755f823bc2a230cfa45058b40f9013bc4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.6",
+ "php-mock/php-mock": "^2",
+ "phpunit/php-text-template": "^1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4|^5"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "phpmock\\integration\\": "classes/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "WTFPL"
+ ],
+ "authors": [
+ {
+ "name": "Markus Malkusch",
+ "email": "markus@malkusch.de",
+ "homepage": "http://markus.malkusch.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "Integration package for PHP-Mock",
+ "homepage": "https://github.com/php-mock/php-mock-integration",
+ "keywords": [
+ "BDD",
+ "TDD",
+ "function",
+ "mock",
+ "stub",
+ "test",
+ "test double"
+ ],
+ "time": "2017-02-17T21:31:34+00:00"
+ },
+ {
+ "name": "php-mock/php-mock-phpunit",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-mock/php-mock-phpunit.git",
+ "reference": "173781abdc632c59200253e12e2b991ae6a4574f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-mock/php-mock-phpunit/zipball/173781abdc632c59200253e12e2b991ae6a4574f",
+ "reference": "173781abdc632c59200253e12e2b991ae6a4574f",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7",
+ "php-mock/php-mock-integration": "^2",
+ "phpunit/phpunit": "^6"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "phpmock\\phpunit\\": "classes/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "WTFPL"
+ ],
+ "authors": [
+ {
+ "name": "Markus Malkusch",
+ "email": "markus@malkusch.de",
+ "homepage": "http://markus.malkusch.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "Mock built-in PHP functions (e.g. time()) with PHPUnit. This package relies on PHP's namespace fallback policy. No further extension is needed.",
+ "homepage": "https://github.com/php-mock/php-mock-phpunit",
+ "keywords": [
+ "BDD",
+ "TDD",
+ "function",
+ "mock",
+ "phpunit",
+ "stub",
+ "test",
+ "test double"
+ ],
+ "time": "2017-02-17T22:44:38+00:00"
+ },
+ {
+ "name": "phpdocumentor/reflection-common",
+ "version": "1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
+ "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/144c307535e82c8fdcaacbcfc1d6d8eeb896687c",
+ "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.6"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": [
+ "src"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jaap van Otterdijk",
+ "email": "opensource@ijaap.nl"
+ }
+ ],
+ "description": "Common reflection classes used by phpdocumentor to reflect the code structure",
+ "homepage": "http://www.phpdoc.org",
+ "keywords": [
+ "FQSEN",
+ "phpDocumentor",
+ "phpdoc",
+ "reflection",
+ "static analysis"
+ ],
+ "time": "2015-12-27T11:43:31+00:00"
+ },
+ {
+ "name": "phpdocumentor/reflection-docblock",
+ "version": "3.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
+ "reference": "8331b5efe816ae05461b7ca1e721c01b46bafb3e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/8331b5efe816ae05461b7ca1e721c01b46bafb3e",
+ "reference": "8331b5efe816ae05461b7ca1e721c01b46bafb3e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5",
+ "phpdocumentor/reflection-common": "^1.0@dev",
+ "phpdocumentor/type-resolver": "^0.2.0",
+ "webmozart/assert": "^1.0"
+ },
+ "require-dev": {
+ "mockery/mockery": "^0.9.4",
+ "phpunit/phpunit": "^4.4"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": [
+ "src/"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "me@mikevanriel.com"
+ }
+ ],
+ "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
+ "time": "2016-09-30T07:12:33+00:00"
+ },
+ {
+ "name": "phpdocumentor/type-resolver",
+ "version": "0.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/TypeResolver.git",
+ "reference": "e224fb2ea2fba6d3ad6fdaef91cd09a172155ccb"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/e224fb2ea2fba6d3ad6fdaef91cd09a172155ccb",
+ "reference": "e224fb2ea2fba6d3ad6fdaef91cd09a172155ccb",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5",
+ "phpdocumentor/reflection-common": "^1.0"
+ },
+ "require-dev": {
+ "mockery/mockery": "^0.9.4",
+ "phpunit/phpunit": "^5.2||^4.8.24"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": [
+ "src/"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "me@mikevanriel.com"
+ }
+ ],
+ "time": "2016-11-25T06:54:22+00:00"
+ },
+ {
+ "name": "phpspec/prophecy",
+ "version": "v1.7.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpspec/prophecy.git",
+ "reference": "93d39f1f7f9326d746203c7c056f300f7f126073"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpspec/prophecy/zipball/93d39f1f7f9326d746203c7c056f300f7f126073",
+ "reference": "93d39f1f7f9326d746203c7c056f300f7f126073",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/instantiator": "^1.0.2",
+ "php": "^5.3|^7.0",
+ "phpdocumentor/reflection-docblock": "^2.0|^3.0.2",
+ "sebastian/comparator": "^1.1|^2.0",
+ "sebastian/recursion-context": "^1.0|^2.0|^3.0"
+ },
+ "require-dev": {
+ "phpspec/phpspec": "^2.5|^3.2",
+ "phpunit/phpunit": "^4.8 || ^5.6.5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.6.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Prophecy\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Konstantin Kudryashov",
+ "email": "ever.zet@gmail.com",
+ "homepage": "http://everzet.com"
+ },
+ {
+ "name": "Marcello Duarte",
+ "email": "marcello.duarte@gmail.com"
+ }
+ ],
+ "description": "Highly opinionated mocking framework for PHP 5.3+",
+ "homepage": "https://github.com/phpspec/prophecy",
+ "keywords": [
+ "Double",
+ "Dummy",
+ "fake",
+ "mock",
+ "spy",
+ "stub"
+ ],
+ "time": "2017-03-02T20:05:34+00:00"
+ },
+ {
+ "name": "phpunit/php-code-coverage",
+ "version": "5.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
+ "reference": "531553c4795a1df54114342d68ca337d5d81c8a0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/531553c4795a1df54114342d68ca337d5d81c8a0",
+ "reference": "531553c4795a1df54114342d68ca337d5d81c8a0",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-xmlwriter": "*",
+ "php": "^7.0",
+ "phpunit/php-file-iterator": "^1.3",
+ "phpunit/php-text-template": "^1.2",
+ "phpunit/php-token-stream": "^1.4.11 || ^2.0",
+ "sebastian/code-unit-reverse-lookup": "^1.0",
+ "sebastian/environment": "^2.0",
+ "sebastian/version": "^2.0"
+ },
+ "require-dev": {
+ "ext-xdebug": "^2.5",
+ "phpunit/phpunit": "^6.0"
+ },
+ "suggest": {
+ "ext-xdebug": "^2.5.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sb@sebastian-bergmann.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
+ "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
+ "keywords": [
+ "coverage",
+ "testing",
+ "xunit"
+ ],
+ "time": "2017-03-01T09:14:18+00:00"
+ },
+ {
+ "name": "phpunit/php-file-iterator",
+ "version": "1.4.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
+ "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/3cc8f69b3028d0f96a9078e6295d86e9bf019be5",
+ "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sb@sebastian-bergmann.de",
+ "role": "lead"
+ }
+ ],
+ "description": "FilterIterator implementation that filters files based on a list of suffixes.",
+ "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
+ "keywords": [
+ "filesystem",
+ "iterator"
+ ],
+ "time": "2016-10-03T07:40:28+00:00"
+ },
+ {
+ "name": "phpunit/php-text-template",
+ "version": "1.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-text-template.git",
+ "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
+ "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Simple template engine.",
+ "homepage": "https://github.com/sebastianbergmann/php-text-template/",
+ "keywords": [
+ "template"
+ ],
+ "time": "2015-06-21T13:50:34+00:00"
+ },
+ {
+ "name": "phpunit/php-timer",
+ "version": "1.0.9",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-timer.git",
+ "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3dcf38ca72b158baf0bc245e9184d3fdffa9c46f",
+ "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.3.3 || ^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sb@sebastian-bergmann.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Utility class for timing",
+ "homepage": "https://github.com/sebastianbergmann/php-timer/",
+ "keywords": [
+ "timer"
+ ],
+ "time": "2017-02-26T11:10:40+00:00"
+ },
+ {
+ "name": "phpunit/php-token-stream",
+ "version": "1.4.11",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-token-stream.git",
+ "reference": "e03f8f67534427a787e21a385a67ec3ca6978ea7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/e03f8f67534427a787e21a385a67ec3ca6978ea7",
+ "reference": "e03f8f67534427a787e21a385a67ec3ca6978ea7",
+ "shasum": ""
+ },
+ "require": {
+ "ext-tokenizer": "*",
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Wrapper around PHP's tokenizer extension.",
+ "homepage": "https://github.com/sebastianbergmann/php-token-stream/",
+ "keywords": [
+ "tokenizer"
+ ],
+ "time": "2017-02-27T10:12:30+00:00"
+ },
+ {
+ "name": "phpunit/phpunit",
+ "version": "6.0.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/phpunit.git",
+ "reference": "47ee3fa1bca5c50f1d25105201eb20df777bd7b6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/47ee3fa1bca5c50f1d25105201eb20df777bd7b6",
+ "reference": "47ee3fa1bca5c50f1d25105201eb20df777bd7b6",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-json": "*",
+ "ext-libxml": "*",
+ "ext-mbstring": "*",
+ "ext-xml": "*",
+ "myclabs/deep-copy": "^1.3",
+ "php": "^7.0",
+ "phpspec/prophecy": "^1.6.2",
+ "phpunit/php-code-coverage": "^5.0",
+ "phpunit/php-file-iterator": "^1.4",
+ "phpunit/php-text-template": "^1.2",
+ "phpunit/php-timer": "^1.0.6",
+ "phpunit/phpunit-mock-objects": "^4.0",
+ "sebastian/comparator": "^1.2.4 || ^2.0",
+ "sebastian/diff": "^1.2",
+ "sebastian/environment": "^2.0",
+ "sebastian/exporter": "^2.0 || ^3.0",
+ "sebastian/global-state": "^1.1 || ^2.0",
+ "sebastian/object-enumerator": "^2.0 || ^3.0",
+ "sebastian/resource-operations": "^1.0",
+ "sebastian/version": "^2.0"
+ },
+ "conflict": {
+ "phpdocumentor/reflection-docblock": "3.0.2",
+ "phpunit/dbunit": "<3.0"
+ },
+ "require-dev": {
+ "ext-pdo": "*"
+ },
+ "suggest": {
+ "ext-xdebug": "*",
+ "phpunit/php-invoker": "^1.1"
+ },
+ "bin": [
+ "phpunit"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "6.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "The PHP Unit Testing framework.",
+ "homepage": "https://phpunit.de/",
+ "keywords": [
+ "phpunit",
+ "testing",
+ "xunit"
+ ],
+ "time": "2017-03-02T15:24:03+00:00"
+ },
+ {
+ "name": "phpunit/phpunit-mock-objects",
+ "version": "4.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git",
+ "reference": "eabce450df194817a7d7e27e19013569a903a2bf"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/eabce450df194817a7d7e27e19013569a903a2bf",
+ "reference": "eabce450df194817a7d7e27e19013569a903a2bf",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/instantiator": "^1.0.2",
+ "php": "^7.0",
+ "phpunit/php-text-template": "^1.2",
+ "sebastian/exporter": "^3.0"
+ },
+ "conflict": {
+ "phpunit/phpunit": "<6.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.0"
+ },
+ "suggest": {
+ "ext-soap": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sb@sebastian-bergmann.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Mock Object library for PHPUnit",
+ "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/",
+ "keywords": [
+ "mock",
+ "xunit"
+ ],
+ "time": "2017-03-03T06:30:20+00:00"
+ },
+ {
+ "name": "psr/container",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/container.git",
+ "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
+ "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Container\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common Container Interface (PHP FIG PSR-11)",
+ "homepage": "https://github.com/php-fig/container",
+ "keywords": [
+ "PSR-11",
+ "container",
+ "container-interface",
+ "container-interop",
+ "psr"
+ ],
+ "time": "2017-02-14T16:28:37+00:00"
+ },
+ {
+ "name": "psr/http-message",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-message.git",
+ "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
+ "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Message\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for HTTP messages",
+ "homepage": "https://github.com/php-fig/http-message",
+ "keywords": [
+ "http",
+ "http-message",
+ "psr",
+ "psr-7",
+ "request",
+ "response"
+ ],
+ "time": "2016-08-06T14:39:51+00:00"
+ },
+ {
+ "name": "sebastian/code-unit-reverse-lookup",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
+ "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18",
+ "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.6 || ^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^5.7 || ^6.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Looks up which function or method a line of code belongs to",
+ "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
+ "time": "2017-03-04T06:30:41+00:00"
+ },
+ {
+ "name": "sebastian/comparator",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/comparator.git",
+ "reference": "20f84f468cb67efee293246e6a09619b891f55f0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/20f84f468cb67efee293246e6a09619b891f55f0",
+ "reference": "20f84f468cb67efee293246e6a09619b891f55f0",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0",
+ "sebastian/diff": "^1.2",
+ "sebastian/exporter": "^3.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@2bepublished.at"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides the functionality to compare PHP values for equality",
+ "homepage": "http://www.github.com/sebastianbergmann/comparator",
+ "keywords": [
+ "comparator",
+ "compare",
+ "equality"
+ ],
+ "time": "2017-03-03T06:26:08+00:00"
+ },
+ {
+ "name": "sebastian/diff",
+ "version": "1.4.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/diff.git",
+ "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/13edfd8706462032c2f52b4b862974dd46b71c9e",
+ "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.8"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Kore Nordmann",
+ "email": "mail@kore-nordmann.de"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Diff implementation",
+ "homepage": "https://github.com/sebastianbergmann/diff",
+ "keywords": [
+ "diff"
+ ],
+ "time": "2015-12-08T07:14:41+00:00"
+ },
+ {
+ "name": "sebastian/environment",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/environment.git",
+ "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/5795ffe5dc5b02460c3e34222fee8cbe245d8fac",
+ "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.6 || ^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^5.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides functionality to handle HHVM/PHP environments",
+ "homepage": "http://www.github.com/sebastianbergmann/environment",
+ "keywords": [
+ "Xdebug",
+ "environment",
+ "hhvm"
+ ],
+ "time": "2016-11-26T07:53:53+00:00"
+ },
+ {
+ "name": "sebastian/exporter",
+ "version": "3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/exporter.git",
+ "reference": "b82d077cb3459e393abcf4867ae8f7230dcb51f6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/b82d077cb3459e393abcf4867ae8f7230dcb51f6",
+ "reference": "b82d077cb3459e393abcf4867ae8f7230dcb51f6",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0",
+ "sebastian/recursion-context": "^3.0"
+ },
+ "require-dev": {
+ "ext-mbstring": "*",
+ "phpunit/phpunit": "^6.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@2bepublished.at"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ }
+ ],
+ "description": "Provides the functionality to export PHP variables for visualization",
+ "homepage": "http://www.github.com/sebastianbergmann/exporter",
+ "keywords": [
+ "export",
+ "exporter"
+ ],
+ "time": "2017-03-03T06:25:06+00:00"
+ },
+ {
+ "name": "sebastian/global-state",
+ "version": "1.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/global-state.git",
+ "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4",
+ "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.2"
+ },
+ "suggest": {
+ "ext-uopz": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Snapshotting of global state",
+ "homepage": "http://www.github.com/sebastianbergmann/global-state",
+ "keywords": [
+ "global state"
+ ],
+ "time": "2015-10-12T03:26:01+00:00"
+ },
+ {
+ "name": "sebastian/object-enumerator",
+ "version": "3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/object-enumerator.git",
+ "reference": "de6e32f7192dfea2e4bedc892434f4830b5c5794"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/de6e32f7192dfea2e4bedc892434f4830b5c5794",
+ "reference": "de6e32f7192dfea2e4bedc892434f4830b5c5794",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0",
+ "sebastian/recursion-context": "^3.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Traverses array structures and object graphs to enumerate all referenced objects",
+ "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
+ "time": "2017-03-03T06:21:01+00:00"
+ },
+ {
+ "name": "sebastian/recursion-context",
+ "version": "3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/recursion-context.git",
+ "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8",
+ "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ }
+ ],
+ "description": "Provides functionality to recursively process PHP variables",
+ "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
+ "time": "2017-03-03T06:23:57+00:00"
+ },
+ {
+ "name": "sebastian/resource-operations",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/resource-operations.git",
+ "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52",
+ "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.6.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides a list of PHP built-in functions that operate on resources",
+ "homepage": "https://www.github.com/sebastianbergmann/resource-operations",
+ "time": "2015-07-28T20:34:47+00:00"
+ },
+ {
+ "name": "sebastian/version",
+ "version": "2.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/version.git",
+ "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019",
+ "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.6"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that helps with managing the version number of Git-hosted PHP projects",
+ "homepage": "https://github.com/sebastianbergmann/version",
+ "time": "2016-10-03T07:35:21+00:00"
+ },
+ {
+ "name": "symfony/browser-kit",
+ "version": "v3.2.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/browser-kit.git",
+ "reference": "394a2475a3a89089353fde5714a7f402fbb83880"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/browser-kit/zipball/394a2475a3a89089353fde5714a7f402fbb83880",
+ "reference": "394a2475a3a89089353fde5714a7f402fbb83880",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9",
+ "symfony/dom-crawler": "~2.8|~3.0"
+ },
+ "require-dev": {
+ "symfony/css-selector": "~2.8|~3.0",
+ "symfony/process": "~2.8|~3.0"
+ },
+ "suggest": {
+ "symfony/process": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.2-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\BrowserKit\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony BrowserKit Component",
+ "homepage": "https://symfony.com",
+ "time": "2017-01-31T21:49:23+00:00"
+ },
+ {
+ "name": "symfony/class-loader",
+ "version": "v3.2.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/class-loader.git",
+ "reference": "2847d56f518ad5721bf85aa9174b3aa3fd12aa03"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/class-loader/zipball/2847d56f518ad5721bf85aa9174b3aa3fd12aa03",
+ "reference": "2847d56f518ad5721bf85aa9174b3aa3fd12aa03",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9"
+ },
+ "require-dev": {
+ "symfony/finder": "~2.8|~3.0",
+ "symfony/polyfill-apcu": "~1.1"
+ },
+ "suggest": {
+ "symfony/polyfill-apcu": "For using ApcClassLoader on HHVM"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.2-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\ClassLoader\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony ClassLoader Component",
+ "homepage": "https://symfony.com",
+ "time": "2017-01-21T17:06:35+00:00"
+ },
+ {
+ "name": "symfony/config",
+ "version": "v3.2.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/config.git",
+ "reference": "9f99453e77771e629af8a25eeb0a6c4ed1e19da2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/config/zipball/9f99453e77771e629af8a25eeb0a6c4ed1e19da2",
+ "reference": "9f99453e77771e629af8a25eeb0a6c4ed1e19da2",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9",
+ "symfony/filesystem": "~2.8|~3.0"
+ },
+ "require-dev": {
+ "symfony/yaml": "~3.0"
+ },
+ "suggest": {
+ "symfony/yaml": "To use the yaml reference dumper"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.2-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Config\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Config Component",
+ "homepage": "https://symfony.com",
+ "time": "2017-02-14T16:27:43+00:00"
+ },
+ {
+ "name": "symfony/console",
+ "version": "v3.2.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/console.git",
+ "reference": "0e5e6899f82230fcb1153bcaf0e106ffaa44b870"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/console/zipball/0e5e6899f82230fcb1153bcaf0e106ffaa44b870",
+ "reference": "0e5e6899f82230fcb1153bcaf0e106ffaa44b870",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9",
+ "symfony/debug": "~2.8|~3.0",
+ "symfony/polyfill-mbstring": "~1.0"
+ },
+ "require-dev": {
+ "psr/log": "~1.0",
+ "symfony/event-dispatcher": "~2.8|~3.0",
+ "symfony/filesystem": "~2.8|~3.0",
+ "symfony/process": "~2.8|~3.0"
+ },
+ "suggest": {
+ "psr/log": "For using the console logger",
+ "symfony/event-dispatcher": "",
+ "symfony/filesystem": "",
+ "symfony/process": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.2-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Console\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Console Component",
+ "homepage": "https://symfony.com",
+ "time": "2017-02-16T14:07:22+00:00"
+ },
+ {
+ "name": "symfony/css-selector",
+ "version": "v3.2.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/css-selector.git",
+ "reference": "f0e628f04fc055c934b3211cfabdb1c59eefbfaa"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/css-selector/zipball/f0e628f04fc055c934b3211cfabdb1c59eefbfaa",
+ "reference": "f0e628f04fc055c934b3211cfabdb1c59eefbfaa",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.2-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\CssSelector\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jean-François Simon",
+ "email": "jeanfrancois.simon@sensiolabs.com"
+ },
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony CssSelector Component",
+ "homepage": "https://symfony.com",
+ "time": "2017-01-02T20:32:22+00:00"
+ },
+ {
+ "name": "symfony/debug",
+ "version": "v3.2.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/debug.git",
+ "reference": "9b98854cb45bc59d100b7d4cc4cf9e05f21026b9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/debug/zipball/9b98854cb45bc59d100b7d4cc4cf9e05f21026b9",
+ "reference": "9b98854cb45bc59d100b7d4cc4cf9e05f21026b9",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9",
+ "psr/log": "~1.0"
+ },
+ "conflict": {
+ "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2"
+ },
+ "require-dev": {
+ "symfony/class-loader": "~2.8|~3.0",
+ "symfony/http-kernel": "~2.8|~3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.2-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Debug\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Debug Component",
+ "homepage": "https://symfony.com",
+ "time": "2017-02-16T16:34:18+00:00"
+ },
+ {
+ "name": "symfony/dependency-injection",
+ "version": "v3.2.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/dependency-injection.git",
+ "reference": "130aa55b8ed7e6d0d75b0ed37256cec687a22f41"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/130aa55b8ed7e6d0d75b0ed37256cec687a22f41",
+ "reference": "130aa55b8ed7e6d0d75b0ed37256cec687a22f41",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9"
+ },
+ "conflict": {
+ "symfony/yaml": "<3.2"
+ },
+ "require-dev": {
+ "symfony/config": "~2.8|~3.0",
+ "symfony/expression-language": "~2.8|~3.0",
+ "symfony/yaml": "~3.2"
+ },
+ "suggest": {
+ "symfony/config": "",
+ "symfony/expression-language": "For using expressions in service container configuration",
+ "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them",
+ "symfony/yaml": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.2-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\DependencyInjection\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony DependencyInjection Component",
+ "homepage": "https://symfony.com",
+ "time": "2017-02-16T22:46:52+00:00"
+ },
+ {
+ "name": "symfony/dom-crawler",
+ "version": "v3.2.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/dom-crawler.git",
+ "reference": "b814b41373fc4e535aff8c765abe39545216f391"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/b814b41373fc4e535aff8c765abe39545216f391",
+ "reference": "b814b41373fc4e535aff8c765abe39545216f391",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9",
+ "symfony/polyfill-mbstring": "~1.0"
+ },
+ "require-dev": {
+ "symfony/css-selector": "~2.8|~3.0"
+ },
+ "suggest": {
+ "symfony/css-selector": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.2-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\DomCrawler\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony DomCrawler Component",
+ "homepage": "https://symfony.com",
+ "time": "2017-01-21T17:14:11+00:00"
+ },
+ {
+ "name": "symfony/event-dispatcher",
+ "version": "v3.2.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/event-dispatcher.git",
+ "reference": "9137eb3a3328e413212826d63eeeb0217836e2b6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/9137eb3a3328e413212826d63eeeb0217836e2b6",
+ "reference": "9137eb3a3328e413212826d63eeeb0217836e2b6",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9"
+ },
+ "require-dev": {
+ "psr/log": "~1.0",
+ "symfony/config": "~2.8|~3.0",
+ "symfony/dependency-injection": "~2.8|~3.0",
+ "symfony/expression-language": "~2.8|~3.0",
+ "symfony/stopwatch": "~2.8|~3.0"
+ },
+ "suggest": {
+ "symfony/dependency-injection": "",
+ "symfony/http-kernel": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.2-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\EventDispatcher\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony EventDispatcher Component",
+ "homepage": "https://symfony.com",
+ "time": "2017-01-02T20:32:22+00:00"
+ },
+ {
+ "name": "symfony/filesystem",
+ "version": "v3.2.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/filesystem.git",
+ "reference": "a0c6ef2dc78d33b58d91d3a49f49797a184d06f4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/filesystem/zipball/a0c6ef2dc78d33b58d91d3a49f49797a184d06f4",
+ "reference": "a0c6ef2dc78d33b58d91d3a49f49797a184d06f4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.2-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Filesystem\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Filesystem Component",
+ "homepage": "https://symfony.com",
+ "time": "2017-01-08T20:47:33+00:00"
+ },
+ {
+ "name": "symfony/polyfill-mbstring",
+ "version": "v1.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-mbstring.git",
+ "reference": "e79d363049d1c2128f133a2667e4f4190904f7f4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/e79d363049d1c2128f133a2667e4f4190904f7f4",
+ "reference": "e79d363049d1c2128f133a2667e4f4190904f7f4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "suggest": {
+ "ext-mbstring": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.3-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Mbstring\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for the Mbstring extension",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "mbstring",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "time": "2016-11-14T01:06:16+00:00"
+ },
+ {
+ "name": "symfony/translation",
+ "version": "v3.2.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/translation.git",
+ "reference": "d6825c6bb2f1da13f564678f9f236fe8242c0029"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/translation/zipball/d6825c6bb2f1da13f564678f9f236fe8242c0029",
+ "reference": "d6825c6bb2f1da13f564678f9f236fe8242c0029",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9",
+ "symfony/polyfill-mbstring": "~1.0"
+ },
+ "conflict": {
+ "symfony/config": "<2.8"
+ },
+ "require-dev": {
+ "psr/log": "~1.0",
+ "symfony/config": "~2.8|~3.0",
+ "symfony/intl": "~2.8|~3.0",
+ "symfony/yaml": "~2.8|~3.0"
+ },
+ "suggest": {
+ "psr/log": "To use logging capability in translator",
+ "symfony/config": "",
+ "symfony/yaml": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.2-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Translation\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Translation Component",
+ "homepage": "https://symfony.com",
+ "time": "2017-02-16T22:46:52+00:00"
+ },
+ {
+ "name": "symfony/yaml",
+ "version": "v3.2.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/yaml.git",
+ "reference": "9724c684646fcb5387d579b4bfaa63ee0b0c64c8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/yaml/zipball/9724c684646fcb5387d579b4bfaa63ee0b0c64c8",
+ "reference": "9724c684646fcb5387d579b4bfaa63ee0b0c64c8",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9"
+ },
+ "require-dev": {
+ "symfony/console": "~2.8|~3.0"
+ },
+ "suggest": {
+ "symfony/console": "For validating YAML files using the lint command"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.2-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Yaml\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Yaml Component",
+ "homepage": "https://symfony.com",
+ "time": "2017-02-16T22:46:52+00:00"
+ },
+ {
+ "name": "webmozart/assert",
+ "version": "1.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/webmozart/assert.git",
+ "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/webmozart/assert/zipball/2db61e59ff05fe5126d152bd0655c9ea113e550f",
+ "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.3.3 || ^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.6",
+ "sebastian/version": "^1.0.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.3-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Webmozart\\Assert\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
+ }
+ ],
+ "description": "Assertions to validate method input/output with nice error messages.",
+ "keywords": [
+ "assert",
+ "check",
+ "validate"
+ ],
+ "time": "2016-11-23T20:04:58+00:00"
+ }
+ ],
+ "aliases": [],
+ "minimum-stability": "stable",
+ "stability-flags": {
+ "behat/behat": 0,
+ "behat/mink-extension": 0,
+ "behat/mink-goutte-driver": 0
+ },
+ "prefer-stable": false,
+ "prefer-lowest": false,
+ "platform": {
+ "php": ">=5.5",
+ "ext-curl": "*",
+ "ext-gd": "*",
+ "ext-mbstring": "*",
+ "ext-xml": "*",
+ "ext-openssl": "*"
+ },
+ "platform-dev": {
+ "php": ">=7.0"
+ }
+}
diff --git a/doc/Widgets.md b/doc/Widgets.md
index 8442bf687..4ad899a0f 100644
--- a/doc/Widgets.md
+++ b/doc/Widgets.md
@@ -117,6 +117,7 @@ Some/many of these widgets have restrictions which may restrict the type of page
* forums - provide a list of connected public forums with unseen counts for the current logged-in channel.
<br />&nbsp;<br />
+* activity - provide a list of authors of unread network content for the current logged-in channel.
* album - provides a widget containing a complete photo album from albums belonging to the page owner; this may be too large to present in a sidebar region as is best implemented as a content region widget.
* args:
diff --git a/doc/about/hubzilla_project.bb b/doc/about/hubzilla_project.bb
index 7a584687d..f9bc920f8 100644
--- a/doc/about/hubzilla_project.bb
+++ b/doc/about/hubzilla_project.bb
@@ -182,4 +182,5 @@ even if we have had our occasional disagreements.
[li]Simó Albert i Beltran[/li]
[li]Manuel Reva[/li]
[li]Manuel Jiménez Friaza[/li]
-[/list] \ No newline at end of file
+[li]Gustav Wall aka "neue medienordnung plus"[/li]
+[/list]
diff --git a/doc/database/db_account.bb b/doc/database/db_account.bb
index 354f2d3a8..35d7a9eb3 100644
--- a/doc/database/db_account.bb
+++ b/doc/database/db_account.bb
@@ -58,7 +58,6 @@ define ( 'ACCOUNT_PENDING', 0x0010 );
* Account roles
*/
-define ( 'ACCOUNT_ROLE_ALLOWCODE', 0x0001 ); // 1 - this account can create content with PHP/Javascript
define ( 'ACCOUNT_ROLE_SYSTEM', 0x0002 ); // 2 - this is the special system account
define ( 'ACCOUNT_ROLE_DEVELOPER', 0x0004 );
define ( 'ACCOUNT_ROLE_ADMIN', 0x1000 ); // 4096 - this account is an administrator
diff --git a/doc/dev-function-overview.md b/doc/dev-function-overview.md
index fa8a98ff3..cd2526ead 100644
--- a/doc/dev-function-overview.md
+++ b/doc/dev-function-overview.md
@@ -15,10 +15,6 @@ Returns authenticated numeric channel_id if authenticated and connected to a cha
Returns authenticated string hash of Red global identifier, if authenticated via remote auth, or an empty string.
-* get_app()
-
-Returns the global app structure ($a). No longer used as App is a static class
-
* App::get_observer()
returns an xchan structure representing the current viewer if authenticated (locally or remotely).
diff --git a/doc/developer/api_zot.bb b/doc/developer/api_zot.bb
index 1314f90b5..ddca65b4d 100644
--- a/doc/developer/api_zot.bb
+++ b/doc/developer/api_zot.bb
@@ -28,7 +28,7 @@ GET /api/z/1.0/files
Options:
- - hash
+ - filehash
return only entries matching hash (exactly)
- filename
diff --git a/doc/hook/author_is_pmable.bb b/doc/hook/author_is_pmable.bb
new file mode 100644
index 000000000..708350673
--- /dev/null
+++ b/doc/hook/author_is_pmable.bb
@@ -0,0 +1,14 @@
+[h2]author_is_pmable[/h2]
+
+Called from thread action menu before returning a 'send mail' link for the post author. Not all authors will be able to receive private mail, for instance those on other networks with incompatible mail systems.
+
+By default author_is_pmable() returns true for 'zot' xchans, and false for all others.
+
+The plugin is passed an array
+
+ [ 'xchan' => $author_xchan, 'result' => 'unset' ]
+
+A plugin which sets the 'result' to something besides 'unset' will over-ride the default behaviour. A value of true will enable the 'send mail' link and the private mail recipient will be set to the author's xchan_hash. A value of false will disable the 'send mail' link.
+
+
+
diff --git a/doc/hook/probe_well_known.bb b/doc/hook/probe_well_known.bb
deleted file mode 100644
index 62898c536..000000000
--- a/doc/hook/probe_well_known.bb
+++ /dev/null
@@ -1,3 +0,0 @@
-[h2]probe_well_known[/h2]
-
-This hook is under construction and not currently used - see include/probe.php \ No newline at end of file
diff --git a/doc/hooklist.bb b/doc/hooklist.bb
index fcd0e2aff..6933edad2 100644
--- a/doc/hooklist.bb
+++ b/doc/hooklist.bb
@@ -28,7 +28,7 @@ Hooks allow plugins/addons to "hook into" the code at many points and alter the
[zrl=[baseurl]/help/hook/account_settings]account_settings[/zrl]
Called when generating the account settings form
-[zrl=[baseurl]/help/hook/settings_account]account_settings_post[/zrl]
+[zrl=[baseurl]/help/hook/account_settings_post]account_settings_post[/zrl]
Called when posting from the account settings form
[zrl=[baseurl]/help/hook/activity_received]activity_received[/zrl]
@@ -64,6 +64,9 @@ Hooks allow plugins/addons to "hook into" the code at many points and alter the
[zrl=[baseurl]/help/hook/authenticate]authenticate[/zrl]
Can provide alternate authentication mechanisms
+[zrl=[baseurl]/help/hook/author_is_pmable]author_is_pmable[/zrl]
+ Called from the thread action menu to determine if we can send private mail to the post author
+
[zrl=[baseurl]/help/hook/bb2diaspora]bb2diaspora[/zrl]
called when converting bbcode to markdown
@@ -491,9 +494,6 @@ Hooks allow plugins/addons to "hook into" the code at many points and alter the
[zrl=[baseurl]/help/hook/prepare_body_init]prepare_body_init[/zrl]
Called before generating the HTML for a displayed conversation item
-[zrl=[baseurl]/help/hook/probe_well_known]probe_well_known[/zrl]
- under construction
-
[zrl=[baseurl]/help/hook/proc_run]proc_run[/zrl]
Called when invoking PHP sub processes
diff --git a/doc/member/member_guide.bb b/doc/member/member_guide.bb
index 2edaa321b..50f0b581b 100644
--- a/doc/member/member_guide.bb
+++ b/doc/member/member_guide.bb
@@ -836,7 +836,7 @@ WebDAV using Windows 7 graphical user interface wizard:
1. Left-click the Start-button to open the start menu.
2. Right-click the My computer icon to access its menu.
3. Left-click Map network drive... to open the connection dialog wizard.
-4. Type #^[url=https://example.net/dav/your_channel_name]https://example.net/dav/your_channel_name[/url] in the textbox and click the Complete button where &quot;example.net&quot; is the URL of your hub.
+4. Type '[baseurl]/dav/nickname' in the textbox (replace nickname with your channel nickname) and click the Complete button.
5. Type your $Projectname channel nickname. IMPORTANT - NO at-sign or domain name.
6. Type your $Projectname password
diff --git a/doc/toc.html b/doc/toc.html
index 3c9c5c299..11635930e 100644
--- a/doc/toc.html
+++ b/doc/toc.html
@@ -1,30 +1,30 @@
<div class="" id="accordion">
- <div class="panel">
+ <div class="">
<div class="">
<h3 class="panel-title">
About
</h3>
</div>
- <div id="about" class="panel-collapse collapse in">
- <ul class="list-group">
- <li class="doco-list-group-item"><a href="/help/about/about_hubzilla">About Hubzilla</a></li>
- <li class="doco-list-group-item"><a href="/help/about/hubzilla_project">Hubzilla project</a></li>
- <li class="doco-list-group-item"><a href="/help/about/about_hub">About this hub</a></li>
- </ul>
+ <div id="about" class="doco-section">
+ <div class="flex-column">
+ <a class="nav-link" href="/help/about/about_hubzilla">About Hubzilla</a>
+ <a class="nav-link" href="/help/about/hubzilla_project">Hubzilla project</a>
+ <a class="nav-link" href="/help/about/about_hub">About this hub</a>
+ </div>
</div>
</div>
- <div class="panel">
+ <div class="">
<div class="">
<h3 class="panel-title">
Members
</h3>
</div>
- <div id="members" class="panel-collapse collapse in">
- <ul class="list-group">
- <li class="doco-list-group-item"><a href="/help/member/member_guide">Guide</a></li>
- <li class="doco-list-group-item"><a href="/help/member/bbcode">BBcode Reference</a></li>
- <li class="doco-list-group-item"><a href="/help/member/member_faq">FAQ</a></li>
- </ul>
+ <div id="members" class="doco-section">
+ <div class="flex-column">
+ <a class="nav-link" href="/help/member/member_guide">Guide</a>
+ <a class="nav-link" href="/help/member/bbcode">BBcode Reference</a>
+ <a class="nav-link" href="/help/member/member_faq">FAQ</a>
+ </div>
</div>
</div>
<div class="panel">
@@ -33,12 +33,12 @@
Administrators
</h3>
</div>
- <div id="administrators" class="panel-collapse collapse in">
- <ul class="list-group">
- <li class="doco-list-group-item"><a href="/help/admin/administrator_guide">Guide</a></li>
- <li class="doco-list-group-item"><a href="/help/admin/hub_snapshots">Hub Snapshots</a></li>
- <li class="doco-list-group-item"><a href="/help/database">Database Tables</a></li>
- </ul>
+ <div id="administrators" class="doco-section">
+ <div class="flex-column">
+ <a class="nav-link" href="/help/admin/administrator_guide">Guide</a>
+ <a class="nav-link" href="/help/admin/hub_snapshots">Hub Snapshots</a>
+ <a class="nav-link" href="/help/database">Database Tables</a>
+ </div>
</div>
</div>
<div class="panel">
@@ -47,14 +47,14 @@
Developers
</h3>
</div>
- <div id="developers" class="panel-collapse collapse in">
- <ul class="list-group">
- <li class="doco-list-group-item"><a href="/help/developer/developer_guide">Guide</a></li>
- <li class="doco-list-group-item"><a href="/help/developer/covenant">Code of Conduct</a></li>
- <li class="doco-list-group-item"><a href="/help/developer/zot_protocol">Zot Protocol</a></li>
- <li class="doco-list-group-item"><a href="/help/developer/api_zot">Zot API</a></li>
- <li class="doco-list-group-item"><a href="/help/hooklist">Hooks</a></li>
- </ul>
+ <div id="developers" class="doco-section">
+ <div class="flex-column">
+ <a class="nav-link" href="/help/developer/developer_guide">Guide</a>
+ <a class="nav-link" href="/help/developer/covenant">Code of Conduct</a>
+ <a class="nav-link" href="/help/developer/zot_protocol">Zot Protocol</a>
+ <a class="nav-link" href="/help/developer/api_zot">Zot API</a>
+ <a class="nav-link" href="/help/hooklist">Hooks</a>
+ </div>
</div>
</div>
<div class="panel">
@@ -63,10 +63,10 @@
Tutorials
</h3>
</div>
- <div id="tutorials" class="panel-collapse collapse in">
- <ul class="list-group">
- <li class="doco-list-group-item"><a href="/help/tutorials/personal_channel">Personal Channel</a></li>
- </ul>
+ <div id="tutorials" class="doco-section">
+ <div class="flex-column">
+ <a class="nav-link" href="/help/tutorials/personal_channel">Personal Channel</a>
+ </div>
</div>
</div>
</div>
@@ -74,16 +74,16 @@
toc = {};
// Generate the table of contents in the side nav menu (see view/tpl/help.tpl)
$(document).ready(function () {
- $(".panel-collapse.in").find('a').each(function(){
+ $(".doco-section").find('a').each(function(){
var url = document.createElement('a');
url.href = window.location;
var pageName = url.href.split('/').pop().split('#').shift().split('?').shift();
var linkName = $(this).attr('href').split('/').pop();
if(pageName === linkName) {
- var tocUl = $(this).closest('li').append('<ul>').find('ul');
+ var tocUl = $(this).closest('a').append('<ul>').find('ul');
tocUl.removeClass(); // Classes are automatically added to <ul> elements by something else
tocUl.toc({content: "#doco-content", headings: "h3"});
- tocUl.addClass('toc-content sub-menu');
+ tocUl.addClass('toc-content');
tocUl.attr('id', 'doco-side-toc');
}
diff --git a/images/emoji/0023-20e3.png b/images/emoji/0023-20e3.png
deleted file mode 100644
index 6e26f0070..000000000
--- a/images/emoji/0023-20e3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/0023.png b/images/emoji/0023.png
deleted file mode 100644
index 811f22af8..000000000
--- a/images/emoji/0023.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/002a-20e3.png b/images/emoji/002a-20e3.png
deleted file mode 100644
index 2f8e51138..000000000
--- a/images/emoji/002a-20e3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/002a.png b/images/emoji/002a.png
deleted file mode 100644
index c39443e24..000000000
--- a/images/emoji/002a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/0030-20e3.png b/images/emoji/0030-20e3.png
deleted file mode 100644
index 13aca83e0..000000000
--- a/images/emoji/0030-20e3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/0030.png b/images/emoji/0030.png
deleted file mode 100644
index e730b28df..000000000
--- a/images/emoji/0030.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/0031-20e3.png b/images/emoji/0031-20e3.png
deleted file mode 100644
index e6d84b801..000000000
--- a/images/emoji/0031-20e3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/0031.png b/images/emoji/0031.png
deleted file mode 100644
index 9c4cbd6f7..000000000
--- a/images/emoji/0031.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/0032-20e3.png b/images/emoji/0032-20e3.png
deleted file mode 100644
index 927339c9b..000000000
--- a/images/emoji/0032-20e3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/0032.png b/images/emoji/0032.png
deleted file mode 100644
index 9a0b49a0e..000000000
--- a/images/emoji/0032.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/0033-20e3.png b/images/emoji/0033-20e3.png
deleted file mode 100644
index dbaa6183e..000000000
--- a/images/emoji/0033-20e3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/0033.png b/images/emoji/0033.png
deleted file mode 100644
index bc898b986..000000000
--- a/images/emoji/0033.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/0034-20e3.png b/images/emoji/0034-20e3.png
deleted file mode 100644
index b0e914aac..000000000
--- a/images/emoji/0034-20e3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/0034.png b/images/emoji/0034.png
deleted file mode 100644
index 7216ee32b..000000000
--- a/images/emoji/0034.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/0035-20e3.png b/images/emoji/0035-20e3.png
deleted file mode 100644
index d14371f3f..000000000
--- a/images/emoji/0035-20e3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/0035.png b/images/emoji/0035.png
deleted file mode 100644
index c64709a7e..000000000
--- a/images/emoji/0035.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/0036-20e3.png b/images/emoji/0036-20e3.png
deleted file mode 100644
index 371b3acef..000000000
--- a/images/emoji/0036-20e3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/0036.png b/images/emoji/0036.png
deleted file mode 100644
index 68e1e71e4..000000000
--- a/images/emoji/0036.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/0037-20e3.png b/images/emoji/0037-20e3.png
deleted file mode 100644
index 9b3476ae7..000000000
--- a/images/emoji/0037-20e3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/0037.png b/images/emoji/0037.png
deleted file mode 100644
index e4aa065c6..000000000
--- a/images/emoji/0037.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/0038-20e3.png b/images/emoji/0038-20e3.png
deleted file mode 100644
index 8c95874d4..000000000
--- a/images/emoji/0038-20e3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/0038.png b/images/emoji/0038.png
deleted file mode 100644
index 27eae28e6..000000000
--- a/images/emoji/0038.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/0039-20e3.png b/images/emoji/0039-20e3.png
deleted file mode 100644
index 9fce3d1ec..000000000
--- a/images/emoji/0039-20e3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/0039.png b/images/emoji/0039.png
deleted file mode 100644
index fd9e98055..000000000
--- a/images/emoji/0039.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/00a9.png b/images/emoji/00a9.png
deleted file mode 100644
index 6b9a6adbf..000000000
--- a/images/emoji/00a9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/00ae.png b/images/emoji/00ae.png
deleted file mode 100644
index 53ef9f2d4..000000000
--- a/images/emoji/00ae.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f004.png b/images/emoji/1f004.png
deleted file mode 100644
index 66fd32025..000000000
--- a/images/emoji/1f004.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f0cf.png b/images/emoji/1f0cf.png
deleted file mode 100644
index 3d0924b68..000000000
--- a/images/emoji/1f0cf.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f170.png b/images/emoji/1f170.png
deleted file mode 100644
index 8603ff05a..000000000
--- a/images/emoji/1f170.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f171.png b/images/emoji/1f171.png
deleted file mode 100644
index 25875bc6a..000000000
--- a/images/emoji/1f171.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f17e.png b/images/emoji/1f17e.png
deleted file mode 100644
index 73278ba19..000000000
--- a/images/emoji/1f17e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f17f.png b/images/emoji/1f17f.png
deleted file mode 100644
index 7be7dac27..000000000
--- a/images/emoji/1f17f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f18e.png b/images/emoji/1f18e.png
deleted file mode 100644
index d9f2d17de..000000000
--- a/images/emoji/1f18e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f191.png b/images/emoji/1f191.png
deleted file mode 100644
index 8b01b4343..000000000
--- a/images/emoji/1f191.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f192.png b/images/emoji/1f192.png
deleted file mode 100644
index 74674978d..000000000
--- a/images/emoji/1f192.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f193.png b/images/emoji/1f193.png
deleted file mode 100644
index b71956eb4..000000000
--- a/images/emoji/1f193.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f194.png b/images/emoji/1f194.png
deleted file mode 100644
index 5bf69bf7b..000000000
--- a/images/emoji/1f194.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f195.png b/images/emoji/1f195.png
deleted file mode 100644
index b4f85488d..000000000
--- a/images/emoji/1f195.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f196.png b/images/emoji/1f196.png
deleted file mode 100644
index ee8d20f5e..000000000
--- a/images/emoji/1f196.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f197.png b/images/emoji/1f197.png
deleted file mode 100644
index d0d775532..000000000
--- a/images/emoji/1f197.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f198.png b/images/emoji/1f198.png
deleted file mode 100644
index d7d8c9953..000000000
--- a/images/emoji/1f198.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f199.png b/images/emoji/1f199.png
deleted file mode 100644
index 0d42142ba..000000000
--- a/images/emoji/1f199.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f19a.png b/images/emoji/1f19a.png
deleted file mode 100644
index e1180f4a4..000000000
--- a/images/emoji/1f19a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e6-1f1e8.png b/images/emoji/1f1e6-1f1e8.png
deleted file mode 100644
index b939efeab..000000000
--- a/images/emoji/1f1e6-1f1e8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e6-1f1e9.png b/images/emoji/1f1e6-1f1e9.png
deleted file mode 100644
index 20f4b14e8..000000000
--- a/images/emoji/1f1e6-1f1e9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e6-1f1ea.png b/images/emoji/1f1e6-1f1ea.png
deleted file mode 100644
index d16ffe4b8..000000000
--- a/images/emoji/1f1e6-1f1ea.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e6-1f1eb.png b/images/emoji/1f1e6-1f1eb.png
deleted file mode 100644
index a51533b55..000000000
--- a/images/emoji/1f1e6-1f1eb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e6-1f1ec.png b/images/emoji/1f1e6-1f1ec.png
deleted file mode 100644
index 07f2ce397..000000000
--- a/images/emoji/1f1e6-1f1ec.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e6-1f1ee.png b/images/emoji/1f1e6-1f1ee.png
deleted file mode 100644
index 500b5ab09..000000000
--- a/images/emoji/1f1e6-1f1ee.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e6-1f1f1.png b/images/emoji/1f1e6-1f1f1.png
deleted file mode 100644
index 03a20132c..000000000
--- a/images/emoji/1f1e6-1f1f1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e6-1f1f2.png b/images/emoji/1f1e6-1f1f2.png
deleted file mode 100644
index 2ad60a273..000000000
--- a/images/emoji/1f1e6-1f1f2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e6-1f1f4.png b/images/emoji/1f1e6-1f1f4.png
deleted file mode 100644
index cb46c31f8..000000000
--- a/images/emoji/1f1e6-1f1f4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e6-1f1f6.png b/images/emoji/1f1e6-1f1f6.png
deleted file mode 100644
index b272021d3..000000000
--- a/images/emoji/1f1e6-1f1f6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e6-1f1f7.png b/images/emoji/1f1e6-1f1f7.png
deleted file mode 100644
index 73136caf3..000000000
--- a/images/emoji/1f1e6-1f1f7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e6-1f1f8.png b/images/emoji/1f1e6-1f1f8.png
deleted file mode 100644
index 3db45a0d9..000000000
--- a/images/emoji/1f1e6-1f1f8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e6-1f1f9.png b/images/emoji/1f1e6-1f1f9.png
deleted file mode 100644
index c43769dcb..000000000
--- a/images/emoji/1f1e6-1f1f9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e6-1f1fa.png b/images/emoji/1f1e6-1f1fa.png
deleted file mode 100644
index 7794309c7..000000000
--- a/images/emoji/1f1e6-1f1fa.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e6-1f1fc.png b/images/emoji/1f1e6-1f1fc.png
deleted file mode 100644
index 02c840d12..000000000
--- a/images/emoji/1f1e6-1f1fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e6-1f1fd.png b/images/emoji/1f1e6-1f1fd.png
deleted file mode 100644
index fc5466174..000000000
--- a/images/emoji/1f1e6-1f1fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e6-1f1ff.png b/images/emoji/1f1e6-1f1ff.png
deleted file mode 100644
index 89d3d15fd..000000000
--- a/images/emoji/1f1e6-1f1ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e7-1f1e6.png b/images/emoji/1f1e7-1f1e6.png
deleted file mode 100644
index 25fe407e1..000000000
--- a/images/emoji/1f1e7-1f1e6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e7-1f1e7.png b/images/emoji/1f1e7-1f1e7.png
deleted file mode 100644
index bccd8c5c9..000000000
--- a/images/emoji/1f1e7-1f1e7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e7-1f1e9.png b/images/emoji/1f1e7-1f1e9.png
deleted file mode 100644
index b0597a314..000000000
--- a/images/emoji/1f1e7-1f1e9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e7-1f1ea.png b/images/emoji/1f1e7-1f1ea.png
deleted file mode 100644
index 551f086e3..000000000
--- a/images/emoji/1f1e7-1f1ea.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e7-1f1eb.png b/images/emoji/1f1e7-1f1eb.png
deleted file mode 100644
index 444d4829f..000000000
--- a/images/emoji/1f1e7-1f1eb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e7-1f1ec.png b/images/emoji/1f1e7-1f1ec.png
deleted file mode 100644
index 821eee5e1..000000000
--- a/images/emoji/1f1e7-1f1ec.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e7-1f1ed.png b/images/emoji/1f1e7-1f1ed.png
deleted file mode 100644
index f33724249..000000000
--- a/images/emoji/1f1e7-1f1ed.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e7-1f1ee.png b/images/emoji/1f1e7-1f1ee.png
deleted file mode 100644
index ea20ac932..000000000
--- a/images/emoji/1f1e7-1f1ee.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e7-1f1ef.png b/images/emoji/1f1e7-1f1ef.png
deleted file mode 100644
index 7cca4f804..000000000
--- a/images/emoji/1f1e7-1f1ef.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e7-1f1f1.png b/images/emoji/1f1e7-1f1f1.png
deleted file mode 100644
index 0316ac99d..000000000
--- a/images/emoji/1f1e7-1f1f1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e7-1f1f2.png b/images/emoji/1f1e7-1f1f2.png
deleted file mode 100644
index ab8cafdac..000000000
--- a/images/emoji/1f1e7-1f1f2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e7-1f1f3.png b/images/emoji/1f1e7-1f1f3.png
deleted file mode 100644
index 16a58f8f6..000000000
--- a/images/emoji/1f1e7-1f1f3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e7-1f1f4.png b/images/emoji/1f1e7-1f1f4.png
deleted file mode 100644
index 98af62b3d..000000000
--- a/images/emoji/1f1e7-1f1f4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e7-1f1f6.png b/images/emoji/1f1e7-1f1f6.png
deleted file mode 100644
index cb978ef9d..000000000
--- a/images/emoji/1f1e7-1f1f6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e7-1f1f7.png b/images/emoji/1f1e7-1f1f7.png
deleted file mode 100644
index b139366a4..000000000
--- a/images/emoji/1f1e7-1f1f7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e7-1f1f8.png b/images/emoji/1f1e7-1f1f8.png
deleted file mode 100644
index d36bcd2fb..000000000
--- a/images/emoji/1f1e7-1f1f8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e7-1f1f9.png b/images/emoji/1f1e7-1f1f9.png
deleted file mode 100644
index b571dce1a..000000000
--- a/images/emoji/1f1e7-1f1f9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e7-1f1fb.png b/images/emoji/1f1e7-1f1fb.png
deleted file mode 100644
index 5884e6482..000000000
--- a/images/emoji/1f1e7-1f1fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e7-1f1fc.png b/images/emoji/1f1e7-1f1fc.png
deleted file mode 100644
index cb12f3473..000000000
--- a/images/emoji/1f1e7-1f1fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e7-1f1fe.png b/images/emoji/1f1e7-1f1fe.png
deleted file mode 100644
index 859c05beb..000000000
--- a/images/emoji/1f1e7-1f1fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e7-1f1ff.png b/images/emoji/1f1e7-1f1ff.png
deleted file mode 100644
index db2c28bd7..000000000
--- a/images/emoji/1f1e7-1f1ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e7.png b/images/emoji/1f1e7.png
deleted file mode 100644
index 8f69fa973..000000000
--- a/images/emoji/1f1e7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e8-1f1e6.png b/images/emoji/1f1e8-1f1e6.png
deleted file mode 100644
index 7c5b390e8..000000000
--- a/images/emoji/1f1e8-1f1e6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e8-1f1e8.png b/images/emoji/1f1e8-1f1e8.png
deleted file mode 100644
index b6555a23d..000000000
--- a/images/emoji/1f1e8-1f1e8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e8-1f1e9.png b/images/emoji/1f1e8-1f1e9.png
deleted file mode 100644
index fa9200977..000000000
--- a/images/emoji/1f1e8-1f1e9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e8-1f1eb.png b/images/emoji/1f1e8-1f1eb.png
deleted file mode 100644
index b969ae29e..000000000
--- a/images/emoji/1f1e8-1f1eb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e8-1f1ec.png b/images/emoji/1f1e8-1f1ec.png
deleted file mode 100644
index 3a38a40a9..000000000
--- a/images/emoji/1f1e8-1f1ec.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e8-1f1ed.png b/images/emoji/1f1e8-1f1ed.png
deleted file mode 100644
index 5ff86b8a3..000000000
--- a/images/emoji/1f1e8-1f1ed.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e8-1f1ee.png b/images/emoji/1f1e8-1f1ee.png
deleted file mode 100644
index e3b4d15c7..000000000
--- a/images/emoji/1f1e8-1f1ee.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e8-1f1f0.png b/images/emoji/1f1e8-1f1f0.png
deleted file mode 100644
index b6b53dbc1..000000000
--- a/images/emoji/1f1e8-1f1f0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e8-1f1f1.png b/images/emoji/1f1e8-1f1f1.png
deleted file mode 100644
index c9390da54..000000000
--- a/images/emoji/1f1e8-1f1f1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e8-1f1f2.png b/images/emoji/1f1e8-1f1f2.png
deleted file mode 100644
index 2d3f6ec45..000000000
--- a/images/emoji/1f1e8-1f1f2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e8-1f1f3.png b/images/emoji/1f1e8-1f1f3.png
deleted file mode 100644
index 0a7f350a6..000000000
--- a/images/emoji/1f1e8-1f1f3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e8-1f1f4.png b/images/emoji/1f1e8-1f1f4.png
deleted file mode 100644
index 7e0f5e0dc..000000000
--- a/images/emoji/1f1e8-1f1f4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e8-1f1f5.png b/images/emoji/1f1e8-1f1f5.png
deleted file mode 100644
index 70c761036..000000000
--- a/images/emoji/1f1e8-1f1f5.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e8-1f1f7.png b/images/emoji/1f1e8-1f1f7.png
deleted file mode 100644
index a5fce1265..000000000
--- a/images/emoji/1f1e8-1f1f7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e8-1f1fa.png b/images/emoji/1f1e8-1f1fa.png
deleted file mode 100644
index 447328f7d..000000000
--- a/images/emoji/1f1e8-1f1fa.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e8-1f1fb.png b/images/emoji/1f1e8-1f1fb.png
deleted file mode 100644
index 43faf4d64..000000000
--- a/images/emoji/1f1e8-1f1fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e8-1f1fc.png b/images/emoji/1f1e8-1f1fc.png
deleted file mode 100644
index eb39e8d00..000000000
--- a/images/emoji/1f1e8-1f1fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e8-1f1fd.png b/images/emoji/1f1e8-1f1fd.png
deleted file mode 100644
index 09d21359f..000000000
--- a/images/emoji/1f1e8-1f1fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e8-1f1fe.png b/images/emoji/1f1e8-1f1fe.png
deleted file mode 100644
index 154a7aa31..000000000
--- a/images/emoji/1f1e8-1f1fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e8-1f1ff.png b/images/emoji/1f1e8-1f1ff.png
deleted file mode 100644
index 9737ca223..000000000
--- a/images/emoji/1f1e8-1f1ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e8.png b/images/emoji/1f1e8.png
deleted file mode 100644
index f94e668a2..000000000
--- a/images/emoji/1f1e8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e9-1f1ea.png b/images/emoji/1f1e9-1f1ea.png
deleted file mode 100644
index 98ed76b3b..000000000
--- a/images/emoji/1f1e9-1f1ea.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e9-1f1ec.png b/images/emoji/1f1e9-1f1ec.png
deleted file mode 100644
index fb6cc3cd4..000000000
--- a/images/emoji/1f1e9-1f1ec.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e9-1f1ef.png b/images/emoji/1f1e9-1f1ef.png
deleted file mode 100644
index 73c2a2acb..000000000
--- a/images/emoji/1f1e9-1f1ef.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e9-1f1f0.png b/images/emoji/1f1e9-1f1f0.png
deleted file mode 100644
index e5a60b062..000000000
--- a/images/emoji/1f1e9-1f1f0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e9-1f1f2.png b/images/emoji/1f1e9-1f1f2.png
deleted file mode 100644
index 4d4cf6444..000000000
--- a/images/emoji/1f1e9-1f1f2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e9-1f1f4.png b/images/emoji/1f1e9-1f1f4.png
deleted file mode 100644
index 037a45d7c..000000000
--- a/images/emoji/1f1e9-1f1f4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e9-1f1ff.png b/images/emoji/1f1e9-1f1ff.png
deleted file mode 100644
index 24945b10f..000000000
--- a/images/emoji/1f1e9-1f1ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e9.png b/images/emoji/1f1e9.png
deleted file mode 100644
index 4a36666e5..000000000
--- a/images/emoji/1f1e9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ea-1f1e6.png b/images/emoji/1f1ea-1f1e6.png
deleted file mode 100644
index 9d05e1b0d..000000000
--- a/images/emoji/1f1ea-1f1e6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ea-1f1e8.png b/images/emoji/1f1ea-1f1e8.png
deleted file mode 100644
index 138145946..000000000
--- a/images/emoji/1f1ea-1f1e8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ea-1f1ea.png b/images/emoji/1f1ea-1f1ea.png
deleted file mode 100644
index 84f317e77..000000000
--- a/images/emoji/1f1ea-1f1ea.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ea-1f1ec.png b/images/emoji/1f1ea-1f1ec.png
deleted file mode 100644
index 57786064a..000000000
--- a/images/emoji/1f1ea-1f1ec.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ea-1f1ed.png b/images/emoji/1f1ea-1f1ed.png
deleted file mode 100644
index 4d7a76687..000000000
--- a/images/emoji/1f1ea-1f1ed.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ea-1f1f7.png b/images/emoji/1f1ea-1f1f7.png
deleted file mode 100644
index 0c3c724c1..000000000
--- a/images/emoji/1f1ea-1f1f7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ea-1f1f8.png b/images/emoji/1f1ea-1f1f8.png
deleted file mode 100644
index c37fdfe5c..000000000
--- a/images/emoji/1f1ea-1f1f8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ea-1f1f9.png b/images/emoji/1f1ea-1f1f9.png
deleted file mode 100644
index 9560a134c..000000000
--- a/images/emoji/1f1ea-1f1f9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ea-1f1fa.png b/images/emoji/1f1ea-1f1fa.png
deleted file mode 100644
index 0b456cf33..000000000
--- a/images/emoji/1f1ea-1f1fa.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ea.png b/images/emoji/1f1ea.png
deleted file mode 100644
index 66f7e8d8c..000000000
--- a/images/emoji/1f1ea.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1eb-1f1ee.png b/images/emoji/1f1eb-1f1ee.png
deleted file mode 100644
index ebcf58abf..000000000
--- a/images/emoji/1f1eb-1f1ee.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1eb-1f1ef.png b/images/emoji/1f1eb-1f1ef.png
deleted file mode 100644
index 9cc8c37fe..000000000
--- a/images/emoji/1f1eb-1f1ef.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1eb-1f1f0.png b/images/emoji/1f1eb-1f1f0.png
deleted file mode 100644
index 61372fd25..000000000
--- a/images/emoji/1f1eb-1f1f0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1eb-1f1f2.png b/images/emoji/1f1eb-1f1f2.png
deleted file mode 100644
index 0889825c8..000000000
--- a/images/emoji/1f1eb-1f1f2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1eb-1f1f4.png b/images/emoji/1f1eb-1f1f4.png
deleted file mode 100644
index 9a4431b08..000000000
--- a/images/emoji/1f1eb-1f1f4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1eb-1f1f7.png b/images/emoji/1f1eb-1f1f7.png
deleted file mode 100644
index 62ca19c3f..000000000
--- a/images/emoji/1f1eb-1f1f7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1eb.png b/images/emoji/1f1eb.png
deleted file mode 100644
index 913b230fd..000000000
--- a/images/emoji/1f1eb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ec-1f1e6.png b/images/emoji/1f1ec-1f1e6.png
deleted file mode 100644
index 2e68e527a..000000000
--- a/images/emoji/1f1ec-1f1e6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ec-1f1e7.png b/images/emoji/1f1ec-1f1e7.png
deleted file mode 100644
index 3ed10f623..000000000
--- a/images/emoji/1f1ec-1f1e7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ec-1f1e9.png b/images/emoji/1f1ec-1f1e9.png
deleted file mode 100644
index 527aad338..000000000
--- a/images/emoji/1f1ec-1f1e9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ec-1f1ea.png b/images/emoji/1f1ec-1f1ea.png
deleted file mode 100644
index a75d14248..000000000
--- a/images/emoji/1f1ec-1f1ea.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ec-1f1eb.png b/images/emoji/1f1ec-1f1eb.png
deleted file mode 100644
index 0cf96f327..000000000
--- a/images/emoji/1f1ec-1f1eb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ec-1f1ec.png b/images/emoji/1f1ec-1f1ec.png
deleted file mode 100644
index 970002c7f..000000000
--- a/images/emoji/1f1ec-1f1ec.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ec-1f1ed.png b/images/emoji/1f1ec-1f1ed.png
deleted file mode 100644
index f31b5eb7b..000000000
--- a/images/emoji/1f1ec-1f1ed.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ec-1f1ee.png b/images/emoji/1f1ec-1f1ee.png
deleted file mode 100644
index e554a2a1d..000000000
--- a/images/emoji/1f1ec-1f1ee.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ec-1f1f1.png b/images/emoji/1f1ec-1f1f1.png
deleted file mode 100644
index 2e795dd4e..000000000
--- a/images/emoji/1f1ec-1f1f1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ec-1f1f2.png b/images/emoji/1f1ec-1f1f2.png
deleted file mode 100644
index bb69c0975..000000000
--- a/images/emoji/1f1ec-1f1f2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ec-1f1f3.png b/images/emoji/1f1ec-1f1f3.png
deleted file mode 100644
index 1981f61db..000000000
--- a/images/emoji/1f1ec-1f1f3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ec-1f1f5.png b/images/emoji/1f1ec-1f1f5.png
deleted file mode 100644
index 10e42e672..000000000
--- a/images/emoji/1f1ec-1f1f5.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ec-1f1f6.png b/images/emoji/1f1ec-1f1f6.png
deleted file mode 100644
index 11475e61e..000000000
--- a/images/emoji/1f1ec-1f1f6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ec-1f1f7.png b/images/emoji/1f1ec-1f1f7.png
deleted file mode 100644
index 0f6bb1b6b..000000000
--- a/images/emoji/1f1ec-1f1f7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ec-1f1f8.png b/images/emoji/1f1ec-1f1f8.png
deleted file mode 100644
index 6fc927804..000000000
--- a/images/emoji/1f1ec-1f1f8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ec-1f1f9.png b/images/emoji/1f1ec-1f1f9.png
deleted file mode 100644
index 7213d4139..000000000
--- a/images/emoji/1f1ec-1f1f9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ec-1f1fa.png b/images/emoji/1f1ec-1f1fa.png
deleted file mode 100644
index 4027549ca..000000000
--- a/images/emoji/1f1ec-1f1fa.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ec-1f1fc.png b/images/emoji/1f1ec-1f1fc.png
deleted file mode 100644
index 6357f6225..000000000
--- a/images/emoji/1f1ec-1f1fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ec-1f1fe.png b/images/emoji/1f1ec-1f1fe.png
deleted file mode 100644
index 746e2fb7e..000000000
--- a/images/emoji/1f1ec-1f1fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ec.png b/images/emoji/1f1ec.png
deleted file mode 100644
index 271163075..000000000
--- a/images/emoji/1f1ec.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ed-1f1f0.png b/images/emoji/1f1ed-1f1f0.png
deleted file mode 100644
index cf0c7151b..000000000
--- a/images/emoji/1f1ed-1f1f0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ed-1f1f2.png b/images/emoji/1f1ed-1f1f2.png
deleted file mode 100644
index b613509e4..000000000
--- a/images/emoji/1f1ed-1f1f2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ed-1f1f3.png b/images/emoji/1f1ed-1f1f3.png
deleted file mode 100644
index 402cdcefd..000000000
--- a/images/emoji/1f1ed-1f1f3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ed-1f1f7.png b/images/emoji/1f1ed-1f1f7.png
deleted file mode 100644
index 46f4f06b4..000000000
--- a/images/emoji/1f1ed-1f1f7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ed-1f1f9.png b/images/emoji/1f1ed-1f1f9.png
deleted file mode 100644
index d8d0c8884..000000000
--- a/images/emoji/1f1ed-1f1f9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ed-1f1fa.png b/images/emoji/1f1ed-1f1fa.png
deleted file mode 100644
index a898de636..000000000
--- a/images/emoji/1f1ed-1f1fa.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ed.png b/images/emoji/1f1ed.png
deleted file mode 100644
index ca88e46bf..000000000
--- a/images/emoji/1f1ed.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ee-1f1e8.png b/images/emoji/1f1ee-1f1e8.png
deleted file mode 100644
index 69fd990aa..000000000
--- a/images/emoji/1f1ee-1f1e8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ee-1f1e9.png b/images/emoji/1f1ee-1f1e9.png
deleted file mode 100644
index 85b4c063a..000000000
--- a/images/emoji/1f1ee-1f1e9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ee-1f1ea.png b/images/emoji/1f1ee-1f1ea.png
deleted file mode 100644
index a28295838..000000000
--- a/images/emoji/1f1ee-1f1ea.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ee-1f1f1.png b/images/emoji/1f1ee-1f1f1.png
deleted file mode 100644
index 85c410d45..000000000
--- a/images/emoji/1f1ee-1f1f1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ee-1f1f2.png b/images/emoji/1f1ee-1f1f2.png
deleted file mode 100644
index 60a2458e3..000000000
--- a/images/emoji/1f1ee-1f1f2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ee-1f1f3.png b/images/emoji/1f1ee-1f1f3.png
deleted file mode 100644
index feccc8952..000000000
--- a/images/emoji/1f1ee-1f1f3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ee-1f1f4.png b/images/emoji/1f1ee-1f1f4.png
deleted file mode 100644
index fb6cc3cd4..000000000
--- a/images/emoji/1f1ee-1f1f4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ee-1f1f6.png b/images/emoji/1f1ee-1f1f6.png
deleted file mode 100644
index 41fd1db6f..000000000
--- a/images/emoji/1f1ee-1f1f6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ee-1f1f7.png b/images/emoji/1f1ee-1f1f7.png
deleted file mode 100644
index ff7aaf62b..000000000
--- a/images/emoji/1f1ee-1f1f7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ee-1f1f8.png b/images/emoji/1f1ee-1f1f8.png
deleted file mode 100644
index ad8d4131d..000000000
--- a/images/emoji/1f1ee-1f1f8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ee-1f1f9.png b/images/emoji/1f1ee-1f1f9.png
deleted file mode 100644
index f21563ec5..000000000
--- a/images/emoji/1f1ee-1f1f9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ee.png b/images/emoji/1f1ee.png
deleted file mode 100644
index 48dc16788..000000000
--- a/images/emoji/1f1ee.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ef-1f1ea.png b/images/emoji/1f1ef-1f1ea.png
deleted file mode 100644
index 198a918f6..000000000
--- a/images/emoji/1f1ef-1f1ea.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ef-1f1f2.png b/images/emoji/1f1ef-1f1f2.png
deleted file mode 100644
index f84e4f9e8..000000000
--- a/images/emoji/1f1ef-1f1f2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ef-1f1f4.png b/images/emoji/1f1ef-1f1f4.png
deleted file mode 100644
index 20bfa147e..000000000
--- a/images/emoji/1f1ef-1f1f4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ef-1f1f5.png b/images/emoji/1f1ef-1f1f5.png
deleted file mode 100644
index 8d8838e47..000000000
--- a/images/emoji/1f1ef-1f1f5.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ef.png b/images/emoji/1f1ef.png
deleted file mode 100644
index 16599daa7..000000000
--- a/images/emoji/1f1ef.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f0-1f1ea.png b/images/emoji/1f1f0-1f1ea.png
deleted file mode 100644
index 9e417ab30..000000000
--- a/images/emoji/1f1f0-1f1ea.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f0-1f1ec.png b/images/emoji/1f1f0-1f1ec.png
deleted file mode 100644
index b3eaf7e57..000000000
--- a/images/emoji/1f1f0-1f1ec.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f0-1f1ed.png b/images/emoji/1f1f0-1f1ed.png
deleted file mode 100644
index 9a2877dd6..000000000
--- a/images/emoji/1f1f0-1f1ed.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f0-1f1ee.png b/images/emoji/1f1f0-1f1ee.png
deleted file mode 100644
index 9a5abed3f..000000000
--- a/images/emoji/1f1f0-1f1ee.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f0-1f1f2.png b/images/emoji/1f1f0-1f1f2.png
deleted file mode 100644
index bd5a0588e..000000000
--- a/images/emoji/1f1f0-1f1f2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f0-1f1f3.png b/images/emoji/1f1f0-1f1f3.png
deleted file mode 100644
index 776207c96..000000000
--- a/images/emoji/1f1f0-1f1f3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f0-1f1f5.png b/images/emoji/1f1f0-1f1f5.png
deleted file mode 100644
index 6b3fd89ea..000000000
--- a/images/emoji/1f1f0-1f1f5.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f0-1f1f7.png b/images/emoji/1f1f0-1f1f7.png
deleted file mode 100644
index faa466f2d..000000000
--- a/images/emoji/1f1f0-1f1f7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f0-1f1fc.png b/images/emoji/1f1f0-1f1fc.png
deleted file mode 100644
index 4d19bfa6c..000000000
--- a/images/emoji/1f1f0-1f1fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f0-1f1fe.png b/images/emoji/1f1f0-1f1fe.png
deleted file mode 100644
index 40daa4da5..000000000
--- a/images/emoji/1f1f0-1f1fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f0-1f1ff.png b/images/emoji/1f1f0-1f1ff.png
deleted file mode 100644
index 2f97a8fd3..000000000
--- a/images/emoji/1f1f0-1f1ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f0.png b/images/emoji/1f1f0.png
deleted file mode 100644
index 204b95d1b..000000000
--- a/images/emoji/1f1f0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f1-1f1e6.png b/images/emoji/1f1f1-1f1e6.png
deleted file mode 100644
index 4d4179f34..000000000
--- a/images/emoji/1f1f1-1f1e6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f1-1f1e7.png b/images/emoji/1f1f1-1f1e7.png
deleted file mode 100644
index 3d5944670..000000000
--- a/images/emoji/1f1f1-1f1e7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f1-1f1e8.png b/images/emoji/1f1f1-1f1e8.png
deleted file mode 100644
index 45547b1e4..000000000
--- a/images/emoji/1f1f1-1f1e8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f1-1f1ee.png b/images/emoji/1f1f1-1f1ee.png
deleted file mode 100644
index 0eafa6a22..000000000
--- a/images/emoji/1f1f1-1f1ee.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f1-1f1f0.png b/images/emoji/1f1f1-1f1f0.png
deleted file mode 100644
index ab4fe10c4..000000000
--- a/images/emoji/1f1f1-1f1f0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f1-1f1f7.png b/images/emoji/1f1f1-1f1f7.png
deleted file mode 100644
index f66f267fe..000000000
--- a/images/emoji/1f1f1-1f1f7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f1-1f1f8.png b/images/emoji/1f1f1-1f1f8.png
deleted file mode 100644
index 24745631e..000000000
--- a/images/emoji/1f1f1-1f1f8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f1-1f1f9.png b/images/emoji/1f1f1-1f1f9.png
deleted file mode 100644
index d644b56d6..000000000
--- a/images/emoji/1f1f1-1f1f9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f1-1f1fa.png b/images/emoji/1f1f1-1f1fa.png
deleted file mode 100644
index a2df9c929..000000000
--- a/images/emoji/1f1f1-1f1fa.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f1-1f1fb.png b/images/emoji/1f1f1-1f1fb.png
deleted file mode 100644
index ae680d5f0..000000000
--- a/images/emoji/1f1f1-1f1fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f1-1f1fe.png b/images/emoji/1f1f1-1f1fe.png
deleted file mode 100644
index f6e77b0f3..000000000
--- a/images/emoji/1f1f1-1f1fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f1.png b/images/emoji/1f1f1.png
deleted file mode 100644
index 7992b4f68..000000000
--- a/images/emoji/1f1f1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f2-1f1e6.png b/images/emoji/1f1f2-1f1e6.png
deleted file mode 100644
index c4a056722..000000000
--- a/images/emoji/1f1f2-1f1e6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f2-1f1e8.png b/images/emoji/1f1f2-1f1e8.png
deleted file mode 100644
index d479eab98..000000000
--- a/images/emoji/1f1f2-1f1e8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f2-1f1e9.png b/images/emoji/1f1f2-1f1e9.png
deleted file mode 100644
index a7a725398..000000000
--- a/images/emoji/1f1f2-1f1e9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f2-1f1ea.png b/images/emoji/1f1f2-1f1ea.png
deleted file mode 100644
index 7c771e7e1..000000000
--- a/images/emoji/1f1f2-1f1ea.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f2-1f1eb.png b/images/emoji/1f1f2-1f1eb.png
deleted file mode 100644
index 70c761036..000000000
--- a/images/emoji/1f1f2-1f1eb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f2-1f1ec.png b/images/emoji/1f1f2-1f1ec.png
deleted file mode 100644
index 2f3ccdda7..000000000
--- a/images/emoji/1f1f2-1f1ec.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f2-1f1ed.png b/images/emoji/1f1f2-1f1ed.png
deleted file mode 100644
index 598016481..000000000
--- a/images/emoji/1f1f2-1f1ed.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f2-1f1f0.png b/images/emoji/1f1f2-1f1f0.png
deleted file mode 100644
index 7ba775ee7..000000000
--- a/images/emoji/1f1f2-1f1f0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f2-1f1f1.png b/images/emoji/1f1f2-1f1f1.png
deleted file mode 100644
index 683437854..000000000
--- a/images/emoji/1f1f2-1f1f1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f2-1f1f2.png b/images/emoji/1f1f2-1f1f2.png
deleted file mode 100644
index 37dc7d715..000000000
--- a/images/emoji/1f1f2-1f1f2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f2-1f1f3.png b/images/emoji/1f1f2-1f1f3.png
deleted file mode 100644
index 1f146bbcd..000000000
--- a/images/emoji/1f1f2-1f1f3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f2-1f1f4.png b/images/emoji/1f1f2-1f1f4.png
deleted file mode 100644
index 7edde31f6..000000000
--- a/images/emoji/1f1f2-1f1f4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f2-1f1f5.png b/images/emoji/1f1f2-1f1f5.png
deleted file mode 100644
index 17ec1c441..000000000
--- a/images/emoji/1f1f2-1f1f5.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f2-1f1f6.png b/images/emoji/1f1f2-1f1f6.png
deleted file mode 100644
index 1e672dc90..000000000
--- a/images/emoji/1f1f2-1f1f6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f2-1f1f7.png b/images/emoji/1f1f2-1f1f7.png
deleted file mode 100644
index f87de46ef..000000000
--- a/images/emoji/1f1f2-1f1f7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f2-1f1f8.png b/images/emoji/1f1f2-1f1f8.png
deleted file mode 100644
index 480b0d4eb..000000000
--- a/images/emoji/1f1f2-1f1f8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f2-1f1f9.png b/images/emoji/1f1f2-1f1f9.png
deleted file mode 100644
index c9e1dbdce..000000000
--- a/images/emoji/1f1f2-1f1f9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f2-1f1fa.png b/images/emoji/1f1f2-1f1fa.png
deleted file mode 100644
index 55b33cb7c..000000000
--- a/images/emoji/1f1f2-1f1fa.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f2-1f1fb.png b/images/emoji/1f1f2-1f1fb.png
deleted file mode 100644
index ce5867126..000000000
--- a/images/emoji/1f1f2-1f1fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f2-1f1fc.png b/images/emoji/1f1f2-1f1fc.png
deleted file mode 100644
index 003d85484..000000000
--- a/images/emoji/1f1f2-1f1fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f2-1f1fd.png b/images/emoji/1f1f2-1f1fd.png
deleted file mode 100644
index 42572bcd0..000000000
--- a/images/emoji/1f1f2-1f1fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f2-1f1fe.png b/images/emoji/1f1f2-1f1fe.png
deleted file mode 100644
index 17526c267..000000000
--- a/images/emoji/1f1f2-1f1fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f2-1f1ff.png b/images/emoji/1f1f2-1f1ff.png
deleted file mode 100644
index 2352a78e7..000000000
--- a/images/emoji/1f1f2-1f1ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f2.png b/images/emoji/1f1f2.png
deleted file mode 100644
index 7b848b2ce..000000000
--- a/images/emoji/1f1f2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f3-1f1e6.png b/images/emoji/1f1f3-1f1e6.png
deleted file mode 100644
index ed31c3df0..000000000
--- a/images/emoji/1f1f3-1f1e6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f3-1f1e8.png b/images/emoji/1f1f3-1f1e8.png
deleted file mode 100644
index 3c57ee942..000000000
--- a/images/emoji/1f1f3-1f1e8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f3-1f1ea.png b/images/emoji/1f1f3-1f1ea.png
deleted file mode 100644
index f98a1173c..000000000
--- a/images/emoji/1f1f3-1f1ea.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f3-1f1eb.png b/images/emoji/1f1f3-1f1eb.png
deleted file mode 100644
index 9099e7674..000000000
--- a/images/emoji/1f1f3-1f1eb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f3-1f1ec.png b/images/emoji/1f1f3-1f1ec.png
deleted file mode 100644
index ea0abeff1..000000000
--- a/images/emoji/1f1f3-1f1ec.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f3-1f1ee.png b/images/emoji/1f1f3-1f1ee.png
deleted file mode 100644
index 772920dfa..000000000
--- a/images/emoji/1f1f3-1f1ee.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f3-1f1f1.png b/images/emoji/1f1f3-1f1f1.png
deleted file mode 100644
index 83a0e817e..000000000
--- a/images/emoji/1f1f3-1f1f1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f3-1f1f4.png b/images/emoji/1f1f3-1f1f4.png
deleted file mode 100644
index 99d3142eb..000000000
--- a/images/emoji/1f1f3-1f1f4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f3-1f1f5.png b/images/emoji/1f1f3-1f1f5.png
deleted file mode 100644
index 87425a8df..000000000
--- a/images/emoji/1f1f3-1f1f5.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f3-1f1f7.png b/images/emoji/1f1f3-1f1f7.png
deleted file mode 100644
index b3e3a5d56..000000000
--- a/images/emoji/1f1f3-1f1f7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f3-1f1fa.png b/images/emoji/1f1f3-1f1fa.png
deleted file mode 100644
index f03614443..000000000
--- a/images/emoji/1f1f3-1f1fa.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f3-1f1ff.png b/images/emoji/1f1f3-1f1ff.png
deleted file mode 100644
index a4eeeab9c..000000000
--- a/images/emoji/1f1f3-1f1ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f3.png b/images/emoji/1f1f3.png
deleted file mode 100644
index 4a11e5043..000000000
--- a/images/emoji/1f1f3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f4-1f1f2.png b/images/emoji/1f1f4-1f1f2.png
deleted file mode 100644
index ea824ba31..000000000
--- a/images/emoji/1f1f4-1f1f2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f4.png b/images/emoji/1f1f4.png
deleted file mode 100644
index 2a0760b31..000000000
--- a/images/emoji/1f1f4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f5-1f1e6.png b/images/emoji/1f1f5-1f1e6.png
deleted file mode 100644
index c3091d898..000000000
--- a/images/emoji/1f1f5-1f1e6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f5-1f1ea.png b/images/emoji/1f1f5-1f1ea.png
deleted file mode 100644
index 39223aa9d..000000000
--- a/images/emoji/1f1f5-1f1ea.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f5-1f1eb.png b/images/emoji/1f1f5-1f1eb.png
deleted file mode 100644
index 113445f8f..000000000
--- a/images/emoji/1f1f5-1f1eb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f5-1f1ec.png b/images/emoji/1f1f5-1f1ec.png
deleted file mode 100644
index 825e9dcb7..000000000
--- a/images/emoji/1f1f5-1f1ec.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f5-1f1ed.png b/images/emoji/1f1f5-1f1ed.png
deleted file mode 100644
index 8260e15bd..000000000
--- a/images/emoji/1f1f5-1f1ed.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f5-1f1f0.png b/images/emoji/1f1f5-1f1f0.png
deleted file mode 100644
index a7b6a1c50..000000000
--- a/images/emoji/1f1f5-1f1f0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f5-1f1f1.png b/images/emoji/1f1f5-1f1f1.png
deleted file mode 100644
index 19de2edec..000000000
--- a/images/emoji/1f1f5-1f1f1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f5-1f1f2.png b/images/emoji/1f1f5-1f1f2.png
deleted file mode 100644
index 2ca605541..000000000
--- a/images/emoji/1f1f5-1f1f2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f5-1f1f3.png b/images/emoji/1f1f5-1f1f3.png
deleted file mode 100644
index 9a6327847..000000000
--- a/images/emoji/1f1f5-1f1f3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f5-1f1f7.png b/images/emoji/1f1f5-1f1f7.png
deleted file mode 100644
index d0209cddb..000000000
--- a/images/emoji/1f1f5-1f1f7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f5-1f1f8.png b/images/emoji/1f1f5-1f1f8.png
deleted file mode 100644
index 7ccab0977..000000000
--- a/images/emoji/1f1f5-1f1f8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f5-1f1f9.png b/images/emoji/1f1f5-1f1f9.png
deleted file mode 100644
index cc93f27c6..000000000
--- a/images/emoji/1f1f5-1f1f9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f5-1f1fc.png b/images/emoji/1f1f5-1f1fc.png
deleted file mode 100644
index 154b2f12d..000000000
--- a/images/emoji/1f1f5-1f1fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f5-1f1fe.png b/images/emoji/1f1f5-1f1fe.png
deleted file mode 100644
index 662ad2f6f..000000000
--- a/images/emoji/1f1f5-1f1fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f5.png b/images/emoji/1f1f5.png
deleted file mode 100644
index bcb3298f9..000000000
--- a/images/emoji/1f1f5.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f6-1f1e6.png b/images/emoji/1f1f6-1f1e6.png
deleted file mode 100644
index a01d8b05c..000000000
--- a/images/emoji/1f1f6-1f1e6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f6.png b/images/emoji/1f1f6.png
deleted file mode 100644
index 6c92a9dfb..000000000
--- a/images/emoji/1f1f6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f7-1f1ea.png b/images/emoji/1f1f7-1f1ea.png
deleted file mode 100644
index 57f2bbe9d..000000000
--- a/images/emoji/1f1f7-1f1ea.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f7-1f1f4.png b/images/emoji/1f1f7-1f1f4.png
deleted file mode 100644
index 3e48c4477..000000000
--- a/images/emoji/1f1f7-1f1f4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f7-1f1f8.png b/images/emoji/1f1f7-1f1f8.png
deleted file mode 100644
index 9df6c9a52..000000000
--- a/images/emoji/1f1f7-1f1f8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f7-1f1fa.png b/images/emoji/1f1f7-1f1fa.png
deleted file mode 100644
index e50c9db90..000000000
--- a/images/emoji/1f1f7-1f1fa.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f7-1f1fc.png b/images/emoji/1f1f7-1f1fc.png
deleted file mode 100644
index c238c874e..000000000
--- a/images/emoji/1f1f7-1f1fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f7.png b/images/emoji/1f1f7.png
deleted file mode 100644
index 627892c91..000000000
--- a/images/emoji/1f1f7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f8-1f1e6.png b/images/emoji/1f1f8-1f1e6.png
deleted file mode 100644
index 4941be7d1..000000000
--- a/images/emoji/1f1f8-1f1e6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f8-1f1e7.png b/images/emoji/1f1f8-1f1e7.png
deleted file mode 100644
index 7d8f1ac61..000000000
--- a/images/emoji/1f1f8-1f1e7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f8-1f1e8.png b/images/emoji/1f1f8-1f1e8.png
deleted file mode 100644
index 6ae4d9076..000000000
--- a/images/emoji/1f1f8-1f1e8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f8-1f1e9.png b/images/emoji/1f1f8-1f1e9.png
deleted file mode 100644
index 963be1b36..000000000
--- a/images/emoji/1f1f8-1f1e9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f8-1f1ea.png b/images/emoji/1f1f8-1f1ea.png
deleted file mode 100644
index fc0d0e0ce..000000000
--- a/images/emoji/1f1f8-1f1ea.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f8-1f1ec.png b/images/emoji/1f1f8-1f1ec.png
deleted file mode 100644
index de3c7737c..000000000
--- a/images/emoji/1f1f8-1f1ec.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f8-1f1ed.png b/images/emoji/1f1f8-1f1ed.png
deleted file mode 100644
index 40cd9e44e..000000000
--- a/images/emoji/1f1f8-1f1ed.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f8-1f1ee.png b/images/emoji/1f1f8-1f1ee.png
deleted file mode 100644
index e308999db..000000000
--- a/images/emoji/1f1f8-1f1ee.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f8-1f1ef.png b/images/emoji/1f1f8-1f1ef.png
deleted file mode 100644
index 5884e6482..000000000
--- a/images/emoji/1f1f8-1f1ef.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f8-1f1f0.png b/images/emoji/1f1f8-1f1f0.png
deleted file mode 100644
index 4259d0e14..000000000
--- a/images/emoji/1f1f8-1f1f0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f8-1f1f1.png b/images/emoji/1f1f8-1f1f1.png
deleted file mode 100644
index d2cc68830..000000000
--- a/images/emoji/1f1f8-1f1f1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f8-1f1f2.png b/images/emoji/1f1f8-1f1f2.png
deleted file mode 100644
index b96ba87d0..000000000
--- a/images/emoji/1f1f8-1f1f2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f8-1f1f3.png b/images/emoji/1f1f8-1f1f3.png
deleted file mode 100644
index 5368bbe93..000000000
--- a/images/emoji/1f1f8-1f1f3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f8-1f1f4.png b/images/emoji/1f1f8-1f1f4.png
deleted file mode 100644
index 68a059736..000000000
--- a/images/emoji/1f1f8-1f1f4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f8-1f1f7.png b/images/emoji/1f1f8-1f1f7.png
deleted file mode 100644
index d32513270..000000000
--- a/images/emoji/1f1f8-1f1f7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f8-1f1f8.png b/images/emoji/1f1f8-1f1f8.png
deleted file mode 100644
index 122977e79..000000000
--- a/images/emoji/1f1f8-1f1f8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f8-1f1f9.png b/images/emoji/1f1f8-1f1f9.png
deleted file mode 100644
index f83a863d6..000000000
--- a/images/emoji/1f1f8-1f1f9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f8-1f1fb.png b/images/emoji/1f1f8-1f1fb.png
deleted file mode 100644
index efb83e2f2..000000000
--- a/images/emoji/1f1f8-1f1fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f8-1f1fd.png b/images/emoji/1f1f8-1f1fd.png
deleted file mode 100644
index 94b760fbe..000000000
--- a/images/emoji/1f1f8-1f1fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f8-1f1fe.png b/images/emoji/1f1f8-1f1fe.png
deleted file mode 100644
index 09a8ee8f7..000000000
--- a/images/emoji/1f1f8-1f1fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f8-1f1ff.png b/images/emoji/1f1f8-1f1ff.png
deleted file mode 100644
index f74e82ea1..000000000
--- a/images/emoji/1f1f8-1f1ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f8.png b/images/emoji/1f1f8.png
deleted file mode 100644
index 9d0dbf93a..000000000
--- a/images/emoji/1f1f8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f9-1f1e6.png b/images/emoji/1f1f9-1f1e6.png
deleted file mode 100644
index b44283e90..000000000
--- a/images/emoji/1f1f9-1f1e6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f9-1f1e8.png b/images/emoji/1f1f9-1f1e8.png
deleted file mode 100644
index 156b33d1b..000000000
--- a/images/emoji/1f1f9-1f1e8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f9-1f1e9.png b/images/emoji/1f1f9-1f1e9.png
deleted file mode 100644
index ebe7f5928..000000000
--- a/images/emoji/1f1f9-1f1e9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f9-1f1eb.png b/images/emoji/1f1f9-1f1eb.png
deleted file mode 100644
index a1a3ad68e..000000000
--- a/images/emoji/1f1f9-1f1eb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f9-1f1ec.png b/images/emoji/1f1f9-1f1ec.png
deleted file mode 100644
index 826b73c9a..000000000
--- a/images/emoji/1f1f9-1f1ec.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f9-1f1ed.png b/images/emoji/1f1f9-1f1ed.png
deleted file mode 100644
index 93ff542c5..000000000
--- a/images/emoji/1f1f9-1f1ed.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f9-1f1ef.png b/images/emoji/1f1f9-1f1ef.png
deleted file mode 100644
index 7a8a0b619..000000000
--- a/images/emoji/1f1f9-1f1ef.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f9-1f1f0.png b/images/emoji/1f1f9-1f1f0.png
deleted file mode 100644
index 2fa5a21b1..000000000
--- a/images/emoji/1f1f9-1f1f0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f9-1f1f1.png b/images/emoji/1f1f9-1f1f1.png
deleted file mode 100644
index 5b120eccc..000000000
--- a/images/emoji/1f1f9-1f1f1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f9-1f1f2.png b/images/emoji/1f1f9-1f1f2.png
deleted file mode 100644
index c3c4f5323..000000000
--- a/images/emoji/1f1f9-1f1f2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f9-1f1f3.png b/images/emoji/1f1f9-1f1f3.png
deleted file mode 100644
index 58ef16122..000000000
--- a/images/emoji/1f1f9-1f1f3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f9-1f1f4.png b/images/emoji/1f1f9-1f1f4.png
deleted file mode 100644
index 1ffa7bb9d..000000000
--- a/images/emoji/1f1f9-1f1f4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f9-1f1f7.png b/images/emoji/1f1f9-1f1f7.png
deleted file mode 100644
index 325251fae..000000000
--- a/images/emoji/1f1f9-1f1f7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f9-1f1f9.png b/images/emoji/1f1f9-1f1f9.png
deleted file mode 100644
index ed3bb39a3..000000000
--- a/images/emoji/1f1f9-1f1f9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f9-1f1fb.png b/images/emoji/1f1f9-1f1fb.png
deleted file mode 100644
index e82c65c7b..000000000
--- a/images/emoji/1f1f9-1f1fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f9-1f1fc.png b/images/emoji/1f1f9-1f1fc.png
deleted file mode 100644
index 3a8f00b59..000000000
--- a/images/emoji/1f1f9-1f1fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f9-1f1ff.png b/images/emoji/1f1f9-1f1ff.png
deleted file mode 100644
index 2a020853d..000000000
--- a/images/emoji/1f1f9-1f1ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f9.png b/images/emoji/1f1f9.png
deleted file mode 100644
index 2d882f66b..000000000
--- a/images/emoji/1f1f9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1fa-1f1e6.png b/images/emoji/1f1fa-1f1e6.png
deleted file mode 100644
index cd84d1bbd..000000000
--- a/images/emoji/1f1fa-1f1e6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1fa-1f1ec.png b/images/emoji/1f1fa-1f1ec.png
deleted file mode 100644
index dc97690eb..000000000
--- a/images/emoji/1f1fa-1f1ec.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1fa-1f1f2.png b/images/emoji/1f1fa-1f1f2.png
deleted file mode 100644
index 4a7ee3cdf..000000000
--- a/images/emoji/1f1fa-1f1f2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1fa-1f1f8.png b/images/emoji/1f1fa-1f1f8.png
deleted file mode 100644
index 9f7303058..000000000
--- a/images/emoji/1f1fa-1f1f8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1fa-1f1fe.png b/images/emoji/1f1fa-1f1fe.png
deleted file mode 100644
index b8002a697..000000000
--- a/images/emoji/1f1fa-1f1fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1fa-1f1ff.png b/images/emoji/1f1fa-1f1ff.png
deleted file mode 100644
index d56ca9bc4..000000000
--- a/images/emoji/1f1fa-1f1ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1fa.png b/images/emoji/1f1fa.png
deleted file mode 100644
index ae0cabeb1..000000000
--- a/images/emoji/1f1fa.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1fb-1f1e6.png b/images/emoji/1f1fb-1f1e6.png
deleted file mode 100644
index 7f0676fc8..000000000
--- a/images/emoji/1f1fb-1f1e6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1fb-1f1e8.png b/images/emoji/1f1fb-1f1e8.png
deleted file mode 100644
index 43703c62a..000000000
--- a/images/emoji/1f1fb-1f1e8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1fb-1f1ea.png b/images/emoji/1f1fb-1f1ea.png
deleted file mode 100644
index 1b6279682..000000000
--- a/images/emoji/1f1fb-1f1ea.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1fb-1f1ec.png b/images/emoji/1f1fb-1f1ec.png
deleted file mode 100644
index 536f780f1..000000000
--- a/images/emoji/1f1fb-1f1ec.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1fb-1f1ee.png b/images/emoji/1f1fb-1f1ee.png
deleted file mode 100644
index 1b4219cb9..000000000
--- a/images/emoji/1f1fb-1f1ee.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1fb-1f1f3.png b/images/emoji/1f1fb-1f1f3.png
deleted file mode 100644
index 427036046..000000000
--- a/images/emoji/1f1fb-1f1f3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1fb-1f1fa.png b/images/emoji/1f1fb-1f1fa.png
deleted file mode 100644
index 706eba440..000000000
--- a/images/emoji/1f1fb-1f1fa.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1fb.png b/images/emoji/1f1fb.png
deleted file mode 100644
index e01e179b4..000000000
--- a/images/emoji/1f1fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1fc-1f1eb.png b/images/emoji/1f1fc-1f1eb.png
deleted file mode 100644
index 70c761036..000000000
--- a/images/emoji/1f1fc-1f1eb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1fc-1f1f8.png b/images/emoji/1f1fc-1f1f8.png
deleted file mode 100644
index a1ea07031..000000000
--- a/images/emoji/1f1fc-1f1f8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1fc.png b/images/emoji/1f1fc.png
deleted file mode 100644
index e8f614ac8..000000000
--- a/images/emoji/1f1fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1fd-1f1f0.png b/images/emoji/1f1fd-1f1f0.png
deleted file mode 100644
index e587a4466..000000000
--- a/images/emoji/1f1fd-1f1f0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1fd.png b/images/emoji/1f1fd.png
deleted file mode 100644
index e3bedba0b..000000000
--- a/images/emoji/1f1fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1fe-1f1ea.png b/images/emoji/1f1fe-1f1ea.png
deleted file mode 100644
index eadfebd5f..000000000
--- a/images/emoji/1f1fe-1f1ea.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1fe-1f1f9.png b/images/emoji/1f1fe-1f1f9.png
deleted file mode 100644
index e55fd8d85..000000000
--- a/images/emoji/1f1fe-1f1f9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1fe.png b/images/emoji/1f1fe.png
deleted file mode 100644
index 9bfa7f2db..000000000
--- a/images/emoji/1f1fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ff-1f1e6.png b/images/emoji/1f1ff-1f1e6.png
deleted file mode 100644
index f397ef507..000000000
--- a/images/emoji/1f1ff-1f1e6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ff-1f1f2.png b/images/emoji/1f1ff-1f1f2.png
deleted file mode 100644
index 2494a31f6..000000000
--- a/images/emoji/1f1ff-1f1f2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ff-1f1fc.png b/images/emoji/1f1ff-1f1fc.png
deleted file mode 100644
index e09b9652b..000000000
--- a/images/emoji/1f1ff-1f1fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ff.png b/images/emoji/1f1ff.png
deleted file mode 100644
index 5bf03f100..000000000
--- a/images/emoji/1f1ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f201.png b/images/emoji/1f201.png
deleted file mode 100644
index 6450eb44d..000000000
--- a/images/emoji/1f201.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f202.png b/images/emoji/1f202.png
deleted file mode 100644
index 900f96332..000000000
--- a/images/emoji/1f202.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f21a.png b/images/emoji/1f21a.png
deleted file mode 100644
index d3a19b420..000000000
--- a/images/emoji/1f21a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f22f.png b/images/emoji/1f22f.png
deleted file mode 100644
index 078e23e4f..000000000
--- a/images/emoji/1f22f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f232.png b/images/emoji/1f232.png
deleted file mode 100644
index 4c704e034..000000000
--- a/images/emoji/1f232.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f233.png b/images/emoji/1f233.png
deleted file mode 100644
index 47966c1ea..000000000
--- a/images/emoji/1f233.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f234.png b/images/emoji/1f234.png
deleted file mode 100644
index 8375ad9d9..000000000
--- a/images/emoji/1f234.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f235.png b/images/emoji/1f235.png
deleted file mode 100644
index f9dea8b88..000000000
--- a/images/emoji/1f235.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f236.png b/images/emoji/1f236.png
deleted file mode 100644
index a4510de41..000000000
--- a/images/emoji/1f236.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f237.png b/images/emoji/1f237.png
deleted file mode 100644
index c41bd36a2..000000000
--- a/images/emoji/1f237.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f238.png b/images/emoji/1f238.png
deleted file mode 100644
index 6b7af0ee2..000000000
--- a/images/emoji/1f238.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f239.png b/images/emoji/1f239.png
deleted file mode 100644
index c4f837fe6..000000000
--- a/images/emoji/1f239.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f23a.png b/images/emoji/1f23a.png
deleted file mode 100644
index d21cb30ea..000000000
--- a/images/emoji/1f23a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f250.png b/images/emoji/1f250.png
deleted file mode 100644
index 0c0d589ca..000000000
--- a/images/emoji/1f250.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f251.png b/images/emoji/1f251.png
deleted file mode 100644
index 8afd7ce99..000000000
--- a/images/emoji/1f251.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f300.png b/images/emoji/1f300.png
deleted file mode 100644
index ff00b1afe..000000000
--- a/images/emoji/1f300.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f301.png b/images/emoji/1f301.png
deleted file mode 100644
index 57702d8d3..000000000
--- a/images/emoji/1f301.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f302.png b/images/emoji/1f302.png
deleted file mode 100644
index ecefba9e4..000000000
--- a/images/emoji/1f302.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f303.png b/images/emoji/1f303.png
deleted file mode 100644
index ca2018f45..000000000
--- a/images/emoji/1f303.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f304.png b/images/emoji/1f304.png
deleted file mode 100644
index 39c57c86a..000000000
--- a/images/emoji/1f304.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f305.png b/images/emoji/1f305.png
deleted file mode 100644
index 4ad36003c..000000000
--- a/images/emoji/1f305.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f306.png b/images/emoji/1f306.png
deleted file mode 100644
index 80cdff7cf..000000000
--- a/images/emoji/1f306.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f307.png b/images/emoji/1f307.png
deleted file mode 100644
index 7cded0ba5..000000000
--- a/images/emoji/1f307.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f308.png b/images/emoji/1f308.png
deleted file mode 100644
index 154735d71..000000000
--- a/images/emoji/1f308.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f309.png b/images/emoji/1f309.png
deleted file mode 100644
index 1d444e0be..000000000
--- a/images/emoji/1f309.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f30a.png b/images/emoji/1f30a.png
deleted file mode 100644
index 45ff1e877..000000000
--- a/images/emoji/1f30a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f30b.png b/images/emoji/1f30b.png
deleted file mode 100644
index adb522980..000000000
--- a/images/emoji/1f30b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f30c.png b/images/emoji/1f30c.png
deleted file mode 100644
index b2b8ac59c..000000000
--- a/images/emoji/1f30c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f30d.png b/images/emoji/1f30d.png
deleted file mode 100644
index 66c3348c2..000000000
--- a/images/emoji/1f30d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f30e.png b/images/emoji/1f30e.png
deleted file mode 100644
index 538c3cddd..000000000
--- a/images/emoji/1f30e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f30f.png b/images/emoji/1f30f.png
deleted file mode 100644
index d8df97fec..000000000
--- a/images/emoji/1f30f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f310.png b/images/emoji/1f310.png
deleted file mode 100644
index 82450c1a4..000000000
--- a/images/emoji/1f310.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f311.png b/images/emoji/1f311.png
deleted file mode 100644
index ecff72caa..000000000
--- a/images/emoji/1f311.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f312.png b/images/emoji/1f312.png
deleted file mode 100644
index 921224a34..000000000
--- a/images/emoji/1f312.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f313.png b/images/emoji/1f313.png
deleted file mode 100644
index 5dccaf72a..000000000
--- a/images/emoji/1f313.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f314.png b/images/emoji/1f314.png
deleted file mode 100644
index 3a8081563..000000000
--- a/images/emoji/1f314.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f315.png b/images/emoji/1f315.png
deleted file mode 100644
index c9a2d6aa7..000000000
--- a/images/emoji/1f315.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f316.png b/images/emoji/1f316.png
deleted file mode 100644
index 741bd5931..000000000
--- a/images/emoji/1f316.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f317.png b/images/emoji/1f317.png
deleted file mode 100644
index 0842a0dd4..000000000
--- a/images/emoji/1f317.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f318.png b/images/emoji/1f318.png
deleted file mode 100644
index cf68706b8..000000000
--- a/images/emoji/1f318.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f319.png b/images/emoji/1f319.png
deleted file mode 100644
index 765420ece..000000000
--- a/images/emoji/1f319.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f31a.png b/images/emoji/1f31a.png
deleted file mode 100644
index 150dd1240..000000000
--- a/images/emoji/1f31a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f31b.png b/images/emoji/1f31b.png
deleted file mode 100644
index cd8a3d7ac..000000000
--- a/images/emoji/1f31b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f31c.png b/images/emoji/1f31c.png
deleted file mode 100644
index 94099343c..000000000
--- a/images/emoji/1f31c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f31d.png b/images/emoji/1f31d.png
deleted file mode 100644
index a5c25bbaf..000000000
--- a/images/emoji/1f31d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f31e.png b/images/emoji/1f31e.png
deleted file mode 100644
index 14a4ea971..000000000
--- a/images/emoji/1f31e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f31f.png b/images/emoji/1f31f.png
deleted file mode 100644
index 2f5cba592..000000000
--- a/images/emoji/1f31f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f320.png b/images/emoji/1f320.png
deleted file mode 100644
index aa45384d1..000000000
--- a/images/emoji/1f320.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f321.png b/images/emoji/1f321.png
deleted file mode 100644
index b11473924..000000000
--- a/images/emoji/1f321.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f324.png b/images/emoji/1f324.png
deleted file mode 100644
index cead0bfa5..000000000
--- a/images/emoji/1f324.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f325.png b/images/emoji/1f325.png
deleted file mode 100644
index 0a4cc1002..000000000
--- a/images/emoji/1f325.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f326.png b/images/emoji/1f326.png
deleted file mode 100644
index 491f9ca48..000000000
--- a/images/emoji/1f326.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f327.png b/images/emoji/1f327.png
deleted file mode 100644
index 385685e05..000000000
--- a/images/emoji/1f327.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f328.png b/images/emoji/1f328.png
deleted file mode 100644
index 9720384eb..000000000
--- a/images/emoji/1f328.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f329.png b/images/emoji/1f329.png
deleted file mode 100644
index 0831e88aa..000000000
--- a/images/emoji/1f329.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f32a.png b/images/emoji/1f32a.png
deleted file mode 100644
index 4821c89da..000000000
--- a/images/emoji/1f32a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f32b.png b/images/emoji/1f32b.png
deleted file mode 100644
index 4e73c2de2..000000000
--- a/images/emoji/1f32b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f32c.png b/images/emoji/1f32c.png
deleted file mode 100644
index df81b652e..000000000
--- a/images/emoji/1f32c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f32d.png b/images/emoji/1f32d.png
deleted file mode 100644
index 3c3354d94..000000000
--- a/images/emoji/1f32d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f32e.png b/images/emoji/1f32e.png
deleted file mode 100644
index 10e847a46..000000000
--- a/images/emoji/1f32e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f32f.png b/images/emoji/1f32f.png
deleted file mode 100644
index 02bd5601d..000000000
--- a/images/emoji/1f32f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f330.png b/images/emoji/1f330.png
deleted file mode 100644
index f8a01e281..000000000
--- a/images/emoji/1f330.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f331.png b/images/emoji/1f331.png
deleted file mode 100644
index ae0948bcf..000000000
--- a/images/emoji/1f331.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f332.png b/images/emoji/1f332.png
deleted file mode 100644
index f679d8dd7..000000000
--- a/images/emoji/1f332.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f333.png b/images/emoji/1f333.png
deleted file mode 100644
index 7cd2bc708..000000000
--- a/images/emoji/1f333.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f334.png b/images/emoji/1f334.png
deleted file mode 100644
index aaaa6aec3..000000000
--- a/images/emoji/1f334.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f335.png b/images/emoji/1f335.png
deleted file mode 100644
index 9b48ccf3d..000000000
--- a/images/emoji/1f335.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f336.png b/images/emoji/1f336.png
deleted file mode 100644
index 266675bd5..000000000
--- a/images/emoji/1f336.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f337.png b/images/emoji/1f337.png
deleted file mode 100644
index f799d75c1..000000000
--- a/images/emoji/1f337.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f338.png b/images/emoji/1f338.png
deleted file mode 100644
index 282f3e7bc..000000000
--- a/images/emoji/1f338.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f339.png b/images/emoji/1f339.png
deleted file mode 100644
index 52c286d31..000000000
--- a/images/emoji/1f339.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f33a.png b/images/emoji/1f33a.png
deleted file mode 100644
index 39dd35242..000000000
--- a/images/emoji/1f33a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f33b.png b/images/emoji/1f33b.png
deleted file mode 100644
index 08cc07761..000000000
--- a/images/emoji/1f33b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f33c.png b/images/emoji/1f33c.png
deleted file mode 100644
index 4083026c1..000000000
--- a/images/emoji/1f33c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f33d.png b/images/emoji/1f33d.png
deleted file mode 100644
index 36e201279..000000000
--- a/images/emoji/1f33d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f33e.png b/images/emoji/1f33e.png
deleted file mode 100644
index 3564d9d64..000000000
--- a/images/emoji/1f33e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f33f.png b/images/emoji/1f33f.png
deleted file mode 100644
index d984d1562..000000000
--- a/images/emoji/1f33f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f340.png b/images/emoji/1f340.png
deleted file mode 100644
index fdedfcc2b..000000000
--- a/images/emoji/1f340.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f341.png b/images/emoji/1f341.png
deleted file mode 100644
index c49acea67..000000000
--- a/images/emoji/1f341.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f342.png b/images/emoji/1f342.png
deleted file mode 100644
index 0d60e7bdf..000000000
--- a/images/emoji/1f342.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f343.png b/images/emoji/1f343.png
deleted file mode 100644
index 1e43e1af8..000000000
--- a/images/emoji/1f343.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f344.png b/images/emoji/1f344.png
deleted file mode 100644
index dd85742ba..000000000
--- a/images/emoji/1f344.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f345.png b/images/emoji/1f345.png
deleted file mode 100644
index 497da8f6b..000000000
--- a/images/emoji/1f345.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f346.png b/images/emoji/1f346.png
deleted file mode 100644
index fafd7c1a1..000000000
--- a/images/emoji/1f346.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f347.png b/images/emoji/1f347.png
deleted file mode 100644
index 30d222188..000000000
--- a/images/emoji/1f347.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f348.png b/images/emoji/1f348.png
deleted file mode 100644
index c01232d41..000000000
--- a/images/emoji/1f348.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f349.png b/images/emoji/1f349.png
deleted file mode 100644
index 0761488b4..000000000
--- a/images/emoji/1f349.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f34a.png b/images/emoji/1f34a.png
deleted file mode 100644
index ab14e5378..000000000
--- a/images/emoji/1f34a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f34b.png b/images/emoji/1f34b.png
deleted file mode 100644
index 9a7d95ca2..000000000
--- a/images/emoji/1f34b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f34c.png b/images/emoji/1f34c.png
deleted file mode 100644
index f49872795..000000000
--- a/images/emoji/1f34c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f34d.png b/images/emoji/1f34d.png
deleted file mode 100644
index d30d73307..000000000
--- a/images/emoji/1f34d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f34e.png b/images/emoji/1f34e.png
deleted file mode 100644
index da650c60f..000000000
--- a/images/emoji/1f34e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f34f.png b/images/emoji/1f34f.png
deleted file mode 100644
index 5fd51bd39..000000000
--- a/images/emoji/1f34f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f350.png b/images/emoji/1f350.png
deleted file mode 100644
index 3869f718b..000000000
--- a/images/emoji/1f350.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f351.png b/images/emoji/1f351.png
deleted file mode 100644
index 9ab57cbb7..000000000
--- a/images/emoji/1f351.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f352.png b/images/emoji/1f352.png
deleted file mode 100644
index 9b10cbaac..000000000
--- a/images/emoji/1f352.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f353.png b/images/emoji/1f353.png
deleted file mode 100644
index 7bb86f0b2..000000000
--- a/images/emoji/1f353.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f354.png b/images/emoji/1f354.png
deleted file mode 100644
index 4b13f3b8d..000000000
--- a/images/emoji/1f354.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f355.png b/images/emoji/1f355.png
deleted file mode 100644
index 240d5c469..000000000
--- a/images/emoji/1f355.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f356.png b/images/emoji/1f356.png
deleted file mode 100644
index b20a59d16..000000000
--- a/images/emoji/1f356.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f357.png b/images/emoji/1f357.png
deleted file mode 100644
index eea4a53a2..000000000
--- a/images/emoji/1f357.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f358.png b/images/emoji/1f358.png
deleted file mode 100644
index 7fbd08e4f..000000000
--- a/images/emoji/1f358.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f359.png b/images/emoji/1f359.png
deleted file mode 100644
index d3d8ee25c..000000000
--- a/images/emoji/1f359.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f35a.png b/images/emoji/1f35a.png
deleted file mode 100644
index 6e3ac7956..000000000
--- a/images/emoji/1f35a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f35b.png b/images/emoji/1f35b.png
deleted file mode 100644
index 69657ca81..000000000
--- a/images/emoji/1f35b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f35c.png b/images/emoji/1f35c.png
deleted file mode 100644
index c1cb7cd73..000000000
--- a/images/emoji/1f35c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f35d.png b/images/emoji/1f35d.png
deleted file mode 100644
index 4f0b7ed07..000000000
--- a/images/emoji/1f35d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f35e.png b/images/emoji/1f35e.png
deleted file mode 100644
index 6676510aa..000000000
--- a/images/emoji/1f35e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f35f.png b/images/emoji/1f35f.png
deleted file mode 100644
index 3a0899d5a..000000000
--- a/images/emoji/1f35f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f360.png b/images/emoji/1f360.png
deleted file mode 100644
index 92a425f2e..000000000
--- a/images/emoji/1f360.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f361.png b/images/emoji/1f361.png
deleted file mode 100644
index f73f37b01..000000000
--- a/images/emoji/1f361.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f362.png b/images/emoji/1f362.png
deleted file mode 100644
index d38a849fe..000000000
--- a/images/emoji/1f362.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f363.png b/images/emoji/1f363.png
deleted file mode 100644
index f171fd2f7..000000000
--- a/images/emoji/1f363.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f364.png b/images/emoji/1f364.png
deleted file mode 100644
index 752ba7f13..000000000
--- a/images/emoji/1f364.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f365.png b/images/emoji/1f365.png
deleted file mode 100644
index 157bded65..000000000
--- a/images/emoji/1f365.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f366.png b/images/emoji/1f366.png
deleted file mode 100644
index f1f21a3b8..000000000
--- a/images/emoji/1f366.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f367.png b/images/emoji/1f367.png
deleted file mode 100644
index 36dfb53ca..000000000
--- a/images/emoji/1f367.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f368.png b/images/emoji/1f368.png
deleted file mode 100644
index 720ae7428..000000000
--- a/images/emoji/1f368.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f369.png b/images/emoji/1f369.png
deleted file mode 100644
index 0ca4cd0bd..000000000
--- a/images/emoji/1f369.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f36a.png b/images/emoji/1f36a.png
deleted file mode 100644
index 1b6bcb155..000000000
--- a/images/emoji/1f36a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f36b.png b/images/emoji/1f36b.png
deleted file mode 100644
index 318bbd40e..000000000
--- a/images/emoji/1f36b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f36c.png b/images/emoji/1f36c.png
deleted file mode 100644
index 8c67ace3a..000000000
--- a/images/emoji/1f36c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f36d.png b/images/emoji/1f36d.png
deleted file mode 100644
index ad76d7bf9..000000000
--- a/images/emoji/1f36d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f36e.png b/images/emoji/1f36e.png
deleted file mode 100644
index fa3df67b8..000000000
--- a/images/emoji/1f36e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f36f.png b/images/emoji/1f36f.png
deleted file mode 100644
index 9d8f59295..000000000
--- a/images/emoji/1f36f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f370.png b/images/emoji/1f370.png
deleted file mode 100644
index 4368177be..000000000
--- a/images/emoji/1f370.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f371.png b/images/emoji/1f371.png
deleted file mode 100644
index 92cd17233..000000000
--- a/images/emoji/1f371.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f372.png b/images/emoji/1f372.png
deleted file mode 100644
index 6b3f010c1..000000000
--- a/images/emoji/1f372.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f373.png b/images/emoji/1f373.png
deleted file mode 100644
index 918c98057..000000000
--- a/images/emoji/1f373.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f374.png b/images/emoji/1f374.png
deleted file mode 100644
index 09f1feaea..000000000
--- a/images/emoji/1f374.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f375.png b/images/emoji/1f375.png
deleted file mode 100644
index b53b98f0c..000000000
--- a/images/emoji/1f375.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f376.png b/images/emoji/1f376.png
deleted file mode 100644
index 2933f5672..000000000
--- a/images/emoji/1f376.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f377.png b/images/emoji/1f377.png
deleted file mode 100644
index 3cc986891..000000000
--- a/images/emoji/1f377.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f378.png b/images/emoji/1f378.png
deleted file mode 100644
index 2e50c57e9..000000000
--- a/images/emoji/1f378.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f379.png b/images/emoji/1f379.png
deleted file mode 100644
index cd714f81b..000000000
--- a/images/emoji/1f379.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f37a.png b/images/emoji/1f37a.png
deleted file mode 100644
index 894da40a7..000000000
--- a/images/emoji/1f37a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f37b.png b/images/emoji/1f37b.png
deleted file mode 100644
index b55deb66b..000000000
--- a/images/emoji/1f37b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f37c.png b/images/emoji/1f37c.png
deleted file mode 100644
index 2bd105241..000000000
--- a/images/emoji/1f37c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f37d.png b/images/emoji/1f37d.png
deleted file mode 100644
index 7411755f7..000000000
--- a/images/emoji/1f37d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f37f.png b/images/emoji/1f37f.png
deleted file mode 100644
index 573ab05af..000000000
--- a/images/emoji/1f37f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f380.png b/images/emoji/1f380.png
deleted file mode 100644
index 0f253c3d8..000000000
--- a/images/emoji/1f380.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f381.png b/images/emoji/1f381.png
deleted file mode 100644
index 844e21645..000000000
--- a/images/emoji/1f381.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f382.png b/images/emoji/1f382.png
deleted file mode 100644
index 317e9a419..000000000
--- a/images/emoji/1f382.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f383.png b/images/emoji/1f383.png
deleted file mode 100644
index 44c3fc0ae..000000000
--- a/images/emoji/1f383.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f384.png b/images/emoji/1f384.png
deleted file mode 100644
index 4197d37a5..000000000
--- a/images/emoji/1f384.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f385-1f3fb.png b/images/emoji/1f385-1f3fb.png
deleted file mode 100644
index 2052920ab..000000000
--- a/images/emoji/1f385-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f385-1f3fc.png b/images/emoji/1f385-1f3fc.png
deleted file mode 100644
index ec9375e14..000000000
--- a/images/emoji/1f385-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f385-1f3fd.png b/images/emoji/1f385-1f3fd.png
deleted file mode 100644
index d1d16bceb..000000000
--- a/images/emoji/1f385-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f385-1f3fe.png b/images/emoji/1f385-1f3fe.png
deleted file mode 100644
index 1088f1c07..000000000
--- a/images/emoji/1f385-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f385-1f3ff.png b/images/emoji/1f385-1f3ff.png
deleted file mode 100644
index c92daf749..000000000
--- a/images/emoji/1f385-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f385.png b/images/emoji/1f385.png
deleted file mode 100644
index 8bf8757a3..000000000
--- a/images/emoji/1f385.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f386.png b/images/emoji/1f386.png
deleted file mode 100644
index e0a6c6a7c..000000000
--- a/images/emoji/1f386.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f387.png b/images/emoji/1f387.png
deleted file mode 100644
index 30339cd6e..000000000
--- a/images/emoji/1f387.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f388.png b/images/emoji/1f388.png
deleted file mode 100644
index 07916fe6d..000000000
--- a/images/emoji/1f388.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f389.png b/images/emoji/1f389.png
deleted file mode 100644
index 0244d60f2..000000000
--- a/images/emoji/1f389.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f38a.png b/images/emoji/1f38a.png
deleted file mode 100644
index ba4fd9b12..000000000
--- a/images/emoji/1f38a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f38b.png b/images/emoji/1f38b.png
deleted file mode 100644
index 46fcb3a1a..000000000
--- a/images/emoji/1f38b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f38c.png b/images/emoji/1f38c.png
deleted file mode 100644
index 273bd0f0f..000000000
--- a/images/emoji/1f38c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f38d.png b/images/emoji/1f38d.png
deleted file mode 100644
index 769f5ffae..000000000
--- a/images/emoji/1f38d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f38e.png b/images/emoji/1f38e.png
deleted file mode 100644
index 109556151..000000000
--- a/images/emoji/1f38e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f38f.png b/images/emoji/1f38f.png
deleted file mode 100644
index 5443bab90..000000000
--- a/images/emoji/1f38f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f390.png b/images/emoji/1f390.png
deleted file mode 100644
index 3c9ef3a95..000000000
--- a/images/emoji/1f390.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f391.png b/images/emoji/1f391.png
deleted file mode 100644
index 9bdc9d8d7..000000000
--- a/images/emoji/1f391.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f392.png b/images/emoji/1f392.png
deleted file mode 100644
index 9997c86e7..000000000
--- a/images/emoji/1f392.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f393.png b/images/emoji/1f393.png
deleted file mode 100644
index 8b17ddd9d..000000000
--- a/images/emoji/1f393.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f396.png b/images/emoji/1f396.png
deleted file mode 100644
index ecd3fb035..000000000
--- a/images/emoji/1f396.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f397.png b/images/emoji/1f397.png
deleted file mode 100644
index 3988bbd09..000000000
--- a/images/emoji/1f397.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f399.png b/images/emoji/1f399.png
deleted file mode 100644
index cd9167654..000000000
--- a/images/emoji/1f399.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f39a.png b/images/emoji/1f39a.png
deleted file mode 100644
index 720a3b341..000000000
--- a/images/emoji/1f39a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f39b.png b/images/emoji/1f39b.png
deleted file mode 100644
index 6635ac93b..000000000
--- a/images/emoji/1f39b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f39e.png b/images/emoji/1f39e.png
deleted file mode 100644
index 30143aedb..000000000
--- a/images/emoji/1f39e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f39f.png b/images/emoji/1f39f.png
deleted file mode 100644
index e510f4a7a..000000000
--- a/images/emoji/1f39f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3a0.png b/images/emoji/1f3a0.png
deleted file mode 100644
index a17074edf..000000000
--- a/images/emoji/1f3a0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3a1.png b/images/emoji/1f3a1.png
deleted file mode 100644
index 55c8ff047..000000000
--- a/images/emoji/1f3a1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3a2.png b/images/emoji/1f3a2.png
deleted file mode 100644
index 7d187be0c..000000000
--- a/images/emoji/1f3a2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3a3.png b/images/emoji/1f3a3.png
deleted file mode 100644
index dfcdf07eb..000000000
--- a/images/emoji/1f3a3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3a4.png b/images/emoji/1f3a4.png
deleted file mode 100644
index d4e6b0def..000000000
--- a/images/emoji/1f3a4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3a5.png b/images/emoji/1f3a5.png
deleted file mode 100644
index 4e73b1301..000000000
--- a/images/emoji/1f3a5.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3a6.png b/images/emoji/1f3a6.png
deleted file mode 100644
index 65f27b386..000000000
--- a/images/emoji/1f3a6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3a7.png b/images/emoji/1f3a7.png
deleted file mode 100644
index e9fd34041..000000000
--- a/images/emoji/1f3a7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3a8.png b/images/emoji/1f3a8.png
deleted file mode 100644
index bd6afe9ff..000000000
--- a/images/emoji/1f3a8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3a9.png b/images/emoji/1f3a9.png
deleted file mode 100644
index 131b657b1..000000000
--- a/images/emoji/1f3a9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3aa.png b/images/emoji/1f3aa.png
deleted file mode 100644
index b0379775b..000000000
--- a/images/emoji/1f3aa.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3ab.png b/images/emoji/1f3ab.png
deleted file mode 100644
index 605936bb6..000000000
--- a/images/emoji/1f3ab.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3ac.png b/images/emoji/1f3ac.png
deleted file mode 100644
index 813908831..000000000
--- a/images/emoji/1f3ac.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3ad.png b/images/emoji/1f3ad.png
deleted file mode 100644
index 685441fda..000000000
--- a/images/emoji/1f3ad.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3ae.png b/images/emoji/1f3ae.png
deleted file mode 100644
index 316a9106a..000000000
--- a/images/emoji/1f3ae.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3af.png b/images/emoji/1f3af.png
deleted file mode 100644
index f6704aeb8..000000000
--- a/images/emoji/1f3af.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3b0.png b/images/emoji/1f3b0.png
deleted file mode 100644
index ee71b6c26..000000000
--- a/images/emoji/1f3b0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3b1.png b/images/emoji/1f3b1.png
deleted file mode 100644
index 38ca662ed..000000000
--- a/images/emoji/1f3b1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3b2.png b/images/emoji/1f3b2.png
deleted file mode 100644
index ad3626fe5..000000000
--- a/images/emoji/1f3b2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3b3.png b/images/emoji/1f3b3.png
deleted file mode 100644
index 63add89e5..000000000
--- a/images/emoji/1f3b3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3b4.png b/images/emoji/1f3b4.png
deleted file mode 100644
index 6766b044d..000000000
--- a/images/emoji/1f3b4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3b5.png b/images/emoji/1f3b5.png
deleted file mode 100644
index 06691ef61..000000000
--- a/images/emoji/1f3b5.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3b6.png b/images/emoji/1f3b6.png
deleted file mode 100644
index 57d499aa1..000000000
--- a/images/emoji/1f3b6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3b7.png b/images/emoji/1f3b7.png
deleted file mode 100644
index a392faec2..000000000
--- a/images/emoji/1f3b7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3b8.png b/images/emoji/1f3b8.png
deleted file mode 100644
index 43d752f1e..000000000
--- a/images/emoji/1f3b8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3b9.png b/images/emoji/1f3b9.png
deleted file mode 100644
index 442b74568..000000000
--- a/images/emoji/1f3b9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3ba.png b/images/emoji/1f3ba.png
deleted file mode 100644
index 87674cf78..000000000
--- a/images/emoji/1f3ba.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3bb.png b/images/emoji/1f3bb.png
deleted file mode 100644
index e1e76cce2..000000000
--- a/images/emoji/1f3bb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3bc.png b/images/emoji/1f3bc.png
deleted file mode 100644
index 47dc05a8e..000000000
--- a/images/emoji/1f3bc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3bd.png b/images/emoji/1f3bd.png
deleted file mode 100644
index 6d83c06b8..000000000
--- a/images/emoji/1f3bd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3be.png b/images/emoji/1f3be.png
deleted file mode 100644
index 7e68ba8f3..000000000
--- a/images/emoji/1f3be.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3bf.png b/images/emoji/1f3bf.png
deleted file mode 100644
index 4a2d2c123..000000000
--- a/images/emoji/1f3bf.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3c0.png b/images/emoji/1f3c0.png
deleted file mode 100644
index 64c76b79c..000000000
--- a/images/emoji/1f3c0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3c1.png b/images/emoji/1f3c1.png
deleted file mode 100644
index 5a71eecb8..000000000
--- a/images/emoji/1f3c1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3c2.png b/images/emoji/1f3c2.png
deleted file mode 100644
index 6361c0f2c..000000000
--- a/images/emoji/1f3c2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3c3-1f3fb.png b/images/emoji/1f3c3-1f3fb.png
deleted file mode 100644
index 9355239a5..000000000
--- a/images/emoji/1f3c3-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3c3-1f3fc.png b/images/emoji/1f3c3-1f3fc.png
deleted file mode 100644
index 6112fd5c3..000000000
--- a/images/emoji/1f3c3-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3c3-1f3fd.png b/images/emoji/1f3c3-1f3fd.png
deleted file mode 100644
index 625ec708f..000000000
--- a/images/emoji/1f3c3-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3c3-1f3fe.png b/images/emoji/1f3c3-1f3fe.png
deleted file mode 100644
index 242f1b563..000000000
--- a/images/emoji/1f3c3-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3c3-1f3ff.png b/images/emoji/1f3c3-1f3ff.png
deleted file mode 100644
index 2976c6f01..000000000
--- a/images/emoji/1f3c3-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3c3.png b/images/emoji/1f3c3.png
deleted file mode 100644
index e91491597..000000000
--- a/images/emoji/1f3c3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3c4-1f3fb.png b/images/emoji/1f3c4-1f3fb.png
deleted file mode 100644
index b5faaa524..000000000
--- a/images/emoji/1f3c4-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3c4-1f3fc.png b/images/emoji/1f3c4-1f3fc.png
deleted file mode 100644
index 6d92e412f..000000000
--- a/images/emoji/1f3c4-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3c4-1f3fd.png b/images/emoji/1f3c4-1f3fd.png
deleted file mode 100644
index f05ef5949..000000000
--- a/images/emoji/1f3c4-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3c4-1f3fe.png b/images/emoji/1f3c4-1f3fe.png
deleted file mode 100644
index 35e143d19..000000000
--- a/images/emoji/1f3c4-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3c4-1f3ff.png b/images/emoji/1f3c4-1f3ff.png
deleted file mode 100644
index 38917658e..000000000
--- a/images/emoji/1f3c4-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3c4.png b/images/emoji/1f3c4.png
deleted file mode 100644
index 3ab017adf..000000000
--- a/images/emoji/1f3c4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3c5.png b/images/emoji/1f3c5.png
deleted file mode 100644
index 09718d001..000000000
--- a/images/emoji/1f3c5.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3c6.png b/images/emoji/1f3c6.png
deleted file mode 100644
index ac2895c18..000000000
--- a/images/emoji/1f3c6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3c7-1f3fb.png b/images/emoji/1f3c7-1f3fb.png
deleted file mode 100644
index e9bf4092e..000000000
--- a/images/emoji/1f3c7-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3c7-1f3fc.png b/images/emoji/1f3c7-1f3fc.png
deleted file mode 100644
index 031bbc3d8..000000000
--- a/images/emoji/1f3c7-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3c7-1f3fd.png b/images/emoji/1f3c7-1f3fd.png
deleted file mode 100644
index b40ef891f..000000000
--- a/images/emoji/1f3c7-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3c7-1f3fe.png b/images/emoji/1f3c7-1f3fe.png
deleted file mode 100644
index e286cb850..000000000
--- a/images/emoji/1f3c7-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3c7-1f3ff.png b/images/emoji/1f3c7-1f3ff.png
deleted file mode 100644
index 453c51c60..000000000
--- a/images/emoji/1f3c7-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3c7.png b/images/emoji/1f3c7.png
deleted file mode 100644
index addf9edac..000000000
--- a/images/emoji/1f3c7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3c8.png b/images/emoji/1f3c8.png
deleted file mode 100644
index 909ddf95d..000000000
--- a/images/emoji/1f3c8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3c9.png b/images/emoji/1f3c9.png
deleted file mode 100644
index 659e134f7..000000000
--- a/images/emoji/1f3c9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3ca-1f3fb.png b/images/emoji/1f3ca-1f3fb.png
deleted file mode 100644
index 38441c9ca..000000000
--- a/images/emoji/1f3ca-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3ca-1f3fc.png b/images/emoji/1f3ca-1f3fc.png
deleted file mode 100644
index b0d431124..000000000
--- a/images/emoji/1f3ca-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3ca-1f3fd.png b/images/emoji/1f3ca-1f3fd.png
deleted file mode 100644
index 211e77e2a..000000000
--- a/images/emoji/1f3ca-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3ca-1f3fe.png b/images/emoji/1f3ca-1f3fe.png
deleted file mode 100644
index f34c34db9..000000000
--- a/images/emoji/1f3ca-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3ca-1f3ff.png b/images/emoji/1f3ca-1f3ff.png
deleted file mode 100644
index 3e9231ff8..000000000
--- a/images/emoji/1f3ca-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3ca.png b/images/emoji/1f3ca.png
deleted file mode 100644
index 55b4d72f9..000000000
--- a/images/emoji/1f3ca.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3cb-1f3fb.png b/images/emoji/1f3cb-1f3fb.png
deleted file mode 100644
index febaad123..000000000
--- a/images/emoji/1f3cb-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3cb-1f3fc.png b/images/emoji/1f3cb-1f3fc.png
deleted file mode 100644
index 27ae794a1..000000000
--- a/images/emoji/1f3cb-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3cb-1f3fd.png b/images/emoji/1f3cb-1f3fd.png
deleted file mode 100644
index 45c4c22c7..000000000
--- a/images/emoji/1f3cb-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3cb-1f3fe.png b/images/emoji/1f3cb-1f3fe.png
deleted file mode 100644
index 67dd21d24..000000000
--- a/images/emoji/1f3cb-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3cb-1f3ff.png b/images/emoji/1f3cb-1f3ff.png
deleted file mode 100644
index fa0152038..000000000
--- a/images/emoji/1f3cb-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3cb.png b/images/emoji/1f3cb.png
deleted file mode 100644
index afdeaa476..000000000
--- a/images/emoji/1f3cb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3cc.png b/images/emoji/1f3cc.png
deleted file mode 100644
index 39c552de8..000000000
--- a/images/emoji/1f3cc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3cd.png b/images/emoji/1f3cd.png
deleted file mode 100644
index 3d1d567e8..000000000
--- a/images/emoji/1f3cd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3ce.png b/images/emoji/1f3ce.png
deleted file mode 100644
index fe3f045f4..000000000
--- a/images/emoji/1f3ce.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3cf.png b/images/emoji/1f3cf.png
deleted file mode 100644
index d602294a2..000000000
--- a/images/emoji/1f3cf.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3d0.png b/images/emoji/1f3d0.png
deleted file mode 100644
index ce89e6d74..000000000
--- a/images/emoji/1f3d0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3d1.png b/images/emoji/1f3d1.png
deleted file mode 100644
index 839637716..000000000
--- a/images/emoji/1f3d1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3d2.png b/images/emoji/1f3d2.png
deleted file mode 100644
index be94e9cbf..000000000
--- a/images/emoji/1f3d2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3d3.png b/images/emoji/1f3d3.png
deleted file mode 100644
index ff3c51727..000000000
--- a/images/emoji/1f3d3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3d4.png b/images/emoji/1f3d4.png
deleted file mode 100644
index f63a205dc..000000000
--- a/images/emoji/1f3d4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3d5.png b/images/emoji/1f3d5.png
deleted file mode 100644
index 7da5a756e..000000000
--- a/images/emoji/1f3d5.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3d6.png b/images/emoji/1f3d6.png
deleted file mode 100644
index 69108c8ea..000000000
--- a/images/emoji/1f3d6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3d7.png b/images/emoji/1f3d7.png
deleted file mode 100644
index 8206a20f6..000000000
--- a/images/emoji/1f3d7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3d8.png b/images/emoji/1f3d8.png
deleted file mode 100644
index 6ab4a2a26..000000000
--- a/images/emoji/1f3d8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3d9.png b/images/emoji/1f3d9.png
deleted file mode 100644
index d7b9844a0..000000000
--- a/images/emoji/1f3d9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3da.png b/images/emoji/1f3da.png
deleted file mode 100644
index c55e81de9..000000000
--- a/images/emoji/1f3da.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3db.png b/images/emoji/1f3db.png
deleted file mode 100644
index de7b559da..000000000
--- a/images/emoji/1f3db.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3dc.png b/images/emoji/1f3dc.png
deleted file mode 100644
index e9966ff8c..000000000
--- a/images/emoji/1f3dc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3dd.png b/images/emoji/1f3dd.png
deleted file mode 100644
index 7fd834389..000000000
--- a/images/emoji/1f3dd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3de.png b/images/emoji/1f3de.png
deleted file mode 100644
index 63ec70163..000000000
--- a/images/emoji/1f3de.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3df.png b/images/emoji/1f3df.png
deleted file mode 100644
index 1fee9a34b..000000000
--- a/images/emoji/1f3df.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3e0.png b/images/emoji/1f3e0.png
deleted file mode 100644
index 01c98a0ba..000000000
--- a/images/emoji/1f3e0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3e1.png b/images/emoji/1f3e1.png
deleted file mode 100644
index 1a276d153..000000000
--- a/images/emoji/1f3e1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3e2.png b/images/emoji/1f3e2.png
deleted file mode 100644
index 7eee927d1..000000000
--- a/images/emoji/1f3e2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3e3.png b/images/emoji/1f3e3.png
deleted file mode 100644
index a23848f9a..000000000
--- a/images/emoji/1f3e3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3e4.png b/images/emoji/1f3e4.png
deleted file mode 100644
index 3745aff8d..000000000
--- a/images/emoji/1f3e4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3e5.png b/images/emoji/1f3e5.png
deleted file mode 100644
index 1cbce4ae7..000000000
--- a/images/emoji/1f3e5.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3e6.png b/images/emoji/1f3e6.png
deleted file mode 100644
index dffdcef36..000000000
--- a/images/emoji/1f3e6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3e7.png b/images/emoji/1f3e7.png
deleted file mode 100644
index 4d935307b..000000000
--- a/images/emoji/1f3e7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3e8.png b/images/emoji/1f3e8.png
deleted file mode 100644
index ea8f4c497..000000000
--- a/images/emoji/1f3e8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3e9.png b/images/emoji/1f3e9.png
deleted file mode 100644
index 5e136be6f..000000000
--- a/images/emoji/1f3e9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3ea.png b/images/emoji/1f3ea.png
deleted file mode 100644
index 26b53b566..000000000
--- a/images/emoji/1f3ea.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3eb.png b/images/emoji/1f3eb.png
deleted file mode 100644
index 269759534..000000000
--- a/images/emoji/1f3eb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3ec.png b/images/emoji/1f3ec.png
deleted file mode 100644
index 58867c7a6..000000000
--- a/images/emoji/1f3ec.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3ed.png b/images/emoji/1f3ed.png
deleted file mode 100644
index e1d2ddf4a..000000000
--- a/images/emoji/1f3ed.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3ee.png b/images/emoji/1f3ee.png
deleted file mode 100644
index 97cf5dbe1..000000000
--- a/images/emoji/1f3ee.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3ef.png b/images/emoji/1f3ef.png
deleted file mode 100644
index 64b4e33a1..000000000
--- a/images/emoji/1f3ef.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3f0.png b/images/emoji/1f3f0.png
deleted file mode 100644
index 888d11332..000000000
--- a/images/emoji/1f3f0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3f3.png b/images/emoji/1f3f3.png
deleted file mode 100644
index 86d6e96d5..000000000
--- a/images/emoji/1f3f3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3f4.png b/images/emoji/1f3f4.png
deleted file mode 100644
index 0e28d05d5..000000000
--- a/images/emoji/1f3f4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3f5.png b/images/emoji/1f3f5.png
deleted file mode 100644
index 8030e494b..000000000
--- a/images/emoji/1f3f5.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3f7.png b/images/emoji/1f3f7.png
deleted file mode 100644
index d41c9b4f1..000000000
--- a/images/emoji/1f3f7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3f8.png b/images/emoji/1f3f8.png
deleted file mode 100644
index e0af4d99b..000000000
--- a/images/emoji/1f3f8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3f9.png b/images/emoji/1f3f9.png
deleted file mode 100644
index 6a538bf47..000000000
--- a/images/emoji/1f3f9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3fa.png b/images/emoji/1f3fa.png
deleted file mode 100644
index 96de50560..000000000
--- a/images/emoji/1f3fa.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f400.png b/images/emoji/1f400.png
deleted file mode 100644
index 86219144f..000000000
--- a/images/emoji/1f400.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f401.png b/images/emoji/1f401.png
deleted file mode 100644
index 20fb041f0..000000000
--- a/images/emoji/1f401.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f402.png b/images/emoji/1f402.png
deleted file mode 100644
index badf5708f..000000000
--- a/images/emoji/1f402.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f403.png b/images/emoji/1f403.png
deleted file mode 100644
index 80446615c..000000000
--- a/images/emoji/1f403.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f404.png b/images/emoji/1f404.png
deleted file mode 100644
index 4d0ca534f..000000000
--- a/images/emoji/1f404.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f405.png b/images/emoji/1f405.png
deleted file mode 100644
index 871a8b74d..000000000
--- a/images/emoji/1f405.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f406.png b/images/emoji/1f406.png
deleted file mode 100644
index 8aac3d494..000000000
--- a/images/emoji/1f406.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f407.png b/images/emoji/1f407.png
deleted file mode 100644
index 2c8a29c64..000000000
--- a/images/emoji/1f407.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f408.png b/images/emoji/1f408.png
deleted file mode 100644
index 46abe8cbc..000000000
--- a/images/emoji/1f408.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f409.png b/images/emoji/1f409.png
deleted file mode 100644
index e298d2f6c..000000000
--- a/images/emoji/1f409.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f40a.png b/images/emoji/1f40a.png
deleted file mode 100644
index 3005c46f1..000000000
--- a/images/emoji/1f40a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f40b.png b/images/emoji/1f40b.png
deleted file mode 100644
index 0df9d3c73..000000000
--- a/images/emoji/1f40b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f40c.png b/images/emoji/1f40c.png
deleted file mode 100644
index f4ea071e2..000000000
--- a/images/emoji/1f40c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f40d.png b/images/emoji/1f40d.png
deleted file mode 100644
index f041d3b2e..000000000
--- a/images/emoji/1f40d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f40e.png b/images/emoji/1f40e.png
deleted file mode 100644
index 0b4d8903c..000000000
--- a/images/emoji/1f40e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f40f.png b/images/emoji/1f40f.png
deleted file mode 100644
index 52a44464c..000000000
--- a/images/emoji/1f40f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f410.png b/images/emoji/1f410.png
deleted file mode 100644
index f9d9e38a1..000000000
--- a/images/emoji/1f410.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f411.png b/images/emoji/1f411.png
deleted file mode 100644
index eea1f2f8d..000000000
--- a/images/emoji/1f411.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f412.png b/images/emoji/1f412.png
deleted file mode 100644
index 65042c09f..000000000
--- a/images/emoji/1f412.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f413.png b/images/emoji/1f413.png
deleted file mode 100644
index bbf2bbff9..000000000
--- a/images/emoji/1f413.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f414.png b/images/emoji/1f414.png
deleted file mode 100644
index 9a6992e55..000000000
--- a/images/emoji/1f414.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f415.png b/images/emoji/1f415.png
deleted file mode 100644
index 976143dbd..000000000
--- a/images/emoji/1f415.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f416.png b/images/emoji/1f416.png
deleted file mode 100644
index 5f31c1a2d..000000000
--- a/images/emoji/1f416.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f417.png b/images/emoji/1f417.png
deleted file mode 100644
index 3073bf026..000000000
--- a/images/emoji/1f417.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f418.png b/images/emoji/1f418.png
deleted file mode 100644
index b8a6d1405..000000000
--- a/images/emoji/1f418.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f419.png b/images/emoji/1f419.png
deleted file mode 100644
index 72c84074a..000000000
--- a/images/emoji/1f419.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f41a.png b/images/emoji/1f41a.png
deleted file mode 100644
index 55721629f..000000000
--- a/images/emoji/1f41a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f41b.png b/images/emoji/1f41b.png
deleted file mode 100644
index c9a00cf3e..000000000
--- a/images/emoji/1f41b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f41c.png b/images/emoji/1f41c.png
deleted file mode 100644
index 994127ed6..000000000
--- a/images/emoji/1f41c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f41d.png b/images/emoji/1f41d.png
deleted file mode 100644
index 6bf6f67e1..000000000
--- a/images/emoji/1f41d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f41e.png b/images/emoji/1f41e.png
deleted file mode 100644
index 3d93174d7..000000000
--- a/images/emoji/1f41e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f41f.png b/images/emoji/1f41f.png
deleted file mode 100644
index c2d2faaac..000000000
--- a/images/emoji/1f41f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f420.png b/images/emoji/1f420.png
deleted file mode 100644
index 252105235..000000000
--- a/images/emoji/1f420.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f421.png b/images/emoji/1f421.png
deleted file mode 100644
index 2939344a5..000000000
--- a/images/emoji/1f421.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f422.png b/images/emoji/1f422.png
deleted file mode 100644
index 46f59337b..000000000
--- a/images/emoji/1f422.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f423.png b/images/emoji/1f423.png
deleted file mode 100644
index 56515ad34..000000000
--- a/images/emoji/1f423.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f424.png b/images/emoji/1f424.png
deleted file mode 100644
index dccd96576..000000000
--- a/images/emoji/1f424.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f425.png b/images/emoji/1f425.png
deleted file mode 100644
index 31dfb511e..000000000
--- a/images/emoji/1f425.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f426.png b/images/emoji/1f426.png
deleted file mode 100644
index e201c22be..000000000
--- a/images/emoji/1f426.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f427.png b/images/emoji/1f427.png
deleted file mode 100644
index c0064fb97..000000000
--- a/images/emoji/1f427.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f428.png b/images/emoji/1f428.png
deleted file mode 100644
index c846cd223..000000000
--- a/images/emoji/1f428.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f429.png b/images/emoji/1f429.png
deleted file mode 100644
index 8ec39e396..000000000
--- a/images/emoji/1f429.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f42a.png b/images/emoji/1f42a.png
deleted file mode 100644
index 5271637c7..000000000
--- a/images/emoji/1f42a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f42b.png b/images/emoji/1f42b.png
deleted file mode 100644
index b421d07a8..000000000
--- a/images/emoji/1f42b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f42c.png b/images/emoji/1f42c.png
deleted file mode 100644
index c2a914f59..000000000
--- a/images/emoji/1f42c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f42d.png b/images/emoji/1f42d.png
deleted file mode 100644
index a52c8414f..000000000
--- a/images/emoji/1f42d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f42e.png b/images/emoji/1f42e.png
deleted file mode 100644
index 602495bd9..000000000
--- a/images/emoji/1f42e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f42f.png b/images/emoji/1f42f.png
deleted file mode 100644
index a4d3ef086..000000000
--- a/images/emoji/1f42f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f430.png b/images/emoji/1f430.png
deleted file mode 100644
index 20c67d11b..000000000
--- a/images/emoji/1f430.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f431.png b/images/emoji/1f431.png
deleted file mode 100644
index 10e20b530..000000000
--- a/images/emoji/1f431.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f432.png b/images/emoji/1f432.png
deleted file mode 100644
index 3c2720446..000000000
--- a/images/emoji/1f432.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f433.png b/images/emoji/1f433.png
deleted file mode 100644
index c2f52b443..000000000
--- a/images/emoji/1f433.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f434.png b/images/emoji/1f434.png
deleted file mode 100644
index f4f45047c..000000000
--- a/images/emoji/1f434.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f435.png b/images/emoji/1f435.png
deleted file mode 100644
index fe49a5467..000000000
--- a/images/emoji/1f435.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f436.png b/images/emoji/1f436.png
deleted file mode 100644
index 4a5b7b859..000000000
--- a/images/emoji/1f436.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f437.png b/images/emoji/1f437.png
deleted file mode 100644
index afe05ca16..000000000
--- a/images/emoji/1f437.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f438.png b/images/emoji/1f438.png
deleted file mode 100644
index 8825d1ad5..000000000
--- a/images/emoji/1f438.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f439.png b/images/emoji/1f439.png
deleted file mode 100644
index 376c36b0a..000000000
--- a/images/emoji/1f439.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f43a.png b/images/emoji/1f43a.png
deleted file mode 100644
index ba7220f2d..000000000
--- a/images/emoji/1f43a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f43b.png b/images/emoji/1f43b.png
deleted file mode 100644
index 272d56bbb..000000000
--- a/images/emoji/1f43b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f43c.png b/images/emoji/1f43c.png
deleted file mode 100644
index 978382775..000000000
--- a/images/emoji/1f43c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f43d.png b/images/emoji/1f43d.png
deleted file mode 100644
index 3610ae4a9..000000000
--- a/images/emoji/1f43d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f43e.png b/images/emoji/1f43e.png
deleted file mode 100644
index 5fe568cee..000000000
--- a/images/emoji/1f43e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f43f.png b/images/emoji/1f43f.png
deleted file mode 100644
index a9ab60f51..000000000
--- a/images/emoji/1f43f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f440.png b/images/emoji/1f440.png
deleted file mode 100644
index 2102ada7e..000000000
--- a/images/emoji/1f440.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f441-1f5e8.png b/images/emoji/1f441-1f5e8.png
deleted file mode 100644
index 21bd22bbc..000000000
--- a/images/emoji/1f441-1f5e8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f441.png b/images/emoji/1f441.png
deleted file mode 100644
index 9d989cdd3..000000000
--- a/images/emoji/1f441.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f442-1f3fb.png b/images/emoji/1f442-1f3fb.png
deleted file mode 100644
index d09e1e419..000000000
--- a/images/emoji/1f442-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f442-1f3fc.png b/images/emoji/1f442-1f3fc.png
deleted file mode 100644
index 300d60a99..000000000
--- a/images/emoji/1f442-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f442-1f3fd.png b/images/emoji/1f442-1f3fd.png
deleted file mode 100644
index 2a56eebe4..000000000
--- a/images/emoji/1f442-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f442-1f3fe.png b/images/emoji/1f442-1f3fe.png
deleted file mode 100644
index bd270f776..000000000
--- a/images/emoji/1f442-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f442-1f3ff.png b/images/emoji/1f442-1f3ff.png
deleted file mode 100644
index b96bb441d..000000000
--- a/images/emoji/1f442-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f442.png b/images/emoji/1f442.png
deleted file mode 100644
index f84f9ff15..000000000
--- a/images/emoji/1f442.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f443-1f3fb.png b/images/emoji/1f443-1f3fb.png
deleted file mode 100644
index 8008d1750..000000000
--- a/images/emoji/1f443-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f443-1f3fc.png b/images/emoji/1f443-1f3fc.png
deleted file mode 100644
index ac17f26e8..000000000
--- a/images/emoji/1f443-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f443-1f3fd.png b/images/emoji/1f443-1f3fd.png
deleted file mode 100644
index d8b6cbe0f..000000000
--- a/images/emoji/1f443-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f443-1f3fe.png b/images/emoji/1f443-1f3fe.png
deleted file mode 100644
index 004b2631e..000000000
--- a/images/emoji/1f443-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f443-1f3ff.png b/images/emoji/1f443-1f3ff.png
deleted file mode 100644
index 7b33821f6..000000000
--- a/images/emoji/1f443-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f443.png b/images/emoji/1f443.png
deleted file mode 100644
index 2f04ac5f9..000000000
--- a/images/emoji/1f443.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f444.png b/images/emoji/1f444.png
deleted file mode 100644
index 35f3cc200..000000000
--- a/images/emoji/1f444.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f445.png b/images/emoji/1f445.png
deleted file mode 100644
index 70ce9c122..000000000
--- a/images/emoji/1f445.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f446-1f3fb.png b/images/emoji/1f446-1f3fb.png
deleted file mode 100644
index a12a7e784..000000000
--- a/images/emoji/1f446-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f446-1f3fc.png b/images/emoji/1f446-1f3fc.png
deleted file mode 100644
index cdff40cea..000000000
--- a/images/emoji/1f446-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f446-1f3fd.png b/images/emoji/1f446-1f3fd.png
deleted file mode 100644
index a07ce9e5a..000000000
--- a/images/emoji/1f446-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f446-1f3fe.png b/images/emoji/1f446-1f3fe.png
deleted file mode 100644
index 4f86c88ba..000000000
--- a/images/emoji/1f446-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f446-1f3ff.png b/images/emoji/1f446-1f3ff.png
deleted file mode 100644
index ed1b26c35..000000000
--- a/images/emoji/1f446-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f446.png b/images/emoji/1f446.png
deleted file mode 100644
index bc496dfea..000000000
--- a/images/emoji/1f446.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f447-1f3fb.png b/images/emoji/1f447-1f3fb.png
deleted file mode 100644
index 140f157d8..000000000
--- a/images/emoji/1f447-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f447-1f3fc.png b/images/emoji/1f447-1f3fc.png
deleted file mode 100644
index d518544f7..000000000
--- a/images/emoji/1f447-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f447-1f3fd.png b/images/emoji/1f447-1f3fd.png
deleted file mode 100644
index 018b688b8..000000000
--- a/images/emoji/1f447-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f447-1f3fe.png b/images/emoji/1f447-1f3fe.png
deleted file mode 100644
index 98845bf6f..000000000
--- a/images/emoji/1f447-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f447-1f3ff.png b/images/emoji/1f447-1f3ff.png
deleted file mode 100644
index 9a9b039a9..000000000
--- a/images/emoji/1f447-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f447.png b/images/emoji/1f447.png
deleted file mode 100644
index 00d3d13ab..000000000
--- a/images/emoji/1f447.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f448-1f3fb.png b/images/emoji/1f448-1f3fb.png
deleted file mode 100644
index 88e2c3060..000000000
--- a/images/emoji/1f448-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f448-1f3fc.png b/images/emoji/1f448-1f3fc.png
deleted file mode 100644
index d3c89d87c..000000000
--- a/images/emoji/1f448-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f448-1f3fd.png b/images/emoji/1f448-1f3fd.png
deleted file mode 100644
index b23b91673..000000000
--- a/images/emoji/1f448-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f448-1f3fe.png b/images/emoji/1f448-1f3fe.png
deleted file mode 100644
index 3093f325c..000000000
--- a/images/emoji/1f448-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f448-1f3ff.png b/images/emoji/1f448-1f3ff.png
deleted file mode 100644
index 2b4cbfa12..000000000
--- a/images/emoji/1f448-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f448.png b/images/emoji/1f448.png
deleted file mode 100644
index 599fa2e3c..000000000
--- a/images/emoji/1f448.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f449-1f3fb.png b/images/emoji/1f449-1f3fb.png
deleted file mode 100644
index 4a28c6bbc..000000000
--- a/images/emoji/1f449-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f449-1f3fc.png b/images/emoji/1f449-1f3fc.png
deleted file mode 100644
index 7cb132317..000000000
--- a/images/emoji/1f449-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f449-1f3fd.png b/images/emoji/1f449-1f3fd.png
deleted file mode 100644
index 5514807d7..000000000
--- a/images/emoji/1f449-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f449-1f3fe.png b/images/emoji/1f449-1f3fe.png
deleted file mode 100644
index b8541d644..000000000
--- a/images/emoji/1f449-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f449-1f3ff.png b/images/emoji/1f449-1f3ff.png
deleted file mode 100644
index 1b7aab07b..000000000
--- a/images/emoji/1f449-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f449.png b/images/emoji/1f449.png
deleted file mode 100644
index 93a3cd34a..000000000
--- a/images/emoji/1f449.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44a-1f3fb.png b/images/emoji/1f44a-1f3fb.png
deleted file mode 100644
index 93c7d17fb..000000000
--- a/images/emoji/1f44a-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44a-1f3fc.png b/images/emoji/1f44a-1f3fc.png
deleted file mode 100644
index c0a1af6e1..000000000
--- a/images/emoji/1f44a-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44a-1f3fd.png b/images/emoji/1f44a-1f3fd.png
deleted file mode 100644
index 1458b0212..000000000
--- a/images/emoji/1f44a-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44a-1f3fe.png b/images/emoji/1f44a-1f3fe.png
deleted file mode 100644
index c1466bfcd..000000000
--- a/images/emoji/1f44a-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44a-1f3ff.png b/images/emoji/1f44a-1f3ff.png
deleted file mode 100644
index 00b4ddb89..000000000
--- a/images/emoji/1f44a-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44a.png b/images/emoji/1f44a.png
deleted file mode 100644
index b14ca5f52..000000000
--- a/images/emoji/1f44a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44b-1f3fb.png b/images/emoji/1f44b-1f3fb.png
deleted file mode 100644
index beea09dda..000000000
--- a/images/emoji/1f44b-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44b-1f3fc.png b/images/emoji/1f44b-1f3fc.png
deleted file mode 100644
index a7679d5fe..000000000
--- a/images/emoji/1f44b-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44b-1f3fd.png b/images/emoji/1f44b-1f3fd.png
deleted file mode 100644
index 6283b670f..000000000
--- a/images/emoji/1f44b-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44b-1f3fe.png b/images/emoji/1f44b-1f3fe.png
deleted file mode 100644
index b771b52c3..000000000
--- a/images/emoji/1f44b-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44b-1f3ff.png b/images/emoji/1f44b-1f3ff.png
deleted file mode 100644
index 6bbedc9b5..000000000
--- a/images/emoji/1f44b-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44b.png b/images/emoji/1f44b.png
deleted file mode 100644
index 02ae68b85..000000000
--- a/images/emoji/1f44b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44c-1f3fb.png b/images/emoji/1f44c-1f3fb.png
deleted file mode 100644
index cecf7b2ab..000000000
--- a/images/emoji/1f44c-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44c-1f3fc.png b/images/emoji/1f44c-1f3fc.png
deleted file mode 100644
index c19239bcd..000000000
--- a/images/emoji/1f44c-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44c-1f3fd.png b/images/emoji/1f44c-1f3fd.png
deleted file mode 100644
index 94b65b03e..000000000
--- a/images/emoji/1f44c-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44c-1f3fe.png b/images/emoji/1f44c-1f3fe.png
deleted file mode 100644
index 03d26f08e..000000000
--- a/images/emoji/1f44c-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44c-1f3ff.png b/images/emoji/1f44c-1f3ff.png
deleted file mode 100644
index d4b240863..000000000
--- a/images/emoji/1f44c-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44c.png b/images/emoji/1f44c.png
deleted file mode 100644
index 028d69b0d..000000000
--- a/images/emoji/1f44c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44d-1f3fb.png b/images/emoji/1f44d-1f3fb.png
deleted file mode 100644
index 39684cd5c..000000000
--- a/images/emoji/1f44d-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44d-1f3fc.png b/images/emoji/1f44d-1f3fc.png
deleted file mode 100644
index a9b597235..000000000
--- a/images/emoji/1f44d-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44d-1f3fd.png b/images/emoji/1f44d-1f3fd.png
deleted file mode 100644
index c5e291670..000000000
--- a/images/emoji/1f44d-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44d-1f3fe.png b/images/emoji/1f44d-1f3fe.png
deleted file mode 100644
index 5bf4857a8..000000000
--- a/images/emoji/1f44d-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44d-1f3ff.png b/images/emoji/1f44d-1f3ff.png
deleted file mode 100644
index d829f787c..000000000
--- a/images/emoji/1f44d-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44d.png b/images/emoji/1f44d.png
deleted file mode 100644
index f9e6f13a3..000000000
--- a/images/emoji/1f44d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44e-1f3fb.png b/images/emoji/1f44e-1f3fb.png
deleted file mode 100644
index a1631af8e..000000000
--- a/images/emoji/1f44e-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44e-1f3fc.png b/images/emoji/1f44e-1f3fc.png
deleted file mode 100644
index 85fff82d5..000000000
--- a/images/emoji/1f44e-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44e-1f3fd.png b/images/emoji/1f44e-1f3fd.png
deleted file mode 100644
index eeba3be80..000000000
--- a/images/emoji/1f44e-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44e-1f3fe.png b/images/emoji/1f44e-1f3fe.png
deleted file mode 100644
index 1addafdae..000000000
--- a/images/emoji/1f44e-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44e-1f3ff.png b/images/emoji/1f44e-1f3ff.png
deleted file mode 100644
index 37ec07b57..000000000
--- a/images/emoji/1f44e-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44e.png b/images/emoji/1f44e.png
deleted file mode 100644
index b63da2f20..000000000
--- a/images/emoji/1f44e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44f-1f3fb.png b/images/emoji/1f44f-1f3fb.png
deleted file mode 100644
index 770aa9ca0..000000000
--- a/images/emoji/1f44f-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44f-1f3fc.png b/images/emoji/1f44f-1f3fc.png
deleted file mode 100644
index 37c6b559a..000000000
--- a/images/emoji/1f44f-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44f-1f3fd.png b/images/emoji/1f44f-1f3fd.png
deleted file mode 100644
index e95bf2fc7..000000000
--- a/images/emoji/1f44f-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44f-1f3fe.png b/images/emoji/1f44f-1f3fe.png
deleted file mode 100644
index b6e9a9160..000000000
--- a/images/emoji/1f44f-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44f-1f3ff.png b/images/emoji/1f44f-1f3ff.png
deleted file mode 100644
index 59cccdb73..000000000
--- a/images/emoji/1f44f-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f450-1f3fb.png b/images/emoji/1f450-1f3fb.png
deleted file mode 100644
index 352d2614f..000000000
--- a/images/emoji/1f450-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f450-1f3fc.png b/images/emoji/1f450-1f3fc.png
deleted file mode 100644
index 70824a50c..000000000
--- a/images/emoji/1f450-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f450-1f3fd.png b/images/emoji/1f450-1f3fd.png
deleted file mode 100644
index d7d136bd3..000000000
--- a/images/emoji/1f450-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f450-1f3fe.png b/images/emoji/1f450-1f3fe.png
deleted file mode 100644
index df4eaa711..000000000
--- a/images/emoji/1f450-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f450-1f3ff.png b/images/emoji/1f450-1f3ff.png
deleted file mode 100644
index 7dc04eaeb..000000000
--- a/images/emoji/1f450-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f450.png b/images/emoji/1f450.png
deleted file mode 100644
index 1cf75c910..000000000
--- a/images/emoji/1f450.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f451.png b/images/emoji/1f451.png
deleted file mode 100644
index 93b82d92f..000000000
--- a/images/emoji/1f451.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f452.png b/images/emoji/1f452.png
deleted file mode 100644
index b837b6a2e..000000000
--- a/images/emoji/1f452.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f453.png b/images/emoji/1f453.png
deleted file mode 100644
index 865d8274a..000000000
--- a/images/emoji/1f453.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f454.png b/images/emoji/1f454.png
deleted file mode 100644
index 1804e7f3f..000000000
--- a/images/emoji/1f454.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f455.png b/images/emoji/1f455.png
deleted file mode 100644
index af08dec8b..000000000
--- a/images/emoji/1f455.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f456.png b/images/emoji/1f456.png
deleted file mode 100644
index 2a6869d67..000000000
--- a/images/emoji/1f456.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f457.png b/images/emoji/1f457.png
deleted file mode 100644
index a697ca5c5..000000000
--- a/images/emoji/1f457.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f458.png b/images/emoji/1f458.png
deleted file mode 100644
index 297a42c7e..000000000
--- a/images/emoji/1f458.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f459.png b/images/emoji/1f459.png
deleted file mode 100644
index 77a8a0aae..000000000
--- a/images/emoji/1f459.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f45a.png b/images/emoji/1f45a.png
deleted file mode 100644
index 01410dc81..000000000
--- a/images/emoji/1f45a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f45b.png b/images/emoji/1f45b.png
deleted file mode 100644
index 981346193..000000000
--- a/images/emoji/1f45b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f45c.png b/images/emoji/1f45c.png
deleted file mode 100644
index cbf75c5d2..000000000
--- a/images/emoji/1f45c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f45d.png b/images/emoji/1f45d.png
deleted file mode 100644
index 8795c6c66..000000000
--- a/images/emoji/1f45d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f45e.png b/images/emoji/1f45e.png
deleted file mode 100644
index 16ccafb93..000000000
--- a/images/emoji/1f45e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f45f.png b/images/emoji/1f45f.png
deleted file mode 100644
index 423fa07dd..000000000
--- a/images/emoji/1f45f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f460.png b/images/emoji/1f460.png
deleted file mode 100644
index b331cbccc..000000000
--- a/images/emoji/1f460.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f461.png b/images/emoji/1f461.png
deleted file mode 100644
index 9d9f5122b..000000000
--- a/images/emoji/1f461.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f462.png b/images/emoji/1f462.png
deleted file mode 100644
index 11f1065ed..000000000
--- a/images/emoji/1f462.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f463.png b/images/emoji/1f463.png
deleted file mode 100644
index b2673c5a1..000000000
--- a/images/emoji/1f463.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f464.png b/images/emoji/1f464.png
deleted file mode 100644
index 123b2cbe1..000000000
--- a/images/emoji/1f464.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f465.png b/images/emoji/1f465.png
deleted file mode 100644
index d7656860a..000000000
--- a/images/emoji/1f465.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f466-1f3fb.png b/images/emoji/1f466-1f3fb.png
deleted file mode 100644
index 2fc436ea5..000000000
--- a/images/emoji/1f466-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f466-1f3fc.png b/images/emoji/1f466-1f3fc.png
deleted file mode 100644
index 09a5f18d3..000000000
--- a/images/emoji/1f466-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f466-1f3fd.png b/images/emoji/1f466-1f3fd.png
deleted file mode 100644
index 3cfe675dd..000000000
--- a/images/emoji/1f466-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f466-1f3fe.png b/images/emoji/1f466-1f3fe.png
deleted file mode 100644
index 780be0ace..000000000
--- a/images/emoji/1f466-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f466-1f3ff.png b/images/emoji/1f466-1f3ff.png
deleted file mode 100644
index f32fe22e3..000000000
--- a/images/emoji/1f466-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f466.png b/images/emoji/1f466.png
deleted file mode 100644
index 8ecfb0a4e..000000000
--- a/images/emoji/1f466.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f467-1f3fb.png b/images/emoji/1f467-1f3fb.png
deleted file mode 100644
index 2be1f0bee..000000000
--- a/images/emoji/1f467-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f467-1f3fc.png b/images/emoji/1f467-1f3fc.png
deleted file mode 100644
index a59ed4a3f..000000000
--- a/images/emoji/1f467-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f467-1f3fd.png b/images/emoji/1f467-1f3fd.png
deleted file mode 100644
index 517e7f2a7..000000000
--- a/images/emoji/1f467-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f467-1f3fe.png b/images/emoji/1f467-1f3fe.png
deleted file mode 100644
index 542d96c84..000000000
--- a/images/emoji/1f467-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f467-1f3ff.png b/images/emoji/1f467-1f3ff.png
deleted file mode 100644
index 66b7c28c2..000000000
--- a/images/emoji/1f467-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f467.png b/images/emoji/1f467.png
deleted file mode 100644
index 649eea6a5..000000000
--- a/images/emoji/1f467.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f468-1f3fb.png b/images/emoji/1f468-1f3fb.png
deleted file mode 100644
index bb86e963a..000000000
--- a/images/emoji/1f468-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f468-1f3fc.png b/images/emoji/1f468-1f3fc.png
deleted file mode 100644
index fdeeaff46..000000000
--- a/images/emoji/1f468-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f468-1f3fd.png b/images/emoji/1f468-1f3fd.png
deleted file mode 100644
index 7ae0b5df9..000000000
--- a/images/emoji/1f468-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f468-1f3fe.png b/images/emoji/1f468-1f3fe.png
deleted file mode 100644
index db14cde99..000000000
--- a/images/emoji/1f468-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f468-1f3ff.png b/images/emoji/1f468-1f3ff.png
deleted file mode 100644
index 7c67a7052..000000000
--- a/images/emoji/1f468-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f468-1f468-1f466-1f466.png b/images/emoji/1f468-1f468-1f466-1f466.png
deleted file mode 100644
index 0944001a3..000000000
--- a/images/emoji/1f468-1f468-1f466-1f466.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f468-1f468-1f466.png b/images/emoji/1f468-1f468-1f466.png
deleted file mode 100644
index 7a2e4e2c4..000000000
--- a/images/emoji/1f468-1f468-1f466.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f468-1f468-1f467-1f466.png b/images/emoji/1f468-1f468-1f467-1f466.png
deleted file mode 100644
index 41e351666..000000000
--- a/images/emoji/1f468-1f468-1f467-1f466.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f468-1f468-1f467-1f467.png b/images/emoji/1f468-1f468-1f467-1f467.png
deleted file mode 100644
index 8e8ccfe6c..000000000
--- a/images/emoji/1f468-1f468-1f467-1f467.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f468-1f468-1f467.png b/images/emoji/1f468-1f468-1f467.png
deleted file mode 100644
index 9bca550d0..000000000
--- a/images/emoji/1f468-1f468-1f467.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f468-1f469-1f466-1f466.png b/images/emoji/1f468-1f469-1f466-1f466.png
deleted file mode 100644
index 579eb59f8..000000000
--- a/images/emoji/1f468-1f469-1f466-1f466.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f468-1f469-1f467-1f466.png b/images/emoji/1f468-1f469-1f467-1f466.png
deleted file mode 100644
index c5c7b0942..000000000
--- a/images/emoji/1f468-1f469-1f467-1f466.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f468-1f469-1f467-1f467.png b/images/emoji/1f468-1f469-1f467-1f467.png
deleted file mode 100644
index b47f3b1c7..000000000
--- a/images/emoji/1f468-1f469-1f467-1f467.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f468-1f469-1f467.png b/images/emoji/1f468-1f469-1f467.png
deleted file mode 100644
index ffa6f4293..000000000
--- a/images/emoji/1f468-1f469-1f467.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f468-2764-1f468.png b/images/emoji/1f468-2764-1f468.png
deleted file mode 100644
index 8759fa5db..000000000
--- a/images/emoji/1f468-2764-1f468.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f468-2764-1f48b-1f468.png b/images/emoji/1f468-2764-1f48b-1f468.png
deleted file mode 100644
index a9a0edae1..000000000
--- a/images/emoji/1f468-2764-1f48b-1f468.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f468.png b/images/emoji/1f468.png
deleted file mode 100644
index 857a02e51..000000000
--- a/images/emoji/1f468.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f469-1f3fb.png b/images/emoji/1f469-1f3fb.png
deleted file mode 100644
index ff089b888..000000000
--- a/images/emoji/1f469-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f469-1f3fc.png b/images/emoji/1f469-1f3fc.png
deleted file mode 100644
index 0719c3780..000000000
--- a/images/emoji/1f469-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f469-1f3fd.png b/images/emoji/1f469-1f3fd.png
deleted file mode 100644
index b4d7f21f4..000000000
--- a/images/emoji/1f469-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f469-1f3fe.png b/images/emoji/1f469-1f3fe.png
deleted file mode 100644
index 6f21d631f..000000000
--- a/images/emoji/1f469-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f469-1f3ff.png b/images/emoji/1f469-1f3ff.png
deleted file mode 100644
index cd47bfdd6..000000000
--- a/images/emoji/1f469-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f469-1f469-1f466-1f466.png b/images/emoji/1f469-1f469-1f466-1f466.png
deleted file mode 100644
index e3fc2686e..000000000
--- a/images/emoji/1f469-1f469-1f466-1f466.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f469-1f469-1f466.png b/images/emoji/1f469-1f469-1f466.png
deleted file mode 100644
index 836feae7c..000000000
--- a/images/emoji/1f469-1f469-1f466.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f469-1f469-1f467-1f466.png b/images/emoji/1f469-1f469-1f467-1f466.png
deleted file mode 100644
index 284d29ab5..000000000
--- a/images/emoji/1f469-1f469-1f467-1f466.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f469-1f469-1f467-1f467.png b/images/emoji/1f469-1f469-1f467-1f467.png
deleted file mode 100644
index d8d3f49b8..000000000
--- a/images/emoji/1f469-1f469-1f467-1f467.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f469-1f469-1f467.png b/images/emoji/1f469-1f469-1f467.png
deleted file mode 100644
index d8619fa1f..000000000
--- a/images/emoji/1f469-1f469-1f467.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f469-2764-1f469.png b/images/emoji/1f469-2764-1f469.png
deleted file mode 100644
index 08fdabcdc..000000000
--- a/images/emoji/1f469-2764-1f469.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f469-2764-1f48b-1f469.png b/images/emoji/1f469-2764-1f48b-1f469.png
deleted file mode 100644
index 4905a5b3e..000000000
--- a/images/emoji/1f469-2764-1f48b-1f469.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f469.png b/images/emoji/1f469.png
deleted file mode 100644
index ece440e7a..000000000
--- a/images/emoji/1f469.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f46a.png b/images/emoji/1f46a.png
deleted file mode 100644
index 0350719a2..000000000
--- a/images/emoji/1f46a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f46b.png b/images/emoji/1f46b.png
deleted file mode 100644
index 73f22f0ad..000000000
--- a/images/emoji/1f46b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f46c.png b/images/emoji/1f46c.png
deleted file mode 100644
index a511fda82..000000000
--- a/images/emoji/1f46c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f46d.png b/images/emoji/1f46d.png
deleted file mode 100644
index 8623da423..000000000
--- a/images/emoji/1f46d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f46e-1f3fb.png b/images/emoji/1f46e-1f3fb.png
deleted file mode 100644
index 6ccba3879..000000000
--- a/images/emoji/1f46e-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f46e-1f3fc.png b/images/emoji/1f46e-1f3fc.png
deleted file mode 100644
index 7814ea9f5..000000000
--- a/images/emoji/1f46e-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f46e-1f3fd.png b/images/emoji/1f46e-1f3fd.png
deleted file mode 100644
index c29f0709b..000000000
--- a/images/emoji/1f46e-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f46e-1f3fe.png b/images/emoji/1f46e-1f3fe.png
deleted file mode 100644
index 8a009e55e..000000000
--- a/images/emoji/1f46e-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f46e-1f3ff.png b/images/emoji/1f46e-1f3ff.png
deleted file mode 100644
index 5bdc53c99..000000000
--- a/images/emoji/1f46e-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f46e.png b/images/emoji/1f46e.png
deleted file mode 100644
index bd37a787e..000000000
--- a/images/emoji/1f46e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f46f.png b/images/emoji/1f46f.png
deleted file mode 100644
index 7a33d199b..000000000
--- a/images/emoji/1f46f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f470-1f3fb.png b/images/emoji/1f470-1f3fb.png
deleted file mode 100644
index c4fb141ae..000000000
--- a/images/emoji/1f470-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f470-1f3fc.png b/images/emoji/1f470-1f3fc.png
deleted file mode 100644
index c248769fc..000000000
--- a/images/emoji/1f470-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f470-1f3fd.png b/images/emoji/1f470-1f3fd.png
deleted file mode 100644
index 962c0a6ee..000000000
--- a/images/emoji/1f470-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f470-1f3fe.png b/images/emoji/1f470-1f3fe.png
deleted file mode 100644
index 740ca208c..000000000
--- a/images/emoji/1f470-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f470-1f3ff.png b/images/emoji/1f470-1f3ff.png
deleted file mode 100644
index 5cc559858..000000000
--- a/images/emoji/1f470-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f470.png b/images/emoji/1f470.png
deleted file mode 100644
index eaf4bd978..000000000
--- a/images/emoji/1f470.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f471-1f3fb.png b/images/emoji/1f471-1f3fb.png
deleted file mode 100644
index 7d18ef244..000000000
--- a/images/emoji/1f471-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f471-1f3fc.png b/images/emoji/1f471-1f3fc.png
deleted file mode 100644
index dae130731..000000000
--- a/images/emoji/1f471-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f471-1f3fd.png b/images/emoji/1f471-1f3fd.png
deleted file mode 100644
index 684677e8e..000000000
--- a/images/emoji/1f471-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f471-1f3fe.png b/images/emoji/1f471-1f3fe.png
deleted file mode 100644
index 012be0b51..000000000
--- a/images/emoji/1f471-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f471-1f3ff.png b/images/emoji/1f471-1f3ff.png
deleted file mode 100644
index d4ecc4cf4..000000000
--- a/images/emoji/1f471-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f471.png b/images/emoji/1f471.png
deleted file mode 100644
index ad6f01a7d..000000000
--- a/images/emoji/1f471.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f472-1f3fb.png b/images/emoji/1f472-1f3fb.png
deleted file mode 100644
index 5b7b3def1..000000000
--- a/images/emoji/1f472-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f472-1f3fc.png b/images/emoji/1f472-1f3fc.png
deleted file mode 100644
index c8b9cf87f..000000000
--- a/images/emoji/1f472-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f472-1f3fd.png b/images/emoji/1f472-1f3fd.png
deleted file mode 100644
index effdd0c4c..000000000
--- a/images/emoji/1f472-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f472-1f3fe.png b/images/emoji/1f472-1f3fe.png
deleted file mode 100644
index f885ff46f..000000000
--- a/images/emoji/1f472-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f472-1f3ff.png b/images/emoji/1f472-1f3ff.png
deleted file mode 100644
index a6d55ca13..000000000
--- a/images/emoji/1f472-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f472.png b/images/emoji/1f472.png
deleted file mode 100644
index 7841e1360..000000000
--- a/images/emoji/1f472.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f473-1f3fb.png b/images/emoji/1f473-1f3fb.png
deleted file mode 100644
index 1e12ee4b2..000000000
--- a/images/emoji/1f473-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f473-1f3fc.png b/images/emoji/1f473-1f3fc.png
deleted file mode 100644
index 7fe9f01c6..000000000
--- a/images/emoji/1f473-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f473-1f3fd.png b/images/emoji/1f473-1f3fd.png
deleted file mode 100644
index f607afd34..000000000
--- a/images/emoji/1f473-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f473-1f3fe.png b/images/emoji/1f473-1f3fe.png
deleted file mode 100644
index c05695888..000000000
--- a/images/emoji/1f473-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f473-1f3ff.png b/images/emoji/1f473-1f3ff.png
deleted file mode 100644
index df935551c..000000000
--- a/images/emoji/1f473-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f473.png b/images/emoji/1f473.png
deleted file mode 100644
index 993fd952c..000000000
--- a/images/emoji/1f473.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f474-1f3fb.png b/images/emoji/1f474-1f3fb.png
deleted file mode 100644
index cd7d20789..000000000
--- a/images/emoji/1f474-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f474-1f3fc.png b/images/emoji/1f474-1f3fc.png
deleted file mode 100644
index 3574be8d4..000000000
--- a/images/emoji/1f474-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f474-1f3fd.png b/images/emoji/1f474-1f3fd.png
deleted file mode 100644
index bbd95afe0..000000000
--- a/images/emoji/1f474-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f474-1f3fe.png b/images/emoji/1f474-1f3fe.png
deleted file mode 100644
index b350a764b..000000000
--- a/images/emoji/1f474-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f474-1f3ff.png b/images/emoji/1f474-1f3ff.png
deleted file mode 100644
index 05fe24a17..000000000
--- a/images/emoji/1f474-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f474.png b/images/emoji/1f474.png
deleted file mode 100644
index 5f214571b..000000000
--- a/images/emoji/1f474.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f475-1f3fb.png b/images/emoji/1f475-1f3fb.png
deleted file mode 100644
index b49e82140..000000000
--- a/images/emoji/1f475-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f475-1f3fc.png b/images/emoji/1f475-1f3fc.png
deleted file mode 100644
index e86bf5ab3..000000000
--- a/images/emoji/1f475-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f475-1f3fd.png b/images/emoji/1f475-1f3fd.png
deleted file mode 100644
index 83fc14b08..000000000
--- a/images/emoji/1f475-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f475-1f3fe.png b/images/emoji/1f475-1f3fe.png
deleted file mode 100644
index ebbf7930f..000000000
--- a/images/emoji/1f475-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f475-1f3ff.png b/images/emoji/1f475-1f3ff.png
deleted file mode 100644
index 4009012bb..000000000
--- a/images/emoji/1f475-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f475.png b/images/emoji/1f475.png
deleted file mode 100644
index 52dc49871..000000000
--- a/images/emoji/1f475.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f476-1f3fb.png b/images/emoji/1f476-1f3fb.png
deleted file mode 100644
index 8c1cada59..000000000
--- a/images/emoji/1f476-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f476-1f3fc.png b/images/emoji/1f476-1f3fc.png
deleted file mode 100644
index 4ba95bd75..000000000
--- a/images/emoji/1f476-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f476-1f3fd.png b/images/emoji/1f476-1f3fd.png
deleted file mode 100644
index f4734c0dc..000000000
--- a/images/emoji/1f476-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f476-1f3fe.png b/images/emoji/1f476-1f3fe.png
deleted file mode 100644
index 02d864833..000000000
--- a/images/emoji/1f476-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f476-1f3ff.png b/images/emoji/1f476-1f3ff.png
deleted file mode 100644
index 0653e1603..000000000
--- a/images/emoji/1f476-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f476.png b/images/emoji/1f476.png
deleted file mode 100644
index 7b28ba891..000000000
--- a/images/emoji/1f476.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f477-1f3fb.png b/images/emoji/1f477-1f3fb.png
deleted file mode 100644
index 2f24a2bab..000000000
--- a/images/emoji/1f477-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f477-1f3fc.png b/images/emoji/1f477-1f3fc.png
deleted file mode 100644
index 93c8fec5a..000000000
--- a/images/emoji/1f477-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f477-1f3fd.png b/images/emoji/1f477-1f3fd.png
deleted file mode 100644
index abc1f2af2..000000000
--- a/images/emoji/1f477-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f477-1f3fe.png b/images/emoji/1f477-1f3fe.png
deleted file mode 100644
index eed83289a..000000000
--- a/images/emoji/1f477-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f477-1f3ff.png b/images/emoji/1f477-1f3ff.png
deleted file mode 100644
index acbb220b8..000000000
--- a/images/emoji/1f477-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f477.png b/images/emoji/1f477.png
deleted file mode 100644
index a9970a890..000000000
--- a/images/emoji/1f477.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f478-1f3fb.png b/images/emoji/1f478-1f3fb.png
deleted file mode 100644
index 7e4d850d1..000000000
--- a/images/emoji/1f478-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f478-1f3fc.png b/images/emoji/1f478-1f3fc.png
deleted file mode 100644
index 8179de403..000000000
--- a/images/emoji/1f478-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f478-1f3fd.png b/images/emoji/1f478-1f3fd.png
deleted file mode 100644
index de04809d1..000000000
--- a/images/emoji/1f478-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f478-1f3fe.png b/images/emoji/1f478-1f3fe.png
deleted file mode 100644
index c71e69caa..000000000
--- a/images/emoji/1f478-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f478-1f3ff.png b/images/emoji/1f478-1f3ff.png
deleted file mode 100644
index 063e26459..000000000
--- a/images/emoji/1f478-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f478.png b/images/emoji/1f478.png
deleted file mode 100644
index a9958dfff..000000000
--- a/images/emoji/1f478.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f479.png b/images/emoji/1f479.png
deleted file mode 100644
index fe8670fda..000000000
--- a/images/emoji/1f479.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f47a.png b/images/emoji/1f47a.png
deleted file mode 100644
index e2ffb0c19..000000000
--- a/images/emoji/1f47a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f47b.png b/images/emoji/1f47b.png
deleted file mode 100644
index d22b1ccba..000000000
--- a/images/emoji/1f47b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f47c-1f3fb.png b/images/emoji/1f47c-1f3fb.png
deleted file mode 100644
index 391694dc0..000000000
--- a/images/emoji/1f47c-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f47c-1f3fc.png b/images/emoji/1f47c-1f3fc.png
deleted file mode 100644
index 700cbe6ed..000000000
--- a/images/emoji/1f47c-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f47c-1f3fd.png b/images/emoji/1f47c-1f3fd.png
deleted file mode 100644
index be597437d..000000000
--- a/images/emoji/1f47c-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f47c-1f3fe.png b/images/emoji/1f47c-1f3fe.png
deleted file mode 100644
index b06d3c853..000000000
--- a/images/emoji/1f47c-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f47c-1f3ff.png b/images/emoji/1f47c-1f3ff.png
deleted file mode 100644
index 17bd677e3..000000000
--- a/images/emoji/1f47c-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f47c.png b/images/emoji/1f47c.png
deleted file mode 100644
index 66ea97a3b..000000000
--- a/images/emoji/1f47c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f47d.png b/images/emoji/1f47d.png
deleted file mode 100644
index 3b90e9743..000000000
--- a/images/emoji/1f47d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f47e.png b/images/emoji/1f47e.png
deleted file mode 100644
index 2e73f5f32..000000000
--- a/images/emoji/1f47e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f47f.png b/images/emoji/1f47f.png
deleted file mode 100644
index 83b68e404..000000000
--- a/images/emoji/1f47f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f480.png b/images/emoji/1f480.png
deleted file mode 100644
index 26abb1729..000000000
--- a/images/emoji/1f480.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f481-1f3fb.png b/images/emoji/1f481-1f3fb.png
deleted file mode 100644
index 3d9e22479..000000000
--- a/images/emoji/1f481-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f481-1f3fc.png b/images/emoji/1f481-1f3fc.png
deleted file mode 100644
index 7853bc60a..000000000
--- a/images/emoji/1f481-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f481-1f3fd.png b/images/emoji/1f481-1f3fd.png
deleted file mode 100644
index 307514eab..000000000
--- a/images/emoji/1f481-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f481-1f3fe.png b/images/emoji/1f481-1f3fe.png
deleted file mode 100644
index 95cc7ff36..000000000
--- a/images/emoji/1f481-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f481-1f3ff.png b/images/emoji/1f481-1f3ff.png
deleted file mode 100644
index 26f8f22b2..000000000
--- a/images/emoji/1f481-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f481.png b/images/emoji/1f481.png
deleted file mode 100644
index 328cfb316..000000000
--- a/images/emoji/1f481.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f482-1f3fb.png b/images/emoji/1f482-1f3fb.png
deleted file mode 100644
index cea9ba274..000000000
--- a/images/emoji/1f482-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f482-1f3fc.png b/images/emoji/1f482-1f3fc.png
deleted file mode 100644
index c8c3c6444..000000000
--- a/images/emoji/1f482-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f482-1f3fd.png b/images/emoji/1f482-1f3fd.png
deleted file mode 100644
index 29d9fc477..000000000
--- a/images/emoji/1f482-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f482-1f3fe.png b/images/emoji/1f482-1f3fe.png
deleted file mode 100644
index 85fcf9a3b..000000000
--- a/images/emoji/1f482-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f482-1f3ff.png b/images/emoji/1f482-1f3ff.png
deleted file mode 100644
index b140a2d23..000000000
--- a/images/emoji/1f482-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f482.png b/images/emoji/1f482.png
deleted file mode 100644
index 8d7ab3c47..000000000
--- a/images/emoji/1f482.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f483-1f3fb.png b/images/emoji/1f483-1f3fb.png
deleted file mode 100644
index 27975615e..000000000
--- a/images/emoji/1f483-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f483-1f3fc.png b/images/emoji/1f483-1f3fc.png
deleted file mode 100644
index cb04b1f90..000000000
--- a/images/emoji/1f483-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f483-1f3fd.png b/images/emoji/1f483-1f3fd.png
deleted file mode 100644
index 98c5bca7b..000000000
--- a/images/emoji/1f483-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f483-1f3fe.png b/images/emoji/1f483-1f3fe.png
deleted file mode 100644
index fdb1e00cb..000000000
--- a/images/emoji/1f483-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f483-1f3ff.png b/images/emoji/1f483-1f3ff.png
deleted file mode 100644
index 0e34e0e23..000000000
--- a/images/emoji/1f483-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f483.png b/images/emoji/1f483.png
deleted file mode 100644
index d1cdad8dd..000000000
--- a/images/emoji/1f483.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f484.png b/images/emoji/1f484.png
deleted file mode 100644
index 61a0c084c..000000000
--- a/images/emoji/1f484.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f485-1f3fb.png b/images/emoji/1f485-1f3fb.png
deleted file mode 100644
index f1fbfcf52..000000000
--- a/images/emoji/1f485-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f485-1f3fc.png b/images/emoji/1f485-1f3fc.png
deleted file mode 100644
index 02b836b2f..000000000
--- a/images/emoji/1f485-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f485-1f3fd.png b/images/emoji/1f485-1f3fd.png
deleted file mode 100644
index 7432e3cf2..000000000
--- a/images/emoji/1f485-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f485-1f3fe.png b/images/emoji/1f485-1f3fe.png
deleted file mode 100644
index e4272692c..000000000
--- a/images/emoji/1f485-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f485-1f3ff.png b/images/emoji/1f485-1f3ff.png
deleted file mode 100644
index d29e1c553..000000000
--- a/images/emoji/1f485-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f485.png b/images/emoji/1f485.png
deleted file mode 100644
index aa52af705..000000000
--- a/images/emoji/1f485.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f486-1f3fb.png b/images/emoji/1f486-1f3fb.png
deleted file mode 100644
index f9dea75f3..000000000
--- a/images/emoji/1f486-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f486-1f3fc.png b/images/emoji/1f486-1f3fc.png
deleted file mode 100644
index 0bb244a27..000000000
--- a/images/emoji/1f486-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f486-1f3fd.png b/images/emoji/1f486-1f3fd.png
deleted file mode 100644
index 06941c86b..000000000
--- a/images/emoji/1f486-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f486-1f3fe.png b/images/emoji/1f486-1f3fe.png
deleted file mode 100644
index 671d52310..000000000
--- a/images/emoji/1f486-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f486-1f3ff.png b/images/emoji/1f486-1f3ff.png
deleted file mode 100644
index 6a388c0d0..000000000
--- a/images/emoji/1f486-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f486.png b/images/emoji/1f486.png
deleted file mode 100644
index 9ed04ff13..000000000
--- a/images/emoji/1f486.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f487-1f3fb.png b/images/emoji/1f487-1f3fb.png
deleted file mode 100644
index c743b74ab..000000000
--- a/images/emoji/1f487-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f487-1f3fc.png b/images/emoji/1f487-1f3fc.png
deleted file mode 100644
index dbbddcb34..000000000
--- a/images/emoji/1f487-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f487-1f3fd.png b/images/emoji/1f487-1f3fd.png
deleted file mode 100644
index d5ad19563..000000000
--- a/images/emoji/1f487-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f487-1f3fe.png b/images/emoji/1f487-1f3fe.png
deleted file mode 100644
index 244fd3af0..000000000
--- a/images/emoji/1f487-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f487-1f3ff.png b/images/emoji/1f487-1f3ff.png
deleted file mode 100644
index 20a94a886..000000000
--- a/images/emoji/1f487-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f487.png b/images/emoji/1f487.png
deleted file mode 100644
index 91266b129..000000000
--- a/images/emoji/1f487.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f488.png b/images/emoji/1f488.png
deleted file mode 100644
index 896f4d716..000000000
--- a/images/emoji/1f488.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f489.png b/images/emoji/1f489.png
deleted file mode 100644
index 71c1a9528..000000000
--- a/images/emoji/1f489.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f48a.png b/images/emoji/1f48a.png
deleted file mode 100644
index 1d4530e77..000000000
--- a/images/emoji/1f48a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f48c.png b/images/emoji/1f48c.png
deleted file mode 100644
index 3c3c767e7..000000000
--- a/images/emoji/1f48c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f48d.png b/images/emoji/1f48d.png
deleted file mode 100644
index 87d227adb..000000000
--- a/images/emoji/1f48d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f48e.png b/images/emoji/1f48e.png
deleted file mode 100644
index db122d26a..000000000
--- a/images/emoji/1f48e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f48f.png b/images/emoji/1f48f.png
deleted file mode 100644
index 9aa519da9..000000000
--- a/images/emoji/1f48f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f490.png b/images/emoji/1f490.png
deleted file mode 100644
index 11455af6d..000000000
--- a/images/emoji/1f490.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f491.png b/images/emoji/1f491.png
deleted file mode 100644
index 62111601b..000000000
--- a/images/emoji/1f491.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f492.png b/images/emoji/1f492.png
deleted file mode 100644
index d0d8aa0bf..000000000
--- a/images/emoji/1f492.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f493.png b/images/emoji/1f493.png
deleted file mode 100644
index 0bcf2d1d5..000000000
--- a/images/emoji/1f493.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f494.png b/images/emoji/1f494.png
deleted file mode 100644
index 718e26ee1..000000000
--- a/images/emoji/1f494.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f495.png b/images/emoji/1f495.png
deleted file mode 100644
index 4d8c33860..000000000
--- a/images/emoji/1f495.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f496.png b/images/emoji/1f496.png
deleted file mode 100644
index 670926945..000000000
--- a/images/emoji/1f496.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f497.png b/images/emoji/1f497.png
deleted file mode 100644
index d6e694e97..000000000
--- a/images/emoji/1f497.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f498.png b/images/emoji/1f498.png
deleted file mode 100644
index 2df0078dd..000000000
--- a/images/emoji/1f498.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f499.png b/images/emoji/1f499.png
deleted file mode 100644
index bdf1287e5..000000000
--- a/images/emoji/1f499.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f49a.png b/images/emoji/1f49a.png
deleted file mode 100644
index c52d60a58..000000000
--- a/images/emoji/1f49a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f49b.png b/images/emoji/1f49b.png
deleted file mode 100644
index 7901a9d01..000000000
--- a/images/emoji/1f49b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f49c.png b/images/emoji/1f49c.png
deleted file mode 100644
index 95c53a9ad..000000000
--- a/images/emoji/1f49c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f49d.png b/images/emoji/1f49d.png
deleted file mode 100644
index 902ceafe4..000000000
--- a/images/emoji/1f49d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f49e.png b/images/emoji/1f49e.png
deleted file mode 100644
index 7b9d1948f..000000000
--- a/images/emoji/1f49e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f49f.png b/images/emoji/1f49f.png
deleted file mode 100644
index 5443f60bc..000000000
--- a/images/emoji/1f49f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4a0.png b/images/emoji/1f4a0.png
deleted file mode 100644
index 2a22a26d1..000000000
--- a/images/emoji/1f4a0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4a1.png b/images/emoji/1f4a1.png
deleted file mode 100644
index 38e32e02d..000000000
--- a/images/emoji/1f4a1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4a2.png b/images/emoji/1f4a2.png
deleted file mode 100644
index d63c2e000..000000000
--- a/images/emoji/1f4a2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4a3.png b/images/emoji/1f4a3.png
deleted file mode 100644
index c7f8f81c9..000000000
--- a/images/emoji/1f4a3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4a4.png b/images/emoji/1f4a4.png
deleted file mode 100644
index 9bc72b446..000000000
--- a/images/emoji/1f4a4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4a5.png b/images/emoji/1f4a5.png
deleted file mode 100644
index 9b0f027b1..000000000
--- a/images/emoji/1f4a5.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4a6.png b/images/emoji/1f4a6.png
deleted file mode 100644
index 4106117eb..000000000
--- a/images/emoji/1f4a6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4a7.png b/images/emoji/1f4a7.png
deleted file mode 100644
index 71241ec30..000000000
--- a/images/emoji/1f4a7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4a8.png b/images/emoji/1f4a8.png
deleted file mode 100644
index 064b8525c..000000000
--- a/images/emoji/1f4a8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4a9.png b/images/emoji/1f4a9.png
deleted file mode 100644
index 10b15e72d..000000000
--- a/images/emoji/1f4a9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4aa-1f3fb.png b/images/emoji/1f4aa-1f3fb.png
deleted file mode 100644
index 1522942ce..000000000
--- a/images/emoji/1f4aa-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4aa-1f3fc.png b/images/emoji/1f4aa-1f3fc.png
deleted file mode 100644
index 569c6e832..000000000
--- a/images/emoji/1f4aa-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4aa-1f3fd.png b/images/emoji/1f4aa-1f3fd.png
deleted file mode 100644
index 0a76b00fa..000000000
--- a/images/emoji/1f4aa-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4aa-1f3fe.png b/images/emoji/1f4aa-1f3fe.png
deleted file mode 100644
index f0cf31328..000000000
--- a/images/emoji/1f4aa-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4aa-1f3ff.png b/images/emoji/1f4aa-1f3ff.png
deleted file mode 100644
index 4fda92460..000000000
--- a/images/emoji/1f4aa-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4aa.png b/images/emoji/1f4aa.png
deleted file mode 100644
index 7e67c1880..000000000
--- a/images/emoji/1f4aa.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4ab.png b/images/emoji/1f4ab.png
deleted file mode 100644
index 85f52efad..000000000
--- a/images/emoji/1f4ab.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4ac.png b/images/emoji/1f4ac.png
deleted file mode 100644
index a34ef7417..000000000
--- a/images/emoji/1f4ac.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4ad.png b/images/emoji/1f4ad.png
deleted file mode 100644
index 72fe8fa70..000000000
--- a/images/emoji/1f4ad.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4ae.png b/images/emoji/1f4ae.png
deleted file mode 100644
index d6af8b600..000000000
--- a/images/emoji/1f4ae.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4af.png b/images/emoji/1f4af.png
deleted file mode 100644
index 6903ff030..000000000
--- a/images/emoji/1f4af.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4b0.png b/images/emoji/1f4b0.png
deleted file mode 100644
index b9296be09..000000000
--- a/images/emoji/1f4b0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4b1.png b/images/emoji/1f4b1.png
deleted file mode 100644
index 4d46c6050..000000000
--- a/images/emoji/1f4b1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4b2.png b/images/emoji/1f4b2.png
deleted file mode 100644
index ef2c2e205..000000000
--- a/images/emoji/1f4b2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4b3.png b/images/emoji/1f4b3.png
deleted file mode 100644
index 372777d5c..000000000
--- a/images/emoji/1f4b3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4b4.png b/images/emoji/1f4b4.png
deleted file mode 100644
index 63ee4799d..000000000
--- a/images/emoji/1f4b4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4b5.png b/images/emoji/1f4b5.png
deleted file mode 100644
index a9904c282..000000000
--- a/images/emoji/1f4b5.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4b6.png b/images/emoji/1f4b6.png
deleted file mode 100644
index a49020820..000000000
--- a/images/emoji/1f4b6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4b7.png b/images/emoji/1f4b7.png
deleted file mode 100644
index a0d4c4099..000000000
--- a/images/emoji/1f4b7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4b8.png b/images/emoji/1f4b8.png
deleted file mode 100644
index f022b04b3..000000000
--- a/images/emoji/1f4b8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4b9.png b/images/emoji/1f4b9.png
deleted file mode 100644
index 9773f03be..000000000
--- a/images/emoji/1f4b9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4ba.png b/images/emoji/1f4ba.png
deleted file mode 100644
index a6d72d95a..000000000
--- a/images/emoji/1f4ba.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4bb.png b/images/emoji/1f4bb.png
deleted file mode 100644
index c1fee27e3..000000000
--- a/images/emoji/1f4bb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4bc.png b/images/emoji/1f4bc.png
deleted file mode 100644
index b9912ba21..000000000
--- a/images/emoji/1f4bc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4bd.png b/images/emoji/1f4bd.png
deleted file mode 100644
index 9fa94cfbe..000000000
--- a/images/emoji/1f4bd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4be.png b/images/emoji/1f4be.png
deleted file mode 100644
index 072a76d3c..000000000
--- a/images/emoji/1f4be.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4bf.png b/images/emoji/1f4bf.png
deleted file mode 100644
index e6b01449c..000000000
--- a/images/emoji/1f4bf.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4c0.png b/images/emoji/1f4c0.png
deleted file mode 100644
index 045a6f7a0..000000000
--- a/images/emoji/1f4c0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4c1.png b/images/emoji/1f4c1.png
deleted file mode 100644
index addedaf08..000000000
--- a/images/emoji/1f4c1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4c2.png b/images/emoji/1f4c2.png
deleted file mode 100644
index 3993b0922..000000000
--- a/images/emoji/1f4c2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4c3.png b/images/emoji/1f4c3.png
deleted file mode 100644
index 06355319c..000000000
--- a/images/emoji/1f4c3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4c4.png b/images/emoji/1f4c4.png
deleted file mode 100644
index ba4ed757e..000000000
--- a/images/emoji/1f4c4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4c5.png b/images/emoji/1f4c5.png
deleted file mode 100644
index f05b3da97..000000000
--- a/images/emoji/1f4c5.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4c6.png b/images/emoji/1f4c6.png
deleted file mode 100644
index 47353b744..000000000
--- a/images/emoji/1f4c6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4c7.png b/images/emoji/1f4c7.png
deleted file mode 100644
index 151e11cb3..000000000
--- a/images/emoji/1f4c7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4c8.png b/images/emoji/1f4c8.png
deleted file mode 100644
index f13cfcf99..000000000
--- a/images/emoji/1f4c8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4c9.png b/images/emoji/1f4c9.png
deleted file mode 100644
index 5222ec72d..000000000
--- a/images/emoji/1f4c9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4ca.png b/images/emoji/1f4ca.png
deleted file mode 100644
index 53c894550..000000000
--- a/images/emoji/1f4ca.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4cb.png b/images/emoji/1f4cb.png
deleted file mode 100644
index ffd5b315d..000000000
--- a/images/emoji/1f4cb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4cc.png b/images/emoji/1f4cc.png
deleted file mode 100644
index 57e07d7f4..000000000
--- a/images/emoji/1f4cc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4cd.png b/images/emoji/1f4cd.png
deleted file mode 100644
index 28b9d7286..000000000
--- a/images/emoji/1f4cd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4ce.png b/images/emoji/1f4ce.png
deleted file mode 100644
index 8cd8d4f87..000000000
--- a/images/emoji/1f4ce.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4cf.png b/images/emoji/1f4cf.png
deleted file mode 100644
index 1017b7433..000000000
--- a/images/emoji/1f4cf.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4d0.png b/images/emoji/1f4d0.png
deleted file mode 100644
index 77dee9ee8..000000000
--- a/images/emoji/1f4d0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4d1.png b/images/emoji/1f4d1.png
deleted file mode 100644
index 23a3083ad..000000000
--- a/images/emoji/1f4d1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4d2.png b/images/emoji/1f4d2.png
deleted file mode 100644
index ef0ea3b1f..000000000
--- a/images/emoji/1f4d2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4d3.png b/images/emoji/1f4d3.png
deleted file mode 100644
index f6c28b491..000000000
--- a/images/emoji/1f4d3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4d4.png b/images/emoji/1f4d4.png
deleted file mode 100644
index 03f566b6d..000000000
--- a/images/emoji/1f4d4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4d5.png b/images/emoji/1f4d5.png
deleted file mode 100644
index 6395cf215..000000000
--- a/images/emoji/1f4d5.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4d6.png b/images/emoji/1f4d6.png
deleted file mode 100644
index 0f4447ed3..000000000
--- a/images/emoji/1f4d6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4d7.png b/images/emoji/1f4d7.png
deleted file mode 100644
index e5e411cf3..000000000
--- a/images/emoji/1f4d7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4d8.png b/images/emoji/1f4d8.png
deleted file mode 100644
index d73dfd725..000000000
--- a/images/emoji/1f4d8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4d9.png b/images/emoji/1f4d9.png
deleted file mode 100644
index ab40e6ae6..000000000
--- a/images/emoji/1f4d9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4da.png b/images/emoji/1f4da.png
deleted file mode 100644
index 59a8bafeb..000000000
--- a/images/emoji/1f4da.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4db.png b/images/emoji/1f4db.png
deleted file mode 100644
index ec5ee213e..000000000
--- a/images/emoji/1f4db.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4dc.png b/images/emoji/1f4dc.png
deleted file mode 100644
index 50ee5dcd4..000000000
--- a/images/emoji/1f4dc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4dd.png b/images/emoji/1f4dd.png
deleted file mode 100644
index 9e44f60f4..000000000
--- a/images/emoji/1f4dd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4de.png b/images/emoji/1f4de.png
deleted file mode 100644
index 69388316c..000000000
--- a/images/emoji/1f4de.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4df.png b/images/emoji/1f4df.png
deleted file mode 100644
index b24b99306..000000000
--- a/images/emoji/1f4df.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4e0.png b/images/emoji/1f4e0.png
deleted file mode 100644
index 6f929e294..000000000
--- a/images/emoji/1f4e0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4e1.png b/images/emoji/1f4e1.png
deleted file mode 100644
index db0372795..000000000
--- a/images/emoji/1f4e1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4e2.png b/images/emoji/1f4e2.png
deleted file mode 100644
index 5fd76a95b..000000000
--- a/images/emoji/1f4e2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4e3.png b/images/emoji/1f4e3.png
deleted file mode 100644
index 4e6735188..000000000
--- a/images/emoji/1f4e3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4e4.png b/images/emoji/1f4e4.png
deleted file mode 100644
index 46493ed5b..000000000
--- a/images/emoji/1f4e4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4e5.png b/images/emoji/1f4e5.png
deleted file mode 100644
index 41a6be2b0..000000000
--- a/images/emoji/1f4e5.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4e6.png b/images/emoji/1f4e6.png
deleted file mode 100644
index 85431756a..000000000
--- a/images/emoji/1f4e6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4e7.png b/images/emoji/1f4e7.png
deleted file mode 100644
index d22e654a2..000000000
--- a/images/emoji/1f4e7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4e8.png b/images/emoji/1f4e8.png
deleted file mode 100644
index fd22e8818..000000000
--- a/images/emoji/1f4e8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4e9.png b/images/emoji/1f4e9.png
deleted file mode 100644
index 7448a6b76..000000000
--- a/images/emoji/1f4e9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4ea.png b/images/emoji/1f4ea.png
deleted file mode 100644
index ddc705db0..000000000
--- a/images/emoji/1f4ea.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4eb.png b/images/emoji/1f4eb.png
deleted file mode 100644
index ef5174e40..000000000
--- a/images/emoji/1f4eb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4ec.png b/images/emoji/1f4ec.png
deleted file mode 100644
index 5460616a5..000000000
--- a/images/emoji/1f4ec.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4ed.png b/images/emoji/1f4ed.png
deleted file mode 100644
index f9aeee6b1..000000000
--- a/images/emoji/1f4ed.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4ee.png b/images/emoji/1f4ee.png
deleted file mode 100644
index 07c9c4ab3..000000000
--- a/images/emoji/1f4ee.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4ef.png b/images/emoji/1f4ef.png
deleted file mode 100644
index c173b8dbd..000000000
--- a/images/emoji/1f4ef.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4f0.png b/images/emoji/1f4f0.png
deleted file mode 100644
index 2aa8f060b..000000000
--- a/images/emoji/1f4f0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4f1.png b/images/emoji/1f4f1.png
deleted file mode 100644
index fd377acf8..000000000
--- a/images/emoji/1f4f1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4f2.png b/images/emoji/1f4f2.png
deleted file mode 100644
index e2f308f8e..000000000
--- a/images/emoji/1f4f2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4f3.png b/images/emoji/1f4f3.png
deleted file mode 100644
index cc46510e4..000000000
--- a/images/emoji/1f4f3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4f4.png b/images/emoji/1f4f4.png
deleted file mode 100644
index 8b661ec1c..000000000
--- a/images/emoji/1f4f4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4f5.png b/images/emoji/1f4f5.png
deleted file mode 100644
index 7b1ae6ea5..000000000
--- a/images/emoji/1f4f5.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4f6.png b/images/emoji/1f4f6.png
deleted file mode 100644
index ee2b5a4b5..000000000
--- a/images/emoji/1f4f6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4f7.png b/images/emoji/1f4f7.png
deleted file mode 100644
index 0a3429f72..000000000
--- a/images/emoji/1f4f7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4f8.png b/images/emoji/1f4f8.png
deleted file mode 100644
index 27471da20..000000000
--- a/images/emoji/1f4f8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4f9.png b/images/emoji/1f4f9.png
deleted file mode 100644
index 8008d1414..000000000
--- a/images/emoji/1f4f9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4fa.png b/images/emoji/1f4fa.png
deleted file mode 100644
index 999f1fb5c..000000000
--- a/images/emoji/1f4fa.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4fb.png b/images/emoji/1f4fb.png
deleted file mode 100644
index dec381fa2..000000000
--- a/images/emoji/1f4fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4fc.png b/images/emoji/1f4fc.png
deleted file mode 100644
index b9eb78ecd..000000000
--- a/images/emoji/1f4fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4fd.png b/images/emoji/1f4fd.png
deleted file mode 100644
index ce9ab0daa..000000000
--- a/images/emoji/1f4fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4ff.png b/images/emoji/1f4ff.png
deleted file mode 100644
index a4b6dfcc6..000000000
--- a/images/emoji/1f4ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f500.png b/images/emoji/1f500.png
deleted file mode 100644
index 5904badde..000000000
--- a/images/emoji/1f500.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f501.png b/images/emoji/1f501.png
deleted file mode 100644
index 540ce4e0f..000000000
--- a/images/emoji/1f501.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f502.png b/images/emoji/1f502.png
deleted file mode 100644
index 9567e8333..000000000
--- a/images/emoji/1f502.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f503.png b/images/emoji/1f503.png
deleted file mode 100644
index 26e49c383..000000000
--- a/images/emoji/1f503.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f504.png b/images/emoji/1f504.png
deleted file mode 100644
index 8d06d8e09..000000000
--- a/images/emoji/1f504.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f505.png b/images/emoji/1f505.png
deleted file mode 100644
index 543011d39..000000000
--- a/images/emoji/1f505.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f506.png b/images/emoji/1f506.png
deleted file mode 100644
index c41f2d5fd..000000000
--- a/images/emoji/1f506.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f507.png b/images/emoji/1f507.png
deleted file mode 100644
index 7c1788e50..000000000
--- a/images/emoji/1f507.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f508.png b/images/emoji/1f508.png
deleted file mode 100644
index 7bcffb8fc..000000000
--- a/images/emoji/1f508.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f509.png b/images/emoji/1f509.png
deleted file mode 100644
index e75ddca53..000000000
--- a/images/emoji/1f509.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f50a.png b/images/emoji/1f50a.png
deleted file mode 100644
index 8370033a5..000000000
--- a/images/emoji/1f50a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f50b.png b/images/emoji/1f50b.png
deleted file mode 100644
index f593e2bdb..000000000
--- a/images/emoji/1f50b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f50c.png b/images/emoji/1f50c.png
deleted file mode 100644
index 31d1eb215..000000000
--- a/images/emoji/1f50c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f50d.png b/images/emoji/1f50d.png
deleted file mode 100644
index 55487156a..000000000
--- a/images/emoji/1f50d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f50e.png b/images/emoji/1f50e.png
deleted file mode 100644
index 0f4b1bca8..000000000
--- a/images/emoji/1f50e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f50f.png b/images/emoji/1f50f.png
deleted file mode 100644
index 19a07d162..000000000
--- a/images/emoji/1f50f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f510.png b/images/emoji/1f510.png
deleted file mode 100644
index 1c1cd5d07..000000000
--- a/images/emoji/1f510.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f511.png b/images/emoji/1f511.png
deleted file mode 100644
index 319cd1b88..000000000
--- a/images/emoji/1f511.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f512.png b/images/emoji/1f512.png
deleted file mode 100644
index 5a739c466..000000000
--- a/images/emoji/1f512.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f513.png b/images/emoji/1f513.png
deleted file mode 100644
index 4a74a6939..000000000
--- a/images/emoji/1f513.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f514.png b/images/emoji/1f514.png
deleted file mode 100644
index 776f4fdd0..000000000
--- a/images/emoji/1f514.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f515.png b/images/emoji/1f515.png
deleted file mode 100644
index 15cb38dd1..000000000
--- a/images/emoji/1f515.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f516.png b/images/emoji/1f516.png
deleted file mode 100644
index bbb444611..000000000
--- a/images/emoji/1f516.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f517.png b/images/emoji/1f517.png
deleted file mode 100644
index ae20f0f8e..000000000
--- a/images/emoji/1f517.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f518.png b/images/emoji/1f518.png
deleted file mode 100644
index 3a23449d9..000000000
--- a/images/emoji/1f518.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f519.png b/images/emoji/1f519.png
deleted file mode 100644
index d32c5d4f1..000000000
--- a/images/emoji/1f519.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f51a.png b/images/emoji/1f51a.png
deleted file mode 100644
index ef3ccd5f3..000000000
--- a/images/emoji/1f51a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f51b.png b/images/emoji/1f51b.png
deleted file mode 100644
index a0c371ae2..000000000
--- a/images/emoji/1f51b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f51c.png b/images/emoji/1f51c.png
deleted file mode 100644
index 8cdfd8669..000000000
--- a/images/emoji/1f51c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f51d.png b/images/emoji/1f51d.png
deleted file mode 100644
index 49dea8c08..000000000
--- a/images/emoji/1f51d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f51e.png b/images/emoji/1f51e.png
deleted file mode 100644
index 6dfe6da51..000000000
--- a/images/emoji/1f51e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f51f.png b/images/emoji/1f51f.png
deleted file mode 100644
index 782d40049..000000000
--- a/images/emoji/1f51f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f520.png b/images/emoji/1f520.png
deleted file mode 100644
index fe9482d2d..000000000
--- a/images/emoji/1f520.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f521.png b/images/emoji/1f521.png
deleted file mode 100644
index 0996a8705..000000000
--- a/images/emoji/1f521.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f522.png b/images/emoji/1f522.png
deleted file mode 100644
index 248dc7e55..000000000
--- a/images/emoji/1f522.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f523.png b/images/emoji/1f523.png
deleted file mode 100644
index ac2fc1f35..000000000
--- a/images/emoji/1f523.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f524.png b/images/emoji/1f524.png
deleted file mode 100644
index 7688de692..000000000
--- a/images/emoji/1f524.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f525.png b/images/emoji/1f525.png
deleted file mode 100644
index bd3775a46..000000000
--- a/images/emoji/1f525.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f526.png b/images/emoji/1f526.png
deleted file mode 100644
index eee36c250..000000000
--- a/images/emoji/1f526.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f527.png b/images/emoji/1f527.png
deleted file mode 100644
index c16b74396..000000000
--- a/images/emoji/1f527.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f528.png b/images/emoji/1f528.png
deleted file mode 100644
index 00736cce4..000000000
--- a/images/emoji/1f528.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f529.png b/images/emoji/1f529.png
deleted file mode 100644
index 4b9ae1553..000000000
--- a/images/emoji/1f529.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f52a.png b/images/emoji/1f52a.png
deleted file mode 100644
index 1acb9f307..000000000
--- a/images/emoji/1f52a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f52b.png b/images/emoji/1f52b.png
deleted file mode 100644
index 89c5c244c..000000000
--- a/images/emoji/1f52b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f52c.png b/images/emoji/1f52c.png
deleted file mode 100644
index 90f5acf6a..000000000
--- a/images/emoji/1f52c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f52d.png b/images/emoji/1f52d.png
deleted file mode 100644
index d63154614..000000000
--- a/images/emoji/1f52d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f52e.png b/images/emoji/1f52e.png
deleted file mode 100644
index 54334c18b..000000000
--- a/images/emoji/1f52e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f52f.png b/images/emoji/1f52f.png
deleted file mode 100644
index 2eb170745..000000000
--- a/images/emoji/1f52f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f530.png b/images/emoji/1f530.png
deleted file mode 100644
index bc434fb7c..000000000
--- a/images/emoji/1f530.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f531.png b/images/emoji/1f531.png
deleted file mode 100644
index 777a1dad1..000000000
--- a/images/emoji/1f531.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f532.png b/images/emoji/1f532.png
deleted file mode 100644
index a78fc2f6b..000000000
--- a/images/emoji/1f532.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f533.png b/images/emoji/1f533.png
deleted file mode 100644
index 934b1cedf..000000000
--- a/images/emoji/1f533.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f534.png b/images/emoji/1f534.png
deleted file mode 100644
index 4bef930d9..000000000
--- a/images/emoji/1f534.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f535.png b/images/emoji/1f535.png
deleted file mode 100644
index 84078ef31..000000000
--- a/images/emoji/1f535.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f536.png b/images/emoji/1f536.png
deleted file mode 100644
index 73ff0ac36..000000000
--- a/images/emoji/1f536.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f537.png b/images/emoji/1f537.png
deleted file mode 100644
index 416a58bd5..000000000
--- a/images/emoji/1f537.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f538.png b/images/emoji/1f538.png
deleted file mode 100644
index e1c6ed9b2..000000000
--- a/images/emoji/1f538.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f539.png b/images/emoji/1f539.png
deleted file mode 100644
index b86b5bc4d..000000000
--- a/images/emoji/1f539.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f53a.png b/images/emoji/1f53a.png
deleted file mode 100644
index 785887c19..000000000
--- a/images/emoji/1f53a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f53b.png b/images/emoji/1f53b.png
deleted file mode 100644
index a83beff19..000000000
--- a/images/emoji/1f53b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f53c.png b/images/emoji/1f53c.png
deleted file mode 100644
index 20a13dcd5..000000000
--- a/images/emoji/1f53c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f53d.png b/images/emoji/1f53d.png
deleted file mode 100644
index 5870b9a22..000000000
--- a/images/emoji/1f53d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f549.png b/images/emoji/1f549.png
deleted file mode 100644
index a35c63c45..000000000
--- a/images/emoji/1f549.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f54a.png b/images/emoji/1f54a.png
deleted file mode 100644
index 9580c4917..000000000
--- a/images/emoji/1f54a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f54b.png b/images/emoji/1f54b.png
deleted file mode 100644
index 1778c1138..000000000
--- a/images/emoji/1f54b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f54c.png b/images/emoji/1f54c.png
deleted file mode 100644
index ef770b26d..000000000
--- a/images/emoji/1f54c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f54d.png b/images/emoji/1f54d.png
deleted file mode 100644
index ee347904c..000000000
--- a/images/emoji/1f54d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f54e.png b/images/emoji/1f54e.png
deleted file mode 100644
index b42973628..000000000
--- a/images/emoji/1f54e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f550.png b/images/emoji/1f550.png
deleted file mode 100644
index d6e34941f..000000000
--- a/images/emoji/1f550.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f551.png b/images/emoji/1f551.png
deleted file mode 100644
index a54253d7d..000000000
--- a/images/emoji/1f551.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f552.png b/images/emoji/1f552.png
deleted file mode 100644
index 27ec4b1f5..000000000
--- a/images/emoji/1f552.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f553.png b/images/emoji/1f553.png
deleted file mode 100644
index 60a1ef4cc..000000000
--- a/images/emoji/1f553.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f554.png b/images/emoji/1f554.png
deleted file mode 100644
index c9382d1e0..000000000
--- a/images/emoji/1f554.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f555.png b/images/emoji/1f555.png
deleted file mode 100644
index 8fd5d3f5b..000000000
--- a/images/emoji/1f555.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f556.png b/images/emoji/1f556.png
deleted file mode 100644
index 8c7084036..000000000
--- a/images/emoji/1f556.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f557.png b/images/emoji/1f557.png
deleted file mode 100644
index fcddf722e..000000000
--- a/images/emoji/1f557.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f558.png b/images/emoji/1f558.png
deleted file mode 100644
index dfbe01179..000000000
--- a/images/emoji/1f558.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f559.png b/images/emoji/1f559.png
deleted file mode 100644
index e62b245cd..000000000
--- a/images/emoji/1f559.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f55a.png b/images/emoji/1f55a.png
deleted file mode 100644
index 098334527..000000000
--- a/images/emoji/1f55a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f55b.png b/images/emoji/1f55b.png
deleted file mode 100644
index e61caa4b3..000000000
--- a/images/emoji/1f55b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f55c.png b/images/emoji/1f55c.png
deleted file mode 100644
index 86b7689b8..000000000
--- a/images/emoji/1f55c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f55d.png b/images/emoji/1f55d.png
deleted file mode 100644
index 7a787e018..000000000
--- a/images/emoji/1f55d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f55e.png b/images/emoji/1f55e.png
deleted file mode 100644
index c6860395c..000000000
--- a/images/emoji/1f55e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f55f.png b/images/emoji/1f55f.png
deleted file mode 100644
index 3c05b3621..000000000
--- a/images/emoji/1f55f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f560.png b/images/emoji/1f560.png
deleted file mode 100644
index c21fa926d..000000000
--- a/images/emoji/1f560.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f561.png b/images/emoji/1f561.png
deleted file mode 100644
index 2aec87fef..000000000
--- a/images/emoji/1f561.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f562.png b/images/emoji/1f562.png
deleted file mode 100644
index f7a1135e0..000000000
--- a/images/emoji/1f562.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f563.png b/images/emoji/1f563.png
deleted file mode 100644
index 799b4aebc..000000000
--- a/images/emoji/1f563.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f564.png b/images/emoji/1f564.png
deleted file mode 100644
index 4a2092ee6..000000000
--- a/images/emoji/1f564.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f565.png b/images/emoji/1f565.png
deleted file mode 100644
index 0802b3c65..000000000
--- a/images/emoji/1f565.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f566.png b/images/emoji/1f566.png
deleted file mode 100644
index d970d03b8..000000000
--- a/images/emoji/1f566.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f567.png b/images/emoji/1f567.png
deleted file mode 100644
index f2b1d2617..000000000
--- a/images/emoji/1f567.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f56f.png b/images/emoji/1f56f.png
deleted file mode 100644
index 0b56444e3..000000000
--- a/images/emoji/1f56f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f570.png b/images/emoji/1f570.png
deleted file mode 100644
index ffdb451e3..000000000
--- a/images/emoji/1f570.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f573.png b/images/emoji/1f573.png
deleted file mode 100644
index 517d2ae0d..000000000
--- a/images/emoji/1f573.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f574.png b/images/emoji/1f574.png
deleted file mode 100644
index 3dc315a3d..000000000
--- a/images/emoji/1f574.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f575-1f3fb.png b/images/emoji/1f575-1f3fb.png
deleted file mode 100644
index 2d1c022ca..000000000
--- a/images/emoji/1f575-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f575-1f3fc.png b/images/emoji/1f575-1f3fc.png
deleted file mode 100644
index 13e01ad93..000000000
--- a/images/emoji/1f575-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f575-1f3fd.png b/images/emoji/1f575-1f3fd.png
deleted file mode 100644
index a814dca2e..000000000
--- a/images/emoji/1f575-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f575-1f3fe.png b/images/emoji/1f575-1f3fe.png
deleted file mode 100644
index d8300af49..000000000
--- a/images/emoji/1f575-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f575-1f3ff.png b/images/emoji/1f575-1f3ff.png
deleted file mode 100644
index ca1462595..000000000
--- a/images/emoji/1f575-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f575.png b/images/emoji/1f575.png
deleted file mode 100644
index a729e9584..000000000
--- a/images/emoji/1f575.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f576.png b/images/emoji/1f576.png
deleted file mode 100644
index b1b6db0ac..000000000
--- a/images/emoji/1f576.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f577.png b/images/emoji/1f577.png
deleted file mode 100644
index 3849fa90b..000000000
--- a/images/emoji/1f577.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f578.png b/images/emoji/1f578.png
deleted file mode 100644
index ba448ee7f..000000000
--- a/images/emoji/1f578.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f579.png b/images/emoji/1f579.png
deleted file mode 100644
index 1ee190543..000000000
--- a/images/emoji/1f579.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f57a-1f3fb.png b/images/emoji/1f57a-1f3fb.png
deleted file mode 100644
index e0b9f82d9..000000000
--- a/images/emoji/1f57a-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f57a-1f3fc.png b/images/emoji/1f57a-1f3fc.png
deleted file mode 100644
index a5beed56e..000000000
--- a/images/emoji/1f57a-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f57a-1f3fd.png b/images/emoji/1f57a-1f3fd.png
deleted file mode 100644
index 2fa20180a..000000000
--- a/images/emoji/1f57a-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f57a-1f3fe.png b/images/emoji/1f57a-1f3fe.png
deleted file mode 100644
index bd3528c83..000000000
--- a/images/emoji/1f57a-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f57a-1f3ff.png b/images/emoji/1f57a-1f3ff.png
deleted file mode 100644
index 41fd4f880..000000000
--- a/images/emoji/1f57a-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f57a.png b/images/emoji/1f57a.png
deleted file mode 100644
index ccff3bede..000000000
--- a/images/emoji/1f57a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f587.png b/images/emoji/1f587.png
deleted file mode 100644
index 76021e8c7..000000000
--- a/images/emoji/1f587.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f58a.png b/images/emoji/1f58a.png
deleted file mode 100644
index 6ef7a3424..000000000
--- a/images/emoji/1f58a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f58b.png b/images/emoji/1f58b.png
deleted file mode 100644
index 3ca4bd2c2..000000000
--- a/images/emoji/1f58b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f58c.png b/images/emoji/1f58c.png
deleted file mode 100644
index 28bffbaa3..000000000
--- a/images/emoji/1f58c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f58d.png b/images/emoji/1f58d.png
deleted file mode 100644
index 8d7b427aa..000000000
--- a/images/emoji/1f58d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f590-1f3fb.png b/images/emoji/1f590-1f3fb.png
deleted file mode 100644
index a7888e6bd..000000000
--- a/images/emoji/1f590-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f590-1f3fc.png b/images/emoji/1f590-1f3fc.png
deleted file mode 100644
index cc10fbc27..000000000
--- a/images/emoji/1f590-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f590-1f3fd.png b/images/emoji/1f590-1f3fd.png
deleted file mode 100644
index 707236ae8..000000000
--- a/images/emoji/1f590-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f590-1f3fe.png b/images/emoji/1f590-1f3fe.png
deleted file mode 100644
index 1430df9c6..000000000
--- a/images/emoji/1f590-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f590-1f3ff.png b/images/emoji/1f590-1f3ff.png
deleted file mode 100644
index 80bec971b..000000000
--- a/images/emoji/1f590-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f590.png b/images/emoji/1f590.png
deleted file mode 100644
index fb5ae8ebb..000000000
--- a/images/emoji/1f590.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f595-1f3fb.png b/images/emoji/1f595-1f3fb.png
deleted file mode 100644
index 61ef12a15..000000000
--- a/images/emoji/1f595-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f595-1f3fc.png b/images/emoji/1f595-1f3fc.png
deleted file mode 100644
index c31a69be9..000000000
--- a/images/emoji/1f595-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f595-1f3fd.png b/images/emoji/1f595-1f3fd.png
deleted file mode 100644
index 73ac216ce..000000000
--- a/images/emoji/1f595-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f595-1f3fe.png b/images/emoji/1f595-1f3fe.png
deleted file mode 100644
index 80b8ab770..000000000
--- a/images/emoji/1f595-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f595-1f3ff.png b/images/emoji/1f595-1f3ff.png
deleted file mode 100644
index a8826b196..000000000
--- a/images/emoji/1f595-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f595.png b/images/emoji/1f595.png
deleted file mode 100644
index 697f7a25e..000000000
--- a/images/emoji/1f595.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f596-1f3fb.png b/images/emoji/1f596-1f3fb.png
deleted file mode 100644
index 8aff5d8fa..000000000
--- a/images/emoji/1f596-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f596-1f3fc.png b/images/emoji/1f596-1f3fc.png
deleted file mode 100644
index 82b7ad519..000000000
--- a/images/emoji/1f596-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f596-1f3fd.png b/images/emoji/1f596-1f3fd.png
deleted file mode 100644
index d1400e1dd..000000000
--- a/images/emoji/1f596-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f596-1f3fe.png b/images/emoji/1f596-1f3fe.png
deleted file mode 100644
index 47e2b2801..000000000
--- a/images/emoji/1f596-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f596-1f3ff.png b/images/emoji/1f596-1f3ff.png
deleted file mode 100644
index 60b5c6077..000000000
--- a/images/emoji/1f596-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f596.png b/images/emoji/1f596.png
deleted file mode 100644
index 54728bcaf..000000000
--- a/images/emoji/1f596.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f5a4.png b/images/emoji/1f5a4.png
deleted file mode 100644
index b4068c3e6..000000000
--- a/images/emoji/1f5a4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f5a5.png b/images/emoji/1f5a5.png
deleted file mode 100644
index 909bd42b5..000000000
--- a/images/emoji/1f5a5.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f5a8.png b/images/emoji/1f5a8.png
deleted file mode 100644
index 027c830f0..000000000
--- a/images/emoji/1f5a8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f5b1.png b/images/emoji/1f5b1.png
deleted file mode 100644
index e84e96ff6..000000000
--- a/images/emoji/1f5b1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f5b2.png b/images/emoji/1f5b2.png
deleted file mode 100644
index 3bea84ad7..000000000
--- a/images/emoji/1f5b2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f5bc.png b/images/emoji/1f5bc.png
deleted file mode 100644
index 9fe84607b..000000000
--- a/images/emoji/1f5bc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f5c2.png b/images/emoji/1f5c2.png
deleted file mode 100644
index 46a7e403f..000000000
--- a/images/emoji/1f5c2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f5c3.png b/images/emoji/1f5c3.png
deleted file mode 100644
index f2e764ce5..000000000
--- a/images/emoji/1f5c3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f5c4.png b/images/emoji/1f5c4.png
deleted file mode 100644
index fddc65dde..000000000
--- a/images/emoji/1f5c4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f5d1.png b/images/emoji/1f5d1.png
deleted file mode 100644
index 2b3c484b4..000000000
--- a/images/emoji/1f5d1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f5d2.png b/images/emoji/1f5d2.png
deleted file mode 100644
index 85faa10d8..000000000
--- a/images/emoji/1f5d2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f5d3.png b/images/emoji/1f5d3.png
deleted file mode 100644
index dec8d49bf..000000000
--- a/images/emoji/1f5d3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f5dc.png b/images/emoji/1f5dc.png
deleted file mode 100644
index 67c13258d..000000000
--- a/images/emoji/1f5dc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f5dd.png b/images/emoji/1f5dd.png
deleted file mode 100644
index e11d706c6..000000000
--- a/images/emoji/1f5dd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f5de.png b/images/emoji/1f5de.png
deleted file mode 100644
index f64748df2..000000000
--- a/images/emoji/1f5de.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f5e1.png b/images/emoji/1f5e1.png
deleted file mode 100644
index 66e97b0aa..000000000
--- a/images/emoji/1f5e1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f5e3.png b/images/emoji/1f5e3.png
deleted file mode 100644
index 2df93aaae..000000000
--- a/images/emoji/1f5e3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f5e8.png b/images/emoji/1f5e8.png
deleted file mode 100644
index 00c05959b..000000000
--- a/images/emoji/1f5e8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f5ef.png b/images/emoji/1f5ef.png
deleted file mode 100644
index f5c97c4d2..000000000
--- a/images/emoji/1f5ef.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f5f3.png b/images/emoji/1f5f3.png
deleted file mode 100644
index 9b6767aea..000000000
--- a/images/emoji/1f5f3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f5fa.png b/images/emoji/1f5fa.png
deleted file mode 100644
index 15efe32c7..000000000
--- a/images/emoji/1f5fa.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f5fb.png b/images/emoji/1f5fb.png
deleted file mode 100644
index 88a547524..000000000
--- a/images/emoji/1f5fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f5fc.png b/images/emoji/1f5fc.png
deleted file mode 100644
index 37df7fc65..000000000
--- a/images/emoji/1f5fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f5fd.png b/images/emoji/1f5fd.png
deleted file mode 100644
index 05df8289b..000000000
--- a/images/emoji/1f5fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f5fe.png b/images/emoji/1f5fe.png
deleted file mode 100644
index d86d0a59e..000000000
--- a/images/emoji/1f5fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f5ff.png b/images/emoji/1f5ff.png
deleted file mode 100644
index e6a7779c4..000000000
--- a/images/emoji/1f5ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f600.png b/images/emoji/1f600.png
deleted file mode 100644
index 3e8e0dab7..000000000
--- a/images/emoji/1f600.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f601.png b/images/emoji/1f601.png
deleted file mode 100644
index 418d94c81..000000000
--- a/images/emoji/1f601.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f602.png b/images/emoji/1f602.png
deleted file mode 100644
index 0ba3b1859..000000000
--- a/images/emoji/1f602.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f603.png b/images/emoji/1f603.png
deleted file mode 100644
index 30957a659..000000000
--- a/images/emoji/1f603.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f604.png b/images/emoji/1f604.png
deleted file mode 100644
index aa47ffe97..000000000
--- a/images/emoji/1f604.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f605.png b/images/emoji/1f605.png
deleted file mode 100644
index cb18d9c89..000000000
--- a/images/emoji/1f605.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f609.png b/images/emoji/1f609.png
deleted file mode 100644
index 7ea7810a3..000000000
--- a/images/emoji/1f609.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f60b.png b/images/emoji/1f60b.png
deleted file mode 100644
index 2df15753c..000000000
--- a/images/emoji/1f60b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f60c.png b/images/emoji/1f60c.png
deleted file mode 100644
index 715ad0bf5..000000000
--- a/images/emoji/1f60c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f60d.png b/images/emoji/1f60d.png
deleted file mode 100644
index 73fbee29d..000000000
--- a/images/emoji/1f60d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f60e.png b/images/emoji/1f60e.png
deleted file mode 100644
index 200117351..000000000
--- a/images/emoji/1f60e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f60f.png b/images/emoji/1f60f.png
deleted file mode 100644
index 878521099..000000000
--- a/images/emoji/1f60f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f610.png b/images/emoji/1f610.png
deleted file mode 100644
index 065d193af..000000000
--- a/images/emoji/1f610.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f611.png b/images/emoji/1f611.png
deleted file mode 100644
index 2954017f6..000000000
--- a/images/emoji/1f611.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f612.png b/images/emoji/1f612.png
deleted file mode 100644
index 25e3677f2..000000000
--- a/images/emoji/1f612.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f613.png b/images/emoji/1f613.png
deleted file mode 100644
index f0dae7b78..000000000
--- a/images/emoji/1f613.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f614.png b/images/emoji/1f614.png
deleted file mode 100644
index 490fb5669..000000000
--- a/images/emoji/1f614.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f615.png b/images/emoji/1f615.png
deleted file mode 100644
index 502b6bf0e..000000000
--- a/images/emoji/1f615.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f616.png b/images/emoji/1f616.png
deleted file mode 100644
index aa4b29e93..000000000
--- a/images/emoji/1f616.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f617.png b/images/emoji/1f617.png
deleted file mode 100644
index 39d325fd8..000000000
--- a/images/emoji/1f617.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f618.png b/images/emoji/1f618.png
deleted file mode 100644
index 0ff808fd6..000000000
--- a/images/emoji/1f618.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f619.png b/images/emoji/1f619.png
deleted file mode 100644
index e181f1709..000000000
--- a/images/emoji/1f619.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f61a.png b/images/emoji/1f61a.png
deleted file mode 100644
index b684d7d4d..000000000
--- a/images/emoji/1f61a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f61b.png b/images/emoji/1f61b.png
deleted file mode 100644
index 25757341f..000000000
--- a/images/emoji/1f61b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f61d.png b/images/emoji/1f61d.png
deleted file mode 100644
index 5c0401e9b..000000000
--- a/images/emoji/1f61d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f61f.png b/images/emoji/1f61f.png
deleted file mode 100644
index 7074afcf5..000000000
--- a/images/emoji/1f61f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f620.png b/images/emoji/1f620.png
deleted file mode 100644
index cfc4a6ecd..000000000
--- a/images/emoji/1f620.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f621.png b/images/emoji/1f621.png
deleted file mode 100644
index 9d739bd40..000000000
--- a/images/emoji/1f621.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f622.png b/images/emoji/1f622.png
deleted file mode 100644
index b7877f8a1..000000000
--- a/images/emoji/1f622.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f623.png b/images/emoji/1f623.png
deleted file mode 100644
index 646a05fe9..000000000
--- a/images/emoji/1f623.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f624.png b/images/emoji/1f624.png
deleted file mode 100644
index 4f3312854..000000000
--- a/images/emoji/1f624.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f625.png b/images/emoji/1f625.png
deleted file mode 100644
index aef864d2b..000000000
--- a/images/emoji/1f625.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f626.png b/images/emoji/1f626.png
deleted file mode 100644
index 43ab6b0a1..000000000
--- a/images/emoji/1f626.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f627.png b/images/emoji/1f627.png
deleted file mode 100644
index f99026a3b..000000000
--- a/images/emoji/1f627.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f628.png b/images/emoji/1f628.png
deleted file mode 100644
index eb8b347ce..000000000
--- a/images/emoji/1f628.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f629.png b/images/emoji/1f629.png
deleted file mode 100644
index 98bfbd24a..000000000
--- a/images/emoji/1f629.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f62a.png b/images/emoji/1f62a.png
deleted file mode 100644
index 836b41077..000000000
--- a/images/emoji/1f62a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f62b.png b/images/emoji/1f62b.png
deleted file mode 100644
index 19aba1bc1..000000000
--- a/images/emoji/1f62b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f62c.png b/images/emoji/1f62c.png
deleted file mode 100644
index 871b2f071..000000000
--- a/images/emoji/1f62c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f62d.png b/images/emoji/1f62d.png
deleted file mode 100644
index e4f818360..000000000
--- a/images/emoji/1f62d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f62f.png b/images/emoji/1f62f.png
deleted file mode 100644
index cad0e2313..000000000
--- a/images/emoji/1f62f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f630.png b/images/emoji/1f630.png
deleted file mode 100644
index 85b2231bb..000000000
--- a/images/emoji/1f630.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f631.png b/images/emoji/1f631.png
deleted file mode 100644
index 6ab43a0d3..000000000
--- a/images/emoji/1f631.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f632.png b/images/emoji/1f632.png
deleted file mode 100644
index bd0ac55ec..000000000
--- a/images/emoji/1f632.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f633.png b/images/emoji/1f633.png
deleted file mode 100644
index 829220bc4..000000000
--- a/images/emoji/1f633.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f635.png b/images/emoji/1f635.png
deleted file mode 100644
index 3120316ab..000000000
--- a/images/emoji/1f635.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f636.png b/images/emoji/1f636.png
deleted file mode 100644
index b642f6c11..000000000
--- a/images/emoji/1f636.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f637.png b/images/emoji/1f637.png
deleted file mode 100644
index 23852e578..000000000
--- a/images/emoji/1f637.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f638.png b/images/emoji/1f638.png
deleted file mode 100644
index e27290a67..000000000
--- a/images/emoji/1f638.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f639.png b/images/emoji/1f639.png
deleted file mode 100644
index aac353179..000000000
--- a/images/emoji/1f639.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f63a.png b/images/emoji/1f63a.png
deleted file mode 100644
index d5b1cef0b..000000000
--- a/images/emoji/1f63a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f63b.png b/images/emoji/1f63b.png
deleted file mode 100644
index 5a59eed04..000000000
--- a/images/emoji/1f63b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f63c.png b/images/emoji/1f63c.png
deleted file mode 100644
index 0bfeae4eb..000000000
--- a/images/emoji/1f63c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f63d.png b/images/emoji/1f63d.png
deleted file mode 100644
index 7f1ef2056..000000000
--- a/images/emoji/1f63d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f63e.png b/images/emoji/1f63e.png
deleted file mode 100644
index 41ddfeab4..000000000
--- a/images/emoji/1f63e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f63f.png b/images/emoji/1f63f.png
deleted file mode 100644
index ccc8d4f25..000000000
--- a/images/emoji/1f63f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f640.png b/images/emoji/1f640.png
deleted file mode 100644
index 15803ad8e..000000000
--- a/images/emoji/1f640.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f641.png b/images/emoji/1f641.png
deleted file mode 100644
index b2f1d983d..000000000
--- a/images/emoji/1f641.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f642.png b/images/emoji/1f642.png
deleted file mode 100644
index ddd7d65dd..000000000
--- a/images/emoji/1f642.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f643.png b/images/emoji/1f643.png
deleted file mode 100644
index 128f31c98..000000000
--- a/images/emoji/1f643.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f644.png b/images/emoji/1f644.png
deleted file mode 100644
index 2f77b9fc3..000000000
--- a/images/emoji/1f644.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f645-1f3fb.png b/images/emoji/1f645-1f3fb.png
deleted file mode 100644
index 7f28bf121..000000000
--- a/images/emoji/1f645-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f645-1f3fc.png b/images/emoji/1f645-1f3fc.png
deleted file mode 100644
index 80d8021f8..000000000
--- a/images/emoji/1f645-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f645-1f3fd.png b/images/emoji/1f645-1f3fd.png
deleted file mode 100644
index 635e6a008..000000000
--- a/images/emoji/1f645-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f645-1f3fe.png b/images/emoji/1f645-1f3fe.png
deleted file mode 100644
index 42006e7da..000000000
--- a/images/emoji/1f645-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f645-1f3ff.png b/images/emoji/1f645-1f3ff.png
deleted file mode 100644
index 309096cba..000000000
--- a/images/emoji/1f645-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f645.png b/images/emoji/1f645.png
deleted file mode 100644
index 381753cd8..000000000
--- a/images/emoji/1f645.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f646-1f3fb.png b/images/emoji/1f646-1f3fb.png
deleted file mode 100644
index ac28746a5..000000000
--- a/images/emoji/1f646-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f646-1f3fc.png b/images/emoji/1f646-1f3fc.png
deleted file mode 100644
index 5d845b042..000000000
--- a/images/emoji/1f646-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f646-1f3fd.png b/images/emoji/1f646-1f3fd.png
deleted file mode 100644
index 74c7b794f..000000000
--- a/images/emoji/1f646-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f646-1f3fe.png b/images/emoji/1f646-1f3fe.png
deleted file mode 100644
index 2fbcd7f67..000000000
--- a/images/emoji/1f646-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f646-1f3ff.png b/images/emoji/1f646-1f3ff.png
deleted file mode 100644
index da2d13546..000000000
--- a/images/emoji/1f646-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f646.png b/images/emoji/1f646.png
deleted file mode 100644
index 3de4594bd..000000000
--- a/images/emoji/1f646.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f647-1f3fb.png b/images/emoji/1f647-1f3fb.png
deleted file mode 100644
index 003d66052..000000000
--- a/images/emoji/1f647-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f647-1f3fc.png b/images/emoji/1f647-1f3fc.png
deleted file mode 100644
index d774be9c9..000000000
--- a/images/emoji/1f647-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f647-1f3fd.png b/images/emoji/1f647-1f3fd.png
deleted file mode 100644
index 43e06fd86..000000000
--- a/images/emoji/1f647-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f647-1f3fe.png b/images/emoji/1f647-1f3fe.png
deleted file mode 100644
index 2d0f1a7c7..000000000
--- a/images/emoji/1f647-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f647-1f3ff.png b/images/emoji/1f647-1f3ff.png
deleted file mode 100644
index 91f1a8ace..000000000
--- a/images/emoji/1f647-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f647.png b/images/emoji/1f647.png
deleted file mode 100644
index 3a0e83ee8..000000000
--- a/images/emoji/1f647.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f648.png b/images/emoji/1f648.png
deleted file mode 100644
index 5187e4745..000000000
--- a/images/emoji/1f648.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f649.png b/images/emoji/1f649.png
deleted file mode 100644
index 74b6be0c6..000000000
--- a/images/emoji/1f649.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f64a.png b/images/emoji/1f64a.png
deleted file mode 100644
index c75f42ae7..000000000
--- a/images/emoji/1f64a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f64b-1f3fb.png b/images/emoji/1f64b-1f3fb.png
deleted file mode 100644
index 1c90e3e26..000000000
--- a/images/emoji/1f64b-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f64b-1f3fc.png b/images/emoji/1f64b-1f3fc.png
deleted file mode 100644
index 82c3ef2bf..000000000
--- a/images/emoji/1f64b-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f64b-1f3fd.png b/images/emoji/1f64b-1f3fd.png
deleted file mode 100644
index 92a389f72..000000000
--- a/images/emoji/1f64b-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f64b-1f3fe.png b/images/emoji/1f64b-1f3fe.png
deleted file mode 100644
index 8b95f0533..000000000
--- a/images/emoji/1f64b-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f64b-1f3ff.png b/images/emoji/1f64b-1f3ff.png
deleted file mode 100644
index b86200fd8..000000000
--- a/images/emoji/1f64b-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f64b.png b/images/emoji/1f64b.png
deleted file mode 100644
index 7c803b315..000000000
--- a/images/emoji/1f64b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f64c-1f3fb.png b/images/emoji/1f64c-1f3fb.png
deleted file mode 100644
index 1168b8236..000000000
--- a/images/emoji/1f64c-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f64c-1f3fc.png b/images/emoji/1f64c-1f3fc.png
deleted file mode 100644
index 322de6229..000000000
--- a/images/emoji/1f64c-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f64c-1f3fd.png b/images/emoji/1f64c-1f3fd.png
deleted file mode 100644
index 2aa24e05a..000000000
--- a/images/emoji/1f64c-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f64c-1f3fe.png b/images/emoji/1f64c-1f3fe.png
deleted file mode 100644
index f31bf0db9..000000000
--- a/images/emoji/1f64c-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f64c-1f3ff.png b/images/emoji/1f64c-1f3ff.png
deleted file mode 100644
index 5e95067f9..000000000
--- a/images/emoji/1f64c-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f64c.png b/images/emoji/1f64c.png
deleted file mode 100644
index c0155f728..000000000
--- a/images/emoji/1f64c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f64d-1f3fb.png b/images/emoji/1f64d-1f3fb.png
deleted file mode 100644
index 21d3bb439..000000000
--- a/images/emoji/1f64d-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f64d-1f3fc.png b/images/emoji/1f64d-1f3fc.png
deleted file mode 100644
index 973f5fc83..000000000
--- a/images/emoji/1f64d-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f64d-1f3fd.png b/images/emoji/1f64d-1f3fd.png
deleted file mode 100644
index 41fbcc788..000000000
--- a/images/emoji/1f64d-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f64d-1f3fe.png b/images/emoji/1f64d-1f3fe.png
deleted file mode 100644
index 5a37c7410..000000000
--- a/images/emoji/1f64d-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f64d-1f3ff.png b/images/emoji/1f64d-1f3ff.png
deleted file mode 100644
index e08141f3e..000000000
--- a/images/emoji/1f64d-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f64d.png b/images/emoji/1f64d.png
deleted file mode 100644
index 579324959..000000000
--- a/images/emoji/1f64d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f64e-1f3fb.png b/images/emoji/1f64e-1f3fb.png
deleted file mode 100644
index 57e826b75..000000000
--- a/images/emoji/1f64e-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f64e-1f3fc.png b/images/emoji/1f64e-1f3fc.png
deleted file mode 100644
index 3f317c0c2..000000000
--- a/images/emoji/1f64e-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f64e-1f3fd.png b/images/emoji/1f64e-1f3fd.png
deleted file mode 100644
index d2fbb6c20..000000000
--- a/images/emoji/1f64e-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f64e-1f3fe.png b/images/emoji/1f64e-1f3fe.png
deleted file mode 100644
index 643ceb4a5..000000000
--- a/images/emoji/1f64e-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f64e-1f3ff.png b/images/emoji/1f64e-1f3ff.png
deleted file mode 100644
index b2eb6859c..000000000
--- a/images/emoji/1f64e-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f64e.png b/images/emoji/1f64e.png
deleted file mode 100644
index 10eb05710..000000000
--- a/images/emoji/1f64e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f64f-1f3fb.png b/images/emoji/1f64f-1f3fb.png
deleted file mode 100644
index 060ef2571..000000000
--- a/images/emoji/1f64f-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f64f-1f3fc.png b/images/emoji/1f64f-1f3fc.png
deleted file mode 100644
index 56dc607c0..000000000
--- a/images/emoji/1f64f-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f64f-1f3fd.png b/images/emoji/1f64f-1f3fd.png
deleted file mode 100644
index 0f33b8620..000000000
--- a/images/emoji/1f64f-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f64f-1f3fe.png b/images/emoji/1f64f-1f3fe.png
deleted file mode 100644
index 2ea8dc116..000000000
--- a/images/emoji/1f64f-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f64f-1f3ff.png b/images/emoji/1f64f-1f3ff.png
deleted file mode 100644
index 2128a6c47..000000000
--- a/images/emoji/1f64f-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f64f.png b/images/emoji/1f64f.png
deleted file mode 100644
index 8347f2435..000000000
--- a/images/emoji/1f64f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f680.png b/images/emoji/1f680.png
deleted file mode 100644
index 0d8da089a..000000000
--- a/images/emoji/1f680.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f681.png b/images/emoji/1f681.png
deleted file mode 100644
index 7ec5f39a5..000000000
--- a/images/emoji/1f681.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f682.png b/images/emoji/1f682.png
deleted file mode 100644
index 9ac0d999c..000000000
--- a/images/emoji/1f682.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f683.png b/images/emoji/1f683.png
deleted file mode 100644
index a9acbf130..000000000
--- a/images/emoji/1f683.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f684.png b/images/emoji/1f684.png
deleted file mode 100644
index ed61c67bf..000000000
--- a/images/emoji/1f684.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f685.png b/images/emoji/1f685.png
deleted file mode 100644
index 4f698e056..000000000
--- a/images/emoji/1f685.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f686.png b/images/emoji/1f686.png
deleted file mode 100644
index 8701e41e7..000000000
--- a/images/emoji/1f686.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f687.png b/images/emoji/1f687.png
deleted file mode 100644
index 1de8f0551..000000000
--- a/images/emoji/1f687.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f688.png b/images/emoji/1f688.png
deleted file mode 100644
index a64829f50..000000000
--- a/images/emoji/1f688.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f689.png b/images/emoji/1f689.png
deleted file mode 100644
index 5c26fee52..000000000
--- a/images/emoji/1f689.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f68a.png b/images/emoji/1f68a.png
deleted file mode 100644
index b6f0e6903..000000000
--- a/images/emoji/1f68a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f68b.png b/images/emoji/1f68b.png
deleted file mode 100644
index 3c80321f7..000000000
--- a/images/emoji/1f68b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f68c.png b/images/emoji/1f68c.png
deleted file mode 100644
index 641ddc56c..000000000
--- a/images/emoji/1f68c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f68d.png b/images/emoji/1f68d.png
deleted file mode 100644
index ad91e256c..000000000
--- a/images/emoji/1f68d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f68e.png b/images/emoji/1f68e.png
deleted file mode 100644
index 139a9931b..000000000
--- a/images/emoji/1f68e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f68f.png b/images/emoji/1f68f.png
deleted file mode 100644
index b2b62208b..000000000
--- a/images/emoji/1f68f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f690.png b/images/emoji/1f690.png
deleted file mode 100644
index c60dd8f47..000000000
--- a/images/emoji/1f690.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f691.png b/images/emoji/1f691.png
deleted file mode 100644
index 6fb8076d7..000000000
--- a/images/emoji/1f691.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f692.png b/images/emoji/1f692.png
deleted file mode 100644
index 249ffaabd..000000000
--- a/images/emoji/1f692.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f693.png b/images/emoji/1f693.png
deleted file mode 100644
index 3da4253de..000000000
--- a/images/emoji/1f693.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f694.png b/images/emoji/1f694.png
deleted file mode 100644
index a50388fc9..000000000
--- a/images/emoji/1f694.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f695.png b/images/emoji/1f695.png
deleted file mode 100644
index 55f4cc847..000000000
--- a/images/emoji/1f695.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f696.png b/images/emoji/1f696.png
deleted file mode 100644
index b4a9ddde4..000000000
--- a/images/emoji/1f696.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f697.png b/images/emoji/1f697.png
deleted file mode 100644
index b3e6a774d..000000000
--- a/images/emoji/1f697.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f698.png b/images/emoji/1f698.png
deleted file mode 100644
index 3c7e1d52e..000000000
--- a/images/emoji/1f698.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f699.png b/images/emoji/1f699.png
deleted file mode 100644
index e8ba817d3..000000000
--- a/images/emoji/1f699.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f69a.png b/images/emoji/1f69a.png
deleted file mode 100644
index c7677a769..000000000
--- a/images/emoji/1f69a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f69b.png b/images/emoji/1f69b.png
deleted file mode 100644
index b3b7742e6..000000000
--- a/images/emoji/1f69b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f69c.png b/images/emoji/1f69c.png
deleted file mode 100644
index c1bf8cae4..000000000
--- a/images/emoji/1f69c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f69d.png b/images/emoji/1f69d.png
deleted file mode 100644
index 11eb1f574..000000000
--- a/images/emoji/1f69d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f69e.png b/images/emoji/1f69e.png
deleted file mode 100644
index d136d60aa..000000000
--- a/images/emoji/1f69e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f69f.png b/images/emoji/1f69f.png
deleted file mode 100644
index a59d5f48c..000000000
--- a/images/emoji/1f69f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6a0.png b/images/emoji/1f6a0.png
deleted file mode 100644
index 1dea73ca5..000000000
--- a/images/emoji/1f6a0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6a1.png b/images/emoji/1f6a1.png
deleted file mode 100644
index 3eb4b61bf..000000000
--- a/images/emoji/1f6a1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6a2.png b/images/emoji/1f6a2.png
deleted file mode 100644
index 62d54f7d6..000000000
--- a/images/emoji/1f6a2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6a3-1f3fb.png b/images/emoji/1f6a3-1f3fb.png
deleted file mode 100644
index 947471874..000000000
--- a/images/emoji/1f6a3-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6a3-1f3fc.png b/images/emoji/1f6a3-1f3fc.png
deleted file mode 100644
index 9b123ef88..000000000
--- a/images/emoji/1f6a3-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6a3-1f3fd.png b/images/emoji/1f6a3-1f3fd.png
deleted file mode 100644
index 8ebd89a55..000000000
--- a/images/emoji/1f6a3-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6a3-1f3fe.png b/images/emoji/1f6a3-1f3fe.png
deleted file mode 100644
index 2b0d04f87..000000000
--- a/images/emoji/1f6a3-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6a3-1f3ff.png b/images/emoji/1f6a3-1f3ff.png
deleted file mode 100644
index b346f2dfc..000000000
--- a/images/emoji/1f6a3-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6a3.png b/images/emoji/1f6a3.png
deleted file mode 100644
index dd4dfc095..000000000
--- a/images/emoji/1f6a3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6a4.png b/images/emoji/1f6a4.png
deleted file mode 100644
index 74059d12d..000000000
--- a/images/emoji/1f6a4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6a5.png b/images/emoji/1f6a5.png
deleted file mode 100644
index 6b312285b..000000000
--- a/images/emoji/1f6a5.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6a6.png b/images/emoji/1f6a6.png
deleted file mode 100644
index 8085973ee..000000000
--- a/images/emoji/1f6a6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6a7.png b/images/emoji/1f6a7.png
deleted file mode 100644
index ef8db5f47..000000000
--- a/images/emoji/1f6a7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6a8.png b/images/emoji/1f6a8.png
deleted file mode 100644
index cad66b0af..000000000
--- a/images/emoji/1f6a8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6a9.png b/images/emoji/1f6a9.png
deleted file mode 100644
index c12d8b068..000000000
--- a/images/emoji/1f6a9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6aa.png b/images/emoji/1f6aa.png
deleted file mode 100644
index 36ae3e274..000000000
--- a/images/emoji/1f6aa.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6ab.png b/images/emoji/1f6ab.png
deleted file mode 100644
index d2efd65e7..000000000
--- a/images/emoji/1f6ab.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6ac.png b/images/emoji/1f6ac.png
deleted file mode 100644
index 910f648c8..000000000
--- a/images/emoji/1f6ac.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6ad.png b/images/emoji/1f6ad.png
deleted file mode 100644
index d33b9de53..000000000
--- a/images/emoji/1f6ad.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6ae.png b/images/emoji/1f6ae.png
deleted file mode 100644
index 82a84f9a3..000000000
--- a/images/emoji/1f6ae.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6af.png b/images/emoji/1f6af.png
deleted file mode 100644
index 341d2575f..000000000
--- a/images/emoji/1f6af.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6b0.png b/images/emoji/1f6b0.png
deleted file mode 100644
index 2c6100494..000000000
--- a/images/emoji/1f6b0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6b1.png b/images/emoji/1f6b1.png
deleted file mode 100644
index 827d4193f..000000000
--- a/images/emoji/1f6b1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6b2.png b/images/emoji/1f6b2.png
deleted file mode 100644
index 6125842f8..000000000
--- a/images/emoji/1f6b2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6b3.png b/images/emoji/1f6b3.png
deleted file mode 100644
index 19c85421c..000000000
--- a/images/emoji/1f6b3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6b4-1f3fb.png b/images/emoji/1f6b4-1f3fb.png
deleted file mode 100644
index decc2f728..000000000
--- a/images/emoji/1f6b4-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6b4-1f3fc.png b/images/emoji/1f6b4-1f3fc.png
deleted file mode 100644
index 0067717b8..000000000
--- a/images/emoji/1f6b4-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6b4-1f3fd.png b/images/emoji/1f6b4-1f3fd.png
deleted file mode 100644
index a4f7b5e27..000000000
--- a/images/emoji/1f6b4-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6b4-1f3fe.png b/images/emoji/1f6b4-1f3fe.png
deleted file mode 100644
index a3c8a797d..000000000
--- a/images/emoji/1f6b4-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6b4-1f3ff.png b/images/emoji/1f6b4-1f3ff.png
deleted file mode 100644
index 1606a8740..000000000
--- a/images/emoji/1f6b4-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6b4.png b/images/emoji/1f6b4.png
deleted file mode 100644
index 9274da110..000000000
--- a/images/emoji/1f6b4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6b5-1f3fb.png b/images/emoji/1f6b5-1f3fb.png
deleted file mode 100644
index e9f1daf5e..000000000
--- a/images/emoji/1f6b5-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6b5-1f3fc.png b/images/emoji/1f6b5-1f3fc.png
deleted file mode 100644
index 555b9e29d..000000000
--- a/images/emoji/1f6b5-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6b5-1f3fd.png b/images/emoji/1f6b5-1f3fd.png
deleted file mode 100644
index 7df5508ec..000000000
--- a/images/emoji/1f6b5-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6b5-1f3fe.png b/images/emoji/1f6b5-1f3fe.png
deleted file mode 100644
index f94b34506..000000000
--- a/images/emoji/1f6b5-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6b5-1f3ff.png b/images/emoji/1f6b5-1f3ff.png
deleted file mode 100644
index 16a45861e..000000000
--- a/images/emoji/1f6b5-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6b5.png b/images/emoji/1f6b5.png
deleted file mode 100644
index 41d3dc3ac..000000000
--- a/images/emoji/1f6b5.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6b6-1f3fb.png b/images/emoji/1f6b6-1f3fb.png
deleted file mode 100644
index 4e391b45a..000000000
--- a/images/emoji/1f6b6-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6b6-1f3fc.png b/images/emoji/1f6b6-1f3fc.png
deleted file mode 100644
index 31f94a1bc..000000000
--- a/images/emoji/1f6b6-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6b6-1f3fd.png b/images/emoji/1f6b6-1f3fd.png
deleted file mode 100644
index f7ed8e39c..000000000
--- a/images/emoji/1f6b6-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6b6-1f3fe.png b/images/emoji/1f6b6-1f3fe.png
deleted file mode 100644
index e58dc04c7..000000000
--- a/images/emoji/1f6b6-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6b6-1f3ff.png b/images/emoji/1f6b6-1f3ff.png
deleted file mode 100644
index ba4e1b58f..000000000
--- a/images/emoji/1f6b6-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6b6.png b/images/emoji/1f6b6.png
deleted file mode 100644
index 06dc169a3..000000000
--- a/images/emoji/1f6b6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6b7.png b/images/emoji/1f6b7.png
deleted file mode 100644
index 286aa577a..000000000
--- a/images/emoji/1f6b7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6b8.png b/images/emoji/1f6b8.png
deleted file mode 100644
index fa4c091c7..000000000
--- a/images/emoji/1f6b8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6b9.png b/images/emoji/1f6b9.png
deleted file mode 100644
index f5a1e1ba0..000000000
--- a/images/emoji/1f6b9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6ba.png b/images/emoji/1f6ba.png
deleted file mode 100644
index d4ecc22e7..000000000
--- a/images/emoji/1f6ba.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6bb.png b/images/emoji/1f6bb.png
deleted file mode 100644
index 9588e0f0e..000000000
--- a/images/emoji/1f6bb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6bc.png b/images/emoji/1f6bc.png
deleted file mode 100644
index 64a10b717..000000000
--- a/images/emoji/1f6bc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6bd.png b/images/emoji/1f6bd.png
deleted file mode 100644
index 1392f7618..000000000
--- a/images/emoji/1f6bd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6be.png b/images/emoji/1f6be.png
deleted file mode 100644
index aa433e84b..000000000
--- a/images/emoji/1f6be.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6bf.png b/images/emoji/1f6bf.png
deleted file mode 100644
index 156776a2e..000000000
--- a/images/emoji/1f6bf.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6c0-1f3fb.png b/images/emoji/1f6c0-1f3fb.png
deleted file mode 100644
index 2152eabf2..000000000
--- a/images/emoji/1f6c0-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6c0-1f3fc.png b/images/emoji/1f6c0-1f3fc.png
deleted file mode 100644
index 2102e6133..000000000
--- a/images/emoji/1f6c0-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6c0-1f3fd.png b/images/emoji/1f6c0-1f3fd.png
deleted file mode 100644
index fae66181e..000000000
--- a/images/emoji/1f6c0-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6c0-1f3fe.png b/images/emoji/1f6c0-1f3fe.png
deleted file mode 100644
index 1f8959d0d..000000000
--- a/images/emoji/1f6c0-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6c0-1f3ff.png b/images/emoji/1f6c0-1f3ff.png
deleted file mode 100644
index c8a08e84f..000000000
--- a/images/emoji/1f6c0-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6c0.png b/images/emoji/1f6c0.png
deleted file mode 100644
index 43fba5c8a..000000000
--- a/images/emoji/1f6c0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6c1.png b/images/emoji/1f6c1.png
deleted file mode 100644
index 9a5f09361..000000000
--- a/images/emoji/1f6c1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6c2.png b/images/emoji/1f6c2.png
deleted file mode 100644
index 079e34ee4..000000000
--- a/images/emoji/1f6c2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6c3.png b/images/emoji/1f6c3.png
deleted file mode 100644
index 21b7ce2c6..000000000
--- a/images/emoji/1f6c3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6c4.png b/images/emoji/1f6c4.png
deleted file mode 100644
index 409b593e7..000000000
--- a/images/emoji/1f6c4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6c5.png b/images/emoji/1f6c5.png
deleted file mode 100644
index 887b23f3f..000000000
--- a/images/emoji/1f6c5.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6cb.png b/images/emoji/1f6cb.png
deleted file mode 100644
index 27b19b13b..000000000
--- a/images/emoji/1f6cb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6cc.png b/images/emoji/1f6cc.png
deleted file mode 100644
index c739e7fb6..000000000
--- a/images/emoji/1f6cc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6cd.png b/images/emoji/1f6cd.png
deleted file mode 100644
index 99f2a2b13..000000000
--- a/images/emoji/1f6cd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6ce.png b/images/emoji/1f6ce.png
deleted file mode 100644
index 6b3297cea..000000000
--- a/images/emoji/1f6ce.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6cf.png b/images/emoji/1f6cf.png
deleted file mode 100644
index cf75349a3..000000000
--- a/images/emoji/1f6cf.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6d0.png b/images/emoji/1f6d0.png
deleted file mode 100644
index 207d59cce..000000000
--- a/images/emoji/1f6d0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6d1.png b/images/emoji/1f6d1.png
deleted file mode 100644
index 5ed610040..000000000
--- a/images/emoji/1f6d1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6d2.png b/images/emoji/1f6d2.png
deleted file mode 100644
index 1086fe6e4..000000000
--- a/images/emoji/1f6d2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6e0.png b/images/emoji/1f6e0.png
deleted file mode 100644
index 3c6049273..000000000
--- a/images/emoji/1f6e0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6e1.png b/images/emoji/1f6e1.png
deleted file mode 100644
index 610bf033c..000000000
--- a/images/emoji/1f6e1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6e2.png b/images/emoji/1f6e2.png
deleted file mode 100644
index c4c4d42da..000000000
--- a/images/emoji/1f6e2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6e3.png b/images/emoji/1f6e3.png
deleted file mode 100644
index 8c3d3d03e..000000000
--- a/images/emoji/1f6e3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6e4.png b/images/emoji/1f6e4.png
deleted file mode 100644
index 3bde6fb65..000000000
--- a/images/emoji/1f6e4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6e5.png b/images/emoji/1f6e5.png
deleted file mode 100644
index 0506db1a4..000000000
--- a/images/emoji/1f6e5.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6e9.png b/images/emoji/1f6e9.png
deleted file mode 100644
index b731b15e3..000000000
--- a/images/emoji/1f6e9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6eb.png b/images/emoji/1f6eb.png
deleted file mode 100644
index a5766f9f4..000000000
--- a/images/emoji/1f6eb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6ec.png b/images/emoji/1f6ec.png
deleted file mode 100644
index d66841962..000000000
--- a/images/emoji/1f6ec.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6f0.png b/images/emoji/1f6f0.png
deleted file mode 100644
index 4ba55d6e2..000000000
--- a/images/emoji/1f6f0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6f3.png b/images/emoji/1f6f3.png
deleted file mode 100644
index 19d4acbe4..000000000
--- a/images/emoji/1f6f3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6f4.png b/images/emoji/1f6f4.png
deleted file mode 100644
index 4ab7ef59c..000000000
--- a/images/emoji/1f6f4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6f5.png b/images/emoji/1f6f5.png
deleted file mode 100644
index c5afa72d8..000000000
--- a/images/emoji/1f6f5.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6f6.png b/images/emoji/1f6f6.png
deleted file mode 100644
index e26cdb9da..000000000
--- a/images/emoji/1f6f6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f910.png b/images/emoji/1f910.png
deleted file mode 100644
index f8ced2502..000000000
--- a/images/emoji/1f910.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f911.png b/images/emoji/1f911.png
deleted file mode 100644
index 75fd1e90c..000000000
--- a/images/emoji/1f911.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f912.png b/images/emoji/1f912.png
deleted file mode 100644
index 8a1e841af..000000000
--- a/images/emoji/1f912.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f913.png b/images/emoji/1f913.png
deleted file mode 100644
index 7820bd581..000000000
--- a/images/emoji/1f913.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f914.png b/images/emoji/1f914.png
deleted file mode 100644
index c18f6fd14..000000000
--- a/images/emoji/1f914.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f915.png b/images/emoji/1f915.png
deleted file mode 100644
index 53c7be1d2..000000000
--- a/images/emoji/1f915.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f916.png b/images/emoji/1f916.png
deleted file mode 100644
index 7cc62612c..000000000
--- a/images/emoji/1f916.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f917.png b/images/emoji/1f917.png
deleted file mode 100644
index f398b783a..000000000
--- a/images/emoji/1f917.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f918-1f3fb.png b/images/emoji/1f918-1f3fb.png
deleted file mode 100644
index c080d2add..000000000
--- a/images/emoji/1f918-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f918-1f3fc.png b/images/emoji/1f918-1f3fc.png
deleted file mode 100644
index 12313529b..000000000
--- a/images/emoji/1f918-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f918-1f3fd.png b/images/emoji/1f918-1f3fd.png
deleted file mode 100644
index ca9be6ae6..000000000
--- a/images/emoji/1f918-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f918-1f3fe.png b/images/emoji/1f918-1f3fe.png
deleted file mode 100644
index abe28cbf8..000000000
--- a/images/emoji/1f918-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f918-1f3ff.png b/images/emoji/1f918-1f3ff.png
deleted file mode 100644
index 0c6b5dd34..000000000
--- a/images/emoji/1f918-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f918.png b/images/emoji/1f918.png
deleted file mode 100644
index 4aa6e7e0a..000000000
--- a/images/emoji/1f918.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f919-1f3fb.png b/images/emoji/1f919-1f3fb.png
deleted file mode 100644
index 2c9320118..000000000
--- a/images/emoji/1f919-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f919-1f3fc.png b/images/emoji/1f919-1f3fc.png
deleted file mode 100644
index c39f45a41..000000000
--- a/images/emoji/1f919-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f919-1f3fd.png b/images/emoji/1f919-1f3fd.png
deleted file mode 100644
index 83a57f63c..000000000
--- a/images/emoji/1f919-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f919-1f3fe.png b/images/emoji/1f919-1f3fe.png
deleted file mode 100644
index 65b3468fe..000000000
--- a/images/emoji/1f919-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f919-1f3ff.png b/images/emoji/1f919-1f3ff.png
deleted file mode 100644
index 94ef68ff3..000000000
--- a/images/emoji/1f919-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f919.png b/images/emoji/1f919.png
deleted file mode 100644
index a10c59ba7..000000000
--- a/images/emoji/1f919.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f91a-1f3fb.png b/images/emoji/1f91a-1f3fb.png
deleted file mode 100644
index 813d28499..000000000
--- a/images/emoji/1f91a-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f91a-1f3fc.png b/images/emoji/1f91a-1f3fc.png
deleted file mode 100644
index 192ff795e..000000000
--- a/images/emoji/1f91a-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f91a-1f3fd.png b/images/emoji/1f91a-1f3fd.png
deleted file mode 100644
index 61a727abe..000000000
--- a/images/emoji/1f91a-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f91a-1f3fe.png b/images/emoji/1f91a-1f3fe.png
deleted file mode 100644
index 2e83da511..000000000
--- a/images/emoji/1f91a-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f91a-1f3ff.png b/images/emoji/1f91a-1f3ff.png
deleted file mode 100644
index d7a5b95a0..000000000
--- a/images/emoji/1f91a-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f91a.png b/images/emoji/1f91a.png
deleted file mode 100644
index 479234294..000000000
--- a/images/emoji/1f91a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f91b-1f3fb.png b/images/emoji/1f91b-1f3fb.png
deleted file mode 100644
index 1262a6b4b..000000000
--- a/images/emoji/1f91b-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f91b-1f3fc.png b/images/emoji/1f91b-1f3fc.png
deleted file mode 100644
index 40bf70b82..000000000
--- a/images/emoji/1f91b-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f91b-1f3fd.png b/images/emoji/1f91b-1f3fd.png
deleted file mode 100644
index 93f581451..000000000
--- a/images/emoji/1f91b-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f91b-1f3fe.png b/images/emoji/1f91b-1f3fe.png
deleted file mode 100644
index d82b5ec91..000000000
--- a/images/emoji/1f91b-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f91b-1f3ff.png b/images/emoji/1f91b-1f3ff.png
deleted file mode 100644
index 09ae4cd49..000000000
--- a/images/emoji/1f91b-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f91b.png b/images/emoji/1f91b.png
deleted file mode 100644
index a9d9fd8d5..000000000
--- a/images/emoji/1f91b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f91c-1f3fb.png b/images/emoji/1f91c-1f3fb.png
deleted file mode 100644
index 33ded2f61..000000000
--- a/images/emoji/1f91c-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f91c-1f3fc.png b/images/emoji/1f91c-1f3fc.png
deleted file mode 100644
index 88054e335..000000000
--- a/images/emoji/1f91c-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f91c-1f3fd.png b/images/emoji/1f91c-1f3fd.png
deleted file mode 100644
index 84b9f5da7..000000000
--- a/images/emoji/1f91c-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f91c-1f3fe.png b/images/emoji/1f91c-1f3fe.png
deleted file mode 100644
index e741cfea6..000000000
--- a/images/emoji/1f91c-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f91c-1f3ff.png b/images/emoji/1f91c-1f3ff.png
deleted file mode 100644
index cf66d760c..000000000
--- a/images/emoji/1f91c-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f91c.png b/images/emoji/1f91c.png
deleted file mode 100644
index 754ed066d..000000000
--- a/images/emoji/1f91c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f91d-1f3fb.png b/images/emoji/1f91d-1f3fb.png
deleted file mode 100644
index 255fc7ec6..000000000
--- a/images/emoji/1f91d-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f91d-1f3fc.png b/images/emoji/1f91d-1f3fc.png
deleted file mode 100644
index 1aec7450e..000000000
--- a/images/emoji/1f91d-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f91d-1f3fd.png b/images/emoji/1f91d-1f3fd.png
deleted file mode 100644
index 104d65691..000000000
--- a/images/emoji/1f91d-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f91d-1f3fe.png b/images/emoji/1f91d-1f3fe.png
deleted file mode 100644
index 999966d4b..000000000
--- a/images/emoji/1f91d-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f91d-1f3ff.png b/images/emoji/1f91d-1f3ff.png
deleted file mode 100644
index 9a38f1b66..000000000
--- a/images/emoji/1f91d-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f91d.png b/images/emoji/1f91d.png
deleted file mode 100644
index 75e8d58e9..000000000
--- a/images/emoji/1f91d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f91e-1f3fb.png b/images/emoji/1f91e-1f3fb.png
deleted file mode 100644
index dd2384a6c..000000000
--- a/images/emoji/1f91e-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f91e-1f3fc.png b/images/emoji/1f91e-1f3fc.png
deleted file mode 100644
index 6228401be..000000000
--- a/images/emoji/1f91e-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f91e-1f3fd.png b/images/emoji/1f91e-1f3fd.png
deleted file mode 100644
index b1074da15..000000000
--- a/images/emoji/1f91e-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f91e-1f3fe.png b/images/emoji/1f91e-1f3fe.png
deleted file mode 100644
index 75e05e4d3..000000000
--- a/images/emoji/1f91e-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f91e-1f3ff.png b/images/emoji/1f91e-1f3ff.png
deleted file mode 100644
index 761aebdc3..000000000
--- a/images/emoji/1f91e-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f91e.png b/images/emoji/1f91e.png
deleted file mode 100644
index 4cd18514e..000000000
--- a/images/emoji/1f91e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f920.png b/images/emoji/1f920.png
deleted file mode 100644
index e67709b88..000000000
--- a/images/emoji/1f920.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f921.png b/images/emoji/1f921.png
deleted file mode 100644
index f0e05bac4..000000000
--- a/images/emoji/1f921.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f922.png b/images/emoji/1f922.png
deleted file mode 100644
index a566c109c..000000000
--- a/images/emoji/1f922.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f923.png b/images/emoji/1f923.png
deleted file mode 100644
index b1736fedf..000000000
--- a/images/emoji/1f923.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f924.png b/images/emoji/1f924.png
deleted file mode 100644
index a54605325..000000000
--- a/images/emoji/1f924.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f925.png b/images/emoji/1f925.png
deleted file mode 100644
index 02827e262..000000000
--- a/images/emoji/1f925.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f926-1f3fb.png b/images/emoji/1f926-1f3fb.png
deleted file mode 100644
index 2f4b010bb..000000000
--- a/images/emoji/1f926-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f926-1f3fc.png b/images/emoji/1f926-1f3fc.png
deleted file mode 100644
index 9cba0b0e1..000000000
--- a/images/emoji/1f926-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f926-1f3fd.png b/images/emoji/1f926-1f3fd.png
deleted file mode 100644
index b5b5c1e53..000000000
--- a/images/emoji/1f926-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f926-1f3fe.png b/images/emoji/1f926-1f3fe.png
deleted file mode 100644
index 2840b1134..000000000
--- a/images/emoji/1f926-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f926-1f3ff.png b/images/emoji/1f926-1f3ff.png
deleted file mode 100644
index 6f070db98..000000000
--- a/images/emoji/1f926-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f926.png b/images/emoji/1f926.png
deleted file mode 100644
index defc796cf..000000000
--- a/images/emoji/1f926.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f927.png b/images/emoji/1f927.png
deleted file mode 100644
index d6c796746..000000000
--- a/images/emoji/1f927.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f930-1f3fb.png b/images/emoji/1f930-1f3fb.png
deleted file mode 100644
index a78703b33..000000000
--- a/images/emoji/1f930-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f930-1f3fc.png b/images/emoji/1f930-1f3fc.png
deleted file mode 100644
index 0068c6c4a..000000000
--- a/images/emoji/1f930-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f930-1f3fd.png b/images/emoji/1f930-1f3fd.png
deleted file mode 100644
index 3206296b6..000000000
--- a/images/emoji/1f930-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f930-1f3fe.png b/images/emoji/1f930-1f3fe.png
deleted file mode 100644
index 120fda5cd..000000000
--- a/images/emoji/1f930-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f930-1f3ff.png b/images/emoji/1f930-1f3ff.png
deleted file mode 100644
index 569bfdf05..000000000
--- a/images/emoji/1f930-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f930.png b/images/emoji/1f930.png
deleted file mode 100644
index 084e83a41..000000000
--- a/images/emoji/1f930.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f933-1f3fb.png b/images/emoji/1f933-1f3fb.png
deleted file mode 100644
index 290e075b5..000000000
--- a/images/emoji/1f933-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f933-1f3fc.png b/images/emoji/1f933-1f3fc.png
deleted file mode 100644
index fcd9595b6..000000000
--- a/images/emoji/1f933-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f933-1f3fd.png b/images/emoji/1f933-1f3fd.png
deleted file mode 100644
index f3a22fdf4..000000000
--- a/images/emoji/1f933-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f933-1f3fe.png b/images/emoji/1f933-1f3fe.png
deleted file mode 100644
index cdecf6d9f..000000000
--- a/images/emoji/1f933-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f933-1f3ff.png b/images/emoji/1f933-1f3ff.png
deleted file mode 100644
index 86acbb6c2..000000000
--- a/images/emoji/1f933-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f933.png b/images/emoji/1f933.png
deleted file mode 100644
index 6a1ba75c7..000000000
--- a/images/emoji/1f933.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f934-1f3fb.png b/images/emoji/1f934-1f3fb.png
deleted file mode 100644
index 9102f9c46..000000000
--- a/images/emoji/1f934-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f934-1f3fc.png b/images/emoji/1f934-1f3fc.png
deleted file mode 100644
index 23d8b3b12..000000000
--- a/images/emoji/1f934-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f934-1f3fd.png b/images/emoji/1f934-1f3fd.png
deleted file mode 100644
index e7692efb7..000000000
--- a/images/emoji/1f934-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f934-1f3fe.png b/images/emoji/1f934-1f3fe.png
deleted file mode 100644
index 8e10f8be6..000000000
--- a/images/emoji/1f934-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f934-1f3ff.png b/images/emoji/1f934-1f3ff.png
deleted file mode 100644
index 138d4ea70..000000000
--- a/images/emoji/1f934-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f934.png b/images/emoji/1f934.png
deleted file mode 100644
index 38d69344c..000000000
--- a/images/emoji/1f934.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f935-1f3fb.png b/images/emoji/1f935-1f3fb.png
deleted file mode 100644
index 7b6b3acd9..000000000
--- a/images/emoji/1f935-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f935-1f3fc.png b/images/emoji/1f935-1f3fc.png
deleted file mode 100644
index 7975191b3..000000000
--- a/images/emoji/1f935-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f935-1f3fd.png b/images/emoji/1f935-1f3fd.png
deleted file mode 100644
index a2816f600..000000000
--- a/images/emoji/1f935-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f935-1f3fe.png b/images/emoji/1f935-1f3fe.png
deleted file mode 100644
index ea8291760..000000000
--- a/images/emoji/1f935-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f935-1f3ff.png b/images/emoji/1f935-1f3ff.png
deleted file mode 100644
index c743e05fc..000000000
--- a/images/emoji/1f935-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f935.png b/images/emoji/1f935.png
deleted file mode 100644
index 5f7e9303f..000000000
--- a/images/emoji/1f935.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f936-1f3fb.png b/images/emoji/1f936-1f3fb.png
deleted file mode 100644
index d8a695d70..000000000
--- a/images/emoji/1f936-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f936-1f3fc.png b/images/emoji/1f936-1f3fc.png
deleted file mode 100644
index 0e17e8c51..000000000
--- a/images/emoji/1f936-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f936-1f3fd.png b/images/emoji/1f936-1f3fd.png
deleted file mode 100644
index 195ebc400..000000000
--- a/images/emoji/1f936-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f936-1f3fe.png b/images/emoji/1f936-1f3fe.png
deleted file mode 100644
index 68a556da2..000000000
--- a/images/emoji/1f936-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f936-1f3ff.png b/images/emoji/1f936-1f3ff.png
deleted file mode 100644
index ccab3c40f..000000000
--- a/images/emoji/1f936-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f936.png b/images/emoji/1f936.png
deleted file mode 100644
index 078f0657f..000000000
--- a/images/emoji/1f936.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f937-1f3fb.png b/images/emoji/1f937-1f3fb.png
deleted file mode 100644
index 1c895e644..000000000
--- a/images/emoji/1f937-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f937-1f3fc.png b/images/emoji/1f937-1f3fc.png
deleted file mode 100644
index d76ac4b19..000000000
--- a/images/emoji/1f937-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f937-1f3fd.png b/images/emoji/1f937-1f3fd.png
deleted file mode 100644
index dc3a5a9fb..000000000
--- a/images/emoji/1f937-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f937-1f3fe.png b/images/emoji/1f937-1f3fe.png
deleted file mode 100644
index 5fbef3f22..000000000
--- a/images/emoji/1f937-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f937-1f3ff.png b/images/emoji/1f937-1f3ff.png
deleted file mode 100644
index 303640fe7..000000000
--- a/images/emoji/1f937-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f937.png b/images/emoji/1f937.png
deleted file mode 100644
index 76e63bfac..000000000
--- a/images/emoji/1f937.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f938-1f3fb.png b/images/emoji/1f938-1f3fb.png
deleted file mode 100644
index db6d65895..000000000
--- a/images/emoji/1f938-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f938-1f3fc.png b/images/emoji/1f938-1f3fc.png
deleted file mode 100644
index e00ffbc27..000000000
--- a/images/emoji/1f938-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f938-1f3fd.png b/images/emoji/1f938-1f3fd.png
deleted file mode 100644
index 49321be39..000000000
--- a/images/emoji/1f938-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f938-1f3fe.png b/images/emoji/1f938-1f3fe.png
deleted file mode 100644
index d4562b5e3..000000000
--- a/images/emoji/1f938-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f938-1f3ff.png b/images/emoji/1f938-1f3ff.png
deleted file mode 100644
index 6e09a8707..000000000
--- a/images/emoji/1f938-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f938.png b/images/emoji/1f938.png
deleted file mode 100644
index cbcaa5782..000000000
--- a/images/emoji/1f938.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f939-1f3fb.png b/images/emoji/1f939-1f3fb.png
deleted file mode 100644
index c18eda400..000000000
--- a/images/emoji/1f939-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f939-1f3fc.png b/images/emoji/1f939-1f3fc.png
deleted file mode 100644
index de3b7a555..000000000
--- a/images/emoji/1f939-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f939-1f3fd.png b/images/emoji/1f939-1f3fd.png
deleted file mode 100644
index 74ab6d854..000000000
--- a/images/emoji/1f939-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f939-1f3fe.png b/images/emoji/1f939-1f3fe.png
deleted file mode 100644
index 1c5782320..000000000
--- a/images/emoji/1f939-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f939-1f3ff.png b/images/emoji/1f939-1f3ff.png
deleted file mode 100644
index c343d6ee9..000000000
--- a/images/emoji/1f939-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f939.png b/images/emoji/1f939.png
deleted file mode 100644
index a37f6224a..000000000
--- a/images/emoji/1f939.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f93a.png b/images/emoji/1f93a.png
deleted file mode 100644
index 9f6cb6ff8..000000000
--- a/images/emoji/1f93a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f93b-1f3fb.png b/images/emoji/1f93b-1f3fb.png
deleted file mode 100644
index f29209325..000000000
--- a/images/emoji/1f93b-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f93b-1f3fc.png b/images/emoji/1f93b-1f3fc.png
deleted file mode 100644
index fea2cc7ee..000000000
--- a/images/emoji/1f93b-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f93b-1f3fd.png b/images/emoji/1f93b-1f3fd.png
deleted file mode 100644
index 030f32fdd..000000000
--- a/images/emoji/1f93b-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f93b-1f3fe.png b/images/emoji/1f93b-1f3fe.png
deleted file mode 100644
index d4d011091..000000000
--- a/images/emoji/1f93b-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f93b-1f3ff.png b/images/emoji/1f93b-1f3ff.png
deleted file mode 100644
index 69a9789f5..000000000
--- a/images/emoji/1f93b-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f93b.png b/images/emoji/1f93b.png
deleted file mode 100644
index 71e67cfad..000000000
--- a/images/emoji/1f93b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f93c-1f3fb.png b/images/emoji/1f93c-1f3fb.png
deleted file mode 100644
index 379070fd0..000000000
--- a/images/emoji/1f93c-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f93c-1f3fc.png b/images/emoji/1f93c-1f3fc.png
deleted file mode 100644
index 6863ea920..000000000
--- a/images/emoji/1f93c-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f93c-1f3fd.png b/images/emoji/1f93c-1f3fd.png
deleted file mode 100644
index b7e629101..000000000
--- a/images/emoji/1f93c-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f93c-1f3fe.png b/images/emoji/1f93c-1f3fe.png
deleted file mode 100644
index 750f95892..000000000
--- a/images/emoji/1f93c-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f93c-1f3ff.png b/images/emoji/1f93c-1f3ff.png
deleted file mode 100644
index 36ab9bb3f..000000000
--- a/images/emoji/1f93c-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f93c.png b/images/emoji/1f93c.png
deleted file mode 100644
index 9838f24e5..000000000
--- a/images/emoji/1f93c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f93d-1f3fb.png b/images/emoji/1f93d-1f3fb.png
deleted file mode 100644
index bed1a908d..000000000
--- a/images/emoji/1f93d-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f93d-1f3fc.png b/images/emoji/1f93d-1f3fc.png
deleted file mode 100644
index 2e44151d3..000000000
--- a/images/emoji/1f93d-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f93d-1f3fd.png b/images/emoji/1f93d-1f3fd.png
deleted file mode 100644
index b081a4a5a..000000000
--- a/images/emoji/1f93d-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f93d-1f3fe.png b/images/emoji/1f93d-1f3fe.png
deleted file mode 100644
index 82cfbc3b0..000000000
--- a/images/emoji/1f93d-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f93d-1f3ff.png b/images/emoji/1f93d-1f3ff.png
deleted file mode 100644
index 6b8e245dc..000000000
--- a/images/emoji/1f93d-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f93d.png b/images/emoji/1f93d.png
deleted file mode 100644
index 8d6114761..000000000
--- a/images/emoji/1f93d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f93e-1f3fb.png b/images/emoji/1f93e-1f3fb.png
deleted file mode 100644
index a68057a7d..000000000
--- a/images/emoji/1f93e-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f93e-1f3fc.png b/images/emoji/1f93e-1f3fc.png
deleted file mode 100644
index 74972f8a5..000000000
--- a/images/emoji/1f93e-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f93e-1f3fd.png b/images/emoji/1f93e-1f3fd.png
deleted file mode 100644
index 0e3a37c3d..000000000
--- a/images/emoji/1f93e-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f93e-1f3fe.png b/images/emoji/1f93e-1f3fe.png
deleted file mode 100644
index e1233f382..000000000
--- a/images/emoji/1f93e-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f93e-1f3ff.png b/images/emoji/1f93e-1f3ff.png
deleted file mode 100644
index 6b1eb9b64..000000000
--- a/images/emoji/1f93e-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f93e.png b/images/emoji/1f93e.png
deleted file mode 100644
index cb4457678..000000000
--- a/images/emoji/1f93e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f93f.png b/images/emoji/1f93f.png
deleted file mode 100644
index 677c060b4..000000000
--- a/images/emoji/1f93f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f940.png b/images/emoji/1f940.png
deleted file mode 100644
index 62412b143..000000000
--- a/images/emoji/1f940.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f942.png b/images/emoji/1f942.png
deleted file mode 100644
index 32f18d4c9..000000000
--- a/images/emoji/1f942.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f943.png b/images/emoji/1f943.png
deleted file mode 100644
index 7bf092298..000000000
--- a/images/emoji/1f943.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f944.png b/images/emoji/1f944.png
deleted file mode 100644
index 3c4da766a..000000000
--- a/images/emoji/1f944.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f945.png b/images/emoji/1f945.png
deleted file mode 100644
index 3bec11c5b..000000000
--- a/images/emoji/1f945.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f946.png b/images/emoji/1f946.png
deleted file mode 100644
index 2815a1bb3..000000000
--- a/images/emoji/1f946.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f947.png b/images/emoji/1f947.png
deleted file mode 100644
index 83011ad99..000000000
--- a/images/emoji/1f947.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f948.png b/images/emoji/1f948.png
deleted file mode 100644
index 41926fcf5..000000000
--- a/images/emoji/1f948.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f949.png b/images/emoji/1f949.png
deleted file mode 100644
index c713851bc..000000000
--- a/images/emoji/1f949.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f950.png b/images/emoji/1f950.png
deleted file mode 100644
index 502df5b15..000000000
--- a/images/emoji/1f950.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f951.png b/images/emoji/1f951.png
deleted file mode 100644
index 96b847232..000000000
--- a/images/emoji/1f951.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f952.png b/images/emoji/1f952.png
deleted file mode 100644
index c01fd0edd..000000000
--- a/images/emoji/1f952.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f953.png b/images/emoji/1f953.png
deleted file mode 100644
index f38a485fb..000000000
--- a/images/emoji/1f953.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f954.png b/images/emoji/1f954.png
deleted file mode 100644
index 5fa341216..000000000
--- a/images/emoji/1f954.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f955.png b/images/emoji/1f955.png
deleted file mode 100644
index c68829b58..000000000
--- a/images/emoji/1f955.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f956.png b/images/emoji/1f956.png
deleted file mode 100644
index 72477ff78..000000000
--- a/images/emoji/1f956.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f957.png b/images/emoji/1f957.png
deleted file mode 100644
index c89f93411..000000000
--- a/images/emoji/1f957.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f958.png b/images/emoji/1f958.png
deleted file mode 100644
index 663a1006a..000000000
--- a/images/emoji/1f958.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f959.png b/images/emoji/1f959.png
deleted file mode 100644
index a2e10df40..000000000
--- a/images/emoji/1f959.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f95a.png b/images/emoji/1f95a.png
deleted file mode 100644
index c171974d9..000000000
--- a/images/emoji/1f95a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f95b.png b/images/emoji/1f95b.png
deleted file mode 100644
index e4fcf2e64..000000000
--- a/images/emoji/1f95b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f95c.png b/images/emoji/1f95c.png
deleted file mode 100644
index b64fadad0..000000000
--- a/images/emoji/1f95c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f95d.png b/images/emoji/1f95d.png
deleted file mode 100644
index f04835776..000000000
--- a/images/emoji/1f95d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f95e.png b/images/emoji/1f95e.png
deleted file mode 100644
index 6223d1a28..000000000
--- a/images/emoji/1f95e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f960.png b/images/emoji/1f960.png
deleted file mode 100644
index e890c30d4..000000000
--- a/images/emoji/1f960.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f961.png b/images/emoji/1f961.png
deleted file mode 100644
index 4d09f0ee4..000000000
--- a/images/emoji/1f961.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f980.png b/images/emoji/1f980.png
deleted file mode 100644
index ca9350f51..000000000
--- a/images/emoji/1f980.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f981.png b/images/emoji/1f981.png
deleted file mode 100644
index 5062ab47e..000000000
--- a/images/emoji/1f981.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f982.png b/images/emoji/1f982.png
deleted file mode 100644
index 449a6b281..000000000
--- a/images/emoji/1f982.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f983.png b/images/emoji/1f983.png
deleted file mode 100644
index 344af94c9..000000000
--- a/images/emoji/1f983.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f984.png b/images/emoji/1f984.png
deleted file mode 100644
index 05a97969f..000000000
--- a/images/emoji/1f984.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f985.png b/images/emoji/1f985.png
deleted file mode 100644
index 4f277debe..000000000
--- a/images/emoji/1f985.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f986.png b/images/emoji/1f986.png
deleted file mode 100644
index 74330b77c..000000000
--- a/images/emoji/1f986.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f987.png b/images/emoji/1f987.png
deleted file mode 100644
index c8f23c515..000000000
--- a/images/emoji/1f987.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f988.png b/images/emoji/1f988.png
deleted file mode 100644
index c75076d57..000000000
--- a/images/emoji/1f988.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f989.png b/images/emoji/1f989.png
deleted file mode 100644
index a2c318b15..000000000
--- a/images/emoji/1f989.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f98a.png b/images/emoji/1f98a.png
deleted file mode 100644
index aaf1dad35..000000000
--- a/images/emoji/1f98a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f98b.png b/images/emoji/1f98b.png
deleted file mode 100644
index 5631fe992..000000000
--- a/images/emoji/1f98b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f98c.png b/images/emoji/1f98c.png
deleted file mode 100644
index 4a501f880..000000000
--- a/images/emoji/1f98c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f98d.png b/images/emoji/1f98d.png
deleted file mode 100644
index 4f2f9bb38..000000000
--- a/images/emoji/1f98d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f98e.png b/images/emoji/1f98e.png
deleted file mode 100644
index 836387605..000000000
--- a/images/emoji/1f98e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f98f.png b/images/emoji/1f98f.png
deleted file mode 100644
index 12f4e0d9d..000000000
--- a/images/emoji/1f98f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f990.png b/images/emoji/1f990.png
deleted file mode 100644
index 49eff28a7..000000000
--- a/images/emoji/1f990.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f991.png b/images/emoji/1f991.png
deleted file mode 100644
index f01eeba24..000000000
--- a/images/emoji/1f991.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f9c0.png b/images/emoji/1f9c0.png
deleted file mode 100644
index 00e997622..000000000
--- a/images/emoji/1f9c0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/203c.png b/images/emoji/203c.png
deleted file mode 100644
index 58a9c528f..000000000
--- a/images/emoji/203c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2049.png b/images/emoji/2049.png
deleted file mode 100644
index 509813e9b..000000000
--- a/images/emoji/2049.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2122.png b/images/emoji/2122.png
deleted file mode 100644
index 7a0c44a2c..000000000
--- a/images/emoji/2122.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2139.png b/images/emoji/2139.png
deleted file mode 100644
index 871f2db93..000000000
--- a/images/emoji/2139.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2194.png b/images/emoji/2194.png
deleted file mode 100644
index 7937f24f2..000000000
--- a/images/emoji/2194.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2195.png b/images/emoji/2195.png
deleted file mode 100644
index dfa32b971..000000000
--- a/images/emoji/2195.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2196.png b/images/emoji/2196.png
deleted file mode 100644
index f38718fbe..000000000
--- a/images/emoji/2196.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2197.png b/images/emoji/2197.png
deleted file mode 100644
index c43e12d0f..000000000
--- a/images/emoji/2197.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2198.png b/images/emoji/2198.png
deleted file mode 100644
index 7e807da73..000000000
--- a/images/emoji/2198.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2199.png b/images/emoji/2199.png
deleted file mode 100644
index 88b377160..000000000
--- a/images/emoji/2199.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/21a9.png b/images/emoji/21a9.png
deleted file mode 100644
index ba45c2ad9..000000000
--- a/images/emoji/21a9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/21aa.png b/images/emoji/21aa.png
deleted file mode 100644
index e7258ad32..000000000
--- a/images/emoji/21aa.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/231a.png b/images/emoji/231a.png
deleted file mode 100644
index 64819bc6e..000000000
--- a/images/emoji/231a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/231b.png b/images/emoji/231b.png
deleted file mode 100644
index a5db2d1d3..000000000
--- a/images/emoji/231b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2328.png b/images/emoji/2328.png
deleted file mode 100644
index 75027cb9a..000000000
--- a/images/emoji/2328.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/23cf.png b/images/emoji/23cf.png
deleted file mode 100644
index ec5cfc489..000000000
--- a/images/emoji/23cf.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/23e9.png b/images/emoji/23e9.png
deleted file mode 100644
index c406fedfd..000000000
--- a/images/emoji/23e9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/23ea.png b/images/emoji/23ea.png
deleted file mode 100644
index e22e2bd3d..000000000
--- a/images/emoji/23ea.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/23eb.png b/images/emoji/23eb.png
deleted file mode 100644
index 13543d5ee..000000000
--- a/images/emoji/23eb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/23ec.png b/images/emoji/23ec.png
deleted file mode 100644
index 90193bfcb..000000000
--- a/images/emoji/23ec.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/23ed.png b/images/emoji/23ed.png
deleted file mode 100644
index f8880d33b..000000000
--- a/images/emoji/23ed.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/23ee.png b/images/emoji/23ee.png
deleted file mode 100644
index 1ffd0566c..000000000
--- a/images/emoji/23ee.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/23ef.png b/images/emoji/23ef.png
deleted file mode 100644
index a9f857139..000000000
--- a/images/emoji/23ef.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/23f0.png b/images/emoji/23f0.png
deleted file mode 100644
index cdbc2fbb9..000000000
--- a/images/emoji/23f0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/23f1.png b/images/emoji/23f1.png
deleted file mode 100644
index 6a3a2ef64..000000000
--- a/images/emoji/23f1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/23f2.png b/images/emoji/23f2.png
deleted file mode 100644
index 8a3be574c..000000000
--- a/images/emoji/23f2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/23f3.png b/images/emoji/23f3.png
deleted file mode 100644
index b93b15ed6..000000000
--- a/images/emoji/23f3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/23f8.png b/images/emoji/23f8.png
deleted file mode 100644
index 4f07e7ebf..000000000
--- a/images/emoji/23f8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/23f9.png b/images/emoji/23f9.png
deleted file mode 100644
index cfa99988a..000000000
--- a/images/emoji/23f9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/23fa.png b/images/emoji/23fa.png
deleted file mode 100644
index ada52830f..000000000
--- a/images/emoji/23fa.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/24c2.png b/images/emoji/24c2.png
deleted file mode 100644
index 8a3506fc1..000000000
--- a/images/emoji/24c2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/25aa.png b/images/emoji/25aa.png
deleted file mode 100644
index 48595d3e1..000000000
--- a/images/emoji/25aa.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/25ab.png b/images/emoji/25ab.png
deleted file mode 100644
index d7ebdb0c0..000000000
--- a/images/emoji/25ab.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/25b6.png b/images/emoji/25b6.png
deleted file mode 100644
index 4e2b68285..000000000
--- a/images/emoji/25b6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/25c0.png b/images/emoji/25c0.png
deleted file mode 100644
index ee38e3b03..000000000
--- a/images/emoji/25c0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/25fb.png b/images/emoji/25fb.png
deleted file mode 100644
index 8daacf570..000000000
--- a/images/emoji/25fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/25fc.png b/images/emoji/25fc.png
deleted file mode 100644
index 05a30a6aa..000000000
--- a/images/emoji/25fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/25fd.png b/images/emoji/25fd.png
deleted file mode 100644
index ae8741267..000000000
--- a/images/emoji/25fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/25fe.png b/images/emoji/25fe.png
deleted file mode 100644
index 39765bba6..000000000
--- a/images/emoji/25fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2600.png b/images/emoji/2600.png
deleted file mode 100644
index fd521ae31..000000000
--- a/images/emoji/2600.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2601.png b/images/emoji/2601.png
deleted file mode 100644
index 5b4f57f77..000000000
--- a/images/emoji/2601.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2602.png b/images/emoji/2602.png
deleted file mode 100644
index 97fe859e7..000000000
--- a/images/emoji/2602.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2603.png b/images/emoji/2603.png
deleted file mode 100644
index 896f28502..000000000
--- a/images/emoji/2603.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2604.png b/images/emoji/2604.png
deleted file mode 100644
index d775d6387..000000000
--- a/images/emoji/2604.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/260e.png b/images/emoji/260e.png
deleted file mode 100644
index 0fbb8c12c..000000000
--- a/images/emoji/260e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2611.png b/images/emoji/2611.png
deleted file mode 100644
index 284d95738..000000000
--- a/images/emoji/2611.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2614.png b/images/emoji/2614.png
deleted file mode 100644
index 5b35b7ff6..000000000
--- a/images/emoji/2614.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2615.png b/images/emoji/2615.png
deleted file mode 100644
index 553061471..000000000
--- a/images/emoji/2615.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2618.png b/images/emoji/2618.png
deleted file mode 100644
index f202aecfe..000000000
--- a/images/emoji/2618.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/261d-1f3fb.png b/images/emoji/261d-1f3fb.png
deleted file mode 100644
index 6a9db21d6..000000000
--- a/images/emoji/261d-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/261d-1f3fc.png b/images/emoji/261d-1f3fc.png
deleted file mode 100644
index 15aa9ea0e..000000000
--- a/images/emoji/261d-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/261d-1f3fd.png b/images/emoji/261d-1f3fd.png
deleted file mode 100644
index 652b73a9c..000000000
--- a/images/emoji/261d-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/261d-1f3fe.png b/images/emoji/261d-1f3fe.png
deleted file mode 100644
index 692bad926..000000000
--- a/images/emoji/261d-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/261d-1f3ff.png b/images/emoji/261d-1f3ff.png
deleted file mode 100644
index 1e1b10fb7..000000000
--- a/images/emoji/261d-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/261d.png b/images/emoji/261d.png
deleted file mode 100644
index f4978ff0f..000000000
--- a/images/emoji/261d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2620.png b/images/emoji/2620.png
deleted file mode 100644
index b459df922..000000000
--- a/images/emoji/2620.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2622.png b/images/emoji/2622.png
deleted file mode 100644
index 3b46199fe..000000000
--- a/images/emoji/2622.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2623.png b/images/emoji/2623.png
deleted file mode 100644
index 007b4fc2d..000000000
--- a/images/emoji/2623.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2626.png b/images/emoji/2626.png
deleted file mode 100644
index 0530e33a4..000000000
--- a/images/emoji/2626.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/262a.png b/images/emoji/262a.png
deleted file mode 100644
index e18263645..000000000
--- a/images/emoji/262a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/262e.png b/images/emoji/262e.png
deleted file mode 100644
index 86033faf4..000000000
--- a/images/emoji/262e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/262f.png b/images/emoji/262f.png
deleted file mode 100644
index f2900f633..000000000
--- a/images/emoji/262f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2638.png b/images/emoji/2638.png
deleted file mode 100644
index 3666db001..000000000
--- a/images/emoji/2638.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2639.png b/images/emoji/2639.png
deleted file mode 100644
index 6ae71f233..000000000
--- a/images/emoji/2639.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/263a.png b/images/emoji/263a.png
deleted file mode 100644
index e9e53c03d..000000000
--- a/images/emoji/263a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2648.png b/images/emoji/2648.png
deleted file mode 100644
index 21a189d0e..000000000
--- a/images/emoji/2648.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2649.png b/images/emoji/2649.png
deleted file mode 100644
index b2a370df4..000000000
--- a/images/emoji/2649.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/264a.png b/images/emoji/264a.png
deleted file mode 100644
index 1a09698cf..000000000
--- a/images/emoji/264a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/264b.png b/images/emoji/264b.png
deleted file mode 100644
index a64af07cb..000000000
--- a/images/emoji/264b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/264c.png b/images/emoji/264c.png
deleted file mode 100644
index 30158d34d..000000000
--- a/images/emoji/264c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/264d.png b/images/emoji/264d.png
deleted file mode 100644
index a6b56c2cb..000000000
--- a/images/emoji/264d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/264e.png b/images/emoji/264e.png
deleted file mode 100644
index 8fd133a35..000000000
--- a/images/emoji/264e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/264f.png b/images/emoji/264f.png
deleted file mode 100644
index c31a99204..000000000
--- a/images/emoji/264f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2650.png b/images/emoji/2650.png
deleted file mode 100644
index f8d94ff29..000000000
--- a/images/emoji/2650.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2651.png b/images/emoji/2651.png
deleted file mode 100644
index 6293d31d4..000000000
--- a/images/emoji/2651.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2652.png b/images/emoji/2652.png
deleted file mode 100644
index 641a4f688..000000000
--- a/images/emoji/2652.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2653.png b/images/emoji/2653.png
deleted file mode 100644
index 7f6f646a9..000000000
--- a/images/emoji/2653.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2660.png b/images/emoji/2660.png
deleted file mode 100644
index f822f184c..000000000
--- a/images/emoji/2660.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2663.png b/images/emoji/2663.png
deleted file mode 100644
index 4f2abf791..000000000
--- a/images/emoji/2663.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2666.png b/images/emoji/2666.png
deleted file mode 100644
index 1f25f51f9..000000000
--- a/images/emoji/2666.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2668.png b/images/emoji/2668.png
deleted file mode 100644
index 3d9df2d94..000000000
--- a/images/emoji/2668.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/267b.png b/images/emoji/267b.png
deleted file mode 100644
index 9221f095c..000000000
--- a/images/emoji/267b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/267f.png b/images/emoji/267f.png
deleted file mode 100644
index 4e5b2698e..000000000
--- a/images/emoji/267f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2692.png b/images/emoji/2692.png
deleted file mode 100644
index 3bee30ec5..000000000
--- a/images/emoji/2692.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2693.png b/images/emoji/2693.png
deleted file mode 100644
index b036f70a0..000000000
--- a/images/emoji/2693.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2694.png b/images/emoji/2694.png
deleted file mode 100644
index 907e96071..000000000
--- a/images/emoji/2694.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2696.png b/images/emoji/2696.png
deleted file mode 100644
index 0757eda16..000000000
--- a/images/emoji/2696.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2697.png b/images/emoji/2697.png
deleted file mode 100644
index 307a73242..000000000
--- a/images/emoji/2697.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2699.png b/images/emoji/2699.png
deleted file mode 100644
index 2a1cc2c0f..000000000
--- a/images/emoji/2699.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/269b.png b/images/emoji/269b.png
deleted file mode 100644
index 5f4567aa0..000000000
--- a/images/emoji/269b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/269c.png b/images/emoji/269c.png
deleted file mode 100644
index c9250d27f..000000000
--- a/images/emoji/269c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26a0.png b/images/emoji/26a0.png
deleted file mode 100644
index 35691c2ed..000000000
--- a/images/emoji/26a0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26a1.png b/images/emoji/26a1.png
deleted file mode 100644
index 47e68e48e..000000000
--- a/images/emoji/26a1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26aa.png b/images/emoji/26aa.png
deleted file mode 100644
index c19e15684..000000000
--- a/images/emoji/26aa.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26ab.png b/images/emoji/26ab.png
deleted file mode 100644
index b62b87170..000000000
--- a/images/emoji/26ab.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26b0.png b/images/emoji/26b0.png
deleted file mode 100644
index fb2932aa5..000000000
--- a/images/emoji/26b0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26b1.png b/images/emoji/26b1.png
deleted file mode 100644
index 6b5b35034..000000000
--- a/images/emoji/26b1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26bd.png b/images/emoji/26bd.png
deleted file mode 100644
index 28cfa218d..000000000
--- a/images/emoji/26bd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26be.png b/images/emoji/26be.png
deleted file mode 100644
index f8463f153..000000000
--- a/images/emoji/26be.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26c4.png b/images/emoji/26c4.png
deleted file mode 100644
index 20c177c2a..000000000
--- a/images/emoji/26c4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26c5.png b/images/emoji/26c5.png
deleted file mode 100644
index a55e59c34..000000000
--- a/images/emoji/26c5.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26c8.png b/images/emoji/26c8.png
deleted file mode 100644
index 31a26a1b6..000000000
--- a/images/emoji/26c8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26ce.png b/images/emoji/26ce.png
deleted file mode 100644
index 0a780a700..000000000
--- a/images/emoji/26ce.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26cf.png b/images/emoji/26cf.png
deleted file mode 100644
index 6370fe6d7..000000000
--- a/images/emoji/26cf.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26d1.png b/images/emoji/26d1.png
deleted file mode 100644
index 7140a6760..000000000
--- a/images/emoji/26d1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26d3.png b/images/emoji/26d3.png
deleted file mode 100644
index 57f46139a..000000000
--- a/images/emoji/26d3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26d4.png b/images/emoji/26d4.png
deleted file mode 100644
index 476800fc5..000000000
--- a/images/emoji/26d4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26e9.png b/images/emoji/26e9.png
deleted file mode 100644
index 5a344975b..000000000
--- a/images/emoji/26e9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26ea.png b/images/emoji/26ea.png
deleted file mode 100644
index 24df10f1a..000000000
--- a/images/emoji/26ea.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26f0.png b/images/emoji/26f0.png
deleted file mode 100644
index 6722ebdd2..000000000
--- a/images/emoji/26f0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26f1.png b/images/emoji/26f1.png
deleted file mode 100644
index 258e1e757..000000000
--- a/images/emoji/26f1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26f2.png b/images/emoji/26f2.png
deleted file mode 100644
index 293f5d91c..000000000
--- a/images/emoji/26f2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26f3.png b/images/emoji/26f3.png
deleted file mode 100644
index f65a21d8a..000000000
--- a/images/emoji/26f3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26f4.png b/images/emoji/26f4.png
deleted file mode 100644
index 41816b3ae..000000000
--- a/images/emoji/26f4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26f5.png b/images/emoji/26f5.png
deleted file mode 100644
index 772ef11da..000000000
--- a/images/emoji/26f5.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26f7.png b/images/emoji/26f7.png
deleted file mode 100644
index 2eb3bdce2..000000000
--- a/images/emoji/26f7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26f8.png b/images/emoji/26f8.png
deleted file mode 100644
index c56b7b8a5..000000000
--- a/images/emoji/26f8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26f9-1f3fb.png b/images/emoji/26f9-1f3fb.png
deleted file mode 100644
index 43f97e7c3..000000000
--- a/images/emoji/26f9-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26f9-1f3fc.png b/images/emoji/26f9-1f3fc.png
deleted file mode 100644
index f892fd596..000000000
--- a/images/emoji/26f9-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26f9-1f3fd.png b/images/emoji/26f9-1f3fd.png
deleted file mode 100644
index e109997a9..000000000
--- a/images/emoji/26f9-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26f9-1f3fe.png b/images/emoji/26f9-1f3fe.png
deleted file mode 100644
index 354e8f9c2..000000000
--- a/images/emoji/26f9-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26f9-1f3ff.png b/images/emoji/26f9-1f3ff.png
deleted file mode 100644
index 9581dbbea..000000000
--- a/images/emoji/26f9-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26f9.png b/images/emoji/26f9.png
deleted file mode 100644
index 63bff9c3e..000000000
--- a/images/emoji/26f9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26fa.png b/images/emoji/26fa.png
deleted file mode 100644
index 3fddcfc56..000000000
--- a/images/emoji/26fa.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26fd.png b/images/emoji/26fd.png
deleted file mode 100644
index 05b187944..000000000
--- a/images/emoji/26fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2702.png b/images/emoji/2702.png
deleted file mode 100644
index 270571c8c..000000000
--- a/images/emoji/2702.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2705.png b/images/emoji/2705.png
deleted file mode 100644
index e55f087e5..000000000
--- a/images/emoji/2705.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2708.png b/images/emoji/2708.png
deleted file mode 100644
index 268d2ac3c..000000000
--- a/images/emoji/2708.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2709.png b/images/emoji/2709.png
deleted file mode 100644
index ec77ac375..000000000
--- a/images/emoji/2709.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/270a-1f3fb.png b/images/emoji/270a-1f3fb.png
deleted file mode 100644
index 02809e2dd..000000000
--- a/images/emoji/270a-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/270a-1f3fc.png b/images/emoji/270a-1f3fc.png
deleted file mode 100644
index 5de348103..000000000
--- a/images/emoji/270a-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/270a-1f3fd.png b/images/emoji/270a-1f3fd.png
deleted file mode 100644
index 0d5240129..000000000
--- a/images/emoji/270a-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/270a-1f3fe.png b/images/emoji/270a-1f3fe.png
deleted file mode 100644
index a95c0dd63..000000000
--- a/images/emoji/270a-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/270a-1f3ff.png b/images/emoji/270a-1f3ff.png
deleted file mode 100644
index a2f092fd8..000000000
--- a/images/emoji/270a-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/270a.png b/images/emoji/270a.png
deleted file mode 100644
index de33592bf..000000000
--- a/images/emoji/270a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/270b-1f3fb.png b/images/emoji/270b-1f3fb.png
deleted file mode 100644
index 3b752902c..000000000
--- a/images/emoji/270b-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/270b-1f3fc.png b/images/emoji/270b-1f3fc.png
deleted file mode 100644
index 44e2a514c..000000000
--- a/images/emoji/270b-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/270b-1f3fd.png b/images/emoji/270b-1f3fd.png
deleted file mode 100644
index 5bb62a752..000000000
--- a/images/emoji/270b-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/270b-1f3fe.png b/images/emoji/270b-1f3fe.png
deleted file mode 100644
index c7f8c9ec2..000000000
--- a/images/emoji/270b-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/270b-1f3ff.png b/images/emoji/270b-1f3ff.png
deleted file mode 100644
index c601b58a7..000000000
--- a/images/emoji/270b-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/270b.png b/images/emoji/270b.png
deleted file mode 100644
index 6b2954315..000000000
--- a/images/emoji/270b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/270c-1f3fb.png b/images/emoji/270c-1f3fb.png
deleted file mode 100644
index 6ac54a745..000000000
--- a/images/emoji/270c-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/270c-1f3fc.png b/images/emoji/270c-1f3fc.png
deleted file mode 100644
index 6dd966986..000000000
--- a/images/emoji/270c-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/270c-1f3fd.png b/images/emoji/270c-1f3fd.png
deleted file mode 100644
index a615e53f0..000000000
--- a/images/emoji/270c-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/270c-1f3fe.png b/images/emoji/270c-1f3fe.png
deleted file mode 100644
index 33a34bd5a..000000000
--- a/images/emoji/270c-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/270c-1f3ff.png b/images/emoji/270c-1f3ff.png
deleted file mode 100644
index 45ad14b6c..000000000
--- a/images/emoji/270c-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/270c.png b/images/emoji/270c.png
deleted file mode 100644
index 70c5516ff..000000000
--- a/images/emoji/270c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/270d-1f3fb.png b/images/emoji/270d-1f3fb.png
deleted file mode 100644
index 7923d8ebb..000000000
--- a/images/emoji/270d-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/270d-1f3fc.png b/images/emoji/270d-1f3fc.png
deleted file mode 100644
index bcb304e15..000000000
--- a/images/emoji/270d-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/270d-1f3fd.png b/images/emoji/270d-1f3fd.png
deleted file mode 100644
index fd885fd2d..000000000
--- a/images/emoji/270d-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/270d-1f3fe.png b/images/emoji/270d-1f3fe.png
deleted file mode 100644
index d065b8c64..000000000
--- a/images/emoji/270d-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/270d-1f3ff.png b/images/emoji/270d-1f3ff.png
deleted file mode 100644
index a44b3dd75..000000000
--- a/images/emoji/270d-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/270d.png b/images/emoji/270d.png
deleted file mode 100644
index 85639f8ac..000000000
--- a/images/emoji/270d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/270f.png b/images/emoji/270f.png
deleted file mode 100644
index 3833d590f..000000000
--- a/images/emoji/270f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2712.png b/images/emoji/2712.png
deleted file mode 100644
index 872d0ae15..000000000
--- a/images/emoji/2712.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2714.png b/images/emoji/2714.png
deleted file mode 100644
index 03bd69537..000000000
--- a/images/emoji/2714.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2716.png b/images/emoji/2716.png
deleted file mode 100644
index e47cc1b68..000000000
--- a/images/emoji/2716.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/271d.png b/images/emoji/271d.png
deleted file mode 100644
index 42b10e822..000000000
--- a/images/emoji/271d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2721.png b/images/emoji/2721.png
deleted file mode 100644
index fc59d0dde..000000000
--- a/images/emoji/2721.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2728.png b/images/emoji/2728.png
deleted file mode 100644
index 169bc10b0..000000000
--- a/images/emoji/2728.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2733.png b/images/emoji/2733.png
deleted file mode 100644
index 3307ffa62..000000000
--- a/images/emoji/2733.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2734.png b/images/emoji/2734.png
deleted file mode 100644
index 820179bda..000000000
--- a/images/emoji/2734.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2744.png b/images/emoji/2744.png
deleted file mode 100644
index db319a77e..000000000
--- a/images/emoji/2744.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2747.png b/images/emoji/2747.png
deleted file mode 100644
index 6aa7b6ec9..000000000
--- a/images/emoji/2747.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/274c.png b/images/emoji/274c.png
deleted file mode 100644
index 9f9ed0f7a..000000000
--- a/images/emoji/274c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/274e.png b/images/emoji/274e.png
deleted file mode 100644
index dae487f1f..000000000
--- a/images/emoji/274e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2753.png b/images/emoji/2753.png
deleted file mode 100644
index 5a58f3458..000000000
--- a/images/emoji/2753.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2754.png b/images/emoji/2754.png
deleted file mode 100644
index 6e7824c75..000000000
--- a/images/emoji/2754.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2755.png b/images/emoji/2755.png
deleted file mode 100644
index 9b64da8bf..000000000
--- a/images/emoji/2755.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2757.png b/images/emoji/2757.png
deleted file mode 100644
index 2c1440642..000000000
--- a/images/emoji/2757.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2763.png b/images/emoji/2763.png
deleted file mode 100644
index 91b520be4..000000000
--- a/images/emoji/2763.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2764.png b/images/emoji/2764.png
deleted file mode 100644
index 638cb72dc..000000000
--- a/images/emoji/2764.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2795.png b/images/emoji/2795.png
deleted file mode 100644
index 40799798a..000000000
--- a/images/emoji/2795.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2796.png b/images/emoji/2796.png
deleted file mode 100644
index 054211caf..000000000
--- a/images/emoji/2796.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2797.png b/images/emoji/2797.png
deleted file mode 100644
index df32ab21b..000000000
--- a/images/emoji/2797.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/27a1.png b/images/emoji/27a1.png
deleted file mode 100644
index 4755670b5..000000000
--- a/images/emoji/27a1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/27b0.png b/images/emoji/27b0.png
deleted file mode 100644
index 440aa56d5..000000000
--- a/images/emoji/27b0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/27bf.png b/images/emoji/27bf.png
deleted file mode 100644
index 0b82c8fe3..000000000
--- a/images/emoji/27bf.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2934.png b/images/emoji/2934.png
deleted file mode 100644
index f29bfcfc0..000000000
--- a/images/emoji/2934.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2935.png b/images/emoji/2935.png
deleted file mode 100644
index 2d9d24bca..000000000
--- a/images/emoji/2935.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2b05.png b/images/emoji/2b05.png
deleted file mode 100644
index 8c685e0a8..000000000
--- a/images/emoji/2b05.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2b06.png b/images/emoji/2b06.png
deleted file mode 100644
index af8218a87..000000000
--- a/images/emoji/2b06.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2b07.png b/images/emoji/2b07.png
deleted file mode 100644
index b8eefd0b1..000000000
--- a/images/emoji/2b07.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2b1b.png b/images/emoji/2b1b.png
deleted file mode 100644
index 162f2bb42..000000000
--- a/images/emoji/2b1b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2b1c.png b/images/emoji/2b1c.png
deleted file mode 100644
index 6f06c1c79..000000000
--- a/images/emoji/2b1c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2b50.png b/images/emoji/2b50.png
deleted file mode 100644
index c93094707..000000000
--- a/images/emoji/2b50.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2b55.png b/images/emoji/2b55.png
deleted file mode 100644
index 3fe75ce46..000000000
--- a/images/emoji/2b55.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/3030.png b/images/emoji/3030.png
deleted file mode 100644
index 001c8d6e4..000000000
--- a/images/emoji/3030.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/303d.png b/images/emoji/303d.png
deleted file mode 100644
index 70453d415..000000000
--- a/images/emoji/303d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/3297.png b/images/emoji/3297.png
deleted file mode 100644
index ba8c89d95..000000000
--- a/images/emoji/3297.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/3299.png b/images/emoji/3299.png
deleted file mode 100644
index 5fd72608e..000000000
--- a/images/emoji/3299.png
+++ /dev/null
Binary files differ
diff --git a/include/attach.php b/include/attach.php
index 79313ab1a..ac50b05b1 100644
--- a/include/attach.php
+++ b/include/attach.php
@@ -209,7 +209,7 @@ function attach_list_files($channel_id, $observer, $hash = '', $filename = '', $
// Retrieve all columns except 'data'
- $r = q("select id, aid, uid, hash, filename, filetype, filesize, revision, folder, os_storage, is_dir, is_photo, flags, created, edited, allow_cid, allow_gid, deny_cid, deny_gid from attach where uid = %d $sql_extra ORDER BY $orderby $limit",
+ $r = q("select id, aid, uid, hash, filename, filetype, filesize, revision, folder, os_path, display_path, os_storage, is_dir, is_photo, flags, created, edited, allow_cid, allow_gid, deny_cid, deny_gid from attach where uid = %d $sql_extra ORDER BY $orderby $limit",
intval($channel_id)
);
@@ -284,6 +284,7 @@ function attach_by_hash($hash, $observer_hash, $rev = 0) {
return $ret;
}
+
function attach_can_view_folder($uid,$ob_hash,$folder_hash) {
$sql_extra = permissions_sql($uid,$ob_hash);
@@ -348,7 +349,7 @@ function attach_by_hash_nodata($hash, $observer_hash, $rev = 0) {
// Now we'll see if we can access the attachment
- $r = q("select id, aid, uid, hash, creator, filename, filetype, filesize, revision, folder, os_storage, is_photo, is_dir, flags, created, edited, allow_cid, allow_gid, deny_cid, deny_gid from attach where uid = %d and hash = '%s' $sql_extra limit 1",
+ $r = q("select id, aid, uid, hash, creator, filename, filetype, filesize, revision, folder, os_storage, is_photo, os_path, display_path, is_dir, flags, created, edited, allow_cid, allow_gid, deny_cid, deny_gid from attach where uid = %d and hash = '%s' $sql_extra limit 1",
intval($r[0]['uid']),
dbesc($hash)
);
@@ -531,7 +532,7 @@ function attach_store($channel, $observer_hash, $options = '', $arr = null) {
if($options === 'update' && $arr && array_key_exists('revision',$arr))
$sql_options = " and revision = " . intval($arr['revision']) . " ";
- $x = q("select id, aid, uid, filename, filetype, filesize, hash, revision, folder, os_storage, is_photo, flags, created, edited, allow_cid, allow_gid, deny_cid, deny_gid from attach where hash = '%s' and uid = %d $sql_options limit 1",
+ $x = q("select id, aid, uid, filename, filetype, filesize, hash, revision, folder, os_storage, is_photo, os_path, display_path, flags, created, edited, allow_cid, allow_gid, deny_cid, deny_gid from attach where hash = '%s' and uid = %d $sql_options limit 1",
dbesc($arr['hash']),
intval($channel_id)
);
@@ -702,11 +703,11 @@ function attach_store($channel, $observer_hash, $options = '', $arr = null) {
$os_relpath .= $folder_hash . '/';
}
- $os_relpath .= $hash;
+ $os_relpath .= $hash;
+ $os_relpath = ltrim($os_relpath,'/');
- // not yet used
- $os_path = '';
- $display_path = '';
+ $os_path = $os_relpath;
+ $display_path = $pathname . '/' . $filename;
if($src)
@file_put_contents($os_basepath . $os_relpath,@file_get_contents($src));
@@ -810,7 +811,7 @@ function attach_store($channel, $observer_hash, $options = '', $arr = null) {
if($is_photo) {
- $args = array( 'source' => $source, 'visible' => $visible, 'resource_id' => $hash, 'album' => basename($pathname), 'os_path' => $os_basepath . $os_relpath, 'filename' => $filename, 'getimagesize' => $gis, 'directory' => $direct, 'options' => $options );
+ $args = array( 'source' => $source, 'visible' => $visible, 'resource_id' => $hash, 'album' => $pathname, 'os_syspath' => $os_basepath . $os_relpath, 'os_path' => $os_path, 'display_path' => $display_path, 'filename' => $filename, 'getimagesize' => $gis, 'directory' => $direct, 'options' => $options );
if($arr['contact_allow'])
$args['contact_allow'] = $arr['contact_allow'];
if($arr['group_allow'])
@@ -914,7 +915,7 @@ function z_readdir($channel_id, $observer_hash, $pathname, $parent_hash = '') {
if(count($paths) > 1) {
$curpath = array_shift($paths);
- $r = q("select hash, id, is_dir from attach where uid = %d and filename = '%s' and is_dir != 0 " . permissions_sql($channel_id) . " limit 1",
+ $r = q("select hash, id, is_dir from attach where uid = %d and filename = '%s' and is_dir != 0 " . permissions_sql($channel_id,$observer_hash) . " limit 1",
intval($channel_id),
dbesc($curpath)
);
@@ -929,7 +930,7 @@ function z_readdir($channel_id, $observer_hash, $pathname, $parent_hash = '') {
else
$paths = array($pathname);
- $r = q("select id, aid, uid, hash, creator, filename, filetype, filesize, revision, folder, is_photo, is_dir, os_storage, flags, created, edited, allow_cid, allow_gid, deny_cid, deny_gid from attach where id = %d and folder = '%s' and filename = '%s' and is_dir != 0 " . permissions_sql($channel_id),
+ $r = q("select id, aid, uid, hash, creator, filename, filetype, filesize, revision, folder, os_path, display_path, is_photo, is_dir, os_storage, flags, created, edited, allow_cid, allow_gid, deny_cid, deny_gid from attach where id = %d and folder = '%s' and filename = '%s' and is_dir != 0 " . permissions_sql($channel_id),
intval($channel_id),
dbesc($parent_hash),
dbesc($paths[0])
@@ -968,12 +969,15 @@ function attach_mkdir($channel, $observer_hash, $arr = null) {
$sql_options = '';
- $basepath = 'store/' . $channel['channel_address'];
+ $os_basepath = 'store/' . $channel['channel_address'];
- logger('attach_mkdir: basepath: ' . $basepath);
+ logger('attach_mkdir: basepath: ' . $os_basepath);
- if(! is_dir($basepath))
- os_mkdir($basepath,STORAGE_DEFAULT_PERMISSIONS, true);
+ if(! is_dir($os_basepath))
+ os_mkdir($os_basepath,STORAGE_DEFAULT_PERMISSIONS, true);
+
+
+ $os_basepath .= '/';
if(! perm_is_allowed($channel_id, $observer_hash, 'write_storage')) {
$ret['message'] = t('Permission denied.');
@@ -1019,10 +1023,13 @@ function attach_mkdir($channel, $observer_hash, $arr = null) {
$lpath = '';
$lfile = $arr['folder'];
+ $dpath = '';
+
$sql_options = permissions_sql($channel['channel_id']);
+
do {
- $r = q("select filename, hash, flags, is_dir, folder from attach where uid = %d and hash = '%s' and is_dir != 0
+ $r = q("select filename, hash, flags, is_dir, folder, display_path from attach where uid = %d and hash = '%s' and is_dir = 1
$sql_options limit 1",
intval($channel['channel_id']),
dbesc($lfile)
@@ -1032,22 +1039,26 @@ function attach_mkdir($channel, $observer_hash, $arr = null) {
$ret['message'] = t('Path not found.');
return $ret;
}
+
+ $dpath = $r[0]['filename'] . (($dpath) ? '/' . $dpath : '');
+
if($lfile)
- $lpath = $r[0]['hash'] . '/' . $lpath;
+ $lpath = $r[0]['hash'] . (($lpath) ? '/' . $lpath : '');
+
$lfile = $r[0]['folder'];
+
} while ( ($r[0]['folder']) && intval($r[0]['is_dir'])) ;
- $path = $basepath . '/' . $lpath;
+
+ $path = $lpath;
}
else
- $path = $basepath . '/';
-
- $path .= $arr['hash'];
+ $path = '';
$created = datetime_convert();
- // not yet used
- $os_path = '';
- $display_path = '';
+ $os_path = ltrim($path . '/' . $arr['hash'],'/');
+ $display_path = ltrim($dpath . '/' . $arr['filename'],'/');
+
$r = q("INSERT INTO attach ( aid, uid, hash, creator, filename, filetype, filesize, revision, folder, os_storage, is_dir, content, created, edited, os_path, display_path, allow_cid, allow_gid, deny_cid, deny_gid )
VALUES ( %d, %d, '%s', '%s', '%s', '%s', %d, %d, '%s', %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s' ) ",
@@ -1062,7 +1073,7 @@ function attach_mkdir($channel, $observer_hash, $arr = null) {
dbesc($arr['folder']),
intval(1),
intval(1),
- dbescbin($path),
+ dbescbin($os_basepath . $os_path),
dbesc($created),
dbesc($created),
dbesc($os_path),
@@ -1074,7 +1085,7 @@ function attach_mkdir($channel, $observer_hash, $arr = null) {
);
if($r) {
- if(os_mkdir($path, STORAGE_DEFAULT_PERMISSIONS, true)) {
+ if(os_mkdir($os_basepath . $os_path, STORAGE_DEFAULT_PERMISSIONS, true)) {
$ret['success'] = true;
// update the parent folder's lastmodified timestamp
@@ -1092,7 +1103,7 @@ function attach_mkdir($channel, $observer_hash, $arr = null) {
$ret['data'] = $z[0];
}
else {
- logger('attach_mkdir: ' . mkdir . ' ' . $path . ' failed.');
+ logger('attach_mkdir: ' . mkdir . ' ' . $os_basepath . $os_path . ' failed.');
$ret['message'] = t('mkdir failed.');
}
}
@@ -2212,10 +2223,23 @@ function attach_move($channel_id, $resource_id, $new_folder_hash) {
intval($r[0]['id'])
);
+
+ $x = attach_syspaths($channel_id,$resource_id);
+
+ $t1 = q("update attach set os_path = '%s', display_path = '%s' where id = %d",
+ dbesc($x['os_path']),
+ dbesc($x['path']),
+ intval($r[0]['id'])
+ );
+
+
if($r[0]['is_photo']) {
- $t = q("update photo set album = '%s', filename = '%s' where resource_id = '%s' and uid = %d",
+ $t = q("update photo set album = '%s', filename = '%s', os_path = '%s', display_path = '%s'
+ where resource_id = '%s' and uid = %d",
dbesc($newdirname),
dbesc($filename),
+ dbesc($x['os_path']),
+ dbesc($x['path']),
dbesc($resource_id),
intval($channel_id)
);
@@ -2243,8 +2267,9 @@ function attach_folder_select_list($channel_id) {
if($r) {
foreach($r as $rv) {
$x = attach_folder_rpaths($r,$rv);
- if($x)
+ if($x) {
$out[$x[0]] = $x[1];
+ }
}
}
@@ -2266,7 +2291,6 @@ function attach_folder_rpaths($all_folders,$that_folder) {
continue;
if($selected['hash'] == $parent_hash) {
$path = '/' . $selected['filename'] . $path;
- $current_hash = $selected['hash'];
$parent_hash = $selected['folder'];
$found = true;
break;
@@ -2280,3 +2304,54 @@ function attach_folder_rpaths($all_folders,$that_folder) {
return (($error) ? false : [ $current_hash , $path ]);
}
+
+
+function attach_syspaths($channel_id,$attach_hash) {
+
+ $os_path = '';
+ $path = '';
+ do {
+
+ $r = q("select folder, filename, hash from attach where hash = '%s' and uid = %d",
+ dbesc($attach_hash),
+ intval($channel_id)
+ );
+ if(! $r)
+ break;
+
+ $os_path = $r[0]['hash'] . (($os_path) ? '/' . $os_path : '');
+ $path = $r[0]['filename'] . (($path) ? '/' . $path : '');
+ $attach_hash = $r[0]['folder'];
+ }
+ while($attach_hash);
+
+ return [ 'os_path' => $os_path, 'path' => $path ];
+
+
+}
+
+
+
+function attach_upgrade() {
+
+ $r = q("select id, uid, hash from attach where os_path = '' and display_path = '' limit 100");
+ if($r) {
+ foreach($r as $rv) {
+ $x = attach_syspaths($rv['uid'],$rv['hash']);
+ if($x) {
+ $w = q("update attach set os_path = '%s', display_path = '%s' where id = %d",
+ dbesc($x['os_path']),
+ dbesc($x['path']),
+ intval($rv['id'])
+ );
+ $y = q("update photo set os_path = '%s', display_path = '%s' where uid = %d and resource_id = '%s'",
+ dbesc($x['os_path']),
+ dbesc($x['path']),
+ intval($rv['uid']),
+ dbesc($rv['hash'])
+ );
+ }
+ }
+ }
+}
+
diff --git a/include/bbcode.php b/include/bbcode.php
index c0033f280..2f15cefe1 100644
--- a/include/bbcode.php
+++ b/include/bbcode.php
@@ -776,7 +776,7 @@ function bbcode($Text, $preserve_nl = false, $tryoembed = true, $cache = false)
// Perform URL Search
- $urlchars = '[a-zA-Z0-9\:\/\-\?\&\;\.\=\@\_\~\#\%\$\!\+\,\@\(\)]';
+ $urlchars = '[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,\@\(\)]';
if (strpos($Text,'http') !== false) {
if($tryoembed) {
diff --git a/include/channel.php b/include/channel.php
index 71ba2476f..31dca1ae5 100644
--- a/include/channel.php
+++ b/include/channel.php
@@ -57,8 +57,9 @@ function identity_check_service_class($account_id) {
* Plugins can set additional policies such as full name requirements, character
* sets, multi-byte length, etc.
*
+ * @hooks validate_channelname
+ * * \e array \b name
* @param string $name
- *
* @returns nil return if name is valid, or string describing the error state.
*/
function validate_channelname($name) {
@@ -69,7 +70,7 @@ function validate_channelname($name) {
if (strlen($name) > 255)
return t('Name too long');
- $arr = array('name' => $name);
+ $arr = ['name' => $name];
call_hooks('validate_channelname', $arr);
if (x($arr, 'message'))
@@ -242,24 +243,22 @@ function create_identity($arr) {
$expire = 0;
- $r = q("insert into channel ( channel_account_id, channel_primary,
- channel_name, channel_address, channel_guid, channel_guid_sig,
- channel_hash, channel_prvkey, channel_pubkey, channel_pageflags, channel_system, channel_expire_days, channel_timezone )
- values ( %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, %d, '%s' ) ",
-
- intval($arr['account_id']),
- intval($primary),
- dbesc($name),
- dbesc($nick),
- dbesc($guid),
- dbesc($sig),
- dbesc($hash),
- dbesc($key['prvkey']),
- dbesc($key['pubkey']),
- intval($pageflags),
- intval($system),
- intval($expire),
- dbesc(App::$timezone)
+ $r = channel_store_lowlevel(
+ [
+ 'channel_account_id' => intval($arr['account_id']),
+ 'channel_primary' => intval($primary),
+ 'channel_name' => $name,
+ 'channel_address' => $nick,
+ 'channel_guid' => $guid,
+ 'channel_guid_sig' => $sig,
+ 'channel_hash' => $hash,
+ 'channel_prvkey' => $key['prvkey'],
+ 'channel_pubkey' => $key['pubkey'],
+ 'channel_pageflags' => intval($pageflags),
+ 'channel_system' => intval($system),
+ 'channel_expire_days' => intval($expire),
+ 'channel_timezone' => App::$timezone
+ ]
);
$r = q("select * from channel where channel_account_id = %d
@@ -465,7 +464,6 @@ function create_identity($arr) {
* if true, set this default unconditionally
* if $force is false only do this if there is no existing default
*/
-
function set_default_login_identity($account_id, $channel_id, $force = true) {
$r = q("select account_default_channel from account where account_id = %d limit 1",
intval($account_id)
@@ -480,12 +478,29 @@ function set_default_login_identity($account_id, $channel_id, $force = true) {
}
}
-
+/**
+ * @brief Return an array with default list of sections to export.
+ *
+ * @hooks get_default_export_sections
+ * * \e array \b sections
+ * @return array with default section names to export
+ */
function get_default_export_sections() {
- $sections = [ 'channel', 'connections', 'config', 'apps', 'chatrooms', 'events', 'webpages', 'mail', 'wikis' ];
+ $sections = [
+ 'channel',
+ 'connections',
+ 'config',
+ 'apps',
+ 'chatrooms',
+ 'events',
+ 'webpages',
+ 'mail',
+ 'wikis'
+ ];
$cb = [ 'sections' => $sections ];
call_hooks('get_default_export_sections', $cb);
+
return $cb['sections'];
}
@@ -495,15 +510,17 @@ function get_default_export_sections() {
* which would be necessary to create a nomadic identity clone. This includes
* most channel resources and connection information with the exception of content.
*
+ * @hooks identity_basic_export
+ * * \e int \b channel_id
+ * * \e array \b sections
+ * * \e array \b data
* @param int $channel_id
* Channel_id to export
- * @param boolean $items
- * Include channel posts (wall items), default false
- *
+ * @param array $sections (optional)
+ * Which sections to include in the export, default see get_default_export_sections()
* @returns array
* See function for details
*/
-
function identity_basic_export($channel_id, $sections = null) {
/*
@@ -513,16 +530,16 @@ function identity_basic_export($channel_id, $sections = null) {
if(! $sections) {
$sections = get_default_export_sections();
}
-
+
$ret = [];
// use constants here as otherwise we will have no idea if we can import from a site
// with a non-standard platform and version.
$ret['compatibility'] = [
- 'project' => PLATFORM_NAME,
- 'version' => STD_VERSION,
- 'database' => DB_UPDATE_VERSION,
+ 'project' => PLATFORM_NAME,
+ 'version' => STD_VERSION,
+ 'database' => DB_UPDATE_VERSION,
'server_role' => Zotlabs\Lib\System::get_server_role()
];
@@ -539,6 +556,8 @@ function identity_basic_export($channel_id, $sections = null) {
$ret['relocate'] = [ 'channel_address' => $r[0]['channel_address'], 'url' => z_root()];
if(in_array('channel',$sections)) {
$ret['channel'] = $r[0];
+ unset($ret['channel']['channel_password']);
+ unset($ret['channel']['channel_salt']);
}
}
@@ -549,8 +568,7 @@ function identity_basic_export($channel_id, $sections = null) {
if($r)
$ret['profile'] = $r;
-
- $r = q("select mimetype, content, os_storage from photo
+ $r = q("select mimetype, content, os_storage from photo
where imgscale = 4 and photo_usage = %d and uid = %d limit 1",
intval(PHOTO_PROFILE),
intval($channel_id)
@@ -558,8 +576,8 @@ function identity_basic_export($channel_id, $sections = null) {
if($r) {
$ret['photo'] = [
- 'type' => $r[0]['mimetype'],
- 'data' => (($r[0]['os_storage'])
+ 'type' => $r[0]['mimetype'],
+ 'data' => (($r[0]['os_storage'])
? base64url_encode(file_get_contents($r[0]['content'])) : base64url_encode($r[0]['content']))
];
}
@@ -605,7 +623,6 @@ function identity_basic_export($channel_id, $sections = null) {
);
if($r)
$ret['group_member'] = $r;
-
}
if(in_array('config',$sections)) {
@@ -614,7 +631,7 @@ function identity_basic_export($channel_id, $sections = null) {
);
if($r)
$ret['config'] = $r;
-
+
// All other term types will be included in items, if requested.
$r = q("select * from term where ttype in (%d,%d) and uid = %d",
@@ -641,7 +658,6 @@ function identity_basic_export($channel_id, $sections = null) {
if($r)
$ret['likes'] = $r;
-
}
if(in_array('apps',$sections)) {
@@ -667,7 +683,6 @@ function identity_basic_export($channel_id, $sections = null) {
$ret['chatroom'] = $r;
}
-
if(in_array('events',$sections)) {
$r = q("select * from event where uid = %d",
intval($channel_id)
@@ -697,7 +712,7 @@ function identity_basic_export($channel_id, $sections = null) {
$ret['menu'][] = menu_element($ret['channel'],$m);
}
}
- $r = q("select * from item where item_type in ( "
+ $r = q("select * from item where item_type in ( "
. ITEM_TYPE_BLOCK . "," . ITEM_TYPE_PDL . "," . ITEM_TYPE_WEBPAGE . " ) and uid = %d",
intval($channel_id)
);
@@ -707,7 +722,6 @@ function identity_basic_export($channel_id, $sections = null) {
$r = fetch_post_tags($r,true);
foreach($r as $rr)
$ret['webpages'][] = encode_item($rr,true);
-
}
}
@@ -758,7 +772,7 @@ function identity_basic_export($channel_id, $sections = null) {
* Don't export linked resource items. we'll have to pull those out separately.
*/
- $r = q("select * from item where item_wall = 1 and item_deleted = 0 and uid = %d
+ $r = q("select * from item where item_wall = 1 and item_deleted = 0 and uid = %d
and created > %s - INTERVAL %s and resource_type = '' order by created",
intval($channel_id),
db_utcnow(),
@@ -1193,11 +1207,6 @@ function profile_sidebar($profile, $block = 0, $show_connect = true, $zcard = fa
else
$tpl = get_markup_template('profile_vcard.tpl');
- require_once('include/widgets.php');
-
-// if(! feature_enabled($profile['uid'],'hide_rating'))
- $z = widget_rating(array('target' => $profile['channel_hash']));
-
$o .= replace_macros($tpl, array(
'$zcard' => $zcard,
'$profile' => $profile,
@@ -1211,7 +1220,7 @@ function profile_sidebar($profile, $block = 0, $show_connect = true, $zcard = fa
'$chanmenu' => $channel_menu,
'$diaspora' => $diaspora,
'$reddress' => $reddress,
- '$rating' => $z,
+ '$rating' => '',
'$contact_block' => $contact_block,
'$editmenu' => profile_edit_menu($profile['uid'])
));
@@ -1399,15 +1408,15 @@ function get_my_address() {
}
/**
- * @brief
+ * @brief Add visitor's zid to our xchan and attempt authentication.
*
- * If somebody arrives at our site using a zid, add their xchan to our DB if we don't have it already.
+ * If somebody arrives at our site using a zid, add their xchan to our DB if we
+ * don't have it already.
* And if they aren't already authenticated here, attempt reverse magic auth.
*
- *
- * @hooks 'zid_init'
- * string 'zid' - their zid
- * string 'url' - the destination url
+ * @hooks zid_init
+ * * \e string \b zid - their zid
+ * * \e string \b url - the destination url
*/
function zid_init() {
$tmp_str = get_my_address();
@@ -1436,12 +1445,9 @@ function zid_init() {
}
/**
- * @brief
- *
- * If somebody arrives at our site using a zat, authenticate them
+ * @brief If somebody arrives at our site using a zat, authenticate them.
*
*/
-
function zat_init() {
if(local_channel() || remote_channel())
return;
@@ -1453,7 +1459,6 @@ function zat_init() {
$xchan = atoken_xchan($r[0]);
atoken_login($xchan);
}
-
}
@@ -1486,7 +1491,7 @@ function get_theme_uid() {
*
* @param int $size
* one of (300, 80, 48)
-* @returns string
+* @returns string with path to profile photo
*/
function get_default_profile_photo($size = 300) {
$scheme = get_config('system','default_profile_photo');
@@ -1608,7 +1613,7 @@ function get_profile_fields_basic($filter = 0) {
$profile_fields_basic = (($filter == 0) ? get_config('system','profile_fields_basic') : null);
if(! $profile_fields_basic)
- $profile_fields_basic = array('fullname','pdesc','chandesc','gender','dob','dob_tz','address','locality','region','postal_code','country_name','marital','sexual','homepage','hometown','keywords','about','contact');
+ $profile_fields_basic = array('fullname','pdesc','chandesc','comms','gender','dob','dob_tz','address','locality','region','postal_code','country_name','marital','sexual','homepage','hometown','keywords','about','contact');
$x = array();
if($profile_fields_basic)
@@ -1979,7 +1984,6 @@ function channel_manual_conv_update($channel_id) {
$x = get_config('system','manual_conversation_update', 1);
return intval($x);
-
}
@@ -1995,6 +1999,47 @@ function remote_login() {
}
+function channel_store_lowlevel($arr) {
+
+ $store = [
+ 'channel_account_id' => ((array_key_exists('channel_account_id',$arr)) ? $arr['channel_account_id'] : '0'),
+ 'channel_primary' => ((array_key_exists('channel_primary',$arr)) ? $arr['channel_primary'] : '0'),
+ 'channel_name' => ((array_key_exists('channel_name',$arr)) ? $arr['channel_name'] : ''),
+ 'channel_address' => ((array_key_exists('channel_address',$arr)) ? $arr['channel_address'] : ''),
+ 'channel_guid' => ((array_key_exists('channel_guid',$arr)) ? $arr['channel_guid'] : ''),
+ 'channel_guid_sig' => ((array_key_exists('channel_guid_sig',$arr)) ? $arr['channel_guid_sig'] : ''),
+ 'channel_hash' => ((array_key_exists('channel_hash',$arr)) ? $arr['channel_hash'] : ''),
+ 'channel_timezone' => ((array_key_exists('channel_timezone',$arr)) ? $arr['channel_timezone'] : 'UTC'),
+ 'channel_location' => ((array_key_exists('channel_location',$arr)) ? $arr['channel_location'] : ''),
+ 'channel_theme' => ((array_key_exists('channel_theme',$arr)) ? $arr['channel_theme'] : ''),
+ 'channel_startpage' => ((array_key_exists('channel_startpage',$arr)) ? $arr['channel_startpage'] : ''),
+ 'channel_pubkey' => ((array_key_exists('channel_pubkey',$arr)) ? $arr['channel_pubkey'] : ''),
+ 'channel_prvkey' => ((array_key_exists('channel_prvkey',$arr)) ? $arr['channel_prvkey'] : ''),
+ 'channel_notifyflags' => ((array_key_exists('channel_notifyflags',$arr)) ? $arr['channel_notifyflags'] : '65535'),
+ 'channel_pageflags' => ((array_key_exists('channel_pageflags',$arr)) ? $arr['channel_pageflags'] : '0'),
+ 'channel_dirdate' => ((array_key_exists('channel_dirdate',$arr)) ? $arr['channel_dirdate'] : NULL_DATE),
+ 'channel_lastpost' => ((array_key_exists('channel_lastpost',$arr)) ? $arr['channel_lastpost'] : NULL_DATE),
+ 'channel_deleted' => ((array_key_exists('channel_deleted',$arr)) ? $arr['channel_deleted'] : NULL_DATE),
+ 'channel_max_anon_mail' => ((array_key_exists('channel_max_anon_mail',$arr)) ? $arr['channel_max_anon_mail'] : '10'),
+ 'channel_max_friend_req' => ((array_key_exists('channel_max_friend_req',$arr)) ? $arr['channel_max_friend_req'] : '10'),
+ 'channel_expire_days' => ((array_key_exists('channel_expire_days',$arr)) ? $arr['channel_expire_days'] : '0'),
+ 'channel_passwd_reset' => ((array_key_exists('channel_passwd_reset',$arr)) ? $arr['channel_passwd_reset'] : ''),
+ 'channel_default_group' => ((array_key_exists('channel_default_group',$arr)) ? $arr['channel_default_group'] : ''),
+ 'channel_allow_cid' => ((array_key_exists('channel_allow_cid',$arr)) ? $arr['channel_allow_cid'] : ''),
+ 'channel_allow_gid' => ((array_key_exists('channel_allow_gid',$arr)) ? $arr['channel_allow_gid'] : ''),
+ 'channel_deny_cid' => ((array_key_exists('channel_deny_cid',$arr)) ? $arr['channel_deny_cid'] : ''),
+ 'channel_deny_gid' => ((array_key_exists('channel_deny_gid',$arr)) ? $arr['channel_deny_gid'] : ''),
+ 'channel_removed' => ((array_key_exists('channel_removed',$arr)) ? $arr['channel_removed'] : '0'),
+ 'channel_system' => ((array_key_exists('channel_system',$arr)) ? $arr['channel_system'] : '0'),
+ 'channel_moved' => ((array_key_exists('channel_moved',$arr)) ? $arr['channel_moved'] : ''),
+ 'channel_password' => ((array_key_exists('channel_password',$arr)) ? $arr['channel_password'] : ''),
+ 'channel_salt' => ((array_key_exists('channel_salt',$arr)) ? $arr['channel_salt'] : '')
+ ];
+
+ return create_table_from_array('channel',$store);
+
+}
+
function profile_store_lowlevel($arr) {
@@ -2046,4 +2091,235 @@ function profile_store_lowlevel($arr) {
];
return create_table_from_array('profile',$store);
-} \ No newline at end of file
+}
+
+
+// Included here for completeness, but this is a very dangerous operation.
+// It is the caller's responsibility to confirm the requestor's intent and
+// authorisation to do this.
+
+function account_remove($account_id,$local = true,$unset_session=true) {
+
+ logger('account_remove: ' . $account_id);
+
+ if(! intval($account_id)) {
+ logger('account_remove: no account.');
+ return false;
+ }
+
+ // Don't let anybody nuke the only admin account.
+
+ $r = q("select account_id from account where (account_roles & %d) > 0",
+ intval(ACCOUNT_ROLE_ADMIN)
+ );
+
+ if($r !== false && count($r) == 1 && $r[0]['account_id'] == $account_id) {
+ logger("Unable to remove the only remaining admin account");
+ return false;
+ }
+
+ $r = q("select * from account where account_id = %d limit 1",
+ intval($account_id)
+ );
+ $account_email=$r[0]['account_email'];
+
+ if(! $r) {
+ logger('account_remove: No account with id: ' . $account_id);
+ return false;
+ }
+
+ $x = q("select channel_id from channel where channel_account_id = %d",
+ intval($account_id)
+ );
+ if($x) {
+ foreach($x as $xx) {
+ channel_remove($xx['channel_id'],$local,false);
+ }
+ }
+
+ $r = q("delete from account where account_id = %d",
+ intval($account_id)
+ );
+
+
+ if ($unset_session) {
+ unset($_SESSION['authenticated']);
+ unset($_SESSION['uid']);
+ notice( sprintf(t("User '%s' deleted"),$account_email) . EOL);
+ goaway(z_root());
+ }
+ return $r;
+
+}
+
+/**
+ * @brief Removes a channel.
+ *
+ * @hooks channel_remove
+ * * \e array \b entry from channel tabel for $channel_id
+ * @param int $channel_id
+ * @param boolean $local default true
+ * @param boolean $unset_session default false
+ */
+function channel_remove($channel_id, $local = true, $unset_session = false) {
+
+ if(! $channel_id)
+ return;
+
+ logger('Removing channel: ' . $channel_id);
+ logger('local only: ' . intval($local));
+
+ $r = q("select * from channel where channel_id = %d limit 1", intval($channel_id));
+ if(! $r) {
+ logger('channel not found: ' . $channel_id);
+ return;
+ }
+
+ $channel = $r[0];
+
+ call_hooks('channel_remove', $r[0]);
+
+ if(! $local) {
+
+ $r = q("update channel set channel_deleted = '%s', channel_removed = 1 where channel_id = %d",
+ dbesc(datetime_convert()),
+ intval($channel_id)
+ );
+
+ q("delete from pconfig where uid = %d",
+ intval($channel_id)
+ );
+
+ logger('deleting hublocs',LOGGER_DEBUG);
+
+ $r = q("update hubloc set hubloc_deleted = 1 where hubloc_hash = '%s'",
+ dbesc($channel['channel_hash'])
+ );
+
+ $r = q("update xchan set xchan_deleted = 1 where xchan_hash = '%s'",
+ dbesc($channel['channel_hash'])
+ );
+
+ Zotlabs\Daemon\Master::Summon(array('Notifier','purge_all',$channel_id));
+ }
+
+
+ $r = q("select * from iconfig left join item on item.id = iconfig.iid
+ where item.uid = %d",
+ intval($channel_id)
+ );
+ if($r) {
+ foreach($r as $rr) {
+ q("delete from iconfig where iid = %d",
+ intval($rr['iid'])
+ );
+ }
+ }
+
+
+ q("DELETE FROM groups WHERE uid = %d", intval($channel_id));
+ q("DELETE FROM group_member WHERE uid = %d", intval($channel_id));
+ q("DELETE FROM event WHERE uid = %d", intval($channel_id));
+ q("DELETE FROM item WHERE uid = %d", intval($channel_id));
+ q("DELETE FROM mail WHERE channel_id = %d", intval($channel_id));
+ q("DELETE FROM notify WHERE uid = %d", intval($channel_id));
+ q("DELETE FROM photo WHERE uid = %d", intval($channel_id));
+ q("DELETE FROM attach WHERE uid = %d", intval($channel_id));
+ q("DELETE FROM profile WHERE uid = %d", intval($channel_id));
+ q("DELETE FROM pconfig WHERE uid = %d", intval($channel_id));
+
+ /// @FIXME At this stage we need to remove the file resources located under /store/$nickname
+
+ q("delete from abook where abook_xchan = '%s' and abook_self = 1 ",
+ dbesc($channel['channel_hash'])
+ );
+
+ $r = q("update channel set channel_deleted = '%s', channel_removed = 1 where channel_id = %d",
+ dbesc(datetime_convert()),
+ intval($channel_id)
+ );
+
+ // if this was the default channel, set another one as default
+ if(App::$account['account_default_channel'] == $channel_id) {
+ $r = q("select channel_id from channel where channel_account_id = %d and channel_removed = 0 limit 1",
+ intval(App::$account['account_id']),
+ intval(PAGE_REMOVED));
+ if ($r) {
+ $rr = q("update account set account_default_channel = %d where account_id = %d",
+ intval($r[0]['channel_id']),
+ intval(App::$account['account_id']));
+ logger("Default channel deleted, changing default to channel_id " . $r[0]['channel_id']);
+ }
+ else {
+ $rr = q("update account set account_default_channel = 0 where account_id = %d",
+ intval(App::$account['account_id'])
+ );
+ }
+ }
+
+ logger('deleting hublocs',LOGGER_DEBUG);
+
+ $r = q("update hubloc set hubloc_deleted = 1 where hubloc_hash = '%s' and hubloc_url = '%s' ",
+ dbesc($channel['channel_hash']),
+ dbesc(z_root())
+ );
+
+ // Do we have any valid hublocs remaining?
+
+ $hublocs = 0;
+
+ $r = q("select hubloc_id from hubloc where hubloc_hash = '%s' and hubloc_deleted = 0",
+ dbesc($channel['channel_hash'])
+ );
+ if($r)
+ $hublocs = count($r);
+
+ if(! $hublocs) {
+ $r = q("update xchan set xchan_deleted = 1 where xchan_hash = '%s' ",
+ dbesc($channel['channel_hash'])
+ );
+ }
+
+ //remove from file system
+ $r = q("select channel_address from channel where channel_id = %d limit 1",
+ intval($channel_id)
+ );
+
+ if($r) {
+ $channel_address = $r[0]['channel_address'] ;
+ }
+ if($channel_address) {
+ $f = 'store/' . $channel_address.'/';
+ logger('delete '. $f);
+ if(is_dir($f)) {
+ @rrmdir($f);
+ }
+ }
+
+ Zotlabs\Daemon\Master::Summon(array('Directory',$channel_id));
+
+ if($channel_id == local_channel() && $unset_session) {
+ App::$session->nuke();
+ goaway(z_root());
+ }
+}
+
+/**
+ * @brief This checks if a channel is allowed to publish executable code.
+ *
+ * It is up to the caller to determine if the observer or local_channel
+ * is in fact the resource owner whose channel_id is being checked.
+ *
+ * @param int $channel_id
+ * @return boolean
+ */
+function channel_codeallowed($channel_id) {
+ if(! intval($channel_id))
+ return false;
+
+ $x = channelx_by_n($channel_id);
+ if(($x) && ($x['channel_pageflags'] & PAGE_ALLOWCODE))
+ return true;
+
+ return false;
+}
diff --git a/include/connections.php b/include/connections.php
index e26943b68..8f4f84e1a 100644
--- a/include/connections.php
+++ b/include/connections.php
@@ -23,6 +23,7 @@ function abook_store_lowlevel($arr) {
'abook_unconnected' => ((array_key_exists('abook_unconnected',$arr)) ? $arr['abook_unconnected'] : 0),
'abook_self' => ((array_key_exists('abook_self',$arr)) ? $arr['abook_self'] : 0),
'abook_feed' => ((array_key_exists('abook_feed',$arr)) ? $arr['abook_feed'] : 0),
+ 'abook_not_here' => ((array_key_exists('abook_not_here',$arr)) ? $arr['abook_not_here'] : 0),
'abook_profile' => ((array_key_exists('abook_profile',$arr)) ? $arr['abook_profile'] : ''),
'abook_incl' => ((array_key_exists('abook_incl',$arr)) ? $arr['abook_incl'] : ''),
'abook_excl' => ((array_key_exists('abook_excl',$arr)) ? $arr['abook_excl'] : ''),
@@ -188,232 +189,6 @@ function abook_toggle_flag($abook,$flag) {
}
-// Included here for completeness, but this is a very dangerous operation.
-// It is the caller's responsibility to confirm the requestor's intent and
-// authorisation to do this.
-
-function user_remove($uid) {
-
-}
-
-function account_remove($account_id,$local = true,$unset_session=true) {
-
- logger('account_remove: ' . $account_id);
-
- if(! intval($account_id)) {
- logger('account_remove: no account.');
- return false;
- }
-
- // Don't let anybody nuke the only admin account.
-
- $r = q("select account_id from account where (account_roles & %d) > 0",
- intval(ACCOUNT_ROLE_ADMIN)
- );
-
- if($r !== false && count($r) == 1 && $r[0]['account_id'] == $account_id) {
- logger("Unable to remove the only remaining admin account");
- return false;
- }
-
- $r = q("select * from account where account_id = %d limit 1",
- intval($account_id)
- );
- $account_email=$r[0]['account_email'];
-
- if(! $r) {
- logger('account_remove: No account with id: ' . $account_id);
- return false;
- }
-
- $x = q("select channel_id from channel where channel_account_id = %d",
- intval($account_id)
- );
- if($x) {
- foreach($x as $xx) {
- channel_remove($xx['channel_id'],$local,false);
- }
- }
-
- $r = q("delete from account where account_id = %d",
- intval($account_id)
- );
-
-
- if ($unset_session) {
- unset($_SESSION['authenticated']);
- unset($_SESSION['uid']);
- notice( sprintf(t("User '%s' deleted"),$account_email) . EOL);
- goaway(z_root());
- }
- return $r;
-
-}
-// recursively delete a directory
-function rrmdir($path)
-{
- if (is_dir($path) === true)
- {
- $files = array_diff(scandir($path), array('.', '..'));
-
- foreach ($files as $file)
- {
- rrmdir(realpath($path) . '/' . $file);
- }
-
- return rmdir($path);
- }
-
- else if (is_file($path) === true)
- {
- return unlink($path);
- }
-
- return false;
-}
-
-function channel_remove($channel_id, $local = true, $unset_session=false) {
-
- if(! $channel_id)
- return;
-
- logger('Removing channel: ' . $channel_id);
- logger('channel_remove: local only: ' . intval($local));
-
- $r = q("select * from channel where channel_id = %d limit 1", intval($channel_id));
- if(! $r) {
- logger('channel_remove: channel not found: ' . $channel_id);
- return;
- }
-
- $channel = $r[0];
-
- call_hooks('channel_remove',$r[0]);
-
- if(! $local) {
-
- $r = q("update channel set channel_deleted = '%s', channel_removed = 1 where channel_id = %d",
- dbesc(datetime_convert()),
- intval($channel_id)
- );
-
- q("delete from pconfig where uid = %d",
- intval($channel_id)
- );
-
- logger('deleting hublocs',LOGGER_DEBUG);
-
- $r = q("update hubloc set hubloc_deleted = 1 where hubloc_hash = '%s'",
- dbesc($channel['channel_hash'])
- );
-
-
- $r = q("update xchan set xchan_deleted = 1 where xchan_hash = '%s'",
- dbesc($channel['channel_hash'])
- );
-
- Zotlabs\Daemon\Master::Summon(array('Notifier','purge_all',$channel_id));
- }
-
-
- $r = q("select * from iconfig left join item on item.id = iconfig.iid
- where item.uid = %d",
- intval($channel_id)
- );
- if($r) {
- foreach($r as $rr) {
- q("delete from iconfig where iid = %d",
- intval($rr['iid'])
- );
- }
- }
-
-
- q("DELETE FROM groups WHERE uid = %d", intval($channel_id));
- q("DELETE FROM group_member WHERE uid = %d", intval($channel_id));
- q("DELETE FROM event WHERE uid = %d", intval($channel_id));
- q("DELETE FROM item WHERE uid = %d", intval($channel_id));
- q("DELETE FROM mail WHERE channel_id = %d", intval($channel_id));
- q("DELETE FROM notify WHERE uid = %d", intval($channel_id));
- q("DELETE FROM photo WHERE uid = %d", intval($channel_id));
- q("DELETE FROM attach WHERE uid = %d", intval($channel_id));
- q("DELETE FROM profile WHERE uid = %d", intval($channel_id));
- q("DELETE FROM pconfig WHERE uid = %d", intval($channel_id));
-
- // @FIXME At this stage we need to remove the file resources located under /store/$nickname
-
-
- q("delete from abook where abook_xchan = '%s' and abook_self = 1 ",
- dbesc($channel['channel_hash'])
- );
-
- $r = q("update channel set channel_deleted = '%s', channel_removed = 1 where channel_id = %d",
- dbesc(datetime_convert()),
- intval($channel_id)
- );
-
- // if this was the default channel, set another one as default
- if(App::$account['account_default_channel'] == $channel_id) {
- $r = q("select channel_id from channel where channel_account_id = %d and channel_removed = 0 limit 1",
- intval(App::$account['account_id']),
- intval(PAGE_REMOVED));
- if ($r) {
- $rr = q("update account set account_default_channel = %d where account_id = %d",
- intval($r[0]['channel_id']),
- intval(App::$account['account_id']));
- logger("Default channel deleted, changing default to channel_id " . $r[0]['channel_id']);
- }
- else {
- $rr = q("update account set account_default_channel = 0 where account_id = %d",
- intval(App::$account['account_id'])
- );
- }
- }
-
- logger('deleting hublocs',LOGGER_DEBUG);
-
- $r = q("update hubloc set hubloc_deleted = 1 where hubloc_hash = '%s' and hubloc_url = '%s' ",
- dbesc($channel['channel_hash']),
- dbesc(z_root())
- );
-
- // Do we have any valid hublocs remaining?
-
- $hublocs = 0;
-
- $r = q("select hubloc_id from hubloc where hubloc_hash = '%s' and hubloc_deleted = 0",
- dbesc($channel['channel_hash'])
- );
- if($r)
- $hublocs = count($r);
-
- if(! $hublocs) {
- $r = q("update xchan set xchan_deleted = 1 where xchan_hash = '%s' ",
- dbesc($channel['channel_hash'])
- );
- }
-
- //remove from file system
- $r = q("select channel_address from channel where channel_id = %d limit 1",
- intval($channel_id)
- );
- if($r)
- $channel_address = $r[0]['channel_address'] ;
- if ($channel_address !== '') {
- $f = 'store/' . $channel_address.'/';
- logger ('delete '. $f);
- if(is_dir($f))
- @rrmdir($f);
- }
-
- Zotlabs\Daemon\Master::Summon(array('Directory',$channel_id));
-
- if($channel_id == local_channel() && $unset_session) {
- App::$session->nuke();
- goaway(z_root());
- }
-
-}
/**
* mark any hubs "offline" that haven't been heard from in more than 30 days
@@ -430,10 +205,10 @@ function mark_orphan_hubsxchans() {
if($dirmode == DIRECTORY_MODE_NORMAL)
return;
- $r = q("update hubloc set hubloc_error = 1 where hubloc_error = 0
+ $r = q("update hubloc set hubloc_error = 1 where hubloc_error = 0
and hubloc_network = 'zot' and hubloc_connected < %s - interval %s",
- db_utcnow(), db_quoteinterval('36 day')
- );
+ db_utcnow(), db_quoteinterval('36 day')
+ );
// $realm = get_directory_realm();
// if($realm == DIRECTORY_REALM) {
@@ -547,13 +322,13 @@ function remove_all_xchan_resources($xchan, $channel_id = 0) {
// directory servers need to keep the record around for sync purposes - mark it deleted
- $r = q("update hubloc set hubloc_deleted = 1 where hubloc_hash = '%s'",
- dbesc($xchan)
- );
+ $r = q("update hubloc set hubloc_deleted = 1 where hubloc_hash = '%s'",
+ dbesc($xchan)
+ );
- $r = q("update xchan set xchan_deleted = 1 where xchan_hash = '%s'",
- dbesc($xchan)
- );
+ $r = q("update xchan set xchan_deleted = 1 where xchan_hash = '%s'",
+ dbesc($xchan)
+ );
}
}
}
diff --git a/include/conversation.php b/include/conversation.php
index a1acc456a..0f940b1a3 100644
--- a/include/conversation.php
+++ b/include/conversation.php
@@ -2,10 +2,6 @@
require_once('include/items.php');
-// Note: the code in 'item_extract_images' and 'item_redir_and_replace_images'
-// is identical to the code in mod/message.php for 'item_extract_images' and
-// 'item_redir_and_replace_images'
-
function item_extract_images($body) {
@@ -375,13 +371,14 @@ function localize_item(&$item){
* * \e array \b children
* @return number
*/
+
function count_descendants($item) {
$total = count($item['children']);
- if ($total > 0) {
- foreach ($item['children'] as $child) {
- if (! visible_activity($child))
+ if($total > 0) {
+ foreach($item['children'] as $child) {
+ if(! visible_activity($child))
$total --;
$total += count_descendants($child);
@@ -408,8 +405,8 @@ function visible_activity($item) {
if(intval($item['item_notshown']))
return false;
- foreach ($hidden_activities as $act) {
- if ((activity_match($item['verb'], $act)) && ($item['mid'] != $item['parent_mid'])) {
+ foreach($hidden_activities as $act) {
+ if((activity_match($item['verb'], $act)) && ($item['mid'] != $item['parent_mid'])) {
return false;
}
}
@@ -614,6 +611,7 @@ function conversation(&$a, $items, $mode, $update, $page_mode = 'traditional', $
$owner_photo = '';
$owner_name = '';
$sparkle = '';
+ $is_new = false;
if($mode === 'search' || $mode === 'community') {
if(((activity_match($item['verb'],ACTIVITY_LIKE)) || (activity_match($item['verb'],ACTIVITY_DISLIKE)))
@@ -682,6 +680,9 @@ function conversation(&$a, $items, $mode, $update, $page_mode = 'traditional', $
$has_tags = (($body['tags'] || $body['categories'] || $body['mentions'] || $body['attachments'] || $body['folders']) ? true : false);
+ if(strcmp(datetime_convert('UTC','UTC',$item['created']),datetime_convert('UTC','UTC','now - 12 hours')) > 0)
+ $is_new = true;
+
$tmp_item = array(
'template' => $tpl,
'toplevel' => 'toplevel_item',
@@ -738,6 +739,7 @@ function conversation(&$a, $items, $mode, $update, $page_mode = 'traditional', $
'wait' => t('Please wait'),
'thread_level' => 1,
'has_tags' => $has_tags,
+ 'is_new' => $is_new
);
$arr = array('item' => $item, 'output' => $tmp_item);
@@ -870,98 +872,6 @@ function best_link_url($item) {
-function item_photo_menu($item){
-
- $contact = null;
-
- $ssl_state = false;
-
- $sub_link="";
- $poke_link="";
- $contact_url="";
- $pm_url="";
- $vsrc_link = "";
- $follow_url = "";
-
- $local_channel = local_channel();
-
- if($local_channel) {
- $ssl_state = true;
- if(! count(App::$contacts))
- load_contact_links($local_channel);
- $channel = App::get_channel();
- $channel_hash = (($channel) ? $channel['channel_hash'] : '');
- }
-
- if(($local_channel) && $local_channel == $item['uid']) {
- $vsrc_link = 'javascript:viewsrc(' . $item['id'] . '); return false;';
- if($item['parent'] == $item['id'] && $channel && ($channel_hash != $item['author_xchan'])) {
- $sub_link = 'javascript:dosubthread(' . $item['id'] . '); return false;';
- }
- if($channel) {
- $unsub_link = 'javascript:dounsubthread(' . $item['id'] . '); return false;';
- }
- }
-
- $profile_link = chanlink_hash($item['author_xchan']);
- if($item['uid'] > 0)
- $pm_url = z_root() . '/mail/new/?f=&hash=' . $item['author_xchan'];
-
- if(App::$contacts && array_key_exists($item['author_xchan'],App::$contacts))
- $contact = App::$contacts[$item['author_xchan']];
- else
- if($local_channel && $item['author']['xchan_addr'])
- $follow_url = z_root() . '/follow/?f=&url=' . $item['author']['xchan_addr'];
-
- if($contact) {
- $poke_link = z_root() . '/poke/?f=&c=' . $contact['abook_id'];
- if (! intval($contact['abook_self']))
- $contact_url = z_root() . '/connedit/' . $contact['abook_id'];
- $posts_link = z_root() . '/network/?cid=' . $contact['abook_id'];
-
- $clean_url = normalise_link($item['author-link']);
- }
-
- $rating_enabled = get_config('system','rating_enabled');
-
- $ratings_url = (($rating_enabled) ? z_root() . '/ratings/' . urlencode($item['author_xchan']) : '');
-
- $post_menu = Array(
- t("View Source") => $vsrc_link,
- t("Follow Thread") => $sub_link,
- t("Unfollow Thread") => $unsub_link,
- );
-
- $author_menu = array(
- t("View Profile") => $profile_link,
- t("Activity/Posts") => $posts_link,
- t("Connect") => $follow_url,
- t("Edit Connection") => $contact_url,
- t("Message") => $pm_url,
- t('Ratings') => $ratings_url,
- t("Poke") => $poke_link
- );
-
-
- $args = array('item' => $item, 'post_menu' => $post_menu, 'author_menu' => $author_menu);
-
- call_hooks('item_photo_menu', $args);
-
- $menu = array_merge($args['post_menu'],$args['author_menu']);
-
- $o = "";
- foreach($menu as $k=>$v){
- if(strpos($v,'javascript:') === 0) {
- $v = substr($v,11);
- $o .= "<li><a href=\"#\" onclick=\"$v\">$k</a></li>\n";
- }
- elseif ($v!="") $o .= "<li><a href=\"$v\">$k</a></li>\n";
- }
-
- return $o;
-}
-
-
function thread_action_menu($item,$mode = '') {
$menu = [];
@@ -1007,6 +917,24 @@ function thread_action_menu($item,$mode = '') {
}
+function author_is_pmable($xchan) {
+
+ $x = [ 'xchan' => $xchan, 'result' => 'unset' ];
+ call_hooks('author_is_pmable',$x);
+ if($x['result'] !== 'unset')
+ return $x['result'];
+
+ if($xchan['xchan_network'] === 'zot')
+ return true;
+ return false;
+
+}
+
+
+
+
+
+
function thread_author_menu($item, $mode = '') {
$menu = [];
@@ -1021,14 +949,19 @@ function thread_author_menu($item, $mode = '') {
}
$profile_link = chanlink_hash($item['author_xchan']);
- if($item['uid'] > 0)
- $pm_url = z_root() . '/mail/new/?f=&hash=' . $item['author_xchan'];
+
if(App::$contacts && array_key_exists($item['author_xchan'],App::$contacts))
$contact = App::$contacts[$item['author_xchan']];
else
if($local_channel && $item['author']['xchan_addr'])
- $follow_url = z_root() . '/follow/?f=&url=' . $item['author']['xchan_addr'];
+ $follow_url = z_root() . '/follow/?f=&url=' . urlencode($item['author']['xchan_addr']);
+
+
+ if($item['uid'] > 0 && author_is_pmable($item['author']))
+ $pm_url = z_root() . '/mail/new/?f=&hash=' . urlencode($item['author_xchan']);
+
+
if($contact) {
$poke_link = z_root() . '/poke/?f=&c=' . $contact['abook_id'];
@@ -1176,8 +1109,8 @@ function builtin_activity_puller($item, &$conv_responses) {
if((activity_match($item['verb'], $verb)) && ($item['id'] != $item['parent'])) {
$name = (($item['author']['xchan_name']) ? $item['author']['xchan_name'] : t('Unknown'));
$url = (($item['author_xchan'] && $item['author']['xchan_photo_s'])
- ? '<a href="' . chanlink_hash($item['author_xchan']) . '">' . '<img class="dropdown-menu-img-xs" src="' . zid($item['author']['xchan_photo_s']) . '" alt="' . urlencode($name) . '" />' . $name . '</a>'
- : '<a href="#" class="disabled">' . $name . '</a>'
+ ? '<a class="dropdown-item" href="' . chanlink_hash($item['author_xchan']) . '">' . '<img class="menu-img-1" src="' . zid($item['author']['xchan_photo_s']) . '" alt="' . urlencode($name) . '" />' . $name . '</a>'
+ : '<a class="dropdown-item" href="#" class="disabled">' . $name . '</a>'
);
if(! $item['thr_parent'])
@@ -1608,6 +1541,15 @@ function prepare_page($item) {
// the template will get passed an unobscured title.
$body = prepare_body($item, true);
+ if(App::$page['template'] == 'none') {
+ $tpl = 'page_display_empty.tpl';
+
+ return replace_macros(get_markup_template($tpl), array(
+ '$body' => $body['html']
+ ));
+
+ }
+
$tpl = get_pconfig($item['uid'], 'system', 'pagetemplate');
if (! $tpl)
$tpl = 'page_display.tpl';
@@ -1770,6 +1712,9 @@ function profile_tabs($a, $is_owner = false, $nickname = null){
if (App::$is_sys)
return;
+ if (get_pconfig($uid, 'system', 'noprofiletabs'))
+ return;
+
$channel = App::get_channel();
if (is_null($nickname))
@@ -1779,6 +1724,9 @@ function profile_tabs($a, $is_owner = false, $nickname = null){
$uid = ((App::$profile['profile_uid']) ? App::$profile['profile_uid'] : local_channel());
$account_id = ((App::$profile['profile_uid']) ? App::$profile['channel_account_id'] : App::$channel['channel_account_id']);
+ if ($uid == local_channel())
+ return;
+
if($uid == local_channel()) {
$cal_link = '';
}
@@ -1801,9 +1749,6 @@ function profile_tabs($a, $is_owner = false, $nickname = null){
$has_webpages = (($r) ? true : false);
- if (get_pconfig($uid, 'system', 'noprofiletabs'))
- return;
-
if (x($_GET, 'tab'))
$tab = notags(trim($_GET['tab']));
@@ -1817,6 +1762,7 @@ function profile_tabs($a, $is_owner = false, $nickname = null){
'sel' => ((argv(0) == 'channel') ? 'active' : ''),
'title' => t('Status Messages and Posts'),
'id' => 'status-tab',
+ 'icon' => 'home'
),
);
@@ -1829,6 +1775,7 @@ function profile_tabs($a, $is_owner = false, $nickname = null){
'sel' => ((argv(0) == 'profile') ? 'active' : ''),
'title' => t('Profile Details'),
'id' => 'profile-tab',
+ 'icon' => 'user'
);
}
if ($p['view_storage']) {
@@ -1838,6 +1785,7 @@ function profile_tabs($a, $is_owner = false, $nickname = null){
'sel' => ((argv(0) == 'photos') ? 'active' : ''),
'title' => t('Photo Albums'),
'id' => 'photo-tab',
+ 'icon' => 'photo'
);
$tabs[] = array(
'label' => t('Files'),
@@ -1845,6 +1793,7 @@ function profile_tabs($a, $is_owner = false, $nickname = null){
'sel' => ((argv(0) == 'cloud' || argv(0) == 'sharedwithme') ? 'active' : ''),
'title' => t('Files and Storage'),
'id' => 'files-tab',
+ 'icon' => 'folder-open'
);
}
@@ -1855,6 +1804,7 @@ function profile_tabs($a, $is_owner = false, $nickname = null){
'sel' => ((argv(0) == 'cal' || argv(0) == 'events') ? 'active' : ''),
'title' => t('Events'),
'id' => 'event-tab',
+ 'icon' => 'calendar'
);
}
@@ -1868,6 +1818,7 @@ function profile_tabs($a, $is_owner = false, $nickname = null){
'sel' => ((argv(0) == 'chat') ? 'active' : '' ),
'title' => t('Chatrooms'),
'id' => 'chat-tab',
+ 'icon' => 'comments-o'
);
}
}
@@ -1881,6 +1832,7 @@ function profile_tabs($a, $is_owner = false, $nickname = null){
'sel' => ((argv(0) == 'bookmarks') ? 'active' : ''),
'title' => t('Saved Bookmarks'),
'id' => 'bookmarks-tab',
+ 'icon' => 'bookmark'
);
}
@@ -1891,27 +1843,34 @@ function profile_tabs($a, $is_owner = false, $nickname = null){
'sel' => ((argv(0) == 'webpages') ? 'active' : ''),
'title' => t('View Webpages'),
'id' => 'webpages-tab',
+ 'icon' => 'newspaper-o'
);
}
- if(feature_enabled($uid,'wiki') && (get_account_techlevel($account_id) > 3)) {
- $tabs[] = array(
- 'label' => t('Wikis'),
- 'url' => z_root() . '/wiki/' . $nickname,
- 'sel' => ((argv(0) == 'wiki') ? 'active' : ''),
- 'title' => t('Wiki'),
- 'id' => 'wiki-tab',
- );
+ if ($p['view_wiki']) {
+ if(feature_enabled($uid,'wiki') && (get_account_techlevel($account_id) > 3)) {
+ $tabs[] = array(
+ 'label' => t('Wikis'),
+ 'url' => z_root() . '/wiki/' . $nickname,
+ 'sel' => ((argv(0) == 'wiki') ? 'active' : ''),
+ 'title' => t('Wiki'),
+ 'id' => 'wiki-tab',
+ 'icon' => 'pencil-square-o'
+ );
+ }
}
-
$arr = array('is_owner' => $is_owner, 'nickname' => $nickname, 'tab' => (($tab) ? $tab : false), 'tabs' => $tabs);
call_hooks('profile_tabs', $arr);
- $tpl = get_markup_template('common_tabs.tpl');
+ $tpl = get_markup_template('profile_tabs.tpl');
- return replace_macros($tpl,array('$tabs' => $arr['tabs']));
+ return replace_macros($tpl, array(
+ '$tabs' => $arr['tabs'],
+ '$name' => App::$profile['channel_name'],
+ '$thumb' => App::$profile['thumb']
+ ));
}
@@ -1922,15 +1881,11 @@ function get_responses($conv_responses,$response_verbs,$ob,$item) {
$ret[$v] = array();
$ret[$v]['count'] = ((x($conv_responses[$v],$item['mid'])) ? $conv_responses[$v][$item['mid']] : '');
$ret[$v]['list'] = ((x($conv_responses[$v],$item['mid'])) ? $conv_responses[$v][$item['mid'] . '-l'] : '');
- if(count($ret[$v]['list']) > MAX_LIKERS) {
- $ret[$v]['list_part'] = array_slice($ret[$v]['list'], 0, MAX_LIKERS);
- array_push($ret[$v]['list_part'], '<a href="#" data-toggle="modal" data-target="#' . $v . 'Modal-'
- . (($ob) ? $ob->get_id() : $item['id']) . '"><b>' . t('View all') . '</b></a>');
- } else {
- $ret[$v]['list_part'] = '';
- }
$ret[$v]['button'] = get_response_button_text($v,$ret[$v]['count']);
$ret[$v]['title'] = $conv_responses[$v]['title'];
+ if($ret[$v]['count'] > MAX_LIKERS) {
+ $ret[$v]['modal'] = true;
+ }
}
$count = 0;
diff --git a/include/crypto.php b/include/crypto.php
index f75390985..2c5545e9b 100644
--- a/include/crypto.php
+++ b/include/crypto.php
@@ -55,6 +55,7 @@ function AES256CBC_decrypt($data,$key,$iv) {
return openssl_decrypt($data,'aes-256-cbc',str_pad($key,32,"\0"),OPENSSL_RAW_DATA,str_pad($iv,16,"\0"));
}
+
function AES128CBC_encrypt($data,$key,$iv) {
$key = substr($key,0,16);
$iv = substr($iv,0,16);
@@ -67,18 +68,33 @@ function AES128CBC_decrypt($data,$key,$iv) {
return openssl_decrypt($data,'aes-128-cbc',str_pad($key,16,"\0"),OPENSSL_RAW_DATA,str_pad($iv,16,"\0"));
}
-function STD_encrypt($data,$key,$iv) {
+
+function AES256CTR_encrypt($data,$key,$iv) {
$key = substr($key,0,32);
$iv = substr($iv,0,16);
- return openssl_encrypt($data,'aes-256-cbc',str_pad($key,32,"\0"),OPENSSL_RAW_DATA,str_pad($iv,16,"\0"));
+ return openssl_encrypt($data,'aes-256-ctr',str_pad($key,32,"\0"),OPENSSL_RAW_DATA,str_pad($iv,16,"\0"));
}
-function STD_decrypt($data,$key,$iv) {
+function AES256CTR_decrypt($data,$key,$iv) {
$key = substr($key,0,32);
$iv = substr($iv,0,16);
- return openssl_decrypt($data,'aes-256-cbc',str_pad($key,32,"\0"),OPENSSL_RAW_DATA,str_pad($iv,16,"\0"));
+ return openssl_decrypt($data,'aes-256-ctr',str_pad($key,32,"\0"),OPENSSL_RAW_DATA,str_pad($iv,16,"\0"));
+}
+
+
+function CAMELLIA256CFB_encrypt($data,$key,$iv) {
+ $key = substr($key,0,32);
+ $iv = substr($iv,0,16);
+ return openssl_encrypt($data,'camellia-256-cfb',str_pad($key,32,"\0"),OPENSSL_RAW_DATA,str_pad($iv,16,"\0"));
+}
+
+function CAMELLIA256CFB_decrypt($data,$key,$iv) {
+ $key = substr($key,0,32);
+ $iv = substr($iv,0,16);
+ return openssl_decrypt($data,'camellia-256-cfb',str_pad($key,32,"\0"),OPENSSL_RAW_DATA,str_pad($iv,16,"\0"));
}
+
function CAST5CBC_encrypt($data,$key,$iv) {
$key = substr($key,0,16);
$iv = substr($iv,0,8);
@@ -91,6 +107,20 @@ function CAST5CBC_decrypt($data,$key,$iv) {
return openssl_decrypt($data,'cast5-cbc',str_pad($key,16,"\0"),OPENSSL_RAW_DATA,str_pad($iv,8,"\0"));
}
+function CAST5CFB_encrypt($data,$key,$iv) {
+ $key = substr($key,0,16);
+ $iv = substr($iv,0,8);
+ return openssl_encrypt($data,'cast5-cfb',str_pad($key,16,"\0"),OPENSSL_RAW_DATA,str_pad($iv,8,"\0"));
+}
+
+function CAST5CFB_decrypt($data,$key,$iv) {
+ $key = substr($key,0,16);
+ $iv = substr($iv,0,8);
+ return openssl_decrypt($data,'cast5-cfb',str_pad($key,16,"\0"),OPENSSL_RAW_DATA,str_pad($iv,8,"\0"));
+}
+
+
+
function crypto_encapsulate($data,$pubkey,$alg='aes256cbc') {
$fn = strtoupper($alg) . '_encrypt';
@@ -142,17 +172,13 @@ function other_encapsulate($data,$pubkey,$alg) {
function crypto_methods() {
- if(\Zotlabs\Lib\System::get_server_role() !== 'pro')
- return [ 'aes256cbc' ];
-
- // 'std' is the new project standard which is aes256cbc but transmits/receives 256-byte key and iv.
// aes256cbc is provided for compatibility with earlier zot implementations which assume 32-byte key and 16-byte iv.
// other_encapsulate() now produces these longer keys/ivs by default so that it is difficult to guess a
// particular implementation or choice of underlying implementations based on the key/iv length.
// The actual methods are responsible for deriving the actual key/iv from the provided parameters;
// possibly by truncation or segmentation - though many other methods could be used.
- $r = [ 'std', 'aes256cbc', 'aes128cbc', 'cast5cbc' ];
+ $r = [ 'aes256ctr', 'camellia256cfb', 'cast5cfb', 'aes256cbc', 'aes128cbc', 'cast5cbc' ];
call_hooks('crypto_methods',$r);
return $r;
diff --git a/include/dba/dba_driver.php b/include/dba/dba_driver.php
index e47f97387..d362f58b2 100755
--- a/include/dba/dba_driver.php
+++ b/include/dba/dba_driver.php
@@ -15,7 +15,7 @@ class DBA {
static public $scheme = 'mysql';
static public $logging = false;
- static public $install_script = 'install/schema_mysql.sql';
+ static public $install_script = 'schema_mysql.sql';
static public $null_date = '0001-01-01 00:00:00';
static public $utc_now = 'UTC_TIMESTAMP()';
static public $tquot = "`";
@@ -46,7 +46,7 @@ class DBA {
if(!($port))
$port = 5432;
- self::$install_script = 'install/schema_postgres.sql';
+ self::$install_script = 'schema_postgres.sql';
self::$utc_now = "now() at time zone 'UTC'";
self::$tquot = '"';
self::$scheme = 'pgsql';
@@ -163,7 +163,9 @@ abstract class dba_driver {
}
function get_install_script() {
- return \DBA::$install_script;
+ if(file_exists('install/' . PLATFORM_NAME . '/' . \DBA::$install_script))
+ return 'install/' . PLATFORM_NAME . '/' . \DBA::$install_script;
+ return 'install/' . \DBA::$install_script;
}
function get_table_quote() {
@@ -450,7 +452,7 @@ function db_getfunc($f) {
function db_logger($s,$level = LOGGER_NORMAL,$syslog = LOG_INFO) {
- if(\DBA::$logging)
+ if(\DBA::$logging || ! \DBA::$dba)
return;
$saved = \DBA::$dba->debug;
diff --git a/include/dir_fns.php b/include/dir_fns.php
index 3922730fc..2bd1228ec 100644
--- a/include/dir_fns.php
+++ b/include/dir_fns.php
@@ -185,26 +185,17 @@ function sync_directories($dirmode) {
/** @FIXME What to do if we're in a different realm? */
if ((! $r) && (z_root() != DIRECTORY_FALLBACK_MASTER)) {
- $r = array();
- $r[] = array(
- 'site_url' => DIRECTORY_FALLBACK_MASTER,
- 'site_flags' => DIRECTORY_MODE_PRIMARY,
- 'site_update' => NULL_DATE,
- 'site_directory' => DIRECTORY_FALLBACK_MASTER . '/dirsearch',
- 'site_realm' => DIRECTORY_REALM,
- 'site_valid' => 1,
- 'site_crypto' => 'aes256cbc'
-
- );
- $x = q("insert into site ( site_url, site_flags, site_update, site_directory, site_realm, site_valid, site_crypto )
- values ( '%s', %d, '%s', '%s', '%s', %d, '%s' ) ",
- dbesc($r[0]['site_url']),
- intval($r[0]['site_flags']),
- dbesc($r[0]['site_update']),
- dbesc($r[0]['site_directory']),
- dbesc($r[0]['site_realm']),
- intval($r[0]['site_valid']),
- dbesc($r[0]['site_crypto'])
+
+ $x = site_store_lowlevel(
+ [
+ 'site_url' => DIRECTORY_FALLBACK_MASTER,
+ 'site_flags' => DIRECTORY_MODE_PRIMARY,
+ 'site_update' => NULL_DATE,
+ 'site_directory' => DIRECTORY_FALLBACK_MASTER . '/dirsearch',
+ 'site_realm' => DIRECTORY_REALM,
+ 'site_valid' => 1,
+ 'site_crypto' => 'aes256cbc'
+ ]
);
$r = q("select * from site where site_flags in (%d, %d) and site_url != '%s' and site_type = %d ",
diff --git a/include/environment.php b/include/environment.php
index 11d465b84..96a614821 100644
--- a/include/environment.php
+++ b/include/environment.php
@@ -65,4 +65,4 @@ function phpiniSizeToBytes($val) {
}
return (int)$val;
-} \ No newline at end of file
+}
diff --git a/include/event.php b/include/event.php
index cf1cc331d..c57e52bc0 100644
--- a/include/event.php
+++ b/include/event.php
@@ -249,6 +249,15 @@ function bbtoevent($s) {
$ev = array();
+
+ $match = '';
+ if(preg_match("/\[event\](.*?)\[\/event\]/is",$s,$match)) {
+ // only parse one object per event tag
+ $x = ical_to_ev($match[1]);
+ if($x)
+ $ev = $x[0];
+ }
+
$match = '';
if(preg_match("/\[event\-summary\](.*?)\[\/event\-summary\]/is",$s,$match))
$ev['summary'] = $match[1];
@@ -283,6 +292,8 @@ function bbtoevent($s) {
$ev['nofinish'] = 1;
}
+// logger('bbtoevent: ' . print_r($ev,true));
+
return $ev;
}
@@ -555,6 +566,136 @@ function event_addtocal($item_id, $uid) {
}
+function ical_to_ev($s) {
+ require_once('vendor/autoload.php');
+
+ $saved_timezone = date_default_timezone_get();
+ date_default_timezone_set('Australia/Sydney');
+
+ $ical = VObject\Reader::read($s);
+
+ $ev = [];
+
+ if($ical) {
+ if($ical->VEVENT) {
+ foreach($ical->VEVENT as $event) {
+ $ev[] = parse_vobject($event,'event');
+ }
+ }
+ if($ical->VTODO) {
+ foreach($ical->VTODO as $event) {
+ $ev[] = parse_vobject($event,'task');
+ }
+ }
+ }
+
+ date_default_timezone_set($saved_timezone);
+
+ return $ev;
+
+}
+
+
+
+function parse_vobject($ical, $type) {
+
+
+ $ev = [];
+
+ if(! isset($ical->DTSTART)) {
+ logger('no event start');
+ return $ev;
+ }
+
+ $ev['etype'] = $type;
+
+ $dtstart = $ical->DTSTART->getDateTime();
+ $ev['adjust'] = (($ical->DTSTART->isFloating()) ? 0 : 1);
+
+ $ev['dtstart'] = datetime_convert((($ev['adjust']) ? 'UTC' : date_default_timezone_get()),'UTC',
+ $dtstart->format(\DateTime::W3C));
+
+
+ if(isset($ical->DUE)) {
+ $dtend = $ical->DUE->getDateTime();
+ $ev['dtend'] = datetime_convert((($ev['adjust']) ? 'UTC' : date_default_timezone_get()),'UTC',
+ $dtend->format(\DateTime::W3C));
+ }
+ elseif(isset($ical->DTEND)) {
+ $dtend = $ical->DTEND->getDateTime();
+ $ev['dtend'] = datetime_convert((($ev['adjust']) ? 'UTC' : date_default_timezone_get()),'UTC',
+ $dtend->format(\DateTime::W3C));
+ }
+ else
+ $ev['nofinish'] = 1;
+
+
+ if($ev['dtstart'] === $ev['dtend'])
+ $ev['nofinish'] = 1;
+
+ if(isset($ical->CREATED)) {
+ $created = $ical->CREATED->getDateTime();
+ $ev['created'] = datetime_convert('UTC','UTC',$created->format(\DateTime::W3C));
+ }
+
+ if(isset($ical->{'DTSTAMP'})) {
+ $edited = $ical->{'DTSTAMP'}->getDateTime();
+ $ev['edited'] = datetime_convert('UTC','UTC',$edited->format(\DateTime::W3C));
+ }
+ if(isset($ical->{'LAST-MODIFIED'})) {
+ $edited = $ical->{'LAST-MODIFIED'}->getDateTime();
+ $ev['edited'] = datetime_convert('UTC','UTC',$edited->format(\DateTime::W3C));
+ }
+
+ if(isset($ical->{'X-ZOT-LOCATION'}))
+ $ev['location'] = event_ical_get_sourcetext( (string) $ical->{'X-ZOT-LOCATION'});
+ elseif(isset($ical->LOCATION))
+ $ev['location'] = (string) $ical->LOCATION;
+
+ if(isset($ical->{'X-ZOT-DESCRIPTION'}))
+ $ev['description'] = event_ical_get_sourcetext( (string) $ical->{'X-ZOT-DESCRIPTION'});
+ elseif(isset($ical->DESCRIPTION))
+ $ev['description'] = (string) $ical->DESCRIPTION;
+
+ if(isset($ical->{'X-ZOT-SUMMARY'}))
+ $ev['summary'] = event_ical_get_sourcetext( (string) $ical->{'X-ZOT-SUMMARY'});
+ elseif(isset($ical->SUMMARY))
+ $ev['summary'] = (string) $ical->SUMMARY;
+
+ if(isset($ical->PRIORITY))
+ $ev['event_priority'] = intval((string) $ical->PRIORITY);
+
+ if(isset($ical->UID)) {
+ $evuid = (string) $ical->UID;
+ $ev['event_hash'] = $evuid;
+ }
+
+ if(isset($ical->SEQUENCE)) {
+ $ev['event_sequence'] = (string) $ical->SEQUENCE;
+ }
+
+ if(isset($ical->STATUS)) {
+ $ev['event_status'] = (string) $ical->STATUS;
+ }
+
+ if(isset($ical->{'COMPLETED'})) {
+ $completed = $ical->{'COMPLETED'}->getDateTime();
+ $ev['event_status_date'] = datetime_convert('UTC','UTC',$completed->format(\DateTime::W3C));
+ }
+
+ if(isset($ical->{'PERCENT-COMPLETE'})) {
+ $ev['event_percent'] = (string) $ical->{'PERCENT-COMPLETE'} ;
+ }
+
+ $ev['event_vdata'] = $ical->serialize();
+
+ return $ev;
+}
+
+
+
+
+
function parse_ical_file($f,$uid) {
require_once('vendor/autoload.php');
@@ -610,22 +751,21 @@ function event_import_ical($ical, $uid) {
}
$dtstart = $ical->DTSTART->getDateTime();
- $ev['adjust'] = (($ical->DTSTART->isFloating()) ? 1 : 0);
+ $ev['adjust'] = (($ical->DTSTART->isFloating()) ? 0 : 1);
// logger('dtstart: ' . var_export($dtstart,true));
$ev['dtstart'] = datetime_convert((($ev['adjust']) ? 'UTC' : date_default_timezone_get()),'UTC',
$dtstart->format(\DateTime::W3C));
-
if(isset($ical->DTEND)) {
$dtend = $ical->DTEND->getDateTime();
$ev['dtend'] = datetime_convert((($ev['adjust']) ? 'UTC' : date_default_timezone_get()),'UTC',
$dtend->format(\DateTime::W3C));
}
- else
+ else {
$ev['nofinish'] = 1;
-
+ }
if($ev['dtstart'] === $ev['dtend'])
$ev['nofinish'] = 1;
@@ -635,6 +775,7 @@ function event_import_ical($ical, $uid) {
$ev['created'] = datetime_convert('UTC','UTC',$created->format(\DateTime::W3C));
}
+
if(isset($ical->{'LAST-MODIFIED'})) {
$edited = $ical->{'LAST-MODIFIED'}->getDateTime();
$ev['edited'] = datetime_convert('UTC','UTC',$edited->format(\DateTime::W3C));
@@ -713,7 +854,7 @@ function event_import_ical_task($ical, $uid) {
$dtstart = $ical->DTSTART->getDateTime();
- $ev['adjust'] = (($ical->DTSTART->isFloating()) ? 1 : 0);
+ $ev['adjust'] = (($ical->DTSTART->isFloating()) ? 0 : 1);
// logger('dtstart: ' . var_export($dtstart,true));
diff --git a/include/feedutils.php b/include/feedutils.php
index b122a8e4b..6bb7d103e 100644
--- a/include/feedutils.php
+++ b/include/feedutils.php
@@ -2,39 +2,39 @@
/**
- * @brief Generate an Atom feed.
+ * @brief Return an Atom feed for channel.
+ *
+ * @see get_feed_for()
*
* @param array $channel
- * @param array $params
+ * @param array $params associative array which configures the feed
+ * @return string with an atom feed
*/
function get_public_feed($channel, $params) {
- $type = 'xml';
+/* $type = 'xml';
$begin = NULL_DATE;
$end = '';
$start = 0;
$records = 40;
$direction = 'desc';
$pages = 0;
+*/
if(! $params)
- $params = array();
-
- $params['type'] = ((x($params,'type')) ? $params['type'] : 'xml');
- $params['begin'] = ((x($params,'begin')) ? $params['begin'] : NULL_DATE);
- $params['end'] = ((x($params,'end')) ? $params['end'] : datetime_convert('UTC','UTC','now'));
- $params['start'] = ((x($params,'start')) ? $params['start'] : 0);
- $params['records'] = ((x($params,'records')) ? $params['records'] : 40);
- $params['direction'] = ((x($params,'direction')) ? $params['direction'] : 'desc');
- $params['pages'] = ((x($params,'pages')) ? intval($params['pages']) : 0);
- $params['top'] = ((x($params,'top')) ? intval($params['top']) : 0);
- $params['cat'] = ((x($params,'cat')) ? $params['cat'] : '');
+ $params = [];
+ $params['type'] = ((x($params,'type')) ? $params['type'] : 'xml');
+ $params['begin'] = ((x($params,'begin')) ? $params['begin'] : NULL_DATE);
+ $params['end'] = ((x($params,'end')) ? $params['end'] : datetime_convert('UTC','UTC','now'));
+ $params['start'] = ((x($params,'start')) ? $params['start'] : 0);
+ $params['records'] = ((x($params,'records')) ? $params['records'] : 40);
+ $params['direction'] = ((x($params,'direction'))? $params['direction'] : 'desc');
+ $params['pages'] = ((x($params,'pages')) ? intval($params['pages']) : 0);
+ $params['top'] = ((x($params,'top')) ? intval($params['top']) : 0);
+ $params['cat'] = ((x($params,'cat')) ? $params['cat'] : '');
+ $params['compat'] = ((x($params,'compat')) ? intval($params['compat']) : 0);
- // put a sane lower limit on feed requests if not specified
-
-// if($params['begin'] <= NULL_DATE)
-// $params['begin'] = datetime_convert('UTC','UTC','now - 1 month');
switch($params['type']) {
case 'json':
@@ -50,16 +50,17 @@ function get_public_feed($channel, $params) {
}
/**
- * @brief
+ * @brief Create an atom feed for $channel from template.
*
* @param array $channel
- * @param string $observer_hash
+ * @param string $observer_hash xchan_hash from observer
* @param array $params
- * @return string
+ * @return string with an atom feed
*/
+
function get_feed_for($channel, $observer_hash, $params) {
- if(! channel)
+ if(! $channel)
http_status_exit(401);
if($params['pages']) {
@@ -69,32 +70,25 @@ function get_feed_for($channel, $observer_hash, $params) {
if(! perm_is_allowed($channel['channel_id'],$observer_hash,'view_stream'))
http_status_exit(403);
}
- $items = items_fetch(array(
- 'wall' => '1',
- 'datequery' => $params['end'],
- 'datequery2' => $params['begin'],
- 'start' => $params['start'], // FIXME
- 'records' => $params['records'], // FIXME
- 'direction' => $params['direction'], // FIXME
- 'pages' => $params['pages'],
- 'order' => 'post',
- 'top' => $params['top'],
- 'cat' => $params['cat']
- ), $channel, $observer_hash, CLIENT_MODE_NORMAL, App::$module);
-
+
+ // logger('params: ' . print_r($params,true));
$feed_template = get_markup_template('atom_feed.tpl');
$atom = '';
+ $feed_author = '';
+ if(intval($params['compat']) === 1) {
+ $feed_author = atom_author('author',$channel['channel_address'],$channel['channel_name'],$channel['xchan_url'],300,300,$channel['xchan_photo_mimetype'],$channel['xchan_photo_l']);
+ }
+
$atom .= replace_macros($feed_template, array(
'$version' => xmlify(Zotlabs\Lib\System::get_project_version()),
'$red' => xmlify(Zotlabs\Lib\System::get_platform_name()),
'$feed_id' => xmlify($channel['xchan_url']),
'$feed_title' => xmlify($channel['channel_name']),
- '$feed_updated' => xmlify(datetime_convert('UTC', 'UTC', 'now' , ATOM_TIME)) ,
- '$hub' => '', // feed_hublinks(),
- '$salmon' => '', // feed_salmonlinks($channel['channel_address']),
+ '$feed_updated' => xmlify(datetime_convert('UTC', 'UTC', 'now', ATOM_TIME)),
+ '$author' => $feed_author,
'$name' => xmlify($channel['channel_name']),
'$profile_page' => xmlify($channel['xchan_url']),
'$mimephoto' => xmlify($channel['xchan_photo_mimetype']),
@@ -108,8 +102,30 @@ function get_feed_for($channel, $observer_hash, $params) {
));
+ $x = [ 'xml' => $atom, 'channel' => $channel, 'observer_hash' => $observer_hash, 'params' => $params ];
+ call_hooks('atom_feed_top',$x);
+
+ $atom = $x['xml'];
+
+ // a much simpler interface
call_hooks('atom_feed', $atom);
+ $items = items_fetch(
+ [
+ 'wall' => '1',
+ 'datequery' => $params['end'],
+ 'datequery2' => $params['begin'],
+ 'start' => intval($params['start']),
+ 'records' => intval($params['records']),
+ 'direction' => dbesc($params['direction']),
+ 'pages' => $params['pages'],
+ 'order' => dbesc('post'),
+ 'top' => $params['top'],
+ 'cat' => $params['cat'],
+ 'compat' => $params['compat']
+ ], $channel, $observer_hash, CLIENT_MODE_NORMAL, App::$module
+ );
+
if($items) {
$type = 'html';
foreach($items as $item) {
@@ -129,10 +145,10 @@ function get_feed_for($channel, $observer_hash, $params) {
}
/**
- * @brief
+ * @brief Return the verb for an item, or fall back to ACTIVITY_POST.
*
* @param array $item an associative array with
- * * \b string \b verb
+ * * \e string \b verb
* @return string item's verb if set, default ACTIVITY_POST see boot.php
*/
function construct_verb($item) {
@@ -165,9 +181,11 @@ function construct_activity_object($item) {
else
$o .= '<link rel="alternate" type="text/html" href="' . xmlify($r->link) . '" />' . "\r\n";
}
- if($r->content)
+ if($r->content) {
$o .= '<content type="html" >' . xmlify(bbcode($r->content)) . '</content>' . "\r\n";
+ }
$o .= '</as:object>' . "\r\n";
+
return $o;
}
@@ -210,14 +228,16 @@ function construct_activity_target($item) {
}
/**
- * @param object $feed
+ * @brief Return an array with a parsed atom item.
+ *
+ * @param SimplePie $feed
* @param array $item
* @param[out] array $author
- * @return multitype:multitype: string NULL number Ambigous <NULL, string, number> Ambigous <mixed, string> Ambigous <multitype:multitype:string Ambigous <NULL, string> , multitype:multitype:string unknown > multitype:NULL unknown
+ * @return array Associative array with the parsed item data
*/
function get_atom_elements($feed, $item, &$author) {
- //$best_photo = array();
+ require_once('include/html2bbcode.php');
$res = array();
@@ -246,7 +266,7 @@ function get_atom_elements($feed, $item, &$author) {
// removing the content of the title if its identically to the body
// This helps with auto generated titles e.g. from tumblr
- if (title_is_body($res["title"], $res["body"]))
+ if (title_is_body($res['title'], $res['body']))
$res['title'] = "";
if($res['plink'])
@@ -254,86 +274,128 @@ function get_atom_elements($feed, $item, &$author) {
else
$base_url = '';
- // look for a photo. We should check media size and find the best one,
- // but for now let's just find any author photo
- $rawauthor = $item->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10,'author');
+ $rawverb = $item->get_item_tags(NAMESPACE_ACTIVITY, 'verb');
- if($rawauthor && $rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['link']) {
- $base = $rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['link'];
- foreach($base as $link) {
- if(!x($author, 'author_photo') || ! $author['author_photo']) {
- if($link['attribs']['']['rel'] === 'photo' || $link['attribs']['']['rel'] === 'avatar')
- $author['author_photo'] = unxmlify($link['attribs']['']['href']);
- }
- }
+ // select between supported verbs
+
+ if($rawverb) {
+ $res['verb'] = unxmlify($rawverb[0]['data']);
}
- $rawactor = $item->get_item_tags(NAMESPACE_ACTIVITY, 'actor');
+ // translate OStatus unfollow to activity streams if it happened to get selected
- if($rawactor && activity_match($rawactor[0]['child'][NAMESPACE_ACTIVITY]['obj_type'][0]['data'],ACTIVITY_OBJ_PERSON)) {
- $base = $rawactor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['link'];
- if($base && count($base)) {
- foreach($base as $link) {
- if($link['attribs']['']['rel'] === 'alternate' && (! $res['author_link']))
- $author['author_link'] = unxmlify($link['attribs']['']['href']);
- if(!x($author, 'author_photo') || ! $author['author_photo']) {
- if($link['attribs']['']['rel'] === 'avatar' || $link['attribs']['']['rel'] === 'photo')
- $author['author_photo'] = unxmlify($link['attribs']['']['href']);
- }
- }
- }
- }
+ if((x($res,'verb')) && ($res['verb'] === 'http://ostatus.org/schema/1.0/unfollow'))
+ $res['verb'] = ACTIVITY_UNFOLLOW;
- // check for a yahoo media element (github etc.)
- if(! $author['author_photo']) {
- $rawmedia = $item->get_item_tags(NAMESPACE_YMEDIA,'thumbnail');
- if($rawmedia && $rawmedia[0]['attribs']['']['url']) {
- $author['author_photo'] = strip_tags(unxmlify($rawmedia[0]['attribs']['']['url']));
+ if(array_key_exists('verb',$res) && $res['verb'] === ACTIVITY_SHARE) {
+ // For Mastodon shares ("boosts"), we need to parse the original author information
+ // from the activity:object -> author structure
+ $rawobj = $item->get_item_tags(NAMESPACE_ACTIVITY, 'object');
+
+ if($rawobj) {
+ $rawauthor = $rawobj->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'author');
+ if($rawauthor && $rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name']) {
+ $author['author_name'] = unxmlify($rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name']);
+ }
+
+ if($rawauthor && $rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri']) {
+ $author['author_link'] = unxmlify($rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri']);
+ }
+ if($rawauthor && $rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['link']) {
+ $base = $rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['link'];
+ foreach($base as $link) {
+ if(!x($author, 'author_photo') || ! $author['author_photo']) {
+ if($link['attribs']['']['rel'] === 'photo' || $link['attribs']['']['rel'] === 'avatar')
+ $author['author_photo'] = unxmlify($link['attribs']['']['href']);
+ }
+ }
+ }
}
}
+ else {
+ // look for a photo. We should check media size and find the best one,
+ // but for now let's just find any author photo
+ $rawauthor = $item->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'author');
- // No photo/profile-link on the item - look at the feed level
-
- if((! (x($author,'author_link'))) || (! (x($author,'author_photo')))) {
- $rawauthor = $feed->get_feed_tags(SIMPLEPIE_NAMESPACE_ATOM_10,'author');
if($rawauthor && $rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['link']) {
$base = $rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['link'];
foreach($base as $link) {
- if($link['attribs']['']['rel'] === 'alternate' && (! $author['author_link'])) {
- $author['author_link'] = unxmlify($link['attribs']['']['href']);
- $author['author_is_feed'] = true;
- }
- if(! $author['author_photo']) {
+ if(!x($author, 'author_photo') || ! $author['author_photo']) {
if($link['attribs']['']['rel'] === 'photo' || $link['attribs']['']['rel'] === 'avatar')
$author['author_photo'] = unxmlify($link['attribs']['']['href']);
}
}
}
- $rawactor = $feed->get_feed_tags(NAMESPACE_ACTIVITY, 'subject');
+ $rawactor = $item->get_item_tags(NAMESPACE_ACTIVITY, 'actor');
- if($rawactor && activity_match($rawactor[0]['child'][NAMESPACE_ACTIVITY]['obj_type'][0]['data'],ACTIVITY_OBJ_PERSON)) {
+ if($rawactor && activity_match($rawactor[0]['child'][NAMESPACE_ACTIVITY]['obj_type'][0]['data'], ACTIVITY_OBJ_PERSON)) {
$base = $rawactor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['link'];
-
if($base && count($base)) {
foreach($base as $link) {
if($link['attribs']['']['rel'] === 'alternate' && (! $res['author_link']))
$author['author_link'] = unxmlify($link['attribs']['']['href']);
- if(! (x($author,'author_photo'))) {
+ if(!x($author, 'author_photo') || ! $author['author_photo']) {
if($link['attribs']['']['rel'] === 'avatar' || $link['attribs']['']['rel'] === 'photo')
$author['author_photo'] = unxmlify($link['attribs']['']['href']);
}
}
}
}
+
+ // check for a yahoo media element (github etc.)
+
+ if(! $author['author_photo']) {
+ $rawmedia = $item->get_item_tags(NAMESPACE_YMEDIA,'thumbnail');
+ if($rawmedia && $rawmedia[0]['attribs']['']['url']) {
+ $author['author_photo'] = strip_tags(unxmlify($rawmedia[0]['attribs']['']['url']));
+ }
+ }
+
+
+ // No photo/profile-link on the item - look at the feed level
+
+ if((! (x($author,'author_link'))) || (! (x($author,'author_photo')))) {
+ $rawauthor = $feed->get_feed_tags(SIMPLEPIE_NAMESPACE_ATOM_10,'author');
+ if($rawauthor && $rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['link']) {
+ $base = $rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['link'];
+ foreach($base as $link) {
+ if($link['attribs']['']['rel'] === 'alternate' && (! $author['author_link'])) {
+ $author['author_link'] = unxmlify($link['attribs']['']['href']);
+ $author['author_is_feed'] = true;
+ }
+ if(! $author['author_photo']) {
+ if($link['attribs']['']['rel'] === 'photo' || $link['attribs']['']['rel'] === 'avatar')
+ $author['author_photo'] = unxmlify($link['attribs']['']['href']);
+ }
+ }
+ }
+
+ $rawactor = $feed->get_feed_tags(NAMESPACE_ACTIVITY, 'subject');
+
+ if($rawactor && activity_match($rawactor[0]['child'][NAMESPACE_ACTIVITY]['obj_type'][0]['data'], ACTIVITY_OBJ_PERSON)) {
+ $base = $rawactor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['link'];
+
+ if($base && count($base)) {
+ foreach($base as $link) {
+ if($link['attribs']['']['rel'] === 'alternate' && (! $res['author_link']))
+ $author['author_link'] = unxmlify($link['attribs']['']['href']);
+ if(! (x($author,'author_photo'))) {
+ if($link['attribs']['']['rel'] === 'avatar' || $link['attribs']['']['rel'] === 'photo')
+ $author['author_photo'] = unxmlify($link['attribs']['']['href']);
+ }
+ }
+ }
+ }
+ }
}
- $ostatus_protocol = (($item->get_item_tags(NAMESPACE_OSTATUS,'conversation')) ? true : false);
+ $ostatus_protocol = (($item->get_item_tags(NAMESPACE_OSTATUS, 'conversation')) ? true : false);
- $apps = $item->get_item_tags(NAMESPACE_STATUSNET,'notice_info');
+ $apps = $item->get_item_tags(NAMESPACE_STATUSNET, 'notice_info');
if($apps && $apps[0]['attribs']['']['source']) {
$res['app'] = strip_tags(unxmlify($apps[0]['attribs']['']['source']));
}
@@ -346,7 +408,7 @@ function get_atom_elements($feed, $item, &$author) {
$rawenv = $item->get_item_tags(NAMESPACE_DFRN, 'env');
if(! $rawenv)
- $rawenv = $item->get_item_tags(NAMESPACE_ZOT,'source');
+ $rawenv = $item->get_item_tags(NAMESPACE_ZOT, 'source');
if($rawenv) {
$have_real_body = true;
$res['body'] = $rawenv[0]['data'];
@@ -393,9 +455,9 @@ function get_atom_elements($feed, $item, &$author) {
}
- // strip title and don't apply "title-in-body" if the feed involved
+ // strip title and don't apply "title-in-body" if the feed involved
// uses the OStatus stack. We need a more generalised way for the calling
- // function to specify this behaviour or for plugins to alter it.
+ // function to specify this behaviour or for plugins to alter it.
if($ostatus_protocol) {
$res['title'] = '';
@@ -421,7 +483,7 @@ function get_atom_elements($feed, $item, &$author) {
);
}
- $private = $item->get_item_tags(NAMESPACE_DFRN,'private');
+ $private = $item->get_item_tags(NAMESPACE_DFRN, 'private');
if($private && intval($private[0]['data']) > 0)
$res['item_private'] = ((intval($private[0]['data'])) ? 1 : 0);
else
@@ -431,11 +493,11 @@ function get_atom_elements($feed, $item, &$author) {
if($rawlocation)
$res['location'] = unxmlify($rawlocation[0]['data']);
- $rawcreated = $item->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10,'published');
+ $rawcreated = $item->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'published');
if($rawcreated)
$res['created'] = unxmlify($rawcreated[0]['data']);
- $rawedited = $item->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10,'updated');
+ $rawedited = $item->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'updated');
if($rawedited)
$res['edited'] = unxmlify($rawedited[0]['data']);
@@ -465,7 +527,7 @@ function get_atom_elements($feed, $item, &$author) {
$rawowner = $item->get_item_tags(NAMESPACE_DFRN, 'owner');
if(! $rawowner)
- $rawowner = $item->get_item_tags(NAMESPACE_ZOT,'owner');
+ $rawowner = $item->get_item_tags(NAMESPACE_ZOT, 'owner');
if($rawowner[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'])
$author['owner_name'] = unxmlify($rawowner[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data']);
@@ -487,32 +549,21 @@ function get_atom_elements($feed, $item, &$author) {
}
}
- $rawgeo = $item->get_item_tags(NAMESPACE_GEORSS,'point');
+ $rawgeo = $item->get_item_tags(NAMESPACE_GEORSS, 'point');
if($rawgeo)
$res['coord'] = unxmlify($rawgeo[0]['data']);
- $rawverb = $item->get_item_tags(NAMESPACE_ACTIVITY, 'verb');
-
- // select between supported verbs
-
- if($rawverb) {
- $res['verb'] = unxmlify($rawverb[0]['data']);
- }
-
- // translate OStatus unfollow to activity streams if it happened to get selected
-
- if((x($res,'verb')) && ($res['verb'] === 'http://ostatus.org/schema/1.0/unfollow'))
- $res['verb'] = ACTIVITY_UNFOLLOW;
-
$cats = $item->get_categories();
if($cats) {
if(is_null($terms))
$terms = array();
+
foreach($cats as $cat) {
$term = $cat->get_term();
if(! $term)
$term = $cat->get_label();
+
$scheme = $cat->get_scheme();
$termurl = '';
if($scheme && $term && stristr($scheme,'X-DFRN:')) {
@@ -527,7 +578,7 @@ function get_atom_elements($feed, $item, &$author) {
if($termterm) {
$terms[] = array(
'otype' => TERM_OBJ_POST,
- 'ttype' => $termtype,
+ 'ttype' => $termtype,
'url' => $termurl,
'term' => $termterm,
);
@@ -584,6 +635,7 @@ function get_atom_elements($feed, $item, &$author) {
$body = $child[SIMPLEPIE_NAMESPACE_ATOM_10]['content'][0]['data'];
if(! $body)
$body = $child[SIMPLEPIE_NAMESPACE_ATOM_10]['summary'][0]['data'];
+
// preserve a copy of the original body content in case we later need to parse out any microformat information, e.g. events
$obj['orig'] = xmlify($body);
if((strpos($body,'<') !== false) || (strpos($body,'>') !== false)) {
@@ -635,18 +687,28 @@ function get_atom_elements($feed, $item, &$author) {
$res['target'] = $obj;
}
-
- $arr = array('feed' => $feed, 'item' => $item, 'author' => $author, 'result' => $res);
+ // build array to pass to hook
+ $arr = [
+ 'feed' => $feed,
+ 'item' => $item,
+ 'author' => $author,
+ 'result' => $res
+ ];
call_hooks('parse_atom', $arr);
- logger('get_atom_elements: author: ' . print_r($arr['author'],true),LOGGER_DATA);
-
- logger('get_atom_elements: ' . print_r($arr['result'],true),LOGGER_DATA);
+ logger('author: ' .print_r($arr['author'], true), LOGGER_DATA);
+ logger('result: ' .print_r($arr['result'], true), LOGGER_DATA);
return $arr['result'];
}
+/**
+ * @brief Encodes SimplePie_Item link arrays.
+ *
+ * @param array $links Array with SimplePie_Item link tags
+ * @return array
+ */
function encode_rel_links($links) {
$o = array();
if(! ((is_array($links)) && (count($links))))
@@ -660,26 +722,27 @@ function encode_rel_links($links) {
$l['type'] = $link['attribs']['']['type'];
if($link['attribs']['']['href'])
$l['href'] = $link['attribs']['']['href'];
- if( (x($link['attribs'],NAMESPACE_MEDIA)) && $link['attribs'][NAMESPACE_MEDIA]['width'])
+ if( (x($link['attribs'], NAMESPACE_MEDIA)) && $link['attribs'][NAMESPACE_MEDIA]['width'])
$l['width'] = $link['attribs'][NAMESPACE_MEDIA]['width'];
- if( (x($link['attribs'],NAMESPACE_MEDIA)) && $link['attribs'][NAMESPACE_MEDIA]['height'])
+ if( (x($link['attribs'], NAMESPACE_MEDIA)) && $link['attribs'][NAMESPACE_MEDIA]['height'])
$l['height'] = $link['attribs'][NAMESPACE_MEDIA]['height'];
if($l)
$o[] = $l;
}
+
return $o;
}
/**
* @brief Process atom feed and update anything/everything we might need to update.
*
- * @param array $xml
+ * @param string $xml
* The (atom) feed to consume - RSS isn't as fully supported but may work for simple feeds.
* @param $importer
* The contact_record (joined to user_record) of the local user who owns this
* relationship. It is this person's stuff that is going to be updated.
- * @param $contact
+ * @param[in,out] array $contact
* The person who is sending us stuff. If not set, we MAY be processing a "follow" activity
* from an external network and MAY create an appropriate contact record. Otherwise, we MUST
* have a contact record.
@@ -697,14 +760,12 @@ function encode_rel_links($links) {
*/
function consume_feed($xml, $importer, &$contact, $pass = 0) {
- require_once('library/simplepie/simplepie.inc');
-
if(! strlen($xml)) {
- logger('consume_feed: empty input');
+ logger('Empty input');
return;
}
- $sys_expire = intval(get_config('system','default_expire_days'));
+ $sys_expire = intval(get_config('system', 'default_expire_days'));
$chn_expire = intval($importer['channel_expire_days']);
$expire_days = $sys_expire;
@@ -712,14 +773,19 @@ function consume_feed($xml, $importer, &$contact, $pass = 0) {
if(($chn_expire != 0) && ($chn_expire < $sys_expire))
$expire_days = $chn_expire;
- // logger('expire_days: ' . $expire_days);
-
$feed = new SimplePie();
$feed->set_raw_data($xml);
+
+ // We can preserve iframes because we will strip them in the purifier after
+ // checking for supported video sources.
+ $strip_htmltags = $feed->strip_htmltags;
+ array_splice($strip_htmltags, array_search('iframe', $strip_htmltags), 1);
+ $feed->strip_htmltags($strip_htmltags);
+
$feed->init();
if($feed->error())
- logger('consume_feed: Error parsing XML: ' . $feed->error());
+ logger('Error parsing XML: ' . $feed->error());
$permalink = $feed->get_permalink();
@@ -753,7 +819,7 @@ function consume_feed($xml, $importer, &$contact, $pass = 0) {
$item = $r[0];
if(! intval($item['item_deleted'])) {
- logger('consume_feed: deleting item ' . $item['id'] . ' mid=' . $item['mid'], LOGGER_DEBUG);
+ logger('deleting item ' . $item['id'] . ' mid=' . $item['mid'], LOGGER_DEBUG);
drop_item($item['id'],false);
}
}
@@ -765,7 +831,7 @@ function consume_feed($xml, $importer, &$contact, $pass = 0) {
if($feed->get_item_quantity()) {
- logger('consume_feed: feed item count = ' . $feed->get_item_quantity(), LOGGER_DEBUG);
+ logger('feed item count = ' . $feed->get_item_quantity(), LOGGER_DEBUG);
$items = $feed->get_items();
@@ -774,7 +840,7 @@ function consume_feed($xml, $importer, &$contact, $pass = 0) {
$is_reply = false;
$item_id = normalise_id($item->get_id());
- logger('consume_feed: processing ' . $raw_item_id, LOGGER_DEBUG);
+ logger('processing ' . $item->get_id(), LOGGER_DEBUG);
$rawthread = $item->get_item_tags( NAMESPACE_THREAD,'in-reply-to');
if(isset($rawthread[0]['attribs']['']['ref'])) {
@@ -793,6 +859,9 @@ function consume_feed($xml, $importer, &$contact, $pass = 0) {
$author = array();
$datarray = get_atom_elements($feed,$item,$author);
+ if($datarray['mid'])
+ $datarray['mid'] = normalise_id($item->get_id());
+
if($contact['xchan_network'] === 'rss') {
$datarray['public_policy'] = 'specific';
$datarray['comment_policy'] = 'none';
@@ -847,11 +916,10 @@ function consume_feed($xml, $importer, &$contact, $pass = 0) {
$datarray['parent_mid'] = $parent_mid;
-
$datarray['aid'] = $importer['channel_account_id'];
$datarray['uid'] = $importer['channel_id'];
- logger('consume_feed: ' . print_r($datarray,true),LOGGER_DATA);
+ logger('data: ' . print_r($datarray, true), LOGGER_DATA);
$xx = item_store($datarray);
$r = $xx['item_id'];
@@ -865,12 +933,14 @@ function consume_feed($xml, $importer, &$contact, $pass = 0) {
$author = array();
$datarray = get_atom_elements($feed,$item,$author);
+ if($datarray['mid'])
+ $datarray['mid'] = normalise_id($item->get_id());
+
if($contact['xchan_network'] === 'rss') {
$datarray['public_policy'] = 'specific';
$datarray['comment_policy'] = 'none';
}
-
if(is_array($contact)) {
if((! x($author,'author_name')) || ($author['author_is_feed']))
$author['author_name'] = $contact['xchan_name'];
@@ -881,18 +951,19 @@ function consume_feed($xml, $importer, &$contact, $pass = 0) {
}
if((! x($author,'author_name')) || (! x($author,'author_link'))) {
- logger('consume_feed: no author information! ' . print_r($author,true));
+ logger('No author information! ' . print_r($author,true));
continue;
}
$datarray['author_xchan'] = '';
if(activity_match($datarray['verb'],ACTIVITY_FOLLOW) && $datarray['obj_type'] === ACTIVITY_OBJ_PERSON) {
- $cb = array('item' => $datarray,'channel' => $importer, 'xchan' => null, 'author' => $author, 'caught' => false);
+ $cb = array('item' => $datarray,'channel' => $importer, 'xchan' => [ 'placeholder' => '' ], 'author' => $author, 'caught' => false);
call_hooks('follow_from_feed',$cb);
if($cb['caught']) {
if($cb['return_code'])
http_status_exit($cb['return_code']);
+
continue;
}
}
@@ -917,7 +988,6 @@ function consume_feed($xml, $importer, &$contact, $pass = 0) {
}
-
$r = q("SELECT edited FROM item WHERE mid = '%s' AND uid = %d LIMIT 1",
dbesc($item_id),
intval($importer['channel_id'])
@@ -943,50 +1013,54 @@ function consume_feed($xml, $importer, &$contact, $pass = 0) {
$datarray['uid'] = $importer['channel_id'];
$datarray['aid'] = $importer['channel_account_id'];
- if(! link_compare($author['owner_link'],$contact['xchan_url'])) {
- logger('consume_feed: Correcting item owner.', LOGGER_DEBUG);
+ if(! link_compare($author['owner_link'], $contact['xchan_url'])) {
+ logger('Correcting item owner.', LOGGER_DEBUG);
$author['owner_name'] = $contact['name'];
$author['owner_link'] = $contact['url'];
$author['owner_avatar'] = $contact['thumb'];
}
- if(! post_is_importable($datarray,$contact))
+ if(! post_is_importable($datarray, $contact))
continue;
- logger('consume_feed: author ' . print_r($author,true),LOGGER_DEBUG);
-
- logger('consume_feed: ' . print_r($datarray,true),LOGGER_DATA);
+ logger('author: ' . print_r($author, true), LOGGER_DEBUG);
+ logger('data: ' . print_r($datarray, true), LOGGER_DATA);
$xx = item_store($datarray);
$r = $xx['item_id'];
+
continue;
}
}
}
}
-
+/**
+ * @brief Normalise an id.
+ *
+ * Strip "X-ZOT:" from $id.
+ *
+ * @param string $id
+ * @return string
+ */
function normalise_id($id) {
- return str_replace('X-ZOT:','',$id);
+ return str_replace('X-ZOT:', '', $id);
}
/**
- * @brief Process atom feed and return the first post and structure
+ * @brief Process atom feed and return the first post and structure.
*
- * @param array $xml
+ * @param string $xml
* The (atom) feed to consume - RSS isn't as fully supported but may work for simple feeds.
* @param $importer
* The contact_record (joined to user_record) of the local user who owns this
* relationship. It is this person's stuff that is going to be updated.
*/
-
function process_salmon_feed($xml, $importer) {
$ret = array();
- require_once('library/simplepie/simplepie.inc');
-
if(! strlen($xml)) {
logger('process_feed: empty input');
return;
@@ -994,6 +1068,13 @@ function process_salmon_feed($xml, $importer) {
$feed = new SimplePie();
$feed->set_raw_data($xml);
+
+ // We can preserve iframes because we will strip them in the purifier after
+ // checking for supported video sources.
+ $strip_htmltags = $feed->strip_htmltags;
+ array_splice($strip_htmltags, array_search('iframe', $strip_htmltags), 1);
+ $feed->strip_htmltags($strip_htmltags);
+
$feed->init();
if($feed->error())
@@ -1015,7 +1096,7 @@ function process_salmon_feed($xml, $importer) {
logger('processing ' . $item_id, LOGGER_DEBUG);
- $rawthread = $item->get_item_tags( NAMESPACE_THREAD,'in-reply-to');
+ $rawthread = $item->get_item_tags( NAMESPACE_THREAD, 'in-reply-to');
if(isset($rawthread[0]['attribs']['']['ref'])) {
$is_reply = true;
$parent_mid = normalise_id($rawthread[0]['attribs']['']['ref']);
@@ -1026,94 +1107,107 @@ function process_salmon_feed($xml, $importer) {
$ret['author'] = array();
- $datarray = get_atom_elements($feed,$item,$ret['author']);
+ $datarray = get_atom_elements($feed, $item, $ret['author']);
// reset policies which are restricted by default for RSS connections
- // This item is likely coming from GNU-social via salmon and allows public interaction
+ // This item is likely coming from GNU-social via salmon and allows public interaction
$datarray['public_policy'] = '';
$datarray['comment_policy'] = '';
- $ret['item'] = $datarray;
+ $ret['item'] = $datarray;
}
}
return $ret;
}
-/*
- * Given an xml (atom) feed, find author and hub links
- */
-
+/**
+ * @brief Given an xml (atom) feed, find author and hub links.
+ *
+ * @param string $xml
+ * @return array
+ */
function feed_meta($xml) {
- require_once('library/simplepie/simplepie.inc');
$ret = array();
- if(! strlen($xml)) {
- logger('empty input');
- return $ret;
- }
+ if(! strlen($xml)) {
+ logger('empty input');
+ return $ret;
+ }
- $feed = new SimplePie();
- $feed->set_raw_data($xml);
- $feed->init();
+ $feed = new SimplePie();
+ $feed->set_raw_data($xml);
+ $feed->init();
- if($feed->error()) {
- logger('Error parsing XML: ' . $feed->error());
+ if($feed->error()) {
+ logger('Error parsing XML: ' . $feed->error());
return $ret;
}
- $ret['hubs'] = $feed->get_links('hub');
+ $ret['hubs'] = $feed->get_links('hub');
+
+ //logger('hubs: ' . print_r($hubs,true), LOGGER_DATA);
-// logger('consume_feed: hubs: ' . print_r($hubs,true), LOGGER_DATA);
-
$author = array();
- $found_author = $feed->get_author();
- if($found_author) {
- $author['author_name'] = unxmlify($found_author->get_name());
- $author['author_link'] = unxmlify($found_author->get_link());
+ $found_author = $feed->get_author();
+ if($found_author) {
+ $author['author_name'] = unxmlify($found_author->get_name());
+ $author['author_link'] = unxmlify($found_author->get_link());
- $rawauthor = $feed->get_feed_tags(SIMPLEPIE_NAMESPACE_ATOM_10,'author');
- logger('rawauthor: ' . print_r($rawauthor,true));
+ $rawauthor = $feed->get_feed_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'author');
+ logger('rawauthor: ' . print_r($rawauthor, true));
- if($rawauthor) {
+ if($rawauthor) {
if($rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['link']) {
- $base = $rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['link'];
- foreach($base as $link) {
- if(!x($author, 'author_photo') || ! $author['author_photo']) {
- if($link['attribs']['']['rel'] === 'photo' || $link['attribs']['']['rel'] === 'avatar') {
- $author['author_photo'] = unxmlify($link['attribs']['']['href']);
+ $base = $rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['link'];
+ foreach($base as $link) {
+ if(!x($author, 'author_photo') || ! $author['author_photo']) {
+ if($link['attribs']['']['rel'] === 'photo' || $link['attribs']['']['rel'] === 'avatar') {
+ $author['author_photo'] = unxmlify($link['attribs']['']['href']);
break;
}
- }
- }
+ }
+ }
}
if($rawauthor[0]['child'][NAMESPACE_POCO]['displayName'][0]['data'])
$author['full_name'] = unxmlify($rawauthor[0]['child'][NAMESPACE_POCO]['displayName'][0]['data']);
if($rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'])
$author['author_uri'] = unxmlify($rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data']);
-
}
- }
+ }
- if(substr($author['author_link'],-1,1) == '/')
- $author['author_link'] = substr($author['author_link'],0,-1);
+ if(substr($author['author_link'],-1,1) == '/')
+ $author['author_link'] = substr($author['author_link'],0,-1);
- $ret['author'] = $author;
+ $ret['author'] = $author;
return $ret;
}
-
-
-function update_feed_item($uid,$datarray) {
- logger('update_feed_item: not implemented! ' . $uid . ' ' . print_r($datarray,true), LOGGER_DATA);
+/**
+ * @brief Not yet implemented function to update feed item.
+ *
+ * @param int $uid
+ * @param array $datarray
+ */
+function update_feed_item($uid, $datarray) {
+ logger('Not implemented! ' . $uid . ' ' . print_r($datarray, true), LOGGER_DATA);
}
-
-function handle_feed($uid,$abook_id,$url) {
+/**
+ * @brief Fetch the content of a feed and further consume it.
+ *
+ * It will first process parent items and in a second run child items.
+ * @see consume_feed()
+ *
+ * @param int $uid
+ * @param int $abook_id
+ * @param string $url URL of the feed
+ */
+function handle_feed($uid, $abook_id, $url) {
$channel = channelx_by_n($uid);
if(! $channel)
@@ -1125,22 +1219,37 @@ function handle_feed($uid,$abook_id,$url) {
);
$recurse = 0;
- $z = z_fetch_url($url,false,$recurse,array('novalidate' => true));
+ $z = z_fetch_url($url, false, $recurse, array('novalidate' => true));
-//logger('handle_feed:' . print_r($z,true));
+ //logger('data:' . print_r($z, true), LOGGER_DATA);
if($z['success']) {
- consume_feed($z['body'],$channel,$x[0],1);
- consume_feed($z['body'],$channel,$x[0],2);
+ consume_feed($z['body'], $channel, $x[0], 1);
+ consume_feed($z['body'], $channel, $x[0], 2);
}
}
-
-function atom_author($tag,$name,$uri,$h,$w,$type,$photo) {
+/**
+ * @brief Return a XML tag with author information.
+ *
+ * @hooks \b atom_author Possibility to add further tags to returned XML string
+ * * \e string The created XML tag as a string without closing tag
+ * @param string $tag The XML tag to create
+ * @param string $nick preferred username
+ * @param string $name displayed name of the author
+ * @param string $uri
+ * @param int $h image height
+ * @param int $w image width
+ * @param string $type profile photo mime type
+ * @param string $photo Fully qualified URL to a profile/avator photo
+ * @return string
+ */
+function atom_author($tag, $nick, $name, $uri, $h, $w, $type, $photo) {
$o = '';
if(! $tag)
return $o;
+ $nick = xmlify($nick);
$name = xmlify($name);
$uri = xmlify($uri);
$h = intval($h);
@@ -1148,10 +1257,13 @@ function atom_author($tag,$name,$uri,$h,$w,$type,$photo) {
$photo = xmlify($photo);
$o .= "<$tag>\r\n";
- $o .= "<name>$name</name>\r\n";
- $o .= "<uri>$uri</uri>\r\n";
- $o .= '<link rel="photo" type="' . $type . '" media:width="' . $w . '" media:height="' . $h . '" href="' . $photo . '" />' . "\r\n";
- $o .= '<link rel="avatar" type="' . $type . '" media:width="' . $w . '" media:height="' . $h . '" href="' . $photo . '" />' . "\r\n";
+ $o .= " <id>$uri</id>\r\n";
+ $o .= " <name>$nick</name>\r\n";
+ $o .= " <uri>$uri</uri>\r\n";
+ $o .= ' <link rel="photo" type="' . $type . '" media:width="' . $w . '" media:height="' . $h . '" href="' . $photo . '" />' . "\r\n";
+ $o .= ' <link rel="avatar" type="' . $type . '" media:width="' . $w . '" media:height="' . $h . '" href="' . $photo . '" />' . "\r\n";
+ $o .= ' <poco:preferredUsername>' . $nick . '</poco:preferredUsername>' . "\r\n";
+ $o .= ' <poco:displayName>' . $name . '</poco:displayName>' . "\r\n";
call_hooks('atom_author', $o);
@@ -1160,7 +1272,20 @@ function atom_author($tag,$name,$uri,$h,$w,$type,$photo) {
return $o;
}
-function atom_entry($item,$type,$author,$owner,$comment = false,$cid = 0) {
+/**
+ * @brief Create an item for the Atom feed.
+ *
+ * @see get_feed_for()
+ *
+ * @param array $item
+ * @param string $type
+ * @param array $author
+ * @param array $owner
+ * @param string $comment default false
+ * @param number $cid default 0
+ * @return void|string
+ */
+function atom_entry($item, $type, $author, $owner, $comment = false, $cid = 0) {
if(! $item['parent'])
return;
@@ -1168,7 +1293,6 @@ function atom_entry($item,$type,$author,$owner,$comment = false,$cid = 0) {
if($item['deleted'])
return '<at:deleted-entry ref="' . xmlify($item['mid']) . '" when="' . xmlify(datetime_convert('UTC','UTC',$item['edited'] . '+00:00',ATOM_TIME)) . '" />' . "\r\n";
-
create_export_photo_body($item);
if($item['allow_cid'] || $item['allow_gid'] || $item['deny_cid'] || $item['deny_gid'])
@@ -1178,22 +1302,26 @@ function atom_entry($item,$type,$author,$owner,$comment = false,$cid = 0) {
$o = "\r\n\r\n<entry>\r\n";
- if(is_array($author))
- $o .= atom_author('author',$author['xchan_name'],$author['xchan_url'],80,80,$author['xchan_photo_mimetype'],$author['xchan_photo_m']);
- else
- $o .= atom_author('author',$item['author']['xchan_name'],$item['author']['xchan_url'],80,80,$item['author']['xchan_photo_mimetype'], $item['author']['xchan_photo_m']);
+ if(is_array($author)) {
+ $reddress = substr($author['xchan_addr'],0,strpos($author['xchan_addr'],'@'));
+ $o .= atom_author('author',$reddress,$author['xchan_name'],$author['xchan_url'],80,80,$author['xchan_photo_mimetype'],$author['xchan_photo_m']);
+ }
+ else {
+ $reddress = substr($item['author']['xchan_addr'],0,strpos($item['author']['xchan_addr'],'@'));
+ $o .= atom_author('author',$reddress,$item['author']['xchan_name'],$item['author']['xchan_url'],80,80,$item['author']['xchan_photo_mimetype'], $item['author']['xchan_photo_m']);
+ }
- $o .= atom_author('zot:owner',$item['owner']['xchan_name'],$item['owner']['xchan_url'],80,80,$item['owner']['xchan_photo_mimetype'],$item['owner']['xchan_photo_m']);
+ $reddress = substr($item['owner']['xchan_addr'],0,strpos($item['owner']['xchan_addr'],'@'));
+ $o .= atom_author('zot:owner',$reddress,$item['owner']['xchan_name'],$item['owner']['xchan_url'],80,80,$item['owner']['xchan_photo_mimetype'],$item['owner']['xchan_photo_m']);
if(($item['parent'] != $item['id']) || ($item['parent_mid'] !== $item['mid']) || (($item['thr_parent'] !== '') && ($item['thr_parent'] !== $item['mid']))) {
$parent_item = (($item['thr_parent']) ? $item['thr_parent'] : $item['parent_mid']);
$o .= '<thr:in-reply-to ref="' . 'X-ZOT:' . xmlify($parent_item) . '" type="text/html" href="' . xmlify($item['plink']) . '" />' . "\r\n";
-
}
if(activity_match($item['obj_type'],ACTIVITY_OBJ_EVENT) && activity_match($item['verb'],ACTIVITY_POST)) {
$obj = ((is_array($item['obj'])) ? $item['obj'] : json_decode($item['obj'],true));
-
+
$o .= '<title>' . xmlify($item['title']) . '</title>' . "\r\n";
$o .= '<summary xmlns="urn:ietf:params:xml:ns:xcal">' . xmlify(bbcode($obj['title'])) . '</summary>' . "\r\n";
$o .= '<dtstart xmlns="urn:ietf:params:xml:ns:xcal">' . datetime_convert('UTC','UTC', $obj['dtstart'],'Ymd\\THis' . (($obj['adjust']) ? '\\Z' : '')) . '</dtstart>' . "\r\n";
@@ -1231,13 +1359,13 @@ function atom_entry($item,$type,$author,$owner,$comment = false,$cid = 0) {
$actobj = construct_activity_object($item);
if(strlen($actobj))
$o .= $actobj;
+
$actarg = construct_activity_target($item);
if(strlen($actarg))
$o .= $actarg;
-
if($item['attach']) {
- $enclosures = json_decode($item['attach'],true);
+ $enclosures = json_decode($item['attach'], true);
if($enclosures) {
foreach($enclosures as $enc) {
$o .= '<link rel="enclosure" '
@@ -1252,7 +1380,7 @@ function atom_entry($item,$type,$author,$owner,$comment = false,$cid = 0) {
if($item['term']) {
foreach($item['term'] as $term) {
$scheme = '';
- $label = '';
+ $label = '';
switch($term['ttype']) {
case TERM_UNKNOWN:
$scheme = NAMESPACE_ZOT . '/term/unknown';
@@ -1283,34 +1411,46 @@ function atom_entry($item,$type,$author,$owner,$comment = false,$cid = 0) {
$o .= '</entry>' . "\r\n";
- $x = [
- 'item' => $item,
- 'type' => $type,
- 'author' => $author,
- 'owner' => $owner,
- 'comment' => $comment,
- 'abook_id' => $cid,
- 'entry' => $o
+ // build array to pass to hook
+ $x = [
+ 'item' => $item,
+ 'type' => $type,
+ 'author' => $author,
+ 'owner' => $owner,
+ 'comment' => $comment,
+ 'abook_id' => $cid,
+ 'entry' => $o
];
-
call_hooks('atom_entry', $x);
return $x['entry'];
}
-
+/**
+ * @brief
+ *
+ * @param array $items
+ * @return array
+ */
function gen_asld($items) {
$ret = array();
if(! $items)
return $ret;
+
foreach($items as $item) {
$ret[] = i2asld($item);
}
+
return $ret;
}
-
+/**
+ * @brief
+ *
+ * @param array $i
+ * @return array
+ */
function i2asld($i) {
if(! $i)
@@ -1340,12 +1480,9 @@ function i2asld($i) {
if($i['obj_type'] === ACTIVITY_OBJ_NOTE)
$ret['object'] = asencode_note($i);
-
$ret['actor'] = asencode_person($i['author']);
-
return $ret;
-
}
function asencode_note($i) {
@@ -1356,6 +1493,7 @@ function asencode_note($i) {
$ret['@id'] = $i['plink'];
if($i['title'])
$ret['title'] = bbcode($i['title']);
+
$ret['content'] = bbcode($i['body']);
$ret['zot:owner'] = asencode_person($i['owner']);
$ret['published'] = datetime_convert('UTC','UTC',$i['created'],ATOM_TIME);
diff --git a/include/follow.php b/include/follow.php
index 751d86db1..0d7c16aa3 100644
--- a/include/follow.php
+++ b/include/follow.php
@@ -49,7 +49,7 @@ function new_contact($uid,$url,$channel,$interactive = false, $confirm = false)
$arr = array('url' => $url, 'channel' => array());
- call_hooks('follow', $arr);
+ call_hooks('follow_init', $arr);
if($arr['channel']['success'])
$ret = $arr['channel'];
diff --git a/include/help.php b/include/help.php
index 6e779f000..e4725575d 100644
--- a/include/help.php
+++ b/include/help.php
@@ -1,5 +1,7 @@
<?php
+use \Michelf\MarkdownExtra;
+
/**
* @brief
*
@@ -15,7 +17,7 @@ function get_help_content($tocpath = false) {
$text = '';
$path = (($tocpath !== false) ? $tocpath : '');
-
+
if($tocpath === false && argc() > 1) {
$path = '';
for($x = 1; $x < argc(); $x ++) {
@@ -55,7 +57,7 @@ function get_help_content($tocpath = false) {
if(! $text) {
$doctype = 'bbcode';
$text = load_doc_file('doc/main.bb');
- goaway('/help/about/about_hubzilla');
+ goaway('/help/about/about_hubzilla');
\App::$page['title'] = t('Help');
}
@@ -69,12 +71,11 @@ function get_help_content($tocpath = false) {
}
if($doctype === 'html')
- $content = parseIdentityAwareHTML($text);
- if($doctype === 'markdown') {
- require_once('library/markdown.php');
+ $content = parseIdentityAwareHTML($text);
+ if($doctype === 'markdown') {
# escape #include tags
$text = preg_replace('/#include/ism', '%%include', $text);
- $content = Markdown($text);
+ $content = MarkdownExtra::defaultTransform($text);
$content = preg_replace('/%%include/ism', '#include', $content);
}
if($doctype === 'bbcode') {
@@ -99,8 +100,7 @@ function preg_callback_help_include($matches) {
$include = str_replace(' target="_blank"','',$include);
}
elseif(preg_match('/\.md$/', $matches[1])) {
- require_once('library/markdown.php');
- $include = Markdown($include);
+ $include = MarkdownExtra::defaultTransform($include);
}
return $include;
}
diff --git a/include/hubloc.php b/include/hubloc.php
index e17be028c..0daa5908c 100644
--- a/include/hubloc.php
+++ b/include/hubloc.php
@@ -1,6 +1,17 @@
-<?php /** @file */
-
-
+<?php
+/**
+ * @file include/hubloc.php
+ * @brief Hubloc related functions.
+ */
+
+/**
+ * @brief Create an array for hubloc table and insert record.
+ *
+ * Creates an assoziative array which will be inserted into the hubloc table.
+ *
+ * @param array $arr An assoziative array with hubloc values
+ * @return boolean|PDOStatement
+ */
function hubloc_store_lowlevel($arr) {
$store = [
@@ -25,12 +36,38 @@ function hubloc_store_lowlevel($arr) {
'hubloc_deleted' => ((array_key_exists('hubloc_deleted',$arr)) ? $arr['hubloc_deleted'] : 0)
];
- return create_table_from_array('hubloc',$store);
+ return create_table_from_array('hubloc', $store);
+}
+
+function site_store_lowlevel($arr) {
+ $store = [
+ 'site_url' => ((array_key_exists('site_url',$arr)) ? $arr['site_url'] : ''),
+ 'site_access' => ((array_key_exists('site_access',$arr)) ? $arr['site_access'] : 0),
+ 'site_flags' => ((array_key_exists('site_flags',$arr)) ? $arr['site_flags'] : 0),
+ 'site_update' => ((array_key_exists('site_update',$arr)) ? $arr['site_update'] : NULL_DATE),
+ 'site_pull' => ((array_key_exists('site_pull',$arr)) ? $arr['site_pull'] : NULL_DATE),
+ 'site_sync' => ((array_key_exists('site_sync',$arr)) ? $arr['site_sync'] : NULL_DATE),
+ 'site_directory' => ((array_key_exists('site_directory',$arr)) ? $arr['site_directory'] : ''),
+ 'site_register' => ((array_key_exists('site_register',$arr)) ? $arr['site_register'] : 0),
+ 'site_sellpage' => ((array_key_exists('site_sellpage',$arr)) ? $arr['site_sellpage'] : ''),
+ 'site_location' => ((array_key_exists('site_location',$arr)) ? $arr['site_location'] : ''),
+ 'site_realm' => ((array_key_exists('site_realm',$arr)) ? $arr['site_realm'] : ''),
+ 'site_valid' => ((array_key_exists('site_valid',$arr)) ? $arr['site_valid'] : 0),
+ 'site_dead' => ((array_key_exists('site_dead',$arr)) ? $arr['site_dead'] : 0),
+ 'site_type' => ((array_key_exists('site_type',$arr)) ? $arr['site_type'] : 0),
+ 'site_project' => ((array_key_exists('site_project',$arr)) ? $arr['site_project'] : ''),
+ 'site_version' => ((array_key_exists('site_version',$arr)) ? $arr['site_version'] : ''),
+ 'site_crypto' => ((array_key_exists('site_crypto',$arr)) ? $arr['site_crypto'] : '')
+ ];
+
+ return create_table_from_array('site', $store);
}
+
+
function prune_hub_reinstalls() {
$r = q("select site_url from site where site_type = %d",
@@ -45,9 +82,8 @@ function prune_hub_reinstalls() {
// see if this url has more than one sitekey, indicating it has been re-installed.
if(count($x) > 1) {
-
- $d1 = datetime_convert('UTC','UTC',$x[0]['c']);
- $d2 = datetime_convert('UTC','UTC','now - 3 days');
+ $d1 = datetime_convert('UTC', 'UTC', $x[0]['c']);
+ $d2 = datetime_convert('UTC', 'UTC', 'now - 3 days');
// allow some slop period, say 3 days - just in case this is a glitch or transient occurrence
// Then remove any hublocs pointing to the oldest entry.
@@ -63,18 +99,22 @@ function prune_hub_reinstalls() {
}
}
-function remove_obsolete_hublocs() {
-
- logger('remove_obsolete_hublocs',LOGGER_DEBUG);
- // Get rid of any hublocs which are ours but aren't valid anymore -
- // e.g. they point to a different and perhaps transient URL that we aren't using.
+/**
+ * @brief Remove obsolete hublocs.
+ *
+ * Get rid of any hublocs which are ours but aren't valid anymore -
+ * e.g. they point to a different and perhaps transient URL that we aren't using.
+ *
+ * I need to stress that this shouldn't happen. fix_system_urls() fixes hublocs
+ * when it discovers the URL has changed. So it's unclear how we could end up
+ * with URLs pointing to the old site name. But it happens. This may be an artifact
+ * of an old bug or maybe a regression in some newer code. In any event, they
+ * mess up communications and we have to take action if we find any.
+ */
+function remove_obsolete_hublocs() {
- // I need to stress that this shouldn't happen. fix_system_urls() fixes hublocs
- // when it discovers the URL has changed. So it's unclear how we could end up
- // with URLs pointing to the old site name. But it happens. This may be an artifact
- // of an old bug or maybe a regression in some newer code. In any event, they
- // mess up communications and we have to take action if we find any.
+ logger('remove_obsolete_hublocs', LOGGER_DEBUG);
// First make sure we have any hublocs (at all) with this URL and sitekey.
// We don't want to perform this operation while somebody is in the process
@@ -82,27 +122,25 @@ function remove_obsolete_hublocs() {
$r = q("select hubloc_id from hubloc where hubloc_url = '%s' and hubloc_sitekey = '%s'",
dbesc(z_root()),
- dbesc(get_config('system','pubkey'))
+ dbesc(get_config('system', 'pubkey'))
);
if((! $r) || (! count($r)))
return;
- $channels = array();
-
// Good. We have at least one *valid* hubloc.
// Do we have any invalid ones?
$r = q("select hubloc_id from hubloc where hubloc_sitekey = '%s' and hubloc_url != '%s'",
- dbesc(get_config('system','pubkey')),
+ dbesc(get_config('system', 'pubkey')),
dbesc(z_root())
);
$p = q("select hubloc_id from hubloc where hubloc_sitekey != '%s' and hubloc_url = '%s'",
- dbesc(get_config('system','pubkey')),
+ dbesc(get_config('system', 'pubkey')),
dbesc(z_root())
);
if(is_array($r) && is_array($p))
- $r = array_merge($r,$p);
+ $r = array_merge($r, $p);
if(! $r)
return;
@@ -111,8 +149,8 @@ function remove_obsolete_hublocs() {
logger('remove_obsolete_hublocs: removing ' . count($r) . ' hublocs.');
- $interval = ((get_config('system','delivery_interval') !== false)
- ? intval(get_config('system','delivery_interval')) : 2 );
+ $interval = ((get_config('system', 'delivery_interval') !== false)
+ ? intval(get_config('system', 'delivery_interval')) : 2 );
foreach($r as $rr) {
q("update hubloc set hubloc_deleted = 1 where hubloc_id = %d",
@@ -120,10 +158,10 @@ function remove_obsolete_hublocs() {
);
$x = q("select channel_id from channel where channel_hash = '%s' limit 1",
- dbesc($rr['hubloc_hash'])
+ dbesc($rr['hubloc_hash'])
);
if($x) {
- Zotlabs\Daemon\Master::Summon(array('Notifier','location',$x[0]['channel_id']));
+ Zotlabs\Daemon\Master::Summon(array('Notifier', 'location', $x[0]['channel_id']));
if($interval)
@time_sleep_until(microtime(true) + (float) $interval);
}
@@ -131,8 +169,15 @@ function remove_obsolete_hublocs() {
}
-// This actually changes other structures to match the given (presumably current) hubloc primary selection
-
+/**
+ * @brief Change primary hubloc.
+ *
+ * This actually changes other structures to match the given (presumably current)
+ * hubloc primary selection.
+ *
+ * @param array $hubloc
+ * @return boolean
+ */
function hubloc_change_primary($hubloc) {
if(! is_array($hubloc)) {
@@ -170,7 +215,7 @@ function hubloc_change_primary($hubloc) {
dbesc($hubloc['hubloc_hash'])
);
if(! $r) {
- logger('xchan not found');
+ logger('xchan not found');
return false;
}
if($r[0]['xchan_addr'] === $hubloc['hubloc_addr']) {
@@ -179,7 +224,7 @@ function hubloc_change_primary($hubloc) {
}
$url = $hubloc['hubloc_url'];
- $lwebbie = substr($hubloc['hubloc_addr'],0,strpos($hubloc['hubloc_addr'],'@'));
+ $lwebbie = substr($hubloc['hubloc_addr'], 0, strpos($hubloc['hubloc_addr'], '@'));
$r = q("update xchan set xchan_addr = '%s', xchan_url = '%s', xchan_follow = '%s', xchan_connurl = '%s' where xchan_hash = '%s'",
dbesc($hubloc['hubloc_addr']),
@@ -191,14 +236,19 @@ function hubloc_change_primary($hubloc) {
if(! $r)
logger('xchan_update failed.');
- logger('primary hubloc changed.' . print_r($hubloc,true),LOGGER_DEBUG);
+ logger('primary hubloc changed.' . print_r($hubloc, true), LOGGER_DEBUG);
return true;
-
}
-// We use the post url to distinguish between http and https hublocs.
-// The https might be alive, and the http dead.
+/**
+ * @brief Mark a hubloc as down.
+ *
+ * We use the post url to distinguish between http and https hublocs.
+ * The https might be alive, and the http dead.
+ *
+ * @param string $posturl Hubloc callback url which to disable
+ */
function hubloc_mark_as_down($posturl) {
$r = q("update hubloc set hubloc_status = ( hubloc_status | %d ) where hubloc_callback = '%s'",
intval(HUBLOC_OFFLINE),
@@ -208,22 +258,21 @@ function hubloc_mark_as_down($posturl) {
-
function ping_site($url) {
$ret = array('success' => false);
$sys = get_sys_channel();
- $m = zot_build_packet($sys,'ping');
- $r = zot_zot($url . '/post',$m);
+ $m = zot_build_packet($sys, 'ping');
+ $r = zot_zot($url . '/post', $m);
if(! $r['success']) {
$ret['message'] = 'no answer from ' . $url;
return $ret;
}
- $packet_result = json_decode($r['body'],true);
+ $packet_result = json_decode($r['body'], true);
if(! $packet_result['success']) {
- $ret['message'] = 'packet failure from ' . $url;
+ $ret['message'] = 'packet failure from ' . $url;
return $ret;
}
diff --git a/include/import.php b/include/import.php
index eab47e2ee..3f4d84765 100644
--- a/include/import.php
+++ b/include/import.php
@@ -1,8 +1,19 @@
<?php
+use Zotlabs\Lib\IConfig;
+
require_once('include/menu.php');
require_once('include/perm_upgrade.php');
+
+/**
+ * @brief Import a channel.
+ *
+ * @param array $channel
+ * @param int $account_id
+ * @param int $seize
+ * @return boolean|array
+ */
function import_channel($channel, $account_id, $seize) {
if(! array_key_exists('channel_system',$channel)) {
@@ -51,7 +62,7 @@ function import_channel($channel, $account_id, $seize) {
notice( t('Unable to create a unique channel address. Import failed.') . EOL);
return false;
}
- }
+ }
}
unset($channel['channel_id']);
@@ -66,12 +77,12 @@ function import_channel($channel, $account_id, $seize) {
// remove all the permissions related settings, we will import/upgrade them after the channel
// is created.
- $disallowed = [
- 'channel_id', 'channel_r_stream', 'channel_r_profile', 'channel_r_abook',
- 'channel_r_storage', 'channel_r_pages', 'channel_w_stream', 'channel_w_wall',
- 'channel_w_comment', 'channel_w_mail', 'channel_w_like', 'channel_w_tagwall',
- 'channel_w_chat', 'channel_w_storage', 'channel_w_pages', 'channel_a_republish',
- 'channel_a_delegate', 'perm_limits'
+ $disallowed = [
+ 'channel_id', 'channel_r_stream', 'channel_r_profile', 'channel_r_abook',
+ 'channel_r_storage', 'channel_r_pages', 'channel_w_stream', 'channel_w_wall',
+ 'channel_w_comment', 'channel_w_mail', 'channel_w_like', 'channel_w_tagwall',
+ 'channel_w_chat', 'channel_w_storage', 'channel_w_pages', 'channel_a_republish',
+ 'channel_a_delegate', 'perm_limits', 'channel_password', 'channel_salt'
];
$clean = array();
@@ -87,7 +98,7 @@ function import_channel($channel, $account_id, $seize) {
$r = q("select * from channel where channel_account_id = %d and channel_guid = '%s' limit 1",
intval($account_id),
- $channel['channel_guid'] // Already dbesc'd
+ dbesc($channel['channel_guid'])
);
if(! $r) {
logger('mod_import: channel not found. ' . print_r($channel,true));
@@ -108,24 +119,37 @@ function import_channel($channel, $account_id, $seize) {
set_default_login_identity($account_id,$channel['channel_id'],false);
logger('import step 1');
$_SESSION['import_step'] = 1;
- return $channel;
+ return $channel;
}
-function import_config($channel,$configs) {
+/**
+ * @brief Import pconfig for channel.
+ *
+ * @param array $channel
+ * @param array $configs
+ */
+function import_config($channel, $configs) {
if($channel && $configs) {
foreach($configs as $config) {
unset($config['id']);
$config['uid'] = $channel['channel_id'];
- create_table_from_array('pconfig',$config);
+
+ create_table_from_array('pconfig', $config);
}
+
load_pconfig($channel['channel_id']);
- }
+ }
}
-
-function import_profiles($channel,$profiles) {
+/**
+ * @brief Import profiles.
+ *
+ * @param array $channel
+ * @param array $profiles
+ */
+function import_profiles($channel, $profiles) {
if($channel && $profiles) {
foreach($profiles as $profile) {
@@ -138,19 +162,29 @@ function import_profiles($channel,$profiles) {
convert_oldfields($profile,'with','partner');
convert_oldfields($profile,'work','employment');
+ /**
+ * @TODO we are going to reset all profile photos to the original
+ * somebody will have to fix this later and put all the applicable
+ * photos into the export.
+ */
- // we are going to reset all profile photos to the original
- // somebody will have to fix this later and put all the applicable photos into the export
-
$profile['photo'] = z_root() . '/photo/profile/l/' . $channel['channel_id'];
$profile['thumb'] = z_root() . '/photo/profile/m/' . $channel['channel_id'];
- create_table_from_array('profile',$profile);
+
+ create_table_from_array('profile', $profile);
}
}
}
-
-function import_hublocs($channel,$hublocs,$seize,$moving = false) {
+/**
+ * @brief Import hublocs.
+ *
+ * @param array $channel
+ * @param array $hublocs
+ * @param unknown $seize
+ * @param boolean $moving (optional) default false
+ */
+function import_hublocs($channel, $hublocs, $seize, $moving = false) {
if($channel && $hublocs) {
foreach($hublocs as $hubloc) {
@@ -162,45 +196,49 @@ function import_hublocs($channel,$hublocs,$seize,$moving = false) {
}
if(! array_key_exists('hubloc_primary',$hubloc)) {
- $hubloc['hubloc_primary'] = (($hubloc['hubloc_flags'] & 0x0001) ? 1 : 0);
- $hubloc['hubloc_orphancheck'] = (($hubloc['hubloc_flags'] & 0x0004) ? 1 : 0);
- $hubloc['hubloc_error'] = (($hubloc['hubloc_status'] & 0x0003) ? 1 : 0);
- $hubloc['hubloc_deleted'] = (($hubloc['hubloc_flags'] & 0x1000) ? 1 : 0);
+ $hubloc['hubloc_primary'] = (($hubloc['hubloc_flags'] & 0x0001) ? 1 : 0);
+ $hubloc['hubloc_orphancheck'] = (($hubloc['hubloc_flags'] & 0x0004) ? 1 : 0);
+ $hubloc['hubloc_error'] = (($hubloc['hubloc_status'] & 0x0003) ? 1 : 0);
+ $hubloc['hubloc_deleted'] = (($hubloc['hubloc_flags'] & 0x1000) ? 1 : 0);
}
if($moving && $hubloc['hubloc_hash'] === $channel['channel_hash'] && $hubloc['hubloc_url'] !== z_root()) {
$hubloc['hubloc_deleted'] = 1;
}
- $arr = array(
- 'guid' => $hubloc['hubloc_guid'],
+ $arr = [
+ 'guid' => $hubloc['hubloc_guid'],
'guid_sig' => $hubloc['hubloc_guid_sig'],
- 'url' => $hubloc['hubloc_url'],
- 'url_sig' => $hubloc['hubloc_url_sig'],
- 'sitekey' => ((array_key_exists('hubloc_sitekey',$hubloc)) ? $hubloc['hubloc_sitekey'] : '')
- );
+ 'url' => $hubloc['hubloc_url'],
+ 'url_sig' => $hubloc['hubloc_url_sig'],
+ 'sitekey' => ((array_key_exists('hubloc_sitekey',$hubloc)) ? $hubloc['hubloc_sitekey'] : '')
+ ];
+
if(($hubloc['hubloc_hash'] === $channel['channel_hash']) && intval($hubloc['hubloc_primary']) && ($seize))
$hubloc['hubloc_primary'] = 0;
- if(($x = zot_gethub($arr,false)) === false) {
+ if(($x = zot_gethub($arr,false)) === false) {
unset($hubloc['hubloc_id']);
- create_table_from_array('hubloc',$hubloc);
+ create_table_from_array('hubloc', $hubloc);
}
else {
q("UPDATE hubloc set hubloc_primary = %d, hubloc_deleted = %d where hubloc_id = %d",
intval($hubloc['hubloc_primary']),
intval($hubloc['hubloc_deleted']),
intval($x['hubloc_id'])
- );
-
+ );
}
}
}
}
-
-
-function import_objs($channel,$objs) {
+/**
+ * @brief Import things.
+ *
+ * @param array $channel
+ * @param array $objs
+ */
+function import_objs($channel, $objs) {
if($channel && $objs) {
foreach($objs as $obj) {
@@ -215,21 +253,27 @@ function import_objs($channel,$objs) {
$obj['obj_channel'] = $channel['channel_id'];
- if($baseurl && (strpos($obj['obj_url'],$baseurl . '/thing/') !== false)) {
- $obj['obj_url'] = str_replace($baseurl,z_root(),$obj['obj_url']);
+ if($baseurl && (strpos($obj['obj_url'], $baseurl . '/thing/') !== false)) {
+ $obj['obj_url'] = str_replace($baseurl, z_root(), $obj['obj_url']);
}
if($obj['obj_imgurl']) {
- $x = import_xchan_photo($obj['obj_imgurl'],$channel['channel_hash'],true);
+ $x = import_xchan_photo($obj['obj_imgurl'], $channel['channel_hash'], true);
$obj['obj_imgurl'] = $x[0];
}
- create_table_from_array('obj',$obj);
+ create_table_from_array('obj', $obj);
}
}
}
-function sync_objs($channel,$objs) {
+/**
+ * @brief Import things.
+ *
+ * @param array $channel
+ * @param array $objs
+ */
+function sync_objs($channel, $objs) {
if($channel && $objs) {
foreach($objs as $obj) {
@@ -252,8 +296,8 @@ function sync_objs($channel,$objs) {
$obj['obj_channel'] = $channel['channel_id'];
- if($baseurl && (strpos($obj['obj_url'],$baseurl . '/thing/') !== false)) {
- $obj['obj_url'] = str_replace($baseurl,z_root(),$obj['obj_url']);
+ if($baseurl && (strpos($obj['obj_url'], $baseurl . '/thing/') !== false)) {
+ $obj['obj_url'] = str_replace($baseurl, z_root(), $obj['obj_url']);
}
$exists = false;
@@ -270,12 +314,12 @@ function sync_objs($channel,$objs) {
}
if($obj['obj_imgurl']) {
- $x = import_xchan_photo($obj['obj_imgurl'],$channel['channel_hash'],true);
+ $x = import_xchan_photo($obj['obj_imgurl'], $channel['channel_hash'], true);
$obj['obj_imgurl'] = $x[0];
}
$hash = $obj['obj_obj'];
-
+
if($exists) {
unset($obj['obj_obj']);
foreach($obj as $k => $v) {
@@ -287,23 +331,25 @@ function sync_objs($channel,$objs) {
);
}
}
- else {
- create_table_from_array('obj',$obj);
+ else {
+ create_table_from_array('obj', $obj);
}
}
}
}
-
-
-
-
-function import_apps($channel,$apps) {
+/**
+ * @brief Import apps.
+ *
+ * @param array $channel
+ * @param array $apps
+ */
+function import_apps($channel, $apps) {
if($channel && $apps) {
foreach($apps as $app) {
- $term = ((array_key_exists('term',$app) && is_array($app['term'])) ? $app['term'] : null);
+ $term = ((array_key_exists('term',$app) && is_array($app['term'])) ? $app['term'] : null);
unset($app['id']);
unset($app['app_channel']);
@@ -312,13 +358,13 @@ function import_apps($channel,$apps) {
$app['app_channel'] = $channel['channel_id'];
if($app['app_photo']) {
- $x = import_xchan_photo($app['app_photo'],$channel['channel_hash'],true);
+ $x = import_xchan_photo($app['app_photo'], $channel['channel_hash'], true);
$app['app_photo'] = $x[0];
}
$hash = $app['app_id'];
- create_table_from_array('app',$app);
+ create_table_from_array('app', $app);
if($term) {
$x = q("select * from app where app_id = '%s' and app_channel = %d limit 1",
@@ -329,20 +375,22 @@ function import_apps($channel,$apps) {
foreach($term as $t) {
if(array_key_exists('type',$t))
$t['ttype'] = $t['type'];
+
store_item_tag($channel['channel_id'],$x[0]['id'],TERM_OBJ_APP,$t['ttype'],escape_tags($t['term']),escape_tags($t['url']));
}
}
}
-
-
-
}
}
}
-
-
-function sync_apps($channel,$apps) {
+/**
+ * @brief Sync apps.
+ *
+ * @param array $channel
+ * @param array $apps
+ */
+function sync_apps($channel, $apps) {
if($channel && $apps) {
foreach($apps as $app) {
@@ -357,20 +405,20 @@ function sync_apps($channel,$apps) {
if($x) {
$exists = $x[0];
}
-
+
if(array_key_exists('app_deleted',$app) && $app['app_deleted'] && $app['app_id']) {
- q("delete from app where app_id = '%s' and app_channel = %d",
- dbesc($app['app_id']),
- intval($channel['channel_id'])
- );
+ q("delete from app where app_id = '%s' and app_channel = %d",
+ dbesc($app['app_id']),
+ intval($channel['channel_id'])
+ );
if($exists) {
q("delete from term where otype = %d and oid = %d",
intval(TERM_OBJ_APP),
intval($exists['id'])
- );
+ );
}
- continue;
- }
+ continue;
+ }
unset($app['id']);
unset($app['app_channel']);
@@ -380,7 +428,7 @@ function sync_apps($channel,$apps) {
q("delete from term where otype = %d and oid = %d",
intval(TERM_OBJ_APP),
intval($exists['id'])
- );
+ );
}
if((! $app['app_created']) || ($app['app_created'] <= NULL_DATE))
@@ -441,9 +489,13 @@ function sync_apps($channel,$apps) {
}
}
-
-
-function import_chatrooms($channel,$chatrooms) {
+/**
+ * @brief Import chatrooms.
+ *
+ * @param array $channel
+ * @param array $chatrooms
+ */
+function import_chatrooms($channel, $chatrooms) {
if($channel && $chatrooms) {
foreach($chatrooms as $chatroom) {
@@ -458,14 +510,18 @@ function import_chatrooms($channel,$chatrooms) {
$chatroom['cr_aid'] = $channel['channel_account_id'];
$chatroom['cr_uid'] = $channel['channel_id'];
- create_table_from_array('chatroom',$chatroom);
+ create_table_from_array('chatroom', $chatroom);
}
}
}
-
-
-function sync_chatrooms($channel,$chatrooms) {
+/**
+ * @brief Sync chatrooms.
+ *
+ * @param array $channel
+ * @param array $chatrooms
+ */
+function sync_chatrooms($channel, $chatrooms) {
if($channel && $chatrooms) {
foreach($chatrooms as $chatroom) {
@@ -474,13 +530,12 @@ function sync_chatrooms($channel,$chatrooms) {
continue;
if(array_key_exists('cr_deleted',$chatroom) && $chatroom['cr_deleted']) {
- q("delete from chatroom where cr_name = '%s' and cr_uid = %d",
- dbesc($chatroom['cr_name']),
- intval($channel['channel_id'])
- );
- continue;
- }
-
+ q("delete from chatroom where cr_name = '%s' and cr_uid = %d",
+ dbesc($chatroom['cr_name']),
+ intval($channel['channel_id'])
+ );
+ continue;
+ }
unset($chatroom['cr_id']);
unset($chatroom['cr_aid']);
@@ -503,6 +558,7 @@ function sync_chatrooms($channel,$chatrooms) {
if($x) {
if($x[0]['cr_edited'] >= $chatroom['cr_edited'])
continue;
+
$exists = true;
}
$name = $chatroom['cr_name'];
@@ -518,29 +574,28 @@ function sync_chatrooms($channel,$chatrooms) {
}
}
else {
- create_table_from_array('chatroom',$chatroom);
+ create_table_from_array('chatroom', $chatroom);
}
}
}
}
-
-function import_items($channel,$items,$sync = false,$relocate = null) {
+/**
+ * @brief Import items to channel.
+ *
+ * @param array $channel where to import to
+ * @param array $items
+ * @param boolean $sync default false
+ * @param array $relocate default null
+ */
+function import_items($channel, $items, $sync = false, $relocate = null) {
if($channel && $items) {
- $allow_code = false;
- $r = q("select account_id, account_roles, channel_pageflags from account left join channel on channel_account_id = account_id
- where channel_id = %d limit 1",
- intval($channel['channel_id'])
- );
- if($r) {
- if(($r[0]['account_roles'] & ACCOUNT_ROLE_ALLOWCODE) || ($r[0]['channel_pageflags'] & PAGE_ALLOWCODE)) {
- $allow_code = true;
- }
- }
- $deliver = false; // Don't deliver any messages or notifications when importing
+ $allow_code = channel_codeallowed($channel['channel_id']);
+
+ $deliver = false; // Don't deliver any messages or notifications when importing
foreach($items as $i) {
$item_result = false;
@@ -558,14 +613,14 @@ function import_items($channel,$items,$sync = false,$relocate = null) {
);
if($r) {
- // flags may have changed and we are probably relocating the post,
+ // flags may have changed and we are probably relocating the post,
// so force an update even if we have the same timestamp
if($item['edited'] >= $r[0]['edited']) {
$item['id'] = $r[0]['id'];
$item['uid'] = $channel['channel_id'];
$item_result = item_store_update($item,$allow_code,$deliver);
- }
+ }
}
else {
$item['aid'] = $channel['channel_account_id'];
@@ -587,14 +642,26 @@ function import_items($channel,$items,$sync = false,$relocate = null) {
}
}
-
-function sync_items($channel,$items,$relocate = null) {
- import_items($channel,$items,true,$relocate);
+/**
+ * @brief Sync items to channel.
+ *
+ * @see import_items
+ *
+ * @param array $channel where to import to
+ * @param array $items
+ * @param array $relocate default null
+ */
+function sync_items($channel, $items, $relocate = null) {
+ import_items($channel, $items, true, $relocate);
}
-
-
-function import_item_ids($channel,$itemids) {
+/**
+ * @brief
+ *
+ * @param array $channel A channel array.
+ * @param array $itemids
+ */
+function import_item_ids($channel, $itemids) {
if($channel && $itemids) {
foreach($itemids as $i) {
$r = q("select id from item where mid = '%s' and uid = %d limit 1",
@@ -603,20 +670,26 @@ function import_item_ids($channel,$itemids) {
);
if(! $r)
continue;
- $z = q("select * from iconfig where iconfig.cat = 'system' and iconfig.k = '%s'
+ $z = q("select * from iconfig where iconfig.cat = 'system' and iconfig.k = '%s'
and iconfig.v = '%s' and iid = %d limit 1",
dbesc($i['service']),
dbesc($i['sid']),
intval($r[0]['id'])
);
if(! $z) {
- \Zotlabs\Lib\IConfig::Set($r[0]['id'],'system',$i['service'],$i['sid'],true);
+ IConfig::Set($r[0]['id'],'system',$i['service'],$i['sid'],true);
}
}
}
}
-function import_events($channel,$events) {
+/**
+ * @brief Import events.
+ *
+ * @param array $channel
+ * @param array $events
+ */
+function import_events($channel, $events) {
if($channel && $events) {
foreach($events as $event) {
@@ -628,13 +701,18 @@ function import_events($channel,$events) {
convert_oldfields($event,'type','etype');
convert_oldfields($event,'ignore','dismissed');
- create_table_from_array('event',$event);
+ create_table_from_array('event', $event);
}
}
}
-
-function sync_events($channel,$events) {
+/**
+ * @brief Sync events.
+ *
+ * @param array $channel
+ * @param array $events
+ */
+function sync_events($channel, $events) {
if($channel && $events) {
foreach($events as $event) {
@@ -646,7 +724,7 @@ function sync_events($channel,$events) {
$r = q("delete from event where event_hash = '%s' and uid = %d",
dbesc($event['event_hash']),
intval($channel['channel_id'])
- );
+ );
continue;
}
@@ -659,7 +737,6 @@ function sync_events($channel,$events) {
convert_oldfields($event,'type','etype');
convert_oldfields($event,'ignore','dismissed');
-
$exists = false;
$x = q("select * from event where event_hash = '%s' and uid = %d limit 1",
@@ -669,6 +746,7 @@ function sync_events($channel,$events) {
if($x) {
if($x[0]['edited'] >= $event['edited'])
continue;
+
$exists = true;
}
@@ -683,15 +761,19 @@ function sync_events($channel,$events) {
}
}
else {
- create_table_from_array('event',$event);
+ create_table_from_array('event', $event);
}
}
}
}
-
-function import_menus($channel,$menus) {
-
+/**
+ * @brief Import menus.
+ *
+ * @param array $channel
+ * @param array $menus
+ */
+function import_menus($channel, $menus) {
if($channel && $menus) {
foreach($menus as $menu) {
@@ -710,7 +792,6 @@ function import_menus($channel,$menus) {
$m['menu_flags'] |= MENU_BOOKMARK;
if(in_array('system',$menu['flags']))
$m['menu_flags'] |= MENU_SYSTEM;
-
}
$menu_id = menu_create($m);
@@ -738,16 +819,19 @@ function import_menus($channel,$menus) {
}
menu_add_item($menu_id,$channel['channel_id'],$mitem);
}
- }
+ }
}
}
}
-
-
}
-
-function sync_menus($channel,$menus) {
+/**
+ * @brief Sync menus.
+ *
+ * @param array $channel
+ * @param array $menus
+ */
+function sync_menus($channel, $menus) {
if($channel && $menus) {
foreach($menus as $menu) {
@@ -804,7 +888,6 @@ function sync_menus($channel,$menus) {
foreach($menu['items'] as $it) {
$mitem = array();
-
$mitem['mitem_link'] = str_replace('[channelurl]',z_root() . '/channel/' . $channel['channel_address'],$it['link']);
$mitem['mitem_link'] = str_replace('[pageurl]',z_root() . '/page/' . $channel['channel_address'],$it['link']);
$mitem['mitem_link'] = str_replace('[cloudurl]',z_root() . '/cloud/' . $channel['channel_address'],$it['link']);
@@ -823,15 +906,19 @@ function sync_menus($channel,$menus) {
}
menu_add_item($menu_id,$channel['channel_id'],$mitem);
}
- }
+ }
}
}
}
}
-
-
-function import_likes($channel,$likes) {
+/**
+ * @brief Import likes.
+ *
+ * @param array $channel
+ * @param array $likes
+ */
+function import_likes($channel, $likes) {
if($channel && $likes) {
foreach($likes as $like) {
if($like['deleted']) {
@@ -844,7 +931,7 @@ function import_likes($channel,$likes) {
);
continue;
}
-
+
unset($like['id']);
unset($like['iid']);
$like['channel_id'] = $channel['channel_id'];
@@ -859,9 +946,9 @@ function import_likes($channel,$likes) {
if($r)
continue;
- create_table_from_array('likes',$like);
+ create_table_from_array('likes', $like);
}
- }
+ }
}
function import_conv($channel,$convs) {
@@ -874,7 +961,7 @@ function import_conv($channel,$convs) {
);
continue;
}
-
+
unset($conv['id']);
$conv['uid'] = $channel['channel_id'];
@@ -886,14 +973,20 @@ function import_conv($channel,$convs) {
);
if($r)
continue;
+
create_table_from_array('conv',$conv);
}
- }
+ }
}
-
-
-function import_mail($channel,$mails,$sync = false) {
+/**
+ * @brief Import mails.
+ *
+ * @param array $channel
+ * @param array $mails
+ * @param boolean $sync (optional) default false
+ */
+function import_mail($channel, $mails, $sync = false) {
if($channel && $mails) {
foreach($mails as $mail) {
if(array_key_exists('flags',$mail) && in_array('deleted',$mail['flags'])) {
@@ -922,14 +1015,27 @@ function import_mail($channel,$mails,$sync = false) {
Zotlabs\Daemon\Master::Summon(array('Notifier','single_mail',$mail_id));
}
}
- }
+ }
}
-function sync_mail($channel,$mails) {
- import_mail($channel,$mails,true);
+/**
+ * @brief Synchronise mails.
+ *
+ * @see import_mail
+ * @param array $channel
+ * @param array $mails
+ */
+function sync_mail($channel, $mails) {
+ import_mail($channel, $mails, true);
}
-function sync_files($channel,$files) {
+/**
+ * @brief Synchronise files.
+ *
+ * @param array $channel
+ * @param array $files
+ */
+function sync_files($channel, $files) {
require_once('include/attach.php');
@@ -943,7 +1049,7 @@ function sync_files($channel,$files) {
$original_channel = $f['original_channel'];
if(! ($fetch_url && $original_channel))
- continue;
+ continue;
if($f['attach']) {
$attachment_stored = false;
@@ -973,12 +1079,11 @@ function sync_files($channel,$files) {
$att['aid'] = $channel['channel_account_id'];
$att['uid'] = $channel['channel_id'];
-
- // check for duplicate folder names with the same parent.
+ // check for duplicate folder names with the same parent.
// If we have a duplicate that doesn't match this hash value
- // change the name so that the contents won't be "covered over"
- // by the existing directory. Use the same logic we use for
- // duplicate files.
+ // change the name so that the contents won't be "covered over"
+ // by the existing directory. Use the same logic we use for
+ // duplicate files.
if(strpos($att['filename'],'.') !== false) {
$basename = substr($att['filename'],0,strrpos($att['filename'],'.'));
@@ -1009,7 +1114,7 @@ function sync_files($channel,$files) {
}
if($found)
$x++;
- }
+ }
while($found);
$att['filename'] = $basename . '(' . $x . ')' . $ext;
}
@@ -1018,30 +1123,31 @@ function sync_files($channel,$files) {
// end duplicate detection
-// @fixme - update attachment structures if they are modified rather than created
+ /// @FIXME update attachment structures if they are modified rather than created
$att['content'] = $newfname;
// Note: we use $att['hash'] below after it has been escaped to
- // fetch the file contents.
+ // fetch the file contents.
// If the hash ever contains any escapable chars this could cause
- // problems. Currently it does not.
+ // problems. Currently it does not.
- // @TODO implement os_path
+ /// @TODO implement os_path
if(!isset($att['os_path']))
$att['os_path'] = '';
-
if($attach_exists) {
logger('sync_files attach exists: ' . print_r($att,true), LOGGER_DEBUG);
if(! dbesc_array($att))
continue;
+
$str = '';
- foreach($att as $k => $v) {
- if($str)
- $str .= ",";
- $str .= " " . TQUOT . $k . TQUOT . " = '" . $v . "' ";
- }
+ foreach($att as $k => $v) {
+ if($str)
+ $str .= ",";
+
+ $str .= " " . TQUOT . $k . TQUOT . " = '" . $v . "' ";
+ }
$r = dbq("update attach set " . $str . " where id = " . intval($attach_id) );
}
else {
@@ -1049,7 +1155,6 @@ function sync_files($channel,$files) {
create_table_from_array('attach',$att);
}
-
// is this a directory?
if($att['filetype'] === 'multipart/mixed' && $att['is_dir']) {
@@ -1058,17 +1163,16 @@ function sync_files($channel,$files) {
continue;
}
else {
-
// it's a file
// for the sync version of this algorithm (as opposed to 'offline import')
- // we will fetch the actual file from the source server so it can be
+ // we will fetch the actual file from the source server so it can be
// streamed directly to disk and avoid consuming PHP memory if it's a huge
- // audio/video file or something.
+ // audio/video file or something.
$time = datetime_convert();
- $parr = array('hash' => $channel['channel_hash'],
- 'time' => $time,
+ $parr = array('hash' => $channel['channel_hash'],
+ 'time' => $time,
'resource' => $att['hash'],
'revision' => 0,
'signature' => base64url_encode(rsa_sign($channel['channel_hash'] . '.' . $time, $channel['channel_prvkey']))
@@ -1093,7 +1197,7 @@ function sync_files($channel,$files) {
}
}
if(! $attachment_stored) {
- // @TODO should we queue this and retry or delete everything or what?
+ /// @TODO should we queue this and retry or delete everything or what?
logger('attachment store failed',LOGGER_NORMAL,LOG_ERR);
}
if($f['photo']) {
@@ -1137,7 +1241,6 @@ function sync_files($channel,$files) {
else
$p['content'] = base64_decode($p['content']);
-
if(!isset($p['display_path']))
$p['display_path'] = '';
@@ -1147,17 +1250,18 @@ function sync_files($channel,$files) {
intval($channel['channel_id'])
);
-
if($exists) {
if(! dbesc_array($p))
continue;
- $str = '';
- foreach($p as $k => $v) {
- if($str)
- $str .= ",";
- $str .= " " . TQUOT . $k . TQUOT . " = '" . $v . "' ";
- }
- $r = dbq("update photo set " . $str . " where id = " . intval($exists[0]['id']) );
+
+ $str = '';
+ foreach($p as $k => $v) {
+ if($str)
+ $str .= ",";
+
+ $str .= " " . TQUOT . $k . TQUOT . " = '" . $v . "' ";
+ }
+ $r = dbq("update photo set " . $str . " where id = " . intval($exists[0]['id']) );
}
else {
create_attach_from_array('photo',$p);
@@ -1173,9 +1277,17 @@ function sync_files($channel,$files) {
}
}
-
-function convert_oldfields(&$arr,$old,$new) {
- if(array_key_exists($old,$arr)) {
+/**
+ * @brief Rename a key in an array.
+ *
+ * Replaces $old key with $new key in $arr.
+ *
+ * @param[in,out] array &$arr The array where to work on
+ * @param string $old The old key in the array
+ * @param string $new The new key in the array
+ */
+function convert_oldfields(&$arr, $old, $new) {
+ if(array_key_exists($old, $arr)) {
$arr[$new] = $arr[$old];
unset($arr[$old]);
}
@@ -1249,14 +1361,15 @@ function scan_webpage_elements($path, $type, $cloud = false) {
}
}
}
+
return $elements;
}
-
+
function import_webpage_element($element, $channel, $type) {
-
+
$arr = array(); // construct information for the webpage element item table record
-
+
switch($type) {
//
// PAGES
@@ -1265,26 +1378,26 @@ function import_webpage_element($element, $channel, $type) {
$arr['item_type'] = ITEM_TYPE_WEBPAGE;
$namespace = 'WEBPAGE';
$name = $element['pagelink'];
- if($name) {
+ if($name) {
require_once('library/urlify/URLify.php');
$name = strtolower(\URLify::transliterate($name));
- }
+ }
$arr['title'] = $element['title'];
$arr['term'] = $element['term'];
$arr['layout_mid'] = ''; // by default there is no layout associated with the page
// If a layout was specified, find it in the database and get its info. If
- // it does not exist, leave layout_mid empty
- if($element['layout'] !== '') {
- $liid = q("select iid from iconfig where k = 'PDL' and v = '%s' and cat = 'system'",
+ // it does not exist, leave layout_mid empty
+ if($element['layout'] !== '') {
+ $liid = q("select iid from iconfig where k = 'PDL' and v = '%s' and cat = 'system'",
dbesc($element['layout'])
- );
+ );
if($liid) {
- $linfo = q("select mid from item where id = %d",
+ $linfo = q("select mid from item where id = %d",
intval($liid[0]['iid'])
- );
- $arr['layout_mid'] = $linfo[0]['mid'];
- }
- }
+ );
+ $arr['layout_mid'] = $linfo[0]['mid'];
+ }
+ }
break;
//
// LAYOUTS
@@ -1304,15 +1417,15 @@ function import_webpage_element($element, $channel, $type) {
$namespace = 'BUILDBLOCK';
$name = $element['name'];
$arr['title'] = $element['title'];
-
+
break;
default :
return null; // return null if invalid element type
}
-
+
$arr['uid'] = local_channel();
$arr['aid'] = $channel['channel_account_id'];
-
+
// Check if an item already exists based on the name
$iid = q("select iid from iconfig where k = '" . $namespace . "' and v = '%s' and cat = 'system'",
dbesc($name)
@@ -1337,12 +1450,13 @@ function import_webpage_element($element, $channel, $type) {
// The author is either the owner or whomever was specified
$arr['author_xchan'] = (($element['author_xchan']) ? $element['author_xchan'] : get_observer_hash());
// Import mimetype if it is a valid mimetype for the element
- $mimetypes = [ 'text/bbcode',
+ $mimetypes = [
+ 'text/bbcode',
'text/html',
'text/markdown',
'text/plain',
'application/x-pdl',
- 'application/x-php'
+ 'application/x-php'
];
// Blocks and pages can have any of the valid mimetypes, but layouts must be text/bbcode
if((in_array($element['mimetype'], $mimetypes)) && ($type === 'page' || $type === 'block') ) {
@@ -1353,37 +1467,16 @@ function import_webpage_element($element, $channel, $type) {
}
// Verify ability to use html or php!!!
- $execflag = false;
- if($arr['mimetype'] === 'application/x-php' || $arr['mimetype'] === 'text/html') {
- $z = q("select account_id, account_roles, channel_pageflags from account "
- . "left join channel on channel_account_id = account_id where channel_id = %d limit 1",
- intval(local_channel())
- );
- if($z && (($z[0]['account_roles'] & ACCOUNT_ROLE_ALLOWCODE) || ($z[0]['channel_pageflags'] & PAGE_ALLOWCODE))) {
- $execflag = true;
- }
- else {
- logger('Unable to import element "' . $name .'" because AllowCode permission is denied.');
- notice( t('Unable to import element "' . $name .'" because AllowCode permission is denied.') . EOL);
- $element['import_success'] = 0;
- return $element;
- }
- }
-
-// $z = q("select * from iconfig where v = '%s' and k = '%s' and cat = 'system' limit 1",
-// dbesc($name),
-// dbesc($namespace)
-// );
-
- $i = q("select id, edited, item_deleted from item where mid = '%s' and uid = %d limit 1",
- dbesc($arr['mid']),
+ $execflag = channel_codeallowed(local_channel());
+
+ $i = q("select id, edited, item_deleted from item where mid = '%s' and uid = %d limit 1",
+ dbesc($arr['mid']),
intval(local_channel())
);
-
- \Zotlabs\Lib\IConfig::Set($arr,'system',$namespace,(($name) ? $name : substr($arr['mid'],0,16)),true);
-
-
+
+ IConfig::Set($arr,'system',$namespace,(($name) ? $name : substr($arr['mid'],0,16)),true);
+
if($i) {
$arr['id'] = $i[0]['id'];
// don't update if it has the same timestamp as the original
@@ -1401,23 +1494,23 @@ function import_webpage_element($element, $channel, $type) {
else
$x = item_store($arr,$execflag);
}
-
+
if($x && $x['success']) {
- $item_id = $x['item_id'];
+ //$item_id = $x['item_id'];
//update_remote_id($channel, $item_id, $arr['item_type'], $name, $namespace, $remote_id, $arr['mid']);
$element['import_success'] = 1;
}
else {
$element['import_success'] = 0;
}
-
- return $element;
+
+ return $element;
}
function get_webpage_elements($channel, $type = 'all') {
$elements = array();
- if(!$channel['channel_id']) {
- return null;
+ if(!$channel['channel_id']) {
+ return null;
}
switch($type) {
case 'all':
@@ -1425,17 +1518,16 @@ function get_webpage_elements($channel, $type = 'all') {
case 'pages':
$elements['pages'] = null;
$owner = $channel['channel_id'];
-
- $sql_extra = item_permissions_sql($owner);
+ $sql_extra = item_permissions_sql($owner);
- $r = q("select * from iconfig left join item on iconfig.iid = item.id
- where item.uid = %d and iconfig.cat = 'system' and iconfig.k = 'WEBPAGE' and item_type = %d
+ $r = q("select * from iconfig left join item on iconfig.iid = item.id
+ where item.uid = %d and iconfig.cat = 'system' and iconfig.k = 'WEBPAGE' and item_type = %d
$sql_extra order by item.created desc",
intval($owner),
intval(ITEM_TYPE_WEBPAGE)
);
-
+
$pages = null;
if($r) {
@@ -1468,7 +1560,6 @@ function get_webpage_elements($channel, $type = 'all') {
);
$elements['pages'][] = $element_arr;
}
-
}
if($type !== 'all') {
break;
@@ -1477,91 +1568,91 @@ function get_webpage_elements($channel, $type = 'all') {
case 'layouts':
$elements['layouts'] = null;
$owner = $channel['channel_id'];
-
- $sql_extra = item_permissions_sql($owner);
+ $sql_extra = item_permissions_sql($owner);
- $r = q("select * from iconfig left join item on iconfig.iid = item.id
- where item.uid = %d and iconfig.cat = 'system' and iconfig.k = 'PDL' and item_type = %d
+ $r = q("select * from iconfig left join item on iconfig.iid = item.id
+ where item.uid = %d and iconfig.cat = 'system' and iconfig.k = 'PDL' and item_type = %d
$sql_extra order by item.created desc",
intval($owner),
intval(ITEM_TYPE_PDL)
);
-
- $layouts = null;
if($r) {
$elements['layouts'] = array();
- $layouts = array();
+
foreach($r as $rr) {
unobscure($rr);
$elements['layouts'][] = array(
- 'type' => 'layout',
- 'description' => $rr['title'], // description of the layout
- 'body' => $rr['body'],
- 'created' => $rr['created'],
- 'edited' => $rr['edited'],
- 'mimetype' => $rr['mimetype'],
- 'name' => $rr['v'], // name of reference for the layout
- 'mid' => $rr['mid'],
+ 'type' => 'layout',
+ 'description' => $rr['title'], // description of the layout
+ 'body' => $rr['body'],
+ 'created' => $rr['created'],
+ 'edited' => $rr['edited'],
+ 'mimetype' => $rr['mimetype'],
+ 'name' => $rr['v'], // name of reference for the layout
+ 'mid' => $rr['mid'],
);
}
}
-
+
if($type !== 'all') {
break;
}
-
+
case 'blocks':
$elements['blocks'] = null;
$owner = $channel['channel_id'];
-
- $sql_extra = item_permissions_sql($owner);
+ $sql_extra = item_permissions_sql($owner);
- $r = q("select iconfig.iid, iconfig.k, iconfig.v, mid, title, body, mimetype, created, edited from iconfig
+ $r = q("select iconfig.iid, iconfig.k, iconfig.v, mid, title, body, mimetype, created, edited from iconfig
left join item on iconfig.iid = item.id
- where uid = %d and iconfig.cat = 'system' and iconfig.k = 'BUILDBLOCK'
+ where uid = %d and iconfig.cat = 'system' and iconfig.k = 'BUILDBLOCK'
and item_type = %d order by item.created desc",
intval($owner),
intval(ITEM_TYPE_BLOCK)
);
-
- $blocks = null;
if($r) {
$elements['blocks'] = array();
- $blocks = array();
+
foreach($r as $rr) {
unobscure($rr);
$elements['blocks'][] = array(
'type' => 'block',
- 'title' => $rr['title'],
+ 'title' => $rr['title'],
'body' => $rr['body'],
'created' => $rr['created'],
'edited' => $rr['edited'],
'mimetype' => $rr['mimetype'],
- 'name' => $rr['v'],
+ 'name' => $rr['v'],
'mid' => $rr['mid']
);
}
-
}
-
+
if($type !== 'all') {
break;
}
-
+
default:
break;
}
+
return $elements;
}
-/* creates a compressed zip file */
-
+/**
+ * @brief Create a compressed zip file.
+ *
+ * @param array $files List of files to put in zip file
+ * @param string $destination
+ * @param boolean $overwrite
+ * @return boolean Success status
+ */
function create_zip_file($files = array(), $destination = '', $overwrite = false) {
// if the zip file already exists and overwrite is false, return false
if(file_exists($destination) && !$overwrite) {
@@ -1578,13 +1669,13 @@ function create_zip_file($files = array(), $destination = '', $overwrite = false
$valid_files[] = $file;
}
}
- }
+ }
// if we have good files...
if(count($valid_files)) {
//create the archive
$zip = new ZipArchive();
- if($zip->open($destination, $overwrite ? ZIPARCHIVE::OVERWRITE : ZIPARCHIVE::CREATE) !== true) {
+ if($zip->open($destination, $overwrite ? ZipArchive::OVERWRITE : ZipArchive::CREATE) !== true) {
return false;
}
// add the files
@@ -1598,7 +1689,7 @@ function create_zip_file($files = array(), $destination = '', $overwrite = false
// check to make sure the file exists
return file_exists($destination);
- }
+ }
else {
return false;
}
diff --git a/include/items.php b/include/items.php
index 36445a46b..328079b9d 100755
--- a/include/items.php
+++ b/include/items.php
@@ -298,11 +298,13 @@ function add_source_route($iid, $hash) {
* or other processing is performed.
*
* @param array $arr
+ * @param boolean $allow_code (optional) default false
+ * @param boolean $deliver (optional) default true
* @returns array
* * \e boolean \b success true or false
* * \e array \b activity the resulting activity if successful
*/
-function post_activity_item($arr,$allow_code = false,$deliver = true) {
+function post_activity_item($arr, $allow_code = false, $deliver = true) {
$ret = array('success' => false);
@@ -336,18 +338,6 @@ function post_activity_item($arr,$allow_code = false,$deliver = true) {
if(! array_key_exists('mimetype',$arr))
$arr['mimetype'] = 'text/bbcode';
- if(array_key_exists('item_private',$arr) && $arr['item_private']) {
-
- $arr['body'] = trim(z_input_filter($arr['uid'],$arr['body'],$arr['mimetype']));
-
- if($channel) {
- if($channel['channel_hash'] === $arr['author_xchan']) {
- $arr['sig'] = base64url_encode(rsa_sign($arr['body'],$channel['channel_prvkey']));
- $arr['item_verified'] = 1;
- }
- }
- }
-
$arr['mid'] = ((x($arr,'mid')) ? $arr['mid'] : item_message_id());
$arr['parent_mid'] = ((x($arr,'parent_mid')) ? $arr['parent_mid'] : $arr['mid']);
$arr['thr_parent'] = ((x($arr,'thr_parent')) ? $arr['thr_parent'] : $arr['mid']);
@@ -360,7 +350,7 @@ function post_activity_item($arr,$allow_code = false,$deliver = true) {
if(($is_comment) && ($arr['obj_type'] === ACTIVITY_OBJ_NOTE))
$arr['obj_type'] = ACTIVITY_OBJ_COMMENT;
- if(! ( array_key_exists('allow_cid',$arr) || array_key_exists('allow_gid',$arr)
+ if(! ( array_key_exists('allow_cid',$arr) || array_key_exists('allow_gid',$arr)
|| array_key_exists('deny_cid',$arr) || array_key_exists('deny_gid',$arr))) {
$arr['allow_cid'] = $channel['channel_allow_cid'];
$arr['allow_gid'] = $channel['channel_allow_gid'];
@@ -542,12 +532,7 @@ function get_item_elements($x,$allow_code = false) {
$arr = array();
- if($allow_code)
- $arr['body'] = $x['body'];
- else
- $arr['body'] = (($x['body']) ? htmlspecialchars($x['body'],ENT_COMPAT,'UTF-8',false) : '');
-
- $key = get_config('system','pubkey');
+ $arr['body'] = $x['body'];
$maxlen = get_max_import_size();
@@ -629,6 +614,9 @@ function get_item_elements($x,$allow_code = false) {
if(in_array('notshown',$x['flags']))
$arr['item_notshown'] = 1;
+ if(in_array('obscured',$x['flags']))
+ $arr['item_obscured'] = 1;
+
// hidden item are no longer propagated - notshown may be a suitable alternative
if(in_array('hidden',$x['flags']))
@@ -649,26 +637,62 @@ function get_item_elements($x,$allow_code = false) {
return array();
// save a potentially expensive lookup if author == owner
+
if($arr['author_xchan'] === make_xchan_hash($x['owner']['guid'],$x['owner']['guid_sig']))
$arr['owner_xchan'] = $arr['author_xchan'];
else {
$xchan_hash = import_author_xchan($x['owner']);
- if($xchan_hash)
+ if($xchan_hash) {
$arr['owner_xchan'] = $xchan_hash;
- else
+ }
+ else {
return array();
+ }
}
+ // Check signature on the body text received.
+ // This presents an issue that we aren't verifying the text that is actually displayed
+ // on this site. We are however verifying the received text was exactly as received.
+ // We have every right to strip content that poses a security risk. You are welcome to
+ // create a plugin to verify the content after filtering if this offends you.
+
if($arr['sig']) {
+
+ // check the supplied signature against the supplied content.
+ // Note that we will purify the content which could change it.
+
$r = q("select xchan_pubkey from xchan where xchan_hash = '%s' limit 1",
dbesc($arr['author_xchan'])
);
- if($r && rsa_verify($x['body'],base64url_decode($arr['sig']),$r[0]['xchan_pubkey']))
- $arr['item_verified'] = 1;
- else
- logger('get_item_elements: message verification failed.');
+ if($r) {
+ if($r[0]['xchan_pubkey']) {
+ if(rsa_verify($x['body'],base64url_decode($arr['sig']),$r[0]['xchan_pubkey'])) {
+ $arr['item_verified'] = 1;
+ }
+ else {
+ logger('get_item_elements: message verification failed.');
+ }
+ }
+ else {
+
+ // If we don't have a public key, strip the signature so it won't show as invalid.
+ // This won't happen in normal use, but could happen if import_author_xchan()
+ // failed to load the zot-info packet due to a server failure and had
+ // to create an alternate xchan with network 'unknown'
+
+ unset($arr['sig']);
+ }
+ }
}
+ // if the input is markdown, remove one level of html escaping.
+ // It will be re-applied in item_store() and/or item_store_update().
+ // Do this after signature checking as the original signature
+ // was generated on the escaped content.
+
+ if($arr['mimetype'] === 'text/markdown')
+ $arr['body'] = \Zotlabs\Lib\MarkdownSoap::unescape($arr['body']);
+
if(array_key_exists('revision',$x)) {
// extended export encoding
@@ -695,7 +719,7 @@ function get_item_elements($x,$allow_code = false) {
// local only $arr['item_relay'] = $x['item_relay'];
$arr['item_mentionsme'] = $x['item_mentionsme'];
$arr['item_nocomment'] = $x['item_nocomment'];
- // local only $arr['item_obscured'] = $x['item_obscured'];
+ $arr['item_obscured'] = $x['item_obscured'];
// local only $arr['item_verified'] = $x['item_verified'];
$arr['item_retained'] = $x['item_retained'];
$arr['item_rss'] = $x['item_rss'];
@@ -768,6 +792,8 @@ function import_author_xchan($x) {
if($arr['xchan_hash'])
return $arr['xchan_hash'];
+ $y = false;
+
if((! array_key_exists('network', $x)) || ($x['network'] === 'zot')) {
$y = import_author_zot($x);
}
@@ -778,11 +804,11 @@ function import_author_xchan($x) {
$y = import_author_rss($x);
}
- if($x['network'] === 'unknown') {
+ if(! $y) {
$y = import_author_unknown($x);
}
- return(($y) ? $y : false);
+ return($y);
}
/**
@@ -940,13 +966,6 @@ function encode_item($item,$mirror = false) {
$key = get_config('system','prvkey');
- if(array_key_exists('item_obscured',$item) && intval($item['item_obscured'])) {
- if($item['title'])
- $item['title'] = crypto_unencapsulate(json_decode($item['title'],true),$key);
- if($item['body'])
- $item['body'] = crypto_unencapsulate(json_decode($item['body'],true),$key);
- }
-
// If we're trying to backup an item so that it's recoverable or for export/imprt,
// add all the attributes we need to recover it
@@ -1120,7 +1139,7 @@ function encode_item_xchan($xchan) {
$ret['address'] = $xchan['xchan_addr'];
$ret['url'] = $xchan['xchan_url'];
$ret['network'] = $xchan['xchan_network'];
- $ret['photo'] = array('mimetype' => $xchan['xchan_photo_mimetype'], 'src' => $xchan['xchan_photo_m']);
+ $ret['photo'] = [ 'mimetype' => $xchan['xchan_photo_mimetype'], 'src' => $xchan['xchan_photo_m'] ];
$ret['guid'] = $xchan['xchan_guid'];
$ret['guid_sig'] = $xchan['xchan_guid_sig'];
@@ -1304,6 +1323,8 @@ function encode_item_flags($item) {
$ret[] = 'nsfw';
if(intval($item['item_consensus']))
$ret[] = 'consensus';
+ if(intval($item['item_obscured']))
+ $ret[] = 'obscured';
if(intval($item['item_private']))
$ret[] = 'private';
@@ -1456,6 +1477,26 @@ function get_profile_elements($x) {
}
+
+
+function item_sign(&$item) {
+
+ if(array_key_exists('sig',$item) && $item['sig'])
+ return;
+
+ $r = q("select channel_prvkey from channel where channel_id = %d and channel_hash = '%s' ",
+ intval($item['uid']),
+ dbesc($item['author_xchan'])
+ );
+ if(! $r)
+ return;
+
+ $item['sig'] = base64url_encode(rsa_sign($item['body'],$r[0]['channel_prvkey']));
+ $item['item_verified'] = 1;
+
+}
+
+
/**
* @brief
*
@@ -1479,7 +1520,7 @@ function item_store($arr, $allow_exec = false, $deliver = true) {
if(array_key_exists('cancel',$arr) && $arr['cancel']) {
logger('cancelled by plugin');
return $ret;
- }
+ }
if(! $arr['uid']) {
logger('item_store: no uid');
@@ -1533,35 +1574,30 @@ function item_store($arr, $allow_exec = false, $deliver = true) {
// obsolete, but needed so as not to throw not-null constraints on some database driveres
$arr['item_flags'] = ((x($arr,'item_flags')) ? intval($arr['item_flags']) : 0 );
- // only detect language if we have text content, and if the post is private but not yet
- // obscured, make it so.
- if((! array_key_exists('item_obscured',$arr)) || $arr['item_obscured'] == 0) {
- $arr['lang'] = detect_language($arr['body']);
- // apply the input filter here - if it is obscured it has been filtered already
- $arr['body'] = trim(z_input_filter($arr['uid'],$arr['body'],$arr['mimetype']));
+ $arr['lang'] = detect_language($arr['body']);
- if(local_channel() && (local_channel() == $arr['uid']) && (! $arr['sig'])) {
- $channel = App::get_channel();
- if($channel['channel_hash'] === $arr['author_xchan']) {
- $arr['sig'] = base64url_encode(rsa_sign($arr['body'],$channel['channel_prvkey']));
- $arr['item_verified'] = 1;
- }
- }
+ // apply the input filter here
- $allowed_languages = get_pconfig($arr['uid'],'system','allowed_languages');
+ $arr['body'] = trim(z_input_filter($arr['body'],$arr['mimetype'],$allow_exec));
- if((is_array($allowed_languages)) && ($arr['lang']) && (! array_key_exists($arr['lang'],$allowed_languages))) {
- $translate = array('item' => $arr, 'from' => $arr['lang'], 'to' => $allowed_languages, 'translated' => false);
- call_hooks('item_translate', $translate);
- if((! $translate['translated']) && (intval(get_pconfig($arr['uid'],'system','reject_disallowed_languages')))) {
- logger('item_store: language ' . $arr['lang'] . ' not accepted for uid ' . $arr['uid']);
- $ret['message'] = 'language not accepted';
- return $ret;
- }
- $arr = $translate['item'];
+ item_sign($arr);
+
+ if(! array_key_exists('sig',$arr))
+ $arr['sig'] = '';
+
+ $allowed_languages = get_pconfig($arr['uid'],'system','allowed_languages');
+
+ if((is_array($allowed_languages)) && ($arr['lang']) && (! array_key_exists($arr['lang'],$allowed_languages))) {
+ $translate = array('item' => $arr, 'from' => $arr['lang'], 'to' => $allowed_languages, 'translated' => false);
+ call_hooks('item_translate', $translate);
+ if((! $translate['translated']) && (intval(get_pconfig($arr['uid'],'system','reject_disallowed_languages')))) {
+ logger('item_store: language ' . $arr['lang'] . ' not accepted for uid ' . $arr['uid']);
+ $ret['message'] = 'language not accepted';
+ return $ret;
}
+ $arr = $translate['item'];
}
if((x($arr,'obj')) && is_array($arr['obj'])) {
@@ -1808,9 +1844,12 @@ logger('revision: ' . $arr['revision']);
intval($arr['revision'])
);
- if($r && count($r)) {
+ if($r) {
+ // This will gives us a fresh copy of what's now in the DB and undo the db escaping,
+ // which really messes up the notifications
+
$current_post = $r[0]['id'];
- $arr = $r[0]; // This will gives us a fresh copy of what's now in the DB and undo the db escaping, which really messes up the notifications
+ $arr = $r[0];
logger('item_store: created item ' . $current_post, LOGGER_DEBUG);
}
else {
@@ -1869,7 +1908,7 @@ logger('revision: ' . $arr['revision']);
// update the commented timestamp on the parent - unless this is potentially a clone of an older item
// which we don't wish to bring to the surface. As the queue only holds deliveries for 3 days, it's
- // suspected of being an older cloned item if the creation time is older than that.
+ // suspected of being an older cloned item if the creation time is older than that.
if($arr['created'] > datetime_convert('','','now - 4 days')) {
$z = q("select max(created) as commented from item where parent_mid = '%s' and uid = %d and item_delayed = 0 ",
@@ -1915,7 +1954,7 @@ function item_store_update($arr,$allow_exec = false, $deliver = true) {
if(array_key_exists('cancel',$arr) && $arr['cancel']) {
logger('cancelled by plugin');
return $ret;
- }
+ }
if(! intval($arr['uid'])) {
logger('item_store_update: no uid');
@@ -1957,33 +1996,25 @@ function item_store_update($arr,$allow_exec = false, $deliver = true) {
return $ret;
}
- if((! array_key_exists('item_obscured', $arr)) || $arr['item_obscured'] == 0) {
+ $arr['lang'] = detect_language($arr['body']);
- $arr['lang'] = detect_language($arr['body']);
+ // apply the input filter here
- // apply the input filter here - if it is obscured it has been filtered already
- $arr['body'] = trim(z_input_filter($arr['uid'],$arr['body'],$arr['mimetype']));
+ $arr['body'] = trim(z_input_filter($arr['body'],$arr['mimetype'],$allow_exec));
- if(local_channel() && (local_channel() == $arr['uid']) && (! $arr['sig'])) {
- $channel = App::get_channel();
- if($channel['channel_hash'] === $arr['author_xchan']) {
- $arr['sig'] = base64url_encode(rsa_sign($arr['body'],$channel['channel_prvkey']));
- $arr['item_verified'] = 1;
- }
- }
+ item_sign($arr);
- $allowed_languages = get_pconfig($arr['uid'],'system','allowed_languages');
+ $allowed_languages = get_pconfig($arr['uid'],'system','allowed_languages');
- if((is_array($allowed_languages)) && ($arr['lang']) && (! array_key_exists($arr['lang'],$allowed_languages))) {
- $translate = array('item' => $arr, 'from' => $arr['lang'], 'to' => $allowed_languages, 'translated' => false);
- call_hooks('item_translate', $translate);
- if((! $translate['translated']) && (intval(get_pconfig($arr['uid'],'system','reject_disallowed_languages')))) {
- logger('item_store: language ' . $arr['lang'] . ' not accepted for uid ' . $arr['uid']);
- $ret['message'] = 'language not accepted';
- return $ret;
- }
- $arr = $translate['item'];
+ if((is_array($allowed_languages)) && ($arr['lang']) && (! array_key_exists($arr['lang'],$allowed_languages))) {
+ $translate = array('item' => $arr, 'from' => $arr['lang'], 'to' => $allowed_languages, 'translated' => false);
+ call_hooks('item_translate', $translate);
+ if((! $translate['translated']) && (intval(get_pconfig($arr['uid'],'system','reject_disallowed_languages')))) {
+ logger('item_store: language ' . $arr['lang'] . ' not accepted for uid ' . $arr['uid']);
+ $ret['message'] = 'language not accepted';
+ return $ret;
}
+ $arr = $translate['item'];
}
if((x($arr,'obj')) && is_array($arr['obj'])) {
@@ -2515,15 +2546,7 @@ function tag_deliver($uid, $item_id) {
// Now let's check if this mention was inside a reshare so we don't spam a forum
// If it's private we may have to unobscure it momentarily so that we can parse it.
- $body = '';
-
- if(intval($item['item_obscured'])) {
- $key = get_config('system','prvkey');
- if($item['body'])
- $body = crypto_unencapsulate(json_decode($item['body'],true),$key);
- }
- else
- $body = $item['body'];
+ $body = $item['body'];
$body = preg_replace('/\[share(.*?)\[\/share\]/','',$body);
@@ -2674,11 +2697,6 @@ function tgroup_check($uid,$item) {
$body = $item['body'];
- if(array_key_exists('item_obscured',$item) && intval($item['item_obscured']) && $body) {
- $key = get_config('system','prvkey');
- $body = crypto_unencapsulate(json_decode($body,true),$key);
- }
-
$body = preg_replace('/\[share(.*?)\[\/share\]/','',$body);
// $pattern = '/@\!?\[zrl\=' . preg_quote($term['url'],'/') . '\]' . preg_quote($term['term'] . '+','/') . '\[\/zrl\]/';
@@ -2772,7 +2790,6 @@ function start_delivery_chain($channel, $item, $item_id, $parent) {
$item_origin = 1;
$item_uplink = 0;
$item_nocomment = 0;
- $item_obscured = 0;
$flag_bits = $item['item_flags'];
@@ -2795,11 +2812,10 @@ function start_delivery_chain($channel, $item, $item_id, $parent) {
$title = $item['title'];
$body = $item['body'];
- $r = q("update item set item_uplink = %d, item_nocomment = %d, item_obscured = %d, item_flags = %d, owner_xchan = '%s', allow_cid = '%s', allow_gid = '%s',
+ $r = q("update item set item_uplink = %d, item_nocomment = %d, item_flags = %d, owner_xchan = '%s', allow_cid = '%s', allow_gid = '%s',
deny_cid = '%s', deny_gid = '%s', item_private = %d, public_policy = '%s', comment_policy = '%s', title = '%s', body = '%s', item_wall = %d, item_origin = %d where id = %d",
intval($item_uplink),
intval($item_nocomment),
- intval($item_obscured),
intval($flag_bits),
dbesc($channel['channel_hash']),
dbesc($channel['channel_allow_cid']),
@@ -2989,8 +3005,14 @@ function mail_store($arr) {
$arr['body'] = escape_tags($arr['body']);
}
- if(array_key_exists('attach',$arr) && is_array($arr['attach']))
- $arr['attach'] = json_encode($arr['attach']);
+ if(array_key_exists('attach',$arr)) {
+ if(is_array($arr['attach'])) {
+ $arr['attach'] = json_encode($arr['attach']);
+ }
+ }
+ else {
+ $arr['attach'] = '';
+ }
$arr['account_id'] = ((x($arr,'account_id')) ? intval($arr['account_id']) : 0);
$arr['mid'] = ((x($arr,'mid')) ? notags(trim($arr['mid'])) : random_string());
@@ -3001,6 +3023,7 @@ function mail_store($arr) {
$arr['title'] = ((x($arr,'title')) ? trim($arr['title']) : '');
$arr['parent_mid'] = ((x($arr,'parent_mid')) ? notags(trim($arr['parent_mid'])) : '');
$arr['body'] = ((x($arr,'body')) ? trim($arr['body']) : '');
+ $arr['sig'] = ((x($arr,'sig')) ? trim($arr['sig']) : '');
$arr['conv_guid'] = ((x($arr,'conv_guid')) ? trim($arr['conv_guid']) : '');
$arr['mail_flags'] = ((x($arr,'mail_flags')) ? intval($arr['mail_flags']) : 0 );
@@ -3773,7 +3796,7 @@ function zot_feed($uid,$observer_hash,$arr) {
if(! is_sys_channel($uid))
$sql_extra = item_permissions_sql($uid,$observer_hash);
- $limit = " LIMIT 100 ";
+ $limit = " LIMIT 5000 ";
if($mindate > NULL_DATE) {
$sql_extra .= " and ( created > '$mindate' or changed > '$mindate' ) ";
@@ -3785,15 +3808,7 @@ function zot_feed($uid,$observer_hash,$arr) {
}
- $items = array();
-
- /** @FIXME re-unite these SQL statements. There is no need for them to be separate. The mySQL is convoluted with misuse of group by. As it stands, there is a slight difference where the postgres version doesn't remove the duplicate parents up to 100. In practice this doesn't matter. It could be made to match behavior by adding "distinct on (parent) " to the front of the selection list, at a not-worth-it performance penalty (page temp results to disk). duplicates are still ignored in the in() clause, you just get less than 100 parents if there are many children. */
-
- if(ACTIVE_DBTYPE == DBTYPE_POSTGRES) {
- $groupby = '';
- } else {
- $groupby = 'GROUP BY parent';
- }
+ $items = [];
$item_normal = item_normal();
@@ -3802,7 +3817,7 @@ function zot_feed($uid,$observer_hash,$arr) {
WHERE uid != %d
$item_normal
AND item_wall = 1
- and item_private = 0 $sql_extra $groupby ORDER BY created ASC $limit",
+ and item_private = 0 $sql_extra ORDER BY created ASC $limit",
intval($uid)
);
}
@@ -3810,19 +3825,25 @@ function zot_feed($uid,$observer_hash,$arr) {
$r = q("SELECT parent, created, postopts from item
WHERE uid = %d $item_normal
AND item_wall = 1
- $sql_extra $groupby ORDER BY created ASC $limit",
+ $sql_extra ORDER BY created ASC $limit",
intval($uid)
);
}
+ $parents = [];
+
if($r) {
- for($x = 0; $x < count($r); $x ++) {
- if(strpos($r[$x]['postopts'],'nodeliver') !== false) {
- unset($r[$x]);
- }
+ foreach($r as $rv) {
+ if(array_key_exists($rv['parent'],$parents))
+ continue;
+ if(strpos($rv['postopts'],'nodeliver') !== false)
+ continue;
+ $parents[$rv['parent']] = $rv;
+ if(count($parents) > 200)
+ break;
}
- $parents_str = ids_to_querystr($r,'parent');
+ $parents_str = ids_to_querystr($parents,'parent');
$sys_query = ((is_sys_channel($uid)) ? $sql_extra : '');
$item_normal = item_normal();
@@ -3940,6 +3961,10 @@ function items_fetch($arr,$channel = null,$observer_hash = null,$client_mode = C
}
}
+ if(intval($arr['compat']) === 1) {
+ $sql_extra = " AND author_xchan = owner_xchan and item_wall = 1 and item_private = 0 ";
+ }
+
if ($arr['datequery']) {
$sql_extra3 .= protect_sprintf(sprintf(" AND item.created <= '%s' ", dbesc(datetime_convert('UTC','UTC',$arr['datequery']))));
}
@@ -4479,12 +4504,12 @@ function item_create_edit_activity($post) {
$new_item['id'] = 0;
$new_item['parent'] = 0;
$new_item['mid'] = item_message_id();
-
+
$new_item['body'] = sprintf( t('[Edited %s]'), (($update_item['item_thread_top']) ? t('Post','edit_activity') : t('Comment','edit_activity')));
$new_item['body'] .= "\n\n";
$new_item['body'] .= $update_item['body'];
-
+
$new_item['sig'] = '';
$new_item['verb'] = ACTIVITY_UPDATE;
@@ -4510,10 +4535,10 @@ function item_create_edit_activity($post) {
array('rel' => 'photo', 'type' => $item_author['xchan_photo_mimetype'], 'href' => $item_author['xchan_photo_m'])),
),
));
-
- $x = post_activity_item($new_item);
+
+ $x = post_activity_item($new_item);
$post_id = $x['id'];
if($post_id) {
@@ -4528,5 +4553,5 @@ function item_create_edit_activity($post) {
}
\Zotlabs\Daemon\Master::Summon(array('Notifier', 'edit_activity', $post_id));
-
+
}
diff --git a/include/markdown.php b/include/markdown.php
index 7afdc6c54..a9617f72b 100644
--- a/include/markdown.php
+++ b/include/markdown.php
@@ -4,12 +4,13 @@
* @brief Some functions for BB conversions for Diaspora protocol.
*/
+use Michelf\MarkdownExtra;
+use Markdownify\Converter;
+
require_once("include/oembed.php");
require_once("include/event.php");
-require_once("library/markdown.php");
require_once("include/html2bbcode.php");
require_once("include/bbcode.php");
-require_once("library/markdownify/markdownify.php");
function get_bb_tag_pos($s, $name, $occurance = 1) {
@@ -73,7 +74,7 @@ function bb_tag_preg_replace($pattern, $replace, $name, $s) {
function share_shield($m) {
return str_replace($m[1],'!=+=+=!' . base64url_encode($m[1]) . '=+!=+!=',$m[0]);
-}
+}
function share_unshield($m) {
$x = str_replace(array('!=+=+=!','=+!=+!='),array('',''),$m[1]);
@@ -184,7 +185,7 @@ function markdown_to_bb($s, $use_zrl = false) {
// This seems to work
$s = preg_replace('/\#([^\s\#])/','&#35;$1',$s);
- $s = Markdown($s);
+ $s = MarkdownExtra::defaultTransform($s);
$s = str_replace("\r","",$s);
@@ -198,10 +199,10 @@ function markdown_to_bb($s, $use_zrl = false) {
// Convert everything that looks like a link to a link
if($use_zrl) {
$s = str_replace(array('[img','/img]'),array('[zmg','/zmg]'),$s);
- $s = preg_replace("/([^\]\=]|^)(https?\:\/\/)([a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,\(\)]+)/ism", '$1[zrl=$2$3]$2$3[/zrl]',$s);
+ $s = preg_replace("/([^\]\=]|^)(https?\:\/\/)([a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,\@\(\)]+)/ism", '$1[zrl=$2$3]$2$3[/zrl]',$s);
}
else {
- $s = preg_replace("/([^\]\=]|^)(https?\:\/\/)([a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,\(\)]+)/ism", '$1[url=$2$3]$2$3[/url]',$s);
+ $s = preg_replace("/([^\]\=]|^)(https?\:\/\/)([a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,\@\(\)]+)/ism", '$1[url=$2$3]$2$3[/url]',$s);
}
// remove duplicate adjacent code tags
@@ -299,7 +300,7 @@ function bb2dmention_callback($match) {
$r = q("select xchan_addr from xchan where xchan_url = '%s'",
dbesc($match[2])
- );
+ );
if($r)
return '@{' . $match[3] . ' ; ' . $r[0]['xchan_addr'] . '}';
@@ -333,7 +334,7 @@ function bb2diaspora_itemwallwall(&$item,$uplink = false) {
$has_meta = true;
if($item['author_xchan'] != $item['owner_xchan']) {
- if($item['mid'] == $item['parent_mid'])
+ if($item['mid'] == $item['parent_mid'])
$wallwall = true;
else {
if(! $has_meta) {
@@ -348,12 +349,12 @@ function bb2diaspora_itemwallwall(&$item,$uplink = false) {
if(($wallwall) && (is_array($item['author'])) && $item['author']['xchan_url'] && $item['author']['xchan_name'] && $item['author']['xchan_photo_s']) {
logger('bb2diaspora_itemwallwall: wall to wall post',LOGGER_DEBUG);
// post will come across with the owner's identity. Throw a preamble onto the post to indicate the true author.
- $item['body'] = "\n\n"
- . '[quote]'
- . '[img]' . $item['author']['xchan_photo_s'] . '[/img]'
- . ' '
- . '[url=' . $item['author']['xchan_url'] . '][b]' . $item['author']['xchan_name'] . '[/b][/url]' . "\n\n"
- . $item['body']
+ $item['body'] = "\n\n"
+ . '[quote]'
+ . '[img]' . $item['author']['xchan_photo_s'] . '[/img]'
+ . ' '
+ . '[url=' . $item['author']['xchan_url'] . '][b]' . $item['author']['xchan_name'] . '[/b][/url]' . "\n\n"
+ . $item['body']
. '[/quote]';
}
@@ -366,7 +367,6 @@ function bb2diaspora_itemwallwall(&$item,$uplink = false) {
function bb2diaspora_itembody($item, $force_update = false, $have_channel = false, $uplink = false) {
-
if(! get_iconfig($item,'diaspora','fields')) {
$force_update = true;
}
@@ -453,7 +453,7 @@ function bb2diaspora_itembody($item, $force_update = false, $have_channel = fals
return html_entity_decode($body);
}
-function bb2diaspora($Text,$preserve_nl = false, $fordiaspora = true) {
+function bb2diaspora($Text, $preserve_nl = false, $fordiaspora = true) {
// Re-enabling the converter again.
// The bbcode parser now handles youtube-links (and the other stuff) correctly.
@@ -490,17 +490,16 @@ function bb2diaspora($Text,$preserve_nl = false, $fordiaspora = true) {
// Convert it to HTML - don't try oembed
$Text = bbcode($Text, $preserve_nl, false);
- // Markdownify does not preserve previously escaped html entities such as <> and &.
+ // Markdownify does not preserve previously escaped html entities such as <> and &.
$Text = str_replace(array('&lt;','&gt;','&amp;'),array('&_lt_;','&_gt_;','&_amp_;'),$Text);
// Now convert HTML to Markdown
- $md = new Markdownify(false, false, false);
+ $md = new Converter(Converter::LINK_AFTER_CONTENT, false, false);
$Text = $md->parseString($Text);
-
- // It also adds backslashes to our attempt at getting around the html entity preservation for some weird reason.
+ // It also adds backslashes to our attempt at getting around the html entity preservation for some weird reason.
$Text = str_replace(array('&\\_lt\\_;','&\\_gt\\_;','&\\_amp\\_;'),array('&lt;','&gt;','&amp;'),$Text);
@@ -510,7 +509,7 @@ function bb2diaspora($Text,$preserve_nl = false, $fordiaspora = true) {
// So take off the angle brackets of any such URL
$Text = preg_replace("/<http(.*?)>/is", "http$1", $Text);
- // Remove empty zrl links
+ // Remove empty zrl links
$Text = preg_replace("/\[zrl\=\].*?\[\/zrl\]/is", "", $Text);
// Remove all unconverted tags
@@ -521,7 +520,7 @@ function bb2diaspora($Text,$preserve_nl = false, $fordiaspora = true) {
$Text = trim($Text);
- call_hooks('bb2diaspora',$Text);
+ call_hooks('bb2diaspora', $Text);
return $Text;
}
@@ -543,22 +542,22 @@ function format_event_diaspora($ev) {
$o .= '**' . (($ev['summary']) ? bb2diaspora($ev['summary']) : bb2diaspora($ev['desc'])) . '**' . "\n";
$o .= t('Starts:') . ' ' . '['
- . (($ev['adjust']) ? day_translate(datetime_convert('UTC', 'UTC',
+ . (($ev['adjust']) ? day_translate(datetime_convert('UTC', 'UTC',
$ev['start'] , $bd_format ))
- : day_translate(datetime_convert('UTC', 'UTC',
+ : day_translate(datetime_convert('UTC', 'UTC',
$ev['start'] , $bd_format)))
. '](' . z_root() . '/localtime/?f=&time=' . urlencode(datetime_convert('UTC','UTC',$ev['start'])) . ")\n";
if(! $ev['nofinish'])
- $o .= t('Finishes:') . ' ' . '['
- . (($ev['adjust']) ? day_translate(datetime_convert('UTC', 'UTC',
+ $o .= t('Finishes:') . ' ' . '['
+ . (($ev['adjust']) ? day_translate(datetime_convert('UTC', 'UTC',
$ev['finish'] , $bd_format ))
- : day_translate(datetime_convert('UTC', 'UTC',
+ : day_translate(datetime_convert('UTC', 'UTC',
$ev['finish'] , $bd_format )))
. '](' . z_root() . '/localtime/?f=&time=' . urlencode(datetime_convert('UTC','UTC',$ev['finish'])) . ")\n";
if(strlen($ev['location']))
- $o .= t('Location:') . bb2diaspora($ev['location'])
+ $o .= t('Location:') . bb2diaspora($ev['location'])
. "\n";
$o .= "\n";
diff --git a/include/message.php b/include/message.php
index bde07afd8..4e8e44adc 100644
--- a/include/message.php
+++ b/include/message.php
@@ -13,10 +13,8 @@ function send_message($uid = 0, $recipient = '', $body = '', $subject = '', $rep
$ret = array('success' => false);
$is_reply = false;
- $a = get_app();
$observer_hash = get_observer_hash();
-
if($uid) {
$r = q("select * from channel where channel_id = %d limit 1",
intval($uid)
@@ -37,13 +35,15 @@ function send_message($uid = 0, $recipient = '', $body = '', $subject = '', $rep
$body = cleanup_bbcode($body);
$results = linkify_tags($a, $body, $uid);
-
- if(preg_match_all("/\[attachment\](.*?)\[\/attachment\]/",((strpos($body,'[/crypt]')) ? $_POST['media_str'] : $body),$match))
- $attaches = $match[1];
+ if(! $raw) {
+ if(preg_match_all("/\[attachment\](.*?)\[\/attachment\]/",((strpos($body,'[/crypt]')) ? $_POST['media_str'] : $body),$match)) {
+ $attaches = $match[1];
+ }
+ }
$attachments = '';
- if(preg_match_all('/(\[attachment\](.*?)\[\/attachment\])/',$body,$match)) {
+ if((! $raw) && preg_match_all('/(\[attachment\](.*?)\[\/attachment\])/',$body,$match)) {
$attachments = array();
foreach($match[2] as $mtch) {
$hash = substr($mtch,0,strpos($mtch,','));
@@ -186,19 +186,21 @@ function send_message($uid = 0, $recipient = '', $body = '', $subject = '', $rep
if($subject)
$subject = str_rot47(base64url_encode($subject));
- if($body)
+ if(($body )&& (! $raw))
$body = str_rot47(base64url_encode($body));
$sig = ''; // placeholder
+ $mimetype = ''; //placeholder
- $r = q("INSERT INTO mail ( account_id, conv_guid, mail_obscured, channel_id, from_xchan, to_xchan, title, body, sig, attach, mid, parent_mid, created, expires, mail_isreply )
- VALUES ( %d, '%s', %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d )",
+ $r = q("INSERT INTO mail ( account_id, conv_guid, mail_obscured, channel_id, from_xchan, to_xchan, mail_mimetype, title, body, sig, attach, mid, parent_mid, created, expires, mail_isreply )
+ VALUES ( %d, '%s', %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d )",
intval($channel['channel_account_id']),
dbesc($conv_guid),
intval(1),
intval($channel['channel_id']),
dbesc($channel['channel_hash']),
dbesc($recipient),
+ dbesc(($mimetype)? $mimetype : 'text/bbcode'),
dbesc($subject),
dbesc($body),
dbesc($sig),
@@ -514,6 +516,9 @@ function private_messages_fetch_conversation($channel_id, $messageitem_id, $upda
if($messages[$k]['body'])
$messages[$k]['body'] = base64url_decode(str_rot47($messages[$k]['body']));
}
+ if($messages[$k]['mail_raw'])
+ $messages[$k]['body'] = mail_prepare_binary([ 'id' => $messages[$k]['id'] ]);
+
}
diff --git a/include/nav.php b/include/nav.php
index 144509cd0..849e19d9a 100644
--- a/include/nav.php
+++ b/include/nav.php
@@ -2,6 +2,10 @@
use \Zotlabs\Lib as Zlib;
+require_once('include/security.php');
+require_once('include/menu.php');
+
+
function nav() {
/**
@@ -36,14 +40,15 @@ EOT;
}
elseif(remote_channel())
$observer = App::get_observer();
-
+
+ require_once('include/conversation.php');
+ $is_owner = (((local_channel()) && (App::$profile['profile_uid'] == local_channel())) ? true : false);
+ $channel_apps[] = channel_apps($is_owner, App::$profile['channel_address']);
$myident = (($channel) ? $channel['xchan_addr'] : '');
$sitelocation = (($myident) ? $myident : App::get_hostname());
-
-
/**
*
* Provide a banner/logo/whatever
@@ -55,10 +60,9 @@ EOT;
if($banner === false)
$banner = get_config('system','sitename');
+ //the notifications template is in hdr.tpl
App::$page['header'] .= replace_macros(get_markup_template('hdr.tpl'), array(
- '$baseurl' => z_root(),
- '$sitelocation' => $sitelocation,
- '$banner' => $banner
+ //we could additionally use this to display important system notifications e.g. for updates
));
$server_role = get_config('system','server_role');
@@ -66,21 +70,21 @@ EOT;
$techlevel = get_account_techlevel();
// nav links: array of array('href', 'text', 'extra css classes', 'title')
- $nav = Array();
+ $nav = [];
/**
* Display login or logout
*/
- $nav['usermenu']=array();
+ $nav['usermenu'] = [];
$userinfo = null;
- $nav['loginmenu']=array();
+ $nav['loginmenu'] = [];
if($observer) {
- $userinfo = array(
+ $userinfo = [
'icon' => $observer['xchan_photo_m'],
'name' => $observer['xchan_addr'],
- );
+ ];
}
elseif(! $_SESSION['authenticated']) {
@@ -96,38 +100,21 @@ EOT;
if($chans && count($chans) > 1 && feature_enabled(local_channel(),'nav_channel_select') && (! $basic))
$nav['channels'] = $chans;
- $nav['logout'] = Array('logout',t('Logout'), "", t('End this session'),'logout_nav_btn');
+ $nav['logout'] = ['logout',t('Logout'), "", t('End this session'),'logout_nav_btn'];
// user menu
- //$nav['usermenu'][] = Array('channel/' . $channel['channel_address'], t('Home'), "", t('Your posts and conversations'),'channel_nav_btn');
- $nav['usermenu'][] = Array('profile/' . $channel['channel_address'], t('View Profile'), "", t('Your profile page'),'profile_nav_btn');
+ $nav['usermenu'][] = ['profile/' . $channel['channel_address'], t('View Profile'), "", t('Your profile page'),'profile_nav_btn'];
+
if(feature_enabled(local_channel(),'multi_profiles') && (! $basic))
- $nav['usermenu'][] = Array('profiles', t('Edit Profiles'),"", t('Manage/Edit profiles'),'profiles_nav_btn');
+ $nav['usermenu'][] = ['profiles', t('Edit Profiles'),"", t('Manage/Edit profiles'),'profiles_nav_btn'];
else
- $nav['usermenu'][] = Array('profiles/' . $prof[0]['id'], t('Edit Profile'),"", t('Edit your profile'),'profiles_nav_btn');
-
- //$nav['usermenu'][] = Array('photos/' . $channel['channel_address'], t('Photos'), "", t('Your photos'),'photos_nav_btn');
- //$nav['usermenu'][] = Array('cloud/' . $channel['channel_address'],t('Files'),"",t('Your files'),'cloud_nav_btn');
-
- //if((! $basic) && feature_enabled(local_channel(),'ajaxchat'))
- // $nav['usermenu'][] = Array('chat/' . $channel['channel_address'], t('Chat'),"",t('Your chatrooms'),'chat_nav_btn');
+ $nav['usermenu'][] = ['profiles/' . $prof[0]['id'], t('Edit Profile'),"", t('Edit your profile'),'profiles_nav_btn'];
-
- //require_once('include/menu.php');
- //$has_bookmarks = menu_list_count(local_channel(),'',MENU_BOOKMARK) + menu_list_count(local_channel(),'',MENU_SYSTEM|MENU_BOOKMARK);
- //if(($has_bookmarks) && (! $basic)) {
- // $nav['usermenu'][] = Array('bookmarks', t('Bookmarks'), "", t('Your bookmarks'),'bookmarks_nav_btn');
- //}
-
- //if(feature_enabled($channel['channel_id'],'webpages') && (! $basic))
- // $nav['usermenu'][] = Array('webpages/' . $channel['channel_address'],t('Webpages'),"",t('Your webpages'),'webpages_nav_btn');
- //if(feature_enabled($channel['channel_id'],'wiki') && (! $basic))
- // $nav['usermenu'][] = Array('wiki/' . $channel['channel_address'],t('Wikis'),"",t('Your wikis'),'wiki_nav_btn');
}
else {
if(! get_account_id()) {
$nav['login'] = login(true,'main-login',false,false);
- $nav['loginmenu'][] = Array('login',t('Login'),'',t('Sign in'),'login_nav_btn');
+ $nav['loginmenu'][] = ['login',t('Login'),'',t('Sign in'),'login_nav_btn'];
App::$page['content'] .= replace_macros(get_markup_template('nav_login.tpl'),
[
'$nav' => $nav,
@@ -137,7 +124,7 @@ EOT;
}
else
- $nav['alogout'] = Array('logout',t('Logout'), "", t('End this session'),'logout_nav_btn');
+ $nav['alogout'] = ['logout',t('Logout'), "", t('End this session'),'logout_nav_btn'];
}
@@ -152,14 +139,14 @@ EOT;
if(! local_channel()) {
$nav['rusermenu'] = array(
$homelink,
- t('Get me home'),
+ t('Take me home'),
'logout',
t('Log me out of this site')
);
}
if(((get_config('system','register_policy') == REGISTER_OPEN) || (get_config('system','register_policy') == REGISTER_APPROVE)) && (! $_SESSION['authenticated']))
- $nav['register'] = array('register',t('Register'), "", t('Create an account'),'register_nav_btn');
+ $nav['register'] = ['register',t('Register'), "", t('Create an account'),'register_nav_btn'];
if(! get_config('system','hide_help')) {
$help_url = z_root() . '/help?f=&cmd=' . App::$cmd;
@@ -171,15 +158,10 @@ EOT;
//point directly to /help if $context_help is empty - this can be removed once we have context help for all modules
$enable_context_help = (($context_help) ? true : false);
}
- $nav['help'] = array($help_url, t('Help'), "", t('Help and documentation'), 'help_nav_btn', $context_help, $enable_context_help);
+ $nav['help'] = [$help_url, t('Help'), "", t('Help and documentation'), 'help_nav_btn', $context_help, $enable_context_help];
}
- if(! $basic)
- $nav['apps'] = array('apps', t('Apps'), "", t('Applications, utilities, links, games'),'apps_nav_btn');
-
- $nav['search'] = array('search', t('Search'), "", t('Search site @name, #tag, ?docs, content'));
-
- $nav['directory'] = array('directory', t('Directory'), "", t('Channel Directory'),'directory_nav_btn');
+ $nav['search'] = ['search', t('Search'), "", t('Search site @name, #tag, ?docs, content')];
/**
@@ -246,15 +228,13 @@ EOT;
$banner = get_config('system','sitename');
$x = array('nav' => $nav, 'usermenu' => $userinfo );
+
call_hooks('nav', $x);
// Not sure the best place to put this on the page. So I'm implementing it but leaving it
// turned off until somebody discovers this and figures out a good location for it.
$powered_by = '';
- // $powered_by = '<strong>red<img class="smiley" src="' . z_root() . '/images/rm-16.png" alt="r#" />matrix</strong>';
-
-
//app bin
if(local_channel()) {
if(get_pconfig(local_channel(), 'system','initial_import_system_apps') === false) {
@@ -278,7 +258,7 @@ EOT;
usort($syslist,'Zotlabs\\Lib\\Apps::app_name_compare');
foreach($syslist as $app) {
- $navapps[] = Zlib\Apps::app_render($app,'nav');
+ $nav_apps[] = Zlib\Apps::app_render($app,'nav');
}
$tpl = get_markup_template('nav.tpl');
@@ -296,8 +276,10 @@ EOT;
'$powered_by' => $powered_by,
'$help' => t('@name, #tag, ?doc, content'),
'$pleasewait' => t('Please wait...'),
- '$navapps' => $navapps,
- '$addapps' => t('Add Apps')
+ '$nav_apps' => $nav_apps,
+ '$channel_apps' => $channel_apps,
+ '$addapps' => t('Add Apps'),
+ '$sysapps_toggle' => t('Toggle System Apps')
));
if(x($_SESSION, 'reload_avatar') && $observer) {
@@ -336,3 +318,168 @@ function nav_set_selected($item){
);
App::$nav_sel[$item] = 'active';
}
+
+
+
+function channel_apps($is_owner = false, $nickname = null) {
+
+ // Don't provide any channel apps if we're running as the sys channel
+
+ if(App::$is_sys)
+ return '';
+
+ if(! get_pconfig($uid, 'system', 'channelapps','1'))
+ return '';
+
+ $channel = App::get_channel();
+
+ if($channel && is_null($nickname))
+ $nickname = $channel['channel_address'];
+
+ $uid = ((App::$profile['profile_uid']) ? App::$profile['profile_uid'] : local_channel());
+ $account_id = ((App::$profile['profile_uid']) ? App::$profile['channel_account_id'] : App::$channel['channel_account_id']);
+
+ if($uid == local_channel()) {
+ return;
+ }
+ else {
+ $cal_link = '/cal/' . $nickname;
+ }
+
+ $sql_options = item_permissions_sql($uid);
+
+ $r = q("select item.* from item left join iconfig on item.id = iconfig.iid
+ where item.uid = %d and iconfig.cat = 'system' and iconfig.v = '%s'
+ and item.item_delayed = 0 and item.item_deleted = 0
+ and ( iconfig.k = 'WEBPAGE' and item_type = %d )
+ $sql_options limit 1",
+ intval($uid),
+ dbesc('home'),
+ intval(ITEM_TYPE_WEBPAGE)
+ );
+
+ $has_webpages = (($r) ? true : false);
+
+ if(x($_GET, 'tab'))
+ $tab = notags(trim($_GET['tab']));
+
+ $url = z_root() . '/channel/' . $nickname;
+ $pr = z_root() . '/profile/' . $nickname;
+
+ $tabs = [
+ [
+ 'label' => t('Channel'),
+ 'url' => $url,
+ 'sel' => ((argv(0) == 'channel') ? 'active' : ''),
+ 'title' => t('Status Messages and Posts'),
+ 'id' => 'status-tab',
+ 'icon' => 'home'
+ ],
+ ];
+
+ $p = get_all_perms($uid,get_observer_hash());
+
+ if ($p['view_profile']) {
+ $tabs[] = [
+ 'label' => t('About'),
+ 'url' => $pr,
+ 'sel' => ((argv(0) == 'profile') ? 'active' : ''),
+ 'title' => t('Profile Details'),
+ 'id' => 'profile-tab',
+ 'icon' => 'user'
+ ];
+ }
+ if ($p['view_storage']) {
+ $tabs[] = [
+ 'label' => t('Photos'),
+ 'url' => z_root() . '/photos/' . $nickname,
+ 'sel' => ((argv(0) == 'photos') ? 'active' : ''),
+ 'title' => t('Photo Albums'),
+ 'id' => 'photo-tab',
+ 'icon' => 'photo'
+ ];
+ $tabs[] = [
+ 'label' => t('Files'),
+ 'url' => z_root() . '/cloud/' . $nickname,
+ 'sel' => ((argv(0) == 'cloud' || argv(0) == 'sharedwithme') ? 'active' : ''),
+ 'title' => t('Files and Storage'),
+ 'id' => 'files-tab',
+ 'icon' => 'folder-open'
+ ];
+ }
+
+ if($p['view_stream'] && $cal_link) {
+ $tabs[] = [
+ 'label' => t('Events'),
+ 'url' => z_root() . $cal_link,
+ 'sel' => ((argv(0) == 'cal' || argv(0) == 'events') ? 'active' : ''),
+ 'title' => t('Events'),
+ 'id' => 'event-tab',
+ 'icon' => 'calendar'
+ ];
+ }
+
+
+ if ($p['chat'] && feature_enabled($uid,'ajaxchat')) {
+ $has_chats = ZLib\Chatroom::list_count($uid);
+ if ($has_chats) {
+ $tabs[] = [
+ 'label' => t('Chatrooms'),
+ 'url' => z_root() . '/chat/' . $nickname,
+ 'sel' => ((argv(0) == 'chat') ? 'active' : '' ),
+ 'title' => t('Chatrooms'),
+ 'id' => 'chat-tab',
+ 'icon' => 'comments-o'
+ ];
+ }
+ }
+
+ $has_bookmarks = menu_list_count(local_channel(),'',MENU_BOOKMARK) + menu_list_count(local_channel(),'',MENU_SYSTEM|MENU_BOOKMARK);
+ if ($is_owner && $has_bookmarks) {
+ $tabs[] = [
+ 'label' => t('Bookmarks'),
+ 'url' => z_root() . '/bookmarks',
+ 'sel' => ((argv(0) == 'bookmarks') ? 'active' : ''),
+ 'title' => t('Saved Bookmarks'),
+ 'id' => 'bookmarks-tab',
+ 'icon' => 'bookmark'
+ ];
+ }
+
+ if($has_webpages && feature_enabled($uid,'webpages')) {
+ $tabs[] = [
+ 'label' => t('Webpages'),
+ 'url' => z_root() . '/page/' . $nickname . '/home',
+ 'sel' => ((argv(0) == 'webpages') ? 'active' : ''),
+ 'title' => t('View Webpages'),
+ 'id' => 'webpages-tab',
+ 'icon' => 'newspaper-o'
+ ];
+ }
+
+
+ if ($p['view_wiki']) {
+ if(feature_enabled($uid,'wiki') && (get_account_techlevel($account_id) > 3)) {
+ $tabs[] = [
+ 'label' => t('Wikis'),
+ 'url' => z_root() . '/wiki/' . $nickname,
+ 'sel' => ((argv(0) == 'wiki') ? 'active' : ''),
+ 'title' => t('Wiki'),
+ 'id' => 'wiki-tab',
+ 'icon' => 'pencil-square-o'
+ ];
+ }
+ }
+
+ $arr = array('is_owner' => $is_owner, 'nickname' => $nickname, 'tab' => (($tab) ? $tab : false), 'tabs' => $tabs);
+ call_hooks('profile_tabs', $arr);
+ call_hooks('channel_apps', $arr);
+
+ return replace_macros(get_markup_template('profile_tabs.tpl'),
+ [
+ '$tabs' => $arr['tabs'],
+ '$name' => App::$profile['channel_name'],
+ '$thumb' => App::$profile['thumb']
+ ]
+ );
+}
diff --git a/include/network.php b/include/network.php
index 66716ef9e..c03ca70f5 100644
--- a/include/network.php
+++ b/include/network.php
@@ -22,8 +22,8 @@ function get_capath() {
* @param int $redirects default 0
* internal use, recursion counter
* @param array $opts (optional parameters) associative array with:
- * * \b accept_content => supply Accept: header with 'accept_content' as the value
* * \b timeout => int seconds, default system config value or 60 seconds
+ * * \b headers => array of additional header fields
* * \b http_auth => username:password
* * \b novalidate => do not validate SSL certs, default is to validate using our CA list
* * \b nobody => only return the header
@@ -31,6 +31,7 @@ function get_capath() {
* * \b custom => custom request method: e.g. 'PUT', 'DELETE'
* * \b cookiejar => cookie file (write)
* * \b cookiefile => cookie file (read)
+ * * \b session => boolean; append session cookie *if* $url is our own site
*
* @return array an associative array with:
* * \e int \b return_code => HTTP return code or 0 if timeout or failure
@@ -74,8 +75,21 @@ function z_fetch_url($url, $binary = false, $redirects = 0, $opts = array()) {
if(x($opts,'readfunc'))
@curl_setopt($ch, CURLOPT_READFUNCTION, $opts['readfunc']);
- if(x($opts,'headers'))
- @curl_setopt($ch, CURLOPT_HTTPHEADER, $opts['headers']);
+ // When using the session option and fetching from our own site,
+ // append the PHPSESSID cookie to any existing headers.
+ // Don't add to $opts['headers'] so that the cookie does not get
+ // sent to other sites via redirects
+
+ $instance_headers = ((array_key_exists('headers',$opts) && is_array($opts['headers'])) ? $opts['headers'] : []);
+
+ if(x($opts,'session')) {
+ if(strpos($url,z_root()) === 0) {
+ $instance_headers[] = 'Cookie: PHPSESSID=' . session_id();
+ }
+ }
+ if($instance_headers)
+ @curl_setopt($ch, CURLOPT_HTTPHEADER, $instance_headers);
+
if(x($opts,'nobody'))
@curl_setopt($ch, CURLOPT_NOBODY, $opts['nobody']);
@@ -91,6 +105,7 @@ function z_fetch_url($url, $binary = false, $redirects = 0, $opts = array()) {
@curl_setopt($ch, CURLOPT_TIMEOUT, (($curl_time !== false) ? $curl_time : 60));
}
+
if(x($opts,'http_auth')) {
// "username" . ':' . "password"
@curl_setopt($ch, CURLOPT_USERPWD, $opts['http_auth']);
@@ -186,7 +201,6 @@ function z_fetch_url($url, $binary = false, $redirects = 0, $opts = array()) {
* @param int $redirects = 0
* internal use, recursion counter
* @param array $opts (optional parameters)
- * 'accept_content' => supply Accept: header with 'accept_content' as the value
* 'timeout' => int seconds, default system config value or 60 seconds
* 'http_auth' => username:password
* 'novalidate' => do not validate SSL certs, default is to validate using our CA list
@@ -229,9 +243,16 @@ function z_post_url($url,$params, $redirects = 0, $opts = array()) {
@curl_setopt($ch, CURLOPT_HEADER, false);
}
- if(x($opts,'headers')) {
- @curl_setopt($ch, CURLOPT_HTTPHEADER, $opts['headers']);
+ $instance_headers = ((array_key_exists('headers',$opts) && is_array($opts['headers'])) ? $opts['headers'] : []);
+
+ if(x($opts,'session')) {
+ if(strpos($url,z_root()) === 0) {
+ $instance_headers[] = 'Cookie: PHPSESSID=' . session_id();
+ }
}
+ if($instance_headers)
+ @curl_setopt($ch, CURLOPT_HTTPHEADER, $instance_headers);
+
if(x($opts,'nobody'))
@curl_setopt($ch, CURLOPT_NOBODY, $opts['nobody']);
@@ -377,18 +398,22 @@ function json_return_and_die($x, $content_type = 'application/json') {
}
-
-// Generic XML return
-// Outputs a basic dfrn XML status structure to STDOUT, with a <status> variable
-// of $st and an optional text <message> of $message and terminates the current process.
-
-
+/**
+ * @brief Generic XML return.
+ *
+ * Outputs a basic dfrn XML status structure to STDOUT, with a <status> variable
+ * of $st and an optional text <message> of $message and terminates the current
+ * process.
+ *
+ * @param string $st
+ * @param string $message
+ */
function xml_status($st, $message = '') {
$xml_message = ((strlen($message)) ? "\t<message>" . xmlify($message) . "</message>\r\n" : '');
if($st)
- logger('xml_status returning non_zero: ' . $st . " message=" . $message);
+ logger('Returning non_zero: ' . $st . " message=" . $message);
header( "Content-type: text/xml" );
echo '<?xml version="1.0" encoding="UTF-8"?>'."\r\n";
@@ -397,15 +422,13 @@ function xml_status($st, $message = '') {
}
-
/**
- * @brief Send HTTP status header
+ * @brief Send HTTP status header.
*
* @param int $val
* integer HTTP status result value
* @param string $msg
* optional message
- * @returns nil
*/
function http_status($val, $msg = '') {
if ($val >= 400)
@@ -413,12 +436,11 @@ function http_status($val, $msg = '') {
if ($val >= 200 && $val < 300)
$msg = (($msg) ? $msg : 'OK');
- logger('http_status_exit ' . $val . ' ' . $msg);
+ logger('' . $val . ' ' . $msg);
header($_SERVER['SERVER_PROTOCOL'] . ' ' . $val . ' ' . $msg);
}
-
/**
* @brief Send HTTP status header and exit.
*
@@ -426,58 +448,57 @@ function http_status($val, $msg = '') {
* integer HTTP status result value
* @param string $msg
* optional message
- * @returns (does not return, process is terminated)
+ * @return does not return, process is terminated
*/
function http_status_exit($val, $msg = '') {
http_status($val, $msg);
killme();
}
-
-
-// convert an XML document to a normalised, case-corrected array
-// used by webfinger
-
-
+/**
+ * @brief convert an XML document to a normalised, case-corrected array used by webfinger.
+ *
+ * @param string|array|SimpleXMLElement $xml_element
+ * @param int $recursion_depth[in,out]
+ * @return NULL|string|array
+ */
function convert_xml_element_to_array($xml_element, &$recursion_depth=0) {
- // If we're getting too deep, bail out
- if ($recursion_depth > 512) {
- return(null);
- }
-
- if (!is_string($xml_element) &&
- !is_array($xml_element) &&
- (get_class($xml_element) == 'SimpleXMLElement')) {
- $xml_element_copy = $xml_element;
- $xml_element = get_object_vars($xml_element);
- }
+ // If we're getting too deep, bail out
+ if ($recursion_depth > 512) {
+ return(null);
+ }
- if (is_array($xml_element)) {
- $result_array = array();
- if (count($xml_element) <= 0) {
- return (trim(strval($xml_element_copy)));
- }
+ if (!is_string($xml_element) &&
+ !is_array($xml_element) &&
+ (get_class($xml_element) == 'SimpleXMLElement')) {
+ $xml_element_copy = $xml_element;
+ $xml_element = get_object_vars($xml_element);
+ }
- foreach($xml_element as $key=>$value) {
+ if (is_array($xml_element)) {
+ $result_array = array();
+ if (count($xml_element) <= 0) {
+ return (trim(strval($xml_element_copy)));
+ }
- $recursion_depth++;
- $result_array[strtolower($key)] =
+ foreach($xml_element as $key=>$value) {
+ $recursion_depth++;
+ $result_array[strtolower($key)] =
convert_xml_element_to_array($value, $recursion_depth);
- $recursion_depth--;
- }
- if ($recursion_depth == 0) {
- $temp_array = $result_array;
- $result_array = array(
- strtolower($xml_element_copy->getName()) => $temp_array,
- );
- }
-
- return ($result_array);
-
- } else {
- return (trim(strval($xml_element)));
+ $recursion_depth--;
+ }
+ if ($recursion_depth == 0) {
+ $temp_array = $result_array;
+ $result_array = array(
+ strtolower($xml_element_copy->getName()) => $temp_array,
+ );
}
+
+ return ($result_array);
+ } else {
+ return (trim(strval($xml_element)));
+ }
}
@@ -491,7 +512,7 @@ function z_dns_check($h,$check_mx = 0) {
if(is_array(\App::$config) && array_key_exists('system',\App::$config)
&& is_array(\App::$config['system'])
- && array_key_exists('do_not_check_dns',\App::$config['system'])
+ && array_key_exists('do_not_check_dns',\App::$config['system'])
&& \App::$config['system']['do_not_check_dns'])
return true;
@@ -499,56 +520,71 @@ function z_dns_check($h,$check_mx = 0) {
//$opts = DNS_A + DNS_CNAME + DNS_PTR;
//if($check_mx)
// $opts += DNS_MX;
- // Specific record type flags are unreliable on FreeBSD and Mac,
- // so now we'll ignore these and just check for the existence of any DNS record.
+ // Specific record type flags are unreliable on FreeBSD and Mac,
+ // so now we'll ignore these and just check for the existence of any DNS record.
return((@dns_get_record($h) || filter_var($h, FILTER_VALIDATE_IP)) ? true : false);
-
}
-// Take a URL from the wild, prepend http:// if necessary
-// and check DNS to see if it's real (or check if is a valid IP address)
-// return true if it's OK, false if something is wrong with it
-
-
+/**
+ * @brief Validates a given URL
+ *
+ * Take a URL from the wild, prepend http:// if necessary and check DNS to see
+ * if it's real (or check if is a valid IP address).
+ *
+ * @see z_dns_check()
+ *
+ * @param string $url[in,out] URL to check
+ * @return boolean Return true if it's OK, false if something is wrong with it
+ */
function validate_url(&$url) {
// no naked subdomains (allow localhost for tests)
- if(strpos($url,'.') === false && strpos($url,'/localhost/') === false)
+ if(strpos($url, '.') === false && strpos($url, '/localhost/') === false)
return false;
- if(substr($url,0,4) != 'http')
+
+ if(substr($url, 0, 4) != 'http')
$url = 'http://' . $url;
+
$h = @parse_url($url);
if(($h) && z_dns_check($h['host'])) {
return true;
}
+
return false;
}
-// checks that email is an actual resolvable internet address
-
-
+/**
+ * @brief Checks that email is an actual resolvable internet address.
+ *
+ * @param string $addr
+ * @return boolean
+ */
function validate_email($addr) {
- if(get_config('system','disable_email_validation'))
+ if(get_config('system', 'disable_email_validation'))
return true;
- if(! strpos($addr,'@'))
+ if(! strpos($addr, '@'))
return false;
- $h = substr($addr,strpos($addr,'@') + 1);
- if(($h) && z_dns_check($h,true)) {
+ $h = substr($addr, strpos($addr, '@') + 1);
+
+ if(($h) && z_dns_check($h, true)) {
return true;
}
+
return false;
}
-// Check $url against our list of allowed sites,
-// wildcards allowed. If allowed_sites is unset return true;
-// If url is allowed, return true.
-// otherwise, return false
-
-
+/**
+ * @brief Check $url against our list of allowed sites.
+ *
+ * Wildcards allowed. If allowed_sites is unset return true.
+ *
+ * @param string $url
+ * @return boolean Return true if url is allowed, otherwise return false
+ */
function allowed_url($url) {
$h = @parse_url($url);
@@ -557,7 +593,7 @@ function allowed_url($url) {
return false;
}
- $str_allowed = get_config('system','allowed_sites');
+ $str_allowed = get_config('system', 'allowed_sites');
if(! $str_allowed)
return true;
@@ -585,21 +621,23 @@ function allowed_url($url) {
return $found;
}
-// check if email address is allowed to register here.
-// Compare against our list (wildcards allowed).
-// Returns false if not allowed, true if allowed or if
-// allowed list is not configured.
-
-
+/**
+ * @brief Check if email address is allowed to register here.
+ *
+ * Compare against our list (wildcards allowed).
+ *
+ * @param string $email
+ * @return boolean Returns false if not allowed, true if allowed or if allowed list is
+ * not configured.
+ */
function allowed_email($email) {
-
- $domain = strtolower(substr($email,strpos($email,'@') + 1));
+ $domain = strtolower(substr($email, strpos($email, '@') + 1));
if(! $domain)
return false;
- $str_allowed = get_config('system','allowed_email');
- $str_not_allowed = get_config('system','not_allowed_email');
+ $str_allowed = get_config('system', 'allowed_email');
+ $str_not_allowed = get_config('system', 'not_allowed_email');
if(! $str_allowed && ! $str_not_allowed)
return true;
@@ -610,7 +648,7 @@ function allowed_email($email) {
$fnmatch = function_exists('fnmatch');
- $allowed = explode(',',$str_allowed);
+ $allowed = explode(',', $str_allowed);
if(count($allowed)) {
foreach($allowed as $a) {
@@ -622,7 +660,7 @@ function allowed_email($email) {
}
}
- $not_allowed = explode(',',$str_not_allowed);
+ $not_allowed = explode(',', $str_not_allowed);
if(count($not_allowed)) {
foreach($not_allowed as $na) {
@@ -639,6 +677,7 @@ function allowed_email($email) {
} elseif (!$str_allowed && !$found_not_allowed) {
$return = true;
}
+
return $return;
}
@@ -648,10 +687,12 @@ function parse_xml_string($s,$strict = true) {
if($strict) {
if(! strstr($s,'<?xml'))
return false;
+
$s2 = substr($s,strpos($s,'<?xml'));
}
else
$s2 = $s;
+
libxml_use_internal_errors(true);
$x = @simplexml_load_string($s2);
@@ -659,8 +700,10 @@ function parse_xml_string($s,$strict = true) {
logger('libxml: parse: error: ' . $s2, LOGGER_DATA);
foreach(libxml_get_errors() as $err)
logger('libxml: parse: ' . $err->code." at ".$err->line.":".$err->column." : ".$err->message, LOGGER_DATA);
+
libxml_clear_errors();
}
+
return $x;
}
@@ -676,7 +719,7 @@ function scale_external_images($s, $include_link = true, $scale_replace = false)
require_once('include/photo/photo_driver.php');
foreach($matches as $mtch) {
- logger('scale_external_image: ' . $mtch[2] . ' ' . $mtch[3]);
+ logger('data: ' . $mtch[2] . ' ' . $mtch[3]);
if(substr($mtch[1],0,1) == '=') {
$owidth = intval(substr($mtch[2],1));
@@ -727,12 +770,12 @@ function scale_external_images($s, $include_link = true, $scale_replace = false)
$ph->scaleImage(1024);
$new_width = $ph->getWidth();
$new_height = $ph->getHeight();
- logger('scale_external_images: ' . $orig_width . '->' . $new_width . 'w ' . $orig_height . '->' . $new_height . 'h' . ' match: ' . $mtch[0], LOGGER_DEBUG);
+ logger('data: ' . $orig_width . '->' . $new_width . 'w ' . $orig_height . '->' . $new_height . 'h' . ' match: ' . $mtch[0], LOGGER_DEBUG);
$s = str_replace($mtch[0],'[' . $tag . '=' . $new_width . 'x' . $new_height. ']' . $scaled . '[/' . $tag . ']'
. "\n" . (($include_link)
? '[zrl=' . $mtch[2] . ']' . t('view full size') . '[/zrl]' . "\n"
: ''),$s);
- logger('scale_external_images: new string: ' . $s, LOGGER_DEBUG);
+ logger('new string: ' . $s, LOGGER_DEBUG);
}
}
}
@@ -747,27 +790,31 @@ function scale_external_images($s, $include_link = true, $scale_replace = false)
}
/**
- * xml2array() will convert the given XML text to an array in the XML structure.
+ * @brief xml2array() will convert the given XML text to an array in the XML structure.
+ *
* Link: http://www.bin-co.com/php/scripts/xml2array/
- * Portions significantly re-written by mike@macgirvin.com for Friendica (namespaces, lowercase tags, get_attribute default changed, more...)
- * Arguments : $contents - The XML text
- * $namespaces - true or false include namespace information in the returned array as array elements.
- * $get_attributes - 1 or 0. If this is 1 the function will get the attributes as well as the tag values - this results in a different array structure in the return value.
- * $priority - Can be 'tag' or 'attribute'. This will change the way the resulting array sturcture. For 'tag', the tags are given more importance.
- * Return: The parsed XML in an array form. Use print_r() to see the resulting array structure.
+ * Portions significantly re-written by mike@macgirvin.com for Friendica
+ * (namespaces, lowercase tags, get_attribute default changed, more...)
+ *
* Examples: $array = xml2array(file_get_contents('feed.xml'));
- * $array = xml2array(file_get_contents('feed.xml', true, 1, 'attribute'));
+ * $array = xml2array(file_get_contents('feed.xml', true, 1, 'attribute'));
+ *
+ * @param string $contents The XML text
+ * @param boolean $namespaces true or false include namespace information in the returned array as array elements
+ * @param int $get_attributes 1 or 0. If this is 1 the function will get the attributes as well as the tag values - this results in a different array structure in the return value.
+ * @param string $priority Can be 'tag' or 'attribute'. This will change the way the resulting array sturcture. For 'tag', the tags are given more importance.
+ *
+ * @return array The parsed XML in an array form. Use print_r() to see the resulting array structure.
*/
-
function xml2array($contents, $namespaces = true, $get_attributes=1, $priority = 'attribute') {
- if(!$contents) return array();
+ if(!$contents)
+ return array();
if(!function_exists('xml_parser_create')) {
logger('xml2array: parser function missing');
return array();
}
-
libxml_use_internal_errors(true);
libxml_clear_errors();
@@ -793,6 +840,7 @@ function xml2array($contents, $namespaces = true, $get_attributes=1, $priority =
foreach(libxml_get_errors() as $err)
logger('libxml: parse: ' . $err->code . " at " . $err->line . ":" . $err->column . " : " . $err->message, LOGGER_DATA);
libxml_clear_errors();
+
return;
}
@@ -859,7 +907,6 @@ function xml2array($contents, $namespaces = true, $get_attributes=1, $priority =
$current[$tag]['0_attr'] = $current[$tag.'_attr'];
unset($current[$tag.'_attr']);
}
-
}
$last_item_index = $repeated_tag_index[$tag.'_'.$level]-1;
$current = &$current[$tag][$last_item_index];
@@ -870,7 +917,8 @@ function xml2array($contents, $namespaces = true, $get_attributes=1, $priority =
if(!isset($current[$tag])) { //New Key
$current[$tag] = $result;
$repeated_tag_index[$tag.'_'.$level] = 1;
- if($priority == 'tag' and $attributes_data) $current[$tag. '_attr'] = $attributes_data;
+ if($priority == 'tag' and $attributes_data)
+ $current[$tag. '_attr'] = $attributes_data;
} else { // If taken, put all things inside a list(array)
if(isset($current[$tag][0]) and is_array($current[$tag])) { // If it is already an array...
@@ -882,13 +930,11 @@ function xml2array($contents, $namespaces = true, $get_attributes=1, $priority =
$current[$tag][$repeated_tag_index[$tag.'_'.$level] . '_attr'] = $attributes_data;
}
$repeated_tag_index[$tag.'_'.$level]++;
-
} else { // If it is not an array...
$current[$tag] = array($current[$tag],$result); //...Make it an array using using the existing value and the new value
$repeated_tag_index[$tag.'_'.$level] = 1;
if($priority == 'tag' and $get_attributes) {
if(isset($current[$tag.'_attr'])) { // The attribute of the last(0th) tag must be moved as well
-
$current[$tag]['0_attr'] = $current[$tag.'_attr'];
unset($current[$tag.'_attr']);
}
@@ -994,15 +1040,21 @@ function email_send($addr, $subject, $headers, $item) {
mail($addr, $subject, $body, $headers);
}
-
-
-function discover_by_url($url,$arr = null) {
- require_once('library/HTML5/Parser.php');
+/**
+ * @brief Creates an xchan entry for URL.
+ *
+ * @param string $url URL to discover
+ * @param array $arr fallback values if scrape_feed() is empty
+ *
+ * @return boolean
+ */
+function discover_by_url($url, $arr = null) {
$x = scrape_feed($url);
if(! $x) {
if(! $arr)
return false;
+
$network = (($arr['network']) ? $arr['network'] : 'unknown');
$name = (($arr['name']) ? $arr['name'] : 'unknown');
$photo = (($arr['photo']) ? $arr['photo'] : '');
@@ -1025,24 +1077,23 @@ function discover_by_url($url,$arr = null) {
// try and discover stuff from the feeed
- require_once('library/simplepie/simplepie.inc');
$feed = new SimplePie();
$level = 0;
- $x = z_fetch_url($guid,false,$level,array('novalidate' => true));
+ $x = z_fetch_url($guid, false, $level, array('novalidate' => true));
if(! $x['success']) {
- logger('probe_url: feed fetch failed for ' . $poll);
+ logger('Feed fetch failed for ' . $guid);
return false;
}
$xml = $x['body'];
- logger('probe_url: fetch feed: ' . $guid . ' returns: ' . $xml, LOGGER_DATA);
- logger('probe_url: scrape_feed: headers: ' . $x['header'], LOGGER_DATA);
+ logger('Fetch feed: ' . $guid . ' returns: ' . $xml, LOGGER_DATA);
+ logger('scrape_feed: headers: ' . $x['header'], LOGGER_DATA);
// Don't try and parse an empty string
$feed->set_raw_data(($xml) ? $xml : '<?xml version="1.0" encoding="utf-8" ?><xml></xml>');
$feed->init();
if($feed->error())
- logger('probe_url: scrape_feed: Error parsing XML: ' . $feed->error());
+ logger('scrape_feed: Error parsing XML: ' . $feed->error());
$name = unxmlify(trim($feed->get_title()));
$photo = $feed->get_image_url();
@@ -1083,7 +1134,7 @@ function discover_by_url($url,$arr = null) {
$profile = trim(unxmlify($author->get_link()));
}
if(! $photo) {
- $rawmedia = $item->get_item_tags('http://search.yahoo.com/mrss/','thumbnail');
+ $rawmedia = $item->get_item_tags('http://search.yahoo.com/mrss/', 'thumbnail');
if($rawmedia && $rawmedia[0]['attribs']['']['url'])
$photo = unxmlify($rawmedia[0]['attribs']['']['url']);
}
@@ -1097,7 +1148,7 @@ function discover_by_url($url,$arr = null) {
}
}
}
- if($poll === $profile)
+ if($guid === $profile)
$lnk = $feed->get_permalink();
if(isset($lnk) && strlen($lnk))
$profile = $lnk;
@@ -1109,9 +1160,6 @@ function discover_by_url($url,$arr = null) {
if(! $name)
$name = notags($feed->get_description());
- if(! $guid)
- return false;
-
$r = q("select * from xchan where xchan_hash = '%s' limit 1",
dbesc($guid)
);
@@ -1125,7 +1173,6 @@ function discover_by_url($url,$arr = null) {
[
'xchan_hash' => $guid,
'xchan_guid' => $guid,
- 'xchan_pubkey' => $pubkey,
'xchan_addr' => $addr,
'xchan_url' => $profile,
'xchan_name' => $name,
@@ -1143,11 +1190,10 @@ function discover_by_url($url,$arr = null) {
dbesc($photos[3]),
dbesc($guid)
);
- return true;
+ return true;
}
-
function discover_by_webbie($webbie) {
require_once('library/HTML5/Parser.php');
@@ -1195,7 +1241,7 @@ function discover_by_webbie($webbie) {
$dfrn = $link['href'];
}
if($link['rel'] == 'magic-public-key') {
- if(substr($link['href'],0,5) === 'data:') {
+ if(substr($link['href'],0,5) === 'data:') {
$salmon_key = convert_salmon_key($link['href']);
}
}
@@ -1245,7 +1291,6 @@ function discover_by_webbie($webbie) {
if(! $x)
$probe_old = true;
-
if((! $dfrn) && (! $has_salmon))
$probe_old = true;
@@ -1283,7 +1328,7 @@ function discover_by_webbie($webbie) {
$diaspora = true;
}
if($link['@attributes']['rel'] == 'magic-public-key') {
- if(substr($link['@attributes']['href'],0,5) === 'data:') {
+ if(substr($link['@attributes']['href'],0,5) === 'data:') {
$salmon_key = convert_salmon_key($link['@attributes']['href']);
}
}
@@ -1321,7 +1366,6 @@ function discover_by_webbie($webbie) {
$location = find_webfinger_location($v,$rhs);
if($address)
$nickname = substr($address,0,strpos($address,'@'));
-
}
if($salmon_key && $has_salmon && $atom_feed && (! $dfrn) && (! $diaspora)) {
@@ -1389,12 +1433,7 @@ function discover_by_webbie($webbie) {
$diaspora_guid = $vcard['uid'];
if(($vcard['url']) && (! $diaspora_base))
$diaspora_base = $vcard['url'];
-
-
-
-
}
-
}
}
}
@@ -1408,16 +1447,14 @@ function discover_by_webbie($webbie) {
$host = $m['host'];
}
-
if($diaspora && $diaspora_base && $diaspora_guid) {
if($dfrn)
$network = 'friendica-over-diaspora';
else
$network = 'diaspora';
- $base = trim($diaspora_base,'/');
+ $base = trim($diaspora_base, '/');
$notify = $base . '/receive';
-
}
else {
if($gnusoc) {
@@ -1426,15 +1463,12 @@ function discover_by_webbie($webbie) {
}
}
-
logger('network: ' . $network);
logger('address: ' . $address);
logger('fullname: ' . $fullname);
logger('pubkey: ' . $pubkey);
logger('location: ' . $location);
-
-
// if we have everything we need, let's create the records
if($network && $address && $fullname && $pubkey && $location) {
@@ -1501,7 +1535,6 @@ function discover_by_webbie($webbie) {
function webfinger_rfc7033($webbie,$zot = false) {
-
if(strpos($webbie,'@')) {
$lhs = substr($webbie,0,strpos($webbie,'@'));
$rhs = substr($webbie,strpos($webbie,'@')+1);
@@ -1520,7 +1553,16 @@ function webfinger_rfc7033($webbie,$zot = false) {
}
logger('fetching url from resource: ' . $rhs . ':' . $webbie);
- $s = z_fetch_url('https://' . $rhs . '/.well-known/webfinger?f=&resource=' . $resource . (($zot) ? '&zot=1' : ''));
+ // The default curl Accept: header is */*, which is incorrectly handled by Mastodon servers
+ // and results in a 406 (Not Acceptable) response, and will also incorrectly produce an XML
+ // document if you use 'application/jrd+json, */*'. We could set this to application/jrd+json,
+ // but some test webfinger servers may not explicitly set the content type and they would be
+ // blocked. The best compromise until Mastodon is fixed is to remove the Accept header which is
+ // accomplished by setting it to nothing.
+
+ $counter = 0;
+ $s = z_fetch_url('https://' . $rhs . '/.well-known/webfinger?f=&resource=' . $resource . (($zot) ? '&zot=1' : ''),
+ false, $counter, [ 'headers' => [ 'Accept:' ] ]);
if($s['success']) {
$j = json_decode($s['body'],true);
@@ -1531,8 +1573,10 @@ function webfinger_rfc7033($webbie,$zot = false) {
// Otherwise we have to store every alias that we may ever encounter and
// validate every URL we ever find against every possible alias
- // @fixme pump.io is going to be a real bugger since it doesn't return subject or aliases
- // or provide lookup by url
+ /**
+ * @FIXME pump.io is going to be a real bugger since it doesn't return
+ * subject or aliases or provide lookup by url
+ */
$j['address'] = find_webfinger_address($j,$rhs);
$j['location'] = find_webfinger_location($j,$rhs);
@@ -1581,22 +1625,30 @@ function find_webfinger_location($j,$rhs) {
return '';
}
-function match_webfinger_location($s,$h) {
+/**
+ * @brief Match the webfinger location for the different networks.
+ *
+ * @param string $s The string to search in
+ * @param string $h The host
+ * @return string
+ */
+function match_webfinger_location($s, $h) {
// GNU-social and the older StatusNet - the $host/user/123 form doesn't work
- if(preg_match('|' . $h . '/index.php/user/([0-9]*?)$|',$s))
+ if(preg_match('|' . $h . '/index.php/user/([0-9]*?)$|', $s))
return $s;
// Redmatrix / hubzilla
- if(preg_match('|' . $h . '/channel/|',$s))
+ if(preg_match('|' . $h . '/channel/|', $s))
return $s;
// Friendica
- if(preg_match('|' . $h . '/profile/|',$s))
+ if(preg_match('|' . $h . '/profile/|', $s))
return $s;
$arr = array('test' => $s, 'host' => $h, 'success' => false);
- call_hooks('match_webfinger_location',$arr);
+ call_hooks('match_webfinger_location', $arr);
if($arr['success'])
return $s;
+
return '';
}
@@ -1604,8 +1656,6 @@ function match_webfinger_location($s,$h) {
-
-
function old_webfinger($webbie) {
$host = '';
@@ -1652,14 +1702,14 @@ function fetch_lrdd_template($host) {
}
if(! strpos($tpl,'{uri}'))
$tpl = '';
- return $tpl;
+ return $tpl;
}
function fetch_xrd_links($url) {
- logger('fetch_xrd_links: ' . $url, LOGGER_DEBUG);
+ logger('url: ' . $url, LOGGER_DEBUG);
$redirects = 0;
$x = z_fetch_url($url,false,$redirects,array('timeout' => 20));
@@ -1668,7 +1718,7 @@ function fetch_xrd_links($url) {
return array();
$xml = $x['body'];
- logger('fetch_xrd_links: ' . $xml, LOGGER_DATA);
+ logger('data: ' . $xml, LOGGER_DATA);
if ((! $xml) || (! stristr($xml,'<xrd')))
return array();
@@ -1709,7 +1759,7 @@ function fetch_xrd_links($url) {
$links[]['@attributes'] = array('rel' => 'subject' , 'href' => $arr['xrd']['subject']);
}
- logger('fetch_xrd_links: ' . print_r($links,true), LOGGER_DATA);
+ logger('data: ' . print_r($links, true), LOGGER_DATA);
return $links;
}
@@ -1719,7 +1769,7 @@ function scrape_vcard($url) {
$ret = array();
- logger('scrape_vcard: url=' . $url);
+ logger('url=' . $url);
$x = z_fetch_url($url);
if(! $x['success'])
@@ -1743,7 +1793,7 @@ function scrape_vcard($url) {
try {
$dom = HTML5_Parser::parse($s);
} catch (DOMException $e) {
- logger('scrape_vcard: parse error: ' . $e);
+ logger('Parse error: ' . $e);
}
if(! $dom)
@@ -1792,9 +1842,14 @@ function scrape_vcard($url) {
return $ret;
}
-
-
+/**
+ * @brief
+ *
+ * @param string $url The URL to scrape
+ * @return array
+ */
function scrape_feed($url) {
+ require_once('library/HTML5/Parser.php');
$ret = array();
$level = 0;
@@ -1807,15 +1862,14 @@ function scrape_feed($url) {
$code = $x['return_code'];
$s = $x['body'];
- logger('scrape_feed: returns: ' . $code . ' headers=' . $headers, LOGGER_DEBUG);
+ logger('returns: ' . $code . ' headers=' . $headers, LOGGER_DEBUG);
if(! $s) {
- logger('scrape_feed: no data returned for ' . $url);
+ logger('No data returned for ' . $url);
return $ret;
}
-
- $lines = explode("\n",$headers);
+ $lines = explode("\n", $headers);
if(count($lines)) {
foreach($lines as $line) {
if(stristr($line,'content-type:')) {
@@ -1839,15 +1893,14 @@ function scrape_feed($url) {
try {
$dom = HTML5_Parser::parse($s);
} catch (DOMException $e) {
- logger('scrape_feed: parse error: ' . $e);
+ logger('Parse error: ' . $e);
}
if(! $dom) {
- logger('scrape_feed: failed to parse.');
+ logger('Failed to parse.');
return $ret;
}
-
$head = $dom->getElementsByTagName('base');
if($head) {
foreach($head as $head0) {
@@ -1917,80 +1970,80 @@ function format_and_send_email($sender,$xchan,$item) {
$title = $item['title'];
$body = $item['body'];
- $textversion = strip_tags(html_entity_decode(bbcode(str_replace(array("\\r", "\\n"), array( "", "\n"), $body)),ENT_QUOTES,'UTF-8'));
+ $textversion = strip_tags(html_entity_decode(bbcode(str_replace(array("\\r", "\\n"), array( "", "\n"), $body)),ENT_QUOTES,'UTF-8'));
$htmlversion = bbcode(str_replace(array("\\r","\\n"), array("","<br />\n"),$body));
- $banner = t('$Projectname Notification');
- $product = t('$projectname'); // PLATFORM_NAME;
- $siteurl = z_root();
- $thanks = t('Thank You,');
- $sitename = get_config('system','sitename');
- $site_admin = sprintf( t('%s Administrator'), $sitename);
-
- // load the template for private message notifications
- $tpl = get_markup_template('email_notify_html.tpl');
- $email_html_body = replace_macros($tpl,array(
- '$banner' => $banner,
- '$notify_icon' => Zotlabs\Lib\System::get_notify_icon(),
- '$product' => $product,
- '$preamble' => '',
- '$sitename' => $sitename,
- '$siteurl' => $siteurl,
- '$source_name' => $sender['xchan_name'],
- '$source_link' => $sender['xchan_url'],
- '$source_photo' => $sender['xchan_photo_m'],
- '$username' => $xchan['xchan_name'],
- '$hsitelink' => $datarray['hsitelink'],
- '$hitemlink' => $datarray['hitemlink'],
- '$thanks' => $thanks,
- '$site_admin' => $site_admin,
- '$title' => $title,
- '$htmlversion' => $htmlversion,
- ));
-
- // load the template for private message notifications
- $tpl = get_markup_template('email_notify_text.tpl');
- $email_text_body = replace_macros($tpl, array(
- '$banner' => $banner,
- '$product' => $product,
- '$preamble' => '',
- '$sitename' => $sitename,
- '$siteurl' => $siteurl,
- '$source_name' => $sender['xchan_name'],
- '$source_link' => $sender['xchan_url'],
- '$source_photo' => $sender['xchan_photo_m'],
- '$username' => $xchan['xchan_name'],
- '$hsitelink' => $datarray['hsitelink'],
- '$hitemlink' => $datarray['hitemlink'],
- '$thanks' => $thanks,
- '$site_admin' => $site_admin,
- '$title' => $title,
- '$textversion' => $textversion
- ));
-
- $sender_name = t('Administrator');
-
- $hostname = App::get_hostname();
- if(strpos($hostname,':'))
- $hostname = substr($hostname,0,strpos($hostname,':'));
- $sender_email = get_config('system','reply_address');
- if(! $sender_email)
- $sender_email = 'noreply' . '@' . $hostname;
-
- // use the EmailNotification library to send the message
-
- Zotlabs\Lib\Enotify::send(array(
- 'fromName' => $product,
- 'fromEmail' => $sender_email,
- 'replyTo' => $sender_email,
- 'toEmail' => str_replace('mailto:','',$xchan['xchan_addr']),
- 'messageSubject' => (($title) ? $title : t('No Subject')),
- 'htmlVersion' => $email_html_body,
- 'textVersion' => $email_text_body,
- 'additionalMailHeader' => '',
- ));
-
+ $banner = t('$Projectname Notification');
+ $product = t('$projectname'); // PLATFORM_NAME;
+ $siteurl = z_root();
+ $thanks = t('Thank You,');
+ $sitename = get_config('system', 'sitename');
+ $site_admin = sprintf( t('%s Administrator'), $sitename);
+
+ // load the template for private message notifications
+ $tpl = get_markup_template('email_notify_html.tpl');
+ $email_html_body = replace_macros($tpl, array(
+ '$banner' => $banner,
+ '$notify_icon' => Zotlabs\Lib\System::get_notify_icon(),
+ '$product' => $product,
+ '$preamble' => '',
+ '$sitename' => $sitename,
+ '$siteurl' => $siteurl,
+ '$source_name' => $sender['xchan_name'],
+ '$source_link' => $sender['xchan_url'],
+ '$source_photo' => $sender['xchan_photo_m'],
+ '$username' => $xchan['xchan_name'],
+ '$hsitelink' => $datarray['hsitelink'], /// @FIXME $datarray is undefined
+ '$hitemlink' => $datarray['hitemlink'], /// @FIXME $datarray is undefined
+ '$thanks' => $thanks,
+ '$site_admin' => $site_admin,
+ '$title' => $title,
+ '$htmlversion' => $htmlversion,
+ ));
+
+ // load the template for private message notifications
+ $tpl = get_markup_template('email_notify_text.tpl');
+ $email_text_body = replace_macros($tpl, array(
+ '$banner' => $banner,
+ '$product' => $product,
+ '$preamble' => '',
+ '$sitename' => $sitename,
+ '$siteurl' => $siteurl,
+ '$source_name' => $sender['xchan_name'],
+ '$source_link' => $sender['xchan_url'],
+ '$source_photo' => $sender['xchan_photo_m'],
+ '$username' => $xchan['xchan_name'],
+ '$hsitelink' => $datarray['hsitelink'],
+ '$hitemlink' => $datarray['hitemlink'],
+ '$thanks' => $thanks,
+ '$site_admin' => $site_admin,
+ '$title' => $title,
+ '$textversion' => $textversion
+ ));
+
+ $sender_name = t('Administrator');
+
+ $hostname = App::get_hostname();
+ if(strpos($hostname, ':'))
+ $hostname = substr($hostname,0,strpos($hostname,':'));
+
+ $sender_email = get_config('system', 'reply_address');
+ if(! $sender_email)
+ $sender_email = 'noreply' . '@' . $hostname;
+
+ // use the EmailNotification library to send the message
+
+ Zotlabs\Lib\Enotify::send(array(
+ 'fromName' => $product,
+ 'fromEmail' => $sender_email,
+ 'replyTo' => $sender_email,
+ 'toEmail' => str_replace('mailto:','',$xchan['xchan_addr']),
+ 'messageSubject' => (($title) ? $title : t('No Subject')),
+ 'htmlVersion' => $email_html_body,
+ 'textVersion' => $email_text_body,
+ 'additionalMailHeader' => '',
+ ));
}
@@ -2028,8 +2081,6 @@ function do_delivery($deliveries) {
if($deliver)
Zotlabs\Daemon\Master::Summon(array('Deliver',$deliver));
-
-
}
@@ -2086,7 +2137,7 @@ function get_site_info() {
$commit = '';
}
else {
- $version = $commit = '';
+ $version = $commit = '';
}
//Statistics
@@ -2103,12 +2154,12 @@ function get_site_info() {
foreach(App::$config['feature_lock'] as $k => $v) {
if($k === 'config_loaded')
continue;
+
$locked_features[$k] = intval($v);
}
}
-
$data = Array(
'version' => $version,
'version_tag' => $tag,
@@ -2136,16 +2187,20 @@ function get_site_info() {
'local_posts' => $local_posts_stat,
'hide_in_statistics' => $hide_in_statistics
);
+
return $data;
}
-
-
+/**
+ * @brief
+ *
+ * @param string $url
+ * @return boolean
+ */
function check_siteallowed($url) {
$retvalue = true;
-
$arr = array('url' => $url);
call_hooks('check_siteallowed',$arr);
@@ -2171,9 +2226,16 @@ function check_siteallowed($url) {
}
}
}
+
return $retvalue;
}
+/**
+ * @brief
+ *
+ * @param string $hash
+ * @return boolean
+ */
function check_channelallowed($hash) {
$retvalue = true;
@@ -2203,6 +2265,7 @@ function check_channelallowed($hash) {
}
}
}
+
return $retvalue;
}
@@ -2233,9 +2296,14 @@ function get_repository_version($branch = 'master') {
return $matches[3];
}
return '?.?';
-
}
+/**
+ * @brief Get translated network name.
+ *
+ * @param string $s Network string, see boot.php
+ * @return string Translated name of the network
+ */
function network_to_name($s) {
$nets = array(
@@ -2258,27 +2326,24 @@ function network_to_name($s) {
$search = array_keys($nets);
$replace = array_values($nets);
- return str_replace($search,$replace,$s);
-
+ return str_replace($search, $replace, $s);
}
-
+/**
+ * @brief Send a text email message.
+ *
+ * @param array $params an assoziative array with:
+ * * \e string \b fromName name of the sender
+ * * \e string \b fromEmail email of the sender
+ * * \e string \b replyTo replyTo address to direct responses
+ * * \e string \b toEmail destination email address
+ * * \e string \b messageSubject subject of the message
+ * * \e string \b htmlVersion html version of the message
+ * * \e string \b textVersion text only version of the message
+ * * \e string \b additionalMailHeader additions to the smtp mail header
+ */
function z_mail($params) {
- /**
- * @brief Send a text email message
- *
- * @param array $params an assoziative array with:
- * * \e string \b fromName name of the sender
- * * \e string \b fromEmail email of the sender
- * * \e string \b replyTo replyTo address to direct responses
- * * \e string \b toEmail destination email address
- * * \e string \b messageSubject subject of the message
- * * \e string \b htmlVersion html version of the message
- * * \e string \b textVersion text only version of the message
- * * \e string \b additionalMailHeader additions to the smtp mail header
- */
-
if(! $params['fromEmail']) {
$params['fromEmail'] = get_config('system','from_email');
if(! $params['fromEmail'])
@@ -2324,8 +2389,13 @@ function z_mail($params) {
return $res;
}
-// discover the best API path available for redmatrix/hubzilla servers
+/**
+ * @brief Discover the best API path available for redmatrix/hubzilla servers.
+ *
+ * @param string $host
+ * @return string
+ */
function probe_api_path($host) {
$schemes = ['https', 'http' ];
@@ -2335,8 +2405,8 @@ function probe_api_path($host) {
foreach($paths as $path) {
$curpath = $scheme . '://' . $host . $path;
$x = z_fetch_url($curpath);
- if($x['success'] && ! strlen($x['body'],'not implemented'))
- return str_replace('version','',$curpath);
+ if($x['success'] && ! strlen($x['body'], 'not implemented'))
+ return str_replace('version', '', $curpath);
}
}
diff --git a/include/oembed.php b/include/oembed.php
index aac7d15b4..5865c95d5 100755
--- a/include/oembed.php
+++ b/include/oembed.php
@@ -149,7 +149,14 @@ function oembed_fetch_url($embedurl){
if ($action !== 'block') {
// try oembed autodiscovery
$redirects = 0;
- $result = z_fetch_url($furl, false, $redirects, array('timeout' => 30, 'accept_content' => "text/*", 'novalidate' => true ));
+ $result = z_fetch_url($furl, false, $redirects,
+ [
+ 'timeout' => 30,
+ 'accept_content' => "text/*",
+ 'novalidate' => true,
+ 'session' => ((local_channel() && $zrl) ? true : false)
+ ]
+ );
if($result['success'])
$html_text = $result['body'];
@@ -200,7 +207,7 @@ function oembed_fetch_url($embedurl){
if ($txt[0]!="{") $txt='{"type":"error"}';
- //save in cache
+ // save in cache
if(! get_config('system','oembed_cache_disable'))
Zlib\Cache::set('[' . App::$videowidth . '] ' . $furl, $txt);
diff --git a/include/permissions.php b/include/permissions.php
index d21b45550..f719394c5 100644
--- a/include/permissions.php
+++ b/include/permissions.php
@@ -314,11 +314,12 @@ function perm_is_allowed($uid, $observer_xchan, $permission) {
'channel_id' => $uid,
'observer_hash' => $observer_xchan,
'permission' => $permission,
- 'result' => false);
+ 'result' => 'unset');
call_hooks('perm_is_allowed', $arr);
- if($arr['result'])
- return true;
+ if($arr['result'] !== 'unset') {
+ return $arr['result'];
+ }
$global_perms = \Zotlabs\Access\Permissions::Perms();
diff --git a/include/photo/photo_driver.php b/include/photo/photo_driver.php
index c8b3c3782..cc1f3b5d0 100644
--- a/include/photo/photo_driver.php
+++ b/include/photo/photo_driver.php
@@ -330,6 +330,7 @@ abstract class photo_driver {
$p['photo_usage'] = intval($arr['photo_usage']);
$p['os_storage'] = intval($arr['os_storage']);
$p['os_path'] = $arr['os_path'];
+ $p['os_syspath'] = ((array_key_exists('os_syspath',$arr)) ? $arr['os_syspath'] : '');
$p['display_path'] = (($arr['display_path']) ? $arr['display_path'] : '');
if(! intval($p['imgscale']))
@@ -380,7 +381,7 @@ abstract class photo_driver {
dbesc($p['album']),
intval($this->getHeight()),
intval($this->getWidth()),
- (intval($p['os_storage']) ? dbescbin($p['os_path']) : dbescbin($this->imageString())),
+ (intval($p['os_storage']) ? dbescbin($p['os_syspath']) : dbescbin($this->imageString())),
intval($p['os_storage']),
intval(strlen($this->imageString())),
intval($p['imgscale']),
@@ -411,7 +412,7 @@ abstract class photo_driver {
dbesc($p['album']),
intval($this->getHeight()),
intval($this->getWidth()),
- (intval($p['os_storage']) ? dbescbin($p['os_path']) : dbescbin($this->imageString())),
+ (intval($p['os_storage']) ? dbescbin($p['os_syspath']) : dbescbin($this->imageString())),
intval($p['os_storage']),
intval(strlen($this->imageString())),
intval($p['imgscale']),
@@ -429,90 +430,6 @@ abstract class photo_driver {
return $r;
}
-
- // should be obsolete now
-
- public function store($aid, $uid, $xchan, $rid, $filename, $album, $scale, $usage = PHOTO_NORMAL, $allow_cid = '', $allow_gid = '', $deny_cid = '', $deny_gid = '') {
-
- $x = q("select id from photo where resource_id = '%s' and uid = %d and xchan = '%s' and imgscale = %d limit 1",
- dbesc($rid),
- intval($uid),
- dbesc($xchan),
- intval($scale)
- );
- if(count($x)) {
- $r = q("UPDATE photo
- set aid = %d,
- uid = %d,
- xchan = '%s',
- resource_id = '%s',
- created = '%s',
- edited = '%s',
- filename = '%s',
- mimetype = '%s',
- album = '%s',
- height = %d,
- width = %d,
- content = '%s',
- filesize = %d,
- imgscale = %d,
- photo_usage = %d,
- allow_cid = '%s',
- allow_gid = '%s',
- deny_cid = '%s',
- deny_gid = '%s'
- where id = %d",
-
- intval($aid),
- intval($uid),
- dbesc($xchan),
- dbesc($rid),
- dbesc(datetime_convert()),
- dbesc(datetime_convert()),
- dbesc(basename($filename)),
- dbesc($this->getType()),
- dbesc($album),
- intval($this->getHeight()),
- intval($this->getWidth()),
- dbescbin($this->imageString()),
- intval(strlen($this->imageString())),
- intval($scale),
- intval($photo_usage),
- dbesc($allow_cid),
- dbesc($allow_gid),
- dbesc($deny_cid),
- dbesc($deny_gid),
- intval($x[0]['id'])
- );
- }
- else {
- $r = q("INSERT INTO photo
- ( aid, uid, xchan, resource_id, created, edited, filename, mimetype, album, height, width, content, filesize, imgscale, photo_usage, allow_cid, allow_gid, deny_cid, deny_gid )
- VALUES ( %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', %d, %d, %d, '%s', '%s', '%s', '%s' )",
- intval($aid),
- intval($uid),
- dbesc($xchan),
- dbesc($rid),
- dbesc(datetime_convert()),
- dbesc(datetime_convert()),
- dbesc(basename($filename)),
- dbesc($this->getType()),
- dbesc($album),
- intval($this->getHeight()),
- intval($this->getWidth()),
- dbescbin($this->imageString()),
- intval(strlen($this->imageString())),
- intval($scale),
- intval($photo_usage),
- dbesc($allow_cid),
- dbesc($allow_gid),
- dbesc($deny_cid),
- dbesc($deny_gid)
- );
- }
- return $r;
- }
-
}
diff --git a/include/photos.php b/include/photos.php
index c0f7dc8c4..8a7e49df6 100644
--- a/include/photos.php
+++ b/include/photos.php
@@ -67,8 +67,8 @@ function photo_upload($channel, $observer, $args) {
$os_storage = 0;
- if($args['os_path'] && $args['getimagesize']) {
- $imagedata = @file_get_contents($args['os_path']);
+ if($args['os_syspath'] && $args['getimagesize']) {
+ $imagedata = @file_get_contents($args['os_syspath']);
$filename = $args['filename'];
$filesize = strlen($imagedata);
// this is going to be deleted if it exists
@@ -153,7 +153,7 @@ function photo_upload($channel, $observer, $args) {
return $ret;
}
- $exif = $ph->orient(($args['os_path']) ? $args['os_path'] : $src);
+ $exif = $ph->orient(($args['os_syspath']) ? $args['os_syspath'] : $src);
@unlink($src);
@@ -180,7 +180,8 @@ function photo_upload($channel, $observer, $args) {
'filename' => $filename, 'album' => $album, 'imgscale' => 0, 'photo_usage' => PHOTO_NORMAL,
'allow_cid' => $ac['allow_cid'], 'allow_gid' => $ac['allow_gid'],
'deny_cid' => $ac['deny_cid'], 'deny_gid' => $ac['deny_gid'],
- 'os_storage' => $os_storage, 'os_path' => $args['os_path']
+ 'os_storage' => $os_storage, 'os_syspath' => $args['os_syspath'],
+ 'os_path' => $args['os_path'], 'display_path' => $args['display_path']
);
if($args['created'])
$p['created'] = $args['created'];
@@ -205,7 +206,7 @@ function photo_upload($channel, $observer, $args) {
$errors = true;
unset($p['os_storage']);
- unset($p['os_path']);
+ unset($p['os_syspath']);
if(($width > 1024 || $height > 1024) && (! $errors))
$ph->scaleImage(1024);
@@ -336,19 +337,13 @@ function photo_upload($channel, $observer, $args) {
if($item['mid'] === $item['parent_mid']) {
$item['body'] = $summary;
+ $item['mimetype'] = 'text/bbcode';
$item['obj_type'] = ACTIVITY_OBJ_PHOTO;
$item['obj'] = json_encode($object);
$item['tgt_type'] = ACTIVITY_OBJ_ALBUM;
$item['target'] = json_encode($target);
- if($item['author_xchan'] === $channel['channel_hash']) {
- $item['sig'] = base64url_encode(rsa_sign($item['body'],$channel['channel_prvkey']));
- $item['item_verified'] = 1;
- }
- else {
- $item['sig'] = '';
- }
$force = true;
}
@@ -451,7 +446,7 @@ function photo_upload($channel, $observer, $args) {
* * \e boolean \b success
* * \e array \b albums
*/
-function photos_albums_list($channel, $observer, $sort_key = 'album', $direction = 'asc') {
+function photos_albums_list($channel, $observer, $sort_key = 'display_path', $direction = 'asc') {
$channel_id = $channel['channel_id'];
$observer_xchan = (($observer) ? $observer['xchan_hash'] : '');
@@ -464,17 +459,34 @@ function photos_albums_list($channel, $observer, $sort_key = 'album', $direction
$sort_key = dbesc($sort_key);
$direction = dbesc($direction);
- //$albums = q("SELECT count( distinct resource_id ) as total, album from photo where uid = %d and photo_usage IN ( %d, %d ) $sql_extra group by album order by $sort_key $direction",
- // intval($channel_id),
- // intval(PHOTO_NORMAL),
- // intval(PHOTO_PROFILE)
- //);
-
- // this query provides the same results but might perform better
- $albums = q("SELECT count( distinct resource_id ) as total, album from photo where uid = %d and os_storage = 1 $sql_extra group by album order by $sort_key $direction",
+ $r = q("select display_path, hash from attach where is_dir = 1 and uid = %d $sql_extra order by $sort_key $direction",
intval($channel_id)
);
+ array_unshift($r,[ 'display_path' => '/', 'hash' => '' ]);
+ $str = ids_to_querystr($r,'hash',true);
+
+ $albums = [];
+
+ if($str) {
+ $x = q("select count( distinct hash ) as total, folder from attach where is_photo = 1 and uid = %d and folder in ( $str ) $sql_extra group by folder ",
+ intval($channel_id)
+ );
+ if($x) {
+ require_once('include/attach.php');
+ foreach($r as $rv) {
+ foreach($x as $xv) {
+ if($xv['folder'] === $rv['hash']) {
+ if($xv['total'] != 0 && attach_can_view_folder($channel_id,$observer_xchan,$xv['folder'])) {
+ $albums[] = [ 'album' => $rv['display_path'], 'folder' => $xv['folder'], 'total' => $xv['total'] ];
+ }
+ continue;
+ }
+ }
+ }
+ }
+ }
+
// add various encodings to the array so we can just loop through and pick them out in a template
$ret = array('success' => false);
@@ -485,11 +497,12 @@ function photos_albums_list($channel, $observer, $sort_key = 'album', $direction
foreach($albums as $k => $album) {
$entry = array(
'text' => (($album['album']) ? $album['album'] : '/'),
+ 'shorttext' => (($album['album']) ? ellipsify($album['album'],28) : '/'),
'jstext' => (($album['album']) ? addslashes($album['album']) : '/'),
'total' => $album['total'],
- 'url' => z_root() . '/photos/' . $channel['channel_address'] . '/album/' . bin2hex($album['album']),
+ 'url' => z_root() . '/photos/' . $channel['channel_address'] . '/album/' . $album['folder'],
'urlencode' => urlencode($album['album']),
- 'bin2hex' => bin2hex($album['album'])
+ 'bin2hex' => $album['folder']
);
$ret['albums'][] = $entry;
}
@@ -500,7 +513,7 @@ function photos_albums_list($channel, $observer, $sort_key = 'album', $direction
return $ret;
}
-function photos_album_widget($channelx,$observer,$sortkey = 'album',$direction = 'asc') {
+function photos_album_widget($channelx,$observer,$sortkey = 'display_path',$direction = 'asc') {
$o = '';
@@ -513,6 +526,7 @@ function photos_album_widget($channelx,$observer,$sortkey = 'album',$direction =
$o = replace_macros(get_markup_template('photo_albums.tpl'),array(
'$nick' => $channelx['channel_address'],
'$title' => t('Photo Albums'),
+ '$recent' => t('Recent Photos'),
'$albums' => $albums['albums'],
'$baseurl' => z_root(),
'$upload' => ((perm_is_allowed($channelx['channel_id'],(($observer) ? $observer['xchan_hash'] : ''),'write_storage'))
@@ -570,13 +584,15 @@ function photos_list_photos($channel, $observer, $album = '') {
* @param string $album name of the album
* @return boolean
*/
-function photos_album_exists($channel_id, $album) {
- $r = q("SELECT id FROM photo WHERE album = '%s' AND uid = %d limit 1",
+function photos_album_exists($channel_id, $observer_hash, $album) {
+ $sql_extra = permissions_sql($channel_id,$observer_hash);
+
+ $r = q("SELECT folder, hash, is_dir, filename, os_path, display_path FROM attach WHERE hash = '%s' AND is_dir = 1 AND uid = %d $sql_extra limit 1",
dbesc($album),
intval($channel_id)
);
- return (($r) ? true : false);
+ return (($r) ? $r[0] : false);
}
/**
@@ -609,14 +625,15 @@ function photos_album_rename($channel_id, $oldname, $newname) {
*/
function photos_album_get_db_idstr($channel_id, $album, $remote_xchan = '') {
- if ($remote_xchan) {
- $r = q("SELECT distinct resource_id from photo where xchan = '%s' and uid = %d and album = '%s' ",
+ if($remote_xchan) {
+ $r = q("SELECT hash from attach where creator = '%s' and uid = %d and folder = '%s' ",
dbesc($remote_xchan),
intval($channel_id),
dbesc($album)
);
- } else {
- $r = q("SELECT distinct resource_id from photo where uid = %d and album = '%s' ",
+ }
+ else {
+ $r = q("SELECT hash from attach where uid = %d and folder = '%s' ",
intval($channel_id),
dbesc($album)
);
@@ -624,7 +641,7 @@ function photos_album_get_db_idstr($channel_id, $album, $remote_xchan = '') {
if ($r) {
$arr = array();
foreach ($r as $rr) {
- $arr[] = "'" . dbesc($rr['resource_id']) . "'" ;
+ $arr[] = "'" . dbesc($rr['hash']) . "'" ;
}
$str = implode(',',$arr);
return $str;
diff --git a/include/plugin.php b/include/plugin.php
index 29474735e..db20152ea 100755
--- a/include/plugin.php
+++ b/include/plugin.php
@@ -356,6 +356,7 @@ function get_plugin_info($plugin){
return $info;
$f = file_get_contents("addon/$plugin/$plugin.php");
+ $f = escape_tags($f);
$r = preg_match("|/\*.*\*/|msU", $f, $m);
if ($r){
diff --git a/include/probe.php b/include/probe.php
deleted file mode 100644
index 29635f963..000000000
--- a/include/probe.php
+++ /dev/null
@@ -1,99 +0,0 @@
-<?php /** @file */
-
-
-/**
- * Functions to assist in probing various legacy networks to figure out what kind of capabilities might be present.
- */
-
-
-function net_have_driver($net) {
-
- if(function_exists('net_discover_' . $net))
- return true;
- return false;
-}
-
-function probe_well_known($addr) {
-
- $ret = array();
-
- $ret['src'] = $addr;
-
- if(strpos($addr,'@') !== false) {
- $ret['address'] = $addr;
- }
- else {
- $ret['url'] = $addr;
- }
-
- if(stristr($addr,'facebook.com')) {
- $ret['network'] = 'facebook';
- }
- if(stristr($addr,'google.com')) {
- $ret['network'] = 'google';
- }
- if(stristr($addr,'linkedin.com')) {
- $ret['network'] = 'linkedin';
- }
-
- call_hooks('probe_well_known', $ret);
-
- if(array_key_exists('network',$ret) && net_have_driver($ret['network'])) {
- $fn = 'net_discover_' . $ret['network'];
- $ret = $fn($ret);
- }
-
-
- return $ret;
-
-}
-
-
-
-
-function probe_webfinger($addr) {
-
-
-
-
-
-}
-
-
-function probe_legacy_webfinger($addr) {
-
-
-
-
-}
-
-function probe_zot($addr) {
-
-
-
-}
-
-function probe_dfrn($addr) {
-
-
-}
-
-
-function probe_diaspora($addr) {
-
-
-}
-
-
-function probe_legacy_feed($addr) {
-
-
-
-}
-
-
-function probe_activity_stream($addr) {
-
-
-}
-
diff --git a/include/queue_fn.php b/include/queue_fn.php
index ede6c8f11..c9179b953 100644
--- a/include/queue_fn.php
+++ b/include/queue_fn.php
@@ -146,10 +146,14 @@ function queue_deliver($outq, $immediate = false) {
// your site has existed. Since we don't know for sure what these sites are,
// call them unknown
- q("insert into site (site_url, site_update, site_dead, site_type, site_crypto) values ('%s','%s',0,%d,'') ",
- dbesc($base),
- dbesc(datetime_convert()),
- intval(($outq['outq_driver'] === 'post') ? SITE_TYPE_NOTZOT : SITE_TYPE_UNKNOWN)
+ site_store_lowlevel(
+ [
+ 'site_url' => $base,
+ 'site_update' => datetime_convert(),
+ 'site_dead' => 0,
+ 'site_type' => intval(($outq['outq_driver'] === 'post') ? SITE_TYPE_NOTZOT : SITE_TYPE_UNKNOWN),
+ 'site_crypto' => ''
+ ]
);
}
}
diff --git a/include/security.php b/include/security.php
index b49ceec0d..ddbb3d806 100644
--- a/include/security.php
+++ b/include/security.php
@@ -597,18 +597,24 @@ function stream_perms_api_uids($perms = NULL, $limit = 0, $rand = 0 ) {
$random_sql = (($rand) ? " ORDER BY " . db_getfunc('RAND') . " " : '');
if(local_channel())
$ret[] = local_channel();
- $x = q("select uid from pconfig where cat = 'perm_limits' and k = 'view_stream' and ( v & %d ) > 0 ",
- intval($perms)
- );
+ $x = q("select uid, v from pconfig where cat = 'perm_limits' and k = 'view_stream' ");
if($x) {
- $ids = ids_to_querystr($x,'uid');
- $r = q("select channel_id from channel where channel_id in ( $ids ) and ( channel_pageflags & %d ) = 0 and channel_system = 0 and channel_removed = 0 $random_sql $limit_sql ",
- intval(PAGE_ADULT|PAGE_CENSORED)
- );
- if($r) {
- foreach($r as $rr)
- if(! in_array($rr['channel_id'], $ret))
- $ret[] = $rr['channel_id'];
+ $y = [];
+ foreach($x as $xv) {
+ if(intval($xv['v']) & $perms) {
+ $y[] = $xv;
+ }
+ }
+ if($y) {
+ $ids = ids_to_querystr($y,'uid');
+ $r = q("select channel_id from channel where channel_id in ( $ids ) and ( channel_pageflags & %d ) = 0 and channel_system = 0 and channel_removed = 0 $random_sql $limit_sql ",
+ intval(PAGE_ADULT|PAGE_CENSORED)
+ );
+ if($r) {
+ foreach($r as $rr)
+ if(! in_array($rr['channel_id'], $ret))
+ $ret[] = $rr['channel_id'];
+ }
}
}
@@ -635,19 +641,25 @@ function stream_perms_xchans($perms = NULL ) {
if(local_channel())
$ret[] = get_observer_hash();
- $x = q("select uid from pconfig where cat = 'perm_limits' and k = 'view_stream' and ( v & %d ) > 0 ",
- intval($perms)
- );
+ $x = q("select uid from pconfig where cat = 'perm_limits' and k = 'view_stream' ");
if($x) {
- $ids = ids_to_querystr($x,'uid');
- $r = q("select channel_hash from channel where channel_id in ( $ids ) and ( channel_pageflags & %d ) = 0 and channel_system = 0 and channel_removed = 0 ",
- intval(PAGE_ADULT|PAGE_CENSORED)
- );
+ $y = [];
+ foreach($x as $xv) {
+ if(intval($xv['v']) & $perms) {
+ $y[] = $xv;
+ }
+ }
+ if($y) {
+ $ids = ids_to_querystr($y,'uid');
+ $r = q("select channel_hash from channel where channel_id in ( $ids ) and ( channel_pageflags & %d ) = 0 and channel_system = 0 and channel_removed = 0 ",
+ intval(PAGE_ADULT|PAGE_CENSORED)
+ );
- if($r) {
- foreach($r as $rr)
- if(! in_array($rr['channel_hash'], $ret))
- $ret[] = $rr['channel_hash'];
+ if($r) {
+ foreach($r as $rr)
+ if(! in_array($rr['channel_hash'], $ret))
+ $ret[] = $rr['channel_hash'];
+ }
}
}
$str = '';
diff --git a/include/text.php b/include/text.php
index eb8147f9a..d352a61bf 100644
--- a/include/text.php
+++ b/include/text.php
@@ -3,8 +3,10 @@
* @file include/text.php
*/
-require_once("include/bbcode.php");
+use \Zotlabs\Lib as Zlib;
+use \Michelf\MarkdownExtra;
+require_once("include/bbcode.php");
// random string, there are 86 characters max in text mode, 128 for hex
// output is urlsafe
@@ -88,12 +90,10 @@ function escape_tags($string) {
}
-function z_input_filter($channel_id,$s,$type = 'text/bbcode') {
+function z_input_filter($s,$type = 'text/bbcode',$allow_code = false) {
if($type === 'text/bbcode')
return escape_tags($s);
- if($type === 'text/markdown')
- return escape_tags($s);
if($type == 'text/plain')
return escape_tags($s);
if($type == 'application/x-pdl')
@@ -103,15 +103,15 @@ function z_input_filter($channel_id,$s,$type = 'text/bbcode') {
return $s;
}
- $r = q("select account_id, account_roles, channel_pageflags from account left join channel on channel_account_id = account_id where channel_id = %d limit 1",
- intval($channel_id)
- );
- if($r) {
- if(($r[0]['account_roles'] & ACCOUNT_ROLE_ALLOWCODE) || ($r[0]['channel_pageflags'] & PAGE_ALLOWCODE)) {
- if(local_channel() && (get_account_id() == $r[0]['account_id'])) {
- return $s;
- }
- }
+ if($allow_code) {
+ if($type === 'text/markdown')
+ return htmlspecialchars($s,ENT_QUOTES);
+ return $s;
+ }
+
+ if($type === 'text/markdown') {
+ $x = new Zlib\MarkdownSoap($s);
+ return $x->clean();
}
if($type === 'text/html')
@@ -121,13 +121,23 @@ function z_input_filter($channel_id,$s,$type = 'text/bbcode') {
}
-
+/**
+ * @brief Use HTMLPurifier to get standards compliant HTML.
+ *
+ * Use the <a href="http://htmlpurifier.org/" target="_blank">HTMLPurifier</a>
+ * library to get filtered and standards compliant HTML.
+ *
+ * @see HTMLPurifier
+ *
+ * @param string $s raw HTML
+ * @param boolean $allow_position allow CSS position
+ * @return string standards compliant filtered HTML
+ */
function purify_html($s, $allow_position = false) {
- require_once('library/HTMLPurifier.auto.php');
- require_once('include/html2bbcode.php');
/**
* @FIXME this function has html output, not bbcode - so safely purify these
+ * require_once('include/html2bbcode.php');
* $s = html2bb_video($s);
* $s = oembed_html2bbcode($s);
*/
@@ -136,6 +146,15 @@ function purify_html($s, $allow_position = false) {
$config->set('Cache.DefinitionImpl', null);
$config->set('Attr.EnableID', true);
+ // If enabled, target=blank attributes are added to all links.
+ //$config->set('HTML.TargetBlank', true);
+ //$config->set('Attr.AllowedFrameTargets', ['_blank', '_self', '_parent', '_top']);
+ // restore old behavior of HTMLPurifier < 4.8, only used when targets allowed at all
+ // do not add rel="noreferrer" to all links with target attributes
+ //$config->set('HTML.TargetNoreferrer', false);
+ // do not add noopener rel attributes to links which have a target attribute associated with them
+ //$config->set('HTML.TargetNoopener', false);
+
//Allow some custom data- attributes used by built-in libs.
//In this way members which do not have allowcode set can still use the built-in js libs in webpages to some extent.
@@ -273,7 +292,6 @@ function purify_html($s, $allow_position = false) {
new HTMLPurifier_AttrDef_CSS_Length(),
new HTMLPurifier_AttrDef_CSS_Percentage()
));
-
}
$purifier = new HTMLPurifier($config);
@@ -756,9 +774,9 @@ function activity_match($haystack,$needle) {
}
/**
- * @brief Pull out all #hashtags and @person tags from $s.
+ * @brief Pull out all \#hashtags and \@person tags from $s.
*
- * We also get @person@domain.com - which would make
+ * We also get \@person\@domain.com - which would make
* the regex quite complicated as tags can also
* end a sentence. So we'll run through our results
* and strip the period from any tags which end with one.
@@ -853,6 +871,11 @@ function tag_sort_length($a,$b) {
return((mb_strlen($b) < mb_strlen($a)) ? (-1) : 1);
}
+function total_sort($a,$b) {
+ if($a['total'] == $b['total'])
+ return 0;
+ return(($b['total'] > $a['total']) ? 1 : (-1));
+}
/**
@@ -1143,12 +1166,11 @@ function get_mood_verbs() {
*
* @return Returns array with keys 'texts' and 'icons'
*/
-function list_smilies() {
+function list_smilies($default_only = false) {
$texts = array(
'&lt;3',
'&lt;/3',
- '&lt;\\3',
':-)',
';-)',
':-(',
@@ -1184,7 +1206,6 @@ function list_smilies() {
$icons = array(
'<img class="smiley" src="' . z_root() . '/images/emoticons/smiley-heart.gif" alt="&lt;3" />',
'<img class="smiley" src="' . z_root() . '/images/emoticons/smiley-brokenheart.gif" alt="&lt;/3" />',
- '<img class="smiley" src="' . z_root() . '/images/emoticons/smiley-brokenheart.gif" alt="&lt;\\3" />',
'<img class="smiley" src="' . z_root() . '/images/emoticons/smiley-smile.gif" alt=":-)" />',
'<img class="smiley" src="' . z_root() . '/images/emoticons/smiley-wink.gif" alt=";-)" />',
'<img class="smiley" src="' . z_root() . '/images/emoticons/smiley-frown.gif" alt=":-(" />',
@@ -1218,25 +1239,16 @@ function list_smilies() {
);
- $x = get_config('feature','emoji');
- if($x === false)
- $x = 1;
- if($x) {
- if(! App::$emojitab)
- App::$emojitab = json_decode(file_get_contents('library/emoji.json'),true);
- foreach(App::$emojitab as $e) {
- if(strpos($e['shortname'],':tone') === 0)
- continue;
- $texts[] = $e['shortname'];
- $icons[] = '<img class="smiley emoji" height="16" width="16" src="images/emoji/' . $e['unicode'] . '.png' . '" alt="' . $e['name'] . '" />';
- }
- }
-
$params = array('texts' => $texts, 'icons' => $icons);
+
+ if($default_only)
+ return $params;
+
call_hooks('smilie', $params);
return $params;
}
+
/**
* @brief Replaces text emoticons with graphical images.
*
@@ -1365,20 +1377,7 @@ function link_compare($a, $b) {
function unobscure(&$item) {
- if(array_key_exists('item_obscured',$item) && intval($item['item_obscured'])) {
- $key = get_config('system','prvkey');
- if($item['title'])
- $item['title'] = crypto_unencapsulate(json_decode($item['title'],true),$key);
- if($item['body'])
- $item['body'] = crypto_unencapsulate(json_decode($item['body'],true),$key);
- if(get_config('system','item_cache')) {
- q("update item set title = '%s', body = '%s', item_obscured = 0 where id = %d",
- dbesc($item['title']),
- dbesc($item['body']),
- intval($item['id'])
- );
- }
- }
+ return;
}
function unobscure_mail(&$item) {
@@ -1467,11 +1466,10 @@ function format_hashtags(&$item) {
continue;
if(strpos($item['body'], $t['url']))
continue;
-
if($s)
- $s .= '&nbsp';
+ $s .= ' ';
- $s .= '#<a href="' . zid($t['url']) . '" >' . $term . '</a>';
+ $s .= '<span class="badge badge-pill badge-info"><i class="fa fa-hashtag"></i>&nbsp;<a class="text-white" href="' . zid($t['url']) . '" >' . $term . '</a></span>';
}
}
@@ -1491,11 +1489,9 @@ function format_mentions(&$item) {
continue;
if(strpos($item['body'], $t['url']))
continue;
-
if($s)
- $s .= '&nbsp';
-
- $s .= '@<a href="' . zid($t['url']) . '" >' . $term . '</a>';
+ $s .= ' ';
+ $s .= '<span class="badge badge-pill badge-success"><i class="fa fa-at"></i>&nbsp;<a class="text-white" href="' . zid($t['url']) . '" >' . $term . '</a></span>';
}
}
@@ -1650,8 +1646,8 @@ function prepare_text($text, $content_type = 'text/bbcode', $cache = false) {
break;
case 'text/markdown':
- require_once('library/markdown.php');
- $s = Markdown($text);
+ $text = Zlib\MarkdownSoap::unescape($text);
+ $s = MarkdownExtra::defaultTransform($text);
break;
case 'application/x-pdl';
@@ -1806,23 +1802,9 @@ function mimetype_select($channel_id, $current = 'text/bbcode') {
);
- if(App::$is_sys) {
+ if((App::$is_sys) || (channel_codeallowed($channel_id) && $channel_id == local_channel())){
$x[] = 'application/x-php';
}
- else {
- $r = q("select account_id, account_roles, channel_pageflags from account left join channel on account_id = channel_account_id where
- channel_id = %d limit 1",
- intval($channel_id)
- );
-
- if($r) {
- if(($r[0]['account_roles'] & ACCOUNT_ROLE_ALLOWCODE) || ($r[0]['channel_pageflags'] & PAGE_ALLOWCODE)) {
- if(local_channel() && get_account_id() == $r[0]['account_id']) {
- $x[] = 'application/x-php';
- }
- }
- }
- }
foreach($x as $y) {
$selected = (($y == $current) ? ' selected="selected" ' : '');
@@ -2062,7 +2044,7 @@ function ids_to_array($arr,$idx = 'id') {
$t = array();
if($arr) {
foreach($arr as $x) {
- if(array_key_exists($idx,$x) && strlen($x[$idx]) && (! in_array($x[$idx],$t))) {
+ if(array_key_exists($idx,$x) && strlen($x[$idx]) && (! in_array($x[$idx],$t))) {
$t[] = $x[$idx];
}
}
@@ -2078,7 +2060,7 @@ function ids_to_querystr($arr,$idx = 'id',$quote = false) {
if($arr) {
foreach($arr as $x) {
if(! in_array($x[$idx],$t)) {
- if($quote)
+ if($quote)
$t[] = "'" . dbesc($x[$idx]) . "'";
else
$t[] = $x[$idx];
@@ -2095,7 +2077,7 @@ function ids_to_querystr($arr,$idx = 'id',$quote = false) {
* If $abook is true also include the abook info. This is needed in the API to
* save extra per item lookups there.
*
- * @param array[in,out] &$items
+ * @param[in,out] array &$items
* @param boolean $abook If true also include the abook info
* @param number $effective_uid
*/
@@ -2191,10 +2173,10 @@ function magic_link($s) {
}
/**
- * if $escape is true, dbesc() each element before adding quotes
+ * @brief If $escape is true, dbesc() each element before adding quotes.
*
- * @param array[in,out] &$arr
- * @param boolean $escape default false
+ * @param[in,out] array &$arr
+ * @param boolean $escape (optional) default false
*/
function stringify_array_elms(&$arr, $escape = false) {
for($x = 0; $x < count($arr); $x ++)
@@ -2205,7 +2187,6 @@ function stringify_array_elms(&$arr, $escape = false) {
* @brief Indents a flat JSON string to make it more human-readable.
*
* @param string $json The original JSON string to process.
- *
* @return string Indented version of the original JSON string.
*/
function jindent($json) {
@@ -3058,7 +3039,15 @@ function array2XML($obj, $array) {
}
}
-
+/**
+ * @brief Inserts an array into $table.
+ *
+ * @TODO Why is this function in include/text.php?
+ *
+ * @param string $table
+ * @param array $arr
+ * @return boolean|PDOStatement
+ */
function create_table_from_array($table, $arr) {
if(! ($arr && $table))
@@ -3138,3 +3127,14 @@ function array_escape_tags(&$v,$k) {
$v = escape_tags($v);
}
+function ellipsify($s,$maxlen) {
+ if($maxlen & 1)
+ $maxlen --;
+ if($maxlen < 4)
+ $maxlen = 4;
+
+ if(mb_strlen($s) < $maxlen)
+ return $s;
+
+ return mb_substr($s,0,$maxlen / 2) . '...' . mb_substr($s,mb_strlen($s) - ($maxlen / 2));
+}
diff --git a/include/widgets.php b/include/widgets.php
deleted file mode 100644
index 04cf0d30b..000000000
--- a/include/widgets.php
+++ /dev/null
@@ -1,1721 +0,0 @@
-<?php
-/**
- * @file include/widgets.php
- *
- * @brief This file contains the widgets.
- */
-
-require_once('include/dir_fns.php');
-require_once('include/contact_widgets.php');
-require_once('include/attach.php');
-
-
-function widget_profile($args) {
-
- $block = observer_prohibited();
- return profile_sidebar(App::$profile, $block, true);
-}
-
-function widget_zcard($args) {
-
- $block = observer_prohibited();
- $channel = channelx_by_n(App::$profile_uid);
- return get_zcard($channel,get_observer_hash(),array('width' => 875));
-}
-
-
-
-
-// FIXME The problem with the next widget is that we don't have a search function for webpages that we can send the links to.
-// Then we should also provide an option to search webpages and conversations.
-
-function widget_tagcloud($args) {
-
- $o = '';
- //$tab = 0;
-
- $uid = App::$profile_uid;
- $count = ((x($args,'count')) ? intval($args['count']) : 24);
- $flags = 0;
- $type = TERM_CATEGORY;
-
- // FIXME there exists no $authors variable
- $r = tagadelic($uid, $count, $authors, $owner, $flags, ITEM_TYPE_WEBPAGE, $type);
-
- if($r) {
- $o = '<div class="tagblock widget"><h3>' . t('Categories') . '</h3><div class="tags" align="center">';
- foreach($r as $rr) {
- $o .= '<span class="tag'.$rr[2].'">'.$rr[0].'</span> ' . "\r\n";
- }
- $o .= '</div></div>';
- }
- return $o;
-}
-
-function widget_collections($args) {
- require_once('include/group.php');
-
- $mode = ((array_key_exists('mode',$args)) ? $args['mode'] : 'conversation');
- switch($mode) {
- case 'conversation':
- $every = argv(0);
- $each = argv(0);
- $edit = true;
- $current = $_REQUEST['gid'];
- $abook_id = 0;
- $wmode = 0;
- break;
- case 'connections':
- $every = 'connections';
- $each = 'group';
- $edit = true;
- $current = $_REQUEST['gid'];
- $abook_id = 0;
- $wmode = 0;
- case 'groups':
- $every = 'connections';
- $each = argv(0);
- $edit = false;
- $current = intval(argv(1));
- $abook_id = 0;
- $wmode = 1;
- break;
- case 'abook':
- $every = 'connections';
- $each = 'group';
- $edit = false;
- $current = 0;
- $abook_id = App::$poi['abook_xchan'];
- $wmode = 1;
- break;
- default:
- return '';
- break;
- }
-
- return group_side($every, $each, $edit, $current, $abook_id, $wmode);
-}
-
-function widget_suggestions($arr) {
-
- if((! local_channel()) || (! feature_enabled(local_channel(),'suggest')))
- return '';
-
- require_once('include/socgraph.php');
-
- $r = suggestion_query(local_channel(),get_observer_hash(),0,20);
-
- if(! $r) {
- return;
- }
-
- $arr = array();
-
- // Get two random entries from the top 20 returned.
- // We'll grab the first one and the one immediately following.
- // This will throw some entropy intot he situation so you won't
- // be looking at the same two mug shots every time the widget runs
-
- $index = ((count($r) > 2) ? mt_rand(0,count($r) - 2) : 0);
-
- for($x = $index; $x <= ($index+1); $x ++) {
- $rr = $r[$x];
- if(! $rr['xchan_url'])
- break;
-
- $connlnk = z_root() . '/follow/?url=' . $rr['xchan_addr'];
-
- $arr[] = array(
- 'url' => chanlink_url($rr['xchan_url']),
- 'profile' => $rr['xchan_url'],
- 'name' => $rr['xchan_name'],
- 'photo' => $rr['xchan_photo_m'],
- 'ignlnk' => z_root() . '/directory?ignore=' . $rr['xchan_hash'],
- 'conntxt' => t('Connect'),
- 'connlnk' => $connlnk,
- 'ignore' => t('Ignore/Hide')
- );
- }
-
- $o = replace_macros(get_markup_template('suggest_widget.tpl'),array(
- '$title' => t('Suggestions'),
- '$more' => t('See more...'),
- '$entries' => $arr
- ));
-
- return $o;
-}
-
-
-function widget_follow($args) {
- if(! local_channel())
- return '';
-
- $uid = App::$channel['channel_id'];
- $r = q("select count(*) as total from abook where abook_channel = %d and abook_self = 0 ",
- intval($uid)
- );
- if($r)
- $total_channels = $r[0]['total'];
- $limit = service_class_fetch($uid,'total_channels');
- if($limit !== false) {
- $abook_usage_message = sprintf( t("You have %1$.0f of %2$.0f allowed connections."), $total_channels, $limit);
- }
- else {
- $abook_usage_message = '';
- }
- return replace_macros(get_markup_template('follow.tpl'),array(
- '$connect' => t('Add New Connection'),
- '$desc' => t('Enter channel address'),
- '$hint' => t('Examples: bob@example.com, https://example.com/barbara'),
- '$follow' => t('Connect'),
- '$abook_usage_message' => $abook_usage_message
- ));
-}
-
-
-function widget_notes($arr) {
- if(! local_channel())
- return '';
- if(! feature_enabled(local_channel(),'private_notes'))
- return '';
-
- $text = get_pconfig(local_channel(),'notes','text');
-
- $o = replace_macros(get_markup_template('notes.tpl'), array(
- '$banner' => t('Notes'),
- '$text' => $text,
- '$save' => t('Save'),
- ));
-
- return $o;
-}
-
-
-function widget_savedsearch($arr) {
- if((! local_channel()) || (! feature_enabled(local_channel(),'savedsearch')))
- return '';
-
- $search = ((x($_GET,'netsearch')) ? $_GET['netsearch'] : '');
- if(! $search)
- $search = ((x($_GET,'search')) ? $_GET['search'] : '');
-
- if(x($_GET,'searchsave') && $search) {
- $r = q("select * from term where uid = %d and ttype = %d and term = '%s' limit 1",
- intval(local_channel()),
- intval(TERM_SAVEDSEARCH),
- dbesc($search)
- );
- if(! $r) {
- q("insert into term ( uid,ttype,term ) values ( %d, %d, '%s') ",
- intval(local_channel()),
- intval(TERM_SAVEDSEARCH),
- dbesc($search)
- );
- }
- }
-
- if(x($_GET,'searchremove') && $search) {
- q("delete from term where uid = %d and ttype = %d and term = '%s'",
- intval(local_channel()),
- intval(TERM_SAVEDSEARCH),
- dbesc($search)
- );
- $search = '';
- }
-
- $srchurl = App::$query_string;
-
- $srchurl = rtrim(preg_replace('/searchsave\=[^\&].*?(\&|$)/is','',$srchurl),'&');
- $hasq = ((strpos($srchurl,'?') !== false) ? true : false);
- $srchurl = rtrim(preg_replace('/searchremove\=[^\&].*?(\&|$)/is','',$srchurl),'&');
-
- $srchurl = rtrim(preg_replace('/search\=[^\&].*?(\&|$)/is','',$srchurl),'&');
- $srchurl = rtrim(preg_replace('/submit\=[^\&].*?(\&|$)/is','',$srchurl),'&');
- $srchurl = str_replace(array('?f=','&f='),array('',''),$srchurl);
-
-
- $hasq = ((strpos($srchurl,'?') !== false) ? true : false);
- $hasamp = ((strpos($srchurl,'&') !== false) ? true : false);
-
- if(($hasamp) && (! $hasq))
- $srchurl = substr($srchurl,0,strpos($srchurl,'&')) . '?f=&' . substr($srchurl,strpos($srchurl,'&')+1);
-
- $o = '';
-
- $r = q("select tid,term from term WHERE uid = %d and ttype = %d ",
- intval(local_channel()),
- intval(TERM_SAVEDSEARCH)
- );
-
- $saved = array();
-
- if(count($r)) {
- foreach($r as $rr) {
- $saved[] = array(
- 'id' => $rr['tid'],
- 'term' => $rr['term'],
- 'dellink' => z_root() . '/' . $srchurl . (($hasq || $hasamp) ? '' : '?f=') . '&amp;searchremove=1&amp;search=' . urlencode($rr['term']),
- 'srchlink' => z_root() . '/' . $srchurl . (($hasq || $hasamp) ? '' : '?f=') . '&amp;search=' . urlencode($rr['term']),
- 'displayterm' => htmlspecialchars($rr['term'], ENT_COMPAT,'UTF-8'),
- 'encodedterm' => urlencode($rr['term']),
- 'delete' => t('Remove term'),
- 'selected' => ($search==$rr['term']),
- );
- }
- }
-
- $tpl = get_markup_template("saved_searches.tpl");
- $o = replace_macros($tpl, array(
- '$title' => t('Saved Searches'),
- '$add' => t('add'),
- '$searchbox' => searchbox($search, 'netsearch-box', $srchurl . (($hasq) ? '' : '?f='), true),
- '$saved' => $saved,
- ));
-
- return $o;
-}
-
-function widget_sitesearch($arr) {
-
- $search = ((x($_GET,'search')) ? $_GET['search'] : '');
-
- $srchurl = App::$query_string;
-
- $srchurl = rtrim(preg_replace('/search\=[^\&].*?(\&|$)/is','',$srchurl),'&');
- $srchurl = rtrim(preg_replace('/submit\=[^\&].*?(\&|$)/is','',$srchurl),'&');
- $srchurl = str_replace(array('?f=','&f='),array('',''),$srchurl);
-
-
- $hasq = ((strpos($srchurl,'?') !== false) ? true : false);
- $hasamp = ((strpos($srchurl,'&') !== false) ? true : false);
-
- if(($hasamp) && (! $hasq))
- $srchurl = substr($srchurl,0,strpos($srchurl,'&')) . '?f=&' . substr($srchurl,strpos($srchurl,'&')+1);
-
- $o = '';
-
- $saved = array();
-
- $tpl = get_markup_template("sitesearch.tpl");
- $o = replace_macros($tpl, array(
- '$title' => t('Search'),
- '$searchbox' => searchbox($search, 'netsearch-box', $srchurl . (($hasq) ? '' : '?f='), false),
- '$saved' => $saved,
- ));
-
- return $o;
-}
-
-
-
-
-
-function widget_filer($arr) {
- if(! local_channel())
- return '';
-
-
- $selected = ((x($_REQUEST,'file')) ? $_REQUEST['file'] : '');
-
- $terms = array();
- $r = q("select distinct term from term where uid = %d and ttype = %d order by term asc",
- intval(local_channel()),
- intval(TERM_FILE)
- );
- if(! $r)
- return;
-
- foreach($r as $rr)
- $terms[] = array('name' => $rr['term'], 'selected' => (($selected == $rr['term']) ? 'selected' : ''));
-
- return replace_macros(get_markup_template('fileas_widget.tpl'),array(
- '$title' => t('Saved Folders'),
- '$desc' => '',
- '$sel_all' => (($selected == '') ? 'selected' : ''),
- '$all' => t('Everything'),
- '$terms' => $terms,
- '$base' => z_root() . '/' . App::$cmd
- ));
-}
-
-function widget_archive($arr) {
-
- $o = '';
-
- if(! App::$profile_uid) {
- return '';
- }
-
- $uid = App::$profile_uid;
-
- if(! feature_enabled($uid,'archives'))
- return '';
-
- if(! perm_is_allowed($uid,get_observer_hash(),'view_stream'))
- return '';
-
- $wall = ((array_key_exists('wall', $arr)) ? intval($arr['wall']) : 0);
- $style = ((array_key_exists('style', $arr)) ? $arr['style'] : 'select');
- $showend = ((get_pconfig($uid,'system','archive_show_end_date')) ? true : false);
- $mindate = get_pconfig($uid,'system','archive_mindate');
- $visible_years = get_pconfig($uid,'system','archive_visible_years');
- if(! $visible_years)
- $visible_years = 5;
-
- $url = z_root() . '/' . App::$cmd;
-
- $ret = list_post_dates($uid,$wall,$mindate);
-
- if(! count($ret))
- return '';
-
- $cutoff_year = intval(datetime_convert('',date_default_timezone_get(),'now','Y')) - $visible_years;
- $cutoff = ((array_key_exists($cutoff_year,$ret))? true : false);
-
- $o = replace_macros(get_markup_template('posted_date_widget.tpl'),array(
- '$title' => t('Archives'),
- '$size' => $visible_years,
- '$cutoff_year' => $cutoff_year,
- '$cutoff' => $cutoff,
- '$url' => $url,
- '$style' => $style,
- '$showend' => $showend,
- '$dates' => $ret
- ));
- return $o;
-}
-
-
-function widget_fullprofile($arr) {
-
- if(! App::$profile['profile_uid'])
- return;
-
- $block = observer_prohibited();
-
- return profile_sidebar(App::$profile, $block);
-}
-
-function widget_shortprofile($arr) {
-
- if(! App::$profile['profile_uid'])
- return;
-
- $block = observer_prohibited();
-
- return profile_sidebar(App::$profile, $block, true, true);
-}
-
-
-function widget_categories($arr) {
-
-
- if(App::$profile['profile_uid'] && (! perm_is_allowed(App::$profile['profile_uid'],get_observer_hash(),'view_stream')))
- return '';
-
- $cat = ((x($_REQUEST,'cat')) ? htmlspecialchars($_REQUEST['cat'],ENT_COMPAT,'UTF-8') : '');
- $srchurl = App::$query_string;
- $srchurl = rtrim(preg_replace('/cat\=[^\&].*?(\&|$)/is','',$srchurl),'&');
- $srchurl = str_replace(array('?f=','&f='),array('',''),$srchurl);
-
- return categories_widget($srchurl, $cat);
-
-}
-
-function widget_appcategories($arr) {
-
- if(! local_channel())
- return '';
-
- $selected = ((x($_REQUEST,'cat')) ? htmlspecialchars($_REQUEST['cat'],ENT_COMPAT,'UTF-8') : '');
-
- $srchurl = rtrim(preg_replace('/cat\=[^\&].*?(\&|$)/is','',$srchurl),'&');
- $srchurl = str_replace(array('?f=','&f='),array('',''),$srchurl);
-
- $srchurl = z_root() . '/apps';
-
- $terms = array();
-
- $r = q("select distinct(term.term)
- from term join app on term.oid = app.id
- where app_channel = %d
- and term.uid = app_channel
- and term.otype = %d
- and term.term != 'nav_featured_app'
- order by term.term asc",
- intval(local_channel()),
- intval(TERM_OBJ_APP)
- );
- if($r) {
- foreach($r as $rr)
- $terms[] = array('name' => $rr['term'], 'selected' => (($selected == $rr['term']) ? 'selected' : ''));
-
- return replace_macros(get_markup_template('categories_widget.tpl'),array(
- '$title' => t('Categories'),
- '$desc' => '',
- '$sel_all' => (($selected == '') ? 'selected' : ''),
- '$all' => t('Everything'),
- '$terms' => $terms,
- '$base' => $srchurl,
-
- ));
- }
-
-
-
-}
-
-
-
-function widget_appcloud($arr) {
- if(! local_channel())
- return '';
- return app_tagblock(z_root() . '/apps');
-}
-
-
-function widget_tagcloud_wall($arr) {
-
-
- if((! App::$profile['profile_uid']) || (! App::$profile['channel_hash']))
- return '';
- if(! perm_is_allowed(App::$profile['profile_uid'], get_observer_hash(), 'view_stream'))
- return '';
-
- $limit = ((array_key_exists('limit', $arr)) ? intval($arr['limit']) : 50);
- if(feature_enabled(App::$profile['profile_uid'], 'tagadelic'))
- return wtagblock(App::$profile['profile_uid'], $limit, '', App::$profile['channel_hash'], 'wall');
-
- return '';
-}
-
-function widget_catcloud_wall($arr) {
-
-
- if((! App::$profile['profile_uid']) || (! App::$profile['channel_hash']))
- return '';
- if(! perm_is_allowed(App::$profile['profile_uid'], get_observer_hash(), 'view_stream'))
- return '';
-
- $limit = ((array_key_exists('limit',$arr)) ? intval($arr['limit']) : 50);
-
- return catblock(App::$profile['profile_uid'], $limit, '', App::$profile['channel_hash'], 'wall');
-}
-
-
-function widget_affinity($arr) {
-
- if(! local_channel())
- return '';
-
- // Get default cmin value from pconfig, but allow GET parameter to override
- $cmin = intval(get_pconfig(local_channel(),'affinity','cmin'));
- $cmin = (($cmin) ? $cmin : 0);
- $cmin = ((x($_REQUEST,'cmin')) ? intval($_REQUEST['cmin']) : $cmin);
-
- // Get default cmax value from pconfig, but allow GET parameter to override
- $cmax = intval(get_pconfig(local_channel(),'affinity','cmax'));
- $cmax = (($cmax) ? $cmax : 99);
- $cmax = ((x($_REQUEST,'cmax')) ? intval($_REQUEST['cmax']) : $cmax);
-
-
- if(feature_enabled(local_channel(),'affinity')) {
-
- $labels = array(
- t('Me'),
- t('Family'),
- t('Friends'),
- t('Acquaintances'),
- t('All')
- );
- call_hooks('affinity_labels',$labels);
- $label_str = '';
-
- if($labels) {
- foreach($labels as $l) {
- if($label_str) {
- $label_str .= ", '|'";
- $label_str .= ", '" . $l . "'";
- }
- else
- $label_str .= "'" . $l . "'";
- }
- }
-
- $tpl = get_markup_template('main_slider.tpl');
- $x = replace_macros($tpl,array(
- '$val' => $cmin . ',' . $cmax,
- '$refresh' => t('Refresh'),
- '$labels' => $label_str,
- ));
- $arr = array('html' => $x);
- call_hooks('main_slider',$arr);
- return $arr['html'];
- }
-
- return '';
-}
-
-
-function widget_settings_menu($arr) {
-
- if(! local_channel())
- return;
-
-
- $channel = App::get_channel();
-
- $abook_self_id = 0;
-
- // Retrieve the 'self' address book entry for use in the auto-permissions link
-
- $role = get_pconfig(local_channel(),'system','permissions_role');
-
- $abk = q("select abook_id from abook where abook_channel = %d and abook_self = 1 limit 1",
- intval(local_channel())
- );
- if($abk)
- $abook_self_id = $abk[0]['abook_id'];
-
- $x = q("select count(*) as total from hubloc where hubloc_hash = '%s' and hubloc_deleted = 0 ",
- dbesc($channel['channel_hash'])
- );
-
- $hublocs = (($x && $x[0]['total'] > 1) ? true : false);
-
- $tabs = array(
- array(
- 'label' => t('Account settings'),
- 'url' => z_root().'/settings/account',
- 'selected' => ((argv(1) === 'account') ? 'active' : ''),
- ),
-
- array(
- 'label' => t('Channel settings'),
- 'url' => z_root().'/settings/channel',
- 'selected' => ((argv(1) === 'channel') ? 'active' : ''),
- ),
-
- );
-
- if(get_account_techlevel() > 0 && get_features()) {
- $tabs[] = array(
- 'label' => t('Additional features'),
- 'url' => z_root().'/settings/features',
- 'selected' => ((argv(1) === 'features') ? 'active' : ''),
- );
- }
-
- $tabs[] = array(
- 'label' => t('Feature/Addon settings'),
- 'url' => z_root().'/settings/featured',
- 'selected' => ((argv(1) === 'featured') ? 'active' : ''),
- );
-
- $tabs[] = array(
- 'label' => t('Display settings'),
- 'url' => z_root().'/settings/display',
- 'selected' => ((argv(1) === 'display') ? 'active' : ''),
- );
-
- if($hublocs) {
- $tabs[] = array(
- 'label' => t('Manage locations'),
- 'url' => z_root() . '/locs',
- 'selected' => ((argv(1) === 'locs') ? 'active' : ''),
- );
- }
-
- $tabs[] = array(
- 'label' => t('Export channel'),
- 'url' => z_root() . '/uexport',
- 'selected' => ''
- );
-
- $tabs[] = array(
- 'label' => t('Connected apps'),
- 'url' => z_root() . '/settings/oauth',
- 'selected' => ((argv(1) === 'oauth') ? 'active' : ''),
- );
-
- if(get_account_techlevel() > 2) {
- $tabs[] = array(
- 'label' => t('Guest Access Tokens'),
- 'url' => z_root() . '/settings/tokens',
- 'selected' => ((argv(1) === 'tokens') ? 'active' : ''),
- );
- }
-
- if(feature_enabled(local_channel(),'permcats')) {
- $tabs[] = array(
- 'label' => t('Permission Groups'),
- 'url' => z_root() . '/settings/permcats',
- 'selected' => ((argv(1) === 'permcats') ? 'active' : ''),
- );
- }
-
-
- if($role === false || $role === 'custom') {
- $tabs[] = array(
- 'label' => t('Connection Default Permissions'),
- 'url' => z_root() . '/connedit/' . $abook_self_id,
- 'selected' => ''
- );
- }
-
- if(feature_enabled(local_channel(),'premium_channel')) {
- $tabs[] = array(
- 'label' => t('Premium Channel Settings'),
- 'url' => z_root() . '/connect/' . $channel['channel_address'],
- 'selected' => ''
- );
- }
-
- if(feature_enabled(local_channel(),'channel_sources')) {
- $tabs[] = array(
- 'label' => t('Channel Sources'),
- 'url' => z_root() . '/sources',
- 'selected' => ''
- );
- }
-
- $tabtpl = get_markup_template("generic_links_widget.tpl");
- return replace_macros($tabtpl, array(
- '$title' => t('Settings'),
- '$class' => 'settings-widget',
- '$items' => $tabs,
- ));
-}
-
-
-function widget_mailmenu($arr) {
- if (! local_channel())
- return;
-
-
- return replace_macros(get_markup_template('message_side.tpl'), array(
- '$title' => t('Private Mail Menu'),
- '$combined'=>array(
- 'label' => t('Combined View'),
- 'url' => z_root() . '/mail/combined',
- 'sel' => (argv(1) == 'combined'),
- ),
- '$inbox'=>array(
- 'label' => t('Inbox'),
- 'url' => z_root() . '/mail/inbox',
- 'sel' => (argv(1) == 'inbox'),
- ),
- '$outbox'=>array(
- 'label' => t('Outbox'),
- 'url' => z_root() . '/mail/outbox',
- 'sel' => (argv(1) == 'outbox'),
- ),
- '$new'=>array(
- 'label' => t('New Message'),
- 'url' => z_root() . '/mail/new',
- 'sel'=> (argv(1) == 'new'),
- )
- ));
-}
-
-
-function widget_conversations($arr) {
- if (! local_channel())
- return;
-
- if(argc() > 1) {
-
- switch(argv(1)) {
- case 'combined':
- $mailbox = 'combined';
- $header = t('Conversations');
- break;
- case 'inbox':
- $mailbox = 'inbox';
- $header = t('Received Messages');
- break;
- case 'outbox':
- $mailbox = 'outbox';
- $header = t('Sent Messages');
- break;
- default:
- $mailbox = 'combined';
- $header = t('Conversations');
- break;
- }
-
- require_once('include/message.php');
-
- // private_messages_list() can do other more complicated stuff, for now keep it simple
- $r = private_messages_list(local_channel(), $mailbox, App::$pager['start'], App::$pager['itemspage']);
-
- if(! $r) {
- info( t('No messages.') . EOL);
- return $o;
- }
-
- $messages = array();
-
- foreach($r as $rr) {
-
- $messages[] = array(
- 'mailbox' => $mailbox,
- 'id' => $rr['id'],
- 'from_name' => $rr['from']['xchan_name'],
- 'from_url' => chanlink_hash($rr['from_xchan']),
- 'from_photo' => $rr['from']['xchan_photo_s'],
- 'to_name' => $rr['to']['xchan_name'],
- 'to_url' => chanlink_hash($rr['to_xchan']),
- 'to_photo' => $rr['to']['xchan_photo_s'],
- 'subject' => (($rr['seen']) ? $rr['title'] : '<strong>' . $rr['title'] . '</strong>'),
- 'delete' => t('Delete conversation'),
- 'body' => $rr['body'],
- 'date' => datetime_convert('UTC',date_default_timezone_get(),$rr['created'], 'c'),
- 'seen' => $rr['seen'],
- 'selected' => ((argv(2)) ? (argv(2) == $rr['id']) : ($r[0]['id'] == $rr['id']))
- );
- }
-
- $tpl = get_markup_template('mail_head.tpl');
- $o .= replace_macros($tpl, array(
- '$header' => $header,
- '$messages' => $messages
- ));
-
- //$o .= alt_pager($a,count($r));
-
- }
-
- return $o;
-}
-
-function widget_eventstools($arr) {
- if (! local_channel())
- return;
-
- return replace_macros(get_markup_template('events_tools_side.tpl'), array(
- '$title' => t('Events Tools'),
- '$export' => t('Export Calendar'),
- '$import' => t('Import Calendar'),
- '$submit' => t('Submit')
- ));
-}
-
-function widget_design_tools($arr) {
-
- // mod menu doesn't load a profile. For any modules which load a profile, check it.
- // otherwise local_channel() is sufficient for permissions.
-
- if(App::$profile['profile_uid'])
- if((App::$profile['profile_uid'] != local_channel()) && (! App::$is_sys))
- return '';
-
- if(! local_channel())
- return '';
-
- return design_tools();
-}
-
-function widget_website_portation_tools($arr) {
-
- // mod menu doesn't load a profile. For any modules which load a profile, check it.
- // otherwise local_channel() is sufficient for permissions.
-
- if(App::$profile['profile_uid'])
- if((App::$profile['profile_uid'] != local_channel()) && (! App::$is_sys))
- return '';
-
- if(! local_channel())
- return '';
-
- return website_portation_tools();
-}
-
-function widget_findpeople($arr) {
- return findpeople_widget();
-}
-
-
-function widget_photo_albums($arr) {
-
- if(! App::$profile['profile_uid'])
- return '';
- $channelx = channelx_by_n(App::$profile['profile_uid']);
- if((! $channelx) || (! perm_is_allowed(App::$profile['profile_uid'], get_observer_hash(), 'view_storage')))
- return '';
- require_once('include/photos.php');
- $sortkey = ((array_key_exists('sortkey',$arr)) ? $arr['sortkey'] : 'album');
- $direction = ((array_key_exists('direction',$arr)) ? $arr['direction'] : 'asc');
-
- return photos_album_widget($channelx, App::get_observer(),$sortkey,$direction);
-}
-
-
-function widget_vcard($arr) {
- return vcard_from_xchan('', App::get_observer());
-}
-
-
-/*
- * The following directory widgets are only useful on the directory page
- */
-
-
-function widget_dirsort($arr) {
- return dir_sort_links();
-}
-
-function widget_dirtags($arr) {
- return dir_tagblock(z_root() . '/directory', null);
-}
-
-function widget_menu_preview($arr) {
- if(! App::$data['menu_item'])
- return;
- require_once('include/menu.php');
-
- return menu_render(App::$data['menu_item']);
-}
-
-function widget_chatroom_list($arr) {
-
-
- $r = Zotlabs\Lib\Chatroom::roomlist(App::$profile['profile_uid']);
-
- if($r) {
- return replace_macros(get_markup_template('chatroomlist.tpl'), array(
- '$header' => t('Chatrooms'),
- '$baseurl' => z_root(),
- '$nickname' => App::$profile['channel_address'],
- '$items' => $r,
- '$overview' => t('Overview')
- ));
- }
-}
-
-function widget_chatroom_members() {
- $o = replace_macros(get_markup_template('chatroom_members.tpl'), array(
- '$header' => t('Chat Members')
- ));
-
- return $o;
-}
-
-function widget_wiki_list($arr) {
-
- $channel = channelx_by_n(App::$profile_uid);
-
- $wikis = Zotlabs\Lib\NativeWiki::listwikis($channel,get_observer_hash());
-
- if($wikis) {
- return replace_macros(get_markup_template('wikilist_widget.tpl'), array(
- '$header' => t('Wiki List'),
- '$channel' => $channel['channel_address'],
- '$wikis' => $wikis['wikis']
- ));
- }
- return '';
-}
-
-function widget_wiki_pages($arr) {
-
- $channelname = ((array_key_exists('channel',$arr)) ? $arr['channel'] : '');
- $c = channelx_by_nick($channelname);
-
- $wikiname = '';
- if (array_key_exists('refresh', $arr)) {
- $not_refresh = (($arr['refresh']=== true) ? false : true);
- } else {
- $not_refresh = true;
- }
- $pages = array();
- if (! array_key_exists('resource_id', $arr)) {
- $hide = true;
- } else {
- $p = Zotlabs\Lib\NativeWikiPage::page_list($c['channel_id'],get_observer_hash(),$arr['resource_id']);
-
- if($p['pages']) {
- $pages = $p['pages'];
- $w = $p['wiki'];
- // Wiki item record is $w['wiki']
- $wikiname = $w['urlName'];
- if (!$wikiname) {
- $wikiname = '';
- }
- }
- }
- $can_create = perm_is_allowed(\App::$profile['uid'],get_observer_hash(),'write_wiki');
-
- $can_delete = ((local_channel() && (local_channel() == \App::$profile['uid'])) ? true : false);
-
- return replace_macros(get_markup_template('wiki_page_list.tpl'), array(
- '$hide' => $hide,
- '$resource_id' => $arr['resource_id'],
- '$not_refresh' => $not_refresh,
- '$header' => t('Wiki Pages'),
- '$channel' => $channelname,
- '$wikiname' => $wikiname,
- '$pages' => $pages,
- '$canadd' => $can_create,
- '$candel' => $can_delete,
- '$addnew' => t('Add new page'),
- '$pageName' => array('pageName', t('Page name')),
- ));
-}
-
-function widget_wiki_page_history($arr) {
-
- $pageUrlName = ((array_key_exists('pageUrlName', $arr)) ? $arr['pageUrlName'] : '');
- $resource_id = ((array_key_exists('resource_id', $arr)) ? $arr['resource_id'] : '');
-
- $pageHistory = Zotlabs\Lib\NativeWikiPage::page_history(array('channel_id' => App::$profile_uid, 'observer_hash' => get_observer_hash(), 'resource_id' => $resource_id, 'pageUrlName' => $pageUrlName));
- return replace_macros(get_markup_template('nwiki_page_history.tpl'), array(
- '$pageHistory' => $pageHistory['history'],
- '$permsWrite' => $arr['permsWrite'],
- '$name_lbl' => t('Name'),
- '$msg_label' => t('Message','wiki_history')
- ));
-
-}
-
-function widget_bookmarkedchats($arr) {
-
- if(! feature_enabled(App::$profile['profile_uid'],'ajaxchat'))
- return '';
-
- $h = get_observer_hash();
- if(! $h)
- return;
- $r = q("select xchat_url, xchat_desc from xchat where xchat_xchan = '%s' order by xchat_desc",
- dbesc($h)
- );
- if($r) {
- for($x = 0; $x < count($r); $x ++) {
- $r[$x]['xchat_url'] = zid($r[$x]['xchat_url']);
- }
- }
- return replace_macros(get_markup_template('bookmarkedchats.tpl'),array(
- '$header' => t('Bookmarked Chatrooms'),
- '$rooms' => $r
- ));
-}
-
-function widget_suggestedchats($arr) {
-
- if(! feature_enabled(App::$profile['profile_uid'],'ajaxchat'))
- return '';
-
- // There are reports that this tool does not ever remove chatrooms on dead sites,
- // and also will happily link to private chats which you cannot enter.
- // For those reasons, it will be disabled until somebody decides it's worth
- // fixing and comes up with a plan for doing so.
-
- return '';
-
-
- // probably should restrict this to your friends, but then the widget will only work
- // if you are logged in locally.
-
- $h = get_observer_hash();
- if(! $h)
- return;
- $r = q("select xchat_url, xchat_desc, count(xchat_xchan) as total from xchat group by xchat_url, xchat_desc order by total desc, xchat_desc limit 24");
- if($r) {
- for($x = 0; $x < count($r); $x ++) {
- $r[$x]['xchat_url'] = zid($r[$x]['xchat_url']);
- }
- }
- return replace_macros(get_markup_template('bookmarkedchats.tpl'),array(
- '$header' => t('Suggested Chatrooms'),
- '$rooms' => $r
- ));
-}
-
-function widget_item($arr) {
-
- $channel_id = 0;
- if(array_key_exists('channel_id',$arr) && intval($arr['channel_id']))
- $channel_id = intval($arr['channel_id']);
- if(! $channel_id)
- $channel_id = App::$profile_uid;
- if(! $channel_id)
- return '';
-
-
- if((! $arr['mid']) && (! $arr['title']))
- return '';
-
- if(! perm_is_allowed($channel_id, get_observer_hash(), 'view_pages'))
- return '';
-
- require_once('include/security.php');
- $sql_extra = item_permissions_sql($channel_id);
-
- if($arr['title']) {
- $r = q("select item.* from item left join iconfig on item.id = iconfig.iid
- where item.uid = %d and iconfig.cat = 'system' and iconfig.v = '%s'
- and iconfig.k = 'WEBPAGE' and item_type = %d $sql_options $revision limit 1",
- intval($channel_id),
- dbesc($arr['title']),
- intval(ITEM_TYPE_WEBPAGE)
- );
- }
- else {
- $r = q("select * from item where mid = '%s' and uid = %d and item_type = " . intval(ITEM_TYPE_WEBPAGE) . " $sql_extra limit 1",
- dbesc($arr['mid']),
- intval($channel_id)
- );
- }
-
- if(! $r)
- return '';
-
- xchan_query($r);
- $r = fetch_post_tags($r, true);
-
- $o = prepare_page($r[0]);
- return $o;
-}
-
-function widget_clock($arr) {
-
- $miltime = 0;
- if(isset($arr['military']) && $arr['military'])
- $miltime = 1;
-
-$o = <<< EOT
-<div class="widget">
-<h3 class="clockface"></h3>
-<script>
-
-var timerID = null
-var timerRunning = false
-
-function stopclock(){
- if(timerRunning)
- clearTimeout(timerID)
- timerRunning = false
-}
-
-function startclock(){
- stopclock()
- showtime()
-}
-
-function showtime(){
- var now = new Date()
- var hours = now.getHours()
- var minutes = now.getMinutes()
- var seconds = now.getSeconds()
- var military = $miltime
- var timeValue = ""
- if(military)
- timeValue = hours
- else
- timeValue = ((hours > 12) ? hours - 12 : hours)
- timeValue += ((minutes < 10) ? ":0" : ":") + minutes
-// timeValue += ((seconds < 10) ? ":0" : ":") + seconds
- if(! military)
- timeValue += (hours >= 12) ? " P.M." : " A.M."
- $('.clockface').html(timeValue)
- timerID = setTimeout("showtime()",1000)
- timerRunning = true
-}
-
-$(document).ready(function() {
- startclock();
-});
-
-</script>
-</div>
-EOT;
-return $o;
-
-}
-
-/**
- * @brief Widget to display a single photo.
- *
- * @param array $arr associative array with
- * * \e string \b src URL of photo; URL must be an http or https URL
- * * \e boolean \b zrl use zid in URL
- * * \e string \b style CSS string
- *
- * @return string with parsed HTML
- */
-function widget_photo($arr) {
-
- $style = $zrl = false;
-
- if(array_key_exists('src', $arr) && isset($arr['src']))
- $url = $arr['src'];
-
- if(strpos($url, 'http') !== 0)
- return '';
-
- if(array_key_exists('style', $arr) && isset($arr['style']))
- $style = $arr['style'];
-
- // ensure they can't sneak in an eval(js) function
-
- if(strpbrk($style, '(\'"<>') !== false)
- $style = '';
-
- if(array_key_exists('zrl', $arr) && isset($arr['zrl']))
- $zrl = (($arr['zrl']) ? true : false);
-
- if($zrl)
- $url = zid($url);
-
- $o = '<div class="widget">';
-
- $o .= '<img ' . (($zrl) ? ' class="zrl" ' : '')
- . (($style) ? ' style="' . $style . '"' : '')
- . ' src="' . $url . '" alt="' . t('photo/image') . '">';
-
- $o .= '</div>';
-
- return $o;
-}
-
-
-function widget_cover_photo($arr) {
-
- require_once('include/channel.php');
- $o = '';
-
- if(App::$module == 'channel' && $_REQUEST['mid'])
- return '';
-
- $channel_id = 0;
- if(array_key_exists('channel_id', $arr) && intval($arr['channel_id']))
- $channel_id = intval($arr['channel_id']);
- if(! $channel_id)
- $channel_id = App::$profile_uid;
- if(! $channel_id)
- return '';
-
- $channel = channelx_by_n($channel_id);
-
- if(array_key_exists('style', $arr) && isset($arr['style']))
- $style = $arr['style'];
- else
- $style = 'width:100%; height: auto;';
-
- // ensure they can't sneak in an eval(js) function
-
- if(strpbrk($style,'(\'"<>') !== false)
- $style = '';
-
- if(array_key_exists('title', $arr) && isset($arr['title']))
- $title = $arr['title'];
- else
- $title = $channel['channel_name'];
-
- if(array_key_exists('subtitle', $arr) && isset($arr['subtitle']))
- $subtitle = $arr['subtitle'];
- else
- $subtitle = str_replace('@','&#x40;',$channel['xchan_addr']);
-
- $c = get_cover_photo($channel_id,'html');
-
- if($c) {
- $photo_html = (($style) ? str_replace('alt=',' style="' . $style . '" alt=',$c) : $c);
-
- $o = replace_macros(get_markup_template('cover_photo_widget.tpl'),array(
- '$photo_html' => $photo_html,
- '$title' => $title,
- '$subtitle' => $subtitle,
- '$hovertitle' => t('Click to show more'),
- ));
- }
- return $o;
-}
-
-
-function widget_photo_rand($arr) {
-
- require_once('include/photos.php');
- $style = false;
-
- if(array_key_exists('album', $arr) && isset($arr['album']))
- $album = $arr['album'];
- else
- $album = '';
-
- $channel_id = 0;
- if(array_key_exists('channel_id', $arr) && intval($arr['channel_id']))
- $channel_id = intval($arr['channel_id']);
- if(! $channel_id)
- $channel_id = App::$profile_uid;
- if(! $channel_id)
- return '';
-
- $scale = ((array_key_exists('scale',$arr)) ? intval($arr['scale']) : 0);
-
- $ret = photos_list_photos(array('channel_id' => $channel_id),App::get_observer(),$album);
-
- $filtered = array();
- if($ret['success'] && $ret['photos'])
- foreach($ret['photos'] as $p)
- if($p['imgscale'] == $scale)
- $filtered[] = $p['src'];
-
- if($filtered) {
- $e = mt_rand(0, count($filtered) - 1);
- $url = $filtered[$e];
- }
-
- if(strpos($url, 'http') !== 0)
- return '';
-
- if(array_key_exists('style', $arr) && isset($arr['style']))
- $style = $arr['style'];
-
- // ensure they can't sneak in an eval(js) function
-
- if(strpos($style,'(') !== false)
- return '';
-
- $url = zid($url);
-
- $o = '<div class="widget">';
-
- $o .= '<img class="zrl" '
- . (($style) ? ' style="' . $style . '"' : '')
- . ' src="' . $url . '" alt="' . t('photo/image') . '">';
-
- $o .= '</div>';
-
- return $o;
-}
-
-
-function widget_random_block($arr) {
-
- $channel_id = 0;
- if(array_key_exists('channel_id',$arr) && intval($arr['channel_id']))
- $channel_id = intval($arr['channel_id']);
- if(! $channel_id)
- $channel_id = App::$profile_uid;
- if(! $channel_id)
- return '';
-
- if(array_key_exists('contains',$arr))
- $contains = $arr['contains'];
-
- $o = '';
-
- require_once('include/security.php');
- $sql_options = item_permissions_sql($channel_id);
-
- $randfunc = db_getfunc('RAND');
-
- $r = q("select item.* from item left join iconfig on item.id = iconfig.iid
- where item.uid = %d and iconfig.cat = 'system' and iconfig.v like '%s' and iconfig.k = 'BUILDBLOCK' and
- item_type = %d $sql_options order by $randfunc limit 1",
- intval($channel_id),
- dbesc('%' . $contains . '%'),
- intval(ITEM_TYPE_BLOCK)
- );
-
- if($r) {
- $o = '<div class="widget bblock">';
- if($r[0]['title'])
- $o .= '<h3>' . $r[0]['title'] . '</h3>';
-
- $o .= prepare_text($r[0]['body'],$r[0]['mimetype']);
- $o .= '</div>';
- }
-
- return $o;
-}
-
-
-function widget_rating($arr) {
-
-
- $rating_enabled = get_config('system','rating_enabled');
- if(! $rating_enabled) {
- return;
- }
-
- if($arr['target'])
- $hash = $arr['target'];
- else
- $hash = App::$poi['xchan_hash'];
-
- if(! $hash)
- return;
-
- $url = '';
- $remote = false;
-
- if(remote_channel() && ! local_channel()) {
- $ob = App::get_observer();
- if($ob && $ob['xchan_url']) {
- $p = parse_url($ob['xchan_url']);
- if($p) {
- $url = $p['scheme'] . '://' . $p['host'] . (($p['port']) ? ':' . $p['port'] : '');
- $url .= '/rate?f=&target=' . urlencode($hash);
- }
- $remote = true;
- }
- }
-
- $self = false;
-
- if(local_channel()) {
- $channel = App::get_channel();
-
- if($hash == $channel['channel_hash'])
- $self = true;
-
- head_add_js('ratings.js');
-
- }
-
-
- $o = '<div class="widget">';
- $o .= '<h3>' . t('Rating Tools') . '</h3>';
-
- if((($remote) || (local_channel())) && (! $self)) {
- if($remote)
- $o .= '<a class="btn btn-block btn-primary btn-sm" href="' . $url . '"><i class="fa fa-pencil"></i> ' . t('Rate Me') . '</a>';
- else
- $o .= '<div class="btn btn-block btn-primary btn-sm" onclick="doRatings(\'' . $hash . '\'); return false;"><i class="fa fa-pencil"></i> ' . t('Rate Me') . '</div>';
- }
-
- $o .= '<a class="btn btn-block btn-default btn-sm" href="ratings/' . $hash . '"><i class="fa fa-eye"></i> ' . t('View Ratings') . '</a>';
- $o .= '</div>';
-
- return $o;
-
-}
-
-// used by site ratings pages to provide a return link
-function widget_pubsites($arr) {
- if(App::$poi)
- return;
- return '<div class="widget"><ul class="nav nav-pills"><li><a href="pubsites">' . t('Public Hubs') . '</a></li></ul></div>';
-}
-
-
-function widget_forums($arr) {
-
- if(! local_channel())
- return '';
-
- $o = '';
-
- if(is_array($arr) && array_key_exists('limit',$arr))
- $limit = " limit " . intval($limit) . " ";
- else
- $limit = '';
-
- $unseen = 0;
- if(is_array($arr) && array_key_exists('unseen',$arr) && intval($arr['unseen']))
- $unseen = 1;
-
- $perms_sql = item_permissions_sql(local_channel()) . item_normal();
-
- $xf = false;
-
- $x1 = q("select xchan from abconfig where chan = %d and cat = 'their_perms' and k = 'send_stream' and v = '0'",
- intval(local_channel())
- );
- if($x1) {
- $xc = ids_to_querystr($x1,'xchan',true);
- $x2 = q("select xchan from abconfig where chan = %d and cat = 'their_perms' and k = 'tag_deliver' and v = '1' and xchan in (" . $xc . ") ",
- intval(local_channel())
- );
- if($x2)
- $xf = ids_to_querystr($x2,'xchan',true);
- }
-
- $sql_extra = (($xf) ? " and ( xchan_hash in (" . $xf . ") or xchan_pubforum = 1 ) " : " and xchan_pubforum = 1 ");
-
- $r1 = q("select abook_id, xchan_hash, xchan_name, xchan_url, xchan_photo_s from abook left join xchan on abook_xchan = xchan_hash where xchan_deleted = 0 and abook_channel = %d $sql_extra order by xchan_name $limit ",
- intval(local_channel())
- );
- if(! $r1)
- return $o;
-
- $str = '';
-
- // Trying to cram all this into a single query with joins and the proper group by's is tough.
- // There also should be a way to update this via ajax.
-
- for($x = 0; $x < count($r1); $x ++) {
- $r = q("select sum(item_unseen) as unseen from item where owner_xchan = '%s' and uid = %d and item_unseen = 1 $perms_sql ",
- dbesc($r1[$x]['xchan_hash']),
- intval(local_channel())
- );
- if($r)
- $r1[$x]['unseen'] = $r[0]['unseen'];
-
-/**
- * @FIXME
- * This SQL makes the counts correct when you get forum posts arriving from different routes/sources
- * (like personal channels). However the network query for these posts doesn't yet include this
- * correction and it makes the SQL for that query pretty hairy so this is left as a future exercise.
- * It may make more sense in that query to look for the mention in the body rather than another join,
- * but that makes it very inefficient.
- *
- $r = q("select sum(item_unseen) as unseen from item left join term on oid = id where otype = %d and owner_xchan != '%s' and item.uid = %d and url = '%s' and ttype = %d $perms_sql ",
- intval(TERM_OBJ_POST),
- dbesc($r1[$x]['xchan_hash']),
- intval(local_channel()),
- dbesc($r1[$x]['xchan_url']),
- intval(TERM_MENTION)
- );
- if($r)
- $r1[$x]['unseen'] = ((array_key_exists('unseen',$r1[$x])) ? $r1[$x]['unseen'] + $r[0]['unseen'] : $r[0]['unseen']);
- *
- * end @FIXME
- */
-
- }
-
- if($r1) {
- $o .= '<div class="widget">';
- $o .= '<h3>' . t('Forums') . '</h3><ul class="nav nav-pills nav-stacked">';
-
- foreach($r1 as $rr) {
- if($unseen && (! intval($rr['unseen'])))
- continue;
- $o .= '<li><a href="network?f=&pf=1&cid=' . $rr['abook_id'] . '" ><span class="badge pull-right">' . ((intval($rr['unseen'])) ? intval($rr['unseen']) : '') . '</span><img src="' . $rr['xchan_photo_s'] . '" style="width: 16px; height: 16px;" /> ' . $rr['xchan_name'] . '</a></li>';
- }
- $o .= '</ul></div>';
- }
- return $o;
-
-}
-
-
-function widget_tasklist($arr) {
-
- if (! local_channel())
- return;
-
- require_once('include/event.php');
- $o .= '<script>var tasksShowAll = 0; $(document).ready(function() { tasksFetch(); $("#tasklist-new-form").submit(function(event) { event.preventDefault(); $.post( "tasks/new", $("#tasklist-new-form").serialize(), function(data) { tasksFetch(); $("#tasklist-new-summary").val(""); } ); return false; } )});</script>';
- $o .= '<script>function taskComplete(id) { $.post("tasks/complete/"+id, function(data) { tasksFetch();}); }
- function tasksFetch() {
- $.get("tasks/fetch" + ((tasksShowAll) ? "/all" : ""), function(data) {
- $(".tasklist-tasks").html(data.html);
- });
- }
- </script>';
-
- $o .= '<div class="widget">' . '<h3>' . t('Tasks') . '</h3><div class="tasklist-tasks">';
- $o .= '</div><form id="tasklist-new-form" action="" ><input id="tasklist-new-summary" type="text" name="summary" value="" /></form>';
- $o .= '</div>';
- return $o;
-
-}
-
-
-function widget_helpindex($arr) {
-
- $o .= '<div class="widget">';
-
- $level_0 = get_help_content('sitetoc');
- if(! $level_0)
- $level_0 = get_help_content('toc');
-
- $level_0 = preg_replace('/\<ul(.*?)\>/','<ul class="nav nav-pills nav-stacked">',$level_0);
-
- $levels = array();
-
-
- if(argc() > 2) {
- $path = '';
- for($x = 1; $x < argc(); $x ++) {
- $path .= argv($x) . '/';
- $y = get_help_content($path . 'sitetoc');
- if(! $y)
- $y = get_help_content($path . 'toc');
- if($y)
- $levels[] = preg_replace('/\<ul(.*?)\>/','<ul class="nav nav-pills nav-stacked">',$y);
- }
- }
-
- if($level_0)
- $o .= $level_0;
- if($levels) {
- foreach($levels as $l) {
- $o .= '<br /><br />';
- $o .= $l;
- }
- }
-
- $o .= '</div>';
-
- return $o;
-
-}
-
-
-
-function widget_admin($arr) {
-
- /*
- * Side bar links
- */
-
- if(! is_site_admin()) {
- return login(false);
- }
-
- $o = '';
-
- // array( url, name, extra css classes )
-
- $aside = array(
- 'site' => array(z_root() . '/admin/site/', t('Site'), 'site'),
- 'accounts' => array(z_root() . '/admin/accounts/', t('Accounts'), 'accounts', 'pending-update', t('Member registrations waiting for confirmation')),
- 'channels' => array(z_root() . '/admin/channels/', t('Channels'), 'channels'),
- 'security' => array(z_root() . '/admin/security/', t('Security'), 'security'),
- 'features' => array(z_root() . '/admin/features/', t('Features'), 'features'),
- 'plugins' => array(z_root() . '/admin/plugins/', t('Plugins'), 'plugins'),
- 'themes' => array(z_root() . '/admin/themes/', t('Themes'), 'themes'),
- 'queue' => array(z_root() . '/admin/queue', t('Inspect queue'), 'queue'),
- 'profs' => array(z_root() . '/admin/profs', t('Profile Fields'), 'profs'),
- 'dbsync' => array(z_root() . '/admin/dbsync/', t('DB updates'), 'dbsync')
-
- );
-
- /* get plugins admin page */
-
- $r = q("SELECT * FROM addon WHERE plugin_admin = 1");
-
- $plugins = array();
- if($r) {
- foreach ($r as $h){
- $plugin = $h['aname'];
- $plugins[] = array(z_root() . '/admin/plugins/' . $plugin, $plugin, 'plugin');
- // temp plugins with admin
- App::$plugins_admin[] = $plugin;
- }
- }
-
- $logs = array(z_root() . '/admin/logs/', t('Logs'), 'logs');
-
- $arr = array('links' => $aside,'plugins' => $plugins,'logs' => $logs);
- call_hooks('admin_aside',$arr);
-
- $o .= replace_macros(get_markup_template('admin_aside.tpl'), array(
- '$admin' => $aside,
- '$admtxt' => t('Admin'),
- '$plugadmtxt' => t('Plugin Features'),
- '$plugins' => $plugins,
- '$logtxt' => t('Logs'),
- '$logs' => $logs,
- '$h_pending' => t('Member registrations waiting for confirmation'),
- '$admurl'=> z_root() . '/admin/'
- ));
-
- return $o;
-
-}
-
-
-
-function widget_album($args) {
-
- $owner_uid = App::$profile_uid;
- $sql_extra = permissions_sql($owner_uid);
-
-
- if(! perm_is_allowed($owner_uid,get_observer_hash(),'view_storage'))
- return '';
-
- if($args['album'])
- $album = $args['album'];
- if($args['title'])
- $title = $args['title'];
-
- /**
- * This may return incorrect permissions if you have multiple directories of the same name.
- * It is a limitation of the photo table using a name for a photo album instead of a folder hash
- */
-
- if($album) {
- $x = q("select hash from attach where filename = '%s' and uid = %d limit 1",
- dbesc($album),
- intval($owner_uid)
- );
- if($x) {
- $y = attach_can_view_folder($owner_uid,get_observer_hash(),$x[0]['hash']);
- if(! $y)
- return '';
- }
- }
-
- $order = 'DESC';
-
- $r = q("SELECT p.resource_id, p.id, p.filename, p.mimetype, p.imgscale, p.description, p.created FROM photo p INNER JOIN
- (SELECT resource_id, max(imgscale) imgscale FROM photo WHERE uid = %d AND album = '%s' AND imgscale <= 4 AND photo_usage IN ( %d, %d ) $sql_extra GROUP BY resource_id) ph
- ON (p.resource_id = ph.resource_id AND p.imgscale = ph.imgscale)
- ORDER BY created $order ",
- intval($owner_uid),
- dbesc($album),
- intval(PHOTO_NORMAL),
- intval(PHOTO_PROFILE)
- );
-
- //edit album name
- $album_edit = null;
-
- $photos = array();
- if($r) {
- $twist = 'rotright';
- foreach($r as $rr) {
-
- if($twist == 'rotright')
- $twist = 'rotleft';
- else
- $twist = 'rotright';
-
- $ext = $phototypes[$rr['mimetype']];
-
- $imgalt_e = $rr['filename'];
- $desc_e = $rr['description'];
-
- $imagelink = (z_root() . '/photos/' . App::$profile['channel_address'] . '/image/' . $rr['resource_id']);
-
-
- $photos[] = array(
- 'id' => $rr['id'],
- 'twist' => ' ' . $twist . rand(2,4),
- 'link' => $imagelink,
- 'title' => t('View Photo'),
- 'src' => z_root() . '/photo/' . $rr['resource_id'] . '-' . $rr['imgscale'] . '.' .$ext,
- 'alt' => $imgalt_e,
- 'desc'=> $desc_e,
- 'ext' => $ext,
- 'hash'=> $rr['resource_id'],
- 'unknown' => t('Unknown')
- );
- }
- }
-
-
- $tpl = get_markup_template('photo_album.tpl');
- $o .= replace_macros($tpl, array(
- '$photos' => $photos,
- '$album' => (($title) ? $title : $album),
- '$album_id' => rand(),
- '$album_edit' => array(t('Edit Album'), $album_edit),
- '$can_post' => false,
- '$upload' => array(t('Upload'), z_root() . '/photos/' . App::$profile['channel_address'] . '/upload/' . bin2hex($album)),
- '$order' => false,
- '$upload_form' => $upload_form,
- '$usage' => $usage_message
- ));
-
- return $o;
-}
-
diff --git a/include/zot.php b/include/zot.php
index 9fa2f98a8..31debbe9d 100644
--- a/include/zot.php
+++ b/include/zot.php
@@ -165,9 +165,6 @@ function zot_build_packet($channel, $type = 'notify', $recipients = null, $remot
function zot_best_algorithm($methods) {
- if(\Zotlabs\Lib\System::get_server_role() !== 'pro')
- return 'aes256cbc';
-
$x = [ 'methods' => $methods, 'result' => '' ];
call_hooks('zot_best_algorithm',$x);
if($x['result'])
@@ -313,8 +310,6 @@ function zot_refresh($them, $channel = null, $force = false) {
$result = z_post_url($url . $rhs,$postvars);
- logger('zot_refresh: zot-info: ' . print_r($result,true), LOGGER_DATA, LOG_DEBUG);
-
if ($result['success']) {
$j = json_decode($result['body'],true);
@@ -324,6 +319,8 @@ function zot_refresh($them, $channel = null, $force = false) {
return false;
}
+ logger('zot-info: ' . print_r($result,true), LOGGER_DATA, LOG_DEBUG);
+
$signed_token = ((is_array($j) && array_key_exists('signed_token',$j)) ? $j['signed_token'] : null);
if($signed_token) {
$valid = rsa_verify('token.' . $token,base64url_decode($signed_token),$j['key']);
@@ -334,10 +331,7 @@ function zot_refresh($them, $channel = null, $force = false) {
}
else {
logger('No signed token from ' . $url . $rhs, LOGGER_NORMAL, LOG_WARNING);
- // after 2017-01-01 this will be a hard error unless you over-ride it.
- if((time() > 1483228800) && (! get_config('system','allow_unsigned_zotfinger'))) {
- return false;
- }
+ return false;
}
$x = import_xchan($j, (($force) ? UPDATE_FLAGS_FORCED : UPDATE_FLAGS_UPDATED));
@@ -2903,22 +2897,24 @@ function import_site($arr, $pubkey) {
else {
$update = true;
- $r = q("insert into site ( site_location, site_url, site_access, site_flags, site_update, site_directory, site_register, site_sellpage, site_realm, site_type, site_project, site_version, site_crypto )
- values ( '%s', '%s', %d, %d, '%s', '%s', %d, '%s', '%s', %d, '%s', '%s', '%s' )",
- dbesc($site_location),
- dbesc($url),
- intval($access_policy),
- intval($site_directory),
- dbesc(datetime_convert()),
- dbesc($directory_url),
- intval($register_policy),
- dbesc($sellpage),
- dbesc($site_realm),
- intval(SITE_TYPE_ZOT),
- dbesc($site_project),
- dbesc($site_version),
- dbesc($site_crypto)
+ $r = site_store_lowlevel(
+ [
+ 'site_location' => $site_location,
+ 'site_url' => $url,
+ 'site_access' => intval($access_policy),
+ 'site_flags' => intval($site_directory),
+ 'site_update' => datetime_convert(),
+ 'site_directory' => $directory_url,
+ 'site_register' => intval($register_policy),
+ 'site_sellpage' => $sellpage,
+ 'site_realm' => $site_realm,
+ 'site_type' => intval(SITE_TYPE_ZOT),
+ 'site_project' => $site_project,
+ 'site_version' => $site_version,
+ 'site_crypto' => $site_crypto
+ ]
);
+
if(! $r) {
logger('import_site: record create failed. ' . print_r($arr,true));
}
@@ -2960,6 +2956,8 @@ function build_sync_packet($uid = 0, $packet = null, $groups_changed = false) {
return;
$channel = $r[0];
+ unset($channel['channel_password']);
+ unset($channel['channel_salt']);
translate_channel_perms_outbound($channel);
if($packet && array_key_exists('abook',$packet) && $packet['abook']) {
@@ -3162,8 +3160,8 @@ function process_channel_sync_delivery($sender, $arr, $deliveries) {
if(array_key_exists('menu',$arr) && $arr['menu'])
sync_menus($channel,$arr['menu']);
- if(array_key_exists('menu',$arr) && $arr['menu'])
- sync_menus($channel,$arr['menu']);
+ if(array_key_exists('file',$arr) && $arr['file'])
+ sync_files($channel,$arr['file']);
if(array_key_exists('wiki',$arr) && $arr['wiki'])
sync_items($channel,$arr['wiki'],((array_key_exists('relocate',$arr)) ? $arr['relocate'] : null));
@@ -3228,12 +3226,10 @@ function process_channel_sync_delivery($sender, $arr, $deliveries) {
}
- $disallowed = array('abook_id','abook_account','abook_channel','abook_rating','abook_rating_text');
+ $disallowed = array('abook_id','abook_account','abook_channel','abook_rating','abook_rating_text','abook_not_here');
foreach($arr['abook'] as $abook) {
-
-
$abconfig = null;
if(array_key_exists('abconfig',$abook) && is_array($abook['abconfig']) && count($abook['abconfig']))
@@ -3584,21 +3580,62 @@ function get_rpost_path($observer) {
function import_author_zot($x) {
+ // Check that we have both a hubloc and xchan record - as occasionally storage calls will fail and
+ // we may only end up with one; which results in posts with no author name or photo and are a bit
+ // of a hassle to repair. If either or both are missing, do a full discovery probe.
+
$hash = make_xchan_hash($x['guid'],$x['guid_sig']);
- $r = q("select hubloc_url from hubloc where hubloc_guid = '%s' and hubloc_guid_sig = '%s' and hubloc_primary = 1 limit 1",
+
+ $r1 = q("select hubloc_url, hubloc_updated, site_dead from hubloc left join site on
+ hubloc_url = site_url where hubloc_guid = '%s' and hubloc_guid_sig = '%s' and hubloc_primary = 1 limit 1",
dbesc($x['guid']),
dbesc($x['guid_sig'])
);
- if ($r) {
- logger('import_author_zot: in cache', LOGGER_DEBUG);
+ $r2 = q("select xchan_hash from xchan where xchan_guid = '%s' and xchan_guid_sig = '%s' limit 1",
+ dbesc($x['guid']),
+ dbesc($x['guid_sig'])
+ );
+
+ $site_dead = false;
+
+ if($r1 && intval($r1[0]['site_dead'])) {
+ $site_dead = true;
+ }
+
+ // We have valid and somewhat fresh information.
+
+ if($r1 && $r2 && $r1[0]['hubloc_updated'] > datetime_convert('UTC','UTC','now - 1 week')) {
+ logger('in cache', LOGGER_DEBUG);
return $hash;
}
- logger('import_author_zot: entry not in cache - probing: ' . print_r($x,true), LOGGER_DEBUG);
+ logger('not in cache or cache stale - probing: ' . print_r($x,true), LOGGER_DEBUG,LOG_INFO);
+
+ // The primary hub may be dead. Try to find another one associated with this identity that is
+ // still alive. If we find one, use that url for the discovery/refresh probe. Otherwise, the dead site
+ // is all we have and there is no point probing it. Just return the hash indicating we have a
+ // cached entry and the identity is valid. It's just unreachable until they bring back their
+ // server from the grave or create another clone elsewhere.
+
+ if($site_dead) {
+ logger('dead site - ignoring', LOGGER_DEBUG,LOG_INFO);
+
+ $r = q("select hubloc_url from hubloc left join site on hubloc_url = site_url
+ where hubloc_hash = '%s' and site_dead = 0",
+ dbesc($hash)
+ );
+ if($r) {
+ logger('found another site that is not dead: ' . $r[0]['hubloc_url'], LOGGER_DEBUG,LOG_INFO);
+ $x['url'] = $r[0]['hubloc_url'];
+ }
+ else {
+ return $hash;
+ }
+ }
$them = array('hubloc_url' => $x['url'], 'xchan_guid' => $x['guid'], 'xchan_guid_sig' => $x['guid_sig']);
- if (zot_refresh($them))
+ if(zot_refresh($them))
return $hash;
return false;
diff --git a/install/schema_mysql.sql b/install/schema_mysql.sql
index be5317722..ceb63fce9 100644
--- a/install/schema_mysql.sql
+++ b/install/schema_mysql.sql
@@ -1,7 +1,7 @@
CREATE TABLE IF NOT EXISTS `abconfig` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `chan` int(10) unsigned NOT NULL DEFAULT '0',
+ `chan` int(10) unsigned NOT NULL DEFAULT 0 ,
`xchan` char(255) NOT NULL DEFAULT '',
`cat` char(255) NOT NULL DEFAULT '',
`k` char(255) NOT NULL DEFAULT '',
@@ -15,25 +15,26 @@ CREATE TABLE IF NOT EXISTS `abconfig` (
CREATE TABLE IF NOT EXISTS `abook` (
`abook_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `abook_account` int(10) unsigned NOT NULL DEFAULT '0',
- `abook_channel` int(10) unsigned NOT NULL DEFAULT '0',
+ `abook_account` int(10) unsigned NOT NULL DEFAULT 0 ,
+ `abook_channel` int(10) unsigned NOT NULL DEFAULT 0 ,
`abook_xchan` char(255) NOT NULL DEFAULT '',
- `abook_my_perms` int(11) NOT NULL DEFAULT '0',
- `abook_their_perms` int(11) NOT NULL DEFAULT '0',
- `abook_closeness` tinyint(3) unsigned NOT NULL DEFAULT '99',
+ `abook_my_perms` int(11) NOT NULL DEFAULT 0 ,
+ `abook_their_perms` int(11) NOT NULL DEFAULT 0 ,
+ `abook_closeness` tinyint(3) unsigned NOT NULL DEFAULT 99,
`abook_created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`abook_updated` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`abook_connected` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`abook_dob` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
- `abook_flags` int(11) NOT NULL DEFAULT '0',
- `abook_blocked` tinyint(4) NOT NULL DEFAULT '0',
- `abook_ignored` tinyint(4) NOT NULL DEFAULT '0',
- `abook_hidden` tinyint(4) NOT NULL DEFAULT '0',
- `abook_archived` tinyint(4) NOT NULL DEFAULT '0',
- `abook_pending` tinyint(4) NOT NULL DEFAULT '0',
- `abook_unconnected` tinyint(4) NOT NULL DEFAULT '0',
- `abook_self` tinyint(4) NOT NULL DEFAULT '0',
- `abook_feed` tinyint(4) NOT NULL DEFAULT '0',
+ `abook_flags` int(11) NOT NULL DEFAULT 0 ,
+ `abook_blocked` tinyint(4) NOT NULL DEFAULT 0 ,
+ `abook_ignored` tinyint(4) NOT NULL DEFAULT 0 ,
+ `abook_hidden` tinyint(4) NOT NULL DEFAULT 0 ,
+ `abook_archived` tinyint(4) NOT NULL DEFAULT 0 ,
+ `abook_pending` tinyint(4) NOT NULL DEFAULT 0 ,
+ `abook_unconnected` tinyint(4) NOT NULL DEFAULT 0 ,
+ `abook_self` tinyint(4) NOT NULL DEFAULT 0 ,
+ `abook_feed` tinyint(4) NOT NULL DEFAULT 0 ,
+ `abook_not_here` tinyint(4) NOT NULL DEFAULT 0 ,
`abook_profile` char(64) NOT NULL DEFAULT '',
`abook_incl` TEXT NOT NULL DEFAULT '',
`abook_excl` TEXT NOT NULL DEFAULT '',
@@ -58,13 +59,14 @@ CREATE TABLE IF NOT EXISTS `abook` (
KEY `abook_pending` (`abook_pending`),
KEY `abook_unconnected` (`abook_unconnected`),
KEY `abook_self` (`abook_self`),
+ KEY `abook_not_here` (`abook_not_here`),
KEY `abook_feed` (`abook_feed`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `account` (
`account_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `account_parent` int(10) unsigned NOT NULL DEFAULT '0',
- `account_default_channel` int(10) unsigned NOT NULL DEFAULT '0',
+ `account_parent` int(10) unsigned NOT NULL DEFAULT 0 ,
+ `account_default_channel` int(10) unsigned NOT NULL DEFAULT 0 ,
`account_salt` char(32) NOT NULL DEFAULT '',
`account_password` char(255) NOT NULL DEFAULT '',
`account_email` char(255) NOT NULL DEFAULT '',
@@ -72,13 +74,13 @@ CREATE TABLE IF NOT EXISTS `account` (
`account_language` char(16) NOT NULL DEFAULT 'en',
`account_created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`account_lastlog` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
- `account_flags` int(10) unsigned NOT NULL DEFAULT '0',
- `account_roles` int(10) unsigned NOT NULL DEFAULT '0',
+ `account_flags` int(10) unsigned NOT NULL DEFAULT 0 ,
+ `account_roles` int(10) unsigned NOT NULL DEFAULT 0 ,
`account_reset` char(255) NOT NULL DEFAULT '',
`account_expires` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`account_expire_notified` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`account_service_class` char(32) NOT NULL DEFAULT '',
- `account_level` int(10) unsigned NOT NULL DEFAULT '0',
+ `account_level` int(10) unsigned NOT NULL DEFAULT 0 ,
`account_password_changed` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
PRIMARY KEY (`account_id`),
KEY `account_email` (`account_email`),
@@ -98,10 +100,10 @@ CREATE TABLE IF NOT EXISTS `addon` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`aname` char(255) NOT NULL DEFAULT '',
`version` char(255) NOT NULL DEFAULT '',
- `installed` tinyint(1) NOT NULL DEFAULT '0',
- `hidden` tinyint(1) NOT NULL DEFAULT '0',
- `tstamp` bigint(20) NOT NULL DEFAULT '0',
- `plugin_admin` tinyint(1) NOT NULL DEFAULT '0',
+ `installed` tinyint(1) NOT NULL DEFAULT 0 ,
+ `hidden` tinyint(1) NOT NULL DEFAULT 0 ,
+ `tstamp` bigint(20) NOT NULL DEFAULT 0 ,
+ `plugin_admin` tinyint(1) NOT NULL DEFAULT 0 ,
PRIMARY KEY (`id`),
KEY `hidden` (`hidden`),
KEY `aname` (`aname`),
@@ -118,13 +120,13 @@ CREATE TABLE IF NOT EXISTS `app` (
`app_url` char(255) NOT NULL DEFAULT '',
`app_photo` char(255) NOT NULL DEFAULT '',
`app_version` char(255) NOT NULL DEFAULT '',
- `app_channel` int(11) NOT NULL DEFAULT '0',
+ `app_channel` int(11) NOT NULL DEFAULT 0 ,
`app_addr` char(255) NOT NULL DEFAULT '',
`app_price` char(255) NOT NULL DEFAULT '',
`app_page` char(255) NOT NULL DEFAULT '',
`app_requires` char(255) NOT NULL DEFAULT '',
- `app_deleted` int(11) NOT NULL DEFAULT '0',
- `app_system` int(11) NOT NULL DEFAULT '0',
+ `app_deleted` int(11) NOT NULL DEFAULT 0 ,
+ `app_system` int(11) NOT NULL DEFAULT 0 ,
`app_plugin` char(255) NOT NULL DEFAULT '',
`app_created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`app_edited` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
@@ -161,19 +163,19 @@ CREATE TABLE IF NOT EXISTS `atoken` (
CREATE TABLE IF NOT EXISTS `attach` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `aid` int(10) unsigned NOT NULL DEFAULT '0',
- `uid` int(10) unsigned NOT NULL DEFAULT '0',
+ `aid` int(10) unsigned NOT NULL DEFAULT 0 ,
+ `uid` int(10) unsigned NOT NULL DEFAULT 0 ,
`hash` char(64) NOT NULL DEFAULT '',
`creator` char(128) NOT NULL DEFAULT '',
`filename` char(255) NOT NULL DEFAULT '',
`filetype` char(64) NOT NULL DEFAULT '',
- `filesize` int(10) unsigned NOT NULL DEFAULT '0',
- `revision` int(10) unsigned NOT NULL DEFAULT '0',
+ `filesize` int(10) unsigned NOT NULL DEFAULT 0 ,
+ `revision` int(10) unsigned NOT NULL DEFAULT 0 ,
`folder` char(64) NOT NULL DEFAULT '',
- `flags` int(10) unsigned NOT NULL DEFAULT '0',
- `is_dir` tinyint(1) NOT NULL DEFAULT '0',
- `is_photo` tinyint(1) NOT NULL DEFAULT '0',
- `os_storage` tinyint(1) NOT NULL DEFAULT '0',
+ `flags` int(10) unsigned NOT NULL DEFAULT 0 ,
+ `is_dir` tinyint(1) NOT NULL DEFAULT 0 ,
+ `is_photo` tinyint(1) NOT NULL DEFAULT 0 ,
+ `os_storage` tinyint(1) NOT NULL DEFAULT 0 ,
`os_path` mediumtext NOT NULL,
`display_path` mediumtext NOT NULL,
`content` longblob NOT NULL,
@@ -205,7 +207,7 @@ CREATE TABLE IF NOT EXISTS `auth_codes` (
`id` varchar(40) NOT NULL DEFAULT '',
`client_id` varchar(20) NOT NULL DEFAULT '',
`redirect_uri` varchar(200) NOT NULL DEFAULT '',
- `expires` int(11) NOT NULL DEFAULT '0',
+ `expires` int(11) NOT NULL DEFAULT 0 ,
`auth_scope` varchar(512) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
@@ -219,8 +221,8 @@ CREATE TABLE IF NOT EXISTS `cache` (
CREATE TABLE IF NOT EXISTS `cal` (
`cal_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `cal_aid` int(10) unsigned NOT NULL DEFAULT '0',
- `cal_uid` int(10) unsigned NOT NULL DEFAULT '0',
+ `cal_aid` int(10) unsigned NOT NULL DEFAULT 0 ,
+ `cal_uid` int(10) unsigned NOT NULL DEFAULT 0 ,
`cal_hash` varchar(255) NOT NULL DEFAULT '',
`cal_name` varchar(255) NOT NULL DEFAULT '',
`uri` varchar(255) NOT NULL DEFAULT '',
@@ -239,8 +241,8 @@ CREATE TABLE IF NOT EXISTS `cal` (
CREATE TABLE IF NOT EXISTS `channel` (
`channel_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `channel_account_id` int(10) unsigned NOT NULL DEFAULT '0',
- `channel_primary` tinyint(1) unsigned NOT NULL DEFAULT '0',
+ `channel_account_id` int(10) unsigned NOT NULL DEFAULT 0 ,
+ `channel_primary` tinyint(1) unsigned NOT NULL DEFAULT 0 ,
`channel_name` char(255) NOT NULL DEFAULT '',
`channel_address` char(255) NOT NULL DEFAULT '',
`channel_guid` char(255) NOT NULL DEFAULT '',
@@ -252,41 +254,43 @@ CREATE TABLE IF NOT EXISTS `channel` (
`channel_startpage` char(255) NOT NULL DEFAULT '',
`channel_pubkey` text NOT NULL,
`channel_prvkey` text NOT NULL,
- `channel_notifyflags` int(10) unsigned NOT NULL DEFAULT '65535',
- `channel_pageflags` int(10) unsigned NOT NULL DEFAULT '0',
+ `channel_notifyflags` int(10) unsigned NOT NULL DEFAULT 65535,
+ `channel_pageflags` int(10) unsigned NOT NULL DEFAULT 0 ,
`channel_dirdate` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`channel_lastpost` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`channel_deleted` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
- `channel_max_anon_mail` int(10) unsigned NOT NULL DEFAULT '10',
- `channel_max_friend_req` int(10) unsigned NOT NULL DEFAULT '10',
- `channel_expire_days` int(11) NOT NULL DEFAULT '0',
+ `channel_max_anon_mail` int(10) unsigned NOT NULL DEFAULT 10,
+ `channel_max_friend_req` int(10) unsigned NOT NULL DEFAULT 10,
+ `channel_expire_days` int(11) NOT NULL DEFAULT 0 ,
`channel_passwd_reset` char(255) NOT NULL DEFAULT '',
`channel_default_group` char(255) NOT NULL DEFAULT '',
`channel_allow_cid` mediumtext NOT NULL,
`channel_allow_gid` mediumtext NOT NULL,
`channel_deny_cid` mediumtext NOT NULL,
`channel_deny_gid` mediumtext NOT NULL,
- `channel_r_stream` int(10) unsigned NOT NULL DEFAULT '0',
- `channel_r_profile` int(10) unsigned NOT NULL DEFAULT '0',
- `channel_r_photos` int(10) unsigned NOT NULL DEFAULT '0',
- `channel_r_abook` int(10) unsigned NOT NULL DEFAULT '0',
- `channel_w_stream` int(10) unsigned NOT NULL DEFAULT '0',
- `channel_w_wall` int(10) unsigned NOT NULL DEFAULT '0',
- `channel_w_tagwall` int(10) unsigned NOT NULL DEFAULT '0',
- `channel_w_comment` int(10) unsigned NOT NULL DEFAULT '0',
- `channel_w_mail` int(10) unsigned NOT NULL DEFAULT '0',
- `channel_w_photos` int(10) unsigned NOT NULL DEFAULT '0',
- `channel_w_chat` int(10) unsigned NOT NULL DEFAULT '0',
- `channel_a_delegate` int(10) unsigned NOT NULL DEFAULT '0',
- `channel_r_storage` int(10) unsigned NOT NULL DEFAULT '0',
- `channel_w_storage` int(10) unsigned NOT NULL DEFAULT '0',
- `channel_r_pages` int(10) unsigned NOT NULL DEFAULT '0',
- `channel_w_pages` int(10) unsigned NOT NULL DEFAULT '0',
- `channel_a_republish` int(10) unsigned NOT NULL DEFAULT '0',
- `channel_w_like` int(10) unsigned NOT NULL DEFAULT '0',
- `channel_removed` tinyint(1) NOT NULL DEFAULT '0',
- `channel_system` tinyint(1) NOT NULL DEFAULT '0',
+ `channel_r_stream` int(10) unsigned NOT NULL DEFAULT 0 ,
+ `channel_r_profile` int(10) unsigned NOT NULL DEFAULT 0 ,
+ `channel_r_photos` int(10) unsigned NOT NULL DEFAULT 0 ,
+ `channel_r_abook` int(10) unsigned NOT NULL DEFAULT 0 ,
+ `channel_w_stream` int(10) unsigned NOT NULL DEFAULT 0 ,
+ `channel_w_wall` int(10) unsigned NOT NULL DEFAULT 0 ,
+ `channel_w_tagwall` int(10) unsigned NOT NULL DEFAULT 0 ,
+ `channel_w_comment` int(10) unsigned NOT NULL DEFAULT 0 ,
+ `channel_w_mail` int(10) unsigned NOT NULL DEFAULT 0 ,
+ `channel_w_photos` int(10) unsigned NOT NULL DEFAULT 0 ,
+ `channel_w_chat` int(10) unsigned NOT NULL DEFAULT 0 ,
+ `channel_a_delegate` int(10) unsigned NOT NULL DEFAULT 0 ,
+ `channel_r_storage` int(10) unsigned NOT NULL DEFAULT 0 ,
+ `channel_w_storage` int(10) unsigned NOT NULL DEFAULT 0 ,
+ `channel_r_pages` int(10) unsigned NOT NULL DEFAULT 0 ,
+ `channel_w_pages` int(10) unsigned NOT NULL DEFAULT 0 ,
+ `channel_a_republish` int(10) unsigned NOT NULL DEFAULT 0 ,
+ `channel_w_like` int(10) unsigned NOT NULL DEFAULT 0 ,
+ `channel_removed` tinyint(1) NOT NULL DEFAULT 0 ,
+ `channel_system` tinyint(1) NOT NULL DEFAULT 0 ,
`channel_moved` char(255) NOT NULL DEFAULT '',
+ `channel_password` varchar(255) NOT NULL,
+ `channel_salt` varchar(255) NOT NULL,
PRIMARY KEY (`channel_id`),
UNIQUE KEY `channel_address_unique` (`channel_address`),
KEY `channel_account_id` (`channel_account_id`),
@@ -331,7 +335,7 @@ CREATE TABLE IF NOT EXISTS `channel` (
CREATE TABLE IF NOT EXISTS `chat` (
`chat_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `chat_room` int(10) unsigned NOT NULL DEFAULT '0',
+ `chat_room` int(10) unsigned NOT NULL DEFAULT 0 ,
`chat_xchan` char(255) NOT NULL DEFAULT '',
`chat_text` mediumtext NOT NULL,
`created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
@@ -343,7 +347,7 @@ CREATE TABLE IF NOT EXISTS `chat` (
CREATE TABLE IF NOT EXISTS `chatpresence` (
`cp_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `cp_room` int(10) unsigned NOT NULL DEFAULT '0',
+ `cp_room` int(10) unsigned NOT NULL DEFAULT 0 ,
`cp_xchan` char(255) NOT NULL DEFAULT '',
`cp_last` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`cp_status` char(255) NOT NULL DEFAULT '',
@@ -357,12 +361,12 @@ CREATE TABLE IF NOT EXISTS `chatpresence` (
CREATE TABLE IF NOT EXISTS `chatroom` (
`cr_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `cr_aid` int(10) unsigned NOT NULL DEFAULT '0',
- `cr_uid` int(10) unsigned NOT NULL DEFAULT '0',
+ `cr_aid` int(10) unsigned NOT NULL DEFAULT 0 ,
+ `cr_uid` int(10) unsigned NOT NULL DEFAULT 0 ,
`cr_name` char(255) NOT NULL DEFAULT '',
`cr_created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`cr_edited` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
- `cr_expire` int(10) unsigned NOT NULL DEFAULT '0',
+ `cr_expire` int(10) unsigned NOT NULL DEFAULT 0 ,
`allow_cid` mediumtext NOT NULL,
`allow_gid` mediumtext NOT NULL,
`deny_cid` mediumtext NOT NULL,
@@ -382,7 +386,7 @@ CREATE TABLE IF NOT EXISTS `clients` (
`redirect_uri` varchar(200) NOT NULL DEFAULT '',
`clname` text,
`icon` text,
- `uid` int(11) NOT NULL DEFAULT '0',
+ `uid` int(11) NOT NULL DEFAULT 0 ,
PRIMARY KEY (`client_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
@@ -399,7 +403,7 @@ CREATE TABLE IF NOT EXISTS `conv` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`guid` char(255) NOT NULL DEFAULT '',
`recips` mediumtext NOT NULL,
- `uid` int(11) NOT NULL DEFAULT '0',
+ `uid` int(11) NOT NULL DEFAULT 0 ,
`creator` char(255) NOT NULL DEFAULT '',
`created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`updated` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
@@ -411,7 +415,7 @@ CREATE TABLE IF NOT EXISTS `conv` (
CREATE TABLE IF NOT EXISTS `dreport` (
`dreport_id` int(11) NOT NULL AUTO_INCREMENT,
- `dreport_channel` int(11) NOT NULL DEFAULT '0',
+ `dreport_channel` int(11) NOT NULL DEFAULT 0 ,
`dreport_mid` char(255) NOT NULL DEFAULT '',
`dreport_site` char(255) NOT NULL DEFAULT '',
`dreport_recip` char(255) NOT NULL DEFAULT '',
@@ -430,9 +434,9 @@ CREATE TABLE IF NOT EXISTS `dreport` (
CREATE TABLE IF NOT EXISTS `event` (
`id` int(11) NOT NULL AUTO_INCREMENT,
- `aid` int(10) unsigned NOT NULL DEFAULT '0',
- `uid` int(11) NOT NULL DEFAULT '0',
- `cal_id` int(11) unsigned NOT NULL DEFAULT '0',
+ `aid` int(10) unsigned NOT NULL DEFAULT 0 ,
+ `uid` int(11) NOT NULL DEFAULT 0 ,
+ `cal_id` int(11) unsigned NOT NULL DEFAULT 0 ,
`event_xchan` char(255) NOT NULL DEFAULT '',
`event_hash` char(255) NOT NULL DEFAULT '',
`created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
@@ -443,19 +447,19 @@ CREATE TABLE IF NOT EXISTS `event` (
`description` text NOT NULL,
`location` text NOT NULL,
`etype` char(255) NOT NULL DEFAULT '',
- `nofinish` tinyint(1) NOT NULL DEFAULT '0',
- `adjust` tinyint(1) NOT NULL DEFAULT '1',
- `dismissed` tinyint(1) NOT NULL DEFAULT '0',
+ `nofinish` tinyint(1) NOT NULL DEFAULT 0 ,
+ `adjust` tinyint(1) NOT NULL DEFAULT 1,
+ `dismissed` tinyint(1) NOT NULL DEFAULT 0 ,
`allow_cid` mediumtext NOT NULL,
`allow_gid` mediumtext NOT NULL,
`deny_cid` mediumtext NOT NULL,
`deny_gid` mediumtext NOT NULL,
`event_status` char(255) NOT NULL DEFAULT '',
`event_status_date` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
- `event_percent` smallint(6) NOT NULL DEFAULT '0',
+ `event_percent` smallint(6) NOT NULL DEFAULT 0 ,
`event_repeat` text NOT NULL,
- `event_sequence` smallint(6) NOT NULL DEFAULT '0',
- `event_priority` smallint(6) NOT NULL DEFAULT '0',
+ `event_sequence` smallint(6) NOT NULL DEFAULT 0 ,
+ `event_priority` smallint(6) NOT NULL DEFAULT 0 ,
`event_vdata` text NOT NULL,
PRIMARY KEY (`id`),
KEY `uid` (`uid`),
@@ -477,9 +481,9 @@ CREATE TABLE IF NOT EXISTS `event` (
CREATE TABLE IF NOT EXISTS `groups` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`hash` char(255) NOT NULL DEFAULT '',
- `uid` int(10) unsigned NOT NULL DEFAULT '0',
- `visible` tinyint(1) NOT NULL DEFAULT '0',
- `deleted` tinyint(1) NOT NULL DEFAULT '0',
+ `uid` int(10) unsigned NOT NULL DEFAULT 0 ,
+ `visible` tinyint(1) NOT NULL DEFAULT 0 ,
+ `deleted` tinyint(1) NOT NULL DEFAULT 0 ,
`gname` char(255) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `uid` (`uid`),
@@ -491,8 +495,8 @@ CREATE TABLE IF NOT EXISTS `groups` (
CREATE TABLE IF NOT EXISTS `group_member` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `uid` int(10) unsigned NOT NULL DEFAULT '0',
- `gid` int(10) unsigned NOT NULL DEFAULT '0',
+ `uid` int(10) unsigned NOT NULL DEFAULT 0 ,
+ `gid` int(10) unsigned NOT NULL DEFAULT 0 ,
`xchan` char(255) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `uid` (`uid`),
@@ -505,8 +509,8 @@ CREATE TABLE IF NOT EXISTS `hook` (
`hook` char(255) NOT NULL DEFAULT '',
`file` char(255) NOT NULL DEFAULT '',
`fn` char(255) NOT NULL DEFAULT '',
- `priority` smallint NOT NULL DEFAULT '0',
- `hook_version` int(11) NOT NULL DEFAULT '0',
+ `priority` smallint NOT NULL DEFAULT 0 ,
+ `hook_version` int(11) NOT NULL DEFAULT 0 ,
PRIMARY KEY (`id`),
KEY `hook` (`hook`),
KEY `priority` (`priority`),
@@ -520,8 +524,8 @@ CREATE TABLE IF NOT EXISTS `hubloc` (
`hubloc_hash` char(255) NOT NULL DEFAULT '',
`hubloc_addr` char(255) NOT NULL DEFAULT '',
`hubloc_network` char(32) NOT NULL DEFAULT '',
- `hubloc_flags` int(10) unsigned NOT NULL DEFAULT '0',
- `hubloc_status` int(10) unsigned NOT NULL DEFAULT '0',
+ `hubloc_flags` int(10) unsigned NOT NULL DEFAULT 0 ,
+ `hubloc_status` int(10) unsigned NOT NULL DEFAULT 0 ,
`hubloc_url` char(255) NOT NULL DEFAULT '',
`hubloc_url_sig` text NOT NULL,
`hubloc_host` char(255) NOT NULL DEFAULT '',
@@ -530,10 +534,10 @@ CREATE TABLE IF NOT EXISTS `hubloc` (
`hubloc_sitekey` text NOT NULL,
`hubloc_updated` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`hubloc_connected` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
- `hubloc_primary` tinyint(1) NOT NULL DEFAULT '0',
- `hubloc_orphancheck` tinyint(1) NOT NULL DEFAULT '0',
- `hubloc_error` tinyint(1) NOT NULL DEFAULT '0',
- `hubloc_deleted` tinyint(1) NOT NULL DEFAULT '0',
+ `hubloc_primary` tinyint(1) NOT NULL DEFAULT 0 ,
+ `hubloc_orphancheck` tinyint(1) NOT NULL DEFAULT 0 ,
+ `hubloc_error` tinyint(1) NOT NULL DEFAULT 0 ,
+ `hubloc_deleted` tinyint(1) NOT NULL DEFAULT 0 ,
PRIMARY KEY (`hubloc_id`),
KEY `hubloc_url` (`hubloc_url`),
KEY `hubloc_guid` (`hubloc_guid`),
@@ -554,11 +558,11 @@ CREATE TABLE IF NOT EXISTS `hubloc` (
CREATE TABLE IF NOT EXISTS `iconfig` (
`id` int(11) NOT NULL AUTO_INCREMENT,
- `iid` int(11) NOT NULL DEFAULT '0',
+ `iid` int(11) NOT NULL DEFAULT 0 ,
`cat` char(255) NOT NULL DEFAULT '',
`k` char(255) NOT NULL DEFAULT '',
`v` mediumtext NOT NULL,
- `sharing` int(11) NOT NULL DEFAULT '0',
+ `sharing` int(11) NOT NULL DEFAULT 0 ,
PRIMARY KEY (`id`),
KEY `iid` (`iid`),
KEY `cat` (`cat`),
@@ -571,8 +575,8 @@ CREATE TABLE IF NOT EXISTS `issue` (
`issue_created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`issue_updated` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`issue_assigned` char(255) NOT NULL DEFAULT '',
- `issue_priority` int(11) NOT NULL DEFAULT '0',
- `issue_status` int(11) NOT NULL DEFAULT '0',
+ `issue_priority` int(11) NOT NULL DEFAULT 0 ,
+ `issue_status` int(11) NOT NULL DEFAULT 0 ,
`issue_component` char(255) NOT NULL DEFAULT '',
PRIMARY KEY (`issue_id`),
KEY `issue_created` (`issue_created`),
@@ -586,9 +590,9 @@ CREATE TABLE IF NOT EXISTS `issue` (
CREATE TABLE IF NOT EXISTS `item` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`mid` char(255) CHARACTER SET ascii NOT NULL DEFAULT '',
- `aid` int(10) unsigned NOT NULL DEFAULT '0',
- `uid` int(10) unsigned NOT NULL DEFAULT '0',
- `parent` int(10) unsigned NOT NULL DEFAULT '0',
+ `aid` int(10) unsigned NOT NULL DEFAULT 0 ,
+ `uid` int(10) unsigned NOT NULL DEFAULT 0 ,
+ `parent` int(10) unsigned NOT NULL DEFAULT 0 ,
`parent_mid` char(255) CHARACTER SET ascii NOT NULL DEFAULT '',
`thr_parent` char(255) NOT NULL DEFAULT '',
`created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
@@ -607,7 +611,7 @@ CREATE TABLE IF NOT EXISTS `item` (
`html` mediumtext NOT NULL,
`app` char(255) NOT NULL DEFAULT '',
`lang` char(64) NOT NULL DEFAULT '',
- `revision` int(10) unsigned NOT NULL DEFAULT '0',
+ `revision` int(10) unsigned NOT NULL DEFAULT 0 ,
`verb` char(255) NOT NULL DEFAULT '',
`obj_type` char(255) NOT NULL DEFAULT '',
`obj` text NOT NULL,
@@ -631,32 +635,32 @@ CREATE TABLE IF NOT EXISTS `item` (
`allow_gid` mediumtext NOT NULL,
`deny_cid` mediumtext NOT NULL,
`deny_gid` mediumtext NOT NULL,
- `item_restrict` int(11) NOT NULL DEFAULT '0',
- `item_flags` int(11) NOT NULL DEFAULT '0',
- `item_private` tinyint(1) NOT NULL DEFAULT '0',
- `item_origin` tinyint(1) NOT NULL DEFAULT '0',
- `item_unseen` tinyint(1) NOT NULL DEFAULT '0',
- `item_starred` tinyint(1) NOT NULL DEFAULT '0',
- `item_uplink` tinyint(1) NOT NULL DEFAULT '0',
- `item_consensus` tinyint(1) NOT NULL DEFAULT '0',
- `item_wall` tinyint(1) NOT NULL DEFAULT '0',
- `item_thread_top` tinyint(1) NOT NULL DEFAULT '0',
- `item_notshown` tinyint(1) NOT NULL DEFAULT '0',
- `item_nsfw` tinyint(1) NOT NULL DEFAULT '0',
- `item_relay` tinyint(1) NOT NULL DEFAULT '0',
- `item_mentionsme` tinyint(1) NOT NULL DEFAULT '0',
- `item_nocomment` tinyint(1) NOT NULL DEFAULT '0',
- `item_obscured` tinyint(1) NOT NULL DEFAULT '0',
- `item_verified` tinyint(1) NOT NULL DEFAULT '0',
- `item_retained` tinyint(1) NOT NULL DEFAULT '0',
- `item_rss` tinyint(1) NOT NULL DEFAULT '0',
- `item_deleted` tinyint(1) NOT NULL DEFAULT '0',
- `item_type` int(11) NOT NULL DEFAULT '0',
- `item_hidden` tinyint(1) NOT NULL DEFAULT '0',
- `item_unpublished` tinyint(1) NOT NULL DEFAULT '0',
- `item_delayed` tinyint(1) NOT NULL DEFAULT '0',
- `item_pending_remove` tinyint(1) NOT NULL DEFAULT '0',
- `item_blocked` tinyint(1) NOT NULL DEFAULT '0',
+ `item_restrict` int(11) NOT NULL DEFAULT 0 ,
+ `item_flags` int(11) NOT NULL DEFAULT 0 ,
+ `item_private` tinyint(1) NOT NULL DEFAULT 0 ,
+ `item_origin` tinyint(1) NOT NULL DEFAULT 0 ,
+ `item_unseen` tinyint(1) NOT NULL DEFAULT 0 ,
+ `item_starred` tinyint(1) NOT NULL DEFAULT 0 ,
+ `item_uplink` tinyint(1) NOT NULL DEFAULT 0 ,
+ `item_consensus` tinyint(1) NOT NULL DEFAULT 0 ,
+ `item_wall` tinyint(1) NOT NULL DEFAULT 0 ,
+ `item_thread_top` tinyint(1) NOT NULL DEFAULT 0 ,
+ `item_notshown` tinyint(1) NOT NULL DEFAULT 0 ,
+ `item_nsfw` tinyint(1) NOT NULL DEFAULT 0 ,
+ `item_relay` tinyint(1) NOT NULL DEFAULT 0 ,
+ `item_mentionsme` tinyint(1) NOT NULL DEFAULT 0 ,
+ `item_nocomment` tinyint(1) NOT NULL DEFAULT 0 ,
+ `item_obscured` tinyint(1) NOT NULL DEFAULT 0 ,
+ `item_verified` tinyint(1) NOT NULL DEFAULT 0 ,
+ `item_retained` tinyint(1) NOT NULL DEFAULT 0 ,
+ `item_rss` tinyint(1) NOT NULL DEFAULT 0 ,
+ `item_deleted` tinyint(1) NOT NULL DEFAULT 0 ,
+ `item_type` int(11) NOT NULL DEFAULT 0 ,
+ `item_hidden` tinyint(1) NOT NULL DEFAULT 0 ,
+ `item_unpublished` tinyint(1) NOT NULL DEFAULT 0 ,
+ `item_delayed` tinyint(1) NOT NULL DEFAULT 0 ,
+ `item_pending_remove` tinyint(1) NOT NULL DEFAULT 0 ,
+ `item_blocked` tinyint(1) NOT NULL DEFAULT 0 ,
PRIMARY KEY (`id`),
KEY `uid` (`uid`),
KEY `parent` (`parent`),
@@ -719,8 +723,8 @@ CREATE TABLE IF NOT EXISTS `item` (
CREATE TABLE IF NOT EXISTS `item_id` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `iid` int(11) NOT NULL DEFAULT '0',
- `uid` int(11) NOT NULL DEFAULT '0',
+ `iid` int(11) NOT NULL DEFAULT 0 ,
+ `uid` int(11) NOT NULL DEFAULT 0 ,
`sid` char(255) NOT NULL DEFAULT '',
`service` char(255) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
@@ -732,10 +736,10 @@ CREATE TABLE IF NOT EXISTS `item_id` (
CREATE TABLE IF NOT EXISTS `likes` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `channel_id` int(10) unsigned NOT NULL DEFAULT '0',
+ `channel_id` int(10) unsigned NOT NULL DEFAULT 0 ,
`liker` char(128) NOT NULL DEFAULT '',
`likee` char(128) NOT NULL DEFAULT '',
- `iid` int(11) unsigned NOT NULL DEFAULT '0',
+ `iid` int(11) unsigned NOT NULL DEFAULT 0 ,
`i_mid` char(255) NOT NULL DEFAULT '',
`verb` char(255) NOT NULL DEFAULT '',
`target_type` char(255) NOT NULL DEFAULT '',
@@ -754,25 +758,27 @@ CREATE TABLE IF NOT EXISTS `likes` (
CREATE TABLE IF NOT EXISTS `mail` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `convid` int(10) unsigned NOT NULL DEFAULT '0',
+ `convid` int(10) unsigned NOT NULL DEFAULT 0 ,
`conv_guid` char(255) NOT NULL DEFAULT '',
- `mail_flags` int(10) unsigned NOT NULL DEFAULT '0',
+ `mail_flags` int(10) unsigned NOT NULL DEFAULT 0 ,
`from_xchan` char(255) NOT NULL DEFAULT '',
`to_xchan` char(255) NOT NULL DEFAULT '',
- `account_id` int(10) unsigned NOT NULL DEFAULT '0',
- `channel_id` int(10) unsigned NOT NULL DEFAULT '0',
+ `account_id` int(10) unsigned NOT NULL DEFAULT 0 ,
+ `channel_id` int(10) unsigned NOT NULL DEFAULT 0 ,
+ `mail_mimetype` char(64) NOT NULL DEFAULT 'text/bbcode',
`title` text NOT NULL,
`body` mediumtext NOT NULL,
`sig` text NOT NULL,
`attach` mediumtext NOT NULL,
`mid` char(255) NOT NULL DEFAULT '',
`parent_mid` char(255) NOT NULL DEFAULT '',
- `mail_deleted` tinyint(4) NOT NULL DEFAULT '0',
- `mail_replied` tinyint(4) NOT NULL DEFAULT '0',
- `mail_isreply` tinyint(4) NOT NULL DEFAULT '0',
- `mail_seen` tinyint(4) NOT NULL DEFAULT '0',
- `mail_recalled` tinyint(4) NOT NULL DEFAULT '0',
- `mail_obscured` smallint(6) NOT NULL DEFAULT '0',
+ `mail_deleted` tinyint(4) NOT NULL DEFAULT 0 ,
+ `mail_replied` tinyint(4) NOT NULL DEFAULT 0 ,
+ `mail_isreply` tinyint(4) NOT NULL DEFAULT 0 ,
+ `mail_seen` tinyint(4) NOT NULL DEFAULT 0 ,
+ `mail_recalled` tinyint(4) NOT NULL DEFAULT 0 ,
+ `mail_obscured` smallint(6) NOT NULL DEFAULT 0 ,
+ `mail_raw` tinyint(4) NOT NULL DEFAULT 0 ,
`created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`expires` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
PRIMARY KEY (`id`),
@@ -797,10 +803,10 @@ CREATE TABLE IF NOT EXISTS `mail` (
CREATE TABLE IF NOT EXISTS `menu` (
`menu_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `menu_channel_id` int(10) unsigned NOT NULL DEFAULT '0',
+ `menu_channel_id` int(10) unsigned NOT NULL DEFAULT 0 ,
`menu_name` char(255) NOT NULL DEFAULT '',
`menu_desc` char(255) NOT NULL DEFAULT '',
- `menu_flags` int(11) NOT NULL DEFAULT '0',
+ `menu_flags` int(11) NOT NULL DEFAULT 0 ,
`menu_created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`menu_edited` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
PRIMARY KEY (`menu_id`),
@@ -815,14 +821,14 @@ CREATE TABLE IF NOT EXISTS `menu_item` (
`mitem_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`mitem_link` char(255) NOT NULL DEFAULT '',
`mitem_desc` char(255) NOT NULL DEFAULT '',
- `mitem_flags` int(11) NOT NULL DEFAULT '0',
+ `mitem_flags` int(11) NOT NULL DEFAULT 0 ,
`allow_cid` mediumtext NOT NULL,
`allow_gid` mediumtext NOT NULL,
`deny_cid` mediumtext NOT NULL,
`deny_gid` mediumtext NOT NULL,
- `mitem_channel_id` int(10) unsigned NOT NULL DEFAULT '0',
- `mitem_menu_id` int(10) unsigned NOT NULL DEFAULT '0',
- `mitem_order` int(11) NOT NULL DEFAULT '0',
+ `mitem_channel_id` int(10) unsigned NOT NULL DEFAULT 0 ,
+ `mitem_menu_id` int(10) unsigned NOT NULL DEFAULT 0 ,
+ `mitem_order` int(11) NOT NULL DEFAULT 0 ,
PRIMARY KEY (`mitem_id`),
KEY `mitem_channel_id` (`mitem_channel_id`),
KEY `mitem_menu_id` (`mitem_menu_id`),
@@ -837,12 +843,12 @@ CREATE TABLE IF NOT EXISTS `notify` (
`photo` char(255) NOT NULL DEFAULT '',
`created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`msg` mediumtext NOT NULL,
- `aid` int(11) NOT NULL DEFAULT '0',
- `uid` int(11) NOT NULL DEFAULT '0',
+ `aid` int(11) NOT NULL DEFAULT 0 ,
+ `uid` int(11) NOT NULL DEFAULT 0 ,
`link` char(255) NOT NULL DEFAULT '',
`parent` char(255) NOT NULL DEFAULT '',
- `seen` tinyint(1) NOT NULL DEFAULT '0',
- `ntype` int(11) NOT NULL DEFAULT '0',
+ `seen` tinyint(1) NOT NULL DEFAULT 0 ,
+ `ntype` int(11) NOT NULL DEFAULT 0 ,
`verb` char(255) NOT NULL DEFAULT '',
`otype` char(16) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
@@ -861,15 +867,15 @@ CREATE TABLE IF NOT EXISTS `obj` (
`obj_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`obj_page` char(64) NOT NULL DEFAULT '',
`obj_verb` char(255) NOT NULL DEFAULT '',
- `obj_type` int(10) unsigned NOT NULL DEFAULT '0',
+ `obj_type` int(10) unsigned NOT NULL DEFAULT 0 ,
`obj_obj` char(255) NOT NULL DEFAULT '',
- `obj_channel` int(10) unsigned NOT NULL DEFAULT '0',
+ `obj_channel` int(10) unsigned NOT NULL DEFAULT 0 ,
`obj_term` char(255) NOT NULL DEFAULT '',
`obj_url` char(255) NOT NULL DEFAULT '',
`obj_imgurl` char(255) NOT NULL DEFAULT '',
`obj_created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`obj_edited` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
- `obj_quantity` int(11) NOT NULL DEFAULT '0',
+ `obj_quantity` int(11) NOT NULL DEFAULT 0 ,
`allow_cid` mediumtext NOT NULL,
`allow_gid` mediumtext NOT NULL,
`deny_cid` mediumtext NOT NULL,
@@ -890,18 +896,18 @@ CREATE TABLE IF NOT EXISTS `obj` (
CREATE TABLE IF NOT EXISTS `outq` (
`outq_hash` char(255) NOT NULL,
- `outq_account` int(10) unsigned NOT NULL DEFAULT '0',
- `outq_channel` int(10) unsigned NOT NULL DEFAULT '0',
+ `outq_account` int(10) unsigned NOT NULL DEFAULT 0 ,
+ `outq_channel` int(10) unsigned NOT NULL DEFAULT 0 ,
`outq_driver` char(32) NOT NULL DEFAULT '',
`outq_posturl` char(255) NOT NULL DEFAULT '',
- `outq_async` tinyint(1) NOT NULL DEFAULT '0',
- `outq_delivered` tinyint(1) NOT NULL DEFAULT '0',
+ `outq_async` tinyint(1) NOT NULL DEFAULT 0 ,
+ `outq_delivered` tinyint(1) NOT NULL DEFAULT 0 ,
`outq_created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`outq_updated` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`outq_scheduled` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`outq_notify` mediumtext NOT NULL,
`outq_msg` mediumtext NOT NULL,
- `outq_priority` smallint(6) NOT NULL DEFAULT '0',
+ `outq_priority` smallint(6) NOT NULL DEFAULT 0 ,
PRIMARY KEY (`outq_hash`),
KEY `outq_account` (`outq_account`),
KEY `outq_channel` (`outq_channel`),
@@ -916,7 +922,7 @@ CREATE TABLE IF NOT EXISTS `outq` (
CREATE TABLE IF NOT EXISTS `pconfig` (
`id` int(11) NOT NULL AUTO_INCREMENT,
- `uid` int(11) NOT NULL DEFAULT '0',
+ `uid` int(11) NOT NULL DEFAULT 0 ,
`cat` char(255) CHARACTER SET ascii NOT NULL DEFAULT '',
`k` char(255) CHARACTER SET ascii NOT NULL DEFAULT '',
`v` mediumtext NOT NULL,
@@ -927,8 +933,8 @@ CREATE TABLE IF NOT EXISTS `pconfig` (
CREATE TABLE IF NOT EXISTS `photo` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `aid` int(10) unsigned NOT NULL DEFAULT '0',
- `uid` int(10) unsigned NOT NULL DEFAULT '0',
+ `aid` int(10) unsigned NOT NULL DEFAULT 0 ,
+ `uid` int(10) unsigned NOT NULL DEFAULT 0 ,
`xchan` char(255) NOT NULL DEFAULT '',
`resource_id` char(255) NOT NULL DEFAULT '',
`created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
@@ -938,18 +944,18 @@ CREATE TABLE IF NOT EXISTS `photo` (
`album` char(255) NOT NULL DEFAULT '',
`filename` char(255) NOT NULL DEFAULT '',
`mimetype` char(128) NOT NULL DEFAULT 'image/jpeg',
- `height` smallint(6) NOT NULL DEFAULT '0',
- `width` smallint(6) NOT NULL DEFAULT '0',
- `filesize` int(10) unsigned NOT NULL DEFAULT '0',
+ `height` smallint(6) NOT NULL DEFAULT 0 ,
+ `width` smallint(6) NOT NULL DEFAULT 0 ,
+ `filesize` int(10) unsigned NOT NULL DEFAULT 0 ,
`content` mediumblob NOT NULL,
- `imgscale` tinyint(3) NOT NULL DEFAULT '0',
- `photo_usage` smallint(6) NOT NULL DEFAULT '0',
- `profile` tinyint(1) NOT NULL DEFAULT '0',
- `is_nsfw` tinyint(1) NOT NULL DEFAULT '0',
- `os_storage` tinyint(1) NOT NULL DEFAULT '0',
+ `imgscale` tinyint(3) NOT NULL DEFAULT 0 ,
+ `photo_usage` smallint(6) NOT NULL DEFAULT 0 ,
+ `profile` tinyint(1) NOT NULL DEFAULT 0 ,
+ `is_nsfw` tinyint(1) NOT NULL DEFAULT 0 ,
+ `os_storage` tinyint(1) NOT NULL DEFAULT 0 ,
`os_path` mediumtext NOT NULL,
`display_path` mediumtext NOT NULL,
- `photo_flags` int(10) unsigned NOT NULL DEFAULT '0',
+ `photo_flags` int(10) unsigned NOT NULL DEFAULT 0 ,
`allow_cid` mediumtext NOT NULL,
`allow_gid` mediumtext NOT NULL,
`deny_cid` mediumtext NOT NULL,
@@ -972,10 +978,10 @@ CREATE TABLE IF NOT EXISTS `photo` (
CREATE TABLE IF NOT EXISTS `poll` (
`poll_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `poll_channel` int(10) unsigned NOT NULL DEFAULT '0',
+ `poll_channel` int(10) unsigned NOT NULL DEFAULT 0 ,
`poll_desc` text NOT NULL,
- `poll_flags` int(11) NOT NULL DEFAULT '0',
- `poll_votes` int(11) NOT NULL DEFAULT '0',
+ `poll_flags` int(11) NOT NULL DEFAULT 0 ,
+ `poll_votes` int(11) NOT NULL DEFAULT 0 ,
PRIMARY KEY (`poll_id`),
KEY `poll_channel` (`poll_channel`),
KEY `poll_flags` (`poll_flags`),
@@ -984,10 +990,10 @@ CREATE TABLE IF NOT EXISTS `poll` (
CREATE TABLE IF NOT EXISTS `poll_elm` (
`pelm_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `pelm_poll` int(10) unsigned NOT NULL DEFAULT '0',
+ `pelm_poll` int(10) unsigned NOT NULL DEFAULT 0 ,
`pelm_desc` text NOT NULL,
- `pelm_flags` int(11) NOT NULL DEFAULT '0',
- `pelm_result` float NOT NULL DEFAULT '0',
+ `pelm_flags` int(11) NOT NULL DEFAULT 0 ,
+ `pelm_result` float NOT NULL DEFAULT 0 ,
PRIMARY KEY (`pelm_id`),
KEY `pelm_poll` (`pelm_poll`),
KEY `pelm_result` (`pelm_result`)
@@ -1006,7 +1012,7 @@ CREATE TABLE IF NOT EXISTS `profdef` (
CREATE TABLE IF NOT EXISTS `profext` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `channel_id` int(10) unsigned NOT NULL DEFAULT '0',
+ `channel_id` int(10) unsigned NOT NULL DEFAULT 0 ,
`hash` char(255) NOT NULL DEFAULT '',
`k` char(255) NOT NULL DEFAULT '',
`v` mediumtext NOT NULL,
@@ -1019,11 +1025,11 @@ CREATE TABLE IF NOT EXISTS `profext` (
CREATE TABLE IF NOT EXISTS `profile` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`profile_guid` char(64) NOT NULL DEFAULT '',
- `aid` int(10) unsigned NOT NULL DEFAULT '0',
- `uid` int(11) NOT NULL DEFAULT '0',
+ `aid` int(10) unsigned NOT NULL DEFAULT 0 ,
+ `uid` int(11) NOT NULL DEFAULT 0 ,
`profile_name` char(255) NOT NULL DEFAULT '',
- `is_default` tinyint(1) NOT NULL DEFAULT '0',
- `hide_friends` tinyint(1) NOT NULL DEFAULT '0',
+ `is_default` tinyint(1) NOT NULL DEFAULT 0 ,
+ `hide_friends` tinyint(1) NOT NULL DEFAULT 0 ,
`fullname` char(255) NOT NULL DEFAULT '',
`pdesc` char(255) NOT NULL DEFAULT '',
`chandesc` text NOT NULL,
@@ -1060,7 +1066,7 @@ CREATE TABLE IF NOT EXISTS `profile` (
`homepage` char(255) NOT NULL DEFAULT '',
`photo` char(255) NOT NULL DEFAULT '',
`thumb` char(255) NOT NULL DEFAULT '',
- `publish` tinyint(1) NOT NULL DEFAULT '0',
+ `publish` tinyint(1) NOT NULL DEFAULT 0 ,
`profile_vcard` text NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
UNIQUE KEY `guid` (`profile_guid`,`uid`),
@@ -1081,11 +1087,11 @@ CREATE TABLE IF NOT EXISTS `profile` (
CREATE TABLE IF NOT EXISTS `profile_check` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `uid` int(10) unsigned NOT NULL DEFAULT '0',
- `cid` int(10) unsigned NOT NULL DEFAULT '0',
+ `uid` int(10) unsigned NOT NULL DEFAULT 0 ,
+ `cid` int(10) unsigned NOT NULL DEFAULT 0 ,
`dfrn_id` char(255) NOT NULL DEFAULT '',
`sec` char(255) NOT NULL DEFAULT '',
- `expire` int(11) NOT NULL DEFAULT '0',
+ `expire` int(11) NOT NULL DEFAULT 0 ,
PRIMARY KEY (`id`),
KEY `uid` (`uid`),
KEY `cid` (`cid`),
@@ -1098,7 +1104,7 @@ CREATE TABLE IF NOT EXISTS `register` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`hash` char(255) NOT NULL DEFAULT '',
`created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
- `uid` int(10) unsigned NOT NULL DEFAULT '0',
+ `uid` int(10) unsigned NOT NULL DEFAULT 0 ,
`password` char(255) NOT NULL DEFAULT '',
`lang` char(16) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
@@ -1111,7 +1117,7 @@ CREATE TABLE IF NOT EXISTS `session` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`sid` char(255) NOT NULL DEFAULT '',
`sess_data` text NOT NULL,
- `expire` bigint(20) unsigned NOT NULL DEFAULT '0',
+ `expire` bigint(20) unsigned NOT NULL DEFAULT 0 ,
PRIMARY KEY (`id`),
KEY `sid` (`sid`),
KEY `expire` (`expire`)
@@ -1119,8 +1125,8 @@ CREATE TABLE IF NOT EXISTS `session` (
CREATE TABLE IF NOT EXISTS `shares` (
`share_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `share_type` int(11) NOT NULL DEFAULT '0',
- `share_target` int(10) unsigned NOT NULL DEFAULT '0',
+ `share_type` int(11) NOT NULL DEFAULT 0 ,
+ `share_target` int(10) unsigned NOT NULL DEFAULT 0 ,
`share_xchan` char(255) NOT NULL DEFAULT '',
PRIMARY KEY (`share_id`),
KEY `share_type` (`share_type`),
@@ -1130,8 +1136,8 @@ CREATE TABLE IF NOT EXISTS `shares` (
CREATE TABLE IF NOT EXISTS `sign` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `iid` int(10) unsigned NOT NULL DEFAULT '0',
- `retract_iid` int(10) unsigned NOT NULL DEFAULT '0',
+ `iid` int(10) unsigned NOT NULL DEFAULT 0 ,
+ `retract_iid` int(10) unsigned NOT NULL DEFAULT 0 ,
`signed_text` mediumtext NOT NULL,
`signature` text NOT NULL,
`signer` char(255) NOT NULL DEFAULT '',
@@ -1142,19 +1148,19 @@ CREATE TABLE IF NOT EXISTS `sign` (
CREATE TABLE IF NOT EXISTS `site` (
`site_url` char(255) NOT NULL,
- `site_access` int(11) NOT NULL DEFAULT '0',
- `site_flags` int(11) NOT NULL DEFAULT '0',
+ `site_access` int(11) NOT NULL DEFAULT 0 ,
+ `site_flags` int(11) NOT NULL DEFAULT 0 ,
`site_update` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`site_pull` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`site_sync` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`site_directory` char(255) NOT NULL DEFAULT '',
- `site_register` int(11) NOT NULL DEFAULT '0',
+ `site_register` int(11) NOT NULL DEFAULT 0 ,
`site_sellpage` char(255) NOT NULL DEFAULT '',
`site_location` char(255) NOT NULL DEFAULT '',
`site_realm` char(255) NOT NULL DEFAULT '',
- `site_valid` smallint NOT NULL DEFAULT '0',
- `site_dead` smallint NOT NULL DEFAULT '0',
- `site_type` smallint NOT NULL DEFAULT '0',
+ `site_valid` smallint NOT NULL DEFAULT 0 ,
+ `site_dead` smallint NOT NULL DEFAULT 0 ,
+ `site_type` smallint NOT NULL DEFAULT 0 ,
`site_project` char(255) NOT NULL DEFAULT '',
`site_version` varchar(32) NOT NULL DEFAULT '',
`site_crypto` text NOT NULL DEFAULT '',
@@ -1175,7 +1181,7 @@ CREATE TABLE IF NOT EXISTS `site` (
CREATE TABLE IF NOT EXISTS `source` (
`src_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `src_channel_id` int(10) unsigned NOT NULL DEFAULT '0',
+ `src_channel_id` int(10) unsigned NOT NULL DEFAULT 0 ,
`src_channel_xchan` char(255) NOT NULL DEFAULT '',
`src_xchan` char(255) NOT NULL DEFAULT '',
`src_patt` mediumtext NOT NULL,
@@ -1191,17 +1197,17 @@ CREATE TABLE IF NOT EXISTS `sys_perms` (
`cat` char(255) NOT NULL DEFAULT '',
`k` char(255) NOT NULL DEFAULT '',
`v` mediumtext NOT NULL,
- `public_perm` tinyint(1) unsigned NOT NULL DEFAULT '0',
+ `public_perm` tinyint(1) unsigned NOT NULL DEFAULT 0 ,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `term` (
`tid` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `aid` int(10) unsigned NOT NULL DEFAULT '0',
- `uid` int(10) unsigned NOT NULL DEFAULT '0',
- `oid` int(10) unsigned NOT NULL DEFAULT '0',
- `otype` tinyint(3) unsigned NOT NULL DEFAULT '0',
- `ttype` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `aid` int(10) unsigned NOT NULL DEFAULT 0 ,
+ `uid` int(10) unsigned NOT NULL DEFAULT 0 ,
+ `oid` int(10) unsigned NOT NULL DEFAULT 0 ,
+ `otype` tinyint(3) unsigned NOT NULL DEFAULT 0 ,
+ `ttype` tinyint(3) unsigned NOT NULL DEFAULT 0 ,
`term` char(255) NOT NULL DEFAULT '',
`url` char(255) NOT NULL DEFAULT '',
`imgurl` char(255) NOT NULL DEFAULT '',
@@ -1223,9 +1229,9 @@ CREATE TABLE IF NOT EXISTS `tokens` (
`id` varchar(40) NOT NULL DEFAULT '',
`secret` text NOT NULL,
`client_id` varchar(20) NOT NULL DEFAULT '',
- `expires` bigint(20) unsigned NOT NULL DEFAULT '0',
+ `expires` bigint(20) unsigned NOT NULL DEFAULT 0 ,
`auth_scope` varchar(512) NOT NULL DEFAULT '',
- `uid` int(11) NOT NULL DEFAULT '0',
+ `uid` int(11) NOT NULL DEFAULT 0 ,
PRIMARY KEY (`id`),
KEY `client_id` (`client_id`),
KEY `expires` (`expires`),
@@ -1238,7 +1244,7 @@ CREATE TABLE IF NOT EXISTS `updates` (
`ud_guid` char(255) NOT NULL DEFAULT '',
`ud_date` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`ud_last` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
- `ud_flags` int(11) NOT NULL DEFAULT '0',
+ `ud_flags` int(11) NOT NULL DEFAULT 0 ,
`ud_addr` char(255) NOT NULL DEFAULT '',
PRIMARY KEY (`ud_id`),
KEY `ud_date` (`ud_date`),
@@ -1251,7 +1257,7 @@ CREATE TABLE IF NOT EXISTS `updates` (
CREATE TABLE IF NOT EXISTS `verify` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `channel` int(10) unsigned NOT NULL DEFAULT '0',
+ `channel` int(10) unsigned NOT NULL DEFAULT 0 ,
`vtype` char(32) NOT NULL DEFAULT '',
`token` char(255) NOT NULL DEFAULT '',
`meta` char(255) NOT NULL DEFAULT '',
@@ -1266,8 +1272,8 @@ CREATE TABLE IF NOT EXISTS `verify` (
CREATE TABLE IF NOT EXISTS `vote` (
`vote_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `vote_poll` int(11) NOT NULL DEFAULT '0',
- `vote_element` int(11) NOT NULL DEFAULT '0',
+ `vote_poll` int(11) NOT NULL DEFAULT 0 ,
+ `vote_element` int(11) NOT NULL DEFAULT 0 ,
`vote_result` text NOT NULL,
`vote_xchan` char(255) NOT NULL DEFAULT '',
PRIMARY KEY (`vote_id`),
@@ -1293,16 +1299,16 @@ CREATE TABLE IF NOT EXISTS `xchan` (
`xchan_name` char(255) NOT NULL DEFAULT '',
`xchan_network` char(255) NOT NULL DEFAULT '',
`xchan_instance_url` char(255) NOT NULL DEFAULT '',
- `xchan_flags` int(10) unsigned NOT NULL DEFAULT '0',
+ `xchan_flags` int(10) unsigned NOT NULL DEFAULT 0 ,
`xchan_photo_date` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`xchan_name_date` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
- `xchan_hidden` tinyint(1) NOT NULL DEFAULT '0',
- `xchan_orphan` tinyint(1) NOT NULL DEFAULT '0',
- `xchan_censored` tinyint(1) NOT NULL DEFAULT '0',
- `xchan_selfcensored` tinyint(1) NOT NULL DEFAULT '0',
- `xchan_system` tinyint(1) NOT NULL DEFAULT '0',
- `xchan_pubforum` tinyint(1) NOT NULL DEFAULT '0',
- `xchan_deleted` tinyint(1) NOT NULL DEFAULT '0',
+ `xchan_hidden` tinyint(1) NOT NULL DEFAULT 0 ,
+ `xchan_orphan` tinyint(1) NOT NULL DEFAULT 0 ,
+ `xchan_censored` tinyint(1) NOT NULL DEFAULT 0 ,
+ `xchan_selfcensored` tinyint(1) NOT NULL DEFAULT 0 ,
+ `xchan_system` tinyint(1) NOT NULL DEFAULT 0 ,
+ `xchan_pubforum` tinyint(1) NOT NULL DEFAULT 0 ,
+ `xchan_deleted` tinyint(1) NOT NULL DEFAULT 0 ,
PRIMARY KEY (`xchan_hash`),
KEY `xchan_guid` (`xchan_guid`),
KEY `xchan_addr` (`xchan_addr`),
@@ -1349,7 +1355,7 @@ CREATE TABLE IF NOT EXISTS `xconfig` (
CREATE TABLE IF NOT EXISTS `xign` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `uid` int(11) NOT NULL DEFAULT '0',
+ `uid` int(11) NOT NULL DEFAULT 0 ,
`xchan` char(255) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `uid` (`uid`),
@@ -1360,10 +1366,10 @@ CREATE TABLE IF NOT EXISTS `xlink` (
`xlink_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`xlink_xchan` char(255) NOT NULL DEFAULT '',
`xlink_link` char(255) NOT NULL DEFAULT '',
- `xlink_rating` int(11) NOT NULL DEFAULT '0',
+ `xlink_rating` int(11) NOT NULL DEFAULT 0 ,
`xlink_rating_text` text NOT NULL,
`xlink_updated` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
- `xlink_static` tinyint(1) NOT NULL DEFAULT '0',
+ `xlink_static` tinyint(1) NOT NULL DEFAULT 0 ,
`xlink_sig` text NOT NULL,
PRIMARY KEY (`xlink_id`),
KEY `xlink_xchan` (`xlink_xchan`),
@@ -1376,7 +1382,7 @@ CREATE TABLE IF NOT EXISTS `xlink` (
CREATE TABLE IF NOT EXISTS `xperm` (
`xp_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`xp_client` varchar(20) NOT NULL DEFAULT '',
- `xp_channel` int(10) unsigned NOT NULL DEFAULT '0',
+ `xp_channel` int(10) unsigned NOT NULL DEFAULT 0 ,
`xp_perm` varchar(64) NOT NULL DEFAULT '',
PRIMARY KEY (`xp_id`),
KEY `xp_client` (`xp_client`),
@@ -1386,7 +1392,7 @@ CREATE TABLE IF NOT EXISTS `xperm` (
CREATE TABLE IF NOT EXISTS `xprof` (
`xprof_hash` char(255) NOT NULL,
- `xprof_age` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `xprof_age` tinyint(3) unsigned NOT NULL DEFAULT 0 ,
`xprof_desc` char(255) NOT NULL DEFAULT '',
`xprof_dob` char(12) NOT NULL DEFAULT '',
`xprof_gender` char(255) NOT NULL DEFAULT '',
@@ -1418,7 +1424,7 @@ CREATE TABLE IF NOT EXISTS `xtag` (
`xtag_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`xtag_hash` char(255) NOT NULL DEFAULT '',
`xtag_term` char(255) NOT NULL DEFAULT '',
- `xtag_flags` int(11) NOT NULL DEFAULT '0',
+ `xtag_flags` int(11) NOT NULL DEFAULT 0 ,
PRIMARY KEY (`xtag_id`),
KEY `xtag_term` (`xtag_term`),
KEY `xtag_hash` (`xtag_hash`),
diff --git a/install/schema_postgres.sql b/install/schema_postgres.sql
index e78425828..e171d9baf 100644
--- a/install/schema_postgres.sql
+++ b/install/schema_postgres.sql
@@ -1,6 +1,6 @@
CREATE TABLE "abconfig" (
"id" serial NOT NULL,
- "chan" bigint NOT NULL DEFAULT '0',
+ "chan" bigint NOT NULL DEFAULT 0,
"xchan" text NOT NULL,
"cat" text NOT NULL,
"k" text NOT NULL,
@@ -16,23 +16,24 @@ CREATE TABLE "abook" (
"abook_account" bigint NOT NULL,
"abook_channel" bigint NOT NULL,
"abook_xchan" text NOT NULL DEFAULT '',
- "abook_my_perms" bigint NOT NULL DEFAULT '0',
- "abook_their_perms" bigint NOT NULL DEFAULT '0',
- "abook_closeness" numeric(3) NOT NULL DEFAULT '99',
+ "abook_my_perms" bigint NOT NULL DEFAULT 0,
+ "abook_their_perms" bigint NOT NULL DEFAULT 0,
+ "abook_closeness" numeric(3) NOT NULL DEFAULT 99,
"abook_created" timestamp NOT NULL DEFAULT '0001-01-01 00:00:00',
"abook_updated" timestamp NOT NULL DEFAULT '0001-01-01 00:00:00',
"abook_connected" timestamp NOT NULL DEFAULT '0001-01-01 00:00:00',
"abook_dob" timestamp NOT NULL DEFAULT '0001-01-01 00:00:00',
- "abook_flags" bigint NOT NULL DEFAULT '0',
- "abook_blocked" smallint NOT NULL DEFAULT '0',
- "abook_ignored" smallint NOT NULL DEFAULT '0',
- "abook_hidden" smallint NOT NULL DEFAULT '0',
- "abook_archived" smallint NOT NULL DEFAULT '0',
- "abook_pending" smallint NOT NULL DEFAULT '0',
- "abook_unconnected" smallint NOT NULL DEFAULT '0',
- "abook_self" smallint NOT NULL DEFAULT '0',
- "abook_feed" smallint NOT NULL DEFAULT '0',
- "abook_profile" char(64) NOT NULL DEFAULT '',
+ "abook_flags" bigint NOT NULL DEFAULT 0 ,
+ "abook_blocked" smallint NOT NULL DEFAULT 0 ,
+ "abook_ignored" smallint NOT NULL DEFAULT 0 ,
+ "abook_hidden" smallint NOT NULL DEFAULT 0 ,
+ "abook_archived" smallint NOT NULL DEFAULT 0 ,
+ "abook_pending" smallint NOT NULL DEFAULT 0 ,
+ "abook_unconnected" smallint NOT NULL DEFAULT 0 ,
+ "abook_self" smallint NOT NULL DEFAULT 0 ,
+ "abook_feed" smallint NOT NULL DEFAULT 0 ,
+ "abook_not_here" smallint NOT NULL DEFAULT 0 ,
+ "abook_profile" varchar(64) NOT NULL DEFAULT '',
"abook_incl" TEXT NOT NULL DEFAULT '',
"abook_excl" TEXT NOT NULL DEFAULT '',
"abook_instance" TEXT NOT NULL DEFAULT '',
@@ -55,6 +56,7 @@ CREATE TABLE "abook" (
create index "abook_unconnected" on abook ("abook_unconnected");
create index "abook_self" on abook ("abook_self");
create index "abook_feed" on abook ("abook_feed");
+ create index "abook_not_here" on abook ("abook_not_here");
create index "abook_profile" on abook ("abook_profile");
create index "abook_dob" on abook ("abook_dob");
create index "abook_connected" on abook ("abook_connected");
@@ -62,22 +64,22 @@ CREATE TABLE "abook" (
CREATE TABLE "account" (
"account_id" serial NOT NULL,
- "account_parent" bigint NOT NULL DEFAULT '0',
- "account_default_channel" bigint NOT NULL DEFAULT '0',
- "account_salt" char(32) NOT NULL DEFAULT '',
+ "account_parent" bigint NOT NULL DEFAULT 0 ,
+ "account_default_channel" bigint NOT NULL DEFAULT 0 ,
+ "account_salt" varchar(32) NOT NULL DEFAULT '',
"account_password" text NOT NULL DEFAULT '',
"account_email" text NOT NULL DEFAULT '',
"account_external" text NOT NULL DEFAULT '',
"account_language" varchar(16) NOT NULL DEFAULT 'en',
"account_created" timestamp NOT NULL DEFAULT '0001-01-01 00:00:00',
"account_lastlog" timestamp NOT NULL DEFAULT '0001-01-01 00:00:00',
- "account_flags" bigint NOT NULL DEFAULT '0',
- "account_roles" bigint NOT NULL DEFAULT '0',
+ "account_flags" bigint NOT NULL DEFAULT 0 ,
+ "account_roles" bigint NOT NULL DEFAULT 0 ,
"account_reset" text NOT NULL DEFAULT '',
"account_expires" timestamp NOT NULL DEFAULT '0001-01-01 00:00:00',
"account_expire_notified" timestamp NOT NULL DEFAULT '0001-01-01 00:00:00',
"account_service_class" varchar(32) NOT NULL DEFAULT '',
- "account_level" bigint NOT NULL DEFAULT '0',
+ "account_level" bigint NOT NULL DEFAULT 0 ,
"account_password_changed" timestamp NOT NULL DEFAULT '0001-01-01 00:00:00',
PRIMARY KEY ("account_id")
);
@@ -95,11 +97,11 @@ create index "account_password_changed" on account ("account_password_changed")
CREATE TABLE "addon" (
"id" serial NOT NULL,
"aname" text NOT NULL,
- "version" text NOT NULL DEFAULT '0',
- "installed" numeric(1) NOT NULL DEFAULT '0',
- "hidden" numeric(1) NOT NULL DEFAULT '0',
- "tstamp" numeric(20) NOT NULL DEFAULT '0',
- "plugin_admin" numeric(1) NOT NULL DEFAULT '0',
+ "version" text NOT NULL DEFAULT 0 ,
+ "installed" numeric(1) NOT NULL DEFAULT 0 ,
+ "hidden" numeric(1) NOT NULL DEFAULT 0 ,
+ "tstamp" numeric(20) NOT NULL DEFAULT 0 ,
+ "plugin_admin" numeric(1) NOT NULL DEFAULT 0 ,
PRIMARY KEY ("id")
);
create index "addon_hidden_idx" on addon ("hidden");
@@ -115,13 +117,13 @@ CREATE TABLE "app" (
"app_url" text NOT NULL DEFAULT '',
"app_photo" text NOT NULL DEFAULT '',
"app_version" text NOT NULL DEFAULT '',
- "app_channel" bigint NOT NULL DEFAULT '0',
+ "app_channel" bigint NOT NULL DEFAULT 0 ,
"app_addr" text NOT NULL DEFAULT '',
"app_price" text NOT NULL DEFAULT '',
"app_page" text NOT NULL DEFAULT '',
"app_requires" text NOT NULL DEFAULT '',
- "app_deleted" smallint NOT NULL DEFAULT '0',
- "app_system" smallint NOT NULL DEFAULT '0',
+ "app_deleted" smallint NOT NULL DEFAULT 0 ,
+ "app_system" smallint NOT NULL DEFAULT 0 ,
"app_plugin" text NOT NULL DEFAULT '',
"app_created" timestamp NOT NULL DEFAULT '0001-01-01 00:00:00',
"app_edited" timestamp NOT NULL DEFAULT '0001-01-01 00:00:00',
@@ -156,19 +158,19 @@ create index atoken_expires on atoken (atoken_expires);
CREATE TABLE "attach" (
"id" serial NOT NULL,
- "aid" bigint NOT NULL DEFAULT '0',
- "uid" bigint NOT NULL DEFAULT '0',
+ "aid" bigint NOT NULL DEFAULT 0 ,
+ "uid" bigint NOT NULL DEFAULT 0 ,
"hash" varchar(64) NOT NULL DEFAULT '',
"creator" varchar(128) NOT NULL DEFAULT '',
"filename" text NOT NULL DEFAULT '',
"filetype" varchar(64) NOT NULL DEFAULT '',
- "filesize" bigint NOT NULL DEFAULT '0',
- "revision" bigint NOT NULL DEFAULT '0',
+ "filesize" bigint NOT NULL DEFAULT 0 ,
+ "revision" bigint NOT NULL DEFAULT 0 ,
"folder" varchar(64) NOT NULL DEFAULT '',
- "flags" bigint NOT NULL DEFAULT '0',
- "is_dir" smallint NOT NULL DEFAULT '0',
- "is_photo" smallint NOT NULL DEFAULT '0',
- "os_storage" smallint NOT NULL DEFAULT '0',
+ "flags" bigint NOT NULL DEFAULT 0 ,
+ "is_dir" smallint NOT NULL DEFAULT 0 ,
+ "is_photo" smallint NOT NULL DEFAULT 0 ,
+ "os_storage" smallint NOT NULL DEFAULT 0 ,
"os_path" text NOT NULL,
"display_path" text NOT NULL,
"content" bytea NOT NULL,
@@ -212,8 +214,8 @@ CREATE TABLE "cache" (
);
CREATE TABLE "cal" (
"cal_id" serial NOT NULL,
- "cal_aid" bigint NOT NULL DEFAULT '0',
- "cal_uid" bigint NOT NULL DEFAULT '0',
+ "cal_aid" bigint NOT NULL DEFAULT 0 ,
+ "cal_uid" bigint NOT NULL DEFAULT 0 ,
"cal_hash" text NOT NULL,
"cal_name" text NOT NULL,
"uri" text NOT NULL,
@@ -221,7 +223,7 @@ CREATE TABLE "cal" (
"pass" text NOT NULL,
"ctag" text NOT NULL,
"synctoken" text NOT NULL,
- "cal_types" text NOT NULL DEFAULT '0',
+ "cal_types" text NOT NULL DEFAULT 0 ,
PRIMARY KEY ("cal_id")
);
create index "cal_hash_idx" on cal ("cal_hash");
@@ -232,8 +234,8 @@ create index "cal_uid_idx" on cal ("cal_uid");
CREATE TABLE "channel" (
"channel_id" serial NOT NULL,
- "channel_account_id" bigint NOT NULL DEFAULT '0',
- "channel_primary" numeric(1) NOT NULL DEFAULT '0',
+ "channel_account_id" bigint NOT NULL DEFAULT 0 ,
+ "channel_primary" numeric(1) NOT NULL DEFAULT 0 ,
"channel_name" text NOT NULL DEFAULT '',
"channel_address" text NOT NULL DEFAULT '',
"channel_guid" text NOT NULL DEFAULT '',
@@ -245,41 +247,43 @@ CREATE TABLE "channel" (
"channel_startpage" text NOT NULL DEFAULT '',
"channel_pubkey" text NOT NULL,
"channel_prvkey" text NOT NULL,
- "channel_notifyflags" bigint NOT NULL DEFAULT '65535',
- "channel_pageflags" bigint NOT NULL DEFAULT '0',
+ "channel_notifyflags" bigint NOT NULL DEFAULT 65535,
+ "channel_pageflags" bigint NOT NULL DEFAULT 0 ,
"channel_dirdate" timestamp NOT NULL DEFAULT '0001-01-01 00:00:00',
"channel_lastpost" timestamp NOT NULL DEFAULT '0001-01-01 00:00:00',
"channel_deleted" timestamp NOT NULL DEFAULT '0001-01-01 00:00:00',
- "channel_max_anon_mail" bigint NOT NULL DEFAULT '10',
- "channel_max_friend_req" bigint NOT NULL DEFAULT '10',
- "channel_expire_days" bigint NOT NULL DEFAULT '0',
+ "channel_max_anon_mail" bigint NOT NULL DEFAULT 10,
+ "channel_max_friend_req" bigint NOT NULL DEFAULT 10,
+ "channel_expire_days" bigint NOT NULL DEFAULT 0 ,
"channel_passwd_reset" text NOT NULL DEFAULT '',
"channel_default_group" text NOT NULL DEFAULT '',
"channel_allow_cid" text ,
"channel_allow_gid" text ,
"channel_deny_cid" text ,
"channel_deny_gid" text ,
- "channel_r_stream" bigint NOT NULL DEFAULT '128',
- "channel_r_profile" bigint NOT NULL DEFAULT '128',
- "channel_r_photos" bigint NOT NULL DEFAULT '128',
- "channel_r_abook" bigint NOT NULL DEFAULT '128',
- "channel_w_stream" bigint NOT NULL DEFAULT '128',
- "channel_w_wall" bigint NOT NULL DEFAULT '128',
- "channel_w_tagwall" bigint NOT NULL DEFAULT '128',
- "channel_w_comment" bigint NOT NULL DEFAULT '128',
- "channel_w_mail" bigint NOT NULL DEFAULT '128',
- "channel_w_photos" bigint NOT NULL DEFAULT '128',
- "channel_w_chat" bigint NOT NULL DEFAULT '128',
- "channel_a_delegate" bigint NOT NULL DEFAULT '0',
- "channel_r_storage" bigint NOT NULL DEFAULT '128',
- "channel_w_storage" bigint NOT NULL DEFAULT '128',
- "channel_r_pages" bigint NOT NULL DEFAULT '128',
- "channel_w_pages" bigint NOT NULL DEFAULT '128',
- "channel_a_republish" bigint NOT NULL DEFAULT '128',
- "channel_w_like" bigint NOT NULL DEFAULT '128',
- "channel_removed" smallint NOT NULL DEFAULT '0',
- "channel_system" smallint NOT NULL DEFAULT '0',
+ "channel_r_stream" bigint NOT NULL DEFAULT 0,
+ "channel_r_profile" bigint NOT NULL DEFAULT 0,
+ "channel_r_photos" bigint NOT NULL DEFAULT 0,
+ "channel_r_abook" bigint NOT NULL DEFAULT 0,
+ "channel_w_stream" bigint NOT NULL DEFAULT 0,
+ "channel_w_wall" bigint NOT NULL DEFAULT 0,
+ "channel_w_tagwall" bigint NOT NULL DEFAULT 0,
+ "channel_w_comment" bigint NOT NULL DEFAULT 0,
+ "channel_w_mail" bigint NOT NULL DEFAULT 0,
+ "channel_w_photos" bigint NOT NULL DEFAULT 0,
+ "channel_w_chat" bigint NOT NULL DEFAULT 0,
+ "channel_a_delegate" bigint NOT NULL DEFAULT 0 ,
+ "channel_r_storage" bigint NOT NULL DEFAULT 0,
+ "channel_w_storage" bigint NOT NULL DEFAULT 0,
+ "channel_r_pages" bigint NOT NULL DEFAULT 0,
+ "channel_w_pages" bigint NOT NULL DEFAULT 0,
+ "channel_a_republish" bigint NOT NULL DEFAULT 0,
+ "channel_w_like" bigint NOT NULL DEFAULT 0,
+ "channel_removed" smallint NOT NULL DEFAULT 0 ,
+ "channel_system" smallint NOT NULL DEFAULT 0 ,
"channel_moved" text NOT NULL DEFAULT '',
+ "channel_password" varchar(255) NOT NULL,
+ "channel_salt" varchar(255) NOT NULL,
PRIMARY KEY ("channel_id"),
UNIQUE ("channel_address")
);
@@ -323,7 +327,7 @@ create index "channel_system" on channel ("channel_system");
create index "channel_moved" on channel ("channel_moved");
CREATE TABLE "chat" (
"chat_id" serial NOT NULL,
- "chat_room" bigint NOT NULL DEFAULT '0',
+ "chat_room" bigint NOT NULL DEFAULT 0 ,
"chat_xchan" text NOT NULL DEFAULT '',
"chat_text" text NOT NULL,
"created" timestamp NOT NULL DEFAULT '0001-01-01 00:00:00',
@@ -334,11 +338,11 @@ create index "chat_xchan_idx" on chat ("chat_xchan");
create index "chat_created_idx" on chat ("created");
CREATE TABLE "chatpresence" (
"cp_id" serial NOT NULL,
- "cp_room" bigint NOT NULL DEFAULT '0',
+ "cp_room" bigint NOT NULL DEFAULT 0 ,
"cp_xchan" text NOT NULL DEFAULT '',
"cp_last" timestamp NOT NULL DEFAULT '0001-01-01 00:00:00',
"cp_status" text NOT NULL,
- "cp_client" char(128) NOT NULL DEFAULT '',
+ "cp_client" varchar(128) NOT NULL DEFAULT '',
PRIMARY KEY ("cp_id")
);
create index "cp_room" on chatpresence ("cp_room");
@@ -348,12 +352,12 @@ create index "cp_status" on chatpresence ("cp_status");
CREATE TABLE "chatroom" (
"cr_id" serial NOT NULL,
- "cr_aid" bigint NOT NULL DEFAULT '0',
- "cr_uid" bigint NOT NULL DEFAULT '0',
+ "cr_aid" bigint NOT NULL DEFAULT 0 ,
+ "cr_uid" bigint NOT NULL DEFAULT 0 ,
"cr_name" text NOT NULL DEFAULT '',
"cr_created" timestamp NOT NULL DEFAULT '0001-01-01 00:00:00',
"cr_edited" timestamp NOT NULL DEFAULT '0001-01-01 00:00:00',
- "cr_expire" bigint NOT NULL DEFAULT '0',
+ "cr_expire" bigint NOT NULL DEFAULT 0 ,
"allow_cid" text NOT NULL,
"allow_gid" text NOT NULL,
"deny_cid" text NOT NULL,
@@ -372,7 +376,7 @@ CREATE TABLE "clients" (
"redirect_uri" varchar(200) NOT NULL,
"clname" text,
"icon" text,
- "uid" bigint NOT NULL DEFAULT '0',
+ "uid" bigint NOT NULL DEFAULT 0 ,
PRIMARY KEY ("client_id")
);
CREATE TABLE "config" (
@@ -399,14 +403,14 @@ create index "conv_updated_idx" on conv ("updated");
CREATE TABLE IF NOT EXISTS "dreport" (
"dreport_id" serial NOT NULL,
- "dreport_channel" int NOT NULL DEFAULT '0',
- "dreport_mid" char(255) NOT NULL DEFAULT '',
- "dreport_site" char(255) NOT NULL DEFAULT '',
- "dreport_recip" char(255) NOT NULL DEFAULT '',
- "dreport_result" char(255) NOT NULL DEFAULT '',
+ "dreport_channel" int NOT NULL DEFAULT 0 ,
+ "dreport_mid" varchar(255) NOT NULL DEFAULT '',
+ "dreport_site" varchar(255) NOT NULL DEFAULT '',
+ "dreport_recip" varchar(255) NOT NULL DEFAULT '',
+ "dreport_result" varchar(255) NOT NULL DEFAULT '',
"dreport_time" timestamp NOT NULL DEFAULT '0001-01-01 00:00:00',
- "dreport_xchan" char(255) NOT NULL DEFAULT '',
- "dreport_queue" char(255) NOT NULL DEFAULT '',
+ "dreport_xchan" varchar(255) NOT NULL DEFAULT '',
+ "dreport_queue" varchar(255) NOT NULL DEFAULT '',
PRIMARY KEY ("dreport_id")
);
@@ -419,9 +423,9 @@ create index "dreport_channel" on dreport ("dreport_channel");
CREATE TABLE "event" (
"id" serial NOT NULL,
- "aid" bigint NOT NULL DEFAULT '0',
+ "aid" bigint NOT NULL DEFAULT 0 ,
"uid" bigint NOT NULL,
- "cal_id" bigint NOT NULL DEFAULT '0',
+ "cal_id" bigint NOT NULL DEFAULT 0 ,
"event_xchan" text NOT NULL DEFAULT '',
"event_hash" text NOT NULL DEFAULT '',
"created" timestamp NOT NULL DEFAULT '0001-01-01 00:00:00',
@@ -432,19 +436,19 @@ CREATE TABLE "event" (
"description" text NOT NULL,
"location" text NOT NULL,
"etype" text NOT NULL,
- "nofinish" numeric(1) NOT NULL DEFAULT '0',
- "adjust" numeric(1) NOT NULL DEFAULT '1',
- "dismissed" numeric(1) NOT NULL DEFAULT '0',
+ "nofinish" numeric(1) NOT NULL DEFAULT 0 ,
+ "adjust" numeric(1) NOT NULL DEFAULT 1,
+ "dismissed" numeric(1) NOT NULL DEFAULT 0 ,
"allow_cid" text NOT NULL,
"allow_gid" text NOT NULL,
"deny_cid" text NOT NULL,
"deny_gid" text NOT NULL,
- "event_status" char(255) NOT NULL DEFAULT '',
+ "event_status" varchar(255) NOT NULL DEFAULT '',
"event_status_date" timestamp NOT NULL DEFAULT '0001-01-01 00:00:00',
- "event_percent" smallint NOT NULL DEFAULT '0',
+ "event_percent" smallint NOT NULL DEFAULT 0 ,
"event_repeat" text NOT NULL,
- "event_sequence" smallint NOT NULL DEFAULT '0',
- "event_priority" smallint NOT NULL DEFAULT '0',
+ "event_sequence" smallint NOT NULL DEFAULT 0 ,
+ "event_priority" smallint NOT NULL DEFAULT 0 ,
"event_vdata" text NOT NULL,
PRIMARY KEY ("id")
);
@@ -478,8 +482,8 @@ CREATE TABLE "groups" (
"id" serial NOT NULL,
"hash" text NOT NULL DEFAULT '',
"uid" bigint NOT NULL,
- "visible" numeric(1) NOT NULL DEFAULT '0',
- "deleted" numeric(1) NOT NULL DEFAULT '0',
+ "visible" numeric(1) NOT NULL DEFAULT 0 ,
+ "deleted" numeric(1) NOT NULL DEFAULT 0 ,
"gname" text NOT NULL,
PRIMARY KEY ("id")
@@ -494,8 +498,8 @@ CREATE TABLE "hook" (
"hook" text NOT NULL,
"file" text NOT NULL,
"fn" text NOT NULL,
- "priority" smallint NOT NULL DEFAULT '0',
- "hook_version" smallint NOT NULL DEFAULT '0',
+ "priority" smallint NOT NULL DEFAULT 0 ,
+ "hook_version" smallint NOT NULL DEFAULT 0 ,
PRIMARY KEY ("id")
);
@@ -510,8 +514,8 @@ CREATE TABLE "hubloc" (
"hubloc_hash" text NOT NULL,
"hubloc_addr" text NOT NULL DEFAULT '',
"hubloc_network" text NOT NULL DEFAULT '',
- "hubloc_flags" bigint NOT NULL DEFAULT '0',
- "hubloc_status" bigint NOT NULL DEFAULT '0',
+ "hubloc_flags" bigint NOT NULL DEFAULT 0 ,
+ "hubloc_status" bigint NOT NULL DEFAULT 0 ,
"hubloc_url" text NOT NULL DEFAULT '',
"hubloc_url_sig" text NOT NULL DEFAULT '',
"hubloc_host" text NOT NULL DEFAULT '',
@@ -520,10 +524,10 @@ CREATE TABLE "hubloc" (
"hubloc_sitekey" text NOT NULL DEFAULT '',
"hubloc_updated" timestamp NOT NULL DEFAULT '0001-01-01 00:00:00',
"hubloc_connected" timestamp NOT NULL DEFAULT '0001-01-01 00:00:00',
- "hubloc_primary" smallint NOT NULL DEFAULT '0',
- "hubloc_orphancheck" smallint NOT NULL DEFAULT '0',
- "hubloc_error" smallint NOT NULL DEFAULT '0',
- "hubloc_deleted" smallint NOT NULL DEFAULT '0',
+ "hubloc_primary" smallint NOT NULL DEFAULT 0 ,
+ "hubloc_orphancheck" smallint NOT NULL DEFAULT 0 ,
+ "hubloc_error" smallint NOT NULL DEFAULT 0 ,
+ "hubloc_deleted" smallint NOT NULL DEFAULT 0 ,
PRIMARY KEY ("hubloc_id")
);
create index "hubloc_url" on hubloc ("hubloc_url");
@@ -542,11 +546,11 @@ create index "hubloc_error" on hubloc ("hubloc_error");
create index "hubloc_deleted" on hubloc ("hubloc_deleted");
CREATE TABLE "iconfig" (
"id" serial NOT NULL,
- "iid" bigint NOT NULL DEFAULT '0',
+ "iid" bigint NOT NULL DEFAULT 0 ,
"cat" text NOT NULL DEFAULT '',
"k" text NOT NULL DEFAULT '',
"v" text NOT NULL DEFAULT '',
- "sharing" int NOT NULL DEFAULT '0',
+ "sharing" int NOT NULL DEFAULT 0 ,
PRIMARY KEY("id")
);
create index "iconfig_iid" on iconfig ("iid");
@@ -573,9 +577,9 @@ create index "issue_component" on issue ("issue_component");
CREATE TABLE "item" (
"id" serial NOT NULL,
"mid" text NOT NULL DEFAULT '',
- "aid" bigint NOT NULL DEFAULT '0',
- "uid" bigint NOT NULL DEFAULT '0',
- "parent" bigint NOT NULL DEFAULT '0',
+ "aid" bigint NOT NULL DEFAULT 0 ,
+ "uid" bigint NOT NULL DEFAULT 0 ,
+ "parent" bigint NOT NULL DEFAULT 0 ,
"parent_mid" text NOT NULL DEFAULT '',
"thr_parent" text NOT NULL DEFAULT '',
"created" timestamp NOT NULL DEFAULT '0001-01-01 00:00:00',
@@ -594,7 +598,7 @@ CREATE TABLE "item" (
"html" text NOT NULL,
"app" text NOT NULL DEFAULT '',
"lang" varchar(64) NOT NULL DEFAULT '',
- "revision" bigint NOT NULL DEFAULT '0',
+ "revision" bigint NOT NULL DEFAULT 0 ,
"verb" text NOT NULL DEFAULT '',
"obj_type" text NOT NULL DEFAULT '',
"obj" text NOT NULL,
@@ -618,32 +622,32 @@ CREATE TABLE "item" (
"allow_gid" text NOT NULL,
"deny_cid" text NOT NULL,
"deny_gid" text NOT NULL,
- "item_restrict" bigint NOT NULL DEFAULT '0',
- "item_flags" bigint NOT NULL DEFAULT '0',
- "item_private" numeric(4) NOT NULL DEFAULT '0',
- "item_unseen" smallint NOT NULL DEFAULT '0',
- "item_wall" smallint NOT NULL DEFAULT '0',
- "item_origin" smallint NOT NULL DEFAULT '0',
- "item_starred" smallint NOT NULL DEFAULT '0',
- "item_uplink" smallint NOT NULL DEFAULT '0',
- "item_consensus" smallint NOT NULL DEFAULT '0',
- "item_thread_top" smallint NOT NULL DEFAULT '0',
- "item_notshown" smallint NOT NULL DEFAULT '0',
- "item_nsfw" smallint NOT NULL DEFAULT '0',
- "item_relay" smallint NOT NULL DEFAULT '0',
- "item_mentionsme" smallint NOT NULL DEFAULT '0',
- "item_nocomment" smallint NOT NULL DEFAULT '0',
- "item_obscured" smallint NOT NULL DEFAULT '0',
- "item_verified" smallint NOT NULL DEFAULT '0',
- "item_retained" smallint NOT NULL DEFAULT '0',
- "item_rss" smallint NOT NULL DEFAULT '0',
- "item_deleted" smallint NOT NULL DEFAULT '0',
- "item_type" int NOT NULL DEFAULT '0',
- "item_hidden" smallint NOT NULL DEFAULT '0',
- "item_unpublished" smallint NOT NULL DEFAULT '0',
- "item_delayed" smallint NOT NULL DEFAULT '0',
- "item_pending_remove" smallint NOT NULL DEFAULT '0',
- "item_blocked" smallint NOT NULL DEFAULT '0',
+ "item_restrict" bigint NOT NULL DEFAULT 0 ,
+ "item_flags" bigint NOT NULL DEFAULT 0 ,
+ "item_private" numeric(4) NOT NULL DEFAULT 0 ,
+ "item_unseen" smallint NOT NULL DEFAULT 0 ,
+ "item_wall" smallint NOT NULL DEFAULT 0 ,
+ "item_origin" smallint NOT NULL DEFAULT 0 ,
+ "item_starred" smallint NOT NULL DEFAULT 0 ,
+ "item_uplink" smallint NOT NULL DEFAULT 0 ,
+ "item_consensus" smallint NOT NULL DEFAULT 0 ,
+ "item_thread_top" smallint NOT NULL DEFAULT 0 ,
+ "item_notshown" smallint NOT NULL DEFAULT 0 ,
+ "item_nsfw" smallint NOT NULL DEFAULT 0 ,
+ "item_relay" smallint NOT NULL DEFAULT 0 ,
+ "item_mentionsme" smallint NOT NULL DEFAULT 0 ,
+ "item_nocomment" smallint NOT NULL DEFAULT 0 ,
+ "item_obscured" smallint NOT NULL DEFAULT 0 ,
+ "item_verified" smallint NOT NULL DEFAULT 0 ,
+ "item_retained" smallint NOT NULL DEFAULT 0 ,
+ "item_rss" smallint NOT NULL DEFAULT 0 ,
+ "item_deleted" smallint NOT NULL DEFAULT 0 ,
+ "item_type" int NOT NULL DEFAULT 0 ,
+ "item_hidden" smallint NOT NULL DEFAULT 0 ,
+ "item_unpublished" smallint NOT NULL DEFAULT 0 ,
+ "item_delayed" smallint NOT NULL DEFAULT 0 ,
+ "item_pending_remove" smallint NOT NULL DEFAULT 0 ,
+ "item_blocked" smallint NOT NULL DEFAULT 0 ,
"item_search_vector" tsvector,
PRIMARY KEY ("id")
);
@@ -721,14 +725,14 @@ create index "itemid_service" on item_id ("service");
create index "itemid_iid" on item_id ("iid");
CREATE TABLE "likes" (
"id" serial NOT NULL,
- "channel_id" bigint NOT NULL DEFAULT '0',
- "liker" char(128) NOT NULL DEFAULT '',
- "likee" char(128) NOT NULL DEFAULT '',
- "iid" bigint NOT NULL DEFAULT '0',
- "i_mid" char(255) NOT NULL DEFAULT '',
+ "channel_id" bigint NOT NULL DEFAULT 0 ,
+ "liker" varchar(128) NOT NULL DEFAULT '',
+ "likee" varchar(128) NOT NULL DEFAULT '',
+ "iid" bigint NOT NULL DEFAULT 0 ,
+ "i_mid" varchar(255) NOT NULL DEFAULT '',
"verb" text NOT NULL DEFAULT '',
"target_type" text NOT NULL DEFAULT '',
- "target_id" char(128) NOT NULL DEFAULT '',
+ "target_id" varchar(128) NOT NULL DEFAULT '',
"target" text NOT NULL,
PRIMARY KEY ("id")
);
@@ -742,25 +746,27 @@ create index "likes_target_type" on likes ("target_type");
create index "likes_target_id" on likes ("target_id");
CREATE TABLE "mail" (
"id" serial NOT NULL,
- "convid" bigint NOT NULL DEFAULT '0',
+ "convid" bigint NOT NULL DEFAULT 0 ,
"conv_guid" text NOT NULL,
- "mail_flags" bigint NOT NULL DEFAULT '0',
+ "mail_flags" bigint NOT NULL DEFAULT 0 ,
"from_xchan" text NOT NULL DEFAULT '',
"to_xchan" text NOT NULL DEFAULT '',
- "account_id" bigint NOT NULL DEFAULT '0',
- "channel_id" bigint NOT NULL DEFAULT '0',
+ "account_id" bigint NOT NULL DEFAULT 0 ,
+ "channel_id" bigint NOT NULL DEFAULT 0 ,
+ "mail_mimetype" varchar(64) NOT NULL DEFAULT 'text/bbcode',
"title" text NOT NULL,
"body" text NOT NULL,
"sig" text NOT NULL,
"attach" text NOT NULL DEFAULT '',
"mid" text NOT NULL,
"parent_mid" text NOT NULL,
- "mail_deleted" smallint NOT NULL DEFAULT '0',
- "mail_replied" smallint NOT NULL DEFAULT '0',
- "mail_isreply" smallint NOT NULL DEFAULT '0',
- "mail_seen" smallint NOT NULL DEFAULT '0',
- "mail_recalled" smallint NOT NULL DEFAULT '0',
- "mail_obscured" smallint NOT NULL DEFAULT '0',
+ "mail_deleted" smallint NOT NULL DEFAULT 0 ,
+ "mail_replied" smallint NOT NULL DEFAULT 0 ,
+ "mail_isreply" smallint NOT NULL DEFAULT 0 ,
+ "mail_seen" smallint NOT NULL DEFAULT 0 ,
+ "mail_recalled" smallint NOT NULL DEFAULT 0 ,
+ "mail_obscured" smallint NOT NULL DEFAULT 0 ,
+ "mail_raw" smallint NOT NULL DEFAULT 0 ,
"created" timestamp NOT NULL DEFAULT '0001-01-01 00:00:00',
"expires" timestamp NOT NULL DEFAULT '0001-01-01 00:00:00',
PRIMARY KEY ("id")
@@ -784,10 +790,10 @@ create index "mail_recalled" on mail ("mail_recalled");
create index "mail_obscured" on mail ("mail_obscured");
CREATE TABLE "menu" (
"menu_id" serial NOT NULL,
- "menu_channel_id" bigint NOT NULL DEFAULT '0',
+ "menu_channel_id" bigint NOT NULL DEFAULT 0 ,
"menu_name" text NOT NULL DEFAULT '',
"menu_desc" text NOT NULL DEFAULT '',
- "menu_flags" bigint NOT NULL DEFAULT '0',
+ "menu_flags" bigint NOT NULL DEFAULT 0 ,
"menu_created" timestamp NOT NULL DEFAULT '0001-01-01 00:00:00',
"menu_edited" timestamp NOT NULL DEFAULT '0001-01-01 00:00:00',
PRIMARY KEY ("menu_id")
@@ -801,14 +807,14 @@ CREATE TABLE "menu_item" (
"mitem_id" serial NOT NULL,
"mitem_link" text NOT NULL DEFAULT '',
"mitem_desc" text NOT NULL DEFAULT '',
- "mitem_flags" bigint NOT NULL DEFAULT '0',
+ "mitem_flags" bigint NOT NULL DEFAULT 0 ,
"allow_cid" text NOT NULL,
"allow_gid" text NOT NULL,
"deny_cid" text NOT NULL,
"deny_gid" text NOT NULL,
"mitem_channel_id" bigint NOT NULL,
- "mitem_menu_id" bigint NOT NULL DEFAULT '0',
- "mitem_order" bigint NOT NULL DEFAULT '0',
+ "mitem_menu_id" bigint NOT NULL DEFAULT 0 ,
+ "mitem_order" bigint NOT NULL DEFAULT 0 ,
PRIMARY KEY ("mitem_id")
);
@@ -817,7 +823,7 @@ create index "mitem_menu_id" on menu_item ("mitem_menu_id");
create index "mitem_flags" on menu_item ("mitem_flags");
CREATE TABLE "notify" (
"id" serial NOT NULL,
- "hash" char(64) NOT NULL,
+ "hash" varchar(64) NOT NULL,
"xname" text NOT NULL,
"url" text NOT NULL,
"photo" text NOT NULL,
@@ -827,7 +833,7 @@ CREATE TABLE "notify" (
"uid" bigint NOT NULL,
"link" text NOT NULL,
"parent" text NOT NULL DEFAULT '',
- "seen" numeric(1) NOT NULL DEFAULT '0',
+ "seen" numeric(1) NOT NULL DEFAULT 0 ,
"ntype" bigint NOT NULL,
"verb" text NOT NULL,
"otype" varchar(16) NOT NULL,
@@ -844,14 +850,14 @@ create index "notify_otype" on notify ("otype");
create index "notify_aid" on notify ("aid");
CREATE TABLE "obj" (
"obj_id" serial NOT NULL,
- "obj_page" char(64) NOT NULL DEFAULT '',
+ "obj_page" varchar(64) NOT NULL DEFAULT '',
"obj_verb" text NOT NULL DEFAULT '',
"obj_type" bigint NOT NULL DEFAULT 0,
"obj_obj" text NOT NULL DEFAULT '',
"obj_channel" bigint NOT NULL DEFAULT 0,
- "obj_term" char(255) NOT NULL DEFAULT '',
- "obj_url" char(255) NOT NULL DEFAULT '',
- "obj_imgurl" char(255) NOT NULL DEFAULT '',
+ "obj_term" varchar(255) NOT NULL DEFAULT '',
+ "obj_url" varchar(255) NOT NULL DEFAULT '',
+ "obj_imgurl" varchar(255) NOT NULL DEFAULT '',
"obj_created" timestamp NOT NULL DEFAULT '0001-01-01 00:00:00',
"obj_edited" timestamp NOT NULL DEFAULT '0001-01-01 00:00:00',
"obj_quantity" bigint NOT NULL DEFAULT 0,
@@ -876,18 +882,18 @@ create index "obj_quantity" on obj ("obj_quantity");
CREATE TABLE "outq" (
"outq_hash" text NOT NULL,
- "outq_account" bigint NOT NULL DEFAULT '0',
- "outq_channel" bigint NOT NULL DEFAULT '0',
+ "outq_account" bigint NOT NULL DEFAULT 0 ,
+ "outq_channel" bigint NOT NULL DEFAULT 0 ,
"outq_driver" varchar(32) NOT NULL DEFAULT '',
"outq_posturl" text NOT NULL DEFAULT '',
- "outq_async" numeric(1) NOT NULL DEFAULT '0',
- "outq_delivered" numeric(1) NOT NULL DEFAULT '0',
+ "outq_async" numeric(1) NOT NULL DEFAULT 0 ,
+ "outq_delivered" numeric(1) NOT NULL DEFAULT 0 ,
"outq_created" timestamp NOT NULL DEFAULT '0001-01-01 00:00:00',
"outq_updated" timestamp NOT NULL DEFAULT '0001-01-01 00:00:00',
"outq_scheduled" timestamp NOT NULL DEFAULT '0001-01-01 00:00:00',
"outq_notify" text NOT NULL,
"outq_msg" text NOT NULL,
- "outq_priority" smallint NOT NULL DEFAULT '0',
+ "outq_priority" smallint NOT NULL DEFAULT 0 ,
PRIMARY KEY ("outq_hash")
);
create index "outq_account" on outq ("outq_account");
@@ -902,7 +908,7 @@ create index "outq_priority" on outq ("outq_priority");
CREATE TABLE "pconfig" (
"id" serial NOT NULL,
- "uid" bigint NOT NULL DEFAULT '0',
+ "uid" bigint NOT NULL DEFAULT 0 ,
"cat" text NOT NULL,
"k" text NOT NULL,
"v" text NOT NULL,
@@ -912,7 +918,7 @@ CREATE TABLE "pconfig" (
CREATE TABLE "photo" (
"id" serial NOT NULL,
- "aid" bigint NOT NULL DEFAULT '0',
+ "aid" bigint NOT NULL DEFAULT 0 ,
"uid" bigint NOT NULL,
"xchan" text NOT NULL DEFAULT '',
"resource_id" text NOT NULL,
@@ -925,16 +931,16 @@ CREATE TABLE "photo" (
"mimetype" varchar(128) NOT NULL DEFAULT 'image/jpeg',
"height" numeric(6) NOT NULL,
"width" numeric(6) NOT NULL,
- "filesize" bigint NOT NULL DEFAULT '0',
+ "filesize" bigint NOT NULL DEFAULT 0 ,
"content" bytea NOT NULL,
- "imgscale" numeric(3) NOT NULL DEFAULT '0',
- "profile" numeric(1) NOT NULL DEFAULT '0',
- "photo_usage" smallint NOT NULL DEFAULT '0',
- "is_nsfw" smallint NOT NULL DEFAULT '0',
- "os_storage" smallint NOT NULL DEFAULT '0',
+ "imgscale" numeric(3) NOT NULL DEFAULT 0 ,
+ "profile" numeric(1) NOT NULL DEFAULT 0 ,
+ "photo_usage" smallint NOT NULL DEFAULT 0 ,
+ "is_nsfw" smallint NOT NULL DEFAULT 0 ,
+ "os_storage" smallint NOT NULL DEFAULT 0 ,
"os_path" text NOT NULL,
"display_path" text NOT NULL,
- "photo_flags" bigint NOT NULL DEFAULT '0',
+ "photo_flags" bigint NOT NULL DEFAULT 0 ,
"allow_cid" text NOT NULL,
"allow_gid" text NOT NULL,
"deny_cid" text NOT NULL,
@@ -957,10 +963,10 @@ create index "photo_os_storage" on photo ("os_storage");
CREATE TABLE "poll" (
"poll_id" serial NOT NULL,
- "poll_channel" bigint NOT NULL DEFAULT '0',
+ "poll_channel" bigint NOT NULL DEFAULT 0 ,
"poll_desc" text NOT NULL,
- "poll_flags" bigint NOT NULL DEFAULT '0',
- "poll_votes" bigint NOT NULL DEFAULT '0',
+ "poll_flags" bigint NOT NULL DEFAULT 0 ,
+ "poll_votes" bigint NOT NULL DEFAULT 0 ,
PRIMARY KEY ("poll_id")
);
@@ -969,10 +975,10 @@ create index "poll_flags" on poll ("poll_flags");
create index "poll_votes" on poll ("poll_votes");
CREATE TABLE "poll_elm" (
"pelm_id" serial NOT NULL,
- "pelm_poll" bigint NOT NULL DEFAULT '0',
+ "pelm_poll" bigint NOT NULL DEFAULT 0 ,
"pelm_desc" text NOT NULL,
- "pelm_flags" bigint NOT NULL DEFAULT '0',
- "pelm_result" float NOT NULL DEFAULT '0',
+ "pelm_flags" bigint NOT NULL DEFAULT 0 ,
+ "pelm_result" float NOT NULL DEFAULT 0 ,
PRIMARY KEY ("pelm_id")
);
create index "pelm_poll" on poll_elm ("pelm_poll");
@@ -990,7 +996,7 @@ CREATE TABLE "profdef" (
create index "profdef_field_name" on profdef ("field_name");
CREATE TABLE "profext" (
"id" serial NOT NULL,
- "channel_id" bigint NOT NULL DEFAULT '0',
+ "channel_id" bigint NOT NULL DEFAULT 0 ,
"hash" text NOT NULL DEFAULT '',
"k" text NOT NULL DEFAULT '',
"v" text NOT NULL,
@@ -1002,12 +1008,12 @@ create index "profext_k" on profext ("k");
CREATE TABLE "profile" (
"id" serial NOT NULL,
- "profile_guid" char(64) NOT NULL DEFAULT '',
- "aid" bigint NOT NULL DEFAULT '0',
+ "profile_guid" varchar(64) NOT NULL DEFAULT '',
+ "aid" bigint NOT NULL DEFAULT 0 ,
"uid" bigint NOT NULL,
"profile_name" text NOT NULL,
- "is_default" numeric(1) NOT NULL DEFAULT '0',
- "hide_friends" numeric(1) NOT NULL DEFAULT '0',
+ "is_default" numeric(1) NOT NULL DEFAULT 0 ,
+ "hide_friends" numeric(1) NOT NULL DEFAULT 0 ,
"fullname" text NOT NULL,
"pdesc" text NOT NULL DEFAULT '',
"chandesc" text NOT NULL DEFAULT '',
@@ -1044,7 +1050,7 @@ CREATE TABLE "profile" (
"homepage" text NOT NULL DEFAULT '',
"photo" text NOT NULL,
"thumb" text NOT NULL,
- "publish" numeric(1) NOT NULL DEFAULT '0',
+ "publish" numeric(1) NOT NULL DEFAULT 0 ,
"profile_vcard" text NOT NULL DEFAULT '',
PRIMARY KEY ("id"),
UNIQUE ("profile_guid","uid")
@@ -1066,7 +1072,7 @@ create index "profile_guid" on profile ("profile_guid");
CREATE TABLE "profile_check" (
"id" serial NOT NULL,
"uid" bigint NOT NULL,
- "cid" bigint NOT NULL DEFAULT '0',
+ "cid" bigint NOT NULL DEFAULT 0 ,
"dfrn_id" text NOT NULL,
"sec" text NOT NULL,
"expire" bigint NOT NULL,
@@ -1101,8 +1107,8 @@ create index "session_sid" on session ("sid");
create index "session_expire" on session ("expire");
CREATE TABLE "shares" (
"share_id" serial NOT NULL,
- "share_type" bigint NOT NULL DEFAULT '0',
- "share_target" bigint NOT NULL DEFAULT '0',
+ "share_type" bigint NOT NULL DEFAULT 0 ,
+ "share_target" bigint NOT NULL DEFAULT 0 ,
"share_xchan" text NOT NULL DEFAULT '',
PRIMARY KEY ("share_id")
);
@@ -1112,8 +1118,8 @@ create index "share_xchan" on shares ("share_xchan");
CREATE TABLE "sign" (
"id" serial NOT NULL,
- "iid" bigint NOT NULL DEFAULT '0',
- "retract_iid" bigint NOT NULL DEFAULT '0',
+ "iid" bigint NOT NULL DEFAULT 0 ,
+ "retract_iid" bigint NOT NULL DEFAULT 0 ,
"signed_text" text NOT NULL,
"signature" text NOT NULL,
"signer" text NOT NULL,
@@ -1124,19 +1130,19 @@ create index "sign_retract_iid" on "sign" ("retract_iid");
CREATE TABLE "site" (
"site_url" text NOT NULL,
- "site_access" bigint NOT NULL DEFAULT '0',
- "site_flags" bigint NOT NULL DEFAULT '0',
+ "site_access" bigint NOT NULL DEFAULT 0 ,
+ "site_flags" bigint NOT NULL DEFAULT 0 ,
"site_update" timestamp NOT NULL DEFAULT '0001-01-01 00:00:00',
"site_pull" timestamp NOT NULL DEFAULT '0001-01-01 00:00:00',
"site_sync" timestamp NOT NULL DEFAULT '0001-01-01 00:00:00',
"site_directory" text NOT NULL DEFAULT '',
- "site_register" bigint NOT NULL DEFAULT '0',
+ "site_register" bigint NOT NULL DEFAULT 0 ,
"site_sellpage" text NOT NULL DEFAULT '',
"site_location" text NOT NULL DEFAULT '',
"site_realm" text NOT NULL DEFAULT '',
- "site_valid" smallint NOT NULL DEFAULT '0',
- "site_dead" smallint NOT NULL DEFAULT '0',
- "site_type" smallint NOT NULL DEFAULT '0',
+ "site_valid" smallint NOT NULL DEFAULT 0 ,
+ "site_dead" smallint NOT NULL DEFAULT 0 ,
+ "site_type" smallint NOT NULL DEFAULT 0 ,
"site_project" text NOT NULL DEFAULT '',
"site_version" text NOT NULL DEFAULT '',
"site_crypto" text NOT NULL DEFAULT '',
@@ -1156,7 +1162,7 @@ create index "site_project" on site ("site_project");
CREATE TABLE "source" (
"src_id" serial NOT NULL,
- "src_channel_id" bigint NOT NULL DEFAULT '0',
+ "src_channel_id" bigint NOT NULL DEFAULT 0 ,
"src_channel_xchan" text NOT NULL DEFAULT '',
"src_xchan" text NOT NULL DEFAULT '',
"src_patt" text NOT NULL DEFAULT '',
@@ -1176,8 +1182,8 @@ CREATE TABLE "sys_perms" (
);
CREATE TABLE "term" (
"tid" serial NOT NULL,
- "aid" bigint NOT NULL DEFAULT '0',
- "uid" bigint NOT NULL DEFAULT '0',
+ "aid" bigint NOT NULL DEFAULT 0 ,
+ "uid" bigint NOT NULL DEFAULT 0 ,
"oid" bigint NOT NULL,
"otype" numeric(3) NOT NULL,
"ttype" numeric(3) NOT NULL,
@@ -1212,11 +1218,11 @@ create index "tokens_uid" on tokens ("uid");
CREATE TABLE "updates" (
"ud_id" serial NOT NULL,
- "ud_hash" char(128) NOT NULL,
+ "ud_hash" varchar(128) NOT NULL,
"ud_guid" text NOT NULL DEFAULT '',
"ud_date" timestamp NOT NULL DEFAULT '0001-01-01 00:00:00',
"ud_last" timestamp NOT NULL DEFAULT '0001-01-01 00:00:00',
- "ud_flags" bigint NOT NULL DEFAULT '0',
+ "ud_flags" bigint NOT NULL DEFAULT 0 ,
"ud_addr" text NOT NULL DEFAULT '',
PRIMARY KEY ("ud_id")
);
@@ -1228,7 +1234,7 @@ create index "ud_addr" on updates ("ud_addr");
create index "ud_last" on updates ("ud_last");
CREATE TABLE "verify" (
"id" serial NOT NULL,
- "channel" bigint NOT NULL DEFAULT '0',
+ "channel" bigint NOT NULL DEFAULT 0 ,
"vtype" varchar(32) NOT NULL DEFAULT '',
"token" text NOT NULL DEFAULT '',
"meta" text NOT NULL DEFAULT '',
@@ -1242,8 +1248,8 @@ create index "verify_meta" on verify ("meta");
create index "verify_created" on verify ("created");
CREATE TABLE "vote" (
"vote_id" serial NOT NULL,
- "vote_poll" bigint NOT NULL DEFAULT '0',
- "vote_element" bigint NOT NULL DEFAULT '0',
+ "vote_poll" bigint NOT NULL DEFAULT 0 ,
+ "vote_element" bigint NOT NULL DEFAULT 0 ,
"vote_result" text NOT NULL,
"vote_xchan" text NOT NULL DEFAULT '',
PRIMARY KEY ("vote_id"),
@@ -1268,16 +1274,16 @@ CREATE TABLE "xchan" (
"xchan_name" text NOT NULL DEFAULT '',
"xchan_network" text NOT NULL DEFAULT '',
"xchan_instance_url" text NOT NULL DEFAULT '',
- "xchan_flags" bigint NOT NULL DEFAULT '0',
+ "xchan_flags" bigint NOT NULL DEFAULT 0 ,
"xchan_photo_date" timestamp NOT NULL DEFAULT '0001-01-01 00:00:00',
"xchan_name_date" timestamp NOT NULL DEFAULT '0001-01-01 00:00:00',
- "xchan_hidden" smallint NOT NULL DEFAULT '0',
- "xchan_orphan" smallint NOT NULL DEFAULT '0',
- "xchan_censored" smallint NOT NULL DEFAULT '0',
- "xchan_selfcensored" smallint NOT NULL DEFAULT '0',
- "xchan_system" smallint NOT NULL DEFAULT '0',
- "xchan_pubforum" smallint NOT NULL DEFAULT '0',
- "xchan_deleted" smallint NOT NULL DEFAULT '0',
+ "xchan_hidden" smallint NOT NULL DEFAULT 0 ,
+ "xchan_orphan" smallint NOT NULL DEFAULT 0 ,
+ "xchan_censored" smallint NOT NULL DEFAULT 0 ,
+ "xchan_selfcensored" smallint NOT NULL DEFAULT 0 ,
+ "xchan_system" smallint NOT NULL DEFAULT 0 ,
+ "xchan_pubforum" smallint NOT NULL DEFAULT 0 ,
+ "xchan_deleted" smallint NOT NULL DEFAULT 0 ,
PRIMARY KEY ("xchan_hash")
);
create index "xchan_guid" on xchan ("xchan_guid");
@@ -1322,7 +1328,7 @@ create index "xconfig_cat" on xconfig ("cat");
create index "xconfig_k" on xconfig ("k");
CREATE TABLE "xign" (
"id" serial NOT NULL,
- "uid" bigint NOT NULL DEFAULT '0',
+ "uid" bigint NOT NULL DEFAULT 0 ,
"xchan" text NOT NULL DEFAULT '',
PRIMARY KEY ("id")
);
@@ -1332,10 +1338,10 @@ CREATE TABLE "xlink" (
"xlink_id" serial NOT NULL,
"xlink_xchan" text NOT NULL DEFAULT '',
"xlink_link" text NOT NULL DEFAULT '',
- "xlink_rating" bigint NOT NULL DEFAULT '0',
+ "xlink_rating" bigint NOT NULL DEFAULT 0 ,
"xlink_rating_text" TEXT NOT NULL DEFAULT '',
"xlink_updated" timestamp NOT NULL DEFAULT '0001-01-01 00:00:00',
- "xlink_static" numeric(1) NOT NULL DEFAULT '0',
+ "xlink_static" numeric(1) NOT NULL DEFAULT 0 ,
"xlink_sig" text NOT NULL DEFAULT '',
PRIMARY KEY ("xlink_id")
);
@@ -1347,7 +1353,7 @@ create index "xlink_static" on xlink ("xlink_static");
CREATE TABLE "xperm" (
"xp_id" serial NOT NULL,
"xp_client" varchar( 20 ) NOT NULL DEFAULT '',
- "xp_channel" bigint NOT NULL DEFAULT '0',
+ "xp_channel" bigint NOT NULL DEFAULT 0 ,
"xp_perm" varchar( 64 ) NOT NULL DEFAULT '',
PRIMARY KEY ("xp_id")
);
@@ -1356,7 +1362,7 @@ create index "xp_channel" on xperm ("xp_channel");
create index "xp_perm" on xperm ("xp_perm");
CREATE TABLE "xprof" (
"xprof_hash" text NOT NULL,
- "xprof_age" numeric(3) NOT NULL DEFAULT '0',
+ "xprof_age" numeric(3) NOT NULL DEFAULT 0 ,
"xprof_desc" text NOT NULL DEFAULT '',
"xprof_dob" varchar(12) NOT NULL DEFAULT '',
"xprof_gender" text NOT NULL DEFAULT '',
@@ -1387,7 +1393,7 @@ CREATE TABLE "xtag" (
"xtag_id" serial NOT NULL,
"xtag_hash" text NOT NULL,
"xtag_term" text NOT NULL DEFAULT '',
- "xtag_flags" bigint NOT NULL DEFAULT '0',
+ "xtag_flags" bigint NOT NULL DEFAULT 0 ,
PRIMARY KEY ("xtag_id")
);
create index "xtag_term" on xtag ("xtag_term");
diff --git a/install/update.php b/install/update.php
index 87cf4ba60..f9f1d0a3c 100644
--- a/install/update.php
+++ b/install/update.php
@@ -1,6 +1,6 @@
<?php
-define( 'UPDATE_VERSION' , 1188 );
+define( 'UPDATE_VERSION' , 1191 );
/**
*
@@ -2475,7 +2475,7 @@ function update_r1184() {
function update_r1185() {
- $r1 = q("alter table app add app_plugin char(255) not null default '' ");
+ $r1 = q("alter table app add app_plugin text not null default '' ");
if($r1)
return UPDATE_SUCCESS;
@@ -2508,4 +2508,41 @@ function update_r1187() {
return UPDATE_FAILED;
-} \ No newline at end of file
+}
+
+function update_r1188() {
+
+ $r1 = q("alter table channel add channel_password varchar(255) not null default '' ");
+ $r2 = q("alter table channel add channel_salt varchar(255) not null default '' ");
+
+ if($r1 && $r2)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+
+}
+
+function update_r1189() {
+
+ $r1 = q("alter table mail add mail_mimetype varchar(64) not null default 'text/bbcode' ");
+
+ if(ACTIVE_DBTYPE == DBTYPE_POSTGRES) {
+ $r2 = q("alter table mail add mail_raw smallint not null default 0 ");
+ }
+ else {
+ $r2 = q("alter table mail add mail_raw tinyint(4) not null default 0 ");
+ }
+ if($r1 && $r2)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+
+}
+
+function update_r1190() {
+ $r1 = q("alter table abook add abook_not_here smallint not null default 0 ");
+
+ $r2 = q("create index abook_not_here on abook (abook_not_here)");
+
+ if($r1 && $r2)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
diff --git a/library/HTMLPurifier.composer.php b/library/HTMLPurifier.composer.php
deleted file mode 100644
index 6706f4e39..000000000
--- a/library/HTMLPurifier.composer.php
+++ /dev/null
@@ -1,4 +0,0 @@
-<?php
-if (!defined('HTMLPURIFIER_PREFIX')) {
- define('HTMLPURIFIER_PREFIX', __DIR__);
-}
diff --git a/library/HTMLPurifier.includes.php b/library/HTMLPurifier.includes.php
deleted file mode 100644
index 9b7b88a87..000000000
--- a/library/HTMLPurifier.includes.php
+++ /dev/null
@@ -1,229 +0,0 @@
-<?php
-
-/**
- * @file
- * This file was auto-generated by generate-includes.php and includes all of
- * the core files required by HTML Purifier. Use this if performance is a
- * primary concern and you are using an opcode cache. PLEASE DO NOT EDIT THIS
- * FILE, changes will be overwritten the next time the script is run.
- *
- * @version 4.6.0
- *
- * @warning
- * You must *not* include any other HTML Purifier files before this file,
- * because 'require' not 'require_once' is used.
- *
- * @warning
- * This file requires that the include path contains the HTML Purifier
- * library directory; this is not auto-set.
- */
-
-require 'HTMLPurifier.php';
-require 'HTMLPurifier/Arborize.php';
-require 'HTMLPurifier/AttrCollections.php';
-require 'HTMLPurifier/AttrDef.php';
-require 'HTMLPurifier/AttrTransform.php';
-require 'HTMLPurifier/AttrTypes.php';
-require 'HTMLPurifier/AttrValidator.php';
-require 'HTMLPurifier/Bootstrap.php';
-require 'HTMLPurifier/Definition.php';
-require 'HTMLPurifier/CSSDefinition.php';
-require 'HTMLPurifier/ChildDef.php';
-require 'HTMLPurifier/Config.php';
-require 'HTMLPurifier/ConfigSchema.php';
-require 'HTMLPurifier/ContentSets.php';
-require 'HTMLPurifier/Context.php';
-require 'HTMLPurifier/DefinitionCache.php';
-require 'HTMLPurifier/DefinitionCacheFactory.php';
-require 'HTMLPurifier/Doctype.php';
-require 'HTMLPurifier/DoctypeRegistry.php';
-require 'HTMLPurifier/ElementDef.php';
-require 'HTMLPurifier/Encoder.php';
-require 'HTMLPurifier/EntityLookup.php';
-require 'HTMLPurifier/EntityParser.php';
-require 'HTMLPurifier/ErrorCollector.php';
-require 'HTMLPurifier/ErrorStruct.php';
-require 'HTMLPurifier/Exception.php';
-require 'HTMLPurifier/Filter.php';
-require 'HTMLPurifier/Generator.php';
-require 'HTMLPurifier/HTMLDefinition.php';
-require 'HTMLPurifier/HTMLModule.php';
-require 'HTMLPurifier/HTMLModuleManager.php';
-require 'HTMLPurifier/IDAccumulator.php';
-require 'HTMLPurifier/Injector.php';
-require 'HTMLPurifier/Language.php';
-require 'HTMLPurifier/LanguageFactory.php';
-require 'HTMLPurifier/Length.php';
-require 'HTMLPurifier/Lexer.php';
-require 'HTMLPurifier/Node.php';
-require 'HTMLPurifier/PercentEncoder.php';
-require 'HTMLPurifier/PropertyList.php';
-require 'HTMLPurifier/PropertyListIterator.php';
-require 'HTMLPurifier/Queue.php';
-require 'HTMLPurifier/Strategy.php';
-require 'HTMLPurifier/StringHash.php';
-require 'HTMLPurifier/StringHashParser.php';
-require 'HTMLPurifier/TagTransform.php';
-require 'HTMLPurifier/Token.php';
-require 'HTMLPurifier/TokenFactory.php';
-require 'HTMLPurifier/URI.php';
-require 'HTMLPurifier/URIDefinition.php';
-require 'HTMLPurifier/URIFilter.php';
-require 'HTMLPurifier/URIParser.php';
-require 'HTMLPurifier/URIScheme.php';
-require 'HTMLPurifier/URISchemeRegistry.php';
-require 'HTMLPurifier/UnitConverter.php';
-require 'HTMLPurifier/VarParser.php';
-require 'HTMLPurifier/VarParserException.php';
-require 'HTMLPurifier/Zipper.php';
-require 'HTMLPurifier/AttrDef/CSS.php';
-require 'HTMLPurifier/AttrDef/Clone.php';
-require 'HTMLPurifier/AttrDef/Enum.php';
-require 'HTMLPurifier/AttrDef/Integer.php';
-require 'HTMLPurifier/AttrDef/Lang.php';
-require 'HTMLPurifier/AttrDef/Switch.php';
-require 'HTMLPurifier/AttrDef/Text.php';
-require 'HTMLPurifier/AttrDef/URI.php';
-require 'HTMLPurifier/AttrDef/CSS/Number.php';
-require 'HTMLPurifier/AttrDef/CSS/AlphaValue.php';
-require 'HTMLPurifier/AttrDef/CSS/Background.php';
-require 'HTMLPurifier/AttrDef/CSS/BackgroundPosition.php';
-require 'HTMLPurifier/AttrDef/CSS/Border.php';
-require 'HTMLPurifier/AttrDef/CSS/Color.php';
-require 'HTMLPurifier/AttrDef/CSS/Composite.php';
-require 'HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php';
-require 'HTMLPurifier/AttrDef/CSS/Filter.php';
-require 'HTMLPurifier/AttrDef/CSS/Font.php';
-require 'HTMLPurifier/AttrDef/CSS/FontFamily.php';
-require 'HTMLPurifier/AttrDef/CSS/Ident.php';
-require 'HTMLPurifier/AttrDef/CSS/ImportantDecorator.php';
-require 'HTMLPurifier/AttrDef/CSS/Length.php';
-require 'HTMLPurifier/AttrDef/CSS/ListStyle.php';
-require 'HTMLPurifier/AttrDef/CSS/Multiple.php';
-require 'HTMLPurifier/AttrDef/CSS/Percentage.php';
-require 'HTMLPurifier/AttrDef/CSS/TextDecoration.php';
-require 'HTMLPurifier/AttrDef/CSS/URI.php';
-require 'HTMLPurifier/AttrDef/HTML/Bool.php';
-require 'HTMLPurifier/AttrDef/HTML/Nmtokens.php';
-require 'HTMLPurifier/AttrDef/HTML/Class.php';
-require 'HTMLPurifier/AttrDef/HTML/Color.php';
-require 'HTMLPurifier/AttrDef/HTML/FrameTarget.php';
-require 'HTMLPurifier/AttrDef/HTML/ID.php';
-require 'HTMLPurifier/AttrDef/HTML/Pixels.php';
-require 'HTMLPurifier/AttrDef/HTML/Length.php';
-require 'HTMLPurifier/AttrDef/HTML/LinkTypes.php';
-require 'HTMLPurifier/AttrDef/HTML/MultiLength.php';
-require 'HTMLPurifier/AttrDef/URI/Email.php';
-require 'HTMLPurifier/AttrDef/URI/Host.php';
-require 'HTMLPurifier/AttrDef/URI/IPv4.php';
-require 'HTMLPurifier/AttrDef/URI/IPv6.php';
-require 'HTMLPurifier/AttrDef/URI/Email/SimpleCheck.php';
-require 'HTMLPurifier/AttrTransform/Background.php';
-require 'HTMLPurifier/AttrTransform/BdoDir.php';
-require 'HTMLPurifier/AttrTransform/BgColor.php';
-require 'HTMLPurifier/AttrTransform/BoolToCSS.php';
-require 'HTMLPurifier/AttrTransform/Border.php';
-require 'HTMLPurifier/AttrTransform/EnumToCSS.php';
-require 'HTMLPurifier/AttrTransform/ImgRequired.php';
-require 'HTMLPurifier/AttrTransform/ImgSpace.php';
-require 'HTMLPurifier/AttrTransform/Input.php';
-require 'HTMLPurifier/AttrTransform/Lang.php';
-require 'HTMLPurifier/AttrTransform/Length.php';
-require 'HTMLPurifier/AttrTransform/Name.php';
-require 'HTMLPurifier/AttrTransform/NameSync.php';
-require 'HTMLPurifier/AttrTransform/Nofollow.php';
-require 'HTMLPurifier/AttrTransform/SafeEmbed.php';
-require 'HTMLPurifier/AttrTransform/SafeObject.php';
-require 'HTMLPurifier/AttrTransform/SafeParam.php';
-require 'HTMLPurifier/AttrTransform/ScriptRequired.php';
-require 'HTMLPurifier/AttrTransform/TargetBlank.php';
-require 'HTMLPurifier/AttrTransform/Textarea.php';
-require 'HTMLPurifier/ChildDef/Chameleon.php';
-require 'HTMLPurifier/ChildDef/Custom.php';
-require 'HTMLPurifier/ChildDef/Empty.php';
-require 'HTMLPurifier/ChildDef/List.php';
-require 'HTMLPurifier/ChildDef/Required.php';
-require 'HTMLPurifier/ChildDef/Optional.php';
-require 'HTMLPurifier/ChildDef/StrictBlockquote.php';
-require 'HTMLPurifier/ChildDef/Table.php';
-require 'HTMLPurifier/DefinitionCache/Decorator.php';
-require 'HTMLPurifier/DefinitionCache/Null.php';
-require 'HTMLPurifier/DefinitionCache/Serializer.php';
-require 'HTMLPurifier/DefinitionCache/Decorator/Cleanup.php';
-require 'HTMLPurifier/DefinitionCache/Decorator/Memory.php';
-require 'HTMLPurifier/HTMLModule/Bdo.php';
-require 'HTMLPurifier/HTMLModule/CommonAttributes.php';
-require 'HTMLPurifier/HTMLModule/Edit.php';
-require 'HTMLPurifier/HTMLModule/Forms.php';
-require 'HTMLPurifier/HTMLModule/Hypertext.php';
-require 'HTMLPurifier/HTMLModule/Iframe.php';
-require 'HTMLPurifier/HTMLModule/Image.php';
-require 'HTMLPurifier/HTMLModule/Legacy.php';
-require 'HTMLPurifier/HTMLModule/List.php';
-require 'HTMLPurifier/HTMLModule/Name.php';
-require 'HTMLPurifier/HTMLModule/Nofollow.php';
-require 'HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php';
-require 'HTMLPurifier/HTMLModule/Object.php';
-require 'HTMLPurifier/HTMLModule/Presentation.php';
-require 'HTMLPurifier/HTMLModule/Proprietary.php';
-require 'HTMLPurifier/HTMLModule/Ruby.php';
-require 'HTMLPurifier/HTMLModule/SafeEmbed.php';
-require 'HTMLPurifier/HTMLModule/SafeObject.php';
-require 'HTMLPurifier/HTMLModule/SafeScripting.php';
-require 'HTMLPurifier/HTMLModule/Scripting.php';
-require 'HTMLPurifier/HTMLModule/StyleAttribute.php';
-require 'HTMLPurifier/HTMLModule/Tables.php';
-require 'HTMLPurifier/HTMLModule/Target.php';
-require 'HTMLPurifier/HTMLModule/TargetBlank.php';
-require 'HTMLPurifier/HTMLModule/Text.php';
-require 'HTMLPurifier/HTMLModule/Tidy.php';
-require 'HTMLPurifier/HTMLModule/XMLCommonAttributes.php';
-require 'HTMLPurifier/HTMLModule/Tidy/Name.php';
-require 'HTMLPurifier/HTMLModule/Tidy/Proprietary.php';
-require 'HTMLPurifier/HTMLModule/Tidy/XHTMLAndHTML4.php';
-require 'HTMLPurifier/HTMLModule/Tidy/Strict.php';
-require 'HTMLPurifier/HTMLModule/Tidy/Transitional.php';
-require 'HTMLPurifier/HTMLModule/Tidy/XHTML.php';
-require 'HTMLPurifier/Injector/AutoParagraph.php';
-require 'HTMLPurifier/Injector/DisplayLinkURI.php';
-require 'HTMLPurifier/Injector/Linkify.php';
-require 'HTMLPurifier/Injector/PurifierLinkify.php';
-require 'HTMLPurifier/Injector/RemoveEmpty.php';
-require 'HTMLPurifier/Injector/RemoveSpansWithoutAttributes.php';
-require 'HTMLPurifier/Injector/SafeObject.php';
-require 'HTMLPurifier/Lexer/DOMLex.php';
-require 'HTMLPurifier/Lexer/DirectLex.php';
-require 'HTMLPurifier/Node/Comment.php';
-require 'HTMLPurifier/Node/Element.php';
-require 'HTMLPurifier/Node/Text.php';
-require 'HTMLPurifier/Strategy/Composite.php';
-require 'HTMLPurifier/Strategy/Core.php';
-require 'HTMLPurifier/Strategy/FixNesting.php';
-require 'HTMLPurifier/Strategy/MakeWellFormed.php';
-require 'HTMLPurifier/Strategy/RemoveForeignElements.php';
-require 'HTMLPurifier/Strategy/ValidateAttributes.php';
-require 'HTMLPurifier/TagTransform/Font.php';
-require 'HTMLPurifier/TagTransform/Simple.php';
-require 'HTMLPurifier/Token/Comment.php';
-require 'HTMLPurifier/Token/Tag.php';
-require 'HTMLPurifier/Token/Empty.php';
-require 'HTMLPurifier/Token/End.php';
-require 'HTMLPurifier/Token/Start.php';
-require 'HTMLPurifier/Token/Text.php';
-require 'HTMLPurifier/URIFilter/DisableExternal.php';
-require 'HTMLPurifier/URIFilter/DisableExternalResources.php';
-require 'HTMLPurifier/URIFilter/DisableResources.php';
-require 'HTMLPurifier/URIFilter/HostBlacklist.php';
-require 'HTMLPurifier/URIFilter/MakeAbsolute.php';
-require 'HTMLPurifier/URIFilter/Munge.php';
-require 'HTMLPurifier/URIFilter/SafeIframe.php';
-require 'HTMLPurifier/URIScheme/data.php';
-require 'HTMLPurifier/URIScheme/file.php';
-require 'HTMLPurifier/URIScheme/ftp.php';
-require 'HTMLPurifier/URIScheme/http.php';
-require 'HTMLPurifier/URIScheme/https.php';
-require 'HTMLPurifier/URIScheme/mailto.php';
-require 'HTMLPurifier/URIScheme/news.php';
-require 'HTMLPurifier/URIScheme/nntp.php';
-require 'HTMLPurifier/VarParser/Flexible.php';
-require 'HTMLPurifier/VarParser/Native.php';
diff --git a/library/HTMLPurifier.php b/library/HTMLPurifier.php
deleted file mode 100644
index 6f654fde5..000000000
--- a/library/HTMLPurifier.php
+++ /dev/null
@@ -1,292 +0,0 @@
-<?php
-
-/*! @mainpage
- *
- * HTML Purifier is an HTML filter that will take an arbitrary snippet of
- * HTML and rigorously test, validate and filter it into a version that
- * is safe for output onto webpages. It achieves this by:
- *
- * -# Lexing (parsing into tokens) the document,
- * -# Executing various strategies on the tokens:
- * -# Removing all elements not in the whitelist,
- * -# Making the tokens well-formed,
- * -# Fixing the nesting of the nodes, and
- * -# Validating attributes of the nodes; and
- * -# Generating HTML from the purified tokens.
- *
- * However, most users will only need to interface with the HTMLPurifier
- * and HTMLPurifier_Config.
- */
-
-/*
- HTML Purifier 4.6.0 - Standards Compliant HTML Filtering
- Copyright (C) 2006-2008 Edward Z. Yang
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-/**
- * Facade that coordinates HTML Purifier's subsystems in order to purify HTML.
- *
- * @note There are several points in which configuration can be specified
- * for HTML Purifier. The precedence of these (from lowest to
- * highest) is as follows:
- * -# Instance: new HTMLPurifier($config)
- * -# Invocation: purify($html, $config)
- * These configurations are entirely independent of each other and
- * are *not* merged (this behavior may change in the future).
- *
- * @todo We need an easier way to inject strategies using the configuration
- * object.
- */
-class HTMLPurifier
-{
-
- /**
- * Version of HTML Purifier.
- * @type string
- */
- public $version = '4.6.0';
-
- /**
- * Constant with version of HTML Purifier.
- */
- const VERSION = '4.6.0';
-
- /**
- * Global configuration object.
- * @type HTMLPurifier_Config
- */
- public $config;
-
- /**
- * Array of extra filter objects to run on HTML,
- * for backwards compatibility.
- * @type HTMLPurifier_Filter[]
- */
- private $filters = array();
-
- /**
- * Single instance of HTML Purifier.
- * @type HTMLPurifier
- */
- private static $instance;
-
- /**
- * @type HTMLPurifier_Strategy_Core
- */
- protected $strategy;
-
- /**
- * @type HTMLPurifier_Generator
- */
- protected $generator;
-
- /**
- * Resultant context of last run purification.
- * Is an array of contexts if the last called method was purifyArray().
- * @type HTMLPurifier_Context
- */
- public $context;
-
- /**
- * Initializes the purifier.
- *
- * @param HTMLPurifier_Config $config Optional HTMLPurifier_Config object
- * for all instances of the purifier, if omitted, a default
- * configuration is supplied (which can be overridden on a
- * per-use basis).
- * The parameter can also be any type that
- * HTMLPurifier_Config::create() supports.
- */
- public function __construct($config = null)
- {
- $this->config = HTMLPurifier_Config::create($config);
- $this->strategy = new HTMLPurifier_Strategy_Core();
- }
-
- /**
- * Adds a filter to process the output. First come first serve
- *
- * @param HTMLPurifier_Filter $filter HTMLPurifier_Filter object
- */
- public function addFilter($filter)
- {
- trigger_error(
- 'HTMLPurifier->addFilter() is deprecated, use configuration directives' .
- ' in the Filter namespace or Filter.Custom',
- E_USER_WARNING
- );
- $this->filters[] = $filter;
- }
-
- /**
- * Filters an HTML snippet/document to be XSS-free and standards-compliant.
- *
- * @param string $html String of HTML to purify
- * @param HTMLPurifier_Config $config Config object for this operation,
- * if omitted, defaults to the config object specified during this
- * object's construction. The parameter can also be any type
- * that HTMLPurifier_Config::create() supports.
- *
- * @return string Purified HTML
- */
- public function purify($html, $config = null)
- {
- // :TODO: make the config merge in, instead of replace
- $config = $config ? HTMLPurifier_Config::create($config) : $this->config;
-
- // implementation is partially environment dependant, partially
- // configuration dependant
- $lexer = HTMLPurifier_Lexer::create($config);
-
- $context = new HTMLPurifier_Context();
-
- // setup HTML generator
- $this->generator = new HTMLPurifier_Generator($config, $context);
- $context->register('Generator', $this->generator);
-
- // set up global context variables
- if ($config->get('Core.CollectErrors')) {
- // may get moved out if other facilities use it
- $language_factory = HTMLPurifier_LanguageFactory::instance();
- $language = $language_factory->create($config, $context);
- $context->register('Locale', $language);
-
- $error_collector = new HTMLPurifier_ErrorCollector($context);
- $context->register('ErrorCollector', $error_collector);
- }
-
- // setup id_accumulator context, necessary due to the fact that
- // AttrValidator can be called from many places
- $id_accumulator = HTMLPurifier_IDAccumulator::build($config, $context);
- $context->register('IDAccumulator', $id_accumulator);
-
- $html = HTMLPurifier_Encoder::convertToUTF8($html, $config, $context);
-
- // setup filters
- $filter_flags = $config->getBatch('Filter');
- $custom_filters = $filter_flags['Custom'];
- unset($filter_flags['Custom']);
- $filters = array();
- foreach ($filter_flags as $filter => $flag) {
- if (!$flag) {
- continue;
- }
- if (strpos($filter, '.') !== false) {
- continue;
- }
- $class = "HTMLPurifier_Filter_$filter";
- $filters[] = new $class;
- }
- foreach ($custom_filters as $filter) {
- // maybe "HTMLPurifier_Filter_$filter", but be consistent with AutoFormat
- $filters[] = $filter;
- }
- $filters = array_merge($filters, $this->filters);
- // maybe prepare(), but later
-
- for ($i = 0, $filter_size = count($filters); $i < $filter_size; $i++) {
- $html = $filters[$i]->preFilter($html, $config, $context);
- }
-
- // purified HTML
- $html =
- $this->generator->generateFromTokens(
- // list of tokens
- $this->strategy->execute(
- // list of un-purified tokens
- $lexer->tokenizeHTML(
- // un-purified HTML
- $html,
- $config,
- $context
- ),
- $config,
- $context
- )
- );
-
- for ($i = $filter_size - 1; $i >= 0; $i--) {
- $html = $filters[$i]->postFilter($html, $config, $context);
- }
-
- $html = HTMLPurifier_Encoder::convertFromUTF8($html, $config, $context);
- $this->context =& $context;
- return $html;
- }
-
- /**
- * Filters an array of HTML snippets
- *
- * @param string[] $array_of_html Array of html snippets
- * @param HTMLPurifier_Config $config Optional config object for this operation.
- * See HTMLPurifier::purify() for more details.
- *
- * @return string[] Array of purified HTML
- */
- public function purifyArray($array_of_html, $config = null)
- {
- $context_array = array();
- foreach ($array_of_html as $key => $html) {
- $array_of_html[$key] = $this->purify($html, $config);
- $context_array[$key] = $this->context;
- }
- $this->context = $context_array;
- return $array_of_html;
- }
-
- /**
- * Singleton for enforcing just one HTML Purifier in your system
- *
- * @param HTMLPurifier|HTMLPurifier_Config $prototype Optional prototype
- * HTMLPurifier instance to overload singleton with,
- * or HTMLPurifier_Config instance to configure the
- * generated version with.
- *
- * @return HTMLPurifier
- */
- public static function instance($prototype = null)
- {
- if (!self::$instance || $prototype) {
- if ($prototype instanceof HTMLPurifier) {
- self::$instance = $prototype;
- } elseif ($prototype) {
- self::$instance = new HTMLPurifier($prototype);
- } else {
- self::$instance = new HTMLPurifier();
- }
- }
- return self::$instance;
- }
-
- /**
- * Singleton for enforcing just one HTML Purifier in your system
- *
- * @param HTMLPurifier|HTMLPurifier_Config $prototype Optional prototype
- * HTMLPurifier instance to overload singleton with,
- * or HTMLPurifier_Config instance to configure the
- * generated version with.
- *
- * @return HTMLPurifier
- * @note Backwards compatibility, see instance()
- */
- public static function getInstance($prototype = null)
- {
- return HTMLPurifier::instance($prototype);
- }
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier.safe-includes.php b/library/HTMLPurifier.safe-includes.php
deleted file mode 100644
index 9dea6d1ed..000000000
--- a/library/HTMLPurifier.safe-includes.php
+++ /dev/null
@@ -1,223 +0,0 @@
-<?php
-
-/**
- * @file
- * This file was auto-generated by generate-includes.php and includes all of
- * the core files required by HTML Purifier. This is a convenience stub that
- * includes all files using dirname(__FILE__) and require_once. PLEASE DO NOT
- * EDIT THIS FILE, changes will be overwritten the next time the script is run.
- *
- * Changes to include_path are not necessary.
- */
-
-$__dir = dirname(__FILE__);
-
-require_once $__dir . '/HTMLPurifier.php';
-require_once $__dir . '/HTMLPurifier/Arborize.php';
-require_once $__dir . '/HTMLPurifier/AttrCollections.php';
-require_once $__dir . '/HTMLPurifier/AttrDef.php';
-require_once $__dir . '/HTMLPurifier/AttrTransform.php';
-require_once $__dir . '/HTMLPurifier/AttrTypes.php';
-require_once $__dir . '/HTMLPurifier/AttrValidator.php';
-require_once $__dir . '/HTMLPurifier/Bootstrap.php';
-require_once $__dir . '/HTMLPurifier/Definition.php';
-require_once $__dir . '/HTMLPurifier/CSSDefinition.php';
-require_once $__dir . '/HTMLPurifier/ChildDef.php';
-require_once $__dir . '/HTMLPurifier/Config.php';
-require_once $__dir . '/HTMLPurifier/ConfigSchema.php';
-require_once $__dir . '/HTMLPurifier/ContentSets.php';
-require_once $__dir . '/HTMLPurifier/Context.php';
-require_once $__dir . '/HTMLPurifier/DefinitionCache.php';
-require_once $__dir . '/HTMLPurifier/DefinitionCacheFactory.php';
-require_once $__dir . '/HTMLPurifier/Doctype.php';
-require_once $__dir . '/HTMLPurifier/DoctypeRegistry.php';
-require_once $__dir . '/HTMLPurifier/ElementDef.php';
-require_once $__dir . '/HTMLPurifier/Encoder.php';
-require_once $__dir . '/HTMLPurifier/EntityLookup.php';
-require_once $__dir . '/HTMLPurifier/EntityParser.php';
-require_once $__dir . '/HTMLPurifier/ErrorCollector.php';
-require_once $__dir . '/HTMLPurifier/ErrorStruct.php';
-require_once $__dir . '/HTMLPurifier/Exception.php';
-require_once $__dir . '/HTMLPurifier/Filter.php';
-require_once $__dir . '/HTMLPurifier/Generator.php';
-require_once $__dir . '/HTMLPurifier/HTMLDefinition.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule.php';
-require_once $__dir . '/HTMLPurifier/HTMLModuleManager.php';
-require_once $__dir . '/HTMLPurifier/IDAccumulator.php';
-require_once $__dir . '/HTMLPurifier/Injector.php';
-require_once $__dir . '/HTMLPurifier/Language.php';
-require_once $__dir . '/HTMLPurifier/LanguageFactory.php';
-require_once $__dir . '/HTMLPurifier/Length.php';
-require_once $__dir . '/HTMLPurifier/Lexer.php';
-require_once $__dir . '/HTMLPurifier/Node.php';
-require_once $__dir . '/HTMLPurifier/PercentEncoder.php';
-require_once $__dir . '/HTMLPurifier/PropertyList.php';
-require_once $__dir . '/HTMLPurifier/PropertyListIterator.php';
-require_once $__dir . '/HTMLPurifier/Queue.php';
-require_once $__dir . '/HTMLPurifier/Strategy.php';
-require_once $__dir . '/HTMLPurifier/StringHash.php';
-require_once $__dir . '/HTMLPurifier/StringHashParser.php';
-require_once $__dir . '/HTMLPurifier/TagTransform.php';
-require_once $__dir . '/HTMLPurifier/Token.php';
-require_once $__dir . '/HTMLPurifier/TokenFactory.php';
-require_once $__dir . '/HTMLPurifier/URI.php';
-require_once $__dir . '/HTMLPurifier/URIDefinition.php';
-require_once $__dir . '/HTMLPurifier/URIFilter.php';
-require_once $__dir . '/HTMLPurifier/URIParser.php';
-require_once $__dir . '/HTMLPurifier/URIScheme.php';
-require_once $__dir . '/HTMLPurifier/URISchemeRegistry.php';
-require_once $__dir . '/HTMLPurifier/UnitConverter.php';
-require_once $__dir . '/HTMLPurifier/VarParser.php';
-require_once $__dir . '/HTMLPurifier/VarParserException.php';
-require_once $__dir . '/HTMLPurifier/Zipper.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/CSS.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/Clone.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/Enum.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/Integer.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/Lang.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/Switch.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/Text.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/URI.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Number.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/CSS/AlphaValue.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Background.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Border.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Color.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Composite.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Filter.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Font.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/CSS/FontFamily.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Ident.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/CSS/ImportantDecorator.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Length.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/CSS/ListStyle.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Multiple.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Percentage.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/CSS/TextDecoration.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/CSS/URI.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/HTML/Bool.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/HTML/Nmtokens.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/HTML/Class.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/HTML/Color.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/HTML/FrameTarget.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/HTML/ID.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/HTML/Pixels.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/HTML/Length.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/HTML/LinkTypes.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/HTML/MultiLength.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/URI/Email.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/URI/Host.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/URI/IPv4.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/URI/IPv6.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/URI/Email/SimpleCheck.php';
-require_once $__dir . '/HTMLPurifier/AttrTransform/Background.php';
-require_once $__dir . '/HTMLPurifier/AttrTransform/BdoDir.php';
-require_once $__dir . '/HTMLPurifier/AttrTransform/BgColor.php';
-require_once $__dir . '/HTMLPurifier/AttrTransform/BoolToCSS.php';
-require_once $__dir . '/HTMLPurifier/AttrTransform/Border.php';
-require_once $__dir . '/HTMLPurifier/AttrTransform/EnumToCSS.php';
-require_once $__dir . '/HTMLPurifier/AttrTransform/ImgRequired.php';
-require_once $__dir . '/HTMLPurifier/AttrTransform/ImgSpace.php';
-require_once $__dir . '/HTMLPurifier/AttrTransform/Input.php';
-require_once $__dir . '/HTMLPurifier/AttrTransform/Lang.php';
-require_once $__dir . '/HTMLPurifier/AttrTransform/Length.php';
-require_once $__dir . '/HTMLPurifier/AttrTransform/Name.php';
-require_once $__dir . '/HTMLPurifier/AttrTransform/NameSync.php';
-require_once $__dir . '/HTMLPurifier/AttrTransform/Nofollow.php';
-require_once $__dir . '/HTMLPurifier/AttrTransform/SafeEmbed.php';
-require_once $__dir . '/HTMLPurifier/AttrTransform/SafeObject.php';
-require_once $__dir . '/HTMLPurifier/AttrTransform/SafeParam.php';
-require_once $__dir . '/HTMLPurifier/AttrTransform/ScriptRequired.php';
-require_once $__dir . '/HTMLPurifier/AttrTransform/TargetBlank.php';
-require_once $__dir . '/HTMLPurifier/AttrTransform/Textarea.php';
-require_once $__dir . '/HTMLPurifier/ChildDef/Chameleon.php';
-require_once $__dir . '/HTMLPurifier/ChildDef/Custom.php';
-require_once $__dir . '/HTMLPurifier/ChildDef/Empty.php';
-require_once $__dir . '/HTMLPurifier/ChildDef/List.php';
-require_once $__dir . '/HTMLPurifier/ChildDef/Required.php';
-require_once $__dir . '/HTMLPurifier/ChildDef/Optional.php';
-require_once $__dir . '/HTMLPurifier/ChildDef/StrictBlockquote.php';
-require_once $__dir . '/HTMLPurifier/ChildDef/Table.php';
-require_once $__dir . '/HTMLPurifier/DefinitionCache/Decorator.php';
-require_once $__dir . '/HTMLPurifier/DefinitionCache/Null.php';
-require_once $__dir . '/HTMLPurifier/DefinitionCache/Serializer.php';
-require_once $__dir . '/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php';
-require_once $__dir . '/HTMLPurifier/DefinitionCache/Decorator/Memory.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/Bdo.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/CommonAttributes.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/Edit.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/Forms.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/Hypertext.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/Iframe.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/Image.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/Legacy.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/List.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/Name.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/Nofollow.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/Object.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/Presentation.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/Proprietary.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/Ruby.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/SafeEmbed.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/SafeObject.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/SafeScripting.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/Scripting.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/StyleAttribute.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/Tables.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/Target.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/TargetBlank.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/Text.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/Tidy.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/XMLCommonAttributes.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/Tidy/Name.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/Tidy/Proprietary.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/Tidy/XHTMLAndHTML4.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/Tidy/Strict.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/Tidy/Transitional.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/Tidy/XHTML.php';
-require_once $__dir . '/HTMLPurifier/Injector/AutoParagraph.php';
-require_once $__dir . '/HTMLPurifier/Injector/DisplayLinkURI.php';
-require_once $__dir . '/HTMLPurifier/Injector/Linkify.php';
-require_once $__dir . '/HTMLPurifier/Injector/PurifierLinkify.php';
-require_once $__dir . '/HTMLPurifier/Injector/RemoveEmpty.php';
-require_once $__dir . '/HTMLPurifier/Injector/RemoveSpansWithoutAttributes.php';
-require_once $__dir . '/HTMLPurifier/Injector/SafeObject.php';
-require_once $__dir . '/HTMLPurifier/Lexer/DOMLex.php';
-require_once $__dir . '/HTMLPurifier/Lexer/DirectLex.php';
-require_once $__dir . '/HTMLPurifier/Node/Comment.php';
-require_once $__dir . '/HTMLPurifier/Node/Element.php';
-require_once $__dir . '/HTMLPurifier/Node/Text.php';
-require_once $__dir . '/HTMLPurifier/Strategy/Composite.php';
-require_once $__dir . '/HTMLPurifier/Strategy/Core.php';
-require_once $__dir . '/HTMLPurifier/Strategy/FixNesting.php';
-require_once $__dir . '/HTMLPurifier/Strategy/MakeWellFormed.php';
-require_once $__dir . '/HTMLPurifier/Strategy/RemoveForeignElements.php';
-require_once $__dir . '/HTMLPurifier/Strategy/ValidateAttributes.php';
-require_once $__dir . '/HTMLPurifier/TagTransform/Font.php';
-require_once $__dir . '/HTMLPurifier/TagTransform/Simple.php';
-require_once $__dir . '/HTMLPurifier/Token/Comment.php';
-require_once $__dir . '/HTMLPurifier/Token/Tag.php';
-require_once $__dir . '/HTMLPurifier/Token/Empty.php';
-require_once $__dir . '/HTMLPurifier/Token/End.php';
-require_once $__dir . '/HTMLPurifier/Token/Start.php';
-require_once $__dir . '/HTMLPurifier/Token/Text.php';
-require_once $__dir . '/HTMLPurifier/URIFilter/DisableExternal.php';
-require_once $__dir . '/HTMLPurifier/URIFilter/DisableExternalResources.php';
-require_once $__dir . '/HTMLPurifier/URIFilter/DisableResources.php';
-require_once $__dir . '/HTMLPurifier/URIFilter/HostBlacklist.php';
-require_once $__dir . '/HTMLPurifier/URIFilter/MakeAbsolute.php';
-require_once $__dir . '/HTMLPurifier/URIFilter/Munge.php';
-require_once $__dir . '/HTMLPurifier/URIFilter/SafeIframe.php';
-require_once $__dir . '/HTMLPurifier/URIScheme/data.php';
-require_once $__dir . '/HTMLPurifier/URIScheme/file.php';
-require_once $__dir . '/HTMLPurifier/URIScheme/ftp.php';
-require_once $__dir . '/HTMLPurifier/URIScheme/http.php';
-require_once $__dir . '/HTMLPurifier/URIScheme/https.php';
-require_once $__dir . '/HTMLPurifier/URIScheme/mailto.php';
-require_once $__dir . '/HTMLPurifier/URIScheme/news.php';
-require_once $__dir . '/HTMLPurifier/URIScheme/nntp.php';
-require_once $__dir . '/HTMLPurifier/VarParser/Flexible.php';
-require_once $__dir . '/HTMLPurifier/VarParser/Native.php';
diff --git a/library/HTMLPurifier/Arborize.php b/library/HTMLPurifier/Arborize.php
deleted file mode 100644
index 9e6617be5..000000000
--- a/library/HTMLPurifier/Arborize.php
+++ /dev/null
@@ -1,71 +0,0 @@
-<?php
-
-/**
- * Converts a stream of HTMLPurifier_Token into an HTMLPurifier_Node,
- * and back again.
- *
- * @note This transformation is not an equivalence. We mutate the input
- * token stream to make it so; see all [MUT] markers in code.
- */
-class HTMLPurifier_Arborize
-{
- public static function arborize($tokens, $config, $context) {
- $definition = $config->getHTMLDefinition();
- $parent = new HTMLPurifier_Token_Start($definition->info_parent);
- $stack = array($parent->toNode());
- foreach ($tokens as $token) {
- $token->skip = null; // [MUT]
- $token->carryover = null; // [MUT]
- if ($token instanceof HTMLPurifier_Token_End) {
- $token->start = null; // [MUT]
- $r = array_pop($stack);
- assert($r->name === $token->name);
- assert(empty($token->attr));
- $r->endCol = $token->col;
- $r->endLine = $token->line;
- $r->endArmor = $token->armor;
- continue;
- }
- $node = $token->toNode();
- $stack[count($stack)-1]->children[] = $node;
- if ($token instanceof HTMLPurifier_Token_Start) {
- $stack[] = $node;
- }
- }
- assert(count($stack) == 1);
- return $stack[0];
- }
-
- public static function flatten($node, $config, $context) {
- $level = 0;
- $nodes = array($level => new HTMLPurifier_Queue(array($node)));
- $closingTokens = array();
- $tokens = array();
- do {
- while (!$nodes[$level]->isEmpty()) {
- $node = $nodes[$level]->shift(); // FIFO
- list($start, $end) = $node->toTokenPair();
- if ($level > 0) {
- $tokens[] = $start;
- }
- if ($end !== NULL) {
- $closingTokens[$level][] = $end;
- }
- if ($node instanceof HTMLPurifier_Node_Element) {
- $level++;
- $nodes[$level] = new HTMLPurifier_Queue();
- foreach ($node->children as $childNode) {
- $nodes[$level]->push($childNode);
- }
- }
- }
- $level--;
- if ($level && isset($closingTokens[$level])) {
- while ($token = array_pop($closingTokens[$level])) {
- $tokens[] = $token;
- }
- }
- } while ($level > 0);
- return $tokens;
- }
-}
diff --git a/library/HTMLPurifier/AttrCollections.php b/library/HTMLPurifier/AttrCollections.php
deleted file mode 100644
index 4f6c2e39a..000000000
--- a/library/HTMLPurifier/AttrCollections.php
+++ /dev/null
@@ -1,143 +0,0 @@
-<?php
-
-/**
- * Defines common attribute collections that modules reference
- */
-
-class HTMLPurifier_AttrCollections
-{
-
- /**
- * Associative array of attribute collections, indexed by name.
- * @type array
- */
- public $info = array();
-
- /**
- * Performs all expansions on internal data for use by other inclusions
- * It also collects all attribute collection extensions from
- * modules
- * @param HTMLPurifier_AttrTypes $attr_types HTMLPurifier_AttrTypes instance
- * @param HTMLPurifier_HTMLModule[] $modules Hash array of HTMLPurifier_HTMLModule members
- */
- public function __construct($attr_types, $modules)
- {
- // load extensions from the modules
- foreach ($modules as $module) {
- foreach ($module->attr_collections as $coll_i => $coll) {
- if (!isset($this->info[$coll_i])) {
- $this->info[$coll_i] = array();
- }
- foreach ($coll as $attr_i => $attr) {
- if ($attr_i === 0 && isset($this->info[$coll_i][$attr_i])) {
- // merge in includes
- $this->info[$coll_i][$attr_i] = array_merge(
- $this->info[$coll_i][$attr_i],
- $attr
- );
- continue;
- }
- $this->info[$coll_i][$attr_i] = $attr;
- }
- }
- }
- // perform internal expansions and inclusions
- foreach ($this->info as $name => $attr) {
- // merge attribute collections that include others
- $this->performInclusions($this->info[$name]);
- // replace string identifiers with actual attribute objects
- $this->expandIdentifiers($this->info[$name], $attr_types);
- }
- }
-
- /**
- * Takes a reference to an attribute associative array and performs
- * all inclusions specified by the zero index.
- * @param array &$attr Reference to attribute array
- */
- public function performInclusions(&$attr)
- {
- if (!isset($attr[0])) {
- return;
- }
- $merge = $attr[0];
- $seen = array(); // recursion guard
- // loop through all the inclusions
- for ($i = 0; isset($merge[$i]); $i++) {
- if (isset($seen[$merge[$i]])) {
- continue;
- }
- $seen[$merge[$i]] = true;
- // foreach attribute of the inclusion, copy it over
- if (!isset($this->info[$merge[$i]])) {
- continue;
- }
- foreach ($this->info[$merge[$i]] as $key => $value) {
- if (isset($attr[$key])) {
- continue;
- } // also catches more inclusions
- $attr[$key] = $value;
- }
- if (isset($this->info[$merge[$i]][0])) {
- // recursion
- $merge = array_merge($merge, $this->info[$merge[$i]][0]);
- }
- }
- unset($attr[0]);
- }
-
- /**
- * Expands all string identifiers in an attribute array by replacing
- * them with the appropriate values inside HTMLPurifier_AttrTypes
- * @param array &$attr Reference to attribute array
- * @param HTMLPurifier_AttrTypes $attr_types HTMLPurifier_AttrTypes instance
- */
- public function expandIdentifiers(&$attr, $attr_types)
- {
- // because foreach will process new elements we add, make sure we
- // skip duplicates
- $processed = array();
-
- foreach ($attr as $def_i => $def) {
- // skip inclusions
- if ($def_i === 0) {
- continue;
- }
-
- if (isset($processed[$def_i])) {
- continue;
- }
-
- // determine whether or not attribute is required
- if ($required = (strpos($def_i, '*') !== false)) {
- // rename the definition
- unset($attr[$def_i]);
- $def_i = trim($def_i, '*');
- $attr[$def_i] = $def;
- }
-
- $processed[$def_i] = true;
-
- // if we've already got a literal object, move on
- if (is_object($def)) {
- // preserve previous required
- $attr[$def_i]->required = ($required || $attr[$def_i]->required);
- continue;
- }
-
- if ($def === false) {
- unset($attr[$def_i]);
- continue;
- }
-
- if ($t = $attr_types->get($def)) {
- $attr[$def_i] = $t;
- $attr[$def_i]->required = $required;
- } else {
- unset($attr[$def_i]);
- }
- }
- }
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/AttrDef.php b/library/HTMLPurifier/AttrDef.php
deleted file mode 100644
index 5ac06522b..000000000
--- a/library/HTMLPurifier/AttrDef.php
+++ /dev/null
@@ -1,138 +0,0 @@
-<?php
-
-/**
- * Base class for all validating attribute definitions.
- *
- * This family of classes forms the core for not only HTML attribute validation,
- * but also any sort of string that needs to be validated or cleaned (which
- * means CSS properties and composite definitions are defined here too).
- * Besides defining (through code) what precisely makes the string valid,
- * subclasses are also responsible for cleaning the code if possible.
- */
-
-abstract class HTMLPurifier_AttrDef
-{
-
- /**
- * Tells us whether or not an HTML attribute is minimized.
- * Has no meaning in other contexts.
- * @type bool
- */
- public $minimized = false;
-
- /**
- * Tells us whether or not an HTML attribute is required.
- * Has no meaning in other contexts
- * @type bool
- */
- public $required = false;
-
- /**
- * Validates and cleans passed string according to a definition.
- *
- * @param string $string String to be validated and cleaned.
- * @param HTMLPurifier_Config $config Mandatory HTMLPurifier_Config object.
- * @param HTMLPurifier_Context $context Mandatory HTMLPurifier_Context object.
- */
- abstract public function validate($string, $config, $context);
-
- /**
- * Convenience method that parses a string as if it were CDATA.
- *
- * This method process a string in the manner specified at
- * <http://www.w3.org/TR/html4/types.html#h-6.2> by removing
- * leading and trailing whitespace, ignoring line feeds, and replacing
- * carriage returns and tabs with spaces. While most useful for HTML
- * attributes specified as CDATA, it can also be applied to most CSS
- * values.
- *
- * @note This method is not entirely standards compliant, as trim() removes
- * more types of whitespace than specified in the spec. In practice,
- * this is rarely a problem, as those extra characters usually have
- * already been removed by HTMLPurifier_Encoder.
- *
- * @warning This processing is inconsistent with XML's whitespace handling
- * as specified by section 3.3.3 and referenced XHTML 1.0 section
- * 4.7. However, note that we are NOT necessarily
- * parsing XML, thus, this behavior may still be correct. We
- * assume that newlines have been normalized.
- */
- public function parseCDATA($string)
- {
- $string = trim($string);
- $string = str_replace(array("\n", "\t", "\r"), ' ', $string);
- return $string;
- }
-
- /**
- * Factory method for creating this class from a string.
- * @param string $string String construction info
- * @return HTMLPurifier_AttrDef Created AttrDef object corresponding to $string
- */
- public function make($string)
- {
- // default implementation, return a flyweight of this object.
- // If $string has an effect on the returned object (i.e. you
- // need to overload this method), it is best
- // to clone or instantiate new copies. (Instantiation is safer.)
- return $this;
- }
-
- /**
- * Removes spaces from rgb(0, 0, 0) so that shorthand CSS properties work
- * properly. THIS IS A HACK!
- * @param string $string a CSS colour definition
- * @return string
- */
- protected function mungeRgb($string)
- {
- return preg_replace('/rgb\((\d+)\s*,\s*(\d+)\s*,\s*(\d+)\)/', 'rgb(\1,\2,\3)', $string);
- }
-
- /**
- * Parses a possibly escaped CSS string and returns the "pure"
- * version of it.
- */
- protected function expandCSSEscape($string)
- {
- // flexibly parse it
- $ret = '';
- for ($i = 0, $c = strlen($string); $i < $c; $i++) {
- if ($string[$i] === '\\') {
- $i++;
- if ($i >= $c) {
- $ret .= '\\';
- break;
- }
- if (ctype_xdigit($string[$i])) {
- $code = $string[$i];
- for ($a = 1, $i++; $i < $c && $a < 6; $i++, $a++) {
- if (!ctype_xdigit($string[$i])) {
- break;
- }
- $code .= $string[$i];
- }
- // We have to be extremely careful when adding
- // new characters, to make sure we're not breaking
- // the encoding.
- $char = HTMLPurifier_Encoder::unichr(hexdec($code));
- if (HTMLPurifier_Encoder::cleanUTF8($char) === '') {
- continue;
- }
- $ret .= $char;
- if ($i < $c && trim($string[$i]) !== '') {
- $i--;
- }
- continue;
- }
- if ($string[$i] === "\n") {
- continue;
- }
- }
- $ret .= $string[$i];
- }
- return $ret;
- }
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/AttrDef/CSS.php b/library/HTMLPurifier/AttrDef/CSS.php
deleted file mode 100644
index 02c1641fb..000000000
--- a/library/HTMLPurifier/AttrDef/CSS.php
+++ /dev/null
@@ -1,106 +0,0 @@
-<?php
-
-/**
- * Validates the HTML attribute style, otherwise known as CSS.
- * @note We don't implement the whole CSS specification, so it might be
- * difficult to reuse this component in the context of validating
- * actual stylesheet declarations.
- * @note If we were really serious about validating the CSS, we would
- * tokenize the styles and then parse the tokens. Obviously, we
- * are not doing that. Doing that could seriously harm performance,
- * but would make these components a lot more viable for a CSS
- * filtering solution.
- */
-class HTMLPurifier_AttrDef_CSS extends HTMLPurifier_AttrDef
-{
-
- /**
- * @param string $css
- * @param HTMLPurifier_Config $config
- * @param HTMLPurifier_Context $context
- * @return bool|string
- */
- public function validate($css, $config, $context)
- {
- $css = $this->parseCDATA($css);
-
- $definition = $config->getCSSDefinition();
-
- // we're going to break the spec and explode by semicolons.
- // This is because semicolon rarely appears in escaped form
- // Doing this is generally flaky but fast
- // IT MIGHT APPEAR IN URIs, see HTMLPurifier_AttrDef_CSSURI
- // for details
-
- $declarations = explode(';', $css);
- $propvalues = array();
-
- /**
- * Name of the current CSS property being validated.
- */
- $property = false;
- $context->register('CurrentCSSProperty', $property);
-
- foreach ($declarations as $declaration) {
- if (!$declaration) {
- continue;
- }
- if (!strpos($declaration, ':')) {
- continue;
- }
- list($property, $value) = explode(':', $declaration, 2);
- $property = trim($property);
- $value = trim($value);
- $ok = false;
- do {
- if (isset($definition->info[$property])) {
- $ok = true;
- break;
- }
- if (ctype_lower($property)) {
- break;
- }
- $property = strtolower($property);
- if (isset($definition->info[$property])) {
- $ok = true;
- break;
- }
- } while (0);
- if (!$ok) {
- continue;
- }
- // inefficient call, since the validator will do this again
- if (strtolower(trim($value)) !== 'inherit') {
- // inherit works for everything (but only on the base property)
- $result = $definition->info[$property]->validate(
- $value,
- $config,
- $context
- );
- } else {
- $result = 'inherit';
- }
- if ($result === false) {
- continue;
- }
- $propvalues[$property] = $result;
- }
-
- $context->destroy('CurrentCSSProperty');
-
- // procedure does not write the new CSS simultaneously, so it's
- // slightly inefficient, but it's the only way of getting rid of
- // duplicates. Perhaps config to optimize it, but not now.
-
- $new_declarations = '';
- foreach ($propvalues as $prop => $value) {
- $new_declarations .= "$prop:$value;";
- }
-
- return $new_declarations ? $new_declarations : false;
-
- }
-
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/AttrDef/CSS/Color.php b/library/HTMLPurifier/AttrDef/CSS/Color.php
deleted file mode 100644
index 16d2a6b98..000000000
--- a/library/HTMLPurifier/AttrDef/CSS/Color.php
+++ /dev/null
@@ -1,105 +0,0 @@
-<?php
-
-/**
- * Validates Color as defined by CSS.
- */
-class HTMLPurifier_AttrDef_CSS_Color extends HTMLPurifier_AttrDef
-{
-
- /**
- * @param string $color
- * @param HTMLPurifier_Config $config
- * @param HTMLPurifier_Context $context
- * @return bool|string
- */
- public function validate($color, $config, $context)
- {
- static $colors = null;
- if ($colors === null) {
- $colors = $config->get('Core.ColorKeywords');
- }
-
- $color = trim($color);
- if ($color === '') {
- return false;
- }
-
- $lower = strtolower($color);
- if (isset($colors[$lower])) {
- return $colors[$lower];
- }
-
- if (strpos($color, 'rgb(') !== false) {
- // rgb literal handling
- $length = strlen($color);
- if (strpos($color, ')') !== $length - 1) {
- return false;
- }
- $triad = substr($color, 4, $length - 4 - 1);
- $parts = explode(',', $triad);
- if (count($parts) !== 3) {
- return false;
- }
- $type = false; // to ensure that they're all the same type
- $new_parts = array();
- foreach ($parts as $part) {
- $part = trim($part);
- if ($part === '') {
- return false;
- }
- $length = strlen($part);
- if ($part[$length - 1] === '%') {
- // handle percents
- if (!$type) {
- $type = 'percentage';
- } elseif ($type !== 'percentage') {
- return false;
- }
- $num = (float)substr($part, 0, $length - 1);
- if ($num < 0) {
- $num = 0;
- }
- if ($num > 100) {
- $num = 100;
- }
- $new_parts[] = "$num%";
- } else {
- // handle integers
- if (!$type) {
- $type = 'integer';
- } elseif ($type !== 'integer') {
- return false;
- }
- $num = (int)$part;
- if ($num < 0) {
- $num = 0;
- }
- if ($num > 255) {
- $num = 255;
- }
- $new_parts[] = (string)$num;
- }
- }
- $new_triad = implode(',', $new_parts);
- $color = "rgb($new_triad)";
- } else {
- // hexadecimal handling
- if ($color[0] === '#') {
- $hex = substr($color, 1);
- } else {
- $hex = $color;
- $color = '#' . $color;
- }
- $length = strlen($hex);
- if ($length !== 3 && $length !== 6) {
- return false;
- }
- if (!ctype_xdigit($hex)) {
- return false;
- }
- }
- return $color;
- }
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/AttrDef/CSS/Multiple.php b/library/HTMLPurifier/AttrDef/CSS/Multiple.php
deleted file mode 100644
index 9f266cdd1..000000000
--- a/library/HTMLPurifier/AttrDef/CSS/Multiple.php
+++ /dev/null
@@ -1,71 +0,0 @@
-<?php
-
-/**
- * Framework class for strings that involve multiple values.
- *
- * Certain CSS properties such as border-width and margin allow multiple
- * lengths to be specified. This class can take a vanilla border-width
- * definition and multiply it, usually into a max of four.
- *
- * @note Even though the CSS specification isn't clear about it, inherit
- * can only be used alone: it will never manifest as part of a multi
- * shorthand declaration. Thus, this class does not allow inherit.
- */
-class HTMLPurifier_AttrDef_CSS_Multiple extends HTMLPurifier_AttrDef
-{
- /**
- * Instance of component definition to defer validation to.
- * @type HTMLPurifier_AttrDef
- * @todo Make protected
- */
- public $single;
-
- /**
- * Max number of values allowed.
- * @todo Make protected
- */
- public $max;
-
- /**
- * @param HTMLPurifier_AttrDef $single HTMLPurifier_AttrDef to multiply
- * @param int $max Max number of values allowed (usually four)
- */
- public function __construct($single, $max = 4)
- {
- $this->single = $single;
- $this->max = $max;
- }
-
- /**
- * @param string $string
- * @param HTMLPurifier_Config $config
- * @param HTMLPurifier_Context $context
- * @return bool|string
- */
- public function validate($string, $config, $context)
- {
- $string = $this->parseCDATA($string);
- if ($string === '') {
- return false;
- }
- $parts = explode(' ', $string); // parseCDATA replaced \r, \t and \n
- $length = count($parts);
- $final = '';
- for ($i = 0, $num = 0; $i < $length && $num < $this->max; $i++) {
- if (ctype_space($parts[$i])) {
- continue;
- }
- $result = $this->single->validate($parts[$i], $config, $context);
- if ($result !== false) {
- $final .= $result . ' ';
- $num++;
- }
- }
- if ($final === '') {
- return false;
- }
- return rtrim($final);
- }
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/AttrDef/CSS/URI.php b/library/HTMLPurifier/AttrDef/CSS/URI.php
deleted file mode 100644
index f9434230e..000000000
--- a/library/HTMLPurifier/AttrDef/CSS/URI.php
+++ /dev/null
@@ -1,74 +0,0 @@
-<?php
-
-/**
- * Validates a URI in CSS syntax, which uses url('http://example.com')
- * @note While theoretically speaking a URI in a CSS document could
- * be non-embedded, as of CSS2 there is no such usage so we're
- * generalizing it. This may need to be changed in the future.
- * @warning Since HTMLPurifier_AttrDef_CSS blindly uses semicolons as
- * the separator, you cannot put a literal semicolon in
- * in the URI. Try percent encoding it, in that case.
- */
-class HTMLPurifier_AttrDef_CSS_URI extends HTMLPurifier_AttrDef_URI
-{
-
- public function __construct()
- {
- parent::__construct(true); // always embedded
- }
-
- /**
- * @param string $uri_string
- * @param HTMLPurifier_Config $config
- * @param HTMLPurifier_Context $context
- * @return bool|string
- */
- public function validate($uri_string, $config, $context)
- {
- // parse the URI out of the string and then pass it onto
- // the parent object
-
- $uri_string = $this->parseCDATA($uri_string);
- if (strpos($uri_string, 'url(') !== 0) {
- return false;
- }
- $uri_string = substr($uri_string, 4);
- $new_length = strlen($uri_string) - 1;
- if ($uri_string[$new_length] != ')') {
- return false;
- }
- $uri = trim(substr($uri_string, 0, $new_length));
-
- if (!empty($uri) && ($uri[0] == "'" || $uri[0] == '"')) {
- $quote = $uri[0];
- $new_length = strlen($uri) - 1;
- if ($uri[$new_length] !== $quote) {
- return false;
- }
- $uri = substr($uri, 1, $new_length - 1);
- }
-
- $uri = $this->expandCSSEscape($uri);
-
- $result = parent::validate($uri, $config, $context);
-
- if ($result === false) {
- return false;
- }
-
- // extra sanity check; should have been done by URI
- $result = str_replace(array('"', "\\", "\n", "\x0c", "\r"), "", $result);
-
- // suspicious characters are ()'; we're going to percent encode
- // them for safety.
- $result = str_replace(array('(', ')', "'"), array('%28', '%29', '%27'), $result);
-
- // there's an extra bug where ampersands lose their escaping on
- // an innerHTML cycle, so a very unlucky query parameter could
- // then change the meaning of the URL. Unfortunately, there's
- // not much we can do about that...
- return "url(\"$result\")";
- }
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/AttrDef/HTML/Bool.php b/library/HTMLPurifier/AttrDef/HTML/Bool.php
deleted file mode 100644
index 036a240e1..000000000
--- a/library/HTMLPurifier/AttrDef/HTML/Bool.php
+++ /dev/null
@@ -1,51 +0,0 @@
-<?php
-
-/**
- * Validates a boolean attribute
- */
-class HTMLPurifier_AttrDef_HTML_Bool extends HTMLPurifier_AttrDef
-{
-
- /**
- * @type bool
- */
- protected $name;
-
- /**
- * @type bool
- */
- public $minimized = true;
-
- /**
- * @param bool $name
- */
- public function __construct($name = false)
- {
- $this->name = $name;
- }
-
- /**
- * @param string $string
- * @param HTMLPurifier_Config $config
- * @param HTMLPurifier_Context $context
- * @return bool|string
- */
- public function validate($string, $config, $context)
- {
- if (empty($string)) {
- return false;
- }
- return $this->name;
- }
-
- /**
- * @param string $string Name of attribute
- * @return HTMLPurifier_AttrDef_HTML_Bool
- */
- public function make($string)
- {
- return new HTMLPurifier_AttrDef_HTML_Bool($string);
- }
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/AttrDef/HTML/ID.php b/library/HTMLPurifier/AttrDef/HTML/ID.php
deleted file mode 100644
index 3d86efb44..000000000
--- a/library/HTMLPurifier/AttrDef/HTML/ID.php
+++ /dev/null
@@ -1,105 +0,0 @@
-<?php
-
-/**
- * Validates the HTML attribute ID.
- * @warning Even though this is the id processor, it
- * will ignore the directive Attr:IDBlacklist, since it will only
- * go according to the ID accumulator. Since the accumulator is
- * automatically generated, it will have already absorbed the
- * blacklist. If you're hacking around, make sure you use load()!
- */
-
-class HTMLPurifier_AttrDef_HTML_ID extends HTMLPurifier_AttrDef
-{
-
- // selector is NOT a valid thing to use for IDREFs, because IDREFs
- // *must* target IDs that exist, whereas selector #ids do not.
-
- /**
- * Determines whether or not we're validating an ID in a CSS
- * selector context.
- * @type bool
- */
- protected $selector;
-
- /**
- * @param bool $selector
- */
- public function __construct($selector = false)
- {
- $this->selector = $selector;
- }
-
- /**
- * @param string $id
- * @param HTMLPurifier_Config $config
- * @param HTMLPurifier_Context $context
- * @return bool|string
- */
- public function validate($id, $config, $context)
- {
- if (!$this->selector && !$config->get('Attr.EnableID')) {
- return false;
- }
-
- $id = trim($id); // trim it first
-
- if ($id === '') {
- return false;
- }
-
- $prefix = $config->get('Attr.IDPrefix');
- if ($prefix !== '') {
- $prefix .= $config->get('Attr.IDPrefixLocal');
- // prevent re-appending the prefix
- if (strpos($id, $prefix) !== 0) {
- $id = $prefix . $id;
- }
- } elseif ($config->get('Attr.IDPrefixLocal') !== '') {
- trigger_error(
- '%Attr.IDPrefixLocal cannot be used unless ' .
- '%Attr.IDPrefix is set',
- E_USER_WARNING
- );
- }
-
- if (!$this->selector) {
- $id_accumulator =& $context->get('IDAccumulator');
- if (isset($id_accumulator->ids[$id])) {
- return false;
- }
- }
-
- // we purposely avoid using regex, hopefully this is faster
-
- if (ctype_alpha($id)) {
- $result = true;
- } else {
- if (!ctype_alpha(@$id[0])) {
- return false;
- }
- // primitive style of regexps, I suppose
- $trim = trim(
- $id,
- 'A..Za..z0..9:-._'
- );
- $result = ($trim === '');
- }
-
- $regexp = $config->get('Attr.IDBlacklistRegexp');
- if ($regexp && preg_match($regexp, $id)) {
- return false;
- }
-
- if (!$this->selector && $result) {
- $id_accumulator->add($id);
- }
-
- // if no change was made to the ID, return the result
- // else, return the new id if stripping whitespace made it
- // valid, or return false.
- return $result ? $id : false;
- }
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/AttrDef/URI/Host.php b/library/HTMLPurifier/AttrDef/URI/Host.php
deleted file mode 100644
index e7df800b1..000000000
--- a/library/HTMLPurifier/AttrDef/URI/Host.php
+++ /dev/null
@@ -1,128 +0,0 @@
-<?php
-
-/**
- * Validates a host according to the IPv4, IPv6 and DNS (future) specifications.
- */
-class HTMLPurifier_AttrDef_URI_Host extends HTMLPurifier_AttrDef
-{
-
- /**
- * IPv4 sub-validator.
- * @type HTMLPurifier_AttrDef_URI_IPv4
- */
- protected $ipv4;
-
- /**
- * IPv6 sub-validator.
- * @type HTMLPurifier_AttrDef_URI_IPv6
- */
- protected $ipv6;
-
- public function __construct()
- {
- $this->ipv4 = new HTMLPurifier_AttrDef_URI_IPv4();
- $this->ipv6 = new HTMLPurifier_AttrDef_URI_IPv6();
- }
-
- /**
- * @param string $string
- * @param HTMLPurifier_Config $config
- * @param HTMLPurifier_Context $context
- * @return bool|string
- */
- public function validate($string, $config, $context)
- {
- $length = strlen($string);
- // empty hostname is OK; it's usually semantically equivalent:
- // the default host as defined by a URI scheme is used:
- //
- // If the URI scheme defines a default for host, then that
- // default applies when the host subcomponent is undefined
- // or when the registered name is empty (zero length).
- if ($string === '') {
- return '';
- }
- if ($length > 1 && $string[0] === '[' && $string[$length - 1] === ']') {
- //IPv6
- $ip = substr($string, 1, $length - 2);
- $valid = $this->ipv6->validate($ip, $config, $context);
- if ($valid === false) {
- return false;
- }
- return '[' . $valid . ']';
- }
-
- // need to do checks on unusual encodings too
- $ipv4 = $this->ipv4->validate($string, $config, $context);
- if ($ipv4 !== false) {
- return $ipv4;
- }
-
- // A regular domain name.
-
- // This doesn't match I18N domain names, but we don't have proper IRI support,
- // so force users to insert Punycode.
-
- // There is not a good sense in which underscores should be
- // allowed, since it's technically not! (And if you go as
- // far to allow everything as specified by the DNS spec...
- // well, that's literally everything, modulo some space limits
- // for the components and the overall name (which, by the way,
- // we are NOT checking!). So we (arbitrarily) decide this:
- // let's allow underscores wherever we would have allowed
- // hyphens, if they are enabled. This is a pretty good match
- // for browser behavior, for example, a large number of browsers
- // cannot handle foo_.example.com, but foo_bar.example.com is
- // fairly well supported.
- $underscore = $config->get('Core.AllowHostnameUnderscore') ? '_' : '';
-
- // The productions describing this are:
- $a = '[a-z]'; // alpha
- $an = '[a-z0-9]'; // alphanum
- $and = "[a-z0-9-$underscore]"; // alphanum | "-"
- // domainlabel = alphanum | alphanum *( alphanum | "-" ) alphanum
- $domainlabel = "$an($and*$an)?";
- // toplabel = alpha | alpha *( alphanum | "-" ) alphanum
- $toplabel = "$a($and*$an)?";
- // hostname = *( domainlabel "." ) toplabel [ "." ]
- if (preg_match("/^($domainlabel\.)*$toplabel\.?$/i", $string)) {
- return $string;
- }
-
- // If we have Net_IDNA2 support, we can support IRIs by
- // punycoding them. (This is the most portable thing to do,
- // since otherwise we have to assume browsers support
-
- if ($config->get('Core.EnableIDNA')) {
- $idna = new Net_IDNA2(array('encoding' => 'utf8', 'overlong' => false, 'strict' => true));
- // we need to encode each period separately
- $parts = explode('.', $string);
- try {
- $new_parts = array();
- foreach ($parts as $part) {
- $encodable = false;
- for ($i = 0, $c = strlen($part); $i < $c; $i++) {
- if (ord($part[$i]) > 0x7a) {
- $encodable = true;
- break;
- }
- }
- if (!$encodable) {
- $new_parts[] = $part;
- } else {
- $new_parts[] = $idna->encode($part);
- }
- }
- $string = implode('.', $new_parts);
- if (preg_match("/^($domainlabel\.)*$toplabel\.?$/i", $string)) {
- return $string;
- }
- } catch (Exception $e) {
- // XXX error reporting
- }
- }
- return false;
- }
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/AttrTransform/ImgRequired.php b/library/HTMLPurifier/AttrTransform/ImgRequired.php
deleted file mode 100644
index 7df6cb3e1..000000000
--- a/library/HTMLPurifier/AttrTransform/ImgRequired.php
+++ /dev/null
@@ -1,48 +0,0 @@
-<?php
-
-// must be called POST validation
-
-/**
- * Transform that supplies default values for the src and alt attributes
- * in img tags, as well as prevents the img tag from being removed
- * because of a missing alt tag. This needs to be registered as both
- * a pre and post attribute transform.
- */
-class HTMLPurifier_AttrTransform_ImgRequired extends HTMLPurifier_AttrTransform
-{
-
- /**
- * @param array $attr
- * @param HTMLPurifier_Config $config
- * @param HTMLPurifier_Context $context
- * @return array
- */
- public function transform($attr, $config, $context)
- {
- $src = true;
- if (!isset($attr['src'])) {
- if ($config->get('Core.RemoveInvalidImg')) {
- return $attr;
- }
- $attr['src'] = $config->get('Attr.DefaultInvalidImage');
- $src = false;
- }
-
- if (!isset($attr['alt'])) {
- if ($src) {
- $alt = $config->get('Attr.DefaultImageAlt');
- if ($alt === null) {
- // truncate if the alt is too long
- $attr['alt'] = substr(basename($attr['src']), 0, 40);
- } else {
- $attr['alt'] = $alt;
- }
- } else {
- $attr['alt'] = $config->get('Attr.DefaultInvalidImageAlt');
- }
- }
- return $attr;
- }
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/CSSDefinition.php b/library/HTMLPurifier/CSSDefinition.php
deleted file mode 100644
index 0acdee2d9..000000000
--- a/library/HTMLPurifier/CSSDefinition.php
+++ /dev/null
@@ -1,474 +0,0 @@
-<?php
-
-/**
- * Defines allowed CSS attributes and what their values are.
- * @see HTMLPurifier_HTMLDefinition
- */
-class HTMLPurifier_CSSDefinition extends HTMLPurifier_Definition
-{
-
- public $type = 'CSS';
-
- /**
- * Assoc array of attribute name to definition object.
- * @type HTMLPurifier_AttrDef[]
- */
- public $info = array();
-
- /**
- * Constructs the info array. The meat of this class.
- * @param HTMLPurifier_Config $config
- */
- protected function doSetup($config)
- {
- $this->info['text-align'] = new HTMLPurifier_AttrDef_Enum(
- array('left', 'right', 'center', 'justify'),
- false
- );
-
- $border_style =
- $this->info['border-bottom-style'] =
- $this->info['border-right-style'] =
- $this->info['border-left-style'] =
- $this->info['border-top-style'] = new HTMLPurifier_AttrDef_Enum(
- array(
- 'none',
- 'hidden',
- 'dotted',
- 'dashed',
- 'solid',
- 'double',
- 'groove',
- 'ridge',
- 'inset',
- 'outset'
- ),
- false
- );
-
- $this->info['border-style'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_style);
-
- $this->info['clear'] = new HTMLPurifier_AttrDef_Enum(
- array('none', 'left', 'right', 'both'),
- false
- );
- $this->info['float'] = new HTMLPurifier_AttrDef_Enum(
- array('none', 'left', 'right'),
- false
- );
- $this->info['font-style'] = new HTMLPurifier_AttrDef_Enum(
- array('normal', 'italic', 'oblique'),
- false
- );
- $this->info['font-variant'] = new HTMLPurifier_AttrDef_Enum(
- array('normal', 'small-caps'),
- false
- );
-
- $uri_or_none = new HTMLPurifier_AttrDef_CSS_Composite(
- array(
- new HTMLPurifier_AttrDef_Enum(array('none')),
- new HTMLPurifier_AttrDef_CSS_URI()
- )
- );
-
- $this->info['list-style-position'] = new HTMLPurifier_AttrDef_Enum(
- array('inside', 'outside'),
- false
- );
- $this->info['list-style-type'] = new HTMLPurifier_AttrDef_Enum(
- array(
- 'disc',
- 'circle',
- 'square',
- 'decimal',
- 'lower-roman',
- 'upper-roman',
- 'lower-alpha',
- 'upper-alpha',
- 'none'
- ),
- false
- );
- $this->info['list-style-image'] = $uri_or_none;
-
- $this->info['list-style'] = new HTMLPurifier_AttrDef_CSS_ListStyle($config);
-
- $this->info['text-transform'] = new HTMLPurifier_AttrDef_Enum(
- array('capitalize', 'uppercase', 'lowercase', 'none'),
- false
- );
- $this->info['color'] = new HTMLPurifier_AttrDef_CSS_Color();
-
- $this->info['background-image'] = $uri_or_none;
- $this->info['background-repeat'] = new HTMLPurifier_AttrDef_Enum(
- array('repeat', 'repeat-x', 'repeat-y', 'no-repeat')
- );
- $this->info['background-attachment'] = new HTMLPurifier_AttrDef_Enum(
- array('scroll', 'fixed')
- );
- $this->info['background-position'] = new HTMLPurifier_AttrDef_CSS_BackgroundPosition();
-
- $border_color =
- $this->info['border-top-color'] =
- $this->info['border-bottom-color'] =
- $this->info['border-left-color'] =
- $this->info['border-right-color'] =
- $this->info['background-color'] = new HTMLPurifier_AttrDef_CSS_Composite(
- array(
- new HTMLPurifier_AttrDef_Enum(array('transparent')),
- new HTMLPurifier_AttrDef_CSS_Color()
- )
- );
-
- $this->info['background'] = new HTMLPurifier_AttrDef_CSS_Background($config);
-
- $this->info['border-color'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_color);
-
- $border_width =
- $this->info['border-top-width'] =
- $this->info['border-bottom-width'] =
- $this->info['border-left-width'] =
- $this->info['border-right-width'] = new HTMLPurifier_AttrDef_CSS_Composite(
- array(
- new HTMLPurifier_AttrDef_Enum(array('thin', 'medium', 'thick')),
- new HTMLPurifier_AttrDef_CSS_Length('0') //disallow negative
- )
- );
-
- $this->info['border-width'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_width);
-
- $this->info['letter-spacing'] = new HTMLPurifier_AttrDef_CSS_Composite(
- array(
- new HTMLPurifier_AttrDef_Enum(array('normal')),
- new HTMLPurifier_AttrDef_CSS_Length()
- )
- );
-
- $this->info['word-spacing'] = new HTMLPurifier_AttrDef_CSS_Composite(
- array(
- new HTMLPurifier_AttrDef_Enum(array('normal')),
- new HTMLPurifier_AttrDef_CSS_Length()
- )
- );
-
- $this->info['font-size'] = new HTMLPurifier_AttrDef_CSS_Composite(
- array(
- new HTMLPurifier_AttrDef_Enum(
- array(
- 'xx-small',
- 'x-small',
- 'small',
- 'medium',
- 'large',
- 'x-large',
- 'xx-large',
- 'larger',
- 'smaller'
- )
- ),
- new HTMLPurifier_AttrDef_CSS_Percentage(),
- new HTMLPurifier_AttrDef_CSS_Length()
- )
- );
-
- $this->info['line-height'] = new HTMLPurifier_AttrDef_CSS_Composite(
- array(
- new HTMLPurifier_AttrDef_Enum(array('normal')),
- new HTMLPurifier_AttrDef_CSS_Number(true), // no negatives
- new HTMLPurifier_AttrDef_CSS_Length('0'),
- new HTMLPurifier_AttrDef_CSS_Percentage(true)
- )
- );
-
- $margin =
- $this->info['margin-top'] =
- $this->info['margin-bottom'] =
- $this->info['margin-left'] =
- $this->info['margin-right'] = new HTMLPurifier_AttrDef_CSS_Composite(
- array(
- new HTMLPurifier_AttrDef_CSS_Length(),
- new HTMLPurifier_AttrDef_CSS_Percentage(),
- new HTMLPurifier_AttrDef_Enum(array('auto'))
- )
- );
-
- $this->info['margin'] = new HTMLPurifier_AttrDef_CSS_Multiple($margin);
-
- // non-negative
- $padding =
- $this->info['padding-top'] =
- $this->info['padding-bottom'] =
- $this->info['padding-left'] =
- $this->info['padding-right'] = new HTMLPurifier_AttrDef_CSS_Composite(
- array(
- new HTMLPurifier_AttrDef_CSS_Length('0'),
- new HTMLPurifier_AttrDef_CSS_Percentage(true)
- )
- );
-
- $this->info['padding'] = new HTMLPurifier_AttrDef_CSS_Multiple($padding);
-
- $this->info['text-indent'] = new HTMLPurifier_AttrDef_CSS_Composite(
- array(
- new HTMLPurifier_AttrDef_CSS_Length(),
- new HTMLPurifier_AttrDef_CSS_Percentage()
- )
- );
-
- $trusted_wh = new HTMLPurifier_AttrDef_CSS_Composite(
- array(
- new HTMLPurifier_AttrDef_CSS_Length('0'),
- new HTMLPurifier_AttrDef_CSS_Percentage(true),
- new HTMLPurifier_AttrDef_Enum(array('auto'))
- )
- );
- $max = $config->get('CSS.MaxImgLength');
-
- $this->info['width'] =
- $this->info['height'] =
- $max === null ?
- $trusted_wh :
- new HTMLPurifier_AttrDef_Switch(
- 'img',
- // For img tags:
- new HTMLPurifier_AttrDef_CSS_Composite(
- array(
- new HTMLPurifier_AttrDef_CSS_Length('0', $max),
- new HTMLPurifier_AttrDef_Enum(array('auto'))
- )
- ),
- // For everyone else:
- $trusted_wh
- );
-
- $this->info['text-decoration'] = new HTMLPurifier_AttrDef_CSS_TextDecoration();
-
- $this->info['font-family'] = new HTMLPurifier_AttrDef_CSS_FontFamily();
-
- // this could use specialized code
- $this->info['font-weight'] = new HTMLPurifier_AttrDef_Enum(
- array(
- 'normal',
- 'bold',
- 'bolder',
- 'lighter',
- '100',
- '200',
- '300',
- '400',
- '500',
- '600',
- '700',
- '800',
- '900'
- ),
- false
- );
-
- // MUST be called after other font properties, as it references
- // a CSSDefinition object
- $this->info['font'] = new HTMLPurifier_AttrDef_CSS_Font($config);
-
- // same here
- $this->info['border'] =
- $this->info['border-bottom'] =
- $this->info['border-top'] =
- $this->info['border-left'] =
- $this->info['border-right'] = new HTMLPurifier_AttrDef_CSS_Border($config);
-
- $this->info['border-collapse'] = new HTMLPurifier_AttrDef_Enum(
- array('collapse', 'separate')
- );
-
- $this->info['caption-side'] = new HTMLPurifier_AttrDef_Enum(
- array('top', 'bottom')
- );
-
- $this->info['table-layout'] = new HTMLPurifier_AttrDef_Enum(
- array('auto', 'fixed')
- );
-
- $this->info['vertical-align'] = new HTMLPurifier_AttrDef_CSS_Composite(
- array(
- new HTMLPurifier_AttrDef_Enum(
- array(
- 'baseline',
- 'sub',
- 'super',
- 'top',
- 'text-top',
- 'middle',
- 'bottom',
- 'text-bottom'
- )
- ),
- new HTMLPurifier_AttrDef_CSS_Length(),
- new HTMLPurifier_AttrDef_CSS_Percentage()
- )
- );
-
- $this->info['border-spacing'] = new HTMLPurifier_AttrDef_CSS_Multiple(new HTMLPurifier_AttrDef_CSS_Length(), 2);
-
- // These CSS properties don't work on many browsers, but we live
- // in THE FUTURE!
- $this->info['white-space'] = new HTMLPurifier_AttrDef_Enum(
- array('nowrap', 'normal', 'pre', 'pre-wrap', 'pre-line')
- );
-
- if ($config->get('CSS.Proprietary')) {
- $this->doSetupProprietary($config);
- }
-
- if ($config->get('CSS.AllowTricky')) {
- $this->doSetupTricky($config);
- }
-
- if ($config->get('CSS.Trusted')) {
- $this->doSetupTrusted($config);
- }
-
- $allow_important = $config->get('CSS.AllowImportant');
- // wrap all attr-defs with decorator that handles !important
- foreach ($this->info as $k => $v) {
- $this->info[$k] = new HTMLPurifier_AttrDef_CSS_ImportantDecorator($v, $allow_important);
- }
-
- $this->setupConfigStuff($config);
- }
-
- /**
- * @param HTMLPurifier_Config $config
- */
- protected function doSetupProprietary($config)
- {
- // Internet Explorer only scrollbar colors
- $this->info['scrollbar-arrow-color'] = new HTMLPurifier_AttrDef_CSS_Color();
- $this->info['scrollbar-base-color'] = new HTMLPurifier_AttrDef_CSS_Color();
- $this->info['scrollbar-darkshadow-color'] = new HTMLPurifier_AttrDef_CSS_Color();
- $this->info['scrollbar-face-color'] = new HTMLPurifier_AttrDef_CSS_Color();
- $this->info['scrollbar-highlight-color'] = new HTMLPurifier_AttrDef_CSS_Color();
- $this->info['scrollbar-shadow-color'] = new HTMLPurifier_AttrDef_CSS_Color();
-
- // technically not proprietary, but CSS3, and no one supports it
- $this->info['opacity'] = new HTMLPurifier_AttrDef_CSS_AlphaValue();
- $this->info['-moz-opacity'] = new HTMLPurifier_AttrDef_CSS_AlphaValue();
- $this->info['-khtml-opacity'] = new HTMLPurifier_AttrDef_CSS_AlphaValue();
-
- // only opacity, for now
- $this->info['filter'] = new HTMLPurifier_AttrDef_CSS_Filter();
-
- // more CSS3
- $this->info['page-break-after'] =
- $this->info['page-break-before'] = new HTMLPurifier_AttrDef_Enum(
- array(
- 'auto',
- 'always',
- 'avoid',
- 'left',
- 'right'
- )
- );
- $this->info['page-break-inside'] = new HTMLPurifier_AttrDef_Enum(array('auto', 'avoid'));
-
- }
-
- /**
- * @param HTMLPurifier_Config $config
- */
- protected function doSetupTricky($config)
- {
- $this->info['display'] = new HTMLPurifier_AttrDef_Enum(
- array(
- 'inline',
- 'block',
- 'list-item',
- 'run-in',
- 'compact',
- 'marker',
- 'table',
- 'inline-block',
- 'inline-table',
- 'table-row-group',
- 'table-header-group',
- 'table-footer-group',
- 'table-row',
- 'table-column-group',
- 'table-column',
- 'table-cell',
- 'table-caption',
- 'none'
- )
- );
- $this->info['visibility'] = new HTMLPurifier_AttrDef_Enum(
- array('visible', 'hidden', 'collapse')
- );
- $this->info['overflow'] = new HTMLPurifier_AttrDef_Enum(array('visible', 'hidden', 'auto', 'scroll'));
- }
-
- /**
- * @param HTMLPurifier_Config $config
- */
- protected function doSetupTrusted($config)
- {
- $this->info['position'] = new HTMLPurifier_AttrDef_Enum(
- array('static', 'relative', 'absolute', 'fixed')
- );
- $this->info['top'] =
- $this->info['left'] =
- $this->info['right'] =
- $this->info['bottom'] = new HTMLPurifier_AttrDef_CSS_Composite(
- array(
- new HTMLPurifier_AttrDef_CSS_Length(),
- new HTMLPurifier_AttrDef_CSS_Percentage(),
- new HTMLPurifier_AttrDef_Enum(array('auto')),
- )
- );
- $this->info['z-index'] = new HTMLPurifier_AttrDef_CSS_Composite(
- array(
- new HTMLPurifier_AttrDef_Integer(),
- new HTMLPurifier_AttrDef_Enum(array('auto')),
- )
- );
- }
-
- /**
- * Performs extra config-based processing. Based off of
- * HTMLPurifier_HTMLDefinition.
- * @param HTMLPurifier_Config $config
- * @todo Refactor duplicate elements into common class (probably using
- * composition, not inheritance).
- */
- protected function setupConfigStuff($config)
- {
- // setup allowed elements
- $support = "(for information on implementing this, see the " .
- "support forums) ";
- $allowed_properties = $config->get('CSS.AllowedProperties');
- if ($allowed_properties !== null) {
- foreach ($this->info as $name => $d) {
- if (!isset($allowed_properties[$name])) {
- unset($this->info[$name]);
- }
- unset($allowed_properties[$name]);
- }
- // emit errors
- foreach ($allowed_properties as $name => $d) {
- // :TODO: Is this htmlspecialchars() call really necessary?
- $name = htmlspecialchars($name);
- trigger_error("Style attribute '$name' is not supported $support", E_USER_WARNING);
- }
- }
-
- $forbidden_properties = $config->get('CSS.ForbiddenProperties');
- if ($forbidden_properties !== null) {
- foreach ($this->info as $name => $d) {
- if (isset($forbidden_properties[$name])) {
- unset($this->info[$name]);
- }
- }
- }
- }
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/ChildDef/List.php b/library/HTMLPurifier/ChildDef/List.php
deleted file mode 100644
index 891b9f6f5..000000000
--- a/library/HTMLPurifier/ChildDef/List.php
+++ /dev/null
@@ -1,86 +0,0 @@
-<?php
-
-/**
- * Definition for list containers ul and ol.
- *
- * What does this do? The big thing is to handle ol/ul at the top
- * level of list nodes, which should be handled specially by /folding/
- * them into the previous list node. We generally shouldn't ever
- * see other disallowed elements, because the autoclose behavior
- * in MakeWellFormed handles it.
- */
-class HTMLPurifier_ChildDef_List extends HTMLPurifier_ChildDef
-{
- /**
- * @type string
- */
- public $type = 'list';
- /**
- * @type array
- */
- // lying a little bit, so that we can handle ul and ol ourselves
- // XXX: This whole business with 'wrap' is all a bit unsatisfactory
- public $elements = array('li' => true, 'ul' => true, 'ol' => true);
-
- /**
- * @param array $children
- * @param HTMLPurifier_Config $config
- * @param HTMLPurifier_Context $context
- * @return array
- */
- public function validateChildren($children, $config, $context)
- {
- // Flag for subclasses
- $this->whitespace = false;
-
- // if there are no tokens, delete parent node
- if (empty($children)) {
- return false;
- }
-
- // the new set of children
- $result = array();
-
- // a little sanity check to make sure it's not ALL whitespace
- $all_whitespace = true;
-
- $current_li = false;
-
- foreach ($children as $node) {
- if (!empty($node->is_whitespace)) {
- $result[] = $node;
- continue;
- }
- $all_whitespace = false; // phew, we're not talking about whitespace
-
- if ($node->name === 'li') {
- // good
- $current_li = $node;
- $result[] = $node;
- } else {
- // we want to tuck this into the previous li
- // Invariant: we expect the node to be ol/ul
- // ToDo: Make this more robust in the case of not ol/ul
- // by distinguishing between existing li and li created
- // to handle non-list elements; non-list elements should
- // not be appended to an existing li; only li created
- // for non-list. This distinction is not currently made.
- if ($current_li === false) {
- $current_li = new HTMLPurifier_Node_Element('li');
- $result[] = $current_li;
- }
- $current_li->children[] = $node;
- $current_li->empty = false; // XXX fascinating! Check for this error elsewhere ToDo
- }
- }
- if (empty($result)) {
- return false;
- }
- if ($all_whitespace) {
- return false;
- }
- return $result;
- }
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/ChildDef/Table.php b/library/HTMLPurifier/ChildDef/Table.php
deleted file mode 100644
index 3e4a0f218..000000000
--- a/library/HTMLPurifier/ChildDef/Table.php
+++ /dev/null
@@ -1,224 +0,0 @@
-<?php
-
-/**
- * Definition for tables. The general idea is to extract out all of the
- * essential bits, and then reconstruct it later.
- *
- * This is a bit confusing, because the DTDs and the W3C
- * validators seem to disagree on the appropriate definition. The
- * DTD claims:
- *
- * (CAPTION?, (COL*|COLGROUP*), THEAD?, TFOOT?, TBODY+)
- *
- * But actually, the HTML4 spec then has this to say:
- *
- * The TBODY start tag is always required except when the table
- * contains only one table body and no table head or foot sections.
- * The TBODY end tag may always be safely omitted.
- *
- * So the DTD is kind of wrong. The validator is, unfortunately, kind
- * of on crack.
- *
- * The definition changed again in XHTML1.1; and in my opinion, this
- * formulation makes the most sense.
- *
- * caption?, ( col* | colgroup* ), (( thead?, tfoot?, tbody+ ) | ( tr+ ))
- *
- * Essentially, we have two modes: thead/tfoot/tbody mode, and tr mode.
- * If we encounter a thead, tfoot or tbody, we are placed in the former
- * mode, and we *must* wrap any stray tr segments with a tbody. But if
- * we don't run into any of them, just have tr tags is OK.
- */
-class HTMLPurifier_ChildDef_Table extends HTMLPurifier_ChildDef
-{
- /**
- * @type bool
- */
- public $allow_empty = false;
-
- /**
- * @type string
- */
- public $type = 'table';
-
- /**
- * @type array
- */
- public $elements = array(
- 'tr' => true,
- 'tbody' => true,
- 'thead' => true,
- 'tfoot' => true,
- 'caption' => true,
- 'colgroup' => true,
- 'col' => true
- );
-
- public function __construct()
- {
- }
-
- /**
- * @param array $children
- * @param HTMLPurifier_Config $config
- * @param HTMLPurifier_Context $context
- * @return array
- */
- public function validateChildren($children, $config, $context)
- {
- if (empty($children)) {
- return false;
- }
-
- // only one of these elements is allowed in a table
- $caption = false;
- $thead = false;
- $tfoot = false;
-
- // whitespace
- $initial_ws = array();
- $after_caption_ws = array();
- $after_thead_ws = array();
- $after_tfoot_ws = array();
-
- // as many of these as you want
- $cols = array();
- $content = array();
-
- $tbody_mode = false; // if true, then we need to wrap any stray
- // <tr>s with a <tbody>.
-
- $ws_accum =& $initial_ws;
-
- foreach ($children as $node) {
- if ($node instanceof HTMLPurifier_Node_Comment) {
- $ws_accum[] = $node;
- continue;
- }
- switch ($node->name) {
- case 'tbody':
- $tbody_mode = true;
- // fall through
- case 'tr':
- $content[] = $node;
- $ws_accum =& $content;
- break;
- case 'caption':
- // there can only be one caption!
- if ($caption !== false) break;
- $caption = $node;
- $ws_accum =& $after_caption_ws;
- break;
- case 'thead':
- $tbody_mode = true;
- // XXX This breaks rendering properties with
- // Firefox, which never floats a <thead> to
- // the top. Ever. (Our scheme will float the
- // first <thead> to the top.) So maybe
- // <thead>s that are not first should be
- // turned into <tbody>? Very tricky, indeed.
- if ($thead === false) {
- $thead = $node;
- $ws_accum =& $after_thead_ws;
- } else {
- // Oops, there's a second one! What
- // should we do? Current behavior is to
- // transmutate the first and last entries into
- // tbody tags, and then put into content.
- // Maybe a better idea is to *attach
- // it* to the existing thead or tfoot?
- // We don't do this, because Firefox
- // doesn't float an extra tfoot to the
- // bottom like it does for the first one.
- $node->name = 'tbody';
- $content[] = $node;
- $ws_accum =& $content;
- }
- break;
- case 'tfoot':
- // see above for some aveats
- $tbody_mode = true;
- if ($tfoot === false) {
- $tfoot = $node;
- $ws_accum =& $after_tfoot_ws;
- } else {
- $node->name = 'tbody';
- $content[] = $node;
- $ws_accum =& $content;
- }
- break;
- case 'colgroup':
- case 'col':
- $cols[] = $node;
- $ws_accum =& $cols;
- break;
- case '#PCDATA':
- // How is whitespace handled? We treat is as sticky to
- // the *end* of the previous element. So all of the
- // nonsense we have worked on is to keep things
- // together.
- if (!empty($node->is_whitespace)) {
- $ws_accum[] = $node;
- }
- break;
- }
- }
-
- if (empty($content)) {
- return false;
- }
-
- $ret = $initial_ws;
- if ($caption !== false) {
- $ret[] = $caption;
- $ret = array_merge($ret, $after_caption_ws);
- }
- if ($cols !== false) {
- $ret = array_merge($ret, $cols);
- }
- if ($thead !== false) {
- $ret[] = $thead;
- $ret = array_merge($ret, $after_thead_ws);
- }
- if ($tfoot !== false) {
- $ret[] = $tfoot;
- $ret = array_merge($ret, $after_tfoot_ws);
- }
-
- if ($tbody_mode) {
- // we have to shuffle tr into tbody
- $current_tr_tbody = null;
-
- foreach($content as $node) {
- switch ($node->name) {
- case 'tbody':
- $current_tr_tbody = null;
- $ret[] = $node;
- break;
- case 'tr':
- if ($current_tr_tbody === null) {
- $current_tr_tbody = new HTMLPurifier_Node_Element('tbody');
- $ret[] = $current_tr_tbody;
- }
- $current_tr_tbody->children[] = $node;
- break;
- case '#PCDATA':
- assert($node->is_whitespace);
- if ($current_tr_tbody === null) {
- $ret[] = $node;
- } else {
- $current_tr_tbody->children[] = $node;
- }
- break;
- }
- }
- } else {
- $ret = array_merge($ret, $content);
- }
-
- return $ret;
-
- }
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/Config.php b/library/HTMLPurifier/Config.php
deleted file mode 100644
index 7ada59b94..000000000
--- a/library/HTMLPurifier/Config.php
+++ /dev/null
@@ -1,911 +0,0 @@
-<?php
-
-/**
- * Configuration object that triggers customizable behavior.
- *
- * @warning This class is strongly defined: that means that the class
- * will fail if an undefined directive is retrieved or set.
- *
- * @note Many classes that could (although many times don't) use the
- * configuration object make it a mandatory parameter. This is
- * because a configuration object should always be forwarded,
- * otherwise, you run the risk of missing a parameter and then
- * being stumped when a configuration directive doesn't work.
- *
- * @todo Reconsider some of the public member variables
- */
-class HTMLPurifier_Config
-{
-
- /**
- * HTML Purifier's version
- * @type string
- */
- public $version = '4.6.0';
-
- /**
- * Whether or not to automatically finalize
- * the object if a read operation is done.
- * @type bool
- */
- public $autoFinalize = true;
-
- // protected member variables
-
- /**
- * Namespace indexed array of serials for specific namespaces.
- * @see getSerial() for more info.
- * @type string[]
- */
- protected $serials = array();
-
- /**
- * Serial for entire configuration object.
- * @type string
- */
- protected $serial;
-
- /**
- * Parser for variables.
- * @type HTMLPurifier_VarParser_Flexible
- */
- protected $parser = null;
-
- /**
- * Reference HTMLPurifier_ConfigSchema for value checking.
- * @type HTMLPurifier_ConfigSchema
- * @note This is public for introspective purposes. Please don't
- * abuse!
- */
- public $def;
-
- /**
- * Indexed array of definitions.
- * @type HTMLPurifier_Definition[]
- */
- protected $definitions;
-
- /**
- * Whether or not config is finalized.
- * @type bool
- */
- protected $finalized = false;
-
- /**
- * Property list containing configuration directives.
- * @type array
- */
- protected $plist;
-
- /**
- * Whether or not a set is taking place due to an alias lookup.
- * @type bool
- */
- private $aliasMode;
-
- /**
- * Set to false if you do not want line and file numbers in errors.
- * (useful when unit testing). This will also compress some errors
- * and exceptions.
- * @type bool
- */
- public $chatty = true;
-
- /**
- * Current lock; only gets to this namespace are allowed.
- * @type string
- */
- private $lock;
-
- /**
- * Constructor
- * @param HTMLPurifier_ConfigSchema $definition ConfigSchema that defines
- * what directives are allowed.
- * @param HTMLPurifier_PropertyList $parent
- */
- public function __construct($definition, $parent = null)
- {
- $parent = $parent ? $parent : $definition->defaultPlist;
- $this->plist = new HTMLPurifier_PropertyList($parent);
- $this->def = $definition; // keep a copy around for checking
- $this->parser = new HTMLPurifier_VarParser_Flexible();
- }
-
- /**
- * Convenience constructor that creates a config object based on a mixed var
- * @param mixed $config Variable that defines the state of the config
- * object. Can be: a HTMLPurifier_Config() object,
- * an array of directives based on loadArray(),
- * or a string filename of an ini file.
- * @param HTMLPurifier_ConfigSchema $schema Schema object
- * @return HTMLPurifier_Config Configured object
- */
- public static function create($config, $schema = null)
- {
- if ($config instanceof HTMLPurifier_Config) {
- // pass-through
- return $config;
- }
- if (!$schema) {
- $ret = HTMLPurifier_Config::createDefault();
- } else {
- $ret = new HTMLPurifier_Config($schema);
- }
- if (is_string($config)) {
- $ret->loadIni($config);
- } elseif (is_array($config)) $ret->loadArray($config);
- return $ret;
- }
-
- /**
- * Creates a new config object that inherits from a previous one.
- * @param HTMLPurifier_Config $config Configuration object to inherit from.
- * @return HTMLPurifier_Config object with $config as its parent.
- */
- public static function inherit(HTMLPurifier_Config $config)
- {
- return new HTMLPurifier_Config($config->def, $config->plist);
- }
-
- /**
- * Convenience constructor that creates a default configuration object.
- * @return HTMLPurifier_Config default object.
- */
- public static function createDefault()
- {
- $definition = HTMLPurifier_ConfigSchema::instance();
- $config = new HTMLPurifier_Config($definition);
- return $config;
- }
-
- /**
- * Retrieves a value from the configuration.
- *
- * @param string $key String key
- * @param mixed $a
- *
- * @return mixed
- */
- public function get($key, $a = null)
- {
- if ($a !== null) {
- $this->triggerError(
- "Using deprecated API: use \$config->get('$key.$a') instead",
- E_USER_WARNING
- );
- $key = "$key.$a";
- }
- if (!$this->finalized) {
- $this->autoFinalize();
- }
- if (!isset($this->def->info[$key])) {
- // can't add % due to SimpleTest bug
- $this->triggerError(
- 'Cannot retrieve value of undefined directive ' . htmlspecialchars($key),
- E_USER_WARNING
- );
- return;
- }
- if (isset($this->def->info[$key]->isAlias)) {
- $d = $this->def->info[$key];
- $this->triggerError(
- 'Cannot get value from aliased directive, use real name ' . $d->key,
- E_USER_ERROR
- );
- return;
- }
- if ($this->lock) {
- list($ns) = explode('.', $key);
- if ($ns !== $this->lock) {
- $this->triggerError(
- 'Cannot get value of namespace ' . $ns . ' when lock for ' .
- $this->lock .
- ' is active, this probably indicates a Definition setup method ' .
- 'is accessing directives that are not within its namespace',
- E_USER_ERROR
- );
- return;
- }
- }
- return $this->plist->get($key);
- }
-
- /**
- * Retrieves an array of directives to values from a given namespace
- *
- * @param string $namespace String namespace
- *
- * @return array
- */
- public function getBatch($namespace)
- {
- if (!$this->finalized) {
- $this->autoFinalize();
- }
- $full = $this->getAll();
- if (!isset($full[$namespace])) {
- $this->triggerError(
- 'Cannot retrieve undefined namespace ' .
- htmlspecialchars($namespace),
- E_USER_WARNING
- );
- return;
- }
- return $full[$namespace];
- }
-
- /**
- * Returns a SHA-1 signature of a segment of the configuration object
- * that uniquely identifies that particular configuration
- *
- * @param string $namespace Namespace to get serial for
- *
- * @return string
- * @note Revision is handled specially and is removed from the batch
- * before processing!
- */
- public function getBatchSerial($namespace)
- {
- if (empty($this->serials[$namespace])) {
- $batch = $this->getBatch($namespace);
- unset($batch['DefinitionRev']);
- $this->serials[$namespace] = sha1(serialize($batch));
- }
- return $this->serials[$namespace];
- }
-
- /**
- * Returns a SHA-1 signature for the entire configuration object
- * that uniquely identifies that particular configuration
- *
- * @return string
- */
- public function getSerial()
- {
- if (empty($this->serial)) {
- $this->serial = sha1(serialize($this->getAll()));
- }
- return $this->serial;
- }
-
- /**
- * Retrieves all directives, organized by namespace
- *
- * @warning This is a pretty inefficient function, avoid if you can
- */
- public function getAll()
- {
- if (!$this->finalized) {
- $this->autoFinalize();
- }
- $ret = array();
- foreach ($this->plist->squash() as $name => $value) {
- list($ns, $key) = explode('.', $name, 2);
- $ret[$ns][$key] = $value;
- }
- return $ret;
- }
-
- /**
- * Sets a value to configuration.
- *
- * @param string $key key
- * @param mixed $value value
- * @param mixed $a
- */
- public function set($key, $value, $a = null)
- {
- if (strpos($key, '.') === false) {
- $namespace = $key;
- $directive = $value;
- $value = $a;
- $key = "$key.$directive";
- $this->triggerError("Using deprecated API: use \$config->set('$key', ...) instead", E_USER_NOTICE);
- } else {
- list($namespace) = explode('.', $key);
- }
- if ($this->isFinalized('Cannot set directive after finalization')) {
- return;
- }
- if (!isset($this->def->info[$key])) {
- $this->triggerError(
- 'Cannot set undefined directive ' . htmlspecialchars($key) . ' to value',
- E_USER_WARNING
- );
- return;
- }
- $def = $this->def->info[$key];
-
- if (isset($def->isAlias)) {
- if ($this->aliasMode) {
- $this->triggerError(
- 'Double-aliases not allowed, please fix '.
- 'ConfigSchema bug with' . $key,
- E_USER_ERROR
- );
- return;
- }
- $this->aliasMode = true;
- $this->set($def->key, $value);
- $this->aliasMode = false;
- $this->triggerError("$key is an alias, preferred directive name is {$def->key}", E_USER_NOTICE);
- return;
- }
-
- // Raw type might be negative when using the fully optimized form
- // of stdclass, which indicates allow_null == true
- $rtype = is_int($def) ? $def : $def->type;
- if ($rtype < 0) {
- $type = -$rtype;
- $allow_null = true;
- } else {
- $type = $rtype;
- $allow_null = isset($def->allow_null);
- }
-
- try {
- $value = $this->parser->parse($value, $type, $allow_null);
- } catch (HTMLPurifier_VarParserException $e) {
- $this->triggerError(
- 'Value for ' . $key . ' is of invalid type, should be ' .
- HTMLPurifier_VarParser::getTypeName($type),
- E_USER_WARNING
- );
- return;
- }
- if (is_string($value) && is_object($def)) {
- // resolve value alias if defined
- if (isset($def->aliases[$value])) {
- $value = $def->aliases[$value];
- }
- // check to see if the value is allowed
- if (isset($def->allowed) && !isset($def->allowed[$value])) {
- $this->triggerError(
- 'Value not supported, valid values are: ' .
- $this->_listify($def->allowed),
- E_USER_WARNING
- );
- return;
- }
- }
- $this->plist->set($key, $value);
-
- // reset definitions if the directives they depend on changed
- // this is a very costly process, so it's discouraged
- // with finalization
- if ($namespace == 'HTML' || $namespace == 'CSS' || $namespace == 'URI') {
- $this->definitions[$namespace] = null;
- }
-
- $this->serials[$namespace] = false;
- }
-
- /**
- * Convenience function for error reporting
- *
- * @param array $lookup
- *
- * @return string
- */
- private function _listify($lookup)
- {
- $list = array();
- foreach ($lookup as $name => $b) {
- $list[] = $name;
- }
- return implode(', ', $list);
- }
-
- /**
- * Retrieves object reference to the HTML definition.
- *
- * @param bool $raw Return a copy that has not been setup yet. Must be
- * called before it's been setup, otherwise won't work.
- * @param bool $optimized If true, this method may return null, to
- * indicate that a cached version of the modified
- * definition object is available and no further edits
- * are necessary. Consider using
- * maybeGetRawHTMLDefinition, which is more explicitly
- * named, instead.
- *
- * @return HTMLPurifier_HTMLDefinition
- */
- public function getHTMLDefinition($raw = false, $optimized = false)
- {
- return $this->getDefinition('HTML', $raw, $optimized);
- }
-
- /**
- * Retrieves object reference to the CSS definition
- *
- * @param bool $raw Return a copy that has not been setup yet. Must be
- * called before it's been setup, otherwise won't work.
- * @param bool $optimized If true, this method may return null, to
- * indicate that a cached version of the modified
- * definition object is available and no further edits
- * are necessary. Consider using
- * maybeGetRawCSSDefinition, which is more explicitly
- * named, instead.
- *
- * @return HTMLPurifier_CSSDefinition
- */
- public function getCSSDefinition($raw = false, $optimized = false)
- {
- return $this->getDefinition('CSS', $raw, $optimized);
- }
-
- /**
- * Retrieves object reference to the URI definition
- *
- * @param bool $raw Return a copy that has not been setup yet. Must be
- * called before it's been setup, otherwise won't work.
- * @param bool $optimized If true, this method may return null, to
- * indicate that a cached version of the modified
- * definition object is available and no further edits
- * are necessary. Consider using
- * maybeGetRawURIDefinition, which is more explicitly
- * named, instead.
- *
- * @return HTMLPurifier_URIDefinition
- */
- public function getURIDefinition($raw = false, $optimized = false)
- {
- return $this->getDefinition('URI', $raw, $optimized);
- }
-
- /**
- * Retrieves a definition
- *
- * @param string $type Type of definition: HTML, CSS, etc
- * @param bool $raw Whether or not definition should be returned raw
- * @param bool $optimized Only has an effect when $raw is true. Whether
- * or not to return null if the result is already present in
- * the cache. This is off by default for backwards
- * compatibility reasons, but you need to do things this
- * way in order to ensure that caching is done properly.
- * Check out enduser-customize.html for more details.
- * We probably won't ever change this default, as much as the
- * maybe semantics is the "right thing to do."
- *
- * @throws HTMLPurifier_Exception
- * @return HTMLPurifier_Definition
- */
- public function getDefinition($type, $raw = false, $optimized = false)
- {
- if ($optimized && !$raw) {
- throw new HTMLPurifier_Exception("Cannot set optimized = true when raw = false");
- }
- if (!$this->finalized) {
- $this->autoFinalize();
- }
- // temporarily suspend locks, so we can handle recursive definition calls
- $lock = $this->lock;
- $this->lock = null;
- $factory = HTMLPurifier_DefinitionCacheFactory::instance();
- $cache = $factory->create($type, $this);
- $this->lock = $lock;
- if (!$raw) {
- // full definition
- // ---------------
- // check if definition is in memory
- if (!empty($this->definitions[$type])) {
- $def = $this->definitions[$type];
- // check if the definition is setup
- if ($def->setup) {
- return $def;
- } else {
- $def->setup($this);
- if ($def->optimized) {
- $cache->add($def, $this);
- }
- return $def;
- }
- }
- // check if definition is in cache
- $def = $cache->get($this);
- if ($def) {
- // definition in cache, save to memory and return it
- $this->definitions[$type] = $def;
- return $def;
- }
- // initialize it
- $def = $this->initDefinition($type);
- // set it up
- $this->lock = $type;
- $def->setup($this);
- $this->lock = null;
- // save in cache
- $cache->add($def, $this);
- // return it
- return $def;
- } else {
- // raw definition
- // --------------
- // check preconditions
- $def = null;
- if ($optimized) {
- if (is_null($this->get($type . '.DefinitionID'))) {
- // fatally error out if definition ID not set
- throw new HTMLPurifier_Exception(
- "Cannot retrieve raw version without specifying %$type.DefinitionID"
- );
- }
- }
- if (!empty($this->definitions[$type])) {
- $def = $this->definitions[$type];
- if ($def->setup && !$optimized) {
- $extra = $this->chatty ?
- " (try moving this code block earlier in your initialization)" :
- "";
- throw new HTMLPurifier_Exception(
- "Cannot retrieve raw definition after it has already been setup" .
- $extra
- );
- }
- if ($def->optimized === null) {
- $extra = $this->chatty ? " (try flushing your cache)" : "";
- throw new HTMLPurifier_Exception(
- "Optimization status of definition is unknown" . $extra
- );
- }
- if ($def->optimized !== $optimized) {
- $msg = $optimized ? "optimized" : "unoptimized";
- $extra = $this->chatty ?
- " (this backtrace is for the first inconsistent call, which was for a $msg raw definition)"
- : "";
- throw new HTMLPurifier_Exception(
- "Inconsistent use of optimized and unoptimized raw definition retrievals" . $extra
- );
- }
- }
- // check if definition was in memory
- if ($def) {
- if ($def->setup) {
- // invariant: $optimized === true (checked above)
- return null;
- } else {
- return $def;
- }
- }
- // if optimized, check if definition was in cache
- // (because we do the memory check first, this formulation
- // is prone to cache slamming, but I think
- // guaranteeing that either /all/ of the raw
- // setup code or /none/ of it is run is more important.)
- if ($optimized) {
- // This code path only gets run once; once we put
- // something in $definitions (which is guaranteed by the
- // trailing code), we always short-circuit above.
- $def = $cache->get($this);
- if ($def) {
- // save the full definition for later, but don't
- // return it yet
- $this->definitions[$type] = $def;
- return null;
- }
- }
- // check invariants for creation
- if (!$optimized) {
- if (!is_null($this->get($type . '.DefinitionID'))) {
- if ($this->chatty) {
- $this->triggerError(
- 'Due to a documentation error in previous version of HTML Purifier, your ' .
- 'definitions are not being cached. If this is OK, you can remove the ' .
- '%$type.DefinitionRev and %$type.DefinitionID declaration. Otherwise, ' .
- 'modify your code to use maybeGetRawDefinition, and test if the returned ' .
- 'value is null before making any edits (if it is null, that means that a ' .
- 'cached version is available, and no raw operations are necessary). See ' .
- '<a href="http://htmlpurifier.org/docs/enduser-customize.html#optimized">' .
- 'Customize</a> for more details',
- E_USER_WARNING
- );
- } else {
- $this->triggerError(
- "Useless DefinitionID declaration",
- E_USER_WARNING
- );
- }
- }
- }
- // initialize it
- $def = $this->initDefinition($type);
- $def->optimized = $optimized;
- return $def;
- }
- throw new HTMLPurifier_Exception("The impossible happened!");
- }
-
- /**
- * Initialise definition
- *
- * @param string $type What type of definition to create
- *
- * @return HTMLPurifier_CSSDefinition|HTMLPurifier_HTMLDefinition|HTMLPurifier_URIDefinition
- * @throws HTMLPurifier_Exception
- */
- private function initDefinition($type)
- {
- // quick checks failed, let's create the object
- if ($type == 'HTML') {
- $def = new HTMLPurifier_HTMLDefinition();
- } elseif ($type == 'CSS') {
- $def = new HTMLPurifier_CSSDefinition();
- } elseif ($type == 'URI') {
- $def = new HTMLPurifier_URIDefinition();
- } else {
- throw new HTMLPurifier_Exception(
- "Definition of $type type not supported"
- );
- }
- $this->definitions[$type] = $def;
- return $def;
- }
-
- public function maybeGetRawDefinition($name)
- {
- return $this->getDefinition($name, true, true);
- }
-
- public function maybeGetRawHTMLDefinition()
- {
- return $this->getDefinition('HTML', true, true);
- }
-
- public function maybeGetRawCSSDefinition()
- {
- return $this->getDefinition('CSS', true, true);
- }
-
- public function maybeGetRawURIDefinition()
- {
- return $this->getDefinition('URI', true, true);
- }
-
- /**
- * Loads configuration values from an array with the following structure:
- * Namespace.Directive => Value
- *
- * @param array $config_array Configuration associative array
- */
- public function loadArray($config_array)
- {
- if ($this->isFinalized('Cannot load directives after finalization')) {
- return;
- }
- foreach ($config_array as $key => $value) {
- $key = str_replace('_', '.', $key);
- if (strpos($key, '.') !== false) {
- $this->set($key, $value);
- } else {
- $namespace = $key;
- $namespace_values = $value;
- foreach ($namespace_values as $directive => $value2) {
- $this->set($namespace .'.'. $directive, $value2);
- }
- }
- }
- }
-
- /**
- * Returns a list of array(namespace, directive) for all directives
- * that are allowed in a web-form context as per an allowed
- * namespaces/directives list.
- *
- * @param array $allowed List of allowed namespaces/directives
- * @param HTMLPurifier_ConfigSchema $schema Schema to use, if not global copy
- *
- * @return array
- */
- public static function getAllowedDirectivesForForm($allowed, $schema = null)
- {
- if (!$schema) {
- $schema = HTMLPurifier_ConfigSchema::instance();
- }
- if ($allowed !== true) {
- if (is_string($allowed)) {
- $allowed = array($allowed);
- }
- $allowed_ns = array();
- $allowed_directives = array();
- $blacklisted_directives = array();
- foreach ($allowed as $ns_or_directive) {
- if (strpos($ns_or_directive, '.') !== false) {
- // directive
- if ($ns_or_directive[0] == '-') {
- $blacklisted_directives[substr($ns_or_directive, 1)] = true;
- } else {
- $allowed_directives[$ns_or_directive] = true;
- }
- } else {
- // namespace
- $allowed_ns[$ns_or_directive] = true;
- }
- }
- }
- $ret = array();
- foreach ($schema->info as $key => $def) {
- list($ns, $directive) = explode('.', $key, 2);
- if ($allowed !== true) {
- if (isset($blacklisted_directives["$ns.$directive"])) {
- continue;
- }
- if (!isset($allowed_directives["$ns.$directive"]) && !isset($allowed_ns[$ns])) {
- continue;
- }
- }
- if (isset($def->isAlias)) {
- continue;
- }
- if ($directive == 'DefinitionID' || $directive == 'DefinitionRev') {
- continue;
- }
- $ret[] = array($ns, $directive);
- }
- return $ret;
- }
-
- /**
- * Loads configuration values from $_GET/$_POST that were posted
- * via ConfigForm
- *
- * @param array $array $_GET or $_POST array to import
- * @param string|bool $index Index/name that the config variables are in
- * @param array|bool $allowed List of allowed namespaces/directives
- * @param bool $mq_fix Boolean whether or not to enable magic quotes fix
- * @param HTMLPurifier_ConfigSchema $schema Schema to use, if not global copy
- *
- * @return mixed
- */
- public static function loadArrayFromForm($array, $index = false, $allowed = true, $mq_fix = true, $schema = null)
- {
- $ret = HTMLPurifier_Config::prepareArrayFromForm($array, $index, $allowed, $mq_fix, $schema);
- $config = HTMLPurifier_Config::create($ret, $schema);
- return $config;
- }
-
- /**
- * Merges in configuration values from $_GET/$_POST to object. NOT STATIC.
- *
- * @param array $array $_GET or $_POST array to import
- * @param string|bool $index Index/name that the config variables are in
- * @param array|bool $allowed List of allowed namespaces/directives
- * @param bool $mq_fix Boolean whether or not to enable magic quotes fix
- */
- public function mergeArrayFromForm($array, $index = false, $allowed = true, $mq_fix = true)
- {
- $ret = HTMLPurifier_Config::prepareArrayFromForm($array, $index, $allowed, $mq_fix, $this->def);
- $this->loadArray($ret);
- }
-
- /**
- * Prepares an array from a form into something usable for the more
- * strict parts of HTMLPurifier_Config
- *
- * @param array $array $_GET or $_POST array to import
- * @param string|bool $index Index/name that the config variables are in
- * @param array|bool $allowed List of allowed namespaces/directives
- * @param bool $mq_fix Boolean whether or not to enable magic quotes fix
- * @param HTMLPurifier_ConfigSchema $schema Schema to use, if not global copy
- *
- * @return array
- */
- public static function prepareArrayFromForm($array, $index = false, $allowed = true, $mq_fix = true, $schema = null)
- {
- if ($index !== false) {
- $array = (isset($array[$index]) && is_array($array[$index])) ? $array[$index] : array();
- }
- $mq = $mq_fix && function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc();
-
- $allowed = HTMLPurifier_Config::getAllowedDirectivesForForm($allowed, $schema);
- $ret = array();
- foreach ($allowed as $key) {
- list($ns, $directive) = $key;
- $skey = "$ns.$directive";
- if (!empty($array["Null_$skey"])) {
- $ret[$ns][$directive] = null;
- continue;
- }
- if (!isset($array[$skey])) {
- continue;
- }
- $value = $mq ? stripslashes($array[$skey]) : $array[$skey];
- $ret[$ns][$directive] = $value;
- }
- return $ret;
- }
-
- /**
- * Loads configuration values from an ini file
- *
- * @param string $filename Name of ini file
- */
- public function loadIni($filename)
- {
- if ($this->isFinalized('Cannot load directives after finalization')) {
- return;
- }
- $array = parse_ini_file($filename, true);
- $this->loadArray($array);
- }
-
- /**
- * Checks whether or not the configuration object is finalized.
- *
- * @param string|bool $error String error message, or false for no error
- *
- * @return bool
- */
- public function isFinalized($error = false)
- {
- if ($this->finalized && $error) {
- $this->triggerError($error, E_USER_ERROR);
- }
- return $this->finalized;
- }
-
- /**
- * Finalizes configuration only if auto finalize is on and not
- * already finalized
- */
- public function autoFinalize()
- {
- if ($this->autoFinalize) {
- $this->finalize();
- } else {
- $this->plist->squash(true);
- }
- }
-
- /**
- * Finalizes a configuration object, prohibiting further change
- */
- public function finalize()
- {
- $this->finalized = true;
- $this->parser = null;
- }
-
- /**
- * Produces a nicely formatted error message by supplying the
- * stack frame information OUTSIDE of HTMLPurifier_Config.
- *
- * @param string $msg An error message
- * @param int $no An error number
- */
- protected function triggerError($msg, $no)
- {
- // determine previous stack frame
- $extra = '';
- if ($this->chatty) {
- $trace = debug_backtrace();
- // zip(tail(trace), trace) -- but PHP is not Haskell har har
- for ($i = 0, $c = count($trace); $i < $c - 1; $i++) {
- // XXX this is not correct on some versions of HTML Purifier
- if ($trace[$i + 1]['class'] === 'HTMLPurifier_Config') {
- continue;
- }
- $frame = $trace[$i];
- $extra = " invoked on line {$frame['line']} in file {$frame['file']}";
- break;
- }
- }
- trigger_error($msg . $extra, $no);
- }
-
- /**
- * Returns a serialized form of the configuration object that can
- * be reconstituted.
- *
- * @return string
- */
- public function serialize()
- {
- $this->getDefinition('HTML');
- $this->getDefinition('CSS');
- $this->getDefinition('URI');
- return serialize($this);
- }
-
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/ConfigSchema/schema.ser b/library/HTMLPurifier/ConfigSchema/schema.ser
deleted file mode 100644
index 22ea32185..000000000
--- a/library/HTMLPurifier/ConfigSchema/schema.ser
+++ /dev/null
Binary files differ
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPermissions.txt b/library/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPermissions.txt
deleted file mode 100644
index b2b83d9ab..000000000
--- a/library/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPermissions.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-Cache.SerializerPermissions
-TYPE: int
-VERSION: 4.3.0
-DEFAULT: 0755
---DESCRIPTION--
-
-<p>
- Directory permissions of the files and directories created inside
- the DefinitionCache/Serializer or other custom serializer path.
-</p>
---# vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/ConfigSchema/schema/HTML.CustomDoctype.txt b/library/HTMLPurifier/ConfigSchema/schema/HTML.CustomDoctype.txt
deleted file mode 100644
index a64e3d7c3..000000000
--- a/library/HTMLPurifier/ConfigSchema/schema/HTML.CustomDoctype.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-HTML.CustomDoctype
-TYPE: string/null
-VERSION: 2.0.1
-DEFAULT: NULL
---DESCRIPTION--
-
-A custom doctype for power-users who defined there own document
-type. This directive only applies when %HTML.Doctype is blank.
---# vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/ConfigSchema/schema/URI.AllowedSchemes.txt b/library/HTMLPurifier/ConfigSchema/schema/URI.AllowedSchemes.txt
deleted file mode 100644
index 666635a5f..000000000
--- a/library/HTMLPurifier/ConfigSchema/schema/URI.AllowedSchemes.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-URI.AllowedSchemes
-TYPE: lookup
---DEFAULT--
-array (
- 'http' => true,
- 'https' => true,
- 'mailto' => true,
- 'ftp' => true,
- 'nntp' => true,
- 'news' => true,
-)
---DESCRIPTION--
-Whitelist that defines the schemes that a URI is allowed to have. This
-prevents XSS attacks from using pseudo-schemes like javascript or mocha.
-There is also support for the <code>data</code> and <code>file</code>
-URI schemes, but they are not enabled by default.
---# vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/ConfigSchema/schema/URI.DefaultScheme.txt b/library/HTMLPurifier/ConfigSchema/schema/URI.DefaultScheme.txt
deleted file mode 100644
index 728e378cb..000000000
--- a/library/HTMLPurifier/ConfigSchema/schema/URI.DefaultScheme.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-URI.DefaultScheme
-TYPE: string
-DEFAULT: 'http'
---DESCRIPTION--
-
-<p>
- Defines through what scheme the output will be served, in order to
- select the proper object validator when no scheme information is present.
-</p>
---# vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/DefinitionCache.php b/library/HTMLPurifier/DefinitionCache.php
deleted file mode 100644
index 67bb5b1e6..000000000
--- a/library/HTMLPurifier/DefinitionCache.php
+++ /dev/null
@@ -1,129 +0,0 @@
-<?php
-
-/**
- * Abstract class representing Definition cache managers that implements
- * useful common methods and is a factory.
- * @todo Create a separate maintenance file advanced users can use to
- * cache their custom HTMLDefinition, which can be loaded
- * via a configuration directive
- * @todo Implement memcached
- */
-abstract class HTMLPurifier_DefinitionCache
-{
- /**
- * @type string
- */
- public $type;
-
- /**
- * @param string $type Type of definition objects this instance of the
- * cache will handle.
- */
- public function __construct($type)
- {
- $this->type = $type;
- }
-
- /**
- * Generates a unique identifier for a particular configuration
- * @param HTMLPurifier_Config $config Instance of HTMLPurifier_Config
- * @return string
- */
- public function generateKey($config)
- {
- return $config->version . ',' . // possibly replace with function calls
- $config->getBatchSerial($this->type) . ',' .
- $config->get($this->type . '.DefinitionRev');
- }
-
- /**
- * Tests whether or not a key is old with respect to the configuration's
- * version and revision number.
- * @param string $key Key to test
- * @param HTMLPurifier_Config $config Instance of HTMLPurifier_Config to test against
- * @return bool
- */
- public function isOld($key, $config)
- {
- if (substr_count($key, ',') < 2) {
- return true;
- }
- list($version, $hash, $revision) = explode(',', $key, 3);
- $compare = version_compare($version, $config->version);
- // version mismatch, is always old
- if ($compare != 0) {
- return true;
- }
- // versions match, ids match, check revision number
- if ($hash == $config->getBatchSerial($this->type) &&
- $revision < $config->get($this->type . '.DefinitionRev')) {
- return true;
- }
- return false;
- }
-
- /**
- * Checks if a definition's type jives with the cache's type
- * @note Throws an error on failure
- * @param HTMLPurifier_Definition $def Definition object to check
- * @return bool true if good, false if not
- */
- public function checkDefType($def)
- {
- if ($def->type !== $this->type) {
- trigger_error("Cannot use definition of type {$def->type} in cache for {$this->type}");
- return false;
- }
- return true;
- }
-
- /**
- * Adds a definition object to the cache
- * @param HTMLPurifier_Definition $def
- * @param HTMLPurifier_Config $config
- */
- abstract public function add($def, $config);
-
- /**
- * Unconditionally saves a definition object to the cache
- * @param HTMLPurifier_Definition $def
- * @param HTMLPurifier_Config $config
- */
- abstract public function set($def, $config);
-
- /**
- * Replace an object in the cache
- * @param HTMLPurifier_Definition $def
- * @param HTMLPurifier_Config $config
- */
- abstract public function replace($def, $config);
-
- /**
- * Retrieves a definition object from the cache
- * @param HTMLPurifier_Config $config
- */
- abstract public function get($config);
-
- /**
- * Removes a definition object to the cache
- * @param HTMLPurifier_Config $config
- */
- abstract public function remove($config);
-
- /**
- * Clears all objects from cache
- * @param HTMLPurifier_Config $config
- */
- abstract public function flush($config);
-
- /**
- * Clears all expired (older version or revision) objects from cache
- * @note Be carefuly implementing this method as flush. Flush must
- * not interfere with other Definition types, and cleanup()
- * should not be repeatedly called by userland code.
- * @param HTMLPurifier_Config $config
- */
- abstract public function cleanup($config);
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/DefinitionCache/Serializer.php b/library/HTMLPurifier/DefinitionCache/Serializer.php
deleted file mode 100644
index ecacb88fe..000000000
--- a/library/HTMLPurifier/DefinitionCache/Serializer.php
+++ /dev/null
@@ -1,285 +0,0 @@
-<?php
-
-class HTMLPurifier_DefinitionCache_Serializer extends HTMLPurifier_DefinitionCache
-{
-
- /**
- * @param HTMLPurifier_Definition $def
- * @param HTMLPurifier_Config $config
- * @return int|bool
- */
- public function add($def, $config)
- {
- if (!$this->checkDefType($def)) {
- return;
- }
- $file = $this->generateFilePath($config);
- if (file_exists($file)) {
- return false;
- }
- if (!$this->_prepareDir($config)) {
- return false;
- }
- return $this->_write($file, serialize($def), $config);
- }
-
- /**
- * @param HTMLPurifier_Definition $def
- * @param HTMLPurifier_Config $config
- * @return int|bool
- */
- public function set($def, $config)
- {
- if (!$this->checkDefType($def)) {
- return;
- }
- $file = $this->generateFilePath($config);
- if (!$this->_prepareDir($config)) {
- return false;
- }
- return $this->_write($file, serialize($def), $config);
- }
-
- /**
- * @param HTMLPurifier_Definition $def
- * @param HTMLPurifier_Config $config
- * @return int|bool
- */
- public function replace($def, $config)
- {
- if (!$this->checkDefType($def)) {
- return;
- }
- $file = $this->generateFilePath($config);
- if (!file_exists($file)) {
- return false;
- }
- if (!$this->_prepareDir($config)) {
- return false;
- }
- return $this->_write($file, serialize($def), $config);
- }
-
- /**
- * @param HTMLPurifier_Config $config
- * @return bool|HTMLPurifier_Config
- */
- public function get($config)
- {
- $file = $this->generateFilePath($config);
- if (!file_exists($file)) {
- return false;
- }
- return unserialize(file_get_contents($file));
- }
-
- /**
- * @param HTMLPurifier_Config $config
- * @return bool
- */
- public function remove($config)
- {
- $file = $this->generateFilePath($config);
- if (!file_exists($file)) {
- return false;
- }
- return unlink($file);
- }
-
- /**
- * @param HTMLPurifier_Config $config
- * @return bool
- */
- public function flush($config)
- {
- if (!$this->_prepareDir($config)) {
- return false;
- }
- $dir = $this->generateDirectoryPath($config);
- $dh = opendir($dir);
- while (false !== ($filename = readdir($dh))) {
- if (empty($filename)) {
- continue;
- }
- if ($filename[0] === '.') {
- continue;
- }
- unlink($dir . '/' . $filename);
- }
- }
-
- /**
- * @param HTMLPurifier_Config $config
- * @return bool
- */
- public function cleanup($config)
- {
- if (!$this->_prepareDir($config)) {
- return false;
- }
- $dir = $this->generateDirectoryPath($config);
- $dh = opendir($dir);
- while (false !== ($filename = readdir($dh))) {
- if (empty($filename)) {
- continue;
- }
- if ($filename[0] === '.') {
- continue;
- }
- $key = substr($filename, 0, strlen($filename) - 4);
- if ($this->isOld($key, $config)) {
- unlink($dir . '/' . $filename);
- }
- }
- }
-
- /**
- * Generates the file path to the serial file corresponding to
- * the configuration and definition name
- * @param HTMLPurifier_Config $config
- * @return string
- * @todo Make protected
- */
- public function generateFilePath($config)
- {
- $key = $this->generateKey($config);
- return $this->generateDirectoryPath($config) . '/' . $key . '.ser';
- }
-
- /**
- * Generates the path to the directory contain this cache's serial files
- * @param HTMLPurifier_Config $config
- * @return string
- * @note No trailing slash
- * @todo Make protected
- */
- public function generateDirectoryPath($config)
- {
- $base = $this->generateBaseDirectoryPath($config);
- return $base . '/' . $this->type;
- }
-
- /**
- * Generates path to base directory that contains all definition type
- * serials
- * @param HTMLPurifier_Config $config
- * @return mixed|string
- * @todo Make protected
- */
- public function generateBaseDirectoryPath($config)
- {
- $base = $config->get('Cache.SerializerPath');
- $base = is_null($base) ? HTMLPURIFIER_PREFIX . '/HTMLPurifier/DefinitionCache/Serializer' : $base;
- return $base;
- }
-
- /**
- * Convenience wrapper function for file_put_contents
- * @param string $file File name to write to
- * @param string $data Data to write into file
- * @param HTMLPurifier_Config $config
- * @return int|bool Number of bytes written if success, or false if failure.
- */
- private function _write($file, $data, $config)
- {
- $result = file_put_contents($file, $data);
- if ($result !== false) {
- // set permissions of the new file (no execute)
- $chmod = $config->get('Cache.SerializerPermissions');
- if (!$chmod) {
- $chmod = 0644; // invalid config or simpletest
- }
- $chmod = $chmod & 0666;
- chmod($file, $chmod);
- }
- return $result;
- }
-
- /**
- * Prepares the directory that this type stores the serials in
- * @param HTMLPurifier_Config $config
- * @return bool True if successful
- */
- private function _prepareDir($config)
- {
- $directory = $this->generateDirectoryPath($config);
- $chmod = $config->get('Cache.SerializerPermissions');
- if (!$chmod) {
- $chmod = 0755; // invalid config or simpletest
- }
- if (!is_dir($directory)) {
- $base = $this->generateBaseDirectoryPath($config);
- if (!is_dir($base)) {
- trigger_error(
- 'Base directory ' . $base . ' does not exist,
- please create or change using %Cache.SerializerPath',
- E_USER_WARNING
- );
- return false;
- } elseif (!$this->_testPermissions($base, $chmod)) {
- return false;
- }
- $old = umask(0000);
- mkdir($directory, $chmod);
- umask($old);
- } elseif (!$this->_testPermissions($directory, $chmod)) {
- return false;
- }
- return true;
- }
-
- /**
- * Tests permissions on a directory and throws out friendly
- * error messages and attempts to chmod it itself if possible
- * @param string $dir Directory path
- * @param int $chmod Permissions
- * @return bool True if directory is writable
- */
- private function _testPermissions($dir, $chmod)
- {
- // early abort, if it is writable, everything is hunky-dory
- if (is_writable($dir)) {
- return true;
- }
- if (!is_dir($dir)) {
- // generally, you'll want to handle this beforehand
- // so a more specific error message can be given
- trigger_error(
- 'Directory ' . $dir . ' does not exist',
- E_USER_WARNING
- );
- return false;
- }
- if (function_exists('posix_getuid')) {
- // POSIX system, we can give more specific advice
- if (fileowner($dir) === posix_getuid()) {
- // we can chmod it ourselves
- $chmod = $chmod | 0700;
- if (chmod($dir, $chmod)) {
- return true;
- }
- } elseif (filegroup($dir) === posix_getgid()) {
- $chmod = $chmod | 0070;
- } else {
- // PHP's probably running as nobody, so we'll
- // need to give global permissions
- $chmod = $chmod | 0777;
- }
- trigger_error(
- 'Directory ' . $dir . ' not writable, ' .
- 'please chmod to ' . decoct($chmod),
- E_USER_WARNING
- );
- } else {
- // generic error message
- trigger_error(
- 'Directory ' . $dir . ' not writable, ' .
- 'please alter file permissions',
- E_USER_WARNING
- );
- }
- return false;
- }
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/Encoder.php b/library/HTMLPurifier/Encoder.php
deleted file mode 100644
index fef9b5890..000000000
--- a/library/HTMLPurifier/Encoder.php
+++ /dev/null
@@ -1,611 +0,0 @@
-<?php
-
-/**
- * A UTF-8 specific character encoder that handles cleaning and transforming.
- * @note All functions in this class should be static.
- */
-class HTMLPurifier_Encoder
-{
-
- /**
- * Constructor throws fatal error if you attempt to instantiate class
- */
- private function __construct()
- {
- trigger_error('Cannot instantiate encoder, call methods statically', E_USER_ERROR);
- }
-
- /**
- * Error-handler that mutes errors, alternative to shut-up operator.
- */
- public static function muteErrorHandler()
- {
- }
-
- /**
- * iconv wrapper which mutes errors, but doesn't work around bugs.
- * @param string $in Input encoding
- * @param string $out Output encoding
- * @param string $text The text to convert
- * @return string
- */
- public static function unsafeIconv($in, $out, $text)
- {
- set_error_handler(array('HTMLPurifier_Encoder', 'muteErrorHandler'));
- $r = iconv($in, $out, $text);
- restore_error_handler();
- return $r;
- }
-
- /**
- * iconv wrapper which mutes errors and works around bugs.
- * @param string $in Input encoding
- * @param string $out Output encoding
- * @param string $text The text to convert
- * @param int $max_chunk_size
- * @return string
- */
- public static function iconv($in, $out, $text, $max_chunk_size = 8000)
- {
- $code = self::testIconvTruncateBug();
- if ($code == self::ICONV_OK) {
- return self::unsafeIconv($in, $out, $text);
- } elseif ($code == self::ICONV_TRUNCATES) {
- // we can only work around this if the input character set
- // is utf-8
- if ($in == 'utf-8') {
- if ($max_chunk_size < 4) {
- trigger_error('max_chunk_size is too small', E_USER_WARNING);
- return false;
- }
- // split into 8000 byte chunks, but be careful to handle
- // multibyte boundaries properly
- if (($c = strlen($text)) <= $max_chunk_size) {
- return self::unsafeIconv($in, $out, $text);
- }
- $r = '';
- $i = 0;
- while (true) {
- if ($i + $max_chunk_size >= $c) {
- $r .= self::unsafeIconv($in, $out, substr($text, $i));
- break;
- }
- // wibble the boundary
- if (0x80 != (0xC0 & ord($text[$i + $max_chunk_size]))) {
- $chunk_size = $max_chunk_size;
- } elseif (0x80 != (0xC0 & ord($text[$i + $max_chunk_size - 1]))) {
- $chunk_size = $max_chunk_size - 1;
- } elseif (0x80 != (0xC0 & ord($text[$i + $max_chunk_size - 2]))) {
- $chunk_size = $max_chunk_size - 2;
- } elseif (0x80 != (0xC0 & ord($text[$i + $max_chunk_size - 3]))) {
- $chunk_size = $max_chunk_size - 3;
- } else {
- return false; // rather confusing UTF-8...
- }
- $chunk = substr($text, $i, $chunk_size); // substr doesn't mind overlong lengths
- $r .= self::unsafeIconv($in, $out, $chunk);
- $i += $chunk_size;
- }
- return $r;
- } else {
- return false;
- }
- } else {
- return false;
- }
- }
-
- /**
- * Cleans a UTF-8 string for well-formedness and SGML validity
- *
- * It will parse according to UTF-8 and return a valid UTF8 string, with
- * non-SGML codepoints excluded.
- *
- * @param string $str The string to clean
- * @param bool $force_php
- * @return string
- *
- * @note Just for reference, the non-SGML code points are 0 to 31 and
- * 127 to 159, inclusive. However, we allow code points 9, 10
- * and 13, which are the tab, line feed and carriage return
- * respectively. 128 and above the code points map to multibyte
- * UTF-8 representations.
- *
- * @note Fallback code adapted from utf8ToUnicode by Henri Sivonen and
- * hsivonen@iki.fi at <http://iki.fi/hsivonen/php-utf8/> under the
- * LGPL license. Notes on what changed are inside, but in general,
- * the original code transformed UTF-8 text into an array of integer
- * Unicode codepoints. Understandably, transforming that back to
- * a string would be somewhat expensive, so the function was modded to
- * directly operate on the string. However, this discourages code
- * reuse, and the logic enumerated here would be useful for any
- * function that needs to be able to understand UTF-8 characters.
- * As of right now, only smart lossless character encoding converters
- * would need that, and I'm probably not going to implement them.
- * Once again, PHP 6 should solve all our problems.
- */
- public static function cleanUTF8($str, $force_php = false)
- {
- // UTF-8 validity is checked since PHP 4.3.5
- // This is an optimization: if the string is already valid UTF-8, no
- // need to do PHP stuff. 99% of the time, this will be the case.
- // The regexp matches the XML char production, as well as well as excluding
- // non-SGML codepoints U+007F to U+009F
- if (preg_match(
- '/^[\x{9}\x{A}\x{D}\x{20}-\x{7E}\x{A0}-\x{D7FF}\x{E000}-\x{FFFD}\x{10000}-\x{10FFFF}]*$/Du',
- $str
- )) {
- return $str;
- }
-
- $mState = 0; // cached expected number of octets after the current octet
- // until the beginning of the next UTF8 character sequence
- $mUcs4 = 0; // cached Unicode character
- $mBytes = 1; // cached expected number of octets in the current sequence
-
- // original code involved an $out that was an array of Unicode
- // codepoints. Instead of having to convert back into UTF-8, we've
- // decided to directly append valid UTF-8 characters onto a string
- // $out once they're done. $char accumulates raw bytes, while $mUcs4
- // turns into the Unicode code point, so there's some redundancy.
-
- $out = '';
- $char = '';
-
- $len = strlen($str);
- for ($i = 0; $i < $len; $i++) {
- $in = ord($str{$i});
- $char .= $str[$i]; // append byte to char
- if (0 == $mState) {
- // When mState is zero we expect either a US-ASCII character
- // or a multi-octet sequence.
- if (0 == (0x80 & ($in))) {
- // US-ASCII, pass straight through.
- if (($in <= 31 || $in == 127) &&
- !($in == 9 || $in == 13 || $in == 10) // save \r\t\n
- ) {
- // control characters, remove
- } else {
- $out .= $char;
- }
- // reset
- $char = '';
- $mBytes = 1;
- } elseif (0xC0 == (0xE0 & ($in))) {
- // First octet of 2 octet sequence
- $mUcs4 = ($in);
- $mUcs4 = ($mUcs4 & 0x1F) << 6;
- $mState = 1;
- $mBytes = 2;
- } elseif (0xE0 == (0xF0 & ($in))) {
- // First octet of 3 octet sequence
- $mUcs4 = ($in);
- $mUcs4 = ($mUcs4 & 0x0F) << 12;
- $mState = 2;
- $mBytes = 3;
- } elseif (0xF0 == (0xF8 & ($in))) {
- // First octet of 4 octet sequence
- $mUcs4 = ($in);
- $mUcs4 = ($mUcs4 & 0x07) << 18;
- $mState = 3;
- $mBytes = 4;
- } elseif (0xF8 == (0xFC & ($in))) {
- // First octet of 5 octet sequence.
- //
- // This is illegal because the encoded codepoint must be
- // either:
- // (a) not the shortest form or
- // (b) outside the Unicode range of 0-0x10FFFF.
- // Rather than trying to resynchronize, we will carry on
- // until the end of the sequence and let the later error
- // handling code catch it.
- $mUcs4 = ($in);
- $mUcs4 = ($mUcs4 & 0x03) << 24;
- $mState = 4;
- $mBytes = 5;
- } elseif (0xFC == (0xFE & ($in))) {
- // First octet of 6 octet sequence, see comments for 5
- // octet sequence.
- $mUcs4 = ($in);
- $mUcs4 = ($mUcs4 & 1) << 30;
- $mState = 5;
- $mBytes = 6;
- } else {
- // Current octet is neither in the US-ASCII range nor a
- // legal first octet of a multi-octet sequence.
- $mState = 0;
- $mUcs4 = 0;
- $mBytes = 1;
- $char = '';
- }
- } else {
- // When mState is non-zero, we expect a continuation of the
- // multi-octet sequence
- if (0x80 == (0xC0 & ($in))) {
- // Legal continuation.
- $shift = ($mState - 1) * 6;
- $tmp = $in;
- $tmp = ($tmp & 0x0000003F) << $shift;
- $mUcs4 |= $tmp;
-
- if (0 == --$mState) {
- // End of the multi-octet sequence. mUcs4 now contains
- // the final Unicode codepoint to be output
-
- // Check for illegal sequences and codepoints.
-
- // From Unicode 3.1, non-shortest form is illegal
- if (((2 == $mBytes) && ($mUcs4 < 0x0080)) ||
- ((3 == $mBytes) && ($mUcs4 < 0x0800)) ||
- ((4 == $mBytes) && ($mUcs4 < 0x10000)) ||
- (4 < $mBytes) ||
- // From Unicode 3.2, surrogate characters = illegal
- (($mUcs4 & 0xFFFFF800) == 0xD800) ||
- // Codepoints outside the Unicode range are illegal
- ($mUcs4 > 0x10FFFF)
- ) {
-
- } elseif (0xFEFF != $mUcs4 && // omit BOM
- // check for valid Char unicode codepoints
- (
- 0x9 == $mUcs4 ||
- 0xA == $mUcs4 ||
- 0xD == $mUcs4 ||
- (0x20 <= $mUcs4 && 0x7E >= $mUcs4) ||
- // 7F-9F is not strictly prohibited by XML,
- // but it is non-SGML, and thus we don't allow it
- (0xA0 <= $mUcs4 && 0xD7FF >= $mUcs4) ||
- (0x10000 <= $mUcs4 && 0x10FFFF >= $mUcs4)
- )
- ) {
- $out .= $char;
- }
- // initialize UTF8 cache (reset)
- $mState = 0;
- $mUcs4 = 0;
- $mBytes = 1;
- $char = '';
- }
- } else {
- // ((0xC0 & (*in) != 0x80) && (mState != 0))
- // Incomplete multi-octet sequence.
- // used to result in complete fail, but we'll reset
- $mState = 0;
- $mUcs4 = 0;
- $mBytes = 1;
- $char ='';
- }
- }
- }
- return $out;
- }
-
- /**
- * Translates a Unicode codepoint into its corresponding UTF-8 character.
- * @note Based on Feyd's function at
- * <http://forums.devnetwork.net/viewtopic.php?p=191404#191404>,
- * which is in public domain.
- * @note While we're going to do code point parsing anyway, a good
- * optimization would be to refuse to translate code points that
- * are non-SGML characters. However, this could lead to duplication.
- * @note This is very similar to the unichr function in
- * maintenance/generate-entity-file.php (although this is superior,
- * due to its sanity checks).
- */
-
- // +----------+----------+----------+----------+
- // | 33222222 | 22221111 | 111111 | |
- // | 10987654 | 32109876 | 54321098 | 76543210 | bit
- // +----------+----------+----------+----------+
- // | | | | 0xxxxxxx | 1 byte 0x00000000..0x0000007F
- // | | | 110yyyyy | 10xxxxxx | 2 byte 0x00000080..0x000007FF
- // | | 1110zzzz | 10yyyyyy | 10xxxxxx | 3 byte 0x00000800..0x0000FFFF
- // | 11110www | 10wwzzzz | 10yyyyyy | 10xxxxxx | 4 byte 0x00010000..0x0010FFFF
- // +----------+----------+----------+----------+
- // | 00000000 | 00011111 | 11111111 | 11111111 | Theoretical upper limit of legal scalars: 2097151 (0x001FFFFF)
- // | 00000000 | 00010000 | 11111111 | 11111111 | Defined upper limit of legal scalar codes
- // +----------+----------+----------+----------+
-
- public static function unichr($code)
- {
- if ($code > 1114111 or $code < 0 or
- ($code >= 55296 and $code <= 57343) ) {
- // bits are set outside the "valid" range as defined
- // by UNICODE 4.1.0
- return '';
- }
-
- $x = $y = $z = $w = 0;
- if ($code < 128) {
- // regular ASCII character
- $x = $code;
- } else {
- // set up bits for UTF-8
- $x = ($code & 63) | 128;
- if ($code < 2048) {
- $y = (($code & 2047) >> 6) | 192;
- } else {
- $y = (($code & 4032) >> 6) | 128;
- if ($code < 65536) {
- $z = (($code >> 12) & 15) | 224;
- } else {
- $z = (($code >> 12) & 63) | 128;
- $w = (($code >> 18) & 7) | 240;
- }
- }
- }
- // set up the actual character
- $ret = '';
- if ($w) {
- $ret .= chr($w);
- }
- if ($z) {
- $ret .= chr($z);
- }
- if ($y) {
- $ret .= chr($y);
- }
- $ret .= chr($x);
-
- return $ret;
- }
-
- /**
- * @return bool
- */
- public static function iconvAvailable()
- {
- static $iconv = null;
- if ($iconv === null) {
- $iconv = function_exists('iconv') && self::testIconvTruncateBug() != self::ICONV_UNUSABLE;
- }
- return $iconv;
- }
-
- /**
- * Convert a string to UTF-8 based on configuration.
- * @param string $str The string to convert
- * @param HTMLPurifier_Config $config
- * @param HTMLPurifier_Context $context
- * @return string
- */
- public static function convertToUTF8($str, $config, $context)
- {
- $encoding = $config->get('Core.Encoding');
- if ($encoding === 'utf-8') {
- return $str;
- }
- static $iconv = null;
- if ($iconv === null) {
- $iconv = self::iconvAvailable();
- }
- if ($iconv && !$config->get('Test.ForceNoIconv')) {
- // unaffected by bugs, since UTF-8 support all characters
- $str = self::unsafeIconv($encoding, 'utf-8//IGNORE', $str);
- if ($str === false) {
- // $encoding is not a valid encoding
- trigger_error('Invalid encoding ' . $encoding, E_USER_ERROR);
- return '';
- }
- // If the string is bjorked by Shift_JIS or a similar encoding
- // that doesn't support all of ASCII, convert the naughty
- // characters to their true byte-wise ASCII/UTF-8 equivalents.
- $str = strtr($str, self::testEncodingSupportsASCII($encoding));
- return $str;
- } elseif ($encoding === 'iso-8859-1') {
- $str = utf8_encode($str);
- return $str;
- }
- $bug = HTMLPurifier_Encoder::testIconvTruncateBug();
- if ($bug == self::ICONV_OK) {
- trigger_error('Encoding not supported, please install iconv', E_USER_ERROR);
- } else {
- trigger_error(
- 'You have a buggy version of iconv, see https://bugs.php.net/bug.php?id=48147 ' .
- 'and http://sourceware.org/bugzilla/show_bug.cgi?id=13541',
- E_USER_ERROR
- );
- }
- }
-
- /**
- * Converts a string from UTF-8 based on configuration.
- * @param string $str The string to convert
- * @param HTMLPurifier_Config $config
- * @param HTMLPurifier_Context $context
- * @return string
- * @note Currently, this is a lossy conversion, with unexpressable
- * characters being omitted.
- */
- public static function convertFromUTF8($str, $config, $context)
- {
- $encoding = $config->get('Core.Encoding');
- if ($escape = $config->get('Core.EscapeNonASCIICharacters')) {
- $str = self::convertToASCIIDumbLossless($str);
- }
- if ($encoding === 'utf-8') {
- return $str;
- }
- static $iconv = null;
- if ($iconv === null) {
- $iconv = self::iconvAvailable();
- }
- if ($iconv && !$config->get('Test.ForceNoIconv')) {
- // Undo our previous fix in convertToUTF8, otherwise iconv will barf
- $ascii_fix = self::testEncodingSupportsASCII($encoding);
- if (!$escape && !empty($ascii_fix)) {
- $clear_fix = array();
- foreach ($ascii_fix as $utf8 => $native) {
- $clear_fix[$utf8] = '';
- }
- $str = strtr($str, $clear_fix);
- }
- $str = strtr($str, array_flip($ascii_fix));
- // Normal stuff
- $str = self::iconv('utf-8', $encoding . '//IGNORE', $str);
- return $str;
- } elseif ($encoding === 'iso-8859-1') {
- $str = utf8_decode($str);
- return $str;
- }
- trigger_error('Encoding not supported', E_USER_ERROR);
- // You might be tempted to assume that the ASCII representation
- // might be OK, however, this is *not* universally true over all
- // encodings. So we take the conservative route here, rather
- // than forcibly turn on %Core.EscapeNonASCIICharacters
- }
-
- /**
- * Lossless (character-wise) conversion of HTML to ASCII
- * @param string $str UTF-8 string to be converted to ASCII
- * @return string ASCII encoded string with non-ASCII character entity-ized
- * @warning Adapted from MediaWiki, claiming fair use: this is a common
- * algorithm. If you disagree with this license fudgery,
- * implement it yourself.
- * @note Uses decimal numeric entities since they are best supported.
- * @note This is a DUMB function: it has no concept of keeping
- * character entities that the projected character encoding
- * can allow. We could possibly implement a smart version
- * but that would require it to also know which Unicode
- * codepoints the charset supported (not an easy task).
- * @note Sort of with cleanUTF8() but it assumes that $str is
- * well-formed UTF-8
- */
- public static function convertToASCIIDumbLossless($str)
- {
- $bytesleft = 0;
- $result = '';
- $working = 0;
- $len = strlen($str);
- for ($i = 0; $i < $len; $i++) {
- $bytevalue = ord($str[$i]);
- if ($bytevalue <= 0x7F) { //0xxx xxxx
- $result .= chr($bytevalue);
- $bytesleft = 0;
- } elseif ($bytevalue <= 0xBF) { //10xx xxxx
- $working = $working << 6;
- $working += ($bytevalue & 0x3F);
- $bytesleft--;
- if ($bytesleft <= 0) {
- $result .= "&#" . $working . ";";
- }
- } elseif ($bytevalue <= 0xDF) { //110x xxxx
- $working = $bytevalue & 0x1F;
- $bytesleft = 1;
- } elseif ($bytevalue <= 0xEF) { //1110 xxxx
- $working = $bytevalue & 0x0F;
- $bytesleft = 2;
- } else { //1111 0xxx
- $working = $bytevalue & 0x07;
- $bytesleft = 3;
- }
- }
- return $result;
- }
-
- /** No bugs detected in iconv. */
- const ICONV_OK = 0;
-
- /** Iconv truncates output if converting from UTF-8 to another
- * character set with //IGNORE, and a non-encodable character is found */
- const ICONV_TRUNCATES = 1;
-
- /** Iconv does not support //IGNORE, making it unusable for
- * transcoding purposes */
- const ICONV_UNUSABLE = 2;
-
- /**
- * glibc iconv has a known bug where it doesn't handle the magic
- * //IGNORE stanza correctly. In particular, rather than ignore
- * characters, it will return an EILSEQ after consuming some number
- * of characters, and expect you to restart iconv as if it were
- * an E2BIG. Old versions of PHP did not respect the errno, and
- * returned the fragment, so as a result you would see iconv
- * mysteriously truncating output. We can work around this by
- * manually chopping our input into segments of about 8000
- * characters, as long as PHP ignores the error code. If PHP starts
- * paying attention to the error code, iconv becomes unusable.
- *
- * @return int Error code indicating severity of bug.
- */
- public static function testIconvTruncateBug()
- {
- static $code = null;
- if ($code === null) {
- // better not use iconv, otherwise infinite loop!
- $r = self::unsafeIconv('utf-8', 'ascii//IGNORE', "\xCE\xB1" . str_repeat('a', 9000));
- if ($r === false) {
- $code = self::ICONV_UNUSABLE;
- } elseif (($c = strlen($r)) < 9000) {
- $code = self::ICONV_TRUNCATES;
- } elseif ($c > 9000) {
- trigger_error(
- 'Your copy of iconv is extremely buggy. Please notify HTML Purifier maintainers: ' .
- 'include your iconv version as per phpversion()',
- E_USER_ERROR
- );
- } else {
- $code = self::ICONV_OK;
- }
- }
- return $code;
- }
-
- /**
- * This expensive function tests whether or not a given character
- * encoding supports ASCII. 7/8-bit encodings like Shift_JIS will
- * fail this test, and require special processing. Variable width
- * encodings shouldn't ever fail.
- *
- * @param string $encoding Encoding name to test, as per iconv format
- * @param bool $bypass Whether or not to bypass the precompiled arrays.
- * @return Array of UTF-8 characters to their corresponding ASCII,
- * which can be used to "undo" any overzealous iconv action.
- */
- public static function testEncodingSupportsASCII($encoding, $bypass = false)
- {
- // All calls to iconv here are unsafe, proof by case analysis:
- // If ICONV_OK, no difference.
- // If ICONV_TRUNCATE, all calls involve one character inputs,
- // so bug is not triggered.
- // If ICONV_UNUSABLE, this call is irrelevant
- static $encodings = array();
- if (!$bypass) {
- if (isset($encodings[$encoding])) {
- return $encodings[$encoding];
- }
- $lenc = strtolower($encoding);
- switch ($lenc) {
- case 'shift_jis':
- return array("\xC2\xA5" => '\\', "\xE2\x80\xBE" => '~');
- case 'johab':
- return array("\xE2\x82\xA9" => '\\');
- }
- if (strpos($lenc, 'iso-8859-') === 0) {
- return array();
- }
- }
- $ret = array();
- if (self::unsafeIconv('UTF-8', $encoding, 'a') === false) {
- return false;
- }
- for ($i = 0x20; $i <= 0x7E; $i++) { // all printable ASCII chars
- $c = chr($i); // UTF-8 char
- $r = self::unsafeIconv('UTF-8', "$encoding//IGNORE", $c); // initial conversion
- if ($r === '' ||
- // This line is needed for iconv implementations that do not
- // omit characters that do not exist in the target character set
- ($r === $c && self::unsafeIconv($encoding, 'UTF-8//IGNORE', $r) !== $c)
- ) {
- // Reverse engineer: what's the UTF-8 equiv of this byte
- // sequence? This assumes that there's no variable width
- // encoding that doesn't support ASCII.
- $ret[self::unsafeIconv($encoding, 'UTF-8//IGNORE', $c)] = $c;
- }
- }
- $encodings[$encoding] = $ret;
- return $ret;
- }
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/EntityParser.php b/library/HTMLPurifier/EntityParser.php
deleted file mode 100644
index 61529dcd9..000000000
--- a/library/HTMLPurifier/EntityParser.php
+++ /dev/null
@@ -1,153 +0,0 @@
-<?php
-
-// if want to implement error collecting here, we'll need to use some sort
-// of global data (probably trigger_error) because it's impossible to pass
-// $config or $context to the callback functions.
-
-/**
- * Handles referencing and derefencing character entities
- */
-class HTMLPurifier_EntityParser
-{
-
- /**
- * Reference to entity lookup table.
- * @type HTMLPurifier_EntityLookup
- */
- protected $_entity_lookup;
-
- /**
- * Callback regex string for parsing entities.
- * @type string
- */
- protected $_substituteEntitiesRegex =
- '/&(?:[#]x([a-fA-F0-9]+)|[#]0*(\d+)|([A-Za-z_:][A-Za-z0-9.\-_:]*));?/';
- // 1. hex 2. dec 3. string (XML style)
-
- /**
- * Decimal to parsed string conversion table for special entities.
- * @type array
- */
- protected $_special_dec2str =
- array(
- 34 => '"',
- 38 => '&',
- 39 => "'",
- 60 => '<',
- 62 => '>'
- );
-
- /**
- * Stripped entity names to decimal conversion table for special entities.
- * @type array
- */
- protected $_special_ent2dec =
- array(
- 'quot' => 34,
- 'amp' => 38,
- 'lt' => 60,
- 'gt' => 62
- );
-
- /**
- * Substitutes non-special entities with their parsed equivalents. Since
- * running this whenever you have parsed character is t3h 5uck, we run
- * it before everything else.
- *
- * @param string $string String to have non-special entities parsed.
- * @return string Parsed string.
- */
- public function substituteNonSpecialEntities($string)
- {
- // it will try to detect missing semicolons, but don't rely on it
- return preg_replace_callback(
- $this->_substituteEntitiesRegex,
- array($this, 'nonSpecialEntityCallback'),
- $string
- );
- }
-
- /**
- * Callback function for substituteNonSpecialEntities() that does the work.
- *
- * @param array $matches PCRE matches array, with 0 the entire match, and
- * either index 1, 2 or 3 set with a hex value, dec value,
- * or string (respectively).
- * @return string Replacement string.
- */
-
- protected function nonSpecialEntityCallback($matches)
- {
- // replaces all but big five
- $entity = $matches[0];
- $is_num = (@$matches[0][1] === '#');
- if ($is_num) {
- $is_hex = (@$entity[2] === 'x');
- $code = $is_hex ? hexdec($matches[1]) : (int) $matches[2];
- // abort for special characters
- if (isset($this->_special_dec2str[$code])) {
- return $entity;
- }
- return HTMLPurifier_Encoder::unichr($code);
- } else {
- if (isset($this->_special_ent2dec[$matches[3]])) {
- return $entity;
- }
- if (!$this->_entity_lookup) {
- $this->_entity_lookup = HTMLPurifier_EntityLookup::instance();
- }
- if (isset($this->_entity_lookup->table[$matches[3]])) {
- return $this->_entity_lookup->table[$matches[3]];
- } else {
- return $entity;
- }
- }
- }
-
- /**
- * Substitutes only special entities with their parsed equivalents.
- *
- * @notice We try to avoid calling this function because otherwise, it
- * would have to be called a lot (for every parsed section).
- *
- * @param string $string String to have non-special entities parsed.
- * @return string Parsed string.
- */
- public function substituteSpecialEntities($string)
- {
- return preg_replace_callback(
- $this->_substituteEntitiesRegex,
- array($this, 'specialEntityCallback'),
- $string
- );
- }
-
- /**
- * Callback function for substituteSpecialEntities() that does the work.
- *
- * This callback has same syntax as nonSpecialEntityCallback().
- *
- * @param array $matches PCRE-style matches array, with 0 the entire match, and
- * either index 1, 2 or 3 set with a hex value, dec value,
- * or string (respectively).
- * @return string Replacement string.
- */
- protected function specialEntityCallback($matches)
- {
- $entity = $matches[0];
- $is_num = (@$matches[0][1] === '#');
- if ($is_num) {
- $is_hex = (@$entity[2] === 'x');
- $int = $is_hex ? hexdec($matches[1]) : (int) $matches[2];
- return isset($this->_special_dec2str[$int]) ?
- $this->_special_dec2str[$int] :
- $entity;
- } else {
- return isset($this->_special_ent2dec[$matches[3]]) ?
- $this->_special_ent2dec[$matches[3]] :
- $entity;
- }
- }
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/Filter/ExtractStyleBlocks.php b/library/HTMLPurifier/Filter/ExtractStyleBlocks.php
deleted file mode 100644
index 08e62c16b..000000000
--- a/library/HTMLPurifier/Filter/ExtractStyleBlocks.php
+++ /dev/null
@@ -1,338 +0,0 @@
-<?php
-
-// why is this a top level function? Because PHP 5.2.0 doesn't seem to
-// understand how to interpret this filter if it's a static method.
-// It's all really silly, but if we go this route it might be reasonable
-// to coalesce all of these methods into one.
-function htmlpurifier_filter_extractstyleblocks_muteerrorhandler()
-{
-}
-
-/**
- * This filter extracts <style> blocks from input HTML, cleans them up
- * using CSSTidy, and then places them in $purifier->context->get('StyleBlocks')
- * so they can be used elsewhere in the document.
- *
- * @note
- * See tests/HTMLPurifier/Filter/ExtractStyleBlocksTest.php for
- * sample usage.
- *
- * @note
- * This filter can also be used on stylesheets not included in the
- * document--something purists would probably prefer. Just directly
- * call HTMLPurifier_Filter_ExtractStyleBlocks->cleanCSS()
- */
-class HTMLPurifier_Filter_ExtractStyleBlocks extends HTMLPurifier_Filter
-{
- /**
- * @type string
- */
- public $name = 'ExtractStyleBlocks';
-
- /**
- * @type array
- */
- private $_styleMatches = array();
-
- /**
- * @type csstidy
- */
- private $_tidy;
-
- /**
- * @type HTMLPurifier_AttrDef_HTML_ID
- */
- private $_id_attrdef;
-
- /**
- * @type HTMLPurifier_AttrDef_CSS_Ident
- */
- private $_class_attrdef;
-
- /**
- * @type HTMLPurifier_AttrDef_Enum
- */
- private $_enum_attrdef;
-
- public function __construct()
- {
- $this->_tidy = new csstidy();
- $this->_tidy->set_cfg('lowercase_s', false);
- $this->_id_attrdef = new HTMLPurifier_AttrDef_HTML_ID(true);
- $this->_class_attrdef = new HTMLPurifier_AttrDef_CSS_Ident();
- $this->_enum_attrdef = new HTMLPurifier_AttrDef_Enum(
- array(
- 'first-child',
- 'link',
- 'visited',
- 'active',
- 'hover',
- 'focus'
- )
- );
- }
-
- /**
- * Save the contents of CSS blocks to style matches
- * @param array $matches preg_replace style $matches array
- */
- protected function styleCallback($matches)
- {
- $this->_styleMatches[] = $matches[1];
- }
-
- /**
- * Removes inline <style> tags from HTML, saves them for later use
- * @param string $html
- * @param HTMLPurifier_Config $config
- * @param HTMLPurifier_Context $context
- * @return string
- * @todo Extend to indicate non-text/css style blocks
- */
- public function preFilter($html, $config, $context)
- {
- $tidy = $config->get('Filter.ExtractStyleBlocks.TidyImpl');
- if ($tidy !== null) {
- $this->_tidy = $tidy;
- }
- $html = preg_replace_callback('#<style(?:\s.*)?>(.+)</style>#isU', array($this, 'styleCallback'), $html);
- $style_blocks = $this->_styleMatches;
- $this->_styleMatches = array(); // reset
- $context->register('StyleBlocks', $style_blocks); // $context must not be reused
- if ($this->_tidy) {
- foreach ($style_blocks as &$style) {
- $style = $this->cleanCSS($style, $config, $context);
- }
- }
- return $html;
- }
-
- /**
- * Takes CSS (the stuff found in <style>) and cleans it.
- * @warning Requires CSSTidy <http://csstidy.sourceforge.net/>
- * @param string $css CSS styling to clean
- * @param HTMLPurifier_Config $config
- * @param HTMLPurifier_Context $context
- * @throws HTMLPurifier_Exception
- * @return string Cleaned CSS
- */
- public function cleanCSS($css, $config, $context)
- {
- // prepare scope
- $scope = $config->get('Filter.ExtractStyleBlocks.Scope');
- if ($scope !== null) {
- $scopes = array_map('trim', explode(',', $scope));
- } else {
- $scopes = array();
- }
- // remove comments from CSS
- $css = trim($css);
- if (strncmp('<!--', $css, 4) === 0) {
- $css = substr($css, 4);
- }
- if (strlen($css) > 3 && substr($css, -3) == '-->') {
- $css = substr($css, 0, -3);
- }
- $css = trim($css);
- set_error_handler('htmlpurifier_filter_extractstyleblocks_muteerrorhandler');
- $this->_tidy->parse($css);
- restore_error_handler();
- $css_definition = $config->getDefinition('CSS');
- $html_definition = $config->getDefinition('HTML');
- $new_css = array();
- foreach ($this->_tidy->css as $k => $decls) {
- // $decls are all CSS declarations inside an @ selector
- $new_decls = array();
- foreach ($decls as $selector => $style) {
- $selector = trim($selector);
- if ($selector === '') {
- continue;
- } // should not happen
- // Parse the selector
- // Here is the relevant part of the CSS grammar:
- //
- // ruleset
- // : selector [ ',' S* selector ]* '{' ...
- // selector
- // : simple_selector [ combinator selector | S+ [ combinator? selector ]? ]?
- // combinator
- // : '+' S*
- // : '>' S*
- // simple_selector
- // : element_name [ HASH | class | attrib | pseudo ]*
- // | [ HASH | class | attrib | pseudo ]+
- // element_name
- // : IDENT | '*'
- // ;
- // class
- // : '.' IDENT
- // ;
- // attrib
- // : '[' S* IDENT S* [ [ '=' | INCLUDES | DASHMATCH ] S*
- // [ IDENT | STRING ] S* ]? ']'
- // ;
- // pseudo
- // : ':' [ IDENT | FUNCTION S* [IDENT S*]? ')' ]
- // ;
- //
- // For reference, here are the relevant tokens:
- //
- // HASH #{name}
- // IDENT {ident}
- // INCLUDES ==
- // DASHMATCH |=
- // STRING {string}
- // FUNCTION {ident}\(
- //
- // And the lexical scanner tokens
- //
- // name {nmchar}+
- // nmchar [_a-z0-9-]|{nonascii}|{escape}
- // nonascii [\240-\377]
- // escape {unicode}|\\[^\r\n\f0-9a-f]
- // unicode \\{h}}{1,6}(\r\n|[ \t\r\n\f])?
- // ident -?{nmstart}{nmchar*}
- // nmstart [_a-z]|{nonascii}|{escape}
- // string {string1}|{string2}
- // string1 \"([^\n\r\f\\"]|\\{nl}|{escape})*\"
- // string2 \'([^\n\r\f\\"]|\\{nl}|{escape})*\'
- //
- // We'll implement a subset (in order to reduce attack
- // surface); in particular:
- //
- // - No Unicode support
- // - No escapes support
- // - No string support (by proxy no attrib support)
- // - element_name is matched against allowed
- // elements (some people might find this
- // annoying...)
- // - Pseudo-elements one of :first-child, :link,
- // :visited, :active, :hover, :focus
-
- // handle ruleset
- $selectors = array_map('trim', explode(',', $selector));
- $new_selectors = array();
- foreach ($selectors as $sel) {
- // split on +, > and spaces
- $basic_selectors = preg_split('/\s*([+> ])\s*/', $sel, -1, PREG_SPLIT_DELIM_CAPTURE);
- // even indices are chunks, odd indices are
- // delimiters
- $nsel = null;
- $delim = null; // guaranteed to be non-null after
- // two loop iterations
- for ($i = 0, $c = count($basic_selectors); $i < $c; $i++) {
- $x = $basic_selectors[$i];
- if ($i % 2) {
- // delimiter
- if ($x === ' ') {
- $delim = ' ';
- } else {
- $delim = ' ' . $x . ' ';
- }
- } else {
- // simple selector
- $components = preg_split('/([#.:])/', $x, -1, PREG_SPLIT_DELIM_CAPTURE);
- $sdelim = null;
- $nx = null;
- for ($j = 0, $cc = count($components); $j < $cc; $j++) {
- $y = $components[$j];
- if ($j === 0) {
- if ($y === '*' || isset($html_definition->info[$y = strtolower($y)])) {
- $nx = $y;
- } else {
- // $nx stays null; this matters
- // if we don't manage to find
- // any valid selector content,
- // in which case we ignore the
- // outer $delim
- }
- } elseif ($j % 2) {
- // set delimiter
- $sdelim = $y;
- } else {
- $attrdef = null;
- if ($sdelim === '#') {
- $attrdef = $this->_id_attrdef;
- } elseif ($sdelim === '.') {
- $attrdef = $this->_class_attrdef;
- } elseif ($sdelim === ':') {
- $attrdef = $this->_enum_attrdef;
- } else {
- throw new HTMLPurifier_Exception('broken invariant sdelim and preg_split');
- }
- $r = $attrdef->validate($y, $config, $context);
- if ($r !== false) {
- if ($r !== true) {
- $y = $r;
- }
- if ($nx === null) {
- $nx = '';
- }
- $nx .= $sdelim . $y;
- }
- }
- }
- if ($nx !== null) {
- if ($nsel === null) {
- $nsel = $nx;
- } else {
- $nsel .= $delim . $nx;
- }
- } else {
- // delimiters to the left of invalid
- // basic selector ignored
- }
- }
- }
- if ($nsel !== null) {
- if (!empty($scopes)) {
- foreach ($scopes as $s) {
- $new_selectors[] = "$s $nsel";
- }
- } else {
- $new_selectors[] = $nsel;
- }
- }
- }
- if (empty($new_selectors)) {
- continue;
- }
- $selector = implode(', ', $new_selectors);
- foreach ($style as $name => $value) {
- if (!isset($css_definition->info[$name])) {
- unset($style[$name]);
- continue;
- }
- $def = $css_definition->info[$name];
- $ret = $def->validate($value, $config, $context);
- if ($ret === false) {
- unset($style[$name]);
- } else {
- $style[$name] = $ret;
- }
- }
- $new_decls[$selector] = $style;
- }
- $new_css[$k] = $new_decls;
- }
- // remove stuff that shouldn't be used, could be reenabled
- // after security risks are analyzed
- $this->_tidy->css = $new_css;
- $this->_tidy->import = array();
- $this->_tidy->charset = null;
- $this->_tidy->namespace = null;
- $css = $this->_tidy->print->plain();
- // we are going to escape any special characters <>& to ensure
- // that no funny business occurs (i.e. </style> in a font-family prop).
- if ($config->get('Filter.ExtractStyleBlocks.Escaping')) {
- $css = str_replace(
- array('<', '>', '&'),
- array('\3C ', '\3E ', '\26 '),
- $css
- );
- }
- return $css;
- }
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/Filter/YouTube.php b/library/HTMLPurifier/Filter/YouTube.php
deleted file mode 100644
index 411519ad6..000000000
--- a/library/HTMLPurifier/Filter/YouTube.php
+++ /dev/null
@@ -1,65 +0,0 @@
-<?php
-
-class HTMLPurifier_Filter_YouTube extends HTMLPurifier_Filter
-{
-
- /**
- * @type string
- */
- public $name = 'YouTube';
-
- /**
- * @param string $html
- * @param HTMLPurifier_Config $config
- * @param HTMLPurifier_Context $context
- * @return string
- */
- public function preFilter($html, $config, $context)
- {
- $pre_regex = '#<object[^>]+>.+?' .
- 'http://www.youtube.com/((?:v|cp)/[A-Za-z0-9\-_=]+).+?</object>#s';
- $pre_replace = '<span class="youtube-embed">\1</span>';
- return preg_replace($pre_regex, $pre_replace, $html);
- }
-
- /**
- * @param string $html
- * @param HTMLPurifier_Config $config
- * @param HTMLPurifier_Context $context
- * @return string
- */
- public function postFilter($html, $config, $context)
- {
- $post_regex = '#<span class="youtube-embed">((?:v|cp)/[A-Za-z0-9\-_=]+)</span>#';
- return preg_replace_callback($post_regex, array($this, 'postFilterCallback'), $html);
- }
-
- /**
- * @param $url
- * @return string
- */
- protected function armorUrl($url)
- {
- return str_replace('--', '-&#45;', $url);
- }
-
- /**
- * @param array $matches
- * @return string
- */
- protected function postFilterCallback($matches)
- {
- $url = $this->armorUrl($matches[1]);
- return '<object width="425" height="350" type="application/x-shockwave-flash" ' .
- 'data="http://www.youtube.com/' . $url . '">' .
- '<param name="movie" value="http://www.youtube.com/' . $url . '"></param>' .
- '<!--[if IE]>' .
- '<embed src="http://www.youtube.com/' . $url . '"' .
- 'type="application/x-shockwave-flash"' .
- 'wmode="transparent" width="425" height="350" />' .
- '<![endif]-->' .
- '</object>';
- }
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/HTMLModuleManager.php b/library/HTMLPurifier/HTMLModuleManager.php
deleted file mode 100644
index f3a17cb03..000000000
--- a/library/HTMLPurifier/HTMLModuleManager.php
+++ /dev/null
@@ -1,459 +0,0 @@
-<?php
-
-class HTMLPurifier_HTMLModuleManager
-{
-
- /**
- * @type HTMLPurifier_DoctypeRegistry
- */
- public $doctypes;
-
- /**
- * Instance of current doctype.
- * @type string
- */
- public $doctype;
-
- /**
- * @type HTMLPurifier_AttrTypes
- */
- public $attrTypes;
-
- /**
- * Active instances of modules for the specified doctype are
- * indexed, by name, in this array.
- * @type HTMLPurifier_HTMLModule[]
- */
- public $modules = array();
-
- /**
- * Array of recognized HTMLPurifier_HTMLModule instances,
- * indexed by module's class name. This array is usually lazy loaded, but a
- * user can overload a module by pre-emptively registering it.
- * @type HTMLPurifier_HTMLModule[]
- */
- public $registeredModules = array();
-
- /**
- * List of extra modules that were added by the user
- * using addModule(). These get unconditionally merged into the current doctype, whatever
- * it may be.
- * @type HTMLPurifier_HTMLModule[]
- */
- public $userModules = array();
-
- /**
- * Associative array of element name to list of modules that have
- * definitions for the element; this array is dynamically filled.
- * @type array
- */
- public $elementLookup = array();
-
- /**
- * List of prefixes we should use for registering small names.
- * @type array
- */
- public $prefixes = array('HTMLPurifier_HTMLModule_');
-
- /**
- * @type HTMLPurifier_ContentSets
- */
- public $contentSets;
-
- /**
- * @type HTMLPurifier_AttrCollections
- */
- public $attrCollections;
-
- /**
- * If set to true, unsafe elements and attributes will be allowed.
- * @type bool
- */
- public $trusted = false;
-
- public function __construct()
- {
- // editable internal objects
- $this->attrTypes = new HTMLPurifier_AttrTypes();
- $this->doctypes = new HTMLPurifier_DoctypeRegistry();
-
- // setup basic modules
- $common = array(
- 'CommonAttributes', 'Text', 'Hypertext', 'List',
- 'Presentation', 'Edit', 'Bdo', 'Tables', 'Image',
- 'StyleAttribute',
- // Unsafe:
- 'Scripting', 'Object', 'Forms',
- // Sorta legacy, but present in strict:
- 'Name',
- );
- $transitional = array('Legacy', 'Target', 'Iframe');
- $xml = array('XMLCommonAttributes');
- $non_xml = array('NonXMLCommonAttributes');
-
- // setup basic doctypes
- $this->doctypes->register(
- 'HTML 4.01 Transitional',
- false,
- array_merge($common, $transitional, $non_xml),
- array('Tidy_Transitional', 'Tidy_Proprietary'),
- array(),
- '-//W3C//DTD HTML 4.01 Transitional//EN',
- 'http://www.w3.org/TR/html4/loose.dtd'
- );
-
- $this->doctypes->register(
- 'HTML 4.01 Strict',
- false,
- array_merge($common, $non_xml),
- array('Tidy_Strict', 'Tidy_Proprietary', 'Tidy_Name'),
- array(),
- '-//W3C//DTD HTML 4.01//EN',
- 'http://www.w3.org/TR/html4/strict.dtd'
- );
-
- $this->doctypes->register(
- 'XHTML 1.0 Transitional',
- true,
- array_merge($common, $transitional, $xml, $non_xml),
- array('Tidy_Transitional', 'Tidy_XHTML', 'Tidy_Proprietary', 'Tidy_Name'),
- array(),
- '-//W3C//DTD XHTML 1.0 Transitional//EN',
- 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'
- );
-
- $this->doctypes->register(
- 'XHTML 1.0 Strict',
- true,
- array_merge($common, $xml, $non_xml),
- array('Tidy_Strict', 'Tidy_XHTML', 'Tidy_Strict', 'Tidy_Proprietary', 'Tidy_Name'),
- array(),
- '-//W3C//DTD XHTML 1.0 Strict//EN',
- 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'
- );
-
- $this->doctypes->register(
- 'XHTML 1.1',
- true,
- // Iframe is a real XHTML 1.1 module, despite being
- // "transitional"!
- array_merge($common, $xml, array('Ruby', 'Iframe')),
- array('Tidy_Strict', 'Tidy_XHTML', 'Tidy_Proprietary', 'Tidy_Strict', 'Tidy_Name'), // Tidy_XHTML1_1
- array(),
- '-//W3C//DTD XHTML 1.1//EN',
- 'http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd'
- );
-
- }
-
- /**
- * Registers a module to the recognized module list, useful for
- * overloading pre-existing modules.
- * @param $module Mixed: string module name, with or without
- * HTMLPurifier_HTMLModule prefix, or instance of
- * subclass of HTMLPurifier_HTMLModule.
- * @param $overload Boolean whether or not to overload previous modules.
- * If this is not set, and you do overload a module,
- * HTML Purifier will complain with a warning.
- * @note This function will not call autoload, you must instantiate
- * (and thus invoke) autoload outside the method.
- * @note If a string is passed as a module name, different variants
- * will be tested in this order:
- * - Check for HTMLPurifier_HTMLModule_$name
- * - Check all prefixes with $name in order they were added
- * - Check for literal object name
- * - Throw fatal error
- * If your object name collides with an internal class, specify
- * your module manually. All modules must have been included
- * externally: registerModule will not perform inclusions for you!
- */
- public function registerModule($module, $overload = false)
- {
- if (is_string($module)) {
- // attempt to load the module
- $original_module = $module;
- $ok = false;
- foreach ($this->prefixes as $prefix) {
- $module = $prefix . $original_module;
- if (class_exists($module)) {
- $ok = true;
- break;
- }
- }
- if (!$ok) {
- $module = $original_module;
- if (!class_exists($module)) {
- trigger_error(
- $original_module . ' module does not exist',
- E_USER_ERROR
- );
- return;
- }
- }
- $module = new $module();
- }
- if (empty($module->name)) {
- trigger_error('Module instance of ' . get_class($module) . ' must have name');
- return;
- }
- if (!$overload && isset($this->registeredModules[$module->name])) {
- trigger_error('Overloading ' . $module->name . ' without explicit overload parameter', E_USER_WARNING);
- }
- $this->registeredModules[$module->name] = $module;
- }
-
- /**
- * Adds a module to the current doctype by first registering it,
- * and then tacking it on to the active doctype
- */
- public function addModule($module)
- {
- $this->registerModule($module);
- if (is_object($module)) {
- $module = $module->name;
- }
- $this->userModules[] = $module;
- }
-
- /**
- * Adds a class prefix that registerModule() will use to resolve a
- * string name to a concrete class
- */
- public function addPrefix($prefix)
- {
- $this->prefixes[] = $prefix;
- }
-
- /**
- * Performs processing on modules, after being called you may
- * use getElement() and getElements()
- * @param HTMLPurifier_Config $config
- */
- public function setup($config)
- {
- $this->trusted = $config->get('HTML.Trusted');
-
- // generate
- $this->doctype = $this->doctypes->make($config);
- $modules = $this->doctype->modules;
-
- // take out the default modules that aren't allowed
- $lookup = $config->get('HTML.AllowedModules');
- $special_cases = $config->get('HTML.CoreModules');
-
- if (is_array($lookup)) {
- foreach ($modules as $k => $m) {
- if (isset($special_cases[$m])) {
- continue;
- }
- if (!isset($lookup[$m])) {
- unset($modules[$k]);
- }
- }
- }
-
- // custom modules
- if ($config->get('HTML.Proprietary')) {
- $modules[] = 'Proprietary';
- }
- if ($config->get('HTML.SafeObject')) {
- $modules[] = 'SafeObject';
- }
- if ($config->get('HTML.SafeEmbed')) {
- $modules[] = 'SafeEmbed';
- }
- if ($config->get('HTML.SafeScripting') !== array()) {
- $modules[] = 'SafeScripting';
- }
- if ($config->get('HTML.Nofollow')) {
- $modules[] = 'Nofollow';
- }
- if ($config->get('HTML.TargetBlank')) {
- $modules[] = 'TargetBlank';
- }
-
- // merge in custom modules
- $modules = array_merge($modules, $this->userModules);
-
- foreach ($modules as $module) {
- $this->processModule($module);
- $this->modules[$module]->setup($config);
- }
-
- foreach ($this->doctype->tidyModules as $module) {
- $this->processModule($module);
- $this->modules[$module]->setup($config);
- }
-
- // prepare any injectors
- foreach ($this->modules as $module) {
- $n = array();
- foreach ($module->info_injector as $injector) {
- if (!is_object($injector)) {
- $class = "HTMLPurifier_Injector_$injector";
- $injector = new $class;
- }
- $n[$injector->name] = $injector;
- }
- $module->info_injector = $n;
- }
-
- // setup lookup table based on all valid modules
- foreach ($this->modules as $module) {
- foreach ($module->info as $name => $def) {
- if (!isset($this->elementLookup[$name])) {
- $this->elementLookup[$name] = array();
- }
- $this->elementLookup[$name][] = $module->name;
- }
- }
-
- // note the different choice
- $this->contentSets = new HTMLPurifier_ContentSets(
- // content set assembly deals with all possible modules,
- // not just ones deemed to be "safe"
- $this->modules
- );
- $this->attrCollections = new HTMLPurifier_AttrCollections(
- $this->attrTypes,
- // there is no way to directly disable a global attribute,
- // but using AllowedAttributes or simply not including
- // the module in your custom doctype should be sufficient
- $this->modules
- );
- }
-
- /**
- * Takes a module and adds it to the active module collection,
- * registering it if necessary.
- */
- public function processModule($module)
- {
- if (!isset($this->registeredModules[$module]) || is_object($module)) {
- $this->registerModule($module);
- }
- $this->modules[$module] = $this->registeredModules[$module];
- }
-
- /**
- * Retrieves merged element definitions.
- * @return Array of HTMLPurifier_ElementDef
- */
- public function getElements()
- {
- $elements = array();
- foreach ($this->modules as $module) {
- if (!$this->trusted && !$module->safe) {
- continue;
- }
- foreach ($module->info as $name => $v) {
- if (isset($elements[$name])) {
- continue;
- }
- $elements[$name] = $this->getElement($name);
- }
- }
-
- // remove dud elements, this happens when an element that
- // appeared to be safe actually wasn't
- foreach ($elements as $n => $v) {
- if ($v === false) {
- unset($elements[$n]);
- }
- }
-
- return $elements;
-
- }
-
- /**
- * Retrieves a single merged element definition
- * @param string $name Name of element
- * @param bool $trusted Boolean trusted overriding parameter: set to true
- * if you want the full version of an element
- * @return HTMLPurifier_ElementDef Merged HTMLPurifier_ElementDef
- * @note You may notice that modules are getting iterated over twice (once
- * in getElements() and once here). This
- * is because
- */
- public function getElement($name, $trusted = null)
- {
- if (!isset($this->elementLookup[$name])) {
- return false;
- }
-
- // setup global state variables
- $def = false;
- if ($trusted === null) {
- $trusted = $this->trusted;
- }
-
- // iterate through each module that has registered itself to this
- // element
- foreach ($this->elementLookup[$name] as $module_name) {
- $module = $this->modules[$module_name];
-
- // refuse to create/merge from a module that is deemed unsafe--
- // pretend the module doesn't exist--when trusted mode is not on.
- if (!$trusted && !$module->safe) {
- continue;
- }
-
- // clone is used because, ideally speaking, the original
- // definition should not be modified. Usually, this will
- // make no difference, but for consistency's sake
- $new_def = clone $module->info[$name];
-
- if (!$def && $new_def->standalone) {
- $def = $new_def;
- } elseif ($def) {
- // This will occur even if $new_def is standalone. In practice,
- // this will usually result in a full replacement.
- $def->mergeIn($new_def);
- } else {
- // :TODO:
- // non-standalone definitions that don't have a standalone
- // to merge into could be deferred to the end
- // HOWEVER, it is perfectly valid for a non-standalone
- // definition to lack a standalone definition, even
- // after all processing: this allows us to safely
- // specify extra attributes for elements that may not be
- // enabled all in one place. In particular, this might
- // be the case for trusted elements. WARNING: care must
- // be taken that the /extra/ definitions are all safe.
- continue;
- }
-
- // attribute value expansions
- $this->attrCollections->performInclusions($def->attr);
- $this->attrCollections->expandIdentifiers($def->attr, $this->attrTypes);
-
- // descendants_are_inline, for ChildDef_Chameleon
- if (is_string($def->content_model) &&
- strpos($def->content_model, 'Inline') !== false) {
- if ($name != 'del' && $name != 'ins') {
- // this is for you, ins/del
- $def->descendants_are_inline = true;
- }
- }
-
- $this->contentSets->generateChildDef($def, $module);
- }
-
- // This can occur if there is a blank definition, but no base to
- // mix it in with
- if (!$def) {
- return false;
- }
-
- // add information on required attributes
- foreach ($def->attr as $attr_name => $attr_def) {
- if ($attr_def->required) {
- $def->required_attr[] = $attr_name;
- }
- }
- return $def;
- }
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/Injector/Linkify.php b/library/HTMLPurifier/Injector/Linkify.php
deleted file mode 100644
index 069708c25..000000000
--- a/library/HTMLPurifier/Injector/Linkify.php
+++ /dev/null
@@ -1,59 +0,0 @@
-<?php
-
-/**
- * Injector that converts http, https and ftp text URLs to actual links.
- */
-class HTMLPurifier_Injector_Linkify extends HTMLPurifier_Injector
-{
- /**
- * @type string
- */
- public $name = 'Linkify';
-
- /**
- * @type array
- */
- public $needed = array('a' => array('href'));
-
- /**
- * @param HTMLPurifier_Token $token
- */
- public function handleText(&$token)
- {
- if (!$this->allowsElement('a')) {
- return;
- }
-
- if (strpos($token->data, '://') === false) {
- // our really quick heuristic failed, abort
- // this may not work so well if we want to match things like
- // "google.com", but then again, most people don't
- return;
- }
-
- // there is/are URL(s). Let's split the string:
- // Note: this regex is extremely permissive
- $bits = preg_split('#((?:https?|ftp)://[^\s\'",<>()]+)#Su', $token->data, -1, PREG_SPLIT_DELIM_CAPTURE);
-
-
- $token = array();
-
- // $i = index
- // $c = count
- // $l = is link
- for ($i = 0, $c = count($bits), $l = false; $i < $c; $i++, $l = !$l) {
- if (!$l) {
- if ($bits[$i] === '') {
- continue;
- }
- $token[] = new HTMLPurifier_Token_Text($bits[$i]);
- } else {
- $token[] = new HTMLPurifier_Token_Start('a', array('href' => $bits[$i]));
- $token[] = new HTMLPurifier_Token_Text($bits[$i]);
- $token[] = new HTMLPurifier_Token_End('a');
- }
- }
- }
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/Injector/RemoveEmpty.php b/library/HTMLPurifier/Injector/RemoveEmpty.php
deleted file mode 100644
index cd885722e..000000000
--- a/library/HTMLPurifier/Injector/RemoveEmpty.php
+++ /dev/null
@@ -1,101 +0,0 @@
-<?php
-
-class HTMLPurifier_Injector_RemoveEmpty extends HTMLPurifier_Injector
-{
- /**
- * @type HTMLPurifier_Context
- */
- private $context;
-
- /**
- * @type HTMLPurifier_Config
- */
- private $config;
-
- /**
- * @type HTMLPurifier_AttrValidator
- */
- private $attrValidator;
-
- /**
- * @type bool
- */
- private $removeNbsp;
-
- /**
- * @type bool
- */
- private $removeNbspExceptions;
-
- /**
- * @type array
- * TODO: make me configurable
- */
- private $_exclude = array('colgroup' => 1, 'th' => 1, 'td' => 1, 'iframe' => 1);
-
- /**
- * @param HTMLPurifier_Config $config
- * @param HTMLPurifier_Context $context
- * @return void
- */
- public function prepare($config, $context)
- {
- parent::prepare($config, $context);
- $this->config = $config;
- $this->context = $context;
- $this->removeNbsp = $config->get('AutoFormat.RemoveEmpty.RemoveNbsp');
- $this->removeNbspExceptions = $config->get('AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions');
- $this->attrValidator = new HTMLPurifier_AttrValidator();
- }
-
- /**
- * @param HTMLPurifier_Token $token
- */
- public function handleElement(&$token)
- {
- if (!$token instanceof HTMLPurifier_Token_Start) {
- return;
- }
- $next = false;
- $deleted = 1; // the current tag
- for ($i = count($this->inputZipper->back) - 1; $i >= 0; $i--, $deleted++) {
- $next = $this->inputZipper->back[$i];
- if ($next instanceof HTMLPurifier_Token_Text) {
- if ($next->is_whitespace) {
- continue;
- }
- if ($this->removeNbsp && !isset($this->removeNbspExceptions[$token->name])) {
- $plain = str_replace("\xC2\xA0", "", $next->data);
- $isWsOrNbsp = $plain === '' || ctype_space($plain);
- if ($isWsOrNbsp) {
- continue;
- }
- }
- }
- break;
- }
- if (!$next || ($next instanceof HTMLPurifier_Token_End && $next->name == $token->name)) {
- if (isset($this->_exclude[$token->name])) {
- return;
- }
- $this->attrValidator->validateToken($token, $this->config, $this->context);
- $token->armor['ValidateAttributes'] = true;
- if (isset($token->attr['id']) || isset($token->attr['name'])) {
- return;
- }
- $token = $deleted + 1;
- for ($b = 0, $c = count($this->inputZipper->front); $b < $c; $b++) {
- $prev = $this->inputZipper->front[$b];
- if ($prev instanceof HTMLPurifier_Token_Text && $prev->is_whitespace) {
- continue;
- }
- break;
- }
- // This is safe because we removed the token that triggered this.
- $this->rewindOffset($b+$deleted);
- return;
- }
- }
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/Injector/SafeObject.php b/library/HTMLPurifier/Injector/SafeObject.php
deleted file mode 100644
index 3d17e07af..000000000
--- a/library/HTMLPurifier/Injector/SafeObject.php
+++ /dev/null
@@ -1,121 +0,0 @@
-<?php
-
-/**
- * Adds important param elements to inside of object in order to make
- * things safe.
- */
-class HTMLPurifier_Injector_SafeObject extends HTMLPurifier_Injector
-{
- /**
- * @type string
- */
- public $name = 'SafeObject';
-
- /**
- * @type array
- */
- public $needed = array('object', 'param');
-
- /**
- * @type array
- */
- protected $objectStack = array();
-
- /**
- * @type array
- */
- protected $paramStack = array();
-
- /**
- * Keep this synchronized with AttrTransform/SafeParam.php.
- * @type array
- */
- protected $addParam = array(
- 'allowScriptAccess' => 'never',
- 'allowNetworking' => 'internal',
- );
-
- /**
- * @type array
- */
- protected $allowedParam = array(
- 'wmode' => true,
- 'movie' => true,
- 'flashvars' => true,
- 'src' => true,
- 'allowFullScreen' => true, // if omitted, assume to be 'false'
- );
-
- /**
- * @param HTMLPurifier_Config $config
- * @param HTMLPurifier_Context $context
- * @return void
- */
- public function prepare($config, $context)
- {
- parent::prepare($config, $context);
- }
-
- /**
- * @param HTMLPurifier_Token $token
- */
- public function handleElement(&$token)
- {
- if ($token->name == 'object') {
- $this->objectStack[] = $token;
- $this->paramStack[] = array();
- $new = array($token);
- foreach ($this->addParam as $name => $value) {
- $new[] = new HTMLPurifier_Token_Empty('param', array('name' => $name, 'value' => $value));
- }
- $token = $new;
- } elseif ($token->name == 'param') {
- $nest = count($this->currentNesting) - 1;
- if ($nest >= 0 && $this->currentNesting[$nest]->name === 'object') {
- $i = count($this->objectStack) - 1;
- if (!isset($token->attr['name'])) {
- $token = false;
- return;
- }
- $n = $token->attr['name'];
- // We need this fix because YouTube doesn't supply a data
- // attribute, which we need if a type is specified. This is
- // *very* Flash specific.
- if (!isset($this->objectStack[$i]->attr['data']) &&
- ($token->attr['name'] == 'movie' || $token->attr['name'] == 'src')
- ) {
- $this->objectStack[$i]->attr['data'] = $token->attr['value'];
- }
- // Check if the parameter is the correct value but has not
- // already been added
- if (!isset($this->paramStack[$i][$n]) &&
- isset($this->addParam[$n]) &&
- $token->attr['name'] === $this->addParam[$n]) {
- // keep token, and add to param stack
- $this->paramStack[$i][$n] = true;
- } elseif (isset($this->allowedParam[$n])) {
- // keep token, don't do anything to it
- // (could possibly check for duplicates here)
- } else {
- $token = false;
- }
- } else {
- // not directly inside an object, DENY!
- $token = false;
- }
- }
- }
-
- public function handleEnd(&$token)
- {
- // This is the WRONG way of handling the object and param stacks;
- // we should be inserting them directly on the relevant object tokens
- // so that the global stack handling handles it.
- if ($token->name == 'object') {
- array_pop($this->objectStack);
- array_pop($this->paramStack);
- }
- }
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/Lexer.php b/library/HTMLPurifier/Lexer.php
deleted file mode 100644
index 43732621d..000000000
--- a/library/HTMLPurifier/Lexer.php
+++ /dev/null
@@ -1,357 +0,0 @@
-<?php
-
-/**
- * Forgivingly lexes HTML (SGML-style) markup into tokens.
- *
- * A lexer parses a string of SGML-style markup and converts them into
- * corresponding tokens. It doesn't check for well-formedness, although its
- * internal mechanism may make this automatic (such as the case of
- * HTMLPurifier_Lexer_DOMLex). There are several implementations to choose
- * from.
- *
- * A lexer is HTML-oriented: it might work with XML, but it's not
- * recommended, as we adhere to a subset of the specification for optimization
- * reasons. This might change in the future. Also, most tokenizers are not
- * expected to handle DTDs or PIs.
- *
- * This class should not be directly instantiated, but you may use create() to
- * retrieve a default copy of the lexer. Being a supertype, this class
- * does not actually define any implementation, but offers commonly used
- * convenience functions for subclasses.
- *
- * @note The unit tests will instantiate this class for testing purposes, as
- * many of the utility functions require a class to be instantiated.
- * This means that, even though this class is not runnable, it will
- * not be declared abstract.
- *
- * @par
- *
- * @note
- * We use tokens rather than create a DOM representation because DOM would:
- *
- * @par
- * -# Require more processing and memory to create,
- * -# Is not streamable, and
- * -# Has the entire document structure (html and body not needed).
- *
- * @par
- * However, DOM is helpful in that it makes it easy to move around nodes
- * without a lot of lookaheads to see when a tag is closed. This is a
- * limitation of the token system and some workarounds would be nice.
- */
-class HTMLPurifier_Lexer
-{
-
- /**
- * Whether or not this lexer implements line-number/column-number tracking.
- * If it does, set to true.
- */
- public $tracksLineNumbers = false;
-
- // -- STATIC ----------------------------------------------------------
-
- /**
- * Retrieves or sets the default Lexer as a Prototype Factory.
- *
- * By default HTMLPurifier_Lexer_DOMLex will be returned. There are
- * a few exceptions involving special features that only DirectLex
- * implements.
- *
- * @note The behavior of this class has changed, rather than accepting
- * a prototype object, it now accepts a configuration object.
- * To specify your own prototype, set %Core.LexerImpl to it.
- * This change in behavior de-singletonizes the lexer object.
- *
- * @param HTMLPurifier_Config $config
- * @return HTMLPurifier_Lexer
- * @throws HTMLPurifier_Exception
- */
- public static function create($config)
- {
- if (!($config instanceof HTMLPurifier_Config)) {
- $lexer = $config;
- trigger_error(
- "Passing a prototype to
- HTMLPurifier_Lexer::create() is deprecated, please instead
- use %Core.LexerImpl",
- E_USER_WARNING
- );
- } else {
- $lexer = $config->get('Core.LexerImpl');
- }
-
- $needs_tracking =
- $config->get('Core.MaintainLineNumbers') ||
- $config->get('Core.CollectErrors');
-
- $inst = null;
- if (is_object($lexer)) {
- $inst = $lexer;
- } else {
- if (is_null($lexer)) {
- do {
- // auto-detection algorithm
- if ($needs_tracking) {
- $lexer = 'DirectLex';
- break;
- }
-
- if (class_exists('DOMDocument') &&
- method_exists('DOMDocument', 'loadHTML') &&
- !extension_loaded('domxml')
- ) {
- // check for DOM support, because while it's part of the
- // core, it can be disabled compile time. Also, the PECL
- // domxml extension overrides the default DOM, and is evil
- // and nasty and we shan't bother to support it
- $lexer = 'DOMLex';
- } else {
- $lexer = 'DirectLex';
- }
- } while (0);
- } // do..while so we can break
-
- // instantiate recognized string names
- switch ($lexer) {
- case 'DOMLex':
- $inst = new HTMLPurifier_Lexer_DOMLex();
- break;
- case 'DirectLex':
- $inst = new HTMLPurifier_Lexer_DirectLex();
- break;
- case 'PH5P':
- $inst = new HTMLPurifier_Lexer_PH5P();
- break;
- default:
- throw new HTMLPurifier_Exception(
- "Cannot instantiate unrecognized Lexer type " .
- htmlspecialchars($lexer)
- );
- }
- }
-
- if (!$inst) {
- throw new HTMLPurifier_Exception('No lexer was instantiated');
- }
-
- // once PHP DOM implements native line numbers, or we
- // hack out something using XSLT, remove this stipulation
- if ($needs_tracking && !$inst->tracksLineNumbers) {
- throw new HTMLPurifier_Exception(
- 'Cannot use lexer that does not support line numbers with ' .
- 'Core.MaintainLineNumbers or Core.CollectErrors (use DirectLex instead)'
- );
- }
-
- return $inst;
-
- }
-
- // -- CONVENIENCE MEMBERS ---------------------------------------------
-
- public function __construct()
- {
- $this->_entity_parser = new HTMLPurifier_EntityParser();
- }
-
- /**
- * Most common entity to raw value conversion table for special entities.
- * @type array
- */
- protected $_special_entity2str =
- array(
- '&quot;' => '"',
- '&amp;' => '&',
- '&lt;' => '<',
- '&gt;' => '>',
- '&#39;' => "'",
- '&#039;' => "'",
- '&#x27;' => "'"
- );
-
- /**
- * Parses special entities into the proper characters.
- *
- * This string will translate escaped versions of the special characters
- * into the correct ones.
- *
- * @warning
- * You should be able to treat the output of this function as
- * completely parsed, but that's only because all other entities should
- * have been handled previously in substituteNonSpecialEntities()
- *
- * @param string $string String character data to be parsed.
- * @return string Parsed character data.
- */
- public function parseData($string)
- {
- // following functions require at least one character
- if ($string === '') {
- return '';
- }
-
- // subtracts amps that cannot possibly be escaped
- $num_amp = substr_count($string, '&') - substr_count($string, '& ') -
- ($string[strlen($string) - 1] === '&' ? 1 : 0);
-
- if (!$num_amp) {
- return $string;
- } // abort if no entities
- $num_esc_amp = substr_count($string, '&amp;');
- $string = strtr($string, $this->_special_entity2str);
-
- // code duplication for sake of optimization, see above
- $num_amp_2 = substr_count($string, '&') - substr_count($string, '& ') -
- ($string[strlen($string) - 1] === '&' ? 1 : 0);
-
- if ($num_amp_2 <= $num_esc_amp) {
- return $string;
- }
-
- // hmm... now we have some uncommon entities. Use the callback.
- $string = $this->_entity_parser->substituteSpecialEntities($string);
- return $string;
- }
-
- /**
- * Lexes an HTML string into tokens.
- * @param $string String HTML.
- * @param HTMLPurifier_Config $config
- * @param HTMLPurifier_Context $context
- * @return HTMLPurifier_Token[] array representation of HTML.
- */
- public function tokenizeHTML($string, $config, $context)
- {
- trigger_error('Call to abstract class', E_USER_ERROR);
- }
-
- /**
- * Translates CDATA sections into regular sections (through escaping).
- * @param string $string HTML string to process.
- * @return string HTML with CDATA sections escaped.
- */
- protected static function escapeCDATA($string)
- {
- return preg_replace_callback(
- '/<!\[CDATA\[(.+?)\]\]>/s',
- array('HTMLPurifier_Lexer', 'CDATACallback'),
- $string
- );
- }
-
- /**
- * Special CDATA case that is especially convoluted for <script>
- * @param string $string HTML string to process.
- * @return string HTML with CDATA sections escaped.
- */
- protected static function escapeCommentedCDATA($string)
- {
- return preg_replace_callback(
- '#<!--//--><!\[CDATA\[//><!--(.+?)//--><!\]\]>#s',
- array('HTMLPurifier_Lexer', 'CDATACallback'),
- $string
- );
- }
-
- /**
- * Special Internet Explorer conditional comments should be removed.
- * @param string $string HTML string to process.
- * @return string HTML with conditional comments removed.
- */
- protected static function removeIEConditional($string)
- {
- return preg_replace(
- '#<!--\[if [^>]+\]>.*?<!\[endif\]-->#si', // probably should generalize for all strings
- '',
- $string
- );
- }
-
- /**
- * Callback function for escapeCDATA() that does the work.
- *
- * @warning Though this is public in order to let the callback happen,
- * calling it directly is not recommended.
- * @param array $matches PCRE matches array, with index 0 the entire match
- * and 1 the inside of the CDATA section.
- * @return string Escaped internals of the CDATA section.
- */
- protected static function CDATACallback($matches)
- {
- // not exactly sure why the character set is needed, but whatever
- return htmlspecialchars($matches[1], ENT_COMPAT, 'UTF-8');
- }
-
- /**
- * Takes a piece of HTML and normalizes it by converting entities, fixing
- * encoding, extracting bits, and other good stuff.
- * @param string $html HTML.
- * @param HTMLPurifier_Config $config
- * @param HTMLPurifier_Context $context
- * @return string
- * @todo Consider making protected
- */
- public function normalize($html, $config, $context)
- {
- // normalize newlines to \n
- if ($config->get('Core.NormalizeNewlines')) {
- $html = str_replace("\r\n", "\n", $html);
- $html = str_replace("\r", "\n", $html);
- }
-
- if ($config->get('HTML.Trusted')) {
- // escape convoluted CDATA
- $html = $this->escapeCommentedCDATA($html);
- }
-
- // escape CDATA
- $html = $this->escapeCDATA($html);
-
- $html = $this->removeIEConditional($html);
-
- // extract body from document if applicable
- if ($config->get('Core.ConvertDocumentToFragment')) {
- $e = false;
- if ($config->get('Core.CollectErrors')) {
- $e =& $context->get('ErrorCollector');
- }
- $new_html = $this->extractBody($html);
- if ($e && $new_html != $html) {
- $e->send(E_WARNING, 'Lexer: Extracted body');
- }
- $html = $new_html;
- }
-
- // expand entities that aren't the big five
- $html = $this->_entity_parser->substituteNonSpecialEntities($html);
-
- // clean into wellformed UTF-8 string for an SGML context: this has
- // to be done after entity expansion because the entities sometimes
- // represent non-SGML characters (horror, horror!)
- $html = HTMLPurifier_Encoder::cleanUTF8($html);
-
- // if processing instructions are to removed, remove them now
- if ($config->get('Core.RemoveProcessingInstructions')) {
- $html = preg_replace('#<\?.+?\?>#s', '', $html);
- }
-
- return $html;
- }
-
- /**
- * Takes a string of HTML (fragment or document) and returns the content
- * @todo Consider making protected
- */
- public function extractBody($html)
- {
- $matches = array();
- $result = preg_match('!<body[^>]*>(.*)</body>!is', $html, $matches);
- if ($result) {
- return $matches[1];
- } else {
- return $html;
- }
- }
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/Lexer/DOMLex.php b/library/HTMLPurifier/Lexer/DOMLex.php
deleted file mode 100644
index 720754454..000000000
--- a/library/HTMLPurifier/Lexer/DOMLex.php
+++ /dev/null
@@ -1,280 +0,0 @@
-<?php
-
-/**
- * Parser that uses PHP 5's DOM extension (part of the core).
- *
- * In PHP 5, the DOM XML extension was revamped into DOM and added to the core.
- * It gives us a forgiving HTML parser, which we use to transform the HTML
- * into a DOM, and then into the tokens. It is blazingly fast (for large
- * documents, it performs twenty times faster than
- * HTMLPurifier_Lexer_DirectLex,and is the default choice for PHP 5.
- *
- * @note Any empty elements will have empty tokens associated with them, even if
- * this is prohibited by the spec. This is cannot be fixed until the spec
- * comes into play.
- *
- * @note PHP's DOM extension does not actually parse any entities, we use
- * our own function to do that.
- *
- * @warning DOM tends to drop whitespace, which may wreak havoc on indenting.
- * If this is a huge problem, due to the fact that HTML is hand
- * edited and you are unable to get a parser cache that caches the
- * the output of HTML Purifier while keeping the original HTML lying
- * around, you may want to run Tidy on the resulting output or use
- * HTMLPurifier_DirectLex
- */
-
-class HTMLPurifier_Lexer_DOMLex extends HTMLPurifier_Lexer
-{
-
- /**
- * @type HTMLPurifier_TokenFactory
- */
- private $factory;
-
- public function __construct()
- {
- // setup the factory
- parent::__construct();
- $this->factory = new HTMLPurifier_TokenFactory();
- }
-
- /**
- * @param string $html
- * @param HTMLPurifier_Config $config
- * @param HTMLPurifier_Context $context
- * @return HTMLPurifier_Token[]
- */
- public function tokenizeHTML($html, $config, $context)
- {
- $html = $this->normalize($html, $config, $context);
-
- // attempt to armor stray angled brackets that cannot possibly
- // form tags and thus are probably being used as emoticons
- if ($config->get('Core.AggressivelyFixLt')) {
- $char = '[^a-z!\/]';
- $comment = "/<!--(.*?)(-->|\z)/is";
- $html = preg_replace_callback($comment, array($this, 'callbackArmorCommentEntities'), $html);
- do {
- $old = $html;
- $html = preg_replace("/<($char)/i", '&lt;\\1', $html);
- } while ($html !== $old);
- $html = preg_replace_callback($comment, array($this, 'callbackUndoCommentSubst'), $html); // fix comments
- }
-
- // preprocess html, essential for UTF-8
- $html = $this->wrapHTML($html, $config, $context);
-
- $doc = new DOMDocument();
- $doc->encoding = 'UTF-8'; // theoretically, the above has this covered
-
- set_error_handler(array($this, 'muteErrorHandler'));
- $doc->loadHTML($html);
- restore_error_handler();
-
- $tokens = array();
- $this->tokenizeDOM(
- $doc->getElementsByTagName('html')->item(0)-> // <html>
- getElementsByTagName('body')->item(0)-> // <body>
- getElementsByTagName('div')->item(0), // <div>
- $tokens
- );
- return $tokens;
- }
-
- /**
- * Iterative function that tokenizes a node, putting it into an accumulator.
- * To iterate is human, to recurse divine - L. Peter Deutsch
- * @param DOMNode $node DOMNode to be tokenized.
- * @param HTMLPurifier_Token[] $tokens Array-list of already tokenized tokens.
- * @return HTMLPurifier_Token of node appended to previously passed tokens.
- */
- protected function tokenizeDOM($node, &$tokens)
- {
- $level = 0;
- $nodes = array($level => new HTMLPurifier_Queue(array($node)));
- $closingNodes = array();
- do {
- while (!$nodes[$level]->isEmpty()) {
- $node = $nodes[$level]->shift(); // FIFO
- $collect = $level > 0 ? true : false;
- $needEndingTag = $this->createStartNode($node, $tokens, $collect);
- if ($needEndingTag) {
- $closingNodes[$level][] = $node;
- }
- if ($node->childNodes && $node->childNodes->length) {
- $level++;
- $nodes[$level] = new HTMLPurifier_Queue();
- foreach ($node->childNodes as $childNode) {
- $nodes[$level]->push($childNode);
- }
- }
- }
- $level--;
- if ($level && isset($closingNodes[$level])) {
- while ($node = array_pop($closingNodes[$level])) {
- $this->createEndNode($node, $tokens);
- }
- }
- } while ($level > 0);
- }
-
- /**
- * @param DOMNode $node DOMNode to be tokenized.
- * @param HTMLPurifier_Token[] $tokens Array-list of already tokenized tokens.
- * @param bool $collect Says whether or start and close are collected, set to
- * false at first recursion because it's the implicit DIV
- * tag you're dealing with.
- * @return bool if the token needs an endtoken
- * @todo data and tagName properties don't seem to exist in DOMNode?
- */
- protected function createStartNode($node, &$tokens, $collect)
- {
- // intercept non element nodes. WE MUST catch all of them,
- // but we're not getting the character reference nodes because
- // those should have been preprocessed
- if ($node->nodeType === XML_TEXT_NODE) {
- $tokens[] = $this->factory->createText($node->data);
- return false;
- } elseif ($node->nodeType === XML_CDATA_SECTION_NODE) {
- // undo libxml's special treatment of <script> and <style> tags
- $last = end($tokens);
- $data = $node->data;
- // (note $node->tagname is already normalized)
- if ($last instanceof HTMLPurifier_Token_Start && ($last->name == 'script' || $last->name == 'style')) {
- $new_data = trim($data);
- if (substr($new_data, 0, 4) === '<!--') {
- $data = substr($new_data, 4);
- if (substr($data, -3) === '-->') {
- $data = substr($data, 0, -3);
- } else {
- // Highly suspicious! Not sure what to do...
- }
- }
- }
- $tokens[] = $this->factory->createText($this->parseData($data));
- return false;
- } elseif ($node->nodeType === XML_COMMENT_NODE) {
- // this is code is only invoked for comments in script/style in versions
- // of libxml pre-2.6.28 (regular comments, of course, are still
- // handled regularly)
- $tokens[] = $this->factory->createComment($node->data);
- return false;
- } elseif ($node->nodeType !== XML_ELEMENT_NODE) {
- // not-well tested: there may be other nodes we have to grab
- return false;
- }
-
- $attr = $node->hasAttributes() ? $this->transformAttrToAssoc($node->attributes) : array();
-
- // We still have to make sure that the element actually IS empty
- if (!$node->childNodes->length) {
- if ($collect) {
- $tokens[] = $this->factory->createEmpty($node->tagName, $attr);
- }
- return false;
- } else {
- if ($collect) {
- $tokens[] = $this->factory->createStart(
- $tag_name = $node->tagName, // somehow, it get's dropped
- $attr
- );
- }
- return true;
- }
- }
-
- /**
- * @param DOMNode $node
- * @param HTMLPurifier_Token[] $tokens
- */
- protected function createEndNode($node, &$tokens)
- {
- $tokens[] = $this->factory->createEnd($node->tagName);
- }
-
-
- /**
- * Converts a DOMNamedNodeMap of DOMAttr objects into an assoc array.
- *
- * @param DOMNamedNodeMap $node_map DOMNamedNodeMap of DOMAttr objects.
- * @return array Associative array of attributes.
- */
- protected function transformAttrToAssoc($node_map)
- {
- // NamedNodeMap is documented very well, so we're using undocumented
- // features, namely, the fact that it implements Iterator and
- // has a ->length attribute
- if ($node_map->length === 0) {
- return array();
- }
- $array = array();
- foreach ($node_map as $attr) {
- $array[$attr->name] = $attr->value;
- }
- return $array;
- }
-
- /**
- * An error handler that mutes all errors
- * @param int $errno
- * @param string $errstr
- */
- public function muteErrorHandler($errno, $errstr)
- {
- }
-
- /**
- * Callback function for undoing escaping of stray angled brackets
- * in comments
- * @param array $matches
- * @return string
- */
- public function callbackUndoCommentSubst($matches)
- {
- return '<!--' . strtr($matches[1], array('&amp;' => '&', '&lt;' => '<')) . $matches[2];
- }
-
- /**
- * Callback function that entity-izes ampersands in comments so that
- * callbackUndoCommentSubst doesn't clobber them
- * @param array $matches
- * @return string
- */
- public function callbackArmorCommentEntities($matches)
- {
- return '<!--' . str_replace('&', '&amp;', $matches[1]) . $matches[2];
- }
-
- /**
- * Wraps an HTML fragment in the necessary HTML
- * @param string $html
- * @param HTMLPurifier_Config $config
- * @param HTMLPurifier_Context $context
- * @return string
- */
- protected function wrapHTML($html, $config, $context)
- {
- $def = $config->getDefinition('HTML');
- $ret = '';
-
- if (!empty($def->doctype->dtdPublic) || !empty($def->doctype->dtdSystem)) {
- $ret .= '<!DOCTYPE html ';
- if (!empty($def->doctype->dtdPublic)) {
- $ret .= 'PUBLIC "' . $def->doctype->dtdPublic . '" ';
- }
- if (!empty($def->doctype->dtdSystem)) {
- $ret .= '"' . $def->doctype->dtdSystem . '" ';
- }
- $ret .= '>';
- }
-
- $ret .= '<html><head>';
- $ret .= '<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />';
- // No protection if $html contains a stray </div>!
- $ret .= '</head><body><div>' . $html . '</div></body></html>';
- return $ret;
- }
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/Lexer/DirectLex.php b/library/HTMLPurifier/Lexer/DirectLex.php
deleted file mode 100644
index 746b6e315..000000000
--- a/library/HTMLPurifier/Lexer/DirectLex.php
+++ /dev/null
@@ -1,539 +0,0 @@
-<?php
-
-/**
- * Our in-house implementation of a parser.
- *
- * A pure PHP parser, DirectLex has absolutely no dependencies, making
- * it a reasonably good default for PHP4. Written with efficiency in mind,
- * it can be four times faster than HTMLPurifier_Lexer_PEARSax3, although it
- * pales in comparison to HTMLPurifier_Lexer_DOMLex.
- *
- * @todo Reread XML spec and document differences.
- */
-class HTMLPurifier_Lexer_DirectLex extends HTMLPurifier_Lexer
-{
- /**
- * @type bool
- */
- public $tracksLineNumbers = true;
-
- /**
- * Whitespace characters for str(c)spn.
- * @type string
- */
- protected $_whitespace = "\x20\x09\x0D\x0A";
-
- /**
- * Callback function for script CDATA fudge
- * @param array $matches, in form of array(opening tag, contents, closing tag)
- * @return string
- */
- protected function scriptCallback($matches)
- {
- return $matches[1] . htmlspecialchars($matches[2], ENT_COMPAT, 'UTF-8') . $matches[3];
- }
-
- /**
- * @param String $html
- * @param HTMLPurifier_Config $config
- * @param HTMLPurifier_Context $context
- * @return array|HTMLPurifier_Token[]
- */
- public function tokenizeHTML($html, $config, $context)
- {
- // special normalization for script tags without any armor
- // our "armor" heurstic is a < sign any number of whitespaces after
- // the first script tag
- if ($config->get('HTML.Trusted')) {
- $html = preg_replace_callback(
- '#(<script[^>]*>)(\s*[^<].+?)(</script>)#si',
- array($this, 'scriptCallback'),
- $html
- );
- }
-
- $html = $this->normalize($html, $config, $context);
-
- $cursor = 0; // our location in the text
- $inside_tag = false; // whether or not we're parsing the inside of a tag
- $array = array(); // result array
-
- // This is also treated to mean maintain *column* numbers too
- $maintain_line_numbers = $config->get('Core.MaintainLineNumbers');
-
- if ($maintain_line_numbers === null) {
- // automatically determine line numbering by checking
- // if error collection is on
- $maintain_line_numbers = $config->get('Core.CollectErrors');
- }
-
- if ($maintain_line_numbers) {
- $current_line = 1;
- $current_col = 0;
- $length = strlen($html);
- } else {
- $current_line = false;
- $current_col = false;
- $length = false;
- }
- $context->register('CurrentLine', $current_line);
- $context->register('CurrentCol', $current_col);
- $nl = "\n";
- // how often to manually recalculate. This will ALWAYS be right,
- // but it's pretty wasteful. Set to 0 to turn off
- $synchronize_interval = $config->get('Core.DirectLexLineNumberSyncInterval');
-
- $e = false;
- if ($config->get('Core.CollectErrors')) {
- $e =& $context->get('ErrorCollector');
- }
-
- // for testing synchronization
- $loops = 0;
-
- while (++$loops) {
- // $cursor is either at the start of a token, or inside of
- // a tag (i.e. there was a < immediately before it), as indicated
- // by $inside_tag
-
- if ($maintain_line_numbers) {
- // $rcursor, however, is always at the start of a token.
- $rcursor = $cursor - (int)$inside_tag;
-
- // Column number is cheap, so we calculate it every round.
- // We're interested at the *end* of the newline string, so
- // we need to add strlen($nl) == 1 to $nl_pos before subtracting it
- // from our "rcursor" position.
- $nl_pos = strrpos($html, $nl, $rcursor - $length);
- $current_col = $rcursor - (is_bool($nl_pos) ? 0 : $nl_pos + 1);
-
- // recalculate lines
- if ($synchronize_interval && // synchronization is on
- $cursor > 0 && // cursor is further than zero
- $loops % $synchronize_interval === 0) { // time to synchronize!
- $current_line = 1 + $this->substrCount($html, $nl, 0, $cursor);
- }
- }
-
- $position_next_lt = strpos($html, '<', $cursor);
- $position_next_gt = strpos($html, '>', $cursor);
-
- // triggers on "<b>asdf</b>" but not "asdf <b></b>"
- // special case to set up context
- if ($position_next_lt === $cursor) {
- $inside_tag = true;
- $cursor++;
- }
-
- if (!$inside_tag && $position_next_lt !== false) {
- // We are not inside tag and there still is another tag to parse
- $token = new
- HTMLPurifier_Token_Text(
- $this->parseData(
- substr(
- $html,
- $cursor,
- $position_next_lt - $cursor
- )
- )
- );
- if ($maintain_line_numbers) {
- $token->rawPosition($current_line, $current_col);
- $current_line += $this->substrCount($html, $nl, $cursor, $position_next_lt - $cursor);
- }
- $array[] = $token;
- $cursor = $position_next_lt + 1;
- $inside_tag = true;
- continue;
- } elseif (!$inside_tag) {
- // We are not inside tag but there are no more tags
- // If we're already at the end, break
- if ($cursor === strlen($html)) {
- break;
- }
- // Create Text of rest of string
- $token = new
- HTMLPurifier_Token_Text(
- $this->parseData(
- substr(
- $html,
- $cursor
- )
- )
- );
- if ($maintain_line_numbers) {
- $token->rawPosition($current_line, $current_col);
- }
- $array[] = $token;
- break;
- } elseif ($inside_tag && $position_next_gt !== false) {
- // We are in tag and it is well formed
- // Grab the internals of the tag
- $strlen_segment = $position_next_gt - $cursor;
-
- if ($strlen_segment < 1) {
- // there's nothing to process!
- $token = new HTMLPurifier_Token_Text('<');
- $cursor++;
- continue;
- }
-
- $segment = substr($html, $cursor, $strlen_segment);
-
- if ($segment === false) {
- // somehow, we attempted to access beyond the end of
- // the string, defense-in-depth, reported by Nate Abele
- break;
- }
-
- // Check if it's a comment
- if (substr($segment, 0, 3) === '!--') {
- // re-determine segment length, looking for -->
- $position_comment_end = strpos($html, '-->', $cursor);
- if ($position_comment_end === false) {
- // uh oh, we have a comment that extends to
- // infinity. Can't be helped: set comment
- // end position to end of string
- if ($e) {
- $e->send(E_WARNING, 'Lexer: Unclosed comment');
- }
- $position_comment_end = strlen($html);
- $end = true;
- } else {
- $end = false;
- }
- $strlen_segment = $position_comment_end - $cursor;
- $segment = substr($html, $cursor, $strlen_segment);
- $token = new
- HTMLPurifier_Token_Comment(
- substr(
- $segment,
- 3,
- $strlen_segment - 3
- )
- );
- if ($maintain_line_numbers) {
- $token->rawPosition($current_line, $current_col);
- $current_line += $this->substrCount($html, $nl, $cursor, $strlen_segment);
- }
- $array[] = $token;
- $cursor = $end ? $position_comment_end : $position_comment_end + 3;
- $inside_tag = false;
- continue;
- }
-
- // Check if it's an end tag
- $is_end_tag = (strpos($segment, '/') === 0);
- if ($is_end_tag) {
- $type = substr($segment, 1);
- $token = new HTMLPurifier_Token_End($type);
- if ($maintain_line_numbers) {
- $token->rawPosition($current_line, $current_col);
- $current_line += $this->substrCount($html, $nl, $cursor, $position_next_gt - $cursor);
- }
- $array[] = $token;
- $inside_tag = false;
- $cursor = $position_next_gt + 1;
- continue;
- }
-
- // Check leading character is alnum, if not, we may
- // have accidently grabbed an emoticon. Translate into
- // text and go our merry way
- if (!ctype_alpha($segment[0])) {
- // XML: $segment[0] !== '_' && $segment[0] !== ':'
- if ($e) {
- $e->send(E_NOTICE, 'Lexer: Unescaped lt');
- }
- $token = new HTMLPurifier_Token_Text('<');
- if ($maintain_line_numbers) {
- $token->rawPosition($current_line, $current_col);
- $current_line += $this->substrCount($html, $nl, $cursor, $position_next_gt - $cursor);
- }
- $array[] = $token;
- $inside_tag = false;
- continue;
- }
-
- // Check if it is explicitly self closing, if so, remove
- // trailing slash. Remember, we could have a tag like <br>, so
- // any later token processing scripts must convert improperly
- // classified EmptyTags from StartTags.
- $is_self_closing = (strrpos($segment, '/') === $strlen_segment - 1);
- if ($is_self_closing) {
- $strlen_segment--;
- $segment = substr($segment, 0, $strlen_segment);
- }
-
- // Check if there are any attributes
- $position_first_space = strcspn($segment, $this->_whitespace);
-
- if ($position_first_space >= $strlen_segment) {
- if ($is_self_closing) {
- $token = new HTMLPurifier_Token_Empty($segment);
- } else {
- $token = new HTMLPurifier_Token_Start($segment);
- }
- if ($maintain_line_numbers) {
- $token->rawPosition($current_line, $current_col);
- $current_line += $this->substrCount($html, $nl, $cursor, $position_next_gt - $cursor);
- }
- $array[] = $token;
- $inside_tag = false;
- $cursor = $position_next_gt + 1;
- continue;
- }
-
- // Grab out all the data
- $type = substr($segment, 0, $position_first_space);
- $attribute_string =
- trim(
- substr(
- $segment,
- $position_first_space
- )
- );
- if ($attribute_string) {
- $attr = $this->parseAttributeString(
- $attribute_string,
- $config,
- $context
- );
- } else {
- $attr = array();
- }
-
- if ($is_self_closing) {
- $token = new HTMLPurifier_Token_Empty($type, $attr);
- } else {
- $token = new HTMLPurifier_Token_Start($type, $attr);
- }
- if ($maintain_line_numbers) {
- $token->rawPosition($current_line, $current_col);
- $current_line += $this->substrCount($html, $nl, $cursor, $position_next_gt - $cursor);
- }
- $array[] = $token;
- $cursor = $position_next_gt + 1;
- $inside_tag = false;
- continue;
- } else {
- // inside tag, but there's no ending > sign
- if ($e) {
- $e->send(E_WARNING, 'Lexer: Missing gt');
- }
- $token = new
- HTMLPurifier_Token_Text(
- '<' .
- $this->parseData(
- substr($html, $cursor)
- )
- );
- if ($maintain_line_numbers) {
- $token->rawPosition($current_line, $current_col);
- }
- // no cursor scroll? Hmm...
- $array[] = $token;
- break;
- }
- break;
- }
-
- $context->destroy('CurrentLine');
- $context->destroy('CurrentCol');
- return $array;
- }
-
- /**
- * PHP 5.0.x compatible substr_count that implements offset and length
- * @param string $haystack
- * @param string $needle
- * @param int $offset
- * @param int $length
- * @return int
- */
- protected function substrCount($haystack, $needle, $offset, $length)
- {
- static $oldVersion;
- if ($oldVersion === null) {
- $oldVersion = version_compare(PHP_VERSION, '5.1', '<');
- }
- if ($oldVersion) {
- $haystack = substr($haystack, $offset, $length);
- return substr_count($haystack, $needle);
- } else {
- return substr_count($haystack, $needle, $offset, $length);
- }
- }
-
- /**
- * Takes the inside of an HTML tag and makes an assoc array of attributes.
- *
- * @param string $string Inside of tag excluding name.
- * @param HTMLPurifier_Config $config
- * @param HTMLPurifier_Context $context
- * @return array Assoc array of attributes.
- */
- public function parseAttributeString($string, $config, $context)
- {
- $string = (string)$string; // quick typecast
-
- if ($string == '') {
- return array();
- } // no attributes
-
- $e = false;
- if ($config->get('Core.CollectErrors')) {
- $e =& $context->get('ErrorCollector');
- }
-
- // let's see if we can abort as quickly as possible
- // one equal sign, no spaces => one attribute
- $num_equal = substr_count($string, '=');
- $has_space = strpos($string, ' ');
- if ($num_equal === 0 && !$has_space) {
- // bool attribute
- return array($string => $string);
- } elseif ($num_equal === 1 && !$has_space) {
- // only one attribute
- list($key, $quoted_value) = explode('=', $string);
- $quoted_value = trim($quoted_value);
- if (!$key) {
- if ($e) {
- $e->send(E_ERROR, 'Lexer: Missing attribute key');
- }
- return array();
- }
- if (!$quoted_value) {
- return array($key => '');
- }
- $first_char = @$quoted_value[0];
- $last_char = @$quoted_value[strlen($quoted_value) - 1];
-
- $same_quote = ($first_char == $last_char);
- $open_quote = ($first_char == '"' || $first_char == "'");
-
- if ($same_quote && $open_quote) {
- // well behaved
- $value = substr($quoted_value, 1, strlen($quoted_value) - 2);
- } else {
- // not well behaved
- if ($open_quote) {
- if ($e) {
- $e->send(E_ERROR, 'Lexer: Missing end quote');
- }
- $value = substr($quoted_value, 1);
- } else {
- $value = $quoted_value;
- }
- }
- if ($value === false) {
- $value = '';
- }
- return array($key => $this->parseData($value));
- }
-
- // setup loop environment
- $array = array(); // return assoc array of attributes
- $cursor = 0; // current position in string (moves forward)
- $size = strlen($string); // size of the string (stays the same)
-
- // if we have unquoted attributes, the parser expects a terminating
- // space, so let's guarantee that there's always a terminating space.
- $string .= ' ';
-
- $old_cursor = -1;
- while ($cursor < $size) {
- if ($old_cursor >= $cursor) {
- throw new Exception("Infinite loop detected");
- }
- $old_cursor = $cursor;
-
- $cursor += ($value = strspn($string, $this->_whitespace, $cursor));
- // grab the key
-
- $key_begin = $cursor; //we're currently at the start of the key
-
- // scroll past all characters that are the key (not whitespace or =)
- $cursor += strcspn($string, $this->_whitespace . '=', $cursor);
-
- $key_end = $cursor; // now at the end of the key
-
- $key = substr($string, $key_begin, $key_end - $key_begin);
-
- if (!$key) {
- if ($e) {
- $e->send(E_ERROR, 'Lexer: Missing attribute key');
- }
- $cursor += 1 + strcspn($string, $this->_whitespace, $cursor + 1); // prevent infinite loop
- continue; // empty key
- }
-
- // scroll past all whitespace
- $cursor += strspn($string, $this->_whitespace, $cursor);
-
- if ($cursor >= $size) {
- $array[$key] = $key;
- break;
- }
-
- // if the next character is an equal sign, we've got a regular
- // pair, otherwise, it's a bool attribute
- $first_char = @$string[$cursor];
-
- if ($first_char == '=') {
- // key="value"
-
- $cursor++;
- $cursor += strspn($string, $this->_whitespace, $cursor);
-
- if ($cursor === false) {
- $array[$key] = '';
- break;
- }
-
- // we might be in front of a quote right now
-
- $char = @$string[$cursor];
-
- if ($char == '"' || $char == "'") {
- // it's quoted, end bound is $char
- $cursor++;
- $value_begin = $cursor;
- $cursor = strpos($string, $char, $cursor);
- $value_end = $cursor;
- } else {
- // it's not quoted, end bound is whitespace
- $value_begin = $cursor;
- $cursor += strcspn($string, $this->_whitespace, $cursor);
- $value_end = $cursor;
- }
-
- // we reached a premature end
- if ($cursor === false) {
- $cursor = $size;
- $value_end = $cursor;
- }
-
- $value = substr($string, $value_begin, $value_end - $value_begin);
- if ($value === false) {
- $value = '';
- }
- $array[$key] = $this->parseData($value);
- $cursor++;
- } else {
- // boolattr
- if ($key !== '') {
- $array[$key] = $key;
- } else {
- // purely theoretical
- if ($e) {
- $e->send(E_ERROR, 'Lexer: Missing attribute key');
- }
- }
- }
- }
- return $array;
- }
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/Lexer/PH5P.php b/library/HTMLPurifier/Lexer/PH5P.php
deleted file mode 100644
index a4587e4cd..000000000
--- a/library/HTMLPurifier/Lexer/PH5P.php
+++ /dev/null
@@ -1,4788 +0,0 @@
-<?php
-
-/**
- * Experimental HTML5-based parser using Jeroen van der Meer's PH5P library.
- * Occupies space in the HTML5 pseudo-namespace, which may cause conflicts.
- *
- * @note
- * Recent changes to PHP's DOM extension have resulted in some fatal
- * error conditions with the original version of PH5P. Pending changes,
- * this lexer will punt to DirectLex if DOM throws an exception.
- */
-
-class HTMLPurifier_Lexer_PH5P extends HTMLPurifier_Lexer_DOMLex
-{
- /**
- * @param string $html
- * @param HTMLPurifier_Config $config
- * @param HTMLPurifier_Context $context
- * @return HTMLPurifier_Token[]
- */
- public function tokenizeHTML($html, $config, $context)
- {
- $new_html = $this->normalize($html, $config, $context);
- $new_html = $this->wrapHTML($new_html, $config, $context);
- try {
- $parser = new HTML5($new_html);
- $doc = $parser->save();
- } catch (DOMException $e) {
- // Uh oh, it failed. Punt to DirectLex.
- $lexer = new HTMLPurifier_Lexer_DirectLex();
- $context->register('PH5PError', $e); // save the error, so we can detect it
- return $lexer->tokenizeHTML($html, $config, $context); // use original HTML
- }
- $tokens = array();
- $this->tokenizeDOM(
- $doc->getElementsByTagName('html')->item(0)-> // <html>
- getElementsByTagName('body')->item(0)-> // <body>
- getElementsByTagName('div')->item(0) // <div>
- ,
- $tokens
- );
- return $tokens;
- }
-}
-
-/*
-
-Copyright 2007 Jeroen van der Meer <http://jero.net/>
-
-Permission is hereby granted, free of charge, to any person obtaining a
-copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be included
-in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-*/
-
-class HTML5
-{
- private $data;
- private $char;
- private $EOF;
- private $state;
- private $tree;
- private $token;
- private $content_model;
- private $escape = false;
- private $entities = array(
- 'AElig;',
- 'AElig',
- 'AMP;',
- 'AMP',
- 'Aacute;',
- 'Aacute',
- 'Acirc;',
- 'Acirc',
- 'Agrave;',
- 'Agrave',
- 'Alpha;',
- 'Aring;',
- 'Aring',
- 'Atilde;',
- 'Atilde',
- 'Auml;',
- 'Auml',
- 'Beta;',
- 'COPY;',
- 'COPY',
- 'Ccedil;',
- 'Ccedil',
- 'Chi;',
- 'Dagger;',
- 'Delta;',
- 'ETH;',
- 'ETH',
- 'Eacute;',
- 'Eacute',
- 'Ecirc;',
- 'Ecirc',
- 'Egrave;',
- 'Egrave',
- 'Epsilon;',
- 'Eta;',
- 'Euml;',
- 'Euml',
- 'GT;',
- 'GT',
- 'Gamma;',
- 'Iacute;',
- 'Iacute',
- 'Icirc;',
- 'Icirc',
- 'Igrave;',
- 'Igrave',
- 'Iota;',
- 'Iuml;',
- 'Iuml',
- 'Kappa;',
- 'LT;',
- 'LT',
- 'Lambda;',
- 'Mu;',
- 'Ntilde;',
- 'Ntilde',
- 'Nu;',
- 'OElig;',
- 'Oacute;',
- 'Oacute',
- 'Ocirc;',
- 'Ocirc',
- 'Ograve;',
- 'Ograve',
- 'Omega;',
- 'Omicron;',
- 'Oslash;',
- 'Oslash',
- 'Otilde;',
- 'Otilde',
- 'Ouml;',
- 'Ouml',
- 'Phi;',
- 'Pi;',
- 'Prime;',
- 'Psi;',
- 'QUOT;',
- 'QUOT',
- 'REG;',
- 'REG',
- 'Rho;',
- 'Scaron;',
- 'Sigma;',
- 'THORN;',
- 'THORN',
- 'TRADE;',
- 'Tau;',
- 'Theta;',
- 'Uacute;',
- 'Uacute',
- 'Ucirc;',
- 'Ucirc',
- 'Ugrave;',
- 'Ugrave',
- 'Upsilon;',
- 'Uuml;',
- 'Uuml',
- 'Xi;',
- 'Yacute;',
- 'Yacute',
- 'Yuml;',
- 'Zeta;',
- 'aacute;',
- 'aacute',
- 'acirc;',
- 'acirc',
- 'acute;',
- 'acute',
- 'aelig;',
- 'aelig',
- 'agrave;',
- 'agrave',
- 'alefsym;',
- 'alpha;',
- 'amp;',
- 'amp',
- 'and;',
- 'ang;',
- 'apos;',
- 'aring;',
- 'aring',
- 'asymp;',
- 'atilde;',
- 'atilde',
- 'auml;',
- 'auml',
- 'bdquo;',
- 'beta;',
- 'brvbar;',
- 'brvbar',
- 'bull;',
- 'cap;',
- 'ccedil;',
- 'ccedil',
- 'cedil;',
- 'cedil',
- 'cent;',
- 'cent',
- 'chi;',
- 'circ;',
- 'clubs;',
- 'cong;',
- 'copy;',
- 'copy',
- 'crarr;',
- 'cup;',
- 'curren;',
- 'curren',
- 'dArr;',
- 'dagger;',
- 'darr;',
- 'deg;',
- 'deg',
- 'delta;',
- 'diams;',
- 'divide;',
- 'divide',
- 'eacute;',
- 'eacute',
- 'ecirc;',
- 'ecirc',
- 'egrave;',
- 'egrave',
- 'empty;',
- 'emsp;',
- 'ensp;',
- 'epsilon;',
- 'equiv;',
- 'eta;',
- 'eth;',
- 'eth',
- 'euml;',
- 'euml',
- 'euro;',
- 'exist;',
- 'fnof;',
- 'forall;',
- 'frac12;',
- 'frac12',
- 'frac14;',
- 'frac14',
- 'frac34;',
- 'frac34',
- 'frasl;',
- 'gamma;',
- 'ge;',
- 'gt;',
- 'gt',
- 'hArr;',
- 'harr;',
- 'hearts;',
- 'hellip;',
- 'iacute;',
- 'iacute',
- 'icirc;',
- 'icirc',
- 'iexcl;',
- 'iexcl',
- 'igrave;',
- 'igrave',
- 'image;',
- 'infin;',
- 'int;',
- 'iota;',
- 'iquest;',
- 'iquest',
- 'isin;',
- 'iuml;',
- 'iuml',
- 'kappa;',
- 'lArr;',
- 'lambda;',
- 'lang;',
- 'laquo;',
- 'laquo',
- 'larr;',
- 'lceil;',
- 'ldquo;',
- 'le;',
- 'lfloor;',
- 'lowast;',
- 'loz;',
- 'lrm;',
- 'lsaquo;',
- 'lsquo;',
- 'lt;',
- 'lt',
- 'macr;',
- 'macr',
- 'mdash;',
- 'micro;',
- 'micro',
- 'middot;',
- 'middot',
- 'minus;',
- 'mu;',
- 'nabla;',
- 'nbsp;',
- 'nbsp',
- 'ndash;',
- 'ne;',
- 'ni;',
- 'not;',
- 'not',
- 'notin;',
- 'nsub;',
- 'ntilde;',
- 'ntilde',
- 'nu;',
- 'oacute;',
- 'oacute',
- 'ocirc;',
- 'ocirc',
- 'oelig;',
- 'ograve;',
- 'ograve',
- 'oline;',
- 'omega;',
- 'omicron;',
- 'oplus;',
- 'or;',
- 'ordf;',
- 'ordf',
- 'ordm;',
- 'ordm',
- 'oslash;',
- 'oslash',
- 'otilde;',
- 'otilde',
- 'otimes;',
- 'ouml;',
- 'ouml',
- 'para;',
- 'para',
- 'part;',
- 'permil;',
- 'perp;',
- 'phi;',
- 'pi;',
- 'piv;',
- 'plusmn;',
- 'plusmn',
- 'pound;',
- 'pound',
- 'prime;',
- 'prod;',
- 'prop;',
- 'psi;',
- 'quot;',
- 'quot',
- 'rArr;',
- 'radic;',
- 'rang;',
- 'raquo;',
- 'raquo',
- 'rarr;',
- 'rceil;',
- 'rdquo;',
- 'real;',
- 'reg;',
- 'reg',
- 'rfloor;',
- 'rho;',
- 'rlm;',
- 'rsaquo;',
- 'rsquo;',
- 'sbquo;',
- 'scaron;',
- 'sdot;',
- 'sect;',
- 'sect',
- 'shy;',
- 'shy',
- 'sigma;',
- 'sigmaf;',
- 'sim;',
- 'spades;',
- 'sub;',
- 'sube;',
- 'sum;',
- 'sup1;',
- 'sup1',
- 'sup2;',
- 'sup2',
- 'sup3;',
- 'sup3',
- 'sup;',
- 'supe;',
- 'szlig;',
- 'szlig',
- 'tau;',
- 'there4;',
- 'theta;',
- 'thetasym;',
- 'thinsp;',
- 'thorn;',
- 'thorn',
- 'tilde;',
- 'times;',
- 'times',
- 'trade;',
- 'uArr;',
- 'uacute;',
- 'uacute',
- 'uarr;',
- 'ucirc;',
- 'ucirc',
- 'ugrave;',
- 'ugrave',
- 'uml;',
- 'uml',
- 'upsih;',
- 'upsilon;',
- 'uuml;',
- 'uuml',
- 'weierp;',
- 'xi;',
- 'yacute;',
- 'yacute',
- 'yen;',
- 'yen',
- 'yuml;',
- 'yuml',
- 'zeta;',
- 'zwj;',
- 'zwnj;'
- );
-
- const PCDATA = 0;
- const RCDATA = 1;
- const CDATA = 2;
- const PLAINTEXT = 3;
-
- const DOCTYPE = 0;
- const STARTTAG = 1;
- const ENDTAG = 2;
- const COMMENT = 3;
- const CHARACTR = 4;
- const EOF = 5;
-
- public function __construct($data)
- {
- $this->data = $data;
- $this->char = -1;
- $this->EOF = strlen($data);
- $this->tree = new HTML5TreeConstructer;
- $this->content_model = self::PCDATA;
-
- $this->state = 'data';
-
- while ($this->state !== null) {
- $this->{$this->state . 'State'}();
- }
- }
-
- public function save()
- {
- return $this->tree->save();
- }
-
- private function char()
- {
- return ($this->char < $this->EOF)
- ? $this->data[$this->char]
- : false;
- }
-
- private function character($s, $l = 0)
- {
- if ($s + $l < $this->EOF) {
- if ($l === 0) {
- return $this->data[$s];
- } else {
- return substr($this->data, $s, $l);
- }
- }
- }
-
- private function characters($char_class, $start)
- {
- return preg_replace('#^([' . $char_class . ']+).*#s', '\\1', substr($this->data, $start));
- }
-
- private function dataState()
- {
- // Consume the next input character
- $this->char++;
- $char = $this->char();
-
- if ($char === '&' && ($this->content_model === self::PCDATA || $this->content_model === self::RCDATA)) {
- /* U+0026 AMPERSAND (&)
- When the content model flag is set to one of the PCDATA or RCDATA
- states: switch to the entity data state. Otherwise: treat it as per
- the "anything else" entry below. */
- $this->state = 'entityData';
-
- } elseif ($char === '-') {
- /* If the content model flag is set to either the RCDATA state or
- the CDATA state, and the escape flag is false, and there are at
- least three characters before this one in the input stream, and the
- last four characters in the input stream, including this one, are
- U+003C LESS-THAN SIGN, U+0021 EXCLAMATION MARK, U+002D HYPHEN-MINUS,
- and U+002D HYPHEN-MINUS ("<!--"), then set the escape flag to true. */
- if (($this->content_model === self::RCDATA || $this->content_model ===
- self::CDATA) && $this->escape === false &&
- $this->char >= 3 && $this->character($this->char - 4, 4) === '<!--'
- ) {
- $this->escape = true;
- }
-
- /* In any case, emit the input character as a character token. Stay
- in the data state. */
- $this->emitToken(
- array(
- 'type' => self::CHARACTR,
- 'data' => $char
- )
- );
-
- /* U+003C LESS-THAN SIGN (<) */
- } elseif ($char === '<' && ($this->content_model === self::PCDATA ||
- (($this->content_model === self::RCDATA ||
- $this->content_model === self::CDATA) && $this->escape === false))
- ) {
- /* When the content model flag is set to the PCDATA state: switch
- to the tag open state.
-
- When the content model flag is set to either the RCDATA state or
- the CDATA state and the escape flag is false: switch to the tag
- open state.
-
- Otherwise: treat it as per the "anything else" entry below. */
- $this->state = 'tagOpen';
-
- /* U+003E GREATER-THAN SIGN (>) */
- } elseif ($char === '>') {
- /* If the content model flag is set to either the RCDATA state or
- the CDATA state, and the escape flag is true, and the last three
- characters in the input stream including this one are U+002D
- HYPHEN-MINUS, U+002D HYPHEN-MINUS, U+003E GREATER-THAN SIGN ("-->"),
- set the escape flag to false. */
- if (($this->content_model === self::RCDATA ||
- $this->content_model === self::CDATA) && $this->escape === true &&
- $this->character($this->char, 3) === '-->'
- ) {
- $this->escape = false;
- }
-
- /* In any case, emit the input character as a character token.
- Stay in the data state. */
- $this->emitToken(
- array(
- 'type' => self::CHARACTR,
- 'data' => $char
- )
- );
-
- } elseif ($this->char === $this->EOF) {
- /* EOF
- Emit an end-of-file token. */
- $this->EOF();
-
- } elseif ($this->content_model === self::PLAINTEXT) {
- /* When the content model flag is set to the PLAINTEXT state
- THIS DIFFERS GREATLY FROM THE SPEC: Get the remaining characters of
- the text and emit it as a character token. */
- $this->emitToken(
- array(
- 'type' => self::CHARACTR,
- 'data' => substr($this->data, $this->char)
- )
- );
-
- $this->EOF();
-
- } else {
- /* Anything else
- THIS DIFFERS GREATLY FROM THE SPEC: Get as many character that
- otherwise would also be treated as a character token and emit it
- as a single character token. Stay in the data state. */
- $len = strcspn($this->data, '<&', $this->char);
- $char = substr($this->data, $this->char, $len);
- $this->char += $len - 1;
-
- $this->emitToken(
- array(
- 'type' => self::CHARACTR,
- 'data' => $char
- )
- );
-
- $this->state = 'data';
- }
- }
-
- private function entityDataState()
- {
- // Attempt to consume an entity.
- $entity = $this->entity();
-
- // If nothing is returned, emit a U+0026 AMPERSAND character token.
- // Otherwise, emit the character token that was returned.
- $char = (!$entity) ? '&' : $entity;
- $this->emitToken(
- array(
- 'type' => self::CHARACTR,
- 'data' => $char
- )
- );
-
- // Finally, switch to the data state.
- $this->state = 'data';
- }
-
- private function tagOpenState()
- {
- switch ($this->content_model) {
- case self::RCDATA:
- case self::CDATA:
- /* If the next input character is a U+002F SOLIDUS (/) character,
- consume it and switch to the close tag open state. If the next
- input character is not a U+002F SOLIDUS (/) character, emit a
- U+003C LESS-THAN SIGN character token and switch to the data
- state to process the next input character. */
- if ($this->character($this->char + 1) === '/') {
- $this->char++;
- $this->state = 'closeTagOpen';
-
- } else {
- $this->emitToken(
- array(
- 'type' => self::CHARACTR,
- 'data' => '<'
- )
- );
-
- $this->state = 'data';
- }
- break;
-
- case self::PCDATA:
- // If the content model flag is set to the PCDATA state
- // Consume the next input character:
- $this->char++;
- $char = $this->char();
-
- if ($char === '!') {
- /* U+0021 EXCLAMATION MARK (!)
- Switch to the markup declaration open state. */
- $this->state = 'markupDeclarationOpen';
-
- } elseif ($char === '/') {
- /* U+002F SOLIDUS (/)
- Switch to the close tag open state. */
- $this->state = 'closeTagOpen';
-
- } elseif (preg_match('/^[A-Za-z]$/', $char)) {
- /* U+0041 LATIN LETTER A through to U+005A LATIN LETTER Z
- Create a new start tag token, set its tag name to the lowercase
- version of the input character (add 0x0020 to the character's code
- point), then switch to the tag name state. (Don't emit the token
- yet; further details will be filled in before it is emitted.) */
- $this->token = array(
- 'name' => strtolower($char),
- 'type' => self::STARTTAG,
- 'attr' => array()
- );
-
- $this->state = 'tagName';
-
- } elseif ($char === '>') {
- /* U+003E GREATER-THAN SIGN (>)
- Parse error. Emit a U+003C LESS-THAN SIGN character token and a
- U+003E GREATER-THAN SIGN character token. Switch to the data state. */
- $this->emitToken(
- array(
- 'type' => self::CHARACTR,
- 'data' => '<>'
- )
- );
-
- $this->state = 'data';
-
- } elseif ($char === '?') {
- /* U+003F QUESTION MARK (?)
- Parse error. Switch to the bogus comment state. */
- $this->state = 'bogusComment';
-
- } else {
- /* Anything else
- Parse error. Emit a U+003C LESS-THAN SIGN character token and
- reconsume the current input character in the data state. */
- $this->emitToken(
- array(
- 'type' => self::CHARACTR,
- 'data' => '<'
- )
- );
-
- $this->char--;
- $this->state = 'data';
- }
- break;
- }
- }
-
- private function closeTagOpenState()
- {
- $next_node = strtolower($this->characters('A-Za-z', $this->char + 1));
- $the_same = count($this->tree->stack) > 0 && $next_node === end($this->tree->stack)->nodeName;
-
- if (($this->content_model === self::RCDATA || $this->content_model === self::CDATA) &&
- (!$the_same || ($the_same && (!preg_match(
- '/[\t\n\x0b\x0c >\/]/',
- $this->character($this->char + 1 + strlen($next_node))
- ) || $this->EOF === $this->char)))
- ) {
- /* If the content model flag is set to the RCDATA or CDATA states then
- examine the next few characters. If they do not match the tag name of
- the last start tag token emitted (case insensitively), or if they do but
- they are not immediately followed by one of the following characters:
- * U+0009 CHARACTER TABULATION
- * U+000A LINE FEED (LF)
- * U+000B LINE TABULATION
- * U+000C FORM FEED (FF)
- * U+0020 SPACE
- * U+003E GREATER-THAN SIGN (>)
- * U+002F SOLIDUS (/)
- * EOF
- ...then there is a parse error. Emit a U+003C LESS-THAN SIGN character
- token, a U+002F SOLIDUS character token, and switch to the data state
- to process the next input character. */
- $this->emitToken(
- array(
- 'type' => self::CHARACTR,
- 'data' => '</'
- )
- );
-
- $this->state = 'data';
-
- } else {
- /* Otherwise, if the content model flag is set to the PCDATA state,
- or if the next few characters do match that tag name, consume the
- next input character: */
- $this->char++;
- $char = $this->char();
-
- if (preg_match('/^[A-Za-z]$/', $char)) {
- /* U+0041 LATIN LETTER A through to U+005A LATIN LETTER Z
- Create a new end tag token, set its tag name to the lowercase version
- of the input character (add 0x0020 to the character's code point), then
- switch to the tag name state. (Don't emit the token yet; further details
- will be filled in before it is emitted.) */
- $this->token = array(
- 'name' => strtolower($char),
- 'type' => self::ENDTAG
- );
-
- $this->state = 'tagName';
-
- } elseif ($char === '>') {
- /* U+003E GREATER-THAN SIGN (>)
- Parse error. Switch to the data state. */
- $this->state = 'data';
-
- } elseif ($this->char === $this->EOF) {
- /* EOF
- Parse error. Emit a U+003C LESS-THAN SIGN character token and a U+002F
- SOLIDUS character token. Reconsume the EOF character in the data state. */
- $this->emitToken(
- array(
- 'type' => self::CHARACTR,
- 'data' => '</'
- )
- );
-
- $this->char--;
- $this->state = 'data';
-
- } else {
- /* Parse error. Switch to the bogus comment state. */
- $this->state = 'bogusComment';
- }
- }
- }
-
- private function tagNameState()
- {
- // Consume the next input character:
- $this->char++;
- $char = $this->character($this->char);
-
- if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
- /* U+0009 CHARACTER TABULATION
- U+000A LINE FEED (LF)
- U+000B LINE TABULATION
- U+000C FORM FEED (FF)
- U+0020 SPACE
- Switch to the before attribute name state. */
- $this->state = 'beforeAttributeName';
-
- } elseif ($char === '>') {
- /* U+003E GREATER-THAN SIGN (>)
- Emit the current tag token. Switch to the data state. */
- $this->emitToken($this->token);
- $this->state = 'data';
-
- } elseif ($this->char === $this->EOF) {
- /* EOF
- Parse error. Emit the current tag token. Reconsume the EOF
- character in the data state. */
- $this->emitToken($this->token);
-
- $this->char--;
- $this->state = 'data';
-
- } elseif ($char === '/') {
- /* U+002F SOLIDUS (/)
- Parse error unless this is a permitted slash. Switch to the before
- attribute name state. */
- $this->state = 'beforeAttributeName';
-
- } else {
- /* Anything else
- Append the current input character to the current tag token's tag name.
- Stay in the tag name state. */
- $this->token['name'] .= strtolower($char);
- $this->state = 'tagName';
- }
- }
-
- private function beforeAttributeNameState()
- {
- // Consume the next input character:
- $this->char++;
- $char = $this->character($this->char);
-
- if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
- /* U+0009 CHARACTER TABULATION
- U+000A LINE FEED (LF)
- U+000B LINE TABULATION
- U+000C FORM FEED (FF)
- U+0020 SPACE
- Stay in the before attribute name state. */
- $this->state = 'beforeAttributeName';
-
- } elseif ($char === '>') {
- /* U+003E GREATER-THAN SIGN (>)
- Emit the current tag token. Switch to the data state. */
- $this->emitToken($this->token);
- $this->state = 'data';
-
- } elseif ($char === '/') {
- /* U+002F SOLIDUS (/)
- Parse error unless this is a permitted slash. Stay in the before
- attribute name state. */
- $this->state = 'beforeAttributeName';
-
- } elseif ($this->char === $this->EOF) {
- /* EOF
- Parse error. Emit the current tag token. Reconsume the EOF
- character in the data state. */
- $this->emitToken($this->token);
-
- $this->char--;
- $this->state = 'data';
-
- } else {
- /* Anything else
- Start a new attribute in the current tag token. Set that attribute's
- name to the current input character, and its value to the empty string.
- Switch to the attribute name state. */
- $this->token['attr'][] = array(
- 'name' => strtolower($char),
- 'value' => null
- );
-
- $this->state = 'attributeName';
- }
- }
-
- private function attributeNameState()
- {
- // Consume the next input character:
- $this->char++;
- $char = $this->character($this->char);
-
- if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
- /* U+0009 CHARACTER TABULATION
- U+000A LINE FEED (LF)
- U+000B LINE TABULATION
- U+000C FORM FEED (FF)
- U+0020 SPACE
- Stay in the before attribute name state. */
- $this->state = 'afterAttributeName';
-
- } elseif ($char === '=') {
- /* U+003D EQUALS SIGN (=)
- Switch to the before attribute value state. */
- $this->state = 'beforeAttributeValue';
-
- } elseif ($char === '>') {
- /* U+003E GREATER-THAN SIGN (>)
- Emit the current tag token. Switch to the data state. */
- $this->emitToken($this->token);
- $this->state = 'data';
-
- } elseif ($char === '/' && $this->character($this->char + 1) !== '>') {
- /* U+002F SOLIDUS (/)
- Parse error unless this is a permitted slash. Switch to the before
- attribute name state. */
- $this->state = 'beforeAttributeName';
-
- } elseif ($this->char === $this->EOF) {
- /* EOF
- Parse error. Emit the current tag token. Reconsume the EOF
- character in the data state. */
- $this->emitToken($this->token);
-
- $this->char--;
- $this->state = 'data';
-
- } else {
- /* Anything else
- Append the current input character to the current attribute's name.
- Stay in the attribute name state. */
- $last = count($this->token['attr']) - 1;
- $this->token['attr'][$last]['name'] .= strtolower($char);
-
- $this->state = 'attributeName';
- }
- }
-
- private function afterAttributeNameState()
- {
- // Consume the next input character:
- $this->char++;
- $char = $this->character($this->char);
-
- if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
- /* U+0009 CHARACTER TABULATION
- U+000A LINE FEED (LF)
- U+000B LINE TABULATION
- U+000C FORM FEED (FF)
- U+0020 SPACE
- Stay in the after attribute name state. */
- $this->state = 'afterAttributeName';
-
- } elseif ($char === '=') {
- /* U+003D EQUALS SIGN (=)
- Switch to the before attribute value state. */
- $this->state = 'beforeAttributeValue';
-
- } elseif ($char === '>') {
- /* U+003E GREATER-THAN SIGN (>)
- Emit the current tag token. Switch to the data state. */
- $this->emitToken($this->token);
- $this->state = 'data';
-
- } elseif ($char === '/' && $this->character($this->char + 1) !== '>') {
- /* U+002F SOLIDUS (/)
- Parse error unless this is a permitted slash. Switch to the
- before attribute name state. */
- $this->state = 'beforeAttributeName';
-
- } elseif ($this->char === $this->EOF) {
- /* EOF
- Parse error. Emit the current tag token. Reconsume the EOF
- character in the data state. */
- $this->emitToken($this->token);
-
- $this->char--;
- $this->state = 'data';
-
- } else {
- /* Anything else
- Start a new attribute in the current tag token. Set that attribute's
- name to the current input character, and its value to the empty string.
- Switch to the attribute name state. */
- $this->token['attr'][] = array(
- 'name' => strtolower($char),
- 'value' => null
- );
-
- $this->state = 'attributeName';
- }
- }
-
- private function beforeAttributeValueState()
- {
- // Consume the next input character:
- $this->char++;
- $char = $this->character($this->char);
-
- if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
- /* U+0009 CHARACTER TABULATION
- U+000A LINE FEED (LF)
- U+000B LINE TABULATION
- U+000C FORM FEED (FF)
- U+0020 SPACE
- Stay in the before attribute value state. */
- $this->state = 'beforeAttributeValue';
-
- } elseif ($char === '"') {
- /* U+0022 QUOTATION MARK (")
- Switch to the attribute value (double-quoted) state. */
- $this->state = 'attributeValueDoubleQuoted';
-
- } elseif ($char === '&') {
- /* U+0026 AMPERSAND (&)
- Switch to the attribute value (unquoted) state and reconsume
- this input character. */
- $this->char--;
- $this->state = 'attributeValueUnquoted';
-
- } elseif ($char === '\'') {
- /* U+0027 APOSTROPHE (')
- Switch to the attribute value (single-quoted) state. */
- $this->state = 'attributeValueSingleQuoted';
-
- } elseif ($char === '>') {
- /* U+003E GREATER-THAN SIGN (>)
- Emit the current tag token. Switch to the data state. */
- $this->emitToken($this->token);
- $this->state = 'data';
-
- } else {
- /* Anything else
- Append the current input character to the current attribute's value.
- Switch to the attribute value (unquoted) state. */
- $last = count($this->token['attr']) - 1;
- $this->token['attr'][$last]['value'] .= $char;
-
- $this->state = 'attributeValueUnquoted';
- }
- }
-
- private function attributeValueDoubleQuotedState()
- {
- // Consume the next input character:
- $this->char++;
- $char = $this->character($this->char);
-
- if ($char === '"') {
- /* U+0022 QUOTATION MARK (")
- Switch to the before attribute name state. */
- $this->state = 'beforeAttributeName';
-
- } elseif ($char === '&') {
- /* U+0026 AMPERSAND (&)
- Switch to the entity in attribute value state. */
- $this->entityInAttributeValueState('double');
-
- } elseif ($this->char === $this->EOF) {
- /* EOF
- Parse error. Emit the current tag token. Reconsume the character
- in the data state. */
- $this->emitToken($this->token);
-
- $this->char--;
- $this->state = 'data';
-
- } else {
- /* Anything else
- Append the current input character to the current attribute's value.
- Stay in the attribute value (double-quoted) state. */
- $last = count($this->token['attr']) - 1;
- $this->token['attr'][$last]['value'] .= $char;
-
- $this->state = 'attributeValueDoubleQuoted';
- }
- }
-
- private function attributeValueSingleQuotedState()
- {
- // Consume the next input character:
- $this->char++;
- $char = $this->character($this->char);
-
- if ($char === '\'') {
- /* U+0022 QUOTATION MARK (')
- Switch to the before attribute name state. */
- $this->state = 'beforeAttributeName';
-
- } elseif ($char === '&') {
- /* U+0026 AMPERSAND (&)
- Switch to the entity in attribute value state. */
- $this->entityInAttributeValueState('single');
-
- } elseif ($this->char === $this->EOF) {
- /* EOF
- Parse error. Emit the current tag token. Reconsume the character
- in the data state. */
- $this->emitToken($this->token);
-
- $this->char--;
- $this->state = 'data';
-
- } else {
- /* Anything else
- Append the current input character to the current attribute's value.
- Stay in the attribute value (single-quoted) state. */
- $last = count($this->token['attr']) - 1;
- $this->token['attr'][$last]['value'] .= $char;
-
- $this->state = 'attributeValueSingleQuoted';
- }
- }
-
- private function attributeValueUnquotedState()
- {
- // Consume the next input character:
- $this->char++;
- $char = $this->character($this->char);
-
- if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
- /* U+0009 CHARACTER TABULATION
- U+000A LINE FEED (LF)
- U+000B LINE TABULATION
- U+000C FORM FEED (FF)
- U+0020 SPACE
- Switch to the before attribute name state. */
- $this->state = 'beforeAttributeName';
-
- } elseif ($char === '&') {
- /* U+0026 AMPERSAND (&)
- Switch to the entity in attribute value state. */
- $this->entityInAttributeValueState();
-
- } elseif ($char === '>') {
- /* U+003E GREATER-THAN SIGN (>)
- Emit the current tag token. Switch to the data state. */
- $this->emitToken($this->token);
- $this->state = 'data';
-
- } else {
- /* Anything else
- Append the current input character to the current attribute's value.
- Stay in the attribute value (unquoted) state. */
- $last = count($this->token['attr']) - 1;
- $this->token['attr'][$last]['value'] .= $char;
-
- $this->state = 'attributeValueUnquoted';
- }
- }
-
- private function entityInAttributeValueState()
- {
- // Attempt to consume an entity.
- $entity = $this->entity();
-
- // If nothing is returned, append a U+0026 AMPERSAND character to the
- // current attribute's value. Otherwise, emit the character token that
- // was returned.
- $char = (!$entity)
- ? '&'
- : $entity;
-
- $last = count($this->token['attr']) - 1;
- $this->token['attr'][$last]['value'] .= $char;
- }
-
- private function bogusCommentState()
- {
- /* Consume every character up to the first U+003E GREATER-THAN SIGN
- character (>) or the end of the file (EOF), whichever comes first. Emit
- a comment token whose data is the concatenation of all the characters
- starting from and including the character that caused the state machine
- to switch into the bogus comment state, up to and including the last
- consumed character before the U+003E character, if any, or up to the
- end of the file otherwise. (If the comment was started by the end of
- the file (EOF), the token is empty.) */
- $data = $this->characters('^>', $this->char);
- $this->emitToken(
- array(
- 'data' => $data,
- 'type' => self::COMMENT
- )
- );
-
- $this->char += strlen($data);
-
- /* Switch to the data state. */
- $this->state = 'data';
-
- /* If the end of the file was reached, reconsume the EOF character. */
- if ($this->char === $this->EOF) {
- $this->char = $this->EOF - 1;
- }
- }
-
- private function markupDeclarationOpenState()
- {
- /* If the next two characters are both U+002D HYPHEN-MINUS (-)
- characters, consume those two characters, create a comment token whose
- data is the empty string, and switch to the comment state. */
- if ($this->character($this->char + 1, 2) === '--') {
- $this->char += 2;
- $this->state = 'comment';
- $this->token = array(
- 'data' => null,
- 'type' => self::COMMENT
- );
-
- /* Otherwise if the next seven chacacters are a case-insensitive match
- for the word "DOCTYPE", then consume those characters and switch to the
- DOCTYPE state. */
- } elseif (strtolower($this->character($this->char + 1, 7)) === 'doctype') {
- $this->char += 7;
- $this->state = 'doctype';
-
- /* Otherwise, is is a parse error. Switch to the bogus comment state.
- The next character that is consumed, if any, is the first character
- that will be in the comment. */
- } else {
- $this->char++;
- $this->state = 'bogusComment';
- }
- }
-
- private function commentState()
- {
- /* Consume the next input character: */
- $this->char++;
- $char = $this->char();
-
- /* U+002D HYPHEN-MINUS (-) */
- if ($char === '-') {
- /* Switch to the comment dash state */
- $this->state = 'commentDash';
-
- /* EOF */
- } elseif ($this->char === $this->EOF) {
- /* Parse error. Emit the comment token. Reconsume the EOF character
- in the data state. */
- $this->emitToken($this->token);
- $this->char--;
- $this->state = 'data';
-
- /* Anything else */
- } else {
- /* Append the input character to the comment token's data. Stay in
- the comment state. */
- $this->token['data'] .= $char;
- }
- }
-
- private function commentDashState()
- {
- /* Consume the next input character: */
- $this->char++;
- $char = $this->char();
-
- /* U+002D HYPHEN-MINUS (-) */
- if ($char === '-') {
- /* Switch to the comment end state */
- $this->state = 'commentEnd';
-
- /* EOF */
- } elseif ($this->char === $this->EOF) {
- /* Parse error. Emit the comment token. Reconsume the EOF character
- in the data state. */
- $this->emitToken($this->token);
- $this->char--;
- $this->state = 'data';
-
- /* Anything else */
- } else {
- /* Append a U+002D HYPHEN-MINUS (-) character and the input
- character to the comment token's data. Switch to the comment state. */
- $this->token['data'] .= '-' . $char;
- $this->state = 'comment';
- }
- }
-
- private function commentEndState()
- {
- /* Consume the next input character: */
- $this->char++;
- $char = $this->char();
-
- if ($char === '>') {
- $this->emitToken($this->token);
- $this->state = 'data';
-
- } elseif ($char === '-') {
- $this->token['data'] .= '-';
-
- } elseif ($this->char === $this->EOF) {
- $this->emitToken($this->token);
- $this->char--;
- $this->state = 'data';
-
- } else {
- $this->token['data'] .= '--' . $char;
- $this->state = 'comment';
- }
- }
-
- private function doctypeState()
- {
- /* Consume the next input character: */
- $this->char++;
- $char = $this->char();
-
- if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
- $this->state = 'beforeDoctypeName';
-
- } else {
- $this->char--;
- $this->state = 'beforeDoctypeName';
- }
- }
-
- private function beforeDoctypeNameState()
- {
- /* Consume the next input character: */
- $this->char++;
- $char = $this->char();
-
- if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
- // Stay in the before DOCTYPE name state.
-
- } elseif (preg_match('/^[a-z]$/', $char)) {
- $this->token = array(
- 'name' => strtoupper($char),
- 'type' => self::DOCTYPE,
- 'error' => true
- );
-
- $this->state = 'doctypeName';
-
- } elseif ($char === '>') {
- $this->emitToken(
- array(
- 'name' => null,
- 'type' => self::DOCTYPE,
- 'error' => true
- )
- );
-
- $this->state = 'data';
-
- } elseif ($this->char === $this->EOF) {
- $this->emitToken(
- array(
- 'name' => null,
- 'type' => self::DOCTYPE,
- 'error' => true
- )
- );
-
- $this->char--;
- $this->state = 'data';
-
- } else {
- $this->token = array(
- 'name' => $char,
- 'type' => self::DOCTYPE,
- 'error' => true
- );
-
- $this->state = 'doctypeName';
- }
- }
-
- private function doctypeNameState()
- {
- /* Consume the next input character: */
- $this->char++;
- $char = $this->char();
-
- if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
- $this->state = 'AfterDoctypeName';
-
- } elseif ($char === '>') {
- $this->emitToken($this->token);
- $this->state = 'data';
-
- } elseif (preg_match('/^[a-z]$/', $char)) {
- $this->token['name'] .= strtoupper($char);
-
- } elseif ($this->char === $this->EOF) {
- $this->emitToken($this->token);
- $this->char--;
- $this->state = 'data';
-
- } else {
- $this->token['name'] .= $char;
- }
-
- $this->token['error'] = ($this->token['name'] === 'HTML')
- ? false
- : true;
- }
-
- private function afterDoctypeNameState()
- {
- /* Consume the next input character: */
- $this->char++;
- $char = $this->char();
-
- if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
- // Stay in the DOCTYPE name state.
-
- } elseif ($char === '>') {
- $this->emitToken($this->token);
- $this->state = 'data';
-
- } elseif ($this->char === $this->EOF) {
- $this->emitToken($this->token);
- $this->char--;
- $this->state = 'data';
-
- } else {
- $this->token['error'] = true;
- $this->state = 'bogusDoctype';
- }
- }
-
- private function bogusDoctypeState()
- {
- /* Consume the next input character: */
- $this->char++;
- $char = $this->char();
-
- if ($char === '>') {
- $this->emitToken($this->token);
- $this->state = 'data';
-
- } elseif ($this->char === $this->EOF) {
- $this->emitToken($this->token);
- $this->char--;
- $this->state = 'data';
-
- } else {
- // Stay in the bogus DOCTYPE state.
- }
- }
-
- private function entity()
- {
- $start = $this->char;
-
- // This section defines how to consume an entity. This definition is
- // used when parsing entities in text and in attributes.
-
- // The behaviour depends on the identity of the next character (the
- // one immediately after the U+0026 AMPERSAND character):
-
- switch ($this->character($this->char + 1)) {
- // U+0023 NUMBER SIGN (#)
- case '#':
-
- // The behaviour further depends on the character after the
- // U+0023 NUMBER SIGN:
- switch ($this->character($this->char + 1)) {
- // U+0078 LATIN SMALL LETTER X
- // U+0058 LATIN CAPITAL LETTER X
- case 'x':
- case 'X':
- // Follow the steps below, but using the range of
- // characters U+0030 DIGIT ZERO through to U+0039 DIGIT
- // NINE, U+0061 LATIN SMALL LETTER A through to U+0066
- // LATIN SMALL LETTER F, and U+0041 LATIN CAPITAL LETTER
- // A, through to U+0046 LATIN CAPITAL LETTER F (in other
- // words, 0-9, A-F, a-f).
- $char = 1;
- $char_class = '0-9A-Fa-f';
- break;
-
- // Anything else
- default:
- // Follow the steps below, but using the range of
- // characters U+0030 DIGIT ZERO through to U+0039 DIGIT
- // NINE (i.e. just 0-9).
- $char = 0;
- $char_class = '0-9';
- break;
- }
-
- // Consume as many characters as match the range of characters
- // given above.
- $this->char++;
- $e_name = $this->characters($char_class, $this->char + $char + 1);
- $entity = $this->character($start, $this->char);
- $cond = strlen($e_name) > 0;
-
- // The rest of the parsing happens bellow.
- break;
-
- // Anything else
- default:
- // Consume the maximum number of characters possible, with the
- // consumed characters case-sensitively matching one of the
- // identifiers in the first column of the entities table.
- $e_name = $this->characters('0-9A-Za-z;', $this->char + 1);
- $len = strlen($e_name);
-
- for ($c = 1; $c <= $len; $c++) {
- $id = substr($e_name, 0, $c);
- $this->char++;
-
- if (in_array($id, $this->entities)) {
- if ($e_name[$c - 1] !== ';') {
- if ($c < $len && $e_name[$c] == ';') {
- $this->char++; // consume extra semicolon
- }
- }
- $entity = $id;
- break;
- }
- }
-
- $cond = isset($entity);
- // The rest of the parsing happens bellow.
- break;
- }
-
- if (!$cond) {
- // If no match can be made, then this is a parse error. No
- // characters are consumed, and nothing is returned.
- $this->char = $start;
- return false;
- }
-
- // Return a character token for the character corresponding to the
- // entity name (as given by the second column of the entities table).
- return html_entity_decode('&' . $entity . ';', ENT_QUOTES, 'UTF-8');
- }
-
- private function emitToken($token)
- {
- $emit = $this->tree->emitToken($token);
-
- if (is_int($emit)) {
- $this->content_model = $emit;
-
- } elseif ($token['type'] === self::ENDTAG) {
- $this->content_model = self::PCDATA;
- }
- }
-
- private function EOF()
- {
- $this->state = null;
- $this->tree->emitToken(
- array(
- 'type' => self::EOF
- )
- );
- }
-}
-
-class HTML5TreeConstructer
-{
- public $stack = array();
-
- private $phase;
- private $mode;
- private $dom;
- private $foster_parent = null;
- private $a_formatting = array();
-
- private $head_pointer = null;
- private $form_pointer = null;
-
- private $scoping = array('button', 'caption', 'html', 'marquee', 'object', 'table', 'td', 'th');
- private $formatting = array(
- 'a',
- 'b',
- 'big',
- 'em',
- 'font',
- 'i',
- 'nobr',
- 's',
- 'small',
- 'strike',
- 'strong',
- 'tt',
- 'u'
- );
- private $special = array(
- 'address',
- 'area',
- 'base',
- 'basefont',
- 'bgsound',
- 'blockquote',
- 'body',
- 'br',
- 'center',
- 'col',
- 'colgroup',
- 'dd',
- 'dir',
- 'div',
- 'dl',
- 'dt',
- 'embed',
- 'fieldset',
- 'form',
- 'frame',
- 'frameset',
- 'h1',
- 'h2',
- 'h3',
- 'h4',
- 'h5',
- 'h6',
- 'head',
- 'hr',
- 'iframe',
- 'image',
- 'img',
- 'input',
- 'isindex',
- 'li',
- 'link',
- 'listing',
- 'menu',
- 'meta',
- 'noembed',
- 'noframes',
- 'noscript',
- 'ol',
- 'optgroup',
- 'option',
- 'p',
- 'param',
- 'plaintext',
- 'pre',
- 'script',
- 'select',
- 'spacer',
- 'style',
- 'tbody',
- 'textarea',
- 'tfoot',
- 'thead',
- 'title',
- 'tr',
- 'ul',
- 'wbr'
- );
-
- // The different phases.
- const INIT_PHASE = 0;
- const ROOT_PHASE = 1;
- const MAIN_PHASE = 2;
- const END_PHASE = 3;
-
- // The different insertion modes for the main phase.
- const BEFOR_HEAD = 0;
- const IN_HEAD = 1;
- const AFTER_HEAD = 2;
- const IN_BODY = 3;
- const IN_TABLE = 4;
- const IN_CAPTION = 5;
- const IN_CGROUP = 6;
- const IN_TBODY = 7;
- const IN_ROW = 8;
- const IN_CELL = 9;
- const IN_SELECT = 10;
- const AFTER_BODY = 11;
- const IN_FRAME = 12;
- const AFTR_FRAME = 13;
-
- // The different types of elements.
- const SPECIAL = 0;
- const SCOPING = 1;
- const FORMATTING = 2;
- const PHRASING = 3;
-
- const MARKER = 0;
-
- public function __construct()
- {
- $this->phase = self::INIT_PHASE;
- $this->mode = self::BEFOR_HEAD;
- $this->dom = new DOMDocument;
-
- $this->dom->encoding = 'UTF-8';
- $this->dom->preserveWhiteSpace = true;
- $this->dom->substituteEntities = true;
- $this->dom->strictErrorChecking = false;
- }
-
- // Process tag tokens
- public function emitToken($token)
- {
- switch ($this->phase) {
- case self::INIT_PHASE:
- return $this->initPhase($token);
- break;
- case self::ROOT_PHASE:
- return $this->rootElementPhase($token);
- break;
- case self::MAIN_PHASE:
- return $this->mainPhase($token);
- break;
- case self::END_PHASE :
- return $this->trailingEndPhase($token);
- break;
- }
- }
-
- private function initPhase($token)
- {
- /* Initially, the tree construction stage must handle each token
- emitted from the tokenisation stage as follows: */
-
- /* A DOCTYPE token that is marked as being in error
- A comment token
- A start tag token
- An end tag token
- A character token that is not one of one of U+0009 CHARACTER TABULATION,
- U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
- or U+0020 SPACE
- An end-of-file token */
- if ((isset($token['error']) && $token['error']) ||
- $token['type'] === HTML5::COMMENT ||
- $token['type'] === HTML5::STARTTAG ||
- $token['type'] === HTML5::ENDTAG ||
- $token['type'] === HTML5::EOF ||
- ($token['type'] === HTML5::CHARACTR && isset($token['data']) &&
- !preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data']))
- ) {
- /* This specification does not define how to handle this case. In
- particular, user agents may ignore the entirety of this specification
- altogether for such documents, and instead invoke special parse modes
- with a greater emphasis on backwards compatibility. */
-
- $this->phase = self::ROOT_PHASE;
- return $this->rootElementPhase($token);
-
- /* A DOCTYPE token marked as being correct */
- } elseif (isset($token['error']) && !$token['error']) {
- /* Append a DocumentType node to the Document node, with the name
- attribute set to the name given in the DOCTYPE token (which will be
- "HTML"), and the other attributes specific to DocumentType objects
- set to null, empty lists, or the empty string as appropriate. */
- $doctype = new DOMDocumentType(null, null, 'HTML');
-
- /* Then, switch to the root element phase of the tree construction
- stage. */
- $this->phase = self::ROOT_PHASE;
-
- /* A character token that is one of one of U+0009 CHARACTER TABULATION,
- U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
- or U+0020 SPACE */
- } elseif (isset($token['data']) && preg_match(
- '/^[\t\n\x0b\x0c ]+$/',
- $token['data']
- )
- ) {
- /* Append that character to the Document node. */
- $text = $this->dom->createTextNode($token['data']);
- $this->dom->appendChild($text);
- }
- }
-
- private function rootElementPhase($token)
- {
- /* After the initial phase, as each token is emitted from the tokenisation
- stage, it must be processed as described in this section. */
-
- /* A DOCTYPE token */
- if ($token['type'] === HTML5::DOCTYPE) {
- // Parse error. Ignore the token.
-
- /* A comment token */
- } elseif ($token['type'] === HTML5::COMMENT) {
- /* Append a Comment node to the Document object with the data
- attribute set to the data given in the comment token. */
- $comment = $this->dom->createComment($token['data']);
- $this->dom->appendChild($comment);
-
- /* A character token that is one of one of U+0009 CHARACTER TABULATION,
- U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
- or U+0020 SPACE */
- } elseif ($token['type'] === HTML5::CHARACTR &&
- preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])
- ) {
- /* Append that character to the Document node. */
- $text = $this->dom->createTextNode($token['data']);
- $this->dom->appendChild($text);
-
- /* A character token that is not one of U+0009 CHARACTER TABULATION,
- U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED
- (FF), or U+0020 SPACE
- A start tag token
- An end tag token
- An end-of-file token */
- } elseif (($token['type'] === HTML5::CHARACTR &&
- !preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) ||
- $token['type'] === HTML5::STARTTAG ||
- $token['type'] === HTML5::ENDTAG ||
- $token['type'] === HTML5::EOF
- ) {
- /* Create an HTMLElement node with the tag name html, in the HTML
- namespace. Append it to the Document object. Switch to the main
- phase and reprocess the current token. */
- $html = $this->dom->createElement('html');
- $this->dom->appendChild($html);
- $this->stack[] = $html;
-
- $this->phase = self::MAIN_PHASE;
- return $this->mainPhase($token);
- }
- }
-
- private function mainPhase($token)
- {
- /* Tokens in the main phase must be handled as follows: */
-
- /* A DOCTYPE token */
- if ($token['type'] === HTML5::DOCTYPE) {
- // Parse error. Ignore the token.
-
- /* A start tag token with the tag name "html" */
- } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'html') {
- /* If this start tag token was not the first start tag token, then
- it is a parse error. */
-
- /* For each attribute on the token, check to see if the attribute
- is already present on the top element of the stack of open elements.
- If it is not, add the attribute and its corresponding value to that
- element. */
- foreach ($token['attr'] as $attr) {
- if (!$this->stack[0]->hasAttribute($attr['name'])) {
- $this->stack[0]->setAttribute($attr['name'], $attr['value']);
- }
- }
-
- /* An end-of-file token */
- } elseif ($token['type'] === HTML5::EOF) {
- /* Generate implied end tags. */
- $this->generateImpliedEndTags();
-
- /* Anything else. */
- } else {
- /* Depends on the insertion mode: */
- switch ($this->mode) {
- case self::BEFOR_HEAD:
- return $this->beforeHead($token);
- break;
- case self::IN_HEAD:
- return $this->inHead($token);
- break;
- case self::AFTER_HEAD:
- return $this->afterHead($token);
- break;
- case self::IN_BODY:
- return $this->inBody($token);
- break;
- case self::IN_TABLE:
- return $this->inTable($token);
- break;
- case self::IN_CAPTION:
- return $this->inCaption($token);
- break;
- case self::IN_CGROUP:
- return $this->inColumnGroup($token);
- break;
- case self::IN_TBODY:
- return $this->inTableBody($token);
- break;
- case self::IN_ROW:
- return $this->inRow($token);
- break;
- case self::IN_CELL:
- return $this->inCell($token);
- break;
- case self::IN_SELECT:
- return $this->inSelect($token);
- break;
- case self::AFTER_BODY:
- return $this->afterBody($token);
- break;
- case self::IN_FRAME:
- return $this->inFrameset($token);
- break;
- case self::AFTR_FRAME:
- return $this->afterFrameset($token);
- break;
- case self::END_PHASE:
- return $this->trailingEndPhase($token);
- break;
- }
- }
- }
-
- private function beforeHead($token)
- {
- /* Handle the token as follows: */
-
- /* A character token that is one of one of U+0009 CHARACTER TABULATION,
- U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
- or U+0020 SPACE */
- if ($token['type'] === HTML5::CHARACTR &&
- preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])
- ) {
- /* Append the character to the current node. */
- $this->insertText($token['data']);
-
- /* A comment token */
- } elseif ($token['type'] === HTML5::COMMENT) {
- /* Append a Comment node to the current node with the data attribute
- set to the data given in the comment token. */
- $this->insertComment($token['data']);
-
- /* A start tag token with the tag name "head" */
- } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'head') {
- /* Create an element for the token, append the new element to the
- current node and push it onto the stack of open elements. */
- $element = $this->insertElement($token);
-
- /* Set the head element pointer to this new element node. */
- $this->head_pointer = $element;
-
- /* Change the insertion mode to "in head". */
- $this->mode = self::IN_HEAD;
-
- /* A start tag token whose tag name is one of: "base", "link", "meta",
- "script", "style", "title". Or an end tag with the tag name "html".
- Or a character token that is not one of U+0009 CHARACTER TABULATION,
- U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
- or U+0020 SPACE. Or any other start tag token */
- } elseif ($token['type'] === HTML5::STARTTAG ||
- ($token['type'] === HTML5::ENDTAG && $token['name'] === 'html') ||
- ($token['type'] === HTML5::CHARACTR && !preg_match(
- '/^[\t\n\x0b\x0c ]$/',
- $token['data']
- ))
- ) {
- /* Act as if a start tag token with the tag name "head" and no
- attributes had been seen, then reprocess the current token. */
- $this->beforeHead(
- array(
- 'name' => 'head',
- 'type' => HTML5::STARTTAG,
- 'attr' => array()
- )
- );
-
- return $this->inHead($token);
-
- /* Any other end tag */
- } elseif ($token['type'] === HTML5::ENDTAG) {
- /* Parse error. Ignore the token. */
- }
- }
-
- private function inHead($token)
- {
- /* Handle the token as follows: */
-
- /* A character token that is one of one of U+0009 CHARACTER TABULATION,
- U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
- or U+0020 SPACE.
-
- THIS DIFFERS FROM THE SPEC: If the current node is either a title, style
- or script element, append the character to the current node regardless
- of its content. */
- if (($token['type'] === HTML5::CHARACTR &&
- preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) || (
- $token['type'] === HTML5::CHARACTR && in_array(
- end($this->stack)->nodeName,
- array('title', 'style', 'script')
- ))
- ) {
- /* Append the character to the current node. */
- $this->insertText($token['data']);
-
- /* A comment token */
- } elseif ($token['type'] === HTML5::COMMENT) {
- /* Append a Comment node to the current node with the data attribute
- set to the data given in the comment token. */
- $this->insertComment($token['data']);
-
- } elseif ($token['type'] === HTML5::ENDTAG &&
- in_array($token['name'], array('title', 'style', 'script'))
- ) {
- array_pop($this->stack);
- return HTML5::PCDATA;
-
- /* A start tag with the tag name "title" */
- } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'title') {
- /* Create an element for the token and append the new element to the
- node pointed to by the head element pointer, or, if that is null
- (innerHTML case), to the current node. */
- if ($this->head_pointer !== null) {
- $element = $this->insertElement($token, false);
- $this->head_pointer->appendChild($element);
-
- } else {
- $element = $this->insertElement($token);
- }
-
- /* Switch the tokeniser's content model flag to the RCDATA state. */
- return HTML5::RCDATA;
-
- /* A start tag with the tag name "style" */
- } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'style') {
- /* Create an element for the token and append the new element to the
- node pointed to by the head element pointer, or, if that is null
- (innerHTML case), to the current node. */
- if ($this->head_pointer !== null) {
- $element = $this->insertElement($token, false);
- $this->head_pointer->appendChild($element);
-
- } else {
- $this->insertElement($token);
- }
-
- /* Switch the tokeniser's content model flag to the CDATA state. */
- return HTML5::CDATA;
-
- /* A start tag with the tag name "script" */
- } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'script') {
- /* Create an element for the token. */
- $element = $this->insertElement($token, false);
- $this->head_pointer->appendChild($element);
-
- /* Switch the tokeniser's content model flag to the CDATA state. */
- return HTML5::CDATA;
-
- /* A start tag with the tag name "base", "link", or "meta" */
- } elseif ($token['type'] === HTML5::STARTTAG && in_array(
- $token['name'],
- array('base', 'link', 'meta')
- )
- ) {
- /* Create an element for the token and append the new element to the
- node pointed to by the head element pointer, or, if that is null
- (innerHTML case), to the current node. */
- if ($this->head_pointer !== null) {
- $element = $this->insertElement($token, false);
- $this->head_pointer->appendChild($element);
- array_pop($this->stack);
-
- } else {
- $this->insertElement($token);
- }
-
- /* An end tag with the tag name "head" */
- } elseif ($token['type'] === HTML5::ENDTAG && $token['name'] === 'head') {
- /* If the current node is a head element, pop the current node off
- the stack of open elements. */
- if ($this->head_pointer->isSameNode(end($this->stack))) {
- array_pop($this->stack);
-
- /* Otherwise, this is a parse error. */
- } else {
- // k
- }
-
- /* Change the insertion mode to "after head". */
- $this->mode = self::AFTER_HEAD;
-
- /* A start tag with the tag name "head" or an end tag except "html". */
- } elseif (($token['type'] === HTML5::STARTTAG && $token['name'] === 'head') ||
- ($token['type'] === HTML5::ENDTAG && $token['name'] !== 'html')
- ) {
- // Parse error. Ignore the token.
-
- /* Anything else */
- } else {
- /* If the current node is a head element, act as if an end tag
- token with the tag name "head" had been seen. */
- if ($this->head_pointer->isSameNode(end($this->stack))) {
- $this->inHead(
- array(
- 'name' => 'head',
- 'type' => HTML5::ENDTAG
- )
- );
-
- /* Otherwise, change the insertion mode to "after head". */
- } else {
- $this->mode = self::AFTER_HEAD;
- }
-
- /* Then, reprocess the current token. */
- return $this->afterHead($token);
- }
- }
-
- private function afterHead($token)
- {
- /* Handle the token as follows: */
-
- /* A character token that is one of one of U+0009 CHARACTER TABULATION,
- U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
- or U+0020 SPACE */
- if ($token['type'] === HTML5::CHARACTR &&
- preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])
- ) {
- /* Append the character to the current node. */
- $this->insertText($token['data']);
-
- /* A comment token */
- } elseif ($token['type'] === HTML5::COMMENT) {
- /* Append a Comment node to the current node with the data attribute
- set to the data given in the comment token. */
- $this->insertComment($token['data']);
-
- /* A start tag token with the tag name "body" */
- } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'body') {
- /* Insert a body element for the token. */
- $this->insertElement($token);
-
- /* Change the insertion mode to "in body". */
- $this->mode = self::IN_BODY;
-
- /* A start tag token with the tag name "frameset" */
- } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'frameset') {
- /* Insert a frameset element for the token. */
- $this->insertElement($token);
-
- /* Change the insertion mode to "in frameset". */
- $this->mode = self::IN_FRAME;
-
- /* A start tag token whose tag name is one of: "base", "link", "meta",
- "script", "style", "title" */
- } elseif ($token['type'] === HTML5::STARTTAG && in_array(
- $token['name'],
- array('base', 'link', 'meta', 'script', 'style', 'title')
- )
- ) {
- /* Parse error. Switch the insertion mode back to "in head" and
- reprocess the token. */
- $this->mode = self::IN_HEAD;
- return $this->inHead($token);
-
- /* Anything else */
- } else {
- /* Act as if a start tag token with the tag name "body" and no
- attributes had been seen, and then reprocess the current token. */
- $this->afterHead(
- array(
- 'name' => 'body',
- 'type' => HTML5::STARTTAG,
- 'attr' => array()
- )
- );
-
- return $this->inBody($token);
- }
- }
-
- private function inBody($token)
- {
- /* Handle the token as follows: */
-
- switch ($token['type']) {
- /* A character token */
- case HTML5::CHARACTR:
- /* Reconstruct the active formatting elements, if any. */
- $this->reconstructActiveFormattingElements();
-
- /* Append the token's character to the current node. */
- $this->insertText($token['data']);
- break;
-
- /* A comment token */
- case HTML5::COMMENT:
- /* Append a Comment node to the current node with the data
- attribute set to the data given in the comment token. */
- $this->insertComment($token['data']);
- break;
-
- case HTML5::STARTTAG:
- switch ($token['name']) {
- /* A start tag token whose tag name is one of: "script",
- "style" */
- case 'script':
- case 'style':
- /* Process the token as if the insertion mode had been "in
- head". */
- return $this->inHead($token);
- break;
-
- /* A start tag token whose tag name is one of: "base", "link",
- "meta", "title" */
- case 'base':
- case 'link':
- case 'meta':
- case 'title':
- /* Parse error. Process the token as if the insertion mode
- had been "in head". */
- return $this->inHead($token);
- break;
-
- /* A start tag token with the tag name "body" */
- case 'body':
- /* Parse error. If the second element on the stack of open
- elements is not a body element, or, if the stack of open
- elements has only one node on it, then ignore the token.
- (innerHTML case) */
- if (count($this->stack) === 1 || $this->stack[1]->nodeName !== 'body') {
- // Ignore
-
- /* Otherwise, for each attribute on the token, check to see
- if the attribute is already present on the body element (the
- second element) on the stack of open elements. If it is not,
- add the attribute and its corresponding value to that
- element. */
- } else {
- foreach ($token['attr'] as $attr) {
- if (!$this->stack[1]->hasAttribute($attr['name'])) {
- $this->stack[1]->setAttribute($attr['name'], $attr['value']);
- }
- }
- }
- break;
-
- /* A start tag whose tag name is one of: "address",
- "blockquote", "center", "dir", "div", "dl", "fieldset",
- "listing", "menu", "ol", "p", "ul" */
- case 'address':
- case 'blockquote':
- case 'center':
- case 'dir':
- case 'div':
- case 'dl':
- case 'fieldset':
- case 'listing':
- case 'menu':
- case 'ol':
- case 'p':
- case 'ul':
- /* If the stack of open elements has a p element in scope,
- then act as if an end tag with the tag name p had been
- seen. */
- if ($this->elementInScope('p')) {
- $this->emitToken(
- array(
- 'name' => 'p',
- 'type' => HTML5::ENDTAG
- )
- );
- }
-
- /* Insert an HTML element for the token. */
- $this->insertElement($token);
- break;
-
- /* A start tag whose tag name is "form" */
- case 'form':
- /* If the form element pointer is not null, ignore the
- token with a parse error. */
- if ($this->form_pointer !== null) {
- // Ignore.
-
- /* Otherwise: */
- } else {
- /* If the stack of open elements has a p element in
- scope, then act as if an end tag with the tag name p
- had been seen. */
- if ($this->elementInScope('p')) {
- $this->emitToken(
- array(
- 'name' => 'p',
- 'type' => HTML5::ENDTAG
- )
- );
- }
-
- /* Insert an HTML element for the token, and set the
- form element pointer to point to the element created. */
- $element = $this->insertElement($token);
- $this->form_pointer = $element;
- }
- break;
-
- /* A start tag whose tag name is "li", "dd" or "dt" */
- case 'li':
- case 'dd':
- case 'dt':
- /* If the stack of open elements has a p element in scope,
- then act as if an end tag with the tag name p had been
- seen. */
- if ($this->elementInScope('p')) {
- $this->emitToken(
- array(
- 'name' => 'p',
- 'type' => HTML5::ENDTAG
- )
- );
- }
-
- $stack_length = count($this->stack) - 1;
-
- for ($n = $stack_length; 0 <= $n; $n--) {
- /* 1. Initialise node to be the current node (the
- bottommost node of the stack). */
- $stop = false;
- $node = $this->stack[$n];
- $cat = $this->getElementCategory($node->tagName);
-
- /* 2. If node is an li, dd or dt element, then pop all
- the nodes from the current node up to node, including
- node, then stop this algorithm. */
- if ($token['name'] === $node->tagName || ($token['name'] !== 'li'
- && ($node->tagName === 'dd' || $node->tagName === 'dt'))
- ) {
- for ($x = $stack_length; $x >= $n; $x--) {
- array_pop($this->stack);
- }
-
- break;
- }
-
- /* 3. If node is not in the formatting category, and is
- not in the phrasing category, and is not an address or
- div element, then stop this algorithm. */
- if ($cat !== self::FORMATTING && $cat !== self::PHRASING &&
- $node->tagName !== 'address' && $node->tagName !== 'div'
- ) {
- break;
- }
- }
-
- /* Finally, insert an HTML element with the same tag
- name as the token's. */
- $this->insertElement($token);
- break;
-
- /* A start tag token whose tag name is "plaintext" */
- case 'plaintext':
- /* If the stack of open elements has a p element in scope,
- then act as if an end tag with the tag name p had been
- seen. */
- if ($this->elementInScope('p')) {
- $this->emitToken(
- array(
- 'name' => 'p',
- 'type' => HTML5::ENDTAG
- )
- );
- }
-
- /* Insert an HTML element for the token. */
- $this->insertElement($token);
-
- return HTML5::PLAINTEXT;
- break;
-
- /* A start tag whose tag name is one of: "h1", "h2", "h3", "h4",
- "h5", "h6" */
- case 'h1':
- case 'h2':
- case 'h3':
- case 'h4':
- case 'h5':
- case 'h6':
- /* If the stack of open elements has a p element in scope,
- then act as if an end tag with the tag name p had been seen. */
- if ($this->elementInScope('p')) {
- $this->emitToken(
- array(
- 'name' => 'p',
- 'type' => HTML5::ENDTAG
- )
- );
- }
-
- /* If the stack of open elements has in scope an element whose
- tag name is one of "h1", "h2", "h3", "h4", "h5", or "h6", then
- this is a parse error; pop elements from the stack until an
- element with one of those tag names has been popped from the
- stack. */
- while ($this->elementInScope(array('h1', 'h2', 'h3', 'h4', 'h5', 'h6'))) {
- array_pop($this->stack);
- }
-
- /* Insert an HTML element for the token. */
- $this->insertElement($token);
- break;
-
- /* A start tag whose tag name is "a" */
- case 'a':
- /* If the list of active formatting elements contains
- an element whose tag name is "a" between the end of the
- list and the last marker on the list (or the start of
- the list if there is no marker on the list), then this
- is a parse error; act as if an end tag with the tag name
- "a" had been seen, then remove that element from the list
- of active formatting elements and the stack of open
- elements if the end tag didn't already remove it (it
- might not have if the element is not in table scope). */
- $leng = count($this->a_formatting);
-
- for ($n = $leng - 1; $n >= 0; $n--) {
- if ($this->a_formatting[$n] === self::MARKER) {
- break;
-
- } elseif ($this->a_formatting[$n]->nodeName === 'a') {
- $this->emitToken(
- array(
- 'name' => 'a',
- 'type' => HTML5::ENDTAG
- )
- );
- break;
- }
- }
-
- /* Reconstruct the active formatting elements, if any. */
- $this->reconstructActiveFormattingElements();
-
- /* Insert an HTML element for the token. */
- $el = $this->insertElement($token);
-
- /* Add that element to the list of active formatting
- elements. */
- $this->a_formatting[] = $el;
- break;
-
- /* A start tag whose tag name is one of: "b", "big", "em", "font",
- "i", "nobr", "s", "small", "strike", "strong", "tt", "u" */
- case 'b':
- case 'big':
- case 'em':
- case 'font':
- case 'i':
- case 'nobr':
- case 's':
- case 'small':
- case 'strike':
- case 'strong':
- case 'tt':
- case 'u':
- /* Reconstruct the active formatting elements, if any. */
- $this->reconstructActiveFormattingElements();
-
- /* Insert an HTML element for the token. */
- $el = $this->insertElement($token);
-
- /* Add that element to the list of active formatting
- elements. */
- $this->a_formatting[] = $el;
- break;
-
- /* A start tag token whose tag name is "button" */
- case 'button':
- /* If the stack of open elements has a button element in scope,
- then this is a parse error; act as if an end tag with the tag
- name "button" had been seen, then reprocess the token. (We don't
- do that. Unnecessary.) */
- if ($this->elementInScope('button')) {
- $this->inBody(
- array(
- 'name' => 'button',
- 'type' => HTML5::ENDTAG
- )
- );
- }
-
- /* Reconstruct the active formatting elements, if any. */
- $this->reconstructActiveFormattingElements();
-
- /* Insert an HTML element for the token. */
- $this->insertElement($token);
-
- /* Insert a marker at the end of the list of active
- formatting elements. */
- $this->a_formatting[] = self::MARKER;
- break;
-
- /* A start tag token whose tag name is one of: "marquee", "object" */
- case 'marquee':
- case 'object':
- /* Reconstruct the active formatting elements, if any. */
- $this->reconstructActiveFormattingElements();
-
- /* Insert an HTML element for the token. */
- $this->insertElement($token);
-
- /* Insert a marker at the end of the list of active
- formatting elements. */
- $this->a_formatting[] = self::MARKER;
- break;
-
- /* A start tag token whose tag name is "xmp" */
- case 'xmp':
- /* Reconstruct the active formatting elements, if any. */
- $this->reconstructActiveFormattingElements();
-
- /* Insert an HTML element for the token. */
- $this->insertElement($token);
-
- /* Switch the content model flag to the CDATA state. */
- return HTML5::CDATA;
- break;
-
- /* A start tag whose tag name is "table" */
- case 'table':
- /* If the stack of open elements has a p element in scope,
- then act as if an end tag with the tag name p had been seen. */
- if ($this->elementInScope('p')) {
- $this->emitToken(
- array(
- 'name' => 'p',
- 'type' => HTML5::ENDTAG
- )
- );
- }
-
- /* Insert an HTML element for the token. */
- $this->insertElement($token);
-
- /* Change the insertion mode to "in table". */
- $this->mode = self::IN_TABLE;
- break;
-
- /* A start tag whose tag name is one of: "area", "basefont",
- "bgsound", "br", "embed", "img", "param", "spacer", "wbr" */
- case 'area':
- case 'basefont':
- case 'bgsound':
- case 'br':
- case 'embed':
- case 'img':
- case 'param':
- case 'spacer':
- case 'wbr':
- /* Reconstruct the active formatting elements, if any. */
- $this->reconstructActiveFormattingElements();
-
- /* Insert an HTML element for the token. */
- $this->insertElement($token);
-
- /* Immediately pop the current node off the stack of open elements. */
- array_pop($this->stack);
- break;
-
- /* A start tag whose tag name is "hr" */
- case 'hr':
- /* If the stack of open elements has a p element in scope,
- then act as if an end tag with the tag name p had been seen. */
- if ($this->elementInScope('p')) {
- $this->emitToken(
- array(
- 'name' => 'p',
- 'type' => HTML5::ENDTAG
- )
- );
- }
-
- /* Insert an HTML element for the token. */
- $this->insertElement($token);
-
- /* Immediately pop the current node off the stack of open elements. */
- array_pop($this->stack);
- break;
-
- /* A start tag whose tag name is "image" */
- case 'image':
- /* Parse error. Change the token's tag name to "img" and
- reprocess it. (Don't ask.) */
- $token['name'] = 'img';
- return $this->inBody($token);
- break;
-
- /* A start tag whose tag name is "input" */
- case 'input':
- /* Reconstruct the active formatting elements, if any. */
- $this->reconstructActiveFormattingElements();
-
- /* Insert an input element for the token. */
- $element = $this->insertElement($token, false);
-
- /* If the form element pointer is not null, then associate the
- input element with the form element pointed to by the form
- element pointer. */
- $this->form_pointer !== null
- ? $this->form_pointer->appendChild($element)
- : end($this->stack)->appendChild($element);
-
- /* Pop that input element off the stack of open elements. */
- array_pop($this->stack);
- break;
-
- /* A start tag whose tag name is "isindex" */
- case 'isindex':
- /* Parse error. */
- // w/e
-
- /* If the form element pointer is not null,
- then ignore the token. */
- if ($this->form_pointer === null) {
- /* Act as if a start tag token with the tag name "form" had
- been seen. */
- $this->inBody(
- array(
- 'name' => 'body',
- 'type' => HTML5::STARTTAG,
- 'attr' => array()
- )
- );
-
- /* Act as if a start tag token with the tag name "hr" had
- been seen. */
- $this->inBody(
- array(
- 'name' => 'hr',
- 'type' => HTML5::STARTTAG,
- 'attr' => array()
- )
- );
-
- /* Act as if a start tag token with the tag name "p" had
- been seen. */
- $this->inBody(
- array(
- 'name' => 'p',
- 'type' => HTML5::STARTTAG,
- 'attr' => array()
- )
- );
-
- /* Act as if a start tag token with the tag name "label"
- had been seen. */
- $this->inBody(
- array(
- 'name' => 'label',
- 'type' => HTML5::STARTTAG,
- 'attr' => array()
- )
- );
-
- /* Act as if a stream of character tokens had been seen. */
- $this->insertText(
- 'This is a searchable index. ' .
- 'Insert your search keywords here: '
- );
-
- /* Act as if a start tag token with the tag name "input"
- had been seen, with all the attributes from the "isindex"
- token, except with the "name" attribute set to the value
- "isindex" (ignoring any explicit "name" attribute). */
- $attr = $token['attr'];
- $attr[] = array('name' => 'name', 'value' => 'isindex');
-
- $this->inBody(
- array(
- 'name' => 'input',
- 'type' => HTML5::STARTTAG,
- 'attr' => $attr
- )
- );
-
- /* Act as if a stream of character tokens had been seen
- (see below for what they should say). */
- $this->insertText(
- 'This is a searchable index. ' .
- 'Insert your search keywords here: '
- );
-
- /* Act as if an end tag token with the tag name "label"
- had been seen. */
- $this->inBody(
- array(
- 'name' => 'label',
- 'type' => HTML5::ENDTAG
- )
- );
-
- /* Act as if an end tag token with the tag name "p" had
- been seen. */
- $this->inBody(
- array(
- 'name' => 'p',
- 'type' => HTML5::ENDTAG
- )
- );
-
- /* Act as if a start tag token with the tag name "hr" had
- been seen. */
- $this->inBody(
- array(
- 'name' => 'hr',
- 'type' => HTML5::ENDTAG
- )
- );
-
- /* Act as if an end tag token with the tag name "form" had
- been seen. */
- $this->inBody(
- array(
- 'name' => 'form',
- 'type' => HTML5::ENDTAG
- )
- );
- }
- break;
-
- /* A start tag whose tag name is "textarea" */
- case 'textarea':
- $this->insertElement($token);
-
- /* Switch the tokeniser's content model flag to the
- RCDATA state. */
- return HTML5::RCDATA;
- break;
-
- /* A start tag whose tag name is one of: "iframe", "noembed",
- "noframes" */
- case 'iframe':
- case 'noembed':
- case 'noframes':
- $this->insertElement($token);
-
- /* Switch the tokeniser's content model flag to the CDATA state. */
- return HTML5::CDATA;
- break;
-
- /* A start tag whose tag name is "select" */
- case 'select':
- /* Reconstruct the active formatting elements, if any. */
- $this->reconstructActiveFormattingElements();
-
- /* Insert an HTML element for the token. */
- $this->insertElement($token);
-
- /* Change the insertion mode to "in select". */
- $this->mode = self::IN_SELECT;
- break;
-
- /* A start or end tag whose tag name is one of: "caption", "col",
- "colgroup", "frame", "frameset", "head", "option", "optgroup",
- "tbody", "td", "tfoot", "th", "thead", "tr". */
- case 'caption':
- case 'col':
- case 'colgroup':
- case 'frame':
- case 'frameset':
- case 'head':
- case 'option':
- case 'optgroup':
- case 'tbody':
- case 'td':
- case 'tfoot':
- case 'th':
- case 'thead':
- case 'tr':
- // Parse error. Ignore the token.
- break;
-
- /* A start or end tag whose tag name is one of: "event-source",
- "section", "nav", "article", "aside", "header", "footer",
- "datagrid", "command" */
- case 'event-source':
- case 'section':
- case 'nav':
- case 'article':
- case 'aside':
- case 'header':
- case 'footer':
- case 'datagrid':
- case 'command':
- // Work in progress!
- break;
-
- /* A start tag token not covered by the previous entries */
- default:
- /* Reconstruct the active formatting elements, if any. */
- $this->reconstructActiveFormattingElements();
-
- $this->insertElement($token, true, true);
- break;
- }
- break;
-
- case HTML5::ENDTAG:
- switch ($token['name']) {
- /* An end tag with the tag name "body" */
- case 'body':
- /* If the second element in the stack of open elements is
- not a body element, this is a parse error. Ignore the token.
- (innerHTML case) */
- if (count($this->stack) < 2 || $this->stack[1]->nodeName !== 'body') {
- // Ignore.
-
- /* If the current node is not the body element, then this
- is a parse error. */
- } elseif (end($this->stack)->nodeName !== 'body') {
- // Parse error.
- }
-
- /* Change the insertion mode to "after body". */
- $this->mode = self::AFTER_BODY;
- break;
-
- /* An end tag with the tag name "html" */
- case 'html':
- /* Act as if an end tag with tag name "body" had been seen,
- then, if that token wasn't ignored, reprocess the current
- token. */
- $this->inBody(
- array(
- 'name' => 'body',
- 'type' => HTML5::ENDTAG
- )
- );
-
- return $this->afterBody($token);
- break;
-
- /* An end tag whose tag name is one of: "address", "blockquote",
- "center", "dir", "div", "dl", "fieldset", "listing", "menu",
- "ol", "pre", "ul" */
- case 'address':
- case 'blockquote':
- case 'center':
- case 'dir':
- case 'div':
- case 'dl':
- case 'fieldset':
- case 'listing':
- case 'menu':
- case 'ol':
- case 'pre':
- case 'ul':
- /* If the stack of open elements has an element in scope
- with the same tag name as that of the token, then generate
- implied end tags. */
- if ($this->elementInScope($token['name'])) {
- $this->generateImpliedEndTags();
-
- /* Now, if the current node is not an element with
- the same tag name as that of the token, then this
- is a parse error. */
- // w/e
-
- /* If the stack of open elements has an element in
- scope with the same tag name as that of the token,
- then pop elements from this stack until an element
- with that tag name has been popped from the stack. */
- for ($n = count($this->stack) - 1; $n >= 0; $n--) {
- if ($this->stack[$n]->nodeName === $token['name']) {
- $n = -1;
- }
-
- array_pop($this->stack);
- }
- }
- break;
-
- /* An end tag whose tag name is "form" */
- case 'form':
- /* If the stack of open elements has an element in scope
- with the same tag name as that of the token, then generate
- implied end tags. */
- if ($this->elementInScope($token['name'])) {
- $this->generateImpliedEndTags();
-
- }
-
- if (end($this->stack)->nodeName !== $token['name']) {
- /* Now, if the current node is not an element with the
- same tag name as that of the token, then this is a parse
- error. */
- // w/e
-
- } else {
- /* Otherwise, if the current node is an element with
- the same tag name as that of the token pop that element
- from the stack. */
- array_pop($this->stack);
- }
-
- /* In any case, set the form element pointer to null. */
- $this->form_pointer = null;
- break;
-
- /* An end tag whose tag name is "p" */
- case 'p':
- /* If the stack of open elements has a p element in scope,
- then generate implied end tags, except for p elements. */
- if ($this->elementInScope('p')) {
- $this->generateImpliedEndTags(array('p'));
-
- /* If the current node is not a p element, then this is
- a parse error. */
- // k
-
- /* If the stack of open elements has a p element in
- scope, then pop elements from this stack until the stack
- no longer has a p element in scope. */
- for ($n = count($this->stack) - 1; $n >= 0; $n--) {
- if ($this->elementInScope('p')) {
- array_pop($this->stack);
-
- } else {
- break;
- }
- }
- }
- break;
-
- /* An end tag whose tag name is "dd", "dt", or "li" */
- case 'dd':
- case 'dt':
- case 'li':
- /* If the stack of open elements has an element in scope
- whose tag name matches the tag name of the token, then
- generate implied end tags, except for elements with the
- same tag name as the token. */
- if ($this->elementInScope($token['name'])) {
- $this->generateImpliedEndTags(array($token['name']));
-
- /* If the current node is not an element with the same
- tag name as the token, then this is a parse error. */
- // w/e
-
- /* If the stack of open elements has an element in scope
- whose tag name matches the tag name of the token, then
- pop elements from this stack until an element with that
- tag name has been popped from the stack. */
- for ($n = count($this->stack) - 1; $n >= 0; $n--) {
- if ($this->stack[$n]->nodeName === $token['name']) {
- $n = -1;
- }
-
- array_pop($this->stack);
- }
- }
- break;
-
- /* An end tag whose tag name is one of: "h1", "h2", "h3", "h4",
- "h5", "h6" */
- case 'h1':
- case 'h2':
- case 'h3':
- case 'h4':
- case 'h5':
- case 'h6':
- $elements = array('h1', 'h2', 'h3', 'h4', 'h5', 'h6');
-
- /* If the stack of open elements has in scope an element whose
- tag name is one of "h1", "h2", "h3", "h4", "h5", or "h6", then
- generate implied end tags. */
- if ($this->elementInScope($elements)) {
- $this->generateImpliedEndTags();
-
- /* Now, if the current node is not an element with the same
- tag name as that of the token, then this is a parse error. */
- // w/e
-
- /* If the stack of open elements has in scope an element
- whose tag name is one of "h1", "h2", "h3", "h4", "h5", or
- "h6", then pop elements from the stack until an element
- with one of those tag names has been popped from the stack. */
- while ($this->elementInScope($elements)) {
- array_pop($this->stack);
- }
- }
- break;
-
- /* An end tag whose tag name is one of: "a", "b", "big", "em",
- "font", "i", "nobr", "s", "small", "strike", "strong", "tt", "u" */
- case 'a':
- case 'b':
- case 'big':
- case 'em':
- case 'font':
- case 'i':
- case 'nobr':
- case 's':
- case 'small':
- case 'strike':
- case 'strong':
- case 'tt':
- case 'u':
- /* 1. Let the formatting element be the last element in
- the list of active formatting elements that:
- * is between the end of the list and the last scope
- marker in the list, if any, or the start of the list
- otherwise, and
- * has the same tag name as the token.
- */
- while (true) {
- for ($a = count($this->a_formatting) - 1; $a >= 0; $a--) {
- if ($this->a_formatting[$a] === self::MARKER) {
- break;
-
- } elseif ($this->a_formatting[$a]->tagName === $token['name']) {
- $formatting_element = $this->a_formatting[$a];
- $in_stack = in_array($formatting_element, $this->stack, true);
- $fe_af_pos = $a;
- break;
- }
- }
-
- /* If there is no such node, or, if that node is
- also in the stack of open elements but the element
- is not in scope, then this is a parse error. Abort
- these steps. The token is ignored. */
- if (!isset($formatting_element) || ($in_stack &&
- !$this->elementInScope($token['name']))
- ) {
- break;
-
- /* Otherwise, if there is such a node, but that node
- is not in the stack of open elements, then this is a
- parse error; remove the element from the list, and
- abort these steps. */
- } elseif (isset($formatting_element) && !$in_stack) {
- unset($this->a_formatting[$fe_af_pos]);
- $this->a_formatting = array_merge($this->a_formatting);
- break;
- }
-
- /* 2. Let the furthest block be the topmost node in the
- stack of open elements that is lower in the stack
- than the formatting element, and is not an element in
- the phrasing or formatting categories. There might
- not be one. */
- $fe_s_pos = array_search($formatting_element, $this->stack, true);
- $length = count($this->stack);
-
- for ($s = $fe_s_pos + 1; $s < $length; $s++) {
- $category = $this->getElementCategory($this->stack[$s]->nodeName);
-
- if ($category !== self::PHRASING && $category !== self::FORMATTING) {
- $furthest_block = $this->stack[$s];
- }
- }
-
- /* 3. If there is no furthest block, then the UA must
- skip the subsequent steps and instead just pop all
- the nodes from the bottom of the stack of open
- elements, from the current node up to the formatting
- element, and remove the formatting element from the
- list of active formatting elements. */
- if (!isset($furthest_block)) {
- for ($n = $length - 1; $n >= $fe_s_pos; $n--) {
- array_pop($this->stack);
- }
-
- unset($this->a_formatting[$fe_af_pos]);
- $this->a_formatting = array_merge($this->a_formatting);
- break;
- }
-
- /* 4. Let the common ancestor be the element
- immediately above the formatting element in the stack
- of open elements. */
- $common_ancestor = $this->stack[$fe_s_pos - 1];
-
- /* 5. If the furthest block has a parent node, then
- remove the furthest block from its parent node. */
- if ($furthest_block->parentNode !== null) {
- $furthest_block->parentNode->removeChild($furthest_block);
- }
-
- /* 6. Let a bookmark note the position of the
- formatting element in the list of active formatting
- elements relative to the elements on either side
- of it in the list. */
- $bookmark = $fe_af_pos;
-
- /* 7. Let node and last node be the furthest block.
- Follow these steps: */
- $node = $furthest_block;
- $last_node = $furthest_block;
-
- while (true) {
- for ($n = array_search($node, $this->stack, true) - 1; $n >= 0; $n--) {
- /* 7.1 Let node be the element immediately
- prior to node in the stack of open elements. */
- $node = $this->stack[$n];
-
- /* 7.2 If node is not in the list of active
- formatting elements, then remove node from
- the stack of open elements and then go back
- to step 1. */
- if (!in_array($node, $this->a_formatting, true)) {
- unset($this->stack[$n]);
- $this->stack = array_merge($this->stack);
-
- } else {
- break;
- }
- }
-
- /* 7.3 Otherwise, if node is the formatting
- element, then go to the next step in the overall
- algorithm. */
- if ($node === $formatting_element) {
- break;
-
- /* 7.4 Otherwise, if last node is the furthest
- block, then move the aforementioned bookmark to
- be immediately after the node in the list of
- active formatting elements. */
- } elseif ($last_node === $furthest_block) {
- $bookmark = array_search($node, $this->a_formatting, true) + 1;
- }
-
- /* 7.5 If node has any children, perform a
- shallow clone of node, replace the entry for
- node in the list of active formatting elements
- with an entry for the clone, replace the entry
- for node in the stack of open elements with an
- entry for the clone, and let node be the clone. */
- if ($node->hasChildNodes()) {
- $clone = $node->cloneNode();
- $s_pos = array_search($node, $this->stack, true);
- $a_pos = array_search($node, $this->a_formatting, true);
-
- $this->stack[$s_pos] = $clone;
- $this->a_formatting[$a_pos] = $clone;
- $node = $clone;
- }
-
- /* 7.6 Insert last node into node, first removing
- it from its previous parent node if any. */
- if ($last_node->parentNode !== null) {
- $last_node->parentNode->removeChild($last_node);
- }
-
- $node->appendChild($last_node);
-
- /* 7.7 Let last node be node. */
- $last_node = $node;
- }
-
- /* 8. Insert whatever last node ended up being in
- the previous step into the common ancestor node,
- first removing it from its previous parent node if
- any. */
- if ($last_node->parentNode !== null) {
- $last_node->parentNode->removeChild($last_node);
- }
-
- $common_ancestor->appendChild($last_node);
-
- /* 9. Perform a shallow clone of the formatting
- element. */
- $clone = $formatting_element->cloneNode();
-
- /* 10. Take all of the child nodes of the furthest
- block and append them to the clone created in the
- last step. */
- while ($furthest_block->hasChildNodes()) {
- $child = $furthest_block->firstChild;
- $furthest_block->removeChild($child);
- $clone->appendChild($child);
- }
-
- /* 11. Append that clone to the furthest block. */
- $furthest_block->appendChild($clone);
-
- /* 12. Remove the formatting element from the list
- of active formatting elements, and insert the clone
- into the list of active formatting elements at the
- position of the aforementioned bookmark. */
- $fe_af_pos = array_search($formatting_element, $this->a_formatting, true);
- unset($this->a_formatting[$fe_af_pos]);
- $this->a_formatting = array_merge($this->a_formatting);
-
- $af_part1 = array_slice($this->a_formatting, 0, $bookmark - 1);
- $af_part2 = array_slice($this->a_formatting, $bookmark, count($this->a_formatting));
- $this->a_formatting = array_merge($af_part1, array($clone), $af_part2);
-
- /* 13. Remove the formatting element from the stack
- of open elements, and insert the clone into the stack
- of open elements immediately after (i.e. in a more
- deeply nested position than) the position of the
- furthest block in that stack. */
- $fe_s_pos = array_search($formatting_element, $this->stack, true);
- $fb_s_pos = array_search($furthest_block, $this->stack, true);
- unset($this->stack[$fe_s_pos]);
-
- $s_part1 = array_slice($this->stack, 0, $fb_s_pos);
- $s_part2 = array_slice($this->stack, $fb_s_pos + 1, count($this->stack));
- $this->stack = array_merge($s_part1, array($clone), $s_part2);
-
- /* 14. Jump back to step 1 in this series of steps. */
- unset($formatting_element, $fe_af_pos, $fe_s_pos, $furthest_block);
- }
- break;
-
- /* An end tag token whose tag name is one of: "button",
- "marquee", "object" */
- case 'button':
- case 'marquee':
- case 'object':
- /* If the stack of open elements has an element in scope whose
- tag name matches the tag name of the token, then generate implied
- tags. */
- if ($this->elementInScope($token['name'])) {
- $this->generateImpliedEndTags();
-
- /* Now, if the current node is not an element with the same
- tag name as the token, then this is a parse error. */
- // k
-
- /* Now, if the stack of open elements has an element in scope
- whose tag name matches the tag name of the token, then pop
- elements from the stack until that element has been popped from
- the stack, and clear the list of active formatting elements up
- to the last marker. */
- for ($n = count($this->stack) - 1; $n >= 0; $n--) {
- if ($this->stack[$n]->nodeName === $token['name']) {
- $n = -1;
- }
-
- array_pop($this->stack);
- }
-
- $marker = end(array_keys($this->a_formatting, self::MARKER, true));
-
- for ($n = count($this->a_formatting) - 1; $n > $marker; $n--) {
- array_pop($this->a_formatting);
- }
- }
- break;
-
- /* Or an end tag whose tag name is one of: "area", "basefont",
- "bgsound", "br", "embed", "hr", "iframe", "image", "img",
- "input", "isindex", "noembed", "noframes", "param", "select",
- "spacer", "table", "textarea", "wbr" */
- case 'area':
- case 'basefont':
- case 'bgsound':
- case 'br':
- case 'embed':
- case 'hr':
- case 'iframe':
- case 'image':
- case 'img':
- case 'input':
- case 'isindex':
- case 'noembed':
- case 'noframes':
- case 'param':
- case 'select':
- case 'spacer':
- case 'table':
- case 'textarea':
- case 'wbr':
- // Parse error. Ignore the token.
- break;
-
- /* An end tag token not covered by the previous entries */
- default:
- for ($n = count($this->stack) - 1; $n >= 0; $n--) {
- /* Initialise node to be the current node (the bottommost
- node of the stack). */
- $node = end($this->stack);
-
- /* If node has the same tag name as the end tag token,
- then: */
- if ($token['name'] === $node->nodeName) {
- /* Generate implied end tags. */
- $this->generateImpliedEndTags();
-
- /* If the tag name of the end tag token does not
- match the tag name of the current node, this is a
- parse error. */
- // k
-
- /* Pop all the nodes from the current node up to
- node, including node, then stop this algorithm. */
- for ($x = count($this->stack) - $n; $x >= $n; $x--) {
- array_pop($this->stack);
- }
-
- } else {
- $category = $this->getElementCategory($node);
-
- if ($category !== self::SPECIAL && $category !== self::SCOPING) {
- /* Otherwise, if node is in neither the formatting
- category nor the phrasing category, then this is a
- parse error. Stop this algorithm. The end tag token
- is ignored. */
- return false;
- }
- }
- }
- break;
- }
- break;
- }
- }
-
- private function inTable($token)
- {
- $clear = array('html', 'table');
-
- /* A character token that is one of one of U+0009 CHARACTER TABULATION,
- U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
- or U+0020 SPACE */
- if ($token['type'] === HTML5::CHARACTR &&
- preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])
- ) {
- /* Append the character to the current node. */
- $text = $this->dom->createTextNode($token['data']);
- end($this->stack)->appendChild($text);
-
- /* A comment token */
- } elseif ($token['type'] === HTML5::COMMENT) {
- /* Append a Comment node to the current node with the data
- attribute set to the data given in the comment token. */
- $comment = $this->dom->createComment($token['data']);
- end($this->stack)->appendChild($comment);
-
- /* A start tag whose tag name is "caption" */
- } elseif ($token['type'] === HTML5::STARTTAG &&
- $token['name'] === 'caption'
- ) {
- /* Clear the stack back to a table context. */
- $this->clearStackToTableContext($clear);
-
- /* Insert a marker at the end of the list of active
- formatting elements. */
- $this->a_formatting[] = self::MARKER;
-
- /* Insert an HTML element for the token, then switch the
- insertion mode to "in caption". */
- $this->insertElement($token);
- $this->mode = self::IN_CAPTION;
-
- /* A start tag whose tag name is "colgroup" */
- } elseif ($token['type'] === HTML5::STARTTAG &&
- $token['name'] === 'colgroup'
- ) {
- /* Clear the stack back to a table context. */
- $this->clearStackToTableContext($clear);
-
- /* Insert an HTML element for the token, then switch the
- insertion mode to "in column group". */
- $this->insertElement($token);
- $this->mode = self::IN_CGROUP;
-
- /* A start tag whose tag name is "col" */
- } elseif ($token['type'] === HTML5::STARTTAG &&
- $token['name'] === 'col'
- ) {
- $this->inTable(
- array(
- 'name' => 'colgroup',
- 'type' => HTML5::STARTTAG,
- 'attr' => array()
- )
- );
-
- $this->inColumnGroup($token);
-
- /* A start tag whose tag name is one of: "tbody", "tfoot", "thead" */
- } elseif ($token['type'] === HTML5::STARTTAG && in_array(
- $token['name'],
- array('tbody', 'tfoot', 'thead')
- )
- ) {
- /* Clear the stack back to a table context. */
- $this->clearStackToTableContext($clear);
-
- /* Insert an HTML element for the token, then switch the insertion
- mode to "in table body". */
- $this->insertElement($token);
- $this->mode = self::IN_TBODY;
-
- /* A start tag whose tag name is one of: "td", "th", "tr" */
- } elseif ($token['type'] === HTML5::STARTTAG &&
- in_array($token['name'], array('td', 'th', 'tr'))
- ) {
- /* Act as if a start tag token with the tag name "tbody" had been
- seen, then reprocess the current token. */
- $this->inTable(
- array(
- 'name' => 'tbody',
- 'type' => HTML5::STARTTAG,
- 'attr' => array()
- )
- );
-
- return $this->inTableBody($token);
-
- /* A start tag whose tag name is "table" */
- } elseif ($token['type'] === HTML5::STARTTAG &&
- $token['name'] === 'table'
- ) {
- /* Parse error. Act as if an end tag token with the tag name "table"
- had been seen, then, if that token wasn't ignored, reprocess the
- current token. */
- $this->inTable(
- array(
- 'name' => 'table',
- 'type' => HTML5::ENDTAG
- )
- );
-
- return $this->mainPhase($token);
-
- /* An end tag whose tag name is "table" */
- } elseif ($token['type'] === HTML5::ENDTAG &&
- $token['name'] === 'table'
- ) {
- /* If the stack of open elements does not have an element in table
- scope with the same tag name as the token, this is a parse error.
- Ignore the token. (innerHTML case) */
- if (!$this->elementInScope($token['name'], true)) {
- return false;
-
- /* Otherwise: */
- } else {
- /* Generate implied end tags. */
- $this->generateImpliedEndTags();
-
- /* Now, if the current node is not a table element, then this
- is a parse error. */
- // w/e
-
- /* Pop elements from this stack until a table element has been
- popped from the stack. */
- while (true) {
- $current = end($this->stack)->nodeName;
- array_pop($this->stack);
-
- if ($current === 'table') {
- break;
- }
- }
-
- /* Reset the insertion mode appropriately. */
- $this->resetInsertionMode();
- }
-
- /* An end tag whose tag name is one of: "body", "caption", "col",
- "colgroup", "html", "tbody", "td", "tfoot", "th", "thead", "tr" */
- } elseif ($token['type'] === HTML5::ENDTAG && in_array(
- $token['name'],
- array(
- 'body',
- 'caption',
- 'col',
- 'colgroup',
- 'html',
- 'tbody',
- 'td',
- 'tfoot',
- 'th',
- 'thead',
- 'tr'
- )
- )
- ) {
- // Parse error. Ignore the token.
-
- /* Anything else */
- } else {
- /* Parse error. Process the token as if the insertion mode was "in
- body", with the following exception: */
-
- /* If the current node is a table, tbody, tfoot, thead, or tr
- element, then, whenever a node would be inserted into the current
- node, it must instead be inserted into the foster parent element. */
- if (in_array(
- end($this->stack)->nodeName,
- array('table', 'tbody', 'tfoot', 'thead', 'tr')
- )
- ) {
- /* The foster parent element is the parent element of the last
- table element in the stack of open elements, if there is a
- table element and it has such a parent element. If there is no
- table element in the stack of open elements (innerHTML case),
- then the foster parent element is the first element in the
- stack of open elements (the html element). Otherwise, if there
- is a table element in the stack of open elements, but the last
- table element in the stack of open elements has no parent, or
- its parent node is not an element, then the foster parent
- element is the element before the last table element in the
- stack of open elements. */
- for ($n = count($this->stack) - 1; $n >= 0; $n--) {
- if ($this->stack[$n]->nodeName === 'table') {
- $table = $this->stack[$n];
- break;
- }
- }
-
- if (isset($table) && $table->parentNode !== null) {
- $this->foster_parent = $table->parentNode;
-
- } elseif (!isset($table)) {
- $this->foster_parent = $this->stack[0];
-
- } elseif (isset($table) && ($table->parentNode === null ||
- $table->parentNode->nodeType !== XML_ELEMENT_NODE)
- ) {
- $this->foster_parent = $this->stack[$n - 1];
- }
- }
-
- $this->inBody($token);
- }
- }
-
- private function inCaption($token)
- {
- /* An end tag whose tag name is "caption" */
- if ($token['type'] === HTML5::ENDTAG && $token['name'] === 'caption') {
- /* If the stack of open elements does not have an element in table
- scope with the same tag name as the token, this is a parse error.
- Ignore the token. (innerHTML case) */
- if (!$this->elementInScope($token['name'], true)) {
- // Ignore
-
- /* Otherwise: */
- } else {
- /* Generate implied end tags. */
- $this->generateImpliedEndTags();
-
- /* Now, if the current node is not a caption element, then this
- is a parse error. */
- // w/e
-
- /* Pop elements from this stack until a caption element has
- been popped from the stack. */
- while (true) {
- $node = end($this->stack)->nodeName;
- array_pop($this->stack);
-
- if ($node === 'caption') {
- break;
- }
- }
-
- /* Clear the list of active formatting elements up to the last
- marker. */
- $this->clearTheActiveFormattingElementsUpToTheLastMarker();
-
- /* Switch the insertion mode to "in table". */
- $this->mode = self::IN_TABLE;
- }
-
- /* A start tag whose tag name is one of: "caption", "col", "colgroup",
- "tbody", "td", "tfoot", "th", "thead", "tr", or an end tag whose tag
- name is "table" */
- } elseif (($token['type'] === HTML5::STARTTAG && in_array(
- $token['name'],
- array(
- 'caption',
- 'col',
- 'colgroup',
- 'tbody',
- 'td',
- 'tfoot',
- 'th',
- 'thead',
- 'tr'
- )
- )) || ($token['type'] === HTML5::ENDTAG &&
- $token['name'] === 'table')
- ) {
- /* Parse error. Act as if an end tag with the tag name "caption"
- had been seen, then, if that token wasn't ignored, reprocess the
- current token. */
- $this->inCaption(
- array(
- 'name' => 'caption',
- 'type' => HTML5::ENDTAG
- )
- );
-
- return $this->inTable($token);
-
- /* An end tag whose tag name is one of: "body", "col", "colgroup",
- "html", "tbody", "td", "tfoot", "th", "thead", "tr" */
- } elseif ($token['type'] === HTML5::ENDTAG && in_array(
- $token['name'],
- array(
- 'body',
- 'col',
- 'colgroup',
- 'html',
- 'tbody',
- 'tfoot',
- 'th',
- 'thead',
- 'tr'
- )
- )
- ) {
- // Parse error. Ignore the token.
-
- /* Anything else */
- } else {
- /* Process the token as if the insertion mode was "in body". */
- $this->inBody($token);
- }
- }
-
- private function inColumnGroup($token)
- {
- /* A character token that is one of one of U+0009 CHARACTER TABULATION,
- U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
- or U+0020 SPACE */
- if ($token['type'] === HTML5::CHARACTR &&
- preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])
- ) {
- /* Append the character to the current node. */
- $text = $this->dom->createTextNode($token['data']);
- end($this->stack)->appendChild($text);
-
- /* A comment token */
- } elseif ($token['type'] === HTML5::COMMENT) {
- /* Append a Comment node to the current node with the data
- attribute set to the data given in the comment token. */
- $comment = $this->dom->createComment($token['data']);
- end($this->stack)->appendChild($comment);
-
- /* A start tag whose tag name is "col" */
- } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'col') {
- /* Insert a col element for the token. Immediately pop the current
- node off the stack of open elements. */
- $this->insertElement($token);
- array_pop($this->stack);
-
- /* An end tag whose tag name is "colgroup" */
- } elseif ($token['type'] === HTML5::ENDTAG &&
- $token['name'] === 'colgroup'
- ) {
- /* If the current node is the root html element, then this is a
- parse error, ignore the token. (innerHTML case) */
- if (end($this->stack)->nodeName === 'html') {
- // Ignore
-
- /* Otherwise, pop the current node (which will be a colgroup
- element) from the stack of open elements. Switch the insertion
- mode to "in table". */
- } else {
- array_pop($this->stack);
- $this->mode = self::IN_TABLE;
- }
-
- /* An end tag whose tag name is "col" */
- } elseif ($token['type'] === HTML5::ENDTAG && $token['name'] === 'col') {
- /* Parse error. Ignore the token. */
-
- /* Anything else */
- } else {
- /* Act as if an end tag with the tag name "colgroup" had been seen,
- and then, if that token wasn't ignored, reprocess the current token. */
- $this->inColumnGroup(
- array(
- 'name' => 'colgroup',
- 'type' => HTML5::ENDTAG
- )
- );
-
- return $this->inTable($token);
- }
- }
-
- private function inTableBody($token)
- {
- $clear = array('tbody', 'tfoot', 'thead', 'html');
-
- /* A start tag whose tag name is "tr" */
- if ($token['type'] === HTML5::STARTTAG && $token['name'] === 'tr') {
- /* Clear the stack back to a table body context. */
- $this->clearStackToTableContext($clear);
-
- /* Insert a tr element for the token, then switch the insertion
- mode to "in row". */
- $this->insertElement($token);
- $this->mode = self::IN_ROW;
-
- /* A start tag whose tag name is one of: "th", "td" */
- } elseif ($token['type'] === HTML5::STARTTAG &&
- ($token['name'] === 'th' || $token['name'] === 'td')
- ) {
- /* Parse error. Act as if a start tag with the tag name "tr" had
- been seen, then reprocess the current token. */
- $this->inTableBody(
- array(
- 'name' => 'tr',
- 'type' => HTML5::STARTTAG,
- 'attr' => array()
- )
- );
-
- return $this->inRow($token);
-
- /* An end tag whose tag name is one of: "tbody", "tfoot", "thead" */
- } elseif ($token['type'] === HTML5::ENDTAG &&
- in_array($token['name'], array('tbody', 'tfoot', 'thead'))
- ) {
- /* If the stack of open elements does not have an element in table
- scope with the same tag name as the token, this is a parse error.
- Ignore the token. */
- if (!$this->elementInScope($token['name'], true)) {
- // Ignore
-
- /* Otherwise: */
- } else {
- /* Clear the stack back to a table body context. */
- $this->clearStackToTableContext($clear);
-
- /* Pop the current node from the stack of open elements. Switch
- the insertion mode to "in table". */
- array_pop($this->stack);
- $this->mode = self::IN_TABLE;
- }
-
- /* A start tag whose tag name is one of: "caption", "col", "colgroup",
- "tbody", "tfoot", "thead", or an end tag whose tag name is "table" */
- } elseif (($token['type'] === HTML5::STARTTAG && in_array(
- $token['name'],
- array('caption', 'col', 'colgroup', 'tbody', 'tfoor', 'thead')
- )) ||
- ($token['type'] === HTML5::STARTTAG && $token['name'] === 'table')
- ) {
- /* If the stack of open elements does not have a tbody, thead, or
- tfoot element in table scope, this is a parse error. Ignore the
- token. (innerHTML case) */
- if (!$this->elementInScope(array('tbody', 'thead', 'tfoot'), true)) {
- // Ignore.
-
- /* Otherwise: */
- } else {
- /* Clear the stack back to a table body context. */
- $this->clearStackToTableContext($clear);
-
- /* Act as if an end tag with the same tag name as the current
- node ("tbody", "tfoot", or "thead") had been seen, then
- reprocess the current token. */
- $this->inTableBody(
- array(
- 'name' => end($this->stack)->nodeName,
- 'type' => HTML5::ENDTAG
- )
- );
-
- return $this->mainPhase($token);
- }
-
- /* An end tag whose tag name is one of: "body", "caption", "col",
- "colgroup", "html", "td", "th", "tr" */
- } elseif ($token['type'] === HTML5::ENDTAG && in_array(
- $token['name'],
- array('body', 'caption', 'col', 'colgroup', 'html', 'td', 'th', 'tr')
- )
- ) {
- /* Parse error. Ignore the token. */
-
- /* Anything else */
- } else {
- /* Process the token as if the insertion mode was "in table". */
- $this->inTable($token);
- }
- }
-
- private function inRow($token)
- {
- $clear = array('tr', 'html');
-
- /* A start tag whose tag name is one of: "th", "td" */
- if ($token['type'] === HTML5::STARTTAG &&
- ($token['name'] === 'th' || $token['name'] === 'td')
- ) {
- /* Clear the stack back to a table row context. */
- $this->clearStackToTableContext($clear);
-
- /* Insert an HTML element for the token, then switch the insertion
- mode to "in cell". */
- $this->insertElement($token);
- $this->mode = self::IN_CELL;
-
- /* Insert a marker at the end of the list of active formatting
- elements. */
- $this->a_formatting[] = self::MARKER;
-
- /* An end tag whose tag name is "tr" */
- } elseif ($token['type'] === HTML5::ENDTAG && $token['name'] === 'tr') {
- /* If the stack of open elements does not have an element in table
- scope with the same tag name as the token, this is a parse error.
- Ignore the token. (innerHTML case) */
- if (!$this->elementInScope($token['name'], true)) {
- // Ignore.
-
- /* Otherwise: */
- } else {
- /* Clear the stack back to a table row context. */
- $this->clearStackToTableContext($clear);
-
- /* Pop the current node (which will be a tr element) from the
- stack of open elements. Switch the insertion mode to "in table
- body". */
- array_pop($this->stack);
- $this->mode = self::IN_TBODY;
- }
-
- /* A start tag whose tag name is one of: "caption", "col", "colgroup",
- "tbody", "tfoot", "thead", "tr" or an end tag whose tag name is "table" */
- } elseif ($token['type'] === HTML5::STARTTAG && in_array(
- $token['name'],
- array('caption', 'col', 'colgroup', 'tbody', 'tfoot', 'thead', 'tr')
- )
- ) {
- /* Act as if an end tag with the tag name "tr" had been seen, then,
- if that token wasn't ignored, reprocess the current token. */
- $this->inRow(
- array(
- 'name' => 'tr',
- 'type' => HTML5::ENDTAG
- )
- );
-
- return $this->inCell($token);
-
- /* An end tag whose tag name is one of: "tbody", "tfoot", "thead" */
- } elseif ($token['type'] === HTML5::ENDTAG &&
- in_array($token['name'], array('tbody', 'tfoot', 'thead'))
- ) {
- /* If the stack of open elements does not have an element in table
- scope with the same tag name as the token, this is a parse error.
- Ignore the token. */
- if (!$this->elementInScope($token['name'], true)) {
- // Ignore.
-
- /* Otherwise: */
- } else {
- /* Otherwise, act as if an end tag with the tag name "tr" had
- been seen, then reprocess the current token. */
- $this->inRow(
- array(
- 'name' => 'tr',
- 'type' => HTML5::ENDTAG
- )
- );
-
- return $this->inCell($token);
- }
-
- /* An end tag whose tag name is one of: "body", "caption", "col",
- "colgroup", "html", "td", "th" */
- } elseif ($token['type'] === HTML5::ENDTAG && in_array(
- $token['name'],
- array('body', 'caption', 'col', 'colgroup', 'html', 'td', 'th', 'tr')
- )
- ) {
- /* Parse error. Ignore the token. */
-
- /* Anything else */
- } else {
- /* Process the token as if the insertion mode was "in table". */
- $this->inTable($token);
- }
- }
-
- private function inCell($token)
- {
- /* An end tag whose tag name is one of: "td", "th" */
- if ($token['type'] === HTML5::ENDTAG &&
- ($token['name'] === 'td' || $token['name'] === 'th')
- ) {
- /* If the stack of open elements does not have an element in table
- scope with the same tag name as that of the token, then this is a
- parse error and the token must be ignored. */
- if (!$this->elementInScope($token['name'], true)) {
- // Ignore.
-
- /* Otherwise: */
- } else {
- /* Generate implied end tags, except for elements with the same
- tag name as the token. */
- $this->generateImpliedEndTags(array($token['name']));
-
- /* Now, if the current node is not an element with the same tag
- name as the token, then this is a parse error. */
- // k
-
- /* Pop elements from this stack until an element with the same
- tag name as the token has been popped from the stack. */
- while (true) {
- $node = end($this->stack)->nodeName;
- array_pop($this->stack);
-
- if ($node === $token['name']) {
- break;
- }
- }
-
- /* Clear the list of active formatting elements up to the last
- marker. */
- $this->clearTheActiveFormattingElementsUpToTheLastMarker();
-
- /* Switch the insertion mode to "in row". (The current node
- will be a tr element at this point.) */
- $this->mode = self::IN_ROW;
- }
-
- /* A start tag whose tag name is one of: "caption", "col", "colgroup",
- "tbody", "td", "tfoot", "th", "thead", "tr" */
- } elseif ($token['type'] === HTML5::STARTTAG && in_array(
- $token['name'],
- array(
- 'caption',
- 'col',
- 'colgroup',
- 'tbody',
- 'td',
- 'tfoot',
- 'th',
- 'thead',
- 'tr'
- )
- )
- ) {
- /* If the stack of open elements does not have a td or th element
- in table scope, then this is a parse error; ignore the token.
- (innerHTML case) */
- if (!$this->elementInScope(array('td', 'th'), true)) {
- // Ignore.
-
- /* Otherwise, close the cell (see below) and reprocess the current
- token. */
- } else {
- $this->closeCell();
- return $this->inRow($token);
- }
-
- /* A start tag whose tag name is one of: "caption", "col", "colgroup",
- "tbody", "td", "tfoot", "th", "thead", "tr" */
- } elseif ($token['type'] === HTML5::STARTTAG && in_array(
- $token['name'],
- array(
- 'caption',
- 'col',
- 'colgroup',
- 'tbody',
- 'td',
- 'tfoot',
- 'th',
- 'thead',
- 'tr'
- )
- )
- ) {
- /* If the stack of open elements does not have a td or th element
- in table scope, then this is a parse error; ignore the token.
- (innerHTML case) */
- if (!$this->elementInScope(array('td', 'th'), true)) {
- // Ignore.
-
- /* Otherwise, close the cell (see below) and reprocess the current
- token. */
- } else {
- $this->closeCell();
- return $this->inRow($token);
- }
-
- /* An end tag whose tag name is one of: "body", "caption", "col",
- "colgroup", "html" */
- } elseif ($token['type'] === HTML5::ENDTAG && in_array(
- $token['name'],
- array('body', 'caption', 'col', 'colgroup', 'html')
- )
- ) {
- /* Parse error. Ignore the token. */
-
- /* An end tag whose tag name is one of: "table", "tbody", "tfoot",
- "thead", "tr" */
- } elseif ($token['type'] === HTML5::ENDTAG && in_array(
- $token['name'],
- array('table', 'tbody', 'tfoot', 'thead', 'tr')
- )
- ) {
- /* If the stack of open elements does not have an element in table
- scope with the same tag name as that of the token (which can only
- happen for "tbody", "tfoot" and "thead", or, in the innerHTML case),
- then this is a parse error and the token must be ignored. */
- if (!$this->elementInScope($token['name'], true)) {
- // Ignore.
-
- /* Otherwise, close the cell (see below) and reprocess the current
- token. */
- } else {
- $this->closeCell();
- return $this->inRow($token);
- }
-
- /* Anything else */
- } else {
- /* Process the token as if the insertion mode was "in body". */
- $this->inBody($token);
- }
- }
-
- private function inSelect($token)
- {
- /* Handle the token as follows: */
-
- /* A character token */
- if ($token['type'] === HTML5::CHARACTR) {
- /* Append the token's character to the current node. */
- $this->insertText($token['data']);
-
- /* A comment token */
- } elseif ($token['type'] === HTML5::COMMENT) {
- /* Append a Comment node to the current node with the data
- attribute set to the data given in the comment token. */
- $this->insertComment($token['data']);
-
- /* A start tag token whose tag name is "option" */
- } elseif ($token['type'] === HTML5::STARTTAG &&
- $token['name'] === 'option'
- ) {
- /* If the current node is an option element, act as if an end tag
- with the tag name "option" had been seen. */
- if (end($this->stack)->nodeName === 'option') {
- $this->inSelect(
- array(
- 'name' => 'option',
- 'type' => HTML5::ENDTAG
- )
- );
- }
-
- /* Insert an HTML element for the token. */
- $this->insertElement($token);
-
- /* A start tag token whose tag name is "optgroup" */
- } elseif ($token['type'] === HTML5::STARTTAG &&
- $token['name'] === 'optgroup'
- ) {
- /* If the current node is an option element, act as if an end tag
- with the tag name "option" had been seen. */
- if (end($this->stack)->nodeName === 'option') {
- $this->inSelect(
- array(
- 'name' => 'option',
- 'type' => HTML5::ENDTAG
- )
- );
- }
-
- /* If the current node is an optgroup element, act as if an end tag
- with the tag name "optgroup" had been seen. */
- if (end($this->stack)->nodeName === 'optgroup') {
- $this->inSelect(
- array(
- 'name' => 'optgroup',
- 'type' => HTML5::ENDTAG
- )
- );
- }
-
- /* Insert an HTML element for the token. */
- $this->insertElement($token);
-
- /* An end tag token whose tag name is "optgroup" */
- } elseif ($token['type'] === HTML5::ENDTAG &&
- $token['name'] === 'optgroup'
- ) {
- /* First, if the current node is an option element, and the node
- immediately before it in the stack of open elements is an optgroup
- element, then act as if an end tag with the tag name "option" had
- been seen. */
- $elements_in_stack = count($this->stack);
-
- if ($this->stack[$elements_in_stack - 1]->nodeName === 'option' &&
- $this->stack[$elements_in_stack - 2]->nodeName === 'optgroup'
- ) {
- $this->inSelect(
- array(
- 'name' => 'option',
- 'type' => HTML5::ENDTAG
- )
- );
- }
-
- /* If the current node is an optgroup element, then pop that node
- from the stack of open elements. Otherwise, this is a parse error,
- ignore the token. */
- if ($this->stack[$elements_in_stack - 1] === 'optgroup') {
- array_pop($this->stack);
- }
-
- /* An end tag token whose tag name is "option" */
- } elseif ($token['type'] === HTML5::ENDTAG &&
- $token['name'] === 'option'
- ) {
- /* If the current node is an option element, then pop that node
- from the stack of open elements. Otherwise, this is a parse error,
- ignore the token. */
- if (end($this->stack)->nodeName === 'option') {
- array_pop($this->stack);
- }
-
- /* An end tag whose tag name is "select" */
- } elseif ($token['type'] === HTML5::ENDTAG &&
- $token['name'] === 'select'
- ) {
- /* If the stack of open elements does not have an element in table
- scope with the same tag name as the token, this is a parse error.
- Ignore the token. (innerHTML case) */
- if (!$this->elementInScope($token['name'], true)) {
- // w/e
-
- /* Otherwise: */
- } else {
- /* Pop elements from the stack of open elements until a select
- element has been popped from the stack. */
- while (true) {
- $current = end($this->stack)->nodeName;
- array_pop($this->stack);
-
- if ($current === 'select') {
- break;
- }
- }
-
- /* Reset the insertion mode appropriately. */
- $this->resetInsertionMode();
- }
-
- /* A start tag whose tag name is "select" */
- } elseif ($token['name'] === 'select' &&
- $token['type'] === HTML5::STARTTAG
- ) {
- /* Parse error. Act as if the token had been an end tag with the
- tag name "select" instead. */
- $this->inSelect(
- array(
- 'name' => 'select',
- 'type' => HTML5::ENDTAG
- )
- );
-
- /* An end tag whose tag name is one of: "caption", "table", "tbody",
- "tfoot", "thead", "tr", "td", "th" */
- } elseif (in_array(
- $token['name'],
- array(
- 'caption',
- 'table',
- 'tbody',
- 'tfoot',
- 'thead',
- 'tr',
- 'td',
- 'th'
- )
- ) && $token['type'] === HTML5::ENDTAG
- ) {
- /* Parse error. */
- // w/e
-
- /* If the stack of open elements has an element in table scope with
- the same tag name as that of the token, then act as if an end tag
- with the tag name "select" had been seen, and reprocess the token.
- Otherwise, ignore the token. */
- if ($this->elementInScope($token['name'], true)) {
- $this->inSelect(
- array(
- 'name' => 'select',
- 'type' => HTML5::ENDTAG
- )
- );
-
- $this->mainPhase($token);
- }
-
- /* Anything else */
- } else {
- /* Parse error. Ignore the token. */
- }
- }
-
- private function afterBody($token)
- {
- /* Handle the token as follows: */
-
- /* A character token that is one of one of U+0009 CHARACTER TABULATION,
- U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
- or U+0020 SPACE */
- if ($token['type'] === HTML5::CHARACTR &&
- preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])
- ) {
- /* Process the token as it would be processed if the insertion mode
- was "in body". */
- $this->inBody($token);
-
- /* A comment token */
- } elseif ($token['type'] === HTML5::COMMENT) {
- /* Append a Comment node to the first element in the stack of open
- elements (the html element), with the data attribute set to the
- data given in the comment token. */
- $comment = $this->dom->createComment($token['data']);
- $this->stack[0]->appendChild($comment);
-
- /* An end tag with the tag name "html" */
- } elseif ($token['type'] === HTML5::ENDTAG && $token['name'] === 'html') {
- /* If the parser was originally created in order to handle the
- setting of an element's innerHTML attribute, this is a parse error;
- ignore the token. (The element will be an html element in this
- case.) (innerHTML case) */
-
- /* Otherwise, switch to the trailing end phase. */
- $this->phase = self::END_PHASE;
-
- /* Anything else */
- } else {
- /* Parse error. Set the insertion mode to "in body" and reprocess
- the token. */
- $this->mode = self::IN_BODY;
- return $this->inBody($token);
- }
- }
-
- private function inFrameset($token)
- {
- /* Handle the token as follows: */
-
- /* A character token that is one of one of U+0009 CHARACTER TABULATION,
- U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
- U+000D CARRIAGE RETURN (CR), or U+0020 SPACE */
- if ($token['type'] === HTML5::CHARACTR &&
- preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])
- ) {
- /* Append the character to the current node. */
- $this->insertText($token['data']);
-
- /* A comment token */
- } elseif ($token['type'] === HTML5::COMMENT) {
- /* Append a Comment node to the current node with the data
- attribute set to the data given in the comment token. */
- $this->insertComment($token['data']);
-
- /* A start tag with the tag name "frameset" */
- } elseif ($token['name'] === 'frameset' &&
- $token['type'] === HTML5::STARTTAG
- ) {
- $this->insertElement($token);
-
- /* An end tag with the tag name "frameset" */
- } elseif ($token['name'] === 'frameset' &&
- $token['type'] === HTML5::ENDTAG
- ) {
- /* If the current node is the root html element, then this is a
- parse error; ignore the token. (innerHTML case) */
- if (end($this->stack)->nodeName === 'html') {
- // Ignore
-
- } else {
- /* Otherwise, pop the current node from the stack of open
- elements. */
- array_pop($this->stack);
-
- /* If the parser was not originally created in order to handle
- the setting of an element's innerHTML attribute (innerHTML case),
- and the current node is no longer a frameset element, then change
- the insertion mode to "after frameset". */
- $this->mode = self::AFTR_FRAME;
- }
-
- /* A start tag with the tag name "frame" */
- } elseif ($token['name'] === 'frame' &&
- $token['type'] === HTML5::STARTTAG
- ) {
- /* Insert an HTML element for the token. */
- $this->insertElement($token);
-
- /* Immediately pop the current node off the stack of open elements. */
- array_pop($this->stack);
-
- /* A start tag with the tag name "noframes" */
- } elseif ($token['name'] === 'noframes' &&
- $token['type'] === HTML5::STARTTAG
- ) {
- /* Process the token as if the insertion mode had been "in body". */
- $this->inBody($token);
-
- /* Anything else */
- } else {
- /* Parse error. Ignore the token. */
- }
- }
-
- private function afterFrameset($token)
- {
- /* Handle the token as follows: */
-
- /* A character token that is one of one of U+0009 CHARACTER TABULATION,
- U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
- U+000D CARRIAGE RETURN (CR), or U+0020 SPACE */
- if ($token['type'] === HTML5::CHARACTR &&
- preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])
- ) {
- /* Append the character to the current node. */
- $this->insertText($token['data']);
-
- /* A comment token */
- } elseif ($token['type'] === HTML5::COMMENT) {
- /* Append a Comment node to the current node with the data
- attribute set to the data given in the comment token. */
- $this->insertComment($token['data']);
-
- /* An end tag with the tag name "html" */
- } elseif ($token['name'] === 'html' &&
- $token['type'] === HTML5::ENDTAG
- ) {
- /* Switch to the trailing end phase. */
- $this->phase = self::END_PHASE;
-
- /* A start tag with the tag name "noframes" */
- } elseif ($token['name'] === 'noframes' &&
- $token['type'] === HTML5::STARTTAG
- ) {
- /* Process the token as if the insertion mode had been "in body". */
- $this->inBody($token);
-
- /* Anything else */
- } else {
- /* Parse error. Ignore the token. */
- }
- }
-
- private function trailingEndPhase($token)
- {
- /* After the main phase, as each token is emitted from the tokenisation
- stage, it must be processed as described in this section. */
-
- /* A DOCTYPE token */
- if ($token['type'] === HTML5::DOCTYPE) {
- // Parse error. Ignore the token.
-
- /* A comment token */
- } elseif ($token['type'] === HTML5::COMMENT) {
- /* Append a Comment node to the Document object with the data
- attribute set to the data given in the comment token. */
- $comment = $this->dom->createComment($token['data']);
- $this->dom->appendChild($comment);
-
- /* A character token that is one of one of U+0009 CHARACTER TABULATION,
- U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
- or U+0020 SPACE */
- } elseif ($token['type'] === HTML5::CHARACTR &&
- preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])
- ) {
- /* Process the token as it would be processed in the main phase. */
- $this->mainPhase($token);
-
- /* A character token that is not one of U+0009 CHARACTER TABULATION,
- U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
- or U+0020 SPACE. Or a start tag token. Or an end tag token. */
- } elseif (($token['type'] === HTML5::CHARACTR &&
- preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) ||
- $token['type'] === HTML5::STARTTAG || $token['type'] === HTML5::ENDTAG
- ) {
- /* Parse error. Switch back to the main phase and reprocess the
- token. */
- $this->phase = self::MAIN_PHASE;
- return $this->mainPhase($token);
-
- /* An end-of-file token */
- } elseif ($token['type'] === HTML5::EOF) {
- /* OMG DONE!! */
- }
- }
-
- private function insertElement($token, $append = true, $check = false)
- {
- // Proprietary workaround for libxml2's limitations with tag names
- if ($check) {
- // Slightly modified HTML5 tag-name modification,
- // removing anything that's not an ASCII letter, digit, or hyphen
- $token['name'] = preg_replace('/[^a-z0-9-]/i', '', $token['name']);
- // Remove leading hyphens and numbers
- $token['name'] = ltrim($token['name'], '-0..9');
- // In theory, this should ever be needed, but just in case
- if ($token['name'] === '') {
- $token['name'] = 'span';
- } // arbitrary generic choice
- }
-
- $el = $this->dom->createElement($token['name']);
-
- foreach ($token['attr'] as $attr) {
- if (!$el->hasAttribute($attr['name'])) {
- $el->setAttribute($attr['name'], $attr['value']);
- }
- }
-
- $this->appendToRealParent($el);
- $this->stack[] = $el;
-
- return $el;
- }
-
- private function insertText($data)
- {
- $text = $this->dom->createTextNode($data);
- $this->appendToRealParent($text);
- }
-
- private function insertComment($data)
- {
- $comment = $this->dom->createComment($data);
- $this->appendToRealParent($comment);
- }
-
- private function appendToRealParent($node)
- {
- if ($this->foster_parent === null) {
- end($this->stack)->appendChild($node);
-
- } elseif ($this->foster_parent !== null) {
- /* If the foster parent element is the parent element of the
- last table element in the stack of open elements, then the new
- node must be inserted immediately before the last table element
- in the stack of open elements in the foster parent element;
- otherwise, the new node must be appended to the foster parent
- element. */
- for ($n = count($this->stack) - 1; $n >= 0; $n--) {
- if ($this->stack[$n]->nodeName === 'table' &&
- $this->stack[$n]->parentNode !== null
- ) {
- $table = $this->stack[$n];
- break;
- }
- }
-
- if (isset($table) && $this->foster_parent->isSameNode($table->parentNode)) {
- $this->foster_parent->insertBefore($node, $table);
- } else {
- $this->foster_parent->appendChild($node);
- }
-
- $this->foster_parent = null;
- }
- }
-
- private function elementInScope($el, $table = false)
- {
- if (is_array($el)) {
- foreach ($el as $element) {
- if ($this->elementInScope($element, $table)) {
- return true;
- }
- }
-
- return false;
- }
-
- $leng = count($this->stack);
-
- for ($n = 0; $n < $leng; $n++) {
- /* 1. Initialise node to be the current node (the bottommost node of
- the stack). */
- $node = $this->stack[$leng - 1 - $n];
-
- if ($node->tagName === $el) {
- /* 2. If node is the target node, terminate in a match state. */
- return true;
-
- } elseif ($node->tagName === 'table') {
- /* 3. Otherwise, if node is a table element, terminate in a failure
- state. */
- return false;
-
- } elseif ($table === true && in_array(
- $node->tagName,
- array(
- 'caption',
- 'td',
- 'th',
- 'button',
- 'marquee',
- 'object'
- )
- )
- ) {
- /* 4. Otherwise, if the algorithm is the "has an element in scope"
- variant (rather than the "has an element in table scope" variant),
- and node is one of the following, terminate in a failure state. */
- return false;
-
- } elseif ($node === $node->ownerDocument->documentElement) {
- /* 5. Otherwise, if node is an html element (root element), terminate
- in a failure state. (This can only happen if the node is the topmost
- node of the stack of open elements, and prevents the next step from
- being invoked if there are no more elements in the stack.) */
- return false;
- }
-
- /* Otherwise, set node to the previous entry in the stack of open
- elements and return to step 2. (This will never fail, since the loop
- will always terminate in the previous step if the top of the stack
- is reached.) */
- }
- }
-
- private function reconstructActiveFormattingElements()
- {
- /* 1. If there are no entries in the list of active formatting elements,
- then there is nothing to reconstruct; stop this algorithm. */
- $formatting_elements = count($this->a_formatting);
-
- if ($formatting_elements === 0) {
- return false;
- }
-
- /* 3. Let entry be the last (most recently added) element in the list
- of active formatting elements. */
- $entry = end($this->a_formatting);
-
- /* 2. If the last (most recently added) entry in the list of active
- formatting elements is a marker, or if it is an element that is in the
- stack of open elements, then there is nothing to reconstruct; stop this
- algorithm. */
- if ($entry === self::MARKER || in_array($entry, $this->stack, true)) {
- return false;
- }
-
- for ($a = $formatting_elements - 1; $a >= 0; true) {
- /* 4. If there are no entries before entry in the list of active
- formatting elements, then jump to step 8. */
- if ($a === 0) {
- $step_seven = false;
- break;
- }
-
- /* 5. Let entry be the entry one earlier than entry in the list of
- active formatting elements. */
- $a--;
- $entry = $this->a_formatting[$a];
-
- /* 6. If entry is neither a marker nor an element that is also in
- thetack of open elements, go to step 4. */
- if ($entry === self::MARKER || in_array($entry, $this->stack, true)) {
- break;
- }
- }
-
- while (true) {
- /* 7. Let entry be the element one later than entry in the list of
- active formatting elements. */
- if (isset($step_seven) && $step_seven === true) {
- $a++;
- $entry = $this->a_formatting[$a];
- }
-
- /* 8. Perform a shallow clone of the element entry to obtain clone. */
- $clone = $entry->cloneNode();
-
- /* 9. Append clone to the current node and push it onto the stack
- of open elements so that it is the new current node. */
- end($this->stack)->appendChild($clone);
- $this->stack[] = $clone;
-
- /* 10. Replace the entry for entry in the list with an entry for
- clone. */
- $this->a_formatting[$a] = $clone;
-
- /* 11. If the entry for clone in the list of active formatting
- elements is not the last entry in the list, return to step 7. */
- if (end($this->a_formatting) !== $clone) {
- $step_seven = true;
- } else {
- break;
- }
- }
- }
-
- private function clearTheActiveFormattingElementsUpToTheLastMarker()
- {
- /* When the steps below require the UA to clear the list of active
- formatting elements up to the last marker, the UA must perform the
- following steps: */
-
- while (true) {
- /* 1. Let entry be the last (most recently added) entry in the list
- of active formatting elements. */
- $entry = end($this->a_formatting);
-
- /* 2. Remove entry from the list of active formatting elements. */
- array_pop($this->a_formatting);
-
- /* 3. If entry was a marker, then stop the algorithm at this point.
- The list has been cleared up to the last marker. */
- if ($entry === self::MARKER) {
- break;
- }
- }
- }
-
- private function generateImpliedEndTags($exclude = array())
- {
- /* When the steps below require the UA to generate implied end tags,
- then, if the current node is a dd element, a dt element, an li element,
- a p element, a td element, a th element, or a tr element, the UA must
- act as if an end tag with the respective tag name had been seen and
- then generate implied end tags again. */
- $node = end($this->stack);
- $elements = array_diff(array('dd', 'dt', 'li', 'p', 'td', 'th', 'tr'), $exclude);
-
- while (in_array(end($this->stack)->nodeName, $elements)) {
- array_pop($this->stack);
- }
- }
-
- private function getElementCategory($node)
- {
- $name = $node->tagName;
- if (in_array($name, $this->special)) {
- return self::SPECIAL;
- } elseif (in_array($name, $this->scoping)) {
- return self::SCOPING;
- } elseif (in_array($name, $this->formatting)) {
- return self::FORMATTING;
- } else {
- return self::PHRASING;
- }
- }
-
- private function clearStackToTableContext($elements)
- {
- /* When the steps above require the UA to clear the stack back to a
- table context, it means that the UA must, while the current node is not
- a table element or an html element, pop elements from the stack of open
- elements. If this causes any elements to be popped from the stack, then
- this is a parse error. */
- while (true) {
- $node = end($this->stack)->nodeName;
-
- if (in_array($node, $elements)) {
- break;
- } else {
- array_pop($this->stack);
- }
- }
- }
-
- private function resetInsertionMode()
- {
- /* 1. Let last be false. */
- $last = false;
- $leng = count($this->stack);
-
- for ($n = $leng - 1; $n >= 0; $n--) {
- /* 2. Let node be the last node in the stack of open elements. */
- $node = $this->stack[$n];
-
- /* 3. If node is the first node in the stack of open elements, then
- set last to true. If the element whose innerHTML attribute is being
- set is neither a td element nor a th element, then set node to the
- element whose innerHTML attribute is being set. (innerHTML case) */
- if ($this->stack[0]->isSameNode($node)) {
- $last = true;
- }
-
- /* 4. If node is a select element, then switch the insertion mode to
- "in select" and abort these steps. (innerHTML case) */
- if ($node->nodeName === 'select') {
- $this->mode = self::IN_SELECT;
- break;
-
- /* 5. If node is a td or th element, then switch the insertion mode
- to "in cell" and abort these steps. */
- } elseif ($node->nodeName === 'td' || $node->nodeName === 'th') {
- $this->mode = self::IN_CELL;
- break;
-
- /* 6. If node is a tr element, then switch the insertion mode to
- "in row" and abort these steps. */
- } elseif ($node->nodeName === 'tr') {
- $this->mode = self::IN_ROW;
- break;
-
- /* 7. If node is a tbody, thead, or tfoot element, then switch the
- insertion mode to "in table body" and abort these steps. */
- } elseif (in_array($node->nodeName, array('tbody', 'thead', 'tfoot'))) {
- $this->mode = self::IN_TBODY;
- break;
-
- /* 8. If node is a caption element, then switch the insertion mode
- to "in caption" and abort these steps. */
- } elseif ($node->nodeName === 'caption') {
- $this->mode = self::IN_CAPTION;
- break;
-
- /* 9. If node is a colgroup element, then switch the insertion mode
- to "in column group" and abort these steps. (innerHTML case) */
- } elseif ($node->nodeName === 'colgroup') {
- $this->mode = self::IN_CGROUP;
- break;
-
- /* 10. If node is a table element, then switch the insertion mode
- to "in table" and abort these steps. */
- } elseif ($node->nodeName === 'table') {
- $this->mode = self::IN_TABLE;
- break;
-
- /* 11. If node is a head element, then switch the insertion mode
- to "in body" ("in body"! not "in head"!) and abort these steps.
- (innerHTML case) */
- } elseif ($node->nodeName === 'head') {
- $this->mode = self::IN_BODY;
- break;
-
- /* 12. If node is a body element, then switch the insertion mode to
- "in body" and abort these steps. */
- } elseif ($node->nodeName === 'body') {
- $this->mode = self::IN_BODY;
- break;
-
- /* 13. If node is a frameset element, then switch the insertion
- mode to "in frameset" and abort these steps. (innerHTML case) */
- } elseif ($node->nodeName === 'frameset') {
- $this->mode = self::IN_FRAME;
- break;
-
- /* 14. If node is an html element, then: if the head element
- pointer is null, switch the insertion mode to "before head",
- otherwise, switch the insertion mode to "after head". In either
- case, abort these steps. (innerHTML case) */
- } elseif ($node->nodeName === 'html') {
- $this->mode = ($this->head_pointer === null)
- ? self::BEFOR_HEAD
- : self::AFTER_HEAD;
-
- break;
-
- /* 15. If last is true, then set the insertion mode to "in body"
- and abort these steps. (innerHTML case) */
- } elseif ($last) {
- $this->mode = self::IN_BODY;
- break;
- }
- }
- }
-
- private function closeCell()
- {
- /* If the stack of open elements has a td or th element in table scope,
- then act as if an end tag token with that tag name had been seen. */
- foreach (array('td', 'th') as $cell) {
- if ($this->elementInScope($cell, true)) {
- $this->inCell(
- array(
- 'name' => $cell,
- 'type' => HTML5::ENDTAG
- )
- );
-
- break;
- }
- }
- }
-
- public function save()
- {
- return $this->dom;
- }
-}
diff --git a/library/HTMLPurifier/Printer/ConfigForm.php b/library/HTMLPurifier/Printer/ConfigForm.php
deleted file mode 100644
index 36100ce73..000000000
--- a/library/HTMLPurifier/Printer/ConfigForm.php
+++ /dev/null
@@ -1,447 +0,0 @@
-<?php
-
-/**
- * @todo Rewrite to use Interchange objects
- */
-class HTMLPurifier_Printer_ConfigForm extends HTMLPurifier_Printer
-{
-
- /**
- * Printers for specific fields.
- * @type HTMLPurifier_Printer[]
- */
- protected $fields = array();
-
- /**
- * Documentation URL, can have fragment tagged on end.
- * @type string
- */
- protected $docURL;
-
- /**
- * Name of form element to stuff config in.
- * @type string
- */
- protected $name;
-
- /**
- * Whether or not to compress directive names, clipping them off
- * after a certain amount of letters. False to disable or integer letters
- * before clipping.
- * @type bool
- */
- protected $compress = false;
-
- /**
- * @param string $name Form element name for directives to be stuffed into
- * @param string $doc_url String documentation URL, will have fragment tagged on
- * @param bool $compress Integer max length before compressing a directive name, set to false to turn off
- */
- public function __construct(
- $name,
- $doc_url = null,
- $compress = false
- ) {
- parent::__construct();
- $this->docURL = $doc_url;
- $this->name = $name;
- $this->compress = $compress;
- // initialize sub-printers
- $this->fields[0] = new HTMLPurifier_Printer_ConfigForm_default();
- $this->fields[HTMLPurifier_VarParser::BOOL] = new HTMLPurifier_Printer_ConfigForm_bool();
- }
-
- /**
- * Sets default column and row size for textareas in sub-printers
- * @param $cols Integer columns of textarea, null to use default
- * @param $rows Integer rows of textarea, null to use default
- */
- public function setTextareaDimensions($cols = null, $rows = null)
- {
- if ($cols) {
- $this->fields['default']->cols = $cols;
- }
- if ($rows) {
- $this->fields['default']->rows = $rows;
- }
- }
-
- /**
- * Retrieves styling, in case it is not accessible by webserver
- */
- public static function getCSS()
- {
- return file_get_contents(HTMLPURIFIER_PREFIX . '/HTMLPurifier/Printer/ConfigForm.css');
- }
-
- /**
- * Retrieves JavaScript, in case it is not accessible by webserver
- */
- public static function getJavaScript()
- {
- return file_get_contents(HTMLPURIFIER_PREFIX . '/HTMLPurifier/Printer/ConfigForm.js');
- }
-
- /**
- * Returns HTML output for a configuration form
- * @param HTMLPurifier_Config|array $config Configuration object of current form state, or an array
- * where [0] has an HTML namespace and [1] is being rendered.
- * @param array|bool $allowed Optional namespace(s) and directives to restrict form to.
- * @param bool $render_controls
- * @return string
- */
- public function render($config, $allowed = true, $render_controls = true)
- {
- if (is_array($config) && isset($config[0])) {
- $gen_config = $config[0];
- $config = $config[1];
- } else {
- $gen_config = $config;
- }
-
- $this->config = $config;
- $this->genConfig = $gen_config;
- $this->prepareGenerator($gen_config);
-
- $allowed = HTMLPurifier_Config::getAllowedDirectivesForForm($allowed, $config->def);
- $all = array();
- foreach ($allowed as $key) {
- list($ns, $directive) = $key;
- $all[$ns][$directive] = $config->get($ns . '.' . $directive);
- }
-
- $ret = '';
- $ret .= $this->start('table', array('class' => 'hp-config'));
- $ret .= $this->start('thead');
- $ret .= $this->start('tr');
- $ret .= $this->element('th', 'Directive', array('class' => 'hp-directive'));
- $ret .= $this->element('th', 'Value', array('class' => 'hp-value'));
- $ret .= $this->end('tr');
- $ret .= $this->end('thead');
- foreach ($all as $ns => $directives) {
- $ret .= $this->renderNamespace($ns, $directives);
- }
- if ($render_controls) {
- $ret .= $this->start('tbody');
- $ret .= $this->start('tr');
- $ret .= $this->start('td', array('colspan' => 2, 'class' => 'controls'));
- $ret .= $this->elementEmpty('input', array('type' => 'submit', 'value' => 'Submit'));
- $ret .= '[<a href="?">Reset</a>]';
- $ret .= $this->end('td');
- $ret .= $this->end('tr');
- $ret .= $this->end('tbody');
- }
- $ret .= $this->end('table');
- return $ret;
- }
-
- /**
- * Renders a single namespace
- * @param $ns String namespace name
- * @param array $directives array of directives to values
- * @return string
- */
- protected function renderNamespace($ns, $directives)
- {
- $ret = '';
- $ret .= $this->start('tbody', array('class' => 'namespace'));
- $ret .= $this->start('tr');
- $ret .= $this->element('th', $ns, array('colspan' => 2));
- $ret .= $this->end('tr');
- $ret .= $this->end('tbody');
- $ret .= $this->start('tbody');
- foreach ($directives as $directive => $value) {
- $ret .= $this->start('tr');
- $ret .= $this->start('th');
- if ($this->docURL) {
- $url = str_replace('%s', urlencode("$ns.$directive"), $this->docURL);
- $ret .= $this->start('a', array('href' => $url));
- }
- $attr = array('for' => "{$this->name}:$ns.$directive");
-
- // crop directive name if it's too long
- if (!$this->compress || (strlen($directive) < $this->compress)) {
- $directive_disp = $directive;
- } else {
- $directive_disp = substr($directive, 0, $this->compress - 2) . '...';
- $attr['title'] = $directive;
- }
-
- $ret .= $this->element(
- 'label',
- $directive_disp,
- // component printers must create an element with this id
- $attr
- );
- if ($this->docURL) {
- $ret .= $this->end('a');
- }
- $ret .= $this->end('th');
-
- $ret .= $this->start('td');
- $def = $this->config->def->info["$ns.$directive"];
- if (is_int($def)) {
- $allow_null = $def < 0;
- $type = abs($def);
- } else {
- $type = $def->type;
- $allow_null = isset($def->allow_null);
- }
- if (!isset($this->fields[$type])) {
- $type = 0;
- } // default
- $type_obj = $this->fields[$type];
- if ($allow_null) {
- $type_obj = new HTMLPurifier_Printer_ConfigForm_NullDecorator($type_obj);
- }
- $ret .= $type_obj->render($ns, $directive, $value, $this->name, array($this->genConfig, $this->config));
- $ret .= $this->end('td');
- $ret .= $this->end('tr');
- }
- $ret .= $this->end('tbody');
- return $ret;
- }
-
-}
-
-/**
- * Printer decorator for directives that accept null
- */
-class HTMLPurifier_Printer_ConfigForm_NullDecorator extends HTMLPurifier_Printer
-{
- /**
- * Printer being decorated
- * @type HTMLPurifier_Printer
- */
- protected $obj;
-
- /**
- * @param HTMLPurifier_Printer $obj Printer to decorate
- */
- public function __construct($obj)
- {
- parent::__construct();
- $this->obj = $obj;
- }
-
- /**
- * @param string $ns
- * @param string $directive
- * @param string $value
- * @param string $name
- * @param HTMLPurifier_Config|array $config
- * @return string
- */
- public function render($ns, $directive, $value, $name, $config)
- {
- if (is_array($config) && isset($config[0])) {
- $gen_config = $config[0];
- $config = $config[1];
- } else {
- $gen_config = $config;
- }
- $this->prepareGenerator($gen_config);
-
- $ret = '';
- $ret .= $this->start('label', array('for' => "$name:Null_$ns.$directive"));
- $ret .= $this->element('span', "$ns.$directive:", array('class' => 'verbose'));
- $ret .= $this->text(' Null/Disabled');
- $ret .= $this->end('label');
- $attr = array(
- 'type' => 'checkbox',
- 'value' => '1',
- 'class' => 'null-toggle',
- 'name' => "$name" . "[Null_$ns.$directive]",
- 'id' => "$name:Null_$ns.$directive",
- 'onclick' => "toggleWriteability('$name:$ns.$directive',checked)" // INLINE JAVASCRIPT!!!!
- );
- if ($this->obj instanceof HTMLPurifier_Printer_ConfigForm_bool) {
- // modify inline javascript slightly
- $attr['onclick'] =
- "toggleWriteability('$name:Yes_$ns.$directive',checked);" .
- "toggleWriteability('$name:No_$ns.$directive',checked)";
- }
- if ($value === null) {
- $attr['checked'] = 'checked';
- }
- $ret .= $this->elementEmpty('input', $attr);
- $ret .= $this->text(' or ');
- $ret .= $this->elementEmpty('br');
- $ret .= $this->obj->render($ns, $directive, $value, $name, array($gen_config, $config));
- return $ret;
- }
-}
-
-/**
- * Swiss-army knife configuration form field printer
- */
-class HTMLPurifier_Printer_ConfigForm_default extends HTMLPurifier_Printer
-{
- /**
- * @type int
- */
- public $cols = 18;
-
- /**
- * @type int
- */
- public $rows = 5;
-
- /**
- * @param string $ns
- * @param string $directive
- * @param string $value
- * @param string $name
- * @param HTMLPurifier_Config|array $config
- * @return string
- */
- public function render($ns, $directive, $value, $name, $config)
- {
- if (is_array($config) && isset($config[0])) {
- $gen_config = $config[0];
- $config = $config[1];
- } else {
- $gen_config = $config;
- }
- $this->prepareGenerator($gen_config);
- // this should probably be split up a little
- $ret = '';
- $def = $config->def->info["$ns.$directive"];
- if (is_int($def)) {
- $type = abs($def);
- } else {
- $type = $def->type;
- }
- if (is_array($value)) {
- switch ($type) {
- case HTMLPurifier_VarParser::LOOKUP:
- $array = $value;
- $value = array();
- foreach ($array as $val => $b) {
- $value[] = $val;
- }
- //TODO does this need a break?
- case HTMLPurifier_VarParser::ALIST:
- $value = implode(PHP_EOL, $value);
- break;
- case HTMLPurifier_VarParser::HASH:
- $nvalue = '';
- foreach ($value as $i => $v) {
- $nvalue .= "$i:$v" . PHP_EOL;
- }
- $value = $nvalue;
- break;
- default:
- $value = '';
- }
- }
- if ($type === HTMLPurifier_VarParser::MIXED) {
- return 'Not supported';
- $value = serialize($value);
- }
- $attr = array(
- 'name' => "$name" . "[$ns.$directive]",
- 'id' => "$name:$ns.$directive"
- );
- if ($value === null) {
- $attr['disabled'] = 'disabled';
- }
- if (isset($def->allowed)) {
- $ret .= $this->start('select', $attr);
- foreach ($def->allowed as $val => $b) {
- $attr = array();
- if ($value == $val) {
- $attr['selected'] = 'selected';
- }
- $ret .= $this->element('option', $val, $attr);
- }
- $ret .= $this->end('select');
- } elseif ($type === HTMLPurifier_VarParser::TEXT ||
- $type === HTMLPurifier_VarParser::ITEXT ||
- $type === HTMLPurifier_VarParser::ALIST ||
- $type === HTMLPurifier_VarParser::HASH ||
- $type === HTMLPurifier_VarParser::LOOKUP) {
- $attr['cols'] = $this->cols;
- $attr['rows'] = $this->rows;
- $ret .= $this->start('textarea', $attr);
- $ret .= $this->text($value);
- $ret .= $this->end('textarea');
- } else {
- $attr['value'] = $value;
- $attr['type'] = 'text';
- $ret .= $this->elementEmpty('input', $attr);
- }
- return $ret;
- }
-}
-
-/**
- * Bool form field printer
- */
-class HTMLPurifier_Printer_ConfigForm_bool extends HTMLPurifier_Printer
-{
- /**
- * @param string $ns
- * @param string $directive
- * @param string $value
- * @param string $name
- * @param HTMLPurifier_Config|array $config
- * @return string
- */
- public function render($ns, $directive, $value, $name, $config)
- {
- if (is_array($config) && isset($config[0])) {
- $gen_config = $config[0];
- $config = $config[1];
- } else {
- $gen_config = $config;
- }
- $this->prepareGenerator($gen_config);
- $ret = '';
- $ret .= $this->start('div', array('id' => "$name:$ns.$directive"));
-
- $ret .= $this->start('label', array('for' => "$name:Yes_$ns.$directive"));
- $ret .= $this->element('span', "$ns.$directive:", array('class' => 'verbose'));
- $ret .= $this->text(' Yes');
- $ret .= $this->end('label');
-
- $attr = array(
- 'type' => 'radio',
- 'name' => "$name" . "[$ns.$directive]",
- 'id' => "$name:Yes_$ns.$directive",
- 'value' => '1'
- );
- if ($value === true) {
- $attr['checked'] = 'checked';
- }
- if ($value === null) {
- $attr['disabled'] = 'disabled';
- }
- $ret .= $this->elementEmpty('input', $attr);
-
- $ret .= $this->start('label', array('for' => "$name:No_$ns.$directive"));
- $ret .= $this->element('span', "$ns.$directive:", array('class' => 'verbose'));
- $ret .= $this->text(' No');
- $ret .= $this->end('label');
-
- $attr = array(
- 'type' => 'radio',
- 'name' => "$name" . "[$ns.$directive]",
- 'id' => "$name:No_$ns.$directive",
- 'value' => '0'
- );
- if ($value === false) {
- $attr['checked'] = 'checked';
- }
- if ($value === null) {
- $attr['disabled'] = 'disabled';
- }
- $ret .= $this->elementEmpty('input', $attr);
-
- $ret .= $this->end('div');
-
- return $ret;
- }
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/Strategy/MakeWellFormed.php b/library/HTMLPurifier/Strategy/MakeWellFormed.php
deleted file mode 100644
index e389e0011..000000000
--- a/library/HTMLPurifier/Strategy/MakeWellFormed.php
+++ /dev/null
@@ -1,600 +0,0 @@
-<?php
-
-/**
- * Takes tokens makes them well-formed (balance end tags, etc.)
- *
- * Specification of the armor attributes this strategy uses:
- *
- * - MakeWellFormed_TagClosedError: This armor field is used to
- * suppress tag closed errors for certain tokens [TagClosedSuppress],
- * in particular, if a tag was generated automatically by HTML
- * Purifier, we may rely on our infrastructure to close it for us
- * and shouldn't report an error to the user [TagClosedAuto].
- */
-class HTMLPurifier_Strategy_MakeWellFormed extends HTMLPurifier_Strategy
-{
-
- /**
- * Array stream of tokens being processed.
- * @type HTMLPurifier_Token[]
- */
- protected $tokens;
-
- /**
- * Current token.
- * @type HTMLPurifier_Token
- */
- protected $token;
-
- /**
- * Zipper managing the true state.
- * @type HTMLPurifier_Zipper
- */
- protected $zipper;
-
- /**
- * Current nesting of elements.
- * @type array
- */
- protected $stack;
-
- /**
- * Injectors active in this stream processing.
- * @type HTMLPurifier_Injector[]
- */
- protected $injectors;
-
- /**
- * Current instance of HTMLPurifier_Config.
- * @type HTMLPurifier_Config
- */
- protected $config;
-
- /**
- * Current instance of HTMLPurifier_Context.
- * @type HTMLPurifier_Context
- */
- protected $context;
-
- /**
- * @param HTMLPurifier_Token[] $tokens
- * @param HTMLPurifier_Config $config
- * @param HTMLPurifier_Context $context
- * @return HTMLPurifier_Token[]
- * @throws HTMLPurifier_Exception
- */
- public function execute($tokens, $config, $context)
- {
- $definition = $config->getHTMLDefinition();
-
- // local variables
- $generator = new HTMLPurifier_Generator($config, $context);
- $escape_invalid_tags = $config->get('Core.EscapeInvalidTags');
- // used for autoclose early abortion
- $global_parent_allowed_elements = $definition->info_parent_def->child->getAllowedElements($config);
- $e = $context->get('ErrorCollector', true);
- $i = false; // injector index
- list($zipper, $token) = HTMLPurifier_Zipper::fromArray($tokens);
- if ($token === NULL) {
- return array();
- }
- $reprocess = false; // whether or not to reprocess the same token
- $stack = array();
-
- // member variables
- $this->stack =& $stack;
- $this->tokens =& $tokens;
- $this->token =& $token;
- $this->zipper =& $zipper;
- $this->config = $config;
- $this->context = $context;
-
- // context variables
- $context->register('CurrentNesting', $stack);
- $context->register('InputZipper', $zipper);
- $context->register('CurrentToken', $token);
-
- // -- begin INJECTOR --
-
- $this->injectors = array();
-
- $injectors = $config->getBatch('AutoFormat');
- $def_injectors = $definition->info_injector;
- $custom_injectors = $injectors['Custom'];
- unset($injectors['Custom']); // special case
- foreach ($injectors as $injector => $b) {
- // XXX: Fix with a legitimate lookup table of enabled filters
- if (strpos($injector, '.') !== false) {
- continue;
- }
- $injector = "HTMLPurifier_Injector_$injector";
- if (!$b) {
- continue;
- }
- $this->injectors[] = new $injector;
- }
- foreach ($def_injectors as $injector) {
- // assumed to be objects
- $this->injectors[] = $injector;
- }
- foreach ($custom_injectors as $injector) {
- if (!$injector) {
- continue;
- }
- if (is_string($injector)) {
- $injector = "HTMLPurifier_Injector_$injector";
- $injector = new $injector;
- }
- $this->injectors[] = $injector;
- }
-
- // give the injectors references to the definition and context
- // variables for performance reasons
- foreach ($this->injectors as $ix => $injector) {
- $error = $injector->prepare($config, $context);
- if (!$error) {
- continue;
- }
- array_splice($this->injectors, $ix, 1); // rm the injector
- trigger_error("Cannot enable {$injector->name} injector because $error is not allowed", E_USER_WARNING);
- }
-
- // -- end INJECTOR --
-
- // a note on reprocessing:
- // In order to reduce code duplication, whenever some code needs
- // to make HTML changes in order to make things "correct", the
- // new HTML gets sent through the purifier, regardless of its
- // status. This means that if we add a start token, because it
- // was totally necessary, we don't have to update nesting; we just
- // punt ($reprocess = true; continue;) and it does that for us.
-
- // isset is in loop because $tokens size changes during loop exec
- for (;;
- // only increment if we don't need to reprocess
- $reprocess ? $reprocess = false : $token = $zipper->next($token)) {
-
- // check for a rewind
- if (is_int($i)) {
- // possibility: disable rewinding if the current token has a
- // rewind set on it already. This would offer protection from
- // infinite loop, but might hinder some advanced rewinding.
- $rewind_offset = $this->injectors[$i]->getRewindOffset();
- if (is_int($rewind_offset)) {
- for ($j = 0; $j < $rewind_offset; $j++) {
- if (empty($zipper->front)) break;
- $token = $zipper->prev($token);
- // indicate that other injectors should not process this token,
- // but we need to reprocess it
- unset($token->skip[$i]);
- $token->rewind = $i;
- if ($token instanceof HTMLPurifier_Token_Start) {
- array_pop($this->stack);
- } elseif ($token instanceof HTMLPurifier_Token_End) {
- $this->stack[] = $token->start;
- }
- }
- }
- $i = false;
- }
-
- // handle case of document end
- if ($token === NULL) {
- // kill processing if stack is empty
- if (empty($this->stack)) {
- break;
- }
-
- // peek
- $top_nesting = array_pop($this->stack);
- $this->stack[] = $top_nesting;
-
- // send error [TagClosedSuppress]
- if ($e && !isset($top_nesting->armor['MakeWellFormed_TagClosedError'])) {
- $e->send(E_NOTICE, 'Strategy_MakeWellFormed: Tag closed by document end', $top_nesting);
- }
-
- // append, don't splice, since this is the end
- $token = new HTMLPurifier_Token_End($top_nesting->name);
-
- // punt!
- $reprocess = true;
- continue;
- }
-
- //echo '<br>'; printZipper($zipper, $token);//printTokens($this->stack);
- //flush();
-
- // quick-check: if it's not a tag, no need to process
- if (empty($token->is_tag)) {
- if ($token instanceof HTMLPurifier_Token_Text) {
- foreach ($this->injectors as $i => $injector) {
- if (isset($token->skip[$i])) {
- continue;
- }
- if ($token->rewind !== null && $token->rewind !== $i) {
- continue;
- }
- // XXX fuckup
- $r = $token;
- $injector->handleText($r);
- $token = $this->processToken($r, $i);
- $reprocess = true;
- break;
- }
- }
- // another possibility is a comment
- continue;
- }
-
- if (isset($definition->info[$token->name])) {
- $type = $definition->info[$token->name]->child->type;
- } else {
- $type = false; // Type is unknown, treat accordingly
- }
-
- // quick tag checks: anything that's *not* an end tag
- $ok = false;
- if ($type === 'empty' && $token instanceof HTMLPurifier_Token_Start) {
- // claims to be a start tag but is empty
- $token = new HTMLPurifier_Token_Empty(
- $token->name,
- $token->attr,
- $token->line,
- $token->col,
- $token->armor
- );
- $ok = true;
- } elseif ($type && $type !== 'empty' && $token instanceof HTMLPurifier_Token_Empty) {
- // claims to be empty but really is a start tag
- // NB: this assignment is required
- $old_token = $token;
- $token = new HTMLPurifier_Token_End($token->name);
- $token = $this->insertBefore(
- new HTMLPurifier_Token_Start($old_token->name, $old_token->attr, $old_token->line, $old_token->col, $old_token->armor)
- );
- // punt (since we had to modify the input stream in a non-trivial way)
- $reprocess = true;
- continue;
- } elseif ($token instanceof HTMLPurifier_Token_Empty) {
- // real empty token
- $ok = true;
- } elseif ($token instanceof HTMLPurifier_Token_Start) {
- // start tag
-
- // ...unless they also have to close their parent
- if (!empty($this->stack)) {
-
- // Performance note: you might think that it's rather
- // inefficient, recalculating the autoclose information
- // for every tag that a token closes (since when we
- // do an autoclose, we push a new token into the
- // stream and then /process/ that, before
- // re-processing this token.) But this is
- // necessary, because an injector can make an
- // arbitrary transformations to the autoclosing
- // tokens we introduce, so things may have changed
- // in the meantime. Also, doing the inefficient thing is
- // "easy" to reason about (for certain perverse definitions
- // of "easy")
-
- $parent = array_pop($this->stack);
- $this->stack[] = $parent;
-
- $parent_def = null;
- $parent_elements = null;
- $autoclose = false;
- if (isset($definition->info[$parent->name])) {
- $parent_def = $definition->info[$parent->name];
- $parent_elements = $parent_def->child->getAllowedElements($config);
- $autoclose = !isset($parent_elements[$token->name]);
- }
-
- if ($autoclose && $definition->info[$token->name]->wrap) {
- // Check if an element can be wrapped by another
- // element to make it valid in a context (for
- // example, <ul><ul> needs a <li> in between)
- $wrapname = $definition->info[$token->name]->wrap;
- $wrapdef = $definition->info[$wrapname];
- $elements = $wrapdef->child->getAllowedElements($config);
- if (isset($elements[$token->name]) && isset($parent_elements[$wrapname])) {
- $newtoken = new HTMLPurifier_Token_Start($wrapname);
- $token = $this->insertBefore($newtoken);
- $reprocess = true;
- continue;
- }
- }
-
- $carryover = false;
- if ($autoclose && $parent_def->formatting) {
- $carryover = true;
- }
-
- if ($autoclose) {
- // check if this autoclose is doomed to fail
- // (this rechecks $parent, which his harmless)
- $autoclose_ok = isset($global_parent_allowed_elements[$token->name]);
- if (!$autoclose_ok) {
- foreach ($this->stack as $ancestor) {
- $elements = $definition->info[$ancestor->name]->child->getAllowedElements($config);
- if (isset($elements[$token->name])) {
- $autoclose_ok = true;
- break;
- }
- if ($definition->info[$token->name]->wrap) {
- $wrapname = $definition->info[$token->name]->wrap;
- $wrapdef = $definition->info[$wrapname];
- $wrap_elements = $wrapdef->child->getAllowedElements($config);
- if (isset($wrap_elements[$token->name]) && isset($elements[$wrapname])) {
- $autoclose_ok = true;
- break;
- }
- }
- }
- }
- if ($autoclose_ok) {
- // errors need to be updated
- $new_token = new HTMLPurifier_Token_End($parent->name);
- $new_token->start = $parent;
- // [TagClosedSuppress]
- if ($e && !isset($parent->armor['MakeWellFormed_TagClosedError'])) {
- if (!$carryover) {
- $e->send(E_NOTICE, 'Strategy_MakeWellFormed: Tag auto closed', $parent);
- } else {
- $e->send(E_NOTICE, 'Strategy_MakeWellFormed: Tag carryover', $parent);
- }
- }
- if ($carryover) {
- $element = clone $parent;
- // [TagClosedAuto]
- $element->armor['MakeWellFormed_TagClosedError'] = true;
- $element->carryover = true;
- $token = $this->processToken(array($new_token, $token, $element));
- } else {
- $token = $this->insertBefore($new_token);
- }
- } else {
- $token = $this->remove();
- }
- $reprocess = true;
- continue;
- }
-
- }
- $ok = true;
- }
-
- if ($ok) {
- foreach ($this->injectors as $i => $injector) {
- if (isset($token->skip[$i])) {
- continue;
- }
- if ($token->rewind !== null && $token->rewind !== $i) {
- continue;
- }
- $r = $token;
- $injector->handleElement($r);
- $token = $this->processToken($r, $i);
- $reprocess = true;
- break;
- }
- if (!$reprocess) {
- // ah, nothing interesting happened; do normal processing
- if ($token instanceof HTMLPurifier_Token_Start) {
- $this->stack[] = $token;
- } elseif ($token instanceof HTMLPurifier_Token_End) {
- throw new HTMLPurifier_Exception(
- 'Improper handling of end tag in start code; possible error in MakeWellFormed'
- );
- }
- }
- continue;
- }
-
- // sanity check: we should be dealing with a closing tag
- if (!$token instanceof HTMLPurifier_Token_End) {
- throw new HTMLPurifier_Exception('Unaccounted for tag token in input stream, bug in HTML Purifier');
- }
-
- // make sure that we have something open
- if (empty($this->stack)) {
- if ($escape_invalid_tags) {
- if ($e) {
- $e->send(E_WARNING, 'Strategy_MakeWellFormed: Unnecessary end tag to text');
- }
- $token = new HTMLPurifier_Token_Text($generator->generateFromToken($token));
- } else {
- if ($e) {
- $e->send(E_WARNING, 'Strategy_MakeWellFormed: Unnecessary end tag removed');
- }
- $token = $this->remove();
- }
- $reprocess = true;
- continue;
- }
-
- // first, check for the simplest case: everything closes neatly.
- // Eventually, everything passes through here; if there are problems
- // we modify the input stream accordingly and then punt, so that
- // the tokens get processed again.
- $current_parent = array_pop($this->stack);
- if ($current_parent->name == $token->name) {
- $token->start = $current_parent;
- foreach ($this->injectors as $i => $injector) {
- if (isset($token->skip[$i])) {
- continue;
- }
- if ($token->rewind !== null && $token->rewind !== $i) {
- continue;
- }
- $r = $token;
- $injector->handleEnd($r);
- $token = $this->processToken($r, $i);
- $this->stack[] = $current_parent;
- $reprocess = true;
- break;
- }
- continue;
- }
-
- // okay, so we're trying to close the wrong tag
-
- // undo the pop previous pop
- $this->stack[] = $current_parent;
-
- // scroll back the entire nest, trying to find our tag.
- // (feature could be to specify how far you'd like to go)
- $size = count($this->stack);
- // -2 because -1 is the last element, but we already checked that
- $skipped_tags = false;
- for ($j = $size - 2; $j >= 0; $j--) {
- if ($this->stack[$j]->name == $token->name) {
- $skipped_tags = array_slice($this->stack, $j);
- break;
- }
- }
-
- // we didn't find the tag, so remove
- if ($skipped_tags === false) {
- if ($escape_invalid_tags) {
- if ($e) {
- $e->send(E_WARNING, 'Strategy_MakeWellFormed: Stray end tag to text');
- }
- $token = new HTMLPurifier_Token_Text($generator->generateFromToken($token));
- } else {
- if ($e) {
- $e->send(E_WARNING, 'Strategy_MakeWellFormed: Stray end tag removed');
- }
- $token = $this->remove();
- }
- $reprocess = true;
- continue;
- }
-
- // do errors, in REVERSE $j order: a,b,c with </a></b></c>
- $c = count($skipped_tags);
- if ($e) {
- for ($j = $c - 1; $j > 0; $j--) {
- // notice we exclude $j == 0, i.e. the current ending tag, from
- // the errors... [TagClosedSuppress]
- if (!isset($skipped_tags[$j]->armor['MakeWellFormed_TagClosedError'])) {
- $e->send(E_NOTICE, 'Strategy_MakeWellFormed: Tag closed by element end', $skipped_tags[$j]);
- }
- }
- }
-
- // insert tags, in FORWARD $j order: c,b,a with </a></b></c>
- $replace = array($token);
- for ($j = 1; $j < $c; $j++) {
- // ...as well as from the insertions
- $new_token = new HTMLPurifier_Token_End($skipped_tags[$j]->name);
- $new_token->start = $skipped_tags[$j];
- array_unshift($replace, $new_token);
- if (isset($definition->info[$new_token->name]) && $definition->info[$new_token->name]->formatting) {
- // [TagClosedAuto]
- $element = clone $skipped_tags[$j];
- $element->carryover = true;
- $element->armor['MakeWellFormed_TagClosedError'] = true;
- $replace[] = $element;
- }
- }
- $token = $this->processToken($replace);
- $reprocess = true;
- continue;
- }
-
- $context->destroy('CurrentToken');
- $context->destroy('CurrentNesting');
- $context->destroy('InputZipper');
-
- unset($this->injectors, $this->stack, $this->tokens);
- return $zipper->toArray($token);
- }
-
- /**
- * Processes arbitrary token values for complicated substitution patterns.
- * In general:
- *
- * If $token is an array, it is a list of tokens to substitute for the
- * current token. These tokens then get individually processed. If there
- * is a leading integer in the list, that integer determines how many
- * tokens from the stream should be removed.
- *
- * If $token is a regular token, it is swapped with the current token.
- *
- * If $token is false, the current token is deleted.
- *
- * If $token is an integer, that number of tokens (with the first token
- * being the current one) will be deleted.
- *
- * @param HTMLPurifier_Token|array|int|bool $token Token substitution value
- * @param HTMLPurifier_Injector|int $injector Injector that performed the substitution; default is if
- * this is not an injector related operation.
- * @throws HTMLPurifier_Exception
- */
- protected function processToken($token, $injector = -1)
- {
- // normalize forms of token
- if (is_object($token)) {
- $token = array(1, $token);
- }
- if (is_int($token)) {
- $token = array($token);
- }
- if ($token === false) {
- $token = array(1);
- }
- if (!is_array($token)) {
- throw new HTMLPurifier_Exception('Invalid token type from injector');
- }
- if (!is_int($token[0])) {
- array_unshift($token, 1);
- }
- if ($token[0] === 0) {
- throw new HTMLPurifier_Exception('Deleting zero tokens is not valid');
- }
-
- // $token is now an array with the following form:
- // array(number nodes to delete, new node 1, new node 2, ...)
-
- $delete = array_shift($token);
- list($old, $r) = $this->zipper->splice($this->token, $delete, $token);
-
- if ($injector > -1) {
- // determine appropriate skips
- $oldskip = isset($old[0]) ? $old[0]->skip : array();
- foreach ($token as $object) {
- $object->skip = $oldskip;
- $object->skip[$injector] = true;
- }
- }
-
- return $r;
-
- }
-
- /**
- * Inserts a token before the current token. Cursor now points to
- * this token. You must reprocess after this.
- * @param HTMLPurifier_Token $token
- */
- private function insertBefore($token)
- {
- // NB not $this->zipper->insertBefore(), due to positioning
- // differences
- $splice = $this->zipper->splice($this->token, 0, array($token));
-
- return $splice[1];
- }
-
- /**
- * Removes current token. Cursor now points to new token occupying previously
- * occupied space. You must reprocess after this.
- */
- private function remove()
- {
- return $this->zipper->delete();
- }
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/Token.php b/library/HTMLPurifier/Token.php
deleted file mode 100644
index 85b85e072..000000000
--- a/library/HTMLPurifier/Token.php
+++ /dev/null
@@ -1,100 +0,0 @@
-<?php
-
-/**
- * Abstract base token class that all others inherit from.
- */
-abstract class HTMLPurifier_Token
-{
- /**
- * Line number node was on in source document. Null if unknown.
- * @type int
- */
- public $line;
-
- /**
- * Column of line node was on in source document. Null if unknown.
- * @type int
- */
- public $col;
-
- /**
- * Lookup array of processing that this token is exempt from.
- * Currently, valid values are "ValidateAttributes" and
- * "MakeWellFormed_TagClosedError"
- * @type array
- */
- public $armor = array();
-
- /**
- * Used during MakeWellFormed.
- * @type
- */
- public $skip;
-
- /**
- * @type
- */
- public $rewind;
-
- /**
- * @type
- */
- public $carryover;
-
- /**
- * @param string $n
- * @return null|string
- */
- public function __get($n)
- {
- if ($n === 'type') {
- trigger_error('Deprecated type property called; use instanceof', E_USER_NOTICE);
- switch (get_class($this)) {
- case 'HTMLPurifier_Token_Start':
- return 'start';
- case 'HTMLPurifier_Token_Empty':
- return 'empty';
- case 'HTMLPurifier_Token_End':
- return 'end';
- case 'HTMLPurifier_Token_Text':
- return 'text';
- case 'HTMLPurifier_Token_Comment':
- return 'comment';
- default:
- return null;
- }
- }
- }
-
- /**
- * Sets the position of the token in the source document.
- * @param int $l
- * @param int $c
- */
- public function position($l = null, $c = null)
- {
- $this->line = $l;
- $this->col = $c;
- }
-
- /**
- * Convenience function for DirectLex settings line/col position.
- * @param int $l
- * @param int $c
- */
- public function rawPosition($l, $c)
- {
- if ($c === -1) {
- $l++;
- }
- $this->line = $l;
- $this->col = $c;
- }
-
- /**
- * Converts a token into its corresponding node.
- */
- abstract public function toNode();
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/URI.php b/library/HTMLPurifier/URI.php
deleted file mode 100644
index a5e7ae298..000000000
--- a/library/HTMLPurifier/URI.php
+++ /dev/null
@@ -1,314 +0,0 @@
-<?php
-
-/**
- * HTML Purifier's internal representation of a URI.
- * @note
- * Internal data-structures are completely escaped. If the data needs
- * to be used in a non-URI context (which is very unlikely), be sure
- * to decode it first. The URI may not necessarily be well-formed until
- * validate() is called.
- */
-class HTMLPurifier_URI
-{
- /**
- * @type string
- */
- public $scheme;
-
- /**
- * @type string
- */
- public $userinfo;
-
- /**
- * @type string
- */
- public $host;
-
- /**
- * @type int
- */
- public $port;
-
- /**
- * @type string
- */
- public $path;
-
- /**
- * @type string
- */
- public $query;
-
- /**
- * @type string
- */
- public $fragment;
-
- /**
- * @param string $scheme
- * @param string $userinfo
- * @param string $host
- * @param int $port
- * @param string $path
- * @param string $query
- * @param string $fragment
- * @note Automatically normalizes scheme and port
- */
- public function __construct($scheme, $userinfo, $host, $port, $path, $query, $fragment)
- {
- $this->scheme = is_null($scheme) || ctype_lower($scheme) ? $scheme : strtolower($scheme);
- $this->userinfo = $userinfo;
- $this->host = $host;
- $this->port = is_null($port) ? $port : (int)$port;
- $this->path = $path;
- $this->query = $query;
- $this->fragment = $fragment;
- }
-
- /**
- * Retrieves a scheme object corresponding to the URI's scheme/default
- * @param HTMLPurifier_Config $config
- * @param HTMLPurifier_Context $context
- * @return HTMLPurifier_URIScheme Scheme object appropriate for validating this URI
- */
- public function getSchemeObj($config, $context)
- {
- $registry = HTMLPurifier_URISchemeRegistry::instance();
- if ($this->scheme !== null) {
- $scheme_obj = $registry->getScheme($this->scheme, $config, $context);
- if (!$scheme_obj) {
- return false;
- } // invalid scheme, clean it out
- } else {
- // no scheme: retrieve the default one
- $def = $config->getDefinition('URI');
- $scheme_obj = $def->getDefaultScheme($config, $context);
- if (!$scheme_obj) {
- // something funky happened to the default scheme object
- trigger_error(
- 'Default scheme object "' . $def->defaultScheme . '" was not readable',
- E_USER_WARNING
- );
- return false;
- }
- }
- return $scheme_obj;
- }
-
- /**
- * Generic validation method applicable for all schemes. May modify
- * this URI in order to get it into a compliant form.
- * @param HTMLPurifier_Config $config
- * @param HTMLPurifier_Context $context
- * @return bool True if validation/filtering succeeds, false if failure
- */
- public function validate($config, $context)
- {
- // ABNF definitions from RFC 3986
- $chars_sub_delims = '!$&\'()*+,;=';
- $chars_gen_delims = ':/?#[]@';
- $chars_pchar = $chars_sub_delims . ':@';
-
- // validate host
- if (!is_null($this->host)) {
- $host_def = new HTMLPurifier_AttrDef_URI_Host();
- $this->host = $host_def->validate($this->host, $config, $context);
- if ($this->host === false) {
- $this->host = null;
- }
- }
-
- // validate scheme
- // NOTE: It's not appropriate to check whether or not this
- // scheme is in our registry, since a URIFilter may convert a
- // URI that we don't allow into one we do. So instead, we just
- // check if the scheme can be dropped because there is no host
- // and it is our default scheme.
- if (!is_null($this->scheme) && is_null($this->host) || $this->host === '') {
- // support for relative paths is pretty abysmal when the
- // scheme is present, so axe it when possible
- $def = $config->getDefinition('URI');
- if ($def->defaultScheme === $this->scheme) {
- $this->scheme = null;
- }
- }
-
- // validate username
- if (!is_null($this->userinfo)) {
- $encoder = new HTMLPurifier_PercentEncoder($chars_sub_delims . ':');
- $this->userinfo = $encoder->encode($this->userinfo);
- }
-
- // validate port
- if (!is_null($this->port)) {
- if ($this->port < 1 || $this->port > 65535) {
- $this->port = null;
- }
- }
-
- // validate path
- $segments_encoder = new HTMLPurifier_PercentEncoder($chars_pchar . '/');
- if (!is_null($this->host)) { // this catches $this->host === ''
- // path-abempty (hier and relative)
- // http://www.example.com/my/path
- // //www.example.com/my/path (looks odd, but works, and
- // recognized by most browsers)
- // (this set is valid or invalid on a scheme by scheme
- // basis, so we'll deal with it later)
- // file:///my/path
- // ///my/path
- $this->path = $segments_encoder->encode($this->path);
- } elseif ($this->path !== '') {
- if ($this->path[0] === '/') {
- // path-absolute (hier and relative)
- // http:/my/path
- // /my/path
- if (strlen($this->path) >= 2 && $this->path[1] === '/') {
- // This could happen if both the host gets stripped
- // out
- // http://my/path
- // //my/path
- $this->path = '';
- } else {
- $this->path = $segments_encoder->encode($this->path);
- }
- } elseif (!is_null($this->scheme)) {
- // path-rootless (hier)
- // http:my/path
- // Short circuit evaluation means we don't need to check nz
- $this->path = $segments_encoder->encode($this->path);
- } else {
- // path-noscheme (relative)
- // my/path
- // (once again, not checking nz)
- $segment_nc_encoder = new HTMLPurifier_PercentEncoder($chars_sub_delims . '@');
- $c = strpos($this->path, '/');
- if ($c !== false) {
- $this->path =
- $segment_nc_encoder->encode(substr($this->path, 0, $c)) .
- $segments_encoder->encode(substr($this->path, $c));
- } else {
- $this->path = $segment_nc_encoder->encode($this->path);
- }
- }
- } else {
- // path-empty (hier and relative)
- $this->path = ''; // just to be safe
- }
-
- // qf = query and fragment
- $qf_encoder = new HTMLPurifier_PercentEncoder($chars_pchar . '/?');
-
- if (!is_null($this->query)) {
- $this->query = $qf_encoder->encode($this->query);
- }
-
- if (!is_null($this->fragment)) {
- $this->fragment = $qf_encoder->encode($this->fragment);
- }
- return true;
- }
-
- /**
- * Convert URI back to string
- * @return string URI appropriate for output
- */
- public function toString()
- {
- // reconstruct authority
- $authority = null;
- // there is a rendering difference between a null authority
- // (http:foo-bar) and an empty string authority
- // (http:///foo-bar).
- if (!is_null($this->host)) {
- $authority = '';
- if (!is_null($this->userinfo)) {
- $authority .= $this->userinfo . '@';
- }
- $authority .= $this->host;
- if (!is_null($this->port)) {
- $authority .= ':' . $this->port;
- }
- }
-
- // Reconstruct the result
- // One might wonder about parsing quirks from browsers after
- // this reconstruction. Unfortunately, parsing behavior depends
- // on what *scheme* was employed (file:///foo is handled *very*
- // differently than http:///foo), so unfortunately we have to
- // defer to the schemes to do the right thing.
- $result = '';
- if (!is_null($this->scheme)) {
- $result .= $this->scheme . ':';
- }
- if (!is_null($authority)) {
- $result .= '//' . $authority;
- }
- $result .= $this->path;
- if (!is_null($this->query)) {
- $result .= '?' . $this->query;
- }
- if (!is_null($this->fragment)) {
- $result .= '#' . $this->fragment;
- }
-
- return $result;
- }
-
- /**
- * Returns true if this URL might be considered a 'local' URL given
- * the current context. This is true when the host is null, or
- * when it matches the host supplied to the configuration.
- *
- * Note that this does not do any scheme checking, so it is mostly
- * only appropriate for metadata that doesn't care about protocol
- * security. isBenign is probably what you actually want.
- * @param HTMLPurifier_Config $config
- * @param HTMLPurifier_Context $context
- * @return bool
- */
- public function isLocal($config, $context)
- {
- if ($this->host === null) {
- return true;
- }
- $uri_def = $config->getDefinition('URI');
- if ($uri_def->host === $this->host) {
- return true;
- }
- return false;
- }
-
- /**
- * Returns true if this URL should be considered a 'benign' URL,
- * that is:
- *
- * - It is a local URL (isLocal), and
- * - It has a equal or better level of security
- * @param HTMLPurifier_Config $config
- * @param HTMLPurifier_Context $context
- * @return bool
- */
- public function isBenign($config, $context)
- {
- if (!$this->isLocal($config, $context)) {
- return false;
- }
-
- $scheme_obj = $this->getSchemeObj($config, $context);
- if (!$scheme_obj) {
- return false;
- } // conservative approach
-
- $current_scheme_obj = $config->getDefinition('URI')->getDefaultScheme($config, $context);
- if ($current_scheme_obj->secure) {
- if (!$scheme_obj->secure) {
- return false;
- }
- }
- return true;
- }
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/URIScheme/data.php b/library/HTMLPurifier/URIScheme/data.php
deleted file mode 100644
index 6ebca4984..000000000
--- a/library/HTMLPurifier/URIScheme/data.php
+++ /dev/null
@@ -1,127 +0,0 @@
-<?php
-
-/**
- * Implements data: URI for base64 encoded images supported by GD.
- */
-class HTMLPurifier_URIScheme_data extends HTMLPurifier_URIScheme
-{
- /**
- * @type bool
- */
- public $browsable = true;
-
- /**
- * @type array
- */
- public $allowed_types = array(
- // you better write validation code for other types if you
- // decide to allow them
- 'image/jpeg' => true,
- 'image/gif' => true,
- 'image/png' => true,
- );
- // this is actually irrelevant since we only write out the path
- // component
- /**
- * @type bool
- */
- public $may_omit_host = true;
-
- /**
- * @param HTMLPurifier_URI $uri
- * @param HTMLPurifier_Config $config
- * @param HTMLPurifier_Context $context
- * @return bool
- */
- public function doValidate(&$uri, $config, $context)
- {
- $result = explode(',', $uri->path, 2);
- $is_base64 = false;
- $charset = null;
- $content_type = null;
- if (count($result) == 2) {
- list($metadata, $data) = $result;
- // do some legwork on the metadata
- $metas = explode(';', $metadata);
- while (!empty($metas)) {
- $cur = array_shift($metas);
- if ($cur == 'base64') {
- $is_base64 = true;
- break;
- }
- if (substr($cur, 0, 8) == 'charset=') {
- // doesn't match if there are arbitrary spaces, but
- // whatever dude
- if ($charset !== null) {
- continue;
- } // garbage
- $charset = substr($cur, 8); // not used
- } else {
- if ($content_type !== null) {
- continue;
- } // garbage
- $content_type = $cur;
- }
- }
- } else {
- $data = $result[0];
- }
- if ($content_type !== null && empty($this->allowed_types[$content_type])) {
- return false;
- }
- if ($charset !== null) {
- // error; we don't allow plaintext stuff
- $charset = null;
- }
- $data = rawurldecode($data);
- if ($is_base64) {
- $raw_data = base64_decode($data);
- } else {
- $raw_data = $data;
- }
- // XXX probably want to refactor this into a general mechanism
- // for filtering arbitrary content types
- $file = tempnam("/tmp", "");
- file_put_contents($file, $raw_data);
- if (function_exists('exif_imagetype')) {
- $image_code = exif_imagetype($file);
- unlink($file);
- } elseif (function_exists('getimagesize')) {
- set_error_handler(array($this, 'muteErrorHandler'));
- $info = getimagesize($file);
- restore_error_handler();
- unlink($file);
- if ($info == false) {
- return false;
- }
- $image_code = $info[2];
- } else {
- trigger_error("could not find exif_imagetype or getimagesize functions", E_USER_ERROR);
- }
- $real_content_type = image_type_to_mime_type($image_code);
- if ($real_content_type != $content_type) {
- // we're nice guys; if the content type is something else we
- // support, change it over
- if (empty($this->allowed_types[$real_content_type])) {
- return false;
- }
- $content_type = $real_content_type;
- }
- // ok, it's kosher, rewrite what we need
- $uri->userinfo = null;
- $uri->host = null;
- $uri->port = null;
- $uri->fragment = null;
- $uri->query = null;
- $uri->path = "$content_type;base64," . base64_encode($raw_data);
- return true;
- }
-
- /**
- * @param int $errno
- * @param string $errstr
- */
- public function muteErrorHandler($errno, $errstr)
- {
- }
-}
diff --git a/library/bootstrap/css/bootstrap-grid.css b/library/bootstrap/css/bootstrap-grid.css
new file mode 100644
index 000000000..0bb960ecc
--- /dev/null
+++ b/library/bootstrap/css/bootstrap-grid.css
@@ -0,0 +1,2082 @@
+@-ms-viewport {
+ width: device-width;
+}
+
+html {
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ -ms-overflow-style: scrollbar;
+}
+
+*,
+*::before,
+*::after {
+ -webkit-box-sizing: inherit;
+ box-sizing: inherit;
+}
+
+.container {
+ margin-right: auto;
+ margin-left: auto;
+ padding-right: 15px;
+ padding-left: 15px;
+}
+
+@media (min-width: 576px) {
+ .container {
+ padding-right: 15px;
+ padding-left: 15px;
+ }
+}
+
+@media (min-width: 768px) {
+ .container {
+ padding-right: 15px;
+ padding-left: 15px;
+ }
+}
+
+@media (min-width: 992px) {
+ .container {
+ padding-right: 15px;
+ padding-left: 15px;
+ }
+}
+
+@media (min-width: 1200px) {
+ .container {
+ padding-right: 15px;
+ padding-left: 15px;
+ }
+}
+
+@media (min-width: 576px) {
+ .container {
+ width: 540px;
+ max-width: 100%;
+ }
+}
+
+@media (min-width: 768px) {
+ .container {
+ width: 720px;
+ max-width: 100%;
+ }
+}
+
+@media (min-width: 992px) {
+ .container {
+ width: 960px;
+ max-width: 100%;
+ }
+}
+
+@media (min-width: 1200px) {
+ .container {
+ width: 1140px;
+ max-width: 100%;
+ }
+}
+
+.container-fluid {
+ width: 100%;
+ margin-right: auto;
+ margin-left: auto;
+ padding-right: 15px;
+ padding-left: 15px;
+}
+
+@media (min-width: 576px) {
+ .container-fluid {
+ padding-right: 15px;
+ padding-left: 15px;
+ }
+}
+
+@media (min-width: 768px) {
+ .container-fluid {
+ padding-right: 15px;
+ padding-left: 15px;
+ }
+}
+
+@media (min-width: 992px) {
+ .container-fluid {
+ padding-right: 15px;
+ padding-left: 15px;
+ }
+}
+
+@media (min-width: 1200px) {
+ .container-fluid {
+ padding-right: 15px;
+ padding-left: 15px;
+ }
+}
+
+.row {
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-flex-wrap: wrap;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
+ margin-right: -15px;
+ margin-left: -15px;
+}
+
+@media (min-width: 576px) {
+ .row {
+ margin-right: -15px;
+ margin-left: -15px;
+ }
+}
+
+@media (min-width: 768px) {
+ .row {
+ margin-right: -15px;
+ margin-left: -15px;
+ }
+}
+
+@media (min-width: 992px) {
+ .row {
+ margin-right: -15px;
+ margin-left: -15px;
+ }
+}
+
+@media (min-width: 1200px) {
+ .row {
+ margin-right: -15px;
+ margin-left: -15px;
+ }
+}
+
+.no-gutters {
+ margin-right: 0;
+ margin-left: 0;
+}
+
+.no-gutters > .col,
+.no-gutters > [class*="col-"] {
+ padding-right: 0;
+ padding-left: 0;
+}
+
+.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,
+.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,
+.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,
+.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,
+.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,
+.col-xl-auto {
+ position: relative;
+ width: 100%;
+ min-height: 1px;
+ padding-right: 15px;
+ padding-left: 15px;
+}
+
+@media (min-width: 576px) {
+ .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,
+ .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,
+ .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,
+ .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,
+ .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,
+ .col-xl-auto {
+ padding-right: 15px;
+ padding-left: 15px;
+ }
+}
+
+@media (min-width: 768px) {
+ .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,
+ .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,
+ .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,
+ .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,
+ .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,
+ .col-xl-auto {
+ padding-right: 15px;
+ padding-left: 15px;
+ }
+}
+
+@media (min-width: 992px) {
+ .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,
+ .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,
+ .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,
+ .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,
+ .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,
+ .col-xl-auto {
+ padding-right: 15px;
+ padding-left: 15px;
+ }
+}
+
+@media (min-width: 1200px) {
+ .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,
+ .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,
+ .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,
+ .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,
+ .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,
+ .col-xl-auto {
+ padding-right: 15px;
+ padding-left: 15px;
+ }
+}
+
+.col {
+ -webkit-flex-basis: 0;
+ -ms-flex-preferred-size: 0;
+ flex-basis: 0;
+ -webkit-box-flex: 1;
+ -webkit-flex-grow: 1;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ max-width: 100%;
+}
+
+.col-auto {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 auto;
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
+ width: auto;
+}
+
+.col-1 {
+ width: 8.333333%;
+}
+
+.col-2 {
+ width: 16.666667%;
+}
+
+.col-3 {
+ width: 25%;
+}
+
+.col-4 {
+ width: 33.333333%;
+}
+
+.col-5 {
+ width: 41.666667%;
+}
+
+.col-6 {
+ width: 50%;
+}
+
+.col-7 {
+ width: 58.333333%;
+}
+
+.col-8 {
+ width: 66.666667%;
+}
+
+.col-9 {
+ width: 75%;
+}
+
+.col-10 {
+ width: 83.333333%;
+}
+
+.col-11 {
+ width: 91.666667%;
+}
+
+.col-12 {
+ width: 100%;
+}
+
+.pull-0 {
+ right: auto;
+}
+
+.pull-1 {
+ right: 8.333333%;
+}
+
+.pull-2 {
+ right: 16.666667%;
+}
+
+.pull-3 {
+ right: 25%;
+}
+
+.pull-4 {
+ right: 33.333333%;
+}
+
+.pull-5 {
+ right: 41.666667%;
+}
+
+.pull-6 {
+ right: 50%;
+}
+
+.pull-7 {
+ right: 58.333333%;
+}
+
+.pull-8 {
+ right: 66.666667%;
+}
+
+.pull-9 {
+ right: 75%;
+}
+
+.pull-10 {
+ right: 83.333333%;
+}
+
+.pull-11 {
+ right: 91.666667%;
+}
+
+.pull-12 {
+ right: 100%;
+}
+
+.push-0 {
+ left: auto;
+}
+
+.push-1 {
+ left: 8.333333%;
+}
+
+.push-2 {
+ left: 16.666667%;
+}
+
+.push-3 {
+ left: 25%;
+}
+
+.push-4 {
+ left: 33.333333%;
+}
+
+.push-5 {
+ left: 41.666667%;
+}
+
+.push-6 {
+ left: 50%;
+}
+
+.push-7 {
+ left: 58.333333%;
+}
+
+.push-8 {
+ left: 66.666667%;
+}
+
+.push-9 {
+ left: 75%;
+}
+
+.push-10 {
+ left: 83.333333%;
+}
+
+.push-11 {
+ left: 91.666667%;
+}
+
+.push-12 {
+ left: 100%;
+}
+
+.offset-1 {
+ margin-left: 8.333333%;
+}
+
+.offset-2 {
+ margin-left: 16.666667%;
+}
+
+.offset-3 {
+ margin-left: 25%;
+}
+
+.offset-4 {
+ margin-left: 33.333333%;
+}
+
+.offset-5 {
+ margin-left: 41.666667%;
+}
+
+.offset-6 {
+ margin-left: 50%;
+}
+
+.offset-7 {
+ margin-left: 58.333333%;
+}
+
+.offset-8 {
+ margin-left: 66.666667%;
+}
+
+.offset-9 {
+ margin-left: 75%;
+}
+
+.offset-10 {
+ margin-left: 83.333333%;
+}
+
+.offset-11 {
+ margin-left: 91.666667%;
+}
+
+@media (min-width: 576px) {
+ .col-sm {
+ -webkit-flex-basis: 0;
+ -ms-flex-preferred-size: 0;
+ flex-basis: 0;
+ -webkit-box-flex: 1;
+ -webkit-flex-grow: 1;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ max-width: 100%;
+ }
+ .col-sm-auto {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 auto;
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
+ width: auto;
+ }
+ .col-sm-1 {
+ width: 8.333333%;
+ }
+ .col-sm-2 {
+ width: 16.666667%;
+ }
+ .col-sm-3 {
+ width: 25%;
+ }
+ .col-sm-4 {
+ width: 33.333333%;
+ }
+ .col-sm-5 {
+ width: 41.666667%;
+ }
+ .col-sm-6 {
+ width: 50%;
+ }
+ .col-sm-7 {
+ width: 58.333333%;
+ }
+ .col-sm-8 {
+ width: 66.666667%;
+ }
+ .col-sm-9 {
+ width: 75%;
+ }
+ .col-sm-10 {
+ width: 83.333333%;
+ }
+ .col-sm-11 {
+ width: 91.666667%;
+ }
+ .col-sm-12 {
+ width: 100%;
+ }
+ .pull-sm-0 {
+ right: auto;
+ }
+ .pull-sm-1 {
+ right: 8.333333%;
+ }
+ .pull-sm-2 {
+ right: 16.666667%;
+ }
+ .pull-sm-3 {
+ right: 25%;
+ }
+ .pull-sm-4 {
+ right: 33.333333%;
+ }
+ .pull-sm-5 {
+ right: 41.666667%;
+ }
+ .pull-sm-6 {
+ right: 50%;
+ }
+ .pull-sm-7 {
+ right: 58.333333%;
+ }
+ .pull-sm-8 {
+ right: 66.666667%;
+ }
+ .pull-sm-9 {
+ right: 75%;
+ }
+ .pull-sm-10 {
+ right: 83.333333%;
+ }
+ .pull-sm-11 {
+ right: 91.666667%;
+ }
+ .pull-sm-12 {
+ right: 100%;
+ }
+ .push-sm-0 {
+ left: auto;
+ }
+ .push-sm-1 {
+ left: 8.333333%;
+ }
+ .push-sm-2 {
+ left: 16.666667%;
+ }
+ .push-sm-3 {
+ left: 25%;
+ }
+ .push-sm-4 {
+ left: 33.333333%;
+ }
+ .push-sm-5 {
+ left: 41.666667%;
+ }
+ .push-sm-6 {
+ left: 50%;
+ }
+ .push-sm-7 {
+ left: 58.333333%;
+ }
+ .push-sm-8 {
+ left: 66.666667%;
+ }
+ .push-sm-9 {
+ left: 75%;
+ }
+ .push-sm-10 {
+ left: 83.333333%;
+ }
+ .push-sm-11 {
+ left: 91.666667%;
+ }
+ .push-sm-12 {
+ left: 100%;
+ }
+ .offset-sm-0 {
+ margin-left: 0%;
+ }
+ .offset-sm-1 {
+ margin-left: 8.333333%;
+ }
+ .offset-sm-2 {
+ margin-left: 16.666667%;
+ }
+ .offset-sm-3 {
+ margin-left: 25%;
+ }
+ .offset-sm-4 {
+ margin-left: 33.333333%;
+ }
+ .offset-sm-5 {
+ margin-left: 41.666667%;
+ }
+ .offset-sm-6 {
+ margin-left: 50%;
+ }
+ .offset-sm-7 {
+ margin-left: 58.333333%;
+ }
+ .offset-sm-8 {
+ margin-left: 66.666667%;
+ }
+ .offset-sm-9 {
+ margin-left: 75%;
+ }
+ .offset-sm-10 {
+ margin-left: 83.333333%;
+ }
+ .offset-sm-11 {
+ margin-left: 91.666667%;
+ }
+}
+
+@media (min-width: 768px) {
+ .col-md {
+ -webkit-flex-basis: 0;
+ -ms-flex-preferred-size: 0;
+ flex-basis: 0;
+ -webkit-box-flex: 1;
+ -webkit-flex-grow: 1;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ max-width: 100%;
+ }
+ .col-md-auto {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 auto;
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
+ width: auto;
+ }
+ .col-md-1 {
+ width: 8.333333%;
+ }
+ .col-md-2 {
+ width: 16.666667%;
+ }
+ .col-md-3 {
+ width: 25%;
+ }
+ .col-md-4 {
+ width: 33.333333%;
+ }
+ .col-md-5 {
+ width: 41.666667%;
+ }
+ .col-md-6 {
+ width: 50%;
+ }
+ .col-md-7 {
+ width: 58.333333%;
+ }
+ .col-md-8 {
+ width: 66.666667%;
+ }
+ .col-md-9 {
+ width: 75%;
+ }
+ .col-md-10 {
+ width: 83.333333%;
+ }
+ .col-md-11 {
+ width: 91.666667%;
+ }
+ .col-md-12 {
+ width: 100%;
+ }
+ .pull-md-0 {
+ right: auto;
+ }
+ .pull-md-1 {
+ right: 8.333333%;
+ }
+ .pull-md-2 {
+ right: 16.666667%;
+ }
+ .pull-md-3 {
+ right: 25%;
+ }
+ .pull-md-4 {
+ right: 33.333333%;
+ }
+ .pull-md-5 {
+ right: 41.666667%;
+ }
+ .pull-md-6 {
+ right: 50%;
+ }
+ .pull-md-7 {
+ right: 58.333333%;
+ }
+ .pull-md-8 {
+ right: 66.666667%;
+ }
+ .pull-md-9 {
+ right: 75%;
+ }
+ .pull-md-10 {
+ right: 83.333333%;
+ }
+ .pull-md-11 {
+ right: 91.666667%;
+ }
+ .pull-md-12 {
+ right: 100%;
+ }
+ .push-md-0 {
+ left: auto;
+ }
+ .push-md-1 {
+ left: 8.333333%;
+ }
+ .push-md-2 {
+ left: 16.666667%;
+ }
+ .push-md-3 {
+ left: 25%;
+ }
+ .push-md-4 {
+ left: 33.333333%;
+ }
+ .push-md-5 {
+ left: 41.666667%;
+ }
+ .push-md-6 {
+ left: 50%;
+ }
+ .push-md-7 {
+ left: 58.333333%;
+ }
+ .push-md-8 {
+ left: 66.666667%;
+ }
+ .push-md-9 {
+ left: 75%;
+ }
+ .push-md-10 {
+ left: 83.333333%;
+ }
+ .push-md-11 {
+ left: 91.666667%;
+ }
+ .push-md-12 {
+ left: 100%;
+ }
+ .offset-md-0 {
+ margin-left: 0%;
+ }
+ .offset-md-1 {
+ margin-left: 8.333333%;
+ }
+ .offset-md-2 {
+ margin-left: 16.666667%;
+ }
+ .offset-md-3 {
+ margin-left: 25%;
+ }
+ .offset-md-4 {
+ margin-left: 33.333333%;
+ }
+ .offset-md-5 {
+ margin-left: 41.666667%;
+ }
+ .offset-md-6 {
+ margin-left: 50%;
+ }
+ .offset-md-7 {
+ margin-left: 58.333333%;
+ }
+ .offset-md-8 {
+ margin-left: 66.666667%;
+ }
+ .offset-md-9 {
+ margin-left: 75%;
+ }
+ .offset-md-10 {
+ margin-left: 83.333333%;
+ }
+ .offset-md-11 {
+ margin-left: 91.666667%;
+ }
+}
+
+@media (min-width: 992px) {
+ .col-lg {
+ -webkit-flex-basis: 0;
+ -ms-flex-preferred-size: 0;
+ flex-basis: 0;
+ -webkit-box-flex: 1;
+ -webkit-flex-grow: 1;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ max-width: 100%;
+ }
+ .col-lg-auto {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 auto;
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
+ width: auto;
+ }
+ .col-lg-1 {
+ width: 8.333333%;
+ }
+ .col-lg-2 {
+ width: 16.666667%;
+ }
+ .col-lg-3 {
+ width: 25%;
+ }
+ .col-lg-4 {
+ width: 33.333333%;
+ }
+ .col-lg-5 {
+ width: 41.666667%;
+ }
+ .col-lg-6 {
+ width: 50%;
+ }
+ .col-lg-7 {
+ width: 58.333333%;
+ }
+ .col-lg-8 {
+ width: 66.666667%;
+ }
+ .col-lg-9 {
+ width: 75%;
+ }
+ .col-lg-10 {
+ width: 83.333333%;
+ }
+ .col-lg-11 {
+ width: 91.666667%;
+ }
+ .col-lg-12 {
+ width: 100%;
+ }
+ .pull-lg-0 {
+ right: auto;
+ }
+ .pull-lg-1 {
+ right: 8.333333%;
+ }
+ .pull-lg-2 {
+ right: 16.666667%;
+ }
+ .pull-lg-3 {
+ right: 25%;
+ }
+ .pull-lg-4 {
+ right: 33.333333%;
+ }
+ .pull-lg-5 {
+ right: 41.666667%;
+ }
+ .pull-lg-6 {
+ right: 50%;
+ }
+ .pull-lg-7 {
+ right: 58.333333%;
+ }
+ .pull-lg-8 {
+ right: 66.666667%;
+ }
+ .pull-lg-9 {
+ right: 75%;
+ }
+ .pull-lg-10 {
+ right: 83.333333%;
+ }
+ .pull-lg-11 {
+ right: 91.666667%;
+ }
+ .pull-lg-12 {
+ right: 100%;
+ }
+ .push-lg-0 {
+ left: auto;
+ }
+ .push-lg-1 {
+ left: 8.333333%;
+ }
+ .push-lg-2 {
+ left: 16.666667%;
+ }
+ .push-lg-3 {
+ left: 25%;
+ }
+ .push-lg-4 {
+ left: 33.333333%;
+ }
+ .push-lg-5 {
+ left: 41.666667%;
+ }
+ .push-lg-6 {
+ left: 50%;
+ }
+ .push-lg-7 {
+ left: 58.333333%;
+ }
+ .push-lg-8 {
+ left: 66.666667%;
+ }
+ .push-lg-9 {
+ left: 75%;
+ }
+ .push-lg-10 {
+ left: 83.333333%;
+ }
+ .push-lg-11 {
+ left: 91.666667%;
+ }
+ .push-lg-12 {
+ left: 100%;
+ }
+ .offset-lg-0 {
+ margin-left: 0%;
+ }
+ .offset-lg-1 {
+ margin-left: 8.333333%;
+ }
+ .offset-lg-2 {
+ margin-left: 16.666667%;
+ }
+ .offset-lg-3 {
+ margin-left: 25%;
+ }
+ .offset-lg-4 {
+ margin-left: 33.333333%;
+ }
+ .offset-lg-5 {
+ margin-left: 41.666667%;
+ }
+ .offset-lg-6 {
+ margin-left: 50%;
+ }
+ .offset-lg-7 {
+ margin-left: 58.333333%;
+ }
+ .offset-lg-8 {
+ margin-left: 66.666667%;
+ }
+ .offset-lg-9 {
+ margin-left: 75%;
+ }
+ .offset-lg-10 {
+ margin-left: 83.333333%;
+ }
+ .offset-lg-11 {
+ margin-left: 91.666667%;
+ }
+}
+
+@media (min-width: 1200px) {
+ .col-xl {
+ -webkit-flex-basis: 0;
+ -ms-flex-preferred-size: 0;
+ flex-basis: 0;
+ -webkit-box-flex: 1;
+ -webkit-flex-grow: 1;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ max-width: 100%;
+ }
+ .col-xl-auto {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 auto;
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
+ width: auto;
+ }
+ .col-xl-1 {
+ width: 8.333333%;
+ }
+ .col-xl-2 {
+ width: 16.666667%;
+ }
+ .col-xl-3 {
+ width: 25%;
+ }
+ .col-xl-4 {
+ width: 33.333333%;
+ }
+ .col-xl-5 {
+ width: 41.666667%;
+ }
+ .col-xl-6 {
+ width: 50%;
+ }
+ .col-xl-7 {
+ width: 58.333333%;
+ }
+ .col-xl-8 {
+ width: 66.666667%;
+ }
+ .col-xl-9 {
+ width: 75%;
+ }
+ .col-xl-10 {
+ width: 83.333333%;
+ }
+ .col-xl-11 {
+ width: 91.666667%;
+ }
+ .col-xl-12 {
+ width: 100%;
+ }
+ .pull-xl-0 {
+ right: auto;
+ }
+ .pull-xl-1 {
+ right: 8.333333%;
+ }
+ .pull-xl-2 {
+ right: 16.666667%;
+ }
+ .pull-xl-3 {
+ right: 25%;
+ }
+ .pull-xl-4 {
+ right: 33.333333%;
+ }
+ .pull-xl-5 {
+ right: 41.666667%;
+ }
+ .pull-xl-6 {
+ right: 50%;
+ }
+ .pull-xl-7 {
+ right: 58.333333%;
+ }
+ .pull-xl-8 {
+ right: 66.666667%;
+ }
+ .pull-xl-9 {
+ right: 75%;
+ }
+ .pull-xl-10 {
+ right: 83.333333%;
+ }
+ .pull-xl-11 {
+ right: 91.666667%;
+ }
+ .pull-xl-12 {
+ right: 100%;
+ }
+ .push-xl-0 {
+ left: auto;
+ }
+ .push-xl-1 {
+ left: 8.333333%;
+ }
+ .push-xl-2 {
+ left: 16.666667%;
+ }
+ .push-xl-3 {
+ left: 25%;
+ }
+ .push-xl-4 {
+ left: 33.333333%;
+ }
+ .push-xl-5 {
+ left: 41.666667%;
+ }
+ .push-xl-6 {
+ left: 50%;
+ }
+ .push-xl-7 {
+ left: 58.333333%;
+ }
+ .push-xl-8 {
+ left: 66.666667%;
+ }
+ .push-xl-9 {
+ left: 75%;
+ }
+ .push-xl-10 {
+ left: 83.333333%;
+ }
+ .push-xl-11 {
+ left: 91.666667%;
+ }
+ .push-xl-12 {
+ left: 100%;
+ }
+ .offset-xl-0 {
+ margin-left: 0%;
+ }
+ .offset-xl-1 {
+ margin-left: 8.333333%;
+ }
+ .offset-xl-2 {
+ margin-left: 16.666667%;
+ }
+ .offset-xl-3 {
+ margin-left: 25%;
+ }
+ .offset-xl-4 {
+ margin-left: 33.333333%;
+ }
+ .offset-xl-5 {
+ margin-left: 41.666667%;
+ }
+ .offset-xl-6 {
+ margin-left: 50%;
+ }
+ .offset-xl-7 {
+ margin-left: 58.333333%;
+ }
+ .offset-xl-8 {
+ margin-left: 66.666667%;
+ }
+ .offset-xl-9 {
+ margin-left: 75%;
+ }
+ .offset-xl-10 {
+ margin-left: 83.333333%;
+ }
+ .offset-xl-11 {
+ margin-left: 91.666667%;
+ }
+}
+
+.order-first {
+ -webkit-box-ordinal-group: 0;
+ -webkit-order: -1;
+ -ms-flex-order: -1;
+ order: -1;
+}
+
+.order-last {
+ -webkit-box-ordinal-group: 2;
+ -webkit-order: 1;
+ -ms-flex-order: 1;
+ order: 1;
+}
+
+.order-0 {
+ -webkit-box-ordinal-group: 1;
+ -webkit-order: 0;
+ -ms-flex-order: 0;
+ order: 0;
+}
+
+.flex-row {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: normal !important;
+ -webkit-flex-direction: row !important;
+ -ms-flex-direction: row !important;
+ flex-direction: row !important;
+}
+
+.flex-column {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: normal !important;
+ -webkit-flex-direction: column !important;
+ -ms-flex-direction: column !important;
+ flex-direction: column !important;
+}
+
+.flex-row-reverse {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: reverse !important;
+ -webkit-flex-direction: row-reverse !important;
+ -ms-flex-direction: row-reverse !important;
+ flex-direction: row-reverse !important;
+}
+
+.flex-column-reverse {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: reverse !important;
+ -webkit-flex-direction: column-reverse !important;
+ -ms-flex-direction: column-reverse !important;
+ flex-direction: column-reverse !important;
+}
+
+.flex-wrap {
+ -webkit-flex-wrap: wrap !important;
+ -ms-flex-wrap: wrap !important;
+ flex-wrap: wrap !important;
+}
+
+.flex-nowrap {
+ -webkit-flex-wrap: nowrap !important;
+ -ms-flex-wrap: nowrap !important;
+ flex-wrap: nowrap !important;
+}
+
+.flex-wrap-reverse {
+ -webkit-flex-wrap: wrap-reverse !important;
+ -ms-flex-wrap: wrap-reverse !important;
+ flex-wrap: wrap-reverse !important;
+}
+
+.justify-content-start {
+ -webkit-box-pack: start !important;
+ -webkit-justify-content: flex-start !important;
+ -ms-flex-pack: start !important;
+ justify-content: flex-start !important;
+}
+
+.justify-content-end {
+ -webkit-box-pack: end !important;
+ -webkit-justify-content: flex-end !important;
+ -ms-flex-pack: end !important;
+ justify-content: flex-end !important;
+}
+
+.justify-content-center {
+ -webkit-box-pack: center !important;
+ -webkit-justify-content: center !important;
+ -ms-flex-pack: center !important;
+ justify-content: center !important;
+}
+
+.justify-content-between {
+ -webkit-box-pack: justify !important;
+ -webkit-justify-content: space-between !important;
+ -ms-flex-pack: justify !important;
+ justify-content: space-between !important;
+}
+
+.justify-content-around {
+ -webkit-justify-content: space-around !important;
+ -ms-flex-pack: distribute !important;
+ justify-content: space-around !important;
+}
+
+.align-items-start {
+ -webkit-box-align: start !important;
+ -webkit-align-items: flex-start !important;
+ -ms-flex-align: start !important;
+ align-items: flex-start !important;
+}
+
+.align-items-end {
+ -webkit-box-align: end !important;
+ -webkit-align-items: flex-end !important;
+ -ms-flex-align: end !important;
+ align-items: flex-end !important;
+}
+
+.align-items-center {
+ -webkit-box-align: center !important;
+ -webkit-align-items: center !important;
+ -ms-flex-align: center !important;
+ align-items: center !important;
+}
+
+.align-items-baseline {
+ -webkit-box-align: baseline !important;
+ -webkit-align-items: baseline !important;
+ -ms-flex-align: baseline !important;
+ align-items: baseline !important;
+}
+
+.align-items-stretch {
+ -webkit-box-align: stretch !important;
+ -webkit-align-items: stretch !important;
+ -ms-flex-align: stretch !important;
+ align-items: stretch !important;
+}
+
+.align-content-start {
+ -webkit-align-content: flex-start !important;
+ -ms-flex-line-pack: start !important;
+ align-content: flex-start !important;
+}
+
+.align-content-end {
+ -webkit-align-content: flex-end !important;
+ -ms-flex-line-pack: end !important;
+ align-content: flex-end !important;
+}
+
+.align-content-center {
+ -webkit-align-content: center !important;
+ -ms-flex-line-pack: center !important;
+ align-content: center !important;
+}
+
+.align-content-between {
+ -webkit-align-content: space-between !important;
+ -ms-flex-line-pack: justify !important;
+ align-content: space-between !important;
+}
+
+.align-content-around {
+ -webkit-align-content: space-around !important;
+ -ms-flex-line-pack: distribute !important;
+ align-content: space-around !important;
+}
+
+.align-content-stretch {
+ -webkit-align-content: stretch !important;
+ -ms-flex-line-pack: stretch !important;
+ align-content: stretch !important;
+}
+
+.align-self-auto {
+ -webkit-align-self: auto !important;
+ -ms-flex-item-align: auto !important;
+ -ms-grid-row-align: auto !important;
+ align-self: auto !important;
+}
+
+.align-self-start {
+ -webkit-align-self: flex-start !important;
+ -ms-flex-item-align: start !important;
+ align-self: flex-start !important;
+}
+
+.align-self-end {
+ -webkit-align-self: flex-end !important;
+ -ms-flex-item-align: end !important;
+ align-self: flex-end !important;
+}
+
+.align-self-center {
+ -webkit-align-self: center !important;
+ -ms-flex-item-align: center !important;
+ -ms-grid-row-align: center !important;
+ align-self: center !important;
+}
+
+.align-self-baseline {
+ -webkit-align-self: baseline !important;
+ -ms-flex-item-align: baseline !important;
+ align-self: baseline !important;
+}
+
+.align-self-stretch {
+ -webkit-align-self: stretch !important;
+ -ms-flex-item-align: stretch !important;
+ -ms-grid-row-align: stretch !important;
+ align-self: stretch !important;
+}
+
+@media (min-width: 576px) {
+ .order-sm-first {
+ -webkit-box-ordinal-group: 0;
+ -webkit-order: -1;
+ -ms-flex-order: -1;
+ order: -1;
+ }
+ .order-sm-last {
+ -webkit-box-ordinal-group: 2;
+ -webkit-order: 1;
+ -ms-flex-order: 1;
+ order: 1;
+ }
+ .order-sm-0 {
+ -webkit-box-ordinal-group: 1;
+ -webkit-order: 0;
+ -ms-flex-order: 0;
+ order: 0;
+ }
+ .flex-sm-row {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: normal !important;
+ -webkit-flex-direction: row !important;
+ -ms-flex-direction: row !important;
+ flex-direction: row !important;
+ }
+ .flex-sm-column {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: normal !important;
+ -webkit-flex-direction: column !important;
+ -ms-flex-direction: column !important;
+ flex-direction: column !important;
+ }
+ .flex-sm-row-reverse {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: reverse !important;
+ -webkit-flex-direction: row-reverse !important;
+ -ms-flex-direction: row-reverse !important;
+ flex-direction: row-reverse !important;
+ }
+ .flex-sm-column-reverse {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: reverse !important;
+ -webkit-flex-direction: column-reverse !important;
+ -ms-flex-direction: column-reverse !important;
+ flex-direction: column-reverse !important;
+ }
+ .flex-sm-wrap {
+ -webkit-flex-wrap: wrap !important;
+ -ms-flex-wrap: wrap !important;
+ flex-wrap: wrap !important;
+ }
+ .flex-sm-nowrap {
+ -webkit-flex-wrap: nowrap !important;
+ -ms-flex-wrap: nowrap !important;
+ flex-wrap: nowrap !important;
+ }
+ .flex-sm-wrap-reverse {
+ -webkit-flex-wrap: wrap-reverse !important;
+ -ms-flex-wrap: wrap-reverse !important;
+ flex-wrap: wrap-reverse !important;
+ }
+ .justify-content-sm-start {
+ -webkit-box-pack: start !important;
+ -webkit-justify-content: flex-start !important;
+ -ms-flex-pack: start !important;
+ justify-content: flex-start !important;
+ }
+ .justify-content-sm-end {
+ -webkit-box-pack: end !important;
+ -webkit-justify-content: flex-end !important;
+ -ms-flex-pack: end !important;
+ justify-content: flex-end !important;
+ }
+ .justify-content-sm-center {
+ -webkit-box-pack: center !important;
+ -webkit-justify-content: center !important;
+ -ms-flex-pack: center !important;
+ justify-content: center !important;
+ }
+ .justify-content-sm-between {
+ -webkit-box-pack: justify !important;
+ -webkit-justify-content: space-between !important;
+ -ms-flex-pack: justify !important;
+ justify-content: space-between !important;
+ }
+ .justify-content-sm-around {
+ -webkit-justify-content: space-around !important;
+ -ms-flex-pack: distribute !important;
+ justify-content: space-around !important;
+ }
+ .align-items-sm-start {
+ -webkit-box-align: start !important;
+ -webkit-align-items: flex-start !important;
+ -ms-flex-align: start !important;
+ align-items: flex-start !important;
+ }
+ .align-items-sm-end {
+ -webkit-box-align: end !important;
+ -webkit-align-items: flex-end !important;
+ -ms-flex-align: end !important;
+ align-items: flex-end !important;
+ }
+ .align-items-sm-center {
+ -webkit-box-align: center !important;
+ -webkit-align-items: center !important;
+ -ms-flex-align: center !important;
+ align-items: center !important;
+ }
+ .align-items-sm-baseline {
+ -webkit-box-align: baseline !important;
+ -webkit-align-items: baseline !important;
+ -ms-flex-align: baseline !important;
+ align-items: baseline !important;
+ }
+ .align-items-sm-stretch {
+ -webkit-box-align: stretch !important;
+ -webkit-align-items: stretch !important;
+ -ms-flex-align: stretch !important;
+ align-items: stretch !important;
+ }
+ .align-content-sm-start {
+ -webkit-align-content: flex-start !important;
+ -ms-flex-line-pack: start !important;
+ align-content: flex-start !important;
+ }
+ .align-content-sm-end {
+ -webkit-align-content: flex-end !important;
+ -ms-flex-line-pack: end !important;
+ align-content: flex-end !important;
+ }
+ .align-content-sm-center {
+ -webkit-align-content: center !important;
+ -ms-flex-line-pack: center !important;
+ align-content: center !important;
+ }
+ .align-content-sm-between {
+ -webkit-align-content: space-between !important;
+ -ms-flex-line-pack: justify !important;
+ align-content: space-between !important;
+ }
+ .align-content-sm-around {
+ -webkit-align-content: space-around !important;
+ -ms-flex-line-pack: distribute !important;
+ align-content: space-around !important;
+ }
+ .align-content-sm-stretch {
+ -webkit-align-content: stretch !important;
+ -ms-flex-line-pack: stretch !important;
+ align-content: stretch !important;
+ }
+ .align-self-sm-auto {
+ -webkit-align-self: auto !important;
+ -ms-flex-item-align: auto !important;
+ -ms-grid-row-align: auto !important;
+ align-self: auto !important;
+ }
+ .align-self-sm-start {
+ -webkit-align-self: flex-start !important;
+ -ms-flex-item-align: start !important;
+ align-self: flex-start !important;
+ }
+ .align-self-sm-end {
+ -webkit-align-self: flex-end !important;
+ -ms-flex-item-align: end !important;
+ align-self: flex-end !important;
+ }
+ .align-self-sm-center {
+ -webkit-align-self: center !important;
+ -ms-flex-item-align: center !important;
+ -ms-grid-row-align: center !important;
+ align-self: center !important;
+ }
+ .align-self-sm-baseline {
+ -webkit-align-self: baseline !important;
+ -ms-flex-item-align: baseline !important;
+ align-self: baseline !important;
+ }
+ .align-self-sm-stretch {
+ -webkit-align-self: stretch !important;
+ -ms-flex-item-align: stretch !important;
+ -ms-grid-row-align: stretch !important;
+ align-self: stretch !important;
+ }
+}
+
+@media (min-width: 768px) {
+ .order-md-first {
+ -webkit-box-ordinal-group: 0;
+ -webkit-order: -1;
+ -ms-flex-order: -1;
+ order: -1;
+ }
+ .order-md-last {
+ -webkit-box-ordinal-group: 2;
+ -webkit-order: 1;
+ -ms-flex-order: 1;
+ order: 1;
+ }
+ .order-md-0 {
+ -webkit-box-ordinal-group: 1;
+ -webkit-order: 0;
+ -ms-flex-order: 0;
+ order: 0;
+ }
+ .flex-md-row {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: normal !important;
+ -webkit-flex-direction: row !important;
+ -ms-flex-direction: row !important;
+ flex-direction: row !important;
+ }
+ .flex-md-column {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: normal !important;
+ -webkit-flex-direction: column !important;
+ -ms-flex-direction: column !important;
+ flex-direction: column !important;
+ }
+ .flex-md-row-reverse {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: reverse !important;
+ -webkit-flex-direction: row-reverse !important;
+ -ms-flex-direction: row-reverse !important;
+ flex-direction: row-reverse !important;
+ }
+ .flex-md-column-reverse {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: reverse !important;
+ -webkit-flex-direction: column-reverse !important;
+ -ms-flex-direction: column-reverse !important;
+ flex-direction: column-reverse !important;
+ }
+ .flex-md-wrap {
+ -webkit-flex-wrap: wrap !important;
+ -ms-flex-wrap: wrap !important;
+ flex-wrap: wrap !important;
+ }
+ .flex-md-nowrap {
+ -webkit-flex-wrap: nowrap !important;
+ -ms-flex-wrap: nowrap !important;
+ flex-wrap: nowrap !important;
+ }
+ .flex-md-wrap-reverse {
+ -webkit-flex-wrap: wrap-reverse !important;
+ -ms-flex-wrap: wrap-reverse !important;
+ flex-wrap: wrap-reverse !important;
+ }
+ .justify-content-md-start {
+ -webkit-box-pack: start !important;
+ -webkit-justify-content: flex-start !important;
+ -ms-flex-pack: start !important;
+ justify-content: flex-start !important;
+ }
+ .justify-content-md-end {
+ -webkit-box-pack: end !important;
+ -webkit-justify-content: flex-end !important;
+ -ms-flex-pack: end !important;
+ justify-content: flex-end !important;
+ }
+ .justify-content-md-center {
+ -webkit-box-pack: center !important;
+ -webkit-justify-content: center !important;
+ -ms-flex-pack: center !important;
+ justify-content: center !important;
+ }
+ .justify-content-md-between {
+ -webkit-box-pack: justify !important;
+ -webkit-justify-content: space-between !important;
+ -ms-flex-pack: justify !important;
+ justify-content: space-between !important;
+ }
+ .justify-content-md-around {
+ -webkit-justify-content: space-around !important;
+ -ms-flex-pack: distribute !important;
+ justify-content: space-around !important;
+ }
+ .align-items-md-start {
+ -webkit-box-align: start !important;
+ -webkit-align-items: flex-start !important;
+ -ms-flex-align: start !important;
+ align-items: flex-start !important;
+ }
+ .align-items-md-end {
+ -webkit-box-align: end !important;
+ -webkit-align-items: flex-end !important;
+ -ms-flex-align: end !important;
+ align-items: flex-end !important;
+ }
+ .align-items-md-center {
+ -webkit-box-align: center !important;
+ -webkit-align-items: center !important;
+ -ms-flex-align: center !important;
+ align-items: center !important;
+ }
+ .align-items-md-baseline {
+ -webkit-box-align: baseline !important;
+ -webkit-align-items: baseline !important;
+ -ms-flex-align: baseline !important;
+ align-items: baseline !important;
+ }
+ .align-items-md-stretch {
+ -webkit-box-align: stretch !important;
+ -webkit-align-items: stretch !important;
+ -ms-flex-align: stretch !important;
+ align-items: stretch !important;
+ }
+ .align-content-md-start {
+ -webkit-align-content: flex-start !important;
+ -ms-flex-line-pack: start !important;
+ align-content: flex-start !important;
+ }
+ .align-content-md-end {
+ -webkit-align-content: flex-end !important;
+ -ms-flex-line-pack: end !important;
+ align-content: flex-end !important;
+ }
+ .align-content-md-center {
+ -webkit-align-content: center !important;
+ -ms-flex-line-pack: center !important;
+ align-content: center !important;
+ }
+ .align-content-md-between {
+ -webkit-align-content: space-between !important;
+ -ms-flex-line-pack: justify !important;
+ align-content: space-between !important;
+ }
+ .align-content-md-around {
+ -webkit-align-content: space-around !important;
+ -ms-flex-line-pack: distribute !important;
+ align-content: space-around !important;
+ }
+ .align-content-md-stretch {
+ -webkit-align-content: stretch !important;
+ -ms-flex-line-pack: stretch !important;
+ align-content: stretch !important;
+ }
+ .align-self-md-auto {
+ -webkit-align-self: auto !important;
+ -ms-flex-item-align: auto !important;
+ -ms-grid-row-align: auto !important;
+ align-self: auto !important;
+ }
+ .align-self-md-start {
+ -webkit-align-self: flex-start !important;
+ -ms-flex-item-align: start !important;
+ align-self: flex-start !important;
+ }
+ .align-self-md-end {
+ -webkit-align-self: flex-end !important;
+ -ms-flex-item-align: end !important;
+ align-self: flex-end !important;
+ }
+ .align-self-md-center {
+ -webkit-align-self: center !important;
+ -ms-flex-item-align: center !important;
+ -ms-grid-row-align: center !important;
+ align-self: center !important;
+ }
+ .align-self-md-baseline {
+ -webkit-align-self: baseline !important;
+ -ms-flex-item-align: baseline !important;
+ align-self: baseline !important;
+ }
+ .align-self-md-stretch {
+ -webkit-align-self: stretch !important;
+ -ms-flex-item-align: stretch !important;
+ -ms-grid-row-align: stretch !important;
+ align-self: stretch !important;
+ }
+}
+
+@media (min-width: 992px) {
+ .order-lg-first {
+ -webkit-box-ordinal-group: 0;
+ -webkit-order: -1;
+ -ms-flex-order: -1;
+ order: -1;
+ }
+ .order-lg-last {
+ -webkit-box-ordinal-group: 2;
+ -webkit-order: 1;
+ -ms-flex-order: 1;
+ order: 1;
+ }
+ .order-lg-0 {
+ -webkit-box-ordinal-group: 1;
+ -webkit-order: 0;
+ -ms-flex-order: 0;
+ order: 0;
+ }
+ .flex-lg-row {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: normal !important;
+ -webkit-flex-direction: row !important;
+ -ms-flex-direction: row !important;
+ flex-direction: row !important;
+ }
+ .flex-lg-column {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: normal !important;
+ -webkit-flex-direction: column !important;
+ -ms-flex-direction: column !important;
+ flex-direction: column !important;
+ }
+ .flex-lg-row-reverse {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: reverse !important;
+ -webkit-flex-direction: row-reverse !important;
+ -ms-flex-direction: row-reverse !important;
+ flex-direction: row-reverse !important;
+ }
+ .flex-lg-column-reverse {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: reverse !important;
+ -webkit-flex-direction: column-reverse !important;
+ -ms-flex-direction: column-reverse !important;
+ flex-direction: column-reverse !important;
+ }
+ .flex-lg-wrap {
+ -webkit-flex-wrap: wrap !important;
+ -ms-flex-wrap: wrap !important;
+ flex-wrap: wrap !important;
+ }
+ .flex-lg-nowrap {
+ -webkit-flex-wrap: nowrap !important;
+ -ms-flex-wrap: nowrap !important;
+ flex-wrap: nowrap !important;
+ }
+ .flex-lg-wrap-reverse {
+ -webkit-flex-wrap: wrap-reverse !important;
+ -ms-flex-wrap: wrap-reverse !important;
+ flex-wrap: wrap-reverse !important;
+ }
+ .justify-content-lg-start {
+ -webkit-box-pack: start !important;
+ -webkit-justify-content: flex-start !important;
+ -ms-flex-pack: start !important;
+ justify-content: flex-start !important;
+ }
+ .justify-content-lg-end {
+ -webkit-box-pack: end !important;
+ -webkit-justify-content: flex-end !important;
+ -ms-flex-pack: end !important;
+ justify-content: flex-end !important;
+ }
+ .justify-content-lg-center {
+ -webkit-box-pack: center !important;
+ -webkit-justify-content: center !important;
+ -ms-flex-pack: center !important;
+ justify-content: center !important;
+ }
+ .justify-content-lg-between {
+ -webkit-box-pack: justify !important;
+ -webkit-justify-content: space-between !important;
+ -ms-flex-pack: justify !important;
+ justify-content: space-between !important;
+ }
+ .justify-content-lg-around {
+ -webkit-justify-content: space-around !important;
+ -ms-flex-pack: distribute !important;
+ justify-content: space-around !important;
+ }
+ .align-items-lg-start {
+ -webkit-box-align: start !important;
+ -webkit-align-items: flex-start !important;
+ -ms-flex-align: start !important;
+ align-items: flex-start !important;
+ }
+ .align-items-lg-end {
+ -webkit-box-align: end !important;
+ -webkit-align-items: flex-end !important;
+ -ms-flex-align: end !important;
+ align-items: flex-end !important;
+ }
+ .align-items-lg-center {
+ -webkit-box-align: center !important;
+ -webkit-align-items: center !important;
+ -ms-flex-align: center !important;
+ align-items: center !important;
+ }
+ .align-items-lg-baseline {
+ -webkit-box-align: baseline !important;
+ -webkit-align-items: baseline !important;
+ -ms-flex-align: baseline !important;
+ align-items: baseline !important;
+ }
+ .align-items-lg-stretch {
+ -webkit-box-align: stretch !important;
+ -webkit-align-items: stretch !important;
+ -ms-flex-align: stretch !important;
+ align-items: stretch !important;
+ }
+ .align-content-lg-start {
+ -webkit-align-content: flex-start !important;
+ -ms-flex-line-pack: start !important;
+ align-content: flex-start !important;
+ }
+ .align-content-lg-end {
+ -webkit-align-content: flex-end !important;
+ -ms-flex-line-pack: end !important;
+ align-content: flex-end !important;
+ }
+ .align-content-lg-center {
+ -webkit-align-content: center !important;
+ -ms-flex-line-pack: center !important;
+ align-content: center !important;
+ }
+ .align-content-lg-between {
+ -webkit-align-content: space-between !important;
+ -ms-flex-line-pack: justify !important;
+ align-content: space-between !important;
+ }
+ .align-content-lg-around {
+ -webkit-align-content: space-around !important;
+ -ms-flex-line-pack: distribute !important;
+ align-content: space-around !important;
+ }
+ .align-content-lg-stretch {
+ -webkit-align-content: stretch !important;
+ -ms-flex-line-pack: stretch !important;
+ align-content: stretch !important;
+ }
+ .align-self-lg-auto {
+ -webkit-align-self: auto !important;
+ -ms-flex-item-align: auto !important;
+ -ms-grid-row-align: auto !important;
+ align-self: auto !important;
+ }
+ .align-self-lg-start {
+ -webkit-align-self: flex-start !important;
+ -ms-flex-item-align: start !important;
+ align-self: flex-start !important;
+ }
+ .align-self-lg-end {
+ -webkit-align-self: flex-end !important;
+ -ms-flex-item-align: end !important;
+ align-self: flex-end !important;
+ }
+ .align-self-lg-center {
+ -webkit-align-self: center !important;
+ -ms-flex-item-align: center !important;
+ -ms-grid-row-align: center !important;
+ align-self: center !important;
+ }
+ .align-self-lg-baseline {
+ -webkit-align-self: baseline !important;
+ -ms-flex-item-align: baseline !important;
+ align-self: baseline !important;
+ }
+ .align-self-lg-stretch {
+ -webkit-align-self: stretch !important;
+ -ms-flex-item-align: stretch !important;
+ -ms-grid-row-align: stretch !important;
+ align-self: stretch !important;
+ }
+}
+
+@media (min-width: 1200px) {
+ .order-xl-first {
+ -webkit-box-ordinal-group: 0;
+ -webkit-order: -1;
+ -ms-flex-order: -1;
+ order: -1;
+ }
+ .order-xl-last {
+ -webkit-box-ordinal-group: 2;
+ -webkit-order: 1;
+ -ms-flex-order: 1;
+ order: 1;
+ }
+ .order-xl-0 {
+ -webkit-box-ordinal-group: 1;
+ -webkit-order: 0;
+ -ms-flex-order: 0;
+ order: 0;
+ }
+ .flex-xl-row {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: normal !important;
+ -webkit-flex-direction: row !important;
+ -ms-flex-direction: row !important;
+ flex-direction: row !important;
+ }
+ .flex-xl-column {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: normal !important;
+ -webkit-flex-direction: column !important;
+ -ms-flex-direction: column !important;
+ flex-direction: column !important;
+ }
+ .flex-xl-row-reverse {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: reverse !important;
+ -webkit-flex-direction: row-reverse !important;
+ -ms-flex-direction: row-reverse !important;
+ flex-direction: row-reverse !important;
+ }
+ .flex-xl-column-reverse {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: reverse !important;
+ -webkit-flex-direction: column-reverse !important;
+ -ms-flex-direction: column-reverse !important;
+ flex-direction: column-reverse !important;
+ }
+ .flex-xl-wrap {
+ -webkit-flex-wrap: wrap !important;
+ -ms-flex-wrap: wrap !important;
+ flex-wrap: wrap !important;
+ }
+ .flex-xl-nowrap {
+ -webkit-flex-wrap: nowrap !important;
+ -ms-flex-wrap: nowrap !important;
+ flex-wrap: nowrap !important;
+ }
+ .flex-xl-wrap-reverse {
+ -webkit-flex-wrap: wrap-reverse !important;
+ -ms-flex-wrap: wrap-reverse !important;
+ flex-wrap: wrap-reverse !important;
+ }
+ .justify-content-xl-start {
+ -webkit-box-pack: start !important;
+ -webkit-justify-content: flex-start !important;
+ -ms-flex-pack: start !important;
+ justify-content: flex-start !important;
+ }
+ .justify-content-xl-end {
+ -webkit-box-pack: end !important;
+ -webkit-justify-content: flex-end !important;
+ -ms-flex-pack: end !important;
+ justify-content: flex-end !important;
+ }
+ .justify-content-xl-center {
+ -webkit-box-pack: center !important;
+ -webkit-justify-content: center !important;
+ -ms-flex-pack: center !important;
+ justify-content: center !important;
+ }
+ .justify-content-xl-between {
+ -webkit-box-pack: justify !important;
+ -webkit-justify-content: space-between !important;
+ -ms-flex-pack: justify !important;
+ justify-content: space-between !important;
+ }
+ .justify-content-xl-around {
+ -webkit-justify-content: space-around !important;
+ -ms-flex-pack: distribute !important;
+ justify-content: space-around !important;
+ }
+ .align-items-xl-start {
+ -webkit-box-align: start !important;
+ -webkit-align-items: flex-start !important;
+ -ms-flex-align: start !important;
+ align-items: flex-start !important;
+ }
+ .align-items-xl-end {
+ -webkit-box-align: end !important;
+ -webkit-align-items: flex-end !important;
+ -ms-flex-align: end !important;
+ align-items: flex-end !important;
+ }
+ .align-items-xl-center {
+ -webkit-box-align: center !important;
+ -webkit-align-items: center !important;
+ -ms-flex-align: center !important;
+ align-items: center !important;
+ }
+ .align-items-xl-baseline {
+ -webkit-box-align: baseline !important;
+ -webkit-align-items: baseline !important;
+ -ms-flex-align: baseline !important;
+ align-items: baseline !important;
+ }
+ .align-items-xl-stretch {
+ -webkit-box-align: stretch !important;
+ -webkit-align-items: stretch !important;
+ -ms-flex-align: stretch !important;
+ align-items: stretch !important;
+ }
+ .align-content-xl-start {
+ -webkit-align-content: flex-start !important;
+ -ms-flex-line-pack: start !important;
+ align-content: flex-start !important;
+ }
+ .align-content-xl-end {
+ -webkit-align-content: flex-end !important;
+ -ms-flex-line-pack: end !important;
+ align-content: flex-end !important;
+ }
+ .align-content-xl-center {
+ -webkit-align-content: center !important;
+ -ms-flex-line-pack: center !important;
+ align-content: center !important;
+ }
+ .align-content-xl-between {
+ -webkit-align-content: space-between !important;
+ -ms-flex-line-pack: justify !important;
+ align-content: space-between !important;
+ }
+ .align-content-xl-around {
+ -webkit-align-content: space-around !important;
+ -ms-flex-line-pack: distribute !important;
+ align-content: space-around !important;
+ }
+ .align-content-xl-stretch {
+ -webkit-align-content: stretch !important;
+ -ms-flex-line-pack: stretch !important;
+ align-content: stretch !important;
+ }
+ .align-self-xl-auto {
+ -webkit-align-self: auto !important;
+ -ms-flex-item-align: auto !important;
+ -ms-grid-row-align: auto !important;
+ align-self: auto !important;
+ }
+ .align-self-xl-start {
+ -webkit-align-self: flex-start !important;
+ -ms-flex-item-align: start !important;
+ align-self: flex-start !important;
+ }
+ .align-self-xl-end {
+ -webkit-align-self: flex-end !important;
+ -ms-flex-item-align: end !important;
+ align-self: flex-end !important;
+ }
+ .align-self-xl-center {
+ -webkit-align-self: center !important;
+ -ms-flex-item-align: center !important;
+ -ms-grid-row-align: center !important;
+ align-self: center !important;
+ }
+ .align-self-xl-baseline {
+ -webkit-align-self: baseline !important;
+ -ms-flex-item-align: baseline !important;
+ align-self: baseline !important;
+ }
+ .align-self-xl-stretch {
+ -webkit-align-self: stretch !important;
+ -ms-flex-item-align: stretch !important;
+ -ms-grid-row-align: stretch !important;
+ align-self: stretch !important;
+ }
+}
+/*# sourceMappingURL=bootstrap-grid.css.map */ \ No newline at end of file
diff --git a/library/bootstrap/css/bootstrap-grid.css.map b/library/bootstrap/css/bootstrap-grid.css.map
new file mode 100644
index 000000000..04fef978c
--- /dev/null
+++ b/library/bootstrap/css/bootstrap-grid.css.map
@@ -0,0 +1 @@
+{"version":3,"sources":["../../scss/bootstrap-grid.scss","bootstrap-grid.css","../../scss/_grid.scss","../../scss/mixins/_grid.scss","../../scss/mixins/_breakpoints.scss","../../scss/_variables.scss","../../scss/mixins/_grid-framework.scss","../../scss/utilities/_flex.scss"],"names":[],"mappings":"AAUE;EAAgB,oBAAmB;CCRpC;;ADWD;EACE,+BAAsB;UAAtB,uBAAsB;EACtB,8BAA6B;CAC9B;;AAED;;;EAGE,4BAAmB;UAAnB,oBAAmB;CACpB;;AEjBC;ECAA,mBAAkB;EAClB,kBAAiB;EAKb,oBAA4B;EAC5B,mBAA4B;CDJ/B;;AEgDC;EFnDF;ICMI,oBAA4B;IAC5B,mBAA4B;GDJ/B;CDmBF;;AG6BG;EFnDF;ICMI,oBAA4B;IAC5B,mBAA4B;GDJ/B;CD0BF;;AGsBG;EFnDF;ICMI,oBAA4B;IAC5B,mBAA4B;GDJ/B;CDiCF;;AGeG;EFnDF;ICMI,oBAA4B;IAC5B,mBAA4B;GDJ/B;CDwCF;;AGQG;EFnDF;ICiBI,aE8KK;IF7KL,gBAAe;GDflB;CD+CF;;AGCG;EFnDF;ICiBI,aE+KK;IF9KL,gBAAe;GDflB;CDsDF;;AGNG;EFnDF;ICiBI,aEgLK;IF/KL,gBAAe;GDflB;CD6DF;;AGbG;EFnDF;ICiBI,cEiLM;IFhLN,gBAAe;GDflB;CDoEF;;AC3DC;EACE,YAAW;ECbb,mBAAkB;EAClB,kBAAiB;EAKb,oBAA4B;EAC5B,mBAA4B;CDQ/B;;AEoCC;EFvCF;ICNI,oBAA4B;IAC5B,mBAA4B;GDQ/B;CDuEF;;AGnCG;EFvCF;ICNI,oBAA4B;IAC5B,mBAA4B;GDQ/B;CD8EF;;AG1CG;EFvCF;ICNI,oBAA4B;IAC5B,mBAA4B;GDQ/B;CDqFF;;AGjDG;EFvCF;ICNI,oBAA4B;IAC5B,mBAA4B;GDQ/B;CD4FF;;ACpFC;ECWA,qBAAa;EAAb,sBAAa;EAAb,qBAAa;EAAb,cAAa;EACb,wBAAe;MAAf,oBAAe;UAAf,gBAAe;EAKX,oBAA4B;EAC5B,mBAA4B;CDhB/B;;AE0BC;EF5BF;ICiBI,oBAA4B;IAC5B,mBAA4B;GDhB/B;CDgGF;;AGtEG;EF5BF;ICiBI,oBAA4B;IAC5B,mBAA4B;GDhB/B;CDuGF;;AG7EG;EF5BF;ICiBI,oBAA4B;IAC5B,mBAA4B;GDhB/B;CD8GF;;AGpFG;EF5BF;ICiBI,oBAA4B;IAC5B,mBAA4B;GDhB/B;CDqHF;;ACjHC;EACE,gBAAe;EACf,eAAc;CAOf;;AATD;;EAMI,iBAAgB;EAChB,gBAAe;CAChB;;AInCH;;;;;;EACE,mBAAkB;EAClB,YAAW;EACX,gBAAe;EHsBb,oBAA4B;EAC5B,mBAA4B;CGpB/B;;AF2CC;EEjDF;;;;;;IHyBI,oBAA4B;IAC5B,mBAA4B;GGpB/B;CL0KF;;AG/HG;EEjDF;;;;;;IHyBI,oBAA4B;IAC5B,mBAA4B;GGpB/B;CLsLF;;AG3IG;EEjDF;;;;;;IHyBI,oBAA4B;IAC5B,mBAA4B;GGpB/B;CLkMF;;AGvJG;EEjDF;;;;;;IHyBI,oBAA4B;IAC5B,mBAA4B;GGpB/B;CL8MF;;AK5LK;EACE,sBAAa;MAAb,2BAAa;UAAb,cAAa;EACb,oBAAY;EAAZ,qBAAY;MAAZ,qBAAY;UAAZ,aAAY;EACZ,gBAAe;CAChB;;AACD;EACE,oBAAc;EAAd,uBAAc;MAAd,mBAAc;UAAd,eAAc;EACd,YAAW;CACZ;;AAGC;EH2BN,iBAAmC;CGzB5B;;AAFD;EH2BN,kBAAmC;CGzB5B;;AAFD;EH2BN,WAAmC;CGzB5B;;AAFD;EH2BN,kBAAmC;CGzB5B;;AAFD;EH2BN,kBAAmC;CGzB5B;;AAFD;EH2BN,WAAmC;CGzB5B;;AAFD;EH2BN,kBAAmC;CGzB5B;;AAFD;EH2BN,kBAAmC;CGzB5B;;AAFD;EH2BN,WAAmC;CGzB5B;;AAFD;EH2BN,kBAAmC;CGzB5B;;AAFD;EH2BN,kBAAmC;CGzB5B;;AAFD;EH2BN,YAAmC;CGzB5B;;AAKC;EHgCR,YAAuD;CG9B9C;;AAFD;EHgCR,iBAAiD;CG9BxC;;AAFD;EHgCR,kBAAiD;CG9BxC;;AAFD;EHgCR,WAAiD;CG9BxC;;AAFD;EHgCR,kBAAiD;CG9BxC;;AAFD;EHgCR,kBAAiD;CG9BxC;;AAFD;EHgCR,WAAiD;CG9BxC;;AAFD;EHgCR,kBAAiD;CG9BxC;;AAFD;EHgCR,kBAAiD;CG9BxC;;AAFD;EHgCR,WAAiD;CG9BxC;;AAFD;EHgCR,kBAAiD;CG9BxC;;AAFD;EHgCR,kBAAiD;CG9BxC;;AAFD;EHgCR,YAAiD;CG9BxC;;AAFD;EH4BR,WAAsD;CG1B7C;;AAFD;EH4BR,gBAAgD;CG1BvC;;AAFD;EH4BR,iBAAgD;CG1BvC;;AAFD;EH4BR,UAAgD;CG1BvC;;AAFD;EH4BR,iBAAgD;CG1BvC;;AAFD;EH4BR,iBAAgD;CG1BvC;;AAFD;EH4BR,UAAgD;CG1BvC;;AAFD;EH4BR,iBAAgD;CG1BvC;;AAFD;EH4BR,iBAAgD;CG1BvC;;AAFD;EH4BR,UAAgD;CG1BvC;;AAFD;EH4BR,iBAAgD;CG1BvC;;AAFD;EH4BR,iBAAgD;CG1BvC;;AAFD;EH4BR,WAAgD;CG1BvC;;AAOD;EHeR,uBAAyC;CGbhC;;AAFD;EHeR,wBAAyC;CGbhC;;AAFD;EHeR,iBAAyC;CGbhC;;AAFD;EHeR,wBAAyC;CGbhC;;AAFD;EHeR,wBAAyC;CGbhC;;AAFD;EHeR,iBAAyC;CGbhC;;AAFD;EHeR,wBAAyC;CGbhC;;AAFD;EHeR,wBAAyC;CGbhC;;AAFD;EHeR,iBAAyC;CGbhC;;AAFD;EHeR,wBAAyC;CGbhC;;AAFD;EHeR,wBAAyC;CGbhC;;AFJP;EEzBE;IACE,sBAAa;QAAb,2BAAa;YAAb,cAAa;IACb,oBAAY;IAAZ,qBAAY;QAAZ,qBAAY;YAAZ,aAAY;IACZ,gBAAe;GAChB;EACD;IACE,oBAAc;IAAd,uBAAc;QAAd,mBAAc;YAAd,eAAc;IACd,YAAW;GACZ;EAGC;IH2BN,iBAAmC;GGzB5B;EAFD;IH2BN,kBAAmC;GGzB5B;EAFD;IH2BN,WAAmC;GGzB5B;EAFD;IH2BN,kBAAmC;GGzB5B;EAFD;IH2BN,kBAAmC;GGzB5B;EAFD;IH2BN,WAAmC;GGzB5B;EAFD;IH2BN,kBAAmC;GGzB5B;EAFD;IH2BN,kBAAmC;GGzB5B;EAFD;IH2BN,WAAmC;GGzB5B;EAFD;IH2BN,kBAAmC;GGzB5B;EAFD;IH2BN,kBAAmC;GGzB5B;EAFD;IH2BN,YAAmC;GGzB5B;EAKC;IHgCR,YAAuD;GG9B9C;EAFD;IHgCR,iBAAiD;GG9BxC;EAFD;IHgCR,kBAAiD;GG9BxC;EAFD;IHgCR,WAAiD;GG9BxC;EAFD;IHgCR,kBAAiD;GG9BxC;EAFD;IHgCR,kBAAiD;GG9BxC;EAFD;IHgCR,WAAiD;GG9BxC;EAFD;IHgCR,kBAAiD;GG9BxC;EAFD;IHgCR,kBAAiD;GG9BxC;EAFD;IHgCR,WAAiD;GG9BxC;EAFD;IHgCR,kBAAiD;GG9BxC;EAFD;IHgCR,kBAAiD;GG9BxC;EAFD;IHgCR,YAAiD;GG9BxC;EAFD;IH4BR,WAAsD;GG1B7C;EAFD;IH4BR,gBAAgD;GG1BvC;EAFD;IH4BR,iBAAgD;GG1BvC;EAFD;IH4BR,UAAgD;GG1BvC;EAFD;IH4BR,iBAAgD;GG1BvC;EAFD;IH4BR,iBAAgD;GG1BvC;EAFD;IH4BR,UAAgD;GG1BvC;EAFD;IH4BR,iBAAgD;GG1BvC;EAFD;IH4BR,iBAAgD;GG1BvC;EAFD;IH4BR,UAAgD;GG1BvC;EAFD;IH4BR,iBAAgD;GG1BvC;EAFD;IH4BR,iBAAgD;GG1BvC;EAFD;IH4BR,WAAgD;GG1BvC;EAOD;IHeR,gBAAyC;GGbhC;EAFD;IHeR,uBAAyC;GGbhC;EAFD;IHeR,wBAAyC;GGbhC;EAFD;IHeR,iBAAyC;GGbhC;EAFD;IHeR,wBAAyC;GGbhC;EAFD;IHeR,wBAAyC;GGbhC;EAFD;IHeR,iBAAyC;GGbhC;EAFD;IHeR,wBAAyC;GGbhC;EAFD;IHeR,wBAAyC;GGbhC;EAFD;IHeR,iBAAyC;GGbhC;EAFD;IHeR,wBAAyC;GGbhC;EAFD;IHeR,wBAAyC;GGbhC;CLghBV;;AGphBG;EEzBE;IACE,sBAAa;QAAb,2BAAa;YAAb,cAAa;IACb,oBAAY;IAAZ,qBAAY;QAAZ,qBAAY;YAAZ,aAAY;IACZ,gBAAe;GAChB;EACD;IACE,oBAAc;IAAd,uBAAc;QAAd,mBAAc;YAAd,eAAc;IACd,YAAW;GACZ;EAGC;IH2BN,iBAAmC;GGzB5B;EAFD;IH2BN,kBAAmC;GGzB5B;EAFD;IH2BN,WAAmC;GGzB5B;EAFD;IH2BN,kBAAmC;GGzB5B;EAFD;IH2BN,kBAAmC;GGzB5B;EAFD;IH2BN,WAAmC;GGzB5B;EAFD;IH2BN,kBAAmC;GGzB5B;EAFD;IH2BN,kBAAmC;GGzB5B;EAFD;IH2BN,WAAmC;GGzB5B;EAFD;IH2BN,kBAAmC;GGzB5B;EAFD;IH2BN,kBAAmC;GGzB5B;EAFD;IH2BN,YAAmC;GGzB5B;EAKC;IHgCR,YAAuD;GG9B9C;EAFD;IHgCR,iBAAiD;GG9BxC;EAFD;IHgCR,kBAAiD;GG9BxC;EAFD;IHgCR,WAAiD;GG9BxC;EAFD;IHgCR,kBAAiD;GG9BxC;EAFD;IHgCR,kBAAiD;GG9BxC;EAFD;IHgCR,WAAiD;GG9BxC;EAFD;IHgCR,kBAAiD;GG9BxC;EAFD;IHgCR,kBAAiD;GG9BxC;EAFD;IHgCR,WAAiD;GG9BxC;EAFD;IHgCR,kBAAiD;GG9BxC;EAFD;IHgCR,kBAAiD;GG9BxC;EAFD;IHgCR,YAAiD;GG9BxC;EAFD;IH4BR,WAAsD;GG1B7C;EAFD;IH4BR,gBAAgD;GG1BvC;EAFD;IH4BR,iBAAgD;GG1BvC;EAFD;IH4BR,UAAgD;GG1BvC;EAFD;IH4BR,iBAAgD;GG1BvC;EAFD;IH4BR,iBAAgD;GG1BvC;EAFD;IH4BR,UAAgD;GG1BvC;EAFD;IH4BR,iBAAgD;GG1BvC;EAFD;IH4BR,iBAAgD;GG1BvC;EAFD;IH4BR,UAAgD;GG1BvC;EAFD;IH4BR,iBAAgD;GG1BvC;EAFD;IH4BR,iBAAgD;GG1BvC;EAFD;IH4BR,WAAgD;GG1BvC;EAOD;IHeR,gBAAyC;GGbhC;EAFD;IHeR,uBAAyC;GGbhC;EAFD;IHeR,wBAAyC;GGbhC;EAFD;IHeR,iBAAyC;GGbhC;EAFD;IHeR,wBAAyC;GGbhC;EAFD;IHeR,wBAAyC;GGbhC;EAFD;IHeR,iBAAyC;GGbhC;EAFD;IHeR,wBAAyC;GGbhC;EAFD;IHeR,wBAAyC;GGbhC;EAFD;IHeR,iBAAyC;GGbhC;EAFD;IHeR,wBAAyC;GGbhC;EAFD;IHeR,wBAAyC;GGbhC;CLkrBV;;AGtrBG;EEzBE;IACE,sBAAa;QAAb,2BAAa;YAAb,cAAa;IACb,oBAAY;IAAZ,qBAAY;QAAZ,qBAAY;YAAZ,aAAY;IACZ,gBAAe;GAChB;EACD;IACE,oBAAc;IAAd,uBAAc;QAAd,mBAAc;YAAd,eAAc;IACd,YAAW;GACZ;EAGC;IH2BN,iBAAmC;GGzB5B;EAFD;IH2BN,kBAAmC;GGzB5B;EAFD;IH2BN,WAAmC;GGzB5B;EAFD;IH2BN,kBAAmC;GGzB5B;EAFD;IH2BN,kBAAmC;GGzB5B;EAFD;IH2BN,WAAmC;GGzB5B;EAFD;IH2BN,kBAAmC;GGzB5B;EAFD;IH2BN,kBAAmC;GGzB5B;EAFD;IH2BN,WAAmC;GGzB5B;EAFD;IH2BN,kBAAmC;GGzB5B;EAFD;IH2BN,kBAAmC;GGzB5B;EAFD;IH2BN,YAAmC;GGzB5B;EAKC;IHgCR,YAAuD;GG9B9C;EAFD;IHgCR,iBAAiD;GG9BxC;EAFD;IHgCR,kBAAiD;GG9BxC;EAFD;IHgCR,WAAiD;GG9BxC;EAFD;IHgCR,kBAAiD;GG9BxC;EAFD;IHgCR,kBAAiD;GG9BxC;EAFD;IHgCR,WAAiD;GG9BxC;EAFD;IHgCR,kBAAiD;GG9BxC;EAFD;IHgCR,kBAAiD;GG9BxC;EAFD;IHgCR,WAAiD;GG9BxC;EAFD;IHgCR,kBAAiD;GG9BxC;EAFD;IHgCR,kBAAiD;GG9BxC;EAFD;IHgCR,YAAiD;GG9BxC;EAFD;IH4BR,WAAsD;GG1B7C;EAFD;IH4BR,gBAAgD;GG1BvC;EAFD;IH4BR,iBAAgD;GG1BvC;EAFD;IH4BR,UAAgD;GG1BvC;EAFD;IH4BR,iBAAgD;GG1BvC;EAFD;IH4BR,iBAAgD;GG1BvC;EAFD;IH4BR,UAAgD;GG1BvC;EAFD;IH4BR,iBAAgD;GG1BvC;EAFD;IH4BR,iBAAgD;GG1BvC;EAFD;IH4BR,UAAgD;GG1BvC;EAFD;IH4BR,iBAAgD;GG1BvC;EAFD;IH4BR,iBAAgD;GG1BvC;EAFD;IH4BR,WAAgD;GG1BvC;EAOD;IHeR,gBAAyC;GGbhC;EAFD;IHeR,uBAAyC;GGbhC;EAFD;IHeR,wBAAyC;GGbhC;EAFD;IHeR,iBAAyC;GGbhC;EAFD;IHeR,wBAAyC;GGbhC;EAFD;IHeR,wBAAyC;GGbhC;EAFD;IHeR,iBAAyC;GGbhC;EAFD;IHeR,wBAAyC;GGbhC;EAFD;IHeR,wBAAyC;GGbhC;EAFD;IHeR,iBAAyC;GGbhC;EAFD;IHeR,wBAAyC;GGbhC;EAFD;IHeR,wBAAyC;GGbhC;CLo1BV;;AGx1BG;EEzBE;IACE,sBAAa;QAAb,2BAAa;YAAb,cAAa;IACb,oBAAY;IAAZ,qBAAY;QAAZ,qBAAY;YAAZ,aAAY;IACZ,gBAAe;GAChB;EACD;IACE,oBAAc;IAAd,uBAAc;QAAd,mBAAc;YAAd,eAAc;IACd,YAAW;GACZ;EAGC;IH2BN,iBAAmC;GGzB5B;EAFD;IH2BN,kBAAmC;GGzB5B;EAFD;IH2BN,WAAmC;GGzB5B;EAFD;IH2BN,kBAAmC;GGzB5B;EAFD;IH2BN,kBAAmC;GGzB5B;EAFD;IH2BN,WAAmC;GGzB5B;EAFD;IH2BN,kBAAmC;GGzB5B;EAFD;IH2BN,kBAAmC;GGzB5B;EAFD;IH2BN,WAAmC;GGzB5B;EAFD;IH2BN,kBAAmC;GGzB5B;EAFD;IH2BN,kBAAmC;GGzB5B;EAFD;IH2BN,YAAmC;GGzB5B;EAKC;IHgCR,YAAuD;GG9B9C;EAFD;IHgCR,iBAAiD;GG9BxC;EAFD;IHgCR,kBAAiD;GG9BxC;EAFD;IHgCR,WAAiD;GG9BxC;EAFD;IHgCR,kBAAiD;GG9BxC;EAFD;IHgCR,kBAAiD;GG9BxC;EAFD;IHgCR,WAAiD;GG9BxC;EAFD;IHgCR,kBAAiD;GG9BxC;EAFD;IHgCR,kBAAiD;GG9BxC;EAFD;IHgCR,WAAiD;GG9BxC;EAFD;IHgCR,kBAAiD;GG9BxC;EAFD;IHgCR,kBAAiD;GG9BxC;EAFD;IHgCR,YAAiD;GG9BxC;EAFD;IH4BR,WAAsD;GG1B7C;EAFD;IH4BR,gBAAgD;GG1BvC;EAFD;IH4BR,iBAAgD;GG1BvC;EAFD;IH4BR,UAAgD;GG1BvC;EAFD;IH4BR,iBAAgD;GG1BvC;EAFD;IH4BR,iBAAgD;GG1BvC;EAFD;IH4BR,UAAgD;GG1BvC;EAFD;IH4BR,iBAAgD;GG1BvC;EAFD;IH4BR,iBAAgD;GG1BvC;EAFD;IH4BR,UAAgD;GG1BvC;EAFD;IH4BR,iBAAgD;GG1BvC;EAFD;IH4BR,iBAAgD;GG1BvC;EAFD;IH4BR,WAAgD;GG1BvC;EAOD;IHeR,gBAAyC;GGbhC;EAFD;IHeR,uBAAyC;GGbhC;EAFD;IHeR,wBAAyC;GGbhC;EAFD;IHeR,iBAAyC;GGbhC;EAFD;IHeR,wBAAyC;GGbhC;EAFD;IHeR,wBAAyC;GGbhC;EAFD;IHeR,iBAAyC;GGbhC;EAFD;IHeR,wBAAyC;GGbhC;EAFD;IHeR,wBAAyC;GGbhC;EAFD;IHeR,iBAAyC;GGbhC;EAFD;IHeR,wBAAyC;GGbhC;EAFD;IHeR,wBAAyC;GGbhC;CLs/BV;;AM1iCG;EAAwB,6BAAS;EAAT,kBAAS;MAAT,mBAAS;UAAT,UAAS;CAAK;;AACtC;EAAwB,6BAAQ;EAAR,iBAAQ;MAAR,kBAAQ;UAAR,SAAQ;CAAK;;AACrC;EAAwB,6BAAQ;EAAR,iBAAQ;MAAR,kBAAQ;UAAR,SAAQ;CAAK;;AAErC;EAAgC,0CAA8B;EAA9B,yCAA8B;EAA9B,uCAA8B;MAA9B,mCAA8B;UAA9B,+BAA8B;CAAK;;AACnE;EAAgC,wCAAiC;EAAjC,yCAAiC;EAAjC,0CAAiC;MAAjC,sCAAiC;UAAjC,kCAAiC;CAAK;;AACtE;EAAgC,0CAAsC;EAAtC,0CAAsC;EAAtC,+CAAsC;MAAtC,2CAAsC;UAAtC,uCAAsC;CAAK;;AAC3E;EAAgC,wCAAyC;EAAzC,0CAAyC;EAAzC,kDAAyC;MAAzC,8CAAyC;UAAzC,0CAAyC;CAAK;;AAE9E;EAA8B,mCAA0B;MAA1B,+BAA0B;UAA1B,2BAA0B;CAAK;;AAC7D;EAA8B,qCAA4B;MAA5B,iCAA4B;UAA5B,6BAA4B;CAAK;;AAC/D;EAA8B,2CAAkC;MAAlC,uCAAkC;UAAlC,mCAAkC;CAAK;;AAErE;EAAoC,mCAAsC;EAAtC,+CAAsC;MAAtC,gCAAsC;UAAtC,uCAAsC;CAAK;;AAC/E;EAAoC,iCAAoC;EAApC,6CAAoC;MAApC,8BAAoC;UAApC,qCAAoC;CAAK;;AAC7E;EAAoC,oCAAkC;EAAlC,2CAAkC;MAAlC,iCAAkC;UAAlC,mCAAkC;CAAK;;AAC3E;EAAoC,qCAAyC;EAAzC,kDAAyC;MAAzC,kCAAyC;UAAzC,0CAAyC;CAAK;;AAClF;EAAoC,iDAAwC;MAAxC,qCAAwC;UAAxC,yCAAwC;CAAK;;AAEjF;EAAiC,oCAAkC;EAAlC,2CAAkC;MAAlC,iCAAkC;UAAlC,mCAAkC;CAAK;;AACxE;EAAiC,kCAAgC;EAAhC,yCAAgC;MAAhC,+BAAgC;UAAhC,iCAAgC;CAAK;;AACtE;EAAiC,qCAA8B;EAA9B,uCAA8B;MAA9B,kCAA8B;UAA9B,+BAA8B;CAAK;;AACpE;EAAiC,uCAAgC;EAAhC,yCAAgC;MAAhC,oCAAgC;UAAhC,iCAAgC;CAAK;;AACtE;EAAiC,sCAA+B;EAA/B,wCAA+B;MAA/B,mCAA+B;UAA/B,gCAA+B;CAAK;;AAErE;EAAkC,6CAAoC;MAApC,qCAAoC;UAApC,qCAAoC;CAAK;;AAC3E;EAAkC,2CAAkC;MAAlC,mCAAkC;UAAlC,mCAAkC;CAAK;;AACzE;EAAkC,yCAAgC;MAAhC,sCAAgC;UAAhC,iCAAgC;CAAK;;AACvE;EAAkC,gDAAuC;MAAvC,uCAAuC;UAAvC,wCAAuC;CAAK;;AAC9E;EAAkC,+CAAsC;MAAtC,0CAAsC;UAAtC,uCAAsC;CAAK;;AAC7E;EAAkC,0CAAiC;MAAjC,uCAAiC;UAAjC,kCAAiC;CAAK;;AAExE;EAAgC,oCAA2B;MAA3B,qCAA2B;cAA3B,oCAA2B;UAA3B,4BAA2B;CAAK;;AAChE;EAAgC,0CAAiC;MAAjC,sCAAiC;UAAjC,kCAAiC;CAAK;;AACtE;EAAgC,wCAA+B;MAA/B,oCAA+B;UAA/B,gCAA+B;CAAK;;AACpE;EAAgC,sCAA6B;MAA7B,uCAA6B;cAA7B,sCAA6B;UAA7B,8BAA6B;CAAK;;AAClE;EAAgC,wCAA+B;MAA/B,yCAA+B;UAA/B,gCAA+B;CAAK;;AACpE;EAAgC,uCAA8B;MAA9B,wCAA8B;cAA9B,uCAA8B;UAA9B,+BAA8B;CAAK;;AHWnE;EGhDA;IAAwB,6BAAS;IAAT,kBAAS;QAAT,mBAAS;YAAT,UAAS;GAAK;EACtC;IAAwB,6BAAQ;IAAR,iBAAQ;QAAR,kBAAQ;YAAR,SAAQ;GAAK;EACrC;IAAwB,6BAAQ;IAAR,iBAAQ;QAAR,kBAAQ;YAAR,SAAQ;GAAK;EAErC;IAAgC,0CAA8B;IAA9B,yCAA8B;IAA9B,uCAA8B;QAA9B,mCAA8B;YAA9B,+BAA8B;GAAK;EACnE;IAAgC,wCAAiC;IAAjC,yCAAiC;IAAjC,0CAAiC;QAAjC,sCAAiC;YAAjC,kCAAiC;GAAK;EACtE;IAAgC,0CAAsC;IAAtC,0CAAsC;IAAtC,+CAAsC;QAAtC,2CAAsC;YAAtC,uCAAsC;GAAK;EAC3E;IAAgC,wCAAyC;IAAzC,0CAAyC;IAAzC,kDAAyC;QAAzC,8CAAyC;YAAzC,0CAAyC;GAAK;EAE9E;IAA8B,mCAA0B;QAA1B,+BAA0B;YAA1B,2BAA0B;GAAK;EAC7D;IAA8B,qCAA4B;QAA5B,iCAA4B;YAA5B,6BAA4B;GAAK;EAC/D;IAA8B,2CAAkC;QAAlC,uCAAkC;YAAlC,mCAAkC;GAAK;EAErE;IAAoC,mCAAsC;IAAtC,+CAAsC;QAAtC,gCAAsC;YAAtC,uCAAsC;GAAK;EAC/E;IAAoC,iCAAoC;IAApC,6CAAoC;QAApC,8BAAoC;YAApC,qCAAoC;GAAK;EAC7E;IAAoC,oCAAkC;IAAlC,2CAAkC;QAAlC,iCAAkC;YAAlC,mCAAkC;GAAK;EAC3E;IAAoC,qCAAyC;IAAzC,kDAAyC;QAAzC,kCAAyC;YAAzC,0CAAyC;GAAK;EAClF;IAAoC,iDAAwC;QAAxC,qCAAwC;YAAxC,yCAAwC;GAAK;EAEjF;IAAiC,oCAAkC;IAAlC,2CAAkC;QAAlC,iCAAkC;YAAlC,mCAAkC;GAAK;EACxE;IAAiC,kCAAgC;IAAhC,yCAAgC;QAAhC,+BAAgC;YAAhC,iCAAgC;GAAK;EACtE;IAAiC,qCAA8B;IAA9B,uCAA8B;QAA9B,kCAA8B;YAA9B,+BAA8B;GAAK;EACpE;IAAiC,uCAAgC;IAAhC,yCAAgC;QAAhC,oCAAgC;YAAhC,iCAAgC;GAAK;EACtE;IAAiC,sCAA+B;IAA/B,wCAA+B;QAA/B,mCAA+B;YAA/B,gCAA+B;GAAK;EAErE;IAAkC,6CAAoC;QAApC,qCAAoC;YAApC,qCAAoC;GAAK;EAC3E;IAAkC,2CAAkC;QAAlC,mCAAkC;YAAlC,mCAAkC;GAAK;EACzE;IAAkC,yCAAgC;QAAhC,sCAAgC;YAAhC,iCAAgC;GAAK;EACvE;IAAkC,gDAAuC;QAAvC,uCAAuC;YAAvC,wCAAuC;GAAK;EAC9E;IAAkC,+CAAsC;QAAtC,0CAAsC;YAAtC,uCAAsC;GAAK;EAC7E;IAAkC,0CAAiC;QAAjC,uCAAiC;YAAjC,kCAAiC;GAAK;EAExE;IAAgC,oCAA2B;QAA3B,qCAA2B;gBAA3B,oCAA2B;YAA3B,4BAA2B;GAAK;EAChE;IAAgC,0CAAiC;QAAjC,sCAAiC;YAAjC,kCAAiC;GAAK;EACtE;IAAgC,wCAA+B;QAA/B,oCAA+B;YAA/B,gCAA+B;GAAK;EACpE;IAAgC,sCAA6B;QAA7B,uCAA6B;gBAA7B,sCAA6B;YAA7B,8BAA6B;GAAK;EAClE;IAAgC,wCAA+B;QAA/B,yCAA+B;YAA/B,gCAA+B;GAAK;EACpE;IAAgC,uCAA8B;QAA9B,wCAA8B;gBAA9B,uCAA8B;YAA9B,+BAA8B;GAAK;CNwuCtE;;AG7tCG;EGhDA;IAAwB,6BAAS;IAAT,kBAAS;QAAT,mBAAS;YAAT,UAAS;GAAK;EACtC;IAAwB,6BAAQ;IAAR,iBAAQ;QAAR,kBAAQ;YAAR,SAAQ;GAAK;EACrC;IAAwB,6BAAQ;IAAR,iBAAQ;QAAR,kBAAQ;YAAR,SAAQ;GAAK;EAErC;IAAgC,0CAA8B;IAA9B,yCAA8B;IAA9B,uCAA8B;QAA9B,mCAA8B;YAA9B,+BAA8B;GAAK;EACnE;IAAgC,wCAAiC;IAAjC,yCAAiC;IAAjC,0CAAiC;QAAjC,sCAAiC;YAAjC,kCAAiC;GAAK;EACtE;IAAgC,0CAAsC;IAAtC,0CAAsC;IAAtC,+CAAsC;QAAtC,2CAAsC;YAAtC,uCAAsC;GAAK;EAC3E;IAAgC,wCAAyC;IAAzC,0CAAyC;IAAzC,kDAAyC;QAAzC,8CAAyC;YAAzC,0CAAyC;GAAK;EAE9E;IAA8B,mCAA0B;QAA1B,+BAA0B;YAA1B,2BAA0B;GAAK;EAC7D;IAA8B,qCAA4B;QAA5B,iCAA4B;YAA5B,6BAA4B;GAAK;EAC/D;IAA8B,2CAAkC;QAAlC,uCAAkC;YAAlC,mCAAkC;GAAK;EAErE;IAAoC,mCAAsC;IAAtC,+CAAsC;QAAtC,gCAAsC;YAAtC,uCAAsC;GAAK;EAC/E;IAAoC,iCAAoC;IAApC,6CAAoC;QAApC,8BAAoC;YAApC,qCAAoC;GAAK;EAC7E;IAAoC,oCAAkC;IAAlC,2CAAkC;QAAlC,iCAAkC;YAAlC,mCAAkC;GAAK;EAC3E;IAAoC,qCAAyC;IAAzC,kDAAyC;QAAzC,kCAAyC;YAAzC,0CAAyC;GAAK;EAClF;IAAoC,iDAAwC;QAAxC,qCAAwC;YAAxC,yCAAwC;GAAK;EAEjF;IAAiC,oCAAkC;IAAlC,2CAAkC;QAAlC,iCAAkC;YAAlC,mCAAkC;GAAK;EACxE;IAAiC,kCAAgC;IAAhC,yCAAgC;QAAhC,+BAAgC;YAAhC,iCAAgC;GAAK;EACtE;IAAiC,qCAA8B;IAA9B,uCAA8B;QAA9B,kCAA8B;YAA9B,+BAA8B;GAAK;EACpE;IAAiC,uCAAgC;IAAhC,yCAAgC;QAAhC,oCAAgC;YAAhC,iCAAgC;GAAK;EACtE;IAAiC,sCAA+B;IAA/B,wCAA+B;QAA/B,mCAA+B;YAA/B,gCAA+B;GAAK;EAErE;IAAkC,6CAAoC;QAApC,qCAAoC;YAApC,qCAAoC;GAAK;EAC3E;IAAkC,2CAAkC;QAAlC,mCAAkC;YAAlC,mCAAkC;GAAK;EACzE;IAAkC,yCAAgC;QAAhC,sCAAgC;YAAhC,iCAAgC;GAAK;EACvE;IAAkC,gDAAuC;QAAvC,uCAAuC;YAAvC,wCAAuC;GAAK;EAC9E;IAAkC,+CAAsC;QAAtC,0CAAsC;YAAtC,uCAAsC;GAAK;EAC7E;IAAkC,0CAAiC;QAAjC,uCAAiC;YAAjC,kCAAiC;GAAK;EAExE;IAAgC,oCAA2B;QAA3B,qCAA2B;gBAA3B,oCAA2B;YAA3B,4BAA2B;GAAK;EAChE;IAAgC,0CAAiC;QAAjC,sCAAiC;YAAjC,kCAAiC;GAAK;EACtE;IAAgC,wCAA+B;QAA/B,oCAA+B;YAA/B,gCAA+B;GAAK;EACpE;IAAgC,sCAA6B;QAA7B,uCAA6B;gBAA7B,sCAA6B;YAA7B,8BAA6B;GAAK;EAClE;IAAgC,wCAA+B;QAA/B,yCAA+B;YAA/B,gCAA+B;GAAK;EACpE;IAAgC,uCAA8B;QAA9B,wCAA8B;gBAA9B,uCAA8B;YAA9B,+BAA8B;GAAK;CN20CtE;;AGh0CG;EGhDA;IAAwB,6BAAS;IAAT,kBAAS;QAAT,mBAAS;YAAT,UAAS;GAAK;EACtC;IAAwB,6BAAQ;IAAR,iBAAQ;QAAR,kBAAQ;YAAR,SAAQ;GAAK;EACrC;IAAwB,6BAAQ;IAAR,iBAAQ;QAAR,kBAAQ;YAAR,SAAQ;GAAK;EAErC;IAAgC,0CAA8B;IAA9B,yCAA8B;IAA9B,uCAA8B;QAA9B,mCAA8B;YAA9B,+BAA8B;GAAK;EACnE;IAAgC,wCAAiC;IAAjC,yCAAiC;IAAjC,0CAAiC;QAAjC,sCAAiC;YAAjC,kCAAiC;GAAK;EACtE;IAAgC,0CAAsC;IAAtC,0CAAsC;IAAtC,+CAAsC;QAAtC,2CAAsC;YAAtC,uCAAsC;GAAK;EAC3E;IAAgC,wCAAyC;IAAzC,0CAAyC;IAAzC,kDAAyC;QAAzC,8CAAyC;YAAzC,0CAAyC;GAAK;EAE9E;IAA8B,mCAA0B;QAA1B,+BAA0B;YAA1B,2BAA0B;GAAK;EAC7D;IAA8B,qCAA4B;QAA5B,iCAA4B;YAA5B,6BAA4B;GAAK;EAC/D;IAA8B,2CAAkC;QAAlC,uCAAkC;YAAlC,mCAAkC;GAAK;EAErE;IAAoC,mCAAsC;IAAtC,+CAAsC;QAAtC,gCAAsC;YAAtC,uCAAsC;GAAK;EAC/E;IAAoC,iCAAoC;IAApC,6CAAoC;QAApC,8BAAoC;YAApC,qCAAoC;GAAK;EAC7E;IAAoC,oCAAkC;IAAlC,2CAAkC;QAAlC,iCAAkC;YAAlC,mCAAkC;GAAK;EAC3E;IAAoC,qCAAyC;IAAzC,kDAAyC;QAAzC,kCAAyC;YAAzC,0CAAyC;GAAK;EAClF;IAAoC,iDAAwC;QAAxC,qCAAwC;YAAxC,yCAAwC;GAAK;EAEjF;IAAiC,oCAAkC;IAAlC,2CAAkC;QAAlC,iCAAkC;YAAlC,mCAAkC;GAAK;EACxE;IAAiC,kCAAgC;IAAhC,yCAAgC;QAAhC,+BAAgC;YAAhC,iCAAgC;GAAK;EACtE;IAAiC,qCAA8B;IAA9B,uCAA8B;QAA9B,kCAA8B;YAA9B,+BAA8B;GAAK;EACpE;IAAiC,uCAAgC;IAAhC,yCAAgC;QAAhC,oCAAgC;YAAhC,iCAAgC;GAAK;EACtE;IAAiC,sCAA+B;IAA/B,wCAA+B;QAA/B,mCAA+B;YAA/B,gCAA+B;GAAK;EAErE;IAAkC,6CAAoC;QAApC,qCAAoC;YAApC,qCAAoC;GAAK;EAC3E;IAAkC,2CAAkC;QAAlC,mCAAkC;YAAlC,mCAAkC;GAAK;EACzE;IAAkC,yCAAgC;QAAhC,sCAAgC;YAAhC,iCAAgC;GAAK;EACvE;IAAkC,gDAAuC;QAAvC,uCAAuC;YAAvC,wCAAuC;GAAK;EAC9E;IAAkC,+CAAsC;QAAtC,0CAAsC;YAAtC,uCAAsC;GAAK;EAC7E;IAAkC,0CAAiC;QAAjC,uCAAiC;YAAjC,kCAAiC;GAAK;EAExE;IAAgC,oCAA2B;QAA3B,qCAA2B;gBAA3B,oCAA2B;YAA3B,4BAA2B;GAAK;EAChE;IAAgC,0CAAiC;QAAjC,sCAAiC;YAAjC,kCAAiC;GAAK;EACtE;IAAgC,wCAA+B;QAA/B,oCAA+B;YAA/B,gCAA+B;GAAK;EACpE;IAAgC,sCAA6B;QAA7B,uCAA6B;gBAA7B,sCAA6B;YAA7B,8BAA6B;GAAK;EAClE;IAAgC,wCAA+B;QAA/B,yCAA+B;YAA/B,gCAA+B;GAAK;EACpE;IAAgC,uCAA8B;QAA9B,wCAA8B;gBAA9B,uCAA8B;YAA9B,+BAA8B;GAAK;CN86CtE;;AGn6CG;EGhDA;IAAwB,6BAAS;IAAT,kBAAS;QAAT,mBAAS;YAAT,UAAS;GAAK;EACtC;IAAwB,6BAAQ;IAAR,iBAAQ;QAAR,kBAAQ;YAAR,SAAQ;GAAK;EACrC;IAAwB,6BAAQ;IAAR,iBAAQ;QAAR,kBAAQ;YAAR,SAAQ;GAAK;EAErC;IAAgC,0CAA8B;IAA9B,yCAA8B;IAA9B,uCAA8B;QAA9B,mCAA8B;YAA9B,+BAA8B;GAAK;EACnE;IAAgC,wCAAiC;IAAjC,yCAAiC;IAAjC,0CAAiC;QAAjC,sCAAiC;YAAjC,kCAAiC;GAAK;EACtE;IAAgC,0CAAsC;IAAtC,0CAAsC;IAAtC,+CAAsC;QAAtC,2CAAsC;YAAtC,uCAAsC;GAAK;EAC3E;IAAgC,wCAAyC;IAAzC,0CAAyC;IAAzC,kDAAyC;QAAzC,8CAAyC;YAAzC,0CAAyC;GAAK;EAE9E;IAA8B,mCAA0B;QAA1B,+BAA0B;YAA1B,2BAA0B;GAAK;EAC7D;IAA8B,qCAA4B;QAA5B,iCAA4B;YAA5B,6BAA4B;GAAK;EAC/D;IAA8B,2CAAkC;QAAlC,uCAAkC;YAAlC,mCAAkC;GAAK;EAErE;IAAoC,mCAAsC;IAAtC,+CAAsC;QAAtC,gCAAsC;YAAtC,uCAAsC;GAAK;EAC/E;IAAoC,iCAAoC;IAApC,6CAAoC;QAApC,8BAAoC;YAApC,qCAAoC;GAAK;EAC7E;IAAoC,oCAAkC;IAAlC,2CAAkC;QAAlC,iCAAkC;YAAlC,mCAAkC;GAAK;EAC3E;IAAoC,qCAAyC;IAAzC,kDAAyC;QAAzC,kCAAyC;YAAzC,0CAAyC;GAAK;EAClF;IAAoC,iDAAwC;QAAxC,qCAAwC;YAAxC,yCAAwC;GAAK;EAEjF;IAAiC,oCAAkC;IAAlC,2CAAkC;QAAlC,iCAAkC;YAAlC,mCAAkC;GAAK;EACxE;IAAiC,kCAAgC;IAAhC,yCAAgC;QAAhC,+BAAgC;YAAhC,iCAAgC;GAAK;EACtE;IAAiC,qCAA8B;IAA9B,uCAA8B;QAA9B,kCAA8B;YAA9B,+BAA8B;GAAK;EACpE;IAAiC,uCAAgC;IAAhC,yCAAgC;QAAhC,oCAAgC;YAAhC,iCAAgC;GAAK;EACtE;IAAiC,sCAA+B;IAA/B,wCAA+B;QAA/B,mCAA+B;YAA/B,gCAA+B;GAAK;EAErE;IAAkC,6CAAoC;QAApC,qCAAoC;YAApC,qCAAoC;GAAK;EAC3E;IAAkC,2CAAkC;QAAlC,mCAAkC;YAAlC,mCAAkC;GAAK;EACzE;IAAkC,yCAAgC;QAAhC,sCAAgC;YAAhC,iCAAgC;GAAK;EACvE;IAAkC,gDAAuC;QAAvC,uCAAuC;YAAvC,wCAAuC;GAAK;EAC9E;IAAkC,+CAAsC;QAAtC,0CAAsC;YAAtC,uCAAsC;GAAK;EAC7E;IAAkC,0CAAiC;QAAjC,uCAAiC;YAAjC,kCAAiC;GAAK;EAExE;IAAgC,oCAA2B;QAA3B,qCAA2B;gBAA3B,oCAA2B;YAA3B,4BAA2B;GAAK;EAChE;IAAgC,0CAAiC;QAAjC,sCAAiC;YAAjC,kCAAiC;GAAK;EACtE;IAAgC,wCAA+B;QAA/B,oCAA+B;YAA/B,gCAA+B;GAAK;EACpE;IAAgC,sCAA6B;QAA7B,uCAA6B;gBAA7B,sCAA6B;YAA7B,8BAA6B;GAAK;EAClE;IAAgC,wCAA+B;QAA/B,yCAA+B;YAA/B,gCAA+B;GAAK;EACpE;IAAgC,uCAA8B;QAA9B,wCAA8B;gBAA9B,uCAA8B;YAA9B,+BAA8B;GAAK;CNihDtE","file":"bootstrap-grid.css","sourcesContent":[null,"@-ms-viewport {\n width: device-width;\n}\n\nhtml {\n box-sizing: border-box;\n -ms-overflow-style: scrollbar;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: inherit;\n}\n\n.container {\n margin-right: auto;\n margin-left: auto;\n padding-right: 15px;\n padding-left: 15px;\n}\n\n@media (min-width: 576px) {\n .container {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n@media (min-width: 992px) {\n .container {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n@media (min-width: 1200px) {\n .container {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n@media (min-width: 576px) {\n .container {\n width: 540px;\n max-width: 100%;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n width: 720px;\n max-width: 100%;\n }\n}\n\n@media (min-width: 992px) {\n .container {\n width: 960px;\n max-width: 100%;\n }\n}\n\n@media (min-width: 1200px) {\n .container {\n width: 1140px;\n max-width: 100%;\n }\n}\n\n.container-fluid {\n width: 100%;\n margin-right: auto;\n margin-left: auto;\n padding-right: 15px;\n padding-left: 15px;\n}\n\n@media (min-width: 576px) {\n .container-fluid {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n@media (min-width: 768px) {\n .container-fluid {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n@media (min-width: 992px) {\n .container-fluid {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n@media (min-width: 1200px) {\n .container-fluid {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n.row {\n display: flex;\n flex-wrap: wrap;\n margin-right: -15px;\n margin-left: -15px;\n}\n\n@media (min-width: 576px) {\n .row {\n margin-right: -15px;\n margin-left: -15px;\n }\n}\n\n@media (min-width: 768px) {\n .row {\n margin-right: -15px;\n margin-left: -15px;\n }\n}\n\n@media (min-width: 992px) {\n .row {\n margin-right: -15px;\n margin-left: -15px;\n }\n}\n\n@media (min-width: 1200px) {\n .row {\n margin-right: -15px;\n margin-left: -15px;\n }\n}\n\n.no-gutters {\n margin-right: 0;\n margin-left: 0;\n}\n\n.no-gutters > .col,\n.no-gutters > [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n}\n\n.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n.col-xl-auto {\n position: relative;\n width: 100%;\n min-height: 1px;\n padding-right: 15px;\n padding-left: 15px;\n}\n\n@media (min-width: 576px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n@media (min-width: 768px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n@media (min-width: 992px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n@media (min-width: 1200px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n.col {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n}\n\n.col-auto {\n flex: 0 0 auto;\n width: auto;\n}\n\n.col-1 {\n width: 8.333333%;\n}\n\n.col-2 {\n width: 16.666667%;\n}\n\n.col-3 {\n width: 25%;\n}\n\n.col-4 {\n width: 33.333333%;\n}\n\n.col-5 {\n width: 41.666667%;\n}\n\n.col-6 {\n width: 50%;\n}\n\n.col-7 {\n width: 58.333333%;\n}\n\n.col-8 {\n width: 66.666667%;\n}\n\n.col-9 {\n width: 75%;\n}\n\n.col-10 {\n width: 83.333333%;\n}\n\n.col-11 {\n width: 91.666667%;\n}\n\n.col-12 {\n width: 100%;\n}\n\n.pull-0 {\n right: auto;\n}\n\n.pull-1 {\n right: 8.333333%;\n}\n\n.pull-2 {\n right: 16.666667%;\n}\n\n.pull-3 {\n right: 25%;\n}\n\n.pull-4 {\n right: 33.333333%;\n}\n\n.pull-5 {\n right: 41.666667%;\n}\n\n.pull-6 {\n right: 50%;\n}\n\n.pull-7 {\n right: 58.333333%;\n}\n\n.pull-8 {\n right: 66.666667%;\n}\n\n.pull-9 {\n right: 75%;\n}\n\n.pull-10 {\n right: 83.333333%;\n}\n\n.pull-11 {\n right: 91.666667%;\n}\n\n.pull-12 {\n right: 100%;\n}\n\n.push-0 {\n left: auto;\n}\n\n.push-1 {\n left: 8.333333%;\n}\n\n.push-2 {\n left: 16.666667%;\n}\n\n.push-3 {\n left: 25%;\n}\n\n.push-4 {\n left: 33.333333%;\n}\n\n.push-5 {\n left: 41.666667%;\n}\n\n.push-6 {\n left: 50%;\n}\n\n.push-7 {\n left: 58.333333%;\n}\n\n.push-8 {\n left: 66.666667%;\n}\n\n.push-9 {\n left: 75%;\n}\n\n.push-10 {\n left: 83.333333%;\n}\n\n.push-11 {\n left: 91.666667%;\n}\n\n.push-12 {\n left: 100%;\n}\n\n.offset-1 {\n margin-left: 8.333333%;\n}\n\n.offset-2 {\n margin-left: 16.666667%;\n}\n\n.offset-3 {\n margin-left: 25%;\n}\n\n.offset-4 {\n margin-left: 33.333333%;\n}\n\n.offset-5 {\n margin-left: 41.666667%;\n}\n\n.offset-6 {\n margin-left: 50%;\n}\n\n.offset-7 {\n margin-left: 58.333333%;\n}\n\n.offset-8 {\n margin-left: 66.666667%;\n}\n\n.offset-9 {\n margin-left: 75%;\n}\n\n.offset-10 {\n margin-left: 83.333333%;\n}\n\n.offset-11 {\n margin-left: 91.666667%;\n}\n\n@media (min-width: 576px) {\n .col-sm {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-sm-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-sm-1 {\n width: 8.333333%;\n }\n .col-sm-2 {\n width: 16.666667%;\n }\n .col-sm-3 {\n width: 25%;\n }\n .col-sm-4 {\n width: 33.333333%;\n }\n .col-sm-5 {\n width: 41.666667%;\n }\n .col-sm-6 {\n width: 50%;\n }\n .col-sm-7 {\n width: 58.333333%;\n }\n .col-sm-8 {\n width: 66.666667%;\n }\n .col-sm-9 {\n width: 75%;\n }\n .col-sm-10 {\n width: 83.333333%;\n }\n .col-sm-11 {\n width: 91.666667%;\n }\n .col-sm-12 {\n width: 100%;\n }\n .pull-sm-0 {\n right: auto;\n }\n .pull-sm-1 {\n right: 8.333333%;\n }\n .pull-sm-2 {\n right: 16.666667%;\n }\n .pull-sm-3 {\n right: 25%;\n }\n .pull-sm-4 {\n right: 33.333333%;\n }\n .pull-sm-5 {\n right: 41.666667%;\n }\n .pull-sm-6 {\n right: 50%;\n }\n .pull-sm-7 {\n right: 58.333333%;\n }\n .pull-sm-8 {\n right: 66.666667%;\n }\n .pull-sm-9 {\n right: 75%;\n }\n .pull-sm-10 {\n right: 83.333333%;\n }\n .pull-sm-11 {\n right: 91.666667%;\n }\n .pull-sm-12 {\n right: 100%;\n }\n .push-sm-0 {\n left: auto;\n }\n .push-sm-1 {\n left: 8.333333%;\n }\n .push-sm-2 {\n left: 16.666667%;\n }\n .push-sm-3 {\n left: 25%;\n }\n .push-sm-4 {\n left: 33.333333%;\n }\n .push-sm-5 {\n left: 41.666667%;\n }\n .push-sm-6 {\n left: 50%;\n }\n .push-sm-7 {\n left: 58.333333%;\n }\n .push-sm-8 {\n left: 66.666667%;\n }\n .push-sm-9 {\n left: 75%;\n }\n .push-sm-10 {\n left: 83.333333%;\n }\n .push-sm-11 {\n left: 91.666667%;\n }\n .push-sm-12 {\n left: 100%;\n }\n .offset-sm-0 {\n margin-left: 0%;\n }\n .offset-sm-1 {\n margin-left: 8.333333%;\n }\n .offset-sm-2 {\n margin-left: 16.666667%;\n }\n .offset-sm-3 {\n margin-left: 25%;\n }\n .offset-sm-4 {\n margin-left: 33.333333%;\n }\n .offset-sm-5 {\n margin-left: 41.666667%;\n }\n .offset-sm-6 {\n margin-left: 50%;\n }\n .offset-sm-7 {\n margin-left: 58.333333%;\n }\n .offset-sm-8 {\n margin-left: 66.666667%;\n }\n .offset-sm-9 {\n margin-left: 75%;\n }\n .offset-sm-10 {\n margin-left: 83.333333%;\n }\n .offset-sm-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 768px) {\n .col-md {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-md-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-md-1 {\n width: 8.333333%;\n }\n .col-md-2 {\n width: 16.666667%;\n }\n .col-md-3 {\n width: 25%;\n }\n .col-md-4 {\n width: 33.333333%;\n }\n .col-md-5 {\n width: 41.666667%;\n }\n .col-md-6 {\n width: 50%;\n }\n .col-md-7 {\n width: 58.333333%;\n }\n .col-md-8 {\n width: 66.666667%;\n }\n .col-md-9 {\n width: 75%;\n }\n .col-md-10 {\n width: 83.333333%;\n }\n .col-md-11 {\n width: 91.666667%;\n }\n .col-md-12 {\n width: 100%;\n }\n .pull-md-0 {\n right: auto;\n }\n .pull-md-1 {\n right: 8.333333%;\n }\n .pull-md-2 {\n right: 16.666667%;\n }\n .pull-md-3 {\n right: 25%;\n }\n .pull-md-4 {\n right: 33.333333%;\n }\n .pull-md-5 {\n right: 41.666667%;\n }\n .pull-md-6 {\n right: 50%;\n }\n .pull-md-7 {\n right: 58.333333%;\n }\n .pull-md-8 {\n right: 66.666667%;\n }\n .pull-md-9 {\n right: 75%;\n }\n .pull-md-10 {\n right: 83.333333%;\n }\n .pull-md-11 {\n right: 91.666667%;\n }\n .pull-md-12 {\n right: 100%;\n }\n .push-md-0 {\n left: auto;\n }\n .push-md-1 {\n left: 8.333333%;\n }\n .push-md-2 {\n left: 16.666667%;\n }\n .push-md-3 {\n left: 25%;\n }\n .push-md-4 {\n left: 33.333333%;\n }\n .push-md-5 {\n left: 41.666667%;\n }\n .push-md-6 {\n left: 50%;\n }\n .push-md-7 {\n left: 58.333333%;\n }\n .push-md-8 {\n left: 66.666667%;\n }\n .push-md-9 {\n left: 75%;\n }\n .push-md-10 {\n left: 83.333333%;\n }\n .push-md-11 {\n left: 91.666667%;\n }\n .push-md-12 {\n left: 100%;\n }\n .offset-md-0 {\n margin-left: 0%;\n }\n .offset-md-1 {\n margin-left: 8.333333%;\n }\n .offset-md-2 {\n margin-left: 16.666667%;\n }\n .offset-md-3 {\n margin-left: 25%;\n }\n .offset-md-4 {\n margin-left: 33.333333%;\n }\n .offset-md-5 {\n margin-left: 41.666667%;\n }\n .offset-md-6 {\n margin-left: 50%;\n }\n .offset-md-7 {\n margin-left: 58.333333%;\n }\n .offset-md-8 {\n margin-left: 66.666667%;\n }\n .offset-md-9 {\n margin-left: 75%;\n }\n .offset-md-10 {\n margin-left: 83.333333%;\n }\n .offset-md-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 992px) {\n .col-lg {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-lg-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-lg-1 {\n width: 8.333333%;\n }\n .col-lg-2 {\n width: 16.666667%;\n }\n .col-lg-3 {\n width: 25%;\n }\n .col-lg-4 {\n width: 33.333333%;\n }\n .col-lg-5 {\n width: 41.666667%;\n }\n .col-lg-6 {\n width: 50%;\n }\n .col-lg-7 {\n width: 58.333333%;\n }\n .col-lg-8 {\n width: 66.666667%;\n }\n .col-lg-9 {\n width: 75%;\n }\n .col-lg-10 {\n width: 83.333333%;\n }\n .col-lg-11 {\n width: 91.666667%;\n }\n .col-lg-12 {\n width: 100%;\n }\n .pull-lg-0 {\n right: auto;\n }\n .pull-lg-1 {\n right: 8.333333%;\n }\n .pull-lg-2 {\n right: 16.666667%;\n }\n .pull-lg-3 {\n right: 25%;\n }\n .pull-lg-4 {\n right: 33.333333%;\n }\n .pull-lg-5 {\n right: 41.666667%;\n }\n .pull-lg-6 {\n right: 50%;\n }\n .pull-lg-7 {\n right: 58.333333%;\n }\n .pull-lg-8 {\n right: 66.666667%;\n }\n .pull-lg-9 {\n right: 75%;\n }\n .pull-lg-10 {\n right: 83.333333%;\n }\n .pull-lg-11 {\n right: 91.666667%;\n }\n .pull-lg-12 {\n right: 100%;\n }\n .push-lg-0 {\n left: auto;\n }\n .push-lg-1 {\n left: 8.333333%;\n }\n .push-lg-2 {\n left: 16.666667%;\n }\n .push-lg-3 {\n left: 25%;\n }\n .push-lg-4 {\n left: 33.333333%;\n }\n .push-lg-5 {\n left: 41.666667%;\n }\n .push-lg-6 {\n left: 50%;\n }\n .push-lg-7 {\n left: 58.333333%;\n }\n .push-lg-8 {\n left: 66.666667%;\n }\n .push-lg-9 {\n left: 75%;\n }\n .push-lg-10 {\n left: 83.333333%;\n }\n .push-lg-11 {\n left: 91.666667%;\n }\n .push-lg-12 {\n left: 100%;\n }\n .offset-lg-0 {\n margin-left: 0%;\n }\n .offset-lg-1 {\n margin-left: 8.333333%;\n }\n .offset-lg-2 {\n margin-left: 16.666667%;\n }\n .offset-lg-3 {\n margin-left: 25%;\n }\n .offset-lg-4 {\n margin-left: 33.333333%;\n }\n .offset-lg-5 {\n margin-left: 41.666667%;\n }\n .offset-lg-6 {\n margin-left: 50%;\n }\n .offset-lg-7 {\n margin-left: 58.333333%;\n }\n .offset-lg-8 {\n margin-left: 66.666667%;\n }\n .offset-lg-9 {\n margin-left: 75%;\n }\n .offset-lg-10 {\n margin-left: 83.333333%;\n }\n .offset-lg-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 1200px) {\n .col-xl {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-xl-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-xl-1 {\n width: 8.333333%;\n }\n .col-xl-2 {\n width: 16.666667%;\n }\n .col-xl-3 {\n width: 25%;\n }\n .col-xl-4 {\n width: 33.333333%;\n }\n .col-xl-5 {\n width: 41.666667%;\n }\n .col-xl-6 {\n width: 50%;\n }\n .col-xl-7 {\n width: 58.333333%;\n }\n .col-xl-8 {\n width: 66.666667%;\n }\n .col-xl-9 {\n width: 75%;\n }\n .col-xl-10 {\n width: 83.333333%;\n }\n .col-xl-11 {\n width: 91.666667%;\n }\n .col-xl-12 {\n width: 100%;\n }\n .pull-xl-0 {\n right: auto;\n }\n .pull-xl-1 {\n right: 8.333333%;\n }\n .pull-xl-2 {\n right: 16.666667%;\n }\n .pull-xl-3 {\n right: 25%;\n }\n .pull-xl-4 {\n right: 33.333333%;\n }\n .pull-xl-5 {\n right: 41.666667%;\n }\n .pull-xl-6 {\n right: 50%;\n }\n .pull-xl-7 {\n right: 58.333333%;\n }\n .pull-xl-8 {\n right: 66.666667%;\n }\n .pull-xl-9 {\n right: 75%;\n }\n .pull-xl-10 {\n right: 83.333333%;\n }\n .pull-xl-11 {\n right: 91.666667%;\n }\n .pull-xl-12 {\n right: 100%;\n }\n .push-xl-0 {\n left: auto;\n }\n .push-xl-1 {\n left: 8.333333%;\n }\n .push-xl-2 {\n left: 16.666667%;\n }\n .push-xl-3 {\n left: 25%;\n }\n .push-xl-4 {\n left: 33.333333%;\n }\n .push-xl-5 {\n left: 41.666667%;\n }\n .push-xl-6 {\n left: 50%;\n }\n .push-xl-7 {\n left: 58.333333%;\n }\n .push-xl-8 {\n left: 66.666667%;\n }\n .push-xl-9 {\n left: 75%;\n }\n .push-xl-10 {\n left: 83.333333%;\n }\n .push-xl-11 {\n left: 91.666667%;\n }\n .push-xl-12 {\n left: 100%;\n }\n .offset-xl-0 {\n margin-left: 0%;\n }\n .offset-xl-1 {\n margin-left: 8.333333%;\n }\n .offset-xl-2 {\n margin-left: 16.666667%;\n }\n .offset-xl-3 {\n margin-left: 25%;\n }\n .offset-xl-4 {\n margin-left: 33.333333%;\n }\n .offset-xl-5 {\n margin-left: 41.666667%;\n }\n .offset-xl-6 {\n margin-left: 50%;\n }\n .offset-xl-7 {\n margin-left: 58.333333%;\n }\n .offset-xl-8 {\n margin-left: 66.666667%;\n }\n .offset-xl-9 {\n margin-left: 75%;\n }\n .offset-xl-10 {\n margin-left: 83.333333%;\n }\n .offset-xl-11 {\n margin-left: 91.666667%;\n }\n}\n\n.order-first {\n order: -1;\n}\n\n.order-last {\n order: 1;\n}\n\n.order-0 {\n order: 0;\n}\n\n.flex-row {\n flex-direction: row !important;\n}\n\n.flex-column {\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n flex-direction: column-reverse !important;\n}\n\n.flex-wrap {\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n}\n\n.justify-content-start {\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n justify-content: center !important;\n}\n\n.justify-content-between {\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n justify-content: space-around !important;\n}\n\n.align-items-start {\n align-items: flex-start !important;\n}\n\n.align-items-end {\n align-items: flex-end !important;\n}\n\n.align-items-center {\n align-items: center !important;\n}\n\n.align-items-baseline {\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n align-items: stretch !important;\n}\n\n.align-content-start {\n align-content: flex-start !important;\n}\n\n.align-content-end {\n align-content: flex-end !important;\n}\n\n.align-content-center {\n align-content: center !important;\n}\n\n.align-content-between {\n align-content: space-between !important;\n}\n\n.align-content-around {\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n align-content: stretch !important;\n}\n\n.align-self-auto {\n align-self: auto !important;\n}\n\n.align-self-start {\n align-self: flex-start !important;\n}\n\n.align-self-end {\n align-self: flex-end !important;\n}\n\n.align-self-center {\n align-self: center !important;\n}\n\n.align-self-baseline {\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n align-self: stretch !important;\n}\n\n@media (min-width: 576px) {\n .order-sm-first {\n order: -1;\n }\n .order-sm-last {\n order: 1;\n }\n .order-sm-0 {\n order: 0;\n }\n .flex-sm-row {\n flex-direction: row !important;\n }\n .flex-sm-column {\n flex-direction: column !important;\n }\n .flex-sm-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-sm-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-sm-wrap {\n flex-wrap: wrap !important;\n }\n .flex-sm-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-sm-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-sm-start {\n justify-content: flex-start !important;\n }\n .justify-content-sm-end {\n justify-content: flex-end !important;\n }\n .justify-content-sm-center {\n justify-content: center !important;\n }\n .justify-content-sm-between {\n justify-content: space-between !important;\n }\n .justify-content-sm-around {\n justify-content: space-around !important;\n }\n .align-items-sm-start {\n align-items: flex-start !important;\n }\n .align-items-sm-end {\n align-items: flex-end !important;\n }\n .align-items-sm-center {\n align-items: center !important;\n }\n .align-items-sm-baseline {\n align-items: baseline !important;\n }\n .align-items-sm-stretch {\n align-items: stretch !important;\n }\n .align-content-sm-start {\n align-content: flex-start !important;\n }\n .align-content-sm-end {\n align-content: flex-end !important;\n }\n .align-content-sm-center {\n align-content: center !important;\n }\n .align-content-sm-between {\n align-content: space-between !important;\n }\n .align-content-sm-around {\n align-content: space-around !important;\n }\n .align-content-sm-stretch {\n align-content: stretch !important;\n }\n .align-self-sm-auto {\n align-self: auto !important;\n }\n .align-self-sm-start {\n align-self: flex-start !important;\n }\n .align-self-sm-end {\n align-self: flex-end !important;\n }\n .align-self-sm-center {\n align-self: center !important;\n }\n .align-self-sm-baseline {\n align-self: baseline !important;\n }\n .align-self-sm-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 768px) {\n .order-md-first {\n order: -1;\n }\n .order-md-last {\n order: 1;\n }\n .order-md-0 {\n order: 0;\n }\n .flex-md-row {\n flex-direction: row !important;\n }\n .flex-md-column {\n flex-direction: column !important;\n }\n .flex-md-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-md-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-md-wrap {\n flex-wrap: wrap !important;\n }\n .flex-md-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-md-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-md-start {\n justify-content: flex-start !important;\n }\n .justify-content-md-end {\n justify-content: flex-end !important;\n }\n .justify-content-md-center {\n justify-content: center !important;\n }\n .justify-content-md-between {\n justify-content: space-between !important;\n }\n .justify-content-md-around {\n justify-content: space-around !important;\n }\n .align-items-md-start {\n align-items: flex-start !important;\n }\n .align-items-md-end {\n align-items: flex-end !important;\n }\n .align-items-md-center {\n align-items: center !important;\n }\n .align-items-md-baseline {\n align-items: baseline !important;\n }\n .align-items-md-stretch {\n align-items: stretch !important;\n }\n .align-content-md-start {\n align-content: flex-start !important;\n }\n .align-content-md-end {\n align-content: flex-end !important;\n }\n .align-content-md-center {\n align-content: center !important;\n }\n .align-content-md-between {\n align-content: space-between !important;\n }\n .align-content-md-around {\n align-content: space-around !important;\n }\n .align-content-md-stretch {\n align-content: stretch !important;\n }\n .align-self-md-auto {\n align-self: auto !important;\n }\n .align-self-md-start {\n align-self: flex-start !important;\n }\n .align-self-md-end {\n align-self: flex-end !important;\n }\n .align-self-md-center {\n align-self: center !important;\n }\n .align-self-md-baseline {\n align-self: baseline !important;\n }\n .align-self-md-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 992px) {\n .order-lg-first {\n order: -1;\n }\n .order-lg-last {\n order: 1;\n }\n .order-lg-0 {\n order: 0;\n }\n .flex-lg-row {\n flex-direction: row !important;\n }\n .flex-lg-column {\n flex-direction: column !important;\n }\n .flex-lg-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-lg-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-lg-wrap {\n flex-wrap: wrap !important;\n }\n .flex-lg-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-lg-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-lg-start {\n justify-content: flex-start !important;\n }\n .justify-content-lg-end {\n justify-content: flex-end !important;\n }\n .justify-content-lg-center {\n justify-content: center !important;\n }\n .justify-content-lg-between {\n justify-content: space-between !important;\n }\n .justify-content-lg-around {\n justify-content: space-around !important;\n }\n .align-items-lg-start {\n align-items: flex-start !important;\n }\n .align-items-lg-end {\n align-items: flex-end !important;\n }\n .align-items-lg-center {\n align-items: center !important;\n }\n .align-items-lg-baseline {\n align-items: baseline !important;\n }\n .align-items-lg-stretch {\n align-items: stretch !important;\n }\n .align-content-lg-start {\n align-content: flex-start !important;\n }\n .align-content-lg-end {\n align-content: flex-end !important;\n }\n .align-content-lg-center {\n align-content: center !important;\n }\n .align-content-lg-between {\n align-content: space-between !important;\n }\n .align-content-lg-around {\n align-content: space-around !important;\n }\n .align-content-lg-stretch {\n align-content: stretch !important;\n }\n .align-self-lg-auto {\n align-self: auto !important;\n }\n .align-self-lg-start {\n align-self: flex-start !important;\n }\n .align-self-lg-end {\n align-self: flex-end !important;\n }\n .align-self-lg-center {\n align-self: center !important;\n }\n .align-self-lg-baseline {\n align-self: baseline !important;\n }\n .align-self-lg-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 1200px) {\n .order-xl-first {\n order: -1;\n }\n .order-xl-last {\n order: 1;\n }\n .order-xl-0 {\n order: 0;\n }\n .flex-xl-row {\n flex-direction: row !important;\n }\n .flex-xl-column {\n flex-direction: column !important;\n }\n .flex-xl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-xl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xl-center {\n justify-content: center !important;\n }\n .justify-content-xl-between {\n justify-content: space-between !important;\n }\n .justify-content-xl-around {\n justify-content: space-around !important;\n }\n .align-items-xl-start {\n align-items: flex-start !important;\n }\n .align-items-xl-end {\n align-items: flex-end !important;\n }\n .align-items-xl-center {\n align-items: center !important;\n }\n .align-items-xl-baseline {\n align-items: baseline !important;\n }\n .align-items-xl-stretch {\n align-items: stretch !important;\n }\n .align-content-xl-start {\n align-content: flex-start !important;\n }\n .align-content-xl-end {\n align-content: flex-end !important;\n }\n .align-content-xl-center {\n align-content: center !important;\n }\n .align-content-xl-between {\n align-content: space-between !important;\n }\n .align-content-xl-around {\n align-content: space-around !important;\n }\n .align-content-xl-stretch {\n align-content: stretch !important;\n }\n .align-self-xl-auto {\n align-self: auto !important;\n }\n .align-self-xl-start {\n align-self: flex-start !important;\n }\n .align-self-xl-end {\n align-self: flex-end !important;\n }\n .align-self-xl-center {\n align-self: center !important;\n }\n .align-self-xl-baseline {\n align-self: baseline !important;\n }\n .align-self-xl-stretch {\n align-self: stretch !important;\n }\n}\n\n/*# sourceMappingURL=bootstrap-grid.css.map */",null,null,null,null,null,null]} \ No newline at end of file
diff --git a/library/bootstrap/css/bootstrap-grid.min.css b/library/bootstrap/css/bootstrap-grid.min.css
new file mode 100644
index 000000000..c225dffab
--- /dev/null
+++ b/library/bootstrap/css/bootstrap-grid.min.css
@@ -0,0 +1 @@
+@-ms-viewport{width:device-width}html{-webkit-box-sizing:border-box;box-sizing:border-box;-ms-overflow-style:scrollbar}*,::after,::before{-webkit-box-sizing:inherit;box-sizing:inherit}.container{margin-right:auto;margin-left:auto;padding-right:15px;padding-left:15px}@media (min-width:576px){.container{padding-right:15px;padding-left:15px}}@media (min-width:768px){.container{padding-right:15px;padding-left:15px}}@media (min-width:992px){.container{padding-right:15px;padding-left:15px}}@media (min-width:1200px){.container{padding-right:15px;padding-left:15px}}@media (min-width:576px){.container{width:540px;max-width:100%}}@media (min-width:768px){.container{width:720px;max-width:100%}}@media (min-width:992px){.container{width:960px;max-width:100%}}@media (min-width:1200px){.container{width:1140px;max-width:100%}}.container-fluid{width:100%;margin-right:auto;margin-left:auto;padding-right:15px;padding-left:15px}@media (min-width:576px){.container-fluid{padding-right:15px;padding-left:15px}}@media (min-width:768px){.container-fluid{padding-right:15px;padding-left:15px}}@media (min-width:992px){.container-fluid{padding-right:15px;padding-left:15px}}@media (min-width:1200px){.container-fluid{padding-right:15px;padding-left:15px}}.row{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}@media (min-width:576px){.row{margin-right:-15px;margin-left:-15px}}@media (min-width:768px){.row{margin-right:-15px;margin-left:-15px}}@media (min-width:992px){.row{margin-right:-15px;margin-left:-15px}}@media (min-width:1200px){.row{margin-right:-15px;margin-left:-15px}}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;min-height:1px;padding-right:15px;padding-left:15px}@media (min-width:576px){.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{padding-right:15px;padding-left:15px}}@media (min-width:768px){.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{padding-right:15px;padding-left:15px}}@media (min-width:992px){.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{padding-right:15px;padding-left:15px}}@media (min-width:1200px){.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{padding-right:15px;padding-left:15px}}.col{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.col-1{width:8.333333%}.col-2{width:16.666667%}.col-3{width:25%}.col-4{width:33.333333%}.col-5{width:41.666667%}.col-6{width:50%}.col-7{width:58.333333%}.col-8{width:66.666667%}.col-9{width:75%}.col-10{width:83.333333%}.col-11{width:91.666667%}.col-12{width:100%}.pull-0{right:auto}.pull-1{right:8.333333%}.pull-2{right:16.666667%}.pull-3{right:25%}.pull-4{right:33.333333%}.pull-5{right:41.666667%}.pull-6{right:50%}.pull-7{right:58.333333%}.pull-8{right:66.666667%}.pull-9{right:75%}.pull-10{right:83.333333%}.pull-11{right:91.666667%}.pull-12{right:100%}.push-0{left:auto}.push-1{left:8.333333%}.push-2{left:16.666667%}.push-3{left:25%}.push-4{left:33.333333%}.push-5{left:41.666667%}.push-6{left:50%}.push-7{left:58.333333%}.push-8{left:66.666667%}.push-9{left:75%}.push-10{left:83.333333%}.push-11{left:91.666667%}.push-12{left:100%}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.col-sm-1{width:8.333333%}.col-sm-2{width:16.666667%}.col-sm-3{width:25%}.col-sm-4{width:33.333333%}.col-sm-5{width:41.666667%}.col-sm-6{width:50%}.col-sm-7{width:58.333333%}.col-sm-8{width:66.666667%}.col-sm-9{width:75%}.col-sm-10{width:83.333333%}.col-sm-11{width:91.666667%}.col-sm-12{width:100%}.pull-sm-0{right:auto}.pull-sm-1{right:8.333333%}.pull-sm-2{right:16.666667%}.pull-sm-3{right:25%}.pull-sm-4{right:33.333333%}.pull-sm-5{right:41.666667%}.pull-sm-6{right:50%}.pull-sm-7{right:58.333333%}.pull-sm-8{right:66.666667%}.pull-sm-9{right:75%}.pull-sm-10{right:83.333333%}.pull-sm-11{right:91.666667%}.pull-sm-12{right:100%}.push-sm-0{left:auto}.push-sm-1{left:8.333333%}.push-sm-2{left:16.666667%}.push-sm-3{left:25%}.push-sm-4{left:33.333333%}.push-sm-5{left:41.666667%}.push-sm-6{left:50%}.push-sm-7{left:58.333333%}.push-sm-8{left:66.666667%}.push-sm-9{left:75%}.push-sm-10{left:83.333333%}.push-sm-11{left:91.666667%}.push-sm-12{left:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.col-md-1{width:8.333333%}.col-md-2{width:16.666667%}.col-md-3{width:25%}.col-md-4{width:33.333333%}.col-md-5{width:41.666667%}.col-md-6{width:50%}.col-md-7{width:58.333333%}.col-md-8{width:66.666667%}.col-md-9{width:75%}.col-md-10{width:83.333333%}.col-md-11{width:91.666667%}.col-md-12{width:100%}.pull-md-0{right:auto}.pull-md-1{right:8.333333%}.pull-md-2{right:16.666667%}.pull-md-3{right:25%}.pull-md-4{right:33.333333%}.pull-md-5{right:41.666667%}.pull-md-6{right:50%}.pull-md-7{right:58.333333%}.pull-md-8{right:66.666667%}.pull-md-9{right:75%}.pull-md-10{right:83.333333%}.pull-md-11{right:91.666667%}.pull-md-12{right:100%}.push-md-0{left:auto}.push-md-1{left:8.333333%}.push-md-2{left:16.666667%}.push-md-3{left:25%}.push-md-4{left:33.333333%}.push-md-5{left:41.666667%}.push-md-6{left:50%}.push-md-7{left:58.333333%}.push-md-8{left:66.666667%}.push-md-9{left:75%}.push-md-10{left:83.333333%}.push-md-11{left:91.666667%}.push-md-12{left:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.col-lg-1{width:8.333333%}.col-lg-2{width:16.666667%}.col-lg-3{width:25%}.col-lg-4{width:33.333333%}.col-lg-5{width:41.666667%}.col-lg-6{width:50%}.col-lg-7{width:58.333333%}.col-lg-8{width:66.666667%}.col-lg-9{width:75%}.col-lg-10{width:83.333333%}.col-lg-11{width:91.666667%}.col-lg-12{width:100%}.pull-lg-0{right:auto}.pull-lg-1{right:8.333333%}.pull-lg-2{right:16.666667%}.pull-lg-3{right:25%}.pull-lg-4{right:33.333333%}.pull-lg-5{right:41.666667%}.pull-lg-6{right:50%}.pull-lg-7{right:58.333333%}.pull-lg-8{right:66.666667%}.pull-lg-9{right:75%}.pull-lg-10{right:83.333333%}.pull-lg-11{right:91.666667%}.pull-lg-12{right:100%}.push-lg-0{left:auto}.push-lg-1{left:8.333333%}.push-lg-2{left:16.666667%}.push-lg-3{left:25%}.push-lg-4{left:33.333333%}.push-lg-5{left:41.666667%}.push-lg-6{left:50%}.push-lg-7{left:58.333333%}.push-lg-8{left:66.666667%}.push-lg-9{left:75%}.push-lg-10{left:83.333333%}.push-lg-11{left:91.666667%}.push-lg-12{left:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.col-xl-1{width:8.333333%}.col-xl-2{width:16.666667%}.col-xl-3{width:25%}.col-xl-4{width:33.333333%}.col-xl-5{width:41.666667%}.col-xl-6{width:50%}.col-xl-7{width:58.333333%}.col-xl-8{width:66.666667%}.col-xl-9{width:75%}.col-xl-10{width:83.333333%}.col-xl-11{width:91.666667%}.col-xl-12{width:100%}.pull-xl-0{right:auto}.pull-xl-1{right:8.333333%}.pull-xl-2{right:16.666667%}.pull-xl-3{right:25%}.pull-xl-4{right:33.333333%}.pull-xl-5{right:41.666667%}.pull-xl-6{right:50%}.pull-xl-7{right:58.333333%}.pull-xl-8{right:66.666667%}.pull-xl-9{right:75%}.pull-xl-10{right:83.333333%}.pull-xl-11{right:91.666667%}.pull-xl-12{right:100%}.push-xl-0{left:auto}.push-xl-1{left:8.333333%}.push-xl-2{left:16.666667%}.push-xl-3{left:25%}.push-xl-4{left:33.333333%}.push-xl-5{left:41.666667%}.push-xl-6{left:50%}.push-xl-7{left:58.333333%}.push-xl-8{left:66.666667%}.push-xl-9{left:75%}.push-xl-10{left:83.333333%}.push-xl-11{left:91.666667%}.push-xl-12{left:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.order-first{-webkit-box-ordinal-group:0;-webkit-order:-1;-ms-flex-order:-1;order:-1}.order-last{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.order-0{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}.flex-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-webkit-flex-direction:row!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-webkit-flex-direction:column!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:row-reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:column-reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-webkit-flex-wrap:wrap!important;-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-webkit-flex-wrap:nowrap!important;-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-webkit-flex-wrap:wrap-reverse!important;-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-start{-webkit-box-pack:start!important;-webkit-justify-content:flex-start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-webkit-box-pack:end!important;-webkit-justify-content:flex-end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-webkit-box-pack:center!important;-webkit-justify-content:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-webkit-box-pack:justify!important;-webkit-justify-content:space-between!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-webkit-justify-content:space-around!important;-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-webkit-box-align:start!important;-webkit-align-items:flex-start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-webkit-box-align:end!important;-webkit-align-items:flex-end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-webkit-box-align:center!important;-webkit-align-items:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-webkit-box-align:baseline!important;-webkit-align-items:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-webkit-box-align:stretch!important;-webkit-align-items:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-webkit-align-content:flex-start!important;-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-webkit-align-content:flex-end!important;-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-webkit-align-content:center!important;-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-webkit-align-content:space-between!important;-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-webkit-align-content:space-around!important;-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-webkit-align-content:stretch!important;-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-webkit-align-self:auto!important;-ms-flex-item-align:auto!important;-ms-grid-row-align:auto!important;align-self:auto!important}.align-self-start{-webkit-align-self:flex-start!important;-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-webkit-align-self:flex-end!important;-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-webkit-align-self:center!important;-ms-flex-item-align:center!important;-ms-grid-row-align:center!important;align-self:center!important}.align-self-baseline{-webkit-align-self:baseline!important;-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-webkit-align-self:stretch!important;-ms-flex-item-align:stretch!important;-ms-grid-row-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.order-sm-first{-webkit-box-ordinal-group:0;-webkit-order:-1;-ms-flex-order:-1;order:-1}.order-sm-last{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.order-sm-0{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}.flex-sm-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-webkit-flex-direction:row!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-webkit-flex-direction:column!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:row-reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:column-reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-webkit-flex-wrap:wrap!important;-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-webkit-flex-wrap:nowrap!important;-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-webkit-flex-wrap:wrap-reverse!important;-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-sm-start{-webkit-box-pack:start!important;-webkit-justify-content:flex-start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-webkit-box-pack:end!important;-webkit-justify-content:flex-end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-webkit-box-pack:center!important;-webkit-justify-content:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-webkit-box-pack:justify!important;-webkit-justify-content:space-between!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-webkit-justify-content:space-around!important;-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-webkit-box-align:start!important;-webkit-align-items:flex-start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-webkit-box-align:end!important;-webkit-align-items:flex-end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-webkit-box-align:center!important;-webkit-align-items:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-webkit-box-align:baseline!important;-webkit-align-items:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-webkit-box-align:stretch!important;-webkit-align-items:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-webkit-align-content:flex-start!important;-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-webkit-align-content:flex-end!important;-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-webkit-align-content:center!important;-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-webkit-align-content:space-between!important;-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-webkit-align-content:space-around!important;-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-webkit-align-content:stretch!important;-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-webkit-align-self:auto!important;-ms-flex-item-align:auto!important;-ms-grid-row-align:auto!important;align-self:auto!important}.align-self-sm-start{-webkit-align-self:flex-start!important;-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-webkit-align-self:flex-end!important;-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-webkit-align-self:center!important;-ms-flex-item-align:center!important;-ms-grid-row-align:center!important;align-self:center!important}.align-self-sm-baseline{-webkit-align-self:baseline!important;-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-webkit-align-self:stretch!important;-ms-flex-item-align:stretch!important;-ms-grid-row-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.order-md-first{-webkit-box-ordinal-group:0;-webkit-order:-1;-ms-flex-order:-1;order:-1}.order-md-last{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.order-md-0{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}.flex-md-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-webkit-flex-direction:row!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-webkit-flex-direction:column!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:row-reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:column-reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-webkit-flex-wrap:wrap!important;-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-webkit-flex-wrap:nowrap!important;-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-webkit-flex-wrap:wrap-reverse!important;-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-md-start{-webkit-box-pack:start!important;-webkit-justify-content:flex-start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-webkit-box-pack:end!important;-webkit-justify-content:flex-end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-webkit-box-pack:center!important;-webkit-justify-content:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-webkit-box-pack:justify!important;-webkit-justify-content:space-between!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-webkit-justify-content:space-around!important;-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-webkit-box-align:start!important;-webkit-align-items:flex-start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-webkit-box-align:end!important;-webkit-align-items:flex-end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-webkit-box-align:center!important;-webkit-align-items:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-webkit-box-align:baseline!important;-webkit-align-items:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-webkit-box-align:stretch!important;-webkit-align-items:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-webkit-align-content:flex-start!important;-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-webkit-align-content:flex-end!important;-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-webkit-align-content:center!important;-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-webkit-align-content:space-between!important;-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-webkit-align-content:space-around!important;-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-webkit-align-content:stretch!important;-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-webkit-align-self:auto!important;-ms-flex-item-align:auto!important;-ms-grid-row-align:auto!important;align-self:auto!important}.align-self-md-start{-webkit-align-self:flex-start!important;-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-webkit-align-self:flex-end!important;-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-webkit-align-self:center!important;-ms-flex-item-align:center!important;-ms-grid-row-align:center!important;align-self:center!important}.align-self-md-baseline{-webkit-align-self:baseline!important;-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-webkit-align-self:stretch!important;-ms-flex-item-align:stretch!important;-ms-grid-row-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.order-lg-first{-webkit-box-ordinal-group:0;-webkit-order:-1;-ms-flex-order:-1;order:-1}.order-lg-last{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.order-lg-0{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}.flex-lg-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-webkit-flex-direction:row!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-webkit-flex-direction:column!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:row-reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:column-reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-webkit-flex-wrap:wrap!important;-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-webkit-flex-wrap:nowrap!important;-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-webkit-flex-wrap:wrap-reverse!important;-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-lg-start{-webkit-box-pack:start!important;-webkit-justify-content:flex-start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-webkit-box-pack:end!important;-webkit-justify-content:flex-end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-webkit-box-pack:center!important;-webkit-justify-content:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-webkit-box-pack:justify!important;-webkit-justify-content:space-between!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-webkit-justify-content:space-around!important;-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-webkit-box-align:start!important;-webkit-align-items:flex-start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-webkit-box-align:end!important;-webkit-align-items:flex-end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-webkit-box-align:center!important;-webkit-align-items:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-webkit-box-align:baseline!important;-webkit-align-items:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-webkit-box-align:stretch!important;-webkit-align-items:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-webkit-align-content:flex-start!important;-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-webkit-align-content:flex-end!important;-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-webkit-align-content:center!important;-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-webkit-align-content:space-between!important;-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-webkit-align-content:space-around!important;-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-webkit-align-content:stretch!important;-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-webkit-align-self:auto!important;-ms-flex-item-align:auto!important;-ms-grid-row-align:auto!important;align-self:auto!important}.align-self-lg-start{-webkit-align-self:flex-start!important;-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-webkit-align-self:flex-end!important;-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-webkit-align-self:center!important;-ms-flex-item-align:center!important;-ms-grid-row-align:center!important;align-self:center!important}.align-self-lg-baseline{-webkit-align-self:baseline!important;-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-webkit-align-self:stretch!important;-ms-flex-item-align:stretch!important;-ms-grid-row-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.order-xl-first{-webkit-box-ordinal-group:0;-webkit-order:-1;-ms-flex-order:-1;order:-1}.order-xl-last{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.order-xl-0{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}.flex-xl-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-webkit-flex-direction:row!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-webkit-flex-direction:column!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:row-reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:column-reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-webkit-flex-wrap:wrap!important;-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-webkit-flex-wrap:nowrap!important;-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-webkit-flex-wrap:wrap-reverse!important;-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-xl-start{-webkit-box-pack:start!important;-webkit-justify-content:flex-start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-webkit-box-pack:end!important;-webkit-justify-content:flex-end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-webkit-box-pack:center!important;-webkit-justify-content:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-webkit-box-pack:justify!important;-webkit-justify-content:space-between!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-webkit-justify-content:space-around!important;-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-webkit-box-align:start!important;-webkit-align-items:flex-start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-webkit-box-align:end!important;-webkit-align-items:flex-end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-webkit-box-align:center!important;-webkit-align-items:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-webkit-box-align:baseline!important;-webkit-align-items:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-webkit-box-align:stretch!important;-webkit-align-items:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-webkit-align-content:flex-start!important;-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-webkit-align-content:flex-end!important;-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-webkit-align-content:center!important;-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-webkit-align-content:space-between!important;-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-webkit-align-content:space-around!important;-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-webkit-align-content:stretch!important;-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-webkit-align-self:auto!important;-ms-flex-item-align:auto!important;-ms-grid-row-align:auto!important;align-self:auto!important}.align-self-xl-start{-webkit-align-self:flex-start!important;-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-webkit-align-self:flex-end!important;-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-webkit-align-self:center!important;-ms-flex-item-align:center!important;-ms-grid-row-align:center!important;align-self:center!important}.align-self-xl-baseline{-webkit-align-self:baseline!important;-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-webkit-align-self:stretch!important;-ms-flex-item-align:stretch!important;-ms-grid-row-align:stretch!important;align-self:stretch!important}}/*# sourceMappingURL=bootstrap-grid.min.css.map */ \ No newline at end of file
diff --git a/library/bootstrap/css/bootstrap-grid.min.css.map b/library/bootstrap/css/bootstrap-grid.min.css.map
new file mode 100644
index 000000000..6750e0e3c
--- /dev/null
+++ b/library/bootstrap/css/bootstrap-grid.min.css.map
@@ -0,0 +1 @@
+{"version":3,"sources":["../../scss/bootstrap-grid.scss","dist/css/bootstrap-grid.css","../../scss/_grid.scss","../../scss/mixins/_grid.scss","../../scss/mixins/_breakpoints.scss","../../scss/mixins/_grid-framework.scss","../../scss/utilities/_flex.scss"],"names":[],"mappings":"AAUE,cAAgB,MAAA,aAGlB,KACE,mBAAA,WAAA,WAAA,WACA,mBAAA,UAGF,ECNA,QADA,SDUE,mBAAA,QAAA,WAAA,QEhBA,WCAA,aAAA,KACA,YAAA,KAKI,cAAA,KACA,aAAA,KC4CF,yBFnDF,WCMI,cAAA,KACA,aAAA,MC4CF,yBFnDF,WCMI,cAAA,KACA,aAAA,MC4CF,yBFnDF,WCMI,cAAA,KACA,aAAA,MC4CF,0BFnDF,WCMI,cAAA,KACA,aAAA,MC4CF,yBFnDF,WCiBI,MAAA,MACA,UAAA,MCiCF,yBFnDF,WCiBI,MAAA,MACA,UAAA,MCiCF,yBFnDF,WCiBI,MAAA,MACA,UAAA,MCiCF,0BFnDF,WCiBI,MAAA,OACA,UAAA,MDNJ,iBACE,MAAA,KCbF,aAAA,KACA,YAAA,KAKI,cAAA,KACA,aAAA,KC4CF,yBFvCF,iBCNI,cAAA,KACA,aAAA,MC4CF,yBFvCF,iBCNI,cAAA,KACA,aAAA,MC4CF,yBFvCF,iBCNI,cAAA,KACA,aAAA,MC4CF,0BFvCF,iBCNI,cAAA,KACA,aAAA,MDgBJ,KCWA,QAAA,YAAA,QAAA,aAAA,QAAA,YAAA,QAAA,KACA,kBAAA,KAAA,cAAA,KAAA,UAAA,KAKI,aAAA,MACA,YAAA,MCUF,yBF5BF,KCiBI,aAAA,MACA,YAAA,OCUF,yBF5BF,KCiBI,aAAA,MACA,YAAA,OCUF,yBF5BF,KCiBI,aAAA,MACA,YAAA,OCUF,0BF5BF,KCiBI,aAAA,MACA,YAAA,ODZJ,YACE,aAAA,EACA,YAAA,EAFF,iBDgIF,0BC1HM,cAAA,EACA,aAAA,EGlCJ,KAAA,OAAA,QAAA,QAAA,QAAA,OAAA,OAAA,OAAA,OAAA,OAAA,OAAA,OAAA,OJiKF,UAEqJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACtG,aAFqJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACtG,aAFkJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACnG,aAEqJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACtG,aIpKI,SAAA,SACA,MAAA,KACA,WAAA,IFsBE,cAAA,KACA,aAAA,KCuBF,yBCjDF,KAAA,OAAA,QAAA,QAAA,QAAA,OAAA,OAAA,OAAA,OAAA,OAAA,OAAA,OAAA,OJ+KA,UAEqJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACtG,aAFqJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACtG,aAFkJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACnG,aAEqJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACtG,aE1JI,cAAA,KACA,aAAA,MCuBF,yBCjDF,KAAA,OAAA,QAAA,QAAA,QAAA,OAAA,OAAA,OAAA,OAAA,OAAA,OAAA,OAAA,OJ2LA,UAEqJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACtG,aAFqJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACtG,aAFkJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACnG,aAEqJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACtG,aEtKI,cAAA,KACA,aAAA,MCuBF,yBCjDF,KAAA,OAAA,QAAA,QAAA,QAAA,OAAA,OAAA,OAAA,OAAA,OAAA,OAAA,OAAA,OJuMA,UAEqJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACtG,aAFqJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACtG,aAFkJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACnG,aAEqJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACtG,aElLI,cAAA,KACA,aAAA,MCuBF,0BCjDF,KAAA,OAAA,QAAA,QAAA,QAAA,OAAA,OAAA,OAAA,OAAA,OAAA,OAAA,OAAA,OJmNA,UAEqJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACtG,aAFqJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACtG,aAFkJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACnG,aAEqJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACtG,aE9LI,cAAA,KACA,aAAA,MEFA,KACE,mBAAA,EAAA,wBAAA,EAAA,WAAA,EACA,iBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,UAAA,EACA,UAAA,KAEF,UACE,iBAAA,EAAA,aAAA,EAAA,EAAA,KAAA,SAAA,EAAA,EAAA,KAAA,KAAA,EAAA,EAAA,KACA,MAAA,KAIA,OF2BN,MAAA,UE3BM,OF2BN,MAAA,WE3BM,OF2BN,MAAA,IE3BM,OF2BN,MAAA,WE3BM,OF2BN,MAAA,WE3BM,OF2BN,MAAA,IE3BM,OF2BN,MAAA,WE3BM,OF2BN,MAAA,WE3BM,OF2BN,MAAA,IE3BM,QF2BN,MAAA,WE3BM,QF2BN,MAAA,WE3BM,QF2BN,MAAA,KEpBQ,QFgCR,MAAA,KEhCQ,QFgCR,MAAA,UEhCQ,QFgCR,MAAA,WEhCQ,QFgCR,MAAA,IEhCQ,QFgCR,MAAA,WEhCQ,QFgCR,MAAA,WEhCQ,QFgCR,MAAA,IEhCQ,QFgCR,MAAA,WEhCQ,QFgCR,MAAA,WEhCQ,QFgCR,MAAA,IEhCQ,SFgCR,MAAA,WEhCQ,SFgCR,MAAA,WEhCQ,SFgCR,MAAA,KEhCQ,QF4BR,KAAA,KE5BQ,QF4BR,KAAA,UE5BQ,QF4BR,KAAA,WE5BQ,QF4BR,KAAA,IE5BQ,QF4BR,KAAA,WE5BQ,QF4BR,KAAA,WE5BQ,QF4BR,KAAA,IE5BQ,QF4BR,KAAA,WE5BQ,QF4BR,KAAA,WE5BQ,QF4BR,KAAA,IE5BQ,SF4BR,KAAA,WE5BQ,SF4BR,KAAA,WE5BQ,SF4BR,KAAA,KEnBQ,UFeR,YAAA,UEfQ,UFeR,YAAA,WEfQ,UFeR,YAAA,IEfQ,UFeR,YAAA,WEfQ,UFeR,YAAA,WEfQ,UFeR,YAAA,IEfQ,UFeR,YAAA,WEfQ,UFeR,YAAA,WEfQ,UFeR,YAAA,IEfQ,WFeR,YAAA,WEfQ,WFeR,YAAA,WCjBE,yBCzBE,QACE,mBAAA,EAAA,wBAAA,EAAA,WAAA,EACA,iBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,UAAA,EACA,UAAA,KAEF,aACE,iBAAA,EAAA,aAAA,EAAA,EAAA,KAAA,SAAA,EAAA,EAAA,KAAA,KAAA,EAAA,EAAA,KACA,MAAA,KAIA,UF2BN,MAAA,UE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,IE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,IE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,IE3BM,WF2BN,MAAA,WE3BM,WF2BN,MAAA,WE3BM,WF2BN,MAAA,KEpBQ,WFgCR,MAAA,KEhCQ,WFgCR,MAAA,UEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,IEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,IEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,IEhCQ,YFgCR,MAAA,WEhCQ,YFgCR,MAAA,WEhCQ,YFgCR,MAAA,KEhCQ,WF4BR,KAAA,KE5BQ,WF4BR,KAAA,UE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,IE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,IE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,IE5BQ,YF4BR,KAAA,WE5BQ,YF4BR,KAAA,WE5BQ,YF4BR,KAAA,KEnBQ,aFeR,YAAA,EEfQ,aFeR,YAAA,UEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,IEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,IEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,IEfQ,cFeR,YAAA,WEfQ,cFeR,YAAA,YCjBE,yBCzBE,QACE,mBAAA,EAAA,wBAAA,EAAA,WAAA,EACA,iBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,UAAA,EACA,UAAA,KAEF,aACE,iBAAA,EAAA,aAAA,EAAA,EAAA,KAAA,SAAA,EAAA,EAAA,KAAA,KAAA,EAAA,EAAA,KACA,MAAA,KAIA,UF2BN,MAAA,UE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,IE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,IE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,IE3BM,WF2BN,MAAA,WE3BM,WF2BN,MAAA,WE3BM,WF2BN,MAAA,KEpBQ,WFgCR,MAAA,KEhCQ,WFgCR,MAAA,UEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,IEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,IEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,IEhCQ,YFgCR,MAAA,WEhCQ,YFgCR,MAAA,WEhCQ,YFgCR,MAAA,KEhCQ,WF4BR,KAAA,KE5BQ,WF4BR,KAAA,UE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,IE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,IE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,IE5BQ,YF4BR,KAAA,WE5BQ,YF4BR,KAAA,WE5BQ,YF4BR,KAAA,KEnBQ,aFeR,YAAA,EEfQ,aFeR,YAAA,UEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,IEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,IEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,IEfQ,cFeR,YAAA,WEfQ,cFeR,YAAA,YCjBE,yBCzBE,QACE,mBAAA,EAAA,wBAAA,EAAA,WAAA,EACA,iBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,UAAA,EACA,UAAA,KAEF,aACE,iBAAA,EAAA,aAAA,EAAA,EAAA,KAAA,SAAA,EAAA,EAAA,KAAA,KAAA,EAAA,EAAA,KACA,MAAA,KAIA,UF2BN,MAAA,UE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,IE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,IE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,IE3BM,WF2BN,MAAA,WE3BM,WF2BN,MAAA,WE3BM,WF2BN,MAAA,KEpBQ,WFgCR,MAAA,KEhCQ,WFgCR,MAAA,UEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,IEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,IEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,IEhCQ,YFgCR,MAAA,WEhCQ,YFgCR,MAAA,WEhCQ,YFgCR,MAAA,KEhCQ,WF4BR,KAAA,KE5BQ,WF4BR,KAAA,UE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,IE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,IE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,IE5BQ,YF4BR,KAAA,WE5BQ,YF4BR,KAAA,WE5BQ,YF4BR,KAAA,KEnBQ,aFeR,YAAA,EEfQ,aFeR,YAAA,UEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,IEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,IEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,IEfQ,cFeR,YAAA,WEfQ,cFeR,YAAA,YCjBE,0BCzBE,QACE,mBAAA,EAAA,wBAAA,EAAA,WAAA,EACA,iBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,UAAA,EACA,UAAA,KAEF,aACE,iBAAA,EAAA,aAAA,EAAA,EAAA,KAAA,SAAA,EAAA,EAAA,KAAA,KAAA,EAAA,EAAA,KACA,MAAA,KAIA,UF2BN,MAAA,UE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,IE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,IE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,IE3BM,WF2BN,MAAA,WE3BM,WF2BN,MAAA,WE3BM,WF2BN,MAAA,KEpBQ,WFgCR,MAAA,KEhCQ,WFgCR,MAAA,UEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,IEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,IEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,IEhCQ,YFgCR,MAAA,WEhCQ,YFgCR,MAAA,WEhCQ,YFgCR,MAAA,KEhCQ,WF4BR,KAAA,KE5BQ,WF4BR,KAAA,UE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,IE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,IE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,IE5BQ,YF4BR,KAAA,WE5BQ,YF4BR,KAAA,WE5BQ,YF4BR,KAAA,KEnBQ,aFeR,YAAA,EEfQ,aFeR,YAAA,UEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,IEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,IEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,IEfQ,cFeR,YAAA,WEfQ,cFeR,YAAA,YGjEE,aAAwB,0BAAA,EAAA,cAAA,GAAA,eAAA,GAAA,MAAA,GACxB,YAAwB,0BAAA,EAAA,cAAA,EAAA,eAAA,EAAA,MAAA,EACxB,SAAwB,0BAAA,EAAA,cAAA,EAAA,eAAA,EAAA,MAAA,EAExB,UAAgC,mBAAA,qBAAA,sBAAA,iBAAA,uBAAA,cAAA,mBAAA,cAAA,eAAA,cAChC,aAAgC,mBAAA,mBAAA,sBAAA,iBAAA,uBAAA,iBAAA,mBAAA,iBAAA,eAAA,iBAChC,kBAAgC,mBAAA,qBAAA,sBAAA,kBAAA,uBAAA,sBAAA,mBAAA,sBAAA,eAAA,sBAChC,qBAAgC,mBAAA,mBAAA,sBAAA,kBAAA,uBAAA,yBAAA,mBAAA,yBAAA,eAAA,yBAEhC,WAA8B,kBAAA,eAAA,cAAA,eAAA,UAAA,eAC9B,aAA8B,kBAAA,iBAAA,cAAA,iBAAA,UAAA,iBAC9B,mBAA8B,kBAAA,uBAAA,cAAA,uBAAA,UAAA,uBAE9B,uBAAoC,iBAAA,gBAAA,wBAAA,qBAAA,cAAA,gBAAA,gBAAA,qBACpC,qBAAoC,iBAAA,cAAA,wBAAA,mBAAA,cAAA,cAAA,gBAAA,mBACpC,wBAAoC,iBAAA,iBAAA,wBAAA,iBAAA,cAAA,iBAAA,gBAAA,iBACpC,yBAAoC,iBAAA,kBAAA,wBAAA,wBAAA,cAAA,kBAAA,gBAAA,wBACpC,wBAAoC,wBAAA,uBAAA,cAAA,qBAAA,gBAAA,uBAEpC,mBAAiC,kBAAA,gBAAA,oBAAA,qBAAA,eAAA,gBAAA,YAAA,qBACjC,iBAAiC,kBAAA,cAAA,oBAAA,mBAAA,eAAA,cAAA,YAAA,mBACjC,oBAAiC,kBAAA,iBAAA,oBAAA,iBAAA,eAAA,iBAAA,YAAA,iBACjC,sBAAiC,kBAAA,mBAAA,oBAAA,mBAAA,eAAA,mBAAA,YAAA,mBACjC,qBAAiC,kBAAA,kBAAA,oBAAA,kBAAA,eAAA,kBAAA,YAAA,kBAEjC,qBAAkC,sBAAA,qBAAA,mBAAA,gBAAA,cAAA,qBAClC,mBAAkC,sBAAA,mBAAA,mBAAA,cAAA,cAAA,mBAClC,sBAAkC,sBAAA,iBAAA,mBAAA,iBAAA,cAAA,iBAClC,uBAAkC,sBAAA,wBAAA,mBAAA,kBAAA,cAAA,wBAClC,sBAAkC,sBAAA,uBAAA,mBAAA,qBAAA,cAAA,uBAClC,uBAAkC,sBAAA,kBAAA,mBAAA,kBAAA,cAAA,kBAElC,iBAAgC,mBAAA,eAAA,oBAAA,eAAA,mBAAA,eAAA,WAAA,eAChC,kBAAgC,mBAAA,qBAAA,oBAAA,gBAAA,WAAA,qBAChC,gBAAgC,mBAAA,mBAAA,oBAAA,cAAA,WAAA,mBAChC,mBAAgC,mBAAA,iBAAA,oBAAA,iBAAA,mBAAA,iBAAA,WAAA,iBAChC,qBAAgC,mBAAA,mBAAA,oBAAA,mBAAA,WAAA,mBAChC,oBAAgC,mBAAA,kBAAA,oBAAA,kBAAA,mBAAA,kBAAA,WAAA,kBFWhC,yBEhDA,gBAAwB,0BAAA,EAAA,cAAA,GAAA,eAAA,GAAA,MAAA,GACxB,eAAwB,0BAAA,EAAA,cAAA,EAAA,eAAA,EAAA,MAAA,EACxB,YAAwB,0BAAA,EAAA,cAAA,EAAA,eAAA,EAAA,MAAA,EAExB,aAAgC,mBAAA,qBAAA,sBAAA,iBAAA,uBAAA,cAAA,mBAAA,cAAA,eAAA,cAChC,gBAAgC,mBAAA,mBAAA,sBAAA,iBAAA,uBAAA,iBAAA,mBAAA,iBAAA,eAAA,iBAChC,qBAAgC,mBAAA,qBAAA,sBAAA,kBAAA,uBAAA,sBAAA,mBAAA,sBAAA,eAAA,sBAChC,wBAAgC,mBAAA,mBAAA,sBAAA,kBAAA,uBAAA,yBAAA,mBAAA,yBAAA,eAAA,yBAEhC,cAA8B,kBAAA,eAAA,cAAA,eAAA,UAAA,eAC9B,gBAA8B,kBAAA,iBAAA,cAAA,iBAAA,UAAA,iBAC9B,sBAA8B,kBAAA,uBAAA,cAAA,uBAAA,UAAA,uBAE9B,0BAAoC,iBAAA,gBAAA,wBAAA,qBAAA,cAAA,gBAAA,gBAAA,qBACpC,wBAAoC,iBAAA,cAAA,wBAAA,mBAAA,cAAA,cAAA,gBAAA,mBACpC,2BAAoC,iBAAA,iBAAA,wBAAA,iBAAA,cAAA,iBAAA,gBAAA,iBACpC,4BAAoC,iBAAA,kBAAA,wBAAA,wBAAA,cAAA,kBAAA,gBAAA,wBACpC,2BAAoC,wBAAA,uBAAA,cAAA,qBAAA,gBAAA,uBAEpC,sBAAiC,kBAAA,gBAAA,oBAAA,qBAAA,eAAA,gBAAA,YAAA,qBACjC,oBAAiC,kBAAA,cAAA,oBAAA,mBAAA,eAAA,cAAA,YAAA,mBACjC,uBAAiC,kBAAA,iBAAA,oBAAA,iBAAA,eAAA,iBAAA,YAAA,iBACjC,yBAAiC,kBAAA,mBAAA,oBAAA,mBAAA,eAAA,mBAAA,YAAA,mBACjC,wBAAiC,kBAAA,kBAAA,oBAAA,kBAAA,eAAA,kBAAA,YAAA,kBAEjC,wBAAkC,sBAAA,qBAAA,mBAAA,gBAAA,cAAA,qBAClC,sBAAkC,sBAAA,mBAAA,mBAAA,cAAA,cAAA,mBAClC,yBAAkC,sBAAA,iBAAA,mBAAA,iBAAA,cAAA,iBAClC,0BAAkC,sBAAA,wBAAA,mBAAA,kBAAA,cAAA,wBAClC,yBAAkC,sBAAA,uBAAA,mBAAA,qBAAA,cAAA,uBAClC,0BAAkC,sBAAA,kBAAA,mBAAA,kBAAA,cAAA,kBAElC,oBAAgC,mBAAA,eAAA,oBAAA,eAAA,mBAAA,eAAA,WAAA,eAChC,qBAAgC,mBAAA,qBAAA,oBAAA,gBAAA,WAAA,qBAChC,mBAAgC,mBAAA,mBAAA,oBAAA,cAAA,WAAA,mBAChC,sBAAgC,mBAAA,iBAAA,oBAAA,iBAAA,mBAAA,iBAAA,WAAA,iBAChC,wBAAgC,mBAAA,mBAAA,oBAAA,mBAAA,WAAA,mBAChC,uBAAgC,mBAAA,kBAAA,oBAAA,kBAAA,mBAAA,kBAAA,WAAA,mBFWhC,yBEhDA,gBAAwB,0BAAA,EAAA,cAAA,GAAA,eAAA,GAAA,MAAA,GACxB,eAAwB,0BAAA,EAAA,cAAA,EAAA,eAAA,EAAA,MAAA,EACxB,YAAwB,0BAAA,EAAA,cAAA,EAAA,eAAA,EAAA,MAAA,EAExB,aAAgC,mBAAA,qBAAA,sBAAA,iBAAA,uBAAA,cAAA,mBAAA,cAAA,eAAA,cAChC,gBAAgC,mBAAA,mBAAA,sBAAA,iBAAA,uBAAA,iBAAA,mBAAA,iBAAA,eAAA,iBAChC,qBAAgC,mBAAA,qBAAA,sBAAA,kBAAA,uBAAA,sBAAA,mBAAA,sBAAA,eAAA,sBAChC,wBAAgC,mBAAA,mBAAA,sBAAA,kBAAA,uBAAA,yBAAA,mBAAA,yBAAA,eAAA,yBAEhC,cAA8B,kBAAA,eAAA,cAAA,eAAA,UAAA,eAC9B,gBAA8B,kBAAA,iBAAA,cAAA,iBAAA,UAAA,iBAC9B,sBAA8B,kBAAA,uBAAA,cAAA,uBAAA,UAAA,uBAE9B,0BAAoC,iBAAA,gBAAA,wBAAA,qBAAA,cAAA,gBAAA,gBAAA,qBACpC,wBAAoC,iBAAA,cAAA,wBAAA,mBAAA,cAAA,cAAA,gBAAA,mBACpC,2BAAoC,iBAAA,iBAAA,wBAAA,iBAAA,cAAA,iBAAA,gBAAA,iBACpC,4BAAoC,iBAAA,kBAAA,wBAAA,wBAAA,cAAA,kBAAA,gBAAA,wBACpC,2BAAoC,wBAAA,uBAAA,cAAA,qBAAA,gBAAA,uBAEpC,sBAAiC,kBAAA,gBAAA,oBAAA,qBAAA,eAAA,gBAAA,YAAA,qBACjC,oBAAiC,kBAAA,cAAA,oBAAA,mBAAA,eAAA,cAAA,YAAA,mBACjC,uBAAiC,kBAAA,iBAAA,oBAAA,iBAAA,eAAA,iBAAA,YAAA,iBACjC,yBAAiC,kBAAA,mBAAA,oBAAA,mBAAA,eAAA,mBAAA,YAAA,mBACjC,wBAAiC,kBAAA,kBAAA,oBAAA,kBAAA,eAAA,kBAAA,YAAA,kBAEjC,wBAAkC,sBAAA,qBAAA,mBAAA,gBAAA,cAAA,qBAClC,sBAAkC,sBAAA,mBAAA,mBAAA,cAAA,cAAA,mBAClC,yBAAkC,sBAAA,iBAAA,mBAAA,iBAAA,cAAA,iBAClC,0BAAkC,sBAAA,wBAAA,mBAAA,kBAAA,cAAA,wBAClC,yBAAkC,sBAAA,uBAAA,mBAAA,qBAAA,cAAA,uBAClC,0BAAkC,sBAAA,kBAAA,mBAAA,kBAAA,cAAA,kBAElC,oBAAgC,mBAAA,eAAA,oBAAA,eAAA,mBAAA,eAAA,WAAA,eAChC,qBAAgC,mBAAA,qBAAA,oBAAA,gBAAA,WAAA,qBAChC,mBAAgC,mBAAA,mBAAA,oBAAA,cAAA,WAAA,mBAChC,sBAAgC,mBAAA,iBAAA,oBAAA,iBAAA,mBAAA,iBAAA,WAAA,iBAChC,wBAAgC,mBAAA,mBAAA,oBAAA,mBAAA,WAAA,mBAChC,uBAAgC,mBAAA,kBAAA,oBAAA,kBAAA,mBAAA,kBAAA,WAAA,mBFWhC,yBEhDA,gBAAwB,0BAAA,EAAA,cAAA,GAAA,eAAA,GAAA,MAAA,GACxB,eAAwB,0BAAA,EAAA,cAAA,EAAA,eAAA,EAAA,MAAA,EACxB,YAAwB,0BAAA,EAAA,cAAA,EAAA,eAAA,EAAA,MAAA,EAExB,aAAgC,mBAAA,qBAAA,sBAAA,iBAAA,uBAAA,cAAA,mBAAA,cAAA,eAAA,cAChC,gBAAgC,mBAAA,mBAAA,sBAAA,iBAAA,uBAAA,iBAAA,mBAAA,iBAAA,eAAA,iBAChC,qBAAgC,mBAAA,qBAAA,sBAAA,kBAAA,uBAAA,sBAAA,mBAAA,sBAAA,eAAA,sBAChC,wBAAgC,mBAAA,mBAAA,sBAAA,kBAAA,uBAAA,yBAAA,mBAAA,yBAAA,eAAA,yBAEhC,cAA8B,kBAAA,eAAA,cAAA,eAAA,UAAA,eAC9B,gBAA8B,kBAAA,iBAAA,cAAA,iBAAA,UAAA,iBAC9B,sBAA8B,kBAAA,uBAAA,cAAA,uBAAA,UAAA,uBAE9B,0BAAoC,iBAAA,gBAAA,wBAAA,qBAAA,cAAA,gBAAA,gBAAA,qBACpC,wBAAoC,iBAAA,cAAA,wBAAA,mBAAA,cAAA,cAAA,gBAAA,mBACpC,2BAAoC,iBAAA,iBAAA,wBAAA,iBAAA,cAAA,iBAAA,gBAAA,iBACpC,4BAAoC,iBAAA,kBAAA,wBAAA,wBAAA,cAAA,kBAAA,gBAAA,wBACpC,2BAAoC,wBAAA,uBAAA,cAAA,qBAAA,gBAAA,uBAEpC,sBAAiC,kBAAA,gBAAA,oBAAA,qBAAA,eAAA,gBAAA,YAAA,qBACjC,oBAAiC,kBAAA,cAAA,oBAAA,mBAAA,eAAA,cAAA,YAAA,mBACjC,uBAAiC,kBAAA,iBAAA,oBAAA,iBAAA,eAAA,iBAAA,YAAA,iBACjC,yBAAiC,kBAAA,mBAAA,oBAAA,mBAAA,eAAA,mBAAA,YAAA,mBACjC,wBAAiC,kBAAA,kBAAA,oBAAA,kBAAA,eAAA,kBAAA,YAAA,kBAEjC,wBAAkC,sBAAA,qBAAA,mBAAA,gBAAA,cAAA,qBAClC,sBAAkC,sBAAA,mBAAA,mBAAA,cAAA,cAAA,mBAClC,yBAAkC,sBAAA,iBAAA,mBAAA,iBAAA,cAAA,iBAClC,0BAAkC,sBAAA,wBAAA,mBAAA,kBAAA,cAAA,wBAClC,yBAAkC,sBAAA,uBAAA,mBAAA,qBAAA,cAAA,uBAClC,0BAAkC,sBAAA,kBAAA,mBAAA,kBAAA,cAAA,kBAElC,oBAAgC,mBAAA,eAAA,oBAAA,eAAA,mBAAA,eAAA,WAAA,eAChC,qBAAgC,mBAAA,qBAAA,oBAAA,gBAAA,WAAA,qBAChC,mBAAgC,mBAAA,mBAAA,oBAAA,cAAA,WAAA,mBAChC,sBAAgC,mBAAA,iBAAA,oBAAA,iBAAA,mBAAA,iBAAA,WAAA,iBAChC,wBAAgC,mBAAA,mBAAA,oBAAA,mBAAA,WAAA,mBAChC,uBAAgC,mBAAA,kBAAA,oBAAA,kBAAA,mBAAA,kBAAA,WAAA,mBFWhC,0BEhDA,gBAAwB,0BAAA,EAAA,cAAA,GAAA,eAAA,GAAA,MAAA,GACxB,eAAwB,0BAAA,EAAA,cAAA,EAAA,eAAA,EAAA,MAAA,EACxB,YAAwB,0BAAA,EAAA,cAAA,EAAA,eAAA,EAAA,MAAA,EAExB,aAAgC,mBAAA,qBAAA,sBAAA,iBAAA,uBAAA,cAAA,mBAAA,cAAA,eAAA,cAChC,gBAAgC,mBAAA,mBAAA,sBAAA,iBAAA,uBAAA,iBAAA,mBAAA,iBAAA,eAAA,iBAChC,qBAAgC,mBAAA,qBAAA,sBAAA,kBAAA,uBAAA,sBAAA,mBAAA,sBAAA,eAAA,sBAChC,wBAAgC,mBAAA,mBAAA,sBAAA,kBAAA,uBAAA,yBAAA,mBAAA,yBAAA,eAAA,yBAEhC,cAA8B,kBAAA,eAAA,cAAA,eAAA,UAAA,eAC9B,gBAA8B,kBAAA,iBAAA,cAAA,iBAAA,UAAA,iBAC9B,sBAA8B,kBAAA,uBAAA,cAAA,uBAAA,UAAA,uBAE9B,0BAAoC,iBAAA,gBAAA,wBAAA,qBAAA,cAAA,gBAAA,gBAAA,qBACpC,wBAAoC,iBAAA,cAAA,wBAAA,mBAAA,cAAA,cAAA,gBAAA,mBACpC,2BAAoC,iBAAA,iBAAA,wBAAA,iBAAA,cAAA,iBAAA,gBAAA,iBACpC,4BAAoC,iBAAA,kBAAA,wBAAA,wBAAA,cAAA,kBAAA,gBAAA,wBACpC,2BAAoC,wBAAA,uBAAA,cAAA,qBAAA,gBAAA,uBAEpC,sBAAiC,kBAAA,gBAAA,oBAAA,qBAAA,eAAA,gBAAA,YAAA,qBACjC,oBAAiC,kBAAA,cAAA,oBAAA,mBAAA,eAAA,cAAA,YAAA,mBACjC,uBAAiC,kBAAA,iBAAA,oBAAA,iBAAA,eAAA,iBAAA,YAAA,iBACjC,yBAAiC,kBAAA,mBAAA,oBAAA,mBAAA,eAAA,mBAAA,YAAA,mBACjC,wBAAiC,kBAAA,kBAAA,oBAAA,kBAAA,eAAA,kBAAA,YAAA,kBAEjC,wBAAkC,sBAAA,qBAAA,mBAAA,gBAAA,cAAA,qBAClC,sBAAkC,sBAAA,mBAAA,mBAAA,cAAA,cAAA,mBAClC,yBAAkC,sBAAA,iBAAA,mBAAA,iBAAA,cAAA,iBAClC,0BAAkC,sBAAA,wBAAA,mBAAA,kBAAA,cAAA,wBAClC,yBAAkC,sBAAA,uBAAA,mBAAA,qBAAA,cAAA,uBAClC,0BAAkC,sBAAA,kBAAA,mBAAA,kBAAA,cAAA,kBAElC,oBAAgC,mBAAA,eAAA,oBAAA,eAAA,mBAAA,eAAA,WAAA,eAChC,qBAAgC,mBAAA,qBAAA,oBAAA,gBAAA,WAAA,qBAChC,mBAAgC,mBAAA,mBAAA,oBAAA,cAAA,WAAA,mBAChC,sBAAgC,mBAAA,iBAAA,oBAAA,iBAAA,mBAAA,iBAAA,WAAA,iBAChC,wBAAgC,mBAAA,mBAAA,oBAAA,mBAAA,WAAA,mBAChC,uBAAgC,mBAAA,kBAAA,oBAAA,kBAAA,mBAAA,kBAAA,WAAA"} \ No newline at end of file
diff --git a/library/bootstrap/css/bootstrap-reboot.css b/library/bootstrap/css/bootstrap-reboot.css
new file mode 100644
index 000000000..d15111066
--- /dev/null
+++ b/library/bootstrap/css/bootstrap-reboot.css
@@ -0,0 +1,329 @@
+html {
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ font-family: sans-serif;
+ line-height: 1.15;
+ -webkit-text-size-adjust: 100%;
+ -ms-text-size-adjust: 100%;
+ -ms-overflow-style: scrollbar;
+ -webkit-tap-highlight-color: transparent;
+}
+
+*,
+*::before,
+*::after {
+ -webkit-box-sizing: inherit;
+ box-sizing: inherit;
+}
+
+@-ms-viewport {
+ width: device-width;
+}
+
+body {
+ margin: 0;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
+ font-size: 1rem;
+ font-weight: normal;
+ line-height: 1.5;
+ color: #292b2c;
+ background-color: #fff;
+}
+
+[tabindex="-1"]:focus {
+ outline: none !important;
+}
+
+hr {
+ -webkit-box-sizing: content-box;
+ box-sizing: content-box;
+ height: 0;
+ overflow: visible;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ margin-top: 0;
+ margin-bottom: .5rem;
+}
+
+p {
+ margin-top: 0;
+ margin-bottom: 1rem;
+}
+
+abbr[title],
+abbr[data-original-title] {
+ text-decoration: underline;
+ text-decoration: underline dotted;
+ cursor: help;
+ border-bottom: 0;
+}
+
+address {
+ margin-bottom: 1rem;
+ font-style: normal;
+ line-height: inherit;
+}
+
+ol,
+ul,
+dl {
+ margin-top: 0;
+ margin-bottom: 1rem;
+}
+
+ol ol,
+ul ul,
+ol ul,
+ul ol {
+ margin-bottom: 0;
+}
+
+dt {
+ font-weight: bold;
+}
+
+dd {
+ margin-bottom: .5rem;
+ margin-left: 0;
+}
+
+blockquote {
+ margin: 0 0 1rem;
+}
+
+dfn {
+ font-style: italic;
+}
+
+b,
+strong {
+ font-weight: bolder;
+}
+
+small {
+ font-size: 80%;
+}
+
+sub,
+sup {
+ position: relative;
+ font-size: 75%;
+ line-height: 0;
+ vertical-align: baseline;
+}
+
+sub {
+ bottom: -.25em;
+}
+
+sup {
+ top: -.5em;
+}
+
+a {
+ color: #0275d8;
+ text-decoration: none;
+ background-color: transparent;
+ -webkit-text-decoration-skip: objects;
+}
+
+a:hover {
+ color: #014c8c;
+ text-decoration: underline;
+}
+
+a:not([href]):not([tabindex]) {
+ color: inherit;
+ text-decoration: none;
+}
+
+a:not([href]):not([tabindex]):focus, a:not([href]):not([tabindex]):hover {
+ color: inherit;
+ text-decoration: none;
+}
+
+a:not([href]):not([tabindex]):focus {
+ outline: 0;
+}
+
+pre,
+code,
+kbd,
+samp {
+ font-family: monospace, monospace;
+ font-size: 1em;
+}
+
+pre {
+ margin-top: 0;
+ margin-bottom: 1rem;
+ overflow: auto;
+}
+
+figure {
+ margin: 0 0 1rem;
+}
+
+img {
+ vertical-align: middle;
+ border-style: none;
+}
+
+svg:not(:root) {
+ overflow: hidden;
+}
+
+a,
+area,
+button,
+[role="button"],
+input,
+label,
+select,
+summary,
+textarea {
+ -ms-touch-action: manipulation;
+ touch-action: manipulation;
+}
+
+table {
+ border-collapse: collapse;
+}
+
+caption {
+ padding-top: 0.75rem;
+ padding-bottom: 0.75rem;
+ color: #636c72;
+ text-align: left;
+ caption-side: bottom;
+}
+
+th {
+ text-align: left;
+}
+
+label {
+ display: inline-block;
+ margin-bottom: .5rem;
+}
+
+button:focus {
+ outline: 1px dotted;
+ outline: 5px auto -webkit-focus-ring-color;
+}
+
+input,
+button,
+select,
+optgroup,
+textarea {
+ margin: 0;
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+}
+
+button,
+input {
+ overflow: visible;
+}
+
+button,
+select {
+ text-transform: none;
+}
+
+button,
+html [type="button"],
+[type="reset"],
+[type="submit"] {
+ -webkit-appearance: button;
+}
+
+button::-moz-focus-inner,
+[type="button"]::-moz-focus-inner,
+[type="reset"]::-moz-focus-inner,
+[type="submit"]::-moz-focus-inner {
+ padding: 0;
+ border-style: none;
+}
+
+input[type="radio"],
+input[type="checkbox"] {
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ padding: 0;
+}
+
+input[type="date"],
+input[type="time"],
+input[type="datetime-local"],
+input[type="month"] {
+ -webkit-appearance: listbox;
+}
+
+textarea {
+ overflow: auto;
+ resize: vertical;
+}
+
+fieldset {
+ min-width: 0;
+ padding: 0;
+ margin: 0;
+ border: 0;
+}
+
+legend {
+ display: block;
+ width: 100%;
+ max-width: 100%;
+ padding: 0;
+ margin-bottom: .5rem;
+ font-size: 1.5rem;
+ line-height: inherit;
+ color: inherit;
+ white-space: normal;
+}
+
+progress {
+ vertical-align: baseline;
+}
+
+[type="number"]::-webkit-inner-spin-button,
+[type="number"]::-webkit-outer-spin-button {
+ height: auto;
+}
+
+[type="search"] {
+ outline-offset: -2px;
+ -webkit-appearance: none;
+}
+
+[type="search"]::-webkit-search-cancel-button,
+[type="search"]::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+
+::-webkit-file-upload-button {
+ font: inherit;
+ -webkit-appearance: button;
+}
+
+output {
+ display: inline-block;
+}
+
+summary {
+ display: list-item;
+}
+
+template {
+ display: none;
+}
+
+[hidden] {
+ display: none !important;
+}
+/*# sourceMappingURL=bootstrap-reboot.css.map */ \ No newline at end of file
diff --git a/library/bootstrap/css/bootstrap-reboot.css.map b/library/bootstrap/css/bootstrap-reboot.css.map
new file mode 100644
index 000000000..e530b93b5
--- /dev/null
+++ b/library/bootstrap/css/bootstrap-reboot.css.map
@@ -0,0 +1 @@
+{"version":3,"sources":["../../scss/_reboot.scss","bootstrap-reboot.css","../../scss/_variables.scss","../../scss/mixins/_hover.scss"],"names":[],"mappings":"AAoBA;EACE,+BAAsB;UAAtB,uBAAsB;EACtB,wBAAuB;EACvB,kBAAiB;EACjB,+BAA8B;EAC9B,2BAA0B;EAC1B,8BAA6B;EAC7B,yCAA0C;CAC3C;;AAED;;;EAGE,4BAAmB;UAAnB,oBAAmB;CACpB;;AAIC;EAAgB,oBAAmB;CCpBpC;;AD6BD;EACE,UAAS;EACT,wGEqMiH;EFpMjH,gBEwMmB;EFvMnB,oBE4MyB;EF3MzB,iBE+MoB;EF9MpB,eEqDiC;EFpDjC,uBEwCW;CFvCZ;;ACzBD;EDiCE,yBAAwB;CACzB;;AAQD;EACE,gCAAuB;UAAvB,wBAAuB;EACvB,UAAS;EACT,kBAAiB;CAClB;;AAWD;EACE,cAAa;EACb,qBAAoB;CACrB;;AAMD;EACE,cAAa;EACb,oBAAmB;CACpB;;AASD;;EAEE,2BAA0B;EAC1B,kCAAiC;EACjC,aAAY;EACZ,iBAAgB;CACjB;;AAED;EACE,oBAAmB;EACnB,mBAAkB;EAClB,qBAAoB;CACrB;;AAED;;;EAGE,cAAa;EACb,oBAAmB;CACpB;;AAED;;;;EAIE,iBAAgB;CACjB;;AAED;EACE,kBEuHqB;CFtHtB;;AAED;EACE,qBAAoB;EACpB,eAAc;CACf;;AAED;EACE,iBAAgB;CACjB;;AAED;EACE,mBAAkB;CACnB;;AAED;;EAEE,oBAAmB;CACpB;;AAED;EACE,eAAc;CACf;;AAOD;;EAEE,mBAAkB;EAClB,eAAc;EACd,eAAc;EACd,yBAAwB;CACzB;;AAED;EAAM,eAAc;CAAK;;AACzB;EAAM,WAAU;CAAK;;AAOrB;EACE,eEpFc;EFqFd,sBEf0B;EFgB1B,8BAA6B;EAC7B,sCAAqC;CAMtC;;AGtLG;EHmLA,eEnB4C;EFoB5C,2BEnB6B;CCjKR;;AH8LzB;EACE,eAAc;EACd,sBAAqB;CAUtB;;AG/LG;EHwLA,eAAc;EACd,sBAAqB;CGtLpB;;AHgLL;EAUI,WAAU;CACX;;AAQH;;;;EAIE,kCAAiC;EACjC,eAAc;CACf;;AAED;EAEE,cAAa;EAEb,oBAAmB;EAEnB,eAAc;CACf;;AAOD;EAEE,iBAAgB;CACjB;;AAOD;EACE,uBAAsB;EACtB,mBAAkB;CACnB;;AAED;EACE,iBAAgB;CACjB;;AAaD;;;;;;;;;EASE,+BAA0B;MAA1B,2BAA0B;CAC3B;;AAOD;EACE,0BAAyB;CAC1B;;AAED;EACE,qBEoBoC;EFnBpC,wBEmBoC;EFlBpC,eE5LiC;EF6LjC,iBAAgB;EAChB,qBAAoB;CACrB;;AAED;EAEE,iBAAgB;CACjB;;AAOD;EAEE,sBAAqB;EACrB,qBAAoB;CACrB;;AAMD;EACE,oBAAmB;EACnB,2CAA0C;CAC3C;;AAED;;;;;EAKE,UAAS;EACT,qBAAoB;EACpB,mBAAkB;EAClB,qBAAoB;CACrB;;AAED;;EAEE,kBAAiB;CAClB;;AAED;;EAEE,qBAAoB;CACrB;;AAKD;;;;EAIE,2BAA0B;CAC3B;;AAGD;;;;EAIE,WAAU;EACV,mBAAkB;CACnB;;AAED;;EAEE,+BAAsB;UAAtB,uBAAsB;EACtB,WAAU;CACX;;AAGD;;;;EASE,4BAA2B;CAC5B;;AAED;EACE,eAAc;EAEd,iBAAgB;CACjB;;AAED;EAME,aAAY;EAEZ,WAAU;EACV,UAAS;EACT,UAAS;CACV;;AAID;EACE,eAAc;EACd,YAAW;EACX,gBAAe;EACf,WAAU;EACV,qBAAoB;EACpB,kBAAiB;EACjB,qBAAoB;EACpB,eAAc;EACd,oBAAmB;CACpB;;AAED;EACE,yBAAwB;CACzB;;ACpID;;EDyIE,aAAY;CACb;;ACrID;ED4IE,qBAAoB;EACpB,yBAAwB;CACzB;;ACzID;;EDiJE,yBAAwB;CACzB;;AAOD;EACE,cAAa;EACb,2BAA0B;CAC3B;;AAMD;EACE,sBAAqB;CACtB;;AAED;EACE,mBAAkB;CACnB;;AAED;EACE,cAAa;CACd;;ACtJD;ED2JE,yBAAwB;CACzB","file":"bootstrap-reboot.css","sourcesContent":[null,"html {\n box-sizing: border-box;\n font-family: sans-serif;\n line-height: 1.15;\n -webkit-text-size-adjust: 100%;\n -ms-text-size-adjust: 100%;\n -ms-overflow-style: scrollbar;\n -webkit-tap-highlight-color: transparent;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: inherit;\n}\n\n@-ms-viewport {\n width: device-width;\n}\n\nbody {\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif;\n font-size: 1rem;\n font-weight: normal;\n line-height: 1.5;\n color: #292b2c;\n background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus {\n outline: none !important;\n}\n\nhr {\n box-sizing: content-box;\n height: 0;\n overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: .5rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n text-decoration: underline;\n text-decoration: underline dotted;\n cursor: help;\n border-bottom: 0;\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: bold;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\ndfn {\n font-style: italic;\n}\n\nb,\nstrong {\n font-weight: bolder;\n}\n\nsmall {\n font-size: 80%;\n}\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -.25em;\n}\n\nsup {\n top: -.5em;\n}\n\na {\n color: #0275d8;\n text-decoration: none;\n background-color: transparent;\n -webkit-text-decoration-skip: objects;\n}\n\na:hover {\n color: #014c8c;\n text-decoration: underline;\n}\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus, a:not([href]):not([tabindex]):hover {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus {\n outline: 0;\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\npre {\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg {\n vertical-align: middle;\n border-style: none;\n}\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\na,\narea,\nbutton,\n[role=\"button\"],\ninput,\nlabel,\nselect,\nsummary,\ntextarea {\n touch-action: manipulation;\n}\n\ntable {\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: 0.75rem;\n padding-bottom: 0.75rem;\n color: #636c72;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n text-align: left;\n}\n\nlabel {\n display: inline-block;\n margin-bottom: .5rem;\n}\n\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible;\n}\n\nbutton,\nselect {\n text-transform: none;\n}\n\nbutton,\nhtml [type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box;\n padding: 0;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto;\n resize: vertical;\n}\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n max-width: 100%;\n padding: 0;\n margin-bottom: .5rem;\n font-size: 1.5rem;\n line-height: inherit;\n color: inherit;\n white-space: normal;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n outline-offset: -2px;\n -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-cancel-button,\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item;\n}\n\ntemplate {\n display: none;\n}\n\n[hidden] {\n display: none !important;\n}\n\n/*# sourceMappingURL=bootstrap-reboot.css.map */",null,null]} \ No newline at end of file
diff --git a/library/bootstrap/css/bootstrap-reboot.min.css b/library/bootstrap/css/bootstrap-reboot.min.css
new file mode 100644
index 000000000..c005c9830
--- /dev/null
+++ b/library/bootstrap/css/bootstrap-reboot.min.css
@@ -0,0 +1 @@
+html{-webkit-box-sizing:border-box;box-sizing:border-box;font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}*,::after,::before{-webkit-box-sizing:inherit;box-sizing:inherit}@-ms-viewport{width:device-width}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-size:1rem;font-weight:400;line-height:1.5;color:#292b2c;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;text-decoration:underline dotted;cursor:help;border-bottom:0}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0275d8;text-decoration:none;background-color:transparent;-webkit-text-decoration-skip:objects}a:hover{color:#014c8c;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg:not(:root){overflow:hidden}[role=button],a,area,button,input,label,select,summary,textarea{-ms-touch-action:manipulation;touch-action:manipulation}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#636c72;text-align:left;caption-side:bottom}th{text-align:left}label{display:inline-block;margin-bottom:.5rem}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item}template{display:none}[hidden]{display:none!important}/*# sourceMappingURL=bootstrap-reboot.min.css.map */ \ No newline at end of file
diff --git a/library/bootstrap/css/bootstrap-reboot.min.css.map b/library/bootstrap/css/bootstrap-reboot.min.css.map
new file mode 100644
index 000000000..e4cb7b222
--- /dev/null
+++ b/library/bootstrap/css/bootstrap-reboot.min.css.map
@@ -0,0 +1 @@
+{"version":3,"sources":["../../scss/_reboot.scss","dist/css/bootstrap-reboot.css","bootstrap-reboot.css","../../scss/mixins/_hover.scss"],"names":[],"mappings":"AAoBA,KACE,mBAAA,WAAA,WAAA,WACA,YAAA,WACA,YAAA,KACA,yBAAA,KACA,qBAAA,KACA,mBAAA,UACA,4BAAA,YAGF,ECjBA,QADA,SDqBE,mBAAA,QAAA,WAAA,QAKA,cAAgB,MAAA,aASlB,KACE,OAAA,EACA,YAAA,aAAA,CAAA,kBAAA,CAAA,UAAA,CAAA,MAAA,CAAA,gBAAA,CAAA,KAAA,CAAA,WACA,UAAA,KACA,YAAA,IACA,YAAA,IACA,MAAA,QACA,iBAAA,KExBF,sBFiCE,QAAA,YASF,GACE,mBAAA,YAAA,WAAA,YACA,OAAA,EACA,SAAA,QAYF,GAAA,GAAA,GAAA,GAAA,GAAA,GACE,WAAA,EACA,cAAA,MAOF,EACE,WAAA,EACA,cAAA,KC5CF,0BDsDA,YAEE,gBAAA,UACA,gBAAA,UAAA,OACA,OAAA,KACA,cAAA,EAGF,QACE,cAAA,KACA,WAAA,OACA,YAAA,QClDF,GDqDA,GCtDA,GDyDE,WAAA,EACA,cAAA,KAGF,MCrDA,MACA,MAFA,MD0DE,cAAA,EAGF,GACE,YAAA,IAGF,GACE,cAAA,MACA,YAAA,EAGF,WACE,OAAA,EAAA,EAAA,KAGF,IACE,WAAA,OAGF,ECtDA,ODwDE,YAAA,OAGF,MACE,UAAA,IAQF,IC3DA,ID6DE,SAAA,SACA,UAAA,IACA,YAAA,EACA,eAAA,SAGF,IAAM,OAAA,OACN,IAAM,IAAA,MAON,EACE,MAAA,QACA,gBAAA,KACA,iBAAA,YACA,6BAAA,QGhLE,QHmLA,MAAA,QACA,gBAAA,UAUJ,8BACE,MAAA,QACA,gBAAA,KGrLE,oCAAA,oCHwLA,MAAA,QACA,gBAAA,KANJ,oCAUI,QAAA,EC7DJ,KACA,IDqEA,ICpEA,KDwEE,YAAA,SAAA,CAAA,UACA,UAAA,IAGF,IAEE,WAAA,EAEA,cAAA,KAEA,SAAA,KAQF,OAEE,OAAA,EAAA,EAAA,KAQF,IACE,eAAA,OACA,aAAA,KAGF,eACE,SAAA,OC/EF,cD6FA,EC/FA,KACA,OAEA,MACA,MACA,OACA,QACA,SDiGE,iBAAA,aAAA,aAAA,aAQF,MACE,gBAAA,SAGF,QACE,YAAA,OACA,eAAA,OACA,MAAA,QACA,WAAA,KACA,aAAA,OAGF,GAEE,WAAA,KAQF,MAEE,QAAA,aACA,cAAA,MAOF,aACE,QAAA,IAAA,OACA,QAAA,IAAA,KAAA,yBC3GF,OD8GA,MC5GA,SADA,OAEA,SDgHE,OAAA,EACA,YAAA,QACA,UAAA,QACA,YAAA,QAGF,OC9GA,MDgHE,SAAA,QAGF,OC9GA,ODgHE,eAAA,KC1GF,aACA,cD+GA,OCjHA,mBDqHE,mBAAA,OC9GF,gCACA,+BACA,gCDgHA,yBAIE,QAAA,EACA,aAAA,KC/GF,qBDkHA,kBAEE,mBAAA,WAAA,WAAA,WACA,QAAA,EAIF,iBCjHA,2BACA,kBAFA,iBD2HE,mBAAA,QAGF,SACE,SAAA,KAEA,OAAA,SAGF,SAME,UAAA,EAEA,QAAA,EACA,OAAA,EACA,OAAA,EAKF,OACE,QAAA,MACA,MAAA,KACA,UAAA,KACA,QAAA,EACA,cAAA,MACA,UAAA,OACA,YAAA,QACA,MAAA,QACA,YAAA,OAGF,SACE,eAAA,SEnIF,yCDMA,yCDmIE,OAAA,KEpIF,cF4IE,eAAA,KACA,mBAAA,KExIF,4CDMA,yCD2IE,mBAAA,KAQF,6BACE,KAAA,QACA,mBAAA,OAOF,OACE,QAAA,aAGF,QACE,QAAA,UAGF,SACE,QAAA,KErJF,SF2JE,QAAA"} \ No newline at end of file
diff --git a/library/bootstrap/css/bootstrap-theme.css b/library/bootstrap/css/bootstrap-theme.css
deleted file mode 100644
index 31d888266..000000000
--- a/library/bootstrap/css/bootstrap-theme.css
+++ /dev/null
@@ -1,587 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright 2011-2016 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- */
-.btn-default,
-.btn-primary,
-.btn-success,
-.btn-info,
-.btn-warning,
-.btn-danger {
- text-shadow: 0 -1px 0 rgba(0, 0, 0, .2);
- -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);
- box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);
-}
-.btn-default:active,
-.btn-primary:active,
-.btn-success:active,
-.btn-info:active,
-.btn-warning:active,
-.btn-danger:active,
-.btn-default.active,
-.btn-primary.active,
-.btn-success.active,
-.btn-info.active,
-.btn-warning.active,
-.btn-danger.active {
- -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
- box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
-}
-.btn-default.disabled,
-.btn-primary.disabled,
-.btn-success.disabled,
-.btn-info.disabled,
-.btn-warning.disabled,
-.btn-danger.disabled,
-.btn-default[disabled],
-.btn-primary[disabled],
-.btn-success[disabled],
-.btn-info[disabled],
-.btn-warning[disabled],
-.btn-danger[disabled],
-fieldset[disabled] .btn-default,
-fieldset[disabled] .btn-primary,
-fieldset[disabled] .btn-success,
-fieldset[disabled] .btn-info,
-fieldset[disabled] .btn-warning,
-fieldset[disabled] .btn-danger {
- -webkit-box-shadow: none;
- box-shadow: none;
-}
-.btn-default .badge,
-.btn-primary .badge,
-.btn-success .badge,
-.btn-info .badge,
-.btn-warning .badge,
-.btn-danger .badge {
- text-shadow: none;
-}
-.btn:active,
-.btn.active {
- background-image: none;
-}
-.btn-default {
- text-shadow: 0 1px 0 #fff;
- background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);
- background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%);
- background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0));
- background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
- background-repeat: repeat-x;
- border-color: #dbdbdb;
- border-color: #ccc;
-}
-.btn-default:hover,
-.btn-default:focus {
- background-color: #e0e0e0;
- background-position: 0 -15px;
-}
-.btn-default:active,
-.btn-default.active {
- background-color: #e0e0e0;
- border-color: #dbdbdb;
-}
-.btn-default.disabled,
-.btn-default[disabled],
-fieldset[disabled] .btn-default,
-.btn-default.disabled:hover,
-.btn-default[disabled]:hover,
-fieldset[disabled] .btn-default:hover,
-.btn-default.disabled:focus,
-.btn-default[disabled]:focus,
-fieldset[disabled] .btn-default:focus,
-.btn-default.disabled.focus,
-.btn-default[disabled].focus,
-fieldset[disabled] .btn-default.focus,
-.btn-default.disabled:active,
-.btn-default[disabled]:active,
-fieldset[disabled] .btn-default:active,
-.btn-default.disabled.active,
-.btn-default[disabled].active,
-fieldset[disabled] .btn-default.active {
- background-color: #e0e0e0;
- background-image: none;
-}
-.btn-primary {
- background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);
- background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%);
- background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#265a88));
- background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
- background-repeat: repeat-x;
- border-color: #245580;
-}
-.btn-primary:hover,
-.btn-primary:focus {
- background-color: #265a88;
- background-position: 0 -15px;
-}
-.btn-primary:active,
-.btn-primary.active {
- background-color: #265a88;
- border-color: #245580;
-}
-.btn-primary.disabled,
-.btn-primary[disabled],
-fieldset[disabled] .btn-primary,
-.btn-primary.disabled:hover,
-.btn-primary[disabled]:hover,
-fieldset[disabled] .btn-primary:hover,
-.btn-primary.disabled:focus,
-.btn-primary[disabled]:focus,
-fieldset[disabled] .btn-primary:focus,
-.btn-primary.disabled.focus,
-.btn-primary[disabled].focus,
-fieldset[disabled] .btn-primary.focus,
-.btn-primary.disabled:active,
-.btn-primary[disabled]:active,
-fieldset[disabled] .btn-primary:active,
-.btn-primary.disabled.active,
-.btn-primary[disabled].active,
-fieldset[disabled] .btn-primary.active {
- background-color: #265a88;
- background-image: none;
-}
-.btn-success {
- background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);
- background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);
- background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641));
- background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
- background-repeat: repeat-x;
- border-color: #3e8f3e;
-}
-.btn-success:hover,
-.btn-success:focus {
- background-color: #419641;
- background-position: 0 -15px;
-}
-.btn-success:active,
-.btn-success.active {
- background-color: #419641;
- border-color: #3e8f3e;
-}
-.btn-success.disabled,
-.btn-success[disabled],
-fieldset[disabled] .btn-success,
-.btn-success.disabled:hover,
-.btn-success[disabled]:hover,
-fieldset[disabled] .btn-success:hover,
-.btn-success.disabled:focus,
-.btn-success[disabled]:focus,
-fieldset[disabled] .btn-success:focus,
-.btn-success.disabled.focus,
-.btn-success[disabled].focus,
-fieldset[disabled] .btn-success.focus,
-.btn-success.disabled:active,
-.btn-success[disabled]:active,
-fieldset[disabled] .btn-success:active,
-.btn-success.disabled.active,
-.btn-success[disabled].active,
-fieldset[disabled] .btn-success.active {
- background-color: #419641;
- background-image: none;
-}
-.btn-info {
- background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
- background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
- background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2));
- background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
- background-repeat: repeat-x;
- border-color: #28a4c9;
-}
-.btn-info:hover,
-.btn-info:focus {
- background-color: #2aabd2;
- background-position: 0 -15px;
-}
-.btn-info:active,
-.btn-info.active {
- background-color: #2aabd2;
- border-color: #28a4c9;
-}
-.btn-info.disabled,
-.btn-info[disabled],
-fieldset[disabled] .btn-info,
-.btn-info.disabled:hover,
-.btn-info[disabled]:hover,
-fieldset[disabled] .btn-info:hover,
-.btn-info.disabled:focus,
-.btn-info[disabled]:focus,
-fieldset[disabled] .btn-info:focus,
-.btn-info.disabled.focus,
-.btn-info[disabled].focus,
-fieldset[disabled] .btn-info.focus,
-.btn-info.disabled:active,
-.btn-info[disabled]:active,
-fieldset[disabled] .btn-info:active,
-.btn-info.disabled.active,
-.btn-info[disabled].active,
-fieldset[disabled] .btn-info.active {
- background-color: #2aabd2;
- background-image: none;
-}
-.btn-warning {
- background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
- background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
- background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316));
- background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
- background-repeat: repeat-x;
- border-color: #e38d13;
-}
-.btn-warning:hover,
-.btn-warning:focus {
- background-color: #eb9316;
- background-position: 0 -15px;
-}
-.btn-warning:active,
-.btn-warning.active {
- background-color: #eb9316;
- border-color: #e38d13;
-}
-.btn-warning.disabled,
-.btn-warning[disabled],
-fieldset[disabled] .btn-warning,
-.btn-warning.disabled:hover,
-.btn-warning[disabled]:hover,
-fieldset[disabled] .btn-warning:hover,
-.btn-warning.disabled:focus,
-.btn-warning[disabled]:focus,
-fieldset[disabled] .btn-warning:focus,
-.btn-warning.disabled.focus,
-.btn-warning[disabled].focus,
-fieldset[disabled] .btn-warning.focus,
-.btn-warning.disabled:active,
-.btn-warning[disabled]:active,
-fieldset[disabled] .btn-warning:active,
-.btn-warning.disabled.active,
-.btn-warning[disabled].active,
-fieldset[disabled] .btn-warning.active {
- background-color: #eb9316;
- background-image: none;
-}
-.btn-danger {
- background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
- background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
- background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a));
- background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
- background-repeat: repeat-x;
- border-color: #b92c28;
-}
-.btn-danger:hover,
-.btn-danger:focus {
- background-color: #c12e2a;
- background-position: 0 -15px;
-}
-.btn-danger:active,
-.btn-danger.active {
- background-color: #c12e2a;
- border-color: #b92c28;
-}
-.btn-danger.disabled,
-.btn-danger[disabled],
-fieldset[disabled] .btn-danger,
-.btn-danger.disabled:hover,
-.btn-danger[disabled]:hover,
-fieldset[disabled] .btn-danger:hover,
-.btn-danger.disabled:focus,
-.btn-danger[disabled]:focus,
-fieldset[disabled] .btn-danger:focus,
-.btn-danger.disabled.focus,
-.btn-danger[disabled].focus,
-fieldset[disabled] .btn-danger.focus,
-.btn-danger.disabled:active,
-.btn-danger[disabled]:active,
-fieldset[disabled] .btn-danger:active,
-.btn-danger.disabled.active,
-.btn-danger[disabled].active,
-fieldset[disabled] .btn-danger.active {
- background-color: #c12e2a;
- background-image: none;
-}
-.thumbnail,
-.img-thumbnail {
- -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
- box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
-}
-.dropdown-menu > li > a:hover,
-.dropdown-menu > li > a:focus {
- background-color: #e8e8e8;
- background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
- background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
- background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));
- background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
- background-repeat: repeat-x;
-}
-.dropdown-menu > .active > a,
-.dropdown-menu > .active > a:hover,
-.dropdown-menu > .active > a:focus {
- background-color: #2e6da4;
- background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
- background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
- background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));
- background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);
- background-repeat: repeat-x;
-}
-.navbar-default {
- background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%);
- background-image: -o-linear-gradient(top, #fff 0%, #f8f8f8 100%);
- background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8));
- background-image: linear-gradient(to bottom, #fff 0%, #f8f8f8 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
- background-repeat: repeat-x;
- border-radius: 4px;
- -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);
- box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);
-}
-.navbar-default .navbar-nav > .open > a,
-.navbar-default .navbar-nav > .active > a {
- background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);
- background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);
- background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2));
- background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);
- background-repeat: repeat-x;
- -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);
- box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);
-}
-.navbar-brand,
-.navbar-nav > li > a {
- text-shadow: 0 1px 0 rgba(255, 255, 255, .25);
-}
-.navbar-inverse {
- background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);
- background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%);
- background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222));
- background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
- background-repeat: repeat-x;
- border-radius: 4px;
-}
-.navbar-inverse .navbar-nav > .open > a,
-.navbar-inverse .navbar-nav > .active > a {
- background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);
- background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);
- background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f));
- background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);
- background-repeat: repeat-x;
- -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);
- box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);
-}
-.navbar-inverse .navbar-brand,
-.navbar-inverse .navbar-nav > li > a {
- text-shadow: 0 -1px 0 rgba(0, 0, 0, .25);
-}
-.navbar-static-top,
-.navbar-fixed-top,
-.navbar-fixed-bottom {
- border-radius: 0;
-}
-@media (max-width: 767px) {
- .navbar .navbar-nav .open .dropdown-menu > .active > a,
- .navbar .navbar-nav .open .dropdown-menu > .active > a:hover,
- .navbar .navbar-nav .open .dropdown-menu > .active > a:focus {
- color: #fff;
- background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
- background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
- background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));
- background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);
- background-repeat: repeat-x;
- }
-}
-.alert {
- text-shadow: 0 1px 0 rgba(255, 255, 255, .2);
- -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);
- box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);
-}
-.alert-success {
- background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
- background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
- background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc));
- background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);
- background-repeat: repeat-x;
- border-color: #b2dba1;
-}
-.alert-info {
- background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
- background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
- background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0));
- background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);
- background-repeat: repeat-x;
- border-color: #9acfea;
-}
-.alert-warning {
- background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
- background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
- background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0));
- background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);
- background-repeat: repeat-x;
- border-color: #f5e79e;
-}
-.alert-danger {
- background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
- background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
- background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3));
- background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);
- background-repeat: repeat-x;
- border-color: #dca7a7;
-}
-.progress {
- background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
- background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
- background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5));
- background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);
- background-repeat: repeat-x;
-}
-.progress-bar {
- background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);
- background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%);
- background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#286090));
- background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);
- background-repeat: repeat-x;
-}
-.progress-bar-success {
- background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);
- background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);
- background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44));
- background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);
- background-repeat: repeat-x;
-}
-.progress-bar-info {
- background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
- background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
- background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5));
- background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);
- background-repeat: repeat-x;
-}
-.progress-bar-warning {
- background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
- background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
- background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f));
- background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);
- background-repeat: repeat-x;
-}
-.progress-bar-danger {
- background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);
- background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);
- background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c));
- background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);
- background-repeat: repeat-x;
-}
-.progress-bar-striped {
- background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
- background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
- background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
-}
-.list-group {
- border-radius: 4px;
- -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
- box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
-}
-.list-group-item.active,
-.list-group-item.active:hover,
-.list-group-item.active:focus {
- text-shadow: 0 -1px 0 #286090;
- background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);
- background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);
- background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2b669a));
- background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);
- background-repeat: repeat-x;
- border-color: #2b669a;
-}
-.list-group-item.active .badge,
-.list-group-item.active:hover .badge,
-.list-group-item.active:focus .badge {
- text-shadow: none;
-}
-.panel {
- -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05);
- box-shadow: 0 1px 2px rgba(0, 0, 0, .05);
-}
-.panel-default > .panel-heading {
- background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
- background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
- background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));
- background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
- background-repeat: repeat-x;
-}
-.panel-primary > .panel-heading {
- background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
- background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
- background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));
- background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);
- background-repeat: repeat-x;
-}
-.panel-success > .panel-heading {
- background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);
- background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);
- background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6));
- background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);
- background-repeat: repeat-x;
-}
-.panel-info > .panel-heading {
- background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
- background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
- background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3));
- background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);
- background-repeat: repeat-x;
-}
-.panel-warning > .panel-heading {
- background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);
- background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);
- background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc));
- background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);
- background-repeat: repeat-x;
-}
-.panel-danger > .panel-heading {
- background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);
- background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);
- background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc));
- background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);
- background-repeat: repeat-x;
-}
-.well {
- background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
- background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
- background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5));
- background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);
- background-repeat: repeat-x;
- border-color: #dcdcdc;
- -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);
- box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);
-}
-/*# sourceMappingURL=bootstrap-theme.css.map */
diff --git a/library/bootstrap/css/bootstrap-theme.css.map b/library/bootstrap/css/bootstrap-theme.css.map
deleted file mode 100644
index d876f60fb..000000000
--- a/library/bootstrap/css/bootstrap-theme.css.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["bootstrap-theme.css","less/theme.less","less/mixins/vendor-prefixes.less","less/mixins/gradients.less","less/mixins/reset-filter.less"],"names":[],"mappings":"AAAA;;;;GAIG;ACeH;;;;;;EAME,yCAAA;EC2CA,4FAAA;EACQ,oFAAA;CFvDT;ACgBC;;;;;;;;;;;;ECsCA,yDAAA;EACQ,iDAAA;CFxCT;ACMC;;;;;;;;;;;;;;;;;;ECiCA,yBAAA;EACQ,iBAAA;CFnBT;AC/BD;;;;;;EAuBI,kBAAA;CDgBH;ACyBC;;EAEE,uBAAA;CDvBH;AC4BD;EErEI,sEAAA;EACA,iEAAA;EACA,2FAAA;EAAA,oEAAA;EAEA,uHAAA;ECnBF,oEAAA;EH4CA,4BAAA;EACA,sBAAA;EAuC2C,0BAAA;EAA2B,mBAAA;CDjBvE;ACpBC;;EAEE,0BAAA;EACA,6BAAA;CDsBH;ACnBC;;EAEE,0BAAA;EACA,sBAAA;CDqBH;ACfG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACA,uBAAA;CD6BL;ACbD;EEtEI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EAEA,uHAAA;ECnBF,oEAAA;EH4CA,4BAAA;EACA,sBAAA;CD8DD;AC5DC;;EAEE,0BAAA;EACA,6BAAA;CD8DH;AC3DC;;EAEE,0BAAA;EACA,sBAAA;CD6DH;ACvDG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACA,uBAAA;CDqEL;ACpDD;EEvEI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EAEA,uHAAA;ECnBF,oEAAA;EH4CA,4BAAA;EACA,sBAAA;CDsGD;ACpGC;;EAEE,0BAAA;EACA,6BAAA;CDsGH;ACnGC;;EAEE,0BAAA;EACA,sBAAA;CDqGH;AC/FG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACA,uBAAA;CD6GL;AC3FD;EExEI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EAEA,uHAAA;ECnBF,oEAAA;EH4CA,4BAAA;EACA,sBAAA;CD8ID;AC5IC;;EAEE,0BAAA;EACA,6BAAA;CD8IH;AC3IC;;EAEE,0BAAA;EACA,sBAAA;CD6IH;ACvIG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACA,uBAAA;CDqJL;AClID;EEzEI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EAEA,uHAAA;ECnBF,oEAAA;EH4CA,4BAAA;EACA,sBAAA;CDsLD;ACpLC;;EAEE,0BAAA;EACA,6BAAA;CDsLH;ACnLC;;EAEE,0BAAA;EACA,sBAAA;CDqLH;AC/KG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACA,uBAAA;CD6LL;ACzKD;EE1EI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EAEA,uHAAA;ECnBF,oEAAA;EH4CA,4BAAA;EACA,sBAAA;CD8ND;AC5NC;;EAEE,0BAAA;EACA,6BAAA;CD8NH;AC3NC;;EAEE,0BAAA;EACA,sBAAA;CD6NH;ACvNG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACA,uBAAA;CDqOL;AC1MD;;EClCE,mDAAA;EACQ,2CAAA;CFgPT;ACrMD;;EE3FI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EF0FF,0BAAA;CD2MD;ACzMD;;;EEhGI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EFgGF,0BAAA;CD+MD;ACtMD;EE7GI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;ECnBF,oEAAA;EH+HA,mBAAA;ECjEA,4FAAA;EACQ,oFAAA;CF8QT;ACjND;;EE7GI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;ED2CF,yDAAA;EACQ,iDAAA;CFwRT;AC9MD;;EAEE,+CAAA;CDgND;AC5MD;EEhII,sEAAA;EACA,iEAAA;EACA,2FAAA;EAAA,oEAAA;EACA,4BAAA;EACA,uHAAA;ECnBF,oEAAA;EHkJA,mBAAA;CDkND;ACrND;;EEhII,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;ED2CF,wDAAA;EACQ,gDAAA;CF+ST;AC/ND;;EAYI,0CAAA;CDuNH;AClND;;;EAGE,iBAAA;CDoND;AC/LD;EAfI;;;IAGE,YAAA;IE7JF,yEAAA;IACA,oEAAA;IACA,8FAAA;IAAA,uEAAA;IACA,4BAAA;IACA,uHAAA;GH+WD;CACF;AC3MD;EACE,8CAAA;EC3HA,2FAAA;EACQ,mFAAA;CFyUT;ACnMD;EEtLI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EF8KF,sBAAA;CD+MD;AC1MD;EEvLI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EF8KF,sBAAA;CDuND;ACjND;EExLI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EF8KF,sBAAA;CD+ND;ACxND;EEzLI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EF8KF,sBAAA;CDuOD;ACxND;EEjMI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CH4ZH;ACrND;EE3MI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHmaH;AC3ND;EE5MI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CH0aH;ACjOD;EE7MI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHibH;ACvOD;EE9MI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHwbH;AC7OD;EE/MI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CH+bH;AChPD;EElLI,8MAAA;EACA,yMAAA;EACA,sMAAA;CHqaH;AC5OD;EACE,mBAAA;EC9KA,mDAAA;EACQ,2CAAA;CF6ZT;AC7OD;;;EAGE,8BAAA;EEnOE,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EFiOF,sBAAA;CDmPD;ACxPD;;;EAQI,kBAAA;CDqPH;AC3OD;ECnME,kDAAA;EACQ,0CAAA;CFibT;ACrOD;EE5PI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHoeH;AC3OD;EE7PI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CH2eH;ACjPD;EE9PI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHkfH;ACvPD;EE/PI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHyfH;AC7PD;EEhQI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHggBH;ACnQD;EEjQI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHugBH;ACnQD;EExQI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EFsQF,sBAAA;EC3NA,0FAAA;EACQ,kFAAA;CFqeT","file":"bootstrap-theme.css","sourcesContent":["/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.btn-default:active,\n.btn-primary:active,\n.btn-success:active,\n.btn-info:active,\n.btn-warning:active,\n.btn-danger:active,\n.btn-default.active,\n.btn-primary.active,\n.btn-success.active,\n.btn-info.active,\n.btn-warning.active,\n.btn-danger.active {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-default.disabled,\n.btn-primary.disabled,\n.btn-success.disabled,\n.btn-info.disabled,\n.btn-warning.disabled,\n.btn-danger.disabled,\n.btn-default[disabled],\n.btn-primary[disabled],\n.btn-success[disabled],\n.btn-info[disabled],\n.btn-warning[disabled],\n.btn-danger[disabled],\nfieldset[disabled] .btn-default,\nfieldset[disabled] .btn-primary,\nfieldset[disabled] .btn-success,\nfieldset[disabled] .btn-info,\nfieldset[disabled] .btn-warning,\nfieldset[disabled] .btn-danger {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-default .badge,\n.btn-primary .badge,\n.btn-success .badge,\n.btn-info .badge,\n.btn-warning .badge,\n.btn-danger .badge {\n text-shadow: none;\n}\n.btn:active,\n.btn.active {\n background-image: none;\n}\n.btn-default {\n background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #dbdbdb;\n text-shadow: 0 1px 0 #fff;\n border-color: #ccc;\n}\n.btn-default:hover,\n.btn-default:focus {\n background-color: #e0e0e0;\n background-position: 0 -15px;\n}\n.btn-default:active,\n.btn-default.active {\n background-color: #e0e0e0;\n border-color: #dbdbdb;\n}\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n background-color: #e0e0e0;\n background-image: none;\n}\n.btn-primary {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #245580;\n}\n.btn-primary:hover,\n.btn-primary:focus {\n background-color: #265a88;\n background-position: 0 -15px;\n}\n.btn-primary:active,\n.btn-primary.active {\n background-color: #265a88;\n border-color: #245580;\n}\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n background-color: #265a88;\n background-image: none;\n}\n.btn-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #3e8f3e;\n}\n.btn-success:hover,\n.btn-success:focus {\n background-color: #419641;\n background-position: 0 -15px;\n}\n.btn-success:active,\n.btn-success.active {\n background-color: #419641;\n border-color: #3e8f3e;\n}\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n background-color: #419641;\n background-image: none;\n}\n.btn-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #28a4c9;\n}\n.btn-info:hover,\n.btn-info:focus {\n background-color: #2aabd2;\n background-position: 0 -15px;\n}\n.btn-info:active,\n.btn-info.active {\n background-color: #2aabd2;\n border-color: #28a4c9;\n}\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n background-color: #2aabd2;\n background-image: none;\n}\n.btn-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #e38d13;\n}\n.btn-warning:hover,\n.btn-warning:focus {\n background-color: #eb9316;\n background-position: 0 -15px;\n}\n.btn-warning:active,\n.btn-warning.active {\n background-color: #eb9316;\n border-color: #e38d13;\n}\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n background-color: #eb9316;\n background-image: none;\n}\n.btn-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #b92c28;\n}\n.btn-danger:hover,\n.btn-danger:focus {\n background-color: #c12e2a;\n background-position: 0 -15px;\n}\n.btn-danger:active,\n.btn-danger.active {\n background-color: #c12e2a;\n border-color: #b92c28;\n}\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n background-color: #c12e2a;\n background-image: none;\n}\n.thumbnail,\n.img-thumbnail {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n background-color: #e8e8e8;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-color: #2e6da4;\n}\n.navbar-default {\n background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: -o-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);\n}\n.navbar-inverse {\n background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);\n background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%);\n background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n}\n.navbar-inverse .navbar-brand,\n.navbar-inverse .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n@media (max-width: 767px) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n }\n}\n.alert {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.alert-success {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);\n border-color: #b2dba1;\n}\n.alert-info {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);\n border-color: #9acfea;\n}\n.alert-warning {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);\n border-color: #f5e79e;\n}\n.alert-danger {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);\n border-color: #dca7a7;\n}\n.progress {\n background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);\n}\n.progress-bar {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);\n}\n.progress-bar-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);\n}\n.progress-bar-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);\n}\n.progress-bar-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);\n}\n.progress-bar-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);\n}\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.list-group {\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 #286090;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);\n border-color: #2b669a;\n}\n.list-group-item.active .badge,\n.list-group-item.active:hover .badge,\n.list-group-item.active:focus .badge {\n text-shadow: none;\n}\n.panel {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.panel-default > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n}\n.panel-primary > .panel-heading {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n}\n.panel-success > .panel-heading {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);\n}\n.panel-info > .panel-heading {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);\n}\n.panel-warning > .panel-heading {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);\n}\n.panel-danger > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);\n}\n.well {\n background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);\n border-color: #dcdcdc;\n -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n}\n/*# sourceMappingURL=bootstrap-theme.css.map */","/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\n\n\n//\n// Buttons\n// --------------------------------------------------\n\n// Common styles\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0,0,0,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n // Reset the shadow\n &:active,\n &.active {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n .box-shadow(none);\n }\n\n .badge {\n text-shadow: none;\n }\n}\n\n// Mixin for generating new styles\n.btn-styles(@btn-color: #555) {\n #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));\n .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners; see https://github.com/twbs/bootstrap/issues/10620\n background-repeat: repeat-x;\n border-color: darken(@btn-color, 14%);\n\n &:hover,\n &:focus {\n background-color: darken(@btn-color, 12%);\n background-position: 0 -15px;\n }\n\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n border-color: darken(@btn-color, 14%);\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &,\n &:hover,\n &:focus,\n &.focus,\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n background-image: none;\n }\n }\n}\n\n// Common styles\n.btn {\n // Remove the gradient for the pressed/active state\n &:active,\n &.active {\n background-image: none;\n }\n}\n\n// Apply the mixin to the buttons\n.btn-default { .btn-styles(@btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; }\n.btn-primary { .btn-styles(@btn-primary-bg); }\n.btn-success { .btn-styles(@btn-success-bg); }\n.btn-info { .btn-styles(@btn-info-bg); }\n.btn-warning { .btn-styles(@btn-warning-bg); }\n.btn-danger { .btn-styles(@btn-danger-bg); }\n\n\n//\n// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n\n\n//\n// Dropdowns\n// --------------------------------------------------\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));\n background-color: darken(@dropdown-link-hover-bg, 5%);\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n background-color: darken(@dropdown-link-active-bg, 5%);\n}\n\n\n//\n// Navbar\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n border-radius: @navbar-border-radius;\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: darken(@navbar-default-link-active-bg, 5%); @end-color: darken(@navbar-default-link-active-bg, 2%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.075));\n }\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255,255,255,.25);\n}\n\n// Inverted navbar\n.navbar-inverse {\n #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered; see https://github.com/twbs/bootstrap/issues/10257\n border-radius: @navbar-border-radius;\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: @navbar-inverse-link-active-bg; @end-color: lighten(@navbar-inverse-link-active-bg, 2.5%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.25));\n }\n\n .navbar-brand,\n .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0,0,0,.25);\n }\n}\n\n// Undo rounded corners in static and fixed navbars\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n\n// Fix active state of dropdown items in collapsed mode\n@media (max-width: @grid-float-breakpoint-max) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: #fff;\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n }\n }\n}\n\n\n//\n// Alerts\n// --------------------------------------------------\n\n// Common styles\n.alert {\n text-shadow: 0 1px 0 rgba(255,255,255,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);\n .box-shadow(@shadow);\n}\n\n// Mixin for generating new styles\n.alert-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\n border-color: darken(@color, 15%);\n}\n\n// Apply the mixin to the alerts\n.alert-success { .alert-styles(@alert-success-bg); }\n.alert-info { .alert-styles(@alert-info-bg); }\n.alert-warning { .alert-styles(@alert-warning-bg); }\n.alert-danger { .alert-styles(@alert-danger-bg); }\n\n\n//\n// Progress bars\n// --------------------------------------------------\n\n// Give the progress background some depth\n.progress {\n #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)\n}\n\n// Mixin for generating new styles\n.progress-bar-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\n}\n\n// Apply the mixin to the progress bars\n.progress-bar { .progress-bar-styles(@progress-bar-bg); }\n.progress-bar-success { .progress-bar-styles(@progress-bar-success-bg); }\n.progress-bar-info { .progress-bar-styles(@progress-bar-info-bg); }\n.progress-bar-warning { .progress-bar-styles(@progress-bar-warning-bg); }\n.progress-bar-danger { .progress-bar-styles(@progress-bar-danger-bg); }\n\n// Reset the striped class because our mixins don't do multiple gradients and\n// the above custom styles override the new `.progress-bar-striped` in v3.2.0.\n.progress-bar-striped {\n #gradient > .striped();\n}\n\n\n//\n// List groups\n// --------------------------------------------------\n\n.list-group {\n border-radius: @border-radius-base;\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\n #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\n border-color: darken(@list-group-active-border, 7.5%);\n\n .badge {\n text-shadow: none;\n }\n}\n\n\n//\n// Panels\n// --------------------------------------------------\n\n// Common styles\n.panel {\n .box-shadow(0 1px 2px rgba(0,0,0,.05));\n}\n\n// Mixin for generating new styles\n.panel-heading-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\n}\n\n// Apply the mixin to the panel headings only\n.panel-default > .panel-heading { .panel-heading-styles(@panel-default-heading-bg); }\n.panel-primary > .panel-heading { .panel-heading-styles(@panel-primary-heading-bg); }\n.panel-success > .panel-heading { .panel-heading-styles(@panel-success-heading-bg); }\n.panel-info > .panel-heading { .panel-heading-styles(@panel-info-heading-bg); }\n.panel-warning > .panel-heading { .panel-heading-styles(@panel-warning-heading-bg); }\n.panel-danger > .panel-heading { .panel-heading-styles(@panel-danger-heading-bg); }\n\n\n//\n// Wells\n// --------------------------------------------------\n\n.well {\n #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);\n border-color: darken(@well-bg, 10%);\n @shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They have been removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility) {\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n"]} \ No newline at end of file
diff --git a/library/bootstrap/css/bootstrap-theme.min.css b/library/bootstrap/css/bootstrap-theme.min.css
deleted file mode 100644
index 5e3940195..000000000
--- a/library/bootstrap/css/bootstrap-theme.min.css
+++ /dev/null
@@ -1,6 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright 2011-2016 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- */.btn-danger,.btn-default,.btn-info,.btn-primary,.btn-success,.btn-warning{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-danger.disabled,.btn-danger[disabled],.btn-default.disabled,.btn-default[disabled],.btn-info.disabled,.btn-info[disabled],.btn-primary.disabled,.btn-primary[disabled],.btn-success.disabled,.btn-success[disabled],.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-danger,fieldset[disabled] .btn-default,fieldset[disabled] .btn-info,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-success,fieldset[disabled] .btn-warning{-webkit-box-shadow:none;box-shadow:none}.btn-danger .badge,.btn-default .badge,.btn-info .badge,.btn-primary .badge,.btn-success .badge,.btn-warning .badge{text-shadow:none}.btn.active,.btn:active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc}.btn-default:focus,.btn-default:hover{background-color:#e0e0e0;background-position:0 -15px}.btn-default.active,.btn-default:active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-o-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#265a88));background-image:linear-gradient(to bottom,#337ab7 0,#265a88 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#245580}.btn-primary:focus,.btn-primary:hover{background-color:#265a88;background-position:0 -15px}.btn-primary.active,.btn-primary:active{background-color:#265a88;border-color:#245580}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#265a88;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:focus,.btn-success:hover{background-color:#419641;background-position:0 -15px}.btn-success.active,.btn-success:active{background-color:#419641;border-color:#3e8f3e}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:focus,.btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.btn-info.active,.btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:focus,.btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.btn-warning.active,.btn-warning:active{background-color:#eb9316;border-color:#e38d13}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:focus,.btn-danger:hover{background-color:#c12e2a;background-position:0 -15px}.btn-danger.active,.btn-danger:active{background-color:#c12e2a;border-color:#b92c28}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#c12e2a;background-image:none}.img-thumbnail,.thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{background-color:#2e6da4;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-o-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-o-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#286090));background-image:linear-gradient(to bottom,#337ab7 0,#286090 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2b669a));background-image:linear-gradient(to bottom,#337ab7 0,#2b669a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);background-repeat:repeat-x;border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:focus .badge,.list-group-item.active:hover .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)}
-/*# sourceMappingURL=bootstrap-theme.min.css.map */ \ No newline at end of file
diff --git a/library/bootstrap/css/bootstrap-theme.min.css.map b/library/bootstrap/css/bootstrap-theme.min.css.map
deleted file mode 100644
index 94813e900..000000000
--- a/library/bootstrap/css/bootstrap-theme.min.css.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["less/theme.less","less/mixins/vendor-prefixes.less","less/mixins/gradients.less","less/mixins/reset-filter.less"],"names":[],"mappings":";;;;AAmBA,YAAA,aAAA,UAAA,aAAA,aAAA,aAME,YAAA,EAAA,KAAA,EAAA,eC2CA,mBAAA,MAAA,EAAA,IAAA,EAAA,sBAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,EAAA,sBAAA,EAAA,IAAA,IAAA,iBDvCR,mBAAA,mBAAA,oBAAA,oBAAA,iBAAA,iBAAA,oBAAA,oBAAA,oBAAA,oBAAA,oBAAA,oBCsCA,mBAAA,MAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,iBDlCR,qBAAA,sBAAA,sBAAA,uBAAA,mBAAA,oBAAA,sBAAA,uBAAA,sBAAA,uBAAA,sBAAA,uBAAA,+BAAA,gCAAA,6BAAA,gCAAA,gCAAA,gCCiCA,mBAAA,KACQ,WAAA,KDlDV,mBAAA,oBAAA,iBAAA,oBAAA,oBAAA,oBAuBI,YAAA,KAyCF,YAAA,YAEE,iBAAA,KAKJ,aErEI,YAAA,EAAA,IAAA,EAAA,KACA,iBAAA,iDACA,iBAAA,4CAAA,iBAAA,qEAEA,iBAAA,+CCnBF,OAAA,+GH4CA,OAAA,0DACA,kBAAA,SAuC2C,aAAA,QAA2B,aAAA,KArCtE,mBAAA,mBAEE,iBAAA,QACA,oBAAA,EAAA,MAGF,oBAAA,oBAEE,iBAAA,QACA,aAAA,QAMA,sBAAA,6BAAA,4BAAA,6BAAA,4BAAA,4BAAA,uBAAA,8BAAA,6BAAA,8BAAA,6BAAA,6BAAA,gCAAA,uCAAA,sCAAA,uCAAA,sCAAA,sCAME,iBAAA,QACA,iBAAA,KAgBN,aEtEI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDAEA,OAAA,+GCnBF,OAAA,0DH4CA,kBAAA,SACA,aAAA,QAEA,mBAAA,mBAEE,iBAAA,QACA,oBAAA,EAAA,MAGF,oBAAA,oBAEE,iBAAA,QACA,aAAA,QAMA,sBAAA,6BAAA,4BAAA,6BAAA,4BAAA,4BAAA,uBAAA,8BAAA,6BAAA,8BAAA,6BAAA,6BAAA,gCAAA,uCAAA,sCAAA,uCAAA,sCAAA,sCAME,iBAAA,QACA,iBAAA,KAiBN,aEvEI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDAEA,OAAA,+GCnBF,OAAA,0DH4CA,kBAAA,SACA,aAAA,QAEA,mBAAA,mBAEE,iBAAA,QACA,oBAAA,EAAA,MAGF,oBAAA,oBAEE,iBAAA,QACA,aAAA,QAMA,sBAAA,6BAAA,4BAAA,6BAAA,4BAAA,4BAAA,uBAAA,8BAAA,6BAAA,8BAAA,6BAAA,6BAAA,gCAAA,uCAAA,sCAAA,uCAAA,sCAAA,sCAME,iBAAA,QACA,iBAAA,KAkBN,UExEI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDAEA,OAAA,+GCnBF,OAAA,0DH4CA,kBAAA,SACA,aAAA,QAEA,gBAAA,gBAEE,iBAAA,QACA,oBAAA,EAAA,MAGF,iBAAA,iBAEE,iBAAA,QACA,aAAA,QAMA,mBAAA,0BAAA,yBAAA,0BAAA,yBAAA,yBAAA,oBAAA,2BAAA,0BAAA,2BAAA,0BAAA,0BAAA,6BAAA,oCAAA,mCAAA,oCAAA,mCAAA,mCAME,iBAAA,QACA,iBAAA,KAmBN,aEzEI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDAEA,OAAA,+GCnBF,OAAA,0DH4CA,kBAAA,SACA,aAAA,QAEA,mBAAA,mBAEE,iBAAA,QACA,oBAAA,EAAA,MAGF,oBAAA,oBAEE,iBAAA,QACA,aAAA,QAMA,sBAAA,6BAAA,4BAAA,6BAAA,4BAAA,4BAAA,uBAAA,8BAAA,6BAAA,8BAAA,6BAAA,6BAAA,gCAAA,uCAAA,sCAAA,uCAAA,sCAAA,sCAME,iBAAA,QACA,iBAAA,KAoBN,YE1EI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDAEA,OAAA,+GCnBF,OAAA,0DH4CA,kBAAA,SACA,aAAA,QAEA,kBAAA,kBAEE,iBAAA,QACA,oBAAA,EAAA,MAGF,mBAAA,mBAEE,iBAAA,QACA,aAAA,QAMA,qBAAA,4BAAA,2BAAA,4BAAA,2BAAA,2BAAA,sBAAA,6BAAA,4BAAA,6BAAA,4BAAA,4BAAA,+BAAA,sCAAA,qCAAA,sCAAA,qCAAA,qCAME,iBAAA,QACA,iBAAA,KA2BN,eAAA,WClCE,mBAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,EAAA,IAAA,IAAA,iBD2CV,0BAAA,0BE3FI,iBAAA,QACA,iBAAA,oDACA,iBAAA,+CAAA,iBAAA,wEACA,iBAAA,kDACA,OAAA,+GF0FF,kBAAA,SAEF,yBAAA,+BAAA,+BEhGI,iBAAA,QACA,iBAAA,oDACA,iBAAA,+CAAA,iBAAA,wEACA,iBAAA,kDACA,OAAA,+GFgGF,kBAAA,SASF,gBE7GI,iBAAA,iDACA,iBAAA,4CACA,iBAAA,qEAAA,iBAAA,+CACA,OAAA,+GACA,OAAA,0DCnBF,kBAAA,SH+HA,cAAA,ICjEA,mBAAA,MAAA,EAAA,IAAA,EAAA,sBAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,EAAA,sBAAA,EAAA,IAAA,IAAA,iBD6DV,sCAAA,oCE7GI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SD2CF,mBAAA,MAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,iBD0EV,cAAA,iBAEE,YAAA,EAAA,IAAA,EAAA,sBAIF,gBEhII,iBAAA,iDACA,iBAAA,4CACA,iBAAA,qEAAA,iBAAA,+CACA,OAAA,+GACA,OAAA,0DCnBF,kBAAA,SHkJA,cAAA,IAHF,sCAAA,oCEhII,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SD2CF,mBAAA,MAAA,EAAA,IAAA,IAAA,gBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,gBDgFV,8BAAA,iCAYI,YAAA,EAAA,KAAA,EAAA,gBAKJ,qBAAA,kBAAA,mBAGE,cAAA,EAqBF,yBAfI,mDAAA,yDAAA,yDAGE,MAAA,KE7JF,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,UFqKJ,OACE,YAAA,EAAA,IAAA,EAAA,qBC3HA,mBAAA,MAAA,EAAA,IAAA,EAAA,sBAAA,EAAA,IAAA,IAAA,gBACQ,WAAA,MAAA,EAAA,IAAA,EAAA,sBAAA,EAAA,IAAA,IAAA,gBDsIV,eEtLI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF8KF,aAAA,QAKF,YEvLI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF8KF,aAAA,QAMF,eExLI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF8KF,aAAA,QAOF,cEzLI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF8KF,aAAA,QAeF,UEjMI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFuMJ,cE3MI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFwMJ,sBE5MI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFyMJ,mBE7MI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF0MJ,sBE9MI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF2MJ,qBE/MI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF+MJ,sBElLI,iBAAA,yKACA,iBAAA,oKACA,iBAAA,iKFyLJ,YACE,cAAA,IC9KA,mBAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,EAAA,IAAA,IAAA,iBDgLV,wBAAA,8BAAA,8BAGE,YAAA,EAAA,KAAA,EAAA,QEnOE,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFiOF,aAAA,QALF,+BAAA,qCAAA,qCAQI,YAAA,KAUJ,OCnME,mBAAA,EAAA,IAAA,IAAA,gBACQ,WAAA,EAAA,IAAA,IAAA,gBD4MV,8BE5PI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFyPJ,8BE7PI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF0PJ,8BE9PI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF2PJ,2BE/PI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF4PJ,8BEhQI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF6PJ,6BEjQI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFoQJ,MExQI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFsQF,aAAA,QC3NA,mBAAA,MAAA,EAAA,IAAA,IAAA,gBAAA,EAAA,IAAA,EAAA,qBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,gBAAA,EAAA,IAAA,EAAA","sourcesContent":["/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\n\n\n//\n// Buttons\n// --------------------------------------------------\n\n// Common styles\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0,0,0,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n // Reset the shadow\n &:active,\n &.active {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n .box-shadow(none);\n }\n\n .badge {\n text-shadow: none;\n }\n}\n\n// Mixin for generating new styles\n.btn-styles(@btn-color: #555) {\n #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));\n .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners; see https://github.com/twbs/bootstrap/issues/10620\n background-repeat: repeat-x;\n border-color: darken(@btn-color, 14%);\n\n &:hover,\n &:focus {\n background-color: darken(@btn-color, 12%);\n background-position: 0 -15px;\n }\n\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n border-color: darken(@btn-color, 14%);\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &,\n &:hover,\n &:focus,\n &.focus,\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n background-image: none;\n }\n }\n}\n\n// Common styles\n.btn {\n // Remove the gradient for the pressed/active state\n &:active,\n &.active {\n background-image: none;\n }\n}\n\n// Apply the mixin to the buttons\n.btn-default { .btn-styles(@btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; }\n.btn-primary { .btn-styles(@btn-primary-bg); }\n.btn-success { .btn-styles(@btn-success-bg); }\n.btn-info { .btn-styles(@btn-info-bg); }\n.btn-warning { .btn-styles(@btn-warning-bg); }\n.btn-danger { .btn-styles(@btn-danger-bg); }\n\n\n//\n// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n\n\n//\n// Dropdowns\n// --------------------------------------------------\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));\n background-color: darken(@dropdown-link-hover-bg, 5%);\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n background-color: darken(@dropdown-link-active-bg, 5%);\n}\n\n\n//\n// Navbar\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n border-radius: @navbar-border-radius;\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: darken(@navbar-default-link-active-bg, 5%); @end-color: darken(@navbar-default-link-active-bg, 2%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.075));\n }\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255,255,255,.25);\n}\n\n// Inverted navbar\n.navbar-inverse {\n #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered; see https://github.com/twbs/bootstrap/issues/10257\n border-radius: @navbar-border-radius;\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: @navbar-inverse-link-active-bg; @end-color: lighten(@navbar-inverse-link-active-bg, 2.5%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.25));\n }\n\n .navbar-brand,\n .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0,0,0,.25);\n }\n}\n\n// Undo rounded corners in static and fixed navbars\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n\n// Fix active state of dropdown items in collapsed mode\n@media (max-width: @grid-float-breakpoint-max) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: #fff;\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n }\n }\n}\n\n\n//\n// Alerts\n// --------------------------------------------------\n\n// Common styles\n.alert {\n text-shadow: 0 1px 0 rgba(255,255,255,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);\n .box-shadow(@shadow);\n}\n\n// Mixin for generating new styles\n.alert-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\n border-color: darken(@color, 15%);\n}\n\n// Apply the mixin to the alerts\n.alert-success { .alert-styles(@alert-success-bg); }\n.alert-info { .alert-styles(@alert-info-bg); }\n.alert-warning { .alert-styles(@alert-warning-bg); }\n.alert-danger { .alert-styles(@alert-danger-bg); }\n\n\n//\n// Progress bars\n// --------------------------------------------------\n\n// Give the progress background some depth\n.progress {\n #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)\n}\n\n// Mixin for generating new styles\n.progress-bar-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\n}\n\n// Apply the mixin to the progress bars\n.progress-bar { .progress-bar-styles(@progress-bar-bg); }\n.progress-bar-success { .progress-bar-styles(@progress-bar-success-bg); }\n.progress-bar-info { .progress-bar-styles(@progress-bar-info-bg); }\n.progress-bar-warning { .progress-bar-styles(@progress-bar-warning-bg); }\n.progress-bar-danger { .progress-bar-styles(@progress-bar-danger-bg); }\n\n// Reset the striped class because our mixins don't do multiple gradients and\n// the above custom styles override the new `.progress-bar-striped` in v3.2.0.\n.progress-bar-striped {\n #gradient > .striped();\n}\n\n\n//\n// List groups\n// --------------------------------------------------\n\n.list-group {\n border-radius: @border-radius-base;\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\n #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\n border-color: darken(@list-group-active-border, 7.5%);\n\n .badge {\n text-shadow: none;\n }\n}\n\n\n//\n// Panels\n// --------------------------------------------------\n\n// Common styles\n.panel {\n .box-shadow(0 1px 2px rgba(0,0,0,.05));\n}\n\n// Mixin for generating new styles\n.panel-heading-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\n}\n\n// Apply the mixin to the panel headings only\n.panel-default > .panel-heading { .panel-heading-styles(@panel-default-heading-bg); }\n.panel-primary > .panel-heading { .panel-heading-styles(@panel-primary-heading-bg); }\n.panel-success > .panel-heading { .panel-heading-styles(@panel-success-heading-bg); }\n.panel-info > .panel-heading { .panel-heading-styles(@panel-info-heading-bg); }\n.panel-warning > .panel-heading { .panel-heading-styles(@panel-warning-heading-bg); }\n.panel-danger > .panel-heading { .panel-heading-styles(@panel-danger-heading-bg); }\n\n\n//\n// Wells\n// --------------------------------------------------\n\n.well {\n #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);\n border-color: darken(@well-bg, 10%);\n @shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They have been removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility) {\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n"]} \ No newline at end of file
diff --git a/library/bootstrap/css/bootstrap.css b/library/bootstrap/css/bootstrap.css
index 6167622ce..1f46adfb9 100644
--- a/library/bootstrap/css/bootstrap.css
+++ b/library/bootstrap/css/bootstrap.css
@@ -1,200 +1,22 @@
/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright 2011-2016 Twitter, Inc.
+ * Bootstrap v4.0.0-alpha.6 (https://getbootstrap.com)
+ * Copyright 2011-2017 The Bootstrap Authors
+ * Copyright 2011-2017 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
*/
-/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */
-html {
- font-family: sans-serif;
- -webkit-text-size-adjust: 100%;
- -ms-text-size-adjust: 100%;
-}
-body {
- margin: 0;
-}
-article,
-aside,
-details,
-figcaption,
-figure,
-footer,
-header,
-hgroup,
-main,
-menu,
-nav,
-section,
-summary {
- display: block;
-}
-audio,
-canvas,
-progress,
-video {
- display: inline-block;
- vertical-align: baseline;
-}
-audio:not([controls]) {
- display: none;
- height: 0;
-}
-[hidden],
-template {
- display: none;
-}
-a {
- background-color: transparent;
-}
-a:active,
-a:hover {
- outline: 0;
-}
-abbr[title] {
- border-bottom: 1px dotted;
-}
-b,
-strong {
- font-weight: bold;
-}
-dfn {
- font-style: italic;
-}
-h1 {
- margin: .67em 0;
- font-size: 2em;
-}
-mark {
- color: #000;
- background: #ff0;
-}
-small {
- font-size: 80%;
-}
-sub,
-sup {
- position: relative;
- font-size: 75%;
- line-height: 0;
- vertical-align: baseline;
-}
-sup {
- top: -.5em;
-}
-sub {
- bottom: -.25em;
-}
-img {
- border: 0;
-}
-svg:not(:root) {
- overflow: hidden;
-}
-figure {
- margin: 1em 40px;
-}
-hr {
- height: 0;
- -webkit-box-sizing: content-box;
- -moz-box-sizing: content-box;
- box-sizing: content-box;
-}
-pre {
- overflow: auto;
-}
-code,
-kbd,
-pre,
-samp {
- font-family: monospace, monospace;
- font-size: 1em;
-}
-button,
-input,
-optgroup,
-select,
-textarea {
- margin: 0;
- font: inherit;
- color: inherit;
-}
-button {
- overflow: visible;
-}
-button,
-select {
- text-transform: none;
-}
-button,
-html input[type="button"],
-input[type="reset"],
-input[type="submit"] {
- -webkit-appearance: button;
- cursor: pointer;
-}
-button[disabled],
-html input[disabled] {
- cursor: default;
-}
-button::-moz-focus-inner,
-input::-moz-focus-inner {
- padding: 0;
- border: 0;
-}
-input {
- line-height: normal;
-}
-input[type="checkbox"],
-input[type="radio"] {
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- padding: 0;
-}
-input[type="number"]::-webkit-inner-spin-button,
-input[type="number"]::-webkit-outer-spin-button {
- height: auto;
-}
-input[type="search"] {
- -webkit-box-sizing: content-box;
- -moz-box-sizing: content-box;
- box-sizing: content-box;
- -webkit-appearance: textfield;
-}
-input[type="search"]::-webkit-search-cancel-button,
-input[type="search"]::-webkit-search-decoration {
- -webkit-appearance: none;
-}
-fieldset {
- padding: .35em .625em .75em;
- margin: 0 2px;
- border: 1px solid #c0c0c0;
-}
-legend {
- padding: 0;
- border: 0;
-}
-textarea {
- overflow: auto;
-}
-optgroup {
- font-weight: bold;
-}
-table {
- border-spacing: 0;
- border-collapse: collapse;
-}
-td,
-th {
- padding: 0;
-}
-/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */
@media print {
*,
- *:before,
- *:after {
- color: #000 !important;
+ *::before,
+ *::after,
+ p::first-letter,
+ div::first-letter,
+ blockquote::first-letter,
+ li::first-letter,
+ p::first-line,
+ div::first-line,
+ blockquote::first-line,
+ li::first-line {
text-shadow: none !important;
- background: transparent !important;
-webkit-box-shadow: none !important;
box-shadow: none !important;
}
@@ -202,20 +24,15 @@ th {
a:visited {
text-decoration: underline;
}
- a[href]:after {
- content: " (" attr(href) ")";
- }
- abbr[title]:after {
+ abbr[title]::after {
content: " (" attr(title) ")";
}
- a[href^="#"]:after,
- a[href^="javascript:"]:after {
- content: "";
+ pre {
+ white-space: pre-wrap !important;
}
pre,
blockquote {
border: 1px solid #999;
-
page-break-inside: avoid;
}
thead {
@@ -225,9 +42,6 @@ th {
img {
page-break-inside: avoid;
}
- img {
- max-width: 100% !important;
- }
p,
h2,
h3 {
@@ -241,11 +55,7 @@ th {
.navbar {
display: none;
}
- .btn > .caret,
- .dropup > .btn > .caret {
- border-top-color: #000 !important;
- }
- .label {
+ .badge {
border: 1px solid #000;
}
.table {
@@ -260,2663 +70,2171 @@ th {
border: 1px solid #ddd !important;
}
}
-@font-face {
- font-family: 'Glyphicons Halflings';
- src: url('../fonts/glyphicons-halflings-regular.eot');
- src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');
+html {
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ font-family: sans-serif;
+ line-height: 1.15;
+ -webkit-text-size-adjust: 100%;
+ -ms-text-size-adjust: 100%;
+ -ms-overflow-style: scrollbar;
+ -webkit-tap-highlight-color: transparent;
}
-.glyphicon {
- position: relative;
- top: 1px;
- display: inline-block;
- font-family: 'Glyphicons Halflings';
- font-style: normal;
- font-weight: normal;
- line-height: 1;
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
-}
-.glyphicon-asterisk:before {
- content: "\002a";
-}
-.glyphicon-plus:before {
- content: "\002b";
-}
-.glyphicon-euro:before,
-.glyphicon-eur:before {
- content: "\20ac";
-}
-.glyphicon-minus:before {
- content: "\2212";
-}
-.glyphicon-cloud:before {
- content: "\2601";
-}
-.glyphicon-envelope:before {
- content: "\2709";
-}
-.glyphicon-pencil:before {
- content: "\270f";
-}
-.glyphicon-glass:before {
- content: "\e001";
-}
-.glyphicon-music:before {
- content: "\e002";
-}
-.glyphicon-search:before {
- content: "\e003";
-}
-.glyphicon-heart:before {
- content: "\e005";
-}
-.glyphicon-star:before {
- content: "\e006";
-}
-.glyphicon-star-empty:before {
- content: "\e007";
-}
-.glyphicon-user:before {
- content: "\e008";
-}
-.glyphicon-film:before {
- content: "\e009";
-}
-.glyphicon-th-large:before {
- content: "\e010";
-}
-.glyphicon-th:before {
- content: "\e011";
-}
-.glyphicon-th-list:before {
- content: "\e012";
-}
-.glyphicon-ok:before {
- content: "\e013";
-}
-.glyphicon-remove:before {
- content: "\e014";
-}
-.glyphicon-zoom-in:before {
- content: "\e015";
-}
-.glyphicon-zoom-out:before {
- content: "\e016";
-}
-.glyphicon-off:before {
- content: "\e017";
-}
-.glyphicon-signal:before {
- content: "\e018";
-}
-.glyphicon-cog:before {
- content: "\e019";
-}
-.glyphicon-trash:before {
- content: "\e020";
-}
-.glyphicon-home:before {
- content: "\e021";
-}
-.glyphicon-file:before {
- content: "\e022";
-}
-.glyphicon-time:before {
- content: "\e023";
-}
-.glyphicon-road:before {
- content: "\e024";
-}
-.glyphicon-download-alt:before {
- content: "\e025";
-}
-.glyphicon-download:before {
- content: "\e026";
-}
-.glyphicon-upload:before {
- content: "\e027";
-}
-.glyphicon-inbox:before {
- content: "\e028";
-}
-.glyphicon-play-circle:before {
- content: "\e029";
-}
-.glyphicon-repeat:before {
- content: "\e030";
-}
-.glyphicon-refresh:before {
- content: "\e031";
-}
-.glyphicon-list-alt:before {
- content: "\e032";
-}
-.glyphicon-lock:before {
- content: "\e033";
-}
-.glyphicon-flag:before {
- content: "\e034";
-}
-.glyphicon-headphones:before {
- content: "\e035";
-}
-.glyphicon-volume-off:before {
- content: "\e036";
-}
-.glyphicon-volume-down:before {
- content: "\e037";
-}
-.glyphicon-volume-up:before {
- content: "\e038";
-}
-.glyphicon-qrcode:before {
- content: "\e039";
-}
-.glyphicon-barcode:before {
- content: "\e040";
-}
-.glyphicon-tag:before {
- content: "\e041";
-}
-.glyphicon-tags:before {
- content: "\e042";
-}
-.glyphicon-book:before {
- content: "\e043";
-}
-.glyphicon-bookmark:before {
- content: "\e044";
-}
-.glyphicon-print:before {
- content: "\e045";
-}
-.glyphicon-camera:before {
- content: "\e046";
-}
-.glyphicon-font:before {
- content: "\e047";
-}
-.glyphicon-bold:before {
- content: "\e048";
-}
-.glyphicon-italic:before {
- content: "\e049";
-}
-.glyphicon-text-height:before {
- content: "\e050";
-}
-.glyphicon-text-width:before {
- content: "\e051";
-}
-.glyphicon-align-left:before {
- content: "\e052";
-}
-.glyphicon-align-center:before {
- content: "\e053";
-}
-.glyphicon-align-right:before {
- content: "\e054";
-}
-.glyphicon-align-justify:before {
- content: "\e055";
-}
-.glyphicon-list:before {
- content: "\e056";
-}
-.glyphicon-indent-left:before {
- content: "\e057";
-}
-.glyphicon-indent-right:before {
- content: "\e058";
-}
-.glyphicon-facetime-video:before {
- content: "\e059";
-}
-.glyphicon-picture:before {
- content: "\e060";
-}
-.glyphicon-map-marker:before {
- content: "\e062";
-}
-.glyphicon-adjust:before {
- content: "\e063";
-}
-.glyphicon-tint:before {
- content: "\e064";
-}
-.glyphicon-edit:before {
- content: "\e065";
-}
-.glyphicon-share:before {
- content: "\e066";
-}
-.glyphicon-check:before {
- content: "\e067";
-}
-.glyphicon-move:before {
- content: "\e068";
-}
-.glyphicon-step-backward:before {
- content: "\e069";
-}
-.glyphicon-fast-backward:before {
- content: "\e070";
-}
-.glyphicon-backward:before {
- content: "\e071";
-}
-.glyphicon-play:before {
- content: "\e072";
-}
-.glyphicon-pause:before {
- content: "\e073";
-}
-.glyphicon-stop:before {
- content: "\e074";
-}
-.glyphicon-forward:before {
- content: "\e075";
-}
-.glyphicon-fast-forward:before {
- content: "\e076";
-}
-.glyphicon-step-forward:before {
- content: "\e077";
-}
-.glyphicon-eject:before {
- content: "\e078";
-}
-.glyphicon-chevron-left:before {
- content: "\e079";
-}
-.glyphicon-chevron-right:before {
- content: "\e080";
-}
-.glyphicon-plus-sign:before {
- content: "\e081";
-}
-.glyphicon-minus-sign:before {
- content: "\e082";
-}
-.glyphicon-remove-sign:before {
- content: "\e083";
-}
-.glyphicon-ok-sign:before {
- content: "\e084";
-}
-.glyphicon-question-sign:before {
- content: "\e085";
-}
-.glyphicon-info-sign:before {
- content: "\e086";
-}
-.glyphicon-screenshot:before {
- content: "\e087";
-}
-.glyphicon-remove-circle:before {
- content: "\e088";
-}
-.glyphicon-ok-circle:before {
- content: "\e089";
-}
-.glyphicon-ban-circle:before {
- content: "\e090";
-}
-.glyphicon-arrow-left:before {
- content: "\e091";
-}
-.glyphicon-arrow-right:before {
- content: "\e092";
-}
-.glyphicon-arrow-up:before {
- content: "\e093";
-}
-.glyphicon-arrow-down:before {
- content: "\e094";
-}
-.glyphicon-share-alt:before {
- content: "\e095";
-}
-.glyphicon-resize-full:before {
- content: "\e096";
-}
-.glyphicon-resize-small:before {
- content: "\e097";
-}
-.glyphicon-exclamation-sign:before {
- content: "\e101";
-}
-.glyphicon-gift:before {
- content: "\e102";
-}
-.glyphicon-leaf:before {
- content: "\e103";
-}
-.glyphicon-fire:before {
- content: "\e104";
-}
-.glyphicon-eye-open:before {
- content: "\e105";
-}
-.glyphicon-eye-close:before {
- content: "\e106";
-}
-.glyphicon-warning-sign:before {
- content: "\e107";
-}
-.glyphicon-plane:before {
- content: "\e108";
-}
-.glyphicon-calendar:before {
- content: "\e109";
-}
-.glyphicon-random:before {
- content: "\e110";
-}
-.glyphicon-comment:before {
- content: "\e111";
-}
-.glyphicon-magnet:before {
- content: "\e112";
-}
-.glyphicon-chevron-up:before {
- content: "\e113";
-}
-.glyphicon-chevron-down:before {
- content: "\e114";
-}
-.glyphicon-retweet:before {
- content: "\e115";
-}
-.glyphicon-shopping-cart:before {
- content: "\e116";
+*,
+*::before,
+*::after {
+ -webkit-box-sizing: inherit;
+ box-sizing: inherit;
}
-.glyphicon-folder-close:before {
- content: "\e117";
-}
-.glyphicon-folder-open:before {
- content: "\e118";
-}
-.glyphicon-resize-vertical:before {
- content: "\e119";
-}
-.glyphicon-resize-horizontal:before {
- content: "\e120";
-}
-.glyphicon-hdd:before {
- content: "\e121";
-}
-.glyphicon-bullhorn:before {
- content: "\e122";
-}
-.glyphicon-bell:before {
- content: "\e123";
-}
-.glyphicon-certificate:before {
- content: "\e124";
-}
-.glyphicon-thumbs-up:before {
- content: "\e125";
-}
-.glyphicon-thumbs-down:before {
- content: "\e126";
-}
-.glyphicon-hand-right:before {
- content: "\e127";
-}
-.glyphicon-hand-left:before {
- content: "\e128";
-}
-.glyphicon-hand-up:before {
- content: "\e129";
-}
-.glyphicon-hand-down:before {
- content: "\e130";
-}
-.glyphicon-circle-arrow-right:before {
- content: "\e131";
-}
-.glyphicon-circle-arrow-left:before {
- content: "\e132";
-}
-.glyphicon-circle-arrow-up:before {
- content: "\e133";
-}
-.glyphicon-circle-arrow-down:before {
- content: "\e134";
-}
-.glyphicon-globe:before {
- content: "\e135";
-}
-.glyphicon-wrench:before {
- content: "\e136";
-}
-.glyphicon-tasks:before {
- content: "\e137";
-}
-.glyphicon-filter:before {
- content: "\e138";
-}
-.glyphicon-briefcase:before {
- content: "\e139";
-}
-.glyphicon-fullscreen:before {
- content: "\e140";
-}
-.glyphicon-dashboard:before {
- content: "\e141";
-}
-.glyphicon-paperclip:before {
- content: "\e142";
-}
-.glyphicon-heart-empty:before {
- content: "\e143";
-}
-.glyphicon-link:before {
- content: "\e144";
-}
-.glyphicon-phone:before {
- content: "\e145";
-}
-.glyphicon-pushpin:before {
- content: "\e146";
-}
-.glyphicon-usd:before {
- content: "\e148";
-}
-.glyphicon-gbp:before {
- content: "\e149";
-}
-.glyphicon-sort:before {
- content: "\e150";
-}
-.glyphicon-sort-by-alphabet:before {
- content: "\e151";
-}
-.glyphicon-sort-by-alphabet-alt:before {
- content: "\e152";
-}
-.glyphicon-sort-by-order:before {
- content: "\e153";
-}
-.glyphicon-sort-by-order-alt:before {
- content: "\e154";
-}
-.glyphicon-sort-by-attributes:before {
- content: "\e155";
-}
-.glyphicon-sort-by-attributes-alt:before {
- content: "\e156";
-}
-.glyphicon-unchecked:before {
- content: "\e157";
-}
-.glyphicon-expand:before {
- content: "\e158";
-}
-.glyphicon-collapse-down:before {
- content: "\e159";
-}
-.glyphicon-collapse-up:before {
- content: "\e160";
-}
-.glyphicon-log-in:before {
- content: "\e161";
-}
-.glyphicon-flash:before {
- content: "\e162";
-}
-.glyphicon-log-out:before {
- content: "\e163";
-}
-.glyphicon-new-window:before {
- content: "\e164";
-}
-.glyphicon-record:before {
- content: "\e165";
-}
-.glyphicon-save:before {
- content: "\e166";
-}
-.glyphicon-open:before {
- content: "\e167";
-}
-.glyphicon-saved:before {
- content: "\e168";
-}
-.glyphicon-import:before {
- content: "\e169";
-}
-.glyphicon-export:before {
- content: "\e170";
-}
-.glyphicon-send:before {
- content: "\e171";
-}
-.glyphicon-floppy-disk:before {
- content: "\e172";
-}
-.glyphicon-floppy-saved:before {
- content: "\e173";
-}
-.glyphicon-floppy-remove:before {
- content: "\e174";
-}
-.glyphicon-floppy-save:before {
- content: "\e175";
-}
-.glyphicon-floppy-open:before {
- content: "\e176";
-}
-.glyphicon-credit-card:before {
- content: "\e177";
-}
-.glyphicon-transfer:before {
- content: "\e178";
-}
-.glyphicon-cutlery:before {
- content: "\e179";
-}
-.glyphicon-header:before {
- content: "\e180";
-}
-.glyphicon-compressed:before {
- content: "\e181";
-}
-.glyphicon-earphone:before {
- content: "\e182";
-}
-.glyphicon-phone-alt:before {
- content: "\e183";
-}
-.glyphicon-tower:before {
- content: "\e184";
-}
-.glyphicon-stats:before {
- content: "\e185";
-}
-.glyphicon-sd-video:before {
- content: "\e186";
-}
-.glyphicon-hd-video:before {
- content: "\e187";
-}
-.glyphicon-subtitles:before {
- content: "\e188";
-}
-.glyphicon-sound-stereo:before {
- content: "\e189";
-}
-.glyphicon-sound-dolby:before {
- content: "\e190";
-}
-.glyphicon-sound-5-1:before {
- content: "\e191";
-}
-.glyphicon-sound-6-1:before {
- content: "\e192";
-}
-.glyphicon-sound-7-1:before {
- content: "\e193";
-}
-.glyphicon-copyright-mark:before {
- content: "\e194";
-}
-.glyphicon-registration-mark:before {
- content: "\e195";
-}
-.glyphicon-cloud-download:before {
- content: "\e197";
-}
-.glyphicon-cloud-upload:before {
- content: "\e198";
-}
-.glyphicon-tree-conifer:before {
- content: "\e199";
-}
-.glyphicon-tree-deciduous:before {
- content: "\e200";
-}
-.glyphicon-cd:before {
- content: "\e201";
-}
-.glyphicon-save-file:before {
- content: "\e202";
-}
-.glyphicon-open-file:before {
- content: "\e203";
-}
-.glyphicon-level-up:before {
- content: "\e204";
-}
-.glyphicon-copy:before {
- content: "\e205";
-}
-.glyphicon-paste:before {
- content: "\e206";
-}
-.glyphicon-alert:before {
- content: "\e209";
-}
-.glyphicon-equalizer:before {
- content: "\e210";
-}
-.glyphicon-king:before {
- content: "\e211";
-}
-.glyphicon-queen:before {
- content: "\e212";
-}
-.glyphicon-pawn:before {
- content: "\e213";
-}
-.glyphicon-bishop:before {
- content: "\e214";
-}
-.glyphicon-knight:before {
- content: "\e215";
-}
-.glyphicon-baby-formula:before {
- content: "\e216";
-}
-.glyphicon-tent:before {
- content: "\26fa";
-}
-.glyphicon-blackboard:before {
- content: "\e218";
-}
-.glyphicon-bed:before {
- content: "\e219";
-}
-.glyphicon-apple:before {
- content: "\f8ff";
-}
-.glyphicon-erase:before {
- content: "\e221";
-}
-.glyphicon-hourglass:before {
- content: "\231b";
-}
-.glyphicon-lamp:before {
- content: "\e223";
-}
-.glyphicon-duplicate:before {
- content: "\e224";
-}
-.glyphicon-piggy-bank:before {
- content: "\e225";
+
+@-ms-viewport {
+ width: device-width;
}
-.glyphicon-scissors:before {
- content: "\e226";
+
+body {
+ margin: 0;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
+ font-size: 1rem;
+ font-weight: normal;
+ line-height: 1.5;
+ color: #292b2c;
+ background-color: #fff;
}
-.glyphicon-bitcoin:before {
- content: "\e227";
+
+[tabindex="-1"]:focus {
+ outline: none !important;
}
-.glyphicon-btc:before {
- content: "\e227";
+
+hr {
+ -webkit-box-sizing: content-box;
+ box-sizing: content-box;
+ height: 0;
+ overflow: visible;
}
-.glyphicon-xbt:before {
- content: "\e227";
+
+h1, h2, h3, h4, h5, h6 {
+ margin-top: 0;
+ margin-bottom: .5rem;
}
-.glyphicon-yen:before {
- content: "\00a5";
+
+p {
+ margin-top: 0;
+ margin-bottom: 1rem;
}
-.glyphicon-jpy:before {
- content: "\00a5";
+
+abbr[title],
+abbr[data-original-title] {
+ text-decoration: underline;
+ text-decoration: underline dotted;
+ cursor: help;
+ border-bottom: 0;
}
-.glyphicon-ruble:before {
- content: "\20bd";
+
+address {
+ margin-bottom: 1rem;
+ font-style: normal;
+ line-height: inherit;
}
-.glyphicon-rub:before {
- content: "\20bd";
+
+ol,
+ul,
+dl {
+ margin-top: 0;
+ margin-bottom: 1rem;
}
-.glyphicon-scale:before {
- content: "\e230";
+
+ol ol,
+ul ul,
+ol ul,
+ul ol {
+ margin-bottom: 0;
}
-.glyphicon-ice-lolly:before {
- content: "\e231";
+
+dt {
+ font-weight: bold;
}
-.glyphicon-ice-lolly-tasted:before {
- content: "\e232";
+
+dd {
+ margin-bottom: .5rem;
+ margin-left: 0;
}
-.glyphicon-education:before {
- content: "\e233";
+
+blockquote {
+ margin: 0 0 1rem;
}
-.glyphicon-option-horizontal:before {
- content: "\e234";
+
+dfn {
+ font-style: italic;
}
-.glyphicon-option-vertical:before {
- content: "\e235";
+
+b,
+strong {
+ font-weight: bolder;
}
-.glyphicon-menu-hamburger:before {
- content: "\e236";
+
+small {
+ font-size: 80%;
}
-.glyphicon-modal-window:before {
- content: "\e237";
+
+sub,
+sup {
+ position: relative;
+ font-size: 75%;
+ line-height: 0;
+ vertical-align: baseline;
}
-.glyphicon-oil:before {
- content: "\e238";
+
+sub {
+ bottom: -.25em;
}
-.glyphicon-grain:before {
- content: "\e239";
+
+sup {
+ top: -.5em;
}
-.glyphicon-sunglasses:before {
- content: "\e240";
+
+a {
+ color: #0275d8;
+ text-decoration: none;
+ background-color: transparent;
+ -webkit-text-decoration-skip: objects;
}
-.glyphicon-text-size:before {
- content: "\e241";
+
+a:hover {
+ color: #014c8c;
+ text-decoration: underline;
}
-.glyphicon-text-color:before {
- content: "\e242";
+
+a:not([href]):not([tabindex]) {
+ color: inherit;
+ text-decoration: none;
}
-.glyphicon-text-background:before {
- content: "\e243";
+
+a:not([href]):not([tabindex]):focus, a:not([href]):not([tabindex]):hover {
+ color: inherit;
+ text-decoration: none;
}
-.glyphicon-object-align-top:before {
- content: "\e244";
+
+a:not([href]):not([tabindex]):focus {
+ outline: 0;
}
-.glyphicon-object-align-bottom:before {
- content: "\e245";
+
+pre,
+code,
+kbd,
+samp {
+ font-family: monospace, monospace;
+ font-size: 1em;
}
-.glyphicon-object-align-horizontal:before {
- content: "\e246";
+
+pre {
+ margin-top: 0;
+ margin-bottom: 1rem;
+ overflow: auto;
}
-.glyphicon-object-align-left:before {
- content: "\e247";
+
+figure {
+ margin: 0 0 1rem;
}
-.glyphicon-object-align-vertical:before {
- content: "\e248";
+
+img {
+ vertical-align: middle;
+ border-style: none;
}
-.glyphicon-object-align-right:before {
- content: "\e249";
+
+svg:not(:root) {
+ overflow: hidden;
}
-.glyphicon-triangle-right:before {
- content: "\e250";
+
+a,
+area,
+button,
+[role="button"],
+input,
+label,
+select,
+summary,
+textarea {
+ -ms-touch-action: manipulation;
+ touch-action: manipulation;
}
-.glyphicon-triangle-left:before {
- content: "\e251";
+
+table {
+ border-collapse: collapse;
}
-.glyphicon-triangle-bottom:before {
- content: "\e252";
+
+caption {
+ padding-top: 0.75rem;
+ padding-bottom: 0.75rem;
+ color: #636c72;
+ text-align: left;
+ caption-side: bottom;
}
-.glyphicon-triangle-top:before {
- content: "\e253";
+
+th {
+ text-align: left;
}
-.glyphicon-console:before {
- content: "\e254";
+
+label {
+ display: inline-block;
+ margin-bottom: .5rem;
}
-.glyphicon-superscript:before {
- content: "\e255";
+
+button:focus {
+ outline: 1px dotted;
+ outline: 5px auto -webkit-focus-ring-color;
}
-.glyphicon-subscript:before {
- content: "\e256";
+
+input,
+button,
+select,
+optgroup,
+textarea {
+ margin: 0;
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
}
-.glyphicon-menu-left:before {
- content: "\e257";
+
+button,
+input {
+ overflow: visible;
}
-.glyphicon-menu-right:before {
- content: "\e258";
+
+button,
+select {
+ text-transform: none;
}
-.glyphicon-menu-down:before {
- content: "\e259";
+
+button,
+html [type="button"],
+[type="reset"],
+[type="submit"] {
+ -webkit-appearance: button;
}
-.glyphicon-menu-up:before {
- content: "\e260";
+
+button::-moz-focus-inner,
+[type="button"]::-moz-focus-inner,
+[type="reset"]::-moz-focus-inner,
+[type="submit"]::-moz-focus-inner {
+ padding: 0;
+ border-style: none;
}
-* {
+
+input[type="radio"],
+input[type="checkbox"] {
-webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
box-sizing: border-box;
+ padding: 0;
}
-*:before,
-*:after {
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
+
+input[type="date"],
+input[type="time"],
+input[type="datetime-local"],
+input[type="month"] {
+ -webkit-appearance: listbox;
}
-html {
- font-size: 10px;
- -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+textarea {
+ overflow: auto;
+ resize: vertical;
}
-body {
- font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
- font-size: 14px;
- line-height: 1.42857143;
- color: #333;
- background-color: #fff;
+
+fieldset {
+ min-width: 0;
+ padding: 0;
+ margin: 0;
+ border: 0;
}
-input,
-button,
-select,
-textarea {
- font-family: inherit;
- font-size: inherit;
+
+legend {
+ display: block;
+ width: 100%;
+ max-width: 100%;
+ padding: 0;
+ margin-bottom: .5rem;
+ font-size: 1.5rem;
line-height: inherit;
+ color: inherit;
+ white-space: normal;
}
-a {
- color: #337ab7;
- text-decoration: none;
+
+progress {
+ vertical-align: baseline;
}
-a:hover,
-a:focus {
- color: #23527c;
- text-decoration: underline;
+
+[type="number"]::-webkit-inner-spin-button,
+[type="number"]::-webkit-outer-spin-button {
+ height: auto;
}
-a:focus {
- outline: 5px auto -webkit-focus-ring-color;
+
+[type="search"] {
outline-offset: -2px;
+ -webkit-appearance: none;
}
-figure {
- margin: 0;
-}
-img {
- vertical-align: middle;
-}
-.img-responsive,
-.thumbnail > img,
-.thumbnail a > img,
-.carousel-inner > .item > img,
-.carousel-inner > .item > a > img {
- display: block;
- max-width: 100%;
- height: auto;
+
+[type="search"]::-webkit-search-cancel-button,
+[type="search"]::-webkit-search-decoration {
+ -webkit-appearance: none;
}
-.img-rounded {
- border-radius: 6px;
+
+::-webkit-file-upload-button {
+ font: inherit;
+ -webkit-appearance: button;
}
-.img-thumbnail {
+
+output {
display: inline-block;
- max-width: 100%;
- height: auto;
- padding: 4px;
- line-height: 1.42857143;
- background-color: #fff;
- border: 1px solid #ddd;
- border-radius: 4px;
- -webkit-transition: all .2s ease-in-out;
- -o-transition: all .2s ease-in-out;
- transition: all .2s ease-in-out;
}
-.img-circle {
- border-radius: 50%;
-}
-hr {
- margin-top: 20px;
- margin-bottom: 20px;
- border: 0;
- border-top: 1px solid #eee;
+
+summary {
+ display: list-item;
}
-.sr-only {
- position: absolute;
- width: 1px;
- height: 1px;
- padding: 0;
- margin: -1px;
- overflow: hidden;
- clip: rect(0, 0, 0, 0);
- border: 0;
+
+template {
+ display: none;
}
-.sr-only-focusable:active,
-.sr-only-focusable:focus {
- position: static;
- width: auto;
- height: auto;
- margin: 0;
- overflow: visible;
- clip: auto;
+
+[hidden] {
+ display: none !important;
}
-[role="button"] {
- cursor: pointer;
-}
-h1,
-h2,
-h3,
-h4,
-h5,
-h6,
-.h1,
-.h2,
-.h3,
-.h4,
-.h5,
-.h6 {
+
+h1, h2, h3, h4, h5, h6,
+.h1, .h2, .h3, .h4, .h5, .h6 {
+ margin-bottom: 0.5rem;
font-family: inherit;
font-weight: 500;
line-height: 1.1;
color: inherit;
}
-h1 small,
-h2 small,
-h3 small,
-h4 small,
-h5 small,
-h6 small,
-.h1 small,
-.h2 small,
-.h3 small,
-.h4 small,
-.h5 small,
-.h6 small,
-h1 .small,
-h2 .small,
-h3 .small,
-h4 .small,
-h5 .small,
-h6 .small,
-.h1 .small,
-.h2 .small,
-.h3 .small,
-.h4 .small,
-.h5 .small,
-.h6 .small {
- font-weight: normal;
- line-height: 1;
- color: #777;
-}
-h1,
-.h1,
-h2,
-.h2,
-h3,
-.h3 {
- margin-top: 20px;
- margin-bottom: 10px;
-}
-h1 small,
-.h1 small,
-h2 small,
-.h2 small,
-h3 small,
-.h3 small,
-h1 .small,
-.h1 .small,
-h2 .small,
-.h2 .small,
-h3 .small,
-.h3 .small {
- font-size: 65%;
-}
-h4,
-.h4,
-h5,
-.h5,
-h6,
-.h6 {
- margin-top: 10px;
- margin-bottom: 10px;
-}
-h4 small,
-.h4 small,
-h5 small,
-.h5 small,
-h6 small,
-.h6 small,
-h4 .small,
-.h4 .small,
-h5 .small,
-.h5 .small,
-h6 .small,
-.h6 .small {
- font-size: 75%;
+
+h1, .h1 {
+ font-size: 2.5rem;
}
-h1,
-.h1 {
- font-size: 36px;
+
+h2, .h2 {
+ font-size: 2rem;
}
-h2,
-.h2 {
- font-size: 30px;
+
+h3, .h3 {
+ font-size: 1.75rem;
}
-h3,
-.h3 {
- font-size: 24px;
+
+h4, .h4 {
+ font-size: 1.5rem;
}
-h4,
-.h4 {
- font-size: 18px;
+
+h5, .h5 {
+ font-size: 1.25rem;
}
-h5,
-.h5 {
- font-size: 14px;
+
+h6, .h6 {
+ font-size: 1rem;
}
-h6,
-.h6 {
- font-size: 12px;
+
+.lead {
+ font-size: 1.25rem;
+ font-weight: 300;
}
-p {
- margin: 0 0 10px;
+
+.display-1 {
+ font-size: 6rem;
+ font-weight: 300;
+ line-height: 1.1;
}
-.lead {
- margin-bottom: 20px;
- font-size: 16px;
+
+.display-2 {
+ font-size: 5.5rem;
font-weight: 300;
- line-height: 1.4;
+ line-height: 1.1;
}
-@media (min-width: 768px) {
- .lead {
- font-size: 21px;
- }
+
+.display-3 {
+ font-size: 4.5rem;
+ font-weight: 300;
+ line-height: 1.1;
+}
+
+.display-4 {
+ font-size: 3.5rem;
+ font-weight: 300;
+ line-height: 1.1;
+}
+
+hr {
+ margin-top: 1rem;
+ margin-bottom: 1rem;
+ border: 0;
+ border-top: 1px solid rgba(0, 0, 0, 0.1);
}
+
small,
.small {
- font-size: 85%;
+ font-size: 80%;
+ font-weight: normal;
}
+
mark,
.mark {
- padding: .2em;
+ padding: 0.2em;
background-color: #fcf8e3;
}
-.text-left {
- text-align: left;
-}
-.text-right {
- text-align: right;
-}
-.text-center {
- text-align: center;
-}
-.text-justify {
- text-align: justify;
-}
-.text-nowrap {
- white-space: nowrap;
-}
-.text-lowercase {
- text-transform: lowercase;
-}
-.text-uppercase {
- text-transform: uppercase;
-}
-.text-capitalize {
- text-transform: capitalize;
-}
-.text-muted {
- color: #777;
-}
-.text-primary {
- color: #337ab7;
-}
-a.text-primary:hover,
-a.text-primary:focus {
- color: #286090;
-}
-.text-success {
- color: #3c763d;
-}
-a.text-success:hover,
-a.text-success:focus {
- color: #2b542c;
-}
-.text-info {
- color: #31708f;
-}
-a.text-info:hover,
-a.text-info:focus {
- color: #245269;
-}
-.text-warning {
- color: #8a6d3b;
-}
-a.text-warning:hover,
-a.text-warning:focus {
- color: #66512c;
-}
-.text-danger {
- color: #a94442;
-}
-a.text-danger:hover,
-a.text-danger:focus {
- color: #843534;
-}
-.bg-primary {
- color: #fff;
- background-color: #337ab7;
-}
-a.bg-primary:hover,
-a.bg-primary:focus {
- background-color: #286090;
-}
-.bg-success {
- background-color: #dff0d8;
-}
-a.bg-success:hover,
-a.bg-success:focus {
- background-color: #c1e2b3;
-}
-.bg-info {
- background-color: #d9edf7;
-}
-a.bg-info:hover,
-a.bg-info:focus {
- background-color: #afd9ee;
-}
-.bg-warning {
- background-color: #fcf8e3;
-}
-a.bg-warning:hover,
-a.bg-warning:focus {
- background-color: #f7ecb5;
-}
-.bg-danger {
- background-color: #f2dede;
-}
-a.bg-danger:hover,
-a.bg-danger:focus {
- background-color: #e4b9b9;
-}
-.page-header {
- padding-bottom: 9px;
- margin: 40px 0 20px;
- border-bottom: 1px solid #eee;
-}
-ul,
-ol {
- margin-top: 0;
- margin-bottom: 10px;
-}
-ul ul,
-ol ul,
-ul ol,
-ol ol {
- margin-bottom: 0;
-}
+
.list-unstyled {
padding-left: 0;
list-style: none;
}
+
.list-inline {
padding-left: 0;
- margin-left: -5px;
list-style: none;
}
-.list-inline > li {
+
+.list-inline-item {
display: inline-block;
- padding-right: 5px;
- padding-left: 5px;
-}
-dl {
- margin-top: 0;
- margin-bottom: 20px;
}
-dt,
-dd {
- line-height: 1.42857143;
-}
-dt {
- font-weight: bold;
-}
-dd {
- margin-left: 0;
-}
-@media (min-width: 768px) {
- .dl-horizontal dt {
- float: left;
- width: 160px;
- overflow: hidden;
- clear: left;
- text-align: right;
- text-overflow: ellipsis;
- white-space: nowrap;
- }
- .dl-horizontal dd {
- margin-left: 180px;
- }
-}
-abbr[title],
-abbr[data-original-title] {
- cursor: help;
- border-bottom: 1px dotted #777;
+
+.list-inline-item:not(:last-child) {
+ margin-right: 5px;
}
+
.initialism {
font-size: 90%;
text-transform: uppercase;
}
-blockquote {
- padding: 10px 20px;
- margin: 0 0 20px;
- font-size: 17.5px;
- border-left: 5px solid #eee;
-}
-blockquote p:last-child,
-blockquote ul:last-child,
-blockquote ol:last-child {
- margin-bottom: 0;
+
+.blockquote {
+ padding: 0.5rem 1rem;
+ margin-bottom: 1rem;
+ font-size: 1.25rem;
+ border-left: 0.25rem solid #eceeef;
}
-blockquote footer,
-blockquote small,
-blockquote .small {
+
+.blockquote-footer {
display: block;
font-size: 80%;
- line-height: 1.42857143;
- color: #777;
+ color: #636c72;
}
-blockquote footer:before,
-blockquote small:before,
-blockquote .small:before {
- content: '\2014 \00A0';
+
+.blockquote-footer::before {
+ content: "\2014 \00A0";
}
-.blockquote-reverse,
-blockquote.pull-right {
- padding-right: 15px;
+
+.blockquote-reverse {
+ padding-right: 1rem;
padding-left: 0;
text-align: right;
- border-right: 5px solid #eee;
+ border-right: 0.25rem solid #eceeef;
border-left: 0;
}
-.blockquote-reverse footer:before,
-blockquote.pull-right footer:before,
-.blockquote-reverse small:before,
-blockquote.pull-right small:before,
-.blockquote-reverse .small:before,
-blockquote.pull-right .small:before {
- content: '';
-}
-.blockquote-reverse footer:after,
-blockquote.pull-right footer:after,
-.blockquote-reverse small:after,
-blockquote.pull-right small:after,
-.blockquote-reverse .small:after,
-blockquote.pull-right .small:after {
- content: '\00A0 \2014';
+
+.blockquote-reverse .blockquote-footer::before {
+ content: "";
}
-address {
- margin-bottom: 20px;
- font-style: normal;
- line-height: 1.42857143;
+
+.blockquote-reverse .blockquote-footer::after {
+ content: "\00A0 \2014";
}
+
+.img-fluid {
+ max-width: 100%;
+ height: auto;
+}
+
+.img-thumbnail {
+ padding: 0.25rem;
+ background-color: #fff;
+ border: 1px solid #ddd;
+ border-radius: 0.25rem;
+ -webkit-transition: all 0.2s ease-in-out;
+ -o-transition: all 0.2s ease-in-out;
+ transition: all 0.2s ease-in-out;
+ max-width: 100%;
+ height: auto;
+}
+
+.figure {
+ display: inline-block;
+}
+
+.figure-img {
+ margin-bottom: 0.5rem;
+ line-height: 1;
+}
+
+.figure-caption {
+ font-size: 90%;
+ color: #636c72;
+}
+
code,
kbd,
pre,
samp {
- font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
+ font-family: Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
}
+
code {
- padding: 2px 4px;
+ padding: 0.2rem 0.4rem;
font-size: 90%;
- color: #c7254e;
- background-color: #f9f2f4;
- border-radius: 4px;
+ color: #bd4147;
+ background-color: #f7f7f9;
+ border-radius: 0.25rem;
+}
+
+a > code {
+ padding: 0;
+ color: inherit;
+ background-color: inherit;
}
+
kbd {
- padding: 2px 4px;
+ padding: 0.2rem 0.4rem;
font-size: 90%;
color: #fff;
- background-color: #333;
- border-radius: 3px;
- -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);
- box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);
+ background-color: #292b2c;
+ border-radius: 0.2rem;
}
+
kbd kbd {
padding: 0;
font-size: 100%;
font-weight: bold;
- -webkit-box-shadow: none;
- box-shadow: none;
}
+
pre {
display: block;
- padding: 9.5px;
- margin: 0 0 10px;
- font-size: 13px;
- line-height: 1.42857143;
- color: #333;
- word-break: break-all;
- word-wrap: break-word;
- background-color: #f5f5f5;
- border: 1px solid #ccc;
- border-radius: 4px;
+ margin-top: 0;
+ margin-bottom: 1rem;
+ font-size: 90%;
+ color: #292b2c;
}
+
pre code {
padding: 0;
font-size: inherit;
color: inherit;
- white-space: pre-wrap;
background-color: transparent;
border-radius: 0;
}
+
.pre-scrollable {
max-height: 340px;
overflow-y: scroll;
}
+
.container {
- padding-right: 15px;
- padding-left: 15px;
margin-right: auto;
margin-left: auto;
+ padding-right: 15px;
+ padding-left: 15px;
}
+
+@media (min-width: 576px) {
+ .container {
+ padding-right: 15px;
+ padding-left: 15px;
+ }
+}
+
@media (min-width: 768px) {
.container {
- width: 750px;
+ padding-right: 15px;
+ padding-left: 15px;
}
}
+
@media (min-width: 992px) {
.container {
- width: 970px;
+ padding-right: 15px;
+ padding-left: 15px;
}
}
+
+@media (min-width: 1200px) {
+ .container {
+ padding-right: 15px;
+ padding-left: 15px;
+ }
+}
+
+@media (min-width: 576px) {
+ .container {
+ width: 540px;
+ max-width: 100%;
+ }
+}
+
+@media (min-width: 768px) {
+ .container {
+ width: 720px;
+ max-width: 100%;
+ }
+}
+
+@media (min-width: 992px) {
+ .container {
+ width: 960px;
+ max-width: 100%;
+ }
+}
+
@media (min-width: 1200px) {
.container {
- width: 1170px;
+ width: 1140px;
+ max-width: 100%;
}
}
+
.container-fluid {
- padding-right: 15px;
- padding-left: 15px;
+ width: 100%;
margin-right: auto;
margin-left: auto;
+ padding-right: 15px;
+ padding-left: 15px;
+}
+
+@media (min-width: 576px) {
+ .container-fluid {
+ padding-right: 15px;
+ padding-left: 15px;
+ }
+}
+
+@media (min-width: 768px) {
+ .container-fluid {
+ padding-right: 15px;
+ padding-left: 15px;
+ }
+}
+
+@media (min-width: 992px) {
+ .container-fluid {
+ padding-right: 15px;
+ padding-left: 15px;
+ }
}
+
+@media (min-width: 1200px) {
+ .container-fluid {
+ padding-right: 15px;
+ padding-left: 15px;
+ }
+}
+
.row {
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-flex-wrap: wrap;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
margin-right: -15px;
margin-left: -15px;
}
-.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {
+
+@media (min-width: 576px) {
+ .row {
+ margin-right: -15px;
+ margin-left: -15px;
+ }
+}
+
+@media (min-width: 768px) {
+ .row {
+ margin-right: -15px;
+ margin-left: -15px;
+ }
+}
+
+@media (min-width: 992px) {
+ .row {
+ margin-right: -15px;
+ margin-left: -15px;
+ }
+}
+
+@media (min-width: 1200px) {
+ .row {
+ margin-right: -15px;
+ margin-left: -15px;
+ }
+}
+
+.no-gutters {
+ margin-right: 0;
+ margin-left: 0;
+}
+
+.no-gutters > .col,
+.no-gutters > [class*="col-"] {
+ padding-right: 0;
+ padding-left: 0;
+}
+
+.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,
+.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,
+.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,
+.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,
+.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,
+.col-xl-auto {
position: relative;
+ width: 100%;
min-height: 1px;
padding-right: 15px;
padding-left: 15px;
}
-.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {
- float: left;
+
+@media (min-width: 576px) {
+ .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,
+ .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,
+ .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,
+ .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,
+ .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,
+ .col-xl-auto {
+ padding-right: 15px;
+ padding-left: 15px;
+ }
}
-.col-xs-12 {
- width: 100%;
+
+@media (min-width: 768px) {
+ .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,
+ .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,
+ .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,
+ .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,
+ .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,
+ .col-xl-auto {
+ padding-right: 15px;
+ padding-left: 15px;
+ }
}
-.col-xs-11 {
- width: 91.66666667%;
+
+@media (min-width: 992px) {
+ .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,
+ .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,
+ .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,
+ .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,
+ .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,
+ .col-xl-auto {
+ padding-right: 15px;
+ padding-left: 15px;
+ }
}
-.col-xs-10 {
- width: 83.33333333%;
+
+@media (min-width: 1200px) {
+ .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,
+ .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,
+ .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,
+ .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,
+ .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,
+ .col-xl-auto {
+ padding-right: 15px;
+ padding-left: 15px;
+ }
}
-.col-xs-9 {
- width: 75%;
+
+.col {
+ -webkit-flex-basis: 0;
+ -ms-flex-preferred-size: 0;
+ flex-basis: 0;
+ -webkit-box-flex: 1;
+ -webkit-flex-grow: 1;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ max-width: 100%;
+}
+
+.col-auto {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 auto;
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
+ width: auto;
}
-.col-xs-8 {
- width: 66.66666667%;
+
+.col-1 {
+ width: 8.333333%;
+}
+
+.col-2 {
+ width: 16.666667%;
+}
+
+.col-3 {
+ width: 25%;
+}
+
+.col-4 {
+ width: 33.333333%;
}
-.col-xs-7 {
- width: 58.33333333%;
+
+.col-5 {
+ width: 41.666667%;
}
-.col-xs-6 {
+
+.col-6 {
width: 50%;
}
-.col-xs-5 {
- width: 41.66666667%;
+
+.col-7 {
+ width: 58.333333%;
}
-.col-xs-4 {
- width: 33.33333333%;
+
+.col-8 {
+ width: 66.666667%;
}
-.col-xs-3 {
- width: 25%;
+
+.col-9 {
+ width: 75%;
}
-.col-xs-2 {
- width: 16.66666667%;
+
+.col-10 {
+ width: 83.333333%;
}
-.col-xs-1 {
- width: 8.33333333%;
+
+.col-11 {
+ width: 91.666667%;
}
-.col-xs-pull-12 {
- right: 100%;
+
+.col-12 {
+ width: 100%;
}
-.col-xs-pull-11 {
- right: 91.66666667%;
+
+.pull-0 {
+ right: auto;
}
-.col-xs-pull-10 {
- right: 83.33333333%;
+
+.pull-1 {
+ right: 8.333333%;
}
-.col-xs-pull-9 {
- right: 75%;
+
+.pull-2 {
+ right: 16.666667%;
}
-.col-xs-pull-8 {
- right: 66.66666667%;
+
+.pull-3 {
+ right: 25%;
}
-.col-xs-pull-7 {
- right: 58.33333333%;
+
+.pull-4 {
+ right: 33.333333%;
}
-.col-xs-pull-6 {
+
+.pull-5 {
+ right: 41.666667%;
+}
+
+.pull-6 {
right: 50%;
}
-.col-xs-pull-5 {
- right: 41.66666667%;
+
+.pull-7 {
+ right: 58.333333%;
}
-.col-xs-pull-4 {
- right: 33.33333333%;
+
+.pull-8 {
+ right: 66.666667%;
}
-.col-xs-pull-3 {
- right: 25%;
+
+.pull-9 {
+ right: 75%;
}
-.col-xs-pull-2 {
- right: 16.66666667%;
+
+.pull-10 {
+ right: 83.333333%;
}
-.col-xs-pull-1 {
- right: 8.33333333%;
+
+.pull-11 {
+ right: 91.666667%;
}
-.col-xs-pull-0 {
- right: auto;
+
+.pull-12 {
+ right: 100%;
}
-.col-xs-push-12 {
- left: 100%;
+
+.push-0 {
+ left: auto;
}
-.col-xs-push-11 {
- left: 91.66666667%;
+
+.push-1 {
+ left: 8.333333%;
}
-.col-xs-push-10 {
- left: 83.33333333%;
+
+.push-2 {
+ left: 16.666667%;
}
-.col-xs-push-9 {
- left: 75%;
+
+.push-3 {
+ left: 25%;
}
-.col-xs-push-8 {
- left: 66.66666667%;
+
+.push-4 {
+ left: 33.333333%;
}
-.col-xs-push-7 {
- left: 58.33333333%;
+
+.push-5 {
+ left: 41.666667%;
}
-.col-xs-push-6 {
+
+.push-6 {
left: 50%;
}
-.col-xs-push-5 {
- left: 41.66666667%;
-}
-.col-xs-push-4 {
- left: 33.33333333%;
+
+.push-7 {
+ left: 58.333333%;
}
-.col-xs-push-3 {
- left: 25%;
+
+.push-8 {
+ left: 66.666667%;
}
-.col-xs-push-2 {
- left: 16.66666667%;
+
+.push-9 {
+ left: 75%;
}
-.col-xs-push-1 {
- left: 8.33333333%;
+
+.push-10 {
+ left: 83.333333%;
}
-.col-xs-push-0 {
- left: auto;
+
+.push-11 {
+ left: 91.666667%;
}
-.col-xs-offset-12 {
- margin-left: 100%;
+
+.push-12 {
+ left: 100%;
}
-.col-xs-offset-11 {
- margin-left: 91.66666667%;
+
+.offset-1 {
+ margin-left: 8.333333%;
}
-.col-xs-offset-10 {
- margin-left: 83.33333333%;
+
+.offset-2 {
+ margin-left: 16.666667%;
}
-.col-xs-offset-9 {
- margin-left: 75%;
+
+.offset-3 {
+ margin-left: 25%;
}
-.col-xs-offset-8 {
- margin-left: 66.66666667%;
+
+.offset-4 {
+ margin-left: 33.333333%;
}
-.col-xs-offset-7 {
- margin-left: 58.33333333%;
+
+.offset-5 {
+ margin-left: 41.666667%;
}
-.col-xs-offset-6 {
+
+.offset-6 {
margin-left: 50%;
}
-.col-xs-offset-5 {
- margin-left: 41.66666667%;
-}
-.col-xs-offset-4 {
- margin-left: 33.33333333%;
+
+.offset-7 {
+ margin-left: 58.333333%;
}
-.col-xs-offset-3 {
- margin-left: 25%;
+
+.offset-8 {
+ margin-left: 66.666667%;
}
-.col-xs-offset-2 {
- margin-left: 16.66666667%;
+
+.offset-9 {
+ margin-left: 75%;
}
-.col-xs-offset-1 {
- margin-left: 8.33333333%;
+
+.offset-10 {
+ margin-left: 83.333333%;
}
-.col-xs-offset-0 {
- margin-left: 0;
+
+.offset-11 {
+ margin-left: 91.666667%;
}
-@media (min-width: 768px) {
- .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {
- float: left;
- }
- .col-sm-12 {
- width: 100%;
+
+@media (min-width: 576px) {
+ .col-sm {
+ -webkit-flex-basis: 0;
+ -ms-flex-preferred-size: 0;
+ flex-basis: 0;
+ -webkit-box-flex: 1;
+ -webkit-flex-grow: 1;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ max-width: 100%;
+ }
+ .col-sm-auto {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 auto;
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
+ width: auto;
}
- .col-sm-11 {
- width: 91.66666667%;
+ .col-sm-1 {
+ width: 8.333333%;
}
- .col-sm-10 {
- width: 83.33333333%;
+ .col-sm-2 {
+ width: 16.666667%;
}
- .col-sm-9 {
- width: 75%;
+ .col-sm-3 {
+ width: 25%;
}
- .col-sm-8 {
- width: 66.66666667%;
+ .col-sm-4 {
+ width: 33.333333%;
}
- .col-sm-7 {
- width: 58.33333333%;
+ .col-sm-5 {
+ width: 41.666667%;
}
.col-sm-6 {
width: 50%;
}
- .col-sm-5 {
- width: 41.66666667%;
+ .col-sm-7 {
+ width: 58.333333%;
}
- .col-sm-4 {
- width: 33.33333333%;
+ .col-sm-8 {
+ width: 66.666667%;
}
- .col-sm-3 {
- width: 25%;
+ .col-sm-9 {
+ width: 75%;
}
- .col-sm-2 {
- width: 16.66666667%;
+ .col-sm-10 {
+ width: 83.333333%;
}
- .col-sm-1 {
- width: 8.33333333%;
+ .col-sm-11 {
+ width: 91.666667%;
}
- .col-sm-pull-12 {
- right: 100%;
+ .col-sm-12 {
+ width: 100%;
+ }
+ .pull-sm-0 {
+ right: auto;
}
- .col-sm-pull-11 {
- right: 91.66666667%;
+ .pull-sm-1 {
+ right: 8.333333%;
}
- .col-sm-pull-10 {
- right: 83.33333333%;
+ .pull-sm-2 {
+ right: 16.666667%;
}
- .col-sm-pull-9 {
- right: 75%;
+ .pull-sm-3 {
+ right: 25%;
}
- .col-sm-pull-8 {
- right: 66.66666667%;
+ .pull-sm-4 {
+ right: 33.333333%;
}
- .col-sm-pull-7 {
- right: 58.33333333%;
+ .pull-sm-5 {
+ right: 41.666667%;
}
- .col-sm-pull-6 {
+ .pull-sm-6 {
right: 50%;
}
- .col-sm-pull-5 {
- right: 41.66666667%;
+ .pull-sm-7 {
+ right: 58.333333%;
}
- .col-sm-pull-4 {
- right: 33.33333333%;
+ .pull-sm-8 {
+ right: 66.666667%;
}
- .col-sm-pull-3 {
- right: 25%;
+ .pull-sm-9 {
+ right: 75%;
}
- .col-sm-pull-2 {
- right: 16.66666667%;
+ .pull-sm-10 {
+ right: 83.333333%;
}
- .col-sm-pull-1 {
- right: 8.33333333%;
+ .pull-sm-11 {
+ right: 91.666667%;
}
- .col-sm-pull-0 {
- right: auto;
+ .pull-sm-12 {
+ right: 100%;
}
- .col-sm-push-12 {
- left: 100%;
+ .push-sm-0 {
+ left: auto;
}
- .col-sm-push-11 {
- left: 91.66666667%;
+ .push-sm-1 {
+ left: 8.333333%;
}
- .col-sm-push-10 {
- left: 83.33333333%;
+ .push-sm-2 {
+ left: 16.666667%;
}
- .col-sm-push-9 {
- left: 75%;
+ .push-sm-3 {
+ left: 25%;
}
- .col-sm-push-8 {
- left: 66.66666667%;
+ .push-sm-4 {
+ left: 33.333333%;
}
- .col-sm-push-7 {
- left: 58.33333333%;
+ .push-sm-5 {
+ left: 41.666667%;
}
- .col-sm-push-6 {
+ .push-sm-6 {
left: 50%;
}
- .col-sm-push-5 {
- left: 41.66666667%;
+ .push-sm-7 {
+ left: 58.333333%;
}
- .col-sm-push-4 {
- left: 33.33333333%;
+ .push-sm-8 {
+ left: 66.666667%;
}
- .col-sm-push-3 {
- left: 25%;
+ .push-sm-9 {
+ left: 75%;
}
- .col-sm-push-2 {
- left: 16.66666667%;
+ .push-sm-10 {
+ left: 83.333333%;
}
- .col-sm-push-1 {
- left: 8.33333333%;
+ .push-sm-11 {
+ left: 91.666667%;
}
- .col-sm-push-0 {
- left: auto;
+ .push-sm-12 {
+ left: 100%;
}
- .col-sm-offset-12 {
- margin-left: 100%;
+ .offset-sm-0 {
+ margin-left: 0%;
}
- .col-sm-offset-11 {
- margin-left: 91.66666667%;
+ .offset-sm-1 {
+ margin-left: 8.333333%;
}
- .col-sm-offset-10 {
- margin-left: 83.33333333%;
+ .offset-sm-2 {
+ margin-left: 16.666667%;
}
- .col-sm-offset-9 {
- margin-left: 75%;
+ .offset-sm-3 {
+ margin-left: 25%;
}
- .col-sm-offset-8 {
- margin-left: 66.66666667%;
+ .offset-sm-4 {
+ margin-left: 33.333333%;
}
- .col-sm-offset-7 {
- margin-left: 58.33333333%;
+ .offset-sm-5 {
+ margin-left: 41.666667%;
}
- .col-sm-offset-6 {
+ .offset-sm-6 {
margin-left: 50%;
}
- .col-sm-offset-5 {
- margin-left: 41.66666667%;
- }
- .col-sm-offset-4 {
- margin-left: 33.33333333%;
+ .offset-sm-7 {
+ margin-left: 58.333333%;
}
- .col-sm-offset-3 {
- margin-left: 25%;
+ .offset-sm-8 {
+ margin-left: 66.666667%;
}
- .col-sm-offset-2 {
- margin-left: 16.66666667%;
+ .offset-sm-9 {
+ margin-left: 75%;
}
- .col-sm-offset-1 {
- margin-left: 8.33333333%;
+ .offset-sm-10 {
+ margin-left: 83.333333%;
}
- .col-sm-offset-0 {
- margin-left: 0;
+ .offset-sm-11 {
+ margin-left: 91.666667%;
}
}
-@media (min-width: 992px) {
- .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {
- float: left;
+
+@media (min-width: 768px) {
+ .col-md {
+ -webkit-flex-basis: 0;
+ -ms-flex-preferred-size: 0;
+ flex-basis: 0;
+ -webkit-box-flex: 1;
+ -webkit-flex-grow: 1;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ max-width: 100%;
+ }
+ .col-md-auto {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 auto;
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
+ width: auto;
}
- .col-md-12 {
- width: 100%;
+ .col-md-1 {
+ width: 8.333333%;
}
- .col-md-11 {
- width: 91.66666667%;
+ .col-md-2 {
+ width: 16.666667%;
}
- .col-md-10 {
- width: 83.33333333%;
+ .col-md-3 {
+ width: 25%;
+ }
+ .col-md-4 {
+ width: 33.333333%;
+ }
+ .col-md-5 {
+ width: 41.666667%;
+ }
+ .col-md-6 {
+ width: 50%;
+ }
+ .col-md-7 {
+ width: 58.333333%;
+ }
+ .col-md-8 {
+ width: 66.666667%;
}
.col-md-9 {
width: 75%;
}
- .col-md-8 {
- width: 66.66666667%;
+ .col-md-10 {
+ width: 83.333333%;
}
- .col-md-7 {
- width: 58.33333333%;
+ .col-md-11 {
+ width: 91.666667%;
}
- .col-md-6 {
- width: 50%;
+ .col-md-12 {
+ width: 100%;
}
- .col-md-5 {
- width: 41.66666667%;
+ .pull-md-0 {
+ right: auto;
}
- .col-md-4 {
- width: 33.33333333%;
+ .pull-md-1 {
+ right: 8.333333%;
}
- .col-md-3 {
- width: 25%;
+ .pull-md-2 {
+ right: 16.666667%;
}
- .col-md-2 {
- width: 16.66666667%;
+ .pull-md-3 {
+ right: 25%;
}
- .col-md-1 {
- width: 8.33333333%;
+ .pull-md-4 {
+ right: 33.333333%;
}
- .col-md-pull-12 {
- right: 100%;
+ .pull-md-5 {
+ right: 41.666667%;
}
- .col-md-pull-11 {
- right: 91.66666667%;
+ .pull-md-6 {
+ right: 50%;
+ }
+ .pull-md-7 {
+ right: 58.333333%;
}
- .col-md-pull-10 {
- right: 83.33333333%;
+ .pull-md-8 {
+ right: 66.666667%;
}
- .col-md-pull-9 {
+ .pull-md-9 {
right: 75%;
}
- .col-md-pull-8 {
- right: 66.66666667%;
+ .pull-md-10 {
+ right: 83.333333%;
}
- .col-md-pull-7 {
- right: 58.33333333%;
+ .pull-md-11 {
+ right: 91.666667%;
}
- .col-md-pull-6 {
- right: 50%;
+ .pull-md-12 {
+ right: 100%;
}
- .col-md-pull-5 {
- right: 41.66666667%;
+ .push-md-0 {
+ left: auto;
}
- .col-md-pull-4 {
- right: 33.33333333%;
+ .push-md-1 {
+ left: 8.333333%;
}
- .col-md-pull-3 {
- right: 25%;
+ .push-md-2 {
+ left: 16.666667%;
}
- .col-md-pull-2 {
- right: 16.66666667%;
+ .push-md-3 {
+ left: 25%;
}
- .col-md-pull-1 {
- right: 8.33333333%;
+ .push-md-4 {
+ left: 33.333333%;
}
- .col-md-pull-0 {
- right: auto;
+ .push-md-5 {
+ left: 41.666667%;
}
- .col-md-push-12 {
- left: 100%;
+ .push-md-6 {
+ left: 50%;
}
- .col-md-push-11 {
- left: 91.66666667%;
+ .push-md-7 {
+ left: 58.333333%;
}
- .col-md-push-10 {
- left: 83.33333333%;
+ .push-md-8 {
+ left: 66.666667%;
}
- .col-md-push-9 {
+ .push-md-9 {
left: 75%;
}
- .col-md-push-8 {
- left: 66.66666667%;
+ .push-md-10 {
+ left: 83.333333%;
}
- .col-md-push-7 {
- left: 58.33333333%;
+ .push-md-11 {
+ left: 91.666667%;
}
- .col-md-push-6 {
- left: 50%;
+ .push-md-12 {
+ left: 100%;
}
- .col-md-push-5 {
- left: 41.66666667%;
+ .offset-md-0 {
+ margin-left: 0%;
}
- .col-md-push-4 {
- left: 33.33333333%;
+ .offset-md-1 {
+ margin-left: 8.333333%;
}
- .col-md-push-3 {
- left: 25%;
+ .offset-md-2 {
+ margin-left: 16.666667%;
}
- .col-md-push-2 {
- left: 16.66666667%;
+ .offset-md-3 {
+ margin-left: 25%;
}
- .col-md-push-1 {
- left: 8.33333333%;
+ .offset-md-4 {
+ margin-left: 33.333333%;
}
- .col-md-push-0 {
- left: auto;
+ .offset-md-5 {
+ margin-left: 41.666667%;
}
- .col-md-offset-12 {
- margin-left: 100%;
+ .offset-md-6 {
+ margin-left: 50%;
}
- .col-md-offset-11 {
- margin-left: 91.66666667%;
+ .offset-md-7 {
+ margin-left: 58.333333%;
}
- .col-md-offset-10 {
- margin-left: 83.33333333%;
+ .offset-md-8 {
+ margin-left: 66.666667%;
}
- .col-md-offset-9 {
+ .offset-md-9 {
margin-left: 75%;
}
- .col-md-offset-8 {
- margin-left: 66.66666667%;
+ .offset-md-10 {
+ margin-left: 83.333333%;
}
- .col-md-offset-7 {
- margin-left: 58.33333333%;
+ .offset-md-11 {
+ margin-left: 91.666667%;
}
- .col-md-offset-6 {
- margin-left: 50%;
+}
+
+@media (min-width: 992px) {
+ .col-lg {
+ -webkit-flex-basis: 0;
+ -ms-flex-preferred-size: 0;
+ flex-basis: 0;
+ -webkit-box-flex: 1;
+ -webkit-flex-grow: 1;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ max-width: 100%;
+ }
+ .col-lg-auto {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 auto;
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
+ width: auto;
}
- .col-md-offset-5 {
- margin-left: 41.66666667%;
+ .col-lg-1 {
+ width: 8.333333%;
}
- .col-md-offset-4 {
- margin-left: 33.33333333%;
+ .col-lg-2 {
+ width: 16.666667%;
}
- .col-md-offset-3 {
- margin-left: 25%;
+ .col-lg-3 {
+ width: 25%;
}
- .col-md-offset-2 {
- margin-left: 16.66666667%;
+ .col-lg-4 {
+ width: 33.333333%;
}
- .col-md-offset-1 {
- margin-left: 8.33333333%;
+ .col-lg-5 {
+ width: 41.666667%;
}
- .col-md-offset-0 {
- margin-left: 0;
+ .col-lg-6 {
+ width: 50%;
}
-}
-@media (min-width: 1200px) {
- .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {
- float: left;
+ .col-lg-7 {
+ width: 58.333333%;
+ }
+ .col-lg-8 {
+ width: 66.666667%;
+ }
+ .col-lg-9 {
+ width: 75%;
+ }
+ .col-lg-10 {
+ width: 83.333333%;
+ }
+ .col-lg-11 {
+ width: 91.666667%;
}
.col-lg-12 {
width: 100%;
}
- .col-lg-11 {
- width: 91.66666667%;
+ .pull-lg-0 {
+ right: auto;
}
- .col-lg-10 {
- width: 83.33333333%;
+ .pull-lg-1 {
+ right: 8.333333%;
}
- .col-lg-9 {
- width: 75%;
+ .pull-lg-2 {
+ right: 16.666667%;
}
- .col-lg-8 {
- width: 66.66666667%;
+ .pull-lg-3 {
+ right: 25%;
}
- .col-lg-7 {
- width: 58.33333333%;
+ .pull-lg-4 {
+ right: 33.333333%;
}
- .col-lg-6 {
- width: 50%;
+ .pull-lg-5 {
+ right: 41.666667%;
}
- .col-lg-5 {
- width: 41.66666667%;
+ .pull-lg-6 {
+ right: 50%;
}
- .col-lg-4 {
- width: 33.33333333%;
+ .pull-lg-7 {
+ right: 58.333333%;
}
- .col-lg-3 {
- width: 25%;
+ .pull-lg-8 {
+ right: 66.666667%;
}
- .col-lg-2 {
- width: 16.66666667%;
+ .pull-lg-9 {
+ right: 75%;
}
- .col-lg-1 {
- width: 8.33333333%;
+ .pull-lg-10 {
+ right: 83.333333%;
+ }
+ .pull-lg-11 {
+ right: 91.666667%;
}
- .col-lg-pull-12 {
+ .pull-lg-12 {
right: 100%;
}
- .col-lg-pull-11 {
- right: 91.66666667%;
+ .push-lg-0 {
+ left: auto;
}
- .col-lg-pull-10 {
- right: 83.33333333%;
+ .push-lg-1 {
+ left: 8.333333%;
}
- .col-lg-pull-9 {
- right: 75%;
+ .push-lg-2 {
+ left: 16.666667%;
}
- .col-lg-pull-8 {
- right: 66.66666667%;
+ .push-lg-3 {
+ left: 25%;
}
- .col-lg-pull-7 {
- right: 58.33333333%;
+ .push-lg-4 {
+ left: 33.333333%;
}
- .col-lg-pull-6 {
- right: 50%;
+ .push-lg-5 {
+ left: 41.666667%;
}
- .col-lg-pull-5 {
- right: 41.66666667%;
+ .push-lg-6 {
+ left: 50%;
}
- .col-lg-pull-4 {
- right: 33.33333333%;
+ .push-lg-7 {
+ left: 58.333333%;
}
- .col-lg-pull-3 {
- right: 25%;
+ .push-lg-8 {
+ left: 66.666667%;
}
- .col-lg-pull-2 {
- right: 16.66666667%;
+ .push-lg-9 {
+ left: 75%;
}
- .col-lg-pull-1 {
- right: 8.33333333%;
+ .push-lg-10 {
+ left: 83.333333%;
}
- .col-lg-pull-0 {
- right: auto;
+ .push-lg-11 {
+ left: 91.666667%;
}
- .col-lg-push-12 {
+ .push-lg-12 {
left: 100%;
}
- .col-lg-push-11 {
- left: 91.66666667%;
+ .offset-lg-0 {
+ margin-left: 0%;
}
- .col-lg-push-10 {
- left: 83.33333333%;
+ .offset-lg-1 {
+ margin-left: 8.333333%;
}
- .col-lg-push-9 {
- left: 75%;
+ .offset-lg-2 {
+ margin-left: 16.666667%;
+ }
+ .offset-lg-3 {
+ margin-left: 25%;
}
- .col-lg-push-8 {
- left: 66.66666667%;
+ .offset-lg-4 {
+ margin-left: 33.333333%;
}
- .col-lg-push-7 {
- left: 58.33333333%;
+ .offset-lg-5 {
+ margin-left: 41.666667%;
}
- .col-lg-push-6 {
- left: 50%;
+ .offset-lg-6 {
+ margin-left: 50%;
}
- .col-lg-push-5 {
- left: 41.66666667%;
+ .offset-lg-7 {
+ margin-left: 58.333333%;
}
- .col-lg-push-4 {
- left: 33.33333333%;
+ .offset-lg-8 {
+ margin-left: 66.666667%;
}
- .col-lg-push-3 {
- left: 25%;
+ .offset-lg-9 {
+ margin-left: 75%;
+ }
+ .offset-lg-10 {
+ margin-left: 83.333333%;
+ }
+ .offset-lg-11 {
+ margin-left: 91.666667%;
+ }
+}
+
+@media (min-width: 1200px) {
+ .col-xl {
+ -webkit-flex-basis: 0;
+ -ms-flex-preferred-size: 0;
+ flex-basis: 0;
+ -webkit-box-flex: 1;
+ -webkit-flex-grow: 1;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ max-width: 100%;
+ }
+ .col-xl-auto {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 auto;
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
+ width: auto;
+ }
+ .col-xl-1 {
+ width: 8.333333%;
+ }
+ .col-xl-2 {
+ width: 16.666667%;
+ }
+ .col-xl-3 {
+ width: 25%;
+ }
+ .col-xl-4 {
+ width: 33.333333%;
+ }
+ .col-xl-5 {
+ width: 41.666667%;
+ }
+ .col-xl-6 {
+ width: 50%;
+ }
+ .col-xl-7 {
+ width: 58.333333%;
+ }
+ .col-xl-8 {
+ width: 66.666667%;
+ }
+ .col-xl-9 {
+ width: 75%;
+ }
+ .col-xl-10 {
+ width: 83.333333%;
+ }
+ .col-xl-11 {
+ width: 91.666667%;
+ }
+ .col-xl-12 {
+ width: 100%;
+ }
+ .pull-xl-0 {
+ right: auto;
+ }
+ .pull-xl-1 {
+ right: 8.333333%;
+ }
+ .pull-xl-2 {
+ right: 16.666667%;
+ }
+ .pull-xl-3 {
+ right: 25%;
+ }
+ .pull-xl-4 {
+ right: 33.333333%;
+ }
+ .pull-xl-5 {
+ right: 41.666667%;
+ }
+ .pull-xl-6 {
+ right: 50%;
}
- .col-lg-push-2 {
- left: 16.66666667%;
+ .pull-xl-7 {
+ right: 58.333333%;
}
- .col-lg-push-1 {
- left: 8.33333333%;
+ .pull-xl-8 {
+ right: 66.666667%;
}
- .col-lg-push-0 {
+ .pull-xl-9 {
+ right: 75%;
+ }
+ .pull-xl-10 {
+ right: 83.333333%;
+ }
+ .pull-xl-11 {
+ right: 91.666667%;
+ }
+ .pull-xl-12 {
+ right: 100%;
+ }
+ .push-xl-0 {
left: auto;
}
- .col-lg-offset-12 {
- margin-left: 100%;
+ .push-xl-1 {
+ left: 8.333333%;
}
- .col-lg-offset-11 {
- margin-left: 91.66666667%;
+ .push-xl-2 {
+ left: 16.666667%;
}
- .col-lg-offset-10 {
- margin-left: 83.33333333%;
+ .push-xl-3 {
+ left: 25%;
}
- .col-lg-offset-9 {
- margin-left: 75%;
+ .push-xl-4 {
+ left: 33.333333%;
}
- .col-lg-offset-8 {
- margin-left: 66.66666667%;
+ .push-xl-5 {
+ left: 41.666667%;
}
- .col-lg-offset-7 {
- margin-left: 58.33333333%;
+ .push-xl-6 {
+ left: 50%;
}
- .col-lg-offset-6 {
- margin-left: 50%;
+ .push-xl-7 {
+ left: 58.333333%;
+ }
+ .push-xl-8 {
+ left: 66.666667%;
+ }
+ .push-xl-9 {
+ left: 75%;
+ }
+ .push-xl-10 {
+ left: 83.333333%;
+ }
+ .push-xl-11 {
+ left: 91.666667%;
+ }
+ .push-xl-12 {
+ left: 100%;
}
- .col-lg-offset-5 {
- margin-left: 41.66666667%;
+ .offset-xl-0 {
+ margin-left: 0%;
}
- .col-lg-offset-4 {
- margin-left: 33.33333333%;
+ .offset-xl-1 {
+ margin-left: 8.333333%;
}
- .col-lg-offset-3 {
+ .offset-xl-2 {
+ margin-left: 16.666667%;
+ }
+ .offset-xl-3 {
margin-left: 25%;
}
- .col-lg-offset-2 {
- margin-left: 16.66666667%;
+ .offset-xl-4 {
+ margin-left: 33.333333%;
}
- .col-lg-offset-1 {
- margin-left: 8.33333333%;
+ .offset-xl-5 {
+ margin-left: 41.666667%;
}
- .col-lg-offset-0 {
- margin-left: 0;
+ .offset-xl-6 {
+ margin-left: 50%;
+ }
+ .offset-xl-7 {
+ margin-left: 58.333333%;
+ }
+ .offset-xl-8 {
+ margin-left: 66.666667%;
+ }
+ .offset-xl-9 {
+ margin-left: 75%;
+ }
+ .offset-xl-10 {
+ margin-left: 83.333333%;
+ }
+ .offset-xl-11 {
+ margin-left: 91.666667%;
}
}
-table {
- background-color: transparent;
-}
-caption {
- padding-top: 8px;
- padding-bottom: 8px;
- color: #777;
- text-align: left;
-}
-th {
- text-align: left;
-}
+
.table {
width: 100%;
max-width: 100%;
- margin-bottom: 20px;
-}
-.table > thead > tr > th,
-.table > tbody > tr > th,
-.table > tfoot > tr > th,
-.table > thead > tr > td,
-.table > tbody > tr > td,
-.table > tfoot > tr > td {
- padding: 8px;
- line-height: 1.42857143;
+ margin-bottom: 1rem;
+ background-color: transparent;
+}
+
+.table th,
+.table td {
+ padding: 0.75rem;
vertical-align: top;
- border-top: 1px solid #ddd;
+ border-top: 1px solid #eceeef;
}
-.table > thead > tr > th {
+
+.table thead th {
vertical-align: bottom;
- border-bottom: 2px solid #ddd;
-}
-.table > caption + thead > tr:first-child > th,
-.table > colgroup + thead > tr:first-child > th,
-.table > thead:first-child > tr:first-child > th,
-.table > caption + thead > tr:first-child > td,
-.table > colgroup + thead > tr:first-child > td,
-.table > thead:first-child > tr:first-child > td {
- border-top: 0;
+ border-bottom: 2px solid #eceeef;
}
-.table > tbody + tbody {
- border-top: 2px solid #ddd;
+
+.table tbody + tbody {
+ border-top: 2px solid #eceeef;
}
+
.table .table {
background-color: #fff;
}
-.table-condensed > thead > tr > th,
-.table-condensed > tbody > tr > th,
-.table-condensed > tfoot > tr > th,
-.table-condensed > thead > tr > td,
-.table-condensed > tbody > tr > td,
-.table-condensed > tfoot > tr > td {
- padding: 5px;
+
+.table-sm th,
+.table-sm td {
+ padding: 0.3rem;
}
+
.table-bordered {
- border: 1px solid #ddd;
+ border: 1px solid #eceeef;
}
-.table-bordered > thead > tr > th,
-.table-bordered > tbody > tr > th,
-.table-bordered > tfoot > tr > th,
-.table-bordered > thead > tr > td,
-.table-bordered > tbody > tr > td,
-.table-bordered > tfoot > tr > td {
- border: 1px solid #ddd;
+
+.table-bordered th,
+.table-bordered td {
+ border: 1px solid #eceeef;
}
-.table-bordered > thead > tr > th,
-.table-bordered > thead > tr > td {
+
+.table-bordered thead th,
+.table-bordered thead td {
border-bottom-width: 2px;
}
-.table-striped > tbody > tr:nth-of-type(odd) {
- background-color: #f9f9f9;
+
+.table-striped tbody tr:nth-of-type(odd) {
+ background-color: rgba(0, 0, 0, 0.05);
}
-.table-hover > tbody > tr:hover {
- background-color: #f5f5f5;
+
+.table-hover tbody tr:hover {
+ background-color: rgba(0, 0, 0, 0.075);
}
-table col[class*="col-"] {
- position: static;
- display: table-column;
- float: none;
+
+.table-active,
+.table-active > th,
+.table-active > td {
+ background-color: rgba(0, 0, 0, 0.075);
}
-table td[class*="col-"],
-table th[class*="col-"] {
- position: static;
- display: table-cell;
- float: none;
+
+.table-hover .table-active:hover {
+ background-color: rgba(0, 0, 0, 0.075);
}
-.table > thead > tr > td.active,
-.table > tbody > tr > td.active,
-.table > tfoot > tr > td.active,
-.table > thead > tr > th.active,
-.table > tbody > tr > th.active,
-.table > tfoot > tr > th.active,
-.table > thead > tr.active > td,
-.table > tbody > tr.active > td,
-.table > tfoot > tr.active > td,
-.table > thead > tr.active > th,
-.table > tbody > tr.active > th,
-.table > tfoot > tr.active > th {
- background-color: #f5f5f5;
-}
-.table-hover > tbody > tr > td.active:hover,
-.table-hover > tbody > tr > th.active:hover,
-.table-hover > tbody > tr.active:hover > td,
-.table-hover > tbody > tr:hover > .active,
-.table-hover > tbody > tr.active:hover > th {
- background-color: #e8e8e8;
-}
-.table > thead > tr > td.success,
-.table > tbody > tr > td.success,
-.table > tfoot > tr > td.success,
-.table > thead > tr > th.success,
-.table > tbody > tr > th.success,
-.table > tfoot > tr > th.success,
-.table > thead > tr.success > td,
-.table > tbody > tr.success > td,
-.table > tfoot > tr.success > td,
-.table > thead > tr.success > th,
-.table > tbody > tr.success > th,
-.table > tfoot > tr.success > th {
+
+.table-hover .table-active:hover > td,
+.table-hover .table-active:hover > th {
+ background-color: rgba(0, 0, 0, 0.075);
+}
+
+.table-success,
+.table-success > th,
+.table-success > td {
background-color: #dff0d8;
}
-.table-hover > tbody > tr > td.success:hover,
-.table-hover > tbody > tr > th.success:hover,
-.table-hover > tbody > tr.success:hover > td,
-.table-hover > tbody > tr:hover > .success,
-.table-hover > tbody > tr.success:hover > th {
+
+.table-hover .table-success:hover {
+ background-color: #d0e9c6;
+}
+
+.table-hover .table-success:hover > td,
+.table-hover .table-success:hover > th {
background-color: #d0e9c6;
}
-.table > thead > tr > td.info,
-.table > tbody > tr > td.info,
-.table > tfoot > tr > td.info,
-.table > thead > tr > th.info,
-.table > tbody > tr > th.info,
-.table > tfoot > tr > th.info,
-.table > thead > tr.info > td,
-.table > tbody > tr.info > td,
-.table > tfoot > tr.info > td,
-.table > thead > tr.info > th,
-.table > tbody > tr.info > th,
-.table > tfoot > tr.info > th {
+
+.table-info,
+.table-info > th,
+.table-info > td {
background-color: #d9edf7;
}
-.table-hover > tbody > tr > td.info:hover,
-.table-hover > tbody > tr > th.info:hover,
-.table-hover > tbody > tr.info:hover > td,
-.table-hover > tbody > tr:hover > .info,
-.table-hover > tbody > tr.info:hover > th {
+
+.table-hover .table-info:hover {
background-color: #c4e3f3;
}
-.table > thead > tr > td.warning,
-.table > tbody > tr > td.warning,
-.table > tfoot > tr > td.warning,
-.table > thead > tr > th.warning,
-.table > tbody > tr > th.warning,
-.table > tfoot > tr > th.warning,
-.table > thead > tr.warning > td,
-.table > tbody > tr.warning > td,
-.table > tfoot > tr.warning > td,
-.table > thead > tr.warning > th,
-.table > tbody > tr.warning > th,
-.table > tfoot > tr.warning > th {
+
+.table-hover .table-info:hover > td,
+.table-hover .table-info:hover > th {
+ background-color: #c4e3f3;
+}
+
+.table-warning,
+.table-warning > th,
+.table-warning > td {
background-color: #fcf8e3;
}
-.table-hover > tbody > tr > td.warning:hover,
-.table-hover > tbody > tr > th.warning:hover,
-.table-hover > tbody > tr.warning:hover > td,
-.table-hover > tbody > tr:hover > .warning,
-.table-hover > tbody > tr.warning:hover > th {
+
+.table-hover .table-warning:hover {
+ background-color: #faf2cc;
+}
+
+.table-hover .table-warning:hover > td,
+.table-hover .table-warning:hover > th {
background-color: #faf2cc;
}
-.table > thead > tr > td.danger,
-.table > tbody > tr > td.danger,
-.table > tfoot > tr > td.danger,
-.table > thead > tr > th.danger,
-.table > tbody > tr > th.danger,
-.table > tfoot > tr > th.danger,
-.table > thead > tr.danger > td,
-.table > tbody > tr.danger > td,
-.table > tfoot > tr.danger > td,
-.table > thead > tr.danger > th,
-.table > tbody > tr.danger > th,
-.table > tfoot > tr.danger > th {
+
+.table-danger,
+.table-danger > th,
+.table-danger > td {
background-color: #f2dede;
}
-.table-hover > tbody > tr > td.danger:hover,
-.table-hover > tbody > tr > th.danger:hover,
-.table-hover > tbody > tr.danger:hover > td,
-.table-hover > tbody > tr:hover > .danger,
-.table-hover > tbody > tr.danger:hover > th {
+
+.table-hover .table-danger:hover {
background-color: #ebcccc;
}
-.table-responsive {
- min-height: .01%;
- overflow-x: auto;
-}
-@media screen and (max-width: 767px) {
- .table-responsive {
- width: 100%;
- margin-bottom: 15px;
- overflow-y: hidden;
- -ms-overflow-style: -ms-autohiding-scrollbar;
- border: 1px solid #ddd;
- }
- .table-responsive > .table {
- margin-bottom: 0;
- }
- .table-responsive > .table > thead > tr > th,
- .table-responsive > .table > tbody > tr > th,
- .table-responsive > .table > tfoot > tr > th,
- .table-responsive > .table > thead > tr > td,
- .table-responsive > .table > tbody > tr > td,
- .table-responsive > .table > tfoot > tr > td {
- white-space: nowrap;
- }
- .table-responsive > .table-bordered {
- border: 0;
- }
- .table-responsive > .table-bordered > thead > tr > th:first-child,
- .table-responsive > .table-bordered > tbody > tr > th:first-child,
- .table-responsive > .table-bordered > tfoot > tr > th:first-child,
- .table-responsive > .table-bordered > thead > tr > td:first-child,
- .table-responsive > .table-bordered > tbody > tr > td:first-child,
- .table-responsive > .table-bordered > tfoot > tr > td:first-child {
- border-left: 0;
- }
- .table-responsive > .table-bordered > thead > tr > th:last-child,
- .table-responsive > .table-bordered > tbody > tr > th:last-child,
- .table-responsive > .table-bordered > tfoot > tr > th:last-child,
- .table-responsive > .table-bordered > thead > tr > td:last-child,
- .table-responsive > .table-bordered > tbody > tr > td:last-child,
- .table-responsive > .table-bordered > tfoot > tr > td:last-child {
- border-right: 0;
- }
- .table-responsive > .table-bordered > tbody > tr:last-child > th,
- .table-responsive > .table-bordered > tfoot > tr:last-child > th,
- .table-responsive > .table-bordered > tbody > tr:last-child > td,
- .table-responsive > .table-bordered > tfoot > tr:last-child > td {
- border-bottom: 0;
- }
-}
-fieldset {
- min-width: 0;
- padding: 0;
- margin: 0;
- border: 0;
-}
-legend {
- display: block;
- width: 100%;
- padding: 0;
- margin-bottom: 20px;
- font-size: 21px;
- line-height: inherit;
- color: #333;
- border: 0;
- border-bottom: 1px solid #e5e5e5;
+
+.table-hover .table-danger:hover > td,
+.table-hover .table-danger:hover > th {
+ background-color: #ebcccc;
}
-label {
- display: inline-block;
- max-width: 100%;
- margin-bottom: 5px;
- font-weight: bold;
+
+.thead-inverse th {
+ color: #fff;
+ background-color: #292b2c;
}
-input[type="search"] {
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
+
+.thead-default th {
+ color: #464a4c;
+ background-color: #eceeef;
}
-input[type="radio"],
-input[type="checkbox"] {
- margin: 4px 0 0;
- margin-top: 1px \9;
- line-height: normal;
+
+.table-inverse {
+ color: #fff;
+ background-color: #292b2c;
}
-input[type="file"] {
- display: block;
+
+.table-inverse th,
+.table-inverse td,
+.table-inverse thead th {
+ border-color: #3b3e40;
}
-input[type="range"] {
- display: block;
- width: 100%;
+
+.table-inverse.table-bordered {
+ border: 0;
}
-select[multiple],
-select[size] {
- height: auto;
+
+.table-inverse.table-striped tbody tr:nth-of-type(odd) {
+ background-color: rgba(255, 255, 255, 0.05);
}
-input[type="file"]:focus,
-input[type="radio"]:focus,
-input[type="checkbox"]:focus {
- outline: 5px auto -webkit-focus-ring-color;
- outline-offset: -2px;
+
+.table-inverse.table-hover tbody tr:hover {
+ background-color: rgba(255, 255, 255, 0.075);
}
-output {
- display: block;
- padding-top: 7px;
- font-size: 14px;
- line-height: 1.42857143;
- color: #555;
+
+@media (max-width: 991px) {
+ .table-responsive {
+ display: block;
+ width: 100%;
+ overflow-x: auto;
+ -ms-overflow-style: -ms-autohiding-scrollbar;
+ }
+ .table-responsive.table-bordered {
+ border: 0;
+ }
}
+
.form-control {
display: block;
width: 100%;
- height: 34px;
- padding: 6px 12px;
- font-size: 14px;
- line-height: 1.42857143;
- color: #555;
+ padding: 0.5rem 1rem;
+ font-size: 1rem;
+ line-height: 1.25;
+ color: #464a4c;
background-color: #fff;
background-image: none;
- border: 1px solid #ccc;
- border-radius: 4px;
- -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
- box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
- -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;
- -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
- transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
+ -webkit-background-clip: padding-box;
+ background-clip: padding-box;
+ border: 1px solid rgba(0, 0, 0, 0.15);
+ border-radius: 0.25rem;
+ -webkit-transition: border-color ease-in-out 0.15s, -webkit-box-shadow ease-in-out 0.15s;
+ transition: border-color ease-in-out 0.15s, -webkit-box-shadow ease-in-out 0.15s;
+ -o-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
+ transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
+ transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s, -webkit-box-shadow ease-in-out 0.15s;
+}
+
+.form-control::-ms-expand {
+ background-color: transparent;
+ border: 0;
}
+
.form-control:focus {
- border-color: #66afe9;
- outline: 0;
- -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);
- box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);
+ color: #464a4c;
+ background-color: #fff;
+ border-color: #5cb3fd;
+ outline: none;
+}
+
+.form-control::-webkit-input-placeholder {
+ color: #636c72;
+ opacity: 1;
}
+
.form-control::-moz-placeholder {
- color: #999;
+ color: #636c72;
opacity: 1;
}
+
.form-control:-ms-input-placeholder {
- color: #999;
-}
-.form-control::-webkit-input-placeholder {
- color: #999;
-}
-.form-control::-ms-expand {
- background-color: transparent;
- border: 0;
-}
-.form-control[disabled],
-.form-control[readonly],
-fieldset[disabled] .form-control {
- background-color: #eee;
+ color: #636c72;
opacity: 1;
}
-.form-control[disabled],
-fieldset[disabled] .form-control {
- cursor: not-allowed;
-}
-textarea.form-control {
- height: auto;
+
+.form-control::placeholder {
+ color: #636c72;
+ opacity: 1;
}
-input[type="search"] {
- -webkit-appearance: none;
+
+.form-control:disabled, .form-control[readonly] {
+ background-color: #eceeef;
+ opacity: 1;
}
-@media screen and (-webkit-min-device-pixel-ratio: 0) {
- input[type="date"].form-control,
- input[type="time"].form-control,
- input[type="datetime-local"].form-control,
- input[type="month"].form-control {
- line-height: 34px;
- }
- input[type="date"].input-sm,
- input[type="time"].input-sm,
- input[type="datetime-local"].input-sm,
- input[type="month"].input-sm,
- .input-group-sm input[type="date"],
- .input-group-sm input[type="time"],
- .input-group-sm input[type="datetime-local"],
- .input-group-sm input[type="month"] {
- line-height: 30px;
- }
- input[type="date"].input-lg,
- input[type="time"].input-lg,
- input[type="datetime-local"].input-lg,
- input[type="month"].input-lg,
- .input-group-lg input[type="date"],
- .input-group-lg input[type="time"],
- .input-group-lg input[type="datetime-local"],
- .input-group-lg input[type="month"] {
- line-height: 46px;
- }
+
+select.form-control:not([size]):not([multiple]) {
+ height: calc(2.25rem + 2px);
}
-.form-group {
- margin-bottom: 15px;
+
+select.form-control:focus::-ms-value {
+ color: #464a4c;
+ background-color: #fff;
}
-.radio,
-.checkbox {
- position: relative;
+
+.form-control-file,
+.form-control-range {
display: block;
- margin-top: 10px;
- margin-bottom: 10px;
}
-.radio label,
-.checkbox label {
- min-height: 20px;
- padding-left: 20px;
+
+.col-form-label {
+ padding-top: calc(0.5rem - 1px * 2);
+ padding-bottom: calc(0.5rem - 1px * 2);
margin-bottom: 0;
- font-weight: normal;
- cursor: pointer;
}
-.radio input[type="radio"],
-.radio-inline input[type="radio"],
-.checkbox input[type="checkbox"],
-.checkbox-inline input[type="checkbox"] {
- position: absolute;
- margin-top: 4px \9;
- margin-left: -20px;
+
+.col-form-label-lg {
+ padding-top: calc(0.5rem - 1px * 2);
+ padding-bottom: calc(0.5rem - 1px * 2);
+ font-size: 1.25rem;
}
-.radio + .radio,
-.checkbox + .checkbox {
- margin-top: -5px;
+
+.col-form-label-sm {
+ padding-top: calc(0.25rem - 1px * 2);
+ padding-bottom: calc(0.25rem - 1px * 2);
+ font-size: 0.875rem;
}
-.radio-inline,
-.checkbox-inline {
- position: relative;
- display: inline-block;
- padding-left: 20px;
+
+.col-form-legend {
+ padding-top: 0.5rem;
+ padding-bottom: 0.5rem;
margin-bottom: 0;
- font-weight: normal;
- vertical-align: middle;
- cursor: pointer;
-}
-.radio-inline + .radio-inline,
-.checkbox-inline + .checkbox-inline {
- margin-top: 0;
- margin-left: 10px;
-}
-input[type="radio"][disabled],
-input[type="checkbox"][disabled],
-input[type="radio"].disabled,
-input[type="checkbox"].disabled,
-fieldset[disabled] input[type="radio"],
-fieldset[disabled] input[type="checkbox"] {
- cursor: not-allowed;
-}
-.radio-inline.disabled,
-.checkbox-inline.disabled,
-fieldset[disabled] .radio-inline,
-fieldset[disabled] .checkbox-inline {
- cursor: not-allowed;
-}
-.radio.disabled label,
-.checkbox.disabled label,
-fieldset[disabled] .radio label,
-fieldset[disabled] .checkbox label {
- cursor: not-allowed;
+ font-size: 1rem;
}
+
.form-control-static {
- min-height: 34px;
- padding-top: 7px;
- padding-bottom: 7px;
+ padding-top: 0.5rem;
+ padding-bottom: 0.5rem;
margin-bottom: 0;
+ line-height: 1.25;
+ border: solid transparent;
+ border-width: 1px 0;
}
-.form-control-static.input-lg,
-.form-control-static.input-sm {
+
+.form-control-static.form-control-sm, .input-group-sm > .form-control-static.form-control,
+.input-group-sm > .form-control-static.input-group-addon,
+.input-group-sm > .input-group-btn > .form-control-static.btn, .form-control-static.form-control-lg, .input-group-lg > .form-control-static.form-control,
+.input-group-lg > .form-control-static.input-group-addon,
+.input-group-lg > .input-group-btn > .form-control-static.btn {
padding-right: 0;
padding-left: 0;
}
-.input-sm {
- height: 30px;
- padding: 5px 10px;
- font-size: 12px;
+
+.form-control-sm, .input-group-sm > .form-control,
+.input-group-sm > .input-group-addon,
+.input-group-sm > .input-group-btn > .btn {
+ padding: 0.25rem 0.5rem;
+ font-size: 0.875rem;
line-height: 1.5;
- border-radius: 3px;
-}
-select.input-sm {
- height: 30px;
- line-height: 30px;
+ border-radius: 0.2rem;
}
-textarea.input-sm,
-select[multiple].input-sm {
- height: auto;
+
+select.form-control-sm:not([size]):not([multiple]), .input-group-sm > select.form-control:not([size]):not([multiple]),
+.input-group-sm > select.input-group-addon:not([size]):not([multiple]),
+.input-group-sm > .input-group-btn > select.btn:not([size]):not([multiple]) {
+ height: calc(1.8125rem + 2px);
}
-.form-group-sm .form-control {
- height: 30px;
- padding: 5px 10px;
- font-size: 12px;
+
+.form-control-lg, .input-group-lg > .form-control,
+.input-group-lg > .input-group-addon,
+.input-group-lg > .input-group-btn > .btn {
+ padding: 0.5rem 1rem;
+ font-size: 1.25rem;
line-height: 1.5;
- border-radius: 3px;
-}
-.form-group-sm select.form-control {
- height: 30px;
- line-height: 30px;
+ border-radius: 0.3rem;
}
-.form-group-sm textarea.form-control,
-.form-group-sm select[multiple].form-control {
- height: auto;
+
+select.form-control-lg:not([size]):not([multiple]), .input-group-lg > select.form-control:not([size]):not([multiple]),
+.input-group-lg > select.input-group-addon:not([size]):not([multiple]),
+.input-group-lg > .input-group-btn > select.btn:not([size]):not([multiple]) {
+ height: calc(2.875rem + 2px);
}
-.form-group-sm .form-control-static {
- height: 30px;
- min-height: 32px;
- padding: 6px 10px;
- font-size: 12px;
- line-height: 1.5;
+
+.form-group {
+ margin-bottom: 1rem;
}
-.input-lg {
- height: 46px;
- padding: 10px 16px;
- font-size: 18px;
- line-height: 1.3333333;
- border-radius: 6px;
+
+.form-text {
+ display: block;
+ margin-top: 0.25rem;
}
-select.input-lg {
- height: 46px;
- line-height: 46px;
+
+.form-check {
+ position: relative;
+ display: block;
+ margin-bottom: 0.5rem;
}
-textarea.input-lg,
-select[multiple].input-lg {
- height: auto;
+
+.form-check.disabled .form-check-label {
+ color: #636c72;
}
-.form-group-lg .form-control {
- height: 46px;
- padding: 10px 16px;
- font-size: 18px;
- line-height: 1.3333333;
- border-radius: 6px;
+
+.form-check-label {
+ padding-left: 1.25rem;
+ margin-bottom: 0;
}
-.form-group-lg select.form-control {
- height: 46px;
- line-height: 46px;
+
+.form-check-input {
+ position: absolute;
+ margin-top: 0.25rem;
+ margin-left: -1.25rem;
}
-.form-group-lg textarea.form-control,
-.form-group-lg select[multiple].form-control {
- height: auto;
+
+.form-check-input:only-child {
+ position: static;
}
-.form-group-lg .form-control-static {
- height: 46px;
- min-height: 38px;
- padding: 11px 16px;
- font-size: 18px;
- line-height: 1.3333333;
+
+.form-check-inline {
+ display: inline-block;
}
-.has-feedback {
- position: relative;
+
+.form-check-inline .form-check-label {
+ vertical-align: middle;
}
-.has-feedback .form-control {
- padding-right: 42.5px;
+
+.form-check-inline + .form-check-inline {
+ margin-left: 0.75rem;
}
+
.form-control-feedback {
- position: absolute;
- top: 0;
- right: 0;
- z-index: 2;
- display: block;
- width: 34px;
- height: 34px;
- line-height: 34px;
- text-align: center;
- pointer-events: none;
+ margin-top: 0.25rem;
}
-.input-lg + .form-control-feedback,
-.input-group-lg + .form-control-feedback,
-.form-group-lg .form-control + .form-control-feedback {
- width: 46px;
- height: 46px;
- line-height: 46px;
-}
-.input-sm + .form-control-feedback,
-.input-group-sm + .form-control-feedback,
-.form-group-sm .form-control + .form-control-feedback {
- width: 30px;
- height: 30px;
- line-height: 30px;
-}
-.has-success .help-block,
-.has-success .control-label,
-.has-success .radio,
-.has-success .checkbox,
-.has-success .radio-inline,
-.has-success .checkbox-inline,
-.has-success.radio label,
-.has-success.checkbox label,
-.has-success.radio-inline label,
-.has-success.checkbox-inline label {
- color: #3c763d;
+
+.form-control-success,
+.form-control-warning,
+.form-control-danger {
+ padding-right: 3rem;
+ background-repeat: no-repeat;
+ background-position: center right 0.5625rem;
+ -webkit-background-size: 1.125rem 1.125rem;
+ background-size: 1.125rem 1.125rem;
}
-.has-success .form-control {
- border-color: #3c763d;
- -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
- box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+
+.has-success .form-control-feedback,
+.has-success .form-control-label,
+.has-success .col-form-label,
+.has-success .form-check-label,
+.has-success .custom-control {
+ color: #5cb85c;
}
-.has-success .form-control:focus {
- border-color: #2b542c;
- -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168;
- box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168;
+
+.has-success .form-control,
+.has-success .custom-select,
+.has-success .custom-file-control {
+ border-color: #5cb85c;
}
+
.has-success .input-group-addon {
- color: #3c763d;
- background-color: #dff0d8;
- border-color: #3c763d;
-}
-.has-success .form-control-feedback {
- color: #3c763d;
+ color: #5cb85c;
+ background-color: #eaf6ea;
+ border-color: #5cb85c;
}
-.has-warning .help-block,
-.has-warning .control-label,
-.has-warning .radio,
-.has-warning .checkbox,
-.has-warning .radio-inline,
-.has-warning .checkbox-inline,
-.has-warning.radio label,
-.has-warning.checkbox label,
-.has-warning.radio-inline label,
-.has-warning.checkbox-inline label {
- color: #8a6d3b;
+
+.has-success .form-control-success {
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%235cb85c' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E");
}
-.has-warning .form-control {
- border-color: #8a6d3b;
- -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
- box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+
+.has-warning .form-control-feedback,
+.has-warning .form-control-label,
+.has-warning .col-form-label,
+.has-warning .form-check-label,
+.has-warning .custom-control {
+ color: #f0ad4e;
}
-.has-warning .form-control:focus {
- border-color: #66512c;
- -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b;
- box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b;
+
+.has-warning .form-control,
+.has-warning .custom-select,
+.has-warning .custom-file-control {
+ border-color: #f0ad4e;
}
+
.has-warning .input-group-addon {
- color: #8a6d3b;
- background-color: #fcf8e3;
- border-color: #8a6d3b;
-}
-.has-warning .form-control-feedback {
- color: #8a6d3b;
-}
-.has-error .help-block,
-.has-error .control-label,
-.has-error .radio,
-.has-error .checkbox,
-.has-error .radio-inline,
-.has-error .checkbox-inline,
-.has-error.radio label,
-.has-error.checkbox label,
-.has-error.radio-inline label,
-.has-error.checkbox-inline label {
- color: #a94442;
+ color: #f0ad4e;
+ background-color: white;
+ border-color: #f0ad4e;
}
-.has-error .form-control {
- border-color: #a94442;
- -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
- box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+
+.has-warning .form-control-warning {
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23f0ad4e' d='M4.4 5.324h-.8v-2.46h.8zm0 1.42h-.8V5.89h.8zM3.76.63L.04 7.075c-.115.2.016.425.26.426h7.397c.242 0 .372-.226.258-.426C6.726 4.924 5.47 2.79 4.253.63c-.113-.174-.39-.174-.494 0z'/%3E%3C/svg%3E");
}
-.has-error .form-control:focus {
- border-color: #843534;
- -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;
- box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;
+
+.has-danger .form-control-feedback,
+.has-danger .form-control-label,
+.has-danger .col-form-label,
+.has-danger .form-check-label,
+.has-danger .custom-control {
+ color: #d9534f;
}
-.has-error .input-group-addon {
- color: #a94442;
- background-color: #f2dede;
- border-color: #a94442;
+
+.has-danger .form-control,
+.has-danger .custom-select,
+.has-danger .custom-file-control {
+ border-color: #d9534f;
}
-.has-error .form-control-feedback {
- color: #a94442;
+
+.has-danger .input-group-addon {
+ color: #d9534f;
+ background-color: #fdf7f7;
+ border-color: #d9534f;
}
-.has-feedback label ~ .form-control-feedback {
- top: 25px;
+
+.has-danger .form-control-danger {
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23d9534f' viewBox='-2 -2 7 7'%3E%3Cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3E%3Ccircle r='.5'/%3E%3Ccircle cx='3' r='.5'/%3E%3Ccircle cy='3' r='.5'/%3E%3Ccircle cx='3' cy='3' r='.5'/%3E%3C/svg%3E");
}
-.has-feedback label.sr-only ~ .form-control-feedback {
- top: 0;
+
+.form-inline {
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ -webkit-flex-flow: row wrap;
+ -ms-flex-flow: row wrap;
+ flex-flow: row wrap;
+ -webkit-box-align: center;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
}
-.help-block {
- display: block;
- margin-top: 5px;
- margin-bottom: 10px;
- color: #737373;
+
+.form-inline .form-check {
+ width: 100%;
}
-@media (min-width: 768px) {
+
+@media (min-width: 576px) {
+ .form-inline label {
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-align: center;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
+ -webkit-box-pack: center;
+ -webkit-justify-content: center;
+ -ms-flex-pack: center;
+ justify-content: center;
+ margin-bottom: 0;
+ }
.form-inline .form-group {
- display: inline-block;
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 auto;
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ -webkit-flex-flow: row wrap;
+ -ms-flex-flow: row wrap;
+ flex-flow: row wrap;
+ -webkit-box-align: center;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
margin-bottom: 0;
- vertical-align: middle;
}
.form-inline .form-control {
display: inline-block;
@@ -2927,596 +2245,590 @@ select[multiple].input-lg {
display: inline-block;
}
.form-inline .input-group {
- display: inline-table;
- vertical-align: middle;
- }
- .form-inline .input-group .input-group-addon,
- .form-inline .input-group .input-group-btn,
- .form-inline .input-group .form-control {
width: auto;
}
- .form-inline .input-group > .form-control {
- width: 100%;
- }
- .form-inline .control-label {
+ .form-inline .form-control-label {
margin-bottom: 0;
vertical-align: middle;
}
- .form-inline .radio,
- .form-inline .checkbox {
- display: inline-block;
+ .form-inline .form-check {
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-align: center;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
+ -webkit-box-pack: center;
+ -webkit-justify-content: center;
+ -ms-flex-pack: center;
+ justify-content: center;
+ width: auto;
margin-top: 0;
margin-bottom: 0;
- vertical-align: middle;
}
- .form-inline .radio label,
- .form-inline .checkbox label {
+ .form-inline .form-check-label {
padding-left: 0;
}
- .form-inline .radio input[type="radio"],
- .form-inline .checkbox input[type="checkbox"] {
+ .form-inline .form-check-input {
position: relative;
+ margin-top: 0;
+ margin-right: 0.25rem;
margin-left: 0;
}
- .form-inline .has-feedback .form-control-feedback {
- top: 0;
- }
-}
-.form-horizontal .radio,
-.form-horizontal .checkbox,
-.form-horizontal .radio-inline,
-.form-horizontal .checkbox-inline {
- padding-top: 7px;
- margin-top: 0;
- margin-bottom: 0;
-}
-.form-horizontal .radio,
-.form-horizontal .checkbox {
- min-height: 27px;
-}
-.form-horizontal .form-group {
- margin-right: -15px;
- margin-left: -15px;
-}
-@media (min-width: 768px) {
- .form-horizontal .control-label {
- padding-top: 7px;
- margin-bottom: 0;
- text-align: right;
+ .form-inline .custom-control {
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-align: center;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
+ -webkit-box-pack: center;
+ -webkit-justify-content: center;
+ -ms-flex-pack: center;
+ justify-content: center;
+ padding-left: 0;
}
-}
-.form-horizontal .has-feedback .form-control-feedback {
- right: 15px;
-}
-@media (min-width: 768px) {
- .form-horizontal .form-group-lg .control-label {
- padding-top: 11px;
- font-size: 18px;
+ .form-inline .custom-control-indicator {
+ position: static;
+ display: inline-block;
+ margin-right: 0.25rem;
+ vertical-align: text-bottom;
}
-}
-@media (min-width: 768px) {
- .form-horizontal .form-group-sm .control-label {
- padding-top: 6px;
- font-size: 12px;
+ .form-inline .has-feedback .form-control-feedback {
+ top: 0;
}
}
+
.btn {
display: inline-block;
- padding: 6px 12px;
- margin-bottom: 0;
- font-size: 14px;
font-weight: normal;
- line-height: 1.42857143;
text-align: center;
white-space: nowrap;
vertical-align: middle;
- -ms-touch-action: manipulation;
- touch-action: manipulation;
- cursor: pointer;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
- background-image: none;
border: 1px solid transparent;
- border-radius: 4px;
-}
-.btn:focus,
-.btn:active:focus,
-.btn.active:focus,
-.btn.focus,
-.btn:active.focus,
-.btn.active.focus {
- outline: 5px auto -webkit-focus-ring-color;
- outline-offset: -2px;
+ padding: 0.5rem 1rem;
+ font-size: 1rem;
+ line-height: 1.25;
+ border-radius: 0.25rem;
+ -webkit-transition: all 0.2s ease-in-out;
+ -o-transition: all 0.2s ease-in-out;
+ transition: all 0.2s ease-in-out;
}
-.btn:hover,
-.btn:focus,
-.btn.focus {
- color: #333;
+
+.btn:focus, .btn:hover {
text-decoration: none;
}
-.btn:active,
-.btn.active {
- background-image: none;
+
+.btn:focus, .btn.focus {
outline: 0;
- -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
- box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
-}
-.btn.disabled,
-.btn[disabled],
-fieldset[disabled] .btn {
- cursor: not-allowed;
- filter: alpha(opacity=65);
- -webkit-box-shadow: none;
- box-shadow: none;
+ -webkit-box-shadow: 0 0 0 2px rgba(2, 117, 216, 0.25);
+ box-shadow: 0 0 0 2px rgba(2, 117, 216, 0.25);
+}
+
+.btn.disabled, .btn:disabled {
opacity: .65;
}
+
+.btn:active, .btn.active {
+ background-image: none;
+}
+
a.btn.disabled,
fieldset[disabled] a.btn {
pointer-events: none;
}
-.btn-default {
- color: #333;
- background-color: #fff;
- border-color: #ccc;
+
+.btn-primary {
+ color: #fff;
+ background-color: #0275d8;
+ border-color: #0275d8;
}
-.btn-default:focus,
-.btn-default.focus {
- color: #333;
- background-color: #e6e6e6;
- border-color: #8c8c8c;
+
+.btn-primary:hover {
+ color: #fff;
+ background-color: #025aa5;
+ border-color: #01549b;
}
-.btn-default:hover {
- color: #333;
- background-color: #e6e6e6;
- border-color: #adadad;
+
+.btn-primary:focus, .btn-primary.focus {
+ -webkit-box-shadow: 0 0 0 2px rgba(2, 117, 216, 0.5);
+ box-shadow: 0 0 0 2px rgba(2, 117, 216, 0.5);
+}
+
+.btn-primary.disabled, .btn-primary:disabled {
+ background-color: #0275d8;
+ border-color: #0275d8;
+}
+
+.btn-primary:active, .btn-primary.active,
+.show > .btn-primary.dropdown-toggle {
+ color: #fff;
+ background-color: #025aa5;
+ background-image: none;
+ border-color: #01549b;
+}
+
+.btn-secondary {
+ color: #292b2c;
+ background-color: #fff;
+ border-color: #ccc;
}
-.btn-default:active,
-.btn-default.active,
-.open > .dropdown-toggle.btn-default {
- color: #333;
+
+.btn-secondary:hover {
+ color: #292b2c;
background-color: #e6e6e6;
border-color: #adadad;
}
-.btn-default:active:hover,
-.btn-default.active:hover,
-.open > .dropdown-toggle.btn-default:hover,
-.btn-default:active:focus,
-.btn-default.active:focus,
-.open > .dropdown-toggle.btn-default:focus,
-.btn-default:active.focus,
-.btn-default.active.focus,
-.open > .dropdown-toggle.btn-default.focus {
- color: #333;
- background-color: #d4d4d4;
- border-color: #8c8c8c;
-}
-.btn-default:active,
-.btn-default.active,
-.open > .dropdown-toggle.btn-default {
- background-image: none;
+
+.btn-secondary:focus, .btn-secondary.focus {
+ -webkit-box-shadow: 0 0 0 2px rgba(204, 204, 204, 0.5);
+ box-shadow: 0 0 0 2px rgba(204, 204, 204, 0.5);
}
-.btn-default.disabled:hover,
-.btn-default[disabled]:hover,
-fieldset[disabled] .btn-default:hover,
-.btn-default.disabled:focus,
-.btn-default[disabled]:focus,
-fieldset[disabled] .btn-default:focus,
-.btn-default.disabled.focus,
-.btn-default[disabled].focus,
-fieldset[disabled] .btn-default.focus {
+
+.btn-secondary.disabled, .btn-secondary:disabled {
background-color: #fff;
border-color: #ccc;
}
-.btn-default .badge {
- color: #fff;
- background-color: #333;
+
+.btn-secondary:active, .btn-secondary.active,
+.show > .btn-secondary.dropdown-toggle {
+ color: #292b2c;
+ background-color: #e6e6e6;
+ background-image: none;
+ border-color: #adadad;
}
-.btn-primary {
+
+.btn-info {
color: #fff;
- background-color: #337ab7;
- border-color: #2e6da4;
+ background-color: #5bc0de;
+ border-color: #5bc0de;
}
-.btn-primary:focus,
-.btn-primary.focus {
+
+.btn-info:hover {
color: #fff;
- background-color: #286090;
- border-color: #122b40;
+ background-color: #31b0d5;
+ border-color: #2aabd2;
}
-.btn-primary:hover {
- color: #fff;
- background-color: #286090;
- border-color: #204d74;
+
+.btn-info:focus, .btn-info.focus {
+ -webkit-box-shadow: 0 0 0 2px rgba(91, 192, 222, 0.5);
+ box-shadow: 0 0 0 2px rgba(91, 192, 222, 0.5);
}
-.btn-primary:active,
-.btn-primary.active,
-.open > .dropdown-toggle.btn-primary {
- color: #fff;
- background-color: #286090;
- border-color: #204d74;
-}
-.btn-primary:active:hover,
-.btn-primary.active:hover,
-.open > .dropdown-toggle.btn-primary:hover,
-.btn-primary:active:focus,
-.btn-primary.active:focus,
-.open > .dropdown-toggle.btn-primary:focus,
-.btn-primary:active.focus,
-.btn-primary.active.focus,
-.open > .dropdown-toggle.btn-primary.focus {
- color: #fff;
- background-color: #204d74;
- border-color: #122b40;
+
+.btn-info.disabled, .btn-info:disabled {
+ background-color: #5bc0de;
+ border-color: #5bc0de;
}
-.btn-primary:active,
-.btn-primary.active,
-.open > .dropdown-toggle.btn-primary {
+
+.btn-info:active, .btn-info.active,
+.show > .btn-info.dropdown-toggle {
+ color: #fff;
+ background-color: #31b0d5;
background-image: none;
+ border-color: #2aabd2;
}
-.btn-primary.disabled:hover,
-.btn-primary[disabled]:hover,
-fieldset[disabled] .btn-primary:hover,
-.btn-primary.disabled:focus,
-.btn-primary[disabled]:focus,
-fieldset[disabled] .btn-primary:focus,
-.btn-primary.disabled.focus,
-.btn-primary[disabled].focus,
-fieldset[disabled] .btn-primary.focus {
- background-color: #337ab7;
- border-color: #2e6da4;
-}
-.btn-primary .badge {
- color: #337ab7;
- background-color: #fff;
-}
+
.btn-success {
color: #fff;
background-color: #5cb85c;
- border-color: #4cae4c;
+ border-color: #5cb85c;
}
-.btn-success:focus,
-.btn-success.focus {
+
+.btn-success:hover {
color: #fff;
background-color: #449d44;
- border-color: #255625;
+ border-color: #419641;
}
-.btn-success:hover {
+
+.btn-success:focus, .btn-success.focus {
+ -webkit-box-shadow: 0 0 0 2px rgba(92, 184, 92, 0.5);
+ box-shadow: 0 0 0 2px rgba(92, 184, 92, 0.5);
+}
+
+.btn-success.disabled, .btn-success:disabled {
+ background-color: #5cb85c;
+ border-color: #5cb85c;
+}
+
+.btn-success:active, .btn-success.active,
+.show > .btn-success.dropdown-toggle {
color: #fff;
background-color: #449d44;
- border-color: #398439;
+ background-image: none;
+ border-color: #419641;
}
-.btn-success:active,
-.btn-success.active,
-.open > .dropdown-toggle.btn-success {
+
+.btn-warning {
color: #fff;
- background-color: #449d44;
- border-color: #398439;
-}
-.btn-success:active:hover,
-.btn-success.active:hover,
-.open > .dropdown-toggle.btn-success:hover,
-.btn-success:active:focus,
-.btn-success.active:focus,
-.open > .dropdown-toggle.btn-success:focus,
-.btn-success:active.focus,
-.btn-success.active.focus,
-.open > .dropdown-toggle.btn-success.focus {
+ background-color: #f0ad4e;
+ border-color: #f0ad4e;
+}
+
+.btn-warning:hover {
color: #fff;
- background-color: #398439;
- border-color: #255625;
+ background-color: #ec971f;
+ border-color: #eb9316;
}
-.btn-success:active,
-.btn-success.active,
-.open > .dropdown-toggle.btn-success {
- background-image: none;
+
+.btn-warning:focus, .btn-warning.focus {
+ -webkit-box-shadow: 0 0 0 2px rgba(240, 173, 78, 0.5);
+ box-shadow: 0 0 0 2px rgba(240, 173, 78, 0.5);
}
-.btn-success.disabled:hover,
-.btn-success[disabled]:hover,
-fieldset[disabled] .btn-success:hover,
-.btn-success.disabled:focus,
-.btn-success[disabled]:focus,
-fieldset[disabled] .btn-success:focus,
-.btn-success.disabled.focus,
-.btn-success[disabled].focus,
-fieldset[disabled] .btn-success.focus {
- background-color: #5cb85c;
- border-color: #4cae4c;
+
+.btn-warning.disabled, .btn-warning:disabled {
+ background-color: #f0ad4e;
+ border-color: #f0ad4e;
}
-.btn-success .badge {
- color: #5cb85c;
- background-color: #fff;
+
+.btn-warning:active, .btn-warning.active,
+.show > .btn-warning.dropdown-toggle {
+ color: #fff;
+ background-color: #ec971f;
+ background-image: none;
+ border-color: #eb9316;
}
-.btn-info {
+
+.btn-danger {
color: #fff;
- background-color: #5bc0de;
- border-color: #46b8da;
+ background-color: #d9534f;
+ border-color: #d9534f;
}
-.btn-info:focus,
-.btn-info.focus {
+
+.btn-danger:hover {
color: #fff;
- background-color: #31b0d5;
- border-color: #1b6d85;
+ background-color: #c9302c;
+ border-color: #c12e2a;
}
-.btn-info:hover {
+
+.btn-danger:focus, .btn-danger.focus {
+ -webkit-box-shadow: 0 0 0 2px rgba(217, 83, 79, 0.5);
+ box-shadow: 0 0 0 2px rgba(217, 83, 79, 0.5);
+}
+
+.btn-danger.disabled, .btn-danger:disabled {
+ background-color: #d9534f;
+ border-color: #d9534f;
+}
+
+.btn-danger:active, .btn-danger.active,
+.show > .btn-danger.dropdown-toggle {
color: #fff;
- background-color: #31b0d5;
- border-color: #269abc;
+ background-color: #c9302c;
+ background-image: none;
+ border-color: #c12e2a;
+}
+
+.btn-outline-primary {
+ color: #0275d8;
+ background-color: transparent;
+ background-image: none;
+ border-color: #0275d8;
}
-.btn-info:active,
-.btn-info.active,
-.open > .dropdown-toggle.btn-info {
+
+.btn-outline-primary:hover {
color: #fff;
- background-color: #31b0d5;
- border-color: #269abc;
-}
-.btn-info:active:hover,
-.btn-info.active:hover,
-.open > .dropdown-toggle.btn-info:hover,
-.btn-info:active:focus,
-.btn-info.active:focus,
-.open > .dropdown-toggle.btn-info:focus,
-.btn-info:active.focus,
-.btn-info.active.focus,
-.open > .dropdown-toggle.btn-info.focus {
+ background-color: #0275d8;
+ border-color: #0275d8;
+}
+
+.btn-outline-primary:focus, .btn-outline-primary.focus {
+ -webkit-box-shadow: 0 0 0 2px rgba(2, 117, 216, 0.5);
+ box-shadow: 0 0 0 2px rgba(2, 117, 216, 0.5);
+}
+
+.btn-outline-primary.disabled, .btn-outline-primary:disabled {
+ color: #0275d8;
+ background-color: transparent;
+}
+
+.btn-outline-primary:active, .btn-outline-primary.active,
+.show > .btn-outline-primary.dropdown-toggle {
color: #fff;
- background-color: #269abc;
- border-color: #1b6d85;
+ background-color: #0275d8;
+ border-color: #0275d8;
}
-.btn-info:active,
-.btn-info.active,
-.open > .dropdown-toggle.btn-info {
+
+.btn-outline-secondary {
+ color: #ccc;
+ background-color: transparent;
background-image: none;
+ border-color: #ccc;
}
-.btn-info.disabled:hover,
-.btn-info[disabled]:hover,
-fieldset[disabled] .btn-info:hover,
-.btn-info.disabled:focus,
-.btn-info[disabled]:focus,
-fieldset[disabled] .btn-info:focus,
-.btn-info.disabled.focus,
-.btn-info[disabled].focus,
-fieldset[disabled] .btn-info.focus {
- background-color: #5bc0de;
- border-color: #46b8da;
+
+.btn-outline-secondary:hover {
+ color: #292b2c;
+ background-color: #ccc;
+ border-color: #ccc;
+}
+
+.btn-outline-secondary:focus, .btn-outline-secondary.focus {
+ -webkit-box-shadow: 0 0 0 2px rgba(204, 204, 204, 0.5);
+ box-shadow: 0 0 0 2px rgba(204, 204, 204, 0.5);
}
-.btn-info .badge {
+
+.btn-outline-secondary.disabled, .btn-outline-secondary:disabled {
+ color: #ccc;
+ background-color: transparent;
+}
+
+.btn-outline-secondary:active, .btn-outline-secondary.active,
+.show > .btn-outline-secondary.dropdown-toggle {
+ color: #292b2c;
+ background-color: #ccc;
+ border-color: #ccc;
+}
+
+.btn-outline-info {
color: #5bc0de;
- background-color: #fff;
+ background-color: transparent;
+ background-image: none;
+ border-color: #5bc0de;
}
-.btn-warning {
+
+.btn-outline-info:hover {
color: #fff;
- background-color: #f0ad4e;
- border-color: #eea236;
+ background-color: #5bc0de;
+ border-color: #5bc0de;
}
-.btn-warning:focus,
-.btn-warning.focus {
- color: #fff;
- background-color: #ec971f;
- border-color: #985f0d;
+
+.btn-outline-info:focus, .btn-outline-info.focus {
+ -webkit-box-shadow: 0 0 0 2px rgba(91, 192, 222, 0.5);
+ box-shadow: 0 0 0 2px rgba(91, 192, 222, 0.5);
}
-.btn-warning:hover {
- color: #fff;
- background-color: #ec971f;
- border-color: #d58512;
+
+.btn-outline-info.disabled, .btn-outline-info:disabled {
+ color: #5bc0de;
+ background-color: transparent;
}
-.btn-warning:active,
-.btn-warning.active,
-.open > .dropdown-toggle.btn-warning {
- color: #fff;
- background-color: #ec971f;
- border-color: #d58512;
-}
-.btn-warning:active:hover,
-.btn-warning.active:hover,
-.open > .dropdown-toggle.btn-warning:hover,
-.btn-warning:active:focus,
-.btn-warning.active:focus,
-.open > .dropdown-toggle.btn-warning:focus,
-.btn-warning:active.focus,
-.btn-warning.active.focus,
-.open > .dropdown-toggle.btn-warning.focus {
+
+.btn-outline-info:active, .btn-outline-info.active,
+.show > .btn-outline-info.dropdown-toggle {
color: #fff;
- background-color: #d58512;
- border-color: #985f0d;
+ background-color: #5bc0de;
+ border-color: #5bc0de;
}
-.btn-warning:active,
-.btn-warning.active,
-.open > .dropdown-toggle.btn-warning {
+
+.btn-outline-success {
+ color: #5cb85c;
+ background-color: transparent;
background-image: none;
+ border-color: #5cb85c;
}
-.btn-warning.disabled:hover,
-.btn-warning[disabled]:hover,
-fieldset[disabled] .btn-warning:hover,
-.btn-warning.disabled:focus,
-.btn-warning[disabled]:focus,
-fieldset[disabled] .btn-warning:focus,
-.btn-warning.disabled.focus,
-.btn-warning[disabled].focus,
-fieldset[disabled] .btn-warning.focus {
- background-color: #f0ad4e;
- border-color: #eea236;
+
+.btn-outline-success:hover {
+ color: #fff;
+ background-color: #5cb85c;
+ border-color: #5cb85c;
}
-.btn-warning .badge {
- color: #f0ad4e;
- background-color: #fff;
+
+.btn-outline-success:focus, .btn-outline-success.focus {
+ -webkit-box-shadow: 0 0 0 2px rgba(92, 184, 92, 0.5);
+ box-shadow: 0 0 0 2px rgba(92, 184, 92, 0.5);
}
-.btn-danger {
- color: #fff;
- background-color: #d9534f;
- border-color: #d43f3a;
+
+.btn-outline-success.disabled, .btn-outline-success:disabled {
+ color: #5cb85c;
+ background-color: transparent;
}
-.btn-danger:focus,
-.btn-danger.focus {
+
+.btn-outline-success:active, .btn-outline-success.active,
+.show > .btn-outline-success.dropdown-toggle {
color: #fff;
- background-color: #c9302c;
- border-color: #761c19;
+ background-color: #5cb85c;
+ border-color: #5cb85c;
}
-.btn-danger:hover {
- color: #fff;
- background-color: #c9302c;
- border-color: #ac2925;
+
+.btn-outline-warning {
+ color: #f0ad4e;
+ background-color: transparent;
+ background-image: none;
+ border-color: #f0ad4e;
}
-.btn-danger:active,
-.btn-danger.active,
-.open > .dropdown-toggle.btn-danger {
+
+.btn-outline-warning:hover {
color: #fff;
- background-color: #c9302c;
- border-color: #ac2925;
-}
-.btn-danger:active:hover,
-.btn-danger.active:hover,
-.open > .dropdown-toggle.btn-danger:hover,
-.btn-danger:active:focus,
-.btn-danger.active:focus,
-.open > .dropdown-toggle.btn-danger:focus,
-.btn-danger:active.focus,
-.btn-danger.active.focus,
-.open > .dropdown-toggle.btn-danger.focus {
+ background-color: #f0ad4e;
+ border-color: #f0ad4e;
+}
+
+.btn-outline-warning:focus, .btn-outline-warning.focus {
+ -webkit-box-shadow: 0 0 0 2px rgba(240, 173, 78, 0.5);
+ box-shadow: 0 0 0 2px rgba(240, 173, 78, 0.5);
+}
+
+.btn-outline-warning.disabled, .btn-outline-warning:disabled {
+ color: #f0ad4e;
+ background-color: transparent;
+}
+
+.btn-outline-warning:active, .btn-outline-warning.active,
+.show > .btn-outline-warning.dropdown-toggle {
color: #fff;
- background-color: #ac2925;
- border-color: #761c19;
+ background-color: #f0ad4e;
+ border-color: #f0ad4e;
}
-.btn-danger:active,
-.btn-danger.active,
-.open > .dropdown-toggle.btn-danger {
+
+.btn-outline-danger {
+ color: #d9534f;
+ background-color: transparent;
background-image: none;
+ border-color: #d9534f;
}
-.btn-danger.disabled:hover,
-.btn-danger[disabled]:hover,
-fieldset[disabled] .btn-danger:hover,
-.btn-danger.disabled:focus,
-.btn-danger[disabled]:focus,
-fieldset[disabled] .btn-danger:focus,
-.btn-danger.disabled.focus,
-.btn-danger[disabled].focus,
-fieldset[disabled] .btn-danger.focus {
+
+.btn-outline-danger:hover {
+ color: #fff;
background-color: #d9534f;
- border-color: #d43f3a;
+ border-color: #d9534f;
+}
+
+.btn-outline-danger:focus, .btn-outline-danger.focus {
+ -webkit-box-shadow: 0 0 0 2px rgba(217, 83, 79, 0.5);
+ box-shadow: 0 0 0 2px rgba(217, 83, 79, 0.5);
}
-.btn-danger .badge {
+
+.btn-outline-danger.disabled, .btn-outline-danger:disabled {
color: #d9534f;
- background-color: #fff;
+ background-color: transparent;
+}
+
+.btn-outline-danger:active, .btn-outline-danger.active,
+.show > .btn-outline-danger.dropdown-toggle {
+ color: #fff;
+ background-color: #d9534f;
+ border-color: #d9534f;
}
+
.btn-link {
font-weight: normal;
- color: #337ab7;
+ color: #0275d8;
border-radius: 0;
}
-.btn-link,
-.btn-link:active,
-.btn-link.active,
-.btn-link[disabled],
-fieldset[disabled] .btn-link {
+
+.btn-link, .btn-link:active, .btn-link.active, .btn-link:disabled {
background-color: transparent;
- -webkit-box-shadow: none;
- box-shadow: none;
}
-.btn-link,
-.btn-link:hover,
-.btn-link:focus,
-.btn-link:active {
+
+.btn-link, .btn-link:focus, .btn-link:active {
+ border-color: transparent;
+}
+
+.btn-link:hover {
border-color: transparent;
}
-.btn-link:hover,
-.btn-link:focus {
- color: #23527c;
+
+.btn-link:focus, .btn-link:hover {
+ color: #014c8c;
text-decoration: underline;
background-color: transparent;
}
-.btn-link[disabled]:hover,
-fieldset[disabled] .btn-link:hover,
-.btn-link[disabled]:focus,
-fieldset[disabled] .btn-link:focus {
- color: #777;
+
+.btn-link:disabled {
+ color: #636c72;
+}
+
+.btn-link:disabled:focus, .btn-link:disabled:hover {
text-decoration: none;
}
-.btn-lg,
-.btn-group-lg > .btn {
- padding: 10px 16px;
- font-size: 18px;
- line-height: 1.3333333;
- border-radius: 6px;
-}
-.btn-sm,
-.btn-group-sm > .btn {
- padding: 5px 10px;
- font-size: 12px;
+
+.btn-lg, .btn-group-lg > .btn {
+ padding: 0.5rem 1rem;
+ font-size: 1.25rem;
line-height: 1.5;
- border-radius: 3px;
+ border-radius: 0.3rem;
}
-.btn-xs,
-.btn-group-xs > .btn {
- padding: 1px 5px;
- font-size: 12px;
+
+.btn-sm, .btn-group-sm > .btn {
+ padding: 0.25rem 0.5rem;
+ font-size: 0.875rem;
line-height: 1.5;
- border-radius: 3px;
+ border-radius: 0.2rem;
}
+
.btn-block {
display: block;
width: 100%;
}
+
.btn-block + .btn-block {
- margin-top: 5px;
+ margin-top: 0.5rem;
}
+
input[type="submit"].btn-block,
input[type="reset"].btn-block,
input[type="button"].btn-block {
width: 100%;
}
+
.fade {
opacity: 0;
- -webkit-transition: opacity .15s linear;
- -o-transition: opacity .15s linear;
- transition: opacity .15s linear;
+ -webkit-transition: opacity 0.15s linear;
+ -o-transition: opacity 0.15s linear;
+ transition: opacity 0.15s linear;
}
-.fade.in {
+
+.fade.show {
opacity: 1;
}
+
.collapse {
display: none;
}
-.collapse.in {
+
+.collapse.show {
display: block;
}
-tr.collapse.in {
+
+tr.collapse.show {
display: table-row;
}
-tbody.collapse.in {
+
+tbody.collapse.show {
display: table-row-group;
}
+
.collapsing {
position: relative;
height: 0;
overflow: hidden;
- -webkit-transition-timing-function: ease;
- -o-transition-timing-function: ease;
- transition-timing-function: ease;
- -webkit-transition-duration: .35s;
- -o-transition-duration: .35s;
- transition-duration: .35s;
- -webkit-transition-property: height, visibility;
- -o-transition-property: height, visibility;
- transition-property: height, visibility;
-}
-.caret {
+ -webkit-transition: height 0.35s ease;
+ -o-transition: height 0.35s ease;
+ transition: height 0.35s ease;
+}
+
+.dropup,
+.dropdown {
+ position: relative;
+}
+
+.dropdown-toggle::after {
display: inline-block;
width: 0;
height: 0;
- margin-left: 2px;
+ margin-left: 0.3em;
vertical-align: middle;
- border-top: 4px dashed;
- border-top: 4px solid \9;
- border-right: 4px solid transparent;
- border-left: 4px solid transparent;
+ content: "";
+ border-top: 0.3em solid;
+ border-right: 0.3em solid transparent;
+ border-left: 0.3em solid transparent;
}
-.dropup,
-.dropdown {
- position: relative;
+
+.dropdown-toggle:empty::after {
+ margin-left: 0;
}
-.dropdown-toggle:focus {
- outline: 0;
+
+.dropup .dropdown-toggle::after {
+ border-top: 0;
+ border-bottom: 0.3em solid;
}
+
.dropdown-menu {
position: absolute;
top: 100%;
@@ -3524,235 +2836,233 @@ tbody.collapse.in {
z-index: 1000;
display: none;
float: left;
- min-width: 160px;
- padding: 5px 0;
- margin: 2px 0 0;
- font-size: 14px;
+ min-width: 10rem;
+ padding: 0.5rem 0;
+ margin: 0.125rem 0 0;
+ font-size: 1rem;
+ color: #292b2c;
text-align: left;
list-style: none;
background-color: #fff;
-webkit-background-clip: padding-box;
background-clip: padding-box;
- border: 1px solid #ccc;
- border: 1px solid rgba(0, 0, 0, .15);
- border-radius: 4px;
- -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175);
- box-shadow: 0 6px 12px rgba(0, 0, 0, .175);
-}
-.dropdown-menu.pull-right {
- right: 0;
- left: auto;
+ border: 1px solid rgba(0, 0, 0, 0.15);
+ border-radius: 0.25rem;
}
-.dropdown-menu .divider {
- height: 1px;
- margin: 9px 0;
+
+.dropdown-divider {
+ height: 0;
+ margin: 0.5rem 0;
overflow: hidden;
- background-color: #e5e5e5;
+ border-top: 1px solid #eceeef;
}
-.dropdown-menu > li > a {
+
+.dropdown-item {
display: block;
- padding: 3px 20px;
+ width: 100%;
+ padding: 0.25rem 1.5rem;
clear: both;
font-weight: normal;
- line-height: 1.42857143;
- color: #333;
+ color: #292b2c;
+ text-align: inherit;
white-space: nowrap;
+ background: none;
+ border: 0;
}
-.dropdown-menu > li > a:hover,
-.dropdown-menu > li > a:focus {
- color: #262626;
+
+.dropdown-item:focus, .dropdown-item:hover {
+ color: #1d1e1f;
text-decoration: none;
- background-color: #f5f5f5;
+ background-color: #f7f7f9;
}
-.dropdown-menu > .active > a,
-.dropdown-menu > .active > a:hover,
-.dropdown-menu > .active > a:focus {
+
+.dropdown-item.active, .dropdown-item:active {
color: #fff;
text-decoration: none;
- background-color: #337ab7;
- outline: 0;
-}
-.dropdown-menu > .disabled > a,
-.dropdown-menu > .disabled > a:hover,
-.dropdown-menu > .disabled > a:focus {
- color: #777;
+ background-color: #0275d8;
}
-.dropdown-menu > .disabled > a:hover,
-.dropdown-menu > .disabled > a:focus {
- text-decoration: none;
- cursor: not-allowed;
+
+.dropdown-item.disabled, .dropdown-item:disabled {
+ color: #636c72;
background-color: transparent;
- background-image: none;
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
}
-.open > .dropdown-menu {
+
+.show > .dropdown-menu {
display: block;
}
-.open > a {
+
+.show > a {
outline: 0;
}
+
.dropdown-menu-right {
right: 0;
left: auto;
}
+
.dropdown-menu-left {
right: auto;
left: 0;
}
+
.dropdown-header {
display: block;
- padding: 3px 20px;
- font-size: 12px;
- line-height: 1.42857143;
- color: #777;
+ padding: 0.5rem 1.5rem;
+ margin-bottom: 0;
+ font-size: 0.875rem;
+ color: #636c72;
white-space: nowrap;
}
-.dropdown-backdrop {
- position: fixed;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- z-index: 990;
-}
-.pull-right > .dropdown-menu {
- right: 0;
- left: auto;
-}
-.dropup .caret,
-.navbar-fixed-bottom .dropdown .caret {
- content: "";
- border-top: 0;
- border-bottom: 4px dashed;
- border-bottom: 4px solid \9;
-}
-.dropup .dropdown-menu,
-.navbar-fixed-bottom .dropdown .dropdown-menu {
+
+.dropup .dropdown-menu {
top: auto;
bottom: 100%;
- margin-bottom: 2px;
-}
-@media (min-width: 768px) {
- .navbar-right .dropdown-menu {
- right: 0;
- left: auto;
- }
- .navbar-right .dropdown-menu-left {
- right: auto;
- left: 0;
- }
+ margin-bottom: 0.125rem;
}
+
.btn-group,
.btn-group-vertical {
position: relative;
- display: inline-block;
+ display: -webkit-inline-box;
+ display: -webkit-inline-flex;
+ display: -ms-inline-flexbox;
+ display: inline-flex;
vertical-align: middle;
}
+
.btn-group > .btn,
.btn-group-vertical > .btn {
position: relative;
- float: left;
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 1 auto;
+ -ms-flex: 0 1 auto;
+ flex: 0 1 auto;
+ margin-bottom: 0;
}
+
.btn-group > .btn:hover,
-.btn-group-vertical > .btn:hover,
-.btn-group > .btn:focus,
+.btn-group-vertical > .btn:hover {
+ z-index: 2;
+}
+
+.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active,
.btn-group-vertical > .btn:focus,
-.btn-group > .btn:active,
.btn-group-vertical > .btn:active,
-.btn-group > .btn.active,
.btn-group-vertical > .btn.active {
z-index: 2;
}
+
.btn-group .btn + .btn,
.btn-group .btn + .btn-group,
.btn-group .btn-group + .btn,
-.btn-group .btn-group + .btn-group {
+.btn-group .btn-group + .btn-group,
+.btn-group-vertical .btn + .btn,
+.btn-group-vertical .btn + .btn-group,
+.btn-group-vertical .btn-group + .btn,
+.btn-group-vertical .btn-group + .btn-group {
margin-left: -1px;
}
+
.btn-toolbar {
- margin-left: -5px;
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-flex-wrap: wrap;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
+ -webkit-box-pack: start;
+ -webkit-justify-content: flex-start;
+ -ms-flex-pack: start;
+ justify-content: flex-start;
}
-.btn-toolbar .btn,
-.btn-toolbar .btn-group,
+
.btn-toolbar .input-group {
- float: left;
-}
-.btn-toolbar > .btn,
-.btn-toolbar > .btn-group,
-.btn-toolbar > .input-group {
- margin-left: 5px;
+ width: auto;
}
+
.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
border-radius: 0;
}
+
.btn-group > .btn:first-child {
margin-left: 0;
}
+
.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {
border-top-right-radius: 0;
border-bottom-right-radius: 0;
}
+
.btn-group > .btn:last-child:not(:first-child),
.btn-group > .dropdown-toggle:not(:first-child) {
border-top-left-radius: 0;
border-bottom-left-radius: 0;
}
+
.btn-group > .btn-group {
float: left;
}
+
.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
border-radius: 0;
}
+
.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,
.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {
border-top-right-radius: 0;
border-bottom-right-radius: 0;
}
+
.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {
border-top-left-radius: 0;
border-bottom-left-radius: 0;
}
-.btn-group .dropdown-toggle:active,
-.btn-group.open .dropdown-toggle {
- outline: 0;
-}
-.btn-group > .btn + .dropdown-toggle {
- padding-right: 8px;
- padding-left: 8px;
-}
-.btn-group > .btn-lg + .dropdown-toggle {
- padding-right: 12px;
- padding-left: 12px;
-}
-.btn-group.open .dropdown-toggle {
- -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
- box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
-}
-.btn-group.open .dropdown-toggle.btn-link {
- -webkit-box-shadow: none;
- box-shadow: none;
+
+.btn + .dropdown-toggle-split {
+ padding-right: 0.75rem;
+ padding-left: 0.75rem;
}
-.btn .caret {
+
+.btn + .dropdown-toggle-split::after {
margin-left: 0;
}
-.btn-lg .caret {
- border-width: 5px 5px 0;
- border-bottom-width: 0;
+
+.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split {
+ padding-right: 0.375rem;
+ padding-left: 0.375rem;
}
-.dropup .btn-lg .caret {
- border-width: 0 5px 5px;
+
+.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {
+ padding-right: 0.75rem;
+ padding-left: 0.75rem;
}
-.btn-group-vertical > .btn,
-.btn-group-vertical > .btn-group,
-.btn-group-vertical > .btn-group > .btn {
- display: block;
- float: none;
- width: 100%;
- max-width: 100%;
+
+.btn-group-vertical {
+ display: -webkit-inline-box;
+ display: -webkit-inline-flex;
+ display: -ms-inline-flexbox;
+ display: inline-flex;
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ -webkit-flex-direction: column;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ -webkit-box-align: start;
+ -webkit-align-items: flex-start;
+ -ms-flex-align: start;
+ align-items: flex-start;
+ -webkit-box-pack: center;
+ -webkit-justify-content: center;
+ -ms-flex-pack: center;
+ justify-content: center;
}
-.btn-group-vertical > .btn-group > .btn {
- float: none;
+
+.btn-group-vertical .btn,
+.btn-group-vertical .btn-group {
+ width: 100%;
}
+
.btn-group-vertical > .btn + .btn,
.btn-group-vertical > .btn + .btn-group,
.btn-group-vertical > .btn-group + .btn,
@@ -3760,1091 +3070,1480 @@ tbody.collapse.in {
margin-top: -1px;
margin-left: 0;
}
+
.btn-group-vertical > .btn:not(:first-child):not(:last-child) {
border-radius: 0;
}
+
.btn-group-vertical > .btn:first-child:not(:last-child) {
- border-top-left-radius: 4px;
- border-top-right-radius: 4px;
border-bottom-right-radius: 0;
border-bottom-left-radius: 0;
}
+
.btn-group-vertical > .btn:last-child:not(:first-child) {
border-top-left-radius: 0;
border-top-right-radius: 0;
- border-bottom-right-radius: 4px;
- border-bottom-left-radius: 4px;
}
+
.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {
border-radius: 0;
}
+
.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,
.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {
border-bottom-right-radius: 0;
border-bottom-left-radius: 0;
}
+
.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {
border-top-left-radius: 0;
border-top-right-radius: 0;
}
-.btn-group-justified {
- display: table;
- width: 100%;
- table-layout: fixed;
- border-collapse: separate;
-}
-.btn-group-justified > .btn,
-.btn-group-justified > .btn-group {
- display: table-cell;
- float: none;
- width: 1%;
-}
-.btn-group-justified > .btn-group .btn {
- width: 100%;
-}
-.btn-group-justified > .btn-group .dropdown-menu {
- left: auto;
-}
+
[data-toggle="buttons"] > .btn input[type="radio"],
-[data-toggle="buttons"] > .btn-group > .btn input[type="radio"],
[data-toggle="buttons"] > .btn input[type="checkbox"],
+[data-toggle="buttons"] > .btn-group > .btn input[type="radio"],
[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] {
position: absolute;
clip: rect(0, 0, 0, 0);
pointer-events: none;
}
+
.input-group {
position: relative;
- display: table;
- border-collapse: separate;
-}
-.input-group[class*="col-"] {
- float: none;
- padding-right: 0;
- padding-left: 0;
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ width: 100%;
}
+
.input-group .form-control {
position: relative;
z-index: 2;
- float: left;
- width: 100%;
+ -webkit-box-flex: 1;
+ -webkit-flex: 1 1 auto;
+ -ms-flex: 1 1 auto;
+ flex: 1 1 auto;
+ width: 1%;
margin-bottom: 0;
}
-.input-group .form-control:focus {
+
+.input-group .form-control:focus, .input-group .form-control:active, .input-group .form-control:hover {
z-index: 3;
}
-.input-group-lg > .form-control,
-.input-group-lg > .input-group-addon,
-.input-group-lg > .input-group-btn > .btn {
- height: 46px;
- padding: 10px 16px;
- font-size: 18px;
- line-height: 1.3333333;
- border-radius: 6px;
-}
-select.input-group-lg > .form-control,
-select.input-group-lg > .input-group-addon,
-select.input-group-lg > .input-group-btn > .btn {
- height: 46px;
- line-height: 46px;
-}
-textarea.input-group-lg > .form-control,
-textarea.input-group-lg > .input-group-addon,
-textarea.input-group-lg > .input-group-btn > .btn,
-select[multiple].input-group-lg > .form-control,
-select[multiple].input-group-lg > .input-group-addon,
-select[multiple].input-group-lg > .input-group-btn > .btn {
- height: auto;
-}
-.input-group-sm > .form-control,
-.input-group-sm > .input-group-addon,
-.input-group-sm > .input-group-btn > .btn {
- height: 30px;
- padding: 5px 10px;
- font-size: 12px;
- line-height: 1.5;
- border-radius: 3px;
-}
-select.input-group-sm > .form-control,
-select.input-group-sm > .input-group-addon,
-select.input-group-sm > .input-group-btn > .btn {
- height: 30px;
- line-height: 30px;
-}
-textarea.input-group-sm > .form-control,
-textarea.input-group-sm > .input-group-addon,
-textarea.input-group-sm > .input-group-btn > .btn,
-select[multiple].input-group-sm > .form-control,
-select[multiple].input-group-sm > .input-group-addon,
-select[multiple].input-group-sm > .input-group-btn > .btn {
- height: auto;
-}
+
.input-group-addon,
.input-group-btn,
.input-group .form-control {
- display: table-cell;
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-align: center;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
}
+
.input-group-addon:not(:first-child):not(:last-child),
.input-group-btn:not(:first-child):not(:last-child),
.input-group .form-control:not(:first-child):not(:last-child) {
border-radius: 0;
}
+
.input-group-addon,
.input-group-btn {
- width: 1%;
white-space: nowrap;
vertical-align: middle;
}
+
.input-group-addon {
- padding: 6px 12px;
- font-size: 14px;
+ padding: 0.5rem 1rem;
+ margin-bottom: 0;
+ font-size: 1rem;
font-weight: normal;
- line-height: 1;
- color: #555;
+ line-height: 1.25;
+ color: #464a4c;
text-align: center;
- background-color: #eee;
- border: 1px solid #ccc;
- border-radius: 4px;
+ background-color: #eceeef;
+ border: 1px solid rgba(0, 0, 0, 0.15);
+ border-radius: 0.25rem;
}
-.input-group-addon.input-sm {
- padding: 5px 10px;
- font-size: 12px;
- border-radius: 3px;
+
+.input-group-addon.form-control-sm,
+.input-group-sm > .input-group-addon,
+.input-group-sm > .input-group-btn > .input-group-addon.btn {
+ padding: 0.25rem 0.5rem;
+ font-size: 0.875rem;
+ border-radius: 0.2rem;
}
-.input-group-addon.input-lg {
- padding: 10px 16px;
- font-size: 18px;
- border-radius: 6px;
+
+.input-group-addon.form-control-lg,
+.input-group-lg > .input-group-addon,
+.input-group-lg > .input-group-btn > .input-group-addon.btn {
+ padding: 0.5rem 1rem;
+ font-size: 1.25rem;
+ border-radius: 0.3rem;
}
+
.input-group-addon input[type="radio"],
.input-group-addon input[type="checkbox"] {
margin-top: 0;
}
-.input-group .form-control:first-child,
-.input-group-addon:first-child,
-.input-group-btn:first-child > .btn,
-.input-group-btn:first-child > .btn-group > .btn,
-.input-group-btn:first-child > .dropdown-toggle,
-.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),
-.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {
+
+.input-group .form-control:not(:last-child),
+.input-group-addon:not(:last-child),
+.input-group-btn:not(:last-child) > .btn,
+.input-group-btn:not(:last-child) > .btn-group > .btn,
+.input-group-btn:not(:last-child) > .dropdown-toggle,
+.input-group-btn:not(:first-child) > .btn:not(:last-child):not(.dropdown-toggle),
+.input-group-btn:not(:first-child) > .btn-group:not(:last-child) > .btn {
border-top-right-radius: 0;
border-bottom-right-radius: 0;
}
-.input-group-addon:first-child {
+
+.input-group-addon:not(:last-child) {
border-right: 0;
}
-.input-group .form-control:last-child,
-.input-group-addon:last-child,
-.input-group-btn:last-child > .btn,
-.input-group-btn:last-child > .btn-group > .btn,
-.input-group-btn:last-child > .dropdown-toggle,
-.input-group-btn:first-child > .btn:not(:first-child),
-.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {
+
+.input-group .form-control:not(:first-child),
+.input-group-addon:not(:first-child),
+.input-group-btn:not(:first-child) > .btn,
+.input-group-btn:not(:first-child) > .btn-group > .btn,
+.input-group-btn:not(:first-child) > .dropdown-toggle,
+.input-group-btn:not(:last-child) > .btn:not(:first-child),
+.input-group-btn:not(:last-child) > .btn-group:not(:first-child) > .btn {
border-top-left-radius: 0;
border-bottom-left-radius: 0;
}
-.input-group-addon:last-child {
+
+.form-control + .input-group-addon:not(:first-child) {
border-left: 0;
}
+
.input-group-btn {
position: relative;
font-size: 0;
white-space: nowrap;
}
+
.input-group-btn > .btn {
position: relative;
}
+
.input-group-btn > .btn + .btn {
margin-left: -1px;
}
-.input-group-btn > .btn:hover,
-.input-group-btn > .btn:focus,
-.input-group-btn > .btn:active {
- z-index: 2;
+
+.input-group-btn > .btn:focus, .input-group-btn > .btn:active, .input-group-btn > .btn:hover {
+ z-index: 3;
}
-.input-group-btn:first-child > .btn,
-.input-group-btn:first-child > .btn-group {
+
+.input-group-btn:not(:last-child) > .btn,
+.input-group-btn:not(:last-child) > .btn-group {
margin-right: -1px;
}
-.input-group-btn:last-child > .btn,
-.input-group-btn:last-child > .btn-group {
+
+.input-group-btn:not(:first-child) > .btn,
+.input-group-btn:not(:first-child) > .btn-group {
z-index: 2;
margin-left: -1px;
}
-.nav {
- padding-left: 0;
- margin-bottom: 0;
- list-style: none;
+
+.input-group-btn:not(:first-child) > .btn:focus, .input-group-btn:not(:first-child) > .btn:active, .input-group-btn:not(:first-child) > .btn:hover,
+.input-group-btn:not(:first-child) > .btn-group:focus,
+.input-group-btn:not(:first-child) > .btn-group:active,
+.input-group-btn:not(:first-child) > .btn-group:hover {
+ z-index: 3;
}
-.nav > li {
+
+.custom-control {
position: relative;
- display: block;
+ display: -webkit-inline-box;
+ display: -webkit-inline-flex;
+ display: -ms-inline-flexbox;
+ display: inline-flex;
+ min-height: 1.5rem;
+ padding-left: 1.5rem;
+ margin-right: 1rem;
}
-.nav > li > a {
- position: relative;
- display: block;
- padding: 10px 15px;
+
+.custom-control-input {
+ position: absolute;
+ z-index: -1;
+ opacity: 0;
}
-.nav > li > a:hover,
-.nav > li > a:focus {
- text-decoration: none;
- background-color: #eee;
+
+.custom-control-input:checked ~ .custom-control-indicator {
+ color: #fff;
+ background-color: #0275d8;
}
-.nav > li.disabled > a {
- color: #777;
+
+.custom-control-input:focus ~ .custom-control-indicator {
+ -webkit-box-shadow: 0 0 0 1px #fff, 0 0 0 3px #0275d8;
+ box-shadow: 0 0 0 1px #fff, 0 0 0 3px #0275d8;
}
-.nav > li.disabled > a:hover,
-.nav > li.disabled > a:focus {
- color: #777;
- text-decoration: none;
- cursor: not-allowed;
- background-color: transparent;
+
+.custom-control-input:active ~ .custom-control-indicator {
+ color: #fff;
+ background-color: #8fcafe;
}
-.nav .open > a,
-.nav .open > a:hover,
-.nav .open > a:focus {
- background-color: #eee;
- border-color: #337ab7;
+
+.custom-control-input:disabled ~ .custom-control-indicator {
+ background-color: #eceeef;
}
-.nav .nav-divider {
- height: 1px;
- margin: 9px 0;
- overflow: hidden;
- background-color: #e5e5e5;
+
+.custom-control-input:disabled ~ .custom-control-description {
+ color: #636c72;
}
-.nav > li > a > img {
- max-width: none;
+
+.custom-control-indicator {
+ position: absolute;
+ top: 0.25rem;
+ left: 0;
+ display: block;
+ width: 1rem;
+ height: 1rem;
+ pointer-events: none;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ background-color: #ddd;
+ background-repeat: no-repeat;
+ background-position: center center;
+ -webkit-background-size: 50% 50%;
+ background-size: 50% 50%;
}
-.nav-tabs {
- border-bottom: 1px solid #ddd;
+
+.custom-checkbox .custom-control-indicator {
+ border-radius: 0.25rem;
}
-.nav-tabs > li {
- float: left;
- margin-bottom: -1px;
+
+.custom-checkbox .custom-control-input:checked ~ .custom-control-indicator {
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E");
}
-.nav-tabs > li > a {
- margin-right: 2px;
- line-height: 1.42857143;
- border: 1px solid transparent;
- border-radius: 4px 4px 0 0;
+
+.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-indicator {
+ background-color: #0275d8;
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E");
}
-.nav-tabs > li > a:hover {
- border-color: #eee #eee #ddd;
+
+.custom-radio .custom-control-indicator {
+ border-radius: 50%;
}
-.nav-tabs > li.active > a,
-.nav-tabs > li.active > a:hover,
-.nav-tabs > li.active > a:focus {
- color: #555;
- cursor: default;
- background-color: #fff;
- border: 1px solid #ddd;
- border-bottom-color: transparent;
+
+.custom-radio .custom-control-input:checked ~ .custom-control-indicator {
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E");
}
-.nav-tabs.nav-justified {
- width: 100%;
- border-bottom: 0;
+
+.custom-controls-stacked {
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ -webkit-flex-direction: column;
+ -ms-flex-direction: column;
+ flex-direction: column;
}
-.nav-tabs.nav-justified > li {
- float: none;
+
+.custom-controls-stacked .custom-control {
+ margin-bottom: 0.25rem;
}
-.nav-tabs.nav-justified > li > a {
- margin-bottom: 5px;
- text-align: center;
+
+.custom-controls-stacked .custom-control + .custom-control {
+ margin-left: 0;
}
-.nav-tabs.nav-justified > .dropdown .dropdown-menu {
- top: auto;
- left: auto;
+
+.custom-select {
+ display: inline-block;
+ max-width: 100%;
+ height: calc(2.25rem + 2px);
+ padding: 0.375rem 1.75rem 0.375rem 0.75rem;
+ line-height: 1.25;
+ color: #464a4c;
+ vertical-align: middle;
+ background: #fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23333' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right 0.75rem center;
+ -webkit-background-size: 8px 10px;
+ background-size: 8px 10px;
+ border: 1px solid rgba(0, 0, 0, 0.15);
+ border-radius: 0.25rem;
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
}
-@media (min-width: 768px) {
- .nav-tabs.nav-justified > li {
- display: table-cell;
- width: 1%;
- }
- .nav-tabs.nav-justified > li > a {
- margin-bottom: 0;
- }
+
+.custom-select:focus {
+ border-color: #5cb3fd;
+ outline: none;
}
-.nav-tabs.nav-justified > li > a {
- margin-right: 0;
- border-radius: 4px;
+
+.custom-select:focus::-ms-value {
+ color: #464a4c;
+ background-color: #fff;
}
-.nav-tabs.nav-justified > .active > a,
-.nav-tabs.nav-justified > .active > a:hover,
-.nav-tabs.nav-justified > .active > a:focus {
- border: 1px solid #ddd;
+
+.custom-select:disabled {
+ color: #636c72;
+ background-color: #eceeef;
}
-@media (min-width: 768px) {
- .nav-tabs.nav-justified > li > a {
- border-bottom: 1px solid #ddd;
- border-radius: 4px 4px 0 0;
- }
- .nav-tabs.nav-justified > .active > a,
- .nav-tabs.nav-justified > .active > a:hover,
- .nav-tabs.nav-justified > .active > a:focus {
- border-bottom-color: #fff;
- }
+
+.custom-select::-ms-expand {
+ opacity: 0;
}
-.nav-pills > li {
- float: left;
+
+.custom-select-sm {
+ padding-top: 0.375rem;
+ padding-bottom: 0.375rem;
+ font-size: 75%;
}
-.nav-pills > li > a {
- border-radius: 4px;
+
+.custom-file {
+ position: relative;
+ display: inline-block;
+ max-width: 100%;
+ height: 2.5rem;
+ margin-bottom: 0;
}
-.nav-pills > li + li {
- margin-left: 2px;
+
+.custom-file-input {
+ min-width: 14rem;
+ max-width: 100%;
+ height: 2.5rem;
+ margin: 0;
+ opacity: 0;
}
-.nav-pills > li.active > a,
-.nav-pills > li.active > a:hover,
-.nav-pills > li.active > a:focus {
- color: #fff;
- background-color: #337ab7;
+
+.custom-file-control {
+ position: absolute;
+ top: 0;
+ right: 0;
+ left: 0;
+ z-index: 5;
+ height: 2.5rem;
+ padding: 0.5rem 1rem;
+ line-height: 1.5;
+ color: #464a4c;
+ pointer-events: none;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ background-color: #fff;
+ border: 1px solid rgba(0, 0, 0, 0.15);
+ border-radius: 0.25rem;
}
-.nav-stacked > li {
- float: none;
+
+.custom-file-control:lang(en):empty::after {
+ content: "Choose file...";
}
-.nav-stacked > li + li {
- margin-top: 2px;
- margin-left: 0;
+
+.custom-file-control::before {
+ position: absolute;
+ top: -1px;
+ right: -1px;
+ bottom: -1px;
+ z-index: 6;
+ display: block;
+ height: 2.5rem;
+ padding: 0.5rem 1rem;
+ line-height: 1.5;
+ color: #464a4c;
+ background-color: #eceeef;
+ border: 1px solid rgba(0, 0, 0, 0.15);
+ border-radius: 0 0.25rem 0.25rem 0;
}
-.nav-justified {
- width: 100%;
+
+.custom-file-control:lang(en)::before {
+ content: "Browse";
}
-.nav-justified > li {
- float: none;
+
+.nav {
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-flex-wrap: wrap;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
+ padding-left: 0;
+ margin-bottom: 0;
+ list-style: none;
}
-.nav-justified > li > a {
- margin-bottom: 5px;
- text-align: center;
+
+.nav-link {
+ display: block;
+ padding: 0.5rem 1rem;
}
-.nav-justified > .dropdown .dropdown-menu {
- top: auto;
- left: auto;
+
+.nav-link:focus, .nav-link:hover {
+ text-decoration: none;
}
-@media (min-width: 768px) {
- .nav-justified > li {
- display: table-cell;
- width: 1%;
- }
- .nav-justified > li > a {
- margin-bottom: 0;
- }
+
+.nav-link.disabled {
+ color: #636c72;
}
-.nav-tabs-justified {
- border-bottom: 0;
+
+.nav-tabs {
+ border-bottom: 1px solid #ddd;
}
-.nav-tabs-justified > li > a {
- margin-right: 0;
- border-radius: 4px;
+
+.nav-tabs .nav-item {
+ margin-bottom: -1px;
}
-.nav-tabs-justified > .active > a,
-.nav-tabs-justified > .active > a:hover,
-.nav-tabs-justified > .active > a:focus {
- border: 1px solid #ddd;
+
+.nav-tabs .nav-link {
+ border: 1px solid transparent;
+ border-top-left-radius: 0.25rem;
+ border-top-right-radius: 0.25rem;
}
-@media (min-width: 768px) {
- .nav-tabs-justified > li > a {
- border-bottom: 1px solid #ddd;
- border-radius: 4px 4px 0 0;
- }
- .nav-tabs-justified > .active > a,
- .nav-tabs-justified > .active > a:hover,
- .nav-tabs-justified > .active > a:focus {
- border-bottom-color: #fff;
- }
+
+.nav-tabs .nav-link:focus, .nav-tabs .nav-link:hover {
+ border-color: #eceeef #eceeef #ddd;
}
-.tab-content > .tab-pane {
- display: none;
+
+.nav-tabs .nav-link.disabled {
+ color: #636c72;
+ background-color: transparent;
+ border-color: transparent;
}
-.tab-content > .active {
- display: block;
+
+.nav-tabs .nav-link.active,
+.nav-tabs .nav-item.show .nav-link {
+ color: #464a4c;
+ background-color: #fff;
+ border-color: #ddd #ddd #fff;
}
+
.nav-tabs .dropdown-menu {
margin-top: -1px;
border-top-left-radius: 0;
border-top-right-radius: 0;
}
-.navbar {
- position: relative;
- min-height: 50px;
- margin-bottom: 20px;
- border: 1px solid transparent;
-}
-@media (min-width: 768px) {
- .navbar {
- border-radius: 4px;
- }
+
+.nav-pills .nav-link {
+ border-radius: 0.25rem;
}
-@media (min-width: 768px) {
- .navbar-header {
- float: left;
- }
+
+.nav-pills .nav-link.active,
+.show .nav-pills .nav-link {
+ color: #fff;
+ background-color: #0275d8;
}
-.navbar-collapse {
- padding-right: 15px;
- padding-left: 15px;
- overflow-x: visible;
- -webkit-overflow-scrolling: touch;
- border-top: 1px solid transparent;
- -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);
- box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);
+
+.nav-fill .nav-item {
+ -webkit-box-flex: 1;
+ -webkit-flex: 1 1 auto;
+ -ms-flex: 1 1 auto;
+ flex: 1 1 auto;
+ text-align: center;
}
-.navbar-collapse.in {
- overflow-y: auto;
+
+.nav-justified .nav-item {
+ -webkit-flex-basis: 0;
+ -ms-flex-preferred-size: 0;
+ flex-basis: 0;
+ -webkit-box-flex: 1;
+ -webkit-flex-grow: 1;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ text-align: center;
}
-@media (min-width: 768px) {
- .navbar-collapse {
- width: auto;
- border-top: 0;
- -webkit-box-shadow: none;
- box-shadow: none;
- }
- .navbar-collapse.collapse {
- display: block !important;
- height: auto !important;
- padding-bottom: 0;
- overflow: visible !important;
- }
- .navbar-collapse.in {
- overflow-y: visible;
- }
- .navbar-fixed-top .navbar-collapse,
- .navbar-static-top .navbar-collapse,
- .navbar-fixed-bottom .navbar-collapse {
- padding-right: 0;
- padding-left: 0;
- }
+
+.tab-content > .tab-pane {
+ display: none;
}
-.navbar-fixed-top .navbar-collapse,
-.navbar-fixed-bottom .navbar-collapse {
- max-height: 340px;
+
+.tab-content > .active {
+ display: block;
}
-@media (max-device-width: 480px) and (orientation: landscape) {
- .navbar-fixed-top .navbar-collapse,
- .navbar-fixed-bottom .navbar-collapse {
- max-height: 200px;
- }
+
+.navbar {
+ position: relative;
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-flex-wrap: wrap;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
+ -webkit-box-align: center;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
+ -webkit-box-pack: justify;
+ -webkit-justify-content: space-between;
+ -ms-flex-pack: justify;
+ justify-content: space-between;
+ padding: 0.5rem 1rem;
}
-.container > .navbar-header,
-.container-fluid > .navbar-header,
-.container > .navbar-collapse,
-.container-fluid > .navbar-collapse {
- margin-right: -15px;
- margin-left: -15px;
+
+.navbar > .container,
+.navbar > .container-fluid {
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-flex-wrap: wrap;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
+ -webkit-box-align: center;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
+ -webkit-box-pack: justify;
+ -webkit-justify-content: space-between;
+ -ms-flex-pack: justify;
+ justify-content: space-between;
}
-@media (min-width: 768px) {
- .container > .navbar-header,
- .container-fluid > .navbar-header,
- .container > .navbar-collapse,
- .container-fluid > .navbar-collapse {
+
+@media (max-width: 575px) {
+ .navbar > .container,
+ .navbar > .container-fluid {
+ width: 100%;
margin-right: 0;
margin-left: 0;
}
}
-.navbar-static-top {
- z-index: 1000;
- border-width: 0 0 1px;
-}
-@media (min-width: 768px) {
- .navbar-static-top {
- border-radius: 0;
- }
-}
-.navbar-fixed-top,
-.navbar-fixed-bottom {
- position: fixed;
- right: 0;
- left: 0;
- z-index: 1030;
-}
-@media (min-width: 768px) {
- .navbar-fixed-top,
- .navbar-fixed-bottom {
- border-radius: 0;
- }
+
+.navbar-brand {
+ display: inline-block;
+ padding-top: 0.3125rem;
+ padding-bottom: 0.3125rem;
+ margin-right: 1rem;
+ font-size: 1.25rem;
+ line-height: inherit;
+ white-space: nowrap;
}
-.navbar-fixed-top {
- top: 0;
- border-width: 0 0 1px;
+
+.navbar-brand:focus, .navbar-brand:hover {
+ text-decoration: none;
}
-.navbar-fixed-bottom {
- bottom: 0;
+
+.navbar-nav {
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ -webkit-flex-direction: column;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ padding-left: 0;
margin-bottom: 0;
- border-width: 1px 0 0;
-}
-.navbar-brand {
- float: left;
- height: 50px;
- padding: 15px 15px;
- font-size: 18px;
- line-height: 20px;
+ list-style: none;
}
-.navbar-brand:hover,
-.navbar-brand:focus {
- text-decoration: none;
+
+.navbar-nav .nav-link {
+ padding-right: 0;
+ padding-left: 0;
}
-.navbar-brand > img {
- display: block;
+
+.navbar-text {
+ display: inline-block;
+ padding-top: 0.5rem;
+ padding-bottom: 0.5rem;
}
-@media (min-width: 768px) {
- .navbar > .container .navbar-brand,
- .navbar > .container-fluid .navbar-brand {
- margin-left: -15px;
- }
+
+.navbar-collapse {
+ -webkit-flex-basis: 100%;
+ -ms-flex-preferred-size: 100%;
+ flex-basis: 100%;
}
-.navbar-toggle {
- position: relative;
- float: right;
- padding: 9px 10px;
- margin-top: 8px;
- margin-right: 15px;
- margin-bottom: 8px;
- background-color: transparent;
- background-image: none;
+
+.navbar-toggler {
+ padding: 0.25rem 0.75rem;
+ font-size: 1.25rem;
+ line-height: 1;
+ background: transparent;
border: 1px solid transparent;
- border-radius: 4px;
+ border-radius: 0.25rem;
}
-.navbar-toggle:focus {
- outline: 0;
+
+.navbar-toggler:focus, .navbar-toggler:hover {
+ text-decoration: none;
}
-.navbar-toggle .icon-bar {
- display: block;
- width: 22px;
- height: 2px;
- border-radius: 1px;
+
+.navbar-toggler-icon {
+ display: inline-block;
+ width: 1.5em;
+ height: 1.5em;
+ vertical-align: middle;
+ content: "";
+ background: no-repeat center center;
+ -webkit-background-size: 100% 100%;
+ background-size: 100% 100%;
}
-.navbar-toggle .icon-bar + .icon-bar {
- margin-top: 4px;
+
+@media (max-width: 575px) {
+ .navbar-expand-sm .navbar-nav .dropdown-menu {
+ position: static;
+ float: none;
+ }
+ .navbar-expand-sm > .container,
+ .navbar-expand-sm > .container-fluid {
+ padding-right: 0;
+ padding-left: 0;
+ }
}
-@media (min-width: 768px) {
- .navbar-toggle {
+
+@media (min-width: 576px) {
+ .navbar-expand-sm {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ -webkit-flex-direction: row;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -webkit-flex-wrap: nowrap;
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ -webkit-box-pack: start;
+ -webkit-justify-content: flex-start;
+ -ms-flex-pack: start;
+ justify-content: flex-start;
+ }
+ .navbar-expand-sm .navbar-nav {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ -webkit-flex-direction: row;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ }
+ .navbar-expand-sm .navbar-nav .dropdown-menu {
+ position: absolute;
+ }
+ .navbar-expand-sm .navbar-nav .nav-link {
+ padding-right: .5rem;
+ padding-left: .5rem;
+ }
+ .navbar-expand-sm > .container,
+ .navbar-expand-sm > .container-fluid {
+ -webkit-flex-wrap: nowrap;
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ }
+ .navbar-expand-sm .navbar-collapse {
+ display: -webkit-box !important;
+ display: -webkit-flex !important;
+ display: -ms-flexbox !important;
+ display: flex !important;
+ }
+ .navbar-expand-sm .navbar-toggler {
display: none;
}
}
-.navbar-nav {
- margin: 7.5px -15px;
-}
-.navbar-nav > li > a {
- padding-top: 10px;
- padding-bottom: 10px;
- line-height: 20px;
-}
+
@media (max-width: 767px) {
- .navbar-nav .open .dropdown-menu {
+ .navbar-expand-md .navbar-nav .dropdown-menu {
position: static;
float: none;
- width: auto;
- margin-top: 0;
- background-color: transparent;
- border: 0;
- -webkit-box-shadow: none;
- box-shadow: none;
- }
- .navbar-nav .open .dropdown-menu > li > a,
- .navbar-nav .open .dropdown-menu .dropdown-header {
- padding: 5px 15px 5px 25px;
}
- .navbar-nav .open .dropdown-menu > li > a {
- line-height: 20px;
- }
- .navbar-nav .open .dropdown-menu > li > a:hover,
- .navbar-nav .open .dropdown-menu > li > a:focus {
- background-image: none;
+ .navbar-expand-md > .container,
+ .navbar-expand-md > .container-fluid {
+ padding-right: 0;
+ padding-left: 0;
}
}
+
@media (min-width: 768px) {
- .navbar-nav {
- float: left;
- margin: 0;
- }
- .navbar-nav > li {
- float: left;
- }
- .navbar-nav > li > a {
- padding-top: 15px;
- padding-bottom: 15px;
+ .navbar-expand-md {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ -webkit-flex-direction: row;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -webkit-flex-wrap: nowrap;
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ -webkit-box-pack: start;
+ -webkit-justify-content: flex-start;
+ -ms-flex-pack: start;
+ justify-content: flex-start;
+ }
+ .navbar-expand-md .navbar-nav {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ -webkit-flex-direction: row;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ }
+ .navbar-expand-md .navbar-nav .dropdown-menu {
+ position: absolute;
+ }
+ .navbar-expand-md .navbar-nav .nav-link {
+ padding-right: .5rem;
+ padding-left: .5rem;
+ }
+ .navbar-expand-md > .container,
+ .navbar-expand-md > .container-fluid {
+ -webkit-flex-wrap: nowrap;
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ }
+ .navbar-expand-md .navbar-collapse {
+ display: -webkit-box !important;
+ display: -webkit-flex !important;
+ display: -ms-flexbox !important;
+ display: flex !important;
+ }
+ .navbar-expand-md .navbar-toggler {
+ display: none;
}
}
-.navbar-form {
- padding: 10px 15px;
- margin-top: 8px;
- margin-right: -15px;
- margin-bottom: 8px;
- margin-left: -15px;
- border-top: 1px solid transparent;
- border-bottom: 1px solid transparent;
- -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1);
- box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1);
-}
-@media (min-width: 768px) {
- .navbar-form .form-group {
- display: inline-block;
- margin-bottom: 0;
- vertical-align: middle;
- }
- .navbar-form .form-control {
- display: inline-block;
- width: auto;
- vertical-align: middle;
- }
- .navbar-form .form-control-static {
- display: inline-block;
- }
- .navbar-form .input-group {
- display: inline-table;
- vertical-align: middle;
- }
- .navbar-form .input-group .input-group-addon,
- .navbar-form .input-group .input-group-btn,
- .navbar-form .input-group .form-control {
- width: auto;
- }
- .navbar-form .input-group > .form-control {
- width: 100%;
- }
- .navbar-form .control-label {
- margin-bottom: 0;
- vertical-align: middle;
- }
- .navbar-form .radio,
- .navbar-form .checkbox {
- display: inline-block;
- margin-top: 0;
- margin-bottom: 0;
- vertical-align: middle;
+
+@media (max-width: 991px) {
+ .navbar-expand-lg .navbar-nav .dropdown-menu {
+ position: static;
+ float: none;
}
- .navbar-form .radio label,
- .navbar-form .checkbox label {
+ .navbar-expand-lg > .container,
+ .navbar-expand-lg > .container-fluid {
+ padding-right: 0;
padding-left: 0;
}
- .navbar-form .radio input[type="radio"],
- .navbar-form .checkbox input[type="checkbox"] {
- position: relative;
- margin-left: 0;
- }
- .navbar-form .has-feedback .form-control-feedback {
- top: 0;
+}
+
+@media (min-width: 992px) {
+ .navbar-expand-lg {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ -webkit-flex-direction: row;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -webkit-flex-wrap: nowrap;
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ -webkit-box-pack: start;
+ -webkit-justify-content: flex-start;
+ -ms-flex-pack: start;
+ justify-content: flex-start;
+ }
+ .navbar-expand-lg .navbar-nav {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ -webkit-flex-direction: row;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ }
+ .navbar-expand-lg .navbar-nav .dropdown-menu {
+ position: absolute;
+ }
+ .navbar-expand-lg .navbar-nav .nav-link {
+ padding-right: .5rem;
+ padding-left: .5rem;
+ }
+ .navbar-expand-lg > .container,
+ .navbar-expand-lg > .container-fluid {
+ -webkit-flex-wrap: nowrap;
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ }
+ .navbar-expand-lg .navbar-collapse {
+ display: -webkit-box !important;
+ display: -webkit-flex !important;
+ display: -ms-flexbox !important;
+ display: flex !important;
+ }
+ .navbar-expand-lg .navbar-toggler {
+ display: none;
}
}
-@media (max-width: 767px) {
- .navbar-form .form-group {
- margin-bottom: 5px;
+
+@media (max-width: 1199px) {
+ .navbar-expand-xl .navbar-nav .dropdown-menu {
+ position: static;
+ float: none;
}
- .navbar-form .form-group:last-child {
- margin-bottom: 0;
+ .navbar-expand-xl > .container,
+ .navbar-expand-xl > .container-fluid {
+ padding-right: 0;
+ padding-left: 0;
}
}
-@media (min-width: 768px) {
- .navbar-form {
- width: auto;
- padding-top: 0;
- padding-bottom: 0;
- margin-right: 0;
- margin-left: 0;
- border: 0;
- -webkit-box-shadow: none;
- box-shadow: none;
+
+@media (min-width: 1200px) {
+ .navbar-expand-xl {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ -webkit-flex-direction: row;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -webkit-flex-wrap: nowrap;
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ -webkit-box-pack: start;
+ -webkit-justify-content: flex-start;
+ -ms-flex-pack: start;
+ justify-content: flex-start;
+ }
+ .navbar-expand-xl .navbar-nav {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ -webkit-flex-direction: row;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ }
+ .navbar-expand-xl .navbar-nav .dropdown-menu {
+ position: absolute;
+ }
+ .navbar-expand-xl .navbar-nav .nav-link {
+ padding-right: .5rem;
+ padding-left: .5rem;
+ }
+ .navbar-expand-xl > .container,
+ .navbar-expand-xl > .container-fluid {
+ -webkit-flex-wrap: nowrap;
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ }
+ .navbar-expand-xl .navbar-collapse {
+ display: -webkit-box !important;
+ display: -webkit-flex !important;
+ display: -ms-flexbox !important;
+ display: flex !important;
+ }
+ .navbar-expand-xl .navbar-toggler {
+ display: none;
}
}
-.navbar-nav > li > .dropdown-menu {
- margin-top: 0;
- border-top-left-radius: 0;
- border-top-right-radius: 0;
+
+.navbar-expand {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ -webkit-flex-direction: row;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -webkit-flex-wrap: nowrap;
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ -webkit-box-pack: start;
+ -webkit-justify-content: flex-start;
+ -ms-flex-pack: start;
+ justify-content: flex-start;
+}
+
+.navbar-expand .navbar-nav .dropdown-menu {
+ position: static;
+ float: none;
+}
+
+.navbar-expand > .container,
+.navbar-expand > .container-fluid {
+ padding-right: 0;
+ padding-left: 0;
+}
+
+.navbar-expand .navbar-nav {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ -webkit-flex-direction: row;
+ -ms-flex-direction: row;
+ flex-direction: row;
+}
+
+.navbar-expand .navbar-nav .dropdown-menu {
+ position: absolute;
+}
+
+.navbar-expand .navbar-nav .nav-link {
+ padding-right: .5rem;
+ padding-left: .5rem;
+}
+
+.navbar-expand > .container,
+.navbar-expand > .container-fluid {
+ -webkit-flex-wrap: nowrap;
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+}
+
+.navbar-expand .navbar-collapse {
+ display: -webkit-box !important;
+ display: -webkit-flex !important;
+ display: -ms-flexbox !important;
+ display: flex !important;
+}
+
+.navbar-expand .navbar-toggler {
+ display: none;
+}
+
+.navbar-light .navbar-brand {
+ color: rgba(0, 0, 0, 0.9);
+}
+
+.navbar-light .navbar-brand:focus, .navbar-light .navbar-brand:hover {
+ color: rgba(0, 0, 0, 0.9);
+}
+
+.navbar-light .navbar-nav .nav-link {
+ color: rgba(0, 0, 0, 0.5);
+}
+
+.navbar-light .navbar-nav .nav-link:focus, .navbar-light .navbar-nav .nav-link:hover {
+ color: rgba(0, 0, 0, 0.7);
+}
+
+.navbar-light .navbar-nav .nav-link.disabled {
+ color: rgba(0, 0, 0, 0.3);
+}
+
+.navbar-light .navbar-nav .show > .nav-link,
+.navbar-light .navbar-nav .active > .nav-link,
+.navbar-light .navbar-nav .nav-link.show,
+.navbar-light .navbar-nav .nav-link.active {
+ color: rgba(0, 0, 0, 0.9);
+}
+
+.navbar-light .navbar-toggler {
+ color: rgba(0, 0, 0, 0.5);
+ border-color: rgba(0, 0, 0, 0.1);
+}
+
+.navbar-light .navbar-toggler-icon {
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E");
+}
+
+.navbar-light .navbar-text {
+ color: rgba(0, 0, 0, 0.5);
}
-.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {
+
+.navbar-inverse .navbar-brand {
+ color: white;
+}
+
+.navbar-inverse .navbar-brand:focus, .navbar-inverse .navbar-brand:hover {
+ color: white;
+}
+
+.navbar-inverse .navbar-nav .nav-link {
+ color: rgba(255, 255, 255, 0.5);
+}
+
+.navbar-inverse .navbar-nav .nav-link:focus, .navbar-inverse .navbar-nav .nav-link:hover {
+ color: rgba(255, 255, 255, 0.75);
+}
+
+.navbar-inverse .navbar-nav .nav-link.disabled {
+ color: rgba(255, 255, 255, 0.25);
+}
+
+.navbar-inverse .navbar-nav .show > .nav-link,
+.navbar-inverse .navbar-nav .active > .nav-link,
+.navbar-inverse .navbar-nav .nav-link.show,
+.navbar-inverse .navbar-nav .nav-link.active {
+ color: white;
+}
+
+.navbar-inverse .navbar-toggler {
+ color: rgba(255, 255, 255, 0.5);
+ border-color: rgba(255, 255, 255, 0.1);
+}
+
+.navbar-inverse .navbar-toggler-icon {
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E");
+}
+
+.navbar-inverse .navbar-text {
+ color: rgba(255, 255, 255, 0.5);
+}
+
+.card {
+ position: relative;
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ -webkit-flex-direction: column;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ background-color: #fff;
+ border: 1px solid rgba(0, 0, 0, 0.125);
+ border-radius: 0.25rem;
+}
+
+.card-block {
+ -webkit-box-flex: 1;
+ -webkit-flex: 1 1 auto;
+ -ms-flex: 1 1 auto;
+ flex: 1 1 auto;
+ padding: 1.25rem;
+}
+
+.card-title {
+ margin-bottom: 0.75rem;
+ word-break: break-all;
+}
+
+.card-subtitle {
+ margin-top: -0.375rem;
margin-bottom: 0;
- border-top-left-radius: 4px;
- border-top-right-radius: 4px;
- border-bottom-right-radius: 0;
- border-bottom-left-radius: 0;
}
-.navbar-btn {
- margin-top: 8px;
- margin-bottom: 8px;
+
+.card-text:last-child {
+ margin-bottom: 0;
}
-.navbar-btn.btn-sm {
- margin-top: 10px;
- margin-bottom: 10px;
+
+.card-link:hover {
+ text-decoration: none;
}
-.navbar-btn.btn-xs {
- margin-top: 14px;
- margin-bottom: 14px;
+
+.card-link + .card-link {
+ margin-left: 1.25rem;
}
-.navbar-text {
- margin-top: 15px;
- margin-bottom: 15px;
+
+.card > .list-group:first-child .list-group-item:first-child {
+ border-top-left-radius: 0.25rem;
+ border-top-right-radius: 0.25rem;
}
-@media (min-width: 768px) {
- .navbar-text {
- float: left;
- margin-right: 15px;
- margin-left: 15px;
- }
+
+.card > .list-group:last-child .list-group-item:last-child {
+ border-bottom-right-radius: 0.25rem;
+ border-bottom-left-radius: 0.25rem;
}
-@media (min-width: 768px) {
- .navbar-left {
- float: left !important;
- }
- .navbar-right {
- float: right !important;
- margin-right: -15px;
- }
- .navbar-right ~ .navbar-right {
- margin-right: 0;
- }
+
+.card-header {
+ padding: 0.75rem 1.25rem;
+ margin-bottom: 0;
+ background-color: #f7f7f9;
+ border-bottom: 1px solid rgba(0, 0, 0, 0.125);
+}
+
+.card-header:first-child {
+ border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0;
}
-.navbar-default {
- background-color: #f8f8f8;
- border-color: #e7e7e7;
+
+.card-footer {
+ padding: 0.75rem 1.25rem;
+ background-color: #f7f7f9;
+ border-top: 1px solid rgba(0, 0, 0, 0.125);
+}
+
+.card-footer:last-child {
+ border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px);
+}
+
+.card-header-tabs {
+ margin-right: -0.625rem;
+ margin-bottom: -0.75rem;
+ margin-left: -0.625rem;
+ border-bottom: 0;
+}
+
+.card-header-pills {
+ margin-right: -0.625rem;
+ margin-left: -0.625rem;
}
-.navbar-default .navbar-brand {
- color: #777;
+
+.card-primary {
+ background-color: #0275d8;
+ border-color: #0275d8;
}
-.navbar-default .navbar-brand:hover,
-.navbar-default .navbar-brand:focus {
- color: #5e5e5e;
+
+.card-primary .card-header,
+.card-primary .card-footer {
background-color: transparent;
}
-.navbar-default .navbar-text {
- color: #777;
+
+.card-success {
+ background-color: #5cb85c;
+ border-color: #5cb85c;
}
-.navbar-default .navbar-nav > li > a {
- color: #777;
+
+.card-success .card-header,
+.card-success .card-footer {
+ background-color: transparent;
+}
+
+.card-info {
+ background-color: #5bc0de;
+ border-color: #5bc0de;
}
-.navbar-default .navbar-nav > li > a:hover,
-.navbar-default .navbar-nav > li > a:focus {
- color: #333;
+
+.card-info .card-header,
+.card-info .card-footer {
background-color: transparent;
}
-.navbar-default .navbar-nav > .active > a,
-.navbar-default .navbar-nav > .active > a:hover,
-.navbar-default .navbar-nav > .active > a:focus {
- color: #555;
- background-color: #e7e7e7;
+
+.card-warning {
+ background-color: #f0ad4e;
+ border-color: #f0ad4e;
}
-.navbar-default .navbar-nav > .disabled > a,
-.navbar-default .navbar-nav > .disabled > a:hover,
-.navbar-default .navbar-nav > .disabled > a:focus {
- color: #ccc;
+
+.card-warning .card-header,
+.card-warning .card-footer {
background-color: transparent;
}
-.navbar-default .navbar-toggle {
- border-color: #ddd;
+
+.card-danger {
+ background-color: #d9534f;
+ border-color: #d9534f;
}
-.navbar-default .navbar-toggle:hover,
-.navbar-default .navbar-toggle:focus {
- background-color: #ddd;
+
+.card-danger .card-header,
+.card-danger .card-footer {
+ background-color: transparent;
}
-.navbar-default .navbar-toggle .icon-bar {
- background-color: #888;
+
+.card-outline-primary {
+ background-color: transparent;
+ border-color: #0275d8;
}
-.navbar-default .navbar-collapse,
-.navbar-default .navbar-form {
- border-color: #e7e7e7;
+
+.card-outline-primary .card-header,
+.card-outline-primary .card-footer {
+ background-color: transparent;
+ border-color: #0275d8;
}
-.navbar-default .navbar-nav > .open > a,
-.navbar-default .navbar-nav > .open > a:hover,
-.navbar-default .navbar-nav > .open > a:focus {
- color: #555;
- background-color: #e7e7e7;
+
+.card-outline-secondary {
+ background-color: transparent;
+ border-color: #ccc;
}
-@media (max-width: 767px) {
- .navbar-default .navbar-nav .open .dropdown-menu > li > a {
- color: #777;
- }
- .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,
- .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {
- color: #333;
- background-color: transparent;
- }
- .navbar-default .navbar-nav .open .dropdown-menu > .active > a,
- .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,
- .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {
- color: #555;
- background-color: #e7e7e7;
- }
- .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,
- .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,
- .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {
- color: #ccc;
- background-color: transparent;
- }
+
+.card-outline-secondary .card-header,
+.card-outline-secondary .card-footer {
+ background-color: transparent;
+ border-color: #ccc;
}
-.navbar-default .navbar-link {
- color: #777;
+
+.card-outline-info {
+ background-color: transparent;
+ border-color: #5bc0de;
}
-.navbar-default .navbar-link:hover {
- color: #333;
+
+.card-outline-info .card-header,
+.card-outline-info .card-footer {
+ background-color: transparent;
+ border-color: #5bc0de;
}
-.navbar-default .btn-link {
- color: #777;
+
+.card-outline-success {
+ background-color: transparent;
+ border-color: #5cb85c;
}
-.navbar-default .btn-link:hover,
-.navbar-default .btn-link:focus {
- color: #333;
+
+.card-outline-success .card-header,
+.card-outline-success .card-footer {
+ background-color: transparent;
+ border-color: #5cb85c;
}
-.navbar-default .btn-link[disabled]:hover,
-fieldset[disabled] .navbar-default .btn-link:hover,
-.navbar-default .btn-link[disabled]:focus,
-fieldset[disabled] .navbar-default .btn-link:focus {
- color: #ccc;
+
+.card-outline-warning {
+ background-color: transparent;
+ border-color: #f0ad4e;
}
-.navbar-inverse {
- background-color: #222;
- border-color: #080808;
+
+.card-outline-warning .card-header,
+.card-outline-warning .card-footer {
+ background-color: transparent;
+ border-color: #f0ad4e;
}
-.navbar-inverse .navbar-brand {
- color: #9d9d9d;
+
+.card-outline-danger {
+ background-color: transparent;
+ border-color: #d9534f;
}
-.navbar-inverse .navbar-brand:hover,
-.navbar-inverse .navbar-brand:focus {
- color: #fff;
+
+.card-outline-danger .card-header,
+.card-outline-danger .card-footer {
background-color: transparent;
+ border-color: #d9534f;
}
-.navbar-inverse .navbar-text {
- color: #9d9d9d;
+
+.card-inverse {
+ color: rgba(255, 255, 255, 0.65);
}
-.navbar-inverse .navbar-nav > li > a {
- color: #9d9d9d;
+
+.card-inverse .card-header,
+.card-inverse .card-footer {
+ background-color: transparent;
+ border-color: rgba(255, 255, 255, 0.2);
}
-.navbar-inverse .navbar-nav > li > a:hover,
-.navbar-inverse .navbar-nav > li > a:focus {
+
+.card-inverse .card-header,
+.card-inverse .card-footer,
+.card-inverse .card-title,
+.card-inverse .card-blockquote {
color: #fff;
- background-color: transparent;
}
-.navbar-inverse .navbar-nav > .active > a,
-.navbar-inverse .navbar-nav > .active > a:hover,
-.navbar-inverse .navbar-nav > .active > a:focus {
+
+.card-inverse .card-link,
+.card-inverse .card-text,
+.card-inverse .card-subtitle,
+.card-inverse .card-blockquote .blockquote-footer {
+ color: rgba(255, 255, 255, 0.65);
+}
+
+.card-inverse .card-link:focus, .card-inverse .card-link:hover {
color: #fff;
- background-color: #080808;
}
-.navbar-inverse .navbar-nav > .disabled > a,
-.navbar-inverse .navbar-nav > .disabled > a:hover,
-.navbar-inverse .navbar-nav > .disabled > a:focus {
- color: #444;
- background-color: transparent;
+
+.card-blockquote {
+ padding: 0;
+ margin-bottom: 0;
+ border-left: 0;
}
-.navbar-inverse .navbar-toggle {
- border-color: #333;
+
+.card-img-overlay {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ padding: 1.25rem;
}
-.navbar-inverse .navbar-toggle:hover,
-.navbar-inverse .navbar-toggle:focus {
- background-color: #333;
+
+.card-img {
+ width: 100%;
+ border-radius: calc(0.25rem - 1px);
}
-.navbar-inverse .navbar-toggle .icon-bar {
- background-color: #fff;
+
+.card-img-top {
+ width: 100%;
+ border-top-left-radius: calc(0.25rem - 1px);
+ border-top-right-radius: calc(0.25rem - 1px);
}
-.navbar-inverse .navbar-collapse,
-.navbar-inverse .navbar-form {
- border-color: #101010;
+
+.card-img-bottom {
+ width: 100%;
+ border-bottom-right-radius: calc(0.25rem - 1px);
+ border-bottom-left-radius: calc(0.25rem - 1px);
}
-.navbar-inverse .navbar-nav > .open > a,
-.navbar-inverse .navbar-nav > .open > a:hover,
-.navbar-inverse .navbar-nav > .open > a:focus {
- color: #fff;
- background-color: #080808;
+
+@media (min-width: 576px) {
+ .card-deck {
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ -webkit-flex-flow: row wrap;
+ -ms-flex-flow: row wrap;
+ flex-flow: row wrap;
+ margin-right: -15px;
+ margin-left: -15px;
+ }
+ .card-deck .card {
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-flex: 1;
+ -webkit-flex: 1 0 0;
+ -ms-flex: 1 0 0px;
+ flex: 1 0 0%;
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ -webkit-flex-direction: column;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ margin-right: 15px;
+ margin-left: 15px;
+ }
}
-@media (max-width: 767px) {
- .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {
- border-color: #080808;
+
+@media (min-width: 576px) {
+ .card-group {
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ -webkit-flex-flow: row wrap;
+ -ms-flex-flow: row wrap;
+ flex-flow: row wrap;
+ }
+ .card-group .card {
+ -webkit-box-flex: 1;
+ -webkit-flex: 1 0 0;
+ -ms-flex: 1 0 0px;
+ flex: 1 0 0%;
+ }
+ .card-group .card + .card {
+ margin-left: 0;
+ border-left: 0;
}
- .navbar-inverse .navbar-nav .open .dropdown-menu .divider {
- background-color: #080808;
+ .card-group .card:first-child {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
}
- .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {
- color: #9d9d9d;
+ .card-group .card:first-child .card-img-top {
+ border-top-right-radius: 0;
}
- .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,
- .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {
- color: #fff;
- background-color: transparent;
+ .card-group .card:first-child .card-img-bottom {
+ border-bottom-right-radius: 0;
}
- .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,
- .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,
- .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {
- color: #fff;
- background-color: #080808;
+ .card-group .card:last-child {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
}
- .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,
- .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,
- .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {
- color: #444;
- background-color: transparent;
+ .card-group .card:last-child .card-img-top {
+ border-top-left-radius: 0;
+ }
+ .card-group .card:last-child .card-img-bottom {
+ border-bottom-left-radius: 0;
+ }
+ .card-group .card:not(:first-child):not(:last-child) {
+ border-radius: 0;
+ }
+ .card-group .card:not(:first-child):not(:last-child) .card-img-top,
+ .card-group .card:not(:first-child):not(:last-child) .card-img-bottom {
+ border-radius: 0;
}
}
-.navbar-inverse .navbar-link {
- color: #9d9d9d;
-}
-.navbar-inverse .navbar-link:hover {
- color: #fff;
-}
-.navbar-inverse .btn-link {
- color: #9d9d9d;
-}
-.navbar-inverse .btn-link:hover,
-.navbar-inverse .btn-link:focus {
- color: #fff;
+
+.card-columns .card {
+ margin-bottom: 0.75rem;
}
-.navbar-inverse .btn-link[disabled]:hover,
-fieldset[disabled] .navbar-inverse .btn-link:hover,
-.navbar-inverse .btn-link[disabled]:focus,
-fieldset[disabled] .navbar-inverse .btn-link:focus {
- color: #444;
+
+@media (min-width: 576px) {
+ .card-columns {
+ -webkit-column-count: 3;
+ -moz-column-count: 3;
+ column-count: 3;
+ -webkit-column-gap: 1.25rem;
+ -moz-column-gap: 1.25rem;
+ column-gap: 1.25rem;
+ }
+ .card-columns .card {
+ display: inline-block;
+ width: 100%;
+ }
}
+
.breadcrumb {
- padding: 8px 15px;
- margin-bottom: 20px;
+ padding: 0.75rem 1rem;
+ margin-bottom: 1rem;
list-style: none;
- background-color: #f5f5f5;
- border-radius: 4px;
+ background-color: #eceeef;
+ border-radius: 0.25rem;
+}
+
+.breadcrumb::after {
+ display: block;
+ clear: both;
+ content: "";
+}
+
+.breadcrumb-item {
+ float: left;
}
-.breadcrumb > li {
+
+.breadcrumb-item + .breadcrumb-item::before {
display: inline-block;
+ padding-right: 0.5rem;
+ padding-left: 0.5rem;
+ color: #636c72;
+ content: "/";
}
-.breadcrumb > li + li:before {
- padding: 0 5px;
- color: #ccc;
- content: "/\00a0";
+
+.breadcrumb-item + .breadcrumb-item:hover::before {
+ text-decoration: underline;
+}
+
+.breadcrumb-item + .breadcrumb-item:hover::before {
+ text-decoration: none;
}
-.breadcrumb > .active {
- color: #777;
+
+.breadcrumb-item.active {
+ color: #636c72;
}
+
.pagination {
- display: inline-block;
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
padding-left: 0;
- margin: 20px 0;
- border-radius: 4px;
+ list-style: none;
+ border-radius: 0.25rem;
}
-.pagination > li {
- display: inline;
+
+.page-item:first-child .page-link {
+ margin-left: 0;
+ border-top-left-radius: 0.25rem;
+ border-bottom-left-radius: 0.25rem;
}
-.pagination > li > a,
-.pagination > li > span {
- position: relative;
- float: left;
- padding: 6px 12px;
- margin-left: -1px;
- line-height: 1.42857143;
- color: #337ab7;
- text-decoration: none;
- background-color: #fff;
- border: 1px solid #ddd;
+
+.page-item:last-child .page-link {
+ border-top-right-radius: 0.25rem;
+ border-bottom-right-radius: 0.25rem;
}
-.pagination > li:first-child > a,
-.pagination > li:first-child > span {
- margin-left: 0;
- border-top-left-radius: 4px;
- border-bottom-left-radius: 4px;
-}
-.pagination > li:last-child > a,
-.pagination > li:last-child > span {
- border-top-right-radius: 4px;
- border-bottom-right-radius: 4px;
-}
-.pagination > li > a:hover,
-.pagination > li > span:hover,
-.pagination > li > a:focus,
-.pagination > li > span:focus {
+
+.page-item.active .page-link {
z-index: 2;
- color: #23527c;
- background-color: #eee;
- border-color: #ddd;
-}
-.pagination > .active > a,
-.pagination > .active > span,
-.pagination > .active > a:hover,
-.pagination > .active > span:hover,
-.pagination > .active > a:focus,
-.pagination > .active > span:focus {
- z-index: 3;
color: #fff;
- cursor: default;
- background-color: #337ab7;
- border-color: #337ab7;
-}
-.pagination > .disabled > span,
-.pagination > .disabled > span:hover,
-.pagination > .disabled > span:focus,
-.pagination > .disabled > a,
-.pagination > .disabled > a:hover,
-.pagination > .disabled > a:focus {
- color: #777;
- cursor: not-allowed;
+ background-color: #0275d8;
+ border-color: #0275d8;
+}
+
+.page-item.disabled .page-link {
+ color: #636c72;
+ pointer-events: none;
background-color: #fff;
border-color: #ddd;
}
-.pagination-lg > li > a,
-.pagination-lg > li > span {
- padding: 10px 16px;
- font-size: 18px;
- line-height: 1.3333333;
-}
-.pagination-lg > li:first-child > a,
-.pagination-lg > li:first-child > span {
- border-top-left-radius: 6px;
- border-bottom-left-radius: 6px;
-}
-.pagination-lg > li:last-child > a,
-.pagination-lg > li:last-child > span {
- border-top-right-radius: 6px;
- border-bottom-right-radius: 6px;
-}
-.pagination-sm > li > a,
-.pagination-sm > li > span {
- padding: 5px 10px;
- font-size: 12px;
- line-height: 1.5;
-}
-.pagination-sm > li:first-child > a,
-.pagination-sm > li:first-child > span {
- border-top-left-radius: 3px;
- border-bottom-left-radius: 3px;
-}
-.pagination-sm > li:last-child > a,
-.pagination-sm > li:last-child > span {
- border-top-right-radius: 3px;
- border-bottom-right-radius: 3px;
-}
-.pager {
- padding-left: 0;
- margin: 20px 0;
- text-align: center;
- list-style: none;
-}
-.pager li {
- display: inline;
-}
-.pager li > a,
-.pager li > span {
- display: inline-block;
- padding: 5px 14px;
+
+.page-link {
+ position: relative;
+ display: block;
+ padding: 0.5rem 0.75rem;
+ margin-left: -1px;
+ line-height: 1.25;
+ color: #0275d8;
background-color: #fff;
border: 1px solid #ddd;
- border-radius: 15px;
}
-.pager li > a:hover,
-.pager li > a:focus {
+
+.page-link:focus, .page-link:hover {
+ color: #014c8c;
text-decoration: none;
- background-color: #eee;
+ background-color: #eceeef;
+ border-color: #ddd;
}
-.pager .next > a,
-.pager .next > span {
- float: right;
+
+.pagination-lg .page-link {
+ padding: 0.75rem 1.5rem;
+ font-size: 1.25rem;
}
-.pager .previous > a,
-.pager .previous > span {
- float: left;
+
+.pagination-lg .page-item:first-child .page-link {
+ border-top-left-radius: 0.3rem;
+ border-bottom-left-radius: 0.3rem;
}
-.pager .disabled > a,
-.pager .disabled > a:hover,
-.pager .disabled > a:focus,
-.pager .disabled > span {
- color: #777;
- cursor: not-allowed;
- background-color: #fff;
+
+.pagination-lg .page-item:last-child .page-link {
+ border-top-right-radius: 0.3rem;
+ border-bottom-right-radius: 0.3rem;
+}
+
+.pagination-sm .page-link {
+ padding: 0.25rem 0.5rem;
+ font-size: 0.875rem;
+}
+
+.pagination-sm .page-item:first-child .page-link {
+ border-top-left-radius: 0.2rem;
+ border-bottom-left-radius: 0.2rem;
+}
+
+.pagination-sm .page-item:last-child .page-link {
+ border-top-right-radius: 0.2rem;
+ border-bottom-right-radius: 0.2rem;
}
-.label {
- display: inline;
- padding: .2em .6em .3em;
+
+.badge {
+ display: inline-block;
+ padding: 0.25em 0.4em;
font-size: 75%;
font-weight: bold;
line-height: 1;
@@ -4852,951 +4551,447 @@ fieldset[disabled] .navbar-inverse .btn-link:focus {
text-align: center;
white-space: nowrap;
vertical-align: baseline;
- border-radius: .25em;
+ border-radius: 0.25rem;
}
-a.label:hover,
-a.label:focus {
- color: #fff;
- text-decoration: none;
- cursor: pointer;
-}
-.label:empty {
+
+.badge:empty {
display: none;
}
-.btn .label {
+
+.btn .badge {
position: relative;
top: -1px;
}
-.label-default {
- background-color: #777;
+
+a.badge:focus, a.badge:hover {
+ color: #fff;
+ text-decoration: none;
+}
+
+.badge-pill {
+ padding-right: 0.6em;
+ padding-left: 0.6em;
+ border-radius: 10rem;
+}
+
+.badge-default {
+ background-color: #636c72;
}
-.label-default[href]:hover,
-.label-default[href]:focus {
- background-color: #5e5e5e;
+
+.badge-default[href]:focus, .badge-default[href]:hover {
+ background-color: #4b5257;
}
-.label-primary {
- background-color: #337ab7;
+
+.badge-primary {
+ background-color: #0275d8;
}
-.label-primary[href]:hover,
-.label-primary[href]:focus {
- background-color: #286090;
+
+.badge-primary[href]:focus, .badge-primary[href]:hover {
+ background-color: #025aa5;
}
-.label-success {
+
+.badge-success {
background-color: #5cb85c;
}
-.label-success[href]:hover,
-.label-success[href]:focus {
+
+.badge-success[href]:focus, .badge-success[href]:hover {
background-color: #449d44;
}
-.label-info {
+
+.badge-info {
background-color: #5bc0de;
}
-.label-info[href]:hover,
-.label-info[href]:focus {
+
+.badge-info[href]:focus, .badge-info[href]:hover {
background-color: #31b0d5;
}
-.label-warning {
+
+.badge-warning {
background-color: #f0ad4e;
}
-.label-warning[href]:hover,
-.label-warning[href]:focus {
+
+.badge-warning[href]:focus, .badge-warning[href]:hover {
background-color: #ec971f;
}
-.label-danger {
+
+.badge-danger {
background-color: #d9534f;
}
-.label-danger[href]:hover,
-.label-danger[href]:focus {
+
+.badge-danger[href]:focus, .badge-danger[href]:hover {
background-color: #c9302c;
}
-.badge {
- display: inline-block;
- min-width: 10px;
- padding: 3px 7px;
- font-size: 12px;
- font-weight: bold;
- line-height: 1;
- color: #fff;
- text-align: center;
- white-space: nowrap;
- vertical-align: middle;
- background-color: #777;
- border-radius: 10px;
-}
-.badge:empty {
- display: none;
-}
-.btn .badge {
- position: relative;
- top: -1px;
-}
-.btn-xs .badge,
-.btn-group-xs > .btn .badge {
- top: 0;
- padding: 1px 5px;
-}
-a.badge:hover,
-a.badge:focus {
- color: #fff;
- text-decoration: none;
- cursor: pointer;
-}
-.list-group-item.active > .badge,
-.nav-pills > .active > a > .badge {
- color: #337ab7;
- background-color: #fff;
-}
-.list-group-item > .badge {
- float: right;
-}
-.list-group-item > .badge + .badge {
- margin-right: 5px;
-}
-.nav-pills > li > a > .badge {
- margin-left: 3px;
-}
+
.jumbotron {
- padding-top: 30px;
- padding-bottom: 30px;
- margin-bottom: 30px;
- color: inherit;
- background-color: #eee;
-}
-.jumbotron h1,
-.jumbotron .h1 {
- color: inherit;
-}
-.jumbotron p {
- margin-bottom: 15px;
- font-size: 21px;
- font-weight: 200;
-}
-.jumbotron > hr {
- border-top-color: #d5d5d5;
-}
-.container .jumbotron,
-.container-fluid .jumbotron {
- padding-right: 15px;
- padding-left: 15px;
- border-radius: 6px;
-}
-.jumbotron .container {
- max-width: 100%;
+ padding: 2rem 1rem;
+ margin-bottom: 2rem;
+ background-color: #eceeef;
+ border-radius: 0.3rem;
}
-@media screen and (min-width: 768px) {
+
+@media (min-width: 576px) {
.jumbotron {
- padding-top: 48px;
- padding-bottom: 48px;
- }
- .container .jumbotron,
- .container-fluid .jumbotron {
- padding-right: 60px;
- padding-left: 60px;
+ padding: 4rem 2rem;
}
- .jumbotron h1,
- .jumbotron .h1 {
- font-size: 63px;
- }
-}
-.thumbnail {
- display: block;
- padding: 4px;
- margin-bottom: 20px;
- line-height: 1.42857143;
- background-color: #fff;
- border: 1px solid #ddd;
- border-radius: 4px;
- -webkit-transition: border .2s ease-in-out;
- -o-transition: border .2s ease-in-out;
- transition: border .2s ease-in-out;
-}
-.thumbnail > img,
-.thumbnail a > img {
- margin-right: auto;
- margin-left: auto;
}
-a.thumbnail:hover,
-a.thumbnail:focus,
-a.thumbnail.active {
- border-color: #337ab7;
-}
-.thumbnail .caption {
- padding: 9px;
- color: #333;
+
+.jumbotron-fluid {
+ padding-right: 0;
+ padding-left: 0;
+ border-radius: 0;
}
+
.alert {
- padding: 15px;
- margin-bottom: 20px;
+ padding: 0.75rem 1.25rem;
+ margin-bottom: 1rem;
border: 1px solid transparent;
- border-radius: 4px;
+ border-radius: 0.25rem;
}
-.alert h4 {
- margin-top: 0;
+
+.alert-heading {
color: inherit;
}
-.alert .alert-link {
+
+.alert-link {
font-weight: bold;
}
-.alert > p,
-.alert > ul {
- margin-bottom: 0;
-}
-.alert > p + p {
- margin-top: 5px;
-}
-.alert-dismissable,
-.alert-dismissible {
- padding-right: 35px;
-}
-.alert-dismissable .close,
+
.alert-dismissible .close {
position: relative;
- top: -2px;
- right: -21px;
+ top: -0.75rem;
+ right: -1.25rem;
+ padding: 0.75rem 1.25rem;
color: inherit;
}
+
.alert-success {
color: #3c763d;
background-color: #dff0d8;
- border-color: #d6e9c6;
+ border-color: #d0e9c6;
}
+
.alert-success hr {
- border-top-color: #c9e2b3;
+ border-top-color: #c1e2b3;
}
+
.alert-success .alert-link {
color: #2b542c;
}
+
.alert-info {
color: #31708f;
background-color: #d9edf7;
- border-color: #bce8f1;
+ border-color: #bcdff1;
}
+
.alert-info hr {
- border-top-color: #a6e1ec;
+ border-top-color: #a6d5ec;
}
+
.alert-info .alert-link {
color: #245269;
}
+
.alert-warning {
color: #8a6d3b;
background-color: #fcf8e3;
- border-color: #faebcc;
+ border-color: #faf2cc;
}
+
.alert-warning hr {
- border-top-color: #f7e1b5;
+ border-top-color: #f7ecb5;
}
+
.alert-warning .alert-link {
color: #66512c;
}
+
.alert-danger {
color: #a94442;
background-color: #f2dede;
- border-color: #ebccd1;
+ border-color: #ebcccc;
}
+
.alert-danger hr {
- border-top-color: #e4b9c0;
+ border-top-color: #e4b9b9;
}
+
.alert-danger .alert-link {
color: #843534;
}
+
@-webkit-keyframes progress-bar-stripes {
from {
- background-position: 40px 0;
+ background-position: 1rem 0;
}
to {
background-position: 0 0;
}
}
+
@-o-keyframes progress-bar-stripes {
from {
- background-position: 40px 0;
+ background-position: 1rem 0;
}
to {
background-position: 0 0;
}
}
+
@keyframes progress-bar-stripes {
from {
- background-position: 40px 0;
+ background-position: 1rem 0;
}
to {
background-position: 0 0;
}
}
+
.progress {
- height: 20px;
- margin-bottom: 20px;
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
overflow: hidden;
- background-color: #f5f5f5;
- border-radius: 4px;
- -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);
- box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);
+ font-size: 0.75rem;
+ line-height: 1rem;
+ text-align: center;
+ background-color: #eceeef;
+ border-radius: 0.25rem;
}
+
.progress-bar {
- float: left;
- width: 0;
- height: 100%;
- font-size: 12px;
- line-height: 20px;
+ height: 1rem;
+ line-height: 1rem;
color: #fff;
- text-align: center;
- background-color: #337ab7;
- -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);
- box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);
- -webkit-transition: width .6s ease;
- -o-transition: width .6s ease;
- transition: width .6s ease;
-}
-.progress-striped .progress-bar,
-.progress-bar-striped {
- background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
- background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
- background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
- -webkit-background-size: 40px 40px;
- background-size: 40px 40px;
-}
-.progress.active .progress-bar,
-.progress-bar.active {
- -webkit-animation: progress-bar-stripes 2s linear infinite;
- -o-animation: progress-bar-stripes 2s linear infinite;
- animation: progress-bar-stripes 2s linear infinite;
-}
-.progress-bar-success {
- background-color: #5cb85c;
-}
-.progress-striped .progress-bar-success {
- background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
- background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
- background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
-}
-.progress-bar-info {
- background-color: #5bc0de;
+ background-color: #0275d8;
+ -webkit-transition: width 0.6s ease;
+ -o-transition: width 0.6s ease;
+ transition: width 0.6s ease;
}
-.progress-striped .progress-bar-info {
- background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
- background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
- background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
-}
-.progress-bar-warning {
- background-color: #f0ad4e;
-}
-.progress-striped .progress-bar-warning {
- background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
- background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
- background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
-}
-.progress-bar-danger {
- background-color: #d9534f;
+
+.progress-bar-striped {
+ background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+ background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+ -webkit-background-size: 1rem 1rem;
+ background-size: 1rem 1rem;
}
-.progress-striped .progress-bar-danger {
- background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
- background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
- background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+
+.progress-bar-animated {
+ -webkit-animation: progress-bar-stripes 1s linear infinite;
+ -o-animation: progress-bar-stripes 1s linear infinite;
+ animation: progress-bar-stripes 1s linear infinite;
}
+
.media {
- margin-top: 15px;
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-align: start;
+ -webkit-align-items: flex-start;
+ -ms-flex-align: start;
+ align-items: flex-start;
}
-.media:first-child {
- margin-top: 0;
-}
-.media,
-.media-body {
- overflow: hidden;
- zoom: 1;
-}
-.media-body {
- width: 10000px;
-}
-.media-object {
- display: block;
-}
-.media-object.img-thumbnail {
- max-width: none;
-}
-.media-right,
-.media > .pull-right {
- padding-left: 10px;
-}
-.media-left,
-.media > .pull-left {
- padding-right: 10px;
-}
-.media-left,
-.media-right,
+
.media-body {
- display: table-cell;
- vertical-align: top;
-}
-.media-middle {
- vertical-align: middle;
+ -webkit-box-flex: 1;
+ -webkit-flex: 1;
+ -ms-flex: 1;
+ flex: 1 1 0%;
}
-.media-bottom {
- vertical-align: bottom;
+
+.list-group {
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ -webkit-flex-direction: column;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ padding-left: 0;
+ margin-bottom: 0;
}
-.media-heading {
- margin-top: 0;
- margin-bottom: 5px;
+
+.list-group-item-action {
+ width: 100%;
+ color: #464a4c;
+ text-align: inherit;
}
-.media-list {
- padding-left: 0;
- list-style: none;
+
+.list-group-item-action:focus, .list-group-item-action:hover {
+ color: #464a4c;
+ text-decoration: none;
+ background-color: #f7f7f9;
}
-.list-group {
- padding-left: 0;
- margin-bottom: 20px;
+
+.list-group-item-action:active {
+ color: #292b2c;
+ background-color: #eceeef;
}
+
.list-group-item {
position: relative;
display: block;
- padding: 10px 15px;
+ padding: 0.75rem 1.25rem;
margin-bottom: -1px;
background-color: #fff;
- border: 1px solid #ddd;
+ border: 1px solid rgba(0, 0, 0, 0.125);
}
+
.list-group-item:first-child {
- border-top-left-radius: 4px;
- border-top-right-radius: 4px;
+ border-top-left-radius: 0.25rem;
+ border-top-right-radius: 0.25rem;
}
+
.list-group-item:last-child {
margin-bottom: 0;
- border-bottom-right-radius: 4px;
- border-bottom-left-radius: 4px;
-}
-a.list-group-item,
-button.list-group-item {
- color: #555;
-}
-a.list-group-item .list-group-item-heading,
-button.list-group-item .list-group-item-heading {
- color: #333;
-}
-a.list-group-item:hover,
-button.list-group-item:hover,
-a.list-group-item:focus,
-button.list-group-item:focus {
- color: #555;
- text-decoration: none;
- background-color: #f5f5f5;
-}
-button.list-group-item {
- width: 100%;
- text-align: left;
+ border-bottom-right-radius: 0.25rem;
+ border-bottom-left-radius: 0.25rem;
}
-.list-group-item.disabled,
-.list-group-item.disabled:hover,
-.list-group-item.disabled:focus {
- color: #777;
- cursor: not-allowed;
- background-color: #eee;
-}
-.list-group-item.disabled .list-group-item-heading,
-.list-group-item.disabled:hover .list-group-item-heading,
-.list-group-item.disabled:focus .list-group-item-heading {
- color: inherit;
+
+.list-group-item:focus, .list-group-item:hover {
+ text-decoration: none;
}
-.list-group-item.disabled .list-group-item-text,
-.list-group-item.disabled:hover .list-group-item-text,
-.list-group-item.disabled:focus .list-group-item-text {
- color: #777;
+
+.list-group-item.disabled, .list-group-item:disabled {
+ color: #636c72;
+ background-color: #fff;
}
-.list-group-item.active,
-.list-group-item.active:hover,
-.list-group-item.active:focus {
+
+.list-group-item.active {
z-index: 2;
color: #fff;
- background-color: #337ab7;
- border-color: #337ab7;
-}
-.list-group-item.active .list-group-item-heading,
-.list-group-item.active:hover .list-group-item-heading,
-.list-group-item.active:focus .list-group-item-heading,
-.list-group-item.active .list-group-item-heading > small,
-.list-group-item.active:hover .list-group-item-heading > small,
-.list-group-item.active:focus .list-group-item-heading > small,
-.list-group-item.active .list-group-item-heading > .small,
-.list-group-item.active:hover .list-group-item-heading > .small,
-.list-group-item.active:focus .list-group-item-heading > .small {
- color: inherit;
+ background-color: #0275d8;
+ border-color: #0275d8;
+}
+
+.list-group-flush .list-group-item {
+ border-right: 0;
+ border-left: 0;
+ border-radius: 0;
+}
+
+.list-group-flush:first-child .list-group-item:first-child {
+ border-top: 0;
}
-.list-group-item.active .list-group-item-text,
-.list-group-item.active:hover .list-group-item-text,
-.list-group-item.active:focus .list-group-item-text {
- color: #c7ddef;
+
+.list-group-flush:last-child .list-group-item:last-child {
+ border-bottom: 0;
}
+
.list-group-item-success {
color: #3c763d;
background-color: #dff0d8;
}
+
a.list-group-item-success,
button.list-group-item-success {
color: #3c763d;
}
-a.list-group-item-success .list-group-item-heading,
-button.list-group-item-success .list-group-item-heading {
- color: inherit;
-}
-a.list-group-item-success:hover,
-button.list-group-item-success:hover,
-a.list-group-item-success:focus,
-button.list-group-item-success:focus {
+
+a.list-group-item-success:focus, a.list-group-item-success:hover,
+button.list-group-item-success:focus,
+button.list-group-item-success:hover {
color: #3c763d;
background-color: #d0e9c6;
}
+
a.list-group-item-success.active,
-button.list-group-item-success.active,
-a.list-group-item-success.active:hover,
-button.list-group-item-success.active:hover,
-a.list-group-item-success.active:focus,
-button.list-group-item-success.active:focus {
+button.list-group-item-success.active {
color: #fff;
background-color: #3c763d;
border-color: #3c763d;
}
+
.list-group-item-info {
color: #31708f;
background-color: #d9edf7;
}
+
a.list-group-item-info,
button.list-group-item-info {
color: #31708f;
}
-a.list-group-item-info .list-group-item-heading,
-button.list-group-item-info .list-group-item-heading {
- color: inherit;
-}
-a.list-group-item-info:hover,
-button.list-group-item-info:hover,
-a.list-group-item-info:focus,
-button.list-group-item-info:focus {
+
+a.list-group-item-info:focus, a.list-group-item-info:hover,
+button.list-group-item-info:focus,
+button.list-group-item-info:hover {
color: #31708f;
background-color: #c4e3f3;
}
+
a.list-group-item-info.active,
-button.list-group-item-info.active,
-a.list-group-item-info.active:hover,
-button.list-group-item-info.active:hover,
-a.list-group-item-info.active:focus,
-button.list-group-item-info.active:focus {
+button.list-group-item-info.active {
color: #fff;
background-color: #31708f;
border-color: #31708f;
}
+
.list-group-item-warning {
color: #8a6d3b;
background-color: #fcf8e3;
}
+
a.list-group-item-warning,
button.list-group-item-warning {
color: #8a6d3b;
}
-a.list-group-item-warning .list-group-item-heading,
-button.list-group-item-warning .list-group-item-heading {
- color: inherit;
-}
-a.list-group-item-warning:hover,
-button.list-group-item-warning:hover,
-a.list-group-item-warning:focus,
-button.list-group-item-warning:focus {
+
+a.list-group-item-warning:focus, a.list-group-item-warning:hover,
+button.list-group-item-warning:focus,
+button.list-group-item-warning:hover {
color: #8a6d3b;
background-color: #faf2cc;
}
+
a.list-group-item-warning.active,
-button.list-group-item-warning.active,
-a.list-group-item-warning.active:hover,
-button.list-group-item-warning.active:hover,
-a.list-group-item-warning.active:focus,
-button.list-group-item-warning.active:focus {
+button.list-group-item-warning.active {
color: #fff;
background-color: #8a6d3b;
border-color: #8a6d3b;
}
+
.list-group-item-danger {
color: #a94442;
background-color: #f2dede;
}
+
a.list-group-item-danger,
button.list-group-item-danger {
color: #a94442;
}
-a.list-group-item-danger .list-group-item-heading,
-button.list-group-item-danger .list-group-item-heading {
- color: inherit;
-}
-a.list-group-item-danger:hover,
-button.list-group-item-danger:hover,
-a.list-group-item-danger:focus,
-button.list-group-item-danger:focus {
+
+a.list-group-item-danger:focus, a.list-group-item-danger:hover,
+button.list-group-item-danger:focus,
+button.list-group-item-danger:hover {
color: #a94442;
background-color: #ebcccc;
}
+
a.list-group-item-danger.active,
-button.list-group-item-danger.active,
-a.list-group-item-danger.active:hover,
-button.list-group-item-danger.active:hover,
-a.list-group-item-danger.active:focus,
-button.list-group-item-danger.active:focus {
+button.list-group-item-danger.active {
color: #fff;
background-color: #a94442;
border-color: #a94442;
}
-.list-group-item-heading {
- margin-top: 0;
- margin-bottom: 5px;
-}
-.list-group-item-text {
- margin-bottom: 0;
- line-height: 1.3;
-}
-.panel {
- margin-bottom: 20px;
- background-color: #fff;
- border: 1px solid transparent;
- border-radius: 4px;
- -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05);
- box-shadow: 0 1px 1px rgba(0, 0, 0, .05);
-}
-.panel-body {
- padding: 15px;
-}
-.panel-heading {
- padding: 10px 15px;
- border-bottom: 1px solid transparent;
- border-top-left-radius: 3px;
- border-top-right-radius: 3px;
-}
-.panel-heading > .dropdown .dropdown-toggle {
- color: inherit;
-}
-.panel-title {
- margin-top: 0;
- margin-bottom: 0;
- font-size: 16px;
- color: inherit;
-}
-.panel-title > a,
-.panel-title > small,
-.panel-title > .small,
-.panel-title > small > a,
-.panel-title > .small > a {
- color: inherit;
-}
-.panel-footer {
- padding: 10px 15px;
- background-color: #f5f5f5;
- border-top: 1px solid #ddd;
- border-bottom-right-radius: 3px;
- border-bottom-left-radius: 3px;
-}
-.panel > .list-group,
-.panel > .panel-collapse > .list-group {
- margin-bottom: 0;
-}
-.panel > .list-group .list-group-item,
-.panel > .panel-collapse > .list-group .list-group-item {
- border-width: 1px 0;
- border-radius: 0;
-}
-.panel > .list-group:first-child .list-group-item:first-child,
-.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {
- border-top: 0;
- border-top-left-radius: 3px;
- border-top-right-radius: 3px;
-}
-.panel > .list-group:last-child .list-group-item:last-child,
-.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {
- border-bottom: 0;
- border-bottom-right-radius: 3px;
- border-bottom-left-radius: 3px;
-}
-.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {
- border-top-left-radius: 0;
- border-top-right-radius: 0;
-}
-.panel-heading + .list-group .list-group-item:first-child {
- border-top-width: 0;
-}
-.list-group + .panel-footer {
- border-top-width: 0;
-}
-.panel > .table,
-.panel > .table-responsive > .table,
-.panel > .panel-collapse > .table {
- margin-bottom: 0;
-}
-.panel > .table caption,
-.panel > .table-responsive > .table caption,
-.panel > .panel-collapse > .table caption {
- padding-right: 15px;
- padding-left: 15px;
-}
-.panel > .table:first-child,
-.panel > .table-responsive:first-child > .table:first-child {
- border-top-left-radius: 3px;
- border-top-right-radius: 3px;
-}
-.panel > .table:first-child > thead:first-child > tr:first-child,
-.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,
-.panel > .table:first-child > tbody:first-child > tr:first-child,
-.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {
- border-top-left-radius: 3px;
- border-top-right-radius: 3px;
-}
-.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,
-.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,
-.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,
-.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,
-.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,
-.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,
-.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,
-.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {
- border-top-left-radius: 3px;
-}
-.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,
-.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,
-.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,
-.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,
-.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,
-.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,
-.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,
-.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {
- border-top-right-radius: 3px;
-}
-.panel > .table:last-child,
-.panel > .table-responsive:last-child > .table:last-child {
- border-bottom-right-radius: 3px;
- border-bottom-left-radius: 3px;
-}
-.panel > .table:last-child > tbody:last-child > tr:last-child,
-.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,
-.panel > .table:last-child > tfoot:last-child > tr:last-child,
-.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {
- border-bottom-right-radius: 3px;
- border-bottom-left-radius: 3px;
-}
-.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,
-.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,
-.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,
-.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,
-.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,
-.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,
-.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,
-.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {
- border-bottom-left-radius: 3px;
-}
-.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,
-.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,
-.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,
-.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,
-.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,
-.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,
-.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,
-.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {
- border-bottom-right-radius: 3px;
-}
-.panel > .panel-body + .table,
-.panel > .panel-body + .table-responsive,
-.panel > .table + .panel-body,
-.panel > .table-responsive + .panel-body {
- border-top: 1px solid #ddd;
-}
-.panel > .table > tbody:first-child > tr:first-child th,
-.panel > .table > tbody:first-child > tr:first-child td {
- border-top: 0;
-}
-.panel > .table-bordered,
-.panel > .table-responsive > .table-bordered {
- border: 0;
-}
-.panel > .table-bordered > thead > tr > th:first-child,
-.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,
-.panel > .table-bordered > tbody > tr > th:first-child,
-.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,
-.panel > .table-bordered > tfoot > tr > th:first-child,
-.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,
-.panel > .table-bordered > thead > tr > td:first-child,
-.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,
-.panel > .table-bordered > tbody > tr > td:first-child,
-.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,
-.panel > .table-bordered > tfoot > tr > td:first-child,
-.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {
- border-left: 0;
-}
-.panel > .table-bordered > thead > tr > th:last-child,
-.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,
-.panel > .table-bordered > tbody > tr > th:last-child,
-.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,
-.panel > .table-bordered > tfoot > tr > th:last-child,
-.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,
-.panel > .table-bordered > thead > tr > td:last-child,
-.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,
-.panel > .table-bordered > tbody > tr > td:last-child,
-.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,
-.panel > .table-bordered > tfoot > tr > td:last-child,
-.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {
- border-right: 0;
-}
-.panel > .table-bordered > thead > tr:first-child > td,
-.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,
-.panel > .table-bordered > tbody > tr:first-child > td,
-.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,
-.panel > .table-bordered > thead > tr:first-child > th,
-.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,
-.panel > .table-bordered > tbody > tr:first-child > th,
-.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {
- border-bottom: 0;
-}
-.panel > .table-bordered > tbody > tr:last-child > td,
-.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,
-.panel > .table-bordered > tfoot > tr:last-child > td,
-.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,
-.panel > .table-bordered > tbody > tr:last-child > th,
-.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,
-.panel > .table-bordered > tfoot > tr:last-child > th,
-.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {
- border-bottom: 0;
-}
-.panel > .table-responsive {
- margin-bottom: 0;
- border: 0;
-}
-.panel-group {
- margin-bottom: 20px;
-}
-.panel-group .panel {
- margin-bottom: 0;
- border-radius: 4px;
-}
-.panel-group .panel + .panel {
- margin-top: 5px;
-}
-.panel-group .panel-heading {
- border-bottom: 0;
-}
-.panel-group .panel-heading + .panel-collapse > .panel-body,
-.panel-group .panel-heading + .panel-collapse > .list-group {
- border-top: 1px solid #ddd;
-}
-.panel-group .panel-footer {
- border-top: 0;
-}
-.panel-group .panel-footer + .panel-collapse .panel-body {
- border-bottom: 1px solid #ddd;
-}
-.panel-default {
- border-color: #ddd;
-}
-.panel-default > .panel-heading {
- color: #333;
- background-color: #f5f5f5;
- border-color: #ddd;
-}
-.panel-default > .panel-heading + .panel-collapse > .panel-body {
- border-top-color: #ddd;
-}
-.panel-default > .panel-heading .badge {
- color: #f5f5f5;
- background-color: #333;
-}
-.panel-default > .panel-footer + .panel-collapse > .panel-body {
- border-bottom-color: #ddd;
-}
-.panel-primary {
- border-color: #337ab7;
-}
-.panel-primary > .panel-heading {
- color: #fff;
- background-color: #337ab7;
- border-color: #337ab7;
-}
-.panel-primary > .panel-heading + .panel-collapse > .panel-body {
- border-top-color: #337ab7;
-}
-.panel-primary > .panel-heading .badge {
- color: #337ab7;
- background-color: #fff;
-}
-.panel-primary > .panel-footer + .panel-collapse > .panel-body {
- border-bottom-color: #337ab7;
-}
-.panel-success {
- border-color: #d6e9c6;
-}
-.panel-success > .panel-heading {
- color: #3c763d;
- background-color: #dff0d8;
- border-color: #d6e9c6;
-}
-.panel-success > .panel-heading + .panel-collapse > .panel-body {
- border-top-color: #d6e9c6;
-}
-.panel-success > .panel-heading .badge {
- color: #dff0d8;
- background-color: #3c763d;
-}
-.panel-success > .panel-footer + .panel-collapse > .panel-body {
- border-bottom-color: #d6e9c6;
-}
-.panel-info {
- border-color: #bce8f1;
-}
-.panel-info > .panel-heading {
- color: #31708f;
- background-color: #d9edf7;
- border-color: #bce8f1;
-}
-.panel-info > .panel-heading + .panel-collapse > .panel-body {
- border-top-color: #bce8f1;
-}
-.panel-info > .panel-heading .badge {
- color: #d9edf7;
- background-color: #31708f;
-}
-.panel-info > .panel-footer + .panel-collapse > .panel-body {
- border-bottom-color: #bce8f1;
-}
-.panel-warning {
- border-color: #faebcc;
-}
-.panel-warning > .panel-heading {
- color: #8a6d3b;
- background-color: #fcf8e3;
- border-color: #faebcc;
-}
-.panel-warning > .panel-heading + .panel-collapse > .panel-body {
- border-top-color: #faebcc;
-}
-.panel-warning > .panel-heading .badge {
- color: #fcf8e3;
- background-color: #8a6d3b;
-}
-.panel-warning > .panel-footer + .panel-collapse > .panel-body {
- border-bottom-color: #faebcc;
-}
-.panel-danger {
- border-color: #ebccd1;
-}
-.panel-danger > .panel-heading {
- color: #a94442;
- background-color: #f2dede;
- border-color: #ebccd1;
-}
-.panel-danger > .panel-heading + .panel-collapse > .panel-body {
- border-top-color: #ebccd1;
-}
-.panel-danger > .panel-heading .badge {
- color: #f2dede;
- background-color: #a94442;
-}
-.panel-danger > .panel-footer + .panel-collapse > .panel-body {
- border-bottom-color: #ebccd1;
-}
+
.embed-responsive {
position: relative;
display: block;
- height: 0;
+ width: 100%;
padding: 0;
overflow: hidden;
}
+
+.embed-responsive::before {
+ display: block;
+ content: "";
+}
+
.embed-responsive .embed-responsive-item,
.embed-responsive iframe,
.embed-responsive embed,
@@ -5810,62 +5005,50 @@ button.list-group-item-danger.active:focus {
height: 100%;
border: 0;
}
-.embed-responsive-16by9 {
- padding-bottom: 56.25%;
-}
-.embed-responsive-4by3 {
- padding-bottom: 75%;
-}
-.well {
- min-height: 20px;
- padding: 19px;
- margin-bottom: 20px;
- background-color: #f5f5f5;
- border: 1px solid #e3e3e3;
- border-radius: 4px;
- -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);
- box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);
+
+.embed-responsive-21by9::before {
+ padding-top: 42.857143%;
}
-.well blockquote {
- border-color: #ddd;
- border-color: rgba(0, 0, 0, .15);
+
+.embed-responsive-16by9::before {
+ padding-top: 56.25%;
}
-.well-lg {
- padding: 24px;
- border-radius: 6px;
+
+.embed-responsive-4by3::before {
+ padding-top: 75%;
}
-.well-sm {
- padding: 9px;
- border-radius: 3px;
+
+.embed-responsive-1by1::before {
+ padding-top: 100%;
}
+
.close {
float: right;
- font-size: 21px;
+ font-size: 1.5rem;
font-weight: bold;
line-height: 1;
color: #000;
text-shadow: 0 1px 0 #fff;
- filter: alpha(opacity=20);
- opacity: .2;
+ opacity: .5;
}
-.close:hover,
-.close:focus {
+
+.close:focus, .close:hover {
color: #000;
text-decoration: none;
- cursor: pointer;
- filter: alpha(opacity=50);
- opacity: .5;
+ opacity: .75;
}
+
button.close {
- -webkit-appearance: none;
padding: 0;
- cursor: pointer;
background: transparent;
border: 0;
+ -webkit-appearance: none;
}
+
.modal-open {
overflow: hidden;
}
+
.modal {
position: fixed;
top: 0;
@@ -5875,45 +5058,56 @@ button.close {
z-index: 1050;
display: none;
overflow: hidden;
- -webkit-overflow-scrolling: touch;
outline: 0;
}
+
.modal.fade .modal-dialog {
- -webkit-transition: -webkit-transform .3s ease-out;
- -o-transition: -o-transform .3s ease-out;
- transition: transform .3s ease-out;
+ -webkit-transition: -webkit-transform 0.3s ease-out;
+ transition: -webkit-transform 0.3s ease-out;
+ -o-transition: -o-transform 0.3s ease-out;
+ transition: transform 0.3s ease-out;
+ transition: transform 0.3s ease-out, -webkit-transform 0.3s ease-out, -o-transform 0.3s ease-out;
-webkit-transform: translate(0, -25%);
- -ms-transform: translate(0, -25%);
-o-transform: translate(0, -25%);
transform: translate(0, -25%);
}
-.modal.in .modal-dialog {
+
+.modal.show .modal-dialog {
-webkit-transform: translate(0, 0);
- -ms-transform: translate(0, 0);
-o-transform: translate(0, 0);
transform: translate(0, 0);
}
+
.modal-open .modal {
overflow-x: hidden;
overflow-y: auto;
}
+
.modal-dialog {
position: relative;
width: auto;
margin: 10px;
}
+
.modal-content {
position: relative;
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ -webkit-flex-direction: column;
+ -ms-flex-direction: column;
+ flex-direction: column;
background-color: #fff;
-webkit-background-clip: padding-box;
background-clip: padding-box;
- border: 1px solid #999;
- border: 1px solid rgba(0, 0, 0, .2);
- border-radius: 6px;
+ border: 1px solid rgba(0, 0, 0, 0.2);
+ border-radius: 0.3rem;
outline: 0;
- -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5);
- box-shadow: 0 3px 9px rgba(0, 0, 0, .5);
}
+
.modal-backdrop {
position: fixed;
top: 0;
@@ -5923,44 +5117,71 @@ button.close {
z-index: 1040;
background-color: #000;
}
+
.modal-backdrop.fade {
- filter: alpha(opacity=0);
opacity: 0;
}
-.modal-backdrop.in {
- filter: alpha(opacity=50);
- opacity: .5;
+
+.modal-backdrop.show {
+ opacity: 0.5;
}
+
.modal-header {
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-align: center;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
+ -webkit-box-pack: justify;
+ -webkit-justify-content: space-between;
+ -ms-flex-pack: justify;
+ justify-content: space-between;
padding: 15px;
- border-bottom: 1px solid #e5e5e5;
-}
-.modal-header .close {
- margin-top: -2px;
+ border-bottom: 1px solid #eceeef;
}
+
.modal-title {
- margin: 0;
- line-height: 1.42857143;
+ margin-bottom: 0;
+ line-height: 1.5;
}
+
.modal-body {
position: relative;
+ -webkit-box-flex: 1;
+ -webkit-flex: 1 1 auto;
+ -ms-flex: 1 1 auto;
+ flex: 1 1 auto;
padding: 15px;
}
+
.modal-footer {
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-align: center;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
+ -webkit-box-pack: end;
+ -webkit-justify-content: flex-end;
+ -ms-flex-pack: end;
+ justify-content: flex-end;
padding: 15px;
- text-align: right;
- border-top: 1px solid #e5e5e5;
+ border-top: 1px solid #eceeef;
}
-.modal-footer .btn + .btn {
- margin-bottom: 0;
- margin-left: 5px;
-}
-.modal-footer .btn-group .btn + .btn {
- margin-left: -1px;
+
+.modal-footer > :not(:first-child) {
+ margin-left: .25rem;
}
-.modal-footer .btn-block + .btn-block {
- margin-left: 0;
+
+.modal-footer > :not(:last-child) {
+ margin-right: .25rem;
}
+
.modal-scrollbar-measure {
position: absolute;
top: -9999px;
@@ -5968,33 +5189,31 @@ button.close {
height: 50px;
overflow: scroll;
}
-@media (min-width: 768px) {
+
+@media (min-width: 576px) {
.modal-dialog {
- width: 600px;
+ max-width: 500px;
margin: 30px auto;
}
- .modal-content {
- -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5);
- box-shadow: 0 5px 15px rgba(0, 0, 0, .5);
- }
.modal-sm {
- width: 300px;
+ max-width: 300px;
}
}
+
@media (min-width: 992px) {
.modal-lg {
- width: 900px;
+ max-width: 800px;
}
}
+
.tooltip {
position: absolute;
z-index: 1070;
display: block;
- font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
- font-size: 12px;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
font-style: normal;
font-weight: normal;
- line-height: 1.42857143;
+ line-height: 1.5;
text-align: left;
text-align: start;
text-decoration: none;
@@ -6003,117 +5222,102 @@ button.close {
letter-spacing: normal;
word-break: normal;
word-spacing: normal;
- word-wrap: normal;
white-space: normal;
- filter: alpha(opacity=0);
- opacity: 0;
-
line-break: auto;
+ font-size: 0.875rem;
+ word-wrap: break-word;
+ opacity: 0;
}
-.tooltip.in {
- filter: alpha(opacity=90);
- opacity: .9;
+
+.tooltip.show {
+ opacity: 0.9;
}
-.tooltip.top {
+
+.tooltip.tooltip-top, .tooltip.bs-tether-element-attached-bottom {
padding: 5px 0;
margin-top: -3px;
}
-.tooltip.right {
- padding: 0 5px;
- margin-left: 3px;
-}
-.tooltip.bottom {
- padding: 5px 0;
- margin-top: 3px;
-}
-.tooltip.left {
- padding: 0 5px;
- margin-left: -3px;
-}
-.tooltip-inner {
- max-width: 200px;
- padding: 3px 8px;
- color: #fff;
- text-align: center;
- background-color: #000;
- border-radius: 4px;
-}
-.tooltip-arrow {
- position: absolute;
- width: 0;
- height: 0;
- border-color: transparent;
- border-style: solid;
-}
-.tooltip.top .tooltip-arrow {
+
+.tooltip.tooltip-top .tooltip-inner::before, .tooltip.bs-tether-element-attached-bottom .tooltip-inner::before {
bottom: 0;
left: 50%;
margin-left: -5px;
+ content: "";
border-width: 5px 5px 0;
border-top-color: #000;
}
-.tooltip.top-left .tooltip-arrow {
- right: 5px;
- bottom: 0;
- margin-bottom: -5px;
- border-width: 5px 5px 0;
- border-top-color: #000;
-}
-.tooltip.top-right .tooltip-arrow {
- bottom: 0;
- left: 5px;
- margin-bottom: -5px;
- border-width: 5px 5px 0;
- border-top-color: #000;
+
+.tooltip.tooltip-right, .tooltip.bs-tether-element-attached-left {
+ padding: 0 5px;
+ margin-left: 3px;
}
-.tooltip.right .tooltip-arrow {
+
+.tooltip.tooltip-right .tooltip-inner::before, .tooltip.bs-tether-element-attached-left .tooltip-inner::before {
top: 50%;
left: 0;
margin-top: -5px;
+ content: "";
border-width: 5px 5px 5px 0;
border-right-color: #000;
}
-.tooltip.left .tooltip-arrow {
- top: 50%;
- right: 0;
- margin-top: -5px;
- border-width: 5px 0 5px 5px;
- border-left-color: #000;
+
+.tooltip.tooltip-bottom, .tooltip.bs-tether-element-attached-top {
+ padding: 5px 0;
+ margin-top: 3px;
}
-.tooltip.bottom .tooltip-arrow {
+
+.tooltip.tooltip-bottom .tooltip-inner::before, .tooltip.bs-tether-element-attached-top .tooltip-inner::before {
top: 0;
left: 50%;
margin-left: -5px;
+ content: "";
border-width: 0 5px 5px;
border-bottom-color: #000;
}
-.tooltip.bottom-left .tooltip-arrow {
- top: 0;
- right: 5px;
- margin-top: -5px;
- border-width: 0 5px 5px;
- border-bottom-color: #000;
+
+.tooltip.tooltip-left, .tooltip.bs-tether-element-attached-right {
+ padding: 0 5px;
+ margin-left: -3px;
}
-.tooltip.bottom-right .tooltip-arrow {
- top: 0;
- left: 5px;
+
+.tooltip.tooltip-left .tooltip-inner::before, .tooltip.bs-tether-element-attached-right .tooltip-inner::before {
+ top: 50%;
+ right: 0;
margin-top: -5px;
- border-width: 0 5px 5px;
- border-bottom-color: #000;
+ content: "";
+ border-width: 5px 0 5px 5px;
+ border-left-color: #000;
}
+
+.tooltip-inner {
+ max-width: 200px;
+ padding: 3px 8px;
+ color: #fff;
+ text-align: center;
+ background-color: #000;
+ border-radius: 0.25rem;
+}
+
+.tooltip-inner::before {
+ position: absolute;
+ width: 0;
+ height: 0;
+ border-color: transparent;
+ border-style: solid;
+}
+
.popover {
position: absolute;
top: 0;
left: 0;
z-index: 1060;
- display: none;
+ display: block;
max-width: 276px;
padding: 1px;
- font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
- font-size: 14px;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
font-style: normal;
font-weight: normal;
- line-height: 1.42857143;
+ line-height: 1.5;
text-align: left;
text-align: start;
text-decoration: none;
@@ -6122,44 +5326,134 @@ button.close {
letter-spacing: normal;
word-break: normal;
word-spacing: normal;
- word-wrap: normal;
white-space: normal;
+ line-break: auto;
+ font-size: 0.875rem;
+ word-wrap: break-word;
background-color: #fff;
-webkit-background-clip: padding-box;
background-clip: padding-box;
- border: 1px solid #ccc;
- border: 1px solid rgba(0, 0, 0, .2);
- border-radius: 6px;
- -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2);
- box-shadow: 0 5px 10px rgba(0, 0, 0, .2);
-
- line-break: auto;
+ border: 1px solid rgba(0, 0, 0, 0.2);
+ border-radius: 0.3rem;
}
-.popover.top {
+
+.popover.popover-top, .popover.bs-tether-element-attached-bottom {
margin-top: -10px;
}
-.popover.right {
+
+.popover.popover-top::before, .popover.popover-top::after, .popover.bs-tether-element-attached-bottom::before, .popover.bs-tether-element-attached-bottom::after {
+ left: 50%;
+ border-bottom-width: 0;
+}
+
+.popover.popover-top::before, .popover.bs-tether-element-attached-bottom::before {
+ bottom: -11px;
+ margin-left: -11px;
+ border-top-color: rgba(0, 0, 0, 0.25);
+}
+
+.popover.popover-top::after, .popover.bs-tether-element-attached-bottom::after {
+ bottom: -10px;
+ margin-left: -10px;
+ border-top-color: #fff;
+}
+
+.popover.popover-right, .popover.bs-tether-element-attached-left {
margin-left: 10px;
}
-.popover.bottom {
+
+.popover.popover-right::before, .popover.popover-right::after, .popover.bs-tether-element-attached-left::before, .popover.bs-tether-element-attached-left::after {
+ top: 50%;
+ border-left-width: 0;
+}
+
+.popover.popover-right::before, .popover.bs-tether-element-attached-left::before {
+ left: -11px;
+ margin-top: -11px;
+ border-right-color: rgba(0, 0, 0, 0.25);
+}
+
+.popover.popover-right::after, .popover.bs-tether-element-attached-left::after {
+ left: -10px;
+ margin-top: -10px;
+ border-right-color: #fff;
+}
+
+.popover.popover-bottom, .popover.bs-tether-element-attached-top {
margin-top: 10px;
}
-.popover.left {
+
+.popover.popover-bottom::before, .popover.popover-bottom::after, .popover.bs-tether-element-attached-top::before, .popover.bs-tether-element-attached-top::after {
+ left: 50%;
+ border-top-width: 0;
+}
+
+.popover.popover-bottom::before, .popover.bs-tether-element-attached-top::before {
+ top: -11px;
+ margin-left: -11px;
+ border-bottom-color: rgba(0, 0, 0, 0.25);
+}
+
+.popover.popover-bottom::after, .popover.bs-tether-element-attached-top::after {
+ top: -10px;
margin-left: -10px;
+ border-bottom-color: #fff;
}
+
+.popover.popover-bottom .popover-title::before, .popover.bs-tether-element-attached-top .popover-title::before {
+ position: absolute;
+ top: 0;
+ left: 50%;
+ display: block;
+ width: 20px;
+ margin-left: -10px;
+ content: "";
+ border-bottom: 1px solid #f7f7f7;
+}
+
+.popover.popover-left, .popover.bs-tether-element-attached-right {
+ margin-left: -10px;
+}
+
+.popover.popover-left::before, .popover.popover-left::after, .popover.bs-tether-element-attached-right::before, .popover.bs-tether-element-attached-right::after {
+ top: 50%;
+ border-right-width: 0;
+}
+
+.popover.popover-left::before, .popover.bs-tether-element-attached-right::before {
+ right: -11px;
+ margin-top: -11px;
+ border-left-color: rgba(0, 0, 0, 0.25);
+}
+
+.popover.popover-left::after, .popover.bs-tether-element-attached-right::after {
+ right: -10px;
+ margin-top: -10px;
+ border-left-color: #fff;
+}
+
.popover-title {
padding: 8px 14px;
- margin: 0;
- font-size: 14px;
+ margin-bottom: 0;
+ font-size: 1rem;
+ color: inherit;
background-color: #f7f7f7;
border-bottom: 1px solid #ebebeb;
- border-radius: 5px 5px 0 0;
+ border-top-left-radius: calc(0.3rem - 1px);
+ border-top-right-radius: calc(0.3rem - 1px);
+}
+
+.popover-title:empty {
+ display: none;
}
+
.popover-content {
padding: 9px 14px;
+ color: #292b2c;
}
-.popover > .arrow,
-.popover > .arrow:after {
+
+.popover::before,
+.popover::after {
position: absolute;
display: block;
width: 0;
@@ -6167,255 +5461,195 @@ button.close {
border-color: transparent;
border-style: solid;
}
-.popover > .arrow {
+
+.popover::before {
+ content: "";
border-width: 11px;
}
-.popover > .arrow:after {
+
+.popover::after {
content: "";
border-width: 10px;
}
-.popover.top > .arrow {
- bottom: -11px;
- left: 50%;
- margin-left: -11px;
- border-top-color: #999;
- border-top-color: rgba(0, 0, 0, .25);
- border-bottom-width: 0;
-}
-.popover.top > .arrow:after {
- bottom: 1px;
- margin-left: -10px;
- content: " ";
- border-top-color: #fff;
- border-bottom-width: 0;
-}
-.popover.right > .arrow {
- top: 50%;
- left: -11px;
- margin-top: -11px;
- border-right-color: #999;
- border-right-color: rgba(0, 0, 0, .25);
- border-left-width: 0;
-}
-.popover.right > .arrow:after {
- bottom: -10px;
- left: 1px;
- content: " ";
- border-right-color: #fff;
- border-left-width: 0;
-}
-.popover.bottom > .arrow {
- top: -11px;
- left: 50%;
- margin-left: -11px;
- border-top-width: 0;
- border-bottom-color: #999;
- border-bottom-color: rgba(0, 0, 0, .25);
-}
-.popover.bottom > .arrow:after {
- top: 1px;
- margin-left: -10px;
- content: " ";
- border-top-width: 0;
- border-bottom-color: #fff;
-}
-.popover.left > .arrow {
- top: 50%;
- right: -11px;
- margin-top: -11px;
- border-right-width: 0;
- border-left-color: #999;
- border-left-color: rgba(0, 0, 0, .25);
-}
-.popover.left > .arrow:after {
- right: 1px;
- bottom: -10px;
- content: " ";
- border-right-width: 0;
- border-left-color: #fff;
-}
+
.carousel {
position: relative;
}
+
.carousel-inner {
position: relative;
width: 100%;
overflow: hidden;
}
-.carousel-inner > .item {
+
+.carousel-item {
position: relative;
display: none;
- -webkit-transition: .6s ease-in-out left;
- -o-transition: .6s ease-in-out left;
- transition: .6s ease-in-out left;
-}
-.carousel-inner > .item > img,
-.carousel-inner > .item > a > img {
- line-height: 1;
-}
-@media all and (transform-3d), (-webkit-transform-3d) {
- .carousel-inner > .item {
- -webkit-transition: -webkit-transform .6s ease-in-out;
- -o-transition: -o-transform .6s ease-in-out;
- transition: transform .6s ease-in-out;
-
- -webkit-backface-visibility: hidden;
- backface-visibility: hidden;
- -webkit-perspective: 1000px;
- perspective: 1000px;
- }
- .carousel-inner > .item.next,
- .carousel-inner > .item.active.right {
- left: 0;
- -webkit-transform: translate3d(100%, 0, 0);
- transform: translate3d(100%, 0, 0);
- }
- .carousel-inner > .item.prev,
- .carousel-inner > .item.active.left {
- left: 0;
- -webkit-transform: translate3d(-100%, 0, 0);
- transform: translate3d(-100%, 0, 0);
- }
- .carousel-inner > .item.next.left,
- .carousel-inner > .item.prev.right,
- .carousel-inner > .item.active {
- left: 0;
- -webkit-transform: translate3d(0, 0, 0);
- transform: translate3d(0, 0, 0);
- }
-}
-.carousel-inner > .active,
-.carousel-inner > .next,
-.carousel-inner > .prev {
- display: block;
+ -webkit-box-align: center;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
+ width: 100%;
+ -webkit-transition: -webkit-transform 0.6s ease;
+ transition: -webkit-transform 0.6s ease;
+ -o-transition: -o-transform 0.6s ease;
+ transition: transform 0.6s ease;
+ transition: transform 0.6s ease, -webkit-transform 0.6s ease, -o-transform 0.6s ease;
+ -webkit-backface-visibility: hidden;
+ backface-visibility: hidden;
+ -webkit-perspective: 1000px;
+ perspective: 1000px;
}
-.carousel-inner > .active {
- left: 0;
+
+.carousel-item.active,
+.carousel-item-next,
+.carousel-item-prev {
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
}
-.carousel-inner > .next,
-.carousel-inner > .prev {
+
+.carousel-item-next,
+.carousel-item-prev {
position: absolute;
top: 0;
- width: 100%;
-}
-.carousel-inner > .next {
- left: 100%;
}
-.carousel-inner > .prev {
- left: -100%;
-}
-.carousel-inner > .next.left,
-.carousel-inner > .prev.right {
- left: 0;
+
+.carousel-item-next.carousel-item-left,
+.carousel-item-prev.carousel-item-right {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
}
-.carousel-inner > .active.left {
- left: -100%;
+
+.carousel-item-next,
+.active.carousel-item-right {
+ -webkit-transform: translate3d(100%, 0, 0);
+ transform: translate3d(100%, 0, 0);
}
-.carousel-inner > .active.right {
- left: 100%;
+
+.carousel-item-prev,
+.active.carousel-item-left {
+ -webkit-transform: translate3d(-100%, 0, 0);
+ transform: translate3d(-100%, 0, 0);
}
-.carousel-control {
+
+.carousel-control-prev,
+.carousel-control-next {
position: absolute;
top: 0;
bottom: 0;
- left: 0;
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-align: center;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
+ -webkit-box-pack: center;
+ -webkit-justify-content: center;
+ -ms-flex-pack: center;
+ justify-content: center;
width: 15%;
- font-size: 20px;
color: #fff;
text-align: center;
- text-shadow: 0 1px 2px rgba(0, 0, 0, .6);
- background-color: rgba(0, 0, 0, 0);
- filter: alpha(opacity=50);
- opacity: .5;
-}
-.carousel-control.left {
- background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);
- background-image: -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);
- background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001)));
- background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);
- background-repeat: repeat-x;
+ opacity: 0.5;
}
-.carousel-control.right {
- right: 0;
- left: auto;
- background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);
- background-image: -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);
- background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5)));
- background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);
- background-repeat: repeat-x;
-}
-.carousel-control:hover,
-.carousel-control:focus {
+
+.carousel-control-prev:focus, .carousel-control-prev:hover,
+.carousel-control-next:focus,
+.carousel-control-next:hover {
color: #fff;
text-decoration: none;
- filter: alpha(opacity=90);
outline: 0;
opacity: .9;
}
-.carousel-control .icon-prev,
-.carousel-control .icon-next,
-.carousel-control .glyphicon-chevron-left,
-.carousel-control .glyphicon-chevron-right {
- position: absolute;
- top: 50%;
- z-index: 5;
- display: inline-block;
- margin-top: -10px;
-}
-.carousel-control .icon-prev,
-.carousel-control .glyphicon-chevron-left {
- left: 50%;
- margin-left: -10px;
+
+.carousel-control-prev {
+ left: 0;
}
-.carousel-control .icon-next,
-.carousel-control .glyphicon-chevron-right {
- right: 50%;
- margin-right: -10px;
+
+.carousel-control-next {
+ right: 0;
}
-.carousel-control .icon-prev,
-.carousel-control .icon-next {
+
+.carousel-control-prev-icon,
+.carousel-control-next-icon {
+ display: inline-block;
width: 20px;
height: 20px;
- font-family: serif;
- line-height: 1;
+ background: transparent no-repeat center center;
+ -webkit-background-size: 100% 100%;
+ background-size: 100% 100%;
}
-.carousel-control .icon-prev:before {
- content: '\2039';
+
+.carousel-control-prev-icon {
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M4 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E");
}
-.carousel-control .icon-next:before {
- content: '\203a';
+
+.carousel-control-next-icon {
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M1.5 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E");
}
+
.carousel-indicators {
position: absolute;
+ right: 0;
bottom: 10px;
- left: 50%;
+ left: 0;
z-index: 15;
- width: 60%;
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-pack: center;
+ -webkit-justify-content: center;
+ -ms-flex-pack: center;
+ justify-content: center;
padding-left: 0;
- margin-left: -30%;
- text-align: center;
+ margin-right: 15%;
+ margin-left: 15%;
list-style: none;
}
+
.carousel-indicators li {
+ position: relative;
+ -webkit-box-flex: 1;
+ -webkit-flex: 1 0 auto;
+ -ms-flex: 1 0 auto;
+ flex: 1 0 auto;
+ max-width: 30px;
+ height: 3px;
+ margin-right: 3px;
+ margin-left: 3px;
+ text-indent: -999px;
+ background-color: rgba(255, 255, 255, 0.5);
+}
+
+.carousel-indicators li::before {
+ position: absolute;
+ top: -10px;
+ left: 0;
display: inline-block;
- width: 10px;
+ width: 100%;
height: 10px;
- margin: 1px;
- text-indent: -999px;
- cursor: pointer;
- background-color: #000 \9;
- background-color: rgba(0, 0, 0, 0);
- border: 1px solid #fff;
- border-radius: 10px;
+ content: "";
+}
+
+.carousel-indicators li::after {
+ position: absolute;
+ bottom: -10px;
+ left: 0;
+ display: inline-block;
+ width: 100%;
+ height: 10px;
+ content: "";
}
+
.carousel-indicators .active {
- width: 12px;
- height: 12px;
- margin: 0;
background-color: #fff;
}
+
.carousel-caption {
position: absolute;
right: 15%;
@@ -6426,332 +5660,3223 @@ button.close {
padding-bottom: 20px;
color: #fff;
text-align: center;
- text-shadow: 0 1px 2px rgba(0, 0, 0, .6);
}
-.carousel-caption .btn {
- text-shadow: none;
+
+.align-baseline {
+ vertical-align: baseline !important;
}
-@media screen and (min-width: 768px) {
- .carousel-control .glyphicon-chevron-left,
- .carousel-control .glyphicon-chevron-right,
- .carousel-control .icon-prev,
- .carousel-control .icon-next {
- width: 30px;
- height: 30px;
- margin-top: -10px;
- font-size: 30px;
- }
- .carousel-control .glyphicon-chevron-left,
- .carousel-control .icon-prev {
- margin-left: -10px;
- }
- .carousel-control .glyphicon-chevron-right,
- .carousel-control .icon-next {
- margin-right: -10px;
- }
- .carousel-caption {
- right: 20%;
- left: 20%;
- padding-bottom: 30px;
- }
- .carousel-indicators {
- bottom: 20px;
- }
-}
-.clearfix:before,
-.clearfix:after,
-.dl-horizontal dd:before,
-.dl-horizontal dd:after,
-.container:before,
-.container:after,
-.container-fluid:before,
-.container-fluid:after,
-.row:before,
-.row:after,
-.form-horizontal .form-group:before,
-.form-horizontal .form-group:after,
-.btn-toolbar:before,
-.btn-toolbar:after,
-.btn-group-vertical > .btn-group:before,
-.btn-group-vertical > .btn-group:after,
-.nav:before,
-.nav:after,
-.navbar:before,
-.navbar:after,
-.navbar-header:before,
-.navbar-header:after,
-.navbar-collapse:before,
-.navbar-collapse:after,
-.pager:before,
-.pager:after,
-.panel-body:before,
-.panel-body:after,
-.modal-header:before,
-.modal-header:after,
-.modal-footer:before,
-.modal-footer:after {
- display: table;
- content: " ";
-}
-.clearfix:after,
-.dl-horizontal dd:after,
-.container:after,
-.container-fluid:after,
-.row:after,
-.form-horizontal .form-group:after,
-.btn-toolbar:after,
-.btn-group-vertical > .btn-group:after,
-.nav:after,
-.navbar:after,
-.navbar-header:after,
-.navbar-collapse:after,
-.pager:after,
-.panel-body:after,
-.modal-header:after,
-.modal-footer:after {
- clear: both;
+
+.align-top {
+ vertical-align: top !important;
}
-.center-block {
- display: block;
- margin-right: auto;
- margin-left: auto;
+
+.align-middle {
+ vertical-align: middle !important;
}
-.pull-right {
- float: right !important;
+
+.align-bottom {
+ vertical-align: bottom !important;
}
-.pull-left {
- float: left !important;
+
+.align-text-bottom {
+ vertical-align: text-bottom !important;
}
-.hide {
- display: none !important;
+
+.align-text-top {
+ vertical-align: text-top !important;
}
-.show {
- display: block !important;
+
+.bg-faded {
+ background-color: #f7f7f7;
}
-.invisible {
- visibility: hidden;
+
+.bg-primary {
+ background-color: #0275d8 !important;
}
-.text-hide {
- font: 0/0 a;
- color: transparent;
- text-shadow: none;
- background-color: transparent;
- border: 0;
+
+a.bg-primary:focus, a.bg-primary:hover {
+ background-color: #025aa5 !important;
}
-.hidden {
- display: none !important;
+
+.bg-success {
+ background-color: #5cb85c !important;
}
-.affix {
- position: fixed;
+
+a.bg-success:focus, a.bg-success:hover {
+ background-color: #449d44 !important;
}
-@-ms-viewport {
- width: device-width;
+
+.bg-info {
+ background-color: #5bc0de !important;
}
-.visible-xs,
-.visible-sm,
-.visible-md,
-.visible-lg {
- display: none !important;
+
+a.bg-info:focus, a.bg-info:hover {
+ background-color: #31b0d5 !important;
+}
+
+.bg-warning {
+ background-color: #f0ad4e !important;
+}
+
+a.bg-warning:focus, a.bg-warning:hover {
+ background-color: #ec971f !important;
+}
+
+.bg-danger {
+ background-color: #d9534f !important;
+}
+
+a.bg-danger:focus, a.bg-danger:hover {
+ background-color: #c9302c !important;
+}
+
+.bg-inverse {
+ background-color: #292b2c !important;
+}
+
+a.bg-inverse:focus, a.bg-inverse:hover {
+ background-color: #101112 !important;
+}
+
+.border-0 {
+ border: 0 !important;
+}
+
+.border-top-0 {
+ border-top: 0 !important;
}
-.visible-xs-block,
-.visible-xs-inline,
-.visible-xs-inline-block,
-.visible-sm-block,
-.visible-sm-inline,
-.visible-sm-inline-block,
-.visible-md-block,
-.visible-md-inline,
-.visible-md-inline-block,
-.visible-lg-block,
-.visible-lg-inline,
-.visible-lg-inline-block {
+
+.border-right-0 {
+ border-right: 0 !important;
+}
+
+.border-bottom-0 {
+ border-bottom: 0 !important;
+}
+
+.border-left-0 {
+ border-left: 0 !important;
+}
+
+.rounded {
+ border-radius: 0.25rem;
+}
+
+.rounded-top {
+ border-top-left-radius: 0.25rem;
+ border-top-right-radius: 0.25rem;
+}
+
+.rounded-right {
+ border-top-right-radius: 0.25rem;
+ border-bottom-right-radius: 0.25rem;
+}
+
+.rounded-bottom {
+ border-bottom-right-radius: 0.25rem;
+ border-bottom-left-radius: 0.25rem;
+}
+
+.rounded-left {
+ border-top-left-radius: 0.25rem;
+ border-bottom-left-radius: 0.25rem;
+}
+
+.rounded-circle {
+ border-radius: 50%;
+}
+
+.rounded-0 {
+ border-radius: 0;
+}
+
+.clearfix::after {
+ display: block;
+ clear: both;
+ content: "";
+}
+
+.d-none {
display: none !important;
}
-@media (max-width: 767px) {
- .visible-xs {
+
+.d-inline {
+ display: inline !important;
+}
+
+.d-inline-block {
+ display: inline-block !important;
+}
+
+.d-block {
+ display: block !important;
+}
+
+.d-table {
+ display: table !important;
+}
+
+.d-table-cell {
+ display: table-cell !important;
+}
+
+.d-flex {
+ display: -webkit-box !important;
+ display: -webkit-flex !important;
+ display: -ms-flexbox !important;
+ display: flex !important;
+}
+
+.d-inline-flex {
+ display: -webkit-inline-box !important;
+ display: -webkit-inline-flex !important;
+ display: -ms-inline-flexbox !important;
+ display: inline-flex !important;
+}
+
+@media (min-width: 576px) {
+ .d-sm-none {
+ display: none !important;
+ }
+ .d-sm-inline {
+ display: inline !important;
+ }
+ .d-sm-inline-block {
+ display: inline-block !important;
+ }
+ .d-sm-block {
display: block !important;
}
- table.visible-xs {
+ .d-sm-table {
display: table !important;
}
- tr.visible-xs {
- display: table-row !important;
- }
- th.visible-xs,
- td.visible-xs {
+ .d-sm-table-cell {
display: table-cell !important;
}
-}
-@media (max-width: 767px) {
- .visible-xs-block {
- display: block !important;
+ .d-sm-flex {
+ display: -webkit-box !important;
+ display: -webkit-flex !important;
+ display: -ms-flexbox !important;
+ display: flex !important;
+ }
+ .d-sm-inline-flex {
+ display: -webkit-inline-box !important;
+ display: -webkit-inline-flex !important;
+ display: -ms-inline-flexbox !important;
+ display: inline-flex !important;
}
}
-@media (max-width: 767px) {
- .visible-xs-inline {
+
+@media (min-width: 768px) {
+ .d-md-none {
+ display: none !important;
+ }
+ .d-md-inline {
display: inline !important;
}
-}
-@media (max-width: 767px) {
- .visible-xs-inline-block {
+ .d-md-inline-block {
display: inline-block !important;
}
-}
-@media (min-width: 768px) and (max-width: 991px) {
- .visible-sm {
+ .d-md-block {
display: block !important;
}
- table.visible-sm {
+ .d-md-table {
display: table !important;
}
- tr.visible-sm {
- display: table-row !important;
- }
- th.visible-sm,
- td.visible-sm {
+ .d-md-table-cell {
display: table-cell !important;
}
-}
-@media (min-width: 768px) and (max-width: 991px) {
- .visible-sm-block {
- display: block !important;
+ .d-md-flex {
+ display: -webkit-box !important;
+ display: -webkit-flex !important;
+ display: -ms-flexbox !important;
+ display: flex !important;
+ }
+ .d-md-inline-flex {
+ display: -webkit-inline-box !important;
+ display: -webkit-inline-flex !important;
+ display: -ms-inline-flexbox !important;
+ display: inline-flex !important;
}
}
-@media (min-width: 768px) and (max-width: 991px) {
- .visible-sm-inline {
+
+@media (min-width: 992px) {
+ .d-lg-none {
+ display: none !important;
+ }
+ .d-lg-inline {
display: inline !important;
}
-}
-@media (min-width: 768px) and (max-width: 991px) {
- .visible-sm-inline-block {
+ .d-lg-inline-block {
display: inline-block !important;
}
-}
-@media (min-width: 992px) and (max-width: 1199px) {
- .visible-md {
+ .d-lg-block {
display: block !important;
}
- table.visible-md {
+ .d-lg-table {
display: table !important;
}
- tr.visible-md {
- display: table-row !important;
- }
- th.visible-md,
- td.visible-md {
+ .d-lg-table-cell {
display: table-cell !important;
}
-}
-@media (min-width: 992px) and (max-width: 1199px) {
- .visible-md-block {
- display: block !important;
+ .d-lg-flex {
+ display: -webkit-box !important;
+ display: -webkit-flex !important;
+ display: -ms-flexbox !important;
+ display: flex !important;
+ }
+ .d-lg-inline-flex {
+ display: -webkit-inline-box !important;
+ display: -webkit-inline-flex !important;
+ display: -ms-inline-flexbox !important;
+ display: inline-flex !important;
}
}
-@media (min-width: 992px) and (max-width: 1199px) {
- .visible-md-inline {
+
+@media (min-width: 1200px) {
+ .d-xl-none {
+ display: none !important;
+ }
+ .d-xl-inline {
display: inline !important;
}
-}
-@media (min-width: 992px) and (max-width: 1199px) {
- .visible-md-inline-block {
+ .d-xl-inline-block {
display: inline-block !important;
}
-}
-@media (min-width: 1200px) {
- .visible-lg {
+ .d-xl-block {
display: block !important;
}
- table.visible-lg {
+ .d-xl-table {
display: table !important;
}
- tr.visible-lg {
- display: table-row !important;
- }
- th.visible-lg,
- td.visible-lg {
+ .d-xl-table-cell {
display: table-cell !important;
}
+ .d-xl-flex {
+ display: -webkit-box !important;
+ display: -webkit-flex !important;
+ display: -ms-flexbox !important;
+ display: flex !important;
+ }
+ .d-xl-inline-flex {
+ display: -webkit-inline-box !important;
+ display: -webkit-inline-flex !important;
+ display: -ms-inline-flexbox !important;
+ display: inline-flex !important;
+ }
}
-@media (min-width: 1200px) {
- .visible-lg-block {
+
+.d-print-block {
+ display: none !important;
+}
+
+@media print {
+ .d-print-block {
display: block !important;
}
}
-@media (min-width: 1200px) {
- .visible-lg-inline {
+
+.d-print-inline {
+ display: none !important;
+}
+
+@media print {
+ .d-print-inline {
display: inline !important;
}
}
-@media (min-width: 1200px) {
- .visible-lg-inline-block {
+
+.d-print-inline-block {
+ display: none !important;
+}
+
+@media print {
+ .d-print-inline-block {
display: inline-block !important;
}
}
-@media (max-width: 767px) {
- .hidden-xs {
+
+@media print {
+ .d-print-none {
display: none !important;
}
}
-@media (min-width: 768px) and (max-width: 991px) {
- .hidden-sm {
- display: none !important;
+
+.order-first {
+ -webkit-box-ordinal-group: 0;
+ -webkit-order: -1;
+ -ms-flex-order: -1;
+ order: -1;
+}
+
+.order-last {
+ -webkit-box-ordinal-group: 2;
+ -webkit-order: 1;
+ -ms-flex-order: 1;
+ order: 1;
+}
+
+.order-0 {
+ -webkit-box-ordinal-group: 1;
+ -webkit-order: 0;
+ -ms-flex-order: 0;
+ order: 0;
+}
+
+.flex-row {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: normal !important;
+ -webkit-flex-direction: row !important;
+ -ms-flex-direction: row !important;
+ flex-direction: row !important;
+}
+
+.flex-column {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: normal !important;
+ -webkit-flex-direction: column !important;
+ -ms-flex-direction: column !important;
+ flex-direction: column !important;
+}
+
+.flex-row-reverse {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: reverse !important;
+ -webkit-flex-direction: row-reverse !important;
+ -ms-flex-direction: row-reverse !important;
+ flex-direction: row-reverse !important;
+}
+
+.flex-column-reverse {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: reverse !important;
+ -webkit-flex-direction: column-reverse !important;
+ -ms-flex-direction: column-reverse !important;
+ flex-direction: column-reverse !important;
+}
+
+.flex-wrap {
+ -webkit-flex-wrap: wrap !important;
+ -ms-flex-wrap: wrap !important;
+ flex-wrap: wrap !important;
+}
+
+.flex-nowrap {
+ -webkit-flex-wrap: nowrap !important;
+ -ms-flex-wrap: nowrap !important;
+ flex-wrap: nowrap !important;
+}
+
+.flex-wrap-reverse {
+ -webkit-flex-wrap: wrap-reverse !important;
+ -ms-flex-wrap: wrap-reverse !important;
+ flex-wrap: wrap-reverse !important;
+}
+
+.justify-content-start {
+ -webkit-box-pack: start !important;
+ -webkit-justify-content: flex-start !important;
+ -ms-flex-pack: start !important;
+ justify-content: flex-start !important;
+}
+
+.justify-content-end {
+ -webkit-box-pack: end !important;
+ -webkit-justify-content: flex-end !important;
+ -ms-flex-pack: end !important;
+ justify-content: flex-end !important;
+}
+
+.justify-content-center {
+ -webkit-box-pack: center !important;
+ -webkit-justify-content: center !important;
+ -ms-flex-pack: center !important;
+ justify-content: center !important;
+}
+
+.justify-content-between {
+ -webkit-box-pack: justify !important;
+ -webkit-justify-content: space-between !important;
+ -ms-flex-pack: justify !important;
+ justify-content: space-between !important;
+}
+
+.justify-content-around {
+ -webkit-justify-content: space-around !important;
+ -ms-flex-pack: distribute !important;
+ justify-content: space-around !important;
+}
+
+.align-items-start {
+ -webkit-box-align: start !important;
+ -webkit-align-items: flex-start !important;
+ -ms-flex-align: start !important;
+ align-items: flex-start !important;
+}
+
+.align-items-end {
+ -webkit-box-align: end !important;
+ -webkit-align-items: flex-end !important;
+ -ms-flex-align: end !important;
+ align-items: flex-end !important;
+}
+
+.align-items-center {
+ -webkit-box-align: center !important;
+ -webkit-align-items: center !important;
+ -ms-flex-align: center !important;
+ align-items: center !important;
+}
+
+.align-items-baseline {
+ -webkit-box-align: baseline !important;
+ -webkit-align-items: baseline !important;
+ -ms-flex-align: baseline !important;
+ align-items: baseline !important;
+}
+
+.align-items-stretch {
+ -webkit-box-align: stretch !important;
+ -webkit-align-items: stretch !important;
+ -ms-flex-align: stretch !important;
+ align-items: stretch !important;
+}
+
+.align-content-start {
+ -webkit-align-content: flex-start !important;
+ -ms-flex-line-pack: start !important;
+ align-content: flex-start !important;
+}
+
+.align-content-end {
+ -webkit-align-content: flex-end !important;
+ -ms-flex-line-pack: end !important;
+ align-content: flex-end !important;
+}
+
+.align-content-center {
+ -webkit-align-content: center !important;
+ -ms-flex-line-pack: center !important;
+ align-content: center !important;
+}
+
+.align-content-between {
+ -webkit-align-content: space-between !important;
+ -ms-flex-line-pack: justify !important;
+ align-content: space-between !important;
+}
+
+.align-content-around {
+ -webkit-align-content: space-around !important;
+ -ms-flex-line-pack: distribute !important;
+ align-content: space-around !important;
+}
+
+.align-content-stretch {
+ -webkit-align-content: stretch !important;
+ -ms-flex-line-pack: stretch !important;
+ align-content: stretch !important;
+}
+
+.align-self-auto {
+ -webkit-align-self: auto !important;
+ -ms-flex-item-align: auto !important;
+ -ms-grid-row-align: auto !important;
+ align-self: auto !important;
+}
+
+.align-self-start {
+ -webkit-align-self: flex-start !important;
+ -ms-flex-item-align: start !important;
+ align-self: flex-start !important;
+}
+
+.align-self-end {
+ -webkit-align-self: flex-end !important;
+ -ms-flex-item-align: end !important;
+ align-self: flex-end !important;
+}
+
+.align-self-center {
+ -webkit-align-self: center !important;
+ -ms-flex-item-align: center !important;
+ -ms-grid-row-align: center !important;
+ align-self: center !important;
+}
+
+.align-self-baseline {
+ -webkit-align-self: baseline !important;
+ -ms-flex-item-align: baseline !important;
+ align-self: baseline !important;
+}
+
+.align-self-stretch {
+ -webkit-align-self: stretch !important;
+ -ms-flex-item-align: stretch !important;
+ -ms-grid-row-align: stretch !important;
+ align-self: stretch !important;
+}
+
+@media (min-width: 576px) {
+ .order-sm-first {
+ -webkit-box-ordinal-group: 0;
+ -webkit-order: -1;
+ -ms-flex-order: -1;
+ order: -1;
+ }
+ .order-sm-last {
+ -webkit-box-ordinal-group: 2;
+ -webkit-order: 1;
+ -ms-flex-order: 1;
+ order: 1;
+ }
+ .order-sm-0 {
+ -webkit-box-ordinal-group: 1;
+ -webkit-order: 0;
+ -ms-flex-order: 0;
+ order: 0;
+ }
+ .flex-sm-row {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: normal !important;
+ -webkit-flex-direction: row !important;
+ -ms-flex-direction: row !important;
+ flex-direction: row !important;
+ }
+ .flex-sm-column {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: normal !important;
+ -webkit-flex-direction: column !important;
+ -ms-flex-direction: column !important;
+ flex-direction: column !important;
+ }
+ .flex-sm-row-reverse {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: reverse !important;
+ -webkit-flex-direction: row-reverse !important;
+ -ms-flex-direction: row-reverse !important;
+ flex-direction: row-reverse !important;
+ }
+ .flex-sm-column-reverse {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: reverse !important;
+ -webkit-flex-direction: column-reverse !important;
+ -ms-flex-direction: column-reverse !important;
+ flex-direction: column-reverse !important;
+ }
+ .flex-sm-wrap {
+ -webkit-flex-wrap: wrap !important;
+ -ms-flex-wrap: wrap !important;
+ flex-wrap: wrap !important;
+ }
+ .flex-sm-nowrap {
+ -webkit-flex-wrap: nowrap !important;
+ -ms-flex-wrap: nowrap !important;
+ flex-wrap: nowrap !important;
+ }
+ .flex-sm-wrap-reverse {
+ -webkit-flex-wrap: wrap-reverse !important;
+ -ms-flex-wrap: wrap-reverse !important;
+ flex-wrap: wrap-reverse !important;
+ }
+ .justify-content-sm-start {
+ -webkit-box-pack: start !important;
+ -webkit-justify-content: flex-start !important;
+ -ms-flex-pack: start !important;
+ justify-content: flex-start !important;
+ }
+ .justify-content-sm-end {
+ -webkit-box-pack: end !important;
+ -webkit-justify-content: flex-end !important;
+ -ms-flex-pack: end !important;
+ justify-content: flex-end !important;
+ }
+ .justify-content-sm-center {
+ -webkit-box-pack: center !important;
+ -webkit-justify-content: center !important;
+ -ms-flex-pack: center !important;
+ justify-content: center !important;
+ }
+ .justify-content-sm-between {
+ -webkit-box-pack: justify !important;
+ -webkit-justify-content: space-between !important;
+ -ms-flex-pack: justify !important;
+ justify-content: space-between !important;
+ }
+ .justify-content-sm-around {
+ -webkit-justify-content: space-around !important;
+ -ms-flex-pack: distribute !important;
+ justify-content: space-around !important;
+ }
+ .align-items-sm-start {
+ -webkit-box-align: start !important;
+ -webkit-align-items: flex-start !important;
+ -ms-flex-align: start !important;
+ align-items: flex-start !important;
+ }
+ .align-items-sm-end {
+ -webkit-box-align: end !important;
+ -webkit-align-items: flex-end !important;
+ -ms-flex-align: end !important;
+ align-items: flex-end !important;
+ }
+ .align-items-sm-center {
+ -webkit-box-align: center !important;
+ -webkit-align-items: center !important;
+ -ms-flex-align: center !important;
+ align-items: center !important;
+ }
+ .align-items-sm-baseline {
+ -webkit-box-align: baseline !important;
+ -webkit-align-items: baseline !important;
+ -ms-flex-align: baseline !important;
+ align-items: baseline !important;
+ }
+ .align-items-sm-stretch {
+ -webkit-box-align: stretch !important;
+ -webkit-align-items: stretch !important;
+ -ms-flex-align: stretch !important;
+ align-items: stretch !important;
+ }
+ .align-content-sm-start {
+ -webkit-align-content: flex-start !important;
+ -ms-flex-line-pack: start !important;
+ align-content: flex-start !important;
+ }
+ .align-content-sm-end {
+ -webkit-align-content: flex-end !important;
+ -ms-flex-line-pack: end !important;
+ align-content: flex-end !important;
+ }
+ .align-content-sm-center {
+ -webkit-align-content: center !important;
+ -ms-flex-line-pack: center !important;
+ align-content: center !important;
+ }
+ .align-content-sm-between {
+ -webkit-align-content: space-between !important;
+ -ms-flex-line-pack: justify !important;
+ align-content: space-between !important;
+ }
+ .align-content-sm-around {
+ -webkit-align-content: space-around !important;
+ -ms-flex-line-pack: distribute !important;
+ align-content: space-around !important;
+ }
+ .align-content-sm-stretch {
+ -webkit-align-content: stretch !important;
+ -ms-flex-line-pack: stretch !important;
+ align-content: stretch !important;
+ }
+ .align-self-sm-auto {
+ -webkit-align-self: auto !important;
+ -ms-flex-item-align: auto !important;
+ -ms-grid-row-align: auto !important;
+ align-self: auto !important;
+ }
+ .align-self-sm-start {
+ -webkit-align-self: flex-start !important;
+ -ms-flex-item-align: start !important;
+ align-self: flex-start !important;
+ }
+ .align-self-sm-end {
+ -webkit-align-self: flex-end !important;
+ -ms-flex-item-align: end !important;
+ align-self: flex-end !important;
+ }
+ .align-self-sm-center {
+ -webkit-align-self: center !important;
+ -ms-flex-item-align: center !important;
+ -ms-grid-row-align: center !important;
+ align-self: center !important;
+ }
+ .align-self-sm-baseline {
+ -webkit-align-self: baseline !important;
+ -ms-flex-item-align: baseline !important;
+ align-self: baseline !important;
+ }
+ .align-self-sm-stretch {
+ -webkit-align-self: stretch !important;
+ -ms-flex-item-align: stretch !important;
+ -ms-grid-row-align: stretch !important;
+ align-self: stretch !important;
}
}
-@media (min-width: 992px) and (max-width: 1199px) {
- .hidden-md {
- display: none !important;
+
+@media (min-width: 768px) {
+ .order-md-first {
+ -webkit-box-ordinal-group: 0;
+ -webkit-order: -1;
+ -ms-flex-order: -1;
+ order: -1;
+ }
+ .order-md-last {
+ -webkit-box-ordinal-group: 2;
+ -webkit-order: 1;
+ -ms-flex-order: 1;
+ order: 1;
+ }
+ .order-md-0 {
+ -webkit-box-ordinal-group: 1;
+ -webkit-order: 0;
+ -ms-flex-order: 0;
+ order: 0;
+ }
+ .flex-md-row {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: normal !important;
+ -webkit-flex-direction: row !important;
+ -ms-flex-direction: row !important;
+ flex-direction: row !important;
+ }
+ .flex-md-column {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: normal !important;
+ -webkit-flex-direction: column !important;
+ -ms-flex-direction: column !important;
+ flex-direction: column !important;
+ }
+ .flex-md-row-reverse {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: reverse !important;
+ -webkit-flex-direction: row-reverse !important;
+ -ms-flex-direction: row-reverse !important;
+ flex-direction: row-reverse !important;
+ }
+ .flex-md-column-reverse {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: reverse !important;
+ -webkit-flex-direction: column-reverse !important;
+ -ms-flex-direction: column-reverse !important;
+ flex-direction: column-reverse !important;
+ }
+ .flex-md-wrap {
+ -webkit-flex-wrap: wrap !important;
+ -ms-flex-wrap: wrap !important;
+ flex-wrap: wrap !important;
+ }
+ .flex-md-nowrap {
+ -webkit-flex-wrap: nowrap !important;
+ -ms-flex-wrap: nowrap !important;
+ flex-wrap: nowrap !important;
+ }
+ .flex-md-wrap-reverse {
+ -webkit-flex-wrap: wrap-reverse !important;
+ -ms-flex-wrap: wrap-reverse !important;
+ flex-wrap: wrap-reverse !important;
+ }
+ .justify-content-md-start {
+ -webkit-box-pack: start !important;
+ -webkit-justify-content: flex-start !important;
+ -ms-flex-pack: start !important;
+ justify-content: flex-start !important;
+ }
+ .justify-content-md-end {
+ -webkit-box-pack: end !important;
+ -webkit-justify-content: flex-end !important;
+ -ms-flex-pack: end !important;
+ justify-content: flex-end !important;
+ }
+ .justify-content-md-center {
+ -webkit-box-pack: center !important;
+ -webkit-justify-content: center !important;
+ -ms-flex-pack: center !important;
+ justify-content: center !important;
+ }
+ .justify-content-md-between {
+ -webkit-box-pack: justify !important;
+ -webkit-justify-content: space-between !important;
+ -ms-flex-pack: justify !important;
+ justify-content: space-between !important;
+ }
+ .justify-content-md-around {
+ -webkit-justify-content: space-around !important;
+ -ms-flex-pack: distribute !important;
+ justify-content: space-around !important;
+ }
+ .align-items-md-start {
+ -webkit-box-align: start !important;
+ -webkit-align-items: flex-start !important;
+ -ms-flex-align: start !important;
+ align-items: flex-start !important;
+ }
+ .align-items-md-end {
+ -webkit-box-align: end !important;
+ -webkit-align-items: flex-end !important;
+ -ms-flex-align: end !important;
+ align-items: flex-end !important;
+ }
+ .align-items-md-center {
+ -webkit-box-align: center !important;
+ -webkit-align-items: center !important;
+ -ms-flex-align: center !important;
+ align-items: center !important;
+ }
+ .align-items-md-baseline {
+ -webkit-box-align: baseline !important;
+ -webkit-align-items: baseline !important;
+ -ms-flex-align: baseline !important;
+ align-items: baseline !important;
+ }
+ .align-items-md-stretch {
+ -webkit-box-align: stretch !important;
+ -webkit-align-items: stretch !important;
+ -ms-flex-align: stretch !important;
+ align-items: stretch !important;
+ }
+ .align-content-md-start {
+ -webkit-align-content: flex-start !important;
+ -ms-flex-line-pack: start !important;
+ align-content: flex-start !important;
+ }
+ .align-content-md-end {
+ -webkit-align-content: flex-end !important;
+ -ms-flex-line-pack: end !important;
+ align-content: flex-end !important;
+ }
+ .align-content-md-center {
+ -webkit-align-content: center !important;
+ -ms-flex-line-pack: center !important;
+ align-content: center !important;
+ }
+ .align-content-md-between {
+ -webkit-align-content: space-between !important;
+ -ms-flex-line-pack: justify !important;
+ align-content: space-between !important;
+ }
+ .align-content-md-around {
+ -webkit-align-content: space-around !important;
+ -ms-flex-line-pack: distribute !important;
+ align-content: space-around !important;
+ }
+ .align-content-md-stretch {
+ -webkit-align-content: stretch !important;
+ -ms-flex-line-pack: stretch !important;
+ align-content: stretch !important;
+ }
+ .align-self-md-auto {
+ -webkit-align-self: auto !important;
+ -ms-flex-item-align: auto !important;
+ -ms-grid-row-align: auto !important;
+ align-self: auto !important;
+ }
+ .align-self-md-start {
+ -webkit-align-self: flex-start !important;
+ -ms-flex-item-align: start !important;
+ align-self: flex-start !important;
+ }
+ .align-self-md-end {
+ -webkit-align-self: flex-end !important;
+ -ms-flex-item-align: end !important;
+ align-self: flex-end !important;
+ }
+ .align-self-md-center {
+ -webkit-align-self: center !important;
+ -ms-flex-item-align: center !important;
+ -ms-grid-row-align: center !important;
+ align-self: center !important;
+ }
+ .align-self-md-baseline {
+ -webkit-align-self: baseline !important;
+ -ms-flex-item-align: baseline !important;
+ align-self: baseline !important;
+ }
+ .align-self-md-stretch {
+ -webkit-align-self: stretch !important;
+ -ms-flex-item-align: stretch !important;
+ -ms-grid-row-align: stretch !important;
+ align-self: stretch !important;
}
}
+
+@media (min-width: 992px) {
+ .order-lg-first {
+ -webkit-box-ordinal-group: 0;
+ -webkit-order: -1;
+ -ms-flex-order: -1;
+ order: -1;
+ }
+ .order-lg-last {
+ -webkit-box-ordinal-group: 2;
+ -webkit-order: 1;
+ -ms-flex-order: 1;
+ order: 1;
+ }
+ .order-lg-0 {
+ -webkit-box-ordinal-group: 1;
+ -webkit-order: 0;
+ -ms-flex-order: 0;
+ order: 0;
+ }
+ .flex-lg-row {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: normal !important;
+ -webkit-flex-direction: row !important;
+ -ms-flex-direction: row !important;
+ flex-direction: row !important;
+ }
+ .flex-lg-column {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: normal !important;
+ -webkit-flex-direction: column !important;
+ -ms-flex-direction: column !important;
+ flex-direction: column !important;
+ }
+ .flex-lg-row-reverse {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: reverse !important;
+ -webkit-flex-direction: row-reverse !important;
+ -ms-flex-direction: row-reverse !important;
+ flex-direction: row-reverse !important;
+ }
+ .flex-lg-column-reverse {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: reverse !important;
+ -webkit-flex-direction: column-reverse !important;
+ -ms-flex-direction: column-reverse !important;
+ flex-direction: column-reverse !important;
+ }
+ .flex-lg-wrap {
+ -webkit-flex-wrap: wrap !important;
+ -ms-flex-wrap: wrap !important;
+ flex-wrap: wrap !important;
+ }
+ .flex-lg-nowrap {
+ -webkit-flex-wrap: nowrap !important;
+ -ms-flex-wrap: nowrap !important;
+ flex-wrap: nowrap !important;
+ }
+ .flex-lg-wrap-reverse {
+ -webkit-flex-wrap: wrap-reverse !important;
+ -ms-flex-wrap: wrap-reverse !important;
+ flex-wrap: wrap-reverse !important;
+ }
+ .justify-content-lg-start {
+ -webkit-box-pack: start !important;
+ -webkit-justify-content: flex-start !important;
+ -ms-flex-pack: start !important;
+ justify-content: flex-start !important;
+ }
+ .justify-content-lg-end {
+ -webkit-box-pack: end !important;
+ -webkit-justify-content: flex-end !important;
+ -ms-flex-pack: end !important;
+ justify-content: flex-end !important;
+ }
+ .justify-content-lg-center {
+ -webkit-box-pack: center !important;
+ -webkit-justify-content: center !important;
+ -ms-flex-pack: center !important;
+ justify-content: center !important;
+ }
+ .justify-content-lg-between {
+ -webkit-box-pack: justify !important;
+ -webkit-justify-content: space-between !important;
+ -ms-flex-pack: justify !important;
+ justify-content: space-between !important;
+ }
+ .justify-content-lg-around {
+ -webkit-justify-content: space-around !important;
+ -ms-flex-pack: distribute !important;
+ justify-content: space-around !important;
+ }
+ .align-items-lg-start {
+ -webkit-box-align: start !important;
+ -webkit-align-items: flex-start !important;
+ -ms-flex-align: start !important;
+ align-items: flex-start !important;
+ }
+ .align-items-lg-end {
+ -webkit-box-align: end !important;
+ -webkit-align-items: flex-end !important;
+ -ms-flex-align: end !important;
+ align-items: flex-end !important;
+ }
+ .align-items-lg-center {
+ -webkit-box-align: center !important;
+ -webkit-align-items: center !important;
+ -ms-flex-align: center !important;
+ align-items: center !important;
+ }
+ .align-items-lg-baseline {
+ -webkit-box-align: baseline !important;
+ -webkit-align-items: baseline !important;
+ -ms-flex-align: baseline !important;
+ align-items: baseline !important;
+ }
+ .align-items-lg-stretch {
+ -webkit-box-align: stretch !important;
+ -webkit-align-items: stretch !important;
+ -ms-flex-align: stretch !important;
+ align-items: stretch !important;
+ }
+ .align-content-lg-start {
+ -webkit-align-content: flex-start !important;
+ -ms-flex-line-pack: start !important;
+ align-content: flex-start !important;
+ }
+ .align-content-lg-end {
+ -webkit-align-content: flex-end !important;
+ -ms-flex-line-pack: end !important;
+ align-content: flex-end !important;
+ }
+ .align-content-lg-center {
+ -webkit-align-content: center !important;
+ -ms-flex-line-pack: center !important;
+ align-content: center !important;
+ }
+ .align-content-lg-between {
+ -webkit-align-content: space-between !important;
+ -ms-flex-line-pack: justify !important;
+ align-content: space-between !important;
+ }
+ .align-content-lg-around {
+ -webkit-align-content: space-around !important;
+ -ms-flex-line-pack: distribute !important;
+ align-content: space-around !important;
+ }
+ .align-content-lg-stretch {
+ -webkit-align-content: stretch !important;
+ -ms-flex-line-pack: stretch !important;
+ align-content: stretch !important;
+ }
+ .align-self-lg-auto {
+ -webkit-align-self: auto !important;
+ -ms-flex-item-align: auto !important;
+ -ms-grid-row-align: auto !important;
+ align-self: auto !important;
+ }
+ .align-self-lg-start {
+ -webkit-align-self: flex-start !important;
+ -ms-flex-item-align: start !important;
+ align-self: flex-start !important;
+ }
+ .align-self-lg-end {
+ -webkit-align-self: flex-end !important;
+ -ms-flex-item-align: end !important;
+ align-self: flex-end !important;
+ }
+ .align-self-lg-center {
+ -webkit-align-self: center !important;
+ -ms-flex-item-align: center !important;
+ -ms-grid-row-align: center !important;
+ align-self: center !important;
+ }
+ .align-self-lg-baseline {
+ -webkit-align-self: baseline !important;
+ -ms-flex-item-align: baseline !important;
+ align-self: baseline !important;
+ }
+ .align-self-lg-stretch {
+ -webkit-align-self: stretch !important;
+ -ms-flex-item-align: stretch !important;
+ -ms-grid-row-align: stretch !important;
+ align-self: stretch !important;
+ }
+}
+
@media (min-width: 1200px) {
- .hidden-lg {
- display: none !important;
+ .order-xl-first {
+ -webkit-box-ordinal-group: 0;
+ -webkit-order: -1;
+ -ms-flex-order: -1;
+ order: -1;
+ }
+ .order-xl-last {
+ -webkit-box-ordinal-group: 2;
+ -webkit-order: 1;
+ -ms-flex-order: 1;
+ order: 1;
+ }
+ .order-xl-0 {
+ -webkit-box-ordinal-group: 1;
+ -webkit-order: 0;
+ -ms-flex-order: 0;
+ order: 0;
+ }
+ .flex-xl-row {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: normal !important;
+ -webkit-flex-direction: row !important;
+ -ms-flex-direction: row !important;
+ flex-direction: row !important;
+ }
+ .flex-xl-column {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: normal !important;
+ -webkit-flex-direction: column !important;
+ -ms-flex-direction: column !important;
+ flex-direction: column !important;
+ }
+ .flex-xl-row-reverse {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: reverse !important;
+ -webkit-flex-direction: row-reverse !important;
+ -ms-flex-direction: row-reverse !important;
+ flex-direction: row-reverse !important;
+ }
+ .flex-xl-column-reverse {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: reverse !important;
+ -webkit-flex-direction: column-reverse !important;
+ -ms-flex-direction: column-reverse !important;
+ flex-direction: column-reverse !important;
+ }
+ .flex-xl-wrap {
+ -webkit-flex-wrap: wrap !important;
+ -ms-flex-wrap: wrap !important;
+ flex-wrap: wrap !important;
+ }
+ .flex-xl-nowrap {
+ -webkit-flex-wrap: nowrap !important;
+ -ms-flex-wrap: nowrap !important;
+ flex-wrap: nowrap !important;
+ }
+ .flex-xl-wrap-reverse {
+ -webkit-flex-wrap: wrap-reverse !important;
+ -ms-flex-wrap: wrap-reverse !important;
+ flex-wrap: wrap-reverse !important;
+ }
+ .justify-content-xl-start {
+ -webkit-box-pack: start !important;
+ -webkit-justify-content: flex-start !important;
+ -ms-flex-pack: start !important;
+ justify-content: flex-start !important;
+ }
+ .justify-content-xl-end {
+ -webkit-box-pack: end !important;
+ -webkit-justify-content: flex-end !important;
+ -ms-flex-pack: end !important;
+ justify-content: flex-end !important;
+ }
+ .justify-content-xl-center {
+ -webkit-box-pack: center !important;
+ -webkit-justify-content: center !important;
+ -ms-flex-pack: center !important;
+ justify-content: center !important;
+ }
+ .justify-content-xl-between {
+ -webkit-box-pack: justify !important;
+ -webkit-justify-content: space-between !important;
+ -ms-flex-pack: justify !important;
+ justify-content: space-between !important;
+ }
+ .justify-content-xl-around {
+ -webkit-justify-content: space-around !important;
+ -ms-flex-pack: distribute !important;
+ justify-content: space-around !important;
+ }
+ .align-items-xl-start {
+ -webkit-box-align: start !important;
+ -webkit-align-items: flex-start !important;
+ -ms-flex-align: start !important;
+ align-items: flex-start !important;
+ }
+ .align-items-xl-end {
+ -webkit-box-align: end !important;
+ -webkit-align-items: flex-end !important;
+ -ms-flex-align: end !important;
+ align-items: flex-end !important;
+ }
+ .align-items-xl-center {
+ -webkit-box-align: center !important;
+ -webkit-align-items: center !important;
+ -ms-flex-align: center !important;
+ align-items: center !important;
+ }
+ .align-items-xl-baseline {
+ -webkit-box-align: baseline !important;
+ -webkit-align-items: baseline !important;
+ -ms-flex-align: baseline !important;
+ align-items: baseline !important;
+ }
+ .align-items-xl-stretch {
+ -webkit-box-align: stretch !important;
+ -webkit-align-items: stretch !important;
+ -ms-flex-align: stretch !important;
+ align-items: stretch !important;
+ }
+ .align-content-xl-start {
+ -webkit-align-content: flex-start !important;
+ -ms-flex-line-pack: start !important;
+ align-content: flex-start !important;
+ }
+ .align-content-xl-end {
+ -webkit-align-content: flex-end !important;
+ -ms-flex-line-pack: end !important;
+ align-content: flex-end !important;
+ }
+ .align-content-xl-center {
+ -webkit-align-content: center !important;
+ -ms-flex-line-pack: center !important;
+ align-content: center !important;
+ }
+ .align-content-xl-between {
+ -webkit-align-content: space-between !important;
+ -ms-flex-line-pack: justify !important;
+ align-content: space-between !important;
+ }
+ .align-content-xl-around {
+ -webkit-align-content: space-around !important;
+ -ms-flex-line-pack: distribute !important;
+ align-content: space-around !important;
+ }
+ .align-content-xl-stretch {
+ -webkit-align-content: stretch !important;
+ -ms-flex-line-pack: stretch !important;
+ align-content: stretch !important;
+ }
+ .align-self-xl-auto {
+ -webkit-align-self: auto !important;
+ -ms-flex-item-align: auto !important;
+ -ms-grid-row-align: auto !important;
+ align-self: auto !important;
+ }
+ .align-self-xl-start {
+ -webkit-align-self: flex-start !important;
+ -ms-flex-item-align: start !important;
+ align-self: flex-start !important;
+ }
+ .align-self-xl-end {
+ -webkit-align-self: flex-end !important;
+ -ms-flex-item-align: end !important;
+ align-self: flex-end !important;
+ }
+ .align-self-xl-center {
+ -webkit-align-self: center !important;
+ -ms-flex-item-align: center !important;
+ -ms-grid-row-align: center !important;
+ align-self: center !important;
+ }
+ .align-self-xl-baseline {
+ -webkit-align-self: baseline !important;
+ -ms-flex-item-align: baseline !important;
+ align-self: baseline !important;
+ }
+ .align-self-xl-stretch {
+ -webkit-align-self: stretch !important;
+ -ms-flex-item-align: stretch !important;
+ -ms-grid-row-align: stretch !important;
+ align-self: stretch !important;
}
}
-.visible-print {
- display: none !important;
+
+.float-left {
+ float: left !important;
}
-@media print {
- .visible-print {
- display: block !important;
+
+.float-right {
+ float: right !important;
+}
+
+.float-none {
+ float: none !important;
+}
+
+@media (min-width: 576px) {
+ .float-sm-left {
+ float: left !important;
}
- table.visible-print {
- display: table !important;
+ .float-sm-right {
+ float: right !important;
}
- tr.visible-print {
- display: table-row !important;
+ .float-sm-none {
+ float: none !important;
}
- th.visible-print,
- td.visible-print {
- display: table-cell !important;
+}
+
+@media (min-width: 768px) {
+ .float-md-left {
+ float: left !important;
+ }
+ .float-md-right {
+ float: right !important;
+ }
+ .float-md-none {
+ float: none !important;
}
}
-.visible-print-block {
- display: none !important;
+
+@media (min-width: 992px) {
+ .float-lg-left {
+ float: left !important;
+ }
+ .float-lg-right {
+ float: right !important;
+ }
+ .float-lg-none {
+ float: none !important;
+ }
}
-@media print {
- .visible-print-block {
- display: block !important;
+
+@media (min-width: 1200px) {
+ .float-xl-left {
+ float: left !important;
+ }
+ .float-xl-right {
+ float: right !important;
+ }
+ .float-xl-none {
+ float: none !important;
}
}
-.visible-print-inline {
- display: none !important;
+
+.fixed-top {
+ position: fixed;
+ top: 0;
+ right: 0;
+ left: 0;
+ z-index: 1030;
}
-@media print {
- .visible-print-inline {
- display: inline !important;
+
+.fixed-bottom {
+ position: fixed;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1030;
+}
+
+.sticky-top {
+ position: -webkit-sticky;
+ position: sticky;
+ top: 0;
+ z-index: 1020;
+}
+
+.sr-only {
+ position: absolute;
+ width: 1px;
+ height: 1px;
+ padding: 0;
+ overflow: hidden;
+ clip: rect(0, 0, 0, 0);
+ white-space: nowrap;
+ -webkit-clip-path: inset(50%);
+ clip-path: inset(50%);
+ border: 0;
+}
+
+.sr-only-focusable:active, .sr-only-focusable:focus {
+ position: static;
+ width: auto;
+ height: auto;
+ overflow: visible;
+ clip: auto;
+ white-space: normal;
+ -webkit-clip-path: none;
+ clip-path: none;
+}
+
+.w-25 {
+ width: 25% !important;
+}
+
+.w-50 {
+ width: 50% !important;
+}
+
+.w-75 {
+ width: 75% !important;
+}
+
+.w-100 {
+ width: 100% !important;
+}
+
+.h-25 {
+ height: 25% !important;
+}
+
+.h-50 {
+ height: 50% !important;
+}
+
+.h-75 {
+ height: 75% !important;
+}
+
+.h-100 {
+ height: 100% !important;
+}
+
+.mw-100 {
+ max-width: 100% !important;
+}
+
+.mh-100 {
+ max-height: 100% !important;
+}
+
+.m-0 {
+ margin: 0 !important;
+}
+
+.mt-0 {
+ margin-top: 0 !important;
+}
+
+.mr-0 {
+ margin-right: 0 !important;
+}
+
+.mb-0 {
+ margin-bottom: 0 !important;
+}
+
+.ml-0 {
+ margin-left: 0 !important;
+}
+
+.mx-0 {
+ margin-right: 0 !important;
+ margin-left: 0 !important;
+}
+
+.my-0 {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+}
+
+.m-1 {
+ margin: 0.25rem !important;
+}
+
+.mt-1 {
+ margin-top: 0.25rem !important;
+}
+
+.mr-1 {
+ margin-right: 0.25rem !important;
+}
+
+.mb-1 {
+ margin-bottom: 0.25rem !important;
+}
+
+.ml-1 {
+ margin-left: 0.25rem !important;
+}
+
+.mx-1 {
+ margin-right: 0.25rem !important;
+ margin-left: 0.25rem !important;
+}
+
+.my-1 {
+ margin-top: 0.25rem !important;
+ margin-bottom: 0.25rem !important;
+}
+
+.m-2 {
+ margin: 0.5rem !important;
+}
+
+.mt-2 {
+ margin-top: 0.5rem !important;
+}
+
+.mr-2 {
+ margin-right: 0.5rem !important;
+}
+
+.mb-2 {
+ margin-bottom: 0.5rem !important;
+}
+
+.ml-2 {
+ margin-left: 0.5rem !important;
+}
+
+.mx-2 {
+ margin-right: 0.5rem !important;
+ margin-left: 0.5rem !important;
+}
+
+.my-2 {
+ margin-top: 0.5rem !important;
+ margin-bottom: 0.5rem !important;
+}
+
+.m-3 {
+ margin: 1rem !important;
+}
+
+.mt-3 {
+ margin-top: 1rem !important;
+}
+
+.mr-3 {
+ margin-right: 1rem !important;
+}
+
+.mb-3 {
+ margin-bottom: 1rem !important;
+}
+
+.ml-3 {
+ margin-left: 1rem !important;
+}
+
+.mx-3 {
+ margin-right: 1rem !important;
+ margin-left: 1rem !important;
+}
+
+.my-3 {
+ margin-top: 1rem !important;
+ margin-bottom: 1rem !important;
+}
+
+.m-4 {
+ margin: 1.5rem !important;
+}
+
+.mt-4 {
+ margin-top: 1.5rem !important;
+}
+
+.mr-4 {
+ margin-right: 1.5rem !important;
+}
+
+.mb-4 {
+ margin-bottom: 1.5rem !important;
+}
+
+.ml-4 {
+ margin-left: 1.5rem !important;
+}
+
+.mx-4 {
+ margin-right: 1.5rem !important;
+ margin-left: 1.5rem !important;
+}
+
+.my-4 {
+ margin-top: 1.5rem !important;
+ margin-bottom: 1.5rem !important;
+}
+
+.m-5 {
+ margin: 3rem !important;
+}
+
+.mt-5 {
+ margin-top: 3rem !important;
+}
+
+.mr-5 {
+ margin-right: 3rem !important;
+}
+
+.mb-5 {
+ margin-bottom: 3rem !important;
+}
+
+.ml-5 {
+ margin-left: 3rem !important;
+}
+
+.mx-5 {
+ margin-right: 3rem !important;
+ margin-left: 3rem !important;
+}
+
+.my-5 {
+ margin-top: 3rem !important;
+ margin-bottom: 3rem !important;
+}
+
+.p-0 {
+ padding: 0 !important;
+}
+
+.pt-0 {
+ padding-top: 0 !important;
+}
+
+.pr-0 {
+ padding-right: 0 !important;
+}
+
+.pb-0 {
+ padding-bottom: 0 !important;
+}
+
+.pl-0 {
+ padding-left: 0 !important;
+}
+
+.px-0 {
+ padding-right: 0 !important;
+ padding-left: 0 !important;
+}
+
+.py-0 {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+}
+
+.p-1 {
+ padding: 0.25rem !important;
+}
+
+.pt-1 {
+ padding-top: 0.25rem !important;
+}
+
+.pr-1 {
+ padding-right: 0.25rem !important;
+}
+
+.pb-1 {
+ padding-bottom: 0.25rem !important;
+}
+
+.pl-1 {
+ padding-left: 0.25rem !important;
+}
+
+.px-1 {
+ padding-right: 0.25rem !important;
+ padding-left: 0.25rem !important;
+}
+
+.py-1 {
+ padding-top: 0.25rem !important;
+ padding-bottom: 0.25rem !important;
+}
+
+.p-2 {
+ padding: 0.5rem !important;
+}
+
+.pt-2 {
+ padding-top: 0.5rem !important;
+}
+
+.pr-2 {
+ padding-right: 0.5rem !important;
+}
+
+.pb-2 {
+ padding-bottom: 0.5rem !important;
+}
+
+.pl-2 {
+ padding-left: 0.5rem !important;
+}
+
+.px-2 {
+ padding-right: 0.5rem !important;
+ padding-left: 0.5rem !important;
+}
+
+.py-2 {
+ padding-top: 0.5rem !important;
+ padding-bottom: 0.5rem !important;
+}
+
+.p-3 {
+ padding: 1rem !important;
+}
+
+.pt-3 {
+ padding-top: 1rem !important;
+}
+
+.pr-3 {
+ padding-right: 1rem !important;
+}
+
+.pb-3 {
+ padding-bottom: 1rem !important;
+}
+
+.pl-3 {
+ padding-left: 1rem !important;
+}
+
+.px-3 {
+ padding-right: 1rem !important;
+ padding-left: 1rem !important;
+}
+
+.py-3 {
+ padding-top: 1rem !important;
+ padding-bottom: 1rem !important;
+}
+
+.p-4 {
+ padding: 1.5rem !important;
+}
+
+.pt-4 {
+ padding-top: 1.5rem !important;
+}
+
+.pr-4 {
+ padding-right: 1.5rem !important;
+}
+
+.pb-4 {
+ padding-bottom: 1.5rem !important;
+}
+
+.pl-4 {
+ padding-left: 1.5rem !important;
+}
+
+.px-4 {
+ padding-right: 1.5rem !important;
+ padding-left: 1.5rem !important;
+}
+
+.py-4 {
+ padding-top: 1.5rem !important;
+ padding-bottom: 1.5rem !important;
+}
+
+.p-5 {
+ padding: 3rem !important;
+}
+
+.pt-5 {
+ padding-top: 3rem !important;
+}
+
+.pr-5 {
+ padding-right: 3rem !important;
+}
+
+.pb-5 {
+ padding-bottom: 3rem !important;
+}
+
+.pl-5 {
+ padding-left: 3rem !important;
+}
+
+.px-5 {
+ padding-right: 3rem !important;
+ padding-left: 3rem !important;
+}
+
+.py-5 {
+ padding-top: 3rem !important;
+ padding-bottom: 3rem !important;
+}
+
+.m-auto {
+ margin: auto !important;
+}
+
+.mt-auto {
+ margin-top: auto !important;
+}
+
+.mr-auto {
+ margin-right: auto !important;
+}
+
+.mb-auto {
+ margin-bottom: auto !important;
+}
+
+.ml-auto {
+ margin-left: auto !important;
+}
+
+.mx-auto {
+ margin-right: auto !important;
+ margin-left: auto !important;
+}
+
+.my-auto {
+ margin-top: auto !important;
+ margin-bottom: auto !important;
+}
+
+@media (min-width: 576px) {
+ .m-sm-0 {
+ margin: 0 !important;
+ }
+ .mt-sm-0 {
+ margin-top: 0 !important;
+ }
+ .mr-sm-0 {
+ margin-right: 0 !important;
+ }
+ .mb-sm-0 {
+ margin-bottom: 0 !important;
+ }
+ .ml-sm-0 {
+ margin-left: 0 !important;
+ }
+ .mx-sm-0 {
+ margin-right: 0 !important;
+ margin-left: 0 !important;
+ }
+ .my-sm-0 {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+ }
+ .m-sm-1 {
+ margin: 0.25rem !important;
+ }
+ .mt-sm-1 {
+ margin-top: 0.25rem !important;
+ }
+ .mr-sm-1 {
+ margin-right: 0.25rem !important;
+ }
+ .mb-sm-1 {
+ margin-bottom: 0.25rem !important;
+ }
+ .ml-sm-1 {
+ margin-left: 0.25rem !important;
+ }
+ .mx-sm-1 {
+ margin-right: 0.25rem !important;
+ margin-left: 0.25rem !important;
+ }
+ .my-sm-1 {
+ margin-top: 0.25rem !important;
+ margin-bottom: 0.25rem !important;
+ }
+ .m-sm-2 {
+ margin: 0.5rem !important;
+ }
+ .mt-sm-2 {
+ margin-top: 0.5rem !important;
+ }
+ .mr-sm-2 {
+ margin-right: 0.5rem !important;
+ }
+ .mb-sm-2 {
+ margin-bottom: 0.5rem !important;
+ }
+ .ml-sm-2 {
+ margin-left: 0.5rem !important;
+ }
+ .mx-sm-2 {
+ margin-right: 0.5rem !important;
+ margin-left: 0.5rem !important;
+ }
+ .my-sm-2 {
+ margin-top: 0.5rem !important;
+ margin-bottom: 0.5rem !important;
+ }
+ .m-sm-3 {
+ margin: 1rem !important;
+ }
+ .mt-sm-3 {
+ margin-top: 1rem !important;
+ }
+ .mr-sm-3 {
+ margin-right: 1rem !important;
+ }
+ .mb-sm-3 {
+ margin-bottom: 1rem !important;
+ }
+ .ml-sm-3 {
+ margin-left: 1rem !important;
+ }
+ .mx-sm-3 {
+ margin-right: 1rem !important;
+ margin-left: 1rem !important;
+ }
+ .my-sm-3 {
+ margin-top: 1rem !important;
+ margin-bottom: 1rem !important;
+ }
+ .m-sm-4 {
+ margin: 1.5rem !important;
+ }
+ .mt-sm-4 {
+ margin-top: 1.5rem !important;
+ }
+ .mr-sm-4 {
+ margin-right: 1.5rem !important;
+ }
+ .mb-sm-4 {
+ margin-bottom: 1.5rem !important;
+ }
+ .ml-sm-4 {
+ margin-left: 1.5rem !important;
+ }
+ .mx-sm-4 {
+ margin-right: 1.5rem !important;
+ margin-left: 1.5rem !important;
+ }
+ .my-sm-4 {
+ margin-top: 1.5rem !important;
+ margin-bottom: 1.5rem !important;
+ }
+ .m-sm-5 {
+ margin: 3rem !important;
+ }
+ .mt-sm-5 {
+ margin-top: 3rem !important;
+ }
+ .mr-sm-5 {
+ margin-right: 3rem !important;
+ }
+ .mb-sm-5 {
+ margin-bottom: 3rem !important;
+ }
+ .ml-sm-5 {
+ margin-left: 3rem !important;
+ }
+ .mx-sm-5 {
+ margin-right: 3rem !important;
+ margin-left: 3rem !important;
+ }
+ .my-sm-5 {
+ margin-top: 3rem !important;
+ margin-bottom: 3rem !important;
+ }
+ .p-sm-0 {
+ padding: 0 !important;
+ }
+ .pt-sm-0 {
+ padding-top: 0 !important;
+ }
+ .pr-sm-0 {
+ padding-right: 0 !important;
+ }
+ .pb-sm-0 {
+ padding-bottom: 0 !important;
+ }
+ .pl-sm-0 {
+ padding-left: 0 !important;
+ }
+ .px-sm-0 {
+ padding-right: 0 !important;
+ padding-left: 0 !important;
+ }
+ .py-sm-0 {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+ }
+ .p-sm-1 {
+ padding: 0.25rem !important;
+ }
+ .pt-sm-1 {
+ padding-top: 0.25rem !important;
+ }
+ .pr-sm-1 {
+ padding-right: 0.25rem !important;
+ }
+ .pb-sm-1 {
+ padding-bottom: 0.25rem !important;
+ }
+ .pl-sm-1 {
+ padding-left: 0.25rem !important;
+ }
+ .px-sm-1 {
+ padding-right: 0.25rem !important;
+ padding-left: 0.25rem !important;
+ }
+ .py-sm-1 {
+ padding-top: 0.25rem !important;
+ padding-bottom: 0.25rem !important;
+ }
+ .p-sm-2 {
+ padding: 0.5rem !important;
+ }
+ .pt-sm-2 {
+ padding-top: 0.5rem !important;
+ }
+ .pr-sm-2 {
+ padding-right: 0.5rem !important;
+ }
+ .pb-sm-2 {
+ padding-bottom: 0.5rem !important;
+ }
+ .pl-sm-2 {
+ padding-left: 0.5rem !important;
+ }
+ .px-sm-2 {
+ padding-right: 0.5rem !important;
+ padding-left: 0.5rem !important;
+ }
+ .py-sm-2 {
+ padding-top: 0.5rem !important;
+ padding-bottom: 0.5rem !important;
+ }
+ .p-sm-3 {
+ padding: 1rem !important;
+ }
+ .pt-sm-3 {
+ padding-top: 1rem !important;
+ }
+ .pr-sm-3 {
+ padding-right: 1rem !important;
+ }
+ .pb-sm-3 {
+ padding-bottom: 1rem !important;
+ }
+ .pl-sm-3 {
+ padding-left: 1rem !important;
+ }
+ .px-sm-3 {
+ padding-right: 1rem !important;
+ padding-left: 1rem !important;
+ }
+ .py-sm-3 {
+ padding-top: 1rem !important;
+ padding-bottom: 1rem !important;
+ }
+ .p-sm-4 {
+ padding: 1.5rem !important;
+ }
+ .pt-sm-4 {
+ padding-top: 1.5rem !important;
+ }
+ .pr-sm-4 {
+ padding-right: 1.5rem !important;
+ }
+ .pb-sm-4 {
+ padding-bottom: 1.5rem !important;
+ }
+ .pl-sm-4 {
+ padding-left: 1.5rem !important;
+ }
+ .px-sm-4 {
+ padding-right: 1.5rem !important;
+ padding-left: 1.5rem !important;
+ }
+ .py-sm-4 {
+ padding-top: 1.5rem !important;
+ padding-bottom: 1.5rem !important;
+ }
+ .p-sm-5 {
+ padding: 3rem !important;
+ }
+ .pt-sm-5 {
+ padding-top: 3rem !important;
+ }
+ .pr-sm-5 {
+ padding-right: 3rem !important;
+ }
+ .pb-sm-5 {
+ padding-bottom: 3rem !important;
+ }
+ .pl-sm-5 {
+ padding-left: 3rem !important;
+ }
+ .px-sm-5 {
+ padding-right: 3rem !important;
+ padding-left: 3rem !important;
+ }
+ .py-sm-5 {
+ padding-top: 3rem !important;
+ padding-bottom: 3rem !important;
+ }
+ .m-sm-auto {
+ margin: auto !important;
+ }
+ .mt-sm-auto {
+ margin-top: auto !important;
+ }
+ .mr-sm-auto {
+ margin-right: auto !important;
+ }
+ .mb-sm-auto {
+ margin-bottom: auto !important;
+ }
+ .ml-sm-auto {
+ margin-left: auto !important;
+ }
+ .mx-sm-auto {
+ margin-right: auto !important;
+ margin-left: auto !important;
+ }
+ .my-sm-auto {
+ margin-top: auto !important;
+ margin-bottom: auto !important;
}
}
-.visible-print-inline-block {
- display: none !important;
+
+@media (min-width: 768px) {
+ .m-md-0 {
+ margin: 0 !important;
+ }
+ .mt-md-0 {
+ margin-top: 0 !important;
+ }
+ .mr-md-0 {
+ margin-right: 0 !important;
+ }
+ .mb-md-0 {
+ margin-bottom: 0 !important;
+ }
+ .ml-md-0 {
+ margin-left: 0 !important;
+ }
+ .mx-md-0 {
+ margin-right: 0 !important;
+ margin-left: 0 !important;
+ }
+ .my-md-0 {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+ }
+ .m-md-1 {
+ margin: 0.25rem !important;
+ }
+ .mt-md-1 {
+ margin-top: 0.25rem !important;
+ }
+ .mr-md-1 {
+ margin-right: 0.25rem !important;
+ }
+ .mb-md-1 {
+ margin-bottom: 0.25rem !important;
+ }
+ .ml-md-1 {
+ margin-left: 0.25rem !important;
+ }
+ .mx-md-1 {
+ margin-right: 0.25rem !important;
+ margin-left: 0.25rem !important;
+ }
+ .my-md-1 {
+ margin-top: 0.25rem !important;
+ margin-bottom: 0.25rem !important;
+ }
+ .m-md-2 {
+ margin: 0.5rem !important;
+ }
+ .mt-md-2 {
+ margin-top: 0.5rem !important;
+ }
+ .mr-md-2 {
+ margin-right: 0.5rem !important;
+ }
+ .mb-md-2 {
+ margin-bottom: 0.5rem !important;
+ }
+ .ml-md-2 {
+ margin-left: 0.5rem !important;
+ }
+ .mx-md-2 {
+ margin-right: 0.5rem !important;
+ margin-left: 0.5rem !important;
+ }
+ .my-md-2 {
+ margin-top: 0.5rem !important;
+ margin-bottom: 0.5rem !important;
+ }
+ .m-md-3 {
+ margin: 1rem !important;
+ }
+ .mt-md-3 {
+ margin-top: 1rem !important;
+ }
+ .mr-md-3 {
+ margin-right: 1rem !important;
+ }
+ .mb-md-3 {
+ margin-bottom: 1rem !important;
+ }
+ .ml-md-3 {
+ margin-left: 1rem !important;
+ }
+ .mx-md-3 {
+ margin-right: 1rem !important;
+ margin-left: 1rem !important;
+ }
+ .my-md-3 {
+ margin-top: 1rem !important;
+ margin-bottom: 1rem !important;
+ }
+ .m-md-4 {
+ margin: 1.5rem !important;
+ }
+ .mt-md-4 {
+ margin-top: 1.5rem !important;
+ }
+ .mr-md-4 {
+ margin-right: 1.5rem !important;
+ }
+ .mb-md-4 {
+ margin-bottom: 1.5rem !important;
+ }
+ .ml-md-4 {
+ margin-left: 1.5rem !important;
+ }
+ .mx-md-4 {
+ margin-right: 1.5rem !important;
+ margin-left: 1.5rem !important;
+ }
+ .my-md-4 {
+ margin-top: 1.5rem !important;
+ margin-bottom: 1.5rem !important;
+ }
+ .m-md-5 {
+ margin: 3rem !important;
+ }
+ .mt-md-5 {
+ margin-top: 3rem !important;
+ }
+ .mr-md-5 {
+ margin-right: 3rem !important;
+ }
+ .mb-md-5 {
+ margin-bottom: 3rem !important;
+ }
+ .ml-md-5 {
+ margin-left: 3rem !important;
+ }
+ .mx-md-5 {
+ margin-right: 3rem !important;
+ margin-left: 3rem !important;
+ }
+ .my-md-5 {
+ margin-top: 3rem !important;
+ margin-bottom: 3rem !important;
+ }
+ .p-md-0 {
+ padding: 0 !important;
+ }
+ .pt-md-0 {
+ padding-top: 0 !important;
+ }
+ .pr-md-0 {
+ padding-right: 0 !important;
+ }
+ .pb-md-0 {
+ padding-bottom: 0 !important;
+ }
+ .pl-md-0 {
+ padding-left: 0 !important;
+ }
+ .px-md-0 {
+ padding-right: 0 !important;
+ padding-left: 0 !important;
+ }
+ .py-md-0 {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+ }
+ .p-md-1 {
+ padding: 0.25rem !important;
+ }
+ .pt-md-1 {
+ padding-top: 0.25rem !important;
+ }
+ .pr-md-1 {
+ padding-right: 0.25rem !important;
+ }
+ .pb-md-1 {
+ padding-bottom: 0.25rem !important;
+ }
+ .pl-md-1 {
+ padding-left: 0.25rem !important;
+ }
+ .px-md-1 {
+ padding-right: 0.25rem !important;
+ padding-left: 0.25rem !important;
+ }
+ .py-md-1 {
+ padding-top: 0.25rem !important;
+ padding-bottom: 0.25rem !important;
+ }
+ .p-md-2 {
+ padding: 0.5rem !important;
+ }
+ .pt-md-2 {
+ padding-top: 0.5rem !important;
+ }
+ .pr-md-2 {
+ padding-right: 0.5rem !important;
+ }
+ .pb-md-2 {
+ padding-bottom: 0.5rem !important;
+ }
+ .pl-md-2 {
+ padding-left: 0.5rem !important;
+ }
+ .px-md-2 {
+ padding-right: 0.5rem !important;
+ padding-left: 0.5rem !important;
+ }
+ .py-md-2 {
+ padding-top: 0.5rem !important;
+ padding-bottom: 0.5rem !important;
+ }
+ .p-md-3 {
+ padding: 1rem !important;
+ }
+ .pt-md-3 {
+ padding-top: 1rem !important;
+ }
+ .pr-md-3 {
+ padding-right: 1rem !important;
+ }
+ .pb-md-3 {
+ padding-bottom: 1rem !important;
+ }
+ .pl-md-3 {
+ padding-left: 1rem !important;
+ }
+ .px-md-3 {
+ padding-right: 1rem !important;
+ padding-left: 1rem !important;
+ }
+ .py-md-3 {
+ padding-top: 1rem !important;
+ padding-bottom: 1rem !important;
+ }
+ .p-md-4 {
+ padding: 1.5rem !important;
+ }
+ .pt-md-4 {
+ padding-top: 1.5rem !important;
+ }
+ .pr-md-4 {
+ padding-right: 1.5rem !important;
+ }
+ .pb-md-4 {
+ padding-bottom: 1.5rem !important;
+ }
+ .pl-md-4 {
+ padding-left: 1.5rem !important;
+ }
+ .px-md-4 {
+ padding-right: 1.5rem !important;
+ padding-left: 1.5rem !important;
+ }
+ .py-md-4 {
+ padding-top: 1.5rem !important;
+ padding-bottom: 1.5rem !important;
+ }
+ .p-md-5 {
+ padding: 3rem !important;
+ }
+ .pt-md-5 {
+ padding-top: 3rem !important;
+ }
+ .pr-md-5 {
+ padding-right: 3rem !important;
+ }
+ .pb-md-5 {
+ padding-bottom: 3rem !important;
+ }
+ .pl-md-5 {
+ padding-left: 3rem !important;
+ }
+ .px-md-5 {
+ padding-right: 3rem !important;
+ padding-left: 3rem !important;
+ }
+ .py-md-5 {
+ padding-top: 3rem !important;
+ padding-bottom: 3rem !important;
+ }
+ .m-md-auto {
+ margin: auto !important;
+ }
+ .mt-md-auto {
+ margin-top: auto !important;
+ }
+ .mr-md-auto {
+ margin-right: auto !important;
+ }
+ .mb-md-auto {
+ margin-bottom: auto !important;
+ }
+ .ml-md-auto {
+ margin-left: auto !important;
+ }
+ .mx-md-auto {
+ margin-right: auto !important;
+ margin-left: auto !important;
+ }
+ .my-md-auto {
+ margin-top: auto !important;
+ margin-bottom: auto !important;
+ }
}
-@media print {
- .visible-print-inline-block {
- display: inline-block !important;
+
+@media (min-width: 992px) {
+ .m-lg-0 {
+ margin: 0 !important;
+ }
+ .mt-lg-0 {
+ margin-top: 0 !important;
+ }
+ .mr-lg-0 {
+ margin-right: 0 !important;
+ }
+ .mb-lg-0 {
+ margin-bottom: 0 !important;
+ }
+ .ml-lg-0 {
+ margin-left: 0 !important;
+ }
+ .mx-lg-0 {
+ margin-right: 0 !important;
+ margin-left: 0 !important;
+ }
+ .my-lg-0 {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+ }
+ .m-lg-1 {
+ margin: 0.25rem !important;
+ }
+ .mt-lg-1 {
+ margin-top: 0.25rem !important;
+ }
+ .mr-lg-1 {
+ margin-right: 0.25rem !important;
+ }
+ .mb-lg-1 {
+ margin-bottom: 0.25rem !important;
+ }
+ .ml-lg-1 {
+ margin-left: 0.25rem !important;
+ }
+ .mx-lg-1 {
+ margin-right: 0.25rem !important;
+ margin-left: 0.25rem !important;
+ }
+ .my-lg-1 {
+ margin-top: 0.25rem !important;
+ margin-bottom: 0.25rem !important;
+ }
+ .m-lg-2 {
+ margin: 0.5rem !important;
+ }
+ .mt-lg-2 {
+ margin-top: 0.5rem !important;
+ }
+ .mr-lg-2 {
+ margin-right: 0.5rem !important;
+ }
+ .mb-lg-2 {
+ margin-bottom: 0.5rem !important;
+ }
+ .ml-lg-2 {
+ margin-left: 0.5rem !important;
+ }
+ .mx-lg-2 {
+ margin-right: 0.5rem !important;
+ margin-left: 0.5rem !important;
+ }
+ .my-lg-2 {
+ margin-top: 0.5rem !important;
+ margin-bottom: 0.5rem !important;
+ }
+ .m-lg-3 {
+ margin: 1rem !important;
+ }
+ .mt-lg-3 {
+ margin-top: 1rem !important;
+ }
+ .mr-lg-3 {
+ margin-right: 1rem !important;
+ }
+ .mb-lg-3 {
+ margin-bottom: 1rem !important;
+ }
+ .ml-lg-3 {
+ margin-left: 1rem !important;
+ }
+ .mx-lg-3 {
+ margin-right: 1rem !important;
+ margin-left: 1rem !important;
+ }
+ .my-lg-3 {
+ margin-top: 1rem !important;
+ margin-bottom: 1rem !important;
+ }
+ .m-lg-4 {
+ margin: 1.5rem !important;
+ }
+ .mt-lg-4 {
+ margin-top: 1.5rem !important;
+ }
+ .mr-lg-4 {
+ margin-right: 1.5rem !important;
+ }
+ .mb-lg-4 {
+ margin-bottom: 1.5rem !important;
+ }
+ .ml-lg-4 {
+ margin-left: 1.5rem !important;
+ }
+ .mx-lg-4 {
+ margin-right: 1.5rem !important;
+ margin-left: 1.5rem !important;
+ }
+ .my-lg-4 {
+ margin-top: 1.5rem !important;
+ margin-bottom: 1.5rem !important;
+ }
+ .m-lg-5 {
+ margin: 3rem !important;
+ }
+ .mt-lg-5 {
+ margin-top: 3rem !important;
+ }
+ .mr-lg-5 {
+ margin-right: 3rem !important;
+ }
+ .mb-lg-5 {
+ margin-bottom: 3rem !important;
+ }
+ .ml-lg-5 {
+ margin-left: 3rem !important;
+ }
+ .mx-lg-5 {
+ margin-right: 3rem !important;
+ margin-left: 3rem !important;
+ }
+ .my-lg-5 {
+ margin-top: 3rem !important;
+ margin-bottom: 3rem !important;
+ }
+ .p-lg-0 {
+ padding: 0 !important;
+ }
+ .pt-lg-0 {
+ padding-top: 0 !important;
+ }
+ .pr-lg-0 {
+ padding-right: 0 !important;
+ }
+ .pb-lg-0 {
+ padding-bottom: 0 !important;
+ }
+ .pl-lg-0 {
+ padding-left: 0 !important;
+ }
+ .px-lg-0 {
+ padding-right: 0 !important;
+ padding-left: 0 !important;
+ }
+ .py-lg-0 {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+ }
+ .p-lg-1 {
+ padding: 0.25rem !important;
+ }
+ .pt-lg-1 {
+ padding-top: 0.25rem !important;
+ }
+ .pr-lg-1 {
+ padding-right: 0.25rem !important;
+ }
+ .pb-lg-1 {
+ padding-bottom: 0.25rem !important;
+ }
+ .pl-lg-1 {
+ padding-left: 0.25rem !important;
+ }
+ .px-lg-1 {
+ padding-right: 0.25rem !important;
+ padding-left: 0.25rem !important;
+ }
+ .py-lg-1 {
+ padding-top: 0.25rem !important;
+ padding-bottom: 0.25rem !important;
+ }
+ .p-lg-2 {
+ padding: 0.5rem !important;
+ }
+ .pt-lg-2 {
+ padding-top: 0.5rem !important;
+ }
+ .pr-lg-2 {
+ padding-right: 0.5rem !important;
+ }
+ .pb-lg-2 {
+ padding-bottom: 0.5rem !important;
+ }
+ .pl-lg-2 {
+ padding-left: 0.5rem !important;
+ }
+ .px-lg-2 {
+ padding-right: 0.5rem !important;
+ padding-left: 0.5rem !important;
+ }
+ .py-lg-2 {
+ padding-top: 0.5rem !important;
+ padding-bottom: 0.5rem !important;
+ }
+ .p-lg-3 {
+ padding: 1rem !important;
+ }
+ .pt-lg-3 {
+ padding-top: 1rem !important;
+ }
+ .pr-lg-3 {
+ padding-right: 1rem !important;
+ }
+ .pb-lg-3 {
+ padding-bottom: 1rem !important;
+ }
+ .pl-lg-3 {
+ padding-left: 1rem !important;
+ }
+ .px-lg-3 {
+ padding-right: 1rem !important;
+ padding-left: 1rem !important;
+ }
+ .py-lg-3 {
+ padding-top: 1rem !important;
+ padding-bottom: 1rem !important;
+ }
+ .p-lg-4 {
+ padding: 1.5rem !important;
+ }
+ .pt-lg-4 {
+ padding-top: 1.5rem !important;
+ }
+ .pr-lg-4 {
+ padding-right: 1.5rem !important;
+ }
+ .pb-lg-4 {
+ padding-bottom: 1.5rem !important;
+ }
+ .pl-lg-4 {
+ padding-left: 1.5rem !important;
+ }
+ .px-lg-4 {
+ padding-right: 1.5rem !important;
+ padding-left: 1.5rem !important;
+ }
+ .py-lg-4 {
+ padding-top: 1.5rem !important;
+ padding-bottom: 1.5rem !important;
+ }
+ .p-lg-5 {
+ padding: 3rem !important;
+ }
+ .pt-lg-5 {
+ padding-top: 3rem !important;
+ }
+ .pr-lg-5 {
+ padding-right: 3rem !important;
+ }
+ .pb-lg-5 {
+ padding-bottom: 3rem !important;
+ }
+ .pl-lg-5 {
+ padding-left: 3rem !important;
+ }
+ .px-lg-5 {
+ padding-right: 3rem !important;
+ padding-left: 3rem !important;
+ }
+ .py-lg-5 {
+ padding-top: 3rem !important;
+ padding-bottom: 3rem !important;
+ }
+ .m-lg-auto {
+ margin: auto !important;
+ }
+ .mt-lg-auto {
+ margin-top: auto !important;
+ }
+ .mr-lg-auto {
+ margin-right: auto !important;
+ }
+ .mb-lg-auto {
+ margin-bottom: auto !important;
+ }
+ .ml-lg-auto {
+ margin-left: auto !important;
+ }
+ .mx-lg-auto {
+ margin-right: auto !important;
+ margin-left: auto !important;
+ }
+ .my-lg-auto {
+ margin-top: auto !important;
+ margin-bottom: auto !important;
}
}
-@media print {
- .hidden-print {
- display: none !important;
+
+@media (min-width: 1200px) {
+ .m-xl-0 {
+ margin: 0 !important;
+ }
+ .mt-xl-0 {
+ margin-top: 0 !important;
+ }
+ .mr-xl-0 {
+ margin-right: 0 !important;
+ }
+ .mb-xl-0 {
+ margin-bottom: 0 !important;
+ }
+ .ml-xl-0 {
+ margin-left: 0 !important;
+ }
+ .mx-xl-0 {
+ margin-right: 0 !important;
+ margin-left: 0 !important;
+ }
+ .my-xl-0 {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+ }
+ .m-xl-1 {
+ margin: 0.25rem !important;
+ }
+ .mt-xl-1 {
+ margin-top: 0.25rem !important;
+ }
+ .mr-xl-1 {
+ margin-right: 0.25rem !important;
+ }
+ .mb-xl-1 {
+ margin-bottom: 0.25rem !important;
+ }
+ .ml-xl-1 {
+ margin-left: 0.25rem !important;
+ }
+ .mx-xl-1 {
+ margin-right: 0.25rem !important;
+ margin-left: 0.25rem !important;
+ }
+ .my-xl-1 {
+ margin-top: 0.25rem !important;
+ margin-bottom: 0.25rem !important;
+ }
+ .m-xl-2 {
+ margin: 0.5rem !important;
+ }
+ .mt-xl-2 {
+ margin-top: 0.5rem !important;
+ }
+ .mr-xl-2 {
+ margin-right: 0.5rem !important;
+ }
+ .mb-xl-2 {
+ margin-bottom: 0.5rem !important;
+ }
+ .ml-xl-2 {
+ margin-left: 0.5rem !important;
+ }
+ .mx-xl-2 {
+ margin-right: 0.5rem !important;
+ margin-left: 0.5rem !important;
+ }
+ .my-xl-2 {
+ margin-top: 0.5rem !important;
+ margin-bottom: 0.5rem !important;
+ }
+ .m-xl-3 {
+ margin: 1rem !important;
+ }
+ .mt-xl-3 {
+ margin-top: 1rem !important;
+ }
+ .mr-xl-3 {
+ margin-right: 1rem !important;
+ }
+ .mb-xl-3 {
+ margin-bottom: 1rem !important;
+ }
+ .ml-xl-3 {
+ margin-left: 1rem !important;
+ }
+ .mx-xl-3 {
+ margin-right: 1rem !important;
+ margin-left: 1rem !important;
+ }
+ .my-xl-3 {
+ margin-top: 1rem !important;
+ margin-bottom: 1rem !important;
+ }
+ .m-xl-4 {
+ margin: 1.5rem !important;
+ }
+ .mt-xl-4 {
+ margin-top: 1.5rem !important;
+ }
+ .mr-xl-4 {
+ margin-right: 1.5rem !important;
+ }
+ .mb-xl-4 {
+ margin-bottom: 1.5rem !important;
+ }
+ .ml-xl-4 {
+ margin-left: 1.5rem !important;
+ }
+ .mx-xl-4 {
+ margin-right: 1.5rem !important;
+ margin-left: 1.5rem !important;
+ }
+ .my-xl-4 {
+ margin-top: 1.5rem !important;
+ margin-bottom: 1.5rem !important;
+ }
+ .m-xl-5 {
+ margin: 3rem !important;
+ }
+ .mt-xl-5 {
+ margin-top: 3rem !important;
+ }
+ .mr-xl-5 {
+ margin-right: 3rem !important;
+ }
+ .mb-xl-5 {
+ margin-bottom: 3rem !important;
+ }
+ .ml-xl-5 {
+ margin-left: 3rem !important;
+ }
+ .mx-xl-5 {
+ margin-right: 3rem !important;
+ margin-left: 3rem !important;
+ }
+ .my-xl-5 {
+ margin-top: 3rem !important;
+ margin-bottom: 3rem !important;
+ }
+ .p-xl-0 {
+ padding: 0 !important;
+ }
+ .pt-xl-0 {
+ padding-top: 0 !important;
+ }
+ .pr-xl-0 {
+ padding-right: 0 !important;
+ }
+ .pb-xl-0 {
+ padding-bottom: 0 !important;
+ }
+ .pl-xl-0 {
+ padding-left: 0 !important;
+ }
+ .px-xl-0 {
+ padding-right: 0 !important;
+ padding-left: 0 !important;
+ }
+ .py-xl-0 {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+ }
+ .p-xl-1 {
+ padding: 0.25rem !important;
+ }
+ .pt-xl-1 {
+ padding-top: 0.25rem !important;
+ }
+ .pr-xl-1 {
+ padding-right: 0.25rem !important;
+ }
+ .pb-xl-1 {
+ padding-bottom: 0.25rem !important;
+ }
+ .pl-xl-1 {
+ padding-left: 0.25rem !important;
+ }
+ .px-xl-1 {
+ padding-right: 0.25rem !important;
+ padding-left: 0.25rem !important;
+ }
+ .py-xl-1 {
+ padding-top: 0.25rem !important;
+ padding-bottom: 0.25rem !important;
+ }
+ .p-xl-2 {
+ padding: 0.5rem !important;
+ }
+ .pt-xl-2 {
+ padding-top: 0.5rem !important;
+ }
+ .pr-xl-2 {
+ padding-right: 0.5rem !important;
+ }
+ .pb-xl-2 {
+ padding-bottom: 0.5rem !important;
+ }
+ .pl-xl-2 {
+ padding-left: 0.5rem !important;
+ }
+ .px-xl-2 {
+ padding-right: 0.5rem !important;
+ padding-left: 0.5rem !important;
+ }
+ .py-xl-2 {
+ padding-top: 0.5rem !important;
+ padding-bottom: 0.5rem !important;
+ }
+ .p-xl-3 {
+ padding: 1rem !important;
+ }
+ .pt-xl-3 {
+ padding-top: 1rem !important;
+ }
+ .pr-xl-3 {
+ padding-right: 1rem !important;
+ }
+ .pb-xl-3 {
+ padding-bottom: 1rem !important;
+ }
+ .pl-xl-3 {
+ padding-left: 1rem !important;
+ }
+ .px-xl-3 {
+ padding-right: 1rem !important;
+ padding-left: 1rem !important;
+ }
+ .py-xl-3 {
+ padding-top: 1rem !important;
+ padding-bottom: 1rem !important;
}
+ .p-xl-4 {
+ padding: 1.5rem !important;
+ }
+ .pt-xl-4 {
+ padding-top: 1.5rem !important;
+ }
+ .pr-xl-4 {
+ padding-right: 1.5rem !important;
+ }
+ .pb-xl-4 {
+ padding-bottom: 1.5rem !important;
+ }
+ .pl-xl-4 {
+ padding-left: 1.5rem !important;
+ }
+ .px-xl-4 {
+ padding-right: 1.5rem !important;
+ padding-left: 1.5rem !important;
+ }
+ .py-xl-4 {
+ padding-top: 1.5rem !important;
+ padding-bottom: 1.5rem !important;
+ }
+ .p-xl-5 {
+ padding: 3rem !important;
+ }
+ .pt-xl-5 {
+ padding-top: 3rem !important;
+ }
+ .pr-xl-5 {
+ padding-right: 3rem !important;
+ }
+ .pb-xl-5 {
+ padding-bottom: 3rem !important;
+ }
+ .pl-xl-5 {
+ padding-left: 3rem !important;
+ }
+ .px-xl-5 {
+ padding-right: 3rem !important;
+ padding-left: 3rem !important;
+ }
+ .py-xl-5 {
+ padding-top: 3rem !important;
+ padding-bottom: 3rem !important;
+ }
+ .m-xl-auto {
+ margin: auto !important;
+ }
+ .mt-xl-auto {
+ margin-top: auto !important;
+ }
+ .mr-xl-auto {
+ margin-right: auto !important;
+ }
+ .mb-xl-auto {
+ margin-bottom: auto !important;
+ }
+ .ml-xl-auto {
+ margin-left: auto !important;
+ }
+ .mx-xl-auto {
+ margin-right: auto !important;
+ margin-left: auto !important;
+ }
+ .my-xl-auto {
+ margin-top: auto !important;
+ margin-bottom: auto !important;
+ }
+}
+
+.text-justify {
+ text-align: justify !important;
+}
+
+.text-nowrap {
+ white-space: nowrap !important;
+}
+
+.text-truncate {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.text-left {
+ text-align: left !important;
+}
+
+.text-right {
+ text-align: right !important;
+}
+
+.text-center {
+ text-align: center !important;
+}
+
+@media (min-width: 576px) {
+ .text-sm-left {
+ text-align: left !important;
+ }
+ .text-sm-right {
+ text-align: right !important;
+ }
+ .text-sm-center {
+ text-align: center !important;
+ }
+}
+
+@media (min-width: 768px) {
+ .text-md-left {
+ text-align: left !important;
+ }
+ .text-md-right {
+ text-align: right !important;
+ }
+ .text-md-center {
+ text-align: center !important;
+ }
+}
+
+@media (min-width: 992px) {
+ .text-lg-left {
+ text-align: left !important;
+ }
+ .text-lg-right {
+ text-align: right !important;
+ }
+ .text-lg-center {
+ text-align: center !important;
+ }
+}
+
+@media (min-width: 1200px) {
+ .text-xl-left {
+ text-align: left !important;
+ }
+ .text-xl-right {
+ text-align: right !important;
+ }
+ .text-xl-center {
+ text-align: center !important;
+ }
+}
+
+.text-lowercase {
+ text-transform: lowercase !important;
+}
+
+.text-uppercase {
+ text-transform: uppercase !important;
+}
+
+.text-capitalize {
+ text-transform: capitalize !important;
+}
+
+.font-weight-normal {
+ font-weight: normal;
+}
+
+.font-weight-bold {
+ font-weight: bold;
+}
+
+.font-italic {
+ font-style: italic;
+}
+
+.text-white {
+ color: #fff !important;
+}
+
+.text-muted {
+ color: #636c72 !important;
+}
+
+a.text-muted:focus, a.text-muted:hover {
+ color: #4b5257 !important;
+}
+
+.text-primary {
+ color: #0275d8 !important;
+}
+
+a.text-primary:focus, a.text-primary:hover {
+ color: #025aa5 !important;
+}
+
+.text-success {
+ color: #5cb85c !important;
+}
+
+a.text-success:focus, a.text-success:hover {
+ color: #449d44 !important;
+}
+
+.text-info {
+ color: #5bc0de !important;
+}
+
+a.text-info:focus, a.text-info:hover {
+ color: #31b0d5 !important;
+}
+
+.text-warning {
+ color: #f0ad4e !important;
+}
+
+a.text-warning:focus, a.text-warning:hover {
+ color: #ec971f !important;
+}
+
+.text-danger {
+ color: #d9534f !important;
+}
+
+a.text-danger:focus, a.text-danger:hover {
+ color: #c9302c !important;
+}
+
+.text-gray-dark {
+ color: #292b2c !important;
+}
+
+a.text-gray-dark:focus, a.text-gray-dark:hover {
+ color: #101112 !important;
+}
+
+.text-hide {
+ font: 0/0 a;
+ color: transparent;
+ text-shadow: none;
+ background-color: transparent;
+ border: 0;
+}
+
+.visible {
+ visibility: visible !important;
+}
+
+.invisible {
+ visibility: hidden !important;
}
-/*# sourceMappingURL=bootstrap.css.map */
+/*# sourceMappingURL=bootstrap.css.map */ \ No newline at end of file
diff --git a/library/bootstrap/css/bootstrap.css.map b/library/bootstrap/css/bootstrap.css.map
index f010c82d1..8b8511a52 100644
--- a/library/bootstrap/css/bootstrap.css.map
+++ b/library/bootstrap/css/bootstrap.css.map
@@ -1 +1 @@
-{"version":3,"sources":["bootstrap.css","less/normalize.less","less/print.less","less/glyphicons.less","less/scaffolding.less","less/mixins/vendor-prefixes.less","less/mixins/tab-focus.less","less/mixins/image.less","less/type.less","less/mixins/text-emphasis.less","less/mixins/background-variant.less","less/mixins/text-overflow.less","less/code.less","less/grid.less","less/mixins/grid.less","less/mixins/grid-framework.less","less/tables.less","less/mixins/table-row.less","less/forms.less","less/mixins/forms.less","less/buttons.less","less/mixins/buttons.less","less/mixins/opacity.less","less/component-animations.less","less/dropdowns.less","less/mixins/nav-divider.less","less/mixins/reset-filter.less","less/button-groups.less","less/mixins/border-radius.less","less/input-groups.less","less/navs.less","less/navbar.less","less/mixins/nav-vertical-align.less","less/utilities.less","less/breadcrumbs.less","less/pagination.less","less/mixins/pagination.less","less/pager.less","less/labels.less","less/mixins/labels.less","less/badges.less","less/jumbotron.less","less/thumbnails.less","less/alerts.less","less/mixins/alerts.less","less/progress-bars.less","less/mixins/gradients.less","less/mixins/progress-bar.less","less/media.less","less/list-group.less","less/mixins/list-group.less","less/panels.less","less/mixins/panels.less","less/responsive-embed.less","less/wells.less","less/close.less","less/modals.less","less/tooltip.less","less/mixins/reset-text.less","less/popovers.less","less/carousel.less","less/mixins/clearfix.less","less/mixins/center-block.less","less/mixins/hide-text.less","less/responsive-utilities.less","less/mixins/responsive-visibility.less"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,4EAA4E;ACG5E;EACE,wBAAA;EACA,2BAAA;EACA,+BAAA;CDDD;ACQD;EACE,UAAA;CDND;ACmBD;;;;;;;;;;;;;EAaE,eAAA;CDjBD;ACyBD;;;;EAIE,sBAAA;EACA,yBAAA;CDvBD;AC+BD;EACE,cAAA;EACA,UAAA;CD7BD;ACqCD;;EAEE,cAAA;CDnCD;AC6CD;EACE,8BAAA;CD3CD;ACmDD;;EAEE,WAAA;CDjDD;AC2DD;EACE,0BAAA;CDzDD;ACgED;;EAEE,kBAAA;CD9DD;ACqED;EACE,mBAAA;CDnED;AC2ED;EACE,eAAA;EACA,iBAAA;CDzED;ACgFD;EACE,iBAAA;EACA,YAAA;CD9ED;ACqFD;EACE,eAAA;CDnFD;AC0FD;;EAEE,eAAA;EACA,eAAA;EACA,mBAAA;EACA,yBAAA;CDxFD;AC2FD;EACE,YAAA;CDzFD;AC4FD;EACE,gBAAA;CD1FD;ACoGD;EACE,UAAA;CDlGD;ACyGD;EACE,iBAAA;CDvGD;ACiHD;EACE,iBAAA;CD/GD;ACsHD;EACE,gCAAA;KAAA,6BAAA;UAAA,wBAAA;EACA,UAAA;CDpHD;AC2HD;EACE,eAAA;CDzHD;ACgID;;;;EAIE,kCAAA;EACA,eAAA;CD9HD;ACgJD;;;;;EAKE,eAAA;EACA,cAAA;EACA,UAAA;CD9ID;ACqJD;EACE,kBAAA;CDnJD;AC6JD;;EAEE,qBAAA;CD3JD;ACsKD;;;;EAIE,2BAAA;EACA,gBAAA;CDpKD;AC2KD;;EAEE,gBAAA;CDzKD;ACgLD;;EAEE,UAAA;EACA,WAAA;CD9KD;ACsLD;EACE,oBAAA;CDpLD;AC+LD;;EAEE,+BAAA;KAAA,4BAAA;UAAA,uBAAA;EACA,WAAA;CD7LD;ACsMD;;EAEE,aAAA;CDpMD;AC4MD;EACE,8BAAA;EACA,gCAAA;KAAA,6BAAA;UAAA,wBAAA;CD1MD;ACmND;;EAEE,yBAAA;CDjND;ACwND;EACE,0BAAA;EACA,cAAA;EACA,+BAAA;CDtND;AC8ND;EACE,UAAA;EACA,WAAA;CD5ND;ACmOD;EACE,eAAA;CDjOD;ACyOD;EACE,kBAAA;CDvOD;ACiPD;EACE,0BAAA;EACA,kBAAA;CD/OD;ACkPD;;EAEE,WAAA;CDhPD;AACD,qFAAqF;AElFrF;EA7FI;;;IAGI,mCAAA;IACA,uBAAA;IACA,oCAAA;YAAA,4BAAA;IACA,6BAAA;GFkLL;EE/KC;;IAEI,2BAAA;GFiLL;EE9KC;IACI,6BAAA;GFgLL;EE7KC;IACI,8BAAA;GF+KL;EE1KC;;IAEI,YAAA;GF4KL;EEzKC;;IAEI,uBAAA;IACA,yBAAA;GF2KL;EExKC;IACI,4BAAA;GF0KL;EEvKC;;IAEI,yBAAA;GFyKL;EEtKC;IACI,2BAAA;GFwKL;EErKC;;;IAGI,WAAA;IACA,UAAA;GFuKL;EEpKC;;IAEI,wBAAA;GFsKL;EEhKC;IACI,cAAA;GFkKL;EEhKC;;IAGQ,kCAAA;GFiKT;EE9JC;IACI,uBAAA;GFgKL;EE7JC;IACI,qCAAA;GF+JL;EEhKC;;IAKQ,kCAAA;GF+JT;EE5JC;;IAGQ,kCAAA;GF6JT;CACF;AGnPD;EACE,oCAAA;EACA,sDAAA;EACA,gYAAA;CHqPD;AG7OD;EACE,mBAAA;EACA,SAAA;EACA,sBAAA;EACA,oCAAA;EACA,mBAAA;EACA,oBAAA;EACA,eAAA;EACA,oCAAA;EACA,mCAAA;CH+OD;AG3OmC;EAAW,iBAAA;CH8O9C;AG7OmC;EAAW,iBAAA;CHgP9C;AG9OmC;;EAAW,iBAAA;CHkP9C;AGjPmC;EAAW,iBAAA;CHoP9C;AGnPmC;EAAW,iBAAA;CHsP9C;AGrPmC;EAAW,iBAAA;CHwP9C;AGvPmC;EAAW,iBAAA;CH0P9C;AGzPmC;EAAW,iBAAA;CH4P9C;AG3PmC;EAAW,iBAAA;CH8P9C;AG7PmC;EAAW,iBAAA;CHgQ9C;AG/PmC;EAAW,iBAAA;CHkQ9C;AGjQmC;EAAW,iBAAA;CHoQ9C;AGnQmC;EAAW,iBAAA;CHsQ9C;AGrQmC;EAAW,iBAAA;CHwQ9C;AGvQmC;EAAW,iBAAA;CH0Q9C;AGzQmC;EAAW,iBAAA;CH4Q9C;AG3QmC;EAAW,iBAAA;CH8Q9C;AG7QmC;EAAW,iBAAA;CHgR9C;AG/QmC;EAAW,iBAAA;CHkR9C;AGjRmC;EAAW,iBAAA;CHoR9C;AGnRmC;EAAW,iBAAA;CHsR9C;AGrRmC;EAAW,iBAAA;CHwR9C;AGvRmC;EAAW,iBAAA;CH0R9C;AGzRmC;EAAW,iBAAA;CH4R9C;AG3RmC;EAAW,iBAAA;CH8R9C;AG7RmC;EAAW,iBAAA;CHgS9C;AG/RmC;EAAW,iBAAA;CHkS9C;AGjSmC;EAAW,iBAAA;CHoS9C;AGnSmC;EAAW,iBAAA;CHsS9C;AGrSmC;EAAW,iBAAA;CHwS9C;AGvSmC;EAAW,iBAAA;CH0S9C;AGzSmC;EAAW,iBAAA;CH4S9C;AG3SmC;EAAW,iBAAA;CH8S9C;AG7SmC;EAAW,iBAAA;CHgT9C;AG/SmC;EAAW,iBAAA;CHkT9C;AGjTmC;EAAW,iBAAA;CHoT9C;AGnTmC;EAAW,iBAAA;CHsT9C;AGrTmC;EAAW,iBAAA;CHwT9C;AGvTmC;EAAW,iBAAA;CH0T9C;AGzTmC;EAAW,iBAAA;CH4T9C;AG3TmC;EAAW,iBAAA;CH8T9C;AG7TmC;EAAW,iBAAA;CHgU9C;AG/TmC;EAAW,iBAAA;CHkU9C;AGjUmC;EAAW,iBAAA;CHoU9C;AGnUmC;EAAW,iBAAA;CHsU9C;AGrUmC;EAAW,iBAAA;CHwU9C;AGvUmC;EAAW,iBAAA;CH0U9C;AGzUmC;EAAW,iBAAA;CH4U9C;AG3UmC;EAAW,iBAAA;CH8U9C;AG7UmC;EAAW,iBAAA;CHgV9C;AG/UmC;EAAW,iBAAA;CHkV9C;AGjVmC;EAAW,iBAAA;CHoV9C;AGnVmC;EAAW,iBAAA;CHsV9C;AGrVmC;EAAW,iBAAA;CHwV9C;AGvVmC;EAAW,iBAAA;CH0V9C;AGzVmC;EAAW,iBAAA;CH4V9C;AG3VmC;EAAW,iBAAA;CH8V9C;AG7VmC;EAAW,iBAAA;CHgW9C;AG/VmC;EAAW,iBAAA;CHkW9C;AGjWmC;EAAW,iBAAA;CHoW9C;AGnWmC;EAAW,iBAAA;CHsW9C;AGrWmC;EAAW,iBAAA;CHwW9C;AGvWmC;EAAW,iBAAA;CH0W9C;AGzWmC;EAAW,iBAAA;CH4W9C;AG3WmC;EAAW,iBAAA;CH8W9C;AG7WmC;EAAW,iBAAA;CHgX9C;AG/WmC;EAAW,iBAAA;CHkX9C;AGjXmC;EAAW,iBAAA;CHoX9C;AGnXmC;EAAW,iBAAA;CHsX9C;AGrXmC;EAAW,iBAAA;CHwX9C;AGvXmC;EAAW,iBAAA;CH0X9C;AGzXmC;EAAW,iBAAA;CH4X9C;AG3XmC;EAAW,iBAAA;CH8X9C;AG7XmC;EAAW,iBAAA;CHgY9C;AG/XmC;EAAW,iBAAA;CHkY9C;AGjYmC;EAAW,iBAAA;CHoY9C;AGnYmC;EAAW,iBAAA;CHsY9C;AGrYmC;EAAW,iBAAA;CHwY9C;AGvYmC;EAAW,iBAAA;CH0Y9C;AGzYmC;EAAW,iBAAA;CH4Y9C;AG3YmC;EAAW,iBAAA;CH8Y9C;AG7YmC;EAAW,iBAAA;CHgZ9C;AG/YmC;EAAW,iBAAA;CHkZ9C;AGjZmC;EAAW,iBAAA;CHoZ9C;AGnZmC;EAAW,iBAAA;CHsZ9C;AGrZmC;EAAW,iBAAA;CHwZ9C;AGvZmC;EAAW,iBAAA;CH0Z9C;AGzZmC;EAAW,iBAAA;CH4Z9C;AG3ZmC;EAAW,iBAAA;CH8Z9C;AG7ZmC;EAAW,iBAAA;CHga9C;AG/ZmC;EAAW,iBAAA;CHka9C;AGjamC;EAAW,iBAAA;CHoa9C;AGnamC;EAAW,iBAAA;CHsa9C;AGramC;EAAW,iBAAA;CHwa9C;AGvamC;EAAW,iBAAA;CH0a9C;AGzamC;EAAW,iBAAA;CH4a9C;AG3amC;EAAW,iBAAA;CH8a9C;AG7amC;EAAW,iBAAA;CHgb9C;AG/amC;EAAW,iBAAA;CHkb9C;AGjbmC;EAAW,iBAAA;CHob9C;AGnbmC;EAAW,iBAAA;CHsb9C;AGrbmC;EAAW,iBAAA;CHwb9C;AGvbmC;EAAW,iBAAA;CH0b9C;AGzbmC;EAAW,iBAAA;CH4b9C;AG3bmC;EAAW,iBAAA;CH8b9C;AG7bmC;EAAW,iBAAA;CHgc9C;AG/bmC;EAAW,iBAAA;CHkc9C;AGjcmC;EAAW,iBAAA;CHoc9C;AGncmC;EAAW,iBAAA;CHsc9C;AGrcmC;EAAW,iBAAA;CHwc9C;AGvcmC;EAAW,iBAAA;CH0c9C;AGzcmC;EAAW,iBAAA;CH4c9C;AG3cmC;EAAW,iBAAA;CH8c9C;AG7cmC;EAAW,iBAAA;CHgd9C;AG/cmC;EAAW,iBAAA;CHkd9C;AGjdmC;EAAW,iBAAA;CHod9C;AGndmC;EAAW,iBAAA;CHsd9C;AGrdmC;EAAW,iBAAA;CHwd9C;AGvdmC;EAAW,iBAAA;CH0d9C;AGzdmC;EAAW,iBAAA;CH4d9C;AG3dmC;EAAW,iBAAA;CH8d9C;AG7dmC;EAAW,iBAAA;CHge9C;AG/dmC;EAAW,iBAAA;CHke9C;AGjemC;EAAW,iBAAA;CHoe9C;AGnemC;EAAW,iBAAA;CHse9C;AGremC;EAAW,iBAAA;CHwe9C;AGvemC;EAAW,iBAAA;CH0e9C;AGzemC;EAAW,iBAAA;CH4e9C;AG3emC;EAAW,iBAAA;CH8e9C;AG7emC;EAAW,iBAAA;CHgf9C;AG/emC;EAAW,iBAAA;CHkf9C;AGjfmC;EAAW,iBAAA;CHof9C;AGnfmC;EAAW,iBAAA;CHsf9C;AGrfmC;EAAW,iBAAA;CHwf9C;AGvfmC;EAAW,iBAAA;CH0f9C;AGzfmC;EAAW,iBAAA;CH4f9C;AG3fmC;EAAW,iBAAA;CH8f9C;AG7fmC;EAAW,iBAAA;CHggB9C;AG/fmC;EAAW,iBAAA;CHkgB9C;AGjgBmC;EAAW,iBAAA;CHogB9C;AGngBmC;EAAW,iBAAA;CHsgB9C;AGrgBmC;EAAW,iBAAA;CHwgB9C;AGvgBmC;EAAW,iBAAA;CH0gB9C;AGzgBmC;EAAW,iBAAA;CH4gB9C;AG3gBmC;EAAW,iBAAA;CH8gB9C;AG7gBmC;EAAW,iBAAA;CHghB9C;AG/gBmC;EAAW,iBAAA;CHkhB9C;AGjhBmC;EAAW,iBAAA;CHohB9C;AGnhBmC;EAAW,iBAAA;CHshB9C;AGrhBmC;EAAW,iBAAA;CHwhB9C;AGvhBmC;EAAW,iBAAA;CH0hB9C;AGzhBmC;EAAW,iBAAA;CH4hB9C;AG3hBmC;EAAW,iBAAA;CH8hB9C;AG7hBmC;EAAW,iBAAA;CHgiB9C;AG/hBmC;EAAW,iBAAA;CHkiB9C;AGjiBmC;EAAW,iBAAA;CHoiB9C;AGniBmC;EAAW,iBAAA;CHsiB9C;AGriBmC;EAAW,iBAAA;CHwiB9C;AGviBmC;EAAW,iBAAA;CH0iB9C;AGziBmC;EAAW,iBAAA;CH4iB9C;AG3iBmC;EAAW,iBAAA;CH8iB9C;AG7iBmC;EAAW,iBAAA;CHgjB9C;AG/iBmC;EAAW,iBAAA;CHkjB9C;AGjjBmC;EAAW,iBAAA;CHojB9C;AGnjBmC;EAAW,iBAAA;CHsjB9C;AGrjBmC;EAAW,iBAAA;CHwjB9C;AGvjBmC;EAAW,iBAAA;CH0jB9C;AGzjBmC;EAAW,iBAAA;CH4jB9C;AG3jBmC;EAAW,iBAAA;CH8jB9C;AG7jBmC;EAAW,iBAAA;CHgkB9C;AG/jBmC;EAAW,iBAAA;CHkkB9C;AGjkBmC;EAAW,iBAAA;CHokB9C;AGnkBmC;EAAW,iBAAA;CHskB9C;AGrkBmC;EAAW,iBAAA;CHwkB9C;AGvkBmC;EAAW,iBAAA;CH0kB9C;AGzkBmC;EAAW,iBAAA;CH4kB9C;AG3kBmC;EAAW,iBAAA;CH8kB9C;AG7kBmC;EAAW,iBAAA;CHglB9C;AG/kBmC;EAAW,iBAAA;CHklB9C;AGjlBmC;EAAW,iBAAA;CHolB9C;AGnlBmC;EAAW,iBAAA;CHslB9C;AGrlBmC;EAAW,iBAAA;CHwlB9C;AGvlBmC;EAAW,iBAAA;CH0lB9C;AGzlBmC;EAAW,iBAAA;CH4lB9C;AG3lBmC;EAAW,iBAAA;CH8lB9C;AG7lBmC;EAAW,iBAAA;CHgmB9C;AG/lBmC;EAAW,iBAAA;CHkmB9C;AGjmBmC;EAAW,iBAAA;CHomB9C;AGnmBmC;EAAW,iBAAA;CHsmB9C;AGrmBmC;EAAW,iBAAA;CHwmB9C;AGvmBmC;EAAW,iBAAA;CH0mB9C;AGzmBmC;EAAW,iBAAA;CH4mB9C;AG3mBmC;EAAW,iBAAA;CH8mB9C;AG7mBmC;EAAW,iBAAA;CHgnB9C;AG/mBmC;EAAW,iBAAA;CHknB9C;AGjnBmC;EAAW,iBAAA;CHonB9C;AGnnBmC;EAAW,iBAAA;CHsnB9C;AGrnBmC;EAAW,iBAAA;CHwnB9C;AGvnBmC;EAAW,iBAAA;CH0nB9C;AGznBmC;EAAW,iBAAA;CH4nB9C;AG3nBmC;EAAW,iBAAA;CH8nB9C;AG7nBmC;EAAW,iBAAA;CHgoB9C;AG/nBmC;EAAW,iBAAA;CHkoB9C;AGjoBmC;EAAW,iBAAA;CHooB9C;AGnoBmC;EAAW,iBAAA;CHsoB9C;AGroBmC;EAAW,iBAAA;CHwoB9C;AG/nBmC;EAAW,iBAAA;CHkoB9C;AGjoBmC;EAAW,iBAAA;CHooB9C;AGnoBmC;EAAW,iBAAA;CHsoB9C;AGroBmC;EAAW,iBAAA;CHwoB9C;AGvoBmC;EAAW,iBAAA;CH0oB9C;AGzoBmC;EAAW,iBAAA;CH4oB9C;AG3oBmC;EAAW,iBAAA;CH8oB9C;AG7oBmC;EAAW,iBAAA;CHgpB9C;AG/oBmC;EAAW,iBAAA;CHkpB9C;AGjpBmC;EAAW,iBAAA;CHopB9C;AGnpBmC;EAAW,iBAAA;CHspB9C;AGrpBmC;EAAW,iBAAA;CHwpB9C;AGvpBmC;EAAW,iBAAA;CH0pB9C;AGzpBmC;EAAW,iBAAA;CH4pB9C;AG3pBmC;EAAW,iBAAA;CH8pB9C;AG7pBmC;EAAW,iBAAA;CHgqB9C;AG/pBmC;EAAW,iBAAA;CHkqB9C;AGjqBmC;EAAW,iBAAA;CHoqB9C;AGnqBmC;EAAW,iBAAA;CHsqB9C;AGrqBmC;EAAW,iBAAA;CHwqB9C;AGvqBmC;EAAW,iBAAA;CH0qB9C;AGzqBmC;EAAW,iBAAA;CH4qB9C;AG3qBmC;EAAW,iBAAA;CH8qB9C;AG7qBmC;EAAW,iBAAA;CHgrB9C;AG/qBmC;EAAW,iBAAA;CHkrB9C;AGjrBmC;EAAW,iBAAA;CHorB9C;AGnrBmC;EAAW,iBAAA;CHsrB9C;AGrrBmC;EAAW,iBAAA;CHwrB9C;AGvrBmC;EAAW,iBAAA;CH0rB9C;AGzrBmC;EAAW,iBAAA;CH4rB9C;AG3rBmC;EAAW,iBAAA;CH8rB9C;AG7rBmC;EAAW,iBAAA;CHgsB9C;AG/rBmC;EAAW,iBAAA;CHksB9C;AGjsBmC;EAAW,iBAAA;CHosB9C;AGnsBmC;EAAW,iBAAA;CHssB9C;AGrsBmC;EAAW,iBAAA;CHwsB9C;AGvsBmC;EAAW,iBAAA;CH0sB9C;AGzsBmC;EAAW,iBAAA;CH4sB9C;AG3sBmC;EAAW,iBAAA;CH8sB9C;AG7sBmC;EAAW,iBAAA;CHgtB9C;AG/sBmC;EAAW,iBAAA;CHktB9C;AGjtBmC;EAAW,iBAAA;CHotB9C;AGntBmC;EAAW,iBAAA;CHstB9C;AGrtBmC;EAAW,iBAAA;CHwtB9C;AGvtBmC;EAAW,iBAAA;CH0tB9C;AGztBmC;EAAW,iBAAA;CH4tB9C;AG3tBmC;EAAW,iBAAA;CH8tB9C;AG7tBmC;EAAW,iBAAA;CHguB9C;AG/tBmC;EAAW,iBAAA;CHkuB9C;AGjuBmC;EAAW,iBAAA;CHouB9C;AGnuBmC;EAAW,iBAAA;CHsuB9C;AGruBmC;EAAW,iBAAA;CHwuB9C;AGvuBmC;EAAW,iBAAA;CH0uB9C;AGzuBmC;EAAW,iBAAA;CH4uB9C;AG3uBmC;EAAW,iBAAA;CH8uB9C;AG7uBmC;EAAW,iBAAA;CHgvB9C;AIthCD;ECgEE,+BAAA;EACG,4BAAA;EACK,uBAAA;CLy9BT;AIxhCD;;EC6DE,+BAAA;EACG,4BAAA;EACK,uBAAA;CL+9BT;AIthCD;EACE,gBAAA;EACA,8CAAA;CJwhCD;AIrhCD;EACE,4DAAA;EACA,gBAAA;EACA,wBAAA;EACA,eAAA;EACA,uBAAA;CJuhCD;AInhCD;;;;EAIE,qBAAA;EACA,mBAAA;EACA,qBAAA;CJqhCD;AI/gCD;EACE,eAAA;EACA,sBAAA;CJihCD;AI/gCC;;EAEE,eAAA;EACA,2BAAA;CJihCH;AI9gCC;EEnDA,2CAAA;EACA,qBAAA;CNokCD;AIvgCD;EACE,UAAA;CJygCD;AIngCD;EACE,uBAAA;CJqgCD;AIjgCD;;;;;EGvEE,eAAA;EACA,gBAAA;EACA,aAAA;CP+kCD;AIrgCD;EACE,mBAAA;CJugCD;AIjgCD;EACE,aAAA;EACA,wBAAA;EACA,uBAAA;EACA,uBAAA;EACA,mBAAA;EC6FA,yCAAA;EACK,oCAAA;EACG,iCAAA;EEvLR,sBAAA;EACA,gBAAA;EACA,aAAA;CP+lCD;AIjgCD;EACE,mBAAA;CJmgCD;AI7/BD;EACE,iBAAA;EACA,oBAAA;EACA,UAAA;EACA,8BAAA;CJ+/BD;AIv/BD;EACE,mBAAA;EACA,WAAA;EACA,YAAA;EACA,aAAA;EACA,WAAA;EACA,iBAAA;EACA,uBAAA;EACA,UAAA;CJy/BD;AIj/BC;;EAEE,iBAAA;EACA,YAAA;EACA,aAAA;EACA,UAAA;EACA,kBAAA;EACA,WAAA;CJm/BH;AIx+BD;EACE,gBAAA;CJ0+BD;AQjoCD;;;;;;;;;;;;EAEE,qBAAA;EACA,iBAAA;EACA,iBAAA;EACA,eAAA;CR6oCD;AQlpCD;;;;;;;;;;;;;;;;;;;;;;;;EASI,oBAAA;EACA,eAAA;EACA,eAAA;CRmqCH;AQ/pCD;;;;;;EAGE,iBAAA;EACA,oBAAA;CRoqCD;AQxqCD;;;;;;;;;;;;EAQI,eAAA;CR8qCH;AQ3qCD;;;;;;EAGE,iBAAA;EACA,oBAAA;CRgrCD;AQprCD;;;;;;;;;;;;EAQI,eAAA;CR0rCH;AQtrCD;;EAAU,gBAAA;CR0rCT;AQzrCD;;EAAU,gBAAA;CR6rCT;AQ5rCD;;EAAU,gBAAA;CRgsCT;AQ/rCD;;EAAU,gBAAA;CRmsCT;AQlsCD;;EAAU,gBAAA;CRssCT;AQrsCD;;EAAU,gBAAA;CRysCT;AQnsCD;EACE,iBAAA;CRqsCD;AQlsCD;EACE,oBAAA;EACA,gBAAA;EACA,iBAAA;EACA,iBAAA;CRosCD;AQ/rCD;EAwOA;IA1OI,gBAAA;GRqsCD;CACF;AQ7rCD;;EAEE,eAAA;CR+rCD;AQ5rCD;;EAEE,0BAAA;EACA,cAAA;CR8rCD;AQ1rCD;EAAuB,iBAAA;CR6rCtB;AQ5rCD;EAAuB,kBAAA;CR+rCtB;AQ9rCD;EAAuB,mBAAA;CRisCtB;AQhsCD;EAAuB,oBAAA;CRmsCtB;AQlsCD;EAAuB,oBAAA;CRqsCtB;AQlsCD;EAAuB,0BAAA;CRqsCtB;AQpsCD;EAAuB,0BAAA;CRusCtB;AQtsCD;EAAuB,2BAAA;CRysCtB;AQtsCD;EACE,eAAA;CRwsCD;AQtsCD;ECrGE,eAAA;CT8yCD;AS7yCC;;EAEE,eAAA;CT+yCH;AQ1sCD;ECxGE,eAAA;CTqzCD;ASpzCC;;EAEE,eAAA;CTszCH;AQ9sCD;EC3GE,eAAA;CT4zCD;AS3zCC;;EAEE,eAAA;CT6zCH;AQltCD;EC9GE,eAAA;CTm0CD;ASl0CC;;EAEE,eAAA;CTo0CH;AQttCD;ECjHE,eAAA;CT00CD;ASz0CC;;EAEE,eAAA;CT20CH;AQttCD;EAGE,YAAA;EE3HA,0BAAA;CVk1CD;AUj1CC;;EAEE,0BAAA;CVm1CH;AQxtCD;EE9HE,0BAAA;CVy1CD;AUx1CC;;EAEE,0BAAA;CV01CH;AQ5tCD;EEjIE,0BAAA;CVg2CD;AU/1CC;;EAEE,0BAAA;CVi2CH;AQhuCD;EEpIE,0BAAA;CVu2CD;AUt2CC;;EAEE,0BAAA;CVw2CH;AQpuCD;EEvIE,0BAAA;CV82CD;AU72CC;;EAEE,0BAAA;CV+2CH;AQnuCD;EACE,oBAAA;EACA,oBAAA;EACA,iCAAA;CRquCD;AQ7tCD;;EAEE,cAAA;EACA,oBAAA;CR+tCD;AQluCD;;;;EAMI,iBAAA;CRkuCH;AQ3tCD;EACE,gBAAA;EACA,iBAAA;CR6tCD;AQztCD;EALE,gBAAA;EACA,iBAAA;EAMA,kBAAA;CR4tCD;AQ9tCD;EAKI,sBAAA;EACA,kBAAA;EACA,mBAAA;CR4tCH;AQvtCD;EACE,cAAA;EACA,oBAAA;CRytCD;AQvtCD;;EAEE,wBAAA;CRytCD;AQvtCD;EACE,kBAAA;CRytCD;AQvtCD;EACE,eAAA;CRytCD;AQhsCD;EA6EA;IAvFM,YAAA;IACA,aAAA;IACA,YAAA;IACA,kBAAA;IGtNJ,iBAAA;IACA,wBAAA;IACA,oBAAA;GXq6CC;EQ7nCH;IAhFM,mBAAA;GRgtCH;CACF;AQvsCD;;EAGE,aAAA;EACA,kCAAA;CRwsCD;AQtsCD;EACE,eAAA;EA9IqB,0BAAA;CRu1CtB;AQpsCD;EACE,mBAAA;EACA,iBAAA;EACA,kBAAA;EACA,+BAAA;CRssCD;AQjsCG;;;EACE,iBAAA;CRqsCL;AQ/sCD;;;EAmBI,eAAA;EACA,eAAA;EACA,wBAAA;EACA,eAAA;CRisCH;AQ/rCG;;;EACE,uBAAA;CRmsCL;AQ3rCD;;EAEE,oBAAA;EACA,gBAAA;EACA,gCAAA;EACA,eAAA;EACA,kBAAA;CR6rCD;AQvrCG;;;;;;EAAW,YAAA;CR+rCd;AQ9rCG;;;;;;EACE,uBAAA;CRqsCL;AQ/rCD;EACE,oBAAA;EACA,mBAAA;EACA,wBAAA;CRisCD;AYv+CD;;;;EAIE,+DAAA;CZy+CD;AYr+CD;EACE,iBAAA;EACA,eAAA;EACA,eAAA;EACA,0BAAA;EACA,mBAAA;CZu+CD;AYn+CD;EACE,iBAAA;EACA,eAAA;EACA,YAAA;EACA,uBAAA;EACA,mBAAA;EACA,uDAAA;UAAA,+CAAA;CZq+CD;AY3+CD;EASI,WAAA;EACA,gBAAA;EACA,kBAAA;EACA,yBAAA;UAAA,iBAAA;CZq+CH;AYh+CD;EACE,eAAA;EACA,eAAA;EACA,iBAAA;EACA,gBAAA;EACA,wBAAA;EACA,sBAAA;EACA,sBAAA;EACA,eAAA;EACA,0BAAA;EACA,uBAAA;EACA,mBAAA;CZk+CD;AY7+CD;EAeI,WAAA;EACA,mBAAA;EACA,eAAA;EACA,sBAAA;EACA,8BAAA;EACA,iBAAA;CZi+CH;AY59CD;EACE,kBAAA;EACA,mBAAA;CZ89CD;AaxhDD;ECHE,mBAAA;EACA,kBAAA;EACA,mBAAA;EACA,oBAAA;Cd8hDD;AaxhDC;EAqEF;IAvEI,aAAA;Gb8hDD;CACF;Aa1hDC;EAkEF;IApEI,aAAA;GbgiDD;CACF;Aa5hDD;EA+DA;IAjEI,cAAA;GbkiDD;CACF;AazhDD;ECvBE,mBAAA;EACA,kBAAA;EACA,mBAAA;EACA,oBAAA;CdmjDD;AathDD;ECvBE,mBAAA;EACA,oBAAA;CdgjDD;AehjDG;EACE,mBAAA;EAEA,gBAAA;EAEA,mBAAA;EACA,oBAAA;CfgjDL;AehiDG;EACE,YAAA;CfkiDL;Ae3hDC;EACE,YAAA;Cf6hDH;Ae9hDC;EACE,oBAAA;CfgiDH;AejiDC;EACE,oBAAA;CfmiDH;AepiDC;EACE,WAAA;CfsiDH;AeviDC;EACE,oBAAA;CfyiDH;Ae1iDC;EACE,oBAAA;Cf4iDH;Ae7iDC;EACE,WAAA;Cf+iDH;AehjDC;EACE,oBAAA;CfkjDH;AenjDC;EACE,oBAAA;CfqjDH;AetjDC;EACE,WAAA;CfwjDH;AezjDC;EACE,oBAAA;Cf2jDH;Ae5jDC;EACE,mBAAA;Cf8jDH;AehjDC;EACE,YAAA;CfkjDH;AenjDC;EACE,oBAAA;CfqjDH;AetjDC;EACE,oBAAA;CfwjDH;AezjDC;EACE,WAAA;Cf2jDH;Ae5jDC;EACE,oBAAA;Cf8jDH;Ae/jDC;EACE,oBAAA;CfikDH;AelkDC;EACE,WAAA;CfokDH;AerkDC;EACE,oBAAA;CfukDH;AexkDC;EACE,oBAAA;Cf0kDH;Ae3kDC;EACE,WAAA;Cf6kDH;Ae9kDC;EACE,oBAAA;CfglDH;AejlDC;EACE,mBAAA;CfmlDH;Ae/kDC;EACE,YAAA;CfilDH;AejmDC;EACE,WAAA;CfmmDH;AepmDC;EACE,mBAAA;CfsmDH;AevmDC;EACE,mBAAA;CfymDH;Ae1mDC;EACE,UAAA;Cf4mDH;Ae7mDC;EACE,mBAAA;Cf+mDH;AehnDC;EACE,mBAAA;CfknDH;AennDC;EACE,UAAA;CfqnDH;AetnDC;EACE,mBAAA;CfwnDH;AeznDC;EACE,mBAAA;Cf2nDH;Ae5nDC;EACE,UAAA;Cf8nDH;Ae/nDC;EACE,mBAAA;CfioDH;AeloDC;EACE,kBAAA;CfooDH;AehoDC;EACE,WAAA;CfkoDH;AepnDC;EACE,kBAAA;CfsnDH;AevnDC;EACE,0BAAA;CfynDH;Ae1nDC;EACE,0BAAA;Cf4nDH;Ae7nDC;EACE,iBAAA;Cf+nDH;AehoDC;EACE,0BAAA;CfkoDH;AenoDC;EACE,0BAAA;CfqoDH;AetoDC;EACE,iBAAA;CfwoDH;AezoDC;EACE,0BAAA;Cf2oDH;Ae5oDC;EACE,0BAAA;Cf8oDH;Ae/oDC;EACE,iBAAA;CfipDH;AelpDC;EACE,0BAAA;CfopDH;AerpDC;EACE,yBAAA;CfupDH;AexpDC;EACE,gBAAA;Cf0pDH;Aa1pDD;EElCI;IACE,YAAA;Gf+rDH;EexrDD;IACE,YAAA;Gf0rDD;Ee3rDD;IACE,oBAAA;Gf6rDD;Ee9rDD;IACE,oBAAA;GfgsDD;EejsDD;IACE,WAAA;GfmsDD;EepsDD;IACE,oBAAA;GfssDD;EevsDD;IACE,oBAAA;GfysDD;Ee1sDD;IACE,WAAA;Gf4sDD;Ee7sDD;IACE,oBAAA;Gf+sDD;EehtDD;IACE,oBAAA;GfktDD;EentDD;IACE,WAAA;GfqtDD;EettDD;IACE,oBAAA;GfwtDD;EeztDD;IACE,mBAAA;Gf2tDD;Ee7sDD;IACE,YAAA;Gf+sDD;EehtDD;IACE,oBAAA;GfktDD;EentDD;IACE,oBAAA;GfqtDD;EettDD;IACE,WAAA;GfwtDD;EeztDD;IACE,oBAAA;Gf2tDD;Ee5tDD;IACE,oBAAA;Gf8tDD;Ee/tDD;IACE,WAAA;GfiuDD;EeluDD;IACE,oBAAA;GfouDD;EeruDD;IACE,oBAAA;GfuuDD;EexuDD;IACE,WAAA;Gf0uDD;Ee3uDD;IACE,oBAAA;Gf6uDD;Ee9uDD;IACE,mBAAA;GfgvDD;Ee5uDD;IACE,YAAA;Gf8uDD;Ee9vDD;IACE,WAAA;GfgwDD;EejwDD;IACE,mBAAA;GfmwDD;EepwDD;IACE,mBAAA;GfswDD;EevwDD;IACE,UAAA;GfywDD;Ee1wDD;IACE,mBAAA;Gf4wDD;Ee7wDD;IACE,mBAAA;Gf+wDD;EehxDD;IACE,UAAA;GfkxDD;EenxDD;IACE,mBAAA;GfqxDD;EetxDD;IACE,mBAAA;GfwxDD;EezxDD;IACE,UAAA;Gf2xDD;Ee5xDD;IACE,mBAAA;Gf8xDD;Ee/xDD;IACE,kBAAA;GfiyDD;Ee7xDD;IACE,WAAA;Gf+xDD;EejxDD;IACE,kBAAA;GfmxDD;EepxDD;IACE,0BAAA;GfsxDD;EevxDD;IACE,0BAAA;GfyxDD;Ee1xDD;IACE,iBAAA;Gf4xDD;Ee7xDD;IACE,0BAAA;Gf+xDD;EehyDD;IACE,0BAAA;GfkyDD;EenyDD;IACE,iBAAA;GfqyDD;EetyDD;IACE,0BAAA;GfwyDD;EezyDD;IACE,0BAAA;Gf2yDD;Ee5yDD;IACE,iBAAA;Gf8yDD;Ee/yDD;IACE,0BAAA;GfizDD;EelzDD;IACE,yBAAA;GfozDD;EerzDD;IACE,gBAAA;GfuzDD;CACF;Aa/yDD;EE3CI;IACE,YAAA;Gf61DH;Eet1DD;IACE,YAAA;Gfw1DD;Eez1DD;IACE,oBAAA;Gf21DD;Ee51DD;IACE,oBAAA;Gf81DD;Ee/1DD;IACE,WAAA;Gfi2DD;Eel2DD;IACE,oBAAA;Gfo2DD;Eer2DD;IACE,oBAAA;Gfu2DD;Eex2DD;IACE,WAAA;Gf02DD;Ee32DD;IACE,oBAAA;Gf62DD;Ee92DD;IACE,oBAAA;Gfg3DD;Eej3DD;IACE,WAAA;Gfm3DD;Eep3DD;IACE,oBAAA;Gfs3DD;Eev3DD;IACE,mBAAA;Gfy3DD;Ee32DD;IACE,YAAA;Gf62DD;Ee92DD;IACE,oBAAA;Gfg3DD;Eej3DD;IACE,oBAAA;Gfm3DD;Eep3DD;IACE,WAAA;Gfs3DD;Eev3DD;IACE,oBAAA;Gfy3DD;Ee13DD;IACE,oBAAA;Gf43DD;Ee73DD;IACE,WAAA;Gf+3DD;Eeh4DD;IACE,oBAAA;Gfk4DD;Een4DD;IACE,oBAAA;Gfq4DD;Eet4DD;IACE,WAAA;Gfw4DD;Eez4DD;IACE,oBAAA;Gf24DD;Ee54DD;IACE,mBAAA;Gf84DD;Ee14DD;IACE,YAAA;Gf44DD;Ee55DD;IACE,WAAA;Gf85DD;Ee/5DD;IACE,mBAAA;Gfi6DD;Eel6DD;IACE,mBAAA;Gfo6DD;Eer6DD;IACE,UAAA;Gfu6DD;Eex6DD;IACE,mBAAA;Gf06DD;Ee36DD;IACE,mBAAA;Gf66DD;Ee96DD;IACE,UAAA;Gfg7DD;Eej7DD;IACE,mBAAA;Gfm7DD;Eep7DD;IACE,mBAAA;Gfs7DD;Eev7DD;IACE,UAAA;Gfy7DD;Ee17DD;IACE,mBAAA;Gf47DD;Ee77DD;IACE,kBAAA;Gf+7DD;Ee37DD;IACE,WAAA;Gf67DD;Ee/6DD;IACE,kBAAA;Gfi7DD;Eel7DD;IACE,0BAAA;Gfo7DD;Eer7DD;IACE,0BAAA;Gfu7DD;Eex7DD;IACE,iBAAA;Gf07DD;Ee37DD;IACE,0BAAA;Gf67DD;Ee97DD;IACE,0BAAA;Gfg8DD;Eej8DD;IACE,iBAAA;Gfm8DD;Eep8DD;IACE,0BAAA;Gfs8DD;Eev8DD;IACE,0BAAA;Gfy8DD;Ee18DD;IACE,iBAAA;Gf48DD;Ee78DD;IACE,0BAAA;Gf+8DD;Eeh9DD;IACE,yBAAA;Gfk9DD;Een9DD;IACE,gBAAA;Gfq9DD;CACF;Aa18DD;EE9CI;IACE,YAAA;Gf2/DH;Eep/DD;IACE,YAAA;Gfs/DD;Eev/DD;IACE,oBAAA;Gfy/DD;Ee1/DD;IACE,oBAAA;Gf4/DD;Ee7/DD;IACE,WAAA;Gf+/DD;EehgED;IACE,oBAAA;GfkgED;EengED;IACE,oBAAA;GfqgED;EetgED;IACE,WAAA;GfwgED;EezgED;IACE,oBAAA;Gf2gED;Ee5gED;IACE,oBAAA;Gf8gED;Ee/gED;IACE,WAAA;GfihED;EelhED;IACE,oBAAA;GfohED;EerhED;IACE,mBAAA;GfuhED;EezgED;IACE,YAAA;Gf2gED;Ee5gED;IACE,oBAAA;Gf8gED;Ee/gED;IACE,oBAAA;GfihED;EelhED;IACE,WAAA;GfohED;EerhED;IACE,oBAAA;GfuhED;EexhED;IACE,oBAAA;Gf0hED;Ee3hED;IACE,WAAA;Gf6hED;Ee9hED;IACE,oBAAA;GfgiED;EejiED;IACE,oBAAA;GfmiED;EepiED;IACE,WAAA;GfsiED;EeviED;IACE,oBAAA;GfyiED;Ee1iED;IACE,mBAAA;Gf4iED;EexiED;IACE,YAAA;Gf0iED;Ee1jED;IACE,WAAA;Gf4jED;Ee7jED;IACE,mBAAA;Gf+jED;EehkED;IACE,mBAAA;GfkkED;EenkED;IACE,UAAA;GfqkED;EetkED;IACE,mBAAA;GfwkED;EezkED;IACE,mBAAA;Gf2kED;Ee5kED;IACE,UAAA;Gf8kED;Ee/kED;IACE,mBAAA;GfilED;EellED;IACE,mBAAA;GfolED;EerlED;IACE,UAAA;GfulED;EexlED;IACE,mBAAA;Gf0lED;Ee3lED;IACE,kBAAA;Gf6lED;EezlED;IACE,WAAA;Gf2lED;Ee7kED;IACE,kBAAA;Gf+kED;EehlED;IACE,0BAAA;GfklED;EenlED;IACE,0BAAA;GfqlED;EetlED;IACE,iBAAA;GfwlED;EezlED;IACE,0BAAA;Gf2lED;Ee5lED;IACE,0BAAA;Gf8lED;Ee/lED;IACE,iBAAA;GfimED;EelmED;IACE,0BAAA;GfomED;EermED;IACE,0BAAA;GfumED;EexmED;IACE,iBAAA;Gf0mED;Ee3mED;IACE,0BAAA;Gf6mED;Ee9mED;IACE,yBAAA;GfgnED;EejnED;IACE,gBAAA;GfmnED;CACF;AgBvrED;EACE,8BAAA;ChByrED;AgBvrED;EACE,iBAAA;EACA,oBAAA;EACA,eAAA;EACA,iBAAA;ChByrED;AgBvrED;EACE,iBAAA;ChByrED;AgBnrED;EACE,YAAA;EACA,gBAAA;EACA,oBAAA;ChBqrED;AgBxrED;;;;;;EAWQ,aAAA;EACA,wBAAA;EACA,oBAAA;EACA,2BAAA;ChBqrEP;AgBnsED;EAoBI,uBAAA;EACA,8BAAA;ChBkrEH;AgBvsED;;;;;;EA8BQ,cAAA;ChBirEP;AgB/sED;EAoCI,2BAAA;ChB8qEH;AgBltED;EAyCI,uBAAA;ChB4qEH;AgBrqED;;;;;;EAOQ,aAAA;ChBsqEP;AgB3pED;EACE,uBAAA;ChB6pED;AgB9pED;;;;;;EAQQ,uBAAA;ChB8pEP;AgBtqED;;EAeM,yBAAA;ChB2pEL;AgBjpED;EAEI,0BAAA;ChBkpEH;AgBzoED;EAEI,0BAAA;ChB0oEH;AgBjoED;EACE,iBAAA;EACA,YAAA;EACA,sBAAA;ChBmoED;AgB9nEG;;EACE,iBAAA;EACA,YAAA;EACA,oBAAA;ChBioEL;AiB7wEC;;;;;;;;;;;;EAOI,0BAAA;CjBoxEL;AiB9wEC;;;;;EAMI,0BAAA;CjB+wEL;AiBlyEC;;;;;;;;;;;;EAOI,0BAAA;CjByyEL;AiBnyEC;;;;;EAMI,0BAAA;CjBoyEL;AiBvzEC;;;;;;;;;;;;EAOI,0BAAA;CjB8zEL;AiBxzEC;;;;;EAMI,0BAAA;CjByzEL;AiB50EC;;;;;;;;;;;;EAOI,0BAAA;CjBm1EL;AiB70EC;;;;;EAMI,0BAAA;CjB80EL;AiBj2EC;;;;;;;;;;;;EAOI,0BAAA;CjBw2EL;AiBl2EC;;;;;EAMI,0BAAA;CjBm2EL;AgBjtED;EACE,iBAAA;EACA,kBAAA;ChBmtED;AgBtpED;EACA;IA3DI,YAAA;IACA,oBAAA;IACA,mBAAA;IACA,6CAAA;IACA,uBAAA;GhBotED;EgB7pEH;IAnDM,iBAAA;GhBmtEH;EgBhqEH;;;;;;IA1CY,oBAAA;GhBktET;EgBxqEH;IAlCM,UAAA;GhB6sEH;EgB3qEH;;;;;;IAzBY,eAAA;GhB4sET;EgBnrEH;;;;;;IArBY,gBAAA;GhBgtET;EgB3rEH;;;;IARY,iBAAA;GhBysET;CACF;AkBn6ED;EACE,WAAA;EACA,UAAA;EACA,UAAA;EAIA,aAAA;ClBk6ED;AkB/5ED;EACE,eAAA;EACA,YAAA;EACA,WAAA;EACA,oBAAA;EACA,gBAAA;EACA,qBAAA;EACA,eAAA;EACA,UAAA;EACA,iCAAA;ClBi6ED;AkB95ED;EACE,sBAAA;EACA,gBAAA;EACA,mBAAA;EACA,kBAAA;ClBg6ED;AkBr5ED;Eb4BE,+BAAA;EACG,4BAAA;EACK,uBAAA;CL43ET;AkBr5ED;;EAEE,gBAAA;EACA,mBAAA;EACA,oBAAA;ClBu5ED;AkBp5ED;EACE,eAAA;ClBs5ED;AkBl5ED;EACE,eAAA;EACA,YAAA;ClBo5ED;AkBh5ED;;EAEE,aAAA;ClBk5ED;AkB94ED;;;EZrEE,2CAAA;EACA,qBAAA;CNw9ED;AkB74ED;EACE,eAAA;EACA,iBAAA;EACA,gBAAA;EACA,wBAAA;EACA,eAAA;ClB+4ED;AkBr3ED;EACE,eAAA;EACA,YAAA;EACA,aAAA;EACA,kBAAA;EACA,gBAAA;EACA,wBAAA;EACA,eAAA;EACA,uBAAA;EACA,uBAAA;EACA,uBAAA;EACA,mBAAA;EbxDA,yDAAA;EACQ,iDAAA;EAyHR,uFAAA;EACK,0EAAA;EACG,uEAAA;CLwzET;AmBh8EC;EACE,sBAAA;EACA,WAAA;EdUF,uFAAA;EACQ,+EAAA;CLy7ET;AKx5EC;EACE,YAAA;EACA,WAAA;CL05EH;AKx5EC;EAA0B,YAAA;CL25E3B;AK15EC;EAAgC,YAAA;CL65EjC;AkBj4EC;EACE,UAAA;EACA,8BAAA;ClBm4EH;AkB33EC;;;EAGE,0BAAA;EACA,WAAA;ClB63EH;AkB13EC;;EAEE,oBAAA;ClB43EH;AkBx3EC;EACE,aAAA;ClB03EH;AkB92ED;EACE,yBAAA;ClBg3ED;AkBx0ED;EAtBI;;;;IACE,kBAAA;GlBo2EH;EkBj2EC;;;;;;;;IAEE,kBAAA;GlBy2EH;EkBt2EC;;;;;;;;IAEE,kBAAA;GlB82EH;CACF;AkBp2ED;EACE,oBAAA;ClBs2ED;AkB91ED;;EAEE,mBAAA;EACA,eAAA;EACA,iBAAA;EACA,oBAAA;ClBg2ED;AkBr2ED;;EAQI,iBAAA;EACA,mBAAA;EACA,iBAAA;EACA,oBAAA;EACA,gBAAA;ClBi2EH;AkB91ED;;;;EAIE,mBAAA;EACA,mBAAA;EACA,mBAAA;ClBg2ED;AkB71ED;;EAEE,iBAAA;ClB+1ED;AkB31ED;;EAEE,mBAAA;EACA,sBAAA;EACA,mBAAA;EACA,iBAAA;EACA,uBAAA;EACA,oBAAA;EACA,gBAAA;ClB61ED;AkB31ED;;EAEE,cAAA;EACA,kBAAA;ClB61ED;AkBp1EC;;;;;;EAGE,oBAAA;ClBy1EH;AkBn1EC;;;;EAEE,oBAAA;ClBu1EH;AkBj1EC;;;;EAGI,oBAAA;ClBo1EL;AkBz0ED;EAEE,iBAAA;EACA,oBAAA;EAEA,iBAAA;EACA,iBAAA;ClBy0ED;AkBv0EC;;EAEE,gBAAA;EACA,iBAAA;ClBy0EH;AkB5zED;ECnQE,aAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;CnBkkFD;AmBhkFC;EACE,aAAA;EACA,kBAAA;CnBkkFH;AmB/jFC;;EAEE,aAAA;CnBikFH;AkBx0ED;EAEI,aAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;ClBy0EH;AkB/0ED;EASI,aAAA;EACA,kBAAA;ClBy0EH;AkBn1ED;;EAcI,aAAA;ClBy0EH;AkBv1ED;EAiBI,aAAA;EACA,iBAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;ClBy0EH;AkBr0ED;EC/RE,aAAA;EACA,mBAAA;EACA,gBAAA;EACA,uBAAA;EACA,mBAAA;CnBumFD;AmBrmFC;EACE,aAAA;EACA,kBAAA;CnBumFH;AmBpmFC;;EAEE,aAAA;CnBsmFH;AkBj1ED;EAEI,aAAA;EACA,mBAAA;EACA,gBAAA;EACA,uBAAA;EACA,mBAAA;ClBk1EH;AkBx1ED;EASI,aAAA;EACA,kBAAA;ClBk1EH;AkB51ED;;EAcI,aAAA;ClBk1EH;AkBh2ED;EAiBI,aAAA;EACA,iBAAA;EACA,mBAAA;EACA,gBAAA;EACA,uBAAA;ClBk1EH;AkBz0ED;EAEE,mBAAA;ClB00ED;AkB50ED;EAMI,sBAAA;ClBy0EH;AkBr0ED;EACE,mBAAA;EACA,OAAA;EACA,SAAA;EACA,WAAA;EACA,eAAA;EACA,YAAA;EACA,aAAA;EACA,kBAAA;EACA,mBAAA;EACA,qBAAA;ClBu0ED;AkBr0ED;;;EAGE,YAAA;EACA,aAAA;EACA,kBAAA;ClBu0ED;AkBr0ED;;;EAGE,YAAA;EACA,aAAA;EACA,kBAAA;ClBu0ED;AkBn0ED;;;;;;;;;;EC1ZI,eAAA;CnByuFH;AkB/0ED;ECtZI,sBAAA;Ed+CF,yDAAA;EACQ,iDAAA;CL0rFT;AmBxuFG;EACE,sBAAA;Ed4CJ,0EAAA;EACQ,kEAAA;CL+rFT;AkBz1ED;EC5YI,eAAA;EACA,sBAAA;EACA,0BAAA;CnBwuFH;AkB91ED;ECtYI,eAAA;CnBuuFH;AkB91ED;;;;;;;;;;EC7ZI,eAAA;CnBuwFH;AkB12ED;ECzZI,sBAAA;Ed+CF,yDAAA;EACQ,iDAAA;CLwtFT;AmBtwFG;EACE,sBAAA;Ed4CJ,0EAAA;EACQ,kEAAA;CL6tFT;AkBp3ED;EC/YI,eAAA;EACA,sBAAA;EACA,0BAAA;CnBswFH;AkBz3ED;ECzYI,eAAA;CnBqwFH;AkBz3ED;;;;;;;;;;EChaI,eAAA;CnBqyFH;AkBr4ED;EC5ZI,sBAAA;Ed+CF,yDAAA;EACQ,iDAAA;CLsvFT;AmBpyFG;EACE,sBAAA;Ed4CJ,0EAAA;EACQ,kEAAA;CL2vFT;AkB/4ED;EClZI,eAAA;EACA,sBAAA;EACA,0BAAA;CnBoyFH;AkBp5ED;EC5YI,eAAA;CnBmyFH;AkBh5EC;EACE,UAAA;ClBk5EH;AkBh5EC;EACE,OAAA;ClBk5EH;AkBx4ED;EACE,eAAA;EACA,gBAAA;EACA,oBAAA;EACA,eAAA;ClB04ED;AkBvzED;EAwEA;IAtIM,sBAAA;IACA,iBAAA;IACA,uBAAA;GlBy3EH;EkBrvEH;IA/HM,sBAAA;IACA,YAAA;IACA,uBAAA;GlBu3EH;EkB1vEH;IAxHM,sBAAA;GlBq3EH;EkB7vEH;IApHM,sBAAA;IACA,uBAAA;GlBo3EH;EkBjwEH;;;IA9GQ,YAAA;GlBo3EL;EkBtwEH;IAxGM,YAAA;GlBi3EH;EkBzwEH;IApGM,iBAAA;IACA,uBAAA;GlBg3EH;EkB7wEH;;IA5FM,sBAAA;IACA,cAAA;IACA,iBAAA;IACA,uBAAA;GlB62EH;EkBpxEH;;IAtFQ,gBAAA;GlB82EL;EkBxxEH;;IAjFM,mBAAA;IACA,eAAA;GlB62EH;EkB7xEH;IA3EM,OAAA;GlB22EH;CACF;AkBj2ED;;;;EASI,cAAA;EACA,iBAAA;EACA,iBAAA;ClB81EH;AkBz2ED;;EAiBI,iBAAA;ClB41EH;AkB72ED;EJthBE,mBAAA;EACA,oBAAA;Cds4FD;AkB10EC;EAyBF;IAnCM,kBAAA;IACA,iBAAA;IACA,iBAAA;GlBw1EH;CACF;AkBx3ED;EAwCI,YAAA;ClBm1EH;AkBr0EC;EAUF;IAdQ,kBAAA;IACA,gBAAA;GlB60EL;CACF;AkBn0EC;EAEF;IANQ,iBAAA;IACA,gBAAA;GlB20EL;CACF;AoBp6FD;EACE,sBAAA;EACA,iBAAA;EACA,oBAAA;EACA,mBAAA;EACA,uBAAA;EACA,+BAAA;MAAA,2BAAA;EACA,gBAAA;EACA,uBAAA;EACA,8BAAA;EACA,oBAAA;EC0CA,kBAAA;EACA,gBAAA;EACA,wBAAA;EACA,mBAAA;EhB+JA,0BAAA;EACG,uBAAA;EACC,sBAAA;EACI,kBAAA;CL+tFT;AoBv6FG;;;;;;EdnBF,2CAAA;EACA,qBAAA;CNk8FD;AoB16FC;;;EAGE,YAAA;EACA,sBAAA;CpB46FH;AoBz6FC;;EAEE,WAAA;EACA,uBAAA;Ef2BF,yDAAA;EACQ,iDAAA;CLi5FT;AoBz6FC;;;EAGE,oBAAA;EE7CF,cAAA;EAGA,0BAAA;EjB8DA,yBAAA;EACQ,iBAAA;CL05FT;AoBz6FG;;EAEE,qBAAA;CpB26FL;AoBl6FD;EC3DE,YAAA;EACA,uBAAA;EACA,mBAAA;CrBg+FD;AqB99FC;;EAEE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBg+FP;AqB99FC;EACE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBg+FP;AqB99FC;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBg+FP;AqB99FG;;;;;;;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBs+FT;AqBn+FC;;;EAGE,uBAAA;CrBq+FH;AqBh+FG;;;;;;;;;EAGE,uBAAA;EACI,mBAAA;CrBw+FT;AoBv9FD;ECZI,YAAA;EACA,uBAAA;CrBs+FH;AoBx9FD;EC9DE,YAAA;EACA,0BAAA;EACA,sBAAA;CrByhGD;AqBvhGC;;EAEE,YAAA;EACA,0BAAA;EACI,sBAAA;CrByhGP;AqBvhGC;EACE,YAAA;EACA,0BAAA;EACI,sBAAA;CrByhGP;AqBvhGC;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrByhGP;AqBvhGG;;;;;;;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrB+hGT;AqB5hGC;;;EAGE,uBAAA;CrB8hGH;AqBzhGG;;;;;;;;;EAGE,0BAAA;EACI,sBAAA;CrBiiGT;AoB7gGD;ECfI,eAAA;EACA,uBAAA;CrB+hGH;AoB7gGD;EClEE,YAAA;EACA,0BAAA;EACA,sBAAA;CrBklGD;AqBhlGC;;EAEE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBklGP;AqBhlGC;EACE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBklGP;AqBhlGC;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBklGP;AqBhlGG;;;;;;;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBwlGT;AqBrlGC;;;EAGE,uBAAA;CrBulGH;AqBllGG;;;;;;;;;EAGE,0BAAA;EACI,sBAAA;CrB0lGT;AoBlkGD;ECnBI,eAAA;EACA,uBAAA;CrBwlGH;AoBlkGD;ECtEE,YAAA;EACA,0BAAA;EACA,sBAAA;CrB2oGD;AqBzoGC;;EAEE,YAAA;EACA,0BAAA;EACI,sBAAA;CrB2oGP;AqBzoGC;EACE,YAAA;EACA,0BAAA;EACI,sBAAA;CrB2oGP;AqBzoGC;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrB2oGP;AqBzoGG;;;;;;;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBipGT;AqB9oGC;;;EAGE,uBAAA;CrBgpGH;AqB3oGG;;;;;;;;;EAGE,0BAAA;EACI,sBAAA;CrBmpGT;AoBvnGD;ECvBI,eAAA;EACA,uBAAA;CrBipGH;AoBvnGD;EC1EE,YAAA;EACA,0BAAA;EACA,sBAAA;CrBosGD;AqBlsGC;;EAEE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBosGP;AqBlsGC;EACE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBosGP;AqBlsGC;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBosGP;AqBlsGG;;;;;;;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrB0sGT;AqBvsGC;;;EAGE,uBAAA;CrBysGH;AqBpsGG;;;;;;;;;EAGE,0BAAA;EACI,sBAAA;CrB4sGT;AoB5qGD;EC3BI,eAAA;EACA,uBAAA;CrB0sGH;AoB5qGD;EC9EE,YAAA;EACA,0BAAA;EACA,sBAAA;CrB6vGD;AqB3vGC;;EAEE,YAAA;EACA,0BAAA;EACI,sBAAA;CrB6vGP;AqB3vGC;EACE,YAAA;EACA,0BAAA;EACI,sBAAA;CrB6vGP;AqB3vGC;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrB6vGP;AqB3vGG;;;;;;;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBmwGT;AqBhwGC;;;EAGE,uBAAA;CrBkwGH;AqB7vGG;;;;;;;;;EAGE,0BAAA;EACI,sBAAA;CrBqwGT;AoBjuGD;EC/BI,eAAA;EACA,uBAAA;CrBmwGH;AoB5tGD;EACE,eAAA;EACA,oBAAA;EACA,iBAAA;CpB8tGD;AoB5tGC;;;;;EAKE,8BAAA;EfnCF,yBAAA;EACQ,iBAAA;CLkwGT;AoB7tGC;;;;EAIE,0BAAA;CpB+tGH;AoB7tGC;;EAEE,eAAA;EACA,2BAAA;EACA,8BAAA;CpB+tGH;AoB3tGG;;;;EAEE,eAAA;EACA,sBAAA;CpB+tGL;AoBttGD;;ECxEE,mBAAA;EACA,gBAAA;EACA,uBAAA;EACA,mBAAA;CrBkyGD;AoBztGD;;EC5EE,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;CrByyGD;AoB5tGD;;EChFE,iBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;CrBgzGD;AoB3tGD;EACE,eAAA;EACA,YAAA;CpB6tGD;AoBztGD;EACE,gBAAA;CpB2tGD;AoBptGC;;;EACE,YAAA;CpBwtGH;AuBl3GD;EACE,WAAA;ElBoLA,yCAAA;EACK,oCAAA;EACG,iCAAA;CLisGT;AuBr3GC;EACE,WAAA;CvBu3GH;AuBn3GD;EACE,cAAA;CvBq3GD;AuBn3GC;EAAY,eAAA;CvBs3Gb;AuBr3GC;EAAY,mBAAA;CvBw3Gb;AuBv3GC;EAAY,yBAAA;CvB03Gb;AuBv3GD;EACE,mBAAA;EACA,UAAA;EACA,iBAAA;ElBuKA,gDAAA;EACQ,2CAAA;KAAA,wCAAA;EAOR,mCAAA;EACQ,8BAAA;KAAA,2BAAA;EAGR,yCAAA;EACQ,oCAAA;KAAA,iCAAA;CL2sGT;AwBr5GD;EACE,sBAAA;EACA,SAAA;EACA,UAAA;EACA,iBAAA;EACA,uBAAA;EACA,uBAAA;EACA,yBAAA;EACA,oCAAA;EACA,mCAAA;CxBu5GD;AwBn5GD;;EAEE,mBAAA;CxBq5GD;AwBj5GD;EACE,WAAA;CxBm5GD;AwB/4GD;EACE,mBAAA;EACA,UAAA;EACA,QAAA;EACA,cAAA;EACA,cAAA;EACA,YAAA;EACA,iBAAA;EACA,eAAA;EACA,gBAAA;EACA,iBAAA;EACA,gBAAA;EACA,iBAAA;EACA,uBAAA;EACA,uBAAA;EACA,sCAAA;EACA,mBAAA;EnBsBA,oDAAA;EACQ,4CAAA;EmBrBR,qCAAA;UAAA,6BAAA;CxBk5GD;AwB74GC;EACE,SAAA;EACA,WAAA;CxB+4GH;AwBx6GD;ECzBE,YAAA;EACA,cAAA;EACA,iBAAA;EACA,0BAAA;CzBo8GD;AwB96GD;EAmCI,eAAA;EACA,kBAAA;EACA,YAAA;EACA,oBAAA;EACA,wBAAA;EACA,eAAA;EACA,oBAAA;CxB84GH;AwBx4GC;;EAEE,sBAAA;EACA,eAAA;EACA,0BAAA;CxB04GH;AwBp4GC;;;EAGE,YAAA;EACA,sBAAA;EACA,WAAA;EACA,0BAAA;CxBs4GH;AwB73GC;;;EAGE,eAAA;CxB+3GH;AwB33GC;;EAEE,sBAAA;EACA,8BAAA;EACA,uBAAA;EE3GF,oEAAA;EF6GE,oBAAA;CxB63GH;AwBx3GD;EAGI,eAAA;CxBw3GH;AwB33GD;EAQI,WAAA;CxBs3GH;AwB92GD;EACE,WAAA;EACA,SAAA;CxBg3GD;AwBx2GD;EACE,QAAA;EACA,YAAA;CxB02GD;AwBt2GD;EACE,eAAA;EACA,kBAAA;EACA,gBAAA;EACA,wBAAA;EACA,eAAA;EACA,oBAAA;CxBw2GD;AwBp2GD;EACE,gBAAA;EACA,QAAA;EACA,SAAA;EACA,UAAA;EACA,OAAA;EACA,aAAA;CxBs2GD;AwBl2GD;EACE,SAAA;EACA,WAAA;CxBo2GD;AwB51GD;;EAII,cAAA;EACA,0BAAA;EACA,4BAAA;EACA,YAAA;CxB41GH;AwBn2GD;;EAWI,UAAA;EACA,aAAA;EACA,mBAAA;CxB41GH;AwBv0GD;EAXE;IApEA,WAAA;IACA,SAAA;GxB05GC;EwBv1GD;IA1DA,QAAA;IACA,YAAA;GxBo5GC;CACF;A2BpiHD;;EAEE,mBAAA;EACA,sBAAA;EACA,uBAAA;C3BsiHD;A2B1iHD;;EAMI,mBAAA;EACA,YAAA;C3BwiHH;A2BtiHG;;;;;;;;EAIE,WAAA;C3B4iHL;A2BtiHD;;;;EAKI,kBAAA;C3BuiHH;A2BliHD;EACE,kBAAA;C3BoiHD;A2BriHD;;;EAOI,YAAA;C3BmiHH;A2B1iHD;;;EAYI,iBAAA;C3BmiHH;A2B/hHD;EACE,iBAAA;C3BiiHD;A2B7hHD;EACE,eAAA;C3B+hHD;A2B9hHC;EClDA,8BAAA;EACG,2BAAA;C5BmlHJ;A2B7hHD;;EC/CE,6BAAA;EACG,0BAAA;C5BglHJ;A2B5hHD;EACE,YAAA;C3B8hHD;A2B5hHD;EACE,iBAAA;C3B8hHD;A2B5hHD;;ECnEE,8BAAA;EACG,2BAAA;C5BmmHJ;A2B3hHD;ECjEE,6BAAA;EACG,0BAAA;C5B+lHJ;A2B1hHD;;EAEE,WAAA;C3B4hHD;A2B3gHD;EACE,kBAAA;EACA,mBAAA;C3B6gHD;A2B3gHD;EACE,mBAAA;EACA,oBAAA;C3B6gHD;A2BxgHD;EtB/CE,yDAAA;EACQ,iDAAA;CL0jHT;A2BxgHC;EtBnDA,yBAAA;EACQ,iBAAA;CL8jHT;A2BrgHD;EACE,eAAA;C3BugHD;A2BpgHD;EACE,wBAAA;EACA,uBAAA;C3BsgHD;A2BngHD;EACE,wBAAA;C3BqgHD;A2B9/GD;;;EAII,eAAA;EACA,YAAA;EACA,YAAA;EACA,gBAAA;C3B+/GH;A2BtgHD;EAcM,YAAA;C3B2/GL;A2BzgHD;;;;EAsBI,iBAAA;EACA,eAAA;C3By/GH;A2Bp/GC;EACE,iBAAA;C3Bs/GH;A2Bp/GC;EC3KA,6BAAA;EACC,4BAAA;EAOD,8BAAA;EACC,6BAAA;C5B4pHF;A2Bt/GC;EC/KA,2BAAA;EACC,0BAAA;EAOD,gCAAA;EACC,+BAAA;C5BkqHF;A2Bv/GD;EACE,iBAAA;C3By/GD;A2Bv/GD;;EC/KE,8BAAA;EACC,6BAAA;C5B0qHF;A2Bt/GD;EC7LE,2BAAA;EACC,0BAAA;C5BsrHF;A2Bl/GD;EACE,eAAA;EACA,YAAA;EACA,oBAAA;EACA,0BAAA;C3Bo/GD;A2Bx/GD;;EAOI,YAAA;EACA,oBAAA;EACA,UAAA;C3Bq/GH;A2B9/GD;EAYI,YAAA;C3Bq/GH;A2BjgHD;EAgBI,WAAA;C3Bo/GH;A2Bn+GD;;;;EAKM,mBAAA;EACA,uBAAA;EACA,qBAAA;C3Bo+GL;A6B9sHD;EACE,mBAAA;EACA,eAAA;EACA,0BAAA;C7BgtHD;A6B7sHC;EACE,YAAA;EACA,gBAAA;EACA,iBAAA;C7B+sHH;A6BxtHD;EAeI,mBAAA;EACA,WAAA;EAKA,YAAA;EAEA,YAAA;EACA,iBAAA;C7BusHH;A6BrsHG;EACE,WAAA;C7BusHL;A6B7rHD;;;EV0BE,aAAA;EACA,mBAAA;EACA,gBAAA;EACA,uBAAA;EACA,mBAAA;CnBwqHD;AmBtqHC;;;EACE,aAAA;EACA,kBAAA;CnB0qHH;AmBvqHC;;;;;;EAEE,aAAA;CnB6qHH;A6B/sHD;;;EVqBE,aAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;CnB+rHD;AmB7rHC;;;EACE,aAAA;EACA,kBAAA;CnBisHH;AmB9rHC;;;;;;EAEE,aAAA;CnBosHH;A6B7tHD;;;EAGE,oBAAA;C7B+tHD;A6B7tHC;;;EACE,iBAAA;C7BiuHH;A6B7tHD;;EAEE,UAAA;EACA,oBAAA;EACA,uBAAA;C7B+tHD;A6B1tHD;EACE,kBAAA;EACA,gBAAA;EACA,oBAAA;EACA,eAAA;EACA,eAAA;EACA,mBAAA;EACA,0BAAA;EACA,uBAAA;EACA,mBAAA;C7B4tHD;A6BztHC;EACE,kBAAA;EACA,gBAAA;EACA,mBAAA;C7B2tHH;A6BztHC;EACE,mBAAA;EACA,gBAAA;EACA,mBAAA;C7B2tHH;A6B/uHD;;EA0BI,cAAA;C7BytHH;A6BptHD;;;;;;;EDpGE,8BAAA;EACG,2BAAA;C5Bi0HJ;A6BrtHD;EACE,gBAAA;C7ButHD;A6BrtHD;;;;;;;EDxGE,6BAAA;EACG,0BAAA;C5Bs0HJ;A6BttHD;EACE,eAAA;C7BwtHD;A6BntHD;EACE,mBAAA;EAGA,aAAA;EACA,oBAAA;C7BmtHD;A6BxtHD;EAUI,mBAAA;C7BitHH;A6B3tHD;EAYM,kBAAA;C7BktHL;A6B/sHG;;;EAGE,WAAA;C7BitHL;A6B5sHC;;EAGI,mBAAA;C7B6sHL;A6B1sHC;;EAGI,WAAA;EACA,kBAAA;C7B2sHL;A8B12HD;EACE,iBAAA;EACA,gBAAA;EACA,iBAAA;C9B42HD;A8B/2HD;EAOI,mBAAA;EACA,eAAA;C9B22HH;A8Bn3HD;EAWM,mBAAA;EACA,eAAA;EACA,mBAAA;C9B22HL;A8B12HK;;EAEE,sBAAA;EACA,0BAAA;C9B42HP;A8Bv2HG;EACE,eAAA;C9By2HL;A8Bv2HK;;EAEE,eAAA;EACA,sBAAA;EACA,8BAAA;EACA,oBAAA;C9By2HP;A8Bl2HG;;;EAGE,0BAAA;EACA,sBAAA;C9Bo2HL;A8B74HD;ELHE,YAAA;EACA,cAAA;EACA,iBAAA;EACA,0BAAA;CzBm5HD;A8Bn5HD;EA0DI,gBAAA;C9B41HH;A8Bn1HD;EACE,8BAAA;C9Bq1HD;A8Bt1HD;EAGI,YAAA;EAEA,oBAAA;C9Bq1HH;A8B11HD;EASM,kBAAA;EACA,wBAAA;EACA,8BAAA;EACA,2BAAA;C9Bo1HL;A8Bn1HK;EACE,mCAAA;C9Bq1HP;A8B/0HK;;;EAGE,eAAA;EACA,uBAAA;EACA,uBAAA;EACA,iCAAA;EACA,gBAAA;C9Bi1HP;A8B50HC;EAqDA,YAAA;EA8BA,iBAAA;C9B6vHD;A8Bh1HC;EAwDE,YAAA;C9B2xHH;A8Bn1HC;EA0DI,mBAAA;EACA,mBAAA;C9B4xHL;A8Bv1HC;EAgEE,UAAA;EACA,WAAA;C9B0xHH;A8B9wHD;EA0DA;IAjEM,oBAAA;IACA,UAAA;G9ByxHH;E8BztHH;IA9DQ,iBAAA;G9B0xHL;CACF;A8Bp2HC;EAuFE,gBAAA;EACA,mBAAA;C9BgxHH;A8Bx2HC;;;EA8FE,uBAAA;C9B+wHH;A8BjwHD;EA2BA;IApCM,8BAAA;IACA,2BAAA;G9B8wHH;E8B3uHH;;;IA9BM,0BAAA;G9B8wHH;CACF;A8B/2HD;EAEI,YAAA;C9Bg3HH;A8Bl3HD;EAMM,mBAAA;C9B+2HL;A8Br3HD;EASM,iBAAA;C9B+2HL;A8B12HK;;;EAGE,YAAA;EACA,0BAAA;C9B42HP;A8Bp2HD;EAEI,YAAA;C9Bq2HH;A8Bv2HD;EAIM,gBAAA;EACA,eAAA;C9Bs2HL;A8B11HD;EACE,YAAA;C9B41HD;A8B71HD;EAII,YAAA;C9B41HH;A8Bh2HD;EAMM,mBAAA;EACA,mBAAA;C9B61HL;A8Bp2HD;EAYI,UAAA;EACA,WAAA;C9B21HH;A8B/0HD;EA0DA;IAjEM,oBAAA;IACA,UAAA;G9B01HH;E8B1xHH;IA9DQ,iBAAA;G9B21HL;CACF;A8Bn1HD;EACE,iBAAA;C9Bq1HD;A8Bt1HD;EAKI,gBAAA;EACA,mBAAA;C9Bo1HH;A8B11HD;;;EAYI,uBAAA;C9Bm1HH;A8Br0HD;EA2BA;IApCM,8BAAA;IACA,2BAAA;G9Bk1HH;E8B/yHH;;;IA9BM,0BAAA;G9Bk1HH;CACF;A8Bz0HD;EAEI,cAAA;C9B00HH;A8B50HD;EAKI,eAAA;C9B00HH;A8Bj0HD;EAEE,iBAAA;EF3OA,2BAAA;EACC,0BAAA;C5B8iIF;A+BxiID;EACE,mBAAA;EACA,iBAAA;EACA,oBAAA;EACA,8BAAA;C/B0iID;A+BliID;EA8nBA;IAhoBI,mBAAA;G/BwiID;CACF;A+BzhID;EAgnBA;IAlnBI,YAAA;G/B+hID;CACF;A+BjhID;EACE,oBAAA;EACA,oBAAA;EACA,mBAAA;EACA,kCAAA;EACA,2DAAA;UAAA,mDAAA;EAEA,kCAAA;C/BkhID;A+BhhIC;EACE,iBAAA;C/BkhIH;A+Bt/HD;EA6jBA;IArlBI,YAAA;IACA,cAAA;IACA,yBAAA;YAAA,iBAAA;G/BkhID;E+BhhIC;IACE,0BAAA;IACA,wBAAA;IACA,kBAAA;IACA,6BAAA;G/BkhIH;E+B/gIC;IACE,oBAAA;G/BihIH;E+B5gIC;;;IAGE,gBAAA;IACA,iBAAA;G/B8gIH;CACF;A+B1gID;;EAGI,kBAAA;C/B2gIH;A+BtgIC;EAmjBF;;IArjBM,kBAAA;G/B6gIH;CACF;A+BpgID;;;;EAII,oBAAA;EACA,mBAAA;C/BsgIH;A+BhgIC;EAgiBF;;;;IAniBM,gBAAA;IACA,eAAA;G/B0gIH;CACF;A+B9/HD;EACE,cAAA;EACA,sBAAA;C/BggID;A+B3/HD;EA8gBA;IAhhBI,iBAAA;G/BigID;CACF;A+B7/HD;;EAEE,gBAAA;EACA,SAAA;EACA,QAAA;EACA,cAAA;C/B+/HD;A+Bz/HD;EAggBA;;IAlgBI,iBAAA;G/BggID;CACF;A+B9/HD;EACE,OAAA;EACA,sBAAA;C/BggID;A+B9/HD;EACE,UAAA;EACA,iBAAA;EACA,sBAAA;C/BggID;A+B1/HD;EACE,YAAA;EACA,mBAAA;EACA,gBAAA;EACA,kBAAA;EACA,aAAA;C/B4/HD;A+B1/HC;;EAEE,sBAAA;C/B4/HH;A+BrgID;EAaI,eAAA;C/B2/HH;A+Bl/HD;EALI;;IAEE,mBAAA;G/B0/HH;CACF;A+Bh/HD;EACE,mBAAA;EACA,aAAA;EACA,mBAAA;EACA,kBAAA;EC9LA,gBAAA;EACA,mBAAA;ED+LA,8BAAA;EACA,uBAAA;EACA,8BAAA;EACA,mBAAA;C/Bm/HD;A+B/+HC;EACE,WAAA;C/Bi/HH;A+B//HD;EAmBI,eAAA;EACA,YAAA;EACA,YAAA;EACA,mBAAA;C/B++HH;A+BrgID;EAyBI,gBAAA;C/B++HH;A+Bz+HD;EAqbA;IAvbI,cAAA;G/B++HD;CACF;A+Bt+HD;EACE,oBAAA;C/Bw+HD;A+Bz+HD;EAII,kBAAA;EACA,qBAAA;EACA,kBAAA;C/Bw+HH;A+B58HC;EA2YF;IAjaM,iBAAA;IACA,YAAA;IACA,YAAA;IACA,cAAA;IACA,8BAAA;IACA,UAAA;IACA,yBAAA;YAAA,iBAAA;G/Bs+HH;E+B3kHH;;IAxZQ,2BAAA;G/Bu+HL;E+B/kHH;IArZQ,kBAAA;G/Bu+HL;E+Bt+HK;;IAEE,uBAAA;G/Bw+HP;CACF;A+Bt9HD;EA+XA;IA1YI,YAAA;IACA,UAAA;G/Bq+HD;E+B5lHH;IAtYM,YAAA;G/Bq+HH;E+B/lHH;IApYQ,kBAAA;IACA,qBAAA;G/Bs+HL;CACF;A+B39HD;EACE,mBAAA;EACA,oBAAA;EACA,mBAAA;EACA,kCAAA;EACA,qCAAA;E1B9NA,6FAAA;EACQ,qFAAA;E2B/DR,gBAAA;EACA,mBAAA;ChC4vID;AkBtuHD;EAwEA;IAtIM,sBAAA;IACA,iBAAA;IACA,uBAAA;GlBwyHH;EkBpqHH;IA/HM,sBAAA;IACA,YAAA;IACA,uBAAA;GlBsyHH;EkBzqHH;IAxHM,sBAAA;GlBoyHH;EkB5qHH;IApHM,sBAAA;IACA,uBAAA;GlBmyHH;EkBhrHH;;;IA9GQ,YAAA;GlBmyHL;EkBrrHH;IAxGM,YAAA;GlBgyHH;EkBxrHH;IApGM,iBAAA;IACA,uBAAA;GlB+xHH;EkB5rHH;;IA5FM,sBAAA;IACA,cAAA;IACA,iBAAA;IACA,uBAAA;GlB4xHH;EkBnsHH;;IAtFQ,gBAAA;GlB6xHL;EkBvsHH;;IAjFM,mBAAA;IACA,eAAA;GlB4xHH;EkB5sHH;IA3EM,OAAA;GlB0xHH;CACF;A+BpgIC;EAmWF;IAzWM,mBAAA;G/B8gIH;E+B5gIG;IACE,iBAAA;G/B8gIL;CACF;A+B7/HD;EAoVA;IA5VI,YAAA;IACA,UAAA;IACA,eAAA;IACA,gBAAA;IACA,eAAA;IACA,kBAAA;I1BzPF,yBAAA;IACQ,iBAAA;GLmwIP;CACF;A+BngID;EACE,cAAA;EHpUA,2BAAA;EACC,0BAAA;C5B00IF;A+BngID;EACE,iBAAA;EHzUA,6BAAA;EACC,4BAAA;EAOD,8BAAA;EACC,6BAAA;C5By0IF;A+B//HD;EChVE,gBAAA;EACA,mBAAA;ChCk1ID;A+BhgIC;ECnVA,iBAAA;EACA,oBAAA;ChCs1ID;A+BjgIC;ECtVA,iBAAA;EACA,oBAAA;ChC01ID;A+B3/HD;EChWE,iBAAA;EACA,oBAAA;ChC81ID;A+Bv/HD;EAsSA;IA1SI,YAAA;IACA,kBAAA;IACA,mBAAA;G/B+/HD;CACF;A+Bl+HD;EAhBE;IExWA,uBAAA;GjC81IC;E+Br/HD;IE5WA,wBAAA;IF8WE,oBAAA;G/Bu/HD;E+Bz/HD;IAKI,gBAAA;G/Bu/HH;CACF;A+B9+HD;EACE,0BAAA;EACA,sBAAA;C/Bg/HD;A+Bl/HD;EAKI,YAAA;C/Bg/HH;A+B/+HG;;EAEE,eAAA;EACA,8BAAA;C/Bi/HL;A+B1/HD;EAcI,YAAA;C/B++HH;A+B7/HD;EAmBM,YAAA;C/B6+HL;A+B3+HK;;EAEE,YAAA;EACA,8BAAA;C/B6+HP;A+Bz+HK;;;EAGE,YAAA;EACA,0BAAA;C/B2+HP;A+Bv+HK;;;EAGE,YAAA;EACA,8BAAA;C/By+HP;A+BjhID;EA8CI,mBAAA;C/Bs+HH;A+Br+HG;;EAEE,uBAAA;C/Bu+HL;A+BxhID;EAoDM,uBAAA;C/Bu+HL;A+B3hID;;EA0DI,sBAAA;C/Bq+HH;A+B99HK;;;EAGE,0BAAA;EACA,YAAA;C/Bg+HP;A+B/7HC;EAoKF;IA7LU,YAAA;G/B49HP;E+B39HO;;IAEE,YAAA;IACA,8BAAA;G/B69HT;E+Bz9HO;;;IAGE,YAAA;IACA,0BAAA;G/B29HT;E+Bv9HO;;;IAGE,YAAA;IACA,8BAAA;G/By9HT;CACF;A+B3jID;EA8GI,YAAA;C/Bg9HH;A+B/8HG;EACE,YAAA;C/Bi9HL;A+BjkID;EAqHI,YAAA;C/B+8HH;A+B98HG;;EAEE,YAAA;C/Bg9HL;A+B58HK;;;;EAEE,YAAA;C/Bg9HP;A+Bx8HD;EACE,uBAAA;EACA,sBAAA;C/B08HD;A+B58HD;EAKI,eAAA;C/B08HH;A+Bz8HG;;EAEE,YAAA;EACA,8BAAA;C/B28HL;A+Bp9HD;EAcI,eAAA;C/By8HH;A+Bv9HD;EAmBM,eAAA;C/Bu8HL;A+Br8HK;;EAEE,YAAA;EACA,8BAAA;C/Bu8HP;A+Bn8HK;;;EAGE,YAAA;EACA,0BAAA;C/Bq8HP;A+Bj8HK;;;EAGE,YAAA;EACA,8BAAA;C/Bm8HP;A+B3+HD;EA+CI,mBAAA;C/B+7HH;A+B97HG;;EAEE,uBAAA;C/Bg8HL;A+Bl/HD;EAqDM,uBAAA;C/Bg8HL;A+Br/HD;;EA2DI,sBAAA;C/B87HH;A+Bx7HK;;;EAGE,0BAAA;EACA,YAAA;C/B07HP;A+Bn5HC;EAwBF;IAvDU,sBAAA;G/Bs7HP;E+B/3HH;IApDU,0BAAA;G/Bs7HP;E+Bl4HH;IAjDU,eAAA;G/Bs7HP;E+Br7HO;;IAEE,YAAA;IACA,8BAAA;G/Bu7HT;E+Bn7HO;;;IAGE,YAAA;IACA,0BAAA;G/Bq7HT;E+Bj7HO;;;IAGE,YAAA;IACA,8BAAA;G/Bm7HT;CACF;A+B3hID;EA+GI,eAAA;C/B+6HH;A+B96HG;EACE,YAAA;C/Bg7HL;A+BjiID;EAsHI,eAAA;C/B86HH;A+B76HG;;EAEE,YAAA;C/B+6HL;A+B36HK;;;;EAEE,YAAA;C/B+6HP;AkCzjJD;EACE,kBAAA;EACA,oBAAA;EACA,iBAAA;EACA,0BAAA;EACA,mBAAA;ClC2jJD;AkChkJD;EAQI,sBAAA;ClC2jJH;AkCnkJD;EAWM,kBAAA;EACA,eAAA;EACA,YAAA;ClC2jJL;AkCxkJD;EAkBI,eAAA;ClCyjJH;AmC7kJD;EACE,sBAAA;EACA,gBAAA;EACA,eAAA;EACA,mBAAA;CnC+kJD;AmCnlJD;EAOI,gBAAA;CnC+kJH;AmCtlJD;;EAUM,mBAAA;EACA,YAAA;EACA,kBAAA;EACA,wBAAA;EACA,sBAAA;EACA,eAAA;EACA,uBAAA;EACA,uBAAA;EACA,kBAAA;CnCglJL;AmC9kJG;;EAGI,eAAA;EPXN,+BAAA;EACG,4BAAA;C5B2lJJ;AmC7kJG;;EPvBF,gCAAA;EACG,6BAAA;C5BwmJJ;AmCxkJG;;;;EAEE,WAAA;EACA,eAAA;EACA,0BAAA;EACA,mBAAA;CnC4kJL;AmCtkJG;;;;;;EAGE,WAAA;EACA,YAAA;EACA,0BAAA;EACA,sBAAA;EACA,gBAAA;CnC2kJL;AmCloJD;;;;;;EAkEM,eAAA;EACA,uBAAA;EACA,mBAAA;EACA,oBAAA;CnCwkJL;AmC/jJD;;EC3EM,mBAAA;EACA,gBAAA;EACA,uBAAA;CpC8oJL;AoC5oJG;;ERKF,+BAAA;EACG,4BAAA;C5B2oJJ;AoC3oJG;;ERTF,gCAAA;EACG,6BAAA;C5BwpJJ;AmC1kJD;;EChFM,kBAAA;EACA,gBAAA;EACA,iBAAA;CpC8pJL;AoC5pJG;;ERKF,+BAAA;EACG,4BAAA;C5B2pJJ;AoC3pJG;;ERTF,gCAAA;EACG,6BAAA;C5BwqJJ;AqC3qJD;EACE,gBAAA;EACA,eAAA;EACA,iBAAA;EACA,mBAAA;CrC6qJD;AqCjrJD;EAOI,gBAAA;CrC6qJH;AqCprJD;;EAUM,sBAAA;EACA,kBAAA;EACA,uBAAA;EACA,uBAAA;EACA,oBAAA;CrC8qJL;AqC5rJD;;EAmBM,sBAAA;EACA,0BAAA;CrC6qJL;AqCjsJD;;EA2BM,aAAA;CrC0qJL;AqCrsJD;;EAkCM,YAAA;CrCuqJL;AqCzsJD;;;;EA2CM,eAAA;EACA,uBAAA;EACA,oBAAA;CrCoqJL;AsCltJD;EACE,gBAAA;EACA,wBAAA;EACA,eAAA;EACA,kBAAA;EACA,eAAA;EACA,YAAA;EACA,mBAAA;EACA,oBAAA;EACA,yBAAA;EACA,qBAAA;CtCotJD;AsChtJG;;EAEE,YAAA;EACA,sBAAA;EACA,gBAAA;CtCktJL;AsC7sJC;EACE,cAAA;CtC+sJH;AsC3sJC;EACE,mBAAA;EACA,UAAA;CtC6sJH;AsCtsJD;ECtCE,0BAAA;CvC+uJD;AuC5uJG;;EAEE,0BAAA;CvC8uJL;AsCzsJD;EC1CE,0BAAA;CvCsvJD;AuCnvJG;;EAEE,0BAAA;CvCqvJL;AsC5sJD;EC9CE,0BAAA;CvC6vJD;AuC1vJG;;EAEE,0BAAA;CvC4vJL;AsC/sJD;EClDE,0BAAA;CvCowJD;AuCjwJG;;EAEE,0BAAA;CvCmwJL;AsCltJD;ECtDE,0BAAA;CvC2wJD;AuCxwJG;;EAEE,0BAAA;CvC0wJL;AsCrtJD;EC1DE,0BAAA;CvCkxJD;AuC/wJG;;EAEE,0BAAA;CvCixJL;AwCnxJD;EACE,sBAAA;EACA,gBAAA;EACA,iBAAA;EACA,gBAAA;EACA,kBAAA;EACA,YAAA;EACA,eAAA;EACA,uBAAA;EACA,oBAAA;EACA,mBAAA;EACA,0BAAA;EACA,oBAAA;CxCqxJD;AwClxJC;EACE,cAAA;CxCoxJH;AwChxJC;EACE,mBAAA;EACA,UAAA;CxCkxJH;AwC/wJC;;EAEE,OAAA;EACA,iBAAA;CxCixJH;AwC5wJG;;EAEE,YAAA;EACA,sBAAA;EACA,gBAAA;CxC8wJL;AwCzwJC;;EAEE,eAAA;EACA,uBAAA;CxC2wJH;AwCxwJC;EACE,aAAA;CxC0wJH;AwCvwJC;EACE,kBAAA;CxCywJH;AwCtwJC;EACE,iBAAA;CxCwwJH;AyCl0JD;EACE,kBAAA;EACA,qBAAA;EACA,oBAAA;EACA,eAAA;EACA,0BAAA;CzCo0JD;AyCz0JD;;EASI,eAAA;CzCo0JH;AyC70JD;EAaI,oBAAA;EACA,gBAAA;EACA,iBAAA;CzCm0JH;AyCl1JD;EAmBI,0BAAA;CzCk0JH;AyC/zJC;;EAEE,mBAAA;EACA,mBAAA;EACA,oBAAA;CzCi0JH;AyC31JD;EA8BI,gBAAA;CzCg0JH;AyC9yJD;EACA;IAfI,kBAAA;IACA,qBAAA;GzCg0JD;EyC9zJC;;IAEE,mBAAA;IACA,oBAAA;GzCg0JH;EyCvzJH;;IAJM,gBAAA;GzC+zJH;CACF;A0C52JD;EACE,eAAA;EACA,aAAA;EACA,oBAAA;EACA,wBAAA;EACA,uBAAA;EACA,uBAAA;EACA,mBAAA;ErCiLA,4CAAA;EACK,uCAAA;EACG,oCAAA;CL8rJT;A0Cx3JD;;EAaI,kBAAA;EACA,mBAAA;C1C+2JH;A0C32JC;;;EAGE,sBAAA;C1C62JH;A0Cl4JD;EA0BI,aAAA;EACA,eAAA;C1C22JH;A2Cp4JD;EACE,cAAA;EACA,oBAAA;EACA,8BAAA;EACA,mBAAA;C3Cs4JD;A2C14JD;EAQI,cAAA;EAEA,eAAA;C3Co4JH;A2C94JD;EAeI,kBAAA;C3Ck4JH;A2Cj5JD;;EAqBI,iBAAA;C3Cg4JH;A2Cr5JD;EAyBI,gBAAA;C3C+3JH;A2Cv3JD;;EAEE,oBAAA;C3Cy3JD;A2C33JD;;EAMI,mBAAA;EACA,UAAA;EACA,aAAA;EACA,eAAA;C3Cy3JH;A2Cj3JD;ECvDE,0BAAA;EACA,sBAAA;EACA,eAAA;C5C26JD;A2Ct3JD;EClDI,0BAAA;C5C26JH;A2Cz3JD;EC/CI,eAAA;C5C26JH;A2Cx3JD;EC3DE,0BAAA;EACA,sBAAA;EACA,eAAA;C5Cs7JD;A2C73JD;ECtDI,0BAAA;C5Cs7JH;A2Ch4JD;ECnDI,eAAA;C5Cs7JH;A2C/3JD;EC/DE,0BAAA;EACA,sBAAA;EACA,eAAA;C5Ci8JD;A2Cp4JD;EC1DI,0BAAA;C5Ci8JH;A2Cv4JD;ECvDI,eAAA;C5Ci8JH;A2Ct4JD;ECnEE,0BAAA;EACA,sBAAA;EACA,eAAA;C5C48JD;A2C34JD;EC9DI,0BAAA;C5C48JH;A2C94JD;EC3DI,eAAA;C5C48JH;A6C98JD;EACE;IAAQ,4BAAA;G7Ci9JP;E6Ch9JD;IAAQ,yBAAA;G7Cm9JP;CACF;A6Ch9JD;EACE;IAAQ,4BAAA;G7Cm9JP;E6Cl9JD;IAAQ,yBAAA;G7Cq9JP;CACF;A6Cx9JD;EACE;IAAQ,4BAAA;G7Cm9JP;E6Cl9JD;IAAQ,yBAAA;G7Cq9JP;CACF;A6C98JD;EACE,iBAAA;EACA,aAAA;EACA,oBAAA;EACA,0BAAA;EACA,mBAAA;ExCsCA,uDAAA;EACQ,+CAAA;CL26JT;A6C78JD;EACE,YAAA;EACA,UAAA;EACA,aAAA;EACA,gBAAA;EACA,kBAAA;EACA,YAAA;EACA,mBAAA;EACA,0BAAA;ExCyBA,uDAAA;EACQ,+CAAA;EAyHR,oCAAA;EACK,+BAAA;EACG,4BAAA;CL+zJT;A6C18JD;;ECCI,8MAAA;EACA,yMAAA;EACA,sMAAA;EDAF,mCAAA;UAAA,2BAAA;C7C88JD;A6Cv8JD;;ExC5CE,2DAAA;EACK,sDAAA;EACG,mDAAA;CLu/JT;A6Cp8JD;EErEE,0BAAA;C/C4gKD;A+CzgKC;EDgDE,8MAAA;EACA,yMAAA;EACA,sMAAA;C9C49JH;A6Cx8JD;EEzEE,0BAAA;C/CohKD;A+CjhKC;EDgDE,8MAAA;EACA,yMAAA;EACA,sMAAA;C9Co+JH;A6C58JD;EE7EE,0BAAA;C/C4hKD;A+CzhKC;EDgDE,8MAAA;EACA,yMAAA;EACA,sMAAA;C9C4+JH;A6Ch9JD;EEjFE,0BAAA;C/CoiKD;A+CjiKC;EDgDE,8MAAA;EACA,yMAAA;EACA,sMAAA;C9Co/JH;AgD5iKD;EAEE,iBAAA;ChD6iKD;AgD3iKC;EACE,cAAA;ChD6iKH;AgDziKD;;EAEE,QAAA;EACA,iBAAA;ChD2iKD;AgDxiKD;EACE,eAAA;ChD0iKD;AgDviKD;EACE,eAAA;ChDyiKD;AgDtiKC;EACE,gBAAA;ChDwiKH;AgDpiKD;;EAEE,mBAAA;ChDsiKD;AgDniKD;;EAEE,oBAAA;ChDqiKD;AgDliKD;;;EAGE,oBAAA;EACA,oBAAA;ChDoiKD;AgDjiKD;EACE,uBAAA;ChDmiKD;AgDhiKD;EACE,uBAAA;ChDkiKD;AgD9hKD;EACE,cAAA;EACA,mBAAA;ChDgiKD;AgD1hKD;EACE,gBAAA;EACA,iBAAA;ChD4hKD;AiDnlKD;EAEE,oBAAA;EACA,gBAAA;CjDolKD;AiD5kKD;EACE,mBAAA;EACA,eAAA;EACA,mBAAA;EAEA,oBAAA;EACA,uBAAA;EACA,uBAAA;CjD6kKD;AiD1kKC;ErB3BA,6BAAA;EACC,4BAAA;C5BwmKF;AiD3kKC;EACE,iBAAA;ErBvBF,gCAAA;EACC,+BAAA;C5BqmKF;AiDpkKD;;EAEE,YAAA;CjDskKD;AiDxkKD;;EAKI,YAAA;CjDukKH;AiDnkKC;;;;EAEE,sBAAA;EACA,YAAA;EACA,0BAAA;CjDukKH;AiDnkKD;EACE,YAAA;EACA,iBAAA;CjDqkKD;AiDhkKC;;;EAGE,0BAAA;EACA,eAAA;EACA,oBAAA;CjDkkKH;AiDvkKC;;;EASI,eAAA;CjDmkKL;AiD5kKC;;;EAYI,eAAA;CjDqkKL;AiDhkKC;;;EAGE,WAAA;EACA,YAAA;EACA,0BAAA;EACA,sBAAA;CjDkkKH;AiDxkKC;;;;;;;;;EAYI,eAAA;CjDukKL;AiDnlKC;;;EAeI,eAAA;CjDykKL;AkD3qKC;EACE,eAAA;EACA,0BAAA;ClD6qKH;AkD3qKG;;EAEE,eAAA;ClD6qKL;AkD/qKG;;EAKI,eAAA;ClD8qKP;AkD3qKK;;;;EAEE,eAAA;EACA,0BAAA;ClD+qKP;AkD7qKK;;;;;;EAGE,YAAA;EACA,0BAAA;EACA,sBAAA;ClDkrKP;AkDxsKC;EACE,eAAA;EACA,0BAAA;ClD0sKH;AkDxsKG;;EAEE,eAAA;ClD0sKL;AkD5sKG;;EAKI,eAAA;ClD2sKP;AkDxsKK;;;;EAEE,eAAA;EACA,0BAAA;ClD4sKP;AkD1sKK;;;;;;EAGE,YAAA;EACA,0BAAA;EACA,sBAAA;ClD+sKP;AkDruKC;EACE,eAAA;EACA,0BAAA;ClDuuKH;AkDruKG;;EAEE,eAAA;ClDuuKL;AkDzuKG;;EAKI,eAAA;ClDwuKP;AkDruKK;;;;EAEE,eAAA;EACA,0BAAA;ClDyuKP;AkDvuKK;;;;;;EAGE,YAAA;EACA,0BAAA;EACA,sBAAA;ClD4uKP;AkDlwKC;EACE,eAAA;EACA,0BAAA;ClDowKH;AkDlwKG;;EAEE,eAAA;ClDowKL;AkDtwKG;;EAKI,eAAA;ClDqwKP;AkDlwKK;;;;EAEE,eAAA;EACA,0BAAA;ClDswKP;AkDpwKK;;;;;;EAGE,YAAA;EACA,0BAAA;EACA,sBAAA;ClDywKP;AiDxqKD;EACE,cAAA;EACA,mBAAA;CjD0qKD;AiDxqKD;EACE,iBAAA;EACA,iBAAA;CjD0qKD;AmDpyKD;EACE,oBAAA;EACA,uBAAA;EACA,8BAAA;EACA,mBAAA;E9C0DA,kDAAA;EACQ,0CAAA;CL6uKT;AmDnyKD;EACE,cAAA;CnDqyKD;AmDhyKD;EACE,mBAAA;EACA,qCAAA;EvBpBA,6BAAA;EACC,4BAAA;C5BuzKF;AmDtyKD;EAMI,eAAA;CnDmyKH;AmD9xKD;EACE,cAAA;EACA,iBAAA;EACA,gBAAA;EACA,eAAA;CnDgyKD;AmDpyKD;;;;;EAWI,eAAA;CnDgyKH;AmD3xKD;EACE,mBAAA;EACA,0BAAA;EACA,2BAAA;EvBxCA,gCAAA;EACC,+BAAA;C5Bs0KF;AmDrxKD;;EAGI,iBAAA;CnDsxKH;AmDzxKD;;EAMM,oBAAA;EACA,iBAAA;CnDuxKL;AmDnxKG;;EAEI,cAAA;EvBvEN,6BAAA;EACC,4BAAA;C5B61KF;AmDjxKG;;EAEI,iBAAA;EvBvEN,gCAAA;EACC,+BAAA;C5B21KF;AmD1yKD;EvB1DE,2BAAA;EACC,0BAAA;C5Bu2KF;AmD7wKD;EAEI,oBAAA;CnD8wKH;AmD3wKD;EACE,oBAAA;CnD6wKD;AmDrwKD;;;EAII,iBAAA;CnDswKH;AmD1wKD;;;EAOM,mBAAA;EACA,oBAAA;CnDwwKL;AmDhxKD;;EvBzGE,6BAAA;EACC,4BAAA;C5B63KF;AmDrxKD;;;;EAmBQ,4BAAA;EACA,6BAAA;CnDwwKP;AmD5xKD;;;;;;;;EAwBU,4BAAA;CnD8wKT;AmDtyKD;;;;;;;;EA4BU,6BAAA;CnDoxKT;AmDhzKD;;EvBjGE,gCAAA;EACC,+BAAA;C5Bq5KF;AmDrzKD;;;;EAyCQ,+BAAA;EACA,gCAAA;CnDkxKP;AmD5zKD;;;;;;;;EA8CU,+BAAA;CnDwxKT;AmDt0KD;;;;;;;;EAkDU,gCAAA;CnD8xKT;AmDh1KD;;;;EA2DI,2BAAA;CnD2xKH;AmDt1KD;;EA+DI,cAAA;CnD2xKH;AmD11KD;;EAmEI,UAAA;CnD2xKH;AmD91KD;;;;;;;;;;;;EA0EU,eAAA;CnDkyKT;AmD52KD;;;;;;;;;;;;EA8EU,gBAAA;CnD4yKT;AmD13KD;;;;;;;;EAuFU,iBAAA;CnD6yKT;AmDp4KD;;;;;;;;EAgGU,iBAAA;CnD8yKT;AmD94KD;EAsGI,UAAA;EACA,iBAAA;CnD2yKH;AmDjyKD;EACE,oBAAA;CnDmyKD;AmDpyKD;EAKI,iBAAA;EACA,mBAAA;CnDkyKH;AmDxyKD;EASM,gBAAA;CnDkyKL;AmD3yKD;EAcI,iBAAA;CnDgyKH;AmD9yKD;;EAkBM,2BAAA;CnDgyKL;AmDlzKD;EAuBI,cAAA;CnD8xKH;AmDrzKD;EAyBM,8BAAA;CnD+xKL;AmDxxKD;EC1PE,mBAAA;CpDqhLD;AoDnhLC;EACE,eAAA;EACA,0BAAA;EACA,mBAAA;CpDqhLH;AoDxhLC;EAMI,uBAAA;CpDqhLL;AoD3hLC;EASI,eAAA;EACA,0BAAA;CpDqhLL;AoDlhLC;EAEI,0BAAA;CpDmhLL;AmDvyKD;EC7PE,sBAAA;CpDuiLD;AoDriLC;EACE,YAAA;EACA,0BAAA;EACA,sBAAA;CpDuiLH;AoD1iLC;EAMI,0BAAA;CpDuiLL;AoD7iLC;EASI,eAAA;EACA,uBAAA;CpDuiLL;AoDpiLC;EAEI,6BAAA;CpDqiLL;AmDtzKD;EChQE,sBAAA;CpDyjLD;AoDvjLC;EACE,eAAA;EACA,0BAAA;EACA,sBAAA;CpDyjLH;AoD5jLC;EAMI,0BAAA;CpDyjLL;AoD/jLC;EASI,eAAA;EACA,0BAAA;CpDyjLL;AoDtjLC;EAEI,6BAAA;CpDujLL;AmDr0KD;ECnQE,sBAAA;CpD2kLD;AoDzkLC;EACE,eAAA;EACA,0BAAA;EACA,sBAAA;CpD2kLH;AoD9kLC;EAMI,0BAAA;CpD2kLL;AoDjlLC;EASI,eAAA;EACA,0BAAA;CpD2kLL;AoDxkLC;EAEI,6BAAA;CpDykLL;AmDp1KD;ECtQE,sBAAA;CpD6lLD;AoD3lLC;EACE,eAAA;EACA,0BAAA;EACA,sBAAA;CpD6lLH;AoDhmLC;EAMI,0BAAA;CpD6lLL;AoDnmLC;EASI,eAAA;EACA,0BAAA;CpD6lLL;AoD1lLC;EAEI,6BAAA;CpD2lLL;AmDn2KD;ECzQE,sBAAA;CpD+mLD;AoD7mLC;EACE,eAAA;EACA,0BAAA;EACA,sBAAA;CpD+mLH;AoDlnLC;EAMI,0BAAA;CpD+mLL;AoDrnLC;EASI,eAAA;EACA,0BAAA;CpD+mLL;AoD5mLC;EAEI,6BAAA;CpD6mLL;AqD7nLD;EACE,mBAAA;EACA,eAAA;EACA,UAAA;EACA,WAAA;EACA,iBAAA;CrD+nLD;AqDpoLD;;;;;EAYI,mBAAA;EACA,OAAA;EACA,QAAA;EACA,UAAA;EACA,aAAA;EACA,YAAA;EACA,UAAA;CrD+nLH;AqD1nLD;EACE,uBAAA;CrD4nLD;AqDxnLD;EACE,oBAAA;CrD0nLD;AsDrpLD;EACE,iBAAA;EACA,cAAA;EACA,oBAAA;EACA,0BAAA;EACA,0BAAA;EACA,mBAAA;EjDwDA,wDAAA;EACQ,gDAAA;CLgmLT;AsD/pLD;EASI,mBAAA;EACA,kCAAA;CtDypLH;AsDppLD;EACE,cAAA;EACA,mBAAA;CtDspLD;AsDppLD;EACE,aAAA;EACA,mBAAA;CtDspLD;AuD5qLD;EACE,aAAA;EACA,gBAAA;EACA,kBAAA;EACA,eAAA;EACA,YAAA;EACA,0BAAA;EjCRA,aAAA;EAGA,0BAAA;CtBqrLD;AuD7qLC;;EAEE,YAAA;EACA,sBAAA;EACA,gBAAA;EjCfF,aAAA;EAGA,0BAAA;CtB6rLD;AuDzqLC;EACE,WAAA;EACA,gBAAA;EACA,wBAAA;EACA,UAAA;EACA,yBAAA;CvD2qLH;AwDhsLD;EACE,iBAAA;CxDksLD;AwD9rLD;EACE,cAAA;EACA,iBAAA;EACA,gBAAA;EACA,OAAA;EACA,SAAA;EACA,UAAA;EACA,QAAA;EACA,cAAA;EACA,kCAAA;EAIA,WAAA;CxD6rLD;AwD1rLC;EnD+GA,sCAAA;EACI,kCAAA;EACC,iCAAA;EACG,8BAAA;EAkER,oDAAA;EAEK,0CAAA;EACG,oCAAA;CL6gLT;AwDhsLC;EnD2GA,mCAAA;EACI,+BAAA;EACC,8BAAA;EACG,2BAAA;CLwlLT;AwDpsLD;EACE,mBAAA;EACA,iBAAA;CxDssLD;AwDlsLD;EACE,mBAAA;EACA,YAAA;EACA,aAAA;CxDosLD;AwDhsLD;EACE,mBAAA;EACA,uBAAA;EACA,uBAAA;EACA,qCAAA;EACA,mBAAA;EnDaA,iDAAA;EACQ,yCAAA;EmDZR,qCAAA;UAAA,6BAAA;EAEA,WAAA;CxDksLD;AwD9rLD;EACE,gBAAA;EACA,OAAA;EACA,SAAA;EACA,UAAA;EACA,QAAA;EACA,cAAA;EACA,uBAAA;CxDgsLD;AwD9rLC;ElCrEA,WAAA;EAGA,yBAAA;CtBowLD;AwDjsLC;ElCtEA,aAAA;EAGA,0BAAA;CtBwwLD;AwDhsLD;EACE,cAAA;EACA,iCAAA;CxDksLD;AwD9rLD;EACE,iBAAA;CxDgsLD;AwD5rLD;EACE,UAAA;EACA,wBAAA;CxD8rLD;AwDzrLD;EACE,mBAAA;EACA,cAAA;CxD2rLD;AwDvrLD;EACE,cAAA;EACA,kBAAA;EACA,8BAAA;CxDyrLD;AwD5rLD;EAQI,iBAAA;EACA,iBAAA;CxDurLH;AwDhsLD;EAaI,kBAAA;CxDsrLH;AwDnsLD;EAiBI,eAAA;CxDqrLH;AwDhrLD;EACE,mBAAA;EACA,aAAA;EACA,YAAA;EACA,aAAA;EACA,iBAAA;CxDkrLD;AwDhqLD;EAZE;IACE,aAAA;IACA,kBAAA;GxD+qLD;EwD7qLD;InDvEA,kDAAA;IACQ,0CAAA;GLuvLP;EwD5qLD;IAAY,aAAA;GxD+qLX;CACF;AwD1qLD;EAFE;IAAY,aAAA;GxDgrLX;CACF;AyD/zLD;EACE,mBAAA;EACA,cAAA;EACA,eAAA;ECRA,4DAAA;EAEA,mBAAA;EACA,oBAAA;EACA,uBAAA;EACA,iBAAA;EACA,wBAAA;EACA,iBAAA;EACA,kBAAA;EACA,sBAAA;EACA,kBAAA;EACA,qBAAA;EACA,oBAAA;EACA,mBAAA;EACA,qBAAA;EACA,kBAAA;EDHA,gBAAA;EnCVA,WAAA;EAGA,yBAAA;CtBs1LD;AyD30LC;EnCdA,aAAA;EAGA,0BAAA;CtB01LD;AyD90LC;EAAW,iBAAA;EAAmB,eAAA;CzDk1L/B;AyDj1LC;EAAW,iBAAA;EAAmB,eAAA;CzDq1L/B;AyDp1LC;EAAW,gBAAA;EAAmB,eAAA;CzDw1L/B;AyDv1LC;EAAW,kBAAA;EAAmB,eAAA;CzD21L/B;AyDv1LD;EACE,iBAAA;EACA,iBAAA;EACA,YAAA;EACA,mBAAA;EACA,uBAAA;EACA,mBAAA;CzDy1LD;AyDr1LD;EACE,mBAAA;EACA,SAAA;EACA,UAAA;EACA,0BAAA;EACA,oBAAA;CzDu1LD;AyDn1LC;EACE,UAAA;EACA,UAAA;EACA,kBAAA;EACA,wBAAA;EACA,uBAAA;CzDq1LH;AyDn1LC;EACE,UAAA;EACA,WAAA;EACA,oBAAA;EACA,wBAAA;EACA,uBAAA;CzDq1LH;AyDn1LC;EACE,UAAA;EACA,UAAA;EACA,oBAAA;EACA,wBAAA;EACA,uBAAA;CzDq1LH;AyDn1LC;EACE,SAAA;EACA,QAAA;EACA,iBAAA;EACA,4BAAA;EACA,yBAAA;CzDq1LH;AyDn1LC;EACE,SAAA;EACA,SAAA;EACA,iBAAA;EACA,4BAAA;EACA,wBAAA;CzDq1LH;AyDn1LC;EACE,OAAA;EACA,UAAA;EACA,kBAAA;EACA,wBAAA;EACA,0BAAA;CzDq1LH;AyDn1LC;EACE,OAAA;EACA,WAAA;EACA,iBAAA;EACA,wBAAA;EACA,0BAAA;CzDq1LH;AyDn1LC;EACE,OAAA;EACA,UAAA;EACA,iBAAA;EACA,wBAAA;EACA,0BAAA;CzDq1LH;A2Dl7LD;EACE,mBAAA;EACA,OAAA;EACA,QAAA;EACA,cAAA;EACA,cAAA;EACA,iBAAA;EACA,aAAA;EDXA,4DAAA;EAEA,mBAAA;EACA,oBAAA;EACA,uBAAA;EACA,iBAAA;EACA,wBAAA;EACA,iBAAA;EACA,kBAAA;EACA,sBAAA;EACA,kBAAA;EACA,qBAAA;EACA,oBAAA;EACA,mBAAA;EACA,qBAAA;EACA,kBAAA;ECAA,gBAAA;EAEA,uBAAA;EACA,qCAAA;UAAA,6BAAA;EACA,uBAAA;EACA,qCAAA;EACA,mBAAA;EtD8CA,kDAAA;EACQ,0CAAA;CLk5LT;A2D77LC;EAAY,kBAAA;C3Dg8Lb;A2D/7LC;EAAY,kBAAA;C3Dk8Lb;A2Dj8LC;EAAY,iBAAA;C3Do8Lb;A2Dn8LC;EAAY,mBAAA;C3Ds8Lb;A2Dn8LD;EACE,UAAA;EACA,kBAAA;EACA,gBAAA;EACA,0BAAA;EACA,iCAAA;EACA,2BAAA;C3Dq8LD;A2Dl8LD;EACE,kBAAA;C3Do8LD;A2D57LC;;EAEE,mBAAA;EACA,eAAA;EACA,SAAA;EACA,UAAA;EACA,0BAAA;EACA,oBAAA;C3D87LH;A2D37LD;EACE,mBAAA;C3D67LD;A2D37LD;EACE,mBAAA;EACA,YAAA;C3D67LD;A2Dz7LC;EACE,UAAA;EACA,mBAAA;EACA,uBAAA;EACA,0BAAA;EACA,sCAAA;EACA,cAAA;C3D27LH;A2D17LG;EACE,aAAA;EACA,YAAA;EACA,mBAAA;EACA,uBAAA;EACA,uBAAA;C3D47LL;A2Dz7LC;EACE,SAAA;EACA,YAAA;EACA,kBAAA;EACA,qBAAA;EACA,4BAAA;EACA,wCAAA;C3D27LH;A2D17LG;EACE,aAAA;EACA,UAAA;EACA,cAAA;EACA,qBAAA;EACA,yBAAA;C3D47LL;A2Dz7LC;EACE,UAAA;EACA,mBAAA;EACA,oBAAA;EACA,6BAAA;EACA,yCAAA;EACA,WAAA;C3D27LH;A2D17LG;EACE,aAAA;EACA,SAAA;EACA,mBAAA;EACA,oBAAA;EACA,0BAAA;C3D47LL;A2Dx7LC;EACE,SAAA;EACA,aAAA;EACA,kBAAA;EACA,sBAAA;EACA,2BAAA;EACA,uCAAA;C3D07LH;A2Dz7LG;EACE,aAAA;EACA,WAAA;EACA,sBAAA;EACA,wBAAA;EACA,cAAA;C3D27LL;A4DpjMD;EACE,mBAAA;C5DsjMD;A4DnjMD;EACE,mBAAA;EACA,iBAAA;EACA,YAAA;C5DqjMD;A4DxjMD;EAMI,cAAA;EACA,mBAAA;EvD6KF,0CAAA;EACK,qCAAA;EACG,kCAAA;CLy4LT;A4D/jMD;;EAcM,eAAA;C5DqjML;A4D3hMC;EA4NF;IvD3DE,uDAAA;IAEK,6CAAA;IACG,uCAAA;IA7JR,oCAAA;IAEQ,4BAAA;IA+GR,4BAAA;IAEQ,oBAAA;GL86LP;E4DzjMG;;IvDmHJ,2CAAA;IACQ,mCAAA;IuDjHF,QAAA;G5D4jML;E4D1jMG;;IvD8GJ,4CAAA;IACQ,oCAAA;IuD5GF,QAAA;G5D6jML;E4D3jMG;;;IvDyGJ,wCAAA;IACQ,gCAAA;IuDtGF,QAAA;G5D8jML;CACF;A4DpmMD;;;EA6CI,eAAA;C5D4jMH;A4DzmMD;EAiDI,QAAA;C5D2jMH;A4D5mMD;;EAsDI,mBAAA;EACA,OAAA;EACA,YAAA;C5D0jMH;A4DlnMD;EA4DI,WAAA;C5DyjMH;A4DrnMD;EA+DI,YAAA;C5DyjMH;A4DxnMD;;EAmEI,QAAA;C5DyjMH;A4D5nMD;EAuEI,YAAA;C5DwjMH;A4D/nMD;EA0EI,WAAA;C5DwjMH;A4DhjMD;EACE,mBAAA;EACA,OAAA;EACA,QAAA;EACA,UAAA;EACA,WAAA;EtC9FA,aAAA;EAGA,0BAAA;EsC6FA,gBAAA;EACA,YAAA;EACA,mBAAA;EACA,0CAAA;EACA,mCAAA;C5DmjMD;A4D9iMC;EdnGE,mGAAA;EACA,8FAAA;EACA,qHAAA;EAAA,+FAAA;EACA,4BAAA;EACA,uHAAA;C9CopMH;A4DljMC;EACE,WAAA;EACA,SAAA;EdxGA,mGAAA;EACA,8FAAA;EACA,qHAAA;EAAA,+FAAA;EACA,4BAAA;EACA,uHAAA;C9C6pMH;A4DpjMC;;EAEE,WAAA;EACA,YAAA;EACA,sBAAA;EtCvHF,aAAA;EAGA,0BAAA;CtB4qMD;A4DtlMD;;;;EAuCI,mBAAA;EACA,SAAA;EACA,kBAAA;EACA,WAAA;EACA,sBAAA;C5DqjMH;A4DhmMD;;EA+CI,UAAA;EACA,mBAAA;C5DqjMH;A4DrmMD;;EAoDI,WAAA;EACA,oBAAA;C5DqjMH;A4D1mMD;;EAyDI,YAAA;EACA,aAAA;EACA,eAAA;EACA,mBAAA;C5DqjMH;A4DhjMG;EACE,iBAAA;C5DkjML;A4D9iMG;EACE,iBAAA;C5DgjML;A4DtiMD;EACE,mBAAA;EACA,aAAA;EACA,UAAA;EACA,YAAA;EACA,WAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;C5DwiMD;A4DjjMD;EAYI,sBAAA;EACA,YAAA;EACA,aAAA;EACA,YAAA;EACA,oBAAA;EACA,uBAAA;EACA,oBAAA;EACA,gBAAA;EAWA,0BAAA;EACA,mCAAA;C5D8hMH;A4D7jMD;EAkCI,UAAA;EACA,YAAA;EACA,aAAA;EACA,uBAAA;C5D8hMH;A4DvhMD;EACE,mBAAA;EACA,UAAA;EACA,WAAA;EACA,aAAA;EACA,YAAA;EACA,kBAAA;EACA,qBAAA;EACA,YAAA;EACA,mBAAA;EACA,0CAAA;C5DyhMD;A4DxhMC;EACE,kBAAA;C5D0hMH;A4Dj/LD;EAhCE;;;;IAKI,YAAA;IACA,aAAA;IACA,kBAAA;IACA,gBAAA;G5DmhMH;E4D3hMD;;IAYI,mBAAA;G5DmhMH;E4D/hMD;;IAgBI,oBAAA;G5DmhMH;E4D9gMD;IACE,UAAA;IACA,WAAA;IACA,qBAAA;G5DghMD;E4D5gMD;IACE,aAAA;G5D8gMD;CACF;A6D7wMC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEE,aAAA;EACA,eAAA;C7D6yMH;A6D3yMC;;;;;;;;;;;;;;;;EACE,YAAA;C7D4zMH;AiCp0MD;E6BRE,eAAA;EACA,kBAAA;EACA,mBAAA;C9D+0MD;AiCt0MD;EACE,wBAAA;CjCw0MD;AiCt0MD;EACE,uBAAA;CjCw0MD;AiCh0MD;EACE,yBAAA;CjCk0MD;AiCh0MD;EACE,0BAAA;CjCk0MD;AiCh0MD;EACE,mBAAA;CjCk0MD;AiCh0MD;E8BzBE,YAAA;EACA,mBAAA;EACA,kBAAA;EACA,8BAAA;EACA,UAAA;C/D41MD;AiC9zMD;EACE,yBAAA;CjCg0MD;AiCzzMD;EACE,gBAAA;CjC2zMD;AgE51MD;EACE,oBAAA;ChE81MD;AgEx1MD;;;;ECdE,yBAAA;CjE42MD;AgEv1MD;;;;;;;;;;;;EAYE,yBAAA;ChEy1MD;AgEl1MD;EA6IA;IC7LE,0BAAA;GjEs4MC;EiEr4MD;IAAU,0BAAA;GjEw4MT;EiEv4MD;IAAU,8BAAA;GjE04MT;EiEz4MD;;IACU,+BAAA;GjE44MT;CACF;AgE51MD;EAwIA;IA1II,0BAAA;GhEk2MD;CACF;AgE51MD;EAmIA;IArII,2BAAA;GhEk2MD;CACF;AgE51MD;EA8HA;IAhII,iCAAA;GhEk2MD;CACF;AgE31MD;EAwHA;IC7LE,0BAAA;GjEo6MC;EiEn6MD;IAAU,0BAAA;GjEs6MT;EiEr6MD;IAAU,8BAAA;GjEw6MT;EiEv6MD;;IACU,+BAAA;GjE06MT;CACF;AgEr2MD;EAmHA;IArHI,0BAAA;GhE22MD;CACF;AgEr2MD;EA8GA;IAhHI,2BAAA;GhE22MD;CACF;AgEr2MD;EAyGA;IA3GI,iCAAA;GhE22MD;CACF;AgEp2MD;EAmGA;IC7LE,0BAAA;GjEk8MC;EiEj8MD;IAAU,0BAAA;GjEo8MT;EiEn8MD;IAAU,8BAAA;GjEs8MT;EiEr8MD;;IACU,+BAAA;GjEw8MT;CACF;AgE92MD;EA8FA;IAhGI,0BAAA;GhEo3MD;CACF;AgE92MD;EAyFA;IA3FI,2BAAA;GhEo3MD;CACF;AgE92MD;EAoFA;IAtFI,iCAAA;GhEo3MD;CACF;AgE72MD;EA8EA;IC7LE,0BAAA;GjEg+MC;EiE/9MD;IAAU,0BAAA;GjEk+MT;EiEj+MD;IAAU,8BAAA;GjEo+MT;EiEn+MD;;IACU,+BAAA;GjEs+MT;CACF;AgEv3MD;EAyEA;IA3EI,0BAAA;GhE63MD;CACF;AgEv3MD;EAoEA;IAtEI,2BAAA;GhE63MD;CACF;AgEv3MD;EA+DA;IAjEI,iCAAA;GhE63MD;CACF;AgEt3MD;EAyDA;ICrLE,yBAAA;GjEs/MC;CACF;AgEt3MD;EAoDA;ICrLE,yBAAA;GjE2/MC;CACF;AgEt3MD;EA+CA;ICrLE,yBAAA;GjEggNC;CACF;AgEt3MD;EA0CA;ICrLE,yBAAA;GjEqgNC;CACF;AgEn3MD;ECnJE,yBAAA;CjEygND;AgEh3MD;EA4BA;IC7LE,0BAAA;GjEqhNC;EiEphND;IAAU,0BAAA;GjEuhNT;EiEthND;IAAU,8BAAA;GjEyhNT;EiExhND;;IACU,+BAAA;GjE2hNT;CACF;AgE93MD;EACE,yBAAA;ChEg4MD;AgE33MD;EAqBA;IAvBI,0BAAA;GhEi4MD;CACF;AgE/3MD;EACE,yBAAA;ChEi4MD;AgE53MD;EAcA;IAhBI,2BAAA;GhEk4MD;CACF;AgEh4MD;EACE,yBAAA;ChEk4MD;AgE73MD;EAOA;IATI,iCAAA;GhEm4MD;CACF;AgE53MD;EACA;ICrLE,yBAAA;GjEojNC;CACF","file":"bootstrap.css","sourcesContent":["/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\nhtml {\n font-family: sans-serif;\n -ms-text-size-adjust: 100%;\n -webkit-text-size-adjust: 100%;\n}\nbody {\n margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block;\n vertical-align: baseline;\n}\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n[hidden],\ntemplate {\n display: none;\n}\na {\n background-color: transparent;\n}\na:active,\na:hover {\n outline: 0;\n}\nabbr[title] {\n border-bottom: 1px dotted;\n}\nb,\nstrong {\n font-weight: bold;\n}\ndfn {\n font-style: italic;\n}\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\nmark {\n background: #ff0;\n color: #000;\n}\nsmall {\n font-size: 80%;\n}\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\nsup {\n top: -0.5em;\n}\nsub {\n bottom: -0.25em;\n}\nimg {\n border: 0;\n}\nsvg:not(:root) {\n overflow: hidden;\n}\nfigure {\n margin: 1em 40px;\n}\nhr {\n box-sizing: content-box;\n height: 0;\n}\npre {\n overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit;\n font: inherit;\n margin: 0;\n}\nbutton {\n overflow: visible;\n}\nbutton,\nselect {\n text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button;\n cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\ninput {\n line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box;\n padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: textfield;\n box-sizing: content-box;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\nlegend {\n border: 0;\n padding: 0;\n}\ntextarea {\n overflow: auto;\n}\noptgroup {\n font-weight: bold;\n}\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\ntd,\nth {\n padding: 0;\n}\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important;\n box-shadow: none !important;\n text-shadow: none !important;\n }\n a,\n a:visited {\n text-decoration: underline;\n }\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n img {\n max-width: 100% !important;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n .navbar {\n display: none;\n }\n .btn > .caret,\n .dropup > .btn > .caret {\n border-top-color: #000 !important;\n }\n .label {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #ddd !important;\n }\n}\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url('../fonts/glyphicons-halflings-regular.eot');\n src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');\n}\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n content: \"\\002a\";\n}\n.glyphicon-plus:before {\n content: \"\\002b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n content: \"\\270f\";\n}\n.glyphicon-glass:before {\n content: \"\\e001\";\n}\n.glyphicon-music:before {\n content: \"\\e002\";\n}\n.glyphicon-search:before {\n content: \"\\e003\";\n}\n.glyphicon-heart:before {\n content: \"\\e005\";\n}\n.glyphicon-star:before {\n content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n content: \"\\e007\";\n}\n.glyphicon-user:before {\n content: \"\\e008\";\n}\n.glyphicon-film:before {\n content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n content: \"\\e010\";\n}\n.glyphicon-th:before {\n content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n content: \"\\e012\";\n}\n.glyphicon-ok:before {\n content: \"\\e013\";\n}\n.glyphicon-remove:before {\n content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n content: \"\\e016\";\n}\n.glyphicon-off:before {\n content: \"\\e017\";\n}\n.glyphicon-signal:before {\n content: \"\\e018\";\n}\n.glyphicon-cog:before {\n content: \"\\e019\";\n}\n.glyphicon-trash:before {\n content: \"\\e020\";\n}\n.glyphicon-home:before {\n content: \"\\e021\";\n}\n.glyphicon-file:before {\n content: \"\\e022\";\n}\n.glyphicon-time:before {\n content: \"\\e023\";\n}\n.glyphicon-road:before {\n content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n content: \"\\e025\";\n}\n.glyphicon-download:before {\n content: \"\\e026\";\n}\n.glyphicon-upload:before {\n content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n content: \"\\e032\";\n}\n.glyphicon-lock:before {\n content: \"\\e033\";\n}\n.glyphicon-flag:before {\n content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n content: \"\\e040\";\n}\n.glyphicon-tag:before {\n content: \"\\e041\";\n}\n.glyphicon-tags:before {\n content: \"\\e042\";\n}\n.glyphicon-book:before {\n content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n content: \"\\e044\";\n}\n.glyphicon-print:before {\n content: \"\\e045\";\n}\n.glyphicon-camera:before {\n content: \"\\e046\";\n}\n.glyphicon-font:before {\n content: \"\\e047\";\n}\n.glyphicon-bold:before {\n content: \"\\e048\";\n}\n.glyphicon-italic:before {\n content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n content: \"\\e055\";\n}\n.glyphicon-list:before {\n content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n content: \"\\e059\";\n}\n.glyphicon-picture:before {\n content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n content: \"\\e063\";\n}\n.glyphicon-tint:before {\n content: \"\\e064\";\n}\n.glyphicon-edit:before {\n content: \"\\e065\";\n}\n.glyphicon-share:before {\n content: \"\\e066\";\n}\n.glyphicon-check:before {\n content: \"\\e067\";\n}\n.glyphicon-move:before {\n content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n content: \"\\e070\";\n}\n.glyphicon-backward:before {\n content: \"\\e071\";\n}\n.glyphicon-play:before {\n content: \"\\e072\";\n}\n.glyphicon-pause:before {\n content: \"\\e073\";\n}\n.glyphicon-stop:before {\n content: \"\\e074\";\n}\n.glyphicon-forward:before {\n content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n content: \"\\e077\";\n}\n.glyphicon-eject:before {\n content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n content: \"\\e101\";\n}\n.glyphicon-gift:before {\n content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n content: \"\\e103\";\n}\n.glyphicon-fire:before {\n content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n content: \"\\e107\";\n}\n.glyphicon-plane:before {\n content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n content: \"\\e109\";\n}\n.glyphicon-random:before {\n content: \"\\e110\";\n}\n.glyphicon-comment:before {\n content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n content: \"\\e122\";\n}\n.glyphicon-bell:before {\n content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n content: \"\\e134\";\n}\n.glyphicon-globe:before {\n content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n content: \"\\e137\";\n}\n.glyphicon-filter:before {\n content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n content: \"\\e143\";\n}\n.glyphicon-link:before {\n content: \"\\e144\";\n}\n.glyphicon-phone:before {\n content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n content: \"\\e146\";\n}\n.glyphicon-usd:before {\n content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n content: \"\\e149\";\n}\n.glyphicon-sort:before {\n content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n content: \"\\e157\";\n}\n.glyphicon-expand:before {\n content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n content: \"\\e161\";\n}\n.glyphicon-flash:before {\n content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n content: \"\\e164\";\n}\n.glyphicon-record:before {\n content: \"\\e165\";\n}\n.glyphicon-save:before {\n content: \"\\e166\";\n}\n.glyphicon-open:before {\n content: \"\\e167\";\n}\n.glyphicon-saved:before {\n content: \"\\e168\";\n}\n.glyphicon-import:before {\n content: \"\\e169\";\n}\n.glyphicon-export:before {\n content: \"\\e170\";\n}\n.glyphicon-send:before {\n content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n content: \"\\e179\";\n}\n.glyphicon-header:before {\n content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n content: \"\\e183\";\n}\n.glyphicon-tower:before {\n content: \"\\e184\";\n}\n.glyphicon-stats:before {\n content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n content: \"\\e200\";\n}\n.glyphicon-cd:before {\n content: \"\\e201\";\n}\n.glyphicon-save-file:before {\n content: \"\\e202\";\n}\n.glyphicon-open-file:before {\n content: \"\\e203\";\n}\n.glyphicon-level-up:before {\n content: \"\\e204\";\n}\n.glyphicon-copy:before {\n content: \"\\e205\";\n}\n.glyphicon-paste:before {\n content: \"\\e206\";\n}\n.glyphicon-alert:before {\n content: \"\\e209\";\n}\n.glyphicon-equalizer:before {\n content: \"\\e210\";\n}\n.glyphicon-king:before {\n content: \"\\e211\";\n}\n.glyphicon-queen:before {\n content: \"\\e212\";\n}\n.glyphicon-pawn:before {\n content: \"\\e213\";\n}\n.glyphicon-bishop:before {\n content: \"\\e214\";\n}\n.glyphicon-knight:before {\n content: \"\\e215\";\n}\n.glyphicon-baby-formula:before {\n content: \"\\e216\";\n}\n.glyphicon-tent:before {\n content: \"\\26fa\";\n}\n.glyphicon-blackboard:before {\n content: \"\\e218\";\n}\n.glyphicon-bed:before {\n content: \"\\e219\";\n}\n.glyphicon-apple:before {\n content: \"\\f8ff\";\n}\n.glyphicon-erase:before {\n content: \"\\e221\";\n}\n.glyphicon-hourglass:before {\n content: \"\\231b\";\n}\n.glyphicon-lamp:before {\n content: \"\\e223\";\n}\n.glyphicon-duplicate:before {\n content: \"\\e224\";\n}\n.glyphicon-piggy-bank:before {\n content: \"\\e225\";\n}\n.glyphicon-scissors:before {\n content: \"\\e226\";\n}\n.glyphicon-bitcoin:before {\n content: \"\\e227\";\n}\n.glyphicon-btc:before {\n content: \"\\e227\";\n}\n.glyphicon-xbt:before {\n content: \"\\e227\";\n}\n.glyphicon-yen:before {\n content: \"\\00a5\";\n}\n.glyphicon-jpy:before {\n content: \"\\00a5\";\n}\n.glyphicon-ruble:before {\n content: \"\\20bd\";\n}\n.glyphicon-rub:before {\n content: \"\\20bd\";\n}\n.glyphicon-scale:before {\n content: \"\\e230\";\n}\n.glyphicon-ice-lolly:before {\n content: \"\\e231\";\n}\n.glyphicon-ice-lolly-tasted:before {\n content: \"\\e232\";\n}\n.glyphicon-education:before {\n content: \"\\e233\";\n}\n.glyphicon-option-horizontal:before {\n content: \"\\e234\";\n}\n.glyphicon-option-vertical:before {\n content: \"\\e235\";\n}\n.glyphicon-menu-hamburger:before {\n content: \"\\e236\";\n}\n.glyphicon-modal-window:before {\n content: \"\\e237\";\n}\n.glyphicon-oil:before {\n content: \"\\e238\";\n}\n.glyphicon-grain:before {\n content: \"\\e239\";\n}\n.glyphicon-sunglasses:before {\n content: \"\\e240\";\n}\n.glyphicon-text-size:before {\n content: \"\\e241\";\n}\n.glyphicon-text-color:before {\n content: \"\\e242\";\n}\n.glyphicon-text-background:before {\n content: \"\\e243\";\n}\n.glyphicon-object-align-top:before {\n content: \"\\e244\";\n}\n.glyphicon-object-align-bottom:before {\n content: \"\\e245\";\n}\n.glyphicon-object-align-horizontal:before {\n content: \"\\e246\";\n}\n.glyphicon-object-align-left:before {\n content: \"\\e247\";\n}\n.glyphicon-object-align-vertical:before {\n content: \"\\e248\";\n}\n.glyphicon-object-align-right:before {\n content: \"\\e249\";\n}\n.glyphicon-triangle-right:before {\n content: \"\\e250\";\n}\n.glyphicon-triangle-left:before {\n content: \"\\e251\";\n}\n.glyphicon-triangle-bottom:before {\n content: \"\\e252\";\n}\n.glyphicon-triangle-top:before {\n content: \"\\e253\";\n}\n.glyphicon-console:before {\n content: \"\\e254\";\n}\n.glyphicon-superscript:before {\n content: \"\\e255\";\n}\n.glyphicon-subscript:before {\n content: \"\\e256\";\n}\n.glyphicon-menu-left:before {\n content: \"\\e257\";\n}\n.glyphicon-menu-right:before {\n content: \"\\e258\";\n}\n.glyphicon-menu-down:before {\n content: \"\\e259\";\n}\n.glyphicon-menu-up:before {\n content: \"\\e260\";\n}\n* {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n*:before,\n*:after {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 14px;\n line-height: 1.42857143;\n color: #333333;\n background-color: #fff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\na {\n color: #337ab7;\n text-decoration: none;\n}\na:hover,\na:focus {\n color: #23527c;\n text-decoration: underline;\n}\na:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\nfigure {\n margin: 0;\n}\nimg {\n vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n display: block;\n max-width: 100%;\n height: auto;\n}\n.img-rounded {\n border-radius: 6px;\n}\n.img-thumbnail {\n padding: 4px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: all 0.2s ease-in-out;\n -o-transition: all 0.2s ease-in-out;\n transition: all 0.2s ease-in-out;\n display: inline-block;\n max-width: 100%;\n height: auto;\n}\n.img-circle {\n border-radius: 50%;\n}\nhr {\n margin-top: 20px;\n margin-bottom: 20px;\n border: 0;\n border-top: 1px solid #eeeeee;\n}\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n}\n[role=\"button\"] {\n cursor: pointer;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n font-family: inherit;\n font-weight: 500;\n line-height: 1.1;\n color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n font-weight: normal;\n line-height: 1;\n color: #777777;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n margin-top: 20px;\n margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n margin-top: 10px;\n margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n font-size: 75%;\n}\nh1,\n.h1 {\n font-size: 36px;\n}\nh2,\n.h2 {\n font-size: 30px;\n}\nh3,\n.h3 {\n font-size: 24px;\n}\nh4,\n.h4 {\n font-size: 18px;\n}\nh5,\n.h5 {\n font-size: 14px;\n}\nh6,\n.h6 {\n font-size: 12px;\n}\np {\n margin: 0 0 10px;\n}\n.lead {\n margin-bottom: 20px;\n font-size: 16px;\n font-weight: 300;\n line-height: 1.4;\n}\n@media (min-width: 768px) {\n .lead {\n font-size: 21px;\n }\n}\nsmall,\n.small {\n font-size: 85%;\n}\nmark,\n.mark {\n background-color: #fcf8e3;\n padding: .2em;\n}\n.text-left {\n text-align: left;\n}\n.text-right {\n text-align: right;\n}\n.text-center {\n text-align: center;\n}\n.text-justify {\n text-align: justify;\n}\n.text-nowrap {\n white-space: nowrap;\n}\n.text-lowercase {\n text-transform: lowercase;\n}\n.text-uppercase {\n text-transform: uppercase;\n}\n.text-capitalize {\n text-transform: capitalize;\n}\n.text-muted {\n color: #777777;\n}\n.text-primary {\n color: #337ab7;\n}\na.text-primary:hover,\na.text-primary:focus {\n color: #286090;\n}\n.text-success {\n color: #3c763d;\n}\na.text-success:hover,\na.text-success:focus {\n color: #2b542c;\n}\n.text-info {\n color: #31708f;\n}\na.text-info:hover,\na.text-info:focus {\n color: #245269;\n}\n.text-warning {\n color: #8a6d3b;\n}\na.text-warning:hover,\na.text-warning:focus {\n color: #66512c;\n}\n.text-danger {\n color: #a94442;\n}\na.text-danger:hover,\na.text-danger:focus {\n color: #843534;\n}\n.bg-primary {\n color: #fff;\n background-color: #337ab7;\n}\na.bg-primary:hover,\na.bg-primary:focus {\n background-color: #286090;\n}\n.bg-success {\n background-color: #dff0d8;\n}\na.bg-success:hover,\na.bg-success:focus {\n background-color: #c1e2b3;\n}\n.bg-info {\n background-color: #d9edf7;\n}\na.bg-info:hover,\na.bg-info:focus {\n background-color: #afd9ee;\n}\n.bg-warning {\n background-color: #fcf8e3;\n}\na.bg-warning:hover,\na.bg-warning:focus {\n background-color: #f7ecb5;\n}\n.bg-danger {\n background-color: #f2dede;\n}\na.bg-danger:hover,\na.bg-danger:focus {\n background-color: #e4b9b9;\n}\n.page-header {\n padding-bottom: 9px;\n margin: 40px 0 20px;\n border-bottom: 1px solid #eeeeee;\n}\nul,\nol {\n margin-top: 0;\n margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n margin-bottom: 0;\n}\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n.list-inline {\n padding-left: 0;\n list-style: none;\n margin-left: -5px;\n}\n.list-inline > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n}\ndl {\n margin-top: 0;\n margin-bottom: 20px;\n}\ndt,\ndd {\n line-height: 1.42857143;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0;\n}\n@media (min-width: 768px) {\n .dl-horizontal dt {\n float: left;\n width: 160px;\n clear: left;\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .dl-horizontal dd {\n margin-left: 180px;\n }\n}\nabbr[title],\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted #777777;\n}\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\nblockquote {\n padding: 10px 20px;\n margin: 0 0 20px;\n font-size: 17.5px;\n border-left: 5px solid #eeeeee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n display: block;\n font-size: 80%;\n line-height: 1.42857143;\n color: #777777;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n content: '\\2014 \\00A0';\n}\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid #eeeeee;\n border-left: 0;\n text-align: right;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n content: '';\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n content: '\\00A0 \\2014';\n}\naddress {\n margin-bottom: 20px;\n font-style: normal;\n line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: #c7254e;\n background-color: #f9f2f4;\n border-radius: 4px;\n}\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: #fff;\n background-color: #333;\n border-radius: 3px;\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n box-shadow: none;\n}\npre {\n display: block;\n padding: 9.5px;\n margin: 0 0 10px;\n font-size: 13px;\n line-height: 1.42857143;\n word-break: break-all;\n word-wrap: break-word;\n color: #333333;\n background-color: #f5f5f5;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\npre code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n}\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n.container {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px;\n}\n@media (min-width: 768px) {\n .container {\n width: 750px;\n }\n}\n@media (min-width: 992px) {\n .container {\n width: 970px;\n }\n}\n@media (min-width: 1200px) {\n .container {\n width: 1170px;\n }\n}\n.container-fluid {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px;\n}\n.row {\n margin-left: -15px;\n margin-right: -15px;\n}\n.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {\n position: relative;\n min-height: 1px;\n padding-left: 15px;\n padding-right: 15px;\n}\n.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {\n float: left;\n}\n.col-xs-12 {\n width: 100%;\n}\n.col-xs-11 {\n width: 91.66666667%;\n}\n.col-xs-10 {\n width: 83.33333333%;\n}\n.col-xs-9 {\n width: 75%;\n}\n.col-xs-8 {\n width: 66.66666667%;\n}\n.col-xs-7 {\n width: 58.33333333%;\n}\n.col-xs-6 {\n width: 50%;\n}\n.col-xs-5 {\n width: 41.66666667%;\n}\n.col-xs-4 {\n width: 33.33333333%;\n}\n.col-xs-3 {\n width: 25%;\n}\n.col-xs-2 {\n width: 16.66666667%;\n}\n.col-xs-1 {\n width: 8.33333333%;\n}\n.col-xs-pull-12 {\n right: 100%;\n}\n.col-xs-pull-11 {\n right: 91.66666667%;\n}\n.col-xs-pull-10 {\n right: 83.33333333%;\n}\n.col-xs-pull-9 {\n right: 75%;\n}\n.col-xs-pull-8 {\n right: 66.66666667%;\n}\n.col-xs-pull-7 {\n right: 58.33333333%;\n}\n.col-xs-pull-6 {\n right: 50%;\n}\n.col-xs-pull-5 {\n right: 41.66666667%;\n}\n.col-xs-pull-4 {\n right: 33.33333333%;\n}\n.col-xs-pull-3 {\n right: 25%;\n}\n.col-xs-pull-2 {\n right: 16.66666667%;\n}\n.col-xs-pull-1 {\n right: 8.33333333%;\n}\n.col-xs-pull-0 {\n right: auto;\n}\n.col-xs-push-12 {\n left: 100%;\n}\n.col-xs-push-11 {\n left: 91.66666667%;\n}\n.col-xs-push-10 {\n left: 83.33333333%;\n}\n.col-xs-push-9 {\n left: 75%;\n}\n.col-xs-push-8 {\n left: 66.66666667%;\n}\n.col-xs-push-7 {\n left: 58.33333333%;\n}\n.col-xs-push-6 {\n left: 50%;\n}\n.col-xs-push-5 {\n left: 41.66666667%;\n}\n.col-xs-push-4 {\n left: 33.33333333%;\n}\n.col-xs-push-3 {\n left: 25%;\n}\n.col-xs-push-2 {\n left: 16.66666667%;\n}\n.col-xs-push-1 {\n left: 8.33333333%;\n}\n.col-xs-push-0 {\n left: auto;\n}\n.col-xs-offset-12 {\n margin-left: 100%;\n}\n.col-xs-offset-11 {\n margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n margin-left: 75%;\n}\n.col-xs-offset-8 {\n margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n margin-left: 50%;\n}\n.col-xs-offset-5 {\n margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n margin-left: 25%;\n}\n.col-xs-offset-2 {\n margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n margin-left: 0%;\n}\n@media (min-width: 768px) {\n .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {\n float: left;\n }\n .col-sm-12 {\n width: 100%;\n }\n .col-sm-11 {\n width: 91.66666667%;\n }\n .col-sm-10 {\n width: 83.33333333%;\n }\n .col-sm-9 {\n width: 75%;\n }\n .col-sm-8 {\n width: 66.66666667%;\n }\n .col-sm-7 {\n width: 58.33333333%;\n }\n .col-sm-6 {\n width: 50%;\n }\n .col-sm-5 {\n width: 41.66666667%;\n }\n .col-sm-4 {\n width: 33.33333333%;\n }\n .col-sm-3 {\n width: 25%;\n }\n .col-sm-2 {\n width: 16.66666667%;\n }\n .col-sm-1 {\n width: 8.33333333%;\n }\n .col-sm-pull-12 {\n right: 100%;\n }\n .col-sm-pull-11 {\n right: 91.66666667%;\n }\n .col-sm-pull-10 {\n right: 83.33333333%;\n }\n .col-sm-pull-9 {\n right: 75%;\n }\n .col-sm-pull-8 {\n right: 66.66666667%;\n }\n .col-sm-pull-7 {\n right: 58.33333333%;\n }\n .col-sm-pull-6 {\n right: 50%;\n }\n .col-sm-pull-5 {\n right: 41.66666667%;\n }\n .col-sm-pull-4 {\n right: 33.33333333%;\n }\n .col-sm-pull-3 {\n right: 25%;\n }\n .col-sm-pull-2 {\n right: 16.66666667%;\n }\n .col-sm-pull-1 {\n right: 8.33333333%;\n }\n .col-sm-pull-0 {\n right: auto;\n }\n .col-sm-push-12 {\n left: 100%;\n }\n .col-sm-push-11 {\n left: 91.66666667%;\n }\n .col-sm-push-10 {\n left: 83.33333333%;\n }\n .col-sm-push-9 {\n left: 75%;\n }\n .col-sm-push-8 {\n left: 66.66666667%;\n }\n .col-sm-push-7 {\n left: 58.33333333%;\n }\n .col-sm-push-6 {\n left: 50%;\n }\n .col-sm-push-5 {\n left: 41.66666667%;\n }\n .col-sm-push-4 {\n left: 33.33333333%;\n }\n .col-sm-push-3 {\n left: 25%;\n }\n .col-sm-push-2 {\n left: 16.66666667%;\n }\n .col-sm-push-1 {\n left: 8.33333333%;\n }\n .col-sm-push-0 {\n left: auto;\n }\n .col-sm-offset-12 {\n margin-left: 100%;\n }\n .col-sm-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-sm-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-sm-offset-9 {\n margin-left: 75%;\n }\n .col-sm-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-sm-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-sm-offset-6 {\n margin-left: 50%;\n }\n .col-sm-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-sm-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-sm-offset-3 {\n margin-left: 25%;\n }\n .col-sm-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-sm-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-sm-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 992px) {\n .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {\n float: left;\n }\n .col-md-12 {\n width: 100%;\n }\n .col-md-11 {\n width: 91.66666667%;\n }\n .col-md-10 {\n width: 83.33333333%;\n }\n .col-md-9 {\n width: 75%;\n }\n .col-md-8 {\n width: 66.66666667%;\n }\n .col-md-7 {\n width: 58.33333333%;\n }\n .col-md-6 {\n width: 50%;\n }\n .col-md-5 {\n width: 41.66666667%;\n }\n .col-md-4 {\n width: 33.33333333%;\n }\n .col-md-3 {\n width: 25%;\n }\n .col-md-2 {\n width: 16.66666667%;\n }\n .col-md-1 {\n width: 8.33333333%;\n }\n .col-md-pull-12 {\n right: 100%;\n }\n .col-md-pull-11 {\n right: 91.66666667%;\n }\n .col-md-pull-10 {\n right: 83.33333333%;\n }\n .col-md-pull-9 {\n right: 75%;\n }\n .col-md-pull-8 {\n right: 66.66666667%;\n }\n .col-md-pull-7 {\n right: 58.33333333%;\n }\n .col-md-pull-6 {\n right: 50%;\n }\n .col-md-pull-5 {\n right: 41.66666667%;\n }\n .col-md-pull-4 {\n right: 33.33333333%;\n }\n .col-md-pull-3 {\n right: 25%;\n }\n .col-md-pull-2 {\n right: 16.66666667%;\n }\n .col-md-pull-1 {\n right: 8.33333333%;\n }\n .col-md-pull-0 {\n right: auto;\n }\n .col-md-push-12 {\n left: 100%;\n }\n .col-md-push-11 {\n left: 91.66666667%;\n }\n .col-md-push-10 {\n left: 83.33333333%;\n }\n .col-md-push-9 {\n left: 75%;\n }\n .col-md-push-8 {\n left: 66.66666667%;\n }\n .col-md-push-7 {\n left: 58.33333333%;\n }\n .col-md-push-6 {\n left: 50%;\n }\n .col-md-push-5 {\n left: 41.66666667%;\n }\n .col-md-push-4 {\n left: 33.33333333%;\n }\n .col-md-push-3 {\n left: 25%;\n }\n .col-md-push-2 {\n left: 16.66666667%;\n }\n .col-md-push-1 {\n left: 8.33333333%;\n }\n .col-md-push-0 {\n left: auto;\n }\n .col-md-offset-12 {\n margin-left: 100%;\n }\n .col-md-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-md-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-md-offset-9 {\n margin-left: 75%;\n }\n .col-md-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-md-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-md-offset-6 {\n margin-left: 50%;\n }\n .col-md-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-md-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-md-offset-3 {\n margin-left: 25%;\n }\n .col-md-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-md-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-md-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 1200px) {\n .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {\n float: left;\n }\n .col-lg-12 {\n width: 100%;\n }\n .col-lg-11 {\n width: 91.66666667%;\n }\n .col-lg-10 {\n width: 83.33333333%;\n }\n .col-lg-9 {\n width: 75%;\n }\n .col-lg-8 {\n width: 66.66666667%;\n }\n .col-lg-7 {\n width: 58.33333333%;\n }\n .col-lg-6 {\n width: 50%;\n }\n .col-lg-5 {\n width: 41.66666667%;\n }\n .col-lg-4 {\n width: 33.33333333%;\n }\n .col-lg-3 {\n width: 25%;\n }\n .col-lg-2 {\n width: 16.66666667%;\n }\n .col-lg-1 {\n width: 8.33333333%;\n }\n .col-lg-pull-12 {\n right: 100%;\n }\n .col-lg-pull-11 {\n right: 91.66666667%;\n }\n .col-lg-pull-10 {\n right: 83.33333333%;\n }\n .col-lg-pull-9 {\n right: 75%;\n }\n .col-lg-pull-8 {\n right: 66.66666667%;\n }\n .col-lg-pull-7 {\n right: 58.33333333%;\n }\n .col-lg-pull-6 {\n right: 50%;\n }\n .col-lg-pull-5 {\n right: 41.66666667%;\n }\n .col-lg-pull-4 {\n right: 33.33333333%;\n }\n .col-lg-pull-3 {\n right: 25%;\n }\n .col-lg-pull-2 {\n right: 16.66666667%;\n }\n .col-lg-pull-1 {\n right: 8.33333333%;\n }\n .col-lg-pull-0 {\n right: auto;\n }\n .col-lg-push-12 {\n left: 100%;\n }\n .col-lg-push-11 {\n left: 91.66666667%;\n }\n .col-lg-push-10 {\n left: 83.33333333%;\n }\n .col-lg-push-9 {\n left: 75%;\n }\n .col-lg-push-8 {\n left: 66.66666667%;\n }\n .col-lg-push-7 {\n left: 58.33333333%;\n }\n .col-lg-push-6 {\n left: 50%;\n }\n .col-lg-push-5 {\n left: 41.66666667%;\n }\n .col-lg-push-4 {\n left: 33.33333333%;\n }\n .col-lg-push-3 {\n left: 25%;\n }\n .col-lg-push-2 {\n left: 16.66666667%;\n }\n .col-lg-push-1 {\n left: 8.33333333%;\n }\n .col-lg-push-0 {\n left: auto;\n }\n .col-lg-offset-12 {\n margin-left: 100%;\n }\n .col-lg-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-lg-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-lg-offset-9 {\n margin-left: 75%;\n }\n .col-lg-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-lg-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-lg-offset-6 {\n margin-left: 50%;\n }\n .col-lg-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-lg-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-lg-offset-3 {\n margin-left: 25%;\n }\n .col-lg-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-lg-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-lg-offset-0 {\n margin-left: 0%;\n }\n}\ntable {\n background-color: transparent;\n}\ncaption {\n padding-top: 8px;\n padding-bottom: 8px;\n color: #777777;\n text-align: left;\n}\nth {\n text-align: left;\n}\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n padding: 8px;\n line-height: 1.42857143;\n vertical-align: top;\n border-top: 1px solid #ddd;\n}\n.table > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid #ddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n border-top: 0;\n}\n.table > tbody + tbody {\n border-top: 2px solid #ddd;\n}\n.table .table {\n background-color: #fff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n padding: 5px;\n}\n.table-bordered {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-of-type(odd) {\n background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n background-color: #f5f5f5;\n}\ntable col[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-column;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-cell;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n background-color: #ebcccc;\n}\n.table-responsive {\n overflow-x: auto;\n min-height: 0.01%;\n}\n@media screen and (max-width: 767px) {\n .table-responsive {\n width: 100%;\n margin-bottom: 15px;\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid #ddd;\n }\n .table-responsive > .table {\n margin-bottom: 0;\n }\n .table-responsive > .table > thead > tr > th,\n .table-responsive > .table > tbody > tr > th,\n .table-responsive > .table > tfoot > tr > th,\n .table-responsive > .table > thead > tr > td,\n .table-responsive > .table > tbody > tr > td,\n .table-responsive > .table > tfoot > tr > td {\n white-space: nowrap;\n }\n .table-responsive > .table-bordered {\n border: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:first-child,\n .table-responsive > .table-bordered > tbody > tr > th:first-child,\n .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n .table-responsive > .table-bordered > thead > tr > td:first-child,\n .table-responsive > .table-bordered > tbody > tr > td:first-child,\n .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:last-child,\n .table-responsive > .table-bordered > tbody > tr > th:last-child,\n .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n .table-responsive > .table-bordered > thead > tr > td:last-child,\n .table-responsive > .table-bordered > tbody > tr > td:last-child,\n .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n }\n .table-responsive > .table-bordered > tbody > tr:last-child > th,\n .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n .table-responsive > .table-bordered > tbody > tr:last-child > td,\n .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n border-bottom: 0;\n }\n}\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n min-width: 0;\n}\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: 20px;\n font-size: 21px;\n line-height: inherit;\n color: #333333;\n border: 0;\n border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n display: inline-block;\n max-width: 100%;\n margin-bottom: 5px;\n font-weight: bold;\n}\ninput[type=\"search\"] {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9;\n line-height: normal;\n}\ninput[type=\"file\"] {\n display: block;\n}\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\nselect[multiple],\nselect[size] {\n height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\noutput {\n display: block;\n padding-top: 7px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n}\n.form-control {\n display: block;\n width: 100%;\n height: 34px;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n background-color: #fff;\n background-image: none;\n border: 1px solid #ccc;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n border-color: #66afe9;\n outline: 0;\n -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n.form-control::-moz-placeholder {\n color: #999;\n opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n color: #999;\n}\n.form-control::-webkit-input-placeholder {\n color: #999;\n}\n.form-control::-ms-expand {\n border: 0;\n background-color: transparent;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n background-color: #eeeeee;\n opacity: 1;\n}\n.form-control[disabled],\nfieldset[disabled] .form-control {\n cursor: not-allowed;\n}\ntextarea.form-control {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: none;\n}\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n input[type=\"date\"].form-control,\n input[type=\"time\"].form-control,\n input[type=\"datetime-local\"].form-control,\n input[type=\"month\"].form-control {\n line-height: 34px;\n }\n input[type=\"date\"].input-sm,\n input[type=\"time\"].input-sm,\n input[type=\"datetime-local\"].input-sm,\n input[type=\"month\"].input-sm,\n .input-group-sm input[type=\"date\"],\n .input-group-sm input[type=\"time\"],\n .input-group-sm input[type=\"datetime-local\"],\n .input-group-sm input[type=\"month\"] {\n line-height: 30px;\n }\n input[type=\"date\"].input-lg,\n input[type=\"time\"].input-lg,\n input[type=\"datetime-local\"].input-lg,\n input[type=\"month\"].input-lg,\n .input-group-lg input[type=\"date\"],\n .input-group-lg input[type=\"time\"],\n .input-group-lg input[type=\"datetime-local\"],\n .input-group-lg input[type=\"month\"] {\n line-height: 46px;\n }\n}\n.form-group {\n margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.radio label,\n.checkbox label {\n min-height: 20px;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-left: -20px;\n margin-top: 4px \\9;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n position: relative;\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n vertical-align: middle;\n font-weight: normal;\n cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n cursor: not-allowed;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n cursor: not-allowed;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n cursor: not-allowed;\n}\n.form-control-static {\n padding-top: 7px;\n padding-bottom: 7px;\n margin-bottom: 0;\n min-height: 34px;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n padding-left: 0;\n padding-right: 0;\n}\n.input-sm {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-sm {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-sm,\nselect[multiple].input-sm {\n height: auto;\n}\n.form-group-sm .form-control {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.form-group-sm select.form-control {\n height: 30px;\n line-height: 30px;\n}\n.form-group-sm textarea.form-control,\n.form-group-sm select[multiple].form-control {\n height: auto;\n}\n.form-group-sm .form-control-static {\n height: 30px;\n min-height: 32px;\n padding: 6px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.input-lg {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-lg {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-lg,\nselect[multiple].input-lg {\n height: auto;\n}\n.form-group-lg .form-control {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.form-group-lg select.form-control {\n height: 46px;\n line-height: 46px;\n}\n.form-group-lg textarea.form-control,\n.form-group-lg select[multiple].form-control {\n height: auto;\n}\n.form-group-lg .form-control-static {\n height: 46px;\n min-height: 38px;\n padding: 11px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.has-feedback {\n position: relative;\n}\n.has-feedback .form-control {\n padding-right: 42.5px;\n}\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n display: block;\n width: 34px;\n height: 34px;\n line-height: 34px;\n text-align: center;\n pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n width: 46px;\n height: 46px;\n line-height: 46px;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n width: 30px;\n height: 30px;\n line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n color: #3c763d;\n}\n.has-success .form-control {\n border-color: #3c763d;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-success .form-control:focus {\n border-color: #2b542c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n color: #3c763d;\n border-color: #3c763d;\n background-color: #dff0d8;\n}\n.has-success .form-control-feedback {\n color: #3c763d;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n color: #8a6d3b;\n}\n.has-warning .form-control {\n border-color: #8a6d3b;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-warning .form-control:focus {\n border-color: #66512c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n color: #8a6d3b;\n border-color: #8a6d3b;\n background-color: #fcf8e3;\n}\n.has-warning .form-control-feedback {\n color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n color: #a94442;\n}\n.has-error .form-control {\n border-color: #a94442;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-error .form-control:focus {\n border-color: #843534;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n color: #a94442;\n border-color: #a94442;\n background-color: #f2dede;\n}\n.has-error .form-control-feedback {\n color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n top: 0;\n}\n.help-block {\n display: block;\n margin-top: 5px;\n margin-bottom: 10px;\n color: #737373;\n}\n@media (min-width: 768px) {\n .form-inline .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-static {\n display: inline-block;\n }\n .form-inline .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .form-inline .input-group .input-group-addon,\n .form-inline .input-group .input-group-btn,\n .form-inline .input-group .form-control {\n width: auto;\n }\n .form-inline .input-group > .form-control {\n width: 100%;\n }\n .form-inline .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio,\n .form-inline .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio label,\n .form-inline .checkbox label {\n padding-left: 0;\n }\n .form-inline .radio input[type=\"radio\"],\n .form-inline .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .form-inline .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n margin-top: 0;\n margin-bottom: 0;\n padding-top: 7px;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n min-height: 27px;\n}\n.form-horizontal .form-group {\n margin-left: -15px;\n margin-right: -15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .control-label {\n text-align: right;\n margin-bottom: 0;\n padding-top: 7px;\n }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n right: 15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-lg .control-label {\n padding-top: 11px;\n font-size: 18px;\n }\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-sm .control-label {\n padding-top: 6px;\n font-size: 12px;\n }\n}\n.btn {\n display: inline-block;\n margin-bottom: 0;\n font-weight: normal;\n text-align: center;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none;\n border: 1px solid transparent;\n white-space: nowrap;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n border-radius: 4px;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n color: #333;\n text-decoration: none;\n}\n.btn:active,\n.btn.active {\n outline: 0;\n background-image: none;\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n cursor: not-allowed;\n opacity: 0.65;\n filter: alpha(opacity=65);\n -webkit-box-shadow: none;\n box-shadow: none;\n}\na.btn.disabled,\nfieldset[disabled] a.btn {\n pointer-events: none;\n}\n.btn-default {\n color: #333;\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default:focus,\n.btn-default.focus {\n color: #333;\n background-color: #e6e6e6;\n border-color: #8c8c8c;\n}\n.btn-default:hover {\n color: #333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n color: #333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active:hover,\n.btn-default.active:hover,\n.open > .dropdown-toggle.btn-default:hover,\n.btn-default:active:focus,\n.btn-default.active:focus,\n.open > .dropdown-toggle.btn-default:focus,\n.btn-default:active.focus,\n.btn-default.active.focus,\n.open > .dropdown-toggle.btn-default.focus {\n color: #333;\n background-color: #d4d4d4;\n border-color: #8c8c8c;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n background-image: none;\n}\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus {\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default .badge {\n color: #fff;\n background-color: #333;\n}\n.btn-primary {\n color: #fff;\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary:focus,\n.btn-primary.focus {\n color: #fff;\n background-color: #286090;\n border-color: #122b40;\n}\n.btn-primary:hover {\n color: #fff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n color: #fff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active:hover,\n.btn-primary.active:hover,\n.open > .dropdown-toggle.btn-primary:hover,\n.btn-primary:active:focus,\n.btn-primary.active:focus,\n.open > .dropdown-toggle.btn-primary:focus,\n.btn-primary:active.focus,\n.btn-primary.active.focus,\n.open > .dropdown-toggle.btn-primary.focus {\n color: #fff;\n background-color: #204d74;\n border-color: #122b40;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n background-image: none;\n}\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus {\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.btn-success {\n color: #fff;\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success:focus,\n.btn-success.focus {\n color: #fff;\n background-color: #449d44;\n border-color: #255625;\n}\n.btn-success:hover {\n color: #fff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n color: #fff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active:hover,\n.btn-success.active:hover,\n.open > .dropdown-toggle.btn-success:hover,\n.btn-success:active:focus,\n.btn-success.active:focus,\n.open > .dropdown-toggle.btn-success:focus,\n.btn-success:active.focus,\n.btn-success.active.focus,\n.open > .dropdown-toggle.btn-success.focus {\n color: #fff;\n background-color: #398439;\n border-color: #255625;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n background-image: none;\n}\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus {\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success .badge {\n color: #5cb85c;\n background-color: #fff;\n}\n.btn-info {\n color: #fff;\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info:focus,\n.btn-info.focus {\n color: #fff;\n background-color: #31b0d5;\n border-color: #1b6d85;\n}\n.btn-info:hover {\n color: #fff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n color: #fff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active:hover,\n.btn-info.active:hover,\n.open > .dropdown-toggle.btn-info:hover,\n.btn-info:active:focus,\n.btn-info.active:focus,\n.open > .dropdown-toggle.btn-info:focus,\n.btn-info:active.focus,\n.btn-info.active.focus,\n.open > .dropdown-toggle.btn-info.focus {\n color: #fff;\n background-color: #269abc;\n border-color: #1b6d85;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n background-image: none;\n}\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus {\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info .badge {\n color: #5bc0de;\n background-color: #fff;\n}\n.btn-warning {\n color: #fff;\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning:focus,\n.btn-warning.focus {\n color: #fff;\n background-color: #ec971f;\n border-color: #985f0d;\n}\n.btn-warning:hover {\n color: #fff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n color: #fff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active:hover,\n.btn-warning.active:hover,\n.open > .dropdown-toggle.btn-warning:hover,\n.btn-warning:active:focus,\n.btn-warning.active:focus,\n.open > .dropdown-toggle.btn-warning:focus,\n.btn-warning:active.focus,\n.btn-warning.active.focus,\n.open > .dropdown-toggle.btn-warning.focus {\n color: #fff;\n background-color: #d58512;\n border-color: #985f0d;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n background-image: none;\n}\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus {\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning .badge {\n color: #f0ad4e;\n background-color: #fff;\n}\n.btn-danger {\n color: #fff;\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger:focus,\n.btn-danger.focus {\n color: #fff;\n background-color: #c9302c;\n border-color: #761c19;\n}\n.btn-danger:hover {\n color: #fff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n color: #fff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active:hover,\n.btn-danger.active:hover,\n.open > .dropdown-toggle.btn-danger:hover,\n.btn-danger:active:focus,\n.btn-danger.active:focus,\n.open > .dropdown-toggle.btn-danger:focus,\n.btn-danger:active.focus,\n.btn-danger.active.focus,\n.open > .dropdown-toggle.btn-danger.focus {\n color: #fff;\n background-color: #ac2925;\n border-color: #761c19;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n background-image: none;\n}\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus {\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger .badge {\n color: #d9534f;\n background-color: #fff;\n}\n.btn-link {\n color: #337ab7;\n font-weight: normal;\n border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n background-color: transparent;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n color: #23527c;\n text-decoration: underline;\n background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n color: #777777;\n text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n padding: 1px 5px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-block {\n display: block;\n width: 100%;\n}\n.btn-block + .btn-block {\n margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n.fade {\n opacity: 0;\n -webkit-transition: opacity 0.15s linear;\n -o-transition: opacity 0.15s linear;\n transition: opacity 0.15s linear;\n}\n.fade.in {\n opacity: 1;\n}\n.collapse {\n display: none;\n}\n.collapse.in {\n display: block;\n}\ntr.collapse.in {\n display: table-row;\n}\ntbody.collapse.in {\n display: table-row-group;\n}\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n -webkit-transition-property: height, visibility;\n transition-property: height, visibility;\n -webkit-transition-duration: 0.35s;\n transition-duration: 0.35s;\n -webkit-transition-timing-function: ease;\n transition-timing-function: ease;\n}\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: 4px dashed;\n border-top: 4px solid \\9;\n border-right: 4px solid transparent;\n border-left: 4px solid transparent;\n}\n.dropup,\n.dropdown {\n position: relative;\n}\n.dropdown-toggle:focus {\n outline: 0;\n}\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0;\n list-style: none;\n font-size: 14px;\n text-align: left;\n background-color: #fff;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 4px;\n -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n background-clip: padding-box;\n}\n.dropdown-menu.pull-right {\n right: 0;\n left: auto;\n}\n.dropdown-menu .divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: 1.42857143;\n color: #333333;\n white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n text-decoration: none;\n color: #262626;\n background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n color: #fff;\n text-decoration: none;\n outline: 0;\n background-color: #337ab7;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n color: #777777;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n text-decoration: none;\n background-color: transparent;\n background-image: none;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n cursor: not-allowed;\n}\n.open > .dropdown-menu {\n display: block;\n}\n.open > a {\n outline: 0;\n}\n.dropdown-menu-right {\n left: auto;\n right: 0;\n}\n.dropdown-menu-left {\n left: 0;\n right: auto;\n}\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: 12px;\n line-height: 1.42857143;\n color: #777777;\n white-space: nowrap;\n}\n.dropdown-backdrop {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n z-index: 990;\n}\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n border-top: 0;\n border-bottom: 4px dashed;\n border-bottom: 4px solid \\9;\n content: \"\";\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n}\n@media (min-width: 768px) {\n .navbar-right .dropdown-menu {\n left: auto;\n right: 0;\n }\n .navbar-right .dropdown-menu-left {\n left: 0;\n right: auto;\n }\n}\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n z-index: 2;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n margin-left: -1px;\n}\n.btn-toolbar {\n margin-left: -5px;\n}\n.btn-toolbar .btn,\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n.btn-group > .btn:first-child {\n margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px;\n}\n.btn-group.open .dropdown-toggle {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn .caret {\n margin-left: 0;\n}\n.btn-lg .caret {\n border-width: 5px 5px 0;\n border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n float: none;\n display: table-cell;\n width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n left: auto;\n}\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n.input-group {\n position: relative;\n display: table;\n border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n float: none;\n padding-left: 0;\n padding-right: 0;\n}\n.input-group .form-control {\n position: relative;\n z-index: 2;\n float: left;\n width: 100%;\n margin-bottom: 0;\n}\n.input-group .form-control:focus {\n z-index: 3;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle;\n}\n.input-group-addon {\n padding: 6px 12px;\n font-size: 14px;\n font-weight: normal;\n line-height: 1;\n color: #555555;\n text-align: center;\n background-color: #eeeeee;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\n.input-group-addon.input-sm {\n padding: 5px 10px;\n font-size: 12px;\n border-radius: 3px;\n}\n.input-group-addon.input-lg {\n padding: 10px 16px;\n font-size: 18px;\n border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n.input-group-btn {\n position: relative;\n font-size: 0;\n white-space: nowrap;\n}\n.input-group-btn > .btn {\n position: relative;\n}\n.input-group-btn > .btn + .btn {\n margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n z-index: 2;\n margin-left: -1px;\n}\n.nav {\n margin-bottom: 0;\n padding-left: 0;\n list-style: none;\n}\n.nav > li {\n position: relative;\n display: block;\n}\n.nav > li > a {\n position: relative;\n display: block;\n padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.nav > li.disabled > a {\n color: #777777;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n color: #777777;\n text-decoration: none;\n background-color: transparent;\n cursor: not-allowed;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n background-color: #eeeeee;\n border-color: #337ab7;\n}\n.nav .nav-divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.nav > li > a > img {\n max-width: none;\n}\n.nav-tabs {\n border-bottom: 1px solid #ddd;\n}\n.nav-tabs > li {\n float: left;\n margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n margin-right: 2px;\n line-height: 1.42857143;\n border: 1px solid transparent;\n border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n border-color: #eeeeee #eeeeee #ddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n color: #555555;\n background-color: #fff;\n border: 1px solid #ddd;\n border-bottom-color: transparent;\n cursor: default;\n}\n.nav-tabs.nav-justified {\n width: 100%;\n border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n float: none;\n}\n.nav-tabs.nav-justified > li > a {\n text-align: center;\n margin-bottom: 5px;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-tabs.nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs.nav-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs.nav-justified > .active > a,\n .nav-tabs.nav-justified > .active > a:hover,\n .nav-tabs.nav-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.nav-pills > li {\n float: left;\n}\n.nav-pills > li > a {\n border-radius: 4px;\n}\n.nav-pills > li + li {\n margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n color: #fff;\n background-color: #337ab7;\n}\n.nav-stacked > li {\n float: none;\n}\n.nav-stacked > li + li {\n margin-top: 2px;\n margin-left: 0;\n}\n.nav-justified {\n width: 100%;\n}\n.nav-justified > li {\n float: none;\n}\n.nav-justified > li > a {\n text-align: center;\n margin-bottom: 5px;\n}\n.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs-justified {\n border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs-justified > .active > a,\n .nav-tabs-justified > .active > a:hover,\n .nav-tabs-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.tab-content > .tab-pane {\n display: none;\n}\n.tab-content > .active {\n display: block;\n}\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.navbar {\n position: relative;\n min-height: 50px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n .navbar {\n border-radius: 4px;\n }\n}\n@media (min-width: 768px) {\n .navbar-header {\n float: left;\n }\n}\n.navbar-collapse {\n overflow-x: visible;\n padding-right: 15px;\n padding-left: 15px;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n -webkit-overflow-scrolling: touch;\n}\n.navbar-collapse.in {\n overflow-y: auto;\n}\n@media (min-width: 768px) {\n .navbar-collapse {\n width: auto;\n border-top: 0;\n box-shadow: none;\n }\n .navbar-collapse.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0;\n overflow: visible !important;\n }\n .navbar-collapse.in {\n overflow-y: visible;\n }\n .navbar-fixed-top .navbar-collapse,\n .navbar-static-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n padding-left: 0;\n padding-right: 0;\n }\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n max-height: 340px;\n}\n@media (max-device-width: 480px) and (orientation: landscape) {\n .navbar-fixed-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n max-height: 200px;\n }\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n margin-right: -15px;\n margin-left: -15px;\n}\n@media (min-width: 768px) {\n .container > .navbar-header,\n .container-fluid > .navbar-header,\n .container > .navbar-collapse,\n .container-fluid > .navbar-collapse {\n margin-right: 0;\n margin-left: 0;\n }\n}\n.navbar-static-top {\n z-index: 1000;\n border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n .navbar-static-top {\n border-radius: 0;\n }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n@media (min-width: 768px) {\n .navbar-fixed-top,\n .navbar-fixed-bottom {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0;\n border-width: 1px 0 0;\n}\n.navbar-brand {\n float: left;\n padding: 15px 15px;\n font-size: 18px;\n line-height: 20px;\n height: 50px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n text-decoration: none;\n}\n.navbar-brand > img {\n display: block;\n}\n@media (min-width: 768px) {\n .navbar > .container .navbar-brand,\n .navbar > .container-fluid .navbar-brand {\n margin-left: -15px;\n }\n}\n.navbar-toggle {\n position: relative;\n float: right;\n margin-right: 15px;\n padding: 9px 10px;\n margin-top: 8px;\n margin-bottom: 8px;\n background-color: transparent;\n background-image: none;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.navbar-toggle:focus {\n outline: 0;\n}\n.navbar-toggle .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n margin-top: 4px;\n}\n@media (min-width: 768px) {\n .navbar-toggle {\n display: none;\n }\n}\n.navbar-nav {\n margin: 7.5px -15px;\n}\n.navbar-nav > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: 20px;\n}\n@media (max-width: 767px) {\n .navbar-nav .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n }\n .navbar-nav .open .dropdown-menu > li > a,\n .navbar-nav .open .dropdown-menu .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n .navbar-nav .open .dropdown-menu > li > a {\n line-height: 20px;\n }\n .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-nav .open .dropdown-menu > li > a:focus {\n background-image: none;\n }\n}\n@media (min-width: 768px) {\n .navbar-nav {\n float: left;\n margin: 0;\n }\n .navbar-nav > li {\n float: left;\n }\n .navbar-nav > li > a {\n padding-top: 15px;\n padding-bottom: 15px;\n }\n}\n.navbar-form {\n margin-left: -15px;\n margin-right: -15px;\n padding: 10px 15px;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n margin-top: 8px;\n margin-bottom: 8px;\n}\n@media (min-width: 768px) {\n .navbar-form .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .navbar-form .form-control-static {\n display: inline-block;\n }\n .navbar-form .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .navbar-form .input-group .input-group-addon,\n .navbar-form .input-group .input-group-btn,\n .navbar-form .input-group .form-control {\n width: auto;\n }\n .navbar-form .input-group > .form-control {\n width: 100%;\n }\n .navbar-form .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio,\n .navbar-form .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio label,\n .navbar-form .checkbox label {\n padding-left: 0;\n }\n .navbar-form .radio input[type=\"radio\"],\n .navbar-form .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .navbar-form .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n@media (max-width: 767px) {\n .navbar-form .form-group {\n margin-bottom: 5px;\n }\n .navbar-form .form-group:last-child {\n margin-bottom: 0;\n }\n}\n@media (min-width: 768px) {\n .navbar-form {\n width: auto;\n border: 0;\n margin-left: 0;\n margin-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n}\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.navbar-btn {\n margin-top: 8px;\n margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n margin-top: 14px;\n margin-bottom: 14px;\n}\n.navbar-text {\n margin-top: 15px;\n margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n .navbar-text {\n float: left;\n margin-left: 15px;\n margin-right: 15px;\n }\n}\n@media (min-width: 768px) {\n .navbar-left {\n float: left !important;\n }\n .navbar-right {\n float: right !important;\n margin-right: -15px;\n }\n .navbar-right ~ .navbar-right {\n margin-right: 0;\n }\n}\n.navbar-default {\n background-color: #f8f8f8;\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n color: #777;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n color: #5e5e5e;\n background-color: transparent;\n}\n.navbar-default .navbar-text {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n color: #333;\n background-color: transparent;\n}\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n}\n.navbar-default .navbar-toggle {\n border-color: #ddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n background-color: #ddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n background-color: #888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n background-color: #e7e7e7;\n color: #555;\n}\n@media (max-width: 767px) {\n .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n color: #777;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #333;\n background-color: transparent;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n }\n}\n.navbar-default .navbar-link {\n color: #777;\n}\n.navbar-default .navbar-link:hover {\n color: #333;\n}\n.navbar-default .btn-link {\n color: #777;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n color: #333;\n}\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n color: #ccc;\n}\n.navbar-inverse {\n background-color: #222;\n border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n color: #fff;\n background-color: #080808;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n}\n.navbar-inverse .navbar-toggle {\n border-color: #333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n background-color: #333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n background-color: #fff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n border-color: #101010;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n background-color: #080808;\n color: #fff;\n}\n@media (max-width: 767px) {\n .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n border-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n color: #9d9d9d;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #fff;\n background-color: transparent;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n }\n}\n.navbar-inverse .navbar-link {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-link:hover {\n color: #fff;\n}\n.navbar-inverse .btn-link {\n color: #9d9d9d;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n color: #fff;\n}\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-inverse .btn-link:focus {\n color: #444;\n}\n.breadcrumb {\n padding: 8px 15px;\n margin-bottom: 20px;\n list-style: none;\n background-color: #f5f5f5;\n border-radius: 4px;\n}\n.breadcrumb > li {\n display: inline-block;\n}\n.breadcrumb > li + li:before {\n content: \"/\\00a0\";\n padding: 0 5px;\n color: #ccc;\n}\n.breadcrumb > .active {\n color: #777777;\n}\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: 20px 0;\n border-radius: 4px;\n}\n.pagination > li {\n display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n position: relative;\n float: left;\n padding: 6px 12px;\n line-height: 1.42857143;\n text-decoration: none;\n color: #337ab7;\n background-color: #fff;\n border: 1px solid #ddd;\n margin-left: -1px;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n margin-left: 0;\n border-bottom-left-radius: 4px;\n border-top-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n border-bottom-right-radius: 4px;\n border-top-right-radius: 4px;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n z-index: 2;\n color: #23527c;\n background-color: #eeeeee;\n border-color: #ddd;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n z-index: 3;\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n cursor: default;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n color: #777777;\n background-color: #fff;\n border-color: #ddd;\n cursor: not-allowed;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n border-bottom-left-radius: 6px;\n border-top-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n border-bottom-right-radius: 6px;\n border-top-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n border-bottom-left-radius: 3px;\n border-top-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n border-bottom-right-radius: 3px;\n border-top-right-radius: 3px;\n}\n.pager {\n padding-left: 0;\n margin: 20px 0;\n list-style: none;\n text-align: center;\n}\n.pager li {\n display: inline;\n}\n.pager li > a,\n.pager li > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.pager .next > a,\n.pager .next > span {\n float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n color: #777777;\n background-color: #fff;\n cursor: not-allowed;\n}\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n}\na.label:hover,\na.label:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.label:empty {\n display: none;\n}\n.btn .label {\n position: relative;\n top: -1px;\n}\n.label-default {\n background-color: #777777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n background-color: #5e5e5e;\n}\n.label-primary {\n background-color: #337ab7;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n background-color: #286090;\n}\n.label-success {\n background-color: #5cb85c;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n background-color: #449d44;\n}\n.label-info {\n background-color: #5bc0de;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n background-color: #31b0d5;\n}\n.label-warning {\n background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n background-color: #ec971f;\n}\n.label-danger {\n background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n background-color: #c9302c;\n}\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: 12px;\n font-weight: bold;\n color: #fff;\n line-height: 1;\n vertical-align: middle;\n white-space: nowrap;\n text-align: center;\n background-color: #777777;\n border-radius: 10px;\n}\n.badge:empty {\n display: none;\n}\n.btn .badge {\n position: relative;\n top: -1px;\n}\n.btn-xs .badge,\n.btn-group-xs > .btn .badge {\n top: 0;\n padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.list-group-item > .badge {\n float: right;\n}\n.list-group-item > .badge + .badge {\n margin-right: 5px;\n}\n.nav-pills > li > a > .badge {\n margin-left: 3px;\n}\n.jumbotron {\n padding-top: 30px;\n padding-bottom: 30px;\n margin-bottom: 30px;\n color: inherit;\n background-color: #eeeeee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n color: inherit;\n}\n.jumbotron p {\n margin-bottom: 15px;\n font-size: 21px;\n font-weight: 200;\n}\n.jumbotron > hr {\n border-top-color: #d5d5d5;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n border-radius: 6px;\n padding-left: 15px;\n padding-right: 15px;\n}\n.jumbotron .container {\n max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n .jumbotron {\n padding-top: 48px;\n padding-bottom: 48px;\n }\n .container .jumbotron,\n .container-fluid .jumbotron {\n padding-left: 60px;\n padding-right: 60px;\n }\n .jumbotron h1,\n .jumbotron .h1 {\n font-size: 63px;\n }\n}\n.thumbnail {\n display: block;\n padding: 4px;\n margin-bottom: 20px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: border 0.2s ease-in-out;\n -o-transition: border 0.2s ease-in-out;\n transition: border 0.2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n margin-left: auto;\n margin-right: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n border-color: #337ab7;\n}\n.thumbnail .caption {\n padding: 9px;\n color: #333333;\n}\n.alert {\n padding: 15px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.alert h4 {\n margin-top: 0;\n color: inherit;\n}\n.alert .alert-link {\n font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n margin-bottom: 0;\n}\n.alert > p + p {\n margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n}\n.alert-success {\n background-color: #dff0d8;\n border-color: #d6e9c6;\n color: #3c763d;\n}\n.alert-success hr {\n border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n color: #2b542c;\n}\n.alert-info {\n background-color: #d9edf7;\n border-color: #bce8f1;\n color: #31708f;\n}\n.alert-info hr {\n border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n color: #245269;\n}\n.alert-warning {\n background-color: #fcf8e3;\n border-color: #faebcc;\n color: #8a6d3b;\n}\n.alert-warning hr {\n border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n color: #66512c;\n}\n.alert-danger {\n background-color: #f2dede;\n border-color: #ebccd1;\n color: #a94442;\n}\n.alert-danger hr {\n border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n@keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n.progress {\n overflow: hidden;\n height: 20px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: 12px;\n line-height: 20px;\n color: #fff;\n text-align: center;\n background-color: #337ab7;\n -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n -webkit-transition: width 0.6s ease;\n -o-transition: width 0.6s ease;\n transition: width 0.6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n -webkit-animation: progress-bar-stripes 2s linear infinite;\n -o-animation: progress-bar-stripes 2s linear infinite;\n animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n background-color: #5cb85c;\n}\n.progress-striped .progress-bar-success {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-info {\n background-color: #5bc0de;\n}\n.progress-striped .progress-bar-info {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-warning {\n background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-danger {\n background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.media {\n margin-top: 15px;\n}\n.media:first-child {\n margin-top: 0;\n}\n.media,\n.media-body {\n zoom: 1;\n overflow: hidden;\n}\n.media-body {\n width: 10000px;\n}\n.media-object {\n display: block;\n}\n.media-object.img-thumbnail {\n max-width: none;\n}\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n.media-middle {\n vertical-align: middle;\n}\n.media-bottom {\n vertical-align: bottom;\n}\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n.list-group {\n margin-bottom: 20px;\n padding-left: 0;\n}\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n margin-bottom: -1px;\n background-color: #fff;\n border: 1px solid #ddd;\n}\n.list-group-item:first-child {\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n}\n.list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\na.list-group-item,\nbutton.list-group-item {\n color: #555;\n}\na.list-group-item .list-group-item-heading,\nbutton.list-group-item .list-group-item-heading {\n color: #333;\n}\na.list-group-item:hover,\nbutton.list-group-item:hover,\na.list-group-item:focus,\nbutton.list-group-item:focus {\n text-decoration: none;\n color: #555;\n background-color: #f5f5f5;\n}\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n background-color: #eeeeee;\n color: #777777;\n cursor: not-allowed;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n color: #777777;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n z-index: 2;\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n color: #c7ddef;\n}\n.list-group-item-success {\n color: #3c763d;\n background-color: #dff0d8;\n}\na.list-group-item-success,\nbutton.list-group-item-success {\n color: #3c763d;\n}\na.list-group-item-success .list-group-item-heading,\nbutton.list-group-item-success .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-success:hover,\nbutton.list-group-item-success:hover,\na.list-group-item-success:focus,\nbutton.list-group-item-success:focus {\n color: #3c763d;\n background-color: #d0e9c6;\n}\na.list-group-item-success.active,\nbutton.list-group-item-success.active,\na.list-group-item-success.active:hover,\nbutton.list-group-item-success.active:hover,\na.list-group-item-success.active:focus,\nbutton.list-group-item-success.active:focus {\n color: #fff;\n background-color: #3c763d;\n border-color: #3c763d;\n}\n.list-group-item-info {\n color: #31708f;\n background-color: #d9edf7;\n}\na.list-group-item-info,\nbutton.list-group-item-info {\n color: #31708f;\n}\na.list-group-item-info .list-group-item-heading,\nbutton.list-group-item-info .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-info:hover,\nbutton.list-group-item-info:hover,\na.list-group-item-info:focus,\nbutton.list-group-item-info:focus {\n color: #31708f;\n background-color: #c4e3f3;\n}\na.list-group-item-info.active,\nbutton.list-group-item-info.active,\na.list-group-item-info.active:hover,\nbutton.list-group-item-info.active:hover,\na.list-group-item-info.active:focus,\nbutton.list-group-item-info.active:focus {\n color: #fff;\n background-color: #31708f;\n border-color: #31708f;\n}\n.list-group-item-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n}\na.list-group-item-warning,\nbutton.list-group-item-warning {\n color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading,\nbutton.list-group-item-warning .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-warning:hover,\nbutton.list-group-item-warning:hover,\na.list-group-item-warning:focus,\nbutton.list-group-item-warning:focus {\n color: #8a6d3b;\n background-color: #faf2cc;\n}\na.list-group-item-warning.active,\nbutton.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\nbutton.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus,\nbutton.list-group-item-warning.active:focus {\n color: #fff;\n background-color: #8a6d3b;\n border-color: #8a6d3b;\n}\n.list-group-item-danger {\n color: #a94442;\n background-color: #f2dede;\n}\na.list-group-item-danger,\nbutton.list-group-item-danger {\n color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading,\nbutton.list-group-item-danger .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-danger:hover,\nbutton.list-group-item-danger:hover,\na.list-group-item-danger:focus,\nbutton.list-group-item-danger:focus {\n color: #a94442;\n background-color: #ebcccc;\n}\na.list-group-item-danger.active,\nbutton.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\nbutton.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus,\nbutton.list-group-item-danger.active:focus {\n color: #fff;\n background-color: #a94442;\n border-color: #a94442;\n}\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n.panel {\n margin-bottom: 20px;\n background-color: #fff;\n border: 1px solid transparent;\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.panel-body {\n padding: 15px;\n}\n.panel-heading {\n padding: 10px 15px;\n border-bottom: 1px solid transparent;\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n color: inherit;\n}\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: 16px;\n color: inherit;\n}\n.panel-title > a,\n.panel-title > small,\n.panel-title > .small,\n.panel-title > small > a,\n.panel-title > .small > a {\n color: inherit;\n}\n.panel-footer {\n padding: 10px 15px;\n background-color: #f5f5f5;\n border-top: 1px solid #ddd;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n border-top: 0;\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n border-bottom: 0;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n border-top-width: 0;\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n padding-left: 15px;\n padding-right: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n border-bottom-left-radius: 3px;\n border-bottom-right-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n border-top: 1px solid #ddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n border-bottom: 0;\n}\n.panel > .table-responsive {\n border: 0;\n margin-bottom: 0;\n}\n.panel-group {\n margin-bottom: 20px;\n}\n.panel-group .panel {\n margin-bottom: 0;\n border-radius: 4px;\n}\n.panel-group .panel + .panel {\n margin-top: 5px;\n}\n.panel-group .panel-heading {\n border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n border-top: 1px solid #ddd;\n}\n.panel-group .panel-footer {\n border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n border-bottom: 1px solid #ddd;\n}\n.panel-default {\n border-color: #ddd;\n}\n.panel-default > .panel-heading {\n color: #333333;\n background-color: #f5f5f5;\n border-color: #ddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ddd;\n}\n.panel-default > .panel-heading .badge {\n color: #f5f5f5;\n background-color: #333333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ddd;\n}\n.panel-primary {\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading {\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #337ab7;\n}\n.panel-primary > .panel-heading .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #337ab7;\n}\n.panel-success {\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n color: #dff0d8;\n background-color: #3c763d;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #d6e9c6;\n}\n.panel-info {\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #bce8f1;\n}\n.panel-info > .panel-heading .badge {\n color: #d9edf7;\n background-color: #31708f;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #bce8f1;\n}\n.panel-warning {\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n color: #fcf8e3;\n background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #faebcc;\n}\n.panel-danger {\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n color: #f2dede;\n background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n height: 100%;\n width: 100%;\n border: 0;\n}\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border: 1px solid #e3e3e3;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.well blockquote {\n border-color: #ddd;\n border-color: rgba(0, 0, 0, 0.15);\n}\n.well-lg {\n padding: 24px;\n border-radius: 6px;\n}\n.well-sm {\n padding: 9px;\n border-radius: 3px;\n}\n.close {\n float: right;\n font-size: 21px;\n font-weight: bold;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n opacity: 0.2;\n filter: alpha(opacity=20);\n}\n.close:hover,\n.close:focus {\n color: #000;\n text-decoration: none;\n cursor: pointer;\n opacity: 0.5;\n filter: alpha(opacity=50);\n}\nbutton.close {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n}\n.modal-open {\n overflow: hidden;\n}\n.modal {\n display: none;\n overflow: hidden;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1050;\n -webkit-overflow-scrolling: touch;\n outline: 0;\n}\n.modal.fade .modal-dialog {\n -webkit-transform: translate(0, -25%);\n -ms-transform: translate(0, -25%);\n -o-transform: translate(0, -25%);\n transform: translate(0, -25%);\n -webkit-transition: -webkit-transform 0.3s ease-out;\n -moz-transition: -moz-transform 0.3s ease-out;\n -o-transition: -o-transform 0.3s ease-out;\n transition: transform 0.3s ease-out;\n}\n.modal.in .modal-dialog {\n -webkit-transform: translate(0, 0);\n -ms-transform: translate(0, 0);\n -o-transform: translate(0, 0);\n transform: translate(0, 0);\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n.modal-content {\n position: relative;\n background-color: #fff;\n border: 1px solid #999;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n background-clip: padding-box;\n outline: 0;\n}\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1040;\n background-color: #000;\n}\n.modal-backdrop.fade {\n opacity: 0;\n filter: alpha(opacity=0);\n}\n.modal-backdrop.in {\n opacity: 0.5;\n filter: alpha(opacity=50);\n}\n.modal-header {\n padding: 15px;\n border-bottom: 1px solid #e5e5e5;\n}\n.modal-header .close {\n margin-top: -2px;\n}\n.modal-title {\n margin: 0;\n line-height: 1.42857143;\n}\n.modal-body {\n position: relative;\n padding: 15px;\n}\n.modal-footer {\n padding: 15px;\n text-align: right;\n border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0;\n}\n.modal-footer .btn-group .btn + .btn {\n margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n margin-left: 0;\n}\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n@media (min-width: 768px) {\n .modal-dialog {\n width: 600px;\n margin: 30px auto;\n }\n .modal-content {\n -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n }\n .modal-sm {\n width: 300px;\n }\n}\n@media (min-width: 992px) {\n .modal-lg {\n width: 900px;\n }\n}\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: 1.42857143;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n font-size: 12px;\n opacity: 0;\n filter: alpha(opacity=0);\n}\n.tooltip.in {\n opacity: 0.9;\n filter: alpha(opacity=90);\n}\n.tooltip.top {\n margin-top: -3px;\n padding: 5px 0;\n}\n.tooltip.right {\n margin-left: 3px;\n padding: 0 5px;\n}\n.tooltip.bottom {\n margin-top: 3px;\n padding: 5px 0;\n}\n.tooltip.left {\n margin-left: -3px;\n padding: 0 5px;\n}\n.tooltip-inner {\n max-width: 200px;\n padding: 3px 8px;\n color: #fff;\n text-align: center;\n background-color: #000;\n border-radius: 4px;\n}\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.tooltip.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-left .tooltip-arrow {\n bottom: 0;\n right: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-right .tooltip-arrow {\n bottom: 0;\n left: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -5px;\n border-width: 5px 5px 5px 0;\n border-right-color: #000;\n}\n.tooltip.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -5px;\n border-width: 5px 0 5px 5px;\n border-left-color: #000;\n}\n.tooltip.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n top: 0;\n right: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n top: 0;\n left: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: none;\n max-width: 276px;\n padding: 1px;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: 1.42857143;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n font-size: 14px;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n}\n.popover.top {\n margin-top: -10px;\n}\n.popover.right {\n margin-left: 10px;\n}\n.popover.bottom {\n margin-top: 10px;\n}\n.popover.left {\n margin-left: -10px;\n}\n.popover-title {\n margin: 0;\n padding: 8px 14px;\n font-size: 14px;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-radius: 5px 5px 0 0;\n}\n.popover-content {\n padding: 9px 14px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.popover > .arrow {\n border-width: 11px;\n}\n.popover > .arrow:after {\n border-width: 10px;\n content: \"\";\n}\n.popover.top > .arrow {\n left: 50%;\n margin-left: -11px;\n border-bottom-width: 0;\n border-top-color: #999999;\n border-top-color: rgba(0, 0, 0, 0.25);\n bottom: -11px;\n}\n.popover.top > .arrow:after {\n content: \" \";\n bottom: 1px;\n margin-left: -10px;\n border-bottom-width: 0;\n border-top-color: #fff;\n}\n.popover.right > .arrow {\n top: 50%;\n left: -11px;\n margin-top: -11px;\n border-left-width: 0;\n border-right-color: #999999;\n border-right-color: rgba(0, 0, 0, 0.25);\n}\n.popover.right > .arrow:after {\n content: \" \";\n left: 1px;\n bottom: -10px;\n border-left-width: 0;\n border-right-color: #fff;\n}\n.popover.bottom > .arrow {\n left: 50%;\n margin-left: -11px;\n border-top-width: 0;\n border-bottom-color: #999999;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n top: -11px;\n}\n.popover.bottom > .arrow:after {\n content: \" \";\n top: 1px;\n margin-left: -10px;\n border-top-width: 0;\n border-bottom-color: #fff;\n}\n.popover.left > .arrow {\n top: 50%;\n right: -11px;\n margin-top: -11px;\n border-right-width: 0;\n border-left-color: #999999;\n border-left-color: rgba(0, 0, 0, 0.25);\n}\n.popover.left > .arrow:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: #fff;\n bottom: -10px;\n}\n.carousel {\n position: relative;\n}\n.carousel-inner {\n position: relative;\n overflow: hidden;\n width: 100%;\n}\n.carousel-inner > .item {\n display: none;\n position: relative;\n -webkit-transition: 0.6s ease-in-out left;\n -o-transition: 0.6s ease-in-out left;\n transition: 0.6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n line-height: 1;\n}\n@media all and (transform-3d), (-webkit-transform-3d) {\n .carousel-inner > .item {\n -webkit-transition: -webkit-transform 0.6s ease-in-out;\n -moz-transition: -moz-transform 0.6s ease-in-out;\n -o-transition: -o-transform 0.6s ease-in-out;\n transition: transform 0.6s ease-in-out;\n -webkit-backface-visibility: hidden;\n -moz-backface-visibility: hidden;\n backface-visibility: hidden;\n -webkit-perspective: 1000px;\n -moz-perspective: 1000px;\n perspective: 1000px;\n }\n .carousel-inner > .item.next,\n .carousel-inner > .item.active.right {\n -webkit-transform: translate3d(100%, 0, 0);\n transform: translate3d(100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.prev,\n .carousel-inner > .item.active.left {\n -webkit-transform: translate3d(-100%, 0, 0);\n transform: translate3d(-100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.next.left,\n .carousel-inner > .item.prev.right,\n .carousel-inner > .item.active {\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n left: 0;\n }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n display: block;\n}\n.carousel-inner > .active {\n left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n}\n.carousel-inner > .next {\n left: 100%;\n}\n.carousel-inner > .prev {\n left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n left: 0;\n}\n.carousel-inner > .active.left {\n left: -100%;\n}\n.carousel-inner > .active.right {\n left: 100%;\n}\n.carousel-control {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: 15%;\n opacity: 0.5;\n filter: alpha(opacity=50);\n font-size: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n background-color: rgba(0, 0, 0, 0);\n}\n.carousel-control.left {\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n}\n.carousel-control.right {\n left: auto;\n right: 0;\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n}\n.carousel-control:hover,\n.carousel-control:focus {\n outline: 0;\n color: #fff;\n text-decoration: none;\n opacity: 0.9;\n filter: alpha(opacity=90);\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n margin-top: -10px;\n z-index: 5;\n display: inline-block;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n width: 20px;\n height: 20px;\n line-height: 1;\n font-family: serif;\n}\n.carousel-control .icon-prev:before {\n content: '\\2039';\n}\n.carousel-control .icon-next:before {\n content: '\\203a';\n}\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n margin-left: -30%;\n padding-left: 0;\n list-style: none;\n text-align: center;\n}\n.carousel-indicators li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n border: 1px solid #fff;\n border-radius: 10px;\n cursor: pointer;\n background-color: #000 \\9;\n background-color: rgba(0, 0, 0, 0);\n}\n.carousel-indicators .active {\n margin: 0;\n width: 12px;\n height: 12px;\n background-color: #fff;\n}\n.carousel-caption {\n position: absolute;\n left: 15%;\n right: 15%;\n bottom: 20px;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-caption .btn {\n text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-prev,\n .carousel-control .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -10px;\n font-size: 30px;\n }\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .icon-prev {\n margin-left: -10px;\n }\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-next {\n margin-right: -10px;\n }\n .carousel-caption {\n left: 20%;\n right: 20%;\n padding-bottom: 30px;\n }\n .carousel-indicators {\n bottom: 20px;\n }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-header:before,\n.modal-header:after,\n.modal-footer:before,\n.modal-footer:after {\n content: \" \";\n display: table;\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-header:after,\n.modal-footer:after {\n clear: both;\n}\n.center-block {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n.hidden {\n display: none !important;\n}\n.affix {\n position: fixed;\n}\n@-ms-viewport {\n width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n@media (max-width: 767px) {\n .visible-xs {\n display: block !important;\n }\n table.visible-xs {\n display: table !important;\n }\n tr.visible-xs {\n display: table-row !important;\n }\n th.visible-xs,\n td.visible-xs {\n display: table-cell !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-block {\n display: block !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline {\n display: inline !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm {\n display: block !important;\n }\n table.visible-sm {\n display: table !important;\n }\n tr.visible-sm {\n display: table-row !important;\n }\n th.visible-sm,\n td.visible-sm {\n display: table-cell !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-block {\n display: block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline {\n display: inline !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md {\n display: block !important;\n }\n table.visible-md {\n display: table !important;\n }\n tr.visible-md {\n display: table-row !important;\n }\n th.visible-md,\n td.visible-md {\n display: table-cell !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-block {\n display: block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline {\n display: inline !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg {\n display: block !important;\n }\n table.visible-lg {\n display: table !important;\n }\n tr.visible-lg {\n display: table-row !important;\n }\n th.visible-lg,\n td.visible-lg {\n display: table-cell !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-block {\n display: block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline {\n display: inline !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline-block {\n display: inline-block !important;\n }\n}\n@media (max-width: 767px) {\n .hidden-xs {\n display: none !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .hidden-sm {\n display: none !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .hidden-md {\n display: none !important;\n }\n}\n@media (min-width: 1200px) {\n .hidden-lg {\n display: none !important;\n }\n}\n.visible-print {\n display: none !important;\n}\n@media print {\n .visible-print {\n display: block !important;\n }\n table.visible-print {\n display: table !important;\n }\n tr.visible-print {\n display: table-row !important;\n }\n th.visible-print,\n td.visible-print {\n display: table-cell !important;\n }\n}\n.visible-print-block {\n display: none !important;\n}\n@media print {\n .visible-print-block {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n}\n@media print {\n .visible-print-inline {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n}\n@media print {\n .visible-print-inline-block {\n display: inline-block !important;\n }\n}\n@media print {\n .hidden-print {\n display: none !important;\n }\n}\n/*# sourceMappingURL=bootstrap.css.map */","/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\n\n//\n// 1. Set default font family to sans-serif.\n// 2. Prevent iOS and IE text size adjust after device orientation change,\n// without disabling user zoom.\n//\n\nhtml {\n font-family: sans-serif; // 1\n -ms-text-size-adjust: 100%; // 2\n -webkit-text-size-adjust: 100%; // 2\n}\n\n//\n// Remove default margin.\n//\n\nbody {\n margin: 0;\n}\n\n// HTML5 display definitions\n// ==========================================================================\n\n//\n// Correct `block` display not defined for any HTML5 element in IE 8/9.\n// Correct `block` display not defined for `details` or `summary` in IE 10/11\n// and Firefox.\n// Correct `block` display not defined for `main` in IE 11.\n//\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\n\n//\n// 1. Correct `inline-block` display not defined in IE 8/9.\n// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n//\n\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block; // 1\n vertical-align: baseline; // 2\n}\n\n//\n// Prevent modern browsers from displaying `audio` without controls.\n// Remove excess height in iOS 5 devices.\n//\n\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n\n//\n// Address `[hidden]` styling not present in IE 8/9/10.\n// Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22.\n//\n\n[hidden],\ntemplate {\n display: none;\n}\n\n// Links\n// ==========================================================================\n\n//\n// Remove the gray background color from active links in IE 10.\n//\n\na {\n background-color: transparent;\n}\n\n//\n// Improve readability of focused elements when they are also in an\n// active/hover state.\n//\n\na:active,\na:hover {\n outline: 0;\n}\n\n// Text-level semantics\n// ==========================================================================\n\n//\n// Address styling not present in IE 8/9/10/11, Safari, and Chrome.\n//\n\nabbr[title] {\n border-bottom: 1px dotted;\n}\n\n//\n// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n//\n\nb,\nstrong {\n font-weight: bold;\n}\n\n//\n// Address styling not present in Safari and Chrome.\n//\n\ndfn {\n font-style: italic;\n}\n\n//\n// Address variable `h1` font-size and margin within `section` and `article`\n// contexts in Firefox 4+, Safari, and Chrome.\n//\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n//\n// Address styling not present in IE 8/9.\n//\n\nmark {\n background: #ff0;\n color: #000;\n}\n\n//\n// Address inconsistent and variable font size in all browsers.\n//\n\nsmall {\n font-size: 80%;\n}\n\n//\n// Prevent `sub` and `sup` affecting `line-height` in all browsers.\n//\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsup {\n top: -0.5em;\n}\n\nsub {\n bottom: -0.25em;\n}\n\n// Embedded content\n// ==========================================================================\n\n//\n// Remove border when inside `a` element in IE 8/9/10.\n//\n\nimg {\n border: 0;\n}\n\n//\n// Correct overflow not hidden in IE 9/10/11.\n//\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\n// Grouping content\n// ==========================================================================\n\n//\n// Address margin not present in IE 8/9 and Safari.\n//\n\nfigure {\n margin: 1em 40px;\n}\n\n//\n// Address differences between Firefox and other browsers.\n//\n\nhr {\n box-sizing: content-box;\n height: 0;\n}\n\n//\n// Contain overflow in all browsers.\n//\n\npre {\n overflow: auto;\n}\n\n//\n// Address odd `em`-unit font size rendering in all browsers.\n//\n\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\n// Forms\n// ==========================================================================\n\n//\n// Known limitation: by default, Chrome and Safari on OS X allow very limited\n// styling of `select`, unless a `border` property is set.\n//\n\n//\n// 1. Correct color not being inherited.\n// Known issue: affects color of disabled elements.\n// 2. Correct font properties not being inherited.\n// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n//\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit; // 1\n font: inherit; // 2\n margin: 0; // 3\n}\n\n//\n// Address `overflow` set to `hidden` in IE 8/9/10/11.\n//\n\nbutton {\n overflow: visible;\n}\n\n//\n// Address inconsistent `text-transform` inheritance for `button` and `select`.\n// All other form control elements do not inherit `text-transform` values.\n// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n// Correct `select` style inheritance in Firefox.\n//\n\nbutton,\nselect {\n text-transform: none;\n}\n\n//\n// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n// and `video` controls.\n// 2. Correct inability to style clickable `input` types in iOS.\n// 3. Improve usability and consistency of cursor style between image-type\n// `input` and others.\n//\n\nbutton,\nhtml input[type=\"button\"], // 1\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button; // 2\n cursor: pointer; // 3\n}\n\n//\n// Re-set default cursor for disabled elements.\n//\n\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\n\n//\n// Remove inner padding and border in Firefox 4+.\n//\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\n\n//\n// Address Firefox 4+ setting `line-height` on `input` using `!important` in\n// the UA stylesheet.\n//\n\ninput {\n line-height: normal;\n}\n\n//\n// It's recommended that you don't attempt to style these elements.\n// Firefox's implementation doesn't respect box-sizing, padding, or width.\n//\n// 1. Address box sizing set to `content-box` in IE 8/9/10.\n// 2. Remove excess padding in IE 8/9/10.\n//\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box; // 1\n padding: 0; // 2\n}\n\n//\n// Fix the cursor style for Chrome's increment/decrement buttons. For certain\n// `font-size` values of the `input`, it causes the cursor style of the\n// decrement button to change from `default` to `text`.\n//\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n//\n// 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n// 2. Address `box-sizing` set to `border-box` in Safari and Chrome.\n//\n\ninput[type=\"search\"] {\n -webkit-appearance: textfield; // 1\n box-sizing: content-box; //2\n}\n\n//\n// Remove inner padding and search cancel button in Safari and Chrome on OS X.\n// Safari (but not Chrome) clips the cancel button when the search input has\n// padding (and `textfield` appearance).\n//\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// Define consistent border, margin, and padding.\n//\n\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\n\n//\n// 1. Correct `color` not being inherited in IE 8/9/10/11.\n// 2. Remove padding so people aren't caught out if they zero out fieldsets.\n//\n\nlegend {\n border: 0; // 1\n padding: 0; // 2\n}\n\n//\n// Remove default vertical scrollbar in IE 8/9/10/11.\n//\n\ntextarea {\n overflow: auto;\n}\n\n//\n// Don't inherit the `font-weight` (applied by a rule above).\n// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n//\n\noptgroup {\n font-weight: bold;\n}\n\n// Tables\n// ==========================================================================\n\n//\n// Remove most spacing between table cells.\n//\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\ntd,\nth {\n padding: 0;\n}\n","/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n\n// ==========================================================================\n// Print styles.\n// Inlined to avoid the additional HTTP request: h5bp.com/r\n// ==========================================================================\n\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important; // Black prints faster: h5bp.com/s\n box-shadow: none !important;\n text-shadow: none !important;\n }\n\n a,\n a:visited {\n text-decoration: underline;\n }\n\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n\n // Don't show links that are fragment identifiers,\n // or use the `javascript:` pseudo protocol\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n\n thead {\n display: table-header-group; // h5bp.com/t\n }\n\n tr,\n img {\n page-break-inside: avoid;\n }\n\n img {\n max-width: 100% !important;\n }\n\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n\n h2,\n h3 {\n page-break-after: avoid;\n }\n\n // Bootstrap specific changes start\n\n // Bootstrap components\n .navbar {\n display: none;\n }\n .btn,\n .dropup > .btn {\n > .caret {\n border-top-color: #000 !important;\n }\n }\n .label {\n border: 1px solid #000;\n }\n\n .table {\n border-collapse: collapse !important;\n\n td,\n th {\n background-color: #fff !important;\n }\n }\n .table-bordered {\n th,\n td {\n border: 1px solid #ddd !important;\n }\n }\n\n // Bootstrap specific changes end\n}\n","//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus automatically sized to match the surrounding child. To use, create an\n// inline element with the appropriate classes, like so:\n//\n// <a href=\"#\"><span class=\"glyphicon glyphicon-star\"></span> Star</a>\n\n// Import the fonts\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url('@{icon-font-path}@{icon-font-name}.eot');\n src: url('@{icon-font-path}@{icon-font-name}.eot?#iefix') format('embedded-opentype'),\n url('@{icon-font-path}@{icon-font-name}.woff2') format('woff2'),\n url('@{icon-font-path}@{icon-font-name}.woff') format('woff'),\n url('@{icon-font-path}@{icon-font-name}.ttf') format('truetype'),\n url('@{icon-font-path}@{icon-font-name}.svg#@{icon-font-svg-id}') format('svg');\n}\n\n// Catchall baseclass\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n// Individual icons\n.glyphicon-asterisk { &:before { content: \"\\002a\"; } }\n.glyphicon-plus { &:before { content: \"\\002b\"; } }\n.glyphicon-euro,\n.glyphicon-eur { &:before { content: \"\\20ac\"; } }\n.glyphicon-minus { &:before { content: \"\\2212\"; } }\n.glyphicon-cloud { &:before { content: \"\\2601\"; } }\n.glyphicon-envelope { &:before { content: \"\\2709\"; } }\n.glyphicon-pencil { &:before { content: \"\\270f\"; } }\n.glyphicon-glass { &:before { content: \"\\e001\"; } }\n.glyphicon-music { &:before { content: \"\\e002\"; } }\n.glyphicon-search { &:before { content: \"\\e003\"; } }\n.glyphicon-heart { &:before { content: \"\\e005\"; } }\n.glyphicon-star { &:before { content: \"\\e006\"; } }\n.glyphicon-star-empty { &:before { content: \"\\e007\"; } }\n.glyphicon-user { &:before { content: \"\\e008\"; } }\n.glyphicon-film { &:before { content: \"\\e009\"; } }\n.glyphicon-th-large { &:before { content: \"\\e010\"; } }\n.glyphicon-th { &:before { content: \"\\e011\"; } }\n.glyphicon-th-list { &:before { content: \"\\e012\"; } }\n.glyphicon-ok { &:before { content: \"\\e013\"; } }\n.glyphicon-remove { &:before { content: \"\\e014\"; } }\n.glyphicon-zoom-in { &:before { content: \"\\e015\"; } }\n.glyphicon-zoom-out { &:before { content: \"\\e016\"; } }\n.glyphicon-off { &:before { content: \"\\e017\"; } }\n.glyphicon-signal { &:before { content: \"\\e018\"; } }\n.glyphicon-cog { &:before { content: \"\\e019\"; } }\n.glyphicon-trash { &:before { content: \"\\e020\"; } }\n.glyphicon-home { &:before { content: \"\\e021\"; } }\n.glyphicon-file { &:before { content: \"\\e022\"; } }\n.glyphicon-time { &:before { content: \"\\e023\"; } }\n.glyphicon-road { &:before { content: \"\\e024\"; } }\n.glyphicon-download-alt { &:before { content: \"\\e025\"; } }\n.glyphicon-download { &:before { content: \"\\e026\"; } }\n.glyphicon-upload { &:before { content: \"\\e027\"; } }\n.glyphicon-inbox { &:before { content: \"\\e028\"; } }\n.glyphicon-play-circle { &:before { content: \"\\e029\"; } }\n.glyphicon-repeat { &:before { content: \"\\e030\"; } }\n.glyphicon-refresh { &:before { content: \"\\e031\"; } }\n.glyphicon-list-alt { &:before { content: \"\\e032\"; } }\n.glyphicon-lock { &:before { content: \"\\e033\"; } }\n.glyphicon-flag { &:before { content: \"\\e034\"; } }\n.glyphicon-headphones { &:before { content: \"\\e035\"; } }\n.glyphicon-volume-off { &:before { content: \"\\e036\"; } }\n.glyphicon-volume-down { &:before { content: \"\\e037\"; } }\n.glyphicon-volume-up { &:before { content: \"\\e038\"; } }\n.glyphicon-qrcode { &:before { content: \"\\e039\"; } }\n.glyphicon-barcode { &:before { content: \"\\e040\"; } }\n.glyphicon-tag { &:before { content: \"\\e041\"; } }\n.glyphicon-tags { &:before { content: \"\\e042\"; } }\n.glyphicon-book { &:before { content: \"\\e043\"; } }\n.glyphicon-bookmark { &:before { content: \"\\e044\"; } }\n.glyphicon-print { &:before { content: \"\\e045\"; } }\n.glyphicon-camera { &:before { content: \"\\e046\"; } }\n.glyphicon-font { &:before { content: \"\\e047\"; } }\n.glyphicon-bold { &:before { content: \"\\e048\"; } }\n.glyphicon-italic { &:before { content: \"\\e049\"; } }\n.glyphicon-text-height { &:before { content: \"\\e050\"; } }\n.glyphicon-text-width { &:before { content: \"\\e051\"; } }\n.glyphicon-align-left { &:before { content: \"\\e052\"; } }\n.glyphicon-align-center { &:before { content: \"\\e053\"; } }\n.glyphicon-align-right { &:before { content: \"\\e054\"; } }\n.glyphicon-align-justify { &:before { content: \"\\e055\"; } }\n.glyphicon-list { &:before { content: \"\\e056\"; } }\n.glyphicon-indent-left { &:before { content: \"\\e057\"; } }\n.glyphicon-indent-right { &:before { content: \"\\e058\"; } }\n.glyphicon-facetime-video { &:before { content: \"\\e059\"; } }\n.glyphicon-picture { &:before { content: \"\\e060\"; } }\n.glyphicon-map-marker { &:before { content: \"\\e062\"; } }\n.glyphicon-adjust { &:before { content: \"\\e063\"; } }\n.glyphicon-tint { &:before { content: \"\\e064\"; } }\n.glyphicon-edit { &:before { content: \"\\e065\"; } }\n.glyphicon-share { &:before { content: \"\\e066\"; } }\n.glyphicon-check { &:before { content: \"\\e067\"; } }\n.glyphicon-move { &:before { content: \"\\e068\"; } }\n.glyphicon-step-backward { &:before { content: \"\\e069\"; } }\n.glyphicon-fast-backward { &:before { content: \"\\e070\"; } }\n.glyphicon-backward { &:before { content: \"\\e071\"; } }\n.glyphicon-play { &:before { content: \"\\e072\"; } }\n.glyphicon-pause { &:before { content: \"\\e073\"; } }\n.glyphicon-stop { &:before { content: \"\\e074\"; } }\n.glyphicon-forward { &:before { content: \"\\e075\"; } }\n.glyphicon-fast-forward { &:before { content: \"\\e076\"; } }\n.glyphicon-step-forward { &:before { content: \"\\e077\"; } }\n.glyphicon-eject { &:before { content: \"\\e078\"; } }\n.glyphicon-chevron-left { &:before { content: \"\\e079\"; } }\n.glyphicon-chevron-right { &:before { content: \"\\e080\"; } }\n.glyphicon-plus-sign { &:before { content: \"\\e081\"; } }\n.glyphicon-minus-sign { &:before { content: \"\\e082\"; } }\n.glyphicon-remove-sign { &:before { content: \"\\e083\"; } }\n.glyphicon-ok-sign { &:before { content: \"\\e084\"; } }\n.glyphicon-question-sign { &:before { content: \"\\e085\"; } }\n.glyphicon-info-sign { &:before { content: \"\\e086\"; } }\n.glyphicon-screenshot { &:before { content: \"\\e087\"; } }\n.glyphicon-remove-circle { &:before { content: \"\\e088\"; } }\n.glyphicon-ok-circle { &:before { content: \"\\e089\"; } }\n.glyphicon-ban-circle { &:before { content: \"\\e090\"; } }\n.glyphicon-arrow-left { &:before { content: \"\\e091\"; } }\n.glyphicon-arrow-right { &:before { content: \"\\e092\"; } }\n.glyphicon-arrow-up { &:before { content: \"\\e093\"; } }\n.glyphicon-arrow-down { &:before { content: \"\\e094\"; } }\n.glyphicon-share-alt { &:before { content: \"\\e095\"; } }\n.glyphicon-resize-full { &:before { content: \"\\e096\"; } }\n.glyphicon-resize-small { &:before { content: \"\\e097\"; } }\n.glyphicon-exclamation-sign { &:before { content: \"\\e101\"; } }\n.glyphicon-gift { &:before { content: \"\\e102\"; } }\n.glyphicon-leaf { &:before { content: \"\\e103\"; } }\n.glyphicon-fire { &:before { content: \"\\e104\"; } }\n.glyphicon-eye-open { &:before { content: \"\\e105\"; } }\n.glyphicon-eye-close { &:before { content: \"\\e106\"; } }\n.glyphicon-warning-sign { &:before { content: \"\\e107\"; } }\n.glyphicon-plane { &:before { content: \"\\e108\"; } }\n.glyphicon-calendar { &:before { content: \"\\e109\"; } }\n.glyphicon-random { &:before { content: \"\\e110\"; } }\n.glyphicon-comment { &:before { content: \"\\e111\"; } }\n.glyphicon-magnet { &:before { content: \"\\e112\"; } }\n.glyphicon-chevron-up { &:before { content: \"\\e113\"; } }\n.glyphicon-chevron-down { &:before { content: \"\\e114\"; } }\n.glyphicon-retweet { &:before { content: \"\\e115\"; } }\n.glyphicon-shopping-cart { &:before { content: \"\\e116\"; } }\n.glyphicon-folder-close { &:before { content: \"\\e117\"; } }\n.glyphicon-folder-open { &:before { content: \"\\e118\"; } }\n.glyphicon-resize-vertical { &:before { content: \"\\e119\"; } }\n.glyphicon-resize-horizontal { &:before { content: \"\\e120\"; } }\n.glyphicon-hdd { &:before { content: \"\\e121\"; } }\n.glyphicon-bullhorn { &:before { content: \"\\e122\"; } }\n.glyphicon-bell { &:before { content: \"\\e123\"; } }\n.glyphicon-certificate { &:before { content: \"\\e124\"; } }\n.glyphicon-thumbs-up { &:before { content: \"\\e125\"; } }\n.glyphicon-thumbs-down { &:before { content: \"\\e126\"; } }\n.glyphicon-hand-right { &:before { content: \"\\e127\"; } }\n.glyphicon-hand-left { &:before { content: \"\\e128\"; } }\n.glyphicon-hand-up { &:before { content: \"\\e129\"; } }\n.glyphicon-hand-down { &:before { content: \"\\e130\"; } }\n.glyphicon-circle-arrow-right { &:before { content: \"\\e131\"; } }\n.glyphicon-circle-arrow-left { &:before { content: \"\\e132\"; } }\n.glyphicon-circle-arrow-up { &:before { content: \"\\e133\"; } }\n.glyphicon-circle-arrow-down { &:before { content: \"\\e134\"; } }\n.glyphicon-globe { &:before { content: \"\\e135\"; } }\n.glyphicon-wrench { &:before { content: \"\\e136\"; } }\n.glyphicon-tasks { &:before { content: \"\\e137\"; } }\n.glyphicon-filter { &:before { content: \"\\e138\"; } }\n.glyphicon-briefcase { &:before { content: \"\\e139\"; } }\n.glyphicon-fullscreen { &:before { content: \"\\e140\"; } }\n.glyphicon-dashboard { &:before { content: \"\\e141\"; } }\n.glyphicon-paperclip { &:before { content: \"\\e142\"; } }\n.glyphicon-heart-empty { &:before { content: \"\\e143\"; } }\n.glyphicon-link { &:before { content: \"\\e144\"; } }\n.glyphicon-phone { &:before { content: \"\\e145\"; } }\n.glyphicon-pushpin { &:before { content: \"\\e146\"; } }\n.glyphicon-usd { &:before { content: \"\\e148\"; } }\n.glyphicon-gbp { &:before { content: \"\\e149\"; } }\n.glyphicon-sort { &:before { content: \"\\e150\"; } }\n.glyphicon-sort-by-alphabet { &:before { content: \"\\e151\"; } }\n.glyphicon-sort-by-alphabet-alt { &:before { content: \"\\e152\"; } }\n.glyphicon-sort-by-order { &:before { content: \"\\e153\"; } }\n.glyphicon-sort-by-order-alt { &:before { content: \"\\e154\"; } }\n.glyphicon-sort-by-attributes { &:before { content: \"\\e155\"; } }\n.glyphicon-sort-by-attributes-alt { &:before { content: \"\\e156\"; } }\n.glyphicon-unchecked { &:before { content: \"\\e157\"; } }\n.glyphicon-expand { &:before { content: \"\\e158\"; } }\n.glyphicon-collapse-down { &:before { content: \"\\e159\"; } }\n.glyphicon-collapse-up { &:before { content: \"\\e160\"; } }\n.glyphicon-log-in { &:before { content: \"\\e161\"; } }\n.glyphicon-flash { &:before { content: \"\\e162\"; } }\n.glyphicon-log-out { &:before { content: \"\\e163\"; } }\n.glyphicon-new-window { &:before { content: \"\\e164\"; } }\n.glyphicon-record { &:before { content: \"\\e165\"; } }\n.glyphicon-save { &:before { content: \"\\e166\"; } }\n.glyphicon-open { &:before { content: \"\\e167\"; } }\n.glyphicon-saved { &:before { content: \"\\e168\"; } }\n.glyphicon-import { &:before { content: \"\\e169\"; } }\n.glyphicon-export { &:before { content: \"\\e170\"; } }\n.glyphicon-send { &:before { content: \"\\e171\"; } }\n.glyphicon-floppy-disk { &:before { content: \"\\e172\"; } }\n.glyphicon-floppy-saved { &:before { content: \"\\e173\"; } }\n.glyphicon-floppy-remove { &:before { content: \"\\e174\"; } }\n.glyphicon-floppy-save { &:before { content: \"\\e175\"; } }\n.glyphicon-floppy-open { &:before { content: \"\\e176\"; } }\n.glyphicon-credit-card { &:before { content: \"\\e177\"; } }\n.glyphicon-transfer { &:before { content: \"\\e178\"; } }\n.glyphicon-cutlery { &:before { content: \"\\e179\"; } }\n.glyphicon-header { &:before { content: \"\\e180\"; } }\n.glyphicon-compressed { &:before { content: \"\\e181\"; } }\n.glyphicon-earphone { &:before { content: \"\\e182\"; } }\n.glyphicon-phone-alt { &:before { content: \"\\e183\"; } }\n.glyphicon-tower { &:before { content: \"\\e184\"; } }\n.glyphicon-stats { &:before { content: \"\\e185\"; } }\n.glyphicon-sd-video { &:before { content: \"\\e186\"; } }\n.glyphicon-hd-video { &:before { content: \"\\e187\"; } }\n.glyphicon-subtitles { &:before { content: \"\\e188\"; } }\n.glyphicon-sound-stereo { &:before { content: \"\\e189\"; } }\n.glyphicon-sound-dolby { &:before { content: \"\\e190\"; } }\n.glyphicon-sound-5-1 { &:before { content: \"\\e191\"; } }\n.glyphicon-sound-6-1 { &:before { content: \"\\e192\"; } }\n.glyphicon-sound-7-1 { &:before { content: \"\\e193\"; } }\n.glyphicon-copyright-mark { &:before { content: \"\\e194\"; } }\n.glyphicon-registration-mark { &:before { content: \"\\e195\"; } }\n.glyphicon-cloud-download { &:before { content: \"\\e197\"; } }\n.glyphicon-cloud-upload { &:before { content: \"\\e198\"; } }\n.glyphicon-tree-conifer { &:before { content: \"\\e199\"; } }\n.glyphicon-tree-deciduous { &:before { content: \"\\e200\"; } }\n.glyphicon-cd { &:before { content: \"\\e201\"; } }\n.glyphicon-save-file { &:before { content: \"\\e202\"; } }\n.glyphicon-open-file { &:before { content: \"\\e203\"; } }\n.glyphicon-level-up { &:before { content: \"\\e204\"; } }\n.glyphicon-copy { &:before { content: \"\\e205\"; } }\n.glyphicon-paste { &:before { content: \"\\e206\"; } }\n// The following 2 Glyphicons are omitted for the time being because\n// they currently use Unicode codepoints that are outside the\n// Basic Multilingual Plane (BMP). Older buggy versions of WebKit can't handle\n// non-BMP codepoints in CSS string escapes, and thus can't display these two icons.\n// Notably, the bug affects some older versions of the Android Browser.\n// More info: https://github.com/twbs/bootstrap/issues/10106\n// .glyphicon-door { &:before { content: \"\\1f6aa\"; } }\n// .glyphicon-key { &:before { content: \"\\1f511\"; } }\n.glyphicon-alert { &:before { content: \"\\e209\"; } }\n.glyphicon-equalizer { &:before { content: \"\\e210\"; } }\n.glyphicon-king { &:before { content: \"\\e211\"; } }\n.glyphicon-queen { &:before { content: \"\\e212\"; } }\n.glyphicon-pawn { &:before { content: \"\\e213\"; } }\n.glyphicon-bishop { &:before { content: \"\\e214\"; } }\n.glyphicon-knight { &:before { content: \"\\e215\"; } }\n.glyphicon-baby-formula { &:before { content: \"\\e216\"; } }\n.glyphicon-tent { &:before { content: \"\\26fa\"; } }\n.glyphicon-blackboard { &:before { content: \"\\e218\"; } }\n.glyphicon-bed { &:before { content: \"\\e219\"; } }\n.glyphicon-apple { &:before { content: \"\\f8ff\"; } }\n.glyphicon-erase { &:before { content: \"\\e221\"; } }\n.glyphicon-hourglass { &:before { content: \"\\231b\"; } }\n.glyphicon-lamp { &:before { content: \"\\e223\"; } }\n.glyphicon-duplicate { &:before { content: \"\\e224\"; } }\n.glyphicon-piggy-bank { &:before { content: \"\\e225\"; } }\n.glyphicon-scissors { &:before { content: \"\\e226\"; } }\n.glyphicon-bitcoin { &:before { content: \"\\e227\"; } }\n.glyphicon-btc { &:before { content: \"\\e227\"; } }\n.glyphicon-xbt { &:before { content: \"\\e227\"; } }\n.glyphicon-yen { &:before { content: \"\\00a5\"; } }\n.glyphicon-jpy { &:before { content: \"\\00a5\"; } }\n.glyphicon-ruble { &:before { content: \"\\20bd\"; } }\n.glyphicon-rub { &:before { content: \"\\20bd\"; } }\n.glyphicon-scale { &:before { content: \"\\e230\"; } }\n.glyphicon-ice-lolly { &:before { content: \"\\e231\"; } }\n.glyphicon-ice-lolly-tasted { &:before { content: \"\\e232\"; } }\n.glyphicon-education { &:before { content: \"\\e233\"; } }\n.glyphicon-option-horizontal { &:before { content: \"\\e234\"; } }\n.glyphicon-option-vertical { &:before { content: \"\\e235\"; } }\n.glyphicon-menu-hamburger { &:before { content: \"\\e236\"; } }\n.glyphicon-modal-window { &:before { content: \"\\e237\"; } }\n.glyphicon-oil { &:before { content: \"\\e238\"; } }\n.glyphicon-grain { &:before { content: \"\\e239\"; } }\n.glyphicon-sunglasses { &:before { content: \"\\e240\"; } }\n.glyphicon-text-size { &:before { content: \"\\e241\"; } }\n.glyphicon-text-color { &:before { content: \"\\e242\"; } }\n.glyphicon-text-background { &:before { content: \"\\e243\"; } }\n.glyphicon-object-align-top { &:before { content: \"\\e244\"; } }\n.glyphicon-object-align-bottom { &:before { content: \"\\e245\"; } }\n.glyphicon-object-align-horizontal{ &:before { content: \"\\e246\"; } }\n.glyphicon-object-align-left { &:before { content: \"\\e247\"; } }\n.glyphicon-object-align-vertical { &:before { content: \"\\e248\"; } }\n.glyphicon-object-align-right { &:before { content: \"\\e249\"; } }\n.glyphicon-triangle-right { &:before { content: \"\\e250\"; } }\n.glyphicon-triangle-left { &:before { content: \"\\e251\"; } }\n.glyphicon-triangle-bottom { &:before { content: \"\\e252\"; } }\n.glyphicon-triangle-top { &:before { content: \"\\e253\"; } }\n.glyphicon-console { &:before { content: \"\\e254\"; } }\n.glyphicon-superscript { &:before { content: \"\\e255\"; } }\n.glyphicon-subscript { &:before { content: \"\\e256\"; } }\n.glyphicon-menu-left { &:before { content: \"\\e257\"; } }\n.glyphicon-menu-right { &:before { content: \"\\e258\"; } }\n.glyphicon-menu-down { &:before { content: \"\\e259\"; } }\n.glyphicon-menu-up { &:before { content: \"\\e260\"; } }\n","//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n//\n// Heads up! This reset may cause conflicts with some third-party widgets.\n// For recommendations on resolving such conflicts, see\n// http://getbootstrap.com/getting-started/#third-box-sizing\n* {\n .box-sizing(border-box);\n}\n*:before,\n*:after {\n .box-sizing(border-box);\n}\n\n\n// Body reset\n\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0,0,0,0);\n}\n\nbody {\n font-family: @font-family-base;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @text-color;\n background-color: @body-bg;\n}\n\n// Reset fonts for relevant elements\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\n\n// Links\n\na {\n color: @link-color;\n text-decoration: none;\n\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: @link-hover-decoration;\n }\n\n &:focus {\n .tab-focus();\n }\n}\n\n\n// Figures\n//\n// We reset this here because previously Normalize had no `figure` margins. This\n// ensures we don't break anyone's use of the element.\n\nfigure {\n margin: 0;\n}\n\n\n// Images\n\nimg {\n vertical-align: middle;\n}\n\n// Responsive images (ensure images don't scale beyond their parents)\n.img-responsive {\n .img-responsive();\n}\n\n// Rounded corners\n.img-rounded {\n border-radius: @border-radius-large;\n}\n\n// Image thumbnails\n//\n// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.\n.img-thumbnail {\n padding: @thumbnail-padding;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(all .2s ease-in-out);\n\n // Keep them at most 100% wide\n .img-responsive(inline-block);\n}\n\n// Perfect circle\n.img-circle {\n border-radius: 50%; // set radius in percents\n}\n\n\n// Horizontal rules\n\nhr {\n margin-top: @line-height-computed;\n margin-bottom: @line-height-computed;\n border: 0;\n border-top: 1px solid @hr-border;\n}\n\n\n// Only display content to screen readers\n//\n// See: http://a11yproject.com/posts/how-to-hide-content\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0,0,0,0);\n border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n// Useful for \"Skip to main content\" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n// Credit: HTML5 Boilerplate\n\n.sr-only-focusable {\n &:active,\n &:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n }\n}\n\n\n// iOS \"clickable elements\" fix for role=\"button\"\n//\n// Fixes \"clickability\" issue (and more generally, the firing of events such as focus as well)\n// for traditionally non-focusable elements with role=\"button\"\n// see https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n\n[role=\"button\"] {\n cursor: pointer;\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They have been removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility) {\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// WebKit-style focus\n\n.tab-focus() {\n // WebKit-specific. Other browsers will keep their default outline style.\n // (Initially tried to also force default via `outline: initial`,\n // but that seems to erroneously remove the outline in Firefox altogether.)\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n.img-responsive(@display: block) {\n display: @display;\n max-width: 100%; // Part 1: Set a maximum relative to the parent\n height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size. Note that the\n// spelling of `min--moz-device-pixel-ratio` is intentional.\n.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {\n background-image: url(\"@{file-1x}\");\n\n @media\n only screen and (-webkit-min-device-pixel-ratio: 2),\n only screen and ( min--moz-device-pixel-ratio: 2),\n only screen and ( -o-min-device-pixel-ratio: 2/1),\n only screen and ( min-device-pixel-ratio: 2),\n only screen and ( min-resolution: 192dpi),\n only screen and ( min-resolution: 2dppx) {\n background-image: url(\"@{file-2x}\");\n background-size: @width-1x @height-1x;\n }\n}\n","//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n font-family: @headings-font-family;\n font-weight: @headings-font-weight;\n line-height: @headings-line-height;\n color: @headings-color;\n\n small,\n .small {\n font-weight: normal;\n line-height: 1;\n color: @headings-small-color;\n }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n margin-top: @line-height-computed;\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 65%;\n }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n margin-top: (@line-height-computed / 2);\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 75%;\n }\n}\n\nh1, .h1 { font-size: @font-size-h1; }\nh2, .h2 { font-size: @font-size-h2; }\nh3, .h3 { font-size: @font-size-h3; }\nh4, .h4 { font-size: @font-size-h4; }\nh5, .h5 { font-size: @font-size-h5; }\nh6, .h6 { font-size: @font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n margin: 0 0 (@line-height-computed / 2);\n}\n\n.lead {\n margin-bottom: @line-height-computed;\n font-size: floor((@font-size-base * 1.15));\n font-weight: 300;\n line-height: 1.4;\n\n @media (min-width: @screen-sm-min) {\n font-size: (@font-size-base * 1.5);\n }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: (12px small font / 14px base font) * 100% = about 85%\nsmall,\n.small {\n font-size: floor((100% * @font-size-small / @font-size-base));\n}\n\nmark,\n.mark {\n background-color: @state-warning-bg;\n padding: .2em;\n}\n\n// Alignment\n.text-left { text-align: left; }\n.text-right { text-align: right; }\n.text-center { text-align: center; }\n.text-justify { text-align: justify; }\n.text-nowrap { white-space: nowrap; }\n\n// Transformation\n.text-lowercase { text-transform: lowercase; }\n.text-uppercase { text-transform: uppercase; }\n.text-capitalize { text-transform: capitalize; }\n\n// Contextual colors\n.text-muted {\n color: @text-muted;\n}\n.text-primary {\n .text-emphasis-variant(@brand-primary);\n}\n.text-success {\n .text-emphasis-variant(@state-success-text);\n}\n.text-info {\n .text-emphasis-variant(@state-info-text);\n}\n.text-warning {\n .text-emphasis-variant(@state-warning-text);\n}\n.text-danger {\n .text-emphasis-variant(@state-danger-text);\n}\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n // Given the contrast here, this is the only class to have its color inverted\n // automatically.\n color: #fff;\n .bg-variant(@brand-primary);\n}\n.bg-success {\n .bg-variant(@state-success-bg);\n}\n.bg-info {\n .bg-variant(@state-info-bg);\n}\n.bg-warning {\n .bg-variant(@state-warning-bg);\n}\n.bg-danger {\n .bg-variant(@state-danger-bg);\n}\n\n\n// Page header\n// -------------------------\n\n.page-header {\n padding-bottom: ((@line-height-computed / 2) - 1);\n margin: (@line-height-computed * 2) 0 @line-height-computed;\n border-bottom: 1px solid @page-header-border-color;\n}\n\n\n// Lists\n// -------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n margin-top: 0;\n margin-bottom: (@line-height-computed / 2);\n ul,\n ol {\n margin-bottom: 0;\n }\n}\n\n// List options\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n .list-unstyled();\n margin-left: -5px;\n\n > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n }\n}\n\n// Description Lists\ndl {\n margin-top: 0; // Remove browser default\n margin-bottom: @line-height-computed;\n}\ndt,\ndd {\n line-height: @line-height-base;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n.dl-horizontal {\n dd {\n &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present\n }\n\n @media (min-width: @dl-horizontal-breakpoint) {\n dt {\n float: left;\n width: (@dl-horizontal-offset - 20);\n clear: left;\n text-align: right;\n .text-overflow();\n }\n dd {\n margin-left: @dl-horizontal-offset;\n }\n }\n}\n\n\n// Misc\n// -------------------------\n\n// Abbreviations and acronyms\nabbr[title],\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted @abbr-border-color;\n}\n.initialism {\n font-size: 90%;\n .text-uppercase();\n}\n\n// Blockquotes\nblockquote {\n padding: (@line-height-computed / 2) @line-height-computed;\n margin: 0 0 @line-height-computed;\n font-size: @blockquote-font-size;\n border-left: 5px solid @blockquote-border-color;\n\n p,\n ul,\n ol {\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n // Note: Deprecated small and .small as of v3.1.0\n // Context: https://github.com/twbs/bootstrap/issues/11660\n footer,\n small,\n .small {\n display: block;\n font-size: 80%; // back to default font-size\n line-height: @line-height-base;\n color: @blockquote-small-color;\n\n &:before {\n content: '\\2014 \\00A0'; // em dash, nbsp\n }\n }\n}\n\n// Opposite alignment of blockquote\n//\n// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid @blockquote-border-color;\n border-left: 0;\n text-align: right;\n\n // Account for citation\n footer,\n small,\n .small {\n &:before { content: ''; }\n &:after {\n content: '\\00A0 \\2014'; // nbsp, em dash\n }\n }\n}\n\n// Addresses\naddress {\n margin-bottom: @line-height-computed;\n font-style: normal;\n line-height: @line-height-base;\n}\n","// Typography\n\n.text-emphasis-variant(@color) {\n color: @color;\n a&:hover,\n a&:focus {\n color: darken(@color, 10%);\n }\n}\n","// Contextual backgrounds\n\n.bg-variant(@color) {\n background-color: @color;\n a&:hover,\n a&:focus {\n background-color: darken(@color, 10%);\n }\n}\n","// Text overflow\n// Requires inline-block or block for proper styling\n\n.text-overflow() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n font-family: @font-family-monospace;\n}\n\n// Inline code\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: @code-color;\n background-color: @code-bg;\n border-radius: @border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: @kbd-color;\n background-color: @kbd-bg;\n border-radius: @border-radius-small;\n box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);\n\n kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n box-shadow: none;\n }\n}\n\n// Blocks of code\npre {\n display: block;\n padding: ((@line-height-computed - 1) / 2);\n margin: 0 0 (@line-height-computed / 2);\n font-size: (@font-size-base - 1); // 14px to 13px\n line-height: @line-height-base;\n word-break: break-all;\n word-wrap: break-word;\n color: @pre-color;\n background-color: @pre-bg;\n border: 1px solid @pre-border-color;\n border-radius: @border-radius-base;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n max-height: @pre-scrollable-max-height;\n overflow-y: scroll;\n}\n","//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n.container {\n .container-fixed();\n\n @media (min-width: @screen-sm-min) {\n width: @container-sm;\n }\n @media (min-width: @screen-md-min) {\n width: @container-md;\n }\n @media (min-width: @screen-lg-min) {\n width: @container-lg;\n }\n}\n\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but without any defined\n// width for fluid, full width layouts.\n\n.container-fluid {\n .container-fixed();\n}\n\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n.row {\n .make-row();\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n.make-grid-columns();\n\n\n// Extra small grid\n//\n// Columns, offsets, pushes, and pulls for extra small devices like\n// smartphones.\n\n.make-grid(xs);\n\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n\n@media (min-width: @screen-sm-min) {\n .make-grid(sm);\n}\n\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n\n@media (min-width: @screen-md-min) {\n .make-grid(md);\n}\n\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n\n@media (min-width: @screen-lg-min) {\n .make-grid(lg);\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n// Centered container element\n.container-fixed(@gutter: @grid-gutter-width) {\n margin-right: auto;\n margin-left: auto;\n padding-left: floor((@gutter / 2));\n padding-right: ceil((@gutter / 2));\n &:extend(.clearfix all);\n}\n\n// Creates a wrapper for a series of columns\n.make-row(@gutter: @grid-gutter-width) {\n margin-left: ceil((@gutter / -2));\n margin-right: floor((@gutter / -2));\n &:extend(.clearfix all);\n}\n\n// Generate the extra small columns\n.make-xs-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n float: left;\n width: percentage((@columns / @grid-columns));\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n}\n.make-xs-column-offset(@columns) {\n margin-left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-push(@columns) {\n left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-pull(@columns) {\n right: percentage((@columns / @grid-columns));\n}\n\n// Generate the small columns\n.make-sm-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-sm-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-offset(@columns) {\n @media (min-width: @screen-sm-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-push(@columns) {\n @media (min-width: @screen-sm-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-pull(@columns) {\n @media (min-width: @screen-sm-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the medium columns\n.make-md-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-md-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-offset(@columns) {\n @media (min-width: @screen-md-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-push(@columns) {\n @media (min-width: @screen-md-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-pull(@columns) {\n @media (min-width: @screen-md-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the large columns\n.make-lg-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-lg-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-offset(@columns) {\n @media (min-width: @screen-lg-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-push(@columns) {\n @media (min-width: @screen-lg-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-pull(@columns) {\n @media (min-width: @screen-lg-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `@grid-columns`.\n\n.make-grid-columns() {\n // Common styles for all sizes of grid columns, widths 1-12\n .col(@index) { // initial\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general; \"=<\" isn't a typo\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n position: relative;\n // Prevent columns from collapsing when empty\n min-height: 1px;\n // Inner gutter via padding\n padding-left: ceil((@grid-gutter-width / 2));\n padding-right: floor((@grid-gutter-width / 2));\n }\n }\n .col(1); // kickstart it\n}\n\n.float-grid-columns(@class) {\n .col(@index) { // initial\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n float: left;\n }\n }\n .col(1); // kickstart it\n}\n\n.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {\n .col-@{class}-@{index} {\n width: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index > 0) {\n .col-@{class}-push-@{index} {\n left: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index = 0) {\n .col-@{class}-push-0 {\n left: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index > 0) {\n .col-@{class}-pull-@{index} {\n right: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index = 0) {\n .col-@{class}-pull-0 {\n right: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = offset) {\n .col-@{class}-offset-@{index} {\n margin-left: percentage((@index / @grid-columns));\n }\n}\n\n// Basic looping in LESS\n.loop-grid-columns(@index, @class, @type) when (@index >= 0) {\n .calc-grid-column(@index, @class, @type);\n // next iteration\n .loop-grid-columns((@index - 1), @class, @type);\n}\n\n// Create grid for specific class\n.make-grid(@class) {\n .float-grid-columns(@class);\n .loop-grid-columns(@grid-columns, @class, width);\n .loop-grid-columns(@grid-columns, @class, pull);\n .loop-grid-columns(@grid-columns, @class, push);\n .loop-grid-columns(@grid-columns, @class, offset);\n}\n","//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n background-color: @table-bg;\n}\ncaption {\n padding-top: @table-cell-padding;\n padding-bottom: @table-cell-padding;\n color: @text-muted;\n text-align: left;\n}\nth {\n text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: @line-height-computed;\n // Cells\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-cell-padding;\n line-height: @line-height-base;\n vertical-align: top;\n border-top: 1px solid @table-border-color;\n }\n }\n }\n // Bottom align for column headings\n > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid @table-border-color;\n }\n // Remove top border from thead by default\n > caption + thead,\n > colgroup + thead,\n > thead:first-child {\n > tr:first-child {\n > th,\n > td {\n border-top: 0;\n }\n }\n }\n // Account for multiple tbody instances\n > tbody + tbody {\n border-top: 2px solid @table-border-color;\n }\n\n // Nesting\n .table {\n background-color: @body-bg;\n }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-condensed-cell-padding;\n }\n }\n }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n border: 1px solid @table-border-color;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n border: 1px solid @table-border-color;\n }\n }\n }\n > thead > tr {\n > th,\n > td {\n border-bottom-width: 2px;\n }\n }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n > tbody > tr:nth-of-type(odd) {\n background-color: @table-bg-accent;\n }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n > tbody > tr:hover {\n background-color: @table-bg-hover;\n }\n}\n\n\n// Table cell sizing\n//\n// Reset default table behavior\n\ntable col[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-column;\n}\ntable {\n td,\n th {\n &[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-cell;\n }\n }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n.table-row-variant(active; @table-bg-active);\n.table-row-variant(success; @state-success-bg);\n.table-row-variant(info; @state-info-bg);\n.table-row-variant(warning; @state-warning-bg);\n.table-row-variant(danger; @state-danger-bg);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n.table-responsive {\n overflow-x: auto;\n min-height: 0.01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837)\n\n @media screen and (max-width: @screen-xs-max) {\n width: 100%;\n margin-bottom: (@line-height-computed * 0.75);\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid @table-border-color;\n\n // Tighten up spacing\n > .table {\n margin-bottom: 0;\n\n // Ensure the content doesn't wrap\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n white-space: nowrap;\n }\n }\n }\n }\n\n // Special overrides for the bordered tables\n > .table-bordered {\n border: 0;\n\n // Nuke the appropriate borders so that the parent can handle them\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n\n // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n // chances are there will be only one `tr` in a `thead` and that would\n // remove the border altogether.\n > tbody,\n > tfoot {\n > tr:last-child {\n > th,\n > td {\n border-bottom: 0;\n }\n }\n }\n\n }\n }\n}\n","// Tables\n\n.table-row-variant(@state; @background) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table > thead > tr,\n .table > tbody > tr,\n .table > tfoot > tr {\n > td.@{state},\n > th.@{state},\n &.@{state} > td,\n &.@{state} > th {\n background-color: @background;\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover > tbody > tr {\n > td.@{state}:hover,\n > th.@{state}:hover,\n &.@{state}:hover > td,\n &:hover > .@{state},\n &.@{state}:hover > th {\n background-color: darken(@background, 5%);\n }\n }\n}\n","//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n // Chrome and Firefox set a `min-width: min-content;` on fieldsets,\n // so we reset that to ensure it behaves more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359.\n min-width: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: @line-height-computed;\n font-size: (@font-size-base * 1.5);\n line-height: inherit;\n color: @legend-color;\n border: 0;\n border-bottom: 1px solid @legend-border-color;\n}\n\nlabel {\n display: inline-block;\n max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)\n margin-bottom: 5px;\n font-weight: bold;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\n// Override content-box in Normalize (* isn't specific enough)\ninput[type=\"search\"] {\n .box-sizing(border-box);\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9; // IE8-9\n line-height: normal;\n}\n\ninput[type=\"file\"] {\n display: block;\n}\n\n// Make range inputs behave like textual form controls\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\n\n// Make multiple select elements height not fixed\nselect[multiple],\nselect[size] {\n height: auto;\n}\n\n// Focus for file, radio, and checkbox\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n .tab-focus();\n}\n\n// Adjust output element\noutput {\n display: block;\n padding-top: (@padding-base-vertical + 1);\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n}\n\n\n// Common form controls\n//\n// Shared size and type resets for form controls. Apply `.form-control` to any\n// of the following form controls:\n//\n// select\n// textarea\n// input[type=\"text\"]\n// input[type=\"password\"]\n// input[type=\"datetime\"]\n// input[type=\"datetime-local\"]\n// input[type=\"date\"]\n// input[type=\"month\"]\n// input[type=\"time\"]\n// input[type=\"week\"]\n// input[type=\"number\"]\n// input[type=\"email\"]\n// input[type=\"url\"]\n// input[type=\"search\"]\n// input[type=\"tel\"]\n// input[type=\"color\"]\n\n.form-control {\n display: block;\n width: 100%;\n height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n background-color: @input-bg;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid @input-border;\n border-radius: @input-border-radius; // Note: This has no effect on <select>s in some browsers, due to the limited stylability of <select>s in CSS.\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));\n .transition(~\"border-color ease-in-out .15s, box-shadow ease-in-out .15s\");\n\n // Customize the `:focus` state to imitate native WebKit styles.\n .form-control-focus();\n\n // Placeholder\n .placeholder();\n\n // Unstyle the caret on `<select>`s in IE10+.\n &::-ms-expand {\n border: 0;\n background-color: transparent;\n }\n\n // Disabled and read-only inputs\n //\n // HTML5 says that controls under a fieldset > legend:first-child won't be\n // disabled if the fieldset is disabled. Due to implementation difficulty, we\n // don't honor that edge case; we style them as disabled anyway.\n &[disabled],\n &[readonly],\n fieldset[disabled] & {\n background-color: @input-bg-disabled;\n opacity: 1; // iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655\n }\n\n &[disabled],\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n }\n\n // Reset height for `textarea`s\n textarea& {\n height: auto;\n }\n}\n\n\n// Search inputs in iOS\n//\n// This overrides the extra rounded corners on search inputs in iOS so that our\n// `.form-control` class can properly style them. Note that this cannot simply\n// be added to `.form-control` as it's not specific enough. For details, see\n// https://github.com/twbs/bootstrap/issues/11586.\n\ninput[type=\"search\"] {\n -webkit-appearance: none;\n}\n\n\n// Special styles for iOS temporal inputs\n//\n// In Mobile Safari, setting `display: block` on temporal inputs causes the\n// text within the input to become vertically misaligned. As a workaround, we\n// set a pixel line-height that matches the given height of the input, but only\n// for Safari. See https://bugs.webkit.org/show_bug.cgi?id=139848\n//\n// Note that as of 9.3, iOS doesn't support `week`.\n\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n input[type=\"date\"],\n input[type=\"time\"],\n input[type=\"datetime-local\"],\n input[type=\"month\"] {\n &.form-control {\n line-height: @input-height-base;\n }\n\n &.input-sm,\n .input-group-sm & {\n line-height: @input-height-small;\n }\n\n &.input-lg,\n .input-group-lg & {\n line-height: @input-height-large;\n }\n }\n}\n\n\n// Form groups\n//\n// Designed to help with the organization and spacing of vertical forms. For\n// horizontal forms, use the predefined grid classes.\n\n.form-group {\n margin-bottom: @form-group-margin-bottom;\n}\n\n\n// Checkboxes and radios\n//\n// Indent the labels to position radios/checkboxes as hanging controls.\n\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n\n label {\n min-height: @line-height-computed; // Ensure the input doesn't jump when there is no text\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n cursor: pointer;\n }\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-left: -20px;\n margin-top: 4px \\9;\n}\n\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing\n}\n\n// Radios and checkboxes on same line\n.radio-inline,\n.checkbox-inline {\n position: relative;\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n vertical-align: middle;\n font-weight: normal;\n cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px; // space out consecutive inline controls\n}\n\n// Apply same disabled cursor tweak as for inputs\n// Some special care is needed because <label>s don't inherit their parent's `cursor`.\n//\n// Note: Neither radios nor checkboxes can be readonly.\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n &[disabled],\n &.disabled,\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n }\n}\n// These classes are used directly on <label>s\n.radio-inline,\n.checkbox-inline {\n &.disabled,\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n }\n}\n// These classes are used on elements with <label> descendants\n.radio,\n.checkbox {\n &.disabled,\n fieldset[disabled] & {\n label {\n cursor: @cursor-disabled;\n }\n }\n}\n\n\n// Static form control text\n//\n// Apply class to a `p` element to make any string of text align with labels in\n// a horizontal form layout.\n\n.form-control-static {\n // Size it appropriately next to real form controls\n padding-top: (@padding-base-vertical + 1);\n padding-bottom: (@padding-base-vertical + 1);\n // Remove default margin from `p`\n margin-bottom: 0;\n min-height: (@line-height-computed + @font-size-base);\n\n &.input-lg,\n &.input-sm {\n padding-left: 0;\n padding-right: 0;\n }\n}\n\n\n// Form control sizing\n//\n// Build on `.form-control` with modifier classes to decrease or increase the\n// height and font-size of form controls.\n//\n// The `.form-group-* form-control` variations are sadly duplicated to avoid the\n// issue documented in https://github.com/twbs/bootstrap/issues/15074.\n\n.input-sm {\n .input-size(@input-height-small; @padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @input-border-radius-small);\n}\n.form-group-sm {\n .form-control {\n height: @input-height-small;\n padding: @padding-small-vertical @padding-small-horizontal;\n font-size: @font-size-small;\n line-height: @line-height-small;\n border-radius: @input-border-radius-small;\n }\n select.form-control {\n height: @input-height-small;\n line-height: @input-height-small;\n }\n textarea.form-control,\n select[multiple].form-control {\n height: auto;\n }\n .form-control-static {\n height: @input-height-small;\n min-height: (@line-height-computed + @font-size-small);\n padding: (@padding-small-vertical + 1) @padding-small-horizontal;\n font-size: @font-size-small;\n line-height: @line-height-small;\n }\n}\n\n.input-lg {\n .input-size(@input-height-large; @padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @input-border-radius-large);\n}\n.form-group-lg {\n .form-control {\n height: @input-height-large;\n padding: @padding-large-vertical @padding-large-horizontal;\n font-size: @font-size-large;\n line-height: @line-height-large;\n border-radius: @input-border-radius-large;\n }\n select.form-control {\n height: @input-height-large;\n line-height: @input-height-large;\n }\n textarea.form-control,\n select[multiple].form-control {\n height: auto;\n }\n .form-control-static {\n height: @input-height-large;\n min-height: (@line-height-computed + @font-size-large);\n padding: (@padding-large-vertical + 1) @padding-large-horizontal;\n font-size: @font-size-large;\n line-height: @line-height-large;\n }\n}\n\n\n// Form control feedback states\n//\n// Apply contextual and semantic states to individual form controls.\n\n.has-feedback {\n // Enable absolute positioning\n position: relative;\n\n // Ensure icons don't overlap text\n .form-control {\n padding-right: (@input-height-base * 1.25);\n }\n}\n// Feedback icon (requires .glyphicon classes)\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2; // Ensure icon is above input groups\n display: block;\n width: @input-height-base;\n height: @input-height-base;\n line-height: @input-height-base;\n text-align: center;\n pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n width: @input-height-large;\n height: @input-height-large;\n line-height: @input-height-large;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n width: @input-height-small;\n height: @input-height-small;\n line-height: @input-height-small;\n}\n\n// Feedback states\n.has-success {\n .form-control-validation(@state-success-text; @state-success-text; @state-success-bg);\n}\n.has-warning {\n .form-control-validation(@state-warning-text; @state-warning-text; @state-warning-bg);\n}\n.has-error {\n .form-control-validation(@state-danger-text; @state-danger-text; @state-danger-bg);\n}\n\n// Reposition feedback icon if input has visible label above\n.has-feedback label {\n\n & ~ .form-control-feedback {\n top: (@line-height-computed + 5); // Height of the `label` and its margin\n }\n &.sr-only ~ .form-control-feedback {\n top: 0;\n }\n}\n\n\n// Help text\n//\n// Apply to any element you wish to create light text for placement immediately\n// below a form control. Use for general help, formatting, or instructional text.\n\n.help-block {\n display: block; // account for any element using help-block\n margin-top: 5px;\n margin-bottom: 10px;\n color: lighten(@text-color, 25%); // lighten the text some for contrast\n}\n\n\n// Inline forms\n//\n// Make forms appear inline(-block) by adding the `.form-inline` class. Inline\n// forms begin stacked on extra small (mobile) devices and then go inline when\n// viewports reach <768px.\n//\n// Requires wrapping inputs and labels with `.form-group` for proper display of\n// default HTML form controls and our custom form controls (e.g., input groups).\n//\n// Heads up! This is mixin-ed into `.navbar-form` in navbars.less.\n\n.form-inline {\n\n // Kick in the inline\n @media (min-width: @screen-sm-min) {\n // Inline-block all the things for \"inline\"\n .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n\n // In navbar-form, allow folks to *not* use `.form-group`\n .form-control {\n display: inline-block;\n width: auto; // Prevent labels from stacking above inputs in `.form-group`\n vertical-align: middle;\n }\n\n // Make static controls behave like regular ones\n .form-control-static {\n display: inline-block;\n }\n\n .input-group {\n display: inline-table;\n vertical-align: middle;\n\n .input-group-addon,\n .input-group-btn,\n .form-control {\n width: auto;\n }\n }\n\n // Input groups need that 100% width though\n .input-group > .form-control {\n width: 100%;\n }\n\n .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n\n // Remove default margin on radios/checkboxes that were used for stacking, and\n // then undo the floating of radios and checkboxes to match.\n .radio,\n .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n\n label {\n padding-left: 0;\n }\n }\n .radio input[type=\"radio\"],\n .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n\n // Re-override the feedback icon.\n .has-feedback .form-control-feedback {\n top: 0;\n }\n }\n}\n\n\n// Horizontal forms\n//\n// Horizontal forms are built on grid classes and allow you to create forms with\n// labels on the left and inputs on the right.\n\n.form-horizontal {\n\n // Consistent vertical alignment of radios and checkboxes\n //\n // Labels also get some reset styles, but that is scoped to a media query below.\n .radio,\n .checkbox,\n .radio-inline,\n .checkbox-inline {\n margin-top: 0;\n margin-bottom: 0;\n padding-top: (@padding-base-vertical + 1); // Default padding plus a border\n }\n // Account for padding we're adding to ensure the alignment and of help text\n // and other content below items\n .radio,\n .checkbox {\n min-height: (@line-height-computed + (@padding-base-vertical + 1));\n }\n\n // Make form groups behave like rows\n .form-group {\n .make-row();\n }\n\n // Reset spacing and right align labels, but scope to media queries so that\n // labels on narrow viewports stack the same as a default form example.\n @media (min-width: @screen-sm-min) {\n .control-label {\n text-align: right;\n margin-bottom: 0;\n padding-top: (@padding-base-vertical + 1); // Default padding plus a border\n }\n }\n\n // Validation states\n //\n // Reposition the icon because it's now within a grid column and columns have\n // `position: relative;` on them. Also accounts for the grid gutter padding.\n .has-feedback .form-control-feedback {\n right: floor((@grid-gutter-width / 2));\n }\n\n // Form group sizes\n //\n // Quick utility class for applying `.input-lg` and `.input-sm` styles to the\n // inputs and labels within a `.form-group`.\n .form-group-lg {\n @media (min-width: @screen-sm-min) {\n .control-label {\n padding-top: (@padding-large-vertical + 1);\n font-size: @font-size-large;\n }\n }\n }\n .form-group-sm {\n @media (min-width: @screen-sm-min) {\n .control-label {\n padding-top: (@padding-small-vertical + 1);\n font-size: @font-size-small;\n }\n }\n }\n}\n","// Form validation states\n//\n// Used in forms.less to generate the form validation CSS for warnings, errors,\n// and successes.\n\n.form-control-validation(@text-color: #555; @border-color: #ccc; @background-color: #f5f5f5) {\n // Color the label and help text\n .help-block,\n .control-label,\n .radio,\n .checkbox,\n .radio-inline,\n .checkbox-inline,\n &.radio label,\n &.checkbox label,\n &.radio-inline label,\n &.checkbox-inline label {\n color: @text-color;\n }\n // Set the border and box shadow on specific inputs to match\n .form-control {\n border-color: @border-color;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work\n &:focus {\n border-color: darken(@border-color, 10%);\n @shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@border-color, 20%);\n .box-shadow(@shadow);\n }\n }\n // Set validation states also for addons\n .input-group-addon {\n color: @text-color;\n border-color: @border-color;\n background-color: @background-color;\n }\n // Optional feedback icon\n .form-control-feedback {\n color: @text-color;\n }\n}\n\n\n// Form control focus state\n//\n// Generate a customized focus state and for any input with the specified color,\n// which defaults to the `@input-border-focus` variable.\n//\n// We highly encourage you to not customize the default value, but instead use\n// this to tweak colors on an as-needed basis. This aesthetic change is based on\n// WebKit's default styles, but applicable to a wider range of browsers. Its\n// usability and accessibility should be taken into account with any change.\n//\n// Example usage: change the default blue border and shadow to white for better\n// contrast against a dark gray background.\n.form-control-focus(@color: @input-border-focus) {\n @color-rgba: rgba(red(@color), green(@color), blue(@color), .6);\n &:focus {\n border-color: @color;\n outline: 0;\n .box-shadow(~\"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px @{color-rgba}\");\n }\n}\n\n// Form control sizing\n//\n// Relative text size, padding, and border-radii changes for form controls. For\n// horizontal sizing, wrap controls in the predefined grid classes. `<select>`\n// element gets special love because it's special, and that's a fact!\n.input-size(@input-height; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n height: @input-height;\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n\n select& {\n height: @input-height;\n line-height: @input-height;\n }\n\n textarea&,\n select[multiple]& {\n height: auto;\n }\n}\n","//\n// Buttons\n// --------------------------------------------------\n\n\n// Base styles\n// --------------------------------------------------\n\n.btn {\n display: inline-block;\n margin-bottom: 0; // For input.btn\n font-weight: @btn-font-weight;\n text-align: center;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid transparent;\n white-space: nowrap;\n .button-size(@padding-base-vertical; @padding-base-horizontal; @font-size-base; @line-height-base; @btn-border-radius-base);\n .user-select(none);\n\n &,\n &:active,\n &.active {\n &:focus,\n &.focus {\n .tab-focus();\n }\n }\n\n &:hover,\n &:focus,\n &.focus {\n color: @btn-default-color;\n text-decoration: none;\n }\n\n &:active,\n &.active {\n outline: 0;\n background-image: none;\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n .opacity(.65);\n .box-shadow(none);\n }\n\n a& {\n &.disabled,\n fieldset[disabled] & {\n pointer-events: none; // Future-proof disabling of clicks on `<a>` elements\n }\n }\n}\n\n\n// Alternate buttons\n// --------------------------------------------------\n\n.btn-default {\n .button-variant(@btn-default-color; @btn-default-bg; @btn-default-border);\n}\n.btn-primary {\n .button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border);\n}\n// Success appears as green\n.btn-success {\n .button-variant(@btn-success-color; @btn-success-bg; @btn-success-border);\n}\n// Info appears as blue-green\n.btn-info {\n .button-variant(@btn-info-color; @btn-info-bg; @btn-info-border);\n}\n// Warning appears as orange\n.btn-warning {\n .button-variant(@btn-warning-color; @btn-warning-bg; @btn-warning-border);\n}\n// Danger and error appear as red\n.btn-danger {\n .button-variant(@btn-danger-color; @btn-danger-bg; @btn-danger-border);\n}\n\n\n// Link buttons\n// -------------------------\n\n// Make a button look and behave like a link\n.btn-link {\n color: @link-color;\n font-weight: normal;\n border-radius: 0;\n\n &,\n &:active,\n &.active,\n &[disabled],\n fieldset[disabled] & {\n background-color: transparent;\n .box-shadow(none);\n }\n &,\n &:hover,\n &:focus,\n &:active {\n border-color: transparent;\n }\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: @link-hover-decoration;\n background-color: transparent;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @btn-link-disabled-color;\n text-decoration: none;\n }\n }\n}\n\n\n// Button Sizes\n// --------------------------------------------------\n\n.btn-lg {\n // line-height: ensure even-numbered height of button next to large input\n .button-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @btn-border-radius-large);\n}\n.btn-sm {\n // line-height: ensure proper height of button next to small input\n .button-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @btn-border-radius-small);\n}\n.btn-xs {\n .button-size(@padding-xs-vertical; @padding-xs-horizontal; @font-size-small; @line-height-small; @btn-border-radius-small);\n}\n\n\n// Block button\n// --------------------------------------------------\n\n.btn-block {\n display: block;\n width: 100%;\n}\n\n// Vertically space out multiple block buttons\n.btn-block + .btn-block {\n margin-top: 5px;\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n &.btn-block {\n width: 100%;\n }\n}\n","// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n.button-variant(@color; @background; @border) {\n color: @color;\n background-color: @background;\n border-color: @border;\n\n &:focus,\n &.focus {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 25%);\n }\n &:hover {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 12%);\n }\n &:active,\n &.active,\n .open > .dropdown-toggle& {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 12%);\n\n &:hover,\n &:focus,\n &.focus {\n color: @color;\n background-color: darken(@background, 17%);\n border-color: darken(@border, 25%);\n }\n }\n &:active,\n &.active,\n .open > .dropdown-toggle& {\n background-image: none;\n }\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus,\n &.focus {\n background-color: @background;\n border-color: @border;\n }\n }\n\n .badge {\n color: @background;\n background-color: @color;\n }\n}\n\n// Button sizes\n.button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n}\n","// Opacity\n\n.opacity(@opacity) {\n opacity: @opacity;\n // IE8 filter\n @opacity-ie: (@opacity * 100);\n filter: ~\"alpha(opacity=@{opacity-ie})\";\n}\n","//\n// Component animations\n// --------------------------------------------------\n\n// Heads up!\n//\n// We don't use the `.opacity()` mixin here since it causes a bug with text\n// fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552.\n\n.fade {\n opacity: 0;\n .transition(opacity .15s linear);\n &.in {\n opacity: 1;\n }\n}\n\n.collapse {\n display: none;\n\n &.in { display: block; }\n tr&.in { display: table-row; }\n tbody&.in { display: table-row-group; }\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n .transition-property(~\"height, visibility\");\n .transition-duration(.35s);\n .transition-timing-function(ease);\n}\n","//\n// Dropdown menus\n// --------------------------------------------------\n\n\n// Dropdown arrow/caret\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: @caret-width-base dashed;\n border-top: @caret-width-base solid ~\"\\9\"; // IE8\n border-right: @caret-width-base solid transparent;\n border-left: @caret-width-base solid transparent;\n}\n\n// The dropdown wrapper (div)\n.dropup,\n.dropdown {\n position: relative;\n}\n\n// Prevent the focus on the dropdown toggle when closing dropdowns\n.dropdown-toggle:focus {\n outline: 0;\n}\n\n// The dropdown menu (ul)\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: @zindex-dropdown;\n display: none; // none by default, but block on \"open\" of the menu\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0; // override default ul\n list-style: none;\n font-size: @font-size-base;\n text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\n background-color: @dropdown-bg;\n border: 1px solid @dropdown-fallback-border; // IE8 fallback\n border: 1px solid @dropdown-border;\n border-radius: @border-radius-base;\n .box-shadow(0 6px 12px rgba(0,0,0,.175));\n background-clip: padding-box;\n\n // Aligns the dropdown menu to right\n //\n // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`\n &.pull-right {\n right: 0;\n left: auto;\n }\n\n // Dividers (basically an hr) within the dropdown\n .divider {\n .nav-divider(@dropdown-divider-bg);\n }\n\n // Links within the dropdown menu\n > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: @line-height-base;\n color: @dropdown-link-color;\n white-space: nowrap; // prevent links from randomly breaking onto new lines\n }\n}\n\n// Hover/Focus state\n.dropdown-menu > li > a {\n &:hover,\n &:focus {\n text-decoration: none;\n color: @dropdown-link-hover-color;\n background-color: @dropdown-link-hover-bg;\n }\n}\n\n// Active state\n.dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: @dropdown-link-active-color;\n text-decoration: none;\n outline: 0;\n background-color: @dropdown-link-active-bg;\n }\n}\n\n// Disabled state\n//\n// Gray out text and ensure the hover/focus state remains gray\n\n.dropdown-menu > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @dropdown-link-disabled-color;\n }\n\n // Nuke hover/focus effects\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: transparent;\n background-image: none; // Remove CSS gradient\n .reset-filter();\n cursor: @cursor-disabled;\n }\n}\n\n// Open state for the dropdown\n.open {\n // Show the menu\n > .dropdown-menu {\n display: block;\n }\n\n // Remove the outline when :focus is triggered\n > a {\n outline: 0;\n }\n}\n\n// Menu positioning\n//\n// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown\n// menu with the parent.\n.dropdown-menu-right {\n left: auto; // Reset the default from `.dropdown-menu`\n right: 0;\n}\n// With v3, we enabled auto-flipping if you have a dropdown within a right\n// aligned nav component. To enable the undoing of that, we provide an override\n// to restore the default dropdown menu alignment.\n//\n// This is only for left-aligning a dropdown menu within a `.navbar-right` or\n// `.pull-right` nav component.\n.dropdown-menu-left {\n left: 0;\n right: auto;\n}\n\n// Dropdown section headers\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: @font-size-small;\n line-height: @line-height-base;\n color: @dropdown-header-color;\n white-space: nowrap; // as with > li > a\n}\n\n// Backdrop to catch body clicks on mobile, etc.\n.dropdown-backdrop {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n z-index: (@zindex-dropdown - 10);\n}\n\n// Right aligned dropdowns\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n//\n// Just add .dropup after the standard .dropdown class and you're set, bro.\n// TODO: abstract this so that the navbar fixed styles are not placed here?\n\n.dropup,\n.navbar-fixed-bottom .dropdown {\n // Reverse the caret\n .caret {\n border-top: 0;\n border-bottom: @caret-width-base dashed;\n border-bottom: @caret-width-base solid ~\"\\9\"; // IE8\n content: \"\";\n }\n // Different positioning for bottom up menu\n .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n }\n}\n\n\n// Component alignment\n//\n// Reiterate per navbar.less and the modified component alignment there.\n\n@media (min-width: @grid-float-breakpoint) {\n .navbar-right {\n .dropdown-menu {\n .dropdown-menu-right();\n }\n // Necessary for overrides of the default right aligned menu.\n // Will remove come v4 in all likelihood.\n .dropdown-menu-left {\n .dropdown-menu-left();\n }\n }\n}\n","// Horizontal dividers\n//\n// Dividers (basically an hr) within dropdowns and nav lists\n\n.nav-divider(@color: #e5e5e5) {\n height: 1px;\n margin: ((@line-height-computed / 2) - 1) 0;\n overflow: hidden;\n background-color: @color;\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n","//\n// Button groups\n// --------------------------------------------------\n\n// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle; // match .btn alignment given font-size hack above\n > .btn {\n position: relative;\n float: left;\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active,\n &.active {\n z-index: 2;\n }\n }\n}\n\n// Prevent double borders when buttons are next to each other\n.btn-group {\n .btn + .btn,\n .btn + .btn-group,\n .btn-group + .btn,\n .btn-group + .btn-group {\n margin-left: -1px;\n }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n margin-left: -5px; // Offset the first child's margin\n &:extend(.clearfix all);\n\n .btn,\n .btn-group,\n .input-group {\n float: left;\n }\n > .btn,\n > .btn-group,\n > .input-group {\n margin-left: 5px;\n }\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n\n// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match\n.btn-group > .btn:first-child {\n margin-left: 0;\n &:not(:last-child):not(.dropdown-toggle) {\n .border-right-radius(0);\n }\n}\n// Need .dropdown-toggle since :last-child doesn't apply, given that a .dropdown-menu is used immediately after it\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n .border-left-radius(0);\n}\n\n// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) {\n > .btn:last-child,\n > .dropdown-toggle {\n .border-right-radius(0);\n }\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n .border-left-radius(0);\n}\n\n// On active and open, don't show outline\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-xs > .btn { &:extend(.btn-xs); }\n.btn-group-sm > .btn { &:extend(.btn-sm); }\n.btn-group-lg > .btn { &:extend(.btn-lg); }\n\n\n// Split button dropdowns\n// ----------------------\n\n// Give the line between buttons some depth\n.btn-group > .btn + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px;\n}\n\n// The clickable button for toggling the menu\n// Remove the gradient and set the same inset shadow as the :active state\n.btn-group.open .dropdown-toggle {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n\n // Show no shadow for `.btn-link` since it has no other button styles.\n &.btn-link {\n .box-shadow(none);\n }\n}\n\n\n// Reposition the caret\n.btn .caret {\n margin-left: 0;\n}\n// Carets in other button sizes\n.btn-lg .caret {\n border-width: @caret-width-large @caret-width-large 0;\n border-bottom-width: 0;\n}\n// Upside down carets for .dropup\n.dropup .btn-lg .caret {\n border-width: 0 @caret-width-large @caret-width-large;\n}\n\n\n// Vertical button groups\n// ----------------------\n\n.btn-group-vertical {\n > .btn,\n > .btn-group,\n > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n }\n\n // Clear floats so dropdown menus can be properly placed\n > .btn-group {\n &:extend(.clearfix all);\n > .btn {\n float: none;\n }\n }\n\n > .btn + .btn,\n > .btn + .btn-group,\n > .btn-group + .btn,\n > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n }\n}\n\n.btn-group-vertical > .btn {\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n &:first-child:not(:last-child) {\n .border-top-radius(@btn-border-radius-base);\n .border-bottom-radius(0);\n }\n &:last-child:not(:first-child) {\n .border-top-radius(0);\n .border-bottom-radius(@btn-border-radius-base);\n }\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) {\n > .btn:last-child,\n > .dropdown-toggle {\n .border-bottom-radius(0);\n }\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n .border-top-radius(0);\n}\n\n\n// Justified button groups\n// ----------------------\n\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n > .btn,\n > .btn-group {\n float: none;\n display: table-cell;\n width: 1%;\n }\n > .btn-group .btn {\n width: 100%;\n }\n\n > .btn-group .dropdown-menu {\n left: auto;\n }\n}\n\n\n// Checkbox and radio options\n//\n// In order to support the browser's form validation feedback, powered by the\n// `required` attribute, we have to \"hide\" the inputs via `clip`. We cannot use\n// `display: none;` or `visibility: hidden;` as that also hides the popover.\n// Simply visually hiding the inputs via `opacity` would leave them clickable in\n// certain cases which is prevented by using `clip` and `pointer-events`.\n// This way, we ensure a DOM element is visible to position the popover from.\n//\n// See https://github.com/twbs/bootstrap/pull/12794 and\n// https://github.com/twbs/bootstrap/pull/14559 for more information.\n\n[data-toggle=\"buttons\"] {\n > .btn,\n > .btn-group > .btn {\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0,0,0,0);\n pointer-events: none;\n }\n }\n}\n","// Single side border-radius\n\n.border-top-radius(@radius) {\n border-top-right-radius: @radius;\n border-top-left-radius: @radius;\n}\n.border-right-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-top-right-radius: @radius;\n}\n.border-bottom-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-bottom-left-radius: @radius;\n}\n.border-left-radius(@radius) {\n border-bottom-left-radius: @radius;\n border-top-left-radius: @radius;\n}\n","//\n// Input groups\n// --------------------------------------------------\n\n// Base styles\n// -------------------------\n.input-group {\n position: relative; // For dropdowns\n display: table;\n border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table\n\n // Undo padding and float of grid classes\n &[class*=\"col-\"] {\n float: none;\n padding-left: 0;\n padding-right: 0;\n }\n\n .form-control {\n // Ensure that the input is always above the *appended* addon button for\n // proper border colors.\n position: relative;\n z-index: 2;\n\n // IE9 fubars the placeholder attribute in text inputs and the arrows on\n // select elements in input groups. To fix it, we float the input. Details:\n // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855\n float: left;\n\n width: 100%;\n margin-bottom: 0;\n\n &:focus {\n z-index: 3;\n }\n }\n}\n\n// Sizing options\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n .input-lg();\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n .input-sm();\n}\n\n\n// Display as table-cell\n// -------------------------\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n}\n// Addon and addon wrapper for buttons\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle; // Match the inputs\n}\n\n// Text input groups\n// -------------------------\n.input-group-addon {\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n font-weight: normal;\n line-height: 1;\n color: @input-color;\n text-align: center;\n background-color: @input-group-addon-bg;\n border: 1px solid @input-group-addon-border-color;\n border-radius: @input-border-radius;\n\n // Sizing\n &.input-sm {\n padding: @padding-small-vertical @padding-small-horizontal;\n font-size: @font-size-small;\n border-radius: @input-border-radius-small;\n }\n &.input-lg {\n padding: @padding-large-vertical @padding-large-horizontal;\n font-size: @font-size-large;\n border-radius: @input-border-radius-large;\n }\n\n // Nuke default margins from checkboxes and radios to vertically center within.\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n margin-top: 0;\n }\n}\n\n// Reset rounded corners\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n .border-right-radius(0);\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n .border-left-radius(0);\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n\n// Button input groups\n// -------------------------\n.input-group-btn {\n position: relative;\n // Jankily prevent input button groups from wrapping with `white-space` and\n // `font-size` in combination with `inline-block` on buttons.\n font-size: 0;\n white-space: nowrap;\n\n // Negative margin for spacing, position for bringing hovered/focused/actived\n // element above the siblings.\n > .btn {\n position: relative;\n + .btn {\n margin-left: -1px;\n }\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active {\n z-index: 2;\n }\n }\n\n // Negative margin to only have a 1px border between the two\n &:first-child {\n > .btn,\n > .btn-group {\n margin-right: -1px;\n }\n }\n &:last-child {\n > .btn,\n > .btn-group {\n z-index: 2;\n margin-left: -1px;\n }\n }\n}\n","//\n// Navs\n// --------------------------------------------------\n\n\n// Base class\n// --------------------------------------------------\n\n.nav {\n margin-bottom: 0;\n padding-left: 0; // Override default ul/ol\n list-style: none;\n &:extend(.clearfix all);\n\n > li {\n position: relative;\n display: block;\n\n > a {\n position: relative;\n display: block;\n padding: @nav-link-padding;\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: @nav-link-hover-bg;\n }\n }\n\n // Disabled state sets text to gray and nukes hover/tab effects\n &.disabled > a {\n color: @nav-disabled-link-color;\n\n &:hover,\n &:focus {\n color: @nav-disabled-link-hover-color;\n text-decoration: none;\n background-color: transparent;\n cursor: @cursor-disabled;\n }\n }\n }\n\n // Open dropdowns\n .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @nav-link-hover-bg;\n border-color: @link-color;\n }\n }\n\n // Nav dividers (deprecated with v3.0.1)\n //\n // This should have been removed in v3 with the dropping of `.nav-list`, but\n // we missed it. We don't currently support this anywhere, but in the interest\n // of maintaining backward compatibility in case you use it, it's deprecated.\n .nav-divider {\n .nav-divider();\n }\n\n // Prevent IE8 from misplacing imgs\n //\n // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989\n > li > a > img {\n max-width: none;\n }\n}\n\n\n// Tabs\n// -------------------------\n\n// Give the tabs something to sit on\n.nav-tabs {\n border-bottom: 1px solid @nav-tabs-border-color;\n > li {\n float: left;\n // Make the list-items overlay the bottom border\n margin-bottom: -1px;\n\n // Actual tabs (as links)\n > a {\n margin-right: 2px;\n line-height: @line-height-base;\n border: 1px solid transparent;\n border-radius: @border-radius-base @border-radius-base 0 0;\n &:hover {\n border-color: @nav-tabs-link-hover-border-color @nav-tabs-link-hover-border-color @nav-tabs-border-color;\n }\n }\n\n // Active state, and its :hover to override normal :hover\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-tabs-active-link-hover-color;\n background-color: @nav-tabs-active-link-hover-bg;\n border: 1px solid @nav-tabs-active-link-hover-border-color;\n border-bottom-color: transparent;\n cursor: default;\n }\n }\n }\n // pulling this in mainly for less shorthand\n &.nav-justified {\n .nav-justified();\n .nav-tabs-justified();\n }\n}\n\n\n// Pills\n// -------------------------\n.nav-pills {\n > li {\n float: left;\n\n // Links rendered as pills\n > a {\n border-radius: @nav-pills-border-radius;\n }\n + li {\n margin-left: 2px;\n }\n\n // Active state\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-pills-active-link-hover-color;\n background-color: @nav-pills-active-link-hover-bg;\n }\n }\n }\n}\n\n\n// Stacked pills\n.nav-stacked {\n > li {\n float: none;\n + li {\n margin-top: 2px;\n margin-left: 0; // no need for this gap between nav items\n }\n }\n}\n\n\n// Nav variations\n// --------------------------------------------------\n\n// Justified nav links\n// -------------------------\n\n.nav-justified {\n width: 100%;\n\n > li {\n float: none;\n > a {\n text-align: center;\n margin-bottom: 5px;\n }\n }\n\n > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n }\n\n @media (min-width: @screen-sm-min) {\n > li {\n display: table-cell;\n width: 1%;\n > a {\n margin-bottom: 0;\n }\n }\n }\n}\n\n// Move borders to anchors instead of bottom of list\n//\n// Mixin for adding on top the shared `.nav-justified` styles for our tabs\n.nav-tabs-justified {\n border-bottom: 0;\n\n > li > a {\n // Override margin from .nav-tabs\n margin-right: 0;\n border-radius: @border-radius-base;\n }\n\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border: 1px solid @nav-tabs-justified-link-border-color;\n }\n\n @media (min-width: @screen-sm-min) {\n > li > a {\n border-bottom: 1px solid @nav-tabs-justified-link-border-color;\n border-radius: @border-radius-base @border-radius-base 0 0;\n }\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border-bottom-color: @nav-tabs-justified-active-link-border-color;\n }\n }\n}\n\n\n// Tabbable tabs\n// -------------------------\n\n// Hide tabbable panes to start, show them when `.active`\n.tab-content {\n > .tab-pane {\n display: none;\n }\n > .active {\n display: block;\n }\n}\n\n\n// Dropdowns\n// -------------------------\n\n// Specific dropdowns\n.nav-tabs .dropdown-menu {\n // make dropdown border overlap tab border\n margin-top: -1px;\n // Remove the top rounded corners here since there is a hard edge above the menu\n .border-top-radius(0);\n}\n","//\n// Navbars\n// --------------------------------------------------\n\n\n// Wrapper and base class\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n position: relative;\n min-height: @navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)\n margin-bottom: @navbar-margin-bottom;\n border: 1px solid transparent;\n\n // Prevent floats from breaking the navbar\n &:extend(.clearfix all);\n\n @media (min-width: @grid-float-breakpoint) {\n border-radius: @navbar-border-radius;\n }\n}\n\n\n// Navbar heading\n//\n// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy\n// styling of responsive aspects.\n\n.navbar-header {\n &:extend(.clearfix all);\n\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n }\n}\n\n\n// Navbar collapse (body)\n//\n// Group your navbar content into this for easy collapsing and expanding across\n// various device sizes. By default, this content is collapsed when <768px, but\n// will expand past that for a horizontal display.\n//\n// To start (on mobile devices) the navbar links, forms, and buttons are stacked\n// vertically and include a `max-height` to overflow in case you have too much\n// content for the user's viewport.\n\n.navbar-collapse {\n overflow-x: visible;\n padding-right: @navbar-padding-horizontal;\n padding-left: @navbar-padding-horizontal;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255,255,255,.1);\n &:extend(.clearfix all);\n -webkit-overflow-scrolling: touch;\n\n &.in {\n overflow-y: auto;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n width: auto;\n border-top: 0;\n box-shadow: none;\n\n &.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0; // Override default setting\n overflow: visible !important;\n }\n\n &.in {\n overflow-y: visible;\n }\n\n // Undo the collapse side padding for navbars with containers to ensure\n // alignment of right-aligned contents.\n .navbar-fixed-top &,\n .navbar-static-top &,\n .navbar-fixed-bottom & {\n padding-left: 0;\n padding-right: 0;\n }\n }\n}\n\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n .navbar-collapse {\n max-height: @navbar-collapse-max-height;\n\n @media (max-device-width: @screen-xs-min) and (orientation: landscape) {\n max-height: 200px;\n }\n }\n}\n\n\n// Both navbar header and collapse\n//\n// When a container is present, change the behavior of the header and collapse.\n\n.container,\n.container-fluid {\n > .navbar-header,\n > .navbar-collapse {\n margin-right: -@navbar-padding-horizontal;\n margin-left: -@navbar-padding-horizontal;\n\n @media (min-width: @grid-float-breakpoint) {\n margin-right: 0;\n margin-left: 0;\n }\n }\n}\n\n\n//\n// Navbar alignment options\n//\n// Display the navbar across the entirety of the page or fixed it to the top or\n// bottom of the page.\n\n// Static top (unfixed, but 100% wide) navbar\n.navbar-static-top {\n z-index: @zindex-navbar;\n border-width: 0 0 1px;\n\n @media (min-width: @grid-float-breakpoint) {\n border-radius: 0;\n }\n}\n\n// Fix the top/bottom navbars when screen real estate supports it\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: @zindex-navbar-fixed;\n\n // Undo the rounded corners\n @media (min-width: @grid-float-breakpoint) {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0; // override .navbar defaults\n border-width: 1px 0 0;\n}\n\n\n// Brand/project name\n\n.navbar-brand {\n float: left;\n padding: @navbar-padding-vertical @navbar-padding-horizontal;\n font-size: @font-size-large;\n line-height: @line-height-computed;\n height: @navbar-height;\n\n &:hover,\n &:focus {\n text-decoration: none;\n }\n\n > img {\n display: block;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n .navbar > .container &,\n .navbar > .container-fluid & {\n margin-left: -@navbar-padding-horizontal;\n }\n }\n}\n\n\n// Navbar toggle\n//\n// Custom button for toggling the `.navbar-collapse`, powered by the collapse\n// JavaScript plugin.\n\n.navbar-toggle {\n position: relative;\n float: right;\n margin-right: @navbar-padding-horizontal;\n padding: 9px 10px;\n .navbar-vertical-align(34px);\n background-color: transparent;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid transparent;\n border-radius: @border-radius-base;\n\n // We remove the `outline` here, but later compensate by attaching `:hover`\n // styles to `:focus`.\n &:focus {\n outline: 0;\n }\n\n // Bars\n .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n }\n .icon-bar + .icon-bar {\n margin-top: 4px;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n display: none;\n }\n}\n\n\n// Navbar nav links\n//\n// Builds on top of the `.nav` components with its own modifier class to make\n// the nav the full height of the horizontal nav (above 768px).\n\n.navbar-nav {\n margin: (@navbar-padding-vertical / 2) -@navbar-padding-horizontal;\n\n > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: @line-height-computed;\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display when collapsed\n .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n > li > a,\n .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n > li > a {\n line-height: @line-height-computed;\n &:hover,\n &:focus {\n background-image: none;\n }\n }\n }\n }\n\n // Uncollapse the nav\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n margin: 0;\n\n > li {\n float: left;\n > a {\n padding-top: @navbar-padding-vertical;\n padding-bottom: @navbar-padding-vertical;\n }\n }\n }\n}\n\n\n// Navbar form\n//\n// Extension of the `.form-inline` with some extra flavor for optimum display in\n// our navbars.\n\n.navbar-form {\n margin-left: -@navbar-padding-horizontal;\n margin-right: -@navbar-padding-horizontal;\n padding: 10px @navbar-padding-horizontal;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n @shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n\n // Mixin behavior for optimum display\n .form-inline();\n\n .form-group {\n @media (max-width: @grid-float-breakpoint-max) {\n margin-bottom: 5px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n }\n\n // Vertically center in expanded, horizontal navbar\n .navbar-vertical-align(@input-height-base);\n\n // Undo 100% width for pull classes\n @media (min-width: @grid-float-breakpoint) {\n width: auto;\n border: 0;\n margin-left: 0;\n margin-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n .box-shadow(none);\n }\n}\n\n\n// Dropdown menus\n\n// Menu position and menu carets\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n .border-top-radius(0);\n}\n// Menu position and menu caret support for dropups via extra dropup class\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n .border-top-radius(@navbar-border-radius);\n .border-bottom-radius(0);\n}\n\n\n// Buttons in navbars\n//\n// Vertically center a button within a navbar (when *not* in a form).\n\n.navbar-btn {\n .navbar-vertical-align(@input-height-base);\n\n &.btn-sm {\n .navbar-vertical-align(@input-height-small);\n }\n &.btn-xs {\n .navbar-vertical-align(22);\n }\n}\n\n\n// Text in navbars\n//\n// Add a class to make any element properly align itself vertically within the navbars.\n\n.navbar-text {\n .navbar-vertical-align(@line-height-computed);\n\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n margin-left: @navbar-padding-horizontal;\n margin-right: @navbar-padding-horizontal;\n }\n}\n\n\n// Component alignment\n//\n// Repurpose the pull utilities as their own navbar utilities to avoid specificity\n// issues with parents and chaining. Only do this when the navbar is uncollapsed\n// though so that navbar contents properly stack and align in mobile.\n//\n// Declared after the navbar components to ensure more specificity on the margins.\n\n@media (min-width: @grid-float-breakpoint) {\n .navbar-left { .pull-left(); }\n .navbar-right {\n .pull-right();\n margin-right: -@navbar-padding-horizontal;\n\n ~ .navbar-right {\n margin-right: 0;\n }\n }\n}\n\n\n// Alternate navbars\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n background-color: @navbar-default-bg;\n border-color: @navbar-default-border;\n\n .navbar-brand {\n color: @navbar-default-brand-color;\n &:hover,\n &:focus {\n color: @navbar-default-brand-hover-color;\n background-color: @navbar-default-brand-hover-bg;\n }\n }\n\n .navbar-text {\n color: @navbar-default-color;\n }\n\n .navbar-nav {\n > li > a {\n color: @navbar-default-link-color;\n\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n background-color: @navbar-default-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-active-color;\n background-color: @navbar-default-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n background-color: @navbar-default-link-disabled-bg;\n }\n }\n }\n\n .navbar-toggle {\n border-color: @navbar-default-toggle-border-color;\n &:hover,\n &:focus {\n background-color: @navbar-default-toggle-hover-bg;\n }\n .icon-bar {\n background-color: @navbar-default-toggle-icon-bar-bg;\n }\n }\n\n .navbar-collapse,\n .navbar-form {\n border-color: @navbar-default-border;\n }\n\n // Dropdown menu items\n .navbar-nav {\n // Remove background color from open dropdown\n > .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @navbar-default-link-active-bg;\n color: @navbar-default-link-active-color;\n }\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display when collapsed\n .open .dropdown-menu {\n > li > a {\n color: @navbar-default-link-color;\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n background-color: @navbar-default-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-active-color;\n background-color: @navbar-default-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n background-color: @navbar-default-link-disabled-bg;\n }\n }\n }\n }\n }\n\n\n // Links in navbars\n //\n // Add a class to ensure links outside the navbar nav are colored correctly.\n\n .navbar-link {\n color: @navbar-default-link-color;\n &:hover {\n color: @navbar-default-link-hover-color;\n }\n }\n\n .btn-link {\n color: @navbar-default-link-color;\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n }\n }\n }\n}\n\n// Inverse navbar\n\n.navbar-inverse {\n background-color: @navbar-inverse-bg;\n border-color: @navbar-inverse-border;\n\n .navbar-brand {\n color: @navbar-inverse-brand-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-brand-hover-color;\n background-color: @navbar-inverse-brand-hover-bg;\n }\n }\n\n .navbar-text {\n color: @navbar-inverse-color;\n }\n\n .navbar-nav {\n > li > a {\n color: @navbar-inverse-link-color;\n\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n background-color: @navbar-inverse-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-active-color;\n background-color: @navbar-inverse-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n background-color: @navbar-inverse-link-disabled-bg;\n }\n }\n }\n\n // Darken the responsive nav toggle\n .navbar-toggle {\n border-color: @navbar-inverse-toggle-border-color;\n &:hover,\n &:focus {\n background-color: @navbar-inverse-toggle-hover-bg;\n }\n .icon-bar {\n background-color: @navbar-inverse-toggle-icon-bar-bg;\n }\n }\n\n .navbar-collapse,\n .navbar-form {\n border-color: darken(@navbar-inverse-bg, 7%);\n }\n\n // Dropdowns\n .navbar-nav {\n > .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @navbar-inverse-link-active-bg;\n color: @navbar-inverse-link-active-color;\n }\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display\n .open .dropdown-menu {\n > .dropdown-header {\n border-color: @navbar-inverse-border;\n }\n .divider {\n background-color: @navbar-inverse-border;\n }\n > li > a {\n color: @navbar-inverse-link-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n background-color: @navbar-inverse-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-active-color;\n background-color: @navbar-inverse-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n background-color: @navbar-inverse-link-disabled-bg;\n }\n }\n }\n }\n }\n\n .navbar-link {\n color: @navbar-inverse-link-color;\n &:hover {\n color: @navbar-inverse-link-hover-color;\n }\n }\n\n .btn-link {\n color: @navbar-inverse-link-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n }\n }\n }\n}\n","// Navbar vertical align\n//\n// Vertically center elements in the navbar.\n// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.\n\n.navbar-vertical-align(@element-height) {\n margin-top: ((@navbar-height - @element-height) / 2);\n margin-bottom: ((@navbar-height - @element-height) / 2);\n}\n","//\n// Utility classes\n// --------------------------------------------------\n\n\n// Floats\n// -------------------------\n\n.clearfix {\n .clearfix();\n}\n.center-block {\n .center-block();\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n\n\n// Toggling content\n// -------------------------\n\n// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n .text-hide();\n}\n\n\n// Hide from screenreaders and browsers\n//\n// Credit: HTML5 Boilerplate\n\n.hidden {\n display: none !important;\n}\n\n\n// For Affix plugin\n// -------------------------\n\n.affix {\n position: fixed;\n}\n","//\n// Breadcrumbs\n// --------------------------------------------------\n\n\n.breadcrumb {\n padding: @breadcrumb-padding-vertical @breadcrumb-padding-horizontal;\n margin-bottom: @line-height-computed;\n list-style: none;\n background-color: @breadcrumb-bg;\n border-radius: @border-radius-base;\n\n > li {\n display: inline-block;\n\n + li:before {\n content: \"@{breadcrumb-separator}\\00a0\"; // Unicode space added since inline-block means non-collapsing white-space\n padding: 0 5px;\n color: @breadcrumb-color;\n }\n }\n\n > .active {\n color: @breadcrumb-active-color;\n }\n}\n","//\n// Pagination (multiple pages)\n// --------------------------------------------------\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: @line-height-computed 0;\n border-radius: @border-radius-base;\n\n > li {\n display: inline; // Remove list-style and block-level defaults\n > a,\n > span {\n position: relative;\n float: left; // Collapse white-space\n padding: @padding-base-vertical @padding-base-horizontal;\n line-height: @line-height-base;\n text-decoration: none;\n color: @pagination-color;\n background-color: @pagination-bg;\n border: 1px solid @pagination-border;\n margin-left: -1px;\n }\n &:first-child {\n > a,\n > span {\n margin-left: 0;\n .border-left-radius(@border-radius-base);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius-base);\n }\n }\n }\n\n > li > a,\n > li > span {\n &:hover,\n &:focus {\n z-index: 2;\n color: @pagination-hover-color;\n background-color: @pagination-hover-bg;\n border-color: @pagination-hover-border;\n }\n }\n\n > .active > a,\n > .active > span {\n &,\n &:hover,\n &:focus {\n z-index: 3;\n color: @pagination-active-color;\n background-color: @pagination-active-bg;\n border-color: @pagination-active-border;\n cursor: default;\n }\n }\n\n > .disabled {\n > span,\n > span:hover,\n > span:focus,\n > a,\n > a:hover,\n > a:focus {\n color: @pagination-disabled-color;\n background-color: @pagination-disabled-bg;\n border-color: @pagination-disabled-border;\n cursor: @cursor-disabled;\n }\n }\n}\n\n// Sizing\n// --------------------------------------------------\n\n// Large\n.pagination-lg {\n .pagination-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);\n}\n\n// Small\n.pagination-sm {\n .pagination-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n","// Pagination\n\n.pagination-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n > li {\n > a,\n > span {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n }\n &:first-child {\n > a,\n > span {\n .border-left-radius(@border-radius);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius);\n }\n }\n }\n}\n","//\n// Pager pagination\n// --------------------------------------------------\n\n\n.pager {\n padding-left: 0;\n margin: @line-height-computed 0;\n list-style: none;\n text-align: center;\n &:extend(.clearfix all);\n li {\n display: inline;\n > a,\n > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: @pager-bg;\n border: 1px solid @pager-border;\n border-radius: @pager-border-radius;\n }\n\n > a:hover,\n > a:focus {\n text-decoration: none;\n background-color: @pager-hover-bg;\n }\n }\n\n .next {\n > a,\n > span {\n float: right;\n }\n }\n\n .previous {\n > a,\n > span {\n float: left;\n }\n }\n\n .disabled {\n > a,\n > a:hover,\n > a:focus,\n > span {\n color: @pager-disabled-color;\n background-color: @pager-bg;\n cursor: @cursor-disabled;\n }\n }\n}\n","//\n// Labels\n// --------------------------------------------------\n\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: @label-color;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n\n // Add hover effects, but only for links\n a& {\n &:hover,\n &:focus {\n color: @label-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n }\n\n // Empty labels collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for labels in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n}\n\n// Colors\n// Contextual variations (linked labels get darker on :hover)\n\n.label-default {\n .label-variant(@label-default-bg);\n}\n\n.label-primary {\n .label-variant(@label-primary-bg);\n}\n\n.label-success {\n .label-variant(@label-success-bg);\n}\n\n.label-info {\n .label-variant(@label-info-bg);\n}\n\n.label-warning {\n .label-variant(@label-warning-bg);\n}\n\n.label-danger {\n .label-variant(@label-danger-bg);\n}\n","// Labels\n\n.label-variant(@color) {\n background-color: @color;\n\n &[href] {\n &:hover,\n &:focus {\n background-color: darken(@color, 10%);\n }\n }\n}\n","//\n// Badges\n// --------------------------------------------------\n\n\n// Base class\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: @font-size-small;\n font-weight: @badge-font-weight;\n color: @badge-color;\n line-height: @badge-line-height;\n vertical-align: middle;\n white-space: nowrap;\n text-align: center;\n background-color: @badge-bg;\n border-radius: @badge-border-radius;\n\n // Empty badges collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for badges in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n\n .btn-xs &,\n .btn-group-xs > .btn & {\n top: 0;\n padding: 1px 5px;\n }\n\n // Hover state, but only for links\n a& {\n &:hover,\n &:focus {\n color: @badge-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n }\n\n // Account for badges in navs\n .list-group-item.active > &,\n .nav-pills > .active > a > & {\n color: @badge-active-color;\n background-color: @badge-active-bg;\n }\n\n .list-group-item > & {\n float: right;\n }\n\n .list-group-item > & + & {\n margin-right: 5px;\n }\n\n .nav-pills > li > a > & {\n margin-left: 3px;\n }\n}\n","//\n// Jumbotron\n// --------------------------------------------------\n\n\n.jumbotron {\n padding-top: @jumbotron-padding;\n padding-bottom: @jumbotron-padding;\n margin-bottom: @jumbotron-padding;\n color: @jumbotron-color;\n background-color: @jumbotron-bg;\n\n h1,\n .h1 {\n color: @jumbotron-heading-color;\n }\n\n p {\n margin-bottom: (@jumbotron-padding / 2);\n font-size: @jumbotron-font-size;\n font-weight: 200;\n }\n\n > hr {\n border-top-color: darken(@jumbotron-bg, 10%);\n }\n\n .container &,\n .container-fluid & {\n border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container\n padding-left: (@grid-gutter-width / 2);\n padding-right: (@grid-gutter-width / 2);\n }\n\n .container {\n max-width: 100%;\n }\n\n @media screen and (min-width: @screen-sm-min) {\n padding-top: (@jumbotron-padding * 1.6);\n padding-bottom: (@jumbotron-padding * 1.6);\n\n .container &,\n .container-fluid & {\n padding-left: (@jumbotron-padding * 2);\n padding-right: (@jumbotron-padding * 2);\n }\n\n h1,\n .h1 {\n font-size: @jumbotron-heading-font-size;\n }\n }\n}\n","//\n// Thumbnails\n// --------------------------------------------------\n\n\n// Mixin and adjust the regular image class\n.thumbnail {\n display: block;\n padding: @thumbnail-padding;\n margin-bottom: @line-height-computed;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(border .2s ease-in-out);\n\n > img,\n a > img {\n &:extend(.img-responsive);\n margin-left: auto;\n margin-right: auto;\n }\n\n // Add a hover state for linked versions only\n a&:hover,\n a&:focus,\n a&.active {\n border-color: @link-color;\n }\n\n // Image captions\n .caption {\n padding: @thumbnail-caption-padding;\n color: @thumbnail-caption-color;\n }\n}\n","//\n// Alerts\n// --------------------------------------------------\n\n\n// Base styles\n// -------------------------\n\n.alert {\n padding: @alert-padding;\n margin-bottom: @line-height-computed;\n border: 1px solid transparent;\n border-radius: @alert-border-radius;\n\n // Headings for larger alerts\n h4 {\n margin-top: 0;\n // Specified for the h4 to prevent conflicts of changing @headings-color\n color: inherit;\n }\n\n // Provide class for links that match alerts\n .alert-link {\n font-weight: @alert-link-font-weight;\n }\n\n // Improve alignment and spacing of inner content\n > p,\n > ul {\n margin-bottom: 0;\n }\n\n > p + p {\n margin-top: 5px;\n }\n}\n\n// Dismissible alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0.\n.alert-dismissible {\n padding-right: (@alert-padding + 20);\n\n // Adjust close link position\n .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n }\n}\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n.alert-success {\n .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text);\n}\n\n.alert-info {\n .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text);\n}\n\n.alert-warning {\n .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text);\n}\n\n.alert-danger {\n .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text);\n}\n","// Alerts\n\n.alert-variant(@background; @border; @text-color) {\n background-color: @background;\n border-color: @border;\n color: @text-color;\n\n hr {\n border-top-color: darken(@border, 5%);\n }\n .alert-link {\n color: darken(@text-color, 10%);\n }\n}\n","//\n// Progress bars\n// --------------------------------------------------\n\n\n// Bar animations\n// -------------------------\n\n// WebKit\n@-webkit-keyframes progress-bar-stripes {\n from { background-position: 40px 0; }\n to { background-position: 0 0; }\n}\n\n// Spec and IE10+\n@keyframes progress-bar-stripes {\n from { background-position: 40px 0; }\n to { background-position: 0 0; }\n}\n\n\n// Bar itself\n// -------------------------\n\n// Outer container\n.progress {\n overflow: hidden;\n height: @line-height-computed;\n margin-bottom: @line-height-computed;\n background-color: @progress-bg;\n border-radius: @progress-border-radius;\n .box-shadow(inset 0 1px 2px rgba(0,0,0,.1));\n}\n\n// Bar of progress\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: @font-size-small;\n line-height: @line-height-computed;\n color: @progress-bar-color;\n text-align: center;\n background-color: @progress-bar-bg;\n .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));\n .transition(width .6s ease);\n}\n\n// Striped bars\n//\n// `.progress-striped .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar-striped` class, which you just add to an existing\n// `.progress-bar`.\n.progress-striped .progress-bar,\n.progress-bar-striped {\n #gradient > .striped();\n background-size: 40px 40px;\n}\n\n// Call animation for the active one\n//\n// `.progress.active .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar.active` approach.\n.progress.active .progress-bar,\n.progress-bar.active {\n .animation(progress-bar-stripes 2s linear infinite);\n}\n\n\n// Variations\n// -------------------------\n\n.progress-bar-success {\n .progress-bar-variant(@progress-bar-success-bg);\n}\n\n.progress-bar-info {\n .progress-bar-variant(@progress-bar-info-bg);\n}\n\n.progress-bar-warning {\n .progress-bar-variant(@progress-bar-warning-bg);\n}\n\n.progress-bar-danger {\n .progress-bar-variant(@progress-bar-danger-bg);\n}\n","// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Progress bars\n\n.progress-bar-variant(@color) {\n background-color: @color;\n\n // Deprecated parent class requirement as of v3.2.0\n .progress-striped & {\n #gradient > .striped();\n }\n}\n",".media {\n // Proper spacing between instances of .media\n margin-top: 15px;\n\n &:first-child {\n margin-top: 0;\n }\n}\n\n.media,\n.media-body {\n zoom: 1;\n overflow: hidden;\n}\n\n.media-body {\n width: 10000px;\n}\n\n.media-object {\n display: block;\n\n // Fix collapse in webkit from max-width: 100% and display: table-cell.\n &.img-thumbnail {\n max-width: none;\n }\n}\n\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n\n.media-middle {\n vertical-align: middle;\n}\n\n.media-bottom {\n vertical-align: bottom;\n}\n\n// Reset margins on headings for tighter default spacing\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n\n// Media list variation\n//\n// Undo default ul/ol styles\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n","//\n// List groups\n// --------------------------------------------------\n\n\n// Base class\n//\n// Easily usable on <ul>, <ol>, or <div>.\n\n.list-group {\n // No need to set list-style: none; since .list-group-item is block level\n margin-bottom: 20px;\n padding-left: 0; // reset padding because ul and ol\n}\n\n\n// Individual list items\n//\n// Use on `li`s or `div`s within the `.list-group` parent.\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n // Place the border on the list items and negative margin up for better styling\n margin-bottom: -1px;\n background-color: @list-group-bg;\n border: 1px solid @list-group-border;\n\n // Round the first and last items\n &:first-child {\n .border-top-radius(@list-group-border-radius);\n }\n &:last-child {\n margin-bottom: 0;\n .border-bottom-radius(@list-group-border-radius);\n }\n}\n\n\n// Interactive list items\n//\n// Use anchor or button elements instead of `li`s or `div`s to create interactive items.\n// Includes an extra `.active` modifier class for showing selected items.\n\na.list-group-item,\nbutton.list-group-item {\n color: @list-group-link-color;\n\n .list-group-item-heading {\n color: @list-group-link-heading-color;\n }\n\n // Hover state\n &:hover,\n &:focus {\n text-decoration: none;\n color: @list-group-link-hover-color;\n background-color: @list-group-hover-bg;\n }\n}\n\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n\n.list-group-item {\n // Disabled state\n &.disabled,\n &.disabled:hover,\n &.disabled:focus {\n background-color: @list-group-disabled-bg;\n color: @list-group-disabled-color;\n cursor: @cursor-disabled;\n\n // Force color to inherit for custom content\n .list-group-item-heading {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-disabled-text-color;\n }\n }\n\n // Active class on item itself, not parent\n &.active,\n &.active:hover,\n &.active:focus {\n z-index: 2; // Place active items above their siblings for proper border styling\n color: @list-group-active-color;\n background-color: @list-group-active-bg;\n border-color: @list-group-active-border;\n\n // Force color to inherit for custom content\n .list-group-item-heading,\n .list-group-item-heading > small,\n .list-group-item-heading > .small {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-active-text-color;\n }\n }\n}\n\n\n// Contextual variants\n//\n// Add modifier classes to change text and background color on individual items.\n// Organizationally, this must come after the `:hover` states.\n\n.list-group-item-variant(success; @state-success-bg; @state-success-text);\n.list-group-item-variant(info; @state-info-bg; @state-info-text);\n.list-group-item-variant(warning; @state-warning-bg; @state-warning-text);\n.list-group-item-variant(danger; @state-danger-bg; @state-danger-text);\n\n\n// Custom content options\n//\n// Extra classes for creating well-formatted content within `.list-group-item`s.\n\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n","// List Groups\n\n.list-group-item-variant(@state; @background; @color) {\n .list-group-item-@{state} {\n color: @color;\n background-color: @background;\n\n a&,\n button& {\n color: @color;\n\n .list-group-item-heading {\n color: inherit;\n }\n\n &:hover,\n &:focus {\n color: @color;\n background-color: darken(@background, 5%);\n }\n &.active,\n &.active:hover,\n &.active:focus {\n color: #fff;\n background-color: @color;\n border-color: @color;\n }\n }\n }\n}\n","//\n// Panels\n// --------------------------------------------------\n\n\n// Base class\n.panel {\n margin-bottom: @line-height-computed;\n background-color: @panel-bg;\n border: 1px solid transparent;\n border-radius: @panel-border-radius;\n .box-shadow(0 1px 1px rgba(0,0,0,.05));\n}\n\n// Panel contents\n.panel-body {\n padding: @panel-body-padding;\n &:extend(.clearfix all);\n}\n\n// Optional heading\n.panel-heading {\n padding: @panel-heading-padding;\n border-bottom: 1px solid transparent;\n .border-top-radius((@panel-border-radius - 1));\n\n > .dropdown .dropdown-toggle {\n color: inherit;\n }\n}\n\n// Within heading, strip any `h*` tag of its default margins for spacing.\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: ceil((@font-size-base * 1.125));\n color: inherit;\n\n > a,\n > small,\n > .small,\n > small > a,\n > .small > a {\n color: inherit;\n }\n}\n\n// Optional footer (stays gray in every modifier class)\n.panel-footer {\n padding: @panel-footer-padding;\n background-color: @panel-footer-bg;\n border-top: 1px solid @panel-inner-border;\n .border-bottom-radius((@panel-border-radius - 1));\n}\n\n\n// List groups in panels\n//\n// By default, space out list group content from panel headings to account for\n// any kind of custom content between the two.\n\n.panel {\n > .list-group,\n > .panel-collapse > .list-group {\n margin-bottom: 0;\n\n .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n }\n\n // Add border top radius for first one\n &:first-child {\n .list-group-item:first-child {\n border-top: 0;\n .border-top-radius((@panel-border-radius - 1));\n }\n }\n\n // Add border bottom radius for last one\n &:last-child {\n .list-group-item:last-child {\n border-bottom: 0;\n .border-bottom-radius((@panel-border-radius - 1));\n }\n }\n }\n > .panel-heading + .panel-collapse > .list-group {\n .list-group-item:first-child {\n .border-top-radius(0);\n }\n }\n}\n// Collapse space between when there's no additional content.\n.panel-heading + .list-group {\n .list-group-item:first-child {\n border-top-width: 0;\n }\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n\n// Tables in panels\n//\n// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and\n// watch it go full width.\n\n.panel {\n > .table,\n > .table-responsive > .table,\n > .panel-collapse > .table {\n margin-bottom: 0;\n\n caption {\n padding-left: @panel-body-padding;\n padding-right: @panel-body-padding;\n }\n }\n // Add border top radius for first one\n > .table:first-child,\n > .table-responsive:first-child > .table:first-child {\n .border-top-radius((@panel-border-radius - 1));\n\n > thead:first-child,\n > tbody:first-child {\n > tr:first-child {\n border-top-left-radius: (@panel-border-radius - 1);\n border-top-right-radius: (@panel-border-radius - 1);\n\n td:first-child,\n th:first-child {\n border-top-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-top-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n // Add border bottom radius for last one\n > .table:last-child,\n > .table-responsive:last-child > .table:last-child {\n .border-bottom-radius((@panel-border-radius - 1));\n\n > tbody:last-child,\n > tfoot:last-child {\n > tr:last-child {\n border-bottom-left-radius: (@panel-border-radius - 1);\n border-bottom-right-radius: (@panel-border-radius - 1);\n\n td:first-child,\n th:first-child {\n border-bottom-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-bottom-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n > .panel-body + .table,\n > .panel-body + .table-responsive,\n > .table + .panel-body,\n > .table-responsive + .panel-body {\n border-top: 1px solid @table-border-color;\n }\n > .table > tbody:first-child > tr:first-child th,\n > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n }\n > .table-bordered,\n > .table-responsive > .table-bordered {\n border: 0;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n > thead,\n > tbody {\n > tr:first-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n > tbody,\n > tfoot {\n > tr:last-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n }\n > .table-responsive {\n border: 0;\n margin-bottom: 0;\n }\n}\n\n\n// Collapsible panels (aka, accordion)\n//\n// Wrap a series of panels in `.panel-group` to turn them into an accordion with\n// the help of our collapse JavaScript plugin.\n\n.panel-group {\n margin-bottom: @line-height-computed;\n\n // Tighten up margin so it's only between panels\n .panel {\n margin-bottom: 0;\n border-radius: @panel-border-radius;\n\n + .panel {\n margin-top: 5px;\n }\n }\n\n .panel-heading {\n border-bottom: 0;\n\n + .panel-collapse > .panel-body,\n + .panel-collapse > .list-group {\n border-top: 1px solid @panel-inner-border;\n }\n }\n\n .panel-footer {\n border-top: 0;\n + .panel-collapse .panel-body {\n border-bottom: 1px solid @panel-inner-border;\n }\n }\n}\n\n\n// Contextual variations\n.panel-default {\n .panel-variant(@panel-default-border; @panel-default-text; @panel-default-heading-bg; @panel-default-border);\n}\n.panel-primary {\n .panel-variant(@panel-primary-border; @panel-primary-text; @panel-primary-heading-bg; @panel-primary-border);\n}\n.panel-success {\n .panel-variant(@panel-success-border; @panel-success-text; @panel-success-heading-bg; @panel-success-border);\n}\n.panel-info {\n .panel-variant(@panel-info-border; @panel-info-text; @panel-info-heading-bg; @panel-info-border);\n}\n.panel-warning {\n .panel-variant(@panel-warning-border; @panel-warning-text; @panel-warning-heading-bg; @panel-warning-border);\n}\n.panel-danger {\n .panel-variant(@panel-danger-border; @panel-danger-text; @panel-danger-heading-bg; @panel-danger-border);\n}\n","// Panels\n\n.panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border) {\n border-color: @border;\n\n & > .panel-heading {\n color: @heading-text-color;\n background-color: @heading-bg-color;\n border-color: @heading-border;\n\n + .panel-collapse > .panel-body {\n border-top-color: @border;\n }\n .badge {\n color: @heading-bg-color;\n background-color: @heading-text-color;\n }\n }\n & > .panel-footer {\n + .panel-collapse > .panel-body {\n border-bottom-color: @border;\n }\n }\n}\n","// Embeds responsive\n//\n// Credit: Nicolas Gallagher and SUIT CSS.\n\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n\n .embed-responsive-item,\n iframe,\n embed,\n object,\n video {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n height: 100%;\n width: 100%;\n border: 0;\n }\n}\n\n// Modifier class for 16:9 aspect ratio\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n\n// Modifier class for 4:3 aspect ratio\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n","//\n// Wells\n// --------------------------------------------------\n\n\n// Base class\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: @well-bg;\n border: 1px solid @well-border;\n border-radius: @border-radius-base;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.05));\n blockquote {\n border-color: #ddd;\n border-color: rgba(0,0,0,.15);\n }\n}\n\n// Sizes\n.well-lg {\n padding: 24px;\n border-radius: @border-radius-large;\n}\n.well-sm {\n padding: 9px;\n border-radius: @border-radius-small;\n}\n","//\n// Close icons\n// --------------------------------------------------\n\n\n.close {\n float: right;\n font-size: (@font-size-base * 1.5);\n font-weight: @close-font-weight;\n line-height: 1;\n color: @close-color;\n text-shadow: @close-text-shadow;\n .opacity(.2);\n\n &:hover,\n &:focus {\n color: @close-color;\n text-decoration: none;\n cursor: pointer;\n .opacity(.5);\n }\n\n // Additional properties for button version\n // iOS requires the button element instead of an anchor tag.\n // If you want the anchor version, it requires `href=\"#\"`.\n // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n button& {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n }\n}\n","//\n// Modals\n// --------------------------------------------------\n\n// .modal-open - body class for killing the scroll\n// .modal - container to scroll within\n// .modal-dialog - positioning shell for the actual modal\n// .modal-content - actual modal w/ bg and corners and shit\n\n// Kill the scroll on the body\n.modal-open {\n overflow: hidden;\n}\n\n// Container that the modal scrolls within\n.modal {\n display: none;\n overflow: hidden;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal;\n -webkit-overflow-scrolling: touch;\n\n // Prevent Chrome on Windows from adding a focus outline. For details, see\n // https://github.com/twbs/bootstrap/pull/10951.\n outline: 0;\n\n // When fading in the modal, animate it to slide down\n &.fade .modal-dialog {\n .translate(0, -25%);\n .transition-transform(~\"0.3s ease-out\");\n }\n &.in .modal-dialog { .translate(0, 0) }\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n// Shell div to position the modal with bottom padding\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n\n// Actual modal\n.modal-content {\n position: relative;\n background-color: @modal-content-bg;\n border: 1px solid @modal-content-fallback-border-color; //old browsers fallback (ie8 etc)\n border: 1px solid @modal-content-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 3px 9px rgba(0,0,0,.5));\n background-clip: padding-box;\n // Remove focus outline from opened modal\n outline: 0;\n}\n\n// Modal background\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal-background;\n background-color: @modal-backdrop-bg;\n // Fade for backdrop\n &.fade { .opacity(0); }\n &.in { .opacity(@modal-backdrop-opacity); }\n}\n\n// Modal header\n// Top section of the modal w/ title and dismiss\n.modal-header {\n padding: @modal-title-padding;\n border-bottom: 1px solid @modal-header-border-color;\n &:extend(.clearfix all);\n}\n// Close icon\n.modal-header .close {\n margin-top: -2px;\n}\n\n// Title text within header\n.modal-title {\n margin: 0;\n line-height: @modal-title-line-height;\n}\n\n// Modal body\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\n.modal-body {\n position: relative;\n padding: @modal-inner-padding;\n}\n\n// Footer (for actions)\n.modal-footer {\n padding: @modal-inner-padding;\n text-align: right; // right align buttons\n border-top: 1px solid @modal-footer-border-color;\n &:extend(.clearfix all); // clear it in case folks use .pull-* classes on buttons\n\n // Properly space out buttons\n .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0; // account for input[type=\"submit\"] which gets the bottom margin like all other inputs\n }\n // but override that for button groups\n .btn-group .btn + .btn {\n margin-left: -1px;\n }\n // and override it for block buttons as well\n .btn-block + .btn-block {\n margin-left: 0;\n }\n}\n\n// Measure scrollbar width for padding body during modal show/hide\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n// Scale up the modal\n@media (min-width: @screen-sm-min) {\n // Automatically set modal's width for larger viewports\n .modal-dialog {\n width: @modal-md;\n margin: 30px auto;\n }\n .modal-content {\n .box-shadow(0 5px 15px rgba(0,0,0,.5));\n }\n\n // Modal sizes\n .modal-sm { width: @modal-sm; }\n}\n\n@media (min-width: @screen-md-min) {\n .modal-lg { width: @modal-lg; }\n}\n","//\n// Tooltips\n// --------------------------------------------------\n\n\n// Base class\n.tooltip {\n position: absolute;\n z-index: @zindex-tooltip;\n display: block;\n // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n .reset-text();\n font-size: @font-size-small;\n\n .opacity(0);\n\n &.in { .opacity(@tooltip-opacity); }\n &.top { margin-top: -3px; padding: @tooltip-arrow-width 0; }\n &.right { margin-left: 3px; padding: 0 @tooltip-arrow-width; }\n &.bottom { margin-top: 3px; padding: @tooltip-arrow-width 0; }\n &.left { margin-left: -3px; padding: 0 @tooltip-arrow-width; }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n max-width: @tooltip-max-width;\n padding: 3px 8px;\n color: @tooltip-color;\n text-align: center;\n background-color: @tooltip-bg;\n border-radius: @border-radius-base;\n}\n\n// Arrows\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n// Note: Deprecated .top-left, .top-right, .bottom-left, and .bottom-right as of v3.3.1\n.tooltip {\n &.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-left .tooltip-arrow {\n bottom: 0;\n right: @tooltip-arrow-width;\n margin-bottom: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-right .tooltip-arrow {\n bottom: 0;\n left: @tooltip-arrow-width;\n margin-bottom: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width @tooltip-arrow-width 0;\n border-right-color: @tooltip-arrow-color;\n }\n &.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-left-color: @tooltip-arrow-color;\n }\n &.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-left .tooltip-arrow {\n top: 0;\n right: @tooltip-arrow-width;\n margin-top: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-right .tooltip-arrow {\n top: 0;\n left: @tooltip-arrow-width;\n margin-top: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n}\n",".reset-text() {\n font-family: @font-family-base;\n // We deliberately do NOT reset font-size.\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: @line-height-base;\n text-align: left; // Fallback for where `start` is not supported\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n}\n","//\n// Popovers\n// --------------------------------------------------\n\n\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: @zindex-popover;\n display: none;\n max-width: @popover-max-width;\n padding: 1px;\n // Our parent element can be arbitrary since popovers are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n .reset-text();\n font-size: @font-size-base;\n\n background-color: @popover-bg;\n background-clip: padding-box;\n border: 1px solid @popover-fallback-border-color;\n border: 1px solid @popover-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 5px 10px rgba(0,0,0,.2));\n\n // Offset the popover to account for the popover arrow\n &.top { margin-top: -@popover-arrow-width; }\n &.right { margin-left: @popover-arrow-width; }\n &.bottom { margin-top: @popover-arrow-width; }\n &.left { margin-left: -@popover-arrow-width; }\n}\n\n.popover-title {\n margin: 0; // reset heading margin\n padding: 8px 14px;\n font-size: @font-size-base;\n background-color: @popover-title-bg;\n border-bottom: 1px solid darken(@popover-title-bg, 5%);\n border-radius: (@border-radius-large - 1) (@border-radius-large - 1) 0 0;\n}\n\n.popover-content {\n padding: 9px 14px;\n}\n\n// Arrows\n//\n// .arrow is outer, .arrow:after is inner\n\n.popover > .arrow {\n &,\n &:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n }\n}\n.popover > .arrow {\n border-width: @popover-arrow-outer-width;\n}\n.popover > .arrow:after {\n border-width: @popover-arrow-width;\n content: \"\";\n}\n\n.popover {\n &.top > .arrow {\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-bottom-width: 0;\n border-top-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-top-color: @popover-arrow-outer-color;\n bottom: -@popover-arrow-outer-width;\n &:after {\n content: \" \";\n bottom: 1px;\n margin-left: -@popover-arrow-width;\n border-bottom-width: 0;\n border-top-color: @popover-arrow-color;\n }\n }\n &.right > .arrow {\n top: 50%;\n left: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-left-width: 0;\n border-right-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-right-color: @popover-arrow-outer-color;\n &:after {\n content: \" \";\n left: 1px;\n bottom: -@popover-arrow-width;\n border-left-width: 0;\n border-right-color: @popover-arrow-color;\n }\n }\n &.bottom > .arrow {\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-top-width: 0;\n border-bottom-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-bottom-color: @popover-arrow-outer-color;\n top: -@popover-arrow-outer-width;\n &:after {\n content: \" \";\n top: 1px;\n margin-left: -@popover-arrow-width;\n border-top-width: 0;\n border-bottom-color: @popover-arrow-color;\n }\n }\n\n &.left > .arrow {\n top: 50%;\n right: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-right-width: 0;\n border-left-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-left-color: @popover-arrow-outer-color;\n &:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: @popover-arrow-color;\n bottom: -@popover-arrow-width;\n }\n }\n}\n","//\n// Carousel\n// --------------------------------------------------\n\n\n// Wrapper for the slide container and indicators\n.carousel {\n position: relative;\n}\n\n.carousel-inner {\n position: relative;\n overflow: hidden;\n width: 100%;\n\n > .item {\n display: none;\n position: relative;\n .transition(.6s ease-in-out left);\n\n // Account for jankitude on images\n > img,\n > a > img {\n &:extend(.img-responsive);\n line-height: 1;\n }\n\n // WebKit CSS3 transforms for supported devices\n @media all and (transform-3d), (-webkit-transform-3d) {\n .transition-transform(~'0.6s ease-in-out');\n .backface-visibility(~'hidden');\n .perspective(1000px);\n\n &.next,\n &.active.right {\n .translate3d(100%, 0, 0);\n left: 0;\n }\n &.prev,\n &.active.left {\n .translate3d(-100%, 0, 0);\n left: 0;\n }\n &.next.left,\n &.prev.right,\n &.active {\n .translate3d(0, 0, 0);\n left: 0;\n }\n }\n }\n\n > .active,\n > .next,\n > .prev {\n display: block;\n }\n\n > .active {\n left: 0;\n }\n\n > .next,\n > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n }\n\n > .next {\n left: 100%;\n }\n > .prev {\n left: -100%;\n }\n > .next.left,\n > .prev.right {\n left: 0;\n }\n\n > .active.left {\n left: -100%;\n }\n > .active.right {\n left: 100%;\n }\n\n}\n\n// Left/right controls for nav\n// ---------------------------\n\n.carousel-control {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: @carousel-control-width;\n .opacity(@carousel-control-opacity);\n font-size: @carousel-control-font-size;\n color: @carousel-control-color;\n text-align: center;\n text-shadow: @carousel-text-shadow;\n background-color: rgba(0, 0, 0, 0); // Fix IE9 click-thru bug\n // We can't have this transition here because WebKit cancels the carousel\n // animation if you trip this while in the middle of another animation.\n\n // Set gradients for backgrounds\n &.left {\n #gradient > .horizontal(@start-color: rgba(0,0,0,.5); @end-color: rgba(0,0,0,.0001));\n }\n &.right {\n left: auto;\n right: 0;\n #gradient > .horizontal(@start-color: rgba(0,0,0,.0001); @end-color: rgba(0,0,0,.5));\n }\n\n // Hover/focus state\n &:hover,\n &:focus {\n outline: 0;\n color: @carousel-control-color;\n text-decoration: none;\n .opacity(.9);\n }\n\n // Toggles\n .icon-prev,\n .icon-next,\n .glyphicon-chevron-left,\n .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n margin-top: -10px;\n z-index: 5;\n display: inline-block;\n }\n .icon-prev,\n .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n }\n .icon-next,\n .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n }\n .icon-prev,\n .icon-next {\n width: 20px;\n height: 20px;\n line-height: 1;\n font-family: serif;\n }\n\n\n .icon-prev {\n &:before {\n content: '\\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)\n }\n }\n .icon-next {\n &:before {\n content: '\\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)\n }\n }\n}\n\n// Optional indicator pips\n//\n// Add an unordered list with the following class and add a list item for each\n// slide your carousel holds.\n\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n margin-left: -30%;\n padding-left: 0;\n list-style: none;\n text-align: center;\n\n li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n border: 1px solid @carousel-indicator-border-color;\n border-radius: 10px;\n cursor: pointer;\n\n // IE8-9 hack for event handling\n //\n // Internet Explorer 8-9 does not support clicks on elements without a set\n // `background-color`. We cannot use `filter` since that's not viewed as a\n // background color by the browser. Thus, a hack is needed.\n // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Internet_Explorer\n //\n // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we\n // set alpha transparency for the best results possible.\n background-color: #000 \\9; // IE8\n background-color: rgba(0,0,0,0); // IE9\n }\n .active {\n margin: 0;\n width: 12px;\n height: 12px;\n background-color: @carousel-indicator-active-bg;\n }\n}\n\n// Optional captions\n// -----------------------------\n// Hidden by default for smaller viewports\n.carousel-caption {\n position: absolute;\n left: 15%;\n right: 15%;\n bottom: 20px;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: @carousel-caption-color;\n text-align: center;\n text-shadow: @carousel-text-shadow;\n & .btn {\n text-shadow: none; // No shadow for button elements in carousel-caption\n }\n}\n\n\n// Scale up controls for tablets and up\n@media screen and (min-width: @screen-sm-min) {\n\n // Scale up the controls a smidge\n .carousel-control {\n .glyphicon-chevron-left,\n .glyphicon-chevron-right,\n .icon-prev,\n .icon-next {\n width: (@carousel-control-font-size * 1.5);\n height: (@carousel-control-font-size * 1.5);\n margin-top: (@carousel-control-font-size / -2);\n font-size: (@carousel-control-font-size * 1.5);\n }\n .glyphicon-chevron-left,\n .icon-prev {\n margin-left: (@carousel-control-font-size / -2);\n }\n .glyphicon-chevron-right,\n .icon-next {\n margin-right: (@carousel-control-font-size / -2);\n }\n }\n\n // Show and left align the captions\n .carousel-caption {\n left: 20%;\n right: 20%;\n padding-bottom: 30px;\n }\n\n // Move up the indicators\n .carousel-indicators {\n bottom: 20px;\n }\n}\n","// Clearfix\n//\n// For modern browsers\n// 1. The space content is one way to avoid an Opera bug when the\n// contenteditable attribute is included anywhere else in the document.\n// Otherwise it causes space to appear at the top and bottom of elements\n// that are clearfixed.\n// 2. The use of `table` rather than `block` is only necessary if using\n// `:before` to contain the top-margins of child elements.\n//\n// Source: http://nicolasgallagher.com/micro-clearfix-hack/\n\n.clearfix() {\n &:before,\n &:after {\n content: \" \"; // 1\n display: table; // 2\n }\n &:after {\n clear: both;\n }\n}\n","// Center-align a block level element\n\n.center-block() {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n","// CSS image replacement\n//\n// Heads up! v3 launched with only `.hide-text()`, but per our pattern for\n// mixins being reused as classes with the same name, this doesn't hold up. As\n// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`.\n//\n// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757\n\n// Deprecated as of v3.0.1 (has been removed in v4)\n.hide-text() {\n font: ~\"0/0\" a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n\n// New mixin to use as of v3.0.1\n.text-hide() {\n .hide-text();\n}\n","//\n// Responsive: Utility classes\n// --------------------------------------------------\n\n\n// IE10 in Windows (Phone) 8\n//\n// Support for responsive views via media queries is kind of borked in IE10, for\n// Surface/desktop in split view and for Windows Phone 8. This particular fix\n// must be accompanied by a snippet of JavaScript to sniff the user agent and\n// apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at\n// our Getting Started page for more information on this bug.\n//\n// For more information, see the following:\n//\n// Issue: https://github.com/twbs/bootstrap/issues/10497\n// Docs: http://getbootstrap.com/getting-started/#support-ie10-width\n// Source: http://timkadlec.com/2013/01/windows-phone-8-and-device-width/\n// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/\n\n@-ms-viewport {\n width: device-width;\n}\n\n\n// Visibility utilities\n// Note: Deprecated .visible-xs, .visible-sm, .visible-md, and .visible-lg as of v3.2.0\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n .responsive-invisibility();\n}\n\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n\n.visible-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-visibility();\n }\n}\n.visible-xs-block {\n @media (max-width: @screen-xs-max) {\n display: block !important;\n }\n}\n.visible-xs-inline {\n @media (max-width: @screen-xs-max) {\n display: inline !important;\n }\n}\n.visible-xs-inline-block {\n @media (max-width: @screen-xs-max) {\n display: inline-block !important;\n }\n}\n\n.visible-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-visibility();\n }\n}\n.visible-sm-block {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: block !important;\n }\n}\n.visible-sm-inline {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: inline !important;\n }\n}\n.visible-sm-inline-block {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: inline-block !important;\n }\n}\n\n.visible-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-visibility();\n }\n}\n.visible-md-block {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: block !important;\n }\n}\n.visible-md-inline {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: inline !important;\n }\n}\n.visible-md-inline-block {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: inline-block !important;\n }\n}\n\n.visible-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-visibility();\n }\n}\n.visible-lg-block {\n @media (min-width: @screen-lg-min) {\n display: block !important;\n }\n}\n.visible-lg-inline {\n @media (min-width: @screen-lg-min) {\n display: inline !important;\n }\n}\n.visible-lg-inline-block {\n @media (min-width: @screen-lg-min) {\n display: inline-block !important;\n }\n}\n\n.hidden-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-invisibility();\n }\n}\n.hidden-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-invisibility();\n }\n}\n.hidden-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-invisibility();\n }\n}\n.hidden-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-invisibility();\n }\n}\n\n\n// Print utilities\n//\n// Media queries are placed on the inside to be mixin-friendly.\n\n// Note: Deprecated .visible-print as of v3.2.0\n.visible-print {\n .responsive-invisibility();\n\n @media print {\n .responsive-visibility();\n }\n}\n.visible-print-block {\n display: none !important;\n\n @media print {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n\n @media print {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n\n @media print {\n display: inline-block !important;\n }\n}\n\n.hidden-print {\n @media print {\n .responsive-invisibility();\n }\n}\n","// Responsive utilities\n\n//\n// More easily include all the states for responsive-utilities.less.\n.responsive-visibility() {\n display: block !important;\n table& { display: table !important; }\n tr& { display: table-row !important; }\n th&,\n td& { display: table-cell !important; }\n}\n\n.responsive-invisibility() {\n display: none !important;\n}\n"]} \ No newline at end of file
+{"version":3,"sources":["../../scss/bootstrap.scss","../../scss/_print.scss","bootstrap.css","../../scss/_reboot.scss","../../scss/_variables.scss","../../scss/mixins/_hover.scss","../../scss/_type.scss","../../scss/mixins/_lists.scss","../../scss/_images.scss","../../scss/mixins/_image.scss","../../scss/mixins/_border-radius.scss","../../scss/mixins/_transition.scss","../../scss/_code.scss","../../scss/_grid.scss","../../scss/mixins/_grid.scss","../../scss/mixins/_breakpoints.scss","../../scss/mixins/_grid-framework.scss","../../scss/_tables.scss","../../scss/mixins/_table-row.scss","../../scss/_forms.scss","../../scss/mixins/_forms.scss","../../scss/_buttons.scss","../../scss/mixins/_buttons.scss","../../scss/_transitions.scss","../../scss/_dropdown.scss","../../scss/mixins/_nav-divider.scss","../../scss/_button-group.scss","../../scss/_input-group.scss","../../scss/_custom-forms.scss","../../scss/_nav.scss","../../scss/_navbar.scss","../../scss/_card.scss","../../scss/mixins/_cards.scss","../../scss/_breadcrumb.scss","../../scss/mixins/_clearfix.scss","../../scss/_pagination.scss","../../scss/mixins/_pagination.scss","../../scss/_badge.scss","../../scss/mixins/_badge.scss","../../scss/_jumbotron.scss","../../scss/_alert.scss","../../scss/mixins/_alert.scss","../../scss/_progress.scss","../../scss/mixins/_gradients.scss","../../scss/_media.scss","../../scss/_list-group.scss","../../scss/mixins/_list-group.scss","../../scss/_responsive-embed.scss","../../scss/_close.scss","../../scss/_modal.scss","../../scss/_tooltip.scss","../../scss/mixins/_reset-text.scss","../../scss/_popover.scss","../../scss/_carousel.scss","../../scss/utilities/_align.scss","../../scss/utilities/_background.scss","../../scss/mixins/_background-variant.scss","../../scss/utilities/_borders.scss","../../scss/utilities/_display.scss","../../scss/utilities/_flex.scss","../../scss/utilities/_float.scss","../../scss/mixins/_float.scss","../../scss/utilities/_position.scss","../../scss/utilities/_screenreaders.scss","../../scss/mixins/_screen-reader.scss","../../scss/utilities/_sizing.scss","../../scss/utilities/_spacing.scss","../../scss/utilities/_text.scss","../../scss/mixins/_text-truncate.scss","../../scss/mixins/_text-emphasis.scss","../../scss/mixins/_text-hide.scss","../../scss/utilities/_visibility.scss","../../scss/mixins/_visibility.scss"],"names":[],"mappings":"AAAA;;;;;GAKG;ACMD;EACE;;;;;;;;;;;IAcE,6BAA4B;IAE5B,oCAA2B;YAA3B,4BAA2B;GAC5B;EAED;;IAEE,2BAA0B;GAC3B;EAOD;IACE,8BAA6B;GAC9B;EAaD;IACE,iCAAgC;GACjC;EACD;;IAEE,uBAAgC;IAChC,yBAAwB;GACzB;EAOD;IACE,4BAA2B;GAC5B;EAED;;IAEE,yBAAwB;GACzB;EAED;;;IAGE,WAAU;IACV,UAAS;GACV;EAED;;IAEE,wBAAuB;GACxB;EAKD;IACE,cAAa;GACd;EACD;IACE,uBAAgC;GACjC;EAED;IACE,qCAAoC;GAMrC;EAPD;;IAKI,kCAAiC;GAClC;EAEH;;IAGI,kCAAiC;GAClC;CC3CN;;AClDD;EACE,+BAAsB;UAAtB,uBAAsB;EACtB,wBAAuB;EACvB,kBAAiB;EACjB,+BAA8B;EAC9B,2BAA0B;EAC1B,8BAA6B;EAC7B,yCAA0C;CAC3C;;AAED;;;EAGE,4BAAmB;UAAnB,oBAAmB;CACpB;;AAIC;EAAgB,oBAAmB;CDoDpC;;AC3CD;EACE,UAAS;EACT,wGCqMiH;EDpMjH,gBCwMmB;EDvMnB,oBC4MyB;ED3MzB,iBC+MoB;ED9MpB,eCqDiC;EDpDjC,uBCwCW;CDvCZ;;AD+CD;ECvCE,yBAAwB;CACzB;;AAQD;EACE,gCAAuB;UAAvB,wBAAuB;EACvB,UAAS;EACT,kBAAiB;CAClB;;AAWD;EACE,cAAa;EACb,qBAAoB;CACrB;;AAMD;EACE,cAAa;EACb,oBAAmB;CACpB;;AASD;;EAEE,2BAA0B;EAC1B,kCAAiC;EACjC,aAAY;EACZ,iBAAgB;CACjB;;AAED;EACE,oBAAmB;EACnB,mBAAkB;EAClB,qBAAoB;CACrB;;AAED;;;EAGE,cAAa;EACb,oBAAmB;CACpB;;AAED;;;;EAIE,iBAAgB;CACjB;;AAED;EACE,kBCuHqB;CDtHtB;;AAED;EACE,qBAAoB;EACpB,eAAc;CACf;;AAED;EACE,iBAAgB;CACjB;;AAED;EACE,mBAAkB;CACnB;;AAED;;EAEE,oBAAmB;CACpB;;AAED;EACE,eAAc;CACf;;AAOD;;EAEE,mBAAkB;EAClB,eAAc;EACd,eAAc;EACd,yBAAwB;CACzB;;AAED;EAAM,eAAc;CAAK;;AACzB;EAAM,WAAU;CAAK;;AAOrB;EACE,eCpFc;EDqFd,sBCf0B;EDgB1B,8BAA6B;EAC7B,sCAAqC;CAMtC;;AEtLG;EFmLA,eCnB4C;EDoB5C,2BCnB6B;CCjKR;;AF8LzB;EACE,eAAc;EACd,sBAAqB;CAUtB;;AE/LG;EFwLA,eAAc;EACd,sBAAqB;CEtLpB;;AFgLL;EAUI,WAAU;CACX;;AAQH;;;;EAIE,kCAAiC;EACjC,eAAc;CACf;;AAED;EAEE,cAAa;EAEb,oBAAmB;EAEnB,eAAc;CACf;;AAOD;EAEE,iBAAgB;CACjB;;AAOD;EACE,uBAAsB;EACtB,mBAAkB;CACnB;;AAED;EACE,iBAAgB;CACjB;;AAaD;;;;;;;;;EASE,+BAA0B;MAA1B,2BAA0B;CAC3B;;AAOD;EACE,0BAAyB;CAC1B;;AAED;EACE,qBCoBoC;EDnBpC,wBCmBoC;EDlBpC,eC5LiC;ED6LjC,iBAAgB;EAChB,qBAAoB;CACrB;;AAED;EAEE,iBAAgB;CACjB;;AAOD;EAEE,sBAAqB;EACrB,qBAAoB;CACrB;;AAMD;EACE,oBAAmB;EACnB,2CAA0C;CAC3C;;AAED;;;;;EAKE,UAAS;EACT,qBAAoB;EACpB,mBAAkB;EAClB,qBAAoB;CACrB;;AAED;;EAEE,kBAAiB;CAClB;;AAED;;EAEE,qBAAoB;CACrB;;AAKD;;;;EAIE,2BAA0B;CAC3B;;AAGD;;;;EAIE,WAAU;EACV,mBAAkB;CACnB;;AAED;;EAEE,+BAAsB;UAAtB,uBAAsB;EACtB,WAAU;CACX;;AAGD;;;;EASE,4BAA2B;CAC5B;;AAED;EACE,eAAc;EAEd,iBAAgB;CACjB;;AAED;EAME,aAAY;EAEZ,WAAU;EACV,UAAS;EACT,UAAS;CACV;;AAID;EACE,eAAc;EACd,YAAW;EACX,gBAAe;EACf,WAAU;EACV,qBAAoB;EACpB,kBAAiB;EACjB,qBAAoB;EACpB,eAAc;EACd,oBAAmB;CACpB;;AAED;EACE,yBAAwB;CACzB;;AD5DD;;ECiEE,aAAY;CACb;;AD7DD;ECoEE,qBAAoB;EACpB,yBAAwB;CACzB;;ADjED;;ECyEE,yBAAwB;CACzB;;AAOD;EACE,cAAa;EACb,2BAA0B;CAC3B;;AAMD;EACE,sBAAqB;CACtB;;AAED;EACE,mBAAkB;CACnB;;AAED;EACE,cAAa;CACd;;AD9ED;ECmFE,yBAAwB;CACzB;;AGxdD;;EAEE,sBFsQoC;EErQpC,qBFsQ8B;EErQ9B,iBFsQ0B;EErQ1B,iBFsQ0B;EErQ1B,eFsQ8B;CErQ/B;;AAED;EAAU,kBFwPW;CExPiB;;AACtC;EAAU,gBFwPS;CExPmB;;AACtC;EAAU,mBFwPY;CExPgB;;AACtC;EAAU,kBFwPW;CExPiB;;AACtC;EAAU,mBFwPY;CExPgB;;AACtC;EAAU,gBFwPS;CExPmB;;AAEtC;EACE,mBFwQwB;EEvQxB,iBFwQoB;CEvQrB;;AAGD;EACE,gBFuPkB;EEtPlB,iBF2PuB;EE1PvB,iBFkP0B;CEjP3B;;AACD;EACE,kBFmPoB;EElPpB,iBFuPuB;EEtPvB,iBF6O0B;CE5O3B;;AACD;EACE,kBF+OoB;EE9OpB,iBFmPuB;EElPvB,iBFwO0B;CEvO3B;;AACD;EACE,kBF2OoB;EE1OpB,iBF+OuB;EE9OvB,iBFmO0B;CElO3B;;AAOD;EACE,iBAAgB;EAChB,oBAAmB;EACnB,UAAS;EACT,yCFuCW;CEtCZ;;AAOD;;EAEE,eF8NmB;EE7NnB,oBF4LyB;CE3L1B;;AAED;;EAEE,eFoOiB;EEnOjB,0BFglBsC;CE/kBvC;;AAOD;EC7EE,gBAAe;EACf,iBAAgB;CD8EjB;;AAGD;EClFE,gBAAe;EACf,iBAAgB;CDmFjB;;AACD;EACE,sBAAqB;CAKtB;;AAND;EAII,kBFsNqB;CErNtB;;AASH;EACE,eAAc;EACd,0BAAyB;CAC1B;;AAGD;EACE,qBF8BW;EE7BX,oBF6BW;EE5BX,mBFqLgD;EEpLhD,mCFJiC;CEKlC;;AAED;EACE,eAAc;EACd,eAAc;EACd,eFXiC;CEgBlC;;AARD;EAMI,uBAAsB;CACvB;;AAIH;EACE,oBFYW;EEXX,gBAAe;EACf,kBAAiB;EACjB,oCFtBiC;EEuBjC,eAAc;CACf;;AAED;EAEI,YAAW;CACZ;;AAHH;EAKI,uBAAsB;CACvB;;AEtIH;ECIE,gBAAe;EAGf,aAAY;CDLb;;AAID;EACE,iBJ00BkC;EIz0BlC,uBJ+EW;EI9EX,uBJ20BgC;EMv1B9B,uBNgO2B;EO/NzB,yCPy1B2C;EOz1B3C,oCPy1B2C;EOz1B3C,iCPy1B2C;EKn1B/C,gBAAe;EAGf,aAAY;CDSb;;AAMD;EAEE,sBAAqB;CACtB;;AAED;EACE,sBAA4B;EAC5B,eAAc;CACf;;AAED;EACE,eJ2zB4B;EI1zB5B,eJmEiC;CIlElC;;AIzCD;;;;EAIE,kFRkP2F;CQjP5F;;AAGD;EACE,uBR04BiC;EQz4BjC,eRu4B+B;EQt4B/B,eRy4BmC;EQx4BnC,0BRiGiC;EM1G/B,uBNgO2B;CQ9M9B;;AALC;EACE,WAAU;EACV,eAAc;EACd,0BAAyB;CAC1B;;AAIH;EACE,uBR03BiC;EQz3BjC,eRu3B+B;EQt3B/B,YRkEW;EQjEX,0BR6EiC;EMtG/B,sBNkO0B;CQ/L7B;;AAdD;EASI,WAAU;EACV,gBAAe;EACf,kBR4NmB;CQ1NpB;;AAIH;EACE,eAAc;EACd,cAAa;EACb,oBAAmB;EACnB,eRo2B+B;EQn2B/B,eR2DiC;CQjDlC;;AAfD;EASI,WAAU;EACV,mBAAkB;EAClB,eAAc;EACd,8BAA6B;EAC7B,iBAAgB;CACjB;;AAIH;EACE,kBR+1BiC;EQ91BjC,mBAAkB;CACnB;;AC1DC;ECAA,mBAAkB;EAClB,kBAAiB;EAKb,oBAA4B;EAC5B,mBAA4B;CDJ/B;;AEgDC;EFnDF;ICMI,oBAA4B;IAC5B,mBAA4B;GDJ/B;CX8mBF;;Aa9jBG;EFnDF;ICMI,oBAA4B;IAC5B,mBAA4B;GDJ/B;CXqnBF;;AarkBG;EFnDF;ICMI,oBAA4B;IAC5B,mBAA4B;GDJ/B;CX4nBF;;Aa5kBG;EFnDF;ICMI,oBAA4B;IAC5B,mBAA4B;GDJ/B;CXmoBF;;AanlBG;EFnDF;ICiBI,aV8KK;IU7KL,gBAAe;GDflB;CX0oBF;;Aa1lBG;EFnDF;ICiBI,aV+KK;IU9KL,gBAAe;GDflB;CXipBF;;AajmBG;EFnDF;ICiBI,aVgLK;IU/KL,gBAAe;GDflB;CXwpBF;;AaxmBG;EFnDF;ICiBI,cViLM;IUhLN,gBAAe;GDflB;CX+pBF;;AWtpBC;EACE,YAAW;ECbb,mBAAkB;EAClB,kBAAiB;EAKb,oBAA4B;EAC5B,mBAA4B;CDQ/B;;AEoCC;EFvCF;ICNI,oBAA4B;IAC5B,mBAA4B;GDQ/B;CXkqBF;;Aa9nBG;EFvCF;ICNI,oBAA4B;IAC5B,mBAA4B;GDQ/B;CXyqBF;;AaroBG;EFvCF;ICNI,oBAA4B;IAC5B,mBAA4B;GDQ/B;CXgrBF;;Aa5oBG;EFvCF;ICNI,oBAA4B;IAC5B,mBAA4B;GDQ/B;CXurBF;;AW/qBC;ECWA,qBAAa;EAAb,sBAAa;EAAb,qBAAa;EAAb,cAAa;EACb,wBAAe;MAAf,oBAAe;UAAf,gBAAe;EAKX,oBAA4B;EAC5B,mBAA4B;CDhB/B;;AE0BC;EF5BF;ICiBI,oBAA4B;IAC5B,mBAA4B;GDhB/B;CX2rBF;;AajqBG;EF5BF;ICiBI,oBAA4B;IAC5B,mBAA4B;GDhB/B;CXksBF;;AaxqBG;EF5BF;ICiBI,oBAA4B;IAC5B,mBAA4B;GDhB/B;CXysBF;;Aa/qBG;EF5BF;ICiBI,oBAA4B;IAC5B,mBAA4B;GDhB/B;CXgtBF;;AW5sBC;EACE,gBAAe;EACf,eAAc;CAOf;;AATD;;EAMI,iBAAgB;EAChB,gBAAe;CAChB;;AGnCH;;;;;;EACE,mBAAkB;EAClB,YAAW;EACX,gBAAe;EFsBb,oBAA4B;EAC5B,mBAA4B;CEpB/B;;AD2CC;ECjDF;;;;;;IFyBI,oBAA4B;IAC5B,mBAA4B;GEpB/B;CdqwBF;;Aa1tBG;ECjDF;;;;;;IFyBI,oBAA4B;IAC5B,mBAA4B;GEpB/B;CdixBF;;AatuBG;ECjDF;;;;;;IFyBI,oBAA4B;IAC5B,mBAA4B;GEpB/B;Cd6xBF;;AalvBG;ECjDF;;;;;;IFyBI,oBAA4B;IAC5B,mBAA4B;GEpB/B;CdyyBF;;AcvxBK;EACE,sBAAa;MAAb,2BAAa;UAAb,cAAa;EACb,oBAAY;EAAZ,qBAAY;MAAZ,qBAAY;UAAZ,aAAY;EACZ,gBAAe;CAChB;;AACD;EACE,oBAAc;EAAd,uBAAc;MAAd,mBAAc;UAAd,eAAc;EACd,YAAW;CACZ;;AAGC;EF2BN,iBAAmC;CEzB5B;;AAFD;EF2BN,kBAAmC;CEzB5B;;AAFD;EF2BN,WAAmC;CEzB5B;;AAFD;EF2BN,kBAAmC;CEzB5B;;AAFD;EF2BN,kBAAmC;CEzB5B;;AAFD;EF2BN,WAAmC;CEzB5B;;AAFD;EF2BN,kBAAmC;CEzB5B;;AAFD;EF2BN,kBAAmC;CEzB5B;;AAFD;EF2BN,WAAmC;CEzB5B;;AAFD;EF2BN,kBAAmC;CEzB5B;;AAFD;EF2BN,kBAAmC;CEzB5B;;AAFD;EF2BN,YAAmC;CEzB5B;;AAKC;EFgCR,YAAuD;CE9B9C;;AAFD;EFgCR,iBAAiD;CE9BxC;;AAFD;EFgCR,kBAAiD;CE9BxC;;AAFD;EFgCR,WAAiD;CE9BxC;;AAFD;EFgCR,kBAAiD;CE9BxC;;AAFD;EFgCR,kBAAiD;CE9BxC;;AAFD;EFgCR,WAAiD;CE9BxC;;AAFD;EFgCR,kBAAiD;CE9BxC;;AAFD;EFgCR,kBAAiD;CE9BxC;;AAFD;EFgCR,WAAiD;CE9BxC;;AAFD;EFgCR,kBAAiD;CE9BxC;;AAFD;EFgCR,kBAAiD;CE9BxC;;AAFD;EFgCR,YAAiD;CE9BxC;;AAFD;EF4BR,WAAsD;CE1B7C;;AAFD;EF4BR,gBAAgD;CE1BvC;;AAFD;EF4BR,iBAAgD;CE1BvC;;AAFD;EF4BR,UAAgD;CE1BvC;;AAFD;EF4BR,iBAAgD;CE1BvC;;AAFD;EF4BR,iBAAgD;CE1BvC;;AAFD;EF4BR,UAAgD;CE1BvC;;AAFD;EF4BR,iBAAgD;CE1BvC;;AAFD;EF4BR,iBAAgD;CE1BvC;;AAFD;EF4BR,UAAgD;CE1BvC;;AAFD;EF4BR,iBAAgD;CE1BvC;;AAFD;EF4BR,iBAAgD;CE1BvC;;AAFD;EF4BR,WAAgD;CE1BvC;;AAOD;EFeR,uBAAyC;CEbhC;;AAFD;EFeR,wBAAyC;CEbhC;;AAFD;EFeR,iBAAyC;CEbhC;;AAFD;EFeR,wBAAyC;CEbhC;;AAFD;EFeR,wBAAyC;CEbhC;;AAFD;EFeR,iBAAyC;CEbhC;;AAFD;EFeR,wBAAyC;CEbhC;;AAFD;EFeR,wBAAyC;CEbhC;;AAFD;EFeR,iBAAyC;CEbhC;;AAFD;EFeR,wBAAyC;CEbhC;;AAFD;EFeR,wBAAyC;CEbhC;;ADJP;ECzBE;IACE,sBAAa;QAAb,2BAAa;YAAb,cAAa;IACb,oBAAY;IAAZ,qBAAY;QAAZ,qBAAY;YAAZ,aAAY;IACZ,gBAAe;GAChB;EACD;IACE,oBAAc;IAAd,uBAAc;QAAd,mBAAc;YAAd,eAAc;IACd,YAAW;GACZ;EAGC;IF2BN,iBAAmC;GEzB5B;EAFD;IF2BN,kBAAmC;GEzB5B;EAFD;IF2BN,WAAmC;GEzB5B;EAFD;IF2BN,kBAAmC;GEzB5B;EAFD;IF2BN,kBAAmC;GEzB5B;EAFD;IF2BN,WAAmC;GEzB5B;EAFD;IF2BN,kBAAmC;GEzB5B;EAFD;IF2BN,kBAAmC;GEzB5B;EAFD;IF2BN,WAAmC;GEzB5B;EAFD;IF2BN,kBAAmC;GEzB5B;EAFD;IF2BN,kBAAmC;GEzB5B;EAFD;IF2BN,YAAmC;GEzB5B;EAKC;IFgCR,YAAuD;GE9B9C;EAFD;IFgCR,iBAAiD;GE9BxC;EAFD;IFgCR,kBAAiD;GE9BxC;EAFD;IFgCR,WAAiD;GE9BxC;EAFD;IFgCR,kBAAiD;GE9BxC;EAFD;IFgCR,kBAAiD;GE9BxC;EAFD;IFgCR,WAAiD;GE9BxC;EAFD;IFgCR,kBAAiD;GE9BxC;EAFD;IFgCR,kBAAiD;GE9BxC;EAFD;IFgCR,WAAiD;GE9BxC;EAFD;IFgCR,kBAAiD;GE9BxC;EAFD;IFgCR,kBAAiD;GE9BxC;EAFD;IFgCR,YAAiD;GE9BxC;EAFD;IF4BR,WAAsD;GE1B7C;EAFD;IF4BR,gBAAgD;GE1BvC;EAFD;IF4BR,iBAAgD;GE1BvC;EAFD;IF4BR,UAAgD;GE1BvC;EAFD;IF4BR,iBAAgD;GE1BvC;EAFD;IF4BR,iBAAgD;GE1BvC;EAFD;IF4BR,UAAgD;GE1BvC;EAFD;IF4BR,iBAAgD;GE1BvC;EAFD;IF4BR,iBAAgD;GE1BvC;EAFD;IF4BR,UAAgD;GE1BvC;EAFD;IF4BR,iBAAgD;GE1BvC;EAFD;IF4BR,iBAAgD;GE1BvC;EAFD;IF4BR,WAAgD;GE1BvC;EAOD;IFeR,gBAAyC;GEbhC;EAFD;IFeR,uBAAyC;GEbhC;EAFD;IFeR,wBAAyC;GEbhC;EAFD;IFeR,iBAAyC;GEbhC;EAFD;IFeR,wBAAyC;GEbhC;EAFD;IFeR,wBAAyC;GEbhC;EAFD;IFeR,iBAAyC;GEbhC;EAFD;IFeR,wBAAyC;GEbhC;EAFD;IFeR,wBAAyC;GEbhC;EAFD;IFeR,iBAAyC;GEbhC;EAFD;IFeR,wBAAyC;GEbhC;EAFD;IFeR,wBAAyC;GEbhC;Cd2mCV;;Aa/mCG;ECzBE;IACE,sBAAa;QAAb,2BAAa;YAAb,cAAa;IACb,oBAAY;IAAZ,qBAAY;QAAZ,qBAAY;YAAZ,aAAY;IACZ,gBAAe;GAChB;EACD;IACE,oBAAc;IAAd,uBAAc;QAAd,mBAAc;YAAd,eAAc;IACd,YAAW;GACZ;EAGC;IF2BN,iBAAmC;GEzB5B;EAFD;IF2BN,kBAAmC;GEzB5B;EAFD;IF2BN,WAAmC;GEzB5B;EAFD;IF2BN,kBAAmC;GEzB5B;EAFD;IF2BN,kBAAmC;GEzB5B;EAFD;IF2BN,WAAmC;GEzB5B;EAFD;IF2BN,kBAAmC;GEzB5B;EAFD;IF2BN,kBAAmC;GEzB5B;EAFD;IF2BN,WAAmC;GEzB5B;EAFD;IF2BN,kBAAmC;GEzB5B;EAFD;IF2BN,kBAAmC;GEzB5B;EAFD;IF2BN,YAAmC;GEzB5B;EAKC;IFgCR,YAAuD;GE9B9C;EAFD;IFgCR,iBAAiD;GE9BxC;EAFD;IFgCR,kBAAiD;GE9BxC;EAFD;IFgCR,WAAiD;GE9BxC;EAFD;IFgCR,kBAAiD;GE9BxC;EAFD;IFgCR,kBAAiD;GE9BxC;EAFD;IFgCR,WAAiD;GE9BxC;EAFD;IFgCR,kBAAiD;GE9BxC;EAFD;IFgCR,kBAAiD;GE9BxC;EAFD;IFgCR,WAAiD;GE9BxC;EAFD;IFgCR,kBAAiD;GE9BxC;EAFD;IFgCR,kBAAiD;GE9BxC;EAFD;IFgCR,YAAiD;GE9BxC;EAFD;IF4BR,WAAsD;GE1B7C;EAFD;IF4BR,gBAAgD;GE1BvC;EAFD;IF4BR,iBAAgD;GE1BvC;EAFD;IF4BR,UAAgD;GE1BvC;EAFD;IF4BR,iBAAgD;GE1BvC;EAFD;IF4BR,iBAAgD;GE1BvC;EAFD;IF4BR,UAAgD;GE1BvC;EAFD;IF4BR,iBAAgD;GE1BvC;EAFD;IF4BR,iBAAgD;GE1BvC;EAFD;IF4BR,UAAgD;GE1BvC;EAFD;IF4BR,iBAAgD;GE1BvC;EAFD;IF4BR,iBAAgD;GE1BvC;EAFD;IF4BR,WAAgD;GE1BvC;EAOD;IFeR,gBAAyC;GEbhC;EAFD;IFeR,uBAAyC;GEbhC;EAFD;IFeR,wBAAyC;GEbhC;EAFD;IFeR,iBAAyC;GEbhC;EAFD;IFeR,wBAAyC;GEbhC;EAFD;IFeR,wBAAyC;GEbhC;EAFD;IFeR,iBAAyC;GEbhC;EAFD;IFeR,wBAAyC;GEbhC;EAFD;IFeR,wBAAyC;GEbhC;EAFD;IFeR,iBAAyC;GEbhC;EAFD;IFeR,wBAAyC;GEbhC;EAFD;IFeR,wBAAyC;GEbhC;Cd6wCV;;AajxCG;ECzBE;IACE,sBAAa;QAAb,2BAAa;YAAb,cAAa;IACb,oBAAY;IAAZ,qBAAY;QAAZ,qBAAY;YAAZ,aAAY;IACZ,gBAAe;GAChB;EACD;IACE,oBAAc;IAAd,uBAAc;QAAd,mBAAc;YAAd,eAAc;IACd,YAAW;GACZ;EAGC;IF2BN,iBAAmC;GEzB5B;EAFD;IF2BN,kBAAmC;GEzB5B;EAFD;IF2BN,WAAmC;GEzB5B;EAFD;IF2BN,kBAAmC;GEzB5B;EAFD;IF2BN,kBAAmC;GEzB5B;EAFD;IF2BN,WAAmC;GEzB5B;EAFD;IF2BN,kBAAmC;GEzB5B;EAFD;IF2BN,kBAAmC;GEzB5B;EAFD;IF2BN,WAAmC;GEzB5B;EAFD;IF2BN,kBAAmC;GEzB5B;EAFD;IF2BN,kBAAmC;GEzB5B;EAFD;IF2BN,YAAmC;GEzB5B;EAKC;IFgCR,YAAuD;GE9B9C;EAFD;IFgCR,iBAAiD;GE9BxC;EAFD;IFgCR,kBAAiD;GE9BxC;EAFD;IFgCR,WAAiD;GE9BxC;EAFD;IFgCR,kBAAiD;GE9BxC;EAFD;IFgCR,kBAAiD;GE9BxC;EAFD;IFgCR,WAAiD;GE9BxC;EAFD;IFgCR,kBAAiD;GE9BxC;EAFD;IFgCR,kBAAiD;GE9BxC;EAFD;IFgCR,WAAiD;GE9BxC;EAFD;IFgCR,kBAAiD;GE9BxC;EAFD;IFgCR,kBAAiD;GE9BxC;EAFD;IFgCR,YAAiD;GE9BxC;EAFD;IF4BR,WAAsD;GE1B7C;EAFD;IF4BR,gBAAgD;GE1BvC;EAFD;IF4BR,iBAAgD;GE1BvC;EAFD;IF4BR,UAAgD;GE1BvC;EAFD;IF4BR,iBAAgD;GE1BvC;EAFD;IF4BR,iBAAgD;GE1BvC;EAFD;IF4BR,UAAgD;GE1BvC;EAFD;IF4BR,iBAAgD;GE1BvC;EAFD;IF4BR,iBAAgD;GE1BvC;EAFD;IF4BR,UAAgD;GE1BvC;EAFD;IF4BR,iBAAgD;GE1BvC;EAFD;IF4BR,iBAAgD;GE1BvC;EAFD;IF4BR,WAAgD;GE1BvC;EAOD;IFeR,gBAAyC;GEbhC;EAFD;IFeR,uBAAyC;GEbhC;EAFD;IFeR,wBAAyC;GEbhC;EAFD;IFeR,iBAAyC;GEbhC;EAFD;IFeR,wBAAyC;GEbhC;EAFD;IFeR,wBAAyC;GEbhC;EAFD;IFeR,iBAAyC;GEbhC;EAFD;IFeR,wBAAyC;GEbhC;EAFD;IFeR,wBAAyC;GEbhC;EAFD;IFeR,iBAAyC;GEbhC;EAFD;IFeR,wBAAyC;GEbhC;EAFD;IFeR,wBAAyC;GEbhC;Cd+6CV;;Aan7CG;ECzBE;IACE,sBAAa;QAAb,2BAAa;YAAb,cAAa;IACb,oBAAY;IAAZ,qBAAY;QAAZ,qBAAY;YAAZ,aAAY;IACZ,gBAAe;GAChB;EACD;IACE,oBAAc;IAAd,uBAAc;QAAd,mBAAc;YAAd,eAAc;IACd,YAAW;GACZ;EAGC;IF2BN,iBAAmC;GEzB5B;EAFD;IF2BN,kBAAmC;GEzB5B;EAFD;IF2BN,WAAmC;GEzB5B;EAFD;IF2BN,kBAAmC;GEzB5B;EAFD;IF2BN,kBAAmC;GEzB5B;EAFD;IF2BN,WAAmC;GEzB5B;EAFD;IF2BN,kBAAmC;GEzB5B;EAFD;IF2BN,kBAAmC;GEzB5B;EAFD;IF2BN,WAAmC;GEzB5B;EAFD;IF2BN,kBAAmC;GEzB5B;EAFD;IF2BN,kBAAmC;GEzB5B;EAFD;IF2BN,YAAmC;GEzB5B;EAKC;IFgCR,YAAuD;GE9B9C;EAFD;IFgCR,iBAAiD;GE9BxC;EAFD;IFgCR,kBAAiD;GE9BxC;EAFD;IFgCR,WAAiD;GE9BxC;EAFD;IFgCR,kBAAiD;GE9BxC;EAFD;IFgCR,kBAAiD;GE9BxC;EAFD;IFgCR,WAAiD;GE9BxC;EAFD;IFgCR,kBAAiD;GE9BxC;EAFD;IFgCR,kBAAiD;GE9BxC;EAFD;IFgCR,WAAiD;GE9BxC;EAFD;IFgCR,kBAAiD;GE9BxC;EAFD;IFgCR,kBAAiD;GE9BxC;EAFD;IFgCR,YAAiD;GE9BxC;EAFD;IF4BR,WAAsD;GE1B7C;EAFD;IF4BR,gBAAgD;GE1BvC;EAFD;IF4BR,iBAAgD;GE1BvC;EAFD;IF4BR,UAAgD;GE1BvC;EAFD;IF4BR,iBAAgD;GE1BvC;EAFD;IF4BR,iBAAgD;GE1BvC;EAFD;IF4BR,UAAgD;GE1BvC;EAFD;IF4BR,iBAAgD;GE1BvC;EAFD;IF4BR,iBAAgD;GE1BvC;EAFD;IF4BR,UAAgD;GE1BvC;EAFD;IF4BR,iBAAgD;GE1BvC;EAFD;IF4BR,iBAAgD;GE1BvC;EAFD;IF4BR,WAAgD;GE1BvC;EAOD;IFeR,gBAAyC;GEbhC;EAFD;IFeR,uBAAyC;GEbhC;EAFD;IFeR,wBAAyC;GEbhC;EAFD;IFeR,iBAAyC;GEbhC;EAFD;IFeR,wBAAyC;GEbhC;EAFD;IFeR,wBAAyC;GEbhC;EAFD;IFeR,iBAAyC;GEbhC;EAFD;IFeR,wBAAyC;GEbhC;EAFD;IFeR,wBAAyC;GEbhC;EAFD;IFeR,iBAAyC;GEbhC;EAFD;IFeR,wBAAyC;GEbhC;EAFD;IFeR,wBAAyC;GEbhC;CdilDV;;AezoDD;EACE,YAAW;EACX,gBAAe;EACf,oBbqIW;EapIX,8BbqTyC;CahS1C;;AAzBD;;EAQI,iBb8SkC;Ea7SlC,oBAAmB;EACnB,8Bb+F+B;Ca9FhC;;AAXH;EAcI,uBAAsB;EACtB,iCb0F+B;CazFhC;;AAhBH;EAmBI,8BbsF+B;CarFhC;;AApBH;EAuBI,uBbmES;CalEV;;AAQH;;EAGI,gBboRiC;CanRlC;;AAQH;EACE,0Bb4DiC;Ca/ClC;;AAdD;;EAKI,0BbwD+B;CavDhC;;AANH;;EAWM,yBAA8C;CAC/C;;AASL;EAEI,sCbwBS;CavBV;;AAQH;EAGM,uCbYO;CCpFY;;AaNvB;;;EAII,uCdsFO;CcrFR;;AAKH;EAKM,uCAJsC;CbLrB;;AaIvB;;EASQ,uCARoC;CASrC;;AApBP;;;EAII,0BdwoBkC;CcvoBnC;;AAKH;EAKM,0BAJsC;CbLrB;;AaIvB;;EASQ,0BARoC;CASrC;;AApBP;;;EAII,0Bd4oBkC;Cc3oBnC;;AAKH;EAKM,0BAJsC;CbLrB;;AaIvB;;EASQ,0BARoC;CASrC;;AApBP;;;EAII,0BdgpBkC;Cc/oBnC;;AAKH;EAKM,0BAJsC;CbLrB;;AaIvB;;EASQ,0BARoC;CASrC;;AApBP;;;EAII,0BdqpBkC;CcppBnC;;AAKH;EAKM,0BAJsC;CbLrB;;AaIvB;;EASQ,0BARoC;CASrC;;ADiFT;EAEI,YbdS;EaeT,0BbH+B;CaIhC;;AAGH;EAEI,ebR+B;EaS/B,0BbP+B;CaQhC;;AAGH;EACE,Yb3BW;Ea4BX,0BbhBiC;CayClC;;AA3BD;;;EAOI,sBb6MqD;Ca5MtD;;AARH;EAWI,UAAS;CACV;;AAZH;EAgBM,4Cb1CO;Ca2CR;;AAjBL;EAuBQ,6CbjDK;CCnFY;;AU0DrB;EEuFJ;IAEI,eAAc;IACd,YAAW;IACX,iBAAgB;IAChB,6CAA4C;GAO/C;EAZD;IASM,UAAS;GACV;CfqpDJ;;AiBrzDD;EACE,eAAc;EACd,YAAW;EAGX,qBf0U8B;EezU9B,gBf8OmB;Ee7OnB,kBfyU8B;EexU9B,ef6FiC;Ee5FjC,uBf+EW;Ee7EX,uBAAsB;EACtB,qCAA4B;UAA5B,6BAA4B;EAC5B,sCf4EW;EevET,uBf4M2B;EO/NzB,yFP6ZqF;EO7ZrF,iFP6ZqF;EO7ZrF,4EP6ZqF;EO7ZrF,yEP6ZqF;EO7ZrF,+GP6ZqF;CetW1F;;AAtDD;EA6BI,8BAA6B;EAC7B,UAAS;CACV;;ACUD;EACE,ehB2D+B;EgB1D/B,uBhB6CS;EgB5CT,sBhBsWyD;EgBrWzD,cAAa;CAEd;;AD/CH;EAsCI,efgE+B;Ee9D/B,WAAU;CACX;;AAzCH;EAsCI,efgE+B;Ee9D/B,WAAU;CACX;;AAzCH;EAsCI,efgE+B;Ee9D/B,WAAU;CACX;;AAzCH;EAsCI,efgE+B;Ee9D/B,WAAU;CACX;;AAzCH;EAkDI,0BfqD+B;EenD/B,WAAU;CACX;;AAGH;EAGI,4BAAwD;CACzD;;AAJH;EAYI,efiC+B;EehC/B,uBfmBS;CelBV;;AAIH;;EAEE,eAAc;CACf;;AASD;EACE,oCAA2E;EAC3E,uCAA8E;EAC9E,iBAAgB;CACjB;;AAED;EACE,oCAA8E;EAC9E,uCAAiF;EACjF,mBfsJsB;CerJvB;;AAED;EACE,qCAA8E;EAC9E,wCAAiF;EACjF,oBfiJsB;CehJvB;;AASD;EACE,oBf8N+B;Ee7N/B,uBf6N+B;Ee5N/B,iBAAgB;EAChB,gBfiImB;CehIpB;;AAQD;EACE,oBfiN+B;EehN/B,uBfgN+B;Ee/M/B,iBAAgB;EAChB,kBfgN8B;Ee/M9B,0BAAyB;EACzB,oBAAuC;CAOxC;;AAbD;;;;;EAUI,iBAAgB;EAChB,gBAAe;CAChB;;AAYH;;;EACE,wBf8L+B;Ee7L/B,oBfgGsB;Ee/FtB,iBf6L6B;EMtV3B,sBNkO0B;CevE7B;;AAED;;;EAGI,8BAA2D;CAC5D;;AAGH;;;EACE,qBfoL8B;EenL9B,mBfiFsB;EehFtB,iBfmL6B;EM1V3B,sBNiO0B;CexD7B;;AAED;;;EAGI,6BAA2D;CAC5D;;AASH;EACE,oBfiPmC;CehPpC;;AAED;EACE,eAAc;EACd,oBfkO+B;CejOhC;;AAOD;EACE,mBAAkB;EAClB,eAAc;EACd,sBf0N+B;CenNhC;;AAVD;EAOM,efrG6B;CesG9B;;AAIL;EACE,sBfiNiC;EehNjC,iBAAgB;CACjB;;AAED;EACE,mBAAkB;EAClB,oBf4MgC;Ee3MhC,sBf0MiC;CerMlC;;AARD;EAMI,iBAAgB;CACjB;;AAIH;EACE,sBAAqB;CAStB;;AAVD;EAII,uBAAsB;CACvB;;AALH;EAQI,qBf8L+B;Ce7LhC;;AAQH;EACE,oBf4K+B;Ce3KhC;;AAED;;;EAGE,oBAAyC;EACzC,6BAA4B;EAC5B,4CAAqD;EACrD,2CAAwD;UAAxD,mCAAwD;CACzD;;AC3PC;;;;;EAKE,ehBuFY;CgBtFb;;AAGD;;;EAGE,sBhBgFY;CgB3Eb;;AAGD;EACE,ehBuEY;EgBtEZ,0BAAsC;EACtC,sBhBqEY;CgBpEb;;ADsOH;EAII,0QfpMuI;CeqMxI;;ACnQD;;;;;EAKE,ehBqFY;CgBpFb;;AAGD;;;EAGE,sBhB8EY;CgBzEb;;AAGD;EACE,ehBqEY;EgBpEZ,wBAAsC;EACtC,sBhBmEY;CgBlEb;;AD8OH;EAII,mVf5MuI;Ce6MxI;;AC3QD;;;;;EAKE,ehBoFY;CgBnFb;;AAGD;;;EAGE,sBhB6EY;CgBxEb;;AAGD;EACE,ehBoEY;EgBnEZ,0BAAsC;EACtC,sBhBkEY;CgBjEb;;ADsPH;EAII,oTfpNuI;CeqNxI;;AAaH;EACE,qBAAa;EAAb,sBAAa;EAAb,qBAAa;EAAb,cAAa;EACb,+BAAmB;EAAnB,8BAAmB;EAAnB,4BAAmB;MAAnB,wBAAmB;UAAnB,oBAAmB;EACnB,0BAAmB;EAAnB,4BAAmB;MAAnB,uBAAmB;UAAnB,oBAAmB;CAuFpB;;AA1FD;EASI,YAAW;CACZ;;AJzPC;EI+OJ;IAeM,qBAAa;IAAb,sBAAa;IAAb,qBAAa;IAAb,cAAa;IACb,0BAAmB;IAAnB,4BAAmB;QAAnB,uBAAmB;YAAnB,oBAAmB;IACnB,yBAAuB;IAAvB,gCAAuB;QAAvB,sBAAuB;YAAvB,wBAAuB;IACvB,iBAAgB;GACjB;EAnBL;IAuBM,qBAAa;IAAb,sBAAa;IAAb,qBAAa;IAAb,cAAa;IACb,oBAAc;IAAd,uBAAc;QAAd,mBAAc;YAAd,eAAc;IACd,+BAAmB;IAAnB,8BAAmB;IAAnB,4BAAmB;QAAnB,wBAAmB;YAAnB,oBAAmB;IACnB,0BAAmB;IAAnB,4BAAmB;QAAnB,uBAAmB;YAAnB,oBAAmB;IACnB,iBAAgB;GACjB;EA5BL;IAgCM,sBAAqB;IACrB,YAAW;IACX,uBAAsB;GACvB;EAnCL;IAuCM,sBAAqB;GACtB;EAxCL;IA2CM,YAAW;GACZ;EA5CL;IA+CM,iBAAgB;IAChB,uBAAsB;GACvB;EAjDL;IAsDM,qBAAa;IAAb,sBAAa;IAAb,qBAAa;IAAb,cAAa;IACb,0BAAmB;IAAnB,4BAAmB;QAAnB,uBAAmB;YAAnB,oBAAmB;IACnB,yBAAuB;IAAvB,gCAAuB;QAAvB,sBAAuB;YAAvB,wBAAuB;IACvB,YAAW;IACX,cAAa;IACb,iBAAgB;GACjB;EA5DL;IA8DM,gBAAe;GAChB;EA/DL;IAiEM,mBAAkB;IAClB,cAAa;IACb,sBfgE4B;Ie/D5B,eAAc;GACf;EArEL;IAyEM,qBAAa;IAAb,sBAAa;IAAb,qBAAa;IAAb,cAAa;IACb,0BAAmB;IAAnB,4BAAmB;QAAnB,uBAAmB;YAAnB,oBAAmB;IACnB,yBAAuB;IAAvB,gCAAuB;QAAvB,sBAAuB;YAAvB,wBAAuB;IACvB,gBAAe;GAChB;EA7EL;IA+EM,iBAAgB;IAChB,sBAAqB;IACrB,sBfkD4B;IejD5B,4BAA2B;GAC5B;EAnFL;IAuFM,OAAM;GACP;CjBowDJ;;AmB7nED;EACE,sBAAqB;EACrB,oBjBuPyB;EiBtPzB,mBAAkB;EAClB,oBAAmB;EACnB,uBAAsB;EACtB,0BAAiB;KAAjB,uBAAiB;MAAjB,sBAAiB;UAAjB,kBAAiB;EACjB,8BAAiD;ECqEjD,qBlBmQ8B;EkBlQ9B,gBlBuKmB;EkBtKnB,kBlBkQ8B;EMlV5B,uBNgO2B;EO/NzB,yCPiY8C;EOjY9C,oCPiY8C;EOjY9C,iCPiY8C;CiB/VnD;;AhBjBG;EgBHA,sBAAqB;ChBMpB;;AgBnBL;EAiBI,WAAU;EACV,sDjB4EY;UiB5EZ,8CjB4EY;CiB3Eb;;AAnBH;EAwBI,aAAY;CAEb;;AA1BH;EA8BI,uBAAsB;CAEvB;;AAIH;;EAEE,qBAAoB;CACrB;;AAOD;EC3CE,YlBqFW;EkBpFX,0BlB0Fc;EkBzFd,sBlByFc;CiB9Cf;;AhB3CG;EiBKA,YlB8ES;EkB7ET,0BAX0C;EAY1C,sBAXkC;CjBIb;;AiBSvB;EAMI,qDlB0EU;UkB1EV,6ClB0EU;CkBxEb;;AAGD;EAEE,0BlBmEY;EkBlEZ,sBlBkEY;CkBjEb;;AAED;;EAGE,YlBsDS;EkBrDT,0BAnC0C;EAoC1C,uBAAsB;EACtB,sBApCkC;CAsCnC;;ADUH;EC9CE,elBiGiC;EkBhGjC,uBlBoFW;EkBnFX,mBlBgWmC;CiBlTpC;;AhB9CG;EiBKA,elB0F+B;EkBzF/B,0BAX0C;EAY1C,sBAXkC;CjBIb;;AiBSvB;EAMI,uDlBiV+B;UkBjV/B,+ClBiV+B;CkB/UlC;;AAGD;EAEE,uBlB6DS;EkB5DT,mBlByUiC;CkBxUlC;;AAED;;EAGE,elBkE+B;EkBjE/B,0BAnC0C;EAoC1C,uBAAsB;EACtB,sBApCkC;CAsCnC;;ADaH;ECjDE,YlBqFW;EkBpFX,0BlB2Fc;EkB1Fd,sBlB0Fc;CiBzCf;;AhBjDG;EiBKA,YlB8ES;EkB7ET,0BAX0C;EAY1C,sBAXkC;CjBIb;;AiBSvB;EAMI,sDlB2EU;UkB3EV,8ClB2EU;CkBzEb;;AAGD;EAEE,0BlBoEY;EkBnEZ,sBlBmEY;CkBlEb;;AAED;;EAGE,YlBsDS;EkBrDT,0BAnC0C;EAoC1C,uBAAsB;EACtB,sBApCkC;CAsCnC;;ADgBH;ECpDE,YlBqFW;EkBpFX,0BlByFc;EkBxFd,sBlBwFc;CiBpCf;;AhBpDG;EiBKA,YlB8ES;EkB7ET,0BAX0C;EAY1C,sBAXkC;CjBIb;;AiBSvB;EAMI,qDlByEU;UkBzEV,6ClByEU;CkBvEb;;AAGD;EAEE,0BlBkEY;EkBjEZ,sBlBiEY;CkBhEb;;AAED;;EAGE,YlBsDS;EkBrDT,0BAnC0C;EAoC1C,uBAAsB;EACtB,sBApCkC;CAsCnC;;ADmBH;ECvDE,YlBqFW;EkBpFX,0BlBuFc;EkBtFd,sBlBsFc;CiB/Bf;;AhBvDG;EiBKA,YlB8ES;EkB7ET,0BAX0C;EAY1C,sBAXkC;CjBIb;;AiBSvB;EAMI,sDlBuEU;UkBvEV,8ClBuEU;CkBrEb;;AAGD;EAEE,0BlBgEY;EkB/DZ,sBlB+DY;CkB9Db;;AAED;;EAGE,YlBsDS;EkBrDT,0BAnC0C;EAoC1C,uBAAsB;EACtB,sBApCkC;CAsCnC;;ADsBH;EC1DE,YlBqFW;EkBpFX,0BlBsFc;EkBrFd,sBlBqFc;CiB3Bf;;AhB1DG;EiBKA,YlB8ES;EkB7ET,0BAX0C;EAY1C,sBAXkC;CjBIb;;AiBSvB;EAMI,qDlBsEU;UkBtEV,6ClBsEU;CkBpEb;;AAGD;EAEE,0BlB+DY;EkB9DZ,sBlB8DY;CkB7Db;;AAED;;EAGE,YlBsDS;EkBrDT,0BAnC0C;EAoC1C,uBAAsB;EACtB,sBApCkC;CAsCnC;;AD2BH;ECvBE,elBmDc;EkBlDd,8BAA6B;EAC7B,uBAAsB;EACtB,sBlBgDc;CiB1Bf;;AhB/DG;EiB4CA,YlBuCS;EkBtCT,0BlB4CY;EkB3CZ,sBlB2CY;CCzFS;;AiBiDvB;EAEE,qDlBsCY;UkBtCZ,6ClBsCY;CkBrCb;;AAED;EAEE,elBiCY;EkBhCZ,8BAA6B;CAC9B;;AAED;;EAGE,YlBoBS;EkBnBT,0BlByBY;EkBxBZ,sBlBwBY;CkBvBb;;ADFH;EC1BE,YlB0TmC;EkBzTnC,8BAA6B;EAC7B,uBAAsB;EACtB,mBlBuTmC;CiB9RpC;;AhBlEG;EiB4CA,elBmD+B;EkBlD/B,uBlBmTiC;EkBlTjC,mBlBkTiC;CChWZ;;AiBiDvB;EAEE,uDlB6SiC;UkB7SjC,+ClB6SiC;CkB5SlC;;AAED;EAEE,YlBwSiC;EkBvSjC,8BAA6B;CAC9B;;AAED;;EAGE,elBgC+B;EkB/B/B,uBlBgSiC;EkB/RjC,mBlB+RiC;CkB9RlC;;ADCH;EC7BE,elBoDc;EkBnDd,8BAA6B;EAC7B,uBAAsB;EACtB,sBlBiDc;CiBrBf;;AhBrEG;EiB4CA,YlBuCS;EkBtCT,0BlB6CY;EkB5CZ,sBlB4CY;CC1FS;;AiBiDvB;EAEE,sDlBuCY;UkBvCZ,8ClBuCY;CkBtCb;;AAED;EAEE,elBkCY;EkBjCZ,8BAA6B;CAC9B;;AAED;;EAGE,YlBoBS;EkBnBT,0BlB0BY;EkBzBZ,sBlByBY;CkBxBb;;ADIH;EChCE,elBkDc;EkBjDd,8BAA6B;EAC7B,uBAAsB;EACtB,sBlB+Cc;CiBhBf;;AhBxEG;EiB4CA,YlBuCS;EkBtCT,0BlB2CY;EkB1CZ,sBlB0CY;CCxFS;;AiBiDvB;EAEE,qDlBqCY;UkBrCZ,6ClBqCY;CkBpCb;;AAED;EAEE,elBgCY;EkB/BZ,8BAA6B;CAC9B;;AAED;;EAGE,YlBoBS;EkBnBT,0BlBwBY;EkBvBZ,sBlBuBY;CkBtBb;;ADOH;ECnCE,elBgDc;EkB/Cd,8BAA6B;EAC7B,uBAAsB;EACtB,sBlB6Cc;CiBXf;;AhB3EG;EiB4CA,YlBuCS;EkBtCT,0BlByCY;EkBxCZ,sBlBwCY;CCtFS;;AiBiDvB;EAEE,sDlBmCY;UkBnCZ,8ClBmCY;CkBlCb;;AAED;EAEE,elB8BY;EkB7BZ,8BAA6B;CAC9B;;AAED;;EAGE,YlBoBS;EkBnBT,0BlBsBY;EkBrBZ,sBlBqBY;CkBpBb;;ADUH;ECtCE,elB+Cc;EkB9Cd,8BAA6B;EAC7B,uBAAsB;EACtB,sBlB4Cc;CiBPf;;AhB9EG;EiB4CA,YlBuCS;EkBtCT,0BlBwCY;EkBvCZ,sBlBuCY;CCrFS;;AiBiDvB;EAEE,qDlBkCY;UkBlCZ,6ClBkCY;CkBjCb;;AAED;EAEE,elB6BY;EkB5BZ,8BAA6B;CAC9B;;AAED;;EAGE,YlBoBS;EkBnBT,0BlBqBY;EkBpBZ,sBlBoBY;CkBnBb;;ADoBH;EACE,oBjB6JyB;EiB5JzB,ejBCc;EiBAd,iBAAgB;CA6BjB;;AAhCD;EASI,8BAA6B;CAE9B;;AAXH;EAeI,0BAAyB;CAC1B;;AhBtGC;EgBwGA,0BAAyB;ChBxGJ;;AAWrB;EgBgGA,ejBqD4C;EiBpD5C,2BjBqD6B;EiBpD7B,8BAA6B;ChB/F5B;;AgBwEL;EA0BI,ejBf+B;CiBoBhC;;AhB1GC;EgBwGE,sBAAqB;ChBrGtB;;AgB+GL;ECtDE,qBlB2Q8B;EkB1Q9B,mBlBwKsB;EkBvKtB,iBlB2I0B;EM3NxB,sBNiO0B;CiB3F7B;;AAED;EC1DE,wBlBuQ+B;EkBtQ/B,oBlByKsB;EkBxKtB,iBlB4I0B;EM5NxB,sBNkO0B;CiBxF7B;;AAOD;EACE,eAAc;EACd,YAAW;CACZ;;AAGD;EACE,mBjBmOoC;CiBlOrC;;AAGD;;;EAII,YAAW;CACZ;;AErKH;EACE,WAAU;EZIN,yCPyOsC;EOzOtC,oCPyOsC;EOzOtC,iCPyOsC;CmBvO3C;;AAPD;EAKI,WAAU;CACX;;AAGH;EACE,cAAa;CAId;;AALD;EAGI,eAAc;CACf;;AAGH;EAEI,mBAAkB;CACnB;;AAGH;EAEI,yBAAwB;CACzB;;AAGH;EACE,mBAAkB;EAClB,UAAS;EACT,iBAAgB;EZ1BZ,sCP0OmC;EO1OnC,iCP0OmC;EO1OnC,8BP0OmC;CmB9MxC;;AChCD;;EAEE,mBAAkB;CACnB;;AAED;EAGI,sBAAqB;EACrB,SAAQ;EACR,UAAS;EACT,mBpB+NyB;EoB9NzB,uBAAsB;EACtB,YAAW;EACX,wBAA8B;EAC9B,sCAA4C;EAC5C,qCAA2C;CAC5C;;AAZH;EAeI,eAAc;CACf;;AAGH;EAGM,cAAa;EACb,2BAAiC;CAClC;;AAKL;EACE,mBAAkB;EAClB,UAAS;EACT,QAAO;EACP,cpBsgB8B;EoBrgB9B,cAAa;EACb,YAAW;EACX,iBpBseoC;EoBrepC,kBAA8B;EAC9B,qBAAgC;EAChC,gBpB6MmB;EoB5MnB,epB4DiC;EoB3DjC,iBAAgB;EAChB,iBAAgB;EAChB,uBpB6CW;EoB5CX,qCAA4B;UAA5B,6BAA4B;EAC5B,sCpB4CW;EM3FT,uBNgO2B;CoB9K9B;;AAGD;ECpDE,UAAS;EACT,iBAAuB;EACvB,iBAAgB;EAChB,8BrBqGiC;CoBlDlC;;AAKD;EACE,eAAc;EACd,YAAW;EACX,wBpBgeqC;EoB/drC,YAAW;EACX,oBpB0LyB;EoBzLzB,epBoCiC;EoBnCjC,oBAAmB;EACnB,oBAAmB;EACnB,iBAAgB;EAChB,UAAS;CAwBV;;AnB5EG;EmBuDA,epB6cmD;EoB5cnD,sBAAqB;EACrB,0BpB+B+B;CCrF9B;;AmBuCL;EAoBI,YpBUS;EoBTT,sBAAqB;EACrB,0BpBcY;CoBbb;;AAvBH;EA2BI,epBiB+B;EoBhB/B,8BAA6B;CAK9B;;AAIH;EAGI,eAAc;CACf;;AAJH;EAQI,WAAU;CACX;;AAOH;EACE,SAAQ;EACR,WAAU;CACX;;AAED;EACE,YAAW;EACX,QAAO;CACR;;AAGD;EACE,eAAc;EACd,uBpBiaqC;EoBharC,iBAAgB;EAChB,oBpBwHsB;EoBvHtB,epBzBiC;EoB0BjC,oBAAmB;CACpB;;AAMD;EAGI,UAAS;EACT,aAAY;EACZ,wBpBgYoC;CoB/XrC;;AEhJH;;EAEE,mBAAkB;EAClB,4BAAoB;EAApB,6BAAoB;EAApB,4BAAoB;EAApB,qBAAoB;EACpB,uBAAsB;CA0BvB;;AA9BD;;EAOI,mBAAkB;EAClB,oBAAc;EAAd,uBAAc;MAAd,mBAAc;UAAd,eAAc;EACd,iBAAgB;CAYjB;;AArBH;;EAcM,WAAU;CrBNS;;AqBRzB;;;;EAmBM,WAAU;CACX;;AApBL;;;;;;;;EA4BI,kBtBmMc;CsBlMf;;AAIH;EACE,qBAAa;EAAb,sBAAa;EAAb,qBAAa;EAAb,cAAa;EACb,wBAAe;MAAf,oBAAe;UAAf,gBAAe;EACf,wBAA2B;EAA3B,oCAA2B;MAA3B,qBAA2B;UAA3B,4BAA2B;CAK5B;;AARD;EAMI,YAAW;CACZ;;AAGH;EACE,iBAAgB;CACjB;;AAGD;EACE,eAAc;CAKf;;AAND;EhBlCI,2BgBsC8B;EhBrC9B,8BgBqC8B;CAC/B;;AAGH;;EhB5BI,0BgB8B2B;EhB7B3B,6BgB6B2B;CAC9B;;AAGD;EACE,YAAW;CACZ;;AACD;EACE,iBAAgB;CACjB;;AACD;;EhBtDI,2BgByD8B;EhBxD9B,8BgBwD8B;CAC/B;;AAEH;EhB9CI,0BgB+C2B;EhB9C3B,6BgB8C2B;CAC9B;;AAeD;EACE,uBAAyC;EACzC,sBAAwC;CAKzC;;AAPD;EAKI,eAAc;CACf;;AAGH;EACE,wBAA4C;EAC5C,uBAA2C;CAC5C;;AAED;EACE,uBAA4C;EAC5C,sBAA2C;CAC5C;;AAmBD;EACE,4BAAoB;EAApB,6BAAoB;EAApB,4BAAoB;EAApB,qBAAoB;EACpB,6BAAsB;EAAtB,8BAAsB;EAAtB,+BAAsB;MAAtB,2BAAsB;UAAtB,uBAAsB;EACtB,yBAAuB;EAAvB,gCAAuB;MAAvB,sBAAuB;UAAvB,wBAAuB;EACvB,yBAAuB;EAAvB,gCAAuB;MAAvB,sBAAuB;UAAvB,wBAAuB;CAcxB;;AAlBD;;EAQI,YAAW;CACZ;;AATH;;;;EAeI,iBtBiFc;EsBhFd,eAAc;CACf;;AAGH;EAEI,iBAAgB;CACjB;;AAHH;EhB9HI,8BgBmI+B;EhBlI/B,6BgBkI+B;CAChC;;AANH;EhB5II,0BgBoJ4B;EhBnJ5B,2BgBmJ4B;CAC7B;;AAEH;EACE,iBAAgB;CACjB;;AACD;;EhB5II,8BgB+I+B;EhB9I/B,6BgB8I+B;CAChC;;AAEH;EhBhKI,0BgBiK0B;EhBhK1B,2BgBgK0B;CAC7B;;AxBosFD;;;;EwBhrFM,mBAAkB;EAClB,uBAAmB;EACnB,qBAAoB;CACrB;;AC/LL;EACE,mBAAkB;EAClB,qBAAa;EAAb,sBAAa;EAAb,qBAAa;EAAb,cAAa;EACb,YAAW;CAkBZ;;AArBD;EAQI,mBAAkB;EAClB,WAAU;EACV,oBAAc;EAAd,uBAAc;MAAd,mBAAc;UAAd,eAAc;EAGd,UAAS;EACT,iBAAgB;CAMjB;;AApBH;EAkBM,WAAU;CtBmCX;;AsB9BL;;;EAIE,qBAAa;EAAb,sBAAa;EAAb,qBAAa;EAAb,cAAa;EACb,0BAAmB;EAAnB,4BAAmB;MAAnB,uBAAmB;UAAnB,oBAAmB;CAKpB;;AAVD;;;EjBvBI,iBiB+BwB;CACzB;;AAGH;;EAEE,oBAAmB;EACnB,uBAAsB;CACvB;;AAwBD;EACE,qBvBiR8B;EuBhR9B,iBAAgB;EAChB,gBvBoLmB;EuBnLnB,oBvBwLyB;EuBvLzB,kBvB8Q8B;EuB7Q9B,evBkCiC;EuBjCjC,mBAAkB;EAClB,0BvBkCiC;EuBjCjC,sCvBmBW;EM3FT,uBNgO2B;CuBjI9B;;AAhCD;;;EAcI,wBvBwQ6B;EuBvQ7B,oBvB0KoB;EMxPpB,sBNkO0B;CuBlJ3B;;AAjBH;;;EAoBI,qBvBsQ4B;EuBrQ5B,mBvBmKoB;EMvPpB,sBNiO0B;CuB3I3B;;AAvBH;;EA6BI,cAAa;CACd;;AASH;;;;;;;EjBzFI,2BiBgG4B;EjB/F5B,8BiB+F4B;CAC/B;;AACD;EACE,gBAAe;CAChB;;AACD;;;;;;;EjBvFI,0BiB8F2B;EjB7F3B,6BiB6F2B;CAC9B;;AACD;EACE,eAAc;CACf;;AAMD;EACE,mBAAkB;EAGlB,aAAY;EACZ,oBAAmB;CAmCpB;;AAxCD;EAUI,mBAAkB;CAUnB;;AApBH;EAaM,kBvB8EY;CuB7Eb;;AAdL;EAkBM,WAAU;CtBhGX;;AsB8EL;;EA0BM,mBvBiEY;CuBhEb;;AA3BL;;EAgCM,WAAU;EACV,kBvB0DY;CuBrDb;;AAtCL;;;;EAoCQ,WAAU;CtBlHb;;AuB9CL;EACE,mBAAkB;EAClB,4BAAoB;EAApB,6BAAoB;EAApB,4BAAoB;EAApB,qBAAoB;EACpB,mBAAsC;EACtC,qBxBoa8B;EwBna9B,mBxBqa4B;CwBpa7B;;AAED;EACE,mBAAkB;EAClB,YAAW;EACX,WAAU;CA4BX;;AA/BD;EAMI,YxBqES;EwBpET,0BxB0EY;CwBxEb;;AATH;EAaI,sDxBoEY;UwBpEZ,8CxBoEY;CwBnEb;;AAdH;EAiBI,YxB0DS;EwBzDT,0BxBiaqE;CwB/ZtE;;AApBH;EAwBM,0BxBkE6B;CwBjE9B;;AAzBL;EA4BM,exB6D6B;CwB5D9B;;AAQL;EACE,mBAAkB;EAClB,aAA+D;EAC/D,QAAO;EACP,eAAc;EACd,YxB0XwC;EwBzXxC,axByXwC;EwBxXxC,qBAAoB;EACpB,0BAAiB;KAAjB,uBAAiB;MAAjB,sBAAiB;UAAjB,kBAAiB;EACjB,uBxBuXwC;EwBtXxC,6BAA4B;EAC5B,mCAAkC;EAClC,iCxBqX2C;UwBrX3C,yBxBqX2C;CwBnX5C;;AAMD;ElBxEI,uBNgO2B;CwBrJ5B;;AAHH;EAMI,2NxBbuI;CwBcxI;;AAPH;EAUI,0BxBcY;EwBbZ,wKxBlBuI;CwBoBxI;;AAOH;EAEI,mBxB+WqB;CwB9WtB;;AAHH;EAMI,qKxBjCuI;CwBkCxI;;AASH;EACE,qBAAa;EAAb,sBAAa;EAAb,qBAAa;EAAb,cAAa;EACb,6BAAsB;EAAtB,8BAAsB;EAAtB,+BAAsB;MAAtB,2BAAsB;UAAtB,uBAAsB;CASvB;;AAXD;EAKI,uBxB+T4B;CwB1T7B;;AAVH;EAQM,eAAc;CACf;;AAWL;EACE,sBAAqB;EACrB,gBAAe;EAEf,4BAAwD;EACxD,2CxB4UuC;EwB3UvC,kBxB4M8B;EwB3M9B,exBhCiC;EwBiCjC,uBAAsB;EACtB,oNAAsG;EACtG,kCxB8UoC;UwB9UpC,0BxB8UoC;EwB7UpC,sCxBhDW;EM3FT,uBNgO2B;EwBnF7B,yBAAgB;KAAhB,sBAAgB;UAAhB,iBAAgB;CA2BjB;;AAxCD;EAgBI,sBxB+U2D;EwB9U3D,cAAa;CAYd;;AA7BH;EA0BM,exBnD6B;EwBoD7B,uBxBjEO;CwBkER;;AA5BL;EAgCI,exBxD+B;EwByD/B,0BxBxD+B;CwByDhC;;AAlCH;EAsCI,WAAU;CACX;;AAGH;EACE,sBxBqSwC;EwBpSxC,yBxBoSwC;EwBnSxC,exBqT+B;CwB/ShC;;AAOD;EACE,mBAAkB;EAClB,sBAAqB;EACrB,gBAAe;EACf,exBsSmC;EwBrSnC,iBAAgB;CACjB;;AAED;EACE,iBxBkSkC;EwBjSlC,gBAAe;EACf,exB+RmC;EwB9RnC,UAAS;EACT,WAAU;CAKX;;AAED;EACE,mBAAkB;EAClB,OAAM;EACN,SAAQ;EACR,QAAO;EACP,WAAU;EACV,exBgRmC;EwB/QnC,qBxBmR8B;EwBlR9B,iBxBoR6B;EwBnR7B,exBhHiC;EwBiHjC,qBAAoB;EACpB,0BAAiB;KAAjB,uBAAiB;MAAjB,sBAAiB;UAAjB,kBAAiB;EACjB,uBxBhIW;EwBiIX,sCxBhIW;EM3FT,uBNgO2B;CwB0B9B;;AA5CD;EAmBM,0BxBoRkB;CwBnRnB;;AApBL;EAwBI,mBAAkB;EAClB,UxBTc;EwBUd,YxBVc;EwBWd,axBXc;EwBYd,WAAU;EACV,eAAc;EACd,exBwPiC;EwBvPjC,qBxB2P4B;EwB1P5B,iBxB4P2B;EwB3P3B,exBxI+B;EwByI/B,0BxBvI+B;EwBwI/B,sCxBtJS;EM3FT,mCkBkPgF;CACjF;;AArCH;EAyCM,kBxBiQU;CwBhQX;;ACvPL;EACE,qBAAa;EAAb,sBAAa;EAAb,qBAAa;EAAb,cAAa;EACb,wBAAe;MAAf,oBAAe;UAAf,gBAAe;EACf,gBAAe;EACf,iBAAgB;EAChB,iBAAgB;CACjB;;AAED;EACE,eAAc;EACd,qBzB2iBkC;CyBjiBnC;;AxBHG;EwBJA,sBAAqB;CxBOpB;;AwBZL;EAUI,ezBqF+B;CyBpFhC;;AAOH;EACE,8BzB8hBgD;CyB5fjD;;AAnCD;EAII,oBzB+Lc;CyB9Lf;;AALH;EAQI,8BAAgD;EnB7BhD,gCN0N2B;EMzN3B,iCNyN2B;CyBjL5B;;AApBH;EAYM,mCzBmhB4C;CCriB7C;;AwBML;EAgBM,ezB6D6B;EyB5D7B,8BAA6B;EAC7B,0BAAyB;CAC1B;;AAnBL;;EAwBI,ezBoD+B;EyBnD/B,uBzBsCS;EyBrCT,6BzBqCS;CyBpCV;;AA3BH;EA+BI,iBzBoKc;EMxNd,0BmBsD4B;EnBrD5B,2BmBqD4B;CAC7B;;AAQH;EnBrEI,uBNgO2B;CyBlJ5B;;AATH;;EAMM,YzBeO;EyBdP,0BzBoBU;CyBnBX;;AASL;EAEI,oBAAc;EAAd,uBAAc;MAAd,mBAAc;UAAd,eAAc;EACd,mBAAkB;CACnB;;AAGH;EAEI,sBAAa;MAAb,2BAAa;UAAb,cAAa;EACb,oBAAY;EAAZ,qBAAY;MAAZ,qBAAY;UAAZ,aAAY;EACZ,mBAAkB;CACnB;;AAQH;EAEI,cAAa;CACd;;AAHH;EAKI,eAAc;CACf;;ACnGH;EACE,mBAAkB;EAClB,qBAAa;EAAb,sBAAa;EAAb,qBAAa;EAAb,cAAa;EACb,wBAAe;MAAf,oBAAe;UAAf,gBAAe;EACf,0BAAmB;EAAnB,4BAAmB;MAAnB,uBAAmB;UAAnB,oBAAmB;EACnB,0BAA8B;EAA9B,uCAA8B;MAA9B,uBAA8B;UAA9B,+BAA8B;EAC9B,qB1BqHW;C0BpGZ;;AAvBD;;EAYI,qBAAa;EAAb,sBAAa;EAAb,qBAAa;EAAb,cAAa;EACb,wBAAe;MAAf,oBAAe;UAAf,gBAAe;EACf,0BAAmB;EAAnB,4BAAmB;MAAnB,uBAAmB;UAAnB,oBAAmB;EACnB,0BAA8B;EAA9B,uCAA8B;MAA9B,uBAA8B;UAA9B,+BAA8B;CAO/B;;Af8BC;EepDJ;;IAkBM,YAAW;IACX,gBAAe;IACf,eAAc;GAEjB;C5BgwGF;;A4BxvGD;EACE,sBAAqB;EACrB,uB1BoiB+E;E0BniB/E,0B1BmiB+E;E0BliB/E,mB1ByFW;E0BxFX,mB1BuMsB;E0BtMtB,qBAAoB;EACpB,oBAAmB;CAKpB;;AzBrCG;EyBmCA,sBAAqB;CzBhCpB;;AyByCL;EACE,qBAAa;EAAb,sBAAa;EAAb,qBAAa;EAAb,cAAa;EACb,6BAAsB;EAAtB,8BAAsB;EAAtB,+BAAsB;MAAtB,2BAAsB;UAAtB,uBAAsB;EACtB,gBAAe;EACf,iBAAgB;EAChB,iBAAgB;CAMjB;;AAXD;EAQI,iBAAgB;EAChB,gBAAe;CAChB;;AAQH;EACE,sBAAqB;EACrB,oB1BmemC;E0BlenC,uB1BkemC;C0BjepC;;AAWD;EACE,yBAAgB;MAAhB,8BAAgB;UAAhB,iBAAgB;CACjB;;AAGD;EACE,yB1B+eyC;E0B9ezC,mB1BiJsB;E0BhJtB,eAAc;EACd,wBAAuB;EACvB,8BAAuC;EpBzGrC,uBNgO2B;C0BjH9B;;AzB7FG;EyB2FA,sBAAqB;CzBxFpB;;AyB8FL;EACE,sBAAqB;EACrB,aAAY;EACZ,cAAa;EACb,uBAAsB;EACtB,YAAW;EACX,oCAAmC;EACnC,mCAA0B;UAA1B,2BAA0B;CAC3B;;Af1DG;EemEA;IAIQ,iBAAgB;IAChB,YAAW;GACZ;EANP;;IAWM,iBAAgB;IAChB,gBAAe;GAChB;C5B0tGR;;AavzGG;EegFA;IAiBI,+BAAmB;IAAnB,8BAAmB;IAAnB,4BAAmB;QAAnB,wBAAmB;YAAnB,oBAAmB;IACnB,0BAAiB;QAAjB,sBAAiB;YAAjB,kBAAiB;IACjB,wBAA2B;IAA3B,oCAA2B;QAA3B,qBAA2B;YAA3B,4BAA2B;GA+B9B;EAlDD;IAsBM,+BAAmB;IAAnB,8BAAmB;IAAnB,4BAAmB;QAAnB,wBAAmB;YAAnB,oBAAmB;GAUpB;EAhCL;IAyBQ,mBAAkB;GACnB;EA1BP;IA6BQ,qBAAoB;IACpB,oBAAmB;GACpB;EA/BP;;IAqCM,0BAAiB;QAAjB,sBAAiB;YAAjB,kBAAiB;GAClB;EAtCL;IA0CM,gCAAwB;IAAxB,iCAAwB;IAAxB,gCAAwB;IAAxB,yBAAwB;GACzB;EA3CL;IA+CM,cAAa;GACd;C5BmtGR;;Aat0GG;EemEA;IAIQ,iBAAgB;IAChB,YAAW;GACZ;EANP;;IAWM,iBAAgB;IAChB,gBAAe;GAChB;C5BkwGR;;Aa/1GG;EegFA;IAiBI,+BAAmB;IAAnB,8BAAmB;IAAnB,4BAAmB;QAAnB,wBAAmB;YAAnB,oBAAmB;IACnB,0BAAiB;QAAjB,sBAAiB;YAAjB,kBAAiB;IACjB,wBAA2B;IAA3B,oCAA2B;QAA3B,qBAA2B;YAA3B,4BAA2B;GA+B9B;EAlDD;IAsBM,+BAAmB;IAAnB,8BAAmB;IAAnB,4BAAmB;QAAnB,wBAAmB;YAAnB,oBAAmB;GAUpB;EAhCL;IAyBQ,mBAAkB;GACnB;EA1BP;IA6BQ,qBAAoB;IACpB,oBAAmB;GACpB;EA/BP;;IAqCM,0BAAiB;QAAjB,sBAAiB;YAAjB,kBAAiB;GAClB;EAtCL;IA0CM,gCAAwB;IAAxB,iCAAwB;IAAxB,gCAAwB;IAAxB,yBAAwB;GACzB;EA3CL;IA+CM,cAAa;GACd;C5B2vGR;;Aa92GG;EemEA;IAIQ,iBAAgB;IAChB,YAAW;GACZ;EANP;;IAWM,iBAAgB;IAChB,gBAAe;GAChB;C5B0yGR;;Aav4GG;EegFA;IAiBI,+BAAmB;IAAnB,8BAAmB;IAAnB,4BAAmB;QAAnB,wBAAmB;YAAnB,oBAAmB;IACnB,0BAAiB;QAAjB,sBAAiB;YAAjB,kBAAiB;IACjB,wBAA2B;IAA3B,oCAA2B;QAA3B,qBAA2B;YAA3B,4BAA2B;GA+B9B;EAlDD;IAsBM,+BAAmB;IAAnB,8BAAmB;IAAnB,4BAAmB;QAAnB,wBAAmB;YAAnB,oBAAmB;GAUpB;EAhCL;IAyBQ,mBAAkB;GACnB;EA1BP;IA6BQ,qBAAoB;IACpB,oBAAmB;GACpB;EA/BP;;IAqCM,0BAAiB;QAAjB,sBAAiB;YAAjB,kBAAiB;GAClB;EAtCL;IA0CM,gCAAwB;IAAxB,iCAAwB;IAAxB,gCAAwB;IAAxB,yBAAwB;GACzB;EA3CL;IA+CM,cAAa;GACd;C5BmyGR;;Aat5GG;EemEA;IAIQ,iBAAgB;IAChB,YAAW;GACZ;EANP;;IAWM,iBAAgB;IAChB,gBAAe;GAChB;C5Bk1GR;;Aa/6GG;EegFA;IAiBI,+BAAmB;IAAnB,8BAAmB;IAAnB,4BAAmB;QAAnB,wBAAmB;YAAnB,oBAAmB;IACnB,0BAAiB;QAAjB,sBAAiB;YAAjB,kBAAiB;IACjB,wBAA2B;IAA3B,oCAA2B;QAA3B,qBAA2B;YAA3B,4BAA2B;GA+B9B;EAlDD;IAsBM,+BAAmB;IAAnB,8BAAmB;IAAnB,4BAAmB;QAAnB,wBAAmB;YAAnB,oBAAmB;GAUpB;EAhCL;IAyBQ,mBAAkB;GACnB;EA1BP;IA6BQ,qBAAoB;IACpB,oBAAmB;GACpB;EA/BP;;IAqCM,0BAAiB;QAAjB,sBAAiB;YAAjB,kBAAiB;GAClB;EAtCL;IA0CM,gCAAwB;IAAxB,iCAAwB;IAAxB,gCAAwB;IAAxB,yBAAwB;GACzB;EA3CL;IA+CM,cAAa;GACd;C5B20GR;;A4Bh4GD;EAsBQ,+BAAmB;EAAnB,8BAAmB;EAAnB,4BAAmB;MAAnB,wBAAmB;UAAnB,oBAAmB;EACnB,0BAAiB;MAAjB,sBAAiB;UAAjB,kBAAiB;EACjB,wBAA2B;EAA3B,oCAA2B;MAA3B,qBAA2B;UAA3B,4BAA2B;CA+B9B;;AAvDL;EASY,iBAAgB;EAChB,YAAW;CACZ;;AAXX;;EAgBU,iBAAgB;EAChB,gBAAe;CAChB;;AAlBT;EA2BU,+BAAmB;EAAnB,8BAAmB;EAAnB,4BAAmB;MAAnB,wBAAmB;UAAnB,oBAAmB;CAUpB;;AArCT;EA8BY,mBAAkB;CACnB;;AA/BX;EAkCY,qBAAoB;EACpB,oBAAmB;CACpB;;AApCX;;EA0CU,0BAAiB;MAAjB,sBAAiB;UAAjB,kBAAiB;CAClB;;AA3CT;EA+CU,gCAAwB;EAAxB,iCAAwB;EAAxB,gCAAwB;EAAxB,yBAAwB;CACzB;;AAhDT;EAoDU,cAAa;CACd;;AAYT;EAEI,0B1BvGS;C0B4GV;;AAPH;EAKM,0B1B1GO;CCtER;;AyB2KL;EAWM,0B1BhHO;C0ByHR;;AApBL;EAcQ,0B1BnHK;CCtER;;AyB2KL;EAkBQ,0B1BvHK;C0BwHN;;AAnBP;;;;EA0BM,0B1B/HO;C0BgIR;;AA3BL;EA+BI,0B1BpIS;E0BqIT,iC1BrIS;C0BsIV;;AAjCH;EAoCI,sQ1B+XyR;C0B9X1R;;AArCH;EAwCI,0B1B7IS;C0B8IV;;AAIH;EAEI,a1BrJS;C0B0JV;;AAPH;EAKM,a1BxJO;CCrER;;AyBwNL;EAWM,gC1B9JO;C0BuKR;;AApBL;EAcQ,iC1BjKK;CCrER;;AyBwNL;EAkBQ,iC1BrKK;C0BsKN;;AAnBP;;;;EA0BM,a1B7KO;C0B8KR;;AA3BL;EA+BI,gC1BlLS;E0BmLT,uC1BnLS;C0BoLV;;AAjCH;EAoCI,4Q1B2U6R;C0B1U9R;;AArCH;EAwCI,gC1B3LS;C0B4LV;;ACtRH;EACE,mBAAkB;EAClB,qBAAa;EAAb,sBAAa;EAAb,qBAAa;EAAb,cAAa;EACb,6BAAsB;EAAtB,8BAAsB;EAAtB,+BAAsB;MAAtB,2BAAsB;UAAtB,uBAAsB;EACtB,uB3BsFW;E2BrFX,uC3BsFW;EM3FT,uBNgO2B;C2BzN9B;;AAED;EAGE,oBAAc;EAAd,uBAAc;MAAd,mBAAc;UAAd,eAAc;EACd,iB3BopBgC;C2BnpBjC;;AAED;EACE,uB3B+oB+B;E2B9oB/B,sBAAqB;CACtB;;AAED;EACE,sBAAgC;EAChC,iBAAgB;CACjB;;AAED;EACE,iBAAgB;CACjB;;A1BrBG;E0ByBA,sBAAqB;C1BzBA;;A0BuBzB;EAMI,qB3B6nB8B;C2B5nB/B;;AAGH;ErBlCI,gCN0N2B;EMzN3B,iCNyN2B;C2BpL1B;;AAJL;ErBpBI,oCN4M2B;EM3M3B,mCN2M2B;C2B9K1B;;AASL;EACE,yB3BqmBgC;E2BpmBhC,iBAAgB;EAChB,0B3B4CiC;E2B3CjC,8C3B4BW;C2BvBZ;;AATD;ErB3DI,2DqBkE8E;CAC/E;;AAGH;EACE,yB3B0lBgC;E2BzlBhC,0B3BkCiC;E2BjCjC,2C3BkBW;C2BbZ;;AARD;ErBtEI,2DNqqB2E;C2BxlB5E;;AAQH;EACE,wBAAkC;EAClC,wB3BykB+B;E2BxkB/B,uBAAiC;EACjC,iBAAgB;CACjB;;AAED;EACE,wBAAkC;EAClC,uBAAiC;CAClC;;AAOD;ECvGE,0B5BiGc;E4BhGd,sB5BgGc;C2BQf;;ACtGC;;EAEE,8BAA6B;CAC9B;;ADoGH;EC1GE,0B5BgGc;E4B/Fd,sB5B+Fc;C2BYf;;ACzGC;;EAEE,8BAA6B;CAC9B;;ADuGH;EC7GE,0B5BkGc;E4BjGd,sB5BiGc;C2Baf;;AC5GC;;EAEE,8BAA6B;CAC9B;;AD0GH;EChHE,0B5B8Fc;E4B7Fd,sB5B6Fc;C2BoBf;;AC/GC;;EAEE,8BAA6B;CAC9B;;AD6GH;ECnHE,0B5B6Fc;E4B5Fd,sB5B4Fc;C2BwBf;;AClHC;;EAEE,8BAA6B;CAC9B;;ADkHH;EC9GE,8BAA6B;EAC7B,sB5BsFc;C2ByBf;;AC7GC;;EAEE,8BAA6B;EAC7B,sB5BiFY;C4BhFb;;AD0GH;ECjHE,8BAA6B;EAC7B,mB5B6VmC;C2B3OpC;;AChHC;;EAEE,8BAA6B;EAC7B,mB5BwViC;C4BvVlC;;AD6GH;ECpHE,8BAA6B;EAC7B,sB5BuFc;C2B8Bf;;ACnHC;;EAEE,8BAA6B;EAC7B,sB5BkFY;C4BjFb;;ADgHH;ECvHE,8BAA6B;EAC7B,sB5BqFc;C2BmCf;;ACtHC;;EAEE,8BAA6B;EAC7B,sB5BgFY;C4B/Eb;;ADmHH;EC1HE,8BAA6B;EAC7B,sB5BmFc;C2BwCf;;ACzHC;;EAEE,8BAA6B;EAC7B,sB5B8EY;C4B7Eb;;ADsHH;EC7HE,8BAA6B;EAC7B,sB5BkFc;C2B4Cf;;AC5HC;;EAEE,8BAA6B;EAC7B,sB5B6EY;C4B5Eb;;AD8HH;ECtHE,iCAA4B;CDwH7B;;ACtHC;;EAEE,8BAA6B;EAC7B,uCAAkC;CACnC;;AACD;;;;EAIE,YAAW;CACZ;;AACD;;;;EAIE,iCAA4B;CAC7B;;AACD;EAEI,Y5B6CO;CCrER;;A0BiIL;EACE,WAAU;EACV,iBAAgB;EAChB,eAAc;CACf;;AAGD;EACE,mBAAkB;EAClB,OAAM;EACN,SAAQ;EACR,UAAS;EACT,QAAO;EACP,iB3BwgBgC;C2BvgBjC;;AAED;EACE,YAAW;ErBvKT,mCNqqB2E;C2B5f9E;;AAGD;EACE,YAAW;ErBvKT,4CN+pB2E;EM9pB3E,6CN8pB2E;C2Btf9E;;AAED;EACE,YAAW;ErB9JT,gDNipB2E;EMhpB3E,+CNgpB2E;C2Bjf9E;;AhBhIG;EgBsIF;IACE,qBAAa;IAAb,sBAAa;IAAb,qBAAa;IAAb,cAAa;IACb,+BAAmB;IAAnB,8BAAmB;IAAnB,4BAAmB;QAAnB,wBAAmB;YAAnB,oBAAmB;IACnB,oB3BgfqD;I2B/erD,mB3B+eqD;G2BtetD;EAbD;IAOI,qBAAa;IAAb,sBAAa;IAAb,qBAAa;IAAb,cAAa;IACb,oBAAW;IAAX,oBAAW;QAAX,kBAAW;YAAX,aAAW;IACX,6BAAsB;IAAtB,8BAAsB;IAAtB,+BAAsB;QAAtB,2BAAsB;YAAtB,uBAAsB;IACtB,mB3ByemD;I2BxenD,kB3BwemD;G2BvepD;C7BmsHJ;;Aar1HG;EgB4JF;IACE,qBAAa;IAAb,sBAAa;IAAb,qBAAa;IAAb,cAAa;IACb,+BAAmB;IAAnB,8BAAmB;IAAnB,4BAAmB;QAAnB,wBAAmB;YAAnB,oBAAmB;GA2CpB;EA7CD;IAKI,oBAAW;IAAX,oBAAW;QAAX,kBAAW;YAAX,aAAW;GAuCZ;EA5CH;IAQM,eAAc;IACd,eAAc;GACf;EAVL;IrBnME,2BqBkNoC;IrBjNpC,8BqBiNoC;GAQ/B;EAvBP;IAkBU,2BAA0B;GAC3B;EAnBT;IAqBU,8BAA6B;GAC9B;EAtBT;IrBrLE,0BqB8MmC;IrB7MnC,6BqB6MmC;GAQ9B;EAjCP;IA4BU,0BAAyB;GAC1B;EA7BT;IA+BU,6BAA4B;GAC7B;EAhCT;IAoCQ,iBAAgB;GAMjB;EA1CP;;IAwCU,iBAAgB;GACjB;C7ByrHV;;A6B7qHD;EAEI,uB3ByZ6B;C2BxZ9B;;AhBpNC;EgBiNJ;IAMI,wB3BoayB;O2BpazB,qB3BoayB;Y2BpazB,gB3BoayB;I2BnazB,4B3Boa+B;O2Bpa/B,yB3Boa+B;Y2Bpa/B,oB3Boa+B;G2B7ZlC;EAdD;IAUM,sBAAqB;IACrB,YAAW;GACZ;C7BgrHJ;;A+Br8HD;EACE,sB7By2BkC;E6Bx2BlC,oBAAmB;EACnB,iBAAgB;EAChB,0B7ByGiC;EMzG/B,uBNgO2B;C6B7N9B;;ACNC;EACE,eAAc;EACd,YAAW;EACX,YAAW;CACZ;;ADIH;EACE,YAAW;CA2BZ;;AA5BD;EAKI,sBAAqB;EACrB,sB7B41BiC;E6B31BjC,qB7B21BiC;E6B11BjC,e7B2F+B;E6B1F/B,aAAiC;CAClC;;AAVH;EAmBI,2BAA0B;CAC3B;;AApBH;EAsBI,sBAAqB;CACtB;;AAvBH;EA0BI,e7ByE+B;C6BxEhC;;AEpCH;EACE,qBAAa;EAAb,sBAAa;EAAb,qBAAa;EAAb,cAAa;EAEb,gBAAe;EACf,iBAAgB;EzBAd,uBNgO2B;C+B9N9B;;AAED;EAGM,eAAc;EzBoBhB,gCNqM2B;EMpM3B,mCNoM2B;C+BvN1B;;AALL;EzBSI,iCNmN2B;EMlN3B,oCNkN2B;C+BlN1B;;AAVL;EAcI,WAAU;EACV,Y/BuES;E+BtET,0B/B4EY;E+B3EZ,sB/B2EY;C+B1Eb;;AAlBH;EAqBI,e/B+E+B;E+B9E/B,qBAAoB;EACpB,uB/B+DS;E+B9DT,mB/BmmBuC;C+BlmBxC;;AAGH;EACE,mBAAkB;EAClB,eAAc;EACd,wB/BskB0C;E+BrkB1C,kBAAiB;EACjB,kB/BykBwC;E+BxkBxC,e/B0Dc;E+BzDd,uB/BmDW;E+BlDX,uB/B2kByC;C+BnkB1C;;A9B9BG;E8ByBA,e/B4H4C;E+B3H5C,sBAAqB;EACrB,0B/B4D+B;E+B3D/B,mB/BykBuC;CClmBtC;;A+BtBH;EACE,wBhC6mBwC;EgC5mBxC,mBhCsPoB;CgCrPrB;;AAIG;E1BqBF,+BNsM0B;EMrM1B,kCNqM0B;CgCzNvB;;AAGD;E1BEF,gCNoN0B;EMnN1B,mCNmN0B;CgCpNvB;;AAdL;EACE,wBhC2mBuC;EgC1mBvC,oBhCuPoB;CgCtPrB;;AAIG;E1BqBF,+BNuM0B;EMtM1B,kCNsM0B;CgC1NvB;;AAGD;E1BEF,gCNqN0B;EMpN1B,mCNoN0B;CgCrNvB;;ACZP;EACE,sBAAqB;EACrB,sBjCsuBgC;EiCruBhC,ejCkuB+B;EiCjuB/B,kBjCuPqB;EiCtPrB,eAAc;EACd,YjCmFW;EiClFX,mBAAkB;EAClB,oBAAmB;EACnB,yBAAwB;E3BVtB,uBNgO2B;CiC/M9B;;AAhBD;EAcI,cAAa;CACd;;AAIH;EACE,mBAAkB;EAClB,UAAS;CACV;;AhCLG;EgCWA,YjC6DS;EiC5DT,sBAAqB;ChCTpB;;AgCkBL;EACE,qBjCmsBgC;EiClsBhC,oBjCksBgC;EM3uB9B,qBN8uB+B;CiCnsBlC;;AAMD;EClDE,0BlCyGiC;CiCrDlC;;AhCjCG;EiCfE,0BAAqC;CjCkBtC;;AgCgCL;ECtDE,0BlCiGc;CiCzCf;;AhCrCG;EiCfE,0BAAqC;CjCkBtC;;AgCoCL;EC1DE,0BlCgGc;CiCpCf;;AhCzCG;EiCfE,0BAAqC;CjCkBtC;;AgCwCL;EC9DE,0BlCkGc;CiClCf;;AhC7CG;EiCfE,0BAAqC;CjCkBtC;;AgC4CL;EClEE,0BlC8Fc;CiC1Bf;;AhCjDG;EiCfE,0BAAqC;CjCkBtC;;AgCgDL;ECtEE,0BlC6Fc;CiCrBf;;AhCrDG;EiCfE,0BAAqC;CjCkBtC;;AkCzBL;EACE,mBAAoD;EACpD,oBnCsoBmC;EmCroBnC,0BnC0GiC;EMzG/B,sBNiO0B;CmC5N7B;;AxB+CG;EwBxDJ;IAOI,mBnCioBiC;GmC/nBpC;CrCgpIA;;AqC9oID;EACE,iBAAgB;EAChB,gBAAe;E7BTb,iB6BUsB;CACzB;;ACXD;EACE,yBpCoxBmC;EoCnxBnC,oBpCoxBgC;EoCnxBhC,8BAA6C;E9BH3C,uBNgO2B;CoC3N9B;;AAGD;EAEE,eAAc;CACf;;AAGD;EACE,kBpC6OqB;CoC5OtB;;AAOD;EAGI,mBAAkB;EAClB,cpCyvBgC;EoCxvBhC,gBpCyvBiC;EoCxvBjC,yBpCwvBiC;EoCvvBjC,eAAc;CACf;;AAQH;ECxCE,erC6oBsC;EqC5oBtC,0BrC6oBsC;EqC5oBtC,sBrC6oB4D;CoCrmB7D;;ACtCC;EACE,0BAAqC;CACtC;;AACD;EACE,eAA+B;CAChC;;ADkCH;EC3CE,erCipBsC;EqChpBtC,0BrCipBsC;EqChpBtC,sBrCipByD;CoCtmB1D;;ACzCC;EACE,0BAAqC;CACtC;;AACD;EACE,eAA+B;CAChC;;ADqCH;EC9CE,erCqpBsC;EqCppBtC,0BrCqpBsC;EqCppBtC,sBrCspB4D;CoCxmB7D;;AC5CC;EACE,0BAAqC;CACtC;;AACD;EACE,eAA+B;CAChC;;ADwCH;ECjDE,erC0pBsC;EqCzpBtC,0BrC0pBsC;EqCzpBtC,sBrC0pB2D;CoCzmB5D;;AC/CC;EACE,0BAAqC;CACtC;;AACD;EACE,eAA+B;CAChC;;ACZH;EACE;IAAO,4BAAuC;GxCkvI7C;EwCjvID;IAAK,yBAAwB;GxCovI5B;CACF;;AwCvvID;EACE;IAAO,4BAAuC;GxCkvI7C;EwCjvID;IAAK,yBAAwB;GxCovI5B;CACF;;AwCvvID;EACE;IAAO,4BAAuC;GxCkvI7C;EwCjvID;IAAK,yBAAwB;GxCovI5B;CACF;;AwClvID;EACE,qBAAa;EAAb,sBAAa;EAAb,qBAAa;EAAb,cAAa;EACb,iBAAgB;EAChB,mBtC2yBoC;EsC1yBpC,kBtCyyBkC;EsCxyBlC,mBAAkB;EAClB,0BtCkGiC;EMzG/B,uBNgO2B;CsCvN9B;;AAED;EACE,atCkyBkC;EsCjyBlC,kBtCiyBkC;EsChyBlC,YtC4EW;EsC3EX,0BtCiFc;EO/FV,oCPqzBwC;EOrzBxC,+BPqzBwC;EOrzBxC,4BPqzBwC;CsCryB7C;;AAED;ECYE,8MAA6I;EAA7I,yMAA6I;EAA7I,sMAA6I;EDV7I,mCtCyxBkC;UsCzxBlC,2BtCyxBkC;CsCxxBnC;;AAED;EACE,2DtC4xBgD;OsC5xBhD,sDtC4xBgD;UsC5xBhD,mDtC4xBgD;CsC3xBjD;;AE9BD;EACE,qBAAa;EAAb,sBAAa;EAAb,qBAAa;EAAb,cAAa;EACb,yBAAuB;EAAvB,gCAAuB;MAAvB,sBAAuB;UAAvB,wBAAuB;CACxB;;AAED;EACE,oBAAO;EAAP,gBAAO;MAAP,YAAO;UAAP,aAAO;CACR;;ACHD;EACE,qBAAa;EAAb,sBAAa;EAAb,qBAAa;EAAb,cAAa;EACb,6BAAsB;EAAtB,8BAAsB;EAAtB,+BAAsB;MAAtB,2BAAsB;UAAtB,uBAAsB;EAGtB,gBAAe;EACf,iBAAgB;CACjB;;AAQD;EACE,YAAW;EACX,ezCsFiC;EyCrFjC,oBAAmB;CAapB;;AxCbG;EwCIA,ezCiF+B;EyChF/B,sBAAqB;EACrB,0BzCkF+B;CCrF9B;;AwCNL;EAaI,ezC0E+B;EyCzE/B,0BzC4E+B;CyC3EhC;;AAQH;EACE,mBAAkB;EAClB,eAAc;EACd,yBzCwxBsC;EyCtxBtC,oBzCmLgB;EyClLhB,uBzC8CW;EyC7CX,uCzC8CW;CyClBZ;;AAnCD;EnChCI,gCN0N2B;EMzN3B,iCNyN2B;CyC/K5B;;AAXH;EAcI,iBAAgB;EnChChB,oCN4M2B;EM3M3B,mCN2M2B;CyC1K5B;;AxCpCC;EwCuCA,sBAAqB;CxCpCpB;;AwCiBL;EAwBI,ezC0C+B;EyCzC/B,uBzC2BS;CyC1BV;;AA1BH;EA8BI,WAAU;EACV,YzCqBS;EyCpBT,0BzC0BY;EyCzBZ,sBzCyBY;CyCxBb;;AASH;EAEI,gBAAe;EACf,eAAc;EACd,iBAAgB;CACjB;;AALH;EASM,cAAa;CACd;;AAVL;EAeM,iBAAgB;CACjB;;AClGH;EACE,e1C4oBoC;E0C3oBpC,0B1C4oBoC;C0C3oBrC;;AAGD;;EAEE,e1CqoBoC;C0CznBrC;;AzCDC;;;EyCRE,e1CkoBkC;E0CjoBlC,0BAAyC;CzCU1C;;AyChBH;;EAUI,YAAW;EACX,0B1C4nBkC;E0C3nBlC,sB1C2nBkC;C0C1nBnC;;AAnBH;EACE,e1CgpBoC;E0C/oBpC,0B1CgpBoC;C0C/oBrC;;AAGD;;EAEE,e1CyoBoC;C0C7nBrC;;AzCDC;;;EyCRE,e1CsoBkC;E0CroBlC,0BAAyC;CzCU1C;;AyChBH;;EAUI,YAAW;EACX,0B1CgoBkC;E0C/nBlC,sB1C+nBkC;C0C9nBnC;;AAnBH;EACE,e1CopBoC;E0CnpBpC,0B1CopBoC;C0CnpBrC;;AAGD;;EAEE,e1C6oBoC;C0CjoBrC;;AzCDC;;;EyCRE,e1C0oBkC;E0CzoBlC,0BAAyC;CzCU1C;;AyChBH;;EAUI,YAAW;EACX,0B1CooBkC;E0CnoBlC,sB1CmoBkC;C0CloBnC;;AAnBH;EACE,e1CypBoC;E0CxpBpC,0B1CypBoC;C0CxpBrC;;AAGD;;EAEE,e1CkpBoC;C0CtoBrC;;AzCDC;;;EyCRE,e1C+oBkC;E0C9oBlC,0BAAyC;CzCU1C;;AyChBH;;EAUI,YAAW;EACX,0B1CyoBkC;E0CxoBlC,sB1CwoBkC;C0CvoBnC;;ACpBL;EACE,mBAAkB;EAClB,eAAc;EACd,YAAW;EACX,WAAU;EACV,iBAAgB;CAoBjB;;AAzBD;EAQI,eAAc;EACd,YAAW;CACZ;;AAVH;;;;;EAiBI,mBAAkB;EAClB,OAAM;EACN,UAAS;EACT,QAAO;EACP,YAAW;EACX,aAAY;EACZ,UAAS;CACV;;AAGH;EAEI,wBAA+B;CAChC;;AAGH;EAEI,oBAA+B;CAChC;;AAGH;EAEI,iBAA8B;CAC/B;;AAGH;EAEI,kBAA8B;CAC/B;;AClDH;EACE,aAAY;EACZ,kB5Cy4BiD;E4Cx4BjD,kB5C6PqB;E4C5PrB,eAAc;EACd,Y5C0FW;E4CzFX,0B5CwFW;E4CvFX,YAAW;CAOZ;;A3CQG;E2CZA,Y5CqFS;E4CpFT,sBAAqB;EACrB,aAAY;C3CaX;;A2CHL;EACE,WAAU;EACV,wBAAuB;EACvB,UAAS;EACT,yBAAwB;CACzB;;ACpBD;EACE,iBAAgB;CACjB;;AAGD;EACE,gBAAe;EACf,OAAM;EACN,SAAQ;EACR,UAAS;EACT,QAAO;EACP,c7C+hB8B;E6C9hB9B,cAAa;EACb,iBAAgB;EAGhB,WAAU;CAWX;;AAtBD;EtCPM,oDP4wB8C;EO5wB9C,4CP4wB8C;EO5wB9C,0CP4wB8C;EO5wB9C,oCP4wB8C;EO5wB9C,iGP4wB8C;E6ClvBhD,sCAA6B;OAA7B,iCAA6B;UAA7B,8BAA6B;CAC9B;;AApBH;EAqByB,mCAA0B;OAA1B,8BAA0B;UAA1B,2BAA0B;CAAI;;AAEvD;EACE,mBAAkB;EAClB,iBAAgB;CACjB;;AAGD;EACE,mBAAkB;EAClB,YAAW;EACX,a7C8sBgC;C6C7sBjC;;AAGD;EACE,mBAAkB;EAClB,qBAAa;EAAb,sBAAa;EAAb,qBAAa;EAAb,cAAa;EACb,6BAAsB;EAAtB,8BAAsB;EAAtB,+BAAsB;MAAtB,2BAAsB;UAAtB,uBAAsB;EACtB,uB7C0CW;E6CzCX,qCAA4B;UAA5B,6BAA4B;EAC5B,qC7CyCW;EM3FT,sBNiO0B;E6C3K5B,WAAU;CACX;;AAGD;EACE,gBAAe;EACf,OAAM;EACN,SAAQ;EACR,UAAS;EACT,QAAO;EACP,c7C4e8B;E6C3e9B,uB7C0BW;C6CrBZ;;AAZD;EAUW,WAAU;CAAK;;AAV1B;EAWW,a7C6rBqB;C6C7rBe;;AAK/C;EACE,qBAAa;EAAb,sBAAa;EAAb,qBAAa;EAAb,cAAa;EACb,0BAAmB;EAAnB,4BAAmB;MAAnB,uBAAmB;UAAnB,oBAAmB;EACnB,0BAA8B;EAA9B,uCAA8B;MAA9B,uBAA8B;UAA9B,+BAA8B;EAC9B,c7CyrBgC;E6CxrBhC,iC7C0BiC;C6CzBlC;;AAGD;EACE,iBAAgB;EAChB,iB7C0KoB;C6CzKrB;;AAID;EACE,mBAAkB;EAGlB,oBAAc;EAAd,uBAAc;MAAd,mBAAc;UAAd,eAAc;EACd,c7CqpBgC;C6CppBjC;;AAGD;EACE,qBAAa;EAAb,sBAAa;EAAb,qBAAa;EAAb,cAAa;EACb,0BAAmB;EAAnB,4BAAmB;MAAnB,uBAAmB;UAAnB,oBAAmB;EACnB,sBAAyB;EAAzB,kCAAyB;MAAzB,mBAAyB;UAAzB,0BAAyB;EACzB,c7C6oBgC;E6C5oBhC,8B7CCiC;C6CIlC;;AAVD;EAQyB,oBAAmB;CAAK;;AARjD;EASwB,qBAAoB;CAAK;;AAIjD;EACE,mBAAkB;EAClB,aAAY;EACZ,YAAW;EACX,aAAY;EACZ,iBAAgB;CACjB;;AlClEG;EkCuEF;IACE,iB7C8oB+B;I6C7oB/B,kBAAyC;GAC1C;EAMD;IAAY,iB7CuoBqB;G6CvoBG;C/Cq/IrC;;AarkJG;EkCoFF;IAAY,iB7CioBqB;G6CjoBG;C/Cu/IrC;;AgDloJD;EACE,mBAAkB;EAClB,c9CgjB8B;E8C/iB9B,eAAc;ECFd,wG/CoPiH;E+ClPjH,mBAAkB;EAClB,oB/C0PyB;E+CzPzB,iB/C6PoB;E+C5PpB,iBAAgB;EAChB,kBAAiB;EACjB,sBAAqB;EACrB,kBAAiB;EACjB,qBAAoB;EACpB,uBAAsB;EACtB,mBAAkB;EAClB,qBAAoB;EACpB,oBAAmB;EACnB,iBAAgB;EDRhB,oB9CoPsB;E8ClPtB,sBAAqB;EACrB,WAAU;CA4DX;;AAtED;EAYW,a9CgrBqB;C8ChrBQ;;AAZxC;EAgBI,eAA+B;EAC/B,iB9C8qB6B;C8CpqB9B;;AA3BH;EAoBM,UAAS;EACT,UAAS;EACT,kB9C2qB2B;E8C1qB3B,YAAW;EACX,wBAAyD;EACzD,uB9CqEO;C8CpER;;AA1BL;EA8BI,e9CmqB6B;E8ClqB7B,iB9CgqB6B;C8CtpB9B;;AAzCH;EAkCM,SAAQ;EACR,QAAO;EACP,iB9C6pB2B;E8C5pB3B,YAAW;EACX,4BAA8E;EAC9E,yB9CuDO;C8CtDR;;AAxCL;EA4CI,eAA+B;EAC/B,gB9CkpB6B;C8CxoB9B;;AAvDH;EAgDM,OAAM;EACN,UAAS;EACT,kB9C+oB2B;E8C9oB3B,YAAW;EACX,wB9C6oB2B;E8C5oB3B,0B9CyCO;C8CxCR;;AAtDL;EA0DI,e9CuoB6B;E8CtoB7B,kB9CooB6B;C8C1nB9B;;AArEH;EA8DM,SAAQ;EACR,SAAQ;EACR,iB9CioB2B;E8ChoB3B,YAAW;EACX,4B9C+nB2B;E8C9nB3B,wB9C2BO;C8C1BR;;AAKL;EACE,iB9C+mBiC;E8C9mBjC,iB9CmnB+B;E8ClnB/B,Y9CiBW;E8ChBX,mBAAkB;EAClB,uB9CgBW;EM3FT,uBNgO2B;C8C3I9B;;AAfD;EASI,mBAAkB;EAClB,SAAQ;EACR,UAAS;EACT,0BAAyB;EACzB,oBAAmB;CACpB;;AExFH;EACE,mBAAkB;EAClB,OAAM;EACN,QAAO;EACP,chD8iB8B;EgD7iB9B,eAAc;EACd,iBhDosByC;EgDnsBzC,ahDisBuC;E+CtsBvC,wG/CoPiH;E+ClPjH,mBAAkB;EAClB,oB/C0PyB;E+CzPzB,iB/C6PoB;E+C5PpB,iBAAgB;EAChB,kBAAiB;EACjB,sBAAqB;EACrB,kBAAiB;EACjB,qBAAoB;EACpB,uBAAsB;EACtB,mBAAkB;EAClB,qBAAoB;EACpB,oBAAmB;EACnB,iBAAgB;ECLhB,oBhDiPsB;EgD/OtB,sBAAqB;EACrB,uBhDgFW;EgD/EX,qCAA4B;UAA5B,6BAA4B;EAC5B,qChD+EW;EM3FT,sBNiO0B;CgDvG7B;;AA9HD;EAyBI,kBhD+rBsC;CgD5qBvC;;AA5CH;EA6BM,UAAS;EACT,uBAAsB;CACvB;;AA/BL;EAkCM,chDyrB4D;EgDxrB5D,mBhDwrB4D;EgDvrB5D,sChDwrBmE;CgDvrBpE;;AArCL;EAwCM,cAAwC;EACxC,mBhD+qBoC;EgD9qBpC,uBhDoDO;CgDnDR;;AA3CL;EAgDI,kBhDwqBsC;CgDrpBvC;;AAnEH;EAoDM,SAAQ;EACR,qBAAoB;CACrB;;AAtDL;EAyDM,YhDkqB4D;EgDjqB5D,kBhDiqB4D;EgDhqB5D,wChDiqBmE;CgDhqBpE;;AA5DL;EA+DM,YAAsC;EACtC,kBAA4C;EAC5C,yBhD6BO;CgD5BR;;AAlEL;EAuEI,iBhDipBsC;CgDlnBvC;;AAtGH;EA2EM,UAAS;EACT,oBAAmB;CACpB;;AA7EL;EAgFM,WhD2oB4D;EgD1oB5D,mBhD0oB4D;EgDzoB5D,yChD0oBmE;CgDzoBpE;;AAnFL;EAsFM,WAAqC;EACrC,mBhDioBoC;EgDhoBpC,0BhDMO;CgDLR;;AAzFL;EA6FM,mBAAkB;EAClB,OAAM;EACN,UAAS;EACT,eAAc;EACd,YAAW;EACX,mBAAkB;EAClB,YAAW;EACX,iChD2mBuD;CgD1mBxD;;AArGL;EA0GI,mBhD8mBsC;CgD3lBvC;;AA7HH;EA8GM,SAAQ;EACR,sBAAqB;CACtB;;AAhHL;EAmHM,ahDwmB4D;EgDvmB5D,kBhDumB4D;EgDtmB5D,uChDumBmE;CgDtmBpE;;AAtHL;EAyHM,aAAuC;EACvC,kBAA4C;EAC5C,wBhD7BO;CgD8BR;;AAML;EACE,kBhD+kBwC;EgD9kBxC,iBAAgB;EAChB,gBhDqHmB;EgDpHnB,ehD0I8B;EgDzI9B,0BhDwkB2D;EgDvkB3D,iCAAwE;E1C9HtE,2C0C+HyE;E1C9HzE,4C0C8HyE;CAM5E;;AAbD;EAWI,cAAa;CACd;;AAGH;EACE,kBhDokBwC;EgDnkBxC,ehDzCiC;CgD0ClC;;AAOD;;EAEE,mBAAkB;EAClB,eAAc;EACd,SAAQ;EACR,UAAS;EACT,0BAAyB;EACzB,oBAAmB;CACpB;;AAED;EACE,YAAW;EACX,mBhDojBgE;CgDnjBjE;;AACD;EACE,YAAW;EACX,mBhD6iBwC;CgD5iBzC;;AC3KD;EACE,mBAAkB;CACnB;;AAED;EACE,mBAAkB;EAClB,YAAW;EACX,iBAAgB;CACjB;;AAED;EACE,mBAAkB;EAClB,cAAa;EACb,0BAAmB;EAAnB,4BAAmB;MAAnB,uBAAmB;UAAnB,oBAAmB;EACnB,YAAW;E1CVP,gDPi4B4C;EOj4B5C,wCPi4B4C;EOj4B5C,sCPi4B4C;EOj4B5C,gCPi4B4C;EOj4B5C,qFPi4B4C;EiDr3BhD,oCAA2B;UAA3B,4BAA2B;EAC3B,4BAAmB;UAAnB,oBAAmB;CACpB;;AAED;;;EAGE,qBAAa;EAAb,sBAAa;EAAb,qBAAa;EAAb,cAAa;CACd;;AAED;;EAEE,mBAAkB;EAClB,OAAM;CACP;;AAGD;;EAEE,wCAA+B;UAA/B,gCAA+B;CAChC;;AAED;;EAEE,2CAAkC;UAAlC,mCAAkC;CACnC;;AAED;;EAEE,4CAAmC;UAAnC,oCAAmC;CACpC;;AAOD;;EAEE,mBAAkB;EAClB,OAAM;EACN,UAAS;EAET,qBAAa;EAAb,sBAAa;EAAb,qBAAa;EAAb,cAAa;EACb,0BAAmB;EAAnB,4BAAmB;MAAnB,uBAAmB;UAAnB,oBAAmB;EACnB,yBAAuB;EAAvB,gCAAuB;MAAvB,sBAAuB;UAAvB,wBAAuB;EACvB,WjDuzB+C;EiDtzB/C,YjD8BW;EiD7BX,mBAAkB;EAClB,ajDqzB8C;CiD1yB/C;;AhDvDG;;;EgDkDA,YjDsBS;EiDrBT,sBAAqB;EACrB,WAAU;EACV,YAAW;ChDlDV;;AgDqDL;EACE,QAAO;CACR;;AACD;EACE,SAAQ;CACT;;AAGD;;EAEE,sBAAqB;EACrB,YjDwyBgD;EiDvyBhD,ajDuyBgD;EiDtyBhD,gDAA+C;EAC/C,mCAA0B;UAA1B,2BAA0B;CAC3B;;AACD;EACE,8MjD1ByI;CiD2B1I;;AACD;EACE,gNjD7ByI;CiD8B1I;;AAQD;EACE,mBAAkB;EAClB,SAAQ;EACR,aAAY;EACZ,QAAO;EACP,YAAW;EACX,qBAAa;EAAb,sBAAa;EAAb,qBAAa;EAAb,cAAa;EACb,yBAAuB;EAAvB,gCAAuB;MAAvB,sBAAuB;UAAvB,wBAAuB;EACvB,gBAAe;EAEf,kBjDiwB+C;EiDhwB/C,iBjDgwB+C;EiD/vB/C,iBAAgB;CAoCjB;;AAhDD;EAeI,mBAAkB;EAClB,oBAAc;EAAd,uBAAc;MAAd,mBAAc;UAAd,eAAc;EACd,gBjD6vB8C;EiD5vB9C,YjD6vB6C;EiD5vB7C,kBjD6vB6C;EiD5vB7C,iBjD4vB6C;EiD3vB7C,oBAAmB;EACnB,2CjDnCS;CiDwDV;;AA3CH;EA0BM,mBAAkB;EAClB,WAAU;EACV,QAAO;EACP,sBAAqB;EACrB,YAAW;EACX,aAAY;EACZ,YAAW;CACZ;;AAjCL;EAmCM,mBAAkB;EAClB,cAAa;EACb,QAAO;EACP,sBAAqB;EACrB,YAAW;EACX,aAAY;EACZ,YAAW;CACZ;;AA1CL;EA8CI,uBjD3DS;CiD4DV;;AAQH;EACE,mBAAkB;EAClB,WAA6C;EAC7C,aAAY;EACZ,UAA4C;EAC5C,YAAW;EACX,kBAAiB;EACjB,qBAAoB;EACpB,YjD5EW;EiD6EX,mBAAkB;CACnB;;AC5KD;EAAqB,oCAAmC;CAAK;;AAC7D;EAAqB,+BAA8B;CAAK;;AACxD;EAAqB,kCAAiC;CAAK;;AAC3D;EAAqB,kCAAiC;CAAK;;AAC3D;EAAqB,uCAAsC;CAAK;;AAChE;EAAqB,oCAAmC;CAAK;;ACD7D;EACE,0BAAsC;CACvC;;ACHC;EACE,qCAAmC;CACpC;;AnDiBC;EmDdE,qCAAgD;CnDiBjD;;AmDtBH;EACE,qCAAmC;CACpC;;AnDiBC;EmDdE,qCAAgD;CnDiBjD;;AmDtBH;EACE,qCAAmC;CACpC;;AnDiBC;EmDdE,qCAAgD;CnDiBjD;;AmDtBH;EACE,qCAAmC;CACpC;;AnDiBC;EmDdE,qCAAgD;CnDiBjD;;AmDtBH;EACE,qCAAmC;CACpC;;AnDiBC;EmDdE,qCAAgD;CnDiBjD;;AmDtBH;EACE,qCAAmC;CACpC;;AnDiBC;EmDdE,qCAAgD;CnDiBjD;;AoDrBL;EAAmB,qBAAoB;CAAK;;AAC5C;EAAmB,yBAAwB;CAAK;;AAChD;EAAmB,2BAA0B;CAAK;;AAClD;EAAmB,4BAA2B;CAAK;;AACnD;EAAmB,0BAAyB;CAAK;;AAMjD;E/CVI,uBNgO2B;CqDpN9B;;AACD;E/CPI,gCN0N2B;EMzN3B,iCNyN2B;CqDjN9B;;AACD;E/CHI,iCNmN2B;EMlN3B,oCNkN2B;CqD9M9B;;AACD;E/CCI,oCN4M2B;EM3M3B,mCN2M2B;CqD3M9B;;AACD;E/CKI,gCNqM2B;EMpM3B,mCNoM2B;CqDxM9B;;AAED;EACE,mBAAkB;CACnB;;AAED;EACE,iBAAgB;CACjB;;AvBnCC;EACE,eAAc;EACd,YAAW;EACX,YAAW;CACZ;;AwBGC;EAA2B,yBAAwB;CAAK;;AACxD;EAA2B,2BAA0B;CAAK;;AAC1D;EAA2B,iCAAgC;CAAK;;AAChE;EAA2B,0BAAyB;CAAK;;AACzD;EAA2B,0BAAyB;CAAK;;AACzD;EAA2B,+BAA8B;CAAK;;AAC9D;EAA2B,gCAAwB;EAAxB,iCAAwB;EAAxB,gCAAwB;EAAxB,yBAAwB;CAAK;;AACxD;EAA2B,uCAA+B;EAA/B,wCAA+B;EAA/B,uCAA+B;EAA/B,gCAA+B;CAAK;;A3CyC/D;E2ChDA;IAA2B,yBAAwB;GAAK;EACxD;IAA2B,2BAA0B;GAAK;EAC1D;IAA2B,iCAAgC;GAAK;EAChE;IAA2B,0BAAyB;GAAK;EACzD;IAA2B,0BAAyB;GAAK;EACzD;IAA2B,+BAA8B;GAAK;EAC9D;IAA2B,gCAAwB;IAAxB,iCAAwB;IAAxB,gCAAwB;IAAxB,yBAAwB;GAAK;EACxD;IAA2B,uCAA+B;IAA/B,wCAA+B;IAA/B,uCAA+B;IAA/B,gCAA+B;GAAK;CxD0tKlE;;AajrKG;E2ChDA;IAA2B,yBAAwB;GAAK;EACxD;IAA2B,2BAA0B;GAAK;EAC1D;IAA2B,iCAAgC;GAAK;EAChE;IAA2B,0BAAyB;GAAK;EACzD;IAA2B,0BAAyB;GAAK;EACzD;IAA2B,+BAA8B;GAAK;EAC9D;IAA2B,gCAAwB;IAAxB,iCAAwB;IAAxB,gCAAwB;IAAxB,yBAAwB;GAAK;EACxD;IAA2B,uCAA+B;IAA/B,wCAA+B;IAA/B,uCAA+B;IAA/B,gCAA+B;GAAK;CxDqvKlE;;Aa5sKG;E2ChDA;IAA2B,yBAAwB;GAAK;EACxD;IAA2B,2BAA0B;GAAK;EAC1D;IAA2B,iCAAgC;GAAK;EAChE;IAA2B,0BAAyB;GAAK;EACzD;IAA2B,0BAAyB;GAAK;EACzD;IAA2B,+BAA8B;GAAK;EAC9D;IAA2B,gCAAwB;IAAxB,iCAAwB;IAAxB,gCAAwB;IAAxB,yBAAwB;GAAK;EACxD;IAA2B,uCAA+B;IAA/B,wCAA+B;IAA/B,uCAA+B;IAA/B,gCAA+B;GAAK;CxDgxKlE;;AavuKG;E2ChDA;IAA2B,yBAAwB;GAAK;EACxD;IAA2B,2BAA0B;GAAK;EAC1D;IAA2B,iCAAgC;GAAK;EAChE;IAA2B,0BAAyB;GAAK;EACzD;IAA2B,0BAAyB;GAAK;EACzD;IAA2B,+BAA8B;GAAK;EAC9D;IAA2B,gCAAwB;IAAxB,iCAAwB;IAAxB,gCAAwB;IAAxB,yBAAwB;GAAK;EACxD;IAA2B,uCAA+B;IAA/B,wCAA+B;IAA/B,uCAA+B;IAA/B,gCAA+B;GAAK;CxD2yKlE;;AwDlyKD;EACE,yBAAwB;CAKzB;;AAHC;EAHF;IAII,0BAAyB;GAE5B;CxDsyKA;;AwDpyKD;EACE,yBAAwB;CAKzB;;AAHC;EAHF;IAII,2BAA0B;GAE7B;CxDwyKA;;AwDtyKD;EACE,yBAAwB;CAKzB;;AAHC;EAHF;IAII,iCAAgC;GAEnC;CxD0yKA;;AwDvyKC;EADF;IAEI,yBAAwB;GAE3B;CxD0yKA;;AyDt1KG;EAAwB,6BAAS;EAAT,kBAAS;MAAT,mBAAS;UAAT,UAAS;CAAK;;AACtC;EAAwB,6BAAQ;EAAR,iBAAQ;MAAR,kBAAQ;UAAR,SAAQ;CAAK;;AACrC;EAAwB,6BAAQ;EAAR,iBAAQ;MAAR,kBAAQ;UAAR,SAAQ;CAAK;;AAErC;EAAgC,0CAA8B;EAA9B,yCAA8B;EAA9B,uCAA8B;MAA9B,mCAA8B;UAA9B,+BAA8B;CAAK;;AACnE;EAAgC,wCAAiC;EAAjC,yCAAiC;EAAjC,0CAAiC;MAAjC,sCAAiC;UAAjC,kCAAiC;CAAK;;AACtE;EAAgC,0CAAsC;EAAtC,0CAAsC;EAAtC,+CAAsC;MAAtC,2CAAsC;UAAtC,uCAAsC;CAAK;;AAC3E;EAAgC,wCAAyC;EAAzC,0CAAyC;EAAzC,kDAAyC;MAAzC,8CAAyC;UAAzC,0CAAyC;CAAK;;AAE9E;EAA8B,mCAA0B;MAA1B,+BAA0B;UAA1B,2BAA0B;CAAK;;AAC7D;EAA8B,qCAA4B;MAA5B,iCAA4B;UAA5B,6BAA4B;CAAK;;AAC/D;EAA8B,2CAAkC;MAAlC,uCAAkC;UAAlC,mCAAkC;CAAK;;AAErE;EAAoC,mCAAsC;EAAtC,+CAAsC;MAAtC,gCAAsC;UAAtC,uCAAsC;CAAK;;AAC/E;EAAoC,iCAAoC;EAApC,6CAAoC;MAApC,8BAAoC;UAApC,qCAAoC;CAAK;;AAC7E;EAAoC,oCAAkC;EAAlC,2CAAkC;MAAlC,iCAAkC;UAAlC,mCAAkC;CAAK;;AAC3E;EAAoC,qCAAyC;EAAzC,kDAAyC;MAAzC,kCAAyC;UAAzC,0CAAyC;CAAK;;AAClF;EAAoC,iDAAwC;MAAxC,qCAAwC;UAAxC,yCAAwC;CAAK;;AAEjF;EAAiC,oCAAkC;EAAlC,2CAAkC;MAAlC,iCAAkC;UAAlC,mCAAkC;CAAK;;AACxE;EAAiC,kCAAgC;EAAhC,yCAAgC;MAAhC,+BAAgC;UAAhC,iCAAgC;CAAK;;AACtE;EAAiC,qCAA8B;EAA9B,uCAA8B;MAA9B,kCAA8B;UAA9B,+BAA8B;CAAK;;AACpE;EAAiC,uCAAgC;EAAhC,yCAAgC;MAAhC,oCAAgC;UAAhC,iCAAgC;CAAK;;AACtE;EAAiC,sCAA+B;EAA/B,wCAA+B;MAA/B,mCAA+B;UAA/B,gCAA+B;CAAK;;AAErE;EAAkC,6CAAoC;MAApC,qCAAoC;UAApC,qCAAoC;CAAK;;AAC3E;EAAkC,2CAAkC;MAAlC,mCAAkC;UAAlC,mCAAkC;CAAK;;AACzE;EAAkC,yCAAgC;MAAhC,sCAAgC;UAAhC,iCAAgC;CAAK;;AACvE;EAAkC,gDAAuC;MAAvC,uCAAuC;UAAvC,wCAAuC;CAAK;;AAC9E;EAAkC,+CAAsC;MAAtC,0CAAsC;UAAtC,uCAAsC;CAAK;;AAC7E;EAAkC,0CAAiC;MAAjC,uCAAiC;UAAjC,kCAAiC;CAAK;;AAExE;EAAgC,oCAA2B;MAA3B,qCAA2B;cAA3B,oCAA2B;UAA3B,4BAA2B;CAAK;;AAChE;EAAgC,0CAAiC;MAAjC,sCAAiC;UAAjC,kCAAiC;CAAK;;AACtE;EAAgC,wCAA+B;MAA/B,oCAA+B;UAA/B,gCAA+B;CAAK;;AACpE;EAAgC,sCAA6B;MAA7B,uCAA6B;cAA7B,sCAA6B;UAA7B,8BAA6B;CAAK;;AAClE;EAAgC,wCAA+B;MAA/B,yCAA+B;UAA/B,gCAA+B;CAAK;;AACpE;EAAgC,uCAA8B;MAA9B,wCAA8B;cAA9B,uCAA8B;UAA9B,+BAA8B;CAAK;;A5CWnE;E4ChDA;IAAwB,6BAAS;IAAT,kBAAS;QAAT,mBAAS;YAAT,UAAS;GAAK;EACtC;IAAwB,6BAAQ;IAAR,iBAAQ;QAAR,kBAAQ;YAAR,SAAQ;GAAK;EACrC;IAAwB,6BAAQ;IAAR,iBAAQ;QAAR,kBAAQ;YAAR,SAAQ;GAAK;EAErC;IAAgC,0CAA8B;IAA9B,yCAA8B;IAA9B,uCAA8B;QAA9B,mCAA8B;YAA9B,+BAA8B;GAAK;EACnE;IAAgC,wCAAiC;IAAjC,yCAAiC;IAAjC,0CAAiC;QAAjC,sCAAiC;YAAjC,kCAAiC;GAAK;EACtE;IAAgC,0CAAsC;IAAtC,0CAAsC;IAAtC,+CAAsC;QAAtC,2CAAsC;YAAtC,uCAAsC;GAAK;EAC3E;IAAgC,wCAAyC;IAAzC,0CAAyC;IAAzC,kDAAyC;QAAzC,8CAAyC;YAAzC,0CAAyC;GAAK;EAE9E;IAA8B,mCAA0B;QAA1B,+BAA0B;YAA1B,2BAA0B;GAAK;EAC7D;IAA8B,qCAA4B;QAA5B,iCAA4B;YAA5B,6BAA4B;GAAK;EAC/D;IAA8B,2CAAkC;QAAlC,uCAAkC;YAAlC,mCAAkC;GAAK;EAErE;IAAoC,mCAAsC;IAAtC,+CAAsC;QAAtC,gCAAsC;YAAtC,uCAAsC;GAAK;EAC/E;IAAoC,iCAAoC;IAApC,6CAAoC;QAApC,8BAAoC;YAApC,qCAAoC;GAAK;EAC7E;IAAoC,oCAAkC;IAAlC,2CAAkC;QAAlC,iCAAkC;YAAlC,mCAAkC;GAAK;EAC3E;IAAoC,qCAAyC;IAAzC,kDAAyC;QAAzC,kCAAyC;YAAzC,0CAAyC;GAAK;EAClF;IAAoC,iDAAwC;QAAxC,qCAAwC;YAAxC,yCAAwC;GAAK;EAEjF;IAAiC,oCAAkC;IAAlC,2CAAkC;QAAlC,iCAAkC;YAAlC,mCAAkC;GAAK;EACxE;IAAiC,kCAAgC;IAAhC,yCAAgC;QAAhC,+BAAgC;YAAhC,iCAAgC;GAAK;EACtE;IAAiC,qCAA8B;IAA9B,uCAA8B;QAA9B,kCAA8B;YAA9B,+BAA8B;GAAK;EACpE;IAAiC,uCAAgC;IAAhC,yCAAgC;QAAhC,oCAAgC;YAAhC,iCAAgC;GAAK;EACtE;IAAiC,sCAA+B;IAA/B,wCAA+B;QAA/B,mCAA+B;YAA/B,gCAA+B;GAAK;EAErE;IAAkC,6CAAoC;QAApC,qCAAoC;YAApC,qCAAoC;GAAK;EAC3E;IAAkC,2CAAkC;QAAlC,mCAAkC;YAAlC,mCAAkC;GAAK;EACzE;IAAkC,yCAAgC;QAAhC,sCAAgC;YAAhC,iCAAgC;GAAK;EACvE;IAAkC,gDAAuC;QAAvC,uCAAuC;YAAvC,wCAAuC;GAAK;EAC9E;IAAkC,+CAAsC;QAAtC,0CAAsC;YAAtC,uCAAsC;GAAK;EAC7E;IAAkC,0CAAiC;QAAjC,uCAAiC;YAAjC,kCAAiC;GAAK;EAExE;IAAgC,oCAA2B;QAA3B,qCAA2B;gBAA3B,oCAA2B;YAA3B,4BAA2B;GAAK;EAChE;IAAgC,0CAAiC;QAAjC,sCAAiC;YAAjC,kCAAiC;GAAK;EACtE;IAAgC,wCAA+B;QAA/B,oCAA+B;YAA/B,gCAA+B;GAAK;EACpE;IAAgC,sCAA6B;QAA7B,uCAA6B;gBAA7B,sCAA6B;YAA7B,8BAA6B;GAAK;EAClE;IAAgC,wCAA+B;QAA/B,yCAA+B;YAA/B,gCAA+B;GAAK;EACpE;IAAgC,uCAA8B;QAA9B,wCAA8B;gBAA9B,uCAA8B;YAA9B,+BAA8B;GAAK;CzDohLtE;;AazgLG;E4ChDA;IAAwB,6BAAS;IAAT,kBAAS;QAAT,mBAAS;YAAT,UAAS;GAAK;EACtC;IAAwB,6BAAQ;IAAR,iBAAQ;QAAR,kBAAQ;YAAR,SAAQ;GAAK;EACrC;IAAwB,6BAAQ;IAAR,iBAAQ;QAAR,kBAAQ;YAAR,SAAQ;GAAK;EAErC;IAAgC,0CAA8B;IAA9B,yCAA8B;IAA9B,uCAA8B;QAA9B,mCAA8B;YAA9B,+BAA8B;GAAK;EACnE;IAAgC,wCAAiC;IAAjC,yCAAiC;IAAjC,0CAAiC;QAAjC,sCAAiC;YAAjC,kCAAiC;GAAK;EACtE;IAAgC,0CAAsC;IAAtC,0CAAsC;IAAtC,+CAAsC;QAAtC,2CAAsC;YAAtC,uCAAsC;GAAK;EAC3E;IAAgC,wCAAyC;IAAzC,0CAAyC;IAAzC,kDAAyC;QAAzC,8CAAyC;YAAzC,0CAAyC;GAAK;EAE9E;IAA8B,mCAA0B;QAA1B,+BAA0B;YAA1B,2BAA0B;GAAK;EAC7D;IAA8B,qCAA4B;QAA5B,iCAA4B;YAA5B,6BAA4B;GAAK;EAC/D;IAA8B,2CAAkC;QAAlC,uCAAkC;YAAlC,mCAAkC;GAAK;EAErE;IAAoC,mCAAsC;IAAtC,+CAAsC;QAAtC,gCAAsC;YAAtC,uCAAsC;GAAK;EAC/E;IAAoC,iCAAoC;IAApC,6CAAoC;QAApC,8BAAoC;YAApC,qCAAoC;GAAK;EAC7E;IAAoC,oCAAkC;IAAlC,2CAAkC;QAAlC,iCAAkC;YAAlC,mCAAkC;GAAK;EAC3E;IAAoC,qCAAyC;IAAzC,kDAAyC;QAAzC,kCAAyC;YAAzC,0CAAyC;GAAK;EAClF;IAAoC,iDAAwC;QAAxC,qCAAwC;YAAxC,yCAAwC;GAAK;EAEjF;IAAiC,oCAAkC;IAAlC,2CAAkC;QAAlC,iCAAkC;YAAlC,mCAAkC;GAAK;EACxE;IAAiC,kCAAgC;IAAhC,yCAAgC;QAAhC,+BAAgC;YAAhC,iCAAgC;GAAK;EACtE;IAAiC,qCAA8B;IAA9B,uCAA8B;QAA9B,kCAA8B;YAA9B,+BAA8B;GAAK;EACpE;IAAiC,uCAAgC;IAAhC,yCAAgC;QAAhC,oCAAgC;YAAhC,iCAAgC;GAAK;EACtE;IAAiC,sCAA+B;IAA/B,wCAA+B;QAA/B,mCAA+B;YAA/B,gCAA+B;GAAK;EAErE;IAAkC,6CAAoC;QAApC,qCAAoC;YAApC,qCAAoC;GAAK;EAC3E;IAAkC,2CAAkC;QAAlC,mCAAkC;YAAlC,mCAAkC;GAAK;EACzE;IAAkC,yCAAgC;QAAhC,sCAAgC;YAAhC,iCAAgC;GAAK;EACvE;IAAkC,gDAAuC;QAAvC,uCAAuC;YAAvC,wCAAuC;GAAK;EAC9E;IAAkC,+CAAsC;QAAtC,0CAAsC;YAAtC,uCAAsC;GAAK;EAC7E;IAAkC,0CAAiC;QAAjC,uCAAiC;YAAjC,kCAAiC;GAAK;EAExE;IAAgC,oCAA2B;QAA3B,qCAA2B;gBAA3B,oCAA2B;YAA3B,4BAA2B;GAAK;EAChE;IAAgC,0CAAiC;QAAjC,sCAAiC;YAAjC,kCAAiC;GAAK;EACtE;IAAgC,wCAA+B;QAA/B,oCAA+B;YAA/B,gCAA+B;GAAK;EACpE;IAAgC,sCAA6B;QAA7B,uCAA6B;gBAA7B,sCAA6B;YAA7B,8BAA6B;GAAK;EAClE;IAAgC,wCAA+B;QAA/B,yCAA+B;YAA/B,gCAA+B;GAAK;EACpE;IAAgC,uCAA8B;QAA9B,wCAA8B;gBAA9B,uCAA8B;YAA9B,+BAA8B;GAAK;CzDunLtE;;Aa5mLG;E4ChDA;IAAwB,6BAAS;IAAT,kBAAS;QAAT,mBAAS;YAAT,UAAS;GAAK;EACtC;IAAwB,6BAAQ;IAAR,iBAAQ;QAAR,kBAAQ;YAAR,SAAQ;GAAK;EACrC;IAAwB,6BAAQ;IAAR,iBAAQ;QAAR,kBAAQ;YAAR,SAAQ;GAAK;EAErC;IAAgC,0CAA8B;IAA9B,yCAA8B;IAA9B,uCAA8B;QAA9B,mCAA8B;YAA9B,+BAA8B;GAAK;EACnE;IAAgC,wCAAiC;IAAjC,yCAAiC;IAAjC,0CAAiC;QAAjC,sCAAiC;YAAjC,kCAAiC;GAAK;EACtE;IAAgC,0CAAsC;IAAtC,0CAAsC;IAAtC,+CAAsC;QAAtC,2CAAsC;YAAtC,uCAAsC;GAAK;EAC3E;IAAgC,wCAAyC;IAAzC,0CAAyC;IAAzC,kDAAyC;QAAzC,8CAAyC;YAAzC,0CAAyC;GAAK;EAE9E;IAA8B,mCAA0B;QAA1B,+BAA0B;YAA1B,2BAA0B;GAAK;EAC7D;IAA8B,qCAA4B;QAA5B,iCAA4B;YAA5B,6BAA4B;GAAK;EAC/D;IAA8B,2CAAkC;QAAlC,uCAAkC;YAAlC,mCAAkC;GAAK;EAErE;IAAoC,mCAAsC;IAAtC,+CAAsC;QAAtC,gCAAsC;YAAtC,uCAAsC;GAAK;EAC/E;IAAoC,iCAAoC;IAApC,6CAAoC;QAApC,8BAAoC;YAApC,qCAAoC;GAAK;EAC7E;IAAoC,oCAAkC;IAAlC,2CAAkC;QAAlC,iCAAkC;YAAlC,mCAAkC;GAAK;EAC3E;IAAoC,qCAAyC;IAAzC,kDAAyC;QAAzC,kCAAyC;YAAzC,0CAAyC;GAAK;EAClF;IAAoC,iDAAwC;QAAxC,qCAAwC;YAAxC,yCAAwC;GAAK;EAEjF;IAAiC,oCAAkC;IAAlC,2CAAkC;QAAlC,iCAAkC;YAAlC,mCAAkC;GAAK;EACxE;IAAiC,kCAAgC;IAAhC,yCAAgC;QAAhC,+BAAgC;YAAhC,iCAAgC;GAAK;EACtE;IAAiC,qCAA8B;IAA9B,uCAA8B;QAA9B,kCAA8B;YAA9B,+BAA8B;GAAK;EACpE;IAAiC,uCAAgC;IAAhC,yCAAgC;QAAhC,oCAAgC;YAAhC,iCAAgC;GAAK;EACtE;IAAiC,sCAA+B;IAA/B,wCAA+B;QAA/B,mCAA+B;YAA/B,gCAA+B;GAAK;EAErE;IAAkC,6CAAoC;QAApC,qCAAoC;YAApC,qCAAoC;GAAK;EAC3E;IAAkC,2CAAkC;QAAlC,mCAAkC;YAAlC,mCAAkC;GAAK;EACzE;IAAkC,yCAAgC;QAAhC,sCAAgC;YAAhC,iCAAgC;GAAK;EACvE;IAAkC,gDAAuC;QAAvC,uCAAuC;YAAvC,wCAAuC;GAAK;EAC9E;IAAkC,+CAAsC;QAAtC,0CAAsC;YAAtC,uCAAsC;GAAK;EAC7E;IAAkC,0CAAiC;QAAjC,uCAAiC;YAAjC,kCAAiC;GAAK;EAExE;IAAgC,oCAA2B;QAA3B,qCAA2B;gBAA3B,oCAA2B;YAA3B,4BAA2B;GAAK;EAChE;IAAgC,0CAAiC;QAAjC,sCAAiC;YAAjC,kCAAiC;GAAK;EACtE;IAAgC,wCAA+B;QAA/B,oCAA+B;YAA/B,gCAA+B;GAAK;EACpE;IAAgC,sCAA6B;QAA7B,uCAA6B;gBAA7B,sCAA6B;YAA7B,8BAA6B;GAAK;EAClE;IAAgC,wCAA+B;QAA/B,yCAA+B;YAA/B,gCAA+B;GAAK;EACpE;IAAgC,uCAA8B;QAA9B,wCAA8B;gBAA9B,uCAA8B;YAA9B,+BAA8B;GAAK;CzD0tLtE;;Aa/sLG;E4ChDA;IAAwB,6BAAS;IAAT,kBAAS;QAAT,mBAAS;YAAT,UAAS;GAAK;EACtC;IAAwB,6BAAQ;IAAR,iBAAQ;QAAR,kBAAQ;YAAR,SAAQ;GAAK;EACrC;IAAwB,6BAAQ;IAAR,iBAAQ;QAAR,kBAAQ;YAAR,SAAQ;GAAK;EAErC;IAAgC,0CAA8B;IAA9B,yCAA8B;IAA9B,uCAA8B;QAA9B,mCAA8B;YAA9B,+BAA8B;GAAK;EACnE;IAAgC,wCAAiC;IAAjC,yCAAiC;IAAjC,0CAAiC;QAAjC,sCAAiC;YAAjC,kCAAiC;GAAK;EACtE;IAAgC,0CAAsC;IAAtC,0CAAsC;IAAtC,+CAAsC;QAAtC,2CAAsC;YAAtC,uCAAsC;GAAK;EAC3E;IAAgC,wCAAyC;IAAzC,0CAAyC;IAAzC,kDAAyC;QAAzC,8CAAyC;YAAzC,0CAAyC;GAAK;EAE9E;IAA8B,mCAA0B;QAA1B,+BAA0B;YAA1B,2BAA0B;GAAK;EAC7D;IAA8B,qCAA4B;QAA5B,iCAA4B;YAA5B,6BAA4B;GAAK;EAC/D;IAA8B,2CAAkC;QAAlC,uCAAkC;YAAlC,mCAAkC;GAAK;EAErE;IAAoC,mCAAsC;IAAtC,+CAAsC;QAAtC,gCAAsC;YAAtC,uCAAsC;GAAK;EAC/E;IAAoC,iCAAoC;IAApC,6CAAoC;QAApC,8BAAoC;YAApC,qCAAoC;GAAK;EAC7E;IAAoC,oCAAkC;IAAlC,2CAAkC;QAAlC,iCAAkC;YAAlC,mCAAkC;GAAK;EAC3E;IAAoC,qCAAyC;IAAzC,kDAAyC;QAAzC,kCAAyC;YAAzC,0CAAyC;GAAK;EAClF;IAAoC,iDAAwC;QAAxC,qCAAwC;YAAxC,yCAAwC;GAAK;EAEjF;IAAiC,oCAAkC;IAAlC,2CAAkC;QAAlC,iCAAkC;YAAlC,mCAAkC;GAAK;EACxE;IAAiC,kCAAgC;IAAhC,yCAAgC;QAAhC,+BAAgC;YAAhC,iCAAgC;GAAK;EACtE;IAAiC,qCAA8B;IAA9B,uCAA8B;QAA9B,kCAA8B;YAA9B,+BAA8B;GAAK;EACpE;IAAiC,uCAAgC;IAAhC,yCAAgC;QAAhC,oCAAgC;YAAhC,iCAAgC;GAAK;EACtE;IAAiC,sCAA+B;IAA/B,wCAA+B;QAA/B,mCAA+B;YAA/B,gCAA+B;GAAK;EAErE;IAAkC,6CAAoC;QAApC,qCAAoC;YAApC,qCAAoC;GAAK;EAC3E;IAAkC,2CAAkC;QAAlC,mCAAkC;YAAlC,mCAAkC;GAAK;EACzE;IAAkC,yCAAgC;QAAhC,sCAAgC;YAAhC,iCAAgC;GAAK;EACvE;IAAkC,gDAAuC;QAAvC,uCAAuC;YAAvC,wCAAuC;GAAK;EAC9E;IAAkC,+CAAsC;QAAtC,0CAAsC;YAAtC,uCAAsC;GAAK;EAC7E;IAAkC,0CAAiC;QAAjC,uCAAiC;YAAjC,kCAAiC;GAAK;EAExE;IAAgC,oCAA2B;QAA3B,qCAA2B;gBAA3B,oCAA2B;YAA3B,4BAA2B;GAAK;EAChE;IAAgC,0CAAiC;QAAjC,sCAAiC;YAAjC,kCAAiC;GAAK;EACtE;IAAgC,wCAA+B;QAA/B,oCAA+B;YAA/B,gCAA+B;GAAK;EACpE;IAAgC,sCAA6B;QAA7B,uCAA6B;gBAA7B,sCAA6B;YAA7B,8BAA6B;GAAK;EAClE;IAAgC,wCAA+B;QAA/B,yCAA+B;YAA/B,gCAA+B;GAAK;EACpE;IAAgC,uCAA8B;QAA9B,wCAA8B;gBAA9B,uCAA8B;YAA9B,+BAA8B;GAAK;CzD6zLtE;;A0Dt2LG;ECHF,uBAAsB;CDG2B;;AAC/C;ECDF,wBAAuB;CDC2B;;AAChD;ECCF,uBAAsB;CDD2B;;A7CkD/C;E6CpDA;ICHF,uBAAsB;GDG2B;EAC/C;ICDF,wBAAuB;GDC2B;EAChD;ICCF,uBAAsB;GDD2B;C1D43LlD;;Aa10LG;E6CpDA;ICHF,uBAAsB;GDG2B;EAC/C;ICDF,wBAAuB;GDC2B;EAChD;ICCF,uBAAsB;GDD2B;C1Dw4LlD;;Aat1LG;E6CpDA;ICHF,uBAAsB;GDG2B;EAC/C;ICDF,wBAAuB;GDC2B;EAChD;ICCF,uBAAsB;GDD2B;C1Do5LlD;;Aal2LG;E6CpDA;ICHF,uBAAsB;GDG2B;EAC/C;ICDF,wBAAuB;GDC2B;EAChD;ICCF,uBAAsB;GDD2B;C1Dg6LlD;;A4Dp6LD;EACE,gBAAe;EACf,OAAM;EACN,SAAQ;EACR,QAAO;EACP,c1DwiB8B;C0DviB/B;;AAED;EACE,gBAAe;EACf,SAAQ;EACR,UAAS;EACT,QAAO;EACP,c1DgiB8B;C0D/hB/B;;AAED;EACE,yBAAgB;EAAhB,iBAAgB;EAChB,OAAM;EACN,c1DyhB8B;C0DxhB/B;;AClBD;ECEE,mBAAkB;EAClB,WAAU;EACV,YAAW;EACX,WAAU;EACV,iBAAgB;EAChB,uBAAmB;EACnB,oBAAmB;EACnB,8BAAqB;UAArB,sBAAqB;EACrB,UAAS;CDRV;;ACkBC;EAEE,iBAAgB;EAChB,YAAW;EACX,aAAY;EACZ,kBAAiB;EACjB,WAAU;EACV,oBAAmB;EACnB,wBAAe;UAAf,gBAAe;CAChB;;AC7BC;EAAuB,sBAA4B;CAAI;;AAAvD;EAAuB,sBAA4B;CAAI;;AAAvD;EAAuB,sBAA4B;CAAI;;AAAvD;EAAuB,uBAA4B;CAAI;;AAAvD;EAAuB,uBAA4B;CAAI;;AAAvD;EAAuB,uBAA4B;CAAI;;AAAvD;EAAuB,uBAA4B;CAAI;;AAAvD;EAAuB,wBAA4B;CAAI;;AAI3D;EAAU,2BAA0B;CAAK;;AACzC;EAAU,4BAA2B;CAAK;;ACAlC;EAAiC,qBAAmC;CAAI;;AACxE;EAAiC,yBAAuC;CAAI;;AAC5E;EAAiC,2BAAyC;CAAI;;AAC9E;EAAiC,4BAA0C;CAAI;;AAC/E;EAAiC,0BAAwC;CAAI;;AAC7E;EACE,2BAAwC;EACxC,0BAAuC;CACxC;;AACD;EACE,yBAAuC;EACvC,4BAA0C;CAC3C;;AAZD;EAAiC,2BAAmC;CAAI;;AACxE;EAAiC,+BAAuC;CAAI;;AAC5E;EAAiC,iCAAyC;CAAI;;AAC9E;EAAiC,kCAA0C;CAAI;;AAC/E;EAAiC,gCAAwC;CAAI;;AAC7E;EACE,iCAAwC;EACxC,gCAAuC;CACxC;;AACD;EACE,+BAAuC;EACvC,kCAA0C;CAC3C;;AAZD;EAAiC,0BAAmC;CAAI;;AACxE;EAAiC,8BAAuC;CAAI;;AAC5E;EAAiC,gCAAyC;CAAI;;AAC9E;EAAiC,iCAA0C;CAAI;;AAC/E;EAAiC,+BAAwC;CAAI;;AAC7E;EACE,gCAAwC;EACxC,+BAAuC;CACxC;;AACD;EACE,8BAAuC;EACvC,iCAA0C;CAC3C;;AAZD;EAAiC,wBAAmC;CAAI;;AACxE;EAAiC,4BAAuC;CAAI;;AAC5E;EAAiC,8BAAyC;CAAI;;AAC9E;EAAiC,+BAA0C;CAAI;;AAC/E;EAAiC,6BAAwC;CAAI;;AAC7E;EACE,8BAAwC;EACxC,6BAAuC;CACxC;;AACD;EACE,4BAAuC;EACvC,+BAA0C;CAC3C;;AAZD;EAAiC,0BAAmC;CAAI;;AACxE;EAAiC,8BAAuC;CAAI;;AAC5E;EAAiC,gCAAyC;CAAI;;AAC9E;EAAiC,iCAA0C;CAAI;;AAC/E;EAAiC,+BAAwC;CAAI;;AAC7E;EACE,gCAAwC;EACxC,+BAAuC;CACxC;;AACD;EACE,8BAAuC;EACvC,iCAA0C;CAC3C;;AAZD;EAAiC,wBAAmC;CAAI;;AACxE;EAAiC,4BAAuC;CAAI;;AAC5E;EAAiC,8BAAyC;CAAI;;AAC9E;EAAiC,+BAA0C;CAAI;;AAC/E;EAAiC,6BAAwC;CAAI;;AAC7E;EACE,8BAAwC;EACxC,6BAAuC;CACxC;;AACD;EACE,4BAAuC;EACvC,+BAA0C;CAC3C;;AAZD;EAAiC,sBAAmC;CAAI;;AACxE;EAAiC,0BAAuC;CAAI;;AAC5E;EAAiC,4BAAyC;CAAI;;AAC9E;EAAiC,6BAA0C;CAAI;;AAC/E;EAAiC,2BAAwC;CAAI;;AAC7E;EACE,4BAAwC;EACxC,2BAAuC;CACxC;;AACD;EACE,0BAAuC;EACvC,6BAA0C;CAC3C;;AAZD;EAAiC,4BAAmC;CAAI;;AACxE;EAAiC,gCAAuC;CAAI;;AAC5E;EAAiC,kCAAyC;CAAI;;AAC9E;EAAiC,mCAA0C;CAAI;;AAC/E;EAAiC,iCAAwC;CAAI;;AAC7E;EACE,kCAAwC;EACxC,iCAAuC;CACxC;;AACD;EACE,gCAAuC;EACvC,mCAA0C;CAC3C;;AAZD;EAAiC,2BAAmC;CAAI;;AACxE;EAAiC,+BAAuC;CAAI;;AAC5E;EAAiC,iCAAyC;CAAI;;AAC9E;EAAiC,kCAA0C;CAAI;;AAC/E;EAAiC,gCAAwC;CAAI;;AAC7E;EACE,iCAAwC;EACxC,gCAAuC;CACxC;;AACD;EACE,+BAAuC;EACvC,kCAA0C;CAC3C;;AAZD;EAAiC,yBAAmC;CAAI;;AACxE;EAAiC,6BAAuC;CAAI;;AAC5E;EAAiC,+BAAyC;CAAI;;AAC9E;EAAiC,gCAA0C;CAAI;;AAC/E;EAAiC,8BAAwC;CAAI;;AAC7E;EACE,+BAAwC;EACxC,8BAAuC;CACxC;;AACD;EACE,6BAAuC;EACvC,gCAA0C;CAC3C;;AAZD;EAAiC,2BAAmC;CAAI;;AACxE;EAAiC,+BAAuC;CAAI;;AAC5E;EAAiC,iCAAyC;CAAI;;AAC9E;EAAiC,kCAA0C;CAAI;;AAC/E;EAAiC,gCAAwC;CAAI;;AAC7E;EACE,iCAAwC;EACxC,gCAAuC;CACxC;;AACD;EACE,+BAAuC;EACvC,kCAA0C;CAC3C;;AAZD;EAAiC,yBAAmC;CAAI;;AACxE;EAAiC,6BAAuC;CAAI;;AAC5E;EAAiC,+BAAyC;CAAI;;AAC9E;EAAiC,gCAA0C;CAAI;;AAC/E;EAAiC,8BAAwC;CAAI;;AAC7E;EACE,+BAAwC;EACxC,8BAAuC;CACxC;;AACD;EACE,6BAAuC;EACvC,gCAA0C;CAC3C;;AAKL;EAAoB,wBAA8B;CAAK;;AACvD;EAAoB,4BAA8B;CAAK;;AACvD;EAAoB,8BAA8B;CAAK;;AACvD;EAAoB,+BAA8B;CAAK;;AACvD;EAAoB,6BAA8B;CAAK;;AACvD;EACE,8BAA6B;EAC7B,6BAA6B;CAC9B;;AACD;EACE,4BAA8B;EAC9B,+BAA8B;CAC/B;;AnDkBD;EmD/CI;IAAiC,qBAAmC;GAAI;EACxE;IAAiC,yBAAuC;GAAI;EAC5E;IAAiC,2BAAyC;GAAI;EAC9E;IAAiC,4BAA0C;GAAI;EAC/E;IAAiC,0BAAwC;GAAI;EAC7E;IACE,2BAAwC;IACxC,0BAAuC;GACxC;EACD;IACE,yBAAuC;IACvC,4BAA0C;GAC3C;EAZD;IAAiC,2BAAmC;GAAI;EACxE;IAAiC,+BAAuC;GAAI;EAC5E;IAAiC,iCAAyC;GAAI;EAC9E;IAAiC,kCAA0C;GAAI;EAC/E;IAAiC,gCAAwC;GAAI;EAC7E;IACE,iCAAwC;IACxC,gCAAuC;GACxC;EACD;IACE,+BAAuC;IACvC,kCAA0C;GAC3C;EAZD;IAAiC,0BAAmC;GAAI;EACxE;IAAiC,8BAAuC;GAAI;EAC5E;IAAiC,gCAAyC;GAAI;EAC9E;IAAiC,iCAA0C;GAAI;EAC/E;IAAiC,+BAAwC;GAAI;EAC7E;IACE,gCAAwC;IACxC,+BAAuC;GACxC;EACD;IACE,8BAAuC;IACvC,iCAA0C;GAC3C;EAZD;IAAiC,wBAAmC;GAAI;EACxE;IAAiC,4BAAuC;GAAI;EAC5E;IAAiC,8BAAyC;GAAI;EAC9E;IAAiC,+BAA0C;GAAI;EAC/E;IAAiC,6BAAwC;GAAI;EAC7E;IACE,8BAAwC;IACxC,6BAAuC;GACxC;EACD;IACE,4BAAuC;IACvC,+BAA0C;GAC3C;EAZD;IAAiC,0BAAmC;GAAI;EACxE;IAAiC,8BAAuC;GAAI;EAC5E;IAAiC,gCAAyC;GAAI;EAC9E;IAAiC,iCAA0C;GAAI;EAC/E;IAAiC,+BAAwC;GAAI;EAC7E;IACE,gCAAwC;IACxC,+BAAuC;GACxC;EACD;IACE,8BAAuC;IACvC,iCAA0C;GAC3C;EAZD;IAAiC,wBAAmC;GAAI;EACxE;IAAiC,4BAAuC;GAAI;EAC5E;IAAiC,8BAAyC;GAAI;EAC9E;IAAiC,+BAA0C;GAAI;EAC/E;IAAiC,6BAAwC;GAAI;EAC7E;IACE,8BAAwC;IACxC,6BAAuC;GACxC;EACD;IACE,4BAAuC;IACvC,+BAA0C;GAC3C;EAZD;IAAiC,sBAAmC;GAAI;EACxE;IAAiC,0BAAuC;GAAI;EAC5E;IAAiC,4BAAyC;GAAI;EAC9E;IAAiC,6BAA0C;GAAI;EAC/E;IAAiC,2BAAwC;GAAI;EAC7E;IACE,4BAAwC;IACxC,2BAAuC;GACxC;EACD;IACE,0BAAuC;IACvC,6BAA0C;GAC3C;EAZD;IAAiC,4BAAmC;GAAI;EACxE;IAAiC,gCAAuC;GAAI;EAC5E;IAAiC,kCAAyC;GAAI;EAC9E;IAAiC,mCAA0C;GAAI;EAC/E;IAAiC,iCAAwC;GAAI;EAC7E;IACE,kCAAwC;IACxC,iCAAuC;GACxC;EACD;IACE,gCAAuC;IACvC,mCAA0C;GAC3C;EAZD;IAAiC,2BAAmC;GAAI;EACxE;IAAiC,+BAAuC;GAAI;EAC5E;IAAiC,iCAAyC;GAAI;EAC9E;IAAiC,kCAA0C;GAAI;EAC/E;IAAiC,gCAAwC;GAAI;EAC7E;IACE,iCAAwC;IACxC,gCAAuC;GACxC;EACD;IACE,+BAAuC;IACvC,kCAA0C;GAC3C;EAZD;IAAiC,yBAAmC;GAAI;EACxE;IAAiC,6BAAuC;GAAI;EAC5E;IAAiC,+BAAyC;GAAI;EAC9E;IAAiC,gCAA0C;GAAI;EAC/E;IAAiC,8BAAwC;GAAI;EAC7E;IACE,+BAAwC;IACxC,8BAAuC;GACxC;EACD;IACE,6BAAuC;IACvC,gCAA0C;GAC3C;EAZD;IAAiC,2BAAmC;GAAI;EACxE;IAAiC,+BAAuC;GAAI;EAC5E;IAAiC,iCAAyC;GAAI;EAC9E;IAAiC,kCAA0C;GAAI;EAC/E;IAAiC,gCAAwC;GAAI;EAC7E;IACE,iCAAwC;IACxC,gCAAuC;GACxC;EACD;IACE,+BAAuC;IACvC,kCAA0C;GAC3C;EAZD;IAAiC,yBAAmC;GAAI;EACxE;IAAiC,6BAAuC;GAAI;EAC5E;IAAiC,+BAAyC;GAAI;EAC9E;IAAiC,gCAA0C;GAAI;EAC/E;IAAiC,8BAAwC;GAAI;EAC7E;IACE,+BAAwC;IACxC,8BAAuC;GACxC;EACD;IACE,6BAAuC;IACvC,gCAA0C;GAC3C;EAKL;IAAoB,wBAA8B;GAAK;EACvD;IAAoB,4BAA8B;GAAK;EACvD;IAAoB,8BAA8B;GAAK;EACvD;IAAoB,+BAA8B;GAAK;EACvD;IAAoB,6BAA8B;GAAK;EACvD;IACE,8BAA6B;IAC7B,6BAA6B;GAC9B;EACD;IACE,4BAA8B;IAC9B,+BAA8B;GAC/B;ChEwoNJ;;AatnNG;EmD/CI;IAAiC,qBAAmC;GAAI;EACxE;IAAiC,yBAAuC;GAAI;EAC5E;IAAiC,2BAAyC;GAAI;EAC9E;IAAiC,4BAA0C;GAAI;EAC/E;IAAiC,0BAAwC;GAAI;EAC7E;IACE,2BAAwC;IACxC,0BAAuC;GACxC;EACD;IACE,yBAAuC;IACvC,4BAA0C;GAC3C;EAZD;IAAiC,2BAAmC;GAAI;EACxE;IAAiC,+BAAuC;GAAI;EAC5E;IAAiC,iCAAyC;GAAI;EAC9E;IAAiC,kCAA0C;GAAI;EAC/E;IAAiC,gCAAwC;GAAI;EAC7E;IACE,iCAAwC;IACxC,gCAAuC;GACxC;EACD;IACE,+BAAuC;IACvC,kCAA0C;GAC3C;EAZD;IAAiC,0BAAmC;GAAI;EACxE;IAAiC,8BAAuC;GAAI;EAC5E;IAAiC,gCAAyC;GAAI;EAC9E;IAAiC,iCAA0C;GAAI;EAC/E;IAAiC,+BAAwC;GAAI;EAC7E;IACE,gCAAwC;IACxC,+BAAuC;GACxC;EACD;IACE,8BAAuC;IACvC,iCAA0C;GAC3C;EAZD;IAAiC,wBAAmC;GAAI;EACxE;IAAiC,4BAAuC;GAAI;EAC5E;IAAiC,8BAAyC;GAAI;EAC9E;IAAiC,+BAA0C;GAAI;EAC/E;IAAiC,6BAAwC;GAAI;EAC7E;IACE,8BAAwC;IACxC,6BAAuC;GACxC;EACD;IACE,4BAAuC;IACvC,+BAA0C;GAC3C;EAZD;IAAiC,0BAAmC;GAAI;EACxE;IAAiC,8BAAuC;GAAI;EAC5E;IAAiC,gCAAyC;GAAI;EAC9E;IAAiC,iCAA0C;GAAI;EAC/E;IAAiC,+BAAwC;GAAI;EAC7E;IACE,gCAAwC;IACxC,+BAAuC;GACxC;EACD;IACE,8BAAuC;IACvC,iCAA0C;GAC3C;EAZD;IAAiC,wBAAmC;GAAI;EACxE;IAAiC,4BAAuC;GAAI;EAC5E;IAAiC,8BAAyC;GAAI;EAC9E;IAAiC,+BAA0C;GAAI;EAC/E;IAAiC,6BAAwC;GAAI;EAC7E;IACE,8BAAwC;IACxC,6BAAuC;GACxC;EACD;IACE,4BAAuC;IACvC,+BAA0C;GAC3C;EAZD;IAAiC,sBAAmC;GAAI;EACxE;IAAiC,0BAAuC;GAAI;EAC5E;IAAiC,4BAAyC;GAAI;EAC9E;IAAiC,6BAA0C;GAAI;EAC/E;IAAiC,2BAAwC;GAAI;EAC7E;IACE,4BAAwC;IACxC,2BAAuC;GACxC;EACD;IACE,0BAAuC;IACvC,6BAA0C;GAC3C;EAZD;IAAiC,4BAAmC;GAAI;EACxE;IAAiC,gCAAuC;GAAI;EAC5E;IAAiC,kCAAyC;GAAI;EAC9E;IAAiC,mCAA0C;GAAI;EAC/E;IAAiC,iCAAwC;GAAI;EAC7E;IACE,kCAAwC;IACxC,iCAAuC;GACxC;EACD;IACE,gCAAuC;IACvC,mCAA0C;GAC3C;EAZD;IAAiC,2BAAmC;GAAI;EACxE;IAAiC,+BAAuC;GAAI;EAC5E;IAAiC,iCAAyC;GAAI;EAC9E;IAAiC,kCAA0C;GAAI;EAC/E;IAAiC,gCAAwC;GAAI;EAC7E;IACE,iCAAwC;IACxC,gCAAuC;GACxC;EACD;IACE,+BAAuC;IACvC,kCAA0C;GAC3C;EAZD;IAAiC,yBAAmC;GAAI;EACxE;IAAiC,6BAAuC;GAAI;EAC5E;IAAiC,+BAAyC;GAAI;EAC9E;IAAiC,gCAA0C;GAAI;EAC/E;IAAiC,8BAAwC;GAAI;EAC7E;IACE,+BAAwC;IACxC,8BAAuC;GACxC;EACD;IACE,6BAAuC;IACvC,gCAA0C;GAC3C;EAZD;IAAiC,2BAAmC;GAAI;EACxE;IAAiC,+BAAuC;GAAI;EAC5E;IAAiC,iCAAyC;GAAI;EAC9E;IAAiC,kCAA0C;GAAI;EAC/E;IAAiC,gCAAwC;GAAI;EAC7E;IACE,iCAAwC;IACxC,gCAAuC;GACxC;EACD;IACE,+BAAuC;IACvC,kCAA0C;GAC3C;EAZD;IAAiC,yBAAmC;GAAI;EACxE;IAAiC,6BAAuC;GAAI;EAC5E;IAAiC,+BAAyC;GAAI;EAC9E;IAAiC,gCAA0C;GAAI;EAC/E;IAAiC,8BAAwC;GAAI;EAC7E;IACE,+BAAwC;IACxC,8BAAuC;GACxC;EACD;IACE,6BAAuC;IACvC,gCAA0C;GAC3C;EAKL;IAAoB,wBAA8B;GAAK;EACvD;IAAoB,4BAA8B;GAAK;EACvD;IAAoB,8BAA8B;GAAK;EACvD;IAAoB,+BAA8B;GAAK;EACvD;IAAoB,6BAA8B;GAAK;EACvD;IACE,8BAA6B;IAC7B,6BAA6B;GAC9B;EACD;IACE,4BAA8B;IAC9B,+BAA8B;GAC/B;ChEs7NJ;;Aap6NG;EmD/CI;IAAiC,qBAAmC;GAAI;EACxE;IAAiC,yBAAuC;GAAI;EAC5E;IAAiC,2BAAyC;GAAI;EAC9E;IAAiC,4BAA0C;GAAI;EAC/E;IAAiC,0BAAwC;GAAI;EAC7E;IACE,2BAAwC;IACxC,0BAAuC;GACxC;EACD;IACE,yBAAuC;IACvC,4BAA0C;GAC3C;EAZD;IAAiC,2BAAmC;GAAI;EACxE;IAAiC,+BAAuC;GAAI;EAC5E;IAAiC,iCAAyC;GAAI;EAC9E;IAAiC,kCAA0C;GAAI;EAC/E;IAAiC,gCAAwC;GAAI;EAC7E;IACE,iCAAwC;IACxC,gCAAuC;GACxC;EACD;IACE,+BAAuC;IACvC,kCAA0C;GAC3C;EAZD;IAAiC,0BAAmC;GAAI;EACxE;IAAiC,8BAAuC;GAAI;EAC5E;IAAiC,gCAAyC;GAAI;EAC9E;IAAiC,iCAA0C;GAAI;EAC/E;IAAiC,+BAAwC;GAAI;EAC7E;IACE,gCAAwC;IACxC,+BAAuC;GACxC;EACD;IACE,8BAAuC;IACvC,iCAA0C;GAC3C;EAZD;IAAiC,wBAAmC;GAAI;EACxE;IAAiC,4BAAuC;GAAI;EAC5E;IAAiC,8BAAyC;GAAI;EAC9E;IAAiC,+BAA0C;GAAI;EAC/E;IAAiC,6BAAwC;GAAI;EAC7E;IACE,8BAAwC;IACxC,6BAAuC;GACxC;EACD;IACE,4BAAuC;IACvC,+BAA0C;GAC3C;EAZD;IAAiC,0BAAmC;GAAI;EACxE;IAAiC,8BAAuC;GAAI;EAC5E;IAAiC,gCAAyC;GAAI;EAC9E;IAAiC,iCAA0C;GAAI;EAC/E;IAAiC,+BAAwC;GAAI;EAC7E;IACE,gCAAwC;IACxC,+BAAuC;GACxC;EACD;IACE,8BAAuC;IACvC,iCAA0C;GAC3C;EAZD;IAAiC,wBAAmC;GAAI;EACxE;IAAiC,4BAAuC;GAAI;EAC5E;IAAiC,8BAAyC;GAAI;EAC9E;IAAiC,+BAA0C;GAAI;EAC/E;IAAiC,6BAAwC;GAAI;EAC7E;IACE,8BAAwC;IACxC,6BAAuC;GACxC;EACD;IACE,4BAAuC;IACvC,+BAA0C;GAC3C;EAZD;IAAiC,sBAAmC;GAAI;EACxE;IAAiC,0BAAuC;GAAI;EAC5E;IAAiC,4BAAyC;GAAI;EAC9E;IAAiC,6BAA0C;GAAI;EAC/E;IAAiC,2BAAwC;GAAI;EAC7E;IACE,4BAAwC;IACxC,2BAAuC;GACxC;EACD;IACE,0BAAuC;IACvC,6BAA0C;GAC3C;EAZD;IAAiC,4BAAmC;GAAI;EACxE;IAAiC,gCAAuC;GAAI;EAC5E;IAAiC,kCAAyC;GAAI;EAC9E;IAAiC,mCAA0C;GAAI;EAC/E;IAAiC,iCAAwC;GAAI;EAC7E;IACE,kCAAwC;IACxC,iCAAuC;GACxC;EACD;IACE,gCAAuC;IACvC,mCAA0C;GAC3C;EAZD;IAAiC,2BAAmC;GAAI;EACxE;IAAiC,+BAAuC;GAAI;EAC5E;IAAiC,iCAAyC;GAAI;EAC9E;IAAiC,kCAA0C;GAAI;EAC/E;IAAiC,gCAAwC;GAAI;EAC7E;IACE,iCAAwC;IACxC,gCAAuC;GACxC;EACD;IACE,+BAAuC;IACvC,kCAA0C;GAC3C;EAZD;IAAiC,yBAAmC;GAAI;EACxE;IAAiC,6BAAuC;GAAI;EAC5E;IAAiC,+BAAyC;GAAI;EAC9E;IAAiC,gCAA0C;GAAI;EAC/E;IAAiC,8BAAwC;GAAI;EAC7E;IACE,+BAAwC;IACxC,8BAAuC;GACxC;EACD;IACE,6BAAuC;IACvC,gCAA0C;GAC3C;EAZD;IAAiC,2BAAmC;GAAI;EACxE;IAAiC,+BAAuC;GAAI;EAC5E;IAAiC,iCAAyC;GAAI;EAC9E;IAAiC,kCAA0C;GAAI;EAC/E;IAAiC,gCAAwC;GAAI;EAC7E;IACE,iCAAwC;IACxC,gCAAuC;GACxC;EACD;IACE,+BAAuC;IACvC,kCAA0C;GAC3C;EAZD;IAAiC,yBAAmC;GAAI;EACxE;IAAiC,6BAAuC;GAAI;EAC5E;IAAiC,+BAAyC;GAAI;EAC9E;IAAiC,gCAA0C;GAAI;EAC/E;IAAiC,8BAAwC;GAAI;EAC7E;IACE,+BAAwC;IACxC,8BAAuC;GACxC;EACD;IACE,6BAAuC;IACvC,gCAA0C;GAC3C;EAKL;IAAoB,wBAA8B;GAAK;EACvD;IAAoB,4BAA8B;GAAK;EACvD;IAAoB,8BAA8B;GAAK;EACvD;IAAoB,+BAA8B;GAAK;EACvD;IAAoB,6BAA8B;GAAK;EACvD;IACE,8BAA6B;IAC7B,6BAA6B;GAC9B;EACD;IACE,4BAA8B;IAC9B,+BAA8B;GAC/B;ChEouOJ;;AaltOG;EmD/CI;IAAiC,qBAAmC;GAAI;EACxE;IAAiC,yBAAuC;GAAI;EAC5E;IAAiC,2BAAyC;GAAI;EAC9E;IAAiC,4BAA0C;GAAI;EAC/E;IAAiC,0BAAwC;GAAI;EAC7E;IACE,2BAAwC;IACxC,0BAAuC;GACxC;EACD;IACE,yBAAuC;IACvC,4BAA0C;GAC3C;EAZD;IAAiC,2BAAmC;GAAI;EACxE;IAAiC,+BAAuC;GAAI;EAC5E;IAAiC,iCAAyC;GAAI;EAC9E;IAAiC,kCAA0C;GAAI;EAC/E;IAAiC,gCAAwC;GAAI;EAC7E;IACE,iCAAwC;IACxC,gCAAuC;GACxC;EACD;IACE,+BAAuC;IACvC,kCAA0C;GAC3C;EAZD;IAAiC,0BAAmC;GAAI;EACxE;IAAiC,8BAAuC;GAAI;EAC5E;IAAiC,gCAAyC;GAAI;EAC9E;IAAiC,iCAA0C;GAAI;EAC/E;IAAiC,+BAAwC;GAAI;EAC7E;IACE,gCAAwC;IACxC,+BAAuC;GACxC;EACD;IACE,8BAAuC;IACvC,iCAA0C;GAC3C;EAZD;IAAiC,wBAAmC;GAAI;EACxE;IAAiC,4BAAuC;GAAI;EAC5E;IAAiC,8BAAyC;GAAI;EAC9E;IAAiC,+BAA0C;GAAI;EAC/E;IAAiC,6BAAwC;GAAI;EAC7E;IACE,8BAAwC;IACxC,6BAAuC;GACxC;EACD;IACE,4BAAuC;IACvC,+BAA0C;GAC3C;EAZD;IAAiC,0BAAmC;GAAI;EACxE;IAAiC,8BAAuC;GAAI;EAC5E;IAAiC,gCAAyC;GAAI;EAC9E;IAAiC,iCAA0C;GAAI;EAC/E;IAAiC,+BAAwC;GAAI;EAC7E;IACE,gCAAwC;IACxC,+BAAuC;GACxC;EACD;IACE,8BAAuC;IACvC,iCAA0C;GAC3C;EAZD;IAAiC,wBAAmC;GAAI;EACxE;IAAiC,4BAAuC;GAAI;EAC5E;IAAiC,8BAAyC;GAAI;EAC9E;IAAiC,+BAA0C;GAAI;EAC/E;IAAiC,6BAAwC;GAAI;EAC7E;IACE,8BAAwC;IACxC,6BAAuC;GACxC;EACD;IACE,4BAAuC;IACvC,+BAA0C;GAC3C;EAZD;IAAiC,sBAAmC;GAAI;EACxE;IAAiC,0BAAuC;GAAI;EAC5E;IAAiC,4BAAyC;GAAI;EAC9E;IAAiC,6BAA0C;GAAI;EAC/E;IAAiC,2BAAwC;GAAI;EAC7E;IACE,4BAAwC;IACxC,2BAAuC;GACxC;EACD;IACE,0BAAuC;IACvC,6BAA0C;GAC3C;EAZD;IAAiC,4BAAmC;GAAI;EACxE;IAAiC,gCAAuC;GAAI;EAC5E;IAAiC,kCAAyC;GAAI;EAC9E;IAAiC,mCAA0C;GAAI;EAC/E;IAAiC,iCAAwC;GAAI;EAC7E;IACE,kCAAwC;IACxC,iCAAuC;GACxC;EACD;IACE,gCAAuC;IACvC,mCAA0C;GAC3C;EAZD;IAAiC,2BAAmC;GAAI;EACxE;IAAiC,+BAAuC;GAAI;EAC5E;IAAiC,iCAAyC;GAAI;EAC9E;IAAiC,kCAA0C;GAAI;EAC/E;IAAiC,gCAAwC;GAAI;EAC7E;IACE,iCAAwC;IACxC,gCAAuC;GACxC;EACD;IACE,+BAAuC;IACvC,kCAA0C;GAC3C;EAZD;IAAiC,yBAAmC;GAAI;EACxE;IAAiC,6BAAuC;GAAI;EAC5E;IAAiC,+BAAyC;GAAI;EAC9E;IAAiC,gCAA0C;GAAI;EAC/E;IAAiC,8BAAwC;GAAI;EAC7E;IACE,+BAAwC;IACxC,8BAAuC;GACxC;EACD;IACE,6BAAuC;IACvC,gCAA0C;GAC3C;EAZD;IAAiC,2BAAmC;GAAI;EACxE;IAAiC,+BAAuC;GAAI;EAC5E;IAAiC,iCAAyC;GAAI;EAC9E;IAAiC,kCAA0C;GAAI;EAC/E;IAAiC,gCAAwC;GAAI;EAC7E;IACE,iCAAwC;IACxC,gCAAuC;GACxC;EACD;IACE,+BAAuC;IACvC,kCAA0C;GAC3C;EAZD;IAAiC,yBAAmC;GAAI;EACxE;IAAiC,6BAAuC;GAAI;EAC5E;IAAiC,+BAAyC;GAAI;EAC9E;IAAiC,gCAA0C;GAAI;EAC/E;IAAiC,8BAAwC;GAAI;EAC7E;IACE,+BAAwC;IACxC,8BAAuC;GACxC;EACD;IACE,6BAAuC;IACvC,gCAA0C;GAC3C;EAKL;IAAoB,wBAA8B;GAAK;EACvD;IAAoB,4BAA8B;GAAK;EACvD;IAAoB,8BAA8B;GAAK;EACvD;IAAoB,+BAA8B;GAAK;EACvD;IAAoB,6BAA8B;GAAK;EACvD;IACE,8BAA6B;IAC7B,6BAA6B;GAC9B;EACD;IACE,4BAA8B;IAC9B,+BAA8B;GAC/B;ChEkhPJ;;AiEljPD;EAAiB,+BAA8B;CAAK;;AACpD;EAAiB,+BAA8B;CAAK;;AACpD;ECJE,iBAAgB;EAChB,wBAAuB;EACvB,oBAAmB;CDEsB;;AAQvC;EAAwB,4BAA2B;CAAK;;AACxD;EAAwB,6BAA4B;CAAK;;AACzD;EAAwB,8BAA6B;CAAK;;ApDsC1D;EoDxCA;IAAwB,4BAA2B;GAAK;EACxD;IAAwB,6BAA4B;GAAK;EACzD;IAAwB,8BAA6B;GAAK;CjE4kP7D;;AatiPG;EoDxCA;IAAwB,4BAA2B;GAAK;EACxD;IAAwB,6BAA4B;GAAK;EACzD;IAAwB,8BAA6B;GAAK;CjEwlP7D;;AaljPG;EoDxCA;IAAwB,4BAA2B;GAAK;EACxD;IAAwB,6BAA4B;GAAK;EACzD;IAAwB,8BAA6B;GAAK;CjEomP7D;;Aa9jPG;EoDxCA;IAAwB,4BAA2B;GAAK;EACxD;IAAwB,6BAA4B;GAAK;EACzD;IAAwB,8BAA6B;GAAK;CjEgnP7D;;AiE1mPD;EAAmB,qCAAoC;CAAK;;AAC5D;EAAmB,qCAAoC;CAAK;;AAC5D;EAAmB,sCAAqC;CAAK;;AAI7D;EAAsB,oB/DiOK;C+DjO+B;;AAC1D;EAAsB,kB/DiOC;C+DjOiC;;AACxD;EAAsB,mBAAkB;CAAK;;AAI7C;EACE,uBAAsB;CACvB;;AEnCC;EACE,0BAAwB;CACzB;;AhEiBC;EgEdE,0BAAqC;ChEiBtC;;AgEtBH;EACE,0BAAwB;CACzB;;AhEiBC;EgEdE,0BAAqC;ChEiBtC;;AgEtBH;EACE,0BAAwB;CACzB;;AhEiBC;EgEdE,0BAAqC;ChEiBtC;;AgEtBH;EACE,0BAAwB;CACzB;;AhEiBC;EgEdE,0BAAqC;ChEiBtC;;AgEtBH;EACE,0BAAwB;CACzB;;AhEiBC;EgEdE,0BAAqC;ChEiBtC;;AgEtBH;EACE,0BAAwB;CACzB;;AhEiBC;EgEdE,0BAAqC;ChEiBtC;;AgEtBH;EACE,0BAAwB;CACzB;;AhEiBC;EgEdE,0BAAqC;ChEiBtC;;A8DiCL;EGxDE,YAAW;EACX,mBAAkB;EAClB,kBAAiB;EACjB,8BAA6B;EAC7B,UAAS;CHsDV;;AIxDD;ECDE,+BAAkC;CDGnC;;AAED;ECLE,8BAAkC;CDOnC","file":"bootstrap.css","sourcesContent":[null,null,"/*!\n * Bootstrap v4.0.0-alpha.6 (https://getbootstrap.com)\n * Copyright 2011-2017 The Bootstrap Authors\n * Copyright 2011-2017 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n@media print {\n *,\n *::before,\n *::after,\n p::first-letter,\n div::first-letter,\n blockquote::first-letter,\n li::first-letter,\n p::first-line,\n div::first-line,\n blockquote::first-line,\n li::first-line {\n text-shadow: none !important;\n box-shadow: none !important;\n }\n a,\n a:visited {\n text-decoration: underline;\n }\n abbr[title]::after {\n content: \" (\" attr(title) \")\";\n }\n pre {\n white-space: pre-wrap !important;\n }\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n .navbar {\n display: none;\n }\n .badge {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #ddd !important;\n }\n}\n\nhtml {\n box-sizing: border-box;\n font-family: sans-serif;\n line-height: 1.15;\n -webkit-text-size-adjust: 100%;\n -ms-text-size-adjust: 100%;\n -ms-overflow-style: scrollbar;\n -webkit-tap-highlight-color: transparent;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: inherit;\n}\n\n@-ms-viewport {\n width: device-width;\n}\n\nbody {\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif;\n font-size: 1rem;\n font-weight: normal;\n line-height: 1.5;\n color: #292b2c;\n background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus {\n outline: none !important;\n}\n\nhr {\n box-sizing: content-box;\n height: 0;\n overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: .5rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n text-decoration: underline;\n text-decoration: underline dotted;\n cursor: help;\n border-bottom: 0;\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: bold;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\ndfn {\n font-style: italic;\n}\n\nb,\nstrong {\n font-weight: bolder;\n}\n\nsmall {\n font-size: 80%;\n}\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -.25em;\n}\n\nsup {\n top: -.5em;\n}\n\na {\n color: #0275d8;\n text-decoration: none;\n background-color: transparent;\n -webkit-text-decoration-skip: objects;\n}\n\na:hover {\n color: #014c8c;\n text-decoration: underline;\n}\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus, a:not([href]):not([tabindex]):hover {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus {\n outline: 0;\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\npre {\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg {\n vertical-align: middle;\n border-style: none;\n}\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\na,\narea,\nbutton,\n[role=\"button\"],\ninput,\nlabel,\nselect,\nsummary,\ntextarea {\n touch-action: manipulation;\n}\n\ntable {\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: 0.75rem;\n padding-bottom: 0.75rem;\n color: #636c72;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n text-align: left;\n}\n\nlabel {\n display: inline-block;\n margin-bottom: .5rem;\n}\n\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible;\n}\n\nbutton,\nselect {\n text-transform: none;\n}\n\nbutton,\nhtml [type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box;\n padding: 0;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto;\n resize: vertical;\n}\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n max-width: 100%;\n padding: 0;\n margin-bottom: .5rem;\n font-size: 1.5rem;\n line-height: inherit;\n color: inherit;\n white-space: normal;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n outline-offset: -2px;\n -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-cancel-button,\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item;\n}\n\ntemplate {\n display: none;\n}\n\n[hidden] {\n display: none !important;\n}\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n margin-bottom: 0.5rem;\n font-family: inherit;\n font-weight: 500;\n line-height: 1.1;\n color: inherit;\n}\n\nh1, .h1 {\n font-size: 2.5rem;\n}\n\nh2, .h2 {\n font-size: 2rem;\n}\n\nh3, .h3 {\n font-size: 1.75rem;\n}\n\nh4, .h4 {\n font-size: 1.5rem;\n}\n\nh5, .h5 {\n font-size: 1.25rem;\n}\n\nh6, .h6 {\n font-size: 1rem;\n}\n\n.lead {\n font-size: 1.25rem;\n font-weight: 300;\n}\n\n.display-1 {\n font-size: 6rem;\n font-weight: 300;\n line-height: 1.1;\n}\n\n.display-2 {\n font-size: 5.5rem;\n font-weight: 300;\n line-height: 1.1;\n}\n\n.display-3 {\n font-size: 4.5rem;\n font-weight: 300;\n line-height: 1.1;\n}\n\n.display-4 {\n font-size: 3.5rem;\n font-weight: 300;\n line-height: 1.1;\n}\n\nhr {\n margin-top: 1rem;\n margin-bottom: 1rem;\n border: 0;\n border-top: 1px solid rgba(0, 0, 0, 0.1);\n}\n\nsmall,\n.small {\n font-size: 80%;\n font-weight: normal;\n}\n\nmark,\n.mark {\n padding: 0.2em;\n background-color: #fcf8e3;\n}\n\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n.list-inline {\n padding-left: 0;\n list-style: none;\n}\n\n.list-inline-item {\n display: inline-block;\n}\n\n.list-inline-item:not(:last-child) {\n margin-right: 5px;\n}\n\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\n\n.blockquote {\n padding: 0.5rem 1rem;\n margin-bottom: 1rem;\n font-size: 1.25rem;\n border-left: 0.25rem solid #eceeef;\n}\n\n.blockquote-footer {\n display: block;\n font-size: 80%;\n color: #636c72;\n}\n\n.blockquote-footer::before {\n content: \"\\2014 \\00A0\";\n}\n\n.blockquote-reverse {\n padding-right: 1rem;\n padding-left: 0;\n text-align: right;\n border-right: 0.25rem solid #eceeef;\n border-left: 0;\n}\n\n.blockquote-reverse .blockquote-footer::before {\n content: \"\";\n}\n\n.blockquote-reverse .blockquote-footer::after {\n content: \"\\00A0 \\2014\";\n}\n\n.img-fluid {\n max-width: 100%;\n height: auto;\n}\n\n.img-thumbnail {\n padding: 0.25rem;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 0.25rem;\n transition: all 0.2s ease-in-out;\n max-width: 100%;\n height: auto;\n}\n\n.figure {\n display: inline-block;\n}\n\n.figure-img {\n margin-bottom: 0.5rem;\n line-height: 1;\n}\n\n.figure-caption {\n font-size: 90%;\n color: #636c72;\n}\n\ncode,\nkbd,\npre,\nsamp {\n font-family: Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n}\n\ncode {\n padding: 0.2rem 0.4rem;\n font-size: 90%;\n color: #bd4147;\n background-color: #f7f7f9;\n border-radius: 0.25rem;\n}\n\na > code {\n padding: 0;\n color: inherit;\n background-color: inherit;\n}\n\nkbd {\n padding: 0.2rem 0.4rem;\n font-size: 90%;\n color: #fff;\n background-color: #292b2c;\n border-radius: 0.2rem;\n}\n\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n}\n\npre {\n display: block;\n margin-top: 0;\n margin-bottom: 1rem;\n font-size: 90%;\n color: #292b2c;\n}\n\npre code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n background-color: transparent;\n border-radius: 0;\n}\n\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n\n.container {\n margin-right: auto;\n margin-left: auto;\n padding-right: 15px;\n padding-left: 15px;\n}\n\n@media (min-width: 576px) {\n .container {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n@media (min-width: 992px) {\n .container {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n@media (min-width: 1200px) {\n .container {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n@media (min-width: 576px) {\n .container {\n width: 540px;\n max-width: 100%;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n width: 720px;\n max-width: 100%;\n }\n}\n\n@media (min-width: 992px) {\n .container {\n width: 960px;\n max-width: 100%;\n }\n}\n\n@media (min-width: 1200px) {\n .container {\n width: 1140px;\n max-width: 100%;\n }\n}\n\n.container-fluid {\n width: 100%;\n margin-right: auto;\n margin-left: auto;\n padding-right: 15px;\n padding-left: 15px;\n}\n\n@media (min-width: 576px) {\n .container-fluid {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n@media (min-width: 768px) {\n .container-fluid {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n@media (min-width: 992px) {\n .container-fluid {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n@media (min-width: 1200px) {\n .container-fluid {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n.row {\n display: flex;\n flex-wrap: wrap;\n margin-right: -15px;\n margin-left: -15px;\n}\n\n@media (min-width: 576px) {\n .row {\n margin-right: -15px;\n margin-left: -15px;\n }\n}\n\n@media (min-width: 768px) {\n .row {\n margin-right: -15px;\n margin-left: -15px;\n }\n}\n\n@media (min-width: 992px) {\n .row {\n margin-right: -15px;\n margin-left: -15px;\n }\n}\n\n@media (min-width: 1200px) {\n .row {\n margin-right: -15px;\n margin-left: -15px;\n }\n}\n\n.no-gutters {\n margin-right: 0;\n margin-left: 0;\n}\n\n.no-gutters > .col,\n.no-gutters > [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n}\n\n.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n.col-xl-auto {\n position: relative;\n width: 100%;\n min-height: 1px;\n padding-right: 15px;\n padding-left: 15px;\n}\n\n@media (min-width: 576px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n@media (min-width: 768px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n@media (min-width: 992px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n@media (min-width: 1200px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n.col {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n}\n\n.col-auto {\n flex: 0 0 auto;\n width: auto;\n}\n\n.col-1 {\n width: 8.333333%;\n}\n\n.col-2 {\n width: 16.666667%;\n}\n\n.col-3 {\n width: 25%;\n}\n\n.col-4 {\n width: 33.333333%;\n}\n\n.col-5 {\n width: 41.666667%;\n}\n\n.col-6 {\n width: 50%;\n}\n\n.col-7 {\n width: 58.333333%;\n}\n\n.col-8 {\n width: 66.666667%;\n}\n\n.col-9 {\n width: 75%;\n}\n\n.col-10 {\n width: 83.333333%;\n}\n\n.col-11 {\n width: 91.666667%;\n}\n\n.col-12 {\n width: 100%;\n}\n\n.pull-0 {\n right: auto;\n}\n\n.pull-1 {\n right: 8.333333%;\n}\n\n.pull-2 {\n right: 16.666667%;\n}\n\n.pull-3 {\n right: 25%;\n}\n\n.pull-4 {\n right: 33.333333%;\n}\n\n.pull-5 {\n right: 41.666667%;\n}\n\n.pull-6 {\n right: 50%;\n}\n\n.pull-7 {\n right: 58.333333%;\n}\n\n.pull-8 {\n right: 66.666667%;\n}\n\n.pull-9 {\n right: 75%;\n}\n\n.pull-10 {\n right: 83.333333%;\n}\n\n.pull-11 {\n right: 91.666667%;\n}\n\n.pull-12 {\n right: 100%;\n}\n\n.push-0 {\n left: auto;\n}\n\n.push-1 {\n left: 8.333333%;\n}\n\n.push-2 {\n left: 16.666667%;\n}\n\n.push-3 {\n left: 25%;\n}\n\n.push-4 {\n left: 33.333333%;\n}\n\n.push-5 {\n left: 41.666667%;\n}\n\n.push-6 {\n left: 50%;\n}\n\n.push-7 {\n left: 58.333333%;\n}\n\n.push-8 {\n left: 66.666667%;\n}\n\n.push-9 {\n left: 75%;\n}\n\n.push-10 {\n left: 83.333333%;\n}\n\n.push-11 {\n left: 91.666667%;\n}\n\n.push-12 {\n left: 100%;\n}\n\n.offset-1 {\n margin-left: 8.333333%;\n}\n\n.offset-2 {\n margin-left: 16.666667%;\n}\n\n.offset-3 {\n margin-left: 25%;\n}\n\n.offset-4 {\n margin-left: 33.333333%;\n}\n\n.offset-5 {\n margin-left: 41.666667%;\n}\n\n.offset-6 {\n margin-left: 50%;\n}\n\n.offset-7 {\n margin-left: 58.333333%;\n}\n\n.offset-8 {\n margin-left: 66.666667%;\n}\n\n.offset-9 {\n margin-left: 75%;\n}\n\n.offset-10 {\n margin-left: 83.333333%;\n}\n\n.offset-11 {\n margin-left: 91.666667%;\n}\n\n@media (min-width: 576px) {\n .col-sm {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-sm-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-sm-1 {\n width: 8.333333%;\n }\n .col-sm-2 {\n width: 16.666667%;\n }\n .col-sm-3 {\n width: 25%;\n }\n .col-sm-4 {\n width: 33.333333%;\n }\n .col-sm-5 {\n width: 41.666667%;\n }\n .col-sm-6 {\n width: 50%;\n }\n .col-sm-7 {\n width: 58.333333%;\n }\n .col-sm-8 {\n width: 66.666667%;\n }\n .col-sm-9 {\n width: 75%;\n }\n .col-sm-10 {\n width: 83.333333%;\n }\n .col-sm-11 {\n width: 91.666667%;\n }\n .col-sm-12 {\n width: 100%;\n }\n .pull-sm-0 {\n right: auto;\n }\n .pull-sm-1 {\n right: 8.333333%;\n }\n .pull-sm-2 {\n right: 16.666667%;\n }\n .pull-sm-3 {\n right: 25%;\n }\n .pull-sm-4 {\n right: 33.333333%;\n }\n .pull-sm-5 {\n right: 41.666667%;\n }\n .pull-sm-6 {\n right: 50%;\n }\n .pull-sm-7 {\n right: 58.333333%;\n }\n .pull-sm-8 {\n right: 66.666667%;\n }\n .pull-sm-9 {\n right: 75%;\n }\n .pull-sm-10 {\n right: 83.333333%;\n }\n .pull-sm-11 {\n right: 91.666667%;\n }\n .pull-sm-12 {\n right: 100%;\n }\n .push-sm-0 {\n left: auto;\n }\n .push-sm-1 {\n left: 8.333333%;\n }\n .push-sm-2 {\n left: 16.666667%;\n }\n .push-sm-3 {\n left: 25%;\n }\n .push-sm-4 {\n left: 33.333333%;\n }\n .push-sm-5 {\n left: 41.666667%;\n }\n .push-sm-6 {\n left: 50%;\n }\n .push-sm-7 {\n left: 58.333333%;\n }\n .push-sm-8 {\n left: 66.666667%;\n }\n .push-sm-9 {\n left: 75%;\n }\n .push-sm-10 {\n left: 83.333333%;\n }\n .push-sm-11 {\n left: 91.666667%;\n }\n .push-sm-12 {\n left: 100%;\n }\n .offset-sm-0 {\n margin-left: 0%;\n }\n .offset-sm-1 {\n margin-left: 8.333333%;\n }\n .offset-sm-2 {\n margin-left: 16.666667%;\n }\n .offset-sm-3 {\n margin-left: 25%;\n }\n .offset-sm-4 {\n margin-left: 33.333333%;\n }\n .offset-sm-5 {\n margin-left: 41.666667%;\n }\n .offset-sm-6 {\n margin-left: 50%;\n }\n .offset-sm-7 {\n margin-left: 58.333333%;\n }\n .offset-sm-8 {\n margin-left: 66.666667%;\n }\n .offset-sm-9 {\n margin-left: 75%;\n }\n .offset-sm-10 {\n margin-left: 83.333333%;\n }\n .offset-sm-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 768px) {\n .col-md {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-md-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-md-1 {\n width: 8.333333%;\n }\n .col-md-2 {\n width: 16.666667%;\n }\n .col-md-3 {\n width: 25%;\n }\n .col-md-4 {\n width: 33.333333%;\n }\n .col-md-5 {\n width: 41.666667%;\n }\n .col-md-6 {\n width: 50%;\n }\n .col-md-7 {\n width: 58.333333%;\n }\n .col-md-8 {\n width: 66.666667%;\n }\n .col-md-9 {\n width: 75%;\n }\n .col-md-10 {\n width: 83.333333%;\n }\n .col-md-11 {\n width: 91.666667%;\n }\n .col-md-12 {\n width: 100%;\n }\n .pull-md-0 {\n right: auto;\n }\n .pull-md-1 {\n right: 8.333333%;\n }\n .pull-md-2 {\n right: 16.666667%;\n }\n .pull-md-3 {\n right: 25%;\n }\n .pull-md-4 {\n right: 33.333333%;\n }\n .pull-md-5 {\n right: 41.666667%;\n }\n .pull-md-6 {\n right: 50%;\n }\n .pull-md-7 {\n right: 58.333333%;\n }\n .pull-md-8 {\n right: 66.666667%;\n }\n .pull-md-9 {\n right: 75%;\n }\n .pull-md-10 {\n right: 83.333333%;\n }\n .pull-md-11 {\n right: 91.666667%;\n }\n .pull-md-12 {\n right: 100%;\n }\n .push-md-0 {\n left: auto;\n }\n .push-md-1 {\n left: 8.333333%;\n }\n .push-md-2 {\n left: 16.666667%;\n }\n .push-md-3 {\n left: 25%;\n }\n .push-md-4 {\n left: 33.333333%;\n }\n .push-md-5 {\n left: 41.666667%;\n }\n .push-md-6 {\n left: 50%;\n }\n .push-md-7 {\n left: 58.333333%;\n }\n .push-md-8 {\n left: 66.666667%;\n }\n .push-md-9 {\n left: 75%;\n }\n .push-md-10 {\n left: 83.333333%;\n }\n .push-md-11 {\n left: 91.666667%;\n }\n .push-md-12 {\n left: 100%;\n }\n .offset-md-0 {\n margin-left: 0%;\n }\n .offset-md-1 {\n margin-left: 8.333333%;\n }\n .offset-md-2 {\n margin-left: 16.666667%;\n }\n .offset-md-3 {\n margin-left: 25%;\n }\n .offset-md-4 {\n margin-left: 33.333333%;\n }\n .offset-md-5 {\n margin-left: 41.666667%;\n }\n .offset-md-6 {\n margin-left: 50%;\n }\n .offset-md-7 {\n margin-left: 58.333333%;\n }\n .offset-md-8 {\n margin-left: 66.666667%;\n }\n .offset-md-9 {\n margin-left: 75%;\n }\n .offset-md-10 {\n margin-left: 83.333333%;\n }\n .offset-md-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 992px) {\n .col-lg {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-lg-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-lg-1 {\n width: 8.333333%;\n }\n .col-lg-2 {\n width: 16.666667%;\n }\n .col-lg-3 {\n width: 25%;\n }\n .col-lg-4 {\n width: 33.333333%;\n }\n .col-lg-5 {\n width: 41.666667%;\n }\n .col-lg-6 {\n width: 50%;\n }\n .col-lg-7 {\n width: 58.333333%;\n }\n .col-lg-8 {\n width: 66.666667%;\n }\n .col-lg-9 {\n width: 75%;\n }\n .col-lg-10 {\n width: 83.333333%;\n }\n .col-lg-11 {\n width: 91.666667%;\n }\n .col-lg-12 {\n width: 100%;\n }\n .pull-lg-0 {\n right: auto;\n }\n .pull-lg-1 {\n right: 8.333333%;\n }\n .pull-lg-2 {\n right: 16.666667%;\n }\n .pull-lg-3 {\n right: 25%;\n }\n .pull-lg-4 {\n right: 33.333333%;\n }\n .pull-lg-5 {\n right: 41.666667%;\n }\n .pull-lg-6 {\n right: 50%;\n }\n .pull-lg-7 {\n right: 58.333333%;\n }\n .pull-lg-8 {\n right: 66.666667%;\n }\n .pull-lg-9 {\n right: 75%;\n }\n .pull-lg-10 {\n right: 83.333333%;\n }\n .pull-lg-11 {\n right: 91.666667%;\n }\n .pull-lg-12 {\n right: 100%;\n }\n .push-lg-0 {\n left: auto;\n }\n .push-lg-1 {\n left: 8.333333%;\n }\n .push-lg-2 {\n left: 16.666667%;\n }\n .push-lg-3 {\n left: 25%;\n }\n .push-lg-4 {\n left: 33.333333%;\n }\n .push-lg-5 {\n left: 41.666667%;\n }\n .push-lg-6 {\n left: 50%;\n }\n .push-lg-7 {\n left: 58.333333%;\n }\n .push-lg-8 {\n left: 66.666667%;\n }\n .push-lg-9 {\n left: 75%;\n }\n .push-lg-10 {\n left: 83.333333%;\n }\n .push-lg-11 {\n left: 91.666667%;\n }\n .push-lg-12 {\n left: 100%;\n }\n .offset-lg-0 {\n margin-left: 0%;\n }\n .offset-lg-1 {\n margin-left: 8.333333%;\n }\n .offset-lg-2 {\n margin-left: 16.666667%;\n }\n .offset-lg-3 {\n margin-left: 25%;\n }\n .offset-lg-4 {\n margin-left: 33.333333%;\n }\n .offset-lg-5 {\n margin-left: 41.666667%;\n }\n .offset-lg-6 {\n margin-left: 50%;\n }\n .offset-lg-7 {\n margin-left: 58.333333%;\n }\n .offset-lg-8 {\n margin-left: 66.666667%;\n }\n .offset-lg-9 {\n margin-left: 75%;\n }\n .offset-lg-10 {\n margin-left: 83.333333%;\n }\n .offset-lg-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 1200px) {\n .col-xl {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-xl-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-xl-1 {\n width: 8.333333%;\n }\n .col-xl-2 {\n width: 16.666667%;\n }\n .col-xl-3 {\n width: 25%;\n }\n .col-xl-4 {\n width: 33.333333%;\n }\n .col-xl-5 {\n width: 41.666667%;\n }\n .col-xl-6 {\n width: 50%;\n }\n .col-xl-7 {\n width: 58.333333%;\n }\n .col-xl-8 {\n width: 66.666667%;\n }\n .col-xl-9 {\n width: 75%;\n }\n .col-xl-10 {\n width: 83.333333%;\n }\n .col-xl-11 {\n width: 91.666667%;\n }\n .col-xl-12 {\n width: 100%;\n }\n .pull-xl-0 {\n right: auto;\n }\n .pull-xl-1 {\n right: 8.333333%;\n }\n .pull-xl-2 {\n right: 16.666667%;\n }\n .pull-xl-3 {\n right: 25%;\n }\n .pull-xl-4 {\n right: 33.333333%;\n }\n .pull-xl-5 {\n right: 41.666667%;\n }\n .pull-xl-6 {\n right: 50%;\n }\n .pull-xl-7 {\n right: 58.333333%;\n }\n .pull-xl-8 {\n right: 66.666667%;\n }\n .pull-xl-9 {\n right: 75%;\n }\n .pull-xl-10 {\n right: 83.333333%;\n }\n .pull-xl-11 {\n right: 91.666667%;\n }\n .pull-xl-12 {\n right: 100%;\n }\n .push-xl-0 {\n left: auto;\n }\n .push-xl-1 {\n left: 8.333333%;\n }\n .push-xl-2 {\n left: 16.666667%;\n }\n .push-xl-3 {\n left: 25%;\n }\n .push-xl-4 {\n left: 33.333333%;\n }\n .push-xl-5 {\n left: 41.666667%;\n }\n .push-xl-6 {\n left: 50%;\n }\n .push-xl-7 {\n left: 58.333333%;\n }\n .push-xl-8 {\n left: 66.666667%;\n }\n .push-xl-9 {\n left: 75%;\n }\n .push-xl-10 {\n left: 83.333333%;\n }\n .push-xl-11 {\n left: 91.666667%;\n }\n .push-xl-12 {\n left: 100%;\n }\n .offset-xl-0 {\n margin-left: 0%;\n }\n .offset-xl-1 {\n margin-left: 8.333333%;\n }\n .offset-xl-2 {\n margin-left: 16.666667%;\n }\n .offset-xl-3 {\n margin-left: 25%;\n }\n .offset-xl-4 {\n margin-left: 33.333333%;\n }\n .offset-xl-5 {\n margin-left: 41.666667%;\n }\n .offset-xl-6 {\n margin-left: 50%;\n }\n .offset-xl-7 {\n margin-left: 58.333333%;\n }\n .offset-xl-8 {\n margin-left: 66.666667%;\n }\n .offset-xl-9 {\n margin-left: 75%;\n }\n .offset-xl-10 {\n margin-left: 83.333333%;\n }\n .offset-xl-11 {\n margin-left: 91.666667%;\n }\n}\n\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: 1rem;\n background-color: transparent;\n}\n\n.table th,\n.table td {\n padding: 0.75rem;\n vertical-align: top;\n border-top: 1px solid #eceeef;\n}\n\n.table thead th {\n vertical-align: bottom;\n border-bottom: 2px solid #eceeef;\n}\n\n.table tbody + tbody {\n border-top: 2px solid #eceeef;\n}\n\n.table .table {\n background-color: #fff;\n}\n\n.table-sm th,\n.table-sm td {\n padding: 0.3rem;\n}\n\n.table-bordered {\n border: 1px solid #eceeef;\n}\n\n.table-bordered th,\n.table-bordered td {\n border: 1px solid #eceeef;\n}\n\n.table-bordered thead th,\n.table-bordered thead td {\n border-bottom-width: 2px;\n}\n\n.table-striped tbody tr:nth-of-type(odd) {\n background-color: rgba(0, 0, 0, 0.05);\n}\n\n.table-hover tbody tr:hover {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-active,\n.table-active > th,\n.table-active > td {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-hover .table-active:hover {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-hover .table-active:hover > td,\n.table-hover .table-active:hover > th {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-success,\n.table-success > th,\n.table-success > td {\n background-color: #dff0d8;\n}\n\n.table-hover .table-success:hover {\n background-color: #d0e9c6;\n}\n\n.table-hover .table-success:hover > td,\n.table-hover .table-success:hover > th {\n background-color: #d0e9c6;\n}\n\n.table-info,\n.table-info > th,\n.table-info > td {\n background-color: #d9edf7;\n}\n\n.table-hover .table-info:hover {\n background-color: #c4e3f3;\n}\n\n.table-hover .table-info:hover > td,\n.table-hover .table-info:hover > th {\n background-color: #c4e3f3;\n}\n\n.table-warning,\n.table-warning > th,\n.table-warning > td {\n background-color: #fcf8e3;\n}\n\n.table-hover .table-warning:hover {\n background-color: #faf2cc;\n}\n\n.table-hover .table-warning:hover > td,\n.table-hover .table-warning:hover > th {\n background-color: #faf2cc;\n}\n\n.table-danger,\n.table-danger > th,\n.table-danger > td {\n background-color: #f2dede;\n}\n\n.table-hover .table-danger:hover {\n background-color: #ebcccc;\n}\n\n.table-hover .table-danger:hover > td,\n.table-hover .table-danger:hover > th {\n background-color: #ebcccc;\n}\n\n.thead-inverse th {\n color: #fff;\n background-color: #292b2c;\n}\n\n.thead-default th {\n color: #464a4c;\n background-color: #eceeef;\n}\n\n.table-inverse {\n color: #fff;\n background-color: #292b2c;\n}\n\n.table-inverse th,\n.table-inverse td,\n.table-inverse thead th {\n border-color: #3b3e40;\n}\n\n.table-inverse.table-bordered {\n border: 0;\n}\n\n.table-inverse.table-striped tbody tr:nth-of-type(odd) {\n background-color: rgba(255, 255, 255, 0.05);\n}\n\n.table-inverse.table-hover tbody tr:hover {\n background-color: rgba(255, 255, 255, 0.075);\n}\n\n@media (max-width: 991px) {\n .table-responsive {\n display: block;\n width: 100%;\n overflow-x: auto;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n }\n .table-responsive.table-bordered {\n border: 0;\n }\n}\n\n.form-control {\n display: block;\n width: 100%;\n padding: 0.5rem 1rem;\n font-size: 1rem;\n line-height: 1.25;\n color: #464a4c;\n background-color: #fff;\n background-image: none;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 0.25rem;\n transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n}\n\n.form-control::-ms-expand {\n background-color: transparent;\n border: 0;\n}\n\n.form-control:focus {\n color: #464a4c;\n background-color: #fff;\n border-color: #5cb3fd;\n outline: none;\n}\n\n.form-control::placeholder {\n color: #636c72;\n opacity: 1;\n}\n\n.form-control:disabled, .form-control[readonly] {\n background-color: #eceeef;\n opacity: 1;\n}\n\nselect.form-control:not([size]):not([multiple]) {\n height: calc(2.25rem + 2px);\n}\n\nselect.form-control:focus::-ms-value {\n color: #464a4c;\n background-color: #fff;\n}\n\n.form-control-file,\n.form-control-range {\n display: block;\n}\n\n.col-form-label {\n padding-top: calc(0.5rem - 1px * 2);\n padding-bottom: calc(0.5rem - 1px * 2);\n margin-bottom: 0;\n}\n\n.col-form-label-lg {\n padding-top: calc(0.5rem - 1px * 2);\n padding-bottom: calc(0.5rem - 1px * 2);\n font-size: 1.25rem;\n}\n\n.col-form-label-sm {\n padding-top: calc(0.25rem - 1px * 2);\n padding-bottom: calc(0.25rem - 1px * 2);\n font-size: 0.875rem;\n}\n\n.col-form-legend {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n margin-bottom: 0;\n font-size: 1rem;\n}\n\n.form-control-static {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n margin-bottom: 0;\n line-height: 1.25;\n border: solid transparent;\n border-width: 1px 0;\n}\n\n.form-control-static.form-control-sm, .input-group-sm > .form-control-static.form-control,\n.input-group-sm > .form-control-static.input-group-addon,\n.input-group-sm > .input-group-btn > .form-control-static.btn, .form-control-static.form-control-lg, .input-group-lg > .form-control-static.form-control,\n.input-group-lg > .form-control-static.input-group-addon,\n.input-group-lg > .input-group-btn > .form-control-static.btn {\n padding-right: 0;\n padding-left: 0;\n}\n\n.form-control-sm, .input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n border-radius: 0.2rem;\n}\n\nselect.form-control-sm:not([size]):not([multiple]), .input-group-sm > select.form-control:not([size]):not([multiple]),\n.input-group-sm > select.input-group-addon:not([size]):not([multiple]),\n.input-group-sm > .input-group-btn > select.btn:not([size]):not([multiple]) {\n height: calc(1.8125rem + 2px);\n}\n\n.form-control-lg, .input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n line-height: 1.5;\n border-radius: 0.3rem;\n}\n\nselect.form-control-lg:not([size]):not([multiple]), .input-group-lg > select.form-control:not([size]):not([multiple]),\n.input-group-lg > select.input-group-addon:not([size]):not([multiple]),\n.input-group-lg > .input-group-btn > select.btn:not([size]):not([multiple]) {\n height: calc(2.875rem + 2px);\n}\n\n.form-group {\n margin-bottom: 1rem;\n}\n\n.form-text {\n display: block;\n margin-top: 0.25rem;\n}\n\n.form-check {\n position: relative;\n display: block;\n margin-bottom: 0.5rem;\n}\n\n.form-check.disabled .form-check-label {\n color: #636c72;\n}\n\n.form-check-label {\n padding-left: 1.25rem;\n margin-bottom: 0;\n}\n\n.form-check-input {\n position: absolute;\n margin-top: 0.25rem;\n margin-left: -1.25rem;\n}\n\n.form-check-input:only-child {\n position: static;\n}\n\n.form-check-inline {\n display: inline-block;\n}\n\n.form-check-inline .form-check-label {\n vertical-align: middle;\n}\n\n.form-check-inline + .form-check-inline {\n margin-left: 0.75rem;\n}\n\n.form-control-feedback {\n margin-top: 0.25rem;\n}\n\n.form-control-success,\n.form-control-warning,\n.form-control-danger {\n padding-right: 3rem;\n background-repeat: no-repeat;\n background-position: center right 0.5625rem;\n background-size: 1.125rem 1.125rem;\n}\n\n.has-success .form-control-feedback,\n.has-success .form-control-label,\n.has-success .col-form-label,\n.has-success .form-check-label,\n.has-success .custom-control {\n color: #5cb85c;\n}\n\n.has-success .form-control,\n.has-success .custom-select,\n.has-success .custom-file-control {\n border-color: #5cb85c;\n}\n\n.has-success .input-group-addon {\n color: #5cb85c;\n background-color: #eaf6ea;\n border-color: #5cb85c;\n}\n\n.has-success .form-control-success {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%235cb85c' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E\");\n}\n\n.has-warning .form-control-feedback,\n.has-warning .form-control-label,\n.has-warning .col-form-label,\n.has-warning .form-check-label,\n.has-warning .custom-control {\n color: #f0ad4e;\n}\n\n.has-warning .form-control,\n.has-warning .custom-select,\n.has-warning .custom-file-control {\n border-color: #f0ad4e;\n}\n\n.has-warning .input-group-addon {\n color: #f0ad4e;\n background-color: white;\n border-color: #f0ad4e;\n}\n\n.has-warning .form-control-warning {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23f0ad4e' d='M4.4 5.324h-.8v-2.46h.8zm0 1.42h-.8V5.89h.8zM3.76.63L.04 7.075c-.115.2.016.425.26.426h7.397c.242 0 .372-.226.258-.426C6.726 4.924 5.47 2.79 4.253.63c-.113-.174-.39-.174-.494 0z'/%3E%3C/svg%3E\");\n}\n\n.has-danger .form-control-feedback,\n.has-danger .form-control-label,\n.has-danger .col-form-label,\n.has-danger .form-check-label,\n.has-danger .custom-control {\n color: #d9534f;\n}\n\n.has-danger .form-control,\n.has-danger .custom-select,\n.has-danger .custom-file-control {\n border-color: #d9534f;\n}\n\n.has-danger .input-group-addon {\n color: #d9534f;\n background-color: #fdf7f7;\n border-color: #d9534f;\n}\n\n.has-danger .form-control-danger {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23d9534f' viewBox='-2 -2 7 7'%3E%3Cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3E%3Ccircle r='.5'/%3E%3Ccircle cx='3' r='.5'/%3E%3Ccircle cy='3' r='.5'/%3E%3Ccircle cx='3' cy='3' r='.5'/%3E%3C/svg%3E\");\n}\n\n.form-inline {\n display: flex;\n flex-flow: row wrap;\n align-items: center;\n}\n\n.form-inline .form-check {\n width: 100%;\n}\n\n@media (min-width: 576px) {\n .form-inline label {\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 0;\n }\n .form-inline .form-group {\n display: flex;\n flex: 0 0 auto;\n flex-flow: row wrap;\n align-items: center;\n margin-bottom: 0;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-static {\n display: inline-block;\n }\n .form-inline .input-group {\n width: auto;\n }\n .form-inline .form-control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .form-check {\n display: flex;\n align-items: center;\n justify-content: center;\n width: auto;\n margin-top: 0;\n margin-bottom: 0;\n }\n .form-inline .form-check-label {\n padding-left: 0;\n }\n .form-inline .form-check-input {\n position: relative;\n margin-top: 0;\n margin-right: 0.25rem;\n margin-left: 0;\n }\n .form-inline .custom-control {\n display: flex;\n align-items: center;\n justify-content: center;\n padding-left: 0;\n }\n .form-inline .custom-control-indicator {\n position: static;\n display: inline-block;\n margin-right: 0.25rem;\n vertical-align: text-bottom;\n }\n .form-inline .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n\n.btn {\n display: inline-block;\n font-weight: normal;\n text-align: center;\n white-space: nowrap;\n vertical-align: middle;\n user-select: none;\n border: 1px solid transparent;\n padding: 0.5rem 1rem;\n font-size: 1rem;\n line-height: 1.25;\n border-radius: 0.25rem;\n transition: all 0.2s ease-in-out;\n}\n\n.btn:focus, .btn:hover {\n text-decoration: none;\n}\n\n.btn:focus, .btn.focus {\n outline: 0;\n box-shadow: 0 0 0 2px rgba(2, 117, 216, 0.25);\n}\n\n.btn.disabled, .btn:disabled {\n opacity: .65;\n}\n\n.btn:active, .btn.active {\n background-image: none;\n}\n\na.btn.disabled,\nfieldset[disabled] a.btn {\n pointer-events: none;\n}\n\n.btn-primary {\n color: #fff;\n background-color: #0275d8;\n border-color: #0275d8;\n}\n\n.btn-primary:hover {\n color: #fff;\n background-color: #025aa5;\n border-color: #01549b;\n}\n\n.btn-primary:focus, .btn-primary.focus {\n box-shadow: 0 0 0 2px rgba(2, 117, 216, 0.5);\n}\n\n.btn-primary.disabled, .btn-primary:disabled {\n background-color: #0275d8;\n border-color: #0275d8;\n}\n\n.btn-primary:active, .btn-primary.active,\n.show > .btn-primary.dropdown-toggle {\n color: #fff;\n background-color: #025aa5;\n background-image: none;\n border-color: #01549b;\n}\n\n.btn-secondary {\n color: #292b2c;\n background-color: #fff;\n border-color: #ccc;\n}\n\n.btn-secondary:hover {\n color: #292b2c;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n\n.btn-secondary:focus, .btn-secondary.focus {\n box-shadow: 0 0 0 2px rgba(204, 204, 204, 0.5);\n}\n\n.btn-secondary.disabled, .btn-secondary:disabled {\n background-color: #fff;\n border-color: #ccc;\n}\n\n.btn-secondary:active, .btn-secondary.active,\n.show > .btn-secondary.dropdown-toggle {\n color: #292b2c;\n background-color: #e6e6e6;\n background-image: none;\n border-color: #adadad;\n}\n\n.btn-info {\n color: #fff;\n background-color: #5bc0de;\n border-color: #5bc0de;\n}\n\n.btn-info:hover {\n color: #fff;\n background-color: #31b0d5;\n border-color: #2aabd2;\n}\n\n.btn-info:focus, .btn-info.focus {\n box-shadow: 0 0 0 2px rgba(91, 192, 222, 0.5);\n}\n\n.btn-info.disabled, .btn-info:disabled {\n background-color: #5bc0de;\n border-color: #5bc0de;\n}\n\n.btn-info:active, .btn-info.active,\n.show > .btn-info.dropdown-toggle {\n color: #fff;\n background-color: #31b0d5;\n background-image: none;\n border-color: #2aabd2;\n}\n\n.btn-success {\n color: #fff;\n background-color: #5cb85c;\n border-color: #5cb85c;\n}\n\n.btn-success:hover {\n color: #fff;\n background-color: #449d44;\n border-color: #419641;\n}\n\n.btn-success:focus, .btn-success.focus {\n box-shadow: 0 0 0 2px rgba(92, 184, 92, 0.5);\n}\n\n.btn-success.disabled, .btn-success:disabled {\n background-color: #5cb85c;\n border-color: #5cb85c;\n}\n\n.btn-success:active, .btn-success.active,\n.show > .btn-success.dropdown-toggle {\n color: #fff;\n background-color: #449d44;\n background-image: none;\n border-color: #419641;\n}\n\n.btn-warning {\n color: #fff;\n background-color: #f0ad4e;\n border-color: #f0ad4e;\n}\n\n.btn-warning:hover {\n color: #fff;\n background-color: #ec971f;\n border-color: #eb9316;\n}\n\n.btn-warning:focus, .btn-warning.focus {\n box-shadow: 0 0 0 2px rgba(240, 173, 78, 0.5);\n}\n\n.btn-warning.disabled, .btn-warning:disabled {\n background-color: #f0ad4e;\n border-color: #f0ad4e;\n}\n\n.btn-warning:active, .btn-warning.active,\n.show > .btn-warning.dropdown-toggle {\n color: #fff;\n background-color: #ec971f;\n background-image: none;\n border-color: #eb9316;\n}\n\n.btn-danger {\n color: #fff;\n background-color: #d9534f;\n border-color: #d9534f;\n}\n\n.btn-danger:hover {\n color: #fff;\n background-color: #c9302c;\n border-color: #c12e2a;\n}\n\n.btn-danger:focus, .btn-danger.focus {\n box-shadow: 0 0 0 2px rgba(217, 83, 79, 0.5);\n}\n\n.btn-danger.disabled, .btn-danger:disabled {\n background-color: #d9534f;\n border-color: #d9534f;\n}\n\n.btn-danger:active, .btn-danger.active,\n.show > .btn-danger.dropdown-toggle {\n color: #fff;\n background-color: #c9302c;\n background-image: none;\n border-color: #c12e2a;\n}\n\n.btn-outline-primary {\n color: #0275d8;\n background-color: transparent;\n background-image: none;\n border-color: #0275d8;\n}\n\n.btn-outline-primary:hover {\n color: #fff;\n background-color: #0275d8;\n border-color: #0275d8;\n}\n\n.btn-outline-primary:focus, .btn-outline-primary.focus {\n box-shadow: 0 0 0 2px rgba(2, 117, 216, 0.5);\n}\n\n.btn-outline-primary.disabled, .btn-outline-primary:disabled {\n color: #0275d8;\n background-color: transparent;\n}\n\n.btn-outline-primary:active, .btn-outline-primary.active,\n.show > .btn-outline-primary.dropdown-toggle {\n color: #fff;\n background-color: #0275d8;\n border-color: #0275d8;\n}\n\n.btn-outline-secondary {\n color: #ccc;\n background-color: transparent;\n background-image: none;\n border-color: #ccc;\n}\n\n.btn-outline-secondary:hover {\n color: #292b2c;\n background-color: #ccc;\n border-color: #ccc;\n}\n\n.btn-outline-secondary:focus, .btn-outline-secondary.focus {\n box-shadow: 0 0 0 2px rgba(204, 204, 204, 0.5);\n}\n\n.btn-outline-secondary.disabled, .btn-outline-secondary:disabled {\n color: #ccc;\n background-color: transparent;\n}\n\n.btn-outline-secondary:active, .btn-outline-secondary.active,\n.show > .btn-outline-secondary.dropdown-toggle {\n color: #292b2c;\n background-color: #ccc;\n border-color: #ccc;\n}\n\n.btn-outline-info {\n color: #5bc0de;\n background-color: transparent;\n background-image: none;\n border-color: #5bc0de;\n}\n\n.btn-outline-info:hover {\n color: #fff;\n background-color: #5bc0de;\n border-color: #5bc0de;\n}\n\n.btn-outline-info:focus, .btn-outline-info.focus {\n box-shadow: 0 0 0 2px rgba(91, 192, 222, 0.5);\n}\n\n.btn-outline-info.disabled, .btn-outline-info:disabled {\n color: #5bc0de;\n background-color: transparent;\n}\n\n.btn-outline-info:active, .btn-outline-info.active,\n.show > .btn-outline-info.dropdown-toggle {\n color: #fff;\n background-color: #5bc0de;\n border-color: #5bc0de;\n}\n\n.btn-outline-success {\n color: #5cb85c;\n background-color: transparent;\n background-image: none;\n border-color: #5cb85c;\n}\n\n.btn-outline-success:hover {\n color: #fff;\n background-color: #5cb85c;\n border-color: #5cb85c;\n}\n\n.btn-outline-success:focus, .btn-outline-success.focus {\n box-shadow: 0 0 0 2px rgba(92, 184, 92, 0.5);\n}\n\n.btn-outline-success.disabled, .btn-outline-success:disabled {\n color: #5cb85c;\n background-color: transparent;\n}\n\n.btn-outline-success:active, .btn-outline-success.active,\n.show > .btn-outline-success.dropdown-toggle {\n color: #fff;\n background-color: #5cb85c;\n border-color: #5cb85c;\n}\n\n.btn-outline-warning {\n color: #f0ad4e;\n background-color: transparent;\n background-image: none;\n border-color: #f0ad4e;\n}\n\n.btn-outline-warning:hover {\n color: #fff;\n background-color: #f0ad4e;\n border-color: #f0ad4e;\n}\n\n.btn-outline-warning:focus, .btn-outline-warning.focus {\n box-shadow: 0 0 0 2px rgba(240, 173, 78, 0.5);\n}\n\n.btn-outline-warning.disabled, .btn-outline-warning:disabled {\n color: #f0ad4e;\n background-color: transparent;\n}\n\n.btn-outline-warning:active, .btn-outline-warning.active,\n.show > .btn-outline-warning.dropdown-toggle {\n color: #fff;\n background-color: #f0ad4e;\n border-color: #f0ad4e;\n}\n\n.btn-outline-danger {\n color: #d9534f;\n background-color: transparent;\n background-image: none;\n border-color: #d9534f;\n}\n\n.btn-outline-danger:hover {\n color: #fff;\n background-color: #d9534f;\n border-color: #d9534f;\n}\n\n.btn-outline-danger:focus, .btn-outline-danger.focus {\n box-shadow: 0 0 0 2px rgba(217, 83, 79, 0.5);\n}\n\n.btn-outline-danger.disabled, .btn-outline-danger:disabled {\n color: #d9534f;\n background-color: transparent;\n}\n\n.btn-outline-danger:active, .btn-outline-danger.active,\n.show > .btn-outline-danger.dropdown-toggle {\n color: #fff;\n background-color: #d9534f;\n border-color: #d9534f;\n}\n\n.btn-link {\n font-weight: normal;\n color: #0275d8;\n border-radius: 0;\n}\n\n.btn-link, .btn-link:active, .btn-link.active, .btn-link:disabled {\n background-color: transparent;\n}\n\n.btn-link, .btn-link:focus, .btn-link:active {\n border-color: transparent;\n}\n\n.btn-link:hover {\n border-color: transparent;\n}\n\n.btn-link:focus, .btn-link:hover {\n color: #014c8c;\n text-decoration: underline;\n background-color: transparent;\n}\n\n.btn-link:disabled {\n color: #636c72;\n}\n\n.btn-link:disabled:focus, .btn-link:disabled:hover {\n text-decoration: none;\n}\n\n.btn-lg, .btn-group-lg > .btn {\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n line-height: 1.5;\n border-radius: 0.3rem;\n}\n\n.btn-sm, .btn-group-sm > .btn {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n border-radius: 0.2rem;\n}\n\n.btn-block {\n display: block;\n width: 100%;\n}\n\n.btn-block + .btn-block {\n margin-top: 0.5rem;\n}\n\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n\n.fade {\n opacity: 0;\n transition: opacity 0.15s linear;\n}\n\n.fade.show {\n opacity: 1;\n}\n\n.collapse {\n display: none;\n}\n\n.collapse.show {\n display: block;\n}\n\ntr.collapse.show {\n display: table-row;\n}\n\ntbody.collapse.show {\n display: table-row-group;\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n transition: height 0.35s ease;\n}\n\n.dropup,\n.dropdown {\n position: relative;\n}\n\n.dropdown-toggle::after {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 0.3em;\n vertical-align: middle;\n content: \"\";\n border-top: 0.3em solid;\n border-right: 0.3em solid transparent;\n border-left: 0.3em solid transparent;\n}\n\n.dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropup .dropdown-toggle::after {\n border-top: 0;\n border-bottom: 0.3em solid;\n}\n\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 10rem;\n padding: 0.5rem 0;\n margin: 0.125rem 0 0;\n font-size: 1rem;\n color: #292b2c;\n text-align: left;\n list-style: none;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 0.25rem;\n}\n\n.dropdown-divider {\n height: 0;\n margin: 0.5rem 0;\n overflow: hidden;\n border-top: 1px solid #eceeef;\n}\n\n.dropdown-item {\n display: block;\n width: 100%;\n padding: 0.25rem 1.5rem;\n clear: both;\n font-weight: normal;\n color: #292b2c;\n text-align: inherit;\n white-space: nowrap;\n background: none;\n border: 0;\n}\n\n.dropdown-item:focus, .dropdown-item:hover {\n color: #1d1e1f;\n text-decoration: none;\n background-color: #f7f7f9;\n}\n\n.dropdown-item.active, .dropdown-item:active {\n color: #fff;\n text-decoration: none;\n background-color: #0275d8;\n}\n\n.dropdown-item.disabled, .dropdown-item:disabled {\n color: #636c72;\n background-color: transparent;\n}\n\n.show > .dropdown-menu {\n display: block;\n}\n\n.show > a {\n outline: 0;\n}\n\n.dropdown-menu-right {\n right: 0;\n left: auto;\n}\n\n.dropdown-menu-left {\n right: auto;\n left: 0;\n}\n\n.dropdown-header {\n display: block;\n padding: 0.5rem 1.5rem;\n margin-bottom: 0;\n font-size: 0.875rem;\n color: #636c72;\n white-space: nowrap;\n}\n\n.dropup .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 0.125rem;\n}\n\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-flex;\n vertical-align: middle;\n}\n\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n flex: 0 1 auto;\n margin-bottom: 0;\n}\n\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover {\n z-index: 2;\n}\n\n.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active,\n.btn-group-vertical > .btn:focus,\n.btn-group-vertical > .btn:active,\n.btn-group-vertical > .btn.active {\n z-index: 2;\n}\n\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group,\n.btn-group-vertical .btn + .btn,\n.btn-group-vertical .btn + .btn-group,\n.btn-group-vertical .btn-group + .btn,\n.btn-group-vertical .btn-group + .btn-group {\n margin-left: -1px;\n}\n\n.btn-toolbar {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-start;\n}\n\n.btn-toolbar .input-group {\n width: auto;\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n\n.btn-group > .btn:first-child {\n margin-left: 0;\n}\n\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.btn-group > .btn-group {\n float: left;\n}\n\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n\n.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.btn + .dropdown-toggle-split {\n padding-right: 0.75rem;\n padding-left: 0.75rem;\n}\n\n.btn + .dropdown-toggle-split::after {\n margin-left: 0;\n}\n\n.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split {\n padding-right: 0.375rem;\n padding-left: 0.375rem;\n}\n\n.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {\n padding-right: 0.75rem;\n padding-left: 0.75rem;\n}\n\n.btn-group-vertical {\n display: inline-flex;\n flex-direction: column;\n align-items: flex-start;\n justify-content: center;\n}\n\n.btn-group-vertical .btn,\n.btn-group-vertical .btn-group {\n width: 100%;\n}\n\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n}\n\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n\n.input-group {\n position: relative;\n display: flex;\n width: 100%;\n}\n\n.input-group .form-control {\n position: relative;\n z-index: 2;\n flex: 1 1 auto;\n width: 1%;\n margin-bottom: 0;\n}\n\n.input-group .form-control:focus, .input-group .form-control:active, .input-group .form-control:hover {\n z-index: 3;\n}\n\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: flex;\n align-items: center;\n}\n\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n\n.input-group-addon,\n.input-group-btn {\n white-space: nowrap;\n vertical-align: middle;\n}\n\n.input-group-addon {\n padding: 0.5rem 1rem;\n margin-bottom: 0;\n font-size: 1rem;\n font-weight: normal;\n line-height: 1.25;\n color: #464a4c;\n text-align: center;\n background-color: #eceeef;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 0.25rem;\n}\n\n.input-group-addon.form-control-sm,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .input-group-addon.btn {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n border-radius: 0.2rem;\n}\n\n.input-group-addon.form-control-lg,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .input-group-addon.btn {\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n border-radius: 0.3rem;\n}\n\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n margin-top: 0;\n}\n\n.input-group .form-control:not(:last-child),\n.input-group-addon:not(:last-child),\n.input-group-btn:not(:last-child) > .btn,\n.input-group-btn:not(:last-child) > .btn-group > .btn,\n.input-group-btn:not(:last-child) > .dropdown-toggle,\n.input-group-btn:not(:first-child) > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:not(:first-child) > .btn-group:not(:last-child) > .btn {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.input-group-addon:not(:last-child) {\n border-right: 0;\n}\n\n.input-group .form-control:not(:first-child),\n.input-group-addon:not(:first-child),\n.input-group-btn:not(:first-child) > .btn,\n.input-group-btn:not(:first-child) > .btn-group > .btn,\n.input-group-btn:not(:first-child) > .dropdown-toggle,\n.input-group-btn:not(:last-child) > .btn:not(:first-child),\n.input-group-btn:not(:last-child) > .btn-group:not(:first-child) > .btn {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.form-control + .input-group-addon:not(:first-child) {\n border-left: 0;\n}\n\n.input-group-btn {\n position: relative;\n font-size: 0;\n white-space: nowrap;\n}\n\n.input-group-btn > .btn {\n position: relative;\n}\n\n.input-group-btn > .btn + .btn {\n margin-left: -1px;\n}\n\n.input-group-btn > .btn:focus, .input-group-btn > .btn:active, .input-group-btn > .btn:hover {\n z-index: 3;\n}\n\n.input-group-btn:not(:last-child) > .btn,\n.input-group-btn:not(:last-child) > .btn-group {\n margin-right: -1px;\n}\n\n.input-group-btn:not(:first-child) > .btn,\n.input-group-btn:not(:first-child) > .btn-group {\n z-index: 2;\n margin-left: -1px;\n}\n\n.input-group-btn:not(:first-child) > .btn:focus, .input-group-btn:not(:first-child) > .btn:active, .input-group-btn:not(:first-child) > .btn:hover,\n.input-group-btn:not(:first-child) > .btn-group:focus,\n.input-group-btn:not(:first-child) > .btn-group:active,\n.input-group-btn:not(:first-child) > .btn-group:hover {\n z-index: 3;\n}\n\n.custom-control {\n position: relative;\n display: inline-flex;\n min-height: 1.5rem;\n padding-left: 1.5rem;\n margin-right: 1rem;\n}\n\n.custom-control-input {\n position: absolute;\n z-index: -1;\n opacity: 0;\n}\n\n.custom-control-input:checked ~ .custom-control-indicator {\n color: #fff;\n background-color: #0275d8;\n}\n\n.custom-control-input:focus ~ .custom-control-indicator {\n box-shadow: 0 0 0 1px #fff, 0 0 0 3px #0275d8;\n}\n\n.custom-control-input:active ~ .custom-control-indicator {\n color: #fff;\n background-color: #8fcafe;\n}\n\n.custom-control-input:disabled ~ .custom-control-indicator {\n background-color: #eceeef;\n}\n\n.custom-control-input:disabled ~ .custom-control-description {\n color: #636c72;\n}\n\n.custom-control-indicator {\n position: absolute;\n top: 0.25rem;\n left: 0;\n display: block;\n width: 1rem;\n height: 1rem;\n pointer-events: none;\n user-select: none;\n background-color: #ddd;\n background-repeat: no-repeat;\n background-position: center center;\n background-size: 50% 50%;\n}\n\n.custom-checkbox .custom-control-indicator {\n border-radius: 0.25rem;\n}\n\n.custom-checkbox .custom-control-input:checked ~ .custom-control-indicator {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E\");\n}\n\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-indicator {\n background-color: #0275d8;\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E\");\n}\n\n.custom-radio .custom-control-indicator {\n border-radius: 50%;\n}\n\n.custom-radio .custom-control-input:checked ~ .custom-control-indicator {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E\");\n}\n\n.custom-controls-stacked {\n display: flex;\n flex-direction: column;\n}\n\n.custom-controls-stacked .custom-control {\n margin-bottom: 0.25rem;\n}\n\n.custom-controls-stacked .custom-control + .custom-control {\n margin-left: 0;\n}\n\n.custom-select {\n display: inline-block;\n max-width: 100%;\n height: calc(2.25rem + 2px);\n padding: 0.375rem 1.75rem 0.375rem 0.75rem;\n line-height: 1.25;\n color: #464a4c;\n vertical-align: middle;\n background: #fff url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23333' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E\") no-repeat right 0.75rem center;\n background-size: 8px 10px;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 0.25rem;\n appearance: none;\n}\n\n.custom-select:focus {\n border-color: #5cb3fd;\n outline: none;\n}\n\n.custom-select:focus::-ms-value {\n color: #464a4c;\n background-color: #fff;\n}\n\n.custom-select:disabled {\n color: #636c72;\n background-color: #eceeef;\n}\n\n.custom-select::-ms-expand {\n opacity: 0;\n}\n\n.custom-select-sm {\n padding-top: 0.375rem;\n padding-bottom: 0.375rem;\n font-size: 75%;\n}\n\n.custom-file {\n position: relative;\n display: inline-block;\n max-width: 100%;\n height: 2.5rem;\n margin-bottom: 0;\n}\n\n.custom-file-input {\n min-width: 14rem;\n max-width: 100%;\n height: 2.5rem;\n margin: 0;\n opacity: 0;\n}\n\n.custom-file-control {\n position: absolute;\n top: 0;\n right: 0;\n left: 0;\n z-index: 5;\n height: 2.5rem;\n padding: 0.5rem 1rem;\n line-height: 1.5;\n color: #464a4c;\n pointer-events: none;\n user-select: none;\n background-color: #fff;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 0.25rem;\n}\n\n.custom-file-control:lang(en):empty::after {\n content: \"Choose file...\";\n}\n\n.custom-file-control::before {\n position: absolute;\n top: -1px;\n right: -1px;\n bottom: -1px;\n z-index: 6;\n display: block;\n height: 2.5rem;\n padding: 0.5rem 1rem;\n line-height: 1.5;\n color: #464a4c;\n background-color: #eceeef;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 0 0.25rem 0.25rem 0;\n}\n\n.custom-file-control:lang(en)::before {\n content: \"Browse\";\n}\n\n.nav {\n display: flex;\n flex-wrap: wrap;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.nav-link {\n display: block;\n padding: 0.5rem 1rem;\n}\n\n.nav-link:focus, .nav-link:hover {\n text-decoration: none;\n}\n\n.nav-link.disabled {\n color: #636c72;\n}\n\n.nav-tabs {\n border-bottom: 1px solid #ddd;\n}\n\n.nav-tabs .nav-item {\n margin-bottom: -1px;\n}\n\n.nav-tabs .nav-link {\n border: 1px solid transparent;\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n\n.nav-tabs .nav-link:focus, .nav-tabs .nav-link:hover {\n border-color: #eceeef #eceeef #ddd;\n}\n\n.nav-tabs .nav-link.disabled {\n color: #636c72;\n background-color: transparent;\n border-color: transparent;\n}\n\n.nav-tabs .nav-link.active,\n.nav-tabs .nav-item.show .nav-link {\n color: #464a4c;\n background-color: #fff;\n border-color: #ddd #ddd #fff;\n}\n\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.nav-pills .nav-link {\n border-radius: 0.25rem;\n}\n\n.nav-pills .nav-link.active,\n.show .nav-pills .nav-link {\n color: #fff;\n background-color: #0275d8;\n}\n\n.nav-fill .nav-item {\n flex: 1 1 auto;\n text-align: center;\n}\n\n.nav-justified .nav-item {\n flex-basis: 0;\n flex-grow: 1;\n text-align: center;\n}\n\n.tab-content > .tab-pane {\n display: none;\n}\n\n.tab-content > .active {\n display: block;\n}\n\n.navbar {\n position: relative;\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n padding: 0.5rem 1rem;\n}\n\n.navbar > .container,\n.navbar > .container-fluid {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n}\n\n@media (max-width: 575px) {\n .navbar > .container,\n .navbar > .container-fluid {\n width: 100%;\n margin-right: 0;\n margin-left: 0;\n }\n}\n\n.navbar-brand {\n display: inline-block;\n padding-top: 0.3125rem;\n padding-bottom: 0.3125rem;\n margin-right: 1rem;\n font-size: 1.25rem;\n line-height: inherit;\n white-space: nowrap;\n}\n\n.navbar-brand:focus, .navbar-brand:hover {\n text-decoration: none;\n}\n\n.navbar-nav {\n display: flex;\n flex-direction: column;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.navbar-nav .nav-link {\n padding-right: 0;\n padding-left: 0;\n}\n\n.navbar-text {\n display: inline-block;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n}\n\n.navbar-collapse {\n flex-basis: 100%;\n}\n\n.navbar-toggler {\n padding: 0.25rem 0.75rem;\n font-size: 1.25rem;\n line-height: 1;\n background: transparent;\n border: 1px solid transparent;\n border-radius: 0.25rem;\n}\n\n.navbar-toggler:focus, .navbar-toggler:hover {\n text-decoration: none;\n}\n\n.navbar-toggler-icon {\n display: inline-block;\n width: 1.5em;\n height: 1.5em;\n vertical-align: middle;\n content: \"\";\n background: no-repeat center center;\n background-size: 100% 100%;\n}\n\n@media (max-width: 575px) {\n .navbar-expand-sm .navbar-nav .dropdown-menu {\n position: static;\n float: none;\n }\n .navbar-expand-sm > .container,\n .navbar-expand-sm > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 576px) {\n .navbar-expand-sm {\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-sm .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-sm .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-sm .navbar-nav .nav-link {\n padding-right: .5rem;\n padding-left: .5rem;\n }\n .navbar-expand-sm > .container,\n .navbar-expand-sm > .container-fluid {\n flex-wrap: nowrap;\n }\n .navbar-expand-sm .navbar-collapse {\n display: flex !important;\n }\n .navbar-expand-sm .navbar-toggler {\n display: none;\n }\n}\n\n@media (max-width: 767px) {\n .navbar-expand-md .navbar-nav .dropdown-menu {\n position: static;\n float: none;\n }\n .navbar-expand-md > .container,\n .navbar-expand-md > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 768px) {\n .navbar-expand-md {\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-md .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-md .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-md .navbar-nav .nav-link {\n padding-right: .5rem;\n padding-left: .5rem;\n }\n .navbar-expand-md > .container,\n .navbar-expand-md > .container-fluid {\n flex-wrap: nowrap;\n }\n .navbar-expand-md .navbar-collapse {\n display: flex !important;\n }\n .navbar-expand-md .navbar-toggler {\n display: none;\n }\n}\n\n@media (max-width: 991px) {\n .navbar-expand-lg .navbar-nav .dropdown-menu {\n position: static;\n float: none;\n }\n .navbar-expand-lg > .container,\n .navbar-expand-lg > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 992px) {\n .navbar-expand-lg {\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-lg .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-lg .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-lg .navbar-nav .nav-link {\n padding-right: .5rem;\n padding-left: .5rem;\n }\n .navbar-expand-lg > .container,\n .navbar-expand-lg > .container-fluid {\n flex-wrap: nowrap;\n }\n .navbar-expand-lg .navbar-collapse {\n display: flex !important;\n }\n .navbar-expand-lg .navbar-toggler {\n display: none;\n }\n}\n\n@media (max-width: 1199px) {\n .navbar-expand-xl .navbar-nav .dropdown-menu {\n position: static;\n float: none;\n }\n .navbar-expand-xl > .container,\n .navbar-expand-xl > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 1200px) {\n .navbar-expand-xl {\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-xl .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-xl .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-xl .navbar-nav .nav-link {\n padding-right: .5rem;\n padding-left: .5rem;\n }\n .navbar-expand-xl > .container,\n .navbar-expand-xl > .container-fluid {\n flex-wrap: nowrap;\n }\n .navbar-expand-xl .navbar-collapse {\n display: flex !important;\n }\n .navbar-expand-xl .navbar-toggler {\n display: none;\n }\n}\n\n.navbar-expand {\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n}\n\n.navbar-expand .navbar-nav .dropdown-menu {\n position: static;\n float: none;\n}\n\n.navbar-expand > .container,\n.navbar-expand > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n}\n\n.navbar-expand .navbar-nav {\n flex-direction: row;\n}\n\n.navbar-expand .navbar-nav .dropdown-menu {\n position: absolute;\n}\n\n.navbar-expand .navbar-nav .nav-link {\n padding-right: .5rem;\n padding-left: .5rem;\n}\n\n.navbar-expand > .container,\n.navbar-expand > .container-fluid {\n flex-wrap: nowrap;\n}\n\n.navbar-expand .navbar-collapse {\n display: flex !important;\n}\n\n.navbar-expand .navbar-toggler {\n display: none;\n}\n\n.navbar-light .navbar-brand {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-brand:focus, .navbar-light .navbar-brand:hover {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-nav .nav-link {\n color: rgba(0, 0, 0, 0.5);\n}\n\n.navbar-light .navbar-nav .nav-link:focus, .navbar-light .navbar-nav .nav-link:hover {\n color: rgba(0, 0, 0, 0.7);\n}\n\n.navbar-light .navbar-nav .nav-link.disabled {\n color: rgba(0, 0, 0, 0.3);\n}\n\n.navbar-light .navbar-nav .show > .nav-link,\n.navbar-light .navbar-nav .active > .nav-link,\n.navbar-light .navbar-nav .nav-link.show,\n.navbar-light .navbar-nav .nav-link.active {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-toggler {\n color: rgba(0, 0, 0, 0.5);\n border-color: rgba(0, 0, 0, 0.1);\n}\n\n.navbar-light .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E\");\n}\n\n.navbar-light .navbar-text {\n color: rgba(0, 0, 0, 0.5);\n}\n\n.navbar-inverse .navbar-brand {\n color: white;\n}\n\n.navbar-inverse .navbar-brand:focus, .navbar-inverse .navbar-brand:hover {\n color: white;\n}\n\n.navbar-inverse .navbar-nav .nav-link {\n color: rgba(255, 255, 255, 0.5);\n}\n\n.navbar-inverse .navbar-nav .nav-link:focus, .navbar-inverse .navbar-nav .nav-link:hover {\n color: rgba(255, 255, 255, 0.75);\n}\n\n.navbar-inverse .navbar-nav .nav-link.disabled {\n color: rgba(255, 255, 255, 0.25);\n}\n\n.navbar-inverse .navbar-nav .show > .nav-link,\n.navbar-inverse .navbar-nav .active > .nav-link,\n.navbar-inverse .navbar-nav .nav-link.show,\n.navbar-inverse .navbar-nav .nav-link.active {\n color: white;\n}\n\n.navbar-inverse .navbar-toggler {\n color: rgba(255, 255, 255, 0.5);\n border-color: rgba(255, 255, 255, 0.1);\n}\n\n.navbar-inverse .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E\");\n}\n\n.navbar-inverse .navbar-text {\n color: rgba(255, 255, 255, 0.5);\n}\n\n.card {\n position: relative;\n display: flex;\n flex-direction: column;\n background-color: #fff;\n border: 1px solid rgba(0, 0, 0, 0.125);\n border-radius: 0.25rem;\n}\n\n.card-block {\n flex: 1 1 auto;\n padding: 1.25rem;\n}\n\n.card-title {\n margin-bottom: 0.75rem;\n word-break: break-all;\n}\n\n.card-subtitle {\n margin-top: -0.375rem;\n margin-bottom: 0;\n}\n\n.card-text:last-child {\n margin-bottom: 0;\n}\n\n.card-link:hover {\n text-decoration: none;\n}\n\n.card-link + .card-link {\n margin-left: 1.25rem;\n}\n\n.card > .list-group:first-child .list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n\n.card > .list-group:last-child .list-group-item:last-child {\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n\n.card-header {\n padding: 0.75rem 1.25rem;\n margin-bottom: 0;\n background-color: #f7f7f9;\n border-bottom: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.card-header:first-child {\n border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0;\n}\n\n.card-footer {\n padding: 0.75rem 1.25rem;\n background-color: #f7f7f9;\n border-top: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.card-footer:last-child {\n border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px);\n}\n\n.card-header-tabs {\n margin-right: -0.625rem;\n margin-bottom: -0.75rem;\n margin-left: -0.625rem;\n border-bottom: 0;\n}\n\n.card-header-pills {\n margin-right: -0.625rem;\n margin-left: -0.625rem;\n}\n\n.card-primary {\n background-color: #0275d8;\n border-color: #0275d8;\n}\n\n.card-primary .card-header,\n.card-primary .card-footer {\n background-color: transparent;\n}\n\n.card-success {\n background-color: #5cb85c;\n border-color: #5cb85c;\n}\n\n.card-success .card-header,\n.card-success .card-footer {\n background-color: transparent;\n}\n\n.card-info {\n background-color: #5bc0de;\n border-color: #5bc0de;\n}\n\n.card-info .card-header,\n.card-info .card-footer {\n background-color: transparent;\n}\n\n.card-warning {\n background-color: #f0ad4e;\n border-color: #f0ad4e;\n}\n\n.card-warning .card-header,\n.card-warning .card-footer {\n background-color: transparent;\n}\n\n.card-danger {\n background-color: #d9534f;\n border-color: #d9534f;\n}\n\n.card-danger .card-header,\n.card-danger .card-footer {\n background-color: transparent;\n}\n\n.card-outline-primary {\n background-color: transparent;\n border-color: #0275d8;\n}\n\n.card-outline-primary .card-header,\n.card-outline-primary .card-footer {\n background-color: transparent;\n border-color: #0275d8;\n}\n\n.card-outline-secondary {\n background-color: transparent;\n border-color: #ccc;\n}\n\n.card-outline-secondary .card-header,\n.card-outline-secondary .card-footer {\n background-color: transparent;\n border-color: #ccc;\n}\n\n.card-outline-info {\n background-color: transparent;\n border-color: #5bc0de;\n}\n\n.card-outline-info .card-header,\n.card-outline-info .card-footer {\n background-color: transparent;\n border-color: #5bc0de;\n}\n\n.card-outline-success {\n background-color: transparent;\n border-color: #5cb85c;\n}\n\n.card-outline-success .card-header,\n.card-outline-success .card-footer {\n background-color: transparent;\n border-color: #5cb85c;\n}\n\n.card-outline-warning {\n background-color: transparent;\n border-color: #f0ad4e;\n}\n\n.card-outline-warning .card-header,\n.card-outline-warning .card-footer {\n background-color: transparent;\n border-color: #f0ad4e;\n}\n\n.card-outline-danger {\n background-color: transparent;\n border-color: #d9534f;\n}\n\n.card-outline-danger .card-header,\n.card-outline-danger .card-footer {\n background-color: transparent;\n border-color: #d9534f;\n}\n\n.card-inverse {\n color: rgba(255, 255, 255, 0.65);\n}\n\n.card-inverse .card-header,\n.card-inverse .card-footer {\n background-color: transparent;\n border-color: rgba(255, 255, 255, 0.2);\n}\n\n.card-inverse .card-header,\n.card-inverse .card-footer,\n.card-inverse .card-title,\n.card-inverse .card-blockquote {\n color: #fff;\n}\n\n.card-inverse .card-link,\n.card-inverse .card-text,\n.card-inverse .card-subtitle,\n.card-inverse .card-blockquote .blockquote-footer {\n color: rgba(255, 255, 255, 0.65);\n}\n\n.card-inverse .card-link:focus, .card-inverse .card-link:hover {\n color: #fff;\n}\n\n.card-blockquote {\n padding: 0;\n margin-bottom: 0;\n border-left: 0;\n}\n\n.card-img-overlay {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n padding: 1.25rem;\n}\n\n.card-img {\n width: 100%;\n border-radius: calc(0.25rem - 1px);\n}\n\n.card-img-top {\n width: 100%;\n border-top-left-radius: calc(0.25rem - 1px);\n border-top-right-radius: calc(0.25rem - 1px);\n}\n\n.card-img-bottom {\n width: 100%;\n border-bottom-right-radius: calc(0.25rem - 1px);\n border-bottom-left-radius: calc(0.25rem - 1px);\n}\n\n@media (min-width: 576px) {\n .card-deck {\n display: flex;\n flex-flow: row wrap;\n margin-right: -15px;\n margin-left: -15px;\n }\n .card-deck .card {\n display: flex;\n flex: 1 0 0;\n flex-direction: column;\n margin-right: 15px;\n margin-left: 15px;\n }\n}\n\n@media (min-width: 576px) {\n .card-group {\n display: flex;\n flex-flow: row wrap;\n }\n .card-group .card {\n flex: 1 0 0;\n }\n .card-group .card + .card {\n margin-left: 0;\n border-left: 0;\n }\n .card-group .card:first-child {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n .card-group .card:first-child .card-img-top {\n border-top-right-radius: 0;\n }\n .card-group .card:first-child .card-img-bottom {\n border-bottom-right-radius: 0;\n }\n .card-group .card:last-child {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n }\n .card-group .card:last-child .card-img-top {\n border-top-left-radius: 0;\n }\n .card-group .card:last-child .card-img-bottom {\n border-bottom-left-radius: 0;\n }\n .card-group .card:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n .card-group .card:not(:first-child):not(:last-child) .card-img-top,\n .card-group .card:not(:first-child):not(:last-child) .card-img-bottom {\n border-radius: 0;\n }\n}\n\n.card-columns .card {\n margin-bottom: 0.75rem;\n}\n\n@media (min-width: 576px) {\n .card-columns {\n column-count: 3;\n column-gap: 1.25rem;\n }\n .card-columns .card {\n display: inline-block;\n width: 100%;\n }\n}\n\n.breadcrumb {\n padding: 0.75rem 1rem;\n margin-bottom: 1rem;\n list-style: none;\n background-color: #eceeef;\n border-radius: 0.25rem;\n}\n\n.breadcrumb::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.breadcrumb-item {\n float: left;\n}\n\n.breadcrumb-item + .breadcrumb-item::before {\n display: inline-block;\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n color: #636c72;\n content: \"/\";\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n text-decoration: underline;\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n text-decoration: none;\n}\n\n.breadcrumb-item.active {\n color: #636c72;\n}\n\n.pagination {\n display: flex;\n padding-left: 0;\n list-style: none;\n border-radius: 0.25rem;\n}\n\n.page-item:first-child .page-link {\n margin-left: 0;\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n\n.page-item:last-child .page-link {\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n}\n\n.page-item.active .page-link {\n z-index: 2;\n color: #fff;\n background-color: #0275d8;\n border-color: #0275d8;\n}\n\n.page-item.disabled .page-link {\n color: #636c72;\n pointer-events: none;\n background-color: #fff;\n border-color: #ddd;\n}\n\n.page-link {\n position: relative;\n display: block;\n padding: 0.5rem 0.75rem;\n margin-left: -1px;\n line-height: 1.25;\n color: #0275d8;\n background-color: #fff;\n border: 1px solid #ddd;\n}\n\n.page-link:focus, .page-link:hover {\n color: #014c8c;\n text-decoration: none;\n background-color: #eceeef;\n border-color: #ddd;\n}\n\n.pagination-lg .page-link {\n padding: 0.75rem 1.5rem;\n font-size: 1.25rem;\n}\n\n.pagination-lg .page-item:first-child .page-link {\n border-top-left-radius: 0.3rem;\n border-bottom-left-radius: 0.3rem;\n}\n\n.pagination-lg .page-item:last-child .page-link {\n border-top-right-radius: 0.3rem;\n border-bottom-right-radius: 0.3rem;\n}\n\n.pagination-sm .page-link {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n}\n\n.pagination-sm .page-item:first-child .page-link {\n border-top-left-radius: 0.2rem;\n border-bottom-left-radius: 0.2rem;\n}\n\n.pagination-sm .page-item:last-child .page-link {\n border-top-right-radius: 0.2rem;\n border-bottom-right-radius: 0.2rem;\n}\n\n.badge {\n display: inline-block;\n padding: 0.25em 0.4em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: 0.25rem;\n}\n\n.badge:empty {\n display: none;\n}\n\n.btn .badge {\n position: relative;\n top: -1px;\n}\n\na.badge:focus, a.badge:hover {\n color: #fff;\n text-decoration: none;\n}\n\n.badge-pill {\n padding-right: 0.6em;\n padding-left: 0.6em;\n border-radius: 10rem;\n}\n\n.badge-default {\n background-color: #636c72;\n}\n\n.badge-default[href]:focus, .badge-default[href]:hover {\n background-color: #4b5257;\n}\n\n.badge-primary {\n background-color: #0275d8;\n}\n\n.badge-primary[href]:focus, .badge-primary[href]:hover {\n background-color: #025aa5;\n}\n\n.badge-success {\n background-color: #5cb85c;\n}\n\n.badge-success[href]:focus, .badge-success[href]:hover {\n background-color: #449d44;\n}\n\n.badge-info {\n background-color: #5bc0de;\n}\n\n.badge-info[href]:focus, .badge-info[href]:hover {\n background-color: #31b0d5;\n}\n\n.badge-warning {\n background-color: #f0ad4e;\n}\n\n.badge-warning[href]:focus, .badge-warning[href]:hover {\n background-color: #ec971f;\n}\n\n.badge-danger {\n background-color: #d9534f;\n}\n\n.badge-danger[href]:focus, .badge-danger[href]:hover {\n background-color: #c9302c;\n}\n\n.jumbotron {\n padding: 2rem 1rem;\n margin-bottom: 2rem;\n background-color: #eceeef;\n border-radius: 0.3rem;\n}\n\n@media (min-width: 576px) {\n .jumbotron {\n padding: 4rem 2rem;\n }\n}\n\n.jumbotron-fluid {\n padding-right: 0;\n padding-left: 0;\n border-radius: 0;\n}\n\n.alert {\n padding: 0.75rem 1.25rem;\n margin-bottom: 1rem;\n border: 1px solid transparent;\n border-radius: 0.25rem;\n}\n\n.alert-heading {\n color: inherit;\n}\n\n.alert-link {\n font-weight: bold;\n}\n\n.alert-dismissible .close {\n position: relative;\n top: -0.75rem;\n right: -1.25rem;\n padding: 0.75rem 1.25rem;\n color: inherit;\n}\n\n.alert-success {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d0e9c6;\n}\n\n.alert-success hr {\n border-top-color: #c1e2b3;\n}\n\n.alert-success .alert-link {\n color: #2b542c;\n}\n\n.alert-info {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bcdff1;\n}\n\n.alert-info hr {\n border-top-color: #a6d5ec;\n}\n\n.alert-info .alert-link {\n color: #245269;\n}\n\n.alert-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faf2cc;\n}\n\n.alert-warning hr {\n border-top-color: #f7ecb5;\n}\n\n.alert-warning .alert-link {\n color: #66512c;\n}\n\n.alert-danger {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebcccc;\n}\n\n.alert-danger hr {\n border-top-color: #e4b9b9;\n}\n\n.alert-danger .alert-link {\n color: #843534;\n}\n\n@keyframes progress-bar-stripes {\n from {\n background-position: 1rem 0;\n }\n to {\n background-position: 0 0;\n }\n}\n\n.progress {\n display: flex;\n overflow: hidden;\n font-size: 0.75rem;\n line-height: 1rem;\n text-align: center;\n background-color: #eceeef;\n border-radius: 0.25rem;\n}\n\n.progress-bar {\n height: 1rem;\n line-height: 1rem;\n color: #fff;\n background-color: #0275d8;\n transition: width 0.6s ease;\n}\n\n.progress-bar-striped {\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-size: 1rem 1rem;\n}\n\n.progress-bar-animated {\n animation: progress-bar-stripes 1s linear infinite;\n}\n\n.media {\n display: flex;\n align-items: flex-start;\n}\n\n.media-body {\n flex: 1;\n}\n\n.list-group {\n display: flex;\n flex-direction: column;\n padding-left: 0;\n margin-bottom: 0;\n}\n\n.list-group-item-action {\n width: 100%;\n color: #464a4c;\n text-align: inherit;\n}\n\n.list-group-item-action:focus, .list-group-item-action:hover {\n color: #464a4c;\n text-decoration: none;\n background-color: #f7f7f9;\n}\n\n.list-group-item-action:active {\n color: #292b2c;\n background-color: #eceeef;\n}\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 0.75rem 1.25rem;\n margin-bottom: -1px;\n background-color: #fff;\n border: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n\n.list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n\n.list-group-item:focus, .list-group-item:hover {\n text-decoration: none;\n}\n\n.list-group-item.disabled, .list-group-item:disabled {\n color: #636c72;\n background-color: #fff;\n}\n\n.list-group-item.active {\n z-index: 2;\n color: #fff;\n background-color: #0275d8;\n border-color: #0275d8;\n}\n\n.list-group-flush .list-group-item {\n border-right: 0;\n border-left: 0;\n border-radius: 0;\n}\n\n.list-group-flush:first-child .list-group-item:first-child {\n border-top: 0;\n}\n\n.list-group-flush:last-child .list-group-item:last-child {\n border-bottom: 0;\n}\n\n.list-group-item-success {\n color: #3c763d;\n background-color: #dff0d8;\n}\n\na.list-group-item-success,\nbutton.list-group-item-success {\n color: #3c763d;\n}\n\na.list-group-item-success:focus, a.list-group-item-success:hover,\nbutton.list-group-item-success:focus,\nbutton.list-group-item-success:hover {\n color: #3c763d;\n background-color: #d0e9c6;\n}\n\na.list-group-item-success.active,\nbutton.list-group-item-success.active {\n color: #fff;\n background-color: #3c763d;\n border-color: #3c763d;\n}\n\n.list-group-item-info {\n color: #31708f;\n background-color: #d9edf7;\n}\n\na.list-group-item-info,\nbutton.list-group-item-info {\n color: #31708f;\n}\n\na.list-group-item-info:focus, a.list-group-item-info:hover,\nbutton.list-group-item-info:focus,\nbutton.list-group-item-info:hover {\n color: #31708f;\n background-color: #c4e3f3;\n}\n\na.list-group-item-info.active,\nbutton.list-group-item-info.active {\n color: #fff;\n background-color: #31708f;\n border-color: #31708f;\n}\n\n.list-group-item-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n}\n\na.list-group-item-warning,\nbutton.list-group-item-warning {\n color: #8a6d3b;\n}\n\na.list-group-item-warning:focus, a.list-group-item-warning:hover,\nbutton.list-group-item-warning:focus,\nbutton.list-group-item-warning:hover {\n color: #8a6d3b;\n background-color: #faf2cc;\n}\n\na.list-group-item-warning.active,\nbutton.list-group-item-warning.active {\n color: #fff;\n background-color: #8a6d3b;\n border-color: #8a6d3b;\n}\n\n.list-group-item-danger {\n color: #a94442;\n background-color: #f2dede;\n}\n\na.list-group-item-danger,\nbutton.list-group-item-danger {\n color: #a94442;\n}\n\na.list-group-item-danger:focus, a.list-group-item-danger:hover,\nbutton.list-group-item-danger:focus,\nbutton.list-group-item-danger:hover {\n color: #a94442;\n background-color: #ebcccc;\n}\n\na.list-group-item-danger.active,\nbutton.list-group-item-danger.active {\n color: #fff;\n background-color: #a94442;\n border-color: #a94442;\n}\n\n.embed-responsive {\n position: relative;\n display: block;\n width: 100%;\n padding: 0;\n overflow: hidden;\n}\n\n.embed-responsive::before {\n display: block;\n content: \"\";\n}\n\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 0;\n}\n\n.embed-responsive-21by9::before {\n padding-top: 42.857143%;\n}\n\n.embed-responsive-16by9::before {\n padding-top: 56.25%;\n}\n\n.embed-responsive-4by3::before {\n padding-top: 75%;\n}\n\n.embed-responsive-1by1::before {\n padding-top: 100%;\n}\n\n.close {\n float: right;\n font-size: 1.5rem;\n font-weight: bold;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n opacity: .5;\n}\n\n.close:focus, .close:hover {\n color: #000;\n text-decoration: none;\n opacity: .75;\n}\n\nbutton.close {\n padding: 0;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n}\n\n.modal-open {\n overflow: hidden;\n}\n\n.modal {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1050;\n display: none;\n overflow: hidden;\n outline: 0;\n}\n\n.modal.fade .modal-dialog {\n transition: transform 0.3s ease-out;\n transform: translate(0, -25%);\n}\n\n.modal.show .modal-dialog {\n transform: translate(0, 0);\n}\n\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n\n.modal-content {\n position: relative;\n display: flex;\n flex-direction: column;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 0.3rem;\n outline: 0;\n}\n\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1040;\n background-color: #000;\n}\n\n.modal-backdrop.fade {\n opacity: 0;\n}\n\n.modal-backdrop.show {\n opacity: 0.5;\n}\n\n.modal-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 15px;\n border-bottom: 1px solid #eceeef;\n}\n\n.modal-title {\n margin-bottom: 0;\n line-height: 1.5;\n}\n\n.modal-body {\n position: relative;\n flex: 1 1 auto;\n padding: 15px;\n}\n\n.modal-footer {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n padding: 15px;\n border-top: 1px solid #eceeef;\n}\n\n.modal-footer > :not(:first-child) {\n margin-left: .25rem;\n}\n\n.modal-footer > :not(:last-child) {\n margin-right: .25rem;\n}\n\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n@media (min-width: 576px) {\n .modal-dialog {\n max-width: 500px;\n margin: 30px auto;\n }\n .modal-sm {\n max-width: 300px;\n }\n}\n\n@media (min-width: 992px) {\n .modal-lg {\n max-width: 800px;\n }\n}\n\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n line-height: 1.5;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n font-size: 0.875rem;\n word-wrap: break-word;\n opacity: 0;\n}\n\n.tooltip.show {\n opacity: 0.9;\n}\n\n.tooltip.tooltip-top, .tooltip.bs-tether-element-attached-bottom {\n padding: 5px 0;\n margin-top: -3px;\n}\n\n.tooltip.tooltip-top .tooltip-inner::before, .tooltip.bs-tether-element-attached-bottom .tooltip-inner::before {\n bottom: 0;\n left: 50%;\n margin-left: -5px;\n content: \"\";\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n\n.tooltip.tooltip-right, .tooltip.bs-tether-element-attached-left {\n padding: 0 5px;\n margin-left: 3px;\n}\n\n.tooltip.tooltip-right .tooltip-inner::before, .tooltip.bs-tether-element-attached-left .tooltip-inner::before {\n top: 50%;\n left: 0;\n margin-top: -5px;\n content: \"\";\n border-width: 5px 5px 5px 0;\n border-right-color: #000;\n}\n\n.tooltip.tooltip-bottom, .tooltip.bs-tether-element-attached-top {\n padding: 5px 0;\n margin-top: 3px;\n}\n\n.tooltip.tooltip-bottom .tooltip-inner::before, .tooltip.bs-tether-element-attached-top .tooltip-inner::before {\n top: 0;\n left: 50%;\n margin-left: -5px;\n content: \"\";\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n\n.tooltip.tooltip-left, .tooltip.bs-tether-element-attached-right {\n padding: 0 5px;\n margin-left: -3px;\n}\n\n.tooltip.tooltip-left .tooltip-inner::before, .tooltip.bs-tether-element-attached-right .tooltip-inner::before {\n top: 50%;\n right: 0;\n margin-top: -5px;\n content: \"\";\n border-width: 5px 0 5px 5px;\n border-left-color: #000;\n}\n\n.tooltip-inner {\n max-width: 200px;\n padding: 3px 8px;\n color: #fff;\n text-align: center;\n background-color: #000;\n border-radius: 0.25rem;\n}\n\n.tooltip-inner::before {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: block;\n max-width: 276px;\n padding: 1px;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n line-height: 1.5;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n font-size: 0.875rem;\n word-wrap: break-word;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 0.3rem;\n}\n\n.popover.popover-top, .popover.bs-tether-element-attached-bottom {\n margin-top: -10px;\n}\n\n.popover.popover-top::before, .popover.popover-top::after, .popover.bs-tether-element-attached-bottom::before, .popover.bs-tether-element-attached-bottom::after {\n left: 50%;\n border-bottom-width: 0;\n}\n\n.popover.popover-top::before, .popover.bs-tether-element-attached-bottom::before {\n bottom: -11px;\n margin-left: -11px;\n border-top-color: rgba(0, 0, 0, 0.25);\n}\n\n.popover.popover-top::after, .popover.bs-tether-element-attached-bottom::after {\n bottom: -10px;\n margin-left: -10px;\n border-top-color: #fff;\n}\n\n.popover.popover-right, .popover.bs-tether-element-attached-left {\n margin-left: 10px;\n}\n\n.popover.popover-right::before, .popover.popover-right::after, .popover.bs-tether-element-attached-left::before, .popover.bs-tether-element-attached-left::after {\n top: 50%;\n border-left-width: 0;\n}\n\n.popover.popover-right::before, .popover.bs-tether-element-attached-left::before {\n left: -11px;\n margin-top: -11px;\n border-right-color: rgba(0, 0, 0, 0.25);\n}\n\n.popover.popover-right::after, .popover.bs-tether-element-attached-left::after {\n left: -10px;\n margin-top: -10px;\n border-right-color: #fff;\n}\n\n.popover.popover-bottom, .popover.bs-tether-element-attached-top {\n margin-top: 10px;\n}\n\n.popover.popover-bottom::before, .popover.popover-bottom::after, .popover.bs-tether-element-attached-top::before, .popover.bs-tether-element-attached-top::after {\n left: 50%;\n border-top-width: 0;\n}\n\n.popover.popover-bottom::before, .popover.bs-tether-element-attached-top::before {\n top: -11px;\n margin-left: -11px;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n}\n\n.popover.popover-bottom::after, .popover.bs-tether-element-attached-top::after {\n top: -10px;\n margin-left: -10px;\n border-bottom-color: #fff;\n}\n\n.popover.popover-bottom .popover-title::before, .popover.bs-tether-element-attached-top .popover-title::before {\n position: absolute;\n top: 0;\n left: 50%;\n display: block;\n width: 20px;\n margin-left: -10px;\n content: \"\";\n border-bottom: 1px solid #f7f7f7;\n}\n\n.popover.popover-left, .popover.bs-tether-element-attached-right {\n margin-left: -10px;\n}\n\n.popover.popover-left::before, .popover.popover-left::after, .popover.bs-tether-element-attached-right::before, .popover.bs-tether-element-attached-right::after {\n top: 50%;\n border-right-width: 0;\n}\n\n.popover.popover-left::before, .popover.bs-tether-element-attached-right::before {\n right: -11px;\n margin-top: -11px;\n border-left-color: rgba(0, 0, 0, 0.25);\n}\n\n.popover.popover-left::after, .popover.bs-tether-element-attached-right::after {\n right: -10px;\n margin-top: -10px;\n border-left-color: #fff;\n}\n\n.popover-title {\n padding: 8px 14px;\n margin-bottom: 0;\n font-size: 1rem;\n color: inherit;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-top-left-radius: calc(0.3rem - 1px);\n border-top-right-radius: calc(0.3rem - 1px);\n}\n\n.popover-title:empty {\n display: none;\n}\n\n.popover-content {\n padding: 9px 14px;\n color: #292b2c;\n}\n\n.popover::before,\n.popover::after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n\n.popover::before {\n content: \"\";\n border-width: 11px;\n}\n\n.popover::after {\n content: \"\";\n border-width: 10px;\n}\n\n.carousel {\n position: relative;\n}\n\n.carousel-inner {\n position: relative;\n width: 100%;\n overflow: hidden;\n}\n\n.carousel-item {\n position: relative;\n display: none;\n align-items: center;\n width: 100%;\n transition: transform 0.6s ease;\n backface-visibility: hidden;\n perspective: 1000px;\n}\n\n.carousel-item.active,\n.carousel-item-next,\n.carousel-item-prev {\n display: flex;\n}\n\n.carousel-item-next,\n.carousel-item-prev {\n position: absolute;\n top: 0;\n}\n\n.carousel-item-next.carousel-item-left,\n.carousel-item-prev.carousel-item-right {\n transform: translate3d(0, 0, 0);\n}\n\n.carousel-item-next,\n.active.carousel-item-right {\n transform: translate3d(100%, 0, 0);\n}\n\n.carousel-item-prev,\n.active.carousel-item-left {\n transform: translate3d(-100%, 0, 0);\n}\n\n.carousel-control-prev,\n.carousel-control-next {\n position: absolute;\n top: 0;\n bottom: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 15%;\n color: #fff;\n text-align: center;\n opacity: 0.5;\n}\n\n.carousel-control-prev:focus, .carousel-control-prev:hover,\n.carousel-control-next:focus,\n.carousel-control-next:hover {\n color: #fff;\n text-decoration: none;\n outline: 0;\n opacity: .9;\n}\n\n.carousel-control-prev {\n left: 0;\n}\n\n.carousel-control-next {\n right: 0;\n}\n\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n display: inline-block;\n width: 20px;\n height: 20px;\n background: transparent no-repeat center center;\n background-size: 100% 100%;\n}\n\n.carousel-control-prev-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M4 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E\");\n}\n\n.carousel-control-next-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M1.5 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E\");\n}\n\n.carousel-indicators {\n position: absolute;\n right: 0;\n bottom: 10px;\n left: 0;\n z-index: 15;\n display: flex;\n justify-content: center;\n padding-left: 0;\n margin-right: 15%;\n margin-left: 15%;\n list-style: none;\n}\n\n.carousel-indicators li {\n position: relative;\n flex: 1 0 auto;\n max-width: 30px;\n height: 3px;\n margin-right: 3px;\n margin-left: 3px;\n text-indent: -999px;\n background-color: rgba(255, 255, 255, 0.5);\n}\n\n.carousel-indicators li::before {\n position: absolute;\n top: -10px;\n left: 0;\n display: inline-block;\n width: 100%;\n height: 10px;\n content: \"\";\n}\n\n.carousel-indicators li::after {\n position: absolute;\n bottom: -10px;\n left: 0;\n display: inline-block;\n width: 100%;\n height: 10px;\n content: \"\";\n}\n\n.carousel-indicators .active {\n background-color: #fff;\n}\n\n.carousel-caption {\n position: absolute;\n right: 15%;\n bottom: 20px;\n left: 15%;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #fff;\n text-align: center;\n}\n\n.align-baseline {\n vertical-align: baseline !important;\n}\n\n.align-top {\n vertical-align: top !important;\n}\n\n.align-middle {\n vertical-align: middle !important;\n}\n\n.align-bottom {\n vertical-align: bottom !important;\n}\n\n.align-text-bottom {\n vertical-align: text-bottom !important;\n}\n\n.align-text-top {\n vertical-align: text-top !important;\n}\n\n.bg-faded {\n background-color: #f7f7f7;\n}\n\n.bg-primary {\n background-color: #0275d8 !important;\n}\n\na.bg-primary:focus, a.bg-primary:hover {\n background-color: #025aa5 !important;\n}\n\n.bg-success {\n background-color: #5cb85c !important;\n}\n\na.bg-success:focus, a.bg-success:hover {\n background-color: #449d44 !important;\n}\n\n.bg-info {\n background-color: #5bc0de !important;\n}\n\na.bg-info:focus, a.bg-info:hover {\n background-color: #31b0d5 !important;\n}\n\n.bg-warning {\n background-color: #f0ad4e !important;\n}\n\na.bg-warning:focus, a.bg-warning:hover {\n background-color: #ec971f !important;\n}\n\n.bg-danger {\n background-color: #d9534f !important;\n}\n\na.bg-danger:focus, a.bg-danger:hover {\n background-color: #c9302c !important;\n}\n\n.bg-inverse {\n background-color: #292b2c !important;\n}\n\na.bg-inverse:focus, a.bg-inverse:hover {\n background-color: #101112 !important;\n}\n\n.border-0 {\n border: 0 !important;\n}\n\n.border-top-0 {\n border-top: 0 !important;\n}\n\n.border-right-0 {\n border-right: 0 !important;\n}\n\n.border-bottom-0 {\n border-bottom: 0 !important;\n}\n\n.border-left-0 {\n border-left: 0 !important;\n}\n\n.rounded {\n border-radius: 0.25rem;\n}\n\n.rounded-top {\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n\n.rounded-right {\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n}\n\n.rounded-bottom {\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n\n.rounded-left {\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n\n.rounded-circle {\n border-radius: 50%;\n}\n\n.rounded-0 {\n border-radius: 0;\n}\n\n.clearfix::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.d-none {\n display: none !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-block {\n display: block !important;\n}\n\n.d-table {\n display: table !important;\n}\n\n.d-table-cell {\n display: table-cell !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline-flex {\n display: inline-flex !important;\n}\n\n@media (min-width: 576px) {\n .d-sm-none {\n display: none !important;\n }\n .d-sm-inline {\n display: inline !important;\n }\n .d-sm-inline-block {\n display: inline-block !important;\n }\n .d-sm-block {\n display: block !important;\n }\n .d-sm-table {\n display: table !important;\n }\n .d-sm-table-cell {\n display: table-cell !important;\n }\n .d-sm-flex {\n display: flex !important;\n }\n .d-sm-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 768px) {\n .d-md-none {\n display: none !important;\n }\n .d-md-inline {\n display: inline !important;\n }\n .d-md-inline-block {\n display: inline-block !important;\n }\n .d-md-block {\n display: block !important;\n }\n .d-md-table {\n display: table !important;\n }\n .d-md-table-cell {\n display: table-cell !important;\n }\n .d-md-flex {\n display: flex !important;\n }\n .d-md-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 992px) {\n .d-lg-none {\n display: none !important;\n }\n .d-lg-inline {\n display: inline !important;\n }\n .d-lg-inline-block {\n display: inline-block !important;\n }\n .d-lg-block {\n display: block !important;\n }\n .d-lg-table {\n display: table !important;\n }\n .d-lg-table-cell {\n display: table-cell !important;\n }\n .d-lg-flex {\n display: flex !important;\n }\n .d-lg-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 1200px) {\n .d-xl-none {\n display: none !important;\n }\n .d-xl-inline {\n display: inline !important;\n }\n .d-xl-inline-block {\n display: inline-block !important;\n }\n .d-xl-block {\n display: block !important;\n }\n .d-xl-table {\n display: table !important;\n }\n .d-xl-table-cell {\n display: table-cell !important;\n }\n .d-xl-flex {\n display: flex !important;\n }\n .d-xl-inline-flex {\n display: inline-flex !important;\n }\n}\n\n.d-print-block {\n display: none !important;\n}\n\n@media print {\n .d-print-block {\n display: block !important;\n }\n}\n\n.d-print-inline {\n display: none !important;\n}\n\n@media print {\n .d-print-inline {\n display: inline !important;\n }\n}\n\n.d-print-inline-block {\n display: none !important;\n}\n\n@media print {\n .d-print-inline-block {\n display: inline-block !important;\n }\n}\n\n@media print {\n .d-print-none {\n display: none !important;\n }\n}\n\n.order-first {\n order: -1;\n}\n\n.order-last {\n order: 1;\n}\n\n.order-0 {\n order: 0;\n}\n\n.flex-row {\n flex-direction: row !important;\n}\n\n.flex-column {\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n flex-direction: column-reverse !important;\n}\n\n.flex-wrap {\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n}\n\n.justify-content-start {\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n justify-content: center !important;\n}\n\n.justify-content-between {\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n justify-content: space-around !important;\n}\n\n.align-items-start {\n align-items: flex-start !important;\n}\n\n.align-items-end {\n align-items: flex-end !important;\n}\n\n.align-items-center {\n align-items: center !important;\n}\n\n.align-items-baseline {\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n align-items: stretch !important;\n}\n\n.align-content-start {\n align-content: flex-start !important;\n}\n\n.align-content-end {\n align-content: flex-end !important;\n}\n\n.align-content-center {\n align-content: center !important;\n}\n\n.align-content-between {\n align-content: space-between !important;\n}\n\n.align-content-around {\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n align-content: stretch !important;\n}\n\n.align-self-auto {\n align-self: auto !important;\n}\n\n.align-self-start {\n align-self: flex-start !important;\n}\n\n.align-self-end {\n align-self: flex-end !important;\n}\n\n.align-self-center {\n align-self: center !important;\n}\n\n.align-self-baseline {\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n align-self: stretch !important;\n}\n\n@media (min-width: 576px) {\n .order-sm-first {\n order: -1;\n }\n .order-sm-last {\n order: 1;\n }\n .order-sm-0 {\n order: 0;\n }\n .flex-sm-row {\n flex-direction: row !important;\n }\n .flex-sm-column {\n flex-direction: column !important;\n }\n .flex-sm-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-sm-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-sm-wrap {\n flex-wrap: wrap !important;\n }\n .flex-sm-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-sm-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-sm-start {\n justify-content: flex-start !important;\n }\n .justify-content-sm-end {\n justify-content: flex-end !important;\n }\n .justify-content-sm-center {\n justify-content: center !important;\n }\n .justify-content-sm-between {\n justify-content: space-between !important;\n }\n .justify-content-sm-around {\n justify-content: space-around !important;\n }\n .align-items-sm-start {\n align-items: flex-start !important;\n }\n .align-items-sm-end {\n align-items: flex-end !important;\n }\n .align-items-sm-center {\n align-items: center !important;\n }\n .align-items-sm-baseline {\n align-items: baseline !important;\n }\n .align-items-sm-stretch {\n align-items: stretch !important;\n }\n .align-content-sm-start {\n align-content: flex-start !important;\n }\n .align-content-sm-end {\n align-content: flex-end !important;\n }\n .align-content-sm-center {\n align-content: center !important;\n }\n .align-content-sm-between {\n align-content: space-between !important;\n }\n .align-content-sm-around {\n align-content: space-around !important;\n }\n .align-content-sm-stretch {\n align-content: stretch !important;\n }\n .align-self-sm-auto {\n align-self: auto !important;\n }\n .align-self-sm-start {\n align-self: flex-start !important;\n }\n .align-self-sm-end {\n align-self: flex-end !important;\n }\n .align-self-sm-center {\n align-self: center !important;\n }\n .align-self-sm-baseline {\n align-self: baseline !important;\n }\n .align-self-sm-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 768px) {\n .order-md-first {\n order: -1;\n }\n .order-md-last {\n order: 1;\n }\n .order-md-0 {\n order: 0;\n }\n .flex-md-row {\n flex-direction: row !important;\n }\n .flex-md-column {\n flex-direction: column !important;\n }\n .flex-md-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-md-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-md-wrap {\n flex-wrap: wrap !important;\n }\n .flex-md-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-md-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-md-start {\n justify-content: flex-start !important;\n }\n .justify-content-md-end {\n justify-content: flex-end !important;\n }\n .justify-content-md-center {\n justify-content: center !important;\n }\n .justify-content-md-between {\n justify-content: space-between !important;\n }\n .justify-content-md-around {\n justify-content: space-around !important;\n }\n .align-items-md-start {\n align-items: flex-start !important;\n }\n .align-items-md-end {\n align-items: flex-end !important;\n }\n .align-items-md-center {\n align-items: center !important;\n }\n .align-items-md-baseline {\n align-items: baseline !important;\n }\n .align-items-md-stretch {\n align-items: stretch !important;\n }\n .align-content-md-start {\n align-content: flex-start !important;\n }\n .align-content-md-end {\n align-content: flex-end !important;\n }\n .align-content-md-center {\n align-content: center !important;\n }\n .align-content-md-between {\n align-content: space-between !important;\n }\n .align-content-md-around {\n align-content: space-around !important;\n }\n .align-content-md-stretch {\n align-content: stretch !important;\n }\n .align-self-md-auto {\n align-self: auto !important;\n }\n .align-self-md-start {\n align-self: flex-start !important;\n }\n .align-self-md-end {\n align-self: flex-end !important;\n }\n .align-self-md-center {\n align-self: center !important;\n }\n .align-self-md-baseline {\n align-self: baseline !important;\n }\n .align-self-md-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 992px) {\n .order-lg-first {\n order: -1;\n }\n .order-lg-last {\n order: 1;\n }\n .order-lg-0 {\n order: 0;\n }\n .flex-lg-row {\n flex-direction: row !important;\n }\n .flex-lg-column {\n flex-direction: column !important;\n }\n .flex-lg-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-lg-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-lg-wrap {\n flex-wrap: wrap !important;\n }\n .flex-lg-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-lg-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-lg-start {\n justify-content: flex-start !important;\n }\n .justify-content-lg-end {\n justify-content: flex-end !important;\n }\n .justify-content-lg-center {\n justify-content: center !important;\n }\n .justify-content-lg-between {\n justify-content: space-between !important;\n }\n .justify-content-lg-around {\n justify-content: space-around !important;\n }\n .align-items-lg-start {\n align-items: flex-start !important;\n }\n .align-items-lg-end {\n align-items: flex-end !important;\n }\n .align-items-lg-center {\n align-items: center !important;\n }\n .align-items-lg-baseline {\n align-items: baseline !important;\n }\n .align-items-lg-stretch {\n align-items: stretch !important;\n }\n .align-content-lg-start {\n align-content: flex-start !important;\n }\n .align-content-lg-end {\n align-content: flex-end !important;\n }\n .align-content-lg-center {\n align-content: center !important;\n }\n .align-content-lg-between {\n align-content: space-between !important;\n }\n .align-content-lg-around {\n align-content: space-around !important;\n }\n .align-content-lg-stretch {\n align-content: stretch !important;\n }\n .align-self-lg-auto {\n align-self: auto !important;\n }\n .align-self-lg-start {\n align-self: flex-start !important;\n }\n .align-self-lg-end {\n align-self: flex-end !important;\n }\n .align-self-lg-center {\n align-self: center !important;\n }\n .align-self-lg-baseline {\n align-self: baseline !important;\n }\n .align-self-lg-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 1200px) {\n .order-xl-first {\n order: -1;\n }\n .order-xl-last {\n order: 1;\n }\n .order-xl-0 {\n order: 0;\n }\n .flex-xl-row {\n flex-direction: row !important;\n }\n .flex-xl-column {\n flex-direction: column !important;\n }\n .flex-xl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-xl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xl-center {\n justify-content: center !important;\n }\n .justify-content-xl-between {\n justify-content: space-between !important;\n }\n .justify-content-xl-around {\n justify-content: space-around !important;\n }\n .align-items-xl-start {\n align-items: flex-start !important;\n }\n .align-items-xl-end {\n align-items: flex-end !important;\n }\n .align-items-xl-center {\n align-items: center !important;\n }\n .align-items-xl-baseline {\n align-items: baseline !important;\n }\n .align-items-xl-stretch {\n align-items: stretch !important;\n }\n .align-content-xl-start {\n align-content: flex-start !important;\n }\n .align-content-xl-end {\n align-content: flex-end !important;\n }\n .align-content-xl-center {\n align-content: center !important;\n }\n .align-content-xl-between {\n align-content: space-between !important;\n }\n .align-content-xl-around {\n align-content: space-around !important;\n }\n .align-content-xl-stretch {\n align-content: stretch !important;\n }\n .align-self-xl-auto {\n align-self: auto !important;\n }\n .align-self-xl-start {\n align-self: flex-start !important;\n }\n .align-self-xl-end {\n align-self: flex-end !important;\n }\n .align-self-xl-center {\n align-self: center !important;\n }\n .align-self-xl-baseline {\n align-self: baseline !important;\n }\n .align-self-xl-stretch {\n align-self: stretch !important;\n }\n}\n\n.float-left {\n float: left !important;\n}\n\n.float-right {\n float: right !important;\n}\n\n.float-none {\n float: none !important;\n}\n\n@media (min-width: 576px) {\n .float-sm-left {\n float: left !important;\n }\n .float-sm-right {\n float: right !important;\n }\n .float-sm-none {\n float: none !important;\n }\n}\n\n@media (min-width: 768px) {\n .float-md-left {\n float: left !important;\n }\n .float-md-right {\n float: right !important;\n }\n .float-md-none {\n float: none !important;\n }\n}\n\n@media (min-width: 992px) {\n .float-lg-left {\n float: left !important;\n }\n .float-lg-right {\n float: right !important;\n }\n .float-lg-none {\n float: none !important;\n }\n}\n\n@media (min-width: 1200px) {\n .float-xl-left {\n float: left !important;\n }\n .float-xl-right {\n float: right !important;\n }\n .float-xl-none {\n float: none !important;\n }\n}\n\n.fixed-top {\n position: fixed;\n top: 0;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n\n.fixed-bottom {\n position: fixed;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1030;\n}\n\n.sticky-top {\n position: sticky;\n top: 0;\n z-index: 1020;\n}\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n clip-path: inset(50%);\n border: 0;\n}\n\n.sr-only-focusable:active, .sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n overflow: visible;\n clip: auto;\n white-space: normal;\n clip-path: none;\n}\n\n.w-25 {\n width: 25% !important;\n}\n\n.w-50 {\n width: 50% !important;\n}\n\n.w-75 {\n width: 75% !important;\n}\n\n.w-100 {\n width: 100% !important;\n}\n\n.h-25 {\n height: 25% !important;\n}\n\n.h-50 {\n height: 50% !important;\n}\n\n.h-75 {\n height: 75% !important;\n}\n\n.h-100 {\n height: 100% !important;\n}\n\n.mw-100 {\n max-width: 100% !important;\n}\n\n.mh-100 {\n max-height: 100% !important;\n}\n\n.m-0 {\n margin: 0 !important;\n}\n\n.mt-0 {\n margin-top: 0 !important;\n}\n\n.mr-0 {\n margin-right: 0 !important;\n}\n\n.mb-0 {\n margin-bottom: 0 !important;\n}\n\n.ml-0 {\n margin-left: 0 !important;\n}\n\n.mx-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n}\n\n.my-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n}\n\n.m-1 {\n margin: 0.25rem !important;\n}\n\n.mt-1 {\n margin-top: 0.25rem !important;\n}\n\n.mr-1 {\n margin-right: 0.25rem !important;\n}\n\n.mb-1 {\n margin-bottom: 0.25rem !important;\n}\n\n.ml-1 {\n margin-left: 0.25rem !important;\n}\n\n.mx-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n}\n\n.my-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n}\n\n.m-2 {\n margin: 0.5rem !important;\n}\n\n.mt-2 {\n margin-top: 0.5rem !important;\n}\n\n.mr-2 {\n margin-right: 0.5rem !important;\n}\n\n.mb-2 {\n margin-bottom: 0.5rem !important;\n}\n\n.ml-2 {\n margin-left: 0.5rem !important;\n}\n\n.mx-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n}\n\n.my-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n}\n\n.m-3 {\n margin: 1rem !important;\n}\n\n.mt-3 {\n margin-top: 1rem !important;\n}\n\n.mr-3 {\n margin-right: 1rem !important;\n}\n\n.mb-3 {\n margin-bottom: 1rem !important;\n}\n\n.ml-3 {\n margin-left: 1rem !important;\n}\n\n.mx-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n}\n\n.my-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n}\n\n.m-4 {\n margin: 1.5rem !important;\n}\n\n.mt-4 {\n margin-top: 1.5rem !important;\n}\n\n.mr-4 {\n margin-right: 1.5rem !important;\n}\n\n.mb-4 {\n margin-bottom: 1.5rem !important;\n}\n\n.ml-4 {\n margin-left: 1.5rem !important;\n}\n\n.mx-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n}\n\n.my-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n}\n\n.m-5 {\n margin: 3rem !important;\n}\n\n.mt-5 {\n margin-top: 3rem !important;\n}\n\n.mr-5 {\n margin-right: 3rem !important;\n}\n\n.mb-5 {\n margin-bottom: 3rem !important;\n}\n\n.ml-5 {\n margin-left: 3rem !important;\n}\n\n.mx-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n}\n\n.my-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n}\n\n.p-0 {\n padding: 0 !important;\n}\n\n.pt-0 {\n padding-top: 0 !important;\n}\n\n.pr-0 {\n padding-right: 0 !important;\n}\n\n.pb-0 {\n padding-bottom: 0 !important;\n}\n\n.pl-0 {\n padding-left: 0 !important;\n}\n\n.px-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n}\n\n.py-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n}\n\n.p-1 {\n padding: 0.25rem !important;\n}\n\n.pt-1 {\n padding-top: 0.25rem !important;\n}\n\n.pr-1 {\n padding-right: 0.25rem !important;\n}\n\n.pb-1 {\n padding-bottom: 0.25rem !important;\n}\n\n.pl-1 {\n padding-left: 0.25rem !important;\n}\n\n.px-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n}\n\n.py-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n}\n\n.p-2 {\n padding: 0.5rem !important;\n}\n\n.pt-2 {\n padding-top: 0.5rem !important;\n}\n\n.pr-2 {\n padding-right: 0.5rem !important;\n}\n\n.pb-2 {\n padding-bottom: 0.5rem !important;\n}\n\n.pl-2 {\n padding-left: 0.5rem !important;\n}\n\n.px-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n}\n\n.py-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n}\n\n.p-3 {\n padding: 1rem !important;\n}\n\n.pt-3 {\n padding-top: 1rem !important;\n}\n\n.pr-3 {\n padding-right: 1rem !important;\n}\n\n.pb-3 {\n padding-bottom: 1rem !important;\n}\n\n.pl-3 {\n padding-left: 1rem !important;\n}\n\n.px-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n}\n\n.py-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n}\n\n.p-4 {\n padding: 1.5rem !important;\n}\n\n.pt-4 {\n padding-top: 1.5rem !important;\n}\n\n.pr-4 {\n padding-right: 1.5rem !important;\n}\n\n.pb-4 {\n padding-bottom: 1.5rem !important;\n}\n\n.pl-4 {\n padding-left: 1.5rem !important;\n}\n\n.px-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n}\n\n.py-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n}\n\n.p-5 {\n padding: 3rem !important;\n}\n\n.pt-5 {\n padding-top: 3rem !important;\n}\n\n.pr-5 {\n padding-right: 3rem !important;\n}\n\n.pb-5 {\n padding-bottom: 3rem !important;\n}\n\n.pl-5 {\n padding-left: 3rem !important;\n}\n\n.px-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n}\n\n.py-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n}\n\n.m-auto {\n margin: auto !important;\n}\n\n.mt-auto {\n margin-top: auto !important;\n}\n\n.mr-auto {\n margin-right: auto !important;\n}\n\n.mb-auto {\n margin-bottom: auto !important;\n}\n\n.ml-auto {\n margin-left: auto !important;\n}\n\n.mx-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n}\n\n.my-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n}\n\n@media (min-width: 576px) {\n .m-sm-0 {\n margin: 0 !important;\n }\n .mt-sm-0 {\n margin-top: 0 !important;\n }\n .mr-sm-0 {\n margin-right: 0 !important;\n }\n .mb-sm-0 {\n margin-bottom: 0 !important;\n }\n .ml-sm-0 {\n margin-left: 0 !important;\n }\n .mx-sm-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .my-sm-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .m-sm-1 {\n margin: 0.25rem !important;\n }\n .mt-sm-1 {\n margin-top: 0.25rem !important;\n }\n .mr-sm-1 {\n margin-right: 0.25rem !important;\n }\n .mb-sm-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-sm-1 {\n margin-left: 0.25rem !important;\n }\n .mx-sm-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .my-sm-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .m-sm-2 {\n margin: 0.5rem !important;\n }\n .mt-sm-2 {\n margin-top: 0.5rem !important;\n }\n .mr-sm-2 {\n margin-right: 0.5rem !important;\n }\n .mb-sm-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-sm-2 {\n margin-left: 0.5rem !important;\n }\n .mx-sm-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .my-sm-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .m-sm-3 {\n margin: 1rem !important;\n }\n .mt-sm-3 {\n margin-top: 1rem !important;\n }\n .mr-sm-3 {\n margin-right: 1rem !important;\n }\n .mb-sm-3 {\n margin-bottom: 1rem !important;\n }\n .ml-sm-3 {\n margin-left: 1rem !important;\n }\n .mx-sm-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .my-sm-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .m-sm-4 {\n margin: 1.5rem !important;\n }\n .mt-sm-4 {\n margin-top: 1.5rem !important;\n }\n .mr-sm-4 {\n margin-right: 1.5rem !important;\n }\n .mb-sm-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-sm-4 {\n margin-left: 1.5rem !important;\n }\n .mx-sm-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .my-sm-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .m-sm-5 {\n margin: 3rem !important;\n }\n .mt-sm-5 {\n margin-top: 3rem !important;\n }\n .mr-sm-5 {\n margin-right: 3rem !important;\n }\n .mb-sm-5 {\n margin-bottom: 3rem !important;\n }\n .ml-sm-5 {\n margin-left: 3rem !important;\n }\n .mx-sm-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .my-sm-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .p-sm-0 {\n padding: 0 !important;\n }\n .pt-sm-0 {\n padding-top: 0 !important;\n }\n .pr-sm-0 {\n padding-right: 0 !important;\n }\n .pb-sm-0 {\n padding-bottom: 0 !important;\n }\n .pl-sm-0 {\n padding-left: 0 !important;\n }\n .px-sm-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .py-sm-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .p-sm-1 {\n padding: 0.25rem !important;\n }\n .pt-sm-1 {\n padding-top: 0.25rem !important;\n }\n .pr-sm-1 {\n padding-right: 0.25rem !important;\n }\n .pb-sm-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-sm-1 {\n padding-left: 0.25rem !important;\n }\n .px-sm-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .py-sm-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .p-sm-2 {\n padding: 0.5rem !important;\n }\n .pt-sm-2 {\n padding-top: 0.5rem !important;\n }\n .pr-sm-2 {\n padding-right: 0.5rem !important;\n }\n .pb-sm-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-sm-2 {\n padding-left: 0.5rem !important;\n }\n .px-sm-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .py-sm-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .p-sm-3 {\n padding: 1rem !important;\n }\n .pt-sm-3 {\n padding-top: 1rem !important;\n }\n .pr-sm-3 {\n padding-right: 1rem !important;\n }\n .pb-sm-3 {\n padding-bottom: 1rem !important;\n }\n .pl-sm-3 {\n padding-left: 1rem !important;\n }\n .px-sm-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .py-sm-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .p-sm-4 {\n padding: 1.5rem !important;\n }\n .pt-sm-4 {\n padding-top: 1.5rem !important;\n }\n .pr-sm-4 {\n padding-right: 1.5rem !important;\n }\n .pb-sm-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-sm-4 {\n padding-left: 1.5rem !important;\n }\n .px-sm-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .py-sm-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .p-sm-5 {\n padding: 3rem !important;\n }\n .pt-sm-5 {\n padding-top: 3rem !important;\n }\n .pr-sm-5 {\n padding-right: 3rem !important;\n }\n .pb-sm-5 {\n padding-bottom: 3rem !important;\n }\n .pl-sm-5 {\n padding-left: 3rem !important;\n }\n .px-sm-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-sm-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .m-sm-auto {\n margin: auto !important;\n }\n .mt-sm-auto {\n margin-top: auto !important;\n }\n .mr-sm-auto {\n margin-right: auto !important;\n }\n .mb-sm-auto {\n margin-bottom: auto !important;\n }\n .ml-sm-auto {\n margin-left: auto !important;\n }\n .mx-sm-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-sm-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n}\n\n@media (min-width: 768px) {\n .m-md-0 {\n margin: 0 !important;\n }\n .mt-md-0 {\n margin-top: 0 !important;\n }\n .mr-md-0 {\n margin-right: 0 !important;\n }\n .mb-md-0 {\n margin-bottom: 0 !important;\n }\n .ml-md-0 {\n margin-left: 0 !important;\n }\n .mx-md-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .my-md-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .m-md-1 {\n margin: 0.25rem !important;\n }\n .mt-md-1 {\n margin-top: 0.25rem !important;\n }\n .mr-md-1 {\n margin-right: 0.25rem !important;\n }\n .mb-md-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-md-1 {\n margin-left: 0.25rem !important;\n }\n .mx-md-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .my-md-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .m-md-2 {\n margin: 0.5rem !important;\n }\n .mt-md-2 {\n margin-top: 0.5rem !important;\n }\n .mr-md-2 {\n margin-right: 0.5rem !important;\n }\n .mb-md-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-md-2 {\n margin-left: 0.5rem !important;\n }\n .mx-md-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .my-md-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .m-md-3 {\n margin: 1rem !important;\n }\n .mt-md-3 {\n margin-top: 1rem !important;\n }\n .mr-md-3 {\n margin-right: 1rem !important;\n }\n .mb-md-3 {\n margin-bottom: 1rem !important;\n }\n .ml-md-3 {\n margin-left: 1rem !important;\n }\n .mx-md-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .my-md-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .m-md-4 {\n margin: 1.5rem !important;\n }\n .mt-md-4 {\n margin-top: 1.5rem !important;\n }\n .mr-md-4 {\n margin-right: 1.5rem !important;\n }\n .mb-md-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-md-4 {\n margin-left: 1.5rem !important;\n }\n .mx-md-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .my-md-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .m-md-5 {\n margin: 3rem !important;\n }\n .mt-md-5 {\n margin-top: 3rem !important;\n }\n .mr-md-5 {\n margin-right: 3rem !important;\n }\n .mb-md-5 {\n margin-bottom: 3rem !important;\n }\n .ml-md-5 {\n margin-left: 3rem !important;\n }\n .mx-md-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .my-md-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .p-md-0 {\n padding: 0 !important;\n }\n .pt-md-0 {\n padding-top: 0 !important;\n }\n .pr-md-0 {\n padding-right: 0 !important;\n }\n .pb-md-0 {\n padding-bottom: 0 !important;\n }\n .pl-md-0 {\n padding-left: 0 !important;\n }\n .px-md-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .py-md-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .p-md-1 {\n padding: 0.25rem !important;\n }\n .pt-md-1 {\n padding-top: 0.25rem !important;\n }\n .pr-md-1 {\n padding-right: 0.25rem !important;\n }\n .pb-md-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-md-1 {\n padding-left: 0.25rem !important;\n }\n .px-md-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .py-md-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .p-md-2 {\n padding: 0.5rem !important;\n }\n .pt-md-2 {\n padding-top: 0.5rem !important;\n }\n .pr-md-2 {\n padding-right: 0.5rem !important;\n }\n .pb-md-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-md-2 {\n padding-left: 0.5rem !important;\n }\n .px-md-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .py-md-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .p-md-3 {\n padding: 1rem !important;\n }\n .pt-md-3 {\n padding-top: 1rem !important;\n }\n .pr-md-3 {\n padding-right: 1rem !important;\n }\n .pb-md-3 {\n padding-bottom: 1rem !important;\n }\n .pl-md-3 {\n padding-left: 1rem !important;\n }\n .px-md-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .py-md-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .p-md-4 {\n padding: 1.5rem !important;\n }\n .pt-md-4 {\n padding-top: 1.5rem !important;\n }\n .pr-md-4 {\n padding-right: 1.5rem !important;\n }\n .pb-md-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-md-4 {\n padding-left: 1.5rem !important;\n }\n .px-md-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .py-md-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .p-md-5 {\n padding: 3rem !important;\n }\n .pt-md-5 {\n padding-top: 3rem !important;\n }\n .pr-md-5 {\n padding-right: 3rem !important;\n }\n .pb-md-5 {\n padding-bottom: 3rem !important;\n }\n .pl-md-5 {\n padding-left: 3rem !important;\n }\n .px-md-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-md-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .m-md-auto {\n margin: auto !important;\n }\n .mt-md-auto {\n margin-top: auto !important;\n }\n .mr-md-auto {\n margin-right: auto !important;\n }\n .mb-md-auto {\n margin-bottom: auto !important;\n }\n .ml-md-auto {\n margin-left: auto !important;\n }\n .mx-md-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-md-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n}\n\n@media (min-width: 992px) {\n .m-lg-0 {\n margin: 0 !important;\n }\n .mt-lg-0 {\n margin-top: 0 !important;\n }\n .mr-lg-0 {\n margin-right: 0 !important;\n }\n .mb-lg-0 {\n margin-bottom: 0 !important;\n }\n .ml-lg-0 {\n margin-left: 0 !important;\n }\n .mx-lg-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .my-lg-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .m-lg-1 {\n margin: 0.25rem !important;\n }\n .mt-lg-1 {\n margin-top: 0.25rem !important;\n }\n .mr-lg-1 {\n margin-right: 0.25rem !important;\n }\n .mb-lg-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-lg-1 {\n margin-left: 0.25rem !important;\n }\n .mx-lg-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .my-lg-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .m-lg-2 {\n margin: 0.5rem !important;\n }\n .mt-lg-2 {\n margin-top: 0.5rem !important;\n }\n .mr-lg-2 {\n margin-right: 0.5rem !important;\n }\n .mb-lg-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-lg-2 {\n margin-left: 0.5rem !important;\n }\n .mx-lg-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .my-lg-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .m-lg-3 {\n margin: 1rem !important;\n }\n .mt-lg-3 {\n margin-top: 1rem !important;\n }\n .mr-lg-3 {\n margin-right: 1rem !important;\n }\n .mb-lg-3 {\n margin-bottom: 1rem !important;\n }\n .ml-lg-3 {\n margin-left: 1rem !important;\n }\n .mx-lg-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .my-lg-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .m-lg-4 {\n margin: 1.5rem !important;\n }\n .mt-lg-4 {\n margin-top: 1.5rem !important;\n }\n .mr-lg-4 {\n margin-right: 1.5rem !important;\n }\n .mb-lg-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-lg-4 {\n margin-left: 1.5rem !important;\n }\n .mx-lg-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .my-lg-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .m-lg-5 {\n margin: 3rem !important;\n }\n .mt-lg-5 {\n margin-top: 3rem !important;\n }\n .mr-lg-5 {\n margin-right: 3rem !important;\n }\n .mb-lg-5 {\n margin-bottom: 3rem !important;\n }\n .ml-lg-5 {\n margin-left: 3rem !important;\n }\n .mx-lg-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .my-lg-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .p-lg-0 {\n padding: 0 !important;\n }\n .pt-lg-0 {\n padding-top: 0 !important;\n }\n .pr-lg-0 {\n padding-right: 0 !important;\n }\n .pb-lg-0 {\n padding-bottom: 0 !important;\n }\n .pl-lg-0 {\n padding-left: 0 !important;\n }\n .px-lg-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .py-lg-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .p-lg-1 {\n padding: 0.25rem !important;\n }\n .pt-lg-1 {\n padding-top: 0.25rem !important;\n }\n .pr-lg-1 {\n padding-right: 0.25rem !important;\n }\n .pb-lg-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-lg-1 {\n padding-left: 0.25rem !important;\n }\n .px-lg-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .py-lg-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .p-lg-2 {\n padding: 0.5rem !important;\n }\n .pt-lg-2 {\n padding-top: 0.5rem !important;\n }\n .pr-lg-2 {\n padding-right: 0.5rem !important;\n }\n .pb-lg-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-lg-2 {\n padding-left: 0.5rem !important;\n }\n .px-lg-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .py-lg-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .p-lg-3 {\n padding: 1rem !important;\n }\n .pt-lg-3 {\n padding-top: 1rem !important;\n }\n .pr-lg-3 {\n padding-right: 1rem !important;\n }\n .pb-lg-3 {\n padding-bottom: 1rem !important;\n }\n .pl-lg-3 {\n padding-left: 1rem !important;\n }\n .px-lg-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .py-lg-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .p-lg-4 {\n padding: 1.5rem !important;\n }\n .pt-lg-4 {\n padding-top: 1.5rem !important;\n }\n .pr-lg-4 {\n padding-right: 1.5rem !important;\n }\n .pb-lg-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-lg-4 {\n padding-left: 1.5rem !important;\n }\n .px-lg-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .py-lg-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .p-lg-5 {\n padding: 3rem !important;\n }\n .pt-lg-5 {\n padding-top: 3rem !important;\n }\n .pr-lg-5 {\n padding-right: 3rem !important;\n }\n .pb-lg-5 {\n padding-bottom: 3rem !important;\n }\n .pl-lg-5 {\n padding-left: 3rem !important;\n }\n .px-lg-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-lg-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .m-lg-auto {\n margin: auto !important;\n }\n .mt-lg-auto {\n margin-top: auto !important;\n }\n .mr-lg-auto {\n margin-right: auto !important;\n }\n .mb-lg-auto {\n margin-bottom: auto !important;\n }\n .ml-lg-auto {\n margin-left: auto !important;\n }\n .mx-lg-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-lg-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n}\n\n@media (min-width: 1200px) {\n .m-xl-0 {\n margin: 0 !important;\n }\n .mt-xl-0 {\n margin-top: 0 !important;\n }\n .mr-xl-0 {\n margin-right: 0 !important;\n }\n .mb-xl-0 {\n margin-bottom: 0 !important;\n }\n .ml-xl-0 {\n margin-left: 0 !important;\n }\n .mx-xl-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .my-xl-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .m-xl-1 {\n margin: 0.25rem !important;\n }\n .mt-xl-1 {\n margin-top: 0.25rem !important;\n }\n .mr-xl-1 {\n margin-right: 0.25rem !important;\n }\n .mb-xl-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-xl-1 {\n margin-left: 0.25rem !important;\n }\n .mx-xl-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .my-xl-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .m-xl-2 {\n margin: 0.5rem !important;\n }\n .mt-xl-2 {\n margin-top: 0.5rem !important;\n }\n .mr-xl-2 {\n margin-right: 0.5rem !important;\n }\n .mb-xl-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-xl-2 {\n margin-left: 0.5rem !important;\n }\n .mx-xl-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .my-xl-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .m-xl-3 {\n margin: 1rem !important;\n }\n .mt-xl-3 {\n margin-top: 1rem !important;\n }\n .mr-xl-3 {\n margin-right: 1rem !important;\n }\n .mb-xl-3 {\n margin-bottom: 1rem !important;\n }\n .ml-xl-3 {\n margin-left: 1rem !important;\n }\n .mx-xl-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .my-xl-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .m-xl-4 {\n margin: 1.5rem !important;\n }\n .mt-xl-4 {\n margin-top: 1.5rem !important;\n }\n .mr-xl-4 {\n margin-right: 1.5rem !important;\n }\n .mb-xl-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-xl-4 {\n margin-left: 1.5rem !important;\n }\n .mx-xl-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .my-xl-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .m-xl-5 {\n margin: 3rem !important;\n }\n .mt-xl-5 {\n margin-top: 3rem !important;\n }\n .mr-xl-5 {\n margin-right: 3rem !important;\n }\n .mb-xl-5 {\n margin-bottom: 3rem !important;\n }\n .ml-xl-5 {\n margin-left: 3rem !important;\n }\n .mx-xl-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .my-xl-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .p-xl-0 {\n padding: 0 !important;\n }\n .pt-xl-0 {\n padding-top: 0 !important;\n }\n .pr-xl-0 {\n padding-right: 0 !important;\n }\n .pb-xl-0 {\n padding-bottom: 0 !important;\n }\n .pl-xl-0 {\n padding-left: 0 !important;\n }\n .px-xl-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .py-xl-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .p-xl-1 {\n padding: 0.25rem !important;\n }\n .pt-xl-1 {\n padding-top: 0.25rem !important;\n }\n .pr-xl-1 {\n padding-right: 0.25rem !important;\n }\n .pb-xl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-xl-1 {\n padding-left: 0.25rem !important;\n }\n .px-xl-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .py-xl-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .p-xl-2 {\n padding: 0.5rem !important;\n }\n .pt-xl-2 {\n padding-top: 0.5rem !important;\n }\n .pr-xl-2 {\n padding-right: 0.5rem !important;\n }\n .pb-xl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-xl-2 {\n padding-left: 0.5rem !important;\n }\n .px-xl-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .py-xl-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .p-xl-3 {\n padding: 1rem !important;\n }\n .pt-xl-3 {\n padding-top: 1rem !important;\n }\n .pr-xl-3 {\n padding-right: 1rem !important;\n }\n .pb-xl-3 {\n padding-bottom: 1rem !important;\n }\n .pl-xl-3 {\n padding-left: 1rem !important;\n }\n .px-xl-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .py-xl-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .p-xl-4 {\n padding: 1.5rem !important;\n }\n .pt-xl-4 {\n padding-top: 1.5rem !important;\n }\n .pr-xl-4 {\n padding-right: 1.5rem !important;\n }\n .pb-xl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-xl-4 {\n padding-left: 1.5rem !important;\n }\n .px-xl-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .py-xl-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .p-xl-5 {\n padding: 3rem !important;\n }\n .pt-xl-5 {\n padding-top: 3rem !important;\n }\n .pr-xl-5 {\n padding-right: 3rem !important;\n }\n .pb-xl-5 {\n padding-bottom: 3rem !important;\n }\n .pl-xl-5 {\n padding-left: 3rem !important;\n }\n .px-xl-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-xl-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .m-xl-auto {\n margin: auto !important;\n }\n .mt-xl-auto {\n margin-top: auto !important;\n }\n .mr-xl-auto {\n margin-right: auto !important;\n }\n .mb-xl-auto {\n margin-bottom: auto !important;\n }\n .ml-xl-auto {\n margin-left: auto !important;\n }\n .mx-xl-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-xl-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n}\n\n.text-justify {\n text-align: justify !important;\n}\n\n.text-nowrap {\n white-space: nowrap !important;\n}\n\n.text-truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.text-left {\n text-align: left !important;\n}\n\n.text-right {\n text-align: right !important;\n}\n\n.text-center {\n text-align: center !important;\n}\n\n@media (min-width: 576px) {\n .text-sm-left {\n text-align: left !important;\n }\n .text-sm-right {\n text-align: right !important;\n }\n .text-sm-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 768px) {\n .text-md-left {\n text-align: left !important;\n }\n .text-md-right {\n text-align: right !important;\n }\n .text-md-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 992px) {\n .text-lg-left {\n text-align: left !important;\n }\n .text-lg-right {\n text-align: right !important;\n }\n .text-lg-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 1200px) {\n .text-xl-left {\n text-align: left !important;\n }\n .text-xl-right {\n text-align: right !important;\n }\n .text-xl-center {\n text-align: center !important;\n }\n}\n\n.text-lowercase {\n text-transform: lowercase !important;\n}\n\n.text-uppercase {\n text-transform: uppercase !important;\n}\n\n.text-capitalize {\n text-transform: capitalize !important;\n}\n\n.font-weight-normal {\n font-weight: normal;\n}\n\n.font-weight-bold {\n font-weight: bold;\n}\n\n.font-italic {\n font-style: italic;\n}\n\n.text-white {\n color: #fff !important;\n}\n\n.text-muted {\n color: #636c72 !important;\n}\n\na.text-muted:focus, a.text-muted:hover {\n color: #4b5257 !important;\n}\n\n.text-primary {\n color: #0275d8 !important;\n}\n\na.text-primary:focus, a.text-primary:hover {\n color: #025aa5 !important;\n}\n\n.text-success {\n color: #5cb85c !important;\n}\n\na.text-success:focus, a.text-success:hover {\n color: #449d44 !important;\n}\n\n.text-info {\n color: #5bc0de !important;\n}\n\na.text-info:focus, a.text-info:hover {\n color: #31b0d5 !important;\n}\n\n.text-warning {\n color: #f0ad4e !important;\n}\n\na.text-warning:focus, a.text-warning:hover {\n color: #ec971f !important;\n}\n\n.text-danger {\n color: #d9534f !important;\n}\n\na.text-danger:focus, a.text-danger:hover {\n color: #c9302c !important;\n}\n\n.text-gray-dark {\n color: #292b2c !important;\n}\n\na.text-gray-dark:focus, a.text-gray-dark:hover {\n color: #101112 !important;\n}\n\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n\n.visible {\n visibility: visible !important;\n}\n\n.invisible {\n visibility: hidden !important;\n}\n\n/*# sourceMappingURL=bootstrap.css.map */",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null]} \ No newline at end of file
diff --git a/library/bootstrap/css/bootstrap.min.css b/library/bootstrap/css/bootstrap.min.css
index ed3905e0e..d7780d69e 100644
--- a/library/bootstrap/css/bootstrap.min.css
+++ b/library/bootstrap/css/bootstrap.min.css
@@ -1,6 +1,6 @@
/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright 2011-2016 Twitter, Inc.
+ * Bootstrap v4.0.0-alpha.6 (https://getbootstrap.com)
+ * Copyright 2011-2017 The Bootstrap Authors
+ * Copyright 2011-2017 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;filter:alpha(opacity=0);opacity:0;line-break:auto}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}}
-/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file
+ */@media print{*,::after,::before,blockquote::first-letter,blockquote::first-line,div::first-letter,div::first-line,li::first-letter,li::first-line,p::first-letter,p::first-line{text-shadow:none!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}html{-webkit-box-sizing:border-box;box-sizing:border-box;font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}*,::after,::before{-webkit-box-sizing:inherit;box-sizing:inherit}@-ms-viewport{width:device-width}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-size:1rem;font-weight:400;line-height:1.5;color:#292b2c;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;text-decoration:underline dotted;cursor:help;border-bottom:0}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0275d8;text-decoration:none;background-color:transparent;-webkit-text-decoration-skip:objects}a:hover{color:#014c8c;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg:not(:root){overflow:hidden}[role=button],a,area,button,input,label,select,summary,textarea{-ms-touch-action:manipulation;touch-action:manipulation}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#636c72;text-align:left;caption-side:bottom}th{text-align:left}label{display:inline-block;margin-bottom:.5rem}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.1}.display-2{font-size:5.5rem;font-weight:300;line-height:1.1}.display-3{font-size:4.5rem;font-weight:300;line-height:1.1}.display-4{font-size:3.5rem;font-weight:300;line-height:1.1}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:5px}.initialism{font-size:90%;text-transform:uppercase}.blockquote{padding:.5rem 1rem;margin-bottom:1rem;font-size:1.25rem;border-left:.25rem solid #eceeef}.blockquote-footer{display:block;font-size:80%;color:#636c72}.blockquote-footer::before{content:"\2014 \00A0"}.blockquote-reverse{padding-right:1rem;padding-left:0;text-align:right;border-right:.25rem solid #eceeef;border-left:0}.blockquote-reverse .blockquote-footer::before{content:""}.blockquote-reverse .blockquote-footer::after{content:"\00A0 \2014"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #ddd;border-radius:.25rem;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#636c72}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}code{padding:.2rem .4rem;font-size:90%;color:#bd4147;background-color:#f7f7f9;border-radius:.25rem}a>code{padding:0;color:inherit;background-color:inherit}kbd{padding:.2rem .4rem;font-size:90%;color:#fff;background-color:#292b2c;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;margin-top:0;margin-bottom:1rem;font-size:90%;color:#292b2c}pre code{padding:0;font-size:inherit;color:inherit;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-right:15px;padding-left:15px}@media (min-width:576px){.container{padding-right:15px;padding-left:15px}}@media (min-width:768px){.container{padding-right:15px;padding-left:15px}}@media (min-width:992px){.container{padding-right:15px;padding-left:15px}}@media (min-width:1200px){.container{padding-right:15px;padding-left:15px}}@media (min-width:576px){.container{width:540px;max-width:100%}}@media (min-width:768px){.container{width:720px;max-width:100%}}@media (min-width:992px){.container{width:960px;max-width:100%}}@media (min-width:1200px){.container{width:1140px;max-width:100%}}.container-fluid{width:100%;margin-right:auto;margin-left:auto;padding-right:15px;padding-left:15px}@media (min-width:576px){.container-fluid{padding-right:15px;padding-left:15px}}@media (min-width:768px){.container-fluid{padding-right:15px;padding-left:15px}}@media (min-width:992px){.container-fluid{padding-right:15px;padding-left:15px}}@media (min-width:1200px){.container-fluid{padding-right:15px;padding-left:15px}}.row{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}@media (min-width:576px){.row{margin-right:-15px;margin-left:-15px}}@media (min-width:768px){.row{margin-right:-15px;margin-left:-15px}}@media (min-width:992px){.row{margin-right:-15px;margin-left:-15px}}@media (min-width:1200px){.row{margin-right:-15px;margin-left:-15px}}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;min-height:1px;padding-right:15px;padding-left:15px}@media (min-width:576px){.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{padding-right:15px;padding-left:15px}}@media (min-width:768px){.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{padding-right:15px;padding-left:15px}}@media (min-width:992px){.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{padding-right:15px;padding-left:15px}}@media (min-width:1200px){.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{padding-right:15px;padding-left:15px}}.col{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.col-1{width:8.333333%}.col-2{width:16.666667%}.col-3{width:25%}.col-4{width:33.333333%}.col-5{width:41.666667%}.col-6{width:50%}.col-7{width:58.333333%}.col-8{width:66.666667%}.col-9{width:75%}.col-10{width:83.333333%}.col-11{width:91.666667%}.col-12{width:100%}.pull-0{right:auto}.pull-1{right:8.333333%}.pull-2{right:16.666667%}.pull-3{right:25%}.pull-4{right:33.333333%}.pull-5{right:41.666667%}.pull-6{right:50%}.pull-7{right:58.333333%}.pull-8{right:66.666667%}.pull-9{right:75%}.pull-10{right:83.333333%}.pull-11{right:91.666667%}.pull-12{right:100%}.push-0{left:auto}.push-1{left:8.333333%}.push-2{left:16.666667%}.push-3{left:25%}.push-4{left:33.333333%}.push-5{left:41.666667%}.push-6{left:50%}.push-7{left:58.333333%}.push-8{left:66.666667%}.push-9{left:75%}.push-10{left:83.333333%}.push-11{left:91.666667%}.push-12{left:100%}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.col-sm-1{width:8.333333%}.col-sm-2{width:16.666667%}.col-sm-3{width:25%}.col-sm-4{width:33.333333%}.col-sm-5{width:41.666667%}.col-sm-6{width:50%}.col-sm-7{width:58.333333%}.col-sm-8{width:66.666667%}.col-sm-9{width:75%}.col-sm-10{width:83.333333%}.col-sm-11{width:91.666667%}.col-sm-12{width:100%}.pull-sm-0{right:auto}.pull-sm-1{right:8.333333%}.pull-sm-2{right:16.666667%}.pull-sm-3{right:25%}.pull-sm-4{right:33.333333%}.pull-sm-5{right:41.666667%}.pull-sm-6{right:50%}.pull-sm-7{right:58.333333%}.pull-sm-8{right:66.666667%}.pull-sm-9{right:75%}.pull-sm-10{right:83.333333%}.pull-sm-11{right:91.666667%}.pull-sm-12{right:100%}.push-sm-0{left:auto}.push-sm-1{left:8.333333%}.push-sm-2{left:16.666667%}.push-sm-3{left:25%}.push-sm-4{left:33.333333%}.push-sm-5{left:41.666667%}.push-sm-6{left:50%}.push-sm-7{left:58.333333%}.push-sm-8{left:66.666667%}.push-sm-9{left:75%}.push-sm-10{left:83.333333%}.push-sm-11{left:91.666667%}.push-sm-12{left:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.col-md-1{width:8.333333%}.col-md-2{width:16.666667%}.col-md-3{width:25%}.col-md-4{width:33.333333%}.col-md-5{width:41.666667%}.col-md-6{width:50%}.col-md-7{width:58.333333%}.col-md-8{width:66.666667%}.col-md-9{width:75%}.col-md-10{width:83.333333%}.col-md-11{width:91.666667%}.col-md-12{width:100%}.pull-md-0{right:auto}.pull-md-1{right:8.333333%}.pull-md-2{right:16.666667%}.pull-md-3{right:25%}.pull-md-4{right:33.333333%}.pull-md-5{right:41.666667%}.pull-md-6{right:50%}.pull-md-7{right:58.333333%}.pull-md-8{right:66.666667%}.pull-md-9{right:75%}.pull-md-10{right:83.333333%}.pull-md-11{right:91.666667%}.pull-md-12{right:100%}.push-md-0{left:auto}.push-md-1{left:8.333333%}.push-md-2{left:16.666667%}.push-md-3{left:25%}.push-md-4{left:33.333333%}.push-md-5{left:41.666667%}.push-md-6{left:50%}.push-md-7{left:58.333333%}.push-md-8{left:66.666667%}.push-md-9{left:75%}.push-md-10{left:83.333333%}.push-md-11{left:91.666667%}.push-md-12{left:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.col-lg-1{width:8.333333%}.col-lg-2{width:16.666667%}.col-lg-3{width:25%}.col-lg-4{width:33.333333%}.col-lg-5{width:41.666667%}.col-lg-6{width:50%}.col-lg-7{width:58.333333%}.col-lg-8{width:66.666667%}.col-lg-9{width:75%}.col-lg-10{width:83.333333%}.col-lg-11{width:91.666667%}.col-lg-12{width:100%}.pull-lg-0{right:auto}.pull-lg-1{right:8.333333%}.pull-lg-2{right:16.666667%}.pull-lg-3{right:25%}.pull-lg-4{right:33.333333%}.pull-lg-5{right:41.666667%}.pull-lg-6{right:50%}.pull-lg-7{right:58.333333%}.pull-lg-8{right:66.666667%}.pull-lg-9{right:75%}.pull-lg-10{right:83.333333%}.pull-lg-11{right:91.666667%}.pull-lg-12{right:100%}.push-lg-0{left:auto}.push-lg-1{left:8.333333%}.push-lg-2{left:16.666667%}.push-lg-3{left:25%}.push-lg-4{left:33.333333%}.push-lg-5{left:41.666667%}.push-lg-6{left:50%}.push-lg-7{left:58.333333%}.push-lg-8{left:66.666667%}.push-lg-9{left:75%}.push-lg-10{left:83.333333%}.push-lg-11{left:91.666667%}.push-lg-12{left:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.col-xl-1{width:8.333333%}.col-xl-2{width:16.666667%}.col-xl-3{width:25%}.col-xl-4{width:33.333333%}.col-xl-5{width:41.666667%}.col-xl-6{width:50%}.col-xl-7{width:58.333333%}.col-xl-8{width:66.666667%}.col-xl-9{width:75%}.col-xl-10{width:83.333333%}.col-xl-11{width:91.666667%}.col-xl-12{width:100%}.pull-xl-0{right:auto}.pull-xl-1{right:8.333333%}.pull-xl-2{right:16.666667%}.pull-xl-3{right:25%}.pull-xl-4{right:33.333333%}.pull-xl-5{right:41.666667%}.pull-xl-6{right:50%}.pull-xl-7{right:58.333333%}.pull-xl-8{right:66.666667%}.pull-xl-9{right:75%}.pull-xl-10{right:83.333333%}.pull-xl-11{right:91.666667%}.pull-xl-12{right:100%}.push-xl-0{left:auto}.push-xl-1{left:8.333333%}.push-xl-2{left:16.666667%}.push-xl-3{left:25%}.push-xl-4{left:33.333333%}.push-xl-5{left:41.666667%}.push-xl-6{left:50%}.push-xl-7{left:58.333333%}.push-xl-8{left:66.666667%}.push-xl-9{left:75%}.push-xl-10{left:83.333333%}.push-xl-11{left:91.666667%}.push-xl-12{left:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;max-width:100%;margin-bottom:1rem;background-color:transparent}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #eceeef}.table thead th{vertical-align:bottom;border-bottom:2px solid #eceeef}.table tbody+tbody{border-top:2px solid #eceeef}.table .table{background-color:#fff}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #eceeef}.table-bordered td,.table-bordered th{border:1px solid #eceeef}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{background-color:rgba(0,0,0,.075)}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table-success,.table-success>td,.table-success>th{background-color:#dff0d8}.table-hover .table-success:hover{background-color:#d0e9c6}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#d0e9c6}.table-info,.table-info>td,.table-info>th{background-color:#d9edf7}.table-hover .table-info:hover{background-color:#c4e3f3}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#c4e3f3}.table-warning,.table-warning>td,.table-warning>th{background-color:#fcf8e3}.table-hover .table-warning:hover{background-color:#faf2cc}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#faf2cc}.table-danger,.table-danger>td,.table-danger>th{background-color:#f2dede}.table-hover .table-danger:hover{background-color:#ebcccc}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#ebcccc}.thead-inverse th{color:#fff;background-color:#292b2c}.thead-default th{color:#464a4c;background-color:#eceeef}.table-inverse{color:#fff;background-color:#292b2c}.table-inverse td,.table-inverse th,.table-inverse thead th{border-color:#3b3e40}.table-inverse.table-bordered{border:0}.table-inverse.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-inverse.table-hover tbody tr:hover{background-color:rgba(255,255,255,.075)}@media (max-width:991px){.table-responsive{display:block;width:100%;overflow-x:auto;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive.table-bordered{border:0}}.form-control{display:block;width:100%;padding:.5rem 1rem;font-size:1rem;line-height:1.25;color:#464a4c;background-color:#fff;background-image:none;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem;-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s,-webkit-box-shadow ease-in-out .15s}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#464a4c;background-color:#fff;border-color:#5cb3fd;outline:0}.form-control::-webkit-input-placeholder{color:#636c72;opacity:1}.form-control::-moz-placeholder{color:#636c72;opacity:1}.form-control:-ms-input-placeholder{color:#636c72;opacity:1}.form-control::placeholder{color:#636c72;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#eceeef;opacity:1}select.form-control:not([size]):not([multiple]){height:calc(2.25rem + 2px)}select.form-control:focus::-ms-value{color:#464a4c;background-color:#fff}.form-control-file,.form-control-range{display:block}.col-form-label{padding-top:calc(.5rem - 1px * 2);padding-bottom:calc(.5rem - 1px * 2);margin-bottom:0}.col-form-label-lg{padding-top:calc(.5rem - 1px * 2);padding-bottom:calc(.5rem - 1px * 2);font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem - 1px * 2);padding-bottom:calc(.25rem - 1px * 2);font-size:.875rem}.col-form-legend{padding-top:.5rem;padding-bottom:.5rem;margin-bottom:0;font-size:1rem}.form-control-static{padding-top:.5rem;padding-bottom:.5rem;margin-bottom:0;line-height:1.25;border:solid transparent;border-width:1px 0}.form-control-static.form-control-lg,.form-control-static.form-control-sm,.input-group-lg>.form-control-static.form-control,.input-group-lg>.form-control-static.input-group-addon,.input-group-lg>.input-group-btn>.form-control-static.btn,.input-group-sm>.form-control-static.form-control,.input-group-sm>.form-control-static.input-group-addon,.input-group-sm>.input-group-btn>.form-control-static.btn{padding-right:0;padding-left:0}.form-control-sm,.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-sm>.input-group-btn>select.btn:not([size]):not([multiple]),.input-group-sm>select.form-control:not([size]):not([multiple]),.input-group-sm>select.input-group-addon:not([size]):not([multiple]),select.form-control-sm:not([size]):not([multiple]){height:calc(1.8125rem + 2px)}.form-control-lg,.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-lg>.input-group-btn>select.btn:not([size]):not([multiple]),.input-group-lg>select.form-control:not([size]):not([multiple]),.input-group-lg>select.input-group-addon:not([size]):not([multiple]),select.form-control-lg:not([size]):not([multiple]){height:calc(2.875rem + 2px)}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-check{position:relative;display:block;margin-bottom:.5rem}.form-check.disabled .form-check-label{color:#636c72}.form-check-label{padding-left:1.25rem;margin-bottom:0}.form-check-input{position:absolute;margin-top:.25rem;margin-left:-1.25rem}.form-check-input:only-child{position:static}.form-check-inline{display:inline-block}.form-check-inline .form-check-label{vertical-align:middle}.form-check-inline+.form-check-inline{margin-left:.75rem}.form-control-feedback{margin-top:.25rem}.form-control-danger,.form-control-success,.form-control-warning{padding-right:3rem;background-repeat:no-repeat;background-position:center right .5625rem;-webkit-background-size:1.125rem 1.125rem;background-size:1.125rem 1.125rem}.has-success .col-form-label,.has-success .custom-control,.has-success .form-check-label,.has-success .form-control-feedback,.has-success .form-control-label{color:#5cb85c}.has-success .custom-file-control,.has-success .custom-select,.has-success .form-control{border-color:#5cb85c}.has-success .input-group-addon{color:#5cb85c;background-color:#eaf6ea;border-color:#5cb85c}.has-success .form-control-success{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%235cb85c' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E")}.has-warning .col-form-label,.has-warning .custom-control,.has-warning .form-check-label,.has-warning .form-control-feedback,.has-warning .form-control-label{color:#f0ad4e}.has-warning .custom-file-control,.has-warning .custom-select,.has-warning .form-control{border-color:#f0ad4e}.has-warning .input-group-addon{color:#f0ad4e;background-color:#fff;border-color:#f0ad4e}.has-warning .form-control-warning{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23f0ad4e' d='M4.4 5.324h-.8v-2.46h.8zm0 1.42h-.8V5.89h.8zM3.76.63L.04 7.075c-.115.2.016.425.26.426h7.397c.242 0 .372-.226.258-.426C6.726 4.924 5.47 2.79 4.253.63c-.113-.174-.39-.174-.494 0z'/%3E%3C/svg%3E")}.has-danger .col-form-label,.has-danger .custom-control,.has-danger .form-check-label,.has-danger .form-control-feedback,.has-danger .form-control-label{color:#d9534f}.has-danger .custom-file-control,.has-danger .custom-select,.has-danger .form-control{border-color:#d9534f}.has-danger .input-group-addon{color:#d9534f;background-color:#fdf7f7;border-color:#d9534f}.has-danger .form-control-danger{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23d9534f' viewBox='-2 -2 7 7'%3E%3Cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3E%3Ccircle r='.5'/%3E%3Ccircle cx='3' r='.5'/%3E%3Ccircle cy='3' r='.5'/%3E%3Ccircle cx='3' cy='3' r='.5'/%3E%3C/svg%3E")}.form-inline{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{width:auto}.form-inline .form-control-label{margin-bottom:0;vertical-align:middle}.form-inline .form-check{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;width:auto;margin-top:0;margin-bottom:0}.form-inline .form-check-label{padding-left:0}.form-inline .form-check-input{position:relative;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding-left:0}.form-inline .custom-control-indicator{position:static;display:inline-block;margin-right:.25rem;vertical-align:text-bottom}.form-inline .has-feedback .form-control-feedback{top:0}}.btn{display:inline-block;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid transparent;padding:.5rem 1rem;font-size:1rem;line-height:1.25;border-radius:.25rem;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.btn:focus,.btn:hover{text-decoration:none}.btn.focus,.btn:focus{outline:0;-webkit-box-shadow:0 0 0 2px rgba(2,117,216,.25);box-shadow:0 0 0 2px rgba(2,117,216,.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn.active,.btn:active{background-image:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#0275d8;border-color:#0275d8}.btn-primary:hover{color:#fff;background-color:#025aa5;border-color:#01549b}.btn-primary.focus,.btn-primary:focus{-webkit-box-shadow:0 0 0 2px rgba(2,117,216,.5);box-shadow:0 0 0 2px rgba(2,117,216,.5)}.btn-primary.disabled,.btn-primary:disabled{background-color:#0275d8;border-color:#0275d8}.btn-primary.active,.btn-primary:active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#025aa5;background-image:none;border-color:#01549b}.btn-secondary{color:#292b2c;background-color:#fff;border-color:#ccc}.btn-secondary:hover{color:#292b2c;background-color:#e6e6e6;border-color:#adadad}.btn-secondary.focus,.btn-secondary:focus{-webkit-box-shadow:0 0 0 2px rgba(204,204,204,.5);box-shadow:0 0 0 2px rgba(204,204,204,.5)}.btn-secondary.disabled,.btn-secondary:disabled{background-color:#fff;border-color:#ccc}.btn-secondary.active,.btn-secondary:active,.show>.btn-secondary.dropdown-toggle{color:#292b2c;background-color:#e6e6e6;background-image:none;border-color:#adadad}.btn-info{color:#fff;background-color:#5bc0de;border-color:#5bc0de}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#2aabd2}.btn-info.focus,.btn-info:focus{-webkit-box-shadow:0 0 0 2px rgba(91,192,222,.5);box-shadow:0 0 0 2px rgba(91,192,222,.5)}.btn-info.disabled,.btn-info:disabled{background-color:#5bc0de;border-color:#5bc0de}.btn-info.active,.btn-info:active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#31b0d5;background-image:none;border-color:#2aabd2}.btn-success{color:#fff;background-color:#5cb85c;border-color:#5cb85c}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#419641}.btn-success.focus,.btn-success:focus{-webkit-box-shadow:0 0 0 2px rgba(92,184,92,.5);box-shadow:0 0 0 2px rgba(92,184,92,.5)}.btn-success.disabled,.btn-success:disabled{background-color:#5cb85c;border-color:#5cb85c}.btn-success.active,.btn-success:active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#449d44;background-image:none;border-color:#419641}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#f0ad4e}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#eb9316}.btn-warning.focus,.btn-warning:focus{-webkit-box-shadow:0 0 0 2px rgba(240,173,78,.5);box-shadow:0 0 0 2px rgba(240,173,78,.5)}.btn-warning.disabled,.btn-warning:disabled{background-color:#f0ad4e;border-color:#f0ad4e}.btn-warning.active,.btn-warning:active,.show>.btn-warning.dropdown-toggle{color:#fff;background-color:#ec971f;background-image:none;border-color:#eb9316}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d9534f}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#c12e2a}.btn-danger.focus,.btn-danger:focus{-webkit-box-shadow:0 0 0 2px rgba(217,83,79,.5);box-shadow:0 0 0 2px rgba(217,83,79,.5)}.btn-danger.disabled,.btn-danger:disabled{background-color:#d9534f;border-color:#d9534f}.btn-danger.active,.btn-danger:active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#c9302c;background-image:none;border-color:#c12e2a}.btn-outline-primary{color:#0275d8;background-color:transparent;background-image:none;border-color:#0275d8}.btn-outline-primary:hover{color:#fff;background-color:#0275d8;border-color:#0275d8}.btn-outline-primary.focus,.btn-outline-primary:focus{-webkit-box-shadow:0 0 0 2px rgba(2,117,216,.5);box-shadow:0 0 0 2px rgba(2,117,216,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#0275d8;background-color:transparent}.btn-outline-primary.active,.btn-outline-primary:active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#0275d8;border-color:#0275d8}.btn-outline-secondary{color:#ccc;background-color:transparent;background-image:none;border-color:#ccc}.btn-outline-secondary:hover{color:#292b2c;background-color:#ccc;border-color:#ccc}.btn-outline-secondary.focus,.btn-outline-secondary:focus{-webkit-box-shadow:0 0 0 2px rgba(204,204,204,.5);box-shadow:0 0 0 2px rgba(204,204,204,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#ccc;background-color:transparent}.btn-outline-secondary.active,.btn-outline-secondary:active,.show>.btn-outline-secondary.dropdown-toggle{color:#292b2c;background-color:#ccc;border-color:#ccc}.btn-outline-info{color:#5bc0de;background-color:transparent;background-image:none;border-color:#5bc0de}.btn-outline-info:hover{color:#fff;background-color:#5bc0de;border-color:#5bc0de}.btn-outline-info.focus,.btn-outline-info:focus{-webkit-box-shadow:0 0 0 2px rgba(91,192,222,.5);box-shadow:0 0 0 2px rgba(91,192,222,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#5bc0de;background-color:transparent}.btn-outline-info.active,.btn-outline-info:active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#5bc0de;border-color:#5bc0de}.btn-outline-success{color:#5cb85c;background-color:transparent;background-image:none;border-color:#5cb85c}.btn-outline-success:hover{color:#fff;background-color:#5cb85c;border-color:#5cb85c}.btn-outline-success.focus,.btn-outline-success:focus{-webkit-box-shadow:0 0 0 2px rgba(92,184,92,.5);box-shadow:0 0 0 2px rgba(92,184,92,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#5cb85c;background-color:transparent}.btn-outline-success.active,.btn-outline-success:active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#5cb85c;border-color:#5cb85c}.btn-outline-warning{color:#f0ad4e;background-color:transparent;background-image:none;border-color:#f0ad4e}.btn-outline-warning:hover{color:#fff;background-color:#f0ad4e;border-color:#f0ad4e}.btn-outline-warning.focus,.btn-outline-warning:focus{-webkit-box-shadow:0 0 0 2px rgba(240,173,78,.5);box-shadow:0 0 0 2px rgba(240,173,78,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#f0ad4e;background-color:transparent}.btn-outline-warning.active,.btn-outline-warning:active,.show>.btn-outline-warning.dropdown-toggle{color:#fff;background-color:#f0ad4e;border-color:#f0ad4e}.btn-outline-danger{color:#d9534f;background-color:transparent;background-image:none;border-color:#d9534f}.btn-outline-danger:hover{color:#fff;background-color:#d9534f;border-color:#d9534f}.btn-outline-danger.focus,.btn-outline-danger:focus{-webkit-box-shadow:0 0 0 2px rgba(217,83,79,.5);box-shadow:0 0 0 2px rgba(217,83,79,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#d9534f;background-color:transparent}.btn-outline-danger.active,.btn-outline-danger:active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#d9534f;border-color:#d9534f}.btn-link{font-weight:400;color:#0275d8;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link:disabled{background-color:transparent}.btn-link,.btn-link:active,.btn-link:focus{border-color:transparent}.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#014c8c;text-decoration:underline;background-color:transparent}.btn-link:disabled{color:#636c72}.btn-link:disabled:focus,.btn-link:disabled:hover{text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.show{opacity:1}.collapse{display:none}.collapse.show{display:block}tr.collapse.show{display:table-row}tbody.collapse.show{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.dropdown,.dropup{position:relative}.dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.3em;vertical-align:middle;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropup .dropdown-toggle::after{border-top:0;border-bottom:.3em solid}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#292b2c;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #eceeef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#292b2c;text-align:inherit;white-space:nowrap;background:0 0;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#1d1e1f;text-decoration:none;background-color:#f7f7f9}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#0275d8}.dropdown-item.disabled,.dropdown-item:disabled{color:#636c72;background-color:transparent}.show>.dropdown-menu{display:block}.show>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#636c72;white-space:nowrap}.dropup .dropdown-menu{top:auto;bottom:100%;margin-bottom:.125rem}.btn-group,.btn-group-vertical{position:relative;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;margin-bottom:0}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:2}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group,.btn-group-vertical .btn+.btn,.btn-group-vertical .btn+.btn-group,.btn-group-vertical .btn-group+.btn,.btn-group-vertical .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn+.dropdown-toggle-split::after{margin-left:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.btn-group-vertical .btn,.btn-group-vertical .btn-group{width:100%}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%}.input-group .form-control{position:relative;z-index:2;-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;margin-bottom:0}.input-group .form-control:active,.input-group .form-control:focus,.input-group .form-control:hover{z-index:3}.input-group .form-control,.input-group-addon,.input-group-btn{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{white-space:nowrap;vertical-align:middle}.input-group-addon{padding:.5rem 1rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.25;color:#464a4c;text-align:center;background-color:#eceeef;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.input-group-addon.form-control-sm,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.input-group-addon.btn{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.input-group-addon.form-control-lg,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.input-group-addon.btn{padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:not(:last-child),.input-group-addon:not(:last-child),.input-group-btn:not(:first-child)>.btn-group:not(:last-child)>.btn,.input-group-btn:not(:first-child)>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:not(:last-child)>.btn,.input-group-btn:not(:last-child)>.btn-group>.btn,.input-group-btn:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:not(:last-child){border-right:0}.input-group .form-control:not(:first-child),.input-group-addon:not(:first-child),.input-group-btn:not(:first-child)>.btn,.input-group-btn:not(:first-child)>.btn-group>.btn,.input-group-btn:not(:first-child)>.dropdown-toggle,.input-group-btn:not(:last-child)>.btn-group:not(:first-child)>.btn,.input-group-btn:not(:last-child)>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.form-control+.input-group-addon:not(:first-child){border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:3}.input-group-btn:not(:last-child)>.btn,.input-group-btn:not(:last-child)>.btn-group{margin-right:-1px}.input-group-btn:not(:first-child)>.btn,.input-group-btn:not(:first-child)>.btn-group{z-index:2;margin-left:-1px}.input-group-btn:not(:first-child)>.btn-group:active,.input-group-btn:not(:first-child)>.btn-group:focus,.input-group-btn:not(:first-child)>.btn-group:hover,.input-group-btn:not(:first-child)>.btn:active,.input-group-btn:not(:first-child)>.btn:focus,.input-group-btn:not(:first-child)>.btn:hover{z-index:3}.custom-control{position:relative;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;min-height:1.5rem;padding-left:1.5rem;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-indicator{color:#fff;background-color:#0275d8}.custom-control-input:focus~.custom-control-indicator{-webkit-box-shadow:0 0 0 1px #fff,0 0 0 3px #0275d8;box-shadow:0 0 0 1px #fff,0 0 0 3px #0275d8}.custom-control-input:active~.custom-control-indicator{color:#fff;background-color:#8fcafe}.custom-control-input:disabled~.custom-control-indicator{background-color:#eceeef}.custom-control-input:disabled~.custom-control-description{color:#636c72}.custom-control-indicator{position:absolute;top:.25rem;left:0;display:block;width:1rem;height:1rem;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#ddd;background-repeat:no-repeat;background-position:center center;-webkit-background-size:50% 50%;background-size:50% 50%}.custom-checkbox .custom-control-indicator{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-indicator{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-indicator{background-color:#0275d8;background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-radio .custom-control-indicator{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-indicator{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.custom-controls-stacked{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.custom-controls-stacked .custom-control{margin-bottom:.25rem}.custom-controls-stacked .custom-control+.custom-control{margin-left:0}.custom-select{display:inline-block;max-width:100%;height:calc(2.25rem + 2px);padding:.375rem 1.75rem .375rem .75rem;line-height:1.25;color:#464a4c;vertical-align:middle;background:#fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23333' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center;-webkit-background-size:8px 10px;background-size:8px 10px;border:1px solid rgba(0,0,0,.15);border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#5cb3fd;outline:0}.custom-select:focus::-ms-value{color:#464a4c;background-color:#fff}.custom-select:disabled{color:#636c72;background-color:#eceeef}.custom-select::-ms-expand{opacity:0}.custom-select-sm{padding-top:.375rem;padding-bottom:.375rem;font-size:75%}.custom-file{position:relative;display:inline-block;max-width:100%;height:2.5rem;margin-bottom:0}.custom-file-input{min-width:14rem;max-width:100%;height:2.5rem;margin:0;opacity:0}.custom-file-control{position:absolute;top:0;right:0;left:0;z-index:5;height:2.5rem;padding:.5rem 1rem;line-height:1.5;color:#464a4c;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#fff;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.custom-file-control:lang(en):empty::after{content:"Choose file..."}.custom-file-control::before{position:absolute;top:-1px;right:-1px;bottom:-1px;z-index:6;display:block;height:2.5rem;padding:.5rem 1rem;line-height:1.5;color:#464a4c;background-color:#eceeef;border:1px solid rgba(0,0,0,.15);border-radius:0 .25rem .25rem 0}.custom-file-control:lang(en)::before{content:"Browse"}.nav{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#636c72}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#eceeef #eceeef #ddd}.nav-tabs .nav-link.disabled{color:#636c72;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#464a4c;background-color:#fff;border-color:#ddd #ddd #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.show .nav-pills .nav-link{color:#fff;background-color:#0275d8}.nav-fill .nav-item{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar>.container,.navbar>.container-fluid{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}@media (max-width:575px){.navbar>.container,.navbar>.container-fluid{width:100%;margin-right:0;margin-left:0}}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-webkit-flex-basis:100%;-ms-flex-preferred-size:100%;flex-basis:100%}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background:0 0;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;-webkit-background-size:100% 100%;background-size:100% 100%}@media (max-width:575px){.navbar-expand-sm .navbar-nav .dropdown-menu{position:static;float:none}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-webkit-box!important;display:-webkit-flex!important;display:-ms-flexbox!important;display:flex!important}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767px){.navbar-expand-md .navbar-nav .dropdown-menu{position:static;float:none}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-webkit-box!important;display:-webkit-flex!important;display:-ms-flexbox!important;display:flex!important}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991px){.navbar-expand-lg .navbar-nav .dropdown-menu{position:static;float:none}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-webkit-box!important;display:-webkit-flex!important;display:-ms-flexbox!important;display:flex!important}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199px){.navbar-expand-xl .navbar-nav .dropdown-menu{position:static;float:none}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-webkit-box!important;display:-webkit-flex!important;display:-ms-flexbox!important;display:flex!important}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand .navbar-nav .dropdown-menu{position:static;float:none}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-webkit-box!important;display:-webkit-flex!important;display:-ms-flexbox!important;display:flex!important}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-inverse .navbar-brand{color:#fff}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff}.navbar-inverse .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-inverse .navbar-nav .nav-link:focus,.navbar-inverse .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-inverse .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-inverse .navbar-nav .active>.nav-link,.navbar-inverse .navbar-nav .nav-link.active,.navbar-inverse .navbar-nav .nav-link.show,.navbar-inverse .navbar-nav .show>.nav-link{color:#fff}.navbar-inverse .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-inverse .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-inverse .navbar-text{color:rgba(255,255,255,.5)}.card{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;background-color:#fff;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card-block{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem;word-break:break-all}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:#f7f7f9;border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-footer{padding:.75rem 1.25rem;background-color:#f7f7f9;border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-primary{background-color:#0275d8;border-color:#0275d8}.card-primary .card-footer,.card-primary .card-header{background-color:transparent}.card-success{background-color:#5cb85c;border-color:#5cb85c}.card-success .card-footer,.card-success .card-header{background-color:transparent}.card-info{background-color:#5bc0de;border-color:#5bc0de}.card-info .card-footer,.card-info .card-header{background-color:transparent}.card-warning{background-color:#f0ad4e;border-color:#f0ad4e}.card-warning .card-footer,.card-warning .card-header{background-color:transparent}.card-danger{background-color:#d9534f;border-color:#d9534f}.card-danger .card-footer,.card-danger .card-header{background-color:transparent}.card-outline-primary{background-color:transparent;border-color:#0275d8}.card-outline-primary .card-footer,.card-outline-primary .card-header{background-color:transparent;border-color:#0275d8}.card-outline-secondary{background-color:transparent;border-color:#ccc}.card-outline-secondary .card-footer,.card-outline-secondary .card-header{background-color:transparent;border-color:#ccc}.card-outline-info{background-color:transparent;border-color:#5bc0de}.card-outline-info .card-footer,.card-outline-info .card-header{background-color:transparent;border-color:#5bc0de}.card-outline-success{background-color:transparent;border-color:#5cb85c}.card-outline-success .card-footer,.card-outline-success .card-header{background-color:transparent;border-color:#5cb85c}.card-outline-warning{background-color:transparent;border-color:#f0ad4e}.card-outline-warning .card-footer,.card-outline-warning .card-header{background-color:transparent;border-color:#f0ad4e}.card-outline-danger{background-color:transparent;border-color:#d9534f}.card-outline-danger .card-footer,.card-outline-danger .card-header{background-color:transparent;border-color:#d9534f}.card-inverse{color:rgba(255,255,255,.65)}.card-inverse .card-footer,.card-inverse .card-header{background-color:transparent;border-color:rgba(255,255,255,.2)}.card-inverse .card-blockquote,.card-inverse .card-footer,.card-inverse .card-header,.card-inverse .card-title{color:#fff}.card-inverse .card-blockquote .blockquote-footer,.card-inverse .card-link,.card-inverse .card-subtitle,.card-inverse .card-text{color:rgba(255,255,255,.65)}.card-inverse .card-link:focus,.card-inverse .card-link:hover{color:#fff}.card-blockquote{padding:0;margin-bottom:0;border-left:0}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}@media (min-width:576px){.card-deck{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1 0 0;-ms-flex:1 0 0px;flex:1 0 0%;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;margin-right:15px;margin-left:15px}}@media (min-width:576px){.card-group{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group .card{-webkit-box-flex:1;-webkit-flex:1 0 0;-ms-flex:1 0 0px;flex:1 0 0%}.card-group .card+.card{margin-left:0;border-left:0}.card-group .card:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.card-group .card:first-child .card-img-top{border-top-right-radius:0}.card-group .card:first-child .card-img-bottom{border-bottom-right-radius:0}.card-group .card:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.card-group .card:last-child .card-img-top{border-top-left-radius:0}.card-group .card:last-child .card-img-bottom{border-bottom-left-radius:0}.card-group .card:not(:first-child):not(:last-child){border-radius:0}.card-group .card:not(:first-child):not(:last-child) .card-img-bottom,.card-group .card:not(:first-child):not(:last-child) .card-img-top{border-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem}.card-columns .card{display:inline-block;width:100%}}.breadcrumb{padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#eceeef;border-radius:.25rem}.breadcrumb::after{display:block;clear:both;content:""}.breadcrumb-item{float:left}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;padding-left:.5rem;color:#636c72;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#636c72}.pagination{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:2;color:#fff;background-color:#0275d8;border-color:#0275d8}.page-item.disabled .page-link{color:#636c72;pointer-events:none;background-color:#fff;border-color:#ddd}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#0275d8;background-color:#fff;border:1px solid #ddd}.page-link:focus,.page-link:hover{color:#014c8c;text-decoration:none;background-color:#eceeef;border-color:#ddd}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-default{background-color:#636c72}.badge-default[href]:focus,.badge-default[href]:hover{background-color:#4b5257}.badge-primary{background-color:#0275d8}.badge-primary[href]:focus,.badge-primary[href]:hover{background-color:#025aa5}.badge-success{background-color:#5cb85c}.badge-success[href]:focus,.badge-success[href]:hover{background-color:#449d44}.badge-info{background-color:#5bc0de}.badge-info[href]:focus,.badge-info[href]:hover{background-color:#31b0d5}.badge-warning{background-color:#f0ad4e}.badge-warning[href]:focus,.badge-warning[href]:hover{background-color:#ec971f}.badge-danger{background-color:#d9534f}.badge-danger[href]:focus,.badge-danger[href]:hover{background-color:#c9302c}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#eceeef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible .close{position:relative;top:-.75rem;right:-1.25rem;padding:.75rem 1.25rem;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d0e9c6}.alert-success hr{border-top-color:#c1e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bcdff1}.alert-info hr{border-top-color:#a6d5ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faf2cc}.alert-warning hr{border-top-color:#f7ecb5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebcccc}.alert-danger hr{border-top-color:#e4b9b9}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;overflow:hidden;font-size:.75rem;line-height:1rem;text-align:center;background-color:#eceeef;border-radius:.25rem}.progress-bar{height:1rem;line-height:1rem;color:#fff;background-color:#0275d8;-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:1rem 1rem;background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;-o-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}.media{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start}.media-body{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1 1 0%}.list-group{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#464a4c;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{color:#464a4c;text-decoration:none;background-color:#f7f7f9}.list-group-item-action:active{color:#292b2c;background-color:#eceeef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item:focus,.list-group-item:hover{text-decoration:none}.list-group-item.disabled,.list-group-item:disabled{color:#636c72;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#0275d8;border-color:#0275d8}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{border-bottom:0}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,button.list-group-item-success.active{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,button.list-group-item-info.active{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,button.list-group-item-warning.active{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,button.list-group-item-danger.active{color:#fff;background-color:#a94442;border-color:#a94442}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:focus,.close:hover{color:#000;text-decoration:none;opacity:.75}button.close{padding:0;background:0 0;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out,-o-transform .3s ease-out;-webkit-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.show .modal-dialog{-webkit-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:15px;border-bottom:1px solid #eceeef}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;padding:15px}.modal-footer{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;padding:15px;border-top:1px solid #eceeef}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:30px auto}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg{max-width:800px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip.bs-tether-element-attached-bottom,.tooltip.tooltip-top{padding:5px 0;margin-top:-3px}.tooltip.bs-tether-element-attached-bottom .tooltip-inner::before,.tooltip.tooltip-top .tooltip-inner::before{bottom:0;left:50%;margin-left:-5px;content:"";border-width:5px 5px 0;border-top-color:#000}.tooltip.bs-tether-element-attached-left,.tooltip.tooltip-right{padding:0 5px;margin-left:3px}.tooltip.bs-tether-element-attached-left .tooltip-inner::before,.tooltip.tooltip-right .tooltip-inner::before{top:50%;left:0;margin-top:-5px;content:"";border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.bs-tether-element-attached-top,.tooltip.tooltip-bottom{padding:5px 0;margin-top:3px}.tooltip.bs-tether-element-attached-top .tooltip-inner::before,.tooltip.tooltip-bottom .tooltip-inner::before{top:0;left:50%;margin-left:-5px;content:"";border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bs-tether-element-attached-right,.tooltip.tooltip-left{padding:0 5px;margin-left:-3px}.tooltip.bs-tether-element-attached-right .tooltip-inner::before,.tooltip.tooltip-left .tooltip-inner::before{top:50%;right:0;margin-top:-5px;content:"";border-width:5px 0 5px 5px;border-left-color:#000}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.tooltip-inner::before{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;padding:1px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover.bs-tether-element-attached-bottom,.popover.popover-top{margin-top:-10px}.popover.bs-tether-element-attached-bottom::after,.popover.bs-tether-element-attached-bottom::before,.popover.popover-top::after,.popover.popover-top::before{left:50%;border-bottom-width:0}.popover.bs-tether-element-attached-bottom::before,.popover.popover-top::before{bottom:-11px;margin-left:-11px;border-top-color:rgba(0,0,0,.25)}.popover.bs-tether-element-attached-bottom::after,.popover.popover-top::after{bottom:-10px;margin-left:-10px;border-top-color:#fff}.popover.bs-tether-element-attached-left,.popover.popover-right{margin-left:10px}.popover.bs-tether-element-attached-left::after,.popover.bs-tether-element-attached-left::before,.popover.popover-right::after,.popover.popover-right::before{top:50%;border-left-width:0}.popover.bs-tether-element-attached-left::before,.popover.popover-right::before{left:-11px;margin-top:-11px;border-right-color:rgba(0,0,0,.25)}.popover.bs-tether-element-attached-left::after,.popover.popover-right::after{left:-10px;margin-top:-10px;border-right-color:#fff}.popover.bs-tether-element-attached-top,.popover.popover-bottom{margin-top:10px}.popover.bs-tether-element-attached-top::after,.popover.bs-tether-element-attached-top::before,.popover.popover-bottom::after,.popover.popover-bottom::before{left:50%;border-top-width:0}.popover.bs-tether-element-attached-top::before,.popover.popover-bottom::before{top:-11px;margin-left:-11px;border-bottom-color:rgba(0,0,0,.25)}.popover.bs-tether-element-attached-top::after,.popover.popover-bottom::after{top:-10px;margin-left:-10px;border-bottom-color:#fff}.popover.bs-tether-element-attached-top .popover-title::before,.popover.popover-bottom .popover-title::before{position:absolute;top:0;left:50%;display:block;width:20px;margin-left:-10px;content:"";border-bottom:1px solid #f7f7f7}.popover.bs-tether-element-attached-right,.popover.popover-left{margin-left:-10px}.popover.bs-tether-element-attached-right::after,.popover.bs-tether-element-attached-right::before,.popover.popover-left::after,.popover.popover-left::before{top:50%;border-right-width:0}.popover.bs-tether-element-attached-right::before,.popover.popover-left::before{right:-11px;margin-top:-11px;border-left-color:rgba(0,0,0,.25)}.popover.bs-tether-element-attached-right::after,.popover.popover-left::after{right:-10px;margin-top:-10px;border-left-color:#fff}.popover-title{padding:8px 14px;margin-bottom:0;font-size:1rem;color:inherit;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-title:empty{display:none}.popover-content{padding:9px 14px;color:#292b2c}.popover::after,.popover::before{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover::before{content:"";border-width:11px}.popover::after{content:"";border-width:10px}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-item{position:relative;display:none;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;width:100%;-webkit-transition:-webkit-transform .6s ease;transition:-webkit-transform .6s ease;-o-transition:-o-transform .6s ease;transition:transform .6s ease;transition:transform .6s ease,-webkit-transform .6s ease,-o-transform .6s ease;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.carousel-item-next,.carousel-item-prev{position:absolute;top:0}.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.active.carousel-item-right,.carousel-item-next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:transparent no-repeat center center;-webkit-background-size:100% 100%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M4 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E")}.carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M1.5 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E")}.carousel-indicators{position:absolute;right:0;bottom:10px;left:0;z-index:15;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{position:relative;-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;max-width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;background-color:rgba(255,255,255,.5)}.carousel-indicators li::before{position:absolute;top:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators li::after{position:absolute;bottom:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-faded{background-color:#f7f7f7}.bg-primary{background-color:#0275d8!important}a.bg-primary:focus,a.bg-primary:hover{background-color:#025aa5!important}.bg-success{background-color:#5cb85c!important}a.bg-success:focus,a.bg-success:hover{background-color:#449d44!important}.bg-info{background-color:#5bc0de!important}a.bg-info:focus,a.bg-info:hover{background-color:#31b0d5!important}.bg-warning{background-color:#f0ad4e!important}a.bg-warning:focus,a.bg-warning:hover{background-color:#ec971f!important}.bg-danger{background-color:#d9534f!important}a.bg-danger:focus,a.bg-danger:hover{background-color:#c9302c!important}.bg-inverse{background-color:#292b2c!important}a.bg-inverse:focus,a.bg-inverse:hover{background-color:#101112!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.rounded{border-radius:.25rem}.rounded-top{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.rounded-right{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.rounded-bottom{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.rounded-left{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.rounded-circle{border-radius:50%}.rounded-0{border-radius:0}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-cell{display:table-cell!important}.d-flex{display:-webkit-box!important;display:-webkit-flex!important;display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-webkit-inline-box!important;display:-webkit-inline-flex!important;display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-webkit-box!important;display:-webkit-flex!important;display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-webkit-inline-box!important;display:-webkit-inline-flex!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-webkit-box!important;display:-webkit-flex!important;display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-webkit-inline-box!important;display:-webkit-inline-flex!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-webkit-box!important;display:-webkit-flex!important;display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-webkit-inline-box!important;display:-webkit-inline-flex!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-webkit-box!important;display:-webkit-flex!important;display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-webkit-inline-box!important;display:-webkit-inline-flex!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}.d-print-block{display:none!important}@media print{.d-print-block{display:block!important}}.d-print-inline{display:none!important}@media print{.d-print-inline{display:inline!important}}.d-print-inline-block{display:none!important}@media print{.d-print-inline-block{display:inline-block!important}}@media print{.d-print-none{display:none!important}}.order-first{-webkit-box-ordinal-group:0;-webkit-order:-1;-ms-flex-order:-1;order:-1}.order-last{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.order-0{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}.flex-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-webkit-flex-direction:row!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-webkit-flex-direction:column!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:row-reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:column-reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-webkit-flex-wrap:wrap!important;-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-webkit-flex-wrap:nowrap!important;-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-webkit-flex-wrap:wrap-reverse!important;-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-start{-webkit-box-pack:start!important;-webkit-justify-content:flex-start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-webkit-box-pack:end!important;-webkit-justify-content:flex-end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-webkit-box-pack:center!important;-webkit-justify-content:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-webkit-box-pack:justify!important;-webkit-justify-content:space-between!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-webkit-justify-content:space-around!important;-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-webkit-box-align:start!important;-webkit-align-items:flex-start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-webkit-box-align:end!important;-webkit-align-items:flex-end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-webkit-box-align:center!important;-webkit-align-items:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-webkit-box-align:baseline!important;-webkit-align-items:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-webkit-box-align:stretch!important;-webkit-align-items:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-webkit-align-content:flex-start!important;-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-webkit-align-content:flex-end!important;-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-webkit-align-content:center!important;-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-webkit-align-content:space-between!important;-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-webkit-align-content:space-around!important;-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-webkit-align-content:stretch!important;-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-webkit-align-self:auto!important;-ms-flex-item-align:auto!important;-ms-grid-row-align:auto!important;align-self:auto!important}.align-self-start{-webkit-align-self:flex-start!important;-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-webkit-align-self:flex-end!important;-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-webkit-align-self:center!important;-ms-flex-item-align:center!important;-ms-grid-row-align:center!important;align-self:center!important}.align-self-baseline{-webkit-align-self:baseline!important;-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-webkit-align-self:stretch!important;-ms-flex-item-align:stretch!important;-ms-grid-row-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.order-sm-first{-webkit-box-ordinal-group:0;-webkit-order:-1;-ms-flex-order:-1;order:-1}.order-sm-last{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.order-sm-0{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}.flex-sm-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-webkit-flex-direction:row!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-webkit-flex-direction:column!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:row-reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:column-reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-webkit-flex-wrap:wrap!important;-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-webkit-flex-wrap:nowrap!important;-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-webkit-flex-wrap:wrap-reverse!important;-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-sm-start{-webkit-box-pack:start!important;-webkit-justify-content:flex-start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-webkit-box-pack:end!important;-webkit-justify-content:flex-end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-webkit-box-pack:center!important;-webkit-justify-content:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-webkit-box-pack:justify!important;-webkit-justify-content:space-between!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-webkit-justify-content:space-around!important;-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-webkit-box-align:start!important;-webkit-align-items:flex-start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-webkit-box-align:end!important;-webkit-align-items:flex-end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-webkit-box-align:center!important;-webkit-align-items:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-webkit-box-align:baseline!important;-webkit-align-items:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-webkit-box-align:stretch!important;-webkit-align-items:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-webkit-align-content:flex-start!important;-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-webkit-align-content:flex-end!important;-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-webkit-align-content:center!important;-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-webkit-align-content:space-between!important;-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-webkit-align-content:space-around!important;-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-webkit-align-content:stretch!important;-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-webkit-align-self:auto!important;-ms-flex-item-align:auto!important;-ms-grid-row-align:auto!important;align-self:auto!important}.align-self-sm-start{-webkit-align-self:flex-start!important;-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-webkit-align-self:flex-end!important;-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-webkit-align-self:center!important;-ms-flex-item-align:center!important;-ms-grid-row-align:center!important;align-self:center!important}.align-self-sm-baseline{-webkit-align-self:baseline!important;-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-webkit-align-self:stretch!important;-ms-flex-item-align:stretch!important;-ms-grid-row-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.order-md-first{-webkit-box-ordinal-group:0;-webkit-order:-1;-ms-flex-order:-1;order:-1}.order-md-last{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.order-md-0{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}.flex-md-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-webkit-flex-direction:row!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-webkit-flex-direction:column!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:row-reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:column-reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-webkit-flex-wrap:wrap!important;-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-webkit-flex-wrap:nowrap!important;-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-webkit-flex-wrap:wrap-reverse!important;-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-md-start{-webkit-box-pack:start!important;-webkit-justify-content:flex-start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-webkit-box-pack:end!important;-webkit-justify-content:flex-end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-webkit-box-pack:center!important;-webkit-justify-content:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-webkit-box-pack:justify!important;-webkit-justify-content:space-between!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-webkit-justify-content:space-around!important;-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-webkit-box-align:start!important;-webkit-align-items:flex-start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-webkit-box-align:end!important;-webkit-align-items:flex-end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-webkit-box-align:center!important;-webkit-align-items:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-webkit-box-align:baseline!important;-webkit-align-items:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-webkit-box-align:stretch!important;-webkit-align-items:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-webkit-align-content:flex-start!important;-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-webkit-align-content:flex-end!important;-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-webkit-align-content:center!important;-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-webkit-align-content:space-between!important;-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-webkit-align-content:space-around!important;-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-webkit-align-content:stretch!important;-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-webkit-align-self:auto!important;-ms-flex-item-align:auto!important;-ms-grid-row-align:auto!important;align-self:auto!important}.align-self-md-start{-webkit-align-self:flex-start!important;-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-webkit-align-self:flex-end!important;-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-webkit-align-self:center!important;-ms-flex-item-align:center!important;-ms-grid-row-align:center!important;align-self:center!important}.align-self-md-baseline{-webkit-align-self:baseline!important;-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-webkit-align-self:stretch!important;-ms-flex-item-align:stretch!important;-ms-grid-row-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.order-lg-first{-webkit-box-ordinal-group:0;-webkit-order:-1;-ms-flex-order:-1;order:-1}.order-lg-last{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.order-lg-0{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}.flex-lg-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-webkit-flex-direction:row!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-webkit-flex-direction:column!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:row-reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:column-reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-webkit-flex-wrap:wrap!important;-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-webkit-flex-wrap:nowrap!important;-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-webkit-flex-wrap:wrap-reverse!important;-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-lg-start{-webkit-box-pack:start!important;-webkit-justify-content:flex-start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-webkit-box-pack:end!important;-webkit-justify-content:flex-end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-webkit-box-pack:center!important;-webkit-justify-content:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-webkit-box-pack:justify!important;-webkit-justify-content:space-between!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-webkit-justify-content:space-around!important;-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-webkit-box-align:start!important;-webkit-align-items:flex-start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-webkit-box-align:end!important;-webkit-align-items:flex-end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-webkit-box-align:center!important;-webkit-align-items:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-webkit-box-align:baseline!important;-webkit-align-items:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-webkit-box-align:stretch!important;-webkit-align-items:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-webkit-align-content:flex-start!important;-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-webkit-align-content:flex-end!important;-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-webkit-align-content:center!important;-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-webkit-align-content:space-between!important;-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-webkit-align-content:space-around!important;-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-webkit-align-content:stretch!important;-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-webkit-align-self:auto!important;-ms-flex-item-align:auto!important;-ms-grid-row-align:auto!important;align-self:auto!important}.align-self-lg-start{-webkit-align-self:flex-start!important;-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-webkit-align-self:flex-end!important;-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-webkit-align-self:center!important;-ms-flex-item-align:center!important;-ms-grid-row-align:center!important;align-self:center!important}.align-self-lg-baseline{-webkit-align-self:baseline!important;-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-webkit-align-self:stretch!important;-ms-flex-item-align:stretch!important;-ms-grid-row-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.order-xl-first{-webkit-box-ordinal-group:0;-webkit-order:-1;-ms-flex-order:-1;order:-1}.order-xl-last{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.order-xl-0{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}.flex-xl-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-webkit-flex-direction:row!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-webkit-flex-direction:column!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:row-reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:column-reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-webkit-flex-wrap:wrap!important;-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-webkit-flex-wrap:nowrap!important;-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-webkit-flex-wrap:wrap-reverse!important;-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-xl-start{-webkit-box-pack:start!important;-webkit-justify-content:flex-start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-webkit-box-pack:end!important;-webkit-justify-content:flex-end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-webkit-box-pack:center!important;-webkit-justify-content:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-webkit-box-pack:justify!important;-webkit-justify-content:space-between!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-webkit-justify-content:space-around!important;-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-webkit-box-align:start!important;-webkit-align-items:flex-start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-webkit-box-align:end!important;-webkit-align-items:flex-end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-webkit-box-align:center!important;-webkit-align-items:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-webkit-box-align:baseline!important;-webkit-align-items:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-webkit-box-align:stretch!important;-webkit-align-items:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-webkit-align-content:flex-start!important;-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-webkit-align-content:flex-end!important;-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-webkit-align-content:center!important;-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-webkit-align-content:space-between!important;-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-webkit-align-content:space-around!important;-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-webkit-align-content:stretch!important;-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-webkit-align-self:auto!important;-ms-flex-item-align:auto!important;-ms-grid-row-align:auto!important;align-self:auto!important}.align-self-xl-start{-webkit-align-self:flex-start!important;-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-webkit-align-self:flex-end!important;-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-webkit-align-self:center!important;-ms-flex-item-align:center!important;-ms-grid-row-align:center!important;align-self:center!important}.align-self-xl-baseline{-webkit-align-self:baseline!important;-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-webkit-align-self:stretch!important;-ms-flex-item-align:stretch!important;-ms-grid-row-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;-webkit-clip-path:inset(50%);clip-path:inset(50%);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal;-webkit-clip-path:none;clip-path:none}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.m-0{margin:0!important}.mt-0{margin-top:0!important}.mr-0{margin-right:0!important}.mb-0{margin-bottom:0!important}.ml-0{margin-left:0!important}.mx-0{margin-right:0!important;margin-left:0!important}.my-0{margin-top:0!important;margin-bottom:0!important}.m-1{margin:.25rem!important}.mt-1{margin-top:.25rem!important}.mr-1{margin-right:.25rem!important}.mb-1{margin-bottom:.25rem!important}.ml-1{margin-left:.25rem!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.m-2{margin:.5rem!important}.mt-2{margin-top:.5rem!important}.mr-2{margin-right:.5rem!important}.mb-2{margin-bottom:.5rem!important}.ml-2{margin-left:.5rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.m-3{margin:1rem!important}.mt-3{margin-top:1rem!important}.mr-3{margin-right:1rem!important}.mb-3{margin-bottom:1rem!important}.ml-3{margin-left:1rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.m-4{margin:1.5rem!important}.mt-4{margin-top:1.5rem!important}.mr-4{margin-right:1.5rem!important}.mb-4{margin-bottom:1.5rem!important}.ml-4{margin-left:1.5rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.m-5{margin:3rem!important}.mt-5{margin-top:3rem!important}.mr-5{margin-right:3rem!important}.mb-5{margin-bottom:3rem!important}.ml-5{margin-left:3rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.p-0{padding:0!important}.pt-0{padding-top:0!important}.pr-0{padding-right:0!important}.pb-0{padding-bottom:0!important}.pl-0{padding-left:0!important}.px-0{padding-right:0!important;padding-left:0!important}.py-0{padding-top:0!important;padding-bottom:0!important}.p-1{padding:.25rem!important}.pt-1{padding-top:.25rem!important}.pr-1{padding-right:.25rem!important}.pb-1{padding-bottom:.25rem!important}.pl-1{padding-left:.25rem!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.p-2{padding:.5rem!important}.pt-2{padding-top:.5rem!important}.pr-2{padding-right:.5rem!important}.pb-2{padding-bottom:.5rem!important}.pl-2{padding-left:.5rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.p-3{padding:1rem!important}.pt-3{padding-top:1rem!important}.pr-3{padding-right:1rem!important}.pb-3{padding-bottom:1rem!important}.pl-3{padding-left:1rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.p-4{padding:1.5rem!important}.pt-4{padding-top:1.5rem!important}.pr-4{padding-right:1.5rem!important}.pb-4{padding-bottom:1.5rem!important}.pl-4{padding-left:1.5rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.p-5{padding:3rem!important}.pt-5{padding-top:3rem!important}.pr-5{padding-right:3rem!important}.pb-5{padding-bottom:3rem!important}.pl-5{padding-left:3rem!important}.px-5{padding-right:3rem!important;padding-left:3rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.m-auto{margin:auto!important}.mt-auto{margin-top:auto!important}.mr-auto{margin-right:auto!important}.mb-auto{margin-bottom:auto!important}.ml-auto{margin-left:auto!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0{margin-top:0!important}.mr-sm-0{margin-right:0!important}.mb-sm-0{margin-bottom:0!important}.ml-sm-0{margin-left:0!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1{margin-top:.25rem!important}.mr-sm-1{margin-right:.25rem!important}.mb-sm-1{margin-bottom:.25rem!important}.ml-sm-1{margin-left:.25rem!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2{margin-top:.5rem!important}.mr-sm-2{margin-right:.5rem!important}.mb-sm-2{margin-bottom:.5rem!important}.ml-sm-2{margin-left:.5rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3{margin-top:1rem!important}.mr-sm-3{margin-right:1rem!important}.mb-sm-3{margin-bottom:1rem!important}.ml-sm-3{margin-left:1rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4{margin-top:1.5rem!important}.mr-sm-4{margin-right:1.5rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.ml-sm-4{margin-left:1.5rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5{margin-top:3rem!important}.mr-sm-5{margin-right:3rem!important}.mb-sm-5{margin-bottom:3rem!important}.ml-sm-5{margin-left:3rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0{padding-top:0!important}.pr-sm-0{padding-right:0!important}.pb-sm-0{padding-bottom:0!important}.pl-sm-0{padding-left:0!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1{padding-top:.25rem!important}.pr-sm-1{padding-right:.25rem!important}.pb-sm-1{padding-bottom:.25rem!important}.pl-sm-1{padding-left:.25rem!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2{padding-top:.5rem!important}.pr-sm-2{padding-right:.5rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pl-sm-2{padding-left:.5rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3{padding-top:1rem!important}.pr-sm-3{padding-right:1rem!important}.pb-sm-3{padding-bottom:1rem!important}.pl-sm-3{padding-left:1rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4{padding-top:1.5rem!important}.pr-sm-4{padding-right:1.5rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pl-sm-4{padding-left:1.5rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5{padding-top:3rem!important}.pr-sm-5{padding-right:3rem!important}.pb-sm-5{padding-bottom:3rem!important}.pl-sm-5{padding-left:3rem!important}.px-sm-5{padding-right:3rem!important;padding-left:3rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto{margin-top:auto!important}.mr-sm-auto{margin-right:auto!important}.mb-sm-auto{margin-bottom:auto!important}.ml-sm-auto{margin-left:auto!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0{margin-top:0!important}.mr-md-0{margin-right:0!important}.mb-md-0{margin-bottom:0!important}.ml-md-0{margin-left:0!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.m-md-1{margin:.25rem!important}.mt-md-1{margin-top:.25rem!important}.mr-md-1{margin-right:.25rem!important}.mb-md-1{margin-bottom:.25rem!important}.ml-md-1{margin-left:.25rem!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2{margin-top:.5rem!important}.mr-md-2{margin-right:.5rem!important}.mb-md-2{margin-bottom:.5rem!important}.ml-md-2{margin-left:.5rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3{margin-top:1rem!important}.mr-md-3{margin-right:1rem!important}.mb-md-3{margin-bottom:1rem!important}.ml-md-3{margin-left:1rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4{margin-top:1.5rem!important}.mr-md-4{margin-right:1.5rem!important}.mb-md-4{margin-bottom:1.5rem!important}.ml-md-4{margin-left:1.5rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5{margin-top:3rem!important}.mr-md-5{margin-right:3rem!important}.mb-md-5{margin-bottom:3rem!important}.ml-md-5{margin-left:3rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.p-md-0{padding:0!important}.pt-md-0{padding-top:0!important}.pr-md-0{padding-right:0!important}.pb-md-0{padding-bottom:0!important}.pl-md-0{padding-left:0!important}.px-md-0{padding-right:0!important;padding-left:0!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.p-md-1{padding:.25rem!important}.pt-md-1{padding-top:.25rem!important}.pr-md-1{padding-right:.25rem!important}.pb-md-1{padding-bottom:.25rem!important}.pl-md-1{padding-left:.25rem!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2{padding-top:.5rem!important}.pr-md-2{padding-right:.5rem!important}.pb-md-2{padding-bottom:.5rem!important}.pl-md-2{padding-left:.5rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3{padding-top:1rem!important}.pr-md-3{padding-right:1rem!important}.pb-md-3{padding-bottom:1rem!important}.pl-md-3{padding-left:1rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4{padding-top:1.5rem!important}.pr-md-4{padding-right:1.5rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pl-md-4{padding-left:1.5rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5{padding-top:3rem!important}.pr-md-5{padding-right:3rem!important}.pb-md-5{padding-bottom:3rem!important}.pl-md-5{padding-left:3rem!important}.px-md-5{padding-right:3rem!important;padding-left:3rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto{margin-top:auto!important}.mr-md-auto{margin-right:auto!important}.mb-md-auto{margin-bottom:auto!important}.ml-md-auto{margin-left:auto!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0{margin-top:0!important}.mr-lg-0{margin-right:0!important}.mb-lg-0{margin-bottom:0!important}.ml-lg-0{margin-left:0!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1{margin-top:.25rem!important}.mr-lg-1{margin-right:.25rem!important}.mb-lg-1{margin-bottom:.25rem!important}.ml-lg-1{margin-left:.25rem!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2{margin-top:.5rem!important}.mr-lg-2{margin-right:.5rem!important}.mb-lg-2{margin-bottom:.5rem!important}.ml-lg-2{margin-left:.5rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3{margin-top:1rem!important}.mr-lg-3{margin-right:1rem!important}.mb-lg-3{margin-bottom:1rem!important}.ml-lg-3{margin-left:1rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4{margin-top:1.5rem!important}.mr-lg-4{margin-right:1.5rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.ml-lg-4{margin-left:1.5rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5{margin-top:3rem!important}.mr-lg-5{margin-right:3rem!important}.mb-lg-5{margin-bottom:3rem!important}.ml-lg-5{margin-left:3rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0{padding-top:0!important}.pr-lg-0{padding-right:0!important}.pb-lg-0{padding-bottom:0!important}.pl-lg-0{padding-left:0!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1{padding-top:.25rem!important}.pr-lg-1{padding-right:.25rem!important}.pb-lg-1{padding-bottom:.25rem!important}.pl-lg-1{padding-left:.25rem!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2{padding-top:.5rem!important}.pr-lg-2{padding-right:.5rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pl-lg-2{padding-left:.5rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3{padding-top:1rem!important}.pr-lg-3{padding-right:1rem!important}.pb-lg-3{padding-bottom:1rem!important}.pl-lg-3{padding-left:1rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4{padding-top:1.5rem!important}.pr-lg-4{padding-right:1.5rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pl-lg-4{padding-left:1.5rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5{padding-top:3rem!important}.pr-lg-5{padding-right:3rem!important}.pb-lg-5{padding-bottom:3rem!important}.pl-lg-5{padding-left:3rem!important}.px-lg-5{padding-right:3rem!important;padding-left:3rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto{margin-top:auto!important}.mr-lg-auto{margin-right:auto!important}.mb-lg-auto{margin-bottom:auto!important}.ml-lg-auto{margin-left:auto!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0{margin-top:0!important}.mr-xl-0{margin-right:0!important}.mb-xl-0{margin-bottom:0!important}.ml-xl-0{margin-left:0!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1{margin-top:.25rem!important}.mr-xl-1{margin-right:.25rem!important}.mb-xl-1{margin-bottom:.25rem!important}.ml-xl-1{margin-left:.25rem!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2{margin-top:.5rem!important}.mr-xl-2{margin-right:.5rem!important}.mb-xl-2{margin-bottom:.5rem!important}.ml-xl-2{margin-left:.5rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3{margin-top:1rem!important}.mr-xl-3{margin-right:1rem!important}.mb-xl-3{margin-bottom:1rem!important}.ml-xl-3{margin-left:1rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4{margin-top:1.5rem!important}.mr-xl-4{margin-right:1.5rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.ml-xl-4{margin-left:1.5rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5{margin-top:3rem!important}.mr-xl-5{margin-right:3rem!important}.mb-xl-5{margin-bottom:3rem!important}.ml-xl-5{margin-left:3rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0{padding-top:0!important}.pr-xl-0{padding-right:0!important}.pb-xl-0{padding-bottom:0!important}.pl-xl-0{padding-left:0!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1{padding-top:.25rem!important}.pr-xl-1{padding-right:.25rem!important}.pb-xl-1{padding-bottom:.25rem!important}.pl-xl-1{padding-left:.25rem!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2{padding-top:.5rem!important}.pr-xl-2{padding-right:.5rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pl-xl-2{padding-left:.5rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3{padding-top:1rem!important}.pr-xl-3{padding-right:1rem!important}.pb-xl-3{padding-bottom:1rem!important}.pl-xl-3{padding-left:1rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4{padding-top:1.5rem!important}.pr-xl-4{padding-right:1.5rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pl-xl-4{padding-left:1.5rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5{padding-top:3rem!important}.pr-xl-5{padding-right:3rem!important}.pb-xl-5{padding-bottom:3rem!important}.pl-xl-5{padding-left:3rem!important}.px-xl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto{margin-top:auto!important}.mr-xl-auto{margin-right:auto!important}.mb-xl-auto{margin-bottom:auto!important}.ml-xl-auto{margin-left:auto!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}}.text-justify{text-align:justify!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-normal{font-weight:400}.font-weight-bold{font-weight:700}.font-italic{font-style:italic}.text-white{color:#fff!important}.text-muted{color:#636c72!important}a.text-muted:focus,a.text-muted:hover{color:#4b5257!important}.text-primary{color:#0275d8!important}a.text-primary:focus,a.text-primary:hover{color:#025aa5!important}.text-success{color:#5cb85c!important}a.text-success:focus,a.text-success:hover{color:#449d44!important}.text-info{color:#5bc0de!important}a.text-info:focus,a.text-info:hover{color:#31b0d5!important}.text-warning{color:#f0ad4e!important}a.text-warning:focus,a.text-warning:hover{color:#ec971f!important}.text-danger{color:#d9534f!important}a.text-danger:focus,a.text-danger:hover{color:#c9302c!important}.text-gray-dark{color:#292b2c!important}a.text-gray-dark:focus,a.text-gray-dark:hover{color:#101112!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.visible{visibility:visible!important}.invisible{visibility:hidden!important}/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file
diff --git a/library/bootstrap/css/bootstrap.min.css.map b/library/bootstrap/css/bootstrap.min.css.map
index 6c7fa40b9..de864dddd 100644
--- a/library/bootstrap/css/bootstrap.min.css.map
+++ b/library/bootstrap/css/bootstrap.min.css.map
@@ -1 +1 @@
-{"version":3,"sources":["less/normalize.less","less/print.less","bootstrap.css","dist/css/bootstrap.css","less/glyphicons.less","less/scaffolding.less","less/mixins/vendor-prefixes.less","less/mixins/tab-focus.less","less/mixins/image.less","less/type.less","less/mixins/text-emphasis.less","less/mixins/background-variant.less","less/mixins/text-overflow.less","less/code.less","less/grid.less","less/mixins/grid.less","less/mixins/grid-framework.less","less/tables.less","less/mixins/table-row.less","less/forms.less","less/mixins/forms.less","less/buttons.less","less/mixins/buttons.less","less/mixins/opacity.less","less/component-animations.less","less/dropdowns.less","less/mixins/nav-divider.less","less/mixins/reset-filter.less","less/button-groups.less","less/mixins/border-radius.less","less/input-groups.less","less/navs.less","less/navbar.less","less/mixins/nav-vertical-align.less","less/utilities.less","less/breadcrumbs.less","less/pagination.less","less/mixins/pagination.less","less/pager.less","less/labels.less","less/mixins/labels.less","less/badges.less","less/jumbotron.less","less/thumbnails.less","less/alerts.less","less/mixins/alerts.less","less/progress-bars.less","less/mixins/gradients.less","less/mixins/progress-bar.less","less/media.less","less/list-group.less","less/mixins/list-group.less","less/panels.less","less/mixins/panels.less","less/responsive-embed.less","less/wells.less","less/close.less","less/modals.less","less/tooltip.less","less/mixins/reset-text.less","less/popovers.less","less/carousel.less","less/mixins/clearfix.less","less/mixins/center-block.less","less/mixins/hide-text.less","less/responsive-utilities.less","less/mixins/responsive-visibility.less"],"names":[],"mappings":";;;;4EAQA,KACE,YAAA,WACA,yBAAA,KACA,qBAAA,KAOF,KACE,OAAA,EAaF,QAAA,MAAA,QAAA,WAAA,OAAA,OAAA,OAAA,OAAA,KAAA,KAAA,IAAA,QAAA,QAaE,QAAA,MAQF,MAAA,OAAA,SAAA,MAIE,QAAA,aACA,eAAA,SAQF,sBACE,QAAA,KACA,OAAA,EAQF,SAAA,SAEE,QAAA,KAUF,EACE,iBAAA,YAQF,SAAA,QAEE,QAAA,EAUF,YACE,cAAA,IAAA,OAOF,EAAA,OAEE,YAAA,IAOF,IACE,WAAA,OAQF,GACE,OAAA,MAAA,EACA,UAAA,IAOF,KACE,MAAA,KACA,WAAA,KAOF,MACE,UAAA,IAOF,IAAA,IAEE,SAAA,SACA,UAAA,IACA,YAAA,EACA,eAAA,SAGF,IACE,IAAA,MAGF,IACE,OAAA,OAUF,IACE,OAAA,EAOF,eACE,SAAA,OAUF,OACE,OAAA,IAAA,KAOF,GACE,OAAA,EAAA,mBAAA,YAAA,gBAAA,YACA,WAAA,YAOF,IACE,SAAA,KAOF,KAAA,IAAA,IAAA,KAIE,YAAA,UAAA,UACA,UAAA,IAkBF,OAAA,MAAA,SAAA,OAAA,SAKE,OAAA,EACA,KAAA,QACA,MAAA,QAOF,OACE,SAAA,QAUF,OAAA,OAEE,eAAA,KAWF,OAAA,wBAAA,kBAAA,mBAIE,mBAAA,OACA,OAAA,QAOF,iBAAA,qBAEE,OAAA,QAOF,yBAAA,wBAEE,QAAA,EACA,OAAA,EAQF,MACE,YAAA,OAWF,qBAAA,kBAEE,mBAAA,WAAA,gBAAA,WAAA,WAAA,WACA,QAAA,EASF,8CAAA,8CAEE,OAAA,KAQF,mBACE,mBAAA,YACA,gBAAA,YAAA,WAAA,YAAA,mBAAA,UASF,iDAAA,8CAEE,mBAAA,KAOF,SACE,QAAA,MAAA,OAAA,MACA,OAAA,EAAA,IACA,OAAA,IAAA,MAAA,OAQF,OACE,QAAA,EACA,OAAA,EAOF,SACE,SAAA,KAQF,SACE,YAAA,IAUF,MACE,eAAA,EACA,gBAAA,SAGF,GAAA,GAEE,QAAA,uFCjUF,aA7FI,EAAA,OAAA,QAGI,MAAA,eACA,YAAA,eACA,WAAA,cAAA,mBAAA,eACA,WAAA,eAGJ,EAAA,UAEI,gBAAA,UAGJ,cACI,QAAA,KAAA,WAAA,IAGJ,kBACI,QAAA,KAAA,YAAA,IAKJ,6BAAA,mBAEI,QAAA,GAGJ,WAAA,IAEI,OAAA,IAAA,MAAA,KC4KL,kBAAA,MDvKK,MC0KL,QAAA,mBDrKK,IE8KN,GDLC,kBAAA,MDrKK,ICwKL,UAAA,eCUD,GF5KM,GE2KN,EF1KM,QAAA,ECuKL,OAAA,ECSD,GF3KM,GCsKL,iBAAA,MD/JK,QCkKL,QAAA,KCSD,YFtKU,oBCiKT,iBAAA,eD7JK,OCgKL,OAAA,IAAA,MAAA,KD5JK,OC+JL,gBAAA,mBCSD,UFpKU,UC+JT,iBAAA,eDzJS,mBEkKV,mBDLC,OAAA,IAAA,MAAA,gBEjPD,WACA,YAAA,uBFsPD,IAAA,+CE7OC,IAAK,sDAAuD,4BAA6B,iDAAkD,gBAAiB,gDAAiD,eAAgB,+CAAgD,mBAAoB,2EAA4E,cAE7W,WACA,SAAA,SACA,IAAA,IACA,QAAA,aACA,YAAA,uBACA,WAAA,OACA,YAAA,IACA,YAAA,EAIkC,uBAAA,YAAW,wBAAA,UACX,2BAAW,QAAA,QAEX,uBDuPlC,QAAS,QCtPyB,sBFiPnC,uBEjP8C,QAAA,QACX,wBAAW,QAAA,QACX,wBAAW,QAAA,QACX,2BAAW,QAAA,QACX,yBAAW,QAAA,QACX,wBAAW,QAAA,QACX,wBAAW,QAAA,QACX,yBAAW,QAAA,QACX,wBAAW,QAAA,QACX,uBAAW,QAAA,QACX,6BAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,2BAAW,QAAA,QACX,qBAAW,QAAA,QACX,0BAAW,QAAA,QACX,qBAAW,QAAA,QACX,yBAAW,QAAA,QACX,0BAAW,QAAA,QACX,2BAAW,QAAA,QACX,sBAAW,QAAA,QACX,yBAAW,QAAA,QACX,sBAAW,QAAA,QACX,wBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,+BAAW,QAAA,QACX,2BAAW,QAAA,QACX,yBAAW,QAAA,QACX,wBAAW,QAAA,QACX,8BAAW,QAAA,QACX,yBAAW,QAAA,QACX,0BAAW,QAAA,QACX,2BAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,6BAAW,QAAA,QACX,6BAAW,QAAA,QACX,8BAAW,QAAA,QACX,4BAAW,QAAA,QACX,yBAAW,QAAA,QACX,0BAAW,QAAA,QACX,sBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,2BAAW,QAAA,QACX,wBAAW,QAAA,QACX,yBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,yBAAW,QAAA,QACX,8BAAW,QAAA,QACX,6BAAW,QAAA,QACX,6BAAW,QAAA,QACX,+BAAW,QAAA,QACX,8BAAW,QAAA,QACX,gCAAW,QAAA,QACX,uBAAW,QAAA,QACX,8BAAW,QAAA,QACX,+BAAW,QAAA,QACX,iCAAW,QAAA,QACX,0BAAW,QAAA,QACX,6BAAW,QAAA,QACX,yBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,wBAAW,QAAA,QACX,wBAAW,QAAA,QACX,uBAAW,QAAA,QACX,gCAAW,QAAA,QACX,gCAAW,QAAA,QACX,2BAAW,QAAA,QACX,uBAAW,QAAA,QACX,wBAAW,QAAA,QACX,uBAAW,QAAA,QACX,0BAAW,QAAA,QACX,+BAAW,QAAA,QACX,+BAAW,QAAA,QACX,wBAAW,QAAA,QACX,+BAAW,QAAA,QACX,gCAAW,QAAA,QACX,4BAAW,QAAA,QACX,6BAAW,QAAA,QACX,8BAAW,QAAA,QACX,0BAAW,QAAA,QACX,gCAAW,QAAA,QACX,4BAAW,QAAA,QACX,6BAAW,QAAA,QACX,gCAAW,QAAA,QACX,4BAAW,QAAA,QACX,6BAAW,QAAA,QACX,6BAAW,QAAA,QACX,8BAAW,QAAA,QACX,2BAAW,QAAA,QACX,6BAAW,QAAA,QACX,4BAAW,QAAA,QACX,8BAAW,QAAA,QACX,+BAAW,QAAA,QACX,mCAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,2BAAW,QAAA,QACX,4BAAW,QAAA,QACX,+BAAW,QAAA,QACX,wBAAW,QAAA,QACX,2BAAW,QAAA,QACX,yBAAW,QAAA,QACX,0BAAW,QAAA,QACX,yBAAW,QAAA,QACX,6BAAW,QAAA,QACX,+BAAW,QAAA,QACX,0BAAW,QAAA,QACX,gCAAW,QAAA,QACX,+BAAW,QAAA,QACX,8BAAW,QAAA,QACX,kCAAW,QAAA,QACX,oCAAW,QAAA,QACX,sBAAW,QAAA,QACX,2BAAW,QAAA,QACX,uBAAW,QAAA,QACX,8BAAW,QAAA,QACX,4BAAW,QAAA,QACX,8BAAW,QAAA,QACX,6BAAW,QAAA,QACX,4BAAW,QAAA,QACX,0BAAW,QAAA,QACX,4BAAW,QAAA,QACX,qCAAW,QAAA,QACX,oCAAW,QAAA,QACX,kCAAW,QAAA,QACX,oCAAW,QAAA,QACX,wBAAW,QAAA,QACX,yBAAW,QAAA,QACX,wBAAW,QAAA,QACX,yBAAW,QAAA,QACX,4BAAW,QAAA,QACX,6BAAW,QAAA,QACX,4BAAW,QAAA,QACX,4BAAW,QAAA,QACX,8BAAW,QAAA,QACX,uBAAW,QAAA,QACX,wBAAW,QAAA,QACX,0BAAW,QAAA,QACX,sBAAW,QAAA,QACX,sBAAW,QAAA,QACX,uBAAW,QAAA,QACX,mCAAW,QAAA,QACX,uCAAW,QAAA,QACX,gCAAW,QAAA,QACX,oCAAW,QAAA,QACX,qCAAW,QAAA,QACX,yCAAW,QAAA,QACX,4BAAW,QAAA,QACX,yBAAW,QAAA,QACX,gCAAW,QAAA,QACX,8BAAW,QAAA,QACX,yBAAW,QAAA,QACX,wBAAW,QAAA,QACX,0BAAW,QAAA,QACX,6BAAW,QAAA,QACX,yBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,wBAAW,QAAA,QACX,yBAAW,QAAA,QACX,yBAAW,QAAA,QACX,uBAAW,QAAA,QACX,8BAAW,QAAA,QACX,+BAAW,QAAA,QACX,gCAAW,QAAA,QACX,8BAAW,QAAA,QACX,8BAAW,QAAA,QACX,8BAAW,QAAA,QACX,2BAAW,QAAA,QACX,0BAAW,QAAA,QACX,yBAAW,QAAA,QACX,6BAAW,QAAA,QACX,2BAAW,QAAA,QACX,4BAAW,QAAA,QACX,wBAAW,QAAA,QACX,wBAAW,QAAA,QACX,2BAAW,QAAA,QACX,2BAAW,QAAA,QACX,4BAAW,QAAA,QACX,+BAAW,QAAA,QACX,8BAAW,QAAA,QACX,4BAAW,QAAA,QACX,4BAAW,QAAA,QACX,4BAAW,QAAA,QACX,iCAAW,QAAA,QACX,oCAAW,QAAA,QACX,iCAAW,QAAA,QACX,+BAAW,QAAA,QACX,+BAAW,QAAA,QACX,iCAAW,QAAA,QACX,qBAAW,QAAA,QACX,4BAAW,QAAA,QACX,4BAAW,QAAA,QACX,2BAAW,QAAA,QACX,uBAAW,QAAA,QASX,wBAAW,QAAA,QACX,wBAAW,QAAA,QACX,4BAAW,QAAA,QACX,uBAAW,QAAA,QACX,wBAAW,QAAA,QACX,uBAAW,QAAA,QACX,yBAAW,QAAA,QACX,yBAAW,QAAA,QACX,+BAAW,QAAA,QACX,uBAAW,QAAA,QACX,6BAAW,QAAA,QACX,sBAAW,QAAA,QACX,wBAAW,QAAA,QACX,wBAAW,QAAA,QACX,4BAAW,QAAA,QACX,uBAAW,QAAA,QACX,4BAAW,QAAA,QACX,6BAAW,QAAA,QACX,2BAAW,QAAA,QACX,0BAAW,QAAA,QACX,sBAAW,QAAA,QACX,sBAAW,QAAA,QACX,sBAAW,QAAA,QACX,sBAAW,QAAA,QACX,wBAAW,QAAA,QACX,sBAAW,QAAA,QACX,wBAAW,QAAA,QACX,4BAAW,QAAA,QACX,mCAAW,QAAA,QACX,4BAAW,QAAA,QACX,oCAAW,QAAA,QACX,kCAAW,QAAA,QACX,iCAAW,QAAA,QACX,+BAAW,QAAA,QACX,sBAAW,QAAA,QACX,wBAAW,QAAA,QACX,6BAAW,QAAA,QACX,4BAAW,QAAA,QACX,6BAAW,QAAA,QACX,kCAAW,QAAA,QACX,mCAAW,QAAA,QACX,sCAAW,QAAA,QACX,0CAAW,QAAA,QACX,oCAAW,QAAA,QACX,wCAAW,QAAA,QACX,qCAAW,QAAA,QACX,iCAAW,QAAA,QACX,gCAAW,QAAA,QACX,kCAAW,QAAA,QACX,+BAAW,QAAA,QACX,0BAAW,QAAA,QACX,8BAAW,QAAA,QACX,4BAAW,QAAA,QACX,4BAAW,QAAA,QACX,6BAAW,QAAA,QACX,4BAAW,QAAA,QCtS/C,0BCgEE,QAAA,QHi+BF,EDNC,mBAAA,WGxhCI,gBAAiB,WFiiCZ,WAAY,WGl+BZ,OADL,QJg+BJ,mBAAA,WGthCI,gBAAiB,WACpB,WAAA,WHyhCD,KGrhCC,UAAW,KAEX,4BAAA,cAEA,KACA,YAAA,iBAAA,UAAA,MAAA,WHuhCD,UAAA,KGnhCC,YAAa,WF4hCb,MAAO,KACP,iBAAkB,KExhClB,OADA,MAEA,OHqhCD,SG/gCC,YAAa,QACb,UAAA,QACA,YAAA,QAEA,EFwhCA,MAAO,QEthCL,gBAAA,KAIF,QH8gCD,QKjkCC,MAAA,QACA,gBAAA,UF6DF,QACE,QAAA,IAAA,KAAA,yBHygCD,eAAA,KGlgCC,OHqgCD,OAAA,ECSD,IACE,eAAgB,ODDjB,4BM/kCC,0BLklCF,gBKnlCE,iBADA,eH4EA,QAAS,MACT,UAAA,KHugCD,OAAA,KGhgCC,aACA,cAAA,IAEA,eACA,QAAA,aC6FA,UAAA,KACK,OAAA,KACG,QAAA,IEvLR,YAAA,WACA,iBAAA,KACA,OAAA,IAAA,MAAA,KN+lCD,cAAA,IGjgCC,mBAAoB,IAAI,IAAI,YAC5B,cAAA,IAAA,IAAA,YHmgCD,WAAA,IAAA,IAAA,YG5/BC,YACA,cAAA,IAEA,GH+/BD,WAAA,KGv/BC,cAAe,KACf,OAAA,EACA,WAAA,IAAA,MAAA,KAEA,SACA,SAAA,SACA,MAAA,IACA,OAAA,IACA,QAAA,EHy/BD,OAAA,KGj/BC,SAAA,OF0/BA,KAAM,cEx/BJ,OAAA,EAEA,0BACA,yBACA,SAAA,OACA,MAAA,KHm/BH,OAAA,KGx+BC,OAAQ,EACR,SAAA,QH0+BD,KAAA,KCSD,cACE,OAAQ,QAQV,IACA,IMlpCE,IACA,IACA,IACA,INwoCF,GACA,GACA,GACA,GACA,GACA,GDAC,YAAA,QOlpCC,YAAa,IN2pCb,YAAa,IACb,MAAO,QAoBT,WAZA,UAaA,WAZA,UM5pCI,WN6pCJ,UM5pCI,WN6pCJ,UM5pCI,WN6pCJ,UDMC,WCLD,UACA,UAZA,SAaA,UAZA,SAaA,UAZA,SAaA,UAZA,SAaA,UAZA,SAaA,UAZA,SMppCE,YAAa,INwqCb,YAAa,EACb,MAAO,KAGT,IMxqCE,IAJF,IN2qCA,GAEA,GDLC,GCSC,WAAY,KACZ,cAAe,KASjB,WANA,UDCC,WCCD,UM5qCA,WN8qCA,UACA,UANA,SM5qCI,UN8qCJ,SM3qCA,UN6qCA,SAQE,UAAW,IAGb,IMprCE,IAJF,INurCA,GAEA,GDLC,GCSC,WAAY,KACZ,cAAe,KASjB,WANA,UDCC,WCCD,UMvrCA,WNyrCA,UACA,UANA,SMxrCI,UN0rCJ,SMtrCA,UNwrCA,SMxrCU,UAAA,IACV,IAAA,GAAU,UAAA,KACV,IAAA,GAAU,UAAA,KACV,IAAA,GAAU,UAAA,KACV,IAAA,GAAU,UAAA,KACV,IAAA,GAAU,UAAA,KAOR,IADF,GPssCC,UAAA,KCSD,EMzsCE,OAAA,EAAA,EAAA,KAEA,MPosCD,cAAA,KO/rCC,UAAW,KAwOX,YAAa,IA1OX,YAAA,IPssCH,yBO7rCC,MNssCE,UAAW,MMjsCf,OAAA,MAEE,UAAA,IAKF,MP0rCC,KO1rCsB,QAAA,KP6rCtB,iBAAA,QO5rCsB,WP+rCtB,WAAA,KO9rCsB,YPisCtB,WAAA,MOhsCsB,aPmsCtB,WAAA,OOlsCsB,cPqsCtB,WAAA,QOlsCsB,aPqsCtB,YAAA,OOpsCsB,gBPusCtB,eAAA,UOtsCsB,gBPysCtB,eAAA,UOrsCC,iBPwsCD,eAAA,WQ3yCC,YR8yCD,MAAA,KCSD,cOpzCI,MAAA,QAHF,qBDwGF,qBP6sCC,MAAA,QCSD,cO3zCI,MAAA,QAHF,qBD2GF,qBPitCC,MAAA,QCSD,WOl0CI,MAAA,QAHF,kBD8GF,kBPqtCC,MAAA,QCSD,cOz0CI,MAAA,QAHF,qBDiHF,qBPytCC,MAAA,QCSD,aOh1CI,MAAA,QDwHF,oBAHF,oBExHE,MAAA,QACA,YR01CA,MAAO,KQx1CL,iBAAA,QAHF,mBF8HF,mBP2tCC,iBAAA,QCSD,YQ/1CI,iBAAA,QAHF,mBFiIF,mBP+tCC,iBAAA,QCSD,SQt2CI,iBAAA,QAHF,gBFoIF,gBPmuCC,iBAAA,QCSD,YQ72CI,iBAAA,QAHF,mBFuIF,mBPuuCC,iBAAA,QCSD,WQp3CI,iBAAA,QF6IF,kBADF,kBAEE,iBAAA,QPsuCD,aO7tCC,eAAgB,INsuChB,OAAQ,KAAK,EAAE,KMpuCf,cAAA,IAAA,MAAA,KAFF,GPkuCC,GCSC,WAAY,EACZ,cAAe,KM9tCf,MP0tCD,MO3tCD,MAPI,MASF,cAAA,EAIF,eALE,aAAA,EACA,WAAA,KPkuCD,aO9tCC,aAAc,EAKZ,YAAA,KACA,WAAA,KP6tCH,gBOvtCC,QAAS,aACT,cAAA,IACA,aAAA,IAEF,GNguCE,WAAY,EM9tCZ,cAAA,KAGA,GADF,GP0tCC,YAAA,WOttCC,GPytCD,YAAA,IOnnCD,GAvFM,YAAA,EAEA,yBACA,kBGtNJ,MAAA,KACA,MAAA,MACA,SAAA,OVq6CC,MAAA,KO7nCC,WAAY,MAhFV,cAAA,SPgtCH,YAAA,OOtsCD,kBNgtCE,YAAa,OM1sCjB,0BPssCC,YOrsCC,OAAA,KA9IqB,cAAA,IAAA,OAAA,KAmJvB,YACE,UAAA,IACA,eAAA,UAEA,WPssCD,QAAA,KAAA,KOjsCG,OAAA,EAAA,EAAA,KN0sCF,UAAW,OACX,YAAa,IAAI,MAAM,KMptCzB,yBP+sCC,wBO/sCD,yBNytCE,cAAe,EMnsCb,kBAFA,kBACA,iBPksCH,QAAA,MO/rCG,UAAA,INwsCF,YAAa,WACb,MAAO,KMhsCT,yBP2rCC,yBO3rCD,wBAEE,QAAA,cAEA,oBACA,sBACA,cAAA,KP6rCD,aAAA,EOvrCG,WAAA,MNgsCF,aAAc,IAAI,MAAM,KACxB,YAAa,EMhsCX,kCNksCJ,kCMnsCe,iCACX,oCNmsCJ,oCDLC,mCCUC,QAAS,GMjsCX,iCNmsCA,iCMzsCM,gCAOJ,mCNmsCF,mCDLC,kCO7rCC,QAAA,cPksCD,QWv+CC,cAAe,KVg/Cf,WAAY,OACZ,YAAa,WU7+Cb,KXy+CD,IWr+CD,IACE,KACA,YAAA,MAAA,OAAA,SAAA,cAAA,UAEA,KACA,QAAA,IAAA,IXu+CD,UAAA,IWn+CC,MAAO,QACP,iBAAA,QACA,cAAA,IAEA,IACA,QAAA,IAAA,IACA,UAAA,IV4+CA,MU5+CA,KXq+CD,iBAAA,KW3+CC,cAAe,IASb,mBAAA,MAAA,EAAA,KAAA,EAAA,gBACA,WAAA,MAAA,EAAA,KAAA,EAAA,gBAEA,QV6+CF,QU7+CE,EXq+CH,UAAA,KWh+CC,YAAa,IACb,mBAAA,KACA,WAAA,KAEA,IACA,QAAA,MACA,QAAA,MACA,OAAA,EAAA,EAAA,KACA,UAAA,KACA,YAAA,WACA,MAAA,KACA,WAAA,UXk+CD,UAAA,WW7+CC,iBAAkB,QAehB,OAAA,IAAA,MAAA,KACA,cAAA,IAEA,SACA,QAAA,EACA,UAAA,QXi+CH,MAAA,QW59CC,YAAa,SACb,iBAAA,YACA,cAAA,EC1DF,gBCHE,WAAA,MACA,WAAA,OAEA,Wb8hDD,cAAA,KYxhDC,aAAA,KAqEA,aAAc,KAvEZ,YAAA,KZ+hDH,yBY1hDC,WAkEE,MAAO,OZ69CV,yBY5hDC,WA+DE,MAAO,OZk+CV,0BYzhDC,WCvBA,MAAA,QAGA,iBbmjDD,cAAA,KYthDC,aAAc,KCvBd,aAAA,KACA,YAAA,KCAE,KACE,aAAA,MAEA,YAAA,MAGA,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UdgjDL,SAAA,SchiDG,WAAA,IACE,cAAA,KdkiDL,aAAA,Kc1hDG,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,Ud6hDH,MAAA,Kc7hDG,WdgiDH,MAAA,KchiDG,WdmiDH,MAAA,acniDG,WdsiDH,MAAA,actiDG,UdyiDH,MAAA,IcziDG,Ud4iDH,MAAA,ac5iDG,Ud+iDH,MAAA,ac/iDG,UdkjDH,MAAA,IcljDG,UdqjDH,MAAA,acrjDG,UdwjDH,MAAA,acxjDG,Ud2jDH,MAAA,Ic3jDG,Ud8jDH,MAAA,ac/iDG,UdkjDH,MAAA,YcljDG,gBdqjDH,MAAA,KcrjDG,gBdwjDH,MAAA,acxjDG,gBd2jDH,MAAA,ac3jDG,ed8jDH,MAAA,Ic9jDG,edikDH,MAAA,acjkDG,edokDH,MAAA,acpkDG,edukDH,MAAA,IcvkDG,ed0kDH,MAAA,ac1kDG,ed6kDH,MAAA,ac7kDG,edglDH,MAAA,IchlDG,edmlDH,MAAA,ac9kDG,edilDH,MAAA,YchmDG,edmmDH,MAAA,KcnmDG,gBdsmDH,KAAA,KctmDG,gBdymDH,KAAA,aczmDG,gBd4mDH,KAAA,ac5mDG,ed+mDH,KAAA,Ic/mDG,edknDH,KAAA,aclnDG,edqnDH,KAAA,acrnDG,edwnDH,KAAA,IcxnDG,ed2nDH,KAAA,ac3nDG,ed8nDH,KAAA,ac9nDG,edioDH,KAAA,IcjoDG,edooDH,KAAA,ac/nDG,edkoDH,KAAA,YcnnDG,edsnDH,KAAA,KctnDG,kBdynDH,YAAA,KcznDG,kBd4nDH,YAAA,ac5nDG,kBd+nDH,YAAA,ac/nDG,iBdkoDH,YAAA,IcloDG,iBdqoDH,YAAA,acroDG,iBdwoDH,YAAA,acxoDG,iBd2oDH,YAAA,Ic3oDG,iBd8oDH,YAAA,ac9oDG,iBdipDH,YAAA,acjpDG,iBdopDH,YAAA,IcppDG,iBdupDH,YAAA,acvpDG,iBd0pDH,YAAA,Yc5rDG,iBACE,YAAA,EAOJ,yBACE,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,Ud0rDD,MAAA,Kc1rDC,Wd6rDD,MAAA,Kc7rDC,WdgsDD,MAAA,achsDC,WdmsDD,MAAA,acnsDC,UdssDD,MAAA,IctsDC,UdysDD,MAAA,aczsDC,Ud4sDD,MAAA,ac5sDC,Ud+sDD,MAAA,Ic/sDC,UdktDD,MAAA,acltDC,UdqtDD,MAAA,acrtDC,UdwtDD,MAAA,IcxtDC,Ud2tDD,MAAA,ac5sDC,Ud+sDD,MAAA,Yc/sDC,gBdktDD,MAAA,KcltDC,gBdqtDD,MAAA,acrtDC,gBdwtDD,MAAA,acxtDC,ed2tDD,MAAA,Ic3tDC,ed8tDD,MAAA,ac9tDC,ediuDD,MAAA,acjuDC,edouDD,MAAA,IcpuDC,eduuDD,MAAA,acvuDC,ed0uDD,MAAA,ac1uDC,ed6uDD,MAAA,Ic7uDC,edgvDD,MAAA,ac3uDC,ed8uDD,MAAA,Yc7vDC,edgwDD,MAAA,KchwDC,gBdmwDD,KAAA,KcnwDC,gBdswDD,KAAA,actwDC,gBdywDD,KAAA,aczwDC,ed4wDD,KAAA,Ic5wDC,ed+wDD,KAAA,ac/wDC,edkxDD,KAAA,aclxDC,edqxDD,KAAA,IcrxDC,edwxDD,KAAA,acxxDC,ed2xDD,KAAA,ac3xDC,ed8xDD,KAAA,Ic9xDC,ediyDD,KAAA,ac5xDC,ed+xDD,KAAA,YchxDC,edmxDD,KAAA,KcnxDC,kBdsxDD,YAAA,KctxDC,kBdyxDD,YAAA,aczxDC,kBd4xDD,YAAA,ac5xDC,iBd+xDD,YAAA,Ic/xDC,iBdkyDD,YAAA,aclyDC,iBdqyDD,YAAA,acryDC,iBdwyDD,YAAA,IcxyDC,iBd2yDD,YAAA,ac3yDC,iBd8yDD,YAAA,ac9yDC,iBdizDD,YAAA,IcjzDC,iBdozDD,YAAA,acpzDC,iBduzDD,YAAA,YY9yDD,iBE3CE,YAAA,GAQF,yBACE,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,Udw1DD,MAAA,Kcx1DC,Wd21DD,MAAA,Kc31DC,Wd81DD,MAAA,ac91DC,Wdi2DD,MAAA,acj2DC,Udo2DD,MAAA,Icp2DC,Udu2DD,MAAA,acv2DC,Ud02DD,MAAA,ac12DC,Ud62DD,MAAA,Ic72DC,Udg3DD,MAAA,ach3DC,Udm3DD,MAAA,acn3DC,Uds3DD,MAAA,Ict3DC,Udy3DD,MAAA,ac12DC,Ud62DD,MAAA,Yc72DC,gBdg3DD,MAAA,Kch3DC,gBdm3DD,MAAA,acn3DC,gBds3DD,MAAA,act3DC,edy3DD,MAAA,Icz3DC,ed43DD,MAAA,ac53DC,ed+3DD,MAAA,ac/3DC,edk4DD,MAAA,Icl4DC,edq4DD,MAAA,acr4DC,edw4DD,MAAA,acx4DC,ed24DD,MAAA,Ic34DC,ed84DD,MAAA,acz4DC,ed44DD,MAAA,Yc35DC,ed85DD,MAAA,Kc95DC,gBdi6DD,KAAA,Kcj6DC,gBdo6DD,KAAA,acp6DC,gBdu6DD,KAAA,acv6DC,ed06DD,KAAA,Ic16DC,ed66DD,KAAA,ac76DC,edg7DD,KAAA,ach7DC,edm7DD,KAAA,Icn7DC,eds7DD,KAAA,act7DC,edy7DD,KAAA,acz7DC,ed47DD,KAAA,Ic57DC,ed+7DD,KAAA,ac17DC,ed67DD,KAAA,Yc96DC,edi7DD,KAAA,Kcj7DC,kBdo7DD,YAAA,Kcp7DC,kBdu7DD,YAAA,acv7DC,kBd07DD,YAAA,ac17DC,iBd67DD,YAAA,Ic77DC,iBdg8DD,YAAA,ach8DC,iBdm8DD,YAAA,acn8DC,iBds8DD,YAAA,Ict8DC,iBdy8DD,YAAA,acz8DC,iBd48DD,YAAA,ac58DC,iBd+8DD,YAAA,Ic/8DC,iBdk9DD,YAAA,acl9DC,iBdq9DD,YAAA,YYz8DD,iBE9CE,YAAA,GAQF,0BACE,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,Uds/DD,MAAA,Kct/DC,Wdy/DD,MAAA,Kcz/DC,Wd4/DD,MAAA,ac5/DC,Wd+/DD,MAAA,ac//DC,UdkgED,MAAA,IclgEC,UdqgED,MAAA,acrgEC,UdwgED,MAAA,acxgEC,Ud2gED,MAAA,Ic3gEC,Ud8gED,MAAA,ac9gEC,UdihED,MAAA,acjhEC,UdohED,MAAA,IcphEC,UduhED,MAAA,acxgEC,Ud2gED,MAAA,Yc3gEC,gBd8gED,MAAA,Kc9gEC,gBdihED,MAAA,acjhEC,gBdohED,MAAA,acphEC,eduhED,MAAA,IcvhEC,ed0hED,MAAA,ac1hEC,ed6hED,MAAA,ac7hEC,edgiED,MAAA,IchiEC,edmiED,MAAA,acniEC,edsiED,MAAA,actiEC,edyiED,MAAA,IcziEC,ed4iED,MAAA,acviEC,ed0iED,MAAA,YczjEC,ed4jED,MAAA,Kc5jEC,gBd+jED,KAAA,Kc/jEC,gBdkkED,KAAA,aclkEC,gBdqkED,KAAA,acrkEC,edwkED,KAAA,IcxkEC,ed2kED,KAAA,ac3kEC,ed8kED,KAAA,ac9kEC,edilED,KAAA,IcjlEC,edolED,KAAA,acplEC,edulED,KAAA,acvlEC,ed0lED,KAAA,Ic1lEC,ed6lED,KAAA,acxlEC,ed2lED,KAAA,Yc5kEC,ed+kED,KAAA,Kc/kEC,kBdklED,YAAA,KcllEC,kBdqlED,YAAA,acrlEC,kBdwlED,YAAA,acxlEC,iBd2lED,YAAA,Ic3lEC,iBd8lED,YAAA,ac9lEC,iBdimED,YAAA,acjmEC,iBdomED,YAAA,IcpmEC,iBdumED,YAAA,acvmEC,iBd0mED,YAAA,ac1mEC,iBd6mED,YAAA,Ic7mEC,iBdgnED,YAAA,achnEC,iBdmnED,YAAA,YetrED,iBACA,YAAA,GAGA,MACA,iBAAA,YAEA,QfyrED,YAAA,IevrEC,eAAgB,IAChB,MAAA,KfyrED,WAAA,KelrEC,GACA,WAAA,KfsrED,OexrEC,MAAO,KdmsEP,UAAW,KACX,cAAe,KcvrET,mBd0rER,mBczrEQ,mBAHA,mBACA,mBd0rER,mBDHC,QAAA,IensEC,YAAa,WAoBX,eAAA,IACA,WAAA,IAAA,MAAA,KArBJ,mBdktEE,eAAgB,OAChB,cAAe,IAAI,MAAM,KDJ1B,uCCMD,uCcrtEA,wCdstEA,wCclrEI,2CANI,2CforEP,WAAA,EezqEG,mBf4qEH,WAAA,IAAA,MAAA,KCWD,cACE,iBAAkB,Kc/pEpB,6BdkqEA,6BcjqEE,6BAZM,6BfsqEP,6BCMD,6BDHC,QAAA,ICWD,gBACE,OAAQ,IAAI,MAAM,Kc1qEpB,4Bd6qEA,4Bc7qEA,4BAQQ,4Bf8pEP,4BCMD,4Bc7pEM,OAAA,IAAA,MAAA,KAYF,4BAFJ,4BfopEC,oBAAA,IevoEG,yCf0oEH,iBAAA,QehoEC,4BACA,iBAAA,QfooED,uBe9nEG,SAAA,OdyoEF,QAAS,acxoEL,MAAA,KAEA,sBfioEL,sBgB7wEC,SAAA,OfwxEA,QAAS,WACT,MAAO,KAST,0BerxEE,0Bf+wEF,0BAGA,0BexxEM,0BAMJ,0BfgxEF,0BAGA,0BACA,0BDNC,0BCAD,0BAGA,0BASE,iBAAkB,QDLnB,sCgBlyEC,sCAAA,oCfyyEF,sCetxEM,sCf2xEJ,iBAAkB,QASpB,2Be1yEE,2BfoyEF,2BAGA,2Be7yEM,2BAMJ,2BfqyEF,2BAGA,2BACA,2BDNC,2BCAD,2BAGA,2BASE,iBAAkB,QDLnB,uCgBvzEC,uCAAA,qCf8zEF,uCe3yEM,uCfgzEJ,iBAAkB,QASpB,wBe/zEE,wBfyzEF,wBAGA,wBel0EM,wBAMJ,wBf0zEF,wBAGA,wBACA,wBDNC,wBCAD,wBAGA,wBASE,iBAAkB,QDLnB,oCgB50EC,oCAAA,kCfm1EF,oCeh0EM,oCfq0EJ,iBAAkB,QASpB,2Bep1EE,2Bf80EF,2BAGA,2Bev1EM,2BAMJ,2Bf+0EF,2BAGA,2BACA,2BDNC,2BCAD,2BAGA,2BASE,iBAAkB,QDLnB,uCgBj2EC,uCAAA,qCfw2EF,uCer1EM,uCf01EJ,iBAAkB,QASpB,0Bez2EE,0Bfm2EF,0BAGA,0Be52EM,0BAMJ,0Bfo2EF,0BAGA,0BACA,0BDNC,0BCAD,0BAGA,0BASE,iBAAkB,QDLnB,sCehtEC,sCADF,oCdwtEA,sCe12EM,sCDoJJ,iBAAA,QA6DF,kBACE,WAAY,KA3DV,WAAA,KAEA,oCACA,kBACA,MAAA,KfotED,cAAA,Ke7pEC,WAAY,OAnDV,mBAAA,yBfmtEH,OAAA,IAAA,MAAA,KCWD,yBACE,cAAe,Ec5qEjB,qCd+qEA,qCcjtEI,qCARM,qCfktET,qCCMD,qCDHC,YAAA,OCWD,kCACE,OAAQ,EcvrEV,0Dd0rEA,0Dc1rEA,0DAzBU,0Df4sET,0DCMD,0DAME,YAAa,Ec/rEf,yDdksEA,yDclsEA,yDArBU,yDfgtET,yDCMD,yDAME,aAAc,EDLjB,yDe1sEW,yDEzNV,yDjBk6EC,yDiBj6ED,cAAA,GAMA,SjBk6ED,UAAA,EiB/5EC,QAAS,EACT,OAAA,EACA,OAAA,EAEA,OACA,QAAA,MACA,MAAA,KACA,QAAA,EACA,cAAA,KACA,UAAA,KjBi6ED,YAAA,QiB95EC,MAAO,KACP,OAAA,EACA,cAAA,IAAA,MAAA,QAEA,MjBg6ED,QAAA,aiBr5EC,UAAW,Kb4BX,cAAA,IACG,YAAA,IJ63EJ,mBiBr5EC,mBAAoB,WhBg6EjB,gBAAiB,WgB95EpB,WAAA,WjBy5ED,qBiBv5EC,kBAGA,OAAQ,IAAI,EAAE,EACd,WAAA,MjBs5ED,YAAA,OiBj5EC,iBACA,QAAA,MAIF,kBhB25EE,QAAS,MgBz5ET,MAAA,KAIF,iBAAA,ahB05EE,OAAQ,KI99ER,uBY2EF,2BjB64EC,wBiB54EC,QAAA,IAAA,KAAA,yBACA,eAAA,KAEA,OACA,QAAA,MjB+4ED,YAAA,IiBr3EC,UAAW,KACX,YAAA,WACA,MAAA,KAEA,cACA,QAAA,MACA,MAAA,KACA,OAAA,KACA,QAAA,IAAA,KACA,UAAA,KACA,YAAA,WACA,MAAA,KbxDA,iBAAA,KACQ,iBAAA,KAyHR,OAAA,IAAA,MAAA,KACK,cAAA,IACG,mBAAA,MAAA,EAAA,IAAA,IAAA,iBJwzET,WAAA,MAAA,EAAA,IAAA,IAAA,iBkBh8EC,mBAAA,aAAA,YAAA,KAAA,mBAAA,YAAA,KACE,cAAA,aAAA,YAAA,KAAA,WAAA,YAAA,KACA,WAAA,aAAA,YAAA,KAAA,WAAA,YAAA,KdWM,oBJy7ET,aAAA,QIx5EC,QAAA,EACE,mBAAA,MAAA,EAAA,IAAA,IAAA,iBAAA,EAAA,EAAA,IAAA,qBACA,WAAA,MAAA,EAAA,IAAA,IAAA,iBAAA,EAAA,EAAA,IAAA,qBAEF,gCAA0B,MAAA,KJ25E3B,QAAA,EI15EiC,oCJ65EjC,MAAA,KiBh4EG,yCACA,MAAA,KAQF,0BhBs4EA,iBAAkB,YAClB,OAAQ,EgBn4EN,wBjB63EH,wBiB13EC,iChBq4EA,iBAAkB,KgBn4EhB,QAAA,EAIF,wBACE,iCjB03EH,OAAA,YiB72EC,sBjBg3ED,OAAA,KiB91EG,mBhB02EF,mBAAoB,KAEtB,qDgB32EM,8BjBo2EH,8BiBj2EC,wCAAA,+BhB62EA,YAAa,KgB32EX,iCjBy2EH,iCiBt2EC,2CAAA,kChB02EF,0BACA,0BACA,oCACA,2BAKE,YAAa,KgBh3EX,iCjB82EH,iCACF,2CiBp2EC,kChBu2EA,0BACA,0BACA,oCACA,2BgBz2EA,YAAA,MhBi3EF,YgBv2EE,cAAA,KAGA,UADA,OjBi2ED,SAAA,SiBr2EC,QAAS,MhBg3ET,WAAY,KgBx2EV,cAAA,KAGA,gBADA,aAEA,WAAA,KjBi2EH,aAAA,KiB91EC,cAAe,EhBy2Ef,YAAa,IACb,OAAQ,QgBp2ER,+BjBg2ED,sCiBl2EC,yBACA,gCAIA,SAAU,ShBw2EV,WAAY,MgBt2EZ,YAAA,MAIF,oBAAA,cAEE,WAAA,KAGA,iBADA,cAEA,SAAA,SACA,QAAA,aACA,aAAA,KjB61ED,cAAA,EiB31EC,YAAa,IhBs2Eb,eAAgB,OgBp2EhB,OAAA,QAUA,kCjBo1ED,4BCWC,WAAY,EACZ,YAAa,KgBv1Eb,wCAAA,qCjBm1ED,8BCOD,+BgBh2EI,2BhB+1EJ,4BAME,OAAQ,YDNT,0BiBv1EG,uBAMF,oCAAA,iChB61EA,OAAQ,YDNT,yBiBp1EK,sBAaJ,mCAFF,gCAGE,OAAA,YAGA,qBjBy0ED,WAAA,KiBv0EC,YAAA,IhBk1EA,eAAgB,IgBh1Ed,cAAA,EjB00EH,8BiB5zED,8BCnQE,cAAA,EACA,aAAA,EAEA,UACA,OAAA,KlBkkFD,QAAA,IAAA,KkBhkFC,UAAA,KACE,YAAA,IACA,cAAA,IAGF,gBjB0kFA,OAAQ,KiBxkFN,YAAA,KD2PA,0BAFJ,kBAGI,OAAA,KAEA,6BACA,OAAA,KjBy0EH,QAAA,IAAA,KiB/0EC,UAAW,KAST,YAAA,IACA,cAAA,IAVJ,mChB81EE,OAAQ,KgBh1EN,YAAA,KAGA,6CAjBJ,qCAkBI,OAAA,KAEA,oCACA,OAAA,KjBy0EH,WAAA,KiBr0EC,QAAS,IAAI,KC/Rb,UAAA,KACA,YAAA,IAEA,UACA,OAAA,KlBumFD,QAAA,KAAA,KkBrmFC,UAAA,KACE,YAAA,UACA,cAAA,IAGF,gBjB+mFA,OAAQ,KiB7mFN,YAAA,KDuRA,0BAFJ,kBAGI,OAAA,KAEA,6BACA,OAAA,KjBk1EH,QAAA,KAAA,KiBx1EC,UAAW,KAST,YAAA,UACA,cAAA,IAVJ,mChBu2EE,OAAQ,KgBz1EN,YAAA,KAGA,6CAjBJ,qCAkBI,OAAA,KAEA,oCACA,OAAA,KjBk1EH,WAAA,KiBz0EC,QAAS,KAAK,KAEd,UAAA,KjB00ED,YAAA,UiBt0EG,cjBy0EH,SAAA,SiBp0EC,4BACA,cAAA,OAEA,uBACA,SAAA,SACA,IAAA,EACA,MAAA,EACA,QAAA,EACA,QAAA,MACA,MAAA,KjBu0ED,OAAA,KiBr0EC,YAAa,KhBg1Eb,WAAY,OACZ,eAAgB,KDLjB,oDiBv0EC,uCADA,iCAGA,MAAO,KhBg1EP,OAAQ,KACR,YAAa,KDLd,oDiBv0EC,uCADA,iCAKA,MAAO,KhB80EP,OAAQ,KACR,YAAa,KAKf,uBAEA,8BAJA,4BADA,yBAEA,oBAEA,2BDNC,4BkBruFG,mCAJA,yBD0ZJ,gCbvWE,MAAA,QJ2rFD,2BkBxuFG,aAAA,QACE,mBAAA,MAAA,EAAA,IAAA,IAAA,iBd4CJ,WAAA,MAAA,EAAA,IAAA,IAAA,iBJgsFD,iCiBz1EC,aAAc,QC5YZ,mBAAA,MAAA,EAAA,IAAA,IAAA,iBAAA,EAAA,EAAA,IAAA,QACA,WAAA,MAAA,EAAA,IAAA,IAAA,iBAAA,EAAA,EAAA,IAAA,QlByuFH,gCiB91EC,MAAO,QCtYL,iBAAA,QlBuuFH,aAAA,QCWD,oCACE,MAAO,QAKT,uBAEA,8BAJA,4BADA,yBAEA,oBAEA,2BDNC,4BkBnwFG,mCAJA,yBD6ZJ,gCb1WE,MAAA,QJytFD,2BkBtwFG,aAAA,QACE,mBAAA,MAAA,EAAA,IAAA,IAAA,iBd4CJ,WAAA,MAAA,EAAA,IAAA,IAAA,iBJ8tFD,iCiBp3EC,aAAc,QC/YZ,mBAAA,MAAA,EAAA,IAAA,IAAA,iBAAA,EAAA,EAAA,IAAA,QACA,WAAA,MAAA,EAAA,IAAA,IAAA,iBAAA,EAAA,EAAA,IAAA,QlBuwFH,gCiBz3EC,MAAO,QCzYL,iBAAA,QlBqwFH,aAAA,QCWD,oCACE,MAAO,QAKT,qBAEA,4BAJA,0BADA,uBAEA,kBAEA,yBDNC,0BkBjyFG,iCAJA,uBDgaJ,8Bb7WE,MAAA,QJuvFD,yBkBpyFG,aAAA,QACE,mBAAA,MAAA,EAAA,IAAA,IAAA,iBd4CJ,WAAA,MAAA,EAAA,IAAA,IAAA,iBJ4vFD,+BiB/4EC,aAAc,QClZZ,mBAAA,MAAA,EAAA,IAAA,IAAA,iBAAA,EAAA,EAAA,IAAA,QACA,WAAA,MAAA,EAAA,IAAA,IAAA,iBAAA,EAAA,EAAA,IAAA,QlBqyFH,8BiBp5EC,MAAO,QC5YL,iBAAA,QlBmyFH,aAAA,QiB/4EG,kCjBk5EH,MAAA,QiB/4EG,2CjBk5EH,IAAA,KiBv4EC,mDACA,IAAA,EAEA,YjB04ED,QAAA,MiBvzEC,WAAY,IAwEZ,cAAe,KAtIX,MAAA,QAEA,yBjBy3EH,yBiBrvEC,QAAS,aA/HP,cAAA,EACA,eAAA,OjBw3EH,2BiB1vEC,QAAS,aAxHP,MAAA,KjBq3EH,eAAA,OiBj3EG,kCACA,QAAA,aAmHJ,0BhB4wEE,QAAS,aACT,eAAgB,OgBr3Ed,wCjB82EH,6CiBtwED,2CjBywEC,MAAA,KiB72EG,wCACA,MAAA,KAmGJ,4BhBwxEE,cAAe,EgBp3Eb,eAAA,OAGA,uBADA,oBjB82EH,QAAA,aiBpxEC,WAAY,EhB+xEZ,cAAe,EgBr3EX,eAAA,OAsFN,6BAAA,0BAjFI,aAAA,EAiFJ,4CjB6xEC,sCiBx2EG,SAAA,SjB22EH,YAAA,EiBh2ED,kDhB42EE,IAAK,GgBl2EL,2BjB+1EH,kCiBh2EG,wBAEA,+BAXF,YAAa,IhBo3Eb,WAAY,EgBn2EV,cAAA,EJviBF,2BIshBF,wBJrhBE,WAAA,KI4jBA,6BAyBA,aAAc,MAnCV,YAAA,MAEA,yBjBw1EH,gCACF,YAAA,IiBx3EG,cAAe,EAwCf,WAAA,OAwBJ,sDAdQ,MAAA,KjB80EL,yBACF,+CiBn0EC,YAAA,KAEE,UAAW,MjBs0EZ,yBACF,+CmBp6FG,YAAa,IACf,UAAA,MAGA,KACA,QAAA,aACA,QAAA,IAAA,KAAA,cAAA,EACA,UAAA,KACA,YAAA,IACA,YAAA,WACA,WAAA,OC0CA,YAAA,OACA,eAAA,OACA,iBAAA,aACA,aAAA,ahB+JA,OAAA,QACG,oBAAA,KACC,iBAAA,KACI,gBAAA,KJ+tFT,YAAA,KmBv6FG,iBAAA,KlBm7FF,OAAQ,IAAI,MAAM,YAClB,cAAe,IkB96Ff,kBdzBA,kBACA,WLk8FD,kBCOD,kBADA,WAME,QAAS,IAAI,KAAK,yBAClB,eAAgB,KkBh7FhB,WnBy6FD,WmB56FG,WlBw7FF,MAAO,KkBn7FL,gBAAA,Kf6BM,YADR,YJk5FD,iBAAA,KmBz6FC,QAAA,ElBq7FA,mBAAoB,MAAM,EAAE,IAAI,IAAI,iBAC5B,WAAY,MAAM,EAAE,IAAI,IAAI,iBoBh+FpC,cAGA,ejB8DA,wBACQ,OAAA,YJ05FT,OAAA,kBmBz6FG,mBAAA,KlBq7FM,WAAY,KkBn7FhB,QAAA,IASN,eC3DE,yBACA,eAAA,KpBi+FD,aoB99FC,MAAA,KnB0+FA,iBAAkB,KmBx+FhB,aAAA,KpBk+FH,mBoBh+FO,mBAEN,MAAA,KACE,iBAAA,QACA,aAAA,QpBi+FH,mBoB99FC,MAAA,KnB0+FA,iBAAkB,QAClB,aAAc,QmBt+FR,oBADJ,oBpBi+FH,mCoB99FG,MAAA,KnB0+FF,iBAAkB,QAClB,aAAc,QmBt+FN,0BnB4+FV,0BAHA,0BmB1+FM,0BnB4+FN,0BAHA,0BDFC,yCoBx+FK,yCnB4+FN,yCmBv+FE,MAAA,KnB++FA,iBAAkB,QAClB,aAAc,QmBx+FZ,oBpBg+FH,oBoBh+FG,mCnB6+FF,iBAAkB,KmBz+FV,4BnB8+FV,4BAHA,4BDHC,6BCOD,6BAHA,6BkB39FA,sCClBM,sCnB8+FN,sCmBx+FI,iBAAA,KACA,aAAA,KDcJ,oBC9DE,MAAA,KACA,iBAAA,KpB0hGD,aoBvhGC,MAAA,KnBmiGA,iBAAkB,QmBjiGhB,aAAA,QpB2hGH,mBoBzhGO,mBAEN,MAAA,KACE,iBAAA,QACA,aAAA,QpB0hGH,mBoBvhGC,MAAA,KnBmiGA,iBAAkB,QAClB,aAAc,QmB/hGR,oBADJ,oBpB0hGH,mCoBvhGG,MAAA,KnBmiGF,iBAAkB,QAClB,aAAc,QmB/hGN,0BnBqiGV,0BAHA,0BmBniGM,0BnBqiGN,0BAHA,0BDFC,yCoBjiGK,yCnBqiGN,yCmBhiGE,MAAA,KnBwiGA,iBAAkB,QAClB,aAAc,QmBjiGZ,oBpByhGH,oBoBzhGG,mCnBsiGF,iBAAkB,KmBliGV,4BnBuiGV,4BAHA,4BDHC,6BCOD,6BAHA,6BkBjhGA,sCCrBM,sCnBuiGN,sCmBjiGI,iBAAA,QACA,aAAA,QDkBJ,oBClEE,MAAA,QACA,iBAAA,KpBmlGD,aoBhlGC,MAAA,KnB4lGA,iBAAkB,QmB1lGhB,aAAA,QpBolGH,mBoBllGO,mBAEN,MAAA,KACE,iBAAA,QACA,aAAA,QpBmlGH,mBoBhlGC,MAAA,KnB4lGA,iBAAkB,QAClB,aAAc,QmBxlGR,oBADJ,oBpBmlGH,mCoBhlGG,MAAA,KnB4lGF,iBAAkB,QAClB,aAAc,QmBxlGN,0BnB8lGV,0BAHA,0BmB5lGM,0BnB8lGN,0BAHA,0BDFC,yCoB1lGK,yCnB8lGN,yCmBzlGE,MAAA,KnBimGA,iBAAkB,QAClB,aAAc,QmB1lGZ,oBpBklGH,oBoBllGG,mCnB+lGF,iBAAkB,KmB3lGV,4BnBgmGV,4BAHA,4BDHC,6BCOD,6BAHA,6BkBtkGA,sCCzBM,sCnBgmGN,sCmB1lGI,iBAAA,QACA,aAAA,QDsBJ,oBCtEE,MAAA,QACA,iBAAA,KpB4oGD,UoBzoGC,MAAA,KnBqpGA,iBAAkB,QmBnpGhB,aAAA,QpB6oGH,gBoB3oGO,gBAEN,MAAA,KACE,iBAAA,QACA,aAAA,QpB4oGH,gBoBzoGC,MAAA,KnBqpGA,iBAAkB,QAClB,aAAc,QmBjpGR,iBADJ,iBpB4oGH,gCoBzoGG,MAAA,KnBqpGF,iBAAkB,QAClB,aAAc,QmBjpGN,uBnBupGV,uBAHA,uBmBrpGM,uBnBupGN,uBAHA,uBDFC,sCoBnpGK,sCnBupGN,sCmBlpGE,MAAA,KnB0pGA,iBAAkB,QAClB,aAAc,QmBnpGZ,iBpB2oGH,iBoB3oGG,gCnBwpGF,iBAAkB,KmBppGV,yBnBypGV,yBAHA,yBDHC,0BCOD,0BAHA,0BkB3nGA,mCC7BM,mCnBypGN,mCmBnpGI,iBAAA,QACA,aAAA,QD0BJ,iBC1EE,MAAA,QACA,iBAAA,KpBqsGD,aoBlsGC,MAAA,KnB8sGA,iBAAkB,QmB5sGhB,aAAA,QpBssGH,mBoBpsGO,mBAEN,MAAA,KACE,iBAAA,QACA,aAAA,QpBqsGH,mBoBlsGC,MAAA,KnB8sGA,iBAAkB,QAClB,aAAc,QmB1sGR,oBADJ,oBpBqsGH,mCoBlsGG,MAAA,KnB8sGF,iBAAkB,QAClB,aAAc,QmB1sGN,0BnBgtGV,0BAHA,0BmB9sGM,0BnBgtGN,0BAHA,0BDFC,yCoB5sGK,yCnBgtGN,yCmB3sGE,MAAA,KnBmtGA,iBAAkB,QAClB,aAAc,QmB5sGZ,oBpBosGH,oBoBpsGG,mCnBitGF,iBAAkB,KmB7sGV,4BnBktGV,4BAHA,4BDHC,6BCOD,6BAHA,6BkBhrGA,sCCjCM,sCnBktGN,sCmB5sGI,iBAAA,QACA,aAAA,QD8BJ,oBC9EE,MAAA,QACA,iBAAA,KpB8vGD,YoB3vGC,MAAA,KnBuwGA,iBAAkB,QmBrwGhB,aAAA,QpB+vGH,kBoB7vGO,kBAEN,MAAA,KACE,iBAAA,QACA,aAAA,QpB8vGH,kBoB3vGC,MAAA,KnBuwGA,iBAAkB,QAClB,aAAc,QmBnwGR,mBADJ,mBpB8vGH,kCoB3vGG,MAAA,KnBuwGF,iBAAkB,QAClB,aAAc,QmBnwGN,yBnBywGV,yBAHA,yBmBvwGM,yBnBywGN,yBAHA,yBDFC,wCoBrwGK,wCnBywGN,wCmBpwGE,MAAA,KnB4wGA,iBAAkB,QAClB,aAAc,QmBrwGZ,mBpB6vGH,mBoB7vGG,kCnB0wGF,iBAAkB,KmBtwGV,2BnB2wGV,2BAHA,2BDHC,4BCOD,4BAHA,4BkBruGA,qCCrCM,qCnB2wGN,qCmBrwGI,iBAAA,QACA,aAAA,QDuCJ,mBACE,MAAA,QACA,iBAAA,KnB+tGD,UmB5tGC,YAAA,IlBwuGA,MAAO,QACP,cAAe,EAEjB,UGzwGE,iBemCE,iBflCM,oBJkwGT,6BmB7tGC,iBAAA,YlByuGA,mBAAoB,KACZ,WAAY,KkBtuGlB,UAEF,iBAAA,gBnB6tGD,gBmB3tGG,aAAA,YnBiuGH,gBmB/tGG,gBAIA,MAAA,QlBuuGF,gBAAiB,UACjB,iBAAkB,YDNnB,0BmBhuGK,0BAUN,mCATM,mClB2uGJ,MAAO,KmB1yGP,gBAAA,KAGA,mBADA,QpBmyGD,QAAA,KAAA,KmBztGC,UAAW,KlBquGX,YAAa,UmBjzGb,cAAA,IAGA,mBADA,QpB0yGD,QAAA,IAAA,KmB5tGC,UAAW,KlBwuGX,YAAa,ImBxzGb,cAAA,IAGA,mBADA,QpBizGD,QAAA,IAAA,ImB3tGC,UAAW,KACX,YAAA,IACA,cAAA,IAIF,WACE,QAAA,MnB2tGD,MAAA,KCYD,sBACE,WAAY,IqBz3GZ,6BADF,4BtBk3GC,6BI7rGC,MAAA,KAEQ,MJisGT,QAAA,EsBr3GC,mBAAA,QAAA,KAAA,OACE,cAAA,QAAA,KAAA,OtBu3GH,WAAA,QAAA,KAAA,OsBl3GC,StBq3GD,QAAA,EsBn3Ga,UtBs3Gb,QAAA,KsBr3Ga,atBw3Gb,QAAA,MsBv3Ga,etB03Gb,QAAA,UsBt3GC,kBACA,QAAA,gBlBwKA,YACQ,SAAA,SAAA,OAAA,EAOR,SAAA,OACQ,mCAAA,KAAA,8BAAA,KAGR,2BAAA,KACQ,4BAAA,KAAA,uBAAA,KJ2sGT,oBAAA,KuBr5GC,4BAA6B,OAAQ,WACrC,uBAAA,OAAA,WACA,oBAAA,OAAA,WAEA,OACA,QAAA,aACA,MAAA,EACA,OAAA,EACA,YAAA,IACA,eAAA,OvBu5GD,WAAA,IAAA,OuBn5GC,WAAY,IAAI,QtBk6GhB,aAAc,IAAI,MAAM,YsBh6GxB,YAAA,IAAA,MAAA,YAKA,UADF,QvBo5GC,SAAA,SuB94GC,uBACA,QAAA,EAEA,eACA,SAAA,SACA,IAAA,KACA,KAAA,EACA,QAAA,KACA,QAAA,KACA,MAAA,KACA,UAAA,MACA,QAAA,IAAA,EACA,OAAA,IAAA,EAAA,EACA,UAAA,KACA,WAAA,KACA,WAAA,KnBsBA,iBAAA,KACQ,wBAAA,YmBrBR,gBAAA,YtB+5GA,OsB/5GA,IAAA,MAAA,KvBk5GD,OAAA,IAAA,MAAA,gBuB74GC,cAAA,IACE,mBAAA,EAAA,IAAA,KAAA,iBACA,WAAA,EAAA,IAAA,KAAA,iBAzBJ,0BCzBE,MAAA,EACA,KAAA,KAEA,wBxBo8GD,OAAA,IuB96GC,OAAQ,IAAI,EAmCV,SAAA,OACA,iBAAA,QAEA,oBACA,QAAA,MACA,QAAA,IAAA,KACA,MAAA,KvB84GH,YAAA,IuBx4GC,YAAA,WtBw5GA,MAAO,KsBt5GL,YAAA,OvB44GH,0BuB14GG,0BAMF,MAAA,QtBo5GA,gBAAiB,KACjB,iBAAkB,QsBj5GhB,yBAEA,+BADA,+BvBu4GH,MAAA,KuB73GC,gBAAA,KtB64GA,iBAAkB,QAClB,QAAS,EDZV,2BuB33GC,iCAAA,iCAEE,MAAA,KEzGF,iCF2GE,iCAEA,gBAAA,KvB63GH,OAAA,YuBx3GC,iBAAkB,YAGhB,iBAAA,KvBw3GH,OAAA,0DuBn3GG,qBvBs3GH,QAAA,MuB72GC,QACA,QAAA,EAQF,qBACE,MAAA,EACA,KAAA,KAIF,oBACE,MAAA,KACA,KAAA,EAEA,iBACA,QAAA,MACA,QAAA,IAAA,KvBw2GD,UAAA,KuBp2GC,YAAa,WACb,MAAA,KACA,YAAA,OAEA,mBACA,SAAA,MACA,IAAA,EvBs2GD,MAAA,EuBl2GC,OAAQ,EACR,KAAA,EACA,QAAA,IAQF,2BtB42GE,MAAO,EsBx2GL,KAAA,KAEA,eACA,sCvB41GH,QAAA,GuBn2GC,WAAY,EtBm3GZ,cAAe,IAAI,OsBx2GjB,cAAA,IAAA,QAEA,uBvB41GH,8CuBv0GC,IAAK,KAXL,OAAA,KApEA,cAAA,IvB25GC,yBuBv1GD,6BA1DA,MAAA,EACA,KAAA,KvBq5GD,kC0BpiHG,MAAO,KzBojHP,KAAM,GyBhjHR,W1BsiHD,oB0B1iHC,SAAU,SzB0jHV,QAAS,ayBpjHP,eAAA,OAGA,yB1BsiHH,gBCgBC,SAAU,SACV,MAAO,KyB7iHT,gC1BsiHC,gCCYD,+BAFA,+ByBhjHA,uBANM,uBzBujHN,sBAFA,sBAQE,QAAS,EyBljHP,qB1BuiHH,2B0BliHD,2BACE,iC1BoiHD,YAAA,KCgBD,aACE,YAAa,KDZd,kB0B1iHD,wBAAA,0BzB2jHE,MAAO,KDZR,kB0B/hHD,wBACE,0B1BiiHD,YAAA,I0B5hHC,yE1B+hHD,cAAA,E2BhlHC,4BACG,YAAA,EDsDL,mEzB6iHE,wBAAyB,E0B5lHzB,2BAAA,E3BilHD,6C0B5hHD,8CACE,uBAAA,E1B8hHD,0BAAA,E0B3hHC,sB1B8hHD,MAAA,KCgBD,8D0B/mHE,cAAA,E3BomHD,mE0B3hHD,oECjEE,wBAAA,EACG,2BAAA,EDqEL,oEzB0iHE,uBAAwB,EyBxiHxB,0BAAA,EAiBF,mCACE,iCACA,QAAA,EAEF,iCACE,cAAA,IACA,aAAA,IAKF,oCtB/CE,cAAA,KACQ,aAAA,KsBkDR,iCtBnDA,mBAAA,MAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,iBsByDV,0CACE,mBAAA,K1BugHD,WAAA,K0BngHC,YACA,YAAA,EAGF,eACE,aAAA,IAAA,IAAA,E1BqgHD,oBAAA,ECgBD,uBACE,aAAc,EAAE,IAAI,IyB1gHlB,yBACA,+BACA,oC1B+/GH,QAAA,M0BtgHC,MAAO,KAcH,MAAA,K1B2/GL,UAAA,KCgBD,oCACE,MAAO,KyBpgHL,8BACA,oC1By/GH,oC0Bp/GC,0CACE,WAAA,K1Bs/GH,YAAA,E2B/pHC,4DACC,cAAA,EAQA,sD3B4pHF,uBAAA,I0Bt/GC,wBAAA,IC/KA,2BAAA,EACC,0BAAA,EAQA,sD3BkqHF,uBAAA,E0Bv/GC,wBAAyB,EACzB,2BAAA,I1By/GD,0BAAA,ICgBD,uE0BtrHE,cAAA,E3B2qHD,4E0Bt/GD,6EC7LE,2BAAA,EACC,0BAAA,EDoMH,6EACE,uBAAA,EACA,wBAAA,EAEA,qB1Bo/GD,QAAA,M0Bx/GC,MAAO,KzBwgHP,aAAc,MyBjgHZ,gBAAA,SAEA,0B1Bq/GH,gC0B9/GC,QAAS,WAYP,MAAA,K1Bq/GH,MAAA,G0Bj/GG,qC1Bo/GH,MAAA,KCgBD,+CACE,KAAM,KyB7+GF,gDAFA,6C1Bs+GL,2D0Br+GK,wDEzOJ,SAAU,SACV,KAAA,cACA,eAAA,K5BitHD,a4B7sHC,SAAA,SACE,QAAA,MACA,gBAAA,S5BgtHH,0B4BxtHC,MAAO,KAeL,cAAA,EACA,aAAA,EAOA,2BACA,SAAA,S5BusHH,QAAA,E4BrsHG,MAAA,KACE,MAAA,K5BusHL,cAAA,ECgBD,iCACE,QAAS,EiBnrHT,8BACA,mCACA,sCACA,OAAA,KlBwqHD,QAAA,KAAA,KkBtqHC,UAAA,KjBsrHA,YAAa,UACb,cAAe,IiBrrHb,oClB0qHH,yCkBvqHC,4CjBurHA,OAAQ,KACR,YAAa,KDTd,8C4B/sHD,mDAAA,sD3B0tHA,sCACA,2CiBzrHI,8CjB8rHF,OAAQ,KiB1sHR,8BACA,mCACA,sCACA,OAAA,KlB+rHD,QAAA,IAAA,KkB7rHC,UAAA,KjB6sHA,YAAa,IACb,cAAe,IiB5sHb,oClBisHH,yCkB9rHC,4CjB8sHA,OAAQ,KACR,YAAa,KDTd,8C4B7tHD,mDAAA,sD3BwuHA,sCACA,2CiBhtHI,8CjBqtHF,OAAQ,K2BzuHR,2B5B6tHD,mB4B7tHC,iB3B8uHA,QAAS,W2BzuHX,8D5B6tHC,sD4B7tHD,oDAEE,cAAA,EAEA,mB5B+tHD,iB4B1tHC,MAAO,GACP,YAAA,OACA,eAAA,OAEA,mBACA,QAAA,IAAA,KACA,UAAA,KACA,YAAA,IACA,YAAA,EACA,MAAA,K5B4tHD,WAAA,O4BztHC,iBAAA,KACE,OAAA,IAAA,MAAA,KACA,cAAA,I5B4tHH,4B4BztHC,QAAA,IAAA,KACE,UAAA,KACA,cAAA,I5B4tHH,4B4B/uHC,QAAS,KAAK,K3B+vHd,UAAW,K2BruHT,cAAA,IAKJ,wCAAA,qC3BquHE,WAAY,EAEd,uCACA,+BACA,kC0B70HE,6CACG,8CC4GL,6D5BqtHC,wE4BptHC,wBAAA,E5ButHD,2BAAA,ECgBD,+BACE,aAAc,EAEhB,sCACA,8B2BhuHA,+D5BstHC,oDCWD,iC0Bl1HE,4CACG,6CCiHH,uBAAA,E5BwtHD,0BAAA,E4BltHC,8BAGA,YAAA,E5BotHD,iB4BxtHC,SAAU,SAUR,UAAA,E5BitHH,YAAA,O4B/sHK,sB5BktHL,SAAA,SCgBD,2BACE,YAAa,K2BxtHb,6BAAA,4B5B4sHD,4B4BzsHK,QAAA,EAGJ,kCAAA,wCAGI,aAAA,K5B4sHL,iC6B12HD,uCACE,QAAA,EACA,YAAA,K7B62HD,K6B/2HC,aAAc,EAOZ,cAAA,EACA,WAAA,KARJ,QAWM,SAAA,SACA,QAAA,M7B42HL,U6B12HK,SAAA,S5B03HJ,QAAS,M4Bx3HH,QAAA,KAAA,KAMJ,gB7Bu2HH,gB6Bt2HK,gBAAA,K7By2HL,iBAAA,KCgBD,mB4Br3HQ,MAAA,KAGA,yBADA,yB7B02HP,MAAA,K6Bl2HG,gBAAA,K5Bk3HF,OAAQ,YACR,iBAAkB,Y4B/2Hd,aAzCN,mB7B64HC,mBwBh5HC,iBAAA,KACA,aAAA,QAEA,kBxBm5HD,OAAA,I6Bn5HC,OAAQ,IAAI,EA0DV,SAAA,O7B41HH,iBAAA,Q6Bl1HC,c7Bq1HD,UAAA,K6Bn1HG,UAEA,cAAA,IAAA,MAAA,KALJ,aASM,MAAA,KACA,cAAA,KAEA,e7Bo1HL,aAAA,I6Bn1HK,YAAA,WACE,OAAA,IAAA,MAAA,Y7Bq1HP,cAAA,IAAA,IAAA,EAAA,ECgBD,qBACE,aAAc,KAAK,KAAK,K4B51HlB,sBAEA,4BADA,4BAEA,MAAA,K7Bi1HP,OAAA,Q6B50HC,iBAAA,KAqDA,OAAA,IAAA,MAAA,KA8BA,oBAAA,YAnFA,wBAwDE,MAAA,K7B2xHH,cAAA,E6BzxHK,2BACA,MAAA,KA3DJ,6BAgEE,cAAA,IACA,WAAA,OAYJ,iDA0DE,IAAK,KAjED,KAAA,K7B0xHH,yB6BztHD,2BA9DM,QAAA,W7B0xHL,MAAA,G6Bn2HD,6BAuFE,cAAA,GAvFF,6B5Bw3HA,aAAc,EACd,cAAe,IDZhB,kC6BtuHD,wCA3BA,wCATM,OAAA,IAAA,MAAA,K7B+wHH,yB6B3uHD,6B5B2vHE,cAAe,IAAI,MAAM,KACzB,cAAe,IAAI,IAAI,EAAE,EDZ1B,kC6B92HD,wC7B+2HD,wC6B72HG,oBAAA,MAIE,c7B+2HL,MAAA,K6B52HK,gB7B+2HL,cAAA,ICgBD,iBACE,YAAa,I4Bv3HP,uBAQR,6B7Bo2HC,6B6Bl2HG,MAAA,K7Bq2HH,iBAAA,Q6Bn2HK,gBACA,MAAA,KAYN,mBACE,WAAA,I7B41HD,YAAA,E6Bz1HG,e7B41HH,MAAA,K6B11HK,kBACA,MAAA,KAPN,oBAYI,cAAA,IACA,WAAA,OAYJ,wCA0DE,IAAK,KAjED,KAAA,K7B21HH,yB6B1xHD,kBA9DM,QAAA,W7B21HL,MAAA,G6Bl1HD,oBACA,cAAA,GAIE,oBACA,cAAA,EANJ,yB5B02HE,aAAc,EACd,cAAe,IDZhB,8B6B1yHD,oCA3BA,oCATM,OAAA,IAAA,MAAA,K7Bm1HH,yB6B/yHD,yB5B+zHE,cAAe,IAAI,MAAM,KACzB,cAAe,IAAI,IAAI,EAAE,EDZ1B,8B6Bx0HD,oC7By0HD,oC6Bv0HG,oBAAA,MAGA,uB7B00HH,QAAA,K6B/zHC,qBF3OA,QAAA,M3B+iID,yB8BxiIC,WAAY,KACZ,uBAAA,EACA,wBAAA,EAEA,Q9B0iID,SAAA,S8BliIC,WAAY,KA8nBZ,cAAe,KAhoBb,OAAA,IAAA,MAAA,Y9ByiIH,yB8BzhIC,QAgnBE,cAAe,K9B86GlB,yB8BjhIC,eACA,MAAA,MAGA,iBACA,cAAA,KAAA,aAAA,KAEA,WAAA,Q9BkhID,2BAAA,M8BhhIC,WAAA,IAAA,MAAA,YACE,mBAAA,MAAA,EAAA,IAAA,EAAA,qB9BkhIH,WAAA,MAAA,EAAA,IAAA,EAAA,qB8Bz7GD,oBArlBI,WAAA,KAEA,yBAAA,iB9BkhID,MAAA,K8BhhIC,WAAA,EACE,mBAAA,KACA,WAAA,KAEA,0B9BkhIH,QAAA,gB8B/gIC,OAAA,eACE,eAAA,E9BihIH,SAAA,kBCkBD,oBACE,WAAY,QDZf,sC8B/gIK,mC9B8gIH,oC8BzgIC,cAAe,E7B4hIf,aAAc,G6Bj+GlB,sCAnjBE,mC7ByhIA,WAAY,MDdX,4D8BngID,sC9BogID,mCCkBG,WAAY,O6B3gId,kCANE,gC9BsgIH,4B8BvgIG,0BAuiBF,aAAc,M7Bm/Gd,YAAa,MAEf,yBDZC,kC8B3gIK,gC9B0gIH,4B8B3gIG,0BAcF,aAAc,EAChB,YAAA,GAMF,mBA8gBE,QAAS,KAhhBP,aAAA,EAAA,EAAA,I9BkgIH,yB8B7/HC,mB7B+gIE,cAAe,G6B1gIjB,qBADA,kB9BggID,SAAA,M8Bz/HC,MAAO,EAggBP,KAAM,E7B4gHN,QAAS,KDdR,yB8B7/HD,qB9B8/HD,kB8B7/HC,cAAA,GAGF,kBACE,IAAA,EACA,aAAA,EAAA,EAAA,I9BigID,qB8B1/HC,OAAQ,EACR,cAAA,EACA,aAAA,IAAA,EAAA,EAEA,cACA,MAAA,K9B4/HD,OAAA,K8B1/HC,QAAA,KAAA,K7B4gIA,UAAW,K6B1gIT,YAAA,KAIA,oBAbJ,oB9BwgIC,gBAAA,K8Bv/HG,kB7B0gIF,QAAS,MDdR,yBACF,iC8Bh/HC,uCACA,YAAA,OAGA,eC9LA,SAAA,SACA,MAAA,MD+LA,QAAA,IAAA,KACA,WAAA,IACA,aAAA,KACA,cAAA,I9Bm/HD,iBAAA,Y8B/+HC,iBAAA,KACE,OAAA,IAAA,MAAA,Y9Bi/HH,cAAA,I8B5+HG,qBACA,QAAA,EAEA,yB9B++HH,QAAA,M8BrgIC,MAAO,KAyBL,OAAA,I9B++HH,cAAA,I8BpjHD,mCAvbI,WAAA,I9Bg/HH,yB8Bt+HC,eACA,QAAA,MAGE,YACA,OAAA,MAAA,M9By+HH,iB8B58HC,YAAA,KA2YA,eAAgB,KAjaZ,YAAA,KAEA,yBACA,iCACA,SAAA,OACA,MAAA,KACA,MAAA,KAAA,WAAA,E9Bs+HH,iBAAA,Y8B3kHC,OAAQ,E7B8lHR,mBAAoB,K6Bt/HhB,WAAA,KAGA,kDAqZN,sC9BklHC,QAAA,IAAA,KAAA,IAAA,KCmBD,sC6Bv/HQ,YAAA,KAmBR,4C9Bs9HD,4C8BvlHG,iBAAkB,M9B4lHnB,yB8B5lHD,YAtYI,MAAA,K9Bq+HH,OAAA,E8Bn+HK,eACA,MAAA,K9Bu+HP,iB8B39HG,YAAa,KACf,eAAA,MAGA,aACA,QAAA,KAAA,K1B9NA,WAAA,IACQ,aAAA,M2B/DR,cAAA,IACA,YAAA,M/B4vID,WAAA,IAAA,MAAA,YiBtuHC,cAAe,IAAI,MAAM,YAwEzB,mBAAoB,MAAM,EAAE,IAAI,EAAE,qBAAyB,EAAE,IAAI,EAAE,qBAtI/D,WAAA,MAAA,EAAA,IAAA,EAAA,qBAAA,EAAA,IAAA,EAAA,qBAEA,yBjBwyHH,yBiBpqHC,QAAS,aA/HP,cAAA,EACA,eAAA,OjBuyHH,2BiBzqHC,QAAS,aAxHP,MAAA,KjBoyHH,eAAA,OiBhyHG,kCACA,QAAA,aAmHJ,0BhBmsHE,QAAS,aACT,eAAgB,OgB5yHd,wCjB6xHH,6CiBrrHD,2CjBwrHC,MAAA,KiB5xHG,wCACA,MAAA,KAmGJ,4BhB+sHE,cAAe,EgB3yHb,eAAA,OAGA,uBADA,oBjB6xHH,QAAA,aiBnsHC,WAAY,EhBstHZ,cAAe,EgB5yHX,eAAA,OAsFN,6BAAA,0BAjFI,aAAA,EAiFJ,4CjB4sHC,sCiBvxHG,SAAA,SjB0xHH,YAAA,E8BngID,kDAmWE,IAAK,GAvWH,yBACE,yB9B8gIL,cAAA,I8B5/HD,oCAoVE,cAAe,GA1Vf,yBACA,aACA,MAAA,KACA,YAAA,E1BzPF,eAAA,EACQ,aAAA,EJmwIP,YAAA,EACF,OAAA,E8BngIG,mBAAoB,KACtB,WAAA,M9BugID,8B8BngIC,WAAY,EACZ,uBAAA,EHzUA,wBAAA,EAQA,mDACC,cAAA,E3By0IF,uBAAA,I8B//HC,wBAAyB,IChVzB,2BAAA,EACA,0BAAA,EDkVA,YCnVA,WAAA,IACA,cAAA,IDqVA,mBCtVA,WAAA,KACA,cAAA,KD+VF,mBChWE,WAAA,KACA,cAAA,KDuWF,aAsSE,WAAY,KA1SV,cAAA,KAEA,yB9B+/HD,aACF,MAAA,K8Bl+HG,aAAc,KAhBhB,YAAA,MACA,yBE5WA,aF8WE,MAAA,eAFF,cAKI,MAAA,gB9Bu/HH,aAAA,M8B7+HD,4BACA,aAAA,GADF,gBAKI,iBAAA,Q9Bg/HH,aAAA,QCmBD,8B6BhgIM,MAAA,KARN,oC9B0/HC,oC8B5+HG,MAAA,Q9B++HH,iBAAA,Y8B1+HK,6B9B6+HL,MAAA,KCmBD,iC6B5/HQ,MAAA,KAKF,uC9By+HL,uCCmBC,MAAO,KACP,iBAAkB,Y6Bz/HZ,sCAIF,4C9Bu+HL,4CCmBC,MAAO,KACP,iBAAkB,Q6Bv/HZ,wCAxCR,8C9BihIC,8C8Bn+HG,MAAA,K9Bs+HH,iBAAA,YCmBD,+B6Bt/HM,aAAA,KAGA,qCApDN,qC9B2hIC,iBAAA,KCmBD,yC6Bp/HI,iBAAA,KAOE,iCAAA,6B7Bk/HJ,aAAc,Q6B9+HR,oCAiCN,0C9B+7HD,0C8B3xHC,MAAO,KA7LC,iBAAA,QACA,yB7B8+HR,sD6B5+HU,MAAA,KAKF,4D9By9HP,4DCmBC,MAAO,KACP,iBAAkB,Y6Bz+HV,2DAIF,iE9Bu9HP,iECmBC,MAAO,KACP,iBAAkB,Q6Bv+HV,6D9B09HX,mEADE,mE8B1jIC,MAAO,KA8GP,iBAAA,aAEE,6B9Bi9HL,MAAA,K8B58HG,mC9B+8HH,MAAA,KCmBD,0B6B/9HM,MAAA,KAIA,gCAAA,gC7Bg+HJ,MAAO,K6Bt9HT,0CARQ,0CASN,mD9Bu8HD,mD8Bt8HC,MAAA,KAFF,gBAKI,iBAAA,K9B08HH,aAAA,QCmBD,8B6B19HM,MAAA,QARN,oC9Bo9HC,oC8Bt8HG,MAAA,K9By8HH,iBAAA,Y8Bp8HK,6B9Bu8HL,MAAA,QCmBD,iC6Bt9HQ,MAAA,QAKF,uC9Bm8HL,uCCmBC,MAAO,KACP,iBAAkB,Y6Bn9HZ,sCAIF,4C9Bi8HL,4CCmBC,MAAO,KACP,iBAAkB,Q6Bj9HZ,wCAxCR,8C9B2+HC,8C8B57HG,MAAA,K9B+7HH,iBAAA,YCmBD,+B6B/8HM,aAAA,KAGA,qCArDN,qC9Bq/HC,iBAAA,KCmBD,yC6B78HI,iBAAA,KAME,iCAAA,6B7B48HJ,aAAc,Q6Bx8HR,oCAuCN,0C9Bm5HD,0C8B33HC,MAAO,KAvDC,iBAAA,QAuDV,yBApDU,kE9Bs7HP,aAAA,Q8Bn7HO,0D9Bs7HP,iBAAA,QCmBD,sD6Bt8HU,MAAA,QAKF,4D9Bm7HP,4DCmBC,MAAO,KACP,iBAAkB,Y6Bn8HV,2DAIF,iE9Bi7HP,iECmBC,MAAO,KACP,iBAAkB,Q6Bj8HV,6D9Bo7HX,mEADE,mE8B1hIC,MAAO,KA+GP,iBAAA,aAEE,6B9Bg7HL,MAAA,Q8B36HG,mC9B86HH,MAAA,KCmBD,0B6B97HM,MAAA,QAIA,gCAAA,gC7B+7HJ,MAAO,KgCvkJT,0CH0oBQ,0CGzoBN,mDjCwjJD,mDiCvjJC,MAAA,KAEA,YACA,QAAA,IAAA,KjC2jJD,cAAA,KiChkJC,WAAY,KAQV,iBAAA,QjC2jJH,cAAA,IiCxjJK,eACA,QAAA,ajC4jJL,yBiCxkJC,QAAS,EAAE,IAkBT,MAAA,KjCyjJH,QAAA,SkC5kJC,oBACA,MAAA,KAEA,YlC+kJD,QAAA,akCnlJC,aAAc,EAOZ,OAAA,KAAA,ElC+kJH,cAAA,ICmBD,eiC/lJM,QAAA,OAEA,iBACA,oBACA,SAAA,SACA,MAAA,KACA,QAAA,IAAA,KACA,YAAA,KACA,YAAA,WlCglJL,MAAA,QkC9kJG,gBAAA,KjCimJF,iBAAkB,KiC9lJZ,OAAA,IAAA,MAAA,KPVH,6B3B2lJJ,gCkC7kJG,YAAA,EjCgmJF,uBAAwB,I0BvnJxB,0BAAA,I3BymJD,4BkCxkJG,+BjC2lJF,wBAAyB,IACzB,2BAA4B,IiCxlJxB,uBAFA,uBAGA,0BAFA,0BlC8kJL,QAAA,EkCtkJG,MAAA,QjCylJF,iBAAkB,KAClB,aAAc,KAEhB,sBiCvlJM,4BAFA,4BjC0lJN,yBiCvlJM,+BAFA,+BAGA,QAAA,ElC2kJL,MAAA,KkCloJC,OAAQ,QjCqpJR,iBAAkB,QAClB,aAAc,QiCnlJV,wBAEA,8BADA,8BjColJN,2BiCtlJM,iCjCulJN,iCDZC,MAAA,KkC/jJC,OAAQ,YjCklJR,iBAAkB,KkC7pJd,aAAA,KAEA,oBnC8oJL,uBmC5oJG,QAAA,KAAA,KlC+pJF,UAAW,K0B1pJX,YAAA,U3B4oJD,gCmC3oJG,mClC8pJF,uBAAwB,I0BvqJxB,0BAAA,I3BypJD,+BkC1kJD,kCjC6lJE,wBAAyB,IkC7qJrB,2BAAA,IAEA,oBnC8pJL,uBmC5pJG,QAAA,IAAA,KlC+qJF,UAAW,K0B1qJX,YAAA,I3B4pJD,gCmC3pJG,mClC8qJF,uBAAwB,I0BvrJxB,0BAAA,I3ByqJD,+BoC3qJD,kCACE,wBAAA,IACA,2BAAA,IAEA,OpC6qJD,aAAA,EoCjrJC,OAAQ,KAAK,EAOX,WAAA,OpC6qJH,WAAA,KCmBD,UmC7rJM,QAAA,OAEA,YACA,eACA,QAAA,apC8qJL,QAAA,IAAA,KoC5rJC,iBAAkB,KnC+sJlB,OAAQ,IAAI,MAAM,KmC5rJd,cAAA,KAnBN,kBpCisJC,kBCmBC,gBAAiB,KmCzrJb,iBAAA,KA3BN,eAAA,kBAkCM,MAAA,MAlCN,mBAAA,sBnC6tJE,MAAO,KmClrJH,mBAEA,yBADA,yBpCqqJL,sBqCltJC,MAAO,KACP,OAAA,YACA,iBAAA,KAEA,OACA,QAAA,OACA,QAAA,KAAA,KAAA,KACA,UAAA,IACA,YAAA,IACA,YAAA,EACA,MAAA,KrCotJD,WAAA,OqChtJG,YAAA,OpCmuJF,eAAgB,SoCjuJZ,cAAA,MrCotJL,cqCltJK,cAKJ,MAAA,KACE,gBAAA,KrC+sJH,OAAA,QqC1sJG,aACA,QAAA,KAOJ,YCtCE,SAAA,StC+uJD,IAAA,KCmBD,eqC7vJM,iBAAA,KALJ,2BD0CF,2BrC4sJC,iBAAA,QCmBD,eqCpwJM,iBAAA,QALJ,2BD8CF,2BrC+sJC,iBAAA,QCmBD,eqC3wJM,iBAAA,QALJ,2BDkDF,2BrCktJC,iBAAA,QCmBD,YqClxJM,iBAAA,QALJ,wBDsDF,wBrCqtJC,iBAAA,QCmBD,eqCzxJM,iBAAA,QALJ,2BD0DF,2BrCwtJC,iBAAA,QCmBD,cqChyJM,iBAAA,QCDJ,0BADF,0BAEE,iBAAA,QAEA,OACA,QAAA,aACA,UAAA,KACA,QAAA,IAAA,IACA,UAAA,KACA,YAAA,IACA,YAAA,EACA,MAAA,KACA,WAAA,OvCqxJD,YAAA,OuClxJC,eAAA,OACE,iBAAA,KvCoxJH,cAAA,KuC/wJG,aACA,QAAA,KAGF,YtCkyJA,SAAU,SsChyJR,IAAA,KAMA,0BvC4wJH,eCmBC,IAAK,EsC7xJD,QAAA,IAAA,IvCgxJL,cuC9wJK,cAKJ,MAAA,KtC4xJA,gBAAiB,KsC1xJf,OAAA,QvC4wJH,+BuCxwJC,4BACE,MAAA,QvC0wJH,iBAAA,KuCtwJG,wBvCywJH,MAAA,MuCrwJG,+BvCwwJH,aAAA,IwCj0JC,uBACA,YAAA,IAEA,WACA,YAAA,KxCo0JD,eAAA,KwCz0JC,cAAe,KvC41Jf,MAAO,QuCn1JL,iBAAA,KAIA,eAbJ,cAcI,MAAA,QxCo0JH,awCl1JC,cAAe,KAmBb,UAAA,KxCk0JH,YAAA,ICmBD,cuCh1JI,iBAAA,QAEA,sBxCi0JH,4BwC31JC,cAAe,KA8Bb,aAAA,KxCg0JH,cAAA,IwC7yJD,sBAfI,UAAA,KxCi0JD,oCwC9zJC,WvCi1JA,YAAa,KuC/0JX,eAAA,KxCi0JH,sBwCvzJD,4BvC00JE,cAAe,KuC90Jb,aAAA,KC5CJ,ezC42JD,cyC32JC,UAAA,MAGA,WACA,QAAA,MACA,QAAA,IACA,cAAA,KrCiLA,YAAA,WACK,iBAAA,KACG,OAAA,IAAA,MAAA,KJ8rJT,cAAA,IyCx3JC,mBAAoB,OAAO,IAAI,YxC24J1B,cAAe,OAAO,IAAI,YwC93J7B,WAAA,OAAA,IAAA,YAKF,iBzC22JD,eCmBC,aAAc,KACd,YAAa,KwCv3JX,mBA1BJ,kBzCk4JC,kByCv2JG,aAAA,QCzBJ,oBACE,QAAA,IACA,MAAA,KAEA,O1Cs4JD,QAAA,K0C14JC,cAAe,KAQb,OAAA,IAAA,MAAA,YAEA,cAAA,IAVJ,UAeI,WAAA,E1Ck4JH,MAAA,QCmBD,mByC/4JI,YAAA,IArBJ,SAyBI,U1C+3JH,cAAA,ECmBD,WyCx4JE,WAAA,IAFF,mBAAA,mBAMI,cAAA,KAEA,0BACA,0B1Cy3JH,SAAA,S0Cj3JC,IAAK,KCvDL,MAAA,MACA,MAAA,Q3C46JD,e0Ct3JC,MAAO,QClDL,iBAAA,Q3C26JH,aAAA,Q2Cx6JG,kB3C26JH,iBAAA,Q2Cn7JC,2BACA,MAAA,Q3Cu7JD,Y0C73JC,MAAO,QCtDL,iBAAA,Q3Cs7JH,aAAA,Q2Cn7JG,e3Cs7JH,iBAAA,Q2C97JC,wBACA,MAAA,Q3Ck8JD,e0Cp4JC,MAAO,QC1DL,iBAAA,Q3Ci8JH,aAAA,Q2C97JG,kB3Ci8JH,iBAAA,Q2Cz8JC,2BACA,MAAA,Q3C68JD,c0C34JC,MAAO,QC9DL,iBAAA,Q3C48JH,aAAA,Q2Cz8JG,iB3C48JH,iBAAA,Q4C78JC,0BAAQ,MAAA,QACR,wCAAQ,K5Cm9JP,oBAAA,KAAA,E4C/8JD,GACA,oBAAA,EAAA,GACA,mCAAQ,K5Cq9JP,oBAAA,KAAA,E4Cv9JD,GACA,oBAAA,EAAA,GACA,gCAAQ,K5Cq9JP,oBAAA,KAAA,E4C78JD,GACA,oBAAA,EAAA,GAGA,UACA,OAAA,KxCsCA,cAAA,KACQ,SAAA,OJ26JT,iBAAA,Q4C78JC,cAAe,IACf,mBAAA,MAAA,EAAA,IAAA,IAAA,eACA,WAAA,MAAA,EAAA,IAAA,IAAA,eAEA,cACA,MAAA,KACA,MAAA,EACA,OAAA,KACA,UAAA,KxCyBA,YAAA,KACQ,MAAA,KAyHR,WAAA,OACK,iBAAA,QACG,mBAAA,MAAA,EAAA,KAAA,EAAA,gBJ+zJT,WAAA,MAAA,EAAA,KAAA,EAAA,gB4C18JC,mBAAoB,MAAM,IAAI,K3Cq+JzB,cAAe,MAAM,IAAI,K4Cp+J5B,WAAA,MAAA,IAAA,KDEF,sBCAE,gCDAF,iBAAA,yK5C88JD,iBAAA,oK4Cv8JC,iBAAiB,iK3Cm+JjB,wBAAyB,KAAK,KG/gK9B,gBAAA,KAAA,KJy/JD,qBIv/JS,+BwCmDR,kBAAmB,qBAAqB,GAAG,OAAO,SErElD,aAAA,qBAAA,GAAA,OAAA,S9C4gKD,UAAA,qBAAA,GAAA,OAAA,S6Cz9JG,sBACA,iBAAA,Q7C69JH,wC4Cx8JC,iBAAkB,yKEzElB,iBAAA,oK9CohKD,iBAAA,iK6Cj+JG,mBACA,iBAAA,Q7Cq+JH,qC4C58JC,iBAAkB,yKE7ElB,iBAAA,oK9C4hKD,iBAAA,iK6Cz+JG,sBACA,iBAAA,Q7C6+JH,wC4Ch9JC,iBAAkB,yKEjFlB,iBAAA,oK9CoiKD,iBAAA,iK6Cj/JG,qBACA,iBAAA,Q7Cq/JH,uC+C5iKC,iBAAkB,yKAElB,iBAAA,oK/C6iKD,iBAAA,iK+C1iKG,O/C6iKH,WAAA,KC4BD,mB8CnkKE,WAAA,E/C4iKD,O+CxiKD,YACE,SAAA,O/C0iKD,KAAA,E+CtiKC,Y/CyiKD,MAAA,Q+CriKG,c/CwiKH,QAAA,MC4BD,4B8C9jKE,UAAA,KAGF,aAAA,mBAEE,aAAA,KAGF,YAAA,kB9C+jKE,cAAe,K8CxjKjB,YAHE,Y/CoiKD,a+ChiKC,QAAA,W/CmiKD,eAAA,I+C/hKC,c/CkiKD,eAAA,O+C7hKC,cACA,eAAA,OAMF,eACE,WAAA,EACA,cAAA,ICvDF,YAEE,aAAA,EACA,WAAA,KAQF,YACE,aAAA,EACA,cAAA,KAGA,iBACA,SAAA,SACA,QAAA,MhD6kKD,QAAA,KAAA,KgD1kKC,cAAA,KrB3BA,iBAAA,KACC,OAAA,IAAA,MAAA,KqB6BD,6BACE,uBAAA,IrBvBF,wBAAA,I3BsmKD,4BgDpkKC,cAAe,E/CgmKf,2BAA4B,I+C9lK5B,0BAAA,IAFF,kBAAA,uBAKI,MAAA,KAIF,2CAAA,gD/CgmKA,MAAO,K+C5lKL,wBAFA,wBhDykKH,6BgDxkKG,6BAKF,MAAO,KACP,gBAAA,KACA,iBAAA,QAKA,uB/C4lKA,MAAO,KACP,WAAY,K+CzlKV,0BhDmkKH,gCgDlkKG,gCALF,MAAA,K/CmmKA,OAAQ,YACR,iBAAkB,KDxBnB,mDgD5kKC,yDAAA,yD/CymKA,MAAO,QDxBR,gDgDhkKC,sDAAA,sD/C6lKA,MAAO,K+CzlKL,wBAEA,8BADA,8BhDmkKH,QAAA,EgDxkKC,MAAA,K/ComKA,iBAAkB,QAClB,aAAc,QAEhB,iDDpBC,wDCuBD,uDADA,uD+CzmKE,8DAYI,6D/C4lKN,uD+CxmKE,8D/C2mKF,6DAKE,MAAO,QDxBR,8CiD1qKG,oDADF,oDAEE,MAAA,QAEA,yBhDusKF,MAAO,QgDrsKH,iBAAA,QAFF,0BAAA,+BAKI,MAAA,QAGF,mDAAA,wDhDwsKJ,MAAO,QDtBR,gCiDhrKO,gCAGF,qCAFE,qChD2sKN,MAAO,QACP,iBAAkB,QAEpB,iCgDvsKQ,uCAFA,uChD0sKR,sCDtBC,4CiDnrKO,4CArBN,MAAA,KACE,iBAAA,QACA,aAAA,QAEA,sBhDouKF,MAAO,QgDluKH,iBAAA,QAFF,uBAAA,4BAKI,MAAA,QAGF,gDAAA,qDhDquKJ,MAAO,QDtBR,6BiD7sKO,6BAGF,kCAFE,kChDwuKN,MAAO,QACP,iBAAkB,QAEpB,8BgDpuKQ,oCAFA,oChDuuKR,mCDtBC,yCiDhtKO,yCArBN,MAAA,KACE,iBAAA,QACA,aAAA,QAEA,yBhDiwKF,MAAO,QgD/vKH,iBAAA,QAFF,0BAAA,+BAKI,MAAA,QAGF,mDAAA,wDhDkwKJ,MAAO,QDtBR,gCiD1uKO,gCAGF,qCAFE,qChDqwKN,MAAO,QACP,iBAAkB,QAEpB,iCgDjwKQ,uCAFA,uChDowKR,sCDtBC,4CiD7uKO,4CArBN,MAAA,KACE,iBAAA,QACA,aAAA,QAEA,wBhD8xKF,MAAO,QgD5xKH,iBAAA,QAFF,yBAAA,8BAKI,MAAA,QAGF,kDAAA,uDhD+xKJ,MAAO,QDtBR,+BiDvwKO,+BAGF,oCAFE,oChDkyKN,MAAO,QACP,iBAAkB,QAEpB,gCgD9xKQ,sCAFA,sChDiyKR,qCDtBC,2CiD1wKO,2CDkGN,MAAO,KACP,iBAAA,QACA,aAAA,QAEF,yBACE,WAAA,EACA,cAAA,IE1HF,sBACE,cAAA,EACA,YAAA,IAEA,O9C0DA,cAAA,KACQ,iBAAA,KJ6uKT,OAAA,IAAA,MAAA,YkDnyKC,cAAe,IACf,mBAAA,EAAA,IAAA,IAAA,gBlDqyKD,WAAA,EAAA,IAAA,IAAA,gBkD/xKC,YACA,QAAA,KvBnBC,e3BuzKF,QAAA,KAAA,KkDtyKC,cAAe,IAAI,MAAM,YAMvB,uBAAA,IlDmyKH,wBAAA,IkD7xKC,0CACA,MAAA,QAEA,alDgyKD,WAAA,EkDpyKC,cAAe,EjDg0Kf,UAAW,KACX,MAAO,QDtBR,oBkD1xKC,sBjDkzKF,eiDxzKI,mBAKJ,qBAEE,MAAA,QvBvCA,cACC,QAAA,KAAA,K3Bs0KF,iBAAA,QkDrxKC,WAAY,IAAI,MAAM,KjDizKtB,2BAA4B,IiD9yK1B,0BAAA,IAHJ,mBAAA,mCAMM,cAAA,ElDwxKL,oCkDnxKG,oDjD+yKF,aAAc,IAAI,EiD7yKZ,cAAA,EvBtEL,4D3B61KF,4EkDjxKG,WAAA,EjD6yKF,uBAAwB,IiD3yKlB,wBAAA,IvBtEL,0D3B21KF,0EkD1yKC,cAAe,EvB1Df,2BAAA,IACC,0BAAA,IuB0FH,+EAEI,uBAAA,ElD8wKH,wBAAA,EkD1wKC,wDlD6wKD,iBAAA,EC4BD,0BACE,iBAAkB,EiDlyKpB,8BlD0wKC,ckD1wKD,gCjDuyKE,cAAe,EiDvyKjB,sCAQM,sBlDwwKL,wCC4BC,cAAe,K0Br5Kf,aAAA,KuByGF,wDlDqxKC,0BC4BC,uBAAwB,IACxB,wBAAyB,IiDlzK3B,yFAoBQ,yFlDwwKP,2DkDzwKO,2DjDqyKN,uBAAwB,IACxB,wBAAyB,IAK3B,wGiD9zKA,wGjD4zKA,wGDtBC,wGCuBD,0EiD7zKA,0EjD2zKA,0EiDnyKU,0EjD2yKR,uBAAwB,IAK1B,uGiDx0KA,uGjDs0KA,uGDtBC,uGCuBD,yEiDv0KA,yEjDq0KA,yEiDzyKU,yEvB7HR,wBAAA,IuBiGF,sDlDqzKC,yBC4BC,2BAA4B,IAC5B,0BAA2B,IiDxyKrB,qFA1CR,qFAyCQ,wDlDmxKP,wDC4BC,2BAA4B,IAC5B,0BAA2B,IAG7B,oGDtBC,oGCwBD,oGiD91KA,oGjD21KA,uEiD7yKU,uEjD+yKV,uEiD71KA,uEjDm2KE,0BAA2B,IAG7B,mGDtBC,mGCwBD,mGiDx2KA,mGjDq2KA,sEiDnzKU,sEjDqzKV,sEiDv2KA,sEjD62KE,2BAA4B,IiDlzK1B,0BlD2xKH,qCkDt1KD,0BAAA,qCA+DI,WAAA,IAAA,MAAA,KA/DJ,kDAAA,kDAmEI,WAAA,EAnEJ,uBAAA,yCjD23KE,OAAQ,EiDjzKA,+CjDqzKV,+CiD/3KA,+CjDi4KA,+CAEA,+CANA,+CDjBC,iECoBD,iEiDh4KA,iEjDk4KA,iEAEA,iEANA,iEAWE,YAAa,EiD3zKL,8CjD+zKV,8CiD74KA,8CjD+4KA,8CAEA,8CANA,8CDjBC,gECoBD,gEiD94KA,gEjDg5KA,gEAEA,gEANA,gEAWE,aAAc,EAIhB,+CiD35KA,+CjDy5KA,+CiDl0KU,+CjDq0KV,iEiD55KA,iEjD05KA,iEDtBC,iEC6BC,cAAe,EAEjB,8CiDn0KU,8CjDq0KV,8CiDr6KA,8CjDo6KA,gEDtBC,gECwBD,gEiDh0KI,gEACA,cAAA,EAUJ,yBACE,cAAA,ElDmyKD,OAAA,EkD/xKG,aACA,cAAA,KANJ,oBASM,cAAA,ElDkyKL,cAAA,IkD7xKG,2BlDgyKH,WAAA,IC4BD,4BiDxzKM,cAAA,EAKF,wDAvBJ,wDlDqzKC,WAAA,IAAA,MAAA,KkD5xKK,2BlD+xKL,WAAA,EmDlhLC,uDnDqhLD,cAAA,IAAA,MAAA,KmDlhLG,eACA,aAAA,KnDshLH,8BmDxhLC,MAAA,KAMI,iBAAA,QnDqhLL,aAAA,KmDlhLK,0DACA,iBAAA,KAGJ,qCAEI,MAAA,QnDmhLL,iBAAA,KmDpiLC,yDnDuiLD,oBAAA,KmDpiLG,eACA,aAAA,QnDwiLH,8BmD1iLC,MAAA,KAMI,iBAAA,QnDuiLL,aAAA,QmDpiLK,0DACA,iBAAA,QAGJ,qCAEI,MAAA,QnDqiLL,iBAAA,KmDtjLC,yDnDyjLD,oBAAA,QmDtjLG,eACA,aAAA,QnD0jLH,8BmD5jLC,MAAA,QAMI,iBAAA,QnDyjLL,aAAA,QmDtjLK,0DACA,iBAAA,QAGJ,qCAEI,MAAA,QnDujLL,iBAAA,QmDxkLC,yDnD2kLD,oBAAA,QmDxkLG,YACA,aAAA,QnD4kLH,2BmD9kLC,MAAA,QAMI,iBAAA,QnD2kLL,aAAA,QmDxkLK,uDACA,iBAAA,QAGJ,kCAEI,MAAA,QnDykLL,iBAAA,QmD1lLC,sDnD6lLD,oBAAA,QmD1lLG,eACA,aAAA,QnD8lLH,8BmDhmLC,MAAA,QAMI,iBAAA,QnD6lLL,aAAA,QmD1lLK,0DACA,iBAAA,QAGJ,qCAEI,MAAA,QnD2lLL,iBAAA,QmD5mLC,yDnD+mLD,oBAAA,QmD5mLG,cACA,aAAA,QnDgnLH,6BmDlnLC,MAAA,QAMI,iBAAA,QnD+mLL,aAAA,QmD5mLK,yDACA,iBAAA,QAGJ,oCAEI,MAAA,QnD6mLL,iBAAA,QoD5nLC,wDACA,oBAAA,QAEA,kBACA,SAAA,SpD+nLD,QAAA,MoDpoLC,OAAQ,EnDgqLR,QAAS,EACT,SAAU,OAEZ,yCmDtpLI,wBADA,yBAEA,yBACA,wBACA,SAAA,SACA,IAAA,EACA,OAAA,EpD+nLH,KAAA,EoD1nLC,MAAO,KACP,OAAA,KpD4nLD,OAAA,EoDvnLC,wBpD0nLD,eAAA,OqDppLC,uBACA,eAAA,IAEA,MACA,WAAA,KACA,QAAA,KjDwDA,cAAA,KACQ,iBAAA,QJgmLT,OAAA,IAAA,MAAA,QqD/pLC,cAAe,IASb,mBAAA,MAAA,EAAA,IAAA,IAAA,gBACA,WAAA,MAAA,EAAA,IAAA,IAAA,gBAKJ,iBACE,aAAA,KACA,aAAA,gBAEF,SACE,QAAA,KACA,cAAA,ICtBF,SACE,QAAA,IACA,cAAA,IAEA,OACA,MAAA,MACA,UAAA,KjCRA,YAAA,IAGA,YAAA,ErBqrLD,MAAA,KsD7qLC,YAAA,EAAA,IAAA,EAAA,KrDysLA,OAAQ,kBqDvsLN,QAAA,GjCbF,aiCeE,ajCZF,MAAA,KrB6rLD,gBAAA,KsDzqLC,OAAA,QACE,OAAA,kBACA,QAAA,GAEA,aACA,mBAAA,KtD2qLH,QAAA,EuDhsLC,OAAQ,QACR,WAAA,IvDksLD,OAAA,EuD7rLC,YACA,SAAA,OAEA,OACA,SAAA,MACA,IAAA,EACA,MAAA,EACA,OAAA,EACA,KAAA,EAIA,QAAA,KvD6rLD,QAAA,KuD1rLC,SAAA,OnD+GA,2BAAA,MACI,QAAA,EAEI,0BAkER,mBAAA,kBAAA,IAAA,SAEK,cAAA,aAAA,IAAA,SACG,WAAA,UAAA,IAAA,SJ6gLT,kBAAA,kBuDhsLC,cAAA,kBnD2GA,aAAA,kBACI,UAAA,kBAEI,wBJwlLT,kBAAA,euDpsLK,cAAe,eACnB,aAAA,eACA,UAAA,eAIF,mBACE,WAAA,OACA,WAAA,KvDqsLD,cuDhsLC,SAAU,SACV,MAAA,KACA,OAAA,KAEA,eACA,SAAA,SnDaA,iBAAA,KACQ,wBAAA,YmDZR,gBAAA,YtD4tLA,OsD5tLA,IAAA,MAAA,KAEA,OAAA,IAAA,MAAA,evDksLD,cAAA,IuD9rLC,QAAS,EACT,mBAAA,EAAA,IAAA,IAAA,eACA,WAAA,EAAA,IAAA,IAAA,eAEA,gBACA,SAAA,MACA,IAAA,EACA,MAAA,EvDgsLD,OAAA,EuD9rLC,KAAA,ElCrEA,QAAA,KAGA,iBAAA,KkCmEA,qBlCtEA,OAAA,iBAGA,QAAA,EkCwEF,mBACE,OAAA,kBACA,QAAA,GAIF,cACE,QAAA,KvDgsLD,cAAA,IAAA,MAAA,QuD3rLC,qBACA,WAAA,KAKF,aACE,OAAA,EACA,YAAA,WAIF,YACE,SAAA,SACA,QAAA,KvD0rLD,cuD5rLC,QAAS,KAQP,WAAA,MACA,WAAA,IAAA,MAAA,QATJ,wBAaI,cAAA,EvDsrLH,YAAA,IuDlrLG,mCvDqrLH,YAAA,KuD/qLC,oCACA,YAAA,EAEA,yBACA,SAAA,SvDkrLD,IAAA,QuDhqLC,MAAO,KAZP,OAAA,KACE,SAAA,OvDgrLD,yBuD7qLD,cnDvEA,MAAA,MACQ,OAAA,KAAA,KmD2ER,eAAY,mBAAA,EAAA,IAAA,KAAA,evD+qLX,WAAA,EAAA,IAAA,KAAA,euDzqLD,UAFA,MAAA,OvDirLD,yBwD/zLC,UACA,MAAA,OCNA,SAEA,SAAA,SACA,QAAA,KACA,QAAA,MACA,YAAA,iBAAA,UAAA,MAAA,WACA,UAAA,KACA,WAAA,OACA,YAAA,IACA,YAAA,WACA,WAAA,KACA,WAAA,MACA,gBAAA,KACA,YAAA,KACA,eAAA,KACA,eAAA,ODHA,WAAA,OnCVA,aAAA,OAGA,UAAA,OrBs1LD,YAAA,OwD30LC,OAAA,iBnCdA,QAAA,ErB61LD,WAAA,KwD90LY,YAAmB,OAAA,kBxDk1L/B,QAAA,GwDj1LY,aAAmB,QAAA,IAAA,ExDq1L/B,WAAA,KwDp1LY,eAAmB,QAAA,EAAA,IxDw1L/B,YAAA,IwDv1LY,gBAAmB,QAAA,IAAA,ExD21L/B,WAAA,IwDt1LC,cACA,QAAA,EAAA,IACA,YAAA,KAEA,eACA,UAAA,MxDy1LD,QAAA,IAAA,IwDr1LC,MAAO,KACP,WAAA,OACA,iBAAA,KACA,cAAA,IAEA,exDu1LD,SAAA,SwDn1LC,MAAA,EACE,OAAA,EACA,aAAA,YACA,aAAA,MAEA,4BxDq1LH,OAAA,EwDn1LC,KAAA,IACE,YAAA,KACA,aAAA,IAAA,IAAA,EACA,iBAAA,KAEA,iCxDq1LH,MAAA,IwDn1LC,OAAA,EACE,cAAA,KACA,aAAA,IAAA,IAAA,EACA,iBAAA,KAEA,kCxDq1LH,OAAA,EwDn1LC,KAAA,IACE,cAAA,KACA,aAAA,IAAA,IAAA,EACA,iBAAA,KAEA,8BxDq1LH,IAAA,IwDn1LC,KAAA,EACE,WAAA,KACA,aAAA,IAAA,IAAA,IAAA,EACA,mBAAA,KAEA,6BxDq1LH,IAAA,IwDn1LC,MAAA,EACE,WAAA,KACA,aAAA,IAAA,EAAA,IAAA,IACA,kBAAA,KAEA,+BxDq1LH,IAAA,EwDn1LC,KAAA,IACE,YAAA,KACA,aAAA,EAAA,IAAA,IACA,oBAAA,KAEA,oCxDq1LH,IAAA,EwDn1LC,MAAA,IACE,WAAA,KACA,aAAA,EAAA,IAAA,IACA,oBAAA,KAEA,qCxDq1LH,IAAA,E0Dl7LC,KAAM,IACN,WAAA,KACA,aAAA,EAAA,IAAA,IACA,oBAAA,KAEA,SACA,SAAA,SACA,IAAA,EDXA,KAAA,EAEA,QAAA,KACA,QAAA,KACA,UAAA,MACA,QAAA,IACA,YAAA,iBAAA,UAAA,MAAA,WACA,UAAA,KACA,WAAA,OACA,YAAA,IACA,YAAA,WACA,WAAA,KACA,WAAA,MACA,gBAAA,KACA,YAAA,KACA,eAAA,KCAA,eAAA,OAEA,WAAA,OACA,aAAA,OAAA,UAAA,OACA,YAAA,OACA,iBAAA,KACA,wBAAA,YtD8CA,gBAAA,YACQ,OAAA,IAAA,MAAA,KJk5LT,OAAA,IAAA,MAAA,e0D77LC,cAAA,IAAY,mBAAA,EAAA,IAAA,KAAA,e1Dg8Lb,WAAA,EAAA,IAAA,KAAA,e0D/7La,WAAA,KACZ,aAAY,WAAA,MACZ,eAAY,YAAA,KAGd,gBACE,WAAA,KAEA,cACA,YAAA,MAEA,e1Dq8LD,QAAA,IAAA,K0Dl8LC,OAAQ,EACR,UAAA,K1Do8LD,iBAAA,Q0D57LC,cAAA,IAAA,MAAA,QzDy9LA,cAAe,IAAI,IAAI,EAAE,EyDt9LvB,iBACA,QAAA,IAAA,KAEA,gBACA,sB1D87LH,SAAA,S0D37LC,QAAS,MACT,MAAA,E1D67LD,OAAA,E0D37LC,aAAc,YACd,aAAA,M1D87LD,gB0Dz7LC,aAAA,KAEE,sBACA,QAAA,GACA,aAAA,KAEA,oB1D27LH,OAAA,M0D17LG,KAAA,IACE,YAAA,MACA,iBAAA,KACA,iBAAA,gBACA,oBAAA,E1D67LL,0B0Dz7LC,OAAA,IACE,YAAA,MACA,QAAA,IACA,iBAAA,KACA,oBAAA,EAEA,sB1D27LH,IAAA,I0D17LG,KAAA,MACE,WAAA,MACA,mBAAA,KACA,mBAAA,gBACA,kBAAA,E1D67LL,4B0Dz7LC,OAAA,MACE,KAAA,IACA,QAAA,IACA,mBAAA,KACA,kBAAA,EAEA,uB1D27LH,IAAA,M0D17LG,KAAA,IACE,YAAA,MACA,iBAAA,EACA,oBAAA,KACA,oBAAA,gB1D67LL,6B0Dx7LC,IAAA,IACE,YAAA,MACA,QAAA,IACA,iBAAA,EACA,oBAAA,KAEA,qB1D07LH,IAAA,I0Dz7LG,MAAA,MACE,WAAA,MACA,mBAAA,EACA,kBAAA,KACA,kBAAA,gB1D47LL,2B2DpjMC,MAAO,IACP,OAAA,M3DsjMD,QAAA,I2DnjMC,mBAAoB,EACpB,kBAAA,KAEA,U3DqjMD,SAAA,S2DljMG,gBACA,SAAA,SvD6KF,MAAA,KACK,SAAA,OJ04LN,sB2D/jMC,SAAU,S1D4lMV,QAAS,K0D9kML,mBAAA,IAAA,YAAA,K3DqjML,cAAA,IAAA,YAAA,K2D3hMC,WAAA,IAAA,YAAA,KvDmKK,4BAFL,0BAGQ,YAAA,EA3JA,qDA+GR,sBAEQ,mBAAA,kBAAA,IAAA,YJ86LP,cAAA,aAAA,IAAA,Y2DzjMG,WAAA,UAAA,IAAA,YvDmHJ,4BAAA,OACQ,oBAAA,OuDjHF,oBAAA,O3D4jML,YAAA,OI58LD,mCHs+LA,2BGr+LQ,KAAA,EuD5GF,kBAAA,sB3D6jML,UAAA,sBC2BD,kCADA,2BG5+LA,KAAA,EACQ,kBAAA,uBuDtGF,UAAA,uBArCN,6B3DomMD,gC2DpmMC,iC1D+nME,KAAM,E0DllMN,kBAAA,mB3D4jMH,UAAA,oBAGA,wB2D5mMD,sBAAA,sBAsDI,QAAA,MAEA,wB3D0jMH,KAAA,E2DtjMG,sB3DyjMH,sB2DrnMC,SAAU,SA+DR,IAAA,E3DyjMH,MAAA,KC0BD,sB0D/kMI,KAAA,KAnEJ,sBAuEI,KAAA,MAvEJ,2BA0EI,4B3DwjMH,KAAA,E2D/iMC,6BACA,KAAA,MAEA,8BACA,KAAA,KtC3FA,kBsC6FA,SAAA,SACA,IAAA,EACA,OAAA,EACA,KAAA,EACA,MAAA,I3DmjMD,UAAA,K2D9iMC,MAAA,KdnGE,WAAA,OACA,YAAA,EAAA,IAAA,IAAA,eACA,iBAAA,cAAA,OAAA,kBACA,QAAA,G7CqpMH,uB2DljMC,iBAAA,sEACE,iBAAA,iEACA,iBAAA,uFdxGA,iBAAA,kEACA,OAAA,+GACA,kBAAA,SACA,wBACA,MAAA,E7C6pMH,KAAA,K2DpjMC,iBAAA,sE1DglMA,iBAAiB,iE0D9kMf,iBAAA,uFACA,iBAAA,kEACA,OAAA,+GtCvHF,kBAAA,SsCyFF,wB3DslMC,wBC4BC,MAAO,KACP,gBAAiB,KACjB,OAAQ,kB0D7kMN,QAAA,EACA,QAAA,G3DwjMH,0C2DhmMD,2CA2CI,6BADA,6B1DklMF,SAAU,S0D7kMR,IAAA,IACA,QAAA,E3DqjMH,QAAA,a2DrmMC,WAAY,MAqDV,0CADA,6B3DsjMH,KAAA,I2D1mMC,YAAa,MA0DX,2CADA,6BAEA,MAAA,IACA,aAAA,MAME,6BADF,6B3DmjMH,MAAA,K2D9iMG,OAAA,KACE,YAAA,M3DgjML,YAAA,E2DriMC,oCACA,QAAA,QAEA,oCACA,QAAA,QAEA,qBACA,SAAA,SACA,OAAA,K3DwiMD,KAAA,I2DjjMC,QAAS,GAYP,MAAA,IACA,aAAA,EACA,YAAA,KACA,WAAA,OACA,WAAA,KAEA,wBACA,QAAA,aAWA,MAAA,KACA,OAAA,K3D8hMH,OAAA,I2D7jMC,YAAa,OAkCX,OAAA,QACA,iBAAA,OACA,iBAAA,cACA,OAAA,IAAA,MAAA,K3D8hMH,cAAA,K2DthMC,6BACA,MAAA,KACA,OAAA,KACA,OAAA,EACA,iBAAA,KAEA,kBACA,SAAA,SACA,MAAA,IACA,OAAA,K3DyhMD,KAAA,I2DxhMC,QAAA,GACE,YAAA,K3D0hMH,eAAA,K2Dj/LC,MAAO,KAhCP,WAAA,O1D8iMA,YAAa,EAAE,IAAI,IAAI,eAEzB,uB0D3iMM,YAAA,KAEA,oCACA,0C3DmhMH,2C2D3hMD,6BAAA,6BAYI,MAAA,K3DmhMH,OAAA,K2D/hMD,WAAA,M1D2jME,UAAW,KDxBZ,0C2D9gMD,6BACE,YAAA,MAEA,2C3DghMD,6B2D5gMD,aAAA,M3D+gMC,kBACF,MAAA,I4D7wMC,KAAA,I3DyyME,eAAgB,KAElB,qBACE,OAAQ,MAkBZ,qCADA,sCADA,mBADA,oBAXA,gBADA,iBAOA,uBADA,wBADA,iBADA,kBADA,wBADA,yBASA,mCADA,oC2DpzME,oBAAA,qBAAA,oBAAA,qB3D2zMF,WADA,YAOA,uBADA,wBADA,qBADA,sBADA,cADA,e2D/zMI,a3Dq0MJ,cDvBC,kB4D7yMG,mB3DqzMJ,WADA,YAwBE,QAAS,MACT,QAAS,IASX,qCADA,mBANA,gBAGA,uBADA,iBADA,wBAIA,mCDhBC,oB6D/0MC,oB5Dk2MF,W+B51MA,uBhCo0MC,qB4D5zMG,cChBF,aACA,kB5D+1MF,W+Br1ME,MAAO,KhCy0MR,cgCt0MC,QAAS,MACT,aAAA,KhCw0MD,YAAA,KgC/zMC,YhCk0MD,MAAA,gBgC/zMC,WhCk0MD,MAAA,egC/zMC,MhCk0MD,QAAA,e8Dz1MC,MACA,QAAA,gBAEA,WACA,WAAA,O9B8BF,WACE,KAAA,EAAA,EAAA,EhCg0MD,MAAA,YgCzzMC,YAAa,KACb,iBAAA,YhC2zMD,OAAA,E+D31MC,Q/D81MD,QAAA,eC4BD,OACE,SAAU,M+Dn4MV,chE42MD,MAAA,aC+BD,YADA,YADA,YADA,YAIE,QAAS,e+Dp5MT,kBhEs4MC,mBgEr4MD,yBhEi4MD,kB+Dl1MD,mBA6IA,yB9D4tMA,kBACA,mB8Dj3ME,yB9D62MF,kBACA,mBACA,yB+Dv5MY,QAAA,eACV,yBAAU,YhE04MT,QAAA,gBC4BD,iB+Dp6MU,QAAA,gBhE64MX,c+D51MG,QAAS,oB/Dg2MV,c+Dl2MC,c/Dm2MH,QAAA,sB+D91MG,yB/Dk2MD,kBACF,QAAA,iB+D91MG,yB/Dk2MD,mBACF,QAAA,kBgEh6MC,yBhEo6MC,yBgEn6MD,QAAA,wBACA,+CAAU,YhEw6MT,QAAA,gBC4BD,iB+Dl8MU,QAAA,gBhE26MX,c+Dr2MG,QAAS,oB/Dy2MV,c+D32MC,c/D42MH,QAAA,sB+Dv2MG,+C/D22MD,kBACF,QAAA,iB+Dv2MG,+C/D22MD,mBACF,QAAA,kBgE97MC,+ChEk8MC,yBgEj8MD,QAAA,wBACA,gDAAU,YhEs8MT,QAAA,gBC4BD,iB+Dh+MU,QAAA,gBhEy8MX,c+D92MG,QAAS,oB/Dk3MV,c+Dp3MC,c/Dq3MH,QAAA,sB+Dh3MG,gD/Do3MD,kBACF,QAAA,iB+Dh3MG,gD/Do3MD,mBACF,QAAA,kBgE59MC,gDhEg+MC,yBgE/9MD,QAAA,wBACA,0BAAU,YhEo+MT,QAAA,gBC4BD,iB+D9/MU,QAAA,gBhEu+MX,c+Dv3MG,QAAS,oB/D23MV,c+D73MC,c/D83MH,QAAA,sB+Dz3MG,0B/D63MD,kBACF,QAAA,iB+Dz3MG,0B/D63MD,mBACF,QAAA,kBgEl/MC,0BhEs/MC,yBACF,QAAA,wBgEv/MC,yBhE2/MC,WACF,QAAA,gBgE5/MC,+ChEggNC,WACF,QAAA,gBgEjgNC,gDhEqgNC,WACF,QAAA,gBAGA,0B+Dh3MC,WA4BE,QAAS,gBC5LX,eAAU,QAAA,eACV,aAAU,ehEyhNT,QAAA,gBC4BD,oB+DnjNU,QAAA,gBhE4hNX,iB+D93MG,QAAS,oBAMX,iB/D23MD,iB+Dt2MG,QAAS,sB/D22MZ,qB+D/3MC,QAAS,e/Dk4MV,a+D53MC,qBAcE,QAAS,iB/Dm3MZ,sB+Dh4MC,QAAS,e/Dm4MV,a+D73MC,sBAOE,QAAS,kB/D23MZ,4B+D53MC,QAAS,eCpLT,ahEojNC,4BACF,QAAA,wBC6BD,aACE,cACE,QAAS","sourcesContent":["/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\n\n//\n// 1. Set default font family to sans-serif.\n// 2. Prevent iOS and IE text size adjust after device orientation change,\n// without disabling user zoom.\n//\n\nhtml {\n font-family: sans-serif; // 1\n -ms-text-size-adjust: 100%; // 2\n -webkit-text-size-adjust: 100%; // 2\n}\n\n//\n// Remove default margin.\n//\n\nbody {\n margin: 0;\n}\n\n// HTML5 display definitions\n// ==========================================================================\n\n//\n// Correct `block` display not defined for any HTML5 element in IE 8/9.\n// Correct `block` display not defined for `details` or `summary` in IE 10/11\n// and Firefox.\n// Correct `block` display not defined for `main` in IE 11.\n//\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\n\n//\n// 1. Correct `inline-block` display not defined in IE 8/9.\n// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n//\n\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block; // 1\n vertical-align: baseline; // 2\n}\n\n//\n// Prevent modern browsers from displaying `audio` without controls.\n// Remove excess height in iOS 5 devices.\n//\n\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n\n//\n// Address `[hidden]` styling not present in IE 8/9/10.\n// Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22.\n//\n\n[hidden],\ntemplate {\n display: none;\n}\n\n// Links\n// ==========================================================================\n\n//\n// Remove the gray background color from active links in IE 10.\n//\n\na {\n background-color: transparent;\n}\n\n//\n// Improve readability of focused elements when they are also in an\n// active/hover state.\n//\n\na:active,\na:hover {\n outline: 0;\n}\n\n// Text-level semantics\n// ==========================================================================\n\n//\n// Address styling not present in IE 8/9/10/11, Safari, and Chrome.\n//\n\nabbr[title] {\n border-bottom: 1px dotted;\n}\n\n//\n// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n//\n\nb,\nstrong {\n font-weight: bold;\n}\n\n//\n// Address styling not present in Safari and Chrome.\n//\n\ndfn {\n font-style: italic;\n}\n\n//\n// Address variable `h1` font-size and margin within `section` and `article`\n// contexts in Firefox 4+, Safari, and Chrome.\n//\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n//\n// Address styling not present in IE 8/9.\n//\n\nmark {\n background: #ff0;\n color: #000;\n}\n\n//\n// Address inconsistent and variable font size in all browsers.\n//\n\nsmall {\n font-size: 80%;\n}\n\n//\n// Prevent `sub` and `sup` affecting `line-height` in all browsers.\n//\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsup {\n top: -0.5em;\n}\n\nsub {\n bottom: -0.25em;\n}\n\n// Embedded content\n// ==========================================================================\n\n//\n// Remove border when inside `a` element in IE 8/9/10.\n//\n\nimg {\n border: 0;\n}\n\n//\n// Correct overflow not hidden in IE 9/10/11.\n//\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\n// Grouping content\n// ==========================================================================\n\n//\n// Address margin not present in IE 8/9 and Safari.\n//\n\nfigure {\n margin: 1em 40px;\n}\n\n//\n// Address differences between Firefox and other browsers.\n//\n\nhr {\n box-sizing: content-box;\n height: 0;\n}\n\n//\n// Contain overflow in all browsers.\n//\n\npre {\n overflow: auto;\n}\n\n//\n// Address odd `em`-unit font size rendering in all browsers.\n//\n\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\n// Forms\n// ==========================================================================\n\n//\n// Known limitation: by default, Chrome and Safari on OS X allow very limited\n// styling of `select`, unless a `border` property is set.\n//\n\n//\n// 1. Correct color not being inherited.\n// Known issue: affects color of disabled elements.\n// 2. Correct font properties not being inherited.\n// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n//\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit; // 1\n font: inherit; // 2\n margin: 0; // 3\n}\n\n//\n// Address `overflow` set to `hidden` in IE 8/9/10/11.\n//\n\nbutton {\n overflow: visible;\n}\n\n//\n// Address inconsistent `text-transform` inheritance for `button` and `select`.\n// All other form control elements do not inherit `text-transform` values.\n// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n// Correct `select` style inheritance in Firefox.\n//\n\nbutton,\nselect {\n text-transform: none;\n}\n\n//\n// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n// and `video` controls.\n// 2. Correct inability to style clickable `input` types in iOS.\n// 3. Improve usability and consistency of cursor style between image-type\n// `input` and others.\n//\n\nbutton,\nhtml input[type=\"button\"], // 1\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button; // 2\n cursor: pointer; // 3\n}\n\n//\n// Re-set default cursor for disabled elements.\n//\n\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\n\n//\n// Remove inner padding and border in Firefox 4+.\n//\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\n\n//\n// Address Firefox 4+ setting `line-height` on `input` using `!important` in\n// the UA stylesheet.\n//\n\ninput {\n line-height: normal;\n}\n\n//\n// It's recommended that you don't attempt to style these elements.\n// Firefox's implementation doesn't respect box-sizing, padding, or width.\n//\n// 1. Address box sizing set to `content-box` in IE 8/9/10.\n// 2. Remove excess padding in IE 8/9/10.\n//\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box; // 1\n padding: 0; // 2\n}\n\n//\n// Fix the cursor style for Chrome's increment/decrement buttons. For certain\n// `font-size` values of the `input`, it causes the cursor style of the\n// decrement button to change from `default` to `text`.\n//\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n//\n// 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n// 2. Address `box-sizing` set to `border-box` in Safari and Chrome.\n//\n\ninput[type=\"search\"] {\n -webkit-appearance: textfield; // 1\n box-sizing: content-box; //2\n}\n\n//\n// Remove inner padding and search cancel button in Safari and Chrome on OS X.\n// Safari (but not Chrome) clips the cancel button when the search input has\n// padding (and `textfield` appearance).\n//\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// Define consistent border, margin, and padding.\n//\n\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\n\n//\n// 1. Correct `color` not being inherited in IE 8/9/10/11.\n// 2. Remove padding so people aren't caught out if they zero out fieldsets.\n//\n\nlegend {\n border: 0; // 1\n padding: 0; // 2\n}\n\n//\n// Remove default vertical scrollbar in IE 8/9/10/11.\n//\n\ntextarea {\n overflow: auto;\n}\n\n//\n// Don't inherit the `font-weight` (applied by a rule above).\n// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n//\n\noptgroup {\n font-weight: bold;\n}\n\n// Tables\n// ==========================================================================\n\n//\n// Remove most spacing between table cells.\n//\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\ntd,\nth {\n padding: 0;\n}\n","/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n\n// ==========================================================================\n// Print styles.\n// Inlined to avoid the additional HTTP request: h5bp.com/r\n// ==========================================================================\n\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important; // Black prints faster: h5bp.com/s\n box-shadow: none !important;\n text-shadow: none !important;\n }\n\n a,\n a:visited {\n text-decoration: underline;\n }\n\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n\n // Don't show links that are fragment identifiers,\n // or use the `javascript:` pseudo protocol\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n\n thead {\n display: table-header-group; // h5bp.com/t\n }\n\n tr,\n img {\n page-break-inside: avoid;\n }\n\n img {\n max-width: 100% !important;\n }\n\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n\n h2,\n h3 {\n page-break-after: avoid;\n }\n\n // Bootstrap specific changes start\n\n // Bootstrap components\n .navbar {\n display: none;\n }\n .btn,\n .dropup > .btn {\n > .caret {\n border-top-color: #000 !important;\n }\n }\n .label {\n border: 1px solid #000;\n }\n\n .table {\n border-collapse: collapse !important;\n\n td,\n th {\n background-color: #fff !important;\n }\n }\n .table-bordered {\n th,\n td {\n border: 1px solid #ddd !important;\n }\n }\n\n // Bootstrap specific changes end\n}\n","/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\nhtml {\n font-family: sans-serif;\n -ms-text-size-adjust: 100%;\n -webkit-text-size-adjust: 100%;\n}\nbody {\n margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block;\n vertical-align: baseline;\n}\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n[hidden],\ntemplate {\n display: none;\n}\na {\n background-color: transparent;\n}\na:active,\na:hover {\n outline: 0;\n}\nabbr[title] {\n border-bottom: 1px dotted;\n}\nb,\nstrong {\n font-weight: bold;\n}\ndfn {\n font-style: italic;\n}\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\nmark {\n background: #ff0;\n color: #000;\n}\nsmall {\n font-size: 80%;\n}\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\nsup {\n top: -0.5em;\n}\nsub {\n bottom: -0.25em;\n}\nimg {\n border: 0;\n}\nsvg:not(:root) {\n overflow: hidden;\n}\nfigure {\n margin: 1em 40px;\n}\nhr {\n box-sizing: content-box;\n height: 0;\n}\npre {\n overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit;\n font: inherit;\n margin: 0;\n}\nbutton {\n overflow: visible;\n}\nbutton,\nselect {\n text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button;\n cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\ninput {\n line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box;\n padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: textfield;\n box-sizing: content-box;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\nlegend {\n border: 0;\n padding: 0;\n}\ntextarea {\n overflow: auto;\n}\noptgroup {\n font-weight: bold;\n}\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\ntd,\nth {\n padding: 0;\n}\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important;\n box-shadow: none !important;\n text-shadow: none !important;\n }\n a,\n a:visited {\n text-decoration: underline;\n }\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n img {\n max-width: 100% !important;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n .navbar {\n display: none;\n }\n .btn > .caret,\n .dropup > .btn > .caret {\n border-top-color: #000 !important;\n }\n .label {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #ddd !important;\n }\n}\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url('../fonts/glyphicons-halflings-regular.eot');\n src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');\n}\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n content: \"\\002a\";\n}\n.glyphicon-plus:before {\n content: \"\\002b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n content: \"\\270f\";\n}\n.glyphicon-glass:before {\n content: \"\\e001\";\n}\n.glyphicon-music:before {\n content: \"\\e002\";\n}\n.glyphicon-search:before {\n content: \"\\e003\";\n}\n.glyphicon-heart:before {\n content: \"\\e005\";\n}\n.glyphicon-star:before {\n content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n content: \"\\e007\";\n}\n.glyphicon-user:before {\n content: \"\\e008\";\n}\n.glyphicon-film:before {\n content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n content: \"\\e010\";\n}\n.glyphicon-th:before {\n content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n content: \"\\e012\";\n}\n.glyphicon-ok:before {\n content: \"\\e013\";\n}\n.glyphicon-remove:before {\n content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n content: \"\\e016\";\n}\n.glyphicon-off:before {\n content: \"\\e017\";\n}\n.glyphicon-signal:before {\n content: \"\\e018\";\n}\n.glyphicon-cog:before {\n content: \"\\e019\";\n}\n.glyphicon-trash:before {\n content: \"\\e020\";\n}\n.glyphicon-home:before {\n content: \"\\e021\";\n}\n.glyphicon-file:before {\n content: \"\\e022\";\n}\n.glyphicon-time:before {\n content: \"\\e023\";\n}\n.glyphicon-road:before {\n content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n content: \"\\e025\";\n}\n.glyphicon-download:before {\n content: \"\\e026\";\n}\n.glyphicon-upload:before {\n content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n content: \"\\e032\";\n}\n.glyphicon-lock:before {\n content: \"\\e033\";\n}\n.glyphicon-flag:before {\n content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n content: \"\\e040\";\n}\n.glyphicon-tag:before {\n content: \"\\e041\";\n}\n.glyphicon-tags:before {\n content: \"\\e042\";\n}\n.glyphicon-book:before {\n content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n content: \"\\e044\";\n}\n.glyphicon-print:before {\n content: \"\\e045\";\n}\n.glyphicon-camera:before {\n content: \"\\e046\";\n}\n.glyphicon-font:before {\n content: \"\\e047\";\n}\n.glyphicon-bold:before {\n content: \"\\e048\";\n}\n.glyphicon-italic:before {\n content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n content: \"\\e055\";\n}\n.glyphicon-list:before {\n content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n content: \"\\e059\";\n}\n.glyphicon-picture:before {\n content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n content: \"\\e063\";\n}\n.glyphicon-tint:before {\n content: \"\\e064\";\n}\n.glyphicon-edit:before {\n content: \"\\e065\";\n}\n.glyphicon-share:before {\n content: \"\\e066\";\n}\n.glyphicon-check:before {\n content: \"\\e067\";\n}\n.glyphicon-move:before {\n content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n content: \"\\e070\";\n}\n.glyphicon-backward:before {\n content: \"\\e071\";\n}\n.glyphicon-play:before {\n content: \"\\e072\";\n}\n.glyphicon-pause:before {\n content: \"\\e073\";\n}\n.glyphicon-stop:before {\n content: \"\\e074\";\n}\n.glyphicon-forward:before {\n content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n content: \"\\e077\";\n}\n.glyphicon-eject:before {\n content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n content: \"\\e101\";\n}\n.glyphicon-gift:before {\n content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n content: \"\\e103\";\n}\n.glyphicon-fire:before {\n content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n content: \"\\e107\";\n}\n.glyphicon-plane:before {\n content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n content: \"\\e109\";\n}\n.glyphicon-random:before {\n content: \"\\e110\";\n}\n.glyphicon-comment:before {\n content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n content: \"\\e122\";\n}\n.glyphicon-bell:before {\n content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n content: \"\\e134\";\n}\n.glyphicon-globe:before {\n content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n content: \"\\e137\";\n}\n.glyphicon-filter:before {\n content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n content: \"\\e143\";\n}\n.glyphicon-link:before {\n content: \"\\e144\";\n}\n.glyphicon-phone:before {\n content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n content: \"\\e146\";\n}\n.glyphicon-usd:before {\n content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n content: \"\\e149\";\n}\n.glyphicon-sort:before {\n content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n content: \"\\e157\";\n}\n.glyphicon-expand:before {\n content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n content: \"\\e161\";\n}\n.glyphicon-flash:before {\n content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n content: \"\\e164\";\n}\n.glyphicon-record:before {\n content: \"\\e165\";\n}\n.glyphicon-save:before {\n content: \"\\e166\";\n}\n.glyphicon-open:before {\n content: \"\\e167\";\n}\n.glyphicon-saved:before {\n content: \"\\e168\";\n}\n.glyphicon-import:before {\n content: \"\\e169\";\n}\n.glyphicon-export:before {\n content: \"\\e170\";\n}\n.glyphicon-send:before {\n content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n content: \"\\e179\";\n}\n.glyphicon-header:before {\n content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n content: \"\\e183\";\n}\n.glyphicon-tower:before {\n content: \"\\e184\";\n}\n.glyphicon-stats:before {\n content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n content: \"\\e200\";\n}\n.glyphicon-cd:before {\n content: \"\\e201\";\n}\n.glyphicon-save-file:before {\n content: \"\\e202\";\n}\n.glyphicon-open-file:before {\n content: \"\\e203\";\n}\n.glyphicon-level-up:before {\n content: \"\\e204\";\n}\n.glyphicon-copy:before {\n content: \"\\e205\";\n}\n.glyphicon-paste:before {\n content: \"\\e206\";\n}\n.glyphicon-alert:before {\n content: \"\\e209\";\n}\n.glyphicon-equalizer:before {\n content: \"\\e210\";\n}\n.glyphicon-king:before {\n content: \"\\e211\";\n}\n.glyphicon-queen:before {\n content: \"\\e212\";\n}\n.glyphicon-pawn:before {\n content: \"\\e213\";\n}\n.glyphicon-bishop:before {\n content: \"\\e214\";\n}\n.glyphicon-knight:before {\n content: \"\\e215\";\n}\n.glyphicon-baby-formula:before {\n content: \"\\e216\";\n}\n.glyphicon-tent:before {\n content: \"\\26fa\";\n}\n.glyphicon-blackboard:before {\n content: \"\\e218\";\n}\n.glyphicon-bed:before {\n content: \"\\e219\";\n}\n.glyphicon-apple:before {\n content: \"\\f8ff\";\n}\n.glyphicon-erase:before {\n content: \"\\e221\";\n}\n.glyphicon-hourglass:before {\n content: \"\\231b\";\n}\n.glyphicon-lamp:before {\n content: \"\\e223\";\n}\n.glyphicon-duplicate:before {\n content: \"\\e224\";\n}\n.glyphicon-piggy-bank:before {\n content: \"\\e225\";\n}\n.glyphicon-scissors:before {\n content: \"\\e226\";\n}\n.glyphicon-bitcoin:before {\n content: \"\\e227\";\n}\n.glyphicon-btc:before {\n content: \"\\e227\";\n}\n.glyphicon-xbt:before {\n content: \"\\e227\";\n}\n.glyphicon-yen:before {\n content: \"\\00a5\";\n}\n.glyphicon-jpy:before {\n content: \"\\00a5\";\n}\n.glyphicon-ruble:before {\n content: \"\\20bd\";\n}\n.glyphicon-rub:before {\n content: \"\\20bd\";\n}\n.glyphicon-scale:before {\n content: \"\\e230\";\n}\n.glyphicon-ice-lolly:before {\n content: \"\\e231\";\n}\n.glyphicon-ice-lolly-tasted:before {\n content: \"\\e232\";\n}\n.glyphicon-education:before {\n content: \"\\e233\";\n}\n.glyphicon-option-horizontal:before {\n content: \"\\e234\";\n}\n.glyphicon-option-vertical:before {\n content: \"\\e235\";\n}\n.glyphicon-menu-hamburger:before {\n content: \"\\e236\";\n}\n.glyphicon-modal-window:before {\n content: \"\\e237\";\n}\n.glyphicon-oil:before {\n content: \"\\e238\";\n}\n.glyphicon-grain:before {\n content: \"\\e239\";\n}\n.glyphicon-sunglasses:before {\n content: \"\\e240\";\n}\n.glyphicon-text-size:before {\n content: \"\\e241\";\n}\n.glyphicon-text-color:before {\n content: \"\\e242\";\n}\n.glyphicon-text-background:before {\n content: \"\\e243\";\n}\n.glyphicon-object-align-top:before {\n content: \"\\e244\";\n}\n.glyphicon-object-align-bottom:before {\n content: \"\\e245\";\n}\n.glyphicon-object-align-horizontal:before {\n content: \"\\e246\";\n}\n.glyphicon-object-align-left:before {\n content: \"\\e247\";\n}\n.glyphicon-object-align-vertical:before {\n content: \"\\e248\";\n}\n.glyphicon-object-align-right:before {\n content: \"\\e249\";\n}\n.glyphicon-triangle-right:before {\n content: \"\\e250\";\n}\n.glyphicon-triangle-left:before {\n content: \"\\e251\";\n}\n.glyphicon-triangle-bottom:before {\n content: \"\\e252\";\n}\n.glyphicon-triangle-top:before {\n content: \"\\e253\";\n}\n.glyphicon-console:before {\n content: \"\\e254\";\n}\n.glyphicon-superscript:before {\n content: \"\\e255\";\n}\n.glyphicon-subscript:before {\n content: \"\\e256\";\n}\n.glyphicon-menu-left:before {\n content: \"\\e257\";\n}\n.glyphicon-menu-right:before {\n content: \"\\e258\";\n}\n.glyphicon-menu-down:before {\n content: \"\\e259\";\n}\n.glyphicon-menu-up:before {\n content: \"\\e260\";\n}\n* {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n*:before,\n*:after {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 14px;\n line-height: 1.42857143;\n color: #333333;\n background-color: #fff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\na {\n color: #337ab7;\n text-decoration: none;\n}\na:hover,\na:focus {\n color: #23527c;\n text-decoration: underline;\n}\na:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\nfigure {\n margin: 0;\n}\nimg {\n vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n display: block;\n max-width: 100%;\n height: auto;\n}\n.img-rounded {\n border-radius: 6px;\n}\n.img-thumbnail {\n padding: 4px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: all 0.2s ease-in-out;\n -o-transition: all 0.2s ease-in-out;\n transition: all 0.2s ease-in-out;\n display: inline-block;\n max-width: 100%;\n height: auto;\n}\n.img-circle {\n border-radius: 50%;\n}\nhr {\n margin-top: 20px;\n margin-bottom: 20px;\n border: 0;\n border-top: 1px solid #eeeeee;\n}\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n}\n[role=\"button\"] {\n cursor: pointer;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n font-family: inherit;\n font-weight: 500;\n line-height: 1.1;\n color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n font-weight: normal;\n line-height: 1;\n color: #777777;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n margin-top: 20px;\n margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n margin-top: 10px;\n margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n font-size: 75%;\n}\nh1,\n.h1 {\n font-size: 36px;\n}\nh2,\n.h2 {\n font-size: 30px;\n}\nh3,\n.h3 {\n font-size: 24px;\n}\nh4,\n.h4 {\n font-size: 18px;\n}\nh5,\n.h5 {\n font-size: 14px;\n}\nh6,\n.h6 {\n font-size: 12px;\n}\np {\n margin: 0 0 10px;\n}\n.lead {\n margin-bottom: 20px;\n font-size: 16px;\n font-weight: 300;\n line-height: 1.4;\n}\n@media (min-width: 768px) {\n .lead {\n font-size: 21px;\n }\n}\nsmall,\n.small {\n font-size: 85%;\n}\nmark,\n.mark {\n background-color: #fcf8e3;\n padding: .2em;\n}\n.text-left {\n text-align: left;\n}\n.text-right {\n text-align: right;\n}\n.text-center {\n text-align: center;\n}\n.text-justify {\n text-align: justify;\n}\n.text-nowrap {\n white-space: nowrap;\n}\n.text-lowercase {\n text-transform: lowercase;\n}\n.text-uppercase {\n text-transform: uppercase;\n}\n.text-capitalize {\n text-transform: capitalize;\n}\n.text-muted {\n color: #777777;\n}\n.text-primary {\n color: #337ab7;\n}\na.text-primary:hover,\na.text-primary:focus {\n color: #286090;\n}\n.text-success {\n color: #3c763d;\n}\na.text-success:hover,\na.text-success:focus {\n color: #2b542c;\n}\n.text-info {\n color: #31708f;\n}\na.text-info:hover,\na.text-info:focus {\n color: #245269;\n}\n.text-warning {\n color: #8a6d3b;\n}\na.text-warning:hover,\na.text-warning:focus {\n color: #66512c;\n}\n.text-danger {\n color: #a94442;\n}\na.text-danger:hover,\na.text-danger:focus {\n color: #843534;\n}\n.bg-primary {\n color: #fff;\n background-color: #337ab7;\n}\na.bg-primary:hover,\na.bg-primary:focus {\n background-color: #286090;\n}\n.bg-success {\n background-color: #dff0d8;\n}\na.bg-success:hover,\na.bg-success:focus {\n background-color: #c1e2b3;\n}\n.bg-info {\n background-color: #d9edf7;\n}\na.bg-info:hover,\na.bg-info:focus {\n background-color: #afd9ee;\n}\n.bg-warning {\n background-color: #fcf8e3;\n}\na.bg-warning:hover,\na.bg-warning:focus {\n background-color: #f7ecb5;\n}\n.bg-danger {\n background-color: #f2dede;\n}\na.bg-danger:hover,\na.bg-danger:focus {\n background-color: #e4b9b9;\n}\n.page-header {\n padding-bottom: 9px;\n margin: 40px 0 20px;\n border-bottom: 1px solid #eeeeee;\n}\nul,\nol {\n margin-top: 0;\n margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n margin-bottom: 0;\n}\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n.list-inline {\n padding-left: 0;\n list-style: none;\n margin-left: -5px;\n}\n.list-inline > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n}\ndl {\n margin-top: 0;\n margin-bottom: 20px;\n}\ndt,\ndd {\n line-height: 1.42857143;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0;\n}\n@media (min-width: 768px) {\n .dl-horizontal dt {\n float: left;\n width: 160px;\n clear: left;\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .dl-horizontal dd {\n margin-left: 180px;\n }\n}\nabbr[title],\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted #777777;\n}\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\nblockquote {\n padding: 10px 20px;\n margin: 0 0 20px;\n font-size: 17.5px;\n border-left: 5px solid #eeeeee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n display: block;\n font-size: 80%;\n line-height: 1.42857143;\n color: #777777;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n content: '\\2014 \\00A0';\n}\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid #eeeeee;\n border-left: 0;\n text-align: right;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n content: '';\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n content: '\\00A0 \\2014';\n}\naddress {\n margin-bottom: 20px;\n font-style: normal;\n line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: #c7254e;\n background-color: #f9f2f4;\n border-radius: 4px;\n}\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: #fff;\n background-color: #333;\n border-radius: 3px;\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n box-shadow: none;\n}\npre {\n display: block;\n padding: 9.5px;\n margin: 0 0 10px;\n font-size: 13px;\n line-height: 1.42857143;\n word-break: break-all;\n word-wrap: break-word;\n color: #333333;\n background-color: #f5f5f5;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\npre code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n}\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n.container {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px;\n}\n@media (min-width: 768px) {\n .container {\n width: 750px;\n }\n}\n@media (min-width: 992px) {\n .container {\n width: 970px;\n }\n}\n@media (min-width: 1200px) {\n .container {\n width: 1170px;\n }\n}\n.container-fluid {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px;\n}\n.row {\n margin-left: -15px;\n margin-right: -15px;\n}\n.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {\n position: relative;\n min-height: 1px;\n padding-left: 15px;\n padding-right: 15px;\n}\n.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {\n float: left;\n}\n.col-xs-12 {\n width: 100%;\n}\n.col-xs-11 {\n width: 91.66666667%;\n}\n.col-xs-10 {\n width: 83.33333333%;\n}\n.col-xs-9 {\n width: 75%;\n}\n.col-xs-8 {\n width: 66.66666667%;\n}\n.col-xs-7 {\n width: 58.33333333%;\n}\n.col-xs-6 {\n width: 50%;\n}\n.col-xs-5 {\n width: 41.66666667%;\n}\n.col-xs-4 {\n width: 33.33333333%;\n}\n.col-xs-3 {\n width: 25%;\n}\n.col-xs-2 {\n width: 16.66666667%;\n}\n.col-xs-1 {\n width: 8.33333333%;\n}\n.col-xs-pull-12 {\n right: 100%;\n}\n.col-xs-pull-11 {\n right: 91.66666667%;\n}\n.col-xs-pull-10 {\n right: 83.33333333%;\n}\n.col-xs-pull-9 {\n right: 75%;\n}\n.col-xs-pull-8 {\n right: 66.66666667%;\n}\n.col-xs-pull-7 {\n right: 58.33333333%;\n}\n.col-xs-pull-6 {\n right: 50%;\n}\n.col-xs-pull-5 {\n right: 41.66666667%;\n}\n.col-xs-pull-4 {\n right: 33.33333333%;\n}\n.col-xs-pull-3 {\n right: 25%;\n}\n.col-xs-pull-2 {\n right: 16.66666667%;\n}\n.col-xs-pull-1 {\n right: 8.33333333%;\n}\n.col-xs-pull-0 {\n right: auto;\n}\n.col-xs-push-12 {\n left: 100%;\n}\n.col-xs-push-11 {\n left: 91.66666667%;\n}\n.col-xs-push-10 {\n left: 83.33333333%;\n}\n.col-xs-push-9 {\n left: 75%;\n}\n.col-xs-push-8 {\n left: 66.66666667%;\n}\n.col-xs-push-7 {\n left: 58.33333333%;\n}\n.col-xs-push-6 {\n left: 50%;\n}\n.col-xs-push-5 {\n left: 41.66666667%;\n}\n.col-xs-push-4 {\n left: 33.33333333%;\n}\n.col-xs-push-3 {\n left: 25%;\n}\n.col-xs-push-2 {\n left: 16.66666667%;\n}\n.col-xs-push-1 {\n left: 8.33333333%;\n}\n.col-xs-push-0 {\n left: auto;\n}\n.col-xs-offset-12 {\n margin-left: 100%;\n}\n.col-xs-offset-11 {\n margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n margin-left: 75%;\n}\n.col-xs-offset-8 {\n margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n margin-left: 50%;\n}\n.col-xs-offset-5 {\n margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n margin-left: 25%;\n}\n.col-xs-offset-2 {\n margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n margin-left: 0%;\n}\n@media (min-width: 768px) {\n .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {\n float: left;\n }\n .col-sm-12 {\n width: 100%;\n }\n .col-sm-11 {\n width: 91.66666667%;\n }\n .col-sm-10 {\n width: 83.33333333%;\n }\n .col-sm-9 {\n width: 75%;\n }\n .col-sm-8 {\n width: 66.66666667%;\n }\n .col-sm-7 {\n width: 58.33333333%;\n }\n .col-sm-6 {\n width: 50%;\n }\n .col-sm-5 {\n width: 41.66666667%;\n }\n .col-sm-4 {\n width: 33.33333333%;\n }\n .col-sm-3 {\n width: 25%;\n }\n .col-sm-2 {\n width: 16.66666667%;\n }\n .col-sm-1 {\n width: 8.33333333%;\n }\n .col-sm-pull-12 {\n right: 100%;\n }\n .col-sm-pull-11 {\n right: 91.66666667%;\n }\n .col-sm-pull-10 {\n right: 83.33333333%;\n }\n .col-sm-pull-9 {\n right: 75%;\n }\n .col-sm-pull-8 {\n right: 66.66666667%;\n }\n .col-sm-pull-7 {\n right: 58.33333333%;\n }\n .col-sm-pull-6 {\n right: 50%;\n }\n .col-sm-pull-5 {\n right: 41.66666667%;\n }\n .col-sm-pull-4 {\n right: 33.33333333%;\n }\n .col-sm-pull-3 {\n right: 25%;\n }\n .col-sm-pull-2 {\n right: 16.66666667%;\n }\n .col-sm-pull-1 {\n right: 8.33333333%;\n }\n .col-sm-pull-0 {\n right: auto;\n }\n .col-sm-push-12 {\n left: 100%;\n }\n .col-sm-push-11 {\n left: 91.66666667%;\n }\n .col-sm-push-10 {\n left: 83.33333333%;\n }\n .col-sm-push-9 {\n left: 75%;\n }\n .col-sm-push-8 {\n left: 66.66666667%;\n }\n .col-sm-push-7 {\n left: 58.33333333%;\n }\n .col-sm-push-6 {\n left: 50%;\n }\n .col-sm-push-5 {\n left: 41.66666667%;\n }\n .col-sm-push-4 {\n left: 33.33333333%;\n }\n .col-sm-push-3 {\n left: 25%;\n }\n .col-sm-push-2 {\n left: 16.66666667%;\n }\n .col-sm-push-1 {\n left: 8.33333333%;\n }\n .col-sm-push-0 {\n left: auto;\n }\n .col-sm-offset-12 {\n margin-left: 100%;\n }\n .col-sm-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-sm-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-sm-offset-9 {\n margin-left: 75%;\n }\n .col-sm-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-sm-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-sm-offset-6 {\n margin-left: 50%;\n }\n .col-sm-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-sm-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-sm-offset-3 {\n margin-left: 25%;\n }\n .col-sm-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-sm-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-sm-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 992px) {\n .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {\n float: left;\n }\n .col-md-12 {\n width: 100%;\n }\n .col-md-11 {\n width: 91.66666667%;\n }\n .col-md-10 {\n width: 83.33333333%;\n }\n .col-md-9 {\n width: 75%;\n }\n .col-md-8 {\n width: 66.66666667%;\n }\n .col-md-7 {\n width: 58.33333333%;\n }\n .col-md-6 {\n width: 50%;\n }\n .col-md-5 {\n width: 41.66666667%;\n }\n .col-md-4 {\n width: 33.33333333%;\n }\n .col-md-3 {\n width: 25%;\n }\n .col-md-2 {\n width: 16.66666667%;\n }\n .col-md-1 {\n width: 8.33333333%;\n }\n .col-md-pull-12 {\n right: 100%;\n }\n .col-md-pull-11 {\n right: 91.66666667%;\n }\n .col-md-pull-10 {\n right: 83.33333333%;\n }\n .col-md-pull-9 {\n right: 75%;\n }\n .col-md-pull-8 {\n right: 66.66666667%;\n }\n .col-md-pull-7 {\n right: 58.33333333%;\n }\n .col-md-pull-6 {\n right: 50%;\n }\n .col-md-pull-5 {\n right: 41.66666667%;\n }\n .col-md-pull-4 {\n right: 33.33333333%;\n }\n .col-md-pull-3 {\n right: 25%;\n }\n .col-md-pull-2 {\n right: 16.66666667%;\n }\n .col-md-pull-1 {\n right: 8.33333333%;\n }\n .col-md-pull-0 {\n right: auto;\n }\n .col-md-push-12 {\n left: 100%;\n }\n .col-md-push-11 {\n left: 91.66666667%;\n }\n .col-md-push-10 {\n left: 83.33333333%;\n }\n .col-md-push-9 {\n left: 75%;\n }\n .col-md-push-8 {\n left: 66.66666667%;\n }\n .col-md-push-7 {\n left: 58.33333333%;\n }\n .col-md-push-6 {\n left: 50%;\n }\n .col-md-push-5 {\n left: 41.66666667%;\n }\n .col-md-push-4 {\n left: 33.33333333%;\n }\n .col-md-push-3 {\n left: 25%;\n }\n .col-md-push-2 {\n left: 16.66666667%;\n }\n .col-md-push-1 {\n left: 8.33333333%;\n }\n .col-md-push-0 {\n left: auto;\n }\n .col-md-offset-12 {\n margin-left: 100%;\n }\n .col-md-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-md-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-md-offset-9 {\n margin-left: 75%;\n }\n .col-md-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-md-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-md-offset-6 {\n margin-left: 50%;\n }\n .col-md-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-md-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-md-offset-3 {\n margin-left: 25%;\n }\n .col-md-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-md-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-md-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 1200px) {\n .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {\n float: left;\n }\n .col-lg-12 {\n width: 100%;\n }\n .col-lg-11 {\n width: 91.66666667%;\n }\n .col-lg-10 {\n width: 83.33333333%;\n }\n .col-lg-9 {\n width: 75%;\n }\n .col-lg-8 {\n width: 66.66666667%;\n }\n .col-lg-7 {\n width: 58.33333333%;\n }\n .col-lg-6 {\n width: 50%;\n }\n .col-lg-5 {\n width: 41.66666667%;\n }\n .col-lg-4 {\n width: 33.33333333%;\n }\n .col-lg-3 {\n width: 25%;\n }\n .col-lg-2 {\n width: 16.66666667%;\n }\n .col-lg-1 {\n width: 8.33333333%;\n }\n .col-lg-pull-12 {\n right: 100%;\n }\n .col-lg-pull-11 {\n right: 91.66666667%;\n }\n .col-lg-pull-10 {\n right: 83.33333333%;\n }\n .col-lg-pull-9 {\n right: 75%;\n }\n .col-lg-pull-8 {\n right: 66.66666667%;\n }\n .col-lg-pull-7 {\n right: 58.33333333%;\n }\n .col-lg-pull-6 {\n right: 50%;\n }\n .col-lg-pull-5 {\n right: 41.66666667%;\n }\n .col-lg-pull-4 {\n right: 33.33333333%;\n }\n .col-lg-pull-3 {\n right: 25%;\n }\n .col-lg-pull-2 {\n right: 16.66666667%;\n }\n .col-lg-pull-1 {\n right: 8.33333333%;\n }\n .col-lg-pull-0 {\n right: auto;\n }\n .col-lg-push-12 {\n left: 100%;\n }\n .col-lg-push-11 {\n left: 91.66666667%;\n }\n .col-lg-push-10 {\n left: 83.33333333%;\n }\n .col-lg-push-9 {\n left: 75%;\n }\n .col-lg-push-8 {\n left: 66.66666667%;\n }\n .col-lg-push-7 {\n left: 58.33333333%;\n }\n .col-lg-push-6 {\n left: 50%;\n }\n .col-lg-push-5 {\n left: 41.66666667%;\n }\n .col-lg-push-4 {\n left: 33.33333333%;\n }\n .col-lg-push-3 {\n left: 25%;\n }\n .col-lg-push-2 {\n left: 16.66666667%;\n }\n .col-lg-push-1 {\n left: 8.33333333%;\n }\n .col-lg-push-0 {\n left: auto;\n }\n .col-lg-offset-12 {\n margin-left: 100%;\n }\n .col-lg-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-lg-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-lg-offset-9 {\n margin-left: 75%;\n }\n .col-lg-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-lg-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-lg-offset-6 {\n margin-left: 50%;\n }\n .col-lg-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-lg-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-lg-offset-3 {\n margin-left: 25%;\n }\n .col-lg-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-lg-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-lg-offset-0 {\n margin-left: 0%;\n }\n}\ntable {\n background-color: transparent;\n}\ncaption {\n padding-top: 8px;\n padding-bottom: 8px;\n color: #777777;\n text-align: left;\n}\nth {\n text-align: left;\n}\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n padding: 8px;\n line-height: 1.42857143;\n vertical-align: top;\n border-top: 1px solid #ddd;\n}\n.table > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid #ddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n border-top: 0;\n}\n.table > tbody + tbody {\n border-top: 2px solid #ddd;\n}\n.table .table {\n background-color: #fff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n padding: 5px;\n}\n.table-bordered {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-of-type(odd) {\n background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n background-color: #f5f5f5;\n}\ntable col[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-column;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-cell;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n background-color: #ebcccc;\n}\n.table-responsive {\n overflow-x: auto;\n min-height: 0.01%;\n}\n@media screen and (max-width: 767px) {\n .table-responsive {\n width: 100%;\n margin-bottom: 15px;\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid #ddd;\n }\n .table-responsive > .table {\n margin-bottom: 0;\n }\n .table-responsive > .table > thead > tr > th,\n .table-responsive > .table > tbody > tr > th,\n .table-responsive > .table > tfoot > tr > th,\n .table-responsive > .table > thead > tr > td,\n .table-responsive > .table > tbody > tr > td,\n .table-responsive > .table > tfoot > tr > td {\n white-space: nowrap;\n }\n .table-responsive > .table-bordered {\n border: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:first-child,\n .table-responsive > .table-bordered > tbody > tr > th:first-child,\n .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n .table-responsive > .table-bordered > thead > tr > td:first-child,\n .table-responsive > .table-bordered > tbody > tr > td:first-child,\n .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:last-child,\n .table-responsive > .table-bordered > tbody > tr > th:last-child,\n .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n .table-responsive > .table-bordered > thead > tr > td:last-child,\n .table-responsive > .table-bordered > tbody > tr > td:last-child,\n .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n }\n .table-responsive > .table-bordered > tbody > tr:last-child > th,\n .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n .table-responsive > .table-bordered > tbody > tr:last-child > td,\n .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n border-bottom: 0;\n }\n}\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n min-width: 0;\n}\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: 20px;\n font-size: 21px;\n line-height: inherit;\n color: #333333;\n border: 0;\n border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n display: inline-block;\n max-width: 100%;\n margin-bottom: 5px;\n font-weight: bold;\n}\ninput[type=\"search\"] {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9;\n line-height: normal;\n}\ninput[type=\"file\"] {\n display: block;\n}\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\nselect[multiple],\nselect[size] {\n height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\noutput {\n display: block;\n padding-top: 7px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n}\n.form-control {\n display: block;\n width: 100%;\n height: 34px;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n background-color: #fff;\n background-image: none;\n border: 1px solid #ccc;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n border-color: #66afe9;\n outline: 0;\n -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n.form-control::-moz-placeholder {\n color: #999;\n opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n color: #999;\n}\n.form-control::-webkit-input-placeholder {\n color: #999;\n}\n.form-control::-ms-expand {\n border: 0;\n background-color: transparent;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n background-color: #eeeeee;\n opacity: 1;\n}\n.form-control[disabled],\nfieldset[disabled] .form-control {\n cursor: not-allowed;\n}\ntextarea.form-control {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: none;\n}\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n input[type=\"date\"].form-control,\n input[type=\"time\"].form-control,\n input[type=\"datetime-local\"].form-control,\n input[type=\"month\"].form-control {\n line-height: 34px;\n }\n input[type=\"date\"].input-sm,\n input[type=\"time\"].input-sm,\n input[type=\"datetime-local\"].input-sm,\n input[type=\"month\"].input-sm,\n .input-group-sm input[type=\"date\"],\n .input-group-sm input[type=\"time\"],\n .input-group-sm input[type=\"datetime-local\"],\n .input-group-sm input[type=\"month\"] {\n line-height: 30px;\n }\n input[type=\"date\"].input-lg,\n input[type=\"time\"].input-lg,\n input[type=\"datetime-local\"].input-lg,\n input[type=\"month\"].input-lg,\n .input-group-lg input[type=\"date\"],\n .input-group-lg input[type=\"time\"],\n .input-group-lg input[type=\"datetime-local\"],\n .input-group-lg input[type=\"month\"] {\n line-height: 46px;\n }\n}\n.form-group {\n margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.radio label,\n.checkbox label {\n min-height: 20px;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-left: -20px;\n margin-top: 4px \\9;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n position: relative;\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n vertical-align: middle;\n font-weight: normal;\n cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n cursor: not-allowed;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n cursor: not-allowed;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n cursor: not-allowed;\n}\n.form-control-static {\n padding-top: 7px;\n padding-bottom: 7px;\n margin-bottom: 0;\n min-height: 34px;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n padding-left: 0;\n padding-right: 0;\n}\n.input-sm {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-sm {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-sm,\nselect[multiple].input-sm {\n height: auto;\n}\n.form-group-sm .form-control {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.form-group-sm select.form-control {\n height: 30px;\n line-height: 30px;\n}\n.form-group-sm textarea.form-control,\n.form-group-sm select[multiple].form-control {\n height: auto;\n}\n.form-group-sm .form-control-static {\n height: 30px;\n min-height: 32px;\n padding: 6px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.input-lg {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-lg {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-lg,\nselect[multiple].input-lg {\n height: auto;\n}\n.form-group-lg .form-control {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.form-group-lg select.form-control {\n height: 46px;\n line-height: 46px;\n}\n.form-group-lg textarea.form-control,\n.form-group-lg select[multiple].form-control {\n height: auto;\n}\n.form-group-lg .form-control-static {\n height: 46px;\n min-height: 38px;\n padding: 11px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.has-feedback {\n position: relative;\n}\n.has-feedback .form-control {\n padding-right: 42.5px;\n}\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n display: block;\n width: 34px;\n height: 34px;\n line-height: 34px;\n text-align: center;\n pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n width: 46px;\n height: 46px;\n line-height: 46px;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n width: 30px;\n height: 30px;\n line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n color: #3c763d;\n}\n.has-success .form-control {\n border-color: #3c763d;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-success .form-control:focus {\n border-color: #2b542c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n color: #3c763d;\n border-color: #3c763d;\n background-color: #dff0d8;\n}\n.has-success .form-control-feedback {\n color: #3c763d;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n color: #8a6d3b;\n}\n.has-warning .form-control {\n border-color: #8a6d3b;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-warning .form-control:focus {\n border-color: #66512c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n color: #8a6d3b;\n border-color: #8a6d3b;\n background-color: #fcf8e3;\n}\n.has-warning .form-control-feedback {\n color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n color: #a94442;\n}\n.has-error .form-control {\n border-color: #a94442;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-error .form-control:focus {\n border-color: #843534;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n color: #a94442;\n border-color: #a94442;\n background-color: #f2dede;\n}\n.has-error .form-control-feedback {\n color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n top: 0;\n}\n.help-block {\n display: block;\n margin-top: 5px;\n margin-bottom: 10px;\n color: #737373;\n}\n@media (min-width: 768px) {\n .form-inline .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-static {\n display: inline-block;\n }\n .form-inline .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .form-inline .input-group .input-group-addon,\n .form-inline .input-group .input-group-btn,\n .form-inline .input-group .form-control {\n width: auto;\n }\n .form-inline .input-group > .form-control {\n width: 100%;\n }\n .form-inline .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio,\n .form-inline .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio label,\n .form-inline .checkbox label {\n padding-left: 0;\n }\n .form-inline .radio input[type=\"radio\"],\n .form-inline .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .form-inline .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n margin-top: 0;\n margin-bottom: 0;\n padding-top: 7px;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n min-height: 27px;\n}\n.form-horizontal .form-group {\n margin-left: -15px;\n margin-right: -15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .control-label {\n text-align: right;\n margin-bottom: 0;\n padding-top: 7px;\n }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n right: 15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-lg .control-label {\n padding-top: 11px;\n font-size: 18px;\n }\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-sm .control-label {\n padding-top: 6px;\n font-size: 12px;\n }\n}\n.btn {\n display: inline-block;\n margin-bottom: 0;\n font-weight: normal;\n text-align: center;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none;\n border: 1px solid transparent;\n white-space: nowrap;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n border-radius: 4px;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n color: #333;\n text-decoration: none;\n}\n.btn:active,\n.btn.active {\n outline: 0;\n background-image: none;\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n cursor: not-allowed;\n opacity: 0.65;\n filter: alpha(opacity=65);\n -webkit-box-shadow: none;\n box-shadow: none;\n}\na.btn.disabled,\nfieldset[disabled] a.btn {\n pointer-events: none;\n}\n.btn-default {\n color: #333;\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default:focus,\n.btn-default.focus {\n color: #333;\n background-color: #e6e6e6;\n border-color: #8c8c8c;\n}\n.btn-default:hover {\n color: #333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n color: #333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active:hover,\n.btn-default.active:hover,\n.open > .dropdown-toggle.btn-default:hover,\n.btn-default:active:focus,\n.btn-default.active:focus,\n.open > .dropdown-toggle.btn-default:focus,\n.btn-default:active.focus,\n.btn-default.active.focus,\n.open > .dropdown-toggle.btn-default.focus {\n color: #333;\n background-color: #d4d4d4;\n border-color: #8c8c8c;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n background-image: none;\n}\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus {\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default .badge {\n color: #fff;\n background-color: #333;\n}\n.btn-primary {\n color: #fff;\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary:focus,\n.btn-primary.focus {\n color: #fff;\n background-color: #286090;\n border-color: #122b40;\n}\n.btn-primary:hover {\n color: #fff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n color: #fff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active:hover,\n.btn-primary.active:hover,\n.open > .dropdown-toggle.btn-primary:hover,\n.btn-primary:active:focus,\n.btn-primary.active:focus,\n.open > .dropdown-toggle.btn-primary:focus,\n.btn-primary:active.focus,\n.btn-primary.active.focus,\n.open > .dropdown-toggle.btn-primary.focus {\n color: #fff;\n background-color: #204d74;\n border-color: #122b40;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n background-image: none;\n}\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus {\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.btn-success {\n color: #fff;\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success:focus,\n.btn-success.focus {\n color: #fff;\n background-color: #449d44;\n border-color: #255625;\n}\n.btn-success:hover {\n color: #fff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n color: #fff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active:hover,\n.btn-success.active:hover,\n.open > .dropdown-toggle.btn-success:hover,\n.btn-success:active:focus,\n.btn-success.active:focus,\n.open > .dropdown-toggle.btn-success:focus,\n.btn-success:active.focus,\n.btn-success.active.focus,\n.open > .dropdown-toggle.btn-success.focus {\n color: #fff;\n background-color: #398439;\n border-color: #255625;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n background-image: none;\n}\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus {\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success .badge {\n color: #5cb85c;\n background-color: #fff;\n}\n.btn-info {\n color: #fff;\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info:focus,\n.btn-info.focus {\n color: #fff;\n background-color: #31b0d5;\n border-color: #1b6d85;\n}\n.btn-info:hover {\n color: #fff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n color: #fff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active:hover,\n.btn-info.active:hover,\n.open > .dropdown-toggle.btn-info:hover,\n.btn-info:active:focus,\n.btn-info.active:focus,\n.open > .dropdown-toggle.btn-info:focus,\n.btn-info:active.focus,\n.btn-info.active.focus,\n.open > .dropdown-toggle.btn-info.focus {\n color: #fff;\n background-color: #269abc;\n border-color: #1b6d85;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n background-image: none;\n}\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus {\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info .badge {\n color: #5bc0de;\n background-color: #fff;\n}\n.btn-warning {\n color: #fff;\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning:focus,\n.btn-warning.focus {\n color: #fff;\n background-color: #ec971f;\n border-color: #985f0d;\n}\n.btn-warning:hover {\n color: #fff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n color: #fff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active:hover,\n.btn-warning.active:hover,\n.open > .dropdown-toggle.btn-warning:hover,\n.btn-warning:active:focus,\n.btn-warning.active:focus,\n.open > .dropdown-toggle.btn-warning:focus,\n.btn-warning:active.focus,\n.btn-warning.active.focus,\n.open > .dropdown-toggle.btn-warning.focus {\n color: #fff;\n background-color: #d58512;\n border-color: #985f0d;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n background-image: none;\n}\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus {\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning .badge {\n color: #f0ad4e;\n background-color: #fff;\n}\n.btn-danger {\n color: #fff;\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger:focus,\n.btn-danger.focus {\n color: #fff;\n background-color: #c9302c;\n border-color: #761c19;\n}\n.btn-danger:hover {\n color: #fff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n color: #fff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active:hover,\n.btn-danger.active:hover,\n.open > .dropdown-toggle.btn-danger:hover,\n.btn-danger:active:focus,\n.btn-danger.active:focus,\n.open > .dropdown-toggle.btn-danger:focus,\n.btn-danger:active.focus,\n.btn-danger.active.focus,\n.open > .dropdown-toggle.btn-danger.focus {\n color: #fff;\n background-color: #ac2925;\n border-color: #761c19;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n background-image: none;\n}\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus {\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger .badge {\n color: #d9534f;\n background-color: #fff;\n}\n.btn-link {\n color: #337ab7;\n font-weight: normal;\n border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n background-color: transparent;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n color: #23527c;\n text-decoration: underline;\n background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n color: #777777;\n text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n padding: 1px 5px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-block {\n display: block;\n width: 100%;\n}\n.btn-block + .btn-block {\n margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n.fade {\n opacity: 0;\n -webkit-transition: opacity 0.15s linear;\n -o-transition: opacity 0.15s linear;\n transition: opacity 0.15s linear;\n}\n.fade.in {\n opacity: 1;\n}\n.collapse {\n display: none;\n}\n.collapse.in {\n display: block;\n}\ntr.collapse.in {\n display: table-row;\n}\ntbody.collapse.in {\n display: table-row-group;\n}\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n -webkit-transition-property: height, visibility;\n transition-property: height, visibility;\n -webkit-transition-duration: 0.35s;\n transition-duration: 0.35s;\n -webkit-transition-timing-function: ease;\n transition-timing-function: ease;\n}\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: 4px dashed;\n border-top: 4px solid \\9;\n border-right: 4px solid transparent;\n border-left: 4px solid transparent;\n}\n.dropup,\n.dropdown {\n position: relative;\n}\n.dropdown-toggle:focus {\n outline: 0;\n}\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0;\n list-style: none;\n font-size: 14px;\n text-align: left;\n background-color: #fff;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 4px;\n -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n background-clip: padding-box;\n}\n.dropdown-menu.pull-right {\n right: 0;\n left: auto;\n}\n.dropdown-menu .divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: 1.42857143;\n color: #333333;\n white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n text-decoration: none;\n color: #262626;\n background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n color: #fff;\n text-decoration: none;\n outline: 0;\n background-color: #337ab7;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n color: #777777;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n text-decoration: none;\n background-color: transparent;\n background-image: none;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n cursor: not-allowed;\n}\n.open > .dropdown-menu {\n display: block;\n}\n.open > a {\n outline: 0;\n}\n.dropdown-menu-right {\n left: auto;\n right: 0;\n}\n.dropdown-menu-left {\n left: 0;\n right: auto;\n}\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: 12px;\n line-height: 1.42857143;\n color: #777777;\n white-space: nowrap;\n}\n.dropdown-backdrop {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n z-index: 990;\n}\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n border-top: 0;\n border-bottom: 4px dashed;\n border-bottom: 4px solid \\9;\n content: \"\";\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n}\n@media (min-width: 768px) {\n .navbar-right .dropdown-menu {\n left: auto;\n right: 0;\n }\n .navbar-right .dropdown-menu-left {\n left: 0;\n right: auto;\n }\n}\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n z-index: 2;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n margin-left: -1px;\n}\n.btn-toolbar {\n margin-left: -5px;\n}\n.btn-toolbar .btn,\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n.btn-group > .btn:first-child {\n margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px;\n}\n.btn-group.open .dropdown-toggle {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn .caret {\n margin-left: 0;\n}\n.btn-lg .caret {\n border-width: 5px 5px 0;\n border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n float: none;\n display: table-cell;\n width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n left: auto;\n}\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n.input-group {\n position: relative;\n display: table;\n border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n float: none;\n padding-left: 0;\n padding-right: 0;\n}\n.input-group .form-control {\n position: relative;\n z-index: 2;\n float: left;\n width: 100%;\n margin-bottom: 0;\n}\n.input-group .form-control:focus {\n z-index: 3;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle;\n}\n.input-group-addon {\n padding: 6px 12px;\n font-size: 14px;\n font-weight: normal;\n line-height: 1;\n color: #555555;\n text-align: center;\n background-color: #eeeeee;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\n.input-group-addon.input-sm {\n padding: 5px 10px;\n font-size: 12px;\n border-radius: 3px;\n}\n.input-group-addon.input-lg {\n padding: 10px 16px;\n font-size: 18px;\n border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n.input-group-btn {\n position: relative;\n font-size: 0;\n white-space: nowrap;\n}\n.input-group-btn > .btn {\n position: relative;\n}\n.input-group-btn > .btn + .btn {\n margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n z-index: 2;\n margin-left: -1px;\n}\n.nav {\n margin-bottom: 0;\n padding-left: 0;\n list-style: none;\n}\n.nav > li {\n position: relative;\n display: block;\n}\n.nav > li > a {\n position: relative;\n display: block;\n padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.nav > li.disabled > a {\n color: #777777;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n color: #777777;\n text-decoration: none;\n background-color: transparent;\n cursor: not-allowed;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n background-color: #eeeeee;\n border-color: #337ab7;\n}\n.nav .nav-divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.nav > li > a > img {\n max-width: none;\n}\n.nav-tabs {\n border-bottom: 1px solid #ddd;\n}\n.nav-tabs > li {\n float: left;\n margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n margin-right: 2px;\n line-height: 1.42857143;\n border: 1px solid transparent;\n border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n border-color: #eeeeee #eeeeee #ddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n color: #555555;\n background-color: #fff;\n border: 1px solid #ddd;\n border-bottom-color: transparent;\n cursor: default;\n}\n.nav-tabs.nav-justified {\n width: 100%;\n border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n float: none;\n}\n.nav-tabs.nav-justified > li > a {\n text-align: center;\n margin-bottom: 5px;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-tabs.nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs.nav-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs.nav-justified > .active > a,\n .nav-tabs.nav-justified > .active > a:hover,\n .nav-tabs.nav-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.nav-pills > li {\n float: left;\n}\n.nav-pills > li > a {\n border-radius: 4px;\n}\n.nav-pills > li + li {\n margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n color: #fff;\n background-color: #337ab7;\n}\n.nav-stacked > li {\n float: none;\n}\n.nav-stacked > li + li {\n margin-top: 2px;\n margin-left: 0;\n}\n.nav-justified {\n width: 100%;\n}\n.nav-justified > li {\n float: none;\n}\n.nav-justified > li > a {\n text-align: center;\n margin-bottom: 5px;\n}\n.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs-justified {\n border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs-justified > .active > a,\n .nav-tabs-justified > .active > a:hover,\n .nav-tabs-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.tab-content > .tab-pane {\n display: none;\n}\n.tab-content > .active {\n display: block;\n}\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.navbar {\n position: relative;\n min-height: 50px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n .navbar {\n border-radius: 4px;\n }\n}\n@media (min-width: 768px) {\n .navbar-header {\n float: left;\n }\n}\n.navbar-collapse {\n overflow-x: visible;\n padding-right: 15px;\n padding-left: 15px;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n -webkit-overflow-scrolling: touch;\n}\n.navbar-collapse.in {\n overflow-y: auto;\n}\n@media (min-width: 768px) {\n .navbar-collapse {\n width: auto;\n border-top: 0;\n box-shadow: none;\n }\n .navbar-collapse.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0;\n overflow: visible !important;\n }\n .navbar-collapse.in {\n overflow-y: visible;\n }\n .navbar-fixed-top .navbar-collapse,\n .navbar-static-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n padding-left: 0;\n padding-right: 0;\n }\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n max-height: 340px;\n}\n@media (max-device-width: 480px) and (orientation: landscape) {\n .navbar-fixed-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n max-height: 200px;\n }\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n margin-right: -15px;\n margin-left: -15px;\n}\n@media (min-width: 768px) {\n .container > .navbar-header,\n .container-fluid > .navbar-header,\n .container > .navbar-collapse,\n .container-fluid > .navbar-collapse {\n margin-right: 0;\n margin-left: 0;\n }\n}\n.navbar-static-top {\n z-index: 1000;\n border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n .navbar-static-top {\n border-radius: 0;\n }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n@media (min-width: 768px) {\n .navbar-fixed-top,\n .navbar-fixed-bottom {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0;\n border-width: 1px 0 0;\n}\n.navbar-brand {\n float: left;\n padding: 15px 15px;\n font-size: 18px;\n line-height: 20px;\n height: 50px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n text-decoration: none;\n}\n.navbar-brand > img {\n display: block;\n}\n@media (min-width: 768px) {\n .navbar > .container .navbar-brand,\n .navbar > .container-fluid .navbar-brand {\n margin-left: -15px;\n }\n}\n.navbar-toggle {\n position: relative;\n float: right;\n margin-right: 15px;\n padding: 9px 10px;\n margin-top: 8px;\n margin-bottom: 8px;\n background-color: transparent;\n background-image: none;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.navbar-toggle:focus {\n outline: 0;\n}\n.navbar-toggle .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n margin-top: 4px;\n}\n@media (min-width: 768px) {\n .navbar-toggle {\n display: none;\n }\n}\n.navbar-nav {\n margin: 7.5px -15px;\n}\n.navbar-nav > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: 20px;\n}\n@media (max-width: 767px) {\n .navbar-nav .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n }\n .navbar-nav .open .dropdown-menu > li > a,\n .navbar-nav .open .dropdown-menu .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n .navbar-nav .open .dropdown-menu > li > a {\n line-height: 20px;\n }\n .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-nav .open .dropdown-menu > li > a:focus {\n background-image: none;\n }\n}\n@media (min-width: 768px) {\n .navbar-nav {\n float: left;\n margin: 0;\n }\n .navbar-nav > li {\n float: left;\n }\n .navbar-nav > li > a {\n padding-top: 15px;\n padding-bottom: 15px;\n }\n}\n.navbar-form {\n margin-left: -15px;\n margin-right: -15px;\n padding: 10px 15px;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n margin-top: 8px;\n margin-bottom: 8px;\n}\n@media (min-width: 768px) {\n .navbar-form .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .navbar-form .form-control-static {\n display: inline-block;\n }\n .navbar-form .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .navbar-form .input-group .input-group-addon,\n .navbar-form .input-group .input-group-btn,\n .navbar-form .input-group .form-control {\n width: auto;\n }\n .navbar-form .input-group > .form-control {\n width: 100%;\n }\n .navbar-form .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio,\n .navbar-form .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio label,\n .navbar-form .checkbox label {\n padding-left: 0;\n }\n .navbar-form .radio input[type=\"radio\"],\n .navbar-form .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .navbar-form .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n@media (max-width: 767px) {\n .navbar-form .form-group {\n margin-bottom: 5px;\n }\n .navbar-form .form-group:last-child {\n margin-bottom: 0;\n }\n}\n@media (min-width: 768px) {\n .navbar-form {\n width: auto;\n border: 0;\n margin-left: 0;\n margin-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n}\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.navbar-btn {\n margin-top: 8px;\n margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n margin-top: 14px;\n margin-bottom: 14px;\n}\n.navbar-text {\n margin-top: 15px;\n margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n .navbar-text {\n float: left;\n margin-left: 15px;\n margin-right: 15px;\n }\n}\n@media (min-width: 768px) {\n .navbar-left {\n float: left !important;\n }\n .navbar-right {\n float: right !important;\n margin-right: -15px;\n }\n .navbar-right ~ .navbar-right {\n margin-right: 0;\n }\n}\n.navbar-default {\n background-color: #f8f8f8;\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n color: #777;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n color: #5e5e5e;\n background-color: transparent;\n}\n.navbar-default .navbar-text {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n color: #333;\n background-color: transparent;\n}\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n}\n.navbar-default .navbar-toggle {\n border-color: #ddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n background-color: #ddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n background-color: #888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n background-color: #e7e7e7;\n color: #555;\n}\n@media (max-width: 767px) {\n .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n color: #777;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #333;\n background-color: transparent;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n }\n}\n.navbar-default .navbar-link {\n color: #777;\n}\n.navbar-default .navbar-link:hover {\n color: #333;\n}\n.navbar-default .btn-link {\n color: #777;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n color: #333;\n}\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n color: #ccc;\n}\n.navbar-inverse {\n background-color: #222;\n border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n color: #fff;\n background-color: #080808;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n}\n.navbar-inverse .navbar-toggle {\n border-color: #333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n background-color: #333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n background-color: #fff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n border-color: #101010;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n background-color: #080808;\n color: #fff;\n}\n@media (max-width: 767px) {\n .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n border-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n color: #9d9d9d;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #fff;\n background-color: transparent;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n }\n}\n.navbar-inverse .navbar-link {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-link:hover {\n color: #fff;\n}\n.navbar-inverse .btn-link {\n color: #9d9d9d;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n color: #fff;\n}\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-inverse .btn-link:focus {\n color: #444;\n}\n.breadcrumb {\n padding: 8px 15px;\n margin-bottom: 20px;\n list-style: none;\n background-color: #f5f5f5;\n border-radius: 4px;\n}\n.breadcrumb > li {\n display: inline-block;\n}\n.breadcrumb > li + li:before {\n content: \"/\\00a0\";\n padding: 0 5px;\n color: #ccc;\n}\n.breadcrumb > .active {\n color: #777777;\n}\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: 20px 0;\n border-radius: 4px;\n}\n.pagination > li {\n display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n position: relative;\n float: left;\n padding: 6px 12px;\n line-height: 1.42857143;\n text-decoration: none;\n color: #337ab7;\n background-color: #fff;\n border: 1px solid #ddd;\n margin-left: -1px;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n margin-left: 0;\n border-bottom-left-radius: 4px;\n border-top-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n border-bottom-right-radius: 4px;\n border-top-right-radius: 4px;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n z-index: 2;\n color: #23527c;\n background-color: #eeeeee;\n border-color: #ddd;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n z-index: 3;\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n cursor: default;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n color: #777777;\n background-color: #fff;\n border-color: #ddd;\n cursor: not-allowed;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n border-bottom-left-radius: 6px;\n border-top-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n border-bottom-right-radius: 6px;\n border-top-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n border-bottom-left-radius: 3px;\n border-top-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n border-bottom-right-radius: 3px;\n border-top-right-radius: 3px;\n}\n.pager {\n padding-left: 0;\n margin: 20px 0;\n list-style: none;\n text-align: center;\n}\n.pager li {\n display: inline;\n}\n.pager li > a,\n.pager li > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.pager .next > a,\n.pager .next > span {\n float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n color: #777777;\n background-color: #fff;\n cursor: not-allowed;\n}\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n}\na.label:hover,\na.label:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.label:empty {\n display: none;\n}\n.btn .label {\n position: relative;\n top: -1px;\n}\n.label-default {\n background-color: #777777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n background-color: #5e5e5e;\n}\n.label-primary {\n background-color: #337ab7;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n background-color: #286090;\n}\n.label-success {\n background-color: #5cb85c;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n background-color: #449d44;\n}\n.label-info {\n background-color: #5bc0de;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n background-color: #31b0d5;\n}\n.label-warning {\n background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n background-color: #ec971f;\n}\n.label-danger {\n background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n background-color: #c9302c;\n}\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: 12px;\n font-weight: bold;\n color: #fff;\n line-height: 1;\n vertical-align: middle;\n white-space: nowrap;\n text-align: center;\n background-color: #777777;\n border-radius: 10px;\n}\n.badge:empty {\n display: none;\n}\n.btn .badge {\n position: relative;\n top: -1px;\n}\n.btn-xs .badge,\n.btn-group-xs > .btn .badge {\n top: 0;\n padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.list-group-item > .badge {\n float: right;\n}\n.list-group-item > .badge + .badge {\n margin-right: 5px;\n}\n.nav-pills > li > a > .badge {\n margin-left: 3px;\n}\n.jumbotron {\n padding-top: 30px;\n padding-bottom: 30px;\n margin-bottom: 30px;\n color: inherit;\n background-color: #eeeeee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n color: inherit;\n}\n.jumbotron p {\n margin-bottom: 15px;\n font-size: 21px;\n font-weight: 200;\n}\n.jumbotron > hr {\n border-top-color: #d5d5d5;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n border-radius: 6px;\n padding-left: 15px;\n padding-right: 15px;\n}\n.jumbotron .container {\n max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n .jumbotron {\n padding-top: 48px;\n padding-bottom: 48px;\n }\n .container .jumbotron,\n .container-fluid .jumbotron {\n padding-left: 60px;\n padding-right: 60px;\n }\n .jumbotron h1,\n .jumbotron .h1 {\n font-size: 63px;\n }\n}\n.thumbnail {\n display: block;\n padding: 4px;\n margin-bottom: 20px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: border 0.2s ease-in-out;\n -o-transition: border 0.2s ease-in-out;\n transition: border 0.2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n margin-left: auto;\n margin-right: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n border-color: #337ab7;\n}\n.thumbnail .caption {\n padding: 9px;\n color: #333333;\n}\n.alert {\n padding: 15px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.alert h4 {\n margin-top: 0;\n color: inherit;\n}\n.alert .alert-link {\n font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n margin-bottom: 0;\n}\n.alert > p + p {\n margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n}\n.alert-success {\n background-color: #dff0d8;\n border-color: #d6e9c6;\n color: #3c763d;\n}\n.alert-success hr {\n border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n color: #2b542c;\n}\n.alert-info {\n background-color: #d9edf7;\n border-color: #bce8f1;\n color: #31708f;\n}\n.alert-info hr {\n border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n color: #245269;\n}\n.alert-warning {\n background-color: #fcf8e3;\n border-color: #faebcc;\n color: #8a6d3b;\n}\n.alert-warning hr {\n border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n color: #66512c;\n}\n.alert-danger {\n background-color: #f2dede;\n border-color: #ebccd1;\n color: #a94442;\n}\n.alert-danger hr {\n border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n@keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n.progress {\n overflow: hidden;\n height: 20px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: 12px;\n line-height: 20px;\n color: #fff;\n text-align: center;\n background-color: #337ab7;\n -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n -webkit-transition: width 0.6s ease;\n -o-transition: width 0.6s ease;\n transition: width 0.6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n -webkit-animation: progress-bar-stripes 2s linear infinite;\n -o-animation: progress-bar-stripes 2s linear infinite;\n animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n background-color: #5cb85c;\n}\n.progress-striped .progress-bar-success {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-info {\n background-color: #5bc0de;\n}\n.progress-striped .progress-bar-info {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-warning {\n background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-danger {\n background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.media {\n margin-top: 15px;\n}\n.media:first-child {\n margin-top: 0;\n}\n.media,\n.media-body {\n zoom: 1;\n overflow: hidden;\n}\n.media-body {\n width: 10000px;\n}\n.media-object {\n display: block;\n}\n.media-object.img-thumbnail {\n max-width: none;\n}\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n.media-middle {\n vertical-align: middle;\n}\n.media-bottom {\n vertical-align: bottom;\n}\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n.list-group {\n margin-bottom: 20px;\n padding-left: 0;\n}\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n margin-bottom: -1px;\n background-color: #fff;\n border: 1px solid #ddd;\n}\n.list-group-item:first-child {\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n}\n.list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\na.list-group-item,\nbutton.list-group-item {\n color: #555;\n}\na.list-group-item .list-group-item-heading,\nbutton.list-group-item .list-group-item-heading {\n color: #333;\n}\na.list-group-item:hover,\nbutton.list-group-item:hover,\na.list-group-item:focus,\nbutton.list-group-item:focus {\n text-decoration: none;\n color: #555;\n background-color: #f5f5f5;\n}\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n background-color: #eeeeee;\n color: #777777;\n cursor: not-allowed;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n color: #777777;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n z-index: 2;\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n color: #c7ddef;\n}\n.list-group-item-success {\n color: #3c763d;\n background-color: #dff0d8;\n}\na.list-group-item-success,\nbutton.list-group-item-success {\n color: #3c763d;\n}\na.list-group-item-success .list-group-item-heading,\nbutton.list-group-item-success .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-success:hover,\nbutton.list-group-item-success:hover,\na.list-group-item-success:focus,\nbutton.list-group-item-success:focus {\n color: #3c763d;\n background-color: #d0e9c6;\n}\na.list-group-item-success.active,\nbutton.list-group-item-success.active,\na.list-group-item-success.active:hover,\nbutton.list-group-item-success.active:hover,\na.list-group-item-success.active:focus,\nbutton.list-group-item-success.active:focus {\n color: #fff;\n background-color: #3c763d;\n border-color: #3c763d;\n}\n.list-group-item-info {\n color: #31708f;\n background-color: #d9edf7;\n}\na.list-group-item-info,\nbutton.list-group-item-info {\n color: #31708f;\n}\na.list-group-item-info .list-group-item-heading,\nbutton.list-group-item-info .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-info:hover,\nbutton.list-group-item-info:hover,\na.list-group-item-info:focus,\nbutton.list-group-item-info:focus {\n color: #31708f;\n background-color: #c4e3f3;\n}\na.list-group-item-info.active,\nbutton.list-group-item-info.active,\na.list-group-item-info.active:hover,\nbutton.list-group-item-info.active:hover,\na.list-group-item-info.active:focus,\nbutton.list-group-item-info.active:focus {\n color: #fff;\n background-color: #31708f;\n border-color: #31708f;\n}\n.list-group-item-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n}\na.list-group-item-warning,\nbutton.list-group-item-warning {\n color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading,\nbutton.list-group-item-warning .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-warning:hover,\nbutton.list-group-item-warning:hover,\na.list-group-item-warning:focus,\nbutton.list-group-item-warning:focus {\n color: #8a6d3b;\n background-color: #faf2cc;\n}\na.list-group-item-warning.active,\nbutton.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\nbutton.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus,\nbutton.list-group-item-warning.active:focus {\n color: #fff;\n background-color: #8a6d3b;\n border-color: #8a6d3b;\n}\n.list-group-item-danger {\n color: #a94442;\n background-color: #f2dede;\n}\na.list-group-item-danger,\nbutton.list-group-item-danger {\n color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading,\nbutton.list-group-item-danger .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-danger:hover,\nbutton.list-group-item-danger:hover,\na.list-group-item-danger:focus,\nbutton.list-group-item-danger:focus {\n color: #a94442;\n background-color: #ebcccc;\n}\na.list-group-item-danger.active,\nbutton.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\nbutton.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus,\nbutton.list-group-item-danger.active:focus {\n color: #fff;\n background-color: #a94442;\n border-color: #a94442;\n}\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n.panel {\n margin-bottom: 20px;\n background-color: #fff;\n border: 1px solid transparent;\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.panel-body {\n padding: 15px;\n}\n.panel-heading {\n padding: 10px 15px;\n border-bottom: 1px solid transparent;\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n color: inherit;\n}\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: 16px;\n color: inherit;\n}\n.panel-title > a,\n.panel-title > small,\n.panel-title > .small,\n.panel-title > small > a,\n.panel-title > .small > a {\n color: inherit;\n}\n.panel-footer {\n padding: 10px 15px;\n background-color: #f5f5f5;\n border-top: 1px solid #ddd;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n border-top: 0;\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n border-bottom: 0;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n border-top-width: 0;\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n padding-left: 15px;\n padding-right: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n border-bottom-left-radius: 3px;\n border-bottom-right-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n border-top: 1px solid #ddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n border-bottom: 0;\n}\n.panel > .table-responsive {\n border: 0;\n margin-bottom: 0;\n}\n.panel-group {\n margin-bottom: 20px;\n}\n.panel-group .panel {\n margin-bottom: 0;\n border-radius: 4px;\n}\n.panel-group .panel + .panel {\n margin-top: 5px;\n}\n.panel-group .panel-heading {\n border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n border-top: 1px solid #ddd;\n}\n.panel-group .panel-footer {\n border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n border-bottom: 1px solid #ddd;\n}\n.panel-default {\n border-color: #ddd;\n}\n.panel-default > .panel-heading {\n color: #333333;\n background-color: #f5f5f5;\n border-color: #ddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ddd;\n}\n.panel-default > .panel-heading .badge {\n color: #f5f5f5;\n background-color: #333333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ddd;\n}\n.panel-primary {\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading {\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #337ab7;\n}\n.panel-primary > .panel-heading .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #337ab7;\n}\n.panel-success {\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n color: #dff0d8;\n background-color: #3c763d;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #d6e9c6;\n}\n.panel-info {\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #bce8f1;\n}\n.panel-info > .panel-heading .badge {\n color: #d9edf7;\n background-color: #31708f;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #bce8f1;\n}\n.panel-warning {\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n color: #fcf8e3;\n background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #faebcc;\n}\n.panel-danger {\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n color: #f2dede;\n background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n height: 100%;\n width: 100%;\n border: 0;\n}\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border: 1px solid #e3e3e3;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.well blockquote {\n border-color: #ddd;\n border-color: rgba(0, 0, 0, 0.15);\n}\n.well-lg {\n padding: 24px;\n border-radius: 6px;\n}\n.well-sm {\n padding: 9px;\n border-radius: 3px;\n}\n.close {\n float: right;\n font-size: 21px;\n font-weight: bold;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n opacity: 0.2;\n filter: alpha(opacity=20);\n}\n.close:hover,\n.close:focus {\n color: #000;\n text-decoration: none;\n cursor: pointer;\n opacity: 0.5;\n filter: alpha(opacity=50);\n}\nbutton.close {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n}\n.modal-open {\n overflow: hidden;\n}\n.modal {\n display: none;\n overflow: hidden;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1050;\n -webkit-overflow-scrolling: touch;\n outline: 0;\n}\n.modal.fade .modal-dialog {\n -webkit-transform: translate(0, -25%);\n -ms-transform: translate(0, -25%);\n -o-transform: translate(0, -25%);\n transform: translate(0, -25%);\n -webkit-transition: -webkit-transform 0.3s ease-out;\n -moz-transition: -moz-transform 0.3s ease-out;\n -o-transition: -o-transform 0.3s ease-out;\n transition: transform 0.3s ease-out;\n}\n.modal.in .modal-dialog {\n -webkit-transform: translate(0, 0);\n -ms-transform: translate(0, 0);\n -o-transform: translate(0, 0);\n transform: translate(0, 0);\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n.modal-content {\n position: relative;\n background-color: #fff;\n border: 1px solid #999;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n background-clip: padding-box;\n outline: 0;\n}\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1040;\n background-color: #000;\n}\n.modal-backdrop.fade {\n opacity: 0;\n filter: alpha(opacity=0);\n}\n.modal-backdrop.in {\n opacity: 0.5;\n filter: alpha(opacity=50);\n}\n.modal-header {\n padding: 15px;\n border-bottom: 1px solid #e5e5e5;\n}\n.modal-header .close {\n margin-top: -2px;\n}\n.modal-title {\n margin: 0;\n line-height: 1.42857143;\n}\n.modal-body {\n position: relative;\n padding: 15px;\n}\n.modal-footer {\n padding: 15px;\n text-align: right;\n border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0;\n}\n.modal-footer .btn-group .btn + .btn {\n margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n margin-left: 0;\n}\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n@media (min-width: 768px) {\n .modal-dialog {\n width: 600px;\n margin: 30px auto;\n }\n .modal-content {\n -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n }\n .modal-sm {\n width: 300px;\n }\n}\n@media (min-width: 992px) {\n .modal-lg {\n width: 900px;\n }\n}\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: 1.42857143;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n font-size: 12px;\n opacity: 0;\n filter: alpha(opacity=0);\n}\n.tooltip.in {\n opacity: 0.9;\n filter: alpha(opacity=90);\n}\n.tooltip.top {\n margin-top: -3px;\n padding: 5px 0;\n}\n.tooltip.right {\n margin-left: 3px;\n padding: 0 5px;\n}\n.tooltip.bottom {\n margin-top: 3px;\n padding: 5px 0;\n}\n.tooltip.left {\n margin-left: -3px;\n padding: 0 5px;\n}\n.tooltip-inner {\n max-width: 200px;\n padding: 3px 8px;\n color: #fff;\n text-align: center;\n background-color: #000;\n border-radius: 4px;\n}\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.tooltip.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-left .tooltip-arrow {\n bottom: 0;\n right: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-right .tooltip-arrow {\n bottom: 0;\n left: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -5px;\n border-width: 5px 5px 5px 0;\n border-right-color: #000;\n}\n.tooltip.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -5px;\n border-width: 5px 0 5px 5px;\n border-left-color: #000;\n}\n.tooltip.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n top: 0;\n right: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n top: 0;\n left: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: none;\n max-width: 276px;\n padding: 1px;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: 1.42857143;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n font-size: 14px;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n}\n.popover.top {\n margin-top: -10px;\n}\n.popover.right {\n margin-left: 10px;\n}\n.popover.bottom {\n margin-top: 10px;\n}\n.popover.left {\n margin-left: -10px;\n}\n.popover-title {\n margin: 0;\n padding: 8px 14px;\n font-size: 14px;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-radius: 5px 5px 0 0;\n}\n.popover-content {\n padding: 9px 14px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.popover > .arrow {\n border-width: 11px;\n}\n.popover > .arrow:after {\n border-width: 10px;\n content: \"\";\n}\n.popover.top > .arrow {\n left: 50%;\n margin-left: -11px;\n border-bottom-width: 0;\n border-top-color: #999999;\n border-top-color: rgba(0, 0, 0, 0.25);\n bottom: -11px;\n}\n.popover.top > .arrow:after {\n content: \" \";\n bottom: 1px;\n margin-left: -10px;\n border-bottom-width: 0;\n border-top-color: #fff;\n}\n.popover.right > .arrow {\n top: 50%;\n left: -11px;\n margin-top: -11px;\n border-left-width: 0;\n border-right-color: #999999;\n border-right-color: rgba(0, 0, 0, 0.25);\n}\n.popover.right > .arrow:after {\n content: \" \";\n left: 1px;\n bottom: -10px;\n border-left-width: 0;\n border-right-color: #fff;\n}\n.popover.bottom > .arrow {\n left: 50%;\n margin-left: -11px;\n border-top-width: 0;\n border-bottom-color: #999999;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n top: -11px;\n}\n.popover.bottom > .arrow:after {\n content: \" \";\n top: 1px;\n margin-left: -10px;\n border-top-width: 0;\n border-bottom-color: #fff;\n}\n.popover.left > .arrow {\n top: 50%;\n right: -11px;\n margin-top: -11px;\n border-right-width: 0;\n border-left-color: #999999;\n border-left-color: rgba(0, 0, 0, 0.25);\n}\n.popover.left > .arrow:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: #fff;\n bottom: -10px;\n}\n.carousel {\n position: relative;\n}\n.carousel-inner {\n position: relative;\n overflow: hidden;\n width: 100%;\n}\n.carousel-inner > .item {\n display: none;\n position: relative;\n -webkit-transition: 0.6s ease-in-out left;\n -o-transition: 0.6s ease-in-out left;\n transition: 0.6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n line-height: 1;\n}\n@media all and (transform-3d), (-webkit-transform-3d) {\n .carousel-inner > .item {\n -webkit-transition: -webkit-transform 0.6s ease-in-out;\n -moz-transition: -moz-transform 0.6s ease-in-out;\n -o-transition: -o-transform 0.6s ease-in-out;\n transition: transform 0.6s ease-in-out;\n -webkit-backface-visibility: hidden;\n -moz-backface-visibility: hidden;\n backface-visibility: hidden;\n -webkit-perspective: 1000px;\n -moz-perspective: 1000px;\n perspective: 1000px;\n }\n .carousel-inner > .item.next,\n .carousel-inner > .item.active.right {\n -webkit-transform: translate3d(100%, 0, 0);\n transform: translate3d(100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.prev,\n .carousel-inner > .item.active.left {\n -webkit-transform: translate3d(-100%, 0, 0);\n transform: translate3d(-100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.next.left,\n .carousel-inner > .item.prev.right,\n .carousel-inner > .item.active {\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n left: 0;\n }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n display: block;\n}\n.carousel-inner > .active {\n left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n}\n.carousel-inner > .next {\n left: 100%;\n}\n.carousel-inner > .prev {\n left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n left: 0;\n}\n.carousel-inner > .active.left {\n left: -100%;\n}\n.carousel-inner > .active.right {\n left: 100%;\n}\n.carousel-control {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: 15%;\n opacity: 0.5;\n filter: alpha(opacity=50);\n font-size: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n background-color: rgba(0, 0, 0, 0);\n}\n.carousel-control.left {\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n}\n.carousel-control.right {\n left: auto;\n right: 0;\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n}\n.carousel-control:hover,\n.carousel-control:focus {\n outline: 0;\n color: #fff;\n text-decoration: none;\n opacity: 0.9;\n filter: alpha(opacity=90);\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n margin-top: -10px;\n z-index: 5;\n display: inline-block;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n width: 20px;\n height: 20px;\n line-height: 1;\n font-family: serif;\n}\n.carousel-control .icon-prev:before {\n content: '\\2039';\n}\n.carousel-control .icon-next:before {\n content: '\\203a';\n}\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n margin-left: -30%;\n padding-left: 0;\n list-style: none;\n text-align: center;\n}\n.carousel-indicators li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n border: 1px solid #fff;\n border-radius: 10px;\n cursor: pointer;\n background-color: #000 \\9;\n background-color: rgba(0, 0, 0, 0);\n}\n.carousel-indicators .active {\n margin: 0;\n width: 12px;\n height: 12px;\n background-color: #fff;\n}\n.carousel-caption {\n position: absolute;\n left: 15%;\n right: 15%;\n bottom: 20px;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-caption .btn {\n text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-prev,\n .carousel-control .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -10px;\n font-size: 30px;\n }\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .icon-prev {\n margin-left: -10px;\n }\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-next {\n margin-right: -10px;\n }\n .carousel-caption {\n left: 20%;\n right: 20%;\n padding-bottom: 30px;\n }\n .carousel-indicators {\n bottom: 20px;\n }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-header:before,\n.modal-header:after,\n.modal-footer:before,\n.modal-footer:after {\n content: \" \";\n display: table;\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-header:after,\n.modal-footer:after {\n clear: both;\n}\n.center-block {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n.hidden {\n display: none !important;\n}\n.affix {\n position: fixed;\n}\n@-ms-viewport {\n width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n@media (max-width: 767px) {\n .visible-xs {\n display: block !important;\n }\n table.visible-xs {\n display: table !important;\n }\n tr.visible-xs {\n display: table-row !important;\n }\n th.visible-xs,\n td.visible-xs {\n display: table-cell !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-block {\n display: block !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline {\n display: inline !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm {\n display: block !important;\n }\n table.visible-sm {\n display: table !important;\n }\n tr.visible-sm {\n display: table-row !important;\n }\n th.visible-sm,\n td.visible-sm {\n display: table-cell !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-block {\n display: block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline {\n display: inline !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md {\n display: block !important;\n }\n table.visible-md {\n display: table !important;\n }\n tr.visible-md {\n display: table-row !important;\n }\n th.visible-md,\n td.visible-md {\n display: table-cell !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-block {\n display: block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline {\n display: inline !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg {\n display: block !important;\n }\n table.visible-lg {\n display: table !important;\n }\n tr.visible-lg {\n display: table-row !important;\n }\n th.visible-lg,\n td.visible-lg {\n display: table-cell !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-block {\n display: block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline {\n display: inline !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline-block {\n display: inline-block !important;\n }\n}\n@media (max-width: 767px) {\n .hidden-xs {\n display: none !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .hidden-sm {\n display: none !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .hidden-md {\n display: none !important;\n }\n}\n@media (min-width: 1200px) {\n .hidden-lg {\n display: none !important;\n }\n}\n.visible-print {\n display: none !important;\n}\n@media print {\n .visible-print {\n display: block !important;\n }\n table.visible-print {\n display: table !important;\n }\n tr.visible-print {\n display: table-row !important;\n }\n th.visible-print,\n td.visible-print {\n display: table-cell !important;\n }\n}\n.visible-print-block {\n display: none !important;\n}\n@media print {\n .visible-print-block {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n}\n@media print {\n .visible-print-inline {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n}\n@media print {\n .visible-print-inline-block {\n display: inline-block !important;\n }\n}\n@media print {\n .hidden-print {\n display: none !important;\n }\n}\n/*# sourceMappingURL=bootstrap.css.map */","/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\nhtml {\n font-family: sans-serif;\n -webkit-text-size-adjust: 100%;\n -ms-text-size-adjust: 100%;\n}\nbody {\n margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block;\n vertical-align: baseline;\n}\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n[hidden],\ntemplate {\n display: none;\n}\na {\n background-color: transparent;\n}\na:active,\na:hover {\n outline: 0;\n}\nabbr[title] {\n border-bottom: 1px dotted;\n}\nb,\nstrong {\n font-weight: bold;\n}\ndfn {\n font-style: italic;\n}\nh1 {\n margin: .67em 0;\n font-size: 2em;\n}\nmark {\n color: #000;\n background: #ff0;\n}\nsmall {\n font-size: 80%;\n}\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\nsup {\n top: -.5em;\n}\nsub {\n bottom: -.25em;\n}\nimg {\n border: 0;\n}\nsvg:not(:root) {\n overflow: hidden;\n}\nfigure {\n margin: 1em 40px;\n}\nhr {\n height: 0;\n -webkit-box-sizing: content-box;\n -moz-box-sizing: content-box;\n box-sizing: content-box;\n}\npre {\n overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n margin: 0;\n font: inherit;\n color: inherit;\n}\nbutton {\n overflow: visible;\n}\nbutton,\nselect {\n text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button;\n cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n padding: 0;\n border: 0;\n}\ninput {\n line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-box-sizing: content-box;\n -moz-box-sizing: content-box;\n box-sizing: content-box;\n -webkit-appearance: textfield;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\nfieldset {\n padding: .35em .625em .75em;\n margin: 0 2px;\n border: 1px solid #c0c0c0;\n}\nlegend {\n padding: 0;\n border: 0;\n}\ntextarea {\n overflow: auto;\n}\noptgroup {\n font-weight: bold;\n}\ntable {\n border-spacing: 0;\n border-collapse: collapse;\n}\ntd,\nth {\n padding: 0;\n}\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n *,\n *:before,\n *:after {\n color: #000 !important;\n text-shadow: none !important;\n background: transparent !important;\n -webkit-box-shadow: none !important;\n box-shadow: none !important;\n }\n a,\n a:visited {\n text-decoration: underline;\n }\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n pre,\n blockquote {\n border: 1px solid #999;\n\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n img {\n max-width: 100% !important;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n .navbar {\n display: none;\n }\n .btn > .caret,\n .dropup > .btn > .caret {\n border-top-color: #000 !important;\n }\n .label {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #ddd !important;\n }\n}\n@font-face {\n font-family: 'Glyphicons Halflings';\n\n src: url('../fonts/glyphicons-halflings-regular.eot');\n src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');\n}\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n content: \"\\002a\";\n}\n.glyphicon-plus:before {\n content: \"\\002b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n content: \"\\270f\";\n}\n.glyphicon-glass:before {\n content: \"\\e001\";\n}\n.glyphicon-music:before {\n content: \"\\e002\";\n}\n.glyphicon-search:before {\n content: \"\\e003\";\n}\n.glyphicon-heart:before {\n content: \"\\e005\";\n}\n.glyphicon-star:before {\n content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n content: \"\\e007\";\n}\n.glyphicon-user:before {\n content: \"\\e008\";\n}\n.glyphicon-film:before {\n content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n content: \"\\e010\";\n}\n.glyphicon-th:before {\n content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n content: \"\\e012\";\n}\n.glyphicon-ok:before {\n content: \"\\e013\";\n}\n.glyphicon-remove:before {\n content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n content: \"\\e016\";\n}\n.glyphicon-off:before {\n content: \"\\e017\";\n}\n.glyphicon-signal:before {\n content: \"\\e018\";\n}\n.glyphicon-cog:before {\n content: \"\\e019\";\n}\n.glyphicon-trash:before {\n content: \"\\e020\";\n}\n.glyphicon-home:before {\n content: \"\\e021\";\n}\n.glyphicon-file:before {\n content: \"\\e022\";\n}\n.glyphicon-time:before {\n content: \"\\e023\";\n}\n.glyphicon-road:before {\n content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n content: \"\\e025\";\n}\n.glyphicon-download:before {\n content: \"\\e026\";\n}\n.glyphicon-upload:before {\n content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n content: \"\\e032\";\n}\n.glyphicon-lock:before {\n content: \"\\e033\";\n}\n.glyphicon-flag:before {\n content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n content: \"\\e040\";\n}\n.glyphicon-tag:before {\n content: \"\\e041\";\n}\n.glyphicon-tags:before {\n content: \"\\e042\";\n}\n.glyphicon-book:before {\n content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n content: \"\\e044\";\n}\n.glyphicon-print:before {\n content: \"\\e045\";\n}\n.glyphicon-camera:before {\n content: \"\\e046\";\n}\n.glyphicon-font:before {\n content: \"\\e047\";\n}\n.glyphicon-bold:before {\n content: \"\\e048\";\n}\n.glyphicon-italic:before {\n content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n content: \"\\e055\";\n}\n.glyphicon-list:before {\n content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n content: \"\\e059\";\n}\n.glyphicon-picture:before {\n content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n content: \"\\e063\";\n}\n.glyphicon-tint:before {\n content: \"\\e064\";\n}\n.glyphicon-edit:before {\n content: \"\\e065\";\n}\n.glyphicon-share:before {\n content: \"\\e066\";\n}\n.glyphicon-check:before {\n content: \"\\e067\";\n}\n.glyphicon-move:before {\n content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n content: \"\\e070\";\n}\n.glyphicon-backward:before {\n content: \"\\e071\";\n}\n.glyphicon-play:before {\n content: \"\\e072\";\n}\n.glyphicon-pause:before {\n content: \"\\e073\";\n}\n.glyphicon-stop:before {\n content: \"\\e074\";\n}\n.glyphicon-forward:before {\n content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n content: \"\\e077\";\n}\n.glyphicon-eject:before {\n content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n content: \"\\e101\";\n}\n.glyphicon-gift:before {\n content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n content: \"\\e103\";\n}\n.glyphicon-fire:before {\n content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n content: \"\\e107\";\n}\n.glyphicon-plane:before {\n content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n content: \"\\e109\";\n}\n.glyphicon-random:before {\n content: \"\\e110\";\n}\n.glyphicon-comment:before {\n content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n content: \"\\e122\";\n}\n.glyphicon-bell:before {\n content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n content: \"\\e134\";\n}\n.glyphicon-globe:before {\n content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n content: \"\\e137\";\n}\n.glyphicon-filter:before {\n content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n content: \"\\e143\";\n}\n.glyphicon-link:before {\n content: \"\\e144\";\n}\n.glyphicon-phone:before {\n content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n content: \"\\e146\";\n}\n.glyphicon-usd:before {\n content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n content: \"\\e149\";\n}\n.glyphicon-sort:before {\n content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n content: \"\\e157\";\n}\n.glyphicon-expand:before {\n content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n content: \"\\e161\";\n}\n.glyphicon-flash:before {\n content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n content: \"\\e164\";\n}\n.glyphicon-record:before {\n content: \"\\e165\";\n}\n.glyphicon-save:before {\n content: \"\\e166\";\n}\n.glyphicon-open:before {\n content: \"\\e167\";\n}\n.glyphicon-saved:before {\n content: \"\\e168\";\n}\n.glyphicon-import:before {\n content: \"\\e169\";\n}\n.glyphicon-export:before {\n content: \"\\e170\";\n}\n.glyphicon-send:before {\n content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n content: \"\\e179\";\n}\n.glyphicon-header:before {\n content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n content: \"\\e183\";\n}\n.glyphicon-tower:before {\n content: \"\\e184\";\n}\n.glyphicon-stats:before {\n content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n content: \"\\e200\";\n}\n.glyphicon-cd:before {\n content: \"\\e201\";\n}\n.glyphicon-save-file:before {\n content: \"\\e202\";\n}\n.glyphicon-open-file:before {\n content: \"\\e203\";\n}\n.glyphicon-level-up:before {\n content: \"\\e204\";\n}\n.glyphicon-copy:before {\n content: \"\\e205\";\n}\n.glyphicon-paste:before {\n content: \"\\e206\";\n}\n.glyphicon-alert:before {\n content: \"\\e209\";\n}\n.glyphicon-equalizer:before {\n content: \"\\e210\";\n}\n.glyphicon-king:before {\n content: \"\\e211\";\n}\n.glyphicon-queen:before {\n content: \"\\e212\";\n}\n.glyphicon-pawn:before {\n content: \"\\e213\";\n}\n.glyphicon-bishop:before {\n content: \"\\e214\";\n}\n.glyphicon-knight:before {\n content: \"\\e215\";\n}\n.glyphicon-baby-formula:before {\n content: \"\\e216\";\n}\n.glyphicon-tent:before {\n content: \"\\26fa\";\n}\n.glyphicon-blackboard:before {\n content: \"\\e218\";\n}\n.glyphicon-bed:before {\n content: \"\\e219\";\n}\n.glyphicon-apple:before {\n content: \"\\f8ff\";\n}\n.glyphicon-erase:before {\n content: \"\\e221\";\n}\n.glyphicon-hourglass:before {\n content: \"\\231b\";\n}\n.glyphicon-lamp:before {\n content: \"\\e223\";\n}\n.glyphicon-duplicate:before {\n content: \"\\e224\";\n}\n.glyphicon-piggy-bank:before {\n content: \"\\e225\";\n}\n.glyphicon-scissors:before {\n content: \"\\e226\";\n}\n.glyphicon-bitcoin:before {\n content: \"\\e227\";\n}\n.glyphicon-btc:before {\n content: \"\\e227\";\n}\n.glyphicon-xbt:before {\n content: \"\\e227\";\n}\n.glyphicon-yen:before {\n content: \"\\00a5\";\n}\n.glyphicon-jpy:before {\n content: \"\\00a5\";\n}\n.glyphicon-ruble:before {\n content: \"\\20bd\";\n}\n.glyphicon-rub:before {\n content: \"\\20bd\";\n}\n.glyphicon-scale:before {\n content: \"\\e230\";\n}\n.glyphicon-ice-lolly:before {\n content: \"\\e231\";\n}\n.glyphicon-ice-lolly-tasted:before {\n content: \"\\e232\";\n}\n.glyphicon-education:before {\n content: \"\\e233\";\n}\n.glyphicon-option-horizontal:before {\n content: \"\\e234\";\n}\n.glyphicon-option-vertical:before {\n content: \"\\e235\";\n}\n.glyphicon-menu-hamburger:before {\n content: \"\\e236\";\n}\n.glyphicon-modal-window:before {\n content: \"\\e237\";\n}\n.glyphicon-oil:before {\n content: \"\\e238\";\n}\n.glyphicon-grain:before {\n content: \"\\e239\";\n}\n.glyphicon-sunglasses:before {\n content: \"\\e240\";\n}\n.glyphicon-text-size:before {\n content: \"\\e241\";\n}\n.glyphicon-text-color:before {\n content: \"\\e242\";\n}\n.glyphicon-text-background:before {\n content: \"\\e243\";\n}\n.glyphicon-object-align-top:before {\n content: \"\\e244\";\n}\n.glyphicon-object-align-bottom:before {\n content: \"\\e245\";\n}\n.glyphicon-object-align-horizontal:before {\n content: \"\\e246\";\n}\n.glyphicon-object-align-left:before {\n content: \"\\e247\";\n}\n.glyphicon-object-align-vertical:before {\n content: \"\\e248\";\n}\n.glyphicon-object-align-right:before {\n content: \"\\e249\";\n}\n.glyphicon-triangle-right:before {\n content: \"\\e250\";\n}\n.glyphicon-triangle-left:before {\n content: \"\\e251\";\n}\n.glyphicon-triangle-bottom:before {\n content: \"\\e252\";\n}\n.glyphicon-triangle-top:before {\n content: \"\\e253\";\n}\n.glyphicon-console:before {\n content: \"\\e254\";\n}\n.glyphicon-superscript:before {\n content: \"\\e255\";\n}\n.glyphicon-subscript:before {\n content: \"\\e256\";\n}\n.glyphicon-menu-left:before {\n content: \"\\e257\";\n}\n.glyphicon-menu-right:before {\n content: \"\\e258\";\n}\n.glyphicon-menu-down:before {\n content: \"\\e259\";\n}\n.glyphicon-menu-up:before {\n content: \"\\e260\";\n}\n* {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n*:before,\n*:after {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\nhtml {\n font-size: 10px;\n\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 14px;\n line-height: 1.42857143;\n color: #333;\n background-color: #fff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\na {\n color: #337ab7;\n text-decoration: none;\n}\na:hover,\na:focus {\n color: #23527c;\n text-decoration: underline;\n}\na:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\nfigure {\n margin: 0;\n}\nimg {\n vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n display: block;\n max-width: 100%;\n height: auto;\n}\n.img-rounded {\n border-radius: 6px;\n}\n.img-thumbnail {\n display: inline-block;\n max-width: 100%;\n height: auto;\n padding: 4px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: all .2s ease-in-out;\n -o-transition: all .2s ease-in-out;\n transition: all .2s ease-in-out;\n}\n.img-circle {\n border-radius: 50%;\n}\nhr {\n margin-top: 20px;\n margin-bottom: 20px;\n border: 0;\n border-top: 1px solid #eee;\n}\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n}\n[role=\"button\"] {\n cursor: pointer;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n font-family: inherit;\n font-weight: 500;\n line-height: 1.1;\n color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n font-weight: normal;\n line-height: 1;\n color: #777;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n margin-top: 20px;\n margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n margin-top: 10px;\n margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n font-size: 75%;\n}\nh1,\n.h1 {\n font-size: 36px;\n}\nh2,\n.h2 {\n font-size: 30px;\n}\nh3,\n.h3 {\n font-size: 24px;\n}\nh4,\n.h4 {\n font-size: 18px;\n}\nh5,\n.h5 {\n font-size: 14px;\n}\nh6,\n.h6 {\n font-size: 12px;\n}\np {\n margin: 0 0 10px;\n}\n.lead {\n margin-bottom: 20px;\n font-size: 16px;\n font-weight: 300;\n line-height: 1.4;\n}\n@media (min-width: 768px) {\n .lead {\n font-size: 21px;\n }\n}\nsmall,\n.small {\n font-size: 85%;\n}\nmark,\n.mark {\n padding: .2em;\n background-color: #fcf8e3;\n}\n.text-left {\n text-align: left;\n}\n.text-right {\n text-align: right;\n}\n.text-center {\n text-align: center;\n}\n.text-justify {\n text-align: justify;\n}\n.text-nowrap {\n white-space: nowrap;\n}\n.text-lowercase {\n text-transform: lowercase;\n}\n.text-uppercase {\n text-transform: uppercase;\n}\n.text-capitalize {\n text-transform: capitalize;\n}\n.text-muted {\n color: #777;\n}\n.text-primary {\n color: #337ab7;\n}\na.text-primary:hover,\na.text-primary:focus {\n color: #286090;\n}\n.text-success {\n color: #3c763d;\n}\na.text-success:hover,\na.text-success:focus {\n color: #2b542c;\n}\n.text-info {\n color: #31708f;\n}\na.text-info:hover,\na.text-info:focus {\n color: #245269;\n}\n.text-warning {\n color: #8a6d3b;\n}\na.text-warning:hover,\na.text-warning:focus {\n color: #66512c;\n}\n.text-danger {\n color: #a94442;\n}\na.text-danger:hover,\na.text-danger:focus {\n color: #843534;\n}\n.bg-primary {\n color: #fff;\n background-color: #337ab7;\n}\na.bg-primary:hover,\na.bg-primary:focus {\n background-color: #286090;\n}\n.bg-success {\n background-color: #dff0d8;\n}\na.bg-success:hover,\na.bg-success:focus {\n background-color: #c1e2b3;\n}\n.bg-info {\n background-color: #d9edf7;\n}\na.bg-info:hover,\na.bg-info:focus {\n background-color: #afd9ee;\n}\n.bg-warning {\n background-color: #fcf8e3;\n}\na.bg-warning:hover,\na.bg-warning:focus {\n background-color: #f7ecb5;\n}\n.bg-danger {\n background-color: #f2dede;\n}\na.bg-danger:hover,\na.bg-danger:focus {\n background-color: #e4b9b9;\n}\n.page-header {\n padding-bottom: 9px;\n margin: 40px 0 20px;\n border-bottom: 1px solid #eee;\n}\nul,\nol {\n margin-top: 0;\n margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n margin-bottom: 0;\n}\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n.list-inline {\n padding-left: 0;\n margin-left: -5px;\n list-style: none;\n}\n.list-inline > li {\n display: inline-block;\n padding-right: 5px;\n padding-left: 5px;\n}\ndl {\n margin-top: 0;\n margin-bottom: 20px;\n}\ndt,\ndd {\n line-height: 1.42857143;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0;\n}\n@media (min-width: 768px) {\n .dl-horizontal dt {\n float: left;\n width: 160px;\n overflow: hidden;\n clear: left;\n text-align: right;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .dl-horizontal dd {\n margin-left: 180px;\n }\n}\nabbr[title],\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted #777;\n}\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\nblockquote {\n padding: 10px 20px;\n margin: 0 0 20px;\n font-size: 17.5px;\n border-left: 5px solid #eee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n display: block;\n font-size: 80%;\n line-height: 1.42857143;\n color: #777;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n content: '\\2014 \\00A0';\n}\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n text-align: right;\n border-right: 5px solid #eee;\n border-left: 0;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n content: '';\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n content: '\\00A0 \\2014';\n}\naddress {\n margin-bottom: 20px;\n font-style: normal;\n line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: #c7254e;\n background-color: #f9f2f4;\n border-radius: 4px;\n}\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: #fff;\n background-color: #333;\n border-radius: 3px;\n -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);\n}\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\npre {\n display: block;\n padding: 9.5px;\n margin: 0 0 10px;\n font-size: 13px;\n line-height: 1.42857143;\n color: #333;\n word-break: break-all;\n word-wrap: break-word;\n background-color: #f5f5f5;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\npre code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n}\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n.container {\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n@media (min-width: 768px) {\n .container {\n width: 750px;\n }\n}\n@media (min-width: 992px) {\n .container {\n width: 970px;\n }\n}\n@media (min-width: 1200px) {\n .container {\n width: 1170px;\n }\n}\n.container-fluid {\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n.row {\n margin-right: -15px;\n margin-left: -15px;\n}\n.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {\n position: relative;\n min-height: 1px;\n padding-right: 15px;\n padding-left: 15px;\n}\n.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {\n float: left;\n}\n.col-xs-12 {\n width: 100%;\n}\n.col-xs-11 {\n width: 91.66666667%;\n}\n.col-xs-10 {\n width: 83.33333333%;\n}\n.col-xs-9 {\n width: 75%;\n}\n.col-xs-8 {\n width: 66.66666667%;\n}\n.col-xs-7 {\n width: 58.33333333%;\n}\n.col-xs-6 {\n width: 50%;\n}\n.col-xs-5 {\n width: 41.66666667%;\n}\n.col-xs-4 {\n width: 33.33333333%;\n}\n.col-xs-3 {\n width: 25%;\n}\n.col-xs-2 {\n width: 16.66666667%;\n}\n.col-xs-1 {\n width: 8.33333333%;\n}\n.col-xs-pull-12 {\n right: 100%;\n}\n.col-xs-pull-11 {\n right: 91.66666667%;\n}\n.col-xs-pull-10 {\n right: 83.33333333%;\n}\n.col-xs-pull-9 {\n right: 75%;\n}\n.col-xs-pull-8 {\n right: 66.66666667%;\n}\n.col-xs-pull-7 {\n right: 58.33333333%;\n}\n.col-xs-pull-6 {\n right: 50%;\n}\n.col-xs-pull-5 {\n right: 41.66666667%;\n}\n.col-xs-pull-4 {\n right: 33.33333333%;\n}\n.col-xs-pull-3 {\n right: 25%;\n}\n.col-xs-pull-2 {\n right: 16.66666667%;\n}\n.col-xs-pull-1 {\n right: 8.33333333%;\n}\n.col-xs-pull-0 {\n right: auto;\n}\n.col-xs-push-12 {\n left: 100%;\n}\n.col-xs-push-11 {\n left: 91.66666667%;\n}\n.col-xs-push-10 {\n left: 83.33333333%;\n}\n.col-xs-push-9 {\n left: 75%;\n}\n.col-xs-push-8 {\n left: 66.66666667%;\n}\n.col-xs-push-7 {\n left: 58.33333333%;\n}\n.col-xs-push-6 {\n left: 50%;\n}\n.col-xs-push-5 {\n left: 41.66666667%;\n}\n.col-xs-push-4 {\n left: 33.33333333%;\n}\n.col-xs-push-3 {\n left: 25%;\n}\n.col-xs-push-2 {\n left: 16.66666667%;\n}\n.col-xs-push-1 {\n left: 8.33333333%;\n}\n.col-xs-push-0 {\n left: auto;\n}\n.col-xs-offset-12 {\n margin-left: 100%;\n}\n.col-xs-offset-11 {\n margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n margin-left: 75%;\n}\n.col-xs-offset-8 {\n margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n margin-left: 50%;\n}\n.col-xs-offset-5 {\n margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n margin-left: 25%;\n}\n.col-xs-offset-2 {\n margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n margin-left: 0;\n}\n@media (min-width: 768px) {\n .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {\n float: left;\n }\n .col-sm-12 {\n width: 100%;\n }\n .col-sm-11 {\n width: 91.66666667%;\n }\n .col-sm-10 {\n width: 83.33333333%;\n }\n .col-sm-9 {\n width: 75%;\n }\n .col-sm-8 {\n width: 66.66666667%;\n }\n .col-sm-7 {\n width: 58.33333333%;\n }\n .col-sm-6 {\n width: 50%;\n }\n .col-sm-5 {\n width: 41.66666667%;\n }\n .col-sm-4 {\n width: 33.33333333%;\n }\n .col-sm-3 {\n width: 25%;\n }\n .col-sm-2 {\n width: 16.66666667%;\n }\n .col-sm-1 {\n width: 8.33333333%;\n }\n .col-sm-pull-12 {\n right: 100%;\n }\n .col-sm-pull-11 {\n right: 91.66666667%;\n }\n .col-sm-pull-10 {\n right: 83.33333333%;\n }\n .col-sm-pull-9 {\n right: 75%;\n }\n .col-sm-pull-8 {\n right: 66.66666667%;\n }\n .col-sm-pull-7 {\n right: 58.33333333%;\n }\n .col-sm-pull-6 {\n right: 50%;\n }\n .col-sm-pull-5 {\n right: 41.66666667%;\n }\n .col-sm-pull-4 {\n right: 33.33333333%;\n }\n .col-sm-pull-3 {\n right: 25%;\n }\n .col-sm-pull-2 {\n right: 16.66666667%;\n }\n .col-sm-pull-1 {\n right: 8.33333333%;\n }\n .col-sm-pull-0 {\n right: auto;\n }\n .col-sm-push-12 {\n left: 100%;\n }\n .col-sm-push-11 {\n left: 91.66666667%;\n }\n .col-sm-push-10 {\n left: 83.33333333%;\n }\n .col-sm-push-9 {\n left: 75%;\n }\n .col-sm-push-8 {\n left: 66.66666667%;\n }\n .col-sm-push-7 {\n left: 58.33333333%;\n }\n .col-sm-push-6 {\n left: 50%;\n }\n .col-sm-push-5 {\n left: 41.66666667%;\n }\n .col-sm-push-4 {\n left: 33.33333333%;\n }\n .col-sm-push-3 {\n left: 25%;\n }\n .col-sm-push-2 {\n left: 16.66666667%;\n }\n .col-sm-push-1 {\n left: 8.33333333%;\n }\n .col-sm-push-0 {\n left: auto;\n }\n .col-sm-offset-12 {\n margin-left: 100%;\n }\n .col-sm-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-sm-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-sm-offset-9 {\n margin-left: 75%;\n }\n .col-sm-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-sm-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-sm-offset-6 {\n margin-left: 50%;\n }\n .col-sm-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-sm-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-sm-offset-3 {\n margin-left: 25%;\n }\n .col-sm-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-sm-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-sm-offset-0 {\n margin-left: 0;\n }\n}\n@media (min-width: 992px) {\n .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {\n float: left;\n }\n .col-md-12 {\n width: 100%;\n }\n .col-md-11 {\n width: 91.66666667%;\n }\n .col-md-10 {\n width: 83.33333333%;\n }\n .col-md-9 {\n width: 75%;\n }\n .col-md-8 {\n width: 66.66666667%;\n }\n .col-md-7 {\n width: 58.33333333%;\n }\n .col-md-6 {\n width: 50%;\n }\n .col-md-5 {\n width: 41.66666667%;\n }\n .col-md-4 {\n width: 33.33333333%;\n }\n .col-md-3 {\n width: 25%;\n }\n .col-md-2 {\n width: 16.66666667%;\n }\n .col-md-1 {\n width: 8.33333333%;\n }\n .col-md-pull-12 {\n right: 100%;\n }\n .col-md-pull-11 {\n right: 91.66666667%;\n }\n .col-md-pull-10 {\n right: 83.33333333%;\n }\n .col-md-pull-9 {\n right: 75%;\n }\n .col-md-pull-8 {\n right: 66.66666667%;\n }\n .col-md-pull-7 {\n right: 58.33333333%;\n }\n .col-md-pull-6 {\n right: 50%;\n }\n .col-md-pull-5 {\n right: 41.66666667%;\n }\n .col-md-pull-4 {\n right: 33.33333333%;\n }\n .col-md-pull-3 {\n right: 25%;\n }\n .col-md-pull-2 {\n right: 16.66666667%;\n }\n .col-md-pull-1 {\n right: 8.33333333%;\n }\n .col-md-pull-0 {\n right: auto;\n }\n .col-md-push-12 {\n left: 100%;\n }\n .col-md-push-11 {\n left: 91.66666667%;\n }\n .col-md-push-10 {\n left: 83.33333333%;\n }\n .col-md-push-9 {\n left: 75%;\n }\n .col-md-push-8 {\n left: 66.66666667%;\n }\n .col-md-push-7 {\n left: 58.33333333%;\n }\n .col-md-push-6 {\n left: 50%;\n }\n .col-md-push-5 {\n left: 41.66666667%;\n }\n .col-md-push-4 {\n left: 33.33333333%;\n }\n .col-md-push-3 {\n left: 25%;\n }\n .col-md-push-2 {\n left: 16.66666667%;\n }\n .col-md-push-1 {\n left: 8.33333333%;\n }\n .col-md-push-0 {\n left: auto;\n }\n .col-md-offset-12 {\n margin-left: 100%;\n }\n .col-md-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-md-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-md-offset-9 {\n margin-left: 75%;\n }\n .col-md-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-md-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-md-offset-6 {\n margin-left: 50%;\n }\n .col-md-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-md-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-md-offset-3 {\n margin-left: 25%;\n }\n .col-md-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-md-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-md-offset-0 {\n margin-left: 0;\n }\n}\n@media (min-width: 1200px) {\n .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {\n float: left;\n }\n .col-lg-12 {\n width: 100%;\n }\n .col-lg-11 {\n width: 91.66666667%;\n }\n .col-lg-10 {\n width: 83.33333333%;\n }\n .col-lg-9 {\n width: 75%;\n }\n .col-lg-8 {\n width: 66.66666667%;\n }\n .col-lg-7 {\n width: 58.33333333%;\n }\n .col-lg-6 {\n width: 50%;\n }\n .col-lg-5 {\n width: 41.66666667%;\n }\n .col-lg-4 {\n width: 33.33333333%;\n }\n .col-lg-3 {\n width: 25%;\n }\n .col-lg-2 {\n width: 16.66666667%;\n }\n .col-lg-1 {\n width: 8.33333333%;\n }\n .col-lg-pull-12 {\n right: 100%;\n }\n .col-lg-pull-11 {\n right: 91.66666667%;\n }\n .col-lg-pull-10 {\n right: 83.33333333%;\n }\n .col-lg-pull-9 {\n right: 75%;\n }\n .col-lg-pull-8 {\n right: 66.66666667%;\n }\n .col-lg-pull-7 {\n right: 58.33333333%;\n }\n .col-lg-pull-6 {\n right: 50%;\n }\n .col-lg-pull-5 {\n right: 41.66666667%;\n }\n .col-lg-pull-4 {\n right: 33.33333333%;\n }\n .col-lg-pull-3 {\n right: 25%;\n }\n .col-lg-pull-2 {\n right: 16.66666667%;\n }\n .col-lg-pull-1 {\n right: 8.33333333%;\n }\n .col-lg-pull-0 {\n right: auto;\n }\n .col-lg-push-12 {\n left: 100%;\n }\n .col-lg-push-11 {\n left: 91.66666667%;\n }\n .col-lg-push-10 {\n left: 83.33333333%;\n }\n .col-lg-push-9 {\n left: 75%;\n }\n .col-lg-push-8 {\n left: 66.66666667%;\n }\n .col-lg-push-7 {\n left: 58.33333333%;\n }\n .col-lg-push-6 {\n left: 50%;\n }\n .col-lg-push-5 {\n left: 41.66666667%;\n }\n .col-lg-push-4 {\n left: 33.33333333%;\n }\n .col-lg-push-3 {\n left: 25%;\n }\n .col-lg-push-2 {\n left: 16.66666667%;\n }\n .col-lg-push-1 {\n left: 8.33333333%;\n }\n .col-lg-push-0 {\n left: auto;\n }\n .col-lg-offset-12 {\n margin-left: 100%;\n }\n .col-lg-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-lg-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-lg-offset-9 {\n margin-left: 75%;\n }\n .col-lg-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-lg-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-lg-offset-6 {\n margin-left: 50%;\n }\n .col-lg-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-lg-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-lg-offset-3 {\n margin-left: 25%;\n }\n .col-lg-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-lg-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-lg-offset-0 {\n margin-left: 0;\n }\n}\ntable {\n background-color: transparent;\n}\ncaption {\n padding-top: 8px;\n padding-bottom: 8px;\n color: #777;\n text-align: left;\n}\nth {\n text-align: left;\n}\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n padding: 8px;\n line-height: 1.42857143;\n vertical-align: top;\n border-top: 1px solid #ddd;\n}\n.table > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid #ddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n border-top: 0;\n}\n.table > tbody + tbody {\n border-top: 2px solid #ddd;\n}\n.table .table {\n background-color: #fff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n padding: 5px;\n}\n.table-bordered {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-of-type(odd) {\n background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n background-color: #f5f5f5;\n}\ntable col[class*=\"col-\"] {\n position: static;\n display: table-column;\n float: none;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n position: static;\n display: table-cell;\n float: none;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n background-color: #ebcccc;\n}\n.table-responsive {\n min-height: .01%;\n overflow-x: auto;\n}\n@media screen and (max-width: 767px) {\n .table-responsive {\n width: 100%;\n margin-bottom: 15px;\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid #ddd;\n }\n .table-responsive > .table {\n margin-bottom: 0;\n }\n .table-responsive > .table > thead > tr > th,\n .table-responsive > .table > tbody > tr > th,\n .table-responsive > .table > tfoot > tr > th,\n .table-responsive > .table > thead > tr > td,\n .table-responsive > .table > tbody > tr > td,\n .table-responsive > .table > tfoot > tr > td {\n white-space: nowrap;\n }\n .table-responsive > .table-bordered {\n border: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:first-child,\n .table-responsive > .table-bordered > tbody > tr > th:first-child,\n .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n .table-responsive > .table-bordered > thead > tr > td:first-child,\n .table-responsive > .table-bordered > tbody > tr > td:first-child,\n .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:last-child,\n .table-responsive > .table-bordered > tbody > tr > th:last-child,\n .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n .table-responsive > .table-bordered > thead > tr > td:last-child,\n .table-responsive > .table-bordered > tbody > tr > td:last-child,\n .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n }\n .table-responsive > .table-bordered > tbody > tr:last-child > th,\n .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n .table-responsive > .table-bordered > tbody > tr:last-child > td,\n .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n border-bottom: 0;\n }\n}\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: 20px;\n font-size: 21px;\n line-height: inherit;\n color: #333;\n border: 0;\n border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n display: inline-block;\n max-width: 100%;\n margin-bottom: 5px;\n font-weight: bold;\n}\ninput[type=\"search\"] {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9;\n line-height: normal;\n}\ninput[type=\"file\"] {\n display: block;\n}\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\nselect[multiple],\nselect[size] {\n height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\noutput {\n display: block;\n padding-top: 7px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555;\n}\n.form-control {\n display: block;\n width: 100%;\n height: 34px;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555;\n background-color: #fff;\n background-image: none;\n border: 1px solid #ccc;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;\n -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n border-color: #66afe9;\n outline: 0;\n -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);\n box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);\n}\n.form-control::-moz-placeholder {\n color: #999;\n opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n color: #999;\n}\n.form-control::-webkit-input-placeholder {\n color: #999;\n}\n.form-control::-ms-expand {\n background-color: transparent;\n border: 0;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n background-color: #eee;\n opacity: 1;\n}\n.form-control[disabled],\nfieldset[disabled] .form-control {\n cursor: not-allowed;\n}\ntextarea.form-control {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: none;\n}\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n input[type=\"date\"].form-control,\n input[type=\"time\"].form-control,\n input[type=\"datetime-local\"].form-control,\n input[type=\"month\"].form-control {\n line-height: 34px;\n }\n input[type=\"date\"].input-sm,\n input[type=\"time\"].input-sm,\n input[type=\"datetime-local\"].input-sm,\n input[type=\"month\"].input-sm,\n .input-group-sm input[type=\"date\"],\n .input-group-sm input[type=\"time\"],\n .input-group-sm input[type=\"datetime-local\"],\n .input-group-sm input[type=\"month\"] {\n line-height: 30px;\n }\n input[type=\"date\"].input-lg,\n input[type=\"time\"].input-lg,\n input[type=\"datetime-local\"].input-lg,\n input[type=\"month\"].input-lg,\n .input-group-lg input[type=\"date\"],\n .input-group-lg input[type=\"time\"],\n .input-group-lg input[type=\"datetime-local\"],\n .input-group-lg input[type=\"month\"] {\n line-height: 46px;\n }\n}\n.form-group {\n margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.radio label,\n.checkbox label {\n min-height: 20px;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-top: 4px \\9;\n margin-left: -20px;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n position: relative;\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n vertical-align: middle;\n cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n cursor: not-allowed;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n cursor: not-allowed;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n cursor: not-allowed;\n}\n.form-control-static {\n min-height: 34px;\n padding-top: 7px;\n padding-bottom: 7px;\n margin-bottom: 0;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n padding-right: 0;\n padding-left: 0;\n}\n.input-sm {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-sm {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-sm,\nselect[multiple].input-sm {\n height: auto;\n}\n.form-group-sm .form-control {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.form-group-sm select.form-control {\n height: 30px;\n line-height: 30px;\n}\n.form-group-sm textarea.form-control,\n.form-group-sm select[multiple].form-control {\n height: auto;\n}\n.form-group-sm .form-control-static {\n height: 30px;\n min-height: 32px;\n padding: 6px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.input-lg {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-lg {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-lg,\nselect[multiple].input-lg {\n height: auto;\n}\n.form-group-lg .form-control {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.form-group-lg select.form-control {\n height: 46px;\n line-height: 46px;\n}\n.form-group-lg textarea.form-control,\n.form-group-lg select[multiple].form-control {\n height: auto;\n}\n.form-group-lg .form-control-static {\n height: 46px;\n min-height: 38px;\n padding: 11px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.has-feedback {\n position: relative;\n}\n.has-feedback .form-control {\n padding-right: 42.5px;\n}\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n display: block;\n width: 34px;\n height: 34px;\n line-height: 34px;\n text-align: center;\n pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n width: 46px;\n height: 46px;\n line-height: 46px;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n width: 30px;\n height: 30px;\n line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n color: #3c763d;\n}\n.has-success .form-control {\n border-color: #3c763d;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n}\n.has-success .form-control:focus {\n border-color: #2b542c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #3c763d;\n}\n.has-success .form-control-feedback {\n color: #3c763d;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n color: #8a6d3b;\n}\n.has-warning .form-control {\n border-color: #8a6d3b;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n}\n.has-warning .form-control:focus {\n border-color: #66512c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #8a6d3b;\n}\n.has-warning .form-control-feedback {\n color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n color: #a94442;\n}\n.has-error .form-control {\n border-color: #a94442;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n}\n.has-error .form-control:focus {\n border-color: #843534;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n color: #a94442;\n background-color: #f2dede;\n border-color: #a94442;\n}\n.has-error .form-control-feedback {\n color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n top: 0;\n}\n.help-block {\n display: block;\n margin-top: 5px;\n margin-bottom: 10px;\n color: #737373;\n}\n@media (min-width: 768px) {\n .form-inline .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-static {\n display: inline-block;\n }\n .form-inline .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .form-inline .input-group .input-group-addon,\n .form-inline .input-group .input-group-btn,\n .form-inline .input-group .form-control {\n width: auto;\n }\n .form-inline .input-group > .form-control {\n width: 100%;\n }\n .form-inline .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio,\n .form-inline .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio label,\n .form-inline .checkbox label {\n padding-left: 0;\n }\n .form-inline .radio input[type=\"radio\"],\n .form-inline .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .form-inline .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n padding-top: 7px;\n margin-top: 0;\n margin-bottom: 0;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n min-height: 27px;\n}\n.form-horizontal .form-group {\n margin-right: -15px;\n margin-left: -15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .control-label {\n padding-top: 7px;\n margin-bottom: 0;\n text-align: right;\n }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n right: 15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-lg .control-label {\n padding-top: 11px;\n font-size: 18px;\n }\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-sm .control-label {\n padding-top: 6px;\n font-size: 12px;\n }\n}\n.btn {\n display: inline-block;\n padding: 6px 12px;\n margin-bottom: 0;\n font-size: 14px;\n font-weight: normal;\n line-height: 1.42857143;\n text-align: center;\n white-space: nowrap;\n vertical-align: middle;\n -ms-touch-action: manipulation;\n touch-action: manipulation;\n cursor: pointer;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n background-image: none;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n color: #333;\n text-decoration: none;\n}\n.btn:active,\n.btn.active {\n background-image: none;\n outline: 0;\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n cursor: not-allowed;\n filter: alpha(opacity=65);\n -webkit-box-shadow: none;\n box-shadow: none;\n opacity: .65;\n}\na.btn.disabled,\nfieldset[disabled] a.btn {\n pointer-events: none;\n}\n.btn-default {\n color: #333;\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default:focus,\n.btn-default.focus {\n color: #333;\n background-color: #e6e6e6;\n border-color: #8c8c8c;\n}\n.btn-default:hover {\n color: #333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n color: #333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active:hover,\n.btn-default.active:hover,\n.open > .dropdown-toggle.btn-default:hover,\n.btn-default:active:focus,\n.btn-default.active:focus,\n.open > .dropdown-toggle.btn-default:focus,\n.btn-default:active.focus,\n.btn-default.active.focus,\n.open > .dropdown-toggle.btn-default.focus {\n color: #333;\n background-color: #d4d4d4;\n border-color: #8c8c8c;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n background-image: none;\n}\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus {\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default .badge {\n color: #fff;\n background-color: #333;\n}\n.btn-primary {\n color: #fff;\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary:focus,\n.btn-primary.focus {\n color: #fff;\n background-color: #286090;\n border-color: #122b40;\n}\n.btn-primary:hover {\n color: #fff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n color: #fff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active:hover,\n.btn-primary.active:hover,\n.open > .dropdown-toggle.btn-primary:hover,\n.btn-primary:active:focus,\n.btn-primary.active:focus,\n.open > .dropdown-toggle.btn-primary:focus,\n.btn-primary:active.focus,\n.btn-primary.active.focus,\n.open > .dropdown-toggle.btn-primary.focus {\n color: #fff;\n background-color: #204d74;\n border-color: #122b40;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n background-image: none;\n}\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus {\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.btn-success {\n color: #fff;\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success:focus,\n.btn-success.focus {\n color: #fff;\n background-color: #449d44;\n border-color: #255625;\n}\n.btn-success:hover {\n color: #fff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n color: #fff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active:hover,\n.btn-success.active:hover,\n.open > .dropdown-toggle.btn-success:hover,\n.btn-success:active:focus,\n.btn-success.active:focus,\n.open > .dropdown-toggle.btn-success:focus,\n.btn-success:active.focus,\n.btn-success.active.focus,\n.open > .dropdown-toggle.btn-success.focus {\n color: #fff;\n background-color: #398439;\n border-color: #255625;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n background-image: none;\n}\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus {\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success .badge {\n color: #5cb85c;\n background-color: #fff;\n}\n.btn-info {\n color: #fff;\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info:focus,\n.btn-info.focus {\n color: #fff;\n background-color: #31b0d5;\n border-color: #1b6d85;\n}\n.btn-info:hover {\n color: #fff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n color: #fff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active:hover,\n.btn-info.active:hover,\n.open > .dropdown-toggle.btn-info:hover,\n.btn-info:active:focus,\n.btn-info.active:focus,\n.open > .dropdown-toggle.btn-info:focus,\n.btn-info:active.focus,\n.btn-info.active.focus,\n.open > .dropdown-toggle.btn-info.focus {\n color: #fff;\n background-color: #269abc;\n border-color: #1b6d85;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n background-image: none;\n}\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus {\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info .badge {\n color: #5bc0de;\n background-color: #fff;\n}\n.btn-warning {\n color: #fff;\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning:focus,\n.btn-warning.focus {\n color: #fff;\n background-color: #ec971f;\n border-color: #985f0d;\n}\n.btn-warning:hover {\n color: #fff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n color: #fff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active:hover,\n.btn-warning.active:hover,\n.open > .dropdown-toggle.btn-warning:hover,\n.btn-warning:active:focus,\n.btn-warning.active:focus,\n.open > .dropdown-toggle.btn-warning:focus,\n.btn-warning:active.focus,\n.btn-warning.active.focus,\n.open > .dropdown-toggle.btn-warning.focus {\n color: #fff;\n background-color: #d58512;\n border-color: #985f0d;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n background-image: none;\n}\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus {\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning .badge {\n color: #f0ad4e;\n background-color: #fff;\n}\n.btn-danger {\n color: #fff;\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger:focus,\n.btn-danger.focus {\n color: #fff;\n background-color: #c9302c;\n border-color: #761c19;\n}\n.btn-danger:hover {\n color: #fff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n color: #fff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active:hover,\n.btn-danger.active:hover,\n.open > .dropdown-toggle.btn-danger:hover,\n.btn-danger:active:focus,\n.btn-danger.active:focus,\n.open > .dropdown-toggle.btn-danger:focus,\n.btn-danger:active.focus,\n.btn-danger.active.focus,\n.open > .dropdown-toggle.btn-danger.focus {\n color: #fff;\n background-color: #ac2925;\n border-color: #761c19;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n background-image: none;\n}\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus {\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger .badge {\n color: #d9534f;\n background-color: #fff;\n}\n.btn-link {\n font-weight: normal;\n color: #337ab7;\n border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n background-color: transparent;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n color: #23527c;\n text-decoration: underline;\n background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n color: #777;\n text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n padding: 1px 5px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-block {\n display: block;\n width: 100%;\n}\n.btn-block + .btn-block {\n margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n.fade {\n opacity: 0;\n -webkit-transition: opacity .15s linear;\n -o-transition: opacity .15s linear;\n transition: opacity .15s linear;\n}\n.fade.in {\n opacity: 1;\n}\n.collapse {\n display: none;\n}\n.collapse.in {\n display: block;\n}\ntr.collapse.in {\n display: table-row;\n}\ntbody.collapse.in {\n display: table-row-group;\n}\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n -webkit-transition-timing-function: ease;\n -o-transition-timing-function: ease;\n transition-timing-function: ease;\n -webkit-transition-duration: .35s;\n -o-transition-duration: .35s;\n transition-duration: .35s;\n -webkit-transition-property: height, visibility;\n -o-transition-property: height, visibility;\n transition-property: height, visibility;\n}\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: 4px dashed;\n border-top: 4px solid \\9;\n border-right: 4px solid transparent;\n border-left: 4px solid transparent;\n}\n.dropup,\n.dropdown {\n position: relative;\n}\n.dropdown-toggle:focus {\n outline: 0;\n}\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0;\n font-size: 14px;\n text-align: left;\n list-style: none;\n background-color: #fff;\n -webkit-background-clip: padding-box;\n background-clip: padding-box;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, .15);\n border-radius: 4px;\n -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175);\n box-shadow: 0 6px 12px rgba(0, 0, 0, .175);\n}\n.dropdown-menu.pull-right {\n right: 0;\n left: auto;\n}\n.dropdown-menu .divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: 1.42857143;\n color: #333;\n white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n color: #262626;\n text-decoration: none;\n background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n color: #fff;\n text-decoration: none;\n background-color: #337ab7;\n outline: 0;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n color: #777;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n text-decoration: none;\n cursor: not-allowed;\n background-color: transparent;\n background-image: none;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.open > .dropdown-menu {\n display: block;\n}\n.open > a {\n outline: 0;\n}\n.dropdown-menu-right {\n right: 0;\n left: auto;\n}\n.dropdown-menu-left {\n right: auto;\n left: 0;\n}\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: 12px;\n line-height: 1.42857143;\n color: #777;\n white-space: nowrap;\n}\n.dropdown-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 990;\n}\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n content: \"\";\n border-top: 0;\n border-bottom: 4px dashed;\n border-bottom: 4px solid \\9;\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n}\n@media (min-width: 768px) {\n .navbar-right .dropdown-menu {\n right: 0;\n left: auto;\n }\n .navbar-right .dropdown-menu-left {\n right: auto;\n left: 0;\n }\n}\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n z-index: 2;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n margin-left: -1px;\n}\n.btn-toolbar {\n margin-left: -5px;\n}\n.btn-toolbar .btn,\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n.btn-group > .btn:first-child {\n margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n padding-right: 8px;\n padding-left: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-right: 12px;\n padding-left: 12px;\n}\n.btn-group.open .dropdown-toggle {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn .caret {\n margin-left: 0;\n}\n.btn-lg .caret {\n border-width: 5px 5px 0;\n border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n display: table-cell;\n float: none;\n width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n left: auto;\n}\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n.input-group {\n position: relative;\n display: table;\n border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n float: none;\n padding-right: 0;\n padding-left: 0;\n}\n.input-group .form-control {\n position: relative;\n z-index: 2;\n float: left;\n width: 100%;\n margin-bottom: 0;\n}\n.input-group .form-control:focus {\n z-index: 3;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle;\n}\n.input-group-addon {\n padding: 6px 12px;\n font-size: 14px;\n font-weight: normal;\n line-height: 1;\n color: #555;\n text-align: center;\n background-color: #eee;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\n.input-group-addon.input-sm {\n padding: 5px 10px;\n font-size: 12px;\n border-radius: 3px;\n}\n.input-group-addon.input-lg {\n padding: 10px 16px;\n font-size: 18px;\n border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n.input-group-btn {\n position: relative;\n font-size: 0;\n white-space: nowrap;\n}\n.input-group-btn > .btn {\n position: relative;\n}\n.input-group-btn > .btn + .btn {\n margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n z-index: 2;\n margin-left: -1px;\n}\n.nav {\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n.nav > li {\n position: relative;\n display: block;\n}\n.nav > li > a {\n position: relative;\n display: block;\n padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n text-decoration: none;\n background-color: #eee;\n}\n.nav > li.disabled > a {\n color: #777;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n color: #777;\n text-decoration: none;\n cursor: not-allowed;\n background-color: transparent;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n background-color: #eee;\n border-color: #337ab7;\n}\n.nav .nav-divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.nav > li > a > img {\n max-width: none;\n}\n.nav-tabs {\n border-bottom: 1px solid #ddd;\n}\n.nav-tabs > li {\n float: left;\n margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n margin-right: 2px;\n line-height: 1.42857143;\n border: 1px solid transparent;\n border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n border-color: #eee #eee #ddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n color: #555;\n cursor: default;\n background-color: #fff;\n border: 1px solid #ddd;\n border-bottom-color: transparent;\n}\n.nav-tabs.nav-justified {\n width: 100%;\n border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n float: none;\n}\n.nav-tabs.nav-justified > li > a {\n margin-bottom: 5px;\n text-align: center;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-tabs.nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs.nav-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs.nav-justified > .active > a,\n .nav-tabs.nav-justified > .active > a:hover,\n .nav-tabs.nav-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.nav-pills > li {\n float: left;\n}\n.nav-pills > li > a {\n border-radius: 4px;\n}\n.nav-pills > li + li {\n margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n color: #fff;\n background-color: #337ab7;\n}\n.nav-stacked > li {\n float: none;\n}\n.nav-stacked > li + li {\n margin-top: 2px;\n margin-left: 0;\n}\n.nav-justified {\n width: 100%;\n}\n.nav-justified > li {\n float: none;\n}\n.nav-justified > li > a {\n margin-bottom: 5px;\n text-align: center;\n}\n.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs-justified {\n border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs-justified > .active > a,\n .nav-tabs-justified > .active > a:hover,\n .nav-tabs-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.tab-content > .tab-pane {\n display: none;\n}\n.tab-content > .active {\n display: block;\n}\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.navbar {\n position: relative;\n min-height: 50px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n .navbar {\n border-radius: 4px;\n }\n}\n@media (min-width: 768px) {\n .navbar-header {\n float: left;\n }\n}\n.navbar-collapse {\n padding-right: 15px;\n padding-left: 15px;\n overflow-x: visible;\n -webkit-overflow-scrolling: touch;\n border-top: 1px solid transparent;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);\n}\n.navbar-collapse.in {\n overflow-y: auto;\n}\n@media (min-width: 768px) {\n .navbar-collapse {\n width: auto;\n border-top: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n .navbar-collapse.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0;\n overflow: visible !important;\n }\n .navbar-collapse.in {\n overflow-y: visible;\n }\n .navbar-fixed-top .navbar-collapse,\n .navbar-static-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n padding-right: 0;\n padding-left: 0;\n }\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n max-height: 340px;\n}\n@media (max-device-width: 480px) and (orientation: landscape) {\n .navbar-fixed-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n max-height: 200px;\n }\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n margin-right: -15px;\n margin-left: -15px;\n}\n@media (min-width: 768px) {\n .container > .navbar-header,\n .container-fluid > .navbar-header,\n .container > .navbar-collapse,\n .container-fluid > .navbar-collapse {\n margin-right: 0;\n margin-left: 0;\n }\n}\n.navbar-static-top {\n z-index: 1000;\n border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n .navbar-static-top {\n border-radius: 0;\n }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n@media (min-width: 768px) {\n .navbar-fixed-top,\n .navbar-fixed-bottom {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0;\n border-width: 1px 0 0;\n}\n.navbar-brand {\n float: left;\n height: 50px;\n padding: 15px 15px;\n font-size: 18px;\n line-height: 20px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n text-decoration: none;\n}\n.navbar-brand > img {\n display: block;\n}\n@media (min-width: 768px) {\n .navbar > .container .navbar-brand,\n .navbar > .container-fluid .navbar-brand {\n margin-left: -15px;\n }\n}\n.navbar-toggle {\n position: relative;\n float: right;\n padding: 9px 10px;\n margin-top: 8px;\n margin-right: 15px;\n margin-bottom: 8px;\n background-color: transparent;\n background-image: none;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.navbar-toggle:focus {\n outline: 0;\n}\n.navbar-toggle .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n margin-top: 4px;\n}\n@media (min-width: 768px) {\n .navbar-toggle {\n display: none;\n }\n}\n.navbar-nav {\n margin: 7.5px -15px;\n}\n.navbar-nav > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: 20px;\n}\n@media (max-width: 767px) {\n .navbar-nav .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n .navbar-nav .open .dropdown-menu > li > a,\n .navbar-nav .open .dropdown-menu .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n .navbar-nav .open .dropdown-menu > li > a {\n line-height: 20px;\n }\n .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-nav .open .dropdown-menu > li > a:focus {\n background-image: none;\n }\n}\n@media (min-width: 768px) {\n .navbar-nav {\n float: left;\n margin: 0;\n }\n .navbar-nav > li {\n float: left;\n }\n .navbar-nav > li > a {\n padding-top: 15px;\n padding-bottom: 15px;\n }\n}\n.navbar-form {\n padding: 10px 15px;\n margin-top: 8px;\n margin-right: -15px;\n margin-bottom: 8px;\n margin-left: -15px;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1);\n}\n@media (min-width: 768px) {\n .navbar-form .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .navbar-form .form-control-static {\n display: inline-block;\n }\n .navbar-form .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .navbar-form .input-group .input-group-addon,\n .navbar-form .input-group .input-group-btn,\n .navbar-form .input-group .form-control {\n width: auto;\n }\n .navbar-form .input-group > .form-control {\n width: 100%;\n }\n .navbar-form .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio,\n .navbar-form .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio label,\n .navbar-form .checkbox label {\n padding-left: 0;\n }\n .navbar-form .radio input[type=\"radio\"],\n .navbar-form .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .navbar-form .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n@media (max-width: 767px) {\n .navbar-form .form-group {\n margin-bottom: 5px;\n }\n .navbar-form .form-group:last-child {\n margin-bottom: 0;\n }\n}\n@media (min-width: 768px) {\n .navbar-form {\n width: auto;\n padding-top: 0;\n padding-bottom: 0;\n margin-right: 0;\n margin-left: 0;\n border: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n}\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.navbar-btn {\n margin-top: 8px;\n margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n margin-top: 14px;\n margin-bottom: 14px;\n}\n.navbar-text {\n margin-top: 15px;\n margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n .navbar-text {\n float: left;\n margin-right: 15px;\n margin-left: 15px;\n }\n}\n@media (min-width: 768px) {\n .navbar-left {\n float: left !important;\n }\n .navbar-right {\n float: right !important;\n margin-right: -15px;\n }\n .navbar-right ~ .navbar-right {\n margin-right: 0;\n }\n}\n.navbar-default {\n background-color: #f8f8f8;\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n color: #777;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n color: #5e5e5e;\n background-color: transparent;\n}\n.navbar-default .navbar-text {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n color: #333;\n background-color: transparent;\n}\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n}\n.navbar-default .navbar-toggle {\n border-color: #ddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n background-color: #ddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n background-color: #888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n color: #555;\n background-color: #e7e7e7;\n}\n@media (max-width: 767px) {\n .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n color: #777;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #333;\n background-color: transparent;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n }\n}\n.navbar-default .navbar-link {\n color: #777;\n}\n.navbar-default .navbar-link:hover {\n color: #333;\n}\n.navbar-default .btn-link {\n color: #777;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n color: #333;\n}\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n color: #ccc;\n}\n.navbar-inverse {\n background-color: #222;\n border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n color: #fff;\n background-color: #080808;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n}\n.navbar-inverse .navbar-toggle {\n border-color: #333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n background-color: #333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n background-color: #fff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n border-color: #101010;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n color: #fff;\n background-color: #080808;\n}\n@media (max-width: 767px) {\n .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n border-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n color: #9d9d9d;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #fff;\n background-color: transparent;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n }\n}\n.navbar-inverse .navbar-link {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-link:hover {\n color: #fff;\n}\n.navbar-inverse .btn-link {\n color: #9d9d9d;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n color: #fff;\n}\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-inverse .btn-link:focus {\n color: #444;\n}\n.breadcrumb {\n padding: 8px 15px;\n margin-bottom: 20px;\n list-style: none;\n background-color: #f5f5f5;\n border-radius: 4px;\n}\n.breadcrumb > li {\n display: inline-block;\n}\n.breadcrumb > li + li:before {\n padding: 0 5px;\n color: #ccc;\n content: \"/\\00a0\";\n}\n.breadcrumb > .active {\n color: #777;\n}\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: 20px 0;\n border-radius: 4px;\n}\n.pagination > li {\n display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n position: relative;\n float: left;\n padding: 6px 12px;\n margin-left: -1px;\n line-height: 1.42857143;\n color: #337ab7;\n text-decoration: none;\n background-color: #fff;\n border: 1px solid #ddd;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n margin-left: 0;\n border-top-left-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n border-top-right-radius: 4px;\n border-bottom-right-radius: 4px;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n z-index: 2;\n color: #23527c;\n background-color: #eee;\n border-color: #ddd;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n z-index: 3;\n color: #fff;\n cursor: default;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n color: #777;\n cursor: not-allowed;\n background-color: #fff;\n border-color: #ddd;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n border-top-left-radius: 6px;\n border-bottom-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n border-top-right-radius: 6px;\n border-bottom-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n border-top-left-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n border-top-right-radius: 3px;\n border-bottom-right-radius: 3px;\n}\n.pager {\n padding-left: 0;\n margin: 20px 0;\n text-align: center;\n list-style: none;\n}\n.pager li {\n display: inline;\n}\n.pager li > a,\n.pager li > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n text-decoration: none;\n background-color: #eee;\n}\n.pager .next > a,\n.pager .next > span {\n float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n color: #777;\n cursor: not-allowed;\n background-color: #fff;\n}\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n}\na.label:hover,\na.label:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.label:empty {\n display: none;\n}\n.btn .label {\n position: relative;\n top: -1px;\n}\n.label-default {\n background-color: #777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n background-color: #5e5e5e;\n}\n.label-primary {\n background-color: #337ab7;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n background-color: #286090;\n}\n.label-success {\n background-color: #5cb85c;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n background-color: #449d44;\n}\n.label-info {\n background-color: #5bc0de;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n background-color: #31b0d5;\n}\n.label-warning {\n background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n background-color: #ec971f;\n}\n.label-danger {\n background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n background-color: #c9302c;\n}\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: 12px;\n font-weight: bold;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: middle;\n background-color: #777;\n border-radius: 10px;\n}\n.badge:empty {\n display: none;\n}\n.btn .badge {\n position: relative;\n top: -1px;\n}\n.btn-xs .badge,\n.btn-group-xs > .btn .badge {\n top: 0;\n padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.list-group-item > .badge {\n float: right;\n}\n.list-group-item > .badge + .badge {\n margin-right: 5px;\n}\n.nav-pills > li > a > .badge {\n margin-left: 3px;\n}\n.jumbotron {\n padding-top: 30px;\n padding-bottom: 30px;\n margin-bottom: 30px;\n color: inherit;\n background-color: #eee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n color: inherit;\n}\n.jumbotron p {\n margin-bottom: 15px;\n font-size: 21px;\n font-weight: 200;\n}\n.jumbotron > hr {\n border-top-color: #d5d5d5;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n padding-right: 15px;\n padding-left: 15px;\n border-radius: 6px;\n}\n.jumbotron .container {\n max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n .jumbotron {\n padding-top: 48px;\n padding-bottom: 48px;\n }\n .container .jumbotron,\n .container-fluid .jumbotron {\n padding-right: 60px;\n padding-left: 60px;\n }\n .jumbotron h1,\n .jumbotron .h1 {\n font-size: 63px;\n }\n}\n.thumbnail {\n display: block;\n padding: 4px;\n margin-bottom: 20px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: border .2s ease-in-out;\n -o-transition: border .2s ease-in-out;\n transition: border .2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n margin-right: auto;\n margin-left: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n border-color: #337ab7;\n}\n.thumbnail .caption {\n padding: 9px;\n color: #333;\n}\n.alert {\n padding: 15px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.alert h4 {\n margin-top: 0;\n color: inherit;\n}\n.alert .alert-link {\n font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n margin-bottom: 0;\n}\n.alert > p + p {\n margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n}\n.alert-success {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6;\n}\n.alert-success hr {\n border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n color: #2b542c;\n}\n.alert-info {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1;\n}\n.alert-info hr {\n border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n color: #245269;\n}\n.alert-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc;\n}\n.alert-warning hr {\n border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n color: #66512c;\n}\n.alert-danger {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1;\n}\n.alert-danger hr {\n border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n@-o-keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n@keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n.progress {\n height: 20px;\n margin-bottom: 20px;\n overflow: hidden;\n background-color: #f5f5f5;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);\n box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);\n}\n.progress-bar {\n float: left;\n width: 0;\n height: 100%;\n font-size: 12px;\n line-height: 20px;\n color: #fff;\n text-align: center;\n background-color: #337ab7;\n -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);\n -webkit-transition: width .6s ease;\n -o-transition: width .6s ease;\n transition: width .6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n -webkit-background-size: 40px 40px;\n background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n -webkit-animation: progress-bar-stripes 2s linear infinite;\n -o-animation: progress-bar-stripes 2s linear infinite;\n animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n background-color: #5cb85c;\n}\n.progress-striped .progress-bar-success {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n}\n.progress-bar-info {\n background-color: #5bc0de;\n}\n.progress-striped .progress-bar-info {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n}\n.progress-bar-warning {\n background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n}\n.progress-bar-danger {\n background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n}\n.media {\n margin-top: 15px;\n}\n.media:first-child {\n margin-top: 0;\n}\n.media,\n.media-body {\n overflow: hidden;\n zoom: 1;\n}\n.media-body {\n width: 10000px;\n}\n.media-object {\n display: block;\n}\n.media-object.img-thumbnail {\n max-width: none;\n}\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n.media-middle {\n vertical-align: middle;\n}\n.media-bottom {\n vertical-align: bottom;\n}\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n.list-group {\n padding-left: 0;\n margin-bottom: 20px;\n}\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n margin-bottom: -1px;\n background-color: #fff;\n border: 1px solid #ddd;\n}\n.list-group-item:first-child {\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n}\n.list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\na.list-group-item,\nbutton.list-group-item {\n color: #555;\n}\na.list-group-item .list-group-item-heading,\nbutton.list-group-item .list-group-item-heading {\n color: #333;\n}\na.list-group-item:hover,\nbutton.list-group-item:hover,\na.list-group-item:focus,\nbutton.list-group-item:focus {\n color: #555;\n text-decoration: none;\n background-color: #f5f5f5;\n}\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n color: #777;\n cursor: not-allowed;\n background-color: #eee;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n color: #777;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n z-index: 2;\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n color: #c7ddef;\n}\n.list-group-item-success {\n color: #3c763d;\n background-color: #dff0d8;\n}\na.list-group-item-success,\nbutton.list-group-item-success {\n color: #3c763d;\n}\na.list-group-item-success .list-group-item-heading,\nbutton.list-group-item-success .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-success:hover,\nbutton.list-group-item-success:hover,\na.list-group-item-success:focus,\nbutton.list-group-item-success:focus {\n color: #3c763d;\n background-color: #d0e9c6;\n}\na.list-group-item-success.active,\nbutton.list-group-item-success.active,\na.list-group-item-success.active:hover,\nbutton.list-group-item-success.active:hover,\na.list-group-item-success.active:focus,\nbutton.list-group-item-success.active:focus {\n color: #fff;\n background-color: #3c763d;\n border-color: #3c763d;\n}\n.list-group-item-info {\n color: #31708f;\n background-color: #d9edf7;\n}\na.list-group-item-info,\nbutton.list-group-item-info {\n color: #31708f;\n}\na.list-group-item-info .list-group-item-heading,\nbutton.list-group-item-info .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-info:hover,\nbutton.list-group-item-info:hover,\na.list-group-item-info:focus,\nbutton.list-group-item-info:focus {\n color: #31708f;\n background-color: #c4e3f3;\n}\na.list-group-item-info.active,\nbutton.list-group-item-info.active,\na.list-group-item-info.active:hover,\nbutton.list-group-item-info.active:hover,\na.list-group-item-info.active:focus,\nbutton.list-group-item-info.active:focus {\n color: #fff;\n background-color: #31708f;\n border-color: #31708f;\n}\n.list-group-item-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n}\na.list-group-item-warning,\nbutton.list-group-item-warning {\n color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading,\nbutton.list-group-item-warning .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-warning:hover,\nbutton.list-group-item-warning:hover,\na.list-group-item-warning:focus,\nbutton.list-group-item-warning:focus {\n color: #8a6d3b;\n background-color: #faf2cc;\n}\na.list-group-item-warning.active,\nbutton.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\nbutton.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus,\nbutton.list-group-item-warning.active:focus {\n color: #fff;\n background-color: #8a6d3b;\n border-color: #8a6d3b;\n}\n.list-group-item-danger {\n color: #a94442;\n background-color: #f2dede;\n}\na.list-group-item-danger,\nbutton.list-group-item-danger {\n color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading,\nbutton.list-group-item-danger .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-danger:hover,\nbutton.list-group-item-danger:hover,\na.list-group-item-danger:focus,\nbutton.list-group-item-danger:focus {\n color: #a94442;\n background-color: #ebcccc;\n}\na.list-group-item-danger.active,\nbutton.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\nbutton.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus,\nbutton.list-group-item-danger.active:focus {\n color: #fff;\n background-color: #a94442;\n border-color: #a94442;\n}\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n.panel {\n margin-bottom: 20px;\n background-color: #fff;\n border: 1px solid transparent;\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05);\n box-shadow: 0 1px 1px rgba(0, 0, 0, .05);\n}\n.panel-body {\n padding: 15px;\n}\n.panel-heading {\n padding: 10px 15px;\n border-bottom: 1px solid transparent;\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n color: inherit;\n}\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: 16px;\n color: inherit;\n}\n.panel-title > a,\n.panel-title > small,\n.panel-title > .small,\n.panel-title > small > a,\n.panel-title > .small > a {\n color: inherit;\n}\n.panel-footer {\n padding: 10px 15px;\n background-color: #f5f5f5;\n border-top: 1px solid #ddd;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n border-top: 0;\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n border-bottom: 0;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n border-top-width: 0;\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n padding-right: 15px;\n padding-left: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n border-top: 1px solid #ddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n border-bottom: 0;\n}\n.panel > .table-responsive {\n margin-bottom: 0;\n border: 0;\n}\n.panel-group {\n margin-bottom: 20px;\n}\n.panel-group .panel {\n margin-bottom: 0;\n border-radius: 4px;\n}\n.panel-group .panel + .panel {\n margin-top: 5px;\n}\n.panel-group .panel-heading {\n border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n border-top: 1px solid #ddd;\n}\n.panel-group .panel-footer {\n border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n border-bottom: 1px solid #ddd;\n}\n.panel-default {\n border-color: #ddd;\n}\n.panel-default > .panel-heading {\n color: #333;\n background-color: #f5f5f5;\n border-color: #ddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ddd;\n}\n.panel-default > .panel-heading .badge {\n color: #f5f5f5;\n background-color: #333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ddd;\n}\n.panel-primary {\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading {\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #337ab7;\n}\n.panel-primary > .panel-heading .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #337ab7;\n}\n.panel-success {\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n color: #dff0d8;\n background-color: #3c763d;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #d6e9c6;\n}\n.panel-info {\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #bce8f1;\n}\n.panel-info > .panel-heading .badge {\n color: #d9edf7;\n background-color: #31708f;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #bce8f1;\n}\n.panel-warning {\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n color: #fcf8e3;\n background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #faebcc;\n}\n.panel-danger {\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n color: #f2dede;\n background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 0;\n}\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border: 1px solid #e3e3e3;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);\n}\n.well blockquote {\n border-color: #ddd;\n border-color: rgba(0, 0, 0, .15);\n}\n.well-lg {\n padding: 24px;\n border-radius: 6px;\n}\n.well-sm {\n padding: 9px;\n border-radius: 3px;\n}\n.close {\n float: right;\n font-size: 21px;\n font-weight: bold;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n filter: alpha(opacity=20);\n opacity: .2;\n}\n.close:hover,\n.close:focus {\n color: #000;\n text-decoration: none;\n cursor: pointer;\n filter: alpha(opacity=50);\n opacity: .5;\n}\nbutton.close {\n -webkit-appearance: none;\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n}\n.modal-open {\n overflow: hidden;\n}\n.modal {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1050;\n display: none;\n overflow: hidden;\n -webkit-overflow-scrolling: touch;\n outline: 0;\n}\n.modal.fade .modal-dialog {\n -webkit-transition: -webkit-transform .3s ease-out;\n -o-transition: -o-transform .3s ease-out;\n transition: transform .3s ease-out;\n -webkit-transform: translate(0, -25%);\n -ms-transform: translate(0, -25%);\n -o-transform: translate(0, -25%);\n transform: translate(0, -25%);\n}\n.modal.in .modal-dialog {\n -webkit-transform: translate(0, 0);\n -ms-transform: translate(0, 0);\n -o-transform: translate(0, 0);\n transform: translate(0, 0);\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n.modal-content {\n position: relative;\n background-color: #fff;\n -webkit-background-clip: padding-box;\n background-clip: padding-box;\n border: 1px solid #999;\n border: 1px solid rgba(0, 0, 0, .2);\n border-radius: 6px;\n outline: 0;\n -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5);\n box-shadow: 0 3px 9px rgba(0, 0, 0, .5);\n}\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1040;\n background-color: #000;\n}\n.modal-backdrop.fade {\n filter: alpha(opacity=0);\n opacity: 0;\n}\n.modal-backdrop.in {\n filter: alpha(opacity=50);\n opacity: .5;\n}\n.modal-header {\n padding: 15px;\n border-bottom: 1px solid #e5e5e5;\n}\n.modal-header .close {\n margin-top: -2px;\n}\n.modal-title {\n margin: 0;\n line-height: 1.42857143;\n}\n.modal-body {\n position: relative;\n padding: 15px;\n}\n.modal-footer {\n padding: 15px;\n text-align: right;\n border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n margin-bottom: 0;\n margin-left: 5px;\n}\n.modal-footer .btn-group .btn + .btn {\n margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n margin-left: 0;\n}\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n@media (min-width: 768px) {\n .modal-dialog {\n width: 600px;\n margin: 30px auto;\n }\n .modal-content {\n -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5);\n box-shadow: 0 5px 15px rgba(0, 0, 0, .5);\n }\n .modal-sm {\n width: 300px;\n }\n}\n@media (min-width: 992px) {\n .modal-lg {\n width: 900px;\n }\n}\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 12px;\n font-style: normal;\n font-weight: normal;\n line-height: 1.42857143;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n white-space: normal;\n filter: alpha(opacity=0);\n opacity: 0;\n\n line-break: auto;\n}\n.tooltip.in {\n filter: alpha(opacity=90);\n opacity: .9;\n}\n.tooltip.top {\n padding: 5px 0;\n margin-top: -3px;\n}\n.tooltip.right {\n padding: 0 5px;\n margin-left: 3px;\n}\n.tooltip.bottom {\n padding: 5px 0;\n margin-top: 3px;\n}\n.tooltip.left {\n padding: 0 5px;\n margin-left: -3px;\n}\n.tooltip-inner {\n max-width: 200px;\n padding: 3px 8px;\n color: #fff;\n text-align: center;\n background-color: #000;\n border-radius: 4px;\n}\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.tooltip.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-left .tooltip-arrow {\n right: 5px;\n bottom: 0;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-right .tooltip-arrow {\n bottom: 0;\n left: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -5px;\n border-width: 5px 5px 5px 0;\n border-right-color: #000;\n}\n.tooltip.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -5px;\n border-width: 5px 0 5px 5px;\n border-left-color: #000;\n}\n.tooltip.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n top: 0;\n right: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n top: 0;\n left: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: none;\n max-width: 276px;\n padding: 1px;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 14px;\n font-style: normal;\n font-weight: normal;\n line-height: 1.42857143;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n white-space: normal;\n background-color: #fff;\n -webkit-background-clip: padding-box;\n background-clip: padding-box;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, .2);\n border-radius: 6px;\n -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2);\n box-shadow: 0 5px 10px rgba(0, 0, 0, .2);\n\n line-break: auto;\n}\n.popover.top {\n margin-top: -10px;\n}\n.popover.right {\n margin-left: 10px;\n}\n.popover.bottom {\n margin-top: 10px;\n}\n.popover.left {\n margin-left: -10px;\n}\n.popover-title {\n padding: 8px 14px;\n margin: 0;\n font-size: 14px;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-radius: 5px 5px 0 0;\n}\n.popover-content {\n padding: 9px 14px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.popover > .arrow {\n border-width: 11px;\n}\n.popover > .arrow:after {\n content: \"\";\n border-width: 10px;\n}\n.popover.top > .arrow {\n bottom: -11px;\n left: 50%;\n margin-left: -11px;\n border-top-color: #999;\n border-top-color: rgba(0, 0, 0, .25);\n border-bottom-width: 0;\n}\n.popover.top > .arrow:after {\n bottom: 1px;\n margin-left: -10px;\n content: \" \";\n border-top-color: #fff;\n border-bottom-width: 0;\n}\n.popover.right > .arrow {\n top: 50%;\n left: -11px;\n margin-top: -11px;\n border-right-color: #999;\n border-right-color: rgba(0, 0, 0, .25);\n border-left-width: 0;\n}\n.popover.right > .arrow:after {\n bottom: -10px;\n left: 1px;\n content: \" \";\n border-right-color: #fff;\n border-left-width: 0;\n}\n.popover.bottom > .arrow {\n top: -11px;\n left: 50%;\n margin-left: -11px;\n border-top-width: 0;\n border-bottom-color: #999;\n border-bottom-color: rgba(0, 0, 0, .25);\n}\n.popover.bottom > .arrow:after {\n top: 1px;\n margin-left: -10px;\n content: \" \";\n border-top-width: 0;\n border-bottom-color: #fff;\n}\n.popover.left > .arrow {\n top: 50%;\n right: -11px;\n margin-top: -11px;\n border-right-width: 0;\n border-left-color: #999;\n border-left-color: rgba(0, 0, 0, .25);\n}\n.popover.left > .arrow:after {\n right: 1px;\n bottom: -10px;\n content: \" \";\n border-right-width: 0;\n border-left-color: #fff;\n}\n.carousel {\n position: relative;\n}\n.carousel-inner {\n position: relative;\n width: 100%;\n overflow: hidden;\n}\n.carousel-inner > .item {\n position: relative;\n display: none;\n -webkit-transition: .6s ease-in-out left;\n -o-transition: .6s ease-in-out left;\n transition: .6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n line-height: 1;\n}\n@media all and (transform-3d), (-webkit-transform-3d) {\n .carousel-inner > .item {\n -webkit-transition: -webkit-transform .6s ease-in-out;\n -o-transition: -o-transform .6s ease-in-out;\n transition: transform .6s ease-in-out;\n\n -webkit-backface-visibility: hidden;\n backface-visibility: hidden;\n -webkit-perspective: 1000px;\n perspective: 1000px;\n }\n .carousel-inner > .item.next,\n .carousel-inner > .item.active.right {\n left: 0;\n -webkit-transform: translate3d(100%, 0, 0);\n transform: translate3d(100%, 0, 0);\n }\n .carousel-inner > .item.prev,\n .carousel-inner > .item.active.left {\n left: 0;\n -webkit-transform: translate3d(-100%, 0, 0);\n transform: translate3d(-100%, 0, 0);\n }\n .carousel-inner > .item.next.left,\n .carousel-inner > .item.prev.right,\n .carousel-inner > .item.active {\n left: 0;\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n display: block;\n}\n.carousel-inner > .active {\n left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n}\n.carousel-inner > .next {\n left: 100%;\n}\n.carousel-inner > .prev {\n left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n left: 0;\n}\n.carousel-inner > .active.left {\n left: -100%;\n}\n.carousel-inner > .active.right {\n left: 100%;\n}\n.carousel-control {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 15%;\n font-size: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, .6);\n background-color: rgba(0, 0, 0, 0);\n filter: alpha(opacity=50);\n opacity: .5;\n}\n.carousel-control.left {\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);\n background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001)));\n background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n background-repeat: repeat-x;\n}\n.carousel-control.right {\n right: 0;\n left: auto;\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);\n background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5)));\n background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n background-repeat: repeat-x;\n}\n.carousel-control:hover,\n.carousel-control:focus {\n color: #fff;\n text-decoration: none;\n filter: alpha(opacity=90);\n outline: 0;\n opacity: .9;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n z-index: 5;\n display: inline-block;\n margin-top: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n width: 20px;\n height: 20px;\n font-family: serif;\n line-height: 1;\n}\n.carousel-control .icon-prev:before {\n content: '\\2039';\n}\n.carousel-control .icon-next:before {\n content: '\\203a';\n}\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n padding-left: 0;\n margin-left: -30%;\n text-align: center;\n list-style: none;\n}\n.carousel-indicators li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n cursor: pointer;\n background-color: #000 \\9;\n background-color: rgba(0, 0, 0, 0);\n border: 1px solid #fff;\n border-radius: 10px;\n}\n.carousel-indicators .active {\n width: 12px;\n height: 12px;\n margin: 0;\n background-color: #fff;\n}\n.carousel-caption {\n position: absolute;\n right: 15%;\n bottom: 20px;\n left: 15%;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, .6);\n}\n.carousel-caption .btn {\n text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-prev,\n .carousel-control .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -10px;\n font-size: 30px;\n }\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .icon-prev {\n margin-left: -10px;\n }\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-next {\n margin-right: -10px;\n }\n .carousel-caption {\n right: 20%;\n left: 20%;\n padding-bottom: 30px;\n }\n .carousel-indicators {\n bottom: 20px;\n }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-header:before,\n.modal-header:after,\n.modal-footer:before,\n.modal-footer:after {\n display: table;\n content: \" \";\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-header:after,\n.modal-footer:after {\n clear: both;\n}\n.center-block {\n display: block;\n margin-right: auto;\n margin-left: auto;\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n.hidden {\n display: none !important;\n}\n.affix {\n position: fixed;\n}\n@-ms-viewport {\n width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n@media (max-width: 767px) {\n .visible-xs {\n display: block !important;\n }\n table.visible-xs {\n display: table !important;\n }\n tr.visible-xs {\n display: table-row !important;\n }\n th.visible-xs,\n td.visible-xs {\n display: table-cell !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-block {\n display: block !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline {\n display: inline !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm {\n display: block !important;\n }\n table.visible-sm {\n display: table !important;\n }\n tr.visible-sm {\n display: table-row !important;\n }\n th.visible-sm,\n td.visible-sm {\n display: table-cell !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-block {\n display: block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline {\n display: inline !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md {\n display: block !important;\n }\n table.visible-md {\n display: table !important;\n }\n tr.visible-md {\n display: table-row !important;\n }\n th.visible-md,\n td.visible-md {\n display: table-cell !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-block {\n display: block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline {\n display: inline !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg {\n display: block !important;\n }\n table.visible-lg {\n display: table !important;\n }\n tr.visible-lg {\n display: table-row !important;\n }\n th.visible-lg,\n td.visible-lg {\n display: table-cell !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-block {\n display: block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline {\n display: inline !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline-block {\n display: inline-block !important;\n }\n}\n@media (max-width: 767px) {\n .hidden-xs {\n display: none !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .hidden-sm {\n display: none !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .hidden-md {\n display: none !important;\n }\n}\n@media (min-width: 1200px) {\n .hidden-lg {\n display: none !important;\n }\n}\n.visible-print {\n display: none !important;\n}\n@media print {\n .visible-print {\n display: block !important;\n }\n table.visible-print {\n display: table !important;\n }\n tr.visible-print {\n display: table-row !important;\n }\n th.visible-print,\n td.visible-print {\n display: table-cell !important;\n }\n}\n.visible-print-block {\n display: none !important;\n}\n@media print {\n .visible-print-block {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n}\n@media print {\n .visible-print-inline {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n}\n@media print {\n .visible-print-inline-block {\n display: inline-block !important;\n }\n}\n@media print {\n .hidden-print {\n display: none !important;\n }\n}\n/*# sourceMappingURL=bootstrap.css.map */\n","//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus automatically sized to match the surrounding child. To use, create an\n// inline element with the appropriate classes, like so:\n//\n// <a href=\"#\"><span class=\"glyphicon glyphicon-star\"></span> Star</a>\n\n// Import the fonts\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url('@{icon-font-path}@{icon-font-name}.eot');\n src: url('@{icon-font-path}@{icon-font-name}.eot?#iefix') format('embedded-opentype'),\n url('@{icon-font-path}@{icon-font-name}.woff2') format('woff2'),\n url('@{icon-font-path}@{icon-font-name}.woff') format('woff'),\n url('@{icon-font-path}@{icon-font-name}.ttf') format('truetype'),\n url('@{icon-font-path}@{icon-font-name}.svg#@{icon-font-svg-id}') format('svg');\n}\n\n// Catchall baseclass\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n// Individual icons\n.glyphicon-asterisk { &:before { content: \"\\002a\"; } }\n.glyphicon-plus { &:before { content: \"\\002b\"; } }\n.glyphicon-euro,\n.glyphicon-eur { &:before { content: \"\\20ac\"; } }\n.glyphicon-minus { &:before { content: \"\\2212\"; } }\n.glyphicon-cloud { &:before { content: \"\\2601\"; } }\n.glyphicon-envelope { &:before { content: \"\\2709\"; } }\n.glyphicon-pencil { &:before { content: \"\\270f\"; } }\n.glyphicon-glass { &:before { content: \"\\e001\"; } }\n.glyphicon-music { &:before { content: \"\\e002\"; } }\n.glyphicon-search { &:before { content: \"\\e003\"; } }\n.glyphicon-heart { &:before { content: \"\\e005\"; } }\n.glyphicon-star { &:before { content: \"\\e006\"; } }\n.glyphicon-star-empty { &:before { content: \"\\e007\"; } }\n.glyphicon-user { &:before { content: \"\\e008\"; } }\n.glyphicon-film { &:before { content: \"\\e009\"; } }\n.glyphicon-th-large { &:before { content: \"\\e010\"; } }\n.glyphicon-th { &:before { content: \"\\e011\"; } }\n.glyphicon-th-list { &:before { content: \"\\e012\"; } }\n.glyphicon-ok { &:before { content: \"\\e013\"; } }\n.glyphicon-remove { &:before { content: \"\\e014\"; } }\n.glyphicon-zoom-in { &:before { content: \"\\e015\"; } }\n.glyphicon-zoom-out { &:before { content: \"\\e016\"; } }\n.glyphicon-off { &:before { content: \"\\e017\"; } }\n.glyphicon-signal { &:before { content: \"\\e018\"; } }\n.glyphicon-cog { &:before { content: \"\\e019\"; } }\n.glyphicon-trash { &:before { content: \"\\e020\"; } }\n.glyphicon-home { &:before { content: \"\\e021\"; } }\n.glyphicon-file { &:before { content: \"\\e022\"; } }\n.glyphicon-time { &:before { content: \"\\e023\"; } }\n.glyphicon-road { &:before { content: \"\\e024\"; } }\n.glyphicon-download-alt { &:before { content: \"\\e025\"; } }\n.glyphicon-download { &:before { content: \"\\e026\"; } }\n.glyphicon-upload { &:before { content: \"\\e027\"; } }\n.glyphicon-inbox { &:before { content: \"\\e028\"; } }\n.glyphicon-play-circle { &:before { content: \"\\e029\"; } }\n.glyphicon-repeat { &:before { content: \"\\e030\"; } }\n.glyphicon-refresh { &:before { content: \"\\e031\"; } }\n.glyphicon-list-alt { &:before { content: \"\\e032\"; } }\n.glyphicon-lock { &:before { content: \"\\e033\"; } }\n.glyphicon-flag { &:before { content: \"\\e034\"; } }\n.glyphicon-headphones { &:before { content: \"\\e035\"; } }\n.glyphicon-volume-off { &:before { content: \"\\e036\"; } }\n.glyphicon-volume-down { &:before { content: \"\\e037\"; } }\n.glyphicon-volume-up { &:before { content: \"\\e038\"; } }\n.glyphicon-qrcode { &:before { content: \"\\e039\"; } }\n.glyphicon-barcode { &:before { content: \"\\e040\"; } }\n.glyphicon-tag { &:before { content: \"\\e041\"; } }\n.glyphicon-tags { &:before { content: \"\\e042\"; } }\n.glyphicon-book { &:before { content: \"\\e043\"; } }\n.glyphicon-bookmark { &:before { content: \"\\e044\"; } }\n.glyphicon-print { &:before { content: \"\\e045\"; } }\n.glyphicon-camera { &:before { content: \"\\e046\"; } }\n.glyphicon-font { &:before { content: \"\\e047\"; } }\n.glyphicon-bold { &:before { content: \"\\e048\"; } }\n.glyphicon-italic { &:before { content: \"\\e049\"; } }\n.glyphicon-text-height { &:before { content: \"\\e050\"; } }\n.glyphicon-text-width { &:before { content: \"\\e051\"; } }\n.glyphicon-align-left { &:before { content: \"\\e052\"; } }\n.glyphicon-align-center { &:before { content: \"\\e053\"; } }\n.glyphicon-align-right { &:before { content: \"\\e054\"; } }\n.glyphicon-align-justify { &:before { content: \"\\e055\"; } }\n.glyphicon-list { &:before { content: \"\\e056\"; } }\n.glyphicon-indent-left { &:before { content: \"\\e057\"; } }\n.glyphicon-indent-right { &:before { content: \"\\e058\"; } }\n.glyphicon-facetime-video { &:before { content: \"\\e059\"; } }\n.glyphicon-picture { &:before { content: \"\\e060\"; } }\n.glyphicon-map-marker { &:before { content: \"\\e062\"; } }\n.glyphicon-adjust { &:before { content: \"\\e063\"; } }\n.glyphicon-tint { &:before { content: \"\\e064\"; } }\n.glyphicon-edit { &:before { content: \"\\e065\"; } }\n.glyphicon-share { &:before { content: \"\\e066\"; } }\n.glyphicon-check { &:before { content: \"\\e067\"; } }\n.glyphicon-move { &:before { content: \"\\e068\"; } }\n.glyphicon-step-backward { &:before { content: \"\\e069\"; } }\n.glyphicon-fast-backward { &:before { content: \"\\e070\"; } }\n.glyphicon-backward { &:before { content: \"\\e071\"; } }\n.glyphicon-play { &:before { content: \"\\e072\"; } }\n.glyphicon-pause { &:before { content: \"\\e073\"; } }\n.glyphicon-stop { &:before { content: \"\\e074\"; } }\n.glyphicon-forward { &:before { content: \"\\e075\"; } }\n.glyphicon-fast-forward { &:before { content: \"\\e076\"; } }\n.glyphicon-step-forward { &:before { content: \"\\e077\"; } }\n.glyphicon-eject { &:before { content: \"\\e078\"; } }\n.glyphicon-chevron-left { &:before { content: \"\\e079\"; } }\n.glyphicon-chevron-right { &:before { content: \"\\e080\"; } }\n.glyphicon-plus-sign { &:before { content: \"\\e081\"; } }\n.glyphicon-minus-sign { &:before { content: \"\\e082\"; } }\n.glyphicon-remove-sign { &:before { content: \"\\e083\"; } }\n.glyphicon-ok-sign { &:before { content: \"\\e084\"; } }\n.glyphicon-question-sign { &:before { content: \"\\e085\"; } }\n.glyphicon-info-sign { &:before { content: \"\\e086\"; } }\n.glyphicon-screenshot { &:before { content: \"\\e087\"; } }\n.glyphicon-remove-circle { &:before { content: \"\\e088\"; } }\n.glyphicon-ok-circle { &:before { content: \"\\e089\"; } }\n.glyphicon-ban-circle { &:before { content: \"\\e090\"; } }\n.glyphicon-arrow-left { &:before { content: \"\\e091\"; } }\n.glyphicon-arrow-right { &:before { content: \"\\e092\"; } }\n.glyphicon-arrow-up { &:before { content: \"\\e093\"; } }\n.glyphicon-arrow-down { &:before { content: \"\\e094\"; } }\n.glyphicon-share-alt { &:before { content: \"\\e095\"; } }\n.glyphicon-resize-full { &:before { content: \"\\e096\"; } }\n.glyphicon-resize-small { &:before { content: \"\\e097\"; } }\n.glyphicon-exclamation-sign { &:before { content: \"\\e101\"; } }\n.glyphicon-gift { &:before { content: \"\\e102\"; } }\n.glyphicon-leaf { &:before { content: \"\\e103\"; } }\n.glyphicon-fire { &:before { content: \"\\e104\"; } }\n.glyphicon-eye-open { &:before { content: \"\\e105\"; } }\n.glyphicon-eye-close { &:before { content: \"\\e106\"; } }\n.glyphicon-warning-sign { &:before { content: \"\\e107\"; } }\n.glyphicon-plane { &:before { content: \"\\e108\"; } }\n.glyphicon-calendar { &:before { content: \"\\e109\"; } }\n.glyphicon-random { &:before { content: \"\\e110\"; } }\n.glyphicon-comment { &:before { content: \"\\e111\"; } }\n.glyphicon-magnet { &:before { content: \"\\e112\"; } }\n.glyphicon-chevron-up { &:before { content: \"\\e113\"; } }\n.glyphicon-chevron-down { &:before { content: \"\\e114\"; } }\n.glyphicon-retweet { &:before { content: \"\\e115\"; } }\n.glyphicon-shopping-cart { &:before { content: \"\\e116\"; } }\n.glyphicon-folder-close { &:before { content: \"\\e117\"; } }\n.glyphicon-folder-open { &:before { content: \"\\e118\"; } }\n.glyphicon-resize-vertical { &:before { content: \"\\e119\"; } }\n.glyphicon-resize-horizontal { &:before { content: \"\\e120\"; } }\n.glyphicon-hdd { &:before { content: \"\\e121\"; } }\n.glyphicon-bullhorn { &:before { content: \"\\e122\"; } }\n.glyphicon-bell { &:before { content: \"\\e123\"; } }\n.glyphicon-certificate { &:before { content: \"\\e124\"; } }\n.glyphicon-thumbs-up { &:before { content: \"\\e125\"; } }\n.glyphicon-thumbs-down { &:before { content: \"\\e126\"; } }\n.glyphicon-hand-right { &:before { content: \"\\e127\"; } }\n.glyphicon-hand-left { &:before { content: \"\\e128\"; } }\n.glyphicon-hand-up { &:before { content: \"\\e129\"; } }\n.glyphicon-hand-down { &:before { content: \"\\e130\"; } }\n.glyphicon-circle-arrow-right { &:before { content: \"\\e131\"; } }\n.glyphicon-circle-arrow-left { &:before { content: \"\\e132\"; } }\n.glyphicon-circle-arrow-up { &:before { content: \"\\e133\"; } }\n.glyphicon-circle-arrow-down { &:before { content: \"\\e134\"; } }\n.glyphicon-globe { &:before { content: \"\\e135\"; } }\n.glyphicon-wrench { &:before { content: \"\\e136\"; } }\n.glyphicon-tasks { &:before { content: \"\\e137\"; } }\n.glyphicon-filter { &:before { content: \"\\e138\"; } }\n.glyphicon-briefcase { &:before { content: \"\\e139\"; } }\n.glyphicon-fullscreen { &:before { content: \"\\e140\"; } }\n.glyphicon-dashboard { &:before { content: \"\\e141\"; } }\n.glyphicon-paperclip { &:before { content: \"\\e142\"; } }\n.glyphicon-heart-empty { &:before { content: \"\\e143\"; } }\n.glyphicon-link { &:before { content: \"\\e144\"; } }\n.glyphicon-phone { &:before { content: \"\\e145\"; } }\n.glyphicon-pushpin { &:before { content: \"\\e146\"; } }\n.glyphicon-usd { &:before { content: \"\\e148\"; } }\n.glyphicon-gbp { &:before { content: \"\\e149\"; } }\n.glyphicon-sort { &:before { content: \"\\e150\"; } }\n.glyphicon-sort-by-alphabet { &:before { content: \"\\e151\"; } }\n.glyphicon-sort-by-alphabet-alt { &:before { content: \"\\e152\"; } }\n.glyphicon-sort-by-order { &:before { content: \"\\e153\"; } }\n.glyphicon-sort-by-order-alt { &:before { content: \"\\e154\"; } }\n.glyphicon-sort-by-attributes { &:before { content: \"\\e155\"; } }\n.glyphicon-sort-by-attributes-alt { &:before { content: \"\\e156\"; } }\n.glyphicon-unchecked { &:before { content: \"\\e157\"; } }\n.glyphicon-expand { &:before { content: \"\\e158\"; } }\n.glyphicon-collapse-down { &:before { content: \"\\e159\"; } }\n.glyphicon-collapse-up { &:before { content: \"\\e160\"; } }\n.glyphicon-log-in { &:before { content: \"\\e161\"; } }\n.glyphicon-flash { &:before { content: \"\\e162\"; } }\n.glyphicon-log-out { &:before { content: \"\\e163\"; } }\n.glyphicon-new-window { &:before { content: \"\\e164\"; } }\n.glyphicon-record { &:before { content: \"\\e165\"; } }\n.glyphicon-save { &:before { content: \"\\e166\"; } }\n.glyphicon-open { &:before { content: \"\\e167\"; } }\n.glyphicon-saved { &:before { content: \"\\e168\"; } }\n.glyphicon-import { &:before { content: \"\\e169\"; } }\n.glyphicon-export { &:before { content: \"\\e170\"; } }\n.glyphicon-send { &:before { content: \"\\e171\"; } }\n.glyphicon-floppy-disk { &:before { content: \"\\e172\"; } }\n.glyphicon-floppy-saved { &:before { content: \"\\e173\"; } }\n.glyphicon-floppy-remove { &:before { content: \"\\e174\"; } }\n.glyphicon-floppy-save { &:before { content: \"\\e175\"; } }\n.glyphicon-floppy-open { &:before { content: \"\\e176\"; } }\n.glyphicon-credit-card { &:before { content: \"\\e177\"; } }\n.glyphicon-transfer { &:before { content: \"\\e178\"; } }\n.glyphicon-cutlery { &:before { content: \"\\e179\"; } }\n.glyphicon-header { &:before { content: \"\\e180\"; } }\n.glyphicon-compressed { &:before { content: \"\\e181\"; } }\n.glyphicon-earphone { &:before { content: \"\\e182\"; } }\n.glyphicon-phone-alt { &:before { content: \"\\e183\"; } }\n.glyphicon-tower { &:before { content: \"\\e184\"; } }\n.glyphicon-stats { &:before { content: \"\\e185\"; } }\n.glyphicon-sd-video { &:before { content: \"\\e186\"; } }\n.glyphicon-hd-video { &:before { content: \"\\e187\"; } }\n.glyphicon-subtitles { &:before { content: \"\\e188\"; } }\n.glyphicon-sound-stereo { &:before { content: \"\\e189\"; } }\n.glyphicon-sound-dolby { &:before { content: \"\\e190\"; } }\n.glyphicon-sound-5-1 { &:before { content: \"\\e191\"; } }\n.glyphicon-sound-6-1 { &:before { content: \"\\e192\"; } }\n.glyphicon-sound-7-1 { &:before { content: \"\\e193\"; } }\n.glyphicon-copyright-mark { &:before { content: \"\\e194\"; } }\n.glyphicon-registration-mark { &:before { content: \"\\e195\"; } }\n.glyphicon-cloud-download { &:before { content: \"\\e197\"; } }\n.glyphicon-cloud-upload { &:before { content: \"\\e198\"; } }\n.glyphicon-tree-conifer { &:before { content: \"\\e199\"; } }\n.glyphicon-tree-deciduous { &:before { content: \"\\e200\"; } }\n.glyphicon-cd { &:before { content: \"\\e201\"; } }\n.glyphicon-save-file { &:before { content: \"\\e202\"; } }\n.glyphicon-open-file { &:before { content: \"\\e203\"; } }\n.glyphicon-level-up { &:before { content: \"\\e204\"; } }\n.glyphicon-copy { &:before { content: \"\\e205\"; } }\n.glyphicon-paste { &:before { content: \"\\e206\"; } }\n// The following 2 Glyphicons are omitted for the time being because\n// they currently use Unicode codepoints that are outside the\n// Basic Multilingual Plane (BMP). Older buggy versions of WebKit can't handle\n// non-BMP codepoints in CSS string escapes, and thus can't display these two icons.\n// Notably, the bug affects some older versions of the Android Browser.\n// More info: https://github.com/twbs/bootstrap/issues/10106\n// .glyphicon-door { &:before { content: \"\\1f6aa\"; } }\n// .glyphicon-key { &:before { content: \"\\1f511\"; } }\n.glyphicon-alert { &:before { content: \"\\e209\"; } }\n.glyphicon-equalizer { &:before { content: \"\\e210\"; } }\n.glyphicon-king { &:before { content: \"\\e211\"; } }\n.glyphicon-queen { &:before { content: \"\\e212\"; } }\n.glyphicon-pawn { &:before { content: \"\\e213\"; } }\n.glyphicon-bishop { &:before { content: \"\\e214\"; } }\n.glyphicon-knight { &:before { content: \"\\e215\"; } }\n.glyphicon-baby-formula { &:before { content: \"\\e216\"; } }\n.glyphicon-tent { &:before { content: \"\\26fa\"; } }\n.glyphicon-blackboard { &:before { content: \"\\e218\"; } }\n.glyphicon-bed { &:before { content: \"\\e219\"; } }\n.glyphicon-apple { &:before { content: \"\\f8ff\"; } }\n.glyphicon-erase { &:before { content: \"\\e221\"; } }\n.glyphicon-hourglass { &:before { content: \"\\231b\"; } }\n.glyphicon-lamp { &:before { content: \"\\e223\"; } }\n.glyphicon-duplicate { &:before { content: \"\\e224\"; } }\n.glyphicon-piggy-bank { &:before { content: \"\\e225\"; } }\n.glyphicon-scissors { &:before { content: \"\\e226\"; } }\n.glyphicon-bitcoin { &:before { content: \"\\e227\"; } }\n.glyphicon-btc { &:before { content: \"\\e227\"; } }\n.glyphicon-xbt { &:before { content: \"\\e227\"; } }\n.glyphicon-yen { &:before { content: \"\\00a5\"; } }\n.glyphicon-jpy { &:before { content: \"\\00a5\"; } }\n.glyphicon-ruble { &:before { content: \"\\20bd\"; } }\n.glyphicon-rub { &:before { content: \"\\20bd\"; } }\n.glyphicon-scale { &:before { content: \"\\e230\"; } }\n.glyphicon-ice-lolly { &:before { content: \"\\e231\"; } }\n.glyphicon-ice-lolly-tasted { &:before { content: \"\\e232\"; } }\n.glyphicon-education { &:before { content: \"\\e233\"; } }\n.glyphicon-option-horizontal { &:before { content: \"\\e234\"; } }\n.glyphicon-option-vertical { &:before { content: \"\\e235\"; } }\n.glyphicon-menu-hamburger { &:before { content: \"\\e236\"; } }\n.glyphicon-modal-window { &:before { content: \"\\e237\"; } }\n.glyphicon-oil { &:before { content: \"\\e238\"; } }\n.glyphicon-grain { &:before { content: \"\\e239\"; } }\n.glyphicon-sunglasses { &:before { content: \"\\e240\"; } }\n.glyphicon-text-size { &:before { content: \"\\e241\"; } }\n.glyphicon-text-color { &:before { content: \"\\e242\"; } }\n.glyphicon-text-background { &:before { content: \"\\e243\"; } }\n.glyphicon-object-align-top { &:before { content: \"\\e244\"; } }\n.glyphicon-object-align-bottom { &:before { content: \"\\e245\"; } }\n.glyphicon-object-align-horizontal{ &:before { content: \"\\e246\"; } }\n.glyphicon-object-align-left { &:before { content: \"\\e247\"; } }\n.glyphicon-object-align-vertical { &:before { content: \"\\e248\"; } }\n.glyphicon-object-align-right { &:before { content: \"\\e249\"; } }\n.glyphicon-triangle-right { &:before { content: \"\\e250\"; } }\n.glyphicon-triangle-left { &:before { content: \"\\e251\"; } }\n.glyphicon-triangle-bottom { &:before { content: \"\\e252\"; } }\n.glyphicon-triangle-top { &:before { content: \"\\e253\"; } }\n.glyphicon-console { &:before { content: \"\\e254\"; } }\n.glyphicon-superscript { &:before { content: \"\\e255\"; } }\n.glyphicon-subscript { &:before { content: \"\\e256\"; } }\n.glyphicon-menu-left { &:before { content: \"\\e257\"; } }\n.glyphicon-menu-right { &:before { content: \"\\e258\"; } }\n.glyphicon-menu-down { &:before { content: \"\\e259\"; } }\n.glyphicon-menu-up { &:before { content: \"\\e260\"; } }\n","//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n//\n// Heads up! This reset may cause conflicts with some third-party widgets.\n// For recommendations on resolving such conflicts, see\n// http://getbootstrap.com/getting-started/#third-box-sizing\n* {\n .box-sizing(border-box);\n}\n*:before,\n*:after {\n .box-sizing(border-box);\n}\n\n\n// Body reset\n\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0,0,0,0);\n}\n\nbody {\n font-family: @font-family-base;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @text-color;\n background-color: @body-bg;\n}\n\n// Reset fonts for relevant elements\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\n\n// Links\n\na {\n color: @link-color;\n text-decoration: none;\n\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: @link-hover-decoration;\n }\n\n &:focus {\n .tab-focus();\n }\n}\n\n\n// Figures\n//\n// We reset this here because previously Normalize had no `figure` margins. This\n// ensures we don't break anyone's use of the element.\n\nfigure {\n margin: 0;\n}\n\n\n// Images\n\nimg {\n vertical-align: middle;\n}\n\n// Responsive images (ensure images don't scale beyond their parents)\n.img-responsive {\n .img-responsive();\n}\n\n// Rounded corners\n.img-rounded {\n border-radius: @border-radius-large;\n}\n\n// Image thumbnails\n//\n// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.\n.img-thumbnail {\n padding: @thumbnail-padding;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(all .2s ease-in-out);\n\n // Keep them at most 100% wide\n .img-responsive(inline-block);\n}\n\n// Perfect circle\n.img-circle {\n border-radius: 50%; // set radius in percents\n}\n\n\n// Horizontal rules\n\nhr {\n margin-top: @line-height-computed;\n margin-bottom: @line-height-computed;\n border: 0;\n border-top: 1px solid @hr-border;\n}\n\n\n// Only display content to screen readers\n//\n// See: http://a11yproject.com/posts/how-to-hide-content\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0,0,0,0);\n border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n// Useful for \"Skip to main content\" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n// Credit: HTML5 Boilerplate\n\n.sr-only-focusable {\n &:active,\n &:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n }\n}\n\n\n// iOS \"clickable elements\" fix for role=\"button\"\n//\n// Fixes \"clickability\" issue (and more generally, the firing of events such as focus as well)\n// for traditionally non-focusable elements with role=\"button\"\n// see https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n\n[role=\"button\"] {\n cursor: pointer;\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They have been removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility) {\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// WebKit-style focus\n\n.tab-focus() {\n // WebKit-specific. Other browsers will keep their default outline style.\n // (Initially tried to also force default via `outline: initial`,\n // but that seems to erroneously remove the outline in Firefox altogether.)\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n.img-responsive(@display: block) {\n display: @display;\n max-width: 100%; // Part 1: Set a maximum relative to the parent\n height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size. Note that the\n// spelling of `min--moz-device-pixel-ratio` is intentional.\n.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {\n background-image: url(\"@{file-1x}\");\n\n @media\n only screen and (-webkit-min-device-pixel-ratio: 2),\n only screen and ( min--moz-device-pixel-ratio: 2),\n only screen and ( -o-min-device-pixel-ratio: 2/1),\n only screen and ( min-device-pixel-ratio: 2),\n only screen and ( min-resolution: 192dpi),\n only screen and ( min-resolution: 2dppx) {\n background-image: url(\"@{file-2x}\");\n background-size: @width-1x @height-1x;\n }\n}\n","//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n font-family: @headings-font-family;\n font-weight: @headings-font-weight;\n line-height: @headings-line-height;\n color: @headings-color;\n\n small,\n .small {\n font-weight: normal;\n line-height: 1;\n color: @headings-small-color;\n }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n margin-top: @line-height-computed;\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 65%;\n }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n margin-top: (@line-height-computed / 2);\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 75%;\n }\n}\n\nh1, .h1 { font-size: @font-size-h1; }\nh2, .h2 { font-size: @font-size-h2; }\nh3, .h3 { font-size: @font-size-h3; }\nh4, .h4 { font-size: @font-size-h4; }\nh5, .h5 { font-size: @font-size-h5; }\nh6, .h6 { font-size: @font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n margin: 0 0 (@line-height-computed / 2);\n}\n\n.lead {\n margin-bottom: @line-height-computed;\n font-size: floor((@font-size-base * 1.15));\n font-weight: 300;\n line-height: 1.4;\n\n @media (min-width: @screen-sm-min) {\n font-size: (@font-size-base * 1.5);\n }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: (12px small font / 14px base font) * 100% = about 85%\nsmall,\n.small {\n font-size: floor((100% * @font-size-small / @font-size-base));\n}\n\nmark,\n.mark {\n background-color: @state-warning-bg;\n padding: .2em;\n}\n\n// Alignment\n.text-left { text-align: left; }\n.text-right { text-align: right; }\n.text-center { text-align: center; }\n.text-justify { text-align: justify; }\n.text-nowrap { white-space: nowrap; }\n\n// Transformation\n.text-lowercase { text-transform: lowercase; }\n.text-uppercase { text-transform: uppercase; }\n.text-capitalize { text-transform: capitalize; }\n\n// Contextual colors\n.text-muted {\n color: @text-muted;\n}\n.text-primary {\n .text-emphasis-variant(@brand-primary);\n}\n.text-success {\n .text-emphasis-variant(@state-success-text);\n}\n.text-info {\n .text-emphasis-variant(@state-info-text);\n}\n.text-warning {\n .text-emphasis-variant(@state-warning-text);\n}\n.text-danger {\n .text-emphasis-variant(@state-danger-text);\n}\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n // Given the contrast here, this is the only class to have its color inverted\n // automatically.\n color: #fff;\n .bg-variant(@brand-primary);\n}\n.bg-success {\n .bg-variant(@state-success-bg);\n}\n.bg-info {\n .bg-variant(@state-info-bg);\n}\n.bg-warning {\n .bg-variant(@state-warning-bg);\n}\n.bg-danger {\n .bg-variant(@state-danger-bg);\n}\n\n\n// Page header\n// -------------------------\n\n.page-header {\n padding-bottom: ((@line-height-computed / 2) - 1);\n margin: (@line-height-computed * 2) 0 @line-height-computed;\n border-bottom: 1px solid @page-header-border-color;\n}\n\n\n// Lists\n// -------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n margin-top: 0;\n margin-bottom: (@line-height-computed / 2);\n ul,\n ol {\n margin-bottom: 0;\n }\n}\n\n// List options\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n .list-unstyled();\n margin-left: -5px;\n\n > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n }\n}\n\n// Description Lists\ndl {\n margin-top: 0; // Remove browser default\n margin-bottom: @line-height-computed;\n}\ndt,\ndd {\n line-height: @line-height-base;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n.dl-horizontal {\n dd {\n &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present\n }\n\n @media (min-width: @dl-horizontal-breakpoint) {\n dt {\n float: left;\n width: (@dl-horizontal-offset - 20);\n clear: left;\n text-align: right;\n .text-overflow();\n }\n dd {\n margin-left: @dl-horizontal-offset;\n }\n }\n}\n\n\n// Misc\n// -------------------------\n\n// Abbreviations and acronyms\nabbr[title],\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted @abbr-border-color;\n}\n.initialism {\n font-size: 90%;\n .text-uppercase();\n}\n\n// Blockquotes\nblockquote {\n padding: (@line-height-computed / 2) @line-height-computed;\n margin: 0 0 @line-height-computed;\n font-size: @blockquote-font-size;\n border-left: 5px solid @blockquote-border-color;\n\n p,\n ul,\n ol {\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n // Note: Deprecated small and .small as of v3.1.0\n // Context: https://github.com/twbs/bootstrap/issues/11660\n footer,\n small,\n .small {\n display: block;\n font-size: 80%; // back to default font-size\n line-height: @line-height-base;\n color: @blockquote-small-color;\n\n &:before {\n content: '\\2014 \\00A0'; // em dash, nbsp\n }\n }\n}\n\n// Opposite alignment of blockquote\n//\n// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid @blockquote-border-color;\n border-left: 0;\n text-align: right;\n\n // Account for citation\n footer,\n small,\n .small {\n &:before { content: ''; }\n &:after {\n content: '\\00A0 \\2014'; // nbsp, em dash\n }\n }\n}\n\n// Addresses\naddress {\n margin-bottom: @line-height-computed;\n font-style: normal;\n line-height: @line-height-base;\n}\n","// Typography\n\n.text-emphasis-variant(@color) {\n color: @color;\n a&:hover,\n a&:focus {\n color: darken(@color, 10%);\n }\n}\n","// Contextual backgrounds\n\n.bg-variant(@color) {\n background-color: @color;\n a&:hover,\n a&:focus {\n background-color: darken(@color, 10%);\n }\n}\n","// Text overflow\n// Requires inline-block or block for proper styling\n\n.text-overflow() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n font-family: @font-family-monospace;\n}\n\n// Inline code\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: @code-color;\n background-color: @code-bg;\n border-radius: @border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: @kbd-color;\n background-color: @kbd-bg;\n border-radius: @border-radius-small;\n box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);\n\n kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n box-shadow: none;\n }\n}\n\n// Blocks of code\npre {\n display: block;\n padding: ((@line-height-computed - 1) / 2);\n margin: 0 0 (@line-height-computed / 2);\n font-size: (@font-size-base - 1); // 14px to 13px\n line-height: @line-height-base;\n word-break: break-all;\n word-wrap: break-word;\n color: @pre-color;\n background-color: @pre-bg;\n border: 1px solid @pre-border-color;\n border-radius: @border-radius-base;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n max-height: @pre-scrollable-max-height;\n overflow-y: scroll;\n}\n","//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n.container {\n .container-fixed();\n\n @media (min-width: @screen-sm-min) {\n width: @container-sm;\n }\n @media (min-width: @screen-md-min) {\n width: @container-md;\n }\n @media (min-width: @screen-lg-min) {\n width: @container-lg;\n }\n}\n\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but without any defined\n// width for fluid, full width layouts.\n\n.container-fluid {\n .container-fixed();\n}\n\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n.row {\n .make-row();\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n.make-grid-columns();\n\n\n// Extra small grid\n//\n// Columns, offsets, pushes, and pulls for extra small devices like\n// smartphones.\n\n.make-grid(xs);\n\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n\n@media (min-width: @screen-sm-min) {\n .make-grid(sm);\n}\n\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n\n@media (min-width: @screen-md-min) {\n .make-grid(md);\n}\n\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n\n@media (min-width: @screen-lg-min) {\n .make-grid(lg);\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n// Centered container element\n.container-fixed(@gutter: @grid-gutter-width) {\n margin-right: auto;\n margin-left: auto;\n padding-left: floor((@gutter / 2));\n padding-right: ceil((@gutter / 2));\n &:extend(.clearfix all);\n}\n\n// Creates a wrapper for a series of columns\n.make-row(@gutter: @grid-gutter-width) {\n margin-left: ceil((@gutter / -2));\n margin-right: floor((@gutter / -2));\n &:extend(.clearfix all);\n}\n\n// Generate the extra small columns\n.make-xs-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n float: left;\n width: percentage((@columns / @grid-columns));\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n}\n.make-xs-column-offset(@columns) {\n margin-left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-push(@columns) {\n left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-pull(@columns) {\n right: percentage((@columns / @grid-columns));\n}\n\n// Generate the small columns\n.make-sm-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-sm-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-offset(@columns) {\n @media (min-width: @screen-sm-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-push(@columns) {\n @media (min-width: @screen-sm-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-pull(@columns) {\n @media (min-width: @screen-sm-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the medium columns\n.make-md-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-md-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-offset(@columns) {\n @media (min-width: @screen-md-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-push(@columns) {\n @media (min-width: @screen-md-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-pull(@columns) {\n @media (min-width: @screen-md-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the large columns\n.make-lg-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-lg-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-offset(@columns) {\n @media (min-width: @screen-lg-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-push(@columns) {\n @media (min-width: @screen-lg-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-pull(@columns) {\n @media (min-width: @screen-lg-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `@grid-columns`.\n\n.make-grid-columns() {\n // Common styles for all sizes of grid columns, widths 1-12\n .col(@index) { // initial\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general; \"=<\" isn't a typo\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n position: relative;\n // Prevent columns from collapsing when empty\n min-height: 1px;\n // Inner gutter via padding\n padding-left: ceil((@grid-gutter-width / 2));\n padding-right: floor((@grid-gutter-width / 2));\n }\n }\n .col(1); // kickstart it\n}\n\n.float-grid-columns(@class) {\n .col(@index) { // initial\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n float: left;\n }\n }\n .col(1); // kickstart it\n}\n\n.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {\n .col-@{class}-@{index} {\n width: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index > 0) {\n .col-@{class}-push-@{index} {\n left: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index = 0) {\n .col-@{class}-push-0 {\n left: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index > 0) {\n .col-@{class}-pull-@{index} {\n right: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index = 0) {\n .col-@{class}-pull-0 {\n right: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = offset) {\n .col-@{class}-offset-@{index} {\n margin-left: percentage((@index / @grid-columns));\n }\n}\n\n// Basic looping in LESS\n.loop-grid-columns(@index, @class, @type) when (@index >= 0) {\n .calc-grid-column(@index, @class, @type);\n // next iteration\n .loop-grid-columns((@index - 1), @class, @type);\n}\n\n// Create grid for specific class\n.make-grid(@class) {\n .float-grid-columns(@class);\n .loop-grid-columns(@grid-columns, @class, width);\n .loop-grid-columns(@grid-columns, @class, pull);\n .loop-grid-columns(@grid-columns, @class, push);\n .loop-grid-columns(@grid-columns, @class, offset);\n}\n","//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n background-color: @table-bg;\n}\ncaption {\n padding-top: @table-cell-padding;\n padding-bottom: @table-cell-padding;\n color: @text-muted;\n text-align: left;\n}\nth {\n text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: @line-height-computed;\n // Cells\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-cell-padding;\n line-height: @line-height-base;\n vertical-align: top;\n border-top: 1px solid @table-border-color;\n }\n }\n }\n // Bottom align for column headings\n > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid @table-border-color;\n }\n // Remove top border from thead by default\n > caption + thead,\n > colgroup + thead,\n > thead:first-child {\n > tr:first-child {\n > th,\n > td {\n border-top: 0;\n }\n }\n }\n // Account for multiple tbody instances\n > tbody + tbody {\n border-top: 2px solid @table-border-color;\n }\n\n // Nesting\n .table {\n background-color: @body-bg;\n }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-condensed-cell-padding;\n }\n }\n }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n border: 1px solid @table-border-color;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n border: 1px solid @table-border-color;\n }\n }\n }\n > thead > tr {\n > th,\n > td {\n border-bottom-width: 2px;\n }\n }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n > tbody > tr:nth-of-type(odd) {\n background-color: @table-bg-accent;\n }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n > tbody > tr:hover {\n background-color: @table-bg-hover;\n }\n}\n\n\n// Table cell sizing\n//\n// Reset default table behavior\n\ntable col[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-column;\n}\ntable {\n td,\n th {\n &[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-cell;\n }\n }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n.table-row-variant(active; @table-bg-active);\n.table-row-variant(success; @state-success-bg);\n.table-row-variant(info; @state-info-bg);\n.table-row-variant(warning; @state-warning-bg);\n.table-row-variant(danger; @state-danger-bg);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n.table-responsive {\n overflow-x: auto;\n min-height: 0.01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837)\n\n @media screen and (max-width: @screen-xs-max) {\n width: 100%;\n margin-bottom: (@line-height-computed * 0.75);\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid @table-border-color;\n\n // Tighten up spacing\n > .table {\n margin-bottom: 0;\n\n // Ensure the content doesn't wrap\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n white-space: nowrap;\n }\n }\n }\n }\n\n // Special overrides for the bordered tables\n > .table-bordered {\n border: 0;\n\n // Nuke the appropriate borders so that the parent can handle them\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n\n // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n // chances are there will be only one `tr` in a `thead` and that would\n // remove the border altogether.\n > tbody,\n > tfoot {\n > tr:last-child {\n > th,\n > td {\n border-bottom: 0;\n }\n }\n }\n\n }\n }\n}\n","// Tables\n\n.table-row-variant(@state; @background) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table > thead > tr,\n .table > tbody > tr,\n .table > tfoot > tr {\n > td.@{state},\n > th.@{state},\n &.@{state} > td,\n &.@{state} > th {\n background-color: @background;\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover > tbody > tr {\n > td.@{state}:hover,\n > th.@{state}:hover,\n &.@{state}:hover > td,\n &:hover > .@{state},\n &.@{state}:hover > th {\n background-color: darken(@background, 5%);\n }\n }\n}\n","//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n // Chrome and Firefox set a `min-width: min-content;` on fieldsets,\n // so we reset that to ensure it behaves more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359.\n min-width: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: @line-height-computed;\n font-size: (@font-size-base * 1.5);\n line-height: inherit;\n color: @legend-color;\n border: 0;\n border-bottom: 1px solid @legend-border-color;\n}\n\nlabel {\n display: inline-block;\n max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)\n margin-bottom: 5px;\n font-weight: bold;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\n// Override content-box in Normalize (* isn't specific enough)\ninput[type=\"search\"] {\n .box-sizing(border-box);\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9; // IE8-9\n line-height: normal;\n}\n\ninput[type=\"file\"] {\n display: block;\n}\n\n// Make range inputs behave like textual form controls\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\n\n// Make multiple select elements height not fixed\nselect[multiple],\nselect[size] {\n height: auto;\n}\n\n// Focus for file, radio, and checkbox\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n .tab-focus();\n}\n\n// Adjust output element\noutput {\n display: block;\n padding-top: (@padding-base-vertical + 1);\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n}\n\n\n// Common form controls\n//\n// Shared size and type resets for form controls. Apply `.form-control` to any\n// of the following form controls:\n//\n// select\n// textarea\n// input[type=\"text\"]\n// input[type=\"password\"]\n// input[type=\"datetime\"]\n// input[type=\"datetime-local\"]\n// input[type=\"date\"]\n// input[type=\"month\"]\n// input[type=\"time\"]\n// input[type=\"week\"]\n// input[type=\"number\"]\n// input[type=\"email\"]\n// input[type=\"url\"]\n// input[type=\"search\"]\n// input[type=\"tel\"]\n// input[type=\"color\"]\n\n.form-control {\n display: block;\n width: 100%;\n height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n background-color: @input-bg;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid @input-border;\n border-radius: @input-border-radius; // Note: This has no effect on <select>s in some browsers, due to the limited stylability of <select>s in CSS.\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));\n .transition(~\"border-color ease-in-out .15s, box-shadow ease-in-out .15s\");\n\n // Customize the `:focus` state to imitate native WebKit styles.\n .form-control-focus();\n\n // Placeholder\n .placeholder();\n\n // Unstyle the caret on `<select>`s in IE10+.\n &::-ms-expand {\n border: 0;\n background-color: transparent;\n }\n\n // Disabled and read-only inputs\n //\n // HTML5 says that controls under a fieldset > legend:first-child won't be\n // disabled if the fieldset is disabled. Due to implementation difficulty, we\n // don't honor that edge case; we style them as disabled anyway.\n &[disabled],\n &[readonly],\n fieldset[disabled] & {\n background-color: @input-bg-disabled;\n opacity: 1; // iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655\n }\n\n &[disabled],\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n }\n\n // Reset height for `textarea`s\n textarea& {\n height: auto;\n }\n}\n\n\n// Search inputs in iOS\n//\n// This overrides the extra rounded corners on search inputs in iOS so that our\n// `.form-control` class can properly style them. Note that this cannot simply\n// be added to `.form-control` as it's not specific enough. For details, see\n// https://github.com/twbs/bootstrap/issues/11586.\n\ninput[type=\"search\"] {\n -webkit-appearance: none;\n}\n\n\n// Special styles for iOS temporal inputs\n//\n// In Mobile Safari, setting `display: block` on temporal inputs causes the\n// text within the input to become vertically misaligned. As a workaround, we\n// set a pixel line-height that matches the given height of the input, but only\n// for Safari. See https://bugs.webkit.org/show_bug.cgi?id=139848\n//\n// Note that as of 9.3, iOS doesn't support `week`.\n\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n input[type=\"date\"],\n input[type=\"time\"],\n input[type=\"datetime-local\"],\n input[type=\"month\"] {\n &.form-control {\n line-height: @input-height-base;\n }\n\n &.input-sm,\n .input-group-sm & {\n line-height: @input-height-small;\n }\n\n &.input-lg,\n .input-group-lg & {\n line-height: @input-height-large;\n }\n }\n}\n\n\n// Form groups\n//\n// Designed to help with the organization and spacing of vertical forms. For\n// horizontal forms, use the predefined grid classes.\n\n.form-group {\n margin-bottom: @form-group-margin-bottom;\n}\n\n\n// Checkboxes and radios\n//\n// Indent the labels to position radios/checkboxes as hanging controls.\n\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n\n label {\n min-height: @line-height-computed; // Ensure the input doesn't jump when there is no text\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n cursor: pointer;\n }\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-left: -20px;\n margin-top: 4px \\9;\n}\n\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing\n}\n\n// Radios and checkboxes on same line\n.radio-inline,\n.checkbox-inline {\n position: relative;\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n vertical-align: middle;\n font-weight: normal;\n cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px; // space out consecutive inline controls\n}\n\n// Apply same disabled cursor tweak as for inputs\n// Some special care is needed because <label>s don't inherit their parent's `cursor`.\n//\n// Note: Neither radios nor checkboxes can be readonly.\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n &[disabled],\n &.disabled,\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n }\n}\n// These classes are used directly on <label>s\n.radio-inline,\n.checkbox-inline {\n &.disabled,\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n }\n}\n// These classes are used on elements with <label> descendants\n.radio,\n.checkbox {\n &.disabled,\n fieldset[disabled] & {\n label {\n cursor: @cursor-disabled;\n }\n }\n}\n\n\n// Static form control text\n//\n// Apply class to a `p` element to make any string of text align with labels in\n// a horizontal form layout.\n\n.form-control-static {\n // Size it appropriately next to real form controls\n padding-top: (@padding-base-vertical + 1);\n padding-bottom: (@padding-base-vertical + 1);\n // Remove default margin from `p`\n margin-bottom: 0;\n min-height: (@line-height-computed + @font-size-base);\n\n &.input-lg,\n &.input-sm {\n padding-left: 0;\n padding-right: 0;\n }\n}\n\n\n// Form control sizing\n//\n// Build on `.form-control` with modifier classes to decrease or increase the\n// height and font-size of form controls.\n//\n// The `.form-group-* form-control` variations are sadly duplicated to avoid the\n// issue documented in https://github.com/twbs/bootstrap/issues/15074.\n\n.input-sm {\n .input-size(@input-height-small; @padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @input-border-radius-small);\n}\n.form-group-sm {\n .form-control {\n height: @input-height-small;\n padding: @padding-small-vertical @padding-small-horizontal;\n font-size: @font-size-small;\n line-height: @line-height-small;\n border-radius: @input-border-radius-small;\n }\n select.form-control {\n height: @input-height-small;\n line-height: @input-height-small;\n }\n textarea.form-control,\n select[multiple].form-control {\n height: auto;\n }\n .form-control-static {\n height: @input-height-small;\n min-height: (@line-height-computed + @font-size-small);\n padding: (@padding-small-vertical + 1) @padding-small-horizontal;\n font-size: @font-size-small;\n line-height: @line-height-small;\n }\n}\n\n.input-lg {\n .input-size(@input-height-large; @padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @input-border-radius-large);\n}\n.form-group-lg {\n .form-control {\n height: @input-height-large;\n padding: @padding-large-vertical @padding-large-horizontal;\n font-size: @font-size-large;\n line-height: @line-height-large;\n border-radius: @input-border-radius-large;\n }\n select.form-control {\n height: @input-height-large;\n line-height: @input-height-large;\n }\n textarea.form-control,\n select[multiple].form-control {\n height: auto;\n }\n .form-control-static {\n height: @input-height-large;\n min-height: (@line-height-computed + @font-size-large);\n padding: (@padding-large-vertical + 1) @padding-large-horizontal;\n font-size: @font-size-large;\n line-height: @line-height-large;\n }\n}\n\n\n// Form control feedback states\n//\n// Apply contextual and semantic states to individual form controls.\n\n.has-feedback {\n // Enable absolute positioning\n position: relative;\n\n // Ensure icons don't overlap text\n .form-control {\n padding-right: (@input-height-base * 1.25);\n }\n}\n// Feedback icon (requires .glyphicon classes)\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2; // Ensure icon is above input groups\n display: block;\n width: @input-height-base;\n height: @input-height-base;\n line-height: @input-height-base;\n text-align: center;\n pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n width: @input-height-large;\n height: @input-height-large;\n line-height: @input-height-large;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n width: @input-height-small;\n height: @input-height-small;\n line-height: @input-height-small;\n}\n\n// Feedback states\n.has-success {\n .form-control-validation(@state-success-text; @state-success-text; @state-success-bg);\n}\n.has-warning {\n .form-control-validation(@state-warning-text; @state-warning-text; @state-warning-bg);\n}\n.has-error {\n .form-control-validation(@state-danger-text; @state-danger-text; @state-danger-bg);\n}\n\n// Reposition feedback icon if input has visible label above\n.has-feedback label {\n\n & ~ .form-control-feedback {\n top: (@line-height-computed + 5); // Height of the `label` and its margin\n }\n &.sr-only ~ .form-control-feedback {\n top: 0;\n }\n}\n\n\n// Help text\n//\n// Apply to any element you wish to create light text for placement immediately\n// below a form control. Use for general help, formatting, or instructional text.\n\n.help-block {\n display: block; // account for any element using help-block\n margin-top: 5px;\n margin-bottom: 10px;\n color: lighten(@text-color, 25%); // lighten the text some for contrast\n}\n\n\n// Inline forms\n//\n// Make forms appear inline(-block) by adding the `.form-inline` class. Inline\n// forms begin stacked on extra small (mobile) devices and then go inline when\n// viewports reach <768px.\n//\n// Requires wrapping inputs and labels with `.form-group` for proper display of\n// default HTML form controls and our custom form controls (e.g., input groups).\n//\n// Heads up! This is mixin-ed into `.navbar-form` in navbars.less.\n\n.form-inline {\n\n // Kick in the inline\n @media (min-width: @screen-sm-min) {\n // Inline-block all the things for \"inline\"\n .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n\n // In navbar-form, allow folks to *not* use `.form-group`\n .form-control {\n display: inline-block;\n width: auto; // Prevent labels from stacking above inputs in `.form-group`\n vertical-align: middle;\n }\n\n // Make static controls behave like regular ones\n .form-control-static {\n display: inline-block;\n }\n\n .input-group {\n display: inline-table;\n vertical-align: middle;\n\n .input-group-addon,\n .input-group-btn,\n .form-control {\n width: auto;\n }\n }\n\n // Input groups need that 100% width though\n .input-group > .form-control {\n width: 100%;\n }\n\n .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n\n // Remove default margin on radios/checkboxes that were used for stacking, and\n // then undo the floating of radios and checkboxes to match.\n .radio,\n .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n\n label {\n padding-left: 0;\n }\n }\n .radio input[type=\"radio\"],\n .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n\n // Re-override the feedback icon.\n .has-feedback .form-control-feedback {\n top: 0;\n }\n }\n}\n\n\n// Horizontal forms\n//\n// Horizontal forms are built on grid classes and allow you to create forms with\n// labels on the left and inputs on the right.\n\n.form-horizontal {\n\n // Consistent vertical alignment of radios and checkboxes\n //\n // Labels also get some reset styles, but that is scoped to a media query below.\n .radio,\n .checkbox,\n .radio-inline,\n .checkbox-inline {\n margin-top: 0;\n margin-bottom: 0;\n padding-top: (@padding-base-vertical + 1); // Default padding plus a border\n }\n // Account for padding we're adding to ensure the alignment and of help text\n // and other content below items\n .radio,\n .checkbox {\n min-height: (@line-height-computed + (@padding-base-vertical + 1));\n }\n\n // Make form groups behave like rows\n .form-group {\n .make-row();\n }\n\n // Reset spacing and right align labels, but scope to media queries so that\n // labels on narrow viewports stack the same as a default form example.\n @media (min-width: @screen-sm-min) {\n .control-label {\n text-align: right;\n margin-bottom: 0;\n padding-top: (@padding-base-vertical + 1); // Default padding plus a border\n }\n }\n\n // Validation states\n //\n // Reposition the icon because it's now within a grid column and columns have\n // `position: relative;` on them. Also accounts for the grid gutter padding.\n .has-feedback .form-control-feedback {\n right: floor((@grid-gutter-width / 2));\n }\n\n // Form group sizes\n //\n // Quick utility class for applying `.input-lg` and `.input-sm` styles to the\n // inputs and labels within a `.form-group`.\n .form-group-lg {\n @media (min-width: @screen-sm-min) {\n .control-label {\n padding-top: (@padding-large-vertical + 1);\n font-size: @font-size-large;\n }\n }\n }\n .form-group-sm {\n @media (min-width: @screen-sm-min) {\n .control-label {\n padding-top: (@padding-small-vertical + 1);\n font-size: @font-size-small;\n }\n }\n }\n}\n","// Form validation states\n//\n// Used in forms.less to generate the form validation CSS for warnings, errors,\n// and successes.\n\n.form-control-validation(@text-color: #555; @border-color: #ccc; @background-color: #f5f5f5) {\n // Color the label and help text\n .help-block,\n .control-label,\n .radio,\n .checkbox,\n .radio-inline,\n .checkbox-inline,\n &.radio label,\n &.checkbox label,\n &.radio-inline label,\n &.checkbox-inline label {\n color: @text-color;\n }\n // Set the border and box shadow on specific inputs to match\n .form-control {\n border-color: @border-color;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work\n &:focus {\n border-color: darken(@border-color, 10%);\n @shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@border-color, 20%);\n .box-shadow(@shadow);\n }\n }\n // Set validation states also for addons\n .input-group-addon {\n color: @text-color;\n border-color: @border-color;\n background-color: @background-color;\n }\n // Optional feedback icon\n .form-control-feedback {\n color: @text-color;\n }\n}\n\n\n// Form control focus state\n//\n// Generate a customized focus state and for any input with the specified color,\n// which defaults to the `@input-border-focus` variable.\n//\n// We highly encourage you to not customize the default value, but instead use\n// this to tweak colors on an as-needed basis. This aesthetic change is based on\n// WebKit's default styles, but applicable to a wider range of browsers. Its\n// usability and accessibility should be taken into account with any change.\n//\n// Example usage: change the default blue border and shadow to white for better\n// contrast against a dark gray background.\n.form-control-focus(@color: @input-border-focus) {\n @color-rgba: rgba(red(@color), green(@color), blue(@color), .6);\n &:focus {\n border-color: @color;\n outline: 0;\n .box-shadow(~\"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px @{color-rgba}\");\n }\n}\n\n// Form control sizing\n//\n// Relative text size, padding, and border-radii changes for form controls. For\n// horizontal sizing, wrap controls in the predefined grid classes. `<select>`\n// element gets special love because it's special, and that's a fact!\n.input-size(@input-height; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n height: @input-height;\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n\n select& {\n height: @input-height;\n line-height: @input-height;\n }\n\n textarea&,\n select[multiple]& {\n height: auto;\n }\n}\n","//\n// Buttons\n// --------------------------------------------------\n\n\n// Base styles\n// --------------------------------------------------\n\n.btn {\n display: inline-block;\n margin-bottom: 0; // For input.btn\n font-weight: @btn-font-weight;\n text-align: center;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid transparent;\n white-space: nowrap;\n .button-size(@padding-base-vertical; @padding-base-horizontal; @font-size-base; @line-height-base; @btn-border-radius-base);\n .user-select(none);\n\n &,\n &:active,\n &.active {\n &:focus,\n &.focus {\n .tab-focus();\n }\n }\n\n &:hover,\n &:focus,\n &.focus {\n color: @btn-default-color;\n text-decoration: none;\n }\n\n &:active,\n &.active {\n outline: 0;\n background-image: none;\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n .opacity(.65);\n .box-shadow(none);\n }\n\n a& {\n &.disabled,\n fieldset[disabled] & {\n pointer-events: none; // Future-proof disabling of clicks on `<a>` elements\n }\n }\n}\n\n\n// Alternate buttons\n// --------------------------------------------------\n\n.btn-default {\n .button-variant(@btn-default-color; @btn-default-bg; @btn-default-border);\n}\n.btn-primary {\n .button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border);\n}\n// Success appears as green\n.btn-success {\n .button-variant(@btn-success-color; @btn-success-bg; @btn-success-border);\n}\n// Info appears as blue-green\n.btn-info {\n .button-variant(@btn-info-color; @btn-info-bg; @btn-info-border);\n}\n// Warning appears as orange\n.btn-warning {\n .button-variant(@btn-warning-color; @btn-warning-bg; @btn-warning-border);\n}\n// Danger and error appear as red\n.btn-danger {\n .button-variant(@btn-danger-color; @btn-danger-bg; @btn-danger-border);\n}\n\n\n// Link buttons\n// -------------------------\n\n// Make a button look and behave like a link\n.btn-link {\n color: @link-color;\n font-weight: normal;\n border-radius: 0;\n\n &,\n &:active,\n &.active,\n &[disabled],\n fieldset[disabled] & {\n background-color: transparent;\n .box-shadow(none);\n }\n &,\n &:hover,\n &:focus,\n &:active {\n border-color: transparent;\n }\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: @link-hover-decoration;\n background-color: transparent;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @btn-link-disabled-color;\n text-decoration: none;\n }\n }\n}\n\n\n// Button Sizes\n// --------------------------------------------------\n\n.btn-lg {\n // line-height: ensure even-numbered height of button next to large input\n .button-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @btn-border-radius-large);\n}\n.btn-sm {\n // line-height: ensure proper height of button next to small input\n .button-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @btn-border-radius-small);\n}\n.btn-xs {\n .button-size(@padding-xs-vertical; @padding-xs-horizontal; @font-size-small; @line-height-small; @btn-border-radius-small);\n}\n\n\n// Block button\n// --------------------------------------------------\n\n.btn-block {\n display: block;\n width: 100%;\n}\n\n// Vertically space out multiple block buttons\n.btn-block + .btn-block {\n margin-top: 5px;\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n &.btn-block {\n width: 100%;\n }\n}\n","// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n.button-variant(@color; @background; @border) {\n color: @color;\n background-color: @background;\n border-color: @border;\n\n &:focus,\n &.focus {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 25%);\n }\n &:hover {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 12%);\n }\n &:active,\n &.active,\n .open > .dropdown-toggle& {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 12%);\n\n &:hover,\n &:focus,\n &.focus {\n color: @color;\n background-color: darken(@background, 17%);\n border-color: darken(@border, 25%);\n }\n }\n &:active,\n &.active,\n .open > .dropdown-toggle& {\n background-image: none;\n }\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus,\n &.focus {\n background-color: @background;\n border-color: @border;\n }\n }\n\n .badge {\n color: @background;\n background-color: @color;\n }\n}\n\n// Button sizes\n.button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n}\n","// Opacity\n\n.opacity(@opacity) {\n opacity: @opacity;\n // IE8 filter\n @opacity-ie: (@opacity * 100);\n filter: ~\"alpha(opacity=@{opacity-ie})\";\n}\n","//\n// Component animations\n// --------------------------------------------------\n\n// Heads up!\n//\n// We don't use the `.opacity()` mixin here since it causes a bug with text\n// fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552.\n\n.fade {\n opacity: 0;\n .transition(opacity .15s linear);\n &.in {\n opacity: 1;\n }\n}\n\n.collapse {\n display: none;\n\n &.in { display: block; }\n tr&.in { display: table-row; }\n tbody&.in { display: table-row-group; }\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n .transition-property(~\"height, visibility\");\n .transition-duration(.35s);\n .transition-timing-function(ease);\n}\n","//\n// Dropdown menus\n// --------------------------------------------------\n\n\n// Dropdown arrow/caret\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: @caret-width-base dashed;\n border-top: @caret-width-base solid ~\"\\9\"; // IE8\n border-right: @caret-width-base solid transparent;\n border-left: @caret-width-base solid transparent;\n}\n\n// The dropdown wrapper (div)\n.dropup,\n.dropdown {\n position: relative;\n}\n\n// Prevent the focus on the dropdown toggle when closing dropdowns\n.dropdown-toggle:focus {\n outline: 0;\n}\n\n// The dropdown menu (ul)\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: @zindex-dropdown;\n display: none; // none by default, but block on \"open\" of the menu\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0; // override default ul\n list-style: none;\n font-size: @font-size-base;\n text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\n background-color: @dropdown-bg;\n border: 1px solid @dropdown-fallback-border; // IE8 fallback\n border: 1px solid @dropdown-border;\n border-radius: @border-radius-base;\n .box-shadow(0 6px 12px rgba(0,0,0,.175));\n background-clip: padding-box;\n\n // Aligns the dropdown menu to right\n //\n // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`\n &.pull-right {\n right: 0;\n left: auto;\n }\n\n // Dividers (basically an hr) within the dropdown\n .divider {\n .nav-divider(@dropdown-divider-bg);\n }\n\n // Links within the dropdown menu\n > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: @line-height-base;\n color: @dropdown-link-color;\n white-space: nowrap; // prevent links from randomly breaking onto new lines\n }\n}\n\n// Hover/Focus state\n.dropdown-menu > li > a {\n &:hover,\n &:focus {\n text-decoration: none;\n color: @dropdown-link-hover-color;\n background-color: @dropdown-link-hover-bg;\n }\n}\n\n// Active state\n.dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: @dropdown-link-active-color;\n text-decoration: none;\n outline: 0;\n background-color: @dropdown-link-active-bg;\n }\n}\n\n// Disabled state\n//\n// Gray out text and ensure the hover/focus state remains gray\n\n.dropdown-menu > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @dropdown-link-disabled-color;\n }\n\n // Nuke hover/focus effects\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: transparent;\n background-image: none; // Remove CSS gradient\n .reset-filter();\n cursor: @cursor-disabled;\n }\n}\n\n// Open state for the dropdown\n.open {\n // Show the menu\n > .dropdown-menu {\n display: block;\n }\n\n // Remove the outline when :focus is triggered\n > a {\n outline: 0;\n }\n}\n\n// Menu positioning\n//\n// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown\n// menu with the parent.\n.dropdown-menu-right {\n left: auto; // Reset the default from `.dropdown-menu`\n right: 0;\n}\n// With v3, we enabled auto-flipping if you have a dropdown within a right\n// aligned nav component. To enable the undoing of that, we provide an override\n// to restore the default dropdown menu alignment.\n//\n// This is only for left-aligning a dropdown menu within a `.navbar-right` or\n// `.pull-right` nav component.\n.dropdown-menu-left {\n left: 0;\n right: auto;\n}\n\n// Dropdown section headers\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: @font-size-small;\n line-height: @line-height-base;\n color: @dropdown-header-color;\n white-space: nowrap; // as with > li > a\n}\n\n// Backdrop to catch body clicks on mobile, etc.\n.dropdown-backdrop {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n z-index: (@zindex-dropdown - 10);\n}\n\n// Right aligned dropdowns\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n//\n// Just add .dropup after the standard .dropdown class and you're set, bro.\n// TODO: abstract this so that the navbar fixed styles are not placed here?\n\n.dropup,\n.navbar-fixed-bottom .dropdown {\n // Reverse the caret\n .caret {\n border-top: 0;\n border-bottom: @caret-width-base dashed;\n border-bottom: @caret-width-base solid ~\"\\9\"; // IE8\n content: \"\";\n }\n // Different positioning for bottom up menu\n .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n }\n}\n\n\n// Component alignment\n//\n// Reiterate per navbar.less and the modified component alignment there.\n\n@media (min-width: @grid-float-breakpoint) {\n .navbar-right {\n .dropdown-menu {\n .dropdown-menu-right();\n }\n // Necessary for overrides of the default right aligned menu.\n // Will remove come v4 in all likelihood.\n .dropdown-menu-left {\n .dropdown-menu-left();\n }\n }\n}\n","// Horizontal dividers\n//\n// Dividers (basically an hr) within dropdowns and nav lists\n\n.nav-divider(@color: #e5e5e5) {\n height: 1px;\n margin: ((@line-height-computed / 2) - 1) 0;\n overflow: hidden;\n background-color: @color;\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n","//\n// Button groups\n// --------------------------------------------------\n\n// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle; // match .btn alignment given font-size hack above\n > .btn {\n position: relative;\n float: left;\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active,\n &.active {\n z-index: 2;\n }\n }\n}\n\n// Prevent double borders when buttons are next to each other\n.btn-group {\n .btn + .btn,\n .btn + .btn-group,\n .btn-group + .btn,\n .btn-group + .btn-group {\n margin-left: -1px;\n }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n margin-left: -5px; // Offset the first child's margin\n &:extend(.clearfix all);\n\n .btn,\n .btn-group,\n .input-group {\n float: left;\n }\n > .btn,\n > .btn-group,\n > .input-group {\n margin-left: 5px;\n }\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n\n// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match\n.btn-group > .btn:first-child {\n margin-left: 0;\n &:not(:last-child):not(.dropdown-toggle) {\n .border-right-radius(0);\n }\n}\n// Need .dropdown-toggle since :last-child doesn't apply, given that a .dropdown-menu is used immediately after it\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n .border-left-radius(0);\n}\n\n// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) {\n > .btn:last-child,\n > .dropdown-toggle {\n .border-right-radius(0);\n }\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n .border-left-radius(0);\n}\n\n// On active and open, don't show outline\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-xs > .btn { &:extend(.btn-xs); }\n.btn-group-sm > .btn { &:extend(.btn-sm); }\n.btn-group-lg > .btn { &:extend(.btn-lg); }\n\n\n// Split button dropdowns\n// ----------------------\n\n// Give the line between buttons some depth\n.btn-group > .btn + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px;\n}\n\n// The clickable button for toggling the menu\n// Remove the gradient and set the same inset shadow as the :active state\n.btn-group.open .dropdown-toggle {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n\n // Show no shadow for `.btn-link` since it has no other button styles.\n &.btn-link {\n .box-shadow(none);\n }\n}\n\n\n// Reposition the caret\n.btn .caret {\n margin-left: 0;\n}\n// Carets in other button sizes\n.btn-lg .caret {\n border-width: @caret-width-large @caret-width-large 0;\n border-bottom-width: 0;\n}\n// Upside down carets for .dropup\n.dropup .btn-lg .caret {\n border-width: 0 @caret-width-large @caret-width-large;\n}\n\n\n// Vertical button groups\n// ----------------------\n\n.btn-group-vertical {\n > .btn,\n > .btn-group,\n > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n }\n\n // Clear floats so dropdown menus can be properly placed\n > .btn-group {\n &:extend(.clearfix all);\n > .btn {\n float: none;\n }\n }\n\n > .btn + .btn,\n > .btn + .btn-group,\n > .btn-group + .btn,\n > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n }\n}\n\n.btn-group-vertical > .btn {\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n &:first-child:not(:last-child) {\n .border-top-radius(@btn-border-radius-base);\n .border-bottom-radius(0);\n }\n &:last-child:not(:first-child) {\n .border-top-radius(0);\n .border-bottom-radius(@btn-border-radius-base);\n }\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) {\n > .btn:last-child,\n > .dropdown-toggle {\n .border-bottom-radius(0);\n }\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n .border-top-radius(0);\n}\n\n\n// Justified button groups\n// ----------------------\n\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n > .btn,\n > .btn-group {\n float: none;\n display: table-cell;\n width: 1%;\n }\n > .btn-group .btn {\n width: 100%;\n }\n\n > .btn-group .dropdown-menu {\n left: auto;\n }\n}\n\n\n// Checkbox and radio options\n//\n// In order to support the browser's form validation feedback, powered by the\n// `required` attribute, we have to \"hide\" the inputs via `clip`. We cannot use\n// `display: none;` or `visibility: hidden;` as that also hides the popover.\n// Simply visually hiding the inputs via `opacity` would leave them clickable in\n// certain cases which is prevented by using `clip` and `pointer-events`.\n// This way, we ensure a DOM element is visible to position the popover from.\n//\n// See https://github.com/twbs/bootstrap/pull/12794 and\n// https://github.com/twbs/bootstrap/pull/14559 for more information.\n\n[data-toggle=\"buttons\"] {\n > .btn,\n > .btn-group > .btn {\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0,0,0,0);\n pointer-events: none;\n }\n }\n}\n","// Single side border-radius\n\n.border-top-radius(@radius) {\n border-top-right-radius: @radius;\n border-top-left-radius: @radius;\n}\n.border-right-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-top-right-radius: @radius;\n}\n.border-bottom-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-bottom-left-radius: @radius;\n}\n.border-left-radius(@radius) {\n border-bottom-left-radius: @radius;\n border-top-left-radius: @radius;\n}\n","//\n// Input groups\n// --------------------------------------------------\n\n// Base styles\n// -------------------------\n.input-group {\n position: relative; // For dropdowns\n display: table;\n border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table\n\n // Undo padding and float of grid classes\n &[class*=\"col-\"] {\n float: none;\n padding-left: 0;\n padding-right: 0;\n }\n\n .form-control {\n // Ensure that the input is always above the *appended* addon button for\n // proper border colors.\n position: relative;\n z-index: 2;\n\n // IE9 fubars the placeholder attribute in text inputs and the arrows on\n // select elements in input groups. To fix it, we float the input. Details:\n // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855\n float: left;\n\n width: 100%;\n margin-bottom: 0;\n\n &:focus {\n z-index: 3;\n }\n }\n}\n\n// Sizing options\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n .input-lg();\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n .input-sm();\n}\n\n\n// Display as table-cell\n// -------------------------\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n}\n// Addon and addon wrapper for buttons\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle; // Match the inputs\n}\n\n// Text input groups\n// -------------------------\n.input-group-addon {\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n font-weight: normal;\n line-height: 1;\n color: @input-color;\n text-align: center;\n background-color: @input-group-addon-bg;\n border: 1px solid @input-group-addon-border-color;\n border-radius: @input-border-radius;\n\n // Sizing\n &.input-sm {\n padding: @padding-small-vertical @padding-small-horizontal;\n font-size: @font-size-small;\n border-radius: @input-border-radius-small;\n }\n &.input-lg {\n padding: @padding-large-vertical @padding-large-horizontal;\n font-size: @font-size-large;\n border-radius: @input-border-radius-large;\n }\n\n // Nuke default margins from checkboxes and radios to vertically center within.\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n margin-top: 0;\n }\n}\n\n// Reset rounded corners\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n .border-right-radius(0);\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n .border-left-radius(0);\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n\n// Button input groups\n// -------------------------\n.input-group-btn {\n position: relative;\n // Jankily prevent input button groups from wrapping with `white-space` and\n // `font-size` in combination with `inline-block` on buttons.\n font-size: 0;\n white-space: nowrap;\n\n // Negative margin for spacing, position for bringing hovered/focused/actived\n // element above the siblings.\n > .btn {\n position: relative;\n + .btn {\n margin-left: -1px;\n }\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active {\n z-index: 2;\n }\n }\n\n // Negative margin to only have a 1px border between the two\n &:first-child {\n > .btn,\n > .btn-group {\n margin-right: -1px;\n }\n }\n &:last-child {\n > .btn,\n > .btn-group {\n z-index: 2;\n margin-left: -1px;\n }\n }\n}\n","//\n// Navs\n// --------------------------------------------------\n\n\n// Base class\n// --------------------------------------------------\n\n.nav {\n margin-bottom: 0;\n padding-left: 0; // Override default ul/ol\n list-style: none;\n &:extend(.clearfix all);\n\n > li {\n position: relative;\n display: block;\n\n > a {\n position: relative;\n display: block;\n padding: @nav-link-padding;\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: @nav-link-hover-bg;\n }\n }\n\n // Disabled state sets text to gray and nukes hover/tab effects\n &.disabled > a {\n color: @nav-disabled-link-color;\n\n &:hover,\n &:focus {\n color: @nav-disabled-link-hover-color;\n text-decoration: none;\n background-color: transparent;\n cursor: @cursor-disabled;\n }\n }\n }\n\n // Open dropdowns\n .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @nav-link-hover-bg;\n border-color: @link-color;\n }\n }\n\n // Nav dividers (deprecated with v3.0.1)\n //\n // This should have been removed in v3 with the dropping of `.nav-list`, but\n // we missed it. We don't currently support this anywhere, but in the interest\n // of maintaining backward compatibility in case you use it, it's deprecated.\n .nav-divider {\n .nav-divider();\n }\n\n // Prevent IE8 from misplacing imgs\n //\n // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989\n > li > a > img {\n max-width: none;\n }\n}\n\n\n// Tabs\n// -------------------------\n\n// Give the tabs something to sit on\n.nav-tabs {\n border-bottom: 1px solid @nav-tabs-border-color;\n > li {\n float: left;\n // Make the list-items overlay the bottom border\n margin-bottom: -1px;\n\n // Actual tabs (as links)\n > a {\n margin-right: 2px;\n line-height: @line-height-base;\n border: 1px solid transparent;\n border-radius: @border-radius-base @border-radius-base 0 0;\n &:hover {\n border-color: @nav-tabs-link-hover-border-color @nav-tabs-link-hover-border-color @nav-tabs-border-color;\n }\n }\n\n // Active state, and its :hover to override normal :hover\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-tabs-active-link-hover-color;\n background-color: @nav-tabs-active-link-hover-bg;\n border: 1px solid @nav-tabs-active-link-hover-border-color;\n border-bottom-color: transparent;\n cursor: default;\n }\n }\n }\n // pulling this in mainly for less shorthand\n &.nav-justified {\n .nav-justified();\n .nav-tabs-justified();\n }\n}\n\n\n// Pills\n// -------------------------\n.nav-pills {\n > li {\n float: left;\n\n // Links rendered as pills\n > a {\n border-radius: @nav-pills-border-radius;\n }\n + li {\n margin-left: 2px;\n }\n\n // Active state\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-pills-active-link-hover-color;\n background-color: @nav-pills-active-link-hover-bg;\n }\n }\n }\n}\n\n\n// Stacked pills\n.nav-stacked {\n > li {\n float: none;\n + li {\n margin-top: 2px;\n margin-left: 0; // no need for this gap between nav items\n }\n }\n}\n\n\n// Nav variations\n// --------------------------------------------------\n\n// Justified nav links\n// -------------------------\n\n.nav-justified {\n width: 100%;\n\n > li {\n float: none;\n > a {\n text-align: center;\n margin-bottom: 5px;\n }\n }\n\n > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n }\n\n @media (min-width: @screen-sm-min) {\n > li {\n display: table-cell;\n width: 1%;\n > a {\n margin-bottom: 0;\n }\n }\n }\n}\n\n// Move borders to anchors instead of bottom of list\n//\n// Mixin for adding on top the shared `.nav-justified` styles for our tabs\n.nav-tabs-justified {\n border-bottom: 0;\n\n > li > a {\n // Override margin from .nav-tabs\n margin-right: 0;\n border-radius: @border-radius-base;\n }\n\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border: 1px solid @nav-tabs-justified-link-border-color;\n }\n\n @media (min-width: @screen-sm-min) {\n > li > a {\n border-bottom: 1px solid @nav-tabs-justified-link-border-color;\n border-radius: @border-radius-base @border-radius-base 0 0;\n }\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border-bottom-color: @nav-tabs-justified-active-link-border-color;\n }\n }\n}\n\n\n// Tabbable tabs\n// -------------------------\n\n// Hide tabbable panes to start, show them when `.active`\n.tab-content {\n > .tab-pane {\n display: none;\n }\n > .active {\n display: block;\n }\n}\n\n\n// Dropdowns\n// -------------------------\n\n// Specific dropdowns\n.nav-tabs .dropdown-menu {\n // make dropdown border overlap tab border\n margin-top: -1px;\n // Remove the top rounded corners here since there is a hard edge above the menu\n .border-top-radius(0);\n}\n","//\n// Navbars\n// --------------------------------------------------\n\n\n// Wrapper and base class\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n position: relative;\n min-height: @navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)\n margin-bottom: @navbar-margin-bottom;\n border: 1px solid transparent;\n\n // Prevent floats from breaking the navbar\n &:extend(.clearfix all);\n\n @media (min-width: @grid-float-breakpoint) {\n border-radius: @navbar-border-radius;\n }\n}\n\n\n// Navbar heading\n//\n// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy\n// styling of responsive aspects.\n\n.navbar-header {\n &:extend(.clearfix all);\n\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n }\n}\n\n\n// Navbar collapse (body)\n//\n// Group your navbar content into this for easy collapsing and expanding across\n// various device sizes. By default, this content is collapsed when <768px, but\n// will expand past that for a horizontal display.\n//\n// To start (on mobile devices) the navbar links, forms, and buttons are stacked\n// vertically and include a `max-height` to overflow in case you have too much\n// content for the user's viewport.\n\n.navbar-collapse {\n overflow-x: visible;\n padding-right: @navbar-padding-horizontal;\n padding-left: @navbar-padding-horizontal;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255,255,255,.1);\n &:extend(.clearfix all);\n -webkit-overflow-scrolling: touch;\n\n &.in {\n overflow-y: auto;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n width: auto;\n border-top: 0;\n box-shadow: none;\n\n &.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0; // Override default setting\n overflow: visible !important;\n }\n\n &.in {\n overflow-y: visible;\n }\n\n // Undo the collapse side padding for navbars with containers to ensure\n // alignment of right-aligned contents.\n .navbar-fixed-top &,\n .navbar-static-top &,\n .navbar-fixed-bottom & {\n padding-left: 0;\n padding-right: 0;\n }\n }\n}\n\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n .navbar-collapse {\n max-height: @navbar-collapse-max-height;\n\n @media (max-device-width: @screen-xs-min) and (orientation: landscape) {\n max-height: 200px;\n }\n }\n}\n\n\n// Both navbar header and collapse\n//\n// When a container is present, change the behavior of the header and collapse.\n\n.container,\n.container-fluid {\n > .navbar-header,\n > .navbar-collapse {\n margin-right: -@navbar-padding-horizontal;\n margin-left: -@navbar-padding-horizontal;\n\n @media (min-width: @grid-float-breakpoint) {\n margin-right: 0;\n margin-left: 0;\n }\n }\n}\n\n\n//\n// Navbar alignment options\n//\n// Display the navbar across the entirety of the page or fixed it to the top or\n// bottom of the page.\n\n// Static top (unfixed, but 100% wide) navbar\n.navbar-static-top {\n z-index: @zindex-navbar;\n border-width: 0 0 1px;\n\n @media (min-width: @grid-float-breakpoint) {\n border-radius: 0;\n }\n}\n\n// Fix the top/bottom navbars when screen real estate supports it\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: @zindex-navbar-fixed;\n\n // Undo the rounded corners\n @media (min-width: @grid-float-breakpoint) {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0; // override .navbar defaults\n border-width: 1px 0 0;\n}\n\n\n// Brand/project name\n\n.navbar-brand {\n float: left;\n padding: @navbar-padding-vertical @navbar-padding-horizontal;\n font-size: @font-size-large;\n line-height: @line-height-computed;\n height: @navbar-height;\n\n &:hover,\n &:focus {\n text-decoration: none;\n }\n\n > img {\n display: block;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n .navbar > .container &,\n .navbar > .container-fluid & {\n margin-left: -@navbar-padding-horizontal;\n }\n }\n}\n\n\n// Navbar toggle\n//\n// Custom button for toggling the `.navbar-collapse`, powered by the collapse\n// JavaScript plugin.\n\n.navbar-toggle {\n position: relative;\n float: right;\n margin-right: @navbar-padding-horizontal;\n padding: 9px 10px;\n .navbar-vertical-align(34px);\n background-color: transparent;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid transparent;\n border-radius: @border-radius-base;\n\n // We remove the `outline` here, but later compensate by attaching `:hover`\n // styles to `:focus`.\n &:focus {\n outline: 0;\n }\n\n // Bars\n .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n }\n .icon-bar + .icon-bar {\n margin-top: 4px;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n display: none;\n }\n}\n\n\n// Navbar nav links\n//\n// Builds on top of the `.nav` components with its own modifier class to make\n// the nav the full height of the horizontal nav (above 768px).\n\n.navbar-nav {\n margin: (@navbar-padding-vertical / 2) -@navbar-padding-horizontal;\n\n > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: @line-height-computed;\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display when collapsed\n .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n > li > a,\n .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n > li > a {\n line-height: @line-height-computed;\n &:hover,\n &:focus {\n background-image: none;\n }\n }\n }\n }\n\n // Uncollapse the nav\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n margin: 0;\n\n > li {\n float: left;\n > a {\n padding-top: @navbar-padding-vertical;\n padding-bottom: @navbar-padding-vertical;\n }\n }\n }\n}\n\n\n// Navbar form\n//\n// Extension of the `.form-inline` with some extra flavor for optimum display in\n// our navbars.\n\n.navbar-form {\n margin-left: -@navbar-padding-horizontal;\n margin-right: -@navbar-padding-horizontal;\n padding: 10px @navbar-padding-horizontal;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n @shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n\n // Mixin behavior for optimum display\n .form-inline();\n\n .form-group {\n @media (max-width: @grid-float-breakpoint-max) {\n margin-bottom: 5px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n }\n\n // Vertically center in expanded, horizontal navbar\n .navbar-vertical-align(@input-height-base);\n\n // Undo 100% width for pull classes\n @media (min-width: @grid-float-breakpoint) {\n width: auto;\n border: 0;\n margin-left: 0;\n margin-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n .box-shadow(none);\n }\n}\n\n\n// Dropdown menus\n\n// Menu position and menu carets\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n .border-top-radius(0);\n}\n// Menu position and menu caret support for dropups via extra dropup class\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n .border-top-radius(@navbar-border-radius);\n .border-bottom-radius(0);\n}\n\n\n// Buttons in navbars\n//\n// Vertically center a button within a navbar (when *not* in a form).\n\n.navbar-btn {\n .navbar-vertical-align(@input-height-base);\n\n &.btn-sm {\n .navbar-vertical-align(@input-height-small);\n }\n &.btn-xs {\n .navbar-vertical-align(22);\n }\n}\n\n\n// Text in navbars\n//\n// Add a class to make any element properly align itself vertically within the navbars.\n\n.navbar-text {\n .navbar-vertical-align(@line-height-computed);\n\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n margin-left: @navbar-padding-horizontal;\n margin-right: @navbar-padding-horizontal;\n }\n}\n\n\n// Component alignment\n//\n// Repurpose the pull utilities as their own navbar utilities to avoid specificity\n// issues with parents and chaining. Only do this when the navbar is uncollapsed\n// though so that navbar contents properly stack and align in mobile.\n//\n// Declared after the navbar components to ensure more specificity on the margins.\n\n@media (min-width: @grid-float-breakpoint) {\n .navbar-left { .pull-left(); }\n .navbar-right {\n .pull-right();\n margin-right: -@navbar-padding-horizontal;\n\n ~ .navbar-right {\n margin-right: 0;\n }\n }\n}\n\n\n// Alternate navbars\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n background-color: @navbar-default-bg;\n border-color: @navbar-default-border;\n\n .navbar-brand {\n color: @navbar-default-brand-color;\n &:hover,\n &:focus {\n color: @navbar-default-brand-hover-color;\n background-color: @navbar-default-brand-hover-bg;\n }\n }\n\n .navbar-text {\n color: @navbar-default-color;\n }\n\n .navbar-nav {\n > li > a {\n color: @navbar-default-link-color;\n\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n background-color: @navbar-default-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-active-color;\n background-color: @navbar-default-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n background-color: @navbar-default-link-disabled-bg;\n }\n }\n }\n\n .navbar-toggle {\n border-color: @navbar-default-toggle-border-color;\n &:hover,\n &:focus {\n background-color: @navbar-default-toggle-hover-bg;\n }\n .icon-bar {\n background-color: @navbar-default-toggle-icon-bar-bg;\n }\n }\n\n .navbar-collapse,\n .navbar-form {\n border-color: @navbar-default-border;\n }\n\n // Dropdown menu items\n .navbar-nav {\n // Remove background color from open dropdown\n > .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @navbar-default-link-active-bg;\n color: @navbar-default-link-active-color;\n }\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display when collapsed\n .open .dropdown-menu {\n > li > a {\n color: @navbar-default-link-color;\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n background-color: @navbar-default-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-active-color;\n background-color: @navbar-default-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n background-color: @navbar-default-link-disabled-bg;\n }\n }\n }\n }\n }\n\n\n // Links in navbars\n //\n // Add a class to ensure links outside the navbar nav are colored correctly.\n\n .navbar-link {\n color: @navbar-default-link-color;\n &:hover {\n color: @navbar-default-link-hover-color;\n }\n }\n\n .btn-link {\n color: @navbar-default-link-color;\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n }\n }\n }\n}\n\n// Inverse navbar\n\n.navbar-inverse {\n background-color: @navbar-inverse-bg;\n border-color: @navbar-inverse-border;\n\n .navbar-brand {\n color: @navbar-inverse-brand-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-brand-hover-color;\n background-color: @navbar-inverse-brand-hover-bg;\n }\n }\n\n .navbar-text {\n color: @navbar-inverse-color;\n }\n\n .navbar-nav {\n > li > a {\n color: @navbar-inverse-link-color;\n\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n background-color: @navbar-inverse-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-active-color;\n background-color: @navbar-inverse-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n background-color: @navbar-inverse-link-disabled-bg;\n }\n }\n }\n\n // Darken the responsive nav toggle\n .navbar-toggle {\n border-color: @navbar-inverse-toggle-border-color;\n &:hover,\n &:focus {\n background-color: @navbar-inverse-toggle-hover-bg;\n }\n .icon-bar {\n background-color: @navbar-inverse-toggle-icon-bar-bg;\n }\n }\n\n .navbar-collapse,\n .navbar-form {\n border-color: darken(@navbar-inverse-bg, 7%);\n }\n\n // Dropdowns\n .navbar-nav {\n > .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @navbar-inverse-link-active-bg;\n color: @navbar-inverse-link-active-color;\n }\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display\n .open .dropdown-menu {\n > .dropdown-header {\n border-color: @navbar-inverse-border;\n }\n .divider {\n background-color: @navbar-inverse-border;\n }\n > li > a {\n color: @navbar-inverse-link-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n background-color: @navbar-inverse-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-active-color;\n background-color: @navbar-inverse-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n background-color: @navbar-inverse-link-disabled-bg;\n }\n }\n }\n }\n }\n\n .navbar-link {\n color: @navbar-inverse-link-color;\n &:hover {\n color: @navbar-inverse-link-hover-color;\n }\n }\n\n .btn-link {\n color: @navbar-inverse-link-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n }\n }\n }\n}\n","// Navbar vertical align\n//\n// Vertically center elements in the navbar.\n// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.\n\n.navbar-vertical-align(@element-height) {\n margin-top: ((@navbar-height - @element-height) / 2);\n margin-bottom: ((@navbar-height - @element-height) / 2);\n}\n","//\n// Utility classes\n// --------------------------------------------------\n\n\n// Floats\n// -------------------------\n\n.clearfix {\n .clearfix();\n}\n.center-block {\n .center-block();\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n\n\n// Toggling content\n// -------------------------\n\n// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n .text-hide();\n}\n\n\n// Hide from screenreaders and browsers\n//\n// Credit: HTML5 Boilerplate\n\n.hidden {\n display: none !important;\n}\n\n\n// For Affix plugin\n// -------------------------\n\n.affix {\n position: fixed;\n}\n","//\n// Breadcrumbs\n// --------------------------------------------------\n\n\n.breadcrumb {\n padding: @breadcrumb-padding-vertical @breadcrumb-padding-horizontal;\n margin-bottom: @line-height-computed;\n list-style: none;\n background-color: @breadcrumb-bg;\n border-radius: @border-radius-base;\n\n > li {\n display: inline-block;\n\n + li:before {\n content: \"@{breadcrumb-separator}\\00a0\"; // Unicode space added since inline-block means non-collapsing white-space\n padding: 0 5px;\n color: @breadcrumb-color;\n }\n }\n\n > .active {\n color: @breadcrumb-active-color;\n }\n}\n","//\n// Pagination (multiple pages)\n// --------------------------------------------------\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: @line-height-computed 0;\n border-radius: @border-radius-base;\n\n > li {\n display: inline; // Remove list-style and block-level defaults\n > a,\n > span {\n position: relative;\n float: left; // Collapse white-space\n padding: @padding-base-vertical @padding-base-horizontal;\n line-height: @line-height-base;\n text-decoration: none;\n color: @pagination-color;\n background-color: @pagination-bg;\n border: 1px solid @pagination-border;\n margin-left: -1px;\n }\n &:first-child {\n > a,\n > span {\n margin-left: 0;\n .border-left-radius(@border-radius-base);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius-base);\n }\n }\n }\n\n > li > a,\n > li > span {\n &:hover,\n &:focus {\n z-index: 2;\n color: @pagination-hover-color;\n background-color: @pagination-hover-bg;\n border-color: @pagination-hover-border;\n }\n }\n\n > .active > a,\n > .active > span {\n &,\n &:hover,\n &:focus {\n z-index: 3;\n color: @pagination-active-color;\n background-color: @pagination-active-bg;\n border-color: @pagination-active-border;\n cursor: default;\n }\n }\n\n > .disabled {\n > span,\n > span:hover,\n > span:focus,\n > a,\n > a:hover,\n > a:focus {\n color: @pagination-disabled-color;\n background-color: @pagination-disabled-bg;\n border-color: @pagination-disabled-border;\n cursor: @cursor-disabled;\n }\n }\n}\n\n// Sizing\n// --------------------------------------------------\n\n// Large\n.pagination-lg {\n .pagination-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);\n}\n\n// Small\n.pagination-sm {\n .pagination-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n","// Pagination\n\n.pagination-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n > li {\n > a,\n > span {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n }\n &:first-child {\n > a,\n > span {\n .border-left-radius(@border-radius);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius);\n }\n }\n }\n}\n","//\n// Pager pagination\n// --------------------------------------------------\n\n\n.pager {\n padding-left: 0;\n margin: @line-height-computed 0;\n list-style: none;\n text-align: center;\n &:extend(.clearfix all);\n li {\n display: inline;\n > a,\n > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: @pager-bg;\n border: 1px solid @pager-border;\n border-radius: @pager-border-radius;\n }\n\n > a:hover,\n > a:focus {\n text-decoration: none;\n background-color: @pager-hover-bg;\n }\n }\n\n .next {\n > a,\n > span {\n float: right;\n }\n }\n\n .previous {\n > a,\n > span {\n float: left;\n }\n }\n\n .disabled {\n > a,\n > a:hover,\n > a:focus,\n > span {\n color: @pager-disabled-color;\n background-color: @pager-bg;\n cursor: @cursor-disabled;\n }\n }\n}\n","//\n// Labels\n// --------------------------------------------------\n\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: @label-color;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n\n // Add hover effects, but only for links\n a& {\n &:hover,\n &:focus {\n color: @label-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n }\n\n // Empty labels collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for labels in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n}\n\n// Colors\n// Contextual variations (linked labels get darker on :hover)\n\n.label-default {\n .label-variant(@label-default-bg);\n}\n\n.label-primary {\n .label-variant(@label-primary-bg);\n}\n\n.label-success {\n .label-variant(@label-success-bg);\n}\n\n.label-info {\n .label-variant(@label-info-bg);\n}\n\n.label-warning {\n .label-variant(@label-warning-bg);\n}\n\n.label-danger {\n .label-variant(@label-danger-bg);\n}\n","// Labels\n\n.label-variant(@color) {\n background-color: @color;\n\n &[href] {\n &:hover,\n &:focus {\n background-color: darken(@color, 10%);\n }\n }\n}\n","//\n// Badges\n// --------------------------------------------------\n\n\n// Base class\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: @font-size-small;\n font-weight: @badge-font-weight;\n color: @badge-color;\n line-height: @badge-line-height;\n vertical-align: middle;\n white-space: nowrap;\n text-align: center;\n background-color: @badge-bg;\n border-radius: @badge-border-radius;\n\n // Empty badges collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for badges in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n\n .btn-xs &,\n .btn-group-xs > .btn & {\n top: 0;\n padding: 1px 5px;\n }\n\n // Hover state, but only for links\n a& {\n &:hover,\n &:focus {\n color: @badge-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n }\n\n // Account for badges in navs\n .list-group-item.active > &,\n .nav-pills > .active > a > & {\n color: @badge-active-color;\n background-color: @badge-active-bg;\n }\n\n .list-group-item > & {\n float: right;\n }\n\n .list-group-item > & + & {\n margin-right: 5px;\n }\n\n .nav-pills > li > a > & {\n margin-left: 3px;\n }\n}\n","//\n// Jumbotron\n// --------------------------------------------------\n\n\n.jumbotron {\n padding-top: @jumbotron-padding;\n padding-bottom: @jumbotron-padding;\n margin-bottom: @jumbotron-padding;\n color: @jumbotron-color;\n background-color: @jumbotron-bg;\n\n h1,\n .h1 {\n color: @jumbotron-heading-color;\n }\n\n p {\n margin-bottom: (@jumbotron-padding / 2);\n font-size: @jumbotron-font-size;\n font-weight: 200;\n }\n\n > hr {\n border-top-color: darken(@jumbotron-bg, 10%);\n }\n\n .container &,\n .container-fluid & {\n border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container\n padding-left: (@grid-gutter-width / 2);\n padding-right: (@grid-gutter-width / 2);\n }\n\n .container {\n max-width: 100%;\n }\n\n @media screen and (min-width: @screen-sm-min) {\n padding-top: (@jumbotron-padding * 1.6);\n padding-bottom: (@jumbotron-padding * 1.6);\n\n .container &,\n .container-fluid & {\n padding-left: (@jumbotron-padding * 2);\n padding-right: (@jumbotron-padding * 2);\n }\n\n h1,\n .h1 {\n font-size: @jumbotron-heading-font-size;\n }\n }\n}\n","//\n// Thumbnails\n// --------------------------------------------------\n\n\n// Mixin and adjust the regular image class\n.thumbnail {\n display: block;\n padding: @thumbnail-padding;\n margin-bottom: @line-height-computed;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(border .2s ease-in-out);\n\n > img,\n a > img {\n &:extend(.img-responsive);\n margin-left: auto;\n margin-right: auto;\n }\n\n // Add a hover state for linked versions only\n a&:hover,\n a&:focus,\n a&.active {\n border-color: @link-color;\n }\n\n // Image captions\n .caption {\n padding: @thumbnail-caption-padding;\n color: @thumbnail-caption-color;\n }\n}\n","//\n// Alerts\n// --------------------------------------------------\n\n\n// Base styles\n// -------------------------\n\n.alert {\n padding: @alert-padding;\n margin-bottom: @line-height-computed;\n border: 1px solid transparent;\n border-radius: @alert-border-radius;\n\n // Headings for larger alerts\n h4 {\n margin-top: 0;\n // Specified for the h4 to prevent conflicts of changing @headings-color\n color: inherit;\n }\n\n // Provide class for links that match alerts\n .alert-link {\n font-weight: @alert-link-font-weight;\n }\n\n // Improve alignment and spacing of inner content\n > p,\n > ul {\n margin-bottom: 0;\n }\n\n > p + p {\n margin-top: 5px;\n }\n}\n\n// Dismissible alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0.\n.alert-dismissible {\n padding-right: (@alert-padding + 20);\n\n // Adjust close link position\n .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n }\n}\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n.alert-success {\n .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text);\n}\n\n.alert-info {\n .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text);\n}\n\n.alert-warning {\n .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text);\n}\n\n.alert-danger {\n .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text);\n}\n","// Alerts\n\n.alert-variant(@background; @border; @text-color) {\n background-color: @background;\n border-color: @border;\n color: @text-color;\n\n hr {\n border-top-color: darken(@border, 5%);\n }\n .alert-link {\n color: darken(@text-color, 10%);\n }\n}\n","//\n// Progress bars\n// --------------------------------------------------\n\n\n// Bar animations\n// -------------------------\n\n// WebKit\n@-webkit-keyframes progress-bar-stripes {\n from { background-position: 40px 0; }\n to { background-position: 0 0; }\n}\n\n// Spec and IE10+\n@keyframes progress-bar-stripes {\n from { background-position: 40px 0; }\n to { background-position: 0 0; }\n}\n\n\n// Bar itself\n// -------------------------\n\n// Outer container\n.progress {\n overflow: hidden;\n height: @line-height-computed;\n margin-bottom: @line-height-computed;\n background-color: @progress-bg;\n border-radius: @progress-border-radius;\n .box-shadow(inset 0 1px 2px rgba(0,0,0,.1));\n}\n\n// Bar of progress\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: @font-size-small;\n line-height: @line-height-computed;\n color: @progress-bar-color;\n text-align: center;\n background-color: @progress-bar-bg;\n .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));\n .transition(width .6s ease);\n}\n\n// Striped bars\n//\n// `.progress-striped .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar-striped` class, which you just add to an existing\n// `.progress-bar`.\n.progress-striped .progress-bar,\n.progress-bar-striped {\n #gradient > .striped();\n background-size: 40px 40px;\n}\n\n// Call animation for the active one\n//\n// `.progress.active .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar.active` approach.\n.progress.active .progress-bar,\n.progress-bar.active {\n .animation(progress-bar-stripes 2s linear infinite);\n}\n\n\n// Variations\n// -------------------------\n\n.progress-bar-success {\n .progress-bar-variant(@progress-bar-success-bg);\n}\n\n.progress-bar-info {\n .progress-bar-variant(@progress-bar-info-bg);\n}\n\n.progress-bar-warning {\n .progress-bar-variant(@progress-bar-warning-bg);\n}\n\n.progress-bar-danger {\n .progress-bar-variant(@progress-bar-danger-bg);\n}\n","// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Progress bars\n\n.progress-bar-variant(@color) {\n background-color: @color;\n\n // Deprecated parent class requirement as of v3.2.0\n .progress-striped & {\n #gradient > .striped();\n }\n}\n",".media {\n // Proper spacing between instances of .media\n margin-top: 15px;\n\n &:first-child {\n margin-top: 0;\n }\n}\n\n.media,\n.media-body {\n zoom: 1;\n overflow: hidden;\n}\n\n.media-body {\n width: 10000px;\n}\n\n.media-object {\n display: block;\n\n // Fix collapse in webkit from max-width: 100% and display: table-cell.\n &.img-thumbnail {\n max-width: none;\n }\n}\n\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n\n.media-middle {\n vertical-align: middle;\n}\n\n.media-bottom {\n vertical-align: bottom;\n}\n\n// Reset margins on headings for tighter default spacing\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n\n// Media list variation\n//\n// Undo default ul/ol styles\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n","//\n// List groups\n// --------------------------------------------------\n\n\n// Base class\n//\n// Easily usable on <ul>, <ol>, or <div>.\n\n.list-group {\n // No need to set list-style: none; since .list-group-item is block level\n margin-bottom: 20px;\n padding-left: 0; // reset padding because ul and ol\n}\n\n\n// Individual list items\n//\n// Use on `li`s or `div`s within the `.list-group` parent.\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n // Place the border on the list items and negative margin up for better styling\n margin-bottom: -1px;\n background-color: @list-group-bg;\n border: 1px solid @list-group-border;\n\n // Round the first and last items\n &:first-child {\n .border-top-radius(@list-group-border-radius);\n }\n &:last-child {\n margin-bottom: 0;\n .border-bottom-radius(@list-group-border-radius);\n }\n}\n\n\n// Interactive list items\n//\n// Use anchor or button elements instead of `li`s or `div`s to create interactive items.\n// Includes an extra `.active` modifier class for showing selected items.\n\na.list-group-item,\nbutton.list-group-item {\n color: @list-group-link-color;\n\n .list-group-item-heading {\n color: @list-group-link-heading-color;\n }\n\n // Hover state\n &:hover,\n &:focus {\n text-decoration: none;\n color: @list-group-link-hover-color;\n background-color: @list-group-hover-bg;\n }\n}\n\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n\n.list-group-item {\n // Disabled state\n &.disabled,\n &.disabled:hover,\n &.disabled:focus {\n background-color: @list-group-disabled-bg;\n color: @list-group-disabled-color;\n cursor: @cursor-disabled;\n\n // Force color to inherit for custom content\n .list-group-item-heading {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-disabled-text-color;\n }\n }\n\n // Active class on item itself, not parent\n &.active,\n &.active:hover,\n &.active:focus {\n z-index: 2; // Place active items above their siblings for proper border styling\n color: @list-group-active-color;\n background-color: @list-group-active-bg;\n border-color: @list-group-active-border;\n\n // Force color to inherit for custom content\n .list-group-item-heading,\n .list-group-item-heading > small,\n .list-group-item-heading > .small {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-active-text-color;\n }\n }\n}\n\n\n// Contextual variants\n//\n// Add modifier classes to change text and background color on individual items.\n// Organizationally, this must come after the `:hover` states.\n\n.list-group-item-variant(success; @state-success-bg; @state-success-text);\n.list-group-item-variant(info; @state-info-bg; @state-info-text);\n.list-group-item-variant(warning; @state-warning-bg; @state-warning-text);\n.list-group-item-variant(danger; @state-danger-bg; @state-danger-text);\n\n\n// Custom content options\n//\n// Extra classes for creating well-formatted content within `.list-group-item`s.\n\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n","// List Groups\n\n.list-group-item-variant(@state; @background; @color) {\n .list-group-item-@{state} {\n color: @color;\n background-color: @background;\n\n a&,\n button& {\n color: @color;\n\n .list-group-item-heading {\n color: inherit;\n }\n\n &:hover,\n &:focus {\n color: @color;\n background-color: darken(@background, 5%);\n }\n &.active,\n &.active:hover,\n &.active:focus {\n color: #fff;\n background-color: @color;\n border-color: @color;\n }\n }\n }\n}\n","//\n// Panels\n// --------------------------------------------------\n\n\n// Base class\n.panel {\n margin-bottom: @line-height-computed;\n background-color: @panel-bg;\n border: 1px solid transparent;\n border-radius: @panel-border-radius;\n .box-shadow(0 1px 1px rgba(0,0,0,.05));\n}\n\n// Panel contents\n.panel-body {\n padding: @panel-body-padding;\n &:extend(.clearfix all);\n}\n\n// Optional heading\n.panel-heading {\n padding: @panel-heading-padding;\n border-bottom: 1px solid transparent;\n .border-top-radius((@panel-border-radius - 1));\n\n > .dropdown .dropdown-toggle {\n color: inherit;\n }\n}\n\n// Within heading, strip any `h*` tag of its default margins for spacing.\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: ceil((@font-size-base * 1.125));\n color: inherit;\n\n > a,\n > small,\n > .small,\n > small > a,\n > .small > a {\n color: inherit;\n }\n}\n\n// Optional footer (stays gray in every modifier class)\n.panel-footer {\n padding: @panel-footer-padding;\n background-color: @panel-footer-bg;\n border-top: 1px solid @panel-inner-border;\n .border-bottom-radius((@panel-border-radius - 1));\n}\n\n\n// List groups in panels\n//\n// By default, space out list group content from panel headings to account for\n// any kind of custom content between the two.\n\n.panel {\n > .list-group,\n > .panel-collapse > .list-group {\n margin-bottom: 0;\n\n .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n }\n\n // Add border top radius for first one\n &:first-child {\n .list-group-item:first-child {\n border-top: 0;\n .border-top-radius((@panel-border-radius - 1));\n }\n }\n\n // Add border bottom radius for last one\n &:last-child {\n .list-group-item:last-child {\n border-bottom: 0;\n .border-bottom-radius((@panel-border-radius - 1));\n }\n }\n }\n > .panel-heading + .panel-collapse > .list-group {\n .list-group-item:first-child {\n .border-top-radius(0);\n }\n }\n}\n// Collapse space between when there's no additional content.\n.panel-heading + .list-group {\n .list-group-item:first-child {\n border-top-width: 0;\n }\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n\n// Tables in panels\n//\n// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and\n// watch it go full width.\n\n.panel {\n > .table,\n > .table-responsive > .table,\n > .panel-collapse > .table {\n margin-bottom: 0;\n\n caption {\n padding-left: @panel-body-padding;\n padding-right: @panel-body-padding;\n }\n }\n // Add border top radius for first one\n > .table:first-child,\n > .table-responsive:first-child > .table:first-child {\n .border-top-radius((@panel-border-radius - 1));\n\n > thead:first-child,\n > tbody:first-child {\n > tr:first-child {\n border-top-left-radius: (@panel-border-radius - 1);\n border-top-right-radius: (@panel-border-radius - 1);\n\n td:first-child,\n th:first-child {\n border-top-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-top-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n // Add border bottom radius for last one\n > .table:last-child,\n > .table-responsive:last-child > .table:last-child {\n .border-bottom-radius((@panel-border-radius - 1));\n\n > tbody:last-child,\n > tfoot:last-child {\n > tr:last-child {\n border-bottom-left-radius: (@panel-border-radius - 1);\n border-bottom-right-radius: (@panel-border-radius - 1);\n\n td:first-child,\n th:first-child {\n border-bottom-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-bottom-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n > .panel-body + .table,\n > .panel-body + .table-responsive,\n > .table + .panel-body,\n > .table-responsive + .panel-body {\n border-top: 1px solid @table-border-color;\n }\n > .table > tbody:first-child > tr:first-child th,\n > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n }\n > .table-bordered,\n > .table-responsive > .table-bordered {\n border: 0;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n > thead,\n > tbody {\n > tr:first-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n > tbody,\n > tfoot {\n > tr:last-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n }\n > .table-responsive {\n border: 0;\n margin-bottom: 0;\n }\n}\n\n\n// Collapsible panels (aka, accordion)\n//\n// Wrap a series of panels in `.panel-group` to turn them into an accordion with\n// the help of our collapse JavaScript plugin.\n\n.panel-group {\n margin-bottom: @line-height-computed;\n\n // Tighten up margin so it's only between panels\n .panel {\n margin-bottom: 0;\n border-radius: @panel-border-radius;\n\n + .panel {\n margin-top: 5px;\n }\n }\n\n .panel-heading {\n border-bottom: 0;\n\n + .panel-collapse > .panel-body,\n + .panel-collapse > .list-group {\n border-top: 1px solid @panel-inner-border;\n }\n }\n\n .panel-footer {\n border-top: 0;\n + .panel-collapse .panel-body {\n border-bottom: 1px solid @panel-inner-border;\n }\n }\n}\n\n\n// Contextual variations\n.panel-default {\n .panel-variant(@panel-default-border; @panel-default-text; @panel-default-heading-bg; @panel-default-border);\n}\n.panel-primary {\n .panel-variant(@panel-primary-border; @panel-primary-text; @panel-primary-heading-bg; @panel-primary-border);\n}\n.panel-success {\n .panel-variant(@panel-success-border; @panel-success-text; @panel-success-heading-bg; @panel-success-border);\n}\n.panel-info {\n .panel-variant(@panel-info-border; @panel-info-text; @panel-info-heading-bg; @panel-info-border);\n}\n.panel-warning {\n .panel-variant(@panel-warning-border; @panel-warning-text; @panel-warning-heading-bg; @panel-warning-border);\n}\n.panel-danger {\n .panel-variant(@panel-danger-border; @panel-danger-text; @panel-danger-heading-bg; @panel-danger-border);\n}\n","// Panels\n\n.panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border) {\n border-color: @border;\n\n & > .panel-heading {\n color: @heading-text-color;\n background-color: @heading-bg-color;\n border-color: @heading-border;\n\n + .panel-collapse > .panel-body {\n border-top-color: @border;\n }\n .badge {\n color: @heading-bg-color;\n background-color: @heading-text-color;\n }\n }\n & > .panel-footer {\n + .panel-collapse > .panel-body {\n border-bottom-color: @border;\n }\n }\n}\n","// Embeds responsive\n//\n// Credit: Nicolas Gallagher and SUIT CSS.\n\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n\n .embed-responsive-item,\n iframe,\n embed,\n object,\n video {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n height: 100%;\n width: 100%;\n border: 0;\n }\n}\n\n// Modifier class for 16:9 aspect ratio\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n\n// Modifier class for 4:3 aspect ratio\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n","//\n// Wells\n// --------------------------------------------------\n\n\n// Base class\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: @well-bg;\n border: 1px solid @well-border;\n border-radius: @border-radius-base;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.05));\n blockquote {\n border-color: #ddd;\n border-color: rgba(0,0,0,.15);\n }\n}\n\n// Sizes\n.well-lg {\n padding: 24px;\n border-radius: @border-radius-large;\n}\n.well-sm {\n padding: 9px;\n border-radius: @border-radius-small;\n}\n","//\n// Close icons\n// --------------------------------------------------\n\n\n.close {\n float: right;\n font-size: (@font-size-base * 1.5);\n font-weight: @close-font-weight;\n line-height: 1;\n color: @close-color;\n text-shadow: @close-text-shadow;\n .opacity(.2);\n\n &:hover,\n &:focus {\n color: @close-color;\n text-decoration: none;\n cursor: pointer;\n .opacity(.5);\n }\n\n // Additional properties for button version\n // iOS requires the button element instead of an anchor tag.\n // If you want the anchor version, it requires `href=\"#\"`.\n // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n button& {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n }\n}\n","//\n// Modals\n// --------------------------------------------------\n\n// .modal-open - body class for killing the scroll\n// .modal - container to scroll within\n// .modal-dialog - positioning shell for the actual modal\n// .modal-content - actual modal w/ bg and corners and shit\n\n// Kill the scroll on the body\n.modal-open {\n overflow: hidden;\n}\n\n// Container that the modal scrolls within\n.modal {\n display: none;\n overflow: hidden;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal;\n -webkit-overflow-scrolling: touch;\n\n // Prevent Chrome on Windows from adding a focus outline. For details, see\n // https://github.com/twbs/bootstrap/pull/10951.\n outline: 0;\n\n // When fading in the modal, animate it to slide down\n &.fade .modal-dialog {\n .translate(0, -25%);\n .transition-transform(~\"0.3s ease-out\");\n }\n &.in .modal-dialog { .translate(0, 0) }\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n// Shell div to position the modal with bottom padding\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n\n// Actual modal\n.modal-content {\n position: relative;\n background-color: @modal-content-bg;\n border: 1px solid @modal-content-fallback-border-color; //old browsers fallback (ie8 etc)\n border: 1px solid @modal-content-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 3px 9px rgba(0,0,0,.5));\n background-clip: padding-box;\n // Remove focus outline from opened modal\n outline: 0;\n}\n\n// Modal background\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal-background;\n background-color: @modal-backdrop-bg;\n // Fade for backdrop\n &.fade { .opacity(0); }\n &.in { .opacity(@modal-backdrop-opacity); }\n}\n\n// Modal header\n// Top section of the modal w/ title and dismiss\n.modal-header {\n padding: @modal-title-padding;\n border-bottom: 1px solid @modal-header-border-color;\n &:extend(.clearfix all);\n}\n// Close icon\n.modal-header .close {\n margin-top: -2px;\n}\n\n// Title text within header\n.modal-title {\n margin: 0;\n line-height: @modal-title-line-height;\n}\n\n// Modal body\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\n.modal-body {\n position: relative;\n padding: @modal-inner-padding;\n}\n\n// Footer (for actions)\n.modal-footer {\n padding: @modal-inner-padding;\n text-align: right; // right align buttons\n border-top: 1px solid @modal-footer-border-color;\n &:extend(.clearfix all); // clear it in case folks use .pull-* classes on buttons\n\n // Properly space out buttons\n .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0; // account for input[type=\"submit\"] which gets the bottom margin like all other inputs\n }\n // but override that for button groups\n .btn-group .btn + .btn {\n margin-left: -1px;\n }\n // and override it for block buttons as well\n .btn-block + .btn-block {\n margin-left: 0;\n }\n}\n\n// Measure scrollbar width for padding body during modal show/hide\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n// Scale up the modal\n@media (min-width: @screen-sm-min) {\n // Automatically set modal's width for larger viewports\n .modal-dialog {\n width: @modal-md;\n margin: 30px auto;\n }\n .modal-content {\n .box-shadow(0 5px 15px rgba(0,0,0,.5));\n }\n\n // Modal sizes\n .modal-sm { width: @modal-sm; }\n}\n\n@media (min-width: @screen-md-min) {\n .modal-lg { width: @modal-lg; }\n}\n","//\n// Tooltips\n// --------------------------------------------------\n\n\n// Base class\n.tooltip {\n position: absolute;\n z-index: @zindex-tooltip;\n display: block;\n // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n .reset-text();\n font-size: @font-size-small;\n\n .opacity(0);\n\n &.in { .opacity(@tooltip-opacity); }\n &.top { margin-top: -3px; padding: @tooltip-arrow-width 0; }\n &.right { margin-left: 3px; padding: 0 @tooltip-arrow-width; }\n &.bottom { margin-top: 3px; padding: @tooltip-arrow-width 0; }\n &.left { margin-left: -3px; padding: 0 @tooltip-arrow-width; }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n max-width: @tooltip-max-width;\n padding: 3px 8px;\n color: @tooltip-color;\n text-align: center;\n background-color: @tooltip-bg;\n border-radius: @border-radius-base;\n}\n\n// Arrows\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n// Note: Deprecated .top-left, .top-right, .bottom-left, and .bottom-right as of v3.3.1\n.tooltip {\n &.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-left .tooltip-arrow {\n bottom: 0;\n right: @tooltip-arrow-width;\n margin-bottom: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-right .tooltip-arrow {\n bottom: 0;\n left: @tooltip-arrow-width;\n margin-bottom: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width @tooltip-arrow-width 0;\n border-right-color: @tooltip-arrow-color;\n }\n &.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-left-color: @tooltip-arrow-color;\n }\n &.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-left .tooltip-arrow {\n top: 0;\n right: @tooltip-arrow-width;\n margin-top: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-right .tooltip-arrow {\n top: 0;\n left: @tooltip-arrow-width;\n margin-top: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n}\n",".reset-text() {\n font-family: @font-family-base;\n // We deliberately do NOT reset font-size.\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: @line-height-base;\n text-align: left; // Fallback for where `start` is not supported\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n}\n","//\n// Popovers\n// --------------------------------------------------\n\n\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: @zindex-popover;\n display: none;\n max-width: @popover-max-width;\n padding: 1px;\n // Our parent element can be arbitrary since popovers are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n .reset-text();\n font-size: @font-size-base;\n\n background-color: @popover-bg;\n background-clip: padding-box;\n border: 1px solid @popover-fallback-border-color;\n border: 1px solid @popover-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 5px 10px rgba(0,0,0,.2));\n\n // Offset the popover to account for the popover arrow\n &.top { margin-top: -@popover-arrow-width; }\n &.right { margin-left: @popover-arrow-width; }\n &.bottom { margin-top: @popover-arrow-width; }\n &.left { margin-left: -@popover-arrow-width; }\n}\n\n.popover-title {\n margin: 0; // reset heading margin\n padding: 8px 14px;\n font-size: @font-size-base;\n background-color: @popover-title-bg;\n border-bottom: 1px solid darken(@popover-title-bg, 5%);\n border-radius: (@border-radius-large - 1) (@border-radius-large - 1) 0 0;\n}\n\n.popover-content {\n padding: 9px 14px;\n}\n\n// Arrows\n//\n// .arrow is outer, .arrow:after is inner\n\n.popover > .arrow {\n &,\n &:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n }\n}\n.popover > .arrow {\n border-width: @popover-arrow-outer-width;\n}\n.popover > .arrow:after {\n border-width: @popover-arrow-width;\n content: \"\";\n}\n\n.popover {\n &.top > .arrow {\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-bottom-width: 0;\n border-top-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-top-color: @popover-arrow-outer-color;\n bottom: -@popover-arrow-outer-width;\n &:after {\n content: \" \";\n bottom: 1px;\n margin-left: -@popover-arrow-width;\n border-bottom-width: 0;\n border-top-color: @popover-arrow-color;\n }\n }\n &.right > .arrow {\n top: 50%;\n left: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-left-width: 0;\n border-right-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-right-color: @popover-arrow-outer-color;\n &:after {\n content: \" \";\n left: 1px;\n bottom: -@popover-arrow-width;\n border-left-width: 0;\n border-right-color: @popover-arrow-color;\n }\n }\n &.bottom > .arrow {\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-top-width: 0;\n border-bottom-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-bottom-color: @popover-arrow-outer-color;\n top: -@popover-arrow-outer-width;\n &:after {\n content: \" \";\n top: 1px;\n margin-left: -@popover-arrow-width;\n border-top-width: 0;\n border-bottom-color: @popover-arrow-color;\n }\n }\n\n &.left > .arrow {\n top: 50%;\n right: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-right-width: 0;\n border-left-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-left-color: @popover-arrow-outer-color;\n &:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: @popover-arrow-color;\n bottom: -@popover-arrow-width;\n }\n }\n}\n","//\n// Carousel\n// --------------------------------------------------\n\n\n// Wrapper for the slide container and indicators\n.carousel {\n position: relative;\n}\n\n.carousel-inner {\n position: relative;\n overflow: hidden;\n width: 100%;\n\n > .item {\n display: none;\n position: relative;\n .transition(.6s ease-in-out left);\n\n // Account for jankitude on images\n > img,\n > a > img {\n &:extend(.img-responsive);\n line-height: 1;\n }\n\n // WebKit CSS3 transforms for supported devices\n @media all and (transform-3d), (-webkit-transform-3d) {\n .transition-transform(~'0.6s ease-in-out');\n .backface-visibility(~'hidden');\n .perspective(1000px);\n\n &.next,\n &.active.right {\n .translate3d(100%, 0, 0);\n left: 0;\n }\n &.prev,\n &.active.left {\n .translate3d(-100%, 0, 0);\n left: 0;\n }\n &.next.left,\n &.prev.right,\n &.active {\n .translate3d(0, 0, 0);\n left: 0;\n }\n }\n }\n\n > .active,\n > .next,\n > .prev {\n display: block;\n }\n\n > .active {\n left: 0;\n }\n\n > .next,\n > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n }\n\n > .next {\n left: 100%;\n }\n > .prev {\n left: -100%;\n }\n > .next.left,\n > .prev.right {\n left: 0;\n }\n\n > .active.left {\n left: -100%;\n }\n > .active.right {\n left: 100%;\n }\n\n}\n\n// Left/right controls for nav\n// ---------------------------\n\n.carousel-control {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: @carousel-control-width;\n .opacity(@carousel-control-opacity);\n font-size: @carousel-control-font-size;\n color: @carousel-control-color;\n text-align: center;\n text-shadow: @carousel-text-shadow;\n background-color: rgba(0, 0, 0, 0); // Fix IE9 click-thru bug\n // We can't have this transition here because WebKit cancels the carousel\n // animation if you trip this while in the middle of another animation.\n\n // Set gradients for backgrounds\n &.left {\n #gradient > .horizontal(@start-color: rgba(0,0,0,.5); @end-color: rgba(0,0,0,.0001));\n }\n &.right {\n left: auto;\n right: 0;\n #gradient > .horizontal(@start-color: rgba(0,0,0,.0001); @end-color: rgba(0,0,0,.5));\n }\n\n // Hover/focus state\n &:hover,\n &:focus {\n outline: 0;\n color: @carousel-control-color;\n text-decoration: none;\n .opacity(.9);\n }\n\n // Toggles\n .icon-prev,\n .icon-next,\n .glyphicon-chevron-left,\n .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n margin-top: -10px;\n z-index: 5;\n display: inline-block;\n }\n .icon-prev,\n .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n }\n .icon-next,\n .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n }\n .icon-prev,\n .icon-next {\n width: 20px;\n height: 20px;\n line-height: 1;\n font-family: serif;\n }\n\n\n .icon-prev {\n &:before {\n content: '\\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)\n }\n }\n .icon-next {\n &:before {\n content: '\\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)\n }\n }\n}\n\n// Optional indicator pips\n//\n// Add an unordered list with the following class and add a list item for each\n// slide your carousel holds.\n\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n margin-left: -30%;\n padding-left: 0;\n list-style: none;\n text-align: center;\n\n li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n border: 1px solid @carousel-indicator-border-color;\n border-radius: 10px;\n cursor: pointer;\n\n // IE8-9 hack for event handling\n //\n // Internet Explorer 8-9 does not support clicks on elements without a set\n // `background-color`. We cannot use `filter` since that's not viewed as a\n // background color by the browser. Thus, a hack is needed.\n // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Internet_Explorer\n //\n // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we\n // set alpha transparency for the best results possible.\n background-color: #000 \\9; // IE8\n background-color: rgba(0,0,0,0); // IE9\n }\n .active {\n margin: 0;\n width: 12px;\n height: 12px;\n background-color: @carousel-indicator-active-bg;\n }\n}\n\n// Optional captions\n// -----------------------------\n// Hidden by default for smaller viewports\n.carousel-caption {\n position: absolute;\n left: 15%;\n right: 15%;\n bottom: 20px;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: @carousel-caption-color;\n text-align: center;\n text-shadow: @carousel-text-shadow;\n & .btn {\n text-shadow: none; // No shadow for button elements in carousel-caption\n }\n}\n\n\n// Scale up controls for tablets and up\n@media screen and (min-width: @screen-sm-min) {\n\n // Scale up the controls a smidge\n .carousel-control {\n .glyphicon-chevron-left,\n .glyphicon-chevron-right,\n .icon-prev,\n .icon-next {\n width: (@carousel-control-font-size * 1.5);\n height: (@carousel-control-font-size * 1.5);\n margin-top: (@carousel-control-font-size / -2);\n font-size: (@carousel-control-font-size * 1.5);\n }\n .glyphicon-chevron-left,\n .icon-prev {\n margin-left: (@carousel-control-font-size / -2);\n }\n .glyphicon-chevron-right,\n .icon-next {\n margin-right: (@carousel-control-font-size / -2);\n }\n }\n\n // Show and left align the captions\n .carousel-caption {\n left: 20%;\n right: 20%;\n padding-bottom: 30px;\n }\n\n // Move up the indicators\n .carousel-indicators {\n bottom: 20px;\n }\n}\n","// Clearfix\n//\n// For modern browsers\n// 1. The space content is one way to avoid an Opera bug when the\n// contenteditable attribute is included anywhere else in the document.\n// Otherwise it causes space to appear at the top and bottom of elements\n// that are clearfixed.\n// 2. The use of `table` rather than `block` is only necessary if using\n// `:before` to contain the top-margins of child elements.\n//\n// Source: http://nicolasgallagher.com/micro-clearfix-hack/\n\n.clearfix() {\n &:before,\n &:after {\n content: \" \"; // 1\n display: table; // 2\n }\n &:after {\n clear: both;\n }\n}\n","// Center-align a block level element\n\n.center-block() {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n","// CSS image replacement\n//\n// Heads up! v3 launched with only `.hide-text()`, but per our pattern for\n// mixins being reused as classes with the same name, this doesn't hold up. As\n// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`.\n//\n// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757\n\n// Deprecated as of v3.0.1 (has been removed in v4)\n.hide-text() {\n font: ~\"0/0\" a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n\n// New mixin to use as of v3.0.1\n.text-hide() {\n .hide-text();\n}\n","//\n// Responsive: Utility classes\n// --------------------------------------------------\n\n\n// IE10 in Windows (Phone) 8\n//\n// Support for responsive views via media queries is kind of borked in IE10, for\n// Surface/desktop in split view and for Windows Phone 8. This particular fix\n// must be accompanied by a snippet of JavaScript to sniff the user agent and\n// apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at\n// our Getting Started page for more information on this bug.\n//\n// For more information, see the following:\n//\n// Issue: https://github.com/twbs/bootstrap/issues/10497\n// Docs: http://getbootstrap.com/getting-started/#support-ie10-width\n// Source: http://timkadlec.com/2013/01/windows-phone-8-and-device-width/\n// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/\n\n@-ms-viewport {\n width: device-width;\n}\n\n\n// Visibility utilities\n// Note: Deprecated .visible-xs, .visible-sm, .visible-md, and .visible-lg as of v3.2.0\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n .responsive-invisibility();\n}\n\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n\n.visible-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-visibility();\n }\n}\n.visible-xs-block {\n @media (max-width: @screen-xs-max) {\n display: block !important;\n }\n}\n.visible-xs-inline {\n @media (max-width: @screen-xs-max) {\n display: inline !important;\n }\n}\n.visible-xs-inline-block {\n @media (max-width: @screen-xs-max) {\n display: inline-block !important;\n }\n}\n\n.visible-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-visibility();\n }\n}\n.visible-sm-block {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: block !important;\n }\n}\n.visible-sm-inline {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: inline !important;\n }\n}\n.visible-sm-inline-block {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: inline-block !important;\n }\n}\n\n.visible-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-visibility();\n }\n}\n.visible-md-block {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: block !important;\n }\n}\n.visible-md-inline {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: inline !important;\n }\n}\n.visible-md-inline-block {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: inline-block !important;\n }\n}\n\n.visible-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-visibility();\n }\n}\n.visible-lg-block {\n @media (min-width: @screen-lg-min) {\n display: block !important;\n }\n}\n.visible-lg-inline {\n @media (min-width: @screen-lg-min) {\n display: inline !important;\n }\n}\n.visible-lg-inline-block {\n @media (min-width: @screen-lg-min) {\n display: inline-block !important;\n }\n}\n\n.hidden-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-invisibility();\n }\n}\n.hidden-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-invisibility();\n }\n}\n.hidden-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-invisibility();\n }\n}\n.hidden-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-invisibility();\n }\n}\n\n\n// Print utilities\n//\n// Media queries are placed on the inside to be mixin-friendly.\n\n// Note: Deprecated .visible-print as of v3.2.0\n.visible-print {\n .responsive-invisibility();\n\n @media print {\n .responsive-visibility();\n }\n}\n.visible-print-block {\n display: none !important;\n\n @media print {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n\n @media print {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n\n @media print {\n display: inline-block !important;\n }\n}\n\n.hidden-print {\n @media print {\n .responsive-invisibility();\n }\n}\n","// Responsive utilities\n\n//\n// More easily include all the states for responsive-utilities.less.\n.responsive-visibility() {\n display: block !important;\n table& { display: table !important; }\n tr& { display: table-row !important; }\n th&,\n td& { display: table-cell !important; }\n}\n\n.responsive-invisibility() {\n display: none !important;\n}\n"]} \ No newline at end of file
+{"version":3,"sources":["../../scss/bootstrap.scss","../../scss/_print.scss","dist/css/bootstrap.css","../../scss/_reboot.scss","bootstrap.css","../../scss/mixins/_hover.scss","../../scss/_type.scss","../../scss/mixins/_lists.scss","../../scss/_images.scss","../../scss/mixins/_image.scss","../../scss/mixins/_border-radius.scss","../../scss/mixins/_transition.scss","../../scss/_code.scss","../../scss/_grid.scss","../../scss/mixins/_grid.scss","../../scss/mixins/_breakpoints.scss","../../scss/mixins/_grid-framework.scss","../../scss/_tables.scss","../../scss/mixins/_table-row.scss","../../scss/_forms.scss","../../scss/mixins/_forms.scss","../../scss/_buttons.scss","../../scss/mixins/_buttons.scss","../../scss/_transitions.scss","../../scss/_dropdown.scss","../../scss/mixins/_nav-divider.scss","../../scss/_button-group.scss","../../scss/_input-group.scss","../../scss/_custom-forms.scss","../../scss/_nav.scss","../../scss/_navbar.scss","../../scss/_card.scss","../../scss/mixins/_cards.scss","../../scss/_breadcrumb.scss","../../scss/mixins/_clearfix.scss","../../scss/_pagination.scss","../../scss/mixins/_pagination.scss","../../scss/_badge.scss","../../scss/mixins/_badge.scss","../../scss/_jumbotron.scss","../../scss/_alert.scss","../../scss/mixins/_alert.scss","../../scss/_progress.scss","../../scss/mixins/_gradients.scss","../../scss/_media.scss","../../scss/_list-group.scss","../../scss/mixins/_list-group.scss","../../scss/_responsive-embed.scss","../../scss/_close.scss","../../scss/_modal.scss","../../scss/_tooltip.scss","../../scss/mixins/_reset-text.scss","../../scss/_popover.scss","../../scss/_carousel.scss","../../scss/utilities/_align.scss","../../scss/utilities/_background.scss","../../scss/mixins/_background-variant.scss","../../scss/utilities/_borders.scss","../../scss/utilities/_display.scss","../../scss/utilities/_flex.scss","../../scss/utilities/_float.scss","../../scss/mixins/_float.scss","../../scss/utilities/_position.scss","../../scss/utilities/_screenreaders.scss","../../scss/mixins/_screen-reader.scss","../../scss/utilities/_sizing.scss","../../scss/utilities/_spacing.scss","../../scss/utilities/_text.scss","../../scss/mixins/_text-truncate.scss","../../scss/mixins/_text-emphasis.scss","../../scss/mixins/_text-hide.scss","../../scss/utilities/_visibility.scss","../../scss/mixins/_visibility.scss"],"names":[],"mappings":"AAAA;;;;;ACWE,aACE,ECHF,QADA,SAIA,yBAIA,uBALA,kBAIA,gBAFA,iBAIA,eAPA,gBAIA,cDYI,YAAA,eAEA,mBAAA,eAAA,WAAA,eAGF,ECRF,UDUI,gBAAA,UAQF,mBACE,QAAA,KAAA,YAAA,IAcF,IACE,YAAA,mBCxBJ,WD0BE,IAEE,OAAA,IAAA,MAAA,KACA,kBAAA,MAQF,MACE,QAAA,mBC9BJ,IDiCE,GAEE,kBAAA,MC/BJ,GACA,GDiCE,EAGE,QAAA,EACA,OAAA,EAGF,GCnCF,GDqCI,iBAAA,MAMF,QACE,QAAA,KAEF,OACE,OAAA,IAAA,MAAA,KAGF,OACE,gBAAA,mBADF,UCrCF,UD0CM,iBAAA,eCtCN,mBDyCE,mBAGI,OAAA,IAAA,MAAA,gBE5FR,KACE,mBAAA,WAAA,WAAA,WACA,YAAA,WACA,YAAA,KACA,yBAAA,KACA,qBAAA,KACA,mBAAA,UACA,4BAAA,YAGF,EDwDA,QADA,SCpDE,mBAAA,QAAA,WAAA,QAKA,cAAgB,MAAA,aASlB,KACE,OAAA,EACA,YAAA,aAAA,CAAA,kBAAA,CAAA,UAAA,CAAA,MAAA,CAAA,gBAAA,CAAA,KAAA,CAAA,WACA,UAAA,KACA,YAAA,IACA,YAAA,IACA,MAAA,QACA,iBAAA,KCgDF,sBDvCE,QAAA,YASF,GACE,mBAAA,YAAA,WAAA,YACA,OAAA,EACA,SAAA,QAYF,GAAA,GAAA,GAAA,GAAA,GAAA,GACE,WAAA,EACA,cAAA,MAOF,EACE,WAAA,EACA,cAAA,KD6BF,0BCnBA,YAEE,gBAAA,UACA,gBAAA,UAAA,OACA,OAAA,KACA,cAAA,EAGF,QACE,cAAA,KACA,WAAA,OACA,YAAA,QDuBF,GCpBA,GDmBA,GChBE,WAAA,EACA,cAAA,KAGF,MDoBA,MACA,MAFA,MCfE,cAAA,EAGF,GACE,YAAA,IAGF,GACE,cAAA,MACA,YAAA,EAGF,WACE,OAAA,EAAA,EAAA,KAGF,IACE,WAAA,OAGF,EDmBA,OCjBE,YAAA,OAGF,MACE,UAAA,IAQF,IDcA,ICZE,SAAA,SACA,UAAA,IACA,YAAA,EACA,eAAA,SAGF,IAAM,OAAA,OACN,IAAM,IAAA,MAON,EACE,MAAA,QACA,gBAAA,KACA,iBAAA,YACA,6BAAA,QEhLE,QFmLA,MAAA,QACA,gBAAA,UAUJ,8BACE,MAAA,QACA,gBAAA,KErLE,oCAAA,oCFwLA,MAAA,QACA,gBAAA,KANJ,oCAUI,QAAA,EDYJ,KACA,ICJA,IDKA,KCDE,YAAA,SAAA,CAAA,UACA,UAAA,IAGF,IAEE,WAAA,EAEA,cAAA,KAEA,SAAA,KAQF,OAEE,OAAA,EAAA,EAAA,KAQF,IACE,eAAA,OACA,aAAA,KAGF,eACE,SAAA,ODNF,cCoBA,EDtBA,KACA,OAEA,MACA,MACA,OACA,QACA,SCwBE,iBAAA,aAAA,aAAA,aAQF,MACE,gBAAA,SAGF,QACE,YAAA,OACA,eAAA,OACA,MAAA,QACA,WAAA,KACA,aAAA,OAGF,GAEE,WAAA,KAQF,MAEE,QAAA,aACA,cAAA,MAOF,aACE,QAAA,IAAA,OACA,QAAA,IAAA,KAAA,yBDlCF,OCqCA,MDnCA,SADA,OAEA,SCuCE,OAAA,EACA,YAAA,QACA,UAAA,QACA,YAAA,QAGF,ODrCA,MCuCE,SAAA,QAGF,ODrCA,OCuCE,eAAA,KDjCF,aACA,cCsCA,ODxCA,mBC4CE,mBAAA,ODrCF,gCACA,+BACA,gCCuCA,yBAIE,QAAA,EACA,aAAA,KDtCF,qBCyCA,kBAEE,mBAAA,WAAA,WAAA,WACA,QAAA,EAIF,iBDxCA,2BACA,kBAFA,iBCkDE,mBAAA,QAGF,SACE,SAAA,KAEA,OAAA,SAGF,SAME,UAAA,EAEA,QAAA,EACA,OAAA,EACA,OAAA,EAKF,OACE,QAAA,MACA,MAAA,KACA,UAAA,KACA,QAAA,EACA,cAAA,MACA,UAAA,OACA,YAAA,QACA,MAAA,QACA,YAAA,OAGF,SACE,eAAA,SC3DF,yCFOA,yCC0DE,OAAA,KC5DF,cDoEE,eAAA,KACA,mBAAA,KChEF,4CFOA,yCCkEE,mBAAA,KAQF,6BACE,KAAA,QACA,mBAAA,OAOF,OACE,QAAA,aAGF,QACE,QAAA,UAGF,SACE,QAAA,KC7EF,SDmFE,QAAA,eDxEF,IAAK,IAAK,IAAK,IAAK,IAAK,II/YzB,GAAA,GAAA,GAAA,GAAA,GAAA,GAEE,cAAA,MACA,YAAA,QACA,YAAA,IACA,YAAA,IACA,MAAA,QAGF,IAAA,GAAU,UAAA,OACV,IAAA,GAAU,UAAA,KACV,IAAA,GAAU,UAAA,QACV,IAAA,GAAU,UAAA,OACV,IAAA,GAAU,UAAA,QACV,IAAA,GAAU,UAAA,KAEV,MACE,UAAA,QACA,YAAA,IAIF,WACE,UAAA,KACA,YAAA,IACA,YAAA,IAEF,WACE,UAAA,OACA,YAAA,IACA,YAAA,IAEF,WACE,UAAA,OACA,YAAA,IACA,YAAA,IAEF,WACE,UAAA,OACA,YAAA,IACA,YAAA,IAQF,GACE,WAAA,KACA,cAAA,KACA,OAAA,EACA,WAAA,IAAA,MAAA,eJgaF,OIxZA,MAEE,UAAA,IACA,YAAA,IJ2ZF,MIxZA,KAEE,QAAA,KACA,iBAAA,QAQF,eC7EE,aAAA,EACA,WAAA,KDiFF,aClFE,aAAA,EACA,WAAA,KDoFF,kBACE,QAAA,aADF,mCAII,aAAA,IAUJ,YACE,UAAA,IACA,eAAA,UAIF,YACE,QAAA,MAAA,KACA,cAAA,KACA,UAAA,QACA,YAAA,OAAA,MAAA,QAGF,mBACE,QAAA,MACA,UAAA,IACA,MAAA,QAHF,2BAMI,QAAA,cAKJ,oBACE,cAAA,KACA,aAAA,EACA,WAAA,MACA,aAAA,OAAA,MAAA,QACA,YAAA,EAGF,+CAEI,QAAA,GAFJ,8CAKI,QAAA,cErIJ,WCIE,UAAA,KAGA,OAAA,KDDF,eACE,QAAA,OACA,iBAAA,KACA,OAAA,IAAA,MAAA,KEZE,cAAA,OCCE,mBAAA,IAAA,IAAA,YAAA,cAAA,IAAA,IAAA,YAAA,WAAA,IAAA,IAAA,YFMJ,UAAA,KAGA,OAAA,KDeF,QAEE,QAAA,aAGF,YACE,cAAA,MACA,YAAA,EAGF,gBACE,UAAA,IACA,MAAA,QIxCF,KV0jBA,IACA,IACA,KUxjBE,YAAA,KAAA,CAAA,MAAA,CAAA,QAAA,CAAA,iBAAA,CAAA,aAAA,CAAA,UAIF,KACE,QAAA,MAAA,MACA,UAAA,IACA,MAAA,QACA,iBAAA,QFTE,cAAA,OEaF,OACE,QAAA,EACA,MAAA,QACA,iBAAA,QAKJ,IACE,QAAA,MAAA,MACA,UAAA,IACA,MAAA,KACA,iBAAA,QFzBE,cAAA,MEqBJ,QASI,QAAA,EACA,UAAA,KACA,YAAA,IAMJ,IACE,QAAA,MACA,WAAA,EACA,cAAA,KACA,UAAA,IACA,MAAA,QALF,SASI,QAAA,EACA,UAAA,QACA,MAAA,QACA,iBAAA,YACA,cAAA,EAKJ,gBACE,WAAA,MACA,WAAA,OCzDA,WCAA,aAAA,KACA,YAAA,KAKI,cAAA,KACA,aAAA,KC4CF,yBFnDF,WCMI,cAAA,KACA,aAAA,MC4CF,yBFnDF,WCMI,cAAA,KACA,aAAA,MC4CF,yBFnDF,WCMI,cAAA,KACA,aAAA,MC4CF,0BFnDF,WCMI,cAAA,KACA,aAAA,MC4CF,yBFnDF,WCiBI,MAAA,MACA,UAAA,MCiCF,yBFnDF,WCiBI,MAAA,MACA,UAAA,MCiCF,yBFnDF,WCiBI,MAAA,MACA,UAAA,MCiCF,0BFnDF,WCiBI,MAAA,OACA,UAAA,MDNJ,iBACE,MAAA,KCbF,aAAA,KACA,YAAA,KAKI,cAAA,KACA,aAAA,KC4CF,yBFvCF,iBCNI,cAAA,KACA,aAAA,MC4CF,yBFvCF,iBCNI,cAAA,KACA,aAAA,MC4CF,yBFvCF,iBCNI,cAAA,KACA,aAAA,MC4CF,0BFvCF,iBCNI,cAAA,KACA,aAAA,MDgBJ,KCWA,QAAA,YAAA,QAAA,aAAA,QAAA,YAAA,QAAA,KACA,kBAAA,KAAA,cAAA,KAAA,UAAA,KAKI,aAAA,MACA,YAAA,MCUF,yBF5BF,KCiBI,aAAA,MACA,YAAA,OCUF,yBF5BF,KCiBI,aAAA,MACA,YAAA,OCUF,yBF5BF,KCiBI,aAAA,MACA,YAAA,OCUF,0BF5BF,KCiBI,aAAA,MACA,YAAA,ODZJ,YACE,aAAA,EACA,YAAA,EAFF,iBXiuBF,0BW3tBM,cAAA,EACA,aAAA,EGlCJ,KAAA,OAAA,QAAA,QAAA,QAAA,OAAA,OAAA,OAAA,OAAA,OAAA,OAAA,OAAA,OdkwBF,UAEqJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACtG,aAFqJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACtG,aAFkJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACnG,aAEqJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACtG,acrwBI,SAAA,SACA,MAAA,KACA,WAAA,IFsBE,cAAA,KACA,aAAA,KCuBF,yBCjDF,KAAA,OAAA,QAAA,QAAA,QAAA,OAAA,OAAA,OAAA,OAAA,OAAA,OAAA,OAAA,OdgxBA,UAEqJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACtG,aAFqJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACtG,aAFkJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACnG,aAEqJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACtG,aY3vBI,cAAA,KACA,aAAA,MCuBF,yBCjDF,KAAA,OAAA,QAAA,QAAA,QAAA,OAAA,OAAA,OAAA,OAAA,OAAA,OAAA,OAAA,Od4xBA,UAEqJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACtG,aAFqJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACtG,aAFkJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACnG,aAEqJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACtG,aYvwBI,cAAA,KACA,aAAA,MCuBF,yBCjDF,KAAA,OAAA,QAAA,QAAA,QAAA,OAAA,OAAA,OAAA,OAAA,OAAA,OAAA,OAAA,OdwyBA,UAEqJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACtG,aAFqJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACtG,aAFkJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACnG,aAEqJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACtG,aYnxBI,cAAA,KACA,aAAA,MCuBF,0BCjDF,KAAA,OAAA,QAAA,QAAA,QAAA,OAAA,OAAA,OAAA,OAAA,OAAA,OAAA,OAAA,OdozBA,UAEqJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACtG,aAFqJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACtG,aAFkJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACnG,aAEqJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACtG,aY/xBI,cAAA,KACA,aAAA,MEFA,KACE,mBAAA,EAAA,wBAAA,EAAA,WAAA,EACA,iBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,UAAA,EACA,UAAA,KAEF,UACE,iBAAA,EAAA,aAAA,EAAA,EAAA,KAAA,SAAA,EAAA,EAAA,KAAA,KAAA,EAAA,EAAA,KACA,MAAA,KAIA,OF2BN,MAAA,UE3BM,OF2BN,MAAA,WE3BM,OF2BN,MAAA,IE3BM,OF2BN,MAAA,WE3BM,OF2BN,MAAA,WE3BM,OF2BN,MAAA,IE3BM,OF2BN,MAAA,WE3BM,OF2BN,MAAA,WE3BM,OF2BN,MAAA,IE3BM,QF2BN,MAAA,WE3BM,QF2BN,MAAA,WE3BM,QF2BN,MAAA,KEpBQ,QFgCR,MAAA,KEhCQ,QFgCR,MAAA,UEhCQ,QFgCR,MAAA,WEhCQ,QFgCR,MAAA,IEhCQ,QFgCR,MAAA,WEhCQ,QFgCR,MAAA,WEhCQ,QFgCR,MAAA,IEhCQ,QFgCR,MAAA,WEhCQ,QFgCR,MAAA,WEhCQ,QFgCR,MAAA,IEhCQ,SFgCR,MAAA,WEhCQ,SFgCR,MAAA,WEhCQ,SFgCR,MAAA,KEhCQ,QF4BR,KAAA,KE5BQ,QF4BR,KAAA,UE5BQ,QF4BR,KAAA,WE5BQ,QF4BR,KAAA,IE5BQ,QF4BR,KAAA,WE5BQ,QF4BR,KAAA,WE5BQ,QF4BR,KAAA,IE5BQ,QF4BR,KAAA,WE5BQ,QF4BR,KAAA,WE5BQ,QF4BR,KAAA,IE5BQ,SF4BR,KAAA,WE5BQ,SF4BR,KAAA,WE5BQ,SF4BR,KAAA,KEnBQ,UFeR,YAAA,UEfQ,UFeR,YAAA,WEfQ,UFeR,YAAA,IEfQ,UFeR,YAAA,WEfQ,UFeR,YAAA,WEfQ,UFeR,YAAA,IEfQ,UFeR,YAAA,WEfQ,UFeR,YAAA,WEfQ,UFeR,YAAA,IEfQ,WFeR,YAAA,WEfQ,WFeR,YAAA,WCjBE,yBCzBE,QACE,mBAAA,EAAA,wBAAA,EAAA,WAAA,EACA,iBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,UAAA,EACA,UAAA,KAEF,aACE,iBAAA,EAAA,aAAA,EAAA,EAAA,KAAA,SAAA,EAAA,EAAA,KAAA,KAAA,EAAA,EAAA,KACA,MAAA,KAIA,UF2BN,MAAA,UE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,IE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,IE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,IE3BM,WF2BN,MAAA,WE3BM,WF2BN,MAAA,WE3BM,WF2BN,MAAA,KEpBQ,WFgCR,MAAA,KEhCQ,WFgCR,MAAA,UEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,IEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,IEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,IEhCQ,YFgCR,MAAA,WEhCQ,YFgCR,MAAA,WEhCQ,YFgCR,MAAA,KEhCQ,WF4BR,KAAA,KE5BQ,WF4BR,KAAA,UE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,IE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,IE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,IE5BQ,YF4BR,KAAA,WE5BQ,YF4BR,KAAA,WE5BQ,YF4BR,KAAA,KEnBQ,aFeR,YAAA,EEfQ,aFeR,YAAA,UEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,IEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,IEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,IEfQ,cFeR,YAAA,WEfQ,cFeR,YAAA,YCjBE,yBCzBE,QACE,mBAAA,EAAA,wBAAA,EAAA,WAAA,EACA,iBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,UAAA,EACA,UAAA,KAEF,aACE,iBAAA,EAAA,aAAA,EAAA,EAAA,KAAA,SAAA,EAAA,EAAA,KAAA,KAAA,EAAA,EAAA,KACA,MAAA,KAIA,UF2BN,MAAA,UE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,IE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,IE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,IE3BM,WF2BN,MAAA,WE3BM,WF2BN,MAAA,WE3BM,WF2BN,MAAA,KEpBQ,WFgCR,MAAA,KEhCQ,WFgCR,MAAA,UEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,IEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,IEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,IEhCQ,YFgCR,MAAA,WEhCQ,YFgCR,MAAA,WEhCQ,YFgCR,MAAA,KEhCQ,WF4BR,KAAA,KE5BQ,WF4BR,KAAA,UE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,IE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,IE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,IE5BQ,YF4BR,KAAA,WE5BQ,YF4BR,KAAA,WE5BQ,YF4BR,KAAA,KEnBQ,aFeR,YAAA,EEfQ,aFeR,YAAA,UEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,IEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,IEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,IEfQ,cFeR,YAAA,WEfQ,cFeR,YAAA,YCjBE,yBCzBE,QACE,mBAAA,EAAA,wBAAA,EAAA,WAAA,EACA,iBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,UAAA,EACA,UAAA,KAEF,aACE,iBAAA,EAAA,aAAA,EAAA,EAAA,KAAA,SAAA,EAAA,EAAA,KAAA,KAAA,EAAA,EAAA,KACA,MAAA,KAIA,UF2BN,MAAA,UE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,IE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,IE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,IE3BM,WF2BN,MAAA,WE3BM,WF2BN,MAAA,WE3BM,WF2BN,MAAA,KEpBQ,WFgCR,MAAA,KEhCQ,WFgCR,MAAA,UEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,IEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,IEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,IEhCQ,YFgCR,MAAA,WEhCQ,YFgCR,MAAA,WEhCQ,YFgCR,MAAA,KEhCQ,WF4BR,KAAA,KE5BQ,WF4BR,KAAA,UE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,IE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,IE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,IE5BQ,YF4BR,KAAA,WE5BQ,YF4BR,KAAA,WE5BQ,YF4BR,KAAA,KEnBQ,aFeR,YAAA,EEfQ,aFeR,YAAA,UEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,IEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,IEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,IEfQ,cFeR,YAAA,WEfQ,cFeR,YAAA,YCjBE,0BCzBE,QACE,mBAAA,EAAA,wBAAA,EAAA,WAAA,EACA,iBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,UAAA,EACA,UAAA,KAEF,aACE,iBAAA,EAAA,aAAA,EAAA,EAAA,KAAA,SAAA,EAAA,EAAA,KAAA,KAAA,EAAA,EAAA,KACA,MAAA,KAIA,UF2BN,MAAA,UE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,IE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,IE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,IE3BM,WF2BN,MAAA,WE3BM,WF2BN,MAAA,WE3BM,WF2BN,MAAA,KEpBQ,WFgCR,MAAA,KEhCQ,WFgCR,MAAA,UEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,IEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,IEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,IEhCQ,YFgCR,MAAA,WEhCQ,YFgCR,MAAA,WEhCQ,YFgCR,MAAA,KEhCQ,WF4BR,KAAA,KE5BQ,WF4BR,KAAA,UE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,IE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,IE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,IE5BQ,YF4BR,KAAA,WE5BQ,YF4BR,KAAA,WE5BQ,YF4BR,KAAA,KEnBQ,aFeR,YAAA,EEfQ,aFeR,YAAA,UEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,IEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,IEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,IEfQ,cFeR,YAAA,WEfQ,cFeR,YAAA,YGrEF,OACE,MAAA,KACA,UAAA,KACA,cAAA,KACA,iBAAA,YfosDF,UexsDA,UAQI,QAAA,OACA,eAAA,IACA,WAAA,IAAA,MAAA,QAVJ,gBAcI,eAAA,OACA,cAAA,IAAA,MAAA,QAfJ,mBAmBI,WAAA,IAAA,MAAA,QAnBJ,cAuBI,iBAAA,KfqsDJ,ae5rDA,aAGI,QAAA,MASJ,gBACE,OAAA,IAAA,MAAA,QfwrDF,mBezrDA,mBAKI,OAAA,IAAA,MAAA,QfyrDJ,yBe9rDA,yBAWM,oBAAA,IAUN,yCAEI,iBAAA,gBASJ,4BAGM,iBAAA,iBC9EJ,chBuvDF,iBADA,iBgBlvDM,iBAAA,iBAMJ,iCAKM,iBAAA,iBALN,oChBsvDF,oCgB7uDU,iBAAA,iBAnBR,ehBswDF,kBADA,kBgBjwDM,iBAAA,QAMJ,kCAKM,iBAAA,QALN,qChBqwDF,qCgB5vDU,iBAAA,QAnBR,YhBqxDF,eADA,egBhxDM,iBAAA,QAMJ,+BAKM,iBAAA,QALN,kChBoxDF,kCgB3wDU,iBAAA,QAnBR,ehBoyDF,kBADA,kBgB/xDM,iBAAA,QAMJ,kCAKM,iBAAA,QALN,qChBmyDF,qCgB1xDU,iBAAA,QAnBR,chBmzDF,iBADA,iBgB9yDM,iBAAA,QAMJ,iCAKM,iBAAA,QALN,oChBkzDF,oCgBzyDU,iBAAA,QDkFV,kBAEI,MAAA,KACA,iBAAA,QAIJ,kBAEI,MAAA,QACA,iBAAA,QAIJ,eACE,MAAA,KACA,iBAAA,Qf2tDF,kBe7tDA,kBf8tDA,wBevtDI,aAAA,QAPJ,8BAWI,OAAA,EAXJ,uDAgBM,iBAAA,sBAhBN,0CAuBQ,iBAAA,uBF1EJ,yBEuFJ,kBAEI,QAAA,MACA,MAAA,KACA,WAAA,KACA,mBAAA,yBALJ,iCASM,OAAA,GE/JN,cACE,QAAA,MACA,MAAA,KAGA,QAAA,MAAA,KACA,UAAA,KACA,YAAA,KACA,MAAA,QACA,iBAAA,KAEA,iBAAA,KACA,wBAAA,YAAA,gBAAA,YACA,OAAA,IAAA,MAAA,gBAKE,cAAA,ORnBE,mBAAA,aAAA,YAAA,IAAA,CAAA,mBAAA,YAAA,KAAA,WAAA,aAAA,YAAA,IAAA,CAAA,mBAAA,YAAA,KAAA,cAAA,aAAA,YAAA,IAAA,CAAA,WAAA,YAAA,KAAA,WAAA,aAAA,YAAA,IAAA,CAAA,WAAA,YAAA,KAAA,WAAA,aAAA,YAAA,IAAA,CAAA,WAAA,YAAA,IAAA,CAAA,mBAAA,YAAA,KQCN,0BA6BI,iBAAA,YACA,OAAA,ECWF,oBACE,MAAA,QACA,iBAAA,KACA,aAAA,QACA,QAAA,ED7CJ,yCAsCI,MAAA,QAEA,QAAA,EAxCJ,gCAsCI,MAAA,QAEA,QAAA,EAxCJ,oCAsCI,MAAA,QAEA,QAAA,EAxCJ,2BAsCI,MAAA,QAEA,QAAA,EAxCJ,uBAAA,wBAkDI,iBAAA,QAEA,QAAA,EAIJ,gDAGI,OAAA,oBAHJ,qCAYI,MAAA,QACA,iBAAA,KAKJ,mBjBq2DA,oBiBn2DE,QAAA,MAUF,gBACE,YAAA,sBACA,eAAA,sBACA,cAAA,EAGF,mBACE,YAAA,sBACA,eAAA,sBACA,UAAA,QAGF,mBACE,YAAA,uBACA,eAAA,uBACA,UAAA,QAUF,iBACE,YAAA,MACA,eAAA,MACA,cAAA,EACA,UAAA,KASF,qBACE,YAAA,MACA,eAAA,MACA,cAAA,EACA,YAAA,KACA,OAAA,MAAA,YACA,aAAA,IAAA,EjBq1D6D,qCiB31D/D,qCjB21DqG,kDACrG,uDACA,0DiB71DA,kDjB01DA,uDACA,0DiBj1DI,cAAA,EACA,aAAA,EAaJ,iBAAA,8BjB20DA,mCACA,sCiB30DE,QAAA,OAAA,MACA,UAAA,QACA,YAAA,ITzJE,cAAA,MR2+DJ,wEiB90DA,gEjB60DA,qEiB70DA,mDAGI,OAAA,sBAIJ,iBAAA,8BjB40DA,mCACA,sCiB50DE,QAAA,MAAA,KACA,UAAA,QACA,YAAA,ITvKE,cAAA,MR0/DJ,wEiB/0DA,gEjB80DA,qEiB90DA,mDAGI,OAAA,qBAUJ,YACE,cAAA,KAGF,WACE,QAAA,MACA,WAAA,OAQF,YACE,SAAA,SACA,QAAA,MACA,cAAA,MAHF,uCAOM,MAAA,QAKN,kBACE,aAAA,QACA,cAAA,EAGF,kBACE,SAAA,SACA,WAAA,OACA,YAAA,SAHF,6BAMI,SAAA,OAKJ,mBACE,QAAA,aADF,qCAII,eAAA,OAJJ,sCAQI,YAAA,OASJ,uBACE,WAAA,OjB8zDF,qBiB3zDA,sBjB0zDA,sBiBvzDE,cAAA,KACA,kBAAA,UACA,oBAAA,OAAA,MAAA,SACA,wBAAA,SAAA,SAAA,gBAAA,SAAA,SjB+zDF,6BAEA,6BADA,+BkB1jEE,oClBwjEF,iCkBnjEI,MAAA,QlB4jEJ,kCADA,4BkBvjEE,2BAGE,aAAA,QAQF,gCACE,MAAA,QACA,iBAAA,QACA,aAAA,QDuOJ,mCAII,iBAAA,wPjB+0DJ,6BAEA,6BADA,+BkBllEE,oClBglEF,iCkB3kEI,MAAA,QlBolEJ,kCADA,4BkB/kEE,2BAGE,aAAA,QAQF,gCACE,MAAA,QACA,iBAAA,KACA,aAAA,QD+OJ,mCAII,iBAAA,iUjB+1DJ,4BAEA,4BADA,8BkB1mEE,mClBwmEF,gCkBnmEI,MAAA,QlB4mEJ,iCADA,2BkBvmEE,0BAGE,aAAA,QAQF,+BACE,MAAA,QACA,iBAAA,QACA,aAAA,QDuPJ,iCAII,iBAAA,kSAcJ,aACE,QAAA,YAAA,QAAA,aAAA,QAAA,YAAA,QAAA,KACA,mBAAA,WAAA,sBAAA,OAAA,kBAAA,IAAA,KAAA,cAAA,IAAA,KAAA,UAAA,IAAA,KACA,kBAAA,OAAA,oBAAA,OAAA,eAAA,OAAA,YAAA,OAHF,yBASI,MAAA,KJxPA,yBI+OJ,mBAeM,QAAA,YAAA,QAAA,aAAA,QAAA,YAAA,QAAA,KACA,kBAAA,OAAA,oBAAA,OAAA,eAAA,OAAA,YAAA,OACA,iBAAA,OAAA,wBAAA,OAAA,cAAA,OAAA,gBAAA,OACA,cAAA,EAlBN,yBAuBM,QAAA,YAAA,QAAA,aAAA,QAAA,YAAA,QAAA,KACA,iBAAA,EAAA,aAAA,EAAA,EAAA,KAAA,SAAA,EAAA,EAAA,KAAA,KAAA,EAAA,EAAA,KACA,mBAAA,WAAA,sBAAA,OAAA,kBAAA,IAAA,KAAA,cAAA,IAAA,KAAA,UAAA,IAAA,KACA,kBAAA,OAAA,oBAAA,OAAA,eAAA,OAAA,YAAA,OACA,cAAA,EA3BN,2BAgCM,QAAA,aACA,MAAA,KACA,eAAA,OAlCN,kCAuCM,QAAA,aAvCN,0BA2CM,MAAA,KA3CN,iCA+CM,cAAA,EACA,eAAA,OAhDN,yBAsDM,QAAA,YAAA,QAAA,aAAA,QAAA,YAAA,QAAA,KACA,kBAAA,OAAA,oBAAA,OAAA,eAAA,OAAA,YAAA,OACA,iBAAA,OAAA,wBAAA,OAAA,cAAA,OAAA,gBAAA,OACA,MAAA,KACA,WAAA,EACA,cAAA,EA3DN,+BA8DM,aAAA,EA9DN,+BAiEM,SAAA,SACA,WAAA,EACA,aAAA,OACA,YAAA,EApEN,6BAyEM,QAAA,YAAA,QAAA,aAAA,QAAA,YAAA,QAAA,KACA,kBAAA,OAAA,oBAAA,OAAA,eAAA,OAAA,YAAA,OACA,iBAAA,OAAA,wBAAA,OAAA,cAAA,OAAA,gBAAA,OACA,aAAA,EA5EN,uCA+EM,SAAA,OACA,QAAA,aACA,aAAA,OACA,eAAA,YAlFN,kDAuFM,IAAA,GExXN,KACE,QAAA,aACA,YAAA,IACA,WAAA,OACA,YAAA,OACA,eAAA,OACA,oBAAA,KAAA,iBAAA,KAAA,gBAAA,KAAA,YAAA,KACA,OAAA,IAAA,MAAA,YCqEA,QAAA,MAAA,KACA,UAAA,KACA,YAAA,KZhFE,cAAA,OCCE,mBAAA,IAAA,IAAA,YAAA,cAAA,IAAA,IAAA,YAAA,WAAA,IAAA,IAAA,YNiBF,WAAA,WgBHA,gBAAA,KAbJ,WAAA,WAiBI,QAAA,EACA,mBAAA,EAAA,EAAA,EAAA,IAAA,oBAAA,WAAA,EAAA,EAAA,EAAA,IAAA,oBAlBJ,cAAA,cAwBI,QAAA,IAxBJ,YAAA,YA8BI,iBAAA,KAMJ,enB8vEA,yBmB5vEE,eAAA,KAQF,aC3CE,MAAA,KACA,iBAAA,QACA,aAAA,QjBAE,mBiBKA,MAAA,KACA,iBAAA,QACA,aAAA,QAEF,mBAAA,mBAMI,mBAAA,EAAA,EAAA,EAAA,IAAA,mBAAA,WAAA,EAAA,EAAA,EAAA,IAAA,mBAKJ,sBAAA,sBAEE,iBAAA,QACA,aAAA,QAGF,oBAAA,oBpB8xEF,mCoB3xEI,MAAA,KACA,iBAAA,QACA,iBAAA,KACA,aAAA,QDYJ,eC9CE,MAAA,QACA,iBAAA,KACA,aAAA,KjBAE,qBiBKA,MAAA,QACA,iBAAA,QACA,aAAA,QAEF,qBAAA,qBAMI,mBAAA,EAAA,EAAA,EAAA,IAAA,qBAAA,WAAA,EAAA,EAAA,EAAA,IAAA,qBAKJ,wBAAA,wBAEE,iBAAA,KACA,aAAA,KAGF,sBAAA,sBpB4zEF,qCoBzzEI,MAAA,QACA,iBAAA,QACA,iBAAA,KACA,aAAA,QDeJ,UCjDE,MAAA,KACA,iBAAA,QACA,aAAA,QjBAE,gBiBKA,MAAA,KACA,iBAAA,QACA,aAAA,QAEF,gBAAA,gBAMI,mBAAA,EAAA,EAAA,EAAA,IAAA,oBAAA,WAAA,EAAA,EAAA,EAAA,IAAA,oBAKJ,mBAAA,mBAEE,iBAAA,QACA,aAAA,QAGF,iBAAA,iBpB01EF,gCoBv1EI,MAAA,KACA,iBAAA,QACA,iBAAA,KACA,aAAA,QDkBJ,aCpDE,MAAA,KACA,iBAAA,QACA,aAAA,QjBAE,mBiBKA,MAAA,KACA,iBAAA,QACA,aAAA,QAEF,mBAAA,mBAMI,mBAAA,EAAA,EAAA,EAAA,IAAA,mBAAA,WAAA,EAAA,EAAA,EAAA,IAAA,mBAKJ,sBAAA,sBAEE,iBAAA,QACA,aAAA,QAGF,oBAAA,oBpBw3EF,mCoBr3EI,MAAA,KACA,iBAAA,QACA,iBAAA,KACA,aAAA,QDqBJ,aCvDE,MAAA,KACA,iBAAA,QACA,aAAA,QjBAE,mBiBKA,MAAA,KACA,iBAAA,QACA,aAAA,QAEF,mBAAA,mBAMI,mBAAA,EAAA,EAAA,EAAA,IAAA,oBAAA,WAAA,EAAA,EAAA,EAAA,IAAA,oBAKJ,sBAAA,sBAEE,iBAAA,QACA,aAAA,QAGF,oBAAA,oBpBs5EF,mCoBn5EI,MAAA,KACA,iBAAA,QACA,iBAAA,KACA,aAAA,QDwBJ,YC1DE,MAAA,KACA,iBAAA,QACA,aAAA,QjBAE,kBiBKA,MAAA,KACA,iBAAA,QACA,aAAA,QAEF,kBAAA,kBAMI,mBAAA,EAAA,EAAA,EAAA,IAAA,mBAAA,WAAA,EAAA,EAAA,EAAA,IAAA,mBAKJ,qBAAA,qBAEE,iBAAA,QACA,aAAA,QAGF,mBAAA,mBpBo7EF,kCoBj7EI,MAAA,KACA,iBAAA,QACA,iBAAA,KACA,aAAA,QD6BJ,qBCvBE,MAAA,QACA,iBAAA,YACA,iBAAA,KACA,aAAA,QjBzCE,2BiB4CA,MAAA,KACA,iBAAA,QACA,aAAA,QAGF,2BAAA,2BAEE,mBAAA,EAAA,EAAA,EAAA,IAAA,mBAAA,WAAA,EAAA,EAAA,EAAA,IAAA,mBAGF,8BAAA,8BAEE,MAAA,QACA,iBAAA,YAGF,4BAAA,4BpBi7EF,2CoB96EI,MAAA,KACA,iBAAA,QACA,aAAA,QDDJ,uBC1BE,MAAA,KACA,iBAAA,YACA,iBAAA,KACA,aAAA,KjBzCE,6BiB4CA,MAAA,QACA,iBAAA,KACA,aAAA,KAGF,6BAAA,6BAEE,mBAAA,EAAA,EAAA,EAAA,IAAA,qBAAA,WAAA,EAAA,EAAA,EAAA,IAAA,qBAGF,gCAAA,gCAEE,MAAA,KACA,iBAAA,YAGF,8BAAA,8BpB+8EF,6CoB58EI,MAAA,QACA,iBAAA,KACA,aAAA,KDEJ,kBC7BE,MAAA,QACA,iBAAA,YACA,iBAAA,KACA,aAAA,QjBzCE,wBiB4CA,MAAA,KACA,iBAAA,QACA,aAAA,QAGF,wBAAA,wBAEE,mBAAA,EAAA,EAAA,EAAA,IAAA,oBAAA,WAAA,EAAA,EAAA,EAAA,IAAA,oBAGF,2BAAA,2BAEE,MAAA,QACA,iBAAA,YAGF,yBAAA,yBpB6+EF,wCoB1+EI,MAAA,KACA,iBAAA,QACA,aAAA,QDKJ,qBChCE,MAAA,QACA,iBAAA,YACA,iBAAA,KACA,aAAA,QjBzCE,2BiB4CA,MAAA,KACA,iBAAA,QACA,aAAA,QAGF,2BAAA,2BAEE,mBAAA,EAAA,EAAA,EAAA,IAAA,mBAAA,WAAA,EAAA,EAAA,EAAA,IAAA,mBAGF,8BAAA,8BAEE,MAAA,QACA,iBAAA,YAGF,4BAAA,4BpB2gFF,2CoBxgFI,MAAA,KACA,iBAAA,QACA,aAAA,QDQJ,qBCnCE,MAAA,QACA,iBAAA,YACA,iBAAA,KACA,aAAA,QjBzCE,2BiB4CA,MAAA,KACA,iBAAA,QACA,aAAA,QAGF,2BAAA,2BAEE,mBAAA,EAAA,EAAA,EAAA,IAAA,oBAAA,WAAA,EAAA,EAAA,EAAA,IAAA,oBAGF,8BAAA,8BAEE,MAAA,QACA,iBAAA,YAGF,4BAAA,4BpByiFF,2CoBtiFI,MAAA,KACA,iBAAA,QACA,aAAA,QDWJ,oBCtCE,MAAA,QACA,iBAAA,YACA,iBAAA,KACA,aAAA,QjBzCE,0BiB4CA,MAAA,KACA,iBAAA,QACA,aAAA,QAGF,0BAAA,0BAEE,mBAAA,EAAA,EAAA,EAAA,IAAA,mBAAA,WAAA,EAAA,EAAA,EAAA,IAAA,mBAGF,6BAAA,6BAEE,MAAA,QACA,iBAAA,YAGF,2BAAA,2BpBukFF,0CoBpkFI,MAAA,KACA,iBAAA,QACA,aAAA,QDqBJ,UACE,YAAA,IACA,MAAA,QACA,cAAA,EAHF,UAAA,iBAAA,iBAAA,mBASI,iBAAA,YATJ,UAAA,iBAAA,gBAeI,aAAA,YhBrGA,gBgBwGA,aAAA,YhB7FA,gBAAA,gBgBgGA,MAAA,QACA,gBAAA,UACA,iBAAA,YAvBJ,mBA0BI,MAAA,QhBrGA,yBAAA,yBgBwGE,gBAAA,KAUN,mBAAA,QCtDE,QAAA,MAAA,KACA,UAAA,QACA,YAAA,IZhFE,cAAA,MWwIJ,mBAAA,QC1DE,QAAA,OAAA,MACA,UAAA,QACA,YAAA,IZhFE,cAAA,MWiJJ,WACE,QAAA,MACA,MAAA,KAIF,sBACE,WAAA,MnBijFF,6BADA,4BmB5iFA,6BAII,MAAA,KEpKJ,MACE,QAAA,EZII,mBAAA,QAAA,KAAA,OAAA,cAAA,QAAA,KAAA,OAAA,WAAA,QAAA,KAAA,OYLN,WAKI,QAAA,EAIJ,UACE,QAAA,KADF,eAGI,QAAA,MAIJ,iBAEI,QAAA,UAIJ,oBAEI,QAAA,gBAIJ,YACE,SAAA,SACA,OAAA,EACA,SAAA,OZ1BI,mBAAA,OAAA,KAAA,KAAA,cAAA,OAAA,KAAA,KAAA,WAAA,OAAA,KAAA,KTivFN,UsBrvFA,QAEE,SAAA,SAGF,wBAGI,QAAA,aACA,MAAA,EACA,OAAA,EACA,YAAA,KACA,eAAA,OACA,QAAA,GACA,WAAA,KAAA,MACA,aAAA,KAAA,MAAA,YACA,YAAA,KAAA,MAAA,YAXJ,8BAeI,YAAA,EAIJ,gCAGM,WAAA,EACA,cAAA,KAAA,MAMN,eACE,SAAA,SACA,IAAA,KACA,KAAA,EACA,QAAA,KACA,QAAA,KACA,MAAA,KACA,UAAA,MACA,QAAA,MAAA,EACA,OAAA,QAAA,EAAA,EACA,UAAA,KACA,MAAA,QACA,WAAA,KACA,WAAA,KACA,iBAAA,KACA,wBAAA,YAAA,gBAAA,YACA,OAAA,IAAA,MAAA,gBd/CE,cAAA,OcqDJ,kBCpDE,OAAA,EACA,OAAA,MAAA,EACA,SAAA,OACA,WAAA,IAAA,MAAA,QDwDF,eACE,QAAA,MACA,MAAA,KACA,QAAA,OAAA,OACA,MAAA,KACA,YAAA,IACA,MAAA,QACA,WAAA,QACA,YAAA,OACA,WAAA,IACA,OAAA,EnBpDE,qBAAA,qBmBuDA,MAAA,QACA,gBAAA,KACA,iBAAA,QAfJ,sBAAA,sBAoBI,MAAA,KACA,gBAAA,KACA,iBAAA,QAtBJ,wBAAA,wBA2BI,MAAA,QACA,iBAAA,YASJ,qBAGI,QAAA,MAHJ,QAQI,QAAA,EAQJ,qBACE,MAAA,EACA,KAAA,KAGF,oBACE,MAAA,KACA,KAAA,EAIF,iBACE,QAAA,MACA,QAAA,MAAA,OACA,cAAA,EACA,UAAA,QACA,MAAA,QACA,YAAA,OAOF,uBAGI,IAAA,KACA,OAAA,KACA,cAAA,QE/IJ,WxBw2FA,oBwBt2FE,SAAA,SACA,QAAA,mBAAA,QAAA,oBAAA,QAAA,mBAAA,QAAA,YACA,eAAA,OxB82FF,yBwBl3FA,gBAOI,SAAA,SACA,iBAAA,EAAA,aAAA,EAAA,EAAA,KAAA,SAAA,EAAA,EAAA,KAAA,KAAA,EAAA,EAAA,KACA,cAAA,ExBm3FJ,+BwB53FA,sBAcM,QAAA,ExBq3FN,gCADA,gCADA,+BwBj4FA,uBAAA,uBAAA,sBAmBM,QAAA,EAnBN,qBxBw4FA,2BACA,2BACA,iCACA,8BACA,oCACA,oCACA,0CwBl3FI,YAAA,KAKJ,aACE,QAAA,YAAA,QAAA,aAAA,QAAA,YAAA,QAAA,KACA,kBAAA,KAAA,cAAA,KAAA,UAAA,KACA,iBAAA,MAAA,wBAAA,WAAA,cAAA,MAAA,gBAAA,WAHF,0BAMI,MAAA,KAIJ,yEACE,cAAA,EAIF,4BACE,YAAA,EADF,mEhBlCI,wBAAA,EACA,2BAAA,EgByCJ,6CxB03FA,8CQt5FI,uBAAA,EACA,0BAAA,EgBiCJ,sBACE,MAAA,KAEF,8DACE,cAAA,EAEF,mExB43FA,oEQl7FI,wBAAA,EACA,2BAAA,EgB2DJ,oEhB9CI,uBAAA,EACA,0BAAA,EgB8DJ,4BACE,cAAA,OACA,aAAA,OAFF,mCAKI,YAAA,EAIJ,0CAAA,+BACE,cAAA,QACA,aAAA,QAGF,0CAAA,+BACE,cAAA,OACA,aAAA,OAoBF,oBACE,QAAA,mBAAA,QAAA,oBAAA,QAAA,mBAAA,QAAA,YACA,mBAAA,SAAA,sBAAA,OAAA,uBAAA,OAAA,mBAAA,OAAA,eAAA,OACA,kBAAA,MAAA,oBAAA,WAAA,eAAA,MAAA,YAAA,WACA,iBAAA,OAAA,wBAAA,OAAA,cAAA,OAAA,gBAAA,OAJF,yBxBm3FA,+BwB32FI,MAAA,KARJ,8BxBw3FA,oCACA,oCACA,0CwB32FI,WAAA,KACA,YAAA,EAIJ,4DAEI,cAAA,EAFJ,sDhB9HI,2BAAA,EACA,0BAAA,EgB6HJ,sDhB5II,uBAAA,EACA,wBAAA,EgBsJJ,uEACE,cAAA,EAEF,4ExBg3FA,6EQ5/FI,2BAAA,EACA,0BAAA,EgBiJJ,6EhBhKI,uBAAA,EACA,wBAAA,ERohGJ,gDE/KA,6CFiLA,2DADA,wDwBh2FM,SAAA,SACA,KAAA,cACA,eAAA,KC9LN,aACE,SAAA,SACA,QAAA,YAAA,QAAA,aAAA,QAAA,YAAA,QAAA,KACA,MAAA,KAHF,2BAQI,SAAA,SACA,QAAA,EACA,iBAAA,EAAA,aAAA,EAAA,EAAA,KAAA,SAAA,EAAA,EAAA,KAAA,KAAA,EAAA,EAAA,KAGA,MAAA,GACA,cAAA,EAdJ,kCAAA,iCAAA,iCAkBM,QAAA,EzB2iGN,2ByBtiGA,mBzBqiGA,iByBjiGE,QAAA,YAAA,QAAA,aAAA,QAAA,YAAA,QAAA,KACA,kBAAA,OAAA,oBAAA,OAAA,eAAA,OAAA,YAAA,OzB8iGF,8DyBnjGA,sDzBkjGA,oDQzkGI,cAAA,EiBmCJ,mBzB4iGA,iByB1iGE,YAAA,OACA,eAAA,OAyBF,mBACE,QAAA,MAAA,KACA,cAAA,EACA,UAAA,KACA,YAAA,IACA,YAAA,KACA,MAAA,QACA,WAAA,OACA,iBAAA,QACA,OAAA,IAAA,MAAA,gBjBxEE,cAAA,OiB+DJ,mCzBmiGA,mCACA,wDyBthGI,QAAA,OAAA,MACA,UAAA,QjB9EA,cAAA,MiB+DJ,mCzB2iGA,mCACA,wDyBxhGI,QAAA,MAAA,KACA,UAAA,QjBpFA,cAAA,MRknGJ,wCyBnjGA,qCA6BI,WAAA,EAUJ,4CzBihGA,oCAKA,oEADA,+EAHA,uCACA,kDACA,mDQ7mGI,wBAAA,EACA,2BAAA,EiBiGJ,oCACE,aAAA,EAEF,6CzBohGA,qCACA,wCACA,mDACA,oDAEA,oEADA,yDQ/mGI,uBAAA,EACA,0BAAA,EiB+FJ,mDACE,YAAA,EAOF,iBACE,SAAA,SAGA,UAAA,EACA,YAAA,OALF,sBAUI,SAAA,SAVJ,2BAaM,YAAA,KAbN,6BAAA,4BAAA,4BAkBM,QAAA,EAlBN,uCzBoiGA,6CyB1gGM,aAAA,KA1BN,wCzByiGA,8CyBzgGM,QAAA,EACA,YAAA,KzB+gGN,qDADA,oDAEA,oDyBjjGA,+CAAA,8CAAA,8CAoCQ,QAAA,EChKR,gBACE,SAAA,SACA,QAAA,mBAAA,QAAA,oBAAA,QAAA,mBAAA,QAAA,YACA,WAAA,OACA,aAAA,OACA,aAAA,KAGF,sBACE,SAAA,SACA,QAAA,GACA,QAAA,EAHF,wDAMI,MAAA,KACA,iBAAA,QAPJ,sDAaI,mBAAA,EAAA,EAAA,EAAA,IAAA,IAAA,CAAA,EAAA,EAAA,EAAA,IAAA,QAAA,WAAA,EAAA,EAAA,EAAA,IAAA,IAAA,CAAA,EAAA,EAAA,EAAA,IAAA,QAbJ,uDAiBI,MAAA,KACA,iBAAA,QAlBJ,yDAwBM,iBAAA,QAxBN,2DA4BM,MAAA,QASN,0BACE,SAAA,SACA,IAAA,OACA,KAAA,EACA,QAAA,MACA,MAAA,KACA,OAAA,KACA,eAAA,KACA,oBAAA,KAAA,iBAAA,KAAA,gBAAA,KAAA,YAAA,KACA,iBAAA,KACA,kBAAA,UACA,oBAAA,OAAA,OACA,wBAAA,IAAA,IAAA,gBAAA,IAAA,IAQF,2ClBxEI,cAAA,OkBwEJ,yEAMI,iBAAA,yMANJ,+EAUI,iBAAA,QACA,iBAAA,sJASJ,wCAEI,cAAA,IAFJ,sEAMI,iBAAA,mJAUJ,yBACE,QAAA,YAAA,QAAA,aAAA,QAAA,YAAA,QAAA,KACA,mBAAA,SAAA,sBAAA,OAAA,uBAAA,OAAA,mBAAA,OAAA,eAAA,OAFF,yCAKI,cAAA,OALJ,yDAQM,YAAA,EAYN,eACE,QAAA,aACA,UAAA,KAEA,OAAA,oBACA,QAAA,QAAA,QAAA,QAAA,OACA,YAAA,KACA,MAAA,QACA,eAAA,OACA,WAAA,KAAA,oKAAA,UAAA,MAAA,OAAA,OACA,wBAAA,IAAA,KAAA,gBAAA,IAAA,KACA,OAAA,IAAA,MAAA,gBlB3IE,cAAA,OkB6IF,mBAAA,KAAA,gBAAA,KAAA,WAAA,KAbF,qBAgBI,aAAA,QACA,QAAA,EAjBJ,gCA0BM,MAAA,QACA,iBAAA,KA3BN,wBAgCI,MAAA,QACA,iBAAA,QAjCJ,2BAsCI,QAAA,EAIJ,kBACE,YAAA,QACA,eAAA,QACA,UAAA,IAaF,aACE,SAAA,SACA,QAAA,aACA,UAAA,KACA,OAAA,OACA,cAAA,EAGF,mBACE,UAAA,MACA,UAAA,KACA,OAAA,OACA,OAAA,EACA,QAAA,EAOF,qBACE,SAAA,SACA,IAAA,EACA,MAAA,EACA,KAAA,EACA,QAAA,EACA,OAAA,OACA,QAAA,MAAA,KACA,YAAA,IACA,MAAA,QACA,eAAA,KACA,oBAAA,KAAA,iBAAA,KAAA,gBAAA,KAAA,YAAA,KACA,iBAAA,KACA,OAAA,IAAA,MAAA,gBlB3NE,cAAA,OkB8MJ,2CAmBM,QAAA,iBAnBN,6BAwBI,SAAA,SACA,IAAA,KACA,MAAA,KACA,OAAA,KACA,QAAA,EACA,QAAA,MACA,OAAA,OACA,QAAA,MAAA,KACA,YAAA,IACA,MAAA,QACA,iBAAA,QACA,OAAA,IAAA,MAAA,gBlBjPA,cAAA,EAAA,OAAA,OAAA,EkB8MJ,sCAyCM,QAAA,SCtPN,KACE,QAAA,YAAA,QAAA,aAAA,QAAA,YAAA,QAAA,KACA,kBAAA,KAAA,cAAA,KAAA,UAAA,KACA,aAAA,EACA,cAAA,EACA,WAAA,KAGF,UACE,QAAA,MACA,QAAA,MAAA,KxBOE,gBAAA,gBwBJA,gBAAA,KALJ,mBAUI,MAAA,QAQJ,UACE,cAAA,IAAA,MAAA,KADF,oBAII,cAAA,KAJJ,oBAQI,OAAA,IAAA,MAAA,YnB7BA,uBAAA,OACA,wBAAA,OmBoBJ,0BAAA,0BAYM,aAAA,QAAA,QAAA,KAZN,6BAgBM,MAAA,QACA,iBAAA,YACA,aAAA,Y3By4GN,mC2B35GA,2BAwBI,MAAA,QACA,iBAAA,KACA,aAAA,KAAA,KAAA,KA1BJ,yBA+BI,WAAA,KnBpDA,uBAAA,EACA,wBAAA,EmB8DJ,qBnBrEI,cAAA,OmBqEJ,4B3Bk4GA,2B2B53GM,MAAA,KACA,iBAAA,QAUN,oBAEI,iBAAA,EAAA,aAAA,EAAA,EAAA,KAAA,SAAA,EAAA,EAAA,KAAA,KAAA,EAAA,EAAA,KACA,WAAA,OAIJ,yBAEI,mBAAA,EAAA,wBAAA,EAAA,WAAA,EACA,iBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,UAAA,EACA,WAAA,OASJ,uBAEI,QAAA,KAFJ,qBAKI,QAAA,MClGJ,QACE,SAAA,SACA,QAAA,YAAA,QAAA,aAAA,QAAA,YAAA,QAAA,KACA,kBAAA,KAAA,cAAA,KAAA,UAAA,KACA,kBAAA,OAAA,oBAAA,OAAA,eAAA,OAAA,YAAA,OACA,iBAAA,QAAA,wBAAA,cAAA,cAAA,QAAA,gBAAA,cACA,QAAA,MAAA,KANF,mB5B++GA,yB4Bn+GI,QAAA,YAAA,QAAA,aAAA,QAAA,YAAA,QAAA,KACA,kBAAA,KAAA,cAAA,KAAA,UAAA,KACA,kBAAA,OAAA,oBAAA,OAAA,eAAA,OAAA,YAAA,OACA,iBAAA,QAAA,wBAAA,cAAA,cAAA,QAAA,gBAAA,cfqCA,yBepDJ,mB5BmgHE,yB4Bj/GI,MAAA,KACA,aAAA,EACA,YAAA,GAUN,cACE,QAAA,aACA,YAAA,SACA,eAAA,SACA,aAAA,KACA,UAAA,QACA,YAAA,QACA,YAAA,OzBhCE,oBAAA,oByBmCA,gBAAA,KASJ,YACE,QAAA,YAAA,QAAA,aAAA,QAAA,YAAA,QAAA,KACA,mBAAA,SAAA,sBAAA,OAAA,uBAAA,OAAA,mBAAA,OAAA,eAAA,OACA,aAAA,EACA,cAAA,EACA,WAAA,KALF,sBAQI,cAAA,EACA,aAAA,EASJ,aACE,QAAA,aACA,YAAA,MACA,eAAA,MAYF,iBACE,mBAAA,KAAA,wBAAA,KAAA,WAAA,KAIF,gBACE,QAAA,OAAA,OACA,UAAA,QACA,YAAA,EACA,WAAA,IACA,OAAA,IAAA,MAAA,YpBzGE,cAAA,OLkBA,sBAAA,sByB2FA,gBAAA,KAMJ,qBACE,QAAA,aACA,MAAA,MACA,OAAA,MACA,eAAA,OACA,QAAA,GACA,WAAA,UAAA,OAAA,OACA,wBAAA,KAAA,KAAA,gBAAA,KAAA,KfzDE,yBemEA,6CAIQ,SAAA,OACA,MAAA,KALR,6B5B+9GF,mC4Bp9GQ,cAAA,EACA,aAAA,Gf5FN,yBegFA,kBAiBI,mBAAA,WAAA,sBAAA,OAAA,uBAAA,IAAA,mBAAA,IAAA,eAAA,IACA,kBAAA,OAAA,cAAA,OAAA,UAAA,OACA,iBAAA,MAAA,wBAAA,WAAA,cAAA,MAAA,gBAAA,WAnBJ,8BAsBM,mBAAA,WAAA,sBAAA,OAAA,uBAAA,IAAA,mBAAA,IAAA,eAAA,IAtBN,6CAyBQ,SAAA,SAzBR,wCA6BQ,cAAA,MACA,aAAA,MA9BR,6B5BmgHF,mC4B99GQ,kBAAA,OAAA,cAAA,OAAA,UAAA,OArCN,mCA0CM,QAAA,sBAAA,QAAA,uBAAA,QAAA,sBAAA,QAAA,eA1CN,kCA+CM,QAAA,MflHN,yBemEA,6CAIQ,SAAA,OACA,MAAA,KALR,6B5ByhHF,mC4B9gHQ,cAAA,EACA,aAAA,Gf5FN,yBegFA,kBAiBI,mBAAA,WAAA,sBAAA,OAAA,uBAAA,IAAA,mBAAA,IAAA,eAAA,IACA,kBAAA,OAAA,cAAA,OAAA,UAAA,OACA,iBAAA,MAAA,wBAAA,WAAA,cAAA,MAAA,gBAAA,WAnBJ,8BAsBM,mBAAA,WAAA,sBAAA,OAAA,uBAAA,IAAA,mBAAA,IAAA,eAAA,IAtBN,6CAyBQ,SAAA,SAzBR,wCA6BQ,cAAA,MACA,aAAA,MA9BR,6B5B6jHF,mC4BxhHQ,kBAAA,OAAA,cAAA,OAAA,UAAA,OArCN,mCA0CM,QAAA,sBAAA,QAAA,uBAAA,QAAA,sBAAA,QAAA,eA1CN,kCA+CM,QAAA,MflHN,yBemEA,6CAIQ,SAAA,OACA,MAAA,KALR,6B5BmlHF,mC4BxkHQ,cAAA,EACA,aAAA,Gf5FN,yBegFA,kBAiBI,mBAAA,WAAA,sBAAA,OAAA,uBAAA,IAAA,mBAAA,IAAA,eAAA,IACA,kBAAA,OAAA,cAAA,OAAA,UAAA,OACA,iBAAA,MAAA,wBAAA,WAAA,cAAA,MAAA,gBAAA,WAnBJ,8BAsBM,mBAAA,WAAA,sBAAA,OAAA,uBAAA,IAAA,mBAAA,IAAA,eAAA,IAtBN,6CAyBQ,SAAA,SAzBR,wCA6BQ,cAAA,MACA,aAAA,MA9BR,6B5BunHF,mC4BllHQ,kBAAA,OAAA,cAAA,OAAA,UAAA,OArCN,mCA0CM,QAAA,sBAAA,QAAA,uBAAA,QAAA,sBAAA,QAAA,eA1CN,kCA+CM,QAAA,MflHN,0BemEA,6CAIQ,SAAA,OACA,MAAA,KALR,6B5B6oHF,mC4BloHQ,cAAA,EACA,aAAA,Gf5FN,0BegFA,kBAiBI,mBAAA,WAAA,sBAAA,OAAA,uBAAA,IAAA,mBAAA,IAAA,eAAA,IACA,kBAAA,OAAA,cAAA,OAAA,UAAA,OACA,iBAAA,MAAA,wBAAA,WAAA,cAAA,MAAA,gBAAA,WAnBJ,8BAsBM,mBAAA,WAAA,sBAAA,OAAA,uBAAA,IAAA,mBAAA,IAAA,eAAA,IAtBN,6CAyBQ,SAAA,SAzBR,wCA6BQ,cAAA,MACA,aAAA,MA9BR,6B5BirHF,mC4B5oHQ,kBAAA,OAAA,cAAA,OAAA,UAAA,OArCN,mCA0CM,QAAA,sBAAA,QAAA,uBAAA,QAAA,sBAAA,QAAA,eA1CN,kCA+CM,QAAA,MApDV,eAsBQ,mBAAA,WAAA,sBAAA,OAAA,uBAAA,IAAA,mBAAA,IAAA,eAAA,IACA,kBAAA,OAAA,cAAA,OAAA,UAAA,OACA,iBAAA,MAAA,wBAAA,WAAA,cAAA,MAAA,gBAAA,WAxBR,0CASY,SAAA,OACA,MAAA,KAVZ,0B5B2tHA,gC4B3sHU,cAAA,EACA,aAAA,EAjBV,2BA2BU,mBAAA,WAAA,sBAAA,OAAA,uBAAA,IAAA,mBAAA,IAAA,eAAA,IA3BV,0CA8BY,SAAA,SA9BZ,qCAkCY,cAAA,MACA,aAAA,MAnCZ,0B5BkvHA,gC4BxsHU,kBAAA,OAAA,cAAA,OAAA,UAAA,OA1CV,gCA+CU,QAAA,sBAAA,QAAA,uBAAA,QAAA,sBAAA,QAAA,eA/CV,+BAoDU,QAAA,KAaV,4BAEI,MAAA,eAFJ,kCAAA,kCAKM,MAAA,eALN,oCAWM,MAAA,eAXN,0CAAA,0CAcQ,MAAA,eAdR,6CAkBQ,MAAA,e5BqsHR,4CAEA,2CADA,yC4BxtHA,0CA0BM,MAAA,eA1BN,8BA+BI,MAAA,eACA,aAAA,eAhCJ,mCAoCI,iBAAA,oPApCJ,2BAwCI,MAAA,eAKJ,8BAEI,MAAA,KAFJ,oCAAA,oCAKM,MAAA,KALN,sCAWM,MAAA,qBAXN,4CAAA,4CAcQ,MAAA,sBAdR,+CAkBQ,MAAA,sB5BgsHR,8CAEA,6CADA,2C4BntHA,4CA0BM,MAAA,KA1BN,gCA+BI,MAAA,qBACA,aAAA,qBAhCJ,qCAoCI,iBAAA,0PApCJ,6BAwCI,MAAA,qBCrRJ,MACE,SAAA,SACA,QAAA,YAAA,QAAA,aAAA,QAAA,YAAA,QAAA,KACA,mBAAA,SAAA,sBAAA,OAAA,uBAAA,OAAA,mBAAA,OAAA,eAAA,OACA,iBAAA,KACA,OAAA,IAAA,MAAA,iBrBLE,cAAA,OqBSJ,YAGE,iBAAA,EAAA,aAAA,EAAA,EAAA,KAAA,SAAA,EAAA,EAAA,KAAA,KAAA,EAAA,EAAA,KACA,QAAA,QAGF,YACE,cAAA,OACA,WAAA,UAGF,eACE,WAAA,SACA,cAAA,EAGF,sBACE,cAAA,E1BpBE,iB0ByBA,gBAAA,KAFJ,sBAMI,YAAA,QAIJ,2DrBlCI,uBAAA,OACA,wBAAA,OqBiCJ,yDrBpBI,2BAAA,OACA,0BAAA,OqBsCJ,aACE,QAAA,OAAA,QACA,cAAA,EACA,iBAAA,QACA,cAAA,IAAA,MAAA,iBAJF,yBrB3DI,cAAA,mBAAA,mBAAA,EAAA,EqBsEJ,aACE,QAAA,OAAA,QACA,iBAAA,QACA,WAAA,IAAA,MAAA,iBAHF,wBrBtEI,cAAA,EAAA,EAAA,mBAAA,mBqBqFJ,kBACE,aAAA,SACA,cAAA,QACA,YAAA,SACA,cAAA,EAGF,mBACE,aAAA,SACA,YAAA,SAQF,cCvGE,iBAAA,QACA,aAAA,Q9BijIF,2B8B/iIE,2BAEE,iBAAA,YDqGJ,cC1GE,iBAAA,QACA,aAAA,Q9B2jIF,2B8BzjIE,2BAEE,iBAAA,YDwGJ,WC7GE,iBAAA,QACA,aAAA,Q9BqkIF,wB8BnkIE,wBAEE,iBAAA,YD2GJ,cChHE,iBAAA,QACA,aAAA,Q9B+kIF,2B8B7kIE,2BAEE,iBAAA,YD8GJ,aCnHE,iBAAA,QACA,aAAA,Q9BylIF,0B8BvlIE,0BAEE,iBAAA,YDmHJ,sBC9GE,iBAAA,YACA,aAAA,Q9BylIF,mC8BvlIE,mCAEE,iBAAA,YACA,aAAA,QD2GJ,wBCjHE,iBAAA,YACA,aAAA,K9BomIF,qC8BlmIE,qCAEE,iBAAA,YACA,aAAA,KD8GJ,mBCpHE,iBAAA,YACA,aAAA,Q9B+mIF,gC8B7mIE,gCAEE,iBAAA,YACA,aAAA,QDiHJ,sBCvHE,iBAAA,YACA,aAAA,Q9B0nIF,mC8BxnIE,mCAEE,iBAAA,YACA,aAAA,QDoHJ,sBC1HE,iBAAA,YACA,aAAA,Q9BqoIF,mC8BnoIE,mCAEE,iBAAA,YACA,aAAA,QDuHJ,qBC7HE,iBAAA,YACA,aAAA,Q9BgpIF,kC8B9oIE,kCAEE,iBAAA,YACA,aAAA,QD+HJ,cCtHE,MAAA,sB9B4oIF,2B8B1oIE,2BAEE,iBAAA,YACA,aAAA,qB9B+oIJ,+BAFA,2B8B3oIE,2B9B4oIF,0B8BxoII,MAAA,K9BgpIJ,kD8B9oIE,yB9B6oIF,6BADA,yB8BxoII,MAAA,sBAEF,+BAAA,+BAEI,MAAA,KDyGN,iBACE,QAAA,EACA,cAAA,EACA,YAAA,EAIF,kBACE,SAAA,SACA,IAAA,EACA,MAAA,EACA,OAAA,EACA,KAAA,EACA,QAAA,QAGF,UACE,MAAA,KrBvKE,cAAA,mBqB4KJ,cACE,MAAA,KrBvKE,uBAAA,mBACA,wBAAA,mBqB0KJ,iBACE,MAAA,KrB9JE,2BAAA,mBACA,0BAAA,mBK+BA,yBgBsIF,WACE,QAAA,YAAA,QAAA,aAAA,QAAA,YAAA,QAAA,KACA,mBAAA,WAAA,sBAAA,OAAA,kBAAA,IAAA,KAAA,cAAA,IAAA,KAAA,UAAA,IAAA,KACA,aAAA,MACA,YAAA,MAJF,iBAOI,QAAA,YAAA,QAAA,aAAA,QAAA,YAAA,QAAA,KACA,iBAAA,EAAA,aAAA,EAAA,EAAA,EAAA,SAAA,EAAA,EAAA,IAAA,KAAA,EAAA,EAAA,GACA,mBAAA,SAAA,sBAAA,OAAA,uBAAA,OAAA,mBAAA,OAAA,eAAA,OACA,aAAA,KACA,YAAA,MhBjJF,yBgB4JF,YACE,QAAA,YAAA,QAAA,aAAA,QAAA,YAAA,QAAA,KACA,mBAAA,WAAA,sBAAA,OAAA,kBAAA,IAAA,KAAA,cAAA,IAAA,KAAA,UAAA,IAAA,KAFF,kBAKI,iBAAA,EAAA,aAAA,EAAA,EAAA,EAAA,SAAA,EAAA,EAAA,IAAA,KAAA,EAAA,EAAA,GALJ,wBAQM,YAAA,EACA,YAAA,EATN,8BrBnME,wBAAA,EACA,2BAAA,EqBkMF,4CAkBU,wBAAA,EAlBV,+CAqBU,2BAAA,EArBV,6BrBrLE,uBAAA,EACA,0BAAA,EqBoLF,2CA4BU,uBAAA,EA5BV,8CA+BU,0BAAA,EA/BV,qDAoCQ,cAAA,E7BsjIR,sE6B1lIA,mEAwCU,cAAA,GAaZ,oBAEI,cAAA,OhBnNA,yBgBiNJ,cAMI,qBAAA,EAAA,kBAAA,EAAA,aAAA,EACA,mBAAA,QAAA,gBAAA,QAAA,WAAA,QAPJ,oBAUM,QAAA,aACA,MAAA,MEpRN,YACE,QAAA,OAAA,KACA,cAAA,KACA,WAAA,KACA,iBAAA,QvBAE,cAAA,OwBHF,mBACE,QAAA,MACA,MAAA,KACA,QAAA,GDKJ,iBACE,MAAA,KADF,0CAKI,QAAA,aACA,cAAA,MACA,aAAA,MACA,MAAA,QACA,QAAA,IATJ,gDAmBI,gBAAA,UAnBJ,gDAsBI,gBAAA,KAtBJ,wBA0BI,MAAA,QEnCJ,YACE,QAAA,YAAA,QAAA,aAAA,QAAA,YAAA,QAAA,KAEA,aAAA,EACA,WAAA,KzBAE,cAAA,OyBIJ,kCAGM,YAAA,EzBoBF,uBAAA,OACA,0BAAA,OyBxBJ,iCzBSI,wBAAA,OACA,2BAAA,OyBVJ,6BAcI,QAAA,EACA,MAAA,KACA,iBAAA,QACA,aAAA,QAjBJ,+BAqBI,MAAA,QACA,eAAA,KACA,iBAAA,KACA,aAAA,KAIJ,WACE,SAAA,SACA,QAAA,MACA,QAAA,MAAA,OACA,YAAA,KACA,YAAA,KACA,MAAA,QACA,iBAAA,KACA,OAAA,IAAA,MAAA,K9BtBE,iBAAA,iB8ByBA,MAAA,QACA,gBAAA,KACA,iBAAA,QACA,aAAA,KC/CF,0BACE,QAAA,OAAA,OACA,UAAA,QAKE,iD1BqBF,uBAAA,MACA,0BAAA,M0BjBE,gD1BEF,wBAAA,MACA,2BAAA,M0BfF,0BACE,QAAA,OAAA,MACA,UAAA,QAKE,iD1BqBF,uBAAA,MACA,0BAAA,M0BjBE,gD1BEF,wBAAA,MACA,2BAAA,M2BbJ,OACE,QAAA,aACA,QAAA,MAAA,KACA,UAAA,IACA,YAAA,IACA,YAAA,EACA,MAAA,KACA,WAAA,OACA,YAAA,OACA,eAAA,S3BVE,cAAA,O2BCJ,aAcI,QAAA,KAKJ,YACE,SAAA,SACA,IAAA,KhCJE,cAAA,cgCWA,MAAA,KACA,gBAAA,KASJ,YACE,cAAA,KACA,aAAA,K3BzCE,cAAA,M2BiDJ,eClDE,iBAAA,QjCmBE,2BAAA,2BiCfE,iBAAA,QDkDN,eCtDE,iBAAA,QjCmBE,2BAAA,2BiCfE,iBAAA,QDsDN,eC1DE,iBAAA,QjCmBE,2BAAA,2BiCfE,iBAAA,QD0DN,YC9DE,iBAAA,QjCmBE,wBAAA,wBiCfE,iBAAA,QD8DN,eClEE,iBAAA,QjCmBE,2BAAA,2BiCfE,iBAAA,QDkEN,cCtEE,iBAAA,QjCmBE,0BAAA,0BiCfE,iBAAA,QCPN,WACE,QAAA,KAAA,KACA,cAAA,KACA,iBAAA,Q7BCE,cAAA,MKoDA,yBwBxDJ,WAOI,QAAA,KAAA,MAIJ,iBACE,cAAA,EACA,aAAA,E7BTE,cAAA,E8BAJ,OACE,QAAA,OAAA,QACA,cAAA,KACA,OAAA,IAAA,MAAA,Y9BHE,cAAA,O8BQJ,eAEE,MAAA,QAIF,YACE,YAAA,IAQF,0BAGI,SAAA,SACA,IAAA,QACA,MAAA,SACA,QAAA,OAAA,QACA,MAAA,QASJ,eCxCE,MAAA,QACA,iBAAA,QACA,aAAA,QAEA,kBACE,iBAAA,QAEF,2BACE,MAAA,QDmCJ,YC3CE,MAAA,QACA,iBAAA,QACA,aAAA,QAEA,eACE,iBAAA,QAEF,wBACE,MAAA,QDsCJ,eC9CE,MAAA,QACA,iBAAA,QACA,aAAA,QAEA,kBACE,iBAAA,QAEF,2BACE,MAAA,QDyCJ,cCjDE,MAAA,QACA,iBAAA,QACA,aAAA,QAEA,iBACE,iBAAA,QAEF,0BACE,MAAA,QCXJ,wCACE,KAAO,oBAAA,KAAA,EACP,GAAK,oBAAA,EAAA,GAFP,mCACE,KAAO,oBAAA,KAAA,EACP,GAAK,oBAAA,EAAA,GAFP,gCACE,KAAO,oBAAA,KAAA,EACP,GAAK,oBAAA,EAAA,GAGP,UACE,QAAA,YAAA,QAAA,aAAA,QAAA,YAAA,QAAA,KACA,SAAA,OACA,UAAA,OACA,YAAA,KACA,WAAA,OACA,iBAAA,QhCPE,cAAA,OgCWJ,cACE,OAAA,KACA,YAAA,KACA,MAAA,KACA,iBAAA,Q/BdI,mBAAA,MAAA,IAAA,KAAA,cAAA,MAAA,IAAA,KAAA,WAAA,MAAA,IAAA,K+BkBN,sBCYE,iBAAA,yKAAA,iBAAA,oKAAA,iBAAA,iKDVA,wBAAA,KAAA,KAAA,gBAAA,KAAA,KAGF,uBACE,kBAAA,qBAAA,GAAA,OAAA,SAAA,aAAA,qBAAA,GAAA,OAAA,SAAA,UAAA,qBAAA,GAAA,OAAA,SE7BF,OACE,QAAA,YAAA,QAAA,aAAA,QAAA,YAAA,QAAA,KACA,kBAAA,MAAA,oBAAA,WAAA,eAAA,MAAA,YAAA,WAGF,YACE,iBAAA,EAAA,aAAA,EAAA,SAAA,EAAA,KAAA,EAAA,EAAA,GCFF,YACE,QAAA,YAAA,QAAA,aAAA,QAAA,YAAA,QAAA,KACA,mBAAA,SAAA,sBAAA,OAAA,uBAAA,OAAA,mBAAA,OAAA,eAAA,OAGA,aAAA,EACA,cAAA,EASF,wBACE,MAAA,KACA,MAAA,QACA,WAAA,QxCAE,8BAAA,8BwCIA,MAAA,QACA,gBAAA,KACA,iBAAA,QATJ,+BAaI,MAAA,QACA,iBAAA,QASJ,iBACE,SAAA,SACA,QAAA,MACA,QAAA,OAAA,QAEA,cAAA,KACA,iBAAA,KACA,OAAA,IAAA,MAAA,iBAPF,6BnChCI,uBAAA,OACA,wBAAA,OmC+BJ,4BAcI,cAAA,EnChCA,2BAAA,OACA,0BAAA,OLHA,uBAAA,uBwCuCA,gBAAA,KAnBJ,0BAAA,0BAwBI,MAAA,QACA,iBAAA,KAzBJ,wBA8BI,QAAA,EACA,MAAA,KACA,iBAAA,QACA,aAAA,QAUJ,mCAEI,aAAA,EACA,YAAA,EACA,cAAA,EAJJ,2DASM,WAAA,EATN,yDAeM,cAAA,ECjGJ,yBACE,MAAA,QACA,iBAAA,QAIF,0B5CkxJF,+B4ChxJI,MAAA,QzCWA,gCAAA,gCH0wJJ,qCACA,qC4CnxJM,MAAA,QACA,iBAAA,QANJ,iC5C8xJF,sC4CpxJM,MAAA,KACA,iBAAA,QACA,aAAA,QAlBJ,sBACE,MAAA,QACA,iBAAA,QAIF,uB5C0yJF,4B4CxyJI,MAAA,QzCWA,6BAAA,6BHkyJJ,kCACA,kC4C3yJM,MAAA,QACA,iBAAA,QANJ,8B5CszJF,mC4C5yJM,MAAA,KACA,iBAAA,QACA,aAAA,QAlBJ,yBACE,MAAA,QACA,iBAAA,QAIF,0B5Ck0JF,+B4Ch0JI,MAAA,QzCWA,gCAAA,gCH0zJJ,qCACA,qC4Cn0JM,MAAA,QACA,iBAAA,QANJ,iC5C80JF,sC4Cp0JM,MAAA,KACA,iBAAA,QACA,aAAA,QAlBJ,wBACE,MAAA,QACA,iBAAA,QAIF,yB5C01JF,8B4Cx1JI,MAAA,QzCWA,+BAAA,+BHk1JJ,oCACA,oC4C31JM,MAAA,QACA,iBAAA,QANJ,gC5Cs2JF,qC4C51JM,MAAA,KACA,iBAAA,QACA,aAAA,QCnBN,kBACE,SAAA,SACA,QAAA,MACA,MAAA,KACA,QAAA,EACA,SAAA,OALF,0BAQI,QAAA,MACA,QAAA,GATJ,yC7Ck4JA,wBADA,yBAEA,yBACA,wB6Cn3JI,SAAA,SACA,IAAA,EACA,OAAA,EACA,KAAA,EACA,MAAA,KACA,OAAA,KACA,OAAA,EAIJ,gCAEI,YAAA,WAIJ,gCAEI,YAAA,OAIJ,+BAEI,YAAA,IAIJ,+BAEI,YAAA,KCjDJ,OACE,MAAA,MACA,UAAA,OACA,YAAA,IACA,YAAA,EACA,MAAA,KACA,YAAA,EAAA,IAAA,EAAA,KACA,QAAA,G3CeE,aAAA,a2CZA,MAAA,KACA,gBAAA,KACA,QAAA,IAUJ,aACE,QAAA,EACA,WAAA,IACA,OAAA,EACA,mBAAA,KCnBF,YACE,SAAA,OAIF,OACE,SAAA,MACA,IAAA,EACA,MAAA,EACA,OAAA,EACA,KAAA,EACA,QAAA,KACA,QAAA,KACA,SAAA,OAGA,QAAA,EAXF,0BtCPM,mBAAA,kBAAA,IAAA,SAAA,WAAA,kBAAA,IAAA,SAAA,cAAA,aAAA,IAAA,SAAA,WAAA,UAAA,IAAA,SAAA,WAAA,UAAA,IAAA,QAAA,CAAA,kBAAA,IAAA,QAAA,CAAA,aAAA,IAAA,SsC0BF,kBAAA,kBAAA,aAAA,kBAAA,UAAA,kBAnBJ,0BAqByB,kBAAA,eAAA,aAAA,eAAA,UAAA,eAEzB,mBACE,WAAA,OACA,WAAA,KAIF,cACE,SAAA,SACA,MAAA,KACA,OAAA,KAIF,eACE,SAAA,SACA,QAAA,YAAA,QAAA,aAAA,QAAA,YAAA,QAAA,KACA,mBAAA,SAAA,sBAAA,OAAA,uBAAA,OAAA,mBAAA,OAAA,eAAA,OACA,iBAAA,KACA,wBAAA,YAAA,gBAAA,YACA,OAAA,IAAA,MAAA,evClDE,cAAA,MuCsDF,QAAA,EAIF,gBACE,SAAA,MACA,IAAA,EACA,MAAA,EACA,OAAA,EACA,KAAA,EACA,QAAA,KACA,iBAAA,KAPF,qBAUW,QAAA,EAVX,qBAWW,QAAA,GAKX,cACE,QAAA,YAAA,QAAA,aAAA,QAAA,YAAA,QAAA,KACA,kBAAA,OAAA,oBAAA,OAAA,eAAA,OAAA,YAAA,OACA,iBAAA,QAAA,wBAAA,cAAA,cAAA,QAAA,gBAAA,cACA,QAAA,KACA,cAAA,IAAA,MAAA,QAIF,aACE,cAAA,EACA,YAAA,IAKF,YACE,SAAA,SAGA,iBAAA,EAAA,aAAA,EAAA,EAAA,KAAA,SAAA,EAAA,EAAA,KAAA,KAAA,EAAA,EAAA,KACA,QAAA,KAIF,cACE,QAAA,YAAA,QAAA,aAAA,QAAA,YAAA,QAAA,KACA,kBAAA,OAAA,oBAAA,OAAA,eAAA,OAAA,YAAA,OACA,iBAAA,IAAA,wBAAA,SAAA,cAAA,IAAA,gBAAA,SACA,QAAA,KACA,WAAA,IAAA,MAAA,QALF,iCAQyB,YAAA,OARzB,gCASwB,aAAA,OAIxB,yBACE,SAAA,SACA,IAAA,QACA,MAAA,KACA,OAAA,KACA,SAAA,OlCjEE,yBkCuEF,cACE,UAAA,MACA,OAAA,KAAA,KAOF,UAAY,UAAA,OlChFV,yBkCoFF,UAAY,UAAA,OC3Id,SACE,SAAA,SACA,QAAA,KACA,QAAA,MCFA,YAAA,aAAA,CAAA,kBAAA,CAAA,UAAA,CAAA,MAAA,CAAA,gBAAA,CAAA,KAAA,CAAA,WAEA,WAAA,OACA,YAAA,IACA,YAAA,IACA,WAAA,KACA,WAAA,MACA,gBAAA,KACA,YAAA,KACA,eAAA,KACA,eAAA,OACA,WAAA,OACA,aAAA,OACA,YAAA,OACA,WAAA,KDRA,UAAA,QAEA,UAAA,WACA,QAAA,EAVF,cAYW,QAAA,GAZX,2CAAA,qBAgBI,QAAA,IAAA,EACA,WAAA,KAjBJ,kEAAA,4CAoBM,OAAA,EACA,KAAA,IACA,YAAA,KACA,QAAA,GACA,aAAA,IAAA,IAAA,EACA,iBAAA,KAzBN,yCAAA,uBA8BI,QAAA,EAAA,IACA,YAAA,IA/BJ,gEAAA,8CAkCM,IAAA,IACA,KAAA,EACA,WAAA,KACA,QAAA,GACA,aAAA,IAAA,IAAA,IAAA,EACA,mBAAA,KAvCN,wCAAA,wBA4CI,QAAA,IAAA,EACA,WAAA,IA7CJ,+DAAA,+CAgDM,IAAA,EACA,KAAA,IACA,YAAA,KACA,QAAA,GACA,aAAA,EAAA,IAAA,IACA,oBAAA,KArDN,0CAAA,sBA0DI,QAAA,EAAA,IACA,YAAA,KA3DJ,iEAAA,6CA8DM,IAAA,IACA,MAAA,EACA,WAAA,KACA,QAAA,GACA,aAAA,IAAA,EAAA,IAAA,IACA,kBAAA,KAMN,eACE,UAAA,MACA,QAAA,IAAA,IACA,MAAA,KACA,WAAA,OACA,iBAAA,KxC3EE,cAAA,OwCsEJ,uBASI,SAAA,SACA,MAAA,EACA,OAAA,EACA,aAAA,YACA,aAAA,MEvFJ,SACE,SAAA,SACA,IAAA,EACA,KAAA,EACA,QAAA,KACA,QAAA,MACA,UAAA,MACA,QAAA,IDLA,YAAA,aAAA,CAAA,kBAAA,CAAA,UAAA,CAAA,MAAA,CAAA,gBAAA,CAAA,KAAA,CAAA,WAEA,WAAA,OACA,YAAA,IACA,YAAA,IACA,WAAA,KACA,WAAA,MACA,gBAAA,KACA,YAAA,KACA,eAAA,KACA,eAAA,OACA,WAAA,OACA,aAAA,OACA,YAAA,OACA,WAAA,KCLA,UAAA,QAEA,UAAA,WACA,iBAAA,KACA,wBAAA,YAAA,gBAAA,YACA,OAAA,IAAA,MAAA,e1CZE,cAAA,M0CJJ,2CAAA,qBAyBI,WAAA,MAzBJ,kDAAA,mDAAA,4BAAA,6BA6BM,KAAA,IACA,oBAAA,EA9BN,mDAAA,6BAkCM,OAAA,MACA,YAAA,MACA,iBAAA,gBApCN,kDAAA,4BAwCM,OAAA,MACA,YAAA,MACA,iBAAA,KA1CN,yCAAA,uBAgDI,YAAA,KAhDJ,gDAAA,iDAAA,8BAAA,+BAoDM,IAAA,IACA,kBAAA,EArDN,iDAAA,+BAyDM,KAAA,MACA,WAAA,MACA,mBAAA,gBA3DN,gDAAA,8BA+DM,KAAA,MACA,WAAA,MACA,mBAAA,KAjEN,wCAAA,wBAuEI,WAAA,KAvEJ,+CAAA,gDAAA,+BAAA,gCA2EM,KAAA,IACA,iBAAA,EA5EN,gDAAA,gCAgFM,IAAA,MACA,YAAA,MACA,oBAAA,gBAlFN,+CAAA,+BAsFM,IAAA,MACA,YAAA,MACA,oBAAA,KAxFN,+DAAA,+CA6FM,SAAA,SACA,IAAA,EACA,KAAA,IACA,QAAA,MACA,MAAA,KACA,YAAA,MACA,QAAA,GACA,cAAA,IAAA,MAAA,QApGN,0CAAA,sBA0GI,YAAA,MA1GJ,iDAAA,kDAAA,6BAAA,8BA8GM,IAAA,IACA,mBAAA,EA/GN,kDAAA,8BAmHM,MAAA,MACA,WAAA,MACA,kBAAA,gBArHN,iDAAA,6BAyHM,MAAA,MACA,WAAA,MACA,kBAAA,KAON,eACE,QAAA,IAAA,KACA,cAAA,EACA,UAAA,KACA,MAAA,QACA,iBAAA,QACA,cAAA,IAAA,MAAA,Q1C9HE,uBAAA,kBACA,wBAAA,kB0CuHJ,qBAWI,QAAA,KAIJ,iBACE,QAAA,IAAA,KACA,MAAA,QlD4rKF,gBkDprKA,iBAEE,SAAA,SACA,QAAA,MACA,MAAA,EACA,OAAA,EACA,aAAA,YACA,aAAA,MAGF,iBACE,QAAA,GACA,aAAA,KAEF,gBACE,QAAA,GACA,aAAA,KC1KF,UACE,SAAA,SAGF,gBACE,SAAA,SACA,MAAA,KACA,SAAA,OAGF,eACE,SAAA,SACA,QAAA,KACA,kBAAA,OAAA,oBAAA,OAAA,eAAA,OAAA,YAAA,OACA,MAAA,K1CVI,mBAAA,kBAAA,IAAA,KAAA,WAAA,kBAAA,IAAA,KAAA,cAAA,aAAA,IAAA,KAAA,WAAA,UAAA,IAAA,KAAA,WAAA,UAAA,IAAA,IAAA,CAAA,kBAAA,IAAA,IAAA,CAAA,aAAA,IAAA,K0CYJ,4BAAA,OAAA,oBAAA,OACA,oBAAA,OAAA,YAAA,OnD82KF,oBACA,oBmD52KA,sBAGE,QAAA,YAAA,QAAA,aAAA,QAAA,YAAA,QAAA,KAGF,oBnD82KA,oBmD52KE,SAAA,SACA,IAAA,EAIF,uCnD62KA,wCmD32KE,kBAAA,mBAAA,UAAA,mBnDi3KF,4BmD92KA,oBAEE,kBAAA,sBAAA,UAAA,sBnDk3KF,2BmD/2KA,oBAEE,kBAAA,uBAAA,UAAA,uBnDm3KF,uBmD32KA,uBAEE,SAAA,SACA,IAAA,EACA,OAAA,EAEA,QAAA,YAAA,QAAA,aAAA,QAAA,YAAA,QAAA,KACA,kBAAA,OAAA,oBAAA,OAAA,eAAA,OAAA,YAAA,OACA,iBAAA,OAAA,wBAAA,OAAA,cAAA,OAAA,gBAAA,OACA,MAAA,IACA,MAAA,KACA,WAAA,OACA,QAAA,GnDs3KF,6BACA,6BGn6KI,6BAAA,6BgDkDA,MAAA,KACA,gBAAA,KACA,QAAA,EACA,QAAA,GAGJ,uBACE,KAAA,EAEF,uBACE,MAAA,EnDu3KF,4BmDn3KA,4BAEE,QAAA,aACA,MAAA,KACA,OAAA,KACA,WAAA,YAAA,UAAA,OAAA,OACA,wBAAA,KAAA,KAAA,gBAAA,KAAA,KAEF,4BACE,iBAAA,4LAEF,4BACE,iBAAA,8LASF,qBACE,SAAA,SACA,MAAA,EACA,OAAA,KACA,KAAA,EACA,QAAA,GACA,QAAA,YAAA,QAAA,aAAA,QAAA,YAAA,QAAA,KACA,iBAAA,OAAA,wBAAA,OAAA,cAAA,OAAA,gBAAA,OACA,aAAA,EAEA,aAAA,IACA,YAAA,IACA,WAAA,KAZF,wBAeI,SAAA,SACA,iBAAA,EAAA,aAAA,EAAA,EAAA,KAAA,SAAA,EAAA,EAAA,KAAA,KAAA,EAAA,EAAA,KACA,UAAA,KACA,OAAA,IACA,aAAA,IACA,YAAA,IACA,YAAA,OACA,iBAAA,qBAtBJ,gCA0BM,SAAA,SACA,IAAA,MACA,KAAA,EACA,QAAA,aACA,MAAA,KACA,OAAA,KACA,QAAA,GAhCN,+BAmCM,SAAA,SACA,OAAA,MACA,KAAA,EACA,QAAA,aACA,MAAA,KACA,OAAA,KACA,QAAA,GAzCN,6BA8CI,iBAAA,KASJ,kBACE,SAAA,SACA,MAAA,IACA,OAAA,KACA,KAAA,IACA,QAAA,GACA,YAAA,KACA,eAAA,KACA,MAAA,KACA,WAAA,OC3KF,gBAAqB,eAAA,mBACrB,WAAqB,eAAA,cACrB,cAAqB,eAAA,iBACrB,cAAqB,eAAA,iBACrB,mBAAqB,eAAA,sBACrB,gBAAqB,eAAA,mBCDrB,UACE,iBAAA,QCFA,YACE,iBAAA,kBnDkBA,mBAAA,mBmDdE,iBAAA,kBALJ,YACE,iBAAA,kBnDkBA,mBAAA,mBmDdE,iBAAA,kBALJ,SACE,iBAAA,kBnDkBA,gBAAA,gBmDdE,iBAAA,kBALJ,YACE,iBAAA,kBnDkBA,mBAAA,mBmDdE,iBAAA,kBALJ,WACE,iBAAA,kBnDkBA,kBAAA,kBmDdE,iBAAA,kBALJ,YACE,iBAAA,kBnDkBA,mBAAA,mBmDdE,iBAAA,kBCJN,UAAmB,OAAA,YACnB,cAAmB,WAAA,YACnB,gBAAmB,aAAA,YACnB,iBAAmB,cAAA,YACnB,eAAmB,YAAA,YAMnB,S/CVI,cAAA,O+CaJ,a/CPI,uBAAA,OACA,wBAAA,O+CSJ,e/CHI,wBAAA,OACA,2BAAA,O+CKJ,gB/CCI,2BAAA,OACA,0BAAA,O+CCJ,c/CKI,uBAAA,OACA,0BAAA,O+CFJ,gBACE,cAAA,IAGF,WACE,cAAA,EvBlCA,iBACE,QAAA,MACA,MAAA,KACA,QAAA,GwBIA,QAA2B,QAAA,eAC3B,UAA2B,QAAA,iBAC3B,gBAA2B,QAAA,uBAC3B,SAA2B,QAAA,gBAC3B,SAA2B,QAAA,gBAC3B,cAA2B,QAAA,qBAC3B,QAA2B,QAAA,sBAAA,QAAA,uBAAA,QAAA,sBAAA,QAAA,eAC3B,eAA2B,QAAA,6BAAA,QAAA,8BAAA,QAAA,6BAAA,QAAA,sB3CyC3B,yB2ChDA,WAA2B,QAAA,eAC3B,aAA2B,QAAA,iBAC3B,mBAA2B,QAAA,uBAC3B,YAA2B,QAAA,gBAC3B,YAA2B,QAAA,gBAC3B,iBAA2B,QAAA,qBAC3B,WAA2B,QAAA,sBAAA,QAAA,uBAAA,QAAA,sBAAA,QAAA,eAC3B,kBAA2B,QAAA,6BAAA,QAAA,8BAAA,QAAA,6BAAA,QAAA,uB3CyC3B,yB2ChDA,WAA2B,QAAA,eAC3B,aAA2B,QAAA,iBAC3B,mBAA2B,QAAA,uBAC3B,YAA2B,QAAA,gBAC3B,YAA2B,QAAA,gBAC3B,iBAA2B,QAAA,qBAC3B,WAA2B,QAAA,sBAAA,QAAA,uBAAA,QAAA,sBAAA,QAAA,eAC3B,kBAA2B,QAAA,6BAAA,QAAA,8BAAA,QAAA,6BAAA,QAAA,uB3CyC3B,yB2ChDA,WAA2B,QAAA,eAC3B,aAA2B,QAAA,iBAC3B,mBAA2B,QAAA,uBAC3B,YAA2B,QAAA,gBAC3B,YAA2B,QAAA,gBAC3B,iBAA2B,QAAA,qBAC3B,WAA2B,QAAA,sBAAA,QAAA,uBAAA,QAAA,sBAAA,QAAA,eAC3B,kBAA2B,QAAA,6BAAA,QAAA,8BAAA,QAAA,6BAAA,QAAA,uB3CyC3B,0B2ChDA,WAA2B,QAAA,eAC3B,aAA2B,QAAA,iBAC3B,mBAA2B,QAAA,uBAC3B,YAA2B,QAAA,gBAC3B,YAA2B,QAAA,gBAC3B,iBAA2B,QAAA,qBAC3B,WAA2B,QAAA,sBAAA,QAAA,uBAAA,QAAA,sBAAA,QAAA,eAC3B,kBAA2B,QAAA,6BAAA,QAAA,8BAAA,QAAA,6BAAA,QAAA,uBAS/B,eACE,QAAA,eAEA,aAHF,eAII,QAAA,iBAIJ,gBACE,QAAA,eAEA,aAHF,gBAII,QAAA,kBAIJ,sBACE,QAAA,eAEA,aAHF,sBAII,QAAA,wBAKF,aADF,cAEI,QAAA,gBC1CA,aAAwB,0BAAA,EAAA,cAAA,GAAA,eAAA,GAAA,MAAA,GACxB,YAAwB,0BAAA,EAAA,cAAA,EAAA,eAAA,EAAA,MAAA,EACxB,SAAwB,0BAAA,EAAA,cAAA,EAAA,eAAA,EAAA,MAAA,EAExB,UAAgC,mBAAA,qBAAA,sBAAA,iBAAA,uBAAA,cAAA,mBAAA,cAAA,eAAA,cAChC,aAAgC,mBAAA,mBAAA,sBAAA,iBAAA,uBAAA,iBAAA,mBAAA,iBAAA,eAAA,iBAChC,kBAAgC,mBAAA,qBAAA,sBAAA,kBAAA,uBAAA,sBAAA,mBAAA,sBAAA,eAAA,sBAChC,qBAAgC,mBAAA,mBAAA,sBAAA,kBAAA,uBAAA,yBAAA,mBAAA,yBAAA,eAAA,yBAEhC,WAA8B,kBAAA,eAAA,cAAA,eAAA,UAAA,eAC9B,aAA8B,kBAAA,iBAAA,cAAA,iBAAA,UAAA,iBAC9B,mBAA8B,kBAAA,uBAAA,cAAA,uBAAA,UAAA,uBAE9B,uBAAoC,iBAAA,gBAAA,wBAAA,qBAAA,cAAA,gBAAA,gBAAA,qBACpC,qBAAoC,iBAAA,cAAA,wBAAA,mBAAA,cAAA,cAAA,gBAAA,mBACpC,wBAAoC,iBAAA,iBAAA,wBAAA,iBAAA,cAAA,iBAAA,gBAAA,iBACpC,yBAAoC,iBAAA,kBAAA,wBAAA,wBAAA,cAAA,kBAAA,gBAAA,wBACpC,wBAAoC,wBAAA,uBAAA,cAAA,qBAAA,gBAAA,uBAEpC,mBAAiC,kBAAA,gBAAA,oBAAA,qBAAA,eAAA,gBAAA,YAAA,qBACjC,iBAAiC,kBAAA,cAAA,oBAAA,mBAAA,eAAA,cAAA,YAAA,mBACjC,oBAAiC,kBAAA,iBAAA,oBAAA,iBAAA,eAAA,iBAAA,YAAA,iBACjC,sBAAiC,kBAAA,mBAAA,oBAAA,mBAAA,eAAA,mBAAA,YAAA,mBACjC,qBAAiC,kBAAA,kBAAA,oBAAA,kBAAA,eAAA,kBAAA,YAAA,kBAEjC,qBAAkC,sBAAA,qBAAA,mBAAA,gBAAA,cAAA,qBAClC,mBAAkC,sBAAA,mBAAA,mBAAA,cAAA,cAAA,mBAClC,sBAAkC,sBAAA,iBAAA,mBAAA,iBAAA,cAAA,iBAClC,uBAAkC,sBAAA,wBAAA,mBAAA,kBAAA,cAAA,wBAClC,sBAAkC,sBAAA,uBAAA,mBAAA,qBAAA,cAAA,uBAClC,uBAAkC,sBAAA,kBAAA,mBAAA,kBAAA,cAAA,kBAElC,iBAAgC,mBAAA,eAAA,oBAAA,eAAA,mBAAA,eAAA,WAAA,eAChC,kBAAgC,mBAAA,qBAAA,oBAAA,gBAAA,WAAA,qBAChC,gBAAgC,mBAAA,mBAAA,oBAAA,cAAA,WAAA,mBAChC,mBAAgC,mBAAA,iBAAA,oBAAA,iBAAA,mBAAA,iBAAA,WAAA,iBAChC,qBAAgC,mBAAA,mBAAA,oBAAA,mBAAA,WAAA,mBAChC,oBAAgC,mBAAA,kBAAA,oBAAA,kBAAA,mBAAA,kBAAA,WAAA,kB5CWhC,yB4ChDA,gBAAwB,0BAAA,EAAA,cAAA,GAAA,eAAA,GAAA,MAAA,GACxB,eAAwB,0BAAA,EAAA,cAAA,EAAA,eAAA,EAAA,MAAA,EACxB,YAAwB,0BAAA,EAAA,cAAA,EAAA,eAAA,EAAA,MAAA,EAExB,aAAgC,mBAAA,qBAAA,sBAAA,iBAAA,uBAAA,cAAA,mBAAA,cAAA,eAAA,cAChC,gBAAgC,mBAAA,mBAAA,sBAAA,iBAAA,uBAAA,iBAAA,mBAAA,iBAAA,eAAA,iBAChC,qBAAgC,mBAAA,qBAAA,sBAAA,kBAAA,uBAAA,sBAAA,mBAAA,sBAAA,eAAA,sBAChC,wBAAgC,mBAAA,mBAAA,sBAAA,kBAAA,uBAAA,yBAAA,mBAAA,yBAAA,eAAA,yBAEhC,cAA8B,kBAAA,eAAA,cAAA,eAAA,UAAA,eAC9B,gBAA8B,kBAAA,iBAAA,cAAA,iBAAA,UAAA,iBAC9B,sBAA8B,kBAAA,uBAAA,cAAA,uBAAA,UAAA,uBAE9B,0BAAoC,iBAAA,gBAAA,wBAAA,qBAAA,cAAA,gBAAA,gBAAA,qBACpC,wBAAoC,iBAAA,cAAA,wBAAA,mBAAA,cAAA,cAAA,gBAAA,mBACpC,2BAAoC,iBAAA,iBAAA,wBAAA,iBAAA,cAAA,iBAAA,gBAAA,iBACpC,4BAAoC,iBAAA,kBAAA,wBAAA,wBAAA,cAAA,kBAAA,gBAAA,wBACpC,2BAAoC,wBAAA,uBAAA,cAAA,qBAAA,gBAAA,uBAEpC,sBAAiC,kBAAA,gBAAA,oBAAA,qBAAA,eAAA,gBAAA,YAAA,qBACjC,oBAAiC,kBAAA,cAAA,oBAAA,mBAAA,eAAA,cAAA,YAAA,mBACjC,uBAAiC,kBAAA,iBAAA,oBAAA,iBAAA,eAAA,iBAAA,YAAA,iBACjC,yBAAiC,kBAAA,mBAAA,oBAAA,mBAAA,eAAA,mBAAA,YAAA,mBACjC,wBAAiC,kBAAA,kBAAA,oBAAA,kBAAA,eAAA,kBAAA,YAAA,kBAEjC,wBAAkC,sBAAA,qBAAA,mBAAA,gBAAA,cAAA,qBAClC,sBAAkC,sBAAA,mBAAA,mBAAA,cAAA,cAAA,mBAClC,yBAAkC,sBAAA,iBAAA,mBAAA,iBAAA,cAAA,iBAClC,0BAAkC,sBAAA,wBAAA,mBAAA,kBAAA,cAAA,wBAClC,yBAAkC,sBAAA,uBAAA,mBAAA,qBAAA,cAAA,uBAClC,0BAAkC,sBAAA,kBAAA,mBAAA,kBAAA,cAAA,kBAElC,oBAAgC,mBAAA,eAAA,oBAAA,eAAA,mBAAA,eAAA,WAAA,eAChC,qBAAgC,mBAAA,qBAAA,oBAAA,gBAAA,WAAA,qBAChC,mBAAgC,mBAAA,mBAAA,oBAAA,cAAA,WAAA,mBAChC,sBAAgC,mBAAA,iBAAA,oBAAA,iBAAA,mBAAA,iBAAA,WAAA,iBAChC,wBAAgC,mBAAA,mBAAA,oBAAA,mBAAA,WAAA,mBAChC,uBAAgC,mBAAA,kBAAA,oBAAA,kBAAA,mBAAA,kBAAA,WAAA,mB5CWhC,yB4ChDA,gBAAwB,0BAAA,EAAA,cAAA,GAAA,eAAA,GAAA,MAAA,GACxB,eAAwB,0BAAA,EAAA,cAAA,EAAA,eAAA,EAAA,MAAA,EACxB,YAAwB,0BAAA,EAAA,cAAA,EAAA,eAAA,EAAA,MAAA,EAExB,aAAgC,mBAAA,qBAAA,sBAAA,iBAAA,uBAAA,cAAA,mBAAA,cAAA,eAAA,cAChC,gBAAgC,mBAAA,mBAAA,sBAAA,iBAAA,uBAAA,iBAAA,mBAAA,iBAAA,eAAA,iBAChC,qBAAgC,mBAAA,qBAAA,sBAAA,kBAAA,uBAAA,sBAAA,mBAAA,sBAAA,eAAA,sBAChC,wBAAgC,mBAAA,mBAAA,sBAAA,kBAAA,uBAAA,yBAAA,mBAAA,yBAAA,eAAA,yBAEhC,cAA8B,kBAAA,eAAA,cAAA,eAAA,UAAA,eAC9B,gBAA8B,kBAAA,iBAAA,cAAA,iBAAA,UAAA,iBAC9B,sBAA8B,kBAAA,uBAAA,cAAA,uBAAA,UAAA,uBAE9B,0BAAoC,iBAAA,gBAAA,wBAAA,qBAAA,cAAA,gBAAA,gBAAA,qBACpC,wBAAoC,iBAAA,cAAA,wBAAA,mBAAA,cAAA,cAAA,gBAAA,mBACpC,2BAAoC,iBAAA,iBAAA,wBAAA,iBAAA,cAAA,iBAAA,gBAAA,iBACpC,4BAAoC,iBAAA,kBAAA,wBAAA,wBAAA,cAAA,kBAAA,gBAAA,wBACpC,2BAAoC,wBAAA,uBAAA,cAAA,qBAAA,gBAAA,uBAEpC,sBAAiC,kBAAA,gBAAA,oBAAA,qBAAA,eAAA,gBAAA,YAAA,qBACjC,oBAAiC,kBAAA,cAAA,oBAAA,mBAAA,eAAA,cAAA,YAAA,mBACjC,uBAAiC,kBAAA,iBAAA,oBAAA,iBAAA,eAAA,iBAAA,YAAA,iBACjC,yBAAiC,kBAAA,mBAAA,oBAAA,mBAAA,eAAA,mBAAA,YAAA,mBACjC,wBAAiC,kBAAA,kBAAA,oBAAA,kBAAA,eAAA,kBAAA,YAAA,kBAEjC,wBAAkC,sBAAA,qBAAA,mBAAA,gBAAA,cAAA,qBAClC,sBAAkC,sBAAA,mBAAA,mBAAA,cAAA,cAAA,mBAClC,yBAAkC,sBAAA,iBAAA,mBAAA,iBAAA,cAAA,iBAClC,0BAAkC,sBAAA,wBAAA,mBAAA,kBAAA,cAAA,wBAClC,yBAAkC,sBAAA,uBAAA,mBAAA,qBAAA,cAAA,uBAClC,0BAAkC,sBAAA,kBAAA,mBAAA,kBAAA,cAAA,kBAElC,oBAAgC,mBAAA,eAAA,oBAAA,eAAA,mBAAA,eAAA,WAAA,eAChC,qBAAgC,mBAAA,qBAAA,oBAAA,gBAAA,WAAA,qBAChC,mBAAgC,mBAAA,mBAAA,oBAAA,cAAA,WAAA,mBAChC,sBAAgC,mBAAA,iBAAA,oBAAA,iBAAA,mBAAA,iBAAA,WAAA,iBAChC,wBAAgC,mBAAA,mBAAA,oBAAA,mBAAA,WAAA,mBAChC,uBAAgC,mBAAA,kBAAA,oBAAA,kBAAA,mBAAA,kBAAA,WAAA,mB5CWhC,yB4ChDA,gBAAwB,0BAAA,EAAA,cAAA,GAAA,eAAA,GAAA,MAAA,GACxB,eAAwB,0BAAA,EAAA,cAAA,EAAA,eAAA,EAAA,MAAA,EACxB,YAAwB,0BAAA,EAAA,cAAA,EAAA,eAAA,EAAA,MAAA,EAExB,aAAgC,mBAAA,qBAAA,sBAAA,iBAAA,uBAAA,cAAA,mBAAA,cAAA,eAAA,cAChC,gBAAgC,mBAAA,mBAAA,sBAAA,iBAAA,uBAAA,iBAAA,mBAAA,iBAAA,eAAA,iBAChC,qBAAgC,mBAAA,qBAAA,sBAAA,kBAAA,uBAAA,sBAAA,mBAAA,sBAAA,eAAA,sBAChC,wBAAgC,mBAAA,mBAAA,sBAAA,kBAAA,uBAAA,yBAAA,mBAAA,yBAAA,eAAA,yBAEhC,cAA8B,kBAAA,eAAA,cAAA,eAAA,UAAA,eAC9B,gBAA8B,kBAAA,iBAAA,cAAA,iBAAA,UAAA,iBAC9B,sBAA8B,kBAAA,uBAAA,cAAA,uBAAA,UAAA,uBAE9B,0BAAoC,iBAAA,gBAAA,wBAAA,qBAAA,cAAA,gBAAA,gBAAA,qBACpC,wBAAoC,iBAAA,cAAA,wBAAA,mBAAA,cAAA,cAAA,gBAAA,mBACpC,2BAAoC,iBAAA,iBAAA,wBAAA,iBAAA,cAAA,iBAAA,gBAAA,iBACpC,4BAAoC,iBAAA,kBAAA,wBAAA,wBAAA,cAAA,kBAAA,gBAAA,wBACpC,2BAAoC,wBAAA,uBAAA,cAAA,qBAAA,gBAAA,uBAEpC,sBAAiC,kBAAA,gBAAA,oBAAA,qBAAA,eAAA,gBAAA,YAAA,qBACjC,oBAAiC,kBAAA,cAAA,oBAAA,mBAAA,eAAA,cAAA,YAAA,mBACjC,uBAAiC,kBAAA,iBAAA,oBAAA,iBAAA,eAAA,iBAAA,YAAA,iBACjC,yBAAiC,kBAAA,mBAAA,oBAAA,mBAAA,eAAA,mBAAA,YAAA,mBACjC,wBAAiC,kBAAA,kBAAA,oBAAA,kBAAA,eAAA,kBAAA,YAAA,kBAEjC,wBAAkC,sBAAA,qBAAA,mBAAA,gBAAA,cAAA,qBAClC,sBAAkC,sBAAA,mBAAA,mBAAA,cAAA,cAAA,mBAClC,yBAAkC,sBAAA,iBAAA,mBAAA,iBAAA,cAAA,iBAClC,0BAAkC,sBAAA,wBAAA,mBAAA,kBAAA,cAAA,wBAClC,yBAAkC,sBAAA,uBAAA,mBAAA,qBAAA,cAAA,uBAClC,0BAAkC,sBAAA,kBAAA,mBAAA,kBAAA,cAAA,kBAElC,oBAAgC,mBAAA,eAAA,oBAAA,eAAA,mBAAA,eAAA,WAAA,eAChC,qBAAgC,mBAAA,qBAAA,oBAAA,gBAAA,WAAA,qBAChC,mBAAgC,mBAAA,mBAAA,oBAAA,cAAA,WAAA,mBAChC,sBAAgC,mBAAA,iBAAA,oBAAA,iBAAA,mBAAA,iBAAA,WAAA,iBAChC,wBAAgC,mBAAA,mBAAA,oBAAA,mBAAA,WAAA,mBAChC,uBAAgC,mBAAA,kBAAA,oBAAA,kBAAA,mBAAA,kBAAA,WAAA,mB5CWhC,0B4ChDA,gBAAwB,0BAAA,EAAA,cAAA,GAAA,eAAA,GAAA,MAAA,GACxB,eAAwB,0BAAA,EAAA,cAAA,EAAA,eAAA,EAAA,MAAA,EACxB,YAAwB,0BAAA,EAAA,cAAA,EAAA,eAAA,EAAA,MAAA,EAExB,aAAgC,mBAAA,qBAAA,sBAAA,iBAAA,uBAAA,cAAA,mBAAA,cAAA,eAAA,cAChC,gBAAgC,mBAAA,mBAAA,sBAAA,iBAAA,uBAAA,iBAAA,mBAAA,iBAAA,eAAA,iBAChC,qBAAgC,mBAAA,qBAAA,sBAAA,kBAAA,uBAAA,sBAAA,mBAAA,sBAAA,eAAA,sBAChC,wBAAgC,mBAAA,mBAAA,sBAAA,kBAAA,uBAAA,yBAAA,mBAAA,yBAAA,eAAA,yBAEhC,cAA8B,kBAAA,eAAA,cAAA,eAAA,UAAA,eAC9B,gBAA8B,kBAAA,iBAAA,cAAA,iBAAA,UAAA,iBAC9B,sBAA8B,kBAAA,uBAAA,cAAA,uBAAA,UAAA,uBAE9B,0BAAoC,iBAAA,gBAAA,wBAAA,qBAAA,cAAA,gBAAA,gBAAA,qBACpC,wBAAoC,iBAAA,cAAA,wBAAA,mBAAA,cAAA,cAAA,gBAAA,mBACpC,2BAAoC,iBAAA,iBAAA,wBAAA,iBAAA,cAAA,iBAAA,gBAAA,iBACpC,4BAAoC,iBAAA,kBAAA,wBAAA,wBAAA,cAAA,kBAAA,gBAAA,wBACpC,2BAAoC,wBAAA,uBAAA,cAAA,qBAAA,gBAAA,uBAEpC,sBAAiC,kBAAA,gBAAA,oBAAA,qBAAA,eAAA,gBAAA,YAAA,qBACjC,oBAAiC,kBAAA,cAAA,oBAAA,mBAAA,eAAA,cAAA,YAAA,mBACjC,uBAAiC,kBAAA,iBAAA,oBAAA,iBAAA,eAAA,iBAAA,YAAA,iBACjC,yBAAiC,kBAAA,mBAAA,oBAAA,mBAAA,eAAA,mBAAA,YAAA,mBACjC,wBAAiC,kBAAA,kBAAA,oBAAA,kBAAA,eAAA,kBAAA,YAAA,kBAEjC,wBAAkC,sBAAA,qBAAA,mBAAA,gBAAA,cAAA,qBAClC,sBAAkC,sBAAA,mBAAA,mBAAA,cAAA,cAAA,mBAClC,yBAAkC,sBAAA,iBAAA,mBAAA,iBAAA,cAAA,iBAClC,0BAAkC,sBAAA,wBAAA,mBAAA,kBAAA,cAAA,wBAClC,yBAAkC,sBAAA,uBAAA,mBAAA,qBAAA,cAAA,uBAClC,0BAAkC,sBAAA,kBAAA,mBAAA,kBAAA,cAAA,kBAElC,oBAAgC,mBAAA,eAAA,oBAAA,eAAA,mBAAA,eAAA,WAAA,eAChC,qBAAgC,mBAAA,qBAAA,oBAAA,gBAAA,WAAA,qBAChC,mBAAgC,mBAAA,mBAAA,oBAAA,cAAA,WAAA,mBAChC,sBAAgC,mBAAA,iBAAA,oBAAA,iBAAA,mBAAA,iBAAA,WAAA,iBAChC,wBAAgC,mBAAA,mBAAA,oBAAA,mBAAA,WAAA,mBAChC,uBAAgC,mBAAA,kBAAA,oBAAA,kBAAA,mBAAA,kBAAA,WAAA,mBCzChC,YCHF,MAAA,eDIE,aCDF,MAAA,gBDEE,YCCF,MAAA,e9CiDE,yB6CpDA,eCHF,MAAA,eDIE,gBCDF,MAAA,gBDEE,eCCF,MAAA,gB9CiDE,yB6CpDA,eCHF,MAAA,eDIE,gBCDF,MAAA,gBDEE,eCCF,MAAA,gB9CiDE,yB6CpDA,eCHF,MAAA,eDIE,gBCDF,MAAA,gBDEE,eCCF,MAAA,gB9CiDE,0B6CpDA,eCHF,MAAA,eDIE,gBCDF,MAAA,gBDEE,eCCF,MAAA,gBCLF,WACE,SAAA,MACA,IAAA,EACA,MAAA,EACA,KAAA,EACA,QAAA,KAGF,cACE,SAAA,MACA,MAAA,EACA,OAAA,EACA,KAAA,EACA,QAAA,KAGF,YACE,SAAA,eAAA,SAAA,OACA,IAAA,EACA,QAAA,KCjBF,SCEE,SAAA,SACA,MAAA,IACA,OAAA,IACA,QAAA,EACA,SAAA,OACA,KAAA,cACA,YAAA,OACA,kBAAA,WAAA,UAAA,WACA,OAAA,EAUA,0BAAA,yBAEE,SAAA,OACA,MAAA,KACA,OAAA,KACA,SAAA,QACA,KAAA,KACA,YAAA,OACA,kBAAA,KAAA,UAAA,KC5BA,MAAuB,MAAA,cAAvB,MAAuB,MAAA,cAAvB,MAAuB,MAAA,cAAvB,OAAuB,MAAA,eAAvB,MAAuB,OAAA,cAAvB,MAAuB,OAAA,cAAvB,MAAuB,OAAA,cAAvB,OAAuB,OAAA,eAI3B,QAAU,UAAA,eACV,QAAU,WAAA,eCAF,KAAiC,OAAA,YACjC,MAAiC,WAAA,YACjC,MAAiC,aAAA,YACjC,MAAiC,cAAA,YACjC,MAAiC,YAAA,YACjC,MACE,aAAA,YACA,YAAA,YAEF,MACE,WAAA,YACA,cAAA,YAXF,KAAiC,OAAA,iBACjC,MAAiC,WAAA,iBACjC,MAAiC,aAAA,iBACjC,MAAiC,cAAA,iBACjC,MAAiC,YAAA,iBACjC,MACE,aAAA,iBACA,YAAA,iBAEF,MACE,WAAA,iBACA,cAAA,iBAXF,KAAiC,OAAA,gBACjC,MAAiC,WAAA,gBACjC,MAAiC,aAAA,gBACjC,MAAiC,cAAA,gBACjC,MAAiC,YAAA,gBACjC,MACE,aAAA,gBACA,YAAA,gBAEF,MACE,WAAA,gBACA,cAAA,gBAXF,KAAiC,OAAA,eACjC,MAAiC,WAAA,eACjC,MAAiC,aAAA,eACjC,MAAiC,cAAA,eACjC,MAAiC,YAAA,eACjC,MACE,aAAA,eACA,YAAA,eAEF,MACE,WAAA,eACA,cAAA,eAXF,KAAiC,OAAA,iBACjC,MAAiC,WAAA,iBACjC,MAAiC,aAAA,iBACjC,MAAiC,cAAA,iBACjC,MAAiC,YAAA,iBACjC,MACE,aAAA,iBACA,YAAA,iBAEF,MACE,WAAA,iBACA,cAAA,iBAXF,KAAiC,OAAA,eACjC,MAAiC,WAAA,eACjC,MAAiC,aAAA,eACjC,MAAiC,cAAA,eACjC,MAAiC,YAAA,eACjC,MACE,aAAA,eACA,YAAA,eAEF,MACE,WAAA,eACA,cAAA,eAXF,KAAiC,QAAA,YACjC,MAAiC,YAAA,YACjC,MAAiC,cAAA,YACjC,MAAiC,eAAA,YACjC,MAAiC,aAAA,YACjC,MACE,cAAA,YACA,aAAA,YAEF,MACE,YAAA,YACA,eAAA,YAXF,KAAiC,QAAA,iBACjC,MAAiC,YAAA,iBACjC,MAAiC,cAAA,iBACjC,MAAiC,eAAA,iBACjC,MAAiC,aAAA,iBACjC,MACE,cAAA,iBACA,aAAA,iBAEF,MACE,YAAA,iBACA,eAAA,iBAXF,KAAiC,QAAA,gBACjC,MAAiC,YAAA,gBACjC,MAAiC,cAAA,gBACjC,MAAiC,eAAA,gBACjC,MAAiC,aAAA,gBACjC,MACE,cAAA,gBACA,aAAA,gBAEF,MACE,YAAA,gBACA,eAAA,gBAXF,KAAiC,QAAA,eACjC,MAAiC,YAAA,eACjC,MAAiC,cAAA,eACjC,MAAiC,eAAA,eACjC,MAAiC,aAAA,eACjC,MACE,cAAA,eACA,aAAA,eAEF,MACE,YAAA,eACA,eAAA,eAXF,KAAiC,QAAA,iBACjC,MAAiC,YAAA,iBACjC,MAAiC,cAAA,iBACjC,MAAiC,eAAA,iBACjC,MAAiC,aAAA,iBACjC,MACE,cAAA,iBACA,aAAA,iBAEF,MACE,YAAA,iBACA,eAAA,iBAXF,KAAiC,QAAA,eACjC,MAAiC,YAAA,eACjC,MAAiC,cAAA,eACjC,MAAiC,eAAA,eACjC,MAAiC,aAAA,eACjC,MACE,cAAA,eACA,aAAA,eAEF,MACE,YAAA,eACA,eAAA,eAMN,QAAoB,OAAA,eACpB,SAAoB,WAAA,eACpB,SAAoB,aAAA,eACpB,SAAoB,cAAA,eACpB,SAAoB,YAAA,eACpB,SACE,aAAA,eACA,YAAA,eAEF,SACE,WAAA,eACA,cAAA,enDmBF,yBmD/CI,QAAiC,OAAA,YACjC,SAAiC,WAAA,YACjC,SAAiC,aAAA,YACjC,SAAiC,cAAA,YACjC,SAAiC,YAAA,YACjC,SACE,aAAA,YACA,YAAA,YAEF,SACE,WAAA,YACA,cAAA,YAXF,QAAiC,OAAA,iBACjC,SAAiC,WAAA,iBACjC,SAAiC,aAAA,iBACjC,SAAiC,cAAA,iBACjC,SAAiC,YAAA,iBACjC,SACE,aAAA,iBACA,YAAA,iBAEF,SACE,WAAA,iBACA,cAAA,iBAXF,QAAiC,OAAA,gBACjC,SAAiC,WAAA,gBACjC,SAAiC,aAAA,gBACjC,SAAiC,cAAA,gBACjC,SAAiC,YAAA,gBACjC,SACE,aAAA,gBACA,YAAA,gBAEF,SACE,WAAA,gBACA,cAAA,gBAXF,QAAiC,OAAA,eACjC,SAAiC,WAAA,eACjC,SAAiC,aAAA,eACjC,SAAiC,cAAA,eACjC,SAAiC,YAAA,eACjC,SACE,aAAA,eACA,YAAA,eAEF,SACE,WAAA,eACA,cAAA,eAXF,QAAiC,OAAA,iBACjC,SAAiC,WAAA,iBACjC,SAAiC,aAAA,iBACjC,SAAiC,cAAA,iBACjC,SAAiC,YAAA,iBACjC,SACE,aAAA,iBACA,YAAA,iBAEF,SACE,WAAA,iBACA,cAAA,iBAXF,QAAiC,OAAA,eACjC,SAAiC,WAAA,eACjC,SAAiC,aAAA,eACjC,SAAiC,cAAA,eACjC,SAAiC,YAAA,eACjC,SACE,aAAA,eACA,YAAA,eAEF,SACE,WAAA,eACA,cAAA,eAXF,QAAiC,QAAA,YACjC,SAAiC,YAAA,YACjC,SAAiC,cAAA,YACjC,SAAiC,eAAA,YACjC,SAAiC,aAAA,YACjC,SACE,cAAA,YACA,aAAA,YAEF,SACE,YAAA,YACA,eAAA,YAXF,QAAiC,QAAA,iBACjC,SAAiC,YAAA,iBACjC,SAAiC,cAAA,iBACjC,SAAiC,eAAA,iBACjC,SAAiC,aAAA,iBACjC,SACE,cAAA,iBACA,aAAA,iBAEF,SACE,YAAA,iBACA,eAAA,iBAXF,QAAiC,QAAA,gBACjC,SAAiC,YAAA,gBACjC,SAAiC,cAAA,gBACjC,SAAiC,eAAA,gBACjC,SAAiC,aAAA,gBACjC,SACE,cAAA,gBACA,aAAA,gBAEF,SACE,YAAA,gBACA,eAAA,gBAXF,QAAiC,QAAA,eACjC,SAAiC,YAAA,eACjC,SAAiC,cAAA,eACjC,SAAiC,eAAA,eACjC,SAAiC,aAAA,eACjC,SACE,cAAA,eACA,aAAA,eAEF,SACE,YAAA,eACA,eAAA,eAXF,QAAiC,QAAA,iBACjC,SAAiC,YAAA,iBACjC,SAAiC,cAAA,iBACjC,SAAiC,eAAA,iBACjC,SAAiC,aAAA,iBACjC,SACE,cAAA,iBACA,aAAA,iBAEF,SACE,YAAA,iBACA,eAAA,iBAXF,QAAiC,QAAA,eACjC,SAAiC,YAAA,eACjC,SAAiC,cAAA,eACjC,SAAiC,eAAA,eACjC,SAAiC,aAAA,eACjC,SACE,cAAA,eACA,aAAA,eAEF,SACE,YAAA,eACA,eAAA,eAMN,WAAoB,OAAA,eACpB,YAAoB,WAAA,eACpB,YAAoB,aAAA,eACpB,YAAoB,cAAA,eACpB,YAAoB,YAAA,eACpB,YACE,aAAA,eACA,YAAA,eAEF,YACE,WAAA,eACA,cAAA,gBnDmBF,yBmD/CI,QAAiC,OAAA,YACjC,SAAiC,WAAA,YACjC,SAAiC,aAAA,YACjC,SAAiC,cAAA,YACjC,SAAiC,YAAA,YACjC,SACE,aAAA,YACA,YAAA,YAEF,SACE,WAAA,YACA,cAAA,YAXF,QAAiC,OAAA,iBACjC,SAAiC,WAAA,iBACjC,SAAiC,aAAA,iBACjC,SAAiC,cAAA,iBACjC,SAAiC,YAAA,iBACjC,SACE,aAAA,iBACA,YAAA,iBAEF,SACE,WAAA,iBACA,cAAA,iBAXF,QAAiC,OAAA,gBACjC,SAAiC,WAAA,gBACjC,SAAiC,aAAA,gBACjC,SAAiC,cAAA,gBACjC,SAAiC,YAAA,gBACjC,SACE,aAAA,gBACA,YAAA,gBAEF,SACE,WAAA,gBACA,cAAA,gBAXF,QAAiC,OAAA,eACjC,SAAiC,WAAA,eACjC,SAAiC,aAAA,eACjC,SAAiC,cAAA,eACjC,SAAiC,YAAA,eACjC,SACE,aAAA,eACA,YAAA,eAEF,SACE,WAAA,eACA,cAAA,eAXF,QAAiC,OAAA,iBACjC,SAAiC,WAAA,iBACjC,SAAiC,aAAA,iBACjC,SAAiC,cAAA,iBACjC,SAAiC,YAAA,iBACjC,SACE,aAAA,iBACA,YAAA,iBAEF,SACE,WAAA,iBACA,cAAA,iBAXF,QAAiC,OAAA,eACjC,SAAiC,WAAA,eACjC,SAAiC,aAAA,eACjC,SAAiC,cAAA,eACjC,SAAiC,YAAA,eACjC,SACE,aAAA,eACA,YAAA,eAEF,SACE,WAAA,eACA,cAAA,eAXF,QAAiC,QAAA,YACjC,SAAiC,YAAA,YACjC,SAAiC,cAAA,YACjC,SAAiC,eAAA,YACjC,SAAiC,aAAA,YACjC,SACE,cAAA,YACA,aAAA,YAEF,SACE,YAAA,YACA,eAAA,YAXF,QAAiC,QAAA,iBACjC,SAAiC,YAAA,iBACjC,SAAiC,cAAA,iBACjC,SAAiC,eAAA,iBACjC,SAAiC,aAAA,iBACjC,SACE,cAAA,iBACA,aAAA,iBAEF,SACE,YAAA,iBACA,eAAA,iBAXF,QAAiC,QAAA,gBACjC,SAAiC,YAAA,gBACjC,SAAiC,cAAA,gBACjC,SAAiC,eAAA,gBACjC,SAAiC,aAAA,gBACjC,SACE,cAAA,gBACA,aAAA,gBAEF,SACE,YAAA,gBACA,eAAA,gBAXF,QAAiC,QAAA,eACjC,SAAiC,YAAA,eACjC,SAAiC,cAAA,eACjC,SAAiC,eAAA,eACjC,SAAiC,aAAA,eACjC,SACE,cAAA,eACA,aAAA,eAEF,SACE,YAAA,eACA,eAAA,eAXF,QAAiC,QAAA,iBACjC,SAAiC,YAAA,iBACjC,SAAiC,cAAA,iBACjC,SAAiC,eAAA,iBACjC,SAAiC,aAAA,iBACjC,SACE,cAAA,iBACA,aAAA,iBAEF,SACE,YAAA,iBACA,eAAA,iBAXF,QAAiC,QAAA,eACjC,SAAiC,YAAA,eACjC,SAAiC,cAAA,eACjC,SAAiC,eAAA,eACjC,SAAiC,aAAA,eACjC,SACE,cAAA,eACA,aAAA,eAEF,SACE,YAAA,eACA,eAAA,eAMN,WAAoB,OAAA,eACpB,YAAoB,WAAA,eACpB,YAAoB,aAAA,eACpB,YAAoB,cAAA,eACpB,YAAoB,YAAA,eACpB,YACE,aAAA,eACA,YAAA,eAEF,YACE,WAAA,eACA,cAAA,gBnDmBF,yBmD/CI,QAAiC,OAAA,YACjC,SAAiC,WAAA,YACjC,SAAiC,aAAA,YACjC,SAAiC,cAAA,YACjC,SAAiC,YAAA,YACjC,SACE,aAAA,YACA,YAAA,YAEF,SACE,WAAA,YACA,cAAA,YAXF,QAAiC,OAAA,iBACjC,SAAiC,WAAA,iBACjC,SAAiC,aAAA,iBACjC,SAAiC,cAAA,iBACjC,SAAiC,YAAA,iBACjC,SACE,aAAA,iBACA,YAAA,iBAEF,SACE,WAAA,iBACA,cAAA,iBAXF,QAAiC,OAAA,gBACjC,SAAiC,WAAA,gBACjC,SAAiC,aAAA,gBACjC,SAAiC,cAAA,gBACjC,SAAiC,YAAA,gBACjC,SACE,aAAA,gBACA,YAAA,gBAEF,SACE,WAAA,gBACA,cAAA,gBAXF,QAAiC,OAAA,eACjC,SAAiC,WAAA,eACjC,SAAiC,aAAA,eACjC,SAAiC,cAAA,eACjC,SAAiC,YAAA,eACjC,SACE,aAAA,eACA,YAAA,eAEF,SACE,WAAA,eACA,cAAA,eAXF,QAAiC,OAAA,iBACjC,SAAiC,WAAA,iBACjC,SAAiC,aAAA,iBACjC,SAAiC,cAAA,iBACjC,SAAiC,YAAA,iBACjC,SACE,aAAA,iBACA,YAAA,iBAEF,SACE,WAAA,iBACA,cAAA,iBAXF,QAAiC,OAAA,eACjC,SAAiC,WAAA,eACjC,SAAiC,aAAA,eACjC,SAAiC,cAAA,eACjC,SAAiC,YAAA,eACjC,SACE,aAAA,eACA,YAAA,eAEF,SACE,WAAA,eACA,cAAA,eAXF,QAAiC,QAAA,YACjC,SAAiC,YAAA,YACjC,SAAiC,cAAA,YACjC,SAAiC,eAAA,YACjC,SAAiC,aAAA,YACjC,SACE,cAAA,YACA,aAAA,YAEF,SACE,YAAA,YACA,eAAA,YAXF,QAAiC,QAAA,iBACjC,SAAiC,YAAA,iBACjC,SAAiC,cAAA,iBACjC,SAAiC,eAAA,iBACjC,SAAiC,aAAA,iBACjC,SACE,cAAA,iBACA,aAAA,iBAEF,SACE,YAAA,iBACA,eAAA,iBAXF,QAAiC,QAAA,gBACjC,SAAiC,YAAA,gBACjC,SAAiC,cAAA,gBACjC,SAAiC,eAAA,gBACjC,SAAiC,aAAA,gBACjC,SACE,cAAA,gBACA,aAAA,gBAEF,SACE,YAAA,gBACA,eAAA,gBAXF,QAAiC,QAAA,eACjC,SAAiC,YAAA,eACjC,SAAiC,cAAA,eACjC,SAAiC,eAAA,eACjC,SAAiC,aAAA,eACjC,SACE,cAAA,eACA,aAAA,eAEF,SACE,YAAA,eACA,eAAA,eAXF,QAAiC,QAAA,iBACjC,SAAiC,YAAA,iBACjC,SAAiC,cAAA,iBACjC,SAAiC,eAAA,iBACjC,SAAiC,aAAA,iBACjC,SACE,cAAA,iBACA,aAAA,iBAEF,SACE,YAAA,iBACA,eAAA,iBAXF,QAAiC,QAAA,eACjC,SAAiC,YAAA,eACjC,SAAiC,cAAA,eACjC,SAAiC,eAAA,eACjC,SAAiC,aAAA,eACjC,SACE,cAAA,eACA,aAAA,eAEF,SACE,YAAA,eACA,eAAA,eAMN,WAAoB,OAAA,eACpB,YAAoB,WAAA,eACpB,YAAoB,aAAA,eACpB,YAAoB,cAAA,eACpB,YAAoB,YAAA,eACpB,YACE,aAAA,eACA,YAAA,eAEF,YACE,WAAA,eACA,cAAA,gBnDmBF,0BmD/CI,QAAiC,OAAA,YACjC,SAAiC,WAAA,YACjC,SAAiC,aAAA,YACjC,SAAiC,cAAA,YACjC,SAAiC,YAAA,YACjC,SACE,aAAA,YACA,YAAA,YAEF,SACE,WAAA,YACA,cAAA,YAXF,QAAiC,OAAA,iBACjC,SAAiC,WAAA,iBACjC,SAAiC,aAAA,iBACjC,SAAiC,cAAA,iBACjC,SAAiC,YAAA,iBACjC,SACE,aAAA,iBACA,YAAA,iBAEF,SACE,WAAA,iBACA,cAAA,iBAXF,QAAiC,OAAA,gBACjC,SAAiC,WAAA,gBACjC,SAAiC,aAAA,gBACjC,SAAiC,cAAA,gBACjC,SAAiC,YAAA,gBACjC,SACE,aAAA,gBACA,YAAA,gBAEF,SACE,WAAA,gBACA,cAAA,gBAXF,QAAiC,OAAA,eACjC,SAAiC,WAAA,eACjC,SAAiC,aAAA,eACjC,SAAiC,cAAA,eACjC,SAAiC,YAAA,eACjC,SACE,aAAA,eACA,YAAA,eAEF,SACE,WAAA,eACA,cAAA,eAXF,QAAiC,OAAA,iBACjC,SAAiC,WAAA,iBACjC,SAAiC,aAAA,iBACjC,SAAiC,cAAA,iBACjC,SAAiC,YAAA,iBACjC,SACE,aAAA,iBACA,YAAA,iBAEF,SACE,WAAA,iBACA,cAAA,iBAXF,QAAiC,OAAA,eACjC,SAAiC,WAAA,eACjC,SAAiC,aAAA,eACjC,SAAiC,cAAA,eACjC,SAAiC,YAAA,eACjC,SACE,aAAA,eACA,YAAA,eAEF,SACE,WAAA,eACA,cAAA,eAXF,QAAiC,QAAA,YACjC,SAAiC,YAAA,YACjC,SAAiC,cAAA,YACjC,SAAiC,eAAA,YACjC,SAAiC,aAAA,YACjC,SACE,cAAA,YACA,aAAA,YAEF,SACE,YAAA,YACA,eAAA,YAXF,QAAiC,QAAA,iBACjC,SAAiC,YAAA,iBACjC,SAAiC,cAAA,iBACjC,SAAiC,eAAA,iBACjC,SAAiC,aAAA,iBACjC,SACE,cAAA,iBACA,aAAA,iBAEF,SACE,YAAA,iBACA,eAAA,iBAXF,QAAiC,QAAA,gBACjC,SAAiC,YAAA,gBACjC,SAAiC,cAAA,gBACjC,SAAiC,eAAA,gBACjC,SAAiC,aAAA,gBACjC,SACE,cAAA,gBACA,aAAA,gBAEF,SACE,YAAA,gBACA,eAAA,gBAXF,QAAiC,QAAA,eACjC,SAAiC,YAAA,eACjC,SAAiC,cAAA,eACjC,SAAiC,eAAA,eACjC,SAAiC,aAAA,eACjC,SACE,cAAA,eACA,aAAA,eAEF,SACE,YAAA,eACA,eAAA,eAXF,QAAiC,QAAA,iBACjC,SAAiC,YAAA,iBACjC,SAAiC,cAAA,iBACjC,SAAiC,eAAA,iBACjC,SAAiC,aAAA,iBACjC,SACE,cAAA,iBACA,aAAA,iBAEF,SACE,YAAA,iBACA,eAAA,iBAXF,QAAiC,QAAA,eACjC,SAAiC,YAAA,eACjC,SAAiC,cAAA,eACjC,SAAiC,eAAA,eACjC,SAAiC,aAAA,eACjC,SACE,cAAA,eACA,aAAA,eAEF,SACE,YAAA,eACA,eAAA,eAMN,WAAoB,OAAA,eACpB,YAAoB,WAAA,eACpB,YAAoB,aAAA,eACpB,YAAoB,cAAA,eACpB,YAAoB,YAAA,eACpB,YACE,aAAA,eACA,YAAA,eAEF,YACE,WAAA,eACA,cAAA,gBC/BN,cAAiB,WAAA,kBACjB,aAAiB,YAAA,iBACjB,eCJE,SAAA,OACA,cAAA,SACA,YAAA,ODUE,WAAwB,WAAA,eACxB,YAAwB,WAAA,gBACxB,aAAwB,WAAA,iBpDsCxB,yBoDxCA,cAAwB,WAAA,eACxB,eAAwB,WAAA,gBACxB,gBAAwB,WAAA,kBpDsCxB,yBoDxCA,cAAwB,WAAA,eACxB,eAAwB,WAAA,gBACxB,gBAAwB,WAAA,kBpDsCxB,yBoDxCA,cAAwB,WAAA,eACxB,eAAwB,WAAA,gBACxB,gBAAwB,WAAA,kBpDsCxB,0BoDxCA,cAAwB,WAAA,eACxB,eAAwB,WAAA,gBACxB,gBAAwB,WAAA,kBAM5B,gBAAmB,eAAA,oBACnB,gBAAmB,eAAA,oBACnB,iBAAmB,eAAA,qBAInB,oBAAsB,YAAA,IACtB,kBAAsB,YAAA,IACtB,aAAsB,WAAA,OAItB,YACE,MAAA,eElCA,YACE,MAAA,kBhEkBA,mBAAA,mBgEdE,MAAA,kBALJ,cACE,MAAA,kBhEkBA,qBAAA,qBgEdE,MAAA,kBALJ,cACE,MAAA,kBhEkBA,qBAAA,qBgEdE,MAAA,kBALJ,WACE,MAAA,kBhEkBA,kBAAA,kBgEdE,MAAA,kBALJ,cACE,MAAA,kBhEkBA,qBAAA,qBgEdE,MAAA,kBALJ,aACE,MAAA,kBhEkBA,oBAAA,oBgEdE,MAAA,kBALJ,gBACE,MAAA,kBhEkBA,uBAAA,uBgEdE,MAAA,kBFkDN,WGxDE,KAAA,CAAA,CAAA,EAAA,EACA,MAAA,YACA,YAAA,KACA,iBAAA,YACA,OAAA,ECFF,SCDE,WAAA,kBDKF,WCLE,WAAA"} \ No newline at end of file
diff --git a/library/bootstrap/fonts/glyphicons-halflings-regular.eot b/library/bootstrap/fonts/glyphicons-halflings-regular.eot
deleted file mode 100644
index b93a4953f..000000000
--- a/library/bootstrap/fonts/glyphicons-halflings-regular.eot
+++ /dev/null
Binary files differ
diff --git a/library/bootstrap/fonts/glyphicons-halflings-regular.svg b/library/bootstrap/fonts/glyphicons-halflings-regular.svg
deleted file mode 100644
index 94fb5490a..000000000
--- a/library/bootstrap/fonts/glyphicons-halflings-regular.svg
+++ /dev/null
@@ -1,288 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
-<svg xmlns="http://www.w3.org/2000/svg">
-<metadata></metadata>
-<defs>
-<font id="glyphicons_halflingsregular" horiz-adv-x="1200" >
-<font-face units-per-em="1200" ascent="960" descent="-240" />
-<missing-glyph horiz-adv-x="500" />
-<glyph horiz-adv-x="0" />
-<glyph horiz-adv-x="400" />
-<glyph unicode=" " />
-<glyph unicode="*" d="M600 1100q15 0 34 -1.5t30 -3.5l11 -1q10 -2 17.5 -10.5t7.5 -18.5v-224l158 158q7 7 18 8t19 -6l106 -106q7 -8 6 -19t-8 -18l-158 -158h224q10 0 18.5 -7.5t10.5 -17.5q6 -41 6 -75q0 -15 -1.5 -34t-3.5 -30l-1 -11q-2 -10 -10.5 -17.5t-18.5 -7.5h-224l158 -158 q7 -7 8 -18t-6 -19l-106 -106q-8 -7 -19 -6t-18 8l-158 158v-224q0 -10 -7.5 -18.5t-17.5 -10.5q-41 -6 -75 -6q-15 0 -34 1.5t-30 3.5l-11 1q-10 2 -17.5 10.5t-7.5 18.5v224l-158 -158q-7 -7 -18 -8t-19 6l-106 106q-7 8 -6 19t8 18l158 158h-224q-10 0 -18.5 7.5 t-10.5 17.5q-6 41 -6 75q0 15 1.5 34t3.5 30l1 11q2 10 10.5 17.5t18.5 7.5h224l-158 158q-7 7 -8 18t6 19l106 106q8 7 19 6t18 -8l158 -158v224q0 10 7.5 18.5t17.5 10.5q41 6 75 6z" />
-<glyph unicode="+" d="M450 1100h200q21 0 35.5 -14.5t14.5 -35.5v-350h350q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-350v-350q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v350h-350q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5 h350v350q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xa0;" />
-<glyph unicode="&#xa5;" d="M825 1100h250q10 0 12.5 -5t-5.5 -13l-364 -364q-6 -6 -11 -18h268q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-100h275q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-174q0 -11 -7.5 -18.5t-18.5 -7.5h-148q-11 0 -18.5 7.5t-7.5 18.5v174 h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h125v100h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h118q-5 12 -11 18l-364 364q-8 8 -5.5 13t12.5 5h250q25 0 43 -18l164 -164q8 -8 18 -8t18 8l164 164q18 18 43 18z" />
-<glyph unicode="&#x2000;" horiz-adv-x="650" />
-<glyph unicode="&#x2001;" horiz-adv-x="1300" />
-<glyph unicode="&#x2002;" horiz-adv-x="650" />
-<glyph unicode="&#x2003;" horiz-adv-x="1300" />
-<glyph unicode="&#x2004;" horiz-adv-x="433" />
-<glyph unicode="&#x2005;" horiz-adv-x="325" />
-<glyph unicode="&#x2006;" horiz-adv-x="216" />
-<glyph unicode="&#x2007;" horiz-adv-x="216" />
-<glyph unicode="&#x2008;" horiz-adv-x="162" />
-<glyph unicode="&#x2009;" horiz-adv-x="260" />
-<glyph unicode="&#x200a;" horiz-adv-x="72" />
-<glyph unicode="&#x202f;" horiz-adv-x="260" />
-<glyph unicode="&#x205f;" horiz-adv-x="325" />
-<glyph unicode="&#x20ac;" d="M744 1198q242 0 354 -189q60 -104 66 -209h-181q0 45 -17.5 82.5t-43.5 61.5t-58 40.5t-60.5 24t-51.5 7.5q-19 0 -40.5 -5.5t-49.5 -20.5t-53 -38t-49 -62.5t-39 -89.5h379l-100 -100h-300q-6 -50 -6 -100h406l-100 -100h-300q9 -74 33 -132t52.5 -91t61.5 -54.5t59 -29 t47 -7.5q22 0 50.5 7.5t60.5 24.5t58 41t43.5 61t17.5 80h174q-30 -171 -128 -278q-107 -117 -274 -117q-206 0 -324 158q-36 48 -69 133t-45 204h-217l100 100h112q1 47 6 100h-218l100 100h134q20 87 51 153.5t62 103.5q117 141 297 141z" />
-<glyph unicode="&#x20bd;" d="M428 1200h350q67 0 120 -13t86 -31t57 -49.5t35 -56.5t17 -64.5t6.5 -60.5t0.5 -57v-16.5v-16.5q0 -36 -0.5 -57t-6.5 -61t-17 -65t-35 -57t-57 -50.5t-86 -31.5t-120 -13h-178l-2 -100h288q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-138v-175q0 -11 -5.5 -18 t-15.5 -7h-149q-10 0 -17.5 7.5t-7.5 17.5v175h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v100h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v475q0 10 7.5 17.5t17.5 7.5zM600 1000v-300h203q64 0 86.5 33t22.5 119q0 84 -22.5 116t-86.5 32h-203z" />
-<glyph unicode="&#x2212;" d="M250 700h800q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#x231b;" d="M1000 1200v-150q0 -21 -14.5 -35.5t-35.5 -14.5h-50v-100q0 -91 -49.5 -165.5t-130.5 -109.5q81 -35 130.5 -109.5t49.5 -165.5v-150h50q21 0 35.5 -14.5t14.5 -35.5v-150h-800v150q0 21 14.5 35.5t35.5 14.5h50v150q0 91 49.5 165.5t130.5 109.5q-81 35 -130.5 109.5 t-49.5 165.5v100h-50q-21 0 -35.5 14.5t-14.5 35.5v150h800zM400 1000v-100q0 -60 32.5 -109.5t87.5 -73.5q28 -12 44 -37t16 -55t-16 -55t-44 -37q-55 -24 -87.5 -73.5t-32.5 -109.5v-150h400v150q0 60 -32.5 109.5t-87.5 73.5q-28 12 -44 37t-16 55t16 55t44 37 q55 24 87.5 73.5t32.5 109.5v100h-400z" />
-<glyph unicode="&#x25fc;" horiz-adv-x="500" d="M0 0z" />
-<glyph unicode="&#x2601;" d="M503 1089q110 0 200.5 -59.5t134.5 -156.5q44 14 90 14q120 0 205 -86.5t85 -206.5q0 -121 -85 -207.5t-205 -86.5h-750q-79 0 -135.5 57t-56.5 137q0 69 42.5 122.5t108.5 67.5q-2 12 -2 37q0 153 108 260.5t260 107.5z" />
-<glyph unicode="&#x26fa;" d="M774 1193.5q16 -9.5 20.5 -27t-5.5 -33.5l-136 -187l467 -746h30q20 0 35 -18.5t15 -39.5v-42h-1200v42q0 21 15 39.5t35 18.5h30l468 746l-135 183q-10 16 -5.5 34t20.5 28t34 5.5t28 -20.5l111 -148l112 150q9 16 27 20.5t34 -5zM600 200h377l-182 112l-195 534v-646z " />
-<glyph unicode="&#x2709;" d="M25 1100h1150q10 0 12.5 -5t-5.5 -13l-564 -567q-8 -8 -18 -8t-18 8l-564 567q-8 8 -5.5 13t12.5 5zM18 882l264 -264q8 -8 8 -18t-8 -18l-264 -264q-8 -8 -13 -5.5t-5 12.5v550q0 10 5 12.5t13 -5.5zM918 618l264 264q8 8 13 5.5t5 -12.5v-550q0 -10 -5 -12.5t-13 5.5 l-264 264q-8 8 -8 18t8 18zM818 482l364 -364q8 -8 5.5 -13t-12.5 -5h-1150q-10 0 -12.5 5t5.5 13l364 364q8 8 18 8t18 -8l164 -164q8 -8 18 -8t18 8l164 164q8 8 18 8t18 -8z" />
-<glyph unicode="&#x270f;" d="M1011 1210q19 0 33 -13l153 -153q13 -14 13 -33t-13 -33l-99 -92l-214 214l95 96q13 14 32 14zM1013 800l-615 -614l-214 214l614 614zM317 96l-333 -112l110 335z" />
-<glyph unicode="&#xe001;" d="M700 650v-550h250q21 0 35.5 -14.5t14.5 -35.5v-50h-800v50q0 21 14.5 35.5t35.5 14.5h250v550l-500 550h1200z" />
-<glyph unicode="&#xe002;" d="M368 1017l645 163q39 15 63 0t24 -49v-831q0 -55 -41.5 -95.5t-111.5 -63.5q-79 -25 -147 -4.5t-86 75t25.5 111.5t122.5 82q72 24 138 8v521l-600 -155v-606q0 -42 -44 -90t-109 -69q-79 -26 -147 -5.5t-86 75.5t25.5 111.5t122.5 82.5q72 24 138 7v639q0 38 14.5 59 t53.5 34z" />
-<glyph unicode="&#xe003;" d="M500 1191q100 0 191 -39t156.5 -104.5t104.5 -156.5t39 -191l-1 -2l1 -5q0 -141 -78 -262l275 -274q23 -26 22.5 -44.5t-22.5 -42.5l-59 -58q-26 -20 -46.5 -20t-39.5 20l-275 274q-119 -77 -261 -77l-5 1l-2 -1q-100 0 -191 39t-156.5 104.5t-104.5 156.5t-39 191 t39 191t104.5 156.5t156.5 104.5t191 39zM500 1022q-88 0 -162 -43t-117 -117t-43 -162t43 -162t117 -117t162 -43t162 43t117 117t43 162t-43 162t-117 117t-162 43z" />
-<glyph unicode="&#xe005;" d="M649 949q48 68 109.5 104t121.5 38.5t118.5 -20t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-150 152.5t-126.5 127.5t-93.5 124.5t-33.5 117.5q0 64 28 123t73 100.5t104 64t119 20 t120.5 -38.5t104.5 -104z" />
-<glyph unicode="&#xe006;" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429z" />
-<glyph unicode="&#xe007;" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429zM477 700h-240l197 -142l-74 -226 l193 139l195 -140l-74 229l192 140h-234l-78 211z" />
-<glyph unicode="&#xe008;" d="M600 1200q124 0 212 -88t88 -212v-250q0 -46 -31 -98t-69 -52v-75q0 -10 6 -21.5t15 -17.5l358 -230q9 -5 15 -16.5t6 -21.5v-93q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v93q0 10 6 21.5t15 16.5l358 230q9 6 15 17.5t6 21.5v75q-38 0 -69 52 t-31 98v250q0 124 88 212t212 88z" />
-<glyph unicode="&#xe009;" d="M25 1100h1150q10 0 17.5 -7.5t7.5 -17.5v-1050q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v1050q0 10 7.5 17.5t17.5 7.5zM100 1000v-100h100v100h-100zM875 1000h-550q-10 0 -17.5 -7.5t-7.5 -17.5v-350q0 -10 7.5 -17.5t17.5 -7.5h550 q10 0 17.5 7.5t7.5 17.5v350q0 10 -7.5 17.5t-17.5 7.5zM1000 1000v-100h100v100h-100zM100 800v-100h100v100h-100zM1000 800v-100h100v100h-100zM100 600v-100h100v100h-100zM1000 600v-100h100v100h-100zM875 500h-550q-10 0 -17.5 -7.5t-7.5 -17.5v-350q0 -10 7.5 -17.5 t17.5 -7.5h550q10 0 17.5 7.5t7.5 17.5v350q0 10 -7.5 17.5t-17.5 7.5zM100 400v-100h100v100h-100zM1000 400v-100h100v100h-100zM100 200v-100h100v100h-100zM1000 200v-100h100v100h-100z" />
-<glyph unicode="&#xe010;" d="M50 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM650 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5zM50 500h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM650 500h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe011;" d="M50 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5zM850 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM850 700h200q21 0 35.5 -14.5t14.5 -35.5v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 300h200 q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM850 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5 t35.5 14.5z" />
-<glyph unicode="&#xe012;" d="M50 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 700h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 300h700q21 0 35.5 -14.5t14.5 -35.5v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe013;" d="M465 477l571 571q8 8 18 8t17 -8l177 -177q8 -7 8 -17t-8 -18l-783 -784q-7 -8 -17.5 -8t-17.5 8l-384 384q-8 8 -8 18t8 17l177 177q7 8 17 8t18 -8l171 -171q7 -7 18 -7t18 7z" />
-<glyph unicode="&#xe014;" d="M904 1083l178 -179q8 -8 8 -18.5t-8 -17.5l-267 -268l267 -268q8 -7 8 -17.5t-8 -18.5l-178 -178q-8 -8 -18.5 -8t-17.5 8l-268 267l-268 -267q-7 -8 -17.5 -8t-18.5 8l-178 178q-8 8 -8 18.5t8 17.5l267 268l-267 268q-8 7 -8 17.5t8 18.5l178 178q8 8 18.5 8t17.5 -8 l268 -267l268 268q7 7 17.5 7t18.5 -7z" />
-<glyph unicode="&#xe015;" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM425 900h150q10 0 17.5 -7.5t7.5 -17.5v-75h75q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5 t-17.5 -7.5h-75v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-75q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h75v75q0 10 7.5 17.5t17.5 7.5z" />
-<glyph unicode="&#xe016;" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM325 800h350q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-350q-10 0 -17.5 7.5 t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
-<glyph unicode="&#xe017;" d="M550 1200h100q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM800 975v166q167 -62 272 -209.5t105 -331.5q0 -117 -45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5 t-184.5 123t-123 184.5t-45.5 224q0 184 105 331.5t272 209.5v-166q-103 -55 -165 -155t-62 -220q0 -116 57 -214.5t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5q0 120 -62 220t-165 155z" />
-<glyph unicode="&#xe018;" d="M1025 1200h150q10 0 17.5 -7.5t7.5 -17.5v-1150q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v1150q0 10 7.5 17.5t17.5 7.5zM725 800h150q10 0 17.5 -7.5t7.5 -17.5v-750q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v750 q0 10 7.5 17.5t17.5 7.5zM425 500h150q10 0 17.5 -7.5t7.5 -17.5v-450q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v450q0 10 7.5 17.5t17.5 7.5zM125 300h150q10 0 17.5 -7.5t7.5 -17.5v-250q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5 v250q0 10 7.5 17.5t17.5 7.5z" />
-<glyph unicode="&#xe019;" d="M600 1174q33 0 74 -5l38 -152l5 -1q49 -14 94 -39l5 -2l134 80q61 -48 104 -105l-80 -134l3 -5q25 -44 39 -93l1 -6l152 -38q5 -43 5 -73q0 -34 -5 -74l-152 -38l-1 -6q-15 -49 -39 -93l-3 -5l80 -134q-48 -61 -104 -105l-134 81l-5 -3q-44 -25 -94 -39l-5 -2l-38 -151 q-43 -5 -74 -5q-33 0 -74 5l-38 151l-5 2q-49 14 -94 39l-5 3l-134 -81q-60 48 -104 105l80 134l-3 5q-25 45 -38 93l-2 6l-151 38q-6 42 -6 74q0 33 6 73l151 38l2 6q13 48 38 93l3 5l-80 134q47 61 105 105l133 -80l5 2q45 25 94 39l5 1l38 152q43 5 74 5zM600 815 q-89 0 -152 -63t-63 -151.5t63 -151.5t152 -63t152 63t63 151.5t-63 151.5t-152 63z" />
-<glyph unicode="&#xe020;" d="M500 1300h300q41 0 70.5 -29.5t29.5 -70.5v-100h275q10 0 17.5 -7.5t7.5 -17.5v-75h-1100v75q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5zM500 1200v-100h300v100h-300zM1100 900v-800q0 -41 -29.5 -70.5t-70.5 -29.5h-700q-41 0 -70.5 29.5t-29.5 70.5 v800h900zM300 800v-700h100v700h-100zM500 800v-700h100v700h-100zM700 800v-700h100v700h-100zM900 800v-700h100v700h-100z" />
-<glyph unicode="&#xe021;" d="M18 618l620 608q8 7 18.5 7t17.5 -7l608 -608q8 -8 5.5 -13t-12.5 -5h-175v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v375h-300v-375q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v575h-175q-10 0 -12.5 5t5.5 13z" />
-<glyph unicode="&#xe022;" d="M600 1200v-400q0 -41 29.5 -70.5t70.5 -29.5h300v-650q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v1100q0 21 14.5 35.5t35.5 14.5h450zM1000 800h-250q-21 0 -35.5 14.5t-14.5 35.5v250z" />
-<glyph unicode="&#xe023;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h50q10 0 17.5 -7.5t7.5 -17.5v-275h175q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5z" />
-<glyph unicode="&#xe024;" d="M1300 0h-538l-41 400h-242l-41 -400h-538l431 1200h209l-21 -300h162l-20 300h208zM515 800l-27 -300h224l-27 300h-170z" />
-<glyph unicode="&#xe025;" d="M550 1200h200q21 0 35.5 -14.5t14.5 -35.5v-450h191q20 0 25.5 -11.5t-7.5 -27.5l-327 -400q-13 -16 -32 -16t-32 16l-327 400q-13 16 -7.5 27.5t25.5 11.5h191v450q0 21 14.5 35.5t35.5 14.5zM1125 400h50q10 0 17.5 -7.5t7.5 -17.5v-350q0 -10 -7.5 -17.5t-17.5 -7.5 h-1050q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h50q10 0 17.5 -7.5t7.5 -17.5v-175h900v175q0 10 7.5 17.5t17.5 7.5z" />
-<glyph unicode="&#xe026;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h150q10 0 17.5 -7.5t7.5 -17.5v-275h137q21 0 26 -11.5t-8 -27.5l-223 -275q-13 -16 -32 -16t-32 16l-223 275q-13 16 -8 27.5t26 11.5h137v275q0 10 7.5 17.5t17.5 7.5z " />
-<glyph unicode="&#xe027;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM632 914l223 -275q13 -16 8 -27.5t-26 -11.5h-137v-275q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v275h-137q-21 0 -26 11.5t8 27.5l223 275q13 16 32 16 t32 -16z" />
-<glyph unicode="&#xe028;" d="M225 1200h750q10 0 19.5 -7t12.5 -17l186 -652q7 -24 7 -49v-425q0 -12 -4 -27t-9 -17q-12 -6 -37 -6h-1100q-12 0 -27 4t-17 8q-6 13 -6 38l1 425q0 25 7 49l185 652q3 10 12.5 17t19.5 7zM878 1000h-556q-10 0 -19 -7t-11 -18l-87 -450q-2 -11 4 -18t16 -7h150 q10 0 19.5 -7t11.5 -17l38 -152q2 -10 11.5 -17t19.5 -7h250q10 0 19.5 7t11.5 17l38 152q2 10 11.5 17t19.5 7h150q10 0 16 7t4 18l-87 450q-2 11 -11 18t-19 7z" />
-<glyph unicode="&#xe029;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM540 820l253 -190q17 -12 17 -30t-17 -30l-253 -190q-16 -12 -28 -6.5t-12 26.5v400q0 21 12 26.5t28 -6.5z" />
-<glyph unicode="&#xe030;" d="M947 1060l135 135q7 7 12.5 5t5.5 -13v-362q0 -10 -7.5 -17.5t-17.5 -7.5h-362q-11 0 -13 5.5t5 12.5l133 133q-109 76 -238 76q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5h150q0 -117 -45.5 -224 t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5q192 0 347 -117z" />
-<glyph unicode="&#xe031;" d="M947 1060l135 135q7 7 12.5 5t5.5 -13v-361q0 -11 -7.5 -18.5t-18.5 -7.5h-361q-11 0 -13 5.5t5 12.5l134 134q-110 75 -239 75q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5h-150q0 117 45.5 224t123 184.5t184.5 123t224 45.5q192 0 347 -117zM1027 600h150 q0 -117 -45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5q-192 0 -348 118l-134 -134q-7 -8 -12.5 -5.5t-5.5 12.5v360q0 11 7.5 18.5t18.5 7.5h360q10 0 12.5 -5.5t-5.5 -12.5l-133 -133q110 -76 240 -76q116 0 214.5 57t155.5 155.5t57 214.5z" />
-<glyph unicode="&#xe032;" d="M125 1200h1050q10 0 17.5 -7.5t7.5 -17.5v-1150q0 -10 -7.5 -17.5t-17.5 -7.5h-1050q-10 0 -17.5 7.5t-7.5 17.5v1150q0 10 7.5 17.5t17.5 7.5zM1075 1000h-850q-10 0 -17.5 -7.5t-7.5 -17.5v-850q0 -10 7.5 -17.5t17.5 -7.5h850q10 0 17.5 7.5t7.5 17.5v850 q0 10 -7.5 17.5t-17.5 7.5zM325 900h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 900h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 700h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 700h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 500h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 500h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 300h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 300h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5z" />
-<glyph unicode="&#xe033;" d="M900 800v200q0 83 -58.5 141.5t-141.5 58.5h-300q-82 0 -141 -59t-59 -141v-200h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h900q41 0 70.5 29.5t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5h-100zM400 800v150q0 21 15 35.5t35 14.5h200 q20 0 35 -14.5t15 -35.5v-150h-300z" />
-<glyph unicode="&#xe034;" d="M125 1100h50q10 0 17.5 -7.5t7.5 -17.5v-1075h-100v1075q0 10 7.5 17.5t17.5 7.5zM1075 1052q4 0 9 -2q16 -6 16 -23v-421q0 -6 -3 -12q-33 -59 -66.5 -99t-65.5 -58t-56.5 -24.5t-52.5 -6.5q-26 0 -57.5 6.5t-52.5 13.5t-60 21q-41 15 -63 22.5t-57.5 15t-65.5 7.5 q-85 0 -160 -57q-7 -5 -15 -5q-6 0 -11 3q-14 7 -14 22v438q22 55 82 98.5t119 46.5q23 2 43 0.5t43 -7t32.5 -8.5t38 -13t32.5 -11q41 -14 63.5 -21t57 -14t63.5 -7q103 0 183 87q7 8 18 8z" />
-<glyph unicode="&#xe035;" d="M600 1175q116 0 227 -49.5t192.5 -131t131 -192.5t49.5 -227v-300q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v300q0 127 -70.5 231.5t-184.5 161.5t-245 57t-245 -57t-184.5 -161.5t-70.5 -231.5v-300q0 -10 -7.5 -17.5t-17.5 -7.5h-50 q-10 0 -17.5 7.5t-7.5 17.5v300q0 116 49.5 227t131 192.5t192.5 131t227 49.5zM220 500h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460q0 8 6 14t14 6zM820 500h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460 q0 8 6 14t14 6z" />
-<glyph unicode="&#xe036;" d="M321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM900 668l120 120q7 7 17 7t17 -7l34 -34q7 -7 7 -17t-7 -17l-120 -120l120 -120q7 -7 7 -17 t-7 -17l-34 -34q-7 -7 -17 -7t-17 7l-120 119l-120 -119q-7 -7 -17 -7t-17 7l-34 34q-7 7 -7 17t7 17l119 120l-119 120q-7 7 -7 17t7 17l34 34q7 8 17 8t17 -8z" />
-<glyph unicode="&#xe037;" d="M321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM766 900h4q10 -1 16 -10q96 -129 96 -290q0 -154 -90 -281q-6 -9 -17 -10l-3 -1q-9 0 -16 6 l-29 23q-7 7 -8.5 16.5t4.5 17.5q72 103 72 229q0 132 -78 238q-6 8 -4.5 18t9.5 17l29 22q7 5 15 5z" />
-<glyph unicode="&#xe038;" d="M967 1004h3q11 -1 17 -10q135 -179 135 -396q0 -105 -34 -206.5t-98 -185.5q-7 -9 -17 -10h-3q-9 0 -16 6l-42 34q-8 6 -9 16t5 18q111 150 111 328q0 90 -29.5 176t-84.5 157q-6 9 -5 19t10 16l42 33q7 5 15 5zM321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5 t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM766 900h4q10 -1 16 -10q96 -129 96 -290q0 -154 -90 -281q-6 -9 -17 -10l-3 -1q-9 0 -16 6l-29 23q-7 7 -8.5 16.5t4.5 17.5q72 103 72 229q0 132 -78 238 q-6 8 -4.5 18.5t9.5 16.5l29 22q7 5 15 5z" />
-<glyph unicode="&#xe039;" d="M500 900h100v-100h-100v-100h-400v-100h-100v600h500v-300zM1200 700h-200v-100h200v-200h-300v300h-200v300h-100v200h600v-500zM100 1100v-300h300v300h-300zM800 1100v-300h300v300h-300zM300 900h-100v100h100v-100zM1000 900h-100v100h100v-100zM300 500h200v-500 h-500v500h200v100h100v-100zM800 300h200v-100h-100v-100h-200v100h-100v100h100v200h-200v100h300v-300zM100 400v-300h300v300h-300zM300 200h-100v100h100v-100zM1200 200h-100v100h100v-100zM700 0h-100v100h100v-100zM1200 0h-300v100h300v-100z" />
-<glyph unicode="&#xe040;" d="M100 200h-100v1000h100v-1000zM300 200h-100v1000h100v-1000zM700 200h-200v1000h200v-1000zM900 200h-100v1000h100v-1000zM1200 200h-200v1000h200v-1000zM400 0h-300v100h300v-100zM600 0h-100v91h100v-91zM800 0h-100v91h100v-91zM1100 0h-200v91h200v-91z" />
-<glyph unicode="&#xe041;" d="M500 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-682 682l1 475q0 10 7.5 17.5t17.5 7.5h474zM319.5 1024.5q-29.5 29.5 -71 29.5t-71 -29.5t-29.5 -71.5t29.5 -71.5t71 -29.5t71 29.5t29.5 71.5t-29.5 71.5z" />
-<glyph unicode="&#xe042;" d="M500 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-682 682l1 475q0 10 7.5 17.5t17.5 7.5h474zM800 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-56 56l424 426l-700 700h150zM319.5 1024.5q-29.5 29.5 -71 29.5t-71 -29.5 t-29.5 -71.5t29.5 -71.5t71 -29.5t71 29.5t29.5 71.5t-29.5 71.5z" />
-<glyph unicode="&#xe043;" d="M300 1200h825q75 0 75 -75v-900q0 -25 -18 -43l-64 -64q-8 -8 -13 -5.5t-5 12.5v950q0 10 -7.5 17.5t-17.5 7.5h-700q-25 0 -43 -18l-64 -64q-8 -8 -5.5 -13t12.5 -5h700q10 0 17.5 -7.5t7.5 -17.5v-950q0 -10 -7.5 -17.5t-17.5 -7.5h-850q-10 0 -17.5 7.5t-7.5 17.5v975 q0 25 18 43l139 139q18 18 43 18z" />
-<glyph unicode="&#xe044;" d="M250 1200h800q21 0 35.5 -14.5t14.5 -35.5v-1150l-450 444l-450 -445v1151q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe045;" d="M822 1200h-444q-11 0 -19 -7.5t-9 -17.5l-78 -301q-7 -24 7 -45l57 -108q6 -9 17.5 -15t21.5 -6h450q10 0 21.5 6t17.5 15l62 108q14 21 7 45l-83 301q-1 10 -9 17.5t-19 7.5zM1175 800h-150q-10 0 -21 -6.5t-15 -15.5l-78 -156q-4 -9 -15 -15.5t-21 -6.5h-550 q-10 0 -21 6.5t-15 15.5l-78 156q-4 9 -15 15.5t-21 6.5h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-650q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h750q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5 t7.5 17.5v650q0 10 -7.5 17.5t-17.5 7.5zM850 200h-500q-10 0 -19.5 -7t-11.5 -17l-38 -152q-2 -10 3.5 -17t15.5 -7h600q10 0 15.5 7t3.5 17l-38 152q-2 10 -11.5 17t-19.5 7z" />
-<glyph unicode="&#xe046;" d="M500 1100h200q56 0 102.5 -20.5t72.5 -50t44 -59t25 -50.5l6 -20h150q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5h150q2 8 6.5 21.5t24 48t45 61t72 48t102.5 21.5zM900 800v-100 h100v100h-100zM600 730q-95 0 -162.5 -67.5t-67.5 -162.5t67.5 -162.5t162.5 -67.5t162.5 67.5t67.5 162.5t-67.5 162.5t-162.5 67.5zM600 603q43 0 73 -30t30 -73t-30 -73t-73 -30t-73 30t-30 73t30 73t73 30z" />
-<glyph unicode="&#xe047;" d="M681 1199l385 -998q20 -50 60 -92q18 -19 36.5 -29.5t27.5 -11.5l10 -2v-66h-417v66q53 0 75 43.5t5 88.5l-82 222h-391q-58 -145 -92 -234q-11 -34 -6.5 -57t25.5 -37t46 -20t55 -6v-66h-365v66q56 24 84 52q12 12 25 30.5t20 31.5l7 13l399 1006h93zM416 521h340 l-162 457z" />
-<glyph unicode="&#xe048;" d="M753 641q5 -1 14.5 -4.5t36 -15.5t50.5 -26.5t53.5 -40t50.5 -54.5t35.5 -70t14.5 -87q0 -67 -27.5 -125.5t-71.5 -97.5t-98.5 -66.5t-108.5 -40.5t-102 -13h-500v89q41 7 70.5 32.5t29.5 65.5v827q0 24 -0.5 34t-3.5 24t-8.5 19.5t-17 13.5t-28 12.5t-42.5 11.5v71 l471 -1q57 0 115.5 -20.5t108 -57t80.5 -94t31 -124.5q0 -51 -15.5 -96.5t-38 -74.5t-45 -50.5t-38.5 -30.5zM400 700h139q78 0 130.5 48.5t52.5 122.5q0 41 -8.5 70.5t-29.5 55.5t-62.5 39.5t-103.5 13.5h-118v-350zM400 200h216q80 0 121 50.5t41 130.5q0 90 -62.5 154.5 t-156.5 64.5h-159v-400z" />
-<glyph unicode="&#xe049;" d="M877 1200l2 -57q-83 -19 -116 -45.5t-40 -66.5l-132 -839q-9 -49 13 -69t96 -26v-97h-500v97q186 16 200 98l173 832q3 17 3 30t-1.5 22.5t-9 17.5t-13.5 12.5t-21.5 10t-26 8.5t-33.5 10q-13 3 -19 5v57h425z" />
-<glyph unicode="&#xe050;" d="M1300 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-850q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v850h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM175 1000h-75v-800h75l-125 -167l-125 167h75v800h-75l125 167z" />
-<glyph unicode="&#xe051;" d="M1100 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-650q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v650h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM1167 50l-167 -125v75h-800v-75l-167 125l167 125v-75h800v75z" />
-<glyph unicode="&#xe052;" d="M50 1100h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 500h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe053;" d="M250 1100h700q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM250 500h700q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe054;" d="M500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000 q-21 0 -35.5 14.5t-14.5 35.5zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5zM0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100 q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5z" />
-<glyph unicode="&#xe055;" d="M50 1100h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 500h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe056;" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 1100h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 800h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 500h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 500h800q21 0 35.5 -14.5t14.5 -35.5v-100 q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 200h800 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe057;" d="M400 0h-100v1100h100v-1100zM550 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM550 800h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM267 550l-167 -125v75h-200v100h200v75zM550 500h300q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM550 200h600 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe058;" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM900 0h-100v1100h100v-1100zM50 800h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM1100 600h200v-100h-200v-75l-167 125l167 125v-75zM50 500h300q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h600 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe059;" d="M75 1000h750q31 0 53 -22t22 -53v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53v650q0 31 22 53t53 22zM1200 300l-300 300l300 300v-600z" />
-<glyph unicode="&#xe060;" d="M44 1100h1112q18 0 31 -13t13 -31v-1012q0 -18 -13 -31t-31 -13h-1112q-18 0 -31 13t-13 31v1012q0 18 13 31t31 13zM100 1000v-737l247 182l298 -131l-74 156l293 318l236 -288v500h-1000zM342 884q56 0 95 -39t39 -94.5t-39 -95t-95 -39.5t-95 39.5t-39 95t39 94.5 t95 39z" />
-<glyph unicode="&#xe062;" d="M648 1169q117 0 216 -60t156.5 -161t57.5 -218q0 -115 -70 -258q-69 -109 -158 -225.5t-143 -179.5l-54 -62q-9 8 -25.5 24.5t-63.5 67.5t-91 103t-98.5 128t-95.5 148q-60 132 -60 249q0 88 34 169.5t91.5 142t137 96.5t166.5 36zM652.5 974q-91.5 0 -156.5 -65 t-65 -157t65 -156.5t156.5 -64.5t156.5 64.5t65 156.5t-65 157t-156.5 65z" />
-<glyph unicode="&#xe063;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 173v854q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57z" />
-<glyph unicode="&#xe064;" d="M554 1295q21 -72 57.5 -143.5t76 -130t83 -118t82.5 -117t70 -116t49.5 -126t18.5 -136.5q0 -71 -25.5 -135t-68.5 -111t-99 -82t-118.5 -54t-125.5 -23q-84 5 -161.5 34t-139.5 78.5t-99 125t-37 164.5q0 69 18 136.5t49.5 126.5t69.5 116.5t81.5 117.5t83.5 119 t76.5 131t58.5 143zM344 710q-23 -33 -43.5 -70.5t-40.5 -102.5t-17 -123q1 -37 14.5 -69.5t30 -52t41 -37t38.5 -24.5t33 -15q21 -7 32 -1t13 22l6 34q2 10 -2.5 22t-13.5 19q-5 4 -14 12t-29.5 40.5t-32.5 73.5q-26 89 6 271q2 11 -6 11q-8 1 -15 -10z" />
-<glyph unicode="&#xe065;" d="M1000 1013l108 115q2 1 5 2t13 2t20.5 -1t25 -9.5t28.5 -21.5q22 -22 27 -43t0 -32l-6 -10l-108 -115zM350 1100h400q50 0 105 -13l-187 -187h-368q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v182l200 200v-332 q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5zM1009 803l-362 -362l-161 -50l55 170l355 355z" />
-<glyph unicode="&#xe066;" d="M350 1100h361q-164 -146 -216 -200h-195q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5l200 153v-103q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5z M824 1073l339 -301q8 -7 8 -17.5t-8 -17.5l-340 -306q-7 -6 -12.5 -4t-6.5 11v203q-26 1 -54.5 0t-78.5 -7.5t-92 -17.5t-86 -35t-70 -57q10 59 33 108t51.5 81.5t65 58.5t68.5 40.5t67 24.5t56 13.5t40 4.5v210q1 10 6.5 12.5t13.5 -4.5z" />
-<glyph unicode="&#xe067;" d="M350 1100h350q60 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69l200 200v-219q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5z M643 639l395 395q7 7 17.5 7t17.5 -7l101 -101q7 -7 7 -17.5t-7 -17.5l-531 -532q-7 -7 -17.5 -7t-17.5 7l-248 248q-7 7 -7 17.5t7 17.5l101 101q7 7 17.5 7t17.5 -7l111 -111q8 -7 18 -7t18 7z" />
-<glyph unicode="&#xe068;" d="M318 918l264 264q8 8 18 8t18 -8l260 -264q7 -8 4.5 -13t-12.5 -5h-170v-200h200v173q0 10 5 12t13 -5l264 -260q8 -7 8 -17.5t-8 -17.5l-264 -265q-8 -7 -13 -5t-5 12v173h-200v-200h170q10 0 12.5 -5t-4.5 -13l-260 -264q-8 -8 -18 -8t-18 8l-264 264q-8 8 -5.5 13 t12.5 5h175v200h-200v-173q0 -10 -5 -12t-13 5l-264 265q-8 7 -8 17.5t8 17.5l264 260q8 7 13 5t5 -12v-173h200v200h-175q-10 0 -12.5 5t5.5 13z" />
-<glyph unicode="&#xe069;" d="M250 1100h100q21 0 35.5 -14.5t14.5 -35.5v-438l464 453q15 14 25.5 10t10.5 -25v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe070;" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-438l464 453q15 14 25.5 10t10.5 -25v-438l464 453q15 14 25.5 10t10.5 -25v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5 t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe071;" d="M1200 1050v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -10.5 -25t-25.5 10l-492 480q-15 14 -15 35t15 35l492 480q15 14 25.5 10t10.5 -25v-438l464 453q15 14 25.5 10t10.5 -25z" />
-<glyph unicode="&#xe072;" d="M243 1074l814 -498q18 -11 18 -26t-18 -26l-814 -498q-18 -11 -30.5 -4t-12.5 28v1000q0 21 12.5 28t30.5 -4z" />
-<glyph unicode="&#xe073;" d="M250 1000h200q21 0 35.5 -14.5t14.5 -35.5v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5zM650 1000h200q21 0 35.5 -14.5t14.5 -35.5v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v800 q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe074;" d="M1100 950v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5z" />
-<glyph unicode="&#xe075;" d="M500 612v438q0 21 10.5 25t25.5 -10l492 -480q15 -14 15 -35t-15 -35l-492 -480q-15 -14 -25.5 -10t-10.5 25v438l-464 -453q-15 -14 -25.5 -10t-10.5 25v1000q0 21 10.5 25t25.5 -10z" />
-<glyph unicode="&#xe076;" d="M1048 1102l100 1q20 0 35 -14.5t15 -35.5l5 -1000q0 -21 -14.5 -35.5t-35.5 -14.5l-100 -1q-21 0 -35.5 14.5t-14.5 35.5l-2 437l-463 -454q-14 -15 -24.5 -10.5t-10.5 25.5l-2 437l-462 -455q-15 -14 -25.5 -9.5t-10.5 24.5l-5 1000q0 21 10.5 25.5t25.5 -10.5l466 -450 l-2 438q0 20 10.5 24.5t25.5 -9.5l466 -451l-2 438q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe077;" d="M850 1100h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-464 -453q-15 -14 -25.5 -10t-10.5 25v1000q0 21 10.5 25t25.5 -10l464 -453v438q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe078;" d="M686 1081l501 -540q15 -15 10.5 -26t-26.5 -11h-1042q-22 0 -26.5 11t10.5 26l501 540q15 15 36 15t36 -15zM150 400h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe079;" d="M885 900l-352 -353l352 -353l-197 -198l-552 552l552 550z" />
-<glyph unicode="&#xe080;" d="M1064 547l-551 -551l-198 198l353 353l-353 353l198 198z" />
-<glyph unicode="&#xe081;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM650 900h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-150h-150 q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5t35.5 -14.5h150v-150q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5v150h150q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5h-150v150q0 21 -14.5 35.5t-35.5 14.5z" />
-<glyph unicode="&#xe082;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM850 700h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5 t35.5 -14.5h500q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5z" />
-<glyph unicode="&#xe083;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM741.5 913q-12.5 0 -21.5 -9l-120 -120l-120 120q-9 9 -21.5 9 t-21.5 -9l-141 -141q-9 -9 -9 -21.5t9 -21.5l120 -120l-120 -120q-9 -9 -9 -21.5t9 -21.5l141 -141q9 -9 21.5 -9t21.5 9l120 120l120 -120q9 -9 21.5 -9t21.5 9l141 141q9 9 9 21.5t-9 21.5l-120 120l120 120q9 9 9 21.5t-9 21.5l-141 141q-9 9 -21.5 9z" />
-<glyph unicode="&#xe084;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM546 623l-84 85q-7 7 -17.5 7t-18.5 -7l-139 -139q-7 -8 -7 -18t7 -18 l242 -241q7 -8 17.5 -8t17.5 8l375 375q7 7 7 17.5t-7 18.5l-139 139q-7 7 -17.5 7t-17.5 -7z" />
-<glyph unicode="&#xe085;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM588 941q-29 0 -59 -5.5t-63 -20.5t-58 -38.5t-41.5 -63t-16.5 -89.5 q0 -25 20 -25h131q30 -5 35 11q6 20 20.5 28t45.5 8q20 0 31.5 -10.5t11.5 -28.5q0 -23 -7 -34t-26 -18q-1 0 -13.5 -4t-19.5 -7.5t-20 -10.5t-22 -17t-18.5 -24t-15.5 -35t-8 -46q-1 -8 5.5 -16.5t20.5 -8.5h173q7 0 22 8t35 28t37.5 48t29.5 74t12 100q0 47 -17 83 t-42.5 57t-59.5 34.5t-64 18t-59 4.5zM675 400h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5z" />
-<glyph unicode="&#xe086;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM675 1000h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5 t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5zM675 700h-250q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h75v-200h-75q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h350q10 0 17.5 7.5t7.5 17.5v50q0 10 -7.5 17.5 t-17.5 7.5h-75v275q0 10 -7.5 17.5t-17.5 7.5z" />
-<glyph unicode="&#xe087;" d="M525 1200h150q10 0 17.5 -7.5t7.5 -17.5v-194q103 -27 178.5 -102.5t102.5 -178.5h194q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-194q-27 -103 -102.5 -178.5t-178.5 -102.5v-194q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v194 q-103 27 -178.5 102.5t-102.5 178.5h-194q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h194q27 103 102.5 178.5t178.5 102.5v194q0 10 7.5 17.5t17.5 7.5zM700 893v-168q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v168q-68 -23 -119 -74 t-74 -119h168q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-168q23 -68 74 -119t119 -74v168q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-168q68 23 119 74t74 119h-168q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h168 q-23 68 -74 119t-119 74z" />
-<glyph unicode="&#xe088;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM759 823l64 -64q7 -7 7 -17.5t-7 -17.5l-124 -124l124 -124q7 -7 7 -17.5t-7 -17.5l-64 -64q-7 -7 -17.5 -7t-17.5 7l-124 124l-124 -124q-7 -7 -17.5 -7t-17.5 7l-64 64 q-7 7 -7 17.5t7 17.5l124 124l-124 124q-7 7 -7 17.5t7 17.5l64 64q7 7 17.5 7t17.5 -7l124 -124l124 124q7 7 17.5 7t17.5 -7z" />
-<glyph unicode="&#xe089;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM782 788l106 -106q7 -7 7 -17.5t-7 -17.5l-320 -321q-8 -7 -18 -7t-18 7l-202 203q-8 7 -8 17.5t8 17.5l106 106q7 8 17.5 8t17.5 -8l79 -79l197 197q7 7 17.5 7t17.5 -7z" />
-<glyph unicode="&#xe090;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5q0 -120 65 -225 l587 587q-105 65 -225 65zM965 819l-584 -584q104 -62 219 -62q116 0 214.5 57t155.5 155.5t57 214.5q0 115 -62 219z" />
-<glyph unicode="&#xe091;" d="M39 582l522 427q16 13 27.5 8t11.5 -26v-291h550q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-550v-291q0 -21 -11.5 -26t-27.5 8l-522 427q-16 13 -16 32t16 32z" />
-<glyph unicode="&#xe092;" d="M639 1009l522 -427q16 -13 16 -32t-16 -32l-522 -427q-16 -13 -27.5 -8t-11.5 26v291h-550q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h550v291q0 21 11.5 26t27.5 -8z" />
-<glyph unicode="&#xe093;" d="M682 1161l427 -522q13 -16 8 -27.5t-26 -11.5h-291v-550q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v550h-291q-21 0 -26 11.5t8 27.5l427 522q13 16 32 16t32 -16z" />
-<glyph unicode="&#xe094;" d="M550 1200h200q21 0 35.5 -14.5t14.5 -35.5v-550h291q21 0 26 -11.5t-8 -27.5l-427 -522q-13 -16 -32 -16t-32 16l-427 522q-13 16 -8 27.5t26 11.5h291v550q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe095;" d="M639 1109l522 -427q16 -13 16 -32t-16 -32l-522 -427q-16 -13 -27.5 -8t-11.5 26v291q-94 -2 -182 -20t-170.5 -52t-147 -92.5t-100.5 -135.5q5 105 27 193.5t67.5 167t113 135t167 91.5t225.5 42v262q0 21 11.5 26t27.5 -8z" />
-<glyph unicode="&#xe096;" d="M850 1200h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94l-249 -249q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l249 249l-94 94q-14 14 -10 24.5t25 10.5zM350 0h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l249 249 q8 7 18 7t18 -7l106 -106q7 -8 7 -18t-7 -18l-249 -249l94 -94q14 -14 10 -24.5t-25 -10.5z" />
-<glyph unicode="&#xe097;" d="M1014 1120l106 -106q7 -8 7 -18t-7 -18l-249 -249l94 -94q14 -14 10 -24.5t-25 -10.5h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l249 249q8 7 18 7t18 -7zM250 600h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94 l-249 -249q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l249 249l-94 94q-14 14 -10 24.5t25 10.5z" />
-<glyph unicode="&#xe101;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM704 900h-208q-20 0 -32 -14.5t-8 -34.5l58 -302q4 -20 21.5 -34.5 t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5zM675 400h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5z" />
-<glyph unicode="&#xe102;" d="M260 1200q9 0 19 -2t15 -4l5 -2q22 -10 44 -23l196 -118q21 -13 36 -24q29 -21 37 -12q11 13 49 35l196 118q22 13 45 23q17 7 38 7q23 0 47 -16.5t37 -33.5l13 -16q14 -21 18 -45l25 -123l8 -44q1 -9 8.5 -14.5t17.5 -5.5h61q10 0 17.5 -7.5t7.5 -17.5v-50 q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 -7.5t-7.5 -17.5v-175h-400v300h-200v-300h-400v175q0 10 -7.5 17.5t-17.5 7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5h61q11 0 18 3t7 8q0 4 9 52l25 128q5 25 19 45q2 3 5 7t13.5 15t21.5 19.5t26.5 15.5 t29.5 7zM915 1079l-166 -162q-7 -7 -5 -12t12 -5h219q10 0 15 7t2 17l-51 149q-3 10 -11 12t-15 -6zM463 917l-177 157q-8 7 -16 5t-11 -12l-51 -143q-3 -10 2 -17t15 -7h231q11 0 12.5 5t-5.5 12zM500 0h-375q-10 0 -17.5 7.5t-7.5 17.5v375h400v-400zM1100 400v-375 q0 -10 -7.5 -17.5t-17.5 -7.5h-375v400h400z" />
-<glyph unicode="&#xe103;" d="M1165 1190q8 3 21 -6.5t13 -17.5q-2 -178 -24.5 -323.5t-55.5 -245.5t-87 -174.5t-102.5 -118.5t-118 -68.5t-118.5 -33t-120 -4.5t-105 9.5t-90 16.5q-61 12 -78 11q-4 1 -12.5 0t-34 -14.5t-52.5 -40.5l-153 -153q-26 -24 -37 -14.5t-11 43.5q0 64 42 102q8 8 50.5 45 t66.5 58q19 17 35 47t13 61q-9 55 -10 102.5t7 111t37 130t78 129.5q39 51 80 88t89.5 63.5t94.5 45t113.5 36t129 31t157.5 37t182 47.5zM1116 1098q-8 9 -22.5 -3t-45.5 -50q-38 -47 -119 -103.5t-142 -89.5l-62 -33q-56 -30 -102 -57t-104 -68t-102.5 -80.5t-85.5 -91 t-64 -104.5q-24 -56 -31 -86t2 -32t31.5 17.5t55.5 59.5q25 30 94 75.5t125.5 77.5t147.5 81q70 37 118.5 69t102 79.5t99 111t86.5 148.5q22 50 24 60t-6 19z" />
-<glyph unicode="&#xe104;" d="M653 1231q-39 -67 -54.5 -131t-10.5 -114.5t24.5 -96.5t47.5 -80t63.5 -62.5t68.5 -46.5t65 -30q-4 7 -17.5 35t-18.5 39.5t-17 39.5t-17 43t-13 42t-9.5 44.5t-2 42t4 43t13.5 39t23 38.5q96 -42 165 -107.5t105 -138t52 -156t13 -159t-19 -149.5q-13 -55 -44 -106.5 t-68 -87t-78.5 -64.5t-72.5 -45t-53 -22q-72 -22 -127 -11q-31 6 -13 19q6 3 17 7q13 5 32.5 21t41 44t38.5 63.5t21.5 81.5t-6.5 94.5t-50 107t-104 115.5q10 -104 -0.5 -189t-37 -140.5t-65 -93t-84 -52t-93.5 -11t-95 24.5q-80 36 -131.5 114t-53.5 171q-2 23 0 49.5 t4.5 52.5t13.5 56t27.5 60t46 64.5t69.5 68.5q-8 -53 -5 -102.5t17.5 -90t34 -68.5t44.5 -39t49 -2q31 13 38.5 36t-4.5 55t-29 64.5t-36 75t-26 75.5q-15 85 2 161.5t53.5 128.5t85.5 92.5t93.5 61t81.5 25.5z" />
-<glyph unicode="&#xe105;" d="M600 1094q82 0 160.5 -22.5t140 -59t116.5 -82.5t94.5 -95t68 -95t42.5 -82.5t14 -57.5t-14 -57.5t-43 -82.5t-68.5 -95t-94.5 -95t-116.5 -82.5t-140 -59t-159.5 -22.5t-159.5 22.5t-140 59t-116.5 82.5t-94.5 95t-68.5 95t-43 82.5t-14 57.5t14 57.5t42.5 82.5t68 95 t94.5 95t116.5 82.5t140 59t160.5 22.5zM888 829q-15 15 -18 12t5 -22q25 -57 25 -119q0 -124 -88 -212t-212 -88t-212 88t-88 212q0 59 23 114q8 19 4.5 22t-17.5 -12q-70 -69 -160 -184q-13 -16 -15 -40.5t9 -42.5q22 -36 47 -71t70 -82t92.5 -81t113 -58.5t133.5 -24.5 t133.5 24t113 58.5t92.5 81.5t70 81.5t47 70.5q11 18 9 42.5t-14 41.5q-90 117 -163 189zM448 727l-35 -36q-15 -15 -19.5 -38.5t4.5 -41.5q37 -68 93 -116q16 -13 38.5 -11t36.5 17l35 34q14 15 12.5 33.5t-16.5 33.5q-44 44 -89 117q-11 18 -28 20t-32 -12z" />
-<glyph unicode="&#xe106;" d="M592 0h-148l31 120q-91 20 -175.5 68.5t-143.5 106.5t-103.5 119t-66.5 110t-22 76q0 21 14 57.5t42.5 82.5t68 95t94.5 95t116.5 82.5t140 59t160.5 22.5q61 0 126 -15l32 121h148zM944 770l47 181q108 -85 176.5 -192t68.5 -159q0 -26 -19.5 -71t-59.5 -102t-93 -112 t-129 -104.5t-158 -75.5l46 173q77 49 136 117t97 131q11 18 9 42.5t-14 41.5q-54 70 -107 130zM310 824q-70 -69 -160 -184q-13 -16 -15 -40.5t9 -42.5q18 -30 39 -60t57 -70.5t74 -73t90 -61t105 -41.5l41 154q-107 18 -178.5 101.5t-71.5 193.5q0 59 23 114q8 19 4.5 22 t-17.5 -12zM448 727l-35 -36q-15 -15 -19.5 -38.5t4.5 -41.5q37 -68 93 -116q16 -13 38.5 -11t36.5 17l12 11l22 86l-3 4q-44 44 -89 117q-11 18 -28 20t-32 -12z" />
-<glyph unicode="&#xe107;" d="M-90 100l642 1066q20 31 48 28.5t48 -35.5l642 -1056q21 -32 7.5 -67.5t-50.5 -35.5h-1294q-37 0 -50.5 34t7.5 66zM155 200h345v75q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-75h345l-445 723zM496 700h208q20 0 32 -14.5t8 -34.5l-58 -252 q-4 -20 -21.5 -34.5t-37.5 -14.5h-54q-20 0 -37.5 14.5t-21.5 34.5l-58 252q-4 20 8 34.5t32 14.5z" />
-<glyph unicode="&#xe108;" d="M650 1200q62 0 106 -44t44 -106v-339l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -93 100 -113v-64q0 -21 -13 -29t-32 1l-205 128l-205 -128q-19 -9 -32 -1t-13 29v64q0 20 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5v41 q0 20 11 44.5t26 38.5l363 325v339q0 62 44 106t106 44z" />
-<glyph unicode="&#xe109;" d="M850 1200h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-150h-1100v150q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-50h500v50q0 21 14.5 35.5t35.5 14.5zM1100 800v-750q0 -21 -14.5 -35.5 t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v750h1100zM100 600v-100h100v100h-100zM300 600v-100h100v100h-100zM500 600v-100h100v100h-100zM700 600v-100h100v100h-100zM900 600v-100h100v100h-100zM100 400v-100h100v100h-100zM300 400v-100h100v100h-100zM500 400 v-100h100v100h-100zM700 400v-100h100v100h-100zM900 400v-100h100v100h-100zM100 200v-100h100v100h-100zM300 200v-100h100v100h-100zM500 200v-100h100v100h-100zM700 200v-100h100v100h-100zM900 200v-100h100v100h-100z" />
-<glyph unicode="&#xe110;" d="M1135 1165l249 -230q15 -14 15 -35t-15 -35l-249 -230q-14 -14 -24.5 -10t-10.5 25v150h-159l-600 -600h-291q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h209l600 600h241v150q0 21 10.5 25t24.5 -10zM522 819l-141 -141l-122 122h-209q-21 0 -35.5 14.5 t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h291zM1135 565l249 -230q15 -14 15 -35t-15 -35l-249 -230q-14 -14 -24.5 -10t-10.5 25v150h-241l-181 181l141 141l122 -122h159v150q0 21 10.5 25t24.5 -10z" />
-<glyph unicode="&#xe111;" d="M100 1100h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5z" />
-<glyph unicode="&#xe112;" d="M150 1200h200q21 0 35.5 -14.5t14.5 -35.5v-250h-300v250q0 21 14.5 35.5t35.5 14.5zM850 1200h200q21 0 35.5 -14.5t14.5 -35.5v-250h-300v250q0 21 14.5 35.5t35.5 14.5zM1100 800v-300q0 -41 -3 -77.5t-15 -89.5t-32 -96t-58 -89t-89 -77t-129 -51t-174 -20t-174 20 t-129 51t-89 77t-58 89t-32 96t-15 89.5t-3 77.5v300h300v-250v-27v-42.5t1.5 -41t5 -38t10 -35t16.5 -30t25.5 -24.5t35 -19t46.5 -12t60 -4t60 4.5t46.5 12.5t35 19.5t25 25.5t17 30.5t10 35t5 38t2 40.5t-0.5 42v25v250h300z" />
-<glyph unicode="&#xe113;" d="M1100 411l-198 -199l-353 353l-353 -353l-197 199l551 551z" />
-<glyph unicode="&#xe114;" d="M1101 789l-550 -551l-551 551l198 199l353 -353l353 353z" />
-<glyph unicode="&#xe115;" d="M404 1000h746q21 0 35.5 -14.5t14.5 -35.5v-551h150q21 0 25 -10.5t-10 -24.5l-230 -249q-14 -15 -35 -15t-35 15l-230 249q-14 14 -10 24.5t25 10.5h150v401h-381zM135 984l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-400h385l215 -200h-750q-21 0 -35.5 14.5 t-14.5 35.5v550h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
-<glyph unicode="&#xe116;" d="M56 1200h94q17 0 31 -11t18 -27l38 -162h896q24 0 39 -18.5t10 -42.5l-100 -475q-5 -21 -27 -42.5t-55 -21.5h-633l48 -200h535q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-50q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v50h-300v-50 q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v50h-31q-18 0 -32.5 10t-20.5 19l-5 10l-201 961h-54q-20 0 -35 14.5t-15 35.5t15 35.5t35 14.5z" />
-<glyph unicode="&#xe117;" d="M1200 1000v-100h-1200v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500zM0 800h1200v-800h-1200v800z" />
-<glyph unicode="&#xe118;" d="M200 800l-200 -400v600h200q0 41 29.5 70.5t70.5 29.5h300q42 0 71 -29.5t29 -70.5h500v-200h-1000zM1500 700l-300 -700h-1200l300 700h1200z" />
-<glyph unicode="&#xe119;" d="M635 1184l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-601h150q21 0 25 -10.5t-10 -24.5l-230 -249q-14 -15 -35 -15t-35 15l-230 249q-14 14 -10 24.5t25 10.5h150v601h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
-<glyph unicode="&#xe120;" d="M936 864l249 -229q14 -15 14 -35.5t-14 -35.5l-249 -229q-15 -15 -25.5 -10.5t-10.5 24.5v151h-600v-151q0 -20 -10.5 -24.5t-25.5 10.5l-249 229q-14 15 -14 35.5t14 35.5l249 229q15 15 25.5 10.5t10.5 -25.5v-149h600v149q0 21 10.5 25.5t25.5 -10.5z" />
-<glyph unicode="&#xe121;" d="M1169 400l-172 732q-5 23 -23 45.5t-38 22.5h-672q-20 0 -38 -20t-23 -41l-172 -739h1138zM1100 300h-1000q-41 0 -70.5 -29.5t-29.5 -70.5v-100q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5v100q0 41 -29.5 70.5t-70.5 29.5zM800 100v100h100v-100h-100 zM1000 100v100h100v-100h-100z" />
-<glyph unicode="&#xe122;" d="M1150 1100q21 0 35.5 -14.5t14.5 -35.5v-850q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v850q0 21 14.5 35.5t35.5 14.5zM1000 200l-675 200h-38l47 -276q3 -16 -5.5 -20t-29.5 -4h-7h-84q-20 0 -34.5 14t-18.5 35q-55 337 -55 351v250v6q0 16 1 23.5t6.5 14 t17.5 6.5h200l675 250v-850zM0 750v-250q-4 0 -11 0.5t-24 6t-30 15t-24 30t-11 48.5v50q0 26 10.5 46t25 30t29 16t25.5 7z" />
-<glyph unicode="&#xe123;" d="M553 1200h94q20 0 29 -10.5t3 -29.5l-18 -37q83 -19 144 -82.5t76 -140.5l63 -327l118 -173h17q19 0 33 -14.5t14 -35t-13 -40.5t-31 -27q-8 -4 -23 -9.5t-65 -19.5t-103 -25t-132.5 -20t-158.5 -9q-57 0 -115 5t-104 12t-88.5 15.5t-73.5 17.5t-54.5 16t-35.5 12l-11 4 q-18 8 -31 28t-13 40.5t14 35t33 14.5h17l118 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3.5 32t28.5 13zM498 110q50 -6 102 -6q53 0 102 6q-12 -49 -39.5 -79.5t-62.5 -30.5t-63 30.5t-39 79.5z" />
-<glyph unicode="&#xe124;" d="M800 946l224 78l-78 -224l234 -45l-180 -155l180 -155l-234 -45l78 -224l-224 78l-45 -234l-155 180l-155 -180l-45 234l-224 -78l78 224l-234 45l180 155l-180 155l234 45l-78 224l224 -78l45 234l155 -180l155 180z" />
-<glyph unicode="&#xe125;" d="M650 1200h50q40 0 70 -40.5t30 -84.5v-150l-28 -125h328q40 0 70 -40.5t30 -84.5v-100q0 -45 -29 -74l-238 -344q-16 -24 -38 -40.5t-45 -16.5h-250q-7 0 -42 25t-66 50l-31 25h-61q-45 0 -72.5 18t-27.5 57v400q0 36 20 63l145 196l96 198q13 28 37.5 48t51.5 20z M650 1100l-100 -212l-150 -213v-375h100l136 -100h214l250 375v125h-450l50 225v175h-50zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe126;" d="M600 1100h250q23 0 45 -16.5t38 -40.5l238 -344q29 -29 29 -74v-100q0 -44 -30 -84.5t-70 -40.5h-328q28 -118 28 -125v-150q0 -44 -30 -84.5t-70 -40.5h-50q-27 0 -51.5 20t-37.5 48l-96 198l-145 196q-20 27 -20 63v400q0 39 27.5 57t72.5 18h61q124 100 139 100z M50 1000h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5zM636 1000l-136 -100h-100v-375l150 -213l100 -212h50v175l-50 225h450v125l-250 375h-214z" />
-<glyph unicode="&#xe127;" d="M356 873l363 230q31 16 53 -6l110 -112q13 -13 13.5 -32t-11.5 -34l-84 -121h302q84 0 138 -38t54 -110t-55 -111t-139 -39h-106l-131 -339q-6 -21 -19.5 -41t-28.5 -20h-342q-7 0 -90 81t-83 94v525q0 17 14 35.5t28 28.5zM400 792v-503l100 -89h293l131 339 q6 21 19.5 41t28.5 20h203q21 0 30.5 25t0.5 50t-31 25h-456h-7h-6h-5.5t-6 0.5t-5 1.5t-5 2t-4 2.5t-4 4t-2.5 4.5q-12 25 5 47l146 183l-86 83zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500 q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe128;" d="M475 1103l366 -230q2 -1 6 -3.5t14 -10.5t18 -16.5t14.5 -20t6.5 -22.5v-525q0 -13 -86 -94t-93 -81h-342q-15 0 -28.5 20t-19.5 41l-131 339h-106q-85 0 -139.5 39t-54.5 111t54 110t138 38h302l-85 121q-11 15 -10.5 34t13.5 32l110 112q22 22 53 6zM370 945l146 -183 q17 -22 5 -47q-2 -2 -3.5 -4.5t-4 -4t-4 -2.5t-5 -2t-5 -1.5t-6 -0.5h-6h-6.5h-6h-475v-100h221q15 0 29 -20t20 -41l130 -339h294l106 89v503l-342 236zM1050 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5 v500q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe129;" d="M550 1294q72 0 111 -55t39 -139v-106l339 -131q21 -6 41 -19.5t20 -28.5v-342q0 -7 -81 -90t-94 -83h-525q-17 0 -35.5 14t-28.5 28l-9 14l-230 363q-16 31 6 53l112 110q13 13 32 13.5t34 -11.5l121 -84v302q0 84 38 138t110 54zM600 972v203q0 21 -25 30.5t-50 0.5 t-25 -31v-456v-7v-6v-5.5t-0.5 -6t-1.5 -5t-2 -5t-2.5 -4t-4 -4t-4.5 -2.5q-25 -12 -47 5l-183 146l-83 -86l236 -339h503l89 100v293l-339 131q-21 6 -41 19.5t-20 28.5zM450 200h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe130;" d="M350 1100h500q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5t35.5 -14.5zM600 306v-106q0 -84 -39 -139t-111 -55t-110 54t-38 138v302l-121 -84q-15 -12 -34 -11.5t-32 13.5l-112 110 q-22 22 -6 53l230 363q1 2 3.5 6t10.5 13.5t16.5 17t20 13.5t22.5 6h525q13 0 94 -83t81 -90v-342q0 -15 -20 -28.5t-41 -19.5zM308 900l-236 -339l83 -86l183 146q22 17 47 5q2 -1 4.5 -2.5t4 -4t2.5 -4t2 -5t1.5 -5t0.5 -6v-5.5v-6v-7v-456q0 -22 25 -31t50 0.5t25 30.5 v203q0 15 20 28.5t41 19.5l339 131v293l-89 100h-503z" />
-<glyph unicode="&#xe131;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM914 632l-275 223q-16 13 -27.5 8t-11.5 -26v-137h-275 q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h275v-137q0 -21 11.5 -26t27.5 8l275 223q16 13 16 32t-16 32z" />
-<glyph unicode="&#xe132;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM561 855l-275 -223q-16 -13 -16 -32t16 -32l275 -223q16 -13 27.5 -8 t11.5 26v137h275q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5h-275v137q0 21 -11.5 26t-27.5 -8z" />
-<glyph unicode="&#xe133;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM855 639l-223 275q-13 16 -32 16t-32 -16l-223 -275q-13 -16 -8 -27.5 t26 -11.5h137v-275q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v275h137q21 0 26 11.5t-8 27.5z" />
-<glyph unicode="&#xe134;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM675 900h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-275h-137q-21 0 -26 -11.5 t8 -27.5l223 -275q13 -16 32 -16t32 16l223 275q13 16 8 27.5t-26 11.5h-137v275q0 10 -7.5 17.5t-17.5 7.5z" />
-<glyph unicode="&#xe135;" d="M600 1176q116 0 222.5 -46t184 -123.5t123.5 -184t46 -222.5t-46 -222.5t-123.5 -184t-184 -123.5t-222.5 -46t-222.5 46t-184 123.5t-123.5 184t-46 222.5t46 222.5t123.5 184t184 123.5t222.5 46zM627 1101q-15 -12 -36.5 -20.5t-35.5 -12t-43 -8t-39 -6.5 q-15 -3 -45.5 0t-45.5 -2q-20 -7 -51.5 -26.5t-34.5 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -91t-29.5 -79q-9 -34 5 -93t8 -87q0 -9 17 -44.5t16 -59.5q12 0 23 -5t23.5 -15t19.5 -14q16 -8 33 -15t40.5 -15t34.5 -12q21 -9 52.5 -32t60 -38t57.5 -11 q7 -15 -3 -34t-22.5 -40t-9.5 -38q13 -21 23 -34.5t27.5 -27.5t36.5 -18q0 -7 -3.5 -16t-3.5 -14t5 -17q104 -2 221 112q30 29 46.5 47t34.5 49t21 63q-13 8 -37 8.5t-36 7.5q-15 7 -49.5 15t-51.5 19q-18 0 -41 -0.5t-43 -1.5t-42 -6.5t-38 -16.5q-51 -35 -66 -12 q-4 1 -3.5 25.5t0.5 25.5q-6 13 -26.5 17.5t-24.5 6.5q1 15 -0.5 30.5t-7 28t-18.5 11.5t-31 -21q-23 -25 -42 4q-19 28 -8 58q6 16 22 22q6 -1 26 -1.5t33.5 -4t19.5 -13.5q7 -12 18 -24t21.5 -20.5t20 -15t15.5 -10.5l5 -3q2 12 7.5 30.5t8 34.5t-0.5 32q-3 18 3.5 29 t18 22.5t15.5 24.5q6 14 10.5 35t8 31t15.5 22.5t34 22.5q-6 18 10 36q8 0 24 -1.5t24.5 -1.5t20 4.5t20.5 15.5q-10 23 -31 42.5t-37.5 29.5t-49 27t-43.5 23q0 1 2 8t3 11.5t1.5 10.5t-1 9.5t-4.5 4.5q31 -13 58.5 -14.5t38.5 2.5l12 5q5 28 -9.5 46t-36.5 24t-50 15 t-41 20q-18 -4 -37 0zM613 994q0 -17 8 -42t17 -45t9 -23q-8 1 -39.5 5.5t-52.5 10t-37 16.5q3 11 16 29.5t16 25.5q10 -10 19 -10t14 6t13.5 14.5t16.5 12.5z" />
-<glyph unicode="&#xe136;" d="M756 1157q164 92 306 -9l-259 -138l145 -232l251 126q6 -89 -34 -156.5t-117 -110.5q-60 -34 -127 -39.5t-126 16.5l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5t15 37.5l600 599q-34 101 5.5 201.5t135.5 154.5z" />
-<glyph unicode="&#xe137;" horiz-adv-x="1220" d="M100 1196h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 1096h-200v-100h200v100zM100 796h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 696h-500v-100h500v100zM100 396h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 296h-300v-100h300v100z " />
-<glyph unicode="&#xe138;" d="M150 1200h900q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM700 500v-300l-200 -200v500l-350 500h900z" />
-<glyph unicode="&#xe139;" d="M500 1200h200q41 0 70.5 -29.5t29.5 -70.5v-100h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5zM500 1100v-100h200v100h-200zM1200 400v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v200h1200z" />
-<glyph unicode="&#xe140;" d="M50 1200h300q21 0 25 -10.5t-10 -24.5l-94 -94l199 -199q7 -8 7 -18t-7 -18l-106 -106q-8 -7 -18 -7t-18 7l-199 199l-94 -94q-14 -14 -24.5 -10t-10.5 25v300q0 21 14.5 35.5t35.5 14.5zM850 1200h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94 l-199 -199q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l199 199l-94 94q-14 14 -10 24.5t25 10.5zM364 470l106 -106q7 -8 7 -18t-7 -18l-199 -199l94 -94q14 -14 10 -24.5t-25 -10.5h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l199 199 q8 7 18 7t18 -7zM1071 271l94 94q14 14 24.5 10t10.5 -25v-300q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -25 10.5t10 24.5l94 94l-199 199q-7 8 -7 18t7 18l106 106q8 7 18 7t18 -7z" />
-<glyph unicode="&#xe141;" d="M596 1192q121 0 231.5 -47.5t190 -127t127 -190t47.5 -231.5t-47.5 -231.5t-127 -190.5t-190 -127t-231.5 -47t-231.5 47t-190.5 127t-127 190.5t-47 231.5t47 231.5t127 190t190.5 127t231.5 47.5zM596 1010q-112 0 -207.5 -55.5t-151 -151t-55.5 -207.5t55.5 -207.5 t151 -151t207.5 -55.5t207.5 55.5t151 151t55.5 207.5t-55.5 207.5t-151 151t-207.5 55.5zM454.5 905q22.5 0 38.5 -16t16 -38.5t-16 -39t-38.5 -16.5t-38.5 16.5t-16 39t16 38.5t38.5 16zM754.5 905q22.5 0 38.5 -16t16 -38.5t-16 -39t-38 -16.5q-14 0 -29 10l-55 -145 q17 -23 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5q0 32 20.5 56.5t51.5 29.5l122 126l1 1q-9 14 -9 28q0 23 16 39t38.5 16zM345.5 709q22.5 0 38.5 -16t16 -38.5t-16 -38.5t-38.5 -16t-38.5 16t-16 38.5t16 38.5t38.5 16zM854.5 709q22.5 0 38.5 -16 t16 -38.5t-16 -38.5t-38.5 -16t-38.5 16t-16 38.5t16 38.5t38.5 16z" />
-<glyph unicode="&#xe142;" d="M546 173l469 470q91 91 99 192q7 98 -52 175.5t-154 94.5q-22 4 -47 4q-34 0 -66.5 -10t-56.5 -23t-55.5 -38t-48 -41.5t-48.5 -47.5q-376 -375 -391 -390q-30 -27 -45 -41.5t-37.5 -41t-32 -46.5t-16 -47.5t-1.5 -56.5q9 -62 53.5 -95t99.5 -33q74 0 125 51l548 548 q36 36 20 75q-7 16 -21.5 26t-32.5 10q-26 0 -50 -23q-13 -12 -39 -38l-341 -338q-15 -15 -35.5 -15.5t-34.5 13.5t-14 34.5t14 34.5q327 333 361 367q35 35 67.5 51.5t78.5 16.5q14 0 29 -1q44 -8 74.5 -35.5t43.5 -68.5q14 -47 2 -96.5t-47 -84.5q-12 -11 -32 -32 t-79.5 -81t-114.5 -115t-124.5 -123.5t-123 -119.5t-96.5 -89t-57 -45q-56 -27 -120 -27q-70 0 -129 32t-93 89q-48 78 -35 173t81 163l511 511q71 72 111 96q91 55 198 55q80 0 152 -33q78 -36 129.5 -103t66.5 -154q17 -93 -11 -183.5t-94 -156.5l-482 -476 q-15 -15 -36 -16t-37 14t-17.5 34t14.5 35z" />
-<glyph unicode="&#xe143;" d="M649 949q48 68 109.5 104t121.5 38.5t118.5 -20t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-150 152.5t-126.5 127.5t-93.5 124.5t-33.5 117.5q0 64 28 123t73 100.5t104 64t119 20 t120.5 -38.5t104.5 -104zM896 972q-33 0 -64.5 -19t-56.5 -46t-47.5 -53.5t-43.5 -45.5t-37.5 -19t-36 19t-40 45.5t-43 53.5t-54 46t-65.5 19q-67 0 -122.5 -55.5t-55.5 -132.5q0 -23 13.5 -51t46 -65t57.5 -63t76 -75l22 -22q15 -14 44 -44t50.5 -51t46 -44t41 -35t23 -12 t23.5 12t42.5 36t46 44t52.5 52t44 43q4 4 12 13q43 41 63.5 62t52 55t46 55t26 46t11.5 44q0 79 -53 133.5t-120 54.5z" />
-<glyph unicode="&#xe144;" d="M776.5 1214q93.5 0 159.5 -66l141 -141q66 -66 66 -160q0 -42 -28 -95.5t-62 -87.5l-29 -29q-31 53 -77 99l-18 18l95 95l-247 248l-389 -389l212 -212l-105 -106l-19 18l-141 141q-66 66 -66 159t66 159l283 283q65 66 158.5 66zM600 706l105 105q10 -8 19 -17l141 -141 q66 -66 66 -159t-66 -159l-283 -283q-66 -66 -159 -66t-159 66l-141 141q-66 66 -66 159.5t66 159.5l55 55q29 -55 75 -102l18 -17l-95 -95l247 -248l389 389z" />
-<glyph unicode="&#xe145;" d="M603 1200q85 0 162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5v953q0 21 30 46.5t81 48t129 37.5t163 15zM300 1000v-700h600v700h-600zM600 254q-43 0 -73.5 -30.5t-30.5 -73.5t30.5 -73.5t73.5 -30.5t73.5 30.5 t30.5 73.5t-30.5 73.5t-73.5 30.5z" />
-<glyph unicode="&#xe146;" d="M902 1185l283 -282q15 -15 15 -36t-14.5 -35.5t-35.5 -14.5t-35 15l-36 35l-279 -267v-300l-212 210l-308 -307l-280 -203l203 280l307 308l-210 212h300l267 279l-35 36q-15 14 -15 35t14.5 35.5t35.5 14.5t35 -15z" />
-<glyph unicode="&#xe148;" d="M700 1248v-78q38 -5 72.5 -14.5t75.5 -31.5t71 -53.5t52 -84t24 -118.5h-159q-4 36 -10.5 59t-21 45t-40 35.5t-64.5 20.5v-307l64 -13q34 -7 64 -16.5t70 -32t67.5 -52.5t47.5 -80t20 -112q0 -139 -89 -224t-244 -97v-77h-100v79q-150 16 -237 103q-40 40 -52.5 93.5 t-15.5 139.5h139q5 -77 48.5 -126t117.5 -65v335l-27 8q-46 14 -79 26.5t-72 36t-63 52t-40 72.5t-16 98q0 70 25 126t67.5 92t94.5 57t110 27v77h100zM600 754v274q-29 -4 -50 -11t-42 -21.5t-31.5 -41.5t-10.5 -65q0 -29 7 -50.5t16.5 -34t28.5 -22.5t31.5 -14t37.5 -10 q9 -3 13 -4zM700 547v-310q22 2 42.5 6.5t45 15.5t41.5 27t29 42t12 59.5t-12.5 59.5t-38 44.5t-53 31t-66.5 24.5z" />
-<glyph unicode="&#xe149;" d="M561 1197q84 0 160.5 -40t123.5 -109.5t47 -147.5h-153q0 40 -19.5 71.5t-49.5 48.5t-59.5 26t-55.5 9q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -26 13.5 -63t26.5 -61t37 -66q6 -9 9 -14h241v-100h-197q8 -50 -2.5 -115t-31.5 -95q-45 -62 -99 -112 q34 10 83 17.5t71 7.5q32 1 102 -16t104 -17q83 0 136 30l50 -147q-31 -19 -58 -30.5t-55 -15.5t-42 -4.5t-46 -0.5q-23 0 -76 17t-111 32.5t-96 11.5q-39 -3 -82 -16t-67 -25l-23 -11l-55 145q4 3 16 11t15.5 10.5t13 9t15.5 12t14.5 14t17.5 18.5q48 55 54 126.5 t-30 142.5h-221v100h166q-23 47 -44 104q-7 20 -12 41.5t-6 55.5t6 66.5t29.5 70.5t58.5 71q97 88 263 88z" />
-<glyph unicode="&#xe150;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM935 1184l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-900h-200v900h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
-<glyph unicode="&#xe151;" d="M1000 700h-100v100h-100v-100h-100v500h300v-500zM400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM801 1100v-200h100v200h-100zM1000 350l-200 -250h200v-100h-300v150l200 250h-200v100h300v-150z " />
-<glyph unicode="&#xe152;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1000 1050l-200 -250h200v-100h-300v150l200 250h-200v100h300v-150zM1000 0h-100v100h-100v-100h-100v500h300v-500zM801 400v-200h100v200h-100z " />
-<glyph unicode="&#xe153;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1000 700h-100v400h-100v100h200v-500zM1100 0h-100v100h-200v400h300v-500zM901 400v-200h100v200h-100z" />
-<glyph unicode="&#xe154;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1100 700h-100v100h-200v400h300v-500zM901 1100v-200h100v200h-100zM1000 0h-100v400h-100v100h200v-500z" />
-<glyph unicode="&#xe155;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM900 1000h-200v200h200v-200zM1000 700h-300v200h300v-200zM1100 400h-400v200h400v-200zM1200 100h-500v200h500v-200z" />
-<glyph unicode="&#xe156;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1200 1000h-500v200h500v-200zM1100 700h-400v200h400v-200zM1000 400h-300v200h300v-200zM900 100h-200v200h200v-200z" />
-<glyph unicode="&#xe157;" d="M350 1100h400q162 0 256 -93.5t94 -256.5v-400q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5z" />
-<glyph unicode="&#xe158;" d="M350 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-163 0 -256.5 92.5t-93.5 257.5v400q0 163 94 256.5t256 93.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM440 770l253 -190q17 -12 17 -30t-17 -30l-253 -190q-16 -12 -28 -6.5t-12 26.5v400q0 21 12 26.5t28 -6.5z" />
-<glyph unicode="&#xe159;" d="M350 1100h400q163 0 256.5 -94t93.5 -256v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 163 92.5 256.5t257.5 93.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM350 700h400q21 0 26.5 -12t-6.5 -28l-190 -253q-12 -17 -30 -17t-30 17l-190 253q-12 16 -6.5 28t26.5 12z" />
-<glyph unicode="&#xe160;" d="M350 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -163 -92.5 -256.5t-257.5 -93.5h-400q-163 0 -256.5 94t-93.5 256v400q0 165 92.5 257.5t257.5 92.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM580 693l190 -253q12 -16 6.5 -28t-26.5 -12h-400q-21 0 -26.5 12t6.5 28l190 253q12 17 30 17t30 -17z" />
-<glyph unicode="&#xe161;" d="M550 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h450q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-450q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM338 867l324 -284q16 -14 16 -33t-16 -33l-324 -284q-16 -14 -27 -9t-11 26v150h-250q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h250v150q0 21 11 26t27 -9z" />
-<glyph unicode="&#xe162;" d="M793 1182l9 -9q8 -10 5 -27q-3 -11 -79 -225.5t-78 -221.5l300 1q24 0 32.5 -17.5t-5.5 -35.5q-1 0 -133.5 -155t-267 -312.5t-138.5 -162.5q-12 -15 -26 -15h-9l-9 8q-9 11 -4 32q2 9 42 123.5t79 224.5l39 110h-302q-23 0 -31 19q-10 21 6 41q75 86 209.5 237.5 t228 257t98.5 111.5q9 16 25 16h9z" />
-<glyph unicode="&#xe163;" d="M350 1100h400q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-450q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h450q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400 q0 165 92.5 257.5t257.5 92.5zM938 867l324 -284q16 -14 16 -33t-16 -33l-324 -284q-16 -14 -27 -9t-11 26v150h-250q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h250v150q0 21 11 26t27 -9z" />
-<glyph unicode="&#xe164;" d="M750 1200h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -10.5 -25t-24.5 10l-109 109l-312 -312q-15 -15 -35.5 -15t-35.5 15l-141 141q-15 15 -15 35.5t15 35.5l312 312l-109 109q-14 14 -10 24.5t25 10.5zM456 900h-156q-41 0 -70.5 -29.5t-29.5 -70.5v-500 q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v148l200 200v-298q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5h300z" />
-<glyph unicode="&#xe165;" d="M600 1186q119 0 227.5 -46.5t187 -125t125 -187t46.5 -227.5t-46.5 -227.5t-125 -187t-187 -125t-227.5 -46.5t-227.5 46.5t-187 125t-125 187t-46.5 227.5t46.5 227.5t125 187t187 125t227.5 46.5zM600 1022q-115 0 -212 -56.5t-153.5 -153.5t-56.5 -212t56.5 -212 t153.5 -153.5t212 -56.5t212 56.5t153.5 153.5t56.5 212t-56.5 212t-153.5 153.5t-212 56.5zM600 794q80 0 137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137t57 137t137 57z" />
-<glyph unicode="&#xe166;" d="M450 1200h200q21 0 35.5 -14.5t14.5 -35.5v-350h245q20 0 25 -11t-9 -26l-383 -426q-14 -15 -33.5 -15t-32.5 15l-379 426q-13 15 -8.5 26t25.5 11h250v350q0 21 14.5 35.5t35.5 14.5zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5z M900 200v-50h100v50h-100z" />
-<glyph unicode="&#xe167;" d="M583 1182l378 -435q14 -15 9 -31t-26 -16h-244v-250q0 -20 -17 -35t-39 -15h-200q-20 0 -32 14.5t-12 35.5v250h-250q-20 0 -25.5 16.5t8.5 31.5l383 431q14 16 33.5 17t33.5 -14zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5z M900 200v-50h100v50h-100z" />
-<glyph unicode="&#xe168;" d="M396 723l369 369q7 7 17.5 7t17.5 -7l139 -139q7 -8 7 -18.5t-7 -17.5l-525 -525q-7 -8 -17.5 -8t-17.5 8l-292 291q-7 8 -7 18t7 18l139 139q8 7 18.5 7t17.5 -7zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50 h-100z" />
-<glyph unicode="&#xe169;" d="M135 1023l142 142q14 14 35 14t35 -14l77 -77l-212 -212l-77 76q-14 15 -14 36t14 35zM655 855l210 210q14 14 24.5 10t10.5 -25l-2 -599q-1 -20 -15.5 -35t-35.5 -15l-597 -1q-21 0 -25 10.5t10 24.5l208 208l-154 155l212 212zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5 v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50h-100z" />
-<glyph unicode="&#xe170;" d="M350 1200l599 -2q20 -1 35 -15.5t15 -35.5l1 -597q0 -21 -10.5 -25t-24.5 10l-208 208l-155 -154l-212 212l155 154l-210 210q-14 14 -10 24.5t25 10.5zM524 512l-76 -77q-15 -14 -36 -14t-35 14l-142 142q-14 14 -14 35t14 35l77 77zM50 300h1000q21 0 35.5 -14.5 t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50h-100z" />
-<glyph unicode="&#xe171;" d="M1200 103l-483 276l-314 -399v423h-399l1196 796v-1096zM483 424v-230l683 953z" />
-<glyph unicode="&#xe172;" d="M1100 1000v-850q0 -21 -14.5 -35.5t-35.5 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200z" />
-<glyph unicode="&#xe173;" d="M1100 1000l-2 -149l-299 -299l-95 95q-9 9 -21.5 9t-21.5 -9l-149 -147h-312v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM1132 638l106 -106q7 -7 7 -17.5t-7 -17.5l-420 -421q-8 -7 -18 -7 t-18 7l-202 203q-8 7 -8 17.5t8 17.5l106 106q7 8 17.5 8t17.5 -8l79 -79l297 297q7 7 17.5 7t17.5 -7z" />
-<glyph unicode="&#xe174;" d="M1100 1000v-269l-103 -103l-134 134q-15 15 -33.5 16.5t-34.5 -12.5l-266 -266h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM1202 572l70 -70q15 -15 15 -35.5t-15 -35.5l-131 -131 l131 -131q15 -15 15 -35.5t-15 -35.5l-70 -70q-15 -15 -35.5 -15t-35.5 15l-131 131l-131 -131q-15 -15 -35.5 -15t-35.5 15l-70 70q-15 15 -15 35.5t15 35.5l131 131l-131 131q-15 15 -15 35.5t15 35.5l70 70q15 15 35.5 15t35.5 -15l131 -131l131 131q15 15 35.5 15 t35.5 -15z" />
-<glyph unicode="&#xe175;" d="M1100 1000v-300h-350q-21 0 -35.5 -14.5t-14.5 -35.5v-150h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM850 600h100q21 0 35.5 -14.5t14.5 -35.5v-250h150q21 0 25 -10.5t-10 -24.5 l-230 -230q-14 -14 -35 -14t-35 14l-230 230q-14 14 -10 24.5t25 10.5h150v250q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe176;" d="M1100 1000v-400l-165 165q-14 15 -35 15t-35 -15l-263 -265h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM935 565l230 -229q14 -15 10 -25.5t-25 -10.5h-150v-250q0 -20 -14.5 -35 t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35v250h-150q-21 0 -25 10.5t10 25.5l230 229q14 15 35 15t35 -15z" />
-<glyph unicode="&#xe177;" d="M50 1100h1100q21 0 35.5 -14.5t14.5 -35.5v-150h-1200v150q0 21 14.5 35.5t35.5 14.5zM1200 800v-550q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v550h1200zM100 500v-200h400v200h-400z" />
-<glyph unicode="&#xe178;" d="M935 1165l248 -230q14 -14 14 -35t-14 -35l-248 -230q-14 -14 -24.5 -10t-10.5 25v150h-400v200h400v150q0 21 10.5 25t24.5 -10zM200 800h-50q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v-200zM400 800h-100v200h100v-200zM18 435l247 230 q14 14 24.5 10t10.5 -25v-150h400v-200h-400v-150q0 -21 -10.5 -25t-24.5 10l-247 230q-15 14 -15 35t15 35zM900 300h-100v200h100v-200zM1000 500h51q20 0 34.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-34.5 -14.5h-51v200z" />
-<glyph unicode="&#xe179;" d="M862 1073l276 116q25 18 43.5 8t18.5 -41v-1106q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v397q-4 1 -11 5t-24 17.5t-30 29t-24 42t-11 56.5v359q0 31 18.5 65t43.5 52zM550 1200q22 0 34.5 -12.5t14.5 -24.5l1 -13v-450q0 -28 -10.5 -59.5 t-25 -56t-29 -45t-25.5 -31.5l-10 -11v-447q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447q-4 4 -11 11.5t-24 30.5t-30 46t-24 55t-11 60v450q0 2 0.5 5.5t4 12t8.5 15t14.5 12t22.5 5.5q20 0 32.5 -12.5t14.5 -24.5l3 -13v-350h100v350v5.5t2.5 12 t7 15t15 12t25.5 5.5q23 0 35.5 -12.5t13.5 -24.5l1 -13v-350h100v350q0 2 0.5 5.5t3 12t7 15t15 12t24.5 5.5z" />
-<glyph unicode="&#xe180;" d="M1200 1100v-56q-4 0 -11 -0.5t-24 -3t-30 -7.5t-24 -15t-11 -24v-888q0 -22 25 -34.5t50 -13.5l25 -2v-56h-400v56q75 0 87.5 6.5t12.5 43.5v394h-500v-394q0 -37 12.5 -43.5t87.5 -6.5v-56h-400v56q4 0 11 0.5t24 3t30 7.5t24 15t11 24v888q0 22 -25 34.5t-50 13.5 l-25 2v56h400v-56q-75 0 -87.5 -6.5t-12.5 -43.5v-394h500v394q0 37 -12.5 43.5t-87.5 6.5v56h400z" />
-<glyph unicode="&#xe181;" d="M675 1000h375q21 0 35.5 -14.5t14.5 -35.5v-150h-105l-295 -98v98l-200 200h-400l100 100h375zM100 900h300q41 0 70.5 -29.5t29.5 -70.5v-500q0 -41 -29.5 -70.5t-70.5 -29.5h-300q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5zM100 800v-200h300v200 h-300zM1100 535l-400 -133v163l400 133v-163zM100 500v-200h300v200h-300zM1100 398v-248q0 -21 -14.5 -35.5t-35.5 -14.5h-375l-100 -100h-375l-100 100h400l200 200h105z" />
-<glyph unicode="&#xe182;" d="M17 1007l162 162q17 17 40 14t37 -22l139 -194q14 -20 11 -44.5t-20 -41.5l-119 -118q102 -142 228 -268t267 -227l119 118q17 17 42.5 19t44.5 -12l192 -136q19 -14 22.5 -37.5t-13.5 -40.5l-163 -162q-3 -1 -9.5 -1t-29.5 2t-47.5 6t-62.5 14.5t-77.5 26.5t-90 42.5 t-101.5 60t-111 83t-119 108.5q-74 74 -133.5 150.5t-94.5 138.5t-60 119.5t-34.5 100t-15 74.5t-4.5 48z" />
-<glyph unicode="&#xe183;" d="M600 1100q92 0 175 -10.5t141.5 -27t108.5 -36.5t81.5 -40t53.5 -37t31 -27l9 -10v-200q0 -21 -14.5 -33t-34.5 -9l-202 34q-20 3 -34.5 20t-14.5 38v146q-141 24 -300 24t-300 -24v-146q0 -21 -14.5 -38t-34.5 -20l-202 -34q-20 -3 -34.5 9t-14.5 33v200q3 4 9.5 10.5 t31 26t54 37.5t80.5 39.5t109 37.5t141 26.5t175 10.5zM600 795q56 0 97 -9.5t60 -23.5t30 -28t12 -24l1 -10v-50l365 -303q14 -15 24.5 -40t10.5 -45v-212q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v212q0 20 10.5 45t24.5 40l365 303v50 q0 4 1 10.5t12 23t30 29t60 22.5t97 10z" />
-<glyph unicode="&#xe184;" d="M1100 700l-200 -200h-600l-200 200v500h200v-200h200v200h200v-200h200v200h200v-500zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-12l137 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5 t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe185;" d="M700 1100h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-1000h300v1000q0 41 -29.5 70.5t-70.5 29.5zM1100 800h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-700h300v700q0 41 -29.5 70.5t-70.5 29.5zM400 0h-300v400q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-400z " />
-<glyph unicode="&#xe186;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-100h200v-300h-300v100h200v100h-200v300h300v-100zM900 700v-300l-100 -100h-200v500h200z M700 700v-300h100v300h-100z" />
-<glyph unicode="&#xe187;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 300h-100v200h-100v-200h-100v500h100v-200h100v200h100v-500zM900 700v-300l-100 -100h-200v500h200z M700 700v-300h100v300h-100z" />
-<glyph unicode="&#xe188;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-300h200v-100h-300v500h300v-100zM900 700h-200v-300h200v-100h-300v500h300v-100z" />
-<glyph unicode="&#xe189;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 400l-300 150l300 150v-300zM900 550l-300 -150v300z" />
-<glyph unicode="&#xe190;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM900 300h-700v500h700v-500zM800 700h-130q-38 0 -66.5 -43t-28.5 -108t27 -107t68 -42h130v300zM300 700v-300 h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130z" />
-<glyph unicode="&#xe191;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-100h200v-300h-300v100h200v100h-200v300h300v-100zM900 300h-100v400h-100v100h200v-500z M700 300h-100v100h100v-100z" />
-<glyph unicode="&#xe192;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM300 700h200v-400h-300v500h100v-100zM900 300h-100v400h-100v100h200v-500zM300 600v-200h100v200h-100z M700 300h-100v100h100v-100z" />
-<glyph unicode="&#xe193;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 500l-199 -200h-100v50l199 200v150h-200v100h300v-300zM900 300h-100v400h-100v100h200v-500zM701 300h-100 v100h100v-100z" />
-<glyph unicode="&#xe194;" d="M600 1191q120 0 229.5 -47t188.5 -126t126 -188.5t47 -229.5t-47 -229.5t-126 -188.5t-188.5 -126t-229.5 -47t-229.5 47t-188.5 126t-126 188.5t-47 229.5t47 229.5t126 188.5t188.5 126t229.5 47zM600 1021q-114 0 -211 -56.5t-153.5 -153.5t-56.5 -211t56.5 -211 t153.5 -153.5t211 -56.5t211 56.5t153.5 153.5t56.5 211t-56.5 211t-153.5 153.5t-211 56.5zM800 700h-300v-200h300v-100h-300l-100 100v200l100 100h300v-100z" />
-<glyph unicode="&#xe195;" d="M600 1191q120 0 229.5 -47t188.5 -126t126 -188.5t47 -229.5t-47 -229.5t-126 -188.5t-188.5 -126t-229.5 -47t-229.5 47t-188.5 126t-126 188.5t-47 229.5t47 229.5t126 188.5t188.5 126t229.5 47zM600 1021q-114 0 -211 -56.5t-153.5 -153.5t-56.5 -211t56.5 -211 t153.5 -153.5t211 -56.5t211 56.5t153.5 153.5t56.5 211t-56.5 211t-153.5 153.5t-211 56.5zM800 700v-100l-50 -50l100 -100v-50h-100l-100 100h-150v-100h-100v400h300zM500 700v-100h200v100h-200z" />
-<glyph unicode="&#xe197;" d="M503 1089q110 0 200.5 -59.5t134.5 -156.5q44 14 90 14q120 0 205 -86.5t85 -207t-85 -207t-205 -86.5h-128v250q0 21 -14.5 35.5t-35.5 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-250h-222q-80 0 -136 57.5t-56 136.5q0 69 43 122.5t108 67.5q-2 19 -2 37q0 100 49 185 t134 134t185 49zM525 500h150q10 0 17.5 -7.5t7.5 -17.5v-275h137q21 0 26 -11.5t-8 -27.5l-223 -244q-13 -16 -32 -16t-32 16l-223 244q-13 16 -8 27.5t26 11.5h137v275q0 10 7.5 17.5t17.5 7.5z" />
-<glyph unicode="&#xe198;" d="M502 1089q110 0 201 -59.5t135 -156.5q43 15 89 15q121 0 206 -86.5t86 -206.5q0 -99 -60 -181t-150 -110l-378 360q-13 16 -31.5 16t-31.5 -16l-381 -365h-9q-79 0 -135.5 57.5t-56.5 136.5q0 69 43 122.5t108 67.5q-2 19 -2 38q0 100 49 184.5t133.5 134t184.5 49.5z M632 467l223 -228q13 -16 8 -27.5t-26 -11.5h-137v-275q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v275h-137q-21 0 -26 11.5t8 27.5q199 204 223 228q19 19 31.5 19t32.5 -19z" />
-<glyph unicode="&#xe199;" d="M700 100v100h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170l-270 -300h400v-100h-50q-21 0 -35.5 -14.5t-14.5 -35.5v-50h400v50q0 21 -14.5 35.5t-35.5 14.5h-50z" />
-<glyph unicode="&#xe200;" d="M600 1179q94 0 167.5 -56.5t99.5 -145.5q89 -6 150.5 -71.5t61.5 -155.5q0 -61 -29.5 -112.5t-79.5 -82.5q9 -29 9 -55q0 -74 -52.5 -126.5t-126.5 -52.5q-55 0 -100 30v-251q21 0 35.5 -14.5t14.5 -35.5v-50h-300v50q0 21 14.5 35.5t35.5 14.5v251q-45 -30 -100 -30 q-74 0 -126.5 52.5t-52.5 126.5q0 18 4 38q-47 21 -75.5 65t-28.5 97q0 74 52.5 126.5t126.5 52.5q5 0 23 -2q0 2 -1 10t-1 13q0 116 81.5 197.5t197.5 81.5z" />
-<glyph unicode="&#xe201;" d="M1010 1010q111 -111 150.5 -260.5t0 -299t-150.5 -260.5q-83 -83 -191.5 -126.5t-218.5 -43.5t-218.5 43.5t-191.5 126.5q-111 111 -150.5 260.5t0 299t150.5 260.5q83 83 191.5 126.5t218.5 43.5t218.5 -43.5t191.5 -126.5zM476 1065q-4 0 -8 -1q-121 -34 -209.5 -122.5 t-122.5 -209.5q-4 -12 2.5 -23t18.5 -14l36 -9q3 -1 7 -1q23 0 29 22q27 96 98 166q70 71 166 98q11 3 17.5 13.5t3.5 22.5l-9 35q-3 13 -14 19q-7 4 -15 4zM512 920q-4 0 -9 -2q-80 -24 -138.5 -82.5t-82.5 -138.5q-4 -13 2 -24t19 -14l34 -9q4 -1 8 -1q22 0 28 21 q18 58 58.5 98.5t97.5 58.5q12 3 18 13.5t3 21.5l-9 35q-3 12 -14 19q-7 4 -15 4zM719.5 719.5q-49.5 49.5 -119.5 49.5t-119.5 -49.5t-49.5 -119.5t49.5 -119.5t119.5 -49.5t119.5 49.5t49.5 119.5t-49.5 119.5zM855 551q-22 0 -28 -21q-18 -58 -58.5 -98.5t-98.5 -57.5 q-11 -4 -17 -14.5t-3 -21.5l9 -35q3 -12 14 -19q7 -4 15 -4q4 0 9 2q80 24 138.5 82.5t82.5 138.5q4 13 -2.5 24t-18.5 14l-34 9q-4 1 -8 1zM1000 515q-23 0 -29 -22q-27 -96 -98 -166q-70 -71 -166 -98q-11 -3 -17.5 -13.5t-3.5 -22.5l9 -35q3 -13 14 -19q7 -4 15 -4 q4 0 8 1q121 34 209.5 122.5t122.5 209.5q4 12 -2.5 23t-18.5 14l-36 9q-3 1 -7 1z" />
-<glyph unicode="&#xe202;" d="M700 800h300v-380h-180v200h-340v-200h-380v755q0 10 7.5 17.5t17.5 7.5h575v-400zM1000 900h-200v200zM700 300h162l-212 -212l-212 212h162v200h100v-200zM520 0h-395q-10 0 -17.5 7.5t-7.5 17.5v395zM1000 220v-195q0 -10 -7.5 -17.5t-17.5 -7.5h-195z" />
-<glyph unicode="&#xe203;" d="M700 800h300v-520l-350 350l-550 -550v1095q0 10 7.5 17.5t17.5 7.5h575v-400zM1000 900h-200v200zM862 200h-162v-200h-100v200h-162l212 212zM480 0h-355q-10 0 -17.5 7.5t-7.5 17.5v55h380v-80zM1000 80v-55q0 -10 -7.5 -17.5t-17.5 -7.5h-155v80h180z" />
-<glyph unicode="&#xe204;" d="M1162 800h-162v-200h100l100 -100h-300v300h-162l212 212zM200 800h200q27 0 40 -2t29.5 -10.5t23.5 -30t7 -57.5h300v-100h-600l-200 -350v450h100q0 36 7 57.5t23.5 30t29.5 10.5t40 2zM800 400h240l-240 -400h-800l300 500h500v-100z" />
-<glyph unicode="&#xe205;" d="M650 1100h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5zM1000 850v150q41 0 70.5 -29.5t29.5 -70.5v-800 q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-1 0 -20 4l246 246l-326 326v324q0 41 29.5 70.5t70.5 29.5v-150q0 -62 44 -106t106 -44h300q62 0 106 44t44 106zM412 250l-212 -212v162h-200v100h200v162z" />
-<glyph unicode="&#xe206;" d="M450 1100h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5zM800 850v150q41 0 70.5 -29.5t29.5 -70.5v-500 h-200v-300h200q0 -36 -7 -57.5t-23.5 -30t-29.5 -10.5t-40 -2h-600q-41 0 -70.5 29.5t-29.5 70.5v800q0 41 29.5 70.5t70.5 29.5v-150q0 -62 44 -106t106 -44h300q62 0 106 44t44 106zM1212 250l-212 -212v162h-200v100h200v162z" />
-<glyph unicode="&#xe209;" d="M658 1197l637 -1104q23 -38 7 -65.5t-60 -27.5h-1276q-44 0 -60 27.5t7 65.5l637 1104q22 39 54 39t54 -39zM704 800h-208q-20 0 -32 -14.5t-8 -34.5l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5zM500 300v-100h200 v100h-200z" />
-<glyph unicode="&#xe210;" d="M425 1100h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM425 800h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5 t17.5 7.5zM825 800h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM25 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150 q0 10 7.5 17.5t17.5 7.5zM425 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM825 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5 v150q0 10 7.5 17.5t17.5 7.5zM25 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM425 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5 t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM825 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
-<glyph unicode="&#xe211;" d="M700 1200h100v-200h-100v-100h350q62 0 86.5 -39.5t-3.5 -94.5l-66 -132q-41 -83 -81 -134h-772q-40 51 -81 134l-66 132q-28 55 -3.5 94.5t86.5 39.5h350v100h-100v200h100v100h200v-100zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-12l137 -100 h-950l138 100h-13q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe212;" d="M600 1300q40 0 68.5 -29.5t28.5 -70.5h-194q0 41 28.5 70.5t68.5 29.5zM443 1100h314q18 -37 18 -75q0 -8 -3 -25h328q41 0 44.5 -16.5t-30.5 -38.5l-175 -145h-678l-178 145q-34 22 -29 38.5t46 16.5h328q-3 17 -3 25q0 38 18 75zM250 700h700q21 0 35.5 -14.5 t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-150v-200l275 -200h-950l275 200v200h-150q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe213;" d="M600 1181q75 0 128 -53t53 -128t-53 -128t-128 -53t-128 53t-53 128t53 128t128 53zM602 798h46q34 0 55.5 -28.5t21.5 -86.5q0 -76 39 -183h-324q39 107 39 183q0 58 21.5 86.5t56.5 28.5h45zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13 l138 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe214;" d="M600 1300q47 0 92.5 -53.5t71 -123t25.5 -123.5q0 -78 -55.5 -133.5t-133.5 -55.5t-133.5 55.5t-55.5 133.5q0 62 34 143l144 -143l111 111l-163 163q34 26 63 26zM602 798h46q34 0 55.5 -28.5t21.5 -86.5q0 -76 39 -183h-324q39 107 39 183q0 58 21.5 86.5t56.5 28.5h45 zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13l138 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe215;" d="M600 1200l300 -161v-139h-300q0 -57 18.5 -108t50 -91.5t63 -72t70 -67.5t57.5 -61h-530q-60 83 -90.5 177.5t-30.5 178.5t33 164.5t87.5 139.5t126 96.5t145.5 41.5v-98zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13l138 -100h-950l137 100 h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe216;" d="M600 1300q41 0 70.5 -29.5t29.5 -70.5v-78q46 -26 73 -72t27 -100v-50h-400v50q0 54 27 100t73 72v78q0 41 29.5 70.5t70.5 29.5zM400 800h400q54 0 100 -27t72 -73h-172v-100h200v-100h-200v-100h200v-100h-200v-100h200q0 -83 -58.5 -141.5t-141.5 -58.5h-400 q-83 0 -141.5 58.5t-58.5 141.5v400q0 83 58.5 141.5t141.5 58.5z" />
-<glyph unicode="&#xe218;" d="M150 1100h900q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5zM125 400h950q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-283l224 -224q13 -13 13 -31.5t-13 -32 t-31.5 -13.5t-31.5 13l-88 88h-524l-87 -88q-13 -13 -32 -13t-32 13.5t-13 32t13 31.5l224 224h-289q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM541 300l-100 -100h324l-100 100h-124z" />
-<glyph unicode="&#xe219;" d="M200 1100h800q83 0 141.5 -58.5t58.5 -141.5v-200h-100q0 41 -29.5 70.5t-70.5 29.5h-250q-41 0 -70.5 -29.5t-29.5 -70.5h-100q0 41 -29.5 70.5t-70.5 29.5h-250q-41 0 -70.5 -29.5t-29.5 -70.5h-100v200q0 83 58.5 141.5t141.5 58.5zM100 600h1000q41 0 70.5 -29.5 t29.5 -70.5v-300h-1200v300q0 41 29.5 70.5t70.5 29.5zM300 100v-50q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v50h200zM1100 100v-50q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v50h200z" />
-<glyph unicode="&#xe221;" d="M480 1165l682 -683q31 -31 31 -75.5t-31 -75.5l-131 -131h-481l-517 518q-32 31 -32 75.5t32 75.5l295 296q31 31 75.5 31t76.5 -31zM108 794l342 -342l303 304l-341 341zM250 100h800q21 0 35.5 -14.5t14.5 -35.5v-50h-900v50q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe223;" d="M1057 647l-189 506q-8 19 -27.5 33t-40.5 14h-400q-21 0 -40.5 -14t-27.5 -33l-189 -506q-8 -19 1.5 -33t30.5 -14h625v-150q0 -21 14.5 -35.5t35.5 -14.5t35.5 14.5t14.5 35.5v150h125q21 0 30.5 14t1.5 33zM897 0h-595v50q0 21 14.5 35.5t35.5 14.5h50v50 q0 21 14.5 35.5t35.5 14.5h48v300h200v-300h47q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-50z" />
-<glyph unicode="&#xe224;" d="M900 800h300v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-375v591l-300 300v84q0 10 7.5 17.5t17.5 7.5h375v-400zM1200 900h-200v200zM400 600h300v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-650q-10 0 -17.5 7.5t-7.5 17.5v950q0 10 7.5 17.5t17.5 7.5h375v-400zM700 700h-200v200z " />
-<glyph unicode="&#xe225;" d="M484 1095h195q75 0 146 -32.5t124 -86t89.5 -122.5t48.5 -142q18 -14 35 -20q31 -10 64.5 6.5t43.5 48.5q10 34 -15 71q-19 27 -9 43q5 8 12.5 11t19 -1t23.5 -16q41 -44 39 -105q-3 -63 -46 -106.5t-104 -43.5h-62q-7 -55 -35 -117t-56 -100l-39 -234q-3 -20 -20 -34.5 t-38 -14.5h-100q-21 0 -33 14.5t-9 34.5l12 70q-49 -14 -91 -14h-195q-24 0 -65 8l-11 -64q-3 -20 -20 -34.5t-38 -14.5h-100q-21 0 -33 14.5t-9 34.5l26 157q-84 74 -128 175l-159 53q-19 7 -33 26t-14 40v50q0 21 14.5 35.5t35.5 14.5h124q11 87 56 166l-111 95 q-16 14 -12.5 23.5t24.5 9.5h203q116 101 250 101zM675 1000h-250q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h250q10 0 17.5 7.5t7.5 17.5v50q0 10 -7.5 17.5t-17.5 7.5z" />
-<glyph unicode="&#xe226;" d="M641 900l423 247q19 8 42 2.5t37 -21.5l32 -38q14 -15 12.5 -36t-17.5 -34l-139 -120h-390zM50 1100h106q67 0 103 -17t66 -71l102 -212h823q21 0 35.5 -14.5t14.5 -35.5v-50q0 -21 -14 -40t-33 -26l-737 -132q-23 -4 -40 6t-26 25q-42 67 -100 67h-300q-62 0 -106 44 t-44 106v200q0 62 44 106t106 44zM173 928h-80q-19 0 -28 -14t-9 -35v-56q0 -51 42 -51h134q16 0 21.5 8t5.5 24q0 11 -16 45t-27 51q-18 28 -43 28zM550 727q-32 0 -54.5 -22.5t-22.5 -54.5t22.5 -54.5t54.5 -22.5t54.5 22.5t22.5 54.5t-22.5 54.5t-54.5 22.5zM130 389 l152 130q18 19 34 24t31 -3.5t24.5 -17.5t25.5 -28q28 -35 50.5 -51t48.5 -13l63 5l48 -179q13 -61 -3.5 -97.5t-67.5 -79.5l-80 -69q-47 -40 -109 -35.5t-103 51.5l-130 151q-40 47 -35.5 109.5t51.5 102.5zM380 377l-102 -88q-31 -27 2 -65l37 -43q13 -15 27.5 -19.5 t31.5 6.5l61 53q19 16 14 49q-2 20 -12 56t-17 45q-11 12 -19 14t-23 -8z" />
-<glyph unicode="&#xe227;" d="M625 1200h150q10 0 17.5 -7.5t7.5 -17.5v-109q79 -33 131 -87.5t53 -128.5q1 -46 -15 -84.5t-39 -61t-46 -38t-39 -21.5l-17 -6q6 0 15 -1.5t35 -9t50 -17.5t53 -30t50 -45t35.5 -64t14.5 -84q0 -59 -11.5 -105.5t-28.5 -76.5t-44 -51t-49.5 -31.5t-54.5 -16t-49.5 -6.5 t-43.5 -1v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-100v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-175q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h75v600h-75q-10 0 -17.5 7.5t-7.5 17.5v150 q0 10 7.5 17.5t17.5 7.5h175v75q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-75h100v75q0 10 7.5 17.5t17.5 7.5zM400 900v-200h263q28 0 48.5 10.5t30 25t15 29t5.5 25.5l1 10q0 4 -0.5 11t-6 24t-15 30t-30 24t-48.5 11h-263zM400 500v-200h363q28 0 48.5 10.5 t30 25t15 29t5.5 25.5l1 10q0 4 -0.5 11t-6 24t-15 30t-30 24t-48.5 11h-363z" />
-<glyph unicode="&#xe230;" d="M212 1198h780q86 0 147 -61t61 -147v-416q0 -51 -18 -142.5t-36 -157.5l-18 -66q-29 -87 -93.5 -146.5t-146.5 -59.5h-572q-82 0 -147 59t-93 147q-8 28 -20 73t-32 143.5t-20 149.5v416q0 86 61 147t147 61zM600 1045q-70 0 -132.5 -11.5t-105.5 -30.5t-78.5 -41.5 t-57 -45t-36 -41t-20.5 -30.5l-6 -12l156 -243h560l156 243q-2 5 -6 12.5t-20 29.5t-36.5 42t-57 44.5t-79 42t-105 29.5t-132.5 12zM762 703h-157l195 261z" />
-<glyph unicode="&#xe231;" d="M475 1300h150q103 0 189 -86t86 -189v-500q0 -41 -42 -83t-83 -42h-450q-41 0 -83 42t-42 83v500q0 103 86 189t189 86zM700 300v-225q0 -21 -27 -48t-48 -27h-150q-21 0 -48 27t-27 48v225h300z" />
-<glyph unicode="&#xe232;" d="M475 1300h96q0 -150 89.5 -239.5t239.5 -89.5v-446q0 -41 -42 -83t-83 -42h-450q-41 0 -83 42t-42 83v500q0 103 86 189t189 86zM700 300v-225q0 -21 -27 -48t-48 -27h-150q-21 0 -48 27t-27 48v225h300z" />
-<glyph unicode="&#xe233;" d="M1294 767l-638 -283l-378 170l-78 -60v-224l100 -150v-199l-150 148l-150 -149v200l100 150v250q0 4 -0.5 10.5t0 9.5t1 8t3 8t6.5 6l47 40l-147 65l642 283zM1000 380l-350 -166l-350 166v147l350 -165l350 165v-147z" />
-<glyph unicode="&#xe234;" d="M250 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM650 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM1050 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44z" />
-<glyph unicode="&#xe235;" d="M550 1100q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM550 700q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM550 300q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44z" />
-<glyph unicode="&#xe236;" d="M125 1100h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM125 700h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5 t17.5 7.5zM125 300h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
-<glyph unicode="&#xe237;" d="M350 1200h500q162 0 256 -93.5t94 -256.5v-500q0 -165 -93.5 -257.5t-256.5 -92.5h-500q-165 0 -257.5 92.5t-92.5 257.5v500q0 165 92.5 257.5t257.5 92.5zM900 1000h-600q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h600q41 0 70.5 29.5 t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5zM350 900h500q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -14.5 -35.5t-35.5 -14.5h-500q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 14.5 35.5t35.5 14.5zM400 800v-200h400v200h-400z" />
-<glyph unicode="&#xe238;" d="M150 1100h1000q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5 t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe239;" d="M650 1187q87 -67 118.5 -156t0 -178t-118.5 -155q-87 66 -118.5 155t0 178t118.5 156zM300 800q124 0 212 -88t88 -212q-124 0 -212 88t-88 212zM1000 800q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM300 500q124 0 212 -88t88 -212q-124 0 -212 88t-88 212z M1000 500q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM700 199v-144q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v142q40 -4 43 -4q17 0 57 6z" />
-<glyph unicode="&#xe240;" d="M745 878l69 19q25 6 45 -12l298 -295q11 -11 15 -26.5t-2 -30.5q-5 -14 -18 -23.5t-28 -9.5h-8q1 0 1 -13q0 -29 -2 -56t-8.5 -62t-20 -63t-33 -53t-51 -39t-72.5 -14h-146q-184 0 -184 288q0 24 10 47q-20 4 -62 4t-63 -4q11 -24 11 -47q0 -288 -184 -288h-142 q-48 0 -84.5 21t-56 51t-32 71.5t-16 75t-3.5 68.5q0 13 2 13h-7q-15 0 -27.5 9.5t-18.5 23.5q-6 15 -2 30.5t15 25.5l298 296q20 18 46 11l76 -19q20 -5 30.5 -22.5t5.5 -37.5t-22.5 -31t-37.5 -5l-51 12l-182 -193h891l-182 193l-44 -12q-20 -5 -37.5 6t-22.5 31t6 37.5 t31 22.5z" />
-<glyph unicode="&#xe241;" d="M1200 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-850q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v850h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM500 450h-25q0 15 -4 24.5t-9 14.5t-17 7.5t-20 3t-25 0.5h-100v-425q0 -11 12.5 -17.5t25.5 -7.5h12v-50h-200v50q50 0 50 25v425h-100q-17 0 -25 -0.5t-20 -3t-17 -7.5t-9 -14.5t-4 -24.5h-25v150h500v-150z" />
-<glyph unicode="&#xe242;" d="M1000 300v50q-25 0 -55 32q-14 14 -25 31t-16 27l-4 11l-289 747h-69l-300 -754q-18 -35 -39 -56q-9 -9 -24.5 -18.5t-26.5 -14.5l-11 -5v-50h273v50q-49 0 -78.5 21.5t-11.5 67.5l69 176h293l61 -166q13 -34 -3.5 -66.5t-55.5 -32.5v-50h312zM412 691l134 342l121 -342 h-255zM1100 150v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5z" />
-<glyph unicode="&#xe243;" d="M50 1200h1100q21 0 35.5 -14.5t14.5 -35.5v-1100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v1100q0 21 14.5 35.5t35.5 14.5zM611 1118h-70q-13 0 -18 -12l-299 -753q-17 -32 -35 -51q-18 -18 -56 -34q-12 -5 -12 -18v-50q0 -8 5.5 -14t14.5 -6 h273q8 0 14 6t6 14v50q0 8 -6 14t-14 6q-55 0 -71 23q-10 14 0 39l63 163h266l57 -153q11 -31 -6 -55q-12 -17 -36 -17q-8 0 -14 -6t-6 -14v-50q0 -8 6 -14t14 -6h313q8 0 14 6t6 14v50q0 7 -5.5 13t-13.5 7q-17 0 -42 25q-25 27 -40 63h-1l-288 748q-5 12 -19 12zM639 611 h-197l103 264z" />
-<glyph unicode="&#xe244;" d="M1200 1100h-1200v100h1200v-100zM50 1000h400q21 0 35.5 -14.5t14.5 -35.5v-900q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v900q0 21 14.5 35.5t35.5 14.5zM650 1000h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM700 900v-300h300v300h-300z" />
-<glyph unicode="&#xe245;" d="M50 1200h400q21 0 35.5 -14.5t14.5 -35.5v-900q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v900q0 21 14.5 35.5t35.5 14.5zM650 700h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5zM700 600v-300h300v300h-300zM1200 0h-1200v100h1200v-100z" />
-<glyph unicode="&#xe246;" d="M50 1000h400q21 0 35.5 -14.5t14.5 -35.5v-350h100v150q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-150h100v-100h-100v-150q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v150h-100v-350q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5zM700 700v-300h300v300h-300z" />
-<glyph unicode="&#xe247;" d="M100 0h-100v1200h100v-1200zM250 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM300 1000v-300h300v300h-300zM250 500h900q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe248;" d="M600 1100h150q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-150v-100h450q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h350v100h-150q-21 0 -35.5 14.5 t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h150v100h100v-100zM400 1000v-300h300v300h-300z" />
-<glyph unicode="&#xe249;" d="M1200 0h-100v1200h100v-1200zM550 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM600 1000v-300h300v300h-300zM50 500h900q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe250;" d="M865 565l-494 -494q-23 -23 -41 -23q-14 0 -22 13.5t-8 38.5v1000q0 25 8 38.5t22 13.5q18 0 41 -23l494 -494q14 -14 14 -35t-14 -35z" />
-<glyph unicode="&#xe251;" d="M335 635l494 494q29 29 50 20.5t21 -49.5v-1000q0 -41 -21 -49.5t-50 20.5l-494 494q-14 14 -14 35t14 35z" />
-<glyph unicode="&#xe252;" d="M100 900h1000q41 0 49.5 -21t-20.5 -50l-494 -494q-14 -14 -35 -14t-35 14l-494 494q-29 29 -20.5 50t49.5 21z" />
-<glyph unicode="&#xe253;" d="M635 865l494 -494q29 -29 20.5 -50t-49.5 -21h-1000q-41 0 -49.5 21t20.5 50l494 494q14 14 35 14t35 -14z" />
-<glyph unicode="&#xe254;" d="M700 741v-182l-692 -323v221l413 193l-413 193v221zM1200 0h-800v200h800v-200z" />
-<glyph unicode="&#xe255;" d="M1200 900h-200v-100h200v-100h-300v300h200v100h-200v100h300v-300zM0 700h50q0 21 4 37t9.5 26.5t18 17.5t22 11t28.5 5.5t31 2t37 0.5h100v-550q0 -22 -25 -34.5t-50 -13.5l-25 -2v-100h400v100q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5v550h100q25 0 37 -0.5t31 -2 t28.5 -5.5t22 -11t18 -17.5t9.5 -26.5t4 -37h50v300h-800v-300z" />
-<glyph unicode="&#xe256;" d="M800 700h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-100v-550q0 -22 25 -34.5t50 -14.5l25 -1v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v550h-100q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h800v-300zM1100 200h-200v-100h200v-100h-300v300h200v100h-200v100h300v-300z" />
-<glyph unicode="&#xe257;" d="M701 1098h160q16 0 21 -11t-7 -23l-464 -464l464 -464q12 -12 7 -23t-21 -11h-160q-13 0 -23 9l-471 471q-7 8 -7 18t7 18l471 471q10 9 23 9z" />
-<glyph unicode="&#xe258;" d="M339 1098h160q13 0 23 -9l471 -471q7 -8 7 -18t-7 -18l-471 -471q-10 -9 -23 -9h-160q-16 0 -21 11t7 23l464 464l-464 464q-12 12 -7 23t21 11z" />
-<glyph unicode="&#xe259;" d="M1087 882q11 -5 11 -21v-160q0 -13 -9 -23l-471 -471q-8 -7 -18 -7t-18 7l-471 471q-9 10 -9 23v160q0 16 11 21t23 -7l464 -464l464 464q12 12 23 7z" />
-<glyph unicode="&#xe260;" d="M618 993l471 -471q9 -10 9 -23v-160q0 -16 -11 -21t-23 7l-464 464l-464 -464q-12 -12 -23 -7t-11 21v160q0 13 9 23l471 471q8 7 18 7t18 -7z" />
-<glyph unicode="&#xf8ff;" d="M1000 1200q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM450 1000h100q21 0 40 -14t26 -33l79 -194q5 1 16 3q34 6 54 9.5t60 7t65.5 1t61 -10t56.5 -23t42.5 -42t29 -64t5 -92t-19.5 -121.5q-1 -7 -3 -19.5t-11 -50t-20.5 -73t-32.5 -81.5t-46.5 -83t-64 -70 t-82.5 -50q-13 -5 -42 -5t-65.5 2.5t-47.5 2.5q-14 0 -49.5 -3.5t-63 -3.5t-43.5 7q-57 25 -104.5 78.5t-75 111.5t-46.5 112t-26 90l-7 35q-15 63 -18 115t4.5 88.5t26 64t39.5 43.5t52 25.5t58.5 13t62.5 2t59.5 -4.5t55.5 -8l-147 192q-12 18 -5.5 30t27.5 12z" />
-<glyph unicode="&#x1f511;" d="M250 1200h600q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-150v-500l-255 -178q-19 -9 -32 -1t-13 29v650h-150q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM400 1100v-100h300v100h-300z" />
-<glyph unicode="&#x1f6aa;" d="M250 1200h750q39 0 69.5 -40.5t30.5 -84.5v-933l-700 -117v950l600 125h-700v-1000h-100v1025q0 23 15.5 49t34.5 26zM500 525v-100l100 20v100z" />
-</font>
-</defs></svg> \ No newline at end of file
diff --git a/library/bootstrap/fonts/glyphicons-halflings-regular.ttf b/library/bootstrap/fonts/glyphicons-halflings-regular.ttf
deleted file mode 100644
index 1413fc609..000000000
--- a/library/bootstrap/fonts/glyphicons-halflings-regular.ttf
+++ /dev/null
Binary files differ
diff --git a/library/bootstrap/fonts/glyphicons-halflings-regular.woff b/library/bootstrap/fonts/glyphicons-halflings-regular.woff
deleted file mode 100644
index 9e612858f..000000000
--- a/library/bootstrap/fonts/glyphicons-halflings-regular.woff
+++ /dev/null
Binary files differ
diff --git a/library/bootstrap/fonts/glyphicons-halflings-regular.woff2 b/library/bootstrap/fonts/glyphicons-halflings-regular.woff2
deleted file mode 100644
index 64539b54c..000000000
--- a/library/bootstrap/fonts/glyphicons-halflings-regular.woff2
+++ /dev/null
Binary files differ
diff --git a/library/bootstrap/js/bootstrap.js b/library/bootstrap/js/bootstrap.js
index 8a2e99a53..865256739 100644
--- a/library/bootstrap/js/bootstrap.js
+++ b/library/bootstrap/js/bootstrap.js
@@ -1,2377 +1,3631 @@
/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright 2011-2016 Twitter, Inc.
- * Licensed under the MIT license
+ * Bootstrap v4.0.0-alpha.6 (https://getbootstrap.com)
+ * Copyright 2011-2017 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
*/
if (typeof jQuery === 'undefined') {
- throw new Error('Bootstrap\'s JavaScript requires jQuery')
+ throw new Error('Bootstrap\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\'s JavaScript.')
}
-+function ($) {
- 'use strict';
+(function ($) {
var version = $.fn.jquery.split(' ')[0].split('.')
- if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1) || (version[0] > 3)) {
- throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4')
+ if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1) || (version[0] >= 4)) {
+ throw new Error('Bootstrap\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0')
}
-}(jQuery);
+})(jQuery);
+
+(function () {
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
-/* ========================================================================
- * Bootstrap: transition.js v3.3.7
- * http://getbootstrap.com/javascript/#transitions
- * ========================================================================
- * Copyright 2011-2016 Twitter, Inc.
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+/**
+ * --------------------------------------------------------------------------
+ * Bootstrap (v4.0.0-alpha.6): util.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
+ * --------------------------------------------------------------------------
+ */
+var Util = function ($) {
-+function ($) {
- 'use strict';
+ /**
+ * ------------------------------------------------------------------------
+ * Private TransitionEnd Helpers
+ * ------------------------------------------------------------------------
+ */
- // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)
- // ============================================================
+ var transition = false;
- function transitionEnd() {
- var el = document.createElement('bootstrap')
+ var MAX_UID = 1000000;
- var transEndEventNames = {
- WebkitTransition : 'webkitTransitionEnd',
- MozTransition : 'transitionend',
- OTransition : 'oTransitionEnd otransitionend',
- transition : 'transitionend'
- }
+ var TransitionEndEvent = {
+ WebkitTransition: 'webkitTransitionEnd',
+ MozTransition: 'transitionend',
+ OTransition: 'oTransitionEnd otransitionend',
+ transition: 'transitionend'
+ };
- for (var name in transEndEventNames) {
- if (el.style[name] !== undefined) {
- return { end: transEndEventNames[name] }
- }
- }
+ // shoutout AngusCroll (https://goo.gl/pxwQGp)
+ function toType(obj) {
+ return {}.toString.call(obj).match(/\s([a-zA-Z]+)/)[1].toLowerCase();
+ }
- return false // explicit for ie8 ( ._.)
+ function isElement(obj) {
+ return (obj[0] || obj).nodeType;
}
- // http://blog.alexmaccaw.com/css-transitions
- $.fn.emulateTransitionEnd = function (duration) {
- var called = false
- var $el = this
- $(this).one('bsTransitionEnd', function () { called = true })
- var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
- setTimeout(callback, duration)
- return this
+ function getSpecialTransitionEndEvent() {
+ return {
+ bindType: transition.end,
+ delegateType: transition.end,
+ handle: function handle(event) {
+ if ($(event.target).is(this)) {
+ return event.handleObj.handler.apply(this, arguments); // eslint-disable-line prefer-rest-params
+ }
+ return undefined;
+ }
+ };
}
- $(function () {
- $.support.transition = transitionEnd()
+ function transitionEndTest() {
+ if (window.QUnit) {
+ return false;
+ }
- if (!$.support.transition) return
+ var el = document.createElement('bootstrap');
- $.event.special.bsTransitionEnd = {
- bindType: $.support.transition.end,
- delegateType: $.support.transition.end,
- handle: function (e) {
- if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)
+ for (var name in TransitionEndEvent) {
+ if (el.style[name] !== undefined) {
+ return {
+ end: TransitionEndEvent[name]
+ };
}
}
- })
-}(jQuery);
+ return false;
+ }
-/* ========================================================================
- * Bootstrap: alert.js v3.3.7
- * http://getbootstrap.com/javascript/#alerts
- * ========================================================================
- * Copyright 2011-2016 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
+ function transitionEndEmulator(duration) {
+ var _this = this;
+ var called = false;
-+function ($) {
- 'use strict';
+ $(this).one(Util.TRANSITION_END, function () {
+ called = true;
+ });
- // ALERT CLASS DEFINITION
- // ======================
+ setTimeout(function () {
+ if (!called) {
+ Util.triggerTransitionEnd(_this);
+ }
+ }, duration);
- var dismiss = '[data-dismiss="alert"]'
- var Alert = function (el) {
- $(el).on('click', dismiss, this.close)
+ return this;
}
- Alert.VERSION = '3.3.7'
+ function setTransitionEndSupport() {
+ transition = transitionEndTest();
- Alert.TRANSITION_DURATION = 150
+ $.fn.emulateTransitionEnd = transitionEndEmulator;
- Alert.prototype.close = function (e) {
- var $this = $(this)
- var selector = $this.attr('data-target')
-
- if (!selector) {
- selector = $this.attr('href')
- selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
+ if (Util.supportsTransitionEnd()) {
+ $.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent();
}
+ }
- var $parent = $(selector === '#' ? [] : selector)
+ /**
+ * --------------------------------------------------------------------------
+ * Public Util Api
+ * --------------------------------------------------------------------------
+ */
- if (e) e.preventDefault()
+ var Util = {
- if (!$parent.length) {
- $parent = $this.closest('.alert')
+ TRANSITION_END: 'bsTransitionEnd',
+
+ getUID: function getUID(prefix) {
+ do {
+ // eslint-disable-next-line no-bitwise
+ prefix += ~~(Math.random() * MAX_UID); // "~~" acts like a faster Math.floor() here
+ } while (document.getElementById(prefix));
+ return prefix;
+ },
+ getSelectorFromElement: function getSelectorFromElement(element) {
+ var selector = element.getAttribute('data-target');
+ if (!selector || selector === '#') {
+ selector = element.getAttribute('href') || '';
+ }
+
+ try {
+ var $selector = $(selector);
+ return $selector.length > 0 ? selector : null;
+ } catch (error) {
+ return null;
+ }
+ },
+ reflow: function reflow(element) {
+ return element.offsetHeight;
+ },
+ triggerTransitionEnd: function triggerTransitionEnd(element) {
+ $(element).trigger(transition.end);
+ },
+ supportsTransitionEnd: function supportsTransitionEnd() {
+ return Boolean(transition);
+ },
+ typeCheckConfig: function typeCheckConfig(componentName, config, configTypes) {
+ for (var property in configTypes) {
+ if (configTypes.hasOwnProperty(property)) {
+ var expectedTypes = configTypes[property];
+ var value = config[property];
+ var valueType = value && isElement(value) ? 'element' : toType(value);
+
+ if (!new RegExp(expectedTypes).test(valueType)) {
+ throw new Error(componentName.toUpperCase() + ': ' + ('Option "' + property + '" provided type "' + valueType + '" ') + ('but expected type "' + expectedTypes + '".'));
+ }
+ }
+ }
}
+ };
- $parent.trigger(e = $.Event('close.bs.alert'))
+ setTransitionEndSupport();
- if (e.isDefaultPrevented()) return
+ return Util;
+}(jQuery);
- $parent.removeClass('in')
+/**
+ * --------------------------------------------------------------------------
+ * Bootstrap (v4.0.0-alpha.6): alert.js
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * --------------------------------------------------------------------------
+ */
- function removeElement() {
- // detach from parent, fire event then clean up data
- $parent.detach().trigger('closed.bs.alert').remove()
+var Alert = function ($) {
+
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+
+ var NAME = 'alert';
+ var VERSION = '4.0.0-alpha.6';
+ var DATA_KEY = 'bs.alert';
+ var EVENT_KEY = '.' + DATA_KEY;
+ var DATA_API_KEY = '.data-api';
+ var JQUERY_NO_CONFLICT = $.fn[NAME];
+ var TRANSITION_DURATION = 150;
+
+ var Selector = {
+ DISMISS: '[data-dismiss="alert"]'
+ };
+
+ var Event = {
+ CLOSE: 'close' + EVENT_KEY,
+ CLOSED: 'closed' + EVENT_KEY,
+ CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY
+ };
+
+ var ClassName = {
+ ALERT: 'alert',
+ FADE: 'fade',
+ SHOW: 'show'
+ };
+
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ var Alert = function () {
+ function Alert(element) {
+ _classCallCheck(this, Alert);
+
+ this._element = element;
}
- $.support.transition && $parent.hasClass('fade') ?
- $parent
- .one('bsTransitionEnd', removeElement)
- .emulateTransitionEnd(Alert.TRANSITION_DURATION) :
- removeElement()
- }
+ // getters
+ // public
- // ALERT PLUGIN DEFINITION
- // =======================
+ Alert.prototype.close = function close(element) {
+ element = element || this._element;
- function Plugin(option) {
- return this.each(function () {
- var $this = $(this)
- var data = $this.data('bs.alert')
+ var rootElement = this._getRootElement(element);
+ var customEvent = this._triggerCloseEvent(rootElement);
- if (!data) $this.data('bs.alert', (data = new Alert(this)))
- if (typeof option == 'string') data[option].call($this)
- })
- }
+ if (customEvent.isDefaultPrevented()) {
+ return;
+ }
- var old = $.fn.alert
+ this._removeElement(rootElement);
+ };
- $.fn.alert = Plugin
- $.fn.alert.Constructor = Alert
+ Alert.prototype.dispose = function dispose() {
+ $.removeData(this._element, DATA_KEY);
+ this._element = null;
+ };
+ // private
- // ALERT NO CONFLICT
- // =================
+ Alert.prototype._getRootElement = function _getRootElement(element) {
+ var selector = Util.getSelectorFromElement(element);
+ var parent = false;
- $.fn.alert.noConflict = function () {
- $.fn.alert = old
- return this
- }
+ if (selector) {
+ parent = $(selector)[0];
+ }
+ if (!parent) {
+ parent = $(element).closest('.' + ClassName.ALERT)[0];
+ }
- // ALERT DATA-API
- // ==============
+ return parent;
+ };
- $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)
+ Alert.prototype._triggerCloseEvent = function _triggerCloseEvent(element) {
+ var closeEvent = $.Event(Event.CLOSE);
-}(jQuery);
+ $(element).trigger(closeEvent);
+ return closeEvent;
+ };
-/* ========================================================================
- * Bootstrap: button.js v3.3.7
- * http://getbootstrap.com/javascript/#buttons
- * ========================================================================
- * Copyright 2011-2016 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
+ Alert.prototype._removeElement = function _removeElement(element) {
+ var _this2 = this;
+ $(element).removeClass(ClassName.SHOW);
-+function ($) {
- 'use strict';
+ if (!Util.supportsTransitionEnd() || !$(element).hasClass(ClassName.FADE)) {
+ this._destroyElement(element);
+ return;
+ }
- // BUTTON PUBLIC CLASS DEFINITION
- // ==============================
+ $(element).one(Util.TRANSITION_END, function (event) {
+ return _this2._destroyElement(element, event);
+ }).emulateTransitionEnd(TRANSITION_DURATION);
+ };
- var Button = function (element, options) {
- this.$element = $(element)
- this.options = $.extend({}, Button.DEFAULTS, options)
- this.isLoading = false
- }
+ Alert.prototype._destroyElement = function _destroyElement(element) {
+ $(element).detach().trigger(Event.CLOSED).remove();
+ };
- Button.VERSION = '3.3.7'
+ // static
- Button.DEFAULTS = {
- loadingText: 'loading...'
- }
+ Alert._jQueryInterface = function _jQueryInterface(config) {
+ return this.each(function () {
+ var $element = $(this);
+ var data = $element.data(DATA_KEY);
- Button.prototype.setState = function (state) {
- var d = 'disabled'
- var $el = this.$element
- var val = $el.is('input') ? 'val' : 'html'
- var data = $el.data()
+ if (!data) {
+ data = new Alert(this);
+ $element.data(DATA_KEY, data);
+ }
- state += 'Text'
+ if (config === 'close') {
+ data[config](this);
+ }
+ });
+ };
- if (data.resetText == null) $el.data('resetText', $el[val]())
+ Alert._handleDismiss = function _handleDismiss(alertInstance) {
+ return function (event) {
+ if (event) {
+ event.preventDefault();
+ }
- // push to event loop to allow forms to submit
- setTimeout($.proxy(function () {
- $el[val](data[state] == null ? this.options[state] : data[state])
+ alertInstance.close(this);
+ };
+ };
- if (state == 'loadingText') {
- this.isLoading = true
- $el.addClass(d).attr(d, d).prop(d, true)
- } else if (this.isLoading) {
- this.isLoading = false
- $el.removeClass(d).removeAttr(d).prop(d, false)
+ _createClass(Alert, null, [{
+ key: 'VERSION',
+ get: function get() {
+ return VERSION;
}
- }, this), 0)
- }
+ }]);
- Button.prototype.toggle = function () {
- var changed = true
- var $parent = this.$element.closest('[data-toggle="buttons"]')
-
- if ($parent.length) {
- var $input = this.$element.find('input')
- if ($input.prop('type') == 'radio') {
- if ($input.prop('checked')) changed = false
- $parent.find('.active').removeClass('active')
- this.$element.addClass('active')
- } else if ($input.prop('type') == 'checkbox') {
- if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false
- this.$element.toggleClass('active')
- }
- $input.prop('checked', this.$element.hasClass('active'))
- if (changed) $input.trigger('change')
- } else {
- this.$element.attr('aria-pressed', !this.$element.hasClass('active'))
- this.$element.toggleClass('active')
- }
- }
+ return Alert;
+ }();
+ /**
+ * ------------------------------------------------------------------------
+ * Data Api implementation
+ * ------------------------------------------------------------------------
+ */
- // BUTTON PLUGIN DEFINITION
- // ========================
+ $(document).on(Event.CLICK_DATA_API, Selector.DISMISS, Alert._handleDismiss(new Alert()));
- function Plugin(option) {
- return this.each(function () {
- var $this = $(this)
- var data = $this.data('bs.button')
- var options = typeof option == 'object' && option
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
- if (!data) $this.data('bs.button', (data = new Button(this, options)))
+ $.fn[NAME] = Alert._jQueryInterface;
+ $.fn[NAME].Constructor = Alert;
+ $.fn[NAME].noConflict = function () {
+ $.fn[NAME] = JQUERY_NO_CONFLICT;
+ return Alert._jQueryInterface;
+ };
- if (option == 'toggle') data.toggle()
- else if (option) data.setState(option)
- })
- }
+ return Alert;
+}(jQuery);
+
+/**
+ * --------------------------------------------------------------------------
+ * Bootstrap (v4.0.0-alpha.6): button.js
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * --------------------------------------------------------------------------
+ */
- var old = $.fn.button
+var Button = function ($) {
+
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+
+ var NAME = 'button';
+ var VERSION = '4.0.0-alpha.6';
+ var DATA_KEY = 'bs.button';
+ var EVENT_KEY = '.' + DATA_KEY;
+ var DATA_API_KEY = '.data-api';
+ var JQUERY_NO_CONFLICT = $.fn[NAME];
+
+ var ClassName = {
+ ACTIVE: 'active',
+ BUTTON: 'btn',
+ FOCUS: 'focus'
+ };
+
+ var Selector = {
+ DATA_TOGGLE_CARROT: '[data-toggle^="button"]',
+ DATA_TOGGLE: '[data-toggle="buttons"]',
+ INPUT: 'input',
+ ACTIVE: '.active',
+ BUTTON: '.btn'
+ };
+
+ var Event = {
+ CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY,
+ FOCUS_BLUR_DATA_API: 'focus' + EVENT_KEY + DATA_API_KEY + ' ' + ('blur' + EVENT_KEY + DATA_API_KEY)
+ };
+
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ var Button = function () {
+ function Button(element) {
+ _classCallCheck(this, Button);
+
+ this._element = element;
+ }
- $.fn.button = Plugin
- $.fn.button.Constructor = Button
+ // getters
+ // public
- // BUTTON NO CONFLICT
- // ==================
+ Button.prototype.toggle = function toggle() {
+ var triggerChangeEvent = true;
+ var addAriaPressed = true;
+ var rootElement = $(this._element).closest(Selector.DATA_TOGGLE)[0];
- $.fn.button.noConflict = function () {
- $.fn.button = old
- return this
- }
+ if (rootElement) {
+ var input = $(this._element).find(Selector.INPUT)[0];
+
+ if (input) {
+ if (input.type === 'radio') {
+ if (input.checked && $(this._element).hasClass(ClassName.ACTIVE)) {
+ triggerChangeEvent = false;
+ } else {
+ var activeElement = $(rootElement).find(Selector.ACTIVE)[0];
+ if (activeElement) {
+ $(activeElement).removeClass(ClassName.ACTIVE);
+ }
+ }
+ }
- // BUTTON DATA-API
- // ===============
+ if (triggerChangeEvent) {
+ input.checked = !$(this._element).hasClass(ClassName.ACTIVE);
+ $(input).trigger('change');
+ }
- $(document)
- .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) {
- var $btn = $(e.target).closest('.btn')
- Plugin.call($btn, 'toggle')
- if (!($(e.target).is('input[type="radio"], input[type="checkbox"]'))) {
- // Prevent double click on radios, and the double selections (so cancellation) on checkboxes
- e.preventDefault()
- // The target component still receive the focus
- if ($btn.is('input,button')) $btn.trigger('focus')
- else $btn.find('input:visible,button:visible').first().trigger('focus')
+ input.focus();
+ addAriaPressed = false;
+ }
}
- })
- .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) {
- $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type))
- })
-}(jQuery);
+ if (addAriaPressed) {
+ this._element.setAttribute('aria-pressed', !$(this._element).hasClass(ClassName.ACTIVE));
+ }
-/* ========================================================================
- * Bootstrap: carousel.js v3.3.7
- * http://getbootstrap.com/javascript/#carousel
- * ========================================================================
- * Copyright 2011-2016 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
+ if (triggerChangeEvent) {
+ $(this._element).toggleClass(ClassName.ACTIVE);
+ }
+ };
+ Button.prototype.dispose = function dispose() {
+ $.removeData(this._element, DATA_KEY);
+ this._element = null;
+ };
-+function ($) {
- 'use strict';
+ // static
- // CAROUSEL CLASS DEFINITION
- // =========================
+ Button._jQueryInterface = function _jQueryInterface(config) {
+ return this.each(function () {
+ var data = $(this).data(DATA_KEY);
- var Carousel = function (element, options) {
- this.$element = $(element)
- this.$indicators = this.$element.find('.carousel-indicators')
- this.options = options
- this.paused = null
- this.sliding = null
- this.interval = null
- this.$active = null
- this.$items = null
+ if (!data) {
+ data = new Button(this);
+ $(this).data(DATA_KEY, data);
+ }
- this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this))
+ if (config === 'toggle') {
+ data[config]();
+ }
+ });
+ };
- this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element
- .on('mouseenter.bs.carousel', $.proxy(this.pause, this))
- .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))
- }
+ _createClass(Button, null, [{
+ key: 'VERSION',
+ get: function get() {
+ return VERSION;
+ }
+ }]);
+
+ return Button;
+ }();
- Carousel.VERSION = '3.3.7'
+ /**
+ * ------------------------------------------------------------------------
+ * Data Api implementation
+ * ------------------------------------------------------------------------
+ */
- Carousel.TRANSITION_DURATION = 600
+ $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE_CARROT, function (event) {
+ event.preventDefault();
- Carousel.DEFAULTS = {
+ var button = event.target;
+
+ if (!$(button).hasClass(ClassName.BUTTON)) {
+ button = $(button).closest(Selector.BUTTON);
+ }
+
+ Button._jQueryInterface.call($(button), 'toggle');
+ }).on(Event.FOCUS_BLUR_DATA_API, Selector.DATA_TOGGLE_CARROT, function (event) {
+ var button = $(event.target).closest(Selector.BUTTON)[0];
+ $(button).toggleClass(ClassName.FOCUS, /^focus(in)?$/.test(event.type));
+ });
+
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+ $.fn[NAME] = Button._jQueryInterface;
+ $.fn[NAME].Constructor = Button;
+ $.fn[NAME].noConflict = function () {
+ $.fn[NAME] = JQUERY_NO_CONFLICT;
+ return Button._jQueryInterface;
+ };
+
+ return Button;
+}(jQuery);
+
+/**
+ * --------------------------------------------------------------------------
+ * Bootstrap (v4.0.0-alpha.6): carousel.js
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * --------------------------------------------------------------------------
+ */
+
+var Carousel = function ($) {
+
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+
+ var NAME = 'carousel';
+ var VERSION = '4.0.0-alpha.6';
+ var DATA_KEY = 'bs.carousel';
+ var EVENT_KEY = '.' + DATA_KEY;
+ var DATA_API_KEY = '.data-api';
+ var JQUERY_NO_CONFLICT = $.fn[NAME];
+ var TRANSITION_DURATION = 600;
+ var ARROW_LEFT_KEYCODE = 37; // KeyboardEvent.which value for left arrow key
+ var ARROW_RIGHT_KEYCODE = 39; // KeyboardEvent.which value for right arrow key
+ var TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch
+
+ var Default = {
interval: 5000,
+ keyboard: true,
+ slide: false,
pause: 'hover',
- wrap: true,
- keyboard: true
- }
-
- Carousel.prototype.keydown = function (e) {
- if (/input|textarea/i.test(e.target.tagName)) return
- switch (e.which) {
- case 37: this.prev(); break
- case 39: this.next(); break
- default: return
+ wrap: true
+ };
+
+ var DefaultType = {
+ interval: '(number|boolean)',
+ keyboard: 'boolean',
+ slide: '(boolean|string)',
+ pause: '(string|boolean)',
+ wrap: 'boolean'
+ };
+
+ var Direction = {
+ NEXT: 'next',
+ PREV: 'prev',
+ LEFT: 'left',
+ RIGHT: 'right'
+ };
+
+ var Event = {
+ SLIDE: 'slide' + EVENT_KEY,
+ SLID: 'slid' + EVENT_KEY,
+ KEYDOWN: 'keydown' + EVENT_KEY,
+ MOUSEENTER: 'mouseenter' + EVENT_KEY,
+ MOUSELEAVE: 'mouseleave' + EVENT_KEY,
+ TOUCHEND: 'touchend' + EVENT_KEY,
+ LOAD_DATA_API: 'load' + EVENT_KEY + DATA_API_KEY,
+ CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY
+ };
+
+ var ClassName = {
+ CAROUSEL: 'carousel',
+ ACTIVE: 'active',
+ SLIDE: 'slide',
+ RIGHT: 'carousel-item-right',
+ LEFT: 'carousel-item-left',
+ NEXT: 'carousel-item-next',
+ PREV: 'carousel-item-prev',
+ ITEM: 'carousel-item'
+ };
+
+ var Selector = {
+ ACTIVE: '.active',
+ ACTIVE_ITEM: '.active.carousel-item',
+ ITEM: '.carousel-item',
+ NEXT_PREV: '.carousel-item-next, .carousel-item-prev',
+ INDICATORS: '.carousel-indicators',
+ DATA_SLIDE: '[data-slide], [data-slide-to]',
+ DATA_RIDE: '[data-ride="carousel"]'
+ };
+
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ var Carousel = function () {
+ function Carousel(element, config) {
+ _classCallCheck(this, Carousel);
+
+ this._items = null;
+ this._interval = null;
+ this._activeElement = null;
+
+ this._isPaused = false;
+ this._isSliding = false;
+
+ this.touchTimeout = null;
+
+ this._config = this._getConfig(config);
+ this._element = $(element)[0];
+ this._indicatorsElement = $(this._element).find(Selector.INDICATORS)[0];
+
+ this._addEventListeners();
}
- e.preventDefault()
- }
+ // getters
- Carousel.prototype.cycle = function (e) {
- e || (this.paused = false)
+ // public
- this.interval && clearInterval(this.interval)
+ Carousel.prototype.next = function next() {
+ if (!this._isSliding) {
+ this._slide(Direction.NEXT);
+ }
+ };
- this.options.interval
- && !this.paused
- && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
+ Carousel.prototype.nextWhenVisible = function nextWhenVisible() {
+ // Don't call next when the page isn't visible
+ if (!document.hidden) {
+ this.next();
+ }
+ };
- return this
- }
+ Carousel.prototype.prev = function prev() {
+ if (!this._isSliding) {
+ this._slide(Direction.PREV);
+ }
+ };
- Carousel.prototype.getItemIndex = function (item) {
- this.$items = item.parent().children('.item')
- return this.$items.index(item || this.$active)
- }
+ Carousel.prototype.pause = function pause(event) {
+ if (!event) {
+ this._isPaused = true;
+ }
- Carousel.prototype.getItemForDirection = function (direction, active) {
- var activeIndex = this.getItemIndex(active)
- var willWrap = (direction == 'prev' && activeIndex === 0)
- || (direction == 'next' && activeIndex == (this.$items.length - 1))
- if (willWrap && !this.options.wrap) return active
- var delta = direction == 'prev' ? -1 : 1
- var itemIndex = (activeIndex + delta) % this.$items.length
- return this.$items.eq(itemIndex)
- }
+ if ($(this._element).find(Selector.NEXT_PREV)[0] && Util.supportsTransitionEnd()) {
+ Util.triggerTransitionEnd(this._element);
+ this.cycle(true);
+ }
- Carousel.prototype.to = function (pos) {
- var that = this
- var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))
+ clearInterval(this._interval);
+ this._interval = null;
+ };
- if (pos > (this.$items.length - 1) || pos < 0) return
+ Carousel.prototype.cycle = function cycle(event) {
+ if (!event) {
+ this._isPaused = false;
+ }
- if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid"
- if (activeIndex == pos) return this.pause().cycle()
+ if (this._interval) {
+ clearInterval(this._interval);
+ this._interval = null;
+ }
- return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos))
- }
+ if (this._config.interval && !this._isPaused) {
+ this._interval = setInterval((document.visibilityState ? this.nextWhenVisible : this.next).bind(this), this._config.interval);
+ }
+ };
- Carousel.prototype.pause = function (e) {
- e || (this.paused = true)
+ Carousel.prototype.to = function to(index) {
+ var _this3 = this;
- if (this.$element.find('.next, .prev').length && $.support.transition) {
- this.$element.trigger($.support.transition.end)
- this.cycle(true)
- }
+ this._activeElement = $(this._element).find(Selector.ACTIVE_ITEM)[0];
- this.interval = clearInterval(this.interval)
+ var activeIndex = this._getItemIndex(this._activeElement);
- return this
- }
+ if (index > this._items.length - 1 || index < 0) {
+ return;
+ }
- Carousel.prototype.next = function () {
- if (this.sliding) return
- return this.slide('next')
- }
+ if (this._isSliding) {
+ $(this._element).one(Event.SLID, function () {
+ return _this3.to(index);
+ });
+ return;
+ }
- Carousel.prototype.prev = function () {
- if (this.sliding) return
- return this.slide('prev')
- }
+ if (activeIndex === index) {
+ this.pause();
+ this.cycle();
+ return;
+ }
- Carousel.prototype.slide = function (type, next) {
- var $active = this.$element.find('.item.active')
- var $next = next || this.getItemForDirection(type, $active)
- var isCycling = this.interval
- var direction = type == 'next' ? 'left' : 'right'
- var that = this
+ var direction = index > activeIndex ? Direction.NEXT : Direction.PREV;
- if ($next.hasClass('active')) return (this.sliding = false)
+ this._slide(direction, this._items[index]);
+ };
- var relatedTarget = $next[0]
- var slideEvent = $.Event('slide.bs.carousel', {
- relatedTarget: relatedTarget,
- direction: direction
- })
- this.$element.trigger(slideEvent)
- if (slideEvent.isDefaultPrevented()) return
+ Carousel.prototype.dispose = function dispose() {
+ $(this._element).off(EVENT_KEY);
+ $.removeData(this._element, DATA_KEY);
- this.sliding = true
+ this._items = null;
+ this._config = null;
+ this._element = null;
+ this._interval = null;
+ this._isPaused = null;
+ this._isSliding = null;
+ this._activeElement = null;
+ this._indicatorsElement = null;
+ };
- isCycling && this.pause()
+ // private
- if (this.$indicators.length) {
- this.$indicators.find('.active').removeClass('active')
- var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)])
- $nextIndicator && $nextIndicator.addClass('active')
- }
+ Carousel.prototype._getConfig = function _getConfig(config) {
+ config = $.extend({}, Default, config);
+ Util.typeCheckConfig(NAME, config, DefaultType);
+ return config;
+ };
- var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid"
- if ($.support.transition && this.$element.hasClass('slide')) {
- $next.addClass(type)
- $next[0].offsetWidth // force reflow
- $active.addClass(direction)
- $next.addClass(direction)
- $active
- .one('bsTransitionEnd', function () {
- $next.removeClass([type, direction].join(' ')).addClass('active')
- $active.removeClass(['active', direction].join(' '))
- that.sliding = false
- setTimeout(function () {
- that.$element.trigger(slidEvent)
- }, 0)
- })
- .emulateTransitionEnd(Carousel.TRANSITION_DURATION)
- } else {
- $active.removeClass('active')
- $next.addClass('active')
- this.sliding = false
- this.$element.trigger(slidEvent)
- }
+ Carousel.prototype._addEventListeners = function _addEventListeners() {
+ var _this4 = this;
- isCycling && this.cycle()
+ if (this._config.keyboard) {
+ $(this._element).on(Event.KEYDOWN, function (event) {
+ return _this4._keydown(event);
+ });
+ }
- return this
- }
+ if (this._config.pause === 'hover') {
+ $(this._element).on(Event.MOUSEENTER, function (event) {
+ return _this4.pause(event);
+ }).on(Event.MOUSELEAVE, function (event) {
+ return _this4.cycle(event);
+ });
+ if ('ontouchstart' in document.documentElement) {
+ // if it's a touch-enabled device, mouseenter/leave are fired as
+ // part of the mouse compatibility events on first tap - the carousel
+ // would stop cycling until user tapped out of it;
+ // here, we listen for touchend, explicitly pause the carousel
+ // (as if it's the second time we tap on it, mouseenter compat event
+ // is NOT fired) and after a timeout (to allow for mouse compatibility
+ // events to fire) we explicitly restart cycling
+ $(this._element).on(Event.TOUCHEND, function () {
+ _this4.pause();
+ if (_this4.touchTimeout) {
+ clearTimeout(_this4.touchTimeout);
+ }
+ _this4.touchTimeout = setTimeout(function (event) {
+ return _this4.cycle(event);
+ }, TOUCHEVENT_COMPAT_WAIT + _this4._config.interval);
+ });
+ }
+ }
+ };
+ Carousel.prototype._keydown = function _keydown(event) {
+ if (/input|textarea/i.test(event.target.tagName)) {
+ return;
+ }
- // CAROUSEL PLUGIN DEFINITION
- // ==========================
+ switch (event.which) {
+ case ARROW_LEFT_KEYCODE:
+ event.preventDefault();
+ this.prev();
+ break;
+ case ARROW_RIGHT_KEYCODE:
+ event.preventDefault();
+ this.next();
+ break;
+ default:
+ return;
+ }
+ };
+
+ Carousel.prototype._getItemIndex = function _getItemIndex(element) {
+ this._items = $.makeArray($(element).parent().find(Selector.ITEM));
+ return this._items.indexOf(element);
+ };
+
+ Carousel.prototype._getItemByDirection = function _getItemByDirection(direction, activeElement) {
+ var isNextDirection = direction === Direction.NEXT;
+ var isPrevDirection = direction === Direction.PREV;
+ var activeIndex = this._getItemIndex(activeElement);
+ var lastItemIndex = this._items.length - 1;
+ var isGoingToWrap = isPrevDirection && activeIndex === 0 || isNextDirection && activeIndex === lastItemIndex;
+
+ if (isGoingToWrap && !this._config.wrap) {
+ return activeElement;
+ }
- function Plugin(option) {
- return this.each(function () {
- var $this = $(this)
- var data = $this.data('bs.carousel')
- var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)
- var action = typeof option == 'string' ? option : options.slide
+ var delta = direction === Direction.PREV ? -1 : 1;
+ var itemIndex = (activeIndex + delta) % this._items.length;
- if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))
- if (typeof option == 'number') data.to(option)
- else if (action) data[action]()
- else if (options.interval) data.pause().cycle()
- })
- }
+ return itemIndex === -1 ? this._items[this._items.length - 1] : this._items[itemIndex];
+ };
- var old = $.fn.carousel
+ Carousel.prototype._triggerSlideEvent = function _triggerSlideEvent(relatedTarget, eventDirectionName) {
+ var targetIndex = this._getItemIndex(relatedTarget);
+ var fromIndex = this._getItemIndex($(this._element).find(Selector.ACTIVE_ITEM)[0]);
+ var slideEvent = $.Event(Event.SLIDE, {
+ relatedTarget: relatedTarget,
+ direction: eventDirectionName,
+ from: fromIndex,
+ to: targetIndex
+ });
- $.fn.carousel = Plugin
- $.fn.carousel.Constructor = Carousel
+ $(this._element).trigger(slideEvent);
+ return slideEvent;
+ };
- // CAROUSEL NO CONFLICT
- // ====================
+ Carousel.prototype._setActiveIndicatorElement = function _setActiveIndicatorElement(element) {
+ if (this._indicatorsElement) {
+ $(this._indicatorsElement).find(Selector.ACTIVE).removeClass(ClassName.ACTIVE);
- $.fn.carousel.noConflict = function () {
- $.fn.carousel = old
- return this
- }
+ var nextIndicator = this._indicatorsElement.children[this._getItemIndex(element)];
+ if (nextIndicator) {
+ $(nextIndicator).addClass(ClassName.ACTIVE);
+ }
+ }
+ };
- // CAROUSEL DATA-API
- // =================
+ Carousel.prototype._slide = function _slide(direction, element) {
+ var _this5 = this;
- var clickHandler = function (e) {
- var href
- var $this = $(this)
- var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7
- if (!$target.hasClass('carousel')) return
- var options = $.extend({}, $target.data(), $this.data())
- var slideIndex = $this.attr('data-slide-to')
- if (slideIndex) options.interval = false
+ var activeElement = $(this._element).find(Selector.ACTIVE_ITEM)[0];
+ var activeElementIndex = this._getItemIndex(activeElement);
+ var nextElement = element || activeElement && this._getItemByDirection(direction, activeElement);
+ var nextElementIndex = this._getItemIndex(nextElement);
+ var isCycling = Boolean(this._interval);
- Plugin.call($target, options)
+ var directionalClassName = void 0;
+ var orderClassName = void 0;
+ var eventDirectionName = void 0;
- if (slideIndex) {
- $target.data('bs.carousel').to(slideIndex)
- }
+ if (direction === Direction.NEXT) {
+ directionalClassName = ClassName.LEFT;
+ orderClassName = ClassName.NEXT;
+ eventDirectionName = Direction.LEFT;
+ } else {
+ directionalClassName = ClassName.RIGHT;
+ orderClassName = ClassName.PREV;
+ eventDirectionName = Direction.RIGHT;
+ }
- e.preventDefault()
- }
+ if (nextElement && $(nextElement).hasClass(ClassName.ACTIVE)) {
+ this._isSliding = false;
+ return;
+ }
- $(document)
- .on('click.bs.carousel.data-api', '[data-slide]', clickHandler)
- .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler)
+ var slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName);
+ if (slideEvent.isDefaultPrevented()) {
+ return;
+ }
- $(window).on('load', function () {
- $('[data-ride="carousel"]').each(function () {
- var $carousel = $(this)
- Plugin.call($carousel, $carousel.data())
- })
- })
+ if (!activeElement || !nextElement) {
+ // some weirdness is happening, so we bail
+ return;
+ }
-}(jQuery);
+ this._isSliding = true;
-/* ========================================================================
- * Bootstrap: collapse.js v3.3.7
- * http://getbootstrap.com/javascript/#collapse
- * ========================================================================
- * Copyright 2011-2016 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
+ if (isCycling) {
+ this.pause();
+ }
-/* jshint latedef: false */
+ this._setActiveIndicatorElement(nextElement);
-+function ($) {
- 'use strict';
+ var slidEvent = $.Event(Event.SLID, {
+ relatedTarget: nextElement,
+ direction: eventDirectionName,
+ from: activeElementIndex,
+ to: nextElementIndex
+ });
- // COLLAPSE PUBLIC CLASS DEFINITION
- // ================================
+ if (Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.SLIDE)) {
- var Collapse = function (element, options) {
- this.$element = $(element)
- this.options = $.extend({}, Collapse.DEFAULTS, options)
- this.$trigger = $('[data-toggle="collapse"][href="#' + element.id + '"],' +
- '[data-toggle="collapse"][data-target="#' + element.id + '"]')
- this.transitioning = null
+ $(nextElement).addClass(orderClassName);
- if (this.options.parent) {
- this.$parent = this.getParent()
- } else {
- this.addAriaAndCollapsedClass(this.$element, this.$trigger)
- }
+ Util.reflow(nextElement);
- if (this.options.toggle) this.toggle()
- }
+ $(activeElement).addClass(directionalClassName);
+ $(nextElement).addClass(directionalClassName);
- Collapse.VERSION = '3.3.7'
+ $(activeElement).one(Util.TRANSITION_END, function () {
+ $(nextElement).removeClass(directionalClassName + ' ' + orderClassName).addClass(ClassName.ACTIVE);
- Collapse.TRANSITION_DURATION = 350
+ $(activeElement).removeClass(ClassName.ACTIVE + ' ' + orderClassName + ' ' + directionalClassName);
- Collapse.DEFAULTS = {
- toggle: true
- }
+ _this5._isSliding = false;
- Collapse.prototype.dimension = function () {
- var hasWidth = this.$element.hasClass('width')
- return hasWidth ? 'width' : 'height'
- }
+ setTimeout(function () {
+ return $(_this5._element).trigger(slidEvent);
+ }, 0);
+ }).emulateTransitionEnd(TRANSITION_DURATION);
+ } else {
+ $(activeElement).removeClass(ClassName.ACTIVE);
+ $(nextElement).addClass(ClassName.ACTIVE);
- Collapse.prototype.show = function () {
- if (this.transitioning || this.$element.hasClass('in')) return
+ this._isSliding = false;
+ $(this._element).trigger(slidEvent);
+ }
- var activesData
- var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing')
+ if (isCycling) {
+ this.cycle();
+ }
+ };
- if (actives && actives.length) {
- activesData = actives.data('bs.collapse')
- if (activesData && activesData.transitioning) return
- }
+ // static
- var startEvent = $.Event('show.bs.collapse')
- this.$element.trigger(startEvent)
- if (startEvent.isDefaultPrevented()) return
+ Carousel._jQueryInterface = function _jQueryInterface(config) {
+ return this.each(function () {
+ var data = $(this).data(DATA_KEY);
+ var _config = $.extend({}, Default, $(this).data());
- if (actives && actives.length) {
- Plugin.call(actives, 'hide')
- activesData || actives.data('bs.collapse', null)
- }
+ if ((typeof config === 'undefined' ? 'undefined' : _typeof(config)) === 'object') {
+ $.extend(_config, config);
+ }
- var dimension = this.dimension()
+ var action = typeof config === 'string' ? config : _config.slide;
- this.$element
- .removeClass('collapse')
- .addClass('collapsing')[dimension](0)
- .attr('aria-expanded', true)
+ if (!data) {
+ data = new Carousel(this, _config);
+ $(this).data(DATA_KEY, data);
+ }
- this.$trigger
- .removeClass('collapsed')
- .attr('aria-expanded', true)
+ if (typeof config === 'number') {
+ data.to(config);
+ } else if (typeof action === 'string') {
+ if (data[action] === undefined) {
+ throw new Error('No method named "' + action + '"');
+ }
+ data[action]();
+ } else if (_config.interval) {
+ data.pause();
+ data.cycle();
+ }
+ });
+ };
- this.transitioning = 1
+ Carousel._dataApiClickHandler = function _dataApiClickHandler(event) {
+ var selector = Util.getSelectorFromElement(this);
- var complete = function () {
- this.$element
- .removeClass('collapsing')
- .addClass('collapse in')[dimension]('')
- this.transitioning = 0
- this.$element
- .trigger('shown.bs.collapse')
- }
+ if (!selector) {
+ return;
+ }
- if (!$.support.transition) return complete.call(this)
+ var target = $(selector)[0];
- var scrollSize = $.camelCase(['scroll', dimension].join('-'))
+ if (!target || !$(target).hasClass(ClassName.CAROUSEL)) {
+ return;
+ }
- this.$element
- .one('bsTransitionEnd', $.proxy(complete, this))
- .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize])
- }
+ var config = $.extend({}, $(target).data(), $(this).data());
+ var slideIndex = this.getAttribute('data-slide-to');
- Collapse.prototype.hide = function () {
- if (this.transitioning || !this.$element.hasClass('in')) return
+ if (slideIndex) {
+ config.interval = false;
+ }
- var startEvent = $.Event('hide.bs.collapse')
- this.$element.trigger(startEvent)
- if (startEvent.isDefaultPrevented()) return
+ Carousel._jQueryInterface.call($(target), config);
- var dimension = this.dimension()
+ if (slideIndex) {
+ $(target).data(DATA_KEY).to(slideIndex);
+ }
- this.$element[dimension](this.$element[dimension]())[0].offsetHeight
+ event.preventDefault();
+ };
- this.$element
- .addClass('collapsing')
- .removeClass('collapse in')
- .attr('aria-expanded', false)
+ _createClass(Carousel, null, [{
+ key: 'VERSION',
+ get: function get() {
+ return VERSION;
+ }
+ }, {
+ key: 'Default',
+ get: function get() {
+ return Default;
+ }
+ }]);
+
+ return Carousel;
+ }();
+
+ /**
+ * ------------------------------------------------------------------------
+ * Data Api implementation
+ * ------------------------------------------------------------------------
+ */
+
+ $(document).on(Event.CLICK_DATA_API, Selector.DATA_SLIDE, Carousel._dataApiClickHandler);
+
+ $(window).on(Event.LOAD_DATA_API, function () {
+ $(Selector.DATA_RIDE).each(function () {
+ var $carousel = $(this);
+ Carousel._jQueryInterface.call($carousel, $carousel.data());
+ });
+ });
+
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+ $.fn[NAME] = Carousel._jQueryInterface;
+ $.fn[NAME].Constructor = Carousel;
+ $.fn[NAME].noConflict = function () {
+ $.fn[NAME] = JQUERY_NO_CONFLICT;
+ return Carousel._jQueryInterface;
+ };
+
+ return Carousel;
+}(jQuery);
- this.$trigger
- .addClass('collapsed')
- .attr('aria-expanded', false)
+/**
+ * --------------------------------------------------------------------------
+ * Bootstrap (v4.0.0-alpha.6): collapse.js
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * --------------------------------------------------------------------------
+ */
- this.transitioning = 1
+var Collapse = function ($) {
+
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+
+ var NAME = 'collapse';
+ var VERSION = '4.0.0-alpha.6';
+ var DATA_KEY = 'bs.collapse';
+ var EVENT_KEY = '.' + DATA_KEY;
+ var DATA_API_KEY = '.data-api';
+ var JQUERY_NO_CONFLICT = $.fn[NAME];
+ var TRANSITION_DURATION = 600;
+
+ var Default = {
+ toggle: true,
+ parent: ''
+ };
+
+ var DefaultType = {
+ toggle: 'boolean',
+ parent: 'string'
+ };
+
+ var Event = {
+ SHOW: 'show' + EVENT_KEY,
+ SHOWN: 'shown' + EVENT_KEY,
+ HIDE: 'hide' + EVENT_KEY,
+ HIDDEN: 'hidden' + EVENT_KEY,
+ CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY
+ };
+
+ var ClassName = {
+ SHOW: 'show',
+ COLLAPSE: 'collapse',
+ COLLAPSING: 'collapsing',
+ COLLAPSED: 'collapsed'
+ };
+
+ var Dimension = {
+ WIDTH: 'width',
+ HEIGHT: 'height'
+ };
+
+ var Selector = {
+ ACTIVES: '.card > .show, .card > .collapsing',
+ DATA_TOGGLE: '[data-toggle="collapse"]',
+ DATA_CHILDREN: 'data-children'
+ };
+
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ var Collapse = function () {
+ function Collapse(element, config) {
+ _classCallCheck(this, Collapse);
+
+ this._isTransitioning = false;
+ this._element = element;
+ this._config = this._getConfig(config);
+ this._triggerArray = $.makeArray($('[data-toggle="collapse"][href="#' + element.id + '"],' + ('[data-toggle="collapse"][data-target="#' + element.id + '"]')));
+ this._parent = this._config.parent ? this._getParent() : null;
+
+ if (!this._config.parent) {
+ this._addAriaAndCollapsedClass(this._element, this._triggerArray);
+ }
+
+ this._selectorActives = Selector.ACTIVES;
+ if (this._parent) {
+ var childrenSelector = this._parent.hasAttribute(Selector.DATA_CHILDREN) ? this._parent.getAttribute(Selector.DATA_CHILDREN) : null;
+ if (childrenSelector !== null) {
+ this._selectorActives = childrenSelector + ' > .show, ' + childrenSelector + ' > .collapsing';
+ }
+ }
- var complete = function () {
- this.transitioning = 0
- this.$element
- .removeClass('collapsing')
- .addClass('collapse')
- .trigger('hidden.bs.collapse')
+ if (this._config.toggle) {
+ this.toggle();
+ }
}
- if (!$.support.transition) return complete.call(this)
+ // getters
- this.$element
- [dimension](0)
- .one('bsTransitionEnd', $.proxy(complete, this))
- .emulateTransitionEnd(Collapse.TRANSITION_DURATION)
- }
+ // public
- Collapse.prototype.toggle = function () {
- this[this.$element.hasClass('in') ? 'hide' : 'show']()
- }
+ Collapse.prototype.toggle = function toggle() {
+ if ($(this._element).hasClass(ClassName.SHOW)) {
+ this.hide();
+ } else {
+ this.show();
+ }
+ };
- Collapse.prototype.getParent = function () {
- return $(this.options.parent)
- .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]')
- .each($.proxy(function (i, element) {
- var $element = $(element)
- this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element)
- }, this))
- .end()
- }
+ Collapse.prototype.show = function show() {
+ var _this6 = this;
- Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) {
- var isOpen = $element.hasClass('in')
+ if (this._isTransitioning || $(this._element).hasClass(ClassName.SHOW)) {
+ return;
+ }
- $element.attr('aria-expanded', isOpen)
- $trigger
- .toggleClass('collapsed', !isOpen)
- .attr('aria-expanded', isOpen)
- }
+ var actives = void 0;
+ var activesData = void 0;
- function getTargetFromTrigger($trigger) {
- var href
- var target = $trigger.attr('data-target')
- || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7
+ if (this._parent) {
+ actives = $.makeArray($(this._parent).find(this._selectorActives));
+ if (!actives.length) {
+ actives = null;
+ }
+ }
- return $(target)
- }
+ if (actives) {
+ activesData = $(actives).data(DATA_KEY);
+ if (activesData && activesData._isTransitioning) {
+ return;
+ }
+ }
+ var startEvent = $.Event(Event.SHOW);
+ $(this._element).trigger(startEvent);
+ if (startEvent.isDefaultPrevented()) {
+ return;
+ }
- // COLLAPSE PLUGIN DEFINITION
- // ==========================
+ if (actives) {
+ Collapse._jQueryInterface.call($(actives), 'hide');
+ if (!activesData) {
+ $(actives).data(DATA_KEY, null);
+ }
+ }
- function Plugin(option) {
- return this.each(function () {
- var $this = $(this)
- var data = $this.data('bs.collapse')
- var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)
+ var dimension = this._getDimension();
- if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false
- if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
- if (typeof option == 'string') data[option]()
- })
- }
+ $(this._element).removeClass(ClassName.COLLAPSE).addClass(ClassName.COLLAPSING);
- var old = $.fn.collapse
+ this._element.style[dimension] = 0;
- $.fn.collapse = Plugin
- $.fn.collapse.Constructor = Collapse
+ if (this._triggerArray.length) {
+ $(this._triggerArray).removeClass(ClassName.COLLAPSED).attr('aria-expanded', true);
+ }
+ this.setTransitioning(true);
- // COLLAPSE NO CONFLICT
- // ====================
+ var complete = function complete() {
+ $(_this6._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).addClass(ClassName.SHOW);
- $.fn.collapse.noConflict = function () {
- $.fn.collapse = old
- return this
- }
+ _this6._element.style[dimension] = '';
+ _this6.setTransitioning(false);
- // COLLAPSE DATA-API
- // =================
+ $(_this6._element).trigger(Event.SHOWN);
+ };
- $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) {
- var $this = $(this)
+ if (!Util.supportsTransitionEnd()) {
+ complete();
+ return;
+ }
- if (!$this.attr('data-target')) e.preventDefault()
+ var capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);
+ var scrollSize = 'scroll' + capitalizedDimension;
- var $target = getTargetFromTrigger($this)
- var data = $target.data('bs.collapse')
- var option = data ? 'toggle' : $this.data()
+ $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION);
- Plugin.call($target, option)
- })
+ this._element.style[dimension] = this._element[scrollSize] + 'px';
+ };
-}(jQuery);
+ Collapse.prototype.hide = function hide() {
+ var _this7 = this;
-/* ========================================================================
- * Bootstrap: dropdown.js v3.3.7
- * http://getbootstrap.com/javascript/#dropdowns
- * ========================================================================
- * Copyright 2011-2016 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
+ if (this._isTransitioning || !$(this._element).hasClass(ClassName.SHOW)) {
+ return;
+ }
+ var startEvent = $.Event(Event.HIDE);
+ $(this._element).trigger(startEvent);
+ if (startEvent.isDefaultPrevented()) {
+ return;
+ }
-+function ($) {
- 'use strict';
+ var dimension = this._getDimension();
- // DROPDOWN CLASS DEFINITION
- // =========================
+ this._element.style[dimension] = this._element.getBoundingClientRect()[dimension] + 'px';
- var backdrop = '.dropdown-backdrop'
- var toggle = '[data-toggle="dropdown"]'
- var Dropdown = function (element) {
- $(element).on('click.bs.dropdown', this.toggle)
- }
+ Util.reflow(this._element);
- Dropdown.VERSION = '3.3.7'
+ $(this._element).addClass(ClassName.COLLAPSING).removeClass(ClassName.COLLAPSE).removeClass(ClassName.SHOW);
- function getParent($this) {
- var selector = $this.attr('data-target')
+ if (this._triggerArray.length) {
+ $(this._triggerArray).addClass(ClassName.COLLAPSED).attr('aria-expanded', false);
+ }
- if (!selector) {
- selector = $this.attr('href')
- selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
- }
+ this.setTransitioning(true);
- var $parent = selector && $(selector)
+ var complete = function complete() {
+ _this7.setTransitioning(false);
+ $(_this7._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).trigger(Event.HIDDEN);
+ };
- return $parent && $parent.length ? $parent : $this.parent()
- }
+ this._element.style[dimension] = '';
- function clearMenus(e) {
- if (e && e.which === 3) return
- $(backdrop).remove()
- $(toggle).each(function () {
- var $this = $(this)
- var $parent = getParent($this)
- var relatedTarget = { relatedTarget: this }
+ if (!Util.supportsTransitionEnd()) {
+ complete();
+ return;
+ }
- if (!$parent.hasClass('open')) return
+ $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION);
+ };
- if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return
+ Collapse.prototype.setTransitioning = function setTransitioning(isTransitioning) {
+ this._isTransitioning = isTransitioning;
+ };
- $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))
+ Collapse.prototype.dispose = function dispose() {
+ $.removeData(this._element, DATA_KEY);
- if (e.isDefaultPrevented()) return
+ this._config = null;
+ this._parent = null;
+ this._element = null;
+ this._triggerArray = null;
+ this._isTransitioning = null;
+ };
- $this.attr('aria-expanded', 'false')
- $parent.removeClass('open').trigger($.Event('hidden.bs.dropdown', relatedTarget))
- })
- }
+ // private
- Dropdown.prototype.toggle = function (e) {
- var $this = $(this)
+ Collapse.prototype._getConfig = function _getConfig(config) {
+ config = $.extend({}, Default, config);
+ config.toggle = Boolean(config.toggle); // coerce string values
+ Util.typeCheckConfig(NAME, config, DefaultType);
+ return config;
+ };
- if ($this.is('.disabled, :disabled')) return
+ Collapse.prototype._getDimension = function _getDimension() {
+ var hasWidth = $(this._element).hasClass(Dimension.WIDTH);
+ return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT;
+ };
- var $parent = getParent($this)
- var isActive = $parent.hasClass('open')
+ Collapse.prototype._getParent = function _getParent() {
+ var _this8 = this;
- clearMenus()
+ var parent = $(this._config.parent)[0];
+ var selector = '[data-toggle="collapse"][data-parent="' + this._config.parent + '"]';
- if (!isActive) {
- if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {
- // if mobile we use a backdrop because click events don't delegate
- $(document.createElement('div'))
- .addClass('dropdown-backdrop')
- .insertAfter($(this))
- .on('click', clearMenus)
+ $(parent).find(selector).each(function (i, element) {
+ _this8._addAriaAndCollapsedClass(Collapse._getTargetFromElement(element), [element]);
+ });
+
+ return parent;
+ };
+
+ Collapse.prototype._addAriaAndCollapsedClass = function _addAriaAndCollapsedClass(element, triggerArray) {
+ if (element) {
+ var isOpen = $(element).hasClass(ClassName.SHOW);
+
+ if (triggerArray.length) {
+ $(triggerArray).toggleClass(ClassName.COLLAPSED, !isOpen).attr('aria-expanded', isOpen);
+ }
}
+ };
+
+ // static
+
+ Collapse._getTargetFromElement = function _getTargetFromElement(element) {
+ var selector = Util.getSelectorFromElement(element);
+ return selector ? $(selector)[0] : null;
+ };
+
+ Collapse._jQueryInterface = function _jQueryInterface(config) {
+ return this.each(function () {
+ var $this = $(this);
+ var data = $this.data(DATA_KEY);
+ var _config = $.extend({}, Default, $this.data(), (typeof config === 'undefined' ? 'undefined' : _typeof(config)) === 'object' && config);
+
+ if (!data && _config.toggle && /show|hide/.test(config)) {
+ _config.toggle = false;
+ }
- var relatedTarget = { relatedTarget: this }
- $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))
+ if (!data) {
+ data = new Collapse(this, _config);
+ $this.data(DATA_KEY, data);
+ }
- if (e.isDefaultPrevented()) return
+ if (typeof config === 'string') {
+ if (data[config] === undefined) {
+ throw new Error('No method named "' + config + '"');
+ }
+ data[config]();
+ }
+ });
+ };
- $this
- .trigger('focus')
- .attr('aria-expanded', 'true')
+ _createClass(Collapse, null, [{
+ key: 'VERSION',
+ get: function get() {
+ return VERSION;
+ }
+ }, {
+ key: 'Default',
+ get: function get() {
+ return Default;
+ }
+ }]);
- $parent
- .toggleClass('open')
- .trigger($.Event('shown.bs.dropdown', relatedTarget))
+ return Collapse;
+ }();
+
+ /**
+ * ------------------------------------------------------------------------
+ * Data Api implementation
+ * ------------------------------------------------------------------------
+ */
+
+ $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
+ if (!/input|textarea/i.test(event.target.tagName)) {
+ event.preventDefault();
}
- return false
- }
+ var target = Collapse._getTargetFromElement(this);
+ var data = $(target).data(DATA_KEY);
+ var config = data ? 'toggle' : $(this).data();
- Dropdown.prototype.keydown = function (e) {
- if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return
+ Collapse._jQueryInterface.call($(target), config);
+ });
- var $this = $(this)
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
- e.preventDefault()
- e.stopPropagation()
+ $.fn[NAME] = Collapse._jQueryInterface;
+ $.fn[NAME].Constructor = Collapse;
+ $.fn[NAME].noConflict = function () {
+ $.fn[NAME] = JQUERY_NO_CONFLICT;
+ return Collapse._jQueryInterface;
+ };
- if ($this.is('.disabled, :disabled')) return
+ return Collapse;
+}(jQuery);
- var $parent = getParent($this)
- var isActive = $parent.hasClass('open')
+/**
+ * --------------------------------------------------------------------------
+ * Bootstrap (v4.0.0-alpha.6): dropdown.js
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * --------------------------------------------------------------------------
+ */
- if (!isActive && e.which != 27 || isActive && e.which == 27) {
- if (e.which == 27) $parent.find(toggle).trigger('focus')
- return $this.trigger('click')
+var Dropdown = function ($) {
+
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+
+ var NAME = 'dropdown';
+ var VERSION = '4.0.0-alpha.6';
+ var DATA_KEY = 'bs.dropdown';
+ var EVENT_KEY = '.' + DATA_KEY;
+ var DATA_API_KEY = '.data-api';
+ var JQUERY_NO_CONFLICT = $.fn[NAME];
+ var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key
+ var SPACE_KEYCODE = 32; // KeyboardEvent.which value for space key
+ var TAB_KEYCODE = 9; // KeyboardEvent.which value for tab key
+ var ARROW_UP_KEYCODE = 38; // KeyboardEvent.which value for up arrow key
+ var ARROW_DOWN_KEYCODE = 40; // KeyboardEvent.which value for down arrow key
+ var RIGHT_MOUSE_BUTTON_WHICH = 3; // MouseEvent.which value for the right button (assuming a right-handed mouse)
+ var REGEXP_KEYDOWN = new RegExp(ARROW_UP_KEYCODE + '|' + ARROW_DOWN_KEYCODE + '|' + ESCAPE_KEYCODE);
+
+ var Event = {
+ HIDE: 'hide' + EVENT_KEY,
+ HIDDEN: 'hidden' + EVENT_KEY,
+ SHOW: 'show' + EVENT_KEY,
+ SHOWN: 'shown' + EVENT_KEY,
+ CLICK: 'click' + EVENT_KEY,
+ CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY,
+ KEYDOWN_DATA_API: 'keydown' + EVENT_KEY + DATA_API_KEY,
+ KEYUP_DATA_API: 'keyup' + EVENT_KEY + DATA_API_KEY
+ };
+
+ var ClassName = {
+ DISABLED: 'disabled',
+ SHOW: 'show'
+ };
+
+ var Selector = {
+ DATA_TOGGLE: '[data-toggle="dropdown"]',
+ FORM_CHILD: '.dropdown form',
+ MENU: '.dropdown-menu',
+ NAVBAR_NAV: '.navbar-nav',
+ VISIBLE_ITEMS: '.dropdown-menu .dropdown-item:not(.disabled)'
+ };
+
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ var Dropdown = function () {
+ function Dropdown(element) {
+ _classCallCheck(this, Dropdown);
+
+ this._element = element;
+
+ this._addEventListeners();
}
- var desc = ' li:not(.disabled):visible a'
- var $items = $parent.find('.dropdown-menu' + desc)
+ // getters
- if (!$items.length) return
+ // public
- var index = $items.index(e.target)
+ Dropdown.prototype.toggle = function toggle() {
+ if (this.disabled || $(this).hasClass(ClassName.DISABLED)) {
+ return false;
+ }
- if (e.which == 38 && index > 0) index-- // up
- if (e.which == 40 && index < $items.length - 1) index++ // down
- if (!~index) index = 0
+ var parent = Dropdown._getParentFromElement(this);
+ var isActive = $(parent).hasClass(ClassName.SHOW);
- $items.eq(index).trigger('focus')
- }
+ Dropdown._clearMenus();
+ if (isActive) {
+ return false;
+ }
- // DROPDOWN PLUGIN DEFINITION
- // ==========================
+ var relatedTarget = {
+ relatedTarget: this
+ };
+ var showEvent = $.Event(Event.SHOW, relatedTarget);
- function Plugin(option) {
- return this.each(function () {
- var $this = $(this)
- var data = $this.data('bs.dropdown')
+ $(parent).trigger(showEvent);
- if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))
- if (typeof option == 'string') data[option].call($this)
- })
- }
+ if (showEvent.isDefaultPrevented()) {
+ return false;
+ }
+
+ // if this is a touch-enabled device we add extra
+ // empty mouseover listeners to the body's immediate children;
+ // only needed because of broken event delegation on iOS
+ // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
+ if ('ontouchstart' in document.documentElement && !$(parent).closest(Selector.NAVBAR_NAV).length) {
+ $('body').children().on('mouseover', null, $.noop);
+ }
- var old = $.fn.dropdown
+ this.focus();
+ this.setAttribute('aria-expanded', true);
- $.fn.dropdown = Plugin
- $.fn.dropdown.Constructor = Dropdown
+ $(parent).toggleClass(ClassName.SHOW);
+ $(parent).trigger($.Event(Event.SHOWN, relatedTarget));
+ return false;
+ };
- // DROPDOWN NO CONFLICT
- // ====================
+ Dropdown.prototype.dispose = function dispose() {
+ $.removeData(this._element, DATA_KEY);
+ $(this._element).off(EVENT_KEY);
+ this._element = null;
+ };
- $.fn.dropdown.noConflict = function () {
- $.fn.dropdown = old
- return this
- }
+ // private
+ Dropdown.prototype._addEventListeners = function _addEventListeners() {
+ $(this._element).on(Event.CLICK, this.toggle);
+ };
- // APPLY TO STANDARD DROPDOWN ELEMENTS
- // ===================================
+ // static
- $(document)
- .on('click.bs.dropdown.data-api', clearMenus)
- .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
- .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)
- .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown)
- .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown)
+ Dropdown._jQueryInterface = function _jQueryInterface(config) {
+ return this.each(function () {
+ var data = $(this).data(DATA_KEY);
-}(jQuery);
+ if (!data) {
+ data = new Dropdown(this);
+ $(this).data(DATA_KEY, data);
+ }
-/* ========================================================================
- * Bootstrap: modal.js v3.3.7
- * http://getbootstrap.com/javascript/#modals
- * ========================================================================
- * Copyright 2011-2016 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
-
-
-+function ($) {
- 'use strict';
-
- // MODAL CLASS DEFINITION
- // ======================
-
- var Modal = function (element, options) {
- this.options = options
- this.$body = $(document.body)
- this.$element = $(element)
- this.$dialog = this.$element.find('.modal-dialog')
- this.$backdrop = null
- this.isShown = null
- this.originalBodyPad = null
- this.scrollbarWidth = 0
- this.ignoreBackdropClick = false
-
- if (this.options.remote) {
- this.$element
- .find('.modal-content')
- .load(this.options.remote, $.proxy(function () {
- this.$element.trigger('loaded.bs.modal')
- }, this))
- }
- }
+ if (typeof config === 'string') {
+ if (data[config] === undefined) {
+ throw new Error('No method named "' + config + '"');
+ }
+ data[config].call(this);
+ }
+ });
+ };
- Modal.VERSION = '3.3.7'
+ Dropdown._clearMenus = function _clearMenus(event) {
+ if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH || event.type === 'keyup' && event.which !== TAB_KEYCODE)) {
+ return;
+ }
- Modal.TRANSITION_DURATION = 300
- Modal.BACKDROP_TRANSITION_DURATION = 150
+ var toggles = $.makeArray($(Selector.DATA_TOGGLE));
- Modal.DEFAULTS = {
- backdrop: true,
- keyboard: true,
- show: true
- }
+ for (var i = 0; i < toggles.length; i++) {
+ var parent = Dropdown._getParentFromElement(toggles[i]);
+ var relatedTarget = {
+ relatedTarget: toggles[i]
+ };
- Modal.prototype.toggle = function (_relatedTarget) {
- return this.isShown ? this.hide() : this.show(_relatedTarget)
- }
+ if (!$(parent).hasClass(ClassName.SHOW)) {
+ continue;
+ }
+
+ if (event && (event.type === 'click' && /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) && $.contains(parent, event.target)) {
+ continue;
+ }
- Modal.prototype.show = function (_relatedTarget) {
- var that = this
- var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
+ var hideEvent = $.Event(Event.HIDE, relatedTarget);
+ $(parent).trigger(hideEvent);
+ if (hideEvent.isDefaultPrevented()) {
+ continue;
+ }
- this.$element.trigger(e)
+ // if this is a touch-enabled device we remove the extra
+ // empty mouseover listeners we added for iOS support
+ if ('ontouchstart' in document.documentElement) {
+ $('body').children().off('mouseover', null, $.noop);
+ }
- if (this.isShown || e.isDefaultPrevented()) return
+ toggles[i].setAttribute('aria-expanded', 'false');
- this.isShown = true
+ $(parent).removeClass(ClassName.SHOW).trigger($.Event(Event.HIDDEN, relatedTarget));
+ }
+ };
- this.checkScrollbar()
- this.setScrollbar()
- this.$body.addClass('modal-open')
+ Dropdown._getParentFromElement = function _getParentFromElement(element) {
+ var parent = void 0;
+ var selector = Util.getSelectorFromElement(element);
- this.escape()
- this.resize()
+ if (selector) {
+ parent = $(selector)[0];
+ }
- this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))
+ return parent || element.parentNode;
+ };
- this.$dialog.on('mousedown.dismiss.bs.modal', function () {
- that.$element.one('mouseup.dismiss.bs.modal', function (e) {
- if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true
- })
- })
+ Dropdown._dataApiKeydownHandler = function _dataApiKeydownHandler(event) {
+ if (!REGEXP_KEYDOWN.test(event.which) || /button/i.test(event.target.tagName) && event.which === SPACE_KEYCODE || /input|textarea/i.test(event.target.tagName)) {
+ return;
+ }
- this.backdrop(function () {
- var transition = $.support.transition && that.$element.hasClass('fade')
+ event.preventDefault();
+ event.stopPropagation();
- if (!that.$element.parent().length) {
- that.$element.appendTo(that.$body) // don't move modals dom position
+ if (this.disabled || $(this).hasClass(ClassName.DISABLED)) {
+ return;
}
- that.$element
- .show()
- .scrollTop(0)
+ var parent = Dropdown._getParentFromElement(this);
+ var isActive = $(parent).hasClass(ClassName.SHOW);
- that.adjustDialog()
+ if (!isActive && (event.which !== ESCAPE_KEYCODE || event.which !== SPACE_KEYCODE) || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {
- if (transition) {
- that.$element[0].offsetWidth // force reflow
+ if (event.which === ESCAPE_KEYCODE) {
+ var toggle = $(parent).find(Selector.DATA_TOGGLE)[0];
+ $(toggle).trigger('focus');
+ }
+
+ $(this).trigger('click');
+ return;
}
- that.$element.addClass('in')
+ var items = $(parent).find(Selector.VISIBLE_ITEMS).get();
- that.enforceFocus()
+ if (!items.length) {
+ return;
+ }
- var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })
+ var index = items.indexOf(event.target);
- transition ?
- that.$dialog // wait for modal to slide in
- .one('bsTransitionEnd', function () {
- that.$element.trigger('focus').trigger(e)
- })
- .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
- that.$element.trigger('focus').trigger(e)
- })
- }
+ if (event.which === ARROW_UP_KEYCODE && index > 0) {
+ // up
+ index--;
+ }
- Modal.prototype.hide = function (e) {
- if (e) e.preventDefault()
+ if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) {
+ // down
+ index++;
+ }
- e = $.Event('hide.bs.modal')
+ if (index < 0) {
+ index = 0;
+ }
- this.$element.trigger(e)
+ items[index].focus();
+ };
- if (!this.isShown || e.isDefaultPrevented()) return
+ _createClass(Dropdown, null, [{
+ key: 'VERSION',
+ get: function get() {
+ return VERSION;
+ }
+ }]);
+
+ return Dropdown;
+ }();
+
+ /**
+ * ------------------------------------------------------------------------
+ * Data Api implementation
+ * ------------------------------------------------------------------------
+ */
+
+ $(document).on(Event.KEYDOWN_DATA_API, Selector.DATA_TOGGLE, Dropdown._dataApiKeydownHandler).on(Event.KEYDOWN_DATA_API, Selector.MENU, Dropdown._dataApiKeydownHandler).on(Event.CLICK_DATA_API + ' ' + Event.KEYUP_DATA_API, Dropdown._clearMenus).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, Dropdown.prototype.toggle).on(Event.CLICK_DATA_API, Selector.FORM_CHILD, function (e) {
+ e.stopPropagation();
+ });
+
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+ $.fn[NAME] = Dropdown._jQueryInterface;
+ $.fn[NAME].Constructor = Dropdown;
+ $.fn[NAME].noConflict = function () {
+ $.fn[NAME] = JQUERY_NO_CONFLICT;
+ return Dropdown._jQueryInterface;
+ };
+
+ return Dropdown;
+}(jQuery);
- this.isShown = false
+/**
+ * --------------------------------------------------------------------------
+ * Bootstrap (v4.0.0-alpha.6): modal.js
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * --------------------------------------------------------------------------
+ */
- this.escape()
- this.resize()
+var Modal = function ($) {
+
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+
+ var NAME = 'modal';
+ var VERSION = '4.0.0-alpha.6';
+ var DATA_KEY = 'bs.modal';
+ var EVENT_KEY = '.' + DATA_KEY;
+ var DATA_API_KEY = '.data-api';
+ var JQUERY_NO_CONFLICT = $.fn[NAME];
+ var TRANSITION_DURATION = 300;
+ var BACKDROP_TRANSITION_DURATION = 150;
+ var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key
+
+ var Default = {
+ backdrop: true,
+ keyboard: true,
+ focus: true,
+ show: true
+ };
+
+ var DefaultType = {
+ backdrop: '(boolean|string)',
+ keyboard: 'boolean',
+ focus: 'boolean',
+ show: 'boolean'
+ };
+
+ var Event = {
+ HIDE: 'hide' + EVENT_KEY,
+ HIDDEN: 'hidden' + EVENT_KEY,
+ SHOW: 'show' + EVENT_KEY,
+ SHOWN: 'shown' + EVENT_KEY,
+ FOCUSIN: 'focusin' + EVENT_KEY,
+ RESIZE: 'resize' + EVENT_KEY,
+ CLICK_DISMISS: 'click.dismiss' + EVENT_KEY,
+ KEYDOWN_DISMISS: 'keydown.dismiss' + EVENT_KEY,
+ MOUSEUP_DISMISS: 'mouseup.dismiss' + EVENT_KEY,
+ MOUSEDOWN_DISMISS: 'mousedown.dismiss' + EVENT_KEY,
+ CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY
+ };
+
+ var ClassName = {
+ SCROLLBAR_MEASURER: 'modal-scrollbar-measure',
+ BACKDROP: 'modal-backdrop',
+ OPEN: 'modal-open',
+ FADE: 'fade',
+ SHOW: 'show'
+ };
+
+ var Selector = {
+ DIALOG: '.modal-dialog',
+ DATA_TOGGLE: '[data-toggle="modal"]',
+ DATA_DISMISS: '[data-dismiss="modal"]',
+ FIXED_CONTENT: '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top',
+ NAVBAR_TOGGLER: '.navbar-toggler'
+ };
+
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ var Modal = function () {
+ function Modal(element, config) {
+ _classCallCheck(this, Modal);
+
+ this._config = this._getConfig(config);
+ this._element = element;
+ this._dialog = $(element).find(Selector.DIALOG)[0];
+ this._backdrop = null;
+ this._isShown = false;
+ this._isBodyOverflowing = false;
+ this._ignoreBackdropClick = false;
+ this._originalBodyPadding = 0;
+ this._scrollbarWidth = 0;
+ }
- $(document).off('focusin.bs.modal')
+ // getters
- this.$element
- .removeClass('in')
- .off('click.dismiss.bs.modal')
- .off('mouseup.dismiss.bs.modal')
+ // public
- this.$dialog.off('mousedown.dismiss.bs.modal')
+ Modal.prototype.toggle = function toggle(relatedTarget) {
+ return this._isShown ? this.hide() : this.show(relatedTarget);
+ };
- $.support.transition && this.$element.hasClass('fade') ?
- this.$element
- .one('bsTransitionEnd', $.proxy(this.hideModal, this))
- .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
- this.hideModal()
- }
+ Modal.prototype.show = function show(relatedTarget) {
+ var _this9 = this;
- Modal.prototype.enforceFocus = function () {
- $(document)
- .off('focusin.bs.modal') // guard against infinite focus loop
- .on('focusin.bs.modal', $.proxy(function (e) {
- if (document !== e.target &&
- this.$element[0] !== e.target &&
- !this.$element.has(e.target).length) {
- this.$element.trigger('focus')
- }
- }, this))
- }
+ if (this._isTransitioning) {
+ return;
+ }
- Modal.prototype.escape = function () {
- if (this.isShown && this.options.keyboard) {
- this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {
- e.which == 27 && this.hide()
- }, this))
- } else if (!this.isShown) {
- this.$element.off('keydown.dismiss.bs.modal')
- }
- }
+ if (Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE)) {
+ this._isTransitioning = true;
+ }
- Modal.prototype.resize = function () {
- if (this.isShown) {
- $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this))
- } else {
- $(window).off('resize.bs.modal')
- }
- }
+ var showEvent = $.Event(Event.SHOW, {
+ relatedTarget: relatedTarget
+ });
- Modal.prototype.hideModal = function () {
- var that = this
- this.$element.hide()
- this.backdrop(function () {
- that.$body.removeClass('modal-open')
- that.resetAdjustments()
- that.resetScrollbar()
- that.$element.trigger('hidden.bs.modal')
- })
- }
+ $(this._element).trigger(showEvent);
- Modal.prototype.removeBackdrop = function () {
- this.$backdrop && this.$backdrop.remove()
- this.$backdrop = null
- }
+ if (this._isShown || showEvent.isDefaultPrevented()) {
+ return;
+ }
- Modal.prototype.backdrop = function (callback) {
- var that = this
- var animate = this.$element.hasClass('fade') ? 'fade' : ''
+ this._isShown = true;
- if (this.isShown && this.options.backdrop) {
- var doAnimate = $.support.transition && animate
+ this._checkScrollbar();
+ this._setScrollbar();
- this.$backdrop = $(document.createElement('div'))
- .addClass('modal-backdrop ' + animate)
- .appendTo(this.$body)
+ $(document.body).addClass(ClassName.OPEN);
- this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {
- if (this.ignoreBackdropClick) {
- this.ignoreBackdropClick = false
- return
- }
- if (e.target !== e.currentTarget) return
- this.options.backdrop == 'static'
- ? this.$element[0].focus()
- : this.hide()
- }, this))
+ this._setEscapeEvent();
+ this._setResizeEvent();
- if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
+ $(this._element).on(Event.CLICK_DISMISS, Selector.DATA_DISMISS, function (event) {
+ return _this9.hide(event);
+ });
- this.$backdrop.addClass('in')
+ $(this._dialog).on(Event.MOUSEDOWN_DISMISS, function () {
+ $(_this9._element).one(Event.MOUSEUP_DISMISS, function (event) {
+ if ($(event.target).is(_this9._element)) {
+ _this9._ignoreBackdropClick = true;
+ }
+ });
+ });
- if (!callback) return
+ this._showBackdrop(function () {
+ return _this9._showElement(relatedTarget);
+ });
+ };
- doAnimate ?
- this.$backdrop
- .one('bsTransitionEnd', callback)
- .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
- callback()
+ Modal.prototype.hide = function hide(event) {
+ var _this10 = this;
- } else if (!this.isShown && this.$backdrop) {
- this.$backdrop.removeClass('in')
+ if (event) {
+ event.preventDefault();
+ }
- var callbackRemove = function () {
- that.removeBackdrop()
- callback && callback()
+ if (this._isTransitioning || !this._isShown) {
+ return;
}
- $.support.transition && this.$element.hasClass('fade') ?
- this.$backdrop
- .one('bsTransitionEnd', callbackRemove)
- .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
- callbackRemove()
- } else if (callback) {
- callback()
- }
- }
+ var transition = Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE);
- // these following methods are used to handle overflowing modals
+ if (transition) {
+ this._isTransitioning = true;
+ }
- Modal.prototype.handleUpdate = function () {
- this.adjustDialog()
- }
+ var hideEvent = $.Event(Event.HIDE);
- Modal.prototype.adjustDialog = function () {
- var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight
+ $(this._element).trigger(hideEvent);
- this.$element.css({
- paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '',
- paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : ''
- })
- }
+ if (!this._isShown || hideEvent.isDefaultPrevented()) {
+ return;
+ }
- Modal.prototype.resetAdjustments = function () {
- this.$element.css({
- paddingLeft: '',
- paddingRight: ''
- })
- }
+ this._isShown = false;
- Modal.prototype.checkScrollbar = function () {
- var fullWindowWidth = window.innerWidth
- if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8
- var documentElementRect = document.documentElement.getBoundingClientRect()
- fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left)
- }
- this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth
- this.scrollbarWidth = this.measureScrollbar()
- }
+ this._setEscapeEvent();
+ this._setResizeEvent();
- Modal.prototype.setScrollbar = function () {
- var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)
- this.originalBodyPad = document.body.style.paddingRight || ''
- if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)
- }
+ $(document).off(Event.FOCUSIN);
- Modal.prototype.resetScrollbar = function () {
- this.$body.css('padding-right', this.originalBodyPad)
- }
+ $(this._element).removeClass(ClassName.SHOW);
- Modal.prototype.measureScrollbar = function () { // thx walsh
- var scrollDiv = document.createElement('div')
- scrollDiv.className = 'modal-scrollbar-measure'
- this.$body.append(scrollDiv)
- var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth
- this.$body[0].removeChild(scrollDiv)
- return scrollbarWidth
- }
+ $(this._element).off(Event.CLICK_DISMISS);
+ $(this._dialog).off(Event.MOUSEDOWN_DISMISS);
+ if (transition) {
- // MODAL PLUGIN DEFINITION
- // =======================
+ $(this._element).one(Util.TRANSITION_END, function (event) {
+ return _this10._hideModal(event);
+ }).emulateTransitionEnd(TRANSITION_DURATION);
+ } else {
+ this._hideModal();
+ }
+ };
- function Plugin(option, _relatedTarget) {
- return this.each(function () {
- var $this = $(this)
- var data = $this.data('bs.modal')
- var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)
+ Modal.prototype.dispose = function dispose() {
+ $.removeData(this._element, DATA_KEY);
- if (!data) $this.data('bs.modal', (data = new Modal(this, options)))
- if (typeof option == 'string') data[option](_relatedTarget)
- else if (options.show) data.show(_relatedTarget)
- })
- }
+ $(window, document, this._element, this._backdrop).off(EVENT_KEY);
- var old = $.fn.modal
+ this._config = null;
+ this._element = null;
+ this._dialog = null;
+ this._backdrop = null;
+ this._isShown = null;
+ this._isBodyOverflowing = null;
+ this._ignoreBackdropClick = null;
+ this._scrollbarWidth = null;
+ };
- $.fn.modal = Plugin
- $.fn.modal.Constructor = Modal
+ Modal.prototype.handleUpdate = function handleUpdate() {
+ this._adjustDialog();
+ };
+ // private
- // MODAL NO CONFLICT
- // =================
+ Modal.prototype._getConfig = function _getConfig(config) {
+ config = $.extend({}, Default, config);
+ Util.typeCheckConfig(NAME, config, DefaultType);
+ return config;
+ };
- $.fn.modal.noConflict = function () {
- $.fn.modal = old
- return this
- }
+ Modal.prototype._showElement = function _showElement(relatedTarget) {
+ var _this11 = this;
+ var transition = Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE);
- // MODAL DATA-API
- // ==============
+ if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {
+ // don't move modals dom position
+ document.body.appendChild(this._element);
+ }
- $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
- var $this = $(this)
- var href = $this.attr('href')
- var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7
- var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
+ this._element.style.display = 'block';
+ this._element.removeAttribute('aria-hidden');
+ this._element.scrollTop = 0;
- if ($this.is('a')) e.preventDefault()
+ if (transition) {
+ Util.reflow(this._element);
+ }
- $target.one('show.bs.modal', function (showEvent) {
- if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown
- $target.one('hidden.bs.modal', function () {
- $this.is(':visible') && $this.trigger('focus')
- })
- })
- Plugin.call($target, option, this)
- })
+ $(this._element).addClass(ClassName.SHOW);
-}(jQuery);
+ if (this._config.focus) {
+ this._enforceFocus();
+ }
-/* ========================================================================
- * Bootstrap: tooltip.js v3.3.7
- * http://getbootstrap.com/javascript/#tooltip
- * Inspired by the original jQuery.tipsy by Jason Frame
- * ========================================================================
- * Copyright 2011-2016 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
+ var shownEvent = $.Event(Event.SHOWN, {
+ relatedTarget: relatedTarget
+ });
+ var transitionComplete = function transitionComplete() {
+ if (_this11._config.focus) {
+ _this11._element.focus();
+ }
+ _this11._isTransitioning = false;
+ $(_this11._element).trigger(shownEvent);
+ };
-+function ($) {
- 'use strict';
+ if (transition) {
+ $(this._dialog).one(Util.TRANSITION_END, transitionComplete).emulateTransitionEnd(TRANSITION_DURATION);
+ } else {
+ transitionComplete();
+ }
+ };
+
+ Modal.prototype._enforceFocus = function _enforceFocus() {
+ var _this12 = this;
- // TOOLTIP PUBLIC CLASS DEFINITION
- // ===============================
+ $(document).off(Event.FOCUSIN) // guard against infinite focus loop
+ .on(Event.FOCUSIN, function (event) {
+ if (document !== event.target && _this12._element !== event.target && !$(_this12._element).has(event.target).length) {
+ _this12._element.focus();
+ }
+ });
+ };
+
+ Modal.prototype._setEscapeEvent = function _setEscapeEvent() {
+ var _this13 = this;
+
+ if (this._isShown && this._config.keyboard) {
+ $(this._element).on(Event.KEYDOWN_DISMISS, function (event) {
+ if (event.which === ESCAPE_KEYCODE) {
+ event.preventDefault();
+ _this13.hide();
+ }
+ });
+ } else if (!this._isShown) {
+ $(this._element).off(Event.KEYDOWN_DISMISS);
+ }
+ };
- var Tooltip = function (element, options) {
- this.type = null
- this.options = null
- this.enabled = null
- this.timeout = null
- this.hoverState = null
- this.$element = null
- this.inState = null
+ Modal.prototype._setResizeEvent = function _setResizeEvent() {
+ var _this14 = this;
- this.init('tooltip', element, options)
- }
+ if (this._isShown) {
+ $(window).on(Event.RESIZE, function (event) {
+ return _this14.handleUpdate(event);
+ });
+ } else {
+ $(window).off(Event.RESIZE);
+ }
+ };
+
+ Modal.prototype._hideModal = function _hideModal() {
+ var _this15 = this;
+
+ this._element.style.display = 'none';
+ this._element.setAttribute('aria-hidden', true);
+ this._isTransitioning = false;
+ this._showBackdrop(function () {
+ $(document.body).removeClass(ClassName.OPEN);
+ _this15._resetAdjustments();
+ _this15._resetScrollbar();
+ $(_this15._element).trigger(Event.HIDDEN);
+ });
+ };
+
+ Modal.prototype._removeBackdrop = function _removeBackdrop() {
+ if (this._backdrop) {
+ $(this._backdrop).remove();
+ this._backdrop = null;
+ }
+ };
- Tooltip.VERSION = '3.3.7'
+ Modal.prototype._showBackdrop = function _showBackdrop(callback) {
+ var _this16 = this;
- Tooltip.TRANSITION_DURATION = 150
+ var animate = $(this._element).hasClass(ClassName.FADE) ? ClassName.FADE : '';
- Tooltip.DEFAULTS = {
- animation: true,
- placement: 'top',
- selector: false,
- template: '<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',
- trigger: 'hover focus',
- title: '',
- delay: 0,
- html: false,
- container: false,
- viewport: {
- selector: 'body',
- padding: 0
- }
- }
+ if (this._isShown && this._config.backdrop) {
+ var doAnimate = Util.supportsTransitionEnd() && animate;
- Tooltip.prototype.init = function (type, element, options) {
- this.enabled = true
- this.type = type
- this.$element = $(element)
- this.options = this.getOptions(options)
- this.$viewport = this.options.viewport && $($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport))
- this.inState = { click: false, hover: false, focus: false }
+ this._backdrop = document.createElement('div');
+ this._backdrop.className = ClassName.BACKDROP;
- if (this.$element[0] instanceof document.constructor && !this.options.selector) {
- throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!')
- }
+ if (animate) {
+ $(this._backdrop).addClass(animate);
+ }
- var triggers = this.options.trigger.split(' ')
+ $(this._backdrop).appendTo(document.body);
+
+ $(this._element).on(Event.CLICK_DISMISS, function (event) {
+ if (_this16._ignoreBackdropClick) {
+ _this16._ignoreBackdropClick = false;
+ return;
+ }
+ if (event.target !== event.currentTarget) {
+ return;
+ }
+ if (_this16._config.backdrop === 'static') {
+ _this16._element.focus();
+ } else {
+ _this16.hide();
+ }
+ });
+
+ if (doAnimate) {
+ Util.reflow(this._backdrop);
+ }
+
+ $(this._backdrop).addClass(ClassName.SHOW);
- for (var i = triggers.length; i--;) {
- var trigger = triggers[i]
+ if (!callback) {
+ return;
+ }
- if (trigger == 'click') {
- this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
- } else if (trigger != 'manual') {
- var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin'
- var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'
+ if (!doAnimate) {
+ callback();
+ return;
+ }
- this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
- this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
+ $(this._backdrop).one(Util.TRANSITION_END, callback).emulateTransitionEnd(BACKDROP_TRANSITION_DURATION);
+ } else if (!this._isShown && this._backdrop) {
+ $(this._backdrop).removeClass(ClassName.SHOW);
+
+ var callbackRemove = function callbackRemove() {
+ _this16._removeBackdrop();
+ if (callback) {
+ callback();
+ }
+ };
+
+ if (Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE)) {
+ $(this._backdrop).one(Util.TRANSITION_END, callbackRemove).emulateTransitionEnd(BACKDROP_TRANSITION_DURATION);
+ } else {
+ callbackRemove();
+ }
+ } else if (callback) {
+ callback();
}
- }
+ };
- this.options.selector ?
- (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
- this.fixTitle()
- }
+ // ----------------------------------------------------------------------
+ // the following methods are used to handle overflowing modals
+ // todo (fat): these should probably be refactored out of modal.js
+ // ----------------------------------------------------------------------
- Tooltip.prototype.getDefaults = function () {
- return Tooltip.DEFAULTS
- }
+ Modal.prototype._adjustDialog = function _adjustDialog() {
+ var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
- Tooltip.prototype.getOptions = function (options) {
- options = $.extend({}, this.getDefaults(), this.$element.data(), options)
+ if (!this._isBodyOverflowing && isModalOverflowing) {
+ this._element.style.paddingLeft = this._scrollbarWidth + 'px';
+ }
- if (options.delay && typeof options.delay == 'number') {
- options.delay = {
- show: options.delay,
- hide: options.delay
+ if (this._isBodyOverflowing && !isModalOverflowing) {
+ this._element.style.paddingRight = this._scrollbarWidth + 'px';
}
- }
+ };
+
+ Modal.prototype._resetAdjustments = function _resetAdjustments() {
+ this._element.style.paddingLeft = '';
+ this._element.style.paddingRight = '';
+ };
+
+ Modal.prototype._checkScrollbar = function _checkScrollbar() {
+ this._isBodyOverflowing = document.body.clientWidth < window.innerWidth;
+ this._scrollbarWidth = this._getScrollbarWidth();
+ };
+
+ Modal.prototype._setScrollbar = function _setScrollbar() {
+ var _this17 = this;
+
+ if (this._isBodyOverflowing) {
+ // Note: DOMNode.style.paddingRight returns the actual value or '' if not set
+ // while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set
+
+ // Adjust fixed content padding
+ $(Selector.FIXED_CONTENT).each(function (index, element) {
+ var actualPadding = $(element)[0].style.paddingRight;
+ var calculatedPadding = $(element).css('padding-right');
+ $(element).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + _this17._scrollbarWidth + 'px');
+ });
+
+ // Adjust navbar-toggler margin
+ $(Selector.NAVBAR_TOGGLER).each(function (index, element) {
+ var actualMargin = $(element)[0].style.marginRight;
+ var calculatedMargin = $(element).css('margin-right');
+ $(element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) + _this17._scrollbarWidth + 'px');
+ });
+
+ // Adjust body padding
+ var actualPadding = document.body.style.paddingRight;
+ var calculatedPadding = $('body').css('padding-right');
+ $('body').data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + this._scrollbarWidth + 'px');
+ }
+ };
+
+ Modal.prototype._resetScrollbar = function _resetScrollbar() {
+ // Restore fixed content padding
+ $(Selector.FIXED_CONTENT).each(function (index, element) {
+ var padding = $(element).data('padding-right');
+ if (typeof padding !== 'undefined') {
+ $(element).css('padding-right', padding).removeData('padding-right');
+ }
+ });
- return options
- }
+ // Restore navbar-toggler margin
+ $(Selector.NAVBAR_TOGGLER).each(function (index, element) {
+ var margin = $(element).data('margin-right');
+ if (typeof margin !== 'undefined') {
+ $(element).css('margin-right', margin).removeData('margin-right');
+ }
+ });
- Tooltip.prototype.getDelegateOptions = function () {
- var options = {}
- var defaults = this.getDefaults()
+ // Restore body padding
+ var padding = $('body').data('padding-right');
+ if (typeof padding !== 'undefined') {
+ $('body').css('padding-right', padding).removeData('padding-right');
+ }
+ };
+
+ Modal.prototype._getScrollbarWidth = function _getScrollbarWidth() {
+ // thx d.walsh
+ var scrollDiv = document.createElement('div');
+ scrollDiv.className = ClassName.SCROLLBAR_MEASURER;
+ document.body.appendChild(scrollDiv);
+ var scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth;
+ document.body.removeChild(scrollDiv);
+ return scrollbarWidth;
+ };
+
+ // static
+
+ Modal._jQueryInterface = function _jQueryInterface(config, relatedTarget) {
+ return this.each(function () {
+ var data = $(this).data(DATA_KEY);
+ var _config = $.extend({}, Modal.Default, $(this).data(), (typeof config === 'undefined' ? 'undefined' : _typeof(config)) === 'object' && config);
+
+ if (!data) {
+ data = new Modal(this, _config);
+ $(this).data(DATA_KEY, data);
+ }
- this._options && $.each(this._options, function (key, value) {
- if (defaults[key] != value) options[key] = value
- })
+ if (typeof config === 'string') {
+ if (data[config] === undefined) {
+ throw new Error('No method named "' + config + '"');
+ }
+ data[config](relatedTarget);
+ } else if (_config.show) {
+ data.show(relatedTarget);
+ }
+ });
+ };
- return options
- }
+ _createClass(Modal, null, [{
+ key: 'VERSION',
+ get: function get() {
+ return VERSION;
+ }
+ }, {
+ key: 'Default',
+ get: function get() {
+ return Default;
+ }
+ }]);
- Tooltip.prototype.enter = function (obj) {
- var self = obj instanceof this.constructor ?
- obj : $(obj.currentTarget).data('bs.' + this.type)
+ return Modal;
+ }();
- if (!self) {
- self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
- $(obj.currentTarget).data('bs.' + this.type, self)
- }
+ /**
+ * ------------------------------------------------------------------------
+ * Data Api implementation
+ * ------------------------------------------------------------------------
+ */
- if (obj instanceof $.Event) {
- self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true
- }
+ $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
+ var _this18 = this;
+
+ var target = void 0;
+ var selector = Util.getSelectorFromElement(this);
- if (self.tip().hasClass('in') || self.hoverState == 'in') {
- self.hoverState = 'in'
- return
+ if (selector) {
+ target = $(selector)[0];
}
- clearTimeout(self.timeout)
+ var config = $(target).data(DATA_KEY) ? 'toggle' : $.extend({}, $(target).data(), $(this).data());
- self.hoverState = 'in'
+ if (this.tagName === 'A' || this.tagName === 'AREA') {
+ event.preventDefault();
+ }
- if (!self.options.delay || !self.options.delay.show) return self.show()
+ var $target = $(target).one(Event.SHOW, function (showEvent) {
+ if (showEvent.isDefaultPrevented()) {
+ // only register focus restorer if modal will actually get shown
+ return;
+ }
- self.timeout = setTimeout(function () {
- if (self.hoverState == 'in') self.show()
- }, self.options.delay.show)
- }
+ $target.one(Event.HIDDEN, function () {
+ if ($(_this18).is(':visible')) {
+ _this18.focus();
+ }
+ });
+ });
+
+ Modal._jQueryInterface.call($(target), config, this);
+ });
+
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+ $.fn[NAME] = Modal._jQueryInterface;
+ $.fn[NAME].Constructor = Modal;
+ $.fn[NAME].noConflict = function () {
+ $.fn[NAME] = JQUERY_NO_CONFLICT;
+ return Modal._jQueryInterface;
+ };
+
+ return Modal;
+}(jQuery);
- Tooltip.prototype.isInStateTrue = function () {
- for (var key in this.inState) {
- if (this.inState[key]) return true
+/**
+ * --------------------------------------------------------------------------
+ * Bootstrap (v4.0.0-alpha.6): scrollspy.js
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * --------------------------------------------------------------------------
+ */
+
+var ScrollSpy = function ($) {
+
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+
+ var NAME = 'scrollspy';
+ var VERSION = '4.0.0-alpha.6';
+ var DATA_KEY = 'bs.scrollspy';
+ var EVENT_KEY = '.' + DATA_KEY;
+ var DATA_API_KEY = '.data-api';
+ var JQUERY_NO_CONFLICT = $.fn[NAME];
+
+ var Default = {
+ offset: 10,
+ method: 'auto',
+ target: ''
+ };
+
+ var DefaultType = {
+ offset: 'number',
+ method: 'string',
+ target: '(string|element)'
+ };
+
+ var Event = {
+ ACTIVATE: 'activate' + EVENT_KEY,
+ SCROLL: 'scroll' + EVENT_KEY,
+ LOAD_DATA_API: 'load' + EVENT_KEY + DATA_API_KEY
+ };
+
+ var ClassName = {
+ DROPDOWN_ITEM: 'dropdown-item',
+ DROPDOWN_MENU: 'dropdown-menu',
+ ACTIVE: 'active'
+ };
+
+ var Selector = {
+ DATA_SPY: '[data-spy="scroll"]',
+ ACTIVE: '.active',
+ NAV_LIST_GROUP: '.nav, .list-group',
+ NAV_LINKS: '.nav-link',
+ LIST_ITEMS: '.list-group-item',
+ DROPDOWN: '.dropdown',
+ DROPDOWN_ITEMS: '.dropdown-item',
+ DROPDOWN_TOGGLE: '.dropdown-toggle'
+ };
+
+ var OffsetMethod = {
+ OFFSET: 'offset',
+ POSITION: 'position'
+ };
+
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ var ScrollSpy = function () {
+ function ScrollSpy(element, config) {
+ var _this19 = this;
+
+ _classCallCheck(this, ScrollSpy);
+
+ this._element = element;
+ this._scrollElement = element.tagName === 'BODY' ? window : element;
+ this._config = this._getConfig(config);
+ this._selector = this._config.target + ' ' + Selector.NAV_LINKS + ',' + (this._config.target + ' ' + Selector.LIST_ITEMS + ',') + (this._config.target + ' ' + Selector.DROPDOWN_ITEMS);
+ this._offsets = [];
+ this._targets = [];
+ this._activeTarget = null;
+ this._scrollHeight = 0;
+
+ $(this._scrollElement).on(Event.SCROLL, function (event) {
+ return _this19._process(event);
+ });
+
+ this.refresh();
+ this._process();
}
- return false
- }
+ // getters
- Tooltip.prototype.leave = function (obj) {
- var self = obj instanceof this.constructor ?
- obj : $(obj.currentTarget).data('bs.' + this.type)
+ // public
- if (!self) {
- self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
- $(obj.currentTarget).data('bs.' + this.type, self)
- }
+ ScrollSpy.prototype.refresh = function refresh() {
+ var _this20 = this;
- if (obj instanceof $.Event) {
- self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false
- }
+ var autoMethod = this._scrollElement !== this._scrollElement.window ? OffsetMethod.POSITION : OffsetMethod.OFFSET;
- if (self.isInStateTrue()) return
+ var offsetMethod = this._config.method === 'auto' ? autoMethod : this._config.method;
- clearTimeout(self.timeout)
+ var offsetBase = offsetMethod === OffsetMethod.POSITION ? this._getScrollTop() : 0;
- self.hoverState = 'out'
+ this._offsets = [];
+ this._targets = [];
- if (!self.options.delay || !self.options.delay.hide) return self.hide()
+ this._scrollHeight = this._getScrollHeight();
- self.timeout = setTimeout(function () {
- if (self.hoverState == 'out') self.hide()
- }, self.options.delay.hide)
- }
+ var targets = $.makeArray($(this._selector));
- Tooltip.prototype.show = function () {
- var e = $.Event('show.bs.' + this.type)
+ targets.map(function (element) {
+ var target = void 0;
+ var targetSelector = Util.getSelectorFromElement(element);
- if (this.hasContent() && this.enabled) {
- this.$element.trigger(e)
+ if (targetSelector) {
+ target = $(targetSelector)[0];
+ }
- var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0])
- if (e.isDefaultPrevented() || !inDom) return
- var that = this
+ if (target) {
+ var targetBCR = target.getBoundingClientRect();
+ if (targetBCR.width || targetBCR.height) {
+ // todo (fat): remove sketch reliance on jQuery position/offset
+ return [$(target)[offsetMethod]().top + offsetBase, targetSelector];
+ }
+ }
+ return null;
+ }).filter(function (item) {
+ return item;
+ }).sort(function (a, b) {
+ return a[0] - b[0];
+ }).forEach(function (item) {
+ _this20._offsets.push(item[0]);
+ _this20._targets.push(item[1]);
+ });
+ };
+
+ ScrollSpy.prototype.dispose = function dispose() {
+ $.removeData(this._element, DATA_KEY);
+ $(this._scrollElement).off(EVENT_KEY);
+
+ this._element = null;
+ this._scrollElement = null;
+ this._config = null;
+ this._selector = null;
+ this._offsets = null;
+ this._targets = null;
+ this._activeTarget = null;
+ this._scrollHeight = null;
+ };
+
+ // private
+
+ ScrollSpy.prototype._getConfig = function _getConfig(config) {
+ config = $.extend({}, Default, config);
+
+ if (typeof config.target !== 'string') {
+ var id = $(config.target).attr('id');
+ if (!id) {
+ id = Util.getUID(NAME);
+ $(config.target).attr('id', id);
+ }
+ config.target = '#' + id;
+ }
- var $tip = this.tip()
+ Util.typeCheckConfig(NAME, config, DefaultType);
- var tipId = this.getUID(this.type)
+ return config;
+ };
- this.setContent()
- $tip.attr('id', tipId)
- this.$element.attr('aria-describedby', tipId)
+ ScrollSpy.prototype._getScrollTop = function _getScrollTop() {
+ return this._scrollElement === window ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop;
+ };
- if (this.options.animation) $tip.addClass('fade')
+ ScrollSpy.prototype._getScrollHeight = function _getScrollHeight() {
+ return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight);
+ };
- var placement = typeof this.options.placement == 'function' ?
- this.options.placement.call(this, $tip[0], this.$element[0]) :
- this.options.placement
+ ScrollSpy.prototype._getOffsetHeight = function _getOffsetHeight() {
+ return this._scrollElement === window ? window.innerHeight : this._scrollElement.getBoundingClientRect().height;
+ };
- var autoToken = /\s?auto?\s?/i
- var autoPlace = autoToken.test(placement)
- if (autoPlace) placement = placement.replace(autoToken, '') || 'top'
+ ScrollSpy.prototype._process = function _process() {
+ var scrollTop = this._getScrollTop() + this._config.offset;
+ var scrollHeight = this._getScrollHeight();
+ var maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight();
- $tip
- .detach()
- .css({ top: 0, left: 0, display: 'block' })
- .addClass(placement)
- .data('bs.' + this.type, this)
+ if (this._scrollHeight !== scrollHeight) {
+ this.refresh();
+ }
- this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
- this.$element.trigger('inserted.bs.' + this.type)
+ if (scrollTop >= maxScroll) {
+ var target = this._targets[this._targets.length - 1];
- var pos = this.getPosition()
- var actualWidth = $tip[0].offsetWidth
- var actualHeight = $tip[0].offsetHeight
+ if (this._activeTarget !== target) {
+ this._activate(target);
+ }
+ return;
+ }
- if (autoPlace) {
- var orgPlacement = placement
- var viewportDim = this.getPosition(this.$viewport)
+ if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {
+ this._activeTarget = null;
+ this._clear();
+ return;
+ }
- placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top' :
- placement == 'top' && pos.top - actualHeight < viewportDim.top ? 'bottom' :
- placement == 'right' && pos.right + actualWidth > viewportDim.width ? 'left' :
- placement == 'left' && pos.left - actualWidth < viewportDim.left ? 'right' :
- placement
+ for (var i = this._offsets.length; i--;) {
+ var isActiveTarget = this._activeTarget !== this._targets[i] && scrollTop >= this._offsets[i] && (this._offsets[i + 1] === undefined || scrollTop < this._offsets[i + 1]);
- $tip
- .removeClass(orgPlacement)
- .addClass(placement)
+ if (isActiveTarget) {
+ this._activate(this._targets[i]);
+ }
}
+ };
- var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)
+ ScrollSpy.prototype._activate = function _activate(target) {
+ this._activeTarget = target;
- this.applyPlacement(calculatedOffset, placement)
+ this._clear();
- var complete = function () {
- var prevHoverState = that.hoverState
- that.$element.trigger('shown.bs.' + that.type)
- that.hoverState = null
+ var queries = this._selector.split(',');
+ queries = queries.map(function (selector) {
+ return selector + '[data-target="' + target + '"],' + (selector + '[href="' + target + '"]');
+ });
- if (prevHoverState == 'out') that.leave(that)
- }
+ var $link = $(queries.join(','));
- $.support.transition && this.$tip.hasClass('fade') ?
- $tip
- .one('bsTransitionEnd', complete)
- .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
- complete()
- }
- }
+ if ($link.hasClass(ClassName.DROPDOWN_ITEM)) {
+ $link.closest(Selector.DROPDOWN).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE);
+ $link.addClass(ClassName.ACTIVE);
+ } else {
+ // Set triggered link as active
+ $link.addClass(ClassName.ACTIVE);
+ // Set triggered links parents as active
+ // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor
+ $link.parents(Selector.NAV_LIST_GROUP).prev(Selector.NAV_LINKS + ', ' + Selector.LIST_ITEMS).addClass(ClassName.ACTIVE);
+ }
- Tooltip.prototype.applyPlacement = function (offset, placement) {
- var $tip = this.tip()
- var width = $tip[0].offsetWidth
- var height = $tip[0].offsetHeight
+ $(this._scrollElement).trigger(Event.ACTIVATE, {
+ relatedTarget: target
+ });
+ };
- // manually read margins because getBoundingClientRect includes difference
- var marginTop = parseInt($tip.css('margin-top'), 10)
- var marginLeft = parseInt($tip.css('margin-left'), 10)
+ ScrollSpy.prototype._clear = function _clear() {
+ $(this._selector).filter(Selector.ACTIVE).removeClass(ClassName.ACTIVE);
+ };
- // we must check for NaN for ie 8/9
- if (isNaN(marginTop)) marginTop = 0
- if (isNaN(marginLeft)) marginLeft = 0
+ // static
- offset.top += marginTop
- offset.left += marginLeft
+ ScrollSpy._jQueryInterface = function _jQueryInterface(config) {
+ return this.each(function () {
+ var data = $(this).data(DATA_KEY);
+ var _config = (typeof config === 'undefined' ? 'undefined' : _typeof(config)) === 'object' && config;
- // $.fn.offset doesn't round pixel values
- // so we use setOffset directly with our own function B-0
- $.offset.setOffset($tip[0], $.extend({
- using: function (props) {
- $tip.css({
- top: Math.round(props.top),
- left: Math.round(props.left)
- })
- }
- }, offset), 0)
+ if (!data) {
+ data = new ScrollSpy(this, _config);
+ $(this).data(DATA_KEY, data);
+ }
- $tip.addClass('in')
+ if (typeof config === 'string') {
+ if (data[config] === undefined) {
+ throw new Error('No method named "' + config + '"');
+ }
+ data[config]();
+ }
+ });
+ };
- // check to see if placing tip in new offset caused the tip to resize itself
- var actualWidth = $tip[0].offsetWidth
- var actualHeight = $tip[0].offsetHeight
+ _createClass(ScrollSpy, null, [{
+ key: 'VERSION',
+ get: function get() {
+ return VERSION;
+ }
+ }, {
+ key: 'Default',
+ get: function get() {
+ return Default;
+ }
+ }]);
- if (placement == 'top' && actualHeight != height) {
- offset.top = offset.top + height - actualHeight
- }
+ return ScrollSpy;
+ }();
- var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)
+ /**
+ * ------------------------------------------------------------------------
+ * Data Api implementation
+ * ------------------------------------------------------------------------
+ */
- if (delta.left) offset.left += delta.left
- else offset.top += delta.top
+ $(window).on(Event.LOAD_DATA_API, function () {
+ var scrollSpys = $.makeArray($(Selector.DATA_SPY));
- var isVertical = /top|bottom/.test(placement)
- var arrowDelta = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight
- var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight'
+ for (var i = scrollSpys.length; i--;) {
+ var $spy = $(scrollSpys[i]);
+ ScrollSpy._jQueryInterface.call($spy, $spy.data());
+ }
+ });
+
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+ $.fn[NAME] = ScrollSpy._jQueryInterface;
+ $.fn[NAME].Constructor = ScrollSpy;
+ $.fn[NAME].noConflict = function () {
+ $.fn[NAME] = JQUERY_NO_CONFLICT;
+ return ScrollSpy._jQueryInterface;
+ };
+
+ return ScrollSpy;
+}(jQuery);
- $tip.offset(offset)
- this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical)
- }
+/**
+ * --------------------------------------------------------------------------
+ * Bootstrap (v4.0.0-alpha.6): tab.js
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * --------------------------------------------------------------------------
+ */
- Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) {
- this.arrow()
- .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%')
- .css(isVertical ? 'top' : 'left', '')
- }
+var Tab = function ($) {
+
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+
+ var NAME = 'tab';
+ var VERSION = '4.0.0-alpha.6';
+ var DATA_KEY = 'bs.tab';
+ var EVENT_KEY = '.' + DATA_KEY;
+ var DATA_API_KEY = '.data-api';
+ var JQUERY_NO_CONFLICT = $.fn[NAME];
+ var TRANSITION_DURATION = 150;
+
+ var Event = {
+ HIDE: 'hide' + EVENT_KEY,
+ HIDDEN: 'hidden' + EVENT_KEY,
+ SHOW: 'show' + EVENT_KEY,
+ SHOWN: 'shown' + EVENT_KEY,
+ CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY
+ };
+
+ var ClassName = {
+ DROPDOWN_MENU: 'dropdown-menu',
+ ACTIVE: 'active',
+ DISABLED: 'disabled',
+ FADE: 'fade',
+ SHOW: 'show'
+ };
+
+ var Selector = {
+ DROPDOWN: '.dropdown',
+ NAV_LIST_GROUP: '.nav, .list-group',
+ ACTIVE: '.active',
+ DATA_TOGGLE: '[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',
+ DROPDOWN_TOGGLE: '.dropdown-toggle',
+ DROPDOWN_ACTIVE_CHILD: '> .dropdown-menu .active'
+ };
+
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ var Tab = function () {
+ function Tab(element) {
+ _classCallCheck(this, Tab);
+
+ this._element = element;
+ }
- Tooltip.prototype.setContent = function () {
- var $tip = this.tip()
- var title = this.getTitle()
+ // getters
- $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
- $tip.removeClass('fade in top bottom left right')
- }
+ // public
- Tooltip.prototype.hide = function (callback) {
- var that = this
- var $tip = $(this.$tip)
- var e = $.Event('hide.bs.' + this.type)
+ Tab.prototype.show = function show() {
+ var _this21 = this;
- function complete() {
- if (that.hoverState != 'in') $tip.detach()
- if (that.$element) { // TODO: Check whether guarding this code with this `if` is really necessary.
- that.$element
- .removeAttr('aria-describedby')
- .trigger('hidden.bs.' + that.type)
+ if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && $(this._element).hasClass(ClassName.ACTIVE) || $(this._element).hasClass(ClassName.DISABLED)) {
+ return;
}
- callback && callback()
- }
- this.$element.trigger(e)
+ var target = void 0;
+ var previous = void 0;
+ var listElement = $(this._element).closest(Selector.NAV_LIST_GROUP)[0];
+ var selector = Util.getSelectorFromElement(this._element);
- if (e.isDefaultPrevented()) return
-
- $tip.removeClass('in')
+ if (listElement) {
+ previous = $.makeArray($(listElement).find(Selector.ACTIVE));
+ previous = previous[previous.length - 1];
+ }
- $.support.transition && $tip.hasClass('fade') ?
- $tip
- .one('bsTransitionEnd', complete)
- .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
- complete()
+ var hideEvent = $.Event(Event.HIDE, {
+ relatedTarget: this._element
+ });
- this.hoverState = null
+ var showEvent = $.Event(Event.SHOW, {
+ relatedTarget: previous
+ });
- return this
- }
+ if (previous) {
+ $(previous).trigger(hideEvent);
+ }
- Tooltip.prototype.fixTitle = function () {
- var $e = this.$element
- if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') {
- $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
- }
- }
+ $(this._element).trigger(showEvent);
- Tooltip.prototype.hasContent = function () {
- return this.getTitle()
- }
+ if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) {
+ return;
+ }
- Tooltip.prototype.getPosition = function ($element) {
- $element = $element || this.$element
+ if (selector) {
+ target = $(selector)[0];
+ }
- var el = $element[0]
- var isBody = el.tagName == 'BODY'
+ this._activate(this._element, listElement);
- var elRect = el.getBoundingClientRect()
- if (elRect.width == null) {
- // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093
- elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top })
- }
- var isSvg = window.SVGElement && el instanceof window.SVGElement
- // Avoid using $.offset() on SVGs since it gives incorrect results in jQuery 3.
- // See https://github.com/twbs/bootstrap/issues/20280
- var elOffset = isBody ? { top: 0, left: 0 } : (isSvg ? null : $element.offset())
- var scroll = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() }
- var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null
-
- return $.extend({}, elRect, scroll, outerDims, elOffset)
- }
+ var complete = function complete() {
+ var hiddenEvent = $.Event(Event.HIDDEN, {
+ relatedTarget: _this21._element
+ });
- Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
- return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } :
- placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } :
- placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :
- /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }
+ var shownEvent = $.Event(Event.SHOWN, {
+ relatedTarget: previous
+ });
- }
+ $(previous).trigger(hiddenEvent);
+ $(_this21._element).trigger(shownEvent);
+ };
- Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {
- var delta = { top: 0, left: 0 }
- if (!this.$viewport) return delta
-
- var viewportPadding = this.options.viewport && this.options.viewport.padding || 0
- var viewportDimensions = this.getPosition(this.$viewport)
-
- if (/right|left/.test(placement)) {
- var topEdgeOffset = pos.top - viewportPadding - viewportDimensions.scroll
- var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight
- if (topEdgeOffset < viewportDimensions.top) { // top overflow
- delta.top = viewportDimensions.top - topEdgeOffset
- } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow
- delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset
- }
- } else {
- var leftEdgeOffset = pos.left - viewportPadding
- var rightEdgeOffset = pos.left + viewportPadding + actualWidth
- if (leftEdgeOffset < viewportDimensions.left) { // left overflow
- delta.left = viewportDimensions.left - leftEdgeOffset
- } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow
- delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset
+ if (target) {
+ this._activate(target, target.parentNode, complete);
+ } else {
+ complete();
}
- }
+ };
- return delta
- }
+ Tab.prototype.dispose = function dispose() {
+ $.removeClass(this._element, DATA_KEY);
+ this._element = null;
+ };
- Tooltip.prototype.getTitle = function () {
- var title
- var $e = this.$element
- var o = this.options
+ // private
- title = $e.attr('data-original-title')
- || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title)
+ Tab.prototype._activate = function _activate(element, container, callback) {
+ var _this22 = this;
- return title
- }
+ var active = $(container).find(Selector.ACTIVE)[0];
+ var isTransitioning = callback && Util.supportsTransitionEnd() && active && $(active).hasClass(ClassName.FADE);
- Tooltip.prototype.getUID = function (prefix) {
- do prefix += ~~(Math.random() * 1000000)
- while (document.getElementById(prefix))
- return prefix
- }
+ var complete = function complete() {
+ return _this22._transitionComplete(element, active, isTransitioning, callback);
+ };
- Tooltip.prototype.tip = function () {
- if (!this.$tip) {
- this.$tip = $(this.options.template)
- if (this.$tip.length != 1) {
- throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!')
+ if (active && isTransitioning) {
+ $(active).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION);
+ } else {
+ complete();
}
- }
- return this.$tip
- }
- Tooltip.prototype.arrow = function () {
- return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))
- }
+ if (active) {
+ $(active).removeClass(ClassName.SHOW);
+ }
+ };
- Tooltip.prototype.enable = function () {
- this.enabled = true
- }
+ Tab.prototype._transitionComplete = function _transitionComplete(element, active, isTransitioning, callback) {
+ if (active) {
+ $(active).removeClass(ClassName.ACTIVE);
- Tooltip.prototype.disable = function () {
- this.enabled = false
- }
+ var dropdownChild = $(active.parentNode).find(Selector.DROPDOWN_ACTIVE_CHILD)[0];
- Tooltip.prototype.toggleEnabled = function () {
- this.enabled = !this.enabled
- }
+ if (dropdownChild) {
+ $(dropdownChild).removeClass(ClassName.ACTIVE);
+ }
- Tooltip.prototype.toggle = function (e) {
- var self = this
- if (e) {
- self = $(e.currentTarget).data('bs.' + this.type)
- if (!self) {
- self = new this.constructor(e.currentTarget, this.getDelegateOptions())
- $(e.currentTarget).data('bs.' + this.type, self)
+ active.setAttribute('aria-expanded', false);
}
- }
- if (e) {
- self.inState.click = !self.inState.click
- if (self.isInStateTrue()) self.enter(self)
- else self.leave(self)
- } else {
- self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
- }
- }
-
- Tooltip.prototype.destroy = function () {
- var that = this
- clearTimeout(this.timeout)
- this.hide(function () {
- that.$element.off('.' + that.type).removeData('bs.' + that.type)
- if (that.$tip) {
- that.$tip.detach()
- }
- that.$tip = null
- that.$arrow = null
- that.$viewport = null
- that.$element = null
- })
- }
+ $(element).addClass(ClassName.ACTIVE);
+ element.setAttribute('aria-expanded', true);
+ if (isTransitioning) {
+ Util.reflow(element);
+ $(element).addClass(ClassName.SHOW);
+ } else {
+ $(element).removeClass(ClassName.FADE);
+ }
- // TOOLTIP PLUGIN DEFINITION
- // =========================
+ if (element.parentNode && $(element.parentNode).hasClass(ClassName.DROPDOWN_MENU)) {
- function Plugin(option) {
- return this.each(function () {
- var $this = $(this)
- var data = $this.data('bs.tooltip')
- var options = typeof option == 'object' && option
+ var dropdownElement = $(element).closest(Selector.DROPDOWN)[0];
+ if (dropdownElement) {
+ $(dropdownElement).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE);
+ }
- if (!data && /destroy|hide/.test(option)) return
- if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
- if (typeof option == 'string') data[option]()
- })
- }
+ element.setAttribute('aria-expanded', true);
+ }
- var old = $.fn.tooltip
+ if (callback) {
+ callback();
+ }
+ };
- $.fn.tooltip = Plugin
- $.fn.tooltip.Constructor = Tooltip
+ // static
+ Tab._jQueryInterface = function _jQueryInterface(config) {
+ return this.each(function () {
+ var $this = $(this);
+ var data = $this.data(DATA_KEY);
- // TOOLTIP NO CONFLICT
- // ===================
+ if (!data) {
+ data = new Tab(this);
+ $this.data(DATA_KEY, data);
+ }
- $.fn.tooltip.noConflict = function () {
- $.fn.tooltip = old
- return this
- }
+ if (typeof config === 'string') {
+ if (data[config] === undefined) {
+ throw new Error('No method named "' + config + '"');
+ }
+ data[config]();
+ }
+ });
+ };
+ _createClass(Tab, null, [{
+ key: 'VERSION',
+ get: function get() {
+ return VERSION;
+ }
+ }]);
+
+ return Tab;
+ }();
+
+ /**
+ * ------------------------------------------------------------------------
+ * Data Api implementation
+ * ------------------------------------------------------------------------
+ */
+
+ $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
+ event.preventDefault();
+ Tab._jQueryInterface.call($(this), 'show');
+ });
+
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+ $.fn[NAME] = Tab._jQueryInterface;
+ $.fn[NAME].Constructor = Tab;
+ $.fn[NAME].noConflict = function () {
+ $.fn[NAME] = JQUERY_NO_CONFLICT;
+ return Tab._jQueryInterface;
+ };
+
+ return Tab;
}(jQuery);
-/* ========================================================================
- * Bootstrap: popover.js v3.3.7
- * http://getbootstrap.com/javascript/#popovers
- * ========================================================================
- * Copyright 2011-2016 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
-
+/* global Tether */
-+function ($) {
- 'use strict';
+/**
+ * --------------------------------------------------------------------------
+ * Bootstrap (v4.0.0-alpha.6): tooltip.js
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * --------------------------------------------------------------------------
+ */
- // POPOVER PUBLIC CLASS DEFINITION
- // ===============================
+var Tooltip = function ($) {
- var Popover = function (element, options) {
- this.init('popover', element, options)
+ /**
+ * Check for Tether dependency
+ * Tether - http://tether.io/
+ */
+ if (typeof Tether === 'undefined') {
+ throw new Error('Bootstrap tooltips require Tether (http://tether.io/)');
}
- if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
- Popover.VERSION = '3.3.7'
+ var NAME = 'tooltip';
+ var VERSION = '4.0.0-alpha.6';
+ var DATA_KEY = 'bs.tooltip';
+ var EVENT_KEY = '.' + DATA_KEY;
+ var JQUERY_NO_CONFLICT = $.fn[NAME];
+ var TRANSITION_DURATION = 150;
+ var CLASS_PREFIX = 'bs-tether';
+ var TETHER_PREFIX_REGEX = new RegExp('(^|\\s)' + CLASS_PREFIX + '\\S+', 'g');
- Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
- placement: 'right',
- trigger: 'click',
- content: '',
- template: '<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
- })
+ var Default = {
+ animation: true,
+ template: '<div class="tooltip" role="tooltip">' + '<div class="tooltip-inner"></div></div>',
+ trigger: 'hover focus',
+ title: '',
+ delay: 0,
+ html: false,
+ selector: false,
+ placement: 'top',
+ offset: '0 0',
+ constraints: [],
+ container: false
+ };
+
+ var DefaultType = {
+ animation: 'boolean',
+ template: 'string',
+ title: '(string|element|function)',
+ trigger: 'string',
+ delay: '(number|object)',
+ html: 'boolean',
+ selector: '(string|boolean)',
+ placement: '(string|function)',
+ offset: 'string',
+ constraints: 'array',
+ container: '(string|element|boolean)'
+ };
+
+ var AttachmentMap = {
+ TOP: 'bottom center',
+ RIGHT: 'middle left',
+ BOTTOM: 'top center',
+ LEFT: 'middle right'
+ };
+
+ var HoverState = {
+ SHOW: 'show',
+ OUT: 'out'
+ };
+
+ var Event = {
+ HIDE: 'hide' + EVENT_KEY,
+ HIDDEN: 'hidden' + EVENT_KEY,
+ SHOW: 'show' + EVENT_KEY,
+ SHOWN: 'shown' + EVENT_KEY,
+ INSERTED: 'inserted' + EVENT_KEY,
+ CLICK: 'click' + EVENT_KEY,
+ FOCUSIN: 'focusin' + EVENT_KEY,
+ FOCUSOUT: 'focusout' + EVENT_KEY,
+ MOUSEENTER: 'mouseenter' + EVENT_KEY,
+ MOUSELEAVE: 'mouseleave' + EVENT_KEY
+ };
+
+ var ClassName = {
+ FADE: 'fade',
+ SHOW: 'show'
+ };
+
+ var Selector = {
+ TOOLTIP: '.tooltip',
+ TOOLTIP_INNER: '.tooltip-inner'
+ };
+
+ var TetherClass = {
+ element: false,
+ enabled: false
+ };
+
+ var Trigger = {
+ HOVER: 'hover',
+ FOCUS: 'focus',
+ CLICK: 'click',
+ MANUAL: 'manual'
+ };
+
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ var Tooltip = function () {
+ function Tooltip(element, config) {
+ _classCallCheck(this, Tooltip);
+
+ // private
+ this._isEnabled = true;
+ this._timeout = 0;
+ this._hoverState = '';
+ this._activeTrigger = {};
+ this._tether = null;
+
+ // protected
+ this.element = element;
+ this.config = this._getConfig(config);
+ this.tip = null;
+
+ this._setListeners();
+ }
+ // getters
- // NOTE: POPOVER EXTENDS tooltip.js
- // ================================
+ // public
- Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)
+ Tooltip.prototype.enable = function enable() {
+ this._isEnabled = true;
+ };
- Popover.prototype.constructor = Popover
+ Tooltip.prototype.disable = function disable() {
+ this._isEnabled = false;
+ };
- Popover.prototype.getDefaults = function () {
- return Popover.DEFAULTS
- }
+ Tooltip.prototype.toggleEnabled = function toggleEnabled() {
+ this._isEnabled = !this._isEnabled;
+ };
- Popover.prototype.setContent = function () {
- var $tip = this.tip()
- var title = this.getTitle()
- var content = this.getContent()
+ Tooltip.prototype.toggle = function toggle(event) {
+ if (event) {
+ var dataKey = this.constructor.DATA_KEY;
+ var context = $(event.currentTarget).data(dataKey);
- $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
- $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events
- this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'
- ](content)
+ if (!context) {
+ context = new this.constructor(event.currentTarget, this._getDelegateConfig());
+ $(event.currentTarget).data(dataKey, context);
+ }
- $tip.removeClass('fade top bottom left right in')
+ context._activeTrigger.click = !context._activeTrigger.click;
- // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do
- // this manually by checking the contents.
- if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()
- }
+ if (context._isWithActiveTrigger()) {
+ context._enter(null, context);
+ } else {
+ context._leave(null, context);
+ }
+ } else {
- Popover.prototype.hasContent = function () {
- return this.getTitle() || this.getContent()
- }
+ if ($(this.getTipElement()).hasClass(ClassName.SHOW)) {
+ this._leave(null, this);
+ return;
+ }
- Popover.prototype.getContent = function () {
- var $e = this.$element
- var o = this.options
+ this._enter(null, this);
+ }
+ };
- return $e.attr('data-content')
- || (typeof o.content == 'function' ?
- o.content.call($e[0]) :
- o.content)
- }
+ Tooltip.prototype.dispose = function dispose() {
+ clearTimeout(this._timeout);
- Popover.prototype.arrow = function () {
- return (this.$arrow = this.$arrow || this.tip().find('.arrow'))
- }
+ this.cleanupTether();
+ $.removeData(this.element, this.constructor.DATA_KEY);
- // POPOVER PLUGIN DEFINITION
- // =========================
+ $(this.element).off(this.constructor.EVENT_KEY);
+ $(this.element).closest('.modal').off('hide.bs.modal');
- function Plugin(option) {
- return this.each(function () {
- var $this = $(this)
- var data = $this.data('bs.popover')
- var options = typeof option == 'object' && option
+ if (this.tip) {
+ $(this.tip).remove();
+ }
- if (!data && /destroy|hide/.test(option)) return
- if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
- if (typeof option == 'string') data[option]()
- })
- }
+ this._isEnabled = null;
+ this._timeout = null;
+ this._hoverState = null;
+ this._activeTrigger = null;
+ this._tether = null;
- var old = $.fn.popover
+ this.element = null;
+ this.config = null;
+ this.tip = null;
+ };
- $.fn.popover = Plugin
- $.fn.popover.Constructor = Popover
+ Tooltip.prototype.show = function show() {
+ var _this23 = this;
+ if ($(this.element).css('display') === 'none') {
+ throw new Error('Please use show on visible elements');
+ }
- // POPOVER NO CONFLICT
- // ===================
+ var showEvent = $.Event(this.constructor.Event.SHOW);
+ if (this.isWithContent() && this._isEnabled) {
+ $(this.element).trigger(showEvent);
- $.fn.popover.noConflict = function () {
- $.fn.popover = old
- return this
- }
+ var isInTheDom = $.contains(this.element.ownerDocument.documentElement, this.element);
-}(jQuery);
+ if (showEvent.isDefaultPrevented() || !isInTheDom) {
+ return;
+ }
-/* ========================================================================
- * Bootstrap: scrollspy.js v3.3.7
- * http://getbootstrap.com/javascript/#scrollspy
- * ========================================================================
- * Copyright 2011-2016 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
+ var tip = this.getTipElement();
+ var tipId = Util.getUID(this.constructor.NAME);
+ tip.setAttribute('id', tipId);
+ this.element.setAttribute('aria-describedby', tipId);
-+function ($) {
- 'use strict';
+ this.setContent();
- // SCROLLSPY CLASS DEFINITION
- // ==========================
+ if (this.config.animation) {
+ $(tip).addClass(ClassName.FADE);
+ }
- function ScrollSpy(element, options) {
- this.$body = $(document.body)
- this.$scrollElement = $(element).is(document.body) ? $(window) : $(element)
- this.options = $.extend({}, ScrollSpy.DEFAULTS, options)
- this.selector = (this.options.target || '') + ' .nav li > a'
- this.offsets = []
- this.targets = []
- this.activeTarget = null
- this.scrollHeight = 0
+ var placement = typeof this.config.placement === 'function' ? this.config.placement.call(this, tip, this.element) : this.config.placement;
- this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this))
- this.refresh()
- this.process()
- }
+ var attachment = this._getAttachment(placement);
- ScrollSpy.VERSION = '3.3.7'
+ var container = this.config.container === false ? document.body : $(this.config.container);
- ScrollSpy.DEFAULTS = {
- offset: 10
- }
+ $(tip).data(this.constructor.DATA_KEY, this);
- ScrollSpy.prototype.getScrollHeight = function () {
- return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight)
- }
+ if (!$.contains(this.element.ownerDocument.documentElement, this.tip)) {
+ $(tip).appendTo(container);
+ }
- ScrollSpy.prototype.refresh = function () {
- var that = this
- var offsetMethod = 'offset'
- var offsetBase = 0
+ $(this.element).trigger(this.constructor.Event.INSERTED);
+
+ this._tether = new Tether({
+ attachment: attachment,
+ element: tip,
+ target: this.element,
+ classes: TetherClass,
+ classPrefix: CLASS_PREFIX,
+ offset: this.config.offset,
+ constraints: this.config.constraints,
+ addTargetClasses: false
+ });
+
+ Util.reflow(tip);
+ this._tether.position();
+
+ $(tip).addClass(ClassName.SHOW);
+
+ // if this is a touch-enabled device we add extra
+ // empty mouseover listeners to the body's immediate children;
+ // only needed because of broken event delegation on iOS
+ // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
+ if ('ontouchstart' in document.documentElement) {
+ $('body').children().on('mouseover', null, $.noop);
+ }
- this.offsets = []
- this.targets = []
- this.scrollHeight = this.getScrollHeight()
+ var complete = function complete() {
+ var prevHoverState = _this23._hoverState;
+ _this23._hoverState = null;
- if (!$.isWindow(this.$scrollElement[0])) {
- offsetMethod = 'position'
- offsetBase = this.$scrollElement.scrollTop()
- }
+ $(_this23.element).trigger(_this23.constructor.Event.SHOWN);
- this.$body
- .find(this.selector)
- .map(function () {
- var $el = $(this)
- var href = $el.data('target') || $el.attr('href')
- var $href = /^#./.test(href) && $(href)
-
- return ($href
- && $href.length
- && $href.is(':visible')
- && [[$href[offsetMethod]().top + offsetBase, href]]) || null
- })
- .sort(function (a, b) { return a[0] - b[0] })
- .each(function () {
- that.offsets.push(this[0])
- that.targets.push(this[1])
- })
- }
+ if (prevHoverState === HoverState.OUT) {
+ _this23._leave(null, _this23);
+ }
+ };
- ScrollSpy.prototype.process = function () {
- var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
- var scrollHeight = this.getScrollHeight()
- var maxScroll = this.options.offset + scrollHeight - this.$scrollElement.height()
- var offsets = this.offsets
- var targets = this.targets
- var activeTarget = this.activeTarget
- var i
-
- if (this.scrollHeight != scrollHeight) {
- this.refresh()
- }
+ if (Util.supportsTransitionEnd() && $(this.tip).hasClass(ClassName.FADE)) {
+ $(this.tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(Tooltip._TRANSITION_DURATION);
+ return;
+ }
- if (scrollTop >= maxScroll) {
- return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)
- }
+ complete();
+ }
+ };
- if (activeTarget && scrollTop < offsets[0]) {
- this.activeTarget = null
- return this.clear()
- }
+ Tooltip.prototype.hide = function hide(callback) {
+ var _this24 = this;
- for (i = offsets.length; i--;) {
- activeTarget != targets[i]
- && scrollTop >= offsets[i]
- && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1])
- && this.activate(targets[i])
- }
- }
+ var tip = this.getTipElement();
+ var hideEvent = $.Event(this.constructor.Event.HIDE);
+ var complete = function complete() {
+ if (_this24._hoverState !== HoverState.SHOW && tip.parentNode) {
+ tip.parentNode.removeChild(tip);
+ }
- ScrollSpy.prototype.activate = function (target) {
- this.activeTarget = target
+ _this24._cleanTipClass();
+ _this24.element.removeAttribute('aria-describedby');
+ $(_this24.element).trigger(_this24.constructor.Event.HIDDEN);
+ _this24.cleanupTether();
- this.clear()
+ if (callback) {
+ callback();
+ }
+ };
- var selector = this.selector +
- '[data-target="' + target + '"],' +
- this.selector + '[href="' + target + '"]'
+ $(this.element).trigger(hideEvent);
- var active = $(selector)
- .parents('li')
- .addClass('active')
+ if (hideEvent.isDefaultPrevented()) {
+ return;
+ }
- if (active.parent('.dropdown-menu').length) {
- active = active
- .closest('li.dropdown')
- .addClass('active')
- }
+ $(tip).removeClass(ClassName.SHOW);
- active.trigger('activate.bs.scrollspy')
- }
+ // if this is a touch-enabled device we remove the extra
+ // empty mouseover listeners we added for iOS support
+ if ('ontouchstart' in document.documentElement) {
+ $('body').children().off('mouseover', null, $.noop);
+ }
- ScrollSpy.prototype.clear = function () {
- $(this.selector)
- .parentsUntil(this.options.target, '.active')
- .removeClass('active')
- }
+ this._activeTrigger[Trigger.CLICK] = false;
+ this._activeTrigger[Trigger.FOCUS] = false;
+ this._activeTrigger[Trigger.HOVER] = false;
+ if (Util.supportsTransitionEnd() && $(this.tip).hasClass(ClassName.FADE)) {
- // SCROLLSPY PLUGIN DEFINITION
- // ===========================
+ $(tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION);
+ } else {
+ complete();
+ }
- function Plugin(option) {
- return this.each(function () {
- var $this = $(this)
- var data = $this.data('bs.scrollspy')
- var options = typeof option == 'object' && option
+ this._hoverState = '';
+ };
- if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
- if (typeof option == 'string') data[option]()
- })
- }
+ // protected
- var old = $.fn.scrollspy
+ Tooltip.prototype.isWithContent = function isWithContent() {
+ return Boolean(this.getTitle());
+ };
- $.fn.scrollspy = Plugin
- $.fn.scrollspy.Constructor = ScrollSpy
+ Tooltip.prototype.getTipElement = function getTipElement() {
+ return this.tip = this.tip || $(this.config.template)[0];
+ };
+ Tooltip.prototype.setContent = function setContent() {
+ var $tip = $(this.getTipElement());
- // SCROLLSPY NO CONFLICT
- // =====================
+ this.setElementContent($tip.find(Selector.TOOLTIP_INNER), this.getTitle());
- $.fn.scrollspy.noConflict = function () {
- $.fn.scrollspy = old
- return this
- }
+ $tip.removeClass(ClassName.FADE + ' ' + ClassName.SHOW);
+ this.cleanupTether();
+ };
- // SCROLLSPY DATA-API
- // ==================
+ Tooltip.prototype.setElementContent = function setElementContent($element, content) {
+ var html = this.config.html;
+ if ((typeof content === 'undefined' ? 'undefined' : _typeof(content)) === 'object' && (content.nodeType || content.jquery)) {
+ // content is a DOM node or a jQuery
+ if (html) {
+ if (!$(content).parent().is($element)) {
+ $element.empty().append(content);
+ }
+ } else {
+ $element.text($(content).text());
+ }
+ } else {
+ $element[html ? 'html' : 'text'](content);
+ }
+ };
- $(window).on('load.bs.scrollspy.data-api', function () {
- $('[data-spy="scroll"]').each(function () {
- var $spy = $(this)
- Plugin.call($spy, $spy.data())
- })
- })
+ Tooltip.prototype.getTitle = function getTitle() {
+ var title = this.element.getAttribute('data-original-title');
-}(jQuery);
+ if (!title) {
+ title = typeof this.config.title === 'function' ? this.config.title.call(this.element) : this.config.title;
+ }
-/* ========================================================================
- * Bootstrap: tab.js v3.3.7
- * http://getbootstrap.com/javascript/#tabs
- * ========================================================================
- * Copyright 2011-2016 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
+ return title;
+ };
+ Tooltip.prototype.cleanupTether = function cleanupTether() {
+ if (this._tether) {
+ this._tether.destroy();
+ }
+ };
-+function ($) {
- 'use strict';
+ // private
- // TAB CLASS DEFINITION
- // ====================
+ Tooltip.prototype._getAttachment = function _getAttachment(placement) {
+ return AttachmentMap[placement.toUpperCase()];
+ };
- var Tab = function (element) {
- // jscs:disable requireDollarBeforejQueryAssignment
- this.element = $(element)
- // jscs:enable requireDollarBeforejQueryAssignment
- }
+ Tooltip.prototype._cleanTipClass = function _cleanTipClass() {
+ var $tip = $(this.getTipElement());
+ var tabClass = $tip.attr('class').match(TETHER_PREFIX_REGEX);
+ if (tabClass !== null && tabClass.length > 0) {
+ $tip.removeClass(tabClass.join(''));
+ }
+ };
+
+ Tooltip.prototype._setListeners = function _setListeners() {
+ var _this25 = this;
+
+ var triggers = this.config.trigger.split(' ');
+
+ triggers.forEach(function (trigger) {
+ if (trigger === 'click') {
+ $(_this25.element).on(_this25.constructor.Event.CLICK, _this25.config.selector, function (event) {
+ return _this25.toggle(event);
+ });
+ } else if (trigger !== Trigger.MANUAL) {
+ var eventIn = trigger === Trigger.HOVER ? _this25.constructor.Event.MOUSEENTER : _this25.constructor.Event.FOCUSIN;
+ var eventOut = trigger === Trigger.HOVER ? _this25.constructor.Event.MOUSELEAVE : _this25.constructor.Event.FOCUSOUT;
+
+ $(_this25.element).on(eventIn, _this25.config.selector, function (event) {
+ return _this25._enter(event);
+ }).on(eventOut, _this25.config.selector, function (event) {
+ return _this25._leave(event);
+ });
+ }
- Tab.VERSION = '3.3.7'
+ $(_this25.element).closest('.modal').on('hide.bs.modal', function () {
+ return _this25.hide();
+ });
+ });
- Tab.TRANSITION_DURATION = 150
+ if (this.config.selector) {
+ this.config = $.extend({}, this.config, {
+ trigger: 'manual',
+ selector: ''
+ });
+ } else {
+ this._fixTitle();
+ }
+ };
- Tab.prototype.show = function () {
- var $this = this.element
- var $ul = $this.closest('ul:not(.dropdown-menu)')
- var selector = $this.data('target')
+ Tooltip.prototype._fixTitle = function _fixTitle() {
+ var titleType = _typeof(this.element.getAttribute('data-original-title'));
+ if (this.element.getAttribute('title') || titleType !== 'string') {
+ this.element.setAttribute('data-original-title', this.element.getAttribute('title') || '');
+ this.element.setAttribute('title', '');
+ }
+ };
- if (!selector) {
- selector = $this.attr('href')
- selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
- }
+ Tooltip.prototype._enter = function _enter(event, context) {
+ var dataKey = this.constructor.DATA_KEY;
- if ($this.parent('li').hasClass('active')) return
-
- var $previous = $ul.find('.active:last a')
- var hideEvent = $.Event('hide.bs.tab', {
- relatedTarget: $this[0]
- })
- var showEvent = $.Event('show.bs.tab', {
- relatedTarget: $previous[0]
- })
-
- $previous.trigger(hideEvent)
- $this.trigger(showEvent)
-
- if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return
-
- var $target = $(selector)
-
- this.activate($this.closest('li'), $ul)
- this.activate($target, $target.parent(), function () {
- $previous.trigger({
- type: 'hidden.bs.tab',
- relatedTarget: $this[0]
- })
- $this.trigger({
- type: 'shown.bs.tab',
- relatedTarget: $previous[0]
- })
- })
- }
+ context = context || $(event.currentTarget).data(dataKey);
- Tab.prototype.activate = function (element, container, callback) {
- var $active = container.find('> .active')
- var transition = callback
- && $.support.transition
- && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length)
-
- function next() {
- $active
- .removeClass('active')
- .find('> .dropdown-menu > .active')
- .removeClass('active')
- .end()
- .find('[data-toggle="tab"]')
- .attr('aria-expanded', false)
-
- element
- .addClass('active')
- .find('[data-toggle="tab"]')
- .attr('aria-expanded', true)
+ if (!context) {
+ context = new this.constructor(event.currentTarget, this._getDelegateConfig());
+ $(event.currentTarget).data(dataKey, context);
+ }
- if (transition) {
- element[0].offsetWidth // reflow for transition
- element.addClass('in')
- } else {
- element.removeClass('fade')
+ if (event) {
+ context._activeTrigger[event.type === 'focusin' ? Trigger.FOCUS : Trigger.HOVER] = true;
}
- if (element.parent('.dropdown-menu').length) {
- element
- .closest('li.dropdown')
- .addClass('active')
- .end()
- .find('[data-toggle="tab"]')
- .attr('aria-expanded', true)
+ if ($(context.getTipElement()).hasClass(ClassName.SHOW) || context._hoverState === HoverState.SHOW) {
+ context._hoverState = HoverState.SHOW;
+ return;
}
- callback && callback()
- }
+ clearTimeout(context._timeout);
- $active.length && transition ?
- $active
- .one('bsTransitionEnd', next)
- .emulateTransitionEnd(Tab.TRANSITION_DURATION) :
- next()
+ context._hoverState = HoverState.SHOW;
- $active.removeClass('in')
- }
+ if (!context.config.delay || !context.config.delay.show) {
+ context.show();
+ return;
+ }
+ context._timeout = setTimeout(function () {
+ if (context._hoverState === HoverState.SHOW) {
+ context.show();
+ }
+ }, context.config.delay.show);
+ };
- // TAB PLUGIN DEFINITION
- // =====================
+ Tooltip.prototype._leave = function _leave(event, context) {
+ var dataKey = this.constructor.DATA_KEY;
- function Plugin(option) {
- return this.each(function () {
- var $this = $(this)
- var data = $this.data('bs.tab')
+ context = context || $(event.currentTarget).data(dataKey);
- if (!data) $this.data('bs.tab', (data = new Tab(this)))
- if (typeof option == 'string') data[option]()
- })
- }
+ if (!context) {
+ context = new this.constructor(event.currentTarget, this._getDelegateConfig());
+ $(event.currentTarget).data(dataKey, context);
+ }
- var old = $.fn.tab
+ if (event) {
+ context._activeTrigger[event.type === 'focusout' ? Trigger.FOCUS : Trigger.HOVER] = false;
+ }
- $.fn.tab = Plugin
- $.fn.tab.Constructor = Tab
+ if (context._isWithActiveTrigger()) {
+ return;
+ }
+ clearTimeout(context._timeout);
- // TAB NO CONFLICT
- // ===============
+ context._hoverState = HoverState.OUT;
- $.fn.tab.noConflict = function () {
- $.fn.tab = old
- return this
- }
+ if (!context.config.delay || !context.config.delay.hide) {
+ context.hide();
+ return;
+ }
+ context._timeout = setTimeout(function () {
+ if (context._hoverState === HoverState.OUT) {
+ context.hide();
+ }
+ }, context.config.delay.hide);
+ };
- // TAB DATA-API
- // ============
+ Tooltip.prototype._isWithActiveTrigger = function _isWithActiveTrigger() {
+ for (var trigger in this._activeTrigger) {
+ if (this._activeTrigger[trigger]) {
+ return true;
+ }
+ }
- var clickHandler = function (e) {
- e.preventDefault()
- Plugin.call($(this), 'show')
- }
+ return false;
+ };
- $(document)
- .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler)
- .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler)
+ Tooltip.prototype._getConfig = function _getConfig(config) {
+ config = $.extend({}, this.constructor.Default, $(this.element).data(), config);
-}(jQuery);
+ if (config.delay && typeof config.delay === 'number') {
+ config.delay = {
+ show: config.delay,
+ hide: config.delay
+ };
+ }
-/* ========================================================================
- * Bootstrap: affix.js v3.3.7
- * http://getbootstrap.com/javascript/#affix
- * ========================================================================
- * Copyright 2011-2016 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
+ if (config.title && typeof config.title === 'number') {
+ config.title = config.title.toString();
+ }
+ if (config.content && typeof config.content === 'number') {
+ config.content = config.content.toString();
+ }
-+function ($) {
- 'use strict';
+ Util.typeCheckConfig(NAME, config, this.constructor.DefaultType);
- // AFFIX CLASS DEFINITION
- // ======================
+ return config;
+ };
- var Affix = function (element, options) {
- this.options = $.extend({}, Affix.DEFAULTS, options)
+ Tooltip.prototype._getDelegateConfig = function _getDelegateConfig() {
+ var config = {};
- this.$target = $(this.options.target)
- .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))
- .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this))
+ if (this.config) {
+ for (var key in this.config) {
+ if (this.constructor.Default[key] !== this.config[key]) {
+ config[key] = this.config[key];
+ }
+ }
+ }
- this.$element = $(element)
- this.affixed = null
- this.unpin = null
- this.pinnedOffset = null
+ return config;
+ };
- this.checkPosition()
- }
+ // static
- Affix.VERSION = '3.3.7'
+ Tooltip._jQueryInterface = function _jQueryInterface(config) {
+ return this.each(function () {
+ var data = $(this).data(DATA_KEY);
+ var _config = (typeof config === 'undefined' ? 'undefined' : _typeof(config)) === 'object' && config;
- Affix.RESET = 'affix affix-top affix-bottom'
+ if (!data && /dispose|hide/.test(config)) {
+ return;
+ }
- Affix.DEFAULTS = {
- offset: 0,
- target: window
- }
+ if (!data) {
+ data = new Tooltip(this, _config);
+ $(this).data(DATA_KEY, data);
+ }
- Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) {
- var scrollTop = this.$target.scrollTop()
- var position = this.$element.offset()
- var targetHeight = this.$target.height()
+ if (typeof config === 'string') {
+ if (data[config] === undefined) {
+ throw new Error('No method named "' + config + '"');
+ }
+ data[config]();
+ }
+ });
+ };
- if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false
+ _createClass(Tooltip, null, [{
+ key: 'VERSION',
+ get: function get() {
+ return VERSION;
+ }
+ }, {
+ key: 'Default',
+ get: function get() {
+ return Default;
+ }
+ }, {
+ key: 'NAME',
+ get: function get() {
+ return NAME;
+ }
+ }, {
+ key: 'DATA_KEY',
+ get: function get() {
+ return DATA_KEY;
+ }
+ }, {
+ key: 'Event',
+ get: function get() {
+ return Event;
+ }
+ }, {
+ key: 'EVENT_KEY',
+ get: function get() {
+ return EVENT_KEY;
+ }
+ }, {
+ key: 'DefaultType',
+ get: function get() {
+ return DefaultType;
+ }
+ }]);
- if (this.affixed == 'bottom') {
- if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom'
- return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom'
- }
+ return Tooltip;
+ }();
- var initializing = this.affixed == null
- var colliderTop = initializing ? scrollTop : position.top
- var colliderHeight = initializing ? targetHeight : height
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
- if (offsetTop != null && scrollTop <= offsetTop) return 'top'
- if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom'
+ $.fn[NAME] = Tooltip._jQueryInterface;
+ $.fn[NAME].Constructor = Tooltip;
+ $.fn[NAME].noConflict = function () {
+ $.fn[NAME] = JQUERY_NO_CONFLICT;
+ return Tooltip._jQueryInterface;
+ };
- return false
- }
+ return Tooltip;
+}(jQuery);
- Affix.prototype.getPinnedOffset = function () {
- if (this.pinnedOffset) return this.pinnedOffset
- this.$element.removeClass(Affix.RESET).addClass('affix')
- var scrollTop = this.$target.scrollTop()
- var position = this.$element.offset()
- return (this.pinnedOffset = position.top - scrollTop)
- }
+/**
+ * --------------------------------------------------------------------------
+ * Bootstrap (v4.0.0-alpha.6): popover.js
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * --------------------------------------------------------------------------
+ */
- Affix.prototype.checkPositionWithEventLoop = function () {
- setTimeout($.proxy(this.checkPosition, this), 1)
- }
+var Popover = function ($) {
- Affix.prototype.checkPosition = function () {
- if (!this.$element.is(':visible')) return
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
- var height = this.$element.height()
- var offset = this.options.offset
- var offsetTop = offset.top
- var offsetBottom = offset.bottom
- var scrollHeight = Math.max($(document).height(), $(document.body).height())
+ var NAME = 'popover';
+ var VERSION = '4.0.0-alpha.6';
+ var DATA_KEY = 'bs.popover';
+ var EVENT_KEY = '.' + DATA_KEY;
+ var JQUERY_NO_CONFLICT = $.fn[NAME];
- if (typeof offset != 'object') offsetBottom = offsetTop = offset
- if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element)
- if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)
+ var Default = $.extend({}, Tooltip.Default, {
+ placement: 'right',
+ trigger: 'click',
+ content: '',
+ template: '<div class="popover" role="tooltip">' + '<h3 class="popover-title"></h3>' + '<div class="popover-content"></div></div>'
+ });
+
+ var DefaultType = $.extend({}, Tooltip.DefaultType, {
+ content: '(string|element|function)'
+ });
+
+ var ClassName = {
+ FADE: 'fade',
+ SHOW: 'show'
+ };
+
+ var Selector = {
+ TITLE: '.popover-title',
+ CONTENT: '.popover-content'
+ };
+
+ var Event = {
+ HIDE: 'hide' + EVENT_KEY,
+ HIDDEN: 'hidden' + EVENT_KEY,
+ SHOW: 'show' + EVENT_KEY,
+ SHOWN: 'shown' + EVENT_KEY,
+ INSERTED: 'inserted' + EVENT_KEY,
+ CLICK: 'click' + EVENT_KEY,
+ FOCUSIN: 'focusin' + EVENT_KEY,
+ FOCUSOUT: 'focusout' + EVENT_KEY,
+ MOUSEENTER: 'mouseenter' + EVENT_KEY,
+ MOUSELEAVE: 'mouseleave' + EVENT_KEY
+ };
+
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ var Popover = function (_Tooltip) {
+ _inherits(Popover, _Tooltip);
+
+ function Popover() {
+ _classCallCheck(this, Popover);
+
+ return _possibleConstructorReturn(this, _Tooltip.apply(this, arguments));
+ }
- var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom)
+ // overrides
- if (this.affixed != affix) {
- if (this.unpin != null) this.$element.css('top', '')
+ Popover.prototype.isWithContent = function isWithContent() {
+ return this.getTitle() || this._getContent();
+ };
- var affixType = 'affix' + (affix ? '-' + affix : '')
- var e = $.Event(affixType + '.bs.affix')
+ Popover.prototype.getTipElement = function getTipElement() {
+ return this.tip = this.tip || $(this.config.template)[0];
+ };
- this.$element.trigger(e)
+ Popover.prototype.setContent = function setContent() {
+ var $tip = $(this.getTipElement());
- if (e.isDefaultPrevented()) return
+ // we use append for html objects to maintain js events
+ this.setElementContent($tip.find(Selector.TITLE), this.getTitle());
+ this.setElementContent($tip.find(Selector.CONTENT), this._getContent());
- this.affixed = affix
- this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null
+ $tip.removeClass(ClassName.FADE + ' ' + ClassName.SHOW);
- this.$element
- .removeClass(Affix.RESET)
- .addClass(affixType)
- .trigger(affixType.replace('affix', 'affixed') + '.bs.affix')
- }
+ this.cleanupTether();
+ };
- if (affix == 'bottom') {
- this.$element.offset({
- top: scrollHeight - height - offsetBottom
- })
- }
- }
+ // private
+ Popover.prototype._getContent = function _getContent() {
+ return this.element.getAttribute('data-content') || (typeof this.config.content === 'function' ? this.config.content.call(this.element) : this.config.content);
+ };
- // AFFIX PLUGIN DEFINITION
- // =======================
+ // static
- function Plugin(option) {
- return this.each(function () {
- var $this = $(this)
- var data = $this.data('bs.affix')
- var options = typeof option == 'object' && option
+ Popover._jQueryInterface = function _jQueryInterface(config) {
+ return this.each(function () {
+ var data = $(this).data(DATA_KEY);
+ var _config = (typeof config === 'undefined' ? 'undefined' : _typeof(config)) === 'object' ? config : null;
- if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
- if (typeof option == 'string') data[option]()
- })
- }
+ if (!data && /destroy|hide/.test(config)) {
+ return;
+ }
- var old = $.fn.affix
+ if (!data) {
+ data = new Popover(this, _config);
+ $(this).data(DATA_KEY, data);
+ }
- $.fn.affix = Plugin
- $.fn.affix.Constructor = Affix
+ if (typeof config === 'string') {
+ if (data[config] === undefined) {
+ throw new Error('No method named "' + config + '"');
+ }
+ data[config]();
+ }
+ });
+ };
+ _createClass(Popover, null, [{
+ key: 'VERSION',
- // AFFIX NO CONFLICT
- // =================
- $.fn.affix.noConflict = function () {
- $.fn.affix = old
- return this
- }
+ // getters
+ get: function get() {
+ return VERSION;
+ }
+ }, {
+ key: 'Default',
+ get: function get() {
+ return Default;
+ }
+ }, {
+ key: 'NAME',
+ get: function get() {
+ return NAME;
+ }
+ }, {
+ key: 'DATA_KEY',
+ get: function get() {
+ return DATA_KEY;
+ }
+ }, {
+ key: 'Event',
+ get: function get() {
+ return Event;
+ }
+ }, {
+ key: 'EVENT_KEY',
+ get: function get() {
+ return EVENT_KEY;
+ }
+ }, {
+ key: 'DefaultType',
+ get: function get() {
+ return DefaultType;
+ }
+ }]);
- // AFFIX DATA-API
- // ==============
+ return Popover;
+ }(Tooltip);
- $(window).on('load', function () {
- $('[data-spy="affix"]').each(function () {
- var $spy = $(this)
- var data = $spy.data()
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
- data.offset = data.offset || {}
+ $.fn[NAME] = Popover._jQueryInterface;
+ $.fn[NAME].Constructor = Popover;
+ $.fn[NAME].noConflict = function () {
+ $.fn[NAME] = JQUERY_NO_CONFLICT;
+ return Popover._jQueryInterface;
+ };
- if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom
- if (data.offsetTop != null) data.offset.top = data.offsetTop
+ return Popover;
+}(jQuery);
- Plugin.call($spy, data)
- })
- })
-}(jQuery);
+})() \ No newline at end of file
diff --git a/library/bootstrap/js/bootstrap.min.js b/library/bootstrap/js/bootstrap.min.js
index 9bcd2fcca..8537f817f 100644
--- a/library/bootstrap/js/bootstrap.min.js
+++ b/library/bootstrap/js/bootstrap.min.js
@@ -1,7 +1,7 @@
/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright 2011-2016 Twitter, Inc.
- * Licensed under the MIT license
+ * Bootstrap v4.0.0-alpha.6 (https://getbootstrap.com)
+ * Copyright 2011-2017 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
*/
-if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1||b[0]>3)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){if(a(b.target).is(this))return b.handleObj.handler.apply(this,arguments)}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.7",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a("#"===f?[]:f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.7",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c).prop(c,!0)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c).prop(c,!1))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")?(c.prop("checked")&&(a=!1),b.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==c.prop("type")&&(c.prop("checked")!==this.$element.hasClass("active")&&(a=!1),this.$element.toggleClass("active")),c.prop("checked",this.$element.hasClass("active")),a&&c.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target).closest(".btn");b.call(d,"toggle"),a(c.target).is('input[type="radio"], input[type="checkbox"]')||(c.preventDefault(),d.is("input,button")?d.trigger("focus"):d.find("input:visible,button:visible").first().trigger("focus"))}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.7",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));if(!(a>this.$items.length-1||a<0))return this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){if(!this.sliding)return this.slide("next")},c.prototype.prev=function(){if(!this.sliding)return this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.7",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function c(c){c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=b(d),f={relatedTarget:this};e.hasClass("open")&&(c&&"click"==c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(e[0],c.target)||(e.trigger(c=a.Event("hide.bs.dropdown",f)),c.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger(a.Event("hidden.bs.dropdown",f)))))}))}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.7",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=b(e),g=f.hasClass("open");if(c(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",c);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger(a.Event("shown.bs.dropdown",h))}return!1}},g.prototype.keydown=function(c){if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)){var d=a(this);if(c.preventDefault(),c.stopPropagation(),!d.is(".disabled, :disabled")){var e=b(d),g=e.hasClass("open");if(!g&&27!=c.which||g&&27==c.which)return 27==c.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find(".dropdown-menu"+h);if(i.length){var j=i.index(c.target);38==c.which&&j>0&&j--,40==c.which&&j<i.length-1&&j++,~j||(j=0),i.eq(j).trigger("focus")}}}};var h=a.fn.dropdown;a.fn.dropdown=d,a.fn.dropdown.Constructor=g,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=h,this},a(document).on("click.bs.dropdown.data-api",c).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",f,g.prototype.toggle).on("keydown.bs.dropdown.data-api",f,g.prototype.keydown).on("keydown.bs.dropdown.data-api",".dropdown-menu",g.prototype.keydown)}(jQuery),+function(a){"use strict";function b(b,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},c.DEFAULTS,e.data(),"object"==typeof b&&b);f||e.data("bs.modal",f=new c(this,g)),"string"==typeof b?f[b](d):g.show&&f.show(d)})}var c=function(b,c){this.options=c,this.$body=a(document.body),this.$element=a(b),this.$dialog=this.$element.find(".modal-dialog"),this.$backdrop=null,this.isShown=null,this.originalBodyPad=null,this.scrollbarWidth=0,this.ignoreBackdropClick=!1,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,a.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};c.VERSION="3.3.7",c.TRANSITION_DURATION=300,c.BACKDROP_TRANSITION_DURATION=150,c.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},c.prototype.toggle=function(a){return this.isShown?this.hide():this.show(a)},c.prototype.show=function(b){var d=this,e=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(e),this.isShown||e.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.setScrollbar(),this.$body.addClass("modal-open"),this.escape(),this.resize(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.$dialog.on("mousedown.dismiss.bs.modal",function(){d.$element.one("mouseup.dismiss.bs.modal",function(b){a(b.target).is(d.$element)&&(d.ignoreBackdropClick=!0)})}),this.backdrop(function(){var e=a.support.transition&&d.$element.hasClass("fade");d.$element.parent().length||d.$element.appendTo(d.$body),d.$element.show().scrollTop(0),d.adjustDialog(),e&&d.$element[0].offsetWidth,d.$element.addClass("in"),d.enforceFocus();var f=a.Event("shown.bs.modal",{relatedTarget:b});e?d.$dialog.one("bsTransitionEnd",function(){d.$element.trigger("focus").trigger(f)}).emulateTransitionEnd(c.TRANSITION_DURATION):d.$element.trigger("focus").trigger(f)}))},c.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.escape(),this.resize(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").off("click.dismiss.bs.modal").off("mouseup.dismiss.bs.modal"),this.$dialog.off("mousedown.dismiss.bs.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",a.proxy(this.hideModal,this)).emulateTransitionEnd(c.TRANSITION_DURATION):this.hideModal())},c.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){document===a.target||this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.trigger("focus")},this))},c.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keydown.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keydown.dismiss.bs.modal")},c.prototype.resize=function(){this.isShown?a(window).on("resize.bs.modal",a.proxy(this.handleUpdate,this)):a(window).off("resize.bs.modal")},c.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.$body.removeClass("modal-open"),a.resetAdjustments(),a.resetScrollbar(),a.$element.trigger("hidden.bs.modal")})},c.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},c.prototype.backdrop=function(b){var d=this,e=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var f=a.support.transition&&e;if(this.$backdrop=a(document.createElement("div")).addClass("modal-backdrop "+e).appendTo(this.$body),this.$element.on("click.dismiss.bs.modal",a.proxy(function(a){return this.ignoreBackdropClick?void(this.ignoreBackdropClick=!1):void(a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus():this.hide()))},this)),f&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;f?this.$backdrop.one("bsTransitionEnd",b).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):b()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var g=function(){d.removeBackdrop(),b&&b()};a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",g).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):g()}else b&&b()},c.prototype.handleUpdate=function(){this.adjustDialog()},c.prototype.adjustDialog=function(){var a=this.$element[0].scrollHeight>document.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth<a,this.scrollbarWidth=this.measureScrollbar()},c.prototype.setScrollbar=function(){var a=parseInt(this.$body.css("padding-right")||0,10);this.originalBodyPad=document.body.style.paddingRight||"",this.bodyIsOverflowing&&this.$body.css("padding-right",a+this.scrollbarWidth)},c.prototype.resetScrollbar=function(){this.$body.css("padding-right",this.originalBodyPad)},c.prototype.measureScrollbar=function(){var a=document.createElement("div");a.className="modal-scrollbar-measure",this.$body.append(a);var b=a.offsetWidth-a.clientWidth;return this.$body[0].removeChild(a),b};var d=a.fn.modal;a.fn.modal=b,a.fn.modal.Constructor=c,a.fn.modal.noConflict=function(){return a.fn.modal=d,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(c){var d=a(this),e=d.attr("href"),f=a(d.attr("data-target")||e&&e.replace(/.*(?=#[^\s]+$)/,"")),g=f.data("bs.modal")?"toggle":a.extend({remote:!/#/.test(e)&&e},f.data(),d.data());d.is("a")&&c.preventDefault(),f.one("show.bs.modal",function(a){a.isDefaultPrevented()||f.one("hidden.bs.modal",function(){d.is(":visible")&&d.trigger("focus")})}),b.call(f,g,this)})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof b&&b;!e&&/destroy|hide/.test(b)||(e||d.data("bs.tooltip",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.type=null,this.options=null,this.enabled=null,this.timeout=null,this.hoverState=null,this.$element=null,this.inState=null,this.init("tooltip",a,b)};c.VERSION="3.3.7",c.TRANSITION_DURATION=150,c.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(a.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusin"==b.type?"focus":"hover"]=!0),c.tip().hasClass("in")||"in"==c.hoverState?void(c.hoverState="in"):(clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.isInStateTrue=function(){for(var a in this.inState)if(this.inState[a])return!0;return!1},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);if(c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusout"==b.type?"focus":"hover"]=!1),!c.isInStateTrue())return clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.getPosition(this.$viewport);h="bottom"==h&&k.bottom+m>o.bottom?"top":"top"==h&&k.top-m<o.top?"bottom":"right"==h&&k.right+l>o.width?"left":"left"==h&&k.left-l<o.left?"right":h,f.removeClass(n).addClass(h)}var p=this.getCalculatedOffset(h,k,l,m);this.applyPlacement(p,h);var q=function(){var a=e.hoverState;e.$element.trigger("shown.bs."+e.type),e.hoverState=null,"out"==a&&e.leave(e)};a.support.transition&&this.$tip.hasClass("fade")?f.one("bsTransitionEnd",q).emulateTransitionEnd(c.TRANSITION_DURATION):q()}},c.prototype.applyPlacement=function(b,c){var d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),b.top+=g,b.left+=h,a.offset.setOffset(d[0],a.extend({using:function(a){d.css({top:Math.round(a.top),left:Math.round(a.left)})}},b),0),d.addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;"top"==c&&j!=f&&(b.top=b.top+f-j);var k=this.getViewportAdjustedDelta(c,b,i,j);k.left?b.left+=k.left:b.top+=k.top;var l=/top|bottom/.test(c),m=l?2*k.left-e+i:2*k.top-f+j,n=l?"offsetWidth":"offsetHeight";d.offset(b),this.replaceArrow(m,d[0][n],l)},c.prototype.replaceArrow=function(a,b,c){this.arrow().css(c?"left":"top",50*(1-a/b)+"%").css(c?"top":"left","")},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},c.prototype.hide=function(b){function d(){"in"!=e.hoverState&&f.detach(),e.$element&&e.$element.removeAttr("aria-describedby").trigger("hidden.bs."+e.type),b&&b()}var e=this,f=a(this.$tip),g=a.Event("hide.bs."+this.type);if(this.$element.trigger(g),!g.isDefaultPrevented())return f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one("bsTransitionEnd",d).emulateTransitionEnd(c.TRANSITION_DURATION):d(),this.hoverState=null,this},c.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},c.prototype.hasContent=function(){return this.getTitle()},c.prototype.getPosition=function(b){b=b||this.$element;var c=b[0],d="BODY"==c.tagName,e=c.getBoundingClientRect();null==e.width&&(e=a.extend({},e,{width:e.right-e.left,height:e.bottom-e.top}));var f=window.SVGElement&&c instanceof window.SVGElement,g=d?{top:0,left:0}:f?null:b.offset(),h={scroll:d?document.documentElement.scrollTop||document.body.scrollTop:b.scrollTop()},i=d?{width:a(window).width(),height:a(window).height()}:null;return a.extend({},e,h,i,g)},c.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},c.prototype.getViewportAdjustedDelta=function(a,b,c,d){var e={top:0,left:0};if(!this.$viewport)return e;var f=this.options.viewport&&this.options.viewport.padding||0,g=this.getPosition(this.$viewport);if(/right|left/.test(a)){var h=b.top-f-g.scroll,i=b.top+f-g.scroll+d;h<g.top?e.top=g.top-h:i>g.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;j<g.left?e.left=g.left-j:k>g.right&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){if(!this.$tip&&(this.$tip=a(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),b?(c.inState.click=!c.inState.click,c.isInStateTrue()?c.enter(c):c.leave(c)):c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type),a.$tip&&a.$tip.detach(),a.$tip=null,a.$arrow=null,a.$viewport=null,a.$element=null})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;!e&&/destroy|hide/.test(b)||(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.7",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.7",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b<e[0])return this.activeTarget=null,this.clear();for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(void 0===e[a+1]||b<e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){
-this.activeTarget=b,this.clear();var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")},b.prototype.clear=function(){a(this.selector).parentsUntil(this.options.target,".active").removeClass("active")};var d=a.fn.scrollspy;a.fn.scrollspy=c,a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=d,this},a(window).on("load.bs.scrollspy.data-api",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);c.call(b,b.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new c(this)),"string"==typeof b&&e[b]()})}var c=function(b){this.element=a(b)};c.VERSION="3.3.7",c.TRANSITION_DURATION=150,c.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a"),f=a.Event("hide.bs.tab",{relatedTarget:b[0]}),g=a.Event("show.bs.tab",{relatedTarget:e[0]});if(e.trigger(f),b.trigger(g),!g.isDefaultPrevented()&&!f.isDefaultPrevented()){var h=a(d);this.activate(b.closest("li"),c),this.activate(h,h.parent(),function(){e.trigger({type:"hidden.bs.tab",relatedTarget:b[0]}),b.trigger({type:"shown.bs.tab",relatedTarget:e[0]})})}}},c.prototype.activate=function(b,d,e){function f(){g.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.7",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return e<c&&"top";if("bottom"==this.affixed)return null!=c?!(e+this.unpin<=f.top)&&"bottom":!(e+g<=a-d)&&"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&e<=c?"top":null!=d&&i+j>=a-d&&"bottom"},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=Math.max(a(document).height(),a(document.body).height());"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery); \ No newline at end of file
+if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery. jQuery must be included before Bootstrap's JavaScript.");!function(t){var e=t.fn.jquery.split(" ")[0].split(".");if(e[0]<2&&e[1]<9||1==e[0]&&9==e[1]&&e[2]<1||e[0]>=4)throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}(jQuery),function(){function t(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function e(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}var i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},o=function(){function t(t,e){for(var n=0;n<e.length;n++){var i=e[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}return function(e,n,i){return n&&t(e.prototype,n),i&&t(e,i),e}}(),r=function(t){function e(t){return{}.toString.call(t).match(/\s([a-zA-Z]+)/)[1].toLowerCase()}function n(t){return(t[0]||t).nodeType}function i(){return{bindType:s.end,delegateType:s.end,handle:function(e){if(t(e.target).is(this))return e.handleObj.handler.apply(this,arguments)}}}function o(){if(window.QUnit)return!1;var t=document.createElement("bootstrap");for(var e in a)if(void 0!==t.style[e])return{end:a[e]};return!1}function r(e){var n=this,i=!1;return t(this).one(l.TRANSITION_END,function(){i=!0}),setTimeout(function(){i||l.triggerTransitionEnd(n)},e),this}var s=!1,a={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},l={TRANSITION_END:"bsTransitionEnd",getUID:function(t){do{t+=~~(1e6*Math.random())}while(document.getElementById(t));return t},getSelectorFromElement:function(e){var n=e.getAttribute("data-target");n&&"#"!==n||(n=e.getAttribute("href")||"");try{return t(n).length>0?n:null}catch(t){return null}},reflow:function(t){return t.offsetHeight},triggerTransitionEnd:function(e){t(e).trigger(s.end)},supportsTransitionEnd:function(){return Boolean(s)},typeCheckConfig:function(t,i,o){for(var r in o)if(o.hasOwnProperty(r)){var s=o[r],a=i[r],l=a&&n(a)?"element":e(a);if(!new RegExp(s).test(l))throw new Error(t.toUpperCase()+': Option "'+r+'" provided type "'+l+'" but expected type "'+s+'".')}}};return function(){s=o(),t.fn.emulateTransitionEnd=r,l.supportsTransitionEnd()&&(t.event.special[l.TRANSITION_END]=i())}(),l}(jQuery),s=(function(t){var e="alert",i=t.fn[e],s={DISMISS:'[data-dismiss="alert"]'},a={CLOSE:"close.bs.alert",CLOSED:"closed.bs.alert",CLICK_DATA_API:"click.bs.alert.data-api"},l={ALERT:"alert",FADE:"fade",SHOW:"show"},h=function(){function e(t){n(this,e),this._element=t}return e.prototype.close=function(t){t=t||this._element;var e=this._getRootElement(t);this._triggerCloseEvent(e).isDefaultPrevented()||this._removeElement(e)},e.prototype.dispose=function(){t.removeData(this._element,"bs.alert"),this._element=null},e.prototype._getRootElement=function(e){var n=r.getSelectorFromElement(e),i=!1;return n&&(i=t(n)[0]),i||(i=t(e).closest("."+l.ALERT)[0]),i},e.prototype._triggerCloseEvent=function(e){var n=t.Event(a.CLOSE);return t(e).trigger(n),n},e.prototype._removeElement=function(e){var n=this;if(t(e).removeClass(l.SHOW),!r.supportsTransitionEnd()||!t(e).hasClass(l.FADE))return void this._destroyElement(e);t(e).one(r.TRANSITION_END,function(t){return n._destroyElement(e,t)}).emulateTransitionEnd(150)},e.prototype._destroyElement=function(e){t(e).detach().trigger(a.CLOSED).remove()},e._jQueryInterface=function(n){return this.each(function(){var i=t(this),o=i.data("bs.alert");o||(o=new e(this),i.data("bs.alert",o)),"close"===n&&o[n](this)})},e._handleDismiss=function(t){return function(e){e&&e.preventDefault(),t.close(this)}},o(e,null,[{key:"VERSION",get:function(){return"4.0.0-alpha.6"}}]),e}();t(document).on(a.CLICK_DATA_API,s.DISMISS,h._handleDismiss(new h)),t.fn[e]=h._jQueryInterface,t.fn[e].Constructor=h,t.fn[e].noConflict=function(){return t.fn[e]=i,h._jQueryInterface}}(jQuery),function(t){var e="button",i=t.fn[e],r={ACTIVE:"active",BUTTON:"btn",FOCUS:"focus"},s={DATA_TOGGLE_CARROT:'[data-toggle^="button"]',DATA_TOGGLE:'[data-toggle="buttons"]',INPUT:"input",ACTIVE:".active",BUTTON:".btn"},a={CLICK_DATA_API:"click.bs.button.data-api",FOCUS_BLUR_DATA_API:"focus.bs.button.data-api blur.bs.button.data-api"},l=function(){function e(t){n(this,e),this._element=t}return e.prototype.toggle=function(){var e=!0,n=!0,i=t(this._element).closest(s.DATA_TOGGLE)[0];if(i){var o=t(this._element).find(s.INPUT)[0];if(o){if("radio"===o.type)if(o.checked&&t(this._element).hasClass(r.ACTIVE))e=!1;else{var a=t(i).find(s.ACTIVE)[0];a&&t(a).removeClass(r.ACTIVE)}e&&(o.checked=!t(this._element).hasClass(r.ACTIVE),t(o).trigger("change")),o.focus(),n=!1}}n&&this._element.setAttribute("aria-pressed",!t(this._element).hasClass(r.ACTIVE)),e&&t(this._element).toggleClass(r.ACTIVE)},e.prototype.dispose=function(){t.removeData(this._element,"bs.button"),this._element=null},e._jQueryInterface=function(n){return this.each(function(){var i=t(this).data("bs.button");i||(i=new e(this),t(this).data("bs.button",i)),"toggle"===n&&i[n]()})},o(e,null,[{key:"VERSION",get:function(){return"4.0.0-alpha.6"}}]),e}();t(document).on(a.CLICK_DATA_API,s.DATA_TOGGLE_CARROT,function(e){e.preventDefault();var n=e.target;t(n).hasClass(r.BUTTON)||(n=t(n).closest(s.BUTTON)),l._jQueryInterface.call(t(n),"toggle")}).on(a.FOCUS_BLUR_DATA_API,s.DATA_TOGGLE_CARROT,function(e){var n=t(e.target).closest(s.BUTTON)[0];t(n).toggleClass(r.FOCUS,/^focus(in)?$/.test(e.type))}),t.fn[e]=l._jQueryInterface,t.fn[e].Constructor=l,t.fn[e].noConflict=function(){return t.fn[e]=i,l._jQueryInterface}}(jQuery),function(t){var e="carousel",s="bs.carousel",a="."+s,l=t.fn[e],h={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0},c={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean"},u={NEXT:"next",PREV:"prev",LEFT:"left",RIGHT:"right"},d={SLIDE:"slide"+a,SLID:"slid"+a,KEYDOWN:"keydown"+a,MOUSEENTER:"mouseenter"+a,MOUSELEAVE:"mouseleave"+a,TOUCHEND:"touchend"+a,LOAD_DATA_API:"load.bs.carousel.data-api",CLICK_DATA_API:"click.bs.carousel.data-api"},f={CAROUSEL:"carousel",ACTIVE:"active",SLIDE:"slide",RIGHT:"carousel-item-right",LEFT:"carousel-item-left",NEXT:"carousel-item-next",PREV:"carousel-item-prev",ITEM:"carousel-item"},_={ACTIVE:".active",ACTIVE_ITEM:".active.carousel-item",ITEM:".carousel-item",NEXT_PREV:".carousel-item-next, .carousel-item-prev",INDICATORS:".carousel-indicators",DATA_SLIDE:"[data-slide], [data-slide-to]",DATA_RIDE:'[data-ride="carousel"]'},g=function(){function l(e,i){n(this,l),this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this._config=this._getConfig(i),this._element=t(e)[0],this._indicatorsElement=t(this._element).find(_.INDICATORS)[0],this._addEventListeners()}return l.prototype.next=function(){this._isSliding||this._slide(u.NEXT)},l.prototype.nextWhenVisible=function(){document.hidden||this.next()},l.prototype.prev=function(){this._isSliding||this._slide(u.PREV)},l.prototype.pause=function(e){e||(this._isPaused=!0),t(this._element).find(_.NEXT_PREV)[0]&&r.supportsTransitionEnd()&&(r.triggerTransitionEnd(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},l.prototype.cycle=function(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config.interval&&!this._isPaused&&(this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},l.prototype.to=function(e){var n=this;this._activeElement=t(this._element).find(_.ACTIVE_ITEM)[0];var i=this._getItemIndex(this._activeElement);if(!(e>this._items.length-1||e<0)){if(this._isSliding)return void t(this._element).one(d.SLID,function(){return n.to(e)});if(i===e)return this.pause(),void this.cycle();var o=e>i?u.NEXT:u.PREV;this._slide(o,this._items[e])}},l.prototype.dispose=function(){t(this._element).off(a),t.removeData(this._element,s),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},l.prototype._getConfig=function(n){return n=t.extend({},h,n),r.typeCheckConfig(e,n,c),n},l.prototype._addEventListeners=function(){var e=this;this._config.keyboard&&t(this._element).on(d.KEYDOWN,function(t){return e._keydown(t)}),"hover"===this._config.pause&&(t(this._element).on(d.MOUSEENTER,function(t){return e.pause(t)}).on(d.MOUSELEAVE,function(t){return e.cycle(t)}),"ontouchstart"in document.documentElement&&t(this._element).on(d.TOUCHEND,function(){e.pause(),e.touchTimeout&&clearTimeout(e.touchTimeout),e.touchTimeout=setTimeout(function(t){return e.cycle(t)},500+e._config.interval)}))},l.prototype._keydown=function(t){if(!/input|textarea/i.test(t.target.tagName))switch(t.which){case 37:t.preventDefault(),this.prev();break;case 39:t.preventDefault(),this.next();break;default:return}},l.prototype._getItemIndex=function(e){return this._items=t.makeArray(t(e).parent().find(_.ITEM)),this._items.indexOf(e)},l.prototype._getItemByDirection=function(t,e){var n=t===u.NEXT,i=t===u.PREV,o=this._getItemIndex(e),r=this._items.length-1;if((i&&0===o||n&&o===r)&&!this._config.wrap)return e;var s=t===u.PREV?-1:1,a=(o+s)%this._items.length;return-1===a?this._items[this._items.length-1]:this._items[a]},l.prototype._triggerSlideEvent=function(e,n){var i=this._getItemIndex(e),o=this._getItemIndex(t(this._element).find(_.ACTIVE_ITEM)[0]),r=t.Event(d.SLIDE,{relatedTarget:e,direction:n,from:o,to:i});return t(this._element).trigger(r),r},l.prototype._setActiveIndicatorElement=function(e){if(this._indicatorsElement){t(this._indicatorsElement).find(_.ACTIVE).removeClass(f.ACTIVE);var n=this._indicatorsElement.children[this._getItemIndex(e)];n&&t(n).addClass(f.ACTIVE)}},l.prototype._slide=function(e,n){var i=this,o=t(this._element).find(_.ACTIVE_ITEM)[0],s=this._getItemIndex(o),a=n||o&&this._getItemByDirection(e,o),l=this._getItemIndex(a),h=Boolean(this._interval),c=void 0,g=void 0,p=void 0;if(e===u.NEXT?(c=f.LEFT,g=f.NEXT,p=u.LEFT):(c=f.RIGHT,g=f.PREV,p=u.RIGHT),a&&t(a).hasClass(f.ACTIVE))return void(this._isSliding=!1);if(!this._triggerSlideEvent(a,p).isDefaultPrevented()&&o&&a){this._isSliding=!0,h&&this.pause(),this._setActiveIndicatorElement(a);var m=t.Event(d.SLID,{relatedTarget:a,direction:p,from:s,to:l});r.supportsTransitionEnd()&&t(this._element).hasClass(f.SLIDE)?(t(a).addClass(g),r.reflow(a),t(o).addClass(c),t(a).addClass(c),t(o).one(r.TRANSITION_END,function(){t(a).removeClass(c+" "+g).addClass(f.ACTIVE),t(o).removeClass(f.ACTIVE+" "+g+" "+c),i._isSliding=!1,setTimeout(function(){return t(i._element).trigger(m)},0)}).emulateTransitionEnd(600)):(t(o).removeClass(f.ACTIVE),t(a).addClass(f.ACTIVE),this._isSliding=!1,t(this._element).trigger(m)),h&&this.cycle()}},l._jQueryInterface=function(e){return this.each(function(){var n=t(this).data(s),o=t.extend({},h,t(this).data());"object"===(void 0===e?"undefined":i(e))&&t.extend(o,e);var r="string"==typeof e?e:o.slide;if(n||(n=new l(this,o),t(this).data(s,n)),"number"==typeof e)n.to(e);else if("string"==typeof r){if(void 0===n[r])throw new Error('No method named "'+r+'"');n[r]()}else o.interval&&(n.pause(),n.cycle())})},l._dataApiClickHandler=function(e){var n=r.getSelectorFromElement(this);if(n){var i=t(n)[0];if(i&&t(i).hasClass(f.CAROUSEL)){var o=t.extend({},t(i).data(),t(this).data()),a=this.getAttribute("data-slide-to");a&&(o.interval=!1),l._jQueryInterface.call(t(i),o),a&&t(i).data(s).to(a),e.preventDefault()}}},o(l,null,[{key:"VERSION",get:function(){return"4.0.0-alpha.6"}},{key:"Default",get:function(){return h}}]),l}();t(document).on(d.CLICK_DATA_API,_.DATA_SLIDE,g._dataApiClickHandler),t(window).on(d.LOAD_DATA_API,function(){t(_.DATA_RIDE).each(function(){var e=t(this);g._jQueryInterface.call(e,e.data())})}),t.fn[e]=g._jQueryInterface,t.fn[e].Constructor=g,t.fn[e].noConflict=function(){return t.fn[e]=l,g._jQueryInterface}}(jQuery),function(t){var e="collapse",s="bs.collapse",a=t.fn[e],l={toggle:!0,parent:""},h={toggle:"boolean",parent:"string"},c={SHOW:"show."+s,SHOWN:"shown."+s,HIDE:"hide."+s,HIDDEN:"hidden."+s,CLICK_DATA_API:"click.bs.collapse.data-api"},u={SHOW:"show",COLLAPSE:"collapse",COLLAPSING:"collapsing",COLLAPSED:"collapsed"},d={WIDTH:"width",HEIGHT:"height"},f={ACTIVES:".card > .show, .card > .collapsing",DATA_TOGGLE:'[data-toggle="collapse"]',DATA_CHILDREN:"data-children"},_=function(){function a(e,i){if(n(this,a),this._isTransitioning=!1,this._element=e,this._config=this._getConfig(i),this._triggerArray=t.makeArray(t('[data-toggle="collapse"][href="#'+e.id+'"],[data-toggle="collapse"][data-target="#'+e.id+'"]')),this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._selectorActives=f.ACTIVES,this._parent){var o=this._parent.hasAttribute(f.DATA_CHILDREN)?this._parent.getAttribute(f.DATA_CHILDREN):null;null!==o&&(this._selectorActives=o+" > .show, "+o+" > .collapsing")}this._config.toggle&&this.toggle()}return a.prototype.toggle=function(){t(this._element).hasClass(u.SHOW)?this.hide():this.show()},a.prototype.show=function(){var e=this;if(!this._isTransitioning&&!t(this._element).hasClass(u.SHOW)){var n=void 0,i=void 0;if(this._parent&&(n=t.makeArray(t(this._parent).find(this._selectorActives)),n.length||(n=null)),!(n&&(i=t(n).data(s))&&i._isTransitioning)){var o=t.Event(c.SHOW);if(t(this._element).trigger(o),!o.isDefaultPrevented()){n&&(a._jQueryInterface.call(t(n),"hide"),i||t(n).data(s,null));var l=this._getDimension();t(this._element).removeClass(u.COLLAPSE).addClass(u.COLLAPSING),this._element.style[l]=0,this._triggerArray.length&&t(this._triggerArray).removeClass(u.COLLAPSED).attr("aria-expanded",!0),this.setTransitioning(!0);var h=function(){t(e._element).removeClass(u.COLLAPSING).addClass(u.COLLAPSE).addClass(u.SHOW),e._element.style[l]="",e.setTransitioning(!1),t(e._element).trigger(c.SHOWN)};if(!r.supportsTransitionEnd())return void h();var d=l[0].toUpperCase()+l.slice(1),f="scroll"+d;t(this._element).one(r.TRANSITION_END,h).emulateTransitionEnd(600),this._element.style[l]=this._element[f]+"px"}}}},a.prototype.hide=function(){var e=this;if(!this._isTransitioning&&t(this._element).hasClass(u.SHOW)){var n=t.Event(c.HIDE);if(t(this._element).trigger(n),!n.isDefaultPrevented()){var i=this._getDimension();this._element.style[i]=this._element.getBoundingClientRect()[i]+"px",r.reflow(this._element),t(this._element).addClass(u.COLLAPSING).removeClass(u.COLLAPSE).removeClass(u.SHOW),this._triggerArray.length&&t(this._triggerArray).addClass(u.COLLAPSED).attr("aria-expanded",!1),this.setTransitioning(!0);var o=function(){e.setTransitioning(!1),t(e._element).removeClass(u.COLLAPSING).addClass(u.COLLAPSE).trigger(c.HIDDEN)};if(this._element.style[i]="",!r.supportsTransitionEnd())return void o();t(this._element).one(r.TRANSITION_END,o).emulateTransitionEnd(600)}}},a.prototype.setTransitioning=function(t){this._isTransitioning=t},a.prototype.dispose=function(){t.removeData(this._element,s),this._config=null,this._parent=null,this._element=null,this._triggerArray=null,this._isTransitioning=null},a.prototype._getConfig=function(n){return n=t.extend({},l,n),n.toggle=Boolean(n.toggle),r.typeCheckConfig(e,n,h),n},a.prototype._getDimension=function(){return t(this._element).hasClass(d.WIDTH)?d.WIDTH:d.HEIGHT},a.prototype._getParent=function(){var e=this,n=t(this._config.parent)[0],i='[data-toggle="collapse"][data-parent="'+this._config.parent+'"]';return t(n).find(i).each(function(t,n){e._addAriaAndCollapsedClass(a._getTargetFromElement(n),[n])}),n},a.prototype._addAriaAndCollapsedClass=function(e,n){if(e){var i=t(e).hasClass(u.SHOW);n.length&&t(n).toggleClass(u.COLLAPSED,!i).attr("aria-expanded",i)}},a._getTargetFromElement=function(e){var n=r.getSelectorFromElement(e);return n?t(n)[0]:null},a._jQueryInterface=function(e){return this.each(function(){var n=t(this),o=n.data(s),r=t.extend({},l,n.data(),"object"===(void 0===e?"undefined":i(e))&&e);if(!o&&r.toggle&&/show|hide/.test(e)&&(r.toggle=!1),o||(o=new a(this,r),n.data(s,o)),"string"==typeof e){if(void 0===o[e])throw new Error('No method named "'+e+'"');o[e]()}})},o(a,null,[{key:"VERSION",get:function(){return"4.0.0-alpha.6"}},{key:"Default",get:function(){return l}}]),a}();t(document).on(c.CLICK_DATA_API,f.DATA_TOGGLE,function(e){/input|textarea/i.test(e.target.tagName)||e.preventDefault();var n=_._getTargetFromElement(this),i=t(n).data(s),o=i?"toggle":t(this).data();_._jQueryInterface.call(t(n),o)}),t.fn[e]=_._jQueryInterface,t.fn[e].Constructor=_,t.fn[e].noConflict=function(){return t.fn[e]=a,_._jQueryInterface}}(jQuery),function(t){var e="dropdown",i=".bs.dropdown",s=t.fn[e],a=new RegExp("38|40|27"),l={HIDE:"hide"+i,HIDDEN:"hidden"+i,SHOW:"show"+i,SHOWN:"shown"+i,CLICK:"click"+i,CLICK_DATA_API:"click.bs.dropdown.data-api",KEYDOWN_DATA_API:"keydown.bs.dropdown.data-api",KEYUP_DATA_API:"keyup.bs.dropdown.data-api"},h={DISABLED:"disabled",SHOW:"show"},c={DATA_TOGGLE:'[data-toggle="dropdown"]',FORM_CHILD:".dropdown form",MENU:".dropdown-menu",NAVBAR_NAV:".navbar-nav",VISIBLE_ITEMS:".dropdown-menu .dropdown-item:not(.disabled)"},u=function(){function e(t){n(this,e),this._element=t,this._addEventListeners()}return e.prototype.toggle=function(){if(this.disabled||t(this).hasClass(h.DISABLED))return!1;var n=e._getParentFromElement(this),i=t(n).hasClass(h.SHOW);if(e._clearMenus(),i)return!1;var o={relatedTarget:this},r=t.Event(l.SHOW,o);return t(n).trigger(r),!r.isDefaultPrevented()&&("ontouchstart"in document.documentElement&&!t(n).closest(c.NAVBAR_NAV).length&&t("body").children().on("mouseover",null,t.noop),this.focus(),this.setAttribute("aria-expanded",!0),t(n).toggleClass(h.SHOW),t(n).trigger(t.Event(l.SHOWN,o)),!1)},e.prototype.dispose=function(){t.removeData(this._element,"bs.dropdown"),t(this._element).off(i),this._element=null},e.prototype._addEventListeners=function(){t(this._element).on(l.CLICK,this.toggle)},e._jQueryInterface=function(n){return this.each(function(){var i=t(this).data("bs.dropdown");if(i||(i=new e(this),t(this).data("bs.dropdown",i)),"string"==typeof n){if(void 0===i[n])throw new Error('No method named "'+n+'"');i[n].call(this)}})},e._clearMenus=function(n){if(!n||3!==n.which&&("keyup"!==n.type||9===n.which))for(var i=t.makeArray(t(c.DATA_TOGGLE)),o=0;o<i.length;o++){var r=e._getParentFromElement(i[o]),s={relatedTarget:i[o]};if(t(r).hasClass(h.SHOW)&&!(n&&("click"===n.type&&/input|textarea/i.test(n.target.tagName)||"keyup"===n.type&&9===n.which)&&t.contains(r,n.target))){var a=t.Event(l.HIDE,s);t(r).trigger(a),a.isDefaultPrevented()||("ontouchstart"in document.documentElement&&t("body").children().off("mouseover",null,t.noop),i[o].setAttribute("aria-expanded","false"),t(r).removeClass(h.SHOW).trigger(t.Event(l.HIDDEN,s)))}}},e._getParentFromElement=function(e){var n=void 0,i=r.getSelectorFromElement(e);return i&&(n=t(i)[0]),n||e.parentNode},e._dataApiKeydownHandler=function(n){if(!(!a.test(n.which)||/button/i.test(n.target.tagName)&&32===n.which||/input|textarea/i.test(n.target.tagName)||(n.preventDefault(),n.stopPropagation(),this.disabled||t(this).hasClass(h.DISABLED)))){var i=e._getParentFromElement(this),o=t(i).hasClass(h.SHOW);if(!o&&(27!==n.which||32!==n.which)||o&&(27===n.which||32===n.which)){if(27===n.which){var r=t(i).find(c.DATA_TOGGLE)[0];t(r).trigger("focus")}return void t(this).trigger("click")}var s=t(i).find(c.VISIBLE_ITEMS).get();if(s.length){var l=s.indexOf(n.target);38===n.which&&l>0&&l--,40===n.which&&l<s.length-1&&l++,l<0&&(l=0),s[l].focus()}}},o(e,null,[{key:"VERSION",get:function(){return"4.0.0-alpha.6"}}]),e}();t(document).on(l.KEYDOWN_DATA_API,c.DATA_TOGGLE,u._dataApiKeydownHandler).on(l.KEYDOWN_DATA_API,c.MENU,u._dataApiKeydownHandler).on(l.CLICK_DATA_API+" "+l.KEYUP_DATA_API,u._clearMenus).on(l.CLICK_DATA_API,c.DATA_TOGGLE,u.prototype.toggle).on(l.CLICK_DATA_API,c.FORM_CHILD,function(t){t.stopPropagation()}),t.fn[e]=u._jQueryInterface,t.fn[e].Constructor=u,t.fn[e].noConflict=function(){return t.fn[e]=s,u._jQueryInterface}}(jQuery),function(t){var e="modal",s=".bs.modal",a=t.fn[e],l={backdrop:!0,keyboard:!0,focus:!0,show:!0},h={backdrop:"(boolean|string)",keyboard:"boolean",focus:"boolean",show:"boolean"},c={HIDE:"hide.bs.modal",HIDDEN:"hidden.bs.modal",SHOW:"show.bs.modal",SHOWN:"shown.bs.modal",FOCUSIN:"focusin.bs.modal",RESIZE:"resize.bs.modal",CLICK_DISMISS:"click.dismiss.bs.modal",KEYDOWN_DISMISS:"keydown.dismiss.bs.modal",MOUSEUP_DISMISS:"mouseup.dismiss.bs.modal",MOUSEDOWN_DISMISS:"mousedown.dismiss.bs.modal",CLICK_DATA_API:"click.bs.modal.data-api"},u={SCROLLBAR_MEASURER:"modal-scrollbar-measure",BACKDROP:"modal-backdrop",OPEN:"modal-open",FADE:"fade",SHOW:"show"},d={DIALOG:".modal-dialog",DATA_TOGGLE:'[data-toggle="modal"]',DATA_DISMISS:'[data-dismiss="modal"]',FIXED_CONTENT:".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",NAVBAR_TOGGLER:".navbar-toggler"},f=function(){function a(e,i){n(this,a),this._config=this._getConfig(i),this._element=e,this._dialog=t(e).find(d.DIALOG)[0],this._backdrop=null,this._isShown=!1,this._isBodyOverflowing=!1,this._ignoreBackdropClick=!1,this._originalBodyPadding=0,this._scrollbarWidth=0}return a.prototype.toggle=function(t){return this._isShown?this.hide():this.show(t)},a.prototype.show=function(e){var n=this;if(!this._isTransitioning){r.supportsTransitionEnd()&&t(this._element).hasClass(u.FADE)&&(this._isTransitioning=!0);var i=t.Event(c.SHOW,{relatedTarget:e});t(this._element).trigger(i),this._isShown||i.isDefaultPrevented()||(this._isShown=!0,this._checkScrollbar(),this._setScrollbar(),t(document.body).addClass(u.OPEN),this._setEscapeEvent(),this._setResizeEvent(),t(this._element).on(c.CLICK_DISMISS,d.DATA_DISMISS,function(t){return n.hide(t)}),t(this._dialog).on(c.MOUSEDOWN_DISMISS,function(){t(n._element).one(c.MOUSEUP_DISMISS,function(e){t(e.target).is(n._element)&&(n._ignoreBackdropClick=!0)})}),this._showBackdrop(function(){return n._showElement(e)}))}},a.prototype.hide=function(e){var n=this;if(e&&e.preventDefault(),!this._isTransitioning&&this._isShown){var i=r.supportsTransitionEnd()&&t(this._element).hasClass(u.FADE);i&&(this._isTransitioning=!0);var o=t.Event(c.HIDE);t(this._element).trigger(o),this._isShown&&!o.isDefaultPrevented()&&(this._isShown=!1,this._setEscapeEvent(),this._setResizeEvent(),t(document).off(c.FOCUSIN),t(this._element).removeClass(u.SHOW),t(this._element).off(c.CLICK_DISMISS),t(this._dialog).off(c.MOUSEDOWN_DISMISS),i?t(this._element).one(r.TRANSITION_END,function(t){return n._hideModal(t)}).emulateTransitionEnd(300):this._hideModal())}},a.prototype.dispose=function(){t.removeData(this._element,"bs.modal"),t(window,document,this._element,this._backdrop).off(s),this._config=null,this._element=null,this._dialog=null,this._backdrop=null,this._isShown=null,this._isBodyOverflowing=null,this._ignoreBackdropClick=null,this._scrollbarWidth=null},a.prototype.handleUpdate=function(){this._adjustDialog()},a.prototype._getConfig=function(n){return n=t.extend({},l,n),r.typeCheckConfig(e,n,h),n},a.prototype._showElement=function(e){var n=this,i=r.supportsTransitionEnd()&&t(this._element).hasClass(u.FADE);this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||document.body.appendChild(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.scrollTop=0,i&&r.reflow(this._element),t(this._element).addClass(u.SHOW),this._config.focus&&this._enforceFocus();var o=t.Event(c.SHOWN,{relatedTarget:e}),s=function(){n._config.focus&&n._element.focus(),n._isTransitioning=!1,t(n._element).trigger(o)};i?t(this._dialog).one(r.TRANSITION_END,s).emulateTransitionEnd(300):s()},a.prototype._enforceFocus=function(){var e=this;t(document).off(c.FOCUSIN).on(c.FOCUSIN,function(n){document===n.target||e._element===n.target||t(e._element).has(n.target).length||e._element.focus()})},a.prototype._setEscapeEvent=function(){var e=this;this._isShown&&this._config.keyboard?t(this._element).on(c.KEYDOWN_DISMISS,function(t){27===t.which&&(t.preventDefault(),e.hide())}):this._isShown||t(this._element).off(c.KEYDOWN_DISMISS)},a.prototype._setResizeEvent=function(){var e=this;this._isShown?t(window).on(c.RESIZE,function(t){return e.handleUpdate(t)}):t(window).off(c.RESIZE)},a.prototype._hideModal=function(){var e=this;this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._isTransitioning=!1,this._showBackdrop(function(){t(document.body).removeClass(u.OPEN),e._resetAdjustments(),e._resetScrollbar(),t(e._element).trigger(c.HIDDEN)})},a.prototype._removeBackdrop=function(){this._backdrop&&(t(this._backdrop).remove(),this._backdrop=null)},a.prototype._showBackdrop=function(e){var n=this,i=t(this._element).hasClass(u.FADE)?u.FADE:"";if(this._isShown&&this._config.backdrop){var o=r.supportsTransitionEnd()&&i;if(this._backdrop=document.createElement("div"),this._backdrop.className=u.BACKDROP,i&&t(this._backdrop).addClass(i),t(this._backdrop).appendTo(document.body),t(this._element).on(c.CLICK_DISMISS,function(t){if(n._ignoreBackdropClick)return void(n._ignoreBackdropClick=!1);t.target===t.currentTarget&&("static"===n._config.backdrop?n._element.focus():n.hide())}),o&&r.reflow(this._backdrop),t(this._backdrop).addClass(u.SHOW),!e)return;if(!o)return void e();t(this._backdrop).one(r.TRANSITION_END,e).emulateTransitionEnd(150)}else if(!this._isShown&&this._backdrop){t(this._backdrop).removeClass(u.SHOW);var s=function(){n._removeBackdrop(),e&&e()};r.supportsTransitionEnd()&&t(this._element).hasClass(u.FADE)?t(this._backdrop).one(r.TRANSITION_END,s).emulateTransitionEnd(150):s()}else e&&e()},a.prototype._adjustDialog=function(){var t=this._element.scrollHeight>document.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},a.prototype._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},a.prototype._checkScrollbar=function(){this._isBodyOverflowing=document.body.clientWidth<window.innerWidth,this._scrollbarWidth=this._getScrollbarWidth()},a.prototype._setScrollbar=function(){var e=this;if(this._isBodyOverflowing){t(d.FIXED_CONTENT).each(function(n,i){var o=t(i)[0].style.paddingRight,r=t(i).css("padding-right");t(i).data("padding-right",o).css("padding-right",parseFloat(r)+e._scrollbarWidth+"px")}),t(d.NAVBAR_TOGGLER).each(function(n,i){var o=t(i)[0].style.marginRight,r=t(i).css("margin-right");t(i).data("margin-right",o).css("margin-right",parseFloat(r)+e._scrollbarWidth+"px")});var n=document.body.style.paddingRight,i=t("body").css("padding-right");t("body").data("padding-right",n).css("padding-right",parseFloat(i)+this._scrollbarWidth+"px")}},a.prototype._resetScrollbar=function(){t(d.FIXED_CONTENT).each(function(e,n){var i=t(n).data("padding-right");void 0!==i&&t(n).css("padding-right",i).removeData("padding-right")}),t(d.NAVBAR_TOGGLER).each(function(e,n){var i=t(n).data("margin-right");void 0!==i&&t(n).css("margin-right",i).removeData("margin-right")});var e=t("body").data("padding-right");void 0!==e&&t("body").css("padding-right",e).removeData("padding-right")},a.prototype._getScrollbarWidth=function(){var t=document.createElement("div");t.className=u.SCROLLBAR_MEASURER,document.body.appendChild(t);var e=t.getBoundingClientRect().width-t.clientWidth;return document.body.removeChild(t),e},a._jQueryInterface=function(e,n){return this.each(function(){var o=t(this).data("bs.modal"),r=t.extend({},a.Default,t(this).data(),"object"===(void 0===e?"undefined":i(e))&&e);if(o||(o=new a(this,r),t(this).data("bs.modal",o)),"string"==typeof e){if(void 0===o[e])throw new Error('No method named "'+e+'"');o[e](n)}else r.show&&o.show(n)})},o(a,null,[{key:"VERSION",get:function(){return"4.0.0-alpha.6"}},{key:"Default",get:function(){return l}}]),a}();t(document).on(c.CLICK_DATA_API,d.DATA_TOGGLE,function(e){var n=this,i=void 0,o=r.getSelectorFromElement(this);o&&(i=t(o)[0]);var s=t(i).data("bs.modal")?"toggle":t.extend({},t(i).data(),t(this).data());"A"!==this.tagName&&"AREA"!==this.tagName||e.preventDefault();var a=t(i).one(c.SHOW,function(e){e.isDefaultPrevented()||a.one(c.HIDDEN,function(){t(n).is(":visible")&&n.focus()})});f._jQueryInterface.call(t(i),s,this)}),t.fn[e]=f._jQueryInterface,t.fn[e].Constructor=f,t.fn[e].noConflict=function(){return t.fn[e]=a,f._jQueryInterface}}(jQuery),function(t){var e="scrollspy",s=t.fn[e],a={offset:10,method:"auto",target:""},l={offset:"number",method:"string",target:"(string|element)"},h={ACTIVATE:"activate.bs.scrollspy",SCROLL:"scroll.bs.scrollspy",LOAD_DATA_API:"load.bs.scrollspy.data-api"},c={DROPDOWN_ITEM:"dropdown-item",DROPDOWN_MENU:"dropdown-menu",ACTIVE:"active"},u={DATA_SPY:'[data-spy="scroll"]',ACTIVE:".active",NAV_LIST_GROUP:".nav, .list-group",NAV_LINKS:".nav-link",LIST_ITEMS:".list-group-item",DROPDOWN:".dropdown",DROPDOWN_ITEMS:".dropdown-item",DROPDOWN_TOGGLE:".dropdown-toggle"},d={OFFSET:"offset",POSITION:"position"},f=function(){function s(e,i){var o=this;n(this,s),this._element=e,this._scrollElement="BODY"===e.tagName?window:e,this._config=this._getConfig(i),this._selector=this._config.target+" "+u.NAV_LINKS+","+this._config.target+" "+u.LIST_ITEMS+","+this._config.target+" "+u.DROPDOWN_ITEMS,this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,t(this._scrollElement).on(h.SCROLL,function(t){return o._process(t)}),this.refresh(),this._process()}return s.prototype.refresh=function(){var e=this,n=this._scrollElement!==this._scrollElement.window?d.POSITION:d.OFFSET,i="auto"===this._config.method?n:this._config.method,o=i===d.POSITION?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),t.makeArray(t(this._selector)).map(function(e){var n=void 0,s=r.getSelectorFromElement(e);if(s&&(n=t(s)[0]),n){var a=n.getBoundingClientRect();if(a.width||a.height)return[t(n)[i]().top+o,s]}return null}).filter(function(t){return t}).sort(function(t,e){return t[0]-e[0]}).forEach(function(t){e._offsets.push(t[0]),e._targets.push(t[1])})},s.prototype.dispose=function(){t.removeData(this._element,"bs.scrollspy"),t(this._scrollElement).off(".bs.scrollspy"),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},s.prototype._getConfig=function(n){if(n=t.extend({},a,n),"string"!=typeof n.target){var i=t(n.target).attr("id");i||(i=r.getUID(e),t(n.target).attr("id",i)),n.target="#"+i}return r.typeCheckConfig(e,n,l),n},s.prototype._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},s.prototype._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},s.prototype._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},s.prototype._process=function(){var t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),n=this._config.offset+e-this._getOffsetHeight()
+;if(this._scrollHeight!==e&&this.refresh(),t>=n){var i=this._targets[this._targets.length-1];return void(this._activeTarget!==i&&this._activate(i))}if(this._activeTarget&&t<this._offsets[0]&&this._offsets[0]>0)return this._activeTarget=null,void this._clear();for(var o=this._offsets.length;o--;){this._activeTarget!==this._targets[o]&&t>=this._offsets[o]&&(void 0===this._offsets[o+1]||t<this._offsets[o+1])&&this._activate(this._targets[o])}},s.prototype._activate=function(e){this._activeTarget=e,this._clear();var n=this._selector.split(",");n=n.map(function(t){return t+'[data-target="'+e+'"],'+t+'[href="'+e+'"]'});var i=t(n.join(","));i.hasClass(c.DROPDOWN_ITEM)?(i.closest(u.DROPDOWN).find(u.DROPDOWN_TOGGLE).addClass(c.ACTIVE),i.addClass(c.ACTIVE)):(i.addClass(c.ACTIVE),i.parents(u.NAV_LIST_GROUP).prev(u.NAV_LINKS+", "+u.LIST_ITEMS).addClass(c.ACTIVE)),t(this._scrollElement).trigger(h.ACTIVATE,{relatedTarget:e})},s.prototype._clear=function(){t(this._selector).filter(u.ACTIVE).removeClass(c.ACTIVE)},s._jQueryInterface=function(e){return this.each(function(){var n=t(this).data("bs.scrollspy"),o="object"===(void 0===e?"undefined":i(e))&&e;if(n||(n=new s(this,o),t(this).data("bs.scrollspy",n)),"string"==typeof e){if(void 0===n[e])throw new Error('No method named "'+e+'"');n[e]()}})},o(s,null,[{key:"VERSION",get:function(){return"4.0.0-alpha.6"}},{key:"Default",get:function(){return a}}]),s}();t(window).on(h.LOAD_DATA_API,function(){for(var e=t.makeArray(t(u.DATA_SPY)),n=e.length;n--;){var i=t(e[n]);f._jQueryInterface.call(i,i.data())}}),t.fn[e]=f._jQueryInterface,t.fn[e].Constructor=f,t.fn[e].noConflict=function(){return t.fn[e]=s,f._jQueryInterface}}(jQuery),function(t){var e=t.fn.tab,i={HIDE:"hide.bs.tab",HIDDEN:"hidden.bs.tab",SHOW:"show.bs.tab",SHOWN:"shown.bs.tab",CLICK_DATA_API:"click.bs.tab.data-api"},s={DROPDOWN_MENU:"dropdown-menu",ACTIVE:"active",DISABLED:"disabled",FADE:"fade",SHOW:"show"},a={DROPDOWN:".dropdown",NAV_LIST_GROUP:".nav, .list-group",ACTIVE:".active",DATA_TOGGLE:'[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',DROPDOWN_TOGGLE:".dropdown-toggle",DROPDOWN_ACTIVE_CHILD:"> .dropdown-menu .active"},l=function(){function e(t){n(this,e),this._element=t}return e.prototype.show=function(){var e=this;if(!(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&t(this._element).hasClass(s.ACTIVE)||t(this._element).hasClass(s.DISABLED))){var n=void 0,o=void 0,l=t(this._element).closest(a.NAV_LIST_GROUP)[0],h=r.getSelectorFromElement(this._element);l&&(o=t.makeArray(t(l).find(a.ACTIVE)),o=o[o.length-1]);var c=t.Event(i.HIDE,{relatedTarget:this._element}),u=t.Event(i.SHOW,{relatedTarget:o});if(o&&t(o).trigger(c),t(this._element).trigger(u),!u.isDefaultPrevented()&&!c.isDefaultPrevented()){h&&(n=t(h)[0]),this._activate(this._element,l);var d=function(){var n=t.Event(i.HIDDEN,{relatedTarget:e._element}),r=t.Event(i.SHOWN,{relatedTarget:o});t(o).trigger(n),t(e._element).trigger(r)};n?this._activate(n,n.parentNode,d):d()}}},e.prototype.dispose=function(){t.removeClass(this._element,"bs.tab"),this._element=null},e.prototype._activate=function(e,n,i){var o=this,l=t(n).find(a.ACTIVE)[0],h=i&&r.supportsTransitionEnd()&&l&&t(l).hasClass(s.FADE),c=function(){return o._transitionComplete(e,l,h,i)};l&&h?t(l).one(r.TRANSITION_END,c).emulateTransitionEnd(150):c(),l&&t(l).removeClass(s.SHOW)},e.prototype._transitionComplete=function(e,n,i,o){if(n){t(n).removeClass(s.ACTIVE);var l=t(n.parentNode).find(a.DROPDOWN_ACTIVE_CHILD)[0];l&&t(l).removeClass(s.ACTIVE),n.setAttribute("aria-expanded",!1)}if(t(e).addClass(s.ACTIVE),e.setAttribute("aria-expanded",!0),i?(r.reflow(e),t(e).addClass(s.SHOW)):t(e).removeClass(s.FADE),e.parentNode&&t(e.parentNode).hasClass(s.DROPDOWN_MENU)){var h=t(e).closest(a.DROPDOWN)[0];h&&t(h).find(a.DROPDOWN_TOGGLE).addClass(s.ACTIVE),e.setAttribute("aria-expanded",!0)}o&&o()},e._jQueryInterface=function(n){return this.each(function(){var i=t(this),o=i.data("bs.tab");if(o||(o=new e(this),i.data("bs.tab",o)),"string"==typeof n){if(void 0===o[n])throw new Error('No method named "'+n+'"');o[n]()}})},o(e,null,[{key:"VERSION",get:function(){return"4.0.0-alpha.6"}}]),e}();t(document).on(i.CLICK_DATA_API,a.DATA_TOGGLE,function(e){e.preventDefault(),l._jQueryInterface.call(t(this),"show")}),t.fn.tab=l._jQueryInterface,t.fn.tab.Constructor=l,t.fn.tab.noConflict=function(){return t.fn.tab=e,l._jQueryInterface}}(jQuery),function(t){if("undefined"==typeof Tether)throw new Error("Bootstrap tooltips require Tether (http://tether.io/)");var e="tooltip",s=".bs.tooltip",a=t.fn[e],l=new RegExp("(^|\\s)bs-tether\\S+","g"),h={animation:!0,template:'<div class="tooltip" role="tooltip"><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:"0 0",constraints:[],container:!1},c={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"string",constraints:"array",container:"(string|element|boolean)"},u={TOP:"bottom center",RIGHT:"middle left",BOTTOM:"top center",LEFT:"middle right"},d={SHOW:"show",OUT:"out"},f={HIDE:"hide"+s,HIDDEN:"hidden"+s,SHOW:"show"+s,SHOWN:"shown"+s,INSERTED:"inserted"+s,CLICK:"click"+s,FOCUSIN:"focusin"+s,FOCUSOUT:"focusout"+s,MOUSEENTER:"mouseenter"+s,MOUSELEAVE:"mouseleave"+s},_={FADE:"fade",SHOW:"show"},g={TOOLTIP:".tooltip",TOOLTIP_INNER:".tooltip-inner"},p={element:!1,enabled:!1},m={HOVER:"hover",FOCUS:"focus",CLICK:"click",MANUAL:"manual"},E=function(){function a(t,e){n(this,a),this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._tether=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}return a.prototype.enable=function(){this._isEnabled=!0},a.prototype.disable=function(){this._isEnabled=!1},a.prototype.toggleEnabled=function(){this._isEnabled=!this._isEnabled},a.prototype.toggle=function(e){if(e){var n=this.constructor.DATA_KEY,i=t(e.currentTarget).data(n);i||(i=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(n,i)),i._activeTrigger.click=!i._activeTrigger.click,i._isWithActiveTrigger()?i._enter(null,i):i._leave(null,i)}else{if(t(this.getTipElement()).hasClass(_.SHOW))return void this._leave(null,this);this._enter(null,this)}},a.prototype.dispose=function(){clearTimeout(this._timeout),this.cleanupTether(),t.removeData(this.element,this.constructor.DATA_KEY),t(this.element).off(this.constructor.EVENT_KEY),t(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&t(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,this._tether=null,this.element=null,this.config=null,this.tip=null},a.prototype.show=function(){var e=this;if("none"===t(this.element).css("display"))throw new Error("Please use show on visible elements");var n=t.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){t(this.element).trigger(n);var i=t.contains(this.element.ownerDocument.documentElement,this.element);if(n.isDefaultPrevented()||!i)return;var o=this.getTipElement(),s=r.getUID(this.constructor.NAME);o.setAttribute("id",s),this.element.setAttribute("aria-describedby",s),this.setContent(),this.config.animation&&t(o).addClass(_.FADE);var l="function"==typeof this.config.placement?this.config.placement.call(this,o,this.element):this.config.placement,h=this._getAttachment(l),c=!1===this.config.container?document.body:t(this.config.container);t(o).data(this.constructor.DATA_KEY,this),t.contains(this.element.ownerDocument.documentElement,this.tip)||t(o).appendTo(c),t(this.element).trigger(this.constructor.Event.INSERTED),this._tether=new Tether({attachment:h,element:o,target:this.element,classes:p,classPrefix:"bs-tether",offset:this.config.offset,constraints:this.config.constraints,addTargetClasses:!1}),r.reflow(o),this._tether.position(),t(o).addClass(_.SHOW),"ontouchstart"in document.documentElement&&t("body").children().on("mouseover",null,t.noop);var u=function(){var n=e._hoverState;e._hoverState=null,t(e.element).trigger(e.constructor.Event.SHOWN),n===d.OUT&&e._leave(null,e)};if(r.supportsTransitionEnd()&&t(this.tip).hasClass(_.FADE))return void t(this.tip).one(r.TRANSITION_END,u).emulateTransitionEnd(a._TRANSITION_DURATION);u()}},a.prototype.hide=function(e){var n=this,i=this.getTipElement(),o=t.Event(this.constructor.Event.HIDE),s=function(){n._hoverState!==d.SHOW&&i.parentNode&&i.parentNode.removeChild(i),n._cleanTipClass(),n.element.removeAttribute("aria-describedby"),t(n.element).trigger(n.constructor.Event.HIDDEN),n.cleanupTether(),e&&e()};t(this.element).trigger(o),o.isDefaultPrevented()||(t(i).removeClass(_.SHOW),"ontouchstart"in document.documentElement&&t("body").children().off("mouseover",null,t.noop),this._activeTrigger[m.CLICK]=!1,this._activeTrigger[m.FOCUS]=!1,this._activeTrigger[m.HOVER]=!1,r.supportsTransitionEnd()&&t(this.tip).hasClass(_.FADE)?t(i).one(r.TRANSITION_END,s).emulateTransitionEnd(150):s(),this._hoverState="")},a.prototype.isWithContent=function(){return Boolean(this.getTitle())},a.prototype.getTipElement=function(){return this.tip=this.tip||t(this.config.template)[0]},a.prototype.setContent=function(){var e=t(this.getTipElement());this.setElementContent(e.find(g.TOOLTIP_INNER),this.getTitle()),e.removeClass(_.FADE+" "+_.SHOW),this.cleanupTether()},a.prototype.setElementContent=function(e,n){var o=this.config.html;"object"===(void 0===n?"undefined":i(n))&&(n.nodeType||n.jquery)?o?t(n).parent().is(e)||e.empty().append(n):e.text(t(n).text()):e[o?"html":"text"](n)},a.prototype.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},a.prototype.cleanupTether=function(){this._tether&&this._tether.destroy()},a.prototype._getAttachment=function(t){return u[t.toUpperCase()]},a.prototype._cleanTipClass=function(){var e=t(this.getTipElement()),n=e.attr("class").match(l);null!==n&&n.length>0&&e.removeClass(n.join(""))},a.prototype._setListeners=function(){var e=this;this.config.trigger.split(" ").forEach(function(n){if("click"===n)t(e.element).on(e.constructor.Event.CLICK,e.config.selector,function(t){return e.toggle(t)});else if(n!==m.MANUAL){var i=n===m.HOVER?e.constructor.Event.MOUSEENTER:e.constructor.Event.FOCUSIN,o=n===m.HOVER?e.constructor.Event.MOUSELEAVE:e.constructor.Event.FOCUSOUT;t(e.element).on(i,e.config.selector,function(t){return e._enter(t)}).on(o,e.config.selector,function(t){return e._leave(t)})}t(e.element).closest(".modal").on("hide.bs.modal",function(){return e.hide()})}),this.config.selector?this.config=t.extend({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},a.prototype._fixTitle=function(){var t=i(this.element.getAttribute("data-original-title"));(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},a.prototype._enter=function(e,n){var i=this.constructor.DATA_KEY;return n=n||t(e.currentTarget).data(i),n||(n=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(i,n)),e&&(n._activeTrigger["focusin"===e.type?m.FOCUS:m.HOVER]=!0),t(n.getTipElement()).hasClass(_.SHOW)||n._hoverState===d.SHOW?void(n._hoverState=d.SHOW):(clearTimeout(n._timeout),n._hoverState=d.SHOW,n.config.delay&&n.config.delay.show?void(n._timeout=setTimeout(function(){n._hoverState===d.SHOW&&n.show()},n.config.delay.show)):void n.show())},a.prototype._leave=function(e,n){var i=this.constructor.DATA_KEY;if(n=n||t(e.currentTarget).data(i),n||(n=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(i,n)),e&&(n._activeTrigger["focusout"===e.type?m.FOCUS:m.HOVER]=!1),!n._isWithActiveTrigger()){if(clearTimeout(n._timeout),n._hoverState=d.OUT,!n.config.delay||!n.config.delay.hide)return void n.hide();n._timeout=setTimeout(function(){n._hoverState===d.OUT&&n.hide()},n.config.delay.hide)}},a.prototype._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},a.prototype._getConfig=function(n){return n=t.extend({},this.constructor.Default,t(this.element).data(),n),n.delay&&"number"==typeof n.delay&&(n.delay={show:n.delay,hide:n.delay}),n.title&&"number"==typeof n.title&&(n.title=n.title.toString()),n.content&&"number"==typeof n.content&&(n.content=n.content.toString()),r.typeCheckConfig(e,n,this.constructor.DefaultType),n},a.prototype._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},a._jQueryInterface=function(e){return this.each(function(){var n=t(this).data("bs.tooltip"),o="object"===(void 0===e?"undefined":i(e))&&e;if((n||!/dispose|hide/.test(e))&&(n||(n=new a(this,o),t(this).data("bs.tooltip",n)),"string"==typeof e)){if(void 0===n[e])throw new Error('No method named "'+e+'"');n[e]()}})},o(a,null,[{key:"VERSION",get:function(){return"4.0.0-alpha.6"}},{key:"Default",get:function(){return h}},{key:"NAME",get:function(){return e}},{key:"DATA_KEY",get:function(){return"bs.tooltip"}},{key:"Event",get:function(){return f}},{key:"EVENT_KEY",get:function(){return s}},{key:"DefaultType",get:function(){return c}}]),a}();return t.fn[e]=E._jQueryInterface,t.fn[e].Constructor=E,t.fn[e].noConflict=function(){return t.fn[e]=a,E._jQueryInterface},E}(jQuery));!function(r){var a="popover",l=".bs.popover",h=r.fn[a],c=r.extend({},s.Default,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),u=r.extend({},s.DefaultType,{content:"(string|element|function)"}),d={FADE:"fade",SHOW:"show"},f={TITLE:".popover-title",CONTENT:".popover-content"},_={HIDE:"hide"+l,HIDDEN:"hidden"+l,SHOW:"show"+l,SHOWN:"shown"+l,INSERTED:"inserted"+l,CLICK:"click"+l,FOCUSIN:"focusin"+l,FOCUSOUT:"focusout"+l,MOUSEENTER:"mouseenter"+l,MOUSELEAVE:"mouseleave"+l},g=function(s){function h(){return n(this,h),t(this,s.apply(this,arguments))}return e(h,s),h.prototype.isWithContent=function(){return this.getTitle()||this._getContent()},h.prototype.getTipElement=function(){return this.tip=this.tip||r(this.config.template)[0]},h.prototype.setContent=function(){var t=r(this.getTipElement());this.setElementContent(t.find(f.TITLE),this.getTitle()),this.setElementContent(t.find(f.CONTENT),this._getContent()),t.removeClass(d.FADE+" "+d.SHOW),this.cleanupTether()},h.prototype._getContent=function(){return this.element.getAttribute("data-content")||("function"==typeof this.config.content?this.config.content.call(this.element):this.config.content)},h._jQueryInterface=function(t){return this.each(function(){var e=r(this).data("bs.popover"),n="object"===(void 0===t?"undefined":i(t))?t:null;if((e||!/destroy|hide/.test(t))&&(e||(e=new h(this,n),r(this).data("bs.popover",e)),"string"==typeof t)){if(void 0===e[t])throw new Error('No method named "'+t+'"');e[t]()}})},o(h,null,[{key:"VERSION",get:function(){return"4.0.0-alpha.6"}},{key:"Default",get:function(){return c}},{key:"NAME",get:function(){return a}},{key:"DATA_KEY",get:function(){return"bs.popover"}},{key:"Event",get:function(){return _}},{key:"EVENT_KEY",get:function(){return l}},{key:"DefaultType",get:function(){return u}}]),h}(s);r.fn[a]=g._jQueryInterface,r.fn[a].Constructor=g,r.fn[a].noConflict=function(){return r.fn[a]=h,g._jQueryInterface}}(jQuery)}(); \ No newline at end of file
diff --git a/library/emoji.json b/library/emoji.json
deleted file mode 100644
index dc28c13a1..000000000
--- a/library/emoji.json
+++ /dev/null
@@ -1 +0,0 @@
-{"grinning":{"unicode":"1f600","unicode_alternates":"","name":"grinning face","shortname":":grinning:","category":"people","emoji_order":"1","aliases":[],"aliases_ascii":[],"keywords":["happy","smiley","emotion","emotion"]},"grimacing":{"unicode":"1f62c","unicode_alternates":"","name":"grimacing face","shortname":":grimacing:","category":"people","emoji_order":"2","aliases":[],"aliases_ascii":[],"keywords":["silly","smiley","emotion","emotion","selfie","selfie"]},"grin":{"unicode":"1f601","unicode_alternates":"","name":"grinning face with smiling eyes","shortname":":grin:","category":"people","emoji_order":"3","aliases":[],"aliases_ascii":[],"keywords":["happy","silly","smiley","emotion","emotion","good","good","selfie","selfie"]},"joy":{"unicode":"1f602","unicode_alternates":"","name":"face with tears of joy","shortname":":joy:","category":"people","emoji_order":"4","aliases":[],"aliases_ascii":[":')",":'-)"],"keywords":["happy","silly","smiley","cry","laugh","laugh","emotion","emotion","sarcastic","sarcastic"]},"smiley":{"unicode":"1f603","unicode_alternates":"","name":"smiling face with open mouth","shortname":":smiley:","category":"people","emoji_order":"5","aliases":[],"aliases_ascii":[":D",":-D","=D"],"keywords":["happy","smiley","emotion","emotion","good","good"]},"smile":{"unicode":"1f604","unicode_alternates":"","name":"smiling face with open mouth and smiling eyes","shortname":":smile:","category":"people","emoji_order":"6","aliases":[],"aliases_ascii":[],"keywords":["happy","smiley","emotion","emotion"]},"sweat_smile":{"unicode":"1f605","unicode_alternates":"","name":"smiling face with open mouth and cold sweat","shortname":":sweat_smile:","category":"people","emoji_order":"7","aliases":[],"aliases_ascii":["':)","':-)","'=)","':D","':-D","'=D"],"keywords":["smiley","workout","sweat","emotion","emotion"]},"laughing":{"unicode":"1f606","unicode_alternates":"","name":"smiling face with open mouth and tightly-closed eyes","shortname":":laughing:","category":"people","emoji_order":"8","aliases":[":satisfied:"],"aliases_ascii":[">:)",">;)",">:-)",">=)"],"keywords":["happy","smiley","laugh","laugh","emotion","emotion"]},"innocent":{"unicode":"1f607","unicode_alternates":"","name":"smiling face with halo","shortname":":innocent:","category":"people","emoji_order":"9","aliases":[],"aliases_ascii":["O:-)","0:-3","0:3","0:-)","0:)","0;^)","O:)","O;-)","O=)","0;-)","O:-3","O:3"],"keywords":["smiley","emotion","emotion"]},"wink":{"unicode":"1f609","unicode_alternates":"","name":"winking face","shortname":":wink:","category":"people","emoji_order":"10","aliases":[],"aliases_ascii":[";)",";-)","*-)","*)",";-]",";]",";D",";^)"],"keywords":["silly","smiley","emotion","emotion"]},"blush":{"unicode":"1f60a","unicode_alternates":"","name":"smiling face with smiling eyes","shortname":":blush:","category":"people","emoji_order":"11","aliases":[],"aliases_ascii":[],"keywords":["happy","smiley","emotion","emotion","good","good","beautiful","beautiful"]},"slight_smile":{"unicode":"1f642","unicode_alternates":"","name":"slightly smiling face","shortname":":slight_smile:","category":"people","emoji_order":"12","aliases":[":slightly_smiling_face:"],"aliases_ascii":[":)",":-)","=]","=)",":]"],"keywords":["happy","smiley"]},"upside_down":{"unicode":"1f643","unicode_alternates":"","name":"upside-down face","shortname":":upside_down:","category":"people","emoji_order":"13","aliases":[":upside_down_face:"],"aliases_ascii":[],"keywords":["silly","smiley","sarcastic","sarcastic"]},"relaxed":{"unicode":"263a","unicode_alternates":"263a-fe0f","name":"white smiling face","shortname":":relaxed:","category":"people","emoji_order":"14","aliases":[],"aliases_ascii":[],"keywords":["happy","smiley"]},"yum":{"unicode":"1f60b","unicode_alternates":"","name":"face savouring delicious food","shortname":":yum:","category":"people","emoji_order":"15","aliases":[],"aliases_ascii":[],"keywords":["happy","silly","smiley","emotion","emotion","sarcastic","sarcastic","good","good"]},"relieved":{"unicode":"1f60c","unicode_alternates":"","name":"relieved face","shortname":":relieved:","category":"people","emoji_order":"16","aliases":[],"aliases_ascii":[],"keywords":["smiley","emotion","emotion"]},"heart_eyes":{"unicode":"1f60d","unicode_alternates":"","name":"smiling face with heart-shaped eyes","shortname":":heart_eyes:","category":"people","emoji_order":"17","aliases":[],"aliases_ascii":[],"keywords":["happy","smiley","love","sex","heart eyes","emotion","emotion","beautiful","beautiful"]},"kissing_heart":{"unicode":"1f618","unicode_alternates":"","name":"face throwing a kiss","shortname":":kissing_heart:","category":"people","emoji_order":"18","aliases":[],"aliases_ascii":[":*",":-*","=*",":^*"],"keywords":["smiley","love","sexy"]},"kissing":{"unicode":"1f617","unicode_alternates":"","name":"kissing face","shortname":":kissing:","category":"people","emoji_order":"19","aliases":[],"aliases_ascii":[],"keywords":["smiley","sexy"]},"kissing_smiling_eyes":{"unicode":"1f619","unicode_alternates":"","name":"kissing face with smiling eyes","shortname":":kissing_smiling_eyes:","category":"people","emoji_order":"20","aliases":[],"aliases_ascii":[],"keywords":["smiley","sexy"]},"kissing_closed_eyes":{"unicode":"1f61a","unicode_alternates":"","name":"kissing face with closed eyes","shortname":":kissing_closed_eyes:","category":"people","emoji_order":"21","aliases":[],"aliases_ascii":[],"keywords":["smiley","sexy"]},"stuck_out_tongue_winking_eye":{"unicode":"1f61c","unicode_alternates":"","name":"face with stuck-out tongue and winking eye","shortname":":stuck_out_tongue_winking_eye:","category":"people","emoji_order":"22","aliases":[],"aliases_ascii":[">:P","X-P","x-p"],"keywords":["happy","smiley","emotion","emotion","parties","parties"]},"stuck_out_tongue_closed_eyes":{"unicode":"1f61d","unicode_alternates":"","name":"face with stuck-out tongue and tightly-closed eyes","shortname":":stuck_out_tongue_closed_eyes:","category":"people","emoji_order":"23","aliases":[],"aliases_ascii":[],"keywords":["happy","smiley","emotion","emotion"]},"stuck_out_tongue":{"unicode":"1f61b","unicode_alternates":"","name":"face with stuck-out tongue","shortname":":stuck_out_tongue:","category":"people","emoji_order":"24","aliases":[],"aliases_ascii":[":P",":-P","=P",":-p",":p","=p",":-\u00de",":\u00de",":\u00fe",":-\u00fe",":-b",":b","d:"],"keywords":["smiley","sex","emotion","emotion"]},"money_mouth":{"unicode":"1f911","unicode_alternates":"","name":"money-mouth face","shortname":":money_mouth:","category":"people","emoji_order":"25","aliases":[":money_mouth_face:"],"aliases_ascii":[],"keywords":["smiley","win","win","money","money","emotion","emotion","boys night","boys night"]},"nerd":{"unicode":"1f913","unicode_alternates":"","name":"nerd face","shortname":":nerd:","category":"people","emoji_order":"26","aliases":[":nerd_face:"],"aliases_ascii":[],"keywords":["smiley","glasses"]},"sunglasses":{"unicode":"1f60e","unicode_alternates":"","name":"smiling face with sunglasses","shortname":":sunglasses:","category":"people","emoji_order":"27","aliases":[],"aliases_ascii":["B-)","B)","8)","8-)","B-D","8-D"],"keywords":["silly","smiley","emojione","glasses","boys night","boys night"]},"hugging":{"unicode":"1f917","unicode_alternates":"","name":"hugging face","shortname":":hugging:","category":"people","emoji_order":"28","aliases":[":hugging_face:"],"aliases_ascii":[],"keywords":["smiley","hug","thank you"]},"smirk":{"unicode":"1f60f","unicode_alternates":"","name":"smirking face","shortname":":smirk:","category":"people","emoji_order":"29","aliases":[],"aliases_ascii":[],"keywords":["silly","smiley","sexy","sarcastic","sarcastic"]},"no_mouth":{"unicode":"1f636","unicode_alternates":"","name":"face without mouth","shortname":":no_mouth:","category":"people","emoji_order":"30","aliases":[],"aliases_ascii":[":-X",":X",":-#",":#","=X","=x",":x",":-x","=#"],"keywords":["mad","smiley","neutral","emotion","emotion"]},"neutral_face":{"unicode":"1f610","unicode_alternates":"","name":"neutral face","shortname":":neutral_face:","category":"people","emoji_order":"31","aliases":[],"aliases_ascii":[],"keywords":["mad","smiley","shrug","neutral","emotion","emotion"]},"expressionless":{"unicode":"1f611","unicode_alternates":"","name":"expressionless face","shortname":":expressionless:","category":"people","emoji_order":"32","aliases":[],"aliases_ascii":["-_-","-__-","-___-"],"keywords":["mad","smiley","neutral","emotion","emotion"]},"unamused":{"unicode":"1f612","unicode_alternates":"","name":"unamused face","shortname":":unamused:","category":"people","emoji_order":"33","aliases":[],"aliases_ascii":[],"keywords":["sad","mad","smiley","tired","emotion","emotion"]},"rolling_eyes":{"unicode":"1f644","unicode_alternates":"","name":"face with rolling eyes","shortname":":rolling_eyes:","category":"people","emoji_order":"34","aliases":[":face_with_rolling_eyes:"],"aliases_ascii":[],"keywords":["mad","smiley","rolling eyes","emotion","emotion","sarcastic","sarcastic"]},"thinking":{"unicode":"1f914","unicode_alternates":"","name":"thinking face","shortname":":thinking:","category":"people","emoji_order":"35","aliases":[":thinking_face:"],"aliases_ascii":[],"keywords":["smiley","thinking","boys night","boys night"]},"flushed":{"unicode":"1f633","unicode_alternates":"","name":"flushed face","shortname":":flushed:","category":"people","emoji_order":"36","aliases":[],"aliases_ascii":[":$","=$"],"keywords":["smiley","emotion","emotion","omg","omg"]},"disappointed":{"unicode":"1f61e","unicode_alternates":"","name":"disappointed face","shortname":":disappointed:","category":"people","emoji_order":"37","aliases":[],"aliases_ascii":[">:[",":-(",":(",":-[",":[","=("],"keywords":["sad","smiley","tired","emotion","emotion"]},"worried":{"unicode":"1f61f","unicode_alternates":"","name":"worried face","shortname":":worried:","category":"people","emoji_order":"38","aliases":[],"aliases_ascii":[],"keywords":["sad","smiley","emotion","emotion"]},"angry":{"unicode":"1f620","unicode_alternates":"","name":"angry face","shortname":":angry:","category":"people","emoji_order":"39","aliases":[],"aliases_ascii":[">:(",">:-(",":@"],"keywords":["mad","smiley","emotion","emotion"]},"rage":{"unicode":"1f621","unicode_alternates":"","name":"pouting face","shortname":":rage:","category":"people","emoji_order":"40","aliases":[],"aliases_ascii":[],"keywords":["mad","smiley","angry","emotion","emotion"]},"pensive":{"unicode":"1f614","unicode_alternates":"","name":"pensive face","shortname":":pensive:","category":"people","emoji_order":"41","aliases":[],"aliases_ascii":[],"keywords":["sad","smiley","emotion","emotion","rip","rip"]},"confused":{"unicode":"1f615","unicode_alternates":"","name":"confused face","shortname":":confused:","category":"people","emoji_order":"42","aliases":[],"aliases_ascii":[">:\\",">:\/",":-\/",":-.",":\/",":\\","=\/","=\\",":L","=L"],"keywords":["smiley","surprised","emotion","emotion"]},"slight_frown":{"unicode":"1f641","unicode_alternates":"","name":"slightly frowning face","shortname":":slight_frown:","category":"people","emoji_order":"43","aliases":[":slightly_frowning_face:"],"aliases_ascii":[],"keywords":["sad","smiley","emotion","emotion"]},"frowning2":{"unicode":"2639","unicode_alternates":"2639-fe0f","name":"white frowning face","shortname":":frowning2:","category":"people","emoji_order":"44","aliases":[":white_frowning_face:"],"aliases_ascii":[],"keywords":["sad","smiley","emotion","emotion"]},"persevere":{"unicode":"1f623","unicode_alternates":"","name":"persevering face","shortname":":persevere:","category":"people","emoji_order":"45","aliases":[],"aliases_ascii":[">.<"],"keywords":["sad","smiley","angry","emotion","emotion"]},"confounded":{"unicode":"1f616","unicode_alternates":"","name":"confounded face","shortname":":confounded:","category":"people","emoji_order":"46","aliases":[],"aliases_ascii":[],"keywords":["sad","smiley","angry","emotion","emotion"]},"tired_face":{"unicode":"1f62b","unicode_alternates":"","name":"tired face","shortname":":tired_face:","category":"people","emoji_order":"47","aliases":[],"aliases_ascii":[],"keywords":["sad","smiley","tired","emotion","emotion"]},"weary":{"unicode":"1f629","unicode_alternates":"","name":"weary face","shortname":":weary:","category":"people","emoji_order":"48","aliases":[],"aliases_ascii":[],"keywords":["sad","smiley","tired","stressed","emotion","emotion"]},"triumph":{"unicode":"1f624","unicode_alternates":"","name":"face with look of triumph","shortname":":triumph:","category":"people","emoji_order":"49","aliases":[],"aliases_ascii":[],"keywords":["mad","smiley","angry","emotion","emotion","steam","steam"]},"open_mouth":{"unicode":"1f62e","unicode_alternates":"","name":"face with open mouth","shortname":":open_mouth:","category":"people","emoji_order":"50","aliases":[],"aliases_ascii":[":-O",":O",":-o",":o","O_O",">:O"],"keywords":["smiley","surprised","wow","wow","emotion","emotion"]},"scream":{"unicode":"1f631","unicode_alternates":"","name":"face screaming in fear","shortname":":scream:","category":"people","emoji_order":"51","aliases":[],"aliases_ascii":[],"keywords":["smiley","surprised","wow","wow","emotion","emotion","omg","omg"]},"fearful":{"unicode":"1f628","unicode_alternates":"","name":"fearful face","shortname":":fearful:","category":"people","emoji_order":"52","aliases":[],"aliases_ascii":["D:"],"keywords":["smiley","surprised","emotion","emotion"]},"cold_sweat":{"unicode":"1f630","unicode_alternates":"","name":"face with open mouth and cold sweat","shortname":":cold_sweat:","category":"people","emoji_order":"53","aliases":[],"aliases_ascii":[],"keywords":["smiley","sweat","emotion","emotion"]},"hushed":{"unicode":"1f62f","unicode_alternates":"","name":"hushed face","shortname":":hushed:","category":"people","emoji_order":"54","aliases":[],"aliases_ascii":[],"keywords":["smiley","surprised","wow","wow"]},"frowning":{"unicode":"1f626","unicode_alternates":"","name":"frowning face with open mouth","shortname":":frowning:","category":"people","emoji_order":"55","aliases":[],"aliases_ascii":[],"keywords":["sad","smiley","surprised","emotion","emotion"]},"anguished":{"unicode":"1f627","unicode_alternates":"","name":"anguished face","shortname":":anguished:","category":"people","emoji_order":"56","aliases":[],"aliases_ascii":[],"keywords":["sad","smiley","surprised","emotion","emotion"]},"cry":{"unicode":"1f622","unicode_alternates":"","name":"crying face","shortname":":cry:","category":"people","emoji_order":"57","aliases":[],"aliases_ascii":[":'(",":'-(",";(",";-("],"keywords":["sad","smiley","cry","emotion","emotion","rip","rip","heartbreak","heartbreak"]},"disappointed_relieved":{"unicode":"1f625","unicode_alternates":"","name":"disappointed but relieved face","shortname":":disappointed_relieved:","category":"people","emoji_order":"58","aliases":[],"aliases_ascii":[],"keywords":["sad","smiley","stressed","sweat","cry","emotion","emotion"]},"sleepy":{"unicode":"1f62a","unicode_alternates":"","name":"sleepy face","shortname":":sleepy:","category":"people","emoji_order":"59","aliases":[],"aliases_ascii":[],"keywords":["smiley","sick","emotion","emotion"]},"sweat":{"unicode":"1f613","unicode_alternates":"","name":"face with cold sweat","shortname":":sweat:","category":"people","emoji_order":"60","aliases":[],"aliases_ascii":["':(","':-(","'=("],"keywords":["sad","smiley","stressed","sweat","emotion","emotion"]},"sob":{"unicode":"1f62d","unicode_alternates":"","name":"loudly crying face","shortname":":sob:","category":"people","emoji_order":"61","aliases":[],"aliases_ascii":[],"keywords":["sad","smiley","cry","emotion","emotion","heartbreak","heartbreak"]},"dizzy_face":{"unicode":"1f635","unicode_alternates":"","name":"dizzy face","shortname":":dizzy_face:","category":"people","emoji_order":"62","aliases":[],"aliases_ascii":["#-)","#)","%-)","%)","X)","X-)"],"keywords":["smiley","surprised","dead","wow","wow","emotion","emotion","omg","omg"]},"astonished":{"unicode":"1f632","unicode_alternates":"","name":"astonished face","shortname":":astonished:","category":"people","emoji_order":"63","aliases":[],"aliases_ascii":[],"keywords":["smiley","surprised","wow","wow","emotion","emotion","omg","omg"]},"zipper_mouth":{"unicode":"1f910","unicode_alternates":"","name":"zipper-mouth face","shortname":":zipper_mouth:","category":"people","emoji_order":"64","aliases":[":zipper_mouth_face:"],"aliases_ascii":[],"keywords":["mad","smiley"]},"mask":{"unicode":"1f637","unicode_alternates":"","name":"face with medical mask","shortname":":mask:","category":"people","emoji_order":"65","aliases":[],"aliases_ascii":[],"keywords":["smiley","dead","health","sick"]},"thermometer_face":{"unicode":"1f912","unicode_alternates":"","name":"face with thermometer","shortname":":thermometer_face:","category":"people","emoji_order":"66","aliases":[":face_with_thermometer:"],"aliases_ascii":[],"keywords":["smiley","health","sick","emotion","emotion"]},"head_bandage":{"unicode":"1f915","unicode_alternates":"","name":"face with head-bandage","shortname":":head_bandage:","category":"people","emoji_order":"67","aliases":[":face_with_head_bandage:"],"aliases_ascii":[],"keywords":["smiley","health","sick","emotion","emotion"]},"sleeping":{"unicode":"1f634","unicode_alternates":"","name":"sleeping face","shortname":":sleeping:","category":"people","emoji_order":"68","aliases":[],"aliases_ascii":[],"keywords":["smiley","tired","emotion","emotion","goodnight","goodnight"]},"zzz":{"unicode":"1f4a4","unicode_alternates":"","name":"sleeping symbol","shortname":":zzz:","category":"people","emoji_order":"69","aliases":[],"aliases_ascii":[],"keywords":["tired","goodnight","goodnight"]},"poop":{"unicode":"1f4a9","unicode_alternates":"","name":"pile of poo","shortname":":poop:","category":"people","emoji_order":"70","aliases":[":shit:",":hankey:",":poo:"],"aliases_ascii":[],"keywords":["bathroom","shit","sol","sol","diarrhea","diarrhea"]},"smiling_imp":{"unicode":"1f608","unicode_alternates":"","name":"smiling face with horns","shortname":":smiling_imp:","category":"people","emoji_order":"71","aliases":[],"aliases_ascii":[],"keywords":["silly","smiley","angry","monster","devil","devil","boys night","boys night"]},"imp":{"unicode":"1f47f","unicode_alternates":"","name":"imp","shortname":":imp:","category":"people","emoji_order":"72","aliases":[],"aliases_ascii":[],"keywords":["smiley","monster","devil","devil","wth","wth"]},"japanese_ogre":{"unicode":"1f479","unicode_alternates":"","name":"japanese ogre","shortname":":japanese_ogre:","category":"people","emoji_order":"73","aliases":[],"aliases_ascii":[],"keywords":["monster"]},"japanese_goblin":{"unicode":"1f47a","unicode_alternates":"","name":"japanese goblin","shortname":":japanese_goblin:","category":"people","emoji_order":"74","aliases":[],"aliases_ascii":[],"keywords":["angry","monster"]},"skull":{"unicode":"1f480","unicode_alternates":"","name":"skull","shortname":":skull:","category":"people","emoji_order":"75","aliases":[":skeleton:"],"aliases_ascii":[],"keywords":["dead","halloween","skull"]},"ghost":{"unicode":"1f47b","unicode_alternates":"","name":"ghost","shortname":":ghost:","category":"people","emoji_order":"76","aliases":[],"aliases_ascii":[],"keywords":["holidays","halloween","monster"]},"alien":{"unicode":"1f47d","unicode_alternates":"","name":"extraterrestrial alien","shortname":":alien:","category":"people","emoji_order":"77","aliases":[],"aliases_ascii":[],"keywords":["space","monster","alien","scientology","scientology"]},"robot":{"unicode":"1f916","unicode_alternates":"","name":"robot face","shortname":":robot:","category":"people","emoji_order":"78","aliases":[":robot_face:"],"aliases_ascii":[],"keywords":["monster","robot"]},"smiley_cat":{"unicode":"1f63a","unicode_alternates":"","name":"smiling cat face with open mouth","shortname":":smiley_cat:","category":"people","emoji_order":"79","aliases":[],"aliases_ascii":[],"keywords":["happy","cat","cat","animal","animal"]},"smile_cat":{"unicode":"1f638","unicode_alternates":"","name":"grinning cat face with smiling eyes","shortname":":smile_cat:","category":"people","emoji_order":"80","aliases":[],"aliases_ascii":[],"keywords":["happy","cat","cat","animal","animal"]},"joy_cat":{"unicode":"1f639","unicode_alternates":"","name":"cat face with tears of joy","shortname":":joy_cat:","category":"people","emoji_order":"81","aliases":[],"aliases_ascii":[],"keywords":["happy","silly","cry","laugh","laugh","cat","cat","animal","animal","sarcastic","sarcastic"]},"heart_eyes_cat":{"unicode":"1f63b","unicode_alternates":"","name":"smiling cat face with heart-shaped eyes","shortname":":heart_eyes_cat:","category":"people","emoji_order":"82","aliases":[],"aliases_ascii":[],"keywords":["heart eyes","cat","cat","animal","animal","beautiful","beautiful"]},"smirk_cat":{"unicode":"1f63c","unicode_alternates":"","name":"cat face with wry smile","shortname":":smirk_cat:","category":"people","emoji_order":"83","aliases":[],"aliases_ascii":[],"keywords":["cat","cat","animal","animal"]},"kissing_cat":{"unicode":"1f63d","unicode_alternates":"","name":"kissing cat face with closed eyes","shortname":":kissing_cat:","category":"people","emoji_order":"84","aliases":[],"aliases_ascii":[],"keywords":["cat","cat","animal","animal"]},"scream_cat":{"unicode":"1f640","unicode_alternates":"","name":"weary cat face","shortname":":scream_cat:","category":"people","emoji_order":"85","aliases":[],"aliases_ascii":[],"keywords":["cat","cat","animal","animal"]},"crying_cat_face":{"unicode":"1f63f","unicode_alternates":"","name":"crying cat face","shortname":":crying_cat_face:","category":"people","emoji_order":"86","aliases":[],"aliases_ascii":[],"keywords":["cry","cat","cat","animal","animal"]},"pouting_cat":{"unicode":"1f63e","unicode_alternates":"","name":"pouting cat face","shortname":":pouting_cat:","category":"people","emoji_order":"87","aliases":[],"aliases_ascii":[],"keywords":["cat","cat","animal","animal"]},"raised_hands":{"unicode":"1f64c","unicode_alternates":"","name":"person raising both hands in celebration","shortname":":raised_hands:","category":"people","emoji_order":"88","aliases":[],"aliases_ascii":[],"keywords":["body","hands","diversity","diversity","perfect","perfect","good","good","parties","parties"]},"clap":{"unicode":"1f44f","unicode_alternates":"","name":"clapping hands sign","shortname":":clap:","category":"people","emoji_order":"89","aliases":[],"aliases_ascii":[],"keywords":["body","hands","win","win","diversity","diversity","good","good","beautiful","beautiful"]},"wave":{"unicode":"1f44b","unicode_alternates":"","name":"waving hand sign","shortname":":wave:","category":"people","emoji_order":"90","aliases":[],"aliases_ascii":[],"keywords":["body","hands","hi","diversity","diversity"]},"thumbsup":{"unicode":"1f44d","unicode_alternates":"","name":"thumbs up sign","shortname":":thumbsup:","category":"people","emoji_order":"91","aliases":[":+1:",":thumbup:"],"aliases_ascii":[],"keywords":["body","hands","hi","luck","thank you","diversity","diversity","perfect","perfect","good","good","beautiful","beautiful"]},"thumbsdown":{"unicode":"1f44e","unicode_alternates":"","name":"thumbs down sign","shortname":":thumbsdown:","category":"people","emoji_order":"92","aliases":[":-1:",":thumbdown:"],"aliases_ascii":[],"keywords":["body","hands","diversity","diversity"]},"punch":{"unicode":"1f44a","unicode_alternates":"","name":"fisted hand sign","shortname":":punch:","category":"people","emoji_order":"93","aliases":[],"aliases_ascii":[],"keywords":["body","hands","hi","fist bump","diversity","diversity","boys night","boys night"]},"fist":{"unicode":"270a","unicode_alternates":"","name":"raised fist","shortname":":fist:","category":"people","emoji_order":"94","aliases":[],"aliases_ascii":[],"keywords":["body","hands","hi","fist bump","diversity","diversity","condolence","condolence"]},"v":{"unicode":"270c","unicode_alternates":"270c-fe0f","name":"victory hand","shortname":":v:","category":"people","emoji_order":"95","aliases":[],"aliases_ascii":[],"keywords":["body","hands","hi","thank you","peace","peace","diversity","diversity","girls night","girls night"]},"ok_hand":{"unicode":"1f44c","unicode_alternates":"","name":"ok hand sign","shortname":":ok_hand:","category":"people","emoji_order":"96","aliases":[],"aliases_ascii":[],"keywords":["body","hands","hi","diversity","diversity","perfect","perfect","good","good","beautiful","beautiful"]},"raised_hand":{"unicode":"270b","unicode_alternates":"","name":"raised hand","shortname":":raised_hand:","category":"people","emoji_order":"97","aliases":[],"aliases_ascii":[],"keywords":["body","hands","hi","diversity","diversity","girls night","girls night"]},"open_hands":{"unicode":"1f450","unicode_alternates":"","name":"open hands sign","shortname":":open_hands:","category":"people","emoji_order":"98","aliases":[],"aliases_ascii":[],"keywords":["body","hands","diversity","diversity","condolence","condolence"]},"muscle":{"unicode":"1f4aa","unicode_alternates":"","name":"flexed biceps","shortname":":muscle:","category":"people","emoji_order":"99","aliases":[],"aliases_ascii":[],"keywords":["body","hands","workout","flex","win","win","diversity","diversity","feminist","feminist","boys night","boys night"]},"pray":{"unicode":"1f64f","unicode_alternates":"","name":"person with folded hands","shortname":":pray:","category":"people","emoji_order":"100","aliases":[],"aliases_ascii":[],"keywords":["body","hands","hi","luck","thank you","pray","pray","diversity","diversity","scientology","scientology"]},"point_up":{"unicode":"261d","unicode_alternates":"261d-fe0f","name":"white up pointing index","shortname":":point_up:","category":"people","emoji_order":"101","aliases":[],"aliases_ascii":[],"keywords":["body","hands","emojione","diversity","diversity"]},"point_up_2":{"unicode":"1f446","unicode_alternates":"","name":"white up pointing backhand index","shortname":":point_up_2:","category":"people","emoji_order":"102","aliases":[],"aliases_ascii":[],"keywords":["body","hands","diversity","diversity"]},"point_down":{"unicode":"1f447","unicode_alternates":"","name":"white down pointing backhand index","shortname":":point_down:","category":"people","emoji_order":"103","aliases":[],"aliases_ascii":[],"keywords":["body","hands","diversity","diversity"]},"point_left":{"unicode":"1f448","unicode_alternates":"","name":"white left pointing backhand index","shortname":":point_left:","category":"people","emoji_order":"104","aliases":[],"aliases_ascii":[],"keywords":["body","hands","hi","diversity","diversity"]},"point_right":{"unicode":"1f449","unicode_alternates":"","name":"white right pointing backhand index","shortname":":point_right:","category":"people","emoji_order":"105","aliases":[],"aliases_ascii":[],"keywords":["body","hands","hi","diversity","diversity"]},"middle_finger":{"unicode":"1f595","unicode_alternates":"","name":"reversed hand with middle finger extended","shortname":":middle_finger:","category":"people","emoji_order":"106","aliases":[":reversed_hand_with_middle_finger_extended:"],"aliases_ascii":[],"keywords":["body","hands","middle finger","diversity","diversity"]},"hand_splayed":{"unicode":"1f590","unicode_alternates":"1f590-fe0f","name":"raised hand with fingers splayed","shortname":":hand_splayed:","category":"people","emoji_order":"107","aliases":[":raised_hand_with_fingers_splayed:"],"aliases_ascii":[],"keywords":["body","hands","hi","diversity","diversity"]},"metal":{"unicode":"1f918","unicode_alternates":"","name":"sign of the horns","shortname":":metal:","category":"people","emoji_order":"108","aliases":[":sign_of_the_horns:"],"aliases_ascii":[],"keywords":["body","hands","hi","diversity","diversity","boys night","boys night","parties","parties"]},"vulcan":{"unicode":"1f596","unicode_alternates":"","name":"raised hand with part between middle and ring fingers","shortname":":vulcan:","category":"people","emoji_order":"109","aliases":[":raised_hand_with_part_between_middle_and_ring_fingers:"],"aliases_ascii":[],"keywords":["body","hands","hi","diversity","diversity"]},"writing_hand":{"unicode":"270d","unicode_alternates":"270d-fe0f","name":"writing hand","shortname":":writing_hand:","category":"people","emoji_order":"110","aliases":[],"aliases_ascii":[],"keywords":["body","hands","write","diversity","diversity"]},"nail_care":{"unicode":"1f485","unicode_alternates":"","name":"nail polish","shortname":":nail_care:","category":"people","emoji_order":"111","aliases":[],"aliases_ascii":[],"keywords":["women","body","hands","nailpolish","diversity","diversity","girls night","girls night"]},"lips":{"unicode":"1f444","unicode_alternates":"","name":"mouth","shortname":":lips:","category":"people","emoji_order":"112","aliases":[],"aliases_ascii":[],"keywords":["women","body","sexy","lip"]},"tongue":{"unicode":"1f445","unicode_alternates":"","name":"tongue","shortname":":tongue:","category":"people","emoji_order":"113","aliases":[],"aliases_ascii":[],"keywords":["body","sexy","lip"]},"ear":{"unicode":"1f442","unicode_alternates":"","name":"ear","shortname":":ear:","category":"people","emoji_order":"114","aliases":[],"aliases_ascii":[],"keywords":["body","diversity","diversity"]},"nose":{"unicode":"1f443","unicode_alternates":"","name":"nose","shortname":":nose:","category":"people","emoji_order":"115","aliases":[],"aliases_ascii":[],"keywords":["body","diversity","diversity"]},"eye":{"unicode":"1f441","unicode_alternates":"1f441-fe0f","name":"eye","shortname":":eye:","category":"people","emoji_order":"116","aliases":[],"aliases_ascii":[],"keywords":["body","eyes"]},"eyes":{"unicode":"1f440","unicode_alternates":"","name":"eyes","shortname":":eyes:","category":"people","emoji_order":"117","aliases":[],"aliases_ascii":[],"keywords":["body","eyes"]},"bust_in_silhouette":{"unicode":"1f464","unicode_alternates":"","name":"bust in silhouette","shortname":":bust_in_silhouette:","category":"people","emoji_order":"118","aliases":[],"aliases_ascii":[],"keywords":["people"]},"busts_in_silhouette":{"unicode":"1f465","unicode_alternates":"","name":"busts in silhouette","shortname":":busts_in_silhouette:","category":"people","emoji_order":"119","aliases":[],"aliases_ascii":[],"keywords":["people"]},"speaking_head":{"unicode":"1f5e3","unicode_alternates":"1f5e3-fe0f","name":"speaking head in silhouette","shortname":":speaking_head:","category":"people","emoji_order":"120","aliases":[":speaking_head_in_silhouette:"],"aliases_ascii":[],"keywords":["people","talk"]},"baby":{"unicode":"1f476","unicode_alternates":"","name":"baby","shortname":":baby:","category":"people","emoji_order":"121","aliases":[],"aliases_ascii":[],"keywords":["people","baby","diversity","diversity"]},"boy":{"unicode":"1f466","unicode_alternates":"","name":"boy","shortname":":boy:","category":"people","emoji_order":"122","aliases":[],"aliases_ascii":[],"keywords":["people","baby","diversity","diversity"]},"girl":{"unicode":"1f467","unicode_alternates":"","name":"girl","shortname":":girl:","category":"people","emoji_order":"123","aliases":[],"aliases_ascii":[],"keywords":["people","women","baby","diversity","diversity"]},"man":{"unicode":"1f468","unicode_alternates":"","name":"man","shortname":":man:","category":"people","emoji_order":"124","aliases":[],"aliases_ascii":[],"keywords":["people","men","sex","diversity","diversity","selfie","selfie","boys night","boys night"]},"woman":{"unicode":"1f469","unicode_alternates":"","name":"woman","shortname":":woman:","category":"people","emoji_order":"125","aliases":[],"aliases_ascii":[],"keywords":["people","women","sex","diversity","diversity","feminist","feminist","selfie","selfie","girls night","girls night"]},"person_with_blond_hair":{"unicode":"1f471","unicode_alternates":"","name":"person with blond hair","shortname":":person_with_blond_hair:","category":"people","emoji_order":"126","aliases":[],"aliases_ascii":[],"keywords":["people","men","diversity","diversity"]},"older_man":{"unicode":"1f474","unicode_alternates":"","name":"older man","shortname":":older_man:","category":"people","emoji_order":"127","aliases":[],"aliases_ascii":[],"keywords":["people","men","old people","diversity","diversity"]},"older_woman":{"unicode":"1f475","unicode_alternates":"","name":"older woman","shortname":":older_woman:","category":"people","emoji_order":"128","aliases":[":grandma:"],"aliases_ascii":[],"keywords":["people","old people","diversity","diversity"]},"man_with_gua_pi_mao":{"unicode":"1f472","unicode_alternates":"","name":"man with gua pi mao","shortname":":man_with_gua_pi_mao:","category":"people","emoji_order":"129","aliases":[],"aliases_ascii":[],"keywords":["people","hat","men","diversity","diversity"]},"man_with_turban":{"unicode":"1f473","unicode_alternates":"","name":"man with turban","shortname":":man_with_turban:","category":"people","emoji_order":"130","aliases":[],"aliases_ascii":[],"keywords":["people","hat","diversity","diversity"]},"cop":{"unicode":"1f46e","unicode_alternates":"","name":"police officer","shortname":":cop:","category":"people","emoji_order":"131","aliases":[],"aliases_ascii":[],"keywords":["people","hat","men","diversity","diversity","job","job","police","police","911","911"]},"construction_worker":{"unicode":"1f477","unicode_alternates":"","name":"construction worker","shortname":":construction_worker:","category":"people","emoji_order":"132","aliases":[],"aliases_ascii":[],"keywords":["people","hat","men","diversity","diversity","job","job"]},"guardsman":{"unicode":"1f482","unicode_alternates":"","name":"guardsman","shortname":":guardsman:","category":"people","emoji_order":"133","aliases":[],"aliases_ascii":[],"keywords":["people","hat","men","diversity","diversity","job","job"]},"spy":{"unicode":"1f575","unicode_alternates":"1f575-fe0f","name":"sleuth or spy","shortname":":spy:","category":"people","emoji_order":"134","aliases":[":sleuth_or_spy:"],"aliases_ascii":[],"keywords":["people","hat","men","glasses","diversity","diversity","job","job"]},"santa":{"unicode":"1f385","unicode_alternates":"","name":"father christmas","shortname":":santa:","category":"people","emoji_order":"135","aliases":[],"aliases_ascii":[],"keywords":["people","hat","winter","holidays","christmas","diversity","diversity","santa","santa"]},"angel":{"unicode":"1f47c","unicode_alternates":"","name":"baby angel","shortname":":angel:","category":"people","emoji_order":"136","aliases":[],"aliases_ascii":[],"keywords":["people","diversity","diversity","omg","omg"]},"princess":{"unicode":"1f478","unicode_alternates":"","name":"princess","shortname":":princess:","category":"people","emoji_order":"137","aliases":[],"aliases_ascii":[],"keywords":["people","women","diversity","diversity","beautiful","beautiful","girls night","girls night"]},"bride_with_veil":{"unicode":"1f470","unicode_alternates":"","name":"bride with veil","shortname":":bride_with_veil:","category":"people","emoji_order":"138","aliases":[],"aliases_ascii":[],"keywords":["people","wedding","women","diversity","diversity"]},"walking":{"unicode":"1f6b6","unicode_alternates":"","name":"pedestrian","shortname":":walking:","category":"people","emoji_order":"139","aliases":[],"aliases_ascii":[],"keywords":["people","men","diversity","diversity"]},"runner":{"unicode":"1f3c3","unicode_alternates":"","name":"runner","shortname":":runner:","category":"people","emoji_order":"140","aliases":[],"aliases_ascii":[],"keywords":["people","men","diversity","diversity","boys night","boys night","run","run"]},"dancer":{"unicode":"1f483","unicode_alternates":"","name":"dancer","shortname":":dancer:","category":"people","emoji_order":"141","aliases":[],"aliases_ascii":[],"keywords":["people","women","sexy","diversity","diversity","girls night","girls night","dance","dance"]},"dancers":{"unicode":"1f46f","unicode_alternates":"","name":"woman with bunny ears","shortname":":dancers:","category":"people","emoji_order":"142","aliases":[],"aliases_ascii":[],"keywords":["people","women","sexy","girls night","girls night","boys night","boys night","parties","parties","dance","dance"]},"couple":{"unicode":"1f46b","unicode_alternates":"","name":"man and woman holding hands","shortname":":couple:","category":"people","emoji_order":"143","aliases":[],"aliases_ascii":[],"keywords":["people","sex","creationism","creationism"]},"two_men_holding_hands":{"unicode":"1f46c","unicode_alternates":"","name":"two men holding hands","shortname":":two_men_holding_hands:","category":"people","emoji_order":"144","aliases":[],"aliases_ascii":[],"keywords":["people","gay","men","sex","lgbt","lgbt"]},"two_women_holding_hands":{"unicode":"1f46d","unicode_alternates":"","name":"two women holding hands","shortname":":two_women_holding_hands:","category":"people","emoji_order":"145","aliases":[],"aliases_ascii":[],"keywords":["people","women","sex","lgbt","lgbt","lesbian","lesbian","girls night","girls night"]},"bow":{"unicode":"1f647","unicode_alternates":"","name":"person bowing deeply","shortname":":bow:","category":"people","emoji_order":"146","aliases":[],"aliases_ascii":[],"keywords":["people","pray","pray","diversity","diversity"]},"information_desk_person":{"unicode":"1f481","unicode_alternates":"","name":"information desk person","shortname":":information_desk_person:","category":"people","emoji_order":"147","aliases":[],"aliases_ascii":[],"keywords":["people","women","diversity","diversity"]},"no_good":{"unicode":"1f645","unicode_alternates":"","name":"face with no good gesture","shortname":":no_good:","category":"people","emoji_order":"148","aliases":[],"aliases_ascii":[],"keywords":["people","women","diversity","diversity","girls night","girls night"]},"ok_woman":{"unicode":"1f646","unicode_alternates":"","name":"face with ok gesture","shortname":":ok_woman:","category":"people","emoji_order":"149","aliases":[],"aliases_ascii":["*\\0\/*","\\0\/","*\\O\/*","\\O\/"],"keywords":["people","women","diversity","diversity"]},"raising_hand":{"unicode":"1f64b","unicode_alternates":"","name":"happy person raising one hand","shortname":":raising_hand:","category":"people","emoji_order":"150","aliases":[],"aliases_ascii":[],"keywords":["people","women","diversity","diversity"]},"person_with_pouting_face":{"unicode":"1f64e","unicode_alternates":"","name":"person with pouting face","shortname":":person_with_pouting_face:","category":"people","emoji_order":"151","aliases":[],"aliases_ascii":[],"keywords":["people","women","diversity","diversity"]},"person_frowning":{"unicode":"1f64d","unicode_alternates":"","name":"person frowning","shortname":":person_frowning:","category":"people","emoji_order":"152","aliases":[],"aliases_ascii":[],"keywords":["people","women","diversity","diversity"]},"haircut":{"unicode":"1f487","unicode_alternates":"","name":"haircut","shortname":":haircut:","category":"people","emoji_order":"153","aliases":[],"aliases_ascii":[],"keywords":["people","women","diversity","diversity"]},"massage":{"unicode":"1f486","unicode_alternates":"","name":"face massage","shortname":":massage:","category":"people","emoji_order":"154","aliases":[],"aliases_ascii":[],"keywords":["people","women","diversity","diversity"]},"couple_with_heart":{"unicode":"1f491","unicode_alternates":"","name":"couple with heart","shortname":":couple_with_heart:","category":"people","emoji_order":"155","aliases":[],"aliases_ascii":[],"keywords":["people","love","sex"]},"couple_ww":{"unicode":"1f469-2764-1f469","unicode_alternates":"1f469-200d-2764-fe0f-200d-1f469","name":"couple (woman,woman)","shortname":":couple_ww:","category":"people","emoji_order":"156","aliases":[":couple_with_heart_ww:"],"aliases_ascii":[],"keywords":["people","women","love","sex","lgbt","lgbt"]},"couple_mm":{"unicode":"1f468-2764-1f468","unicode_alternates":"1f468-200d-2764-fe0f-200d-1f468","name":"couple (man,man)","shortname":":couple_mm:","category":"people","emoji_order":"157","aliases":[":couple_with_heart_mm:"],"aliases_ascii":[],"keywords":["people","gay","men","love","sex","lgbt","lgbt"]},"couplekiss":{"unicode":"1f48f","unicode_alternates":"","name":"kiss","shortname":":couplekiss:","category":"people","emoji_order":"158","aliases":[],"aliases_ascii":[],"keywords":["people","love","sex"]},"kiss_ww":{"unicode":"1f469-2764-1f48b-1f469","unicode_alternates":"1f469-200d-2764-fe0f-200d-1f48b-200d-1f469","name":"kiss (woman,woman)","shortname":":kiss_ww:","category":"people","emoji_order":"159","aliases":[":couplekiss_ww:"],"aliases_ascii":[],"keywords":["people","women","love","sex","lgbt","lgbt","lesbian","lesbian"]},"kiss_mm":{"unicode":"1f468-2764-1f48b-1f468","unicode_alternates":"1f468-200d-2764-fe0f-200d-1f48b-200d-1f468","name":"kiss (man,man)","shortname":":kiss_mm:","category":"people","emoji_order":"160","aliases":[":couplekiss_mm:"],"aliases_ascii":[],"keywords":["people","gay","men","love","sex","lgbt","lgbt"]},"family":{"unicode":"1f46a","unicode_alternates":"","name":"family","shortname":":family:","category":"people","emoji_order":"161","aliases":[],"aliases_ascii":[],"keywords":["people","family","baby"]},"family_mwg":{"unicode":"1f468-1f469-1f467","unicode_alternates":"1f468-200d-1f469-200d-1f467","name":"family (man,woman,girl)","shortname":":family_mwg:","category":"people","emoji_order":"162","aliases":[],"aliases_ascii":[],"keywords":["people","family","baby"]},"family_mwgb":{"unicode":"1f468-1f469-1f467-1f466","unicode_alternates":"1f468-200d-1f469-200d-1f467-200d-1f466","name":"family (man,woman,girl,boy)","shortname":":family_mwgb:","category":"people","emoji_order":"163","aliases":[],"aliases_ascii":[],"keywords":["people","family","baby"]},"family_mwbb":{"unicode":"1f468-1f469-1f466-1f466","unicode_alternates":"1f468-200d-1f469-200d-1f466-200d-1f466","name":"family (man,woman,boy,boy)","shortname":":family_mwbb:","category":"people","emoji_order":"164","aliases":[],"aliases_ascii":[],"keywords":["people","family","baby"]},"family_mwgg":{"unicode":"1f468-1f469-1f467-1f467","unicode_alternates":"1f468-200d-1f469-200d-1f467-200d-1f467","name":"family (man,woman,girl,girl)","shortname":":family_mwgg:","category":"people","emoji_order":"165","aliases":[],"aliases_ascii":[],"keywords":["people","family","baby"]},"family_wwb":{"unicode":"1f469-1f469-1f466","unicode_alternates":"1f469-200d-1f469-200d-1f466","name":"family (woman,woman,boy)","shortname":":family_wwb:","category":"people","emoji_order":"166","aliases":[],"aliases_ascii":[],"keywords":["people","family","women","baby","lgbt","lgbt","lesbian","lesbian"]},"family_wwg":{"unicode":"1f469-1f469-1f467","unicode_alternates":"1f469-200d-1f469-200d-1f467","name":"family (woman,woman,girl)","shortname":":family_wwg:","category":"people","emoji_order":"167","aliases":[],"aliases_ascii":[],"keywords":["people","family","women","baby","lgbt","lgbt","lesbian","lesbian"]},"family_wwgb":{"unicode":"1f469-1f469-1f467-1f466","unicode_alternates":"1f469-200d-1f469-200d-1f467-200d-1f466","name":"family (woman,woman,girl,boy)","shortname":":family_wwgb:","category":"people","emoji_order":"168","aliases":[],"aliases_ascii":[],"keywords":["people","family","women","baby","lgbt","lgbt","lesbian","lesbian"]},"family_wwbb":{"unicode":"1f469-1f469-1f466-1f466","unicode_alternates":"1f469-200d-1f469-200d-1f466-200d-1f466","name":"family (woman,woman,boy,boy)","shortname":":family_wwbb:","category":"people","emoji_order":"169","aliases":[],"aliases_ascii":[],"keywords":["people","family","women","baby","lgbt","lgbt","lesbian","lesbian"]},"family_wwgg":{"unicode":"1f469-1f469-1f467-1f467","unicode_alternates":"1f469-200d-1f469-200d-1f467-200d-1f467","name":"family (woman,woman,girl,girl)","shortname":":family_wwgg:","category":"people","emoji_order":"170","aliases":[],"aliases_ascii":[],"keywords":["people","family","women","baby","lgbt","lgbt","lesbian","lesbian"]},"family_mmb":{"unicode":"1f468-1f468-1f466","unicode_alternates":"1f468-200d-1f468-200d-1f466","name":"family (man,man,boy)","shortname":":family_mmb:","category":"people","emoji_order":"171","aliases":[],"aliases_ascii":[],"keywords":["people","gay","family","men","baby","lgbt","lgbt"]},"family_mmg":{"unicode":"1f468-1f468-1f467","unicode_alternates":"1f468-200d-1f468-200d-1f467","name":"family (man,man,girl)","shortname":":family_mmg:","category":"people","emoji_order":"172","aliases":[],"aliases_ascii":[],"keywords":["people","gay","family","men","baby","lgbt","lgbt"]},"family_mmgb":{"unicode":"1f468-1f468-1f467-1f466","unicode_alternates":"1f468-200d-1f468-200d-1f467-200d-1f466","name":"family (man,man,girl,boy)","shortname":":family_mmgb:","category":"people","emoji_order":"173","aliases":[],"aliases_ascii":[],"keywords":["people","gay","family","men","baby","lgbt","lgbt"]},"family_mmbb":{"unicode":"1f468-1f468-1f466-1f466","unicode_alternates":"1f468-200d-1f468-200d-1f466-200d-1f466","name":"family (man,man,boy,boy)","shortname":":family_mmbb:","category":"people","emoji_order":"174","aliases":[],"aliases_ascii":[],"keywords":["people","gay","family","men","baby","lgbt","lgbt"]},"family_mmgg":{"unicode":"1f468-1f468-1f467-1f467","unicode_alternates":"1f468-200d-1f468-200d-1f467-200d-1f467","name":"family (man,man,girl,girl)","shortname":":family_mmgg:","category":"people","emoji_order":"175","aliases":[],"aliases_ascii":[],"keywords":["people","gay","family","men","baby","lgbt","lgbt"]},"womans_clothes":{"unicode":"1f45a","unicode_alternates":"","name":"womans clothes","shortname":":womans_clothes:","category":"people","emoji_order":"176","aliases":[],"aliases_ascii":[],"keywords":["women","fashion"]},"shirt":{"unicode":"1f455","unicode_alternates":"","name":"t-shirt","shortname":":shirt:","category":"people","emoji_order":"177","aliases":[],"aliases_ascii":[],"keywords":["fashion"]},"jeans":{"unicode":"1f456","unicode_alternates":"","name":"jeans","shortname":":jeans:","category":"people","emoji_order":"178","aliases":[],"aliases_ascii":[],"keywords":["fashion"]},"necktie":{"unicode":"1f454","unicode_alternates":"","name":"necktie","shortname":":necktie:","category":"people","emoji_order":"179","aliases":[],"aliases_ascii":[],"keywords":["fashion"]},"dress":{"unicode":"1f457","unicode_alternates":"","name":"dress","shortname":":dress:","category":"people","emoji_order":"180","aliases":[],"aliases_ascii":[],"keywords":["women","fashion","sexy","girls night","girls night"]},"bikini":{"unicode":"1f459","unicode_alternates":"","name":"bikini","shortname":":bikini:","category":"people","emoji_order":"181","aliases":[],"aliases_ascii":[],"keywords":["women","fashion","sexy","vacation","tropical","swim"]},"kimono":{"unicode":"1f458","unicode_alternates":"","name":"kimono","shortname":":kimono:","category":"people","emoji_order":"182","aliases":[],"aliases_ascii":[],"keywords":["fashion"]},"lipstick":{"unicode":"1f484","unicode_alternates":"","name":"lipstick","shortname":":lipstick:","category":"people","emoji_order":"183","aliases":[],"aliases_ascii":[],"keywords":["object","women","fashion","sexy","lip"]},"kiss":{"unicode":"1f48b","unicode_alternates":"","name":"kiss mark","shortname":":kiss:","category":"people","emoji_order":"184","aliases":[],"aliases_ascii":[],"keywords":["women","love","sexy","lip","beautiful","beautiful","girls night","girls night"]},"footprints":{"unicode":"1f463","unicode_alternates":"","name":"footprints","shortname":":footprints:","category":"people","emoji_order":"185","aliases":[],"aliases_ascii":[],"keywords":[]},"high_heel":{"unicode":"1f460","unicode_alternates":"","name":"high-heeled shoe","shortname":":high_heel:","category":"people","emoji_order":"186","aliases":[],"aliases_ascii":[],"keywords":["women","fashion","shoe","sexy","accessories","girls night","girls night"]},"sandal":{"unicode":"1f461","unicode_alternates":"","name":"womans sandal","shortname":":sandal:","category":"people","emoji_order":"187","aliases":[],"aliases_ascii":[],"keywords":["fashion","shoe","accessories"]},"boot":{"unicode":"1f462","unicode_alternates":"","name":"womans boots","shortname":":boot:","category":"people","emoji_order":"188","aliases":[],"aliases_ascii":[],"keywords":["women","fashion","shoe","sexy","accessories"]},"mans_shoe":{"unicode":"1f45e","unicode_alternates":"","name":"mans shoe","shortname":":mans_shoe:","category":"people","emoji_order":"189","aliases":[],"aliases_ascii":[],"keywords":["fashion","shoe","accessories"]},"athletic_shoe":{"unicode":"1f45f","unicode_alternates":"","name":"athletic shoe","shortname":":athletic_shoe:","category":"people","emoji_order":"190","aliases":[],"aliases_ascii":[],"keywords":["fashion","shoe","accessories","boys night","boys night"]},"womans_hat":{"unicode":"1f452","unicode_alternates":"","name":"womans hat","shortname":":womans_hat:","category":"people","emoji_order":"191","aliases":[],"aliases_ascii":[],"keywords":["women","fashion","accessories"]},"tophat":{"unicode":"1f3a9","unicode_alternates":"","name":"top hat","shortname":":tophat:","category":"people","emoji_order":"192","aliases":[],"aliases_ascii":[],"keywords":["hat","fashion","accessories"]},"helmet_with_cross":{"unicode":"26d1","unicode_alternates":"26d1-fe0f","name":"helmet with white cross","shortname":":helmet_with_cross:","category":"people","emoji_order":"193","aliases":[":helmet_with_white_cross:"],"aliases_ascii":[],"keywords":["object","hat","accessories","job","job"]},"mortar_board":{"unicode":"1f393","unicode_alternates":"","name":"graduation cap","shortname":":mortar_board:","category":"people","emoji_order":"194","aliases":[],"aliases_ascii":[],"keywords":["hat","office","accessories"]},"crown":{"unicode":"1f451","unicode_alternates":"","name":"crown","shortname":":crown:","category":"people","emoji_order":"195","aliases":[],"aliases_ascii":[],"keywords":["object","gem","accessories"]},"school_satchel":{"unicode":"1f392","unicode_alternates":"","name":"school satchel","shortname":":school_satchel:","category":"people","emoji_order":"196","aliases":[],"aliases_ascii":[],"keywords":["bag","fashion","office","vacation","accessories"]},"pouch":{"unicode":"1f45d","unicode_alternates":"","name":"pouch","shortname":":pouch:","category":"people","emoji_order":"197","aliases":[],"aliases_ascii":[],"keywords":["bag","women","fashion","accessories"]},"purse":{"unicode":"1f45b","unicode_alternates":"","name":"purse","shortname":":purse:","category":"people","emoji_order":"198","aliases":[],"aliases_ascii":[],"keywords":["bag","women","fashion","accessories","money","money"]},"handbag":{"unicode":"1f45c","unicode_alternates":"","name":"handbag","shortname":":handbag:","category":"people","emoji_order":"199","aliases":[],"aliases_ascii":[],"keywords":["bag","women","fashion","vacation","accessories"]},"briefcase":{"unicode":"1f4bc","unicode_alternates":"","name":"briefcase","shortname":":briefcase:","category":"people","emoji_order":"200","aliases":[],"aliases_ascii":[],"keywords":["bag","work","accessories","nutcase","nutcase","job","job"]},"eyeglasses":{"unicode":"1f453","unicode_alternates":"","name":"eyeglasses","shortname":":eyeglasses:","category":"people","emoji_order":"201","aliases":[],"aliases_ascii":[],"keywords":["fashion","glasses","accessories"]},"dark_sunglasses":{"unicode":"1f576","unicode_alternates":"1f576-fe0f","name":"dark sunglasses","shortname":":dark_sunglasses:","category":"people","emoji_order":"202","aliases":[],"aliases_ascii":[],"keywords":["fashion","glasses","accessories"]},"ring":{"unicode":"1f48d","unicode_alternates":"","name":"ring","shortname":":ring:","category":"people","emoji_order":"203","aliases":[],"aliases_ascii":[],"keywords":["wedding","object","fashion","gem","accessories"]},"closed_umbrella":{"unicode":"1f302","unicode_alternates":"","name":"closed umbrella","shortname":":closed_umbrella:","category":"people","emoji_order":"204","aliases":[],"aliases_ascii":[],"keywords":["object","sky","rain","accessories"]},"dog":{"unicode":"1f436","unicode_alternates":"","name":"dog face","shortname":":dog:","category":"nature","emoji_order":"205","aliases":[],"aliases_ascii":[],"keywords":["dog","dog","pug","pug","animal","animal"]},"cat":{"unicode":"1f431","unicode_alternates":"","name":"cat face","shortname":":cat:","category":"nature","emoji_order":"206","aliases":[],"aliases_ascii":[],"keywords":["halloween","vagina","cat","cat","animal","animal"]},"mouse":{"unicode":"1f42d","unicode_alternates":"","name":"mouse face","shortname":":mouse:","category":"nature","emoji_order":"207","aliases":[],"aliases_ascii":[],"keywords":["animal","animal"]},"hamster":{"unicode":"1f439","unicode_alternates":"","name":"hamster face","shortname":":hamster:","category":"nature","emoji_order":"208","aliases":[],"aliases_ascii":[],"keywords":["animal","animal"]},"rabbit":{"unicode":"1f430","unicode_alternates":"","name":"rabbit face","shortname":":rabbit:","category":"nature","emoji_order":"209","aliases":[],"aliases_ascii":[],"keywords":["wildlife","animal","animal"]},"bear":{"unicode":"1f43b","unicode_alternates":"","name":"bear face","shortname":":bear:","category":"nature","emoji_order":"210","aliases":[],"aliases_ascii":[],"keywords":["wildlife","roar","animal","animal"]},"panda_face":{"unicode":"1f43c","unicode_alternates":"","name":"panda face","shortname":":panda_face:","category":"nature","emoji_order":"211","aliases":[],"aliases_ascii":[],"keywords":["wildlife","roar","animal","animal"]},"koala":{"unicode":"1f428","unicode_alternates":"","name":"koala","shortname":":koala:","category":"nature","emoji_order":"212","aliases":[],"aliases_ascii":[],"keywords":["wildlife","animal","animal"]},"tiger":{"unicode":"1f42f","unicode_alternates":"","name":"tiger face","shortname":":tiger:","category":"nature","emoji_order":"213","aliases":[],"aliases_ascii":[],"keywords":["wildlife","roar","cat","cat","animal","animal"]},"lion_face":{"unicode":"1f981","unicode_alternates":"","name":"lion face","shortname":":lion_face:","category":"nature","emoji_order":"214","aliases":[":lion:"],"aliases_ascii":[],"keywords":["wildlife","roar","cat","cat","animal","animal"]},"cow":{"unicode":"1f42e","unicode_alternates":"","name":"cow face","shortname":":cow:","category":"nature","emoji_order":"215","aliases":[],"aliases_ascii":[],"keywords":["animal","animal"]},"pig":{"unicode":"1f437","unicode_alternates":"","name":"pig face","shortname":":pig:","category":"nature","emoji_order":"216","aliases":[],"aliases_ascii":[],"keywords":["animal","animal"]},"pig_nose":{"unicode":"1f43d","unicode_alternates":"","name":"pig nose","shortname":":pig_nose:","category":"nature","emoji_order":"217","aliases":[],"aliases_ascii":[],"keywords":["animal","animal"]},"frog":{"unicode":"1f438","unicode_alternates":"","name":"frog face","shortname":":frog:","category":"nature","emoji_order":"218","aliases":[],"aliases_ascii":[],"keywords":["wildlife","animal","animal"]},"octopus":{"unicode":"1f419","unicode_alternates":"","name":"octopus","shortname":":octopus:","category":"nature","emoji_order":"219","aliases":[],"aliases_ascii":[],"keywords":["wildlife","animal","animal"]},"monkey_face":{"unicode":"1f435","unicode_alternates":"","name":"monkey face","shortname":":monkey_face:","category":"nature","emoji_order":"220","aliases":[],"aliases_ascii":[],"keywords":["animal","animal"]},"see_no_evil":{"unicode":"1f648","unicode_alternates":"","name":"see-no-evil monkey","shortname":":see_no_evil:","category":"nature","emoji_order":"221","aliases":[],"aliases_ascii":[],"keywords":["animal","animal"]},"hear_no_evil":{"unicode":"1f649","unicode_alternates":"","name":"hear-no-evil monkey","shortname":":hear_no_evil:","category":"nature","emoji_order":"222","aliases":[],"aliases_ascii":[],"keywords":["animal","animal"]},"speak_no_evil":{"unicode":"1f64a","unicode_alternates":"","name":"speak-no-evil monkey","shortname":":speak_no_evil:","category":"nature","emoji_order":"223","aliases":[],"aliases_ascii":[],"keywords":["animal","animal"]},"monkey":{"unicode":"1f412","unicode_alternates":"","name":"monkey","shortname":":monkey:","category":"nature","emoji_order":"224","aliases":[],"aliases_ascii":[],"keywords":["wildlife","animal","animal"]},"chicken":{"unicode":"1f414","unicode_alternates":"","name":"chicken","shortname":":chicken:","category":"nature","emoji_order":"225","aliases":[],"aliases_ascii":[],"keywords":["animal","animal","chicken","chicken"]},"penguin":{"unicode":"1f427","unicode_alternates":"","name":"penguin","shortname":":penguin:","category":"nature","emoji_order":"226","aliases":[],"aliases_ascii":[],"keywords":["wildlife","animal","animal"]},"bird":{"unicode":"1f426","unicode_alternates":"","name":"bird","shortname":":bird:","category":"nature","emoji_order":"227","aliases":[],"aliases_ascii":[],"keywords":["wildlife","animal","animal"]},"baby_chick":{"unicode":"1f424","unicode_alternates":"","name":"baby chick","shortname":":baby_chick:","category":"nature","emoji_order":"228","aliases":[],"aliases_ascii":[],"keywords":["animal","animal","chicken","chicken"]},"hatching_chick":{"unicode":"1f423","unicode_alternates":"","name":"hatching chick","shortname":":hatching_chick:","category":"nature","emoji_order":"229","aliases":[],"aliases_ascii":[],"keywords":["animal","animal","chicken","chicken"]},"hatched_chick":{"unicode":"1f425","unicode_alternates":"","name":"front-facing baby chick","shortname":":hatched_chick:","category":"nature","emoji_order":"230","aliases":[],"aliases_ascii":[],"keywords":["animal","animal","chicken","chicken"]},"wolf":{"unicode":"1f43a","unicode_alternates":"","name":"wolf face","shortname":":wolf:","category":"nature","emoji_order":"231","aliases":[],"aliases_ascii":[],"keywords":["wildlife","roar","animal","animal"]},"boar":{"unicode":"1f417","unicode_alternates":"","name":"boar","shortname":":boar:","category":"nature","emoji_order":"232","aliases":[],"aliases_ascii":[],"keywords":["wildlife","animal","animal"]},"horse":{"unicode":"1f434","unicode_alternates":"","name":"horse face","shortname":":horse:","category":"nature","emoji_order":"233","aliases":[],"aliases_ascii":[],"keywords":["wildlife","animal","animal"]},"unicorn":{"unicode":"1f984","unicode_alternates":"","name":"unicorn face","shortname":":unicorn:","category":"nature","emoji_order":"234","aliases":[":unicorn_face:"],"aliases_ascii":[],"keywords":["animal","animal"]},"bee":{"unicode":"1f41d","unicode_alternates":"","name":"honeybee","shortname":":bee:","category":"nature","emoji_order":"235","aliases":[],"aliases_ascii":[],"keywords":["insects","animal","animal"]},"bug":{"unicode":"1f41b","unicode_alternates":"","name":"bug","shortname":":bug:","category":"nature","emoji_order":"236","aliases":[],"aliases_ascii":[],"keywords":["insects","animal","animal"]},"snail":{"unicode":"1f40c","unicode_alternates":"","name":"snail","shortname":":snail:","category":"nature","emoji_order":"237","aliases":[],"aliases_ascii":[],"keywords":["insects","animal","animal"]},"beetle":{"unicode":"1f41e","unicode_alternates":"","name":"lady beetle","shortname":":beetle:","category":"nature","emoji_order":"238","aliases":[],"aliases_ascii":[],"keywords":["insects","animal","animal"]},"ant":{"unicode":"1f41c","unicode_alternates":"","name":"ant","shortname":":ant:","category":"nature","emoji_order":"239","aliases":[],"aliases_ascii":[],"keywords":["insects","animal","animal"]},"spider":{"unicode":"1f577","unicode_alternates":"1f577-fe0f","name":"spider","shortname":":spider:","category":"nature","emoji_order":"240","aliases":[],"aliases_ascii":[],"keywords":["insects","halloween","animal","animal"]},"scorpion":{"unicode":"1f982","unicode_alternates":"","name":"scorpion","shortname":":scorpion:","category":"nature","emoji_order":"241","aliases":[],"aliases_ascii":[],"keywords":["insects","reptile","reptile","animal","animal"]},"crab":{"unicode":"1f980","unicode_alternates":"","name":"crab","shortname":":crab:","category":"nature","emoji_order":"242","aliases":[],"aliases_ascii":[],"keywords":["tropical","animal","animal"]},"snake":{"unicode":"1f40d","unicode_alternates":"","name":"snake","shortname":":snake:","category":"nature","emoji_order":"243","aliases":[],"aliases_ascii":[],"keywords":["wildlife","reptile","reptile","animal","animal","creationism","creationism"]},"turtle":{"unicode":"1f422","unicode_alternates":"","name":"turtle","shortname":":turtle:","category":"nature","emoji_order":"244","aliases":[],"aliases_ascii":[],"keywords":["wildlife","reptile","reptile","animal","animal"]},"tropical_fish":{"unicode":"1f420","unicode_alternates":"","name":"tropical fish","shortname":":tropical_fish:","category":"nature","emoji_order":"245","aliases":[],"aliases_ascii":[],"keywords":["wildlife","animal","animal"]},"fish":{"unicode":"1f41f","unicode_alternates":"","name":"fish","shortname":":fish:","category":"nature","emoji_order":"246","aliases":[],"aliases_ascii":[],"keywords":["wildlife","animal","animal"]},"blowfish":{"unicode":"1f421","unicode_alternates":"","name":"blowfish","shortname":":blowfish:","category":"nature","emoji_order":"247","aliases":[],"aliases_ascii":[],"keywords":["wildlife","animal","animal"]},"dolphin":{"unicode":"1f42c","unicode_alternates":"","name":"dolphin","shortname":":dolphin:","category":"nature","emoji_order":"248","aliases":[],"aliases_ascii":[],"keywords":["wildlife","tropical","animal","animal"]},"whale":{"unicode":"1f433","unicode_alternates":"","name":"spouting whale","shortname":":whale:","category":"nature","emoji_order":"249","aliases":[],"aliases_ascii":[],"keywords":["wildlife","tropical","whales","whales","animal","animal"]},"whale2":{"unicode":"1f40b","unicode_alternates":"","name":"whale","shortname":":whale2:","category":"nature","emoji_order":"250","aliases":[],"aliases_ascii":[],"keywords":["wildlife","tropical","whales","whales","animal","animal"]},"crocodile":{"unicode":"1f40a","unicode_alternates":"","name":"crocodile","shortname":":crocodile:","category":"nature","emoji_order":"251","aliases":[],"aliases_ascii":[],"keywords":["wildlife","reptile","reptile","animal","animal"]},"leopard":{"unicode":"1f406","unicode_alternates":"","name":"leopard","shortname":":leopard:","category":"nature","emoji_order":"252","aliases":[],"aliases_ascii":[],"keywords":["wildlife","roar","animal","animal"]},"tiger2":{"unicode":"1f405","unicode_alternates":"","name":"tiger","shortname":":tiger2:","category":"nature","emoji_order":"253","aliases":[],"aliases_ascii":[],"keywords":["wildlife","roar","animal","animal"]},"water_buffalo":{"unicode":"1f403","unicode_alternates":"","name":"water buffalo","shortname":":water_buffalo:","category":"nature","emoji_order":"254","aliases":[],"aliases_ascii":[],"keywords":["wildlife","animal","animal"]},"ox":{"unicode":"1f402","unicode_alternates":"","name":"ox","shortname":":ox:","category":"nature","emoji_order":"255","aliases":[],"aliases_ascii":[],"keywords":["animal","animal"]},"cow2":{"unicode":"1f404","unicode_alternates":"","name":"cow","shortname":":cow2:","category":"nature","emoji_order":"256","aliases":[],"aliases_ascii":[],"keywords":["animal","animal"]},"dromedary_camel":{"unicode":"1f42a","unicode_alternates":"","name":"dromedary camel","shortname":":dromedary_camel:","category":"nature","emoji_order":"257","aliases":[],"aliases_ascii":[],"keywords":["wildlife","animal","animal"]},"camel":{"unicode":"1f42b","unicode_alternates":"","name":"bactrian camel","shortname":":camel:","category":"nature","emoji_order":"258","aliases":[],"aliases_ascii":[],"keywords":["wildlife","animal","animal","hump day","hump day"]},"elephant":{"unicode":"1f418","unicode_alternates":"","name":"elephant","shortname":":elephant:","category":"nature","emoji_order":"259","aliases":[],"aliases_ascii":[],"keywords":["wildlife","animal","animal"]},"goat":{"unicode":"1f410","unicode_alternates":"","name":"goat","shortname":":goat:","category":"nature","emoji_order":"260","aliases":[],"aliases_ascii":[],"keywords":["animal","animal"]},"ram":{"unicode":"1f40f","unicode_alternates":"","name":"ram","shortname":":ram:","category":"nature","emoji_order":"261","aliases":[],"aliases_ascii":[],"keywords":["wildlife","animal","animal"]},"sheep":{"unicode":"1f411","unicode_alternates":"","name":"sheep","shortname":":sheep:","category":"nature","emoji_order":"262","aliases":[],"aliases_ascii":[],"keywords":["animal","animal"]},"racehorse":{"unicode":"1f40e","unicode_alternates":"","name":"horse","shortname":":racehorse:","category":"nature","emoji_order":"263","aliases":[],"aliases_ascii":[],"keywords":["wildlife","animal","animal"]},"pig2":{"unicode":"1f416","unicode_alternates":"","name":"pig","shortname":":pig2:","category":"nature","emoji_order":"264","aliases":[],"aliases_ascii":[],"keywords":["animal","animal"]},"rat":{"unicode":"1f400","unicode_alternates":"","name":"rat","shortname":":rat:","category":"nature","emoji_order":"265","aliases":[],"aliases_ascii":[],"keywords":["animal","animal"]},"mouse2":{"unicode":"1f401","unicode_alternates":"","name":"mouse","shortname":":mouse2:","category":"nature","emoji_order":"266","aliases":[],"aliases_ascii":[],"keywords":["animal","animal"]},"rooster":{"unicode":"1f413","unicode_alternates":"","name":"rooster","shortname":":rooster:","category":"nature","emoji_order":"267","aliases":[],"aliases_ascii":[],"keywords":["animal","animal"]},"turkey":{"unicode":"1f983","unicode_alternates":"","name":"turkey","shortname":":turkey:","category":"nature","emoji_order":"268","aliases":[],"aliases_ascii":[],"keywords":["wildlife","animal","animal"]},"dove":{"unicode":"1f54a","unicode_alternates":"1f54a-fe0f","name":"dove of peace","shortname":":dove:","category":"nature","emoji_order":"269","aliases":[":dove_of_peace:"],"aliases_ascii":[],"keywords":["animal","animal"]},"dog2":{"unicode":"1f415","unicode_alternates":"","name":"dog","shortname":":dog2:","category":"nature","emoji_order":"270","aliases":[],"aliases_ascii":[],"keywords":["dog","dog","pug","pug","animal","animal"]},"poodle":{"unicode":"1f429","unicode_alternates":"","name":"poodle","shortname":":poodle:","category":"nature","emoji_order":"271","aliases":[],"aliases_ascii":[],"keywords":["dog","dog","animal","animal"]},"cat2":{"unicode":"1f408","unicode_alternates":"","name":"cat","shortname":":cat2:","category":"nature","emoji_order":"272","aliases":[],"aliases_ascii":[],"keywords":["halloween","cat","cat","animal","animal"]},"rabbit2":{"unicode":"1f407","unicode_alternates":"","name":"rabbit","shortname":":rabbit2:","category":"nature","emoji_order":"273","aliases":[],"aliases_ascii":[],"keywords":["wildlife","animal","animal"]},"chipmunk":{"unicode":"1f43f","unicode_alternates":"1f43f-fe0f","name":"chipmunk","shortname":":chipmunk:","category":"nature","emoji_order":"274","aliases":[],"aliases_ascii":[],"keywords":["wildlife","animal","animal"]},"feet":{"unicode":"1f43e","unicode_alternates":"","name":"paw prints","shortname":":feet:","category":"nature","emoji_order":"275","aliases":[":paw_prints:"],"aliases_ascii":[],"keywords":["animal","animal"]},"dragon":{"unicode":"1f409","unicode_alternates":"","name":"dragon","shortname":":dragon:","category":"nature","emoji_order":"276","aliases":[],"aliases_ascii":[],"keywords":["roar","reptile","reptile","animal","animal"]},"dragon_face":{"unicode":"1f432","unicode_alternates":"","name":"dragon face","shortname":":dragon_face:","category":"nature","emoji_order":"277","aliases":[],"aliases_ascii":[],"keywords":["roar","monster","reptile","reptile","animal","animal"]},"cactus":{"unicode":"1f335","unicode_alternates":"","name":"cactus","shortname":":cactus:","category":"nature","emoji_order":"278","aliases":[],"aliases_ascii":[],"keywords":["nature","plant","trees","trees"]},"christmas_tree":{"unicode":"1f384","unicode_alternates":"","name":"christmas tree","shortname":":christmas_tree:","category":"nature","emoji_order":"279","aliases":[],"aliases_ascii":[],"keywords":["plant","holidays","christmas","trees","trees"]},"evergreen_tree":{"unicode":"1f332","unicode_alternates":"","name":"evergreen tree","shortname":":evergreen_tree:","category":"nature","emoji_order":"280","aliases":[],"aliases_ascii":[],"keywords":["nature","plant","holidays","christmas","camp","trees","trees"]},"deciduous_tree":{"unicode":"1f333","unicode_alternates":"","name":"deciduous tree","shortname":":deciduous_tree:","category":"nature","emoji_order":"281","aliases":[],"aliases_ascii":[],"keywords":["nature","plant","camp","trees","trees"]},"palm_tree":{"unicode":"1f334","unicode_alternates":"","name":"palm tree","shortname":":palm_tree:","category":"nature","emoji_order":"282","aliases":[],"aliases_ascii":[],"keywords":["nature","plant","tropical","trees","trees"]},"seedling":{"unicode":"1f331","unicode_alternates":"","name":"seedling","shortname":":seedling:","category":"nature","emoji_order":"283","aliases":[],"aliases_ascii":[],"keywords":["nature","plant","leaf","leaf"]},"herb":{"unicode":"1f33f","unicode_alternates":"","name":"herb","shortname":":herb:","category":"nature","emoji_order":"284","aliases":[],"aliases_ascii":[],"keywords":["nature","plant","leaf","leaf"]},"shamrock":{"unicode":"2618","unicode_alternates":"2618-fe0f","name":"shamrock","shortname":":shamrock:","category":"nature","emoji_order":"285","aliases":[],"aliases_ascii":[],"keywords":["nature","plant","luck","leaf","leaf"]},"four_leaf_clover":{"unicode":"1f340","unicode_alternates":"","name":"four leaf clover","shortname":":four_leaf_clover:","category":"nature","emoji_order":"286","aliases":[],"aliases_ascii":[],"keywords":["nature","plant","luck","leaf","leaf","sol","sol"]},"bamboo":{"unicode":"1f38d","unicode_alternates":"","name":"pine decoration","shortname":":bamboo:","category":"nature","emoji_order":"287","aliases":[],"aliases_ascii":[],"keywords":["nature","plant"]},"tanabata_tree":{"unicode":"1f38b","unicode_alternates":"","name":"tanabata tree","shortname":":tanabata_tree:","category":"nature","emoji_order":"288","aliases":[],"aliases_ascii":[],"keywords":["nature","plant","trees","trees"]},"leaves":{"unicode":"1f343","unicode_alternates":"","name":"leaf fluttering in wind","shortname":":leaves:","category":"nature","emoji_order":"289","aliases":[],"aliases_ascii":[],"keywords":["nature","plant","leaf","leaf"]},"fallen_leaf":{"unicode":"1f342","unicode_alternates":"","name":"fallen leaf","shortname":":fallen_leaf:","category":"nature","emoji_order":"290","aliases":[],"aliases_ascii":[],"keywords":["nature","plant","leaf","leaf"]},"maple_leaf":{"unicode":"1f341","unicode_alternates":"","name":"maple leaf","shortname":":maple_leaf:","category":"nature","emoji_order":"291","aliases":[],"aliases_ascii":[],"keywords":["nature","plant","leaf","leaf"]},"ear_of_rice":{"unicode":"1f33e","unicode_alternates":"","name":"ear of rice","shortname":":ear_of_rice:","category":"nature","emoji_order":"292","aliases":[],"aliases_ascii":[],"keywords":["nature","plant","leaf","leaf"]},"hibiscus":{"unicode":"1f33a","unicode_alternates":"","name":"hibiscus","shortname":":hibiscus:","category":"nature","emoji_order":"293","aliases":[],"aliases_ascii":[],"keywords":["nature","flower","plant","tropical"]},"sunflower":{"unicode":"1f33b","unicode_alternates":"","name":"sunflower","shortname":":sunflower:","category":"nature","emoji_order":"294","aliases":[],"aliases_ascii":[],"keywords":["nature","flower","plant"]},"rose":{"unicode":"1f339","unicode_alternates":"","name":"rose","shortname":":rose:","category":"nature","emoji_order":"295","aliases":[],"aliases_ascii":[],"keywords":["nature","flower","plant","rip","rip","condolence","condolence","beautiful","beautiful"]},"tulip":{"unicode":"1f337","unicode_alternates":"","name":"tulip","shortname":":tulip:","category":"nature","emoji_order":"296","aliases":[],"aliases_ascii":[],"keywords":["nature","flower","plant","vagina","girls night","girls night"]},"blossom":{"unicode":"1f33c","unicode_alternates":"","name":"blossom","shortname":":blossom:","category":"nature","emoji_order":"297","aliases":[],"aliases_ascii":[],"keywords":["nature","flower","plant"]},"cherry_blossom":{"unicode":"1f338","unicode_alternates":"","name":"cherry blossom","shortname":":cherry_blossom:","category":"nature","emoji_order":"298","aliases":[],"aliases_ascii":[],"keywords":["nature","flower","plant","tropical"]},"bouquet":{"unicode":"1f490","unicode_alternates":"","name":"bouquet","shortname":":bouquet:","category":"nature","emoji_order":"299","aliases":[],"aliases_ascii":[],"keywords":["nature","flower","plant","rip","rip","condolence","condolence"]},"mushroom":{"unicode":"1f344","unicode_alternates":"","name":"mushroom","shortname":":mushroom:","category":"nature","emoji_order":"300","aliases":[],"aliases_ascii":[],"keywords":["nature","plant","drugs","drugs"]},"chestnut":{"unicode":"1f330","unicode_alternates":"","name":"chestnut","shortname":":chestnut:","category":"nature","emoji_order":"301","aliases":[],"aliases_ascii":[],"keywords":["nature","plant"]},"jack_o_lantern":{"unicode":"1f383","unicode_alternates":"","name":"jack-o-lantern","shortname":":jack_o_lantern:","category":"nature","emoji_order":"302","aliases":[],"aliases_ascii":[],"keywords":["holidays","halloween"]},"shell":{"unicode":"1f41a","unicode_alternates":"","name":"spiral shell","shortname":":shell:","category":"nature","emoji_order":"303","aliases":[],"aliases_ascii":[],"keywords":[]},"spider_web":{"unicode":"1f578","unicode_alternates":"1f578-fe0f","name":"spider web","shortname":":spider_web:","category":"nature","emoji_order":"304","aliases":[],"aliases_ascii":[],"keywords":["halloween"]},"earth_americas":{"unicode":"1f30e","unicode_alternates":"","name":"earth globe americas","shortname":":earth_americas:","category":"nature","emoji_order":"305","aliases":[],"aliases_ascii":[],"keywords":["map","vacation","globe","globe"]},"earth_africa":{"unicode":"1f30d","unicode_alternates":"","name":"earth globe europe-africa","shortname":":earth_africa:","category":"nature","emoji_order":"306","aliases":[],"aliases_ascii":[],"keywords":["map","vacation","globe","globe"]},"earth_asia":{"unicode":"1f30f","unicode_alternates":"","name":"earth globe asia-australia","shortname":":earth_asia:","category":"nature","emoji_order":"307","aliases":[],"aliases_ascii":[],"keywords":["map","vacation","globe","globe"]},"full_moon":{"unicode":"1f315","unicode_alternates":"","name":"full moon symbol","shortname":":full_moon:","category":"nature","emoji_order":"308","aliases":[],"aliases_ascii":[],"keywords":["space","sky","moon","moon"]},"waning_gibbous_moon":{"unicode":"1f316","unicode_alternates":"","name":"waning gibbous moon symbol","shortname":":waning_gibbous_moon:","category":"nature","emoji_order":"309","aliases":[],"aliases_ascii":[],"keywords":["space","sky","moon","moon"]},"last_quarter_moon":{"unicode":"1f317","unicode_alternates":"","name":"last quarter moon symbol","shortname":":last_quarter_moon:","category":"nature","emoji_order":"310","aliases":[],"aliases_ascii":[],"keywords":["space","sky","moon","moon"]},"waning_crescent_moon":{"unicode":"1f318","unicode_alternates":"","name":"waning crescent moon symbol","shortname":":waning_crescent_moon:","category":"nature","emoji_order":"311","aliases":[],"aliases_ascii":[],"keywords":["space","sky","moon","moon"]},"new_moon":{"unicode":"1f311","unicode_alternates":"","name":"new moon symbol","shortname":":new_moon:","category":"nature","emoji_order":"312","aliases":[],"aliases_ascii":[],"keywords":["space","sky","moon","moon"]},"waxing_crescent_moon":{"unicode":"1f312","unicode_alternates":"","name":"waxing crescent moon symbol","shortname":":waxing_crescent_moon:","category":"nature","emoji_order":"313","aliases":[],"aliases_ascii":[],"keywords":["space","sky","moon","moon"]},"first_quarter_moon":{"unicode":"1f313","unicode_alternates":"","name":"first quarter moon symbol","shortname":":first_quarter_moon:","category":"nature","emoji_order":"314","aliases":[],"aliases_ascii":[],"keywords":["space","sky","moon","moon"]},"waxing_gibbous_moon":{"unicode":"1f314","unicode_alternates":"","name":"waxing gibbous moon symbol","shortname":":waxing_gibbous_moon:","category":"nature","emoji_order":"315","aliases":[],"aliases_ascii":[],"keywords":["space","sky","moon","moon"]},"new_moon_with_face":{"unicode":"1f31a","unicode_alternates":"","name":"new moon with face","shortname":":new_moon_with_face:","category":"nature","emoji_order":"316","aliases":[],"aliases_ascii":[],"keywords":["space","sky","goodnight","goodnight","moon","moon"]},"full_moon_with_face":{"unicode":"1f31d","unicode_alternates":"","name":"full moon with face","shortname":":full_moon_with_face:","category":"nature","emoji_order":"317","aliases":[],"aliases_ascii":[],"keywords":["space","sky","goodnight","goodnight","moon","moon"]},"first_quarter_moon_with_face":{"unicode":"1f31b","unicode_alternates":"","name":"first quarter moon with face","shortname":":first_quarter_moon_with_face:","category":"nature","emoji_order":"318","aliases":[],"aliases_ascii":[],"keywords":["space","sky","moon","moon"]},"last_quarter_moon_with_face":{"unicode":"1f31c","unicode_alternates":"","name":"last quarter moon with face","shortname":":last_quarter_moon_with_face:","category":"nature","emoji_order":"319","aliases":[],"aliases_ascii":[],"keywords":["space","sky","moon","moon"]},"sun_with_face":{"unicode":"1f31e","unicode_alternates":"","name":"sun with face","shortname":":sun_with_face:","category":"nature","emoji_order":"320","aliases":[],"aliases_ascii":[],"keywords":["sky","day","sun","hump day","hump day","morning","morning"]},"crescent_moon":{"unicode":"1f319","unicode_alternates":"","name":"crescent moon","shortname":":crescent_moon:","category":"nature","emoji_order":"321","aliases":[],"aliases_ascii":[],"keywords":["space","sky","goodnight","goodnight","moon","moon"]},"star":{"unicode":"2b50","unicode_alternates":"2b50-fe0f","name":"white medium star","shortname":":star:","category":"nature","emoji_order":"322","aliases":[],"aliases_ascii":[],"keywords":["space","sky","star"]},"star2":{"unicode":"1f31f","unicode_alternates":"","name":"glowing star","shortname":":star2:","category":"nature","emoji_order":"323","aliases":[],"aliases_ascii":[],"keywords":["space","sky","star"]},"dizzy":{"unicode":"1f4ab","unicode_alternates":"","name":"dizzy symbol","shortname":":dizzy:","category":"nature","emoji_order":"324","aliases":[],"aliases_ascii":[],"keywords":["star","symbol"]},"sparkles":{"unicode":"2728","unicode_alternates":"","name":"sparkles","shortname":":sparkles:","category":"nature","emoji_order":"325","aliases":[],"aliases_ascii":[],"keywords":["star","girls night","girls night"]},"comet":{"unicode":"2604","unicode_alternates":"2604-fe0f","name":"comet","shortname":":comet:","category":"nature","emoji_order":"326","aliases":[],"aliases_ascii":[],"keywords":["space","sky"]},"sunny":{"unicode":"2600","unicode_alternates":"2600-fe0f","name":"black sun with rays","shortname":":sunny:","category":"nature","emoji_order":"327","aliases":[],"aliases_ascii":[],"keywords":["weather","sky","day","sun","hot","hot","morning","morning"]},"white_sun_small_cloud":{"unicode":"1f324","unicode_alternates":"1f324-fe0f","name":"white sun with small cloud","shortname":":white_sun_small_cloud:","category":"nature","emoji_order":"328","aliases":[":white_sun_with_small_cloud:"],"aliases_ascii":[],"keywords":["weather","sky","cloud","sun"]},"partly_sunny":{"unicode":"26c5","unicode_alternates":"26c5-fe0f","name":"sun behind cloud","shortname":":partly_sunny:","category":"nature","emoji_order":"329","aliases":[],"aliases_ascii":[],"keywords":["weather","sky","cloud","sun"]},"white_sun_cloud":{"unicode":"1f325","unicode_alternates":"1f325-fe0f","name":"white sun behind cloud","shortname":":white_sun_cloud:","category":"nature","emoji_order":"330","aliases":[":white_sun_behind_cloud:"],"aliases_ascii":[],"keywords":["weather","sky","cloud","cold","sun"]},"white_sun_rain_cloud":{"unicode":"1f326","unicode_alternates":"1f326-fe0f","name":"white sun behind cloud with rain","shortname":":white_sun_rain_cloud:","category":"nature","emoji_order":"331","aliases":[":white_sun_behind_cloud_with_rain:"],"aliases_ascii":[],"keywords":["weather","sky","cloud","cold","rain","sun"]},"cloud":{"unicode":"2601","unicode_alternates":"2601-fe0f","name":"cloud","shortname":":cloud:","category":"nature","emoji_order":"332","aliases":[],"aliases_ascii":[],"keywords":["weather","sky","cloud","cold","rain"]},"cloud_rain":{"unicode":"1f327","unicode_alternates":"1f327-fe0f","name":"cloud with rain","shortname":":cloud_rain:","category":"nature","emoji_order":"333","aliases":[":cloud_with_rain:"],"aliases_ascii":[],"keywords":["weather","winter","sky","cloud","cold","rain"]},"thunder_cloud_rain":{"unicode":"26c8","unicode_alternates":"26c8-fe0f","name":"thunder cloud and rain","shortname":":thunder_cloud_rain:","category":"nature","emoji_order":"334","aliases":[":thunder_cloud_and_rain:"],"aliases_ascii":[],"keywords":["weather","sky","cloud","cold","rain"]},"cloud_lightning":{"unicode":"1f329","unicode_alternates":"1f329-fe0f","name":"cloud with lightning","shortname":":cloud_lightning:","category":"nature","emoji_order":"335","aliases":[":cloud_with_lightning:"],"aliases_ascii":[],"keywords":["weather","sky","cloud","cold","rain"]},"zap":{"unicode":"26a1","unicode_alternates":"26a1-fe0f","name":"high voltage sign","shortname":":zap:","category":"nature","emoji_order":"336","aliases":[],"aliases_ascii":[],"keywords":["weather","sky","diarrhea","diarrhea"]},"fire":{"unicode":"1f525","unicode_alternates":"","name":"fire","shortname":":fire:","category":"nature","emoji_order":"337","aliases":[":flame:"],"aliases_ascii":[],"keywords":["wth","wth","hot","hot"]},"boom":{"unicode":"1f4a5","unicode_alternates":"","name":"collision symbol","shortname":":boom:","category":"nature","emoji_order":"338","aliases":[],"aliases_ascii":[],"keywords":["symbol","blast","blast"]},"snowflake":{"unicode":"2744","unicode_alternates":"2744-fe0f","name":"snowflake","shortname":":snowflake:","category":"nature","emoji_order":"339","aliases":[],"aliases_ascii":[],"keywords":["weather","winter","sky","holidays","cold","snow","snow"]},"cloud_snow":{"unicode":"1f328","unicode_alternates":"1f328-fe0f","name":"cloud with snow","shortname":":cloud_snow:","category":"nature","emoji_order":"340","aliases":[":cloud_with_snow:"],"aliases_ascii":[],"keywords":["weather","winter","sky","cloud","cold","snow","snow"]},"snowman2":{"unicode":"2603","unicode_alternates":"2603-fe0f","name":"snowman","shortname":":snowman2:","category":"nature","emoji_order":"341","aliases":[],"aliases_ascii":[],"keywords":["weather","winter","holidays","christmas","cold","snow","snow"]},"snowman":{"unicode":"26c4","unicode_alternates":"26c4-fe0f","name":"snowman without snow","shortname":":snowman:","category":"nature","emoji_order":"342","aliases":[],"aliases_ascii":[],"keywords":["weather","winter","holidays","cold","snow","snow"]},"wind_blowing_face":{"unicode":"1f32c","unicode_alternates":"1f32c-fe0f","name":"wind blowing face","shortname":":wind_blowing_face:","category":"nature","emoji_order":"343","aliases":[],"aliases_ascii":[],"keywords":["weather","cold"]},"dash":{"unicode":"1f4a8","unicode_alternates":"","name":"dash symbol","shortname":":dash:","category":"nature","emoji_order":"344","aliases":[],"aliases_ascii":[],"keywords":["cloud","cold","smoking","smoking"]},"cloud_tornado":{"unicode":"1f32a","unicode_alternates":"1f32a-fe0f","name":"cloud with tornado","shortname":":cloud_tornado:","category":"nature","emoji_order":"345","aliases":[":cloud_with_tornado:"],"aliases_ascii":[],"keywords":["weather","sky","cold"]},"fog":{"unicode":"1f32b","unicode_alternates":"1f32b-fe0f","name":"fog","shortname":":fog:","category":"nature","emoji_order":"346","aliases":[],"aliases_ascii":[],"keywords":["weather","sky","cold"]},"umbrella2":{"unicode":"2602","unicode_alternates":"2602-fe0f","name":"umbrella","shortname":":umbrella2:","category":"nature","emoji_order":"347","aliases":[],"aliases_ascii":[],"keywords":["weather","object","sky","cold"]},"umbrella":{"unicode":"2614","unicode_alternates":"2614-fe0f","name":"umbrella with rain drops","shortname":":umbrella:","category":"nature","emoji_order":"348","aliases":[],"aliases_ascii":[],"keywords":["weather","sky","cold","rain"]},"droplet":{"unicode":"1f4a7","unicode_alternates":"","name":"droplet","shortname":":droplet:","category":"nature","emoji_order":"349","aliases":[],"aliases_ascii":[],"keywords":["weather","sky","rain"]},"sweat_drops":{"unicode":"1f4a6","unicode_alternates":"","name":"splashing sweat symbol","shortname":":sweat_drops:","category":"nature","emoji_order":"350","aliases":[],"aliases_ascii":[],"keywords":["rain","stressed","sweat"]},"ocean":{"unicode":"1f30a","unicode_alternates":"","name":"water wave","shortname":":ocean:","category":"nature","emoji_order":"351","aliases":[],"aliases_ascii":[],"keywords":["weather","boat","tropical","swim"]},"green_apple":{"unicode":"1f34f","unicode_alternates":"","name":"green apple","shortname":":green_apple:","category":"food","emoji_order":"352","aliases":[],"aliases_ascii":[],"keywords":["fruit","food"]},"apple":{"unicode":"1f34e","unicode_alternates":"","name":"red apple","shortname":":apple:","category":"food","emoji_order":"353","aliases":[],"aliases_ascii":[],"keywords":["fruit","food","creationism","creationism"]},"pear":{"unicode":"1f350","unicode_alternates":"","name":"pear","shortname":":pear:","category":"food","emoji_order":"354","aliases":[],"aliases_ascii":[],"keywords":["fruit","food"]},"tangerine":{"unicode":"1f34a","unicode_alternates":"","name":"tangerine","shortname":":tangerine:","category":"food","emoji_order":"355","aliases":[],"aliases_ascii":[],"keywords":["fruit","food"]},"lemon":{"unicode":"1f34b","unicode_alternates":"","name":"lemon","shortname":":lemon:","category":"food","emoji_order":"356","aliases":[],"aliases_ascii":[],"keywords":["fruit","food"]},"banana":{"unicode":"1f34c","unicode_alternates":"","name":"banana","shortname":":banana:","category":"food","emoji_order":"357","aliases":[],"aliases_ascii":[],"keywords":["fruit","penis","food"]},"watermelon":{"unicode":"1f349","unicode_alternates":"","name":"watermelon","shortname":":watermelon:","category":"food","emoji_order":"358","aliases":[],"aliases_ascii":[],"keywords":["fruit","food"]},"grapes":{"unicode":"1f347","unicode_alternates":"","name":"grapes","shortname":":grapes:","category":"food","emoji_order":"359","aliases":[],"aliases_ascii":[],"keywords":["fruit","food"]},"strawberry":{"unicode":"1f353","unicode_alternates":"","name":"strawberry","shortname":":strawberry:","category":"food","emoji_order":"360","aliases":[],"aliases_ascii":[],"keywords":["fruit","food"]},"melon":{"unicode":"1f348","unicode_alternates":"","name":"melon","shortname":":melon:","category":"food","emoji_order":"361","aliases":[],"aliases_ascii":[],"keywords":["fruit","boobs","food"]},"cherries":{"unicode":"1f352","unicode_alternates":"","name":"cherries","shortname":":cherries:","category":"food","emoji_order":"362","aliases":[],"aliases_ascii":[],"keywords":["fruit","food"]},"peach":{"unicode":"1f351","unicode_alternates":"","name":"peach","shortname":":peach:","category":"food","emoji_order":"363","aliases":[],"aliases_ascii":[],"keywords":["fruit","butt","food"]},"pineapple":{"unicode":"1f34d","unicode_alternates":"","name":"pineapple","shortname":":pineapple:","category":"food","emoji_order":"364","aliases":[],"aliases_ascii":[],"keywords":["fruit","food","tropical"]},"tomato":{"unicode":"1f345","unicode_alternates":"","name":"tomato","shortname":":tomato:","category":"food","emoji_order":"365","aliases":[],"aliases_ascii":[],"keywords":["fruit","vegetables","food"]},"eggplant":{"unicode":"1f346","unicode_alternates":"","name":"aubergine","shortname":":eggplant:","category":"food","emoji_order":"366","aliases":[],"aliases_ascii":[],"keywords":["vegetables","penis","food"]},"hot_pepper":{"unicode":"1f336","unicode_alternates":"1f336-fe0f","name":"hot pepper","shortname":":hot_pepper:","category":"food","emoji_order":"367","aliases":[],"aliases_ascii":[],"keywords":["vegetables","food"]},"corn":{"unicode":"1f33d","unicode_alternates":"","name":"ear of maize","shortname":":corn:","category":"food","emoji_order":"368","aliases":[],"aliases_ascii":[],"keywords":["vegetables","food"]},"sweet_potato":{"unicode":"1f360","unicode_alternates":"","name":"roasted sweet potato","shortname":":sweet_potato:","category":"food","emoji_order":"369","aliases":[],"aliases_ascii":[],"keywords":["vegetables","food"]},"honey_pot":{"unicode":"1f36f","unicode_alternates":"","name":"honey pot","shortname":":honey_pot:","category":"food","emoji_order":"370","aliases":[],"aliases_ascii":[],"keywords":["food","vagina"]},"bread":{"unicode":"1f35e","unicode_alternates":"","name":"bread","shortname":":bread:","category":"food","emoji_order":"371","aliases":[],"aliases_ascii":[],"keywords":["food"]},"cheese":{"unicode":"1f9c0","unicode_alternates":"","name":"cheese wedge","shortname":":cheese:","category":"food","emoji_order":"372","aliases":[":cheese_wedge:"],"aliases_ascii":[],"keywords":["food"]},"poultry_leg":{"unicode":"1f357","unicode_alternates":"","name":"poultry leg","shortname":":poultry_leg:","category":"food","emoji_order":"373","aliases":[],"aliases_ascii":[],"keywords":["food","holidays"]},"meat_on_bone":{"unicode":"1f356","unicode_alternates":"","name":"meat on bone","shortname":":meat_on_bone:","category":"food","emoji_order":"374","aliases":[],"aliases_ascii":[],"keywords":["food"]},"fried_shrimp":{"unicode":"1f364","unicode_alternates":"","name":"fried shrimp","shortname":":fried_shrimp:","category":"food","emoji_order":"375","aliases":[],"aliases_ascii":[],"keywords":["food"]},"egg":{"unicode":"1f373","unicode_alternates":"","name":"cooking","shortname":":egg:","category":"food","emoji_order":"376","aliases":[],"aliases_ascii":[],"keywords":["food"]},"hamburger":{"unicode":"1f354","unicode_alternates":"","name":"hamburger","shortname":":hamburger:","category":"food","emoji_order":"377","aliases":[],"aliases_ascii":[],"keywords":["america","food"]},"fries":{"unicode":"1f35f","unicode_alternates":"","name":"french fries","shortname":":fries:","category":"food","emoji_order":"378","aliases":[],"aliases_ascii":[],"keywords":["america","food"]},"hotdog":{"unicode":"1f32d","unicode_alternates":"","name":"hot dog","shortname":":hotdog:","category":"food","emoji_order":"379","aliases":[":hot_dog:"],"aliases_ascii":[],"keywords":["america","food"]},"pizza":{"unicode":"1f355","unicode_alternates":"","name":"slice of pizza","shortname":":pizza:","category":"food","emoji_order":"380","aliases":[],"aliases_ascii":[],"keywords":["italian","food","boys night","boys night"]},"spaghetti":{"unicode":"1f35d","unicode_alternates":"","name":"spaghetti","shortname":":spaghetti:","category":"food","emoji_order":"381","aliases":[],"aliases_ascii":[],"keywords":["noodles","pasta","italian","food"]},"taco":{"unicode":"1f32e","unicode_alternates":"","name":"taco","shortname":":taco:","category":"food","emoji_order":"382","aliases":[],"aliases_ascii":[],"keywords":["food","mexican","vagina"]},"burrito":{"unicode":"1f32f","unicode_alternates":"","name":"burrito","shortname":":burrito:","category":"food","emoji_order":"383","aliases":[],"aliases_ascii":[],"keywords":["food","mexican"]},"ramen":{"unicode":"1f35c","unicode_alternates":"","name":"steaming bowl","shortname":":ramen:","category":"food","emoji_order":"384","aliases":[],"aliases_ascii":[],"keywords":["noodles","ramen","japan","food"]},"stew":{"unicode":"1f372","unicode_alternates":"","name":"pot of food","shortname":":stew:","category":"food","emoji_order":"385","aliases":[],"aliases_ascii":[],"keywords":["food","steam","steam"]},"fish_cake":{"unicode":"1f365","unicode_alternates":"","name":"fish cake with swirl design","shortname":":fish_cake:","category":"food","emoji_order":"386","aliases":[],"aliases_ascii":[],"keywords":["sushi","food"]},"sushi":{"unicode":"1f363","unicode_alternates":"","name":"sushi","shortname":":sushi:","category":"food","emoji_order":"387","aliases":[],"aliases_ascii":[],"keywords":["sushi","japan","food"]},"bento":{"unicode":"1f371","unicode_alternates":"","name":"bento box","shortname":":bento:","category":"food","emoji_order":"388","aliases":[],"aliases_ascii":[],"keywords":["object","sushi","japan","food"]},"curry":{"unicode":"1f35b","unicode_alternates":"","name":"curry and rice","shortname":":curry:","category":"food","emoji_order":"389","aliases":[],"aliases_ascii":[],"keywords":["food"]},"rice_ball":{"unicode":"1f359","unicode_alternates":"","name":"rice ball","shortname":":rice_ball:","category":"food","emoji_order":"390","aliases":[],"aliases_ascii":[],"keywords":["sushi","japan","food"]},"rice":{"unicode":"1f35a","unicode_alternates":"","name":"cooked rice","shortname":":rice:","category":"food","emoji_order":"391","aliases":[],"aliases_ascii":[],"keywords":["sushi","japan","food"]},"rice_cracker":{"unicode":"1f358","unicode_alternates":"","name":"rice cracker","shortname":":rice_cracker:","category":"food","emoji_order":"392","aliases":[],"aliases_ascii":[],"keywords":["sushi","food"]},"oden":{"unicode":"1f362","unicode_alternates":"","name":"oden","shortname":":oden:","category":"food","emoji_order":"393","aliases":[],"aliases_ascii":[],"keywords":["food"]},"dango":{"unicode":"1f361","unicode_alternates":"","name":"dango","shortname":":dango:","category":"food","emoji_order":"394","aliases":[],"aliases_ascii":[],"keywords":["food"]},"shaved_ice":{"unicode":"1f367","unicode_alternates":"","name":"shaved ice","shortname":":shaved_ice:","category":"food","emoji_order":"395","aliases":[],"aliases_ascii":[],"keywords":["food"]},"ice_cream":{"unicode":"1f368","unicode_alternates":"","name":"ice cream","shortname":":ice_cream:","category":"food","emoji_order":"396","aliases":[],"aliases_ascii":[],"keywords":["food"]},"icecream":{"unicode":"1f366","unicode_alternates":"","name":"soft ice cream","shortname":":icecream:","category":"food","emoji_order":"397","aliases":[],"aliases_ascii":[],"keywords":["food"]},"cake":{"unicode":"1f370","unicode_alternates":"","name":"shortcake","shortname":":cake:","category":"food","emoji_order":"398","aliases":[],"aliases_ascii":[],"keywords":["food"]},"birthday":{"unicode":"1f382","unicode_alternates":"","name":"birthday cake","shortname":":birthday:","category":"food","emoji_order":"399","aliases":[],"aliases_ascii":[],"keywords":["birthday","food","parties","parties"]},"custard":{"unicode":"1f36e","unicode_alternates":"","name":"custard","shortname":":custard:","category":"food","emoji_order":"400","aliases":[":pudding:",":flan:"],"aliases_ascii":[],"keywords":["food"]},"candy":{"unicode":"1f36c","unicode_alternates":"","name":"candy","shortname":":candy:","category":"food","emoji_order":"401","aliases":[],"aliases_ascii":[],"keywords":["food","halloween"]},"lollipop":{"unicode":"1f36d","unicode_alternates":"","name":"lollipop","shortname":":lollipop:","category":"food","emoji_order":"402","aliases":[],"aliases_ascii":[],"keywords":["food","halloween"]},"chocolate_bar":{"unicode":"1f36b","unicode_alternates":"","name":"chocolate bar","shortname":":chocolate_bar:","category":"food","emoji_order":"403","aliases":[],"aliases_ascii":[],"keywords":["food","halloween"]},"popcorn":{"unicode":"1f37f","unicode_alternates":"","name":"popcorn","shortname":":popcorn:","category":"food","emoji_order":"404","aliases":[],"aliases_ascii":[],"keywords":["food","parties","parties"]},"doughnut":{"unicode":"1f369","unicode_alternates":"","name":"doughnut","shortname":":doughnut:","category":"food","emoji_order":"405","aliases":[],"aliases_ascii":[],"keywords":["food"]},"cookie":{"unicode":"1f36a","unicode_alternates":"","name":"cookie","shortname":":cookie:","category":"food","emoji_order":"406","aliases":[],"aliases_ascii":[],"keywords":["food","vagina"]},"beer":{"unicode":"1f37a","unicode_alternates":"","name":"beer mug","shortname":":beer:","category":"food","emoji_order":"407","aliases":[],"aliases_ascii":[],"keywords":["drink","beer","alcohol","parties","parties"]},"beers":{"unicode":"1f37b","unicode_alternates":"","name":"clinking beer mugs","shortname":":beers:","category":"food","emoji_order":"408","aliases":[],"aliases_ascii":[],"keywords":["drink","cheers","beer","alcohol","thank you","boys night","boys night","parties","parties"]},"wine_glass":{"unicode":"1f377","unicode_alternates":"","name":"wine glass","shortname":":wine_glass:","category":"food","emoji_order":"409","aliases":[],"aliases_ascii":[],"keywords":["drink","italian","alcohol","girls night","girls night","parties","parties"]},"cocktail":{"unicode":"1f378","unicode_alternates":"","name":"cocktail glass","shortname":":cocktail:","category":"food","emoji_order":"410","aliases":[],"aliases_ascii":[],"keywords":["drink","cocktail","alcohol","girls night","girls night","parties","parties"]},"tropical_drink":{"unicode":"1f379","unicode_alternates":"","name":"tropical drink","shortname":":tropical_drink:","category":"food","emoji_order":"411","aliases":[],"aliases_ascii":[],"keywords":["drink","cocktail","tropical","alcohol"]},"champagne":{"unicode":"1f37e","unicode_alternates":"","name":"bottle with popping cork","shortname":":champagne:","category":"food","emoji_order":"412","aliases":[":bottle_with_popping_cork:"],"aliases_ascii":[],"keywords":["drink","cheers","alcohol","parties","parties"]},"sake":{"unicode":"1f376","unicode_alternates":"","name":"sake bottle and cup","shortname":":sake:","category":"food","emoji_order":"413","aliases":[],"aliases_ascii":[],"keywords":["drink","japan","sake","alcohol","girls night","girls night"]},"tea":{"unicode":"1f375","unicode_alternates":"","name":"teacup without handle","shortname":":tea:","category":"food","emoji_order":"414","aliases":[],"aliases_ascii":[],"keywords":["drink","japan","caffeine","steam","steam","morning","morning"]},"coffee":{"unicode":"2615","unicode_alternates":"2615-fe0f","name":"hot beverage","shortname":":coffee:","category":"food","emoji_order":"415","aliases":[],"aliases_ascii":[],"keywords":["drink","caffeine","steam","steam","morning","morning"]},"baby_bottle":{"unicode":"1f37c","unicode_alternates":"","name":"baby bottle","shortname":":baby_bottle:","category":"food","emoji_order":"416","aliases":[],"aliases_ascii":[],"keywords":["drink","object","food","baby"]},"fork_and_knife":{"unicode":"1f374","unicode_alternates":"","name":"fork and knife","shortname":":fork_and_knife:","category":"food","emoji_order":"417","aliases":[],"aliases_ascii":[],"keywords":["object","weapon","food"]},"fork_knife_plate":{"unicode":"1f37d","unicode_alternates":"1f37d-fe0f","name":"fork and knife with plate","shortname":":fork_knife_plate:","category":"food","emoji_order":"418","aliases":[":fork_and_knife_with_plate:"],"aliases_ascii":[],"keywords":["object","food"]},"soccer":{"unicode":"26bd","unicode_alternates":"26bd-fe0f","name":"soccer ball","shortname":":soccer:","category":"activity","emoji_order":"419","aliases":[],"aliases_ascii":[],"keywords":["game","ball","sport","soccer","football"]},"basketball":{"unicode":"1f3c0","unicode_alternates":"","name":"basketball and hoop","shortname":":basketball:","category":"activity","emoji_order":"420","aliases":[],"aliases_ascii":[],"keywords":["game","ball","sport","basketball"]},"football":{"unicode":"1f3c8","unicode_alternates":"","name":"american football","shortname":":football:","category":"activity","emoji_order":"421","aliases":[],"aliases_ascii":[],"keywords":["america","game","ball","sport","football"]},"baseball":{"unicode":"26be","unicode_alternates":"26be-fe0f","name":"baseball","shortname":":baseball:","category":"activity","emoji_order":"422","aliases":[],"aliases_ascii":[],"keywords":["game","ball","sport","baseball"]},"tennis":{"unicode":"1f3be","unicode_alternates":"","name":"tennis racquet and ball","shortname":":tennis:","category":"activity","emoji_order":"423","aliases":[],"aliases_ascii":[],"keywords":["game","ball","sport","tennis"]},"volleyball":{"unicode":"1f3d0","unicode_alternates":"","name":"volleyball","shortname":":volleyball:","category":"activity","emoji_order":"424","aliases":[],"aliases_ascii":[],"keywords":["game","ball","sport","volleyball"]},"rugby_football":{"unicode":"1f3c9","unicode_alternates":"","name":"rugby football","shortname":":rugby_football:","category":"activity","emoji_order":"425","aliases":[],"aliases_ascii":[],"keywords":["game","sport","football"]},"8ball":{"unicode":"1f3b1","unicode_alternates":"","name":"billiards","shortname":":8ball:","category":"activity","emoji_order":"426","aliases":[],"aliases_ascii":[],"keywords":["game","ball","sport","billiards","luck","boys night","boys night"]},"golf":{"unicode":"26f3","unicode_alternates":"26f3-fe0f","name":"flag in hole","shortname":":golf:","category":"activity","emoji_order":"427","aliases":[],"aliases_ascii":[],"keywords":["game","ball","vacation","sport","golf","golf"]},"golfer":{"unicode":"1f3cc","unicode_alternates":"1f3cc-fe0f","name":"golfer","shortname":":golfer:","category":"activity","emoji_order":"428","aliases":[],"aliases_ascii":[],"keywords":["men","game","ball","vacation","sport","golf","golf"]},"ping_pong":{"unicode":"1f3d3","unicode_alternates":"","name":"table tennis paddle and ball","shortname":":ping_pong:","category":"activity","emoji_order":"429","aliases":[":table_tennis:"],"aliases_ascii":[],"keywords":["game","ball","sport","ping pong"]},"badminton":{"unicode":"1f3f8","unicode_alternates":"","name":"badminton racquet","shortname":":badminton:","category":"activity","emoji_order":"430","aliases":[],"aliases_ascii":[],"keywords":["game","sport","badminton"]},"hockey":{"unicode":"1f3d2","unicode_alternates":"","name":"ice hockey stick and puck","shortname":":hockey:","category":"activity","emoji_order":"431","aliases":[],"aliases_ascii":[],"keywords":["game","sport","hockey"]},"field_hockey":{"unicode":"1f3d1","unicode_alternates":"","name":"field hockey stick and ball","shortname":":field_hockey:","category":"activity","emoji_order":"432","aliases":[],"aliases_ascii":[],"keywords":["ball","sport","hockey"]},"cricket":{"unicode":"1f3cf","unicode_alternates":"","name":"cricket bat and ball","shortname":":cricket:","category":"activity","emoji_order":"433","aliases":[":cricket_bat_ball:"],"aliases_ascii":[],"keywords":["ball","sport","cricket"]},"ski":{"unicode":"1f3bf","unicode_alternates":"","name":"ski and ski boot","shortname":":ski:","category":"activity","emoji_order":"434","aliases":[],"aliases_ascii":[],"keywords":["cold","sport","skiing"]},"skier":{"unicode":"26f7","unicode_alternates":"26f7-fe0f","name":"skier","shortname":":skier:","category":"activity","emoji_order":"435","aliases":[],"aliases_ascii":[],"keywords":["hat","vacation","cold","sport","skiing"]},"snowboarder":{"unicode":"1f3c2","unicode_alternates":"","name":"snowboarder","shortname":":snowboarder:","category":"activity","emoji_order":"436","aliases":[],"aliases_ascii":[],"keywords":["hat","vacation","cold","sport","snowboarding"]},"ice_skate":{"unicode":"26f8","unicode_alternates":"26f8-fe0f","name":"ice skate","shortname":":ice_skate:","category":"activity","emoji_order":"437","aliases":[],"aliases_ascii":[],"keywords":["cold","sport","ice skating"]},"bow_and_arrow":{"unicode":"1f3f9","unicode_alternates":"","name":"bow and arrow","shortname":":bow_and_arrow:","category":"activity","emoji_order":"438","aliases":[":archery:"],"aliases_ascii":[],"keywords":["weapon","sport"]},"fishing_pole_and_fish":{"unicode":"1f3a3","unicode_alternates":"","name":"fishing pole and fish","shortname":":fishing_pole_and_fish:","category":"activity","emoji_order":"439","aliases":[],"aliases_ascii":[],"keywords":["vacation","sport","fishing"]},"rowboat":{"unicode":"1f6a3","unicode_alternates":"","name":"rowboat","shortname":":rowboat:","category":"activity","emoji_order":"440","aliases":[],"aliases_ascii":[],"keywords":["men","workout","sport","rowing","diversity","diversity"]},"swimmer":{"unicode":"1f3ca","unicode_alternates":"","name":"swimmer","shortname":":swimmer:","category":"activity","emoji_order":"441","aliases":[],"aliases_ascii":[],"keywords":["workout","sport","swim","diversity","diversity"]},"surfer":{"unicode":"1f3c4","unicode_alternates":"","name":"surfer","shortname":":surfer:","category":"activity","emoji_order":"442","aliases":[],"aliases_ascii":[],"keywords":["men","vacation","tropical","sport","diversity","diversity"]},"bath":{"unicode":"1f6c0","unicode_alternates":"","name":"bath","shortname":":bath:","category":"activity","emoji_order":"443","aliases":[],"aliases_ascii":[],"keywords":["bathroom","tired","diversity","diversity","steam","steam"]},"basketball_player":{"unicode":"26f9","unicode_alternates":"26f9-fe0f","name":"person with ball","shortname":":basketball_player:","category":"activity","emoji_order":"444","aliases":[":person_with_ball:"],"aliases_ascii":[],"keywords":["men","game","ball","sport","basketball","diversity","diversity"]},"lifter":{"unicode":"1f3cb","unicode_alternates":"1f3cb-fe0f","name":"weight lifter","shortname":":lifter:","category":"activity","emoji_order":"445","aliases":[":weight_lifter:"],"aliases_ascii":[],"keywords":["men","workout","flex","sport","weight lifting","win","win","diversity","diversity"]},"bicyclist":{"unicode":"1f6b4","unicode_alternates":"","name":"bicyclist","shortname":":bicyclist:","category":"activity","emoji_order":"446","aliases":[],"aliases_ascii":[],"keywords":["men","workout","sport","bike","diversity","diversity"]},"mountain_bicyclist":{"unicode":"1f6b5","unicode_alternates":"","name":"mountain bicyclist","shortname":":mountain_bicyclist:","category":"activity","emoji_order":"447","aliases":[],"aliases_ascii":[],"keywords":["men","sport","bike","diversity","diversity"]},"horse_racing":{"unicode":"1f3c7","unicode_alternates":"","name":"horse racing","shortname":":horse_racing:","category":"activity","emoji_order":"448","aliases":[],"aliases_ascii":[],"keywords":["men","sport","horse racing"]},"levitate":{"unicode":"1f574","unicode_alternates":"1f574-fe0f","name":"man in business suit levitating","shortname":":levitate:","category":"activity","emoji_order":"449","aliases":[":man_in_business_suit_levitating:"],"aliases_ascii":[],"keywords":["men","job","job"]},"trophy":{"unicode":"1f3c6","unicode_alternates":"","name":"trophy","shortname":":trophy:","category":"activity","emoji_order":"450","aliases":[],"aliases_ascii":[],"keywords":["object","game","award","win","win","perfect","perfect","parties","parties"]},"running_shirt_with_sash":{"unicode":"1f3bd","unicode_alternates":"","name":"running shirt with sash","shortname":":running_shirt_with_sash:","category":"activity","emoji_order":"451","aliases":[],"aliases_ascii":[],"keywords":["award"]},"medal":{"unicode":"1f3c5","unicode_alternates":"","name":"sports medal","shortname":":medal:","category":"activity","emoji_order":"452","aliases":[":sports_medal:"],"aliases_ascii":[],"keywords":["object","award","sport","win","win","perfect","perfect"]},"military_medal":{"unicode":"1f396","unicode_alternates":"1f396-fe0f","name":"military medal","shortname":":military_medal:","category":"activity","emoji_order":"453","aliases":[],"aliases_ascii":[],"keywords":["object","award","win","win"]},"reminder_ribbon":{"unicode":"1f397","unicode_alternates":"1f397-fe0f","name":"reminder ribbon","shortname":":reminder_ribbon:","category":"activity","emoji_order":"454","aliases":[],"aliases_ascii":[],"keywords":["award"]},"rosette":{"unicode":"1f3f5","unicode_alternates":"1f3f5-fe0f","name":"rosette","shortname":":rosette:","category":"activity","emoji_order":"455","aliases":[],"aliases_ascii":[],"keywords":["tropical"]},"ticket":{"unicode":"1f3ab","unicode_alternates":"","name":"ticket","shortname":":ticket:","category":"activity","emoji_order":"456","aliases":[],"aliases_ascii":[],"keywords":["theatre","movie","parties","parties"]},"tickets":{"unicode":"1f39f","unicode_alternates":"1f39f-fe0f","name":"admission tickets","shortname":":tickets:","category":"activity","emoji_order":"457","aliases":[":admission_tickets:"],"aliases_ascii":[],"keywords":["theatre","movie","parties","parties"]},"performing_arts":{"unicode":"1f3ad","unicode_alternates":"","name":"performing arts","shortname":":performing_arts:","category":"activity","emoji_order":"458","aliases":[],"aliases_ascii":[],"keywords":["theatre","movie"]},"art":{"unicode":"1f3a8","unicode_alternates":"","name":"artist palette","shortname":":art:","category":"activity","emoji_order":"459","aliases":[],"aliases_ascii":[],"keywords":[]},"circus_tent":{"unicode":"1f3aa","unicode_alternates":"","name":"circus tent","shortname":":circus_tent:","category":"activity","emoji_order":"460","aliases":[],"aliases_ascii":[],"keywords":["circus tent"]},"microphone":{"unicode":"1f3a4","unicode_alternates":"","name":"microphone","shortname":":microphone:","category":"activity","emoji_order":"461","aliases":[],"aliases_ascii":[],"keywords":["instruments"]},"headphones":{"unicode":"1f3a7","unicode_alternates":"","name":"headphone","shortname":":headphones:","category":"activity","emoji_order":"462","aliases":[],"aliases_ascii":[],"keywords":["instruments"]},"musical_score":{"unicode":"1f3bc","unicode_alternates":"","name":"musical score","shortname":":musical_score:","category":"activity","emoji_order":"463","aliases":[],"aliases_ascii":[],"keywords":["instruments"]},"musical_keyboard":{"unicode":"1f3b9","unicode_alternates":"","name":"musical keyboard","shortname":":musical_keyboard:","category":"activity","emoji_order":"464","aliases":[],"aliases_ascii":[],"keywords":["instruments"]},"saxophone":{"unicode":"1f3b7","unicode_alternates":"","name":"saxophone","shortname":":saxophone:","category":"activity","emoji_order":"465","aliases":[],"aliases_ascii":[],"keywords":["instruments"]},"trumpet":{"unicode":"1f3ba","unicode_alternates":"","name":"trumpet","shortname":":trumpet:","category":"activity","emoji_order":"466","aliases":[],"aliases_ascii":[],"keywords":["instruments"]},"guitar":{"unicode":"1f3b8","unicode_alternates":"","name":"guitar","shortname":":guitar:","category":"activity","emoji_order":"467","aliases":[],"aliases_ascii":[],"keywords":["instruments"]},"violin":{"unicode":"1f3bb","unicode_alternates":"","name":"violin","shortname":":violin:","category":"activity","emoji_order":"468","aliases":[],"aliases_ascii":[],"keywords":["instruments","sarcastic","sarcastic"]},"clapper":{"unicode":"1f3ac","unicode_alternates":"","name":"clapper board","shortname":":clapper:","category":"activity","emoji_order":"469","aliases":[],"aliases_ascii":[],"keywords":["movie"]},"video_game":{"unicode":"1f3ae","unicode_alternates":"","name":"video game","shortname":":video_game:","category":"activity","emoji_order":"470","aliases":[],"aliases_ascii":[],"keywords":["electronics","game","boys night","boys night"]},"space_invader":{"unicode":"1f47e","unicode_alternates":"","name":"alien monster","shortname":":space_invader:","category":"activity","emoji_order":"471","aliases":[],"aliases_ascii":[],"keywords":["monster","alien"]},"dart":{"unicode":"1f3af","unicode_alternates":"","name":"direct hit","shortname":":dart:","category":"activity","emoji_order":"472","aliases":[],"aliases_ascii":[],"keywords":["game","sport","boys night","boys night"]},"game_die":{"unicode":"1f3b2","unicode_alternates":"","name":"game die","shortname":":game_die:","category":"activity","emoji_order":"473","aliases":[],"aliases_ascii":[],"keywords":["object","game","boys night","boys night"]},"slot_machine":{"unicode":"1f3b0","unicode_alternates":"","name":"slot machine","shortname":":slot_machine:","category":"activity","emoji_order":"474","aliases":[],"aliases_ascii":[],"keywords":["game","boys night","boys night"]},"bowling":{"unicode":"1f3b3","unicode_alternates":"","name":"bowling","shortname":":bowling:","category":"activity","emoji_order":"475","aliases":[],"aliases_ascii":[],"keywords":["game","ball","sport","boys night","boys night"]},"red_car":{"unicode":"1f697","unicode_alternates":"","name":"automobile","shortname":":red_car:","category":"travel","emoji_order":"476","aliases":[],"aliases_ascii":[],"keywords":["transportation","car","travel"]},"taxi":{"unicode":"1f695","unicode_alternates":"","name":"taxi","shortname":":taxi:","category":"travel","emoji_order":"477","aliases":[],"aliases_ascii":[],"keywords":["transportation","car","travel"]},"blue_car":{"unicode":"1f699","unicode_alternates":"","name":"recreational vehicle","shortname":":blue_car:","category":"travel","emoji_order":"478","aliases":[],"aliases_ascii":[],"keywords":["transportation","car","travel"]},"bus":{"unicode":"1f68c","unicode_alternates":"","name":"bus","shortname":":bus:","category":"travel","emoji_order":"479","aliases":[],"aliases_ascii":[],"keywords":["transportation","bus","office"]},"trolleybus":{"unicode":"1f68e","unicode_alternates":"","name":"trolleybus","shortname":":trolleybus:","category":"travel","emoji_order":"480","aliases":[],"aliases_ascii":[],"keywords":["transportation","bus","travel"]},"race_car":{"unicode":"1f3ce","unicode_alternates":"1f3ce-fe0f","name":"racing car","shortname":":race_car:","category":"travel","emoji_order":"481","aliases":[":racing_car:"],"aliases_ascii":[],"keywords":["transportation","car"]},"police_car":{"unicode":"1f693","unicode_alternates":"","name":"police car","shortname":":police_car:","category":"travel","emoji_order":"482","aliases":[],"aliases_ascii":[],"keywords":["transportation","car","police","police","911","911"]},"ambulance":{"unicode":"1f691","unicode_alternates":"","name":"ambulance","shortname":":ambulance:","category":"travel","emoji_order":"483","aliases":[],"aliases_ascii":[],"keywords":["transportation","911","911"]},"fire_engine":{"unicode":"1f692","unicode_alternates":"","name":"fire engine","shortname":":fire_engine:","category":"travel","emoji_order":"484","aliases":[],"aliases_ascii":[],"keywords":["transportation","truck","911","911"]},"minibus":{"unicode":"1f690","unicode_alternates":"","name":"minibus","shortname":":minibus:","category":"travel","emoji_order":"485","aliases":[],"aliases_ascii":[],"keywords":["transportation","bus"]},"truck":{"unicode":"1f69a","unicode_alternates":"","name":"delivery truck","shortname":":truck:","category":"travel","emoji_order":"486","aliases":[],"aliases_ascii":[],"keywords":["transportation","truck"]},"articulated_lorry":{"unicode":"1f69b","unicode_alternates":"","name":"articulated lorry","shortname":":articulated_lorry:","category":"travel","emoji_order":"487","aliases":[],"aliases_ascii":[],"keywords":["transportation","truck"]},"tractor":{"unicode":"1f69c","unicode_alternates":"","name":"tractor","shortname":":tractor:","category":"travel","emoji_order":"488","aliases":[],"aliases_ascii":[],"keywords":["transportation"]},"motorcycle":{"unicode":"1f3cd","unicode_alternates":"1f3cd-fe0f","name":"racing motorcycle","shortname":":motorcycle:","category":"travel","emoji_order":"489","aliases":[":racing_motorcycle:"],"aliases_ascii":[],"keywords":["transportation","travel","bike"]},"bike":{"unicode":"1f6b2","unicode_alternates":"","name":"bicycle","shortname":":bike:","category":"travel","emoji_order":"490","aliases":[],"aliases_ascii":[],"keywords":["transportation","travel","bike"]},"rotating_light":{"unicode":"1f6a8","unicode_alternates":"","name":"police cars revolving light","shortname":":rotating_light:","category":"travel","emoji_order":"491","aliases":[],"aliases_ascii":[],"keywords":["transportation","object","police","police","911","911"]},"oncoming_police_car":{"unicode":"1f694","unicode_alternates":"","name":"oncoming police car","shortname":":oncoming_police_car:","category":"travel","emoji_order":"492","aliases":[],"aliases_ascii":[],"keywords":["transportation","car","police","police","911","911"]},"oncoming_bus":{"unicode":"1f68d","unicode_alternates":"","name":"oncoming bus","shortname":":oncoming_bus:","category":"travel","emoji_order":"493","aliases":[],"aliases_ascii":[],"keywords":["transportation","bus","travel"]},"oncoming_automobile":{"unicode":"1f698","unicode_alternates":"","name":"oncoming automobile","shortname":":oncoming_automobile:","category":"travel","emoji_order":"494","aliases":[],"aliases_ascii":[],"keywords":["transportation","car","travel"]},"oncoming_taxi":{"unicode":"1f696","unicode_alternates":"","name":"oncoming taxi","shortname":":oncoming_taxi:","category":"travel","emoji_order":"495","aliases":[],"aliases_ascii":[],"keywords":["transportation","car","travel"]},"aerial_tramway":{"unicode":"1f6a1","unicode_alternates":"","name":"aerial tramway","shortname":":aerial_tramway:","category":"travel","emoji_order":"496","aliases":[],"aliases_ascii":[],"keywords":["transportation","travel","train"]},"mountain_cableway":{"unicode":"1f6a0","unicode_alternates":"","name":"mountain cableway","shortname":":mountain_cableway:","category":"travel","emoji_order":"497","aliases":[],"aliases_ascii":[],"keywords":["transportation","travel","train"]},"suspension_railway":{"unicode":"1f69f","unicode_alternates":"","name":"suspension railway","shortname":":suspension_railway:","category":"travel","emoji_order":"498","aliases":[],"aliases_ascii":[],"keywords":["transportation","travel","train"]},"railway_car":{"unicode":"1f683","unicode_alternates":"","name":"railway car","shortname":":railway_car:","category":"travel","emoji_order":"499","aliases":[],"aliases_ascii":[],"keywords":["transportation","travel","train"]},"train":{"unicode":"1f68b","unicode_alternates":"","name":"tram car","shortname":":train:","category":"travel","emoji_order":"500","aliases":[],"aliases_ascii":[],"keywords":["transportation","travel","train"]},"monorail":{"unicode":"1f69d","unicode_alternates":"","name":"monorail","shortname":":monorail:","category":"travel","emoji_order":"501","aliases":[],"aliases_ascii":[],"keywords":["transportation","travel","train","vacation"]},"bullettrain_side":{"unicode":"1f684","unicode_alternates":"","name":"high-speed train","shortname":":bullettrain_side:","category":"travel","emoji_order":"502","aliases":[],"aliases_ascii":[],"keywords":["transportation","travel","train"]},"bullettrain_front":{"unicode":"1f685","unicode_alternates":"","name":"high-speed train with bullet nose","shortname":":bullettrain_front:","category":"travel","emoji_order":"503","aliases":[],"aliases_ascii":[],"keywords":["transportation","travel","train"]},"light_rail":{"unicode":"1f688","unicode_alternates":"","name":"light rail","shortname":":light_rail:","category":"travel","emoji_order":"504","aliases":[],"aliases_ascii":[],"keywords":["transportation","travel","train"]},"mountain_railway":{"unicode":"1f69e","unicode_alternates":"","name":"mountain railway","shortname":":mountain_railway:","category":"travel","emoji_order":"505","aliases":[],"aliases_ascii":[],"keywords":["transportation","travel","train"]},"steam_locomotive":{"unicode":"1f682","unicode_alternates":"","name":"steam locomotive","shortname":":steam_locomotive:","category":"travel","emoji_order":"506","aliases":[],"aliases_ascii":[],"keywords":["transportation","travel","train","steam","steam"]},"train2":{"unicode":"1f686","unicode_alternates":"","name":"train","shortname":":train2:","category":"travel","emoji_order":"507","aliases":[],"aliases_ascii":[],"keywords":["transportation","travel","train"]},"metro":{"unicode":"1f687","unicode_alternates":"","name":"metro","shortname":":metro:","category":"travel","emoji_order":"508","aliases":[],"aliases_ascii":[],"keywords":["transportation","travel","train"]},"tram":{"unicode":"1f68a","unicode_alternates":"","name":"tram","shortname":":tram:","category":"travel","emoji_order":"509","aliases":[],"aliases_ascii":[],"keywords":["transportation","travel","train"]},"station":{"unicode":"1f689","unicode_alternates":"","name":"station","shortname":":station:","category":"travel","emoji_order":"510","aliases":[],"aliases_ascii":[],"keywords":["transportation","travel","train"]},"helicopter":{"unicode":"1f681","unicode_alternates":"","name":"helicopter","shortname":":helicopter:","category":"travel","emoji_order":"511","aliases":[],"aliases_ascii":[],"keywords":["transportation","plane","travel","fly","fly"]},"airplane_small":{"unicode":"1f6e9","unicode_alternates":"1f6e9-fe0f","name":"small airplane","shortname":":airplane_small:","category":"travel","emoji_order":"512","aliases":[":small_airplane:"],"aliases_ascii":[],"keywords":["transportation","plane","travel","vacation","fly","fly"]},"airplane":{"unicode":"2708","unicode_alternates":"2708-fe0f","name":"airplane","shortname":":airplane:","category":"travel","emoji_order":"513","aliases":[],"aliases_ascii":[],"keywords":["transportation","plane","travel","vacation","fly","fly"]},"airplane_departure":{"unicode":"1f6eb","unicode_alternates":"","name":"airplane departure","shortname":":airplane_departure:","category":"travel","emoji_order":"514","aliases":[],"aliases_ascii":[],"keywords":["transportation","plane","travel","vacation","fly","fly"]},"airplane_arriving":{"unicode":"1f6ec","unicode_alternates":"","name":"airplane arriving","shortname":":airplane_arriving:","category":"travel","emoji_order":"515","aliases":[],"aliases_ascii":[],"keywords":["transportation","plane","travel","vacation","fly","fly"]},"sailboat":{"unicode":"26f5","unicode_alternates":"26f5-fe0f","name":"sailboat","shortname":":sailboat:","category":"travel","emoji_order":"516","aliases":[],"aliases_ascii":[],"keywords":["transportation","travel","boat","vacation"]},"motorboat":{"unicode":"1f6e5","unicode_alternates":"1f6e5-fe0f","name":"motorboat","shortname":":motorboat:","category":"travel","emoji_order":"517","aliases":[],"aliases_ascii":[],"keywords":["transportation","travel","boat"]},"speedboat":{"unicode":"1f6a4","unicode_alternates":"","name":"speedboat","shortname":":speedboat:","category":"travel","emoji_order":"518","aliases":[],"aliases_ascii":[],"keywords":["transportation","travel","boat","vacation","tropical"]},"ferry":{"unicode":"26f4","unicode_alternates":"26f4-fe0f","name":"ferry","shortname":":ferry:","category":"travel","emoji_order":"519","aliases":[],"aliases_ascii":[],"keywords":["transportation","travel","boat","vacation"]},"cruise_ship":{"unicode":"1f6f3","unicode_alternates":"1f6f3-fe0f","name":"passenger ship","shortname":":cruise_ship:","category":"travel","emoji_order":"520","aliases":[":passenger_ship:"],"aliases_ascii":[],"keywords":["transportation","travel","boat","vacation"]},"rocket":{"unicode":"1f680","unicode_alternates":"","name":"rocket","shortname":":rocket:","category":"travel","emoji_order":"521","aliases":[],"aliases_ascii":[],"keywords":["transportation","object","space","fly","fly","blast","blast"]},"satellite_orbital":{"unicode":"1f6f0","unicode_alternates":"1f6f0-fe0f","name":"satellite","shortname":":satellite_orbital:","category":"travel","emoji_order":"522","aliases":[],"aliases_ascii":[],"keywords":["object"]},"seat":{"unicode":"1f4ba","unicode_alternates":"","name":"seat","shortname":":seat:","category":"travel","emoji_order":"523","aliases":[],"aliases_ascii":[],"keywords":["transportation","object","travel","vacation"]},"anchor":{"unicode":"2693","unicode_alternates":"2693-fe0f","name":"anchor","shortname":":anchor:","category":"travel","emoji_order":"524","aliases":[],"aliases_ascii":[],"keywords":["object","travel","boat","vacation"]},"construction":{"unicode":"1f6a7","unicode_alternates":"","name":"construction sign","shortname":":construction:","category":"travel","emoji_order":"525","aliases":[],"aliases_ascii":[],"keywords":["object"]},"fuelpump":{"unicode":"26fd","unicode_alternates":"26fd-fe0f","name":"fuel pump","shortname":":fuelpump:","category":"travel","emoji_order":"526","aliases":[],"aliases_ascii":[],"keywords":["object","gas pump"]},"busstop":{"unicode":"1f68f","unicode_alternates":"","name":"bus stop","shortname":":busstop:","category":"travel","emoji_order":"527","aliases":[],"aliases_ascii":[],"keywords":["object"]},"vertical_traffic_light":{"unicode":"1f6a6","unicode_alternates":"","name":"vertical traffic light","shortname":":vertical_traffic_light:","category":"travel","emoji_order":"528","aliases":[],"aliases_ascii":[],"keywords":["object","stop light"]},"traffic_light":{"unicode":"1f6a5","unicode_alternates":"","name":"horizontal traffic light","shortname":":traffic_light:","category":"travel","emoji_order":"529","aliases":[],"aliases_ascii":[],"keywords":["object","stop light"]},"checkered_flag":{"unicode":"1f3c1","unicode_alternates":"","name":"chequered flag","shortname":":checkered_flag:","category":"travel","emoji_order":"530","aliases":[],"aliases_ascii":[],"keywords":["object"]},"ship":{"unicode":"1f6a2","unicode_alternates":"","name":"ship","shortname":":ship:","category":"travel","emoji_order":"531","aliases":[],"aliases_ascii":[],"keywords":["transportation","travel","boat","vacation"]},"ferris_wheel":{"unicode":"1f3a1","unicode_alternates":"","name":"ferris wheel","shortname":":ferris_wheel:","category":"travel","emoji_order":"532","aliases":[],"aliases_ascii":[],"keywords":["places","vacation","ferris wheel"]},"roller_coaster":{"unicode":"1f3a2","unicode_alternates":"","name":"roller coaster","shortname":":roller_coaster:","category":"travel","emoji_order":"533","aliases":[],"aliases_ascii":[],"keywords":["places","vacation","roller coaster"]},"carousel_horse":{"unicode":"1f3a0","unicode_alternates":"","name":"carousel horse","shortname":":carousel_horse:","category":"travel","emoji_order":"534","aliases":[],"aliases_ascii":[],"keywords":["places","object","vacation","roller coaster","carousel"]},"construction_site":{"unicode":"1f3d7","unicode_alternates":"1f3d7-fe0f","name":"building construction","shortname":":construction_site:","category":"travel","emoji_order":"535","aliases":[":building_construction:"],"aliases_ascii":[],"keywords":["building","crane"]},"foggy":{"unicode":"1f301","unicode_alternates":"","name":"foggy","shortname":":foggy:","category":"travel","emoji_order":"536","aliases":[],"aliases_ascii":[],"keywords":["places","building","sky","travel","vacation"]},"tokyo_tower":{"unicode":"1f5fc","unicode_alternates":"","name":"tokyo tower","shortname":":tokyo_tower:","category":"travel","emoji_order":"537","aliases":[],"aliases_ascii":[],"keywords":["places","travel","vacation","eiffel tower"]},"factory":{"unicode":"1f3ed","unicode_alternates":"","name":"factory","shortname":":factory:","category":"travel","emoji_order":"538","aliases":[],"aliases_ascii":[],"keywords":["places","building","travel","steam","steam"]},"fountain":{"unicode":"26f2","unicode_alternates":"26f2-fe0f","name":"fountain","shortname":":fountain:","category":"travel","emoji_order":"539","aliases":[],"aliases_ascii":[],"keywords":["travel","vacation"]},"rice_scene":{"unicode":"1f391","unicode_alternates":"","name":"moon viewing ceremony","shortname":":rice_scene:","category":"travel","emoji_order":"540","aliases":[],"aliases_ascii":[],"keywords":["places","space","sky","travel"]},"mountain":{"unicode":"26f0","unicode_alternates":"26f0-fe0f","name":"mountain","shortname":":mountain:","category":"travel","emoji_order":"541","aliases":[],"aliases_ascii":[],"keywords":["places","travel","vacation","camp"]},"mountain_snow":{"unicode":"1f3d4","unicode_alternates":"1f3d4-fe0f","name":"snow capped mountain","shortname":":mountain_snow:","category":"travel","emoji_order":"542","aliases":[":snow_capped_mountain:"],"aliases_ascii":[],"keywords":["places","travel","vacation","cold","camp"]},"mount_fuji":{"unicode":"1f5fb","unicode_alternates":"","name":"mount fuji","shortname":":mount_fuji:","category":"travel","emoji_order":"543","aliases":[],"aliases_ascii":[],"keywords":["places","travel","vacation","cold","camp"]},"volcano":{"unicode":"1f30b","unicode_alternates":"","name":"volcano","shortname":":volcano:","category":"travel","emoji_order":"544","aliases":[],"aliases_ascii":[],"keywords":["places","tropical"]},"japan":{"unicode":"1f5fe","unicode_alternates":"","name":"silhouette of japan","shortname":":japan:","category":"travel","emoji_order":"545","aliases":[],"aliases_ascii":[],"keywords":["places","travel","map","vacation","tropical"]},"camping":{"unicode":"1f3d5","unicode_alternates":"1f3d5-fe0f","name":"camping","shortname":":camping:","category":"travel","emoji_order":"546","aliases":[],"aliases_ascii":[],"keywords":["places","travel","vacation","camp"]},"tent":{"unicode":"26fa","unicode_alternates":"26fa-fe0f","name":"tent","shortname":":tent:","category":"travel","emoji_order":"547","aliases":[],"aliases_ascii":[],"keywords":["places","travel","vacation","camp"]},"park":{"unicode":"1f3de","unicode_alternates":"1f3de-fe0f","name":"national park","shortname":":park:","category":"travel","emoji_order":"548","aliases":[":national_park:"],"aliases_ascii":[],"keywords":["travel","vacation","park","camp"]},"motorway":{"unicode":"1f6e3","unicode_alternates":"1f6e3-fe0f","name":"motorway","shortname":":motorway:","category":"travel","emoji_order":"549","aliases":[],"aliases_ascii":[],"keywords":["travel","vacation","camp"]},"railway_track":{"unicode":"1f6e4","unicode_alternates":"1f6e4-fe0f","name":"railway track","shortname":":railway_track:","category":"travel","emoji_order":"550","aliases":[":railroad_track:"],"aliases_ascii":[],"keywords":["travel","train","vacation"]},"sunrise":{"unicode":"1f305","unicode_alternates":"","name":"sunrise","shortname":":sunrise:","category":"travel","emoji_order":"551","aliases":[],"aliases_ascii":[],"keywords":["places","sky","travel","vacation","tropical","day","sun","hump day","hump day","morning","morning"]},"sunrise_over_mountains":{"unicode":"1f304","unicode_alternates":"","name":"sunrise over mountains","shortname":":sunrise_over_mountains:","category":"travel","emoji_order":"552","aliases":[],"aliases_ascii":[],"keywords":["places","sky","travel","vacation","day","sun","camp","morning","morning"]},"desert":{"unicode":"1f3dc","unicode_alternates":"1f3dc-fe0f","name":"desert","shortname":":desert:","category":"travel","emoji_order":"553","aliases":[],"aliases_ascii":[],"keywords":["places","travel","vacation","hot","hot"]},"beach":{"unicode":"1f3d6","unicode_alternates":"1f3d6-fe0f","name":"beach with umbrella","shortname":":beach:","category":"travel","emoji_order":"554","aliases":[":beach_with_umbrella:"],"aliases_ascii":[],"keywords":["places","travel","vacation","tropical","beach","swim"]},"island":{"unicode":"1f3dd","unicode_alternates":"1f3dd-fe0f","name":"desert island","shortname":":island:","category":"travel","emoji_order":"555","aliases":[":desert_island:"],"aliases_ascii":[],"keywords":["places","travel","vacation","tropical","beach","swim"]},"city_sunset":{"unicode":"1f307","unicode_alternates":"","name":"sunset over buildings","shortname":":city_sunset:","category":"travel","emoji_order":"556","aliases":[":city_sunrise:"],"aliases_ascii":[],"keywords":["places","building","sky","vacation"]},"city_dusk":{"unicode":"1f306","unicode_alternates":"","name":"cityscape at dusk","shortname":":city_dusk:","category":"travel","emoji_order":"557","aliases":[],"aliases_ascii":[],"keywords":["places","building"]},"cityscape":{"unicode":"1f3d9","unicode_alternates":"1f3d9-fe0f","name":"cityscape","shortname":":cityscape:","category":"travel","emoji_order":"558","aliases":[],"aliases_ascii":[],"keywords":["places","building","vacation"]},"night_with_stars":{"unicode":"1f303","unicode_alternates":"","name":"night with stars","shortname":":night_with_stars:","category":"travel","emoji_order":"559","aliases":[],"aliases_ascii":[],"keywords":["places","building","sky","vacation","goodnight","goodnight"]},"bridge_at_night":{"unicode":"1f309","unicode_alternates":"","name":"bridge at night","shortname":":bridge_at_night:","category":"travel","emoji_order":"560","aliases":[],"aliases_ascii":[],"keywords":["places","travel","vacation","goodnight","goodnight"]},"milky_way":{"unicode":"1f30c","unicode_alternates":"","name":"milky way","shortname":":milky_way:","category":"travel","emoji_order":"561","aliases":[],"aliases_ascii":[],"keywords":["places","space","sky","travel","vacation"]},"stars":{"unicode":"1f320","unicode_alternates":"","name":"shooting star","shortname":":stars:","category":"travel","emoji_order":"562","aliases":[],"aliases_ascii":[],"keywords":["space"]},"sparkler":{"unicode":"1f387","unicode_alternates":"","name":"firework sparkler","shortname":":sparkler:","category":"travel","emoji_order":"563","aliases":[],"aliases_ascii":[],"keywords":["parties","parties"]},"fireworks":{"unicode":"1f386","unicode_alternates":"","name":"fireworks","shortname":":fireworks:","category":"travel","emoji_order":"564","aliases":[],"aliases_ascii":[],"keywords":["parties","parties"]},"rainbow":{"unicode":"1f308","unicode_alternates":"","name":"rainbow","shortname":":rainbow:","category":"travel","emoji_order":"565","aliases":[],"aliases_ascii":[],"keywords":["weather","gay","sky","rain"]},"homes":{"unicode":"1f3d8","unicode_alternates":"1f3d8-fe0f","name":"house buildings","shortname":":homes:","category":"travel","emoji_order":"566","aliases":[":house_buildings:"],"aliases_ascii":[],"keywords":["places","building","house"]},"european_castle":{"unicode":"1f3f0","unicode_alternates":"","name":"european castle","shortname":":european_castle:","category":"travel","emoji_order":"567","aliases":[],"aliases_ascii":[],"keywords":["places","building","travel","vacation"]},"japanese_castle":{"unicode":"1f3ef","unicode_alternates":"","name":"japanese castle","shortname":":japanese_castle:","category":"travel","emoji_order":"568","aliases":[],"aliases_ascii":[],"keywords":["places","building","travel","vacation"]},"stadium":{"unicode":"1f3df","unicode_alternates":"1f3df-fe0f","name":"stadium","shortname":":stadium:","category":"travel","emoji_order":"569","aliases":[],"aliases_ascii":[],"keywords":["places","building","travel","vacation","boys night","boys night"]},"statue_of_liberty":{"unicode":"1f5fd","unicode_alternates":"","name":"statue of liberty","shortname":":statue_of_liberty:","category":"travel","emoji_order":"570","aliases":[],"aliases_ascii":[],"keywords":["places","america","travel","vacation","statue of liberty","free speech","free speech"]},"house":{"unicode":"1f3e0","unicode_alternates":"","name":"house building","shortname":":house:","category":"travel","emoji_order":"571","aliases":[],"aliases_ascii":[],"keywords":["places","building","house"]},"house_with_garden":{"unicode":"1f3e1","unicode_alternates":"","name":"house with garden","shortname":":house_with_garden:","category":"travel","emoji_order":"572","aliases":[],"aliases_ascii":[],"keywords":["places","building","house"]},"house_abandoned":{"unicode":"1f3da","unicode_alternates":"1f3da-fe0f","name":"derelict house building","shortname":":house_abandoned:","category":"travel","emoji_order":"573","aliases":[":derelict_house_building:"],"aliases_ascii":[],"keywords":["places","building","house"]},"office":{"unicode":"1f3e2","unicode_alternates":"","name":"office building","shortname":":office:","category":"travel","emoji_order":"574","aliases":[],"aliases_ascii":[],"keywords":["places","building","work"]},"department_store":{"unicode":"1f3ec","unicode_alternates":"","name":"department store","shortname":":department_store:","category":"travel","emoji_order":"575","aliases":[],"aliases_ascii":[],"keywords":["places","building"]},"post_office":{"unicode":"1f3e3","unicode_alternates":"","name":"japanese post office","shortname":":post_office:","category":"travel","emoji_order":"576","aliases":[],"aliases_ascii":[],"keywords":["places","building","post office"]},"european_post_office":{"unicode":"1f3e4","unicode_alternates":"","name":"european post office","shortname":":european_post_office:","category":"travel","emoji_order":"577","aliases":[],"aliases_ascii":[],"keywords":["places","building","post office"]},"hospital":{"unicode":"1f3e5","unicode_alternates":"","name":"hospital","shortname":":hospital:","category":"travel","emoji_order":"578","aliases":[],"aliases_ascii":[],"keywords":["places","building","health","911","911"]},"bank":{"unicode":"1f3e6","unicode_alternates":"","name":"bank","shortname":":bank:","category":"travel","emoji_order":"579","aliases":[],"aliases_ascii":[],"keywords":["places","building"]},"hotel":{"unicode":"1f3e8","unicode_alternates":"","name":"hotel","shortname":":hotel:","category":"travel","emoji_order":"580","aliases":[],"aliases_ascii":[],"keywords":["places","building","vacation"]},"convenience_store":{"unicode":"1f3ea","unicode_alternates":"","name":"convenience store","shortname":":convenience_store:","category":"travel","emoji_order":"581","aliases":[],"aliases_ascii":[],"keywords":["places","building"]},"school":{"unicode":"1f3eb","unicode_alternates":"","name":"school","shortname":":school:","category":"travel","emoji_order":"582","aliases":[],"aliases_ascii":[],"keywords":["places","building"]},"love_hotel":{"unicode":"1f3e9","unicode_alternates":"","name":"love hotel","shortname":":love_hotel:","category":"travel","emoji_order":"583","aliases":[],"aliases_ascii":[],"keywords":["places","building","love"]},"wedding":{"unicode":"1f492","unicode_alternates":"","name":"wedding","shortname":":wedding:","category":"travel","emoji_order":"584","aliases":[],"aliases_ascii":[],"keywords":["places","wedding","building","love","parties","parties"]},"classical_building":{"unicode":"1f3db","unicode_alternates":"1f3db-fe0f","name":"classical building","shortname":":classical_building:","category":"travel","emoji_order":"585","aliases":[],"aliases_ascii":[],"keywords":["places","building","travel","vacation"]},"church":{"unicode":"26ea","unicode_alternates":"26ea-fe0f","name":"church","shortname":":church:","category":"travel","emoji_order":"586","aliases":[],"aliases_ascii":[],"keywords":["places","wedding","religion","building","condolence","condolence"]},"mosque":{"unicode":"1f54c","unicode_alternates":"","name":"mosque","shortname":":mosque:","category":"travel","emoji_order":"587","aliases":[],"aliases_ascii":[],"keywords":["places","religion","building","vacation","condolence","condolence"]},"synagogue":{"unicode":"1f54d","unicode_alternates":"","name":"synagogue","shortname":":synagogue:","category":"travel","emoji_order":"588","aliases":[],"aliases_ascii":[],"keywords":["places","religion","building","travel","vacation","condolence","condolence"]},"kaaba":{"unicode":"1f54b","unicode_alternates":"","name":"kaaba","shortname":":kaaba:","category":"travel","emoji_order":"589","aliases":[],"aliases_ascii":[],"keywords":["places","religion","building","condolence","condolence"]},"shinto_shrine":{"unicode":"26e9","unicode_alternates":"26e9-fe0f","name":"shinto shrine","shortname":":shinto_shrine:","category":"travel","emoji_order":"590","aliases":[],"aliases_ascii":[],"keywords":["places","building","travel","vacation"]},"watch":{"unicode":"231a","unicode_alternates":"231a-fe0f","name":"watch","shortname":":watch:","category":"objects","emoji_order":"591","aliases":[],"aliases_ascii":[],"keywords":["electronics","time"]},"iphone":{"unicode":"1f4f1","unicode_alternates":"","name":"mobile phone","shortname":":iphone:","category":"objects","emoji_order":"592","aliases":[],"aliases_ascii":[],"keywords":["electronics","phone","selfie","selfie"]},"calling":{"unicode":"1f4f2","unicode_alternates":"","name":"mobile phone with rightwards arrow at left","shortname":":calling:","category":"objects","emoji_order":"593","aliases":[],"aliases_ascii":[],"keywords":["electronics","phone","selfie","selfie"]},"computer":{"unicode":"1f4bb","unicode_alternates":"","name":"personal computer","shortname":":computer:","category":"objects","emoji_order":"594","aliases":[],"aliases_ascii":[],"keywords":["electronics","work","office"]},"keyboard":{"unicode":"2328","unicode_alternates":"2328-fe0f","name":"keyboard","shortname":":keyboard:","category":"objects","emoji_order":"595","aliases":[],"aliases_ascii":[],"keywords":["electronics","work","office"]},"desktop":{"unicode":"1f5a5","unicode_alternates":"1f5a5-fe0f","name":"desktop computer","shortname":":desktop:","category":"objects","emoji_order":"596","aliases":[":desktop_computer:"],"aliases_ascii":[],"keywords":["electronics","work"]},"printer":{"unicode":"1f5a8","unicode_alternates":"1f5a8-fe0f","name":"printer","shortname":":printer:","category":"objects","emoji_order":"597","aliases":[],"aliases_ascii":[],"keywords":["electronics","work","office"]},"mouse_three_button":{"unicode":"1f5b1","unicode_alternates":"1f5b1-fe0f","name":"three button mouse","shortname":":mouse_three_button:","category":"objects","emoji_order":"598","aliases":[":three_button_mouse:"],"aliases_ascii":[],"keywords":["electronics","work","game","office"]},"trackball":{"unicode":"1f5b2","unicode_alternates":"1f5b2-fe0f","name":"trackball","shortname":":trackball:","category":"objects","emoji_order":"599","aliases":[],"aliases_ascii":[],"keywords":["electronics","work","game","office"]},"joystick":{"unicode":"1f579","unicode_alternates":"1f579-fe0f","name":"joystick","shortname":":joystick:","category":"objects","emoji_order":"600","aliases":[],"aliases_ascii":[],"keywords":["electronics","game","boys night","boys night"]},"compression":{"unicode":"1f5dc","unicode_alternates":"1f5dc-fe0f","name":"compression","shortname":":compression:","category":"objects","emoji_order":"601","aliases":[],"aliases_ascii":[],"keywords":[]},"minidisc":{"unicode":"1f4bd","unicode_alternates":"","name":"minidisc","shortname":":minidisc:","category":"objects","emoji_order":"602","aliases":[],"aliases_ascii":[],"keywords":["electronics"]},"floppy_disk":{"unicode":"1f4be","unicode_alternates":"","name":"floppy disk","shortname":":floppy_disk:","category":"objects","emoji_order":"603","aliases":[],"aliases_ascii":[],"keywords":["electronics","office"]},"cd":{"unicode":"1f4bf","unicode_alternates":"","name":"optical disc","shortname":":cd:","category":"objects","emoji_order":"604","aliases":[],"aliases_ascii":[],"keywords":["electronics"]},"dvd":{"unicode":"1f4c0","unicode_alternates":"","name":"dvd","shortname":":dvd:","category":"objects","emoji_order":"605","aliases":[],"aliases_ascii":[],"keywords":["electronics"]},"vhs":{"unicode":"1f4fc","unicode_alternates":"","name":"videocassette","shortname":":vhs:","category":"objects","emoji_order":"606","aliases":[],"aliases_ascii":[],"keywords":["electronics"]},"camera":{"unicode":"1f4f7","unicode_alternates":"","name":"camera","shortname":":camera:","category":"objects","emoji_order":"607","aliases":[],"aliases_ascii":[],"keywords":["electronics","camera","selfie","selfie"]},"camera_with_flash":{"unicode":"1f4f8","unicode_alternates":"","name":"camera with flash","shortname":":camera_with_flash:","category":"objects","emoji_order":"608","aliases":[],"aliases_ascii":[],"keywords":["electronics","camera"]},"video_camera":{"unicode":"1f4f9","unicode_alternates":"","name":"video camera","shortname":":video_camera:","category":"objects","emoji_order":"609","aliases":[],"aliases_ascii":[],"keywords":["electronics","camera","movie"]},"movie_camera":{"unicode":"1f3a5","unicode_alternates":"","name":"movie camera","shortname":":movie_camera:","category":"objects","emoji_order":"610","aliases":[],"aliases_ascii":[],"keywords":["object","camera","movie"]},"projector":{"unicode":"1f4fd","unicode_alternates":"1f4fd-fe0f","name":"film projector","shortname":":projector:","category":"objects","emoji_order":"611","aliases":[":film_projector:"],"aliases_ascii":[],"keywords":["object","camera","movie"]},"film_frames":{"unicode":"1f39e","unicode_alternates":"1f39e-fe0f","name":"film frames","shortname":":film_frames:","category":"objects","emoji_order":"612","aliases":[],"aliases_ascii":[],"keywords":["object","camera","movie"]},"telephone_receiver":{"unicode":"1f4de","unicode_alternates":"","name":"telephone receiver","shortname":":telephone_receiver:","category":"objects","emoji_order":"613","aliases":[],"aliases_ascii":[],"keywords":["electronics","phone"]},"telephone":{"unicode":"260e","unicode_alternates":"260e-fe0f","name":"black telephone","shortname":":telephone:","category":"objects","emoji_order":"614","aliases":[],"aliases_ascii":[],"keywords":["electronics","phone"]},"pager":{"unicode":"1f4df","unicode_alternates":"","name":"pager","shortname":":pager:","category":"objects","emoji_order":"615","aliases":[],"aliases_ascii":[],"keywords":["electronics","work"]},"fax":{"unicode":"1f4e0","unicode_alternates":"","name":"fax machine","shortname":":fax:","category":"objects","emoji_order":"616","aliases":[],"aliases_ascii":[],"keywords":["electronics","work","office"]},"tv":{"unicode":"1f4fa","unicode_alternates":"","name":"television","shortname":":tv:","category":"objects","emoji_order":"617","aliases":[],"aliases_ascii":[],"keywords":["electronics"]},"radio":{"unicode":"1f4fb","unicode_alternates":"","name":"radio","shortname":":radio:","category":"objects","emoji_order":"618","aliases":[],"aliases_ascii":[],"keywords":["electronics"]},"microphone2":{"unicode":"1f399","unicode_alternates":"1f399-fe0f","name":"studio microphone","shortname":":microphone2:","category":"objects","emoji_order":"619","aliases":[":studio_microphone:"],"aliases_ascii":[],"keywords":["electronics","object"]},"level_slider":{"unicode":"1f39a","unicode_alternates":"1f39a-fe0f","name":"level slider","shortname":":level_slider:","category":"objects","emoji_order":"620","aliases":[],"aliases_ascii":[],"keywords":[]},"control_knobs":{"unicode":"1f39b","unicode_alternates":"1f39b-fe0f","name":"control knobs","shortname":":control_knobs:","category":"objects","emoji_order":"621","aliases":[],"aliases_ascii":[],"keywords":["time"]},"stopwatch":{"unicode":"23f1","unicode_alternates":"23f1-fe0f","name":"stopwatch","shortname":":stopwatch:","category":"objects","emoji_order":"622","aliases":[],"aliases_ascii":[],"keywords":["electronics","time"]},"timer":{"unicode":"23f2","unicode_alternates":"23f2-fe0f","name":"timer clock","shortname":":timer:","category":"objects","emoji_order":"623","aliases":[":timer_clock:"],"aliases_ascii":[],"keywords":["object","time"]},"alarm_clock":{"unicode":"23f0","unicode_alternates":"","name":"alarm clock","shortname":":alarm_clock:","category":"objects","emoji_order":"624","aliases":[],"aliases_ascii":[],"keywords":["object","time"]},"clock":{"unicode":"1f570","unicode_alternates":"1f570-fe0f","name":"mantlepiece clock","shortname":":clock:","category":"objects","emoji_order":"625","aliases":[":mantlepiece_clock:"],"aliases_ascii":[],"keywords":["object","time"]},"hourglass_flowing_sand":{"unicode":"23f3","unicode_alternates":"","name":"hourglass with flowing sand","shortname":":hourglass_flowing_sand:","category":"objects","emoji_order":"626","aliases":[],"aliases_ascii":[],"keywords":["object","time"]},"hourglass":{"unicode":"231b","unicode_alternates":"231b-fe0f","name":"hourglass","shortname":":hourglass:","category":"objects","emoji_order":"627","aliases":[],"aliases_ascii":[],"keywords":["object","time"]},"satellite":{"unicode":"1f4e1","unicode_alternates":"","name":"satellite antenna","shortname":":satellite:","category":"objects","emoji_order":"628","aliases":[],"aliases_ascii":[],"keywords":["object"]},"battery":{"unicode":"1f50b","unicode_alternates":"","name":"battery","shortname":":battery:","category":"objects","emoji_order":"629","aliases":[],"aliases_ascii":[],"keywords":["object"]},"electric_plug":{"unicode":"1f50c","unicode_alternates":"","name":"electric plug","shortname":":electric_plug:","category":"objects","emoji_order":"630","aliases":[],"aliases_ascii":[],"keywords":["electronics"]},"bulb":{"unicode":"1f4a1","unicode_alternates":"","name":"electric light bulb","shortname":":bulb:","category":"objects","emoji_order":"631","aliases":[],"aliases_ascii":[],"keywords":["object","science"]},"flashlight":{"unicode":"1f526","unicode_alternates":"","name":"electric torch","shortname":":flashlight:","category":"objects","emoji_order":"632","aliases":[],"aliases_ascii":[],"keywords":["electronics","object"]},"candle":{"unicode":"1f56f","unicode_alternates":"1f56f-fe0f","name":"candle","shortname":":candle:","category":"objects","emoji_order":"633","aliases":[],"aliases_ascii":[],"keywords":["object"]},"wastebasket":{"unicode":"1f5d1","unicode_alternates":"1f5d1-fe0f","name":"wastebasket","shortname":":wastebasket:","category":"objects","emoji_order":"634","aliases":[],"aliases_ascii":[],"keywords":["object","work"]},"oil":{"unicode":"1f6e2","unicode_alternates":"1f6e2-fe0f","name":"oil drum","shortname":":oil:","category":"objects","emoji_order":"635","aliases":[":oil_drum:"],"aliases_ascii":[],"keywords":["object"]},"money_with_wings":{"unicode":"1f4b8","unicode_alternates":"","name":"money with wings","shortname":":money_with_wings:","category":"objects","emoji_order":"636","aliases":[],"aliases_ascii":[],"keywords":["money","money","boys night","boys night"]},"dollar":{"unicode":"1f4b5","unicode_alternates":"","name":"banknote with dollar sign","shortname":":dollar:","category":"objects","emoji_order":"637","aliases":[],"aliases_ascii":[],"keywords":["money","money"]},"yen":{"unicode":"1f4b4","unicode_alternates":"","name":"banknote with yen sign","shortname":":yen:","category":"objects","emoji_order":"638","aliases":[],"aliases_ascii":[],"keywords":["money","money"]},"euro":{"unicode":"1f4b6","unicode_alternates":"","name":"banknote with euro sign","shortname":":euro:","category":"objects","emoji_order":"639","aliases":[],"aliases_ascii":[],"keywords":["money","money"]},"pound":{"unicode":"1f4b7","unicode_alternates":"","name":"banknote with pound sign","shortname":":pound:","category":"objects","emoji_order":"640","aliases":[],"aliases_ascii":[],"keywords":["money","money"]},"moneybag":{"unicode":"1f4b0","unicode_alternates":"","name":"money bag","shortname":":moneybag:","category":"objects","emoji_order":"641","aliases":[],"aliases_ascii":[],"keywords":["bag","award","money","money"]},"credit_card":{"unicode":"1f4b3","unicode_alternates":"","name":"credit card","shortname":":credit_card:","category":"objects","emoji_order":"642","aliases":[],"aliases_ascii":[],"keywords":["object","money","money","boys night","boys night"]},"gem":{"unicode":"1f48e","unicode_alternates":"","name":"gem stone","shortname":":gem:","category":"objects","emoji_order":"643","aliases":[],"aliases_ascii":[],"keywords":["object","gem"]},"scales":{"unicode":"2696","unicode_alternates":"2696-fe0f","name":"scales","shortname":":scales:","category":"objects","emoji_order":"644","aliases":[],"aliases_ascii":[],"keywords":["object"]},"wrench":{"unicode":"1f527","unicode_alternates":"","name":"wrench","shortname":":wrench:","category":"objects","emoji_order":"645","aliases":[],"aliases_ascii":[],"keywords":["object","tool"]},"hammer":{"unicode":"1f528","unicode_alternates":"","name":"hammer","shortname":":hammer:","category":"objects","emoji_order":"646","aliases":[],"aliases_ascii":[],"keywords":["object","tool","weapon"]},"hammer_pick":{"unicode":"2692","unicode_alternates":"2692-fe0f","name":"hammer and pick","shortname":":hammer_pick:","category":"objects","emoji_order":"647","aliases":[":hammer_and_pick:"],"aliases_ascii":[],"keywords":["object","tool","weapon"]},"tools":{"unicode":"1f6e0","unicode_alternates":"1f6e0-fe0f","name":"hammer and wrench","shortname":":tools:","category":"objects","emoji_order":"648","aliases":[":hammer_and_wrench:"],"aliases_ascii":[],"keywords":["object","tool"]},"pick":{"unicode":"26cf","unicode_alternates":"26cf-fe0f","name":"pick","shortname":":pick:","category":"objects","emoji_order":"649","aliases":[],"aliases_ascii":[],"keywords":["object","tool","weapon"]},"nut_and_bolt":{"unicode":"1f529","unicode_alternates":"","name":"nut and bolt","shortname":":nut_and_bolt:","category":"objects","emoji_order":"650","aliases":[],"aliases_ascii":[],"keywords":["object","tool","nutcase","nutcase"]},"gear":{"unicode":"2699","unicode_alternates":"2699-fe0f","name":"gear","shortname":":gear:","category":"objects","emoji_order":"651","aliases":[],"aliases_ascii":[],"keywords":["object","tool"]},"chains":{"unicode":"26d3","unicode_alternates":"26d3-fe0f","name":"chains","shortname":":chains:","category":"objects","emoji_order":"652","aliases":[],"aliases_ascii":[],"keywords":["object","tool"]},"gun":{"unicode":"1f52b","unicode_alternates":"","name":"pistol","shortname":":gun:","category":"objects","emoji_order":"653","aliases":[],"aliases_ascii":[],"keywords":["object","weapon","dead","gun","sarcastic","sarcastic"]},"bomb":{"unicode":"1f4a3","unicode_alternates":"","name":"bomb","shortname":":bomb:","category":"objects","emoji_order":"654","aliases":[],"aliases_ascii":[],"keywords":["object","weapon","dead","blast","blast"]},"knife":{"unicode":"1f52a","unicode_alternates":"","name":"hocho","shortname":":knife:","category":"objects","emoji_order":"655","aliases":[],"aliases_ascii":[],"keywords":["object","weapon"]},"dagger":{"unicode":"1f5e1","unicode_alternates":"1f5e1-fe0f","name":"dagger knife","shortname":":dagger:","category":"objects","emoji_order":"656","aliases":[":dagger_knife:"],"aliases_ascii":[],"keywords":["object","weapon"]},"crossed_swords":{"unicode":"2694","unicode_alternates":"2694-fe0f","name":"crossed swords","shortname":":crossed_swords:","category":"objects","emoji_order":"657","aliases":[],"aliases_ascii":[],"keywords":["object","weapon"]},"shield":{"unicode":"1f6e1","unicode_alternates":"1f6e1-fe0f","name":"shield","shortname":":shield:","category":"objects","emoji_order":"658","aliases":[],"aliases_ascii":[],"keywords":["object"]},"smoking":{"unicode":"1f6ac","unicode_alternates":"","name":"smoking symbol","shortname":":smoking:","category":"objects","emoji_order":"659","aliases":[],"aliases_ascii":[],"keywords":["symbol","drugs","drugs","smoking","smoking"]},"skull_crossbones":{"unicode":"2620","unicode_alternates":"2620-fe0f","name":"skull and crossbones","shortname":":skull_crossbones:","category":"objects","emoji_order":"660","aliases":[":skull_and_crossbones:"],"aliases_ascii":[],"keywords":["symbol","dead","skull"]},"coffin":{"unicode":"26b0","unicode_alternates":"26b0-fe0f","name":"coffin","shortname":":coffin:","category":"objects","emoji_order":"661","aliases":[],"aliases_ascii":[],"keywords":["object","dead","rip","rip"]},"urn":{"unicode":"26b1","unicode_alternates":"26b1-fe0f","name":"funeral urn","shortname":":urn:","category":"objects","emoji_order":"662","aliases":[":funeral_urn:"],"aliases_ascii":[],"keywords":["object","dead","rip","rip"]},"amphora":{"unicode":"1f3fa","unicode_alternates":"","name":"amphora","shortname":":amphora:","category":"objects","emoji_order":"663","aliases":[],"aliases_ascii":[],"keywords":["object"]},"crystal_ball":{"unicode":"1f52e","unicode_alternates":"","name":"crystal ball","shortname":":crystal_ball:","category":"objects","emoji_order":"664","aliases":[],"aliases_ascii":[],"keywords":["object","ball"]},"prayer_beads":{"unicode":"1f4ff","unicode_alternates":"","name":"prayer beads","shortname":":prayer_beads:","category":"objects","emoji_order":"665","aliases":[],"aliases_ascii":[],"keywords":["object","rosary"]},"barber":{"unicode":"1f488","unicode_alternates":"","name":"barber pole","shortname":":barber:","category":"objects","emoji_order":"666","aliases":[],"aliases_ascii":[],"keywords":["object"]},"alembic":{"unicode":"2697","unicode_alternates":"2697-fe0f","name":"alembic","shortname":":alembic:","category":"objects","emoji_order":"667","aliases":[],"aliases_ascii":[],"keywords":["object","science"]},"telescope":{"unicode":"1f52d","unicode_alternates":"","name":"telescope","shortname":":telescope:","category":"objects","emoji_order":"668","aliases":[],"aliases_ascii":[],"keywords":["object","space","science"]},"microscope":{"unicode":"1f52c","unicode_alternates":"","name":"microscope","shortname":":microscope:","category":"objects","emoji_order":"669","aliases":[],"aliases_ascii":[],"keywords":["object","science"]},"hole":{"unicode":"1f573","unicode_alternates":"1f573-fe0f","name":"hole","shortname":":hole:","category":"objects","emoji_order":"670","aliases":[],"aliases_ascii":[],"keywords":["object"]},"pill":{"unicode":"1f48a","unicode_alternates":"","name":"pill","shortname":":pill:","category":"objects","emoji_order":"671","aliases":[],"aliases_ascii":[],"keywords":["object","health","drugs","drugs"]},"syringe":{"unicode":"1f489","unicode_alternates":"","name":"syringe","shortname":":syringe:","category":"objects","emoji_order":"672","aliases":[],"aliases_ascii":[],"keywords":["object","weapon","health","drugs","drugs"]},"thermometer":{"unicode":"1f321","unicode_alternates":"1f321-fe0f","name":"thermometer","shortname":":thermometer:","category":"objects","emoji_order":"673","aliases":[],"aliases_ascii":[],"keywords":["object","science","health","hot","hot"]},"label":{"unicode":"1f3f7","unicode_alternates":"1f3f7-fe0f","name":"label","shortname":":label:","category":"objects","emoji_order":"674","aliases":[],"aliases_ascii":[],"keywords":["object"]},"bookmark":{"unicode":"1f516","unicode_alternates":"","name":"bookmark","shortname":":bookmark:","category":"objects","emoji_order":"675","aliases":[],"aliases_ascii":[],"keywords":["object","book"]},"toilet":{"unicode":"1f6bd","unicode_alternates":"","name":"toilet","shortname":":toilet:","category":"objects","emoji_order":"676","aliases":[],"aliases_ascii":[],"keywords":["object","bathroom"]},"shower":{"unicode":"1f6bf","unicode_alternates":"","name":"shower","shortname":":shower:","category":"objects","emoji_order":"677","aliases":[],"aliases_ascii":[],"keywords":["object","bathroom"]},"bathtub":{"unicode":"1f6c1","unicode_alternates":"","name":"bathtub","shortname":":bathtub:","category":"objects","emoji_order":"678","aliases":[],"aliases_ascii":[],"keywords":["object","bathroom","tired","steam","steam"]},"key":{"unicode":"1f511","unicode_alternates":"","name":"key","shortname":":key:","category":"objects","emoji_order":"679","aliases":[],"aliases_ascii":[],"keywords":["object","lock"]},"key2":{"unicode":"1f5dd","unicode_alternates":"1f5dd-fe0f","name":"old key","shortname":":key2:","category":"objects","emoji_order":"680","aliases":[":old_key:"],"aliases_ascii":[],"keywords":["object","lock"]},"couch":{"unicode":"1f6cb","unicode_alternates":"1f6cb-fe0f","name":"couch and lamp","shortname":":couch:","category":"objects","emoji_order":"681","aliases":[":couch_and_lamp:"],"aliases_ascii":[],"keywords":["object"]},"sleeping_accommodation":{"unicode":"1f6cc","unicode_alternates":"","name":"sleeping accommodation","shortname":":sleeping_accommodation:","category":"objects","emoji_order":"682","aliases":[],"aliases_ascii":[],"keywords":["tired"]},"bed":{"unicode":"1f6cf","unicode_alternates":"1f6cf-fe0f","name":"bed","shortname":":bed:","category":"objects","emoji_order":"683","aliases":[],"aliases_ascii":[],"keywords":["object","tired"]},"door":{"unicode":"1f6aa","unicode_alternates":"","name":"door","shortname":":door:","category":"objects","emoji_order":"684","aliases":[],"aliases_ascii":[],"keywords":["object"]},"bellhop":{"unicode":"1f6ce","unicode_alternates":"1f6ce-fe0f","name":"bellhop bell","shortname":":bellhop:","category":"objects","emoji_order":"685","aliases":[":bellhop_bell:"],"aliases_ascii":[],"keywords":["object"]},"frame_photo":{"unicode":"1f5bc","unicode_alternates":"1f5bc-fe0f","name":"frame with picture","shortname":":frame_photo:","category":"objects","emoji_order":"686","aliases":[":frame_with_picture:"],"aliases_ascii":[],"keywords":["travel","vacation"]},"map":{"unicode":"1f5fa","unicode_alternates":"1f5fa-fe0f","name":"world map","shortname":":map:","category":"objects","emoji_order":"687","aliases":[":world_map:"],"aliases_ascii":[],"keywords":["travel","map","vacation"]},"beach_umbrella":{"unicode":"26f1","unicode_alternates":"26f1-fe0f","name":"umbrella on ground","shortname":":beach_umbrella:","category":"objects","emoji_order":"688","aliases":[":umbrella_on_ground:"],"aliases_ascii":[],"keywords":["travel","vacation","tropical"]},"moyai":{"unicode":"1f5ff","unicode_alternates":"","name":"moyai","shortname":":moyai:","category":"objects","emoji_order":"689","aliases":[],"aliases_ascii":[],"keywords":["travel","vacation"]},"shopping_bags":{"unicode":"1f6cd","unicode_alternates":"1f6cd-fe0f","name":"shopping bags","shortname":":shopping_bags:","category":"objects","emoji_order":"690","aliases":[],"aliases_ascii":[],"keywords":["object","birthday","parties","parties"]},"balloon":{"unicode":"1f388","unicode_alternates":"","name":"balloon","shortname":":balloon:","category":"objects","emoji_order":"691","aliases":[],"aliases_ascii":[],"keywords":["object","birthday","good","good","parties","parties"]},"flags":{"unicode":"1f38f","unicode_alternates":"","name":"carp streamer","shortname":":flags:","category":"objects","emoji_order":"692","aliases":[],"aliases_ascii":[],"keywords":["object","japan"]},"ribbon":{"unicode":"1f380","unicode_alternates":"","name":"ribbon","shortname":":ribbon:","category":"objects","emoji_order":"693","aliases":[],"aliases_ascii":[],"keywords":["object","gift","birthday"]},"gift":{"unicode":"1f381","unicode_alternates":"","name":"wrapped present","shortname":":gift:","category":"objects","emoji_order":"694","aliases":[],"aliases_ascii":[],"keywords":["object","gift","birthday","holidays","christmas","parties","parties"]},"confetti_ball":{"unicode":"1f38a","unicode_alternates":"","name":"confetti ball","shortname":":confetti_ball:","category":"objects","emoji_order":"695","aliases":[],"aliases_ascii":[],"keywords":["object","birthday","holidays","cheers","girls night","girls night","boys night","boys night","parties","parties"]},"tada":{"unicode":"1f389","unicode_alternates":"","name":"party popper","shortname":":tada:","category":"objects","emoji_order":"696","aliases":[],"aliases_ascii":[],"keywords":["object","birthday","holidays","cheers","good","good","girls night","girls night","boys night","boys night","parties","parties"]},"dolls":{"unicode":"1f38e","unicode_alternates":"","name":"japanese dolls","shortname":":dolls:","category":"objects","emoji_order":"697","aliases":[],"aliases_ascii":[],"keywords":["people","japan"]},"wind_chime":{"unicode":"1f390","unicode_alternates":"","name":"wind chime","shortname":":wind_chime:","category":"objects","emoji_order":"698","aliases":[],"aliases_ascii":[],"keywords":["object","japan"]},"crossed_flags":{"unicode":"1f38c","unicode_alternates":"","name":"crossed flags","shortname":":crossed_flags:","category":"objects","emoji_order":"699","aliases":[],"aliases_ascii":[],"keywords":["object","japan"]},"izakaya_lantern":{"unicode":"1f3ee","unicode_alternates":"","name":"izakaya lantern","shortname":":izakaya_lantern:","category":"objects","emoji_order":"700","aliases":[],"aliases_ascii":[],"keywords":["object","japan"]},"envelope":{"unicode":"2709","unicode_alternates":"2709-fe0f","name":"envelope","shortname":":envelope:","category":"objects","emoji_order":"701","aliases":[],"aliases_ascii":[],"keywords":["object","office","write"]},"envelope_with_arrow":{"unicode":"1f4e9","unicode_alternates":"","name":"envelope with downwards arrow above","shortname":":envelope_with_arrow:","category":"objects","emoji_order":"702","aliases":[],"aliases_ascii":[],"keywords":["object","office"]},"incoming_envelope":{"unicode":"1f4e8","unicode_alternates":"","name":"incoming envelope","shortname":":incoming_envelope:","category":"objects","emoji_order":"703","aliases":[],"aliases_ascii":[],"keywords":["object"]},"e-mail":{"unicode":"1f4e7","unicode_alternates":"","name":"e-mail symbol","shortname":":e-mail:","category":"objects","emoji_order":"704","aliases":[":email:"],"aliases_ascii":[],"keywords":["office"]},"love_letter":{"unicode":"1f48c","unicode_alternates":"","name":"love letter","shortname":":love_letter:","category":"objects","emoji_order":"705","aliases":[],"aliases_ascii":[],"keywords":["object"]},"postbox":{"unicode":"1f4ee","unicode_alternates":"","name":"postbox","shortname":":postbox:","category":"objects","emoji_order":"706","aliases":[],"aliases_ascii":[],"keywords":["object"]},"mailbox_closed":{"unicode":"1f4ea","unicode_alternates":"","name":"closed mailbox with lowered flag","shortname":":mailbox_closed:","category":"objects","emoji_order":"707","aliases":[],"aliases_ascii":[],"keywords":["object","office"]},"mailbox":{"unicode":"1f4eb","unicode_alternates":"","name":"closed mailbox with raised flag","shortname":":mailbox:","category":"objects","emoji_order":"708","aliases":[],"aliases_ascii":[],"keywords":["object"]},"mailbox_with_mail":{"unicode":"1f4ec","unicode_alternates":"","name":"open mailbox with raised flag","shortname":":mailbox_with_mail:","category":"objects","emoji_order":"709","aliases":[],"aliases_ascii":[],"keywords":["object"]},"mailbox_with_no_mail":{"unicode":"1f4ed","unicode_alternates":"","name":"open mailbox with lowered flag","shortname":":mailbox_with_no_mail:","category":"objects","emoji_order":"710","aliases":[],"aliases_ascii":[],"keywords":["object"]},"package":{"unicode":"1f4e6","unicode_alternates":"","name":"package","shortname":":package:","category":"objects","emoji_order":"711","aliases":[],"aliases_ascii":[],"keywords":["object","gift","office"]},"postal_horn":{"unicode":"1f4ef","unicode_alternates":"","name":"postal horn","shortname":":postal_horn:","category":"objects","emoji_order":"712","aliases":[],"aliases_ascii":[],"keywords":["object"]},"inbox_tray":{"unicode":"1f4e5","unicode_alternates":"","name":"inbox tray","shortname":":inbox_tray:","category":"objects","emoji_order":"713","aliases":[],"aliases_ascii":[],"keywords":["work","office"]},"outbox_tray":{"unicode":"1f4e4","unicode_alternates":"","name":"outbox tray","shortname":":outbox_tray:","category":"objects","emoji_order":"714","aliases":[],"aliases_ascii":[],"keywords":["work","office"]},"scroll":{"unicode":"1f4dc","unicode_alternates":"","name":"scroll","shortname":":scroll:","category":"objects","emoji_order":"715","aliases":[],"aliases_ascii":[],"keywords":["object","office"]},"page_with_curl":{"unicode":"1f4c3","unicode_alternates":"","name":"page with curl","shortname":":page_with_curl:","category":"objects","emoji_order":"716","aliases":[],"aliases_ascii":[],"keywords":["office","write"]},"bookmark_tabs":{"unicode":"1f4d1","unicode_alternates":"","name":"bookmark tabs","shortname":":bookmark_tabs:","category":"objects","emoji_order":"717","aliases":[],"aliases_ascii":[],"keywords":["office","write"]},"bar_chart":{"unicode":"1f4ca","unicode_alternates":"","name":"bar chart","shortname":":bar_chart:","category":"objects","emoji_order":"718","aliases":[],"aliases_ascii":[],"keywords":["work","office"]},"chart_with_upwards_trend":{"unicode":"1f4c8","unicode_alternates":"","name":"chart with upwards trend","shortname":":chart_with_upwards_trend:","category":"objects","emoji_order":"719","aliases":[],"aliases_ascii":[],"keywords":["work","office"]},"chart_with_downwards_trend":{"unicode":"1f4c9","unicode_alternates":"","name":"chart with downwards trend","shortname":":chart_with_downwards_trend:","category":"objects","emoji_order":"720","aliases":[],"aliases_ascii":[],"keywords":["work","office"]},"page_facing_up":{"unicode":"1f4c4","unicode_alternates":"","name":"page facing up","shortname":":page_facing_up:","category":"objects","emoji_order":"721","aliases":[],"aliases_ascii":[],"keywords":["work","office","write"]},"date":{"unicode":"1f4c5","unicode_alternates":"","name":"calendar","shortname":":date:","category":"objects","emoji_order":"722","aliases":[],"aliases_ascii":[],"keywords":["object","office"]},"calendar":{"unicode":"1f4c6","unicode_alternates":"","name":"tear-off calendar","shortname":":calendar:","category":"objects","emoji_order":"723","aliases":[],"aliases_ascii":[],"keywords":["object","office"]},"calendar_spiral":{"unicode":"1f5d3","unicode_alternates":"1f5d3-fe0f","name":"spiral calendar pad","shortname":":calendar_spiral:","category":"objects","emoji_order":"724","aliases":[":spiral_calendar_pad:"],"aliases_ascii":[],"keywords":["object","office"]},"card_index":{"unicode":"1f4c7","unicode_alternates":"","name":"card index","shortname":":card_index:","category":"objects","emoji_order":"725","aliases":[],"aliases_ascii":[],"keywords":["object","work","office"]},"card_box":{"unicode":"1f5c3","unicode_alternates":"1f5c3-fe0f","name":"card file box","shortname":":card_box:","category":"objects","emoji_order":"726","aliases":[":card_file_box:"],"aliases_ascii":[],"keywords":["object","work","office"]},"ballot_box":{"unicode":"1f5f3","unicode_alternates":"1f5f3-fe0f","name":"ballot box with ballot","shortname":":ballot_box:","category":"objects","emoji_order":"727","aliases":[":ballot_box_with_ballot:"],"aliases_ascii":[],"keywords":["object","office"]},"file_cabinet":{"unicode":"1f5c4","unicode_alternates":"1f5c4-fe0f","name":"file cabinet","shortname":":file_cabinet:","category":"objects","emoji_order":"728","aliases":[],"aliases_ascii":[],"keywords":["object","work","office"]},"clipboard":{"unicode":"1f4cb","unicode_alternates":"","name":"clipboard","shortname":":clipboard:","category":"objects","emoji_order":"729","aliases":[],"aliases_ascii":[],"keywords":["object","work","office","write"]},"notepad_spiral":{"unicode":"1f5d2","unicode_alternates":"1f5d2-fe0f","name":"spiral note pad","shortname":":notepad_spiral:","category":"objects","emoji_order":"730","aliases":[":spiral_note_pad:"],"aliases_ascii":[],"keywords":["work","office","write"]},"file_folder":{"unicode":"1f4c1","unicode_alternates":"","name":"file folder","shortname":":file_folder:","category":"objects","emoji_order":"731","aliases":[],"aliases_ascii":[],"keywords":["work","office"]},"open_file_folder":{"unicode":"1f4c2","unicode_alternates":"","name":"open file folder","shortname":":open_file_folder:","category":"objects","emoji_order":"732","aliases":[],"aliases_ascii":[],"keywords":["work","office"]},"dividers":{"unicode":"1f5c2","unicode_alternates":"1f5c2-fe0f","name":"card index dividers","shortname":":dividers:","category":"objects","emoji_order":"733","aliases":[":card_index_dividers:"],"aliases_ascii":[],"keywords":["work","office"]},"newspaper2":{"unicode":"1f5de","unicode_alternates":"1f5de-fe0f","name":"rolled-up newspaper","shortname":":newspaper2:","category":"objects","emoji_order":"734","aliases":[":rolled_up_newspaper:"],"aliases_ascii":[],"keywords":["office","write"]},"newspaper":{"unicode":"1f4f0","unicode_alternates":"","name":"newspaper","shortname":":newspaper:","category":"objects","emoji_order":"735","aliases":[],"aliases_ascii":[],"keywords":["office","write"]},"notebook":{"unicode":"1f4d3","unicode_alternates":"","name":"notebook","shortname":":notebook:","category":"objects","emoji_order":"736","aliases":[],"aliases_ascii":[],"keywords":["object","office","write"]},"closed_book":{"unicode":"1f4d5","unicode_alternates":"","name":"closed book","shortname":":closed_book:","category":"objects","emoji_order":"737","aliases":[],"aliases_ascii":[],"keywords":["object","office","write","book"]},"green_book":{"unicode":"1f4d7","unicode_alternates":"","name":"green book","shortname":":green_book:","category":"objects","emoji_order":"738","aliases":[],"aliases_ascii":[],"keywords":["object","office","book"]},"blue_book":{"unicode":"1f4d8","unicode_alternates":"","name":"blue book","shortname":":blue_book:","category":"objects","emoji_order":"739","aliases":[],"aliases_ascii":[],"keywords":["object","office","write","book"]},"orange_book":{"unicode":"1f4d9","unicode_alternates":"","name":"orange book","shortname":":orange_book:","category":"objects","emoji_order":"740","aliases":[],"aliases_ascii":[],"keywords":["object","office","write","book"]},"notebook_with_decorative_cover":{"unicode":"1f4d4","unicode_alternates":"","name":"notebook with decorative cover","shortname":":notebook_with_decorative_cover:","category":"objects","emoji_order":"741","aliases":[],"aliases_ascii":[],"keywords":["object","office","write"]},"ledger":{"unicode":"1f4d2","unicode_alternates":"","name":"ledger","shortname":":ledger:","category":"objects","emoji_order":"742","aliases":[],"aliases_ascii":[],"keywords":["object","office","write"]},"books":{"unicode":"1f4da","unicode_alternates":"","name":"books","shortname":":books:","category":"objects","emoji_order":"743","aliases":[],"aliases_ascii":[],"keywords":["object","office","write","book"]},"book":{"unicode":"1f4d6","unicode_alternates":"","name":"open book","shortname":":book:","category":"objects","emoji_order":"744","aliases":[],"aliases_ascii":[],"keywords":["object","office","write","book"]},"link":{"unicode":"1f517","unicode_alternates":"","name":"link symbol","shortname":":link:","category":"objects","emoji_order":"745","aliases":[],"aliases_ascii":[],"keywords":["symbol","office"]},"paperclip":{"unicode":"1f4ce","unicode_alternates":"","name":"paperclip","shortname":":paperclip:","category":"objects","emoji_order":"746","aliases":[],"aliases_ascii":[],"keywords":["object","work","office"]},"paperclips":{"unicode":"1f587","unicode_alternates":"1f587-fe0f","name":"linked paperclips","shortname":":paperclips:","category":"objects","emoji_order":"747","aliases":[":linked_paperclips:"],"aliases_ascii":[],"keywords":["object","work","office"]},"scissors":{"unicode":"2702","unicode_alternates":"2702-fe0f","name":"black scissors","shortname":":scissors:","category":"objects","emoji_order":"748","aliases":[],"aliases_ascii":[],"keywords":["object","tool","weapon","office"]},"triangular_ruler":{"unicode":"1f4d0","unicode_alternates":"","name":"triangular ruler","shortname":":triangular_ruler:","category":"objects","emoji_order":"749","aliases":[],"aliases_ascii":[],"keywords":["object","tool","office"]},"straight_ruler":{"unicode":"1f4cf","unicode_alternates":"","name":"straight ruler","shortname":":straight_ruler:","category":"objects","emoji_order":"750","aliases":[],"aliases_ascii":[],"keywords":["object","tool","office"]},"pushpin":{"unicode":"1f4cc","unicode_alternates":"","name":"pushpin","shortname":":pushpin:","category":"objects","emoji_order":"751","aliases":[],"aliases_ascii":[],"keywords":["object","office"]},"round_pushpin":{"unicode":"1f4cd","unicode_alternates":"","name":"round pushpin","shortname":":round_pushpin:","category":"objects","emoji_order":"752","aliases":[],"aliases_ascii":[],"keywords":["object","office"]},"triangular_flag_on_post":{"unicode":"1f6a9","unicode_alternates":"","name":"triangular flag on post","shortname":":triangular_flag_on_post:","category":"objects","emoji_order":"753","aliases":[],"aliases_ascii":[],"keywords":["object"]},"flag_white":{"unicode":"1f3f3","unicode_alternates":"1f3f3-fe0f","name":"waving white flag","shortname":":flag_white:","category":"objects","emoji_order":"754","aliases":[":waving_white_flag:"],"aliases_ascii":[],"keywords":["object"]},"flag_black":{"unicode":"1f3f4","unicode_alternates":"","name":"waving black flag","shortname":":flag_black:","category":"objects","emoji_order":"755","aliases":[":waving_black_flag:"],"aliases_ascii":[],"keywords":["object"]},"closed_lock_with_key":{"unicode":"1f510","unicode_alternates":"","name":"closed lock with key","shortname":":closed_lock_with_key:","category":"objects","emoji_order":"756","aliases":[],"aliases_ascii":[],"keywords":["object","lock"]},"lock":{"unicode":"1f512","unicode_alternates":"","name":"lock","shortname":":lock:","category":"objects","emoji_order":"757","aliases":[],"aliases_ascii":[],"keywords":["object","lock"]},"unlock":{"unicode":"1f513","unicode_alternates":"","name":"open lock","shortname":":unlock:","category":"objects","emoji_order":"758","aliases":[],"aliases_ascii":[],"keywords":["object","lock"]},"lock_with_ink_pen":{"unicode":"1f50f","unicode_alternates":"","name":"lock with ink pen","shortname":":lock_with_ink_pen:","category":"objects","emoji_order":"759","aliases":[],"aliases_ascii":[],"keywords":["object","lock"]},"pen_ballpoint":{"unicode":"1f58a","unicode_alternates":"1f58a-fe0f","name":"lower left ballpoint pen","shortname":":pen_ballpoint:","category":"objects","emoji_order":"760","aliases":[":lower_left_ballpoint_pen:"],"aliases_ascii":[],"keywords":["object","office","write"]},"pen_fountain":{"unicode":"1f58b","unicode_alternates":"1f58b-fe0f","name":"lower left fountain pen","shortname":":pen_fountain:","category":"objects","emoji_order":"761","aliases":[":lower_left_fountain_pen:"],"aliases_ascii":[],"keywords":["object","office","write"]},"black_nib":{"unicode":"2712","unicode_alternates":"2712-fe0f","name":"black nib","shortname":":black_nib:","category":"objects","emoji_order":"762","aliases":[],"aliases_ascii":[],"keywords":["object","office","write"]},"pencil":{"unicode":"1f4dd","unicode_alternates":"","name":"memo","shortname":":pencil:","category":"objects","emoji_order":"763","aliases":[],"aliases_ascii":[],"keywords":["work","office","write"]},"pencil2":{"unicode":"270f","unicode_alternates":"270f-fe0f","name":"pencil","shortname":":pencil2:","category":"objects","emoji_order":"764","aliases":[],"aliases_ascii":[],"keywords":["object","office","write"]},"crayon":{"unicode":"1f58d","unicode_alternates":"1f58d-fe0f","name":"lower left crayon","shortname":":crayon:","category":"objects","emoji_order":"765","aliases":[":lower_left_crayon:"],"aliases_ascii":[],"keywords":["object","office","write"]},"paintbrush":{"unicode":"1f58c","unicode_alternates":"1f58c-fe0f","name":"lower left paintbrush","shortname":":paintbrush:","category":"objects","emoji_order":"766","aliases":[":lower_left_paintbrush:"],"aliases_ascii":[],"keywords":["object","office","write"]},"mag":{"unicode":"1f50d","unicode_alternates":"","name":"left-pointing magnifying glass","shortname":":mag:","category":"objects","emoji_order":"767","aliases":[],"aliases_ascii":[],"keywords":["object"]},"mag_right":{"unicode":"1f50e","unicode_alternates":"","name":"right-pointing magnifying glass","shortname":":mag_right:","category":"objects","emoji_order":"768","aliases":[],"aliases_ascii":[],"keywords":["object"]},"heart":{"unicode":"2764","unicode_alternates":"2764-fe0f","name":"heavy black heart","shortname":":heart:","category":"symbols","emoji_order":"769","aliases":[],"aliases_ascii":["<3"],"keywords":["love","symbol","parties","parties"]},"yellow_heart":{"unicode":"1f49b","unicode_alternates":"","name":"yellow heart","shortname":":yellow_heart:","category":"symbols","emoji_order":"770","aliases":[],"aliases_ascii":[],"keywords":["love","symbol"]},"green_heart":{"unicode":"1f49a","unicode_alternates":"","name":"green heart","shortname":":green_heart:","category":"symbols","emoji_order":"771","aliases":[],"aliases_ascii":[],"keywords":["love","symbol"]},"blue_heart":{"unicode":"1f499","unicode_alternates":"","name":"blue heart","shortname":":blue_heart:","category":"symbols","emoji_order":"772","aliases":[],"aliases_ascii":[],"keywords":["love","symbol"]},"purple_heart":{"unicode":"1f49c","unicode_alternates":"","name":"purple heart","shortname":":purple_heart:","category":"symbols","emoji_order":"773","aliases":[],"aliases_ascii":[],"keywords":["love","symbol"]},"broken_heart":{"unicode":"1f494","unicode_alternates":"","name":"broken heart","shortname":":broken_heart:","category":"symbols","emoji_order":"774","aliases":[],"aliases_ascii":["<\/3"],"keywords":["love","symbol","heartbreak","heartbreak"]},"heart_exclamation":{"unicode":"2763","unicode_alternates":"2763-fe0f","name":"heavy heart exclamation mark ornament","shortname":":heart_exclamation:","category":"symbols","emoji_order":"775","aliases":[":heavy_heart_exclamation_mark_ornament:"],"aliases_ascii":[],"keywords":["love","symbol"]},"two_hearts":{"unicode":"1f495","unicode_alternates":"","name":"two hearts","shortname":":two_hearts:","category":"symbols","emoji_order":"776","aliases":[],"aliases_ascii":[],"keywords":["love","symbol"]},"revolving_hearts":{"unicode":"1f49e","unicode_alternates":"","name":"revolving hearts","shortname":":revolving_hearts:","category":"symbols","emoji_order":"777","aliases":[],"aliases_ascii":[],"keywords":["love","symbol"]},"heartbeat":{"unicode":"1f493","unicode_alternates":"","name":"beating heart","shortname":":heartbeat:","category":"symbols","emoji_order":"778","aliases":[],"aliases_ascii":[],"keywords":["love","symbol"]},"heartpulse":{"unicode":"1f497","unicode_alternates":"","name":"growing heart","shortname":":heartpulse:","category":"symbols","emoji_order":"779","aliases":[],"aliases_ascii":[],"keywords":["love","symbol"]},"sparkling_heart":{"unicode":"1f496","unicode_alternates":"","name":"sparkling heart","shortname":":sparkling_heart:","category":"symbols","emoji_order":"780","aliases":[],"aliases_ascii":[],"keywords":["love","symbol","girls night","girls night"]},"cupid":{"unicode":"1f498","unicode_alternates":"","name":"heart with arrow","shortname":":cupid:","category":"symbols","emoji_order":"781","aliases":[],"aliases_ascii":[],"keywords":["love","symbol"]},"gift_heart":{"unicode":"1f49d","unicode_alternates":"","name":"heart with ribbon","shortname":":gift_heart:","category":"symbols","emoji_order":"782","aliases":[],"aliases_ascii":[],"keywords":["love","symbol","condolence","condolence"]},"heart_decoration":{"unicode":"1f49f","unicode_alternates":"","name":"heart decoration","shortname":":heart_decoration:","category":"symbols","emoji_order":"783","aliases":[],"aliases_ascii":[],"keywords":["love","symbol"]},"peace":{"unicode":"262e","unicode_alternates":"262e-fe0f","name":"peace symbol","shortname":":peace:","category":"symbols","emoji_order":"784","aliases":[":peace_symbol:"],"aliases_ascii":[],"keywords":["symbol","peace","peace","drugs","drugs"]},"cross":{"unicode":"271d","unicode_alternates":"271d-fe0f","name":"latin cross","shortname":":cross:","category":"symbols","emoji_order":"785","aliases":[":latin_cross:"],"aliases_ascii":[],"keywords":["religion","symbol"]},"star_and_crescent":{"unicode":"262a","unicode_alternates":"262a-fe0f","name":"star and crescent","shortname":":star_and_crescent:","category":"symbols","emoji_order":"786","aliases":[],"aliases_ascii":[],"keywords":["religion","symbol"]},"om_symbol":{"unicode":"1f549","unicode_alternates":"1f549-fe0f","name":"om symbol","shortname":":om_symbol:","category":"symbols","emoji_order":"787","aliases":[],"aliases_ascii":[],"keywords":["religion","symbol"]},"wheel_of_dharma":{"unicode":"2638","unicode_alternates":"2638-fe0f","name":"wheel of dharma","shortname":":wheel_of_dharma:","category":"symbols","emoji_order":"788","aliases":[],"aliases_ascii":[],"keywords":["religion","symbol"]},"star_of_david":{"unicode":"2721","unicode_alternates":"2721-fe0f","name":"star of david","shortname":":star_of_david:","category":"symbols","emoji_order":"789","aliases":[],"aliases_ascii":[],"keywords":["religion","jew","star","symbol"]},"six_pointed_star":{"unicode":"1f52f","unicode_alternates":"","name":"six pointed star with middle dot","shortname":":six_pointed_star:","category":"symbols","emoji_order":"790","aliases":[],"aliases_ascii":[],"keywords":["religion","jew","star","symbol"]},"menorah":{"unicode":"1f54e","unicode_alternates":"","name":"menorah with nine branches","shortname":":menorah:","category":"symbols","emoji_order":"791","aliases":[],"aliases_ascii":[],"keywords":["religion","object","jew","symbol","holidays"]},"yin_yang":{"unicode":"262f","unicode_alternates":"262f-fe0f","name":"yin yang","shortname":":yin_yang:","category":"symbols","emoji_order":"792","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"orthodox_cross":{"unicode":"2626","unicode_alternates":"2626-fe0f","name":"orthodox cross","shortname":":orthodox_cross:","category":"symbols","emoji_order":"793","aliases":[],"aliases_ascii":[],"keywords":["religion","symbol"]},"place_of_worship":{"unicode":"1f6d0","unicode_alternates":"","name":"place of worship","shortname":":place_of_worship:","category":"symbols","emoji_order":"794","aliases":[":worship_symbol:"],"aliases_ascii":[],"keywords":["religion","symbol","pray","pray"]},"ophiuchus":{"unicode":"26ce","unicode_alternates":"","name":"ophiuchus","shortname":":ophiuchus:","category":"symbols","emoji_order":"795","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"aries":{"unicode":"2648","unicode_alternates":"2648-fe0f","name":"aries","shortname":":aries:","category":"symbols","emoji_order":"796","aliases":[],"aliases_ascii":[],"keywords":["zodiac","symbol"]},"taurus":{"unicode":"2649","unicode_alternates":"2649-fe0f","name":"taurus","shortname":":taurus:","category":"symbols","emoji_order":"797","aliases":[],"aliases_ascii":[],"keywords":["zodiac","symbol"]},"gemini":{"unicode":"264a","unicode_alternates":"264a-fe0f","name":"gemini","shortname":":gemini:","category":"symbols","emoji_order":"798","aliases":[],"aliases_ascii":[],"keywords":["zodiac","symbol"]},"cancer":{"unicode":"264b","unicode_alternates":"264b-fe0f","name":"cancer","shortname":":cancer:","category":"symbols","emoji_order":"799","aliases":[],"aliases_ascii":[],"keywords":["zodiac","symbol"]},"leo":{"unicode":"264c","unicode_alternates":"264c-fe0f","name":"leo","shortname":":leo:","category":"symbols","emoji_order":"800","aliases":[],"aliases_ascii":[],"keywords":["zodiac","symbol"]},"virgo":{"unicode":"264d","unicode_alternates":"264d-fe0f","name":"virgo","shortname":":virgo:","category":"symbols","emoji_order":"801","aliases":[],"aliases_ascii":[],"keywords":["zodiac","symbol"]},"libra":{"unicode":"264e","unicode_alternates":"264e-fe0f","name":"libra","shortname":":libra:","category":"symbols","emoji_order":"802","aliases":[],"aliases_ascii":[],"keywords":["zodiac","symbol"]},"scorpius":{"unicode":"264f","unicode_alternates":"264f-fe0f","name":"scorpius","shortname":":scorpius:","category":"symbols","emoji_order":"803","aliases":[],"aliases_ascii":[],"keywords":["zodiac","symbol"]},"sagittarius":{"unicode":"2650","unicode_alternates":"2650-fe0f","name":"sagittarius","shortname":":sagittarius:","category":"symbols","emoji_order":"804","aliases":[],"aliases_ascii":[],"keywords":["zodiac","symbol"]},"capricorn":{"unicode":"2651","unicode_alternates":"2651-fe0f","name":"capricorn","shortname":":capricorn:","category":"symbols","emoji_order":"805","aliases":[],"aliases_ascii":[],"keywords":["zodiac","symbol"]},"aquarius":{"unicode":"2652","unicode_alternates":"2652-fe0f","name":"aquarius","shortname":":aquarius:","category":"symbols","emoji_order":"806","aliases":[],"aliases_ascii":[],"keywords":["zodiac","symbol"]},"pisces":{"unicode":"2653","unicode_alternates":"2653-fe0f","name":"pisces","shortname":":pisces:","category":"symbols","emoji_order":"807","aliases":[],"aliases_ascii":[],"keywords":["zodiac","symbol"]},"id":{"unicode":"1f194","unicode_alternates":"","name":"squared id","shortname":":id:","category":"symbols","emoji_order":"808","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"atom":{"unicode":"269b","unicode_alternates":"269b-fe0f","name":"atom symbol","shortname":":atom:","category":"symbols","emoji_order":"809","aliases":[":atom_symbol:"],"aliases_ascii":[],"keywords":["symbol","science"]},"u7a7a":{"unicode":"1f233","unicode_alternates":"","name":"squared cjk unified ideograph-7a7a","shortname":":u7a7a:","category":"symbols","emoji_order":"810","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"u5272":{"unicode":"1f239","unicode_alternates":"","name":"squared cjk unified ideograph-5272","shortname":":u5272:","category":"symbols","emoji_order":"811","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"radioactive":{"unicode":"2622","unicode_alternates":"2622-fe0f","name":"radioactive sign","shortname":":radioactive:","category":"symbols","emoji_order":"812","aliases":[":radioactive_sign:"],"aliases_ascii":[],"keywords":["symbol","science"]},"biohazard":{"unicode":"2623","unicode_alternates":"2623-fe0f","name":"biohazard sign","shortname":":biohazard:","category":"symbols","emoji_order":"813","aliases":[":biohazard_sign:"],"aliases_ascii":[],"keywords":["symbol","science"]},"mobile_phone_off":{"unicode":"1f4f4","unicode_alternates":"","name":"mobile phone off","shortname":":mobile_phone_off:","category":"symbols","emoji_order":"814","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"vibration_mode":{"unicode":"1f4f3","unicode_alternates":"","name":"vibration mode","shortname":":vibration_mode:","category":"symbols","emoji_order":"815","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"u6709":{"unicode":"1f236","unicode_alternates":"","name":"squared cjk unified ideograph-6709","shortname":":u6709:","category":"symbols","emoji_order":"816","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"u7121":{"unicode":"1f21a","unicode_alternates":"1f21a-fe0f","name":"squared cjk unified ideograph-7121","shortname":":u7121:","category":"symbols","emoji_order":"817","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"u7533":{"unicode":"1f238","unicode_alternates":"","name":"squared cjk unified ideograph-7533","shortname":":u7533:","category":"symbols","emoji_order":"818","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"u55b6":{"unicode":"1f23a","unicode_alternates":"","name":"squared cjk unified ideograph-55b6","shortname":":u55b6:","category":"symbols","emoji_order":"819","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"u6708":{"unicode":"1f237","unicode_alternates":"1f237-fe0f","name":"squared cjk unified ideograph-6708","shortname":":u6708:","category":"symbols","emoji_order":"820","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"eight_pointed_black_star":{"unicode":"2734","unicode_alternates":"2734-fe0f","name":"eight pointed black star","shortname":":eight_pointed_black_star:","category":"symbols","emoji_order":"821","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"vs":{"unicode":"1f19a","unicode_alternates":"","name":"squared vs","shortname":":vs:","category":"symbols","emoji_order":"822","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"accept":{"unicode":"1f251","unicode_alternates":"","name":"circled ideograph accept","shortname":":accept:","category":"symbols","emoji_order":"823","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"white_flower":{"unicode":"1f4ae","unicode_alternates":"","name":"white flower","shortname":":white_flower:","category":"symbols","emoji_order":"824","aliases":[],"aliases_ascii":[],"keywords":["flower","symbol"]},"ideograph_advantage":{"unicode":"1f250","unicode_alternates":"","name":"circled ideograph advantage","shortname":":ideograph_advantage:","category":"symbols","emoji_order":"825","aliases":[],"aliases_ascii":[],"keywords":["japan","symbol"]},"secret":{"unicode":"3299","unicode_alternates":"3299-fe0f","name":"circled ideograph secret","shortname":":secret:","category":"symbols","emoji_order":"826","aliases":[],"aliases_ascii":[],"keywords":["japan","symbol"]},"congratulations":{"unicode":"3297","unicode_alternates":"3297-fe0f","name":"circled ideograph congratulation","shortname":":congratulations:","category":"symbols","emoji_order":"827","aliases":[],"aliases_ascii":[],"keywords":["japan","symbol"]},"u5408":{"unicode":"1f234","unicode_alternates":"","name":"squared cjk unified ideograph-5408","shortname":":u5408:","category":"symbols","emoji_order":"828","aliases":[],"aliases_ascii":[],"keywords":["japan","symbol"]},"u6e80":{"unicode":"1f235","unicode_alternates":"","name":"squared cjk unified ideograph-6e80","shortname":":u6e80:","category":"symbols","emoji_order":"829","aliases":[],"aliases_ascii":[],"keywords":["japan","symbol"]},"u7981":{"unicode":"1f232","unicode_alternates":"","name":"squared cjk unified ideograph-7981","shortname":":u7981:","category":"symbols","emoji_order":"830","aliases":[],"aliases_ascii":[],"keywords":["japan","symbol"]},"a":{"unicode":"1f170","unicode_alternates":"","name":"negative squared latin capital letter a","shortname":":a:","category":"symbols","emoji_order":"831","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"b":{"unicode":"1f171","unicode_alternates":"","name":"negative squared latin capital letter b","shortname":":b:","category":"symbols","emoji_order":"832","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"ab":{"unicode":"1f18e","unicode_alternates":"","name":"negative squared ab","shortname":":ab:","category":"symbols","emoji_order":"833","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"cl":{"unicode":"1f191","unicode_alternates":"","name":"squared cl","shortname":":cl:","category":"symbols","emoji_order":"834","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"o2":{"unicode":"1f17e","unicode_alternates":"","name":"negative squared latin capital letter o","shortname":":o2:","category":"symbols","emoji_order":"835","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"sos":{"unicode":"1f198","unicode_alternates":"","name":"squared sos","shortname":":sos:","category":"symbols","emoji_order":"836","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"no_entry":{"unicode":"26d4","unicode_alternates":"26d4-fe0f","name":"no entry","shortname":":no_entry:","category":"symbols","emoji_order":"837","aliases":[],"aliases_ascii":[],"keywords":["symbol","circle","circle"]},"name_badge":{"unicode":"1f4db","unicode_alternates":"","name":"name badge","shortname":":name_badge:","category":"symbols","emoji_order":"838","aliases":[],"aliases_ascii":[],"keywords":["work"]},"no_entry_sign":{"unicode":"1f6ab","unicode_alternates":"","name":"no entry sign","shortname":":no_entry_sign:","category":"symbols","emoji_order":"839","aliases":[],"aliases_ascii":[],"keywords":["symbol","circle","circle"]},"x":{"unicode":"274c","unicode_alternates":"","name":"cross mark","shortname":":x:","category":"symbols","emoji_order":"840","aliases":[],"aliases_ascii":[],"keywords":["symbol","sol","sol"]},"o":{"unicode":"2b55","unicode_alternates":"2b55-fe0f","name":"heavy large circle","shortname":":o:","category":"symbols","emoji_order":"841","aliases":[],"aliases_ascii":[],"keywords":["symbol","circle","circle"]},"anger":{"unicode":"1f4a2","unicode_alternates":"","name":"anger symbol","shortname":":anger:","category":"symbols","emoji_order":"842","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"hotsprings":{"unicode":"2668","unicode_alternates":"2668-fe0f","name":"hot springs","shortname":":hotsprings:","category":"symbols","emoji_order":"843","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"no_pedestrians":{"unicode":"1f6b7","unicode_alternates":"","name":"no pedestrians","shortname":":no_pedestrians:","category":"symbols","emoji_order":"844","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"do_not_litter":{"unicode":"1f6af","unicode_alternates":"","name":"do not litter symbol","shortname":":do_not_litter:","category":"symbols","emoji_order":"845","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"no_bicycles":{"unicode":"1f6b3","unicode_alternates":"","name":"no bicycles","shortname":":no_bicycles:","category":"symbols","emoji_order":"846","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"non-potable_water":{"unicode":"1f6b1","unicode_alternates":"","name":"non-potable water symbol","shortname":":non-potable_water:","category":"symbols","emoji_order":"847","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"underage":{"unicode":"1f51e","unicode_alternates":"","name":"no one under eighteen symbol","shortname":":underage:","category":"symbols","emoji_order":"848","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"no_mobile_phones":{"unicode":"1f4f5","unicode_alternates":"","name":"no mobile phones","shortname":":no_mobile_phones:","category":"symbols","emoji_order":"849","aliases":[],"aliases_ascii":[],"keywords":["symbol","phone"]},"exclamation":{"unicode":"2757","unicode_alternates":"2757-fe0f","name":"heavy exclamation mark symbol","shortname":":exclamation:","category":"symbols","emoji_order":"850","aliases":[],"aliases_ascii":[],"keywords":["symbol","punctuation"]},"grey_exclamation":{"unicode":"2755","unicode_alternates":"","name":"white exclamation mark ornament","shortname":":grey_exclamation:","category":"symbols","emoji_order":"851","aliases":[],"aliases_ascii":[],"keywords":["symbol","punctuation"]},"question":{"unicode":"2753","unicode_alternates":"","name":"black question mark ornament","shortname":":question:","category":"symbols","emoji_order":"852","aliases":[],"aliases_ascii":[],"keywords":["symbol","punctuation","wth","wth"]},"grey_question":{"unicode":"2754","unicode_alternates":"","name":"white question mark ornament","shortname":":grey_question:","category":"symbols","emoji_order":"853","aliases":[],"aliases_ascii":[],"keywords":["symbol","punctuation"]},"bangbang":{"unicode":"203c","unicode_alternates":"203c-fe0f","name":"double exclamation mark","shortname":":bangbang:","category":"symbols","emoji_order":"854","aliases":[],"aliases_ascii":[],"keywords":["symbol","punctuation"]},"interrobang":{"unicode":"2049","unicode_alternates":"2049-fe0f","name":"exclamation question mark","shortname":":interrobang:","category":"symbols","emoji_order":"855","aliases":[],"aliases_ascii":[],"keywords":["symbol","punctuation"]},"100":{"unicode":"1f4af","unicode_alternates":"","name":"hundred points symbol","shortname":":100:","category":"symbols","emoji_order":"856","aliases":[],"aliases_ascii":[],"keywords":["symbol","wow","wow","win","win","perfect","perfect","parties","parties"]},"low_brightness":{"unicode":"1f505","unicode_alternates":"","name":"low brightness symbol","shortname":":low_brightness:","category":"symbols","emoji_order":"857","aliases":[],"aliases_ascii":[],"keywords":["symbol","sun"]},"high_brightness":{"unicode":"1f506","unicode_alternates":"","name":"high brightness symbol","shortname":":high_brightness:","category":"symbols","emoji_order":"858","aliases":[],"aliases_ascii":[],"keywords":["symbol","sun"]},"trident":{"unicode":"1f531","unicode_alternates":"","name":"trident emblem","shortname":":trident:","category":"symbols","emoji_order":"859","aliases":[],"aliases_ascii":[],"keywords":["object","symbol"]},"fleur-de-lis":{"unicode":"269c","unicode_alternates":"269c-fe0f","name":"fleur-de-lis","shortname":":fleur-de-lis:","category":"symbols","emoji_order":"860","aliases":[],"aliases_ascii":[],"keywords":["object","symbol"]},"part_alternation_mark":{"unicode":"303d","unicode_alternates":"303d-fe0f","name":"part alternation mark","shortname":":part_alternation_mark:","category":"symbols","emoji_order":"861","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"warning":{"unicode":"26a0","unicode_alternates":"26a0-fe0f","name":"warning sign","shortname":":warning:","category":"symbols","emoji_order":"862","aliases":[],"aliases_ascii":[],"keywords":["symbol","punctuation"]},"children_crossing":{"unicode":"1f6b8","unicode_alternates":"","name":"children crossing","shortname":":children_crossing:","category":"symbols","emoji_order":"863","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"beginner":{"unicode":"1f530","unicode_alternates":"","name":"japanese symbol for beginner","shortname":":beginner:","category":"symbols","emoji_order":"864","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"recycle":{"unicode":"267b","unicode_alternates":"267b-fe0f","name":"black universal recycling symbol","shortname":":recycle:","category":"symbols","emoji_order":"865","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"u6307":{"unicode":"1f22f","unicode_alternates":"1f22f-fe0f","name":"squared cjk unified ideograph-6307","shortname":":u6307:","category":"symbols","emoji_order":"866","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"chart":{"unicode":"1f4b9","unicode_alternates":"","name":"chart with upwards trend and yen sign","shortname":":chart:","category":"symbols","emoji_order":"867","aliases":[],"aliases_ascii":[],"keywords":["symbol","money","money"]},"sparkle":{"unicode":"2747","unicode_alternates":"2747-fe0f","name":"sparkle","shortname":":sparkle:","category":"symbols","emoji_order":"868","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"eight_spoked_asterisk":{"unicode":"2733","unicode_alternates":"2733-fe0f","name":"eight spoked asterisk","shortname":":eight_spoked_asterisk:","category":"symbols","emoji_order":"869","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"negative_squared_cross_mark":{"unicode":"274e","unicode_alternates":"","name":"negative squared cross mark","shortname":":negative_squared_cross_mark:","category":"symbols","emoji_order":"870","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"white_check_mark":{"unicode":"2705","unicode_alternates":"","name":"white heavy check mark","shortname":":white_check_mark:","category":"symbols","emoji_order":"871","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"diamond_shape_with_a_dot_inside":{"unicode":"1f4a0","unicode_alternates":"","name":"diamond shape with a dot inside","shortname":":diamond_shape_with_a_dot_inside:","category":"symbols","emoji_order":"872","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"cyclone":{"unicode":"1f300","unicode_alternates":"","name":"cyclone","shortname":":cyclone:","category":"symbols","emoji_order":"873","aliases":[],"aliases_ascii":[],"keywords":["symbol","drugs","drugs"]},"loop":{"unicode":"27bf","unicode_alternates":"","name":"double curly loop","shortname":":loop:","category":"symbols","emoji_order":"874","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"globe_with_meridians":{"unicode":"1f310","unicode_alternates":"","name":"globe with meridians","shortname":":globe_with_meridians:","category":"symbols","emoji_order":"875","aliases":[],"aliases_ascii":[],"keywords":["symbol","globe","globe"]},"m":{"unicode":"24c2","unicode_alternates":"24c2-fe0f","name":"circled latin capital letter m","shortname":":m:","category":"symbols","emoji_order":"876","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"atm":{"unicode":"1f3e7","unicode_alternates":"","name":"automated teller machine","shortname":":atm:","category":"symbols","emoji_order":"877","aliases":[],"aliases_ascii":[],"keywords":["electronics","symbol","money","money"]},"sa":{"unicode":"1f202","unicode_alternates":"1f202-fe0f","name":"squared katakana sa","shortname":":sa:","category":"symbols","emoji_order":"878","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"passport_control":{"unicode":"1f6c2","unicode_alternates":"","name":"passport control","shortname":":passport_control:","category":"symbols","emoji_order":"879","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"customs":{"unicode":"1f6c3","unicode_alternates":"","name":"customs","shortname":":customs:","category":"symbols","emoji_order":"880","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"baggage_claim":{"unicode":"1f6c4","unicode_alternates":"","name":"baggage claim","shortname":":baggage_claim:","category":"symbols","emoji_order":"881","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"left_luggage":{"unicode":"1f6c5","unicode_alternates":"","name":"left luggage","shortname":":left_luggage:","category":"symbols","emoji_order":"882","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"wheelchair":{"unicode":"267f","unicode_alternates":"267f-fe0f","name":"wheelchair symbol","shortname":":wheelchair:","category":"symbols","emoji_order":"883","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"no_smoking":{"unicode":"1f6ad","unicode_alternates":"","name":"no smoking symbol","shortname":":no_smoking:","category":"symbols","emoji_order":"884","aliases":[],"aliases_ascii":[],"keywords":["symbol","smoking","smoking"]},"wc":{"unicode":"1f6be","unicode_alternates":"","name":"water closet","shortname":":wc:","category":"symbols","emoji_order":"885","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"parking":{"unicode":"1f17f","unicode_alternates":"1f17f-fe0f","name":"negative squared latin capital letter p","shortname":":parking:","category":"symbols","emoji_order":"886","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"potable_water":{"unicode":"1f6b0","unicode_alternates":"","name":"potable water symbol","shortname":":potable_water:","category":"symbols","emoji_order":"887","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"mens":{"unicode":"1f6b9","unicode_alternates":"","name":"mens symbol","shortname":":mens:","category":"symbols","emoji_order":"888","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"womens":{"unicode":"1f6ba","unicode_alternates":"","name":"womens symbol","shortname":":womens:","category":"symbols","emoji_order":"889","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"baby_symbol":{"unicode":"1f6bc","unicode_alternates":"","name":"baby symbol","shortname":":baby_symbol:","category":"symbols","emoji_order":"890","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"restroom":{"unicode":"1f6bb","unicode_alternates":"","name":"restroom","shortname":":restroom:","category":"symbols","emoji_order":"891","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"put_litter_in_its_place":{"unicode":"1f6ae","unicode_alternates":"","name":"put litter in its place symbol","shortname":":put_litter_in_its_place:","category":"symbols","emoji_order":"892","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"cinema":{"unicode":"1f3a6","unicode_alternates":"","name":"cinema","shortname":":cinema:","category":"symbols","emoji_order":"893","aliases":[],"aliases_ascii":[],"keywords":["symbol","camera","movie"]},"signal_strength":{"unicode":"1f4f6","unicode_alternates":"","name":"antenna with bars","shortname":":signal_strength:","category":"symbols","emoji_order":"894","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"koko":{"unicode":"1f201","unicode_alternates":"","name":"squared katakana koko","shortname":":koko:","category":"symbols","emoji_order":"895","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"ng":{"unicode":"1f196","unicode_alternates":"","name":"squared ng","shortname":":ng:","category":"symbols","emoji_order":"896","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"ok":{"unicode":"1f197","unicode_alternates":"","name":"squared ok","shortname":":ok:","category":"symbols","emoji_order":"897","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"up":{"unicode":"1f199","unicode_alternates":"","name":"squared up with exclamation mark","shortname":":up:","category":"symbols","emoji_order":"898","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"cool":{"unicode":"1f192","unicode_alternates":"","name":"squared cool","shortname":":cool:","category":"symbols","emoji_order":"899","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"new":{"unicode":"1f195","unicode_alternates":"","name":"squared new","shortname":":new:","category":"symbols","emoji_order":"900","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"free":{"unicode":"1f193","unicode_alternates":"","name":"squared free","shortname":":free:","category":"symbols","emoji_order":"901","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"zero":{"unicode":"0030-20e3","unicode_alternates":"0030-fe0f-20e3","name":"keycap digit zero","shortname":":zero:","category":"symbols","emoji_order":"902","aliases":[],"aliases_ascii":[],"keywords":["number","math","symbol"]},"one":{"unicode":"0031-20e3","unicode_alternates":"0031-fe0f-20e3","name":"keycap digit one","shortname":":one:","category":"symbols","emoji_order":"903","aliases":[],"aliases_ascii":[],"keywords":["number","math","symbol"]},"two":{"unicode":"0032-20e3","unicode_alternates":"0032-fe0f-20e3","name":"keycap digit two","shortname":":two:","category":"symbols","emoji_order":"904","aliases":[],"aliases_ascii":[],"keywords":["number","math","symbol"]},"three":{"unicode":"0033-20e3","unicode_alternates":"0033-fe0f-20e3","name":"keycap digit three","shortname":":three:","category":"symbols","emoji_order":"905","aliases":[],"aliases_ascii":[],"keywords":["number","math","symbol"]},"four":{"unicode":"0034-20e3","unicode_alternates":"0034-fe0f-20e3","name":"keycap digit four","shortname":":four:","category":"symbols","emoji_order":"906","aliases":[],"aliases_ascii":[],"keywords":["number","math","symbol"]},"five":{"unicode":"0035-20e3","unicode_alternates":"0035-fe0f-20e3","name":"keycap digit five","shortname":":five:","category":"symbols","emoji_order":"907","aliases":[],"aliases_ascii":[],"keywords":["number","math","symbol"]},"six":{"unicode":"0036-20e3","unicode_alternates":"0036-fe0f-20e3","name":"keycap digit six","shortname":":six:","category":"symbols","emoji_order":"908","aliases":[],"aliases_ascii":[],"keywords":["number","math","symbol"]},"seven":{"unicode":"0037-20e3","unicode_alternates":"0037-fe0f-20e3","name":"keycap digit seven","shortname":":seven:","category":"symbols","emoji_order":"909","aliases":[],"aliases_ascii":[],"keywords":["number","math","symbol"]},"eight":{"unicode":"0038-20e3","unicode_alternates":"0038-fe0f-20e3","name":"keycap digit eight","shortname":":eight:","category":"symbols","emoji_order":"910","aliases":[],"aliases_ascii":[],"keywords":["number","math","symbol"]},"nine":{"unicode":"0039-20e3","unicode_alternates":"0039-fe0f-20e3","name":"keycap digit nine","shortname":":nine:","category":"symbols","emoji_order":"911","aliases":[],"aliases_ascii":[],"keywords":["number","math","symbol"]},"ten":{"unicode":"1f51f","unicode_alternates":"","name":"keycap ten","shortname":":ten:","category":"symbols","emoji_order":"912","aliases":[],"aliases_ascii":[],"keywords":["number","math","symbol"]},"1234":{"unicode":"1f522","unicode_alternates":"","name":"input symbol for numbers","shortname":":1234:","category":"symbols","emoji_order":"913","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"arrow_forward":{"unicode":"25b6","unicode_alternates":"25b6-fe0f","name":"black right-pointing triangle","shortname":":arrow_forward:","category":"symbols","emoji_order":"914","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol","triangle","triangle"]},"pause_button":{"unicode":"23f8","unicode_alternates":"23f8-fe0f","name":"double vertical bar","shortname":":pause_button:","category":"symbols","emoji_order":"915","aliases":[":double_vertical_bar:"],"aliases_ascii":[],"keywords":["symbol"]},"play_pause":{"unicode":"23ef","unicode_alternates":"23ef-fe0f","name":"black right-pointing double triangle with double vertical bar","shortname":":play_pause:","category":"symbols","emoji_order":"916","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"stop_button":{"unicode":"23f9","unicode_alternates":"23f9-fe0f","name":"black square for stop","shortname":":stop_button:","category":"symbols","emoji_order":"917","aliases":[],"aliases_ascii":[],"keywords":["symbol","square","square"]},"record_button":{"unicode":"23fa","unicode_alternates":"23fa-fe0f","name":"black circle for record","shortname":":record_button:","category":"symbols","emoji_order":"918","aliases":[],"aliases_ascii":[],"keywords":["symbol","circle","circle"]},"track_next":{"unicode":"23ed","unicode_alternates":"23ed-fe0f","name":"black right-pointing double triangle with vertical bar","shortname":":track_next:","category":"symbols","emoji_order":"919","aliases":[":next_track:"],"aliases_ascii":[],"keywords":["arrow","symbol"]},"track_previous":{"unicode":"23ee","unicode_alternates":"23ee-fe0f","name":"black left-pointing double triangle with vertical bar","shortname":":track_previous:","category":"symbols","emoji_order":"920","aliases":[":previous_track:"],"aliases_ascii":[],"keywords":["arrow","symbol"]},"fast_forward":{"unicode":"23e9","unicode_alternates":"","name":"black right-pointing double triangle","shortname":":fast_forward:","category":"symbols","emoji_order":"921","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"rewind":{"unicode":"23ea","unicode_alternates":"","name":"black left-pointing double triangle","shortname":":rewind:","category":"symbols","emoji_order":"922","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"twisted_rightwards_arrows":{"unicode":"1f500","unicode_alternates":"","name":"twisted rightwards arrows","shortname":":twisted_rightwards_arrows:","category":"symbols","emoji_order":"923","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"repeat":{"unicode":"1f501","unicode_alternates":"","name":"clockwise rightwards and leftwards open circle arrows","shortname":":repeat:","category":"symbols","emoji_order":"924","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"repeat_one":{"unicode":"1f502","unicode_alternates":"","name":"clockwise rightwards and leftwards open circle arrows with circled one overlay","shortname":":repeat_one:","category":"symbols","emoji_order":"925","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"arrow_backward":{"unicode":"25c0","unicode_alternates":"25c0-fe0f","name":"black left-pointing triangle","shortname":":arrow_backward:","category":"symbols","emoji_order":"926","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol","triangle","triangle"]},"arrow_up_small":{"unicode":"1f53c","unicode_alternates":"","name":"up-pointing small red triangle","shortname":":arrow_up_small:","category":"symbols","emoji_order":"927","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol","triangle","triangle"]},"arrow_down_small":{"unicode":"1f53d","unicode_alternates":"","name":"down-pointing small red triangle","shortname":":arrow_down_small:","category":"symbols","emoji_order":"928","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol","triangle","triangle"]},"arrow_double_up":{"unicode":"23eb","unicode_alternates":"","name":"black up-pointing double triangle","shortname":":arrow_double_up:","category":"symbols","emoji_order":"929","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"arrow_double_down":{"unicode":"23ec","unicode_alternates":"","name":"black down-pointing double triangle","shortname":":arrow_double_down:","category":"symbols","emoji_order":"930","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"arrow_right":{"unicode":"27a1","unicode_alternates":"27a1-fe0f","name":"black rightwards arrow","shortname":":arrow_right:","category":"symbols","emoji_order":"931","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"arrow_left":{"unicode":"2b05","unicode_alternates":"2b05-fe0f","name":"leftwards black arrow","shortname":":arrow_left:","category":"symbols","emoji_order":"932","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"arrow_up":{"unicode":"2b06","unicode_alternates":"2b06-fe0f","name":"upwards black arrow","shortname":":arrow_up:","category":"symbols","emoji_order":"933","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"arrow_down":{"unicode":"2b07","unicode_alternates":"2b07-fe0f","name":"downwards black arrow","shortname":":arrow_down:","category":"symbols","emoji_order":"934","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"arrow_upper_right":{"unicode":"2197","unicode_alternates":"2197-fe0f","name":"north east arrow","shortname":":arrow_upper_right:","category":"symbols","emoji_order":"935","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"arrow_lower_right":{"unicode":"2198","unicode_alternates":"2198-fe0f","name":"south east arrow","shortname":":arrow_lower_right:","category":"symbols","emoji_order":"936","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"arrow_lower_left":{"unicode":"2199","unicode_alternates":"2199-fe0f","name":"south west arrow","shortname":":arrow_lower_left:","category":"symbols","emoji_order":"937","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"arrow_upper_left":{"unicode":"2196","unicode_alternates":"2196-fe0f","name":"north west arrow","shortname":":arrow_upper_left:","category":"symbols","emoji_order":"938","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"arrow_up_down":{"unicode":"2195","unicode_alternates":"2195-fe0f","name":"up down arrow","shortname":":arrow_up_down:","category":"symbols","emoji_order":"939","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"left_right_arrow":{"unicode":"2194","unicode_alternates":"2194-fe0f","name":"left right arrow","shortname":":left_right_arrow:","category":"symbols","emoji_order":"940","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"arrows_counterclockwise":{"unicode":"1f504","unicode_alternates":"","name":"anticlockwise downwards and upwards open circle arrows","shortname":":arrows_counterclockwise:","category":"symbols","emoji_order":"941","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"arrow_right_hook":{"unicode":"21aa","unicode_alternates":"21aa-fe0f","name":"rightwards arrow with hook","shortname":":arrow_right_hook:","category":"symbols","emoji_order":"942","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"leftwards_arrow_with_hook":{"unicode":"21a9","unicode_alternates":"21a9-fe0f","name":"leftwards arrow with hook","shortname":":leftwards_arrow_with_hook:","category":"symbols","emoji_order":"943","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"arrow_heading_up":{"unicode":"2934","unicode_alternates":"2934-fe0f","name":"arrow pointing rightwards then curving upwards","shortname":":arrow_heading_up:","category":"symbols","emoji_order":"944","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"arrow_heading_down":{"unicode":"2935","unicode_alternates":"2935-fe0f","name":"arrow pointing rightwards then curving downwards","shortname":":arrow_heading_down:","category":"symbols","emoji_order":"945","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"hash":{"unicode":"0023-20e3","unicode_alternates":"0023-fe0f-20e3","name":"keycap number sign","shortname":":hash:","category":"symbols","emoji_order":"946","aliases":[],"aliases_ascii":[],"keywords":["number","symbol"]},"asterisk":{"unicode":"002a-20e3","unicode_alternates":"002a-fe0f-20e3","name":"keycap asterisk","shortname":":asterisk:","category":"symbols","emoji_order":"947","aliases":[":keycap_asterisk:"],"aliases_ascii":[],"keywords":["symbol"]},"information_source":{"unicode":"2139","unicode_alternates":"2139-fe0f","name":"information source","shortname":":information_source:","category":"symbols","emoji_order":"948","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"abc":{"unicode":"1f524","unicode_alternates":"","name":"input symbol for latin letters","shortname":":abc:","category":"symbols","emoji_order":"949","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"abcd":{"unicode":"1f521","unicode_alternates":"","name":"input symbol for latin small letters","shortname":":abcd:","category":"symbols","emoji_order":"950","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"capital_abcd":{"unicode":"1f520","unicode_alternates":"","name":"input symbol for latin capital letters","shortname":":capital_abcd:","category":"symbols","emoji_order":"951","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"symbols":{"unicode":"1f523","unicode_alternates":"","name":"input symbol for symbols","shortname":":symbols:","category":"symbols","emoji_order":"952","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"musical_note":{"unicode":"1f3b5","unicode_alternates":"","name":"musical note","shortname":":musical_note:","category":"symbols","emoji_order":"953","aliases":[],"aliases_ascii":[],"keywords":["instruments","symbol"]},"notes":{"unicode":"1f3b6","unicode_alternates":"","name":"multiple musical notes","shortname":":notes:","category":"symbols","emoji_order":"954","aliases":[],"aliases_ascii":[],"keywords":["instruments","symbol"]},"wavy_dash":{"unicode":"3030","unicode_alternates":"3030-fe0f","name":"wavy dash","shortname":":wavy_dash:","category":"symbols","emoji_order":"955","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"curly_loop":{"unicode":"27b0","unicode_alternates":"","name":"curly loop","shortname":":curly_loop:","category":"symbols","emoji_order":"956","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"heavy_check_mark":{"unicode":"2714","unicode_alternates":"2714-fe0f","name":"heavy check mark","shortname":":heavy_check_mark:","category":"symbols","emoji_order":"957","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"arrows_clockwise":{"unicode":"1f503","unicode_alternates":"","name":"clockwise downwards and upwards open circle arrows","shortname":":arrows_clockwise:","category":"symbols","emoji_order":"958","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"heavy_plus_sign":{"unicode":"2795","unicode_alternates":"","name":"heavy plus sign","shortname":":heavy_plus_sign:","category":"symbols","emoji_order":"959","aliases":[],"aliases_ascii":[],"keywords":["math","symbol"]},"heavy_minus_sign":{"unicode":"2796","unicode_alternates":"","name":"heavy minus sign","shortname":":heavy_minus_sign:","category":"symbols","emoji_order":"960","aliases":[],"aliases_ascii":[],"keywords":["math","symbol"]},"heavy_division_sign":{"unicode":"2797","unicode_alternates":"","name":"heavy division sign","shortname":":heavy_division_sign:","category":"symbols","emoji_order":"961","aliases":[],"aliases_ascii":[],"keywords":["math","symbol"]},"heavy_multiplication_x":{"unicode":"2716","unicode_alternates":"2716-fe0f","name":"heavy multiplication x","shortname":":heavy_multiplication_x:","category":"symbols","emoji_order":"962","aliases":[],"aliases_ascii":[],"keywords":["math","symbol"]},"heavy_dollar_sign":{"unicode":"1f4b2","unicode_alternates":"","name":"heavy dollar sign","shortname":":heavy_dollar_sign:","category":"symbols","emoji_order":"963","aliases":[],"aliases_ascii":[],"keywords":["math","symbol","money","money"]},"currency_exchange":{"unicode":"1f4b1","unicode_alternates":"","name":"currency exchange","shortname":":currency_exchange:","category":"symbols","emoji_order":"964","aliases":[],"aliases_ascii":[],"keywords":["symbol","money","money"]},"copyright":{"unicode":"00a9","unicode_alternates":"00a9-fe0f","name":"copyright sign","shortname":":copyright:","category":"symbols","emoji_order":"965","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"registered":{"unicode":"00ae","unicode_alternates":"00ae-fe0f","name":"registered sign","shortname":":registered:","category":"symbols","emoji_order":"966","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"tm":{"unicode":"2122","unicode_alternates":"2122-fe0f","name":"trade mark sign","shortname":":tm:","category":"symbols","emoji_order":"967","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"end":{"unicode":"1f51a","unicode_alternates":"","name":"end with leftwards arrow above","shortname":":end:","category":"symbols","emoji_order":"968","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"back":{"unicode":"1f519","unicode_alternates":"","name":"back with leftwards arrow above","shortname":":back:","category":"symbols","emoji_order":"969","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"on":{"unicode":"1f51b","unicode_alternates":"","name":"on with exclamation mark with left right arrow abo","shortname":":on:","category":"symbols","emoji_order":"970","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"top":{"unicode":"1f51d","unicode_alternates":"","name":"top with upwards arrow above","shortname":":top:","category":"symbols","emoji_order":"971","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"soon":{"unicode":"1f51c","unicode_alternates":"","name":"soon with rightwards arrow above","shortname":":soon:","category":"symbols","emoji_order":"972","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"ballot_box_with_check":{"unicode":"2611","unicode_alternates":"2611-fe0f","name":"ballot box with check","shortname":":ballot_box_with_check:","category":"symbols","emoji_order":"973","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"radio_button":{"unicode":"1f518","unicode_alternates":"","name":"radio button","shortname":":radio_button:","category":"symbols","emoji_order":"974","aliases":[],"aliases_ascii":[],"keywords":["symbol","circle","circle"]},"white_circle":{"unicode":"26aa","unicode_alternates":"26aa-fe0f","name":"medium white circle","shortname":":white_circle:","category":"symbols","emoji_order":"975","aliases":[],"aliases_ascii":[],"keywords":["shapes","symbol","circle","circle"]},"black_circle":{"unicode":"26ab","unicode_alternates":"26ab-fe0f","name":"medium black circle","shortname":":black_circle:","category":"symbols","emoji_order":"976","aliases":[],"aliases_ascii":[],"keywords":["shapes","symbol","circle","circle"]},"red_circle":{"unicode":"1f534","unicode_alternates":"","name":"large red circle","shortname":":red_circle:","category":"symbols","emoji_order":"977","aliases":[],"aliases_ascii":[],"keywords":["shapes","symbol","circle","circle"]},"large_blue_circle":{"unicode":"1f535","unicode_alternates":"","name":"large blue circle","shortname":":large_blue_circle:","category":"symbols","emoji_order":"978","aliases":[],"aliases_ascii":[],"keywords":["shapes","symbol","circle","circle"]},"small_orange_diamond":{"unicode":"1f538","unicode_alternates":"","name":"small orange diamond","shortname":":small_orange_diamond:","category":"symbols","emoji_order":"979","aliases":[],"aliases_ascii":[],"keywords":["shapes","symbol"]},"small_blue_diamond":{"unicode":"1f539","unicode_alternates":"","name":"small blue diamond","shortname":":small_blue_diamond:","category":"symbols","emoji_order":"980","aliases":[],"aliases_ascii":[],"keywords":["shapes","symbol"]},"large_orange_diamond":{"unicode":"1f536","unicode_alternates":"","name":"large orange diamond","shortname":":large_orange_diamond:","category":"symbols","emoji_order":"981","aliases":[],"aliases_ascii":[],"keywords":["shapes","symbol"]},"large_blue_diamond":{"unicode":"1f537","unicode_alternates":"","name":"large blue diamond","shortname":":large_blue_diamond:","category":"symbols","emoji_order":"982","aliases":[],"aliases_ascii":[],"keywords":["shapes","symbol"]},"small_red_triangle":{"unicode":"1f53a","unicode_alternates":"","name":"up-pointing red triangle","shortname":":small_red_triangle:","category":"symbols","emoji_order":"983","aliases":[],"aliases_ascii":[],"keywords":["shapes","symbol","triangle","triangle"]},"black_small_square":{"unicode":"25aa","unicode_alternates":"25aa-fe0f","name":"black small square","shortname":":black_small_square:","category":"symbols","emoji_order":"984","aliases":[],"aliases_ascii":[],"keywords":["shapes","symbol","square","square"]},"white_small_square":{"unicode":"25ab","unicode_alternates":"25ab-fe0f","name":"white small square","shortname":":white_small_square:","category":"symbols","emoji_order":"985","aliases":[],"aliases_ascii":[],"keywords":["shapes","symbol","square","square"]},"black_large_square":{"unicode":"2b1b","unicode_alternates":"2b1b-fe0f","name":"black large square","shortname":":black_large_square:","category":"symbols","emoji_order":"986","aliases":[],"aliases_ascii":[],"keywords":["shapes","symbol","square","square"]},"white_large_square":{"unicode":"2b1c","unicode_alternates":"2b1c-fe0f","name":"white large square","shortname":":white_large_square:","category":"symbols","emoji_order":"987","aliases":[],"aliases_ascii":[],"keywords":["shapes","symbol","square","square"]},"small_red_triangle_down":{"unicode":"1f53b","unicode_alternates":"","name":"down-pointing red triangle","shortname":":small_red_triangle_down:","category":"symbols","emoji_order":"988","aliases":[],"aliases_ascii":[],"keywords":["shapes","symbol","triangle","triangle"]},"black_medium_square":{"unicode":"25fc","unicode_alternates":"25fc-fe0f","name":"black medium square","shortname":":black_medium_square:","category":"symbols","emoji_order":"989","aliases":[],"aliases_ascii":[],"keywords":["shapes","symbol","square","square"]},"white_medium_square":{"unicode":"25fb","unicode_alternates":"25fb-fe0f","name":"white medium square","shortname":":white_medium_square:","category":"symbols","emoji_order":"990","aliases":[],"aliases_ascii":[],"keywords":["shapes","symbol","square","square"]},"black_medium_small_square":{"unicode":"25fe","unicode_alternates":"25fe-fe0f","name":"black medium small square","shortname":":black_medium_small_square:","category":"symbols","emoji_order":"991","aliases":[],"aliases_ascii":[],"keywords":["shapes","symbol","square","square"]},"white_medium_small_square":{"unicode":"25fd","unicode_alternates":"25fd-fe0f","name":"white medium small square","shortname":":white_medium_small_square:","category":"symbols","emoji_order":"992","aliases":[],"aliases_ascii":[],"keywords":["shapes","symbol","square","square"]},"black_square_button":{"unicode":"1f532","unicode_alternates":"","name":"black square button","shortname":":black_square_button:","category":"symbols","emoji_order":"993","aliases":[],"aliases_ascii":[],"keywords":["shapes","symbol","square","square"]},"white_square_button":{"unicode":"1f533","unicode_alternates":"","name":"white square button","shortname":":white_square_button:","category":"symbols","emoji_order":"994","aliases":[],"aliases_ascii":[],"keywords":["shapes","symbol","square","square"]},"speaker":{"unicode":"1f508","unicode_alternates":"","name":"speaker","shortname":":speaker:","category":"symbols","emoji_order":"995","aliases":[],"aliases_ascii":[],"keywords":["alarm","symbol"]},"sound":{"unicode":"1f509","unicode_alternates":"","name":"speaker with one sound wave","shortname":":sound:","category":"symbols","emoji_order":"996","aliases":[],"aliases_ascii":[],"keywords":["alarm","symbol"]},"loud_sound":{"unicode":"1f50a","unicode_alternates":"","name":"speaker with three sound waves","shortname":":loud_sound:","category":"symbols","emoji_order":"997","aliases":[],"aliases_ascii":[],"keywords":["alarm","symbol"]},"mute":{"unicode":"1f507","unicode_alternates":"","name":"speaker with cancellation stroke","shortname":":mute:","category":"symbols","emoji_order":"998","aliases":[],"aliases_ascii":[],"keywords":["alarm","symbol"]},"mega":{"unicode":"1f4e3","unicode_alternates":"","name":"cheering megaphone","shortname":":mega:","category":"symbols","emoji_order":"999","aliases":[],"aliases_ascii":[],"keywords":["object","sport"]},"loudspeaker":{"unicode":"1f4e2","unicode_alternates":"","name":"public address loudspeaker","shortname":":loudspeaker:","category":"symbols","emoji_order":"1000","aliases":[],"aliases_ascii":[],"keywords":["object","alarm","symbol"]},"bell":{"unicode":"1f514","unicode_alternates":"","name":"bell","shortname":":bell:","category":"symbols","emoji_order":"1001","aliases":[],"aliases_ascii":[],"keywords":["object","alarm","symbol"]},"no_bell":{"unicode":"1f515","unicode_alternates":"","name":"bell with cancellation stroke","shortname":":no_bell:","category":"symbols","emoji_order":"1002","aliases":[],"aliases_ascii":[],"keywords":["alarm","symbol"]},"black_joker":{"unicode":"1f0cf","unicode_alternates":"","name":"playing card black joker","shortname":":black_joker:","category":"symbols","emoji_order":"1003","aliases":[],"aliases_ascii":[],"keywords":["object","symbol","game"]},"mahjong":{"unicode":"1f004","unicode_alternates":"1f004-fe0f","name":"mahjong tile red dragon","shortname":":mahjong:","category":"symbols","emoji_order":"1004","aliases":[],"aliases_ascii":[],"keywords":["object","symbol","game"]},"spades":{"unicode":"2660","unicode_alternates":"2660-fe0f","name":"black spade suit","shortname":":spades:","category":"symbols","emoji_order":"1005","aliases":[],"aliases_ascii":[],"keywords":["symbol","game"]},"clubs":{"unicode":"2663","unicode_alternates":"2663-fe0f","name":"black club suit","shortname":":clubs:","category":"symbols","emoji_order":"1006","aliases":[],"aliases_ascii":[],"keywords":["symbol","game"]},"hearts":{"unicode":"2665","unicode_alternates":"2665-fe0f","name":"black heart suit","shortname":":hearts:","category":"symbols","emoji_order":"1007","aliases":[],"aliases_ascii":[],"keywords":["love","symbol","game"]},"diamonds":{"unicode":"2666","unicode_alternates":"2666-fe0f","name":"black diamond suit","shortname":":diamonds:","category":"symbols","emoji_order":"1008","aliases":[],"aliases_ascii":[],"keywords":["shapes","symbol","game"]},"flower_playing_cards":{"unicode":"1f3b4","unicode_alternates":"","name":"flower playing cards","shortname":":flower_playing_cards:","category":"symbols","emoji_order":"1009","aliases":[],"aliases_ascii":[],"keywords":["object","symbol"]},"thought_balloon":{"unicode":"1f4ad","unicode_alternates":"","name":"thought balloon","shortname":":thought_balloon:","category":"symbols","emoji_order":"1010","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"anger_right":{"unicode":"1f5ef","unicode_alternates":"1f5ef-fe0f","name":"right anger bubble","shortname":":anger_right:","category":"symbols","emoji_order":"1011","aliases":[":right_anger_bubble:"],"aliases_ascii":[],"keywords":["symbol"]},"speech_balloon":{"unicode":"1f4ac","unicode_alternates":"","name":"speech balloon","shortname":":speech_balloon:","category":"symbols","emoji_order":"1012","aliases":[],"aliases_ascii":[],"keywords":["symbol","free speech","free speech"]},"clock1":{"unicode":"1f550","unicode_alternates":"","name":"clock face one oclock","shortname":":clock1:","category":"symbols","emoji_order":"1013","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock2":{"unicode":"1f551","unicode_alternates":"","name":"clock face two oclock","shortname":":clock2:","category":"symbols","emoji_order":"1014","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock3":{"unicode":"1f552","unicode_alternates":"","name":"clock face three oclock","shortname":":clock3:","category":"symbols","emoji_order":"1015","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock4":{"unicode":"1f553","unicode_alternates":"","name":"clock face four oclock","shortname":":clock4:","category":"symbols","emoji_order":"1016","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock5":{"unicode":"1f554","unicode_alternates":"","name":"clock face five oclock","shortname":":clock5:","category":"symbols","emoji_order":"1017","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock6":{"unicode":"1f555","unicode_alternates":"","name":"clock face six oclock","shortname":":clock6:","category":"symbols","emoji_order":"1018","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock7":{"unicode":"1f556","unicode_alternates":"","name":"clock face seven oclock","shortname":":clock7:","category":"symbols","emoji_order":"1019","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock8":{"unicode":"1f557","unicode_alternates":"","name":"clock face eight oclock","shortname":":clock8:","category":"symbols","emoji_order":"1020","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock9":{"unicode":"1f558","unicode_alternates":"","name":"clock face nine oclock","shortname":":clock9:","category":"symbols","emoji_order":"1021","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock10":{"unicode":"1f559","unicode_alternates":"","name":"clock face ten oclock","shortname":":clock10:","category":"symbols","emoji_order":"1022","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock11":{"unicode":"1f55a","unicode_alternates":"","name":"clock face eleven oclock","shortname":":clock11:","category":"symbols","emoji_order":"1023","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock12":{"unicode":"1f55b","unicode_alternates":"","name":"clock face twelve oclock","shortname":":clock12:","category":"symbols","emoji_order":"1024","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock130":{"unicode":"1f55c","unicode_alternates":"","name":"clock face one-thirty","shortname":":clock130:","category":"symbols","emoji_order":"1025","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock230":{"unicode":"1f55d","unicode_alternates":"","name":"clock face two-thirty","shortname":":clock230:","category":"symbols","emoji_order":"1026","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock330":{"unicode":"1f55e","unicode_alternates":"","name":"clock face three-thirty","shortname":":clock330:","category":"symbols","emoji_order":"1027","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock430":{"unicode":"1f55f","unicode_alternates":"","name":"clock face four-thirty","shortname":":clock430:","category":"symbols","emoji_order":"1028","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock530":{"unicode":"1f560","unicode_alternates":"","name":"clock face five-thirty","shortname":":clock530:","category":"symbols","emoji_order":"1029","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock630":{"unicode":"1f561","unicode_alternates":"","name":"clock face six-thirty","shortname":":clock630:","category":"symbols","emoji_order":"1030","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock730":{"unicode":"1f562","unicode_alternates":"","name":"clock face seven-thirty","shortname":":clock730:","category":"symbols","emoji_order":"1031","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock830":{"unicode":"1f563","unicode_alternates":"","name":"clock face eight-thirty","shortname":":clock830:","category":"symbols","emoji_order":"1032","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock930":{"unicode":"1f564","unicode_alternates":"","name":"clock face nine-thirty","shortname":":clock930:","category":"symbols","emoji_order":"1033","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock1030":{"unicode":"1f565","unicode_alternates":"","name":"clock face ten-thirty","shortname":":clock1030:","category":"symbols","emoji_order":"1034","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock1130":{"unicode":"1f566","unicode_alternates":"","name":"clock face eleven-thirty","shortname":":clock1130:","category":"symbols","emoji_order":"1035","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock1230":{"unicode":"1f567","unicode_alternates":"","name":"clock face twelve-thirty","shortname":":clock1230:","category":"symbols","emoji_order":"1036","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"eye_in_speech_bubble":{"unicode":"1f441-1f5e8","unicode_alternates":"1f441-200d-1f5e8","name":"eye in speech bubble","shortname":":eye_in_speech_bubble:","category":"symbols","emoji_order":"1037","aliases":[],"aliases_ascii":[],"keywords":["object","symbol","eyes","talk"]},"flag_ac":{"unicode":"1f1e6-1f1e8","unicode_alternates":"","name":"ascension","shortname":":flag_ac:","category":"flags","emoji_order":"1038","aliases":[":ac:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_af":{"unicode":"1f1e6-1f1eb","unicode_alternates":"","name":"afghanistan","shortname":":flag_af:","category":"flags","emoji_order":"1039","aliases":[":af:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_al":{"unicode":"1f1e6-1f1f1","unicode_alternates":"","name":"albania","shortname":":flag_al:","category":"flags","emoji_order":"1040","aliases":[":al:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_dz":{"unicode":"1f1e9-1f1ff","unicode_alternates":"","name":"algeria","shortname":":flag_dz:","category":"flags","emoji_order":"1041","aliases":[":dz:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ad":{"unicode":"1f1e6-1f1e9","unicode_alternates":"","name":"andorra","shortname":":flag_ad:","category":"flags","emoji_order":"1042","aliases":[":ad:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ao":{"unicode":"1f1e6-1f1f4","unicode_alternates":"","name":"angola","shortname":":flag_ao:","category":"flags","emoji_order":"1043","aliases":[":ao:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ai":{"unicode":"1f1e6-1f1ee","unicode_alternates":"","name":"anguilla","shortname":":flag_ai:","category":"flags","emoji_order":"1044","aliases":[":ai:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ag":{"unicode":"1f1e6-1f1ec","unicode_alternates":"","name":"antigua and barbuda","shortname":":flag_ag:","category":"flags","emoji_order":"1045","aliases":[":ag:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ar":{"unicode":"1f1e6-1f1f7","unicode_alternates":"","name":"argentina","shortname":":flag_ar:","category":"flags","emoji_order":"1046","aliases":[":ar:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_am":{"unicode":"1f1e6-1f1f2","unicode_alternates":"","name":"armenia","shortname":":flag_am:","category":"flags","emoji_order":"1047","aliases":[":am:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_aw":{"unicode":"1f1e6-1f1fc","unicode_alternates":"","name":"aruba","shortname":":flag_aw:","category":"flags","emoji_order":"1048","aliases":[":aw:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_au":{"unicode":"1f1e6-1f1fa","unicode_alternates":"","name":"australia","shortname":":flag_au:","category":"flags","emoji_order":"1049","aliases":[":au:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_at":{"unicode":"1f1e6-1f1f9","unicode_alternates":"","name":"austria","shortname":":flag_at:","category":"flags","emoji_order":"1050","aliases":[":at:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_az":{"unicode":"1f1e6-1f1ff","unicode_alternates":"","name":"azerbaijan","shortname":":flag_az:","category":"flags","emoji_order":"1051","aliases":[":az:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_bs":{"unicode":"1f1e7-1f1f8","unicode_alternates":"","name":"the bahamas","shortname":":flag_bs:","category":"flags","emoji_order":"1052","aliases":[":bs:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_bh":{"unicode":"1f1e7-1f1ed","unicode_alternates":"","name":"bahrain","shortname":":flag_bh:","category":"flags","emoji_order":"1053","aliases":[":bh:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_bd":{"unicode":"1f1e7-1f1e9","unicode_alternates":"","name":"bangladesh","shortname":":flag_bd:","category":"flags","emoji_order":"1054","aliases":[":bd:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_bb":{"unicode":"1f1e7-1f1e7","unicode_alternates":"","name":"barbados","shortname":":flag_bb:","category":"flags","emoji_order":"1055","aliases":[":bb:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_by":{"unicode":"1f1e7-1f1fe","unicode_alternates":"","name":"belarus","shortname":":flag_by:","category":"flags","emoji_order":"1056","aliases":[":by:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_be":{"unicode":"1f1e7-1f1ea","unicode_alternates":"","name":"belgium","shortname":":flag_be:","category":"flags","emoji_order":"1057","aliases":[":be:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_bz":{"unicode":"1f1e7-1f1ff","unicode_alternates":"","name":"belize","shortname":":flag_bz:","category":"flags","emoji_order":"1058","aliases":[":bz:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_bj":{"unicode":"1f1e7-1f1ef","unicode_alternates":"","name":"benin","shortname":":flag_bj:","category":"flags","emoji_order":"1059","aliases":[":bj:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_bm":{"unicode":"1f1e7-1f1f2","unicode_alternates":"","name":"bermuda","shortname":":flag_bm:","category":"flags","emoji_order":"1060","aliases":[":bm:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_bt":{"unicode":"1f1e7-1f1f9","unicode_alternates":"","name":"bhutan","shortname":":flag_bt:","category":"flags","emoji_order":"1061","aliases":[":bt:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_bo":{"unicode":"1f1e7-1f1f4","unicode_alternates":"","name":"bolivia","shortname":":flag_bo:","category":"flags","emoji_order":"1062","aliases":[":bo:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ba":{"unicode":"1f1e7-1f1e6","unicode_alternates":"","name":"bosnia and herzegovina","shortname":":flag_ba:","category":"flags","emoji_order":"1063","aliases":[":ba:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_bw":{"unicode":"1f1e7-1f1fc","unicode_alternates":"","name":"botswana","shortname":":flag_bw:","category":"flags","emoji_order":"1064","aliases":[":bw:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_br":{"unicode":"1f1e7-1f1f7","unicode_alternates":"","name":"brazil","shortname":":flag_br:","category":"flags","emoji_order":"1065","aliases":[":br:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_bn":{"unicode":"1f1e7-1f1f3","unicode_alternates":"","name":"brunei","shortname":":flag_bn:","category":"flags","emoji_order":"1066","aliases":[":bn:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_bg":{"unicode":"1f1e7-1f1ec","unicode_alternates":"","name":"bulgaria","shortname":":flag_bg:","category":"flags","emoji_order":"1067","aliases":[":bg:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_bf":{"unicode":"1f1e7-1f1eb","unicode_alternates":"","name":"burkina faso","shortname":":flag_bf:","category":"flags","emoji_order":"1068","aliases":[":bf:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_bi":{"unicode":"1f1e7-1f1ee","unicode_alternates":"","name":"burundi","shortname":":flag_bi:","category":"flags","emoji_order":"1069","aliases":[":bi:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_cv":{"unicode":"1f1e8-1f1fb","unicode_alternates":"","name":"cape verde","shortname":":flag_cv:","category":"flags","emoji_order":"1070","aliases":[":cv:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_kh":{"unicode":"1f1f0-1f1ed","unicode_alternates":"","name":"cambodia","shortname":":flag_kh:","category":"flags","emoji_order":"1071","aliases":[":kh:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_cm":{"unicode":"1f1e8-1f1f2","unicode_alternates":"","name":"cameroon","shortname":":flag_cm:","category":"flags","emoji_order":"1072","aliases":[":cm:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ca":{"unicode":"1f1e8-1f1e6","unicode_alternates":"","name":"canada","shortname":":flag_ca:","category":"flags","emoji_order":"1073","aliases":[":ca:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ky":{"unicode":"1f1f0-1f1fe","unicode_alternates":"","name":"cayman islands","shortname":":flag_ky:","category":"flags","emoji_order":"1074","aliases":[":ky:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_cf":{"unicode":"1f1e8-1f1eb","unicode_alternates":"","name":"central african republic","shortname":":flag_cf:","category":"flags","emoji_order":"1075","aliases":[":cf:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_td":{"unicode":"1f1f9-1f1e9","unicode_alternates":"","name":"chad","shortname":":flag_td:","category":"flags","emoji_order":"1076","aliases":[":td:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_cl":{"unicode":"1f1e8-1f1f1","unicode_alternates":"","name":"chile","shortname":":flag_cl:","category":"flags","emoji_order":"1077","aliases":[":chile:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_cn":{"unicode":"1f1e8-1f1f3","unicode_alternates":"","name":"china","shortname":":flag_cn:","category":"flags","emoji_order":"1078","aliases":[":cn:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_co":{"unicode":"1f1e8-1f1f4","unicode_alternates":"","name":"colombia","shortname":":flag_co:","category":"flags","emoji_order":"1079","aliases":[":co:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_km":{"unicode":"1f1f0-1f1f2","unicode_alternates":"","name":"the comoros","shortname":":flag_km:","category":"flags","emoji_order":"1080","aliases":[":km:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_cg":{"unicode":"1f1e8-1f1ec","unicode_alternates":"","name":"the republic of the congo","shortname":":flag_cg:","category":"flags","emoji_order":"1081","aliases":[":cg:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_cd":{"unicode":"1f1e8-1f1e9","unicode_alternates":"","name":"the democratic republic of the congo","shortname":":flag_cd:","category":"flags","emoji_order":"1082","aliases":[":congo:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_cr":{"unicode":"1f1e8-1f1f7","unicode_alternates":"","name":"costa rica","shortname":":flag_cr:","category":"flags","emoji_order":"1083","aliases":[":cr:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_hr":{"unicode":"1f1ed-1f1f7","unicode_alternates":"","name":"croatia","shortname":":flag_hr:","category":"flags","emoji_order":"1084","aliases":[":hr:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_cu":{"unicode":"1f1e8-1f1fa","unicode_alternates":"","name":"cuba","shortname":":flag_cu:","category":"flags","emoji_order":"1085","aliases":[":cu:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_cy":{"unicode":"1f1e8-1f1fe","unicode_alternates":"","name":"cyprus","shortname":":flag_cy:","category":"flags","emoji_order":"1086","aliases":[":cy:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_cz":{"unicode":"1f1e8-1f1ff","unicode_alternates":"","name":"the czech republic","shortname":":flag_cz:","category":"flags","emoji_order":"1087","aliases":[":cz:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_dk":{"unicode":"1f1e9-1f1f0","unicode_alternates":"","name":"denmark","shortname":":flag_dk:","category":"flags","emoji_order":"1088","aliases":[":dk:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_dj":{"unicode":"1f1e9-1f1ef","unicode_alternates":"","name":"djibouti","shortname":":flag_dj:","category":"flags","emoji_order":"1089","aliases":[":dj:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_dm":{"unicode":"1f1e9-1f1f2","unicode_alternates":"","name":"dominica","shortname":":flag_dm:","category":"flags","emoji_order":"1090","aliases":[":dm:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_do":{"unicode":"1f1e9-1f1f4","unicode_alternates":"","name":"the dominican republic","shortname":":flag_do:","category":"flags","emoji_order":"1091","aliases":[":do:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ec":{"unicode":"1f1ea-1f1e8","unicode_alternates":"","name":"ecuador","shortname":":flag_ec:","category":"flags","emoji_order":"1092","aliases":[":ec:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_eg":{"unicode":"1f1ea-1f1ec","unicode_alternates":"","name":"egypt","shortname":":flag_eg:","category":"flags","emoji_order":"1093","aliases":[":eg:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_sv":{"unicode":"1f1f8-1f1fb","unicode_alternates":"","name":"el salvador","shortname":":flag_sv:","category":"flags","emoji_order":"1094","aliases":[":sv:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_gq":{"unicode":"1f1ec-1f1f6","unicode_alternates":"","name":"equatorial guinea","shortname":":flag_gq:","category":"flags","emoji_order":"1095","aliases":[":gq:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_er":{"unicode":"1f1ea-1f1f7","unicode_alternates":"","name":"eritrea","shortname":":flag_er:","category":"flags","emoji_order":"1096","aliases":[":er:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ee":{"unicode":"1f1ea-1f1ea","unicode_alternates":"","name":"estonia","shortname":":flag_ee:","category":"flags","emoji_order":"1097","aliases":[":ee:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_et":{"unicode":"1f1ea-1f1f9","unicode_alternates":"","name":"ethiopia","shortname":":flag_et:","category":"flags","emoji_order":"1098","aliases":[":et:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_fk":{"unicode":"1f1eb-1f1f0","unicode_alternates":"","name":"falkland islands","shortname":":flag_fk:","category":"flags","emoji_order":"1099","aliases":[":fk:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_fo":{"unicode":"1f1eb-1f1f4","unicode_alternates":"","name":"faroe islands","shortname":":flag_fo:","category":"flags","emoji_order":"1100","aliases":[":fo:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_fj":{"unicode":"1f1eb-1f1ef","unicode_alternates":"","name":"fiji","shortname":":flag_fj:","category":"flags","emoji_order":"1101","aliases":[":fj:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_fi":{"unicode":"1f1eb-1f1ee","unicode_alternates":"","name":"finland","shortname":":flag_fi:","category":"flags","emoji_order":"1102","aliases":[":fi:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_fr":{"unicode":"1f1eb-1f1f7","unicode_alternates":"","name":"france","shortname":":flag_fr:","category":"flags","emoji_order":"1103","aliases":[":fr:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_pf":{"unicode":"1f1f5-1f1eb","unicode_alternates":"","name":"french polynesia","shortname":":flag_pf:","category":"flags","emoji_order":"1104","aliases":[":pf:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ga":{"unicode":"1f1ec-1f1e6","unicode_alternates":"","name":"gabon","shortname":":flag_ga:","category":"flags","emoji_order":"1105","aliases":[":ga:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_gm":{"unicode":"1f1ec-1f1f2","unicode_alternates":"","name":"the gambia","shortname":":flag_gm:","category":"flags","emoji_order":"1106","aliases":[":gm:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ge":{"unicode":"1f1ec-1f1ea","unicode_alternates":"","name":"georgia","shortname":":flag_ge:","category":"flags","emoji_order":"1107","aliases":[":ge:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_de":{"unicode":"1f1e9-1f1ea","unicode_alternates":"","name":"germany","shortname":":flag_de:","category":"flags","emoji_order":"1108","aliases":[":de:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_gh":{"unicode":"1f1ec-1f1ed","unicode_alternates":"","name":"ghana","shortname":":flag_gh:","category":"flags","emoji_order":"1109","aliases":[":gh:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_gi":{"unicode":"1f1ec-1f1ee","unicode_alternates":"","name":"gibraltar","shortname":":flag_gi:","category":"flags","emoji_order":"1110","aliases":[":gi:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_gr":{"unicode":"1f1ec-1f1f7","unicode_alternates":"","name":"greece","shortname":":flag_gr:","category":"flags","emoji_order":"1111","aliases":[":gr:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_gl":{"unicode":"1f1ec-1f1f1","unicode_alternates":"","name":"greenland","shortname":":flag_gl:","category":"flags","emoji_order":"1112","aliases":[":gl:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_gd":{"unicode":"1f1ec-1f1e9","unicode_alternates":"","name":"grenada","shortname":":flag_gd:","category":"flags","emoji_order":"1113","aliases":[":gd:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_gu":{"unicode":"1f1ec-1f1fa","unicode_alternates":"","name":"guam","shortname":":flag_gu:","category":"flags","emoji_order":"1114","aliases":[":gu:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_gt":{"unicode":"1f1ec-1f1f9","unicode_alternates":"","name":"guatemala","shortname":":flag_gt:","category":"flags","emoji_order":"1115","aliases":[":gt:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_gn":{"unicode":"1f1ec-1f1f3","unicode_alternates":"","name":"guinea","shortname":":flag_gn:","category":"flags","emoji_order":"1116","aliases":[":gn:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_gw":{"unicode":"1f1ec-1f1fc","unicode_alternates":"","name":"guinea-bissau","shortname":":flag_gw:","category":"flags","emoji_order":"1117","aliases":[":gw:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_gy":{"unicode":"1f1ec-1f1fe","unicode_alternates":"","name":"guyana","shortname":":flag_gy:","category":"flags","emoji_order":"1118","aliases":[":gy:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ht":{"unicode":"1f1ed-1f1f9","unicode_alternates":"","name":"haiti","shortname":":flag_ht:","category":"flags","emoji_order":"1119","aliases":[":ht:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_hn":{"unicode":"1f1ed-1f1f3","unicode_alternates":"","name":"honduras","shortname":":flag_hn:","category":"flags","emoji_order":"1120","aliases":[":hn:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_hk":{"unicode":"1f1ed-1f1f0","unicode_alternates":"","name":"hong kong","shortname":":flag_hk:","category":"flags","emoji_order":"1121","aliases":[":hk:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_hu":{"unicode":"1f1ed-1f1fa","unicode_alternates":"","name":"hungary","shortname":":flag_hu:","category":"flags","emoji_order":"1122","aliases":[":hu:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_is":{"unicode":"1f1ee-1f1f8","unicode_alternates":"","name":"iceland","shortname":":flag_is:","category":"flags","emoji_order":"1123","aliases":[":is:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_in":{"unicode":"1f1ee-1f1f3","unicode_alternates":"","name":"india","shortname":":flag_in:","category":"flags","emoji_order":"1124","aliases":[":in:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_id":{"unicode":"1f1ee-1f1e9","unicode_alternates":"","name":"indonesia","shortname":":flag_id:","category":"flags","emoji_order":"1125","aliases":[":indonesia:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ir":{"unicode":"1f1ee-1f1f7","unicode_alternates":"","name":"iran","shortname":":flag_ir:","category":"flags","emoji_order":"1126","aliases":[":ir:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_iq":{"unicode":"1f1ee-1f1f6","unicode_alternates":"","name":"iraq","shortname":":flag_iq:","category":"flags","emoji_order":"1127","aliases":[":iq:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ie":{"unicode":"1f1ee-1f1ea","unicode_alternates":"","name":"ireland","shortname":":flag_ie:","category":"flags","emoji_order":"1128","aliases":[":ie:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_il":{"unicode":"1f1ee-1f1f1","unicode_alternates":"","name":"israel","shortname":":flag_il:","category":"flags","emoji_order":"1129","aliases":[":il:"],"aliases_ascii":[],"keywords":["jew","country","flag","flag"]},"flag_it":{"unicode":"1f1ee-1f1f9","unicode_alternates":"","name":"italy","shortname":":flag_it:","category":"flags","emoji_order":"1130","aliases":[":it:"],"aliases_ascii":[],"keywords":["italian","country","flag","flag"]},"flag_ci":{"unicode":"1f1e8-1f1ee","unicode_alternates":"","name":"c\u00f4te d\u2019ivoire","shortname":":flag_ci:","category":"flags","emoji_order":"1131","aliases":[":ci:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_jm":{"unicode":"1f1ef-1f1f2","unicode_alternates":"","name":"jamaica","shortname":":flag_jm:","category":"flags","emoji_order":"1132","aliases":[":jm:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_jp":{"unicode":"1f1ef-1f1f5","unicode_alternates":"","name":"japan","shortname":":flag_jp:","category":"flags","emoji_order":"1133","aliases":[":jp:"],"aliases_ascii":[],"keywords":["japan","country","flag","flag"]},"flag_je":{"unicode":"1f1ef-1f1ea","unicode_alternates":"","name":"jersey","shortname":":flag_je:","category":"flags","emoji_order":"1134","aliases":[":je:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_jo":{"unicode":"1f1ef-1f1f4","unicode_alternates":"","name":"jordan","shortname":":flag_jo:","category":"flags","emoji_order":"1135","aliases":[":jo:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_kz":{"unicode":"1f1f0-1f1ff","unicode_alternates":"","name":"kazakhstan","shortname":":flag_kz:","category":"flags","emoji_order":"1136","aliases":[":kz:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ke":{"unicode":"1f1f0-1f1ea","unicode_alternates":"","name":"kenya","shortname":":flag_ke:","category":"flags","emoji_order":"1137","aliases":[":ke:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ki":{"unicode":"1f1f0-1f1ee","unicode_alternates":"","name":"kiribati","shortname":":flag_ki:","category":"flags","emoji_order":"1138","aliases":[":ki:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_xk":{"unicode":"1f1fd-1f1f0","unicode_alternates":"","name":"kosovo","shortname":":flag_xk:","category":"flags","emoji_order":"1139","aliases":[":xk:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_kw":{"unicode":"1f1f0-1f1fc","unicode_alternates":"","name":"kuwait","shortname":":flag_kw:","category":"flags","emoji_order":"1140","aliases":[":kw:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_kg":{"unicode":"1f1f0-1f1ec","unicode_alternates":"","name":"kyrgyzstan","shortname":":flag_kg:","category":"flags","emoji_order":"1141","aliases":[":kg:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_la":{"unicode":"1f1f1-1f1e6","unicode_alternates":"","name":"laos","shortname":":flag_la:","category":"flags","emoji_order":"1142","aliases":[":la:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_lv":{"unicode":"1f1f1-1f1fb","unicode_alternates":"","name":"latvia","shortname":":flag_lv:","category":"flags","emoji_order":"1143","aliases":[":lv:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_lb":{"unicode":"1f1f1-1f1e7","unicode_alternates":"","name":"lebanon","shortname":":flag_lb:","category":"flags","emoji_order":"1144","aliases":[":lb:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ls":{"unicode":"1f1f1-1f1f8","unicode_alternates":"","name":"lesotho","shortname":":flag_ls:","category":"flags","emoji_order":"1145","aliases":[":ls:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_lr":{"unicode":"1f1f1-1f1f7","unicode_alternates":"","name":"liberia","shortname":":flag_lr:","category":"flags","emoji_order":"1146","aliases":[":lr:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ly":{"unicode":"1f1f1-1f1fe","unicode_alternates":"","name":"libya","shortname":":flag_ly:","category":"flags","emoji_order":"1147","aliases":[":ly:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_li":{"unicode":"1f1f1-1f1ee","unicode_alternates":"","name":"liechtenstein","shortname":":flag_li:","category":"flags","emoji_order":"1148","aliases":[":li:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_lt":{"unicode":"1f1f1-1f1f9","unicode_alternates":"","name":"lithuania","shortname":":flag_lt:","category":"flags","emoji_order":"1149","aliases":[":lt:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_lu":{"unicode":"1f1f1-1f1fa","unicode_alternates":"","name":"luxembourg","shortname":":flag_lu:","category":"flags","emoji_order":"1150","aliases":[":lu:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_mo":{"unicode":"1f1f2-1f1f4","unicode_alternates":"","name":"macau","shortname":":flag_mo:","category":"flags","emoji_order":"1151","aliases":[":mo:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_mk":{"unicode":"1f1f2-1f1f0","unicode_alternates":"","name":"macedonia","shortname":":flag_mk:","category":"flags","emoji_order":"1152","aliases":[":mk:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_mg":{"unicode":"1f1f2-1f1ec","unicode_alternates":"","name":"madagascar","shortname":":flag_mg:","category":"flags","emoji_order":"1153","aliases":[":mg:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_mw":{"unicode":"1f1f2-1f1fc","unicode_alternates":"","name":"malawi","shortname":":flag_mw:","category":"flags","emoji_order":"1154","aliases":[":mw:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_my":{"unicode":"1f1f2-1f1fe","unicode_alternates":"","name":"malaysia","shortname":":flag_my:","category":"flags","emoji_order":"1155","aliases":[":my:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_mv":{"unicode":"1f1f2-1f1fb","unicode_alternates":"","name":"maldives","shortname":":flag_mv:","category":"flags","emoji_order":"1156","aliases":[":mv:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ml":{"unicode":"1f1f2-1f1f1","unicode_alternates":"","name":"mali","shortname":":flag_ml:","category":"flags","emoji_order":"1157","aliases":[":ml:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_mt":{"unicode":"1f1f2-1f1f9","unicode_alternates":"","name":"malta","shortname":":flag_mt:","category":"flags","emoji_order":"1158","aliases":[":mt:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_mh":{"unicode":"1f1f2-1f1ed","unicode_alternates":"","name":"the marshall islands","shortname":":flag_mh:","category":"flags","emoji_order":"1159","aliases":[":mh:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_mr":{"unicode":"1f1f2-1f1f7","unicode_alternates":"","name":"mauritania","shortname":":flag_mr:","category":"flags","emoji_order":"1160","aliases":[":mr:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_mu":{"unicode":"1f1f2-1f1fa","unicode_alternates":"","name":"mauritius","shortname":":flag_mu:","category":"flags","emoji_order":"1161","aliases":[":mu:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_mx":{"unicode":"1f1f2-1f1fd","unicode_alternates":"","name":"mexico","shortname":":flag_mx:","category":"flags","emoji_order":"1162","aliases":[":mx:"],"aliases_ascii":[],"keywords":["country","mexican","flag","flag"]},"flag_fm":{"unicode":"1f1eb-1f1f2","unicode_alternates":"","name":"micronesia","shortname":":flag_fm:","category":"flags","emoji_order":"1163","aliases":[":fm:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_md":{"unicode":"1f1f2-1f1e9","unicode_alternates":"","name":"moldova","shortname":":flag_md:","category":"flags","emoji_order":"1164","aliases":[":md:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_mc":{"unicode":"1f1f2-1f1e8","unicode_alternates":"","name":"monaco","shortname":":flag_mc:","category":"flags","emoji_order":"1165","aliases":[":mc:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_mn":{"unicode":"1f1f2-1f1f3","unicode_alternates":"","name":"mongolia","shortname":":flag_mn:","category":"flags","emoji_order":"1166","aliases":[":mn:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_me":{"unicode":"1f1f2-1f1ea","unicode_alternates":"","name":"montenegro","shortname":":flag_me:","category":"flags","emoji_order":"1167","aliases":[":me:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ms":{"unicode":"1f1f2-1f1f8","unicode_alternates":"","name":"montserrat","shortname":":flag_ms:","category":"flags","emoji_order":"1168","aliases":[":ms:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ma":{"unicode":"1f1f2-1f1e6","unicode_alternates":"","name":"morocco","shortname":":flag_ma:","category":"flags","emoji_order":"1169","aliases":[":ma:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_mz":{"unicode":"1f1f2-1f1ff","unicode_alternates":"","name":"mozambique","shortname":":flag_mz:","category":"flags","emoji_order":"1170","aliases":[":mz:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_mm":{"unicode":"1f1f2-1f1f2","unicode_alternates":"","name":"myanmar","shortname":":flag_mm:","category":"flags","emoji_order":"1171","aliases":[":mm:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_na":{"unicode":"1f1f3-1f1e6","unicode_alternates":"","name":"namibia","shortname":":flag_na:","category":"flags","emoji_order":"1172","aliases":[":na:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_nr":{"unicode":"1f1f3-1f1f7","unicode_alternates":"","name":"nauru","shortname":":flag_nr:","category":"flags","emoji_order":"1173","aliases":[":nr:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_np":{"unicode":"1f1f3-1f1f5","unicode_alternates":"","name":"nepal","shortname":":flag_np:","category":"flags","emoji_order":"1174","aliases":[":np:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_nl":{"unicode":"1f1f3-1f1f1","unicode_alternates":"","name":"the netherlands","shortname":":flag_nl:","category":"flags","emoji_order":"1175","aliases":[":nl:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_nc":{"unicode":"1f1f3-1f1e8","unicode_alternates":"","name":"new caledonia","shortname":":flag_nc:","category":"flags","emoji_order":"1176","aliases":[":nc:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_nz":{"unicode":"1f1f3-1f1ff","unicode_alternates":"","name":"new zealand","shortname":":flag_nz:","category":"flags","emoji_order":"1177","aliases":[":nz:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ni":{"unicode":"1f1f3-1f1ee","unicode_alternates":"","name":"nicaragua","shortname":":flag_ni:","category":"flags","emoji_order":"1178","aliases":[":ni:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ne":{"unicode":"1f1f3-1f1ea","unicode_alternates":"","name":"niger","shortname":":flag_ne:","category":"flags","emoji_order":"1179","aliases":[":ne:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ng":{"unicode":"1f1f3-1f1ec","unicode_alternates":"","name":"nigeria","shortname":":flag_ng:","category":"flags","emoji_order":"1180","aliases":[":nigeria:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_nu":{"unicode":"1f1f3-1f1fa","unicode_alternates":"","name":"niue","shortname":":flag_nu:","category":"flags","emoji_order":"1181","aliases":[":nu:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_kp":{"unicode":"1f1f0-1f1f5","unicode_alternates":"","name":"north korea","shortname":":flag_kp:","category":"flags","emoji_order":"1182","aliases":[":kp:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_no":{"unicode":"1f1f3-1f1f4","unicode_alternates":"","name":"norway","shortname":":flag_no:","category":"flags","emoji_order":"1183","aliases":[":no:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_om":{"unicode":"1f1f4-1f1f2","unicode_alternates":"","name":"oman","shortname":":flag_om:","category":"flags","emoji_order":"1184","aliases":[":om:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_pk":{"unicode":"1f1f5-1f1f0","unicode_alternates":"","name":"pakistan","shortname":":flag_pk:","category":"flags","emoji_order":"1185","aliases":[":pk:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_pw":{"unicode":"1f1f5-1f1fc","unicode_alternates":"","name":"palau","shortname":":flag_pw:","category":"flags","emoji_order":"1186","aliases":[":pw:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ps":{"unicode":"1f1f5-1f1f8","unicode_alternates":"","name":"palestinian authority","shortname":":flag_ps:","category":"flags","emoji_order":"1187","aliases":[":ps:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_pa":{"unicode":"1f1f5-1f1e6","unicode_alternates":"","name":"panama","shortname":":flag_pa:","category":"flags","emoji_order":"1188","aliases":[":pa:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_pg":{"unicode":"1f1f5-1f1ec","unicode_alternates":"","name":"papua new guinea","shortname":":flag_pg:","category":"flags","emoji_order":"1189","aliases":[":pg:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_py":{"unicode":"1f1f5-1f1fe","unicode_alternates":"","name":"paraguay","shortname":":flag_py:","category":"flags","emoji_order":"1190","aliases":[":py:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_pe":{"unicode":"1f1f5-1f1ea","unicode_alternates":"","name":"peru","shortname":":flag_pe:","category":"flags","emoji_order":"1191","aliases":[":pe:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ph":{"unicode":"1f1f5-1f1ed","unicode_alternates":"","name":"the philippines","shortname":":flag_ph:","category":"flags","emoji_order":"1192","aliases":[":ph:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_pl":{"unicode":"1f1f5-1f1f1","unicode_alternates":"","name":"poland","shortname":":flag_pl:","category":"flags","emoji_order":"1193","aliases":[":pl:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_pt":{"unicode":"1f1f5-1f1f9","unicode_alternates":"","name":"portugal","shortname":":flag_pt:","category":"flags","emoji_order":"1194","aliases":[":pt:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_pr":{"unicode":"1f1f5-1f1f7","unicode_alternates":"","name":"puerto rico","shortname":":flag_pr:","category":"flags","emoji_order":"1195","aliases":[":pr:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_qa":{"unicode":"1f1f6-1f1e6","unicode_alternates":"","name":"qatar","shortname":":flag_qa:","category":"flags","emoji_order":"1196","aliases":[":qa:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ro":{"unicode":"1f1f7-1f1f4","unicode_alternates":"","name":"romania","shortname":":flag_ro:","category":"flags","emoji_order":"1197","aliases":[":ro:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ru":{"unicode":"1f1f7-1f1fa","unicode_alternates":"","name":"russia","shortname":":flag_ru:","category":"flags","emoji_order":"1198","aliases":[":ru:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_rw":{"unicode":"1f1f7-1f1fc","unicode_alternates":"","name":"rwanda","shortname":":flag_rw:","category":"flags","emoji_order":"1199","aliases":[":rw:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_sh":{"unicode":"1f1f8-1f1ed","unicode_alternates":"","name":"saint helena","shortname":":flag_sh:","category":"flags","emoji_order":"1200","aliases":[":sh:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_kn":{"unicode":"1f1f0-1f1f3","unicode_alternates":"","name":"saint kitts and nevis","shortname":":flag_kn:","category":"flags","emoji_order":"1201","aliases":[":kn:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_lc":{"unicode":"1f1f1-1f1e8","unicode_alternates":"","name":"saint lucia","shortname":":flag_lc:","category":"flags","emoji_order":"1202","aliases":[":lc:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_vc":{"unicode":"1f1fb-1f1e8","unicode_alternates":"","name":"saint vincent and the grenadines","shortname":":flag_vc:","category":"flags","emoji_order":"1203","aliases":[":vc:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ws":{"unicode":"1f1fc-1f1f8","unicode_alternates":"","name":"samoa","shortname":":flag_ws:","category":"flags","emoji_order":"1204","aliases":[":ws:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_sm":{"unicode":"1f1f8-1f1f2","unicode_alternates":"","name":"san marino","shortname":":flag_sm:","category":"flags","emoji_order":"1205","aliases":[":sm:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_st":{"unicode":"1f1f8-1f1f9","unicode_alternates":"","name":"s\u00e3o tom\u00e9 and pr\u00edncipe","shortname":":flag_st:","category":"flags","emoji_order":"1206","aliases":[":st:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_sa":{"unicode":"1f1f8-1f1e6","unicode_alternates":"","name":"saudi arabia","shortname":":flag_sa:","category":"flags","emoji_order":"1207","aliases":[":saudiarabia:",":saudi:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_sn":{"unicode":"1f1f8-1f1f3","unicode_alternates":"","name":"senegal","shortname":":flag_sn:","category":"flags","emoji_order":"1208","aliases":[":sn:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_rs":{"unicode":"1f1f7-1f1f8","unicode_alternates":"","name":"serbia","shortname":":flag_rs:","category":"flags","emoji_order":"1209","aliases":[":rs:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_sc":{"unicode":"1f1f8-1f1e8","unicode_alternates":"","name":"the seychelles","shortname":":flag_sc:","category":"flags","emoji_order":"1210","aliases":[":sc:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_sl":{"unicode":"1f1f8-1f1f1","unicode_alternates":"","name":"sierra leone","shortname":":flag_sl:","category":"flags","emoji_order":"1211","aliases":[":sl:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_sg":{"unicode":"1f1f8-1f1ec","unicode_alternates":"","name":"singapore","shortname":":flag_sg:","category":"flags","emoji_order":"1212","aliases":[":sg:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_sk":{"unicode":"1f1f8-1f1f0","unicode_alternates":"","name":"slovakia","shortname":":flag_sk:","category":"flags","emoji_order":"1213","aliases":[":sk:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_si":{"unicode":"1f1f8-1f1ee","unicode_alternates":"","name":"slovenia","shortname":":flag_si:","category":"flags","emoji_order":"1214","aliases":[":si:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_sb":{"unicode":"1f1f8-1f1e7","unicode_alternates":"","name":"the solomon islands","shortname":":flag_sb:","category":"flags","emoji_order":"1215","aliases":[":sb:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_so":{"unicode":"1f1f8-1f1f4","unicode_alternates":"","name":"somalia","shortname":":flag_so:","category":"flags","emoji_order":"1216","aliases":[":so:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_za":{"unicode":"1f1ff-1f1e6","unicode_alternates":"","name":"south africa","shortname":":flag_za:","category":"flags","emoji_order":"1217","aliases":[":za:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_kr":{"unicode":"1f1f0-1f1f7","unicode_alternates":"","name":"korea","shortname":":flag_kr:","category":"flags","emoji_order":"1218","aliases":[":kr:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_es":{"unicode":"1f1ea-1f1f8","unicode_alternates":"","name":"spain","shortname":":flag_es:","category":"flags","emoji_order":"1219","aliases":[":es:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_lk":{"unicode":"1f1f1-1f1f0","unicode_alternates":"","name":"sri lanka","shortname":":flag_lk:","category":"flags","emoji_order":"1220","aliases":[":lk:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_sd":{"unicode":"1f1f8-1f1e9","unicode_alternates":"","name":"sudan","shortname":":flag_sd:","category":"flags","emoji_order":"1221","aliases":[":sd:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_sr":{"unicode":"1f1f8-1f1f7","unicode_alternates":"","name":"suriname","shortname":":flag_sr:","category":"flags","emoji_order":"1222","aliases":[":sr:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_sz":{"unicode":"1f1f8-1f1ff","unicode_alternates":"","name":"swaziland","shortname":":flag_sz:","category":"flags","emoji_order":"1223","aliases":[":sz:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_se":{"unicode":"1f1f8-1f1ea","unicode_alternates":"","name":"sweden","shortname":":flag_se:","category":"flags","emoji_order":"1224","aliases":[":se:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ch":{"unicode":"1f1e8-1f1ed","unicode_alternates":"","name":"switzerland","shortname":":flag_ch:","category":"flags","emoji_order":"1225","aliases":[":ch:"],"aliases_ascii":[],"keywords":["country","neutral","flag","flag"]},"flag_sy":{"unicode":"1f1f8-1f1fe","unicode_alternates":"","name":"syria","shortname":":flag_sy:","category":"flags","emoji_order":"1226","aliases":[":sy:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_tw":{"unicode":"1f1f9-1f1fc","unicode_alternates":"","name":"the republic of china","shortname":":flag_tw:","category":"flags","emoji_order":"1227","aliases":[":tw:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_tj":{"unicode":"1f1f9-1f1ef","unicode_alternates":"","name":"tajikistan","shortname":":flag_tj:","category":"flags","emoji_order":"1228","aliases":[":tj:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_tz":{"unicode":"1f1f9-1f1ff","unicode_alternates":"","name":"tanzania","shortname":":flag_tz:","category":"flags","emoji_order":"1229","aliases":[":tz:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_th":{"unicode":"1f1f9-1f1ed","unicode_alternates":"","name":"thailand","shortname":":flag_th:","category":"flags","emoji_order":"1230","aliases":[":th:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_tl":{"unicode":"1f1f9-1f1f1","unicode_alternates":"","name":"timor-leste","shortname":":flag_tl:","category":"flags","emoji_order":"1231","aliases":[":tl:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_tg":{"unicode":"1f1f9-1f1ec","unicode_alternates":"","name":"togo","shortname":":flag_tg:","category":"flags","emoji_order":"1232","aliases":[":tg:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_to":{"unicode":"1f1f9-1f1f4","unicode_alternates":"","name":"tonga","shortname":":flag_to:","category":"flags","emoji_order":"1233","aliases":[":to:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_tt":{"unicode":"1f1f9-1f1f9","unicode_alternates":"","name":"trinidad and tobago","shortname":":flag_tt:","category":"flags","emoji_order":"1234","aliases":[":tt:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_tn":{"unicode":"1f1f9-1f1f3","unicode_alternates":"","name":"tunisia","shortname":":flag_tn:","category":"flags","emoji_order":"1235","aliases":[":tn:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_tr":{"unicode":"1f1f9-1f1f7","unicode_alternates":"","name":"turkey","shortname":":flag_tr:","category":"flags","emoji_order":"1236","aliases":[":tr:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_tm":{"unicode":"1f1f9-1f1f2","unicode_alternates":"","name":"turkmenistan","shortname":":flag_tm:","category":"flags","emoji_order":"1237","aliases":[":turkmenistan:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_tv":{"unicode":"1f1f9-1f1fb","unicode_alternates":"","name":"tuvalu","shortname":":flag_tv:","category":"flags","emoji_order":"1238","aliases":[":tuvalu:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ug":{"unicode":"1f1fa-1f1ec","unicode_alternates":"","name":"uganda","shortname":":flag_ug:","category":"flags","emoji_order":"1239","aliases":[":ug:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ua":{"unicode":"1f1fa-1f1e6","unicode_alternates":"","name":"ukraine","shortname":":flag_ua:","category":"flags","emoji_order":"1240","aliases":[":ua:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ae":{"unicode":"1f1e6-1f1ea","unicode_alternates":"","name":"the united arab emirates","shortname":":flag_ae:","category":"flags","emoji_order":"1241","aliases":[":ae:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_gb":{"unicode":"1f1ec-1f1e7","unicode_alternates":"","name":"great britain","shortname":":flag_gb:","category":"flags","emoji_order":"1242","aliases":[":gb:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_us":{"unicode":"1f1fa-1f1f8","unicode_alternates":"","name":"united states","shortname":":flag_us:","category":"flags","emoji_order":"1243","aliases":[":us:"],"aliases_ascii":[],"keywords":["america","country","flag","flag"]},"flag_vi":{"unicode":"1f1fb-1f1ee","unicode_alternates":"","name":"u.s. virgin islands","shortname":":flag_vi:","category":"flags","emoji_order":"1244","aliases":[":vi:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_uy":{"unicode":"1f1fa-1f1fe","unicode_alternates":"","name":"uruguay","shortname":":flag_uy:","category":"flags","emoji_order":"1245","aliases":[":uy:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_uz":{"unicode":"1f1fa-1f1ff","unicode_alternates":"","name":"uzbekistan","shortname":":flag_uz:","category":"flags","emoji_order":"1246","aliases":[":uz:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_vu":{"unicode":"1f1fb-1f1fa","unicode_alternates":"","name":"vanuatu","shortname":":flag_vu:","category":"flags","emoji_order":"1247","aliases":[":vu:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_va":{"unicode":"1f1fb-1f1e6","unicode_alternates":"","name":"the vatican city","shortname":":flag_va:","category":"flags","emoji_order":"1248","aliases":[":va:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ve":{"unicode":"1f1fb-1f1ea","unicode_alternates":"","name":"venezuela","shortname":":flag_ve:","category":"flags","emoji_order":"1249","aliases":[":ve:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_vn":{"unicode":"1f1fb-1f1f3","unicode_alternates":"","name":"vietnam","shortname":":flag_vn:","category":"flags","emoji_order":"1250","aliases":[":vn:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_wf":{"unicode":"1f1fc-1f1eb","unicode_alternates":"","name":"wallis and futuna","shortname":":flag_wf:","category":"flags","emoji_order":"1251","aliases":[":wf:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_eh":{"unicode":"1f1ea-1f1ed","unicode_alternates":"","name":"western sahara","shortname":":flag_eh:","category":"flags","emoji_order":"1252","aliases":[":eh:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ye":{"unicode":"1f1fe-1f1ea","unicode_alternates":"","name":"yemen","shortname":":flag_ye:","category":"flags","emoji_order":"1253","aliases":[":ye:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_zm":{"unicode":"1f1ff-1f1f2","unicode_alternates":"","name":"zambia","shortname":":flag_zm:","category":"flags","emoji_order":"1254","aliases":[":zm:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_zw":{"unicode":"1f1ff-1f1fc","unicode_alternates":"","name":"zimbabwe","shortname":":flag_zw:","category":"flags","emoji_order":"1255","aliases":[":zw:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_re":{"unicode":"1f1f7-1f1ea","unicode_alternates":"","name":"r\u00e9union","shortname":":flag_re:","category":"flags","emoji_order":"1256","aliases":[":re:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ax":{"unicode":"1f1e6-1f1fd","unicode_alternates":"","name":"\u00e5land islands","shortname":":flag_ax:","category":"flags","emoji_order":"1257","aliases":[":ax:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ta":{"unicode":"1f1f9-1f1e6","unicode_alternates":"","name":"tristan da cunha","shortname":":flag_ta:","category":"flags","emoji_order":"1258","aliases":[":ta:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_io":{"unicode":"1f1ee-1f1f4","unicode_alternates":"","name":"british indian ocean territory","shortname":":flag_io:","category":"flags","emoji_order":"1259","aliases":[":io:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_bq":{"unicode":"1f1e7-1f1f6","unicode_alternates":"","name":"caribbean netherlands","shortname":":flag_bq:","category":"flags","emoji_order":"1260","aliases":[":bq:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_cx":{"unicode":"1f1e8-1f1fd","unicode_alternates":"","name":"christmas island","shortname":":flag_cx:","category":"flags","emoji_order":"1261","aliases":[":cx:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_cc":{"unicode":"1f1e8-1f1e8","unicode_alternates":"","name":"cocos (keeling) islands","shortname":":flag_cc:","category":"flags","emoji_order":"1262","aliases":[":cc:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_gg":{"unicode":"1f1ec-1f1ec","unicode_alternates":"","name":"guernsey","shortname":":flag_gg:","category":"flags","emoji_order":"1263","aliases":[":gg:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_im":{"unicode":"1f1ee-1f1f2","unicode_alternates":"","name":"isle of man","shortname":":flag_im:","category":"flags","emoji_order":"1264","aliases":[":im:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_yt":{"unicode":"1f1fe-1f1f9","unicode_alternates":"","name":"mayotte","shortname":":flag_yt:","category":"flags","emoji_order":"1265","aliases":[":yt:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_nf":{"unicode":"1f1f3-1f1eb","unicode_alternates":"","name":"norfolk island","shortname":":flag_nf:","category":"flags","emoji_order":"1266","aliases":[":nf:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_pn":{"unicode":"1f1f5-1f1f3","unicode_alternates":"","name":"pitcairn","shortname":":flag_pn:","category":"flags","emoji_order":"1267","aliases":[":pn:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_bl":{"unicode":"1f1e7-1f1f1","unicode_alternates":"","name":"saint barth\u00e9lemy","shortname":":flag_bl:","category":"flags","emoji_order":"1268","aliases":[":bl:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_pm":{"unicode":"1f1f5-1f1f2","unicode_alternates":"","name":"saint pierre and miquelon","shortname":":flag_pm:","category":"flags","emoji_order":"1269","aliases":[":pm:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_gs":{"unicode":"1f1ec-1f1f8","unicode_alternates":"","name":"south georgia","shortname":":flag_gs:","category":"flags","emoji_order":"1270","aliases":[":gs:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_tk":{"unicode":"1f1f9-1f1f0","unicode_alternates":"","name":"tokelau","shortname":":flag_tk:","category":"flags","emoji_order":"1271","aliases":[":tk:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_bv":{"unicode":"1f1e7-1f1fb","unicode_alternates":"","name":"bouvet island","shortname":":flag_bv:","category":"flags","emoji_order":"1272","aliases":[":bv:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_hm":{"unicode":"1f1ed-1f1f2","unicode_alternates":"","name":"heard island and mcdonald islands","shortname":":flag_hm:","category":"flags","emoji_order":"1273","aliases":[":hm:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_sj":{"unicode":"1f1f8-1f1ef","unicode_alternates":"","name":"svalbard and jan mayen","shortname":":flag_sj:","category":"flags","emoji_order":"1274","aliases":[":sj:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_um":{"unicode":"1f1fa-1f1f2","unicode_alternates":"","name":"united states minor outlying islands","shortname":":flag_um:","category":"flags","emoji_order":"1275","aliases":[":um:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ic":{"unicode":"1f1ee-1f1e8","unicode_alternates":"","name":"canary islands","shortname":":flag_ic:","category":"flags","emoji_order":"1276","aliases":[":ic:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ea":{"unicode":"1f1ea-1f1e6","unicode_alternates":"","name":"ceuta, melilla","shortname":":flag_ea:","category":"flags","emoji_order":"1277","aliases":[":ea:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_cp":{"unicode":"1f1e8-1f1f5","unicode_alternates":"","name":"clipperton island","shortname":":flag_cp:","category":"flags","emoji_order":"1278","aliases":[":cp:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_dg":{"unicode":"1f1e9-1f1ec","unicode_alternates":"","name":"diego garcia","shortname":":flag_dg:","category":"flags","emoji_order":"1279","aliases":[":dg:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_as":{"unicode":"1f1e6-1f1f8","unicode_alternates":"","name":"american samoa","shortname":":flag_as:","category":"flags","emoji_order":"1280","aliases":[":as:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_aq":{"unicode":"1f1e6-1f1f6","unicode_alternates":"","name":"antarctica","shortname":":flag_aq:","category":"flags","emoji_order":"1281","aliases":[":aq:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_vg":{"unicode":"1f1fb-1f1ec","unicode_alternates":"","name":"british virgin islands","shortname":":flag_vg:","category":"flags","emoji_order":"1282","aliases":[":vg:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ck":{"unicode":"1f1e8-1f1f0","unicode_alternates":"","name":"cook islands","shortname":":flag_ck:","category":"flags","emoji_order":"1283","aliases":[":ck:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_cw":{"unicode":"1f1e8-1f1fc","unicode_alternates":"","name":"cura\u00e7ao","shortname":":flag_cw:","category":"flags","emoji_order":"1284","aliases":[":cw:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_eu":{"unicode":"1f1ea-1f1fa","unicode_alternates":"","name":"european union","shortname":":flag_eu:","category":"flags","emoji_order":"1285","aliases":[":eu:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_gf":{"unicode":"1f1ec-1f1eb","unicode_alternates":"","name":"french guiana","shortname":":flag_gf:","category":"flags","emoji_order":"1286","aliases":[":gf:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_tf":{"unicode":"1f1f9-1f1eb","unicode_alternates":"","name":"french southern territories","shortname":":flag_tf:","category":"flags","emoji_order":"1287","aliases":[":tf:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_gp":{"unicode":"1f1ec-1f1f5","unicode_alternates":"","name":"guadeloupe","shortname":":flag_gp:","category":"flags","emoji_order":"1288","aliases":[":gp:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_mq":{"unicode":"1f1f2-1f1f6","unicode_alternates":"","name":"martinique","shortname":":flag_mq:","category":"flags","emoji_order":"1289","aliases":[":mq:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_mp":{"unicode":"1f1f2-1f1f5","unicode_alternates":"","name":"northern mariana islands","shortname":":flag_mp:","category":"flags","emoji_order":"1290","aliases":[":mp:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_sx":{"unicode":"1f1f8-1f1fd","unicode_alternates":"","name":"sint maarten","shortname":":flag_sx:","category":"flags","emoji_order":"1291","aliases":[":sx:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ss":{"unicode":"1f1f8-1f1f8","unicode_alternates":"","name":"south sudan","shortname":":flag_ss:","category":"flags","emoji_order":"1292","aliases":[":ss:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_tc":{"unicode":"1f1f9-1f1e8","unicode_alternates":"","name":"turks and caicos islands","shortname":":flag_tc:","category":"flags","emoji_order":"1293","aliases":[":tc:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_mf":{"unicode":"1f1f2-1f1eb","unicode_alternates":"","name":"saint martin","shortname":":flag_mf:","category":"flags","emoji_order":"1294","aliases":[":mf:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"raised_hands_tone1":{"unicode":"1f64c-1f3fb","unicode_alternates":"","name":"person raising both hands in celebration tone 1","shortname":":raised_hands_tone1:","category":"people","emoji_order":"1295","aliases":[],"aliases_ascii":[],"keywords":[]},"raised_hands_tone2":{"unicode":"1f64c-1f3fc","unicode_alternates":"","name":"person raising both hands in celebration tone 2","shortname":":raised_hands_tone2:","category":"people","emoji_order":"1296","aliases":[],"aliases_ascii":[],"keywords":[]},"raised_hands_tone3":{"unicode":"1f64c-1f3fd","unicode_alternates":"","name":"person raising both hands in celebration tone 3","shortname":":raised_hands_tone3:","category":"people","emoji_order":"1297","aliases":[],"aliases_ascii":[],"keywords":[]},"raised_hands_tone4":{"unicode":"1f64c-1f3fe","unicode_alternates":"","name":"person raising both hands in celebration tone 4","shortname":":raised_hands_tone4:","category":"people","emoji_order":"1298","aliases":[],"aliases_ascii":[],"keywords":[]},"raised_hands_tone5":{"unicode":"1f64c-1f3ff","unicode_alternates":"","name":"person raising both hands in celebration tone 5","shortname":":raised_hands_tone5:","category":"people","emoji_order":"1299","aliases":[],"aliases_ascii":[],"keywords":[]},"clap_tone1":{"unicode":"1f44f-1f3fb","unicode_alternates":"","name":"clapping hands sign tone 1","shortname":":clap_tone1:","category":"people","emoji_order":"1300","aliases":[],"aliases_ascii":[],"keywords":[]},"clap_tone2":{"unicode":"1f44f-1f3fc","unicode_alternates":"","name":"clapping hands sign tone 2","shortname":":clap_tone2:","category":"people","emoji_order":"1301","aliases":[],"aliases_ascii":[],"keywords":[]},"clap_tone3":{"unicode":"1f44f-1f3fd","unicode_alternates":"","name":"clapping hands sign tone 3","shortname":":clap_tone3:","category":"people","emoji_order":"1302","aliases":[],"aliases_ascii":[],"keywords":[]},"clap_tone4":{"unicode":"1f44f-1f3fe","unicode_alternates":"","name":"clapping hands sign tone 4","shortname":":clap_tone4:","category":"people","emoji_order":"1303","aliases":[],"aliases_ascii":[],"keywords":[]},"clap_tone5":{"unicode":"1f44f-1f3ff","unicode_alternates":"","name":"clapping hands sign tone 5","shortname":":clap_tone5:","category":"people","emoji_order":"1304","aliases":[],"aliases_ascii":[],"keywords":[]},"wave_tone1":{"unicode":"1f44b-1f3fb","unicode_alternates":"","name":"waving hand sign tone 1","shortname":":wave_tone1:","category":"people","emoji_order":"1305","aliases":[],"aliases_ascii":[],"keywords":[]},"wave_tone2":{"unicode":"1f44b-1f3fc","unicode_alternates":"","name":"waving hand sign tone 2","shortname":":wave_tone2:","category":"people","emoji_order":"1306","aliases":[],"aliases_ascii":[],"keywords":[]},"wave_tone3":{"unicode":"1f44b-1f3fd","unicode_alternates":"","name":"waving hand sign tone 3","shortname":":wave_tone3:","category":"people","emoji_order":"1307","aliases":[],"aliases_ascii":[],"keywords":[]},"wave_tone4":{"unicode":"1f44b-1f3fe","unicode_alternates":"","name":"waving hand sign tone 4","shortname":":wave_tone4:","category":"people","emoji_order":"1308","aliases":[],"aliases_ascii":[],"keywords":[]},"wave_tone5":{"unicode":"1f44b-1f3ff","unicode_alternates":"","name":"waving hand sign tone 5","shortname":":wave_tone5:","category":"people","emoji_order":"1309","aliases":[],"aliases_ascii":[],"keywords":[]},"thumbsup_tone1":{"unicode":"1f44d-1f3fb","unicode_alternates":"","name":"thumbs up sign tone 1","shortname":":thumbsup_tone1:","category":"people","emoji_order":"1310","aliases":[":+1_tone1:",":thumbup_tone1:"],"aliases_ascii":[],"keywords":[]},"thumbsup_tone2":{"unicode":"1f44d-1f3fc","unicode_alternates":"","name":"thumbs up sign tone 2","shortname":":thumbsup_tone2:","category":"people","emoji_order":"1311","aliases":[":+1_tone2:",":thumbup_tone2:"],"aliases_ascii":[],"keywords":[]},"thumbsup_tone3":{"unicode":"1f44d-1f3fd","unicode_alternates":"","name":"thumbs up sign tone 3","shortname":":thumbsup_tone3:","category":"people","emoji_order":"1312","aliases":[":+1_tone3:",":thumbup_tone3:"],"aliases_ascii":[],"keywords":[]},"thumbsup_tone4":{"unicode":"1f44d-1f3fe","unicode_alternates":"","name":"thumbs up sign tone 4","shortname":":thumbsup_tone4:","category":"people","emoji_order":"1313","aliases":[":+1_tone4:",":thumbup_tone4:"],"aliases_ascii":[],"keywords":[]},"thumbsup_tone5":{"unicode":"1f44d-1f3ff","unicode_alternates":"","name":"thumbs up sign tone 5","shortname":":thumbsup_tone5:","category":"people","emoji_order":"1314","aliases":[":+1_tone5:",":thumbup_tone5:"],"aliases_ascii":[],"keywords":[]},"thumbsdown_tone1":{"unicode":"1f44e-1f3fb","unicode_alternates":"","name":"thumbs down sign tone 1","shortname":":thumbsdown_tone1:","category":"people","emoji_order":"1315","aliases":[":-1_tone1:",":thumbdown_tone1:"],"aliases_ascii":[],"keywords":[]},"thumbsdown_tone2":{"unicode":"1f44e-1f3fc","unicode_alternates":"","name":"thumbs down sign tone 2","shortname":":thumbsdown_tone2:","category":"people","emoji_order":"1316","aliases":[":-1_tone2:",":thumbdown_tone2:"],"aliases_ascii":[],"keywords":[]},"thumbsdown_tone3":{"unicode":"1f44e-1f3fd","unicode_alternates":"","name":"thumbs down sign tone 3","shortname":":thumbsdown_tone3:","category":"people","emoji_order":"1317","aliases":[":-1_tone3:",":thumbdown_tone3:"],"aliases_ascii":[],"keywords":[]},"thumbsdown_tone4":{"unicode":"1f44e-1f3fe","unicode_alternates":"","name":"thumbs down sign tone 4","shortname":":thumbsdown_tone4:","category":"people","emoji_order":"1318","aliases":[":-1_tone4:",":thumbdown_tone4:"],"aliases_ascii":[],"keywords":[]},"thumbsdown_tone5":{"unicode":"1f44e-1f3ff","unicode_alternates":"","name":"thumbs down sign tone 5","shortname":":thumbsdown_tone5:","category":"people","emoji_order":"1319","aliases":[":-1_tone5:",":thumbdown_tone5:"],"aliases_ascii":[],"keywords":[]},"punch_tone1":{"unicode":"1f44a-1f3fb","unicode_alternates":"","name":"fisted hand sign tone 1","shortname":":punch_tone1:","category":"people","emoji_order":"1320","aliases":[],"aliases_ascii":[],"keywords":[]},"punch_tone2":{"unicode":"1f44a-1f3fc","unicode_alternates":"","name":"fisted hand sign tone 2","shortname":":punch_tone2:","category":"people","emoji_order":"1321","aliases":[],"aliases_ascii":[],"keywords":[]},"punch_tone3":{"unicode":"1f44a-1f3fd","unicode_alternates":"","name":"fisted hand sign tone 3","shortname":":punch_tone3:","category":"people","emoji_order":"1322","aliases":[],"aliases_ascii":[],"keywords":[]},"punch_tone4":{"unicode":"1f44a-1f3fe","unicode_alternates":"","name":"fisted hand sign tone 4","shortname":":punch_tone4:","category":"people","emoji_order":"1323","aliases":[],"aliases_ascii":[],"keywords":[]},"punch_tone5":{"unicode":"1f44a-1f3ff","unicode_alternates":"","name":"fisted hand sign tone 5","shortname":":punch_tone5:","category":"people","emoji_order":"1324","aliases":[],"aliases_ascii":[],"keywords":[]},"fist_tone1":{"unicode":"270a-1f3fb","unicode_alternates":"","name":"raised fist tone 1","shortname":":fist_tone1:","category":"people","emoji_order":"1325","aliases":[],"aliases_ascii":[],"keywords":[]},"fist_tone2":{"unicode":"270a-1f3fc","unicode_alternates":"","name":"raised fist tone 2","shortname":":fist_tone2:","category":"people","emoji_order":"1326","aliases":[],"aliases_ascii":[],"keywords":[]},"fist_tone3":{"unicode":"270a-1f3fd","unicode_alternates":"","name":"raised fist tone 3","shortname":":fist_tone3:","category":"people","emoji_order":"1327","aliases":[],"aliases_ascii":[],"keywords":[]},"fist_tone4":{"unicode":"270a-1f3fe","unicode_alternates":"","name":"raised fist tone 4","shortname":":fist_tone4:","category":"people","emoji_order":"1328","aliases":[],"aliases_ascii":[],"keywords":[]},"fist_tone5":{"unicode":"270a-1f3ff","unicode_alternates":"","name":"raised fist tone 5","shortname":":fist_tone5:","category":"people","emoji_order":"1329","aliases":[],"aliases_ascii":[],"keywords":[]},"v_tone1":{"unicode":"270c-1f3fb","unicode_alternates":"","name":"victory hand tone 1","shortname":":v_tone1:","category":"people","emoji_order":"1330","aliases":[],"aliases_ascii":[],"keywords":[]},"v_tone2":{"unicode":"270c-1f3fc","unicode_alternates":"","name":"victory hand tone 2","shortname":":v_tone2:","category":"people","emoji_order":"1331","aliases":[],"aliases_ascii":[],"keywords":[]},"v_tone3":{"unicode":"270c-1f3fd","unicode_alternates":"","name":"victory hand tone 3","shortname":":v_tone3:","category":"people","emoji_order":"1332","aliases":[],"aliases_ascii":[],"keywords":[]},"v_tone4":{"unicode":"270c-1f3fe","unicode_alternates":"","name":"victory hand tone 4","shortname":":v_tone4:","category":"people","emoji_order":"1333","aliases":[],"aliases_ascii":[],"keywords":[]},"v_tone5":{"unicode":"270c-1f3ff","unicode_alternates":"","name":"victory hand tone 5","shortname":":v_tone5:","category":"people","emoji_order":"1334","aliases":[],"aliases_ascii":[],"keywords":[]},"ok_hand_tone1":{"unicode":"1f44c-1f3fb","unicode_alternates":"","name":"ok hand sign tone 1","shortname":":ok_hand_tone1:","category":"people","emoji_order":"1335","aliases":[],"aliases_ascii":[],"keywords":[]},"ok_hand_tone2":{"unicode":"1f44c-1f3fc","unicode_alternates":"","name":"ok hand sign tone 2","shortname":":ok_hand_tone2:","category":"people","emoji_order":"1336","aliases":[],"aliases_ascii":[],"keywords":[]},"ok_hand_tone3":{"unicode":"1f44c-1f3fd","unicode_alternates":"","name":"ok hand sign tone 3","shortname":":ok_hand_tone3:","category":"people","emoji_order":"1337","aliases":[],"aliases_ascii":[],"keywords":[]},"ok_hand_tone4":{"unicode":"1f44c-1f3fe","unicode_alternates":"","name":"ok hand sign tone 4","shortname":":ok_hand_tone4:","category":"people","emoji_order":"1338","aliases":[],"aliases_ascii":[],"keywords":[]},"ok_hand_tone5":{"unicode":"1f44c-1f3ff","unicode_alternates":"","name":"ok hand sign tone 5","shortname":":ok_hand_tone5:","category":"people","emoji_order":"1339","aliases":[],"aliases_ascii":[],"keywords":[]},"raised_hand_tone1":{"unicode":"270b-1f3fb","unicode_alternates":"","name":"raised hand tone 1","shortname":":raised_hand_tone1:","category":"people","emoji_order":"1340","aliases":[],"aliases_ascii":[],"keywords":[]},"raised_hand_tone2":{"unicode":"270b-1f3fc","unicode_alternates":"","name":"raised hand tone 2","shortname":":raised_hand_tone2:","category":"people","emoji_order":"1341","aliases":[],"aliases_ascii":[],"keywords":[]},"raised_hand_tone3":{"unicode":"270b-1f3fd","unicode_alternates":"","name":"raised hand tone 3","shortname":":raised_hand_tone3:","category":"people","emoji_order":"1342","aliases":[],"aliases_ascii":[],"keywords":[]},"raised_hand_tone4":{"unicode":"270b-1f3fe","unicode_alternates":"","name":"raised hand tone 4","shortname":":raised_hand_tone4:","category":"people","emoji_order":"1343","aliases":[],"aliases_ascii":[],"keywords":[]},"raised_hand_tone5":{"unicode":"270b-1f3ff","unicode_alternates":"","name":"raised hand tone 5","shortname":":raised_hand_tone5:","category":"people","emoji_order":"1344","aliases":[],"aliases_ascii":[],"keywords":[]},"open_hands_tone1":{"unicode":"1f450-1f3fb","unicode_alternates":"","name":"open hands sign tone 1","shortname":":open_hands_tone1:","category":"people","emoji_order":"1345","aliases":[],"aliases_ascii":[],"keywords":[]},"open_hands_tone2":{"unicode":"1f450-1f3fc","unicode_alternates":"","name":"open hands sign tone 2","shortname":":open_hands_tone2:","category":"people","emoji_order":"1346","aliases":[],"aliases_ascii":[],"keywords":[]},"open_hands_tone3":{"unicode":"1f450-1f3fd","unicode_alternates":"","name":"open hands sign tone 3","shortname":":open_hands_tone3:","category":"people","emoji_order":"1347","aliases":[],"aliases_ascii":[],"keywords":[]},"open_hands_tone4":{"unicode":"1f450-1f3fe","unicode_alternates":"","name":"open hands sign tone 4","shortname":":open_hands_tone4:","category":"people","emoji_order":"1348","aliases":[],"aliases_ascii":[],"keywords":[]},"open_hands_tone5":{"unicode":"1f450-1f3ff","unicode_alternates":"","name":"open hands sign tone 5","shortname":":open_hands_tone5:","category":"people","emoji_order":"1349","aliases":[],"aliases_ascii":[],"keywords":[]},"muscle_tone1":{"unicode":"1f4aa-1f3fb","unicode_alternates":"","name":"flexed biceps tone 1","shortname":":muscle_tone1:","category":"people","emoji_order":"1350","aliases":[],"aliases_ascii":[],"keywords":[]},"muscle_tone2":{"unicode":"1f4aa-1f3fc","unicode_alternates":"","name":"flexed biceps tone 2","shortname":":muscle_tone2:","category":"people","emoji_order":"1351","aliases":[],"aliases_ascii":[],"keywords":[]},"muscle_tone3":{"unicode":"1f4aa-1f3fd","unicode_alternates":"","name":"flexed biceps tone 3","shortname":":muscle_tone3:","category":"people","emoji_order":"1352","aliases":[],"aliases_ascii":[],"keywords":[]},"muscle_tone4":{"unicode":"1f4aa-1f3fe","unicode_alternates":"","name":"flexed biceps tone 4","shortname":":muscle_tone4:","category":"people","emoji_order":"1353","aliases":[],"aliases_ascii":[],"keywords":[]},"muscle_tone5":{"unicode":"1f4aa-1f3ff","unicode_alternates":"","name":"flexed biceps tone 5","shortname":":muscle_tone5:","category":"people","emoji_order":"1354","aliases":[],"aliases_ascii":[],"keywords":[]},"pray_tone1":{"unicode":"1f64f-1f3fb","unicode_alternates":"","name":"person with folded hands tone 1","shortname":":pray_tone1:","category":"people","emoji_order":"1355","aliases":[],"aliases_ascii":[],"keywords":[]},"pray_tone2":{"unicode":"1f64f-1f3fc","unicode_alternates":"","name":"person with folded hands tone 2","shortname":":pray_tone2:","category":"people","emoji_order":"1356","aliases":[],"aliases_ascii":[],"keywords":[]},"pray_tone3":{"unicode":"1f64f-1f3fd","unicode_alternates":"","name":"person with folded hands tone 3","shortname":":pray_tone3:","category":"people","emoji_order":"1357","aliases":[],"aliases_ascii":[],"keywords":[]},"pray_tone4":{"unicode":"1f64f-1f3fe","unicode_alternates":"","name":"person with folded hands tone 4","shortname":":pray_tone4:","category":"people","emoji_order":"1358","aliases":[],"aliases_ascii":[],"keywords":[]},"pray_tone5":{"unicode":"1f64f-1f3ff","unicode_alternates":"","name":"person with folded hands tone 5","shortname":":pray_tone5:","category":"people","emoji_order":"1359","aliases":[],"aliases_ascii":[],"keywords":[]},"point_up_tone1":{"unicode":"261d-1f3fb","unicode_alternates":"","name":"white up pointing index tone 1","shortname":":point_up_tone1:","category":"people","emoji_order":"1360","aliases":[],"aliases_ascii":[],"keywords":[]},"point_up_tone2":{"unicode":"261d-1f3fc","unicode_alternates":"","name":"white up pointing index tone 2","shortname":":point_up_tone2:","category":"people","emoji_order":"1361","aliases":[],"aliases_ascii":[],"keywords":[]},"point_up_tone3":{"unicode":"261d-1f3fd","unicode_alternates":"","name":"white up pointing index tone 3","shortname":":point_up_tone3:","category":"people","emoji_order":"1362","aliases":[],"aliases_ascii":[],"keywords":[]},"point_up_tone4":{"unicode":"261d-1f3fe","unicode_alternates":"","name":"white up pointing index tone 4","shortname":":point_up_tone4:","category":"people","emoji_order":"1363","aliases":[],"aliases_ascii":[],"keywords":[]},"point_up_tone5":{"unicode":"261d-1f3ff","unicode_alternates":"","name":"white up pointing index tone 5","shortname":":point_up_tone5:","category":"people","emoji_order":"1364","aliases":[],"aliases_ascii":[],"keywords":[]},"point_up_2_tone1":{"unicode":"1f446-1f3fb","unicode_alternates":"","name":"white up pointing backhand index tone 1","shortname":":point_up_2_tone1:","category":"people","emoji_order":"1365","aliases":[],"aliases_ascii":[],"keywords":[]},"point_up_2_tone2":{"unicode":"1f446-1f3fc","unicode_alternates":"","name":"white up pointing backhand index tone 2","shortname":":point_up_2_tone2:","category":"people","emoji_order":"1366","aliases":[],"aliases_ascii":[],"keywords":[]},"point_up_2_tone3":{"unicode":"1f446-1f3fd","unicode_alternates":"","name":"white up pointing backhand index tone 3","shortname":":point_up_2_tone3:","category":"people","emoji_order":"1367","aliases":[],"aliases_ascii":[],"keywords":[]},"point_up_2_tone4":{"unicode":"1f446-1f3fe","unicode_alternates":"","name":"white up pointing backhand index tone 4","shortname":":point_up_2_tone4:","category":"people","emoji_order":"1368","aliases":[],"aliases_ascii":[],"keywords":[]},"point_up_2_tone5":{"unicode":"1f446-1f3ff","unicode_alternates":"","name":"white up pointing backhand index tone 5","shortname":":point_up_2_tone5:","category":"people","emoji_order":"1369","aliases":[],"aliases_ascii":[],"keywords":[]},"point_down_tone1":{"unicode":"1f447-1f3fb","unicode_alternates":"","name":"white down pointing backhand index tone 1","shortname":":point_down_tone1:","category":"people","emoji_order":"1370","aliases":[],"aliases_ascii":[],"keywords":[]},"point_down_tone2":{"unicode":"1f447-1f3fc","unicode_alternates":"","name":"white down pointing backhand index tone 2","shortname":":point_down_tone2:","category":"people","emoji_order":"1371","aliases":[],"aliases_ascii":[],"keywords":[]},"point_down_tone3":{"unicode":"1f447-1f3fd","unicode_alternates":"","name":"white down pointing backhand index tone 3","shortname":":point_down_tone3:","category":"people","emoji_order":"1372","aliases":[],"aliases_ascii":[],"keywords":[]},"point_down_tone4":{"unicode":"1f447-1f3fe","unicode_alternates":"","name":"white down pointing backhand index tone 4","shortname":":point_down_tone4:","category":"people","emoji_order":"1373","aliases":[],"aliases_ascii":[],"keywords":[]},"point_down_tone5":{"unicode":"1f447-1f3ff","unicode_alternates":"","name":"white down pointing backhand index tone 5","shortname":":point_down_tone5:","category":"people","emoji_order":"1374","aliases":[],"aliases_ascii":[],"keywords":[]},"point_left_tone1":{"unicode":"1f448-1f3fb","unicode_alternates":"","name":"white left pointing backhand index tone 1","shortname":":point_left_tone1:","category":"people","emoji_order":"1375","aliases":[],"aliases_ascii":[],"keywords":[]},"point_left_tone2":{"unicode":"1f448-1f3fc","unicode_alternates":"","name":"white left pointing backhand index tone 2","shortname":":point_left_tone2:","category":"people","emoji_order":"1376","aliases":[],"aliases_ascii":[],"keywords":[]},"point_left_tone3":{"unicode":"1f448-1f3fd","unicode_alternates":"","name":"white left pointing backhand index tone 3","shortname":":point_left_tone3:","category":"people","emoji_order":"1377","aliases":[],"aliases_ascii":[],"keywords":[]},"point_left_tone4":{"unicode":"1f448-1f3fe","unicode_alternates":"","name":"white left pointing backhand index tone 4","shortname":":point_left_tone4:","category":"people","emoji_order":"1378","aliases":[],"aliases_ascii":[],"keywords":[]},"point_left_tone5":{"unicode":"1f448-1f3ff","unicode_alternates":"","name":"white left pointing backhand index tone 5","shortname":":point_left_tone5:","category":"people","emoji_order":"1379","aliases":[],"aliases_ascii":[],"keywords":[]},"point_right_tone1":{"unicode":"1f449-1f3fb","unicode_alternates":"","name":"white right pointing backhand index tone 1","shortname":":point_right_tone1:","category":"people","emoji_order":"1380","aliases":[],"aliases_ascii":[],"keywords":[]},"point_right_tone2":{"unicode":"1f449-1f3fc","unicode_alternates":"","name":"white right pointing backhand index tone 2","shortname":":point_right_tone2:","category":"people","emoji_order":"1381","aliases":[],"aliases_ascii":[],"keywords":[]},"point_right_tone3":{"unicode":"1f449-1f3fd","unicode_alternates":"","name":"white right pointing backhand index tone 3","shortname":":point_right_tone3:","category":"people","emoji_order":"1382","aliases":[],"aliases_ascii":[],"keywords":[]},"point_right_tone4":{"unicode":"1f449-1f3fe","unicode_alternates":"","name":"white right pointing backhand index tone 4","shortname":":point_right_tone4:","category":"people","emoji_order":"1383","aliases":[],"aliases_ascii":[],"keywords":[]},"point_right_tone5":{"unicode":"1f449-1f3ff","unicode_alternates":"","name":"white right pointing backhand index tone 5","shortname":":point_right_tone5:","category":"people","emoji_order":"1384","aliases":[],"aliases_ascii":[],"keywords":[]},"middle_finger_tone1":{"unicode":"1f595-1f3fb","unicode_alternates":"","name":"reversed hand with middle finger extended tone 1","shortname":":middle_finger_tone1:","category":"people","emoji_order":"1385","aliases":[":reversed_hand_with_middle_finger_extended_tone1:"],"aliases_ascii":[],"keywords":[]},"middle_finger_tone2":{"unicode":"1f595-1f3fc","unicode_alternates":"","name":"reversed hand with middle finger extended tone 2","shortname":":middle_finger_tone2:","category":"people","emoji_order":"1386","aliases":[":reversed_hand_with_middle_finger_extended_tone2:"],"aliases_ascii":[],"keywords":[]},"middle_finger_tone3":{"unicode":"1f595-1f3fd","unicode_alternates":"","name":"reversed hand with middle finger extended tone 3","shortname":":middle_finger_tone3:","category":"people","emoji_order":"1387","aliases":[":reversed_hand_with_middle_finger_extended_tone3:"],"aliases_ascii":[],"keywords":[]},"middle_finger_tone4":{"unicode":"1f595-1f3fe","unicode_alternates":"","name":"reversed hand with middle finger extended tone 4","shortname":":middle_finger_tone4:","category":"people","emoji_order":"1388","aliases":[":reversed_hand_with_middle_finger_extended_tone4:"],"aliases_ascii":[],"keywords":[]},"middle_finger_tone5":{"unicode":"1f595-1f3ff","unicode_alternates":"","name":"reversed hand with middle finger extended tone 5","shortname":":middle_finger_tone5:","category":"people","emoji_order":"1389","aliases":[":reversed_hand_with_middle_finger_extended_tone5:"],"aliases_ascii":[],"keywords":[]},"hand_splayed_tone1":{"unicode":"1f590-1f3fb","unicode_alternates":"","name":"raised hand with fingers splayed tone 1","shortname":":hand_splayed_tone1:","category":"people","emoji_order":"1390","aliases":[":raised_hand_with_fingers_splayed_tone1:"],"aliases_ascii":[],"keywords":[]},"hand_splayed_tone2":{"unicode":"1f590-1f3fc","unicode_alternates":"","name":"raised hand with fingers splayed tone 2","shortname":":hand_splayed_tone2:","category":"people","emoji_order":"1391","aliases":[":raised_hand_with_fingers_splayed_tone2:"],"aliases_ascii":[],"keywords":[]},"hand_splayed_tone3":{"unicode":"1f590-1f3fd","unicode_alternates":"","name":"raised hand with fingers splayed tone 3","shortname":":hand_splayed_tone3:","category":"people","emoji_order":"1392","aliases":[":raised_hand_with_fingers_splayed_tone3:"],"aliases_ascii":[],"keywords":[]},"hand_splayed_tone4":{"unicode":"1f590-1f3fe","unicode_alternates":"","name":"raised hand with fingers splayed tone 4","shortname":":hand_splayed_tone4:","category":"people","emoji_order":"1393","aliases":[":raised_hand_with_fingers_splayed_tone4:"],"aliases_ascii":[],"keywords":[]},"hand_splayed_tone5":{"unicode":"1f590-1f3ff","unicode_alternates":"","name":"raised hand with fingers splayed tone 5","shortname":":hand_splayed_tone5:","category":"people","emoji_order":"1394","aliases":[":raised_hand_with_fingers_splayed_tone5:"],"aliases_ascii":[],"keywords":[]},"metal_tone1":{"unicode":"1f918-1f3fb","unicode_alternates":"","name":"sign of the horns tone 1","shortname":":metal_tone1:","category":"people","emoji_order":"1395","aliases":[":sign_of_the_horns_tone1:"],"aliases_ascii":[],"keywords":[]},"metal_tone2":{"unicode":"1f918-1f3fc","unicode_alternates":"","name":"sign of the horns tone 2","shortname":":metal_tone2:","category":"people","emoji_order":"1396","aliases":[":sign_of_the_horns_tone2:"],"aliases_ascii":[],"keywords":[]},"metal_tone3":{"unicode":"1f918-1f3fd","unicode_alternates":"","name":"sign of the horns tone 3","shortname":":metal_tone3:","category":"people","emoji_order":"1397","aliases":[":sign_of_the_horns_tone3:"],"aliases_ascii":[],"keywords":[]},"metal_tone4":{"unicode":"1f918-1f3fe","unicode_alternates":"","name":"sign of the horns tone 4","shortname":":metal_tone4:","category":"people","emoji_order":"1398","aliases":[":sign_of_the_horns_tone4:"],"aliases_ascii":[],"keywords":[]},"metal_tone5":{"unicode":"1f918-1f3ff","unicode_alternates":"","name":"sign of the horns tone 5","shortname":":metal_tone5:","category":"people","emoji_order":"1399","aliases":[":sign_of_the_horns_tone5:"],"aliases_ascii":[],"keywords":[]},"vulcan_tone1":{"unicode":"1f596-1f3fb","unicode_alternates":"","name":"raised hand with part between middle and ring fingers tone 1","shortname":":vulcan_tone1:","category":"people","emoji_order":"1400","aliases":[":raised_hand_with_part_between_middle_and_ring_fingers_tone1:"],"aliases_ascii":[],"keywords":[]},"vulcan_tone2":{"unicode":"1f596-1f3fc","unicode_alternates":"","name":"raised hand with part between middle and ring fingers tone 2","shortname":":vulcan_tone2:","category":"people","emoji_order":"1401","aliases":[":raised_hand_with_part_between_middle_and_ring_fingers_tone2:"],"aliases_ascii":[],"keywords":[]},"vulcan_tone3":{"unicode":"1f596-1f3fd","unicode_alternates":"","name":"raised hand with part between middle and ring fingers tone 3","shortname":":vulcan_tone3:","category":"people","emoji_order":"1402","aliases":[":raised_hand_with_part_between_middle_and_ring_fingers_tone3:"],"aliases_ascii":[],"keywords":[]},"vulcan_tone4":{"unicode":"1f596-1f3fe","unicode_alternates":"","name":"raised hand with part between middle and ring fingers tone 4","shortname":":vulcan_tone4:","category":"people","emoji_order":"1403","aliases":[":raised_hand_with_part_between_middle_and_ring_fingers_tone4:"],"aliases_ascii":[],"keywords":[]},"vulcan_tone5":{"unicode":"1f596-1f3ff","unicode_alternates":"","name":"raised hand with part between middle and ring fingers tone 5","shortname":":vulcan_tone5:","category":"people","emoji_order":"1404","aliases":[":raised_hand_with_part_between_middle_and_ring_fingers_tone5:"],"aliases_ascii":[],"keywords":[]},"writing_hand_tone1":{"unicode":"270d-1f3fb","unicode_alternates":"","name":"writing hand tone 1","shortname":":writing_hand_tone1:","category":"people","emoji_order":"1405","aliases":[],"aliases_ascii":[],"keywords":[]},"writing_hand_tone2":{"unicode":"270d-1f3fc","unicode_alternates":"","name":"writing hand tone 2","shortname":":writing_hand_tone2:","category":"people","emoji_order":"1406","aliases":[],"aliases_ascii":[],"keywords":[]},"writing_hand_tone3":{"unicode":"270d-1f3fd","unicode_alternates":"","name":"writing hand tone 3","shortname":":writing_hand_tone3:","category":"people","emoji_order":"1407","aliases":[],"aliases_ascii":[],"keywords":[]},"writing_hand_tone4":{"unicode":"270d-1f3fe","unicode_alternates":"","name":"writing hand tone 4","shortname":":writing_hand_tone4:","category":"people","emoji_order":"1408","aliases":[],"aliases_ascii":[],"keywords":[]},"writing_hand_tone5":{"unicode":"270d-1f3ff","unicode_alternates":"","name":"writing hand tone 5","shortname":":writing_hand_tone5:","category":"people","emoji_order":"1409","aliases":[],"aliases_ascii":[],"keywords":[]},"nail_care_tone1":{"unicode":"1f485-1f3fb","unicode_alternates":"","name":"nail polish tone 1","shortname":":nail_care_tone1:","category":"people","emoji_order":"1410","aliases":[],"aliases_ascii":[],"keywords":[]},"nail_care_tone2":{"unicode":"1f485-1f3fc","unicode_alternates":"","name":"nail polish tone 2","shortname":":nail_care_tone2:","category":"people","emoji_order":"1411","aliases":[],"aliases_ascii":[],"keywords":[]},"nail_care_tone3":{"unicode":"1f485-1f3fd","unicode_alternates":"","name":"nail polish tone 3","shortname":":nail_care_tone3:","category":"people","emoji_order":"1412","aliases":[],"aliases_ascii":[],"keywords":[]},"nail_care_tone4":{"unicode":"1f485-1f3fe","unicode_alternates":"","name":"nail polish tone 4","shortname":":nail_care_tone4:","category":"people","emoji_order":"1413","aliases":[],"aliases_ascii":[],"keywords":[]},"nail_care_tone5":{"unicode":"1f485-1f3ff","unicode_alternates":"","name":"nail polish tone 5","shortname":":nail_care_tone5:","category":"people","emoji_order":"1414","aliases":[],"aliases_ascii":[],"keywords":[]},"ear_tone1":{"unicode":"1f442-1f3fb","unicode_alternates":"","name":"ear tone 1","shortname":":ear_tone1:","category":"people","emoji_order":"1415","aliases":[],"aliases_ascii":[],"keywords":[]},"ear_tone2":{"unicode":"1f442-1f3fc","unicode_alternates":"","name":"ear tone 2","shortname":":ear_tone2:","category":"people","emoji_order":"1416","aliases":[],"aliases_ascii":[],"keywords":[]},"ear_tone3":{"unicode":"1f442-1f3fd","unicode_alternates":"","name":"ear tone 3","shortname":":ear_tone3:","category":"people","emoji_order":"1417","aliases":[],"aliases_ascii":[],"keywords":[]},"ear_tone4":{"unicode":"1f442-1f3fe","unicode_alternates":"","name":"ear tone 4","shortname":":ear_tone4:","category":"people","emoji_order":"1418","aliases":[],"aliases_ascii":[],"keywords":[]},"ear_tone5":{"unicode":"1f442-1f3ff","unicode_alternates":"","name":"ear tone 5","shortname":":ear_tone5:","category":"people","emoji_order":"1419","aliases":[],"aliases_ascii":[],"keywords":[]},"nose_tone1":{"unicode":"1f443-1f3fb","unicode_alternates":"","name":"nose tone 1","shortname":":nose_tone1:","category":"people","emoji_order":"1420","aliases":[],"aliases_ascii":[],"keywords":[]},"nose_tone2":{"unicode":"1f443-1f3fc","unicode_alternates":"","name":"nose tone 2","shortname":":nose_tone2:","category":"people","emoji_order":"1421","aliases":[],"aliases_ascii":[],"keywords":[]},"nose_tone3":{"unicode":"1f443-1f3fd","unicode_alternates":"","name":"nose tone 3","shortname":":nose_tone3:","category":"people","emoji_order":"1422","aliases":[],"aliases_ascii":[],"keywords":[]},"nose_tone4":{"unicode":"1f443-1f3fe","unicode_alternates":"","name":"nose tone 4","shortname":":nose_tone4:","category":"people","emoji_order":"1423","aliases":[],"aliases_ascii":[],"keywords":[]},"nose_tone5":{"unicode":"1f443-1f3ff","unicode_alternates":"","name":"nose tone 5","shortname":":nose_tone5:","category":"people","emoji_order":"1424","aliases":[],"aliases_ascii":[],"keywords":[]},"baby_tone1":{"unicode":"1f476-1f3fb","unicode_alternates":"","name":"baby tone 1","shortname":":baby_tone1:","category":"people","emoji_order":"1425","aliases":[],"aliases_ascii":[],"keywords":[]},"baby_tone2":{"unicode":"1f476-1f3fc","unicode_alternates":"","name":"baby tone 2","shortname":":baby_tone2:","category":"people","emoji_order":"1426","aliases":[],"aliases_ascii":[],"keywords":[]},"baby_tone3":{"unicode":"1f476-1f3fd","unicode_alternates":"","name":"baby tone 3","shortname":":baby_tone3:","category":"people","emoji_order":"1427","aliases":[],"aliases_ascii":[],"keywords":[]},"baby_tone4":{"unicode":"1f476-1f3fe","unicode_alternates":"","name":"baby tone 4","shortname":":baby_tone4:","category":"people","emoji_order":"1428","aliases":[],"aliases_ascii":[],"keywords":[]},"baby_tone5":{"unicode":"1f476-1f3ff","unicode_alternates":"","name":"baby tone 5","shortname":":baby_tone5:","category":"people","emoji_order":"1429","aliases":[],"aliases_ascii":[],"keywords":[]},"boy_tone1":{"unicode":"1f466-1f3fb","unicode_alternates":"","name":"boy tone 1","shortname":":boy_tone1:","category":"people","emoji_order":"1430","aliases":[],"aliases_ascii":[],"keywords":[]},"boy_tone2":{"unicode":"1f466-1f3fc","unicode_alternates":"","name":"boy tone 2","shortname":":boy_tone2:","category":"people","emoji_order":"1431","aliases":[],"aliases_ascii":[],"keywords":[]},"boy_tone3":{"unicode":"1f466-1f3fd","unicode_alternates":"","name":"boy tone 3","shortname":":boy_tone3:","category":"people","emoji_order":"1432","aliases":[],"aliases_ascii":[],"keywords":[]},"boy_tone4":{"unicode":"1f466-1f3fe","unicode_alternates":"","name":"boy tone 4","shortname":":boy_tone4:","category":"people","emoji_order":"1433","aliases":[],"aliases_ascii":[],"keywords":[]},"boy_tone5":{"unicode":"1f466-1f3ff","unicode_alternates":"","name":"boy tone 5","shortname":":boy_tone5:","category":"people","emoji_order":"1434","aliases":[],"aliases_ascii":[],"keywords":[]},"girl_tone1":{"unicode":"1f467-1f3fb","unicode_alternates":"","name":"girl tone 1","shortname":":girl_tone1:","category":"people","emoji_order":"1435","aliases":[],"aliases_ascii":[],"keywords":[]},"girl_tone2":{"unicode":"1f467-1f3fc","unicode_alternates":"","name":"girl tone 2","shortname":":girl_tone2:","category":"people","emoji_order":"1436","aliases":[],"aliases_ascii":[],"keywords":[]},"girl_tone3":{"unicode":"1f467-1f3fd","unicode_alternates":"","name":"girl tone 3","shortname":":girl_tone3:","category":"people","emoji_order":"1437","aliases":[],"aliases_ascii":[],"keywords":[]},"girl_tone4":{"unicode":"1f467-1f3fe","unicode_alternates":"","name":"girl tone 4","shortname":":girl_tone4:","category":"people","emoji_order":"1438","aliases":[],"aliases_ascii":[],"keywords":[]},"girl_tone5":{"unicode":"1f467-1f3ff","unicode_alternates":"","name":"girl tone 5","shortname":":girl_tone5:","category":"people","emoji_order":"1439","aliases":[],"aliases_ascii":[],"keywords":[]},"man_tone1":{"unicode":"1f468-1f3fb","unicode_alternates":"","name":"man tone 1","shortname":":man_tone1:","category":"people","emoji_order":"1440","aliases":[],"aliases_ascii":[],"keywords":[]},"man_tone2":{"unicode":"1f468-1f3fc","unicode_alternates":"","name":"man tone 2","shortname":":man_tone2:","category":"people","emoji_order":"1441","aliases":[],"aliases_ascii":[],"keywords":[]},"man_tone3":{"unicode":"1f468-1f3fd","unicode_alternates":"","name":"man tone 3","shortname":":man_tone3:","category":"people","emoji_order":"1442","aliases":[],"aliases_ascii":[],"keywords":[]},"man_tone4":{"unicode":"1f468-1f3fe","unicode_alternates":"","name":"man tone 4","shortname":":man_tone4:","category":"people","emoji_order":"1443","aliases":[],"aliases_ascii":[],"keywords":[]},"man_tone5":{"unicode":"1f468-1f3ff","unicode_alternates":"","name":"man tone 5","shortname":":man_tone5:","category":"people","emoji_order":"1444","aliases":[],"aliases_ascii":[],"keywords":[]},"woman_tone1":{"unicode":"1f469-1f3fb","unicode_alternates":"","name":"woman tone 1","shortname":":woman_tone1:","category":"people","emoji_order":"1445","aliases":[],"aliases_ascii":[],"keywords":[]},"woman_tone2":{"unicode":"1f469-1f3fc","unicode_alternates":"","name":"woman tone 2","shortname":":woman_tone2:","category":"people","emoji_order":"1446","aliases":[],"aliases_ascii":[],"keywords":[]},"woman_tone3":{"unicode":"1f469-1f3fd","unicode_alternates":"","name":"woman tone 3","shortname":":woman_tone3:","category":"people","emoji_order":"1447","aliases":[],"aliases_ascii":[],"keywords":[]},"woman_tone4":{"unicode":"1f469-1f3fe","unicode_alternates":"","name":"woman tone 4","shortname":":woman_tone4:","category":"people","emoji_order":"1448","aliases":[],"aliases_ascii":[],"keywords":[]},"woman_tone5":{"unicode":"1f469-1f3ff","unicode_alternates":"","name":"woman tone 5","shortname":":woman_tone5:","category":"people","emoji_order":"1449","aliases":[],"aliases_ascii":[],"keywords":[]},"person_with_blond_hair_tone1":{"unicode":"1f471-1f3fb","unicode_alternates":"","name":"person with blond hair tone 1","shortname":":person_with_blond_hair_tone1:","category":"people","emoji_order":"1450","aliases":[],"aliases_ascii":[],"keywords":[]},"person_with_blond_hair_tone2":{"unicode":"1f471-1f3fc","unicode_alternates":"","name":"person with blond hair tone 2","shortname":":person_with_blond_hair_tone2:","category":"people","emoji_order":"1451","aliases":[],"aliases_ascii":[],"keywords":[]},"person_with_blond_hair_tone3":{"unicode":"1f471-1f3fd","unicode_alternates":"","name":"person with blond hair tone 3","shortname":":person_with_blond_hair_tone3:","category":"people","emoji_order":"1452","aliases":[],"aliases_ascii":[],"keywords":[]},"person_with_blond_hair_tone4":{"unicode":"1f471-1f3fe","unicode_alternates":"","name":"person with blond hair tone 4","shortname":":person_with_blond_hair_tone4:","category":"people","emoji_order":"1453","aliases":[],"aliases_ascii":[],"keywords":[]},"person_with_blond_hair_tone5":{"unicode":"1f471-1f3ff","unicode_alternates":"","name":"person with blond hair tone 5","shortname":":person_with_blond_hair_tone5:","category":"people","emoji_order":"1454","aliases":[],"aliases_ascii":[],"keywords":[]},"older_man_tone1":{"unicode":"1f474-1f3fb","unicode_alternates":"","name":"older man tone 1","shortname":":older_man_tone1:","category":"people","emoji_order":"1455","aliases":[],"aliases_ascii":[],"keywords":[]},"older_man_tone2":{"unicode":"1f474-1f3fc","unicode_alternates":"","name":"older man tone 2","shortname":":older_man_tone2:","category":"people","emoji_order":"1456","aliases":[],"aliases_ascii":[],"keywords":[]},"older_man_tone3":{"unicode":"1f474-1f3fd","unicode_alternates":"","name":"older man tone 3","shortname":":older_man_tone3:","category":"people","emoji_order":"1457","aliases":[],"aliases_ascii":[],"keywords":[]},"older_man_tone4":{"unicode":"1f474-1f3fe","unicode_alternates":"","name":"older man tone 4","shortname":":older_man_tone4:","category":"people","emoji_order":"1458","aliases":[],"aliases_ascii":[],"keywords":[]},"older_man_tone5":{"unicode":"1f474-1f3ff","unicode_alternates":"","name":"older man tone 5","shortname":":older_man_tone5:","category":"people","emoji_order":"1459","aliases":[],"aliases_ascii":[],"keywords":[]},"older_woman_tone1":{"unicode":"1f475-1f3fb","unicode_alternates":"","name":"older woman tone 1","shortname":":older_woman_tone1:","category":"people","emoji_order":"1460","aliases":[":grandma_tone1:"],"aliases_ascii":[],"keywords":[]},"older_woman_tone2":{"unicode":"1f475-1f3fc","unicode_alternates":"","name":"older woman tone 2","shortname":":older_woman_tone2:","category":"people","emoji_order":"1461","aliases":[":grandma_tone2:"],"aliases_ascii":[],"keywords":[]},"older_woman_tone3":{"unicode":"1f475-1f3fd","unicode_alternates":"","name":"older woman tone 3","shortname":":older_woman_tone3:","category":"people","emoji_order":"1462","aliases":[":grandma_tone3:"],"aliases_ascii":[],"keywords":[]},"older_woman_tone4":{"unicode":"1f475-1f3fe","unicode_alternates":"","name":"older woman tone 4","shortname":":older_woman_tone4:","category":"people","emoji_order":"1463","aliases":[":grandma_tone4:"],"aliases_ascii":[],"keywords":[]},"older_woman_tone5":{"unicode":"1f475-1f3ff","unicode_alternates":"","name":"older woman tone 5","shortname":":older_woman_tone5:","category":"people","emoji_order":"1464","aliases":[":grandma_tone5:"],"aliases_ascii":[],"keywords":[]},"man_with_gua_pi_mao_tone1":{"unicode":"1f472-1f3fb","unicode_alternates":"","name":"man with gua pi mao tone 1","shortname":":man_with_gua_pi_mao_tone1:","category":"people","emoji_order":"1465","aliases":[],"aliases_ascii":[],"keywords":[]},"man_with_gua_pi_mao_tone2":{"unicode":"1f472-1f3fc","unicode_alternates":"","name":"man with gua pi mao tone 2","shortname":":man_with_gua_pi_mao_tone2:","category":"people","emoji_order":"1466","aliases":[],"aliases_ascii":[],"keywords":[]},"man_with_gua_pi_mao_tone3":{"unicode":"1f472-1f3fd","unicode_alternates":"","name":"man with gua pi mao tone 3","shortname":":man_with_gua_pi_mao_tone3:","category":"people","emoji_order":"1467","aliases":[],"aliases_ascii":[],"keywords":[]},"man_with_gua_pi_mao_tone4":{"unicode":"1f472-1f3fe","unicode_alternates":"","name":"man with gua pi mao tone 4","shortname":":man_with_gua_pi_mao_tone4:","category":"people","emoji_order":"1468","aliases":[],"aliases_ascii":[],"keywords":[]},"man_with_gua_pi_mao_tone5":{"unicode":"1f472-1f3ff","unicode_alternates":"","name":"man with gua pi mao tone 5","shortname":":man_with_gua_pi_mao_tone5:","category":"people","emoji_order":"1469","aliases":[],"aliases_ascii":[],"keywords":[]},"man_with_turban_tone1":{"unicode":"1f473-1f3fb","unicode_alternates":"","name":"man with turban tone 1","shortname":":man_with_turban_tone1:","category":"people","emoji_order":"1470","aliases":[],"aliases_ascii":[],"keywords":[]},"man_with_turban_tone2":{"unicode":"1f473-1f3fc","unicode_alternates":"","name":"man with turban tone 2","shortname":":man_with_turban_tone2:","category":"people","emoji_order":"1471","aliases":[],"aliases_ascii":[],"keywords":[]},"man_with_turban_tone3":{"unicode":"1f473-1f3fd","unicode_alternates":"","name":"man with turban tone 3","shortname":":man_with_turban_tone3:","category":"people","emoji_order":"1472","aliases":[],"aliases_ascii":[],"keywords":[]},"man_with_turban_tone4":{"unicode":"1f473-1f3fe","unicode_alternates":"","name":"man with turban tone 4","shortname":":man_with_turban_tone4:","category":"people","emoji_order":"1473","aliases":[],"aliases_ascii":[],"keywords":[]},"man_with_turban_tone5":{"unicode":"1f473-1f3ff","unicode_alternates":"","name":"man with turban tone 5","shortname":":man_with_turban_tone5:","category":"people","emoji_order":"1474","aliases":[],"aliases_ascii":[],"keywords":[]},"cop_tone1":{"unicode":"1f46e-1f3fb","unicode_alternates":"","name":"police officer tone 1","shortname":":cop_tone1:","category":"people","emoji_order":"1475","aliases":[],"aliases_ascii":[],"keywords":[]},"cop_tone2":{"unicode":"1f46e-1f3fc","unicode_alternates":"","name":"police officer tone 2","shortname":":cop_tone2:","category":"people","emoji_order":"1476","aliases":[],"aliases_ascii":[],"keywords":[]},"cop_tone3":{"unicode":"1f46e-1f3fd","unicode_alternates":"","name":"police officer tone 3","shortname":":cop_tone3:","category":"people","emoji_order":"1477","aliases":[],"aliases_ascii":[],"keywords":[]},"cop_tone4":{"unicode":"1f46e-1f3fe","unicode_alternates":"","name":"police officer tone 4","shortname":":cop_tone4:","category":"people","emoji_order":"1478","aliases":[],"aliases_ascii":[],"keywords":[]},"cop_tone5":{"unicode":"1f46e-1f3ff","unicode_alternates":"","name":"police officer tone 5","shortname":":cop_tone5:","category":"people","emoji_order":"1479","aliases":[],"aliases_ascii":[],"keywords":[]},"construction_worker_tone1":{"unicode":"1f477-1f3fb","unicode_alternates":"","name":"construction worker tone 1","shortname":":construction_worker_tone1:","category":"people","emoji_order":"1480","aliases":[],"aliases_ascii":[],"keywords":[]},"construction_worker_tone2":{"unicode":"1f477-1f3fc","unicode_alternates":"","name":"construction worker tone 2","shortname":":construction_worker_tone2:","category":"people","emoji_order":"1481","aliases":[],"aliases_ascii":[],"keywords":[]},"construction_worker_tone3":{"unicode":"1f477-1f3fd","unicode_alternates":"","name":"construction worker tone 3","shortname":":construction_worker_tone3:","category":"people","emoji_order":"1482","aliases":[],"aliases_ascii":[],"keywords":[]},"construction_worker_tone4":{"unicode":"1f477-1f3fe","unicode_alternates":"","name":"construction worker tone 4","shortname":":construction_worker_tone4:","category":"people","emoji_order":"1483","aliases":[],"aliases_ascii":[],"keywords":[]},"construction_worker_tone5":{"unicode":"1f477-1f3ff","unicode_alternates":"","name":"construction worker tone 5","shortname":":construction_worker_tone5:","category":"people","emoji_order":"1484","aliases":[],"aliases_ascii":[],"keywords":[]},"guardsman_tone1":{"unicode":"1f482-1f3fb","unicode_alternates":"","name":"guardsman tone 1","shortname":":guardsman_tone1:","category":"people","emoji_order":"1485","aliases":[],"aliases_ascii":[],"keywords":[]},"guardsman_tone2":{"unicode":"1f482-1f3fc","unicode_alternates":"","name":"guardsman tone 2","shortname":":guardsman_tone2:","category":"people","emoji_order":"1486","aliases":[],"aliases_ascii":[],"keywords":[]},"guardsman_tone3":{"unicode":"1f482-1f3fd","unicode_alternates":"","name":"guardsman tone 3","shortname":":guardsman_tone3:","category":"people","emoji_order":"1487","aliases":[],"aliases_ascii":[],"keywords":[]},"guardsman_tone4":{"unicode":"1f482-1f3fe","unicode_alternates":"","name":"guardsman tone 4","shortname":":guardsman_tone4:","category":"people","emoji_order":"1488","aliases":[],"aliases_ascii":[],"keywords":[]},"guardsman_tone5":{"unicode":"1f482-1f3ff","unicode_alternates":"","name":"guardsman tone 5","shortname":":guardsman_tone5:","category":"people","emoji_order":"1489","aliases":[],"aliases_ascii":[],"keywords":[]},"santa_tone1":{"unicode":"1f385-1f3fb","unicode_alternates":"","name":"father christmas tone 1","shortname":":santa_tone1:","category":"people","emoji_order":"1490","aliases":[],"aliases_ascii":[],"keywords":[]},"santa_tone2":{"unicode":"1f385-1f3fc","unicode_alternates":"","name":"father christmas tone 2","shortname":":santa_tone2:","category":"people","emoji_order":"1491","aliases":[],"aliases_ascii":[],"keywords":[]},"santa_tone3":{"unicode":"1f385-1f3fd","unicode_alternates":"","name":"father christmas tone 3","shortname":":santa_tone3:","category":"people","emoji_order":"1492","aliases":[],"aliases_ascii":[],"keywords":[]},"santa_tone4":{"unicode":"1f385-1f3fe","unicode_alternates":"","name":"father christmas tone 4","shortname":":santa_tone4:","category":"people","emoji_order":"1493","aliases":[],"aliases_ascii":[],"keywords":[]},"santa_tone5":{"unicode":"1f385-1f3ff","unicode_alternates":"","name":"father christmas tone 5","shortname":":santa_tone5:","category":"people","emoji_order":"1494","aliases":[],"aliases_ascii":[],"keywords":[]},"angel_tone1":{"unicode":"1f47c-1f3fb","unicode_alternates":"","name":"baby angel tone 1","shortname":":angel_tone1:","category":"people","emoji_order":"1495","aliases":[],"aliases_ascii":[],"keywords":[]},"angel_tone2":{"unicode":"1f47c-1f3fc","unicode_alternates":"","name":"baby angel tone 2","shortname":":angel_tone2:","category":"people","emoji_order":"1496","aliases":[],"aliases_ascii":[],"keywords":[]},"angel_tone3":{"unicode":"1f47c-1f3fd","unicode_alternates":"","name":"baby angel tone 3","shortname":":angel_tone3:","category":"people","emoji_order":"1497","aliases":[],"aliases_ascii":[],"keywords":[]},"angel_tone4":{"unicode":"1f47c-1f3fe","unicode_alternates":"","name":"baby angel tone 4","shortname":":angel_tone4:","category":"people","emoji_order":"1498","aliases":[],"aliases_ascii":[],"keywords":[]},"angel_tone5":{"unicode":"1f47c-1f3ff","unicode_alternates":"","name":"baby angel tone 5","shortname":":angel_tone5:","category":"people","emoji_order":"1499","aliases":[],"aliases_ascii":[],"keywords":[]},"princess_tone1":{"unicode":"1f478-1f3fb","unicode_alternates":"","name":"princess tone 1","shortname":":princess_tone1:","category":"people","emoji_order":"1500","aliases":[],"aliases_ascii":[],"keywords":[]},"princess_tone2":{"unicode":"1f478-1f3fc","unicode_alternates":"","name":"princess tone 2","shortname":":princess_tone2:","category":"people","emoji_order":"1501","aliases":[],"aliases_ascii":[],"keywords":[]},"princess_tone3":{"unicode":"1f478-1f3fd","unicode_alternates":"","name":"princess tone 3","shortname":":princess_tone3:","category":"people","emoji_order":"1502","aliases":[],"aliases_ascii":[],"keywords":[]},"princess_tone4":{"unicode":"1f478-1f3fe","unicode_alternates":"","name":"princess tone 4","shortname":":princess_tone4:","category":"people","emoji_order":"1503","aliases":[],"aliases_ascii":[],"keywords":[]},"princess_tone5":{"unicode":"1f478-1f3ff","unicode_alternates":"","name":"princess tone 5","shortname":":princess_tone5:","category":"people","emoji_order":"1504","aliases":[],"aliases_ascii":[],"keywords":[]},"bride_with_veil_tone1":{"unicode":"1f470-1f3fb","unicode_alternates":"","name":"bride with veil tone 1","shortname":":bride_with_veil_tone1:","category":"people","emoji_order":"1505","aliases":[],"aliases_ascii":[],"keywords":[]},"bride_with_veil_tone2":{"unicode":"1f470-1f3fc","unicode_alternates":"","name":"bride with veil tone 2","shortname":":bride_with_veil_tone2:","category":"people","emoji_order":"1506","aliases":[],"aliases_ascii":[],"keywords":[]},"bride_with_veil_tone3":{"unicode":"1f470-1f3fd","unicode_alternates":"","name":"bride with veil tone 3","shortname":":bride_with_veil_tone3:","category":"people","emoji_order":"1507","aliases":[],"aliases_ascii":[],"keywords":[]},"bride_with_veil_tone4":{"unicode":"1f470-1f3fe","unicode_alternates":"","name":"bride with veil tone 4","shortname":":bride_with_veil_tone4:","category":"people","emoji_order":"1508","aliases":[],"aliases_ascii":[],"keywords":[]},"bride_with_veil_tone5":{"unicode":"1f470-1f3ff","unicode_alternates":"","name":"bride with veil tone 5","shortname":":bride_with_veil_tone5:","category":"people","emoji_order":"1509","aliases":[],"aliases_ascii":[],"keywords":[]},"walking_tone1":{"unicode":"1f6b6-1f3fb","unicode_alternates":"","name":"pedestrian tone 1","shortname":":walking_tone1:","category":"people","emoji_order":"1510","aliases":[],"aliases_ascii":[],"keywords":[]},"walking_tone2":{"unicode":"1f6b6-1f3fc","unicode_alternates":"","name":"pedestrian tone 2","shortname":":walking_tone2:","category":"people","emoji_order":"1511","aliases":[],"aliases_ascii":[],"keywords":[]},"walking_tone3":{"unicode":"1f6b6-1f3fd","unicode_alternates":"","name":"pedestrian tone 3","shortname":":walking_tone3:","category":"people","emoji_order":"1512","aliases":[],"aliases_ascii":[],"keywords":[]},"walking_tone4":{"unicode":"1f6b6-1f3fe","unicode_alternates":"","name":"pedestrian tone 4","shortname":":walking_tone4:","category":"people","emoji_order":"1513","aliases":[],"aliases_ascii":[],"keywords":[]},"walking_tone5":{"unicode":"1f6b6-1f3ff","unicode_alternates":"","name":"pedestrian tone 5","shortname":":walking_tone5:","category":"people","emoji_order":"1514","aliases":[],"aliases_ascii":[],"keywords":[]},"runner_tone1":{"unicode":"1f3c3-1f3fb","unicode_alternates":"","name":"runner tone 1","shortname":":runner_tone1:","category":"people","emoji_order":"1515","aliases":[],"aliases_ascii":[],"keywords":[]},"runner_tone2":{"unicode":"1f3c3-1f3fc","unicode_alternates":"","name":"runner tone 2","shortname":":runner_tone2:","category":"people","emoji_order":"1516","aliases":[],"aliases_ascii":[],"keywords":[]},"runner_tone3":{"unicode":"1f3c3-1f3fd","unicode_alternates":"","name":"runner tone 3","shortname":":runner_tone3:","category":"people","emoji_order":"1517","aliases":[],"aliases_ascii":[],"keywords":[]},"runner_tone4":{"unicode":"1f3c3-1f3fe","unicode_alternates":"","name":"runner tone 4","shortname":":runner_tone4:","category":"people","emoji_order":"1518","aliases":[],"aliases_ascii":[],"keywords":[]},"runner_tone5":{"unicode":"1f3c3-1f3ff","unicode_alternates":"","name":"runner tone 5","shortname":":runner_tone5:","category":"people","emoji_order":"1519","aliases":[],"aliases_ascii":[],"keywords":[]},"dancer_tone1":{"unicode":"1f483-1f3fb","unicode_alternates":"","name":"dancer tone 1","shortname":":dancer_tone1:","category":"people","emoji_order":"1520","aliases":[],"aliases_ascii":[],"keywords":[]},"dancer_tone2":{"unicode":"1f483-1f3fc","unicode_alternates":"","name":"dancer tone 2","shortname":":dancer_tone2:","category":"people","emoji_order":"1521","aliases":[],"aliases_ascii":[],"keywords":[]},"dancer_tone3":{"unicode":"1f483-1f3fd","unicode_alternates":"","name":"dancer tone 3","shortname":":dancer_tone3:","category":"people","emoji_order":"1522","aliases":[],"aliases_ascii":[],"keywords":[]},"dancer_tone4":{"unicode":"1f483-1f3fe","unicode_alternates":"","name":"dancer tone 4","shortname":":dancer_tone4:","category":"people","emoji_order":"1523","aliases":[],"aliases_ascii":[],"keywords":[]},"dancer_tone5":{"unicode":"1f483-1f3ff","unicode_alternates":"","name":"dancer tone 5","shortname":":dancer_tone5:","category":"people","emoji_order":"1524","aliases":[],"aliases_ascii":[],"keywords":[]},"bow_tone1":{"unicode":"1f647-1f3fb","unicode_alternates":"","name":"person bowing deeply tone 1","shortname":":bow_tone1:","category":"people","emoji_order":"1525","aliases":[],"aliases_ascii":[],"keywords":[]},"bow_tone2":{"unicode":"1f647-1f3fc","unicode_alternates":"","name":"person bowing deeply tone 2","shortname":":bow_tone2:","category":"people","emoji_order":"1526","aliases":[],"aliases_ascii":[],"keywords":[]},"bow_tone3":{"unicode":"1f647-1f3fd","unicode_alternates":"","name":"person bowing deeply tone 3","shortname":":bow_tone3:","category":"people","emoji_order":"1527","aliases":[],"aliases_ascii":[],"keywords":[]},"bow_tone4":{"unicode":"1f647-1f3fe","unicode_alternates":"","name":"person bowing deeply tone 4","shortname":":bow_tone4:","category":"people","emoji_order":"1528","aliases":[],"aliases_ascii":[],"keywords":[]},"bow_tone5":{"unicode":"1f647-1f3ff","unicode_alternates":"","name":"person bowing deeply tone 5","shortname":":bow_tone5:","category":"people","emoji_order":"1529","aliases":[],"aliases_ascii":[],"keywords":[]},"information_desk_person_tone1":{"unicode":"1f481-1f3fb","unicode_alternates":"","name":"information desk person tone 1","shortname":":information_desk_person_tone1:","category":"people","emoji_order":"1530","aliases":[],"aliases_ascii":[],"keywords":[]},"information_desk_person_tone2":{"unicode":"1f481-1f3fc","unicode_alternates":"","name":"information desk person tone 2","shortname":":information_desk_person_tone2:","category":"people","emoji_order":"1531","aliases":[],"aliases_ascii":[],"keywords":[]},"information_desk_person_tone3":{"unicode":"1f481-1f3fd","unicode_alternates":"","name":"information desk person tone 3","shortname":":information_desk_person_tone3:","category":"people","emoji_order":"1532","aliases":[],"aliases_ascii":[],"keywords":[]},"information_desk_person_tone4":{"unicode":"1f481-1f3fe","unicode_alternates":"","name":"information desk person tone 4","shortname":":information_desk_person_tone4:","category":"people","emoji_order":"1533","aliases":[],"aliases_ascii":[],"keywords":[]},"information_desk_person_tone5":{"unicode":"1f481-1f3ff","unicode_alternates":"","name":"information desk person tone 5","shortname":":information_desk_person_tone5:","category":"people","emoji_order":"1534","aliases":[],"aliases_ascii":[],"keywords":[]},"no_good_tone1":{"unicode":"1f645-1f3fb","unicode_alternates":"","name":"face with no good gesture tone 1","shortname":":no_good_tone1:","category":"people","emoji_order":"1535","aliases":[],"aliases_ascii":[],"keywords":[]},"no_good_tone2":{"unicode":"1f645-1f3fc","unicode_alternates":"","name":"face with no good gesture tone 2","shortname":":no_good_tone2:","category":"people","emoji_order":"1536","aliases":[],"aliases_ascii":[],"keywords":[]},"no_good_tone3":{"unicode":"1f645-1f3fd","unicode_alternates":"","name":"face with no good gesture tone 3","shortname":":no_good_tone3:","category":"people","emoji_order":"1537","aliases":[],"aliases_ascii":[],"keywords":[]},"no_good_tone4":{"unicode":"1f645-1f3fe","unicode_alternates":"","name":"face with no good gesture tone 4","shortname":":no_good_tone4:","category":"people","emoji_order":"1538","aliases":[],"aliases_ascii":[],"keywords":[]},"no_good_tone5":{"unicode":"1f645-1f3ff","unicode_alternates":"","name":"face with no good gesture tone 5","shortname":":no_good_tone5:","category":"people","emoji_order":"1539","aliases":[],"aliases_ascii":[],"keywords":[]},"ok_woman_tone1":{"unicode":"1f646-1f3fb","unicode_alternates":"","name":"face with ok gesture tone1","shortname":":ok_woman_tone1:","category":"people","emoji_order":"1540","aliases":[],"aliases_ascii":[],"keywords":[]},"ok_woman_tone2":{"unicode":"1f646-1f3fc","unicode_alternates":"","name":"face with ok gesture tone2","shortname":":ok_woman_tone2:","category":"people","emoji_order":"1541","aliases":[],"aliases_ascii":[],"keywords":[]},"ok_woman_tone3":{"unicode":"1f646-1f3fd","unicode_alternates":"","name":"face with ok gesture tone3","shortname":":ok_woman_tone3:","category":"people","emoji_order":"1542","aliases":[],"aliases_ascii":[],"keywords":[]},"ok_woman_tone4":{"unicode":"1f646-1f3fe","unicode_alternates":"","name":"face with ok gesture tone4","shortname":":ok_woman_tone4:","category":"people","emoji_order":"1543","aliases":[],"aliases_ascii":[],"keywords":[]},"ok_woman_tone5":{"unicode":"1f646-1f3ff","unicode_alternates":"","name":"face with ok gesture tone5","shortname":":ok_woman_tone5:","category":"people","emoji_order":"1544","aliases":[],"aliases_ascii":[],"keywords":[]},"raising_hand_tone1":{"unicode":"1f64b-1f3fb","unicode_alternates":"","name":"happy person raising one hand tone1","shortname":":raising_hand_tone1:","category":"people","emoji_order":"1545","aliases":[],"aliases_ascii":[],"keywords":[]},"raising_hand_tone2":{"unicode":"1f64b-1f3fc","unicode_alternates":"","name":"happy person raising one hand tone2","shortname":":raising_hand_tone2:","category":"people","emoji_order":"1546","aliases":[],"aliases_ascii":[],"keywords":[]},"raising_hand_tone3":{"unicode":"1f64b-1f3fd","unicode_alternates":"","name":"happy person raising one hand tone3","shortname":":raising_hand_tone3:","category":"people","emoji_order":"1547","aliases":[],"aliases_ascii":[],"keywords":[]},"raising_hand_tone4":{"unicode":"1f64b-1f3fe","unicode_alternates":"","name":"happy person raising one hand tone4","shortname":":raising_hand_tone4:","category":"people","emoji_order":"1548","aliases":[],"aliases_ascii":[],"keywords":[]},"raising_hand_tone5":{"unicode":"1f64b-1f3ff","unicode_alternates":"","name":"happy person raising one hand tone5","shortname":":raising_hand_tone5:","category":"people","emoji_order":"1549","aliases":[],"aliases_ascii":[],"keywords":[]},"person_with_pouting_face_tone1":{"unicode":"1f64e-1f3fb","unicode_alternates":"","name":"person with pouting face tone1","shortname":":person_with_pouting_face_tone1:","category":"people","emoji_order":"1550","aliases":[],"aliases_ascii":[],"keywords":[]},"person_with_pouting_face_tone2":{"unicode":"1f64e-1f3fc","unicode_alternates":"","name":"person with pouting face tone2","shortname":":person_with_pouting_face_tone2:","category":"people","emoji_order":"1551","aliases":[],"aliases_ascii":[],"keywords":[]},"person_with_pouting_face_tone3":{"unicode":"1f64e-1f3fd","unicode_alternates":"","name":"person with pouting face tone3","shortname":":person_with_pouting_face_tone3:","category":"people","emoji_order":"1552","aliases":[],"aliases_ascii":[],"keywords":[]},"person_with_pouting_face_tone4":{"unicode":"1f64e-1f3fe","unicode_alternates":"","name":"person with pouting face tone4","shortname":":person_with_pouting_face_tone4:","category":"people","emoji_order":"1553","aliases":[],"aliases_ascii":[],"keywords":[]},"person_with_pouting_face_tone5":{"unicode":"1f64e-1f3ff","unicode_alternates":"","name":"person with pouting face tone5","shortname":":person_with_pouting_face_tone5:","category":"people","emoji_order":"1554","aliases":[],"aliases_ascii":[],"keywords":[]},"person_frowning_tone1":{"unicode":"1f64d-1f3fb","unicode_alternates":"","name":"person frowning tone 1","shortname":":person_frowning_tone1:","category":"people","emoji_order":"1555","aliases":[],"aliases_ascii":[],"keywords":[]},"person_frowning_tone2":{"unicode":"1f64d-1f3fc","unicode_alternates":"","name":"person frowning tone 2","shortname":":person_frowning_tone2:","category":"people","emoji_order":"1556","aliases":[],"aliases_ascii":[],"keywords":[]},"person_frowning_tone3":{"unicode":"1f64d-1f3fd","unicode_alternates":"","name":"person frowning tone 3","shortname":":person_frowning_tone3:","category":"people","emoji_order":"1557","aliases":[],"aliases_ascii":[],"keywords":[]},"person_frowning_tone4":{"unicode":"1f64d-1f3fe","unicode_alternates":"","name":"person frowning tone 4","shortname":":person_frowning_tone4:","category":"people","emoji_order":"1558","aliases":[],"aliases_ascii":[],"keywords":[]},"person_frowning_tone5":{"unicode":"1f64d-1f3ff","unicode_alternates":"","name":"person frowning tone 5","shortname":":person_frowning_tone5:","category":"people","emoji_order":"1559","aliases":[],"aliases_ascii":[],"keywords":[]},"haircut_tone1":{"unicode":"1f487-1f3fb","unicode_alternates":"","name":"haircut tone 1","shortname":":haircut_tone1:","category":"people","emoji_order":"1560","aliases":[],"aliases_ascii":[],"keywords":[]},"haircut_tone2":{"unicode":"1f487-1f3fc","unicode_alternates":"","name":"haircut tone 2","shortname":":haircut_tone2:","category":"people","emoji_order":"1561","aliases":[],"aliases_ascii":[],"keywords":[]},"haircut_tone3":{"unicode":"1f487-1f3fd","unicode_alternates":"","name":"haircut tone 3","shortname":":haircut_tone3:","category":"people","emoji_order":"1562","aliases":[],"aliases_ascii":[],"keywords":[]},"haircut_tone4":{"unicode":"1f487-1f3fe","unicode_alternates":"","name":"haircut tone 4","shortname":":haircut_tone4:","category":"people","emoji_order":"1563","aliases":[],"aliases_ascii":[],"keywords":[]},"haircut_tone5":{"unicode":"1f487-1f3ff","unicode_alternates":"","name":"haircut tone 5","shortname":":haircut_tone5:","category":"people","emoji_order":"1564","aliases":[],"aliases_ascii":[],"keywords":[]},"massage_tone1":{"unicode":"1f486-1f3fb","unicode_alternates":"","name":"face massage tone 1","shortname":":massage_tone1:","category":"people","emoji_order":"1565","aliases":[],"aliases_ascii":[],"keywords":[]},"massage_tone2":{"unicode":"1f486-1f3fc","unicode_alternates":"","name":"face massage tone 2","shortname":":massage_tone2:","category":"people","emoji_order":"1566","aliases":[],"aliases_ascii":[],"keywords":[]},"massage_tone3":{"unicode":"1f486-1f3fd","unicode_alternates":"","name":"face massage tone 3","shortname":":massage_tone3:","category":"people","emoji_order":"1567","aliases":[],"aliases_ascii":[],"keywords":[]},"massage_tone4":{"unicode":"1f486-1f3fe","unicode_alternates":"","name":"face massage tone 4","shortname":":massage_tone4:","category":"people","emoji_order":"1568","aliases":[],"aliases_ascii":[],"keywords":[]},"massage_tone5":{"unicode":"1f486-1f3ff","unicode_alternates":"","name":"face massage tone 5","shortname":":massage_tone5:","category":"people","emoji_order":"1569","aliases":[],"aliases_ascii":[],"keywords":[]},"rowboat_tone1":{"unicode":"1f6a3-1f3fb","unicode_alternates":"","name":"rowboat tone 1","shortname":":rowboat_tone1:","category":"activity","emoji_order":"1570","aliases":[],"aliases_ascii":[],"keywords":[]},"rowboat_tone2":{"unicode":"1f6a3-1f3fc","unicode_alternates":"","name":"rowboat tone 2","shortname":":rowboat_tone2:","category":"activity","emoji_order":"1571","aliases":[],"aliases_ascii":[],"keywords":[]},"rowboat_tone3":{"unicode":"1f6a3-1f3fd","unicode_alternates":"","name":"rowboat tone 3","shortname":":rowboat_tone3:","category":"activity","emoji_order":"1572","aliases":[],"aliases_ascii":[],"keywords":[]},"rowboat_tone4":{"unicode":"1f6a3-1f3fe","unicode_alternates":"","name":"rowboat tone 4","shortname":":rowboat_tone4:","category":"activity","emoji_order":"1573","aliases":[],"aliases_ascii":[],"keywords":[]},"rowboat_tone5":{"unicode":"1f6a3-1f3ff","unicode_alternates":"","name":"rowboat tone 5","shortname":":rowboat_tone5:","category":"activity","emoji_order":"1574","aliases":[],"aliases_ascii":[],"keywords":[]},"swimmer_tone1":{"unicode":"1f3ca-1f3fb","unicode_alternates":"","name":"swimmer tone 1","shortname":":swimmer_tone1:","category":"activity","emoji_order":"1575","aliases":[],"aliases_ascii":[],"keywords":[]},"swimmer_tone2":{"unicode":"1f3ca-1f3fc","unicode_alternates":"","name":"swimmer tone 2","shortname":":swimmer_tone2:","category":"activity","emoji_order":"1576","aliases":[],"aliases_ascii":[],"keywords":[]},"swimmer_tone3":{"unicode":"1f3ca-1f3fd","unicode_alternates":"","name":"swimmer tone 3","shortname":":swimmer_tone3:","category":"activity","emoji_order":"1577","aliases":[],"aliases_ascii":[],"keywords":[]},"swimmer_tone4":{"unicode":"1f3ca-1f3fe","unicode_alternates":"","name":"swimmer tone 4","shortname":":swimmer_tone4:","category":"activity","emoji_order":"1578","aliases":[],"aliases_ascii":[],"keywords":[]},"swimmer_tone5":{"unicode":"1f3ca-1f3ff","unicode_alternates":"","name":"swimmer tone 5","shortname":":swimmer_tone5:","category":"activity","emoji_order":"1579","aliases":[],"aliases_ascii":[],"keywords":[]},"surfer_tone1":{"unicode":"1f3c4-1f3fb","unicode_alternates":"","name":"surfer tone 1","shortname":":surfer_tone1:","category":"activity","emoji_order":"1580","aliases":[],"aliases_ascii":[],"keywords":[]},"surfer_tone2":{"unicode":"1f3c4-1f3fc","unicode_alternates":"","name":"surfer tone 2","shortname":":surfer_tone2:","category":"activity","emoji_order":"1581","aliases":[],"aliases_ascii":[],"keywords":[]},"surfer_tone3":{"unicode":"1f3c4-1f3fd","unicode_alternates":"","name":"surfer tone 3","shortname":":surfer_tone3:","category":"activity","emoji_order":"1582","aliases":[],"aliases_ascii":[],"keywords":[]},"surfer_tone4":{"unicode":"1f3c4-1f3fe","unicode_alternates":"","name":"surfer tone 4","shortname":":surfer_tone4:","category":"activity","emoji_order":"1583","aliases":[],"aliases_ascii":[],"keywords":[]},"surfer_tone5":{"unicode":"1f3c4-1f3ff","unicode_alternates":"","name":"surfer tone 5","shortname":":surfer_tone5:","category":"activity","emoji_order":"1584","aliases":[],"aliases_ascii":[],"keywords":[]},"bath_tone1":{"unicode":"1f6c0-1f3fb","unicode_alternates":"","name":"bath tone 1","shortname":":bath_tone1:","category":"activity","emoji_order":"1585","aliases":[],"aliases_ascii":[],"keywords":[]},"bath_tone2":{"unicode":"1f6c0-1f3fc","unicode_alternates":"","name":"bath tone 2","shortname":":bath_tone2:","category":"activity","emoji_order":"1586","aliases":[],"aliases_ascii":[],"keywords":[]},"bath_tone3":{"unicode":"1f6c0-1f3fd","unicode_alternates":"","name":"bath tone 3","shortname":":bath_tone3:","category":"activity","emoji_order":"1587","aliases":[],"aliases_ascii":[],"keywords":[]},"bath_tone4":{"unicode":"1f6c0-1f3fe","unicode_alternates":"","name":"bath tone 4","shortname":":bath_tone4:","category":"activity","emoji_order":"1588","aliases":[],"aliases_ascii":[],"keywords":[]},"bath_tone5":{"unicode":"1f6c0-1f3ff","unicode_alternates":"","name":"bath tone 5","shortname":":bath_tone5:","category":"activity","emoji_order":"1589","aliases":[],"aliases_ascii":[],"keywords":[]},"basketball_player_tone1":{"unicode":"26f9-1f3fb","unicode_alternates":"","name":"person with ball tone 1","shortname":":basketball_player_tone1:","category":"activity","emoji_order":"1590","aliases":[":person_with_ball_tone1:"],"aliases_ascii":[],"keywords":[]},"basketball_player_tone2":{"unicode":"26f9-1f3fc","unicode_alternates":"","name":"person with ball tone 2","shortname":":basketball_player_tone2:","category":"activity","emoji_order":"1591","aliases":[":person_with_ball_tone2:"],"aliases_ascii":[],"keywords":[]},"basketball_player_tone3":{"unicode":"26f9-1f3fd","unicode_alternates":"","name":"person with ball tone 3","shortname":":basketball_player_tone3:","category":"activity","emoji_order":"1592","aliases":[":person_with_ball_tone3:"],"aliases_ascii":[],"keywords":[]},"basketball_player_tone4":{"unicode":"26f9-1f3fe","unicode_alternates":"","name":"person with ball tone 4","shortname":":basketball_player_tone4:","category":"activity","emoji_order":"1593","aliases":[":person_with_ball_tone4:"],"aliases_ascii":[],"keywords":[]},"basketball_player_tone5":{"unicode":"26f9-1f3ff","unicode_alternates":"","name":"person with ball tone 5","shortname":":basketball_player_tone5:","category":"activity","emoji_order":"1594","aliases":[":person_with_ball_tone5:"],"aliases_ascii":[],"keywords":[]},"lifter_tone1":{"unicode":"1f3cb-1f3fb","unicode_alternates":"","name":"weight lifter tone 1","shortname":":lifter_tone1:","category":"activity","emoji_order":"1595","aliases":[":weight_lifter_tone1:"],"aliases_ascii":[],"keywords":[]},"lifter_tone2":{"unicode":"1f3cb-1f3fc","unicode_alternates":"","name":"weight lifter tone 2","shortname":":lifter_tone2:","category":"activity","emoji_order":"1596","aliases":[":weight_lifter_tone2:"],"aliases_ascii":[],"keywords":[]},"lifter_tone3":{"unicode":"1f3cb-1f3fd","unicode_alternates":"","name":"weight lifter tone 3","shortname":":lifter_tone3:","category":"activity","emoji_order":"1597","aliases":[":weight_lifter_tone3:"],"aliases_ascii":[],"keywords":[]},"lifter_tone4":{"unicode":"1f3cb-1f3fe","unicode_alternates":"","name":"weight lifter tone 4","shortname":":lifter_tone4:","category":"activity","emoji_order":"1598","aliases":[":weight_lifter_tone4:"],"aliases_ascii":[],"keywords":[]},"lifter_tone5":{"unicode":"1f3cb-1f3ff","unicode_alternates":"","name":"weight lifter tone 5","shortname":":lifter_tone5:","category":"activity","emoji_order":"1599","aliases":[":weight_lifter_tone5:"],"aliases_ascii":[],"keywords":[]},"bicyclist_tone1":{"unicode":"1f6b4-1f3fb","unicode_alternates":"","name":"bicyclist tone 1","shortname":":bicyclist_tone1:","category":"activity","emoji_order":"1600","aliases":[],"aliases_ascii":[],"keywords":[]},"bicyclist_tone2":{"unicode":"1f6b4-1f3fc","unicode_alternates":"","name":"bicyclist tone 2","shortname":":bicyclist_tone2:","category":"activity","emoji_order":"1601","aliases":[],"aliases_ascii":[],"keywords":[]},"bicyclist_tone3":{"unicode":"1f6b4-1f3fd","unicode_alternates":"","name":"bicyclist tone 3","shortname":":bicyclist_tone3:","category":"activity","emoji_order":"1602","aliases":[],"aliases_ascii":[],"keywords":[]},"bicyclist_tone4":{"unicode":"1f6b4-1f3fe","unicode_alternates":"","name":"bicyclist tone 4","shortname":":bicyclist_tone4:","category":"activity","emoji_order":"1603","aliases":[],"aliases_ascii":[],"keywords":[]},"bicyclist_tone5":{"unicode":"1f6b4-1f3ff","unicode_alternates":"","name":"bicyclist tone 5","shortname":":bicyclist_tone5:","category":"activity","emoji_order":"1604","aliases":[],"aliases_ascii":[],"keywords":[]},"mountain_bicyclist_tone1":{"unicode":"1f6b5-1f3fb","unicode_alternates":"","name":"mountain bicyclist tone 1","shortname":":mountain_bicyclist_tone1:","category":"activity","emoji_order":"1605","aliases":[],"aliases_ascii":[],"keywords":[]},"mountain_bicyclist_tone2":{"unicode":"1f6b5-1f3fc","unicode_alternates":"","name":"mountain bicyclist tone 2","shortname":":mountain_bicyclist_tone2:","category":"activity","emoji_order":"1606","aliases":[],"aliases_ascii":[],"keywords":[]},"mountain_bicyclist_tone3":{"unicode":"1f6b5-1f3fd","unicode_alternates":"","name":"mountain bicyclist tone 3","shortname":":mountain_bicyclist_tone3:","category":"activity","emoji_order":"1607","aliases":[],"aliases_ascii":[],"keywords":[]},"mountain_bicyclist_tone4":{"unicode":"1f6b5-1f3fe","unicode_alternates":"","name":"mountain bicyclist tone 4","shortname":":mountain_bicyclist_tone4:","category":"activity","emoji_order":"1608","aliases":[],"aliases_ascii":[],"keywords":[]},"mountain_bicyclist_tone5":{"unicode":"1f6b5-1f3ff","unicode_alternates":"","name":"mountain bicyclist tone 5","shortname":":mountain_bicyclist_tone5:","category":"activity","emoji_order":"1609","aliases":[],"aliases_ascii":[],"keywords":[]},"horse_racing_tone1":{"unicode":"1f3c7-1f3fb","unicode_alternates":"","name":"horse racing tone 1","shortname":":horse_racing_tone1:","category":"activity","emoji_order":"1610","aliases":[],"aliases_ascii":[],"keywords":[]},"horse_racing_tone2":{"unicode":"1f3c7-1f3fc","unicode_alternates":"","name":"horse racing tone 2","shortname":":horse_racing_tone2:","category":"activity","emoji_order":"1611","aliases":[],"aliases_ascii":[],"keywords":[]},"horse_racing_tone3":{"unicode":"1f3c7-1f3fd","unicode_alternates":"","name":"horse racing tone 3","shortname":":horse_racing_tone3:","category":"activity","emoji_order":"1612","aliases":[],"aliases_ascii":[],"keywords":[]},"horse_racing_tone4":{"unicode":"1f3c7-1f3fe","unicode_alternates":"","name":"horse racing tone 4","shortname":":horse_racing_tone4:","category":"activity","emoji_order":"1613","aliases":[],"aliases_ascii":[],"keywords":[]},"horse_racing_tone5":{"unicode":"1f3c7-1f3ff","unicode_alternates":"","name":"horse racing tone 5","shortname":":horse_racing_tone5:","category":"activity","emoji_order":"1614","aliases":[],"aliases_ascii":[],"keywords":[]},"spy_tone1":{"unicode":"1f575-1f3fb","unicode_alternates":"","name":"sleuth or spy tone 1","shortname":":spy_tone1:","category":"people","emoji_order":"1615","aliases":[":sleuth_or_spy_tone1:"],"aliases_ascii":[],"keywords":[]},"spy_tone2":{"unicode":"1f575-1f3fc","unicode_alternates":"","name":"sleuth or spy tone 2","shortname":":spy_tone2:","category":"people","emoji_order":"1616","aliases":[":sleuth_or_spy_tone2:"],"aliases_ascii":[],"keywords":[]},"spy_tone3":{"unicode":"1f575-1f3fd","unicode_alternates":"","name":"sleuth or spy tone 3","shortname":":spy_tone3:","category":"people","emoji_order":"1617","aliases":[":sleuth_or_spy_tone3:"],"aliases_ascii":[],"keywords":[]},"spy_tone4":{"unicode":"1f575-1f3fe","unicode_alternates":"","name":"sleuth or spy tone 4","shortname":":spy_tone4:","category":"people","emoji_order":"1618","aliases":[":sleuth_or_spy_tone4:"],"aliases_ascii":[],"keywords":[]},"spy_tone5":{"unicode":"1f575-1f3ff","unicode_alternates":"","name":"sleuth or spy tone 5","shortname":":spy_tone5:","category":"people","emoji_order":"1619","aliases":[":sleuth_or_spy_tone5:"],"aliases_ascii":[],"keywords":[]},"tone1":{"unicode":"1f3fb","unicode_alternates":"","name":"emoji modifier Fitzpatrick type-1-2","shortname":":tone1:","category":"modifier","emoji_order":"1620","aliases":[],"aliases_ascii":[],"keywords":[]},"tone2":{"unicode":"1f3fc","unicode_alternates":"","name":"emoji modifier Fitzpatrick type-3","shortname":":tone2:","category":"modifier","emoji_order":"1621","aliases":[],"aliases_ascii":[],"keywords":[]},"tone3":{"unicode":"1f3fd","unicode_alternates":"","name":"emoji modifier Fitzpatrick type-4","shortname":":tone3:","category":"modifier","emoji_order":"1622","aliases":[],"aliases_ascii":[],"keywords":[]},"tone4":{"unicode":"1f3fe","unicode_alternates":"","name":"emoji modifier Fitzpatrick type-5","shortname":":tone4:","category":"modifier","emoji_order":"1623","aliases":[],"aliases_ascii":[],"keywords":[]},"tone5":{"unicode":"1f3ff","unicode_alternates":"","name":"emoji modifier Fitzpatrick type-6","shortname":":tone5:","category":"modifier","emoji_order":"1624","aliases":[],"aliases_ascii":[],"keywords":[]}} \ No newline at end of file
diff --git a/library/fullcalendar/CHANGELOG.txt b/library/fullcalendar/CHANGELOG.txt
index ed2eddb8a..379f23691 100644
--- a/library/fullcalendar/CHANGELOG.txt
+++ b/library/fullcalendar/CHANGELOG.txt
@@ -1,4 +1,25 @@
+v3.2.0 (2017-02-14)
+-------------------
+
+Features:
+- `selectMinDistance`, threshold before a mouse selection begins (#2428)
+
+Bugfixes:
+- iOS 10, unwanted scrolling while dragging events/selection (#3403)
+- dayClick triggered when swiping on touch devices (#3332)
+- dayClick not functioning on Firefix mobile (#3450)
+- title computed incorrectly for views with no weekends (#2884)
+- unwanted scrollbars in month-view when non-integer width (#3453, #3444)
+- incorrect date formatting for locales with non-standlone month/day names (#3478)
+- date formatting, incorrect omission of trailing period for certain locales (#2504, #3486)
+- formatRange should collapse same week numbers (#3467)
+- Taiwanese locale updated (#3426)
+- Finnish noEventsMessage updated (#3476)
+- Croatian (hr) buttonText is blank (#3270)
+- JSON feed PHP example, date range math bug (#3485)
+
+
v3.1.0 (2016-12-05)
-------------------
diff --git a/library/fullcalendar/fullcalendar.css b/library/fullcalendar/fullcalendar.css
index 5620e0bd6..a2f76c960 100644
--- a/library/fullcalendar/fullcalendar.css
+++ b/library/fullcalendar/fullcalendar.css
@@ -1,7 +1,7 @@
/*!
- * FullCalendar v3.1.0 Stylesheet
- * Docs & License: http://fullcalendar.io/
- * (c) 2016 Adam Shaw
+ * FullCalendar v3.2.0 Stylesheet
+ * Docs & License: https://fullcalendar.io/
+ * (c) 2017 Adam Shaw
*/
diff --git a/library/fullcalendar/fullcalendar.js b/library/fullcalendar/fullcalendar.js
index b7371e25f..04399302b 100644
--- a/library/fullcalendar/fullcalendar.js
+++ b/library/fullcalendar/fullcalendar.js
@@ -1,7 +1,7 @@
/*!
- * FullCalendar v3.1.0
- * Docs & License: http://fullcalendar.io/
- * (c) 2016 Adam Shaw
+ * FullCalendar v3.2.0
+ * Docs & License: https://fullcalendar.io/
+ * (c) 2017 Adam Shaw
*/
(function(factory) {
@@ -19,8 +19,11 @@
;;
var FC = $.fullCalendar = {
- version: "3.1.0",
- internalApiVersion: 7
+ version: "3.2.0",
+ // When introducing internal API incompatibilities (where fullcalendar plugins would break),
+ // the minor version of the calendar should be upped (ex: 2.7.2 -> 2.8.0)
+ // and the below integer should be incremented.
+ internalApiVersion: 8
};
var fcViews = FC.views = {};
@@ -313,12 +316,13 @@ function getContentRect(el, origin) {
// NOTE: should use clientLeft/clientTop, but very unreliable cross-browser.
function getScrollbarWidths(el) {
var leftRightWidth = el.innerWidth() - el[0].clientWidth; // the paddings cancel out, leaving the scrollbars
- var widths = {
- left: 0,
- right: 0,
- top: 0,
- bottom: el.innerHeight() - el[0].clientHeight // the paddings cancel out, leaving the bottom scrollbar
- };
+ var bottomWidth = el.innerHeight() - el[0].clientHeight; // "
+ var widths;
+
+ leftRightWidth = sanitizeScrollbarWidth(leftRightWidth);
+ bottomWidth = sanitizeScrollbarWidth(bottomWidth);
+
+ widths = { left: 0, right: 0, top: 0, bottom: bottomWidth };
if (getIsLeftRtlScrollbars() && el.css('direction') == 'rtl') { // is the scrollbar on the left side?
widths.left = leftRightWidth;
@@ -331,6 +335,15 @@ function getScrollbarWidths(el) {
}
+// The scrollbar width computations in getScrollbarWidths are sometimes flawed when it comes to
+// retina displays, rounding, and IE11. Massage them into a usable value.
+function sanitizeScrollbarWidth(width) {
+ width = Math.max(0, width); // no negatives
+ width = Math.round(width);
+ return width;
+}
+
+
// Logic for determining if, when the element is right-to-left, the scrollbar appears on the left side
var _isLeftRtlScrollbars = null;
@@ -381,24 +394,28 @@ function isPrimaryMouseButton(ev) {
function getEvX(ev) {
- if (ev.pageX !== undefined) {
- return ev.pageX;
- }
var touches = ev.originalEvent.touches;
- if (touches) {
+
+ // on mobile FF, pageX for touch events is present, but incorrect,
+ // so, look at touch coordinates first.
+ if (touches && touches.length) {
return touches[0].pageX;
}
+
+ return ev.pageX;
}
function getEvY(ev) {
- if (ev.pageY !== undefined) {
- return ev.pageY;
- }
var touches = ev.originalEvent.touches;
- if (touches) {
+
+ // on mobile FF, pageX for touch events is present, but incorrect,
+ // so, look at touch coordinates first.
+ if (touches && touches.length) {
return touches[0].pageY;
}
+
+ return ev.pageY;
}
@@ -413,33 +430,15 @@ function preventSelection(el) {
}
-// Stops a mouse/touch event from doing it's native browser action
-function preventDefault(ev) {
- ev.preventDefault();
-}
-
-
-// attach a handler to get called when ANY scroll action happens on the page.
-// this was impossible to do with normal on/off because 'scroll' doesn't bubble.
-// http://stackoverflow.com/a/32954565/96342
-// returns `true` on success.
-function bindAnyScroll(handler) {
- if (window.addEventListener) {
- window.addEventListener('scroll', handler, true); // useCapture=true
- return true;
- }
- return false;
+function allowSelection(el) {
+ el.removeClass('fc-unselectable')
+ .off('selectstart', preventDefault);
}
-// undoes bindAnyScroll. must pass in the original function.
-// returns `true` on success.
-function unbindAnyScroll(handler) {
- if (window.removeEventListener) {
- window.removeEventListener('scroll', handler, true); // useCapture=true
- return true;
- }
- return false;
+// Stops a mouse/touch event from doing it's native browser action
+function preventDefault(ev) {
+ ev.preventDefault();
}
@@ -1329,38 +1328,42 @@ newMomentProto.toISOString = function() {
};
;;
+(function() {
-// Single Date Formatting
-// -------------------------------------------------------------------------------------------------
-
-
-// call this if you want Moment's original format method to be used
-function oldMomentFormat(mom, formatStr) {
- return oldMomentProto.format.call(mom, formatStr); // oldMomentProto defined in moment-ext.js
-}
-
+// exports
+FC.formatDate = formatDate;
+FC.formatRange = formatRange;
+FC.oldMomentFormat = oldMomentFormat;
+FC.queryMostGranularFormatUnit = queryMostGranularFormatUnit;
-// Formats `date` with a Moment formatting string, but allow our non-zero areas and
-// additional token.
-function formatDate(date, formatStr) {
- return formatDateWithChunks(date, getFormatStringChunks(formatStr));
-}
+// Config
+// ---------------------------------------------------------------------------------------------------------------------
-function formatDateWithChunks(date, chunks) {
- var s = '';
- var i;
-
- for (i=0; i<chunks.length; i++) {
- s += formatDateWithChunk(date, chunks[i]);
- }
+/*
+Inserted between chunks in the fake ("intermediate") formatting string.
+Important that it passes as whitespace (\s) because moment often identifies non-standalone months
+via a regexp with an \s.
+*/
+var PART_SEPARATOR = '\u000b'; // vertical tab
- return s;
-}
+/*
+Inserted as the first character of a literal-text chunk to indicate that the literal text is not actually literal text,
+but rather, a "special" token that has custom rendering (see specialTokens map).
+*/
+var SPECIAL_TOKEN_MARKER = '\u001f'; // information separator 1
+/*
+Inserted at the beginning and end of a span of text that must have non-zero numeric characters.
+Handling of these markers is done in a post-processing step at the very end of text rendering.
+*/
+var MAYBE_MARKER = '\u001e'; // information separator 2
+var MAYBE_REGEXP = new RegExp(MAYBE_MARKER + '([^' + MAYBE_MARKER + ']*)' + MAYBE_MARKER, 'g'); // must be global
-// addition formatting tokens we want recognized
-var tokenOverrides = {
+/*
+Addition formatting tokens we want recognized
+*/
+var specialTokens = {
t: function(date) { // "a" or "p"
return oldMomentFormat(date, 'a').charAt(0);
},
@@ -1369,28 +1372,39 @@ var tokenOverrides = {
}
};
+/*
+The first characters of formatting tokens for units that are 1 day or larger.
+`value` is for ranking relative size (lower means bigger).
+`unit` is a normalized unit, used for comparing moments.
+*/
+var largeTokenMap = {
+ Y: { value: 1, unit: 'year' },
+ M: { value: 2, unit: 'month' },
+ W: { value: 3, unit: 'week' }, // ISO week
+ w: { value: 3, unit: 'week' }, // local week
+ D: { value: 4, unit: 'day' }, // day of month
+ d: { value: 4, unit: 'day' } // day of week
+};
+
-function formatDateWithChunk(date, chunk) {
- var token;
- var maybeStr;
+// Single Date Formatting
+// ---------------------------------------------------------------------------------------------------------------------
- if (typeof chunk === 'string') { // a literal string
- return chunk;
- }
- else if ((token = chunk.token)) { // a token, like "YYYY"
- if (tokenOverrides[token]) {
- return tokenOverrides[token](date); // use our custom token
- }
- return oldMomentFormat(date, token);
- }
- else if (chunk.maybe) { // a grouping of other chunks that must be non-zero
- maybeStr = formatDateWithChunks(date, chunk.maybe);
- if (maybeStr.match(/[1-9]/)) {
- return maybeStr;
- }
- }
+/*
+Formats `date` with a Moment formatting string, but allow our non-zero areas and special token
+*/
+function formatDate(date, formatStr) {
+ return renderFakeFormatString(
+ getParsedFormatString(formatStr).fakeFormatString,
+ date
+ );
+}
- return '';
+/*
+Call this if you want Moment's original format method to be used
+*/
+function oldMomentFormat(mom, formatStr) {
+ return oldMomentProto.format.call(mom, formatStr); // oldMomentProto defined in moment-ext.js
}
@@ -1398,10 +1412,12 @@ function formatDateWithChunk(date, chunk) {
// -------------------------------------------------------------------------------------------------
// TODO: make it work with timezone offset
-// Using a formatting string meant for a single date, generate a range string, like
-// "Sep 2 - 9 2013", that intelligently inserts a separator where the dates differ.
-// If the dates are the same as far as the format string is concerned, just return a single
-// rendering of one date, without any separator.
+/*
+Using a formatting string meant for a single date, generate a range string, like
+"Sep 2 - 9 2013", that intelligently inserts a separator where the dates differ.
+If the dates are the same as far as the format string is concerned, just return a single
+rendering of one date, without any separator.
+*/
function formatRange(date1, date2, formatStr, separator, isRTL) {
var localeData;
@@ -1410,28 +1426,31 @@ function formatRange(date1, date2, formatStr, separator, isRTL) {
localeData = date1.localeData();
- // Expand localized format strings, like "LL" -> "MMMM D YYYY"
- formatStr = localeData.longDateFormat(formatStr) || formatStr;
+ // Expand localized format strings, like "LL" -> "MMMM D YYYY".
// BTW, this is not important for `formatDate` because it is impossible to put custom tokens
// or non-zero areas in Moment's localized format strings.
+ formatStr = localeData.longDateFormat(formatStr) || formatStr;
- separator = separator || ' - ';
-
- return formatRangeWithChunks(
+ return renderParsedFormat(
+ getParsedFormatString(formatStr),
date1,
date2,
- getFormatStringChunks(formatStr),
- separator,
+ separator || ' - ',
isRTL
);
}
-FC.formatRange = formatRange; // expose
-
-function formatRangeWithChunks(date1, date2, chunks, separator, isRTL) {
- var unzonedDate1 = date1.clone().stripZone(); // for formatSimilarChunk
+/*
+Renders a range with an already-parsed format string.
+*/
+function renderParsedFormat(parsedFormat, date1, date2, separator, isRTL) {
+ var sameUnits = parsedFormat.sameUnits;
+ var unzonedDate1 = date1.clone().stripZone(); // for same-unit comparisons
var unzonedDate2 = date2.clone().stripZone(); // "
- var chunkStr; // the rendering of the chunk
+
+ var renderedParts1 = renderFakeFormatStringParts(parsedFormat.fakeFormatString, date1);
+ var renderedParts2 = renderFakeFormatStringParts(parsedFormat.fakeFormatString, date2);
+
var leftI;
var leftStr = '';
var rightI;
@@ -1443,28 +1462,35 @@ function formatRangeWithChunks(date1, date2, chunks, separator, isRTL) {
// Start at the leftmost side of the formatting string and continue until you hit a token
// that is not the same between dates.
- for (leftI=0; leftI<chunks.length; leftI++) {
- chunkStr = formatSimilarChunk(date1, date2, unzonedDate1, unzonedDate2, chunks[leftI]);
- if (chunkStr === false) {
- break;
- }
- leftStr += chunkStr;
+ for (
+ leftI = 0;
+ leftI < sameUnits.length && (!sameUnits[leftI] || unzonedDate1.isSame(unzonedDate2, sameUnits[leftI]));
+ leftI++
+ ) {
+ leftStr += renderedParts1[leftI];
}
// Similarly, start at the rightmost side of the formatting string and move left
- for (rightI=chunks.length-1; rightI>leftI; rightI--) {
- chunkStr = formatSimilarChunk(date1, date2, unzonedDate1, unzonedDate2, chunks[rightI]);
- if (chunkStr === false) {
+ for (
+ rightI = sameUnits.length - 1;
+ rightI > leftI && (!sameUnits[rightI] || unzonedDate1.isSame(unzonedDate2, sameUnits[rightI]));
+ rightI--
+ ) {
+ // If current chunk is on the boundary of unique date-content, and is a special-case
+ // date-formatting postfix character, then don't consume it. Consider it unique date-content.
+ // TODO: make configurable
+ if (rightI - 1 === leftI && renderedParts1[rightI] === '.') {
break;
}
- rightStr = chunkStr + rightStr;
+
+ rightStr = renderedParts1[rightI] + rightStr;
}
// The area in the middle is different for both of the dates.
// Collect them distinctly so we can jam them together later.
- for (middleI=leftI; middleI<=rightI; middleI++) {
- middleStr1 += formatDateWithChunk(date1, chunks[middleI]);
- middleStr2 += formatDateWithChunk(date2, chunks[middleI]);
+ for (middleI = leftI; middleI <= rightI; middleI++) {
+ middleStr1 += renderedParts1[middleI];
+ middleStr2 += renderedParts2[middleI];
}
if (middleStr1 || middleStr2) {
@@ -1476,77 +1502,59 @@ function formatRangeWithChunks(date1, date2, chunks, separator, isRTL) {
}
}
- return leftStr + middleStr + rightStr;
+ return processMaybeMarkers(
+ leftStr + middleStr + rightStr
+ );
}
-var similarUnitMap = {
- Y: 'year',
- M: 'month',
- D: 'day', // day of month
- d: 'day', // day of week
- // prevents a separator between anything time-related...
- A: 'second', // AM/PM
- a: 'second', // am/pm
- T: 'second', // A/P
- t: 'second', // a/p
- H: 'second', // hour (24)
- h: 'second', // hour (12)
- m: 'second', // minute
- s: 'second' // second
-};
-// TODO: week maybe?
-
-
-// Given a formatting chunk, and given that both dates are similar in the regard the
-// formatting chunk is concerned, format date1 against `chunk`. Otherwise, return `false`.
-function formatSimilarChunk(date1, date2, unzonedDate1, unzonedDate2, chunk) {
- var token;
- var unit;
+// Format String Parsing
+// ---------------------------------------------------------------------------------------------------------------------
- if (typeof chunk === 'string') { // a literal string
- return chunk;
- }
- else if ((token = chunk.token)) {
- unit = similarUnitMap[token.charAt(0)];
+var parsedFormatStrCache = {};
- // are the dates the same for this unit of measurement?
- // use the unzoned dates for this calculation because unreliable when near DST (bug #2396)
- if (unit && unzonedDate1.isSame(unzonedDate2, unit)) {
- return oldMomentFormat(date1, token); // would be the same if we used `date2`
- // BTW, don't support custom tokens
- }
- }
-
- return false; // the chunk is NOT the same for the two dates
- // BTW, don't support splitting on non-zero areas
+/*
+Returns a parsed format string, leveraging a cache.
+*/
+function getParsedFormatString(formatStr) {
+ return parsedFormatStrCache[formatStr] ||
+ (parsedFormatStrCache[formatStr] = parseFormatString(formatStr));
}
-
-// Chunking Utils
-// -------------------------------------------------------------------------------------------------
-
-
-var formatStringChunkCache = {};
-
-
-function getFormatStringChunks(formatStr) {
- if (formatStr in formatStringChunkCache) {
- return formatStringChunkCache[formatStr];
- }
- return (formatStringChunkCache[formatStr] = chunkFormatString(formatStr));
+/*
+Parses a format string into the following:
+- fakeFormatString: a momentJS formatting string, littered with special control characters that get post-processed.
+- sameUnits: for every part in fakeFormatString, if the part is a token, the value will be a unit string (like "day"),
+ that indicates how similar a range's start & end must be in order to share the same formatted text.
+ If not a token, then the value is null.
+ Always a flat array (not nested liked "chunks").
+*/
+function parseFormatString(formatStr) {
+ var chunks = chunkFormatString(formatStr);
+
+ return {
+ fakeFormatString: buildFakeFormatString(chunks),
+ sameUnits: buildSameUnits(chunks)
+ };
}
-
-// Break the formatting string into an array of chunks
+/*
+Break the formatting string into an array of chunks.
+A 'maybe' chunk will have nested chunks.
+*/
function chunkFormatString(formatStr) {
var chunks = [];
- var chunker = /\[([^\]]*)\]|\(([^\)]*)\)|(LTS|LT|(\w)\4*o?)|([^\w\[\(]+)/g; // TODO: more descrimination
var match;
+ // TODO: more descrimination
+ // \4 is a backreference to the first character of a multi-character set.
+ var chunker = /\[([^\]]*)\]|\(([^\)]*)\)|(LTS|LT|(\w)\4*o?)|([^\w\[\(]+)/g;
+
while ((match = chunker.exec(formatStr))) {
if (match[1]) { // a literal string inside [ ... ]
- chunks.push(match[1]);
+ chunks.push.apply(chunks, // append
+ splitStringLiteral(match[1])
+ );
}
else if (match[2]) { // non-zero formatting inside ( ... )
chunks.push({ maybe: chunkFormatString(match[2]) });
@@ -1555,41 +1563,166 @@ function chunkFormatString(formatStr) {
chunks.push({ token: match[3] });
}
else if (match[5]) { // an unenclosed literal string
- chunks.push(match[5]);
+ chunks.push.apply(chunks, // append
+ splitStringLiteral(match[5])
+ );
}
}
return chunks;
}
+/*
+Potentially splits a literal-text string into multiple parts. For special cases.
+*/
+function splitStringLiteral(s) {
+ if (s === '. ') {
+ return [ '.', ' ' ]; // for locales with periods bound to the end of each year/month/date
+ }
+ else {
+ return [ s ];
+ }
+}
-// Misc Utils
-// -------------------------------------------------------------------------------------------------
+/*
+Given chunks parsed from a real format string, generate a fake (aka "intermediate") format string with special control
+characters that will eventually be given to moment for formatting, and then post-processed.
+*/
+function buildFakeFormatString(chunks) {
+ var parts = [];
+ var i, chunk;
+ for (i = 0; i < chunks.length; i++) {
+ chunk = chunks[i];
-// granularity only goes up until day
-// TODO: unify with similarUnitMap
-var tokenGranularities = {
- Y: { value: 1, unit: 'year' },
- M: { value: 2, unit: 'month' },
- W: { value: 3, unit: 'week' },
- w: { value: 3, unit: 'week' },
- D: { value: 4, unit: 'day' }, // day of month
- d: { value: 4, unit: 'day' } // day of week
-};
+ if (typeof chunk === 'string') {
+ parts.push('[' + chunk + ']');
+ }
+ else if (chunk.token) {
+ if (chunk.token in specialTokens) {
+ parts.push(
+ SPECIAL_TOKEN_MARKER + // useful during post-processing
+ '[' + chunk.token + ']' // preserve as literal text
+ );
+ }
+ else {
+ parts.push(chunk.token); // unprotected text implies a format string
+ }
+ }
+ else if (chunk.maybe) {
+ parts.push(
+ MAYBE_MARKER + // useful during post-processing
+ buildFakeFormatString(chunk.maybe) +
+ MAYBE_MARKER
+ );
+ }
+ }
+
+ return parts.join(PART_SEPARATOR);
+}
-// returns a unit string, either 'year', 'month', 'day', or null
-// for the most granular formatting token in the string.
-FC.queryMostGranularFormatUnit = function(formatStr) {
- var chunks = getFormatStringChunks(formatStr);
+/*
+Given parsed chunks from a real formatting string, generates an array of unit strings (like "day") that indicate
+in which regard two dates must be similar in order to share range formatting text.
+The `chunks` can be nested (because of "maybe" chunks), however, the returned array will be flat.
+*/
+function buildSameUnits(chunks) {
+ var units = [];
+ var i, chunk;
+ var tokenInfo;
+
+ for (i = 0; i < chunks.length; i++) {
+ chunk = chunks[i];
+
+ if (chunk.token) {
+ tokenInfo = largeTokenMap[chunk.token.charAt(0)];
+ units.push(tokenInfo ? tokenInfo.unit : 'second'); // default to a very strict same-second
+ }
+ else if (chunk.maybe) {
+ units.push.apply(units, // append
+ buildSameUnits(chunk.maybe)
+ );
+ }
+ else {
+ units.push(null);
+ }
+ }
+
+ return units;
+}
+
+
+// Rendering to text
+// ---------------------------------------------------------------------------------------------------------------------
+
+/*
+Formats a date with a fake format string, post-processes the control characters, then returns.
+*/
+function renderFakeFormatString(fakeFormatString, date) {
+ return processMaybeMarkers(
+ renderFakeFormatStringParts(fakeFormatString, date).join('')
+ );
+}
+
+/*
+Formats a date into parts that will have been post-processed, EXCEPT for the "maybe" markers.
+*/
+function renderFakeFormatStringParts(fakeFormatString, date) {
+ var parts = [];
+ var fakeRender = oldMomentFormat(date, fakeFormatString);
+ var fakeParts = fakeRender.split(PART_SEPARATOR);
+ var i, fakePart;
+
+ for (i = 0; i < fakeParts.length; i++) {
+ fakePart = fakeParts[i];
+
+ if (fakePart.charAt(0) === SPECIAL_TOKEN_MARKER) {
+ parts.push(
+ // the literal string IS the token's name.
+ // call special token's registered function.
+ specialTokens[fakePart.substring(1)](date)
+ );
+ }
+ else {
+ parts.push(fakePart);
+ }
+ }
+
+ return parts;
+}
+
+/*
+Accepts an almost-finally-formatted string and processes the "maybe" control characters, returning a new string.
+*/
+function processMaybeMarkers(s) {
+ return s.replace(MAYBE_REGEXP, function(m0, m1) { // regex assumed to have 'g' flag
+ if (m1.match(/[1-9]/)) { // any non-zero numeric characters?
+ return m1;
+ }
+ else {
+ return '';
+ }
+ });
+}
+
+
+// Misc Utils
+// -------------------------------------------------------------------------------------------------
+
+/*
+Returns a unit string, either 'year', 'month', 'day', or null for the most granular formatting token in the string.
+*/
+function queryMostGranularFormatUnit(formatStr) {
+ var chunks = chunkFormatString(formatStr);
var i, chunk;
var candidate;
var best;
for (i = 0; i < chunks.length; i++) {
chunk = chunks[i];
+
if (chunk.token) {
- candidate = tokenGranularities[chunk.token.charAt(0)];
+ candidate = largeTokenMap[chunk.token.charAt(0)];
if (candidate) {
if (!best || candidate.value > best.value) {
best = candidate;
@@ -1605,6 +1738,13 @@ FC.queryMostGranularFormatUnit = function(formatStr) {
return null;
};
+})();
+
+// quick local references
+var formatDate = FC.formatDate;
+var formatRange = FC.formatRange;
+var oldMomentFormat = FC.oldMomentFormat;
+
;;
FC.Class = Class; // export
@@ -1998,35 +2138,6 @@ var ListenerMixin = FC.ListenerMixin = (function() {
})();
;;
-// simple class for toggle a `isIgnoringMouse` flag on delay
-// initMouseIgnoring must first be called, with a millisecond delay setting.
-var MouseIgnorerMixin = {
-
- isIgnoringMouse: false, // bool
- delayUnignoreMouse: null, // method
-
-
- initMouseIgnoring: function(delay) {
- this.delayUnignoreMouse = debounce(proxy(this, 'unignoreMouse'), delay || 1000);
- },
-
-
- // temporarily ignore mouse actions on segments
- tempIgnoreMouse: function() {
- this.isIgnoringMouse = true;
- this.delayUnignoreMouse();
- },
-
-
- // delayUnignoreMouse eventually calls this
- unignoreMouse: function() {
- this.isIgnoringMouse = false;
- }
-
-};
-
-;;
-
/* A rectangular panel that is absolutely positioned over other content
------------------------------------------------------------------------------------------------------------------------
Options:
@@ -2457,7 +2568,7 @@ var CoordCache = FC.CoordCache = Class.extend({
----------------------------------------------------------------------------------------------------------------------*/
// TODO: use Emitter
-var DragListener = FC.DragListener = Class.extend(ListenerMixin, MouseIgnorerMixin, {
+var DragListener = FC.DragListener = Class.extend(ListenerMixin, {
options: null,
subjectEl: null,
@@ -2480,13 +2591,12 @@ var DragListener = FC.DragListener = Class.extend(ListenerMixin, MouseIgnorerMix
delayTimeoutId: null,
minDistance: null,
- handleTouchScrollProxy: null, // calls handleTouchScroll, always bound to `this`
+ shouldCancelTouchScroll: true,
+ scrollAlwaysKills: false,
constructor: function(options) {
this.options = options || {};
- this.handleTouchScrollProxy = proxy(this, 'handleTouchScroll');
- this.initMouseIgnoring(500);
},
@@ -2498,7 +2608,7 @@ var DragListener = FC.DragListener = Class.extend(ListenerMixin, MouseIgnorerMix
var isTouch = getEvIsTouch(ev);
if (ev.type === 'mousedown') {
- if (this.isIgnoringMouse) {
+ if (GlobalEmitter.get().shouldIgnoreMouse()) {
return;
}
else if (!isPrimaryMouseButton(ev)) {
@@ -2517,6 +2627,8 @@ var DragListener = FC.DragListener = Class.extend(ListenerMixin, MouseIgnorerMix
this.minDistance = firstDefined(extraOptions.distance, this.options.distance, 0);
this.subjectEl = this.options.subjectEl;
+ preventSelection($('body'));
+
this.isInteracting = true;
this.isTouch = isTouch;
this.isDelayEnded = false;
@@ -2558,12 +2670,7 @@ var DragListener = FC.DragListener = Class.extend(ListenerMixin, MouseIgnorerMix
this.isInteracting = false;
this.handleInteractionEnd(ev, isCancelled);
- // a touchstart+touchend on the same element will result in the following addition simulated events:
- // mouseover + mouseout + click
- // let's ignore these bogus events
- if (this.isTouch) {
- this.tempIgnoreMouse();
- }
+ allowSelection($('body'));
}
},
@@ -2578,45 +2685,25 @@ var DragListener = FC.DragListener = Class.extend(ListenerMixin, MouseIgnorerMix
bindHandlers: function() {
- var _this = this;
- var touchStartIgnores = 1;
+ // some browsers (Safari in iOS 10) don't allow preventDefault on touch events that are bound after touchstart,
+ // so listen to the GlobalEmitter singleton, which is always bound, instead of the document directly.
+ var globalEmitter = GlobalEmitter.get();
if (this.isTouch) {
- this.listenTo($(document), {
+ this.listenTo(globalEmitter, {
touchmove: this.handleTouchMove,
touchend: this.endInteraction,
- touchcancel: this.endInteraction,
-
- // Sometimes touchend doesn't fire
- // (can't figure out why. touchcancel doesn't fire either. has to do with scrolling?)
- // If another touchstart happens, we know it's bogus, so cancel the drag.
- // touchend will continue to be broken until user does a shorttap/scroll, but this is best we can do.
- touchstart: function(ev) {
- if (touchStartIgnores) { // bindHandlers is called from within a touchstart,
- touchStartIgnores--; // and we don't want this to fire immediately, so ignore.
- }
- else {
- _this.endInteraction(ev, true); // isCancelled=true
- }
- }
+ scroll: this.handleTouchScroll
});
-
- // listen to ALL scroll actions on the page
- if (
- !bindAnyScroll(this.handleTouchScrollProxy) && // hopefully this works and short-circuits the rest
- this.scrollEl // otherwise, attach a single handler to this
- ) {
- this.listenTo(this.scrollEl, 'scroll', this.handleTouchScroll);
- }
}
else {
- this.listenTo($(document), {
+ this.listenTo(globalEmitter, {
mousemove: this.handleMouseMove,
mouseup: this.endInteraction
});
}
- this.listenTo($(document), {
+ this.listenTo(globalEmitter, {
selectstart: preventDefault, // don't allow selection while dragging
contextmenu: preventDefault // long taps would open menu on Chrome dev tools
});
@@ -2624,13 +2711,7 @@ var DragListener = FC.DragListener = Class.extend(ListenerMixin, MouseIgnorerMix
unbindHandlers: function() {
- this.stopListeningTo($(document));
-
- // unbind scroll listening
- unbindAnyScroll(this.handleTouchScrollProxy);
- if (this.scrollEl) {
- this.stopListeningTo(this.scrollEl, 'scroll');
- }
+ this.stopListeningTo(GlobalEmitter.get());
},
@@ -2738,8 +2819,9 @@ var DragListener = FC.DragListener = Class.extend(ListenerMixin, MouseIgnorerMix
handleTouchMove: function(ev) {
+
// prevent inertia and touchmove-scrolling while dragging
- if (this.isDragging) {
+ if (this.isDragging && this.shouldCancelTouchScroll) {
ev.preventDefault();
}
@@ -2759,7 +2841,7 @@ var DragListener = FC.DragListener = Class.extend(ListenerMixin, MouseIgnorerMix
handleTouchScroll: function(ev) {
// if the drag is being initiated by touch, but a scroll happens before
// the drag-initiating delay is over, cancel the drag
- if (!this.isDragging) {
+ if (!this.isDragging || this.scrollAlwaysKills) {
this.endInteraction(ev, true); // isCancelled=true
}
},
@@ -2982,7 +3064,7 @@ options:
var HitDragListener = DragListener.extend({
component: null, // converts coordinates to hits
- // methods: prepareHits, releaseHits, queryHit
+ // methods: hitsNeeded, hitsNotNeeded, queryHit
origHit: null, // the hit the mouse was over when listening started
hit: null, // the hit the mouse is over
@@ -3004,7 +3086,8 @@ var HitDragListener = DragListener.extend({
var origPoint;
var point;
- this.computeCoords();
+ this.component.hitsNeeded();
+ this.computeScrollBounds(); // for autoscroll
if (ev) {
origPoint = { left: getEvX(ev), top: getEvY(ev) };
@@ -3043,13 +3126,6 @@ var HitDragListener = DragListener.extend({
},
- // Recomputes the drag-critical positions of elements
- computeCoords: function() {
- this.component.prepareHits();
- this.computeScrollBounds(); // why is this here??????
- },
-
-
// Called when the actual drag has started
handleDragStart: function(ev) {
var hit;
@@ -3128,7 +3204,7 @@ var HitDragListener = DragListener.extend({
this.origHit = null;
this.hit = null;
- this.component.releaseHits();
+ this.component.hitsNotNeeded();
},
@@ -3136,7 +3212,12 @@ var HitDragListener = DragListener.extend({
handleScrollEnd: function() {
DragListener.prototype.handleScrollEnd.apply(this, arguments); // call the super-method
- this.computeCoords(); // hits' absolute positions will be in new places. recompute
+ // hits' absolute positions will be in new places after a user's scroll.
+ // HACK for recomputing.
+ if (this.isDragging) {
+ this.component.releaseHits();
+ this.component.prepareHits();
+ }
},
@@ -3186,6 +3267,231 @@ function isHitPropsWithin(subHit, superHit) {
;;
+/*
+Listens to document and window-level user-interaction events, like touch events and mouse events,
+and fires these events as-is to whoever is observing a GlobalEmitter.
+Best when used as a singleton via GlobalEmitter.get()
+
+Normalizes mouse/touch events. For examples:
+- ignores the the simulated mouse events that happen after a quick tap: mousemove+mousedown+mouseup+click
+- compensates for various buggy scenarios where a touchend does not fire
+*/
+
+FC.touchMouseIgnoreWait = 500;
+
+var GlobalEmitter = Class.extend(ListenerMixin, EmitterMixin, {
+
+ isTouching: false,
+ mouseIgnoreDepth: 0,
+ handleScrollProxy: null,
+
+
+ bind: function() {
+ var _this = this;
+
+ this.listenTo($(document), {
+ touchstart: this.handleTouchStart,
+ touchcancel: this.handleTouchCancel,
+ touchend: this.handleTouchEnd,
+ mousedown: this.handleMouseDown,
+ mousemove: this.handleMouseMove,
+ mouseup: this.handleMouseUp,
+ click: this.handleClick,
+ selectstart: this.handleSelectStart,
+ contextmenu: this.handleContextMenu
+ });
+
+ // because we need to call preventDefault
+ // because https://www.chromestatus.com/features/5093566007214080
+ // TODO: investigate performance because this is a global handler
+ window.addEventListener(
+ 'touchmove',
+ this.handleTouchMoveProxy = function(ev) {
+ _this.handleTouchMove($.Event(ev));
+ },
+ { passive: false } // allows preventDefault()
+ );
+
+ // attach a handler to get called when ANY scroll action happens on the page.
+ // this was impossible to do with normal on/off because 'scroll' doesn't bubble.
+ // http://stackoverflow.com/a/32954565/96342
+ window.addEventListener(
+ 'scroll',
+ this.handleScrollProxy = function(ev) {
+ _this.handleScroll($.Event(ev));
+ },
+ true // useCapture
+ );
+ },
+
+ unbind: function() {
+ this.stopListeningTo($(document));
+
+ window.removeEventListener(
+ 'touchmove',
+ this.handleTouchMoveProxy
+ );
+
+ window.removeEventListener(
+ 'scroll',
+ this.handleScrollProxy,
+ true // useCapture
+ );
+ },
+
+
+ // Touch Handlers
+ // -----------------------------------------------------------------------------------------------------------------
+
+ handleTouchStart: function(ev) {
+
+ // if a previous touch interaction never ended with a touchend, then implicitly end it,
+ // but since a new touch interaction is about to begin, don't start the mouse ignore period.
+ this.stopTouch(ev, true); // skipMouseIgnore=true
+
+ this.isTouching = true;
+ this.trigger('touchstart', ev);
+ },
+
+ handleTouchMove: function(ev) {
+ if (this.isTouching) {
+ this.trigger('touchmove', ev);
+ }
+ },
+
+ handleTouchCancel: function(ev) {
+ if (this.isTouching) {
+ this.trigger('touchcancel', ev);
+
+ // Have touchcancel fire an artificial touchend. That way, handlers won't need to listen to both.
+ // If touchend fires later, it won't have any effect b/c isTouching will be false.
+ this.stopTouch(ev);
+ }
+ },
+
+ handleTouchEnd: function(ev) {
+ this.stopTouch(ev);
+ },
+
+
+ // Mouse Handlers
+ // -----------------------------------------------------------------------------------------------------------------
+
+ handleMouseDown: function(ev) {
+ if (!this.shouldIgnoreMouse()) {
+ this.trigger('mousedown', ev);
+ }
+ },
+
+ handleMouseMove: function(ev) {
+ if (!this.shouldIgnoreMouse()) {
+ this.trigger('mousemove', ev);
+ }
+ },
+
+ handleMouseUp: function(ev) {
+ if (!this.shouldIgnoreMouse()) {
+ this.trigger('mouseup', ev);
+ }
+ },
+
+ handleClick: function(ev) {
+ if (!this.shouldIgnoreMouse()) {
+ this.trigger('click', ev);
+ }
+ },
+
+
+ // Misc Handlers
+ // -----------------------------------------------------------------------------------------------------------------
+
+ handleSelectStart: function(ev) {
+ this.trigger('selectstart', ev);
+ },
+
+ handleContextMenu: function(ev) {
+ this.trigger('contextmenu', ev);
+ },
+
+ handleScroll: function(ev) {
+ this.trigger('scroll', ev);
+ },
+
+
+ // Utils
+ // -----------------------------------------------------------------------------------------------------------------
+
+ stopTouch: function(ev, skipMouseIgnore) {
+ if (this.isTouching) {
+ this.isTouching = false;
+ this.trigger('touchend', ev);
+
+ if (!skipMouseIgnore) {
+ this.startTouchMouseIgnore();
+ }
+ }
+ },
+
+ startTouchMouseIgnore: function() {
+ var _this = this;
+ var wait = FC.touchMouseIgnoreWait;
+
+ if (wait) {
+ this.mouseIgnoreDepth++;
+ setTimeout(function() {
+ _this.mouseIgnoreDepth--;
+ }, wait);
+ }
+ },
+
+ shouldIgnoreMouse: function() {
+ return this.isTouching || Boolean(this.mouseIgnoreDepth);
+ }
+
+});
+
+
+// Singleton
+// ---------------------------------------------------------------------------------------------------------------------
+
+(function() {
+ var globalEmitter = null;
+ var neededCount = 0;
+
+
+ // gets the singleton
+ GlobalEmitter.get = function() {
+
+ if (!globalEmitter) {
+ globalEmitter = new GlobalEmitter();
+ globalEmitter.bind();
+ }
+
+ return globalEmitter;
+ };
+
+
+ // called when an object knows it will need a GlobalEmitter in the near future.
+ GlobalEmitter.needed = function() {
+ GlobalEmitter.get(); // ensures globalEmitter
+ neededCount++;
+ };
+
+
+ // called when the object that originally called needed() doesn't need a GlobalEmitter anymore.
+ GlobalEmitter.unneeded = function() {
+ neededCount--;
+
+ if (!neededCount) { // nobody else needs it
+ globalEmitter.unbind();
+ globalEmitter = null;
+ }
+ };
+
+})();
+
+;;
+
/* Creates a clone of an element and lets it track the mouse as it moves
----------------------------------------------------------------------------------------------------------------------*/
@@ -3383,7 +3689,7 @@ var MouseFollower = Class.extend(ListenerMixin, {
/* An abstract class comprised of a "grid" of areas that each represent a specific datetime
----------------------------------------------------------------------------------------------------------------------*/
-var Grid = FC.Grid = Class.extend(ListenerMixin, MouseIgnorerMixin, {
+var Grid = FC.Grid = Class.extend(ListenerMixin, {
// self-config, overridable by subclasses
hasDayInteractions: true, // can user click/select ranges of time?
@@ -3409,7 +3715,8 @@ var Grid = FC.Grid = Class.extend(ListenerMixin, MouseIgnorerMixin, {
// TODO: port isTimeScale into same system?
largeUnit: null,
- dayDragListener: null,
+ dayClickListener: null,
+ daySelectListener: null,
segDragListener: null,
segResizeListener: null,
externalDragListener: null,
@@ -3420,8 +3727,8 @@ var Grid = FC.Grid = Class.extend(ListenerMixin, MouseIgnorerMixin, {
this.isRTL = view.opt('isRTL');
this.elsByFill = {};
- this.dayDragListener = this.buildDayDragListener();
- this.initMouseIgnoring();
+ this.dayClickListener = this.buildDayClickListener();
+ this.daySelectListener = this.buildDaySelectListener();
},
@@ -3516,6 +3823,20 @@ var Grid = FC.Grid = Class.extend(ListenerMixin, MouseIgnorerMixin, {
/* Hit Area
------------------------------------------------------------------------------------------------------------------*/
+ hitsNeededDepth: 0, // necessary because multiple callers might need the same hits
+
+ hitsNeeded: function() {
+ if (!(this.hitsNeededDepth++)) {
+ this.prepareHits();
+ }
+ },
+
+ hitsNotNeeded: function() {
+ if (this.hitsNeededDepth && !(--this.hitsNeededDepth)) {
+ this.releaseHits();
+ }
+ },
+
// Called before one or more queryHit calls might happen. Should prepare any cached coordinates for queryHit
prepareHits: function() {
@@ -3643,9 +3964,19 @@ var Grid = FC.Grid = Class.extend(ListenerMixin, MouseIgnorerMixin, {
// Process a mousedown on an element that represents a day. For day clicking and selecting.
dayMousedown: function(ev) {
- if (!this.isIgnoringMouse) {
- this.dayDragListener.startInteraction(ev, {
- //distance: 5, // needs more work if we want dayClick to fire correctly
+ var view = this.view;
+
+ // prevent a user's clickaway for unselecting a range or an event from
+ // causing a dayClick or starting an immediate new selection.
+ if (view.isSelected || view.selectedEvent) {
+ return;
+ }
+
+ this.dayClickListener.startInteraction(ev);
+
+ if (view.opt('selectable')) {
+ this.daySelectListener.startInteraction(ev, {
+ distance: view.opt('selectMinDistance')
});
}
},
@@ -3653,40 +3984,79 @@ var Grid = FC.Grid = Class.extend(ListenerMixin, MouseIgnorerMixin, {
dayTouchStart: function(ev) {
var view = this.view;
- var selectLongPressDelay = view.opt('selectLongPressDelay');
+ var selectLongPressDelay;
- // HACK to prevent a user's clickaway for unselecting a range or an event
- // from causing a dayClick.
+ // prevent a user's clickaway for unselecting a range or an event from
+ // causing a dayClick or starting an immediate new selection.
if (view.isSelected || view.selectedEvent) {
- this.tempIgnoreMouse();
+ return;
}
+ selectLongPressDelay = view.opt('selectLongPressDelay');
if (selectLongPressDelay == null) {
selectLongPressDelay = view.opt('longPressDelay'); // fallback
}
- this.dayDragListener.startInteraction(ev, {
- delay: selectLongPressDelay
- });
+ this.dayClickListener.startInteraction(ev);
+
+ if (view.opt('selectable')) {
+ this.daySelectListener.startInteraction(ev, {
+ delay: selectLongPressDelay
+ });
+ }
},
- // Creates a listener that tracks the user's drag across day elements.
- // For day clicking and selecting.
- buildDayDragListener: function() {
+ // Creates a listener that tracks the user's drag across day elements, for day clicking.
+ buildDayClickListener: function() {
var _this = this;
var view = this.view;
- var isSelectable = view.opt('selectable');
var dayClickHit; // null if invalid dayClick
+
+ var dragListener = new HitDragListener(this, {
+ scroll: view.opt('dragScroll'),
+ interactionStart: function() {
+ dayClickHit = dragListener.origHit;
+ },
+ hitOver: function(hit, isOrig, origHit) {
+ // if user dragged to another cell at any point, it can no longer be a dayClick
+ if (!isOrig) {
+ dayClickHit = null;
+ }
+ },
+ hitOut: function() { // called before mouse moves to a different hit OR moved out of all hits
+ dayClickHit = null;
+ },
+ interactionEnd: function(ev, isCancelled) {
+ if (!isCancelled && dayClickHit) {
+ view.triggerDayClick(
+ _this.getHitSpan(dayClickHit),
+ _this.getHitEl(dayClickHit),
+ ev
+ );
+ }
+ }
+ });
+
+ // because dayClickListener won't be called with any time delay, "dragging" will begin immediately,
+ // which will kill any touchmoving/scrolling. Prevent this.
+ dragListener.shouldCancelTouchScroll = false;
+
+ dragListener.scrollAlwaysKills = true;
+
+ return dragListener;
+ },
+
+
+ // Creates a listener that tracks the user's drag across day elements, for day selecting.
+ buildDaySelectListener: function() {
+ var _this = this;
+ var view = this.view;
var selectionSpan; // null if invalid selection
- // this listener tracks a mousedown on a day element, and a subsequent drag.
- // if the drag ends on the same day, it is a 'dayClick'.
- // if 'selectable' is enabled, this listener also detects selections.
var dragListener = new HitDragListener(this, {
scroll: view.opt('dragScroll'),
interactionStart: function() {
- dayClickHit = dragListener.origHit; // for dayClick, where no dragging happens
selectionSpan = null;
},
dragStart: function() {
@@ -3695,27 +4065,20 @@ var Grid = FC.Grid = Class.extend(ListenerMixin, MouseIgnorerMixin, {
hitOver: function(hit, isOrig, origHit) {
if (origHit) { // click needs to have started on a hit
- // if user dragged to another cell at any point, it can no longer be a dayClick
- if (!isOrig) {
- dayClickHit = null;
- }
+ selectionSpan = _this.computeSelection(
+ _this.getHitSpan(origHit),
+ _this.getHitSpan(hit)
+ );
- if (isSelectable) {
- selectionSpan = _this.computeSelection(
- _this.getHitSpan(origHit),
- _this.getHitSpan(hit)
- );
- if (selectionSpan) {
- _this.renderSelection(selectionSpan);
- }
- else if (selectionSpan === false) {
- disableCursor();
- }
+ if (selectionSpan) {
+ _this.renderSelection(selectionSpan);
+ }
+ else if (selectionSpan === false) {
+ disableCursor();
}
}
},
hitOut: function() { // called before mouse moves to a different hit OR moved out of all hits
- dayClickHit = null;
selectionSpan = null;
_this.unrenderSelection();
},
@@ -3723,21 +4086,9 @@ var Grid = FC.Grid = Class.extend(ListenerMixin, MouseIgnorerMixin, {
enableCursor();
},
interactionEnd: function(ev, isCancelled) {
- if (!isCancelled) {
- if (
- dayClickHit &&
- !_this.isIgnoringMouse // see hack in dayTouchStart
- ) {
- view.triggerDayClick(
- _this.getHitSpan(dayClickHit),
- _this.getHitEl(dayClickHit),
- ev
- );
- }
- if (selectionSpan) {
- // the selection will already have been rendered. just report it
- view.reportSelection(selectionSpan, ev);
- }
+ if (!isCancelled && selectionSpan) {
+ // the selection will already have been rendered. just report it
+ view.reportSelection(selectionSpan, ev);
}
}
});
@@ -3750,7 +4101,8 @@ var Grid = FC.Grid = Class.extend(ListenerMixin, MouseIgnorerMixin, {
// Useful for when public API methods that result in re-rendering are invoked during a drag.
// Also useful for when touch devices misbehave and don't fire their touchend.
clearDragListeners: function() {
- this.dayDragListener.endInteraction();
+ this.dayClickListener.endInteraction();
+ this.daySelectListener.endInteraction();
if (this.segDragListener) {
this.segDragListener.endInteraction(); // will clear this.segDragListener
@@ -4269,7 +4621,6 @@ Grid.mixin({
// Attaches event-element-related handlers to an arbitrary container element. leverages bubbling.
bindSegHandlersToEl: function(el) {
this.bindSegHandlerToEl(el, 'touchstart', this.handleSegTouchStart);
- this.bindSegHandlerToEl(el, 'touchend', this.handleSegTouchEnd);
this.bindSegHandlerToEl(el, 'mouseenter', this.handleSegMouseover);
this.bindSegHandlerToEl(el, 'mouseleave', this.handleSegMouseout);
this.bindSegHandlerToEl(el, 'mousedown', this.handleSegMousedown);
@@ -4304,7 +4655,7 @@ Grid.mixin({
// Updates internal state and triggers handlers for when an event element is moused over
handleSegMouseover: function(seg, ev) {
if (
- !this.isIgnoringMouse &&
+ !GlobalEmitter.get().shouldIgnoreMouse() &&
!this.mousedOverSeg
) {
this.mousedOverSeg = seg;
@@ -4374,16 +4725,6 @@ Grid.mixin({
delay: isSelected ? 0 : eventLongPressDelay // do delay if not already selected
});
}
-
- // a long tap simulates a mouseover. ignore this bogus mouseover.
- this.tempIgnoreMouse();
- },
-
-
- handleSegTouchEnd: function(seg, ev) {
- // touchstart+touchend = click, which simulates a mouseover.
- // ignore this bogus mouseover.
- this.tempIgnoreMouse();
},
@@ -4509,7 +4850,7 @@ Grid.mixin({
if (dropLocation) {
// no need to re-show original, will rerender all anyways. esp important if eventRenderWait
- view.reportEventDrop(event, dropLocation, _this.largeUnit, el, ev);
+ view.reportSegDrop(seg, dropLocation, _this.largeUnit, el, ev);
}
else {
view.showEvent(event);
@@ -4812,7 +5153,7 @@ Grid.mixin({
if (resizeLocation) { // valid date to resize to?
// no need to re-show original, will rerender all anyways. esp important if eventRenderWait
- view.reportEventResize(event, resizeLocation, _this.largeUnit, el, ev);
+ view.reportSegResize(seg, resizeLocation, _this.largeUnit, el, ev);
}
else {
view.showEvent(event);
@@ -6833,9 +7174,9 @@ DayGrid.mixin({
// because segments in the popover are not part of a grid coordinate system, provide a hint to any
// grids that want to do drag-n-drop about which cell it came from
- this.prepareHits();
+ this.hitsNeeded();
segs[i].hit = this.getCellHit(row, col);
- this.releaseHits();
+ this.hitsNotNeeded();
segContainer.append(segs[i].el);
}
@@ -8261,11 +8602,23 @@ var View = FC.View = Class.extend(EmitterMixin, ListenerMixin, {
// Computes what the title at the top of the calendar should be for this view
computeTitle: function() {
+ var start, end;
+
+ // for views that span a large unit of time, show the proper interval, ignoring stray days before and after
+ if (this.intervalUnit === 'year' || this.intervalUnit === 'month') {
+ start = this.intervalStart;
+ end = this.intervalEnd;
+ }
+ else { // for day units or smaller, use the actual day range
+ start = this.start;
+ end = this.end;
+ }
+
return this.formatRange(
{
// in case intervalStart/End has a time, make sure timezone is correct
- start: this.calendar.applyTimezone(this.intervalStart),
- end: this.calendar.applyTimezone(this.intervalEnd)
+ start: this.calendar.applyTimezone(start),
+ end: this.calendar.applyTimezone(end)
},
this.opt('titleFormat') || this.computeTitleFormat(),
this.opt('titleRangeSeparator')
@@ -8579,14 +8932,16 @@ var View = FC.View = Class.extend(EmitterMixin, ListenerMixin, {
// Binds DOM handlers to elements that reside outside the view container, such as the document
bindGlobalHandlers: function() {
- this.listenTo($(document), 'mousedown', this.handleDocumentMousedown);
- this.listenTo($(document), 'touchstart', this.processUnselect);
+ this.listenTo(GlobalEmitter.get(), {
+ touchstart: this.processUnselect,
+ mousedown: this.handleDocumentMousedown
+ });
},
// Unbinds DOM handlers from elements that reside outside the view container
unbindGlobalHandlers: function() {
- this.stopListeningTo($(document));
+ this.stopListeningTo(GlobalEmitter.get());
},
@@ -9158,15 +9513,15 @@ var View = FC.View = Class.extend(EmitterMixin, ListenerMixin, {
// Must be called when an event in the view is dropped onto new location.
// `dropLocation` is an object that contains the new zoned start/end/allDay values for the event.
- reportEventDrop: function(event, dropLocation, largeUnit, el, ev) {
+ reportSegDrop: function(seg, dropLocation, largeUnit, el, ev) {
var calendar = this.calendar;
- var mutateResult = calendar.mutateEvent(event, dropLocation, largeUnit);
+ var mutateResult = calendar.mutateSeg(seg, dropLocation, largeUnit);
var undoFunc = function() {
mutateResult.undo();
calendar.reportEventChange();
};
- this.triggerEventDrop(event, mutateResult.dateDelta, undoFunc, el, ev);
+ this.triggerEventDrop(seg.event, mutateResult.dateDelta, undoFunc, el, ev);
calendar.reportEventChange(); // will rerender events
},
@@ -9261,15 +9616,15 @@ var View = FC.View = Class.extend(EmitterMixin, ListenerMixin, {
// Must be called when an event in the view has been resized to a new length
- reportEventResize: function(event, resizeLocation, largeUnit, el, ev) {
+ reportSegResize: function(seg, resizeLocation, largeUnit, el, ev) {
var calendar = this.calendar;
- var mutateResult = calendar.mutateEvent(event, resizeLocation, largeUnit);
+ var mutateResult = calendar.mutateSeg(seg, resizeLocation, largeUnit);
var undoFunc = function() {
mutateResult.undo();
calendar.reportEventChange();
};
- this.triggerEventResize(event, mutateResult.durationDelta, undoFunc, el, ev);
+ this.triggerEventResize(seg.event, mutateResult.durationDelta, undoFunc, el, ev);
calendar.reportEventChange(); // will rerender events
},
@@ -10202,6 +10557,9 @@ Calendar.mixin(EmitterMixin);
function Calendar_constructor(element, overrides) {
var t = this;
+ // declare the current calendar instance relies on GlobalEmitter. needed for garbage collection.
+ GlobalEmitter.needed();
+
// Exports
// -----------------------------------------------------------------------------------
@@ -10545,6 +10903,8 @@ function Calendar_constructor(element, overrides) {
if (windowResizeProxy) {
$(window).unbind('resize', windowResizeProxy);
}
+
+ GlobalEmitter.unneeded();
}
@@ -11176,6 +11536,7 @@ Calendar.defaults = {
//selectable: false,
unselectAuto: true,
+ //selectMinDistance: 0,
dropAccept: '*',
@@ -12551,6 +12912,12 @@ function EventManager() { // assumed to be a calendar
}
+// returns an undo function
+Calendar.prototype.mutateSeg = function(seg, newProps) {
+ return this.mutateEvent(seg.event, newProps);
+};
+
+
// hook for external libs to manipulate event properties upon creation.
// should manipulate the event in-place.
Calendar.prototype.normalizeEvent = function(event) {
@@ -13096,6 +13463,16 @@ var BasicView = FC.BasicView = View.extend({
// forward all hit-related method calls to dayGrid
+ hitsNeeded: function() {
+ this.dayGrid.hitsNeeded();
+ },
+
+
+ hitsNotNeeded: function() {
+ this.dayGrid.hitsNotNeeded();
+ },
+
+
prepareHits: function() {
this.dayGrid.prepareHits();
},
@@ -13623,6 +14000,22 @@ var AgendaView = FC.AgendaView = View.extend({
// forward all hit-related method calls to the grids (dayGrid might not be defined)
+ hitsNeeded: function() {
+ this.timeGrid.hitsNeeded();
+ if (this.dayGrid) {
+ this.dayGrid.hitsNeeded();
+ }
+ },
+
+
+ hitsNotNeeded: function() {
+ this.timeGrid.hitsNotNeeded();
+ if (this.dayGrid) {
+ this.dayGrid.hitsNotNeeded();
+ }
+ },
+
+
prepareHits: function() {
this.timeGrid.prepareHits();
if (this.dayGrid) {
diff --git a/library/fullcalendar/fullcalendar.min.css b/library/fullcalendar/fullcalendar.min.css
index 1339120b4..255dbfffa 100644
--- a/library/fullcalendar/fullcalendar.min.css
+++ b/library/fullcalendar/fullcalendar.min.css
@@ -1,5 +1,5 @@
/*!
- * FullCalendar v3.1.0 Stylesheet
- * Docs & License: http://fullcalendar.io/
- * (c) 2016 Adam Shaw
+ * FullCalendar v3.2.0 Stylesheet
+ * Docs & License: https://fullcalendar.io/
+ * (c) 2017 Adam Shaw
*/.fc-icon,body .fc{font-size:1em}.fc-button-group,.fc-icon{display:inline-block}.fc-bg,.fc-row .fc-bgevent-skeleton,.fc-row .fc-highlight-skeleton{bottom:0}.fc-icon,.fc-unselectable{-khtml-user-select:none;-webkit-touch-callout:none}.fc{direction:ltr;text-align:left}.fc-rtl{text-align:right}.fc th,.fc-basic-view td.fc-week-number,.fc-icon,.fc-toolbar{text-align:center}.fc-unthemed .fc-content,.fc-unthemed .fc-divider,.fc-unthemed .fc-list-heading td,.fc-unthemed .fc-list-view,.fc-unthemed .fc-popover,.fc-unthemed .fc-row,.fc-unthemed tbody,.fc-unthemed td,.fc-unthemed th,.fc-unthemed thead{border-color:#ddd}.fc-unthemed .fc-popover{background-color:#fff}.fc-unthemed .fc-divider,.fc-unthemed .fc-list-heading td,.fc-unthemed .fc-popover .fc-header{background:#eee}.fc-unthemed .fc-popover .fc-header .fc-close{color:#666}.fc-unthemed td.fc-today{background:#fcf8e3}.fc-highlight{background:#bce8f1;opacity:.3}.fc-bgevent{background:#8fdf82;opacity:.3}.fc-nonbusiness{background:#d7d7d7}.fc-icon{height:1em;line-height:1em;overflow:hidden;font-family:"Courier New",Courier,monospace;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.fc-icon:after{position:relative}.fc-icon-left-single-arrow:after{content:"\02039";font-weight:700;font-size:200%;top:-7%}.fc-icon-right-single-arrow:after{content:"\0203A";font-weight:700;font-size:200%;top:-7%}.fc-icon-left-double-arrow:after{content:"\000AB";font-size:160%;top:-7%}.fc-icon-right-double-arrow:after{content:"\000BB";font-size:160%;top:-7%}.fc-icon-left-triangle:after{content:"\25C4";font-size:125%;top:3%}.fc-icon-right-triangle:after{content:"\25BA";font-size:125%;top:3%}.fc-icon-down-triangle:after{content:"\25BC";font-size:125%;top:2%}.fc-icon-x:after{content:"\000D7";font-size:200%;top:6%}.fc button{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;height:2.1em;padding:0 .6em;font-size:1em;white-space:nowrap;cursor:pointer}.fc button::-moz-focus-inner{margin:0;padding:0}.fc-state-default{border:1px solid;background-color:#f5f5f5;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);color:#333;text-shadow:0 1px 1px rgba(255,255,255,.75);box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05)}.fc-state-default.fc-corner-left{border-top-left-radius:4px;border-bottom-left-radius:4px}.fc-state-default.fc-corner-right{border-top-right-radius:4px;border-bottom-right-radius:4px}.fc button .fc-icon{position:relative;top:-.05em;margin:0 .2em;vertical-align:middle}.fc-state-active,.fc-state-disabled,.fc-state-down,.fc-state-hover{color:#333;background-color:#e6e6e6}.fc-state-hover{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.fc-state-active,.fc-state-down{background-color:#ccc;background-image:none;box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05)}.fc-state-disabled{cursor:default;background-image:none;opacity:.65;box-shadow:none}.fc-event.fc-draggable,.fc-event[href],.fc-popover .fc-header .fc-close,a[data-goto]{cursor:pointer}.fc .fc-button-group>*{float:left;margin:0 0 0 -1px}.fc .fc-button-group>:first-child{margin-left:0}.fc-popover{position:absolute;box-shadow:0 2px 6px rgba(0,0,0,.15)}.fc-popover .fc-header{padding:2px 4px}.fc-popover .fc-header .fc-title{margin:0 2px}.fc-ltr .fc-popover .fc-header .fc-title,.fc-rtl .fc-popover .fc-header .fc-close{float:left}.fc-ltr .fc-popover .fc-header .fc-close,.fc-rtl .fc-popover .fc-header .fc-title{float:right}.fc-unthemed .fc-popover{border-width:1px;border-style:solid}.fc-unthemed .fc-popover .fc-header .fc-close{font-size:.9em;margin-top:2px}.fc-popover>.ui-widget-header+.ui-widget-content{border-top:0}.fc-divider{border-style:solid;border-width:1px}hr.fc-divider{height:0;margin:0;padding:0 0 2px;border-width:1px 0}.fc-bg table,.fc-row .fc-bgevent-skeleton table,.fc-row .fc-highlight-skeleton table{height:100%}.fc-clear{clear:both}.fc-bg,.fc-bgevent-skeleton,.fc-helper-skeleton,.fc-highlight-skeleton{position:absolute;top:0;left:0;right:0}.fc table{width:100%;box-sizing:border-box;table-layout:fixed;border-collapse:collapse;border-spacing:0;font-size:1em}.fc td,.fc th{border-style:solid;border-width:1px;padding:0;vertical-align:top}.fc td.fc-today{border-style:double}a[data-goto]:hover{text-decoration:underline}.fc .fc-row{border-style:solid;border-width:0}.fc-row table{border-left:0 hidden transparent;border-right:0 hidden transparent;border-bottom:0 hidden transparent}.fc-row:first-child table{border-top:0 hidden transparent}.fc-row{position:relative}.fc-row .fc-bg{z-index:1}.fc-row .fc-bgevent-skeleton td,.fc-row .fc-highlight-skeleton td{border-color:transparent}.fc-row .fc-bgevent-skeleton{z-index:2}.fc-row .fc-highlight-skeleton{z-index:3}.fc-row .fc-content-skeleton{position:relative;z-index:4;padding-bottom:2px}.fc-row .fc-helper-skeleton{z-index:5}.fc-row .fc-content-skeleton td,.fc-row .fc-helper-skeleton td{background:0 0;border-color:transparent;border-bottom:0}.fc-row .fc-content-skeleton tbody td,.fc-row .fc-helper-skeleton tbody td{border-top:0}.fc-scroller{-webkit-overflow-scrolling:touch}.fc-row.fc-rigid,.fc-time-grid-event{overflow:hidden}.fc-scroller>.fc-day-grid,.fc-scroller>.fc-time-grid{position:relative;width:100%}.fc-event{position:relative;display:block;font-size:.85em;line-height:1.3;border-radius:3px;border:1px solid #3a87ad;font-weight:400}.fc-event,.fc-event-dot{background-color:#3a87ad}.fc-event,.fc-event:hover,.ui-widget .fc-event{color:#fff;text-decoration:none}.fc-not-allowed,.fc-not-allowed .fc-event{cursor:not-allowed}.fc-event .fc-bg{z-index:1;background:#fff;opacity:.25}.fc-event .fc-content{position:relative;z-index:2}.fc-event .fc-resizer{position:absolute;z-index:4;display:none}.fc-event.fc-allow-mouse-resize .fc-resizer,.fc-event.fc-selected .fc-resizer{display:block}.fc-event.fc-selected .fc-resizer:before{content:"";position:absolute;z-index:9999;top:50%;left:50%;width:40px;height:40px;margin-left:-20px;margin-top:-20px}.fc-event.fc-selected{z-index:9999!important;box-shadow:0 2px 5px rgba(0,0,0,.2)}.fc-event.fc-selected.fc-dragging{box-shadow:0 2px 7px rgba(0,0,0,.3)}.fc-h-event.fc-selected:before{content:"";position:absolute;z-index:3;top:-10px;bottom:-10px;left:0;right:0}.fc-ltr .fc-h-event.fc-not-start,.fc-rtl .fc-h-event.fc-not-end{margin-left:0;border-left-width:0;padding-left:1px;border-top-left-radius:0;border-bottom-left-radius:0}.fc-ltr .fc-h-event.fc-not-end,.fc-rtl .fc-h-event.fc-not-start{margin-right:0;border-right-width:0;padding-right:1px;border-top-right-radius:0;border-bottom-right-radius:0}.fc-ltr .fc-h-event .fc-start-resizer,.fc-rtl .fc-h-event .fc-end-resizer{cursor:w-resize;left:-1px}.fc-ltr .fc-h-event .fc-end-resizer,.fc-rtl .fc-h-event .fc-start-resizer{cursor:e-resize;right:-1px}.fc-h-event.fc-allow-mouse-resize .fc-resizer{width:7px;top:-1px;bottom:-1px}.fc-h-event.fc-selected .fc-resizer{border-radius:4px;border-width:1px;width:6px;height:6px;border-style:solid;border-color:inherit;background:#fff;top:50%;margin-top:-4px}.fc-ltr .fc-h-event.fc-selected .fc-start-resizer,.fc-rtl .fc-h-event.fc-selected .fc-end-resizer{margin-left:-4px}.fc-ltr .fc-h-event.fc-selected .fc-end-resizer,.fc-rtl .fc-h-event.fc-selected .fc-start-resizer{margin-right:-4px}.fc-day-grid-event{margin:1px 2px 0;padding:0 1px}tr:first-child>td>.fc-day-grid-event{margin-top:2px}.fc-day-grid-event.fc-selected:after{content:"";position:absolute;z-index:1;top:-1px;right:-1px;bottom:-1px;left:-1px;background:#000;opacity:.25}.fc-day-grid-event .fc-content{white-space:nowrap;overflow:hidden}.fc-day-grid-event .fc-time{font-weight:700}.fc-ltr .fc-day-grid-event.fc-allow-mouse-resize .fc-start-resizer,.fc-rtl .fc-day-grid-event.fc-allow-mouse-resize .fc-end-resizer{margin-left:-2px}.fc-ltr .fc-day-grid-event.fc-allow-mouse-resize .fc-end-resizer,.fc-rtl .fc-day-grid-event.fc-allow-mouse-resize .fc-start-resizer{margin-right:-2px}a.fc-more{margin:1px 3px;font-size:.85em;cursor:pointer;text-decoration:none}a.fc-more:hover{text-decoration:underline}.fc-limited{display:none}.fc-day-grid .fc-row{z-index:1}.fc-more-popover{z-index:2;width:220px}.fc-more-popover .fc-event-container{padding:10px}.fc-now-indicator{position:absolute;border:0 solid red}.fc-unselectable{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent}.fc-toolbar.fc-header-toolbar{margin-bottom:1em}.fc-toolbar.fc-footer-toolbar{margin-top:1em}.fc-toolbar .fc-left{float:left}.fc-toolbar .fc-right{float:right}.fc-toolbar .fc-center{display:inline-block}.fc .fc-toolbar>*>*{float:left;margin-left:.75em}.fc .fc-toolbar>*>:first-child{margin-left:0}.fc-toolbar h2{margin:0}.fc-toolbar button{position:relative}.fc-toolbar .fc-state-hover,.fc-toolbar .ui-state-hover{z-index:2}.fc-toolbar .fc-state-down{z-index:3}.fc-toolbar .fc-state-active,.fc-toolbar .ui-state-active{z-index:4}.fc-toolbar button:focus{z-index:5}.fc-view-container *,.fc-view-container :after,.fc-view-container :before{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.fc-view,.fc-view>table{position:relative;z-index:1}.fc-basicDay-view .fc-content-skeleton,.fc-basicWeek-view .fc-content-skeleton{padding-bottom:1em}.fc-basic-view .fc-body .fc-row{min-height:4em}.fc-row.fc-rigid .fc-content-skeleton{position:absolute;top:0;left:0;right:0}.fc-day-top.fc-other-month{opacity:.3}.fc-basic-view .fc-day-number,.fc-basic-view .fc-week-number{padding:2px}.fc-basic-view th.fc-day-number,.fc-basic-view th.fc-week-number{padding:0 2px}.fc-ltr .fc-basic-view .fc-day-top .fc-day-number{float:right}.fc-rtl .fc-basic-view .fc-day-top .fc-day-number{float:left}.fc-ltr .fc-basic-view .fc-day-top .fc-week-number{float:left;border-radius:0 0 3px}.fc-rtl .fc-basic-view .fc-day-top .fc-week-number{float:right;border-radius:0 0 0 3px}.fc-basic-view .fc-day-top .fc-week-number{min-width:1.5em;text-align:center;background-color:#f2f2f2;color:grey}.fc-basic-view td.fc-week-number>*{display:inline-block;min-width:1.25em}.fc-agenda-view .fc-day-grid{position:relative;z-index:2}.fc-agenda-view .fc-day-grid .fc-row{min-height:3em}.fc-agenda-view .fc-day-grid .fc-row .fc-content-skeleton{padding-bottom:1em}.fc .fc-axis{vertical-align:middle;padding:0 4px;white-space:nowrap}.fc-ltr .fc-axis{text-align:right}.fc-rtl .fc-axis{text-align:left}.ui-widget td.fc-axis{font-weight:400}.fc-time-grid,.fc-time-grid-container{position:relative;z-index:1}.fc-time-grid{min-height:100%}.fc-time-grid table{border:0 hidden transparent}.fc-time-grid>.fc-bg{z-index:1}.fc-time-grid .fc-slats,.fc-time-grid>hr{position:relative;z-index:2}.fc-time-grid .fc-content-col{position:relative}.fc-time-grid .fc-content-skeleton{position:absolute;z-index:3;top:0;left:0;right:0}.fc-time-grid .fc-business-container{position:relative;z-index:1}.fc-time-grid .fc-bgevent-container{position:relative;z-index:2}.fc-time-grid .fc-highlight-container{z-index:3;position:relative}.fc-time-grid .fc-event-container{position:relative;z-index:4}.fc-time-grid .fc-now-indicator-line{z-index:5}.fc-time-grid .fc-helper-container{position:relative;z-index:6}.fc-time-grid .fc-slats td{height:1.5em;border-bottom:0}.fc-time-grid .fc-slats .fc-minor td{border-top-style:dotted}.fc-time-grid .fc-slats .ui-widget-content{background:0 0}.fc-time-grid .fc-highlight{position:absolute;left:0;right:0}.fc-ltr .fc-time-grid .fc-event-container{margin:0 2.5% 0 2px}.fc-rtl .fc-time-grid .fc-event-container{margin:0 2px 0 2.5%}.fc-time-grid .fc-bgevent,.fc-time-grid .fc-event{position:absolute;z-index:1}.fc-time-grid .fc-bgevent{left:0;right:0}.fc-v-event.fc-not-start{border-top-width:0;padding-top:1px;border-top-left-radius:0;border-top-right-radius:0}.fc-v-event.fc-not-end{border-bottom-width:0;padding-bottom:1px;border-bottom-left-radius:0;border-bottom-right-radius:0}.fc-time-grid-event.fc-selected{overflow:visible}.fc-time-grid-event.fc-selected .fc-bg{display:none}.fc-time-grid-event .fc-content{overflow:hidden}.fc-time-grid-event .fc-time,.fc-time-grid-event .fc-title{padding:0 1px}.fc-time-grid-event .fc-time{font-size:.85em;white-space:nowrap}.fc-time-grid-event.fc-short .fc-content{white-space:nowrap}.fc-time-grid-event.fc-short .fc-time,.fc-time-grid-event.fc-short .fc-title{display:inline-block;vertical-align:top}.fc-time-grid-event.fc-short .fc-time span{display:none}.fc-time-grid-event.fc-short .fc-time:before{content:attr(data-start)}.fc-time-grid-event.fc-short .fc-time:after{content:"\000A0-\000A0"}.fc-time-grid-event.fc-short .fc-title{font-size:.85em;padding:0}.fc-time-grid-event.fc-allow-mouse-resize .fc-resizer{left:0;right:0;bottom:0;height:8px;overflow:hidden;line-height:8px;font-size:11px;font-family:monospace;text-align:center;cursor:s-resize}.fc-time-grid-event.fc-allow-mouse-resize .fc-resizer:after{content:"="}.fc-time-grid-event.fc-selected .fc-resizer{border-radius:5px;border-width:1px;width:8px;height:8px;border-style:solid;border-color:inherit;background:#fff;left:50%;margin-left:-5px;bottom:-5px}.fc-time-grid .fc-now-indicator-line{border-top-width:1px;left:0;right:0}.fc-time-grid .fc-now-indicator-arrow{margin-top:-5px}.fc-ltr .fc-time-grid .fc-now-indicator-arrow{left:0;border-width:5px 0 5px 6px;border-top-color:transparent;border-bottom-color:transparent}.fc-rtl .fc-time-grid .fc-now-indicator-arrow{right:0;border-width:5px 6px 5px 0;border-top-color:transparent;border-bottom-color:transparent}.fc-event-dot{display:inline-block;width:10px;height:10px;border-radius:5px}.fc-rtl .fc-list-view{direction:rtl}.fc-list-view{border-width:1px;border-style:solid}.fc .fc-list-table{table-layout:auto}.fc-list-table td{border-width:1px 0 0;padding:8px 14px}.fc-list-table tr:first-child td{border-top-width:0}.fc-list-heading{border-bottom-width:1px}.fc-list-heading td{font-weight:700}.fc-ltr .fc-list-heading-main{float:left}.fc-ltr .fc-list-heading-alt,.fc-rtl .fc-list-heading-main{float:right}.fc-rtl .fc-list-heading-alt{float:left}.fc-list-item.fc-has-url{cursor:pointer}.fc-list-item:hover td{background-color:#f5f5f5}.fc-list-item-marker,.fc-list-item-time{white-space:nowrap;width:1px}.fc-ltr .fc-list-item-marker{padding-right:0}.fc-rtl .fc-list-item-marker{padding-left:0}.fc-list-item-title a{text-decoration:none;color:inherit}.fc-list-item-title a[href]:hover{text-decoration:underline}.fc-list-empty-wrap2{position:absolute;top:0;left:0;right:0;bottom:0}.fc-list-empty-wrap1{width:100%;height:100%;display:table}.fc-list-empty{display:table-cell;vertical-align:middle;text-align:center}.fc-unthemed .fc-list-empty{background-color:#eee} \ No newline at end of file
diff --git a/library/fullcalendar/fullcalendar.min.js b/library/fullcalendar/fullcalendar.min.js
index 8484b7c45..c5eb8c751 100644
--- a/library/fullcalendar/fullcalendar.min.js
+++ b/library/fullcalendar/fullcalendar.min.js
@@ -1,10 +1,10 @@
/*!
- * FullCalendar v3.1.0
- * Docs & License: http://fullcalendar.io/
- * (c) 2016 Adam Shaw
+ * FullCalendar v3.2.0
+ * Docs & License: https://fullcalendar.io/
+ * (c) 2017 Adam Shaw
*/
-!function(t){"function"==typeof define&&define.amd?define(["jquery","moment"],t):"object"==typeof exports?module.exports=t(require("jquery"),require("moment")):t(jQuery,moment)}(function(t,e){function n(t){return q(t,$t)}function i(t,e){e.left&&t.css({"border-left-width":1,"margin-left":e.left-1}),e.right&&t.css({"border-right-width":1,"margin-right":e.right-1})}function r(t){t.css({"margin-left":"","margin-right":"","border-left-width":"","border-right-width":""})}function s(){t("body").addClass("fc-not-allowed")}function o(){t("body").removeClass("fc-not-allowed")}function l(e,n,i){var r=Math.floor(n/e.length),s=Math.floor(n-r*(e.length-1)),o=[],l=[],u=[],c=0;a(e),e.each(function(n,i){var a=n===e.length-1?s:r,d=t(i).outerHeight(!0);d<a?(o.push(i),l.push(d),u.push(t(i).height())):c+=d}),i&&(n-=c,r=Math.floor(n/o.length),s=Math.floor(n-r*(o.length-1))),t(o).each(function(e,n){var i=e===o.length-1?s:r,a=l[e],c=u[e],d=i-(a-c);a<i&&t(n).height(d)})}function a(t){t.height("")}function u(e){var n=0;return e.find("> *").each(function(e,i){var r=t(i).outerWidth();r>n&&(n=r)}),n++,e.width(n),n}function c(t,e){var n,i=t.add(e);return i.css({position:"relative",left:-1}),n=t.outerHeight()-e.outerHeight(),i.css({position:"",left:""}),n}function d(e){var n=e.css("position"),i=e.parents().filter(function(){var e=t(this);return/(auto|scroll)/.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==n&&i.length?i:t(e[0].ownerDocument||document)}function h(t,e){var n=t.offset(),i=n.left-(e?e.left:0),r=n.top-(e?e.top:0);return{left:i,right:i+t.outerWidth(),top:r,bottom:r+t.outerHeight()}}function f(t,e){var n=t.offset(),i=p(t),r=n.left+y(t,"border-left-width")+i.left-(e?e.left:0),s=n.top+y(t,"border-top-width")+i.top-(e?e.top:0);return{left:r,right:r+t[0].clientWidth,top:s,bottom:s+t[0].clientHeight}}function g(t,e){var n=t.offset(),i=n.left+y(t,"border-left-width")+y(t,"padding-left")-(e?e.left:0),r=n.top+y(t,"border-top-width")+y(t,"padding-top")-(e?e.top:0);return{left:i,right:i+t.width(),top:r,bottom:r+t.height()}}function p(t){var e=t.innerWidth()-t[0].clientWidth,n={left:0,right:0,top:0,bottom:t.innerHeight()-t[0].clientHeight};return v()&&"rtl"==t.css("direction")?n.left=e:n.right=e,n}function v(){return null===Qt&&(Qt=m()),Qt}function m(){var e=t("<div><div/></div>").css({position:"absolute",top:-1e3,left:0,border:0,padding:0,overflow:"scroll",direction:"rtl"}).appendTo("body"),n=e.children(),i=n.offset().left>e.offset().left;return e.remove(),i}function y(t,e){return parseFloat(t.css(e))||0}function S(t){return 1==t.which&&!t.ctrlKey}function w(t){if(void 0!==t.pageX)return t.pageX;var e=t.originalEvent.touches;return e?e[0].pageX:void 0}function E(t){if(void 0!==t.pageY)return t.pageY;var e=t.originalEvent.touches;return e?e[0].pageY:void 0}function b(t){return/^touch/.test(t.type)}function D(t){t.addClass("fc-unselectable").on("selectstart",T)}function T(t){t.preventDefault()}function C(t){return!!window.addEventListener&&(window.addEventListener("scroll",t,!0),!0)}function H(t){return!!window.removeEventListener&&(window.removeEventListener("scroll",t,!0),!0)}function R(t,e){var n={left:Math.max(t.left,e.left),right:Math.min(t.right,e.right),top:Math.max(t.top,e.top),bottom:Math.min(t.bottom,e.bottom)};return n.left<n.right&&n.top<n.bottom&&n}function x(t,e){return{left:Math.min(Math.max(t.left,e.left),e.right),top:Math.min(Math.max(t.top,e.top),e.bottom)}}function I(t){return{left:(t.left+t.right)/2,top:(t.top+t.bottom)/2}}function k(t,e){return{left:t.left-e.left,top:t.top-e.top}}function L(e){var n,i,r=[],s=[];for("string"==typeof e?s=e.split(/\s*,\s*/):"function"==typeof e?s=[e]:t.isArray(e)&&(s=e),n=0;n<s.length;n++)i=s[n],"string"==typeof i?r.push("-"==i.charAt(0)?{field:i.substring(1),order:-1}:{field:i,order:1}):"function"==typeof i&&r.push({func:i});return r}function M(t,e,n){var i,r;for(i=0;i<n.length;i++)if(r=B(t,e,n[i]))return r;return 0}function B(t,e,n){return n.func?n.func(t,e):z(t[n.field],e[n.field])*(n.order||1)}function z(e,n){return e||n?null==n?-1:null==e?1:"string"===t.type(e)||"string"===t.type(n)?String(e).localeCompare(String(n)):e-n:0}function F(t,e){var n,i,r,s,o=t.start,l=t.end,a=e.start,u=e.end;if(l>a&&o<u)return o>=a?(n=o.clone(),r=!0):(n=a.clone(),r=!1),l<=u?(i=l.clone(),s=!0):(i=u.clone(),s=!1),{start:n,end:i,isStart:r,isEnd:s}}function N(t,n){return e.duration({days:t.clone().stripTime().diff(n.clone().stripTime(),"days"),ms:t.time()-n.time()})}function G(t,n){return e.duration({days:t.clone().stripTime().diff(n.clone().stripTime(),"days")})}function O(t,n,i){return e.duration(Math.round(t.diff(n,i,!0)),i)}function A(t,e){var n,i,r;for(n=0;n<Kt.length&&(i=Kt[n],r=V(i,t,e),!(r>=1&&ot(r)));n++);return i}function V(t,n,i){return null!=i?i.diff(n,t,!0):e.isDuration(n)?n.as(t):n.end.diff(n.start,t,!0)}function P(t,e,n){var i;return W(n)?(e-t)/n:(i=n.asMonths(),Math.abs(i)>=1&&ot(i)?e.diff(t,"months",!0)/i:e.diff(t,"days",!0)/n.asDays())}function _(t,e){var n,i;return W(t)||W(e)?t/e:(n=t.asMonths(),i=e.asMonths(),Math.abs(n)>=1&&ot(n)&&Math.abs(i)>=1&&ot(i)?n/i:t.asDays()/e.asDays())}function Y(t,n){var i;return W(t)?e.duration(t*n):(i=t.asMonths(),Math.abs(i)>=1&&ot(i)?e.duration({months:i*n}):e.duration({days:t.asDays()*n}))}function W(t){return Boolean(t.hours()||t.minutes()||t.seconds()||t.milliseconds())}function U(t){return"[object Date]"===Object.prototype.toString.call(t)||t instanceof Date}function j(t){return/^\d+\:\d+(?:\:\d+\.?(?:\d{3})?)?$/.test(t)}function q(t,e){var n,i,r,s,o,l,a={};if(e)for(n=0;n<e.length;n++){for(i=e[n],r=[],s=t.length-1;s>=0;s--)if(o=t[s][i],"object"==typeof o)r.unshift(o);else if(void 0!==o){a[i]=o;break}r.length&&(a[i]=q(r))}for(n=t.length-1;n>=0;n--){l=t[n];for(i in l)i in a||(a[i]=l[i])}return a}function Z(t){var e=function(){};return e.prototype=t,new e}function $(t,e){for(var n in t)Q(t,n)&&(e[n]=t[n])}function Q(t,e){return Jt.call(t,e)}function X(e){return/undefined|null|boolean|number|string/.test(t.type(e))}function K(e,n,i){if(t.isFunction(e)&&(e=[e]),e){var r,s;for(r=0;r<e.length;r++)s=e[r].apply(n,i)||s;return s}}function J(){for(var t=0;t<arguments.length;t++)if(void 0!==arguments[t])return arguments[t]}function tt(t){return(t+"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/'/g,"&#039;").replace(/"/g,"&quot;").replace(/\n/g,"<br />")}function et(t){return t.replace(/&.*?;/g,"")}function nt(e){var n=[];return t.each(e,function(t,e){null!=e&&n.push(t+":"+e)}),n.join(";")}function it(e){var n=[];return t.each(e,function(t,e){null!=e&&n.push(t+'="'+tt(e)+'"')}),n.join(" ")}function rt(t){return t.charAt(0).toUpperCase()+t.slice(1)}function st(t,e){return t-e}function ot(t){return t%1===0}function lt(t,e){var n=t[e];return function(){return n.apply(t,arguments)}}function at(t,e,n){var i,r,s,o,l,a=function(){var u=+new Date-o;u<e?i=setTimeout(a,e-u):(i=null,n||(l=t.apply(s,r),s=r=null))};return function(){s=this,r=arguments,o=+new Date;var u=n&&!i;return i||(i=setTimeout(a,e)),u&&(l=t.apply(s,r),s=r=null),l}}function ut(n,i,r){var s,o,l,a,u=n[0],c=1==n.length&&"string"==typeof u;return e.isMoment(u)||U(u)||void 0===u?a=e.apply(null,n):(s=!1,o=!1,c?te.test(u)?(u+="-01",n=[u],s=!0,o=!0):(l=ee.exec(u))&&(s=!l[5],o=!0):t.isArray(u)&&(o=!0),a=i||s?e.utc.apply(e,n):e.apply(null,n),s?(a._ambigTime=!0,a._ambigZone=!0):r&&(o?a._ambigZone=!0:c&&a.utcOffset(u))),a._fullCalendar=!0,a}function ct(t,e){return ie.format.call(t,e)}function dt(t,e){return ht(t,mt(e))}function ht(t,e){var n,i="";for(n=0;n<e.length;n++)i+=ft(t,e[n]);return i}function ft(t,e){var n,i;return"string"==typeof e?e:(n=e.token)?se[n]?se[n](t):ct(t,n):e.maybe&&(i=ht(t,e.maybe),i.match(/[1-9]/))?i:""}function gt(t,e,n,i,r){var s;return t=qt.moment.parseZone(t),e=qt.moment.parseZone(e),s=t.localeData(),n=s.longDateFormat(n)||n,i=i||" - ",pt(t,e,mt(n),i,r)}function pt(t,e,n,i,r){var s,o,l,a,u=t.clone().stripZone(),c=e.clone().stripZone(),d="",h="",f="",g="",p="";for(o=0;o<n.length&&(s=vt(t,e,u,c,n[o]),s!==!1);o++)d+=s;for(l=n.length-1;l>o&&(s=vt(t,e,u,c,n[l]),s!==!1);l--)h=s+h;for(a=o;a<=l;a++)f+=ft(t,n[a]),g+=ft(e,n[a]);return(f||g)&&(p=r?g+i+f:f+i+g),d+p+h}function vt(t,e,n,i,r){var s,o;return"string"==typeof r?r:!!((s=r.token)&&(o=oe[s.charAt(0)],o&&n.isSame(i,o)))&&ct(t,s)}function mt(t){return t in le?le[t]:le[t]=yt(t)}function yt(t){for(var e,n=[],i=/\[([^\]]*)\]|\(([^\)]*)\)|(LTS|LT|(\w)\4*o?)|([^\w\[\(]+)/g;e=i.exec(t);)e[1]?n.push(e[1]):e[2]?n.push({maybe:yt(e[2])}):e[3]?n.push({token:e[3]}):e[5]&&n.push(e[5]);return n}function St(){}function wt(t,e){var n;return Q(e,"constructor")&&(n=e.constructor),"function"!=typeof n&&(n=e.constructor=function(){t.apply(this,arguments)}),n.prototype=Z(t.prototype),$(e,n.prototype),$(t,n),n}function Et(t,e){$(e,t.prototype)}function bt(e){var n=t.Deferred(),i=n.promise();if("function"==typeof e&&e(function(t){bt.immediate&&(i._value=t),n.resolve(t)},function(){n.reject()}),bt.immediate){var r=i.then;i.then=function(t,e){var n=i.state();if("resolved"===n){if("function"==typeof t)return bt.resolve(t(i._value))}else if("rejected"===n&&"function"==typeof e)return e(),i;return r.call(i,t,e)}}return i}function Dt(t){function e(t){return new bt(function(e){var i=function(){bt.resolve(t()).then(e).then(function(){n.shift(),n.length&&n[0]()})};n.push(i),1===n.length&&i()})}var n=[];this.add="number"==typeof t?at(e,t):e,this.addQuickly=e}function Tt(t,e){return!t&&!e||!(!t||!e)&&(t.component===e.component&&Ct(t,e)&&Ct(e,t))}function Ct(t,e){for(var n in t)if(!/^(component|left|right|top|bottom)$/.test(n)&&t[n]!==e[n])return!1;return!0}function Ht(t){return{start:t.start.clone(),end:t.end?t.end.clone():null,allDay:t.allDay}}function Rt(t){var e=It(t);return"background"===e||"inverse-background"===e}function xt(t){return"inverse-background"===It(t)}function It(t){return J((t.source||{}).rendering,t.rendering)}function kt(t){var e,n,i={};for(e=0;e<t.length;e++)n=t[e],(i[n._id]||(i[n._id]=[])).push(n);return i}function Lt(t,e){return t.start-e.start}function Mt(n){var i,r,s,o,l=qt.dataAttrPrefix;return l&&(l+="-"),i=n.data(l+"event")||null,i&&(i="object"==typeof i?t.extend({},i):{},r=i.start,null==r&&(r=i.time),s=i.duration,o=i.stick,delete i.start,delete i.time,delete i.duration,delete i.stick),null==r&&(r=n.data(l+"start")),null==r&&(r=n.data(l+"time")),null==s&&(s=n.data(l+"duration")),null==o&&(o=n.data(l+"stick")),r=null!=r?e.duration(r):null,s=null!=s?e.duration(s):null,o=Boolean(o),{eventProps:i,startTime:r,duration:s,stick:o}}function Bt(t,e){var n,i;for(n=0;n<e.length;n++)if(i=e[n],i.leftCol<=t.rightCol&&i.rightCol>=t.leftCol)return!0;return!1}function zt(t,e){return t.leftCol-e.leftCol}function Ft(t){var e,n,i,r=[];for(e=0;e<t.length;e++){for(n=t[e],i=0;i<r.length&&Ot(n,r[i]).length;i++);n.level=i,(r[i]||(r[i]=[])).push(n)}return r}function Nt(t){var e,n,i,r,s;for(e=0;e<t.length;e++)for(n=t[e],i=0;i<n.length;i++)for(r=n[i],r.forwardSegs=[],s=e+1;s<t.length;s++)Ot(r,t[s],r.forwardSegs)}function Gt(t){var e,n,i=t.forwardSegs,r=0;if(void 0===t.forwardPressure){for(e=0;e<i.length;e++)n=i[e],Gt(n),r=Math.max(r,1+n.forwardPressure);t.forwardPressure=r}}function Ot(t,e,n){n=n||[];for(var i=0;i<e.length;i++)At(t,e[i])&&n.push(e[i]);return n}function At(t,e){return t.bottom>e.top&&t.top<e.bottom}function Vt(t){this.items=t||[]}function Pt(e,n){function i(t){n=t}function r(){var i=n.layout;p=e.options.theme?"ui":"fc",i?(g?g.empty():g=this.el=t("<div class='fc-toolbar "+n.extraClasses+"'/>"),g.append(o("left")).append(o("right")).append(o("center")).append('<div class="fc-clear"/>')):s()}function s(){g&&(g.remove(),g=f.el=null)}function o(i){var r=t('<div class="fc-'+i+'"/>'),s=n.layout[i];return s&&t.each(s.split(" "),function(n){var i,s=t(),o=!0;t.each(this.split(","),function(n,i){var r,l,a,u,c,d,h,f,g,m;"title"==i?(s=s.add(t("<h2>&nbsp;</h2>")),o=!1):((r=(e.options.customButtons||{})[i])?(a=function(t){r.click&&r.click.call(m[0],t)},u="",c=r.text):(l=e.getViewSpec(i))?(a=function(){e.changeView(i)},v.push(i),u=l.buttonTextOverride,c=l.buttonTextDefault):e[i]&&(a=function(){e[i]()},u=(e.overrides.buttonText||{})[i],c=e.options.buttonText[i]),a&&(d=r?r.themeIcon:e.options.themeButtonIcons[i],h=r?r.icon:e.options.buttonIcons[i],f=u?tt(u):d&&e.options.theme?"<span class='ui-icon ui-icon-"+d+"'></span>":h&&!e.options.theme?"<span class='fc-icon fc-icon-"+h+"'></span>":tt(c),g=["fc-"+i+"-button",p+"-button",p+"-state-default"],m=t('<button type="button" class="'+g.join(" ")+'">'+f+"</button>").click(function(t){m.hasClass(p+"-state-disabled")||(a(t),(m.hasClass(p+"-state-active")||m.hasClass(p+"-state-disabled"))&&m.removeClass(p+"-state-hover"))}).mousedown(function(){m.not("."+p+"-state-active").not("."+p+"-state-disabled").addClass(p+"-state-down")}).mouseup(function(){m.removeClass(p+"-state-down")}).hover(function(){m.not("."+p+"-state-active").not("."+p+"-state-disabled").addClass(p+"-state-hover")},function(){m.removeClass(p+"-state-hover").removeClass(p+"-state-down")}),s=s.add(m)))}),o&&s.first().addClass(p+"-corner-left").end().last().addClass(p+"-corner-right").end(),s.length>1?(i=t("<div/>"),o&&i.addClass("fc-button-group"),i.append(s),r.append(i)):r.append(s)}),r}function l(t){g&&g.find("h2").text(t)}function a(t){g&&g.find(".fc-"+t+"-button").addClass(p+"-state-active")}function u(t){g&&g.find(".fc-"+t+"-button").removeClass(p+"-state-active")}function c(t){g&&g.find(".fc-"+t+"-button").prop("disabled",!0).addClass(p+"-state-disabled")}function d(t){g&&g.find(".fc-"+t+"-button").prop("disabled",!1).removeClass(p+"-state-disabled")}function h(){return v}var f=this;f.setToolbarOptions=i,f.render=r,f.removeElement=s,f.updateTitle=l,f.activateButton=a,f.deactivateButton=u,f.disableButton=c,f.enableButton=d,f.getViewsWithButtons=h,f.el=null;var g,p,v=[]}function _t(n,i){function r(t){t._locale=Y}function s(){q?a()&&(f(),u()):o()}function o(){n.addClass("fc"),n.on("click.fc","a[data-goto]",function(e){var n=t(this),i=n.data("goto"),r=_.moment(i.date),s=i.type,o=Q.opt("navLink"+rt(s)+"Click");"function"==typeof o?o(r,e):("string"==typeof o&&(s=o),B(r,s))}),_.bindOption("theme",function(t){$=t?"ui":"fc",n.toggleClass("ui-widget",t),n.toggleClass("fc-unthemed",!t)}),_.bindOptions(["isRTL","locale"],function(t){n.toggleClass("fc-ltr",!t),n.toggleClass("fc-rtl",t)}),q=t("<div class='fc-view-container'/>").prependTo(n);var e=y();W=new Vt(e),U=_.header=e[0],j=_.footer=e[1],E(),b(),u(_.options.defaultView),_.options.handleWindowResize&&(K=at(v,_.options.windowResizeDelay),t(window).resize(K))}function l(){Q&&Q.removeElement(),W.proxyCall("removeElement"),q.remove(),n.removeClass("fc fc-ltr fc-rtl fc-unthemed ui-widget"),n.off(".fc"),K&&t(window).unbind("resize",K)}function a(){return n.is(":visible")}function u(e,n){nt++;var i=Q&&e&&Q.type!==e;i&&(F(),c()),!Q&&e&&(Q=_.view=et[e]||(et[e]=_.instantiateView(e)),Q.setElement(t("<div class='fc-view fc-"+e+"-view' />").appendTo(q)),W.proxyCall("activateButton",e)),Q&&(J=Q.massageCurrentDate(J),Q.isDateSet&&J>=Q.intervalStart&&J<Q.intervalEnd||a()&&(n&&Q.captureInitialScroll(n),Q.setDate(J,n),n&&Q.releaseScroll(),D())),i&&N(),nt--}function c(){W.proxyCall("deactivateButton",Q.type),Q.removeElement(),Q=_.view=null}function d(){nt++,F();var t=Q.type,e=Q.queryScroll();c(),f(),u(t,e),N(),nt--}function h(t){if(a())return t&&g(),nt++,Q.updateSize(!0),nt--,!0}function f(){a()&&g()}function g(){var t=_.options.contentHeight,e=_.options.height;X="number"==typeof t?t:"function"==typeof t?t():"number"==typeof e?e-p():"function"==typeof e?e()-p():"parent"===e?n.parent().height()-p():Math.round(q.width()/Math.max(_.options.aspectRatio,.5))}function p(){return W.items.reduce(function(t,e){var n=e.el?e.el.outerHeight(!0):0;return t+n},0)}function v(t){!nt&&t.target===window&&Q.start&&h(!0)&&Q.publiclyTrigger("windowResize",tt)}function m(){a()&&_.reportEventChange()}function y(){return[new Pt(_,S()),new Pt(_,w())]}function S(){return{extraClasses:"fc-header-toolbar",layout:_.options.header}}function w(){return{extraClasses:"fc-footer-toolbar",layout:_.options.footer}}function E(){U.setToolbarOptions(S()),U.render(),U.el&&n.prepend(U.el)}function b(){j.setToolbarOptions(w()),j.render(),j.el&&n.append(j.el)}function D(){var t=_.getNow();t>=Q.intervalStart&&t<Q.intervalEnd?W.proxyCall("disableButton","today"):W.proxyCall("enableButton","today")}function T(t,e){Q.select(_.buildSelectSpan.apply(_,arguments))}function C(){Q&&Q.unselect()}function H(){J=Q.computePrevDate(J),u()}function R(){J=Q.computeNextDate(J),u()}function x(){J.add(-1,"years"),u()}function I(){J.add(1,"years"),u()}function k(){J=_.getNow(),u()}function L(t){J=_.moment(t).stripZone(),u()}function M(t){J.add(e.duration(t)),u()}function B(t,e){var n;e=e||"day",n=_.getViewSpec(e)||_.getUnitViewSpec(e),J=t.clone(),u(n?n.type:null)}function z(){return _.applyTimezone(J)}function F(){it++||q.css({width:"100%",height:q.height(),overflow:"hidden"})}function N(){--it||q.css({width:"",height:"",overflow:""})}function G(){return _}function O(){return Q}function A(t,e){var n;if("string"==typeof t){if(void 0===e)return _.options[t];n={},n[t]=e,V(n)}else"object"==typeof t&&V(t)}function V(t){var e,n=0;for(e in t)_.dynamicOverrides[e]=t[e];_.viewSpecCache={},_.populateOptionsHash();for(e in t)_.triggerOptionHandlers(e),n++;if(1===n){if("height"===e||"contentHeight"===e||"aspectRatio"===e)return void h(!0);if("defaultDate"===e)return;if("businessHours"===e)return void(Q&&(Q.unrenderBusinessHours(),Q.renderBusinessHours()));if("timezone"===e)return _.rezoneArrayEventSources(),void _.refetchEvents()}E(),b(),et={},d()}function P(t,e){var n=Array.prototype.slice.call(arguments,2);if(e=e||tt,this.triggerWith(t,e,n),_.options[t])return _.options[t].apply(e,n)}var _=this;_.render=s,_.destroy=l,_.rerenderEvents=m,_.changeView=u,_.select=T,_.unselect=C,_.prev=H,_.next=R,_.prevYear=x,_.nextYear=I,_.today=k,_.gotoDate=L,_.incrementDate=M,_.zoomTo=B,_.getDate=z,_.getCalendar=G,_.getView=O,_.option=A,_.publiclyTrigger=P,_.dynamicOverrides={},_.viewSpecCache={},_.optionHandlers={},_.overrides=t.extend({},i),_.populateOptionsHash();var Y;_.bindOptions(["locale","monthNames","monthNamesShort","dayNames","dayNamesShort","firstDay","weekNumberCalculation"],function(t,e,n,i,s,o,l){if("iso"===l&&(l="ISO"),Y=Z(Wt(t)),e&&(Y._months=e),n&&(Y._monthsShort=n),i&&(Y._weekdays=i),s&&(Y._weekdaysShort=s),null==o&&"ISO"===l&&(o=1),null!=o){var a=Z(Y._week);a.dow=o,Y._week=a}"ISO"!==l&&"local"!==l&&"function"!=typeof l||(Y._fullCalendar_weekCalc=l),J&&r(J)}),_.defaultAllDayEventDuration=e.duration(_.options.defaultAllDayEventDuration),_.defaultTimedEventDuration=e.duration(_.options.defaultTimedEventDuration),_.moment=function(){var t;return"local"===_.options.timezone?(t=qt.moment.apply(null,arguments),t.hasTime()&&t.local()):t="UTC"===_.options.timezone?qt.moment.utc.apply(null,arguments):qt.moment.parseZone.apply(null,arguments),r(t),t},_.localizeMoment=r,_.getIsAmbigTimezone=function(){return"local"!==_.options.timezone&&"UTC"!==_.options.timezone},_.applyTimezone=function(t){if(!t.hasTime())return t.clone();var e,n=_.moment(t.toArray()),i=t.time()-n.time();return i&&(e=n.clone().add(i),t.time()-e.time()===0&&(n=e)),n},_.getNow=function(){var t=_.options.now;return"function"==typeof t&&(t=t()),_.moment(t).stripZone()},_.getEventEnd=function(t){return t.end?t.end.clone():_.getDefaultEventEnd(t.allDay,t.start)},_.getDefaultEventEnd=function(t,e){var n=e.clone();return t?n.stripTime().add(_.defaultAllDayEventDuration):n.add(_.defaultTimedEventDuration),_.getIsAmbigTimezone()&&n.stripZone(),n},_.humanizeDuration=function(t){return t.locale(_.options.locale).humanize()},Ut.call(_);var W,U,j,q,$,Q,X,K,J,tt=n[0],et={},nt=0;J=null!=_.options.defaultDate?_.moment(_.options.defaultDate).stripZone():_.getNow(),_.getSuggestedViewHeight=function(){return void 0===X&&f(),X},_.isHeightAuto=function(){return"auto"===_.options.contentHeight||"auto"===_.options.height},_.setToolbarsTitle=function(t){W.proxyCall("updateTitle",t)},_.freezeContentHeight=F,_.thawContentHeight=N;var it=0;_.initialize()}function Yt(e){t.each(Re,function(t,n){null==e[t]&&(e[t]=n(e))})}function Wt(t){return e.localeData(t)||e.localeData("en")}function Ut(){function n(t,e){return!U.options.lazyFetching||s(t,e)?o(t,e):bt.resolve($)}function i(){$=r(nt),U.trigger("eventsReset",$)}function r(t){var e,n,i=[];for(e=0;e<t.length;e++)n=t[e],n.start.clone().stripZone()<Z&&U.getEventEnd(n).stripZone()>q&&i.push(n);return i}function s(t,e){return!q||t<q||e>Z}function o(t,e){return q=t,Z=e,l()}function l(){return u(tt,"reset")}function a(t){return u(E(t))}function u(t,e){var n,i;for("reset"===e?nt=[]:"add"!==e&&(nt=C(nt,t)),n=0;n<t.length;n++)i=t[n],"pending"!==i._status&&et++,i._fetchId=(i._fetchId||0)+1,i._status="pending";for(n=0;n<t.length;n++)i=t[n],c(i,i._fetchId);return et?new bt(function(t){U.one("eventsReceived",t)}):bt.resolve($)}function c(e,n){f(e,function(i){var r,s,o,l=t.isArray(e.events);if(n===e._fetchId&&"rejected"!==e._status){if(e._status="resolved",i)for(r=0;r<i.length;r++)s=i[r],o=l?s:F(s,e),o&&nt.push.apply(nt,_(o));h()}})}function d(t){var e="pending"===t._status;t._status="rejected",e&&h()}function h(){et--,et||(i(nt),U.trigger("eventsReceived",$))}function f(e,n){var i,r,s=qt.sourceFetchers;for(i=0;i<s.length;i++){if(r=s[i].call(U,e,q.clone(),Z.clone(),U.options.timezone,n),r===!0)return;if("object"==typeof r)return void f(r,n)}var o=e.events;if(o)t.isFunction(o)?(U.pushLoading(),o.call(U,q.clone(),Z.clone(),U.options.timezone,function(t){n(t),U.popLoading()})):t.isArray(o)?n(o):n();else{var l=e.url;if(l){var a,u=e.success,c=e.error,d=e.complete;a=t.isFunction(e.data)?e.data():e.data;var h=t.extend({},a||{}),g=J(e.startParam,U.options.startParam),p=J(e.endParam,U.options.endParam),v=J(e.timezoneParam,U.options.timezoneParam);g&&(h[g]=q.format()),p&&(h[p]=Z.format()),U.options.timezone&&"local"!=U.options.timezone&&(h[v]=U.options.timezone),U.pushLoading(),t.ajax(t.extend({},xe,e,{data:h,success:function(e){e=e||[];var i=K(u,this,arguments);t.isArray(i)&&(e=i),n(e)},error:function(){K(c,this,arguments),n()},complete:function(){K(d,this,arguments),U.popLoading()}}))}else n()}}function g(t){var e=p(t);e&&(tt.push(e),u([e],"add"))}function p(e){var n,i,r=qt.sourceNormalizers;if(t.isFunction(e)||t.isArray(e)?n={events:e}:"string"==typeof e?n={url:e}:"object"==typeof e&&(n=t.extend({},e)),n){for(n.className?"string"==typeof n.className&&(n.className=n.className.split(/\s+/)):n.className=[],t.isArray(n.events)&&(n.origArray=n.events,n.events=t.map(n.events,function(t){return F(t,n)})),i=0;i<r.length;i++)r[i].call(U,n);return n}}function v(t){y(b(t))}function m(t){null==t?y(tt,!0):y(E(t))}function y(e,n){var r;for(r=0;r<e.length;r++)d(e[r]);n?(tt=[],nt=[]):(tt=t.grep(tt,function(t){for(r=0;r<e.length;r++)if(t===e[r])return!1;return!0}),nt=C(nt,e)),i()}function S(){return tt.slice(1)}function w(e){return t.grep(tt,function(t){return t.id&&t.id===e})[0]}function E(e){e?t.isArray(e)||(e=[e]):e=[];var n,i=[];for(n=0;n<e.length;n++)i.push.apply(i,b(e[n]));return i}function b(e){var n,i;for(n=0;n<tt.length;n++)if(i=tt[n],i===e)return[i];return i=w(e),i?[i]:t.grep(tt,function(t){return D(e,t)})}function D(t,e){return t&&e&&T(t)==T(e)}function T(t){return("object"==typeof t?t.origArray||t.googleCalendarId||t.url||t.events:null)||t}function C(e,n){return t.grep(e,function(t){for(var e=0;e<n.length;e++)if(t.source===n[e])return!1;return!0})}function H(t){R([t])}function R(t){var e,n;for(e=0;e<t.length;e++)n=t[e],n.start=U.moment(n.start),n.end?n.end=U.moment(n.end):n.end=null,Y(n,x(n));i()}function x(e){var n={};return t.each(e,function(t,e){I(t)&&void 0!==e&&X(e)&&(n[t]=e)}),n}function I(t){return!/^_|^(id|allDay|start|end)$/.test(t)}function k(t,e){return L([t],e)}function L(t,e){var n,r,s,o,l,a=[];for(s=0;s<t.length;s++)if(r=F(t[s])){for(n=_(r),o=0;o<n.length;o++)l=n[o],l.source||(e&&(Q.events.push(l),l.source=Q),nt.push(l));a=a.concat(n)}return a.length&&i(),a}function M(e){var n,r;for(null==e?e=function(){return!0}:t.isFunction(e)||(n=e+"",e=function(t){return t._id==n}),nt=t.grep(nt,e,!0),r=0;r<tt.length;r++)t.isArray(tt[r].events)&&(tt[r].events=t.grep(tt[r].events,e,!0));i()}function B(e){return t.isFunction(e)?t.grep(nt,e):null!=e?(e+="",t.grep(nt,function(t){return t._id==e})):nt}function z(t){t.start=U.moment(t.start),t.end&&(t.end=U.moment(t.end)),jt(t)}function F(n,i){var r,s,o,l={};if(U.options.eventDataTransform&&(n=U.options.eventDataTransform(n)),i&&i.eventDataTransform&&(n=i.eventDataTransform(n)),t.extend(l,n),i&&(l.source=i),l._id=n._id||(void 0===n.id?"_fc"+Ie++:n.id+""),n.className?"string"==typeof n.className?l.className=n.className.split(/\s+/):l.className=n.className:l.className=[],r=n.start||n.date,s=n.end,j(r)&&(r=e.duration(r)),j(s)&&(s=e.duration(s)),n.dow||e.isDuration(r)||e.isDuration(s))l.start=r?e.duration(r):null,l.end=s?e.duration(s):null,l._recurring=!0;else{if(r&&(r=U.moment(r),!r.isValid()))return!1;s&&(s=U.moment(s),s.isValid()||(s=null)),o=n.allDay,void 0===o&&(o=J(i?i.allDayDefault:void 0,U.options.allDayDefault)),A(r,s,o,l)}return U.normalizeEvent(l),l}function A(t,e,n,i){i.start=t,i.end=e,i.allDay=n,V(i),jt(i)}function V(t){P(t),t.end&&!t.end.isAfter(t.start)&&(t.end=null),t.end||(U.options.forceEventDuration?t.end=U.getDefaultEventEnd(t.allDay,t.start):t.end=null)}function P(t){null==t.allDay&&(t.allDay=!(t.start.hasTime()||t.end&&t.end.hasTime())),t.allDay?(t.start.stripTime(),t.end&&t.end.stripTime()):(t.start.hasTime()||(t.start=U.applyTimezone(t.start.time(0))),t.end&&!t.end.hasTime()&&(t.end=U.applyTimezone(t.end.time(0))))}function _(e,n,i){var r,s,o,l,a,u,c,d,h,f=[];if(n=n||q,i=i||Z,e)if(e._recurring){if(s=e.dow)for(r={},o=0;o<s.length;o++)r[s[o]]=!0;for(l=n.clone().stripTime();l.isBefore(i);)r&&!r[l.day()]||(a=e.start,u=e.end,c=l.clone(),d=null,a&&(c=c.time(a)),u&&(d=l.clone().time(u)),h=t.extend({},e),A(c,d,!a&&!u,h),f.push(h)),l.add(1,"days")}else f.push(e);return f}function Y(e,n,i){function r(t,e){return i?O(t,e,i):n.allDay?G(t,e):N(t,e)}var s,o,l,a,u,c,d={};return n=n||{},n.start||(n.start=e.start.clone()),void 0===n.end&&(n.end=e.end?e.end.clone():null),null==n.allDay&&(n.allDay=e.allDay),V(n),s={start:e._start.clone(),end:e._end?e._end.clone():U.getDefaultEventEnd(e._allDay,e._start),allDay:n.allDay},V(s),o=null!==e._end&&null===n.end,l=r(n.start,s.start),n.end?(a=r(n.end,s.end),u=a.subtract(l)):u=null,t.each(n,function(t,e){I(t)&&void 0!==e&&(d[t]=e)}),c=W(B(e._id),o,n.allDay,l,u,d),{dateDelta:l,durationDelta:u,undo:c}}function W(e,n,i,r,s,o){var l=U.getIsAmbigTimezone(),a=[];return r&&!r.valueOf()&&(r=null),s&&!s.valueOf()&&(s=null),t.each(e,function(e,u){var c,d;c={start:u.start.clone(),end:u.end?u.end.clone():null,allDay:u.allDay},t.each(o,function(t){c[t]=u[t]}),d={start:u._start,end:u._end,allDay:i},V(d),n?d.end=null:s&&!d.end&&(d.end=U.getDefaultEventEnd(d.allDay,d.start)),r&&(d.start.add(r),d.end&&d.end.add(r)),s&&d.end.add(s),l&&!d.allDay&&(r||s)&&(d.start.stripZone(),d.end&&d.end.stripZone()),t.extend(u,o,d),jt(u),a.push(function(){t.extend(u,c),jt(u)})}),function(){for(var t=0;t<a.length;t++)a[t]()}}var U=this;U.requestEvents=n,U.reportEventChange=i,U.isFetchNeeded=s,U.fetchEvents=o,U.fetchEventSources=u,U.refetchEvents=l,U.refetchEventSources=a,U.getEventSources=S,U.getEventSourceById=w,U.addEventSource=g,U.removeEventSource=v,U.removeEventSources=m,U.updateEvent=H,U.updateEvents=R,U.renderEvent=k,U.renderEvents=L,U.removeEvents=M,U.clientEvents=B,U.mutateEvent=Y,U.normalizeEventDates=V,U.normalizeEventTimes=P;var q,Z,$,Q={events:[]},tt=[Q],et=0,nt=[];t.each((U.options.events?[U.options.events]:[]).concat(U.options.eventSources||[]),function(t,e){var n=p(e);n&&tt.push(n)}),U.getEventCache=function(){return nt},U.getPrunedEventCache=function(){return $},U.rezoneArrayEventSources=function(){var e,n,i;for(e=0;e<tt.length;e++)if(n=tt[e].events,t.isArray(n))for(i=0;i<n.length;i++)z(n[i])},U.buildEventFromInput=F,U.expandEvent=_}function jt(t){t._allDay=t.allDay,t._start=t.start.clone(),t._end=t.end?t.end.clone():null}var qt=t.fullCalendar={version:"3.1.0",internalApiVersion:7},Zt=qt.views={};t.fn.fullCalendar=function(e){var n=Array.prototype.slice.call(arguments,1),i=this;return this.each(function(r,s){var o,l=t(s),a=l.data("fullCalendar");"string"==typeof e?a&&t.isFunction(a[e])&&(o=a[e].apply(a,n),r||(i=o),"destroy"===e&&l.removeData("fullCalendar")):a||(a=new De(l,e),l.data("fullCalendar",a),a.render())}),i};var $t=["header","footer","buttonText","buttonIcons","themeButtonIcons"];qt.intersectRanges=F,qt.applyAll=K,qt.debounce=at,qt.isInt=ot,qt.htmlEscape=tt,qt.cssToStr=nt,qt.proxy=lt,qt.capitaliseFirstLetter=rt,qt.getOuterRect=h,qt.getClientRect=f,qt.getContentRect=g,qt.getScrollbarWidths=p;var Qt=null;qt.preventDefault=T,qt.intersectRects=R,qt.parseFieldSpecs=L,qt.compareByFieldSpecs=M,qt.compareByFieldSpec=B,qt.flexibleCompare=z,qt.computeIntervalUnit=A,qt.divideRangeByDuration=P,qt.divideDurationByDuration=_,qt.multiplyDuration=Y,qt.durationHasTime=W;var Xt=["sun","mon","tue","wed","thu","fri","sat"],Kt=["year","month","week","day","hour","minute","second","millisecond"];qt.log=function(){var t=window.console;if(t&&t.log)return t.log.apply(t,arguments)},qt.warn=function(){var t=window.console;return t&&t.warn?t.warn.apply(t,arguments):qt.log.apply(qt,arguments)};var Jt={}.hasOwnProperty;qt.createObject=Z;var te=/^\s*\d{4}-\d\d$/,ee=/^\s*\d{4}-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d+)?)?)?)?)?$/,ne=e.fn,ie=t.extend({},ne),re=e.momentProperties;re.push("_fullCalendar"),re.push("_ambigTime"),re.push("_ambigZone"),qt.moment=function(){return ut(arguments)},qt.moment.utc=function(){var t=ut(arguments,!0);return t.hasTime()&&t.utc(),t},qt.moment.parseZone=function(){return ut(arguments,!0,!0)},ne.week=ne.weeks=function(t){var e=this._locale._fullCalendar_weekCalc;return null==t&&"function"==typeof e?e(this):"ISO"===e?ie.isoWeek.apply(this,arguments):ie.week.apply(this,arguments)},ne.time=function(t){if(!this._fullCalendar)return ie.time.apply(this,arguments);if(null==t)return e.duration({hours:this.hours(),minutes:this.minutes(),seconds:this.seconds(),milliseconds:this.milliseconds()});this._ambigTime=!1,e.isDuration(t)||e.isMoment(t)||(t=e.duration(t));var n=0;return e.isDuration(t)&&(n=24*Math.floor(t.asDays())),this.hours(n+t.hours()).minutes(t.minutes()).seconds(t.seconds()).milliseconds(t.milliseconds())},ne.stripTime=function(){return this._ambigTime||(this.utc(!0),this.set({hours:0,minutes:0,seconds:0,ms:0}),this._ambigTime=!0,this._ambigZone=!0),this},ne.hasTime=function(){return!this._ambigTime},ne.stripZone=function(){var t;return this._ambigZone||(t=this._ambigTime,this.utc(!0),this._ambigTime=t||!1,this._ambigZone=!0),this},ne.hasZone=function(){return!this._ambigZone},ne.local=function(t){return ie.local.call(this,this._ambigZone||t),this._ambigTime=!1,this._ambigZone=!1,this},ne.utc=function(t){return ie.utc.call(this,t),this._ambigTime=!1,this._ambigZone=!1,this},ne.utcOffset=function(t){return null!=t&&(this._ambigTime=!1,this._ambigZone=!1),ie.utcOffset.apply(this,arguments)},ne.format=function(){return this._fullCalendar&&arguments[0]?dt(this,arguments[0]):this._ambigTime?ct(this,"YYYY-MM-DD"):this._ambigZone?ct(this,"YYYY-MM-DD[T]HH:mm:ss"):ie.format.apply(this,arguments)},ne.toISOString=function(){return this._ambigTime?ct(this,"YYYY-MM-DD"):this._ambigZone?ct(this,"YYYY-MM-DD[T]HH:mm:ss"):ie.toISOString.apply(this,arguments)};var se={t:function(t){return ct(t,"a").charAt(0)},T:function(t){return ct(t,"A").charAt(0)}};qt.formatRange=gt;var oe={Y:"year",M:"month",D:"day",d:"day",A:"second",a:"second",T:"second",t:"second",H:"second",h:"second",m:"second",s:"second"},le={},ae={Y:{value:1,unit:"year"},M:{value:2,unit:"month"},W:{value:3,unit:"week"},w:{value:3,unit:"week"},D:{value:4,unit:"day"},d:{value:4,unit:"day"}};qt.queryMostGranularFormatUnit=function(t){
-var e,n,i,r,s=mt(t);for(e=0;e<s.length;e++)n=s[e],n.token&&(i=ae[n.token.charAt(0)],i&&(!r||i.value>r.value)&&(r=i));return r?r.unit:null},qt.Class=St,St.extend=function(){var t,e,n=arguments.length;for(t=0;t<n;t++)e=arguments[t],t<n-1&&Et(this,e);return wt(this,e||{})},St.mixin=function(t){Et(this,t)},qt.Promise=bt,bt.immediate=!0,bt.resolve=function(e){if(e&&"function"==typeof e.resolve)return e.promise();if(e&&"function"==typeof e.then)return e;var n=t.Deferred().resolve(e),i=n.promise();if(bt.immediate){var r=i.then;i._value=e,i.then=function(t,n){return"function"==typeof t?bt.resolve(t(e)):r.call(i,t,n)}}return i},bt.reject=function(){return t.Deferred().reject().promise()},bt.all=function(e){var n,i,r,s=!1;if(bt.immediate)for(s=!0,n=[],i=0;i<e.length;i++)if(r=e[i],r&&"function"==typeof r.state&&"resolved"===r.state()&&"_value"in r)n.push(r._value);else{if(r&&"function"==typeof r.then){s=!1;break}n.push(r)}return s?bt.resolve(n):t.when.apply(t.when,e).then(function(){return t.when(t.makeArray(arguments))})},qt.TaskQueue=Dt;var ue=qt.EmitterMixin={on:function(e,n){return t(this).on(e,this._prepareIntercept(n)),this},one:function(e,n){return t(this).one(e,this._prepareIntercept(n)),this},_prepareIntercept:function(e){var n=function(t,n){return e.apply(n.context||this,n.args||[])};return e.guid||(e.guid=t.guid++),n.guid=e.guid,n},off:function(e,n){return t(this).off(e,n),this},trigger:function(e){var n=Array.prototype.slice.call(arguments,1);return t(this).triggerHandler(e,{args:n}),this},triggerWith:function(e,n,i){return t(this).triggerHandler(e,{context:n,args:i}),this}},ce=qt.ListenerMixin=function(){var e=0,n={listenerId:null,listenTo:function(e,n,i){if("object"==typeof n)for(var r in n)n.hasOwnProperty(r)&&this.listenTo(e,r,n[r]);else"string"==typeof n&&e.on(n+"."+this.getListenerNamespace(),t.proxy(i,this))},stopListeningTo:function(t,e){t.off((e||"")+"."+this.getListenerNamespace())},getListenerNamespace:function(){return null==this.listenerId&&(this.listenerId=e++),"_listener"+this.listenerId}};return n}(),de={isIgnoringMouse:!1,delayUnignoreMouse:null,initMouseIgnoring:function(t){this.delayUnignoreMouse=at(lt(this,"unignoreMouse"),t||1e3)},tempIgnoreMouse:function(){this.isIgnoringMouse=!0,this.delayUnignoreMouse()},unignoreMouse:function(){this.isIgnoringMouse=!1}},he=St.extend(ce,{isHidden:!0,options:null,el:null,margin:10,constructor:function(t){this.options=t||{}},show:function(){this.isHidden&&(this.el||this.render(),this.el.show(),this.position(),this.isHidden=!1,this.trigger("show"))},hide:function(){this.isHidden||(this.el.hide(),this.isHidden=!0,this.trigger("hide"))},render:function(){var e=this,n=this.options;this.el=t('<div class="fc-popover"/>').addClass(n.className||"").css({top:0,left:0}).append(n.content).appendTo(n.parentEl),this.el.on("click",".fc-close",function(){e.hide()}),n.autoHide&&this.listenTo(t(document),"mousedown",this.documentMousedown)},documentMousedown:function(e){this.el&&!t(e.target).closest(this.el).length&&this.hide()},removeElement:function(){this.hide(),this.el&&(this.el.remove(),this.el=null),this.stopListeningTo(t(document),"mousedown")},position:function(){var e,n,i,r,s,o=this.options,l=this.el.offsetParent().offset(),a=this.el.outerWidth(),u=this.el.outerHeight(),c=t(window),h=d(this.el);r=o.top||0,s=void 0!==o.left?o.left:void 0!==o.right?o.right-a:0,h.is(window)||h.is(document)?(h=c,e=0,n=0):(i=h.offset(),e=i.top,n=i.left),e+=c.scrollTop(),n+=c.scrollLeft(),o.viewportConstrain!==!1&&(r=Math.min(r,e+h.outerHeight()-u-this.margin),r=Math.max(r,e+this.margin),s=Math.min(s,n+h.outerWidth()-a-this.margin),s=Math.max(s,n+this.margin)),this.el.css({top:r-l.top,left:s-l.left})},trigger:function(t){this.options[t]&&this.options[t].apply(this,Array.prototype.slice.call(arguments,1))}}),fe=qt.CoordCache=St.extend({els:null,forcedOffsetParentEl:null,origin:null,boundingRect:null,isHorizontal:!1,isVertical:!1,lefts:null,rights:null,tops:null,bottoms:null,constructor:function(e){this.els=t(e.els),this.isHorizontal=e.isHorizontal,this.isVertical=e.isVertical,this.forcedOffsetParentEl=e.offsetParent?t(e.offsetParent):null},build:function(){var t=this.forcedOffsetParentEl;!t&&this.els.length>0&&(t=this.els.eq(0).offsetParent()),this.origin=t?t.offset():null,this.boundingRect=this.queryBoundingRect(),this.isHorizontal&&this.buildElHorizontals(),this.isVertical&&this.buildElVerticals()},clear:function(){this.origin=null,this.boundingRect=null,this.lefts=null,this.rights=null,this.tops=null,this.bottoms=null},ensureBuilt:function(){this.origin||this.build()},buildElHorizontals:function(){var e=[],n=[];this.els.each(function(i,r){var s=t(r),o=s.offset().left,l=s.outerWidth();e.push(o),n.push(o+l)}),this.lefts=e,this.rights=n},buildElVerticals:function(){var e=[],n=[];this.els.each(function(i,r){var s=t(r),o=s.offset().top,l=s.outerHeight();e.push(o),n.push(o+l)}),this.tops=e,this.bottoms=n},getHorizontalIndex:function(t){this.ensureBuilt();var e,n=this.lefts,i=this.rights,r=n.length;for(e=0;e<r;e++)if(t>=n[e]&&t<i[e])return e},getVerticalIndex:function(t){this.ensureBuilt();var e,n=this.tops,i=this.bottoms,r=n.length;for(e=0;e<r;e++)if(t>=n[e]&&t<i[e])return e},getLeftOffset:function(t){return this.ensureBuilt(),this.lefts[t]},getLeftPosition:function(t){return this.ensureBuilt(),this.lefts[t]-this.origin.left},getRightOffset:function(t){return this.ensureBuilt(),this.rights[t]},getRightPosition:function(t){return this.ensureBuilt(),this.rights[t]-this.origin.left},getWidth:function(t){return this.ensureBuilt(),this.rights[t]-this.lefts[t]},getTopOffset:function(t){return this.ensureBuilt(),this.tops[t]},getTopPosition:function(t){return this.ensureBuilt(),this.tops[t]-this.origin.top},getBottomOffset:function(t){return this.ensureBuilt(),this.bottoms[t]},getBottomPosition:function(t){return this.ensureBuilt(),this.bottoms[t]-this.origin.top},getHeight:function(t){return this.ensureBuilt(),this.bottoms[t]-this.tops[t]},queryBoundingRect:function(){var t;return this.els.length>0&&(t=d(this.els.eq(0)),!t.is(document))?f(t):null},isPointInBounds:function(t,e){return this.isLeftInBounds(t)&&this.isTopInBounds(e)},isLeftInBounds:function(t){return!this.boundingRect||t>=this.boundingRect.left&&t<this.boundingRect.right},isTopInBounds:function(t){return!this.boundingRect||t>=this.boundingRect.top&&t<this.boundingRect.bottom}}),ge=qt.DragListener=St.extend(ce,de,{options:null,subjectEl:null,originX:null,originY:null,scrollEl:null,isInteracting:!1,isDistanceSurpassed:!1,isDelayEnded:!1,isDragging:!1,isTouch:!1,delay:null,delayTimeoutId:null,minDistance:null,handleTouchScrollProxy:null,constructor:function(t){this.options=t||{},this.handleTouchScrollProxy=lt(this,"handleTouchScroll"),this.initMouseIgnoring(500)},startInteraction:function(e,n){var i=b(e);if("mousedown"===e.type){if(this.isIgnoringMouse)return;if(!S(e))return;e.preventDefault()}this.isInteracting||(n=n||{},this.delay=J(n.delay,this.options.delay,0),this.minDistance=J(n.distance,this.options.distance,0),this.subjectEl=this.options.subjectEl,this.isInteracting=!0,this.isTouch=i,this.isDelayEnded=!1,this.isDistanceSurpassed=!1,this.originX=w(e),this.originY=E(e),this.scrollEl=d(t(e.target)),this.bindHandlers(),this.initAutoScroll(),this.handleInteractionStart(e),this.startDelay(e),this.minDistance||this.handleDistanceSurpassed(e))},handleInteractionStart:function(t){this.trigger("interactionStart",t)},endInteraction:function(t,e){this.isInteracting&&(this.endDrag(t),this.delayTimeoutId&&(clearTimeout(this.delayTimeoutId),this.delayTimeoutId=null),this.destroyAutoScroll(),this.unbindHandlers(),this.isInteracting=!1,this.handleInteractionEnd(t,e),this.isTouch&&this.tempIgnoreMouse())},handleInteractionEnd:function(t,e){this.trigger("interactionEnd",t,e||!1)},bindHandlers:function(){var e=this,n=1;this.isTouch?(this.listenTo(t(document),{touchmove:this.handleTouchMove,touchend:this.endInteraction,touchcancel:this.endInteraction,touchstart:function(t){n?n--:e.endInteraction(t,!0)}}),!C(this.handleTouchScrollProxy)&&this.scrollEl&&this.listenTo(this.scrollEl,"scroll",this.handleTouchScroll)):this.listenTo(t(document),{mousemove:this.handleMouseMove,mouseup:this.endInteraction}),this.listenTo(t(document),{selectstart:T,contextmenu:T})},unbindHandlers:function(){this.stopListeningTo(t(document)),H(this.handleTouchScrollProxy),this.scrollEl&&this.stopListeningTo(this.scrollEl,"scroll")},startDrag:function(t,e){this.startInteraction(t,e),this.isDragging||(this.isDragging=!0,this.handleDragStart(t))},handleDragStart:function(t){this.trigger("dragStart",t)},handleMove:function(t){var e,n=w(t)-this.originX,i=E(t)-this.originY,r=this.minDistance;this.isDistanceSurpassed||(e=n*n+i*i,e>=r*r&&this.handleDistanceSurpassed(t)),this.isDragging&&this.handleDrag(n,i,t)},handleDrag:function(t,e,n){this.trigger("drag",t,e,n),this.updateAutoScroll(n)},endDrag:function(t){this.isDragging&&(this.isDragging=!1,this.handleDragEnd(t))},handleDragEnd:function(t){this.trigger("dragEnd",t)},startDelay:function(t){var e=this;this.delay?this.delayTimeoutId=setTimeout(function(){e.handleDelayEnd(t)},this.delay):this.handleDelayEnd(t)},handleDelayEnd:function(t){this.isDelayEnded=!0,this.isDistanceSurpassed&&this.startDrag(t)},handleDistanceSurpassed:function(t){this.isDistanceSurpassed=!0,this.isDelayEnded&&this.startDrag(t)},handleTouchMove:function(t){this.isDragging&&t.preventDefault(),this.handleMove(t)},handleMouseMove:function(t){this.handleMove(t)},handleTouchScroll:function(t){this.isDragging||this.endInteraction(t,!0)},trigger:function(t){this.options[t]&&this.options[t].apply(this,Array.prototype.slice.call(arguments,1)),this["_"+t]&&this["_"+t].apply(this,Array.prototype.slice.call(arguments,1))}});ge.mixin({isAutoScroll:!1,scrollBounds:null,scrollTopVel:null,scrollLeftVel:null,scrollIntervalId:null,scrollSensitivity:30,scrollSpeed:200,scrollIntervalMs:50,initAutoScroll:function(){var t=this.scrollEl;this.isAutoScroll=this.options.scroll&&t&&!t.is(window)&&!t.is(document),this.isAutoScroll&&this.listenTo(t,"scroll",at(this.handleDebouncedScroll,100))},destroyAutoScroll:function(){this.endAutoScroll(),this.isAutoScroll&&this.stopListeningTo(this.scrollEl,"scroll")},computeScrollBounds:function(){this.isAutoScroll&&(this.scrollBounds=h(this.scrollEl))},updateAutoScroll:function(t){var e,n,i,r,s=this.scrollSensitivity,o=this.scrollBounds,l=0,a=0;o&&(e=(s-(E(t)-o.top))/s,n=(s-(o.bottom-E(t)))/s,i=(s-(w(t)-o.left))/s,r=(s-(o.right-w(t)))/s,e>=0&&e<=1?l=e*this.scrollSpeed*-1:n>=0&&n<=1&&(l=n*this.scrollSpeed),i>=0&&i<=1?a=i*this.scrollSpeed*-1:r>=0&&r<=1&&(a=r*this.scrollSpeed)),this.setScrollVel(l,a)},setScrollVel:function(t,e){this.scrollTopVel=t,this.scrollLeftVel=e,this.constrainScrollVel(),!this.scrollTopVel&&!this.scrollLeftVel||this.scrollIntervalId||(this.scrollIntervalId=setInterval(lt(this,"scrollIntervalFunc"),this.scrollIntervalMs))},constrainScrollVel:function(){var t=this.scrollEl;this.scrollTopVel<0?t.scrollTop()<=0&&(this.scrollTopVel=0):this.scrollTopVel>0&&t.scrollTop()+t[0].clientHeight>=t[0].scrollHeight&&(this.scrollTopVel=0),this.scrollLeftVel<0?t.scrollLeft()<=0&&(this.scrollLeftVel=0):this.scrollLeftVel>0&&t.scrollLeft()+t[0].clientWidth>=t[0].scrollWidth&&(this.scrollLeftVel=0)},scrollIntervalFunc:function(){var t=this.scrollEl,e=this.scrollIntervalMs/1e3;this.scrollTopVel&&t.scrollTop(t.scrollTop()+this.scrollTopVel*e),this.scrollLeftVel&&t.scrollLeft(t.scrollLeft()+this.scrollLeftVel*e),this.constrainScrollVel(),this.scrollTopVel||this.scrollLeftVel||this.endAutoScroll()},endAutoScroll:function(){this.scrollIntervalId&&(clearInterval(this.scrollIntervalId),this.scrollIntervalId=null,this.handleScrollEnd())},handleDebouncedScroll:function(){this.scrollIntervalId||this.handleScrollEnd()},handleScrollEnd:function(){}});var pe=ge.extend({component:null,origHit:null,hit:null,coordAdjust:null,constructor:function(t,e){ge.call(this,e),this.component=t},handleInteractionStart:function(t){var e,n,i,r=this.subjectEl;this.computeCoords(),t?(n={left:w(t),top:E(t)},i=n,r&&(e=h(r),i=x(i,e)),this.origHit=this.queryHit(i.left,i.top),r&&this.options.subjectCenter&&(this.origHit&&(e=R(this.origHit,e)||e),i=I(e)),this.coordAdjust=k(i,n)):(this.origHit=null,this.coordAdjust=null),ge.prototype.handleInteractionStart.apply(this,arguments)},computeCoords:function(){this.component.prepareHits(),this.computeScrollBounds()},handleDragStart:function(t){var e;ge.prototype.handleDragStart.apply(this,arguments),e=this.queryHit(w(t),E(t)),e&&this.handleHitOver(e)},handleDrag:function(t,e,n){var i;ge.prototype.handleDrag.apply(this,arguments),i=this.queryHit(w(n),E(n)),Tt(i,this.hit)||(this.hit&&this.handleHitOut(),i&&this.handleHitOver(i))},handleDragEnd:function(){this.handleHitDone(),ge.prototype.handleDragEnd.apply(this,arguments)},handleHitOver:function(t){var e=Tt(t,this.origHit);this.hit=t,this.trigger("hitOver",this.hit,e,this.origHit)},handleHitOut:function(){this.hit&&(this.trigger("hitOut",this.hit),this.handleHitDone(),this.hit=null)},handleHitDone:function(){this.hit&&this.trigger("hitDone",this.hit)},handleInteractionEnd:function(){ge.prototype.handleInteractionEnd.apply(this,arguments),this.origHit=null,this.hit=null,this.component.releaseHits()},handleScrollEnd:function(){ge.prototype.handleScrollEnd.apply(this,arguments),this.computeCoords()},queryHit:function(t,e){return this.coordAdjust&&(t+=this.coordAdjust.left,e+=this.coordAdjust.top),this.component.queryHit(t,e)}}),ve=St.extend(ce,{options:null,sourceEl:null,el:null,parentEl:null,top0:null,left0:null,y0:null,x0:null,topDelta:null,leftDelta:null,isFollowing:!1,isHidden:!1,isAnimating:!1,constructor:function(e,n){this.options=n=n||{},this.sourceEl=e,this.parentEl=n.parentEl?t(n.parentEl):e.parent()},start:function(e){this.isFollowing||(this.isFollowing=!0,this.y0=E(e),this.x0=w(e),this.topDelta=0,this.leftDelta=0,this.isHidden||this.updatePosition(),b(e)?this.listenTo(t(document),"touchmove",this.handleMove):this.listenTo(t(document),"mousemove",this.handleMove))},stop:function(e,n){function i(){r.isAnimating=!1,r.removeElement(),r.top0=r.left0=null,n&&n()}var r=this,s=this.options.revertDuration;this.isFollowing&&!this.isAnimating&&(this.isFollowing=!1,this.stopListeningTo(t(document)),e&&s&&!this.isHidden?(this.isAnimating=!0,this.el.animate({top:this.top0,left:this.left0},{duration:s,complete:i})):i())},getEl:function(){var t=this.el;return t||(t=this.el=this.sourceEl.clone().addClass(this.options.additionalClass||"").css({position:"absolute",visibility:"",display:this.isHidden?"none":"",margin:0,right:"auto",bottom:"auto",width:this.sourceEl.width(),height:this.sourceEl.height(),opacity:this.options.opacity||"",zIndex:this.options.zIndex}),t.addClass("fc-unselectable"),t.appendTo(this.parentEl)),t},removeElement:function(){this.el&&(this.el.remove(),this.el=null)},updatePosition:function(){var t,e;this.getEl(),null===this.top0&&(t=this.sourceEl.offset(),e=this.el.offsetParent().offset(),this.top0=t.top-e.top,this.left0=t.left-e.left),this.el.css({top:this.top0+this.topDelta,left:this.left0+this.leftDelta})},handleMove:function(t){this.topDelta=E(t)-this.y0,this.leftDelta=w(t)-this.x0,this.isHidden||this.updatePosition()},hide:function(){this.isHidden||(this.isHidden=!0,this.el&&this.el.hide())},show:function(){this.isHidden&&(this.isHidden=!1,this.updatePosition(),this.getEl().show())}}),me=qt.Grid=St.extend(ce,de,{hasDayInteractions:!0,view:null,isRTL:null,start:null,end:null,el:null,elsByFill:null,eventTimeFormat:null,displayEventTime:null,displayEventEnd:null,minResizeDuration:null,largeUnit:null,dayDragListener:null,segDragListener:null,segResizeListener:null,externalDragListener:null,constructor:function(t){this.view=t,this.isRTL=t.opt("isRTL"),this.elsByFill={},this.dayDragListener=this.buildDayDragListener(),this.initMouseIgnoring()},computeEventTimeFormat:function(){return this.view.opt("smallTimeFormat")},computeDisplayEventTime:function(){return!0},computeDisplayEventEnd:function(){return!0},setRange:function(t){this.start=t.start.clone(),this.end=t.end.clone(),this.rangeUpdated(),this.processRangeOptions()},rangeUpdated:function(){},processRangeOptions:function(){var t,e,n=this.view;this.eventTimeFormat=n.opt("eventTimeFormat")||n.opt("timeFormat")||this.computeEventTimeFormat(),t=n.opt("displayEventTime"),null==t&&(t=this.computeDisplayEventTime()),e=n.opt("displayEventEnd"),null==e&&(e=this.computeDisplayEventEnd()),this.displayEventTime=t,this.displayEventEnd=e},spanToSegs:function(t){},diffDates:function(t,e){return this.largeUnit?O(t,e,this.largeUnit):N(t,e)},prepareHits:function(){},releaseHits:function(){},queryHit:function(t,e){},getHitSpan:function(t){},getHitEl:function(t){},setElement:function(t){this.el=t,this.hasDayInteractions&&(D(t),this.bindDayHandler("touchstart",this.dayTouchStart),this.bindDayHandler("mousedown",this.dayMousedown)),this.bindSegHandlers(),this.bindGlobalHandlers()},bindDayHandler:function(e,n){var i=this;this.el.on(e,function(e){if(!t(e.target).is(i.segSelector+","+i.segSelector+" *,.fc-more,a[data-goto]"))return n.call(i,e)})},removeElement:function(){this.unbindGlobalHandlers(),this.clearDragListeners(),this.el.remove()},renderSkeleton:function(){},renderDates:function(){},unrenderDates:function(){},bindGlobalHandlers:function(){this.listenTo(t(document),{dragstart:this.externalDragStart,sortstart:this.externalDragStart})},unbindGlobalHandlers:function(){this.stopListeningTo(t(document))},dayMousedown:function(t){this.isIgnoringMouse||this.dayDragListener.startInteraction(t,{})},dayTouchStart:function(t){var e=this.view,n=e.opt("selectLongPressDelay");(e.isSelected||e.selectedEvent)&&this.tempIgnoreMouse(),null==n&&(n=e.opt("longPressDelay")),this.dayDragListener.startInteraction(t,{delay:n})},buildDayDragListener:function(){var t,e,n=this,i=this.view,r=i.opt("selectable"),l=new pe(this,{scroll:i.opt("dragScroll"),interactionStart:function(){t=l.origHit,e=null},dragStart:function(){i.unselect()},hitOver:function(i,o,l){l&&(o||(t=null),r&&(e=n.computeSelection(n.getHitSpan(l),n.getHitSpan(i)),e?n.renderSelection(e):e===!1&&s()))},hitOut:function(){t=null,e=null,n.unrenderSelection()},hitDone:function(){o()},interactionEnd:function(r,s){s||(t&&!n.isIgnoringMouse&&i.triggerDayClick(n.getHitSpan(t),n.getHitEl(t),r),e&&i.reportSelection(e,r))}});return l},clearDragListeners:function(){this.dayDragListener.endInteraction(),this.segDragListener&&this.segDragListener.endInteraction(),this.segResizeListener&&this.segResizeListener.endInteraction(),this.externalDragListener&&this.externalDragListener.endInteraction()},renderEventLocationHelper:function(t,e){var n=this.fabricateHelperEvent(t,e);return this.renderHelper(n,e)},fabricateHelperEvent:function(t,e){var n=e?Z(e.event):{};return n.start=t.start.clone(),n.end=t.end?t.end.clone():null,n.allDay=null,this.view.calendar.normalizeEventDates(n),n.className=(n.className||[]).concat("fc-helper"),e||(n.editable=!1),n},renderHelper:function(t,e){},unrenderHelper:function(){},renderSelection:function(t){this.renderHighlight(t)},unrenderSelection:function(){this.unrenderHighlight()},computeSelection:function(t,e){var n=this.computeSelectionSpan(t,e);return!(n&&!this.view.calendar.isSelectionSpanAllowed(n))&&n},computeSelectionSpan:function(t,e){var n=[t.start,t.end,e.start,e.end];return n.sort(st),{start:n[0].clone(),end:n[3].clone()}},renderHighlight:function(t){this.renderFill("highlight",this.spanToSegs(t))},unrenderHighlight:function(){this.unrenderFill("highlight")},highlightSegClasses:function(){return["fc-highlight"]},renderBusinessHours:function(){},unrenderBusinessHours:function(){},getNowIndicatorUnit:function(){},renderNowIndicator:function(t){},unrenderNowIndicator:function(){},renderFill:function(t,e){},unrenderFill:function(t){var e=this.elsByFill[t];e&&(e.remove(),delete this.elsByFill[t])},renderFillSegEls:function(e,n){var i,r=this,s=this[e+"SegEl"],o="",l=[];if(n.length){for(i=0;i<n.length;i++)o+=this.fillSegHtml(e,n[i]);t(o).each(function(e,i){var o=n[e],a=t(i);s&&(a=s.call(r,o,a)),a&&(a=t(a),a.is(r.fillSegTag)&&(o.el=a,l.push(o)))})}return l},fillSegTag:"div",fillSegHtml:function(t,e){var n=this[t+"SegClasses"],i=this[t+"SegCss"],r=n?n.call(this,e):[],s=nt(i?i.call(this,e):{});return"<"+this.fillSegTag+(r.length?' class="'+r.join(" ")+'"':"")+(s?' style="'+s+'"':"")+" />"},getDayClasses:function(t,e){var n=this.view,i=n.calendar.getNow(),r=["fc-"+Xt[t.day()]];return 1==n.intervalDuration.as("months")&&t.month()!=n.intervalStart.month()&&r.push("fc-other-month"),t.isSame(i,"day")?(r.push("fc-today"),e!==!0&&r.push(n.highlightStateClass)):t<i?r.push("fc-past"):r.push("fc-future"),r}});me.mixin({segSelector:".fc-event-container > *",mousedOverSeg:null,isDraggingSeg:!1,isResizingSeg:!1,isDraggingExternal:!1,segs:null,renderEvents:function(t){var e,n=[],i=[];for(e=0;e<t.length;e++)(Rt(t[e])?n:i).push(t[e]);this.segs=[].concat(this.renderBgEvents(n),this.renderFgEvents(i))},renderBgEvents:function(t){var e=this.eventsToSegs(t);return this.renderBgSegs(e)||e},renderFgEvents:function(t){var e=this.eventsToSegs(t);return this.renderFgSegs(e)||e},unrenderEvents:function(){this.handleSegMouseout(),this.clearDragListeners(),this.unrenderFgSegs(),this.unrenderBgSegs(),this.segs=null},getEventSegs:function(){return this.segs||[]},renderFgSegs:function(t){},unrenderFgSegs:function(){},renderFgSegEls:function(e,n){var i,r=this.view,s="",o=[];if(e.length){for(i=0;i<e.length;i++)s+=this.fgSegHtml(e[i],n);t(s).each(function(n,i){var s=e[n],l=r.resolveEventEl(s.event,t(i));l&&(l.data("fc-seg",s),s.el=l,o.push(s))})}return o},fgSegHtml:function(t,e){},renderBgSegs:function(t){return this.renderFill("bgEvent",t)},unrenderBgSegs:function(){this.unrenderFill("bgEvent")},bgEventSegEl:function(t,e){return this.view.resolveEventEl(t.event,e)},bgEventSegClasses:function(t){var e=t.event,n=e.source||{};return["fc-bgevent"].concat(e.className,n.className||[])},bgEventSegCss:function(t){return{"background-color":this.getSegSkinCss(t)["background-color"]}},businessHoursSegClasses:function(t){return["fc-nonbusiness","fc-bgevent"]},buildBusinessHourSegs:function(t,e){return this.eventsToSegs(this.buildBusinessHourEvents(t,e))},buildBusinessHourEvents:function(e,n){var i,r=this.view.calendar;return null==n&&(n=r.options.businessHours),i=r.computeBusinessHourEvents(e,n),!i.length&&n&&(i=[t.extend({},ke,{start:this.view.end,end:this.view.end,dow:null})]),i},bindSegHandlers:function(){this.bindSegHandlersToEl(this.el)},bindSegHandlersToEl:function(t){this.bindSegHandlerToEl(t,"touchstart",this.handleSegTouchStart),this.bindSegHandlerToEl(t,"touchend",this.handleSegTouchEnd),this.bindSegHandlerToEl(t,"mouseenter",this.handleSegMouseover),this.bindSegHandlerToEl(t,"mouseleave",this.handleSegMouseout),this.bindSegHandlerToEl(t,"mousedown",this.handleSegMousedown),this.bindSegHandlerToEl(t,"click",this.handleSegClick)},bindSegHandlerToEl:function(e,n,i){var r=this;e.on(n,this.segSelector,function(e){var n=t(this).data("fc-seg");if(n&&!r.isDraggingSeg&&!r.isResizingSeg)return i.call(r,n,e)})},handleSegClick:function(t,e){var n=this.view.publiclyTrigger("eventClick",t.el[0],t.event,e);n===!1&&e.preventDefault()},handleSegMouseover:function(t,e){this.isIgnoringMouse||this.mousedOverSeg||(this.mousedOverSeg=t,this.view.isEventResizable(t.event)&&t.el.addClass("fc-allow-mouse-resize"),this.view.publiclyTrigger("eventMouseover",t.el[0],t.event,e))},handleSegMouseout:function(t,e){e=e||{},this.mousedOverSeg&&(t=t||this.mousedOverSeg,this.mousedOverSeg=null,this.view.isEventResizable(t.event)&&t.el.removeClass("fc-allow-mouse-resize"),this.view.publiclyTrigger("eventMouseout",t.el[0],t.event,e))},handleSegMousedown:function(t,e){var n=this.startSegResize(t,e,{distance:5});!n&&this.view.isEventDraggable(t.event)&&this.buildSegDragListener(t).startInteraction(e,{distance:5})},handleSegTouchStart:function(t,e){var n,i,r=this.view,s=t.event,o=r.isEventSelected(s),l=r.isEventDraggable(s),a=r.isEventResizable(s),u=!1;o&&a&&(u=this.startSegResize(t,e)),u||!l&&!a||(i=r.opt("eventLongPressDelay"),null==i&&(i=r.opt("longPressDelay")),n=l?this.buildSegDragListener(t):this.buildSegSelectListener(t),n.startInteraction(e,{delay:o?0:i})),this.tempIgnoreMouse()},handleSegTouchEnd:function(t,e){this.tempIgnoreMouse()},startSegResize:function(e,n,i){return!!t(n.target).is(".fc-resizer")&&(this.buildSegResizeListener(e,t(n.target).is(".fc-start-resizer")).startInteraction(n,i),!0)},buildSegDragListener:function(t){var e,n,i,r=this,l=this.view,a=l.calendar,u=t.el,c=t.event;if(this.segDragListener)return this.segDragListener;var d=this.segDragListener=new pe(l,{scroll:l.opt("dragScroll"),subjectEl:u,subjectCenter:!0,interactionStart:function(i){t.component=r,e=!1,n=new ve(t.el,{additionalClass:"fc-dragging",parentEl:l.el,opacity:d.isTouch?null:l.opt("dragOpacity"),revertDuration:l.opt("dragRevertDuration"),zIndex:2}),n.hide(),n.start(i)},dragStart:function(n){d.isTouch&&!l.isEventSelected(c)&&l.selectEvent(c),e=!0,r.handleSegMouseout(t,n),r.segDragStart(t,n),l.hideEvent(c)},hitOver:function(e,o,u){var h;t.hit&&(u=t.hit),i=r.computeEventDrop(u.component.getHitSpan(u),e.component.getHitSpan(e),c),i&&!a.isEventSpanAllowed(r.eventToSpan(i),c)&&(s(),i=null),i&&(h=l.renderDrag(i,t))?(h.addClass("fc-dragging"),d.isTouch||r.applyDragOpacity(h),n.hide()):n.show(),o&&(i=null)},hitOut:function(){l.unrenderDrag(),n.show(),i=null},hitDone:function(){o()},interactionEnd:function(s){delete t.component,n.stop(!i,function(){e&&(l.unrenderDrag(),r.segDragStop(t,s)),i?l.reportEventDrop(c,i,r.largeUnit,u,s):l.showEvent(c)}),r.segDragListener=null}});return d},buildSegSelectListener:function(t){var e=this,n=this.view,i=t.event;if(this.segDragListener)return this.segDragListener;var r=this.segDragListener=new ge({dragStart:function(t){r.isTouch&&!n.isEventSelected(i)&&n.selectEvent(i)},interactionEnd:function(t){e.segDragListener=null}});return r},segDragStart:function(t,e){this.isDraggingSeg=!0,this.view.publiclyTrigger("eventDragStart",t.el[0],t.event,e,{})},segDragStop:function(t,e){this.isDraggingSeg=!1,this.view.publiclyTrigger("eventDragStop",t.el[0],t.event,e,{})},computeEventDrop:function(t,e,n){var i,r,s=this.view.calendar,o=t.start,l=e.start;return o.hasTime()===l.hasTime()?(i=this.diffDates(l,o),n.allDay&&W(i)?(r={start:n.start.clone(),end:s.getEventEnd(n),allDay:!1},s.normalizeEventTimes(r)):r=Ht(n),r.start.add(i),r.end&&r.end.add(i)):r={start:l.clone(),end:null,allDay:!l.hasTime()},r},applyDragOpacity:function(t){var e=this.view.opt("dragOpacity");null!=e&&t.css("opacity",e)},externalDragStart:function(e,n){var i,r,s=this.view;s.opt("droppable")&&(i=t((n?n.item:null)||e.target),r=s.opt("dropAccept"),(t.isFunction(r)?r.call(i[0],i):i.is(r))&&(this.isDraggingExternal||this.listenToExternalDrag(i,e,n)))},listenToExternalDrag:function(t,e,n){var i,r=this,l=this.view.calendar,a=Mt(t),u=r.externalDragListener=new pe(this,{interactionStart:function(){r.isDraggingExternal=!0},hitOver:function(t){i=r.computeExternalDrop(t.component.getHitSpan(t),a),i&&!l.isExternalSpanAllowed(r.eventToSpan(i),i,a.eventProps)&&(s(),i=null),i&&r.renderDrag(i)},hitOut:function(){i=null},hitDone:function(){o(),r.unrenderDrag()},interactionEnd:function(e){i&&r.view.reportExternalDrop(a,i,t,e,n),r.isDraggingExternal=!1,r.externalDragListener=null}});u.startDrag(e)},computeExternalDrop:function(t,e){var n=this.view.calendar,i={start:n.applyTimezone(t.start),end:null};return e.startTime&&!i.start.hasTime()&&i.start.time(e.startTime),e.duration&&(i.end=i.start.clone().add(e.duration)),i},renderDrag:function(t,e){},unrenderDrag:function(){},buildSegResizeListener:function(t,e){var n,i,r=this,l=this.view,a=l.calendar,u=t.el,c=t.event,d=a.getEventEnd(c),h=this.segResizeListener=new pe(this,{scroll:l.opt("dragScroll"),subjectEl:u,interactionStart:function(){n=!1},dragStart:function(e){n=!0,r.handleSegMouseout(t,e),r.segResizeStart(t,e)},hitOver:function(n,o,u){var h=r.getHitSpan(u),f=r.getHitSpan(n);i=e?r.computeEventStartResize(h,f,c):r.computeEventEndResize(h,f,c),i&&(a.isEventSpanAllowed(r.eventToSpan(i),c)?i.start.isSame(c.start.clone().stripZone())&&i.end.isSame(d.clone().stripZone())&&(i=null):(s(),i=null)),i&&(l.hideEvent(c),r.renderEventResize(i,t))},hitOut:function(){i=null,l.showEvent(c)},hitDone:function(){r.unrenderEventResize(),o()},interactionEnd:function(e){n&&r.segResizeStop(t,e),i?l.reportEventResize(c,i,r.largeUnit,u,e):l.showEvent(c),r.segResizeListener=null}});return h},segResizeStart:function(t,e){this.isResizingSeg=!0,this.view.publiclyTrigger("eventResizeStart",t.el[0],t.event,e,{})},segResizeStop:function(t,e){this.isResizingSeg=!1,this.view.publiclyTrigger("eventResizeStop",t.el[0],t.event,e,{})},computeEventStartResize:function(t,e,n){return this.computeEventResize("start",t,e,n)},computeEventEndResize:function(t,e,n){return this.computeEventResize("end",t,e,n)},computeEventResize:function(t,e,n,i){var r,s,o=this.view.calendar,l=this.diffDates(n[t],e[t]);return r={start:i.start.clone(),end:o.getEventEnd(i),allDay:i.allDay},r.allDay&&W(l)&&(r.allDay=!1,o.normalizeEventTimes(r)),r[t].add(l),r.start.isBefore(r.end)||(s=this.minResizeDuration||(i.allDay?o.defaultAllDayEventDuration:o.defaultTimedEventDuration),"start"==t?r.start=r.end.clone().subtract(s):r.end=r.start.clone().add(s)),r},renderEventResize:function(t,e){},unrenderEventResize:function(){},getEventTimeText:function(t,e,n){return null==e&&(e=this.eventTimeFormat),null==n&&(n=this.displayEventEnd),this.displayEventTime&&t.start.hasTime()?n&&t.end?this.view.formatRange(t,e):t.start.format(e):""},getSegClasses:function(t,e,n){var i=this.view,r=["fc-event",t.isStart?"fc-start":"fc-not-start",t.isEnd?"fc-end":"fc-not-end"].concat(this.getSegCustomClasses(t));return e&&r.push("fc-draggable"),n&&r.push("fc-resizable"),i.isEventSelected(t.event)&&r.push("fc-selected"),r},getSegCustomClasses:function(t){var e=t.event;return[].concat(e.className,e.source?e.source.className:[])},getSegSkinCss:function(t){return{"background-color":this.getSegBackgroundColor(t),"border-color":this.getSegBorderColor(t),color:this.getSegTextColor(t)}},getSegBackgroundColor:function(t){return t.event.backgroundColor||t.event.color||this.getSegDefaultBackgroundColor(t)},getSegDefaultBackgroundColor:function(t){var e=t.event.source||{};return e.backgroundColor||e.color||this.view.opt("eventBackgroundColor")||this.view.opt("eventColor")},getSegBorderColor:function(t){return t.event.borderColor||t.event.color||this.getSegDefaultBorderColor(t)},getSegDefaultBorderColor:function(t){var e=t.event.source||{};return e.borderColor||e.color||this.view.opt("eventBorderColor")||this.view.opt("eventColor")},getSegTextColor:function(t){return t.event.textColor||this.getSegDefaultTextColor(t)},getSegDefaultTextColor:function(t){var e=t.event.source||{};return e.textColor||this.view.opt("eventTextColor")},eventToSegs:function(t){return this.eventsToSegs([t])},eventToSpan:function(t){return this.eventToSpans(t)[0]},eventToSpans:function(t){var e=this.eventToRange(t);return this.eventRangeToSpans(e,t)},eventsToSegs:function(e,n){var i=this,r=kt(e),s=[];return t.each(r,function(t,e){var r,o=[];for(r=0;r<e.length;r++)o.push(i.eventToRange(e[r]));if(xt(e[0]))for(o=i.invertRanges(o),r=0;r<o.length;r++)s.push.apply(s,i.eventRangeToSegs(o[r],e[0],n));else for(r=0;r<o.length;r++)s.push.apply(s,i.eventRangeToSegs(o[r],e[r],n))}),s},eventToRange:function(t){var e=this.view.calendar,n=t.start.clone().stripZone(),i=(t.end?t.end.clone():e.getDefaultEventEnd(null!=t.allDay?t.allDay:!t.start.hasTime(),t.start)).stripZone();return e.localizeMoment(n),e.localizeMoment(i),{start:n,end:i}},eventRangeToSegs:function(t,e,n){var i,r=this.eventRangeToSpans(t,e),s=[];for(i=0;i<r.length;i++)s.push.apply(s,this.eventSpanToSegs(r[i],e,n));return s},eventRangeToSpans:function(e,n){return[t.extend({},e)]},eventSpanToSegs:function(t,e,n){var i,r,s=n?n(t):this.spanToSegs(t);
-for(i=0;i<s.length;i++)r=s[i],r.event=e,r.eventStartMS=+t.start,r.eventDurationMS=t.end-t.start;return s},invertRanges:function(t){var e,n,i=this.view,r=i.start.clone(),s=i.end.clone(),o=[],l=r;for(t.sort(Lt),e=0;e<t.length;e++)n=t[e],n.start>l&&o.push({start:l,end:n.start}),l=n.end;return l<s&&o.push({start:l,end:s}),o},sortEventSegs:function(t){t.sort(lt(this,"compareEventSegs"))},compareEventSegs:function(t,e){return t.eventStartMS-e.eventStartMS||e.eventDurationMS-t.eventDurationMS||e.event.allDay-t.event.allDay||M(t.event,e.event,this.view.eventOrderSpecs)}}),qt.pluckEventDateProps=Ht,qt.isBgEvent=Rt,qt.dataAttrPrefix="";var ye=qt.DayTableMixin={breakOnWeeks:!1,dayDates:null,dayIndices:null,daysPerRow:null,rowCnt:null,colCnt:null,colHeadFormat:null,updateDayTable:function(){for(var t,e,n,i=this.view,r=this.start.clone(),s=-1,o=[],l=[];r.isBefore(this.end);)i.isHiddenDay(r)?o.push(s+.5):(s++,o.push(s),l.push(r.clone())),r.add(1,"days");if(this.breakOnWeeks){for(e=l[0].day(),t=1;t<l.length&&l[t].day()!=e;t++);n=Math.ceil(l.length/t)}else n=1,t=l.length;this.dayDates=l,this.dayIndices=o,this.daysPerRow=t,this.rowCnt=n,this.updateDayTableCols()},updateDayTableCols:function(){this.colCnt=this.computeColCnt(),this.colHeadFormat=this.view.opt("columnFormat")||this.computeColHeadFormat()},computeColCnt:function(){return this.daysPerRow},getCellDate:function(t,e){return this.dayDates[this.getCellDayIndex(t,e)].clone()},getCellRange:function(t,e){var n=this.getCellDate(t,e),i=n.clone().add(1,"days");return{start:n,end:i}},getCellDayIndex:function(t,e){return t*this.daysPerRow+this.getColDayIndex(e)},getColDayIndex:function(t){return this.isRTL?this.colCnt-1-t:t},getDateDayIndex:function(t){var e=this.dayIndices,n=t.diff(this.start,"days");return n<0?e[0]-1:n>=e.length?e[e.length-1]+1:e[n]},computeColHeadFormat:function(){return this.rowCnt>1||this.colCnt>10?"ddd":this.colCnt>1?this.view.opt("dayOfMonthFormat"):"dddd"},sliceRangeByRow:function(t){var e,n,i,r,s,o=this.daysPerRow,l=this.view.computeDayRange(t),a=this.getDateDayIndex(l.start),u=this.getDateDayIndex(l.end.clone().subtract(1,"days")),c=[];for(e=0;e<this.rowCnt;e++)n=e*o,i=n+o-1,r=Math.max(a,n),s=Math.min(u,i),r=Math.ceil(r),s=Math.floor(s),r<=s&&c.push({row:e,firstRowDayIndex:r-n,lastRowDayIndex:s-n,isStart:r===a,isEnd:s===u});return c},sliceRangeByDay:function(t){var e,n,i,r,s,o,l=this.daysPerRow,a=this.view.computeDayRange(t),u=this.getDateDayIndex(a.start),c=this.getDateDayIndex(a.end.clone().subtract(1,"days")),d=[];for(e=0;e<this.rowCnt;e++)for(n=e*l,i=n+l-1,r=n;r<=i;r++)s=Math.max(u,r),o=Math.min(c,r),s=Math.ceil(s),o=Math.floor(o),s<=o&&d.push({row:e,firstRowDayIndex:s-n,lastRowDayIndex:o-n,isStart:s===u,isEnd:o===c});return d},renderHeadHtml:function(){var t=this.view;return'<div class="fc-row '+t.widgetHeaderClass+'"><table><thead>'+this.renderHeadTrHtml()+"</thead></table></div>"},renderHeadIntroHtml:function(){return this.renderIntroHtml()},renderHeadTrHtml:function(){return"<tr>"+(this.isRTL?"":this.renderHeadIntroHtml())+this.renderHeadDateCellsHtml()+(this.isRTL?this.renderHeadIntroHtml():"")+"</tr>"},renderHeadDateCellsHtml:function(){var t,e,n=[];for(t=0;t<this.colCnt;t++)e=this.getCellDate(0,t),n.push(this.renderHeadDateCellHtml(e));return n.join("")},renderHeadDateCellHtml:function(t,e,n){var i=this.view,r=["fc-day-header",i.widgetHeaderClass];return 1===this.rowCnt?r=r.concat(this.getDayClasses(t,!0)):r.push("fc-"+Xt[t.day()]),'<th class="'+r.join(" ")+'"'+(1===this.rowCnt?' data-date="'+t.format("YYYY-MM-DD")+'"':"")+(e>1?' colspan="'+e+'"':"")+(n?" "+n:"")+">"+i.buildGotoAnchorHtml({date:t,forceOff:this.rowCnt>1||1===this.colCnt},tt(t.format(this.colHeadFormat)))+"</th>"},renderBgTrHtml:function(t){return"<tr>"+(this.isRTL?"":this.renderBgIntroHtml(t))+this.renderBgCellsHtml(t)+(this.isRTL?this.renderBgIntroHtml(t):"")+"</tr>"},renderBgIntroHtml:function(t){return this.renderIntroHtml()},renderBgCellsHtml:function(t){var e,n,i=[];for(e=0;e<this.colCnt;e++)n=this.getCellDate(t,e),i.push(this.renderBgCellHtml(n));return i.join("")},renderBgCellHtml:function(t,e){var n=this.view,i=this.getDayClasses(t);return i.unshift("fc-day",n.widgetContentClass),'<td class="'+i.join(" ")+'" data-date="'+t.format("YYYY-MM-DD")+'"'+(e?" "+e:"")+"></td>"},renderIntroHtml:function(){},bookendCells:function(t){var e=this.renderIntroHtml();e&&(this.isRTL?t.append(e):t.prepend(e))}},Se=qt.DayGrid=me.extend(ye,{numbersVisible:!1,bottomCoordPadding:0,rowEls:null,cellEls:null,helperEls:null,rowCoordCache:null,colCoordCache:null,renderDates:function(t){var e,n,i=this.view,r=this.rowCnt,s=this.colCnt,o="";for(e=0;e<r;e++)o+=this.renderDayRowHtml(e,t);for(this.el.html(o),this.rowEls=this.el.find(".fc-row"),this.cellEls=this.el.find(".fc-day"),this.rowCoordCache=new fe({els:this.rowEls,isVertical:!0}),this.colCoordCache=new fe({els:this.cellEls.slice(0,this.colCnt),isHorizontal:!0}),e=0;e<r;e++)for(n=0;n<s;n++)i.publiclyTrigger("dayRender",null,this.getCellDate(e,n),this.getCellEl(e,n))},unrenderDates:function(){this.removeSegPopover()},renderBusinessHours:function(){var t=this.buildBusinessHourSegs(!0);this.renderFill("businessHours",t,"bgevent")},unrenderBusinessHours:function(){this.unrenderFill("businessHours")},renderDayRowHtml:function(t,e){var n=this.view,i=["fc-row","fc-week",n.widgetContentClass];return e&&i.push("fc-rigid"),'<div class="'+i.join(" ")+'"><div class="fc-bg"><table>'+this.renderBgTrHtml(t)+'</table></div><div class="fc-content-skeleton"><table>'+(this.numbersVisible?"<thead>"+this.renderNumberTrHtml(t)+"</thead>":"")+"</table></div></div>"},renderNumberTrHtml:function(t){return"<tr>"+(this.isRTL?"":this.renderNumberIntroHtml(t))+this.renderNumberCellsHtml(t)+(this.isRTL?this.renderNumberIntroHtml(t):"")+"</tr>"},renderNumberIntroHtml:function(t){return this.renderIntroHtml()},renderNumberCellsHtml:function(t){var e,n,i=[];for(e=0;e<this.colCnt;e++)n=this.getCellDate(t,e),i.push(this.renderNumberCellHtml(n));return i.join("")},renderNumberCellHtml:function(t){var e,n,i="";return this.view.dayNumbersVisible||this.view.cellWeekNumbersVisible?(e=this.getDayClasses(t),e.unshift("fc-day-top"),this.view.cellWeekNumbersVisible&&(n="ISO"===t._locale._fullCalendar_weekCalc?1:t._locale.firstDayOfWeek()),i+='<td class="'+e.join(" ")+'" data-date="'+t.format()+'">',this.view.cellWeekNumbersVisible&&t.day()==n&&(i+=this.view.buildGotoAnchorHtml({date:t,type:"week"},{class:"fc-week-number"},t.format("w"))),this.view.dayNumbersVisible&&(i+=this.view.buildGotoAnchorHtml(t,{class:"fc-day-number"},t.date())),i+="</td>"):"<td/>"},computeEventTimeFormat:function(){return this.view.opt("extraSmallTimeFormat")},computeDisplayEventEnd:function(){return 1==this.colCnt},rangeUpdated:function(){this.updateDayTable()},spanToSegs:function(t){var e,n,i=this.sliceRangeByRow(t);for(e=0;e<i.length;e++)n=i[e],this.isRTL?(n.leftCol=this.daysPerRow-1-n.lastRowDayIndex,n.rightCol=this.daysPerRow-1-n.firstRowDayIndex):(n.leftCol=n.firstRowDayIndex,n.rightCol=n.lastRowDayIndex);return i},prepareHits:function(){this.colCoordCache.build(),this.rowCoordCache.build(),this.rowCoordCache.bottoms[this.rowCnt-1]+=this.bottomCoordPadding},releaseHits:function(){this.colCoordCache.clear(),this.rowCoordCache.clear()},queryHit:function(t,e){if(this.colCoordCache.isLeftInBounds(t)&&this.rowCoordCache.isTopInBounds(e)){var n=this.colCoordCache.getHorizontalIndex(t),i=this.rowCoordCache.getVerticalIndex(e);if(null!=i&&null!=n)return this.getCellHit(i,n)}},getHitSpan:function(t){return this.getCellRange(t.row,t.col)},getHitEl:function(t){return this.getCellEl(t.row,t.col)},getCellHit:function(t,e){return{row:t,col:e,component:this,left:this.colCoordCache.getLeftOffset(e),right:this.colCoordCache.getRightOffset(e),top:this.rowCoordCache.getTopOffset(t),bottom:this.rowCoordCache.getBottomOffset(t)}},getCellEl:function(t,e){return this.cellEls.eq(t*this.colCnt+e)},renderDrag:function(t,e){if(this.renderHighlight(this.eventToSpan(t)),e&&e.component!==this)return this.renderEventLocationHelper(t,e)},unrenderDrag:function(){this.unrenderHighlight(),this.unrenderHelper()},renderEventResize:function(t,e){return this.renderHighlight(this.eventToSpan(t)),this.renderEventLocationHelper(t,e)},unrenderEventResize:function(){this.unrenderHighlight(),this.unrenderHelper()},renderHelper:function(e,n){var i,r=[],s=this.eventToSegs(e);return s=this.renderFgSegEls(s),i=this.renderSegRows(s),this.rowEls.each(function(e,s){var o,l=t(s),a=t('<div class="fc-helper-skeleton"><table/></div>');o=n&&n.row===e?n.el.position().top:l.find(".fc-content-skeleton tbody").position().top,a.css("top",o).find("table").append(i[e].tbodyEl),l.append(a),r.push(a[0])}),this.helperEls=t(r)},unrenderHelper:function(){this.helperEls&&(this.helperEls.remove(),this.helperEls=null)},fillSegTag:"td",renderFill:function(e,n,i){var r,s,o,l=[];for(n=this.renderFillSegEls(e,n),r=0;r<n.length;r++)s=n[r],o=this.renderFillRow(e,s,i),this.rowEls.eq(s.row).append(o),l.push(o[0]);return this.elsByFill[e]=t(l),n},renderFillRow:function(e,n,i){var r,s,o=this.colCnt,l=n.leftCol,a=n.rightCol+1;return i=i||e.toLowerCase(),r=t('<div class="fc-'+i+'-skeleton"><table><tr/></table></div>'),s=r.find("tr"),l>0&&s.append('<td colspan="'+l+'"/>'),s.append(n.el.attr("colspan",a-l)),a<o&&s.append('<td colspan="'+(o-a)+'"/>'),this.bookendCells(s),r}});Se.mixin({rowStructs:null,unrenderEvents:function(){this.removeSegPopover(),me.prototype.unrenderEvents.apply(this,arguments)},getEventSegs:function(){return me.prototype.getEventSegs.call(this).concat(this.popoverSegs||[])},renderBgSegs:function(e){var n=t.grep(e,function(t){return t.event.allDay});return me.prototype.renderBgSegs.call(this,n)},renderFgSegs:function(e){var n;return e=this.renderFgSegEls(e),n=this.rowStructs=this.renderSegRows(e),this.rowEls.each(function(e,i){t(i).find(".fc-content-skeleton > table").append(n[e].tbodyEl)}),e},unrenderFgSegs:function(){for(var t,e=this.rowStructs||[];t=e.pop();)t.tbodyEl.remove();this.rowStructs=null},renderSegRows:function(t){var e,n,i=[];for(e=this.groupSegRows(t),n=0;n<e.length;n++)i.push(this.renderSegRow(n,e[n]));return i},fgSegHtml:function(t,e){var n,i,r=this.view,s=t.event,o=r.isEventDraggable(s),l=!e&&s.allDay&&t.isStart&&r.isEventResizableFromStart(s),a=!e&&s.allDay&&t.isEnd&&r.isEventResizableFromEnd(s),u=this.getSegClasses(t,o,l||a),c=nt(this.getSegSkinCss(t)),d="";return u.unshift("fc-day-grid-event","fc-h-event"),t.isStart&&(n=this.getEventTimeText(s),n&&(d='<span class="fc-time">'+tt(n)+"</span>")),i='<span class="fc-title">'+(tt(s.title||"")||"&nbsp;")+"</span>",'<a class="'+u.join(" ")+'"'+(s.url?' href="'+tt(s.url)+'"':"")+(c?' style="'+c+'"':"")+'><div class="fc-content">'+(this.isRTL?i+" "+d:d+" "+i)+"</div>"+(l?'<div class="fc-resizer fc-start-resizer" />':"")+(a?'<div class="fc-resizer fc-end-resizer" />':"")+"</a>"},renderSegRow:function(e,n){function i(e){for(;o<e;)c=(m[r-1]||[])[o],c?c.attr("rowspan",parseInt(c.attr("rowspan")||1,10)+1):(c=t("<td/>"),l.append(c)),v[r][o]=c,m[r][o]=c,o++}var r,s,o,l,a,u,c,d=this.colCnt,h=this.buildSegLevels(n),f=Math.max(1,h.length),g=t("<tbody/>"),p=[],v=[],m=[];for(r=0;r<f;r++){if(s=h[r],o=0,l=t("<tr/>"),p.push([]),v.push([]),m.push([]),s)for(a=0;a<s.length;a++){for(u=s[a],i(u.leftCol),c=t('<td class="fc-event-container"/>').append(u.el),u.leftCol!=u.rightCol?c.attr("colspan",u.rightCol-u.leftCol+1):m[r][o]=c;o<=u.rightCol;)v[r][o]=c,p[r][o]=u,o++;l.append(c)}i(d),this.bookendCells(l),g.append(l)}return{row:e,tbodyEl:g,cellMatrix:v,segMatrix:p,segLevels:h,segs:n}},buildSegLevels:function(t){var e,n,i,r=[];for(this.sortEventSegs(t),e=0;e<t.length;e++){for(n=t[e],i=0;i<r.length&&Bt(n,r[i]);i++);n.level=i,(r[i]||(r[i]=[])).push(n)}for(i=0;i<r.length;i++)r[i].sort(zt);return r},groupSegRows:function(t){var e,n=[];for(e=0;e<this.rowCnt;e++)n.push([]);for(e=0;e<t.length;e++)n[t[e].row].push(t[e]);return n}}),Se.mixin({segPopover:null,popoverSegs:null,removeSegPopover:function(){this.segPopover&&this.segPopover.hide()},limitRows:function(t){var e,n,i=this.rowStructs||[];for(e=0;e<i.length;e++)this.unlimitRow(e),n=!!t&&("number"==typeof t?t:this.computeRowLevelLimit(e)),n!==!1&&this.limitRow(e,n)},computeRowLevelLimit:function(e){function n(e,n){s=Math.max(s,t(n).outerHeight())}var i,r,s,o=this.rowEls.eq(e),l=o.height(),a=this.rowStructs[e].tbodyEl.children();for(i=0;i<a.length;i++)if(r=a.eq(i).removeClass("fc-limited"),s=0,r.find("> td > :first-child").each(n),r.position().top+s>l)return i;return!1},limitRow:function(e,n){function i(i){for(;b<i;)u=S.getCellSegs(e,b,n),u.length&&(h=s[n-1][b],y=S.renderMoreLink(e,b,u),m=t("<div/>").append(y),h.append(m),E.push(m[0])),b++}var r,s,o,l,a,u,c,d,h,f,g,p,v,m,y,S=this,w=this.rowStructs[e],E=[],b=0;if(n&&n<w.segLevels.length){for(r=w.segLevels[n-1],s=w.cellMatrix,o=w.tbodyEl.children().slice(n).addClass("fc-limited").get(),l=0;l<r.length;l++){for(a=r[l],i(a.leftCol),d=[],c=0;b<=a.rightCol;)u=this.getCellSegs(e,b,n),d.push(u),c+=u.length,b++;if(c){for(h=s[n-1][a.leftCol],f=h.attr("rowspan")||1,g=[],p=0;p<d.length;p++)v=t('<td class="fc-more-cell"/>').attr("rowspan",f),u=d[p],y=this.renderMoreLink(e,a.leftCol+p,[a].concat(u)),m=t("<div/>").append(y),v.append(m),g.push(v[0]),E.push(v[0]);h.addClass("fc-limited").after(t(g)),o.push(h[0])}}i(this.colCnt),w.moreEls=t(E),w.limitedEls=t(o)}},unlimitRow:function(t){var e=this.rowStructs[t];e.moreEls&&(e.moreEls.remove(),e.moreEls=null),e.limitedEls&&(e.limitedEls.removeClass("fc-limited"),e.limitedEls=null)},renderMoreLink:function(e,n,i){var r=this,s=this.view;return t('<a class="fc-more"/>').text(this.getMoreLinkText(i.length)).on("click",function(o){var l=s.opt("eventLimitClick"),a=r.getCellDate(e,n),u=t(this),c=r.getCellEl(e,n),d=r.getCellSegs(e,n),h=r.resliceDaySegs(d,a),f=r.resliceDaySegs(i,a);"function"==typeof l&&(l=s.publiclyTrigger("eventLimitClick",null,{date:a,dayEl:c,moreEl:u,segs:h,hiddenSegs:f},o)),"popover"===l?r.showSegPopover(e,n,u,h):"string"==typeof l&&s.calendar.zoomTo(a,l)})},showSegPopover:function(t,e,n,i){var r,s,o=this,l=this.view,a=n.parent();r=1==this.rowCnt?l.el:this.rowEls.eq(t),s={className:"fc-more-popover",content:this.renderSegPopoverContent(t,e,i),parentEl:this.view.el,top:r.offset().top,autoHide:!0,viewportConstrain:l.opt("popoverViewportConstrain"),hide:function(){if(o.popoverSegs)for(var t,e=0;e<o.popoverSegs.length;++e)t=o.popoverSegs[e],l.publiclyTrigger("eventDestroy",t.event,t.event,t.el);o.segPopover.removeElement(),o.segPopover=null,o.popoverSegs=null}},this.isRTL?s.right=a.offset().left+a.outerWidth()+1:s.left=a.offset().left-1,this.segPopover=new he(s),this.segPopover.show(),this.bindSegHandlersToEl(this.segPopover.el)},renderSegPopoverContent:function(e,n,i){var r,s=this.view,o=s.opt("theme"),l=this.getCellDate(e,n).format(s.opt("dayPopoverFormat")),a=t('<div class="fc-header '+s.widgetHeaderClass+'"><span class="fc-close '+(o?"ui-icon ui-icon-closethick":"fc-icon fc-icon-x")+'"></span><span class="fc-title">'+tt(l)+'</span><div class="fc-clear"/></div><div class="fc-body '+s.widgetContentClass+'"><div class="fc-event-container"></div></div>'),u=a.find(".fc-event-container");for(i=this.renderFgSegEls(i,!0),this.popoverSegs=i,r=0;r<i.length;r++)this.prepareHits(),i[r].hit=this.getCellHit(e,n),this.releaseHits(),u.append(i[r].el);return a},resliceDaySegs:function(e,n){var i=t.map(e,function(t){return t.event}),r=n.clone(),s=r.clone().add(1,"days"),o={start:r,end:s};return e=this.eventsToSegs(i,function(t){var e=F(t,o);return e?[e]:[]}),this.sortEventSegs(e),e},getMoreLinkText:function(t){var e=this.view.opt("eventLimitText");return"function"==typeof e?e(t):"+"+t+" "+e},getCellSegs:function(t,e,n){for(var i,r=this.rowStructs[t].segMatrix,s=n||0,o=[];s<r.length;)i=r[s][e],i&&o.push(i),s++;return o}});var we=qt.TimeGrid=me.extend(ye,{slotDuration:null,snapDuration:null,snapsPerSlot:null,minTime:null,maxTime:null,labelFormat:null,labelInterval:null,colEls:null,slatContainerEl:null,slatEls:null,nowIndicatorEls:null,colCoordCache:null,slatCoordCache:null,constructor:function(){me.apply(this,arguments),this.processOptions()},renderDates:function(){this.el.html(this.renderHtml()),this.colEls=this.el.find(".fc-day"),this.slatContainerEl=this.el.find(".fc-slats"),this.slatEls=this.slatContainerEl.find("tr"),this.colCoordCache=new fe({els:this.colEls,isHorizontal:!0}),this.slatCoordCache=new fe({els:this.slatEls,isVertical:!0}),this.renderContentSkeleton()},renderHtml:function(){return'<div class="fc-bg"><table>'+this.renderBgTrHtml(0)+'</table></div><div class="fc-slats"><table>'+this.renderSlatRowHtml()+"</table></div>"},renderSlatRowHtml:function(){for(var t,n,i,r=this.view,s=this.isRTL,o="",l=e.duration(+this.minTime);l<this.maxTime;)t=this.start.clone().time(l),n=ot(_(l,this.labelInterval)),i='<td class="fc-axis fc-time '+r.widgetContentClass+'" '+r.axisStyleAttr()+">"+(n?"<span>"+tt(t.format(this.labelFormat))+"</span>":"")+"</td>",o+='<tr data-time="'+t.format("HH:mm:ss")+'"'+(n?"":' class="fc-minor"')+">"+(s?"":i)+'<td class="'+r.widgetContentClass+'"/>'+(s?i:"")+"</tr>",l.add(this.slotDuration);return o},processOptions:function(){var n,i=this.view,r=i.opt("slotDuration"),s=i.opt("snapDuration");r=e.duration(r),s=s?e.duration(s):r,this.slotDuration=r,this.snapDuration=s,this.snapsPerSlot=r/s,this.minResizeDuration=s,this.minTime=e.duration(i.opt("minTime")),this.maxTime=e.duration(i.opt("maxTime")),n=i.opt("slotLabelFormat"),t.isArray(n)&&(n=n[n.length-1]),this.labelFormat=n||i.opt("smallTimeFormat"),n=i.opt("slotLabelInterval"),this.labelInterval=n?e.duration(n):this.computeLabelInterval(r)},computeLabelInterval:function(t){var n,i,r;for(n=Oe.length-1;n>=0;n--)if(i=e.duration(Oe[n]),r=_(i,t),ot(r)&&r>1)return i;return e.duration(t)},computeEventTimeFormat:function(){return this.view.opt("noMeridiemTimeFormat")},computeDisplayEventEnd:function(){return!0},prepareHits:function(){this.colCoordCache.build(),this.slatCoordCache.build()},releaseHits:function(){this.colCoordCache.clear()},queryHit:function(t,e){var n=this.snapsPerSlot,i=this.colCoordCache,r=this.slatCoordCache;if(i.isLeftInBounds(t)&&r.isTopInBounds(e)){var s=i.getHorizontalIndex(t),o=r.getVerticalIndex(e);if(null!=s&&null!=o){var l=r.getTopOffset(o),a=r.getHeight(o),u=(e-l)/a,c=Math.floor(u*n),d=o*n+c,h=l+c/n*a,f=l+(c+1)/n*a;return{col:s,snap:d,component:this,left:i.getLeftOffset(s),right:i.getRightOffset(s),top:h,bottom:f}}}},getHitSpan:function(t){var e,n=this.getCellDate(0,t.col),i=this.computeSnapTime(t.snap);return n.time(i),e=n.clone().add(this.snapDuration),{start:n,end:e}},getHitEl:function(t){return this.colEls.eq(t.col)},rangeUpdated:function(){this.updateDayTable()},computeSnapTime:function(t){return e.duration(this.minTime+this.snapDuration*t)},spanToSegs:function(t){var e,n=this.sliceRangeByTimes(t);for(e=0;e<n.length;e++)this.isRTL?n[e].col=this.daysPerRow-1-n[e].dayIndex:n[e].col=n[e].dayIndex;return n},sliceRangeByTimes:function(t){var e,n,i,r,s=[];for(n=0;n<this.daysPerRow;n++)i=this.dayDates[n].clone(),r={start:i.clone().time(this.minTime),end:i.clone().time(this.maxTime)},e=F(t,r),e&&(e.dayIndex=n,s.push(e));return s},updateSize:function(t){this.slatCoordCache.build(),t&&this.updateSegVerticals([].concat(this.fgSegs||[],this.bgSegs||[],this.businessSegs||[]))},getTotalSlatHeight:function(){return this.slatContainerEl.outerHeight()},computeDateTop:function(t,n){return this.computeTimeTop(e.duration(t-n.clone().stripTime()))},computeTimeTop:function(t){var e,n,i=this.slatEls.length,r=(t-this.minTime)/this.slotDuration;return r=Math.max(0,r),r=Math.min(i,r),e=Math.floor(r),e=Math.min(e,i-1),n=r-e,this.slatCoordCache.getTopPosition(e)+this.slatCoordCache.getHeight(e)*n},renderDrag:function(t,e){return e?this.renderEventLocationHelper(t,e):void this.renderHighlight(this.eventToSpan(t))},unrenderDrag:function(){this.unrenderHelper(),this.unrenderHighlight()},renderEventResize:function(t,e){return this.renderEventLocationHelper(t,e)},unrenderEventResize:function(){this.unrenderHelper()},renderHelper:function(t,e){return this.renderHelperSegs(this.eventToSegs(t),e)},unrenderHelper:function(){this.unrenderHelperSegs()},renderBusinessHours:function(){this.renderBusinessSegs(this.buildBusinessHourSegs())},unrenderBusinessHours:function(){this.unrenderBusinessSegs()},getNowIndicatorUnit:function(){return"minute"},renderNowIndicator:function(e){var n,i=this.spanToSegs({start:e,end:e}),r=this.computeDateTop(e,e),s=[];for(n=0;n<i.length;n++)s.push(t('<div class="fc-now-indicator fc-now-indicator-line"></div>').css("top",r).appendTo(this.colContainerEls.eq(i[n].col))[0]);i.length>0&&s.push(t('<div class="fc-now-indicator fc-now-indicator-arrow"></div>').css("top",r).appendTo(this.el.find(".fc-content-skeleton"))[0]),this.nowIndicatorEls=t(s)},unrenderNowIndicator:function(){this.nowIndicatorEls&&(this.nowIndicatorEls.remove(),this.nowIndicatorEls=null)},renderSelection:function(t){this.view.opt("selectHelper")?this.renderEventLocationHelper(t):this.renderHighlight(t)},unrenderSelection:function(){this.unrenderHelper(),this.unrenderHighlight()},renderHighlight:function(t){this.renderHighlightSegs(this.spanToSegs(t))},unrenderHighlight:function(){this.unrenderHighlightSegs()}});we.mixin({colContainerEls:null,fgContainerEls:null,bgContainerEls:null,helperContainerEls:null,highlightContainerEls:null,businessContainerEls:null,fgSegs:null,bgSegs:null,helperSegs:null,highlightSegs:null,businessSegs:null,renderContentSkeleton:function(){var e,n,i="";for(e=0;e<this.colCnt;e++)i+='<td><div class="fc-content-col"><div class="fc-event-container fc-helper-container"></div><div class="fc-event-container"></div><div class="fc-highlight-container"></div><div class="fc-bgevent-container"></div><div class="fc-business-container"></div></div></td>';n=t('<div class="fc-content-skeleton"><table><tr>'+i+"</tr></table></div>"),this.colContainerEls=n.find(".fc-content-col"),this.helperContainerEls=n.find(".fc-helper-container"),this.fgContainerEls=n.find(".fc-event-container:not(.fc-helper-container)"),this.bgContainerEls=n.find(".fc-bgevent-container"),this.highlightContainerEls=n.find(".fc-highlight-container"),this.businessContainerEls=n.find(".fc-business-container"),this.bookendCells(n.find("tr")),this.el.append(n)},renderFgSegs:function(t){return t=this.renderFgSegsIntoContainers(t,this.fgContainerEls),this.fgSegs=t,t},unrenderFgSegs:function(){this.unrenderNamedSegs("fgSegs")},renderHelperSegs:function(e,n){var i,r,s,o=[];for(e=this.renderFgSegsIntoContainers(e,this.helperContainerEls),i=0;i<e.length;i++)r=e[i],n&&n.col===r.col&&(s=n.el,r.el.css({left:s.css("left"),right:s.css("right"),"margin-left":s.css("margin-left"),"margin-right":s.css("margin-right")})),o.push(r.el[0]);return this.helperSegs=e,t(o)},unrenderHelperSegs:function(){this.unrenderNamedSegs("helperSegs")},renderBgSegs:function(t){return t=this.renderFillSegEls("bgEvent",t),this.updateSegVerticals(t),this.attachSegsByCol(this.groupSegsByCol(t),this.bgContainerEls),this.bgSegs=t,t},unrenderBgSegs:function(){this.unrenderNamedSegs("bgSegs")},renderHighlightSegs:function(t){t=this.renderFillSegEls("highlight",t),this.updateSegVerticals(t),this.attachSegsByCol(this.groupSegsByCol(t),this.highlightContainerEls),this.highlightSegs=t},unrenderHighlightSegs:function(){this.unrenderNamedSegs("highlightSegs")},renderBusinessSegs:function(t){t=this.renderFillSegEls("businessHours",t),this.updateSegVerticals(t),this.attachSegsByCol(this.groupSegsByCol(t),this.businessContainerEls),this.businessSegs=t},unrenderBusinessSegs:function(){this.unrenderNamedSegs("businessSegs")},groupSegsByCol:function(t){var e,n=[];for(e=0;e<this.colCnt;e++)n.push([]);for(e=0;e<t.length;e++)n[t[e].col].push(t[e]);return n},attachSegsByCol:function(t,e){var n,i,r;for(n=0;n<this.colCnt;n++)for(i=t[n],r=0;r<i.length;r++)e.eq(n).append(i[r].el)},unrenderNamedSegs:function(t){var e,n=this[t];if(n){for(e=0;e<n.length;e++)n[e].el.remove();this[t]=null}},renderFgSegsIntoContainers:function(t,e){var n,i;for(t=this.renderFgSegEls(t),n=this.groupSegsByCol(t),i=0;i<this.colCnt;i++)this.updateFgSegCoords(n[i]);return this.attachSegsByCol(n,e),t},fgSegHtml:function(t,e){var n,i,r,s=this.view,o=t.event,l=s.isEventDraggable(o),a=!e&&t.isStart&&s.isEventResizableFromStart(o),u=!e&&t.isEnd&&s.isEventResizableFromEnd(o),c=this.getSegClasses(t,l,a||u),d=nt(this.getSegSkinCss(t));return c.unshift("fc-time-grid-event","fc-v-event"),s.isMultiDayEvent(o)?(t.isStart||t.isEnd)&&(n=this.getEventTimeText(t),i=this.getEventTimeText(t,"LT"),r=this.getEventTimeText(t,null,!1)):(n=this.getEventTimeText(o),i=this.getEventTimeText(o,"LT"),r=this.getEventTimeText(o,null,!1)),'<a class="'+c.join(" ")+'"'+(o.url?' href="'+tt(o.url)+'"':"")+(d?' style="'+d+'"':"")+'><div class="fc-content">'+(n?'<div class="fc-time" data-start="'+tt(r)+'" data-full="'+tt(i)+'"><span>'+tt(n)+"</span></div>":"")+(o.title?'<div class="fc-title">'+tt(o.title)+"</div>":"")+'</div><div class="fc-bg"/>'+(u?'<div class="fc-resizer fc-end-resizer" />':"")+"</a>"},updateSegVerticals:function(t){this.computeSegVerticals(t),this.assignSegVerticals(t)},computeSegVerticals:function(t){var e,n;for(e=0;e<t.length;e++)n=t[e],n.top=this.computeDateTop(n.start,n.start),n.bottom=this.computeDateTop(n.end,n.start)},assignSegVerticals:function(t){var e,n;for(e=0;e<t.length;e++)n=t[e],n.el.css(this.generateSegVerticalCss(n))},generateSegVerticalCss:function(t){return{top:t.top,bottom:-t.bottom}},updateFgSegCoords:function(t){this.computeSegVerticals(t),this.computeFgSegHorizontals(t),this.assignSegVerticals(t),this.assignFgSegHorizontals(t)},computeFgSegHorizontals:function(t){var e,n,i;if(this.sortEventSegs(t),e=Ft(t),Nt(e),n=e[0]){for(i=0;i<n.length;i++)Gt(n[i]);for(i=0;i<n.length;i++)this.computeFgSegForwardBack(n[i],0,0)}},computeFgSegForwardBack:function(t,e,n){var i,r=t.forwardSegs;if(void 0===t.forwardCoord)for(r.length?(this.sortForwardSegs(r),this.computeFgSegForwardBack(r[0],e+1,n),t.forwardCoord=r[0].backwardCoord):t.forwardCoord=1,t.backwardCoord=t.forwardCoord-(t.forwardCoord-n)/(e+1),i=0;i<r.length;i++)this.computeFgSegForwardBack(r[i],0,t.forwardCoord)},sortForwardSegs:function(t){t.sort(lt(this,"compareForwardSegs"))},compareForwardSegs:function(t,e){return e.forwardPressure-t.forwardPressure||(t.backwardCoord||0)-(e.backwardCoord||0)||this.compareEventSegs(t,e)},assignFgSegHorizontals:function(t){var e,n;for(e=0;e<t.length;e++)n=t[e],n.el.css(this.generateFgSegHorizontalCss(n)),n.bottom-n.top<30&&n.el.addClass("fc-short")},generateFgSegHorizontalCss:function(t){var e,n,i=this.view.opt("slotEventOverlap"),r=t.backwardCoord,s=t.forwardCoord,o=this.generateSegVerticalCss(t);return i&&(s=Math.min(1,r+2*(s-r))),this.isRTL?(e=1-s,n=r):(e=r,n=1-s),o.zIndex=t.level+1,o.left=100*e+"%",o.right=100*n+"%",i&&t.forwardPressure&&(o[this.isRTL?"marginLeft":"marginRight"]=20),o}});var Ee=qt.View=St.extend(ue,ce,{type:null,name:null,title:null,calendar:null,options:null,el:null,isDateSet:!1,isDateRendered:!1,dateRenderQueue:null,isEventsBound:!1,isEventsSet:!1,isEventsRendered:!1,eventRenderQueue:null,start:null,end:null,intervalStart:null,intervalEnd:null,intervalDuration:null,intervalUnit:null,isRTL:!1,isSelected:!1,selectedEvent:null,eventOrderSpecs:null,widgetHeaderClass:null,widgetContentClass:null,highlightStateClass:null,nextDayThreshold:null,isHiddenDayHash:null,isNowIndicatorRendered:null,initialNowDate:null,initialNowQueriedMs:null,nowIndicatorTimeoutID:null,nowIndicatorIntervalID:null,constructor:function(t,n,i,r){this.calendar=t,this.type=this.name=n,this.options=i,this.intervalDuration=r||e.duration(1,"day"),this.nextDayThreshold=e.duration(this.opt("nextDayThreshold")),this.initThemingProps(),this.initHiddenDays(),this.isRTL=this.opt("isRTL"),this.eventOrderSpecs=L(this.opt("eventOrder")),this.dateRenderQueue=new Dt,this.eventRenderQueue=new Dt(this.opt("eventRenderWait")),this.initialize()},initialize:function(){},opt:function(t){return this.options[t]},publiclyTrigger:function(t,e){var n=this.calendar;return n.publiclyTrigger.apply(n,[t,e||this].concat(Array.prototype.slice.call(arguments,2),[this]))},rejectOn:function(t,e){var n=this;return new bt(function(i,r){function s(){n.off(t,r)}n.one(t,r),e.then(function(t){s(),i(t)},function(){s(),r()})})},setRange:function(e){t.extend(this,e),this.updateTitle()},computeRange:function(t){var e,n,i=A(this.intervalDuration),r=t.clone().startOf(i),s=r.clone().add(this.intervalDuration);return/year|month|week|day/.test(i)?(r.stripTime(),s.stripTime()):(r.hasTime()||(r=this.calendar.time(0)),s.hasTime()||(s=this.calendar.time(0))),e=r.clone(),e=this.skipHiddenDays(e),n=s.clone(),n=this.skipHiddenDays(n,-1,!0),{intervalUnit:i,intervalStart:r,intervalEnd:s,start:e,end:n}},computePrevDate:function(t){return this.massageCurrentDate(t.clone().startOf(this.intervalUnit).subtract(this.intervalDuration),-1)},computeNextDate:function(t){return this.massageCurrentDate(t.clone().startOf(this.intervalUnit).add(this.intervalDuration))},massageCurrentDate:function(t,e){return this.intervalDuration.as("days")<=1&&this.isHiddenDay(t)&&(t=this.skipHiddenDays(t,e),t.startOf("day")),t},updateTitle:function(){this.title=this.computeTitle(),this.calendar.setToolbarsTitle(this.title)},computeTitle:function(){return this.formatRange({start:this.calendar.applyTimezone(this.intervalStart),end:this.calendar.applyTimezone(this.intervalEnd)},this.opt("titleFormat")||this.computeTitleFormat(),this.opt("titleRangeSeparator"))},computeTitleFormat:function(){return"year"==this.intervalUnit?"YYYY":"month"==this.intervalUnit?this.opt("monthYearFormat"):this.intervalDuration.as("days")>1?"ll":"LL"},formatRange:function(t,e,n){var i=t.end;return i.hasTime()||(i=i.clone().subtract(1)),gt(t.start,i,e,n,this.opt("isRTL"))},getAllDayHtml:function(){return this.opt("allDayHtml")||tt(this.opt("allDayText"))},buildGotoAnchorHtml:function(e,n,i){var r,s,o,l;return t.isPlainObject(e)?(r=e.date,s=e.type,o=e.forceOff):r=e,r=qt.moment(r),l={date:r.format("YYYY-MM-DD"),type:s||"day"},"string"==typeof n&&(i=n,n=null),n=n?" "+it(n):"",i=i||"",!o&&this.opt("navLinks")?"<a"+n+' data-goto="'+tt(JSON.stringify(l))+'">'+i+"</a>":"<span"+n+">"+i+"</span>"},setElement:function(t){this.el=t,this.bindGlobalHandlers(),this.renderSkeleton()},removeElement:function(){this.unsetDate(),this.unrenderSkeleton(),this.unbindGlobalHandlers(),this.el.remove()},renderSkeleton:function(){},unrenderSkeleton:function(){},setDate:function(t){var e=this.isDateSet;this.isDateSet=!0,this.handleDate(t,e),this.trigger(e?"dateReset":"dateSet",t)},unsetDate:function(){this.isDateSet&&(this.isDateSet=!1,this.handleDateUnset(),this.trigger("dateUnset"))},handleDate:function(t,e){var n=this;this.unbindEvents(),this.requestDateRender(t).then(function(){n.bindEvents()})},handleDateUnset:function(){this.unbindEvents(),this.requestDateUnrender()},requestDateRender:function(t){var e=this;return this.dateRenderQueue.add(function(){return e.executeDateRender(t)})},requestDateUnrender:function(){var t=this;return this.dateRenderQueue.add(function(){return t.executeDateUnrender()})},executeDateRender:function(t){var e=this;return t?this.captureInitialScroll():this.captureScroll(),this.freezeHeight(),this.executeDateUnrender().then(function(){t&&e.setRange(e.computeRange(t)),e.render&&e.render(),e.renderDates(),e.updateSize(),e.renderBusinessHours(),e.startNowIndicator(),e.thawHeight(),e.releaseScroll(),e.isDateRendered=!0,e.onDateRender(),e.trigger("dateRender")})},executeDateUnrender:function(){var t=this;return t.isDateRendered?this.requestEventsUnrender().then(function(){t.unselect(),t.stopNowIndicator(),t.triggerUnrender(),t.unrenderBusinessHours(),t.unrenderDates(),t.destroy&&t.destroy(),t.isDateRendered=!1,t.trigger("dateUnrender")}):bt.resolve()},onDateRender:function(){this.triggerRender()},renderDates:function(){},unrenderDates:function(){},triggerRender:function(){this.publiclyTrigger("viewRender",this,this,this.el);
-},triggerUnrender:function(){this.publiclyTrigger("viewDestroy",this,this,this.el)},bindGlobalHandlers:function(){this.listenTo(t(document),"mousedown",this.handleDocumentMousedown),this.listenTo(t(document),"touchstart",this.processUnselect)},unbindGlobalHandlers:function(){this.stopListeningTo(t(document))},initThemingProps:function(){var t=this.opt("theme")?"ui":"fc";this.widgetHeaderClass=t+"-widget-header",this.widgetContentClass=t+"-widget-content",this.highlightStateClass=t+"-state-highlight"},renderBusinessHours:function(){},unrenderBusinessHours:function(){},startNowIndicator:function(){var t,n,i,r=this;this.opt("nowIndicator")&&(t=this.getNowIndicatorUnit(),t&&(n=lt(this,"updateNowIndicator"),this.initialNowDate=this.calendar.getNow(),this.initialNowQueriedMs=+new Date,this.renderNowIndicator(this.initialNowDate),this.isNowIndicatorRendered=!0,i=this.initialNowDate.clone().startOf(t).add(1,t)-this.initialNowDate,this.nowIndicatorTimeoutID=setTimeout(function(){r.nowIndicatorTimeoutID=null,n(),i=+e.duration(1,t),i=Math.max(100,i),r.nowIndicatorIntervalID=setInterval(n,i)},i)))},updateNowIndicator:function(){this.isNowIndicatorRendered&&(this.unrenderNowIndicator(),this.renderNowIndicator(this.initialNowDate.clone().add(new Date-this.initialNowQueriedMs)))},stopNowIndicator:function(){this.isNowIndicatorRendered&&(this.nowIndicatorTimeoutID&&(clearTimeout(this.nowIndicatorTimeoutID),this.nowIndicatorTimeoutID=null),this.nowIndicatorIntervalID&&(clearTimeout(this.nowIndicatorIntervalID),this.nowIndicatorIntervalID=null),this.unrenderNowIndicator(),this.isNowIndicatorRendered=!1)},getNowIndicatorUnit:function(){},renderNowIndicator:function(t){},unrenderNowIndicator:function(){},updateSize:function(t){t&&this.captureScroll(),this.updateHeight(t),this.updateWidth(t),this.updateNowIndicator(),t&&this.releaseScroll()},updateWidth:function(t){},updateHeight:function(t){var e=this.calendar;this.setHeight(e.getSuggestedViewHeight(),e.isHeightAuto())},setHeight:function(t,e){},capturedScroll:null,capturedScrollDepth:0,captureScroll:function(){return!this.capturedScrollDepth++&&(this.capturedScroll=this.isDateRendered?this.queryScroll():{},!0)},captureInitialScroll:function(e){this.captureScroll()&&(this.capturedScroll.isInitial=!0,e?t.extend(this.capturedScroll,e):this.capturedScroll.isComputed=!0)},releaseScroll:function(){var e=this.capturedScroll,n=this.discardScroll();e.isComputed&&(n?t.extend(e,this.computeInitialScroll()):e=null),e&&(e.isInitial?this.hardSetScroll(e):this.setScroll(e))},discardScroll:function(){return!--this.capturedScrollDepth&&(this.capturedScroll=null,!0)},computeInitialScroll:function(){return{}},queryScroll:function(){return{}},hardSetScroll:function(t){var e=this,n=function(){e.setScroll(t)};n(),setTimeout(n,0)},setScroll:function(t){},freezeHeight:function(){this.calendar.freezeContentHeight()},thawHeight:function(){this.calendar.thawContentHeight()},bindEvents:function(){var t=this;this.isEventsBound||(this.isEventsBound=!0,this.rejectOn("eventsUnbind",this.requestEvents()).then(function(e){t.listenTo(t.calendar,"eventsReset",t.setEvents),t.setEvents(e)}))},unbindEvents:function(){this.isEventsBound&&(this.isEventsBound=!1,this.stopListeningTo(this.calendar,"eventsReset"),this.unsetEvents(),this.trigger("eventsUnbind"))},setEvents:function(t){var e=this.isEventSet;this.isEventsSet=!0,this.handleEvents(t,e),this.trigger(e?"eventsReset":"eventsSet",t)},unsetEvents:function(){this.isEventsSet&&(this.isEventsSet=!1,this.handleEventsUnset(),this.trigger("eventsUnset"))},whenEventsSet:function(){var t=this;return this.isEventsSet?bt.resolve(this.getCurrentEvents()):new bt(function(e){t.one("eventsSet",e)})},handleEvents:function(t,e){this.requestEventsRender(t)},handleEventsUnset:function(){this.requestEventsUnrender()},requestEventsRender:function(t){var e=this;return this.eventRenderQueue.add(function(){return e.executeEventsRender(t)})},requestEventsUnrender:function(){var t=this;return this.isEventsRendered?this.eventRenderQueue.addQuickly(function(){return t.executeEventsUnrender()}):bt.resolve()},requestCurrentEventsRender:function(){return this.isEventsSet?void this.requestEventsRender(this.getCurrentEvents()):bt.reject()},executeEventsRender:function(t){var e=this;return this.captureScroll(),this.freezeHeight(),this.executeEventsUnrender().then(function(){e.renderEvents(t),e.thawHeight(),e.releaseScroll(),e.isEventsRendered=!0,e.onEventsRender(),e.trigger("eventsRender")})},executeEventsUnrender:function(){return this.isEventsRendered&&(this.onBeforeEventsUnrender(),this.captureScroll(),this.freezeHeight(),this.destroyEvents&&this.destroyEvents(),this.unrenderEvents(),this.thawHeight(),this.releaseScroll(),this.isEventsRendered=!1,this.trigger("eventsUnrender")),bt.resolve()},onEventsRender:function(){this.renderedEventSegEach(function(t){this.publiclyTrigger("eventAfterRender",t.event,t.event,t.el)}),this.publiclyTrigger("eventAfterAllRender")},onBeforeEventsUnrender:function(){this.renderedEventSegEach(function(t){this.publiclyTrigger("eventDestroy",t.event,t.event,t.el)})},renderEvents:function(t){},unrenderEvents:function(){},requestEvents:function(){return this.calendar.requestEvents(this.start,this.end)},getCurrentEvents:function(){return this.calendar.getPrunedEventCache()},resolveEventEl:function(e,n){var i=this.publiclyTrigger("eventRender",e,e,n);return i===!1?n=null:i&&i!==!0&&(n=t(i)),n},showEvent:function(t){this.renderedEventSegEach(function(t){t.el.css("visibility","")},t)},hideEvent:function(t){this.renderedEventSegEach(function(t){t.el.css("visibility","hidden")},t)},renderedEventSegEach:function(t,e){var n,i=this.getEventSegs();for(n=0;n<i.length;n++)e&&i[n].event._id!==e._id||i[n].el&&t.call(this,i[n])},getEventSegs:function(){return[]},isEventDraggable:function(t){return this.isEventStartEditable(t)},isEventStartEditable:function(t){return J(t.startEditable,(t.source||{}).startEditable,this.opt("eventStartEditable"),this.isEventGenerallyEditable(t))},isEventGenerallyEditable:function(t){return J(t.editable,(t.source||{}).editable,this.opt("editable"))},reportEventDrop:function(t,e,n,i,r){var s=this.calendar,o=s.mutateEvent(t,e,n),l=function(){o.undo(),s.reportEventChange()};this.triggerEventDrop(t,o.dateDelta,l,i,r),s.reportEventChange()},triggerEventDrop:function(t,e,n,i,r){this.publiclyTrigger("eventDrop",i[0],t,e,n,r,{})},reportExternalDrop:function(e,n,i,r,s){var o,l,a=e.eventProps;a&&(o=t.extend({},a,n),l=this.calendar.renderEvent(o,e.stick)[0]),this.triggerExternalDrop(l,n,i,r,s)},triggerExternalDrop:function(t,e,n,i,r){this.publiclyTrigger("drop",n[0],e.start,i,r),t&&this.publiclyTrigger("eventReceive",null,t)},renderDrag:function(t,e){},unrenderDrag:function(){},isEventResizableFromStart:function(t){return this.opt("eventResizableFromStart")&&this.isEventResizable(t)},isEventResizableFromEnd:function(t){return this.isEventResizable(t)},isEventResizable:function(t){var e=t.source||{};return J(t.durationEditable,e.durationEditable,this.opt("eventDurationEditable"),t.editable,e.editable,this.opt("editable"))},reportEventResize:function(t,e,n,i,r){var s=this.calendar,o=s.mutateEvent(t,e,n),l=function(){o.undo(),s.reportEventChange()};this.triggerEventResize(t,o.durationDelta,l,i,r),s.reportEventChange()},triggerEventResize:function(t,e,n,i,r){this.publiclyTrigger("eventResize",i[0],t,e,n,r,{})},select:function(t,e){this.unselect(e),this.renderSelection(t),this.reportSelection(t,e)},renderSelection:function(t){},reportSelection:function(t,e){this.isSelected=!0,this.triggerSelect(t,e)},triggerSelect:function(t,e){this.publiclyTrigger("select",null,this.calendar.applyTimezone(t.start),this.calendar.applyTimezone(t.end),e)},unselect:function(t){this.isSelected&&(this.isSelected=!1,this.destroySelection&&this.destroySelection(),this.unrenderSelection(),this.publiclyTrigger("unselect",null,t))},unrenderSelection:function(){},selectEvent:function(t){this.selectedEvent&&this.selectedEvent===t||(this.unselectEvent(),this.renderedEventSegEach(function(t){t.el.addClass("fc-selected")},t),this.selectedEvent=t)},unselectEvent:function(){this.selectedEvent&&(this.renderedEventSegEach(function(t){t.el.removeClass("fc-selected")},this.selectedEvent),this.selectedEvent=null)},isEventSelected:function(t){return this.selectedEvent&&this.selectedEvent._id===t._id},handleDocumentMousedown:function(t){S(t)&&this.processUnselect(t)},processUnselect:function(t){this.processRangeUnselect(t),this.processEventUnselect(t)},processRangeUnselect:function(e){var n;this.isSelected&&this.opt("unselectAuto")&&(n=this.opt("unselectCancel"),n&&t(e.target).closest(n).length||this.unselect(e))},processEventUnselect:function(e){this.selectedEvent&&(t(e.target).closest(".fc-selected").length||this.unselectEvent())},triggerDayClick:function(t,e,n){this.publiclyTrigger("dayClick",e,this.calendar.applyTimezone(t.start),n)},initHiddenDays:function(){var e,n=this.opt("hiddenDays")||[],i=[],r=0;for(this.opt("weekends")===!1&&n.push(0,6),e=0;e<7;e++)(i[e]=t.inArray(e,n)!==-1)||r++;if(!r)throw"invalid hiddenDays";this.isHiddenDayHash=i},isHiddenDay:function(t){return e.isMoment(t)&&(t=t.day()),this.isHiddenDayHash[t]},skipHiddenDays:function(t,e,n){var i=t.clone();for(e=e||1;this.isHiddenDayHash[(i.day()+(n?e:0)+7)%7];)i.add(e,"days");return i},computeDayRange:function(t){var e,n=t.start.clone().stripTime(),i=t.end,r=null;return i&&(r=i.clone().stripTime(),e=+i.time(),e&&e>=this.nextDayThreshold&&r.add(1,"days")),(!i||r<=n)&&(r=n.clone().add(1,"days")),{start:n,end:r}},isMultiDayEvent:function(t){var e=this.computeDayRange(t);return e.end.diff(e.start,"days")>1}}),be=qt.Scroller=St.extend({el:null,scrollEl:null,overflowX:null,overflowY:null,constructor:function(t){t=t||{},this.overflowX=t.overflowX||t.overflow||"auto",this.overflowY=t.overflowY||t.overflow||"auto"},render:function(){this.el=this.renderEl(),this.applyOverflow()},renderEl:function(){return this.scrollEl=t('<div class="fc-scroller"></div>')},clear:function(){this.setHeight("auto"),this.applyOverflow()},destroy:function(){this.el.remove()},applyOverflow:function(){this.scrollEl.css({"overflow-x":this.overflowX,"overflow-y":this.overflowY})},lockOverflow:function(t){var e=this.overflowX,n=this.overflowY;t=t||this.getScrollbarWidths(),"auto"===e&&(e=t.top||t.bottom||this.scrollEl[0].scrollWidth-1>this.scrollEl[0].clientWidth?"scroll":"hidden"),"auto"===n&&(n=t.left||t.right||this.scrollEl[0].scrollHeight-1>this.scrollEl[0].clientHeight?"scroll":"hidden"),this.scrollEl.css({"overflow-x":e,"overflow-y":n})},setHeight:function(t){this.scrollEl.height(t)},getScrollTop:function(){return this.scrollEl.scrollTop()},setScrollTop:function(t){this.scrollEl.scrollTop(t)},getClientWidth:function(){return this.scrollEl[0].clientWidth},getClientHeight:function(){return this.scrollEl[0].clientHeight},getScrollbarWidths:function(){return p(this.scrollEl)}});Vt.prototype.proxyCall=function(t){var e=Array.prototype.slice.call(arguments,1),n=[];return this.items.forEach(function(i){n.push(i[t].apply(i,e))}),n};var De=qt.Calendar=St.extend({dirDefaults:null,localeDefaults:null,overrides:null,dynamicOverrides:null,options:null,viewSpecCache:null,view:null,header:null,footer:null,loadingLevel:0,constructor:_t,initialize:function(){},populateOptionsHash:function(){var t,e,i,r;t=J(this.dynamicOverrides.locale,this.overrides.locale),e=Te[t],e||(t=De.defaults.locale,e=Te[t]||{}),i=J(this.dynamicOverrides.isRTL,this.overrides.isRTL,e.isRTL,De.defaults.isRTL),r=i?De.rtlDefaults:{},this.dirDefaults=r,this.localeDefaults=e,this.options=n([De.defaults,r,e,this.overrides,this.dynamicOverrides]),Yt(this.options)},getViewSpec:function(t){var e=this.viewSpecCache;return e[t]||(e[t]=this.buildViewSpec(t))},getUnitViewSpec:function(e){var n,i,r;if(t.inArray(e,Kt)!=-1)for(n=this.header.getViewsWithButtons(),t.each(qt.views,function(t){n.push(t)}),i=0;i<n.length;i++)if(r=this.getViewSpec(n[i]),r&&r.singleUnit==e)return r},buildViewSpec:function(t){for(var i,r,s,o,l=this.overrides.views||{},a=[],u=[],c=[],d=t;d;)i=Zt[d],r=l[d],d=null,"function"==typeof i&&(i={class:i}),i&&(a.unshift(i),u.unshift(i.defaults||{}),s=s||i.duration,d=d||i.type),r&&(c.unshift(r),s=s||r.duration,d=d||r.type);return i=q(a),i.type=t,!!i.class&&(s&&(s=e.duration(s),s.valueOf()&&(i.duration=s,o=A(s),1===s.as(o)&&(i.singleUnit=o,c.unshift(l[o]||{})))),i.defaults=n(u),i.overrides=n(c),this.buildViewSpecOptions(i),this.buildViewSpecButtonText(i,t),i)},buildViewSpecOptions:function(t){t.options=n([De.defaults,t.defaults,this.dirDefaults,this.localeDefaults,this.overrides,t.overrides,this.dynamicOverrides]),Yt(t.options)},buildViewSpecButtonText:function(t,e){function n(n){var i=n.buttonText||{};return i[e]||(t.buttonTextKey?i[t.buttonTextKey]:null)||(t.singleUnit?i[t.singleUnit]:null)}t.buttonTextOverride=n(this.dynamicOverrides)||n(this.overrides)||t.overrides.buttonText,t.buttonTextDefault=n(this.localeDefaults)||n(this.dirDefaults)||t.defaults.buttonText||n(De.defaults)||(t.duration?this.humanizeDuration(t.duration):null)||e},instantiateView:function(t){var e=this.getViewSpec(t);return new e.class(this,t,e.options,e.duration)},isValidViewType:function(t){return Boolean(this.getViewSpec(t))},pushLoading:function(){this.loadingLevel++||this.publiclyTrigger("loading",null,!0,this.view)},popLoading:function(){--this.loadingLevel||this.publiclyTrigger("loading",null,!1,this.view)},buildSelectSpan:function(t,e){var n,i=this.moment(t).stripZone();return n=e?this.moment(e).stripZone():i.hasTime()?i.clone().add(this.defaultTimedEventDuration):i.clone().add(this.defaultAllDayEventDuration),{start:i,end:n}}});De.mixin(ue),De.mixin({optionHandlers:null,bindOption:function(t,e){this.bindOptions([t],e)},bindOptions:function(t,e){var n,i={func:e,names:t};for(n=0;n<t.length;n++)this.registerOptionHandlerObj(t[n],i);this.triggerOptionHandlerObj(i)},registerOptionHandlerObj:function(t,e){(this.optionHandlers[t]||(this.optionHandlers[t]=[])).push(e)},triggerOptionHandlers:function(t){var e,n=this.optionHandlers[t]||[];for(e=0;e<n.length;e++)this.triggerOptionHandlerObj(n[e])},triggerOptionHandlerObj:function(t){var e,n=t.names,i=[];for(e=0;e<n.length;e++)i.push(this.options[n[e]]);t.func.apply(this,i)}}),De.defaults={titleRangeSeparator:" – ",monthYearFormat:"MMMM YYYY",defaultTimedEventDuration:"02:00:00",defaultAllDayEventDuration:{days:1},forceEventDuration:!1,nextDayThreshold:"09:00:00",defaultView:"month",aspectRatio:1.35,header:{left:"title",center:"",right:"today prev,next"},weekends:!0,weekNumbers:!1,weekNumberTitle:"W",weekNumberCalculation:"local",scrollTime:"06:00:00",lazyFetching:!0,startParam:"start",endParam:"end",timezoneParam:"timezone",timezone:!1,isRTL:!1,buttonText:{prev:"prev",next:"next",prevYear:"prev year",nextYear:"next year",year:"year",today:"today",month:"month",week:"week",day:"day"},buttonIcons:{prev:"left-single-arrow",next:"right-single-arrow",prevYear:"left-double-arrow",nextYear:"right-double-arrow"},allDayText:"all-day",theme:!1,themeButtonIcons:{prev:"circle-triangle-w",next:"circle-triangle-e",prevYear:"seek-prev",nextYear:"seek-next"},dragOpacity:.75,dragRevertDuration:500,dragScroll:!0,unselectAuto:!0,dropAccept:"*",eventOrder:"title",eventLimit:!1,eventLimitText:"more",eventLimitClick:"popover",dayPopoverFormat:"LL",handleWindowResize:!0,windowResizeDelay:100,longPressDelay:1e3},De.englishDefaults={dayPopoverFormat:"dddd, MMMM D"},De.rtlDefaults={header:{left:"next,prev today",center:"",right:"title"},buttonIcons:{prev:"right-single-arrow",next:"left-single-arrow",prevYear:"right-double-arrow",nextYear:"left-double-arrow"},themeButtonIcons:{prev:"circle-triangle-e",next:"circle-triangle-w",nextYear:"seek-prev",prevYear:"seek-next"}};var Te=qt.locales={};qt.datepickerLocale=function(e,n,i){var r=Te[e]||(Te[e]={});r.isRTL=i.isRTL,r.weekNumberTitle=i.weekHeader,t.each(Ce,function(t,e){r[t]=e(i)}),t.datepicker&&(t.datepicker.regional[n]=t.datepicker.regional[e]=i,t.datepicker.regional.en=t.datepicker.regional[""],t.datepicker.setDefaults(i))},qt.locale=function(e,i){var r,s;r=Te[e]||(Te[e]={}),i&&(r=Te[e]=n([r,i])),s=Wt(e),t.each(He,function(t,e){null==r[t]&&(r[t]=e(s,r))}),De.defaults.locale=e};var Ce={buttonText:function(t){return{prev:et(t.prevText),next:et(t.nextText),today:et(t.currentText)}},monthYearFormat:function(t){return t.showMonthAfterYear?"YYYY["+t.yearSuffix+"] MMMM":"MMMM YYYY["+t.yearSuffix+"]"}},He={dayOfMonthFormat:function(t,e){var n=t.longDateFormat("l");return n=n.replace(/^Y+[^\w\s]*|[^\w\s]*Y+$/g,""),e.isRTL?n+=" ddd":n="ddd "+n,n},mediumTimeFormat:function(t){return t.longDateFormat("LT").replace(/\s*a$/i,"a")},smallTimeFormat:function(t){return t.longDateFormat("LT").replace(":mm","(:mm)").replace(/(\Wmm)$/,"($1)").replace(/\s*a$/i,"a")},extraSmallTimeFormat:function(t){return t.longDateFormat("LT").replace(":mm","(:mm)").replace(/(\Wmm)$/,"($1)").replace(/\s*a$/i,"t")},hourFormat:function(t){return t.longDateFormat("LT").replace(":mm","").replace(/(\Wmm)$/,"").replace(/\s*a$/i,"a")},noMeridiemTimeFormat:function(t){return t.longDateFormat("LT").replace(/\s*a$/i,"")}},Re={smallDayDateFormat:function(t){return t.isRTL?"D dd":"dd D"},weekFormat:function(t){return t.isRTL?"w[ "+t.weekNumberTitle+"]":"["+t.weekNumberTitle+" ]w"},smallWeekFormat:function(t){return t.isRTL?"w["+t.weekNumberTitle+"]":"["+t.weekNumberTitle+"]w"}};qt.locale("en",De.englishDefaults),qt.sourceNormalizers=[],qt.sourceFetchers=[];var xe={dataType:"json",cache:!1},Ie=1;De.prototype.normalizeEvent=function(t){},De.prototype.spanContainsSpan=function(t,e){var n=t.start.clone().stripZone(),i=this.getEventEnd(t).stripZone();return e.start>=n&&e.end<=i},De.prototype.getPeerEvents=function(t,e){var n,i,r=this.getEventCache(),s=[];for(n=0;n<r.length;n++)i=r[n],e&&e._id===i._id||s.push(i);return s},De.prototype.isEventSpanAllowed=function(t,e){var n=e.source||{},i=J(e.constraint,n.constraint,this.options.eventConstraint),r=J(e.overlap,n.overlap,this.options.eventOverlap);return this.isSpanAllowed(t,i,r,e)&&(!this.options.eventAllow||this.options.eventAllow(t,e)!==!1)},De.prototype.isExternalSpanAllowed=function(e,n,i){var r,s;return i&&(r=t.extend({},i,n),s=this.expandEvent(this.buildEventFromInput(r))[0]),s?this.isEventSpanAllowed(e,s):this.isSelectionSpanAllowed(e)},De.prototype.isSelectionSpanAllowed=function(t){return this.isSpanAllowed(t,this.options.selectConstraint,this.options.selectOverlap)&&(!this.options.selectAllow||this.options.selectAllow(t)!==!1)},De.prototype.isSpanAllowed=function(t,e,n,i){var r,s,o,l,a,u;if(null!=e&&(r=this.constraintToEvents(e))){for(s=!1,l=0;l<r.length;l++)if(this.spanContainsSpan(r[l],t)){s=!0;break}if(!s)return!1}for(o=this.getPeerEvents(t,i),l=0;l<o.length;l++)if(a=o[l],this.eventIntersectsRange(a,t)){if(n===!1)return!1;if("function"==typeof n&&!n(a,i))return!1;if(i){if(u=J(a.overlap,(a.source||{}).overlap),u===!1)return!1;if("function"==typeof u&&!u(i,a))return!1}}return!0},De.prototype.constraintToEvents=function(t){return"businessHours"===t?this.getCurrentBusinessHourEvents():"object"==typeof t?null!=t.start?this.expandEvent(this.buildEventFromInput(t)):null:this.clientEvents(t)},De.prototype.eventIntersectsRange=function(t,e){var n=t.start.clone().stripZone(),i=this.getEventEnd(t).stripZone();return e.start<i&&e.end>n};var ke={id:"_fcBusinessHours",start:"09:00",end:"17:00",dow:[1,2,3,4,5],rendering:"inverse-background"};De.prototype.getCurrentBusinessHourEvents=function(t){return this.computeBusinessHourEvents(t,this.options.businessHours)},De.prototype.computeBusinessHourEvents=function(e,n){return n===!0?this.expandBusinessHourEvents(e,[{}]):t.isPlainObject(n)?this.expandBusinessHourEvents(e,[n]):t.isArray(n)?this.expandBusinessHourEvents(e,n,!0):[]},De.prototype.expandBusinessHourEvents=function(e,n,i){var r,s,o=this.getView(),l=[];for(r=0;r<n.length;r++)s=n[r],i&&!s.dow||(s=t.extend({},ke,s),e&&(s.start=null,s.end=null),l.push.apply(l,this.expandEvent(this.buildEventFromInput(s),o.start,o.end)));return l};var Le=qt.BasicView=Ee.extend({scroller:null,dayGridClass:Se,dayGrid:null,dayNumbersVisible:!1,colWeekNumbersVisible:!1,cellWeekNumbersVisible:!1,weekNumberWidth:null,headContainerEl:null,headRowEl:null,initialize:function(){this.dayGrid=this.instantiateDayGrid(),this.scroller=new be({overflowX:"hidden",overflowY:"auto"})},instantiateDayGrid:function(){var t=this.dayGridClass.extend(Me);return new t(this)},setRange:function(t){Ee.prototype.setRange.call(this,t),this.dayGrid.breakOnWeeks=/year|month|week/.test(this.intervalUnit),this.dayGrid.setRange(t)},computeRange:function(t){var e=Ee.prototype.computeRange.call(this,t);return/year|month/.test(e.intervalUnit)&&(e.start.startOf("week"),e.start=this.skipHiddenDays(e.start),e.end.weekday()&&(e.end.add(1,"week").startOf("week"),e.end=this.skipHiddenDays(e.end,-1,!0))),e},renderDates:function(){this.dayNumbersVisible=this.dayGrid.rowCnt>1,this.opt("weekNumbers")&&(this.opt("weekNumbersWithinDays")?(this.cellWeekNumbersVisible=!0,this.colWeekNumbersVisible=!1):(this.cellWeekNumbersVisible=!1,this.colWeekNumbersVisible=!0)),this.dayGrid.numbersVisible=this.dayNumbersVisible||this.cellWeekNumbersVisible||this.colWeekNumbersVisible,this.el.addClass("fc-basic-view").html(this.renderSkeletonHtml()),this.renderHead(),this.scroller.render();var e=this.scroller.el.addClass("fc-day-grid-container"),n=t('<div class="fc-day-grid" />').appendTo(e);this.el.find(".fc-body > tr > td").append(e),this.dayGrid.setElement(n),this.dayGrid.renderDates(this.hasRigidRows())},renderHead:function(){this.headContainerEl=this.el.find(".fc-head-container").html(this.dayGrid.renderHeadHtml()),this.headRowEl=this.headContainerEl.find(".fc-row")},unrenderDates:function(){this.dayGrid.unrenderDates(),this.dayGrid.removeElement(),this.scroller.destroy()},renderBusinessHours:function(){this.dayGrid.renderBusinessHours()},unrenderBusinessHours:function(){this.dayGrid.unrenderBusinessHours()},renderSkeletonHtml:function(){return'<table><thead class="fc-head"><tr><td class="fc-head-container '+this.widgetHeaderClass+'"></td></tr></thead><tbody class="fc-body"><tr><td class="'+this.widgetContentClass+'"></td></tr></tbody></table>'},weekNumberStyleAttr:function(){return null!==this.weekNumberWidth?'style="width:'+this.weekNumberWidth+'px"':""},hasRigidRows:function(){var t=this.opt("eventLimit");return t&&"number"!=typeof t},updateWidth:function(){this.colWeekNumbersVisible&&(this.weekNumberWidth=u(this.el.find(".fc-week-number")))},setHeight:function(t,e){var n,s,o=this.opt("eventLimit");this.scroller.clear(),r(this.headRowEl),this.dayGrid.removeSegPopover(),o&&"number"==typeof o&&this.dayGrid.limitRows(o),n=this.computeScrollerHeight(t),this.setGridHeight(n,e),o&&"number"!=typeof o&&this.dayGrid.limitRows(o),e||(this.scroller.setHeight(n),s=this.scroller.getScrollbarWidths(),(s.left||s.right)&&(i(this.headRowEl,s),n=this.computeScrollerHeight(t),this.scroller.setHeight(n)),this.scroller.lockOverflow(s))},computeScrollerHeight:function(t){return t-c(this.el,this.scroller.el)},setGridHeight:function(t,e){e?a(this.dayGrid.rowEls):l(this.dayGrid.rowEls,t,!0)},computeInitialScroll:function(){return{top:0}},queryScroll:function(){return{top:this.scroller.getScrollTop()}},setScroll:function(t){this.scroller.setScrollTop(t.top)},prepareHits:function(){this.dayGrid.prepareHits()},releaseHits:function(){this.dayGrid.releaseHits()},queryHit:function(t,e){return this.dayGrid.queryHit(t,e)},getHitSpan:function(t){return this.dayGrid.getHitSpan(t)},getHitEl:function(t){return this.dayGrid.getHitEl(t)},renderEvents:function(t){this.dayGrid.renderEvents(t),this.updateHeight()},getEventSegs:function(){return this.dayGrid.getEventSegs()},unrenderEvents:function(){this.dayGrid.unrenderEvents()},renderDrag:function(t,e){return this.dayGrid.renderDrag(t,e)},unrenderDrag:function(){this.dayGrid.unrenderDrag()},renderSelection:function(t){this.dayGrid.renderSelection(t)},unrenderSelection:function(){this.dayGrid.unrenderSelection()}}),Me={renderHeadIntroHtml:function(){var t=this.view;return t.colWeekNumbersVisible?'<th class="fc-week-number '+t.widgetHeaderClass+'" '+t.weekNumberStyleAttr()+"><span>"+tt(t.opt("weekNumberTitle"))+"</span></th>":""},renderNumberIntroHtml:function(t){var e=this.view,n=this.getCellDate(t,0);return e.colWeekNumbersVisible?'<td class="fc-week-number" '+e.weekNumberStyleAttr()+">"+e.buildGotoAnchorHtml({date:n,type:"week",forceOff:1===this.colCnt},n.format("w"))+"</td>":""},renderBgIntroHtml:function(){var t=this.view;return t.colWeekNumbersVisible?'<td class="fc-week-number '+t.widgetContentClass+'" '+t.weekNumberStyleAttr()+"></td>":""},renderIntroHtml:function(){var t=this.view;return t.colWeekNumbersVisible?'<td class="fc-week-number" '+t.weekNumberStyleAttr()+"></td>":""}},Be=qt.MonthView=Le.extend({computeRange:function(t){var e,n=Le.prototype.computeRange.call(this,t);return this.isFixedWeeks()&&(e=Math.ceil(n.end.diff(n.start,"weeks",!0)),n.end.add(6-e,"weeks")),n},setGridHeight:function(t,e){e&&(t*=this.rowCnt/6),l(this.dayGrid.rowEls,t,!e)},isFixedWeeks:function(){return this.opt("fixedWeekCount")}});Zt.basic={class:Le},Zt.basicDay={type:"basic",duration:{days:1}},Zt.basicWeek={type:"basic",duration:{weeks:1}},Zt.month={class:Be,duration:{months:1},defaults:{fixedWeekCount:!0}};var ze=qt.AgendaView=Ee.extend({scroller:null,timeGridClass:we,timeGrid:null,dayGridClass:Se,dayGrid:null,axisWidth:null,headContainerEl:null,noScrollRowEls:null,bottomRuleEl:null,initialize:function(){this.timeGrid=this.instantiateTimeGrid(),this.opt("allDaySlot")&&(this.dayGrid=this.instantiateDayGrid()),this.scroller=new be({overflowX:"hidden",overflowY:"auto"})},instantiateTimeGrid:function(){var t=this.timeGridClass.extend(Fe);return new t(this)},instantiateDayGrid:function(){var t=this.dayGridClass.extend(Ne);return new t(this)},setRange:function(t){Ee.prototype.setRange.call(this,t),this.timeGrid.setRange(t),this.dayGrid&&this.dayGrid.setRange(t)},renderDates:function(){this.el.addClass("fc-agenda-view").html(this.renderSkeletonHtml()),this.renderHead(),this.scroller.render();var e=this.scroller.el.addClass("fc-time-grid-container"),n=t('<div class="fc-time-grid" />').appendTo(e);this.el.find(".fc-body > tr > td").append(e),this.timeGrid.setElement(n),this.timeGrid.renderDates(),this.bottomRuleEl=t('<hr class="fc-divider '+this.widgetHeaderClass+'"/>').appendTo(this.timeGrid.el),this.dayGrid&&(this.dayGrid.setElement(this.el.find(".fc-day-grid")),this.dayGrid.renderDates(),this.dayGrid.bottomCoordPadding=this.dayGrid.el.next("hr").outerHeight()),this.noScrollRowEls=this.el.find(".fc-row:not(.fc-scroller *)")},renderHead:function(){this.headContainerEl=this.el.find(".fc-head-container").html(this.timeGrid.renderHeadHtml())},unrenderDates:function(){this.timeGrid.unrenderDates(),this.timeGrid.removeElement(),this.dayGrid&&(this.dayGrid.unrenderDates(),this.dayGrid.removeElement()),this.scroller.destroy()},renderSkeletonHtml:function(){return'<table><thead class="fc-head"><tr><td class="fc-head-container '+this.widgetHeaderClass+'"></td></tr></thead><tbody class="fc-body"><tr><td class="'+this.widgetContentClass+'">'+(this.dayGrid?'<div class="fc-day-grid"/><hr class="fc-divider '+this.widgetHeaderClass+'"/>':"")+"</td></tr></tbody></table>"},axisStyleAttr:function(){return null!==this.axisWidth?'style="width:'+this.axisWidth+'px"':""},renderBusinessHours:function(){this.timeGrid.renderBusinessHours(),this.dayGrid&&this.dayGrid.renderBusinessHours()},unrenderBusinessHours:function(){this.timeGrid.unrenderBusinessHours(),this.dayGrid&&this.dayGrid.unrenderBusinessHours()},getNowIndicatorUnit:function(){return this.timeGrid.getNowIndicatorUnit()},renderNowIndicator:function(t){this.timeGrid.renderNowIndicator(t)},unrenderNowIndicator:function(){this.timeGrid.unrenderNowIndicator()},updateSize:function(t){this.timeGrid.updateSize(t),Ee.prototype.updateSize.call(this,t)},updateWidth:function(){this.axisWidth=u(this.el.find(".fc-axis"))},setHeight:function(t,e){var n,s,o;this.bottomRuleEl.hide(),this.scroller.clear(),r(this.noScrollRowEls),this.dayGrid&&(this.dayGrid.removeSegPopover(),n=this.opt("eventLimit"),n&&"number"!=typeof n&&(n=Ge),n&&this.dayGrid.limitRows(n)),e||(s=this.computeScrollerHeight(t),this.scroller.setHeight(s),o=this.scroller.getScrollbarWidths(),(o.left||o.right)&&(i(this.noScrollRowEls,o),s=this.computeScrollerHeight(t),this.scroller.setHeight(s)),this.scroller.lockOverflow(o),this.timeGrid.getTotalSlatHeight()<s&&this.bottomRuleEl.show())},computeScrollerHeight:function(t){return t-c(this.el,this.scroller.el)},computeInitialScroll:function(){var t=e.duration(this.opt("scrollTime")),n=this.timeGrid.computeTimeTop(t);return n=Math.ceil(n),n&&n++,{top:n}},queryScroll:function(){return{top:this.scroller.getScrollTop()}},setScroll:function(t){this.scroller.setScrollTop(t.top)},prepareHits:function(){this.timeGrid.prepareHits(),this.dayGrid&&this.dayGrid.prepareHits()},releaseHits:function(){this.timeGrid.releaseHits(),this.dayGrid&&this.dayGrid.releaseHits()},queryHit:function(t,e){var n=this.timeGrid.queryHit(t,e);return!n&&this.dayGrid&&(n=this.dayGrid.queryHit(t,e)),n},getHitSpan:function(t){return t.component.getHitSpan(t)},getHitEl:function(t){return t.component.getHitEl(t)},renderEvents:function(t){var e,n,i=[],r=[],s=[];for(n=0;n<t.length;n++)t[n].allDay?i.push(t[n]):r.push(t[n]);e=this.timeGrid.renderEvents(r),this.dayGrid&&(s=this.dayGrid.renderEvents(i)),this.updateHeight()},getEventSegs:function(){return this.timeGrid.getEventSegs().concat(this.dayGrid?this.dayGrid.getEventSegs():[])},unrenderEvents:function(){this.timeGrid.unrenderEvents(),this.dayGrid&&this.dayGrid.unrenderEvents()},renderDrag:function(t,e){return t.start.hasTime()?this.timeGrid.renderDrag(t,e):this.dayGrid?this.dayGrid.renderDrag(t,e):void 0},unrenderDrag:function(){this.timeGrid.unrenderDrag(),this.dayGrid&&this.dayGrid.unrenderDrag()},renderSelection:function(t){t.start.hasTime()||t.end.hasTime()?this.timeGrid.renderSelection(t):this.dayGrid&&this.dayGrid.renderSelection(t)},unrenderSelection:function(){this.timeGrid.unrenderSelection(),this.dayGrid&&this.dayGrid.unrenderSelection()}}),Fe={renderHeadIntroHtml:function(){var t,e=this.view;return e.opt("weekNumbers")?(t=this.start.format(e.opt("smallWeekFormat")),'<th class="fc-axis fc-week-number '+e.widgetHeaderClass+'" '+e.axisStyleAttr()+">"+e.buildGotoAnchorHtml({date:this.start,type:"week",forceOff:this.colCnt>1},tt(t))+"</th>"):'<th class="fc-axis '+e.widgetHeaderClass+'" '+e.axisStyleAttr()+"></th>"},renderBgIntroHtml:function(){var t=this.view;return'<td class="fc-axis '+t.widgetContentClass+'" '+t.axisStyleAttr()+"></td>"},renderIntroHtml:function(){var t=this.view;return'<td class="fc-axis" '+t.axisStyleAttr()+"></td>"}},Ne={renderBgIntroHtml:function(){var t=this.view;return'<td class="fc-axis '+t.widgetContentClass+'" '+t.axisStyleAttr()+"><span>"+t.getAllDayHtml()+"</span></td>"},renderIntroHtml:function(){var t=this.view;return'<td class="fc-axis" '+t.axisStyleAttr()+"></td>"}},Ge=5,Oe=[{hours:1},{minutes:30},{minutes:15},{seconds:30},{seconds:15}];Zt.agenda={class:ze,defaults:{allDaySlot:!0,slotDuration:"00:30:00",minTime:"00:00:00",maxTime:"24:00:00",slotEventOverlap:!0}},Zt.agendaDay={type:"agenda",duration:{days:1}},Zt.agendaWeek={type:"agenda",duration:{weeks:1}};var Ae=Ee.extend({grid:null,scroller:null,initialize:function(){this.grid=new Ve(this),this.scroller=new be({overflowX:"hidden",overflowY:"auto"})},setRange:function(t){Ee.prototype.setRange.call(this,t),this.grid.setRange(t)},renderSkeleton:function(){this.el.addClass("fc-list-view "+this.widgetContentClass),this.scroller.render(),this.scroller.el.appendTo(this.el),this.grid.setElement(this.scroller.scrollEl)},unrenderSkeleton:function(){this.scroller.destroy()},setHeight:function(t,e){this.scroller.setHeight(this.computeScrollerHeight(t))},computeScrollerHeight:function(t){return t-c(this.el,this.scroller.el);
-},renderEvents:function(t){this.grid.renderEvents(t)},unrenderEvents:function(){this.grid.unrenderEvents()},isEventResizable:function(t){return!1},isEventDraggable:function(t){return!1}}),Ve=me.extend({segSelector:".fc-list-item",hasDayInteractions:!1,spanToSegs:function(t){for(var e,n=this.view,i=n.start.clone().time(0),r=0,s=[];i<n.end;)if(e=F(t,{start:i,end:i.clone().add(1,"day")}),e&&(e.dayIndex=r,s.push(e)),i.add(1,"day"),r++,e&&!e.isEnd&&t.end.hasTime()&&t.end<i.clone().add(this.view.nextDayThreshold)){e.end=t.end.clone(),e.isEnd=!0;break}return s},computeEventTimeFormat:function(){return this.view.opt("mediumTimeFormat")},handleSegClick:function(e,n){var i;me.prototype.handleSegClick.apply(this,arguments),t(n.target).closest("a[href]").length||(i=e.event.url,i&&!n.isDefaultPrevented()&&(window.location.href=i))},renderFgSegs:function(t){return t=this.renderFgSegEls(t),t.length?this.renderSegList(t):this.renderEmptyMessage(),t},renderEmptyMessage:function(){this.el.html('<div class="fc-list-empty-wrap2"><div class="fc-list-empty-wrap1"><div class="fc-list-empty">'+tt(this.view.opt("noEventsMessage"))+"</div></div></div>")},renderSegList:function(e){var n,i,r,s=this.groupSegsByDay(e),o=t('<table class="fc-list-table"><tbody/></table>'),l=o.find("tbody");for(n=0;n<s.length;n++)if(i=s[n])for(l.append(this.dayHeaderHtml(this.view.start.clone().add(n,"days"))),this.sortEventSegs(i),r=0;r<i.length;r++)l.append(i[r].el);this.el.empty().append(o)},groupSegsByDay:function(t){var e,n,i=[];for(e=0;e<t.length;e++)n=t[e],(i[n.dayIndex]||(i[n.dayIndex]=[])).push(n);return i},dayHeaderHtml:function(t){var e=this.view,n=e.opt("listDayFormat"),i=e.opt("listDayAltFormat");return'<tr class="fc-list-heading" data-date="'+t.format("YYYY-MM-DD")+'"><td class="'+e.widgetHeaderClass+'" colspan="3">'+(n?e.buildGotoAnchorHtml(t,{class:"fc-list-heading-main"},tt(t.format(n))):"")+(i?e.buildGotoAnchorHtml(t,{class:"fc-list-heading-alt"},tt(t.format(i))):"")+"</td></tr>"},fgSegHtml:function(t){var e,n=this.view,i=["fc-list-item"].concat(this.getSegCustomClasses(t)),r=this.getSegBackgroundColor(t),s=t.event,o=s.url;return e=s.allDay?n.getAllDayHtml():n.isMultiDayEvent(s)?t.isStart||t.isEnd?tt(this.getEventTimeText(t)):n.getAllDayHtml():tt(this.getEventTimeText(s)),o&&i.push("fc-has-url"),'<tr class="'+i.join(" ")+'">'+(this.displayEventTime?'<td class="fc-list-item-time '+n.widgetContentClass+'">'+(e||"")+"</td>":"")+'<td class="fc-list-item-marker '+n.widgetContentClass+'"><span class="fc-event-dot"'+(r?' style="background-color:'+r+'"':"")+'></span></td><td class="fc-list-item-title '+n.widgetContentClass+'"><a'+(o?' href="'+tt(o)+'"':"")+">"+tt(t.event.title||"")+"</a></td></tr>"}});return Zt.list={class:Ae,buttonTextKey:"list",defaults:{buttonText:"list",listDayFormat:"LL",noEventsMessage:"No events to display"}},Zt.listDay={type:"list",duration:{days:1},defaults:{listDayFormat:"dddd"}},Zt.listWeek={type:"list",duration:{weeks:1},defaults:{listDayFormat:"dddd",listDayAltFormat:"LL"}},Zt.listMonth={type:"list",duration:{month:1},defaults:{listDayAltFormat:"dddd"}},Zt.listYear={type:"list",duration:{year:1},defaults:{listDayAltFormat:"dddd"}},qt}); \ No newline at end of file
+!function(t){"function"==typeof define&&define.amd?define(["jquery","moment"],t):"object"==typeof exports?module.exports=t(require("jquery"),require("moment")):t(jQuery,moment)}(function(t,e){function n(t){return q(t,Vt)}function i(t,e){e.left&&t.css({"border-left-width":1,"margin-left":e.left-1}),e.right&&t.css({"border-right-width":1,"margin-right":e.right-1})}function r(t){t.css({"margin-left":"","margin-right":"","border-left-width":"","border-right-width":""})}function s(){t("body").addClass("fc-not-allowed")}function o(){t("body").removeClass("fc-not-allowed")}function l(e,n,i){var r=Math.floor(n/e.length),s=Math.floor(n-r*(e.length-1)),o=[],l=[],u=[],c=0;a(e),e.each(function(n,i){var a=n===e.length-1?s:r,d=t(i).outerHeight(!0);d<a?(o.push(i),l.push(d),u.push(t(i).height())):c+=d}),i&&(n-=c,r=Math.floor(n/o.length),s=Math.floor(n-r*(o.length-1))),t(o).each(function(e,n){var i=e===o.length-1?s:r,a=l[e],c=u[e],d=i-(a-c);a<i&&t(n).height(d)})}function a(t){t.height("")}function u(e){var n=0;return e.find("> *").each(function(e,i){var r=t(i).outerWidth();r>n&&(n=r)}),n++,e.width(n),n}function c(t,e){var n,i=t.add(e);return i.css({position:"relative",left:-1}),n=t.outerHeight()-e.outerHeight(),i.css({position:"",left:""}),n}function d(e){var n=e.css("position"),i=e.parents().filter(function(){var e=t(this);return/(auto|scroll)/.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==n&&i.length?i:t(e[0].ownerDocument||document)}function h(t,e){var n=t.offset(),i=n.left-(e?e.left:0),r=n.top-(e?e.top:0);return{left:i,right:i+t.outerWidth(),top:r,bottom:r+t.outerHeight()}}function f(t,e){var n=t.offset(),i=p(t),r=n.left+S(t,"border-left-width")+i.left-(e?e.left:0),s=n.top+S(t,"border-top-width")+i.top-(e?e.top:0);return{left:r,right:r+t[0].clientWidth,top:s,bottom:s+t[0].clientHeight}}function g(t,e){var n=t.offset(),i=n.left+S(t,"border-left-width")+S(t,"padding-left")-(e?e.left:0),r=n.top+S(t,"border-top-width")+S(t,"padding-top")-(e?e.top:0);return{left:i,right:i+t.width(),top:r,bottom:r+t.height()}}function p(t){var e,n=t.innerWidth()-t[0].clientWidth,i=t.innerHeight()-t[0].clientHeight;return n=v(n),i=v(i),e={left:0,right:0,top:0,bottom:i},m()&&"rtl"==t.css("direction")?e.left=n:e.right=n,e}function v(t){return t=Math.max(0,t),t=Math.round(t)}function m(){return null===Pt&&(Pt=y()),Pt}function y(){var e=t("<div><div/></div>").css({position:"absolute",top:-1e3,left:0,border:0,padding:0,overflow:"scroll",direction:"rtl"}).appendTo("body"),n=e.children(),i=n.offset().left>e.offset().left;return e.remove(),i}function S(t,e){return parseFloat(t.css(e))||0}function w(t){return 1==t.which&&!t.ctrlKey}function E(t){var e=t.originalEvent.touches;return e&&e.length?e[0].pageX:t.pageX}function b(t){var e=t.originalEvent.touches;return e&&e.length?e[0].pageY:t.pageY}function D(t){return/^touch/.test(t.type)}function T(t){t.addClass("fc-unselectable").on("selectstart",H)}function C(t){t.removeClass("fc-unselectable").off("selectstart",H)}function H(t){t.preventDefault()}function x(t,e){var n={left:Math.max(t.left,e.left),right:Math.min(t.right,e.right),top:Math.max(t.top,e.top),bottom:Math.min(t.bottom,e.bottom)};return n.left<n.right&&n.top<n.bottom&&n}function R(t,e){return{left:Math.min(Math.max(t.left,e.left),e.right),top:Math.min(Math.max(t.top,e.top),e.bottom)}}function I(t){return{left:(t.left+t.right)/2,top:(t.top+t.bottom)/2}}function k(t,e){return{left:t.left-e.left,top:t.top-e.top}}function L(e){var n,i,r=[],s=[];for("string"==typeof e?s=e.split(/\s*,\s*/):"function"==typeof e?s=[e]:t.isArray(e)&&(s=e),n=0;n<s.length;n++)i=s[n],"string"==typeof i?r.push("-"==i.charAt(0)?{field:i.substring(1),order:-1}:{field:i,order:1}):"function"==typeof i&&r.push({func:i});return r}function M(t,e,n){var i,r;for(i=0;i<n.length;i++)if(r=B(t,e,n[i]))return r;return 0}function B(t,e,n){return n.func?n.func(t,e):N(t[n.field],e[n.field])*(n.order||1)}function N(e,n){return e||n?null==n?-1:null==e?1:"string"===t.type(e)||"string"===t.type(n)?String(e).localeCompare(String(n)):e-n:0}function F(t,e){var n,i,r,s,o=t.start,l=t.end,a=e.start,u=e.end;if(l>a&&o<u)return o>=a?(n=o.clone(),r=!0):(n=a.clone(),r=!1),l<=u?(i=l.clone(),s=!0):(i=u.clone(),s=!1),{start:n,end:i,isStart:r,isEnd:s}}function z(t,n){return e.duration({days:t.clone().stripTime().diff(n.clone().stripTime(),"days"),ms:t.time()-n.time()})}function G(t,n){return e.duration({days:t.clone().stripTime().diff(n.clone().stripTime(),"days")})}function O(t,n,i){return e.duration(Math.round(t.diff(n,i,!0)),i)}function A(t,e){var n,i,r;for(n=0;n<Yt.length&&(i=Yt[n],r=V(i,t,e),!(r>=1&&ot(r)));n++);return i}function V(t,n,i){return null!=i?i.diff(n,t,!0):e.isDuration(n)?n.as(t):n.end.diff(n.start,t,!0)}function P(t,e,n){var i;return W(n)?(e-t)/n:(i=n.asMonths(),Math.abs(i)>=1&&ot(i)?e.diff(t,"months",!0)/i:e.diff(t,"days",!0)/n.asDays())}function _(t,e){var n,i;return W(t)||W(e)?t/e:(n=t.asMonths(),i=e.asMonths(),Math.abs(n)>=1&&ot(n)&&Math.abs(i)>=1&&ot(i)?n/i:t.asDays()/e.asDays())}function Y(t,n){var i;return W(t)?e.duration(t*n):(i=t.asMonths(),Math.abs(i)>=1&&ot(i)?e.duration({months:i*n}):e.duration({days:t.asDays()*n}))}function W(t){return Boolean(t.hours()||t.minutes()||t.seconds()||t.milliseconds())}function U(t){return"[object Date]"===Object.prototype.toString.call(t)||t instanceof Date}function j(t){return/^\d+\:\d+(?:\:\d+\.?(?:\d{3})?)?$/.test(t)}function q(t,e){var n,i,r,s,o,l,a={};if(e)for(n=0;n<e.length;n++){for(i=e[n],r=[],s=t.length-1;s>=0;s--)if(o=t[s][i],"object"==typeof o)r.unshift(o);else if(void 0!==o){a[i]=o;break}r.length&&(a[i]=q(r))}for(n=t.length-1;n>=0;n--){l=t[n];for(i in l)i in a||(a[i]=l[i])}return a}function Z(t){var e=function(){};return e.prototype=t,new e}function $(t,e){for(var n in t)Q(t,n)&&(e[n]=t[n])}function Q(t,e){return Wt.call(t,e)}function X(e){return/undefined|null|boolean|number|string/.test(t.type(e))}function K(e,n,i){if(t.isFunction(e)&&(e=[e]),e){var r,s;for(r=0;r<e.length;r++)s=e[r].apply(n,i)||s;return s}}function J(){for(var t=0;t<arguments.length;t++)if(void 0!==arguments[t])return arguments[t]}function tt(t){return(t+"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/'/g,"&#039;").replace(/"/g,"&quot;").replace(/\n/g,"<br />")}function et(t){return t.replace(/&.*?;/g,"")}function nt(e){var n=[];return t.each(e,function(t,e){null!=e&&n.push(t+":"+e)}),n.join(";")}function it(e){var n=[];return t.each(e,function(t,e){null!=e&&n.push(t+'="'+tt(e)+'"')}),n.join(" ")}function rt(t){return t.charAt(0).toUpperCase()+t.slice(1)}function st(t,e){return t-e}function ot(t){return t%1===0}function lt(t,e){var n=t[e];return function(){return n.apply(t,arguments)}}function at(t,e,n){var i,r,s,o,l,a=function(){var u=+new Date-o;u<e?i=setTimeout(a,e-u):(i=null,n||(l=t.apply(s,r),s=r=null))};return function(){s=this,r=arguments,o=+new Date;var u=n&&!i;return i||(i=setTimeout(a,e)),u&&(l=t.apply(s,r),s=r=null),l}}function ut(n,i,r){var s,o,l,a,u=n[0],c=1==n.length&&"string"==typeof u;return e.isMoment(u)||U(u)||void 0===u?a=e.apply(null,n):(s=!1,o=!1,c?Ut.test(u)?(u+="-01",n=[u],s=!0,o=!0):(l=jt.exec(u))&&(s=!l[5],o=!0):t.isArray(u)&&(o=!0),a=i||s?e.utc.apply(e,n):e.apply(null,n),s?(a._ambigTime=!0,a._ambigZone=!0):r&&(o?a._ambigZone=!0:c&&a.utcOffset(u))),a._fullCalendar=!0,a}function ct(){}function dt(t,e){var n;return Q(e,"constructor")&&(n=e.constructor),"function"!=typeof n&&(n=e.constructor=function(){t.apply(this,arguments)}),n.prototype=Z(t.prototype),$(e,n.prototype),$(t,n),n}function ht(t,e){$(e,t.prototype)}function ft(e){var n=t.Deferred(),i=n.promise();if("function"==typeof e&&e(function(t){ft.immediate&&(i._value=t),n.resolve(t)},function(){n.reject()}),ft.immediate){var r=i.then;i.then=function(t,e){var n=i.state();if("resolved"===n){if("function"==typeof t)return ft.resolve(t(i._value))}else if("rejected"===n&&"function"==typeof e)return e(),i;return r.call(i,t,e)}}return i}function gt(t){function e(t){return new ft(function(e){var i=function(){ft.resolve(t()).then(e).then(function(){n.shift(),n.length&&n[0]()})};n.push(i),1===n.length&&i()})}var n=[];this.add="number"==typeof t?at(e,t):e,this.addQuickly=e}function pt(t,e){return!t&&!e||!(!t||!e)&&(t.component===e.component&&vt(t,e)&&vt(e,t))}function vt(t,e){for(var n in t)if(!/^(component|left|right|top|bottom)$/.test(n)&&t[n]!==e[n])return!1;return!0}function mt(t){return{start:t.start.clone(),end:t.end?t.end.clone():null,allDay:t.allDay}}function yt(t){var e=wt(t);return"background"===e||"inverse-background"===e}function St(t){return"inverse-background"===wt(t)}function wt(t){return J((t.source||{}).rendering,t.rendering)}function Et(t){var e,n,i={};for(e=0;e<t.length;e++)n=t[e],(i[n._id]||(i[n._id]=[])).push(n);return i}function bt(t,e){return t.start-e.start}function Dt(n){var i,r,s,o,l=Ot.dataAttrPrefix;return l&&(l+="-"),i=n.data(l+"event")||null,i&&(i="object"==typeof i?t.extend({},i):{},r=i.start,null==r&&(r=i.time),s=i.duration,o=i.stick,delete i.start,delete i.time,delete i.duration,delete i.stick),null==r&&(r=n.data(l+"start")),null==r&&(r=n.data(l+"time")),null==s&&(s=n.data(l+"duration")),null==o&&(o=n.data(l+"stick")),r=null!=r?e.duration(r):null,s=null!=s?e.duration(s):null,o=Boolean(o),{eventProps:i,startTime:r,duration:s,stick:o}}function Tt(t,e){var n,i;for(n=0;n<e.length;n++)if(i=e[n],i.leftCol<=t.rightCol&&i.rightCol>=t.leftCol)return!0;return!1}function Ct(t,e){return t.leftCol-e.leftCol}function Ht(t){var e,n,i,r=[];for(e=0;e<t.length;e++){for(n=t[e],i=0;i<r.length&&It(n,r[i]).length;i++);n.level=i,(r[i]||(r[i]=[])).push(n)}return r}function xt(t){var e,n,i,r,s;for(e=0;e<t.length;e++)for(n=t[e],i=0;i<n.length;i++)for(r=n[i],r.forwardSegs=[],s=e+1;s<t.length;s++)It(r,t[s],r.forwardSegs)}function Rt(t){var e,n,i=t.forwardSegs,r=0;if(void 0===t.forwardPressure){for(e=0;e<i.length;e++)n=i[e],Rt(n),r=Math.max(r,1+n.forwardPressure);t.forwardPressure=r}}function It(t,e,n){n=n||[];for(var i=0;i<e.length;i++)kt(t,e[i])&&n.push(e[i]);return n}function kt(t,e){return t.bottom>e.top&&t.top<e.bottom}function Lt(t){this.items=t||[]}function Mt(e,n){function i(t){n=t}function r(){var i=n.layout;p=e.options.theme?"ui":"fc",i?(g?g.empty():g=this.el=t("<div class='fc-toolbar "+n.extraClasses+"'/>"),g.append(o("left")).append(o("right")).append(o("center")).append('<div class="fc-clear"/>')):s()}function s(){g&&(g.remove(),g=f.el=null)}function o(i){var r=t('<div class="fc-'+i+'"/>'),s=n.layout[i];return s&&t.each(s.split(" "),function(n){var i,s=t(),o=!0;t.each(this.split(","),function(n,i){var r,l,a,u,c,d,h,f,g,m;"title"==i?(s=s.add(t("<h2>&nbsp;</h2>")),o=!1):((r=(e.options.customButtons||{})[i])?(a=function(t){r.click&&r.click.call(m[0],t)},u="",c=r.text):(l=e.getViewSpec(i))?(a=function(){e.changeView(i)},v.push(i),u=l.buttonTextOverride,c=l.buttonTextDefault):e[i]&&(a=function(){e[i]()},u=(e.overrides.buttonText||{})[i],c=e.options.buttonText[i]),a&&(d=r?r.themeIcon:e.options.themeButtonIcons[i],h=r?r.icon:e.options.buttonIcons[i],f=u?tt(u):d&&e.options.theme?"<span class='ui-icon ui-icon-"+d+"'></span>":h&&!e.options.theme?"<span class='fc-icon fc-icon-"+h+"'></span>":tt(c),g=["fc-"+i+"-button",p+"-button",p+"-state-default"],m=t('<button type="button" class="'+g.join(" ")+'">'+f+"</button>").click(function(t){m.hasClass(p+"-state-disabled")||(a(t),(m.hasClass(p+"-state-active")||m.hasClass(p+"-state-disabled"))&&m.removeClass(p+"-state-hover"))}).mousedown(function(){m.not("."+p+"-state-active").not("."+p+"-state-disabled").addClass(p+"-state-down")}).mouseup(function(){m.removeClass(p+"-state-down")}).hover(function(){m.not("."+p+"-state-active").not("."+p+"-state-disabled").addClass(p+"-state-hover")},function(){m.removeClass(p+"-state-hover").removeClass(p+"-state-down")}),s=s.add(m)))}),o&&s.first().addClass(p+"-corner-left").end().last().addClass(p+"-corner-right").end(),s.length>1?(i=t("<div/>"),o&&i.addClass("fc-button-group"),i.append(s),r.append(i)):r.append(s)}),r}function l(t){g&&g.find("h2").text(t)}function a(t){g&&g.find(".fc-"+t+"-button").addClass(p+"-state-active")}function u(t){g&&g.find(".fc-"+t+"-button").removeClass(p+"-state-active")}function c(t){g&&g.find(".fc-"+t+"-button").prop("disabled",!0).addClass(p+"-state-disabled")}function d(t){g&&g.find(".fc-"+t+"-button").prop("disabled",!1).removeClass(p+"-state-disabled")}function h(){return v}var f=this;f.setToolbarOptions=i,f.render=r,f.removeElement=s,f.updateTitle=l,f.activateButton=a,f.deactivateButton=u,f.disableButton=c,f.enableButton=d,f.getViewsWithButtons=h,f.el=null;var g,p,v=[]}function Bt(n,i){function r(t){t._locale=Y}function s(){q?a()&&(f(),u()):o()}function o(){n.addClass("fc"),n.on("click.fc","a[data-goto]",function(e){var n=t(this),i=n.data("goto"),r=_.moment(i.date),s=i.type,o=Q.opt("navLink"+rt(s)+"Click");"function"==typeof o?o(r,e):("string"==typeof o&&(s=o),B(r,s))}),_.bindOption("theme",function(t){$=t?"ui":"fc",n.toggleClass("ui-widget",t),n.toggleClass("fc-unthemed",!t)}),_.bindOptions(["isRTL","locale"],function(t){n.toggleClass("fc-ltr",!t),n.toggleClass("fc-rtl",t)}),q=t("<div class='fc-view-container'/>").prependTo(n);var e=y();W=new Lt(e),U=_.header=e[0],j=_.footer=e[1],E(),b(),u(_.options.defaultView),_.options.handleWindowResize&&(K=at(v,_.options.windowResizeDelay),t(window).resize(K))}function l(){Q&&Q.removeElement(),W.proxyCall("removeElement"),q.remove(),n.removeClass("fc fc-ltr fc-rtl fc-unthemed ui-widget"),n.off(".fc"),K&&t(window).unbind("resize",K),se.unneeded()}function a(){return n.is(":visible")}function u(e,n){nt++;var i=Q&&e&&Q.type!==e;i&&(F(),c()),!Q&&e&&(Q=_.view=et[e]||(et[e]=_.instantiateView(e)),Q.setElement(t("<div class='fc-view fc-"+e+"-view' />").appendTo(q)),W.proxyCall("activateButton",e)),Q&&(J=Q.massageCurrentDate(J),Q.isDateSet&&J>=Q.intervalStart&&J<Q.intervalEnd||a()&&(n&&Q.captureInitialScroll(n),Q.setDate(J,n),n&&Q.releaseScroll(),D())),i&&z(),nt--}function c(){W.proxyCall("deactivateButton",Q.type),Q.removeElement(),Q=_.view=null}function d(){nt++,F();var t=Q.type,e=Q.queryScroll();c(),f(),u(t,e),z(),nt--}function h(t){if(a())return t&&g(),nt++,Q.updateSize(!0),nt--,!0}function f(){a()&&g()}function g(){var t=_.options.contentHeight,e=_.options.height;X="number"==typeof t?t:"function"==typeof t?t():"number"==typeof e?e-p():"function"==typeof e?e()-p():"parent"===e?n.parent().height()-p():Math.round(q.width()/Math.max(_.options.aspectRatio,.5))}function p(){return W.items.reduce(function(t,e){var n=e.el?e.el.outerHeight(!0):0;return t+n},0)}function v(t){!nt&&t.target===window&&Q.start&&h(!0)&&Q.publiclyTrigger("windowResize",tt)}function m(){a()&&_.reportEventChange()}function y(){return[new Mt(_,S()),new Mt(_,w())]}function S(){return{extraClasses:"fc-header-toolbar",layout:_.options.header}}function w(){return{extraClasses:"fc-footer-toolbar",layout:_.options.footer}}function E(){U.setToolbarOptions(S()),U.render(),U.el&&n.prepend(U.el)}function b(){j.setToolbarOptions(w()),j.render(),j.el&&n.append(j.el)}function D(){var t=_.getNow();t>=Q.intervalStart&&t<Q.intervalEnd?W.proxyCall("disableButton","today"):W.proxyCall("enableButton","today")}function T(t,e){Q.select(_.buildSelectSpan.apply(_,arguments))}function C(){Q&&Q.unselect()}function H(){J=Q.computePrevDate(J),u()}function x(){J=Q.computeNextDate(J),u()}function R(){J.add(-1,"years"),u()}function I(){J.add(1,"years"),u()}function k(){J=_.getNow(),u()}function L(t){J=_.moment(t).stripZone(),u()}function M(t){J.add(e.duration(t)),u()}function B(t,e){var n;e=e||"day",n=_.getViewSpec(e)||_.getUnitViewSpec(e),J=t.clone(),u(n?n.type:null)}function N(){return _.applyTimezone(J)}function F(){it++||q.css({width:"100%",height:q.height(),overflow:"hidden"})}function z(){--it||q.css({width:"",height:"",overflow:""})}function G(){return _}function O(){return Q}function A(t,e){var n;if("string"==typeof t){if(void 0===e)return _.options[t];n={},n[t]=e,V(n)}else"object"==typeof t&&V(t)}function V(t){var e,n=0;for(e in t)_.dynamicOverrides[e]=t[e];_.viewSpecCache={},_.populateOptionsHash();for(e in t)_.triggerOptionHandlers(e),n++;if(1===n){if("height"===e||"contentHeight"===e||"aspectRatio"===e)return void h(!0);if("defaultDate"===e)return;if("businessHours"===e)return void(Q&&(Q.unrenderBusinessHours(),Q.renderBusinessHours()));if("timezone"===e)return _.rezoneArrayEventSources(),void _.refetchEvents()}E(),b(),et={},d()}function P(t,e){var n=Array.prototype.slice.call(arguments,2);if(e=e||tt,this.triggerWith(t,e,n),_.options[t])return _.options[t].apply(e,n)}var _=this;se.needed(),_.render=s,_.destroy=l,_.rerenderEvents=m,_.changeView=u,_.select=T,_.unselect=C,_.prev=H,_.next=x,_.prevYear=R,_.nextYear=I,_.today=k,_.gotoDate=L,_.incrementDate=M,_.zoomTo=B,_.getDate=N,_.getCalendar=G,_.getView=O,_.option=A,_.publiclyTrigger=P,_.dynamicOverrides={},_.viewSpecCache={},_.optionHandlers={},_.overrides=t.extend({},i),_.populateOptionsHash();var Y;_.bindOptions(["locale","monthNames","monthNamesShort","dayNames","dayNamesShort","firstDay","weekNumberCalculation"],function(t,e,n,i,s,o,l){if("iso"===l&&(l="ISO"),Y=Z(Ft(t)),e&&(Y._months=e),n&&(Y._monthsShort=n),i&&(Y._weekdays=i),s&&(Y._weekdaysShort=s),null==o&&"ISO"===l&&(o=1),null!=o){var a=Z(Y._week);a.dow=o,Y._week=a}"ISO"!==l&&"local"!==l&&"function"!=typeof l||(Y._fullCalendar_weekCalc=l),J&&r(J)}),_.defaultAllDayEventDuration=e.duration(_.options.defaultAllDayEventDuration),_.defaultTimedEventDuration=e.duration(_.options.defaultTimedEventDuration),_.moment=function(){var t;return"local"===_.options.timezone?(t=Ot.moment.apply(null,arguments),t.hasTime()&&t.local()):t="UTC"===_.options.timezone?Ot.moment.utc.apply(null,arguments):Ot.moment.parseZone.apply(null,arguments),r(t),t},_.localizeMoment=r,_.getIsAmbigTimezone=function(){return"local"!==_.options.timezone&&"UTC"!==_.options.timezone},_.applyTimezone=function(t){if(!t.hasTime())return t.clone();var e,n=_.moment(t.toArray()),i=t.time()-n.time();return i&&(e=n.clone().add(i),t.time()-e.time()===0&&(n=e)),n},_.getNow=function(){var t=_.options.now;return"function"==typeof t&&(t=t()),_.moment(t).stripZone()},_.getEventEnd=function(t){return t.end?t.end.clone():_.getDefaultEventEnd(t.allDay,t.start)},_.getDefaultEventEnd=function(t,e){var n=e.clone();return t?n.stripTime().add(_.defaultAllDayEventDuration):n.add(_.defaultTimedEventDuration),_.getIsAmbigTimezone()&&n.stripZone(),n},_.humanizeDuration=function(t){return t.locale(_.options.locale).humanize()},zt.call(_);var W,U,j,q,$,Q,X,K,J,tt=n[0],et={},nt=0;J=null!=_.options.defaultDate?_.moment(_.options.defaultDate).stripZone():_.getNow(),_.getSuggestedViewHeight=function(){return void 0===X&&f(),X},_.isHeightAuto=function(){return"auto"===_.options.contentHeight||"auto"===_.options.height},_.setToolbarsTitle=function(t){W.proxyCall("updateTitle",t)},_.freezeContentHeight=F,_.thawContentHeight=z;var it=0;_.initialize()}function Nt(e){t.each(me,function(t,n){null==e[t]&&(e[t]=n(e))})}function Ft(t){return e.localeData(t)||e.localeData("en")}function zt(){function n(t,e){return!U.options.lazyFetching||s(t,e)?o(t,e):ft.resolve($)}function i(){$=r(nt),U.trigger("eventsReset",$)}function r(t){var e,n,i=[];for(e=0;e<t.length;e++)n=t[e],n.start.clone().stripZone()<Z&&U.getEventEnd(n).stripZone()>q&&i.push(n);return i}function s(t,e){return!q||t<q||e>Z}function o(t,e){return q=t,Z=e,l()}function l(){return u(tt,"reset")}function a(t){return u(E(t))}function u(t,e){var n,i;for("reset"===e?nt=[]:"add"!==e&&(nt=C(nt,t)),n=0;n<t.length;n++)i=t[n],"pending"!==i._status&&et++,i._fetchId=(i._fetchId||0)+1,i._status="pending";for(n=0;n<t.length;n++)i=t[n],c(i,i._fetchId);return et?new ft(function(t){U.one("eventsReceived",t)}):ft.resolve($)}function c(e,n){f(e,function(i){var r,s,o,l=t.isArray(e.events);if(n===e._fetchId&&"rejected"!==e._status){if(e._status="resolved",i)for(r=0;r<i.length;r++)s=i[r],o=l?s:F(s,e),o&&nt.push.apply(nt,_(o));h()}})}function d(t){var e="pending"===t._status;t._status="rejected",e&&h()}function h(){et--,et||(i(nt),U.trigger("eventsReceived",$))}function f(e,n){var i,r,s=Ot.sourceFetchers;for(i=0;i<s.length;i++){if(r=s[i].call(U,e,q.clone(),Z.clone(),U.options.timezone,n),r===!0)return;if("object"==typeof r)return void f(r,n)}var o=e.events;if(o)t.isFunction(o)?(U.pushLoading(),o.call(U,q.clone(),Z.clone(),U.options.timezone,function(t){n(t),U.popLoading()})):t.isArray(o)?n(o):n();else{var l=e.url;if(l){var a,u=e.success,c=e.error,d=e.complete;a=t.isFunction(e.data)?e.data():e.data;var h=t.extend({},a||{}),g=J(e.startParam,U.options.startParam),p=J(e.endParam,U.options.endParam),v=J(e.timezoneParam,U.options.timezoneParam);g&&(h[g]=q.format()),p&&(h[p]=Z.format()),U.options.timezone&&"local"!=U.options.timezone&&(h[v]=U.options.timezone),U.pushLoading(),t.ajax(t.extend({},ye,e,{data:h,success:function(e){e=e||[];var i=K(u,this,arguments);t.isArray(i)&&(e=i),n(e)},error:function(){K(c,this,arguments),n()},complete:function(){K(d,this,arguments),U.popLoading()}}))}else n()}}function g(t){var e=p(t);e&&(tt.push(e),u([e],"add"))}function p(e){var n,i,r=Ot.sourceNormalizers;if(t.isFunction(e)||t.isArray(e)?n={events:e}:"string"==typeof e?n={url:e}:"object"==typeof e&&(n=t.extend({},e)),n){for(n.className?"string"==typeof n.className&&(n.className=n.className.split(/\s+/)):n.className=[],t.isArray(n.events)&&(n.origArray=n.events,n.events=t.map(n.events,function(t){return F(t,n)})),i=0;i<r.length;i++)r[i].call(U,n);return n}}function v(t){y(b(t))}function m(t){null==t?y(tt,!0):y(E(t))}function y(e,n){var r;for(r=0;r<e.length;r++)d(e[r]);n?(tt=[],nt=[]):(tt=t.grep(tt,function(t){for(r=0;r<e.length;r++)if(t===e[r])return!1;return!0}),nt=C(nt,e)),i()}function S(){return tt.slice(1)}function w(e){return t.grep(tt,function(t){return t.id&&t.id===e})[0]}function E(e){e?t.isArray(e)||(e=[e]):e=[];var n,i=[];for(n=0;n<e.length;n++)i.push.apply(i,b(e[n]));return i}function b(e){var n,i;for(n=0;n<tt.length;n++)if(i=tt[n],i===e)return[i];return i=w(e),i?[i]:t.grep(tt,function(t){return D(e,t)})}function D(t,e){return t&&e&&T(t)==T(e)}function T(t){return("object"==typeof t?t.origArray||t.googleCalendarId||t.url||t.events:null)||t}function C(e,n){return t.grep(e,function(t){for(var e=0;e<n.length;e++)if(t.source===n[e])return!1;return!0})}function H(t){x([t])}function x(t){var e,n;for(e=0;e<t.length;e++)n=t[e],n.start=U.moment(n.start),n.end?n.end=U.moment(n.end):n.end=null,Y(n,R(n));i()}function R(e){var n={};return t.each(e,function(t,e){I(t)&&void 0!==e&&X(e)&&(n[t]=e)}),n}function I(t){return!/^_|^(id|allDay|start|end)$/.test(t)}function k(t,e){return L([t],e)}function L(t,e){var n,r,s,o,l,a=[];for(s=0;s<t.length;s++)if(r=F(t[s])){for(n=_(r),o=0;o<n.length;o++)l=n[o],l.source||(e&&(Q.events.push(l),l.source=Q),nt.push(l));a=a.concat(n)}return a.length&&i(),a}function M(e){var n,r;for(null==e?e=function(){return!0}:t.isFunction(e)||(n=e+"",e=function(t){return t._id==n}),nt=t.grep(nt,e,!0),r=0;r<tt.length;r++)t.isArray(tt[r].events)&&(tt[r].events=t.grep(tt[r].events,e,!0));i()}function B(e){return t.isFunction(e)?t.grep(nt,e):null!=e?(e+="",t.grep(nt,function(t){return t._id==e})):nt}function N(t){t.start=U.moment(t.start),t.end&&(t.end=U.moment(t.end)),Gt(t)}function F(n,i){var r,s,o,l={};if(U.options.eventDataTransform&&(n=U.options.eventDataTransform(n)),i&&i.eventDataTransform&&(n=i.eventDataTransform(n)),t.extend(l,n),i&&(l.source=i),l._id=n._id||(void 0===n.id?"_fc"+Se++:n.id+""),n.className?"string"==typeof n.className?l.className=n.className.split(/\s+/):l.className=n.className:l.className=[],r=n.start||n.date,s=n.end,j(r)&&(r=e.duration(r)),j(s)&&(s=e.duration(s)),n.dow||e.isDuration(r)||e.isDuration(s))l.start=r?e.duration(r):null,l.end=s?e.duration(s):null,l._recurring=!0;else{if(r&&(r=U.moment(r),!r.isValid()))return!1;s&&(s=U.moment(s),s.isValid()||(s=null)),o=n.allDay,void 0===o&&(o=J(i?i.allDayDefault:void 0,U.options.allDayDefault)),A(r,s,o,l)}return U.normalizeEvent(l),l}function A(t,e,n,i){i.start=t,i.end=e,i.allDay=n,V(i),Gt(i)}function V(t){P(t),t.end&&!t.end.isAfter(t.start)&&(t.end=null),t.end||(U.options.forceEventDuration?t.end=U.getDefaultEventEnd(t.allDay,t.start):t.end=null)}function P(t){null==t.allDay&&(t.allDay=!(t.start.hasTime()||t.end&&t.end.hasTime())),t.allDay?(t.start.stripTime(),t.end&&t.end.stripTime()):(t.start.hasTime()||(t.start=U.applyTimezone(t.start.time(0))),t.end&&!t.end.hasTime()&&(t.end=U.applyTimezone(t.end.time(0))))}function _(e,n,i){var r,s,o,l,a,u,c,d,h,f=[];if(n=n||q,i=i||Z,e)if(e._recurring){if(s=e.dow)for(r={},o=0;o<s.length;o++)r[s[o]]=!0;for(l=n.clone().stripTime();l.isBefore(i);)r&&!r[l.day()]||(a=e.start,u=e.end,c=l.clone(),d=null,a&&(c=c.time(a)),u&&(d=l.clone().time(u)),h=t.extend({},e),A(c,d,!a&&!u,h),f.push(h)),l.add(1,"days")}else f.push(e);return f}function Y(e,n,i){function r(t,e){return i?O(t,e,i):n.allDay?G(t,e):z(t,e)}var s,o,l,a,u,c,d={};return n=n||{},n.start||(n.start=e.start.clone()),void 0===n.end&&(n.end=e.end?e.end.clone():null),null==n.allDay&&(n.allDay=e.allDay),V(n),s={start:e._start.clone(),end:e._end?e._end.clone():U.getDefaultEventEnd(e._allDay,e._start),allDay:n.allDay},V(s),o=null!==e._end&&null===n.end,l=r(n.start,s.start),n.end?(a=r(n.end,s.end),u=a.subtract(l)):u=null,t.each(n,function(t,e){I(t)&&void 0!==e&&(d[t]=e)}),c=W(B(e._id),o,n.allDay,l,u,d),{dateDelta:l,durationDelta:u,undo:c}}function W(e,n,i,r,s,o){var l=U.getIsAmbigTimezone(),a=[];return r&&!r.valueOf()&&(r=null),s&&!s.valueOf()&&(s=null),t.each(e,function(e,u){var c,d;c={start:u.start.clone(),end:u.end?u.end.clone():null,allDay:u.allDay},t.each(o,function(t){c[t]=u[t]}),d={start:u._start,end:u._end,allDay:i},V(d),n?d.end=null:s&&!d.end&&(d.end=U.getDefaultEventEnd(d.allDay,d.start)),r&&(d.start.add(r),d.end&&d.end.add(r)),s&&d.end.add(s),l&&!d.allDay&&(r||s)&&(d.start.stripZone(),d.end&&d.end.stripZone()),t.extend(u,o,d),Gt(u),a.push(function(){t.extend(u,c),Gt(u)})}),function(){for(var t=0;t<a.length;t++)a[t]()}}var U=this;U.requestEvents=n,U.reportEventChange=i,U.isFetchNeeded=s,U.fetchEvents=o,U.fetchEventSources=u,U.refetchEvents=l,U.refetchEventSources=a,U.getEventSources=S,U.getEventSourceById=w,U.addEventSource=g,U.removeEventSource=v,U.removeEventSources=m,U.updateEvent=H,U.updateEvents=x,U.renderEvent=k,U.renderEvents=L,U.removeEvents=M,U.clientEvents=B,U.mutateEvent=Y,U.normalizeEventDates=V,U.normalizeEventTimes=P;var q,Z,$,Q={events:[]},tt=[Q],et=0,nt=[];t.each((U.options.events?[U.options.events]:[]).concat(U.options.eventSources||[]),function(t,e){var n=p(e);n&&tt.push(n)}),U.getEventCache=function(){return nt},U.getPrunedEventCache=function(){return $},U.rezoneArrayEventSources=function(){var e,n,i;for(e=0;e<tt.length;e++)if(n=tt[e].events,t.isArray(n))for(i=0;i<n.length;i++)N(n[i])},U.buildEventFromInput=F,U.expandEvent=_}function Gt(t){t._allDay=t.allDay,t._start=t.start.clone(),t._end=t.end?t.end.clone():null}var Ot=t.fullCalendar={version:"3.2.0",internalApiVersion:8},At=Ot.views={};t.fn.fullCalendar=function(e){var n=Array.prototype.slice.call(arguments,1),i=this;return this.each(function(r,s){var o,l=t(s),a=l.data("fullCalendar");"string"==typeof e?a&&t.isFunction(a[e])&&(o=a[e].apply(a,n),r||(i=o),"destroy"===e&&l.removeData("fullCalendar")):a||(a=new fe(l,e),l.data("fullCalendar",a),a.render())}),i};var Vt=["header","footer","buttonText","buttonIcons","themeButtonIcons"];Ot.intersectRanges=F,Ot.applyAll=K,Ot.debounce=at,Ot.isInt=ot,Ot.htmlEscape=tt,Ot.cssToStr=nt,Ot.proxy=lt,Ot.capitaliseFirstLetter=rt,Ot.getOuterRect=h,Ot.getClientRect=f,Ot.getContentRect=g,Ot.getScrollbarWidths=p;var Pt=null;Ot.preventDefault=H,Ot.intersectRects=x,Ot.parseFieldSpecs=L,Ot.compareByFieldSpecs=M,Ot.compareByFieldSpec=B,Ot.flexibleCompare=N,Ot.computeIntervalUnit=A,Ot.divideRangeByDuration=P,Ot.divideDurationByDuration=_,Ot.multiplyDuration=Y,Ot.durationHasTime=W;var _t=["sun","mon","tue","wed","thu","fri","sat"],Yt=["year","month","week","day","hour","minute","second","millisecond"];Ot.log=function(){var t=window.console;if(t&&t.log)return t.log.apply(t,arguments)},Ot.warn=function(){var t=window.console;return t&&t.warn?t.warn.apply(t,arguments):Ot.log.apply(Ot,arguments)};var Wt={}.hasOwnProperty;Ot.createObject=Z;var Ut=/^\s*\d{4}-\d\d$/,jt=/^\s*\d{4}-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d+)?)?)?)?)?$/,qt=e.fn,Zt=t.extend({},qt),$t=e.momentProperties;$t.push("_fullCalendar"),$t.push("_ambigTime"),$t.push("_ambigZone"),Ot.moment=function(){return ut(arguments)},Ot.moment.utc=function(){var t=ut(arguments,!0);return t.hasTime()&&t.utc(),t},Ot.moment.parseZone=function(){return ut(arguments,!0,!0)},qt.week=qt.weeks=function(t){var e=this._locale._fullCalendar_weekCalc;return null==t&&"function"==typeof e?e(this):"ISO"===e?Zt.isoWeek.apply(this,arguments):Zt.week.apply(this,arguments)},qt.time=function(t){if(!this._fullCalendar)return Zt.time.apply(this,arguments);if(null==t)return e.duration({hours:this.hours(),minutes:this.minutes(),seconds:this.seconds(),milliseconds:this.milliseconds()});this._ambigTime=!1,e.isDuration(t)||e.isMoment(t)||(t=e.duration(t));var n=0;return e.isDuration(t)&&(n=24*Math.floor(t.asDays())),this.hours(n+t.hours()).minutes(t.minutes()).seconds(t.seconds()).milliseconds(t.milliseconds())},qt.stripTime=function(){return this._ambigTime||(this.utc(!0),this.set({hours:0,minutes:0,seconds:0,ms:0}),this._ambigTime=!0,this._ambigZone=!0),this},qt.hasTime=function(){return!this._ambigTime},qt.stripZone=function(){var t;return this._ambigZone||(t=this._ambigTime,this.utc(!0),this._ambigTime=t||!1,this._ambigZone=!0),this},qt.hasZone=function(){return!this._ambigZone},qt.local=function(t){return Zt.local.call(this,this._ambigZone||t),this._ambigTime=!1,this._ambigZone=!1,this},qt.utc=function(t){return Zt.utc.call(this,t),this._ambigTime=!1,this._ambigZone=!1,this},qt.utcOffset=function(t){return null!=t&&(this._ambigTime=!1,this._ambigZone=!1),Zt.utcOffset.apply(this,arguments)},qt.format=function(){return this._fullCalendar&&arguments[0]?Qt(this,arguments[0]):this._ambigTime?Kt(this,"YYYY-MM-DD"):this._ambigZone?Kt(this,"YYYY-MM-DD[T]HH:mm:ss"):Zt.format.apply(this,arguments)},qt.toISOString=function(){return this._ambigTime?Kt(this,"YYYY-MM-DD"):this._ambigZone?Kt(this,"YYYY-MM-DD[T]HH:mm:ss"):Zt.toISOString.apply(this,arguments)},function(){function t(t,e){return c(r(e).fakeFormatString,t)}function e(t,e){return Zt.format.call(t,e)}function n(t,e,n,s,o){var l;return t=Ot.moment.parseZone(t),e=Ot.moment.parseZone(e),l=t.localeData(),n=l.longDateFormat(n)||n,i(r(n),t,e,s||" - ",o)}function i(t,e,n,i,r){var s,o,l,a=t.sameUnits,u=e.clone().stripZone(),c=n.clone().stripZone(),f=d(t.fakeFormatString,e),g=d(t.fakeFormatString,n),p="",v="",m="",y="",S="";for(s=0;s<a.length&&(!a[s]||u.isSame(c,a[s]));s++)p+=f[s];for(o=a.length-1;o>s&&(!a[o]||u.isSame(c,a[o]))&&(o-1!==s||"."!==f[o]);o--)v=f[o]+v;for(l=s;l<=o;l++)m+=f[l],y+=g[l];return(m||y)&&(S=r?y+i+m:m+i+y),h(p+S+v)}function r(t){return w[t]||(w[t]=s(t))}function s(t){var e=o(t);return{fakeFormatString:a(e),sameUnits:u(e)}}function o(t){for(var e,n=[],i=/\[([^\]]*)\]|\(([^\)]*)\)|(LTS|LT|(\w)\4*o?)|([^\w\[\(]+)/g;e=i.exec(t);)e[1]?n.push.apply(n,l(e[1])):e[2]?n.push({maybe:o(e[2])}):e[3]?n.push({token:e[3]}):e[5]&&n.push.apply(n,l(e[5]));return n}function l(t){return". "===t?["."," "]:[t]}function a(t){var e,n,i=[];for(e=0;e<t.length;e++)n=t[e],"string"==typeof n?i.push("["+n+"]"):n.token?n.token in y?i.push(p+"["+n.token+"]"):i.push(n.token):n.maybe&&i.push(v+a(n.maybe)+v);return i.join(g)}function u(t){var e,n,i,r=[];for(e=0;e<t.length;e++)n=t[e],n.token?(i=S[n.token.charAt(0)],r.push(i?i.unit:"second")):n.maybe?r.push.apply(r,u(n.maybe)):r.push(null);return r}function c(t,e){return h(d(t,e).join(""))}function d(t,n){var i,r,s=[],o=e(n,t),l=o.split(g);for(i=0;i<l.length;i++)r=l[i],r.charAt(0)===p?s.push(y[r.substring(1)](n)):s.push(r);return s}function h(t){return t.replace(m,function(t,e){
+return e.match(/[1-9]/)?e:""})}function f(t){var e,n,i,r,s=o(t);for(e=0;e<s.length;e++)n=s[e],n.token&&(i=S[n.token.charAt(0)],i&&(!r||i.value>r.value)&&(r=i));return r?r.unit:null}Ot.formatDate=t,Ot.formatRange=n,Ot.oldMomentFormat=e,Ot.queryMostGranularFormatUnit=f;var g="\v",p="",v="",m=new RegExp(v+"([^"+v+"]*)"+v,"g"),y={t:function(t){return e(t,"a").charAt(0)},T:function(t){return e(t,"A").charAt(0)}},S={Y:{value:1,unit:"year"},M:{value:2,unit:"month"},W:{value:3,unit:"week"},w:{value:3,unit:"week"},D:{value:4,unit:"day"},d:{value:4,unit:"day"}},w={}}();var Qt=Ot.formatDate,Xt=Ot.formatRange,Kt=Ot.oldMomentFormat;Ot.Class=ct,ct.extend=function(){var t,e,n=arguments.length;for(t=0;t<n;t++)e=arguments[t],t<n-1&&ht(this,e);return dt(this,e||{})},ct.mixin=function(t){ht(this,t)},Ot.Promise=ft,ft.immediate=!0,ft.resolve=function(e){if(e&&"function"==typeof e.resolve)return e.promise();if(e&&"function"==typeof e.then)return e;var n=t.Deferred().resolve(e),i=n.promise();if(ft.immediate){var r=i.then;i._value=e,i.then=function(t,n){return"function"==typeof t?ft.resolve(t(e)):r.call(i,t,n)}}return i},ft.reject=function(){return t.Deferred().reject().promise()},ft.all=function(e){var n,i,r,s=!1;if(ft.immediate)for(s=!0,n=[],i=0;i<e.length;i++)if(r=e[i],r&&"function"==typeof r.state&&"resolved"===r.state()&&"_value"in r)n.push(r._value);else{if(r&&"function"==typeof r.then){s=!1;break}n.push(r)}return s?ft.resolve(n):t.when.apply(t.when,e).then(function(){return t.when(t.makeArray(arguments))})},Ot.TaskQueue=gt;var Jt=Ot.EmitterMixin={on:function(e,n){return t(this).on(e,this._prepareIntercept(n)),this},one:function(e,n){return t(this).one(e,this._prepareIntercept(n)),this},_prepareIntercept:function(e){var n=function(t,n){return e.apply(n.context||this,n.args||[])};return e.guid||(e.guid=t.guid++),n.guid=e.guid,n},off:function(e,n){return t(this).off(e,n),this},trigger:function(e){var n=Array.prototype.slice.call(arguments,1);return t(this).triggerHandler(e,{args:n}),this},triggerWith:function(e,n,i){return t(this).triggerHandler(e,{context:n,args:i}),this}},te=Ot.ListenerMixin=function(){var e=0,n={listenerId:null,listenTo:function(e,n,i){if("object"==typeof n)for(var r in n)n.hasOwnProperty(r)&&this.listenTo(e,r,n[r]);else"string"==typeof n&&e.on(n+"."+this.getListenerNamespace(),t.proxy(i,this))},stopListeningTo:function(t,e){t.off((e||"")+"."+this.getListenerNamespace())},getListenerNamespace:function(){return null==this.listenerId&&(this.listenerId=e++),"_listener"+this.listenerId}};return n}(),ee=ct.extend(te,{isHidden:!0,options:null,el:null,margin:10,constructor:function(t){this.options=t||{}},show:function(){this.isHidden&&(this.el||this.render(),this.el.show(),this.position(),this.isHidden=!1,this.trigger("show"))},hide:function(){this.isHidden||(this.el.hide(),this.isHidden=!0,this.trigger("hide"))},render:function(){var e=this,n=this.options;this.el=t('<div class="fc-popover"/>').addClass(n.className||"").css({top:0,left:0}).append(n.content).appendTo(n.parentEl),this.el.on("click",".fc-close",function(){e.hide()}),n.autoHide&&this.listenTo(t(document),"mousedown",this.documentMousedown)},documentMousedown:function(e){this.el&&!t(e.target).closest(this.el).length&&this.hide()},removeElement:function(){this.hide(),this.el&&(this.el.remove(),this.el=null),this.stopListeningTo(t(document),"mousedown")},position:function(){var e,n,i,r,s,o=this.options,l=this.el.offsetParent().offset(),a=this.el.outerWidth(),u=this.el.outerHeight(),c=t(window),h=d(this.el);r=o.top||0,s=void 0!==o.left?o.left:void 0!==o.right?o.right-a:0,h.is(window)||h.is(document)?(h=c,e=0,n=0):(i=h.offset(),e=i.top,n=i.left),e+=c.scrollTop(),n+=c.scrollLeft(),o.viewportConstrain!==!1&&(r=Math.min(r,e+h.outerHeight()-u-this.margin),r=Math.max(r,e+this.margin),s=Math.min(s,n+h.outerWidth()-a-this.margin),s=Math.max(s,n+this.margin)),this.el.css({top:r-l.top,left:s-l.left})},trigger:function(t){this.options[t]&&this.options[t].apply(this,Array.prototype.slice.call(arguments,1))}}),ne=Ot.CoordCache=ct.extend({els:null,forcedOffsetParentEl:null,origin:null,boundingRect:null,isHorizontal:!1,isVertical:!1,lefts:null,rights:null,tops:null,bottoms:null,constructor:function(e){this.els=t(e.els),this.isHorizontal=e.isHorizontal,this.isVertical=e.isVertical,this.forcedOffsetParentEl=e.offsetParent?t(e.offsetParent):null},build:function(){var t=this.forcedOffsetParentEl;!t&&this.els.length>0&&(t=this.els.eq(0).offsetParent()),this.origin=t?t.offset():null,this.boundingRect=this.queryBoundingRect(),this.isHorizontal&&this.buildElHorizontals(),this.isVertical&&this.buildElVerticals()},clear:function(){this.origin=null,this.boundingRect=null,this.lefts=null,this.rights=null,this.tops=null,this.bottoms=null},ensureBuilt:function(){this.origin||this.build()},buildElHorizontals:function(){var e=[],n=[];this.els.each(function(i,r){var s=t(r),o=s.offset().left,l=s.outerWidth();e.push(o),n.push(o+l)}),this.lefts=e,this.rights=n},buildElVerticals:function(){var e=[],n=[];this.els.each(function(i,r){var s=t(r),o=s.offset().top,l=s.outerHeight();e.push(o),n.push(o+l)}),this.tops=e,this.bottoms=n},getHorizontalIndex:function(t){this.ensureBuilt();var e,n=this.lefts,i=this.rights,r=n.length;for(e=0;e<r;e++)if(t>=n[e]&&t<i[e])return e},getVerticalIndex:function(t){this.ensureBuilt();var e,n=this.tops,i=this.bottoms,r=n.length;for(e=0;e<r;e++)if(t>=n[e]&&t<i[e])return e},getLeftOffset:function(t){return this.ensureBuilt(),this.lefts[t]},getLeftPosition:function(t){return this.ensureBuilt(),this.lefts[t]-this.origin.left},getRightOffset:function(t){return this.ensureBuilt(),this.rights[t]},getRightPosition:function(t){return this.ensureBuilt(),this.rights[t]-this.origin.left},getWidth:function(t){return this.ensureBuilt(),this.rights[t]-this.lefts[t]},getTopOffset:function(t){return this.ensureBuilt(),this.tops[t]},getTopPosition:function(t){return this.ensureBuilt(),this.tops[t]-this.origin.top},getBottomOffset:function(t){return this.ensureBuilt(),this.bottoms[t]},getBottomPosition:function(t){return this.ensureBuilt(),this.bottoms[t]-this.origin.top},getHeight:function(t){return this.ensureBuilt(),this.bottoms[t]-this.tops[t]},queryBoundingRect:function(){var t;return this.els.length>0&&(t=d(this.els.eq(0)),!t.is(document))?f(t):null},isPointInBounds:function(t,e){return this.isLeftInBounds(t)&&this.isTopInBounds(e)},isLeftInBounds:function(t){return!this.boundingRect||t>=this.boundingRect.left&&t<this.boundingRect.right},isTopInBounds:function(t){return!this.boundingRect||t>=this.boundingRect.top&&t<this.boundingRect.bottom}}),ie=Ot.DragListener=ct.extend(te,{options:null,subjectEl:null,originX:null,originY:null,scrollEl:null,isInteracting:!1,isDistanceSurpassed:!1,isDelayEnded:!1,isDragging:!1,isTouch:!1,delay:null,delayTimeoutId:null,minDistance:null,shouldCancelTouchScroll:!0,scrollAlwaysKills:!1,constructor:function(t){this.options=t||{}},startInteraction:function(e,n){var i=D(e);if("mousedown"===e.type){if(se.get().shouldIgnoreMouse())return;if(!w(e))return;e.preventDefault()}this.isInteracting||(n=n||{},this.delay=J(n.delay,this.options.delay,0),this.minDistance=J(n.distance,this.options.distance,0),this.subjectEl=this.options.subjectEl,T(t("body")),this.isInteracting=!0,this.isTouch=i,this.isDelayEnded=!1,this.isDistanceSurpassed=!1,this.originX=E(e),this.originY=b(e),this.scrollEl=d(t(e.target)),this.bindHandlers(),this.initAutoScroll(),this.handleInteractionStart(e),this.startDelay(e),this.minDistance||this.handleDistanceSurpassed(e))},handleInteractionStart:function(t){this.trigger("interactionStart",t)},endInteraction:function(e,n){this.isInteracting&&(this.endDrag(e),this.delayTimeoutId&&(clearTimeout(this.delayTimeoutId),this.delayTimeoutId=null),this.destroyAutoScroll(),this.unbindHandlers(),this.isInteracting=!1,this.handleInteractionEnd(e,n),C(t("body")))},handleInteractionEnd:function(t,e){this.trigger("interactionEnd",t,e||!1)},bindHandlers:function(){var t=se.get();this.isTouch?this.listenTo(t,{touchmove:this.handleTouchMove,touchend:this.endInteraction,scroll:this.handleTouchScroll}):this.listenTo(t,{mousemove:this.handleMouseMove,mouseup:this.endInteraction}),this.listenTo(t,{selectstart:H,contextmenu:H})},unbindHandlers:function(){this.stopListeningTo(se.get())},startDrag:function(t,e){this.startInteraction(t,e),this.isDragging||(this.isDragging=!0,this.handleDragStart(t))},handleDragStart:function(t){this.trigger("dragStart",t)},handleMove:function(t){var e,n=E(t)-this.originX,i=b(t)-this.originY,r=this.minDistance;this.isDistanceSurpassed||(e=n*n+i*i,e>=r*r&&this.handleDistanceSurpassed(t)),this.isDragging&&this.handleDrag(n,i,t)},handleDrag:function(t,e,n){this.trigger("drag",t,e,n),this.updateAutoScroll(n)},endDrag:function(t){this.isDragging&&(this.isDragging=!1,this.handleDragEnd(t))},handleDragEnd:function(t){this.trigger("dragEnd",t)},startDelay:function(t){var e=this;this.delay?this.delayTimeoutId=setTimeout(function(){e.handleDelayEnd(t)},this.delay):this.handleDelayEnd(t)},handleDelayEnd:function(t){this.isDelayEnded=!0,this.isDistanceSurpassed&&this.startDrag(t)},handleDistanceSurpassed:function(t){this.isDistanceSurpassed=!0,this.isDelayEnded&&this.startDrag(t)},handleTouchMove:function(t){this.isDragging&&this.shouldCancelTouchScroll&&t.preventDefault(),this.handleMove(t)},handleMouseMove:function(t){this.handleMove(t)},handleTouchScroll:function(t){this.isDragging&&!this.scrollAlwaysKills||this.endInteraction(t,!0)},trigger:function(t){this.options[t]&&this.options[t].apply(this,Array.prototype.slice.call(arguments,1)),this["_"+t]&&this["_"+t].apply(this,Array.prototype.slice.call(arguments,1))}});ie.mixin({isAutoScroll:!1,scrollBounds:null,scrollTopVel:null,scrollLeftVel:null,scrollIntervalId:null,scrollSensitivity:30,scrollSpeed:200,scrollIntervalMs:50,initAutoScroll:function(){var t=this.scrollEl;this.isAutoScroll=this.options.scroll&&t&&!t.is(window)&&!t.is(document),this.isAutoScroll&&this.listenTo(t,"scroll",at(this.handleDebouncedScroll,100))},destroyAutoScroll:function(){this.endAutoScroll(),this.isAutoScroll&&this.stopListeningTo(this.scrollEl,"scroll")},computeScrollBounds:function(){this.isAutoScroll&&(this.scrollBounds=h(this.scrollEl))},updateAutoScroll:function(t){var e,n,i,r,s=this.scrollSensitivity,o=this.scrollBounds,l=0,a=0;o&&(e=(s-(b(t)-o.top))/s,n=(s-(o.bottom-b(t)))/s,i=(s-(E(t)-o.left))/s,r=(s-(o.right-E(t)))/s,e>=0&&e<=1?l=e*this.scrollSpeed*-1:n>=0&&n<=1&&(l=n*this.scrollSpeed),i>=0&&i<=1?a=i*this.scrollSpeed*-1:r>=0&&r<=1&&(a=r*this.scrollSpeed)),this.setScrollVel(l,a)},setScrollVel:function(t,e){this.scrollTopVel=t,this.scrollLeftVel=e,this.constrainScrollVel(),!this.scrollTopVel&&!this.scrollLeftVel||this.scrollIntervalId||(this.scrollIntervalId=setInterval(lt(this,"scrollIntervalFunc"),this.scrollIntervalMs))},constrainScrollVel:function(){var t=this.scrollEl;this.scrollTopVel<0?t.scrollTop()<=0&&(this.scrollTopVel=0):this.scrollTopVel>0&&t.scrollTop()+t[0].clientHeight>=t[0].scrollHeight&&(this.scrollTopVel=0),this.scrollLeftVel<0?t.scrollLeft()<=0&&(this.scrollLeftVel=0):this.scrollLeftVel>0&&t.scrollLeft()+t[0].clientWidth>=t[0].scrollWidth&&(this.scrollLeftVel=0)},scrollIntervalFunc:function(){var t=this.scrollEl,e=this.scrollIntervalMs/1e3;this.scrollTopVel&&t.scrollTop(t.scrollTop()+this.scrollTopVel*e),this.scrollLeftVel&&t.scrollLeft(t.scrollLeft()+this.scrollLeftVel*e),this.constrainScrollVel(),this.scrollTopVel||this.scrollLeftVel||this.endAutoScroll()},endAutoScroll:function(){this.scrollIntervalId&&(clearInterval(this.scrollIntervalId),this.scrollIntervalId=null,this.handleScrollEnd())},handleDebouncedScroll:function(){this.scrollIntervalId||this.handleScrollEnd()},handleScrollEnd:function(){}});var re=ie.extend({component:null,origHit:null,hit:null,coordAdjust:null,constructor:function(t,e){ie.call(this,e),this.component=t},handleInteractionStart:function(t){var e,n,i,r=this.subjectEl;this.component.hitsNeeded(),this.computeScrollBounds(),t?(n={left:E(t),top:b(t)},i=n,r&&(e=h(r),i=R(i,e)),this.origHit=this.queryHit(i.left,i.top),r&&this.options.subjectCenter&&(this.origHit&&(e=x(this.origHit,e)||e),i=I(e)),this.coordAdjust=k(i,n)):(this.origHit=null,this.coordAdjust=null),ie.prototype.handleInteractionStart.apply(this,arguments)},handleDragStart:function(t){var e;ie.prototype.handleDragStart.apply(this,arguments),e=this.queryHit(E(t),b(t)),e&&this.handleHitOver(e)},handleDrag:function(t,e,n){var i;ie.prototype.handleDrag.apply(this,arguments),i=this.queryHit(E(n),b(n)),pt(i,this.hit)||(this.hit&&this.handleHitOut(),i&&this.handleHitOver(i))},handleDragEnd:function(){this.handleHitDone(),ie.prototype.handleDragEnd.apply(this,arguments)},handleHitOver:function(t){var e=pt(t,this.origHit);this.hit=t,this.trigger("hitOver",this.hit,e,this.origHit)},handleHitOut:function(){this.hit&&(this.trigger("hitOut",this.hit),this.handleHitDone(),this.hit=null)},handleHitDone:function(){this.hit&&this.trigger("hitDone",this.hit)},handleInteractionEnd:function(){ie.prototype.handleInteractionEnd.apply(this,arguments),this.origHit=null,this.hit=null,this.component.hitsNotNeeded()},handleScrollEnd:function(){ie.prototype.handleScrollEnd.apply(this,arguments),this.isDragging&&(this.component.releaseHits(),this.component.prepareHits())},queryHit:function(t,e){return this.coordAdjust&&(t+=this.coordAdjust.left,e+=this.coordAdjust.top),this.component.queryHit(t,e)}});Ot.touchMouseIgnoreWait=500;var se=ct.extend(te,Jt,{isTouching:!1,mouseIgnoreDepth:0,handleScrollProxy:null,bind:function(){var e=this;this.listenTo(t(document),{touchstart:this.handleTouchStart,touchcancel:this.handleTouchCancel,touchend:this.handleTouchEnd,mousedown:this.handleMouseDown,mousemove:this.handleMouseMove,mouseup:this.handleMouseUp,click:this.handleClick,selectstart:this.handleSelectStart,contextmenu:this.handleContextMenu}),window.addEventListener("touchmove",this.handleTouchMoveProxy=function(n){e.handleTouchMove(t.Event(n))},{passive:!1}),window.addEventListener("scroll",this.handleScrollProxy=function(n){e.handleScroll(t.Event(n))},!0)},unbind:function(){this.stopListeningTo(t(document)),window.removeEventListener("touchmove",this.handleTouchMoveProxy),window.removeEventListener("scroll",this.handleScrollProxy,!0)},handleTouchStart:function(t){this.stopTouch(t,!0),this.isTouching=!0,this.trigger("touchstart",t)},handleTouchMove:function(t){this.isTouching&&this.trigger("touchmove",t)},handleTouchCancel:function(t){this.isTouching&&(this.trigger("touchcancel",t),this.stopTouch(t))},handleTouchEnd:function(t){this.stopTouch(t)},handleMouseDown:function(t){this.shouldIgnoreMouse()||this.trigger("mousedown",t)},handleMouseMove:function(t){this.shouldIgnoreMouse()||this.trigger("mousemove",t)},handleMouseUp:function(t){this.shouldIgnoreMouse()||this.trigger("mouseup",t)},handleClick:function(t){this.shouldIgnoreMouse()||this.trigger("click",t)},handleSelectStart:function(t){this.trigger("selectstart",t)},handleContextMenu:function(t){this.trigger("contextmenu",t)},handleScroll:function(t){this.trigger("scroll",t)},stopTouch:function(t,e){this.isTouching&&(this.isTouching=!1,this.trigger("touchend",t),e||this.startTouchMouseIgnore())},startTouchMouseIgnore:function(){var t=this,e=Ot.touchMouseIgnoreWait;e&&(this.mouseIgnoreDepth++,setTimeout(function(){t.mouseIgnoreDepth--},e))},shouldIgnoreMouse:function(){return this.isTouching||Boolean(this.mouseIgnoreDepth)}});!function(){var t=null,e=0;se.get=function(){return t||(t=new se,t.bind()),t},se.needed=function(){se.get(),e++},se.unneeded=function(){e--,e||(t.unbind(),t=null)}}();var oe=ct.extend(te,{options:null,sourceEl:null,el:null,parentEl:null,top0:null,left0:null,y0:null,x0:null,topDelta:null,leftDelta:null,isFollowing:!1,isHidden:!1,isAnimating:!1,constructor:function(e,n){this.options=n=n||{},this.sourceEl=e,this.parentEl=n.parentEl?t(n.parentEl):e.parent()},start:function(e){this.isFollowing||(this.isFollowing=!0,this.y0=b(e),this.x0=E(e),this.topDelta=0,this.leftDelta=0,this.isHidden||this.updatePosition(),D(e)?this.listenTo(t(document),"touchmove",this.handleMove):this.listenTo(t(document),"mousemove",this.handleMove))},stop:function(e,n){function i(){r.isAnimating=!1,r.removeElement(),r.top0=r.left0=null,n&&n()}var r=this,s=this.options.revertDuration;this.isFollowing&&!this.isAnimating&&(this.isFollowing=!1,this.stopListeningTo(t(document)),e&&s&&!this.isHidden?(this.isAnimating=!0,this.el.animate({top:this.top0,left:this.left0},{duration:s,complete:i})):i())},getEl:function(){var t=this.el;return t||(t=this.el=this.sourceEl.clone().addClass(this.options.additionalClass||"").css({position:"absolute",visibility:"",display:this.isHidden?"none":"",margin:0,right:"auto",bottom:"auto",width:this.sourceEl.width(),height:this.sourceEl.height(),opacity:this.options.opacity||"",zIndex:this.options.zIndex}),t.addClass("fc-unselectable"),t.appendTo(this.parentEl)),t},removeElement:function(){this.el&&(this.el.remove(),this.el=null)},updatePosition:function(){var t,e;this.getEl(),null===this.top0&&(t=this.sourceEl.offset(),e=this.el.offsetParent().offset(),this.top0=t.top-e.top,this.left0=t.left-e.left),this.el.css({top:this.top0+this.topDelta,left:this.left0+this.leftDelta})},handleMove:function(t){this.topDelta=b(t)-this.y0,this.leftDelta=E(t)-this.x0,this.isHidden||this.updatePosition()},hide:function(){this.isHidden||(this.isHidden=!0,this.el&&this.el.hide())},show:function(){this.isHidden&&(this.isHidden=!1,this.updatePosition(),this.getEl().show())}}),le=Ot.Grid=ct.extend(te,{hasDayInteractions:!0,view:null,isRTL:null,start:null,end:null,el:null,elsByFill:null,eventTimeFormat:null,displayEventTime:null,displayEventEnd:null,minResizeDuration:null,largeUnit:null,dayClickListener:null,daySelectListener:null,segDragListener:null,segResizeListener:null,externalDragListener:null,constructor:function(t){this.view=t,this.isRTL=t.opt("isRTL"),this.elsByFill={},this.dayClickListener=this.buildDayClickListener(),this.daySelectListener=this.buildDaySelectListener()},computeEventTimeFormat:function(){return this.view.opt("smallTimeFormat")},computeDisplayEventTime:function(){return!0},computeDisplayEventEnd:function(){return!0},setRange:function(t){this.start=t.start.clone(),this.end=t.end.clone(),this.rangeUpdated(),this.processRangeOptions()},rangeUpdated:function(){},processRangeOptions:function(){var t,e,n=this.view;this.eventTimeFormat=n.opt("eventTimeFormat")||n.opt("timeFormat")||this.computeEventTimeFormat(),t=n.opt("displayEventTime"),null==t&&(t=this.computeDisplayEventTime()),e=n.opt("displayEventEnd"),null==e&&(e=this.computeDisplayEventEnd()),this.displayEventTime=t,this.displayEventEnd=e},spanToSegs:function(t){},diffDates:function(t,e){return this.largeUnit?O(t,e,this.largeUnit):z(t,e)},hitsNeededDepth:0,hitsNeeded:function(){this.hitsNeededDepth++||this.prepareHits()},hitsNotNeeded:function(){this.hitsNeededDepth&&!--this.hitsNeededDepth&&this.releaseHits()},prepareHits:function(){},releaseHits:function(){},queryHit:function(t,e){},getHitSpan:function(t){},getHitEl:function(t){},setElement:function(t){this.el=t,this.hasDayInteractions&&(T(t),this.bindDayHandler("touchstart",this.dayTouchStart),this.bindDayHandler("mousedown",this.dayMousedown)),this.bindSegHandlers(),this.bindGlobalHandlers()},bindDayHandler:function(e,n){var i=this;this.el.on(e,function(e){if(!t(e.target).is(i.segSelector+","+i.segSelector+" *,.fc-more,a[data-goto]"))return n.call(i,e)})},removeElement:function(){this.unbindGlobalHandlers(),this.clearDragListeners(),this.el.remove()},renderSkeleton:function(){},renderDates:function(){},unrenderDates:function(){},bindGlobalHandlers:function(){this.listenTo(t(document),{dragstart:this.externalDragStart,sortstart:this.externalDragStart})},unbindGlobalHandlers:function(){this.stopListeningTo(t(document))},dayMousedown:function(t){var e=this.view;e.isSelected||e.selectedEvent||(this.dayClickListener.startInteraction(t),e.opt("selectable")&&this.daySelectListener.startInteraction(t,{distance:e.opt("selectMinDistance")}))},dayTouchStart:function(t){var e,n=this.view;n.isSelected||n.selectedEvent||(e=n.opt("selectLongPressDelay"),null==e&&(e=n.opt("longPressDelay")),this.dayClickListener.startInteraction(t),n.opt("selectable")&&this.daySelectListener.startInteraction(t,{delay:e}))},buildDayClickListener:function(){var t,e=this,n=this.view,i=new re(this,{scroll:n.opt("dragScroll"),interactionStart:function(){t=i.origHit},hitOver:function(e,n,i){n||(t=null)},hitOut:function(){t=null},interactionEnd:function(i,r){!r&&t&&n.triggerDayClick(e.getHitSpan(t),e.getHitEl(t),i)}});return i.shouldCancelTouchScroll=!1,i.scrollAlwaysKills=!0,i},buildDaySelectListener:function(){var t,e=this,n=this.view,i=new re(this,{scroll:n.opt("dragScroll"),interactionStart:function(){t=null},dragStart:function(){n.unselect()},hitOver:function(n,i,r){r&&(t=e.computeSelection(e.getHitSpan(r),e.getHitSpan(n)),t?e.renderSelection(t):t===!1&&s())},hitOut:function(){t=null,e.unrenderSelection()},hitDone:function(){o()},interactionEnd:function(e,i){!i&&t&&n.reportSelection(t,e)}});return i},clearDragListeners:function(){this.dayClickListener.endInteraction(),this.daySelectListener.endInteraction(),this.segDragListener&&this.segDragListener.endInteraction(),this.segResizeListener&&this.segResizeListener.endInteraction(),this.externalDragListener&&this.externalDragListener.endInteraction()},renderEventLocationHelper:function(t,e){var n=this.fabricateHelperEvent(t,e);return this.renderHelper(n,e)},fabricateHelperEvent:function(t,e){var n=e?Z(e.event):{};return n.start=t.start.clone(),n.end=t.end?t.end.clone():null,n.allDay=null,this.view.calendar.normalizeEventDates(n),n.className=(n.className||[]).concat("fc-helper"),e||(n.editable=!1),n},renderHelper:function(t,e){},unrenderHelper:function(){},renderSelection:function(t){this.renderHighlight(t)},unrenderSelection:function(){this.unrenderHighlight()},computeSelection:function(t,e){var n=this.computeSelectionSpan(t,e);return!(n&&!this.view.calendar.isSelectionSpanAllowed(n))&&n},computeSelectionSpan:function(t,e){var n=[t.start,t.end,e.start,e.end];return n.sort(st),{start:n[0].clone(),end:n[3].clone()}},renderHighlight:function(t){this.renderFill("highlight",this.spanToSegs(t))},unrenderHighlight:function(){this.unrenderFill("highlight")},highlightSegClasses:function(){return["fc-highlight"]},renderBusinessHours:function(){},unrenderBusinessHours:function(){},getNowIndicatorUnit:function(){},renderNowIndicator:function(t){},unrenderNowIndicator:function(){},renderFill:function(t,e){},unrenderFill:function(t){var e=this.elsByFill[t];e&&(e.remove(),delete this.elsByFill[t])},renderFillSegEls:function(e,n){var i,r=this,s=this[e+"SegEl"],o="",l=[];if(n.length){for(i=0;i<n.length;i++)o+=this.fillSegHtml(e,n[i]);t(o).each(function(e,i){var o=n[e],a=t(i);s&&(a=s.call(r,o,a)),a&&(a=t(a),a.is(r.fillSegTag)&&(o.el=a,l.push(o)))})}return l},fillSegTag:"div",fillSegHtml:function(t,e){var n=this[t+"SegClasses"],i=this[t+"SegCss"],r=n?n.call(this,e):[],s=nt(i?i.call(this,e):{});return"<"+this.fillSegTag+(r.length?' class="'+r.join(" ")+'"':"")+(s?' style="'+s+'"':"")+" />"},getDayClasses:function(t,e){var n=this.view,i=n.calendar.getNow(),r=["fc-"+_t[t.day()]];return 1==n.intervalDuration.as("months")&&t.month()!=n.intervalStart.month()&&r.push("fc-other-month"),t.isSame(i,"day")?(r.push("fc-today"),e!==!0&&r.push(n.highlightStateClass)):t<i?r.push("fc-past"):r.push("fc-future"),r}});le.mixin({segSelector:".fc-event-container > *",mousedOverSeg:null,isDraggingSeg:!1,isResizingSeg:!1,isDraggingExternal:!1,segs:null,renderEvents:function(t){var e,n=[],i=[];for(e=0;e<t.length;e++)(yt(t[e])?n:i).push(t[e]);this.segs=[].concat(this.renderBgEvents(n),this.renderFgEvents(i))},renderBgEvents:function(t){var e=this.eventsToSegs(t);return this.renderBgSegs(e)||e},renderFgEvents:function(t){var e=this.eventsToSegs(t);return this.renderFgSegs(e)||e},unrenderEvents:function(){this.handleSegMouseout(),this.clearDragListeners(),this.unrenderFgSegs(),this.unrenderBgSegs(),this.segs=null},getEventSegs:function(){return this.segs||[]},renderFgSegs:function(t){},unrenderFgSegs:function(){},renderFgSegEls:function(e,n){var i,r=this.view,s="",o=[];if(e.length){for(i=0;i<e.length;i++)s+=this.fgSegHtml(e[i],n);t(s).each(function(n,i){var s=e[n],l=r.resolveEventEl(s.event,t(i));l&&(l.data("fc-seg",s),s.el=l,o.push(s))})}return o},fgSegHtml:function(t,e){},renderBgSegs:function(t){return this.renderFill("bgEvent",t)},unrenderBgSegs:function(){this.unrenderFill("bgEvent")},bgEventSegEl:function(t,e){return this.view.resolveEventEl(t.event,e)},bgEventSegClasses:function(t){var e=t.event,n=e.source||{};return["fc-bgevent"].concat(e.className,n.className||[])},bgEventSegCss:function(t){return{"background-color":this.getSegSkinCss(t)["background-color"]}},businessHoursSegClasses:function(t){return["fc-nonbusiness","fc-bgevent"]},buildBusinessHourSegs:function(t,e){return this.eventsToSegs(this.buildBusinessHourEvents(t,e))},buildBusinessHourEvents:function(e,n){var i,r=this.view.calendar;return null==n&&(n=r.options.businessHours),i=r.computeBusinessHourEvents(e,n),!i.length&&n&&(i=[t.extend({},we,{start:this.view.end,end:this.view.end,dow:null})]),i},bindSegHandlers:function(){this.bindSegHandlersToEl(this.el)},bindSegHandlersToEl:function(t){this.bindSegHandlerToEl(t,"touchstart",this.handleSegTouchStart),this.bindSegHandlerToEl(t,"mouseenter",this.handleSegMouseover),this.bindSegHandlerToEl(t,"mouseleave",this.handleSegMouseout),this.bindSegHandlerToEl(t,"mousedown",this.handleSegMousedown),this.bindSegHandlerToEl(t,"click",this.handleSegClick)},bindSegHandlerToEl:function(e,n,i){var r=this;e.on(n,this.segSelector,function(e){var n=t(this).data("fc-seg");if(n&&!r.isDraggingSeg&&!r.isResizingSeg)return i.call(r,n,e)})},handleSegClick:function(t,e){var n=this.view.publiclyTrigger("eventClick",t.el[0],t.event,e);n===!1&&e.preventDefault()},handleSegMouseover:function(t,e){se.get().shouldIgnoreMouse()||this.mousedOverSeg||(this.mousedOverSeg=t,this.view.isEventResizable(t.event)&&t.el.addClass("fc-allow-mouse-resize"),this.view.publiclyTrigger("eventMouseover",t.el[0],t.event,e))},handleSegMouseout:function(t,e){e=e||{},this.mousedOverSeg&&(t=t||this.mousedOverSeg,this.mousedOverSeg=null,this.view.isEventResizable(t.event)&&t.el.removeClass("fc-allow-mouse-resize"),this.view.publiclyTrigger("eventMouseout",t.el[0],t.event,e))},handleSegMousedown:function(t,e){var n=this.startSegResize(t,e,{distance:5});!n&&this.view.isEventDraggable(t.event)&&this.buildSegDragListener(t).startInteraction(e,{distance:5})},handleSegTouchStart:function(t,e){var n,i,r=this.view,s=t.event,o=r.isEventSelected(s),l=r.isEventDraggable(s),a=r.isEventResizable(s),u=!1;o&&a&&(u=this.startSegResize(t,e)),u||!l&&!a||(i=r.opt("eventLongPressDelay"),null==i&&(i=r.opt("longPressDelay")),n=l?this.buildSegDragListener(t):this.buildSegSelectListener(t),n.startInteraction(e,{delay:o?0:i}))},startSegResize:function(e,n,i){return!!t(n.target).is(".fc-resizer")&&(this.buildSegResizeListener(e,t(n.target).is(".fc-start-resizer")).startInteraction(n,i),!0)},buildSegDragListener:function(t){var e,n,i,r=this,l=this.view,a=l.calendar,u=t.el,c=t.event;if(this.segDragListener)return this.segDragListener;var d=this.segDragListener=new re(l,{scroll:l.opt("dragScroll"),subjectEl:u,subjectCenter:!0,interactionStart:function(i){t.component=r,e=!1,n=new oe(t.el,{additionalClass:"fc-dragging",parentEl:l.el,opacity:d.isTouch?null:l.opt("dragOpacity"),revertDuration:l.opt("dragRevertDuration"),zIndex:2}),n.hide(),n.start(i)},dragStart:function(n){d.isTouch&&!l.isEventSelected(c)&&l.selectEvent(c),e=!0,r.handleSegMouseout(t,n),r.segDragStart(t,n),l.hideEvent(c)},hitOver:function(e,o,u){var h;t.hit&&(u=t.hit),i=r.computeEventDrop(u.component.getHitSpan(u),e.component.getHitSpan(e),c),i&&!a.isEventSpanAllowed(r.eventToSpan(i),c)&&(s(),i=null),i&&(h=l.renderDrag(i,t))?(h.addClass("fc-dragging"),d.isTouch||r.applyDragOpacity(h),n.hide()):n.show(),o&&(i=null)},hitOut:function(){l.unrenderDrag(),n.show(),i=null},hitDone:function(){o()},interactionEnd:function(s){delete t.component,n.stop(!i,function(){e&&(l.unrenderDrag(),r.segDragStop(t,s)),i?l.reportSegDrop(t,i,r.largeUnit,u,s):l.showEvent(c)}),r.segDragListener=null}});return d},buildSegSelectListener:function(t){var e=this,n=this.view,i=t.event;if(this.segDragListener)return this.segDragListener;var r=this.segDragListener=new ie({dragStart:function(t){r.isTouch&&!n.isEventSelected(i)&&n.selectEvent(i)},interactionEnd:function(t){e.segDragListener=null}});return r},segDragStart:function(t,e){this.isDraggingSeg=!0,this.view.publiclyTrigger("eventDragStart",t.el[0],t.event,e,{})},segDragStop:function(t,e){this.isDraggingSeg=!1,this.view.publiclyTrigger("eventDragStop",t.el[0],t.event,e,{})},computeEventDrop:function(t,e,n){var i,r,s=this.view.calendar,o=t.start,l=e.start;return o.hasTime()===l.hasTime()?(i=this.diffDates(l,o),n.allDay&&W(i)?(r={start:n.start.clone(),end:s.getEventEnd(n),allDay:!1},s.normalizeEventTimes(r)):r=mt(n),r.start.add(i),r.end&&r.end.add(i)):r={start:l.clone(),end:null,allDay:!l.hasTime()},r},applyDragOpacity:function(t){var e=this.view.opt("dragOpacity");null!=e&&t.css("opacity",e)},externalDragStart:function(e,n){var i,r,s=this.view;s.opt("droppable")&&(i=t((n?n.item:null)||e.target),r=s.opt("dropAccept"),(t.isFunction(r)?r.call(i[0],i):i.is(r))&&(this.isDraggingExternal||this.listenToExternalDrag(i,e,n)))},listenToExternalDrag:function(t,e,n){var i,r=this,l=this.view.calendar,a=Dt(t),u=r.externalDragListener=new re(this,{interactionStart:function(){r.isDraggingExternal=!0},hitOver:function(t){i=r.computeExternalDrop(t.component.getHitSpan(t),a),i&&!l.isExternalSpanAllowed(r.eventToSpan(i),i,a.eventProps)&&(s(),i=null),i&&r.renderDrag(i)},hitOut:function(){i=null},hitDone:function(){o(),r.unrenderDrag()},interactionEnd:function(e){i&&r.view.reportExternalDrop(a,i,t,e,n),r.isDraggingExternal=!1,r.externalDragListener=null}});u.startDrag(e)},computeExternalDrop:function(t,e){var n=this.view.calendar,i={start:n.applyTimezone(t.start),end:null};return e.startTime&&!i.start.hasTime()&&i.start.time(e.startTime),e.duration&&(i.end=i.start.clone().add(e.duration)),i},renderDrag:function(t,e){},unrenderDrag:function(){},buildSegResizeListener:function(t,e){var n,i,r=this,l=this.view,a=l.calendar,u=t.el,c=t.event,d=a.getEventEnd(c),h=this.segResizeListener=new re(this,{scroll:l.opt("dragScroll"),subjectEl:u,interactionStart:function(){n=!1},dragStart:function(e){n=!0,r.handleSegMouseout(t,e),r.segResizeStart(t,e)},hitOver:function(n,o,u){var h=r.getHitSpan(u),f=r.getHitSpan(n);i=e?r.computeEventStartResize(h,f,c):r.computeEventEndResize(h,f,c),i&&(a.isEventSpanAllowed(r.eventToSpan(i),c)?i.start.isSame(c.start.clone().stripZone())&&i.end.isSame(d.clone().stripZone())&&(i=null):(s(),i=null)),i&&(l.hideEvent(c),r.renderEventResize(i,t))},hitOut:function(){i=null,l.showEvent(c)},hitDone:function(){r.unrenderEventResize(),o()},interactionEnd:function(e){n&&r.segResizeStop(t,e),i?l.reportSegResize(t,i,r.largeUnit,u,e):l.showEvent(c),r.segResizeListener=null}});return h},segResizeStart:function(t,e){this.isResizingSeg=!0,this.view.publiclyTrigger("eventResizeStart",t.el[0],t.event,e,{})},segResizeStop:function(t,e){this.isResizingSeg=!1,this.view.publiclyTrigger("eventResizeStop",t.el[0],t.event,e,{})},computeEventStartResize:function(t,e,n){return this.computeEventResize("start",t,e,n)},computeEventEndResize:function(t,e,n){return this.computeEventResize("end",t,e,n)},computeEventResize:function(t,e,n,i){var r,s,o=this.view.calendar,l=this.diffDates(n[t],e[t]);return r={start:i.start.clone(),end:o.getEventEnd(i),allDay:i.allDay},r.allDay&&W(l)&&(r.allDay=!1,o.normalizeEventTimes(r)),r[t].add(l),r.start.isBefore(r.end)||(s=this.minResizeDuration||(i.allDay?o.defaultAllDayEventDuration:o.defaultTimedEventDuration),"start"==t?r.start=r.end.clone().subtract(s):r.end=r.start.clone().add(s)),
+r},renderEventResize:function(t,e){},unrenderEventResize:function(){},getEventTimeText:function(t,e,n){return null==e&&(e=this.eventTimeFormat),null==n&&(n=this.displayEventEnd),this.displayEventTime&&t.start.hasTime()?n&&t.end?this.view.formatRange(t,e):t.start.format(e):""},getSegClasses:function(t,e,n){var i=this.view,r=["fc-event",t.isStart?"fc-start":"fc-not-start",t.isEnd?"fc-end":"fc-not-end"].concat(this.getSegCustomClasses(t));return e&&r.push("fc-draggable"),n&&r.push("fc-resizable"),i.isEventSelected(t.event)&&r.push("fc-selected"),r},getSegCustomClasses:function(t){var e=t.event;return[].concat(e.className,e.source?e.source.className:[])},getSegSkinCss:function(t){return{"background-color":this.getSegBackgroundColor(t),"border-color":this.getSegBorderColor(t),color:this.getSegTextColor(t)}},getSegBackgroundColor:function(t){return t.event.backgroundColor||t.event.color||this.getSegDefaultBackgroundColor(t)},getSegDefaultBackgroundColor:function(t){var e=t.event.source||{};return e.backgroundColor||e.color||this.view.opt("eventBackgroundColor")||this.view.opt("eventColor")},getSegBorderColor:function(t){return t.event.borderColor||t.event.color||this.getSegDefaultBorderColor(t)},getSegDefaultBorderColor:function(t){var e=t.event.source||{};return e.borderColor||e.color||this.view.opt("eventBorderColor")||this.view.opt("eventColor")},getSegTextColor:function(t){return t.event.textColor||this.getSegDefaultTextColor(t)},getSegDefaultTextColor:function(t){var e=t.event.source||{};return e.textColor||this.view.opt("eventTextColor")},eventToSegs:function(t){return this.eventsToSegs([t])},eventToSpan:function(t){return this.eventToSpans(t)[0]},eventToSpans:function(t){var e=this.eventToRange(t);return this.eventRangeToSpans(e,t)},eventsToSegs:function(e,n){var i=this,r=Et(e),s=[];return t.each(r,function(t,e){var r,o=[];for(r=0;r<e.length;r++)o.push(i.eventToRange(e[r]));if(St(e[0]))for(o=i.invertRanges(o),r=0;r<o.length;r++)s.push.apply(s,i.eventRangeToSegs(o[r],e[0],n));else for(r=0;r<o.length;r++)s.push.apply(s,i.eventRangeToSegs(o[r],e[r],n))}),s},eventToRange:function(t){var e=this.view.calendar,n=t.start.clone().stripZone(),i=(t.end?t.end.clone():e.getDefaultEventEnd(null!=t.allDay?t.allDay:!t.start.hasTime(),t.start)).stripZone();return e.localizeMoment(n),e.localizeMoment(i),{start:n,end:i}},eventRangeToSegs:function(t,e,n){var i,r=this.eventRangeToSpans(t,e),s=[];for(i=0;i<r.length;i++)s.push.apply(s,this.eventSpanToSegs(r[i],e,n));return s},eventRangeToSpans:function(e,n){return[t.extend({},e)]},eventSpanToSegs:function(t,e,n){var i,r,s=n?n(t):this.spanToSegs(t);for(i=0;i<s.length;i++)r=s[i],r.event=e,r.eventStartMS=+t.start,r.eventDurationMS=t.end-t.start;return s},invertRanges:function(t){var e,n,i=this.view,r=i.start.clone(),s=i.end.clone(),o=[],l=r;for(t.sort(bt),e=0;e<t.length;e++)n=t[e],n.start>l&&o.push({start:l,end:n.start}),l=n.end;return l<s&&o.push({start:l,end:s}),o},sortEventSegs:function(t){t.sort(lt(this,"compareEventSegs"))},compareEventSegs:function(t,e){return t.eventStartMS-e.eventStartMS||e.eventDurationMS-t.eventDurationMS||e.event.allDay-t.event.allDay||M(t.event,e.event,this.view.eventOrderSpecs)}}),Ot.pluckEventDateProps=mt,Ot.isBgEvent=yt,Ot.dataAttrPrefix="";var ae=Ot.DayTableMixin={breakOnWeeks:!1,dayDates:null,dayIndices:null,daysPerRow:null,rowCnt:null,colCnt:null,colHeadFormat:null,updateDayTable:function(){for(var t,e,n,i=this.view,r=this.start.clone(),s=-1,o=[],l=[];r.isBefore(this.end);)i.isHiddenDay(r)?o.push(s+.5):(s++,o.push(s),l.push(r.clone())),r.add(1,"days");if(this.breakOnWeeks){for(e=l[0].day(),t=1;t<l.length&&l[t].day()!=e;t++);n=Math.ceil(l.length/t)}else n=1,t=l.length;this.dayDates=l,this.dayIndices=o,this.daysPerRow=t,this.rowCnt=n,this.updateDayTableCols()},updateDayTableCols:function(){this.colCnt=this.computeColCnt(),this.colHeadFormat=this.view.opt("columnFormat")||this.computeColHeadFormat()},computeColCnt:function(){return this.daysPerRow},getCellDate:function(t,e){return this.dayDates[this.getCellDayIndex(t,e)].clone()},getCellRange:function(t,e){var n=this.getCellDate(t,e),i=n.clone().add(1,"days");return{start:n,end:i}},getCellDayIndex:function(t,e){return t*this.daysPerRow+this.getColDayIndex(e)},getColDayIndex:function(t){return this.isRTL?this.colCnt-1-t:t},getDateDayIndex:function(t){var e=this.dayIndices,n=t.diff(this.start,"days");return n<0?e[0]-1:n>=e.length?e[e.length-1]+1:e[n]},computeColHeadFormat:function(){return this.rowCnt>1||this.colCnt>10?"ddd":this.colCnt>1?this.view.opt("dayOfMonthFormat"):"dddd"},sliceRangeByRow:function(t){var e,n,i,r,s,o=this.daysPerRow,l=this.view.computeDayRange(t),a=this.getDateDayIndex(l.start),u=this.getDateDayIndex(l.end.clone().subtract(1,"days")),c=[];for(e=0;e<this.rowCnt;e++)n=e*o,i=n+o-1,r=Math.max(a,n),s=Math.min(u,i),r=Math.ceil(r),s=Math.floor(s),r<=s&&c.push({row:e,firstRowDayIndex:r-n,lastRowDayIndex:s-n,isStart:r===a,isEnd:s===u});return c},sliceRangeByDay:function(t){var e,n,i,r,s,o,l=this.daysPerRow,a=this.view.computeDayRange(t),u=this.getDateDayIndex(a.start),c=this.getDateDayIndex(a.end.clone().subtract(1,"days")),d=[];for(e=0;e<this.rowCnt;e++)for(n=e*l,i=n+l-1,r=n;r<=i;r++)s=Math.max(u,r),o=Math.min(c,r),s=Math.ceil(s),o=Math.floor(o),s<=o&&d.push({row:e,firstRowDayIndex:s-n,lastRowDayIndex:o-n,isStart:s===u,isEnd:o===c});return d},renderHeadHtml:function(){var t=this.view;return'<div class="fc-row '+t.widgetHeaderClass+'"><table><thead>'+this.renderHeadTrHtml()+"</thead></table></div>"},renderHeadIntroHtml:function(){return this.renderIntroHtml()},renderHeadTrHtml:function(){return"<tr>"+(this.isRTL?"":this.renderHeadIntroHtml())+this.renderHeadDateCellsHtml()+(this.isRTL?this.renderHeadIntroHtml():"")+"</tr>"},renderHeadDateCellsHtml:function(){var t,e,n=[];for(t=0;t<this.colCnt;t++)e=this.getCellDate(0,t),n.push(this.renderHeadDateCellHtml(e));return n.join("")},renderHeadDateCellHtml:function(t,e,n){var i=this.view,r=["fc-day-header",i.widgetHeaderClass];return 1===this.rowCnt?r=r.concat(this.getDayClasses(t,!0)):r.push("fc-"+_t[t.day()]),'<th class="'+r.join(" ")+'"'+(1===this.rowCnt?' data-date="'+t.format("YYYY-MM-DD")+'"':"")+(e>1?' colspan="'+e+'"':"")+(n?" "+n:"")+">"+i.buildGotoAnchorHtml({date:t,forceOff:this.rowCnt>1||1===this.colCnt},tt(t.format(this.colHeadFormat)))+"</th>"},renderBgTrHtml:function(t){return"<tr>"+(this.isRTL?"":this.renderBgIntroHtml(t))+this.renderBgCellsHtml(t)+(this.isRTL?this.renderBgIntroHtml(t):"")+"</tr>"},renderBgIntroHtml:function(t){return this.renderIntroHtml()},renderBgCellsHtml:function(t){var e,n,i=[];for(e=0;e<this.colCnt;e++)n=this.getCellDate(t,e),i.push(this.renderBgCellHtml(n));return i.join("")},renderBgCellHtml:function(t,e){var n=this.view,i=this.getDayClasses(t);return i.unshift("fc-day",n.widgetContentClass),'<td class="'+i.join(" ")+'" data-date="'+t.format("YYYY-MM-DD")+'"'+(e?" "+e:"")+"></td>"},renderIntroHtml:function(){},bookendCells:function(t){var e=this.renderIntroHtml();e&&(this.isRTL?t.append(e):t.prepend(e))}},ue=Ot.DayGrid=le.extend(ae,{numbersVisible:!1,bottomCoordPadding:0,rowEls:null,cellEls:null,helperEls:null,rowCoordCache:null,colCoordCache:null,renderDates:function(t){var e,n,i=this.view,r=this.rowCnt,s=this.colCnt,o="";for(e=0;e<r;e++)o+=this.renderDayRowHtml(e,t);for(this.el.html(o),this.rowEls=this.el.find(".fc-row"),this.cellEls=this.el.find(".fc-day"),this.rowCoordCache=new ne({els:this.rowEls,isVertical:!0}),this.colCoordCache=new ne({els:this.cellEls.slice(0,this.colCnt),isHorizontal:!0}),e=0;e<r;e++)for(n=0;n<s;n++)i.publiclyTrigger("dayRender",null,this.getCellDate(e,n),this.getCellEl(e,n))},unrenderDates:function(){this.removeSegPopover()},renderBusinessHours:function(){var t=this.buildBusinessHourSegs(!0);this.renderFill("businessHours",t,"bgevent")},unrenderBusinessHours:function(){this.unrenderFill("businessHours")},renderDayRowHtml:function(t,e){var n=this.view,i=["fc-row","fc-week",n.widgetContentClass];return e&&i.push("fc-rigid"),'<div class="'+i.join(" ")+'"><div class="fc-bg"><table>'+this.renderBgTrHtml(t)+'</table></div><div class="fc-content-skeleton"><table>'+(this.numbersVisible?"<thead>"+this.renderNumberTrHtml(t)+"</thead>":"")+"</table></div></div>"},renderNumberTrHtml:function(t){return"<tr>"+(this.isRTL?"":this.renderNumberIntroHtml(t))+this.renderNumberCellsHtml(t)+(this.isRTL?this.renderNumberIntroHtml(t):"")+"</tr>"},renderNumberIntroHtml:function(t){return this.renderIntroHtml()},renderNumberCellsHtml:function(t){var e,n,i=[];for(e=0;e<this.colCnt;e++)n=this.getCellDate(t,e),i.push(this.renderNumberCellHtml(n));return i.join("")},renderNumberCellHtml:function(t){var e,n,i="";return this.view.dayNumbersVisible||this.view.cellWeekNumbersVisible?(e=this.getDayClasses(t),e.unshift("fc-day-top"),this.view.cellWeekNumbersVisible&&(n="ISO"===t._locale._fullCalendar_weekCalc?1:t._locale.firstDayOfWeek()),i+='<td class="'+e.join(" ")+'" data-date="'+t.format()+'">',this.view.cellWeekNumbersVisible&&t.day()==n&&(i+=this.view.buildGotoAnchorHtml({date:t,type:"week"},{class:"fc-week-number"},t.format("w"))),this.view.dayNumbersVisible&&(i+=this.view.buildGotoAnchorHtml(t,{class:"fc-day-number"},t.date())),i+="</td>"):"<td/>"},computeEventTimeFormat:function(){return this.view.opt("extraSmallTimeFormat")},computeDisplayEventEnd:function(){return 1==this.colCnt},rangeUpdated:function(){this.updateDayTable()},spanToSegs:function(t){var e,n,i=this.sliceRangeByRow(t);for(e=0;e<i.length;e++)n=i[e],this.isRTL?(n.leftCol=this.daysPerRow-1-n.lastRowDayIndex,n.rightCol=this.daysPerRow-1-n.firstRowDayIndex):(n.leftCol=n.firstRowDayIndex,n.rightCol=n.lastRowDayIndex);return i},prepareHits:function(){this.colCoordCache.build(),this.rowCoordCache.build(),this.rowCoordCache.bottoms[this.rowCnt-1]+=this.bottomCoordPadding},releaseHits:function(){this.colCoordCache.clear(),this.rowCoordCache.clear()},queryHit:function(t,e){if(this.colCoordCache.isLeftInBounds(t)&&this.rowCoordCache.isTopInBounds(e)){var n=this.colCoordCache.getHorizontalIndex(t),i=this.rowCoordCache.getVerticalIndex(e);if(null!=i&&null!=n)return this.getCellHit(i,n)}},getHitSpan:function(t){return this.getCellRange(t.row,t.col)},getHitEl:function(t){return this.getCellEl(t.row,t.col)},getCellHit:function(t,e){return{row:t,col:e,component:this,left:this.colCoordCache.getLeftOffset(e),right:this.colCoordCache.getRightOffset(e),top:this.rowCoordCache.getTopOffset(t),bottom:this.rowCoordCache.getBottomOffset(t)}},getCellEl:function(t,e){return this.cellEls.eq(t*this.colCnt+e)},renderDrag:function(t,e){if(this.renderHighlight(this.eventToSpan(t)),e&&e.component!==this)return this.renderEventLocationHelper(t,e)},unrenderDrag:function(){this.unrenderHighlight(),this.unrenderHelper()},renderEventResize:function(t,e){return this.renderHighlight(this.eventToSpan(t)),this.renderEventLocationHelper(t,e)},unrenderEventResize:function(){this.unrenderHighlight(),this.unrenderHelper()},renderHelper:function(e,n){var i,r=[],s=this.eventToSegs(e);return s=this.renderFgSegEls(s),i=this.renderSegRows(s),this.rowEls.each(function(e,s){var o,l=t(s),a=t('<div class="fc-helper-skeleton"><table/></div>');o=n&&n.row===e?n.el.position().top:l.find(".fc-content-skeleton tbody").position().top,a.css("top",o).find("table").append(i[e].tbodyEl),l.append(a),r.push(a[0])}),this.helperEls=t(r)},unrenderHelper:function(){this.helperEls&&(this.helperEls.remove(),this.helperEls=null)},fillSegTag:"td",renderFill:function(e,n,i){var r,s,o,l=[];for(n=this.renderFillSegEls(e,n),r=0;r<n.length;r++)s=n[r],o=this.renderFillRow(e,s,i),this.rowEls.eq(s.row).append(o),l.push(o[0]);return this.elsByFill[e]=t(l),n},renderFillRow:function(e,n,i){var r,s,o=this.colCnt,l=n.leftCol,a=n.rightCol+1;return i=i||e.toLowerCase(),r=t('<div class="fc-'+i+'-skeleton"><table><tr/></table></div>'),s=r.find("tr"),l>0&&s.append('<td colspan="'+l+'"/>'),s.append(n.el.attr("colspan",a-l)),a<o&&s.append('<td colspan="'+(o-a)+'"/>'),this.bookendCells(s),r}});ue.mixin({rowStructs:null,unrenderEvents:function(){this.removeSegPopover(),le.prototype.unrenderEvents.apply(this,arguments)},getEventSegs:function(){return le.prototype.getEventSegs.call(this).concat(this.popoverSegs||[])},renderBgSegs:function(e){var n=t.grep(e,function(t){return t.event.allDay});return le.prototype.renderBgSegs.call(this,n)},renderFgSegs:function(e){var n;return e=this.renderFgSegEls(e),n=this.rowStructs=this.renderSegRows(e),this.rowEls.each(function(e,i){t(i).find(".fc-content-skeleton > table").append(n[e].tbodyEl)}),e},unrenderFgSegs:function(){for(var t,e=this.rowStructs||[];t=e.pop();)t.tbodyEl.remove();this.rowStructs=null},renderSegRows:function(t){var e,n,i=[];for(e=this.groupSegRows(t),n=0;n<e.length;n++)i.push(this.renderSegRow(n,e[n]));return i},fgSegHtml:function(t,e){var n,i,r=this.view,s=t.event,o=r.isEventDraggable(s),l=!e&&s.allDay&&t.isStart&&r.isEventResizableFromStart(s),a=!e&&s.allDay&&t.isEnd&&r.isEventResizableFromEnd(s),u=this.getSegClasses(t,o,l||a),c=nt(this.getSegSkinCss(t)),d="";return u.unshift("fc-day-grid-event","fc-h-event"),t.isStart&&(n=this.getEventTimeText(s),n&&(d='<span class="fc-time">'+tt(n)+"</span>")),i='<span class="fc-title">'+(tt(s.title||"")||"&nbsp;")+"</span>",'<a class="'+u.join(" ")+'"'+(s.url?' href="'+tt(s.url)+'"':"")+(c?' style="'+c+'"':"")+'><div class="fc-content">'+(this.isRTL?i+" "+d:d+" "+i)+"</div>"+(l?'<div class="fc-resizer fc-start-resizer" />':"")+(a?'<div class="fc-resizer fc-end-resizer" />':"")+"</a>"},renderSegRow:function(e,n){function i(e){for(;o<e;)c=(m[r-1]||[])[o],c?c.attr("rowspan",parseInt(c.attr("rowspan")||1,10)+1):(c=t("<td/>"),l.append(c)),v[r][o]=c,m[r][o]=c,o++}var r,s,o,l,a,u,c,d=this.colCnt,h=this.buildSegLevels(n),f=Math.max(1,h.length),g=t("<tbody/>"),p=[],v=[],m=[];for(r=0;r<f;r++){if(s=h[r],o=0,l=t("<tr/>"),p.push([]),v.push([]),m.push([]),s)for(a=0;a<s.length;a++){for(u=s[a],i(u.leftCol),c=t('<td class="fc-event-container"/>').append(u.el),u.leftCol!=u.rightCol?c.attr("colspan",u.rightCol-u.leftCol+1):m[r][o]=c;o<=u.rightCol;)v[r][o]=c,p[r][o]=u,o++;l.append(c)}i(d),this.bookendCells(l),g.append(l)}return{row:e,tbodyEl:g,cellMatrix:v,segMatrix:p,segLevels:h,segs:n}},buildSegLevels:function(t){var e,n,i,r=[];for(this.sortEventSegs(t),e=0;e<t.length;e++){for(n=t[e],i=0;i<r.length&&Tt(n,r[i]);i++);n.level=i,(r[i]||(r[i]=[])).push(n)}for(i=0;i<r.length;i++)r[i].sort(Ct);return r},groupSegRows:function(t){var e,n=[];for(e=0;e<this.rowCnt;e++)n.push([]);for(e=0;e<t.length;e++)n[t[e].row].push(t[e]);return n}}),ue.mixin({segPopover:null,popoverSegs:null,removeSegPopover:function(){this.segPopover&&this.segPopover.hide()},limitRows:function(t){var e,n,i=this.rowStructs||[];for(e=0;e<i.length;e++)this.unlimitRow(e),n=!!t&&("number"==typeof t?t:this.computeRowLevelLimit(e)),n!==!1&&this.limitRow(e,n)},computeRowLevelLimit:function(e){function n(e,n){s=Math.max(s,t(n).outerHeight())}var i,r,s,o=this.rowEls.eq(e),l=o.height(),a=this.rowStructs[e].tbodyEl.children();for(i=0;i<a.length;i++)if(r=a.eq(i).removeClass("fc-limited"),s=0,r.find("> td > :first-child").each(n),r.position().top+s>l)return i;return!1},limitRow:function(e,n){function i(i){for(;b<i;)u=S.getCellSegs(e,b,n),u.length&&(h=s[n-1][b],y=S.renderMoreLink(e,b,u),m=t("<div/>").append(y),h.append(m),E.push(m[0])),b++}var r,s,o,l,a,u,c,d,h,f,g,p,v,m,y,S=this,w=this.rowStructs[e],E=[],b=0;if(n&&n<w.segLevels.length){for(r=w.segLevels[n-1],s=w.cellMatrix,o=w.tbodyEl.children().slice(n).addClass("fc-limited").get(),l=0;l<r.length;l++){for(a=r[l],i(a.leftCol),d=[],c=0;b<=a.rightCol;)u=this.getCellSegs(e,b,n),d.push(u),c+=u.length,b++;if(c){for(h=s[n-1][a.leftCol],f=h.attr("rowspan")||1,g=[],p=0;p<d.length;p++)v=t('<td class="fc-more-cell"/>').attr("rowspan",f),u=d[p],y=this.renderMoreLink(e,a.leftCol+p,[a].concat(u)),m=t("<div/>").append(y),v.append(m),g.push(v[0]),E.push(v[0]);h.addClass("fc-limited").after(t(g)),o.push(h[0])}}i(this.colCnt),w.moreEls=t(E),w.limitedEls=t(o)}},unlimitRow:function(t){var e=this.rowStructs[t];e.moreEls&&(e.moreEls.remove(),e.moreEls=null),e.limitedEls&&(e.limitedEls.removeClass("fc-limited"),e.limitedEls=null)},renderMoreLink:function(e,n,i){var r=this,s=this.view;return t('<a class="fc-more"/>').text(this.getMoreLinkText(i.length)).on("click",function(o){var l=s.opt("eventLimitClick"),a=r.getCellDate(e,n),u=t(this),c=r.getCellEl(e,n),d=r.getCellSegs(e,n),h=r.resliceDaySegs(d,a),f=r.resliceDaySegs(i,a);"function"==typeof l&&(l=s.publiclyTrigger("eventLimitClick",null,{date:a,dayEl:c,moreEl:u,segs:h,hiddenSegs:f},o)),"popover"===l?r.showSegPopover(e,n,u,h):"string"==typeof l&&s.calendar.zoomTo(a,l)})},showSegPopover:function(t,e,n,i){var r,s,o=this,l=this.view,a=n.parent();r=1==this.rowCnt?l.el:this.rowEls.eq(t),s={className:"fc-more-popover",content:this.renderSegPopoverContent(t,e,i),parentEl:this.view.el,top:r.offset().top,autoHide:!0,viewportConstrain:l.opt("popoverViewportConstrain"),hide:function(){if(o.popoverSegs)for(var t,e=0;e<o.popoverSegs.length;++e)t=o.popoverSegs[e],l.publiclyTrigger("eventDestroy",t.event,t.event,t.el);o.segPopover.removeElement(),o.segPopover=null,o.popoverSegs=null}},this.isRTL?s.right=a.offset().left+a.outerWidth()+1:s.left=a.offset().left-1,this.segPopover=new ee(s),this.segPopover.show(),this.bindSegHandlersToEl(this.segPopover.el)},renderSegPopoverContent:function(e,n,i){var r,s=this.view,o=s.opt("theme"),l=this.getCellDate(e,n).format(s.opt("dayPopoverFormat")),a=t('<div class="fc-header '+s.widgetHeaderClass+'"><span class="fc-close '+(o?"ui-icon ui-icon-closethick":"fc-icon fc-icon-x")+'"></span><span class="fc-title">'+tt(l)+'</span><div class="fc-clear"/></div><div class="fc-body '+s.widgetContentClass+'"><div class="fc-event-container"></div></div>'),u=a.find(".fc-event-container");for(i=this.renderFgSegEls(i,!0),this.popoverSegs=i,r=0;r<i.length;r++)this.hitsNeeded(),i[r].hit=this.getCellHit(e,n),this.hitsNotNeeded(),u.append(i[r].el);return a},resliceDaySegs:function(e,n){var i=t.map(e,function(t){return t.event}),r=n.clone(),s=r.clone().add(1,"days"),o={start:r,end:s};return e=this.eventsToSegs(i,function(t){var e=F(t,o);return e?[e]:[]}),this.sortEventSegs(e),e},getMoreLinkText:function(t){var e=this.view.opt("eventLimitText");return"function"==typeof e?e(t):"+"+t+" "+e},getCellSegs:function(t,e,n){for(var i,r=this.rowStructs[t].segMatrix,s=n||0,o=[];s<r.length;)i=r[s][e],i&&o.push(i),s++;return o}});var ce=Ot.TimeGrid=le.extend(ae,{slotDuration:null,snapDuration:null,snapsPerSlot:null,minTime:null,maxTime:null,labelFormat:null,labelInterval:null,colEls:null,slatContainerEl:null,slatEls:null,nowIndicatorEls:null,colCoordCache:null,slatCoordCache:null,constructor:function(){le.apply(this,arguments),this.processOptions()},renderDates:function(){this.el.html(this.renderHtml()),this.colEls=this.el.find(".fc-day"),this.slatContainerEl=this.el.find(".fc-slats"),this.slatEls=this.slatContainerEl.find("tr"),this.colCoordCache=new ne({els:this.colEls,isHorizontal:!0}),this.slatCoordCache=new ne({els:this.slatEls,isVertical:!0}),this.renderContentSkeleton()},renderHtml:function(){return'<div class="fc-bg"><table>'+this.renderBgTrHtml(0)+'</table></div><div class="fc-slats"><table>'+this.renderSlatRowHtml()+"</table></div>"},renderSlatRowHtml:function(){for(var t,n,i,r=this.view,s=this.isRTL,o="",l=e.duration(+this.minTime);l<this.maxTime;)t=this.start.clone().time(l),n=ot(_(l,this.labelInterval)),i='<td class="fc-axis fc-time '+r.widgetContentClass+'" '+r.axisStyleAttr()+">"+(n?"<span>"+tt(t.format(this.labelFormat))+"</span>":"")+"</td>",o+='<tr data-time="'+t.format("HH:mm:ss")+'"'+(n?"":' class="fc-minor"')+">"+(s?"":i)+'<td class="'+r.widgetContentClass+'"/>'+(s?i:"")+"</tr>",l.add(this.slotDuration);return o},processOptions:function(){var n,i=this.view,r=i.opt("slotDuration"),s=i.opt("snapDuration");r=e.duration(r),s=s?e.duration(s):r,this.slotDuration=r,this.snapDuration=s,this.snapsPerSlot=r/s,this.minResizeDuration=s,this.minTime=e.duration(i.opt("minTime")),this.maxTime=e.duration(i.opt("maxTime")),n=i.opt("slotLabelFormat"),t.isArray(n)&&(n=n[n.length-1]),this.labelFormat=n||i.opt("smallTimeFormat"),n=i.opt("slotLabelInterval"),this.labelInterval=n?e.duration(n):this.computeLabelInterval(r)},computeLabelInterval:function(t){var n,i,r;for(n=Re.length-1;n>=0;n--)if(i=e.duration(Re[n]),r=_(i,t),ot(r)&&r>1)return i;return e.duration(t)},computeEventTimeFormat:function(){return this.view.opt("noMeridiemTimeFormat")},computeDisplayEventEnd:function(){return!0},prepareHits:function(){this.colCoordCache.build(),this.slatCoordCache.build()},releaseHits:function(){this.colCoordCache.clear()},queryHit:function(t,e){var n=this.snapsPerSlot,i=this.colCoordCache,r=this.slatCoordCache;if(i.isLeftInBounds(t)&&r.isTopInBounds(e)){var s=i.getHorizontalIndex(t),o=r.getVerticalIndex(e);if(null!=s&&null!=o){var l=r.getTopOffset(o),a=r.getHeight(o),u=(e-l)/a,c=Math.floor(u*n),d=o*n+c,h=l+c/n*a,f=l+(c+1)/n*a;return{col:s,snap:d,component:this,left:i.getLeftOffset(s),right:i.getRightOffset(s),top:h,bottom:f}}}},getHitSpan:function(t){var e,n=this.getCellDate(0,t.col),i=this.computeSnapTime(t.snap);return n.time(i),e=n.clone().add(this.snapDuration),{start:n,end:e}},getHitEl:function(t){return this.colEls.eq(t.col)},rangeUpdated:function(){this.updateDayTable()},computeSnapTime:function(t){return e.duration(this.minTime+this.snapDuration*t)},spanToSegs:function(t){var e,n=this.sliceRangeByTimes(t);for(e=0;e<n.length;e++)this.isRTL?n[e].col=this.daysPerRow-1-n[e].dayIndex:n[e].col=n[e].dayIndex;return n},sliceRangeByTimes:function(t){var e,n,i,r,s=[];for(n=0;n<this.daysPerRow;n++)i=this.dayDates[n].clone(),r={start:i.clone().time(this.minTime),end:i.clone().time(this.maxTime)},e=F(t,r),e&&(e.dayIndex=n,s.push(e));return s},updateSize:function(t){this.slatCoordCache.build(),t&&this.updateSegVerticals([].concat(this.fgSegs||[],this.bgSegs||[],this.businessSegs||[]))},getTotalSlatHeight:function(){return this.slatContainerEl.outerHeight()},computeDateTop:function(t,n){return this.computeTimeTop(e.duration(t-n.clone().stripTime()))},computeTimeTop:function(t){var e,n,i=this.slatEls.length,r=(t-this.minTime)/this.slotDuration;return r=Math.max(0,r),r=Math.min(i,r),e=Math.floor(r),e=Math.min(e,i-1),n=r-e,this.slatCoordCache.getTopPosition(e)+this.slatCoordCache.getHeight(e)*n},renderDrag:function(t,e){return e?this.renderEventLocationHelper(t,e):void this.renderHighlight(this.eventToSpan(t))},unrenderDrag:function(){this.unrenderHelper(),this.unrenderHighlight()},renderEventResize:function(t,e){return this.renderEventLocationHelper(t,e)},unrenderEventResize:function(){this.unrenderHelper()},renderHelper:function(t,e){return this.renderHelperSegs(this.eventToSegs(t),e)},unrenderHelper:function(){this.unrenderHelperSegs()},renderBusinessHours:function(){this.renderBusinessSegs(this.buildBusinessHourSegs())},unrenderBusinessHours:function(){this.unrenderBusinessSegs()},getNowIndicatorUnit:function(){return"minute"},renderNowIndicator:function(e){var n,i=this.spanToSegs({start:e,end:e}),r=this.computeDateTop(e,e),s=[];for(n=0;n<i.length;n++)s.push(t('<div class="fc-now-indicator fc-now-indicator-line"></div>').css("top",r).appendTo(this.colContainerEls.eq(i[n].col))[0]);i.length>0&&s.push(t('<div class="fc-now-indicator fc-now-indicator-arrow"></div>').css("top",r).appendTo(this.el.find(".fc-content-skeleton"))[0]),this.nowIndicatorEls=t(s)},unrenderNowIndicator:function(){this.nowIndicatorEls&&(this.nowIndicatorEls.remove(),this.nowIndicatorEls=null)},renderSelection:function(t){this.view.opt("selectHelper")?this.renderEventLocationHelper(t):this.renderHighlight(t)},unrenderSelection:function(){this.unrenderHelper(),this.unrenderHighlight()},renderHighlight:function(t){this.renderHighlightSegs(this.spanToSegs(t))},unrenderHighlight:function(){this.unrenderHighlightSegs()}});ce.mixin({colContainerEls:null,fgContainerEls:null,bgContainerEls:null,helperContainerEls:null,highlightContainerEls:null,businessContainerEls:null,fgSegs:null,bgSegs:null,helperSegs:null,highlightSegs:null,businessSegs:null,renderContentSkeleton:function(){var e,n,i="";for(e=0;e<this.colCnt;e++)i+='<td><div class="fc-content-col"><div class="fc-event-container fc-helper-container"></div><div class="fc-event-container"></div><div class="fc-highlight-container"></div><div class="fc-bgevent-container"></div><div class="fc-business-container"></div></div></td>';n=t('<div class="fc-content-skeleton"><table><tr>'+i+"</tr></table></div>"),this.colContainerEls=n.find(".fc-content-col"),this.helperContainerEls=n.find(".fc-helper-container"),this.fgContainerEls=n.find(".fc-event-container:not(.fc-helper-container)"),this.bgContainerEls=n.find(".fc-bgevent-container"),this.highlightContainerEls=n.find(".fc-highlight-container"),this.businessContainerEls=n.find(".fc-business-container"),this.bookendCells(n.find("tr")),this.el.append(n)},renderFgSegs:function(t){return t=this.renderFgSegsIntoContainers(t,this.fgContainerEls),this.fgSegs=t,t},unrenderFgSegs:function(){this.unrenderNamedSegs("fgSegs")},renderHelperSegs:function(e,n){var i,r,s,o=[];for(e=this.renderFgSegsIntoContainers(e,this.helperContainerEls),i=0;i<e.length;i++)r=e[i],n&&n.col===r.col&&(s=n.el,r.el.css({left:s.css("left"),right:s.css("right"),"margin-left":s.css("margin-left"),"margin-right":s.css("margin-right")})),o.push(r.el[0]);return this.helperSegs=e,t(o)},unrenderHelperSegs:function(){this.unrenderNamedSegs("helperSegs")},renderBgSegs:function(t){return t=this.renderFillSegEls("bgEvent",t),this.updateSegVerticals(t),this.attachSegsByCol(this.groupSegsByCol(t),this.bgContainerEls),this.bgSegs=t,t},unrenderBgSegs:function(){this.unrenderNamedSegs("bgSegs")},renderHighlightSegs:function(t){t=this.renderFillSegEls("highlight",t),this.updateSegVerticals(t),this.attachSegsByCol(this.groupSegsByCol(t),this.highlightContainerEls),this.highlightSegs=t},unrenderHighlightSegs:function(){this.unrenderNamedSegs("highlightSegs")},renderBusinessSegs:function(t){t=this.renderFillSegEls("businessHours",t),this.updateSegVerticals(t),this.attachSegsByCol(this.groupSegsByCol(t),this.businessContainerEls),this.businessSegs=t},unrenderBusinessSegs:function(){this.unrenderNamedSegs("businessSegs")},groupSegsByCol:function(t){var e,n=[];for(e=0;e<this.colCnt;e++)n.push([]);for(e=0;e<t.length;e++)n[t[e].col].push(t[e]);return n},attachSegsByCol:function(t,e){var n,i,r;for(n=0;n<this.colCnt;n++)for(i=t[n],r=0;r<i.length;r++)e.eq(n).append(i[r].el)},unrenderNamedSegs:function(t){var e,n=this[t];if(n){for(e=0;e<n.length;e++)n[e].el.remove();this[t]=null}},renderFgSegsIntoContainers:function(t,e){var n,i;for(t=this.renderFgSegEls(t),n=this.groupSegsByCol(t),i=0;i<this.colCnt;i++)this.updateFgSegCoords(n[i]);return this.attachSegsByCol(n,e),t},fgSegHtml:function(t,e){var n,i,r,s=this.view,o=t.event,l=s.isEventDraggable(o),a=!e&&t.isStart&&s.isEventResizableFromStart(o),u=!e&&t.isEnd&&s.isEventResizableFromEnd(o),c=this.getSegClasses(t,l,a||u),d=nt(this.getSegSkinCss(t));return c.unshift("fc-time-grid-event","fc-v-event"),s.isMultiDayEvent(o)?(t.isStart||t.isEnd)&&(n=this.getEventTimeText(t),i=this.getEventTimeText(t,"LT"),r=this.getEventTimeText(t,null,!1)):(n=this.getEventTimeText(o),i=this.getEventTimeText(o,"LT"),r=this.getEventTimeText(o,null,!1)),'<a class="'+c.join(" ")+'"'+(o.url?' href="'+tt(o.url)+'"':"")+(d?' style="'+d+'"':"")+'><div class="fc-content">'+(n?'<div class="fc-time" data-start="'+tt(r)+'" data-full="'+tt(i)+'"><span>'+tt(n)+"</span></div>":"")+(o.title?'<div class="fc-title">'+tt(o.title)+"</div>":"")+'</div><div class="fc-bg"/>'+(u?'<div class="fc-resizer fc-end-resizer" />':"")+"</a>"},updateSegVerticals:function(t){this.computeSegVerticals(t),this.assignSegVerticals(t)},computeSegVerticals:function(t){var e,n;for(e=0;e<t.length;e++)n=t[e],n.top=this.computeDateTop(n.start,n.start),n.bottom=this.computeDateTop(n.end,n.start)},assignSegVerticals:function(t){var e,n;for(e=0;e<t.length;e++)n=t[e],n.el.css(this.generateSegVerticalCss(n))},generateSegVerticalCss:function(t){return{top:t.top,bottom:-t.bottom}},updateFgSegCoords:function(t){this.computeSegVerticals(t),this.computeFgSegHorizontals(t),this.assignSegVerticals(t),this.assignFgSegHorizontals(t)},computeFgSegHorizontals:function(t){var e,n,i;if(this.sortEventSegs(t),e=Ht(t),xt(e),n=e[0]){for(i=0;i<n.length;i++)Rt(n[i]);for(i=0;i<n.length;i++)this.computeFgSegForwardBack(n[i],0,0)}},computeFgSegForwardBack:function(t,e,n){var i,r=t.forwardSegs;if(void 0===t.forwardCoord)for(r.length?(this.sortForwardSegs(r),this.computeFgSegForwardBack(r[0],e+1,n),t.forwardCoord=r[0].backwardCoord):t.forwardCoord=1,t.backwardCoord=t.forwardCoord-(t.forwardCoord-n)/(e+1),i=0;i<r.length;i++)this.computeFgSegForwardBack(r[i],0,t.forwardCoord)},sortForwardSegs:function(t){t.sort(lt(this,"compareForwardSegs"))},compareForwardSegs:function(t,e){return e.forwardPressure-t.forwardPressure||(t.backwardCoord||0)-(e.backwardCoord||0)||this.compareEventSegs(t,e)},assignFgSegHorizontals:function(t){var e,n;for(e=0;e<t.length;e++)n=t[e],n.el.css(this.generateFgSegHorizontalCss(n)),n.bottom-n.top<30&&n.el.addClass("fc-short")},generateFgSegHorizontalCss:function(t){var e,n,i=this.view.opt("slotEventOverlap"),r=t.backwardCoord,s=t.forwardCoord,o=this.generateSegVerticalCss(t);return i&&(s=Math.min(1,r+2*(s-r))),this.isRTL?(e=1-s,n=r):(e=r,n=1-s),o.zIndex=t.level+1,o.left=100*e+"%",o.right=100*n+"%",i&&t.forwardPressure&&(o[this.isRTL?"marginLeft":"marginRight"]=20),o}});var de=Ot.View=ct.extend(Jt,te,{type:null,name:null,title:null,calendar:null,options:null,el:null,isDateSet:!1,isDateRendered:!1,dateRenderQueue:null,isEventsBound:!1,isEventsSet:!1,isEventsRendered:!1,eventRenderQueue:null,start:null,end:null,intervalStart:null,intervalEnd:null,intervalDuration:null,intervalUnit:null,isRTL:!1,isSelected:!1,selectedEvent:null,eventOrderSpecs:null,widgetHeaderClass:null,widgetContentClass:null,highlightStateClass:null,nextDayThreshold:null,isHiddenDayHash:null,isNowIndicatorRendered:null,initialNowDate:null,initialNowQueriedMs:null,nowIndicatorTimeoutID:null,nowIndicatorIntervalID:null,constructor:function(t,n,i,r){this.calendar=t,this.type=this.name=n,this.options=i,this.intervalDuration=r||e.duration(1,"day"),this.nextDayThreshold=e.duration(this.opt("nextDayThreshold")),this.initThemingProps(),this.initHiddenDays(),this.isRTL=this.opt("isRTL"),this.eventOrderSpecs=L(this.opt("eventOrder")),this.dateRenderQueue=new gt,this.eventRenderQueue=new gt(this.opt("eventRenderWait")),this.initialize()},initialize:function(){},opt:function(t){return this.options[t]},publiclyTrigger:function(t,e){var n=this.calendar;return n.publiclyTrigger.apply(n,[t,e||this].concat(Array.prototype.slice.call(arguments,2),[this]))},rejectOn:function(t,e){var n=this;return new ft(function(i,r){function s(){n.off(t,r)}n.one(t,r),e.then(function(t){s(),i(t)},function(){s(),r()})})},setRange:function(e){t.extend(this,e),this.updateTitle()},computeRange:function(t){var e,n,i=A(this.intervalDuration),r=t.clone().startOf(i),s=r.clone().add(this.intervalDuration);return/year|month|week|day/.test(i)?(r.stripTime(),s.stripTime()):(r.hasTime()||(r=this.calendar.time(0)),s.hasTime()||(s=this.calendar.time(0))),e=r.clone(),e=this.skipHiddenDays(e),n=s.clone(),n=this.skipHiddenDays(n,-1,!0),{intervalUnit:i,intervalStart:r,intervalEnd:s,start:e,end:n}},computePrevDate:function(t){return this.massageCurrentDate(t.clone().startOf(this.intervalUnit).subtract(this.intervalDuration),-1)},computeNextDate:function(t){return this.massageCurrentDate(t.clone().startOf(this.intervalUnit).add(this.intervalDuration))},massageCurrentDate:function(t,e){return this.intervalDuration.as("days")<=1&&this.isHiddenDay(t)&&(t=this.skipHiddenDays(t,e),t.startOf("day")),t},updateTitle:function(){this.title=this.computeTitle(),this.calendar.setToolbarsTitle(this.title)},computeTitle:function(){var t,e;return"year"===this.intervalUnit||"month"===this.intervalUnit?(t=this.intervalStart,
+e=this.intervalEnd):(t=this.start,e=this.end),this.formatRange({start:this.calendar.applyTimezone(t),end:this.calendar.applyTimezone(e)},this.opt("titleFormat")||this.computeTitleFormat(),this.opt("titleRangeSeparator"))},computeTitleFormat:function(){return"year"==this.intervalUnit?"YYYY":"month"==this.intervalUnit?this.opt("monthYearFormat"):this.intervalDuration.as("days")>1?"ll":"LL"},formatRange:function(t,e,n){var i=t.end;return i.hasTime()||(i=i.clone().subtract(1)),Xt(t.start,i,e,n,this.opt("isRTL"))},getAllDayHtml:function(){return this.opt("allDayHtml")||tt(this.opt("allDayText"))},buildGotoAnchorHtml:function(e,n,i){var r,s,o,l;return t.isPlainObject(e)?(r=e.date,s=e.type,o=e.forceOff):r=e,r=Ot.moment(r),l={date:r.format("YYYY-MM-DD"),type:s||"day"},"string"==typeof n&&(i=n,n=null),n=n?" "+it(n):"",i=i||"",!o&&this.opt("navLinks")?"<a"+n+' data-goto="'+tt(JSON.stringify(l))+'">'+i+"</a>":"<span"+n+">"+i+"</span>"},setElement:function(t){this.el=t,this.bindGlobalHandlers(),this.renderSkeleton()},removeElement:function(){this.unsetDate(),this.unrenderSkeleton(),this.unbindGlobalHandlers(),this.el.remove()},renderSkeleton:function(){},unrenderSkeleton:function(){},setDate:function(t){var e=this.isDateSet;this.isDateSet=!0,this.handleDate(t,e),this.trigger(e?"dateReset":"dateSet",t)},unsetDate:function(){this.isDateSet&&(this.isDateSet=!1,this.handleDateUnset(),this.trigger("dateUnset"))},handleDate:function(t,e){var n=this;this.unbindEvents(),this.requestDateRender(t).then(function(){n.bindEvents()})},handleDateUnset:function(){this.unbindEvents(),this.requestDateUnrender()},requestDateRender:function(t){var e=this;return this.dateRenderQueue.add(function(){return e.executeDateRender(t)})},requestDateUnrender:function(){var t=this;return this.dateRenderQueue.add(function(){return t.executeDateUnrender()})},executeDateRender:function(t){var e=this;return t?this.captureInitialScroll():this.captureScroll(),this.freezeHeight(),this.executeDateUnrender().then(function(){t&&e.setRange(e.computeRange(t)),e.render&&e.render(),e.renderDates(),e.updateSize(),e.renderBusinessHours(),e.startNowIndicator(),e.thawHeight(),e.releaseScroll(),e.isDateRendered=!0,e.onDateRender(),e.trigger("dateRender")})},executeDateUnrender:function(){var t=this;return t.isDateRendered?this.requestEventsUnrender().then(function(){t.unselect(),t.stopNowIndicator(),t.triggerUnrender(),t.unrenderBusinessHours(),t.unrenderDates(),t.destroy&&t.destroy(),t.isDateRendered=!1,t.trigger("dateUnrender")}):ft.resolve()},onDateRender:function(){this.triggerRender()},renderDates:function(){},unrenderDates:function(){},triggerRender:function(){this.publiclyTrigger("viewRender",this,this,this.el)},triggerUnrender:function(){this.publiclyTrigger("viewDestroy",this,this,this.el)},bindGlobalHandlers:function(){this.listenTo(se.get(),{touchstart:this.processUnselect,mousedown:this.handleDocumentMousedown})},unbindGlobalHandlers:function(){this.stopListeningTo(se.get())},initThemingProps:function(){var t=this.opt("theme")?"ui":"fc";this.widgetHeaderClass=t+"-widget-header",this.widgetContentClass=t+"-widget-content",this.highlightStateClass=t+"-state-highlight"},renderBusinessHours:function(){},unrenderBusinessHours:function(){},startNowIndicator:function(){var t,n,i,r=this;this.opt("nowIndicator")&&(t=this.getNowIndicatorUnit(),t&&(n=lt(this,"updateNowIndicator"),this.initialNowDate=this.calendar.getNow(),this.initialNowQueriedMs=+new Date,this.renderNowIndicator(this.initialNowDate),this.isNowIndicatorRendered=!0,i=this.initialNowDate.clone().startOf(t).add(1,t)-this.initialNowDate,this.nowIndicatorTimeoutID=setTimeout(function(){r.nowIndicatorTimeoutID=null,n(),i=+e.duration(1,t),i=Math.max(100,i),r.nowIndicatorIntervalID=setInterval(n,i)},i)))},updateNowIndicator:function(){this.isNowIndicatorRendered&&(this.unrenderNowIndicator(),this.renderNowIndicator(this.initialNowDate.clone().add(new Date-this.initialNowQueriedMs)))},stopNowIndicator:function(){this.isNowIndicatorRendered&&(this.nowIndicatorTimeoutID&&(clearTimeout(this.nowIndicatorTimeoutID),this.nowIndicatorTimeoutID=null),this.nowIndicatorIntervalID&&(clearTimeout(this.nowIndicatorIntervalID),this.nowIndicatorIntervalID=null),this.unrenderNowIndicator(),this.isNowIndicatorRendered=!1)},getNowIndicatorUnit:function(){},renderNowIndicator:function(t){},unrenderNowIndicator:function(){},updateSize:function(t){t&&this.captureScroll(),this.updateHeight(t),this.updateWidth(t),this.updateNowIndicator(),t&&this.releaseScroll()},updateWidth:function(t){},updateHeight:function(t){var e=this.calendar;this.setHeight(e.getSuggestedViewHeight(),e.isHeightAuto())},setHeight:function(t,e){},capturedScroll:null,capturedScrollDepth:0,captureScroll:function(){return!this.capturedScrollDepth++&&(this.capturedScroll=this.isDateRendered?this.queryScroll():{},!0)},captureInitialScroll:function(e){this.captureScroll()&&(this.capturedScroll.isInitial=!0,e?t.extend(this.capturedScroll,e):this.capturedScroll.isComputed=!0)},releaseScroll:function(){var e=this.capturedScroll,n=this.discardScroll();e.isComputed&&(n?t.extend(e,this.computeInitialScroll()):e=null),e&&(e.isInitial?this.hardSetScroll(e):this.setScroll(e))},discardScroll:function(){return!--this.capturedScrollDepth&&(this.capturedScroll=null,!0)},computeInitialScroll:function(){return{}},queryScroll:function(){return{}},hardSetScroll:function(t){var e=this,n=function(){e.setScroll(t)};n(),setTimeout(n,0)},setScroll:function(t){},freezeHeight:function(){this.calendar.freezeContentHeight()},thawHeight:function(){this.calendar.thawContentHeight()},bindEvents:function(){var t=this;this.isEventsBound||(this.isEventsBound=!0,this.rejectOn("eventsUnbind",this.requestEvents()).then(function(e){t.listenTo(t.calendar,"eventsReset",t.setEvents),t.setEvents(e)}))},unbindEvents:function(){this.isEventsBound&&(this.isEventsBound=!1,this.stopListeningTo(this.calendar,"eventsReset"),this.unsetEvents(),this.trigger("eventsUnbind"))},setEvents:function(t){var e=this.isEventSet;this.isEventsSet=!0,this.handleEvents(t,e),this.trigger(e?"eventsReset":"eventsSet",t)},unsetEvents:function(){this.isEventsSet&&(this.isEventsSet=!1,this.handleEventsUnset(),this.trigger("eventsUnset"))},whenEventsSet:function(){var t=this;return this.isEventsSet?ft.resolve(this.getCurrentEvents()):new ft(function(e){t.one("eventsSet",e)})},handleEvents:function(t,e){this.requestEventsRender(t)},handleEventsUnset:function(){this.requestEventsUnrender()},requestEventsRender:function(t){var e=this;return this.eventRenderQueue.add(function(){return e.executeEventsRender(t)})},requestEventsUnrender:function(){var t=this;return this.isEventsRendered?this.eventRenderQueue.addQuickly(function(){return t.executeEventsUnrender()}):ft.resolve()},requestCurrentEventsRender:function(){return this.isEventsSet?void this.requestEventsRender(this.getCurrentEvents()):ft.reject()},executeEventsRender:function(t){var e=this;return this.captureScroll(),this.freezeHeight(),this.executeEventsUnrender().then(function(){e.renderEvents(t),e.thawHeight(),e.releaseScroll(),e.isEventsRendered=!0,e.onEventsRender(),e.trigger("eventsRender")})},executeEventsUnrender:function(){return this.isEventsRendered&&(this.onBeforeEventsUnrender(),this.captureScroll(),this.freezeHeight(),this.destroyEvents&&this.destroyEvents(),this.unrenderEvents(),this.thawHeight(),this.releaseScroll(),this.isEventsRendered=!1,this.trigger("eventsUnrender")),ft.resolve()},onEventsRender:function(){this.renderedEventSegEach(function(t){this.publiclyTrigger("eventAfterRender",t.event,t.event,t.el)}),this.publiclyTrigger("eventAfterAllRender")},onBeforeEventsUnrender:function(){this.renderedEventSegEach(function(t){this.publiclyTrigger("eventDestroy",t.event,t.event,t.el)})},renderEvents:function(t){},unrenderEvents:function(){},requestEvents:function(){return this.calendar.requestEvents(this.start,this.end)},getCurrentEvents:function(){return this.calendar.getPrunedEventCache()},resolveEventEl:function(e,n){var i=this.publiclyTrigger("eventRender",e,e,n);return i===!1?n=null:i&&i!==!0&&(n=t(i)),n},showEvent:function(t){this.renderedEventSegEach(function(t){t.el.css("visibility","")},t)},hideEvent:function(t){this.renderedEventSegEach(function(t){t.el.css("visibility","hidden")},t)},renderedEventSegEach:function(t,e){var n,i=this.getEventSegs();for(n=0;n<i.length;n++)e&&i[n].event._id!==e._id||i[n].el&&t.call(this,i[n])},getEventSegs:function(){return[]},isEventDraggable:function(t){return this.isEventStartEditable(t)},isEventStartEditable:function(t){return J(t.startEditable,(t.source||{}).startEditable,this.opt("eventStartEditable"),this.isEventGenerallyEditable(t))},isEventGenerallyEditable:function(t){return J(t.editable,(t.source||{}).editable,this.opt("editable"))},reportSegDrop:function(t,e,n,i,r){var s=this.calendar,o=s.mutateSeg(t,e,n),l=function(){o.undo(),s.reportEventChange()};this.triggerEventDrop(t.event,o.dateDelta,l,i,r),s.reportEventChange()},triggerEventDrop:function(t,e,n,i,r){this.publiclyTrigger("eventDrop",i[0],t,e,n,r,{})},reportExternalDrop:function(e,n,i,r,s){var o,l,a=e.eventProps;a&&(o=t.extend({},a,n),l=this.calendar.renderEvent(o,e.stick)[0]),this.triggerExternalDrop(l,n,i,r,s)},triggerExternalDrop:function(t,e,n,i,r){this.publiclyTrigger("drop",n[0],e.start,i,r),t&&this.publiclyTrigger("eventReceive",null,t)},renderDrag:function(t,e){},unrenderDrag:function(){},isEventResizableFromStart:function(t){return this.opt("eventResizableFromStart")&&this.isEventResizable(t)},isEventResizableFromEnd:function(t){return this.isEventResizable(t)},isEventResizable:function(t){var e=t.source||{};return J(t.durationEditable,e.durationEditable,this.opt("eventDurationEditable"),t.editable,e.editable,this.opt("editable"))},reportSegResize:function(t,e,n,i,r){var s=this.calendar,o=s.mutateSeg(t,e,n),l=function(){o.undo(),s.reportEventChange()};this.triggerEventResize(t.event,o.durationDelta,l,i,r),s.reportEventChange()},triggerEventResize:function(t,e,n,i,r){this.publiclyTrigger("eventResize",i[0],t,e,n,r,{})},select:function(t,e){this.unselect(e),this.renderSelection(t),this.reportSelection(t,e)},renderSelection:function(t){},reportSelection:function(t,e){this.isSelected=!0,this.triggerSelect(t,e)},triggerSelect:function(t,e){this.publiclyTrigger("select",null,this.calendar.applyTimezone(t.start),this.calendar.applyTimezone(t.end),e)},unselect:function(t){this.isSelected&&(this.isSelected=!1,this.destroySelection&&this.destroySelection(),this.unrenderSelection(),this.publiclyTrigger("unselect",null,t))},unrenderSelection:function(){},selectEvent:function(t){this.selectedEvent&&this.selectedEvent===t||(this.unselectEvent(),this.renderedEventSegEach(function(t){t.el.addClass("fc-selected")},t),this.selectedEvent=t)},unselectEvent:function(){this.selectedEvent&&(this.renderedEventSegEach(function(t){t.el.removeClass("fc-selected")},this.selectedEvent),this.selectedEvent=null)},isEventSelected:function(t){return this.selectedEvent&&this.selectedEvent._id===t._id},handleDocumentMousedown:function(t){w(t)&&this.processUnselect(t)},processUnselect:function(t){this.processRangeUnselect(t),this.processEventUnselect(t)},processRangeUnselect:function(e){var n;this.isSelected&&this.opt("unselectAuto")&&(n=this.opt("unselectCancel"),n&&t(e.target).closest(n).length||this.unselect(e))},processEventUnselect:function(e){this.selectedEvent&&(t(e.target).closest(".fc-selected").length||this.unselectEvent())},triggerDayClick:function(t,e,n){this.publiclyTrigger("dayClick",e,this.calendar.applyTimezone(t.start),n)},initHiddenDays:function(){var e,n=this.opt("hiddenDays")||[],i=[],r=0;for(this.opt("weekends")===!1&&n.push(0,6),e=0;e<7;e++)(i[e]=t.inArray(e,n)!==-1)||r++;if(!r)throw"invalid hiddenDays";this.isHiddenDayHash=i},isHiddenDay:function(t){return e.isMoment(t)&&(t=t.day()),this.isHiddenDayHash[t]},skipHiddenDays:function(t,e,n){var i=t.clone();for(e=e||1;this.isHiddenDayHash[(i.day()+(n?e:0)+7)%7];)i.add(e,"days");return i},computeDayRange:function(t){var e,n=t.start.clone().stripTime(),i=t.end,r=null;return i&&(r=i.clone().stripTime(),e=+i.time(),e&&e>=this.nextDayThreshold&&r.add(1,"days")),(!i||r<=n)&&(r=n.clone().add(1,"days")),{start:n,end:r}},isMultiDayEvent:function(t){var e=this.computeDayRange(t);return e.end.diff(e.start,"days")>1}}),he=Ot.Scroller=ct.extend({el:null,scrollEl:null,overflowX:null,overflowY:null,constructor:function(t){t=t||{},this.overflowX=t.overflowX||t.overflow||"auto",this.overflowY=t.overflowY||t.overflow||"auto"},render:function(){this.el=this.renderEl(),this.applyOverflow()},renderEl:function(){return this.scrollEl=t('<div class="fc-scroller"></div>')},clear:function(){this.setHeight("auto"),this.applyOverflow()},destroy:function(){this.el.remove()},applyOverflow:function(){this.scrollEl.css({"overflow-x":this.overflowX,"overflow-y":this.overflowY})},lockOverflow:function(t){var e=this.overflowX,n=this.overflowY;t=t||this.getScrollbarWidths(),"auto"===e&&(e=t.top||t.bottom||this.scrollEl[0].scrollWidth-1>this.scrollEl[0].clientWidth?"scroll":"hidden"),"auto"===n&&(n=t.left||t.right||this.scrollEl[0].scrollHeight-1>this.scrollEl[0].clientHeight?"scroll":"hidden"),this.scrollEl.css({"overflow-x":e,"overflow-y":n})},setHeight:function(t){this.scrollEl.height(t)},getScrollTop:function(){return this.scrollEl.scrollTop()},setScrollTop:function(t){this.scrollEl.scrollTop(t)},getClientWidth:function(){return this.scrollEl[0].clientWidth},getClientHeight:function(){return this.scrollEl[0].clientHeight},getScrollbarWidths:function(){return p(this.scrollEl)}});Lt.prototype.proxyCall=function(t){var e=Array.prototype.slice.call(arguments,1),n=[];return this.items.forEach(function(i){n.push(i[t].apply(i,e))}),n};var fe=Ot.Calendar=ct.extend({dirDefaults:null,localeDefaults:null,overrides:null,dynamicOverrides:null,options:null,viewSpecCache:null,view:null,header:null,footer:null,loadingLevel:0,constructor:Bt,initialize:function(){},populateOptionsHash:function(){var t,e,i,r;t=J(this.dynamicOverrides.locale,this.overrides.locale),e=ge[t],e||(t=fe.defaults.locale,e=ge[t]||{}),i=J(this.dynamicOverrides.isRTL,this.overrides.isRTL,e.isRTL,fe.defaults.isRTL),r=i?fe.rtlDefaults:{},this.dirDefaults=r,this.localeDefaults=e,this.options=n([fe.defaults,r,e,this.overrides,this.dynamicOverrides]),Nt(this.options)},getViewSpec:function(t){var e=this.viewSpecCache;return e[t]||(e[t]=this.buildViewSpec(t))},getUnitViewSpec:function(e){var n,i,r;if(t.inArray(e,Yt)!=-1)for(n=this.header.getViewsWithButtons(),t.each(Ot.views,function(t){n.push(t)}),i=0;i<n.length;i++)if(r=this.getViewSpec(n[i]),r&&r.singleUnit==e)return r},buildViewSpec:function(t){for(var i,r,s,o,l=this.overrides.views||{},a=[],u=[],c=[],d=t;d;)i=At[d],r=l[d],d=null,"function"==typeof i&&(i={class:i}),i&&(a.unshift(i),u.unshift(i.defaults||{}),s=s||i.duration,d=d||i.type),r&&(c.unshift(r),s=s||r.duration,d=d||r.type);return i=q(a),i.type=t,!!i.class&&(s&&(s=e.duration(s),s.valueOf()&&(i.duration=s,o=A(s),1===s.as(o)&&(i.singleUnit=o,c.unshift(l[o]||{})))),i.defaults=n(u),i.overrides=n(c),this.buildViewSpecOptions(i),this.buildViewSpecButtonText(i,t),i)},buildViewSpecOptions:function(t){t.options=n([fe.defaults,t.defaults,this.dirDefaults,this.localeDefaults,this.overrides,t.overrides,this.dynamicOverrides]),Nt(t.options)},buildViewSpecButtonText:function(t,e){function n(n){var i=n.buttonText||{};return i[e]||(t.buttonTextKey?i[t.buttonTextKey]:null)||(t.singleUnit?i[t.singleUnit]:null)}t.buttonTextOverride=n(this.dynamicOverrides)||n(this.overrides)||t.overrides.buttonText,t.buttonTextDefault=n(this.localeDefaults)||n(this.dirDefaults)||t.defaults.buttonText||n(fe.defaults)||(t.duration?this.humanizeDuration(t.duration):null)||e},instantiateView:function(t){var e=this.getViewSpec(t);return new e.class(this,t,e.options,e.duration)},isValidViewType:function(t){return Boolean(this.getViewSpec(t))},pushLoading:function(){this.loadingLevel++||this.publiclyTrigger("loading",null,!0,this.view)},popLoading:function(){--this.loadingLevel||this.publiclyTrigger("loading",null,!1,this.view)},buildSelectSpan:function(t,e){var n,i=this.moment(t).stripZone();return n=e?this.moment(e).stripZone():i.hasTime()?i.clone().add(this.defaultTimedEventDuration):i.clone().add(this.defaultAllDayEventDuration),{start:i,end:n}}});fe.mixin(Jt),fe.mixin({optionHandlers:null,bindOption:function(t,e){this.bindOptions([t],e)},bindOptions:function(t,e){var n,i={func:e,names:t};for(n=0;n<t.length;n++)this.registerOptionHandlerObj(t[n],i);this.triggerOptionHandlerObj(i)},registerOptionHandlerObj:function(t,e){(this.optionHandlers[t]||(this.optionHandlers[t]=[])).push(e)},triggerOptionHandlers:function(t){var e,n=this.optionHandlers[t]||[];for(e=0;e<n.length;e++)this.triggerOptionHandlerObj(n[e])},triggerOptionHandlerObj:function(t){var e,n=t.names,i=[];for(e=0;e<n.length;e++)i.push(this.options[n[e]]);t.func.apply(this,i)}}),fe.defaults={titleRangeSeparator:" – ",monthYearFormat:"MMMM YYYY",defaultTimedEventDuration:"02:00:00",defaultAllDayEventDuration:{days:1},forceEventDuration:!1,nextDayThreshold:"09:00:00",defaultView:"month",aspectRatio:1.35,header:{left:"title",center:"",right:"today prev,next"},weekends:!0,weekNumbers:!1,weekNumberTitle:"W",weekNumberCalculation:"local",scrollTime:"06:00:00",lazyFetching:!0,startParam:"start",endParam:"end",timezoneParam:"timezone",timezone:!1,isRTL:!1,buttonText:{prev:"prev",next:"next",prevYear:"prev year",nextYear:"next year",year:"year",today:"today",month:"month",week:"week",day:"day"},buttonIcons:{prev:"left-single-arrow",next:"right-single-arrow",prevYear:"left-double-arrow",nextYear:"right-double-arrow"},allDayText:"all-day",theme:!1,themeButtonIcons:{prev:"circle-triangle-w",next:"circle-triangle-e",prevYear:"seek-prev",nextYear:"seek-next"},dragOpacity:.75,dragRevertDuration:500,dragScroll:!0,unselectAuto:!0,dropAccept:"*",eventOrder:"title",eventLimit:!1,eventLimitText:"more",eventLimitClick:"popover",dayPopoverFormat:"LL",handleWindowResize:!0,windowResizeDelay:100,longPressDelay:1e3},fe.englishDefaults={dayPopoverFormat:"dddd, MMMM D"},fe.rtlDefaults={header:{left:"next,prev today",center:"",right:"title"},buttonIcons:{prev:"right-single-arrow",next:"left-single-arrow",prevYear:"right-double-arrow",nextYear:"left-double-arrow"},themeButtonIcons:{prev:"circle-triangle-e",next:"circle-triangle-w",nextYear:"seek-prev",prevYear:"seek-next"}};var ge=Ot.locales={};Ot.datepickerLocale=function(e,n,i){var r=ge[e]||(ge[e]={});r.isRTL=i.isRTL,r.weekNumberTitle=i.weekHeader,t.each(pe,function(t,e){r[t]=e(i)}),t.datepicker&&(t.datepicker.regional[n]=t.datepicker.regional[e]=i,t.datepicker.regional.en=t.datepicker.regional[""],t.datepicker.setDefaults(i))},Ot.locale=function(e,i){var r,s;r=ge[e]||(ge[e]={}),i&&(r=ge[e]=n([r,i])),s=Ft(e),t.each(ve,function(t,e){null==r[t]&&(r[t]=e(s,r))}),fe.defaults.locale=e};var pe={buttonText:function(t){return{prev:et(t.prevText),next:et(t.nextText),today:et(t.currentText)}},monthYearFormat:function(t){return t.showMonthAfterYear?"YYYY["+t.yearSuffix+"] MMMM":"MMMM YYYY["+t.yearSuffix+"]"}},ve={dayOfMonthFormat:function(t,e){var n=t.longDateFormat("l");return n=n.replace(/^Y+[^\w\s]*|[^\w\s]*Y+$/g,""),e.isRTL?n+=" ddd":n="ddd "+n,n},mediumTimeFormat:function(t){return t.longDateFormat("LT").replace(/\s*a$/i,"a")},smallTimeFormat:function(t){return t.longDateFormat("LT").replace(":mm","(:mm)").replace(/(\Wmm)$/,"($1)").replace(/\s*a$/i,"a")},extraSmallTimeFormat:function(t){return t.longDateFormat("LT").replace(":mm","(:mm)").replace(/(\Wmm)$/,"($1)").replace(/\s*a$/i,"t")},hourFormat:function(t){return t.longDateFormat("LT").replace(":mm","").replace(/(\Wmm)$/,"").replace(/\s*a$/i,"a")},noMeridiemTimeFormat:function(t){return t.longDateFormat("LT").replace(/\s*a$/i,"")}},me={smallDayDateFormat:function(t){return t.isRTL?"D dd":"dd D"},weekFormat:function(t){return t.isRTL?"w[ "+t.weekNumberTitle+"]":"["+t.weekNumberTitle+" ]w"},smallWeekFormat:function(t){return t.isRTL?"w["+t.weekNumberTitle+"]":"["+t.weekNumberTitle+"]w"}};Ot.locale("en",fe.englishDefaults),Ot.sourceNormalizers=[],Ot.sourceFetchers=[];var ye={dataType:"json",cache:!1},Se=1;fe.prototype.mutateSeg=function(t,e){return this.mutateEvent(t.event,e)},fe.prototype.normalizeEvent=function(t){},fe.prototype.spanContainsSpan=function(t,e){var n=t.start.clone().stripZone(),i=this.getEventEnd(t).stripZone();return e.start>=n&&e.end<=i},fe.prototype.getPeerEvents=function(t,e){var n,i,r=this.getEventCache(),s=[];for(n=0;n<r.length;n++)i=r[n],e&&e._id===i._id||s.push(i);return s},fe.prototype.isEventSpanAllowed=function(t,e){var n=e.source||{},i=J(e.constraint,n.constraint,this.options.eventConstraint),r=J(e.overlap,n.overlap,this.options.eventOverlap);return this.isSpanAllowed(t,i,r,e)&&(!this.options.eventAllow||this.options.eventAllow(t,e)!==!1)},fe.prototype.isExternalSpanAllowed=function(e,n,i){var r,s;return i&&(r=t.extend({},i,n),s=this.expandEvent(this.buildEventFromInput(r))[0]),s?this.isEventSpanAllowed(e,s):this.isSelectionSpanAllowed(e)},fe.prototype.isSelectionSpanAllowed=function(t){return this.isSpanAllowed(t,this.options.selectConstraint,this.options.selectOverlap)&&(!this.options.selectAllow||this.options.selectAllow(t)!==!1)},fe.prototype.isSpanAllowed=function(t,e,n,i){var r,s,o,l,a,u;if(null!=e&&(r=this.constraintToEvents(e))){for(s=!1,l=0;l<r.length;l++)if(this.spanContainsSpan(r[l],t)){s=!0;break}if(!s)return!1}for(o=this.getPeerEvents(t,i),l=0;l<o.length;l++)if(a=o[l],this.eventIntersectsRange(a,t)){if(n===!1)return!1;if("function"==typeof n&&!n(a,i))return!1;if(i){if(u=J(a.overlap,(a.source||{}).overlap),u===!1)return!1;if("function"==typeof u&&!u(i,a))return!1}}return!0},fe.prototype.constraintToEvents=function(t){return"businessHours"===t?this.getCurrentBusinessHourEvents():"object"==typeof t?null!=t.start?this.expandEvent(this.buildEventFromInput(t)):null:this.clientEvents(t)},fe.prototype.eventIntersectsRange=function(t,e){var n=t.start.clone().stripZone(),i=this.getEventEnd(t).stripZone();return e.start<i&&e.end>n};var we={id:"_fcBusinessHours",start:"09:00",end:"17:00",dow:[1,2,3,4,5],rendering:"inverse-background"};fe.prototype.getCurrentBusinessHourEvents=function(t){return this.computeBusinessHourEvents(t,this.options.businessHours)},fe.prototype.computeBusinessHourEvents=function(e,n){return n===!0?this.expandBusinessHourEvents(e,[{}]):t.isPlainObject(n)?this.expandBusinessHourEvents(e,[n]):t.isArray(n)?this.expandBusinessHourEvents(e,n,!0):[]},fe.prototype.expandBusinessHourEvents=function(e,n,i){var r,s,o=this.getView(),l=[];for(r=0;r<n.length;r++)s=n[r],i&&!s.dow||(s=t.extend({},we,s),e&&(s.start=null,s.end=null),l.push.apply(l,this.expandEvent(this.buildEventFromInput(s),o.start,o.end)));return l};var Ee=Ot.BasicView=de.extend({scroller:null,dayGridClass:ue,dayGrid:null,dayNumbersVisible:!1,colWeekNumbersVisible:!1,cellWeekNumbersVisible:!1,weekNumberWidth:null,headContainerEl:null,headRowEl:null,initialize:function(){this.dayGrid=this.instantiateDayGrid(),this.scroller=new he({overflowX:"hidden",overflowY:"auto"})},instantiateDayGrid:function(){var t=this.dayGridClass.extend(be);return new t(this)},setRange:function(t){de.prototype.setRange.call(this,t),this.dayGrid.breakOnWeeks=/year|month|week/.test(this.intervalUnit),this.dayGrid.setRange(t)},computeRange:function(t){var e=de.prototype.computeRange.call(this,t);return/year|month/.test(e.intervalUnit)&&(e.start.startOf("week"),e.start=this.skipHiddenDays(e.start),e.end.weekday()&&(e.end.add(1,"week").startOf("week"),e.end=this.skipHiddenDays(e.end,-1,!0))),e},renderDates:function(){this.dayNumbersVisible=this.dayGrid.rowCnt>1,this.opt("weekNumbers")&&(this.opt("weekNumbersWithinDays")?(this.cellWeekNumbersVisible=!0,this.colWeekNumbersVisible=!1):(this.cellWeekNumbersVisible=!1,this.colWeekNumbersVisible=!0)),this.dayGrid.numbersVisible=this.dayNumbersVisible||this.cellWeekNumbersVisible||this.colWeekNumbersVisible,this.el.addClass("fc-basic-view").html(this.renderSkeletonHtml()),this.renderHead(),this.scroller.render();var e=this.scroller.el.addClass("fc-day-grid-container"),n=t('<div class="fc-day-grid" />').appendTo(e);this.el.find(".fc-body > tr > td").append(e),this.dayGrid.setElement(n),this.dayGrid.renderDates(this.hasRigidRows())},renderHead:function(){this.headContainerEl=this.el.find(".fc-head-container").html(this.dayGrid.renderHeadHtml()),this.headRowEl=this.headContainerEl.find(".fc-row")},unrenderDates:function(){this.dayGrid.unrenderDates(),this.dayGrid.removeElement(),this.scroller.destroy()},renderBusinessHours:function(){this.dayGrid.renderBusinessHours()},unrenderBusinessHours:function(){this.dayGrid.unrenderBusinessHours()},renderSkeletonHtml:function(){return'<table><thead class="fc-head"><tr><td class="fc-head-container '+this.widgetHeaderClass+'"></td></tr></thead><tbody class="fc-body"><tr><td class="'+this.widgetContentClass+'"></td></tr></tbody></table>'},weekNumberStyleAttr:function(){return null!==this.weekNumberWidth?'style="width:'+this.weekNumberWidth+'px"':""},hasRigidRows:function(){var t=this.opt("eventLimit");return t&&"number"!=typeof t},updateWidth:function(){this.colWeekNumbersVisible&&(this.weekNumberWidth=u(this.el.find(".fc-week-number")))},setHeight:function(t,e){var n,s,o=this.opt("eventLimit");this.scroller.clear(),r(this.headRowEl),this.dayGrid.removeSegPopover(),o&&"number"==typeof o&&this.dayGrid.limitRows(o),n=this.computeScrollerHeight(t),this.setGridHeight(n,e),o&&"number"!=typeof o&&this.dayGrid.limitRows(o),e||(this.scroller.setHeight(n),s=this.scroller.getScrollbarWidths(),(s.left||s.right)&&(i(this.headRowEl,s),n=this.computeScrollerHeight(t),this.scroller.setHeight(n)),this.scroller.lockOverflow(s))},computeScrollerHeight:function(t){return t-c(this.el,this.scroller.el)},setGridHeight:function(t,e){e?a(this.dayGrid.rowEls):l(this.dayGrid.rowEls,t,!0)},computeInitialScroll:function(){return{top:0}},queryScroll:function(){return{top:this.scroller.getScrollTop()}},setScroll:function(t){this.scroller.setScrollTop(t.top)},hitsNeeded:function(){this.dayGrid.hitsNeeded()},hitsNotNeeded:function(){this.dayGrid.hitsNotNeeded()},prepareHits:function(){this.dayGrid.prepareHits()},releaseHits:function(){this.dayGrid.releaseHits()},queryHit:function(t,e){return this.dayGrid.queryHit(t,e)},getHitSpan:function(t){return this.dayGrid.getHitSpan(t)},getHitEl:function(t){return this.dayGrid.getHitEl(t)},renderEvents:function(t){this.dayGrid.renderEvents(t),this.updateHeight()},getEventSegs:function(){return this.dayGrid.getEventSegs()},unrenderEvents:function(){this.dayGrid.unrenderEvents()},renderDrag:function(t,e){return this.dayGrid.renderDrag(t,e)},unrenderDrag:function(){this.dayGrid.unrenderDrag()},renderSelection:function(t){this.dayGrid.renderSelection(t)},unrenderSelection:function(){this.dayGrid.unrenderSelection()}}),be={renderHeadIntroHtml:function(){var t=this.view;return t.colWeekNumbersVisible?'<th class="fc-week-number '+t.widgetHeaderClass+'" '+t.weekNumberStyleAttr()+"><span>"+tt(t.opt("weekNumberTitle"))+"</span></th>":""},renderNumberIntroHtml:function(t){var e=this.view,n=this.getCellDate(t,0);return e.colWeekNumbersVisible?'<td class="fc-week-number" '+e.weekNumberStyleAttr()+">"+e.buildGotoAnchorHtml({date:n,type:"week",forceOff:1===this.colCnt},n.format("w"))+"</td>":""},renderBgIntroHtml:function(){var t=this.view;return t.colWeekNumbersVisible?'<td class="fc-week-number '+t.widgetContentClass+'" '+t.weekNumberStyleAttr()+"></td>":""},renderIntroHtml:function(){var t=this.view;return t.colWeekNumbersVisible?'<td class="fc-week-number" '+t.weekNumberStyleAttr()+"></td>":""}},De=Ot.MonthView=Ee.extend({computeRange:function(t){var e,n=Ee.prototype.computeRange.call(this,t);return this.isFixedWeeks()&&(e=Math.ceil(n.end.diff(n.start,"weeks",!0)),n.end.add(6-e,"weeks")),n},setGridHeight:function(t,e){e&&(t*=this.rowCnt/6),l(this.dayGrid.rowEls,t,!e)},isFixedWeeks:function(){return this.opt("fixedWeekCount")}});At.basic={class:Ee},At.basicDay={type:"basic",duration:{days:1}},At.basicWeek={type:"basic",duration:{weeks:1}},At.month={class:De,duration:{months:1},defaults:{fixedWeekCount:!0}};var Te=Ot.AgendaView=de.extend({scroller:null,timeGridClass:ce,timeGrid:null,dayGridClass:ue,dayGrid:null,axisWidth:null,headContainerEl:null,noScrollRowEls:null,bottomRuleEl:null,initialize:function(){this.timeGrid=this.instantiateTimeGrid(),this.opt("allDaySlot")&&(this.dayGrid=this.instantiateDayGrid()),this.scroller=new he({overflowX:"hidden",overflowY:"auto"})},instantiateTimeGrid:function(){var t=this.timeGridClass.extend(Ce);return new t(this)},instantiateDayGrid:function(){var t=this.dayGridClass.extend(He);return new t(this)},setRange:function(t){de.prototype.setRange.call(this,t),this.timeGrid.setRange(t),this.dayGrid&&this.dayGrid.setRange(t)},renderDates:function(){this.el.addClass("fc-agenda-view").html(this.renderSkeletonHtml()),this.renderHead(),this.scroller.render();var e=this.scroller.el.addClass("fc-time-grid-container"),n=t('<div class="fc-time-grid" />').appendTo(e);this.el.find(".fc-body > tr > td").append(e),this.timeGrid.setElement(n),this.timeGrid.renderDates(),this.bottomRuleEl=t('<hr class="fc-divider '+this.widgetHeaderClass+'"/>').appendTo(this.timeGrid.el),this.dayGrid&&(this.dayGrid.setElement(this.el.find(".fc-day-grid")),this.dayGrid.renderDates(),this.dayGrid.bottomCoordPadding=this.dayGrid.el.next("hr").outerHeight()),this.noScrollRowEls=this.el.find(".fc-row:not(.fc-scroller *)")},renderHead:function(){this.headContainerEl=this.el.find(".fc-head-container").html(this.timeGrid.renderHeadHtml())},unrenderDates:function(){this.timeGrid.unrenderDates(),this.timeGrid.removeElement(),this.dayGrid&&(this.dayGrid.unrenderDates(),this.dayGrid.removeElement()),this.scroller.destroy()},renderSkeletonHtml:function(){return'<table><thead class="fc-head"><tr><td class="fc-head-container '+this.widgetHeaderClass+'"></td></tr></thead><tbody class="fc-body"><tr><td class="'+this.widgetContentClass+'">'+(this.dayGrid?'<div class="fc-day-grid"/><hr class="fc-divider '+this.widgetHeaderClass+'"/>':"")+"</td></tr></tbody></table>"},axisStyleAttr:function(){return null!==this.axisWidth?'style="width:'+this.axisWidth+'px"':""},renderBusinessHours:function(){this.timeGrid.renderBusinessHours(),this.dayGrid&&this.dayGrid.renderBusinessHours()},unrenderBusinessHours:function(){this.timeGrid.unrenderBusinessHours(),this.dayGrid&&this.dayGrid.unrenderBusinessHours()},getNowIndicatorUnit:function(){return this.timeGrid.getNowIndicatorUnit()},renderNowIndicator:function(t){this.timeGrid.renderNowIndicator(t)},unrenderNowIndicator:function(){this.timeGrid.unrenderNowIndicator()},updateSize:function(t){this.timeGrid.updateSize(t),de.prototype.updateSize.call(this,t)},updateWidth:function(){this.axisWidth=u(this.el.find(".fc-axis"))},setHeight:function(t,e){var n,s,o;this.bottomRuleEl.hide(),this.scroller.clear(),r(this.noScrollRowEls),this.dayGrid&&(this.dayGrid.removeSegPopover(),n=this.opt("eventLimit"),n&&"number"!=typeof n&&(n=xe),n&&this.dayGrid.limitRows(n)),e||(s=this.computeScrollerHeight(t),this.scroller.setHeight(s),o=this.scroller.getScrollbarWidths(),(o.left||o.right)&&(i(this.noScrollRowEls,o),s=this.computeScrollerHeight(t),this.scroller.setHeight(s)),this.scroller.lockOverflow(o),this.timeGrid.getTotalSlatHeight()<s&&this.bottomRuleEl.show())},computeScrollerHeight:function(t){return t-c(this.el,this.scroller.el)},computeInitialScroll:function(){var t=e.duration(this.opt("scrollTime")),n=this.timeGrid.computeTimeTop(t);return n=Math.ceil(n),n&&n++,{top:n}},queryScroll:function(){return{top:this.scroller.getScrollTop()}},setScroll:function(t){this.scroller.setScrollTop(t.top)},hitsNeeded:function(){this.timeGrid.hitsNeeded(),this.dayGrid&&this.dayGrid.hitsNeeded()},hitsNotNeeded:function(){this.timeGrid.hitsNotNeeded(),this.dayGrid&&this.dayGrid.hitsNotNeeded()},prepareHits:function(){this.timeGrid.prepareHits(),this.dayGrid&&this.dayGrid.prepareHits();
+},releaseHits:function(){this.timeGrid.releaseHits(),this.dayGrid&&this.dayGrid.releaseHits()},queryHit:function(t,e){var n=this.timeGrid.queryHit(t,e);return!n&&this.dayGrid&&(n=this.dayGrid.queryHit(t,e)),n},getHitSpan:function(t){return t.component.getHitSpan(t)},getHitEl:function(t){return t.component.getHitEl(t)},renderEvents:function(t){var e,n,i=[],r=[],s=[];for(n=0;n<t.length;n++)t[n].allDay?i.push(t[n]):r.push(t[n]);e=this.timeGrid.renderEvents(r),this.dayGrid&&(s=this.dayGrid.renderEvents(i)),this.updateHeight()},getEventSegs:function(){return this.timeGrid.getEventSegs().concat(this.dayGrid?this.dayGrid.getEventSegs():[])},unrenderEvents:function(){this.timeGrid.unrenderEvents(),this.dayGrid&&this.dayGrid.unrenderEvents()},renderDrag:function(t,e){return t.start.hasTime()?this.timeGrid.renderDrag(t,e):this.dayGrid?this.dayGrid.renderDrag(t,e):void 0},unrenderDrag:function(){this.timeGrid.unrenderDrag(),this.dayGrid&&this.dayGrid.unrenderDrag()},renderSelection:function(t){t.start.hasTime()||t.end.hasTime()?this.timeGrid.renderSelection(t):this.dayGrid&&this.dayGrid.renderSelection(t)},unrenderSelection:function(){this.timeGrid.unrenderSelection(),this.dayGrid&&this.dayGrid.unrenderSelection()}}),Ce={renderHeadIntroHtml:function(){var t,e=this.view;return e.opt("weekNumbers")?(t=this.start.format(e.opt("smallWeekFormat")),'<th class="fc-axis fc-week-number '+e.widgetHeaderClass+'" '+e.axisStyleAttr()+">"+e.buildGotoAnchorHtml({date:this.start,type:"week",forceOff:this.colCnt>1},tt(t))+"</th>"):'<th class="fc-axis '+e.widgetHeaderClass+'" '+e.axisStyleAttr()+"></th>"},renderBgIntroHtml:function(){var t=this.view;return'<td class="fc-axis '+t.widgetContentClass+'" '+t.axisStyleAttr()+"></td>"},renderIntroHtml:function(){var t=this.view;return'<td class="fc-axis" '+t.axisStyleAttr()+"></td>"}},He={renderBgIntroHtml:function(){var t=this.view;return'<td class="fc-axis '+t.widgetContentClass+'" '+t.axisStyleAttr()+"><span>"+t.getAllDayHtml()+"</span></td>"},renderIntroHtml:function(){var t=this.view;return'<td class="fc-axis" '+t.axisStyleAttr()+"></td>"}},xe=5,Re=[{hours:1},{minutes:30},{minutes:15},{seconds:30},{seconds:15}];At.agenda={class:Te,defaults:{allDaySlot:!0,slotDuration:"00:30:00",minTime:"00:00:00",maxTime:"24:00:00",slotEventOverlap:!0}},At.agendaDay={type:"agenda",duration:{days:1}},At.agendaWeek={type:"agenda",duration:{weeks:1}};var Ie=de.extend({grid:null,scroller:null,initialize:function(){this.grid=new ke(this),this.scroller=new he({overflowX:"hidden",overflowY:"auto"})},setRange:function(t){de.prototype.setRange.call(this,t),this.grid.setRange(t)},renderSkeleton:function(){this.el.addClass("fc-list-view "+this.widgetContentClass),this.scroller.render(),this.scroller.el.appendTo(this.el),this.grid.setElement(this.scroller.scrollEl)},unrenderSkeleton:function(){this.scroller.destroy()},setHeight:function(t,e){this.scroller.setHeight(this.computeScrollerHeight(t))},computeScrollerHeight:function(t){return t-c(this.el,this.scroller.el)},renderEvents:function(t){this.grid.renderEvents(t)},unrenderEvents:function(){this.grid.unrenderEvents()},isEventResizable:function(t){return!1},isEventDraggable:function(t){return!1}}),ke=le.extend({segSelector:".fc-list-item",hasDayInteractions:!1,spanToSegs:function(t){for(var e,n=this.view,i=n.start.clone().time(0),r=0,s=[];i<n.end;)if(e=F(t,{start:i,end:i.clone().add(1,"day")}),e&&(e.dayIndex=r,s.push(e)),i.add(1,"day"),r++,e&&!e.isEnd&&t.end.hasTime()&&t.end<i.clone().add(this.view.nextDayThreshold)){e.end=t.end.clone(),e.isEnd=!0;break}return s},computeEventTimeFormat:function(){return this.view.opt("mediumTimeFormat")},handleSegClick:function(e,n){var i;le.prototype.handleSegClick.apply(this,arguments),t(n.target).closest("a[href]").length||(i=e.event.url,i&&!n.isDefaultPrevented()&&(window.location.href=i))},renderFgSegs:function(t){return t=this.renderFgSegEls(t),t.length?this.renderSegList(t):this.renderEmptyMessage(),t},renderEmptyMessage:function(){this.el.html('<div class="fc-list-empty-wrap2"><div class="fc-list-empty-wrap1"><div class="fc-list-empty">'+tt(this.view.opt("noEventsMessage"))+"</div></div></div>")},renderSegList:function(e){var n,i,r,s=this.groupSegsByDay(e),o=t('<table class="fc-list-table"><tbody/></table>'),l=o.find("tbody");for(n=0;n<s.length;n++)if(i=s[n])for(l.append(this.dayHeaderHtml(this.view.start.clone().add(n,"days"))),this.sortEventSegs(i),r=0;r<i.length;r++)l.append(i[r].el);this.el.empty().append(o)},groupSegsByDay:function(t){var e,n,i=[];for(e=0;e<t.length;e++)n=t[e],(i[n.dayIndex]||(i[n.dayIndex]=[])).push(n);return i},dayHeaderHtml:function(t){var e=this.view,n=e.opt("listDayFormat"),i=e.opt("listDayAltFormat");return'<tr class="fc-list-heading" data-date="'+t.format("YYYY-MM-DD")+'"><td class="'+e.widgetHeaderClass+'" colspan="3">'+(n?e.buildGotoAnchorHtml(t,{class:"fc-list-heading-main"},tt(t.format(n))):"")+(i?e.buildGotoAnchorHtml(t,{class:"fc-list-heading-alt"},tt(t.format(i))):"")+"</td></tr>"},fgSegHtml:function(t){var e,n=this.view,i=["fc-list-item"].concat(this.getSegCustomClasses(t)),r=this.getSegBackgroundColor(t),s=t.event,o=s.url;return e=s.allDay?n.getAllDayHtml():n.isMultiDayEvent(s)?t.isStart||t.isEnd?tt(this.getEventTimeText(t)):n.getAllDayHtml():tt(this.getEventTimeText(s)),o&&i.push("fc-has-url"),'<tr class="'+i.join(" ")+'">'+(this.displayEventTime?'<td class="fc-list-item-time '+n.widgetContentClass+'">'+(e||"")+"</td>":"")+'<td class="fc-list-item-marker '+n.widgetContentClass+'"><span class="fc-event-dot"'+(r?' style="background-color:'+r+'"':"")+'></span></td><td class="fc-list-item-title '+n.widgetContentClass+'"><a'+(o?' href="'+tt(o)+'"':"")+">"+tt(t.event.title||"")+"</a></td></tr>"}});return At.list={class:Ie,buttonTextKey:"list",defaults:{buttonText:"list",listDayFormat:"LL",noEventsMessage:"No events to display"}},At.listDay={type:"list",duration:{days:1},defaults:{listDayFormat:"dddd"}},At.listWeek={type:"list",duration:{weeks:1},defaults:{listDayFormat:"dddd",listDayAltFormat:"LL"}},At.listMonth={type:"list",duration:{month:1},defaults:{listDayAltFormat:"dddd"}},At.listYear={type:"list",duration:{year:1},defaults:{listDayAltFormat:"dddd"}},Ot}); \ No newline at end of file
diff --git a/library/fullcalendar/fullcalendar.print.css b/library/fullcalendar/fullcalendar.print.css
index 5e1183071..c92bdd9df 100644
--- a/library/fullcalendar/fullcalendar.print.css
+++ b/library/fullcalendar/fullcalendar.print.css
@@ -1,7 +1,7 @@
/*!
- * FullCalendar v3.1.0 Print Stylesheet
- * Docs & License: http://fullcalendar.io/
- * (c) 2016 Adam Shaw
+ * FullCalendar v3.2.0 Print Stylesheet
+ * Docs & License: https://fullcalendar.io/
+ * (c) 2017 Adam Shaw
*/
/*
diff --git a/library/fullcalendar/fullcalendar.print.min.css b/library/fullcalendar/fullcalendar.print.min.css
index 05281cf21..c193968d7 100644
--- a/library/fullcalendar/fullcalendar.print.min.css
+++ b/library/fullcalendar/fullcalendar.print.min.css
@@ -1,5 +1,5 @@
/*!
- * FullCalendar v3.1.0 Print Stylesheet
- * Docs & License: http://fullcalendar.io/
- * (c) 2016 Adam Shaw
+ * FullCalendar v3.2.0 Print Stylesheet
+ * Docs & License: https://fullcalendar.io/
+ * (c) 2017 Adam Shaw
*/.fc-bg,.fc-bgevent-container,.fc-bgevent-skeleton,.fc-business-container,.fc-event .fc-resizer,.fc-helper-container,.fc-helper-skeleton,.fc-highlight-container,.fc-highlight-skeleton{display:none}.fc tbody .fc-row,.fc-time-grid{min-height:0!important}.fc-time-grid .fc-event.fc-not-end:after,.fc-time-grid .fc-event.fc-not-start:before{content:"..."}.fc{max-width:100%!important}.fc-event{background:#fff!important;color:#000!important;page-break-inside:avoid}.fc hr,.fc tbody,.fc td,.fc th,.fc thead,.fc-row{border-color:#ccc!important;background:#fff!important}.fc tbody .fc-row{height:auto!important}.fc tbody .fc-row .fc-content-skeleton{position:static;padding-bottom:0!important}.fc tbody .fc-row .fc-content-skeleton tbody tr:last-child td{padding-bottom:1em}.fc tbody .fc-row .fc-content-skeleton table{height:1em}.fc-more,.fc-more-cell{display:none!important}.fc tr.fc-limited{display:table-row!important}.fc td.fc-limited{display:table-cell!important}.fc-agenda-view .fc-axis,.fc-popover{display:none}.fc-slats,.fc-time-grid hr{display:none!important}.fc button,.fc-button-group,.fc-time-grid .fc-event .fc-time span{display:none}.fc-time-grid .fc-content-skeleton{position:static}.fc-time-grid .fc-content-skeleton table{height:4em}.fc-time-grid .fc-event-container{margin:0!important}.fc-time-grid .fc-event{position:static!important;margin:3px 2px!important}.fc-time-grid .fc-event.fc-not-end{border-bottom-width:1px!important}.fc-time-grid .fc-event.fc-not-start{border-top-width:1px!important}.fc-time-grid .fc-event .fc-time{white-space:normal!important}.fc-time-grid .fc-event .fc-time:after{content:attr(data-full)}.fc-day-grid-container,.fc-scroller,.fc-time-grid-container{overflow:visible!important;height:auto!important}.fc-row{border:0!important;margin:0!important} \ No newline at end of file
diff --git a/library/fullcalendar/gcal.js b/library/fullcalendar/gcal.js
index 1975cca72..7e895337e 100644
--- a/library/fullcalendar/gcal.js
+++ b/library/fullcalendar/gcal.js
@@ -1,7 +1,7 @@
/*!
- * FullCalendar v3.1.0 Google Calendar Plugin
- * Docs & License: http://fullcalendar.io/
- * (c) 2016 Adam Shaw
+ * FullCalendar v3.2.0 Google Calendar Plugin
+ * Docs & License: https://fullcalendar.io/
+ * (c) 2017 Adam Shaw
*/
(function(factory) {
diff --git a/library/fullcalendar/gcal.min.js b/library/fullcalendar/gcal.min.js
index 08876848f..02e7ea4d5 100644
--- a/library/fullcalendar/gcal.min.js
+++ b/library/fullcalendar/gcal.min.js
@@ -1,6 +1,6 @@
/*!
- * FullCalendar v3.1.0 Google Calendar Plugin
- * Docs & License: http://fullcalendar.io/
- * (c) 2016 Adam Shaw
+ * FullCalendar v3.2.0 Google Calendar Plugin
+ * Docs & License: https://fullcalendar.io/
+ * (c) 2017 Adam Shaw
*/
!function(e){"function"==typeof define&&define.amd?define(["jquery"],e):"object"==typeof exports?module.exports=e(require("jquery")):e(jQuery)}(function(e){function a(a,t,d,c,i){function s(o,r){var l=r||[{message:o}];(a.googleCalendarError||e.noop).apply(i,l),(i.options.googleCalendarError||e.noop).apply(i,l),n.warn.apply(null,[o].concat(r||[]))}var u,g,p=r+"/"+encodeURIComponent(a.googleCalendarId)+"/events?callback=?",m=a.googleCalendarApiKey||i.options.googleCalendarApiKey,f=a.success;return m?(t.hasZone()||(t=t.clone().utc().add(-1,"day")),d.hasZone()||(d=d.clone().utc().add(1,"day")),c&&"local"!=c&&(g=c.replace(" ","_")),u=e.extend({},a.data||{},{key:m,timeMin:t.format(),timeMax:d.format(),timeZone:g,singleEvents:!0,maxResults:9999}),e.extend({},a,{googleCalendarId:null,url:p,data:u,startParam:!1,endParam:!1,timezoneParam:!1,success:function(a){var r,n,t=[];if(a.error)s("Google Calendar API: "+a.error.message,a.error.errors);else if(a.items&&(e.each(a.items,function(e,a){var r=a.htmlLink||null;g&&null!==r&&(r=o(r,"ctz="+g)),t.push({id:a.id,title:a.summary,start:a.start.dateTime||a.start.date,end:a.end.dateTime||a.end.date,url:r,location:a.location,description:a.description})}),r=[t].concat(Array.prototype.slice.call(arguments,1)),n=l(f,this,r),e.isArray(n)))return n;return t}})):(s("Specify a googleCalendarApiKey. See http://fullcalendar.io/docs/google_calendar/"),{})}function o(e,a){return e.replace(/(\?.*?)?(#|$)/,function(e,o,r){return(o?o+"&":"?")+a+r})}var r="https://www.googleapis.com/calendar/v3/calendars",n=e.fullCalendar,l=n.applyAll;n.sourceNormalizers.push(function(e){var a,o=e.googleCalendarId,r=e.url;!o&&r&&(/^[^\/]+@([^\/\.]+\.)*(google|googlemail|gmail)\.com$/.test(r)?o=r:((a=/^https:\/\/www.googleapis.com\/calendar\/v3\/calendars\/([^\/]*)/.exec(r))||(a=/^https?:\/\/www.google.com\/calendar\/feeds\/([^\/]*)/.exec(r)))&&(o=decodeURIComponent(a[1])),o&&(e.googleCalendarId=o)),o&&(null==e.editable&&(e.editable=!1),e.url=o)}),n.sourceFetchers.push(function(e,o,r,n){if(e.googleCalendarId)return a(e,o,r,n,this)})}); \ No newline at end of file
diff --git a/library/fullcalendar/locale-all.js b/library/fullcalendar/locale-all.js
index a648a74bc..689a86e07 100644
--- a/library/fullcalendar/locale-all.js
+++ b/library/fullcalendar/locale-all.js
@@ -1,5 +1,5 @@
!function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):"object"==typeof exports?module.exports=e(require("jquery"),require("moment")):e(jQuery,moment)}(function(e,a){!function(){!function(){var e=a.defineLocale("af",{months:"Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mrt_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des".split("_"),weekdays:"Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag".split("_"),weekdaysShort:"Son_Maa_Din_Woe_Don_Vry_Sat".split("_"),weekdaysMin:"So_Ma_Di_Wo_Do_Vr_Sa".split("_"),meridiemParse:/vm|nm/i,isPM:function(e){return/^nm$/i.test(e)},meridiem:function(e,a,t){return e<12?t?"vm":"VM":t?"nm":"NM"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Vandag om] LT",nextDay:"[Môre om] LT",nextWeek:"dddd [om] LT",lastDay:"[Gister om] LT",lastWeek:"[Laas] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oor %s",past:"%s gelede",s:"'n paar sekondes",m:"'n minuut",mm:"%d minute",h:"'n uur",hh:"%d ure",d:"'n dag",dd:"%d dae",M:"'n maand",MM:"%d maande",y:"'n jaar",yy:"%d jaar"},ordinalParse:/\d{1,2}(ste|de)/,ordinal:function(e){return e+(1===e||8===e||e>=20?"ste":"de")},week:{dow:1,doy:4}});return e}(),e.fullCalendar.datepickerLocale("af","af",{closeText:"Selekteer",prevText:"Vorige",nextText:"Volgende",currentText:"Vandag",monthNames:["Januarie","Februarie","Maart","April","Mei","Junie","Julie","Augustus","September","Oktober","November","Desember"],monthNamesShort:["Jan","Feb","Mrt","Apr","Mei","Jun","Jul","Aug","Sep","Okt","Nov","Des"],dayNames:["Sondag","Maandag","Dinsdag","Woensdag","Donderdag","Vrydag","Saterdag"],dayNamesShort:["Son","Maa","Din","Woe","Don","Vry","Sat"],dayNamesMin:["So","Ma","Di","Wo","Do","Vr","Sa"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("af",{buttonText:{year:"Jaar",month:"Maand",week:"Week",day:"Dag",list:"Agenda"},allDayHtml:"Heeldag",eventLimitText:"Addisionele",noEventsMessage:"Daar is geen gebeurtenis"})}(),function(){!function(){var e={1:"Ù¡",2:"Ù¢",3:"Ù£",4:"Ù¤",5:"Ù¥",6:"Ù¦",7:"Ù§",8:"Ù¨",9:"Ù©",0:"Ù "},t={"Ù¡":"1","Ù¢":"2","Ù£":"3","Ù¤":"4","Ù¥":"5","Ù¦":"6","Ù§":"7","Ù¨":"8","Ù©":"9","Ù ":"0"},n=function(e){return 0===e?0:1===e?1:2===e?2:e%100>=3&&e%100<=10?3:e%100>=11?4:5},r={s:["أقل من ثانية","ثانية واحدة",["ثانيتان","ثانيتين"],"%d ثوان","%d ثانية","%d ثانية"],m:["أقل من دقيقة","دقيقة واحدة",["دقيقتان","دقيقتين"],"%d دقائق","%d دقيقة","%d دقيقة"],h:["أقل من ساعة","ساعة واحدة",["ساعتان","ساعتين"],"%d ساعات","%d ساعة","%d ساعة"],d:["أقل من يوم","يوم واحد",["يومان","يومين"],"%d أيام","%d يومًا","%d يوم"],M:["أقل من شهر","شهر واحد",["شهران","شهرين"],"%d أشهر","%d شهرا","%d شهر"],y:["أقل من عام","عام واحد",["عامان","عامين"],"%d أعوام","%d عامًا","%d عام"]},s=function(e){return function(a,t,s,d){var i=n(a),o=r[e][n(a)];return 2===i&&(o=o[t?0:1]),o.replace(/%d/i,a)}},d=["كانون الثاني يناير","شباط Ùبراير","آذار مارس","نيسان أبريل","أيار مايو","حزيران يونيو","تموز يوليو","آب أغسطس","أيلول سبتمبر","تشرين الأول أكتوبر","تشرين الثاني نوÙمبر","كانون الأول ديسمبر"],i=a.defineLocale("ar",{months:d,monthsShort:d,weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"Ø­_Ù†_Ø«_ر_Ø®_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/â€M/â€YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/ص|Ù…/,isPM:function(e){return"Ù…"===e},meridiem:function(e,a,t){return e<12?"ص":"Ù…"},calendar:{sameDay:"[اليوم عند الساعة] LT",nextDay:"[غدًا عند الساعة] LT",nextWeek:"dddd [عند الساعة] LT",lastDay:"[أمس عند الساعة] LT",lastWeek:"dddd [عند الساعة] LT",sameElse:"L"},relativeTime:{future:"بعد %s",past:"منذ %s",s:s("s"),m:s("m"),mm:s("m"),h:s("h"),hh:s("h"),d:s("d"),dd:s("d"),M:s("M"),MM:s("M"),y:s("y"),yy:s("y")},preparse:function(e){return e.replace(/\u200f/g,"").replace(/[١٢٣٤٥٦٧٨٩٠]/g,function(e){return t[e]}).replace(/ØŒ/g,",")},postformat:function(a){return a.replace(/\d/g,function(a){return e[a]}).replace(/,/g,"ØŒ")},week:{dow:6,doy:12}});return i}(),e.fullCalendar.datepickerLocale("ar","ar",{closeText:"إغلاق",prevText:"&#x3C;السابق",nextText:"التالي&#x3E;",currentText:"اليوم",monthNames:["يناير","Ùبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوÙمبر","ديسمبر"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesShort:["أحد","اثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"],dayNamesMin:["Ø­","Ù†","Ø«","ر","Ø®","ج","س"],weekHeader:"أسبوع",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("ar",{buttonText:{month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"})}(),function(){!function(){var e=a.defineLocale("ar-dz",{months:"جانÙÙŠ_ÙÙŠÙري_مارس_Ø£Ùريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوÙمبر_ديسمبر".split("_"),monthsShort:"جانÙÙŠ_ÙÙŠÙري_مارس_Ø£Ùريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوÙمبر_ديسمبر".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"احد_اثنين_ثلاثاء_اربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"أح_إث_ثلا_أر_خم_جم_سب".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"ÙÙŠ %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:0,doy:4}});return e}(),e.fullCalendar.datepickerLocale("ar-dz","ar-DZ",{closeText:"إغلاق",prevText:"&#x3C;السابق",nextText:"التالي&#x3E;",currentText:"اليوم",monthNames:["جانÙÙŠ","ÙÙŠÙري","مارس","Ø£Ùريل","ماي","جوان","جويلية","أوت","سبتمبر","أكتوبر","نوÙمبر","ديسمبر"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesShort:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesMin:["Ø­","Ù†","Ø«","ر","Ø®","ج","س"],weekHeader:"أسبوع",dateFormat:"dd/mm/yy",firstDay:6,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("ar-dz",{buttonText:{month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"})}(),function(){!function(){var e={1:"1",2:"2",3:"3",4:"4",5:"5",6:"6",7:"7",8:"8",9:"9",0:"0"},t=function(e){return 0===e?0:1===e?1:2===e?2:e%100>=3&&e%100<=10?3:e%100>=11?4:5},n={s:["أقل من ثانية","ثانية واحدة",["ثانيتان","ثانيتين"],"%d ثوان","%d ثانية","%d ثانية"],m:["أقل من دقيقة","دقيقة واحدة",["دقيقتان","دقيقتين"],"%d دقائق","%d دقيقة","%d دقيقة"],h:["أقل من ساعة","ساعة واحدة",["ساعتان","ساعتين"],"%d ساعات","%d ساعة","%d ساعة"],d:["أقل من يوم","يوم واحد",["يومان","يومين"],"%d أيام","%d يومًا","%d يوم"],M:["أقل من شهر","شهر واحد",["شهران","شهرين"],"%d أشهر","%d شهرا","%d شهر"],y:["أقل من عام","عام واحد",["عامان","عامين"],"%d أعوام","%d عامًا","%d عام"]},r=function(e){return function(a,r,s,d){var i=t(a),o=n[e][t(a)];return 2===i&&(o=o[r?0:1]),o.replace(/%d/i,a)}},s=["يناير","Ùبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوÙمبر","ديسمبر"],d=a.defineLocale("ar-ly",{months:s,monthsShort:s,weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"Ø­_Ù†_Ø«_ر_Ø®_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/â€M/â€YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/ص|Ù…/,isPM:function(e){return"Ù…"===e},meridiem:function(e,a,t){return e<12?"ص":"Ù…"},calendar:{sameDay:"[اليوم عند الساعة] LT",nextDay:"[غدًا عند الساعة] LT",nextWeek:"dddd [عند الساعة] LT",lastDay:"[أمس عند الساعة] LT",lastWeek:"dddd [عند الساعة] LT",sameElse:"L"},relativeTime:{future:"بعد %s",past:"منذ %s",s:r("s"),m:r("m"),mm:r("m"),h:r("h"),hh:r("h"),d:r("d"),dd:r("d"),M:r("M"),MM:r("M"),y:r("y"),yy:r("y")},preparse:function(e){return e.replace(/\u200f/g,"").replace(/ØŒ/g,",")},postformat:function(a){return a.replace(/\d/g,function(a){return e[a]}).replace(/,/g,"ØŒ")},week:{dow:6,doy:12}});return d}(),e.fullCalendar.datepickerLocale("ar-ly","ar",{closeText:"إغلاق",prevText:"&#x3C;السابق",nextText:"التالي&#x3E;",currentText:"اليوم",monthNames:["يناير","Ùبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوÙمبر","ديسمبر"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesShort:["أحد","اثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"],dayNamesMin:["Ø­","Ù†","Ø«","ر","Ø®","ج","س"],weekHeader:"أسبوع",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("ar-ly",{buttonText:{month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"})}(),function(){!function(){var e=a.defineLocale("ar-ma",{months:"يناير_Ùبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),monthsShort:"يناير_Ùبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),weekdays:"الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"Ø­_Ù†_Ø«_ر_Ø®_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"ÙÙŠ %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:6,doy:12}});return e}(),e.fullCalendar.datepickerLocale("ar-ma","ar",{closeText:"إغلاق",prevText:"&#x3C;السابق",nextText:"التالي&#x3E;",currentText:"اليوم",monthNames:["يناير","Ùبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوÙمبر","ديسمبر"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesShort:["أحد","اثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"],dayNamesMin:["Ø­","Ù†","Ø«","ر","Ø®","ج","س"],weekHeader:"أسبوع",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("ar-ma",{buttonText:{month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"})}(),function(){!function(){var e={1:"Ù¡",2:"Ù¢",3:"Ù£",4:"Ù¤",5:"Ù¥",6:"Ù¦",7:"Ù§",8:"Ù¨",9:"Ù©",0:"Ù "},t={"Ù¡":"1","Ù¢":"2","Ù£":"3","Ù¤":"4","Ù¥":"5","Ù¦":"6","Ù§":"7","Ù¨":"8","Ù©":"9","Ù ":"0"},n=a.defineLocale("ar-sa",{months:"يناير_Ùبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوÙمبر_ديسمبر".split("_"),monthsShort:"يناير_Ùبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوÙمبر_ديسمبر".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"Ø­_Ù†_Ø«_ر_Ø®_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/ص|Ù…/,isPM:function(e){return"Ù…"===e},meridiem:function(e,a,t){return e<12?"ص":"Ù…"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"ÙÙŠ %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},preparse:function(e){return e.replace(/[١٢٣٤٥٦٧٨٩٠]/g,function(e){return t[e]}).replace(/ØŒ/g,",")},postformat:function(a){return a.replace(/\d/g,function(a){return e[a]}).replace(/,/g,"ØŒ")},week:{dow:0,doy:6}});return n}(),e.fullCalendar.datepickerLocale("ar-sa","ar",{closeText:"إغلاق",prevText:"&#x3C;السابق",nextText:"التالي&#x3E;",currentText:"اليوم",monthNames:["يناير","Ùبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوÙمبر","ديسمبر"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesShort:["أحد","اثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"],dayNamesMin:["Ø­","Ù†","Ø«","ر","Ø®","ج","س"],weekHeader:"أسبوع",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("ar-sa",{buttonText:{month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"})}(),function(){!function(){var e=a.defineLocale("ar-tn",{months:"جانÙÙŠ_ÙÙŠÙري_مارس_Ø£Ùريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوÙمبر_ديسمبر".split("_"),monthsShort:"جانÙÙŠ_ÙÙŠÙري_مارس_Ø£Ùريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوÙمبر_ديسمبر".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"Ø­_Ù†_Ø«_ر_Ø®_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"ÙÙŠ %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:1,doy:4}});return e}(),e.fullCalendar.datepickerLocale("ar-tn","ar",{closeText:"إغلاق",prevText:"&#x3C;السابق",nextText:"التالي&#x3E;",currentText:"اليوم",monthNames:["يناير","Ùبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوÙمبر","ديسمبر"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesShort:["أحد","اثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"],dayNamesMin:["Ø­","Ù†","Ø«","ر","Ø®","ج","س"],weekHeader:"أسبوع",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("ar-tn",{buttonText:{month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"})}(),function(){!function(){var e=a.defineLocale("bg",{months:"Ñнуари_февруари_март_април_май_юни_юли_авгуÑÑ‚_Ñептември_октомври_ноември_декември".split("_"),monthsShort:"Ñнр_фев_мар_апр_май_юни_юли_авг_Ñеп_окт_ное_дек".split("_"),weekdays:"неделÑ_понеделник_вторник_ÑÑ€Ñда_четвъртък_петък_Ñъбота".split("_"),weekdaysShort:"нед_пон_вто_ÑÑ€Ñ_чет_пет_Ñъб".split("_"),weekdaysMin:"нд_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[Ð”Ð½ÐµÑ Ð²] LT",nextDay:"[Утре в] LT",nextWeek:"dddd [в] LT",lastDay:"[Вчера в] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[Ð’ изминалата] dddd [в] LT";case 1:case 2:case 4:case 5:return"[Ð’ изминалиÑ] dddd [в] LT"}},sameElse:"L"},relativeTime:{future:"Ñлед %s",past:"преди %s",s:"нÑколко Ñекунди",m:"минута",mm:"%d минути",h:"чаÑ",hh:"%d чаÑа",d:"ден",dd:"%d дни",M:"меÑец",MM:"%d меÑеца",y:"година",yy:"%d години"},ordinalParse:/\d{1,2}-(ев|ен|ти|ви|ри|ми)/,ordinal:function(e){var a=e%10,t=e%100;return 0===e?e+"-ев":0===t?e+"-ен":t>10&&t<20?e+"-ти":1===a?e+"-ви":2===a?e+"-ри":7===a||8===a?e+"-ми":e+"-ти"},week:{dow:1,doy:7}});return e}(),e.fullCalendar.datepickerLocale("bg","bg",{closeText:"затвори",prevText:"&#x3C;назад",nextText:"напред&#x3E;",nextBigText:"&#x3E;&#x3E;",currentText:"днеÑ",monthNames:["Януари","Февруари","Март","Ðприл","Май","Юни","Юли","ÐвгуÑÑ‚","Септември","Октомври","Ðоември","Декември"],monthNamesShort:["Яну","Фев","Мар","Ðпр","Май","Юни","Юли","Ðвг","Сеп","Окт","Ðов","Дек"],dayNames:["ÐеделÑ","Понеделник","Вторник","СрÑда","Четвъртък","Петък","Събота"],dayNamesShort:["Ðед","Пон","Вто","СрÑ","Чет","Пет","Съб"],dayNamesMin:["Ðе","По","Ð’Ñ‚","Ср","Че","Пе","Съ"],weekHeader:"Wk",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("bg",{buttonText:{month:"МеÑец",week:"Седмица",day:"Ден",list:"График"},allDayText:"ЦÑл ден",eventLimitText:function(e){return"+още "+e},noEventsMessage:"ÐÑма ÑÑŠÐ±Ð¸Ñ‚Ð¸Ñ Ð·Ð° показване"})}(),function(){!function(){var e=a.defineLocale("ca",{months:"gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre".split("_"),monthsShort:"gen._febr._mar._abr._mai._jun._jul._ag._set._oct._nov._des.".split("_"),monthsParseExact:!0,weekdays:"diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte".split("_"),weekdaysShort:"dg._dl._dt._dc._dj._dv._ds.".split("_"),weekdaysMin:"Dg_Dl_Dt_Dc_Dj_Dv_Ds".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd D MMMM YYYY H:mm"},calendar:{sameDay:function(){return"[avui a "+(1!==this.hours()?"les":"la")+"] LT"},nextDay:function(){return"[demà a "+(1!==this.hours()?"les":"la")+"] LT"},nextWeek:function(){return"dddd [a "+(1!==this.hours()?"les":"la")+"] LT"},lastDay:function(){return"[ahir a "+(1!==this.hours()?"les":"la")+"] LT"},lastWeek:function(){return"[el] dddd [passat a "+(1!==this.hours()?"les":"la")+"] LT"},sameElse:"L"},relativeTime:{future:"d'aquí %s",past:"fa %s",s:"uns segons",m:"un minut",mm:"%d minuts",h:"una hora",hh:"%d hores",d:"un dia",dd:"%d dies",M:"un mes",MM:"%d mesos",y:"un any",yy:"%d anys"},ordinalParse:/\d{1,2}(r|n|t|è|a)/,ordinal:function(e,a){var t=1===e?"r":2===e?"n":3===e?"r":4===e?"t":"è";return"w"!==a&&"W"!==a||(t="a"),e+t},week:{dow:1,doy:4}});return e}(),e.fullCalendar.datepickerLocale("ca","ca",{closeText:"Tanca",prevText:"Anterior",nextText:"Següent",currentText:"Avui",monthNames:["gener","febrer","març","abril","maig","juny","juliol","agost","setembre","octubre","novembre","desembre"],monthNamesShort:["gen","feb","març","abr","maig","juny","jul","ag","set","oct","nov","des"],dayNames:["diumenge","dilluns","dimarts","dimecres","dijous","divendres","dissabte"],dayNamesShort:["dg","dl","dt","dc","dj","dv","ds"],dayNamesMin:["dg","dl","dt","dc","dj","dv","ds"],weekHeader:"Set",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("ca",{buttonText:{month:"Mes",week:"Setmana",day:"Dia",list:"Agenda"},allDayText:"Tot el dia",eventLimitText:"més",noEventsMessage:"No hi ha esdeveniments per mostrar"})}(),function(){!function(){function e(e){return e>1&&e<5&&1!==~~(e/10)}function t(a,t,n,r){var s=a+" ";switch(n){case"s":return t||r?"pár sekund":"pár sekundami";case"m":return t?"minuta":r?"minutu":"minutou";case"mm":return t||r?s+(e(a)?"minuty":"minut"):s+"minutami";case"h":return t?"hodina":r?"hodinu":"hodinou";case"hh":return t||r?s+(e(a)?"hodiny":"hodin"):s+"hodinami";case"d":return t||r?"den":"dnem";case"dd":return t||r?s+(e(a)?"dny":"dní"):s+"dny";case"M":return t||r?"mÄ›síc":"mÄ›sícem";case"MM":return t||r?s+(e(a)?"mÄ›síce":"mÄ›síců"):s+"mÄ›síci";case"y":return t||r?"rok":"rokem";case"yy":return t||r?s+(e(a)?"roky":"let"):s+"lety"}}var n="leden_únor_bÅ™ezen_duben_kvÄ›ten_Äerven_Äervenec_srpen_září_říjen_listopad_prosinec".split("_"),r="led_úno_bÅ™e_dub_kvÄ›_Ävn_Ävc_srp_zář_říj_lis_pro".split("_"),s=a.defineLocale("cs",{months:n,monthsShort:r,monthsParse:function(e,a){var t,n=[];for(t=0;t<12;t++)n[t]=new RegExp("^"+e[t]+"$|^"+a[t]+"$","i");return n}(n,r),shortMonthsParse:function(e){var a,t=[];for(a=0;a<12;a++)t[a]=new RegExp("^"+e[a]+"$","i");return t}(r),longMonthsParse:function(e){var a,t=[];for(a=0;a<12;a++)t[a]=new RegExp("^"+e[a]+"$","i");return t}(n),weekdays:"nedÄ›le_pondÄ›lí_úterý_stÅ™eda_Ätvrtek_pátek_sobota".split("_"),weekdaysShort:"ne_po_út_st_Ät_pá_so".split("_"),weekdaysMin:"ne_po_út_st_Ät_pá_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm",l:"D. M. YYYY"},calendar:{sameDay:"[dnes v] LT",nextDay:"[zítra v] LT",nextWeek:function(){switch(this.day()){case 0:return"[v nedÄ›li v] LT";case 1:case 2:return"[v] dddd [v] LT";case 3:return"[ve stÅ™edu v] LT";case 4:return"[ve Ätvrtek v] LT";case 5:return"[v pátek v] LT";case 6:return"[v sobotu v] LT"}},lastDay:"[vÄera v] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulou nedÄ›li v] LT";case 1:case 2:return"[minulé] dddd [v] LT";case 3:return"[minulou stÅ™edu v] LT";case 4:case 5:return"[minulý] dddd [v] LT";case 6:return"[minulou sobotu v] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"pÅ™ed %s",s:t,m:t,mm:t,h:t,hh:t,d:t,dd:t,M:t,MM:t,y:t,yy:t},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return s}(),e.fullCalendar.datepickerLocale("cs","cs",{closeText:"Zavřít",prevText:"&#x3C;Dříve",nextText:"PozdÄ›ji&#x3E;",currentText:"Nyní",monthNames:["leden","únor","bÅ™ezen","duben","kvÄ›ten","Äerven","Äervenec","srpen","září","říjen","listopad","prosinec"],monthNamesShort:["led","úno","bÅ™e","dub","kvÄ›","Äer","Ävc","srp","zář","říj","lis","pro"],dayNames:["nedÄ›le","pondÄ›lí","úterý","stÅ™eda","Ätvrtek","pátek","sobota"],dayNamesShort:["ne","po","út","st","Ät","pá","so"],dayNamesMin:["ne","po","út","st","Ät","pá","so"],weekHeader:"Týd",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("cs",{buttonText:{month:"MÄ›síc",week:"Týden",day:"Den",list:"Agenda"},allDayText:"Celý den",eventLimitText:function(e){return"+další: "+e},noEventsMessage:"Žádné akce k zobrazení"})}(),function(){!function(){var e=a.defineLocale("da",{months:"januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"søn_man_tir_ons_tor_fre_lør".split("_"),weekdaysMin:"sø_ma_ti_on_to_fr_lø".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd [d.] D. MMMM YYYY HH:mm"},calendar:{sameDay:"[I dag kl.] LT",nextDay:"[I morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[I gÃ¥r kl.] LT",lastWeek:"[sidste] dddd [kl] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"fÃ¥ sekunder",m:"et minut",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dage",M:"en mÃ¥ned",MM:"%d mÃ¥neder",y:"et Ã¥r",yy:"%d Ã¥r"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return e}(),e.fullCalendar.datepickerLocale("da","da",{closeText:"Luk",prevText:"&#x3C;Forrige",nextText:"Næste&#x3E;",currentText:"Idag",monthNames:["Januar","Februar","Marts","April","Maj","Juni","Juli","August","September","Oktober","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],dayNames:["Søndag","Mandag","Tirsdag","Onsdag","Torsdag","Fredag","Lørdag"],dayNamesShort:["Søn","Man","Tir","Ons","Tor","Fre","Lør"],dayNamesMin:["Sø","Ma","Ti","On","To","Fr","Lø"],weekHeader:"Uge",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("da",{buttonText:{month:"MÃ¥ned",week:"Uge",day:"Dag",list:"Agenda"},allDayText:"Hele dagen",eventLimitText:"flere",noEventsMessage:"Ingen arrangementer at vise"})}(),function(){!function(){function e(e,a,t,n){var r={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[e+" Tage",e+" Tagen"],M:["ein Monat","einem Monat"],MM:[e+" Monate",e+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[e+" Jahre",e+" Jahren"]};return a?r[t][0]:r[t][1]}var t=a.defineLocale("de",{months:"Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",m:e,mm:"%d Minuten",h:e,hh:"%d Stunden",d:e,dd:e,M:e,MM:e,y:e,yy:e},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return t}(),e.fullCalendar.datepickerLocale("de","de",{closeText:"Schließen",prevText:"&#x3C;Zurück",nextText:"Vor&#x3E;",currentText:"Heute",monthNames:["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],monthNamesShort:["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],dayNames:["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],dayNamesShort:["So","Mo","Di","Mi","Do","Fr","Sa"],dayNamesMin:["So","Mo","Di","Mi","Do","Fr","Sa"],weekHeader:"KW",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("de",{buttonText:{month:"Monat",week:"Woche",day:"Tag",list:"Terminübersicht"},allDayText:"Ganztägig",eventLimitText:function(e){return"+ weitere "+e},noEventsMessage:"Keine Ereignisse anzuzeigen"})}(),function(){!function(){function e(e,a,t,n){var r={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[e+" Tage",e+" Tagen"],M:["ein Monat","einem Monat"],MM:[e+" Monate",e+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[e+" Jahre",e+" Jahren"]};return a?r[t][0]:r[t][1]}var t=a.defineLocale("de-at",{months:"Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jän._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",m:e,mm:"%d Minuten",h:e,hh:"%d Stunden",d:e,dd:e,M:e,MM:e,y:e,yy:e},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return t}(),e.fullCalendar.datepickerLocale("de-at","de",{closeText:"Schließen",prevText:"&#x3C;Zurück",nextText:"Vor&#x3E;",currentText:"Heute",monthNames:["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],monthNamesShort:["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],dayNames:["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],dayNamesShort:["So","Mo","Di","Mi","Do","Fr","Sa"],dayNamesMin:["So","Mo","Di","Mi","Do","Fr","Sa"],weekHeader:"KW",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("de-at",{buttonText:{month:"Monat",week:"Woche",day:"Tag",list:"Terminübersicht"},allDayText:"Ganztägig",eventLimitText:function(e){return"+ weitere "+e},noEventsMessage:"Keine Ereignisse anzuzeigen"})}(),function(){!function(){function e(e){return e instanceof Function||"[object Function]"===Object.prototype.toString.call(e)}var t=a.defineLocale("el",{monthsNominativeEl:"ΙανουάÏιος_ΦεβÏουάÏιος_ΜάÏτιος_ΑπÏίλιος_Μάιος_ΙοÏνιος_ΙοÏλιος_ΑÏγουστος_ΣεπτέμβÏιος_ΟκτώβÏιος_ÎοέμβÏιος_ΔεκέμβÏιος".split("_"),monthsGenitiveEl:"ΙανουαÏίου_ΦεβÏουαÏίου_ΜαÏτίου_ΑπÏιλίου_ΜαÎου_Ιουνίου_Ιουλίου_ΑυγοÏστου_ΣεπτεμβÏίου_ΟκτωβÏίου_ÎοεμβÏίου_ΔεκεμβÏίου".split("_"),months:function(e,a){return/D/.test(a.substring(0,a.indexOf("MMMM")))?this._monthsGenitiveEl[e.month()]:this._monthsNominativeEl[e.month()]},monthsShort:"Ιαν_Φεβ_ΜαÏ_ΑπÏ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Îοε_Δεκ".split("_"),weekdays:"ΚυÏιακή_ΔευτέÏα_ΤÏίτη_ΤετάÏτη_Πέμπτη_ΠαÏασκευή_Σάββατο".split("_"),weekdaysShort:"ΚυÏ_Δευ_ΤÏι_Τετ_Πεμ_ΠαÏ_Σαβ".split("_"),weekdaysMin:"Κυ_Δε_ΤÏ_Τε_Πε_Πα_Σα".split("_"),meridiem:function(e,a,t){return e>11?t?"μμ":"ΜΜ":t?"πμ":"ΠΜ"},isPM:function(e){return"μ"===(e+"").toLowerCase()[0]},meridiemParse:/[ΠΜ]\.?Îœ?\.?/i,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendarEl:{sameDay:"[ΣήμεÏα {}] LT",nextDay:"[ΑÏÏιο {}] LT",nextWeek:"dddd [{}] LT",lastDay:"[Χθες {}] LT",lastWeek:function(){switch(this.day()){case 6:return"[το Ï€ÏοηγοÏμενο] dddd [{}] LT";default:return"[την Ï€ÏοηγοÏμενη] dddd [{}] LT"}},sameElse:"L"},calendar:function(a,t){var n=this._calendarEl[a],r=t&&t.hours();return e(n)&&(n=n.apply(t)),n.replace("{}",r%12===1?"στη":"στις")},relativeTime:{future:"σε %s",past:"%s Ï€Ïιν",s:"λίγα δευτεÏόλεπτα",m:"ένα λεπτό",mm:"%d λεπτά",h:"μία ÏŽÏα",hh:"%d ÏŽÏες",d:"μία μέÏα",dd:"%d μέÏες",M:"ένας μήνας",MM:"%d μήνες",y:"ένας χÏόνος",yy:"%d χÏόνια"},ordinalParse:/\d{1,2}η/,ordinal:"%dη",week:{dow:1,doy:4}});return t}(),e.fullCalendar.datepickerLocale("el","el",{closeText:"Κλείσιμο",prevText:"ΠÏοηγοÏμενος",nextText:"Επόμενος",currentText:"ΣήμεÏα",monthNames:["ΙανουάÏιος","ΦεβÏουάÏιος","ΜάÏτιος","ΑπÏίλιος","Μάιος","ΙοÏνιος","ΙοÏλιος","ΑÏγουστος","ΣεπτέμβÏιος","ΟκτώβÏιος","ÎοέμβÏιος","ΔεκέμβÏιος"],monthNamesShort:["Ιαν","Φεβ","ΜαÏ","ΑπÏ","Μαι","Ιουν","Ιουλ","Αυγ","Σεπ","Οκτ","Îοε","Δεκ"],dayNames:["ΚυÏιακή","ΔευτέÏα","ΤÏίτη","ΤετάÏτη","Πέμπτη","ΠαÏασκευή","Σάββατο"],dayNamesShort:["ΚυÏ","Δευ","ΤÏι","Τετ","Πεμ","ΠαÏ","Σαβ"],dayNamesMin:["Κυ","Δε","ΤÏ","Τε","Πε","Πα","Σα"],weekHeader:"Εβδ",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("el",{buttonText:{month:"Μήνας",week:"Εβδομάδα",day:"ΗμέÏα",list:"Ατζέντα"},allDayText:"ΟλοήμεÏο",eventLimitText:"πεÏισσότεÏα",noEventsMessage:"Δεν υπάÏχουν γεγονότα για να εμφανιστεί"})}(),function(){!function(){var e=a.defineLocale("en-au",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var a=e%10,t=1===~~(e%100/10)?"th":1===a?"st":2===a?"nd":3===a?"rd":"th";return e+t},week:{
-dow:1,doy:4}});return e}(),e.fullCalendar.datepickerLocale("en-au","en-AU",{closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("en-au")}(),function(){!function(){var e=a.defineLocale("en-ca",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"YYYY-MM-DD",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var a=e%10,t=1===~~(e%100/10)?"th":1===a?"st":2===a?"nd":3===a?"rd":"th";return e+t}});return e}(),e.fullCalendar.locale("en-ca")}(),function(){!function(){var e=a.defineLocale("en-gb",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var a=e%10,t=1===~~(e%100/10)?"th":1===a?"st":2===a?"nd":3===a?"rd":"th";return e+t},week:{dow:1,doy:4}});return e}(),e.fullCalendar.datepickerLocale("en-gb","en-GB",{closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("en-gb")}(),function(){!function(){var e=a.defineLocale("en-ie",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var a=e%10,t=1===~~(e%100/10)?"th":1===a?"st":2===a?"nd":3===a?"rd":"th";return e+t},week:{dow:1,doy:4}});return e}(),e.fullCalendar.locale("en-ie")}(),function(){!function(){var e=a.defineLocale("en-nz",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var a=e%10,t=1===~~(e%100/10)?"th":1===a?"st":2===a?"nd":3===a?"rd":"th";return e+t},week:{dow:1,doy:4}});return e}(),e.fullCalendar.datepickerLocale("en-nz","en-NZ",{closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("en-nz")}(),function(){!function(){var e="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),t="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),n=a.defineLocale("es",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(a,n){return/-MMM-/.test(n)?t[a.month()]:e[a.month()]},monthsParseExact:!0,weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[mañana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}});return n}(),e.fullCalendar.datepickerLocale("es","es",{closeText:"Cerrar",prevText:"&#x3C;Ant",nextText:"Sig&#x3E;",currentText:"Hoy",monthNames:["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],monthNamesShort:["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"],dayNames:["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],dayNamesShort:["dom","lun","mar","mié","jue","vie","sáb"],dayNamesMin:["D","L","M","X","J","V","S"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("es",{buttonText:{month:"Mes",week:"Semana",day:"Día",list:"Agenda"},allDayHtml:"Todo<br/>el día",eventLimitText:"más",noEventsMessage:"No hay eventos para mostrar"})}(),function(){!function(){var e="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),t="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),n=a.defineLocale("es-do",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(a,n){return/-MMM-/.test(n)?t[a.month()]:e[a.month()]},monthsParseExact:!0,weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY h:mm A",LLLL:"dddd, D [de] MMMM [de] YYYY h:mm A"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[mañana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}});return n}(),e.fullCalendar.datepickerLocale("es-do","es",{closeText:"Cerrar",prevText:"&#x3C;Ant",nextText:"Sig&#x3E;",currentText:"Hoy",monthNames:["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],monthNamesShort:["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"],dayNames:["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],dayNamesShort:["dom","lun","mar","mié","jue","vie","sáb"],dayNamesMin:["D","L","M","X","J","V","S"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("es-do",{buttonText:{month:"Mes",week:"Semana",day:"Día",list:"Agenda"},allDayHtml:"Todo<br/>el día",eventLimitText:"más",noEventsMessage:"No hay eventos para mostrar"})}(),function(){!function(){var e=a.defineLocale("eu",{months:"urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua".split("_"),monthsShort:"urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.".split("_"),monthsParseExact:!0,weekdays:"igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata".split("_"),weekdaysShort:"ig._al._ar._az._og._ol._lr.".split("_"),weekdaysMin:"ig_al_ar_az_og_ol_lr".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY[ko] MMMM[ren] D[a]",LLL:"YYYY[ko] MMMM[ren] D[a] HH:mm",LLLL:"dddd, YYYY[ko] MMMM[ren] D[a] HH:mm",l:"YYYY-M-D",ll:"YYYY[ko] MMM D[a]",lll:"YYYY[ko] MMM D[a] HH:mm",llll:"ddd, YYYY[ko] MMM D[a] HH:mm"},calendar:{sameDay:"[gaur] LT[etan]",nextDay:"[bihar] LT[etan]",nextWeek:"dddd LT[etan]",lastDay:"[atzo] LT[etan]",lastWeek:"[aurreko] dddd LT[etan]",sameElse:"L"},relativeTime:{future:"%s barru",past:"duela %s",s:"segundo batzuk",m:"minutu bat",mm:"%d minutu",h:"ordu bat",hh:"%d ordu",d:"egun bat",dd:"%d egun",M:"hilabete bat",MM:"%d hilabete",y:"urte bat",yy:"%d urte"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}});return e}(),e.fullCalendar.datepickerLocale("eu","eu",{closeText:"Egina",prevText:"&#x3C;Aur",nextText:"Hur&#x3E;",currentText:"Gaur",monthNames:["urtarrila","otsaila","martxoa","apirila","maiatza","ekaina","uztaila","abuztua","iraila","urria","azaroa","abendua"],monthNamesShort:["urt.","ots.","mar.","api.","mai.","eka.","uzt.","abu.","ira.","urr.","aza.","abe."],dayNames:["igandea","astelehena","asteartea","asteazkena","osteguna","ostirala","larunbata"],dayNamesShort:["ig.","al.","ar.","az.","og.","ol.","lr."],dayNamesMin:["ig","al","ar","az","og","ol","lr"],weekHeader:"As",dateFormat:"yy-mm-dd",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("eu",{buttonText:{month:"Hilabetea",week:"Astea",day:"Eguna",list:"Agenda"},allDayHtml:"Egun<br/>osoa",eventLimitText:"gehiago",noEventsMessage:"Ez dago ekitaldirik erakusteko"})}(),function(){!function(){var e={1:"Û±",2:"Û²",3:"Û³",4:"Û´",5:"Ûµ",6:"Û¶",7:"Û·",8:"Û¸",9:"Û¹",0:"Û°"},t={"Û±":"1","Û²":"2","Û³":"3","Û´":"4","Ûµ":"5","Û¶":"6","Û·":"7","Û¸":"8","Û¹":"9","Û°":"0"},n=a.defineLocale("fa",{months:"ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),monthsShort:"ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),weekdays:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysShort:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysMin:"ÛŒ_د_س_Ú†_Ù¾_ج_Ø´".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},meridiemParse:/قبل از ظهر|بعد از ظهر/,isPM:function(e){return/بعد از ظهر/.test(e)},meridiem:function(e,a,t){return e<12?"قبل از ظهر":"بعد از ظهر"},calendar:{sameDay:"[امروز ساعت] LT",nextDay:"[Ùردا ساعت] LT",nextWeek:"dddd [ساعت] LT",lastDay:"[دیروز ساعت] LT",lastWeek:"dddd [پیش] [ساعت] LT",sameElse:"L"},relativeTime:{future:"در %s",past:"%s پیش",s:"چندین ثانیه",m:"یک دقیقه",mm:"%d دقیقه",h:"یک ساعت",hh:"%d ساعت",d:"یک روز",dd:"%d روز",M:"یک ماه",MM:"%d ماه",y:"یک سال",yy:"%d سال"},preparse:function(e){return e.replace(/[Û°-Û¹]/g,function(e){return t[e]}).replace(/ØŒ/g,",")},postformat:function(a){return a.replace(/\d/g,function(a){return e[a]}).replace(/,/g,"ØŒ")},ordinalParse:/\d{1,2}Ù…/,ordinal:"%dÙ…",week:{dow:6,doy:12}});return n}(),e.fullCalendar.datepickerLocale("fa","fa",{closeText:"بستن",prevText:"&#x3C;قبلی",nextText:"بعدی&#x3E;",currentText:"امروز",monthNames:["ژانویه","Ùوریه","مارس","آوریل","مه","ژوئن","ژوئیه","اوت","سپتامبر","اکتبر","نوامبر","دسامبر"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["يکشنبه","دوشنبه","سه‌شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],dayNamesShort:["ÛŒ","د","س","Ú†","Ù¾","ج","Ø´"],dayNamesMin:["ÛŒ","د","س","Ú†","Ù¾","ج","Ø´"],weekHeader:"Ù‡Ù",dateFormat:"yy/mm/dd",firstDay:6,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("fa",{buttonText:{month:"ماه",week:"Ù‡Ùته",day:"روز",list:"برنامه"},allDayText:"تمام روز",eventLimitText:function(e){return"بیش از "+e},noEventsMessage:"هیچ رویدادی به نمایش"})}(),function(){!function(){function e(e,a,n,r){var s="";switch(n){case"s":return r?"muutaman sekunnin":"muutama sekunti";case"m":return r?"minuutin":"minuutti";case"mm":s=r?"minuutin":"minuuttia";break;case"h":return r?"tunnin":"tunti";case"hh":s=r?"tunnin":"tuntia";break;case"d":return r?"päivän":"päivä";case"dd":s=r?"päivän":"päivää";break;case"M":return r?"kuukauden":"kuukausi";case"MM":s=r?"kuukauden":"kuukautta";break;case"y":return r?"vuoden":"vuosi";case"yy":s=r?"vuoden":"vuotta"}return s=t(e,r)+" "+s}function t(e,a){return e<10?a?r[e]:n[e]:e}var n="nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän".split(" "),r=["nolla","yhden","kahden","kolmen","neljän","viiden","kuuden",n[7],n[8],n[9]],s=a.defineLocale("fi",{months:"tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"),monthsShort:"tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu".split("_"),weekdays:"sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai".split("_"),weekdaysShort:"su_ma_ti_ke_to_pe_la".split("_"),weekdaysMin:"su_ma_ti_ke_to_pe_la".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"Do MMMM[ta] YYYY",LLL:"Do MMMM[ta] YYYY, [klo] HH.mm",LLLL:"dddd, Do MMMM[ta] YYYY, [klo] HH.mm",l:"D.M.YYYY",ll:"Do MMM YYYY",lll:"Do MMM YYYY, [klo] HH.mm",llll:"ddd, Do MMM YYYY, [klo] HH.mm"},calendar:{sameDay:"[tänään] [klo] LT",nextDay:"[huomenna] [klo] LT",nextWeek:"dddd [klo] LT",lastDay:"[eilen] [klo] LT",lastWeek:"[viime] dddd[na] [klo] LT",sameElse:"L"},relativeTime:{future:"%s päästä",past:"%s sitten",s:e,m:e,mm:e,h:e,hh:e,d:e,dd:e,M:e,MM:e,y:e,yy:e},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return s}(),e.fullCalendar.datepickerLocale("fi","fi",{closeText:"Sulje",prevText:"&#xAB;Edellinen",nextText:"Seuraava&#xBB;",currentText:"Tänään",monthNames:["Tammikuu","Helmikuu","Maaliskuu","Huhtikuu","Toukokuu","Kesäkuu","Heinäkuu","Elokuu","Syyskuu","Lokakuu","Marraskuu","Joulukuu"],monthNamesShort:["Tammi","Helmi","Maalis","Huhti","Touko","Kesä","Heinä","Elo","Syys","Loka","Marras","Joulu"],dayNamesShort:["Su","Ma","Ti","Ke","To","Pe","La"],dayNames:["Sunnuntai","Maanantai","Tiistai","Keskiviikko","Torstai","Perjantai","Lauantai"],dayNamesMin:["Su","Ma","Ti","Ke","To","Pe","La"],weekHeader:"Vk",dateFormat:"d.m.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("fi",{buttonText:{month:"Kuukausi",week:"Viikko",day:"Päivä",list:"Tapahtumat"},allDayText:"Koko päivä",eventLimitText:"lisää",noEventsMessage:"Ei tapahtumia näytettäviä"})}(),function(){!function(){var e=a.defineLocale("fr",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd'hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinalParse:/\d{1,2}(er|)/,ordinal:function(e){return e+(1===e?"er":"")},week:{dow:1,doy:4}});return e}(),e.fullCalendar.datepickerLocale("fr","fr",{closeText:"Fermer",prevText:"Précédent",nextText:"Suivant",currentText:"Aujourd'hui",monthNames:["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],monthNamesShort:["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],dayNames:["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],dayNamesShort:["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],dayNamesMin:["D","L","M","M","J","V","S"],weekHeader:"Sem.",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("fr",{buttonText:{year:"Année",month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},allDayHtml:"Toute la<br/>journée",eventLimitText:"en plus",noEventsMessage:"Aucun événement à afficher"})}(),function(){!function(){var e=a.defineLocale("fr-ca",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd'hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinalParse:/\d{1,2}(er|e)/,ordinal:function(e){return e+(1===e?"er":"e")}});return e}(),e.fullCalendar.datepickerLocale("fr-ca","fr-CA",{closeText:"Fermer",prevText:"Précédent",nextText:"Suivant",currentText:"Aujourd'hui",monthNames:["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],monthNamesShort:["janv.","févr.","mars","avril","mai","juin","juil.","août","sept.","oct.","nov.","déc."],dayNames:["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],dayNamesShort:["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],dayNamesMin:["D","L","M","M","J","V","S"],weekHeader:"Sem.",dateFormat:"yy-mm-dd",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("fr-ca",{buttonText:{year:"Année",month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},allDayHtml:"Toute la<br/>journée",eventLimitText:"en plus",noEventsMessage:"Aucun événement à afficher"})}(),function(){!function(){var e=a.defineLocale("fr-ch",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd'hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinalParse:/\d{1,2}(er|e)/,ordinal:function(e){return e+(1===e?"er":"e")},week:{dow:1,doy:4}});return e}(),e.fullCalendar.datepickerLocale("fr-ch","fr-CH",{closeText:"Fermer",prevText:"&#x3C;Préc",nextText:"Suiv&#x3E;",currentText:"Courant",monthNames:["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],monthNamesShort:["janv.","févr.","mars","avril","mai","juin","juil.","août","sept.","oct.","nov.","déc."],dayNames:["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],dayNamesShort:["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],dayNamesMin:["D","L","M","M","J","V","S"],weekHeader:"Sm",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("fr-ch",{buttonText:{year:"Année",month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},allDayHtml:"Toute la<br/>journée",eventLimitText:"en plus",noEventsMessage:"Aucun événement à afficher"})}(),function(){!function(){var e=a.defineLocale("gl",{months:"xaneiro_febreiro_marzo_abril_maio_xuño_xullo_agosto_setembro_outubro_novembro_decembro".split("_"),monthsShort:"xan._feb._mar._abr._mai._xuñ._xul._ago._set._out._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"domingo_luns_martes_mércores_xoves_venres_sábado".split("_"),weekdaysShort:"dom._lun._mar._mér._xov._ven._sáb.".split("_"),weekdaysMin:"do_lu_ma_mé_xo_ve_sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoxe "+(1!==this.hours()?"ás":"á")+"] LT"},nextDay:function(){return"[mañá "+(1!==this.hours()?"ás":"á")+"] LT"},nextWeek:function(){return"dddd ["+(1!==this.hours()?"ás":"a")+"] LT"},lastDay:function(){return"[onte "+(1!==this.hours()?"á":"a")+"] LT"},lastWeek:function(){return"[o] dddd [pasado "+(1!==this.hours()?"ás":"a")+"] LT"},sameElse:"L"},relativeTime:{future:function(e){return 0===e.indexOf("un")?"n"+e:"en "+e},past:"hai %s",s:"uns segundos",m:"un minuto",mm:"%d minutos",h:"unha hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un ano",yy:"%d anos"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}});return e}(),e.fullCalendar.datepickerLocale("gl","gl",{closeText:"Pechar",prevText:"&#x3C;Ant",nextText:"Seg&#x3E;",currentText:"Hoxe",monthNames:["Xaneiro","Febreiro","Marzo","Abril","Maio","Xuño","Xullo","Agosto","Setembro","Outubro","Novembro","Decembro"],monthNamesShort:["Xan","Feb","Mar","Abr","Mai","Xuñ","Xul","Ago","Set","Out","Nov","Dec"],dayNames:["Domingo","Luns","Martes","Mércores","Xoves","Venres","Sábado"],dayNamesShort:["Dom","Lun","Mar","Mér","Xov","Ven","Sáb"],dayNamesMin:["Do","Lu","Ma","Mé","Xo","Ve","Sá"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("gl",{buttonText:{month:"Mes",week:"Semana",day:"Día",list:"Axenda"},allDayHtml:"Todo<br/>o día",eventLimitText:"máis",noEventsMessage:"Non hai eventos para amosar"})}(),function(){!function(){var e=a.defineLocale("he",{months:"ינו×ר_פברו×ר_מרץ_×פריל_מ××™_יוני_יולי_×וגוסט_ספטמבר_×וקטובר_נובמבר_דצמבר".split("_"),monthsShort:"ינו׳_פבר׳_מרץ_×פר׳_מ××™_יוני_יולי_×וג׳_ספט׳_×וק׳_נוב׳_דצמ׳".split("_"),weekdays:"ר×שון_שני_שלישי_רביעי_חמישי_שישי_שבת".split("_"),weekdaysShort:"×׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳".split("_"),weekdaysMin:"×_ב_×’_ד_×”_ו_ש".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [ב]MMMM YYYY",LLL:"D [ב]MMMM YYYY HH:mm",LLLL:"dddd, D [ב]MMMM YYYY HH:mm",l:"D/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},calendar:{sameDay:"[×”×™×•× ×‘Ö¾]LT",nextDay:"[מחר ב־]LT",nextWeek:"dddd [בשעה] LT",lastDay:"[×תמול ב־]LT",lastWeek:"[ביו×] dddd [×”×חרון בשעה] LT",sameElse:"L"},relativeTime:{future:"בעוד %s",past:"לפני %s",s:"מספר שניות",m:"דקה",mm:"%d דקות",h:"שעה",hh:function(e){return 2===e?"שעתיי×":e+" שעות"},d:"יו×",dd:function(e){return 2===e?"יומיי×":e+" ימי×"},M:"חודש",MM:function(e){return 2===e?"חודשיי×":e+" חודשי×"},y:"שנה",yy:function(e){return 2===e?"שנתיי×":e%10===0&&10!==e?e+" שנה":e+" שני×"}},meridiemParse:/××—×”"צ|לפנה"צ|×חרי הצהריי×|לפני הצהריי×|לפנות בוקר|בבוקר|בערב/i,isPM:function(e){return/^(××—×”"צ|×חרי הצהריי×|בערב)$/.test(e)},meridiem:function(e,a,t){return e<5?"לפנות בוקר":e<10?"בבוקר":e<12?t?'לפנה"צ':"לפני הצהריי×":e<18?t?'××—×”"צ':"×חרי הצהריי×":"בערב"}});return e}(),e.fullCalendar.datepickerLocale("he","he",{closeText:"סגור",prevText:"&#x3C;הקוד×",nextText:"הב×&#x3E;",currentText:"היו×",monthNames:["ינו×ר","פברו×ר","מרץ","×פריל","מ××™","יוני","יולי","×וגוסט","ספטמבר","×וקטובר","נובמבר","דצמבר"],monthNamesShort:["ינו","פבר","מרץ","×פר","מ××™","יוני","יולי","×וג","ספט","×וק","נוב","דצמ"],dayNames:["ר×שון","שני","שלישי","רביעי","חמישי","שישי","שבת"],dayNamesShort:["×'","ב'","×’'","ד'","×”'","ו'","שבת"],dayNamesMin:["×'","ב'","×’'","ד'","×”'","ו'","שבת"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("he",{buttonText:{month:"חודש",week:"שבוע",day:"יו×",list:"סדר יו×"},allDayText:"כל היו×",eventLimitText:"×חר",noEventsMessage:"×ין ××™×¨×•×¢×™× ×œ×”×¦×’×”",weekNumberTitle:"שבוע"})}(),function(){!function(){var e={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},t={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"},n=a.defineLocale("hi",{months:"जनवरी_फ़रवरी_मारà¥à¤š_अपà¥à¤°à¥ˆà¤²_मई_जून_जà¥à¤²à¤¾à¤ˆ_अगसà¥à¤¤_सितमà¥à¤¬à¤°_अकà¥à¤Ÿà¥‚बर_नवमà¥à¤¬à¤°_दिसमà¥à¤¬à¤°".split("_"),monthsShort:"जन._फ़र._मारà¥à¤š_अपà¥à¤°à¥ˆ._मई_जून_जà¥à¤²._अग._सित._अकà¥à¤Ÿà¥‚._नव._दिस.".split("_"),monthsParseExact:!0,weekdays:"रविवार_सोमवार_मंगलवार_बà¥à¤§à¤µà¤¾à¤°_गà¥à¤°à¥‚वार_शà¥à¤•à¥à¤°à¤µà¤¾à¤°_शनिवार".split("_"),weekdaysShort:"रवि_सोम_मंगल_बà¥à¤§_गà¥à¤°à¥‚_शà¥à¤•à¥à¤°_शनि".split("_"),weekdaysMin:"र_सो_मं_बà¥_गà¥_शà¥_श".split("_"),longDateFormat:{LT:"A h:mm बजे",LTS:"A h:mm:ss बजे",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm बजे",LLLL:"dddd, D MMMM YYYY, A h:mm बजे"},calendar:{sameDay:"[आज] LT",nextDay:"[कल] LT",nextWeek:"dddd, LT",lastDay:"[कल] LT",lastWeek:"[पिछले] dddd, LT",sameElse:"L"},relativeTime:{future:"%s में",past:"%s पहले",s:"कà¥à¤› ही कà¥à¤·à¤£",m:"à¤à¤• मिनट",mm:"%d मिनट",h:"à¤à¤• घंटा",hh:"%d घंटे",d:"à¤à¤• दिन",dd:"%d दिन",M:"à¤à¤• महीने",MM:"%d महीने",y:"à¤à¤• वरà¥à¤·",yy:"%d वरà¥à¤·"},preparse:function(e){return e.replace(/[१२३४५६७८९०]/g,function(e){return t[e]})},postformat:function(a){return a.replace(/\d/g,function(a){return e[a]})},meridiemParse:/रात|सà¥à¤¬à¤¹|दोपहर|शाम/,meridiemHour:function(e,a){return 12===e&&(e=0),"रात"===a?e<4?e:e+12:"सà¥à¤¬à¤¹"===a?e:"दोपहर"===a?e>=10?e:e+12:"शाम"===a?e+12:void 0},meridiem:function(e,a,t){return e<4?"रात":e<10?"सà¥à¤¬à¤¹":e<17?"दोपहर":e<20?"शाम":"रात"},week:{dow:0,doy:6}});return n}(),e.fullCalendar.datepickerLocale("hi","hi",{closeText:"बंद",prevText:"पिछला",nextText:"अगला",currentText:"आज",monthNames:["जनवरी ","फरवरी","मारà¥à¤š","अपà¥à¤°à¥‡à¤²","मई","जून","जूलाई","अगसà¥à¤¤ ","सितमà¥à¤¬à¤°","अकà¥à¤Ÿà¥‚बर","नवमà¥à¤¬à¤°","दिसमà¥à¤¬à¤°"],monthNamesShort:["जन","फर","मारà¥à¤š","अपà¥à¤°à¥‡à¤²","मई","जून","जूलाई","अग","सित","अकà¥à¤Ÿ","नव","दि"],dayNames:["रविवार","सोमवार","मंगलवार","बà¥à¤§à¤µà¤¾à¤°","गà¥à¤°à¥à¤µà¤¾à¤°","शà¥à¤•à¥à¤°à¤µà¤¾à¤°","शनिवार"],dayNamesShort:["रवि","सोम","मंगल","बà¥à¤§","गà¥à¤°à¥","शà¥à¤•à¥à¤°","शनि"],dayNamesMin:["रवि","सोम","मंगल","बà¥à¤§","गà¥à¤°à¥","शà¥à¤•à¥à¤°","शनि"],weekHeader:"हफà¥à¤¤à¤¾",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("hi",{buttonText:{month:"महीना",week:"सपà¥à¤¤à¤¾à¤¹",day:"दिन",list:"कारà¥à¤¯à¤¸à¥‚ची"},allDayText:"सभी दिन",eventLimitText:function(e){return"+अधिक "+e},noEventsMessage:"कोई घटनाओं को पà¥à¤°à¤¦à¤°à¥à¤¶à¤¿à¤¤ करने के लिà¤"})}(),function(){!function(){function e(e,a,t){var n=e+" ";switch(t){case"m":return a?"jedna minuta":"jedne minute";case"mm":return n+=1===e?"minuta":2===e||3===e||4===e?"minute":"minuta";case"h":return a?"jedan sat":"jednog sata";case"hh":return n+=1===e?"sat":2===e||3===e||4===e?"sata":"sati";case"dd":return n+=1===e?"dan":"dana";case"MM":return n+=1===e?"mjesec":2===e||3===e||4===e?"mjeseca":"mjeseci";case"yy":return n+=1===e?"godina":2===e||3===e||4===e?"godine":"godina"}}var t=a.defineLocale("hr",{months:{format:"sijeÄnja_veljaÄe_ožujka_travnja_svibnja_lipnja_srpnja_kolovoza_rujna_listopada_studenoga_prosinca".split("_"),standalone:"sijeÄanj_veljaÄa_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac".split("_")},monthsShort:"sij._velj._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_Äetvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._Äet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_Äe_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[juÄer u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[proÅ¡lu] dddd [u] LT";case 6:return"[proÅ¡le] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[proÅ¡li] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",m:e,mm:e,h:e,hh:e,d:"dan",dd:e,M:"mjesec",MM:e,y:"godinu",yy:e},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}});return t}(),e.fullCalendar.datepickerLocale("hr","hr",{closeText:"Zatvori",prevText:"&#x3C;",nextText:"&#x3E;",currentText:"Danas",monthNames:["SijeÄanj","VeljaÄa","Ožujak","Travanj","Svibanj","Lipanj","Srpanj","Kolovoz","Rujan","Listopad","Studeni","Prosinac"],
-monthNamesShort:["Sij","Velj","Ožu","Tra","Svi","Lip","Srp","Kol","Ruj","Lis","Stu","Pro"],dayNames:["Nedjelja","Ponedjeljak","Utorak","Srijeda","ÄŒetvrtak","Petak","Subota"],dayNamesShort:["Ned","Pon","Uto","Sri","ÄŒet","Pet","Sub"],dayNamesMin:["Ne","Po","Ut","Sr","ÄŒe","Pe","Su"],weekHeader:"Tje",dateFormat:"dd.mm.yy.",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("hr",{buttonText:{month:"Mjesec",week:"Tjedan",day:"Dan",list:"Raspored"},allDayText:"Cijeli dan",eventLimitText:function(e){return"+ joÅ¡ "+e},noEventsMessage:"Nema dogaÄ‘aja za prikaz"})}(),function(){!function(){function e(e,a,t,n){var r=e;switch(t){case"s":return n||a?"néhány másodperc":"néhány másodperce";case"m":return"egy"+(n||a?" perc":" perce");case"mm":return r+(n||a?" perc":" perce");case"h":return"egy"+(n||a?" óra":" órája");case"hh":return r+(n||a?" óra":" órája");case"d":return"egy"+(n||a?" nap":" napja");case"dd":return r+(n||a?" nap":" napja");case"M":return"egy"+(n||a?" hónap":" hónapja");case"MM":return r+(n||a?" hónap":" hónapja");case"y":return"egy"+(n||a?" év":" éve");case"yy":return r+(n||a?" év":" éve")}return""}function t(e){return(e?"":"[múlt] ")+"["+n[this.day()]+"] LT[-kor]"}var n="vasárnap hétfÅ‘n kedden szerdán csütörtökön pénteken szombaton".split(" "),r=a.defineLocale("hu",{months:"január_február_március_április_május_június_július_augusztus_szeptember_október_november_december".split("_"),monthsShort:"jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec".split("_"),weekdays:"vasárnap_hétfÅ‘_kedd_szerda_csütörtök_péntek_szombat".split("_"),weekdaysShort:"vas_hét_kedd_sze_csüt_pén_szo".split("_"),weekdaysMin:"v_h_k_sze_cs_p_szo".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"YYYY.MM.DD.",LL:"YYYY. MMMM D.",LLL:"YYYY. MMMM D. H:mm",LLLL:"YYYY. MMMM D., dddd H:mm"},meridiemParse:/de|du/i,isPM:function(e){return"u"===e.charAt(1).toLowerCase()},meridiem:function(e,a,t){return e<12?t===!0?"de":"DE":t===!0?"du":"DU"},calendar:{sameDay:"[ma] LT[-kor]",nextDay:"[holnap] LT[-kor]",nextWeek:function(){return t.call(this,!0)},lastDay:"[tegnap] LT[-kor]",lastWeek:function(){return t.call(this,!1)},sameElse:"L"},relativeTime:{future:"%s múlva",past:"%s",s:e,m:e,mm:e,h:e,hh:e,d:e,dd:e,M:e,MM:e,y:e,yy:e},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return r}(),e.fullCalendar.datepickerLocale("hu","hu",{closeText:"bezár",prevText:"vissza",nextText:"elÅ‘re",currentText:"ma",monthNames:["Január","Február","Március","Ãprilis","Május","Június","Július","Augusztus","Szeptember","Október","November","December"],monthNamesShort:["Jan","Feb","Már","Ãpr","Máj","Jún","Júl","Aug","Szep","Okt","Nov","Dec"],dayNames:["Vasárnap","HétfÅ‘","Kedd","Szerda","Csütörtök","Péntek","Szombat"],dayNamesShort:["Vas","Hét","Ked","Sze","Csü","Pén","Szo"],dayNamesMin:["V","H","K","Sze","Cs","P","Szo"],weekHeader:"Hét",dateFormat:"yy.mm.dd.",firstDay:1,isRTL:!1,showMonthAfterYear:!0,yearSuffix:""}),e.fullCalendar.locale("hu",{buttonText:{month:"Hónap",week:"Hét",day:"Nap",list:"Napló"},allDayText:"Egész nap",eventLimitText:"további",noEventsMessage:"Nincs megjeleníthetÅ‘ események"})}(),function(){!function(){var e=a.defineLocale("id",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nov_Des".split("_"),weekdays:"Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu".split("_"),weekdaysShort:"Min_Sen_Sel_Rab_Kam_Jum_Sab".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|siang|sore|malam/,meridiemHour:function(e,a){return 12===e&&(e=0),"pagi"===a?e:"siang"===a?e>=11?e:e+12:"sore"===a||"malam"===a?e+12:void 0},meridiem:function(e,a,t){return e<11?"pagi":e<15?"siang":e<19?"sore":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Besok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kemarin pukul] LT",lastWeek:"dddd [lalu pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lalu",s:"beberapa detik",m:"semenit",mm:"%d menit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}});return e}(),e.fullCalendar.datepickerLocale("id","id",{closeText:"Tutup",prevText:"&#x3C;mundur",nextText:"maju&#x3E;",currentText:"hari ini",monthNames:["Januari","Februari","Maret","April","Mei","Juni","Juli","Agustus","September","Oktober","Nopember","Desember"],monthNamesShort:["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Agus","Sep","Okt","Nop","Des"],dayNames:["Minggu","Senin","Selasa","Rabu","Kamis","Jumat","Sabtu"],dayNamesShort:["Min","Sen","Sel","Rab","kam","Jum","Sab"],dayNamesMin:["Mg","Sn","Sl","Rb","Km","jm","Sb"],weekHeader:"Mg",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("id",{buttonText:{month:"Bulan",week:"Minggu",day:"Hari",list:"Agenda"},allDayHtml:"Sehari<br/>penuh",eventLimitText:"lebih",noEventsMessage:"Tidak ada acara untuk ditampilkan"})}(),function(){!function(){function e(e){return e%100===11||e%10!==1}function t(a,t,n,r){var s=a+" ";switch(n){case"s":return t||r?"nokkrar sekúndur":"nokkrum sekúndum";case"m":return t?"mínúta":"mínútu";case"mm":return e(a)?s+(t||r?"mínútur":"mínútum"):t?s+"mínúta":s+"mínútu";case"hh":return e(a)?s+(t||r?"klukkustundir":"klukkustundum"):s+"klukkustund";case"d":return t?"dagur":r?"dag":"degi";case"dd":return e(a)?t?s+"dagar":s+(r?"daga":"dögum"):t?s+"dagur":s+(r?"dag":"degi");case"M":return t?"mánuður":r?"mánuð":"mánuði";case"MM":return e(a)?t?s+"mánuðir":s+(r?"mánuði":"mánuðum"):t?s+"mánuður":s+(r?"mánuð":"mánuði");case"y":return t||r?"ár":"ári";case"yy":return e(a)?s+(t||r?"ár":"árum"):s+(t||r?"ár":"ári")}}var n=a.defineLocale("is",{months:"janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember".split("_"),monthsShort:"jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des".split("_"),weekdays:"sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur".split("_"),weekdaysShort:"sun_mán_þri_mið_fim_fös_lau".split("_"),weekdaysMin:"Su_Má_Þr_Mi_Fi_Fö_La".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] H:mm",LLLL:"dddd, D. MMMM YYYY [kl.] H:mm"},calendar:{sameDay:"[í dag kl.] LT",nextDay:"[á morgun kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[í gær kl.] LT",lastWeek:"[síðasta] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"eftir %s",past:"fyrir %s síðan",s:t,m:t,mm:t,h:"klukkustund",hh:t,d:t,dd:t,M:t,MM:t,y:t,yy:t},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return n}(),e.fullCalendar.datepickerLocale("is","is",{closeText:"Loka",prevText:"&#x3C; Fyrri",nextText:"Næsti &#x3E;",currentText:"à dag",monthNames:["Janúar","Febrúar","Mars","Apríl","Maí","Júní","Júlí","Ãgúst","September","Október","Nóvember","Desember"],monthNamesShort:["Jan","Feb","Mar","Apr","Maí","Jún","Júl","Ãgú","Sep","Okt","Nóv","Des"],dayNames:["Sunnudagur","Mánudagur","Þriðjudagur","Miðvikudagur","Fimmtudagur","Föstudagur","Laugardagur"],dayNamesShort:["Sun","Mán","Þri","Mið","Fim","Fös","Lau"],dayNamesMin:["Su","Má","Þr","Mi","Fi","Fö","La"],weekHeader:"Vika",dateFormat:"dd.mm.yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("is",{buttonText:{month:"Mánuður",week:"Vika",day:"Dagur",list:"Dagskrá"},allDayHtml:"Allan<br/>daginn",eventLimitText:"meira",noEventsMessage:"Engir viðburðir til að sýna"})}(),function(){!function(){var e=a.defineLocale("it",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"Domenica_Lunedì_Martedì_Mercoledì_Giovedì_Venerdì_Sabato".split("_"),weekdaysShort:"Dom_Lun_Mar_Mer_Gio_Ven_Sab".split("_"),weekdaysMin:"Do_Lu_Ma_Me_Gi_Ve_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Oggi alle] LT",nextDay:"[Domani alle] LT",nextWeek:"dddd [alle] LT",lastDay:"[Ieri alle] LT",lastWeek:function(){switch(this.day()){case 0:return"[la scorsa] dddd [alle] LT";default:return"[lo scorso] dddd [alle] LT"}},sameElse:"L"},relativeTime:{future:function(e){return(/^[0-9].+$/.test(e)?"tra":"in")+" "+e},past:"%s fa",s:"alcuni secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}});return e}(),e.fullCalendar.datepickerLocale("it","it",{closeText:"Chiudi",prevText:"&#x3C;Prec",nextText:"Succ&#x3E;",currentText:"Oggi",monthNames:["Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre"],monthNamesShort:["Gen","Feb","Mar","Apr","Mag","Giu","Lug","Ago","Set","Ott","Nov","Dic"],dayNames:["Domenica","Lunedì","Martedì","Mercoledì","Giovedì","Venerdì","Sabato"],dayNamesShort:["Dom","Lun","Mar","Mer","Gio","Ven","Sab"],dayNamesMin:["Do","Lu","Ma","Me","Gi","Ve","Sa"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("it",{buttonText:{month:"Mese",week:"Settimana",day:"Giorno",list:"Agenda"},allDayHtml:"Tutto il<br/>giorno",eventLimitText:function(e){return"+altri "+e},noEventsMessage:"Non ci sono eventi da visualizzare"})}(),function(){!function(){var e=a.defineLocale("ja",{months:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"日曜日_月曜日_ç«æ›œæ—¥_水曜日_木曜日_金曜日_土曜日".split("_"),weekdaysShort:"æ—¥_月_ç«_æ°´_木_金_土".split("_"),weekdaysMin:"æ—¥_月_ç«_æ°´_木_金_土".split("_"),longDateFormat:{LT:"Ah時m分",LTS:"Ah時m分s秒",L:"YYYY/MM/DD",LL:"YYYYå¹´M月Dæ—¥",LLL:"YYYYå¹´M月Dæ—¥Ah時m分",LLLL:"YYYYå¹´M月Dæ—¥Ah時m分 dddd"},meridiemParse:/åˆå‰|åˆå¾Œ/i,isPM:function(e){return"åˆå¾Œ"===e},meridiem:function(e,a,t){return e<12?"åˆå‰":"åˆå¾Œ"},calendar:{sameDay:"[今日] LT",nextDay:"[明日] LT",nextWeek:"[æ¥é€±]dddd LT",lastDay:"[昨日] LT",lastWeek:"[å‰é€±]dddd LT",sameElse:"L"},ordinalParse:/\d{1,2}æ—¥/,ordinal:function(e,a){switch(a){case"d":case"D":case"DDD":return e+"æ—¥";default:return e}},relativeTime:{future:"%s後",past:"%så‰",s:"数秒",m:"1分",mm:"%d分",h:"1時間",hh:"%d時間",d:"1æ—¥",dd:"%dæ—¥",M:"1ヶ月",MM:"%dヶ月",y:"1å¹´",yy:"%då¹´"}});return e}(),e.fullCalendar.datepickerLocale("ja","ja",{closeText:"é–‰ã˜ã‚‹",prevText:"&#x3C;å‰",nextText:"次&#x3E;",currentText:"今日",monthNames:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],monthNamesShort:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],dayNames:["日曜日","月曜日","ç«æ›œæ—¥","水曜日","木曜日","金曜日","土曜日"],dayNamesShort:["æ—¥","月","ç«","æ°´","木","金","土"],dayNamesMin:["æ—¥","月","ç«","æ°´","木","金","土"],weekHeader:"週",dateFormat:"yy/mm/dd",firstDay:0,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"å¹´"}),e.fullCalendar.locale("ja",{buttonText:{month:"月",week:"週",day:"æ—¥",list:"予定リスト"},allDayText:"終日",eventLimitText:function(e){return"ä»– "+e+" 件"},noEventsMessage:"イベントãŒè¡¨ç¤ºã•ã‚Œãªã„よã†ã«"})}(),function(){!function(){var e={0:"-ші",1:"-ші",2:"-ші",3:"-ші",4:"-ші",5:"-ші",6:"-шы",7:"-ші",8:"-ші",9:"-шы",10:"-шы",20:"-шы",30:"-шы",40:"-шы",50:"-ші",60:"-шы",70:"-ші",80:"-ші",90:"-шы",100:"-ші"},t=a.defineLocale("kk",{months:"қаңтар_ақпан_наурыз_Ñәуір_мамыр_мауÑым_шілде_тамыз_қыркүйек_қазан_қараша_желтоқÑан".split("_"),monthsShort:"қаң_ақп_нау_Ñәу_мам_мау_шіл_там_қыр_қаз_қар_жел".split("_"),weekdays:"жекÑенбі_дүйÑенбі_ÑейÑенбі_ÑәрÑенбі_бейÑенбі_жұма_Ñенбі".split("_"),weekdaysShort:"жек_дүй_Ñей_Ñәр_бей_жұм_Ñен".split("_"),weekdaysMin:"жк_дй_Ñй_ÑÑ€_бй_жм_Ñн".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Бүгін Ñағат] LT",nextDay:"[Ертең Ñағат] LT",nextWeek:"dddd [Ñағат] LT",lastDay:"[Кеше Ñағат] LT",lastWeek:"[Өткен аптаның] dddd [Ñағат] LT",sameElse:"L"},relativeTime:{future:"%s ішінде",past:"%s бұрын",s:"бірнеше Ñекунд",m:"бір минут",mm:"%d минут",h:"бір Ñағат",hh:"%d Ñағат",d:"бір күн",dd:"%d күн",M:"бір ай",MM:"%d ай",y:"бір жыл",yy:"%d жыл"},ordinalParse:/\d{1,2}-(ші|шы)/,ordinal:function(a){var t=a%10,n=a>=100?100:null;return a+(e[a]||e[t]||e[n])},week:{dow:1,doy:7}});return t}(),e.fullCalendar.datepickerLocale("kk","kk",{closeText:"Жабу",prevText:"&#x3C;Ðлдыңғы",nextText:"КелеÑÑ–&#x3E;",currentText:"Бүгін",monthNames:["Қаңтар","Ðқпан","Ðаурыз","Сәуір","Мамыр","МауÑым","Шілде","Тамыз","Қыркүйек","Қазан","Қараша","ЖелтоқÑан"],monthNamesShort:["Қаң","Ðқп","Ðау","Сәу","Мам","Мау","Шіл","Там","Қыр","Қаз","Қар","Жел"],dayNames:["ЖекÑенбі","ДүйÑенбі","СейÑенбі","СәрÑенбі","БейÑенбі","Жұма","Сенбі"],dayNamesShort:["жкÑ","дÑн","ÑÑн","ÑÑ€Ñ","бÑн","жма","Ñнб"],dayNamesMin:["Жк","ДÑ","СÑ","Ср","БÑ","Жм","Сн"],weekHeader:"Ðе",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("kk",{buttonText:{month:"Ðй",week:"Ðпта",day:"Күн",list:"Күн тәртібі"},allDayText:"Күні бойы",eventLimitText:function(e){return"+ тағы "+e},noEventsMessage:"КөрÑету үшін оқиғалар жоқ"})}(),function(){!function(){var e=a.defineLocale("ko",{months:"1ì›”_2ì›”_3ì›”_4ì›”_5ì›”_6ì›”_7ì›”_8ì›”_9ì›”_10ì›”_11ì›”_12ì›”".split("_"),monthsShort:"1ì›”_2ì›”_3ì›”_4ì›”_5ì›”_6ì›”_7ì›”_8ì›”_9ì›”_10ì›”_11ì›”_12ì›”".split("_"),weekdays:"ì¼ìš”ì¼_월요ì¼_화요ì¼_수요ì¼_목요ì¼_금요ì¼_토요ì¼".split("_"),weekdaysShort:"ì¼_ì›”_í™”_수_목_금_토".split("_"),weekdaysMin:"ì¼_ì›”_í™”_수_목_금_토".split("_"),longDateFormat:{LT:"A hì‹œ m분",LTS:"A hì‹œ m분 sì´ˆ",L:"YYYY.MM.DD",LL:"YYYYë…„ MMMM Dì¼",LLL:"YYYYë…„ MMMM Dì¼ A hì‹œ m분",LLLL:"YYYYë…„ MMMM Dì¼ dddd A hì‹œ m분"},calendar:{sameDay:"오늘 LT",nextDay:"ë‚´ì¼ LT",nextWeek:"dddd LT",lastDay:"ì–´ì œ LT",lastWeek:"지난주 dddd LT",sameElse:"L"},relativeTime:{future:"%s 후",past:"%s ì „",s:"몇 ì´ˆ",ss:"%dì´ˆ",m:"ì¼ë¶„",mm:"%d분",h:"í•œ 시간",hh:"%d시간",d:"하루",dd:"%dì¼",M:"í•œ 달",MM:"%d달",y:"ì¼ ë…„",yy:"%dë…„"},ordinalParse:/\d{1,2}ì¼/,ordinal:"%dì¼",meridiemParse:/오전|오후/,isPM:function(e){return"오후"===e},meridiem:function(e,a,t){return e<12?"오전":"오후"}});return e}(),e.fullCalendar.datepickerLocale("ko","ko",{closeText:"닫기",prevText:"ì´ì „달",nextText:"다ìŒë‹¬",currentText:"오늘",monthNames:["1ì›”","2ì›”","3ì›”","4ì›”","5ì›”","6ì›”","7ì›”","8ì›”","9ì›”","10ì›”","11ì›”","12ì›”"],monthNamesShort:["1ì›”","2ì›”","3ì›”","4ì›”","5ì›”","6ì›”","7ì›”","8ì›”","9ì›”","10ì›”","11ì›”","12ì›”"],dayNames:["ì¼ìš”ì¼","월요ì¼","화요ì¼","수요ì¼","목요ì¼","금요ì¼","토요ì¼"],dayNamesShort:["ì¼","ì›”","í™”","수","목","금","토"],dayNamesMin:["ì¼","ì›”","í™”","수","목","금","토"],weekHeader:"주",dateFormat:"yy. m. d.",firstDay:0,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"ë…„"}),e.fullCalendar.locale("ko",{buttonText:{month:"ì›”",week:"주",day:"ì¼",list:"ì¼ì •ëª©ë¡"},allDayText:"종ì¼",eventLimitText:"ê°œ",noEventsMessage:"ì¼ì •ì´ 표시 없습니다"})}(),function(){!function(){function e(e,a,t,n){var r={m:["eng Minutt","enger Minutt"],h:["eng Stonn","enger Stonn"],d:["een Dag","engem Dag"],M:["ee Mount","engem Mount"],y:["ee Joer","engem Joer"]};return a?r[t][0]:r[t][1]}function t(e){var a=e.substr(0,e.indexOf(" "));return r(a)?"a "+e:"an "+e}function n(e){var a=e.substr(0,e.indexOf(" "));return r(a)?"viru "+e:"virun "+e}function r(e){if(e=parseInt(e,10),isNaN(e))return!1;if(e<0)return!0;if(e<10)return 4<=e&&e<=7;if(e<100){var a=e%10,t=e/10;return r(0===a?t:a)}if(e<1e4){for(;e>=10;)e/=10;return r(e)}return e/=1e3,r(e)}var s=a.defineLocale("lb",{months:"Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg".split("_"),weekdaysShort:"So._Mé._Dë._Më._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mé_Dë_Më_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm [Auer]",LTS:"H:mm:ss [Auer]",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm [Auer]",LLLL:"dddd, D. MMMM YYYY H:mm [Auer]"},calendar:{sameDay:"[Haut um] LT",sameElse:"L",nextDay:"[Muer um] LT",nextWeek:"dddd [um] LT",lastDay:"[Gëschter um] LT",lastWeek:function(){switch(this.day()){case 2:case 4:return"[Leschten] dddd [um] LT";default:return"[Leschte] dddd [um] LT"}}},relativeTime:{future:t,past:n,s:"e puer Sekonnen",m:e,mm:"%d Minutten",h:e,hh:"%d Stonnen",d:e,dd:"%d Deeg",M:e,MM:"%d Méint",y:e,yy:"%d Joer"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return s}(),e.fullCalendar.datepickerLocale("lb","lb",{closeText:"Fäerdeg",prevText:"Zréck",nextText:"Weider",currentText:"Haut",monthNames:["Januar","Februar","Mäerz","Abrëll","Mee","Juni","Juli","August","September","Oktober","November","Dezember"],monthNamesShort:["Jan","Feb","Mäe","Abr","Mee","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],dayNames:["Sonndeg","Méindeg","Dënschdeg","Mëttwoch","Donneschdeg","Freideg","Samschdeg"],dayNamesShort:["Son","Méi","Dën","Mët","Don","Fre","Sam"],dayNamesMin:["So","Mé","Dë","Më","Do","Fr","Sa"],weekHeader:"W",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("lb",{buttonText:{month:"Mount",week:"Woch",day:"Dag",list:"Terminiwwersiicht"},allDayText:"Ganzen Dag",eventLimitText:"méi",noEventsMessage:"Nee Evenementer ze affichéieren"})}(),function(){!function(){function e(e,a,t,n){return a?"kelios sekundÄ—s":n?"kelių sekundžių":"kelias sekundes"}function t(e,a,t,n){return a?r(t)[0]:n?r(t)[1]:r(t)[2]}function n(e){return e%10===0||e>10&&e<20}function r(e){return d[e].split("_")}function s(e,a,s,d){var i=e+" ";return 1===e?i+t(e,a,s[0],d):a?i+(n(e)?r(s)[1]:r(s)[0]):d?i+r(s)[1]:i+(n(e)?r(s)[1]:r(s)[2])}var d={m:"minutÄ—_minutÄ—s_minutÄ™",mm:"minutÄ—s_minuÄių_minutes",h:"valanda_valandos_valandÄ…",hh:"valandos_valandų_valandas",d:"diena_dienos_dienÄ…",dd:"dienos_dienų_dienas",M:"mÄ—nuo_mÄ—nesio_mÄ—nesį",MM:"mÄ—nesiai_mÄ—nesių_mÄ—nesius",y:"metai_metų_metus",yy:"metai_metų_metus"},i=a.defineLocale("lt",{months:{format:"sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjÅ«Äio_rugsÄ—jo_spalio_lapkriÄio_gruodžio".split("_"),standalone:"sausis_vasaris_kovas_balandis_gegužė_birželis_liepa_rugpjÅ«tis_rugsÄ—jis_spalis_lapkritis_gruodis".split("_"),isFormat:/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|MMMM?(\[[^\[\]]*\]|\s)+D[oD]?/},monthsShort:"sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd".split("_"),weekdays:{format:"sekmadienį_pirmadienį_antradienį_treÄiadienį_ketvirtadienį_penktadienį_Å¡eÅ¡tadienį".split("_"),standalone:"sekmadienis_pirmadienis_antradienis_treÄiadienis_ketvirtadienis_penktadienis_Å¡eÅ¡tadienis".split("_"),isFormat:/dddd HH:mm/},weekdaysShort:"Sek_Pir_Ant_Tre_Ket_Pen_Å eÅ¡".split("_"),weekdaysMin:"S_P_A_T_K_Pn_Å ".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY [m.] MMMM D [d.]",LLL:"YYYY [m.] MMMM D [d.], HH:mm [val.]",LLLL:"YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]",l:"YYYY-MM-DD",ll:"YYYY [m.] MMMM D [d.]",lll:"YYYY [m.] MMMM D [d.], HH:mm [val.]",llll:"YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]"},calendar:{sameDay:"[Å iandien] LT",nextDay:"[Rytoj] LT",nextWeek:"dddd LT",lastDay:"[Vakar] LT",lastWeek:"[PraÄ—jusį] dddd LT",sameElse:"L"},relativeTime:{future:"po %s",past:"prieÅ¡ %s",s:e,m:t,mm:s,h:t,hh:s,d:t,dd:s,M:t,MM:s,y:t,yy:s},ordinalParse:/\d{1,2}-oji/,ordinal:function(e){return e+"-oji"},week:{dow:1,doy:4}});return i}(),e.fullCalendar.datepickerLocale("lt","lt",{closeText:"Uždaryti",prevText:"&#x3C;Atgal",nextText:"Pirmyn&#x3E;",currentText:"Å iandien",monthNames:["Sausis","Vasaris","Kovas","Balandis","Gegužė","Birželis","Liepa","RugpjÅ«tis","RugsÄ—jis","Spalis","Lapkritis","Gruodis"],monthNamesShort:["Sau","Vas","Kov","Bal","Geg","Bir","Lie","Rugp","Rugs","Spa","Lap","Gru"],dayNames:["sekmadienis","pirmadienis","antradienis","treÄiadienis","ketvirtadienis","penktadienis","Å¡eÅ¡tadienis"],dayNamesShort:["sek","pir","ant","tre","ket","pen","Å¡eÅ¡"],dayNamesMin:["Se","Pr","An","Tr","Ke","Pe","Å e"],weekHeader:"SAV",dateFormat:"yy-mm-dd",firstDay:1,isRTL:!1,showMonthAfterYear:!0,yearSuffix:""}),e.fullCalendar.locale("lt",{buttonText:{month:"MÄ—nuo",week:"SavaitÄ—",day:"Diena",list:"DarbotvarkÄ—"},allDayText:"VisÄ… dienÄ…",eventLimitText:"daugiau",noEventsMessage:"NÄ—ra įvykių rodyti"})}(),function(){!function(){function e(e,a,t){return t?a%10===1&&a%100!==11?e[2]:e[3]:a%10===1&&a%100!==11?e[0]:e[1]}function t(a,t,n){return a+" "+e(s[n],a,t)}function n(a,t,n){return e(s[n],a,t)}function r(e,a){return a?"dažas sekundes":"dažÄm sekundÄ“m"}var s={m:"minÅ«tes_minÅ«tÄ“m_minÅ«te_minÅ«tes".split("_"),mm:"minÅ«tes_minÅ«tÄ“m_minÅ«te_minÅ«tes".split("_"),h:"stundas_stundÄm_stunda_stundas".split("_"),hh:"stundas_stundÄm_stunda_stundas".split("_"),d:"dienas_dienÄm_diena_dienas".split("_"),dd:"dienas_dienÄm_diena_dienas".split("_"),M:"mÄ“neÅ¡a_mÄ“neÅ¡iem_mÄ“nesis_mÄ“neÅ¡i".split("_"),MM:"mÄ“neÅ¡a_mÄ“neÅ¡iem_mÄ“nesis_mÄ“neÅ¡i".split("_"),y:"gada_gadiem_gads_gadi".split("_"),yy:"gada_gadiem_gads_gadi".split("_")},d=a.defineLocale("lv",{months:"janvÄris_februÄris_marts_aprÄ«lis_maijs_jÅ«nijs_jÅ«lijs_augusts_septembris_oktobris_novembris_decembris".split("_"),monthsShort:"jan_feb_mar_apr_mai_jÅ«n_jÅ«l_aug_sep_okt_nov_dec".split("_"),weekdays:"svÄ“tdiena_pirmdiena_otrdiena_treÅ¡diena_ceturtdiena_piektdiena_sestdiena".split("_"),weekdaysShort:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysMin:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY.",LL:"YYYY. [gada] D. MMMM",LLL:"YYYY. [gada] D. MMMM, HH:mm",LLLL:"YYYY. [gada] D. MMMM, dddd, HH:mm"},calendar:{sameDay:"[Å odien pulksten] LT",nextDay:"[RÄ«t pulksten] LT",nextWeek:"dddd [pulksten] LT",lastDay:"[Vakar pulksten] LT",lastWeek:"[PagÄjuÅ¡Ä] dddd [pulksten] LT",sameElse:"L"},relativeTime:{future:"pÄ“c %s",past:"pirms %s",s:r,m:n,mm:t,h:n,hh:t,d:n,dd:t,M:n,MM:t,y:n,yy:t},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return d}(),e.fullCalendar.datepickerLocale("lv","lv",{closeText:"AizvÄ“rt",prevText:"Iepr.",nextText:"NÄk.",currentText:"Å odien",monthNames:["JanvÄris","FebruÄris","Marts","AprÄ«lis","Maijs","JÅ«nijs","JÅ«lijs","Augusts","Septembris","Oktobris","Novembris","Decembris"],monthNamesShort:["Jan","Feb","Mar","Apr","Mai","JÅ«n","JÅ«l","Aug","Sep","Okt","Nov","Dec"],dayNames:["svÄ“tdiena","pirmdiena","otrdiena","treÅ¡diena","ceturtdiena","piektdiena","sestdiena"],dayNamesShort:["svt","prm","otr","tre","ctr","pkt","sst"],dayNamesMin:["Sv","Pr","Ot","Tr","Ct","Pk","Ss"],weekHeader:"Ned.",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("lv",{buttonText:{month:"MÄ“nesis",week:"Nedēļa",day:"Diena",list:"Dienas kÄrtÄ«ba"},allDayText:"Visu dienu",eventLimitText:function(e){return"+vÄ“l "+e},noEventsMessage:"Nav notikumu, lai parÄdÄ«tu"})}(),function(){!function(){var e=a.defineLocale("mk",{months:"јануари_февруари_март_април_мај_јуни_јули_авгуÑÑ‚_Ñептември_октомври_ноември_декември".split("_"),monthsShort:"јан_фев_мар_апр_мај_јун_јул_авг_Ñеп_окт_ное_дек".split("_"),weekdays:"недела_понеделник_вторник_Ñреда_четврток_петок_Ñабота".split("_"),weekdaysShort:"нед_пон_вто_Ñре_чет_пет_Ñаб".split("_"),weekdaysMin:"нe_пo_вт_ÑÑ€_че_пе_Ña".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[Ð”ÐµÐ½ÐµÑ Ð²Ð¾] LT",nextDay:"[Утре во] LT",nextWeek:"[Во] dddd [во] LT",lastDay:"[Вчера во] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[Изминатата] dddd [во] LT";case 1:case 2:case 4:case 5:return"[Изминатиот] dddd [во] LT"}},sameElse:"L"},relativeTime:{future:"поÑле %s",past:"пред %s",s:"неколку Ñекунди",m:"минута",mm:"%d минути",h:"чаÑ",hh:"%d чаÑа",d:"ден",dd:"%d дена",M:"меÑец",MM:"%d меÑеци",y:"година",yy:"%d години"},ordinalParse:/\d{1,2}-(ев|ен|ти|ви|ри|ми)/,ordinal:function(e){var a=e%10,t=e%100;return 0===e?e+"-ев":0===t?e+"-ен":t>10&&t<20?e+"-ти":1===a?e+"-ви":2===a?e+"-ри":7===a||8===a?e+"-ми":e+"-ти"},week:{dow:1,doy:7}});return e}(),e.fullCalendar.datepickerLocale("mk","mk",{closeText:"Затвори",prevText:"&#x3C;",nextText:"&#x3E;",currentText:"ДенеÑ",monthNames:["Јануари","Февруари","Март","Ðприл","Мај","Јуни","Јули","ÐвгуÑÑ‚","Септември","Октомври","Ðоември","Декември"],monthNamesShort:["Јан","Фев","Мар","Ðпр","Мај","Јун","Јул","Ðвг","Сеп","Окт","Ðое","Дек"],dayNames:["Ðедела","Понеделник","Вторник","Среда","Четврток","Петок","Сабота"],dayNamesShort:["Ðед","Пон","Вто","Сре","Чет","Пет","Саб"],dayNamesMin:["Ðе","По","Ð’Ñ‚","Ср","Че","Пе","Са"],weekHeader:"Сед",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("mk",{buttonText:{month:"МеÑец",week:"Ðедела",day:"Ден",list:"График"},allDayText:"Цел ден",eventLimitText:function(e){return"+повеќе "+e},noEventsMessage:"Ðема наÑтани за прикажување"})}(),function(){!function(){var e=a.defineLocale("ms",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(e,a){return 12===e&&(e=0),"pagi"===a?e:"tengahari"===a?e>=11?e:e+12:"petang"===a||"malam"===a?e+12:void 0},meridiem:function(e,a,t){return e<11?"pagi":e<15?"tengahari":e<19?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}});return e}(),e.fullCalendar.datepickerLocale("ms","ms",{closeText:"Tutup",prevText:"&#x3C;Sebelum",nextText:"Selepas&#x3E;",currentText:"hari ini",monthNames:["Januari","Februari","Mac","April","Mei","Jun","Julai","Ogos","September","Oktober","November","Disember"],monthNamesShort:["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ogo","Sep","Okt","Nov","Dis"],dayNames:["Ahad","Isnin","Selasa","Rabu","Khamis","Jumaat","Sabtu"],dayNamesShort:["Aha","Isn","Sel","Rab","kha","Jum","Sab"],dayNamesMin:["Ah","Is","Se","Ra","Kh","Ju","Sa"],weekHeader:"Mg",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("ms",{buttonText:{month:"Bulan",week:"Minggu",day:"Hari",list:"Agenda"},allDayText:"Sepanjang hari",eventLimitText:function(e){return"masih ada "+e+" acara"},noEventsMessage:"Tiada peristiwa untuk dipaparkan"})}(),function(){!function(){var e=a.defineLocale("ms-my",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(e,a){return 12===e&&(e=0),"pagi"===a?e:"tengahari"===a?e>=11?e:e+12:"petang"===a||"malam"===a?e+12:void 0},meridiem:function(e,a,t){return e<11?"pagi":e<15?"tengahari":e<19?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}});return e}(),e.fullCalendar.datepickerLocale("ms-my","ms",{closeText:"Tutup",prevText:"&#x3C;Sebelum",nextText:"Selepas&#x3E;",currentText:"hari ini",monthNames:["Januari","Februari","Mac","April","Mei","Jun","Julai","Ogos","September","Oktober","November","Disember"],monthNamesShort:["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ogo","Sep","Okt","Nov","Dis"],dayNames:["Ahad","Isnin","Selasa","Rabu","Khamis","Jumaat","Sabtu"],dayNamesShort:["Aha","Isn","Sel","Rab","kha","Jum","Sab"],dayNamesMin:["Ah","Is","Se","Ra","Kh","Ju","Sa"],weekHeader:"Mg",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("ms-my",{buttonText:{month:"Bulan",week:"Minggu",day:"Hari",list:"Agenda"},allDayText:"Sepanjang hari",eventLimitText:function(e){return"masih ada "+e+" acara"},noEventsMessage:"Tiada peristiwa untuk dipaparkan"})}(),function(){!function(){var e=a.defineLocale("nb",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan._feb._mars_april_mai_juni_juli_aug._sep._okt._nov._des.".split("_"),monthsParseExact:!0,weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"sø._ma._ti._on._to._fr._lø.".split("_"),weekdaysMin:"sø_ma_ti_on_to_fr_lø".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] HH:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[i gÃ¥r kl.] LT",lastWeek:"[forrige] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"noen sekunder",m:"ett minutt",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dager",M:"en mÃ¥ned",MM:"%d mÃ¥neder",y:"ett Ã¥r",yy:"%d Ã¥r"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return e}(),e.fullCalendar.datepickerLocale("nb","nb",{closeText:"Lukk",prevText:"&#xAB;Forrige",nextText:"Neste&#xBB;",currentText:"I dag",monthNames:["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"],monthNamesShort:["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des"],dayNamesShort:["søn","man","tir","ons","tor","fre","lør"],dayNames:["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],dayNamesMin:["sø","ma","ti","on","to","fr","lø"],weekHeader:"Uke",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("nb",{buttonText:{month:"MÃ¥ned",week:"Uke",day:"Dag",list:"Agenda"},allDayText:"Hele dagen",eventLimitText:"til",noEventsMessage:"Ingen hendelser Ã¥ vise"})}(),function(){!function(){var e="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),t="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),n=[/^jan/i,/^feb/i,/^maart|mrt.?$/i,/^apr/i,/^mei$/i,/^jun[i.]?$/i,/^jul[i.]?$/i,/^aug/i,/^sep/i,/^okt/i,/^nov/i,/^dec/i],r=/^(januari|februari|maart|april|mei|april|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,s=a.defineLocale("nl",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(a,n){return/-MMM-/.test(n)?t[a.month()]:e[a.month()]},monthsRegex:r,monthsShortRegex:r,monthsStrictRegex:/^(januari|februari|maart|mei|ju[nl]i|april|augustus|september|oktober|november|december)/i,monthsShortStrictRegex:/^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,monthsParse:n,longMonthsParse:n,shortMonthsParse:n,weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"Zo_Ma_Di_Wo_Do_Vr_Za".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",
-lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",m:"één minuut",mm:"%d minuten",h:"één uur",hh:"%d uur",d:"één dag",dd:"%d dagen",M:"één maand",MM:"%d maanden",y:"één jaar",yy:"%d jaar"},ordinalParse:/\d{1,2}(ste|de)/,ordinal:function(e){return e+(1===e||8===e||e>=20?"ste":"de")},week:{dow:1,doy:4}});return s}(),e.fullCalendar.datepickerLocale("nl","nl",{closeText:"Sluiten",prevText:"â†",nextText:"→",currentText:"Vandaag",monthNames:["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"],monthNamesShort:["jan","feb","mrt","apr","mei","jun","jul","aug","sep","okt","nov","dec"],dayNames:["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],dayNamesShort:["zon","maa","din","woe","don","vri","zat"],dayNamesMin:["zo","ma","di","wo","do","vr","za"],weekHeader:"Wk",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("nl",{buttonText:{month:"Maand",week:"Week",day:"Dag",list:"Agenda"},allDayText:"Hele dag",eventLimitText:"extra",noEventsMessage:"Geen evenementen om te laten zien"})}(),function(){!function(){var e="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),t="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),n=[/^jan/i,/^feb/i,/^maart|mrt.?$/i,/^apr/i,/^mei$/i,/^jun[i.]?$/i,/^jul[i.]?$/i,/^aug/i,/^sep/i,/^okt/i,/^nov/i,/^dec/i],r=/^(januari|februari|maart|april|mei|april|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,s=a.defineLocale("nl-be",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(a,n){return/-MMM-/.test(n)?t[a.month()]:e[a.month()]},monthsRegex:r,monthsShortRegex:r,monthsStrictRegex:/^(januari|februari|maart|mei|ju[nl]i|april|augustus|september|oktober|november|december)/i,monthsShortStrictRegex:/^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,monthsParse:n,longMonthsParse:n,shortMonthsParse:n,weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"Zo_Ma_Di_Wo_Do_Vr_Za".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",m:"één minuut",mm:"%d minuten",h:"één uur",hh:"%d uur",d:"één dag",dd:"%d dagen",M:"één maand",MM:"%d maanden",y:"één jaar",yy:"%d jaar"},ordinalParse:/\d{1,2}(ste|de)/,ordinal:function(e){return e+(1===e||8===e||e>=20?"ste":"de")},week:{dow:1,doy:4}});return s}(),e.fullCalendar.datepickerLocale("nl-be","nl-BE",{closeText:"Sluiten",prevText:"â†",nextText:"→",currentText:"Vandaag",monthNames:["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"],monthNamesShort:["jan","feb","mrt","apr","mei","jun","jul","aug","sep","okt","nov","dec"],dayNames:["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],dayNamesShort:["zon","maa","din","woe","don","vri","zat"],dayNamesMin:["zo","ma","di","wo","do","vr","za"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("nl-be",{buttonText:{month:"Maand",week:"Week",day:"Dag",list:"Agenda"},allDayText:"Hele dag",eventLimitText:"extra",noEventsMessage:"Geen evenementen om te laten zien"})}(),function(){!function(){var e=a.defineLocale("nn",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sundag_mÃ¥ndag_tysdag_onsdag_torsdag_fredag_laurdag".split("_"),weekdaysShort:"sun_mÃ¥n_tys_ons_tor_fre_lau".split("_"),weekdaysMin:"su_mÃ¥_ty_on_to_fr_lø".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] H:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[I dag klokka] LT",nextDay:"[I morgon klokka] LT",nextWeek:"dddd [klokka] LT",lastDay:"[I gÃ¥r klokka] LT",lastWeek:"[FøregÃ¥ande] dddd [klokka] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s sidan",s:"nokre sekund",m:"eit minutt",mm:"%d minutt",h:"ein time",hh:"%d timar",d:"ein dag",dd:"%d dagar",M:"ein mÃ¥nad",MM:"%d mÃ¥nader",y:"eit Ã¥r",yy:"%d Ã¥r"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return e}(),e.fullCalendar.datepickerLocale("nn","nn",{closeText:"Lukk",prevText:"&#xAB;Førre",nextText:"Neste&#xBB;",currentText:"I dag",monthNames:["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"],monthNamesShort:["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des"],dayNamesShort:["sun","mÃ¥n","tys","ons","tor","fre","lau"],dayNames:["sundag","mÃ¥ndag","tysdag","onsdag","torsdag","fredag","laurdag"],dayNamesMin:["su","mÃ¥","ty","on","to","fr","la"],weekHeader:"Veke",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("nn",{buttonText:{month:"MÃ¥nad",week:"Veke",day:"Dag",list:"Agenda"},allDayText:"Heile dagen",eventLimitText:"til",noEventsMessage:"Ingen hendelser Ã¥ vise"})}(),function(){!function(){function e(e){return e%10<5&&e%10>1&&~~(e/10)%10!==1}function t(a,t,n){var r=a+" ";switch(n){case"m":return t?"minuta":"minutÄ™";case"mm":return r+(e(a)?"minuty":"minut");case"h":return t?"godzina":"godzinÄ™";case"hh":return r+(e(a)?"godziny":"godzin");case"MM":return r+(e(a)?"miesiÄ…ce":"miesiÄ™cy");case"yy":return r+(e(a)?"lata":"lat")}}var n="styczeÅ„_luty_marzec_kwiecieÅ„_maj_czerwiec_lipiec_sierpieÅ„_wrzesieÅ„_październik_listopad_grudzieÅ„".split("_"),r="stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_wrzeÅ›nia_października_listopada_grudnia".split("_"),s=a.defineLocale("pl",{months:function(e,a){return""===a?"("+r[e.month()]+"|"+n[e.month()]+")":/D MMMM/.test(a)?r[e.month()]:n[e.month()]},monthsShort:"sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru".split("_"),weekdays:"niedziela_poniedziaÅ‚ek_wtorek_Å›roda_czwartek_piÄ…tek_sobota".split("_"),weekdaysShort:"ndz_pon_wt_Å›r_czw_pt_sob".split("_"),weekdaysMin:"Nd_Pn_Wt_Åšr_Cz_Pt_So".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[DziÅ› o] LT",nextDay:"[Jutro o] LT",nextWeek:"[W] dddd [o] LT",lastDay:"[Wczoraj o] LT",lastWeek:function(){switch(this.day()){case 0:return"[W zeszÅ‚Ä… niedzielÄ™ o] LT";case 3:return"[W zeszÅ‚Ä… Å›rodÄ™ o] LT";case 6:return"[W zeszÅ‚Ä… sobotÄ™ o] LT";default:return"[W zeszÅ‚y] dddd [o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"%s temu",s:"kilka sekund",m:t,mm:t,h:t,hh:t,d:"1 dzieÅ„",dd:"%d dni",M:"miesiÄ…c",MM:t,y:"rok",yy:t},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return s}(),e.fullCalendar.datepickerLocale("pl","pl",{closeText:"Zamknij",prevText:"&#x3C;Poprzedni",nextText:"NastÄ™pny&#x3E;",currentText:"DziÅ›",monthNames:["StyczeÅ„","Luty","Marzec","KwiecieÅ„","Maj","Czerwiec","Lipiec","SierpieÅ„","WrzesieÅ„","Październik","Listopad","GrudzieÅ„"],monthNamesShort:["Sty","Lu","Mar","Kw","Maj","Cze","Lip","Sie","Wrz","Pa","Lis","Gru"],dayNames:["Niedziela","PoniedziaÅ‚ek","Wtorek","Åšroda","Czwartek","PiÄ…tek","Sobota"],dayNamesShort:["Nie","Pn","Wt","Åšr","Czw","Pt","So"],dayNamesMin:["N","Pn","Wt","Åšr","Cz","Pt","So"],weekHeader:"Tydz",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("pl",{buttonText:{month:"MiesiÄ…c",week:"TydzieÅ„",day:"DzieÅ„",list:"Plan dnia"},allDayText:"CaÅ‚y dzieÅ„",eventLimitText:"wiÄ™cej",noEventsMessage:"Brak wydarzeÅ„ do wyÅ›wietlenia"})}(),function(){!function(){var e=a.defineLocale("pt",{months:"Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro".split("_"),monthsShort:"Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"),weekdays:"Domingo_Segunda-Feira_Terça-Feira_Quarta-Feira_Quinta-Feira_Sexta-Feira_Sábado".split("_"),weekdaysShort:"Dom_Seg_Ter_Qua_Qui_Sex_Sáb".split("_"),weekdaysMin:"Dom_2ª_3ª_4ª_5ª_6ª_Sáb".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY HH:mm"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"há %s",s:"segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}});return e}(),e.fullCalendar.datepickerLocale("pt","pt",{closeText:"Fechar",prevText:"Anterior",nextText:"Seguinte",currentText:"Hoje",monthNames:["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],monthNamesShort:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],dayNames:["Domingo","Segunda-feira","Terça-feira","Quarta-feira","Quinta-feira","Sexta-feira","Sábado"],dayNamesShort:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],dayNamesMin:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],weekHeader:"Sem",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("pt",{buttonText:{month:"Mês",week:"Semana",day:"Dia",list:"Agenda"},allDayText:"Todo o dia",eventLimitText:"mais",noEventsMessage:"Não há eventos para mostrar"})}(),function(){!function(){var e=a.defineLocale("pt-br",{months:"Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro".split("_"),monthsShort:"Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"),weekdays:"Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado".split("_"),weekdaysShort:"Dom_Seg_Ter_Qua_Qui_Sex_Sáb".split("_"),weekdaysMin:"Dom_2ª_3ª_4ª_5ª_6ª_Sáb".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY [às] HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY [às] HH:mm"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"%s atrás",s:"poucos segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},ordinalParse:/\d{1,2}º/,ordinal:"%dº"});return e}(),e.fullCalendar.datepickerLocale("pt-br","pt-BR",{closeText:"Fechar",prevText:"&#x3C;Anterior",nextText:"Próximo&#x3E;",currentText:"Hoje",monthNames:["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],monthNamesShort:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],dayNames:["Domingo","Segunda-feira","Terça-feira","Quarta-feira","Quinta-feira","Sexta-feira","Sábado"],dayNamesShort:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],dayNamesMin:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("pt-br",{buttonText:{month:"Mês",week:"Semana",day:"Dia",list:"Compromissos"},allDayText:"dia inteiro",eventLimitText:function(e){return"mais +"+e},noEventsMessage:"Não há eventos para mostrar"})}(),function(){!function(){function e(e,a,t){var n={mm:"minute",hh:"ore",dd:"zile",MM:"luni",yy:"ani"},r=" ";return(e%100>=20||e>=100&&e%100===0)&&(r=" de "),e+r+n[t]}var t=a.defineLocale("ro",{months:"ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie".split("_"),monthsShort:"ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"duminică_luni_marÈ›i_miercuri_joi_vineri_sâmbătă".split("_"),weekdaysShort:"Dum_Lun_Mar_Mie_Joi_Vin_Sâm".split("_"),weekdaysMin:"Du_Lu_Ma_Mi_Jo_Vi_Sâ".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[azi la] LT",nextDay:"[mâine la] LT",nextWeek:"dddd [la] LT",lastDay:"[ieri la] LT",lastWeek:"[fosta] dddd [la] LT",sameElse:"L"},relativeTime:{future:"peste %s",past:"%s în urmă",s:"câteva secunde",m:"un minut",mm:e,h:"o oră",hh:e,d:"o zi",dd:e,M:"o lună",MM:e,y:"un an",yy:e},week:{dow:1,doy:7}});return t}(),e.fullCalendar.datepickerLocale("ro","ro",{closeText:"ÃŽnchide",prevText:"&#xAB; Luna precedentă",nextText:"Luna următoare &#xBB;",currentText:"Azi",monthNames:["Ianuarie","Februarie","Martie","Aprilie","Mai","Iunie","Iulie","August","Septembrie","Octombrie","Noiembrie","Decembrie"],monthNamesShort:["Ian","Feb","Mar","Apr","Mai","Iun","Iul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Duminică","Luni","MarÅ£i","Miercuri","Joi","Vineri","Sâmbătă"],dayNamesShort:["Dum","Lun","Mar","Mie","Joi","Vin","Sâm"],dayNamesMin:["Du","Lu","Ma","Mi","Jo","Vi","Sâ"],weekHeader:"Săpt",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("ro",{buttonText:{prev:"precedentă",next:"următoare",month:"Lună",week:"Săptămână",day:"Zi",list:"Agendă"},allDayText:"Toată ziua",eventLimitText:function(e){return"+alte "+e},noEventsMessage:"Nu există evenimente de afiÈ™at"})}(),function(){!function(){function e(e,a){var t=e.split("_");return a%10===1&&a%100!==11?t[0]:a%10>=2&&a%10<=4&&(a%100<10||a%100>=20)?t[1]:t[2]}function t(a,t,n){var r={mm:t?"минута_минуты_минут":"минуту_минуты_минут",hh:"чаÑ_чаÑа_чаÑов",dd:"день_днÑ_дней",MM:"меÑÑц_меÑÑца_меÑÑцев",yy:"год_года_лет"};return"m"===n?t?"минута":"минуту":a+" "+e(r[n],+a)}var n=[/^Ñнв/i,/^фев/i,/^мар/i,/^апр/i,/^ма[йÑ]/i,/^июн/i,/^июл/i,/^авг/i,/^Ñен/i,/^окт/i,/^ноÑ/i,/^дек/i],r=a.defineLocale("ru",{months:{format:"ÑнварÑ_февралÑ_марта_апрелÑ_маÑ_июнÑ_июлÑ_авгуÑта_ÑентÑбрÑ_октÑбрÑ_ноÑбрÑ_декабрÑ".split("_"),standalone:"Ñнварь_февраль_март_апрель_май_июнь_июль_авгуÑÑ‚_ÑентÑбрь_октÑбрь_ноÑбрь_декабрь".split("_")},monthsShort:{format:"Ñнв._февр._мар._апр._маÑ_июнÑ_июлÑ_авг._Ñент._окт._ноÑб._дек.".split("_"),standalone:"Ñнв._февр._март_апр._май_июнь_июль_авг._Ñент._окт._ноÑб._дек.".split("_")},weekdays:{standalone:"воÑкреÑенье_понедельник_вторник_Ñреда_четверг_пÑтница_Ñуббота".split("_"),format:"воÑкреÑенье_понедельник_вторник_Ñреду_четверг_пÑтницу_Ñубботу".split("_"),isFormat:/\[ ?[Вв] ?(?:прошлую|Ñледующую|Ñту)? ?\] ?dddd/},weekdaysShort:"вÑ_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),weekdaysMin:"вÑ_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),monthsParse:n,longMonthsParse:n,shortMonthsParse:n,monthsRegex:/^(Ñнвар[ÑŒÑ]|Ñнв\.?|феврал[ÑŒÑ]|февр?\.?|марта?|мар\.?|апрел[ÑŒÑ]|апр\.?|ма[йÑ]|июн[ÑŒÑ]|июн\.?|июл[ÑŒÑ]|июл\.?|авгуÑта?|авг\.?|ÑентÑбр[ÑŒÑ]|Ñент?\.?|октÑбр[ÑŒÑ]|окт\.?|ноÑбр[ÑŒÑ]|ноÑб?\.?|декабр[ÑŒÑ]|дек\.?)/i,monthsShortRegex:/^(Ñнвар[ÑŒÑ]|Ñнв\.?|феврал[ÑŒÑ]|февр?\.?|марта?|мар\.?|апрел[ÑŒÑ]|апр\.?|ма[йÑ]|июн[ÑŒÑ]|июн\.?|июл[ÑŒÑ]|июл\.?|авгуÑта?|авг\.?|ÑентÑбр[ÑŒÑ]|Ñент?\.?|октÑбр[ÑŒÑ]|окт\.?|ноÑбр[ÑŒÑ]|ноÑб?\.?|декабр[ÑŒÑ]|дек\.?)/i,monthsStrictRegex:/^(Ñнвар[ÑÑŒ]|феврал[ÑÑŒ]|марта?|апрел[ÑÑŒ]|ма[Ñй]|июн[ÑÑŒ]|июл[ÑÑŒ]|авгуÑта?|ÑентÑбр[ÑÑŒ]|октÑбр[ÑÑŒ]|ноÑбр[ÑÑŒ]|декабр[ÑÑŒ])/i,monthsShortStrictRegex:/^(Ñнв\.|февр?\.|мар[Ñ‚.]|апр\.|ма[Ñй]|июн[ÑŒÑ.]|июл[ÑŒÑ.]|авг\.|Ñент?\.|окт\.|ноÑб?\.|дек\.)/i,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY г.",LLL:"D MMMM YYYY г., HH:mm",LLLL:"dddd, D MMMM YYYY г., HH:mm"},calendar:{sameDay:"[Ð¡ÐµÐ³Ð¾Ð´Ð½Ñ Ð²] LT",nextDay:"[Завтра в] LT",lastDay:"[Вчера в] LT",nextWeek:function(e){if(e.week()===this.week())return 2===this.day()?"[Во] dddd [в] LT":"[Ð’] dddd [в] LT";switch(this.day()){case 0:return"[Ð’ Ñледующее] dddd [в] LT";case 1:case 2:case 4:return"[Ð’ Ñледующий] dddd [в] LT";case 3:case 5:case 6:return"[Ð’ Ñледующую] dddd [в] LT"}},lastWeek:function(e){if(e.week()===this.week())return 2===this.day()?"[Во] dddd [в] LT":"[Ð’] dddd [в] LT";switch(this.day()){case 0:return"[Ð’ прошлое] dddd [в] LT";case 1:case 2:case 4:return"[Ð’ прошлый] dddd [в] LT";case 3:case 5:case 6:return"[Ð’ прошлую] dddd [в] LT"}},sameElse:"L"},relativeTime:{future:"через %s",past:"%s назад",s:"неÑколько Ñекунд",m:t,mm:t,h:"чаÑ",hh:t,d:"день",dd:t,M:"меÑÑц",MM:t,y:"год",yy:t},meridiemParse:/ночи|утра|днÑ|вечера/i,isPM:function(e){return/^(днÑ|вечера)$/.test(e)},meridiem:function(e,a,t){return e<4?"ночи":e<12?"утра":e<17?"днÑ":"вечера"},ordinalParse:/\d{1,2}-(й|го|Ñ)/,ordinal:function(e,a){switch(a){case"M":case"d":case"DDD":return e+"-й";case"D":return e+"-го";case"w":case"W":return e+"-Ñ";default:return e}},week:{dow:1,doy:7}});return r}(),e.fullCalendar.datepickerLocale("ru","ru",{closeText:"Закрыть",prevText:"&#x3C;Пред",nextText:"След&#x3E;",currentText:"СегоднÑ",monthNames:["Январь","Февраль","Март","Ðпрель","Май","Июнь","Июль","ÐвгуÑÑ‚","СентÑбрь","ОктÑбрь","ÐоÑбрь","Декабрь"],monthNamesShort:["Янв","Фев","Мар","Ðпр","Май","Июн","Июл","Ðвг","Сен","Окт","ÐоÑ","Дек"],dayNames:["воÑкреÑенье","понедельник","вторник","Ñреда","четверг","пÑтница","Ñуббота"],dayNamesShort:["вÑк","пнд","втр","Ñрд","чтв","птн","Ñбт"],dayNamesMin:["Ð’Ñ","Пн","Ð’Ñ‚","Ср","Чт","Пт","Сб"],weekHeader:"Ðед",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("ru",{buttonText:{month:"МеÑÑц",week:"ÐеделÑ",day:"День",list:"ПовеÑтка днÑ"},allDayText:"ВеÑÑŒ день",eventLimitText:function(e){return"+ ещё "+e},noEventsMessage:"Ðет Ñобытий Ð´Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ"})}(),function(){!function(){function e(e){return e>1&&e<5}function t(a,t,n,r){var s=a+" ";switch(n){case"s":return t||r?"pár sekúnd":"pár sekundami";case"m":return t?"minúta":r?"minútu":"minútou";case"mm":return t||r?s+(e(a)?"minúty":"minút"):s+"minútami";case"h":return t?"hodina":r?"hodinu":"hodinou";case"hh":return t||r?s+(e(a)?"hodiny":"hodín"):s+"hodinami";case"d":return t||r?"deň":"dňom";case"dd":return t||r?s+(e(a)?"dni":"dní"):s+"dňami";case"M":return t||r?"mesiac":"mesiacom";case"MM":return t||r?s+(e(a)?"mesiace":"mesiacov"):s+"mesiacmi";case"y":return t||r?"rok":"rokom";case"yy":return t||r?s+(e(a)?"roky":"rokov"):s+"rokmi"}}var n="január_február_marec_apríl_máj_jún_júl_august_september_október_november_december".split("_"),r="jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec".split("_"),s=a.defineLocale("sk",{months:n,monthsShort:r,weekdays:"nedeľa_pondelok_utorok_streda_Å¡tvrtok_piatok_sobota".split("_"),weekdaysShort:"ne_po_ut_st_Å¡t_pi_so".split("_"),weekdaysMin:"ne_po_ut_st_Å¡t_pi_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm"},calendar:{sameDay:"[dnes o] LT",nextDay:"[zajtra o] LT",nextWeek:function(){switch(this.day()){case 0:return"[v nedeľu o] LT";case 1:case 2:return"[v] dddd [o] LT";case 3:return"[v stredu o] LT";case 4:return"[vo Å¡tvrtok o] LT";case 5:return"[v piatok o] LT";case 6:return"[v sobotu o] LT"}},lastDay:"[vÄera o] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulú nedeľu o] LT";case 1:case 2:return"[minulý] dddd [o] LT";case 3:return"[minulú stredu o] LT";case 4:case 5:return"[minulý] dddd [o] LT";case 6:return"[minulú sobotu o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"pred %s",s:t,m:t,mm:t,h:t,hh:t,d:t,dd:t,M:t,MM:t,y:t,yy:t},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return s}(),e.fullCalendar.datepickerLocale("sk","sk",{closeText:"ZavrieÅ¥",prevText:"&#x3C;Predchádzajúci",nextText:"Nasledujúci&#x3E;",currentText:"Dnes",monthNames:["január","február","marec","apríl","máj","jún","júl","august","september","október","november","december"],monthNamesShort:["Jan","Feb","Mar","Apr","Máj","Jún","Júl","Aug","Sep","Okt","Nov","Dec"],dayNames:["nedeľa","pondelok","utorok","streda","Å¡tvrtok","piatok","sobota"],dayNamesShort:["Ned","Pon","Uto","Str","Å tv","Pia","Sob"],dayNamesMin:["Ne","Po","Ut","St","Å t","Pia","So"],weekHeader:"Ty",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("sk",{buttonText:{month:"Mesiac",week:"Týždeň",day:"Deň",list:"Rozvrh"},allDayText:"Celý deň",eventLimitText:function(e){return"+ÄalÅ¡ie: "+e},noEventsMessage:"Žiadne akcie na zobrazenie"})}(),function(){!function(){function e(e,a,t,n){var r=e+" ";switch(t){case"s":return a||n?"nekaj sekund":"nekaj sekundami";case"m":return a?"ena minuta":"eno minuto";case"mm":return r+=1===e?a?"minuta":"minuto":2===e?a||n?"minuti":"minutama":e<5?a||n?"minute":"minutami":a||n?"minut":"minutami";case"h":return a?"ena ura":"eno uro";case"hh":return r+=1===e?a?"ura":"uro":2===e?a||n?"uri":"urama":e<5?a||n?"ure":"urami":a||n?"ur":"urami";case"d":return a||n?"en dan":"enim dnem";case"dd":return r+=1===e?a||n?"dan":"dnem":2===e?a||n?"dni":"dnevoma":a||n?"dni":"dnevi";case"M":return a||n?"en mesec":"enim mesecem";case"MM":return r+=1===e?a||n?"mesec":"mesecem":2===e?a||n?"meseca":"mesecema":e<5?a||n?"mesece":"meseci":a||n?"mesecev":"meseci";case"y":return a||n?"eno leto":"enim letom";case"yy":return r+=1===e?a||n?"leto":"letom":2===e?a||n?"leti":"letoma":e<5?a||n?"leta":"leti":a||n?"let":"leti"}}var t=a.defineLocale("sl",{months:"januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedelja_ponedeljek_torek_sreda_Äetrtek_petek_sobota".split("_"),weekdaysShort:"ned._pon._tor._sre._Äet._pet._sob.".split("_"),weekdaysMin:"ne_po_to_sr_Äe_pe_so".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danes ob] LT",nextDay:"[jutri ob] LT",nextWeek:function(){switch(this.day()){case 0:return"[v] [nedeljo] [ob] LT";case 3:return"[v] [sredo] [ob] LT";case 6:return"[v] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[v] dddd [ob] LT"}},lastDay:"[vÄeraj ob] LT",lastWeek:function(){switch(this.day()){case 0:return"[prejÅ¡njo] [nedeljo] [ob] LT";case 3:return"[prejÅ¡njo] [sredo] [ob] LT";case 6:return"[prejÅ¡njo] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[prejÅ¡nji] dddd [ob] LT"}},sameElse:"L"},relativeTime:{future:"Äez %s",past:"pred %s",s:e,m:e,mm:e,h:e,hh:e,d:e,dd:e,M:e,MM:e,y:e,yy:e},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}});return t}(),e.fullCalendar.datepickerLocale("sl","sl",{closeText:"Zapri",prevText:"&#x3C;PrejÅ¡nji",nextText:"Naslednji&#x3E;",currentText:"Trenutni",monthNames:["Januar","Februar","Marec","April","Maj","Junij","Julij","Avgust","September","Oktober","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Avg","Sep","Okt","Nov","Dec"],dayNames:["Nedelja","Ponedeljek","Torek","Sreda","ÄŒetrtek","Petek","Sobota"],dayNamesShort:["Ned","Pon","Tor","Sre","ÄŒet","Pet","Sob"],dayNamesMin:["Ne","Po","To","Sr","ÄŒe","Pe","So"],weekHeader:"Teden",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("sl",{buttonText:{month:"Mesec",week:"Teden",day:"Dan",list:"Dnevni red"},allDayText:"Ves dan",eventLimitText:"veÄ",noEventsMessage:"Ni dogodkov za prikaz"})}(),function(){!function(){var e={words:{m:["jedan minut","jedne minute"],mm:["minut","minute","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],dd:["dan","dana","dana"],MM:["mesec","meseca","meseci"],yy:["godina","godine","godina"]},correctGrammaticalCase:function(e,a){return 1===e?a[0]:e>=2&&e<=4?a[1]:a[2]},translate:function(a,t,n){var r=e.words[n];return 1===n.length?t?r[0]:r[1]:a+" "+e.correctGrammaticalCase(a,r)}},t=a.defineLocale("sr",{months:"januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedelja_ponedeljak_utorak_sreda_Äetvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sre._Äet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_Äe_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedelju] [u] LT";case 3:return"[u] [sredu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[juÄe u] LT",lastWeek:function(){var e=["[proÅ¡le] [nedelje] [u] LT","[proÅ¡log] [ponedeljka] [u] LT","[proÅ¡log] [utorka] [u] LT","[proÅ¡le] [srede] [u] LT","[proÅ¡log] [Äetvrtka] [u] LT","[proÅ¡log] [petka] [u] LT","[proÅ¡le] [subote] [u] LT"];return e[this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"pre %s",s:"nekoliko sekundi",m:e.translate,mm:e.translate,h:e.translate,hh:e.translate,d:"dan",dd:e.translate,M:"mesec",MM:e.translate,y:"godinu",yy:e.translate},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}});return t}(),e.fullCalendar.datepickerLocale("sr","sr",{closeText:"Затвори",prevText:"&#x3C;",nextText:"&#x3E;",currentText:"ДанаÑ",monthNames:["Јануар","Фебруар","Март","Ðприл","Мај","Јун","Јул","ÐвгуÑÑ‚","Септембар","Октобар","Ðовембар","Децембар"],monthNamesShort:["Јан","Феб","Мар","Ðпр","Мај","Јун","Јул","Ðвг","Сеп","Окт","Ðов","Дец"],dayNames:["Ðедеља","Понедељак","Уторак","Среда","Четвртак","Петак","Субота"],dayNamesShort:["Ðед","Пон","Уто","Сре","Чет","Пет","Суб"],dayNamesMin:["Ðе","По","Ут","Ср","Че","Пе","Су"],weekHeader:"Сед",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("sr",{buttonText:{month:"МеÑец",week:"Ðедеља",day:"Дан",list:"Планер"},allDayText:"Цео дан",eventLimitText:function(e){return"+ још "+e},noEventsMessage:"Ðема догађаја за приказ"})}(),function(){!function(){var e={words:{m:["један минут","једне минуте"],mm:["минут","минуте","минута"],h:["један Ñат","једног Ñата"],hh:["Ñат","Ñата","Ñати"],dd:["дан","дана","дана"],MM:["меÑец","меÑеца","меÑеци"],yy:["година","године","година"]},correctGrammaticalCase:function(e,a){return 1===e?a[0]:e>=2&&e<=4?a[1]:a[2]},translate:function(a,t,n){var r=e.words[n];return 1===n.length?t?r[0]:r[1]:a+" "+e.correctGrammaticalCase(a,r)}},t=a.defineLocale("sr-cyrl",{months:"јануар_фебруар_март_април_мај_јун_јул_авгуÑÑ‚_Ñептембар_октобар_новембар_децембар".split("_"),monthsShort:"јан._феб._мар._апр._мај_јун_јул_авг._Ñеп._окт._нов._дец.".split("_"),monthsParseExact:!0,weekdays:"недеља_понедељак_уторак_Ñреда_четвртак_петак_Ñубота".split("_"),weekdaysShort:"нед._пон._уто._Ñре._чет._пет._Ñуб.".split("_"),weekdaysMin:"не_по_ут_ÑÑ€_че_пе_Ñу".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[Ð´Ð°Ð½Ð°Ñ Ñƒ] LT",nextDay:"[Ñутра у] LT",nextWeek:function(){switch(this.day()){case 0:return"[у] [недељу] [у] LT";case 3:return"[у] [Ñреду] [у] LT";case 6:return"[у] [Ñуботу] [у] LT";case 1:case 2:case 4:case 5:return"[у] dddd [у] LT"}},lastDay:"[јуче у] LT",lastWeek:function(){var e=["[прошле] [недеље] [у] LT","[прошлог] [понедељка] [у] LT","[прошлог] [уторка] [у] LT","[прошле] [Ñреде] [у] LT","[прошлог] [четвртка] [у] LT","[прошлог] [петка] [у] LT","[прошле] [Ñуботе] [у] LT"];return e[this.day()]},sameElse:"L"},relativeTime:{future:"за %s",past:"пре %s",s:"неколико Ñекунди",m:e.translate,mm:e.translate,h:e.translate,hh:e.translate,d:"дан",dd:e.translate,M:"меÑец",MM:e.translate,y:"годину",yy:e.translate},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}});return t}(),e.fullCalendar.datepickerLocale("sr-cyrl","sr",{closeText:"Затвори",prevText:"&#x3C;",nextText:"&#x3E;",currentText:"ДанаÑ",monthNames:["Јануар","Фебруар","Март","Ðприл","Мај","Јун","Јул","ÐвгуÑÑ‚","Септембар","Октобар","Ðовембар","Децембар"],monthNamesShort:["Јан","Феб","Мар","Ðпр","Мај","Јун","Јул","Ðвг","Сеп","Окт","Ðов","Дец"],dayNames:["Ðедеља","Понедељак","Уторак","Среда","Четвртак","Петак","Субота"],dayNamesShort:["Ðед","Пон","Уто","Сре","Чет","Пет","Суб"],dayNamesMin:["Ðе","По","Ут","Ср","Че","Пе","Су"],weekHeader:"Сед",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("sr-cyrl",{buttonText:{month:"МеÑец",week:"Ðедеља",day:"Дан",list:"Планер"},allDayText:"Цео дан",eventLimitText:function(e){return"+ још "+e},noEventsMessage:"Ðема догађаја за приказ"})}(),function(){!function(){var e=a.defineLocale("sv",{months:"januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"söndag_mÃ¥ndag_tisdag_onsdag_torsdag_fredag_lördag".split("_"),weekdaysShort:"sön_mÃ¥n_tis_ons_tor_fre_lör".split("_"),weekdaysMin:"sö_mÃ¥_ti_on_to_fr_lö".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [kl.] HH:mm",LLLL:"dddd D MMMM YYYY [kl.] HH:mm",lll:"D MMM YYYY HH:mm",llll:"ddd D MMM YYYY HH:mm"},calendar:{sameDay:"[Idag] LT",nextDay:"[Imorgon] LT",lastDay:"[IgÃ¥r] LT",nextWeek:"[PÃ¥] dddd LT",lastWeek:"[I] dddd[s] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"för %s sedan",s:"nÃ¥gra sekunder",m:"en minut",mm:"%d minuter",h:"en timme",hh:"%d timmar",d:"en dag",dd:"%d dagar",M:"en mÃ¥nad",MM:"%d mÃ¥nader",y:"ett Ã¥r",yy:"%d Ã¥r"},ordinalParse:/\d{1,2}(e|a)/,ordinal:function(e){var a=e%10,t=1===~~(e%100/10)?"e":1===a?"a":2===a?"a":"e";return e+t},week:{dow:1,doy:4}});return e}(),e.fullCalendar.datepickerLocale("sv","sv",{closeText:"Stäng",prevText:"&#xAB;Förra",nextText:"Nästa&#xBB;",currentText:"Idag",monthNames:["Januari","Februari","Mars","April","Maj","Juni","Juli","Augusti","September","Oktober","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],dayNamesShort:["Sön","MÃ¥n","Tis","Ons","Tor","Fre","Lör"],dayNames:["Söndag","MÃ¥ndag","Tisdag","Onsdag","Torsdag","Fredag","Lördag"],dayNamesMin:["Sö","MÃ¥","Ti","On","To","Fr","Lö"],weekHeader:"Ve",dateFormat:"yy-mm-dd",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("sv",{buttonText:{month:"MÃ¥nad",week:"Vecka",day:"Dag",list:"Program"},allDayText:"Heldag",eventLimitText:"till",noEventsMessage:"Inga händelser att visa"})}(),function(){!function(){var e=a.defineLocale("th",{months:"มà¸à¸£à¸²à¸„ม_à¸à¸¸à¸¡à¸ à¸²à¸žà¸±à¸™à¸˜à¹Œ_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_à¸à¸£à¸à¸Žà¸²à¸„ม_สิงหาคม_à¸à¸±à¸™à¸¢à¸²à¸¢à¸™_ตุลาคม_พฤศจิà¸à¸²à¸¢à¸™_ธันวาคม".split("_"),monthsShort:"ม.ค._à¸.พ._มี.ค._เม.ย._พ.ค._มิ.ย._à¸.ค._ส.ค._à¸.ย._ต.ค._พ.ย._ธ.ค.".split("_"),monthsParseExact:!0,weekdays:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุà¸à¸£à¹Œ_เสาร์".split("_"),weekdaysShort:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุà¸à¸£à¹Œ_เสาร์".split("_"),weekdaysMin:"อา._จ._อ._พ._พฤ._ศ._ส.".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"YYYY/MM/DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY เวลา H:mm",LLLL:"วันddddที่ D MMMM YYYY เวลา H:mm"},meridiemParse:/à¸à¹ˆà¸­à¸™à¹€à¸—ี่ยง|หลังเที่ยง/,isPM:function(e){return"หลังเที่ยง"===e},meridiem:function(e,a,t){return e<12?"à¸à¹ˆà¸­à¸™à¹€à¸—ี่ยง":"หลังเที่ยง"},calendar:{sameDay:"[วันนี้ เวลา] LT",nextDay:"[พรุ่งนี้ เวลา] LT",nextWeek:"dddd[หน้า เวลา] LT",lastDay:"[เมื่อวานนี้ เวลา] LT",lastWeek:"[วัน]dddd[ที่à¹à¸¥à¹‰à¸§ เวลา] LT",sameElse:"L"},relativeTime:{future:"อีภ%s",past:"%sที่à¹à¸¥à¹‰à¸§",s:"ไม่à¸à¸µà¹ˆà¸§à¸´à¸™à¸²à¸—ี",m:"1 นาที",mm:"%d นาที",h:"1 ชั่วโมง",hh:"%d ชั่วโมง",d:"1 วัน",dd:"%d วัน",M:"1 เดือน",MM:"%d เดือน",y:"1 ปี",yy:"%d ปี"
-}});return e}(),e.fullCalendar.datepickerLocale("th","th",{closeText:"ปิด",prevText:"&#xAB;&#xA0;ย้อน",nextText:"ถัดไป&#xA0;&#xBB;",currentText:"วันนี้",monthNames:["มà¸à¸£à¸²à¸„ม","à¸à¸¸à¸¡à¸ à¸²à¸žà¸±à¸™à¸˜à¹Œ","มีนาคม","เมษายน","พฤษภาคม","มิถุนายน","à¸à¸£à¸à¸Žà¸²à¸„ม","สิงหาคม","à¸à¸±à¸™à¸¢à¸²à¸¢à¸™","ตุลาคม","พฤศจิà¸à¸²à¸¢à¸™","ธันวาคม"],monthNamesShort:["ม.ค.","à¸.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","à¸.ค.","ส.ค.","à¸.ย.","ต.ค.","พ.ย.","ธ.ค."],dayNames:["อาทิตย์","จันทร์","อังคาร","พุธ","พฤหัสบดี","ศุà¸à¸£à¹Œ","เสาร์"],dayNamesShort:["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],dayNamesMin:["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("th",{buttonText:{month:"เดือน",week:"สัปดาห์",day:"วัน",list:"à¹à¸œà¸™à¸‡à¸²à¸™"},allDayText:"ตลอดวัน",eventLimitText:"เพิ่มเติม",noEventsMessage:"ไม่มีà¸à¸´à¸ˆà¸à¸£à¸£à¸¡à¸—ี่จะà¹à¸ªà¸”ง"})}(),function(){!function(){var e={1:"'inci",5:"'inci",8:"'inci",70:"'inci",80:"'inci",2:"'nci",7:"'nci",20:"'nci",50:"'nci",3:"'üncü",4:"'üncü",100:"'üncü",6:"'ncı",9:"'uncu",10:"'uncu",30:"'uncu",60:"'ıncı",90:"'ıncı"},t=a.defineLocale("tr",{months:"Ocak_Åžubat_Mart_Nisan_Mayıs_Haziran_Temmuz_AÄŸustos_Eylül_Ekim_Kasım_Aralık".split("_"),monthsShort:"Oca_Åžub_Mar_Nis_May_Haz_Tem_AÄŸu_Eyl_Eki_Kas_Ara".split("_"),weekdays:"Pazar_Pazartesi_Salı_ÇarÅŸamba_PerÅŸembe_Cuma_Cumartesi".split("_"),weekdaysShort:"Paz_Pts_Sal_Çar_Per_Cum_Cts".split("_"),weekdaysMin:"Pz_Pt_Sa_Ça_Pe_Cu_Ct".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[bugün saat] LT",nextDay:"[yarın saat] LT",nextWeek:"[haftaya] dddd [saat] LT",lastDay:"[dün] LT",lastWeek:"[geçen hafta] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s önce",s:"birkaç saniye",m:"bir dakika",mm:"%d dakika",h:"bir saat",hh:"%d saat",d:"bir gün",dd:"%d gün",M:"bir ay",MM:"%d ay",y:"bir yıl",yy:"%d yıl"},ordinalParse:/\d{1,2}'(inci|nci|üncü|ncı|uncu|ıncı)/,ordinal:function(a){if(0===a)return a+"'ıncı";var t=a%10,n=a%100-t,r=a>=100?100:null;return a+(e[t]||e[n]||e[r])},week:{dow:1,doy:7}});return t}(),e.fullCalendar.datepickerLocale("tr","tr",{closeText:"kapat",prevText:"&#x3C;geri",nextText:"ileri&#x3e",currentText:"bugün",monthNames:["Ocak","Åžubat","Mart","Nisan","Mayıs","Haziran","Temmuz","AÄŸustos","Eylül","Ekim","Kasım","Aralık"],monthNamesShort:["Oca","Åžub","Mar","Nis","May","Haz","Tem","AÄŸu","Eyl","Eki","Kas","Ara"],dayNames:["Pazar","Pazartesi","Salı","ÇarÅŸamba","PerÅŸembe","Cuma","Cumartesi"],dayNamesShort:["Pz","Pt","Sa","Ça","Pe","Cu","Ct"],dayNamesMin:["Pz","Pt","Sa","Ça","Pe","Cu","Ct"],weekHeader:"Hf",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("tr",{buttonText:{next:"ileri",month:"Ay",week:"Hafta",day:"Gün",list:"Ajanda"},allDayText:"Tüm gün",eventLimitText:"daha fazla",noEventsMessage:"Herhangi bir etkinlik görüntülemek için"})}(),function(){!function(){function e(e,a){var t=e.split("_");return a%10===1&&a%100!==11?t[0]:a%10>=2&&a%10<=4&&(a%100<10||a%100>=20)?t[1]:t[2]}function t(a,t,n){var r={mm:t?"хвилина_хвилини_хвилин":"хвилину_хвилини_хвилин",hh:t?"година_години_годин":"годину_години_годин",dd:"день_дні_днів",MM:"міÑÑць_міÑÑці_міÑÑців",yy:"рік_роки_років"};return"m"===n?t?"хвилина":"хвилину":"h"===n?t?"година":"годину":a+" "+e(r[n],+a)}function n(e,a){var t={nominative:"неділÑ_понеділок_вівторок_Ñереда_четвер_п’ÑтницÑ_Ñубота".split("_"),accusative:"неділю_понеділок_вівторок_Ñереду_четвер_п’Ñтницю_Ñуботу".split("_"),genitive:"неділі_понеділка_вівторка_Ñереди_четверга_п’Ñтниці_Ñуботи".split("_")},n=/(\[[ВвУу]\]) ?dddd/.test(a)?"accusative":/\[?(?:минулої|наÑтупної)? ?\] ?dddd/.test(a)?"genitive":"nominative";return t[n][e.day()]}function r(e){return function(){return e+"о"+(11===this.hours()?"б":"")+"] LT"}}var s=a.defineLocale("uk",{months:{format:"ÑічнÑ_лютого_березнÑ_квітнÑ_травнÑ_червнÑ_липнÑ_ÑерпнÑ_вереÑнÑ_жовтнÑ_лиÑтопада_груднÑ".split("_"),standalone:"Ñічень_лютий_березень_квітень_травень_червень_липень_Ñерпень_вереÑень_жовтень_лиÑтопад_грудень".split("_")},monthsShort:"Ñіч_лют_бер_квіт_трав_черв_лип_Ñерп_вер_жовт_лиÑÑ‚_груд".split("_"),weekdays:n,weekdaysShort:"нд_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),weekdaysMin:"нд_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY Ñ€.",LLL:"D MMMM YYYY Ñ€., HH:mm",LLLL:"dddd, D MMMM YYYY Ñ€., HH:mm"},calendar:{sameDay:r("[Сьогодні "),nextDay:r("[Завтра "),lastDay:r("[Вчора "),nextWeek:r("[У] dddd ["),lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return r("[Минулої] dddd [").call(this);case 1:case 2:case 4:return r("[Минулого] dddd [").call(this)}},sameElse:"L"},relativeTime:{future:"за %s",past:"%s тому",s:"декілька Ñекунд",m:t,mm:t,h:"годину",hh:t,d:"день",dd:t,M:"міÑÑць",MM:t,y:"рік",yy:t},meridiemParse:/ночі|ранку|днÑ|вечора/,isPM:function(e){return/^(днÑ|вечора)$/.test(e)},meridiem:function(e,a,t){return e<4?"ночі":e<12?"ранку":e<17?"днÑ":"вечора"},ordinalParse:/\d{1,2}-(й|го)/,ordinal:function(e,a){switch(a){case"M":case"d":case"DDD":case"w":case"W":return e+"-й";case"D":return e+"-го";default:return e}},week:{dow:1,doy:7}});return s}(),e.fullCalendar.datepickerLocale("uk","uk",{closeText:"Закрити",prevText:"&#x3C;",nextText:"&#x3E;",currentText:"Сьогодні",monthNames:["Січень","Лютий","Березень","Квітень","Травень","Червень","Липень","Серпень","ВереÑень","Жовтень","ЛиÑтопад","Грудень"],monthNamesShort:["Січ","Лют","Бер","Кві","Тра","Чер","Лип","Сер","Вер","Жов","ЛиÑ","Гру"],dayNames:["неділÑ","понеділок","вівторок","Ñереда","четвер","п’ÑтницÑ","Ñубота"],dayNamesShort:["нед","пнд","вів","Ñрд","чтв","птн","Ñбт"],dayNamesMin:["Ðд","Пн","Ð’Ñ‚","Ср","Чт","Пт","Сб"],weekHeader:"Тиж",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("uk",{buttonText:{month:"МіÑÑць",week:"Тиждень",day:"День",list:"ПорÑдок денний"},allDayText:"УвеÑÑŒ день",eventLimitText:function(e){return"+ще "+e+"..."},noEventsMessage:"Ðемає подій Ð´Ð»Ñ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ"})}(),function(){!function(){var e=a.defineLocale("vi",{months:"tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12".split("_"),monthsShort:"Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12".split("_"),monthsParseExact:!0,weekdays:"chủ nhật_thứ hai_thứ ba_thứ tÆ°_thứ năm_thứ sáu_thứ bảy".split("_"),weekdaysShort:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysMin:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysParseExact:!0,meridiemParse:/sa|ch/i,isPM:function(e){return/^ch$/i.test(e)},meridiem:function(e,a,t){return e<12?t?"sa":"SA":t?"ch":"CH"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [năm] YYYY",LLL:"D MMMM [năm] YYYY HH:mm",LLLL:"dddd, D MMMM [năm] YYYY HH:mm",l:"DD/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},calendar:{sameDay:"[Hôm nay lúc] LT",nextDay:"[Ngày mai lúc] LT",nextWeek:"dddd [tuần tá»›i lúc] LT",lastDay:"[Hôm qua lúc] LT",lastWeek:"dddd [tuần rồi lúc] LT",sameElse:"L"},relativeTime:{future:"%s tá»›i",past:"%s trÆ°á»›c",s:"vài giây",m:"má»™t phút",mm:"%d phút",h:"má»™t giá»",hh:"%d giá»",d:"má»™t ngày",dd:"%d ngày",M:"má»™t tháng",MM:"%d tháng",y:"má»™t năm",yy:"%d năm"},ordinalParse:/\d{1,2}/,ordinal:function(e){return e},week:{dow:1,doy:4}});return e}(),e.fullCalendar.datepickerLocale("vi","vi",{closeText:"Äóng",prevText:"&#x3C;TrÆ°á»›c",nextText:"Tiếp&#x3E;",currentText:"Hôm nay",monthNames:["Tháng Má»™t","Tháng Hai","Tháng Ba","Tháng TÆ°","Tháng Năm","Tháng Sáu","Tháng Bảy","Tháng Tám","Tháng Chín","Tháng MÆ°á»i","Tháng MÆ°á»i Má»™t","Tháng MÆ°á»i Hai"],monthNamesShort:["Tháng 1","Tháng 2","Tháng 3","Tháng 4","Tháng 5","Tháng 6","Tháng 7","Tháng 8","Tháng 9","Tháng 10","Tháng 11","Tháng 12"],dayNames:["Chủ Nhật","Thứ Hai","Thứ Ba","Thứ TÆ°","Thứ Năm","Thứ Sáu","Thứ Bảy"],dayNamesShort:["CN","T2","T3","T4","T5","T6","T7"],dayNamesMin:["CN","T2","T3","T4","T5","T6","T7"],weekHeader:"Tu",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("vi",{buttonText:{month:"Tháng",week:"Tuần",day:"Ngày",list:"Lịch biểu"},allDayText:"Cả ngày",eventLimitText:function(e){return"+ thêm "+e},noEventsMessage:"Không có sá»± kiện để hiển thị"})}(),function(){!function(){var e=a.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_七月_八月_ä¹æœˆ_å月_å一月_å二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"周日_周一_周二_周三_周四_周五_周六".split("_"),weekdaysMin:"æ—¥_一_二_三_å››_五_å…­".split("_"),longDateFormat:{LT:"Ah点mm分",LTS:"Ah点m分s秒",L:"YYYY-MM-DD",LL:"YYYYå¹´MMMDæ—¥",LLL:"YYYYå¹´MMMDæ—¥Ah点mm分",LLLL:"YYYYå¹´MMMDæ—¥ddddAh点mm分",l:"YYYY-MM-DD",ll:"YYYYå¹´MMMDæ—¥",lll:"YYYYå¹´MMMDæ—¥Ah点mm分",llll:"YYYYå¹´MMMDæ—¥ddddAh点mm分"},meridiemParse:/凌晨|早上|上åˆ|中åˆ|下åˆ|晚上/,meridiemHour:function(e,a){return 12===e&&(e=0),"凌晨"===a||"早上"===a||"上åˆ"===a?e:"下åˆ"===a||"晚上"===a?e+12:e>=11?e:e+12},meridiem:function(e,a,t){var n=100*e+a;return n<600?"凌晨":n<900?"早上":n<1130?"上åˆ":n<1230?"中åˆ":n<1800?"下åˆ":"晚上"},calendar:{sameDay:function(){return 0===this.minutes()?"[今天]Ah[点整]":"[今天]LT"},nextDay:function(){return 0===this.minutes()?"[明天]Ah[点整]":"[明天]LT"},lastDay:function(){return 0===this.minutes()?"[昨天]Ah[点整]":"[昨天]LT"},nextWeek:function(){var e,t;return e=a().startOf("week"),t=this.diff(e,"days")>=7?"[下]":"[本]",0===this.minutes()?t+"dddAh点整":t+"dddAh点mm"},lastWeek:function(){var e,t;return e=a().startOf("week"),t=this.unix()<e.unix()?"[上]":"[本]",0===this.minutes()?t+"dddAh点整":t+"dddAh点mm"},sameElse:"LL"},ordinalParse:/\d{1,2}(æ—¥|月|周)/,ordinal:function(e,a){switch(a){case"d":case"D":case"DDD":return e+"æ—¥";case"M":return e+"月";case"w":case"W":return e+"周";default:return e}},relativeTime:{future:"%s内",past:"%så‰",s:"几秒",m:"1 分钟",mm:"%d 分钟",h:"1 å°æ—¶",hh:"%d å°æ—¶",d:"1 天",dd:"%d 天",M:"1 个月",MM:"%d 个月",y:"1 å¹´",yy:"%d å¹´"},week:{dow:1,doy:4}});return e}(),e.fullCalendar.datepickerLocale("zh-cn","zh-CN",{closeText:"关闭",prevText:"&#x3C;上月",nextText:"下月&#x3E;",currentText:"今天",monthNames:["一月","二月","三月","四月","五月","六月","七月","八月","ä¹æœˆ","å月","å一月","å二月"],monthNamesShort:["一月","二月","三月","四月","五月","六月","七月","八月","ä¹æœˆ","å月","å一月","å二月"],dayNames:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],dayNamesShort:["周日","周一","周二","周三","周四","周五","周六"],dayNamesMin:["æ—¥","一","二","三","å››","五","å…­"],weekHeader:"周",dateFormat:"yy-mm-dd",firstDay:1,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"å¹´"}),e.fullCalendar.locale("zh-cn",{buttonText:{month:"月",week:"周",day:"æ—¥",list:"日程"},allDayText:"全天",eventLimitText:function(e){return"å¦å¤– "+e+" 个"},noEventsMessage:"没有事件显示"})}(),function(){!function(){var e=a.defineLocale("zh-tw",{months:"一月_二月_三月_四月_五月_六月_七月_八月_ä¹æœˆ_å月_å一月_å二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"週日_週一_週二_週三_週四_週五_週六".split("_"),weekdaysMin:"æ—¥_一_二_三_å››_五_å…­".split("_"),longDateFormat:{LT:"Ah點mm分",LTS:"Ah點m分s秒",L:"YYYYå¹´MMMDæ—¥",LL:"YYYYå¹´MMMDæ—¥",LLL:"YYYYå¹´MMMDæ—¥Ah點mm分",LLLL:"YYYYå¹´MMMDæ—¥ddddAh點mm分",l:"YYYYå¹´MMMDæ—¥",ll:"YYYYå¹´MMMDæ—¥",lll:"YYYYå¹´MMMDæ—¥Ah點mm分",llll:"YYYYå¹´MMMDæ—¥ddddAh點mm分"},meridiemParse:/凌晨|早上|上åˆ|中åˆ|下åˆ|晚上/,meridiemHour:function(e,a){return 12===e&&(e=0),"凌晨"===a||"早上"===a||"上åˆ"===a?e:"中åˆ"===a?e>=11?e:e+12:"下åˆ"===a||"晚上"===a?e+12:void 0},meridiem:function(e,a,t){var n=100*e+a;return n<600?"凌晨":n<900?"早上":n<1130?"上åˆ":n<1230?"中åˆ":n<1800?"下åˆ":"晚上"},calendar:{sameDay:"[今天]LT",nextDay:"[明天]LT",nextWeek:"[下]ddddLT",lastDay:"[昨天]LT",lastWeek:"[上]ddddLT",sameElse:"L"},ordinalParse:/\d{1,2}(æ—¥|月|週)/,ordinal:function(e,a){switch(a){case"d":case"D":case"DDD":return e+"æ—¥";case"M":return e+"月";case"w":case"W":return e+"週";default:return e}},relativeTime:{future:"%så…§",past:"%så‰",s:"幾秒",m:"1 分é˜",mm:"%d 分é˜",h:"1 å°æ™‚",hh:"%d å°æ™‚",d:"1 天",dd:"%d 天",M:"1 個月",MM:"%d 個月",y:"1 å¹´",yy:"%d å¹´"}});return e}(),e.fullCalendar.datepickerLocale("zh-tw","zh-TW",{closeText:"關閉",prevText:"&#x3C;上月",nextText:"下月&#x3E;",currentText:"今天",monthNames:["一月","二月","三月","四月","五月","六月","七月","八月","ä¹æœˆ","å月","å一月","å二月"],monthNamesShort:["一月","二月","三月","四月","五月","六月","七月","八月","ä¹æœˆ","å月","å一月","å二月"],dayNames:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],dayNamesShort:["周日","周一","周二","周三","周四","周五","周六"],dayNamesMin:["æ—¥","一","二","三","å››","五","å…­"],weekHeader:"周",dateFormat:"yy/mm/dd",firstDay:1,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"å¹´"}),e.fullCalendar.locale("zh-tw",{buttonText:{month:"月",week:"週",day:"天",list:"待辦事項"},allDayText:"全天",eventLimitText:"更多",noEventsMessage:"没有事件显示"})}(),a.locale("en"),e.fullCalendar.locale("en"),e.datepicker&&e.datepicker.setDefaults(e.datepicker.regional[""])}); \ No newline at end of file
+dow:1,doy:4}});return e}(),e.fullCalendar.datepickerLocale("en-au","en-AU",{closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("en-au")}(),function(){!function(){var e=a.defineLocale("en-ca",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"YYYY-MM-DD",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var a=e%10,t=1===~~(e%100/10)?"th":1===a?"st":2===a?"nd":3===a?"rd":"th";return e+t}});return e}(),e.fullCalendar.locale("en-ca")}(),function(){!function(){var e=a.defineLocale("en-gb",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var a=e%10,t=1===~~(e%100/10)?"th":1===a?"st":2===a?"nd":3===a?"rd":"th";return e+t},week:{dow:1,doy:4}});return e}(),e.fullCalendar.datepickerLocale("en-gb","en-GB",{closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("en-gb")}(),function(){!function(){var e=a.defineLocale("en-ie",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var a=e%10,t=1===~~(e%100/10)?"th":1===a?"st":2===a?"nd":3===a?"rd":"th";return e+t},week:{dow:1,doy:4}});return e}(),e.fullCalendar.locale("en-ie")}(),function(){!function(){var e=a.defineLocale("en-nz",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var a=e%10,t=1===~~(e%100/10)?"th":1===a?"st":2===a?"nd":3===a?"rd":"th";return e+t},week:{dow:1,doy:4}});return e}(),e.fullCalendar.datepickerLocale("en-nz","en-NZ",{closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("en-nz")}(),function(){!function(){var e="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),t="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),n=a.defineLocale("es",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(a,n){return/-MMM-/.test(n)?t[a.month()]:e[a.month()]},monthsParseExact:!0,weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[mañana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}});return n}(),e.fullCalendar.datepickerLocale("es","es",{closeText:"Cerrar",prevText:"&#x3C;Ant",nextText:"Sig&#x3E;",currentText:"Hoy",monthNames:["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],monthNamesShort:["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"],dayNames:["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],dayNamesShort:["dom","lun","mar","mié","jue","vie","sáb"],dayNamesMin:["D","L","M","X","J","V","S"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("es",{buttonText:{month:"Mes",week:"Semana",day:"Día",list:"Agenda"},allDayHtml:"Todo<br/>el día",eventLimitText:"más",noEventsMessage:"No hay eventos para mostrar"})}(),function(){!function(){var e="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),t="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),n=a.defineLocale("es-do",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(a,n){return/-MMM-/.test(n)?t[a.month()]:e[a.month()]},monthsParseExact:!0,weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY h:mm A",LLLL:"dddd, D [de] MMMM [de] YYYY h:mm A"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[mañana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}});return n}(),e.fullCalendar.datepickerLocale("es-do","es",{closeText:"Cerrar",prevText:"&#x3C;Ant",nextText:"Sig&#x3E;",currentText:"Hoy",monthNames:["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],monthNamesShort:["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"],dayNames:["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],dayNamesShort:["dom","lun","mar","mié","jue","vie","sáb"],dayNamesMin:["D","L","M","X","J","V","S"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("es-do",{buttonText:{month:"Mes",week:"Semana",day:"Día",list:"Agenda"},allDayHtml:"Todo<br/>el día",eventLimitText:"más",noEventsMessage:"No hay eventos para mostrar"})}(),function(){!function(){var e=a.defineLocale("eu",{months:"urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua".split("_"),monthsShort:"urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.".split("_"),monthsParseExact:!0,weekdays:"igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata".split("_"),weekdaysShort:"ig._al._ar._az._og._ol._lr.".split("_"),weekdaysMin:"ig_al_ar_az_og_ol_lr".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY[ko] MMMM[ren] D[a]",LLL:"YYYY[ko] MMMM[ren] D[a] HH:mm",LLLL:"dddd, YYYY[ko] MMMM[ren] D[a] HH:mm",l:"YYYY-M-D",ll:"YYYY[ko] MMM D[a]",lll:"YYYY[ko] MMM D[a] HH:mm",llll:"ddd, YYYY[ko] MMM D[a] HH:mm"},calendar:{sameDay:"[gaur] LT[etan]",nextDay:"[bihar] LT[etan]",nextWeek:"dddd LT[etan]",lastDay:"[atzo] LT[etan]",lastWeek:"[aurreko] dddd LT[etan]",sameElse:"L"},relativeTime:{future:"%s barru",past:"duela %s",s:"segundo batzuk",m:"minutu bat",mm:"%d minutu",h:"ordu bat",hh:"%d ordu",d:"egun bat",dd:"%d egun",M:"hilabete bat",MM:"%d hilabete",y:"urte bat",yy:"%d urte"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}});return e}(),e.fullCalendar.datepickerLocale("eu","eu",{closeText:"Egina",prevText:"&#x3C;Aur",nextText:"Hur&#x3E;",currentText:"Gaur",monthNames:["urtarrila","otsaila","martxoa","apirila","maiatza","ekaina","uztaila","abuztua","iraila","urria","azaroa","abendua"],monthNamesShort:["urt.","ots.","mar.","api.","mai.","eka.","uzt.","abu.","ira.","urr.","aza.","abe."],dayNames:["igandea","astelehena","asteartea","asteazkena","osteguna","ostirala","larunbata"],dayNamesShort:["ig.","al.","ar.","az.","og.","ol.","lr."],dayNamesMin:["ig","al","ar","az","og","ol","lr"],weekHeader:"As",dateFormat:"yy-mm-dd",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("eu",{buttonText:{month:"Hilabetea",week:"Astea",day:"Eguna",list:"Agenda"},allDayHtml:"Egun<br/>osoa",eventLimitText:"gehiago",noEventsMessage:"Ez dago ekitaldirik erakusteko"})}(),function(){!function(){var e={1:"Û±",2:"Û²",3:"Û³",4:"Û´",5:"Ûµ",6:"Û¶",7:"Û·",8:"Û¸",9:"Û¹",0:"Û°"},t={"Û±":"1","Û²":"2","Û³":"3","Û´":"4","Ûµ":"5","Û¶":"6","Û·":"7","Û¸":"8","Û¹":"9","Û°":"0"},n=a.defineLocale("fa",{months:"ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),monthsShort:"ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),weekdays:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysShort:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysMin:"ÛŒ_د_س_Ú†_Ù¾_ج_Ø´".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},meridiemParse:/قبل از ظهر|بعد از ظهر/,isPM:function(e){return/بعد از ظهر/.test(e)},meridiem:function(e,a,t){return e<12?"قبل از ظهر":"بعد از ظهر"},calendar:{sameDay:"[امروز ساعت] LT",nextDay:"[Ùردا ساعت] LT",nextWeek:"dddd [ساعت] LT",lastDay:"[دیروز ساعت] LT",lastWeek:"dddd [پیش] [ساعت] LT",sameElse:"L"},relativeTime:{future:"در %s",past:"%s پیش",s:"چندین ثانیه",m:"یک دقیقه",mm:"%d دقیقه",h:"یک ساعت",hh:"%d ساعت",d:"یک روز",dd:"%d روز",M:"یک ماه",MM:"%d ماه",y:"یک سال",yy:"%d سال"},preparse:function(e){return e.replace(/[Û°-Û¹]/g,function(e){return t[e]}).replace(/ØŒ/g,",")},postformat:function(a){return a.replace(/\d/g,function(a){return e[a]}).replace(/,/g,"ØŒ")},ordinalParse:/\d{1,2}Ù…/,ordinal:"%dÙ…",week:{dow:6,doy:12}});return n}(),e.fullCalendar.datepickerLocale("fa","fa",{closeText:"بستن",prevText:"&#x3C;قبلی",nextText:"بعدی&#x3E;",currentText:"امروز",monthNames:["ژانویه","Ùوریه","مارس","آوریل","مه","ژوئن","ژوئیه","اوت","سپتامبر","اکتبر","نوامبر","دسامبر"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["يکشنبه","دوشنبه","سه‌شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],dayNamesShort:["ÛŒ","د","س","Ú†","Ù¾","ج","Ø´"],dayNamesMin:["ÛŒ","د","س","Ú†","Ù¾","ج","Ø´"],weekHeader:"Ù‡Ù",dateFormat:"yy/mm/dd",firstDay:6,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("fa",{buttonText:{month:"ماه",week:"Ù‡Ùته",day:"روز",list:"برنامه"},allDayText:"تمام روز",eventLimitText:function(e){return"بیش از "+e},noEventsMessage:"هیچ رویدادی به نمایش"})}(),function(){!function(){function e(e,a,n,r){var s="";switch(n){case"s":return r?"muutaman sekunnin":"muutama sekunti";case"m":return r?"minuutin":"minuutti";case"mm":s=r?"minuutin":"minuuttia";break;case"h":return r?"tunnin":"tunti";case"hh":s=r?"tunnin":"tuntia";break;case"d":return r?"päivän":"päivä";case"dd":s=r?"päivän":"päivää";break;case"M":return r?"kuukauden":"kuukausi";case"MM":s=r?"kuukauden":"kuukautta";break;case"y":return r?"vuoden":"vuosi";case"yy":s=r?"vuoden":"vuotta"}return s=t(e,r)+" "+s}function t(e,a){return e<10?a?r[e]:n[e]:e}var n="nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän".split(" "),r=["nolla","yhden","kahden","kolmen","neljän","viiden","kuuden",n[7],n[8],n[9]],s=a.defineLocale("fi",{months:"tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"),monthsShort:"tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu".split("_"),weekdays:"sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai".split("_"),weekdaysShort:"su_ma_ti_ke_to_pe_la".split("_"),weekdaysMin:"su_ma_ti_ke_to_pe_la".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"Do MMMM[ta] YYYY",LLL:"Do MMMM[ta] YYYY, [klo] HH.mm",LLLL:"dddd, Do MMMM[ta] YYYY, [klo] HH.mm",l:"D.M.YYYY",ll:"Do MMM YYYY",lll:"Do MMM YYYY, [klo] HH.mm",llll:"ddd, Do MMM YYYY, [klo] HH.mm"},calendar:{sameDay:"[tänään] [klo] LT",nextDay:"[huomenna] [klo] LT",nextWeek:"dddd [klo] LT",lastDay:"[eilen] [klo] LT",lastWeek:"[viime] dddd[na] [klo] LT",sameElse:"L"},relativeTime:{future:"%s päästä",past:"%s sitten",s:e,m:e,mm:e,h:e,hh:e,d:e,dd:e,M:e,MM:e,y:e,yy:e},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return s}(),e.fullCalendar.datepickerLocale("fi","fi",{closeText:"Sulje",prevText:"&#xAB;Edellinen",nextText:"Seuraava&#xBB;",currentText:"Tänään",monthNames:["Tammikuu","Helmikuu","Maaliskuu","Huhtikuu","Toukokuu","Kesäkuu","Heinäkuu","Elokuu","Syyskuu","Lokakuu","Marraskuu","Joulukuu"],monthNamesShort:["Tammi","Helmi","Maalis","Huhti","Touko","Kesä","Heinä","Elo","Syys","Loka","Marras","Joulu"],dayNamesShort:["Su","Ma","Ti","Ke","To","Pe","La"],dayNames:["Sunnuntai","Maanantai","Tiistai","Keskiviikko","Torstai","Perjantai","Lauantai"],dayNamesMin:["Su","Ma","Ti","Ke","To","Pe","La"],weekHeader:"Vk",dateFormat:"d.m.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("fi",{buttonText:{month:"Kuukausi",week:"Viikko",day:"Päivä",list:"Tapahtumat"},allDayText:"Koko päivä",eventLimitText:"lisää",noEventsMessage:"Ei näytettäviä tapahtumia"})}(),function(){!function(){var e=a.defineLocale("fr",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd'hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinalParse:/\d{1,2}(er|)/,ordinal:function(e){return e+(1===e?"er":"")},week:{dow:1,doy:4}});return e}(),e.fullCalendar.datepickerLocale("fr","fr",{closeText:"Fermer",prevText:"Précédent",nextText:"Suivant",currentText:"Aujourd'hui",monthNames:["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],monthNamesShort:["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],dayNames:["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],dayNamesShort:["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],dayNamesMin:["D","L","M","M","J","V","S"],weekHeader:"Sem.",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("fr",{buttonText:{year:"Année",month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},allDayHtml:"Toute la<br/>journée",eventLimitText:"en plus",noEventsMessage:"Aucun événement à afficher"})}(),function(){!function(){var e=a.defineLocale("fr-ca",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd'hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinalParse:/\d{1,2}(er|e)/,ordinal:function(e){return e+(1===e?"er":"e")}});return e}(),e.fullCalendar.datepickerLocale("fr-ca","fr-CA",{closeText:"Fermer",prevText:"Précédent",nextText:"Suivant",currentText:"Aujourd'hui",monthNames:["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],monthNamesShort:["janv.","févr.","mars","avril","mai","juin","juil.","août","sept.","oct.","nov.","déc."],dayNames:["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],dayNamesShort:["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],dayNamesMin:["D","L","M","M","J","V","S"],weekHeader:"Sem.",dateFormat:"yy-mm-dd",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("fr-ca",{buttonText:{year:"Année",month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},allDayHtml:"Toute la<br/>journée",eventLimitText:"en plus",noEventsMessage:"Aucun événement à afficher"})}(),function(){!function(){var e=a.defineLocale("fr-ch",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd'hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinalParse:/\d{1,2}(er|e)/,ordinal:function(e){return e+(1===e?"er":"e")},week:{dow:1,doy:4}});return e}(),e.fullCalendar.datepickerLocale("fr-ch","fr-CH",{closeText:"Fermer",prevText:"&#x3C;Préc",nextText:"Suiv&#x3E;",currentText:"Courant",monthNames:["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],monthNamesShort:["janv.","févr.","mars","avril","mai","juin","juil.","août","sept.","oct.","nov.","déc."],dayNames:["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],dayNamesShort:["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],dayNamesMin:["D","L","M","M","J","V","S"],weekHeader:"Sm",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("fr-ch",{buttonText:{year:"Année",month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},allDayHtml:"Toute la<br/>journée",eventLimitText:"en plus",noEventsMessage:"Aucun événement à afficher"})}(),function(){!function(){var e=a.defineLocale("gl",{months:"xaneiro_febreiro_marzo_abril_maio_xuño_xullo_agosto_setembro_outubro_novembro_decembro".split("_"),monthsShort:"xan._feb._mar._abr._mai._xuñ._xul._ago._set._out._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"domingo_luns_martes_mércores_xoves_venres_sábado".split("_"),weekdaysShort:"dom._lun._mar._mér._xov._ven._sáb.".split("_"),weekdaysMin:"do_lu_ma_mé_xo_ve_sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoxe "+(1!==this.hours()?"ás":"á")+"] LT"},nextDay:function(){return"[mañá "+(1!==this.hours()?"ás":"á")+"] LT"},nextWeek:function(){return"dddd ["+(1!==this.hours()?"ás":"a")+"] LT"},lastDay:function(){return"[onte "+(1!==this.hours()?"á":"a")+"] LT"},lastWeek:function(){return"[o] dddd [pasado "+(1!==this.hours()?"ás":"a")+"] LT"},sameElse:"L"},relativeTime:{future:function(e){return 0===e.indexOf("un")?"n"+e:"en "+e},past:"hai %s",s:"uns segundos",m:"un minuto",mm:"%d minutos",h:"unha hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un ano",yy:"%d anos"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}});return e}(),e.fullCalendar.datepickerLocale("gl","gl",{closeText:"Pechar",prevText:"&#x3C;Ant",nextText:"Seg&#x3E;",currentText:"Hoxe",monthNames:["Xaneiro","Febreiro","Marzo","Abril","Maio","Xuño","Xullo","Agosto","Setembro","Outubro","Novembro","Decembro"],monthNamesShort:["Xan","Feb","Mar","Abr","Mai","Xuñ","Xul","Ago","Set","Out","Nov","Dec"],dayNames:["Domingo","Luns","Martes","Mércores","Xoves","Venres","Sábado"],dayNamesShort:["Dom","Lun","Mar","Mér","Xov","Ven","Sáb"],dayNamesMin:["Do","Lu","Ma","Mé","Xo","Ve","Sá"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("gl",{buttonText:{month:"Mes",week:"Semana",day:"Día",list:"Axenda"},allDayHtml:"Todo<br/>o día",eventLimitText:"máis",noEventsMessage:"Non hai eventos para amosar"})}(),function(){!function(){var e=a.defineLocale("he",{months:"ינו×ר_פברו×ר_מרץ_×פריל_מ××™_יוני_יולי_×וגוסט_ספטמבר_×וקטובר_נובמבר_דצמבר".split("_"),monthsShort:"ינו׳_פבר׳_מרץ_×פר׳_מ××™_יוני_יולי_×וג׳_ספט׳_×וק׳_נוב׳_דצמ׳".split("_"),weekdays:"ר×שון_שני_שלישי_רביעי_חמישי_שישי_שבת".split("_"),weekdaysShort:"×׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳".split("_"),weekdaysMin:"×_ב_×’_ד_×”_ו_ש".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [ב]MMMM YYYY",LLL:"D [ב]MMMM YYYY HH:mm",LLLL:"dddd, D [ב]MMMM YYYY HH:mm",l:"D/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},calendar:{sameDay:"[×”×™×•× ×‘Ö¾]LT",nextDay:"[מחר ב־]LT",nextWeek:"dddd [בשעה] LT",lastDay:"[×תמול ב־]LT",lastWeek:"[ביו×] dddd [×”×חרון בשעה] LT",sameElse:"L"},relativeTime:{future:"בעוד %s",past:"לפני %s",s:"מספר שניות",m:"דקה",mm:"%d דקות",h:"שעה",hh:function(e){return 2===e?"שעתיי×":e+" שעות"},d:"יו×",dd:function(e){return 2===e?"יומיי×":e+" ימי×"},M:"חודש",MM:function(e){return 2===e?"חודשיי×":e+" חודשי×"},y:"שנה",yy:function(e){return 2===e?"שנתיי×":e%10===0&&10!==e?e+" שנה":e+" שני×"}},meridiemParse:/××—×”"צ|לפנה"צ|×חרי הצהריי×|לפני הצהריי×|לפנות בוקר|בבוקר|בערב/i,isPM:function(e){return/^(××—×”"צ|×חרי הצהריי×|בערב)$/.test(e)},meridiem:function(e,a,t){return e<5?"לפנות בוקר":e<10?"בבוקר":e<12?t?'לפנה"צ':"לפני הצהריי×":e<18?t?'××—×”"צ':"×חרי הצהריי×":"בערב"}});return e}(),e.fullCalendar.datepickerLocale("he","he",{closeText:"סגור",prevText:"&#x3C;הקוד×",nextText:"הב×&#x3E;",currentText:"היו×",monthNames:["ינו×ר","פברו×ר","מרץ","×פריל","מ××™","יוני","יולי","×וגוסט","ספטמבר","×וקטובר","נובמבר","דצמבר"],monthNamesShort:["ינו","פבר","מרץ","×פר","מ××™","יוני","יולי","×וג","ספט","×וק","נוב","דצמ"],dayNames:["ר×שון","שני","שלישי","רביעי","חמישי","שישי","שבת"],dayNamesShort:["×'","ב'","×’'","ד'","×”'","ו'","שבת"],dayNamesMin:["×'","ב'","×’'","ד'","×”'","ו'","שבת"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("he",{buttonText:{month:"חודש",week:"שבוע",day:"יו×",list:"סדר יו×"},allDayText:"כל היו×",eventLimitText:"×חר",noEventsMessage:"×ין ××™×¨×•×¢×™× ×œ×”×¦×’×”",weekNumberTitle:"שבוע"})}(),function(){!function(){var e={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},t={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"},n=a.defineLocale("hi",{months:"जनवरी_फ़रवरी_मारà¥à¤š_अपà¥à¤°à¥ˆà¤²_मई_जून_जà¥à¤²à¤¾à¤ˆ_अगसà¥à¤¤_सितमà¥à¤¬à¤°_अकà¥à¤Ÿà¥‚बर_नवमà¥à¤¬à¤°_दिसमà¥à¤¬à¤°".split("_"),monthsShort:"जन._फ़र._मारà¥à¤š_अपà¥à¤°à¥ˆ._मई_जून_जà¥à¤²._अग._सित._अकà¥à¤Ÿà¥‚._नव._दिस.".split("_"),monthsParseExact:!0,weekdays:"रविवार_सोमवार_मंगलवार_बà¥à¤§à¤µà¤¾à¤°_गà¥à¤°à¥‚वार_शà¥à¤•à¥à¤°à¤µà¤¾à¤°_शनिवार".split("_"),weekdaysShort:"रवि_सोम_मंगल_बà¥à¤§_गà¥à¤°à¥‚_शà¥à¤•à¥à¤°_शनि".split("_"),weekdaysMin:"र_सो_मं_बà¥_गà¥_शà¥_श".split("_"),longDateFormat:{LT:"A h:mm बजे",LTS:"A h:mm:ss बजे",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm बजे",LLLL:"dddd, D MMMM YYYY, A h:mm बजे"},calendar:{sameDay:"[आज] LT",nextDay:"[कल] LT",nextWeek:"dddd, LT",lastDay:"[कल] LT",lastWeek:"[पिछले] dddd, LT",sameElse:"L"},relativeTime:{future:"%s में",past:"%s पहले",s:"कà¥à¤› ही कà¥à¤·à¤£",m:"à¤à¤• मिनट",mm:"%d मिनट",h:"à¤à¤• घंटा",hh:"%d घंटे",d:"à¤à¤• दिन",dd:"%d दिन",M:"à¤à¤• महीने",MM:"%d महीने",y:"à¤à¤• वरà¥à¤·",yy:"%d वरà¥à¤·"},preparse:function(e){return e.replace(/[१२३४५६७८९०]/g,function(e){return t[e]})},postformat:function(a){return a.replace(/\d/g,function(a){return e[a]})},meridiemParse:/रात|सà¥à¤¬à¤¹|दोपहर|शाम/,meridiemHour:function(e,a){return 12===e&&(e=0),"रात"===a?e<4?e:e+12:"सà¥à¤¬à¤¹"===a?e:"दोपहर"===a?e>=10?e:e+12:"शाम"===a?e+12:void 0},meridiem:function(e,a,t){return e<4?"रात":e<10?"सà¥à¤¬à¤¹":e<17?"दोपहर":e<20?"शाम":"रात"},week:{dow:0,doy:6}});return n}(),e.fullCalendar.datepickerLocale("hi","hi",{closeText:"बंद",prevText:"पिछला",nextText:"अगला",currentText:"आज",monthNames:["जनवरी ","फरवरी","मारà¥à¤š","अपà¥à¤°à¥‡à¤²","मई","जून","जूलाई","अगसà¥à¤¤ ","सितमà¥à¤¬à¤°","अकà¥à¤Ÿà¥‚बर","नवमà¥à¤¬à¤°","दिसमà¥à¤¬à¤°"],monthNamesShort:["जन","फर","मारà¥à¤š","अपà¥à¤°à¥‡à¤²","मई","जून","जूलाई","अग","सित","अकà¥à¤Ÿ","नव","दि"],dayNames:["रविवार","सोमवार","मंगलवार","बà¥à¤§à¤µà¤¾à¤°","गà¥à¤°à¥à¤µà¤¾à¤°","शà¥à¤•à¥à¤°à¤µà¤¾à¤°","शनिवार"],dayNamesShort:["रवि","सोम","मंगल","बà¥à¤§","गà¥à¤°à¥","शà¥à¤•à¥à¤°","शनि"],dayNamesMin:["रवि","सोम","मंगल","बà¥à¤§","गà¥à¤°à¥","शà¥à¤•à¥à¤°","शनि"],weekHeader:"हफà¥à¤¤à¤¾",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("hi",{buttonText:{month:"महीना",week:"सपà¥à¤¤à¤¾à¤¹",day:"दिन",list:"कारà¥à¤¯à¤¸à¥‚ची"},allDayText:"सभी दिन",eventLimitText:function(e){return"+अधिक "+e},noEventsMessage:"कोई घटनाओं को पà¥à¤°à¤¦à¤°à¥à¤¶à¤¿à¤¤ करने के लिà¤"})}(),function(){!function(){function e(e,a,t){var n=e+" ";switch(t){case"m":return a?"jedna minuta":"jedne minute";case"mm":return n+=1===e?"minuta":2===e||3===e||4===e?"minute":"minuta";case"h":return a?"jedan sat":"jednog sata";case"hh":return n+=1===e?"sat":2===e||3===e||4===e?"sata":"sati";case"dd":return n+=1===e?"dan":"dana";case"MM":return n+=1===e?"mjesec":2===e||3===e||4===e?"mjeseca":"mjeseci";case"yy":return n+=1===e?"godina":2===e||3===e||4===e?"godine":"godina"}}var t=a.defineLocale("hr",{months:{format:"sijeÄnja_veljaÄe_ožujka_travnja_svibnja_lipnja_srpnja_kolovoza_rujna_listopada_studenoga_prosinca".split("_"),standalone:"sijeÄanj_veljaÄa_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac".split("_")},monthsShort:"sij._velj._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_Äetvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._Äet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_Äe_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[juÄer u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[proÅ¡lu] dddd [u] LT";case 6:return"[proÅ¡le] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[proÅ¡li] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",m:e,mm:e,h:e,hh:e,d:"dan",dd:e,M:"mjesec",MM:e,y:"godinu",yy:e},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}});return t}(),e.fullCalendar.datepickerLocale("hr","hr",{closeText:"Zatvori",prevText:"&#x3C;",nextText:"&#x3E;",currentText:"Danas",monthNames:["SijeÄanj","VeljaÄa","Ožujak","Travanj","Svibanj","Lipanj","Srpanj","Kolovoz","Rujan","Listopad","Studeni","Prosinac"],
+monthNamesShort:["Sij","Velj","Ožu","Tra","Svi","Lip","Srp","Kol","Ruj","Lis","Stu","Pro"],dayNames:["Nedjelja","Ponedjeljak","Utorak","Srijeda","ÄŒetvrtak","Petak","Subota"],dayNamesShort:["Ned","Pon","Uto","Sri","ÄŒet","Pet","Sub"],dayNamesMin:["Ne","Po","Ut","Sr","ÄŒe","Pe","Su"],weekHeader:"Tje",dateFormat:"dd.mm.yy.",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("hr",{buttonText:{prev:"PrijaÅ¡nji",next:"Sljedeći",month:"Mjesec",week:"Tjedan",day:"Dan",list:"Raspored"},allDayText:"Cijeli dan",eventLimitText:function(e){return"+ joÅ¡ "+e},noEventsMessage:"Nema dogaÄ‘aja za prikaz"})}(),function(){!function(){function e(e,a,t,n){var r=e;switch(t){case"s":return n||a?"néhány másodperc":"néhány másodperce";case"m":return"egy"+(n||a?" perc":" perce");case"mm":return r+(n||a?" perc":" perce");case"h":return"egy"+(n||a?" óra":" órája");case"hh":return r+(n||a?" óra":" órája");case"d":return"egy"+(n||a?" nap":" napja");case"dd":return r+(n||a?" nap":" napja");case"M":return"egy"+(n||a?" hónap":" hónapja");case"MM":return r+(n||a?" hónap":" hónapja");case"y":return"egy"+(n||a?" év":" éve");case"yy":return r+(n||a?" év":" éve")}return""}function t(e){return(e?"":"[múlt] ")+"["+n[this.day()]+"] LT[-kor]"}var n="vasárnap hétfÅ‘n kedden szerdán csütörtökön pénteken szombaton".split(" "),r=a.defineLocale("hu",{months:"január_február_március_április_május_június_július_augusztus_szeptember_október_november_december".split("_"),monthsShort:"jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec".split("_"),weekdays:"vasárnap_hétfÅ‘_kedd_szerda_csütörtök_péntek_szombat".split("_"),weekdaysShort:"vas_hét_kedd_sze_csüt_pén_szo".split("_"),weekdaysMin:"v_h_k_sze_cs_p_szo".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"YYYY.MM.DD.",LL:"YYYY. MMMM D.",LLL:"YYYY. MMMM D. H:mm",LLLL:"YYYY. MMMM D., dddd H:mm"},meridiemParse:/de|du/i,isPM:function(e){return"u"===e.charAt(1).toLowerCase()},meridiem:function(e,a,t){return e<12?t===!0?"de":"DE":t===!0?"du":"DU"},calendar:{sameDay:"[ma] LT[-kor]",nextDay:"[holnap] LT[-kor]",nextWeek:function(){return t.call(this,!0)},lastDay:"[tegnap] LT[-kor]",lastWeek:function(){return t.call(this,!1)},sameElse:"L"},relativeTime:{future:"%s múlva",past:"%s",s:e,m:e,mm:e,h:e,hh:e,d:e,dd:e,M:e,MM:e,y:e,yy:e},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return r}(),e.fullCalendar.datepickerLocale("hu","hu",{closeText:"bezár",prevText:"vissza",nextText:"elÅ‘re",currentText:"ma",monthNames:["Január","Február","Március","Ãprilis","Május","Június","Július","Augusztus","Szeptember","Október","November","December"],monthNamesShort:["Jan","Feb","Már","Ãpr","Máj","Jún","Júl","Aug","Szep","Okt","Nov","Dec"],dayNames:["Vasárnap","HétfÅ‘","Kedd","Szerda","Csütörtök","Péntek","Szombat"],dayNamesShort:["Vas","Hét","Ked","Sze","Csü","Pén","Szo"],dayNamesMin:["V","H","K","Sze","Cs","P","Szo"],weekHeader:"Hét",dateFormat:"yy.mm.dd.",firstDay:1,isRTL:!1,showMonthAfterYear:!0,yearSuffix:""}),e.fullCalendar.locale("hu",{buttonText:{month:"Hónap",week:"Hét",day:"Nap",list:"Napló"},allDayText:"Egész nap",eventLimitText:"további",noEventsMessage:"Nincs megjeleníthetÅ‘ események"})}(),function(){!function(){var e=a.defineLocale("id",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nov_Des".split("_"),weekdays:"Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu".split("_"),weekdaysShort:"Min_Sen_Sel_Rab_Kam_Jum_Sab".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|siang|sore|malam/,meridiemHour:function(e,a){return 12===e&&(e=0),"pagi"===a?e:"siang"===a?e>=11?e:e+12:"sore"===a||"malam"===a?e+12:void 0},meridiem:function(e,a,t){return e<11?"pagi":e<15?"siang":e<19?"sore":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Besok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kemarin pukul] LT",lastWeek:"dddd [lalu pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lalu",s:"beberapa detik",m:"semenit",mm:"%d menit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}});return e}(),e.fullCalendar.datepickerLocale("id","id",{closeText:"Tutup",prevText:"&#x3C;mundur",nextText:"maju&#x3E;",currentText:"hari ini",monthNames:["Januari","Februari","Maret","April","Mei","Juni","Juli","Agustus","September","Oktober","Nopember","Desember"],monthNamesShort:["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Agus","Sep","Okt","Nop","Des"],dayNames:["Minggu","Senin","Selasa","Rabu","Kamis","Jumat","Sabtu"],dayNamesShort:["Min","Sen","Sel","Rab","kam","Jum","Sab"],dayNamesMin:["Mg","Sn","Sl","Rb","Km","jm","Sb"],weekHeader:"Mg",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("id",{buttonText:{month:"Bulan",week:"Minggu",day:"Hari",list:"Agenda"},allDayHtml:"Sehari<br/>penuh",eventLimitText:"lebih",noEventsMessage:"Tidak ada acara untuk ditampilkan"})}(),function(){!function(){function e(e){return e%100===11||e%10!==1}function t(a,t,n,r){var s=a+" ";switch(n){case"s":return t||r?"nokkrar sekúndur":"nokkrum sekúndum";case"m":return t?"mínúta":"mínútu";case"mm":return e(a)?s+(t||r?"mínútur":"mínútum"):t?s+"mínúta":s+"mínútu";case"hh":return e(a)?s+(t||r?"klukkustundir":"klukkustundum"):s+"klukkustund";case"d":return t?"dagur":r?"dag":"degi";case"dd":return e(a)?t?s+"dagar":s+(r?"daga":"dögum"):t?s+"dagur":s+(r?"dag":"degi");case"M":return t?"mánuður":r?"mánuð":"mánuði";case"MM":return e(a)?t?s+"mánuðir":s+(r?"mánuði":"mánuðum"):t?s+"mánuður":s+(r?"mánuð":"mánuði");case"y":return t||r?"ár":"ári";case"yy":return e(a)?s+(t||r?"ár":"árum"):s+(t||r?"ár":"ári")}}var n=a.defineLocale("is",{months:"janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember".split("_"),monthsShort:"jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des".split("_"),weekdays:"sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur".split("_"),weekdaysShort:"sun_mán_þri_mið_fim_fös_lau".split("_"),weekdaysMin:"Su_Má_Þr_Mi_Fi_Fö_La".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] H:mm",LLLL:"dddd, D. MMMM YYYY [kl.] H:mm"},calendar:{sameDay:"[í dag kl.] LT",nextDay:"[á morgun kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[í gær kl.] LT",lastWeek:"[síðasta] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"eftir %s",past:"fyrir %s síðan",s:t,m:t,mm:t,h:"klukkustund",hh:t,d:t,dd:t,M:t,MM:t,y:t,yy:t},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return n}(),e.fullCalendar.datepickerLocale("is","is",{closeText:"Loka",prevText:"&#x3C; Fyrri",nextText:"Næsti &#x3E;",currentText:"à dag",monthNames:["Janúar","Febrúar","Mars","Apríl","Maí","Júní","Júlí","Ãgúst","September","Október","Nóvember","Desember"],monthNamesShort:["Jan","Feb","Mar","Apr","Maí","Jún","Júl","Ãgú","Sep","Okt","Nóv","Des"],dayNames:["Sunnudagur","Mánudagur","Þriðjudagur","Miðvikudagur","Fimmtudagur","Föstudagur","Laugardagur"],dayNamesShort:["Sun","Mán","Þri","Mið","Fim","Fös","Lau"],dayNamesMin:["Su","Má","Þr","Mi","Fi","Fö","La"],weekHeader:"Vika",dateFormat:"dd.mm.yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("is",{buttonText:{month:"Mánuður",week:"Vika",day:"Dagur",list:"Dagskrá"},allDayHtml:"Allan<br/>daginn",eventLimitText:"meira",noEventsMessage:"Engir viðburðir til að sýna"})}(),function(){!function(){var e=a.defineLocale("it",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"Domenica_Lunedì_Martedì_Mercoledì_Giovedì_Venerdì_Sabato".split("_"),weekdaysShort:"Dom_Lun_Mar_Mer_Gio_Ven_Sab".split("_"),weekdaysMin:"Do_Lu_Ma_Me_Gi_Ve_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Oggi alle] LT",nextDay:"[Domani alle] LT",nextWeek:"dddd [alle] LT",lastDay:"[Ieri alle] LT",lastWeek:function(){switch(this.day()){case 0:return"[la scorsa] dddd [alle] LT";default:return"[lo scorso] dddd [alle] LT"}},sameElse:"L"},relativeTime:{future:function(e){return(/^[0-9].+$/.test(e)?"tra":"in")+" "+e},past:"%s fa",s:"alcuni secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}});return e}(),e.fullCalendar.datepickerLocale("it","it",{closeText:"Chiudi",prevText:"&#x3C;Prec",nextText:"Succ&#x3E;",currentText:"Oggi",monthNames:["Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre"],monthNamesShort:["Gen","Feb","Mar","Apr","Mag","Giu","Lug","Ago","Set","Ott","Nov","Dic"],dayNames:["Domenica","Lunedì","Martedì","Mercoledì","Giovedì","Venerdì","Sabato"],dayNamesShort:["Dom","Lun","Mar","Mer","Gio","Ven","Sab"],dayNamesMin:["Do","Lu","Ma","Me","Gi","Ve","Sa"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("it",{buttonText:{month:"Mese",week:"Settimana",day:"Giorno",list:"Agenda"},allDayHtml:"Tutto il<br/>giorno",eventLimitText:function(e){return"+altri "+e},noEventsMessage:"Non ci sono eventi da visualizzare"})}(),function(){!function(){var e=a.defineLocale("ja",{months:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"日曜日_月曜日_ç«æ›œæ—¥_水曜日_木曜日_金曜日_土曜日".split("_"),weekdaysShort:"æ—¥_月_ç«_æ°´_木_金_土".split("_"),weekdaysMin:"æ—¥_月_ç«_æ°´_木_金_土".split("_"),longDateFormat:{LT:"Ah時m分",LTS:"Ah時m分s秒",L:"YYYY/MM/DD",LL:"YYYYå¹´M月Dæ—¥",LLL:"YYYYå¹´M月Dæ—¥Ah時m分",LLLL:"YYYYå¹´M月Dæ—¥Ah時m分 dddd"},meridiemParse:/åˆå‰|åˆå¾Œ/i,isPM:function(e){return"åˆå¾Œ"===e},meridiem:function(e,a,t){return e<12?"åˆå‰":"åˆå¾Œ"},calendar:{sameDay:"[今日] LT",nextDay:"[明日] LT",nextWeek:"[æ¥é€±]dddd LT",lastDay:"[昨日] LT",lastWeek:"[å‰é€±]dddd LT",sameElse:"L"},ordinalParse:/\d{1,2}æ—¥/,ordinal:function(e,a){switch(a){case"d":case"D":case"DDD":return e+"æ—¥";default:return e}},relativeTime:{future:"%s後",past:"%så‰",s:"数秒",m:"1分",mm:"%d分",h:"1時間",hh:"%d時間",d:"1æ—¥",dd:"%dæ—¥",M:"1ヶ月",MM:"%dヶ月",y:"1å¹´",yy:"%då¹´"}});return e}(),e.fullCalendar.datepickerLocale("ja","ja",{closeText:"é–‰ã˜ã‚‹",prevText:"&#x3C;å‰",nextText:"次&#x3E;",currentText:"今日",monthNames:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],monthNamesShort:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],dayNames:["日曜日","月曜日","ç«æ›œæ—¥","水曜日","木曜日","金曜日","土曜日"],dayNamesShort:["æ—¥","月","ç«","æ°´","木","金","土"],dayNamesMin:["æ—¥","月","ç«","æ°´","木","金","土"],weekHeader:"週",dateFormat:"yy/mm/dd",firstDay:0,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"å¹´"}),e.fullCalendar.locale("ja",{buttonText:{month:"月",week:"週",day:"æ—¥",list:"予定リスト"},allDayText:"終日",eventLimitText:function(e){return"ä»– "+e+" 件"},noEventsMessage:"イベントãŒè¡¨ç¤ºã•ã‚Œãªã„よã†ã«"})}(),function(){!function(){var e={0:"-ші",1:"-ші",2:"-ші",3:"-ші",4:"-ші",5:"-ші",6:"-шы",7:"-ші",8:"-ші",9:"-шы",10:"-шы",20:"-шы",30:"-шы",40:"-шы",50:"-ші",60:"-шы",70:"-ші",80:"-ші",90:"-шы",100:"-ші"},t=a.defineLocale("kk",{months:"қаңтар_ақпан_наурыз_Ñәуір_мамыр_мауÑым_шілде_тамыз_қыркүйек_қазан_қараша_желтоқÑан".split("_"),monthsShort:"қаң_ақп_нау_Ñәу_мам_мау_шіл_там_қыр_қаз_қар_жел".split("_"),weekdays:"жекÑенбі_дүйÑенбі_ÑейÑенбі_ÑәрÑенбі_бейÑенбі_жұма_Ñенбі".split("_"),weekdaysShort:"жек_дүй_Ñей_Ñәр_бей_жұм_Ñен".split("_"),weekdaysMin:"жк_дй_Ñй_ÑÑ€_бй_жм_Ñн".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Бүгін Ñағат] LT",nextDay:"[Ертең Ñағат] LT",nextWeek:"dddd [Ñағат] LT",lastDay:"[Кеше Ñағат] LT",lastWeek:"[Өткен аптаның] dddd [Ñағат] LT",sameElse:"L"},relativeTime:{future:"%s ішінде",past:"%s бұрын",s:"бірнеше Ñекунд",m:"бір минут",mm:"%d минут",h:"бір Ñағат",hh:"%d Ñағат",d:"бір күн",dd:"%d күн",M:"бір ай",MM:"%d ай",y:"бір жыл",yy:"%d жыл"},ordinalParse:/\d{1,2}-(ші|шы)/,ordinal:function(a){var t=a%10,n=a>=100?100:null;return a+(e[a]||e[t]||e[n])},week:{dow:1,doy:7}});return t}(),e.fullCalendar.datepickerLocale("kk","kk",{closeText:"Жабу",prevText:"&#x3C;Ðлдыңғы",nextText:"КелеÑÑ–&#x3E;",currentText:"Бүгін",monthNames:["Қаңтар","Ðқпан","Ðаурыз","Сәуір","Мамыр","МауÑым","Шілде","Тамыз","Қыркүйек","Қазан","Қараша","ЖелтоқÑан"],monthNamesShort:["Қаң","Ðқп","Ðау","Сәу","Мам","Мау","Шіл","Там","Қыр","Қаз","Қар","Жел"],dayNames:["ЖекÑенбі","ДүйÑенбі","СейÑенбі","СәрÑенбі","БейÑенбі","Жұма","Сенбі"],dayNamesShort:["жкÑ","дÑн","ÑÑн","ÑÑ€Ñ","бÑн","жма","Ñнб"],dayNamesMin:["Жк","ДÑ","СÑ","Ср","БÑ","Жм","Сн"],weekHeader:"Ðе",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("kk",{buttonText:{month:"Ðй",week:"Ðпта",day:"Күн",list:"Күн тәртібі"},allDayText:"Күні бойы",eventLimitText:function(e){return"+ тағы "+e},noEventsMessage:"КөрÑету үшін оқиғалар жоқ"})}(),function(){!function(){var e=a.defineLocale("ko",{months:"1ì›”_2ì›”_3ì›”_4ì›”_5ì›”_6ì›”_7ì›”_8ì›”_9ì›”_10ì›”_11ì›”_12ì›”".split("_"),monthsShort:"1ì›”_2ì›”_3ì›”_4ì›”_5ì›”_6ì›”_7ì›”_8ì›”_9ì›”_10ì›”_11ì›”_12ì›”".split("_"),weekdays:"ì¼ìš”ì¼_월요ì¼_화요ì¼_수요ì¼_목요ì¼_금요ì¼_토요ì¼".split("_"),weekdaysShort:"ì¼_ì›”_í™”_수_목_금_토".split("_"),weekdaysMin:"ì¼_ì›”_í™”_수_목_금_토".split("_"),longDateFormat:{LT:"A hì‹œ m분",LTS:"A hì‹œ m분 sì´ˆ",L:"YYYY.MM.DD",LL:"YYYYë…„ MMMM Dì¼",LLL:"YYYYë…„ MMMM Dì¼ A hì‹œ m분",LLLL:"YYYYë…„ MMMM Dì¼ dddd A hì‹œ m분"},calendar:{sameDay:"오늘 LT",nextDay:"ë‚´ì¼ LT",nextWeek:"dddd LT",lastDay:"ì–´ì œ LT",lastWeek:"지난주 dddd LT",sameElse:"L"},relativeTime:{future:"%s 후",past:"%s ì „",s:"몇 ì´ˆ",ss:"%dì´ˆ",m:"ì¼ë¶„",mm:"%d분",h:"í•œ 시간",hh:"%d시간",d:"하루",dd:"%dì¼",M:"í•œ 달",MM:"%d달",y:"ì¼ ë…„",yy:"%dë…„"},ordinalParse:/\d{1,2}ì¼/,ordinal:"%dì¼",meridiemParse:/오전|오후/,isPM:function(e){return"오후"===e},meridiem:function(e,a,t){return e<12?"오전":"오후"}});return e}(),e.fullCalendar.datepickerLocale("ko","ko",{closeText:"닫기",prevText:"ì´ì „달",nextText:"다ìŒë‹¬",currentText:"오늘",monthNames:["1ì›”","2ì›”","3ì›”","4ì›”","5ì›”","6ì›”","7ì›”","8ì›”","9ì›”","10ì›”","11ì›”","12ì›”"],monthNamesShort:["1ì›”","2ì›”","3ì›”","4ì›”","5ì›”","6ì›”","7ì›”","8ì›”","9ì›”","10ì›”","11ì›”","12ì›”"],dayNames:["ì¼ìš”ì¼","월요ì¼","화요ì¼","수요ì¼","목요ì¼","금요ì¼","토요ì¼"],dayNamesShort:["ì¼","ì›”","í™”","수","목","금","토"],dayNamesMin:["ì¼","ì›”","í™”","수","목","금","토"],weekHeader:"주",dateFormat:"yy. m. d.",firstDay:0,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"ë…„"}),e.fullCalendar.locale("ko",{buttonText:{month:"ì›”",week:"주",day:"ì¼",list:"ì¼ì •ëª©ë¡"},allDayText:"종ì¼",eventLimitText:"ê°œ",noEventsMessage:"ì¼ì •ì´ 표시 없습니다"})}(),function(){!function(){function e(e,a,t,n){var r={m:["eng Minutt","enger Minutt"],h:["eng Stonn","enger Stonn"],d:["een Dag","engem Dag"],M:["ee Mount","engem Mount"],y:["ee Joer","engem Joer"]};return a?r[t][0]:r[t][1]}function t(e){var a=e.substr(0,e.indexOf(" "));return r(a)?"a "+e:"an "+e}function n(e){var a=e.substr(0,e.indexOf(" "));return r(a)?"viru "+e:"virun "+e}function r(e){if(e=parseInt(e,10),isNaN(e))return!1;if(e<0)return!0;if(e<10)return 4<=e&&e<=7;if(e<100){var a=e%10,t=e/10;return r(0===a?t:a)}if(e<1e4){for(;e>=10;)e/=10;return r(e)}return e/=1e3,r(e)}var s=a.defineLocale("lb",{months:"Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg".split("_"),weekdaysShort:"So._Mé._Dë._Më._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mé_Dë_Më_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm [Auer]",LTS:"H:mm:ss [Auer]",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm [Auer]",LLLL:"dddd, D. MMMM YYYY H:mm [Auer]"},calendar:{sameDay:"[Haut um] LT",sameElse:"L",nextDay:"[Muer um] LT",nextWeek:"dddd [um] LT",lastDay:"[Gëschter um] LT",lastWeek:function(){switch(this.day()){case 2:case 4:return"[Leschten] dddd [um] LT";default:return"[Leschte] dddd [um] LT"}}},relativeTime:{future:t,past:n,s:"e puer Sekonnen",m:e,mm:"%d Minutten",h:e,hh:"%d Stonnen",d:e,dd:"%d Deeg",M:e,MM:"%d Méint",y:e,yy:"%d Joer"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return s}(),e.fullCalendar.datepickerLocale("lb","lb",{closeText:"Fäerdeg",prevText:"Zréck",nextText:"Weider",currentText:"Haut",monthNames:["Januar","Februar","Mäerz","Abrëll","Mee","Juni","Juli","August","September","Oktober","November","Dezember"],monthNamesShort:["Jan","Feb","Mäe","Abr","Mee","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],dayNames:["Sonndeg","Méindeg","Dënschdeg","Mëttwoch","Donneschdeg","Freideg","Samschdeg"],dayNamesShort:["Son","Méi","Dën","Mët","Don","Fre","Sam"],dayNamesMin:["So","Mé","Dë","Më","Do","Fr","Sa"],weekHeader:"W",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("lb",{buttonText:{month:"Mount",week:"Woch",day:"Dag",list:"Terminiwwersiicht"},allDayText:"Ganzen Dag",eventLimitText:"méi",noEventsMessage:"Nee Evenementer ze affichéieren"})}(),function(){!function(){function e(e,a,t,n){return a?"kelios sekundÄ—s":n?"kelių sekundžių":"kelias sekundes"}function t(e,a,t,n){return a?r(t)[0]:n?r(t)[1]:r(t)[2]}function n(e){return e%10===0||e>10&&e<20}function r(e){return d[e].split("_")}function s(e,a,s,d){var i=e+" ";return 1===e?i+t(e,a,s[0],d):a?i+(n(e)?r(s)[1]:r(s)[0]):d?i+r(s)[1]:i+(n(e)?r(s)[1]:r(s)[2])}var d={m:"minutÄ—_minutÄ—s_minutÄ™",mm:"minutÄ—s_minuÄių_minutes",h:"valanda_valandos_valandÄ…",hh:"valandos_valandų_valandas",d:"diena_dienos_dienÄ…",dd:"dienos_dienų_dienas",M:"mÄ—nuo_mÄ—nesio_mÄ—nesį",MM:"mÄ—nesiai_mÄ—nesių_mÄ—nesius",y:"metai_metų_metus",yy:"metai_metų_metus"},i=a.defineLocale("lt",{months:{format:"sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjÅ«Äio_rugsÄ—jo_spalio_lapkriÄio_gruodžio".split("_"),standalone:"sausis_vasaris_kovas_balandis_gegužė_birželis_liepa_rugpjÅ«tis_rugsÄ—jis_spalis_lapkritis_gruodis".split("_"),isFormat:/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|MMMM?(\[[^\[\]]*\]|\s)+D[oD]?/},monthsShort:"sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd".split("_"),weekdays:{format:"sekmadienį_pirmadienį_antradienį_treÄiadienį_ketvirtadienį_penktadienį_Å¡eÅ¡tadienį".split("_"),standalone:"sekmadienis_pirmadienis_antradienis_treÄiadienis_ketvirtadienis_penktadienis_Å¡eÅ¡tadienis".split("_"),isFormat:/dddd HH:mm/},weekdaysShort:"Sek_Pir_Ant_Tre_Ket_Pen_Å eÅ¡".split("_"),weekdaysMin:"S_P_A_T_K_Pn_Å ".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY [m.] MMMM D [d.]",LLL:"YYYY [m.] MMMM D [d.], HH:mm [val.]",LLLL:"YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]",l:"YYYY-MM-DD",ll:"YYYY [m.] MMMM D [d.]",lll:"YYYY [m.] MMMM D [d.], HH:mm [val.]",llll:"YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]"},calendar:{sameDay:"[Å iandien] LT",nextDay:"[Rytoj] LT",nextWeek:"dddd LT",lastDay:"[Vakar] LT",lastWeek:"[PraÄ—jusį] dddd LT",sameElse:"L"},relativeTime:{future:"po %s",past:"prieÅ¡ %s",s:e,m:t,mm:s,h:t,hh:s,d:t,dd:s,M:t,MM:s,y:t,yy:s},ordinalParse:/\d{1,2}-oji/,ordinal:function(e){return e+"-oji"},week:{dow:1,doy:4}});return i}(),e.fullCalendar.datepickerLocale("lt","lt",{closeText:"Uždaryti",prevText:"&#x3C;Atgal",nextText:"Pirmyn&#x3E;",currentText:"Å iandien",monthNames:["Sausis","Vasaris","Kovas","Balandis","Gegužė","Birželis","Liepa","RugpjÅ«tis","RugsÄ—jis","Spalis","Lapkritis","Gruodis"],monthNamesShort:["Sau","Vas","Kov","Bal","Geg","Bir","Lie","Rugp","Rugs","Spa","Lap","Gru"],dayNames:["sekmadienis","pirmadienis","antradienis","treÄiadienis","ketvirtadienis","penktadienis","Å¡eÅ¡tadienis"],dayNamesShort:["sek","pir","ant","tre","ket","pen","Å¡eÅ¡"],dayNamesMin:["Se","Pr","An","Tr","Ke","Pe","Å e"],weekHeader:"SAV",dateFormat:"yy-mm-dd",firstDay:1,isRTL:!1,showMonthAfterYear:!0,yearSuffix:""}),e.fullCalendar.locale("lt",{buttonText:{month:"MÄ—nuo",week:"SavaitÄ—",day:"Diena",list:"DarbotvarkÄ—"},allDayText:"VisÄ… dienÄ…",eventLimitText:"daugiau",noEventsMessage:"NÄ—ra įvykių rodyti"})}(),function(){!function(){function e(e,a,t){return t?a%10===1&&a%100!==11?e[2]:e[3]:a%10===1&&a%100!==11?e[0]:e[1]}function t(a,t,n){return a+" "+e(s[n],a,t)}function n(a,t,n){return e(s[n],a,t)}function r(e,a){return a?"dažas sekundes":"dažÄm sekundÄ“m"}var s={m:"minÅ«tes_minÅ«tÄ“m_minÅ«te_minÅ«tes".split("_"),mm:"minÅ«tes_minÅ«tÄ“m_minÅ«te_minÅ«tes".split("_"),h:"stundas_stundÄm_stunda_stundas".split("_"),hh:"stundas_stundÄm_stunda_stundas".split("_"),d:"dienas_dienÄm_diena_dienas".split("_"),dd:"dienas_dienÄm_diena_dienas".split("_"),M:"mÄ“neÅ¡a_mÄ“neÅ¡iem_mÄ“nesis_mÄ“neÅ¡i".split("_"),MM:"mÄ“neÅ¡a_mÄ“neÅ¡iem_mÄ“nesis_mÄ“neÅ¡i".split("_"),y:"gada_gadiem_gads_gadi".split("_"),yy:"gada_gadiem_gads_gadi".split("_")},d=a.defineLocale("lv",{months:"janvÄris_februÄris_marts_aprÄ«lis_maijs_jÅ«nijs_jÅ«lijs_augusts_septembris_oktobris_novembris_decembris".split("_"),monthsShort:"jan_feb_mar_apr_mai_jÅ«n_jÅ«l_aug_sep_okt_nov_dec".split("_"),weekdays:"svÄ“tdiena_pirmdiena_otrdiena_treÅ¡diena_ceturtdiena_piektdiena_sestdiena".split("_"),weekdaysShort:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysMin:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY.",LL:"YYYY. [gada] D. MMMM",LLL:"YYYY. [gada] D. MMMM, HH:mm",LLLL:"YYYY. [gada] D. MMMM, dddd, HH:mm"},calendar:{sameDay:"[Å odien pulksten] LT",nextDay:"[RÄ«t pulksten] LT",nextWeek:"dddd [pulksten] LT",lastDay:"[Vakar pulksten] LT",lastWeek:"[PagÄjuÅ¡Ä] dddd [pulksten] LT",sameElse:"L"},relativeTime:{future:"pÄ“c %s",past:"pirms %s",s:r,m:n,mm:t,h:n,hh:t,d:n,dd:t,M:n,MM:t,y:n,yy:t},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return d}(),e.fullCalendar.datepickerLocale("lv","lv",{closeText:"AizvÄ“rt",prevText:"Iepr.",nextText:"NÄk.",currentText:"Å odien",monthNames:["JanvÄris","FebruÄris","Marts","AprÄ«lis","Maijs","JÅ«nijs","JÅ«lijs","Augusts","Septembris","Oktobris","Novembris","Decembris"],monthNamesShort:["Jan","Feb","Mar","Apr","Mai","JÅ«n","JÅ«l","Aug","Sep","Okt","Nov","Dec"],dayNames:["svÄ“tdiena","pirmdiena","otrdiena","treÅ¡diena","ceturtdiena","piektdiena","sestdiena"],dayNamesShort:["svt","prm","otr","tre","ctr","pkt","sst"],dayNamesMin:["Sv","Pr","Ot","Tr","Ct","Pk","Ss"],weekHeader:"Ned.",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("lv",{buttonText:{month:"MÄ“nesis",week:"Nedēļa",day:"Diena",list:"Dienas kÄrtÄ«ba"},allDayText:"Visu dienu",eventLimitText:function(e){return"+vÄ“l "+e},noEventsMessage:"Nav notikumu, lai parÄdÄ«tu"})}(),function(){!function(){var e=a.defineLocale("mk",{months:"јануари_февруари_март_април_мај_јуни_јули_авгуÑÑ‚_Ñептември_октомври_ноември_декември".split("_"),monthsShort:"јан_фев_мар_апр_мај_јун_јул_авг_Ñеп_окт_ное_дек".split("_"),weekdays:"недела_понеделник_вторник_Ñреда_четврток_петок_Ñабота".split("_"),weekdaysShort:"нед_пон_вто_Ñре_чет_пет_Ñаб".split("_"),weekdaysMin:"нe_пo_вт_ÑÑ€_че_пе_Ña".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[Ð”ÐµÐ½ÐµÑ Ð²Ð¾] LT",nextDay:"[Утре во] LT",nextWeek:"[Во] dddd [во] LT",lastDay:"[Вчера во] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[Изминатата] dddd [во] LT";case 1:case 2:case 4:case 5:return"[Изминатиот] dddd [во] LT"}},sameElse:"L"},relativeTime:{future:"поÑле %s",past:"пред %s",s:"неколку Ñекунди",m:"минута",mm:"%d минути",h:"чаÑ",hh:"%d чаÑа",d:"ден",dd:"%d дена",M:"меÑец",MM:"%d меÑеци",y:"година",yy:"%d години"},ordinalParse:/\d{1,2}-(ев|ен|ти|ви|ри|ми)/,ordinal:function(e){var a=e%10,t=e%100;return 0===e?e+"-ев":0===t?e+"-ен":t>10&&t<20?e+"-ти":1===a?e+"-ви":2===a?e+"-ри":7===a||8===a?e+"-ми":e+"-ти"},week:{dow:1,doy:7}});return e}(),e.fullCalendar.datepickerLocale("mk","mk",{closeText:"Затвори",prevText:"&#x3C;",nextText:"&#x3E;",currentText:"ДенеÑ",monthNames:["Јануари","Февруари","Март","Ðприл","Мај","Јуни","Јули","ÐвгуÑÑ‚","Септември","Октомври","Ðоември","Декември"],monthNamesShort:["Јан","Фев","Мар","Ðпр","Мај","Јун","Јул","Ðвг","Сеп","Окт","Ðое","Дек"],dayNames:["Ðедела","Понеделник","Вторник","Среда","Четврток","Петок","Сабота"],dayNamesShort:["Ðед","Пон","Вто","Сре","Чет","Пет","Саб"],dayNamesMin:["Ðе","По","Ð’Ñ‚","Ср","Че","Пе","Са"],weekHeader:"Сед",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("mk",{buttonText:{month:"МеÑец",week:"Ðедела",day:"Ден",list:"График"},allDayText:"Цел ден",eventLimitText:function(e){return"+повеќе "+e},noEventsMessage:"Ðема наÑтани за прикажување"})}(),function(){!function(){var e=a.defineLocale("ms",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(e,a){return 12===e&&(e=0),"pagi"===a?e:"tengahari"===a?e>=11?e:e+12:"petang"===a||"malam"===a?e+12:void 0},meridiem:function(e,a,t){return e<11?"pagi":e<15?"tengahari":e<19?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}});return e}(),e.fullCalendar.datepickerLocale("ms","ms",{closeText:"Tutup",prevText:"&#x3C;Sebelum",nextText:"Selepas&#x3E;",currentText:"hari ini",monthNames:["Januari","Februari","Mac","April","Mei","Jun","Julai","Ogos","September","Oktober","November","Disember"],monthNamesShort:["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ogo","Sep","Okt","Nov","Dis"],dayNames:["Ahad","Isnin","Selasa","Rabu","Khamis","Jumaat","Sabtu"],dayNamesShort:["Aha","Isn","Sel","Rab","kha","Jum","Sab"],dayNamesMin:["Ah","Is","Se","Ra","Kh","Ju","Sa"],weekHeader:"Mg",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("ms",{buttonText:{month:"Bulan",week:"Minggu",day:"Hari",list:"Agenda"},allDayText:"Sepanjang hari",eventLimitText:function(e){return"masih ada "+e+" acara"},noEventsMessage:"Tiada peristiwa untuk dipaparkan"})}(),function(){!function(){var e=a.defineLocale("ms-my",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(e,a){return 12===e&&(e=0),"pagi"===a?e:"tengahari"===a?e>=11?e:e+12:"petang"===a||"malam"===a?e+12:void 0},meridiem:function(e,a,t){return e<11?"pagi":e<15?"tengahari":e<19?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}});return e}(),e.fullCalendar.datepickerLocale("ms-my","ms",{closeText:"Tutup",prevText:"&#x3C;Sebelum",nextText:"Selepas&#x3E;",currentText:"hari ini",monthNames:["Januari","Februari","Mac","April","Mei","Jun","Julai","Ogos","September","Oktober","November","Disember"],monthNamesShort:["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ogo","Sep","Okt","Nov","Dis"],dayNames:["Ahad","Isnin","Selasa","Rabu","Khamis","Jumaat","Sabtu"],dayNamesShort:["Aha","Isn","Sel","Rab","kha","Jum","Sab"],dayNamesMin:["Ah","Is","Se","Ra","Kh","Ju","Sa"],weekHeader:"Mg",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("ms-my",{buttonText:{month:"Bulan",week:"Minggu",day:"Hari",list:"Agenda"},allDayText:"Sepanjang hari",eventLimitText:function(e){return"masih ada "+e+" acara"},noEventsMessage:"Tiada peristiwa untuk dipaparkan"})}(),function(){!function(){var e=a.defineLocale("nb",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan._feb._mars_april_mai_juni_juli_aug._sep._okt._nov._des.".split("_"),monthsParseExact:!0,weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"sø._ma._ti._on._to._fr._lø.".split("_"),weekdaysMin:"sø_ma_ti_on_to_fr_lø".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] HH:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[i gÃ¥r kl.] LT",lastWeek:"[forrige] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"noen sekunder",m:"ett minutt",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dager",M:"en mÃ¥ned",MM:"%d mÃ¥neder",y:"ett Ã¥r",yy:"%d Ã¥r"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return e}(),e.fullCalendar.datepickerLocale("nb","nb",{closeText:"Lukk",prevText:"&#xAB;Forrige",nextText:"Neste&#xBB;",currentText:"I dag",monthNames:["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"],monthNamesShort:["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des"],dayNamesShort:["søn","man","tir","ons","tor","fre","lør"],dayNames:["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],dayNamesMin:["sø","ma","ti","on","to","fr","lø"],weekHeader:"Uke",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("nb",{buttonText:{month:"MÃ¥ned",week:"Uke",day:"Dag",list:"Agenda"},allDayText:"Hele dagen",eventLimitText:"til",noEventsMessage:"Ingen hendelser Ã¥ vise"})}(),function(){!function(){var e="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),t="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),n=[/^jan/i,/^feb/i,/^maart|mrt.?$/i,/^apr/i,/^mei$/i,/^jun[i.]?$/i,/^jul[i.]?$/i,/^aug/i,/^sep/i,/^okt/i,/^nov/i,/^dec/i],r=/^(januari|februari|maart|april|mei|april|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,s=a.defineLocale("nl",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(a,n){return/-MMM-/.test(n)?t[a.month()]:e[a.month()]},monthsRegex:r,monthsShortRegex:r,monthsStrictRegex:/^(januari|februari|maart|mei|ju[nl]i|april|augustus|september|oktober|november|december)/i,monthsShortStrictRegex:/^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,monthsParse:n,longMonthsParse:n,shortMonthsParse:n,weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"Zo_Ma_Di_Wo_Do_Vr_Za".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",
+lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",m:"één minuut",mm:"%d minuten",h:"één uur",hh:"%d uur",d:"één dag",dd:"%d dagen",M:"één maand",MM:"%d maanden",y:"één jaar",yy:"%d jaar"},ordinalParse:/\d{1,2}(ste|de)/,ordinal:function(e){return e+(1===e||8===e||e>=20?"ste":"de")},week:{dow:1,doy:4}});return s}(),e.fullCalendar.datepickerLocale("nl","nl",{closeText:"Sluiten",prevText:"â†",nextText:"→",currentText:"Vandaag",monthNames:["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"],monthNamesShort:["jan","feb","mrt","apr","mei","jun","jul","aug","sep","okt","nov","dec"],dayNames:["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],dayNamesShort:["zon","maa","din","woe","don","vri","zat"],dayNamesMin:["zo","ma","di","wo","do","vr","za"],weekHeader:"Wk",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("nl",{buttonText:{month:"Maand",week:"Week",day:"Dag",list:"Agenda"},allDayText:"Hele dag",eventLimitText:"extra",noEventsMessage:"Geen evenementen om te laten zien"})}(),function(){!function(){var e="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),t="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),n=[/^jan/i,/^feb/i,/^maart|mrt.?$/i,/^apr/i,/^mei$/i,/^jun[i.]?$/i,/^jul[i.]?$/i,/^aug/i,/^sep/i,/^okt/i,/^nov/i,/^dec/i],r=/^(januari|februari|maart|april|mei|april|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,s=a.defineLocale("nl-be",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(a,n){return/-MMM-/.test(n)?t[a.month()]:e[a.month()]},monthsRegex:r,monthsShortRegex:r,monthsStrictRegex:/^(januari|februari|maart|mei|ju[nl]i|april|augustus|september|oktober|november|december)/i,monthsShortStrictRegex:/^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,monthsParse:n,longMonthsParse:n,shortMonthsParse:n,weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"Zo_Ma_Di_Wo_Do_Vr_Za".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",m:"één minuut",mm:"%d minuten",h:"één uur",hh:"%d uur",d:"één dag",dd:"%d dagen",M:"één maand",MM:"%d maanden",y:"één jaar",yy:"%d jaar"},ordinalParse:/\d{1,2}(ste|de)/,ordinal:function(e){return e+(1===e||8===e||e>=20?"ste":"de")},week:{dow:1,doy:4}});return s}(),e.fullCalendar.datepickerLocale("nl-be","nl-BE",{closeText:"Sluiten",prevText:"â†",nextText:"→",currentText:"Vandaag",monthNames:["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"],monthNamesShort:["jan","feb","mrt","apr","mei","jun","jul","aug","sep","okt","nov","dec"],dayNames:["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],dayNamesShort:["zon","maa","din","woe","don","vri","zat"],dayNamesMin:["zo","ma","di","wo","do","vr","za"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("nl-be",{buttonText:{month:"Maand",week:"Week",day:"Dag",list:"Agenda"},allDayText:"Hele dag",eventLimitText:"extra",noEventsMessage:"Geen evenementen om te laten zien"})}(),function(){!function(){var e=a.defineLocale("nn",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sundag_mÃ¥ndag_tysdag_onsdag_torsdag_fredag_laurdag".split("_"),weekdaysShort:"sun_mÃ¥n_tys_ons_tor_fre_lau".split("_"),weekdaysMin:"su_mÃ¥_ty_on_to_fr_lø".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] H:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[I dag klokka] LT",nextDay:"[I morgon klokka] LT",nextWeek:"dddd [klokka] LT",lastDay:"[I gÃ¥r klokka] LT",lastWeek:"[FøregÃ¥ande] dddd [klokka] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s sidan",s:"nokre sekund",m:"eit minutt",mm:"%d minutt",h:"ein time",hh:"%d timar",d:"ein dag",dd:"%d dagar",M:"ein mÃ¥nad",MM:"%d mÃ¥nader",y:"eit Ã¥r",yy:"%d Ã¥r"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return e}(),e.fullCalendar.datepickerLocale("nn","nn",{closeText:"Lukk",prevText:"&#xAB;Førre",nextText:"Neste&#xBB;",currentText:"I dag",monthNames:["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"],monthNamesShort:["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des"],dayNamesShort:["sun","mÃ¥n","tys","ons","tor","fre","lau"],dayNames:["sundag","mÃ¥ndag","tysdag","onsdag","torsdag","fredag","laurdag"],dayNamesMin:["su","mÃ¥","ty","on","to","fr","la"],weekHeader:"Veke",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("nn",{buttonText:{month:"MÃ¥nad",week:"Veke",day:"Dag",list:"Agenda"},allDayText:"Heile dagen",eventLimitText:"til",noEventsMessage:"Ingen hendelser Ã¥ vise"})}(),function(){!function(){function e(e){return e%10<5&&e%10>1&&~~(e/10)%10!==1}function t(a,t,n){var r=a+" ";switch(n){case"m":return t?"minuta":"minutÄ™";case"mm":return r+(e(a)?"minuty":"minut");case"h":return t?"godzina":"godzinÄ™";case"hh":return r+(e(a)?"godziny":"godzin");case"MM":return r+(e(a)?"miesiÄ…ce":"miesiÄ™cy");case"yy":return r+(e(a)?"lata":"lat")}}var n="styczeÅ„_luty_marzec_kwiecieÅ„_maj_czerwiec_lipiec_sierpieÅ„_wrzesieÅ„_październik_listopad_grudzieÅ„".split("_"),r="stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_wrzeÅ›nia_października_listopada_grudnia".split("_"),s=a.defineLocale("pl",{months:function(e,a){return""===a?"("+r[e.month()]+"|"+n[e.month()]+")":/D MMMM/.test(a)?r[e.month()]:n[e.month()]},monthsShort:"sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru".split("_"),weekdays:"niedziela_poniedziaÅ‚ek_wtorek_Å›roda_czwartek_piÄ…tek_sobota".split("_"),weekdaysShort:"ndz_pon_wt_Å›r_czw_pt_sob".split("_"),weekdaysMin:"Nd_Pn_Wt_Åšr_Cz_Pt_So".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[DziÅ› o] LT",nextDay:"[Jutro o] LT",nextWeek:"[W] dddd [o] LT",lastDay:"[Wczoraj o] LT",lastWeek:function(){switch(this.day()){case 0:return"[W zeszÅ‚Ä… niedzielÄ™ o] LT";case 3:return"[W zeszÅ‚Ä… Å›rodÄ™ o] LT";case 6:return"[W zeszÅ‚Ä… sobotÄ™ o] LT";default:return"[W zeszÅ‚y] dddd [o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"%s temu",s:"kilka sekund",m:t,mm:t,h:t,hh:t,d:"1 dzieÅ„",dd:"%d dni",M:"miesiÄ…c",MM:t,y:"rok",yy:t},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return s}(),e.fullCalendar.datepickerLocale("pl","pl",{closeText:"Zamknij",prevText:"&#x3C;Poprzedni",nextText:"NastÄ™pny&#x3E;",currentText:"DziÅ›",monthNames:["StyczeÅ„","Luty","Marzec","KwiecieÅ„","Maj","Czerwiec","Lipiec","SierpieÅ„","WrzesieÅ„","Październik","Listopad","GrudzieÅ„"],monthNamesShort:["Sty","Lu","Mar","Kw","Maj","Cze","Lip","Sie","Wrz","Pa","Lis","Gru"],dayNames:["Niedziela","PoniedziaÅ‚ek","Wtorek","Åšroda","Czwartek","PiÄ…tek","Sobota"],dayNamesShort:["Nie","Pn","Wt","Åšr","Czw","Pt","So"],dayNamesMin:["N","Pn","Wt","Åšr","Cz","Pt","So"],weekHeader:"Tydz",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("pl",{buttonText:{month:"MiesiÄ…c",week:"TydzieÅ„",day:"DzieÅ„",list:"Plan dnia"},allDayText:"CaÅ‚y dzieÅ„",eventLimitText:"wiÄ™cej",noEventsMessage:"Brak wydarzeÅ„ do wyÅ›wietlenia"})}(),function(){!function(){var e=a.defineLocale("pt",{months:"Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro".split("_"),monthsShort:"Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"),weekdays:"Domingo_Segunda-Feira_Terça-Feira_Quarta-Feira_Quinta-Feira_Sexta-Feira_Sábado".split("_"),weekdaysShort:"Dom_Seg_Ter_Qua_Qui_Sex_Sáb".split("_"),weekdaysMin:"Dom_2ª_3ª_4ª_5ª_6ª_Sáb".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY HH:mm"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"há %s",s:"segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}});return e}(),e.fullCalendar.datepickerLocale("pt","pt",{closeText:"Fechar",prevText:"Anterior",nextText:"Seguinte",currentText:"Hoje",monthNames:["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],monthNamesShort:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],dayNames:["Domingo","Segunda-feira","Terça-feira","Quarta-feira","Quinta-feira","Sexta-feira","Sábado"],dayNamesShort:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],dayNamesMin:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],weekHeader:"Sem",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("pt",{buttonText:{month:"Mês",week:"Semana",day:"Dia",list:"Agenda"},allDayText:"Todo o dia",eventLimitText:"mais",noEventsMessage:"Não há eventos para mostrar"})}(),function(){!function(){var e=a.defineLocale("pt-br",{months:"Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro".split("_"),monthsShort:"Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"),weekdays:"Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado".split("_"),weekdaysShort:"Dom_Seg_Ter_Qua_Qui_Sex_Sáb".split("_"),weekdaysMin:"Dom_2ª_3ª_4ª_5ª_6ª_Sáb".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY [às] HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY [às] HH:mm"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"%s atrás",s:"poucos segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},ordinalParse:/\d{1,2}º/,ordinal:"%dº"});return e}(),e.fullCalendar.datepickerLocale("pt-br","pt-BR",{closeText:"Fechar",prevText:"&#x3C;Anterior",nextText:"Próximo&#x3E;",currentText:"Hoje",monthNames:["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],monthNamesShort:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],dayNames:["Domingo","Segunda-feira","Terça-feira","Quarta-feira","Quinta-feira","Sexta-feira","Sábado"],dayNamesShort:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],dayNamesMin:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("pt-br",{buttonText:{month:"Mês",week:"Semana",day:"Dia",list:"Compromissos"},allDayText:"dia inteiro",eventLimitText:function(e){return"mais +"+e},noEventsMessage:"Não há eventos para mostrar"})}(),function(){!function(){function e(e,a,t){var n={mm:"minute",hh:"ore",dd:"zile",MM:"luni",yy:"ani"},r=" ";return(e%100>=20||e>=100&&e%100===0)&&(r=" de "),e+r+n[t]}var t=a.defineLocale("ro",{months:"ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie".split("_"),monthsShort:"ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"duminică_luni_marÈ›i_miercuri_joi_vineri_sâmbătă".split("_"),weekdaysShort:"Dum_Lun_Mar_Mie_Joi_Vin_Sâm".split("_"),weekdaysMin:"Du_Lu_Ma_Mi_Jo_Vi_Sâ".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[azi la] LT",nextDay:"[mâine la] LT",nextWeek:"dddd [la] LT",lastDay:"[ieri la] LT",lastWeek:"[fosta] dddd [la] LT",sameElse:"L"},relativeTime:{future:"peste %s",past:"%s în urmă",s:"câteva secunde",m:"un minut",mm:e,h:"o oră",hh:e,d:"o zi",dd:e,M:"o lună",MM:e,y:"un an",yy:e},week:{dow:1,doy:7}});return t}(),e.fullCalendar.datepickerLocale("ro","ro",{closeText:"ÃŽnchide",prevText:"&#xAB; Luna precedentă",nextText:"Luna următoare &#xBB;",currentText:"Azi",monthNames:["Ianuarie","Februarie","Martie","Aprilie","Mai","Iunie","Iulie","August","Septembrie","Octombrie","Noiembrie","Decembrie"],monthNamesShort:["Ian","Feb","Mar","Apr","Mai","Iun","Iul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Duminică","Luni","MarÅ£i","Miercuri","Joi","Vineri","Sâmbătă"],dayNamesShort:["Dum","Lun","Mar","Mie","Joi","Vin","Sâm"],dayNamesMin:["Du","Lu","Ma","Mi","Jo","Vi","Sâ"],weekHeader:"Săpt",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("ro",{buttonText:{prev:"precedentă",next:"următoare",month:"Lună",week:"Săptămână",day:"Zi",list:"Agendă"},allDayText:"Toată ziua",eventLimitText:function(e){return"+alte "+e},noEventsMessage:"Nu există evenimente de afiÈ™at"})}(),function(){!function(){function e(e,a){var t=e.split("_");return a%10===1&&a%100!==11?t[0]:a%10>=2&&a%10<=4&&(a%100<10||a%100>=20)?t[1]:t[2]}function t(a,t,n){var r={mm:t?"минута_минуты_минут":"минуту_минуты_минут",hh:"чаÑ_чаÑа_чаÑов",dd:"день_днÑ_дней",MM:"меÑÑц_меÑÑца_меÑÑцев",yy:"год_года_лет"};return"m"===n?t?"минута":"минуту":a+" "+e(r[n],+a)}var n=[/^Ñнв/i,/^фев/i,/^мар/i,/^апр/i,/^ма[йÑ]/i,/^июн/i,/^июл/i,/^авг/i,/^Ñен/i,/^окт/i,/^ноÑ/i,/^дек/i],r=a.defineLocale("ru",{months:{format:"ÑнварÑ_февралÑ_марта_апрелÑ_маÑ_июнÑ_июлÑ_авгуÑта_ÑентÑбрÑ_октÑбрÑ_ноÑбрÑ_декабрÑ".split("_"),standalone:"Ñнварь_февраль_март_апрель_май_июнь_июль_авгуÑÑ‚_ÑентÑбрь_октÑбрь_ноÑбрь_декабрь".split("_")},monthsShort:{format:"Ñнв._февр._мар._апр._маÑ_июнÑ_июлÑ_авг._Ñент._окт._ноÑб._дек.".split("_"),standalone:"Ñнв._февр._март_апр._май_июнь_июль_авг._Ñент._окт._ноÑб._дек.".split("_")},weekdays:{standalone:"воÑкреÑенье_понедельник_вторник_Ñреда_четверг_пÑтница_Ñуббота".split("_"),format:"воÑкреÑенье_понедельник_вторник_Ñреду_четверг_пÑтницу_Ñубботу".split("_"),isFormat:/\[ ?[Вв] ?(?:прошлую|Ñледующую|Ñту)? ?\] ?dddd/},weekdaysShort:"вÑ_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),weekdaysMin:"вÑ_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),monthsParse:n,longMonthsParse:n,shortMonthsParse:n,monthsRegex:/^(Ñнвар[ÑŒÑ]|Ñнв\.?|феврал[ÑŒÑ]|февр?\.?|марта?|мар\.?|апрел[ÑŒÑ]|апр\.?|ма[йÑ]|июн[ÑŒÑ]|июн\.?|июл[ÑŒÑ]|июл\.?|авгуÑта?|авг\.?|ÑентÑбр[ÑŒÑ]|Ñент?\.?|октÑбр[ÑŒÑ]|окт\.?|ноÑбр[ÑŒÑ]|ноÑб?\.?|декабр[ÑŒÑ]|дек\.?)/i,monthsShortRegex:/^(Ñнвар[ÑŒÑ]|Ñнв\.?|феврал[ÑŒÑ]|февр?\.?|марта?|мар\.?|апрел[ÑŒÑ]|апр\.?|ма[йÑ]|июн[ÑŒÑ]|июн\.?|июл[ÑŒÑ]|июл\.?|авгуÑта?|авг\.?|ÑентÑбр[ÑŒÑ]|Ñент?\.?|октÑбр[ÑŒÑ]|окт\.?|ноÑбр[ÑŒÑ]|ноÑб?\.?|декабр[ÑŒÑ]|дек\.?)/i,monthsStrictRegex:/^(Ñнвар[ÑÑŒ]|феврал[ÑÑŒ]|марта?|апрел[ÑÑŒ]|ма[Ñй]|июн[ÑÑŒ]|июл[ÑÑŒ]|авгуÑта?|ÑентÑбр[ÑÑŒ]|октÑбр[ÑÑŒ]|ноÑбр[ÑÑŒ]|декабр[ÑÑŒ])/i,monthsShortStrictRegex:/^(Ñнв\.|февр?\.|мар[Ñ‚.]|апр\.|ма[Ñй]|июн[ÑŒÑ.]|июл[ÑŒÑ.]|авг\.|Ñент?\.|окт\.|ноÑб?\.|дек\.)/i,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY г.",LLL:"D MMMM YYYY г., HH:mm",LLLL:"dddd, D MMMM YYYY г., HH:mm"},calendar:{sameDay:"[Ð¡ÐµÐ³Ð¾Ð´Ð½Ñ Ð²] LT",nextDay:"[Завтра в] LT",lastDay:"[Вчера в] LT",nextWeek:function(e){if(e.week()===this.week())return 2===this.day()?"[Во] dddd [в] LT":"[Ð’] dddd [в] LT";switch(this.day()){case 0:return"[Ð’ Ñледующее] dddd [в] LT";case 1:case 2:case 4:return"[Ð’ Ñледующий] dddd [в] LT";case 3:case 5:case 6:return"[Ð’ Ñледующую] dddd [в] LT"}},lastWeek:function(e){if(e.week()===this.week())return 2===this.day()?"[Во] dddd [в] LT":"[Ð’] dddd [в] LT";switch(this.day()){case 0:return"[Ð’ прошлое] dddd [в] LT";case 1:case 2:case 4:return"[Ð’ прошлый] dddd [в] LT";case 3:case 5:case 6:return"[Ð’ прошлую] dddd [в] LT"}},sameElse:"L"},relativeTime:{future:"через %s",past:"%s назад",s:"неÑколько Ñекунд",m:t,mm:t,h:"чаÑ",hh:t,d:"день",dd:t,M:"меÑÑц",MM:t,y:"год",yy:t},meridiemParse:/ночи|утра|днÑ|вечера/i,isPM:function(e){return/^(днÑ|вечера)$/.test(e)},meridiem:function(e,a,t){return e<4?"ночи":e<12?"утра":e<17?"днÑ":"вечера"},ordinalParse:/\d{1,2}-(й|го|Ñ)/,ordinal:function(e,a){switch(a){case"M":case"d":case"DDD":return e+"-й";case"D":return e+"-го";case"w":case"W":return e+"-Ñ";default:return e}},week:{dow:1,doy:7}});return r}(),e.fullCalendar.datepickerLocale("ru","ru",{closeText:"Закрыть",prevText:"&#x3C;Пред",nextText:"След&#x3E;",currentText:"СегоднÑ",monthNames:["Январь","Февраль","Март","Ðпрель","Май","Июнь","Июль","ÐвгуÑÑ‚","СентÑбрь","ОктÑбрь","ÐоÑбрь","Декабрь"],monthNamesShort:["Янв","Фев","Мар","Ðпр","Май","Июн","Июл","Ðвг","Сен","Окт","ÐоÑ","Дек"],dayNames:["воÑкреÑенье","понедельник","вторник","Ñреда","четверг","пÑтница","Ñуббота"],dayNamesShort:["вÑк","пнд","втр","Ñрд","чтв","птн","Ñбт"],dayNamesMin:["Ð’Ñ","Пн","Ð’Ñ‚","Ср","Чт","Пт","Сб"],weekHeader:"Ðед",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("ru",{buttonText:{month:"МеÑÑц",week:"ÐеделÑ",day:"День",list:"ПовеÑтка днÑ"},allDayText:"ВеÑÑŒ день",eventLimitText:function(e){return"+ ещё "+e},noEventsMessage:"Ðет Ñобытий Ð´Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ"})}(),function(){!function(){function e(e){return e>1&&e<5}function t(a,t,n,r){var s=a+" ";switch(n){case"s":return t||r?"pár sekúnd":"pár sekundami";case"m":return t?"minúta":r?"minútu":"minútou";case"mm":return t||r?s+(e(a)?"minúty":"minút"):s+"minútami";case"h":return t?"hodina":r?"hodinu":"hodinou";case"hh":return t||r?s+(e(a)?"hodiny":"hodín"):s+"hodinami";case"d":return t||r?"deň":"dňom";case"dd":return t||r?s+(e(a)?"dni":"dní"):s+"dňami";case"M":return t||r?"mesiac":"mesiacom";case"MM":return t||r?s+(e(a)?"mesiace":"mesiacov"):s+"mesiacmi";case"y":return t||r?"rok":"rokom";case"yy":return t||r?s+(e(a)?"roky":"rokov"):s+"rokmi"}}var n="január_február_marec_apríl_máj_jún_júl_august_september_október_november_december".split("_"),r="jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec".split("_"),s=a.defineLocale("sk",{months:n,monthsShort:r,weekdays:"nedeľa_pondelok_utorok_streda_Å¡tvrtok_piatok_sobota".split("_"),weekdaysShort:"ne_po_ut_st_Å¡t_pi_so".split("_"),weekdaysMin:"ne_po_ut_st_Å¡t_pi_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm"},calendar:{sameDay:"[dnes o] LT",nextDay:"[zajtra o] LT",nextWeek:function(){switch(this.day()){case 0:return"[v nedeľu o] LT";case 1:case 2:return"[v] dddd [o] LT";case 3:return"[v stredu o] LT";case 4:return"[vo Å¡tvrtok o] LT";case 5:return"[v piatok o] LT";case 6:return"[v sobotu o] LT"}},lastDay:"[vÄera o] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulú nedeľu o] LT";case 1:case 2:return"[minulý] dddd [o] LT";case 3:return"[minulú stredu o] LT";case 4:case 5:return"[minulý] dddd [o] LT";case 6:return"[minulú sobotu o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"pred %s",s:t,m:t,mm:t,h:t,hh:t,d:t,dd:t,M:t,MM:t,y:t,yy:t},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return s}(),e.fullCalendar.datepickerLocale("sk","sk",{closeText:"ZavrieÅ¥",prevText:"&#x3C;Predchádzajúci",nextText:"Nasledujúci&#x3E;",currentText:"Dnes",monthNames:["január","február","marec","apríl","máj","jún","júl","august","september","október","november","december"],monthNamesShort:["Jan","Feb","Mar","Apr","Máj","Jún","Júl","Aug","Sep","Okt","Nov","Dec"],dayNames:["nedeľa","pondelok","utorok","streda","Å¡tvrtok","piatok","sobota"],dayNamesShort:["Ned","Pon","Uto","Str","Å tv","Pia","Sob"],dayNamesMin:["Ne","Po","Ut","St","Å t","Pia","So"],weekHeader:"Ty",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("sk",{buttonText:{month:"Mesiac",week:"Týždeň",day:"Deň",list:"Rozvrh"},allDayText:"Celý deň",eventLimitText:function(e){return"+ÄalÅ¡ie: "+e},noEventsMessage:"Žiadne akcie na zobrazenie"})}(),function(){!function(){function e(e,a,t,n){var r=e+" ";switch(t){case"s":return a||n?"nekaj sekund":"nekaj sekundami";case"m":return a?"ena minuta":"eno minuto";case"mm":return r+=1===e?a?"minuta":"minuto":2===e?a||n?"minuti":"minutama":e<5?a||n?"minute":"minutami":a||n?"minut":"minutami";case"h":return a?"ena ura":"eno uro";case"hh":return r+=1===e?a?"ura":"uro":2===e?a||n?"uri":"urama":e<5?a||n?"ure":"urami":a||n?"ur":"urami";case"d":return a||n?"en dan":"enim dnem";case"dd":return r+=1===e?a||n?"dan":"dnem":2===e?a||n?"dni":"dnevoma":a||n?"dni":"dnevi";case"M":return a||n?"en mesec":"enim mesecem";case"MM":return r+=1===e?a||n?"mesec":"mesecem":2===e?a||n?"meseca":"mesecema":e<5?a||n?"mesece":"meseci":a||n?"mesecev":"meseci";case"y":return a||n?"eno leto":"enim letom";case"yy":return r+=1===e?a||n?"leto":"letom":2===e?a||n?"leti":"letoma":e<5?a||n?"leta":"leti":a||n?"let":"leti"}}var t=a.defineLocale("sl",{months:"januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedelja_ponedeljek_torek_sreda_Äetrtek_petek_sobota".split("_"),weekdaysShort:"ned._pon._tor._sre._Äet._pet._sob.".split("_"),weekdaysMin:"ne_po_to_sr_Äe_pe_so".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danes ob] LT",nextDay:"[jutri ob] LT",nextWeek:function(){switch(this.day()){case 0:return"[v] [nedeljo] [ob] LT";case 3:return"[v] [sredo] [ob] LT";case 6:return"[v] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[v] dddd [ob] LT"}},lastDay:"[vÄeraj ob] LT",lastWeek:function(){switch(this.day()){case 0:return"[prejÅ¡njo] [nedeljo] [ob] LT";case 3:return"[prejÅ¡njo] [sredo] [ob] LT";case 6:return"[prejÅ¡njo] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[prejÅ¡nji] dddd [ob] LT"}},sameElse:"L"},relativeTime:{future:"Äez %s",past:"pred %s",s:e,m:e,mm:e,h:e,hh:e,d:e,dd:e,M:e,MM:e,y:e,yy:e},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}});return t}(),e.fullCalendar.datepickerLocale("sl","sl",{closeText:"Zapri",prevText:"&#x3C;PrejÅ¡nji",nextText:"Naslednji&#x3E;",currentText:"Trenutni",monthNames:["Januar","Februar","Marec","April","Maj","Junij","Julij","Avgust","September","Oktober","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Avg","Sep","Okt","Nov","Dec"],dayNames:["Nedelja","Ponedeljek","Torek","Sreda","ÄŒetrtek","Petek","Sobota"],dayNamesShort:["Ned","Pon","Tor","Sre","ÄŒet","Pet","Sob"],dayNamesMin:["Ne","Po","To","Sr","ÄŒe","Pe","So"],weekHeader:"Teden",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("sl",{buttonText:{month:"Mesec",week:"Teden",day:"Dan",list:"Dnevni red"},allDayText:"Ves dan",eventLimitText:"veÄ",noEventsMessage:"Ni dogodkov za prikaz"})}(),function(){!function(){var e={words:{m:["jedan minut","jedne minute"],mm:["minut","minute","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],dd:["dan","dana","dana"],MM:["mesec","meseca","meseci"],yy:["godina","godine","godina"]},correctGrammaticalCase:function(e,a){return 1===e?a[0]:e>=2&&e<=4?a[1]:a[2]},translate:function(a,t,n){var r=e.words[n];return 1===n.length?t?r[0]:r[1]:a+" "+e.correctGrammaticalCase(a,r)}},t=a.defineLocale("sr",{months:"januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedelja_ponedeljak_utorak_sreda_Äetvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sre._Äet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_Äe_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedelju] [u] LT";case 3:return"[u] [sredu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[juÄe u] LT",lastWeek:function(){var e=["[proÅ¡le] [nedelje] [u] LT","[proÅ¡log] [ponedeljka] [u] LT","[proÅ¡log] [utorka] [u] LT","[proÅ¡le] [srede] [u] LT","[proÅ¡log] [Äetvrtka] [u] LT","[proÅ¡log] [petka] [u] LT","[proÅ¡le] [subote] [u] LT"];return e[this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"pre %s",s:"nekoliko sekundi",m:e.translate,mm:e.translate,h:e.translate,hh:e.translate,d:"dan",dd:e.translate,M:"mesec",MM:e.translate,y:"godinu",yy:e.translate},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}});return t}(),e.fullCalendar.datepickerLocale("sr","sr",{closeText:"Затвори",prevText:"&#x3C;",nextText:"&#x3E;",currentText:"ДанаÑ",monthNames:["Јануар","Фебруар","Март","Ðприл","Мај","Јун","Јул","ÐвгуÑÑ‚","Септембар","Октобар","Ðовембар","Децембар"],monthNamesShort:["Јан","Феб","Мар","Ðпр","Мај","Јун","Јул","Ðвг","Сеп","Окт","Ðов","Дец"],dayNames:["Ðедеља","Понедељак","Уторак","Среда","Четвртак","Петак","Субота"],dayNamesShort:["Ðед","Пон","Уто","Сре","Чет","Пет","Суб"],dayNamesMin:["Ðе","По","Ут","Ср","Че","Пе","Су"],weekHeader:"Сед",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("sr",{buttonText:{month:"МеÑец",week:"Ðедеља",day:"Дан",list:"Планер"},allDayText:"Цео дан",eventLimitText:function(e){return"+ још "+e},noEventsMessage:"Ðема догађаја за приказ"})}(),function(){!function(){var e={words:{m:["један минут","једне минуте"],mm:["минут","минуте","минута"],h:["један Ñат","једног Ñата"],hh:["Ñат","Ñата","Ñати"],dd:["дан","дана","дана"],MM:["меÑец","меÑеца","меÑеци"],yy:["година","године","година"]},correctGrammaticalCase:function(e,a){return 1===e?a[0]:e>=2&&e<=4?a[1]:a[2]},translate:function(a,t,n){var r=e.words[n];return 1===n.length?t?r[0]:r[1]:a+" "+e.correctGrammaticalCase(a,r)}},t=a.defineLocale("sr-cyrl",{months:"јануар_фебруар_март_април_мај_јун_јул_авгуÑÑ‚_Ñептембар_октобар_новембар_децембар".split("_"),monthsShort:"јан._феб._мар._апр._мај_јун_јул_авг._Ñеп._окт._нов._дец.".split("_"),monthsParseExact:!0,weekdays:"недеља_понедељак_уторак_Ñреда_четвртак_петак_Ñубота".split("_"),weekdaysShort:"нед._пон._уто._Ñре._чет._пет._Ñуб.".split("_"),weekdaysMin:"не_по_ут_ÑÑ€_че_пе_Ñу".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[Ð´Ð°Ð½Ð°Ñ Ñƒ] LT",nextDay:"[Ñутра у] LT",nextWeek:function(){switch(this.day()){case 0:return"[у] [недељу] [у] LT";case 3:return"[у] [Ñреду] [у] LT";case 6:return"[у] [Ñуботу] [у] LT";case 1:case 2:case 4:case 5:return"[у] dddd [у] LT"}},lastDay:"[јуче у] LT",lastWeek:function(){var e=["[прошле] [недеље] [у] LT","[прошлог] [понедељка] [у] LT","[прошлог] [уторка] [у] LT","[прошле] [Ñреде] [у] LT","[прошлог] [четвртка] [у] LT","[прошлог] [петка] [у] LT","[прошле] [Ñуботе] [у] LT"];return e[this.day()]},sameElse:"L"},relativeTime:{future:"за %s",past:"пре %s",s:"неколико Ñекунди",m:e.translate,mm:e.translate,h:e.translate,hh:e.translate,d:"дан",dd:e.translate,M:"меÑец",MM:e.translate,y:"годину",yy:e.translate},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}});return t}(),e.fullCalendar.datepickerLocale("sr-cyrl","sr",{closeText:"Затвори",prevText:"&#x3C;",nextText:"&#x3E;",currentText:"ДанаÑ",monthNames:["Јануар","Фебруар","Март","Ðприл","Мај","Јун","Јул","ÐвгуÑÑ‚","Септембар","Октобар","Ðовембар","Децембар"],monthNamesShort:["Јан","Феб","Мар","Ðпр","Мај","Јун","Јул","Ðвг","Сеп","Окт","Ðов","Дец"],dayNames:["Ðедеља","Понедељак","Уторак","Среда","Четвртак","Петак","Субота"],dayNamesShort:["Ðед","Пон","Уто","Сре","Чет","Пет","Суб"],dayNamesMin:["Ðе","По","Ут","Ср","Че","Пе","Су"],weekHeader:"Сед",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("sr-cyrl",{buttonText:{month:"МеÑец",week:"Ðедеља",day:"Дан",list:"Планер"},allDayText:"Цео дан",eventLimitText:function(e){return"+ још "+e},noEventsMessage:"Ðема догађаја за приказ"})}(),function(){!function(){var e=a.defineLocale("sv",{months:"januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"söndag_mÃ¥ndag_tisdag_onsdag_torsdag_fredag_lördag".split("_"),weekdaysShort:"sön_mÃ¥n_tis_ons_tor_fre_lör".split("_"),weekdaysMin:"sö_mÃ¥_ti_on_to_fr_lö".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [kl.] HH:mm",LLLL:"dddd D MMMM YYYY [kl.] HH:mm",lll:"D MMM YYYY HH:mm",llll:"ddd D MMM YYYY HH:mm"},calendar:{sameDay:"[Idag] LT",nextDay:"[Imorgon] LT",lastDay:"[IgÃ¥r] LT",nextWeek:"[PÃ¥] dddd LT",lastWeek:"[I] dddd[s] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"för %s sedan",s:"nÃ¥gra sekunder",m:"en minut",mm:"%d minuter",h:"en timme",hh:"%d timmar",d:"en dag",dd:"%d dagar",M:"en mÃ¥nad",MM:"%d mÃ¥nader",y:"ett Ã¥r",yy:"%d Ã¥r"},ordinalParse:/\d{1,2}(e|a)/,ordinal:function(e){var a=e%10,t=1===~~(e%100/10)?"e":1===a?"a":2===a?"a":"e";return e+t},week:{dow:1,doy:4}});return e}(),e.fullCalendar.datepickerLocale("sv","sv",{closeText:"Stäng",prevText:"&#xAB;Förra",nextText:"Nästa&#xBB;",currentText:"Idag",monthNames:["Januari","Februari","Mars","April","Maj","Juni","Juli","Augusti","September","Oktober","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],dayNamesShort:["Sön","MÃ¥n","Tis","Ons","Tor","Fre","Lör"],dayNames:["Söndag","MÃ¥ndag","Tisdag","Onsdag","Torsdag","Fredag","Lördag"],dayNamesMin:["Sö","MÃ¥","Ti","On","To","Fr","Lö"],weekHeader:"Ve",dateFormat:"yy-mm-dd",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("sv",{buttonText:{month:"MÃ¥nad",week:"Vecka",day:"Dag",list:"Program"},allDayText:"Heldag",eventLimitText:"till",noEventsMessage:"Inga händelser att visa"})}(),function(){!function(){var e=a.defineLocale("th",{months:"มà¸à¸£à¸²à¸„ม_à¸à¸¸à¸¡à¸ à¸²à¸žà¸±à¸™à¸˜à¹Œ_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_à¸à¸£à¸à¸Žà¸²à¸„ม_สิงหาคม_à¸à¸±à¸™à¸¢à¸²à¸¢à¸™_ตุลาคม_พฤศจิà¸à¸²à¸¢à¸™_ธันวาคม".split("_"),monthsShort:"ม.ค._à¸.พ._มี.ค._เม.ย._พ.ค._มิ.ย._à¸.ค._ส.ค._à¸.ย._ต.ค._พ.ย._ธ.ค.".split("_"),monthsParseExact:!0,weekdays:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุà¸à¸£à¹Œ_เสาร์".split("_"),weekdaysShort:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุà¸à¸£à¹Œ_เสาร์".split("_"),weekdaysMin:"อา._จ._อ._พ._พฤ._ศ._ส.".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"YYYY/MM/DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY เวลา H:mm",LLLL:"วันddddที่ D MMMM YYYY เวลา H:mm"},meridiemParse:/à¸à¹ˆà¸­à¸™à¹€à¸—ี่ยง|หลังเที่ยง/,isPM:function(e){return"หลังเที่ยง"===e},meridiem:function(e,a,t){return e<12?"à¸à¹ˆà¸­à¸™à¹€à¸—ี่ยง":"หลังเที่ยง"},calendar:{sameDay:"[วันนี้ เวลา] LT",nextDay:"[พรุ่งนี้ เวลา] LT",nextWeek:"dddd[หน้า เวลา] LT",lastDay:"[เมื่อวานนี้ เวลา] LT",lastWeek:"[วัน]dddd[ที่à¹à¸¥à¹‰à¸§ เวลา] LT",sameElse:"L"},relativeTime:{future:"อีภ%s",past:"%sที่à¹à¸¥à¹‰à¸§",s:"ไม่à¸à¸µà¹ˆà¸§à¸´à¸™à¸²à¸—ี",m:"1 นาที",mm:"%d นาที",h:"1 ชั่วโมง",hh:"%d ชั่วโมง",d:"1 วัน",dd:"%d วัน",M:"1 เดือน",MM:"%d เดือน",
+y:"1 ปี",yy:"%d ปี"}});return e}(),e.fullCalendar.datepickerLocale("th","th",{closeText:"ปิด",prevText:"&#xAB;&#xA0;ย้อน",nextText:"ถัดไป&#xA0;&#xBB;",currentText:"วันนี้",monthNames:["มà¸à¸£à¸²à¸„ม","à¸à¸¸à¸¡à¸ à¸²à¸žà¸±à¸™à¸˜à¹Œ","มีนาคม","เมษายน","พฤษภาคม","มิถุนายน","à¸à¸£à¸à¸Žà¸²à¸„ม","สิงหาคม","à¸à¸±à¸™à¸¢à¸²à¸¢à¸™","ตุลาคม","พฤศจิà¸à¸²à¸¢à¸™","ธันวาคม"],monthNamesShort:["ม.ค.","à¸.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","à¸.ค.","ส.ค.","à¸.ย.","ต.ค.","พ.ย.","ธ.ค."],dayNames:["อาทิตย์","จันทร์","อังคาร","พุธ","พฤหัสบดี","ศุà¸à¸£à¹Œ","เสาร์"],dayNamesShort:["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],dayNamesMin:["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("th",{buttonText:{month:"เดือน",week:"สัปดาห์",day:"วัน",list:"à¹à¸œà¸™à¸‡à¸²à¸™"},allDayText:"ตลอดวัน",eventLimitText:"เพิ่มเติม",noEventsMessage:"ไม่มีà¸à¸´à¸ˆà¸à¸£à¸£à¸¡à¸—ี่จะà¹à¸ªà¸”ง"})}(),function(){!function(){var e={1:"'inci",5:"'inci",8:"'inci",70:"'inci",80:"'inci",2:"'nci",7:"'nci",20:"'nci",50:"'nci",3:"'üncü",4:"'üncü",100:"'üncü",6:"'ncı",9:"'uncu",10:"'uncu",30:"'uncu",60:"'ıncı",90:"'ıncı"},t=a.defineLocale("tr",{months:"Ocak_Åžubat_Mart_Nisan_Mayıs_Haziran_Temmuz_AÄŸustos_Eylül_Ekim_Kasım_Aralık".split("_"),monthsShort:"Oca_Åžub_Mar_Nis_May_Haz_Tem_AÄŸu_Eyl_Eki_Kas_Ara".split("_"),weekdays:"Pazar_Pazartesi_Salı_ÇarÅŸamba_PerÅŸembe_Cuma_Cumartesi".split("_"),weekdaysShort:"Paz_Pts_Sal_Çar_Per_Cum_Cts".split("_"),weekdaysMin:"Pz_Pt_Sa_Ça_Pe_Cu_Ct".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[bugün saat] LT",nextDay:"[yarın saat] LT",nextWeek:"[haftaya] dddd [saat] LT",lastDay:"[dün] LT",lastWeek:"[geçen hafta] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s önce",s:"birkaç saniye",m:"bir dakika",mm:"%d dakika",h:"bir saat",hh:"%d saat",d:"bir gün",dd:"%d gün",M:"bir ay",MM:"%d ay",y:"bir yıl",yy:"%d yıl"},ordinalParse:/\d{1,2}'(inci|nci|üncü|ncı|uncu|ıncı)/,ordinal:function(a){if(0===a)return a+"'ıncı";var t=a%10,n=a%100-t,r=a>=100?100:null;return a+(e[t]||e[n]||e[r])},week:{dow:1,doy:7}});return t}(),e.fullCalendar.datepickerLocale("tr","tr",{closeText:"kapat",prevText:"&#x3C;geri",nextText:"ileri&#x3e",currentText:"bugün",monthNames:["Ocak","Åžubat","Mart","Nisan","Mayıs","Haziran","Temmuz","AÄŸustos","Eylül","Ekim","Kasım","Aralık"],monthNamesShort:["Oca","Åžub","Mar","Nis","May","Haz","Tem","AÄŸu","Eyl","Eki","Kas","Ara"],dayNames:["Pazar","Pazartesi","Salı","ÇarÅŸamba","PerÅŸembe","Cuma","Cumartesi"],dayNamesShort:["Pz","Pt","Sa","Ça","Pe","Cu","Ct"],dayNamesMin:["Pz","Pt","Sa","Ça","Pe","Cu","Ct"],weekHeader:"Hf",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("tr",{buttonText:{next:"ileri",month:"Ay",week:"Hafta",day:"Gün",list:"Ajanda"},allDayText:"Tüm gün",eventLimitText:"daha fazla",noEventsMessage:"Herhangi bir etkinlik görüntülemek için"})}(),function(){!function(){function e(e,a){var t=e.split("_");return a%10===1&&a%100!==11?t[0]:a%10>=2&&a%10<=4&&(a%100<10||a%100>=20)?t[1]:t[2]}function t(a,t,n){var r={mm:t?"хвилина_хвилини_хвилин":"хвилину_хвилини_хвилин",hh:t?"година_години_годин":"годину_години_годин",dd:"день_дні_днів",MM:"міÑÑць_міÑÑці_міÑÑців",yy:"рік_роки_років"};return"m"===n?t?"хвилина":"хвилину":"h"===n?t?"година":"годину":a+" "+e(r[n],+a)}function n(e,a){var t={nominative:"неділÑ_понеділок_вівторок_Ñереда_четвер_п’ÑтницÑ_Ñубота".split("_"),accusative:"неділю_понеділок_вівторок_Ñереду_четвер_п’Ñтницю_Ñуботу".split("_"),genitive:"неділі_понеділка_вівторка_Ñереди_четверга_п’Ñтниці_Ñуботи".split("_")},n=/(\[[ВвУу]\]) ?dddd/.test(a)?"accusative":/\[?(?:минулої|наÑтупної)? ?\] ?dddd/.test(a)?"genitive":"nominative";return t[n][e.day()]}function r(e){return function(){return e+"о"+(11===this.hours()?"б":"")+"] LT"}}var s=a.defineLocale("uk",{months:{format:"ÑічнÑ_лютого_березнÑ_квітнÑ_травнÑ_червнÑ_липнÑ_ÑерпнÑ_вереÑнÑ_жовтнÑ_лиÑтопада_груднÑ".split("_"),standalone:"Ñічень_лютий_березень_квітень_травень_червень_липень_Ñерпень_вереÑень_жовтень_лиÑтопад_грудень".split("_")},monthsShort:"Ñіч_лют_бер_квіт_трав_черв_лип_Ñерп_вер_жовт_лиÑÑ‚_груд".split("_"),weekdays:n,weekdaysShort:"нд_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),weekdaysMin:"нд_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY Ñ€.",LLL:"D MMMM YYYY Ñ€., HH:mm",LLLL:"dddd, D MMMM YYYY Ñ€., HH:mm"},calendar:{sameDay:r("[Сьогодні "),nextDay:r("[Завтра "),lastDay:r("[Вчора "),nextWeek:r("[У] dddd ["),lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return r("[Минулої] dddd [").call(this);case 1:case 2:case 4:return r("[Минулого] dddd [").call(this)}},sameElse:"L"},relativeTime:{future:"за %s",past:"%s тому",s:"декілька Ñекунд",m:t,mm:t,h:"годину",hh:t,d:"день",dd:t,M:"міÑÑць",MM:t,y:"рік",yy:t},meridiemParse:/ночі|ранку|днÑ|вечора/,isPM:function(e){return/^(днÑ|вечора)$/.test(e)},meridiem:function(e,a,t){return e<4?"ночі":e<12?"ранку":e<17?"днÑ":"вечора"},ordinalParse:/\d{1,2}-(й|го)/,ordinal:function(e,a){switch(a){case"M":case"d":case"DDD":case"w":case"W":return e+"-й";case"D":return e+"-го";default:return e}},week:{dow:1,doy:7}});return s}(),e.fullCalendar.datepickerLocale("uk","uk",{closeText:"Закрити",prevText:"&#x3C;",nextText:"&#x3E;",currentText:"Сьогодні",monthNames:["Січень","Лютий","Березень","Квітень","Травень","Червень","Липень","Серпень","ВереÑень","Жовтень","ЛиÑтопад","Грудень"],monthNamesShort:["Січ","Лют","Бер","Кві","Тра","Чер","Лип","Сер","Вер","Жов","ЛиÑ","Гру"],dayNames:["неділÑ","понеділок","вівторок","Ñереда","четвер","п’ÑтницÑ","Ñубота"],dayNamesShort:["нед","пнд","вів","Ñрд","чтв","птн","Ñбт"],dayNamesMin:["Ðд","Пн","Ð’Ñ‚","Ср","Чт","Пт","Сб"],weekHeader:"Тиж",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("uk",{buttonText:{month:"МіÑÑць",week:"Тиждень",day:"День",list:"ПорÑдок денний"},allDayText:"УвеÑÑŒ день",eventLimitText:function(e){return"+ще "+e+"..."},noEventsMessage:"Ðемає подій Ð´Ð»Ñ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ"})}(),function(){!function(){var e=a.defineLocale("vi",{months:"tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12".split("_"),monthsShort:"Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12".split("_"),monthsParseExact:!0,weekdays:"chủ nhật_thứ hai_thứ ba_thứ tÆ°_thứ năm_thứ sáu_thứ bảy".split("_"),weekdaysShort:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysMin:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysParseExact:!0,meridiemParse:/sa|ch/i,isPM:function(e){return/^ch$/i.test(e)},meridiem:function(e,a,t){return e<12?t?"sa":"SA":t?"ch":"CH"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [năm] YYYY",LLL:"D MMMM [năm] YYYY HH:mm",LLLL:"dddd, D MMMM [năm] YYYY HH:mm",l:"DD/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},calendar:{sameDay:"[Hôm nay lúc] LT",nextDay:"[Ngày mai lúc] LT",nextWeek:"dddd [tuần tá»›i lúc] LT",lastDay:"[Hôm qua lúc] LT",lastWeek:"dddd [tuần rồi lúc] LT",sameElse:"L"},relativeTime:{future:"%s tá»›i",past:"%s trÆ°á»›c",s:"vài giây",m:"má»™t phút",mm:"%d phút",h:"má»™t giá»",hh:"%d giá»",d:"má»™t ngày",dd:"%d ngày",M:"má»™t tháng",MM:"%d tháng",y:"má»™t năm",yy:"%d năm"},ordinalParse:/\d{1,2}/,ordinal:function(e){return e},week:{dow:1,doy:4}});return e}(),e.fullCalendar.datepickerLocale("vi","vi",{closeText:"Äóng",prevText:"&#x3C;TrÆ°á»›c",nextText:"Tiếp&#x3E;",currentText:"Hôm nay",monthNames:["Tháng Má»™t","Tháng Hai","Tháng Ba","Tháng TÆ°","Tháng Năm","Tháng Sáu","Tháng Bảy","Tháng Tám","Tháng Chín","Tháng MÆ°á»i","Tháng MÆ°á»i Má»™t","Tháng MÆ°á»i Hai"],monthNamesShort:["Tháng 1","Tháng 2","Tháng 3","Tháng 4","Tháng 5","Tháng 6","Tháng 7","Tháng 8","Tháng 9","Tháng 10","Tháng 11","Tháng 12"],dayNames:["Chủ Nhật","Thứ Hai","Thứ Ba","Thứ TÆ°","Thứ Năm","Thứ Sáu","Thứ Bảy"],dayNamesShort:["CN","T2","T3","T4","T5","T6","T7"],dayNamesMin:["CN","T2","T3","T4","T5","T6","T7"],weekHeader:"Tu",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("vi",{buttonText:{month:"Tháng",week:"Tuần",day:"Ngày",list:"Lịch biểu"},allDayText:"Cả ngày",eventLimitText:function(e){return"+ thêm "+e},noEventsMessage:"Không có sá»± kiện để hiển thị"})}(),function(){!function(){var e=a.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_七月_八月_ä¹æœˆ_å月_å一月_å二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"周日_周一_周二_周三_周四_周五_周六".split("_"),weekdaysMin:"æ—¥_一_二_三_å››_五_å…­".split("_"),longDateFormat:{LT:"Ah点mm分",LTS:"Ah点m分s秒",L:"YYYY-MM-DD",LL:"YYYYå¹´MMMDæ—¥",LLL:"YYYYå¹´MMMDæ—¥Ah点mm分",LLLL:"YYYYå¹´MMMDæ—¥ddddAh点mm分",l:"YYYY-MM-DD",ll:"YYYYå¹´MMMDæ—¥",lll:"YYYYå¹´MMMDæ—¥Ah点mm分",llll:"YYYYå¹´MMMDæ—¥ddddAh点mm分"},meridiemParse:/凌晨|早上|上åˆ|中åˆ|下åˆ|晚上/,meridiemHour:function(e,a){return 12===e&&(e=0),"凌晨"===a||"早上"===a||"上åˆ"===a?e:"下åˆ"===a||"晚上"===a?e+12:e>=11?e:e+12},meridiem:function(e,a,t){var n=100*e+a;return n<600?"凌晨":n<900?"早上":n<1130?"上åˆ":n<1230?"中åˆ":n<1800?"下åˆ":"晚上"},calendar:{sameDay:function(){return 0===this.minutes()?"[今天]Ah[点整]":"[今天]LT"},nextDay:function(){return 0===this.minutes()?"[明天]Ah[点整]":"[明天]LT"},lastDay:function(){return 0===this.minutes()?"[昨天]Ah[点整]":"[昨天]LT"},nextWeek:function(){var e,t;return e=a().startOf("week"),t=this.diff(e,"days")>=7?"[下]":"[本]",0===this.minutes()?t+"dddAh点整":t+"dddAh点mm"},lastWeek:function(){var e,t;return e=a().startOf("week"),t=this.unix()<e.unix()?"[上]":"[本]",0===this.minutes()?t+"dddAh点整":t+"dddAh点mm"},sameElse:"LL"},ordinalParse:/\d{1,2}(æ—¥|月|周)/,ordinal:function(e,a){switch(a){case"d":case"D":case"DDD":return e+"æ—¥";case"M":return e+"月";case"w":case"W":return e+"周";default:return e}},relativeTime:{future:"%s内",past:"%så‰",s:"几秒",m:"1 分钟",mm:"%d 分钟",h:"1 å°æ—¶",hh:"%d å°æ—¶",d:"1 天",dd:"%d 天",M:"1 个月",MM:"%d 个月",y:"1 å¹´",yy:"%d å¹´"},week:{dow:1,doy:4}});return e}(),e.fullCalendar.datepickerLocale("zh-cn","zh-CN",{closeText:"关闭",prevText:"&#x3C;上月",nextText:"下月&#x3E;",currentText:"今天",monthNames:["一月","二月","三月","四月","五月","六月","七月","八月","ä¹æœˆ","å月","å一月","å二月"],monthNamesShort:["一月","二月","三月","四月","五月","六月","七月","八月","ä¹æœˆ","å月","å一月","å二月"],dayNames:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],dayNamesShort:["周日","周一","周二","周三","周四","周五","周六"],dayNamesMin:["æ—¥","一","二","三","å››","五","å…­"],weekHeader:"周",dateFormat:"yy-mm-dd",firstDay:1,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"å¹´"}),e.fullCalendar.locale("zh-cn",{buttonText:{month:"月",week:"周",day:"æ—¥",list:"日程"},allDayText:"全天",eventLimitText:function(e){return"å¦å¤– "+e+" 个"},noEventsMessage:"没有事件显示"})}(),function(){!function(){var e=a.defineLocale("zh-tw",{months:"一月_二月_三月_四月_五月_六月_七月_八月_ä¹æœˆ_å月_å一月_å二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"週日_週一_週二_週三_週四_週五_週六".split("_"),weekdaysMin:"æ—¥_一_二_三_å››_五_å…­".split("_"),longDateFormat:{LT:"Ah點mm分",LTS:"Ah點m分s秒",L:"YYYYå¹´MMMDæ—¥",LL:"YYYYå¹´MMMDæ—¥",LLL:"YYYYå¹´MMMDæ—¥Ah點mm分",LLLL:"YYYYå¹´MMMDæ—¥ddddAh點mm分",l:"YYYYå¹´MMMDæ—¥",ll:"YYYYå¹´MMMDæ—¥",lll:"YYYYå¹´MMMDæ—¥Ah點mm分",llll:"YYYYå¹´MMMDæ—¥ddddAh點mm分"},meridiemParse:/凌晨|早上|上åˆ|中åˆ|下åˆ|晚上/,meridiemHour:function(e,a){return 12===e&&(e=0),"凌晨"===a||"早上"===a||"上åˆ"===a?e:"中åˆ"===a?e>=11?e:e+12:"下åˆ"===a||"晚上"===a?e+12:void 0},meridiem:function(e,a,t){var n=100*e+a;return n<600?"凌晨":n<900?"早上":n<1130?"上åˆ":n<1230?"中åˆ":n<1800?"下åˆ":"晚上"},calendar:{sameDay:"[今天]LT",nextDay:"[明天]LT",nextWeek:"[下]ddddLT",lastDay:"[昨天]LT",lastWeek:"[上]ddddLT",sameElse:"L"},ordinalParse:/\d{1,2}(æ—¥|月|週)/,ordinal:function(e,a){switch(a){case"d":case"D":case"DDD":return e+"æ—¥";case"M":return e+"月";case"w":case"W":return e+"週";default:return e}},relativeTime:{future:"%så…§",past:"%så‰",s:"幾秒",m:"1 分é˜",mm:"%d 分é˜",h:"1 å°æ™‚",hh:"%d å°æ™‚",d:"1 天",dd:"%d 天",M:"1 個月",MM:"%d 個月",y:"1 å¹´",yy:"%d å¹´"}});return e}(),e.fullCalendar.datepickerLocale("zh-tw","zh-TW",{closeText:"關閉",prevText:"&#x3C;上月",nextText:"下月&#x3E;",currentText:"今天",monthNames:["一月","二月","三月","四月","五月","六月","七月","八月","ä¹æœˆ","å月","å一月","å二月"],monthNamesShort:["一月","二月","三月","四月","五月","六月","七月","八月","ä¹æœˆ","å月","å一月","å二月"],dayNames:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],dayNamesShort:["周日","周一","周二","周三","周四","周五","周六"],dayNamesMin:["æ—¥","一","二","三","å››","五","å…­"],weekHeader:"周",dateFormat:"yy/mm/dd",firstDay:1,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"å¹´"}),e.fullCalendar.locale("zh-tw",{buttonText:{month:"月",week:"週",day:"天",list:"活動列表"},allDayText:"整天",eventLimitText:"顯示更多",noEventsMessage:"没有任何活動"})}(),a.locale("en"),e.fullCalendar.locale("en"),e.datepicker&&e.datepicker.setDefaults(e.datepicker.regional[""])}); \ No newline at end of file
diff --git a/library/htmlpurifier-4.6.0-lite/INSTALL b/library/htmlpurifier-4.6.0-lite/INSTALL
deleted file mode 100644
index 677c04aa0..000000000
--- a/library/htmlpurifier-4.6.0-lite/INSTALL
+++ /dev/null
@@ -1,374 +0,0 @@
-
-Install
- How to install HTML Purifier
-
-HTML Purifier is designed to run out of the box, so actually using the
-library is extremely easy. (Although... if you were looking for a
-step-by-step installation GUI, you've downloaded the wrong software!)
-
-While the impatient can get going immediately with some of the sample
-code at the bottom of this library, it's well worth reading this entire
-document--most of the other documentation assumes that you are familiar
-with these contents.
-
-
----------------------------------------------------------------------------
-1. Compatibility
-
-HTML Purifier is PHP 5 only, and is actively tested from PHP 5.0.5 and
-up. It has no core dependencies with other libraries. PHP
-4 support was deprecated on December 31, 2007 with HTML Purifier 3.0.0.
-HTML Purifier is not compatible with zend.ze1_compatibility_mode.
-
-These optional extensions can enhance the capabilities of HTML Purifier:
-
- * iconv : Converts text to and from non-UTF-8 encodings
- * bcmath : Used for unit conversion and imagecrash protection
- * tidy : Used for pretty-printing HTML
-
-These optional libraries can enhance the capabilities of HTML Purifier:
-
- * CSSTidy : Clean CSS stylesheets using %Core.ExtractStyleBlocks
- * Net_IDNA2 (PEAR) : IRI support using %Core.EnableIDNA
-
----------------------------------------------------------------------------
-2. Reconnaissance
-
-A big plus of HTML Purifier is its inerrant support of standards, so
-your web-pages should be standards-compliant. (They should also use
-semantic markup, but that's another issue altogether, one HTML Purifier
-cannot fix without reading your mind.)
-
-HTML Purifier can process these doctypes:
-
-* XHTML 1.0 Transitional (default)
-* XHTML 1.0 Strict
-* HTML 4.01 Transitional
-* HTML 4.01 Strict
-* XHTML 1.1
-
-...and these character encodings:
-
-* UTF-8 (default)
-* Any encoding iconv supports (with crippled internationalization support)
-
-These defaults reflect what my choices would be if I were authoring an
-HTML document, however, what you choose depends on the nature of your
-codebase. If you don't know what doctype you are using, you can determine
-the doctype from this identifier at the top of your source code:
-
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
-...and the character encoding from this code:
-
- <meta http-equiv="Content-type" content="text/html;charset=ENCODING">
-
-If the character encoding declaration is missing, STOP NOW, and
-read 'docs/enduser-utf8.html' (web accessible at
-http://htmlpurifier.org/docs/enduser-utf8.html). In fact, even if it is
-present, read this document anyway, as many websites specify their
-document's character encoding incorrectly.
-
-
----------------------------------------------------------------------------
-3. Including the library
-
-The procedure is quite simple:
-
- require_once '/path/to/library/HTMLPurifier.auto.php';
-
-This will setup an autoloader, so the library's files are only included
-when you use them.
-
-Only the contents in the library/ folder are necessary, so you can remove
-everything else when using HTML Purifier in a production environment.
-
-If you installed HTML Purifier via PEAR, all you need to do is:
-
- require_once 'HTMLPurifier.auto.php';
-
-Please note that the usual PEAR practice of including just the classes you
-want will not work with HTML Purifier's autoloading scheme.
-
-Advanced users, read on; other users can skip to section 4.
-
-Autoload compatibility
-----------------------
-
- HTML Purifier attempts to be as smart as possible when registering an
- autoloader, but there are some cases where you will need to change
- your own code to accomodate HTML Purifier. These are those cases:
-
- PHP VERSION IS LESS THAN 5.1.2, AND YOU'VE DEFINED __autoload
- Because spl_autoload_register() doesn't exist in early versions
- of PHP 5, HTML Purifier has no way of adding itself to the autoload
- stack. Modify your __autoload function to test
- HTMLPurifier_Bootstrap::autoload($class)
-
- For example, suppose your autoload function looks like this:
-
- function __autoload($class) {
- require str_replace('_', '/', $class) . '.php';
- return true;
- }
-
- A modified version with HTML Purifier would look like this:
-
- function __autoload($class) {
- if (HTMLPurifier_Bootstrap::autoload($class)) return true;
- require str_replace('_', '/', $class) . '.php';
- return true;
- }
-
- Note that there *is* some custom behavior in our autoloader; the
- original autoloader in our example would work for 99% of the time,
- but would fail when including language files.
-
- AN __autoload FUNCTION IS DECLARED AFTER OUR AUTOLOADER IS REGISTERED
- spl_autoload_register() has the curious behavior of disabling
- the existing __autoload() handler. Users need to explicitly
- spl_autoload_register('__autoload'). Because we use SPL when it
- is available, __autoload() will ALWAYS be disabled. If __autoload()
- is declared before HTML Purifier is loaded, this is not a problem:
- HTML Purifier will register the function for you. But if it is
- declared afterwards, it will mysteriously not work. This
- snippet of code (after your autoloader is defined) will fix it:
-
- spl_autoload_register('__autoload')
-
- Users should also be on guard if they use a version of PHP previous
- to 5.1.2 without an autoloader--HTML Purifier will define __autoload()
- for you, which can collide with an autoloader that was added by *you*
- later.
-
-
-For better performance
-----------------------
-
- Opcode caches, which greatly speed up PHP initialization for scripts
- with large amounts of code (HTML Purifier included), don't like
- autoloaders. We offer an include file that includes all of HTML Purifier's
- files in one go in an opcode cache friendly manner:
-
- // If /path/to/library isn't already in your include path, uncomment
- // the below line:
- // require '/path/to/library/HTMLPurifier.path.php';
-
- require 'HTMLPurifier.includes.php';
-
- Optional components still need to be included--you'll know if you try to
- use a feature and you get a class doesn't exists error! The autoloader
- can be used in conjunction with this approach to catch classes that are
- missing. Simply add this afterwards:
-
- require 'HTMLPurifier.autoload.php';
-
-Standalone version
-------------------
-
- HTML Purifier has a standalone distribution; you can also generate
- a standalone file from the full version by running the script
- maintenance/generate-standalone.php . The standalone version has the
- benefit of having most of its code in one file, so parsing is much
- faster and the library is easier to manage.
-
- If HTMLPurifier.standalone.php exists in the library directory, you
- can use it like this:
-
- require '/path/to/HTMLPurifier.standalone.php';
-
- This is equivalent to including HTMLPurifier.includes.php, except that
- the contents of standalone/ will be added to your path. To override this
- behavior, specify a new HTMLPURIFIER_PREFIX where standalone files can
- be found (usually, this will be one directory up, the "true" library
- directory in full distributions). Don't forget to set your path too!
-
- The autoloader can be added to the end to ensure the classes are
- loaded when necessary; otherwise you can manually include them.
- To use the autoloader, use this:
-
- require 'HTMLPurifier.autoload.php';
-
-For advanced users
-------------------
-
- HTMLPurifier.auto.php performs a number of operations that can be done
- individually. These are:
-
- HTMLPurifier.path.php
- Puts /path/to/library in the include path. For high performance,
- this should be done in php.ini.
-
- HTMLPurifier.autoload.php
- Registers our autoload handler HTMLPurifier_Bootstrap::autoload($class).
-
- You can do these operations by yourself--in fact, you must modify your own
- autoload handler if you are using a version of PHP earlier than PHP 5.1.2
- (See "Autoload compatibility" above).
-
-
----------------------------------------------------------------------------
-4. Configuration
-
-HTML Purifier is designed to run out-of-the-box, but occasionally HTML
-Purifier needs to be told what to do. If you answer no to any of these
-questions, read on; otherwise, you can skip to the next section (or, if you're
-into configuring things just for the heck of it, skip to 4.3).
-
-* Am I using UTF-8?
-* Am I using XHTML 1.0 Transitional?
-
-If you answered no to any of these questions, instantiate a configuration
-object and read on:
-
- $config = HTMLPurifier_Config::createDefault();
-
-
-4.1. Setting a different character encoding
-
-You really shouldn't use any other encoding except UTF-8, especially if you
-plan to support multilingual websites (read section three for more details).
-However, switching to UTF-8 is not always immediately feasible, so we can
-adapt.
-
-HTML Purifier uses iconv to support other character encodings, as such,
-any encoding that iconv supports <http://www.gnu.org/software/libiconv/>
-HTML Purifier supports with this code:
-
- $config->set('Core.Encoding', /* put your encoding here */);
-
-An example usage for Latin-1 websites (the most common encoding for English
-websites):
-
- $config->set('Core.Encoding', 'ISO-8859-1');
-
-Note that HTML Purifier's support for non-Unicode encodings is crippled by the
-fact that any character not supported by that encoding will be silently
-dropped, EVEN if it is ampersand escaped. If you want to work around
-this, you are welcome to read docs/enduser-utf8.html for a fix,
-but please be cognizant of the issues the "solution" creates (for this
-reason, I do not include the solution in this document).
-
-
-4.2. Setting a different doctype
-
-For those of you using HTML 4.01 Transitional, you can disable
-XHTML output like this:
-
- $config->set('HTML.Doctype', 'HTML 4.01 Transitional');
-
-Other supported doctypes include:
-
- * HTML 4.01 Strict
- * HTML 4.01 Transitional
- * XHTML 1.0 Strict
- * XHTML 1.0 Transitional
- * XHTML 1.1
-
-
-4.3. Other settings
-
-There are more configuration directives which can be read about
-here: <http://htmlpurifier.org/live/configdoc/plain.html> They're a bit boring,
-but they can help out for those of you who like to exert maximum control over
-your code. Some of the more interesting ones are configurable at the
-demo <http://htmlpurifier.org/demo.php> and are well worth looking into
-for your own system.
-
-For example, you can fine tune allowed elements and attributes, convert
-relative URLs to absolute ones, and even autoparagraph input text! These
-are, respectively, %HTML.Allowed, %URI.MakeAbsolute and %URI.Base, and
-%AutoFormat.AutoParagraph. The %Namespace.Directive naming convention
-translates to:
-
- $config->set('Namespace.Directive', $value);
-
-E.g.
-
- $config->set('HTML.Allowed', 'p,b,a[href],i');
- $config->set('URI.Base', 'http://www.example.com');
- $config->set('URI.MakeAbsolute', true);
- $config->set('AutoFormat.AutoParagraph', true);
-
-
----------------------------------------------------------------------------
-5. Caching
-
-HTML Purifier generates some cache files (generally one or two) to speed up
-its execution. For maximum performance, make sure that
-library/HTMLPurifier/DefinitionCache/Serializer is writeable by the webserver.
-
-If you are in the library/ folder of HTML Purifier, you can set the
-appropriate permissions using:
-
- chmod -R 0755 HTMLPurifier/DefinitionCache/Serializer
-
-If the above command doesn't work, you may need to assign write permissions
-to all. This may be necessary if your webserver runs as nobody, but is
-not recommended since it means any other user can write files in the
-directory. Use:
-
- chmod -R 0777 HTMLPurifier/DefinitionCache/Serializer
-
-You can also chmod files via your FTP client; this option
-is usually accessible by right clicking the corresponding directory and
-then selecting "chmod" or "file permissions".
-
-Starting with 2.0.1, HTML Purifier will generate friendly error messages
-that will tell you exactly what you have to chmod the directory to, if in doubt,
-follow its advice.
-
-If you are unable or unwilling to give write permissions to the cache
-directory, you can either disable the cache (and suffer a performance
-hit):
-
- $config->set('Core.DefinitionCache', null);
-
-Or move the cache directory somewhere else (no trailing slash):
-
- $config->set('Cache.SerializerPath', '/home/user/absolute/path');
-
-
----------------------------------------------------------------------------
-6. Using the code
-
-The interface is mind-numbingly simple:
-
- $purifier = new HTMLPurifier($config);
- $clean_html = $purifier->purify( $dirty_html );
-
-That's it! For more examples, check out docs/examples/ (they aren't very
-different though). Also, docs/enduser-slow.html gives advice on what to
-do if HTML Purifier is slowing down your application.
-
-
----------------------------------------------------------------------------
-7. Quick install
-
-First, make sure library/HTMLPurifier/DefinitionCache/Serializer is
-writable by the webserver (see Section 5: Caching above for details).
-If your website is in UTF-8 and XHTML Transitional, use this code:
-
-<?php
- require_once '/path/to/htmlpurifier/library/HTMLPurifier.auto.php';
-
- $config = HTMLPurifier_Config::createDefault();
- $purifier = new HTMLPurifier($config);
- $clean_html = $purifier->purify($dirty_html);
-?>
-
-If your website is in a different encoding or doctype, use this code:
-
-<?php
- require_once '/path/to/htmlpurifier/library/HTMLPurifier.auto.php';
-
- $config = HTMLPurifier_Config::createDefault();
- $config->set('Core.Encoding', 'ISO-8859-1'); // replace with your encoding
- $config->set('HTML.Doctype', 'HTML 4.01 Transitional'); // replace with your doctype
- $purifier = new HTMLPurifier($config);
-
- $clean_html = $purifier->purify($dirty_html);
-?>
-
- vim: et sw=4 sts=4
diff --git a/library/htmlpurifier-4.6.0-lite/NEWS b/library/htmlpurifier-4.6.0-lite/NEWS
deleted file mode 100644
index 90a054620..000000000
--- a/library/htmlpurifier-4.6.0-lite/NEWS
+++ /dev/null
@@ -1,1078 +0,0 @@
-NEWS ( CHANGELOG and HISTORY ) HTMLPurifier
-|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-
-= KEY ====================
- # Breaks back-compat
- ! Feature
- - Bugfix
- + Sub-comment
- . Internal change
-==========================
-
-4.6.0, released 2013-11-30
-# Secure URI munge hashing algorithm has changed to hash_hmac("sha256", $url, $secret).
- Please update any verification scripts you may have.
-# URI parsing algorithm was made more strict, so only prefixes which
- looks like schemes will actually be schemes. Thanks
- Michael Gusev <mgusev@sugarcrm.com> for fixing.
-# %Core.EscapeInvalidChildren is no longer supported, and no longer does
- anything.
-! New directive %Core.AllowHostnameUnderscore which allows underscores
- in hostnames.
-- Eliminate quadratic behavior in DOMLex by using a proper queue.
- Thanks Ole Laursen for noticing this.
-- Rewritten MakeWellFormed/FixNesting implementation eliminates quadratic
- behavior in the rest of the purificaiton pipeline. Thanks Chedburn
- Networks for sponsoring this work.
-- Made Linkify URL parser a bit less permissive, so that non-breaking
- spaces and commas are not included as part of URL. Thanks nAS for fixing.
-- Fix some bad interactions with %HTML.Allowed and injectors. Thanks
- David Hirtz for reporting.
-- Fix infinite loop in DirectLex. Thanks Ashar Javed (@soaj1664ashar)
- for reporting.
-
-4.5.0, released 2013-02-17
-# Fix bug where stacked attribute transforms clobber each other;
- this also means it's no longer possible to override attribute
- transforms in later modules. No internal code was using this
- but this may break some clients.
-# We now use SHA-1 to identify cached definitions, instead of MD5.
-! Support display:inline-block
-! Support for more white-space CSS values.
-! Permit underscores in font families
-! Support for page-break-* CSS3 properties when proprietary properties
- are enabled.
-! New directive %Core.DisableExcludes; can be set to 'true' to turn off
- SGML excludes checking. If HTML Purifier is removing too much text
- and you don't care about full standards compliance, try setting this to
- 'true'.
-- Use prepend for SPL autoloading on PHP 5.3 and later.
-- Fix bug with nofollow transform when pre-existing rel exists.
-- Fix bug where background:url() always gets lower-cased
- (but not background-image:url())
-- Fix bug with non lower-case color names in HTML
-- Fix bug where data URI validation doesn't remove temporary files.
- Thanks Javier Marín Ros <javiermarinros@gmail.com> for reporting.
-- Don't remove certain empty tags on RemoveEmpty.
-
-4.4.0, released 2012-01-18
-# Removed PEARSax3 handler.
-# URI.Munge now munges URIs inside the same host that go from https
- to http. Reported by Neike Taika-Tessaro.
-# Core.EscapeNonASCIICharacters now always transforms entities to
- entities, even if target encoding is UTF-8.
-# Tighten up selector validation in ExtractStyleBlocks.
- Non-syntactically valid selectors are now rejected, along with
- some of the more obscure ones such as attribute selectors, the
- :lang pseudoselector, and anything not in CSS2.1. Furthermore,
- ID and class selectors now work properly with the relevant
- configuration attributes. Also, mute errors when parsing CSS
- with CSS Tidy. Reported by Mario Heiderich and Norman Hippert.
-! Added support for 'scope' attribute on tables.
-! Added %HTML.TargetBlank, which adds target="blank" to all outgoing links.
-! Properly handle sub-lists directly nested inside of lists in
- a standards compliant way, by moving them into the preceding <li>
-! Added %HTML.AllowedComments and %HTML.AllowedCommentsRegexp for
- limited allowed comments in untrusted situations.
-! Implement iframes, and allow them to be used in untrusted mode with
- %HTML.SafeIframe and %URI.SafeIframeRegexp. Thanks Bradley M. Froehle
- <brad.froehle@gmail.com> for submitting an initial version of the patch.
-! The Forms module now works properly for transitional doctypes.
-! Added support for internationalized domain names. You need the PEAR
- Net_IDNA2 module to be in your path; if it is installed, ensure the
- class can be loaded and then set %Core.EnableIDNA to true.
-- Color keywords are now case insensitive. Thanks Yzmir Ramirez
- <yramirez-htmlpurifier@adicio.com> for reporting.
-- Explicitly initialize anonModule variable to null.
-- Do not duplicate nofollow if already present. Thanks 178
- for reporting.
-- Do not add nofollow if hostname matches our current host. Thanks 178
- for reporting, and Neike Taika-Tessaro for helping diagnose.
-- Do not unset parser variable; this fixes intermittent serialization
- problems. Thanks Neike Taika-Tessaro for reporting, bill
- <10010tiger@gmail.com> for diagnosing.
-- Fix iconv truncation bug, where non-UTF-8 target encodings see
- output truncated after around 8000 characters. Thanks Jörg Ludwig
- <joerg.ludwig@iserv.eu> for reporting.
-- Fix broken table content model for XHTML1.1 (and also earlier
- versions, although the W3C validator doesn't catch those violations).
- Thanks GlitchMr <glitch.mr@gmail.com> for reporting.
-
-4.3.0, released 2011-03-27
-# Fixed broken caching of customized raw definitions, but requires an
- API change. The old API still works but will emit a warning,
- see http://htmlpurifier.org/docs/enduser-customize.html#optimized
- for how to upgrade your code.
-# Protect against Internet Explorer innerHTML behavior by specially
- treating attributes with backticks but no angled brackets, quotes or
- spaces. This constitutes a slight semantic change, which can be
- reverted using %Output.FixInnerHTML. Reported by Neike Taika-Tessaro
- and Mario Heiderich.
-# Protect against cssText/innerHTML by restricting allowed characters
- used in fonts further than mandated by the specification and encoding
- some extra special characters in URLs. Reported by Neike
- Taika-Tessaro and Mario Heiderich.
-! Added %HTML.Nofollow to add rel="nofollow" to external links.
-! More types of SPL autoloaders allowed on later versions of PHP.
-! Implementations for position, top, left, right, bottom, z-index
- when %CSS.Trusted is on.
-! Add %Cache.SerializerPermissions option for custom serializer
- directory/file permissions
-! Fix longstanding bug in Flash support for non-IE browsers, and
- allow more wmode attributes.
-! Add %CSS.AllowedFonts to restrict permissible font names.
-- Switch to an iterative traversal of the DOM, which prevents us
- from running out of stack space for deeply nested documents.
- Thanks Maxim Krizhanovsky for contributing a patch.
-- Make removal of conditional IE comments ungreedy; thanks Bernd
- for reporting.
-- Escape CDATA before removing Internet Explorer comments.
-- Fix removal of id attributes under certain conditions by ensuring
- armor attributes are preserved when recreating tags.
-- Check if schema.ser was corrupted.
-- Check if zend.ze1_compatibility_mode is on, and error out if it is.
- This safety check is only done for HTMLPurifier.auto.php; if you
- are using standalone or the specialized includes files, you're
- expected to know what you're doing.
-- Stop repeatedly writing the cache file after I'm done customizing a
- raw definition. Reported by ajh.
-- Switch to using require_once in the Bootstrap to work around bad
- interaction with Zend Debugger and APC. Reported by Antonio Parraga.
-- Fix URI handling when hostname is missing but scheme is present.
- Reported by Neike Taika-Tessaro.
-- Fix missing numeric entities on DirectLex; thanks Neike Taika-Tessaro
- for reporting.
-- Fix harmless notice from indexing into empty string. Thanks Matthijs
- Kooijman <matthijs@stdin.nl> for reporting.
-- Don't autoclose no parent elements are able to support the element
- that triggered the autoclose. In particular fixes strange behavior
- of stray <li> tags. Thanks pkuliga@gmail.com for reporting and
- Neike Taika-Tessaro <pinkgothic@gmail.com> for debugging assistance.
-
-4.2.0, released 2010-09-15
-! Added %Core.RemoveProcessingInstructions, which lets you remove
- <? ... ?> statements.
-! Added %URI.DisableResources functionality; the directive originally
- did nothing. Thanks David Rothstein for reporting.
-! Add documentation about configuration directive types.
-! Add %CSS.ForbiddenProperties configuration directive.
-! Add %HTML.FlashAllowFullScreen to permit embedded Flash objects
- to utilize full-screen mode.
-! Add optional support for the <code>file</code> URI scheme, enable
- by explicitly setting %URI.AllowedSchemes.
-! Add %Core.NormalizeNewlines options to allow turning off newline
- normalization.
-- Fix improper handling of Internet Explorer conditional comments
- by parser. Thanks zmonteca for reporting.
-- Fix missing attributes bug when running on Mac Snow Leopard and APC.
- Thanks sidepodcast for the fix.
-- Warn if an element is allowed, but an attribute it requires is
- not allowed.
-
-4.1.1, released 2010-05-31
-- Fix undefined index warnings in maintenance scripts.
-- Fix bug in DirectLex for parsing elements with a single attribute
- with entities.
-- Rewrite CSS output logic for font-family and url(). Thanks Mario
- Heiderich <mario.heiderich@googlemail.com> for reporting and Takeshi
- Terada <t-terada@violet.plala.or.jp> for suggesting the fix.
-- Emit an error for CollectErrors if a body is extracted
-- Fix bug where in background-position for center keyword handling.
-- Fix infinite loop when a wrapper element is inserted in a context
- where it's not allowed. Thanks Lars <lars@renoz.dk> for reporting.
-- Remove +x bit and shebang from index.php; only supported mode is to
- explicitly call it with php.
-- Make test script less chatty when log_errors is on.
-
-4.1.0, released 2010-04-26
-! Support proprietary height attribute on table element
-! Support YouTube slideshows that contain /cp/ in their URL.
-! Support for data: URI scheme; not enabled by default, add it using
- %URI.AllowedSchemes
-! Support flashvars when using %HTML.SafeObject and %HTML.SafeEmbed.
-! Support for Internet Explorer compatibility with %HTML.SafeObject
- using %Output.FlashCompat.
-! Handle <ol><ol> properly, by inserting the necessary <li> tag.
-- Always quote the insides of url(...) in CSS.
-
-4.0.0, released 2009-07-07
-# APIs for ConfigSchema subsystem have substantially changed. See
- docs/dev-config-bcbreaks.txt for details; in essence, anything that
- had both namespace and directive now have a single unified key.
-# Some configuration directives were renamed, specifically:
- %AutoFormatParam.PurifierLinkifyDocURL -> %AutoFormat.PurifierLinkify.DocURL
- %FilterParam.ExtractStyleBlocksEscaping -> %Filter.ExtractStyleBlocks.Escaping
- %FilterParam.ExtractStyleBlocksScope -> %Filter.ExtractStyleBlocks.Scope
- %FilterParam.ExtractStyleBlocksTidyImpl -> %Filter.ExtractStyleBlocks.TidyImpl
- As usual, the old directive names will still work, but will throw E_NOTICE
- errors.
-# The allowed values for class have been relaxed to allow all of CDATA for
- doctypes that are not XHTML 1.1 or XHTML 2.0. For old behavior, set
- %Attr.ClassUseCDATA to false.
-# Instead of appending the content model to an old content model, a blank
- element will replace the old content model. You can use #SUPER to get
- the old content model.
-! More robust support for name="" and id=""
-! HTMLPurifier_Config::inherit($config) allows you to inherit one
- configuration, and have changes to that configuration be propagated
- to all of its children.
-! Implement %HTML.Attr.Name.UseCDATA, which relaxes validation rules on
- the name attribute when set. Use with care. Thanks Ian Cook for
- sponsoring.
-! Implement %AutoFormat.RemoveEmpty.RemoveNbsp, which removes empty
- tags that contain non-breaking spaces as well other whitespace. You
- can also modify which tags should have &nbsp; maintained with
- %AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions.
-! Implement %Attr.AllowedClasses, which allows administrators to restrict
- classes users can use to a specified finite set of classes, and
- %Attr.ForbiddenClasses, which is the logical inverse.
-! You can now maintain your own configuration schema directories by
- creating a config-schema.php file or passing an extra argument. Check
- docs/dev-config-schema.html for more details.
-! Added HTMLPurifier_Config->serialize() method, which lets you save away
- your configuration in a compact serial file, which you can unserialize
- and use directly without having to go through the overhead of setup.
-- Fix bug where URIDefinition would not get cleared if it's directives got
- changed.
-- Fix fatal error in HTMLPurifier_Encoder on certain platforms (probably NetBSD 5.0)
-- Fix bug in Linkify autoformatter involving <a><span>http://foo</span></a>
-- Make %URI.Munge not apply to links that have the same host as your host.
-- Prevent stray </body> tag from truncating output, if a second </body>
- is present.
-. Created script maintenance/rename-config.php for renaming a configuration
- directive while maintaining its alias. This script does not change source code.
-. Implement namespace locking for definition construction, to prevent
- bugs where a directive is used for definition construction but is not
- used to construct the cache hash.
-
-3.3.0, released 2009-02-16
-! Implement CSS property 'overflow' when %CSS.AllowTricky is true.
-! Implement generic property list classess
-- Fix bug with testEncodingSupportsASCII() algorithm when iconv() implementation
- does not do the "right thing" with characters not supported in the output
- set.
-- Spellcheck UTF-8: The Secret To Character Encoding
-- Fix improper removal of the contents of elements with only whitespace. Thanks
- Eric Wald for reporting.
-- Fix broken test suite in versions of PHP without spl_autoload_register()
-- Fix degenerate case with YouTube filter involving double hyphens.
- Thanks Pierre Attar for reporting.
-- Fix YouTube rendering problem on certain versions of Firefox.
-- Fix CSSDefinition Printer problems with decorators
-- Add text parameter to unit tests, forces text output
-. Add verbose mode to command line test runner, use (--verbose)
-. Turn on unit tests for UnitConverter
-. Fix missing version number in configuration %Attr.DefaultImageAlt (added 3.2.0)
-. Fix newline errors that caused spurious failures when CRLF HTML Purifier was
- tested on Linux.
-. Removed trailing whitespace from all text files, see
- remote-trailing-whitespace.php maintenance script.
-. Convert configuration to use property list backend.
-
-3.2.0, released 2008-10-31
-# Using %Core.CollectErrors forces line number/column tracking on, whereas
- previously you could theoretically turn it off.
-# HTMLPurifier_Injector->notifyEnd() is formally deprecated. Please
- use handleEnd() instead.
-! %Output.AttrSort for when you need your attributes in alphabetical order to
- deal with a bug in FCKEditor. Requested by frank farmer.
-! Enable HTML comments when %HTML.Trusted is on. Requested by Waldo Jaquith.
-! Proper support for name attribute. It is now allowed and equivalent to the id
- attribute in a and img tags, and is only converted to id when %HTML.TidyLevel
- is heavy (for all doctypes).
-! %AutoFormat.RemoveEmpty to remove some empty tags from documents. Please don't
- use on hand-written HTML.
-! Add error-cases for unsupported elements in MakeWellFormed. This enables
- the strategy to be used, standalone, on untrusted input.
-! %Core.AggressivelyFixLt is on by default. This causes more sensible
- processing of left angled brackets in smileys and other whatnot.
-! Test scripts now have a 'type' parameter, which lets you say 'htmlpurifier',
- 'phpt', 'vtest', etc. in order to only execute those tests. This supercedes
- the --only-phpt parameter, although for backwards-compatibility the flag
- will still work.
-! AutoParagraph auto-formatter will now preserve double-newlines upon output.
- Users who are not performing inbound filtering, this may seem a little
- useless, but as a bonus, the test suite and handling of edge cases is also
- improved.
-! Experimental implementation of forms for %HTML.Trusted
-! Track column numbers when maintain line numbers is on
-! Proprietary 'background' attribute on table-related elements converted into
- corresponding CSS. Thanks Fusemail for sponsoring this feature!
-! Add forward(), forwardUntilEndToken(), backward() and current() to Injector
- supertype.
-! HTMLPurifier_Injector->handleEnd() permits modification to end tokens. The
- time of operation varies slightly from notifyEnd() as *all* end tokens are
- processed by the injector before they are subject to the well-formedness rules.
-! %Attr.DefaultImageAlt allows overriding default behavior of setting alt to
- basename of image when not present.
-! %AutoFormat.DisplayLinkURI neuters <a> tags into plain text URLs.
-- Fix two bugs in %URI.MakeAbsolute; one involving empty paths in base URLs,
- the other involving an undefined $is_folder error.
-- Throw error when %Core.Encoding is set to a spurious value. Previously,
- this errored silently and returned false.
-- Redirected stderr to stdout for flush error output.
-- %URI.DisableExternal will now use the host in %URI.Base if %URI.Host is not
- available.
-- Do not re-munge URL if the output URL has the same host as the input URL.
- Requested by Chris.
-- Fix error in documentation regarding %Filter.ExtractStyleBlocks
-- Prevent <![CDATA[<body></body>]]> from triggering %Core.ConvertDocumentToFragment
-- Fix bug with inline elements in blockquotes conflicting with strict doctype
-- Detect if HTML support is disabled for DOM by checking for loadHTML() method.
-- Fix bug where dots and double-dots in absolute URLs without hostname were
- not collapsed by URIFilter_MakeAbsolute.
-- Fix bug with anonymous modules operating on SafeEmbed or SafeObject elements
- by reordering their addition.
-- Will now throw exception on many error conditions during lexer creation; also
- throw an exception when MaintainLineNumbers is true, but a non-tracksLineNumbers
- is being used.
-- Detect if domxml extension is loaded, and use DirectLEx accordingly.
-- Improve handling of big numbers with floating point arithmetic in UnitConverter.
- Reported by David Morton.
-. Strategy_MakeWellFormed now operates in-place, saving memory and allowing
- for more interesting filter-backtracking
-. New HTMLPurifier_Injector->rewind() functionality, allows injectors to rewind
- index to reprocess tokens.
-. StringHashParser now allows for multiline sections with "empty" content;
- previously the section would remain undefined.
-. Added --quick option to multitest.php, which tests only the most recent
- release for each series.
-. Added --distro option to multitest.php, which accepts either 'normal' or
- 'standalone'. This supercedes --exclude-normal and --exclude-standalone
-
-3.1.1, released 2008-06-19
-# %URI.Munge now, by default, does not munge resources (for example, <img src="">)
- In order to enable this again, please set %URI.MungeResources to true.
-! More robust imagecrash protection with height/width CSS with %CSS.MaxImgLength,
- and height/width HTML with %HTML.MaxImgLength.
-! %URI.MungeSecretKey for secure URI munging. Thanks Chris
- for sponsoring this feature. Check out the corresponding documentation
- for details. (Att Nightly testers: The API for this feature changed before
- the general release. Namely, rename your directives %URI.SecureMungeSecretKey =>
- %URI.MungeSecretKey and and %URI.SecureMunge => %URI.Munge)
-! Implemented post URI filtering. Set member variable $post to true to set
- a URIFilter as such.
-! Allow modules to define injectors via $info_injector. Injectors are
- automatically disabled if injector's needed elements are not found.
-! Support for "safe" objects added, use %HTML.SafeObject and %HTML.SafeEmbed.
- Thanks Chris for sponsoring. If you've been using ad hoc code from the
- forums, PLEASE use this instead.
-! Added substitutions for %e, %n, %a and %p in %URI.Munge (in order,
- embedded, tag name, attribute name, CSS property name). See %URI.Munge
- for more details. Requested by Jochem Blok.
-- Disable percent height/width attributes for img.
-- AttrValidator operations are now atomic; updates to attributes are not
- manifest in token until end of operations. This prevents naughty internal
- code from directly modifying CurrentToken when they're not supposed to.
- This semantics change was requested by frank farmer.
-- Percent encoding checks enabled for URI query and fragment
-- Fix stray backslashes in font-family; CSS Unicode character escapes are
- now properly resolved (although *only* in font-family). Thanks Takeshi Terada
- for reporting.
-- Improve parseCDATA algorithm to take into account newline normalization
-- Account for browser confusion between Yen character and backslash in
- Shift_JIS encoding. This fix generalizes to any other encoding which is not
- a strict superset of printable ASCII. Thanks Takeshi Terada for reporting.
-- Fix missing configuration parameter in Generator calls. Thanks vs for the
- partial patch.
-- Improved adherence to Unicode by checking for non-character codepoints.
- Thanks Geoffrey Sneddon for reporting. This may result in degraded
- performance for extremely large inputs.
-- Allow CSS property-value pair ''text-decoration: none''. Thanks Jochem Blok
- for reporting.
-. Added HTMLPurifier_UnitConverter and HTMLPurifier_Length for convenient
- handling of CSS-style lengths. HTMLPurifier_AttrDef_CSS_Length now uses
- this class.
-. API of HTMLPurifier_AttrDef_CSS_Length changed from __construct($disable_negative)
- to __construct($min, $max). __construct(true) is equivalent to
- __construct('0').
-. Added HTMLPurifier_AttrDef_Switch class
-. Rename HTMLPurifier_HTMLModule_Tidy->construct() to setup() and bubble method
- up inheritance hierarchy to HTMLPurifier_HTMLModule. All HTMLModules
- get this called with the configuration object. All modules now
- use this rather than __construct(), although legacy code using constructors
- will still work--the new format, however, lets modules access the
- configuration object for HTML namespace dependant tweaks.
-. AttrDef_HTML_Pixels now takes a single construction parameter, pixels.
-. ConfigSchema data-structure heavily optimized; on average it uses a third
- the memory it did previously. The interface has changed accordingly,
- consult changes to HTMLPurifier_Config for details.
-. Variable parsing types now are magic integers instead of strings
-. Added benchmark for ConfigSchema
-. HTMLPurifier_Generator requires $config and $context parameters. If you
- don't know what they should be, use HTMLPurifier_Config::createDefault()
- and new HTMLPurifier_Context().
-. Printers now properly distinguish between output configuration, and
- target configuration. This is not applicable to scripts using
- the Printers for HTML Purifier related tasks.
-. HTML/CSS Printers must be primed with prepareGenerator($gen_config), otherwise
- fatal errors will ensue.
-. URIFilter->prepare can return false in order to abort loading of the filter
-. Factory for AttrDef_URI implemented, URI#embedded to indicate URI that embeds
- an external resource.
-. %URI.Munge functionality factored out into a post-filter class.
-. Added CurrentCSSProperty context variable during CSS validation
-
-3.1.0, released 2008-05-18
-# Unnecessary references to objects (vestiges of PHP4) removed from method
- signatures. The following methods do not need references when assigning from
- them and will result in E_STRICT errors if you try:
- + HTMLPurifier_Config->get*Definition() [* = HTML, CSS]
- + HTMLPurifier_ConfigSchema::instance()
- + HTMLPurifier_DefinitionCacheFactory::instance()
- + HTMLPurifier_DefinitionCacheFactory->create()
- + HTMLPurifier_DoctypeRegistry->register()
- + HTMLPurifier_DoctypeRegistry->get()
- + HTMLPurifier_HTMLModule->addElement()
- + HTMLPurifier_HTMLModule->addBlankElement()
- + HTMLPurifier_LanguageFactory::instance()
-# Printer_ConfigForm's get*() functions were static-ified
-# %HTML.ForbiddenAttributes requires attribute declarations to be in the
- form of tag@attr, NOT tag.attr (which will throw an error and won't do
- anything). This is for forwards compatibility with XML; you'd do best
- to migrate an %HTML.AllowedAttributes directives to this syntax too.
-! Allow index to be false for config from form creation
-! Added HTMLPurifier::VERSION constant
-! Commas, not dashes, used for serializer IDs. This change is forwards-compatible
- and allows for version numbers like "3.1.0-dev".
-! %HTML.Allowed deals gracefully with whitespace anywhere, anytime!
-! HTML Purifier's URI handling is a lot more robust, with much stricter
- validation checks and better percent encoding handling. Thanks Gareth Heyes
- for indicating security vulnerabilities from lax percent encoding.
-! Bootstrap autoloader deals more robustly with classes that don't exist,
- preventing class_exists($class, true) from barfing.
-- InterchangeBuilder now alphabetizes its lists
-- Validation error in configdoc output fixed
-- Iconv and other encoding errors muted even with custom error handlers that
- do not honor error_reporting
-- Add protection against imagecrash attack with CSS height/width
-- HTMLPurifier::instance() created for consistency, is equivalent to getInstance()
-- Fixed and revamped broken ConfigForm smoketest
-- Bug with bool/null fields in Printer_ConfigForm fixed
-- Bug with global forbidden attributes fixed
-- Improved error messages for allowed and forbidden HTML elements and attributes
-- Missing (or null) in configdoc documentation restored
-- If DOM throws and exception during parsing with PH5P (occurs in newer versions
- of DOM), HTML Purifier punts to DirectLex
-- Fatal error with unserialization of ScriptRequired
-- Created directories are now chmod'ed properly
-- Fixed bug with fallback languages in LanguageFactory
-- Standalone testing setup properly with autoload
-. Out-of-date documentation revised
-. UTF-8 encoding check optimization as suggested by Diego
-. HTMLPurifier_Error removed in favor of exceptions
-. More copy() function removed; should use clone instead
-. More extensive unit tests for HTMLDefinition
-. assertPurification moved to central harness
-. HTMLPurifier_Generator accepts $config and $context parameters during
- instantiation, not runtime
-. Double-quotes outside of attribute values are now unescaped
-
-3.1.0rc1, released 2008-04-22
-# Autoload support added. Internal require_once's removed in favor of an
- explicit require list or autoloading. To use HTML Purifier,
- you must now either use HTMLPurifier.auto.php
- or HTMLPurifier.includes.php; setting the include path and including
- HTMLPurifier.php is insufficient--in such cases include HTMLPurifier.autoload.php
- as well to register our autoload handler (or modify your autoload function
- to check HTMLPurifier_Bootstrap::getPath($class)). You can also use
- HTMLPurifier.safe-includes.php for a less performance friendly but more
- user-friendly library load.
-# HTMLPurifier_ConfigSchema static functions are officially deprecated. Schema
- information is stored in the ConfigSchema directory, and the
- maintenance/generate-schema-cache.php generates the schema.ser file, which
- is now instantiated. Support for userland schema changes coming soon!
-# HTMLPurifier_Config will now throw E_USER_NOTICE when you use a directive
- alias; to get rid of these errors just modify your configuration to use
- the new directive name.
-# HTMLPurifier->addFilter is deprecated; built-in filters can now be
- enabled using %Filter.$filter_name or by setting your own filters using
- %Filter.Custom
-# Directive-level safety properties superceded in favor of module-level
- safety. Internal method HTMLModule->addElement() has changed, although
- the externally visible HTMLDefinition->addElement has *not* changed.
-! Extra utility classes for testing and non-library operations can
- be found in extras/. Specifically, these are FSTools and ConfigDoc.
- You may find a use for these in your own project, but right now they
- are highly experimental and volatile.
-! Integration with PHPT allows for automated smoketests
-! Limited support for proprietary HTML elements, namely <marquee>, sponsored
- by Chris. You can enable them with %HTML.Proprietary if your client
- demands them.
-! Support for !important CSS cascade modifier. By default, this will be stripped
- from CSS, but you can enable it using %CSS.AllowImportant
-! Support for display and visibility CSS properties added, set %CSS.AllowTricky
- to true to use them.
-! HTML Purifier now has its own Exception hierarchy under HTMLPurifier_Exception.
- Developer error (not enduser error) can cause these to be triggered.
-! Experimental kses() wrapper introduced with HTMLPurifier.kses.php
-! Finally %CSS.AllowedProperties for tweaking allowed CSS properties without
- mucking around with HTMLPurifier_CSSDefinition
-! ConfigDoc output has been enhanced with version and deprecation info.
-! %HTML.ForbiddenAttributes and %HTML.ForbiddenElements implemented.
-- Autoclose now operates iteratively, i.e. <span><span><div> now has
- both span tags closed.
-- Various HTMLPurifier_Config convenience functions now accept another parameter
- $schema which defines what HTMLPurifier_ConfigSchema to use besides the
- global default.
-- Fix bug with trusted script handling in libxml versions later than 2.6.28.
-- Fix bug in ExtractStyleBlocks with comments in style tags
-- Fix bug in comment parsing for DirectLex
-- Flush output now displayed when in command line mode for unit tester
-- Fix bug with rgb(0, 1, 2) color syntax with spaces inside shorthand syntax
-- HTMLPurifier_HTMLDefinition->addAttribute can now be called multiple times
- on the same element without emitting errors.
-- Fixed fatal error in PH5P lexer with invalid tag names
-. Plugins now get their own changelogs according to project conventions.
-. Convert tokens to use instanceof, reducing memory footprint and
- improving comparison speed.
-. Dry runs now supported in SimpleTest; testing facilities improved
-. Bootstrap class added for handling autoloading functionality
-. Implemented recursive glob at FSTools->globr
-. ConfigSchema now has instance methods for all corresponding define*
- static methods.
-. A couple of new historical maintenance scripts were added.
-. HTMLPurifier/HTMLModule/Tidy/XHTMLAndHTML4.php split into two files
-. tests/index.php can now be run from any directory.
-. HTMLPurifier_Token subclasses split into seperate files
-. HTMLPURIFIER_PREFIX now is defined in Bootstrap.php, NOT HTMLPurifier.php
-. HTMLPURIFIER_PREFIX can now be defined outside of HTML Purifier
-. New --php=php flag added, allows PHP executable to be specified (command
- line only!)
-. htmlpurifier_add_test() preferred method to translate test files in to
- classes, because it handles PHPT files too.
-. Debugger class is deprecated and will be removed soon.
-. Command line argument parsing for testing scripts revamped, now --opt value
- format is supported.
-. Smoketests now cleanup after magic quotes
-. Generator now can output comments (however, comments are still stripped
- from HTML Purifier output)
-. HTMLPurifier_ConfigSchema->validate() deprecated in favor of
- HTMLPurifier_VarParser->parse()
-. Integers auto-cast into float type by VarParser.
-. HTMLPURIFIER_STRICT removed; no validation is performed on runtime, only
- during cache generation
-. Reordered script calls in maintenance/flush.php
-. Command line scripts now honor exit codes
-. When --flush fails in unit testers, abort tests and print message
-. Improved documentation in docs/dev-flush.html about the maintenance scripts
-. copy() methods removed in favor of clone keyword
-
-3.0.0, released 2008-01-06
-# HTML Purifier is PHP 5 only! The 2.1.x branch will be maintained
- until PHP 4 is completely deprecated, but no new features will be added
- to it.
- + Visibility declarations added
- + Constructor methods renamed to __construct()
- + PHP4 reference cruft removed (in progress)
-! CSS properties are now case-insensitive
-! DefinitionCacheFactory now can register new implementations
-! New HTMLPurifier_Filter_ExtractStyleBlocks for extracting <style> from
- documents and cleaning their contents up. Requires the CSSTidy library
- <http://csstidy.sourceforge.net/>. You can access the blocks with the
- 'StyleBlocks' Context variable ($purifier->context->get('StyleBlocks')).
- The output CSS can also be "scoped" for a specific element, use:
- %Filter.ExtractStyleBlocksScope
-! Experimental support for some proprietary CSS attributes allowed:
- opacity (and all of the browser-specific equivalents) and scrollbar colors.
- Enable by setting %CSS.Proprietary to true.
-- Colors missing # but in hex form will be corrected
-- CSS Number algorithm improved
-- Unit testing and multi-testing now on steroids: command lines,
- XML output, and other goodies now added.
-. Unit tests for Injector improved
-. New classes:
- + HTMLPurifier_AttrDef_CSS_AlphaValue
- + HTMLPurifier_AttrDef_CSS_Filter
-. Multitest now has a file docblock
-
-2.1.3, released 2007-11-05
-! tests/multitest.php allows you to test multiple versions by running
- tests/index.php through multiple interpreters using `phpv` shell
- script (you must provide this script!)
-- Fixed poor include ordering for Email URI AttrDefs, causes fatal errors
- on some systems.
-- Injector algorithm further refined: off-by-one error regarding skip
- counts for dormant injectors fixed
-- Corrective blockquote definition now enabled for HTML 4.01 Strict
-- Fatal error when <img> tag (or any other element with required attributes)
- has 'id' attribute fixed, thanks NykO18 for reporting
-- Fix warning emitted when a non-supported URI scheme is passed to the
- MakeAbsolute URIFilter, thanks NykO18 (again)
-- Further refine AutoParagraph injector. Behavior inside of elements
- allowing paragraph tags clarified: only inline content delimeted by
- double newlines (not block elements) are paragraphed.
-- Buggy treatment of end tags of elements that have required attributes
- fixed (does not manifest on default tag-set)
-- Spurious internal content reorganization error suppressed
-- HTMLDefinition->addElement now returns a reference to the created
- element object, as implied by the documentation
-- Phorum mod's HTML Purifier help message expanded (unreleased elsewhere)
-- Fix a theoretical class of infinite loops from DirectLex reported
- by Nate Abele
-- Work around unnecessary DOMElement type-cast in PH5P that caused errors
- in PHP 5.1
-- Work around PHP 4 SimpleTest lack-of-error complaining for one-time-only
- HTMLDefinition errors, this may indicate problems with error-collecting
- facilities in PHP 5
-- Make ErrorCollectorEMock work in both PHP 4 and PHP 5
-- Make PH5P work with PHP 5.0 by removing unnecessary array parameter typedef
-. %Core.AcceptFullDocuments renamed to %Core.ConvertDocumentToFragment
- to better communicate its purpose
-. Error unit tests can now specify the expectation of no errors. Future
- iterations of the harness will be extremely strict about what errors
- are allowed
-. Extend Injector hooks to allow for more powerful injector routines
-. HTMLDefinition->addBlankElement created, as according to the HTMLModule
- method
-. Doxygen configuration file updated, with minor improvements
-. Test runner now checks for similarly named files in conf/ directory too.
-. Minor cosmetic change to flush-definition-cache.php: trailing newline is
- outputted
-. Maintenance script for generating PH5P patch added, original PH5P source
- file also added under version control
-. Full unit test runner script title made more descriptive with PHP version
-. Updated INSTALL file to state that 4.3.7 is the earliest version we
- are actively testing
-
-2.1.2, released 2007-09-03
-! Implemented Object module for trusted users
-! Implemented experimental HTML5 parsing mode using PH5P. To use, add
- this to your code:
- require_once 'HTMLPurifier/Lexer/PH5P.php';
- $config->set('Core', 'LexerImpl', 'PH5P');
- Note that this Lexer introduces some classes not in the HTMLPurifier
- namespace. Also, this is PHP5 only.
-! CSS property border-spacing implemented
-- Fix non-visible parsing error in DirectLex with empty tags that have
- slashes inside attribute values.
-- Fix typo in CSS definition: border-collapse:seperate; was incorrectly
- accepted as valid CSS. Usually non-visible, because this styling is the
- default for tables in most browsers. Thanks Brett Zamir for pointing
- this out.
-- Fix validation errors in configuration form
-- Hammer out a bunch of edge-case bugs in the standalone distribution
-- Inclusion reflection removed from URISchemeRegistry; you must manually
- include any new schema files you wish to use
-- Numerous typo fixes in documentation thanks to Brett Zamir
-. Unit test refactoring for one logical test per test function
-. Config and context parameters in ComplexHarness deprecated: instead, edit
- the $config and $context member variables
-. HTML wrapper in DOMLex now takes DTD identifiers into account; doesn't
- really make a difference, but is good for completeness sake
-. merge-library.php script refactored for greater code reusability and
- PHP4 compatibility
-
-2.1.1, released 2007-08-04
-- Fix show-stopper bug in %URI.MakeAbsolute functionality
-- Fix PHP4 syntax error in standalone version
-. Add prefix directory to include path for standalone, this prevents
- other installations from clobbering the standalone's URI schemes
-. Single test methods can be invoked by prefixing with __only
-
-2.1.0, released 2007-08-02
-# flush-htmldefinition-cache.php superseded in favor of a generic
- flush-definition-cache.php script, you can clear a specific cache
- by passing its name as a parameter to the script
-! Phorum mod implemented for HTML Purifier
-! With %Core.AggressivelyFixLt, <3 and similar emoticons no longer
- trigger HTML removal in PHP5 (DOMLex). This directive is not necessary
- for PHP4 (DirectLex).
-! Standalone file now available, which greatly reduces the amount of
- includes (although there are still a few files that reside in the
- standalone folder)
-! Relative URIs can now be transformed into their absolute equivalents
- using %URI.Base and %URI.MakeAbsolute
-! Ruby implemented for XHTML 1.1
-! You can now define custom URI filtering behavior, see enduser-uri-filter.html
- for more details
-! UTF-8 font names now supported in CSS
-- AutoFormatters emit friendly error messages if tags or attributes they
- need are not allowed
-- ConfigForm's compactification of directive names is now configurable
-- AutoParagraph autoformatter algorithm refined after field-testing
-- XHTML 1.1 now applies XHTML 1.0 Strict cleanup routines, namely
- blockquote wrapping
-- Contents of <style> tags removed by default when tags are removed
-. HTMLPurifier_Config->getSerial() implemented, this is extremely useful
- for output cache invalidation
-. ConfigForm printer now can retrieve CSS and JS files as strings, in
- case HTML Purifier's directory is not publically accessible
-. Introduce new text/itext configuration directive values: these represent
- longer strings that would be more appropriately edited with a textarea
-. Allow newlines to act as separators for lists, hashes, lookups and
- %HTML.Allowed
-. ConfigForm generates textareas instead of text inputs for lists, hashes,
- lookups, text and itext fields
-. Hidden element content removal genericized: %Core.HiddenElements can
- be used to customize this behavior, by default <script> and <style> are
- hidden
-. Added HTMLPURIFIER_PREFIX constant, should be used instead of dirname(__FILE__)
-. Custom ChildDef added to default include list
-. URIScheme reflection improved: will not attempt to include file if class
- already exists. May clobber autoload, so I need to keep an eye on it
-. ConfigSchema heavily optimized, will only collect information and validate
- definitions when HTMLPURIFIER_SCHEMA_STRICT is true.
-. AttrDef_URI unit tests and implementation refactored
-. benchmarks/ directory now protected from public view with .htaccess file;
- run the tests via command line
-. URI scheme is munged off if there is no authority and the scheme is the
- default one
-. All unit tests inherit from HTMLPurifier_Harness, not UnitTestCase
-. Interface for URIScheme changed
-. Generic URI object to hold components of URI added, most systems involved
- in URI validation have been migrated to use it
-. Custom filtering for URIs factored out to URIDefinition interface for
- maximum extensibility
-
-2.0.1, released 2007-06-27
-! Tag auto-closing now based on a ChildDef heuristic rather than a
- manually set auto_close array; some behavior may change
-! Experimental AutoFormat functionality added: auto-paragraph and
- linkify your HTML input by setting %AutoFormat.AutoParagraph and
- %AutoFormat.Linkify to true
-! Newlines normalized internally, and then converted back to the
- value of PHP_EOL. If this is not desired, set your newline format
- using %Output.Newline.
-! Beta error collection, messages are implemented for the most generic
- cases involving Lexing or Strategies
-- Clean up special case code for <script> tags
-- Reorder includes for DefinitionCache decorators, fixes a possible
- missing class error
-- Fixed bug where manually modified definitions were not saved via cache
- (mostly harmless, except for the fact that it would be a little slower)
-- Configuration objects with different serials do not clobber each
- others when revision numbers are unequal
-- Improve Serializer DefinitionCache directory permissions checks
-- DefinitionCache no longer throws errors when it encounters old
- serial files that do not conform to the current style
-- Stray xmlns attributes removed from configuration documentation
-- configForm.php smoketest no longer has XSS vulnerability due to
- unescaped print_r output
-- Printer adheres to configuration's directives on output format
-- Fix improperly named form field in ConfigForm printer
-. Rewire some test-cases to swallow errors rather than expect them
-. HTMLDefinition printer updated with some of the new attributes
-. DefinitionCache keys reordered to reflect precedence: version number,
- hash, then revision number
-. %Core.DefinitionCache renamed to %Cache.DefinitionImpl
-. Interlinking in configuration documentation added using
- Injector_PurifierLinkify
-. Directives now keep track of aliases to themselves
-. Error collector now requires a severity to be passed, use PHP's internal
- error constants for this
-. HTMLPurifier_Config::getAllowedDirectivesForForm implemented, allows
- much easier selective embedding of configuration values
-. Doctype objects now accept public and system DTD identifiers
-. %HTML.Doctype is now constrained by specific values, to specify a custom
- doctype use new %HTML.CustomDoctype
-. ConfigForm truncates long directives to keep the form small, and does
- not re-output namespaces
-
-2.0.0, released 2007-06-20
-# Completely refactored HTMLModuleManager, decentralizing safety
- information
-# Transform modules changed to Tidy modules, which offer more flexibility
- and better modularization
-# Configuration object now finalizes itself when a read operation is
- performed on it, ensuring that its internal state stays consistent.
- To revert this behavior, you can set the $autoFinalize member variable
- off, but it's not recommended.
-# New compact syntax for AttrDef objects that can be used to instantiate
- new objects via make()
-# Definitions (esp. HTMLDefinition) are now cached for a significant
- performance boost. You can disable caching by setting %Core.DefinitionCache
- to null. You CANNOT edit raw definitions without setting the corresponding
- DefinitionID directive (%HTML.DefinitionID for HTMLDefinition).
-# Contents between <script> tags are now completely removed if <script>
- is not allowed
-# Prototype-declarations for Lexer removed in favor of configuration
- determination of Lexer implementations.
-! HTML Purifier now works in PHP 4.3.2.
-! Configuration form-editing API makes tweaking HTMLPurifier_Config a
- breeze!
-! Configuration directives that accept hashes now allow new string
- format: key1:value1,key2:value2
-! ConfigDoc now factored into OOP design
-! All deprecated elements now natively supported
-! Implement TinyMCE styled whitelist specification format in
- %HTML.Allowed
-! Config object gives more friendly error messages when things go wrong
-! Advanced API implemented: easy functions for creating elements (addElement)
- and attributes (addAttribute) on HTMLDefinition
-! Add native support for required attributes
-- Deprecated and removed EnableRedundantUTF8Cleaning. It didn't even work!
-- DOMLex will not emit errors when a custom error handler that does not
- honor error_reporting is used
-- StrictBlockquote child definition refrains from wrapping whitespace
- in tags now.
-- Bug resulting from tag transforms to non-allowed elements fixed
-- ChildDef_Custom's regex generation has been improved, removing several
- false positives
-. Unit test for ElementDef created, ElementDef behavior modified to
- be more flexible
-. Added convenience functions for HTMLModule constructors
-. AttrTypes now has accessor functions that should be used instead
- of directly manipulating info
-. TagTransform_Center deprecated in favor of generic TagTransform_Simple
-. Add extra protection in AttrDef_URI against phantom Schemes
-. Doctype object added to HTMLDefinition which describes certain aspects
- of the operational document type
-. Lexer is now pre-emptively included, with a conditional include for the
- PHP5 only version.
-. HTMLDefinition and CSSDefinition have a common parent class: Definition.
-. DirectLex can now track line-numbers
-. Preliminary error collector is in place, although no code actually reports
- errors yet
-. Factor out most of ValidateAttributes to new AttrValidator class
-
-1.6.1, released 2007-05-05
-! Support for more deprecated attributes via transformations:
- + hspace and vspace in img
- + size and noshade in hr
- + nowrap in td
- + clear in br
- + align in caption, table, img and hr
- + type in ul, ol and li
-! DirectLex now preserves text in which a < bracket is followed by
- a non-alphanumeric character. This means that certain emoticons
- are now preserved.
-! %Core.RemoveInvalidImg is now operational, when set to false invalid
- images will hang around with an empty src
-! target attribute in a tag supported, use %Attr.AllowedFrameTargets
- to enable
-! CSS property white-space now allows nowrap (supported in all modern
- browsers) but not others (which have spotty browser implementations)
-! XHTML 1.1 mode now sort-of works without any fatal errors, and
- lang is now moved over to xml:lang.
-! Attribute transformation smoketest available at smoketests/attrTransform.php
-! Transformation of font's size attribute now handles super-large numbers
-- Possibly fatal bug with __autoload() fixed in module manager
-- Invert HTMLModuleManager->addModule() processing order to check
- prefixes first and then the literal module
-- Empty strings get converted to empty arrays instead of arrays with
- an empty string in them.
-- Merging in attribute lists now works.
-. Demo script removed: it has been added to the website's repository
-. Basic.php script modified to work out of the box
-. Refactor AttrTransform classes to reduce duplication
-. AttrTransform_TextAlign axed in favor of a more general
- AttrTransform_EnumToCSS, refer to HTMLModule/TransformToStrict.php to
- see how the new equivalent is implemented
-. Unit tests now use exclusively assertIdentical
-
-1.6.0, released 2007-04-01
-! Support for most common deprecated attributes via transformations:
- + bgcolor in td, th, tr and table
- + border in img
- + name in a and img
- + width in td, th and hr
- + height in td, th
-! Support for CSS attribute 'height' added
-! Support for rel and rev attributes in a tags added, use %Attr.AllowedRel
- and %Attr.AllowedRev to activate
-- You can define ID blacklists using regular expressions via
- %Attr.IDBlacklistRegexp
-- Error messages are emitted when you attempt to "allow" elements or
- attributes that HTML Purifier does not support
-- Fix segfault in unit test. The problem is not very reproduceable and
- I don't know what causes it, but a six line patch fixed it.
-
-1.5.0, released 2007-03-23
-! Added a rudimentary I18N and L10N system modeled off MediaWiki. It
- doesn't actually do anything yet, but keep your eyes peeled.
-! docs/enduser-utf8.html explains how to use UTF-8 and HTML Purifier
-! Newly structured HTMLDefinition modeled off of XHTML 1.1 modules.
- I am loathe to release beta quality APIs, but this is exactly that;
- don't use the internal interfaces if you're not willing to do migration
- later on.
-- Allow 'x' subtag in language codes
-- Fixed buggy chameleon-support for ins and del
-. Added support for IDREF attributes (i.e. for)
-. Renamed HTMLPurifier_AttrDef_Class to HTMLPurifier_AttrDef_Nmtokens
-. Removed context variable ParentType, replaced with IsInline, which
- is false when you're not inline and an integer of the parent that
- caused you to become inline when you are (so possibly zero)
-. Removed ElementDef->type in favor of ElementDef->descendants_are_inline
- and HTMLDefinition->content_sets
-. StrictBlockquote now reports what elements its supposed to allow,
- rather than what it does allow
-. Removed HTMLDefinition->info_flow_elements in favor of
- HTMLDefinition->content_sets['Flow']
-. Removed redundant "exclusionary" definitions from DTD roster
-. StrictBlockquote now requires a construction parameter as if it
- were an Required ChildDef, this is the "real" set of allowed elements
-. AttrDef partitioned into HTML, CSS and URI segments
-. Modify Youtube filter regexp to be multiline
-. Require both PHP5 and DOM extension in order to use DOMLex, fixes
- some edge cases where a DOMDocument class exists in a PHP4 environment
- due to DOM XML extension.
-
-1.4.1, released 2007-01-21
-! docs/enduser-youtube.html updated according to new functionality
-- YouTube IDs can have underscores and dashes
-
-1.4.0, released 2007-01-21
-! Implemented list-style-image, URIs now allowed in list-style
-! Implemented background-image, background-repeat, background-attachment
- and background-position CSS properties. Shorthand property background
- supports all of these properties.
-! Configuration documentation looks nicer
-! Added %Core.EscapeNonASCIICharacters to workaround loss of Unicode
- characters while %Core.Encoding is set to a non-UTF-8 encoding.
-! Support for configuration directive aliases added
-! Config object can now be instantiated from ini files
-! YouTube preservation code added to the core, with two lines of code
- you can add it as a filter to your code. See smoketests/preserveYouTube.php
- for sample code.
-! Moved SLOW to docs/enduser-slow.html and added code examples
-- Replaced version check with functionality check for DOM (thanks Stephen
- Khoo)
-. Added smoketest 'all.php', which loads all other smoketests via frames
-. Implemented AttrDef_CSSURI for url(http://google.com) style declarations
-. Added convenient single test selector form on test runner
-
-1.3.2, released 2006-12-25
-! HTMLPurifier object now accepts configuration arrays, no need to manually
- instantiate a configuration object
-! Context object now accessible to outside
-! Added enduser-youtube.html, explains how to embed YouTube videos. See
- also corresponding smoketest preserveYouTube.php.
-! Added purifyArray(), which takes a list of HTML and purifies it all
-! Added static member variable $version to HTML Purifier with PHP-compatible
- version number string.
-- Fixed fatal error thrown by upper-cased language attributes
-- printDefinition.php: added labels, added better clarification
-. HTMLPurifier_Config::create() added, takes mixed variable and converts into
- a HTMLPurifier_Config object.
-
-1.3.1, released 2006-12-06
-! Added HTMLPurifier.func.php stub for a convenient function to call the library
-- Fixed bug in RemoveInvalidImg code that caused all images to be dropped
- (thanks to .mario for reporting this)
-. Standardized all attribute handling variables to attr, made it plural
-
-1.3.0, released 2006-11-26
-# Invalid images are now removed, rather than replaced with a dud
- <img src="" alt="Invalid image" />. Previous behavior can be restored
- with new directive %Core.RemoveInvalidImg set to false.
-! (X)HTML Strict now supported
- + Transparently handles inline elements in block context (blockquote)
-! Added GET method to demo for easier validation, added 50kb max input size
-! New directive %HTML.BlockWrapper, for block-ifying inline elements
-! New directive %HTML.Parent, allows you to only allow inline content
-! New directives %HTML.AllowedElements and %HTML.AllowedAttributes to let
- users narrow the set of allowed tags
-! <li value="4"> and <ul start="2"> now allowed in loose mode
-! New directives %URI.DisableExternalResources and %URI.DisableResources
-! New directive %Attr.DisableURI, which eliminates all hyperlinking
-! New directive %URI.Munge, munges URI so you can use some sort of redirector
- service to avoid PageRank leaks or warn users that they are exiting your site.
-! Added spiffy new smoketest printDefinition.php, which lets you twiddle with
- the configuration settings and see how the internal rules are affected.
-! New directive %URI.HostBlacklist for blocking links to bad hosts.
- xssAttacks.php smoketest updated accordingly.
-- Added missing type to ChildDef_Chameleon
-- Remove Tidy option from demo if there is not Tidy available
-. ChildDef_Required guards against empty tags
-. Lookup table HTMLDefinition->info_flow_elements added
-. Added peace-of-mind variable initialization to Strategy_FixNesting
-. Added HTMLPurifier->info_parent_def, parent child processing made special
-. Added internal documents briefly summarizing future progression of HTML
-. HTMLPurifier_Config->getBatch($namespace) added
-. More lenient casting to bool from string in HTMLPurifier_ConfigSchema
-. Refactored ChildDef classes into their own files
-
-1.2.0, released 2006-11-19
-# ID attributes now disabled by default. New directives:
- + %HTML.EnableAttrID - restores old behavior by allowing IDs
- + %Attr.IDPrefix - %Attr.IDBlacklist alternative that munges all user IDs
- so that they don't collide with your IDs
- + %Attr.IDPrefixLocal - Same as above, but for when there are multiple
- instances of user content on the page
- + Profuse documentation on how to use these available in docs/enduser-id.txt
-! Added MODx plugin <http://modxcms.com/forums/index.php/topic,6604.0.html>
-! Added percent encoding normalization
-! XSS attacks smoketest given facelift
-! Configuration documentation now has table of contents
-! Added %URI.DisableExternal, which prevents links to external websites. You
- can also use %URI.Host to permit absolute linking to subdomains
-! Non-accessible resources (ex. mailto) blocked from embedded URIs (img src)
-- Type variable in HTMLDefinition was not being set properly, fixed
-- Documentation updated
- + TODO added request Phalanger
- + TODO added request Native compression
- + TODO added request Remove redundant tags
- + TODO added possible plaintext formatter for HTML Purifier documentation
- + Updated ConfigDoc TODO
- + Improved inline comments in AttrDef/Class.php, AttrDef/CSS.php
- and AttrDef/Host.php
- + Revamped documentation into HTML, along with misc updates
-- HTMLPurifier_Context doesn't throw a variable reference error if you attempt
- to retrieve a non-existent variable
-. Switched to purify()-wide Context object registry
-. Refactored unit tests to minimize duplication
-. XSS attack sheet updated
-. configdoc.xml now has xml:space attached to default value nodes
-. Allow configuration directives to permit null values
-. Cleaned up test-cases to remove unnecessary swallowErrors()
-
-1.1.2, released 2006-09-30
-! Add HTMLPurifier.auto.php stub file that configures include_path
-- Documentation updated
- + INSTALL document rewritten
- + TODO added semi-lossy conversion
- + API Doxygen docs' file exclusions updated
- + Added notes on HTML versus XML attribute whitespace handling
- + Noted that HTMLPurifier_ChildDef_Custom isn't being used
- + Noted that config object's definitions are cached versions
-- Fixed lack of attribute parsing in HTMLPurifier_Lexer_PEARSax3
-- ftp:// URIs now have their typecodes checked
-- Hooked up HTMLPurifier_ChildDef_Custom's unit tests (they weren't being run)
-. Line endings standardized throughout project (svn:eol-style standardized)
-. Refactored parseData() to general Lexer class
-. Tester named "HTML Purifier" not "HTMLPurifier"
-
-1.1.1, released 2006-09-24
-! Configuration option to optionally Tidy up output for indentation to make up
- for dropped whitespace by DOMLex (pretty-printing for the entire application
- should be done by a page-wide Tidy)
-- Various documentation updates
-- Fixed parse error in configuration documentation script
-- Fixed fatal error in benchmark scripts, slightly augmented
-- As far as possible, whitespace is preserved in-between table children
-- Sample test-settings.php file included
-
-1.1.0, released 2006-09-16
-! Directive documentation generation using XSLT
-! XHTML can now be turned off, output becomes <br>
-- Made URI validator more forgiving: will ignore leading and trailing
- quotes, apostrophes and less than or greater than signs.
-- Enforce alphanumeric namespace and directive names for configuration.
-- Table child definition made more flexible, will fix up poorly ordered elements
-. Renamed ConfigDef to ConfigSchema
-
-1.0.1, released 2006-09-04
-- Fixed slight bug in DOMLex attribute parsing
-- Fixed rejection of case-insensitive configuration values when there is a
- set of allowed values. This manifested in %Core.Encoding.
-- Fixed rejection of inline style declarations that had lots of extra
- space in them. This manifested in TinyMCE.
-
-1.0.0, released 2006-09-01
-! Shorthand CSS properties implemented: font, border, background, list-style
-! Basic color keywords translated into hexadecimal values
-! Table CSS properties implemented
-! Support for charsets other than UTF-8 (defined by iconv)
-! Malformed UTF-8 and non-SGML character detection and cleaning implemented
-- Fixed broken numeric entity conversion
-- API documentation completed
-. (HTML|CSS)Definition de-singleton-ized
-
-1.0.0beta, released 2006-08-16
-! First public release, most functionality implemented. Notable omissions are:
- + Shorthand CSS properties
- + Table CSS properties
- + Deprecated attribute transformations
-
- vim: et sw=4 sts=4
diff --git a/library/jquery-textcomplete/LICENSE b/library/jquery-textcomplete/LICENSE
deleted file mode 100644
index 4848bd637..000000000
--- a/library/jquery-textcomplete/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2013-2014 Yuku Takahashi
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/library/jquery-textcomplete/jquery.textcomplete.js b/library/jquery-textcomplete/jquery.textcomplete.js
index 95e75149c..0dd9fd827 100644
--- a/library/jquery-textcomplete/jquery.textcomplete.js
+++ b/library/jquery-textcomplete/jquery.textcomplete.js
@@ -136,10 +136,6 @@ if (typeof jQuery === 'undefined') {
return Object.prototype.toString.call(obj) === '[object String]';
};
- var isFunction = function (obj) {
- return Object.prototype.toString.call(obj) === '[object Function]';
- };
-
var uniqueId = 0;
function Completer(element, option) {
@@ -147,33 +143,47 @@ if (typeof jQuery === 'undefined') {
this.id = 'textcomplete' + uniqueId++;
this.strategies = [];
this.views = [];
- this.option = $.extend({}, Completer._getDefaults(), option);
+ this.option = $.extend({}, Completer.defaults, option);
if (!this.$el.is('input[type=text]') && !this.$el.is('input[type=search]') && !this.$el.is('textarea') && !element.isContentEditable && element.contentEditable != 'true') {
throw new Error('textcomplete must be called on a Textarea or a ContentEditable.');
}
- if (element === document.activeElement) {
+ // use ownerDocument to fix iframe / IE issues
+ if (element === element.ownerDocument.activeElement) {
// element has already been focused. Initialize view objects immediately.
this.initialize()
} else {
// Initialize view objects lazily.
var self = this;
this.$el.one('focus.' + this.id, function () { self.initialize(); });
- }
- }
- Completer._getDefaults = function () {
- if (!Completer.DEFAULTS) {
- Completer.DEFAULTS = {
- appendTo: $('body'),
- zIndex: '100'
- };
+ // Special handling for CKEditor: lazy init on instance load
+ if ((!this.option.adapter || this.option.adapter == 'CKEditor') && typeof CKEDITOR != 'undefined' && (this.$el.is('textarea'))) {
+ CKEDITOR.on("instanceReady", function(event) {
+ event.editor.once("focus", function(event2) {
+ // replace the element with the Iframe element and flag it as CKEditor
+ self.$el = $(event.editor.editable().$);
+ if (!self.option.adapter) {
+ self.option.adapter = $.fn.textcomplete['CKEditor'];
+ self.option.ckeditor_instance = event.editor;
+ }
+ self.initialize();
+ });
+ });
+ }
}
-
- return Completer.DEFAULTS;
}
+ Completer.defaults = {
+ appendTo: 'body',
+ className: '', // deprecated option
+ dropdownClassName: 'dropdown-menu textcomplete-dropdown',
+ maxCount: 10,
+ zIndex: '100',
+ rightEdgeOffset: 30
+ };
+
$.extend(Completer.prototype, {
// Public properties
// -----------------
@@ -184,12 +194,26 @@ if (typeof jQuery === 'undefined') {
adapter: null,
dropdown: null,
$el: null,
+ $iframe: null,
// Public methods
// --------------
initialize: function () {
var element = this.$el.get(0);
+
+ // check if we are in an iframe
+ // we need to alter positioning logic if using an iframe
+ if (this.$el.prop('ownerDocument') !== document && window.frames.length) {
+ for (var iframeIndex = 0; iframeIndex < window.frames.length; iframeIndex++) {
+ if (this.$el.prop('ownerDocument') === window.frames[iframeIndex].document) {
+ this.$iframe = $(window.frames[iframeIndex].frameElement);
+ break;
+ }
+ }
+ }
+
+
// Initialize view objects.
this.dropdown = new $.fn.textcomplete.Dropdown(element, this, this.option);
var Adapter, viewName;
@@ -281,7 +305,7 @@ if (typeof jQuery === 'undefined') {
var strategy = this.strategies[i];
var context = strategy.context(text);
if (context || context === '') {
- var matchRegexp = isFunction(strategy.match) ? strategy.match(text) : strategy.match;
+ var matchRegexp = $.isFunction(strategy.match) ? strategy.match(text) : strategy.match;
if (isString(context)) { text = context; }
var match = text.match(matchRegexp);
if (match) { return [strategy, match[strategy.index], match]; }
@@ -399,7 +423,7 @@ if (typeof jQuery === 'undefined') {
var $parent = option.appendTo;
if (!($parent instanceof $)) { $parent = $($parent); }
var $el = $('<ul></ul>')
- .addClass('dropdown-menu textcomplete-dropdown')
+ .addClass(option.dropdownClassName)
.attr('id', 'textcomplete-dropdown-' + option._oid)
.css({
display: 'none',
@@ -422,7 +446,7 @@ if (typeof jQuery === 'undefined') {
footer: null,
header: null,
id: null,
- maxCount: 10,
+ maxCount: null,
placement: '',
shown: false,
data: [], // Shown zipped data.
@@ -445,8 +469,8 @@ if (typeof jQuery === 'undefined') {
render: function (zippedData) {
var contentsHtml = this._buildContents(zippedData);
- var unzippedData = $.map(this.data, function (d) { return d.value; });
- if (this.data.length) {
+ var unzippedData = $.map(zippedData, function (d) { return d.value; });
+ if (zippedData.length) {
var strategy = zippedData[0].strategy;
if (strategy.id) {
this.$el.attr('data-strategy', strategy.id);
@@ -480,7 +504,7 @@ if (typeof jQuery === 'undefined') {
return false;
if($(this).css('position') === 'fixed') {
pos.top -= $window.scrollTop();
- pos.left -= $window.scrollLeft();
+ pos.left -= $window.scrollLeft();
position = 'fixed';
return false;
}
@@ -785,7 +809,10 @@ if (typeof jQuery === 'undefined') {
var windowScrollBottom = $window.scrollTop() + $window.height();
var height = this.$el.height();
if ((this.$el.position().top + height) > windowScrollBottom) {
- this.$el.offset({top: windowScrollBottom - height});
+ // only do this if we are not in an iframe
+ if (!this.completer.$iframe) {
+ this.$el.offset({top: windowScrollBottom - height});
+ }
}
},
@@ -794,7 +821,7 @@ if (typeof jQuery === 'undefined') {
// to the document width so we don't know if we would have overrun it. As a heuristic to avoid that clipping
// (which makes our elements wrap onto the next line and corrupt the next item), if we're close to the right
// edge, move left. We don't know how far to move left, so just keep nudging a bit.
- var tolerance = 30; // pixels. Make wider than vertical scrollbar because we might not be able to use that space.
+ var tolerance = this.option.rightEdgeOffset; // pixels. Make wider than vertical scrollbar because we might not be able to use that space.
var lastOffset = this.$el.offset().left, offset;
var width = this.$el.width();
var maxLeft = $window.width() - tolerance;
@@ -1005,8 +1032,14 @@ if (typeof jQuery === 'undefined') {
switch (clickEvent.keyCode) {
case 9: // TAB
case 13: // ENTER
+ case 16: // SHIFT
+ case 17: // CTRL
+ case 18: // ALT
+ case 33: // PAGEUP
+ case 34: // PAGEDOWN
case 40: // DOWN
case 38: // UP
+ case 27: // ESC
return true;
}
if (clickEvent.ctrlKey) switch (clickEvent.keyCode) {
@@ -1040,12 +1073,14 @@ if (typeof jQuery === 'undefined') {
var pre = this.getTextFromHeadToCaret();
var post = this.el.value.substring(this.el.selectionEnd);
var newSubstr = strategy.replace(value, e);
+ var regExp;
if (typeof newSubstr !== 'undefined') {
if ($.isArray(newSubstr)) {
post = newSubstr[1] + post;
newSubstr = newSubstr[0];
}
- pre = pre.replace(strategy.match, newSubstr);
+ regExp = $.isFunction(strategy.match) ? strategy.match(pre) : strategy.match;
+ pre = pre.replace(regExp, newSubstr);
this.$el.val(pre + post);
this.el.selectionStart = this.el.selectionEnd = pre.length;
}
@@ -1062,7 +1097,8 @@ if (typeof jQuery === 'undefined') {
var p = $.fn.textcomplete.getCaretCoordinates(this.el, this.el.selectionStart);
return {
top: p.top + this._calculateLineHeight() - this.$el.scrollTop(),
- left: p.left - this.$el.scrollLeft()
+ left: p.left - this.$el.scrollLeft(),
+ lineHeight: this._calculateLineHeight()
};
},
@@ -1111,12 +1147,14 @@ if (typeof jQuery === 'undefined') {
var pre = this.getTextFromHeadToCaret();
var post = this.el.value.substring(pre.length);
var newSubstr = strategy.replace(value, e);
+ var regExp;
if (typeof newSubstr !== 'undefined') {
if ($.isArray(newSubstr)) {
post = newSubstr[1] + post;
newSubstr = newSubstr[0];
}
- pre = pre.replace(strategy.match, newSubstr);
+ regExp = $.isFunction(strategy.match) ? strategy.match(pre) : strategy.match;
+ pre = pre.replace(regExp, newSubstr);
this.$el.val(pre + post);
this.el.focus();
var range = this.el.createTextRange();
@@ -1162,30 +1200,35 @@ if (typeof jQuery === 'undefined') {
// When an dropdown item is selected, it is executed.
select: function (value, strategy, e) {
var pre = this.getTextFromHeadToCaret();
- var sel = window.getSelection()
+ // use ownerDocument instead of window to support iframes
+ var sel = this.el.ownerDocument.getSelection();
+
var range = sel.getRangeAt(0);
var selection = range.cloneRange();
selection.selectNodeContents(range.startContainer);
var content = selection.toString();
var post = content.substring(range.startOffset);
var newSubstr = strategy.replace(value, e);
+ var regExp;
if (typeof newSubstr !== 'undefined') {
if ($.isArray(newSubstr)) {
post = newSubstr[1] + post;
newSubstr = newSubstr[0];
}
- pre = pre.replace(strategy.match, newSubstr);
+ regExp = $.isFunction(strategy.match) ? strategy.match(pre) : strategy.match;
+ pre = pre.replace(regExp, newSubstr)
+ .replace(/ $/, "&nbsp"); // &nbsp necessary at least for CKeditor to not eat spaces
range.selectNodeContents(range.startContainer);
range.deleteContents();
// create temporary elements
- var preWrapper = document.createElement("div");
+ var preWrapper = this.el.ownerDocument.createElement("div");
preWrapper.innerHTML = pre;
- var postWrapper = document.createElement("div");
+ var postWrapper = this.el.ownerDocument.createElement("div");
postWrapper.innerHTML = post;
// create the fragment thats inserted
- var fragment = document.createDocumentFragment();
+ var fragment = this.el.ownerDocument.createDocumentFragment();
var childNode;
var lastOfPre;
while (childNode = preWrapper.firstChild) {
@@ -1218,8 +1261,8 @@ if (typeof jQuery === 'undefined') {
//
// Dropdown's position will be decided using the result.
_getCaretRelativePosition: function () {
- var range = window.getSelection().getRangeAt(0).cloneRange();
- var node = document.createElement('span');
+ var range = this.el.ownerDocument.getSelection().getRangeAt(0).cloneRange();
+ var node = this.el.ownerDocument.createElement('span');
range.insertNode(node);
range.selectNodeContents(node);
range.deleteContents();
@@ -1228,6 +1271,17 @@ if (typeof jQuery === 'undefined') {
position.left -= this.$el.offset().left;
position.top += $node.height() - this.$el.offset().top;
position.lineHeight = $node.height();
+
+ // special positioning logic for iframes
+ // this is typically used for contenteditables such as tinymce or ckeditor
+ if (this.completer.$iframe) {
+ var iframePosition = this.completer.$iframe.offset();
+ position.top += iframePosition.top;
+ position.left += iframePosition.left;
+ //subtract scrollTop from element in iframe
+ position.top -= this.$el.scrollTop();
+ }
+
$node.remove();
return position;
},
@@ -1241,7 +1295,7 @@ if (typeof jQuery === 'undefined') {
// this.getTextFromHeadToCaret()
// // => ' wor' // not '<b>hello</b> wor'
getTextFromHeadToCaret: function () {
- var range = window.getSelection().getRangeAt(0);
+ var range = this.el.ownerDocument.getSelection().getRangeAt(0);
var selection = range.cloneRange();
selection.selectNodeContents(range.startContainer);
return selection.toString().substring(0, range.startOffset);
@@ -1251,6 +1305,39 @@ if (typeof jQuery === 'undefined') {
$.fn.textcomplete.ContentEditable = ContentEditable;
}(jQuery);
+// NOTE: TextComplete plugin has contenteditable support but it does not work
+// fine especially on old IEs.
+// Any pull requests are REALLY welcome.
+
++function ($) {
+ 'use strict';
+
+ // CKEditor adapter
+ // =======================
+ //
+ // Adapter for CKEditor, based on contenteditable elements.
+ function CKEditor (element, completer, option) {
+ this.initialize(element, completer, option);
+ }
+
+ $.extend(CKEditor.prototype, $.fn.textcomplete.ContentEditable.prototype, {
+ _bindEvents: function () {
+ var $this = this;
+ this.option.ckeditor_instance.on('key', function(event) {
+ var domEvent = event.data;
+ $this._onKeyup(domEvent);
+ if ($this.completer.dropdown.shown && $this._skipSearch(domEvent)) {
+ return false;
+ }
+ }, null, null, 1); // 1 = Priority = Important!
+ // we actually also need the native event, as the CKEditor one is happening to late
+ this.$el.on('keyup.' + this.id, $.proxy(this._onKeyup, this));
+ },
+});
+
+ $.fn.textcomplete.CKEditor = CKEditor;
+}(jQuery);
+
// The MIT License (MIT)
//
// Copyright (c) 2015 Jonathan Ong me@jongleberry.com
diff --git a/library/jquery-textcomplete/jquery.textcomplete.min.js b/library/jquery-textcomplete/jquery.textcomplete.min.js
index d3a427f27..d8f67a804 100644
--- a/library/jquery-textcomplete/jquery.textcomplete.min.js
+++ b/library/jquery-textcomplete/jquery.textcomplete.min.js
@@ -1,3 +1,3 @@
-/*! jquery-textcomplete - v1.3.4 - 2016-04-19 */
-!function(a){if("function"==typeof define&&define.amd)define(["jquery"],a);else if("object"==typeof module&&module.exports){var b=require("jquery");module.exports=a(b)}else a(jQuery)}(function(a){if("undefined"==typeof a)throw new Error("jQuery.textcomplete requires jQuery");return+function(a){"use strict";var b=function(a){console.warn&&console.warn(a)},c=1;a.fn.textcomplete=function(d,e){var f=Array.prototype.slice.call(arguments);return this.each(function(){var g=this,h=a(this),i=h.data("textComplete");if(i||(e||(e={}),e._oid=c++,i=new a.fn.textcomplete.Completer(this,e),h.data("textComplete",i)),"string"==typeof d){if(!i)return;f.shift(),i[d].apply(i,f),"destroy"===d&&h.removeData("textComplete")}else a.each(d,function(c){a.each(["header","footer","placement","maxCount"],function(a){c[a]&&(i.option[a]=c[a],b(a+"as a strategy param is deprecated. Use option."),delete c[a])})}),i.register(a.fn.textcomplete.Strategy.parse(d,{el:g,$el:h}))})}}(a),+function(a){"use strict";function b(c,d){if(this.$el=a(c),this.id="textcomplete"+f++,this.strategies=[],this.views=[],this.option=a.extend({},b._getDefaults(),d),!(this.$el.is("input[type=text]")||this.$el.is("input[type=search]")||this.$el.is("textarea")||c.isContentEditable||"true"==c.contentEditable))throw new Error("textcomplete must be called on a Textarea or a ContentEditable.");if(c===document.activeElement)this.initialize();else{var e=this;this.$el.one("focus."+this.id,function(){e.initialize()})}}var c=function(a){var b,c;return function(){var d=Array.prototype.slice.call(arguments);if(b)return void(c=d);b=!0;var e=this;d.unshift(function f(){if(c){var d=c;c=void 0,d.unshift(f),a.apply(e,d)}else b=!1}),a.apply(this,d)}},d=function(a){return"[object String]"===Object.prototype.toString.call(a)},e=function(a){return"[object Function]"===Object.prototype.toString.call(a)},f=0;b._getDefaults=function(){return b.DEFAULTS||(b.DEFAULTS={appendTo:a("body"),zIndex:"100"}),b.DEFAULTS},a.extend(b.prototype,{id:null,option:null,strategies:null,adapter:null,dropdown:null,$el:null,initialize:function(){var b=this.$el.get(0);this.dropdown=new a.fn.textcomplete.Dropdown(b,this,this.option);var c,d;this.option.adapter?c=this.option.adapter:(d=this.$el.is("textarea")||this.$el.is("input[type=text]")||this.$el.is("input[type=search]")?"number"==typeof b.selectionEnd?"Textarea":"IETextarea":"ContentEditable",c=a.fn.textcomplete[d]),this.adapter=new c(b,this,this.option)},destroy:function(){this.$el.off("."+this.id),this.adapter&&this.adapter.destroy(),this.dropdown&&this.dropdown.destroy(),this.$el=this.adapter=this.dropdown=null},deactivate:function(){this.dropdown&&this.dropdown.deactivate()},trigger:function(a,b){this.dropdown||this.initialize(),null!=a||(a=this.adapter.getTextFromHeadToCaret());var c=this._extractSearchQuery(a);if(c.length){var d=c[1];if(b&&this._term===d&&""!==d)return;this._term=d,this._search.apply(this,c)}else this._term=null,this.dropdown.deactivate()},fire:function(a){var b=Array.prototype.slice.call(arguments,1);return this.$el.trigger(a,b),this},register:function(a){Array.prototype.push.apply(this.strategies,a)},select:function(a,b,c){this._term=null,this.adapter.select(a,b,c),this.fire("change").fire("textComplete:select",a,b),this.adapter.focus()},_clearAtNext:!0,_term:null,_extractSearchQuery:function(a){for(var b=0;b<this.strategies.length;b++){var c=this.strategies[b],f=c.context(a);if(f||""===f){var g=e(c.match)?c.match(a):c.match;d(f)&&(a=f);var h=a.match(g);if(h)return[c,h[c.index],h]}}return[]},_search:c(function(a,b,c,d){var e=this;b.search(c,function(d,f){e.dropdown.shown||e.dropdown.activate(),e._clearAtNext&&(e.dropdown.clear(),e._clearAtNext=!1),e.dropdown.setPosition(e.adapter.getCaretPosition()),e.dropdown.render(e._zip(d,b,c)),f||(a(),e._clearAtNext=!0)},d)}),_zip:function(b,c,d){return a.map(b,function(a){return{value:a,strategy:c,term:d}})}}),a.fn.textcomplete.Completer=b}(a),+function(a){"use strict";function b(c,d,f){this.$el=b.createElement(f),this.completer=d,this.id=d.id+"dropdown",this._data=[],this.$inputEl=a(c),this.option=f,f.listPosition&&(this.setPosition=f.listPosition),f.height&&this.$el.height(f.height);var g=this;a.each(["maxCount","placement","footer","header","noResultsMessage","className"],function(a,b){null!=f[b]&&(g[b]=f[b])}),this._bindEvents(c),e[this.id]=this}var c=a(window),d=function(a,b){var c,d,e=b.strategy.idProperty;for(c=0;c<a.length;c++)if(d=a[c],d.strategy===b.strategy)if(e){if(d.value[e]===b.value[e])return!0}else if(d.value===b.value)return!0;return!1},e={};a(document).on("click",function(b){var c=b.originalEvent&&b.originalEvent.keepTextCompleteDropdown;a.each(e,function(a,b){a!==c&&b.deactivate()})});var f={SKIP_DEFAULT:0,KEY_UP:1,KEY_DOWN:2,KEY_ENTER:3,KEY_PAGEUP:4,KEY_PAGEDOWN:5,KEY_ESCAPE:6};a.extend(b,{createElement:function(b){var c=b.appendTo;c instanceof a||(c=a(c));var d=a("<ul></ul>").addClass("dropdown-menu textcomplete-dropdown").attr("id","textcomplete-dropdown-"+b._oid).css({display:"none",left:0,position:"absolute",zIndex:b.zIndex}).appendTo(c);return d}}),a.extend(b.prototype,{$el:null,$inputEl:null,completer:null,footer:null,header:null,id:null,maxCount:10,placement:"",shown:!1,data:[],className:"",destroy:function(){this.deactivate(),this.$el.off("."+this.id),this.$inputEl.off("."+this.id),this.clear(),this.$el.remove(),this.$el=this.$inputEl=this.completer=null,delete e[this.id]},render:function(b){var c=this._buildContents(b),d=a.map(this.data,function(a){return a.value});if(this.data.length){var e=b[0].strategy;e.id?this.$el.attr("data-strategy",e.id):this.$el.removeAttr("data-strategy"),this._renderHeader(d),this._renderFooter(d),c&&(this._renderContents(c),this._fitToBottom(),this._fitToRight(),this._activateIndexedItem()),this._setScroll()}else this.noResultsMessage?this._renderNoResultsMessage(d):this.shown&&this.deactivate()},setPosition:function(b){var d="absolute";return this.$inputEl.add(this.$inputEl.parents()).each(function(){return"absolute"===a(this).css("position")?!1:"fixed"===a(this).css("position")?(b.top-=c.scrollTop(),b.left-=c.scrollLeft(),d="fixed",!1):void 0}),this.$el.css(this._applyPlacement(b)),this.$el.css({position:d}),this},clear:function(){this.$el.html(""),this.data=[],this._index=0,this._$header=this._$footer=this._$noResultsMessage=null},activate:function(){return this.shown||(this.clear(),this.$el.show(),this.className&&this.$el.addClass(this.className),this.completer.fire("textComplete:show"),this.shown=!0),this},deactivate:function(){return this.shown&&(this.$el.hide(),this.className&&this.$el.removeClass(this.className),this.completer.fire("textComplete:hide"),this.shown=!1),this},isUp:function(a){return 38===a.keyCode||a.ctrlKey&&80===a.keyCode},isDown:function(a){return 40===a.keyCode||a.ctrlKey&&78===a.keyCode},isEnter:function(a){var b=a.ctrlKey||a.altKey||a.metaKey||a.shiftKey;return!b&&(13===a.keyCode||9===a.keyCode||this.option.completeOnSpace===!0&&32===a.keyCode)},isPageup:function(a){return 33===a.keyCode},isPagedown:function(a){return 34===a.keyCode},isEscape:function(a){return 27===a.keyCode},_data:null,_index:null,_$header:null,_$noResultsMessage:null,_$footer:null,_bindEvents:function(){this.$el.on("mousedown."+this.id,".textcomplete-item",a.proxy(this._onClick,this)),this.$el.on("touchstart."+this.id,".textcomplete-item",a.proxy(this._onClick,this)),this.$el.on("mouseover."+this.id,".textcomplete-item",a.proxy(this._onMouseover,this)),this.$inputEl.on("keydown."+this.id,a.proxy(this._onKeydown,this))},_onClick:function(b){var c=a(b.target);b.preventDefault(),b.originalEvent.keepTextCompleteDropdown=this.id,c.hasClass("textcomplete-item")||(c=c.closest(".textcomplete-item"));var d=this.data[parseInt(c.data("index"),10)];this.completer.select(d.value,d.strategy,b);var e=this;setTimeout(function(){e.deactivate(),"touchstart"===b.type&&e.$inputEl.focus()},0)},_onMouseover:function(b){var c=a(b.target);b.preventDefault(),c.hasClass("textcomplete-item")||(c=c.closest(".textcomplete-item")),this._index=parseInt(c.data("index"),10),this._activateIndexedItem()},_onKeydown:function(b){if(this.shown){var c;switch(a.isFunction(this.option.onKeydown)&&(c=this.option.onKeydown(b,f)),null==c&&(c=this._defaultKeydown(b)),c){case f.KEY_UP:b.preventDefault(),this._up();break;case f.KEY_DOWN:b.preventDefault(),this._down();break;case f.KEY_ENTER:b.preventDefault(),this._enter(b);break;case f.KEY_PAGEUP:b.preventDefault(),this._pageup();break;case f.KEY_PAGEDOWN:b.preventDefault(),this._pagedown();break;case f.KEY_ESCAPE:b.preventDefault(),this.deactivate()}}},_defaultKeydown:function(a){return this.isUp(a)?f.KEY_UP:this.isDown(a)?f.KEY_DOWN:this.isEnter(a)?f.KEY_ENTER:this.isPageup(a)?f.KEY_PAGEUP:this.isPagedown(a)?f.KEY_PAGEDOWN:this.isEscape(a)?f.KEY_ESCAPE:void 0},_up:function(){0===this._index?this._index=this.data.length-1:this._index-=1,this._activateIndexedItem(),this._setScroll()},_down:function(){this._index===this.data.length-1?this._index=0:this._index+=1,this._activateIndexedItem(),this._setScroll()},_enter:function(a){var b=this.data[parseInt(this._getActiveElement().data("index"),10)];this.completer.select(b.value,b.strategy,a),this.deactivate()},_pageup:function(){var b=0,c=this._getActiveElement().position().top-this.$el.innerHeight();this.$el.children().each(function(d){return a(this).position().top+a(this).outerHeight()>c?(b=d,!1):void 0}),this._index=b,this._activateIndexedItem(),this._setScroll()},_pagedown:function(){var b=this.data.length-1,c=this._getActiveElement().position().top+this.$el.innerHeight();this.$el.children().each(function(d){return a(this).position().top>c?(b=d,!1):void 0}),this._index=b,this._activateIndexedItem(),this._setScroll()},_activateIndexedItem:function(){this.$el.find(".textcomplete-item.active").removeClass("active"),this._getActiveElement().addClass("active")},_getActiveElement:function(){return this.$el.children(".textcomplete-item:nth("+this._index+")")},_setScroll:function(){var a=this._getActiveElement(),b=a.position().top,c=a.outerHeight(),d=this.$el.innerHeight(),e=this.$el.scrollTop();0===this._index||this._index==this.data.length-1||0>b?this.$el.scrollTop(b+e):b+c>d&&this.$el.scrollTop(b+c+e-d)},_buildContents:function(a){var b,c,e,f="";for(c=0;c<a.length&&this.data.length!==this.maxCount;c++)b=a[c],d(this.data,b)||(e=this.data.length,this.data.push(b),f+='<li class="textcomplete-item" data-index="'+e+'"><a>',f+=b.strategy.template(b.value,b.term),f+="</a></li>");return f},_renderHeader:function(b){if(this.header){this._$header||(this._$header=a('<li class="textcomplete-header"></li>').prependTo(this.$el));var c=a.isFunction(this.header)?this.header(b):this.header;this._$header.html(c)}},_renderFooter:function(b){if(this.footer){this._$footer||(this._$footer=a('<li class="textcomplete-footer"></li>').appendTo(this.$el));var c=a.isFunction(this.footer)?this.footer(b):this.footer;this._$footer.html(c)}},_renderNoResultsMessage:function(b){if(this.noResultsMessage){this._$noResultsMessage||(this._$noResultsMessage=a('<li class="textcomplete-no-results-message"></li>').appendTo(this.$el));var c=a.isFunction(this.noResultsMessage)?this.noResultsMessage(b):this.noResultsMessage;this._$noResultsMessage.html(c)}},_renderContents:function(a){this._$footer?this._$footer.before(a):this.$el.append(a)},_fitToBottom:function(){var a=c.scrollTop()+c.height(),b=this.$el.height();this.$el.position().top+b>a&&this.$el.offset({top:a-b})},_fitToRight:function(){for(var a,b=30,d=this.$el.offset().left,e=this.$el.width(),f=c.width()-b;d+e>f&&(this.$el.offset({left:d-b}),a=this.$el.offset().left,!(a>=d));)d=a},_applyPlacement:function(a){return-1!==this.placement.indexOf("top")?a={top:"auto",bottom:this.$el.parent().height()-a.top+a.lineHeight,left:a.left}:(a.bottom="auto",delete a.lineHeight),-1!==this.placement.indexOf("absleft")?a.left=0:-1!==this.placement.indexOf("absright")&&(a.right=0,a.left="auto"),a}}),a.fn.textcomplete.Dropdown=b,a.extend(a.fn.textcomplete,f)}(a),+function(a){"use strict";function b(b){a.extend(this,b),this.cache&&(this.search=c(this.search))}var c=function(a){var b={};return function(c,d){b[c]?d(b[c]):a.call(this,c,function(a){b[c]=(b[c]||[]).concat(a),d.apply(null,arguments)})}};b.parse=function(c,d){return a.map(c,function(a){var c=new b(a);return c.el=d.el,c.$el=d.$el,c})},a.extend(b.prototype,{match:null,replace:null,search:null,id:null,cache:!1,context:function(){return!0},index:2,template:function(a){return a},idProperty:null}),a.fn.textcomplete.Strategy=b}(a),+function(a){"use strict";function b(){}var c=Date.now||function(){return(new Date).getTime()},d=function(a,b){var d,e,f,g,h,i=function(){var j=c()-g;b>j?d=setTimeout(i,b-j):(d=null,h=a.apply(f,e),f=e=null)};return function(){return f=this,e=arguments,g=c(),d||(d=setTimeout(i,b)),h}};a.extend(b.prototype,{id:null,completer:null,el:null,$el:null,option:null,initialize:function(b,c,e){this.el=b,this.$el=a(b),this.id=c.id+this.constructor.name,this.completer=c,this.option=e,this.option.debounce&&(this._onKeyup=d(this._onKeyup,this.option.debounce)),this._bindEvents()},destroy:function(){this.$el.off("."+this.id),this.$el=this.el=this.completer=null},select:function(){throw new Error("Not implemented")},getCaretPosition:function(){var b=this._getCaretRelativePosition(),c=this.$el.offset(),d=this.option.appendTo;if(d){d instanceof a||(d=a(d));var e=d.offsetParent().offset();c.top-=e.top,c.left-=e.left}return b.top+=c.top,b.left+=c.left,b},focus:function(){this.$el.focus()},_bindEvents:function(){this.$el.on("keyup."+this.id,a.proxy(this._onKeyup,this))},_onKeyup:function(a){this._skipSearch(a)||this.completer.trigger(this.getTextFromHeadToCaret(),!0)},_skipSearch:function(a){switch(a.keyCode){case 9:case 13:case 40:case 38:return!0}if(a.ctrlKey)switch(a.keyCode){case 78:case 80:return!0}}}),a.fn.textcomplete.Adapter=b}(a),+function(a){"use strict";function b(a,b,c){this.initialize(a,b,c)}a.extend(b.prototype,a.fn.textcomplete.Adapter.prototype,{select:function(b,c,d){var e=this.getTextFromHeadToCaret(),f=this.el.value.substring(this.el.selectionEnd),g=c.replace(b,d);"undefined"!=typeof g&&(a.isArray(g)&&(f=g[1]+f,g=g[0]),e=e.replace(c.match,g),this.$el.val(e+f),this.el.selectionStart=this.el.selectionEnd=e.length)},getTextFromHeadToCaret:function(){return this.el.value.substring(0,this.el.selectionEnd)},_getCaretRelativePosition:function(){var b=a.fn.textcomplete.getCaretCoordinates(this.el,this.el.selectionStart);return{top:b.top+this._calculateLineHeight()-this.$el.scrollTop(),left:b.left-this.$el.scrollLeft()}},_calculateLineHeight:function(){var a=parseInt(this.$el.css("line-height"),10);if(isNaN(a)){var b=this.el.parentNode,c=document.createElement(this.el.nodeName),d=this.el.style;c.setAttribute("style","margin:0px;padding:0px;font-family:"+d.fontFamily+";font-size:"+d.fontSize),c.innerHTML="test",b.appendChild(c),a=c.clientHeight,b.removeChild(c)}return a}}),a.fn.textcomplete.Textarea=b}(a),+function(a){"use strict";function b(b,d,e){this.initialize(b,d,e),a("<span>"+c+"</span>").css({position:"absolute",top:-9999,left:-9999}).insertBefore(b)}var c="å¶";a.extend(b.prototype,a.fn.textcomplete.Textarea.prototype,{select:function(b,c,d){var e=this.getTextFromHeadToCaret(),f=this.el.value.substring(e.length),g=c.replace(b,d);if("undefined"!=typeof g){a.isArray(g)&&(f=g[1]+f,g=g[0]),e=e.replace(c.match,g),this.$el.val(e+f),this.el.focus();var h=this.el.createTextRange();h.collapse(!0),h.moveEnd("character",e.length),h.moveStart("character",e.length),h.select()}},getTextFromHeadToCaret:function(){this.el.focus();var a=document.selection.createRange();a.moveStart("character",-this.el.value.length);var b=a.text.split(c);return 1===b.length?b[0]:b[1]}}),a.fn.textcomplete.IETextarea=b}(a),+function(a){"use strict";function b(a,b,c){this.initialize(a,b,c)}a.extend(b.prototype,a.fn.textcomplete.Adapter.prototype,{select:function(b,c,d){var e=this.getTextFromHeadToCaret(),f=window.getSelection(),g=f.getRangeAt(0),h=g.cloneRange();h.selectNodeContents(g.startContainer);var i=h.toString(),j=i.substring(g.startOffset),k=c.replace(b,d);if("undefined"!=typeof k){a.isArray(k)&&(j=k[1]+j,k=k[0]),e=e.replace(c.match,k),g.selectNodeContents(g.startContainer),g.deleteContents();var l=document.createElement("div");l.innerHTML=e;var m=document.createElement("div");m.innerHTML=j;for(var n,o,p=document.createDocumentFragment();n=l.firstChild;)o=p.appendChild(n);for(;n=m.firstChild;)p.appendChild(n);g.insertNode(p),g.setStartAfter(o),g.collapse(!0),f.removeAllRanges(),f.addRange(g)}},_getCaretRelativePosition:function(){var b=window.getSelection().getRangeAt(0).cloneRange(),c=document.createElement("span");b.insertNode(c),b.selectNodeContents(c),b.deleteContents();var d=a(c),e=d.offset();return e.left-=this.$el.offset().left,e.top+=d.height()-this.$el.offset().top,e.lineHeight=d.height(),d.remove(),e},getTextFromHeadToCaret:function(){var a=window.getSelection().getRangeAt(0),b=a.cloneRange();return b.selectNodeContents(a.startContainer),b.toString().substring(0,a.startOffset)}}),a.fn.textcomplete.ContentEditable=b}(a),function(a){function b(a,b,f){if(!d)throw new Error("textarea-caret-position#getCaretCoordinates should only be called in a browser");var g=f&&f.debug||!1;if(g){var h=document.querySelector("#input-textarea-caret-position-mirror-div");h&&h.parentNode.removeChild(h)}var i=document.createElement("div");i.id="input-textarea-caret-position-mirror-div",document.body.appendChild(i);var j=i.style,k=window.getComputedStyle?getComputedStyle(a):a.currentStyle;j.whiteSpace="pre-wrap","INPUT"!==a.nodeName&&(j.wordWrap="break-word"),j.position="absolute",g||(j.visibility="hidden"),c.forEach(function(a){j[a]=k[a]}),e?a.scrollHeight>parseInt(k.height)&&(j.overflowY="scroll"):j.overflow="hidden",i.textContent=a.value.substring(0,b),"INPUT"===a.nodeName&&(i.textContent=i.textContent.replace(/\s/g," "));var l=document.createElement("span");l.textContent=a.value.substring(b)||".",i.appendChild(l);var m={top:l.offsetTop+parseInt(k.borderTopWidth),left:l.offsetLeft+parseInt(k.borderLeftWidth)};return g?l.style.backgroundColor="#aaa":document.body.removeChild(i),m}var c=["direction","boxSizing","width","height","overflowX","overflowY","borderTopWidth","borderRightWidth","borderBottomWidth","borderLeftWidth","borderStyle","paddingTop","paddingRight","paddingBottom","paddingLeft","fontStyle","fontVariant","fontWeight","fontStretch","fontSize","fontSizeAdjust","lineHeight","fontFamily","textAlign","textTransform","textIndent","textDecoration","letterSpacing","wordSpacing","tabSize","MozTabSize"],d="undefined"!=typeof window,e=d&&null!=window.mozInnerScreenX;a.fn.textcomplete.getCaretCoordinates=b}(a),a});
+/*! jquery-textcomplete - v1.8.0 - 2016-11-15 */
+!function(a){if("function"==typeof define&&define.amd)define(["jquery"],a);else if("object"==typeof module&&module.exports){var b=require("jquery");module.exports=a(b)}else a(jQuery)}(function(a){if("undefined"==typeof a)throw new Error("jQuery.textcomplete requires jQuery");return+function(a){"use strict";var b=function(a){console.warn&&console.warn(a)},c=1;a.fn.textcomplete=function(d,e){var f=Array.prototype.slice.call(arguments);return this.each(function(){var g=this,h=a(this),i=h.data("textComplete");if(i||(e||(e={}),e._oid=c++,i=new a.fn.textcomplete.Completer(this,e),h.data("textComplete",i)),"string"==typeof d){if(!i)return;f.shift(),i[d].apply(i,f),"destroy"===d&&h.removeData("textComplete")}else a.each(d,function(c){a.each(["header","footer","placement","maxCount"],function(a){c[a]&&(i.option[a]=c[a],b(a+"as a strategy param is deprecated. Use option."),delete c[a])})}),i.register(a.fn.textcomplete.Strategy.parse(d,{el:g,$el:h}))})}}(a),+function(a){"use strict";function b(c,d){if(this.$el=a(c),this.id="textcomplete"+e++,this.strategies=[],this.views=[],this.option=a.extend({},b.defaults,d),!(this.$el.is("input[type=text]")||this.$el.is("input[type=search]")||this.$el.is("textarea")||c.isContentEditable||"true"==c.contentEditable))throw new Error("textcomplete must be called on a Textarea or a ContentEditable.");if(c===c.ownerDocument.activeElement)this.initialize();else{var f=this;this.$el.one("focus."+this.id,function(){f.initialize()}),this.option.adapter&&"CKEditor"!=this.option.adapter||"undefined"==typeof CKEDITOR||!this.$el.is("textarea")||CKEDITOR.on("instanceReady",function(b){b.editor.once("focus",function(c){f.$el=a(b.editor.editable().$),f.option.adapter||(f.option.adapter=a.fn.textcomplete.CKEditor,f.option.ckeditor_instance=b.editor),f.initialize()})})}}var c=function(a){var b,c;return function(){var d=Array.prototype.slice.call(arguments);if(b)return void(c=d);b=!0;var e=this;d.unshift(function f(){if(c){var d=c;c=void 0,d.unshift(f),a.apply(e,d)}else b=!1}),a.apply(this,d)}},d=function(a){return"[object String]"===Object.prototype.toString.call(a)},e=0;b.defaults={appendTo:"body",className:"",dropdownClassName:"dropdown-menu textcomplete-dropdown",maxCount:10,zIndex:"100",rightEdgeOffset:30},a.extend(b.prototype,{id:null,option:null,strategies:null,adapter:null,dropdown:null,$el:null,$iframe:null,initialize:function(){var b=this.$el.get(0);if(this.$el.prop("ownerDocument")!==document&&window.frames.length)for(var c=0;c<window.frames.length;c++)if(this.$el.prop("ownerDocument")===window.frames[c].document){this.$iframe=a(window.frames[c].frameElement);break}this.dropdown=new a.fn.textcomplete.Dropdown(b,this,this.option);var d,e;this.option.adapter?d=this.option.adapter:(e=this.$el.is("textarea")||this.$el.is("input[type=text]")||this.$el.is("input[type=search]")?"number"==typeof b.selectionEnd?"Textarea":"IETextarea":"ContentEditable",d=a.fn.textcomplete[e]),this.adapter=new d(b,this,this.option)},destroy:function(){this.$el.off("."+this.id),this.adapter&&this.adapter.destroy(),this.dropdown&&this.dropdown.destroy(),this.$el=this.adapter=this.dropdown=null},deactivate:function(){this.dropdown&&this.dropdown.deactivate()},trigger:function(a,b){this.dropdown||this.initialize(),null!=a||(a=this.adapter.getTextFromHeadToCaret());var c=this._extractSearchQuery(a);if(c.length){var d=c[1];if(b&&this._term===d&&""!==d)return;this._term=d,this._search.apply(this,c)}else this._term=null,this.dropdown.deactivate()},fire:function(a){var b=Array.prototype.slice.call(arguments,1);return this.$el.trigger(a,b),this},register:function(a){Array.prototype.push.apply(this.strategies,a)},select:function(a,b,c){this._term=null,this.adapter.select(a,b,c),this.fire("change").fire("textComplete:select",a,b),this.adapter.focus()},_clearAtNext:!0,_term:null,_extractSearchQuery:function(b){for(var c=0;c<this.strategies.length;c++){var e=this.strategies[c],f=e.context(b);if(f||""===f){var g=a.isFunction(e.match)?e.match(b):e.match;d(f)&&(b=f);var h=b.match(g);if(h)return[e,h[e.index],h]}}return[]},_search:c(function(a,b,c,d){var e=this;b.search(c,function(d,f){e.dropdown.shown||e.dropdown.activate(),e._clearAtNext&&(e.dropdown.clear(),e._clearAtNext=!1),e.dropdown.setPosition(e.adapter.getCaretPosition()),e.dropdown.render(e._zip(d,b,c)),f||(a(),e._clearAtNext=!0)},d)}),_zip:function(b,c,d){return a.map(b,function(a){return{value:a,strategy:c,term:d}})}}),a.fn.textcomplete.Completer=b}(a),+function(a){"use strict";function b(c,d,f){this.$el=b.createElement(f),this.completer=d,this.id=d.id+"dropdown",this._data=[],this.$inputEl=a(c),this.option=f,f.listPosition&&(this.setPosition=f.listPosition),f.height&&this.$el.height(f.height);var g=this;a.each(["maxCount","placement","footer","header","noResultsMessage","className"],function(a,b){null!=f[b]&&(g[b]=f[b])}),this._bindEvents(c),e[this.id]=this}var c=a(window),d=function(a,b){var c,d,e=b.strategy.idProperty;for(c=0;c<a.length;c++)if(d=a[c],d.strategy===b.strategy)if(e){if(d.value[e]===b.value[e])return!0}else if(d.value===b.value)return!0;return!1},e={};a(document).on("click",function(b){var c=b.originalEvent&&b.originalEvent.keepTextCompleteDropdown;a.each(e,function(a,b){a!==c&&b.deactivate()})});var f={SKIP_DEFAULT:0,KEY_UP:1,KEY_DOWN:2,KEY_ENTER:3,KEY_PAGEUP:4,KEY_PAGEDOWN:5,KEY_ESCAPE:6};a.extend(b,{createElement:function(b){var c=b.appendTo;c instanceof a||(c=a(c));var d=a("<ul></ul>").addClass(b.dropdownClassName).attr("id","textcomplete-dropdown-"+b._oid).css({display:"none",left:0,position:"absolute",zIndex:b.zIndex}).appendTo(c);return d}}),a.extend(b.prototype,{$el:null,$inputEl:null,completer:null,footer:null,header:null,id:null,maxCount:null,placement:"",shown:!1,data:[],className:"",destroy:function(){this.deactivate(),this.$el.off("."+this.id),this.$inputEl.off("."+this.id),this.clear(),this.$el.remove(),this.$el=this.$inputEl=this.completer=null,delete e[this.id]},render:function(b){var c=this._buildContents(b),d=a.map(b,function(a){return a.value});if(b.length){var e=b[0].strategy;e.id?this.$el.attr("data-strategy",e.id):this.$el.removeAttr("data-strategy"),this._renderHeader(d),this._renderFooter(d),c&&(this._renderContents(c),this._fitToBottom(),this._fitToRight(),this._activateIndexedItem()),this._setScroll()}else this.noResultsMessage?this._renderNoResultsMessage(d):this.shown&&this.deactivate()},setPosition:function(b){var d="absolute";return this.$inputEl.add(this.$inputEl.parents()).each(function(){return"absolute"===a(this).css("position")?!1:"fixed"===a(this).css("position")?(b.top-=c.scrollTop(),b.left-=c.scrollLeft(),d="fixed",!1):void 0}),this.$el.css(this._applyPlacement(b)),this.$el.css({position:d}),this},clear:function(){this.$el.html(""),this.data=[],this._index=0,this._$header=this._$footer=this._$noResultsMessage=null},activate:function(){return this.shown||(this.clear(),this.$el.show(),this.className&&this.$el.addClass(this.className),this.completer.fire("textComplete:show"),this.shown=!0),this},deactivate:function(){return this.shown&&(this.$el.hide(),this.className&&this.$el.removeClass(this.className),this.completer.fire("textComplete:hide"),this.shown=!1),this},isUp:function(a){return 38===a.keyCode||a.ctrlKey&&80===a.keyCode},isDown:function(a){return 40===a.keyCode||a.ctrlKey&&78===a.keyCode},isEnter:function(a){var b=a.ctrlKey||a.altKey||a.metaKey||a.shiftKey;return!b&&(13===a.keyCode||9===a.keyCode||this.option.completeOnSpace===!0&&32===a.keyCode)},isPageup:function(a){return 33===a.keyCode},isPagedown:function(a){return 34===a.keyCode},isEscape:function(a){return 27===a.keyCode},_data:null,_index:null,_$header:null,_$noResultsMessage:null,_$footer:null,_bindEvents:function(){this.$el.on("mousedown."+this.id,".textcomplete-item",a.proxy(this._onClick,this)),this.$el.on("touchstart."+this.id,".textcomplete-item",a.proxy(this._onClick,this)),this.$el.on("mouseover."+this.id,".textcomplete-item",a.proxy(this._onMouseover,this)),this.$inputEl.on("keydown."+this.id,a.proxy(this._onKeydown,this))},_onClick:function(b){var c=a(b.target);b.preventDefault(),b.originalEvent.keepTextCompleteDropdown=this.id,c.hasClass("textcomplete-item")||(c=c.closest(".textcomplete-item"));var d=this.data[parseInt(c.data("index"),10)];this.completer.select(d.value,d.strategy,b);var e=this;setTimeout(function(){e.deactivate(),"touchstart"===b.type&&e.$inputEl.focus()},0)},_onMouseover:function(b){var c=a(b.target);b.preventDefault(),c.hasClass("textcomplete-item")||(c=c.closest(".textcomplete-item")),this._index=parseInt(c.data("index"),10),this._activateIndexedItem()},_onKeydown:function(b){if(this.shown){var c;switch(a.isFunction(this.option.onKeydown)&&(c=this.option.onKeydown(b,f)),null==c&&(c=this._defaultKeydown(b)),c){case f.KEY_UP:b.preventDefault(),this._up();break;case f.KEY_DOWN:b.preventDefault(),this._down();break;case f.KEY_ENTER:b.preventDefault(),this._enter(b);break;case f.KEY_PAGEUP:b.preventDefault(),this._pageup();break;case f.KEY_PAGEDOWN:b.preventDefault(),this._pagedown();break;case f.KEY_ESCAPE:b.preventDefault(),this.deactivate()}}},_defaultKeydown:function(a){return this.isUp(a)?f.KEY_UP:this.isDown(a)?f.KEY_DOWN:this.isEnter(a)?f.KEY_ENTER:this.isPageup(a)?f.KEY_PAGEUP:this.isPagedown(a)?f.KEY_PAGEDOWN:this.isEscape(a)?f.KEY_ESCAPE:void 0},_up:function(){0===this._index?this._index=this.data.length-1:this._index-=1,this._activateIndexedItem(),this._setScroll()},_down:function(){this._index===this.data.length-1?this._index=0:this._index+=1,this._activateIndexedItem(),this._setScroll()},_enter:function(a){var b=this.data[parseInt(this._getActiveElement().data("index"),10)];this.completer.select(b.value,b.strategy,a),this.deactivate()},_pageup:function(){var b=0,c=this._getActiveElement().position().top-this.$el.innerHeight();this.$el.children().each(function(d){return a(this).position().top+a(this).outerHeight()>c?(b=d,!1):void 0}),this._index=b,this._activateIndexedItem(),this._setScroll()},_pagedown:function(){var b=this.data.length-1,c=this._getActiveElement().position().top+this.$el.innerHeight();this.$el.children().each(function(d){return a(this).position().top>c?(b=d,!1):void 0}),this._index=b,this._activateIndexedItem(),this._setScroll()},_activateIndexedItem:function(){this.$el.find(".textcomplete-item.active").removeClass("active"),this._getActiveElement().addClass("active")},_getActiveElement:function(){return this.$el.children(".textcomplete-item:nth("+this._index+")")},_setScroll:function(){var a=this._getActiveElement(),b=a.position().top,c=a.outerHeight(),d=this.$el.innerHeight(),e=this.$el.scrollTop();0===this._index||this._index==this.data.length-1||0>b?this.$el.scrollTop(b+e):b+c>d&&this.$el.scrollTop(b+c+e-d)},_buildContents:function(a){var b,c,e,f="";for(c=0;c<a.length&&this.data.length!==this.maxCount;c++)b=a[c],d(this.data,b)||(e=this.data.length,this.data.push(b),f+='<li class="textcomplete-item" data-index="'+e+'"><a>',f+=b.strategy.template(b.value,b.term),f+="</a></li>");return f},_renderHeader:function(b){if(this.header){this._$header||(this._$header=a('<li class="textcomplete-header"></li>').prependTo(this.$el));var c=a.isFunction(this.header)?this.header(b):this.header;this._$header.html(c)}},_renderFooter:function(b){if(this.footer){this._$footer||(this._$footer=a('<li class="textcomplete-footer"></li>').appendTo(this.$el));var c=a.isFunction(this.footer)?this.footer(b):this.footer;this._$footer.html(c)}},_renderNoResultsMessage:function(b){if(this.noResultsMessage){this._$noResultsMessage||(this._$noResultsMessage=a('<li class="textcomplete-no-results-message"></li>').appendTo(this.$el));var c=a.isFunction(this.noResultsMessage)?this.noResultsMessage(b):this.noResultsMessage;this._$noResultsMessage.html(c)}},_renderContents:function(a){this._$footer?this._$footer.before(a):this.$el.append(a)},_fitToBottom:function(){var a=c.scrollTop()+c.height(),b=this.$el.height();this.$el.position().top+b>a&&(this.completer.$iframe||this.$el.offset({top:a-b}))},_fitToRight:function(){for(var a,b=this.option.rightEdgeOffset,d=this.$el.offset().left,e=this.$el.width(),f=c.width()-b;d+e>f&&(this.$el.offset({left:d-b}),a=this.$el.offset().left,!(a>=d));)d=a},_applyPlacement:function(a){return-1!==this.placement.indexOf("top")?a={top:"auto",bottom:this.$el.parent().height()-a.top+a.lineHeight,left:a.left}:(a.bottom="auto",delete a.lineHeight),-1!==this.placement.indexOf("absleft")?a.left=0:-1!==this.placement.indexOf("absright")&&(a.right=0,a.left="auto"),a}}),a.fn.textcomplete.Dropdown=b,a.extend(a.fn.textcomplete,f)}(a),+function(a){"use strict";function b(b){a.extend(this,b),this.cache&&(this.search=c(this.search))}var c=function(a){var b={};return function(c,d){b[c]?d(b[c]):a.call(this,c,function(a){b[c]=(b[c]||[]).concat(a),d.apply(null,arguments)})}};b.parse=function(c,d){return a.map(c,function(a){var c=new b(a);return c.el=d.el,c.$el=d.$el,c})},a.extend(b.prototype,{match:null,replace:null,search:null,id:null,cache:!1,context:function(){return!0},index:2,template:function(a){return a},idProperty:null}),a.fn.textcomplete.Strategy=b}(a),+function(a){"use strict";function b(){}var c=Date.now||function(){return(new Date).getTime()},d=function(a,b){var d,e,f,g,h,i=function(){var j=c()-g;b>j?d=setTimeout(i,b-j):(d=null,h=a.apply(f,e),f=e=null)};return function(){return f=this,e=arguments,g=c(),d||(d=setTimeout(i,b)),h}};a.extend(b.prototype,{id:null,completer:null,el:null,$el:null,option:null,initialize:function(b,c,e){this.el=b,this.$el=a(b),this.id=c.id+this.constructor.name,this.completer=c,this.option=e,this.option.debounce&&(this._onKeyup=d(this._onKeyup,this.option.debounce)),this._bindEvents()},destroy:function(){this.$el.off("."+this.id),this.$el=this.el=this.completer=null},select:function(){throw new Error("Not implemented")},getCaretPosition:function(){var b=this._getCaretRelativePosition(),c=this.$el.offset(),d=this.option.appendTo;if(d){d instanceof a||(d=a(d));var e=d.offsetParent().offset();c.top-=e.top,c.left-=e.left}return b.top+=c.top,b.left+=c.left,b},focus:function(){this.$el.focus()},_bindEvents:function(){this.$el.on("keyup."+this.id,a.proxy(this._onKeyup,this))},_onKeyup:function(a){this._skipSearch(a)||this.completer.trigger(this.getTextFromHeadToCaret(),!0)},_skipSearch:function(a){switch(a.keyCode){case 9:case 13:case 16:case 17:case 18:case 33:case 34:case 40:case 38:case 27:return!0}if(a.ctrlKey)switch(a.keyCode){case 78:case 80:return!0}}}),a.fn.textcomplete.Adapter=b}(a),+function(a){"use strict";function b(a,b,c){this.initialize(a,b,c)}a.extend(b.prototype,a.fn.textcomplete.Adapter.prototype,{select:function(b,c,d){var e,f=this.getTextFromHeadToCaret(),g=this.el.value.substring(this.el.selectionEnd),h=c.replace(b,d);"undefined"!=typeof h&&(a.isArray(h)&&(g=h[1]+g,h=h[0]),e=a.isFunction(c.match)?c.match(f):c.match,f=f.replace(e,h),this.$el.val(f+g),this.el.selectionStart=this.el.selectionEnd=f.length)},getTextFromHeadToCaret:function(){return this.el.value.substring(0,this.el.selectionEnd)},_getCaretRelativePosition:function(){var b=a.fn.textcomplete.getCaretCoordinates(this.el,this.el.selectionStart);return{top:b.top+this._calculateLineHeight()-this.$el.scrollTop(),left:b.left-this.$el.scrollLeft(),lineHeight:this._calculateLineHeight()}},_calculateLineHeight:function(){var a=parseInt(this.$el.css("line-height"),10);if(isNaN(a)){var b=this.el.parentNode,c=document.createElement(this.el.nodeName),d=this.el.style;c.setAttribute("style","margin:0px;padding:0px;font-family:"+d.fontFamily+";font-size:"+d.fontSize),c.innerHTML="test",b.appendChild(c),a=c.clientHeight,b.removeChild(c)}return a}}),a.fn.textcomplete.Textarea=b}(a),+function(a){"use strict";function b(b,d,e){this.initialize(b,d,e),a("<span>"+c+"</span>").css({position:"absolute",top:-9999,left:-9999}).insertBefore(b)}var c="å¶";a.extend(b.prototype,a.fn.textcomplete.Textarea.prototype,{select:function(b,c,d){var e,f=this.getTextFromHeadToCaret(),g=this.el.value.substring(f.length),h=c.replace(b,d);if("undefined"!=typeof h){a.isArray(h)&&(g=h[1]+g,h=h[0]),e=a.isFunction(c.match)?c.match(f):c.match,f=f.replace(e,h),this.$el.val(f+g),this.el.focus();var i=this.el.createTextRange();i.collapse(!0),i.moveEnd("character",f.length),i.moveStart("character",f.length),i.select()}},getTextFromHeadToCaret:function(){this.el.focus();var a=document.selection.createRange();a.moveStart("character",-this.el.value.length);var b=a.text.split(c);return 1===b.length?b[0]:b[1]}}),a.fn.textcomplete.IETextarea=b}(a),+function(a){"use strict";function b(a,b,c){this.initialize(a,b,c)}a.extend(b.prototype,a.fn.textcomplete.Adapter.prototype,{select:function(b,c,d){var e=this.getTextFromHeadToCaret(),f=this.el.ownerDocument.getSelection(),g=f.getRangeAt(0),h=g.cloneRange();h.selectNodeContents(g.startContainer);var i,j=h.toString(),k=j.substring(g.startOffset),l=c.replace(b,d);if("undefined"!=typeof l){a.isArray(l)&&(k=l[1]+k,l=l[0]),i=a.isFunction(c.match)?c.match(e):c.match,e=e.replace(i,l).replace(/ $/,"&nbsp"),g.selectNodeContents(g.startContainer),g.deleteContents();var m=this.el.ownerDocument.createElement("div");m.innerHTML=e;var n=this.el.ownerDocument.createElement("div");n.innerHTML=k;for(var o,p,q=this.el.ownerDocument.createDocumentFragment();o=m.firstChild;)p=q.appendChild(o);for(;o=n.firstChild;)q.appendChild(o);g.insertNode(q),g.setStartAfter(p),g.collapse(!0),f.removeAllRanges(),f.addRange(g)}},_getCaretRelativePosition:function(){var b=this.el.ownerDocument.getSelection().getRangeAt(0).cloneRange(),c=this.el.ownerDocument.createElement("span");b.insertNode(c),b.selectNodeContents(c),b.deleteContents();var d=a(c),e=d.offset();if(e.left-=this.$el.offset().left,e.top+=d.height()-this.$el.offset().top,e.lineHeight=d.height(),this.completer.$iframe){var f=this.completer.$iframe.offset();e.top+=f.top,e.left+=f.left,e.top-=this.$el.scrollTop()}return d.remove(),e},getTextFromHeadToCaret:function(){var a=this.el.ownerDocument.getSelection().getRangeAt(0),b=a.cloneRange();return b.selectNodeContents(a.startContainer),b.toString().substring(0,a.startOffset)}}),a.fn.textcomplete.ContentEditable=b}(a),+function(a){"use strict";function b(a,b,c){this.initialize(a,b,c)}a.extend(b.prototype,a.fn.textcomplete.ContentEditable.prototype,{_bindEvents:function(){var b=this;this.option.ckeditor_instance.on("key",function(a){var c=a.data;return b._onKeyup(c),b.completer.dropdown.shown&&b._skipSearch(c)?!1:void 0},null,null,1),this.$el.on("keyup."+this.id,a.proxy(this._onKeyup,this))}}),a.fn.textcomplete.CKEditor=b}(a),function(a){function b(a,b,f){if(!d)throw new Error("textarea-caret-position#getCaretCoordinates should only be called in a browser");var g=f&&f.debug||!1;if(g){var h=document.querySelector("#input-textarea-caret-position-mirror-div");h&&h.parentNode.removeChild(h)}var i=document.createElement("div");i.id="input-textarea-caret-position-mirror-div",document.body.appendChild(i);var j=i.style,k=window.getComputedStyle?getComputedStyle(a):a.currentStyle;j.whiteSpace="pre-wrap","INPUT"!==a.nodeName&&(j.wordWrap="break-word"),j.position="absolute",g||(j.visibility="hidden"),c.forEach(function(a){j[a]=k[a]}),e?a.scrollHeight>parseInt(k.height)&&(j.overflowY="scroll"):j.overflow="hidden",i.textContent=a.value.substring(0,b),"INPUT"===a.nodeName&&(i.textContent=i.textContent.replace(/\s/g," "));var l=document.createElement("span");l.textContent=a.value.substring(b)||".",i.appendChild(l);var m={top:l.offsetTop+parseInt(k.borderTopWidth),left:l.offsetLeft+parseInt(k.borderLeftWidth)};return g?l.style.backgroundColor="#aaa":document.body.removeChild(i),m}var c=["direction","boxSizing","width","height","overflowX","overflowY","borderTopWidth","borderRightWidth","borderBottomWidth","borderLeftWidth","borderStyle","paddingTop","paddingRight","paddingBottom","paddingLeft","fontStyle","fontVariant","fontWeight","fontStretch","fontSize","fontSizeAdjust","lineHeight","fontFamily","textAlign","textTransform","textIndent","textDecoration","letterSpacing","wordSpacing","tabSize","MozTabSize"],d="undefined"!=typeof window,e=d&&null!=window.mozInnerScreenX;a.fn.textcomplete.getCaretCoordinates=b}(a),a});
//# sourceMappingURL=dist/jquery.textcomplete.min.map \ No newline at end of file
diff --git a/library/jquery-textcomplete/jquery.textcomplete.min.map b/library/jquery-textcomplete/jquery.textcomplete.min.map
new file mode 100644
index 000000000..0e249c1c4
--- /dev/null
+++ b/library/jquery-textcomplete/jquery.textcomplete.min.map
@@ -0,0 +1 @@
+{"version":3,"file":"dist/jquery.textcomplete.min.js","sources":["dist/jquery.textcomplete.js"],"names":["factory","define","amd","module","exports","$","require","jQuery","Error","warn","message","console","id","fn","textcomplete","strategies","option","args","Array","prototype","slice","call","arguments","this","each","self","$this","completer","data","_oid","Completer","shift","apply","removeData","obj","name","register","Strategy","parse","el","$el","element","uniqueId","views","extend","defaults","is","isContentEditable","contentEditable","ownerDocument","activeElement","initialize","one","adapter","CKEDITOR","on","event","editor","once","event2","editable","ckeditor_instance","lock","func","locked","queuedArgsToReplay","unshift","replayOrFree","replayArgs","undefined","isString","Object","toString","appendTo","className","dropdownClassName","maxCount","zIndex","rightEdgeOffset","dropdown","$iframe","get","prop","document","window","frames","length","iframeIndex","frameElement","Dropdown","Adapter","viewName","selectionEnd","destroy","off","deactivate","trigger","text","skipUnchangedTerm","getTextFromHeadToCaret","searchQuery","_extractSearchQuery","term","_term","_search","fire","eventName","push","select","value","strategy","e","focus","_clearAtNext","i","context","matchRegexp","isFunction","match","index","free","search","stillSearching","shown","activate","clear","setPosition","getCaretPosition","render","_zip","map","createElement","_data","$inputEl","listPosition","height","_i","_bindEvents","dropdownViews","$window","include","zippedData","datum","elem","idProperty","originalEvent","keepTextCompleteDropdown","key","view","commands","SKIP_DEFAULT","KEY_UP","KEY_DOWN","KEY_ENTER","KEY_PAGEUP","KEY_PAGEDOWN","KEY_ESCAPE","$parent","addClass","attr","css","display","left","position","footer","header","placement","remove","contentsHtml","_buildContents","unzippedData","d","removeAttr","_renderHeader","_renderFooter","_renderContents","_fitToBottom","_fitToRight","_activateIndexedItem","_setScroll","noResultsMessage","_renderNoResultsMessage","pos","add","parents","top","scrollTop","scrollLeft","_applyPlacement","html","_index","_$header","_$footer","_$noResultsMessage","show","hide","removeClass","isUp","keyCode","ctrlKey","isDown","isEnter","modifiers","altKey","metaKey","shiftKey","completeOnSpace","isPageup","isPagedown","isEscape","proxy","_onClick","_onMouseover","_onKeydown","target","preventDefault","hasClass","closest","parseInt","setTimeout","type","command","onKeydown","_defaultKeydown","_up","_down","_enter","_pageup","_pagedown","_getActiveElement","threshold","innerHeight","children","outerHeight","find","$activeEl","itemTop","itemHeight","visibleHeight","visibleTop","template","prependTo","before","append","windowScrollBottom","offset","tolerance","lastOffset","width","maxLeft","indexOf","bottom","parent","lineHeight","right","options","cache","memoize","memo","callback","concat","strategiesArray","params","strategyObj","replace","now","Date","getTime","debounce","wait","timeout","timestamp","result","later","last","constructor","_onKeyup","_getCaretRelativePosition","parentOffset","offsetParent","_skipSearch","clickEvent","Textarea","regExp","pre","post","substring","newSubstr","isArray","val","selectionStart","p","getCaretCoordinates","_calculateLineHeight","isNaN","parentNode","temp","nodeName","style","setAttribute","fontFamily","fontSize","innerHTML","appendChild","clientHeight","removeChild","IETextarea","sentinelChar","insertBefore","range","createTextRange","collapse","moveEnd","moveStart","selection","createRange","arr","split","ContentEditable","sel","getSelection","getRangeAt","cloneRange","selectNodeContents","startContainer","content","startOffset","deleteContents","preWrapper","postWrapper","childNode","lastOfPre","fragment","createDocumentFragment","firstChild","insertNode","setStartAfter","removeAllRanges","addRange","node","$node","iframePosition","CKEditor","domEvent","isBrowser","debug","querySelector","div","body","computed","getComputedStyle","currentStyle","whiteSpace","wordWrap","visibility","properties","forEach","isFirefox","scrollHeight","overflowY","overflow","textContent","span","coordinates","offsetTop","offsetLeft","backgroundColor","mozInnerScreenX"],"mappings":";CAAC,SAAUA,GACT,GAAsB,kBAAXC,SAAyBA,OAAOC,IAEzCD,QAAQ,UAAWD,OACd,IAAsB,gBAAXG,SAAuBA,OAAOC,QAAS,CACvD,GAAIC,GAAIC,QAAQ,SAChBH,QAAOC,QAAUJ,EAAQK,OAGzBL,GAAQO,SAEV,SAAUA,GAUZ,GAAsB,mBAAXA,GACT,KAAM,IAAIC,OAAM,sCAw7ClB,QAr7CC,SAAUH,GACT,YAEA,IAAII,GAAO,SAAUC,GACfC,QAAQF,MAAQE,QAAQF,KAAKC,IAG/BE,EAAK,CAETP,GAAEQ,GAAGC,aAAe,SAAUC,EAAYC,GACxC,GAAIC,GAAOC,MAAMC,UAAUC,MAAMC,KAAKC,UACtC,OAAOC,MAAKC,KAAK,WACf,GAAIC,GAAOF,KACPG,EAAQrB,EAAEkB,MACVI,EAAYD,EAAME,KAAK,eAO3B,IANKD,IACHX,IAAWA,MACXA,EAAOa,KAAOjB,IACde,EAAY,GAAItB,GAAEQ,GAAGC,aAAagB,UAAUP,KAAMP,GAClDU,EAAME,KAAK,eAAgBD,IAEH,gBAAfZ,GAAyB,CAClC,IAAKY,EAAW,MAChBV,GAAKc,QACLJ,EAAUZ,GAAYiB,MAAML,EAAWV,GACpB,YAAfF,GACFW,EAAMO,WAAW,oBAKnB5B,GAAEmB,KAAKT,EAAY,SAAUmB,GAC3B7B,EAAEmB,MAAM,SAAU,SAAU,YAAa,YAAa,SAAUW,GAC1DD,EAAIC,KACNR,EAAUX,OAAOmB,GAAQD,EAAIC,GAC7B1B,EAAK0B,EAAO,wDACLD,GAAIC,QAIjBR,EAAUS,SAAS/B,EAAEQ,GAAGC,aAAauB,SAASC,MAAMvB,GAClDwB,GAAId,EACJe,IAAKd,SAMbnB,IAED,SAAUF,GACT,YAgEA,SAASyB,GAAUW,EAASzB,GAO1B,GANAO,KAAKiB,IAAanC,EAAEoC,GACpBlB,KAAKX,GAAa,eAAiB8B,IACnCnB,KAAKR,cACLQ,KAAKoB,SACLpB,KAAKP,OAAaX,EAAEuC,UAAWd,EAAUe,SAAU7B,KAE9CO,KAAKiB,IAAIM,GAAG,qBAAwBvB,KAAKiB,IAAIM,GAAG,uBAA0BvB,KAAKiB,IAAIM,GAAG,aAAgBL,EAAQM,mBAAgD,QAA3BN,EAAQO,iBAC9I,KAAM,IAAIxC,OAAM,kEAIlB,IAAIiC,IAAYA,EAAQQ,cAAcC,cAEpC3B,KAAK4B,iBACA,CAEL,GAAI1B,GAAOF,IACXA,MAAKiB,IAAIY,IAAI,SAAW7B,KAAKX,GAAI,WAAca,EAAK0B,eAG9C5B,KAAKP,OAAOqC,SAAkC,YAAvB9B,KAAKP,OAAOqC,SAA6C,mBAAZC,YAA4B/B,KAAKiB,IAAIM,GAAG,aAChHQ,SAASC,GAAG,gBAAiB,SAASC,GACpCA,EAAMC,OAAOC,KAAK,QAAS,SAASC,GAElClC,EAAKe,IAAMnC,EAAEmD,EAAMC,OAAOG,WAAWvD,GAChCoB,EAAKT,OAAOqC,UACf5B,EAAKT,OAAOqC,QAAUhD,EAAEQ,GAAGC,aAAuB,SAClDW,EAAKT,OAAO6C,kBAAoBL,EAAMC,QAExChC,EAAK0B,kBAtEf,GAAIW,GAAO,SAAUC,GACnB,GAAIC,GAAQC,CAEZ,OAAO,YAEL,GAAIhD,GAAOC,MAAMC,UAAUC,MAAMC,KAAKC,UACtC,IAAI0C,EAKF,YADAC,EAAqBhD,EAGvB+C,IAAS,CACT,IAAIvC,GAAOF,IACXN,GAAKiD,QAAQ,QAASC,KACpB,GAAIF,EAAoB,CAMtB,GAAIG,GAAaH,CACjBA,GAAqBI,OACrBD,EAAWF,QAAQC,GACnBJ,EAAK/B,MAAMP,EAAM2C,OAEjBJ,IAAS,IAGbD,EAAK/B,MAAMT,KAAMN,KAIjBqD,EAAW,SAAUpC,GACvB,MAA+C,oBAAxCqC,OAAOpD,UAAUqD,SAASnD,KAAKa,IAGpCQ,EAAW,CAuCfZ,GAAUe,UACR4B,SAAU,OACVC,UAAW,GACXC,kBAAmB,sCACnBC,SAAU,GACVC,OAAQ,MACRC,gBAAiB,IAGnBzE,EAAEuC,OAAOd,EAAUX,WAIjBP,GAAY,KACZI,OAAY,KACZD,WAAY,KACZsC,QAAY,KACZ0B,SAAY,KACZvC,IAAY,KACZwC,QAAY,KAKZ7B,WAAY,WACV,GAAIV,GAAUlB,KAAKiB,IAAIyC,IAAI,EAI3B,IAAI1D,KAAKiB,IAAI0C,KAAK,mBAAqBC,UAAYC,OAAOC,OAAOC,OAC/D,IAAK,GAAIC,GAAc,EAAGA,EAAcH,OAAOC,OAAOC,OAAQC,IAC5D,GAAIhE,KAAKiB,IAAI0C,KAAK,mBAAqBE,OAAOC,OAAOE,GAAaJ,SAAU,CAC1E5D,KAAKyD,QAAU3E,EAAE+E,OAAOC,OAAOE,GAAaC,aAC5C,OAONjE,KAAKwD,SAAW,GAAI1E,GAAEQ,GAAGC,aAAa2E,SAAShD,EAASlB,KAAMA,KAAKP,OACnE,IAAI0E,GAASC,CACTpE,MAAKP,OAAOqC,QACdqC,EAAUnE,KAAKP,OAAOqC,SAGpBsC,EADEpE,KAAKiB,IAAIM,GAAG,aAAevB,KAAKiB,IAAIM,GAAG,qBAAuBvB,KAAKiB,IAAIM,GAAG,sBACjC,gBAAzBL,GAAQmD,aAA4B,WAAa,aAExD,kBAEbF,EAAUrF,EAAEQ,GAAGC,aAAa6E,IAE9BpE,KAAK8B,QAAU,GAAIqC,GAAQjD,EAASlB,KAAMA,KAAKP,SAGjD6E,QAAS,WACPtE,KAAKiB,IAAIsD,IAAI,IAAMvE,KAAKX,IACpBW,KAAK8B,SACP9B,KAAK8B,QAAQwC,UAEXtE,KAAKwD,UACPxD,KAAKwD,SAASc,UAEhBtE,KAAKiB,IAAMjB,KAAK8B,QAAU9B,KAAKwD,SAAW,MAG5CgB,WAAY,WACNxE,KAAKwD,UACPxD,KAAKwD,SAASgB,cAKlBC,QAAS,SAAUC,EAAMC,GAClB3E,KAAKwD,UAAYxD,KAAK4B,aACnB,MAAR8C,IAAiBA,EAAO1E,KAAK8B,QAAQ8C,yBACrC,IAAIC,GAAc7E,KAAK8E,oBAAoBJ,EAC3C,IAAIG,EAAYd,OAAQ,CACtB,GAAIgB,GAAOF,EAAY,EAEvB,IAAIF,GAAqB3E,KAAKgF,QAAUD,GAAiB,KAATA,EAAe,MAC/D/E,MAAKgF,MAAQD,EACb/E,KAAKiF,QAAQxE,MAAMT,KAAM6E,OAEzB7E,MAAKgF,MAAQ,KACbhF,KAAKwD,SAASgB,cAIlBU,KAAM,SAAUC,GACd,GAAIzF,GAAOC,MAAMC,UAAUC,MAAMC,KAAKC,UAAW,EAEjD,OADAC,MAAKiB,IAAIwD,QAAQU,EAAWzF,GACrBM,MAGTa,SAAU,SAAUrB,GAClBG,MAAMC,UAAUwF,KAAK3E,MAAMT,KAAKR,WAAYA,IAS9C6F,OAAQ,SAAUC,EAAOC,EAAUC,GACjCxF,KAAKgF,MAAQ,KACbhF,KAAK8B,QAAQuD,OAAOC,EAAOC,EAAUC,GACrCxF,KAAKkF,KAAK,UAAUA,KAAK,sBAAuBI,EAAOC,GACvDvF,KAAK8B,QAAQ2D,SAMfC,cAAc,EACdV,MAAc,KASdF,oBAAqB,SAAUJ,GAC7B,IAAK,GAAIiB,GAAI,EAAGA,EAAI3F,KAAKR,WAAWuE,OAAQ4B,IAAK,CAC/C,GAAIJ,GAAWvF,KAAKR,WAAWmG,GAC3BC,EAAUL,EAASK,QAAQlB,EAC/B,IAAIkB,GAAuB,KAAZA,EAAgB,CAC7B,GAAIC,GAAc/G,EAAEgH,WAAWP,EAASQ,OAASR,EAASQ,MAAMrB,GAAQa,EAASQ,KAC7EhD,GAAS6C,KAAYlB,EAAOkB,EAChC,IAAIG,GAAQrB,EAAKqB,MAAMF,EACvB,IAAIE,EAAS,OAAQR,EAAUQ,EAAMR,EAASS,OAAQD,IAG1D,UAIFd,QAAS1C,EAAK,SAAU0D,EAAMV,EAAUR,EAAMgB,GAC5C,GAAI7F,GAAOF,IACXuF,GAASW,OAAOnB,EAAM,SAAU1E,EAAM8F,GAC/BjG,EAAKsD,SAAS4C,OACjBlG,EAAKsD,SAAS6C,WAEZnG,EAAKwF,eAEPxF,EAAKsD,SAAS8C,QACdpG,EAAKwF,cAAe,GAEtBxF,EAAKsD,SAAS+C,YAAYrG,EAAK4B,QAAQ0E,oBACvCtG,EAAKsD,SAASiD,OAAOvG,EAAKwG,KAAKrG,EAAMkF,EAAUR,IAC1CoB,IAEHF,IACA/F,EAAKwF,cAAe,IAErBK,KASLW,KAAM,SAAUrG,EAAMkF,EAAUR,GAC9B,MAAOjG,GAAE6H,IAAItG,EAAM,SAAUiF,GAC3B,OAASA,MAAOA,EAAOC,SAAUA,EAAUR,KAAMA,QAKvDjG,EAAEQ,GAAGC,aAAagB,UAAYA,GAC9BvB,IAED,SAAUF,GACT,YA2CA,SAASoF,GAAShD,EAASd,EAAWX,GACpCO,KAAKiB,IAAYiD,EAAS0C,cAAcnH,GACxCO,KAAKI,UAAYA,EACjBJ,KAAKX,GAAYe,EAAUf,GAAK,WAChCW,KAAK6G,SACL7G,KAAK8G,SAAYhI,EAAEoC,GACnBlB,KAAKP,OAAYA,EAGbA,EAAOsH,eAAgB/G,KAAKuG,YAAc9G,EAAOsH,cACjDtH,EAAOuH,QAAUhH,KAAKiB,IAAI+F,OAAOvH,EAAOuH,OAC5C,IAAI9G,GAAOF,IACXlB,GAAEmB,MAAM,WAAY,YAAa,SAAU,SAAU,mBAAoB,aAAc,SAAUgH,EAAIrG,GAC/E,MAAhBnB,EAAOmB,KAAiBV,EAAKU,GAAQnB,EAAOmB,MAElDZ,KAAKkH,YAAYhG,GACjBiG,EAAcnH,KAAKX,IAAMW,KAzD3B,GAAIoH,GAAUtI,EAAE+E,QAEZwD,EAAU,SAAUC,EAAYC,GAClC,GAAI5B,GAAG6B,EACHC,EAAaF,EAAMhC,SAASkC,UAChC,KAAK9B,EAAI,EAAGA,EAAI2B,EAAWvD,OAAQ4B,IAEjC,GADA6B,EAAOF,EAAW3B,GACd6B,EAAKjC,WAAagC,EAAMhC,SAC5B,GAAIkC,GACF,GAAID,EAAKlC,MAAMmC,KAAgBF,EAAMjC,MAAMmC,GAAa,OAAO,MAE/D,IAAID,EAAKlC,QAAUiC,EAAMjC,MAAO,OAAO,CAG3C,QAAO,GAGL6B,IACJrI,GAAE8E,UAAU5B,GAAG,QAAS,SAAUwD,GAChC,GAAInG,GAAKmG,EAAEkC,eAAiBlC,EAAEkC,cAAcC,wBAC5C7I,GAAEmB,KAAKkH,EAAe,SAAUS,EAAKC,GAC/BD,IAAQvI,GAAMwI,EAAKrD,gBAI3B,IAAIsD,IACFC,aAAc,EACdC,OAAQ,EACRC,SAAU,EACVC,UAAW,EACXC,WAAY,EACZC,aAAc,EACdC,WAAY,EA4BdvJ,GAAEuC,OAAO6C,GAIP0C,cAAe,SAAUnH,GACvB,GAAI6I,GAAU7I,EAAOyD,QACfoF,aAAmBxJ,KAAMwJ,EAAUxJ,EAAEwJ,GAC3C,IAAIrH,GAAMnC,EAAE,aACTyJ,SAAS9I,EAAO2D,mBAChBoF,KAAK,KAAM,yBAA2B/I,EAAOa,MAC7CmI,KACCC,QAAS,OACTC,KAAM,EACNC,SAAU,WACVtF,OAAQ7D,EAAO6D,SAEhBJ,SAASoF,EACZ,OAAOrH,MAIXnC,EAAEuC,OAAO6C,EAAStE,WAIhBqB,IAAW,KACX6F,SAAW,KACX1G,UAAW,KACXyI,OAAW,KACXC,OAAW,KACXzJ,GAAW,KACXgE,SAAW,KACX0F,UAAW,GACX3C,OAAW,EACX/F,QACA8C,UAAW,GAKXmB,QAAS,WAEPtE,KAAKwE,aAELxE,KAAKiB,IAAIsD,IAAI,IAAMvE,KAAKX,IACxBW,KAAK8G,SAASvC,IAAI,IAAMvE,KAAKX,IAC7BW,KAAKsG,QACLtG,KAAKiB,IAAI+H,SACThJ,KAAKiB,IAAMjB,KAAK8G,SAAW9G,KAAKI,UAAY,WACrC+G,GAAcnH,KAAKX,KAG5BoH,OAAQ,SAAUa,GAChB,GAAI2B,GAAejJ,KAAKkJ,eAAe5B,GACnC6B,EAAerK,EAAE6H,IAAIW,EAAY,SAAU8B,GAAK,MAAOA,GAAE9D,OAC7D,IAAIgC,EAAWvD,OAAQ,CACrB,GAAIwB,GAAW+B,EAAW,GAAG/B,QACzBA,GAASlG,GACXW,KAAKiB,IAAIuH,KAAK,gBAAiBjD,EAASlG,IAExCW,KAAKiB,IAAIoI,WAAW,iBAEtBrJ,KAAKsJ,cAAcH,GACnBnJ,KAAKuJ,cAAcJ,GACfF,IACFjJ,KAAKwJ,gBAAgBP,GACrBjJ,KAAKyJ,eACLzJ,KAAK0J,cACL1J,KAAK2J,wBAEP3J,KAAK4J,iBACI5J,MAAK6J,iBACd7J,KAAK8J,wBAAwBX,GACpBnJ,KAAKoG,OACdpG,KAAKwE,cAIT+B,YAAa,SAAUwD,GAIrB,GAAInB,GAAW,UAef,OAbA5I,MAAK8G,SAASkD,IAAIhK,KAAK8G,SAASmD,WAAWhK,KAAK,WAC9C,MAA+B,aAA5BnB,EAAEkB,MAAMyI,IAAI,aACN,EACsB,UAA5B3J,EAAEkB,MAAMyI,IAAI,aACbsB,EAAIG,KAAO9C,EAAQ+C,YACnBJ,EAAIpB,MAAQvB,EAAQgD,aACpBxB,EAAW,SACJ,GAJT,SAOF5I,KAAKiB,IAAIwH,IAAIzI,KAAKqK,gBAAgBN,IAClC/J,KAAKiB,IAAIwH,KAAMG,SAAUA,IAElB5I,MAGTsG,MAAO,WACLtG,KAAKiB,IAAIqJ,KAAK,IACdtK,KAAKK,QACLL,KAAKuK,OAAS,EACdvK,KAAKwK,SAAWxK,KAAKyK,SAAWzK,KAAK0K,mBAAqB,MAG5DrE,SAAU,WAQR,MAPKrG,MAAKoG,QACRpG,KAAKsG,QACLtG,KAAKiB,IAAI0J,OACL3K,KAAKmD,WAAanD,KAAKiB,IAAIsH,SAASvI,KAAKmD,WAC7CnD,KAAKI,UAAU8E,KAAK,qBACpBlF,KAAKoG,OAAQ,GAERpG,MAGTwE,WAAY,WAOV,MANIxE,MAAKoG,QACPpG,KAAKiB,IAAI2J,OACL5K,KAAKmD,WAAanD,KAAKiB,IAAI4J,YAAY7K,KAAKmD,WAChDnD,KAAKI,UAAU8E,KAAK,qBACpBlF,KAAKoG,OAAQ,GAERpG,MAGT8K,KAAM,SAAUtF,GACd,MAAqB,MAAdA,EAAEuF,SAAmBvF,EAAEwF,SAAyB,KAAdxF,EAAEuF,SAG7CE,OAAQ,SAAUzF,GAChB,MAAqB,MAAdA,EAAEuF,SAAmBvF,EAAEwF,SAAyB,KAAdxF,EAAEuF,SAG7CG,QAAS,SAAU1F,GACjB,GAAI2F,GAAY3F,EAAEwF,SAAWxF,EAAE4F,QAAU5F,EAAE6F,SAAW7F,EAAE8F,QACxD,QAAQH,IAA4B,KAAd3F,EAAEuF,SAAgC,IAAdvF,EAAEuF,SAAkB/K,KAAKP,OAAO8L,mBAAoB,GAAsB,KAAd/F,EAAEuF,UAG1GS,SAAU,SAAUhG,GAClB,MAAqB,MAAdA,EAAEuF,SAGXU,WAAY,SAAUjG,GACpB,MAAqB,MAAdA,EAAEuF,SAGXW,SAAU,SAAUlG,GAClB,MAAqB,MAAdA,EAAEuF,SAMXlE,MAAU,KACV0D,OAAU,KACVC,SAAU,KACVE,mBAAoB,KACpBD,SAAU,KAKVvD,YAAa,WACXlH,KAAKiB,IAAIe,GAAG,aAAehC,KAAKX,GAAI,qBAAsBP,EAAE6M,MAAM3L,KAAK4L,SAAU5L,OACjFA,KAAKiB,IAAIe,GAAG,cAAgBhC,KAAKX,GAAI,qBAAsBP,EAAE6M,MAAM3L,KAAK4L,SAAU5L,OAClFA,KAAKiB,IAAIe,GAAG,aAAehC,KAAKX,GAAI,qBAAsBP,EAAE6M,MAAM3L,KAAK6L,aAAc7L,OACrFA,KAAK8G,SAAS9E,GAAG,WAAahC,KAAKX,GAAIP,EAAE6M,MAAM3L,KAAK8L,WAAY9L,QAGlE4L,SAAU,SAAUpG,GAClB,GAAIvE,GAAMnC,EAAE0G,EAAEuG,OACdvG,GAAEwG,iBACFxG,EAAEkC,cAAcC,yBAA2B3H,KAAKX,GAC3C4B,EAAIgL,SAAS,uBAChBhL,EAAMA,EAAIiL,QAAQ,sBAEpB,IAAI3E,GAAQvH,KAAKK,KAAK8L,SAASlL,EAAIZ,KAAK,SAAU,IAClDL,MAAKI,UAAUiF,OAAOkC,EAAMjC,MAAOiC,EAAMhC,SAAUC,EACnD,IAAItF,GAAOF,IAGXoM,YAAW,WACTlM,EAAKsE,aACU,eAAXgB,EAAE6G,MACJnM,EAAK4G,SAASrB,SAEf,IAILoG,aAAc,SAAUrG,GACtB,GAAIvE,GAAMnC,EAAE0G,EAAEuG,OACdvG,GAAEwG,iBACG/K,EAAIgL,SAAS,uBAChBhL,EAAMA,EAAIiL,QAAQ,uBAEpBlM,KAAKuK,OAAS4B,SAASlL,EAAIZ,KAAK,SAAU,IAC1CL,KAAK2J,wBAGPmC,WAAY,SAAUtG,GACpB,GAAKxF,KAAKoG,MAAV,CAEA,GAAIkG,EAUJ,QARIxN,EAAEgH,WAAW9F,KAAKP,OAAO8M,aAC3BD,EAAUtM,KAAKP,OAAO8M,UAAU/G,EAAGsC,IAGtB,MAAXwE,IACFA,EAAUtM,KAAKwM,gBAAgBhH,IAGzB8G,GACN,IAAKxE,GAASE,OACZxC,EAAEwG,iBACFhM,KAAKyM,KACL,MACF,KAAK3E,GAASG,SACZzC,EAAEwG,iBACFhM,KAAK0M,OACL,MACF,KAAK5E,GAASI,UACZ1C,EAAEwG,iBACFhM,KAAK2M,OAAOnH,EACZ,MACF,KAAKsC,GAASK,WACZ3C,EAAEwG,iBACFhM,KAAK4M,SACL,MACF,KAAK9E,GAASM,aACZ5C,EAAEwG,iBACFhM,KAAK6M,WACL,MACF,KAAK/E,GAASO,WACZ7C,EAAEwG,iBACFhM,KAAKwE,gBAKXgI,gBAAiB,SAAUhH,GACzB,MAAIxF,MAAK8K,KAAKtF,GACLsC,EAASE,OACPhI,KAAKiL,OAAOzF,GACdsC,EAASG,SACPjI,KAAKkL,QAAQ1F,GACfsC,EAASI,UACPlI,KAAKwL,SAAShG,GAChBsC,EAASK,WACPnI,KAAKyL,WAAWjG,GAClBsC,EAASM,aACPpI,KAAK0L,SAASlG,GAChBsC,EAASO,WADX,QAKToE,IAAK,WACiB,IAAhBzM,KAAKuK,OACPvK,KAAKuK,OAASvK,KAAKK,KAAK0D,OAAS,EAEjC/D,KAAKuK,QAAU,EAEjBvK,KAAK2J,uBACL3J,KAAK4J,cAGP8C,MAAO,WACD1M,KAAKuK,SAAWvK,KAAKK,KAAK0D,OAAS,EACrC/D,KAAKuK,OAAS,EAEdvK,KAAKuK,QAAU,EAEjBvK,KAAK2J,uBACL3J,KAAK4J,cAGP+C,OAAQ,SAAUnH,GAChB,GAAI+B,GAAQvH,KAAKK,KAAK8L,SAASnM,KAAK8M,oBAAoBzM,KAAK,SAAU,IACvEL,MAAKI,UAAUiF,OAAOkC,EAAMjC,MAAOiC,EAAMhC,SAAUC,GACnDxF,KAAKwE,cAGPoI,QAAS,WACP,GAAIb,GAAS,EACTgB,EAAY/M,KAAK8M,oBAAoBlE,WAAWsB,IAAMlK,KAAKiB,IAAI+L,aACnEhN,MAAKiB,IAAIgM,WAAWhN,KAAK,SAAU0F,GACjC,MAAI7G,GAAEkB,MAAM4I,WAAWsB,IAAMpL,EAAEkB,MAAMkN,cAAgBH,GACnDhB,EAASpG,GACF,GAFT,SAKF3F,KAAKuK,OAASwB,EACd/L,KAAK2J,uBACL3J,KAAK4J,cAGPiD,UAAW,WACT,GAAId,GAAS/L,KAAKK,KAAK0D,OAAS,EAC5BgJ,EAAY/M,KAAK8M,oBAAoBlE,WAAWsB,IAAMlK,KAAKiB,IAAI+L,aACnEhN,MAAKiB,IAAIgM,WAAWhN,KAAK,SAAU0F,GACjC,MAAI7G,GAAEkB,MAAM4I,WAAWsB,IAAM6C,GAC3BhB,EAASpG,GACF,GAFT,SAKF3F,KAAKuK,OAASwB,EACd/L,KAAK2J,uBACL3J,KAAK4J,cAGPD,qBAAsB,WACpB3J,KAAKiB,IAAIkM,KAAK,6BAA6BtC,YAAY,UACvD7K,KAAK8M,oBAAoBvE,SAAS,WAGpCuE,kBAAmB,WACjB,MAAO9M,MAAKiB,IAAIgM,SAAS,0BAA4BjN,KAAKuK,OAAS,MAGrEX,WAAY,WACV,GAAIwD,GAAYpN,KAAK8M,oBACjBO,EAAUD,EAAUxE,WAAWsB,IAC/BoD,EAAaF,EAAUF,cACvBK,EAAgBvN,KAAKiB,IAAI+L,cACzBQ,EAAaxN,KAAKiB,IAAIkJ,WACN,KAAhBnK,KAAKuK,QAAgBvK,KAAKuK,QAAUvK,KAAKK,KAAK0D,OAAS,GAAe,EAAVsJ,EAC9DrN,KAAKiB,IAAIkJ,UAAUkD,EAAUG,GACpBH,EAAUC,EAAaC,GAChCvN,KAAKiB,IAAIkJ,UAAUkD,EAAUC,EAAaE,EAAaD,IAI3DrE,eAAgB,SAAU5B,GACxB,GAAIC,GAAO5B,EAAGK,EACVsE,EAAO,EACX,KAAK3E,EAAI,EAAGA,EAAI2B,EAAWvD,QACrB/D,KAAKK,KAAK0D,SAAW/D,KAAKqD,SADGsC,IAEjC4B,EAAQD,EAAW3B,GACf0B,EAAQrH,KAAKK,KAAMkH,KACvBvB,EAAQhG,KAAKK,KAAK0D,OAClB/D,KAAKK,KAAK+E,KAAKmC,GACf+C,GAAQ,6CAA+CtE,EAAQ,QAC/DsE,GAAU/C,EAAMhC,SAASkI,SAASlG,EAAMjC,MAAOiC,EAAMxC,MACrDuF,GAAQ,YAEV,OAAOA,IAGThB,cAAe,SAAUH,GACvB,GAAInJ,KAAK8I,OAAQ,CACV9I,KAAKwK,WACRxK,KAAKwK,SAAW1L,EAAE,yCAAyC4O,UAAU1N,KAAKiB,KAE5E,IAAIqJ,GAAOxL,EAAEgH,WAAW9F,KAAK8I,QAAU9I,KAAK8I,OAAOK,GAAgBnJ,KAAK8I,MACxE9I,MAAKwK,SAASF,KAAKA,KAIvBf,cAAe,SAAUJ,GACvB,GAAInJ,KAAK6I,OAAQ,CACV7I,KAAKyK,WACRzK,KAAKyK,SAAW3L,EAAE,yCAAyCoE,SAASlD,KAAKiB,KAE3E,IAAIqJ,GAAOxL,EAAEgH,WAAW9F,KAAK6I,QAAU7I,KAAK6I,OAAOM,GAAgBnJ,KAAK6I,MACxE7I,MAAKyK,SAASH,KAAKA,KAIvBR,wBAAyB,SAAUX,GACjC,GAAInJ,KAAK6J,iBAAkB,CACpB7J,KAAK0K,qBACR1K,KAAK0K,mBAAqB5L,EAAE,qDAAqDoE,SAASlD,KAAKiB,KAEjG,IAAIqJ,GAAOxL,EAAEgH,WAAW9F,KAAK6J,kBAAoB7J,KAAK6J,iBAAiBV,GAAgBnJ,KAAK6J,gBAC5F7J,MAAK0K,mBAAmBJ,KAAKA,KAIjCd,gBAAiB,SAAUc,GACrBtK,KAAKyK,SACPzK,KAAKyK,SAASkD,OAAOrD,GAErBtK,KAAKiB,IAAI2M,OAAOtD,IAIpBb,aAAc,WACZ,GAAIoE,GAAqBzG,EAAQ+C,YAAc/C,EAAQJ,SACnDA,EAAShH,KAAKiB,IAAI+F,QACjBhH,MAAKiB,IAAI2H,WAAWsB,IAAMlD,EAAU6G,IAElC7N,KAAKI,UAAUqD,SAClBzD,KAAKiB,IAAI6M,QAAQ5D,IAAK2D,EAAqB7G,MAKjD0C,YAAa,WASX,IAJA,GACyCoE,GADrCC,EAAY/N,KAAKP,OAAO8D,gBACxByK,EAAahO,KAAKiB,IAAI6M,SAASnF,KAC/BsF,EAAQjO,KAAKiB,IAAIgN,QACjBC,EAAU9G,EAAQ6G,QAAUF,EACzBC,EAAaC,EAAQC,IAC1BlO,KAAKiB,IAAI6M,QAAQnF,KAAMqF,EAAaD,IACpCD,EAAS9N,KAAKiB,IAAI6M,SAASnF,OACvBmF,GAAUE,KACdA,EAAaF,GAIjBzD,gBAAiB,SAAUzB,GAmBzB,MAjBsC,KAAlC5I,KAAK+I,UAAUoF,QAAQ,OAEzBvF,GACEsB,IAAK,OACLkE,OAAQpO,KAAKiB,IAAIoN,SAASrH,SAAW4B,EAASsB,IAAMtB,EAAS0F,WAC7D3F,KAAMC,EAASD,OAGjBC,EAASwF,OAAS,aACXxF,GAAS0F,YAEwB,KAAtCtO,KAAK+I,UAAUoF,QAAQ,WACzBvF,EAASD,KAAO,EACgC,KAAvC3I,KAAK+I,UAAUoF,QAAQ,cAChCvF,EAAS2F,MAAQ,EACjB3F,EAASD,KAAO,QAEXC,KAIX9J,EAAEQ,GAAGC,aAAa2E,SAAWA,EAC7BpF,EAAEuC,OAAOvC,EAAEQ,GAAGC,aAAcuI,IAC5B9I,IAED,SAAUF,GACT,YAiBA,SAASgC,GAAS0N,GAChB1P,EAAEuC,OAAOrB,KAAMwO,GACXxO,KAAKyO,QAASzO,KAAKkG,OAASwI,EAAQ1O,KAAKkG,SAhB/C,GAAIwI,GAAU,SAAUlM,GACtB,GAAImM,KACJ,OAAO,UAAU5J,EAAM6J,GACjBD,EAAK5J,GACP6J,EAASD,EAAK5J,IAEdvC,EAAK1C,KAAKE,KAAM+E,EAAM,SAAU1E,GAC9BsO,EAAK5J,IAAS4J,EAAK5J,QAAa8J,OAAOxO,GACvCuO,EAASnO,MAAM,KAAMV,cAW7Be,GAASC,MAAQ,SAAU+N,EAAiBC,GAC1C,MAAOjQ,GAAE6H,IAAImI,EAAiB,SAAUvJ,GACtC,GAAIyJ,GAAc,GAAIlO,GAASyE,EAG/B,OAFAyJ,GAAYhO,GAAK+N,EAAO/N,GACxBgO,EAAY/N,IAAM8N,EAAO9N,IAClB+N,KAIXlQ,EAAEuC,OAAOP,EAASlB,WAKhBmG,MAAY,KACZkJ,QAAY,KACZ/I,OAAY,KAGZ7G,GAAY,KACZoP,OAAY,EACZ7I,QAAY,WAAc,OAAO,GACjCI,MAAY,EACZyH,SAAY,SAAU9M,GAAO,MAAOA,IACpC8G,WAAY,OAGd3I,EAAEQ,GAAGC,aAAauB,SAAWA,GAE7B9B,IAED,SAAUF,GACT,YAiCA,SAASqF,MA/BT,GAAI+K,GAAMC,KAAKD,KAAO,WAAc,OAAO,GAAIC,OAAOC,WAOlDC,EAAW,SAAU7M,EAAM8M,GAC7B,GAAIC,GAAS7P,EAAMkG,EAAS4J,EAAWC,EACnCC,EAAQ,WACV,GAAIC,GAAOT,IAAQM,CACRF,GAAPK,EACFJ,EAAUnD,WAAWsD,EAAOJ,EAAOK,IAEnCJ,EAAU,KACVE,EAASjN,EAAK/B,MAAMmF,EAASlG,GAC7BkG,EAAUlG,EAAO,MAIrB,OAAO,YAOL,MANAkG,GAAU5F,KACVN,EAAOK,UACPyP,EAAYN,IACPK,IACHA,EAAUnD,WAAWsD,EAAOJ,IAEvBG,GAMX3Q,GAAEuC,OAAO8C,EAAQvE,WAIfP,GAAW,KACXe,UAAW,KACXY,GAAW,KACXC,IAAW,KACXxB,OAAW,KAKXmC,WAAY,SAAUV,EAASd,EAAWX,GACxCO,KAAKgB,GAAYE,EACjBlB,KAAKiB,IAAYnC,EAAEoC,GACnBlB,KAAKX,GAAYe,EAAUf,GAAKW,KAAK4P,YAAYhP,KACjDZ,KAAKI,UAAYA,EACjBJ,KAAKP,OAAYA,EAEbO,KAAKP,OAAO4P,WACdrP,KAAK6P,SAAWR,EAASrP,KAAK6P,SAAU7P,KAAKP,OAAO4P,WAGtDrP,KAAKkH,eAGP5C,QAAS,WACPtE,KAAKiB,IAAIsD,IAAI,IAAMvE,KAAKX,IACxBW,KAAKiB,IAAMjB,KAAKgB,GAAKhB,KAAKI,UAAY,MAQxCiF,OAAQ,WACN,KAAM,IAAIpG,OAAM,oBAIlBuH,iBAAkB,WAChB,GAAIoC,GAAW5I,KAAK8P,4BAChBhC,EAAS9N,KAAKiB,IAAI6M,SAGlBxF,EAAUtI,KAAKP,OAAOyD,QAC1B,IAAIoF,EAAS,CACJA,YAAmBxJ,KAAMwJ,EAAUxJ,EAAEwJ,GAC3C,IAAIyH,GAAezH,EAAQ0H,eAAelC,QAC1CA,GAAO5D,KAAO6F,EAAa7F,IAC3B4D,EAAOnF,MAAQoH,EAAapH,KAK/B,MAFAC,GAASsB,KAAO4D,EAAO5D,IACvBtB,EAASD,MAAQmF,EAAOnF,KACjBC,GAITnD,MAAO,WACLzF,KAAKiB,IAAIwE,SAMXyB,YAAa,WACXlH,KAAKiB,IAAIe,GAAG,SAAWhC,KAAKX,GAAIP,EAAE6M,MAAM3L,KAAK6P,SAAU7P,QAGzD6P,SAAU,SAAUrK,GACdxF,KAAKiQ,YAAYzK,IACrBxF,KAAKI,UAAUqE,QAAQzE,KAAK4E,0BAA0B,IAIxDqL,YAAa,SAAUC,GACrB,OAAQA,EAAWnF,SACjB,IAAK,GACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACH,OAAO,EAEX,GAAImF,EAAWlF,QAAS,OAAQkF,EAAWnF,SACzC,IAAK,IACL,IAAK,IACH,OAAO,MAKfjM,EAAEQ,GAAGC,aAAa4E,QAAUA,GAC5BnF,IAED,SAAUF,GACT,YAMA,SAASqR,GAASjP,EAASd,EAAWX,GACpCO,KAAK4B,WAAWV,EAASd,EAAWX,GAGtCX,EAAEuC,OAAO8O,EAASvQ,UAAWd,EAAEQ,GAAGC,aAAa4E,QAAQvE,WAKrDyF,OAAQ,SAAUC,EAAOC,EAAUC,GACjC,GAGI4K,GAHAC,EAAMrQ,KAAK4E,yBACX0L,EAAOtQ,KAAKgB,GAAGsE,MAAMiL,UAAUvQ,KAAKgB,GAAGqD,cACvCmM,EAAYjL,EAAS0J,QAAQ3J,EAAOE,EAEf,oBAAdgL,KACL1R,EAAE2R,QAAQD,KACZF,EAAOE,EAAU,GAAKF,EACtBE,EAAYA,EAAU,IAExBJ,EAAStR,EAAEgH,WAAWP,EAASQ,OAASR,EAASQ,MAAMsK,GAAO9K,EAASQ,MACvEsK,EAAMA,EAAIpB,QAAQmB,EAAQI,GAC1BxQ,KAAKiB,IAAIyP,IAAIL,EAAMC,GACnBtQ,KAAKgB,GAAG2P,eAAiB3Q,KAAKgB,GAAGqD,aAAegM,EAAItM,SAIxDa,uBAAwB,WACtB,MAAO5E,MAAKgB,GAAGsE,MAAMiL,UAAU,EAAGvQ,KAAKgB,GAAGqD,eAM5CyL,0BAA2B,WACzB,GAAIc,GAAI9R,EAAEQ,GAAGC,aAAasR,oBAAoB7Q,KAAKgB,GAAIhB,KAAKgB,GAAG2P,eAC/D,QACEzG,IAAK0G,EAAE1G,IAAMlK,KAAK8Q,uBAAyB9Q,KAAKiB,IAAIkJ,YACpDxB,KAAMiI,EAAEjI,KAAO3I,KAAKiB,IAAImJ,aACxBkE,WAAYtO,KAAK8Q,yBAIrBA,qBAAsB,WACpB,GAAIxC,GAAanC,SAASnM,KAAKiB,IAAIwH,IAAI,eAAgB,GACvD,IAAIsI,MAAMzC,GAAa,CAErB,GAAI0C,GAAahR,KAAKgB,GAAGgQ,WACrBC,EAAOrN,SAASgD,cAAc5G,KAAKgB,GAAGkQ,UACtCC,EAAQnR,KAAKgB,GAAGmQ,KACpBF,GAAKG,aACH,QACA,sCAAwCD,EAAME,WAAa,cAAgBF,EAAMG,UAEnFL,EAAKM,UAAY,OACjBP,EAAWQ,YAAYP,GACvB3C,EAAa2C,EAAKQ,aAClBT,EAAWU,YAAYT,GAEzB,MAAO3C,MAIXxP,EAAEQ,GAAGC,aAAa4Q,SAAWA,GAC7BnR,IAED,SAAUF,GACT,YAIA,SAAS6S,GAAWzQ,EAASd,EAAWX,GACtCO,KAAK4B,WAAWV,EAASd,EAAWX,GACpCX,EAAE,SAAW8S,EAAe,WAAWnJ,KACrCG,SAAU,WACVsB,IAAK,MACLvB,KAAM,QACLkJ,aAAa3Q,GARlB,GAAI0Q,GAAe,GAWnB9S,GAAEuC,OAAOsQ,EAAW/R,UAAWd,EAAEQ,GAAGC,aAAa4Q,SAASvQ,WAIxDyF,OAAQ,SAAUC,EAAOC,EAAUC,GACjC,GAGI4K,GAHAC,EAAMrQ,KAAK4E,yBACX0L,EAAOtQ,KAAKgB,GAAGsE,MAAMiL,UAAUF,EAAItM,QACnCyM,EAAYjL,EAAS0J,QAAQ3J,EAAOE,EAExC,IAAyB,mBAAdgL,GAA2B,CAChC1R,EAAE2R,QAAQD,KACZF,EAAOE,EAAU,GAAKF,EACtBE,EAAYA,EAAU,IAExBJ,EAAStR,EAAEgH,WAAWP,EAASQ,OAASR,EAASQ,MAAMsK,GAAO9K,EAASQ,MACvEsK,EAAMA,EAAIpB,QAAQmB,EAAQI,GAC1BxQ,KAAKiB,IAAIyP,IAAIL,EAAMC,GACnBtQ,KAAKgB,GAAGyE,OACR,IAAIqM,GAAQ9R,KAAKgB,GAAG+Q,iBACpBD,GAAME,UAAS,GACfF,EAAMG,QAAQ,YAAa5B,EAAItM,QAC/B+N,EAAMI,UAAU,YAAa7B,EAAItM,QACjC+N,EAAMzM,WAIVT,uBAAwB,WACtB5E,KAAKgB,GAAGyE,OACR,IAAIqM,GAAQlO,SAASuO,UAAUC,aAC/BN,GAAMI,UAAU,aAAclS,KAAKgB,GAAGsE,MAAMvB,OAC5C,IAAIsO,GAAMP,EAAMpN,KAAK4N,MAAMV,EAC3B,OAAsB,KAAfS,EAAItO,OAAesO,EAAI,GAAKA,EAAI,MAI3CvT,EAAEQ,GAAGC,aAAaoS,WAAaA,GAC/B3S,IAMD,SAAUF,GACT,YAMA,SAASyT,GAAiBrR,EAASd,EAAWX,GAC5CO,KAAK4B,WAAWV,EAASd,EAAWX,GAGtCX,EAAEuC,OAAOkR,EAAgB3S,UAAWd,EAAEQ,GAAGC,aAAa4E,QAAQvE,WAM5DyF,OAAQ,SAAUC,EAAOC,EAAUC,GACjC,GAAI6K,GAAMrQ,KAAK4E,yBAEX4N,EAAMxS,KAAKgB,GAAGU,cAAc+Q,eAE5BX,EAAQU,EAAIE,WAAW,GACvBP,EAAYL,EAAMa,YACtBR,GAAUS,mBAAmBd,EAAMe,eACnC,IAGIzC,GAHA0C,EAAUX,EAAUlP,WACpBqN,EAAOwC,EAAQvC,UAAUuB,EAAMiB,aAC/BvC,EAAYjL,EAAS0J,QAAQ3J,EAAOE,EAExC,IAAyB,mBAAdgL,GAA2B,CAChC1R,EAAE2R,QAAQD,KACZF,EAAOE,EAAU,GAAKF,EACtBE,EAAYA,EAAU,IAExBJ,EAAStR,EAAEgH,WAAWP,EAASQ,OAASR,EAASQ,MAAMsK,GAAO9K,EAASQ,MACvEsK,EAAMA,EAAIpB,QAAQmB,EAAQI,GACrBvB,QAAQ,KAAM,SACnB6C,EAAMc,mBAAmBd,EAAMe,gBAC/Bf,EAAMkB,gBAGN,IAAIC,GAAajT,KAAKgB,GAAGU,cAAckF,cAAc,MACrDqM,GAAW1B,UAAYlB,CACvB,IAAI6C,GAAclT,KAAKgB,GAAGU,cAAckF,cAAc,MACtDsM,GAAY3B,UAAYjB,CAMxB,KAHA,GACI6C,GACAC,EAFAC,EAAWrT,KAAKgB,GAAGU,cAAc4R,yBAG9BH,EAAYF,EAAWM,YAC7BH,EAAYC,EAAS7B,YAAY2B,EAElC,MAAOA,EAAYD,EAAYK,YAC9BF,EAAS7B,YAAY2B,EAItBrB,GAAM0B,WAAWH,GACjBvB,EAAM2B,cAAcL,GAEpBtB,EAAME,UAAS,GACfQ,EAAIkB,kBACJlB,EAAImB,SAAS7B,KAgBjBhC,0BAA2B,WACzB,GAAIgC,GAAQ9R,KAAKgB,GAAGU,cAAc+Q,eAAeC,WAAW,GAAGC,aAC3DiB,EAAO5T,KAAKgB,GAAGU,cAAckF,cAAc,OAC/CkL,GAAM0B,WAAWI,GACjB9B,EAAMc,mBAAmBgB,GACzB9B,EAAMkB,gBACN,IAAIa,GAAQ/U,EAAE8U,GACVhL,EAAWiL,EAAM/F,QAOrB,IANAlF,EAASD,MAAQ3I,KAAKiB,IAAI6M,SAASnF,KACnCC,EAASsB,KAAO2J,EAAM7M,SAAWhH,KAAKiB,IAAI6M,SAAS5D,IACnDtB,EAAS0F,WAAauF,EAAM7M,SAIxBhH,KAAKI,UAAUqD,QAAS,CAC1B,GAAIqQ,GAAiB9T,KAAKI,UAAUqD,QAAQqK,QAC5ClF,GAASsB,KAAO4J,EAAe5J,IAC/BtB,EAASD,MAAQmL,EAAenL,KAEhCC,EAASsB,KAAOlK,KAAKiB,IAAIkJ,YAI3B,MADA0J,GAAM7K,SACCJ,GAWThE,uBAAwB,WACtB,GAAIkN,GAAQ9R,KAAKgB,GAAGU,cAAc+Q,eAAeC,WAAW,GACxDP,EAAYL,EAAMa,YAEtB,OADAR,GAAUS,mBAAmBd,EAAMe,gBAC5BV,EAAUlP,WAAWsN,UAAU,EAAGuB,EAAMiB,gBAInDjU,EAAEQ,GAAGC,aAAagT,gBAAkBA,GACpCvT,IAMD,SAAUF,GACT,YAMA,SAASiV,GAAU7S,EAASd,EAAWX,GACrCO,KAAK4B,WAAWV,EAASd,EAAWX,GAGtCX,EAAEuC,OAAO0S,EAASnU,UAAWd,EAAEQ,GAAGC,aAAagT,gBAAgB3S,WAC7DsH,YAAa,WACX,GAAI/G,GAAQH,IACZA,MAAKP,OAAO6C,kBAAkBN,GAAG,MAAO,SAASC,GAC/C,GAAI+R,GAAW/R,EAAM5B,IAErB,OADAF,GAAM0P,SAASmE,GACX7T,EAAMC,UAAUoD,SAAS4C,OAASjG,EAAM8P,YAAY+D,IAC/C,EADT,QAGC,KAAM,KAAM,GAEfhU,KAAKiB,IAAIe,GAAG,SAAWhC,KAAKX,GAAIP,EAAE6M,MAAM3L,KAAK6P,SAAU7P,UAI3DlB,EAAEQ,GAAGC,aAAawU,SAAWA,GAC7B/U,GAuBD,SAAUF,GAmDX,QAAS+R,GAAoB3P,EAAS0H,EAAU4F,GAC9C,IAAIyF,EACF,KAAM,IAAIhV,OAAM,iFAGlB,IAAIiV,GAAQ1F,GAAWA,EAAQ0F,QAAS,CACxC,IAAIA,EAAO,CACT,GAAIlT,GAAK4C,SAASuQ,cAAc,4CAC3BnT,IAAOA,EAAGgQ,WAAWU,YAAY1Q,GAIxC,GAAIoT,GAAMxQ,SAASgD,cAAc,MACjCwN,GAAI/U,GAAK,2CACTuE,SAASyQ,KAAK7C,YAAY4C,EAE1B,IAAIjD,GAAQiD,EAAIjD,MACZmD,EAAWzQ,OAAO0Q,iBAAkBA,iBAAiBrT,GAAWA,EAAQsT,YAG5ErD,GAAMsD,WAAa,WACM,UAArBvT,EAAQgQ,WACVC,EAAMuD,SAAW,cAGnBvD,EAAMvI,SAAW,WACZsL,IACH/C,EAAMwD,WAAa,UAGrBC,EAAWC,QAAQ,SAAUlR,GAC3BwN,EAAMxN,GAAQ2Q,EAAS3Q,KAGrBmR,EAEE5T,EAAQ6T,aAAe5I,SAASmI,EAAStN,UAC3CmK,EAAM6D,UAAY,UAEpB7D,EAAM8D,SAAW,SAGnBb,EAAIc,YAAchU,EAAQoE,MAAMiL,UAAU,EAAG3H,GAEpB,UAArB1H,EAAQgQ,WACVkD,EAAIc,YAAcd,EAAIc,YAAYjG,QAAQ,MAAO,KAEnD,IAAIkG,GAAOvR,SAASgD,cAAc,OAMlCuO,GAAKD,YAAchU,EAAQoE,MAAMiL,UAAU3H,IAAa,IACxDwL,EAAI5C,YAAY2D,EAEhB,IAAIC,IACFlL,IAAKiL,EAAKE,UAAYlJ,SAASmI,EAAyB,gBACxD3L,KAAMwM,EAAKG,WAAanJ,SAASmI,EAA0B,iBAS7D,OANIJ,GACFiB,EAAKhE,MAAMoE,gBAAkB,OAE7B3R,SAASyQ,KAAK3C,YAAY0C,GAGrBgB,EAhHT,GAAIR,IACF,YACA,YACA,QACA,SACA,YACA,YAEA,iBACA,mBACA,oBACA,kBACA,cAEA,aACA,eACA,gBACA,cAGA,YACA,cACA,aACA,cACA,WACA,iBACA,aACA,aAEA,YACA,gBACA,aACA,iBAEA,gBACA,cAEA,UACA,cAIEX,EAA+B,mBAAXpQ,QACpBiR,EAAab,GAAuC,MAA1BpQ,OAAO2R,eAwErC1W,GAAEQ,GAAGC,aAAasR,oBAAsBA,GAEtC7R,GAEKA"} \ No newline at end of file
diff --git a/library/markdown.php b/library/markdown.php
deleted file mode 100644
index 0e3275ff2..000000000
--- a/library/markdown.php
+++ /dev/null
@@ -1,2932 +0,0 @@
-<?php
-#
-# Markdown Extra - A text-to-HTML conversion tool for web writers
-#
-# PHP Markdown & Extra
-# Copyright (c) 2004-2012 Michel Fortin
-# <http://michelf.com/projects/php-markdown/>
-#
-# Original Markdown
-# Copyright (c) 2004-2006 John Gruber
-# <http://daringfireball.net/projects/markdown/>
-#
-
-
-define( 'MARKDOWN_VERSION', "1.0.1o" ); # Sun 8 Jan 2012
-define( 'MARKDOWNEXTRA_VERSION', "1.2.5" ); # Sun 8 Jan 2012
-
-
-#
-# Global default settings:
-#
-
-# Change to ">" for HTML output
-@define( 'MARKDOWN_EMPTY_ELEMENT_SUFFIX', " />");
-
-# Define the width of a tab for code blocks.
-@define( 'MARKDOWN_TAB_WIDTH', 4 );
-
-# Optional title attribute for footnote links and backlinks.
-@define( 'MARKDOWN_FN_LINK_TITLE', "" );
-@define( 'MARKDOWN_FN_BACKLINK_TITLE', "" );
-
-# Optional class attribute for footnote links and backlinks.
-@define( 'MARKDOWN_FN_LINK_CLASS', "" );
-@define( 'MARKDOWN_FN_BACKLINK_CLASS', "" );
-
-
-#
-# WordPress settings:
-#
-
-# Change to false to remove Markdown from posts and/or comments.
-@define( 'MARKDOWN_WP_POSTS', true );
-@define( 'MARKDOWN_WP_COMMENTS', true );
-
-
-
-### Standard Function Interface ###
-
-@define( 'MARKDOWN_PARSER_CLASS', 'MarkdownExtra_Parser' );
-
-function Markdown($text) {
-#
-# Initialize the parser and return the result of its transform method.
-#
- # Setup static parser variable.
- static $parser;
- if (!isset($parser)) {
- $parser_class = MARKDOWN_PARSER_CLASS;
- $parser = new $parser_class;
- }
-
- # Transform text using parser.
- return $parser->transform($text);
-}
-
-
-### WordPress Plugin Interface ###
-
-/*
-Plugin Name: Markdown Extra
-Plugin URI: http://michelf.com/projects/php-markdown/
-Description: <a href="http://daringfireball.net/projects/markdown/syntax">Markdown syntax</a> allows you to write using an easy-to-read, easy-to-write plain text format. Based on the original Perl version by <a href="http://daringfireball.net/">John Gruber</a>. <a href="http://michelf.com/projects/php-markdown/">More...</a>
-Version: 1.2.5
-Author: Michel Fortin
-Author URI: http://michelf.com/
-*/
-
-if (isset($wp_version)) {
- # More details about how it works here:
- # <http://michelf.com/weblog/2005/wordpress-text-flow-vs-markdown/>
-
- # Post content and excerpts
- # - Remove WordPress paragraph generator.
- # - Run Markdown on excerpt, then remove all tags.
- # - Add paragraph tag around the excerpt, but remove it for the excerpt rss.
- if (MARKDOWN_WP_POSTS) {
- remove_filter('the_content', 'wpautop');
- remove_filter('the_content_rss', 'wpautop');
- remove_filter('the_excerpt', 'wpautop');
- add_filter('the_content', 'mdwp_MarkdownPost', 6);
- add_filter('the_content_rss', 'mdwp_MarkdownPost', 6);
- add_filter('get_the_excerpt', 'mdwp_MarkdownPost', 6);
- add_filter('get_the_excerpt', 'trim', 7);
- add_filter('the_excerpt', 'mdwp_add_p');
- add_filter('the_excerpt_rss', 'mdwp_strip_p');
-
- remove_filter('content_save_pre', 'balanceTags', 50);
- remove_filter('excerpt_save_pre', 'balanceTags', 50);
- add_filter('the_content', 'balanceTags', 50);
- add_filter('get_the_excerpt', 'balanceTags', 9);
- }
-
- # Add a footnote id prefix to posts when inside a loop.
- function mdwp_MarkdownPost($text) {
- static $parser;
- if (!$parser) {
- $parser_class = MARKDOWN_PARSER_CLASS;
- $parser = new $parser_class;
- }
- if (is_single() || is_page() || is_feed()) {
- $parser->fn_id_prefix = "";
- } else {
- $parser->fn_id_prefix = get_the_ID() . ".";
- }
- return $parser->transform($text);
- }
-
- # Comments
- # - Remove WordPress paragraph generator.
- # - Remove WordPress auto-link generator.
- # - Scramble important tags before passing them to the kses filter.
- # - Run Markdown on excerpt then remove paragraph tags.
- if (MARKDOWN_WP_COMMENTS) {
- remove_filter('comment_text', 'wpautop', 30);
- remove_filter('comment_text', 'make_clickable');
- add_filter('pre_comment_content', 'Markdown', 6);
- add_filter('pre_comment_content', 'mdwp_hide_tags', 8);
- add_filter('pre_comment_content', 'mdwp_show_tags', 12);
- add_filter('get_comment_text', 'Markdown', 6);
- add_filter('get_comment_excerpt', 'Markdown', 6);
- add_filter('get_comment_excerpt', 'mdwp_strip_p', 7);
-
- global $mdwp_hidden_tags, $mdwp_placeholders;
- $mdwp_hidden_tags = explode(' ',
- '<p> </p> <pre> </pre> <ol> </ol> <ul> </ul> <li> </li>');
- $mdwp_placeholders = explode(' ', str_rot13(
- 'pEj07ZbbBZ U1kqgh4w4p pre2zmeN6K QTi31t9pre ol0MP1jzJR '.
- 'ML5IjmbRol ulANi1NsGY J7zRLJqPul liA8ctl16T K9nhooUHli'));
- }
-
- function mdwp_add_p($text) {
- if (!preg_match('{^$|^<(p|ul|ol|dl|pre|blockquote)>}i', $text)) {
- $text = '<p>'.$text.'</p>';
- $text = preg_replace('{\n{2,}}', "</p>\n\n<p>", $text);
- }
- return $text;
- }
-
- function mdwp_strip_p($t) { return preg_replace('{</?p>}i', '', $t); }
-
- function mdwp_hide_tags($text) {
- global $mdwp_hidden_tags, $mdwp_placeholders;
- return str_replace($mdwp_hidden_tags, $mdwp_placeholders, $text);
- }
- function mdwp_show_tags($text) {
- global $mdwp_hidden_tags, $mdwp_placeholders;
- return str_replace($mdwp_placeholders, $mdwp_hidden_tags, $text);
- }
-}
-
-
-### bBlog Plugin Info ###
-
-function identify_modifier_markdown() {
- return array(
- 'name' => 'markdown',
- 'type' => 'modifier',
- 'nicename' => 'PHP Markdown Extra',
- 'description' => 'A text-to-HTML conversion tool for web writers',
- 'authors' => 'Michel Fortin and John Gruber',
- 'licence' => 'GPL',
- 'version' => MARKDOWNEXTRA_VERSION,
- 'help' => '<a href="http://daringfireball.net/projects/markdown/syntax">Markdown syntax</a> allows you to write using an easy-to-read, easy-to-write plain text format. Based on the original Perl version by <a href="http://daringfireball.net/">John Gruber</a>. <a href="http://michelf.com/projects/php-markdown/">More...</a>',
- );
-}
-
-
-### Smarty Modifier Interface ###
-
-function smarty_modifier_markdown($text) {
- return Markdown($text);
-}
-
-
-### Textile Compatibility Mode ###
-
-# Rename this file to "classTextile.php" and it can replace Textile everywhere.
-
-if (strcasecmp(substr(__FILE__, -16), "classTextile.php") == 0) {
- # Try to include PHP SmartyPants. Should be in the same directory.
- @include_once 'smartypants.php';
- # Fake Textile class. It calls Markdown instead.
- class Textile {
- function TextileThis($text, $lite='', $encode='') {
- if ($lite == '' && $encode == '') $text = Markdown($text);
- if (function_exists('SmartyPants')) $text = SmartyPants($text);
- return $text;
- }
- # Fake restricted version: restrictions are not supported for now.
- function TextileRestricted($text, $lite='', $noimage='') {
- return $this->TextileThis($text, $lite);
- }
- # Workaround to ensure compatibility with TextPattern 4.0.3.
- function blockLite($text) { return $text; }
- }
-}
-
-
-
-#
-# Markdown Parser Class
-#
-
-class Markdown_Parser {
-
- # Regex to match balanced [brackets].
- # Needed to insert a maximum bracked depth while converting to PHP.
- var $nested_brackets_depth = 6;
- var $nested_brackets_re;
-
- var $nested_url_parenthesis_depth = 4;
- var $nested_url_parenthesis_re;
-
- # Table of hash values for escaped characters:
- var $escape_chars = '\`*_{}[]()>#+-.!';
- var $escape_chars_re;
-
- # Change to ">" for HTML output.
- var $empty_element_suffix = MARKDOWN_EMPTY_ELEMENT_SUFFIX;
- var $tab_width = MARKDOWN_TAB_WIDTH;
-
- # Change to `true` to disallow markup or entities.
- var $no_markup = false;
- var $no_entities = false;
-
- # Predefined urls and titles for reference links and images.
- var $predef_urls = array();
- var $predef_titles = array();
-
-
- function Markdown_Parser() {
- #
- # Constructor function. Initialize appropriate member variables.
- #
- $this->_initDetab();
- $this->prepareItalicsAndBold();
-
- $this->nested_brackets_re =
- str_repeat('(?>[^\[\]]+|\[', $this->nested_brackets_depth).
- str_repeat('\])*', $this->nested_brackets_depth);
-
- $this->nested_url_parenthesis_re =
- str_repeat('(?>[^()\s]+|\(', $this->nested_url_parenthesis_depth).
- str_repeat('(?>\)))*', $this->nested_url_parenthesis_depth);
-
- $this->escape_chars_re = '['.preg_quote($this->escape_chars).']';
-
- # Sort document, block, and span gamut in ascendent priority order.
- asort($this->document_gamut);
- asort($this->block_gamut);
- asort($this->span_gamut);
- }
-
-
- # Internal hashes used during transformation.
- var $urls = array();
- var $titles = array();
- var $html_hashes = array();
-
- # Status flag to avoid invalid nesting.
- var $in_anchor = false;
-
-
- function setup() {
- #
- # Called before the transformation process starts to setup parser
- # states.
- #
- # Clear global hashes.
- $this->urls = $this->predef_urls;
- $this->titles = $this->predef_titles;
- $this->html_hashes = array();
-
- $in_anchor = false;
- }
-
- function teardown() {
- #
- # Called after the transformation process to clear any variable
- # which may be taking up memory unnecessarly.
- #
- $this->urls = array();
- $this->titles = array();
- $this->html_hashes = array();
- }
-
-
- function transform($text) {
- #
- # Main function. Performs some preprocessing on the input text
- # and pass it through the document gamut.
- #
- $this->setup();
-
- # Remove UTF-8 BOM and marker character in input, if present.
- $text = preg_replace('{^\xEF\xBB\xBF|\x1A}', '', $text);
-
- # Standardize line endings:
- # DOS to Unix and Mac to Unix
- $text = preg_replace('{\r\n?}', "\n", $text);
-
- # Make sure $text ends with a couple of newlines:
- $text .= "\n\n";
-
- # Convert all tabs to spaces.
- $text = $this->detab($text);
-
- # Turn block-level HTML blocks into hash entries
- $text = $this->hashHTMLBlocks($text);
-
- # Strip any lines consisting only of spaces and tabs.
- # This makes subsequent regexen easier to write, because we can
- # match consecutive blank lines with /\n+/ instead of something
- # contorted like /[ ]*\n+/ .
- $text = preg_replace('/^[ ]+$/m', '', $text);
-
- # Run document gamut methods.
- foreach ($this->document_gamut as $method => $priority) {
- $text = $this->$method($text);
- }
-
- $this->teardown();
-
- return $text . "\n";
- }
-
- var $document_gamut = array(
- # Strip link definitions, store in hashes.
- "stripLinkDefinitions" => 20,
-
- "runBasicBlockGamut" => 30,
- );
-
-
- function stripLinkDefinitions($text) {
- #
- # Strips link definitions from text, stores the URLs and titles in
- # hash references.
- #
- $less_than_tab = $this->tab_width - 1;
-
- # Link defs are in the form: ^[id]: url "optional title"
- $text = preg_replace_callback('{
- ^[ ]{0,'.$less_than_tab.'}\[(.+)\][ ]?: # id = $1
- [ ]*
- \n? # maybe *one* newline
- [ ]*
- (?:
- <(.+?)> # url = $2
- |
- (\S+?) # url = $3
- )
- [ ]*
- \n? # maybe one newline
- [ ]*
- (?:
- (?<=\s) # lookbehind for whitespace
- ["(]
- (.*?) # title = $4
- [")]
- [ ]*
- )? # title is optional
- (?:\n+|\Z)
- }xm',
- array(&$this, '_stripLinkDefinitions_callback'),
- $text);
- return $text;
- }
- function _stripLinkDefinitions_callback($matches) {
- $link_id = strtolower($matches[1]);
- $url = $matches[2] == '' ? $matches[3] : $matches[2];
- $this->urls[$link_id] = $url;
- $this->titles[$link_id] =& $matches[4];
- return ''; # String that will replace the block
- }
-
-
- function hashHTMLBlocks($text) {
- if ($this->no_markup) return $text;
-
- $less_than_tab = $this->tab_width - 1;
-
- # Hashify HTML blocks:
- # We only want to do this for block-level HTML tags, such as headers,
- # lists, and tables. That's because we still want to wrap <p>s around
- # "paragraphs" that are wrapped in non-block-level tags, such as anchors,
- # phrase emphasis, and spans. The list of tags we're looking for is
- # hard-coded:
- #
- # * List "a" is made of tags which can be both inline or block-level.
- # These will be treated block-level when the start tag is alone on
- # its line, otherwise they're not matched here and will be taken as
- # inline later.
- # * List "b" is made of tags which are always block-level;
- #
- $block_tags_a_re = 'ins|del';
- $block_tags_b_re = 'p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|address|'.
- 'script|noscript|form|fieldset|iframe|math';
-
- # Regular expression for the content of a block tag.
- $nested_tags_level = 4;
- $attr = '
- (?> # optional tag attributes
- \s # starts with whitespace
- (?>
- [^>"/]+ # text outside quotes
- |
- /+(?!>) # slash not followed by ">"
- |
- "[^"]*" # text inside double quotes (tolerate ">")
- |
- \'[^\']*\' # text inside single quotes (tolerate ">")
- )*
- )?
- ';
- $content =
- str_repeat('
- (?>
- [^<]+ # content without tag
- |
- <\2 # nested opening tag
- '.$attr.' # attributes
- (?>
- />
- |
- >', $nested_tags_level). # end of opening tag
- '.*?'. # last level nested tag content
- str_repeat('
- </\2\s*> # closing nested tag
- )
- |
- <(?!/\2\s*> # other tags with a different name
- )
- )*',
- $nested_tags_level);
- $content2 = str_replace('\2', '\3', $content);
-
- # First, look for nested blocks, e.g.:
- # <div>
- # <div>
- # tags for inner block must be indented.
- # </div>
- # </div>
- #
- # The outermost tags must start at the left margin for this to match, and
- # the inner nested divs must be indented.
- # We need to do this before the next, more liberal match, because the next
- # match will start at the first `<div>` and stop at the first `</div>`.
- $text = preg_replace_callback('{(?>
- (?>
- (?<=\n\n) # Starting after a blank line
- | # or
- \A\n? # the beginning of the doc
- )
- ( # save in $1
-
- # Match from `\n<tag>` to `</tag>\n`, handling nested tags
- # in between.
-
- [ ]{0,'.$less_than_tab.'}
- <('.$block_tags_b_re.')# start tag = $2
- '.$attr.'> # attributes followed by > and \n
- '.$content.' # content, support nesting
- </\2> # the matching end tag
- [ ]* # trailing spaces/tabs
- (?=\n+|\Z) # followed by a newline or end of document
-
- | # Special version for tags of group a.
-
- [ ]{0,'.$less_than_tab.'}
- <('.$block_tags_a_re.')# start tag = $3
- '.$attr.'>[ ]*\n # attributes followed by >
- '.$content2.' # content, support nesting
- </\3> # the matching end tag
- [ ]* # trailing spaces/tabs
- (?=\n+|\Z) # followed by a newline or end of document
-
- | # Special case just for <hr />. It was easier to make a special
- # case than to make the other regex more complicated.
-
- [ ]{0,'.$less_than_tab.'}
- <(hr) # start tag = $2
- '.$attr.' # attributes
- /?> # the matching end tag
- [ ]*
- (?=\n{2,}|\Z) # followed by a blank line or end of document
-
- | # Special case for standalone HTML comments:
-
- [ ]{0,'.$less_than_tab.'}
- (?s:
- <!-- .*? -->
- )
- [ ]*
- (?=\n{2,}|\Z) # followed by a blank line or end of document
-
- | # PHP and ASP-style processor instructions (<? and <%)
-
- [ ]{0,'.$less_than_tab.'}
- (?s:
- <([?%]) # $2
- .*?
- \2>
- )
- [ ]*
- (?=\n{2,}|\Z) # followed by a blank line or end of document
-
- )
- )}Sxmi',
- array(&$this, '_hashHTMLBlocks_callback'),
- $text);
-
- return $text;
- }
- function _hashHTMLBlocks_callback($matches) {
- $text = $matches[1];
- $key = $this->hashBlock($text);
- return "\n\n$key\n\n";
- }
-
-
- function hashPart($text, $boundary = 'X') {
- #
- # Called whenever a tag must be hashed when a function insert an atomic
- # element in the text stream. Passing $text to through this function gives
- # a unique text-token which will be reverted back when calling unhash.
- #
- # The $boundary argument specify what character should be used to surround
- # the token. By convension, "B" is used for block elements that needs not
- # to be wrapped into paragraph tags at the end, ":" is used for elements
- # that are word separators and "X" is used in the general case.
- #
- # Swap back any tag hash found in $text so we do not have to `unhash`
- # multiple times at the end.
- $text = $this->unhash($text);
-
- # Then hash the block.
- static $i = 0;
- $key = "$boundary\x1A" . ++$i . $boundary;
- $this->html_hashes[$key] = $text;
- return $key; # String that will replace the tag.
- }
-
-
- function hashBlock($text) {
- #
- # Shortcut function for hashPart with block-level boundaries.
- #
- return $this->hashPart($text, 'B');
- }
-
-
- var $block_gamut = array(
- #
- # These are all the transformations that form block-level
- # tags like paragraphs, headers, and list items.
- #
- "doHeaders" => 10,
- "doHorizontalRules" => 20,
-
- "doLists" => 40,
- "doCodeBlocks" => 50,
- "doBlockQuotes" => 60,
- );
-
- function runBlockGamut($text) {
- #
- # Run block gamut tranformations.
- #
- # We need to escape raw HTML in Markdown source before doing anything
- # else. This need to be done for each block, and not only at the
- # begining in the Markdown function since hashed blocks can be part of
- # list items and could have been indented. Indented blocks would have
- # been seen as a code block in a previous pass of hashHTMLBlocks.
- $text = $this->hashHTMLBlocks($text);
-
- return $this->runBasicBlockGamut($text);
- }
-
- function runBasicBlockGamut($text) {
- #
- # Run block gamut tranformations, without hashing HTML blocks. This is
- # useful when HTML blocks are known to be already hashed, like in the first
- # whole-document pass.
- #
- foreach ($this->block_gamut as $method => $priority) {
- $text = $this->$method($text);
- }
-
- # Finally form paragraph and restore hashed blocks.
- $text = $this->formParagraphs($text);
-
- return $text;
- }
-
-
- function doHorizontalRules($text) {
- # Do Horizontal Rules:
- return preg_replace(
- '{
- ^[ ]{0,3} # Leading space
- ([-*_]) # $1: First marker
- (?> # Repeated marker group
- [ ]{0,2} # Zero, one, or two spaces.
- \1 # Marker character
- ){2,} # Group repeated at least twice
- [ ]* # Tailing spaces
- $ # End of line.
- }mx',
- "\n".$this->hashBlock("<hr$this->empty_element_suffix")."\n",
- $text);
- }
-
-
- var $span_gamut = array(
- #
- # These are all the transformations that occur *within* block-level
- # tags like paragraphs, headers, and list items.
- #
- # Process character escapes, code spans, and inline HTML
- # in one shot.
- "parseSpan" => -30,
-
- # Process anchor and image tags. Images must come first,
- # because ![foo][f] looks like an anchor.
- "doImages" => 10,
- "doAnchors" => 20,
-
- # Make links out of things like `<http://example.com/>`
- # Must come after doAnchors, because you can use < and >
- # delimiters in inline links like [this](<url>).
- "doAutoLinks" => 30,
- "encodeAmpsAndAngles" => 40,
-
- "doItalicsAndBold" => 50,
- "doHardBreaks" => 60,
- );
-
- function runSpanGamut($text) {
- #
- # Run span gamut tranformations.
- #
- foreach ($this->span_gamut as $method => $priority) {
- $text = $this->$method($text);
- }
-
- return $text;
- }
-
-
- function doHardBreaks($text) {
- # Do hard breaks:
- return preg_replace_callback('/ {2,}\n/',
- array(&$this, '_doHardBreaks_callback'), $text);
- }
- function _doHardBreaks_callback($matches) {
- return $this->hashPart("<br$this->empty_element_suffix\n");
- }
-
-
- function doAnchors($text) {
- #
- # Turn Markdown link shortcuts into XHTML <a> tags.
- #
- if ($this->in_anchor) return $text;
- $this->in_anchor = true;
-
- #
- # First, handle reference-style links: [link text] [id]
- #
- $text = preg_replace_callback('{
- ( # wrap whole match in $1
- \[
- ('.$this->nested_brackets_re.') # link text = $2
- \]
-
- [ ]? # one optional space
- (?:\n[ ]*)? # one optional newline followed by spaces
-
- \[
- (.*?) # id = $3
- \]
- )
- }xs',
- array(&$this, '_doAnchors_reference_callback'), $text);
-
- #
- # Next, inline-style links: [link text](url "optional title")
- #
- $text = preg_replace_callback('{
- ( # wrap whole match in $1
- \[
- ('.$this->nested_brackets_re.') # link text = $2
- \]
- \( # literal paren
- [ \n]*
- (?:
- <(.+?)> # href = $3
- |
- ('.$this->nested_url_parenthesis_re.') # href = $4
- )
- [ \n]*
- ( # $5
- ([\'"]) # quote char = $6
- (.*?) # Title = $7
- \6 # matching quote
- [ \n]* # ignore any spaces/tabs between closing quote and )
- )? # title is optional
- \)
- )
- }xs',
- array(&$this, '_doAnchors_inline_callback'), $text);
-
- #
- # Last, handle reference-style shortcuts: [link text]
- # These must come last in case you've also got [link text][1]
- # or [link text](/foo)
- #
- $text = preg_replace_callback('{
- ( # wrap whole match in $1
- \[
- ([^\[\]]+) # link text = $2; can\'t contain [ or ]
- \]
- )
- }xs',
- array(&$this, '_doAnchors_reference_callback'), $text);
-
- $this->in_anchor = false;
- return $text;
- }
- function _doAnchors_reference_callback($matches) {
- $whole_match = $matches[1];
- $link_text = $matches[2];
- $link_id =& $matches[3];
-
- if ($link_id == "") {
- # for shortcut links like [this][] or [this].
- $link_id = $link_text;
- }
-
- # lower-case and turn embedded newlines into spaces
- $link_id = strtolower($link_id);
- $link_id = preg_replace('{[ ]?\n}', ' ', $link_id);
-
- if (isset($this->urls[$link_id])) {
- $url = $this->urls[$link_id];
- $url = $this->encodeAttribute($url);
-
- $result = "<a href=\"$url\"";
- if ( isset( $this->titles[$link_id] ) ) {
- $title = $this->titles[$link_id];
- $title = $this->encodeAttribute($title);
- $result .= " title=\"$title\"";
- }
-
- $link_text = $this->runSpanGamut($link_text);
- $result .= ">$link_text</a>";
- $result = $this->hashPart($result);
- }
- else {
- $result = $whole_match;
- }
- return $result;
- }
- function _doAnchors_inline_callback($matches) {
- $whole_match = $matches[1];
- $link_text = $this->runSpanGamut($matches[2]);
- $url = $matches[3] == '' ? $matches[4] : $matches[3];
- $title =& $matches[7];
-
- $url = $this->encodeAttribute($url);
-
- $result = "<a href=\"$url\"";
- if (isset($title)) {
- $title = $this->encodeAttribute($title);
- $result .= " title=\"$title\"";
- }
-
- $link_text = $this->runSpanGamut($link_text);
- $result .= ">$link_text</a>";
-
- return $this->hashPart($result);
- }
-
-
- function doImages($text) {
- #
- # Turn Markdown image shortcuts into <img> tags.
- #
- #
- # First, handle reference-style labeled images: ![alt text][id]
- #
- $text = preg_replace_callback('{
- ( # wrap whole match in $1
- !\[
- ('.$this->nested_brackets_re.') # alt text = $2
- \]
-
- [ ]? # one optional space
- (?:\n[ ]*)? # one optional newline followed by spaces
-
- \[
- (.*?) # id = $3
- \]
-
- )
- }xs',
- array(&$this, '_doImages_reference_callback'), $text);
-
- #
- # Next, handle inline images: ![alt text](url "optional title")
- # Don't forget: encode * and _
- #
- $text = preg_replace_callback('{
- ( # wrap whole match in $1
- !\[
- ('.$this->nested_brackets_re.') # alt text = $2
- \]
- \s? # One optional whitespace character
- \( # literal paren
- [ \n]*
- (?:
- <(\S*)> # src url = $3
- |
- ('.$this->nested_url_parenthesis_re.') # src url = $4
- )
- [ \n]*
- ( # $5
- ([\'"]) # quote char = $6
- (.*?) # title = $7
- \6 # matching quote
- [ \n]*
- )? # title is optional
- \)
- )
- }xs',
- array(&$this, '_doImages_inline_callback'), $text);
-
- return $text;
- }
- function _doImages_reference_callback($matches) {
- $whole_match = $matches[1];
- $alt_text = $matches[2];
- $link_id = strtolower($matches[3]);
-
- if ($link_id == "") {
- $link_id = strtolower($alt_text); # for shortcut links like ![this][].
- }
-
- $alt_text = $this->encodeAttribute($alt_text);
- if (isset($this->urls[$link_id])) {
- $url = $this->encodeAttribute($this->urls[$link_id]);
- $result = "<img src=\"$url\" alt=\"$alt_text\"";
- if (isset($this->titles[$link_id])) {
- $title = $this->titles[$link_id];
- $title = $this->encodeAttribute($title);
- $result .= " title=\"$title\"";
- }
- $result .= $this->empty_element_suffix;
- $result = $this->hashPart($result);
- }
- else {
- # If there's no such link ID, leave intact:
- $result = $whole_match;
- }
-
- return $result;
- }
- function _doImages_inline_callback($matches) {
- $whole_match = $matches[1];
- $alt_text = $matches[2];
- $url = $matches[3] == '' ? $matches[4] : $matches[3];
- $title =& $matches[7];
-
- $alt_text = $this->encodeAttribute($alt_text);
- $url = $this->encodeAttribute($url);
- $result = "<img src=\"$url\" alt=\"$alt_text\"";
- if (isset($title)) {
- $title = $this->encodeAttribute($title);
- $result .= " title=\"$title\""; # $title already quoted
- }
- $result .= $this->empty_element_suffix;
-
- return $this->hashPart($result);
- }
-
-
- function doHeaders($text) {
- # Setext-style headers:
- # Header 1
- # ========
- #
- # Header 2
- # --------
- #
- $text = preg_replace_callback('{ ^(.+?)[ ]*\n(=+|-+)[ ]*\n+ }mx',
- array(&$this, '_doHeaders_callback_setext'), $text);
-
- # atx-style headers:
- # # Header 1
- # ## Header 2
- # ## Header 2 with closing hashes ##
- # ...
- # ###### Header 6
- #
- $text = preg_replace_callback('{
- ^(\#{1,6}) # $1 = string of #\'s
- [ ]*
- (.+?) # $2 = Header text
- [ ]*
- \#* # optional closing #\'s (not counted)
- \n+
- }xm',
- array(&$this, '_doHeaders_callback_atx'), $text);
-
- return $text;
- }
- function _doHeaders_callback_setext($matches) {
- # Terrible hack to check we haven't found an empty list item.
- if ($matches[2] == '-' && preg_match('{^-(?: |$)}', $matches[1]))
- return $matches[0];
-
- $level = $matches[2]{0} == '=' ? 1 : 2;
- $block = "<h$level>".$this->runSpanGamut($matches[1])."</h$level>";
- return "\n" . $this->hashBlock($block) . "\n\n";
- }
- function _doHeaders_callback_atx($matches) {
- $level = strlen($matches[1]);
- $block = "<h$level>".$this->runSpanGamut($matches[2])."</h$level>";
- return "\n" . $this->hashBlock($block) . "\n\n";
- }
-
-
- function doLists($text) {
- #
- # Form HTML ordered (numbered) and unordered (bulleted) lists.
- #
- $less_than_tab = $this->tab_width - 1;
-
- # Re-usable patterns to match list item bullets and number markers:
- $marker_ul_re = '[*+-]';
- $marker_ol_re = '\d+[\.]';
- $marker_any_re = "(?:$marker_ul_re|$marker_ol_re)";
-
- $markers_relist = array(
- $marker_ul_re => $marker_ol_re,
- $marker_ol_re => $marker_ul_re,
- );
-
- foreach ($markers_relist as $marker_re => $other_marker_re) {
- # Re-usable pattern to match any entirel ul or ol list:
- $whole_list_re = '
- ( # $1 = whole list
- ( # $2
- ([ ]{0,'.$less_than_tab.'}) # $3 = number of spaces
- ('.$marker_re.') # $4 = first list item marker
- [ ]+
- )
- (?s:.+?)
- ( # $5
- \z
- |
- \n{2,}
- (?=\S)
- (?! # Negative lookahead for another list item marker
- [ ]*
- '.$marker_re.'[ ]+
- )
- |
- (?= # Lookahead for another kind of list
- \n
- \3 # Must have the same indentation
- '.$other_marker_re.'[ ]+
- )
- )
- )
- '; // mx
-
- # We use a different prefix before nested lists than top-level lists.
- # See extended comment in _ProcessListItems().
-
- if ($this->list_level) {
- $text = preg_replace_callback('{
- ^
- '.$whole_list_re.'
- }mx',
- array(&$this, '_doLists_callback'), $text);
- }
- else {
- $text = preg_replace_callback('{
- (?:(?<=\n)\n|\A\n?) # Must eat the newline
- '.$whole_list_re.'
- }mx',
- array(&$this, '_doLists_callback'), $text);
- }
- }
-
- return $text;
- }
- function _doLists_callback($matches) {
- # Re-usable patterns to match list item bullets and number markers:
- $marker_ul_re = '[*+-]';
- $marker_ol_re = '\d+[\.]';
- $marker_any_re = "(?:$marker_ul_re|$marker_ol_re)";
-
- $list = $matches[1];
- $list_type = preg_match("/$marker_ul_re/", $matches[4]) ? "ul" : "ol";
-
- $marker_any_re = ( $list_type == "ul" ? $marker_ul_re : $marker_ol_re );
-
- $list .= "\n";
- $result = $this->processListItems($list, $marker_any_re);
-
- $result = $this->hashBlock("<$list_type>\n" . $result . "</$list_type>");
- return "\n". $result ."\n\n";
- }
-
- var $list_level = 0;
-
- function processListItems($list_str, $marker_any_re) {
- #
- # Process the contents of a single ordered or unordered list, splitting it
- # into individual list items.
- #
- # The $this->list_level global keeps track of when we're inside a list.
- # Each time we enter a list, we increment it; when we leave a list,
- # we decrement. If it's zero, we're not in a list anymore.
- #
- # We do this because when we're not inside a list, we want to treat
- # something like this:
- #
- # I recommend upgrading to version
- # 8. Oops, now this line is treated
- # as a sub-list.
- #
- # As a single paragraph, despite the fact that the second line starts
- # with a digit-period-space sequence.
- #
- # Whereas when we're inside a list (or sub-list), that line will be
- # treated as the start of a sub-list. What a kludge, huh? This is
- # an aspect of Markdown's syntax that's hard to parse perfectly
- # without resorting to mind-reading. Perhaps the solution is to
- # change the syntax rules such that sub-lists must start with a
- # starting cardinal number; e.g. "1." or "a.".
-
- $this->list_level++;
-
- # trim trailing blank lines:
- $list_str = preg_replace("/\n{2,}\\z/", "\n", $list_str);
-
- $list_str = preg_replace_callback('{
- (\n)? # leading line = $1
- (^[ ]*) # leading whitespace = $2
- ('.$marker_any_re.' # list marker and space = $3
- (?:[ ]+|(?=\n)) # space only required if item is not empty
- )
- ((?s:.*?)) # list item text = $4
- (?:(\n+(?=\n))|\n) # tailing blank line = $5
- (?= \n* (\z | \2 ('.$marker_any_re.') (?:[ ]+|(?=\n))))
- }xm',
- array(&$this, '_processListItems_callback'), $list_str);
-
- $this->list_level--;
- return $list_str;
- }
- function _processListItems_callback($matches) {
- $item = $matches[4];
- $leading_line =& $matches[1];
- $leading_space =& $matches[2];
- $marker_space = $matches[3];
- $tailing_blank_line =& $matches[5];
-
- if ($leading_line || $tailing_blank_line ||
- preg_match('/\n{2,}/', $item))
- {
- # Replace marker with the appropriate whitespace indentation
- $item = $leading_space . str_repeat(' ', strlen($marker_space)) . $item;
- $item = $this->runBlockGamut($this->outdent($item)."\n");
- }
- else {
- # Recursion for sub-lists:
- $item = $this->doLists($this->outdent($item));
- $item = preg_replace('/\n+$/', '', $item);
- $item = $this->runSpanGamut($item);
- }
-
- return "<li>" . $item . "</li>\n";
- }
-
-
- function doCodeBlocks($text) {
- #
- # Process Markdown `<pre><code>` blocks.
- #
- $text = preg_replace_callback('{
- (?:\n\n|\A\n?)
- ( # $1 = the code block -- one or more lines, starting with a space/tab
- (?>
- [ ]{'.$this->tab_width.'} # Lines must start with a tab or a tab-width of spaces
- .*\n+
- )+
- )
- ((?=^[ ]{0,'.$this->tab_width.'}\S)|\Z) # Lookahead for non-space at line-start, or end of doc
- }xm',
- array(&$this, '_doCodeBlocks_callback'), $text);
-
- return $text;
- }
- function _doCodeBlocks_callback($matches) {
- $codeblock = $matches[1];
-
- $codeblock = $this->outdent($codeblock);
- $codeblock = htmlspecialchars($codeblock, ENT_NOQUOTES);
-
- # trim leading newlines and trailing newlines
- $codeblock = preg_replace('/\A\n+|\n+\z/', '', $codeblock);
-
- $codeblock = "<pre><code>$codeblock\n</code></pre>";
- return "\n\n".$this->hashBlock($codeblock)."\n\n";
- }
-
-
- function makeCodeSpan($code) {
- #
- # Create a code span markup for $code. Called from handleSpanToken.
- #
- $code = htmlspecialchars(trim($code), ENT_NOQUOTES);
- return $this->hashPart("<code class=\"inline-code\">$code</code>");
- }
-
-
- var $em_relist = array(
- '' => '(?:(?<!\*)\*(?!\*)|(?<!_)_(?!_))(?=\S|$)(?![\.,:;]\s)',
- '*' => '(?<=\S|^)(?<!\*)\*(?!\*)',
- '_' => '(?<=\S|^)(?<!_)_(?!_)',
- );
- var $strong_relist = array(
- '' => '(?:(?<!\*)\*\*(?!\*)|(?<!_)__(?!_))(?=\S|$)(?![\.,:;]\s)',
- '**' => '(?<=\S|^)(?<!\*)\*\*(?!\*)',
- '__' => '(?<=\S|^)(?<!_)__(?!_)',
- );
- var $em_strong_relist = array(
- '' => '(?:(?<!\*)\*\*\*(?!\*)|(?<!_)___(?!_))(?=\S|$)(?![\.,:;]\s)',
- '***' => '(?<=\S|^)(?<!\*)\*\*\*(?!\*)',
- '___' => '(?<=\S|^)(?<!_)___(?!_)',
- );
- var $em_strong_prepared_relist;
-
- function prepareItalicsAndBold() {
- #
- # Prepare regular expressions for searching emphasis tokens in any
- # context.
- #
- foreach ($this->em_relist as $em => $em_re) {
- foreach ($this->strong_relist as $strong => $strong_re) {
- # Construct list of allowed token expressions.
- $token_relist = array();
- if (isset($this->em_strong_relist["$em$strong"])) {
- $token_relist[] = $this->em_strong_relist["$em$strong"];
- }
- $token_relist[] = $em_re;
- $token_relist[] = $strong_re;
-
- # Construct master expression from list.
- $token_re = '{('. implode('|', $token_relist) .')}';
- $this->em_strong_prepared_relist["$em$strong"] = $token_re;
- }
- }
- }
-
- function doItalicsAndBold($text) {
- $token_stack = array('');
- $text_stack = array('');
- $em = '';
- $strong = '';
- $tree_char_em = false;
-
- while (1) {
- #
- # Get prepared regular expression for seraching emphasis tokens
- # in current context.
- #
- $token_re = $this->em_strong_prepared_relist["$em$strong"];
-
- #
- # Each loop iteration search for the next emphasis token.
- # Each token is then passed to handleSpanToken.
- #
- $parts = preg_split($token_re, $text, 2, PREG_SPLIT_DELIM_CAPTURE);
- $text_stack[0] .= $parts[0];
- $token =& $parts[1];
- $text =& $parts[2];
-
- if (empty($token)) {
- # Reached end of text span: empty stack without emitting.
- # any more emphasis.
- while ($token_stack[0]) {
- $text_stack[1] .= array_shift($token_stack);
- $text_stack[0] .= array_shift($text_stack);
- }
- break;
- }
-
- $token_len = strlen($token);
- if ($tree_char_em) {
- # Reached closing marker while inside a three-char emphasis.
- if ($token_len == 3) {
- # Three-char closing marker, close em and strong.
- array_shift($token_stack);
- $span = array_shift($text_stack);
- $span = $this->runSpanGamut($span);
- $span = "<strong><em>$span</em></strong>";
- $text_stack[0] .= $this->hashPart($span);
- $em = '';
- $strong = '';
- } else {
- # Other closing marker: close one em or strong and
- # change current token state to match the other
- $token_stack[0] = str_repeat($token{0}, 3-$token_len);
- $tag = $token_len == 2 ? "strong" : "em";
- $span = $text_stack[0];
- $span = $this->runSpanGamut($span);
- $span = "<$tag>$span</$tag>";
- $text_stack[0] = $this->hashPart($span);
- $$tag = ''; # $$tag stands for $em or $strong
- }
- $tree_char_em = false;
- } else if ($token_len == 3) {
- if ($em) {
- # Reached closing marker for both em and strong.
- # Closing strong marker:
- for ($i = 0; $i < 2; ++$i) {
- $shifted_token = array_shift($token_stack);
- $tag = strlen($shifted_token) == 2 ? "strong" : "em";
- $span = array_shift($text_stack);
- $span = $this->runSpanGamut($span);
- $span = "<$tag>$span</$tag>";
- $text_stack[0] .= $this->hashPart($span);
- $$tag = ''; # $$tag stands for $em or $strong
- }
- } else {
- # Reached opening three-char emphasis marker. Push on token
- # stack; will be handled by the special condition above.
- $em = $token{0};
- $strong = "$em$em";
- array_unshift($token_stack, $token);
- array_unshift($text_stack, '');
- $tree_char_em = true;
- }
- } else if ($token_len == 2) {
- if ($strong) {
- # Unwind any dangling emphasis marker:
- if (strlen($token_stack[0]) == 1) {
- $text_stack[1] .= array_shift($token_stack);
- $text_stack[0] .= array_shift($text_stack);
- }
- # Closing strong marker:
- array_shift($token_stack);
- $span = array_shift($text_stack);
- $span = $this->runSpanGamut($span);
- $span = "<strong>$span</strong>";
- $text_stack[0] .= $this->hashPart($span);
- $strong = '';
- } else {
- array_unshift($token_stack, $token);
- array_unshift($text_stack, '');
- $strong = $token;
- }
- } else {
- # Here $token_len == 1
- if ($em) {
- if (strlen($token_stack[0]) == 1) {
- # Closing emphasis marker:
- array_shift($token_stack);
- $span = array_shift($text_stack);
- $span = $this->runSpanGamut($span);
- $span = "<em>$span</em>";
- $text_stack[0] .= $this->hashPart($span);
- $em = '';
- } else {
- $text_stack[0] .= $token;
- }
- } else {
- array_unshift($token_stack, $token);
- array_unshift($text_stack, '');
- $em = $token;
- }
- }
- }
- return $text_stack[0];
- }
-
-
- function doBlockQuotes($text) {
- $text = preg_replace_callback('/
- ( # Wrap whole match in $1
- (?>
- ^[ ]*>[ ]? # ">" at the start of a line
- .+\n # rest of the first line
- (.+\n)* # subsequent consecutive lines
- \n* # blanks
- )+
- )
- /xm',
- array(&$this, '_doBlockQuotes_callback'), $text);
-
- return $text;
- }
- function _doBlockQuotes_callback($matches) {
- $bq = $matches[1];
- # trim one level of quoting - trim whitespace-only lines
- $bq = preg_replace('/^[ ]*>[ ]?|^[ ]+$/m', '', $bq);
- $bq = $this->runBlockGamut($bq); # recurse
-
- $bq = preg_replace('/^/m', " ", $bq);
- # These leading spaces cause problem with <pre> content,
- # so we need to fix that:
- $bq = preg_replace_callback('{(\s*<pre>.+?</pre>)}sx',
- array(&$this, '_doBlockQuotes_callback2'), $bq);
-
- return "\n". $this->hashBlock("<blockquote>\n$bq\n</blockquote>")."\n\n";
- }
- function _doBlockQuotes_callback2($matches) {
- $pre = $matches[1];
- $pre = preg_replace('/^ /m', '', $pre);
- return $pre;
- }
-
-
- function formParagraphs($text) {
- #
- # Params:
- # $text - string to process with html <p> tags
- #
- # Strip leading and trailing lines:
- $text = preg_replace('/\A\n+|\n+\z/', '', $text);
-
- $grafs = preg_split('/\n{2,}/', $text, -1, PREG_SPLIT_NO_EMPTY);
-
- #
- # Wrap <p> tags and unhashify HTML blocks
- #
- foreach ($grafs as $key => $value) {
- if (!preg_match('/^B\x1A[0-9]+B$/', $value)) {
- # Is a paragraph.
- $value = $this->runSpanGamut($value);
- $value = preg_replace('/^([ ]*)/', "<p>", $value);
- $value .= "</p>";
- $grafs[$key] = $this->unhash($value);
- }
- else {
- # Is a block.
- # Modify elements of @grafs in-place...
- $graf = $value;
- $block = $this->html_hashes[$graf];
- $graf = $block;
-// if (preg_match('{
-// \A
-// ( # $1 = <div> tag
-// <div \s+
-// [^>]*
-// \b
-// markdown\s*=\s* ([\'"]) # $2 = attr quote char
-// 1
-// \2
-// [^>]*
-// >
-// )
-// ( # $3 = contents
-// .*
-// )
-// (</div>) # $4 = closing tag
-// \z
-// }xs', $block, $matches))
-// {
-// list(, $div_open, , $div_content, $div_close) = $matches;
-//
-// # We can't call Markdown(), because that resets the hash;
-// # that initialization code should be pulled into its own sub, though.
-// $div_content = $this->hashHTMLBlocks($div_content);
-//
-// # Run document gamut methods on the content.
-// foreach ($this->document_gamut as $method => $priority) {
-// $div_content = $this->$method($div_content);
-// }
-//
-// $div_open = preg_replace(
-// '{\smarkdown\s*=\s*([\'"]).+?\1}', '', $div_open);
-//
-// $graf = $div_open . "\n" . $div_content . "\n" . $div_close;
-// }
- $grafs[$key] = $graf;
- }
- }
-
- return implode("\n\n", $grafs);
- }
-
-
- function encodeAttribute($text) {
- #
- # Encode text for a double-quoted HTML attribute. This function
- # is *not* suitable for attributes enclosed in single quotes.
- #
- $text = $this->encodeAmpsAndAngles($text);
- $text = str_replace('"', '&quot;', $text);
- return $text;
- }
-
-
- function encodeAmpsAndAngles($text) {
- #
- # Smart processing for ampersands and angle brackets that need to
- # be encoded. Valid character entities are left alone unless the
- # no-entities mode is set.
- #
- if ($this->no_entities) {
- $text = str_replace('&', '&amp;', $text);
- } else {
- # Ampersand-encoding based entirely on Nat Irons's Amputator
- # MT plugin: <http://bumppo.net/projects/amputator/>
- $text = preg_replace('/&(?!#?[xX]?(?:[0-9a-fA-F]+|\w+);)/',
- '&amp;', $text);;
- }
- # Encode remaining <'s
- $text = str_replace('<', '&lt;', $text);
-
- return $text;
- }
-
-
- function doAutoLinks($text) {
- $text = preg_replace_callback('{<((https?|ftp|dict):[^\'">\s]+)>}i',
- array(&$this, '_doAutoLinks_url_callback'), $text);
-
- # Email addresses: <address@domain.foo>
- $text = preg_replace_callback('{
- <
- (?:mailto:)?
- (
- (?:
- [-!#$%&\'*+/=?^_`.{|}~\w\x80-\xFF]+
- |
- ".*?"
- )
- \@
- (?:
- [-a-z0-9\x80-\xFF]+(\.[-a-z0-9\x80-\xFF]+)*\.[a-z]+
- |
- \[[\d.a-fA-F:]+\] # IPv4 & IPv6
- )
- )
- >
- }xi',
- array(&$this, '_doAutoLinks_email_callback'), $text);
-
- return $text;
- }
- function _doAutoLinks_url_callback($matches) {
- $url = $this->encodeAttribute($matches[1]);
- $link = "<a href=\"$url\">$url</a>";
- return $this->hashPart($link);
- }
- function _doAutoLinks_email_callback($matches) {
- $address = $matches[1];
- $link = $this->encodeEmailAddress($address);
- return $this->hashPart($link);
- }
-
-
- function encodeEmailAddress($addr) {
- #
- # Input: an email address, e.g. "foo@example.com"
- #
- # Output: the email address as a mailto link, with each character
- # of the address encoded as either a decimal or hex entity, in
- # the hopes of foiling most address harvesting spam bots. E.g.:
- #
- # <p><a href="&#109;&#x61;&#105;&#x6c;&#116;&#x6f;&#58;&#x66;o&#111;
- # &#x40;&#101;&#x78;&#97;&#x6d;&#112;&#x6c;&#101;&#46;&#x63;&#111;
- # &#x6d;">&#x66;o&#111;&#x40;&#101;&#x78;&#97;&#x6d;&#112;&#x6c;
- # &#101;&#46;&#x63;&#111;&#x6d;</a></p>
- #
- # Based by a filter by Matthew Wickline, posted to BBEdit-Talk.
- # With some optimizations by Milian Wolff.
- #
- $addr = "mailto:" . $addr;
- $chars = preg_split('/(?<!^)(?!$)/', $addr);
- $seed = (int)abs(crc32($addr) / strlen($addr)); # Deterministic seed.
-
- foreach ($chars as $key => $char) {
- $ord = ord($char);
- # Ignore non-ascii chars.
- if ($ord < 128) {
- $r = ($seed * (1 + $key)) % 100; # Pseudo-random function.
- # roughly 10% raw, 45% hex, 45% dec
- # '@' *must* be encoded. I insist.
- if ($r > 90 && $char != '@') /* do nothing */;
- else if ($r < 45) $chars[$key] = '&#x'.dechex($ord).';';
- else $chars[$key] = '&#'.$ord.';';
- }
- }
-
- $addr = implode('', $chars);
- $text = implode('', array_slice($chars, 7)); # text without `mailto:`
- $addr = "<a href=\"$addr\">$text</a>";
-
- return $addr;
- }
-
-
- function parseSpan($str) {
- #
- # Take the string $str and parse it into tokens, hashing embeded HTML,
- # escaped characters and handling code spans.
- #
- $output = '';
-
- $span_re = '{
- (
- \\\\'.$this->escape_chars_re.'
- |
- (?<![`\\\\])
- `+ # code span marker
- '.( $this->no_markup ? '' : '
- |
- <!-- .*? --> # comment
- |
- <\?.*?\?> | <%.*?%> # processing instruction
- |
- <[/!$]?[-a-zA-Z0-9:_]+ # regular tags
- (?>
- \s
- (?>[^"\'>]+|"[^"]*"|\'[^\']*\')*
- )?
- >
- ').'
- )
- }xs';
-
- while (1) {
- #
- # Each loop iteration seach for either the next tag, the next
- # openning code span marker, or the next escaped character.
- # Each token is then passed to handleSpanToken.
- #
- $parts = preg_split($span_re, $str, 2, PREG_SPLIT_DELIM_CAPTURE);
-
- # Create token from text preceding tag.
- if ($parts[0] != "") {
- $output .= $parts[0];
- }
-
- # Check if we reach the end.
- if (isset($parts[1])) {
- $output .= $this->handleSpanToken($parts[1], $parts[2]);
- $str = $parts[2];
- }
- else {
- break;
- }
- }
-
- return $output;
- }
-
-
- function handleSpanToken($token, &$str) {
- #
- # Handle $token provided by parseSpan by determining its nature and
- # returning the corresponding value that should replace it.
- #
- switch ($token{0}) {
- case "\\":
- return $this->hashPart("&#". ord($token{1}). ";");
- case "`":
- # Search for end marker in remaining text.
- if (preg_match('/^(.*?[^`])'.preg_quote($token).'(?!`)(.*)$/sm',
- $str, $matches))
- {
- $str = $matches[2];
- $codespan = $this->makeCodeSpan($matches[1]);
- return $this->hashPart($codespan);
- }
- return $token; // return as text since no ending marker found.
- default:
- return $this->hashPart($token);
- }
- }
-
-
- function outdent($text) {
- #
- # Remove one level of line-leading tabs or spaces
- #
- return preg_replace('/^(\t|[ ]{1,'.$this->tab_width.'})/m', '', $text);
- }
-
-
- # String length function for detab. `_initDetab` will create a function to
- # hanlde UTF-8 if the default function does not exist.
- var $utf8_strlen = 'mb_strlen';
-
- function detab($text) {
- #
- # Replace tabs with the appropriate amount of space.
- #
- # For each line we separate the line in blocks delemited by
- # tab characters. Then we reconstruct every line by adding the
- # appropriate number of space between each blocks.
-
- $text = preg_replace_callback('/^.*\t.*$/m',
- array(&$this, '_detab_callback'), $text);
-
- return $text;
- }
- function _detab_callback($matches) {
- $line = $matches[0];
- $strlen = $this->utf8_strlen; # strlen function for UTF-8.
-
- # Split in blocks.
- $blocks = explode("\t", $line);
- # Add each blocks to the line.
- $line = $blocks[0];
- unset($blocks[0]); # Do not add first block twice.
- foreach ($blocks as $block) {
- # Calculate amount of space, insert spaces, insert block.
- $amount = $this->tab_width -
- $strlen($line, 'UTF-8') % $this->tab_width;
- $line .= str_repeat(" ", $amount) . $block;
- }
- return $line;
- }
- function _initDetab() {
- #
- # Check for the availability of the function in the `utf8_strlen` property
- # (initially `mb_strlen`). If the function is not available, create a
- # function that will loosely count the number of UTF-8 characters with a
- # regular expression.
- #
- if (function_exists($this->utf8_strlen)) return;
- $this->utf8_strlen = create_function('$text', 'return preg_match_all(
- "/[\\\\x00-\\\\xBF]|[\\\\xC0-\\\\xFF][\\\\x80-\\\\xBF]*/",
- $text, $m);');
- }
-
-
- function unhash($text) {
- #
- # Swap back in all the tags hashed by _HashHTMLBlocks.
- #
- return preg_replace_callback('/(.)\x1A[0-9]+\1/',
- array(&$this, '_unhash_callback'), $text);
- }
- function _unhash_callback($matches) {
- return $this->html_hashes[$matches[0]];
- }
-
-}
-
-
-#
-# Markdown Extra Parser Class
-#
-
-class MarkdownExtra_Parser extends Markdown_Parser {
-
- # Prefix for footnote ids.
- var $fn_id_prefix = "";
-
- # Optional title attribute for footnote links and backlinks.
- var $fn_link_title = MARKDOWN_FN_LINK_TITLE;
- var $fn_backlink_title = MARKDOWN_FN_BACKLINK_TITLE;
-
- # Optional class attribute for footnote links and backlinks.
- var $fn_link_class = MARKDOWN_FN_LINK_CLASS;
- var $fn_backlink_class = MARKDOWN_FN_BACKLINK_CLASS;
-
- # Predefined abbreviations.
- var $predef_abbr = array();
-
-
- function MarkdownExtra_Parser() {
- #
- # Constructor function. Initialize the parser object.
- #
- # Add extra escapable characters before parent constructor
- # initialize the table.
- $this->escape_chars .= ':|';
-
- # Insert extra document, block, and span transformations.
- # Parent constructor will do the sorting.
- $this->document_gamut += array(
- "doFencedCodeBlocks" => 5,
- "stripFootnotes" => 15,
- "stripAbbreviations" => 25,
- "appendFootnotes" => 50,
- );
- $this->block_gamut += array(
- "doFencedCodeBlocks" => 5,
- "doTables" => 15,
- "doDefLists" => 45,
- );
- $this->span_gamut += array(
- "doFootnotes" => 5,
- "doAbbreviations" => 70,
- );
-
- parent::Markdown_Parser();
- }
-
-
- # Extra variables used during extra transformations.
- var $footnotes = array();
- var $footnotes_ordered = array();
- var $abbr_desciptions = array();
- var $abbr_word_re = '';
-
- # Give the current footnote number.
- var $footnote_counter = 1;
-
-
- function setup() {
- #
- # Setting up Extra-specific variables.
- #
- parent::setup();
-
- $this->footnotes = array();
- $this->footnotes_ordered = array();
- $this->abbr_desciptions = array();
- $this->abbr_word_re = '';
- $this->footnote_counter = 1;
-
- foreach ($this->predef_abbr as $abbr_word => $abbr_desc) {
- if ($this->abbr_word_re)
- $this->abbr_word_re .= '|';
- $this->abbr_word_re .= preg_quote($abbr_word);
- $this->abbr_desciptions[$abbr_word] = trim($abbr_desc);
- }
- }
-
- function teardown() {
- #
- # Clearing Extra-specific variables.
- #
- $this->footnotes = array();
- $this->footnotes_ordered = array();
- $this->abbr_desciptions = array();
- $this->abbr_word_re = '';
-
- parent::teardown();
- }
-
-
- ### HTML Block Parser ###
-
- # Tags that are always treated as block tags:
- var $block_tags_re = 'p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|address|form|fieldset|iframe|hr|legend';
-
- # Tags treated as block tags only if the opening tag is alone on it's line:
- var $context_block_tags_re = 'script|noscript|math|ins|del';
-
- # Tags where markdown="1" default to span mode:
- var $contain_span_tags_re = 'p|h[1-6]|li|dd|dt|td|th|legend|address';
-
- # Tags which must not have their contents modified, no matter where
- # they appear:
- var $clean_tags_re = 'script|math';
-
- # Tags that do not need to be closed.
- var $auto_close_tags_re = 'hr|img';
-
-
- function hashHTMLBlocks($text) {
- #
- # Hashify HTML Blocks and "clean tags".
- #
- # We only want to do this for block-level HTML tags, such as headers,
- # lists, and tables. That's because we still want to wrap <p>s around
- # "paragraphs" that are wrapped in non-block-level tags, such as anchors,
- # phrase emphasis, and spans. The list of tags we're looking for is
- # hard-coded.
- #
- # This works by calling _HashHTMLBlocks_InMarkdown, which then calls
- # _HashHTMLBlocks_InHTML when it encounter block tags. When the markdown="1"
- # attribute is found whitin a tag, _HashHTMLBlocks_InHTML calls back
- # _HashHTMLBlocks_InMarkdown to handle the Markdown syntax within the tag.
- # These two functions are calling each other. It's recursive!
- #
- #
- # Call the HTML-in-Markdown hasher.
- #
- list($text, ) = $this->_hashHTMLBlocks_inMarkdown($text);
-
- return $text;
- }
- function _hashHTMLBlocks_inMarkdown($text, $indent = 0,
- $enclosing_tag_re = '', $span = false)
- {
- #
- # Parse markdown text, calling _HashHTMLBlocks_InHTML for block tags.
- #
- # * $indent is the number of space to be ignored when checking for code
- # blocks. This is important because if we don't take the indent into
- # account, something like this (which looks right) won't work as expected:
- #
- # <div>
- # <div markdown="1">
- # Hello World. <-- Is this a Markdown code block or text?
- # </div> <-- Is this a Markdown code block or a real tag?
- # <div>
- #
- # If you don't like this, just don't indent the tag on which
- # you apply the markdown="1" attribute.
- #
- # * If $enclosing_tag_re is not empty, stops at the first unmatched closing
- # tag with that name. Nested tags supported.
- #
- # * If $span is true, text inside must treated as span. So any double
- # newline will be replaced by a single newline so that it does not create
- # paragraphs.
- #
- # Returns an array of that form: ( processed text , remaining text )
- #
- if ($text === '') return array('', '');
-
- # Regex to check for the presense of newlines around a block tag.
- $newline_before_re = '/(?:^\n?|\n\n)*$/';
- $newline_after_re =
- '{
- ^ # Start of text following the tag.
- (?>[ ]*<!--.*?-->)? # Optional comment.
- [ ]*\n # Must be followed by newline.
- }xs';
-
- # Regex to match any tag.
- $block_tag_re =
- '{
- ( # $2: Capture hole tag.
- </? # Any opening or closing tag.
- (?> # Tag name.
- '.$this->block_tags_re.' |
- '.$this->context_block_tags_re.' |
- '.$this->clean_tags_re.' |
- (?!\s)'.$enclosing_tag_re.'
- )
- (?:
- (?=[\s"\'/a-zA-Z0-9]) # Allowed characters after tag name.
- (?>
- ".*?" | # Double quotes (can contain `>`)
- \'.*?\' | # Single quotes (can contain `>`)
- .+? # Anything but quotes and `>`.
- )*?
- )?
- > # End of tag.
- |
- <!-- .*? --> # HTML Comment
- |
- <\?.*?\?> | <%.*?%> # Processing instruction
- |
- <!\[CDATA\[.*?\]\]> # CData Block
- |
- # Code span marker
- `+
- '. ( !$span ? ' # If not in span.
- |
- # Indented code block
- (?: ^[ ]*\n | ^ | \n[ ]*\n )
- [ ]{'.($indent+4).'}[^\n]* \n
- (?>
- (?: [ ]{'.($indent+4).'}[^\n]* | [ ]* ) \n
- )*
- |
- # Fenced code block marker
- (?> ^ | \n )
- [ ]{0,'.($indent).'}~~~+[ ]*\n
- ' : '' ). ' # End (if not is span).
- )
- }xs';
-
-
- $depth = 0; # Current depth inside the tag tree.
- $parsed = ""; # Parsed text that will be returned.
-
- #
- # Loop through every tag until we find the closing tag of the parent
- # or loop until reaching the end of text if no parent tag specified.
- #
- do {
- #
- # Split the text using the first $tag_match pattern found.
- # Text before pattern will be first in the array, text after
- # pattern will be at the end, and between will be any catches made
- # by the pattern.
- #
- $parts = preg_split($block_tag_re, $text, 2,
- PREG_SPLIT_DELIM_CAPTURE);
-
- # If in Markdown span mode, add a empty-string span-level hash
- # after each newline to prevent triggering any block element.
- if ($span) {
- $void = $this->hashPart("", ':');
- $newline = "$void\n";
- $parts[0] = $void . str_replace("\n", $newline, $parts[0]) . $void;
- }
-
- $parsed .= $parts[0]; # Text before current tag.
-
- # If end of $text has been reached. Stop loop.
- if (count($parts) < 3) {
- $text = "";
- break;
- }
-
- $tag = $parts[1]; # Tag to handle.
- $text = $parts[2]; # Remaining text after current tag.
- $tag_re = preg_quote($tag); # For use in a regular expression.
-
- #
- # Check for: Code span marker
- #
- if ($tag{0} == "`") {
- # Find corresponding end marker.
- $tag_re = preg_quote($tag);
- if (preg_match('{^(?>.+?|\n(?!\n))*?(?<!`)'.$tag_re.'(?!`)}',
- $text, $matches))
- {
- # End marker found: pass text unchanged until marker.
- $parsed .= $tag . $matches[0];
- $text = substr($text, strlen($matches[0]));
- }
- else {
- # Unmatched marker: just skip it.
- $parsed .= $tag;
- }
- }
- #
- # Check for: Fenced code block marker.
- #
- else if (preg_match('{^\n?[ ]{0,'.($indent+3).'}~}', $tag)) {
- # Fenced code block marker: find matching end marker.
- $tag_re = preg_quote(trim($tag));
- if (preg_match('{^(?>.*\n)+?[ ]{0,'.($indent).'}'.$tag_re.'[ ]*\n}', $text,
- $matches))
- {
- # End marker found: pass text unchanged until marker.
- $parsed .= $tag . $matches[0];
- $text = substr($text, strlen($matches[0]));
- }
- else {
- # No end marker: just skip it.
- $parsed .= $tag;
- }
- }
- #
- # Check for: Indented code block.
- #
- else if ($tag{0} == "\n" || $tag{0} == " ") {
- # Indented code block: pass it unchanged, will be handled
- # later.
- $parsed .= $tag;
- }
- #
- # Check for: Opening Block level tag or
- # Opening Context Block tag (like ins and del)
- # used as a block tag (tag is alone on it's line).
- #
- else if (preg_match('{^<(?:'.$this->block_tags_re.')\b}', $tag) ||
- ( preg_match('{^<(?:'.$this->context_block_tags_re.')\b}', $tag) &&
- preg_match($newline_before_re, $parsed) &&
- preg_match($newline_after_re, $text) )
- )
- {
- # Need to parse tag and following text using the HTML parser.
- list($block_text, $text) =
- $this->_hashHTMLBlocks_inHTML($tag . $text, "hashBlock", true);
-
- # Make sure it stays outside of any paragraph by adding newlines.
- $parsed .= "\n\n$block_text\n\n";
- }
- #
- # Check for: Clean tag (like script, math)
- # HTML Comments, processing instructions.
- #
- else if (preg_match('{^<(?:'.$this->clean_tags_re.')\b}', $tag) ||
- $tag{1} == '!' || $tag{1} == '?')
- {
- # Need to parse tag and following text using the HTML parser.
- # (don't check for markdown attribute)
- list($block_text, $text) =
- $this->_hashHTMLBlocks_inHTML($tag . $text, "hashClean", false);
-
- $parsed .= $block_text;
- }
- #
- # Check for: Tag with same name as enclosing tag.
- #
- else if ($enclosing_tag_re !== '' &&
- # Same name as enclosing tag.
- preg_match('{^</?(?:'.$enclosing_tag_re.')\b}', $tag))
- {
- #
- # Increase/decrease nested tag count.
- #
- if ($tag{1} == '/') $depth--;
- else if ($tag{strlen($tag)-2} != '/') $depth++;
-
- if ($depth < 0) {
- #
- # Going out of parent element. Clean up and break so we
- # return to the calling function.
- #
- $text = $tag . $text;
- break;
- }
-
- $parsed .= $tag;
- }
- else {
- $parsed .= $tag;
- }
- } while ($depth >= 0);
-
- return array($parsed, $text);
- }
- function _hashHTMLBlocks_inHTML($text, $hash_method, $md_attr) {
- #
- # Parse HTML, calling _HashHTMLBlocks_InMarkdown for block tags.
- #
- # * Calls $hash_method to convert any blocks.
- # * Stops when the first opening tag closes.
- # * $md_attr indicate if the use of the `markdown="1"` attribute is allowed.
- # (it is not inside clean tags)
- #
- # Returns an array of that form: ( processed text , remaining text )
- #
- if ($text === '') return array('', '');
-
- # Regex to match `markdown` attribute inside of a tag.
- $markdown_attr_re = '
- {
- \s* # Eat whitespace before the `markdown` attribute
- markdown
- \s*=\s*
- (?>
- (["\']) # $1: quote delimiter
- (.*?) # $2: attribute value
- \1 # matching delimiter
- |
- ([^\s>]*) # $3: unquoted attribute value
- )
- () # $4: make $3 always defined (avoid warnings)
- }xs';
-
- # Regex to match any tag.
- $tag_re = '{
- ( # $2: Capture hole tag.
- </? # Any opening or closing tag.
- [\w:$]+ # Tag name.
- (?:
- (?=[\s"\'/a-zA-Z0-9]) # Allowed characters after tag name.
- (?>
- ".*?" | # Double quotes (can contain `>`)
- \'.*?\' | # Single quotes (can contain `>`)
- .+? # Anything but quotes and `>`.
- )*?
- )?
- > # End of tag.
- |
- <!-- .*? --> # HTML Comment
- |
- <\?.*?\?> | <%.*?%> # Processing instruction
- |
- <!\[CDATA\[.*?\]\]> # CData Block
- )
- }xs';
-
- $original_text = $text; # Save original text in case of faliure.
-
- $depth = 0; # Current depth inside the tag tree.
- $block_text = ""; # Temporary text holder for current text.
- $parsed = ""; # Parsed text that will be returned.
-
- #
- # Get the name of the starting tag.
- # (This pattern makes $base_tag_name_re safe without quoting.)
- #
- if (preg_match('/^<([\w:$]*)\b/', $text, $matches))
- $base_tag_name_re = $matches[1];
-
- #
- # Loop through every tag until we find the corresponding closing tag.
- #
- do {
- #
- # Split the text using the first $tag_match pattern found.
- # Text before pattern will be first in the array, text after
- # pattern will be at the end, and between will be any catches made
- # by the pattern.
- #
- $parts = preg_split($tag_re, $text, 2, PREG_SPLIT_DELIM_CAPTURE);
-
- if (count($parts) < 3) {
- #
- # End of $text reached with unbalenced tag(s).
- # In that case, we return original text unchanged and pass the
- # first character as filtered to prevent an infinite loop in the
- # parent function.
- #
- return array($original_text{0}, substr($original_text, 1));
- }
-
- $block_text .= $parts[0]; # Text before current tag.
- $tag = $parts[1]; # Tag to handle.
- $text = $parts[2]; # Remaining text after current tag.
-
- #
- # Check for: Auto-close tag (like <hr/>)
- # Comments and Processing Instructions.
- #
- if (preg_match('{^</?(?:'.$this->auto_close_tags_re.')\b}', $tag) ||
- $tag{1} == '!' || $tag{1} == '?')
- {
- # Just add the tag to the block as if it was text.
- $block_text .= $tag;
- }
- else {
- #
- # Increase/decrease nested tag count. Only do so if
- # the tag's name match base tag's.
- #
- if (preg_match('{^</?'.$base_tag_name_re.'\b}', $tag)) {
- if ($tag{1} == '/') $depth--;
- else if ($tag{strlen($tag)-2} != '/') $depth++;
- }
-
- #
- # Check for `markdown="1"` attribute and handle it.
- #
- if ($md_attr &&
- preg_match($markdown_attr_re, $tag, $attr_m) &&
- preg_match('/^1|block|span$/', $attr_m[2] . $attr_m[3]))
- {
- # Remove `markdown` attribute from opening tag.
- $tag = preg_replace($markdown_attr_re, '', $tag);
-
- # Check if text inside this tag must be parsed in span mode.
- $this->mode = $attr_m[2] . $attr_m[3];
- $span_mode = $this->mode == 'span' || $this->mode != 'block' &&
- preg_match('{^<(?:'.$this->contain_span_tags_re.')\b}', $tag);
-
- # Calculate indent before tag.
- if (preg_match('/(?:^|\n)( *?)(?! ).*?$/', $block_text, $matches)) {
- $strlen = $this->utf8_strlen;
- $indent = $strlen($matches[1], 'UTF-8');
- } else {
- $indent = 0;
- }
-
- # End preceding block with this tag.
- $block_text .= $tag;
- $parsed .= $this->$hash_method($block_text);
-
- # Get enclosing tag name for the ParseMarkdown function.
- # (This pattern makes $tag_name_re safe without quoting.)
- preg_match('/^<([\w:$]*)\b/', $tag, $matches);
- $tag_name_re = $matches[1];
-
- # Parse the content using the HTML-in-Markdown parser.
- list ($block_text, $text)
- = $this->_hashHTMLBlocks_inMarkdown($text, $indent,
- $tag_name_re, $span_mode);
-
- # Outdent markdown text.
- if ($indent > 0) {
- $block_text = preg_replace("/^[ ]{1,$indent}/m", "",
- $block_text);
- }
-
- # Append tag content to parsed text.
- if (!$span_mode) $parsed .= "\n\n$block_text\n\n";
- else $parsed .= "$block_text";
-
- # Start over a new block.
- $block_text = "";
- }
- else $block_text .= $tag;
- }
-
- } while ($depth > 0);
-
- #
- # Hash last block text that wasn't processed inside the loop.
- #
- $parsed .= $this->$hash_method($block_text);
-
- return array($parsed, $text);
- }
-
-
- function hashClean($text) {
- #
- # Called whenever a tag must be hashed when a function insert a "clean" tag
- # in $text, it pass through this function and is automaticaly escaped,
- # blocking invalid nested overlap.
- #
- return $this->hashPart($text, 'C');
- }
-
-
- function doHeaders($text) {
- #
- # Redefined to add id attribute support.
- #
- # Setext-style headers:
- # Header 1 {#header1}
- # ========
- #
- # Header 2 {#header2}
- # --------
- #
- $text = preg_replace_callback(
- '{
- (^.+?) # $1: Header text
- (?:[ ]+\{\#([-_:a-zA-Z0-9]+)\})? # $2: Id attribute
- [ ]*\n(=+|-+)[ ]*\n+ # $3: Header footer
- }mx',
- array(&$this, '_doHeaders_callback_setext'), $text);
-
- # atx-style headers:
- # # Header 1 {#header1}
- # ## Header 2 {#header2}
- # ## Header 2 with closing hashes ## {#header3}
- # ...
- # ###### Header 6 {#header2}
- #
- $text = preg_replace_callback('{
- ^(\#{1,6}) # $1 = string of #\'s
- [ ]*
- (.+?) # $2 = Header text
- [ ]*
- \#* # optional closing #\'s (not counted)
- (?:[ ]+\{\#([-_:a-zA-Z0-9]+)\})? # id attribute
- [ ]*
- \n+
- }xm',
- array(&$this, '_doHeaders_callback_atx'), $text);
-
- return $text;
- }
- function _doHeaders_attr($attr) {
- if (empty($attr)) return "";
- return " id=\"$attr\"";
- }
- function _doHeaders_callback_setext($matches) {
- if ($matches[3] == '-' && preg_match('{^- }', $matches[1]))
- return $matches[0];
- $level = $matches[3]{0} == '=' ? 1 : 2;
- $attr = $this->_doHeaders_attr($id =& $matches[2]);
- $block = "<h$level$attr>".$this->runSpanGamut($matches[1])."</h$level>";
- return "\n" . $this->hashBlock($block) . "\n\n";
- }
- function _doHeaders_callback_atx($matches) {
- $level = strlen($matches[1]);
- $attr = $this->_doHeaders_attr($id =& $matches[3]);
- $block = "<h$level$attr>".$this->runSpanGamut($matches[2])."</h$level>";
- return "\n" . $this->hashBlock($block) . "\n\n";
- }
-
-
- function doTables($text) {
- #
- # Form HTML tables.
- #
- $less_than_tab = $this->tab_width - 1;
- #
- # Find tables with leading pipe.
- #
- # | Header 1 | Header 2
- # | -------- | --------
- # | Cell 1 | Cell 2
- # | Cell 3 | Cell 4
- #
- $text = preg_replace_callback('
- {
- ^ # Start of a line
- [ ]{0,'.$less_than_tab.'} # Allowed whitespace.
- [|] # Optional leading pipe (present)
- (.+) \n # $1: Header row (at least one pipe)
-
- [ ]{0,'.$less_than_tab.'} # Allowed whitespace.
- [|] ([ ]*[-:]+[-| :]*) \n # $2: Header underline
-
- ( # $3: Cells
- (?>
- [ ]* # Allowed whitespace.
- [|] .* \n # Row content.
- )*
- )
- (?=\n|\Z) # Stop at final double newline.
- }xm',
- array(&$this, '_doTable_leadingPipe_callback'), $text);
-
- #
- # Find tables without leading pipe.
- #
- # Header 1 | Header 2
- # -------- | --------
- # Cell 1 | Cell 2
- # Cell 3 | Cell 4
- #
- $text = preg_replace_callback('
- {
- ^ # Start of a line
- [ ]{0,'.$less_than_tab.'} # Allowed whitespace.
- (\S.*[|].*) \n # $1: Header row (at least one pipe)
-
- [ ]{0,'.$less_than_tab.'} # Allowed whitespace.
- ([-:]+[ ]*[|][-| :]*) \n # $2: Header underline
-
- ( # $3: Cells
- (?>
- .* [|] .* \n # Row content
- )*
- )
- (?=\n|\Z) # Stop at final double newline.
- }xm',
- array(&$this, '_DoTable_callback'), $text);
-
- return $text;
- }
- function _doTable_leadingPipe_callback($matches) {
- $head = $matches[1];
- $underline = $matches[2];
- $content = $matches[3];
-
- # Remove leading pipe for each row.
- $content = preg_replace('/^ *[|]/m', '', $content);
-
- return $this->_doTable_callback(array($matches[0], $head, $underline, $content));
- }
- function _doTable_callback($matches) {
- $head = $matches[1];
- $underline = $matches[2];
- $content = $matches[3];
-
- # Remove any tailing pipes for each line.
- $head = preg_replace('/[|] *$/m', '', $head);
- $underline = preg_replace('/[|] *$/m', '', $underline);
- $content = preg_replace('/[|] *$/m', '', $content);
-
- # Reading alignement from header underline.
- $separators = preg_split('/ *[|] */', $underline);
- foreach ($separators as $n => $s) {
- if (preg_match('/^ *-+: *$/', $s)) $attr[$n] = ' align="right"';
- else if (preg_match('/^ *:-+: *$/', $s))$attr[$n] = ' align="center"';
- else if (preg_match('/^ *:-+ *$/', $s)) $attr[$n] = ' align="left"';
- else $attr[$n] = '';
- }
-
- # Parsing span elements, including code spans, character escapes,
- # and inline HTML tags, so that pipes inside those gets ignored.
- $head = $this->parseSpan($head);
- $headers = preg_split('/ *[|] */', $head);
- $col_count = count($headers);
-
- # Write column headers.
- $text = "<table>\n";
- $text .= "<thead>\n";
- $text .= "<tr>\n";
- foreach ($headers as $n => $header)
- $text .= " <th$attr[$n]>".$this->runSpanGamut(trim($header))."</th>\n";
- $text .= "</tr>\n";
- $text .= "</thead>\n";
-
- # Split content by row.
- $rows = explode("\n", trim($content, "\n"));
-
- $text .= "<tbody>\n";
- foreach ($rows as $row) {
- # Parsing span elements, including code spans, character escapes,
- # and inline HTML tags, so that pipes inside those gets ignored.
- $row = $this->parseSpan($row);
-
- # Split row by cell.
- $row_cells = preg_split('/ *[|] */', $row, $col_count);
- $row_cells = array_pad($row_cells, $col_count, '');
-
- $text .= "<tr>\n";
- foreach ($row_cells as $n => $cell)
- $text .= " <td$attr[$n]>".$this->runSpanGamut(trim($cell))."</td>\n";
- $text .= "</tr>\n";
- }
- $text .= "</tbody>\n";
- $text .= "</table>";
-
- return $this->hashBlock($text) . "\n";
- }
-
-
- function doDefLists($text) {
- #
- # Form HTML definition lists.
- #
- $less_than_tab = $this->tab_width - 1;
-
- # Re-usable pattern to match any entire dl list:
- $whole_list_re = '(?>
- ( # $1 = whole list
- ( # $2
- [ ]{0,'.$less_than_tab.'}
- ((?>.*\S.*\n)+) # $3 = defined term
- \n?
- [ ]{0,'.$less_than_tab.'}:[ ]+ # colon starting definition
- )
- (?s:.+?)
- ( # $4
- \z
- |
- \n{2,}
- (?=\S)
- (?! # Negative lookahead for another term
- [ ]{0,'.$less_than_tab.'}
- (?: \S.*\n )+? # defined term
- \n?
- [ ]{0,'.$less_than_tab.'}:[ ]+ # colon starting definition
- )
- (?! # Negative lookahead for another definition
- [ ]{0,'.$less_than_tab.'}:[ ]+ # colon starting definition
- )
- )
- )
- )'; // mx
-
- $text = preg_replace_callback('{
- (?>\A\n?|(?<=\n\n))
- '.$whole_list_re.'
- }mx',
- array(&$this, '_doDefLists_callback'), $text);
-
- return $text;
- }
- function _doDefLists_callback($matches) {
- # Re-usable patterns to match list item bullets and number markers:
- $list = $matches[1];
-
- # Turn double returns into triple returns, so that we can make a
- # paragraph for the last item in a list, if necessary:
- $result = trim($this->processDefListItems($list));
- $result = "<dl>\n" . $result . "\n</dl>";
- return $this->hashBlock($result) . "\n\n";
- }
-
-
- function processDefListItems($list_str) {
- #
- # Process the contents of a single definition list, splitting it
- # into individual term and definition list items.
- #
- $less_than_tab = $this->tab_width - 1;
-
- # trim trailing blank lines:
- $list_str = preg_replace("/\n{2,}\\z/", "\n", $list_str);
-
- # Process definition terms.
- $list_str = preg_replace_callback('{
- (?>\A\n?|\n\n+) # leading line
- ( # definition terms = $1
- [ ]{0,'.$less_than_tab.'} # leading whitespace
- (?![:][ ]|[ ]) # negative lookahead for a definition
- # mark (colon) or more whitespace.
- (?> \S.* \n)+? # actual term (not whitespace).
- )
- (?=\n?[ ]{0,3}:[ ]) # lookahead for following line feed
- # with a definition mark.
- }xm',
- array(&$this, '_processDefListItems_callback_dt'), $list_str);
-
- # Process actual definitions.
- $list_str = preg_replace_callback('{
- \n(\n+)? # leading line = $1
- ( # marker space = $2
- [ ]{0,'.$less_than_tab.'} # whitespace before colon
- [:][ ]+ # definition mark (colon)
- )
- ((?s:.+?)) # definition text = $3
- (?= \n+ # stop at next definition mark,
- (?: # next term or end of text
- [ ]{0,'.$less_than_tab.'} [:][ ] |
- <dt> | \z
- )
- )
- }xm',
- array(&$this, '_processDefListItems_callback_dd'), $list_str);
-
- return $list_str;
- }
- function _processDefListItems_callback_dt($matches) {
- $terms = explode("\n", trim($matches[1]));
- $text = '';
- foreach ($terms as $term) {
- $term = $this->runSpanGamut(trim($term));
- $text .= "\n<dt>" . $term . "</dt>";
- }
- return $text . "\n";
- }
- function _processDefListItems_callback_dd($matches) {
- $leading_line = $matches[1];
- $marker_space = $matches[2];
- $def = $matches[3];
-
- if ($leading_line || preg_match('/\n{2,}/', $def)) {
- # Replace marker with the appropriate whitespace indentation
- $def = str_repeat(' ', strlen($marker_space)) . $def;
- $def = $this->runBlockGamut($this->outdent($def . "\n\n"));
- $def = "\n". $def ."\n";
- }
- else {
- $def = rtrim($def);
- $def = $this->runSpanGamut($this->outdent($def));
- }
-
- return "\n<dd>" . $def . "</dd>\n";
- }
-
-
- function doFencedCodeBlocks($text) {
- #
- # Adding the fenced code block syntax to regular Markdown:
- #
- # ~~~
- # Code block
- # ~~~
- #
- $less_than_tab = $this->tab_width;
-
- $text = preg_replace_callback('{
- (?:\n|\A)
- # 1: Opening marker
- (
- ~{3,} # Marker: three tilde or more.
- )
- [ ]* \n # Whitespace and newline following marker.
-
- # 2: Content
- (
- (?>
- (?!\1 [ ]* \n) # Not a closing marker.
- .*\n+
- )+
- )
-
- # Closing marker.
- \1 [ ]* \n
- }xm',
- array(&$this, '_doFencedCodeBlocks_callback'), $text);
-
- return $text;
- }
- function _doFencedCodeBlocks_callback($matches) {
- $codeblock = $matches[2];
- $codeblock = htmlspecialchars($codeblock, ENT_NOQUOTES);
- $codeblock = preg_replace_callback('/^\n+/',
- array(&$this, '_doFencedCodeBlocks_newlines'), $codeblock);
- $codeblock = "<pre><code>$codeblock</code></pre>";
- return "\n\n".$this->hashBlock($codeblock)."\n\n";
- }
- function _doFencedCodeBlocks_newlines($matches) {
- return str_repeat("<br$this->empty_element_suffix",
- strlen($matches[0]));
- }
-
-
- #
- # Redefining emphasis markers so that emphasis by underscore does not
- # work in the middle of a word.
- #
- var $em_relist = array(
- '' => '(?:(?<!\*)\*(?!\*)|(?<![a-zA-Z0-9_])_(?!_))(?=\S|$)(?![\.,:;]\s)',
- '*' => '(?<=\S|^)(?<!\*)\*(?!\*)',
- '_' => '(?<=\S|^)(?<!_)_(?![a-zA-Z0-9_])',
- );
- var $strong_relist = array(
- '' => '(?:(?<!\*)\*\*(?!\*)|(?<![a-zA-Z0-9_])__(?!_))(?=\S|$)(?![\.,:;]\s)',
- '**' => '(?<=\S|^)(?<!\*)\*\*(?!\*)',
- '__' => '(?<=\S|^)(?<!_)__(?![a-zA-Z0-9_])',
- );
- var $em_strong_relist = array(
- '' => '(?:(?<!\*)\*\*\*(?!\*)|(?<![a-zA-Z0-9_])___(?!_))(?=\S|$)(?![\.,:;]\s)',
- '***' => '(?<=\S|^)(?<!\*)\*\*\*(?!\*)',
- '___' => '(?<=\S|^)(?<!_)___(?![a-zA-Z0-9_])',
- );
-
-
- function formParagraphs($text) {
- #
- # Params:
- # $text - string to process with html <p> tags
- #
- # Strip leading and trailing lines:
- $text = preg_replace('/\A\n+|\n+\z/', '', $text);
-
- $grafs = preg_split('/\n{2,}/', $text, -1, PREG_SPLIT_NO_EMPTY);
-
- #
- # Wrap <p> tags and unhashify HTML blocks
- #
- foreach ($grafs as $key => $value) {
- $value = trim($this->runSpanGamut($value));
-
- # Check if this should be enclosed in a paragraph.
- # Clean tag hashes & block tag hashes are left alone.
- $is_p = !preg_match('/^B\x1A[0-9]+B|^C\x1A[0-9]+C$/', $value);
-
- if ($is_p) {
- $value = "<p>$value</p>";
- }
- $grafs[$key] = $value;
- }
-
- # Join grafs in one text, then unhash HTML tags.
- $text = implode("\n\n", $grafs);
-
- # Finish by removing any tag hashes still present in $text.
- $text = $this->unhash($text);
-
- return $text;
- }
-
-
- ### Footnotes
-
- function stripFootnotes($text) {
- #
- # Strips link definitions from text, stores the URLs and titles in
- # hash references.
- #
- $less_than_tab = $this->tab_width - 1;
-
- # Link defs are in the form: [^id]: url "optional title"
- $text = preg_replace_callback('{
- ^[ ]{0,'.$less_than_tab.'}\[\^(.+?)\][ ]?: # note_id = $1
- [ ]*
- \n? # maybe *one* newline
- ( # text = $2 (no blank lines allowed)
- (?:
- .+ # actual text
- |
- \n # newlines but
- (?!\[\^.+?\]:\s)# negative lookahead for footnote marker.
- (?!\n+[ ]{0,3}\S)# ensure line is not blank and followed
- # by non-indented content
- )*
- )
- }xm',
- array(&$this, '_stripFootnotes_callback'),
- $text);
- return $text;
- }
- function _stripFootnotes_callback($matches) {
- $note_id = $this->fn_id_prefix . $matches[1];
- $this->footnotes[$note_id] = $this->outdent($matches[2]);
- return ''; # String that will replace the block
- }
-
-
- function doFootnotes($text) {
- #
- # Replace footnote references in $text [^id] with a special text-token
- # which will be replaced by the actual footnote marker in appendFootnotes.
- #
- if (!$this->in_anchor) {
- $text = preg_replace('{\[\^(.+?)\]}', "F\x1Afn:\\1\x1A:", $text);
- }
- return $text;
- }
-
-
- function appendFootnotes($text) {
- #
- # Append footnote list to text.
- #
- $text = preg_replace_callback('{F\x1Afn:(.*?)\x1A:}',
- array(&$this, '_appendFootnotes_callback'), $text);
-
- if (!empty($this->footnotes_ordered)) {
- $text .= "\n\n";
- $text .= "<div class=\"footnotes\">\n";
- $text .= "<hr". $this->empty_element_suffix ."\n";
- $text .= "<ol>\n\n";
-
- $attr = " rev=\"footnote\"";
- if ($this->fn_backlink_class != "") {
- $class = $this->fn_backlink_class;
- $class = $this->encodeAttribute($class);
- $attr .= " class=\"$class\"";
- }
- if ($this->fn_backlink_title != "") {
- $title = $this->fn_backlink_title;
- $title = $this->encodeAttribute($title);
- $attr .= " title=\"$title\"";
- }
- $num = 0;
-
- while (!empty($this->footnotes_ordered)) {
- $footnote = reset($this->footnotes_ordered);
- $note_id = key($this->footnotes_ordered);
- unset($this->footnotes_ordered[$note_id]);
-
- $footnote .= "\n"; # Need to append newline before parsing.
- $footnote = $this->runBlockGamut("$footnote\n");
- $footnote = preg_replace_callback('{F\x1Afn:(.*?)\x1A:}',
- array(&$this, '_appendFootnotes_callback'), $footnote);
-
- $attr = str_replace("%%", ++$num, $attr);
- $note_id = $this->encodeAttribute($note_id);
-
- # Add backlink to last paragraph; create new paragraph if needed.
- $backlink = "<a href=\"#fnref:$note_id\"$attr>&#8617;</a>";
- if (preg_match('{</p>$}', $footnote)) {
- $footnote = substr($footnote, 0, -4) . "&#160;$backlink</p>";
- } else {
- $footnote .= "\n\n<p>$backlink</p>";
- }
-
- $text .= "<li id=\"fn:$note_id\">\n";
- $text .= $footnote . "\n";
- $text .= "</li>\n\n";
- }
-
- $text .= "</ol>\n";
- $text .= "</div>";
- }
- return $text;
- }
- function _appendFootnotes_callback($matches) {
- $node_id = $this->fn_id_prefix . $matches[1];
-
- # Create footnote marker only if it has a corresponding footnote *and*
- # the footnote hasn't been used by another marker.
- if (isset($this->footnotes[$node_id])) {
- # Transfert footnote content to the ordered list.
- $this->footnotes_ordered[$node_id] = $this->footnotes[$node_id];
- unset($this->footnotes[$node_id]);
-
- $num = $this->footnote_counter++;
- $attr = " rel=\"footnote\"";
- if ($this->fn_link_class != "") {
- $class = $this->fn_link_class;
- $class = $this->encodeAttribute($class);
- $attr .= " class=\"$class\"";
- }
- if ($this->fn_link_title != "") {
- $title = $this->fn_link_title;
- $title = $this->encodeAttribute($title);
- $attr .= " title=\"$title\"";
- }
-
- $attr = str_replace("%%", $num, $attr);
- $node_id = $this->encodeAttribute($node_id);
-
- return
- "<sup id=\"fnref:$node_id\">".
- "<a href=\"#fn:$node_id\"$attr>$num</a>".
- "</sup>";
- }
-
- return "[^".$matches[1]."]";
- }
-
-
- ### Abbreviations ###
-
- function stripAbbreviations($text) {
- #
- # Strips abbreviations from text, stores titles in hash references.
- #
- $less_than_tab = $this->tab_width - 1;
-
- # Link defs are in the form: [id]*: url "optional title"
- $text = preg_replace_callback('{
- ^[ ]{0,'.$less_than_tab.'}\*\[(.+?)\][ ]?: # abbr_id = $1
- (.*) # text = $2 (no blank lines allowed)
- }xm',
- array(&$this, '_stripAbbreviations_callback'),
- $text);
- return $text;
- }
- function _stripAbbreviations_callback($matches) {
- $abbr_word = $matches[1];
- $abbr_desc = $matches[2];
- if ($this->abbr_word_re)
- $this->abbr_word_re .= '|';
- $this->abbr_word_re .= preg_quote($abbr_word);
- $this->abbr_desciptions[$abbr_word] = trim($abbr_desc);
- return ''; # String that will replace the block
- }
-
-
- function doAbbreviations($text) {
- #
- # Find defined abbreviations in text and wrap them in <abbr> elements.
- #
- if ($this->abbr_word_re) {
- // cannot use the /x modifier because abbr_word_re may
- // contain significant spaces:
- $text = preg_replace_callback('{'.
- '(?<![\w\x1A])'.
- '(?:'.$this->abbr_word_re.')'.
- '(?![\w\x1A])'.
- '}',
- array(&$this, '_doAbbreviations_callback'), $text);
- }
- return $text;
- }
- function _doAbbreviations_callback($matches) {
- $abbr = $matches[0];
- if (isset($this->abbr_desciptions[$abbr])) {
- $desc = $this->abbr_desciptions[$abbr];
- if (empty($desc)) {
- return $this->hashPart("<abbr>$abbr</abbr>");
- } else {
- $desc = $this->encodeAttribute($desc);
- return $this->hashPart("<abbr title=\"$desc\">$abbr</abbr>");
- }
- } else {
- return $matches[0];
- }
- }
-
-}
-
-
-/*
-
-PHP Markdown Extra
-==================
-
-Description
------------
-
-This is a PHP port of the original Markdown formatter written in Perl
-by John Gruber. This special "Extra" version of PHP Markdown features
-further enhancements to the syntax for making additional constructs
-such as tables and definition list.
-
-Markdown is a text-to-HTML filter; it translates an easy-to-read /
-easy-to-write structured text format into HTML. Markdown's text format
-is most similar to that of plain text email, and supports features such
-as headers, *emphasis*, code blocks, blockquotes, and links.
-
-Markdown's syntax is designed not as a generic markup language, but
-specifically to serve as a front-end to (X)HTML. You can use span-level
-HTML tags anywhere in a Markdown document, and you can use block level
-HTML tags (like <div> and <table> as well).
-
-For more information about Markdown's syntax, see:
-
-<http://daringfireball.net/projects/markdown/>
-
-
-Bugs
-----
-
-To file bug reports please send email to:
-
-<michel.fortin@michelf.com>
-
-Please include with your report: (1) the example input; (2) the output you
-expected; (3) the output Markdown actually produced.
-
-
-Version History
----------------
-
-See the readme file for detailed release notes for this version.
-
-
-Copyright and License
----------------------
-
-PHP Markdown & Extra
-Copyright (c) 2004-2009 Michel Fortin
-<http://michelf.com/>
-All rights reserved.
-
-Based on Markdown
-Copyright (c) 2003-2006 John Gruber
-<http://daringfireball.net/>
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-* Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
-* Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
-* Neither the name "Markdown" nor the names of its contributors may
- be used to endorse or promote products derived from this software
- without specific prior written permission.
-
-This software is provided by the copyright holders and contributors "as
-is" and any express or implied warranties, including, but not limited
-to, the implied warranties of merchantability and fitness for a
-particular purpose are disclaimed. In no event shall the copyright owner
-or contributors be liable for any direct, indirect, incidental, special,
-exemplary, or consequential damages (including, but not limited to,
-procurement of substitute goods or services; loss of use, data, or
-profits; or business interruption) however caused and on any theory of
-liability, whether in contract, strict liability, or tort (including
-negligence or otherwise) arising in any way out of the use of this
-software, even if advised of the possibility of such damage.
-
-*/
-?> \ No newline at end of file
diff --git a/library/markdownify/TODO b/library/markdownify/TODO
deleted file mode 100644
index 06ec8508b..000000000
--- a/library/markdownify/TODO
+++ /dev/null
@@ -1,29 +0,0 @@
-Markdownify
-===========
-* handle non-markdownifiable lists (i.e. `<ul><li id="foobar">asdf</li></ul>`)
-* organize methods better (i.e. flushlinebreaks & setlinebreaks close to each other)
-* take a look at function names etc.
-* is the new (in rev. 93) lastclosedtag property needed?
-* word wrapping (some work is done but it's still very buggy)
-
-
-Markdownify Extra
-=================
-
-* handle table alignment with KEEP_HTML=false
-* handle tables without headings when KEEP_HTML=false is set
-* handle Markdown inside non-markdownable tags
-
-
-Implementation Thoughts
-=======================
-* non-markdownifiable lists and markdown inside non-markdownable tags as well as the current
- table implementation could be rewritten by using a rollback mechanism.
-
- example:
-
- <ul><li>asdf</li><li id="foobar">asdf</li></ul>
-
- we come to `<ul>`, know that this might fail and create a snapshot of our current parser
- we keep on parsing and when we reach `<li id="foobar">` we gotta rollback and keep this
- list in HTML format.
diff --git a/library/markdownify/example.php b/library/markdownify/example.php
deleted file mode 100644
index ef86dca83..000000000
--- a/library/markdownify/example.php
+++ /dev/null
@@ -1,51 +0,0 @@
-<?php
- error_reporting(E_ALL);
- if (!empty($_POST['input'])) {
- include 'markdownify_extra.php';
- if (!isset($_POST['leap'])) {
- $leap = MDFY_LINKS_EACH_PARAGRAPH;
- } else {
- $leap = $_POST['leap'];
- }
-
- if (!isset($_POST['keepHTML'])) {
- $keephtml = MDFY_KEEPHTML;
- } else {
- $keephtml = $_POST['keepHTML'];
- }
- if (!empty($_POST['extra'])) {
- $md = new Markdownify_Extra($leap, MDFY_BODYWIDTH, $keephtml);
- } else {
- $md = new Markdownify($leap, MDFY_BODYWIDTH, $keephtml);
- }
- if (ini_get('magic_quotes_gpc')) {
- $_POST['input'] = stripslashes($_POST['input']);
- }
- $output = $md->parseString($_POST['input']);
- } else {
- $_POST['input'] = '';
- }
-?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US" lang="en-US">
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
- <title>HTML to Markdown Converter</title>
- </head>
- <body>
- <?php if (empty($_POST['input'])): ?>
- <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
- <fieldset>
- <legend>HTML Input</legend>
- <textarea style="width:100%;" cols="85" rows="40" name="input"><?php echo htmlspecialchars($_POST['input'], ENT_NOQUOTES, 'UTF-8'); ?></textarea>
- </fieldset>
- <label for="extra">Markdownify Extra: <input name="extra" checked="checked" id="extra" type="checkbox" value="1" /></label>
- <label for="leap">Links after each block elem: <input name="leap" id="leap" type="checkbox" value="1" /></label>
- <label for="keepHTML">keep HTML: <input name="keepHTML" id="keepHTML" type="checkbox" value="1" checked="checked" /></label>
- <input type="submit" name="submit" value="submit" />
- </form>
- <?php else: ?>
- <h1 style="text-align:right;"><a href="<?php echo $_SERVER['PHP_SELF']; ?>">BACK</a></h1>
- <pre><?php echo htmlspecialchars($output, ENT_NOQUOTES, 'UTF-8'); ?></pre>
- <?php endif; ?>
- </body>
-</html> \ No newline at end of file
diff --git a/library/markdownify/markdownify.php b/library/markdownify/markdownify.php
deleted file mode 100644
index 0d4429a01..000000000
--- a/library/markdownify/markdownify.php
+++ /dev/null
@@ -1,1197 +0,0 @@
-<?php
-/**
- * Markdownify converts HTML Markup to [Markdown][1] (by [John Gruber][2]. It
- * also supports [Markdown Extra][3] by [Michel Fortin][4] via Markdownify_Extra.
- *
- * It all started as `html2text.php` - a port of [Aaron Swartz'][5] [`html2text.py`][6] - but
- * got a long way since. This is far more than a mere port now!
- * Starting with version 2.0.0 this is a complete rewrite and cannot be
- * compared to Aaron Swatz' `html2text.py` anylonger. I'm now using a HTML parser
- * (see `parsehtml.php` which I also wrote) which makes most of the evil
- * RegEx magic go away and additionally it gives a much cleaner class
- * structure. Also notably is the fact that I now try to prevent regressions by
- * utilizing testcases of Michel Fortin's [MDTest][7].
- *
- * [1]: http://daringfireball.com/projects/markdown
- * [2]: http://daringfireball.com/
- * [3]: http://www.michelf.com/projects/php-markdown/extra/
- * [4]: http://www.michelf.com/
- * [5]: http://www.aaronsw.com/
- * [6]: http://www.aaronsw.com/2002/html2text/
- * [7]: http://article.gmane.org/gmane.text.markdown.general/2540
- *
- * @version 2.0.0 alpha
- * @author Milian Wolff (<mail@milianw.de>, <http://milianw.de>)
- * @license LGPL, see LICENSE_LGPL.txt and the summary below
- * @copyright (C) 2007 Milian Wolff
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-/**
- * HTML Parser, see http://sf.net/projects/parseHTML
- */
-require_once dirname(__FILE__).'/parsehtml/parsehtml.php';
-
-/**
- * default configuration
- */
-define('MDFY_LINKS_EACH_PARAGRAPH', false);
-define('MDFY_BODYWIDTH', false);
-define('MDFY_KEEPHTML', true);
-
-/**
- * HTML to Markdown converter class
- */
-class Markdownify {
- /**
- * html parser object
- *
- * @var parseHTML
- */
- var $parser;
- /**
- * markdown output
- *
- * @var string
- */
- var $output;
- /**
- * stack with tags which where not converted to html
- *
- * @var array<string>
- */
- var $notConverted = array();
- /**
- * skip conversion to markdown
- *
- * @var bool
- */
- var $skipConversion = false;
- /* options */
- /**
- * keep html tags which cannot be converted to markdown
- *
- * @var bool
- */
- var $keepHTML = false;
- /**
- * wrap output, set to 0 to skip wrapping
- *
- * @var int
- */
- var $bodyWidth = 0;
- /**
- * minimum body width
- *
- * @var int
- */
- var $minBodyWidth = 25;
- /**
- * display links after each paragraph
- *
- * @var bool
- */
- var $linksAfterEachParagraph = false;
- /**
- * constructor, set options, setup parser
- *
- * @param bool $linksAfterEachParagraph wether or not to flush stacked links after each paragraph
- * defaults to false
- * @param int $bodyWidth wether or not to wrap the output to the given width
- * defaults to false
- * @param bool $keepHTML wether to keep non markdownable HTML or to discard it
- * defaults to true (HTML will be kept)
- * @return void
- */
- function Markdownify($linksAfterEachParagraph = MDFY_LINKS_EACH_PARAGRAPH, $bodyWidth = MDFY_BODYWIDTH, $keepHTML = MDFY_KEEPHTML) {
- $this->linksAfterEachParagraph = $linksAfterEachParagraph;
- $this->keepHTML = $keepHTML;
-
- if ($bodyWidth > $this->minBodyWidth) {
- $this->bodyWidth = intval($bodyWidth);
- } else {
- $this->bodyWidth = false;
- }
-
- $this->parser = new parseHTML;
- $this->parser->noTagsInCode = true;
-
- # we don't have to do this every time
- $search = array();
- $replace = array();
- foreach ($this->escapeInText as $s => $r) {
- array_push($search, '#(?<!\\\)'.$s.'#U');
- array_push($replace, $r);
- }
- $this->escapeInText = array(
- 'search' => $search,
- 'replace' => $replace
- );
- }
- /**
- * parse a HTML string
- *
- * @param string $html
- * @return string markdown formatted
- */
- function parseString($html) {
- $this->parser->html = $html;
- $this->parse();
- return $this->output;
- }
- /**
- * tags with elements which can be handled by markdown
- *
- * @var array<string>
- */
- var $isMarkdownable = array(
- 'p' => array(),
- 'ul' => array(),
- 'ol' => array(),
- 'li' => array(),
- 'br' => array(),
- 'blockquote' => array(),
- 'code' => array(),
- 'pre' => array(),
- 'a' => array(
- 'href' => 'required',
- 'title' => 'optional',
- ),
- 'strong' => array(),
- 'b' => array(),
- 'em' => array(),
- 'i' => array(),
- 'img' => array(
- 'src' => 'required',
- 'alt' => 'optional',
- 'title' => 'optional',
- ),
- 'h1' => array(),
- 'h2' => array(),
- 'h3' => array(),
- 'h4' => array(),
- 'h5' => array(),
- 'h6' => array(),
- 'hr' => array(),
- );
- /**
- * html tags to be ignored (contents will be parsed)
- *
- * @var array<string>
- */
- var $ignore = array(
- 'html',
- 'body',
- );
- /**
- * html tags to be dropped (contents will not be parsed!)
- *
- * @var array<string>
- */
- var $drop = array(
- 'script',
- 'head',
- 'style',
- 'form',
- 'area',
- 'object',
- 'param',
- 'iframe',
- );
- /**
- * Markdown indents which could be wrapped
- * @note: use strings in regex format
- *
- * @var array<string>
- */
- var $wrappableIndents = array(
- '\* ', # ul
- '\d. ', # ol
- '\d\d. ', # ol
- '> ', # blockquote
- '', # p
- );
- /**
- * list of chars which have to be escaped in normal text
- * @note: use strings in regex format
- *
- * @var array
- *
- * TODO: what's with block chars / sequences at the beginning of a block?
- */
- var $escapeInText = array(
- '([-*_])([ ]{0,2}\1){2,}' => '\\\\$0|', # hr
- '\*\*([^*\s]+)\*\*' => '\*\*$1\*\*', # strong
- '\*([^*\s]+)\*' => '\*$1\*', # em
- '__(?! |_)(.+)(?!<_| )__' => '\_\_$1\_\_', # em
- '_(?! |_)(.+)(?!<_| )_' => '\_$1\_', # em
- '`(.+)`' => '\`$1\`', # code
- '\[(.+)\](\s*\()' => '\[$1\]$2', # links: [text] (url) => [text\] (url)
- '\[(.+)\](\s*)\[(.*)\]' => '\[$1\]$2\[$3\]', # links: [text][id] => [text\][id\]
- );
- /**
- * wether last processed node was a block tag or not
- *
- * @var bool
- */
- var $lastWasBlockTag = false;
- /**
- * name of last closed tag
- *
- * @var string
- */
- var $lastClosedTag = '';
- /**
- * iterate through the nodes and decide what we
- * shall do with the current node
- *
- * @param void
- * @return void
- */
- function parse() {
- $this->output = '';
- # drop tags
- $this->parser->html = preg_replace('#<('.implode('|', $this->drop).')[^>]*>.*</\\1>#sU', '', $this->parser->html);
- while ($this->parser->nextNode()) {
- switch ($this->parser->nodeType) {
- case 'doctype':
- break;
- case 'pi':
- case 'comment':
- if ($this->keepHTML) {
- $this->flushLinebreaks();
- $this->out($this->parser->node);
- $this->setLineBreaks(2);
- }
- # else drop
- break;
- case 'text':
- $this->handleText();
- break;
- case 'tag':
- if (in_array($this->parser->tagName, $this->ignore)) {
- break;
- }
- if ($this->parser->isStartTag) {
- $this->flushLinebreaks();
- }
- if ($this->skipConversion) {
- $this->isMarkdownable(); # update notConverted
- $this->handleTagToText();
- continue;
- }
- if (!$this->parser->keepWhitespace && $this->parser->isBlockElement && $this->parser->isStartTag) {
- $this->parser->html = ltrim($this->parser->html);
- }
- if ($this->isMarkdownable()) {
- if ($this->parser->isBlockElement && $this->parser->isStartTag && !$this->lastWasBlockTag && !empty($this->output)) {
- if (!empty($this->buffer)) {
- $str =& $this->buffer[count($this->buffer) -1];
- } else {
- $str =& $this->output;
- }
- if (substr($str, -strlen($this->indent)-1) != "\n".$this->indent) {
- $str .= "\n".$this->indent;
- }
- }
- $func = 'handleTag_'.$this->parser->tagName;
- $this->$func();
- if ($this->linksAfterEachParagraph && $this->parser->isBlockElement && !$this->parser->isStartTag && empty($this->parser->openTags)) {
- $this->flushStacked();
- }
- if (!$this->parser->isStartTag) {
- $this->lastClosedTag = $this->parser->tagName;
- }
- } else {
- $this->handleTagToText();
- $this->lastClosedTag = '';
- }
- break;
- default:
- trigger_error('invalid node type', E_USER_ERROR);
- break;
- }
- $this->lastWasBlockTag = $this->parser->nodeType == 'tag' && $this->parser->isStartTag && $this->parser->isBlockElement;
- }
- if (!empty($this->buffer)) {
- trigger_error('buffer was not flushed, this is a bug. please report!', E_USER_WARNING);
- while (!empty($this->buffer)) {
- $this->out($this->unbuffer());
- }
- }
- ### cleanup
- $this->output = rtrim(str_replace('&amp;', '&', str_replace('&lt;', '<', str_replace('&gt;', '>', $this->output))));
- # end parsing, flush stacked tags
- $this->flushStacked();
- $this->stack = array();
- }
- /**
- * check if current tag can be converted to Markdown
- *
- * @param void
- * @return bool
- */
- function isMarkdownable() {
- if (!isset($this->isMarkdownable[$this->parser->tagName])) {
- # simply not markdownable
- return false;
- }
- if ($this->parser->isStartTag) {
- $return = true;
- if ($this->keepHTML) {
- $diff = array_diff(array_keys($this->parser->tagAttributes), array_keys($this->isMarkdownable[$this->parser->tagName]));
- if (!empty($diff)) {
- # non markdownable attributes given
- $return = false;
- }
- }
- if ($return) {
- foreach ($this->isMarkdownable[$this->parser->tagName] as $attr => $type) {
- if ($type == 'required' && !isset($this->parser->tagAttributes[$attr])) {
- # required markdown attribute not given
- $return = false;
- break;
- }
- }
- }
- if (!$return) {
- array_push($this->notConverted, $this->parser->tagName.'::'.implode('/', $this->parser->openTags));
- }
- return $return;
- } else {
- if (!empty($this->notConverted) && end($this->notConverted) === $this->parser->tagName.'::'.implode('/', $this->parser->openTags)) {
- array_pop($this->notConverted);
- return false;
- }
- return true;
- }
- }
- /**
- * output all stacked tags
- *
- * @param void
- * @return void
- */
- function flushStacked() {
- # links
- foreach ($this->stack as $tag => $a) {
- if (!empty($a)) {
- call_user_func(array(&$this, 'flushStacked_'.$tag));
- }
- }
- }
- /**
- * output link references (e.g. [1]: http://example.com "title");
- *
- * @param void
- * @return void
- */
- function flushStacked_a() {
- $out = false;
- foreach ($this->stack['a'] as $k => $tag) {
- if (!isset($tag['unstacked'])) {
- if (!$out) {
- $out = true;
- $this->out("\n\n", true);
- } else {
- $this->out("\n", true);
- }
- $this->out(' ['.$tag['linkID'].']: '.$tag['href'].(isset($tag['title']) ? ' "'.$tag['title'].'"' : ''), true);
- $tag['unstacked'] = true;
- $this->stack['a'][$k] = $tag;
- }
- }
- }
- /**
- * flush enqued linebreaks
- *
- * @param void
- * @return void
- */
- function flushLinebreaks() {
- if ($this->lineBreaks && !empty($this->output)) {
- $this->out(str_repeat("\n".$this->indent, $this->lineBreaks), true);
- }
- $this->lineBreaks = 0;
- }
- /**
- * handle non Markdownable tags
- *
- * @param void
- * @return void
- */
- function handleTagToText() {
- if (!$this->keepHTML) {
- if (!$this->parser->isStartTag && $this->parser->isBlockElement) {
- $this->setLineBreaks(2);
- }
- } else {
- # dont convert to markdown inside this tag
- /** TODO: markdown extra **/
- if (!$this->parser->isEmptyTag) {
- if ($this->parser->isStartTag) {
- if (!$this->skipConversion) {
- $this->skipConversion = $this->parser->tagName.'::'.implode('/', $this->parser->openTags);
- }
- } else {
- if ($this->skipConversion == $this->parser->tagName.'::'.implode('/', $this->parser->openTags)) {
- $this->skipConversion = false;
- }
- }
- }
-
- if ($this->parser->isBlockElement) {
- if ($this->parser->isStartTag) {
- if (in_array($this->parent(), array('ins', 'del'))) {
- # looks like ins or del are block elements now
- $this->out("\n", true);
- $this->indent(' ');
- }
- if ($this->parser->tagName != 'pre') {
- $this->out($this->parser->node."\n".$this->indent);
- if (!$this->parser->isEmptyTag) {
- $this->indent(' ');
- } else {
- $this->setLineBreaks(1);
- }
- $this->parser->html = ltrim($this->parser->html);
- } else {
- # don't indent inside <pre> tags
- $this->out($this->parser->node);
- static $indent;
- $indent = $this->indent;
- $this->indent = '';
- }
- } else {
- if (!$this->parser->keepWhitespace) {
- $this->output = rtrim($this->output);
- }
- if ($this->parser->tagName != 'pre') {
- $this->indent(' ');
- $this->out("\n".$this->indent.$this->parser->node);
- } else {
- # reset indentation
- $this->out($this->parser->node);
- static $indent;
- $this->indent = $indent;
- }
-
- if (in_array($this->parent(), array('ins', 'del'))) {
- # ins or del was block element
- $this->out("\n");
- $this->indent(' ');
- }
- if ($this->parser->tagName == 'li') {
- $this->setLineBreaks(1);
- } else {
- $this->setLineBreaks(2);
- }
- }
- } else {
- $this->out($this->parser->node);
- }
- if (in_array($this->parser->tagName, array('code', 'pre'))) {
- if ($this->parser->isStartTag) {
- $this->buffer();
- } else {
- # add stuff so cleanup just reverses this
- $this->out(str_replace('&lt;', '&amp;lt;', str_replace('&gt;', '&amp;gt;', $this->unbuffer())));
- }
- }
- }
- }
- /**
- * handle plain text
- *
- * @param void
- * @return void
- */
- function handleText() {
- if ($this->hasParent('pre') && strpos($this->parser->node, "\n") !== false) {
- $this->parser->node = str_replace("\n", "\n".$this->indent, $this->parser->node);
- }
- if (!$this->hasParent('code') && !$this->hasParent('pre')) {
- # entity decode
- $this->parser->node = $this->decode($this->parser->node);
- if (!$this->skipConversion) {
- # escape some chars in normal Text
- $this->parser->node = preg_replace($this->escapeInText['search'], $this->escapeInText['replace'], $this->parser->node);
- }
- } else {
- $this->parser->node = str_replace(array('&quot;', '&apos'), array('"', '\''), $this->parser->node);
- }
- $this->out($this->parser->node);
- $this->lastClosedTag = '';
- }
- /**
- * handle <em> and <i> tags
- *
- * @param void
- * @return void
- */
- function handleTag_em() {
- $this->out('*', true);
- }
- function handleTag_i() {
- $this->handleTag_em();
- }
- /**
- * handle <strong> and <b> tags
- *
- * @param void
- * @return void
- */
- function handleTag_strong() {
- $this->out('**', true);
- }
- function handleTag_b() {
- $this->handleTag_strong();
- }
- /**
- * handle <h1> tags
- *
- * @param void
- * @return void
- */
- function handleTag_h1() {
- $this->handleHeader(1);
- }
- /**
- * handle <h2> tags
- *
- * @param void
- * @return void
- */
- function handleTag_h2() {
- $this->handleHeader(2);
- }
- /**
- * handle <h3> tags
- *
- * @param void
- * @return void
- */
- function handleTag_h3() {
- $this->handleHeader(3);
- }
- /**
- * handle <h4> tags
- *
- * @param void
- * @return void
- */
- function handleTag_h4() {
- $this->handleHeader(4);
- }
- /**
- * handle <h5> tags
- *
- * @param void
- * @return void
- */
- function handleTag_h5() {
- $this->handleHeader(5);
- }
- /**
- * handle <h6> tags
- *
- * @param void
- * @return void
- */
- function handleTag_h6() {
- $this->handleHeader(6);
- }
- /**
- * number of line breaks before next inline output
- */
- var $lineBreaks = 0;
- /**
- * handle header tags (<h1> - <h6>)
- *
- * @param int $level 1-6
- * @return void
- */
- function handleHeader($level) {
- if ($this->parser->isStartTag) {
- $this->out(str_repeat('#', $level).' ', true);
- } else {
- $this->setLineBreaks(2);
- }
- }
- /**
- * handle <p> tags
- *
- * @param void
- * @return void
- */
- function handleTag_p() {
- if (!$this->parser->isStartTag) {
- $this->setLineBreaks(2);
- }
- }
- /**
- * handle <a> tags
- *
- * @param void
- * @return void
- */
- function handleTag_a() {
- if ($this->parser->isStartTag) {
- $this->buffer();
- if (isset($this->parser->tagAttributes['title'])) {
- $this->parser->tagAttributes['title'] = $this->decode($this->parser->tagAttributes['title']);
- } else {
- $this->parser->tagAttributes['title'] = null;
- }
- $this->parser->tagAttributes['href'] = $this->decode(trim($this->parser->tagAttributes['href']));
- $this->stack();
- } else {
- $tag = $this->unstack();
- $buffer = $this->unbuffer();
-
- if (empty($tag['href']) && empty($tag['title'])) {
- # empty links... testcase mania, who would possibly do anything like that?!
- $this->out('['.$buffer.']()', true);
- return;
- }
-
- if ($buffer == $tag['href'] && empty($tag['title'])) {
- # <http://example.com>
- $this->out('<'.$buffer.'>', true);
- return;
- }
-
- $bufferDecoded = $this->decode(trim($buffer));
- if (substr($tag['href'], 0, 7) == 'mailto:' && 'mailto:'.$bufferDecoded == $tag['href']) {
- if (is_null($tag['title'])) {
- # <mail@example.com>
- $this->out('<'.$bufferDecoded.'>', true);
- return;
- }
- # [mail@example.com][1]
- # ...
- # [1]: mailto:mail@example.com Title
- $tag['href'] = 'mailto:'.$bufferDecoded;
- }
-
- $this->out('['.$buffer.']('.$tag['href'].' "'.$tag['title'].'")', true);
-
-/*
- # [This link][id]
- foreach ($this->stack['a'] as $tag2) {
- if ($tag2['href'] == $tag['href'] && $tag2['title'] === $tag['title']) {
- $tag['linkID'] = $tag2['linkID'];
- break;
- }
- }
- if (!isset($tag['linkID'])) {
- $tag['linkID'] = count($this->stack['a']) + 1;
- array_push($this->stack['a'], $tag);
- }
-
- $this->out('['.$buffer.']['.$tag['linkID'].']', true);
-*/
- }
- }
- /**
- * handle <img /> tags
- *
- * @param void
- * @return void
- */
- function handleTag_img() {
- if (!$this->parser->isStartTag) {
- return; # just to be sure this is really an empty tag...
- }
-
- if (isset($this->parser->tagAttributes['title'])) {
- $this->parser->tagAttributes['title'] = $this->decode($this->parser->tagAttributes['title']);
- } else {
- $this->parser->tagAttributes['title'] = null;
- }
- if (isset($this->parser->tagAttributes['alt'])) {
- $this->parser->tagAttributes['alt'] = $this->decode($this->parser->tagAttributes['alt']);
- } else {
- $this->parser->tagAttributes['alt'] = null;
- }
-
- if (empty($this->parser->tagAttributes['src'])) {
- # support for "empty" images... dunno if this is really needed
- # but there are some testcases which do that...
- if (!empty($this->parser->tagAttributes['title'])) {
- $this->parser->tagAttributes['title'] = ' '.$this->parser->tagAttributes['title'].' ';
- }
- $this->out('!['.$this->parser->tagAttributes['alt'].']('.$this->parser->tagAttributes['title'].')', true);
- return;
- } else {
- $this->parser->tagAttributes['src'] = $this->decode($this->parser->tagAttributes['src']);
- }
-
-// ![Alt text](/path/to/img.jpg "Optional title")
- if ($this->parser->tagAttributes['title'] != "")
- $this->out('!['.$this->parser->tagAttributes['alt'].']('.$this->parser->tagAttributes['src'].' "'.$this->parser->tagAttributes['title'].'")', true);
- else
- $this->out('!['.$this->parser->tagAttributes['alt'].']('.$this->parser->tagAttributes['src'].')', true);
-
-/*
- # [This link][id]
- $link_id = false;
- if (!empty($this->stack['a'])) {
- foreach ($this->stack['a'] as $tag) {
- if ($tag['href'] == $this->parser->tagAttributes['src']
- && $tag['title'] === $this->parser->tagAttributes['title']) {
- $link_id = $tag['linkID'];
- break;
- }
- }
- } else {
- $this->stack['a'] = array();
- }
- if (!$link_id) {
- $link_id = count($this->stack['a']) + 1;
- $tag = array(
- 'href' => $this->parser->tagAttributes['src'],
- 'linkID' => $link_id,
- 'title' => $this->parser->tagAttributes['title']
- );
- array_push($this->stack['a'], $tag);
- }
-
- $this->out('!['.$this->parser->tagAttributes['alt'].']['.$link_id.']', true);
-*/
- }
- /**
- * handle <code> tags
- *
- * @param void
- * @return void
- */
- function handleTag_code() {
- if ($this->hasParent('pre')) {
- # ignore code blocks inside <pre>
- return;
- }
- if ($this->parser->isStartTag) {
- $this->buffer();
- } else {
- $buffer = $this->unbuffer();
- # use as many backticks as needed
- preg_match_all('#`+#', $buffer, $matches);
- if (!empty($matches[0])) {
- rsort($matches[0]);
-
- $ticks = '`';
- while (true) {
- if (!in_array($ticks, $matches[0])) {
- break;
- }
- $ticks .= '`';
- }
- } else {
- $ticks = '`';
- }
- if ($buffer[0] == '`' || substr($buffer, -1) == '`') {
- $buffer = ' '.$buffer.' ';
- }
- $this->out($ticks.$buffer.$ticks, true);
- }
- }
- /**
- * handle <pre> tags
- *
- * @param void
- * @return void
- */
- function handleTag_pre() {
- if ($this->keepHTML && $this->parser->isStartTag) {
- # check if a simple <code> follows
- if (!preg_match('#^\s*<code\s*>#Us', $this->parser->html)) {
- # this is no standard markdown code block
- $this->handleTagToText();
- return;
- }
- }
- $this->indent(' ');
- if (!$this->parser->isStartTag) {
- $this->setLineBreaks(2);
- } else {
- $this->parser->html = ltrim($this->parser->html);
- }
- }
- /**
- * handle <blockquote> tags
- *
- * @param void
- * @return void
- */
- function handleTag_blockquote() {
- $this->indent('> ');
- }
- /**
- * handle <ul> tags
- *
- * @param void
- * @return void
- */
- function handleTag_ul() {
- if ($this->parser->isStartTag) {
- $this->stack();
- if (!$this->keepHTML && $this->lastClosedTag == $this->parser->tagName) {
- $this->out("\n".$this->indent.'<!-- -->'."\n".$this->indent."\n".$this->indent);
- }
- } else {
- $this->unstack();
- if ($this->parent() != 'li' || preg_match('#^\s*(</li\s*>\s*<li\s*>\s*)?<(p|blockquote)\s*>#sU', $this->parser->html)) {
- # dont make Markdown add unneeded paragraphs
- $this->setLineBreaks(2);
- }
- }
- }
- /**
- * handle <ul> tags
- *
- * @param void
- * @return void
- */
- function handleTag_ol() {
- # same as above
- $this->parser->tagAttributes['num'] = 0;
- $this->handleTag_ul();
- }
- /**
- * handle <li> tags
- *
- * @param void
- * @return void
- */
- function handleTag_li() {
- if ($this->parent() == 'ol') {
- $parent =& $this->getStacked('ol');
- if ($this->parser->isStartTag) {
- $parent['num']++;
- $this->out($parent['num'].'.'.str_repeat(' ', 3 - strlen($parent['num'])), true);
- }
- $this->indent(' ', false);
- } else {
- if ($this->parser->isStartTag) {
- $this->out('* ', true);
- }
- $this->indent(' ', false);
- }
- if (!$this->parser->isStartTag) {
- $this->setLineBreaks(1);
- }
- }
- /**
- * handle <hr /> tags
- *
- * @param void
- * @return void
- */
- function handleTag_hr() {
- if (!$this->parser->isStartTag) {
- return; # just to be sure this really is an empty tag
- }
- $this->out('* * *', true);
- $this->setLineBreaks(2);
- }
- /**
- * handle <br /> tags
- *
- * @param void
- * @return void
- */
- function handleTag_br() {
- $this->out(" \n".$this->indent, true);
- $this->parser->html = ltrim($this->parser->html);
- }
- /**
- * node stack, e.g. for <a> and <abbr> tags
- *
- * @var array<array>
- */
- var $stack = array();
- /**
- * add current node to the stack
- * this only stores the attributes
- *
- * @param void
- * @return void
- */
- function stack() {
- if (!isset($this->stack[$this->parser->tagName])) {
- $this->stack[$this->parser->tagName] = array();
- }
- array_push($this->stack[$this->parser->tagName], $this->parser->tagAttributes);
- }
- /**
- * remove current tag from stack
- *
- * @param void
- * @return array
- */
- function unstack() {
- if (!isset($this->stack[$this->parser->tagName]) || !is_array($this->stack[$this->parser->tagName])) {
- trigger_error('Trying to unstack from empty stack. This must not happen.', E_USER_ERROR);
- }
- return array_pop($this->stack[$this->parser->tagName]);
- }
- /**
- * get last stacked element of type $tagName
- *
- * @param string $tagName
- * @return array
- */
- function & getStacked($tagName) {
- // no end() so it can be referenced
- return $this->stack[$tagName][count($this->stack[$tagName])-1];
- }
- /**
- * set number of line breaks before next start tag
- *
- * @param int $number
- * @return void
- */
- function setLineBreaks($number) {
- if ($this->lineBreaks < $number) {
- $this->lineBreaks = $number;
- }
- }
- /**
- * stores current buffers
- *
- * @var array<string>
- */
- var $buffer = array();
- /**
- * buffer next parser output until unbuffer() is called
- *
- * @param void
- * @return void
- */
- function buffer() {
- array_push($this->buffer, '');
- }
- /**
- * end current buffer and return buffered output
- *
- * @param void
- * @return string
- */
- function unbuffer() {
- return array_pop($this->buffer);
- }
- /**
- * append string to the correct var, either
- * directly to $this->output or to the current
- * buffers
- *
- * @param string $put
- * @return void
- */
- function out($put, $nowrap = false) {
- if (empty($put)) {
- return;
- }
- if (!empty($this->buffer)) {
- $this->buffer[count($this->buffer) - 1] .= $put;
- } else {
- if ($this->bodyWidth && !$this->parser->keepWhitespace) { # wrap lines
- // get last line
- $pos = strrpos($this->output, "\n");
- if ($pos === false) {
- $line = $this->output;
- } else {
- $line = substr($this->output, $pos);
- }
-
- if ($nowrap) {
- if ($put[0] != "\n" && $this->strlen($line) + $this->strlen($put) > $this->bodyWidth) {
- $this->output .= "\n".$this->indent.$put;
- } else {
- $this->output .= $put;
- }
- return;
- } else {
- $put .= "\n"; # make sure we get all lines in the while below
- $lineLen = $this->strlen($line);
- while ($pos = strpos($put, "\n")) {
- $putLine = substr($put, 0, $pos+1);
- $put = substr($put, $pos+1);
- $putLen = $this->strlen($putLine);
- if ($lineLen + $putLen < $this->bodyWidth) {
- $this->output .= $putLine;
- $lineLen = $putLen;
- } else {
- $split = preg_split('#^(.{0,'.($this->bodyWidth - $lineLen).'})\b#', $putLine, 2, PREG_SPLIT_OFFSET_CAPTURE | PREG_SPLIT_DELIM_CAPTURE);
- $this->output .= rtrim($split[1][0])."\n".$this->indent.$this->wordwrap(ltrim($split[2][0]), $this->bodyWidth, "\n".$this->indent, false);
- }
- }
- $this->output = substr($this->output, 0, -1);
- return;
- }
- } else {
- $this->output .= $put;
- }
- }
- }
- /**
- * current indentation
- *
- * @var string
- */
- var $indent = '';
- /**
- * indent next output (start tag) or unindent (end tag)
- *
- * @param string $str indentation
- * @param bool $output add indendation to output
- * @return void
- */
- function indent($str, $output = true) {
- if ($this->parser->isStartTag) {
- $this->indent .= $str;
- if ($output) {
- $this->out($str, true);
- }
- } else {
- $this->indent = substr($this->indent, 0, -strlen($str));
- }
- }
- /**
- * decode email addresses
- *
- * @author derernst@gmx.ch <http://www.php.net/manual/en/function.html-entity-decode.php#68536>
- * @author Milian Wolff <http://milianw.de>
- */
- function decode($text, $quote_style = ENT_QUOTES) {
- if (version_compare(PHP_VERSION, '5', '>=')) {
- # UTF-8 is only supported in PHP 5.x.x and above
- $text = html_entity_decode($text, $quote_style, 'UTF-8');
- } else {
- if (function_exists('html_entity_decode')) {
- $text = html_entity_decode($text, $quote_style, 'ISO-8859-1');
- } else {
- static $trans_tbl;
- if (!isset($trans_tbl)) {
- $trans_tbl = array_flip(get_html_translation_table(HTML_ENTITIES, $quote_style));
- }
- $text = strtr($text, $trans_tbl);
- }
- $text = preg_replace_callback('~&#x([0-9a-f]+);~i', array(&$this, '_decode_hex'), $text);
- $text = preg_replace_callback('~&#(\d{2,5});~', array(&$this, '_decode_numeric'), $text);
- }
- return $text;
- }
- /**
- * callback for decode() which converts a hexadecimal entity to UTF-8
- *
- * @param array $matches
- * @return string UTF-8 encoded
- */
- function _decode_hex($matches) {
- return $this->unichr(hexdec($matches[1]));
- }
- /**
- * callback for decode() which converts a numerical entity to UTF-8
- *
- * @param array $matches
- * @return string UTF-8 encoded
- */
- function _decode_numeric($matches) {
- return $this->unichr($matches[1]);
- }
- /**
- * UTF-8 chr() which supports numeric entities
- *
- * @author grey - greywyvern - com <http://www.php.net/manual/en/function.chr.php#55978>
- * @param array $matches
- * @return string UTF-8 encoded
- */
- function unichr($dec) {
- if ($dec < 128) {
- $utf = chr($dec);
- } else if ($dec < 2048) {
- $utf = chr(192 + (($dec - ($dec % 64)) / 64));
- $utf .= chr(128 + ($dec % 64));
- } else {
- $utf = chr(224 + (($dec - ($dec % 4096)) / 4096));
- $utf .= chr(128 + ((($dec % 4096) - ($dec % 64)) / 64));
- $utf .= chr(128 + ($dec % 64));
- }
- return $utf;
- }
- /**
- * UTF-8 strlen()
- *
- * @param string $str
- * @return int
- *
- * @author dtorop 932 at hotmail dot com <http://www.php.net/manual/en/function.strlen.php#37975>
- * @author Milian Wolff <http://milianw.de>
- */
- function strlen($str) {
- if (function_exists('mb_strlen')) {
- return mb_strlen($str, 'UTF-8');
- } else {
- return preg_match_all('/[\x00-\x7F\xC0-\xFD]/', $str, $var_empty);
- }
- }
- /**
- * wordwrap for utf8 encoded strings
- *
- * @param string $str
- * @param integer $len
- * @param string $what
- * @return string
- */
- function wordwrap($str, $width, $break, $cut = false){
- if (!$cut) {
- $regexp = '#^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){1,'.$width.'}\b#';
- } else {
- $regexp = '#^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){'.$width.'}#';
- }
- $return = '';
- while (preg_match($regexp, $str, $matches)) {
- $string = $matches[0];
- $str = ltrim(substr($str, strlen($string)));
- if (!$cut && isset($str[0]) && in_array($str[0], array('.', '!', ';', ':', '?', ','))) {
- $string .= $str[0];
- $str = ltrim(substr($str, 1));
- }
- $return .= $string.$break;
- }
- return $return.ltrim($str);
- }
- /**
- * check if current node has a $tagName as parent (somewhere, not only the direct parent)
- *
- * @param string $tagName
- * @return bool
- */
- function hasParent($tagName) {
- return in_array($tagName, $this->parser->openTags);
- }
- /**
- * get tagName of direct parent tag
- *
- * @param void
- * @return string $tagName
- */
- function parent() {
- return end($this->parser->openTags);
- }
-}
diff --git a/library/markdownify/markdownify_cli.php b/library/markdownify/markdownify_cli.php
deleted file mode 100755
index b3fffbd5c..000000000
--- a/library/markdownify/markdownify_cli.php
+++ /dev/null
@@ -1,33 +0,0 @@
-#!/usr/bin/php
-<?php
-require dirname(__FILE__) .'/markdownify_extra.php';
-
-function param($name, $default = false) {
- if (!in_array('--'.$name, $_SERVER['argv']))
- return $default;
- reset($_SERVER['argv']);
- while (each($_SERVER['argv'])) {
- if (current($_SERVER['argv']) == '--'.$name)
- break;
- }
- $value = next($_SERVER['argv']);
- if ($value === false || substr($value, 0, 2) == '--')
- return true;
- else
- return $value;
-}
-
-
-$input = stream_get_contents(STDIN);
-
-$linksAfterEachParagraph = param('links');
-$bodyWidth = param('width');
-$keepHTML = param('html', true);
-
-if (param('no_extra')) {
- $parser = new Markdownify($linksAfterEachParagraph, $bodyWidth, $keepHTML);
-} else {
- $parser = new Markdownify_Extra($linksAfterEachParagraph, $bodyWidth, $keepHTML);
-}
-
-echo $parser->parseString($input) ."\n"; \ No newline at end of file
diff --git a/library/markdownify/markdownify_extra.php b/library/markdownify/markdownify_extra.php
deleted file mode 100644
index e978a1c8a..000000000
--- a/library/markdownify/markdownify_extra.php
+++ /dev/null
@@ -1,489 +0,0 @@
-<?php
-/**
- * Class to convert HTML to Markdown with PHP Markdown Extra syntax support.
- *
- * @version 1.0.0 alpha
- * @author Milian Wolff (<mail@milianw.de>, <http://milianw.de>)
- * @license LGPL, see LICENSE_LGPL.txt and the summary below
- * @copyright (C) 2007 Milian Wolff
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-/**
- * standard Markdownify class
- */
-require_once dirname(__FILE__).'/markdownify.php';
-
-class Markdownify_Extra extends Markdownify {
- /**
- * table data, including rows with content and the maximum width of each col
- *
- * @var array
- */
- var $table = array();
- /**
- * current col
- *
- * @var int
- */
- var $col = -1;
- /**
- * current row
- *
- * @var int
- */
- var $row = 0;
- /**
- * constructor, see Markdownify::Markdownify() for more information
- */
- function Markdownify_Extra($linksAfterEachParagraph = MDFY_LINKS_EACH_PARAGRAPH, $bodyWidth = MDFY_BODYWIDTH, $keepHTML = MDFY_KEEPHTML) {
- parent::Markdownify($linksAfterEachParagraph, $bodyWidth, $keepHTML);
-
- ### new markdownable tags & attributes
- # header ids: # foo {bar}
- $this->isMarkdownable['h1']['id'] = 'optional';
- $this->isMarkdownable['h2']['id'] = 'optional';
- $this->isMarkdownable['h3']['id'] = 'optional';
- $this->isMarkdownable['h4']['id'] = 'optional';
- $this->isMarkdownable['h5']['id'] = 'optional';
- $this->isMarkdownable['h6']['id'] = 'optional';
- # tables
- $this->isMarkdownable['table'] = array();
- $this->isMarkdownable['th'] = array(
- 'align' => 'optional',
- );
- $this->isMarkdownable['td'] = array(
- 'align' => 'optional',
- );
- $this->isMarkdownable['tr'] = array();
- array_push($this->ignore, 'thead');
- array_push($this->ignore, 'tbody');
- array_push($this->ignore, 'tfoot');
- # definition lists
- $this->isMarkdownable['dl'] = array();
- $this->isMarkdownable['dd'] = array();
- $this->isMarkdownable['dt'] = array();
- # footnotes
- $this->isMarkdownable['fnref'] = array(
- 'target' => 'required',
- );
- $this->isMarkdownable['footnotes'] = array();
- $this->isMarkdownable['fn'] = array(
- 'name' => 'required',
- );
- $this->parser->blockElements['fnref'] = false;
- $this->parser->blockElements['fn'] = true;
- $this->parser->blockElements['footnotes'] = true;
- # abbr
- $this->isMarkdownable['abbr'] = array(
- 'title' => 'required',
- );
- # build RegEx lookahead to decide wether table can pe parsed or not
- $inlineTags = array_keys($this->parser->blockElements, false);
- $colContents = '(?:[^<]|<(?:'.implode('|', $inlineTags).'|[^a-z]))+';
- $this->tableLookaheadHeader = '{
- ^\s*(?:<thead\s*>)?\s* # open optional thead
- <tr\s*>\s*(?: # start required row with headers
- <th(?:\s+align=("|\')(?:left|center|right)\1)?\s*> # header with optional align
- \s*'.$colContents.'\s* # contents
- </th>\s* # close header
- )+</tr> # close row with headers
- \s*(?:</thead>)? # close optional thead
- }sxi';
- $this->tdSubstitute = '\s*'.$colContents.'\s* # contents
- </td>\s*';
- $this->tableLookaheadBody = '{
- \s*(?:<tbody\s*>)?\s* # open optional tbody
- (?:<tr\s*>\s* # start row
- %s # cols to be substituted
- </tr>)+ # close row
- \s*(?:</tbody>)? # close optional tbody
- \s*</table> # close table
- }sxi';
- }
- /**
- * handle header tags (<h1> - <h6>)
- *
- * @param int $level 1-6
- * @return void
- */
- function handleHeader($level) {
- static $id = null;
- if ($this->parser->isStartTag) {
- if (isset($this->parser->tagAttributes['id'])) {
- $id = $this->parser->tagAttributes['id'];
- }
- } else {
- if (!is_null($id)) {
- $this->out(' {#'.$id.'}');
- $id = null;
- }
- }
- parent::handleHeader($level);
- }
- /**
- * handle <abbr> tags
- *
- * @param void
- * @return void
- */
- function handleTag_abbr() {
- if ($this->parser->isStartTag) {
- $this->stack();
- $this->buffer();
- } else {
- $tag = $this->unstack();
- $tag['text'] = $this->unbuffer();
- $add = true;
- foreach ($this->stack['abbr'] as $stacked) {
- if ($stacked['text'] == $tag['text']) {
- /** TODO: differing abbr definitions, i.e. different titles for same text **/
- $add = false;
- break;
- }
- }
- $this->out($tag['text']);
- if ($add) {
- array_push($this->stack['abbr'], $tag);
- }
- }
- }
- /**
- * flush stacked abbr tags
- *
- * @param void
- * @return void
- */
- function flushStacked_abbr() {
- $out = array();
- foreach ($this->stack['abbr'] as $k => $tag) {
- if (!isset($tag['unstacked'])) {
- array_push($out, ' *['.$tag['text'].']: '.$tag['title']);
- $tag['unstacked'] = true;
- $this->stack['abbr'][$k] = $tag;
- }
- }
- if (!empty($out)) {
- $this->out("\n\n".implode("\n", $out));
- }
- }
- /**
- * handle <table> tags
- *
- * @param void
- * @return void
- */
- function handleTag_table() {
- if ($this->parser->isStartTag) {
- # check if upcoming table can be converted
- if ($this->keepHTML) {
- if (preg_match($this->tableLookaheadHeader, $this->parser->html, $matches)) {
- # header seems good, now check body
- # get align & number of cols
- preg_match_all('#<th(?:\s+align=("|\')(left|right|center)\1)?\s*>#si', $matches[0], $cols);
- $regEx = '';
- $i = 1;
- $aligns = array();
- foreach ($cols[2] as $align) {
- $align = strtolower($align);
- array_push($aligns, $align);
- if (empty($align)) {
- $align = 'left'; # default value
- }
- $td = '\s+align=("|\')'.$align.'\\'.$i;
- $i++;
- if ($align == 'left') {
- # look for empty align or left
- $td = '(?:'.$td.')?';
- }
- $td = '<td'.$td.'\s*>';
- $regEx .= $td.$this->tdSubstitute;
- }
- $regEx = sprintf($this->tableLookaheadBody, $regEx);
- if (preg_match($regEx, $this->parser->html, $matches, null, strlen($matches[0]))) {
- # this is a markdownable table tag!
- $this->table = array(
- 'rows' => array(),
- 'col_widths' => array(),
- 'aligns' => $aligns,
- );
- $this->row = 0;
- } else {
- # non markdownable table
- $this->handleTagToText();
- }
- } else {
- # non markdownable table
- $this->handleTagToText();
- }
- } else {
- $this->table = array(
- 'rows' => array(),
- 'col_widths' => array(),
- 'aligns' => array(),
- );
- $this->row = 0;
- }
- } else {
- # finally build the table in Markdown Extra syntax
- $separator = array();
- # seperator with correct align identifikators
- foreach($this->table['aligns'] as $col => $align) {
- if (!$this->keepHTML && !isset($this->table['col_widths'][$col])) {
- break;
- }
- $left = ' ';
- $right = ' ';
- switch ($align) {
- case 'left':
- $left = ':';
- break;
- case 'center':
- $right = ':';
- $left = ':';
- case 'right':
- $right = ':';
- break;
- }
- array_push($separator, $left.str_repeat('-', $this->table['col_widths'][$col]).$right);
- }
- $separator = '|'.implode('|', $separator).'|';
-
- $rows = array();
- # add padding
- array_walk_recursive($this->table['rows'], array(&$this, 'alignTdContent'));
- $header = array_shift($this->table['rows']);
- array_push($rows, '| '.implode(' | ', $header).' |');
- array_push($rows, $separator);
- foreach ($this->table['rows'] as $row) {
- array_push($rows, '| '.implode(' | ', $row).' |');
- }
- $this->out(implode("\n".$this->indent, $rows));
- $this->table = array();
- $this->setLineBreaks(2);
- }
- }
- /**
- * properly pad content so it is aligned as whished
- * should be used with array_walk_recursive on $this->table['rows']
- *
- * @param string &$content
- * @param int $col
- * @return void
- */
- function alignTdContent(&$content, $col) {
- switch ($this->table['aligns'][$col]) {
- default:
- case 'left':
- $content .= str_repeat(' ', $this->table['col_widths'][$col] - $this->strlen($content));
- break;
- case 'right':
- $content = str_repeat(' ', $this->table['col_widths'][$col] - $this->strlen($content)).$content;
- break;
- case 'center':
- $paddingNeeded = $this->table['col_widths'][$col] - $this->strlen($content);
- $left = floor($paddingNeeded / 2);
- $right = $paddingNeeded - $left;
- $content = str_repeat(' ', $left).$content.str_repeat(' ', $right);
- break;
- }
- }
- /**
- * handle <tr> tags
- *
- * @param void
- * @return void
- */
- function handleTag_tr() {
- if ($this->parser->isStartTag) {
- $this->col = -1;
- } else {
- $this->row++;
- }
- }
- /**
- * handle <td> tags
- *
- * @param void
- * @return void
- */
- function handleTag_td() {
- if ($this->parser->isStartTag) {
- $this->col++;
- if (!isset($this->table['col_widths'][$this->col])) {
- $this->table['col_widths'][$this->col] = 0;
- }
- $this->buffer();
- } else {
- $buffer = trim($this->unbuffer());
- $this->table['col_widths'][$this->col] = max($this->table['col_widths'][$this->col], $this->strlen($buffer));
- $this->table['rows'][$this->row][$this->col] = $buffer;
- }
- }
- /**
- * handle <th> tags
- *
- * @param void
- * @return void
- */
- function handleTag_th() {
- if (!$this->keepHTML && !isset($this->table['rows'][1]) && !isset($this->table['aligns'][$this->col+1])) {
- if (isset($this->parser->tagAttributes['align'])) {
- $this->table['aligns'][$this->col+1] = $this->parser->tagAttributes['align'];
- } else {
- $this->table['aligns'][$this->col+1] = '';
- }
- }
- $this->handleTag_td();
- }
- /**
- * handle <dl> tags
- *
- * @param void
- * @return void
- */
- function handleTag_dl() {
- if (!$this->parser->isStartTag) {
- $this->setLineBreaks(2);
- }
- }
- /**
- * handle <dt> tags
- *
- * @param void
- * @return void
- **/
- function handleTag_dt() {
- if (!$this->parser->isStartTag) {
- $this->setLineBreaks(1);
- }
- }
- /**
- * handle <dd> tags
- *
- * @param void
- * @return void
- */
- function handleTag_dd() {
- if ($this->parser->isStartTag) {
- if (substr(ltrim($this->parser->html), 0, 3) == '<p>') {
- # next comes a paragraph, so we'll need an extra line
- $this->out("\n".$this->indent);
- } elseif (substr($this->output, -2) == "\n\n") {
- $this->output = substr($this->output, 0, -1);
- }
- $this->out(': ');
- $this->indent(' ', false);
- } else {
- # lookahead for next dt
- if (substr(ltrim($this->parser->html), 0, 4) == '<dt>') {
- $this->setLineBreaks(2);
- } else {
- $this->setLineBreaks(1);
- }
- $this->indent(' ');
- }
- }
- /**
- * handle <fnref /> tags (custom footnote references, see markdownify_extra::parseString())
- *
- * @param void
- * @return void
- */
- function handleTag_fnref() {
- $this->out('[^'.$this->parser->tagAttributes['target'].']');
- }
- /**
- * handle <fn> tags (custom footnotes, see markdownify_extra::parseString()
- * and markdownify_extra::_makeFootnotes())
- *
- * @param void
- * @return void
- */
- function handleTag_fn() {
- if ($this->parser->isStartTag) {
- $this->out('[^'.$this->parser->tagAttributes['name'].']:');
- $this->setLineBreaks(1);
- } else {
- $this->setLineBreaks(2);
- }
- $this->indent(' ');
- }
- /**
- * handle <footnotes> tag (custom footnotes, see markdownify_extra::parseString()
- * and markdownify_extra::_makeFootnotes())
- *
- * @param void
- * @return void
- */
- function handleTag_footnotes() {
- if (!$this->parser->isStartTag) {
- $this->setLineBreaks(2);
- }
- }
- /**
- * parse a HTML string, clean up footnotes prior
- *
- * @param string $HTML input
- * @return string Markdown formatted output
- */
- function parseString($html) {
- /** TODO: custom markdown-extra options, e.g. titles & classes **/
- # <sup id="fnref:..."><a href"#fn..." rel="footnote">...</a></sup>
- # => <fnref target="..." />
- $html = preg_replace('@<sup id="fnref:([^"]+)">\s*<a href="#fn:\1" rel="footnote">\s*\d+\s*</a>\s*</sup>@Us', '<fnref target="$1" />', $html);
- # <div class="footnotes">
- # <hr />
- # <ol>
- #
- # <li id="fn:...">...</li>
- # ...
- #
- # </ol>
- # </div>
- # =>
- # <footnotes>
- # <fn name="...">...</fn>
- # ...
- # </footnotes>
- $html = preg_replace_callback('#<div class="footnotes">\s*<hr />\s*<ol>\s*(.+)\s*</ol>\s*</div>#Us', array(&$this, '_makeFootnotes'), $html);
- return parent::parseString($html);
- }
- /**
- * replace HTML representation of footnotes with something more easily parsable
- *
- * @note this is a callback to be used in parseString()
- *
- * @param array $matches
- * @return string
- */
- function _makeFootnotes($matches) {
- # <li id="fn:1">
- # ...
- # <a href="#fnref:block" rev="footnote">&#8617;</a></p>
- # </li>
- # => <fn name="1">...</fn>
- # remove footnote link
- $fns = preg_replace('@\s*(&#160;\s*)?<a href="#fnref:[^"]+" rev="footnote"[^>]*>&#8617;</a>\s*@s', '', $matches[1]);
- # remove empty paragraph
- $fns = preg_replace('@<p>\s*</p>@s', '', $fns);
- # <li id="fn:1">...</li> -> <footnote nr="1">...</footnote>
- $fns = str_replace('<li id="fn:', '<fn name="', $fns);
-
- $fns = '<footnotes>'.$fns.'</footnotes>';
- return preg_replace('#</li>\s*(?=(?:<fn|</footnotes>))#s', '</fn>$1', $fns);
- }
-} \ No newline at end of file
diff --git a/library/markdownify/parsehtml/parsehtml.php b/library/markdownify/parsehtml/parsehtml.php
deleted file mode 100644
index 1a8ecacda..000000000
--- a/library/markdownify/parsehtml/parsehtml.php
+++ /dev/null
@@ -1,618 +0,0 @@
-<?php
-/**
- * parseHTML is a HTML parser which works with PHP 4 and above.
- * It tries to handle invalid HTML to some degree.
- *
- * @version 1.0 beta
- * @author Milian Wolff (mail@milianw.de, http://milianw.de)
- * @license LGPL, see LICENSE_LGPL.txt and the summary below
- * @copyright (C) 2007 Milian Wolff
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-class parseHTML {
- /**
- * tags which are always empty (<br /> etc.)
- *
- * @var array<string>
- */
- var $emptyTags = array(
- 'br',
- 'hr',
- 'input',
- 'img',
- 'area',
- 'link',
- 'meta',
- 'param',
- );
- /**
- * tags with preformatted text
- * whitespaces wont be touched in them
- *
- * @var array<string>
- */
- var $preformattedTags = array(
- 'script',
- 'style',
- 'pre',
- 'code',
- );
- /**
- * supress HTML tags inside preformatted tags (see above)
- *
- * @var bool
- */
- var $noTagsInCode = false;
- /**
- * html to be parsed
- *
- * @var string
- */
- var $html = '';
- /**
- * node type:
- *
- * - tag (see isStartTag)
- * - text (includes cdata)
- * - comment
- * - doctype
- * - pi (processing instruction)
- *
- * @var string
- */
- var $nodeType = '';
- /**
- * current node content, i.e. either a
- * simple string (text node), or something like
- * <tag attrib="value"...>
- *
- * @var string
- */
- var $node = '';
- /**
- * wether current node is an opening tag (<a>) or not (</a>)
- * set to NULL if current node is not a tag
- * NOTE: empty tags (<br />) set this to true as well!
- *
- * @var bool | null
- */
- var $isStartTag = null;
- /**
- * wether current node is an empty tag (<br />) or not (<a></a>)
- *
- * @var bool | null
- */
- var $isEmptyTag = null;
- /**
- * tag name
- *
- * @var string | null
- */
- var $tagName = '';
- /**
- * attributes of current tag
- *
- * @var array (attribName=>value) | null
- */
- var $tagAttributes = null;
- /**
- * wether the current tag is a block element
- *
- * @var bool | null
- */
- var $isBlockElement = null;
-
- /**
- * keep whitespace
- *
- * @var int
- */
- var $keepWhitespace = 0;
- /**
- * list of open tags
- * count this to get current depth
- *
- * @var array
- */
- var $openTags = array();
- /**
- * list of block elements
- *
- * @var array
- * TODO: what shall we do with <del> and <ins> ?!
- */
- var $blockElements = array (
- # tag name => <bool> is block
- # block elements
- 'address' => true,
- 'blockquote' => true,
- 'center' => true,
- 'del' => true,
- 'dir' => true,
- 'div' => true,
- 'dl' => true,
- 'fieldset' => true,
- 'form' => true,
- 'h1' => true,
- 'h2' => true,
- 'h3' => true,
- 'h4' => true,
- 'h5' => true,
- 'h6' => true,
- 'hr' => true,
- 'ins' => true,
- 'isindex' => true,
- 'menu' => true,
- 'noframes' => true,
- 'noscript' => true,
- 'ol' => true,
- 'p' => true,
- 'pre' => true,
- 'table' => true,
- 'ul' => true,
- # set table elements and list items to block as well
- 'thead' => true,
- 'tbody' => true,
- 'tfoot' => true,
- 'td' => true,
- 'tr' => true,
- 'th' => true,
- 'li' => true,
- 'dd' => true,
- 'dt' => true,
- # header items and html / body as well
- 'html' => true,
- 'body' => true,
- 'head' => true,
- 'meta' => true,
- 'link' => true,
- 'style' => true,
- 'title' => true,
- # unfancy media tags, when indented should be rendered as block
- 'map' => true,
- 'object' => true,
- 'param' => true,
- 'embed' => true,
- 'area' => true,
- # inline elements
- 'a' => false,
- 'abbr' => false,
- 'acronym' => false,
- 'applet' => false,
- 'b' => false,
- 'basefont' => false,
- 'bdo' => false,
- 'big' => false,
- 'br' => false,
- 'button' => false,
- 'cite' => false,
- 'code' => false,
- 'del' => false,
- 'dfn' => false,
- 'em' => false,
- 'font' => false,
- 'i' => false,
- 'img' => false,
- 'ins' => false,
- 'input' => false,
- 'iframe' => false,
- 'kbd' => false,
- 'label' => false,
- 'q' => false,
- 'samp' => false,
- 'script' => false,
- 'select' => false,
- 'small' => false,
- 'span' => false,
- 'strong' => false,
- 'sub' => false,
- 'sup' => false,
- 'textarea' => false,
- 'tt' => false,
- 'var' => false,
- );
- /**
- * get next node, set $this->html prior!
- *
- * @param void
- * @return bool
- */
- function nextNode() {
- if (empty($this->html)) {
- # we are done with parsing the html string
- return false;
- }
- static $skipWhitespace = true;
- if ($this->isStartTag && !$this->isEmptyTag) {
- array_push($this->openTags, $this->tagName);
- if (in_array($this->tagName, $this->preformattedTags)) {
- # dont truncate whitespaces for <code> or <pre> contents
- $this->keepWhitespace++;
- }
- }
-
- if ($this->html[0] == '<') {
- $token = substr($this->html, 0, 9);
- if (substr($token, 0, 2) == '<?') {
- # xml prolog or other pi's
- /** TODO **/
- #trigger_error('this might need some work', E_USER_NOTICE);
- $pos = strpos($this->html, '>');
- $this->setNode('pi', $pos + 1);
- return true;
- }
- if (substr($token, 0, 4) == '<!--') {
- # comment
- $pos = strpos($this->html, '-->');
- if ($pos === false) {
- # could not find a closing -->, use next gt instead
- # this is firefox' behaviour
- $pos = strpos($this->html, '>') + 1;
- } else {
- $pos += 3;
- }
- $this->setNode('comment', $pos);
-
- $skipWhitespace = true;
- return true;
- }
- if ($token == '<!DOCTYPE') {
- # doctype
- $this->setNode('doctype', strpos($this->html, '>')+1);
-
- $skipWhitespace = true;
- return true;
- }
- if ($token == '<![CDATA[') {
- # cdata, use text node
-
- # remove leading <![CDATA[
- $this->html = substr($this->html, 9);
-
- $this->setNode('text', strpos($this->html, ']]>')+3);
-
- # remove trailing ]]> and trim
- $this->node = substr($this->node, 0, -3);
- $this->handleWhitespaces();
-
- $skipWhitespace = true;
- return true;
- }
- if ($this->parseTag()) {
- # seems to be a tag
- # handle whitespaces
- if ($this->isBlockElement) {
- $skipWhitespace = true;
- } else {
- $skipWhitespace = false;
- }
- return true;
- }
- }
- if ($this->keepWhitespace) {
- $skipWhitespace = false;
- }
- # when we get here it seems to be a text node
- $pos = strpos($this->html, '<');
- if ($pos === false) {
- $pos = strlen($this->html);
- }
- $this->setNode('text', $pos);
- $this->handleWhitespaces();
- if ($skipWhitespace && $this->node == ' ') {
- return $this->nextNode();
- }
- $skipWhitespace = false;
- return true;
- }
- /**
- * parse tag, set tag name and attributes, see if it's a closing tag and so forth...
- *
- * @param void
- * @return bool
- */
- function parseTag() {
- static $a_ord, $z_ord, $special_ords;
- if (!isset($a_ord)) {
- $a_ord = ord('a');
- $z_ord = ord('z');
- $special_ords = array(
- ord(':'), // for xml:lang
- ord('-'), // for http-equiv
- );
- }
-
- $tagName = '';
-
- $pos = 1;
- $isStartTag = $this->html[$pos] != '/';
- if (!$isStartTag) {
- $pos++;
- }
- # get tagName
- while (isset($this->html[$pos])) {
- $pos_ord = ord(strtolower($this->html[$pos]));
- if (($pos_ord >= $a_ord && $pos_ord <= $z_ord) || (!empty($tagName) && is_numeric($this->html[$pos]))) {
- $tagName .= $this->html[$pos];
- $pos++;
- } else {
- $pos--;
- break;
- }
- }
-
- $tagName = strtolower($tagName);
- if (empty($tagName) || !isset($this->blockElements[$tagName])) {
- # something went wrong => invalid tag
- $this->invalidTag();
- return false;
- }
- if ($this->noTagsInCode && end($this->openTags) == 'code' && !($tagName == 'code' && !$isStartTag)) {
- # we supress all HTML tags inside code tags
- $this->invalidTag();
- return false;
- }
-
- # get tag attributes
- /** TODO: in html 4 attributes do not need to be quoted **/
- $isEmptyTag = false;
- $attributes = array();
- $currAttrib = '';
- while (isset($this->html[$pos+1])) {
- $pos++;
- # close tag
- if ($this->html[$pos] == '>' || $this->html[$pos].$this->html[$pos+1] == '/>') {
- if ($this->html[$pos] == '/') {
- $isEmptyTag = true;
- $pos++;
- }
- break;
- }
-
- $pos_ord = ord(strtolower($this->html[$pos]));
- if ( ($pos_ord >= $a_ord && $pos_ord <= $z_ord) || in_array($pos_ord, $special_ords)) {
- # attribute name
- $currAttrib .= $this->html[$pos];
- } elseif (in_array($this->html[$pos], array(' ', "\t", "\n"))) {
- # drop whitespace
- } elseif (in_array($this->html[$pos].$this->html[$pos+1], array('="', "='"))) {
- # get attribute value
- $pos++;
- $await = $this->html[$pos]; # single or double quote
- $pos++;
- $value = '';
- while (isset($this->html[$pos]) && $this->html[$pos] != $await) {
- $value .= $this->html[$pos];
- $pos++;
- }
- $attributes[$currAttrib] = $value;
- $currAttrib = '';
- } else {
- $this->invalidTag();
- return false;
- }
- }
- if ($this->html[$pos] != '>') {
- $this->invalidTag();
- return false;
- }
-
- if (!empty($currAttrib)) {
- # html 4 allows something like <option selected> instead of <option selected="selected">
- $attributes[$currAttrib] = $currAttrib;
- }
- if (!$isStartTag) {
- if (!empty($attributes) || $tagName != end($this->openTags)) {
- # end tags must not contain any attributes
- # or maybe we did not expect a different tag to be closed
- $this->invalidTag();
- return false;
- }
- array_pop($this->openTags);
- if (in_array($tagName, $this->preformattedTags)) {
- $this->keepWhitespace--;
- }
- }
- $pos++;
- $this->node = substr($this->html, 0, $pos);
- $this->html = substr($this->html, $pos);
- $this->tagName = $tagName;
- $this->tagAttributes = $attributes;
- $this->isStartTag = $isStartTag;
- $this->isEmptyTag = $isEmptyTag || in_array($tagName, $this->emptyTags);
- if ($this->isEmptyTag) {
- # might be not well formed
- $this->node = preg_replace('# */? *>$#', ' />', $this->node);
- }
- $this->nodeType = 'tag';
- $this->isBlockElement = $this->blockElements[$tagName];
- return true;
- }
- /**
- * handle invalid tags
- *
- * @param void
- * @return void
- */
- function invalidTag() {
- $this->html = substr_replace($this->html, '&lt;', 0, 1);
- }
- /**
- * update all vars and make $this->html shorter
- *
- * @param string $type see description for $this->nodeType
- * @param int $pos to which position shall we cut?
- * @return void
- */
- function setNode($type, $pos) {
- if ($this->nodeType == 'tag') {
- # set tag specific vars to null
- # $type == tag should not be called here
- # see this::parseTag() for more
- $this->tagName = null;
- $this->tagAttributes = null;
- $this->isStartTag = null;
- $this->isEmptyTag = null;
- $this->isBlockElement = null;
-
- }
- $this->nodeType = $type;
- $this->node = substr($this->html, 0, $pos);
- $this->html = substr($this->html, $pos);
- }
- /**
- * check if $this->html begins with $str
- *
- * @param string $str
- * @return bool
- */
- function match($str) {
- return substr($this->html, 0, strlen($str)) == $str;
- }
- /**
- * truncate whitespaces
- *
- * @param void
- * @return void
- */
- function handleWhitespaces() {
- if ($this->keepWhitespace) {
- # <pre> or <code> before...
- return;
- }
- # truncate multiple whitespaces to a single one
- $this->node = preg_replace('#\s+#s', ' ', $this->node);
- }
- /**
- * normalize self::node
- *
- * @param void
- * @return void
- */
- function normalizeNode() {
- $this->node = '<';
- if (!$this->isStartTag) {
- $this->node .= '/'.$this->tagName.'>';
- return;
- }
- $this->node .= $this->tagName;
- foreach ($this->tagAttributes as $name => $value) {
- $this->node .= ' '.$name.'="'.str_replace('"', '&quot;', $value).'"';
- }
- if ($this->isEmptyTag) {
- $this->node .= ' /';
- }
- $this->node .= '>';
- }
-}
-
-/**
- * indent a HTML string properly
- *
- * @param string $html
- * @param string $indent optional
- * @return string
- */
-function indentHTML($html, $indent = " ", $noTagsInCode = false) {
- $parser = new parseHTML;
- $parser->noTagsInCode = $noTagsInCode;
- $parser->html = $html;
- $html = '';
- $last = true; # last tag was block elem
- $indent_a = array();
- while($parser->nextNode()) {
- if ($parser->nodeType == 'tag') {
- $parser->normalizeNode();
- }
- if ($parser->nodeType == 'tag' && $parser->isBlockElement) {
- $isPreOrCode = in_array($parser->tagName, array('code', 'pre'));
- if (!$parser->keepWhitespace && !$last && !$isPreOrCode) {
- $html = rtrim($html)."\n";
- }
- if ($parser->isStartTag) {
- $html .= implode($indent_a);
- if (!$parser->isEmptyTag) {
- array_push($indent_a, $indent);
- }
- } else {
- array_pop($indent_a);
- if (!$isPreOrCode) {
- $html .= implode($indent_a);
- }
- }
- $html .= $parser->node;
- if (!$parser->keepWhitespace && !($isPreOrCode && $parser->isStartTag)) {
- $html .= "\n";
- }
- $last = true;
- } else {
- if ($parser->nodeType == 'tag' && $parser->tagName == 'br') {
- $html .= $parser->node."\n";
- $last = true;
- continue;
- } elseif ($last && !$parser->keepWhitespace) {
- $html .= implode($indent_a);
- $parser->node = ltrim($parser->node);
- }
- $html .= $parser->node;
-
- if (in_array($parser->nodeType, array('comment', 'pi', 'doctype'))) {
- $html .= "\n";
- } else {
- $last = false;
- }
- }
- }
- return $html;
-}
-/*
-# testcase / example
-error_reporting(E_ALL);
-
-$html = '<p>Simple block on one line:</p>
-
-<div>foo</div>
-
-<p>And nested without indentation:</p>
-
-<div>
-<div>
-<div>
-foo
-</div>
-<div style=">"/>
-</div>
-<div>bar</div>
-</div>
-
-<p>And with attributes:</p>
-
-<div>
- <div id="foo">
- </div>
-</div>
-
-<p>This was broken in 1.0.2b7:</p>
-
-<div class="inlinepage">
-<div class="toggleableend">
-foo
-</div>
-</div>';
-#$html = '<a href="asdfasdf" title=\'asdf\' foo="bar">asdf</a>';
-echo indentHTML($html);
-die();
-*/
diff --git a/library/simplepie/README.markdown b/library/simplepie/README.markdown
deleted file mode 100644
index e5ca021ce..000000000
--- a/library/simplepie/README.markdown
+++ /dev/null
@@ -1,53 +0,0 @@
-# SimplePie
-
-## Authors and contributors
-
-* [Ryan Parman](http://ryanparman.com)
-* [Geoffrey Sneddon](http://gsnedders.com)
-* [Ryan McCue](http://ryanmccue.info)
-* [Michael Shipley](http://michaelpshipley.com)
-* [Steve Minutillo](http://minutillo.com/steve/)
-
-
-## License
-
-[New BSD license](http://www.opensource.org/licenses/bsd-license.php)
-
-
-## Project status
-
-SimplePie is currently maintained by Ryan McCue.
-
-At the moment, there isn't a lot of active development happening. If the community decides that SimplePie is a valuable tool, then the community will come together to maintain it into the future.
-
-If you're interested in getting involved with SimplePie, please get in touch with Ryan McCue.
-
-
-## What comes in the package?
-
-1. `simplepie.inc` - The SimplePie library. This is all that's required for your pages.
-2. `README.markdown` - This document.
-3. `LICENSE.txt` - A copy of the BSD license.
-4. `compatibility_test/` - The SimplePie compatibility test that checks your server for required settings.
-5. `demo/` - A basic feed reader demo that shows off some of SimplePie's more noticable features.
-6. `idn/` - A third-party library that SimplePie can optionally use to understand Internationalized Domain Names (IDNs).
-7. `test/` - SimplePie's unit test suite.
-
-
-## To start the demo
-
-1. Upload this package to your webserver.
-2. Make sure that the cache folder inside of the demo folder is server-writable.
-3. Navigate your browser to the demo folder.
-
-
-## Need support?
-
-For further setup and install documentation, function references, etc., visit:
-[http://simplepie.org/wiki/](http://simplepie.org/wiki/)
-
-For bug reports and feature requests, visit:
-[http://github.com/rmccue/simplepie/issues](http://github.com/rmccue/simplepie/issues)
-
-Support mailing list -- powered by users, for users.
-[http://tech.groups.yahoo.com/group/simplepie-support/](http://tech.groups.yahoo.com/group/simplepie-support/)
diff --git a/library/simplepie/compatibility_test/COMPATIBILITY README.txt b/library/simplepie/compatibility_test/COMPATIBILITY README.txt
deleted file mode 100644
index 5b2498992..000000000
--- a/library/simplepie/compatibility_test/COMPATIBILITY README.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-SIMPLEPIE COMPATIBILITY TEST
-
-1) Upload sp_compatibility_test.php to the web-accessible root of your website.
-For example, if your website is www.example.com, upload it so that you can get
-to it at www.example.com/sp_compatibility_test.php
-
-2) Open your web browser and go to the page you just uploaded. \ No newline at end of file
diff --git a/library/simplepie/compatibility_test/sp_compatibility_test.php b/library/simplepie/compatibility_test/sp_compatibility_test.php
deleted file mode 100644
index a7a7f5fde..000000000
--- a/library/simplepie/compatibility_test/sp_compatibility_test.php
+++ /dev/null
@@ -1,330 +0,0 @@
-<?php
-if (isset($_GET['logopng']))
-{
- $data='iVBORw0KGgoAAAANSUhEUgAAAZAAAAAtCAYAAACAnD3TAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwMi8wMy8wNnKU/JIAAAAfdEVYdFNvZnR3YXJlAE1hY3JvbWVkaWEgRmlyZXdvcmtzIDi1aNJ4AAAR6ElEQVR4nO1dzYrrSJb+TtP79Buk5gnSRbvp1ZC6q4GB4bqWvbq+m1kMDDdr0dCLGcoJDTXUpnxp6Fle52pWQ/syMNAwUEoaLhTtppxPUPITtL0vV8wiTthy6IQUkkOynKkPhDOl+DmKv3Pi/IRIKYUePXr06NGjKn5+bgK6DiKKAEwAbAAslFLpGcm5KBBRDCAGkEK33eac9PQIAyKaAIgArJRSi0BlRqg4z4howHkGnGcVgpYeFaCUepEX9KCL+Ro60gyhB7TiKz033SXvNIZerFXmis9Ey8SiY37mtolMf5+7ny75AjC3+nXC9wcAEuvZ1LNM5zwDMLWeqUx9K6u+6Nzt89KuF7UDIaIhgDvohfbKegYAa+hJMFVaArqz0l0T0VB1V9K5A3AdqjCW8O4cjzfQE3il5J3F1Pp/HIouX2TonyDTLtzXjwDuOtyXnQPvEt5Yt8fQTGUC4LZm0UXz7EtHnjGAG+HerCYNwVAyb3yQKqXmgchpFEcMhP46+hbAR/WLZdBOoL+OIhwkwCG09HDDvwYrAFv+TQAk6hfLYCoP3nZ/KEl2DT1B3hDRZ0yzjYFw77liAvcE3oOIHnBgugY2I7tCi2BhYSHQYXALzeRaZ2xdREaFtIdSamoli4SsA+u3DorKrZ0no0I1aGthHsJj3hTgEZopN4oQ7XO8A/lJb/HpL6Mb9cvl29qE/WWUVQ+9htzZNob8ewvgHZeTAHgAsFC/rM9MiGiMcuZh4yUxChd82+ANgDERxV2Q6FkCLGIeBn0fH5Ag317T9skIA2aI31q3W1mYLwGh2sdmIAYT+m40BPC5+tUy9Sbqu9EEWqJ7XYWIAsR8fUPfjd4DmKlf1WIkVXdUZieUq0spldSo/yXgCsCCVQ8b6DbM7joeW6RlhoCqvBcCn/aS5l4SoO4686yMlqg+OS8CUYhCfnb03+7oGmKHH+jTaE6fRs7K6NNoSJ9GM/o0+ht2+IAdXlvlhLgG2OFLpqeSbpG3adLk2AJ4D+AVX5/z/2tog+8GWorN4n2Vup8xnhz3r3FQg9ht14pu2qGnN9hCMzJDf9I8Rc8HvLtcZ25tEUairzPP7DxPz0i4S89NgC+OdyA7MY22Cfx5lOJgZB5Aq5xsO0bTGAD4hv48eg3grfp7r91R7LovqFsWAO5YBQKl1JwNrmMAiVLq7Aa6DuBeKTXlNkqRt21MoJnFHfQuLoZmyEHcPT0wddx/gDaab4A9o+lRHTF03w4AzFQAt/Y680wplRLRKxxcf6en0hEQK2ih1IatMoKU7pIYoQ8DMYj4qutpERIxgO8pGb1V8bLOwvRYpKvPehWxUWleo45nDaXUhojmYHtVBjfmOTQjaZvpSkbxR6XUJHsjxML3EpHxTgxd7hwV5xkvtEloWk4Fj/3Evs9M0k6bS3dJOFZh/XhR1wA/4o/0f6NJjfcelifp4YFUuskeUK2D1ZWSt9e0XUp69HgZsHcgK1ze4vqB/jSC+ofl3PFcMrZdscdQEpIQVotEADauHQ4vcoA7fkLKY1yfK+XzLDtGAb0lcOWppdY8kRZAVleu6/QzEUVVdyms1hsCbsky05epb/mZcYUq+WyaiuhqGuYdLl3ibhuZvq8073kuBV0rJNgMpNHKGsQH+t9Rqv5xmQjPpHuAlkrjsoLZBTjLVOdmAnNsSczXtZUP0Hr3KbRaZQIr8ImItmC7S7ajedCM+cqpDInoCVr/PC+jX8hbFFwnxXPUAtczRsbbw44raIAWSfhJfDMT0TRLC9Nh+ihHC0/SMXT/230LcLAi05XzTuQ0H7nsVea+aTtTth30uoZW98yscRMz/REcquZM2xo7xkRKx2mnmX9TtlVETNcge99RxIDLuDPvkHnniUW7c54V0Gfa1SDh3xiyl1Fkv5OQLrGZnEBbo/Ek3I93yI+XNfRYydVNRGYeSeNwC902c2iBOoZf++TaIlevUofDFOl/Rt/CY1HtKDYAPlP/lDesE1EK2RPriyKDHRHNkNfxv1JKJUS0QbjguEelVMx1TuEfhPSQ1e0TUYL8wvHKDAJemBLkI3iz2EIf7ZI6aLk3jIAHusswOLPrUUrtlcBVaSlIswcRrYTyCvu4Ii17xwsiWiCcu/oWWjrf8GI1h9/YemKaNryw/1Chzkfod/Yda4/QC9TKou1RKRVXHLeA9poaAqXzLHfaq1KKuJ3+aD26h16/TrHTvldK7W08jgDko3nnC9e7WGmk+pw0eo7dLGz3+iLs57oLthvvqgEX3LauAXbOhnc1wrTEG6dInRcysvo2YzeIK+R7Y0kMZZijfKBdwd+YWdQ+ZfWEpsVVp486bOFJS9ZhI6T34RUOO4Eh/MfWTYamqGKdtzXyRAg37m94sQTqqc1DqNold3S73EhIU1fFWgheA3wCnt9lVOE5Qa0EQU+EsBnIpgOM4JQrpv8e5bxweMsnBbLZi8I5IXkP+WDvdlwEHnC+EvOtp5urq97CCdYQLS4UqmV5EfOVWK8zi15o1O3/28xiUhVV8iU16yhC3XcOhalwz2YgEqNqhIGgmsfihH+bbMOkLIHNQJIOMIFTL3srbDCB3r7ZuOEtdAh8Aa2+eRCebTPPJcmniAk8cL574dkV/AaR5HppypXo8SkzFu6tPQx3wWlxeX55GORD0mLyfeF4bgJXpfFR1P9POAS7SpgIumoTNGkuF4qeZ/PXWTSfAPwdgM8gz724RpllWOE4WDQLu01WOA6MBLSDTZT5P9cvTTgC8Pi1BZktdJ9L42nMeVw7irc4BEm/hR5zJnjat33SMrptI3pphgtATP81GqpfL48GPOv07yBvEd8R0eLUgWF07Wy4sqOhV5nnM4GOoi353Pi8E5GkZ/bZztsS/xZsvGc1mK1PLtzVOAY84CepBqWlQpoj8EIhbf+nPF6kfooLisz20zf2w4zeOkV+fBSpIfZjk4gekW930/9voXdcic3EOWbHrnOesWdJ+vnYKiO205Rg/10PthnZ9V/57J6rINPGMfL2uZXwTolAV4TD4mm3dVNH8kiCycwE4PLONztGruAe84+Cof3of9/2KcPRDkT9erl+BmosYCerR7hRPzraYhF6MBcgPSGvNIALGYhj4mdd/KQdg5QH0CqzBMD3jufzFmk5FVK524zRPhWe2xJqZZzo5ZYI90zw5lwp5fpw1yl1hoCr/hC2jFMg7axiYG+g9kkfArFwL8n8Xbarz2LY1lr2s9ydH5F0IEjw1CsueOcJ8ttWoFv2kNAIqce9gttm8Oixi2tTp1yGSLi3cvxdlq/HZULq44h/2xyrdeuSBOLW1rI8A3kedpDY9cIsnU0cj29ZzXVpKDMCS9JIFYnGB0/ws5u0QYsv4qKHTQdhhcQJhvS2kJybAAkOgccs5pHwrCkGkrNleI4/l/32ltWWjUJiIIsOMIDTrwLwoJEM0kC5a+8loo6aoMri+REcj9ABWtrAudUuThDRgIjmRJQSkeIrweXGd7UBWy1sbA2RdX/bxPduXA4gHtjwWiY5ZQDazb9RgTj3SVv1z8s1/edohQ5PkhDgE2XHyBsvr6A9cy5xJ+KCJPUP2WA9RLXt8xoHfXYCbSitMqlC0tIEUo80bdnKKqEgqKwLB6B2GStYbcRCpD0WmxqH0nja8pwYMB25PszMuzscTke38Q0RbZqKnJe/ib7DDJd9Aq1vR08gG4MnuCwGUscz5DXqRVLvPXcCoi4tTSA9NwF1wFHbU1QLKuuhkSAfCR8hv7AnLdBicAXPyH72Xowhf14BAD4Q0aqJ3VNehQUYNdYle2N5NRQ3qLT9O9nT5hngXIZtCbVpeWH9OBHuGd9+KQ6jTcRnrr8I0vgaIq/C6tKcOIrjYPVxDHc/J014ZokMRL1bbrHDrAOMoO5VxQPBlTaqUMZzwxrdmSxetBR4f0UV64s90qQVy2wczCil897G7NvvMraeFV04nZfdqm3PzAHy7dmVOQEI6xYLxBNH+is0MAZkFRZg1Fh36Ki+twCp+s3SFeshoUuDoi7SGnnMYXorHIzUR0eFk/ABnIZQSssJiAKUYSNtoMxTsIbjPbuwQF8IVjhmGJH1fH2Gj5DdQ8+H/RpV1p9KqQURfQEgF8gKPjsv5Hs4GYj6zXJL/zGaoqOSSwGmFdN3zcOnDJJBNK1RTtKALaMuQtGyRl5qjFHTnneCd0yTiIV7acs01IHUlk1FdddBgmM7nO2S3rqgWXdOKKVm7CAkrRVDBBwvsg3EEPLb5Xv8hBV+Ai7kStRvly6XNhfiiunPhgIdZlqSNQlLyUlIGiw7Fe6NC9qtbFGom69JSDSljrRdWqAj4V6Xdv82LbYxujFaG9olugT/oEJRIQMBAOwwuRCD+gY7OZCNiGbSKaq8sEwdb96lwW0QO+6X0SrtspxBfw0HpTVJSyLcu4I2IEaZMo3bsERL5PjbwOewyEbA47XKkfWdcN8tOHMsaZWQAngs4mXPT0XO+M27iBw41qeMEbQyRt02EIb69+UTfTmaoNvHfGwAxOp+6fJAeAfsP9aUQEtsA+iFSzI8rtk1LjihNWGkTmlArT3c86TnN5n2APRiOeQ6ronos+pkeqEWLZ4uiK40NwB+EPpTCia9Jtp/zjYWnifCvaZR1P+AnptR6Eoz7XAqJJf4rTkosEVEJc+lgyoNmhYoc7Eo0EHNwIEZxNDz4jV08O6YAwU30GrgNJN3UlCPC1EVggEPBgIA6n75kf5tNEE3Y0M08/jdUjqe2JZgr5E/eVPC/HSygmLOJ7jWkuI4RkD6EtmXcPuaN+I80SQtbECs8sU1V7lzxymtwHkEqXcFpx+v+eRgUeLkU3CLvHP25SAvTM34K48x9DhL/EkGoA/ejCHT3bRtNRXuXfMJyxvo9rCPwZcWcUB/PbFpiX4h1H2D/MnUBmbs3uHwCeYt9DsM4Z4DCf+mwrOy9smhXIXFUL9bPmCHYcfUWQvsELmYByP2fUfGFt1zHLiCO0DMl9Z5GFKCYN5g2VX6bgM5DugWMjN7OoPUbOCSjGfAPg5AOiT0NfS7SDvtJPN3WpC3ztcLAffBm2s0PMcKdk7vcGiPyHqWOPK0oc5eoF6sTrZfTXu7mMeDYYQ12ycHbwYCAOqr5RN2iHD+Axc32GGivlp+rr5yqq0MqkgOW2i/+UvxzHqoEF06RbUB2qQH0hTN0TKD/LEcCWlFWiYV6GgDa+t779MTyipjjNEJZWfR5hwrc+ePrP9dc6lxBsILehWmOqzoJfiEvCqxavvkUImBAID6erlVXy9fsXE9PQPjmGKHSH3t523FE+y9R9JH6AMBk4I0W7gZUtmilZ74XKpP0i1nsT+3KhOpKkmpNh7h3iWkPsQ5aEFgWnLIlF3WH/f8/YwUuh2LmMgWwOclzHqL4rYpe1eftrDrO7KJ8HlHvl6IDzheGOcobjPXu6f8m6CcET9Bz7GyBblonhV5lqXW/9MSmo7o4LEgpW+KgRz1Obvt+qxV5gNsK/j193vIh51OUaF9JJBSuQ+RVQLdjd4wIdFJBRVjBc2dF2pWuuMQwZ4gMQ4G2gH0gEtR/UDAxsC6d3vb/xbHBw0uoM+kqiXFsXeHKS/bDivojzuldcrtGi0soY1xOJDOlLuwy+XxMUbeUH1SW1cFOxPY6rP30LQb2lbQX6tLHWWY945wmJeJ+XUJSezlNYGeJ0bHnnKeuSf9pj+zbW7KEOttEtyvExyrss0YyNEjzT+lVKveNJmxGOEw5xNwUKFNtzDON9DvmEK/p3PsVm2fXP5TGci+oH8d3WYIiQIUmUBP3oX6/bKqdHaxcDCQV31E8cuAg4Hcdyjo81lDmH+PVT/z+pLg5YXlA/X7pfkQO+hfRjc4SJWGg8ZCthTHW2DNYf+w7FIAVI8ePV4ObLtCJzQTXUUwBpKF+sPyCVrfWTUqvEePHj1agR3nwsHGtgdT0iJJF4dGGEiPHj16dBlsN/ieiMxBngPkvwlyjmDHi0LPQHr06PESEfPvLdwxNj3zKEFlN94ePXr0eAYoO91gi9Pial4EegbSo0ePl4g53DEQJtgxbY2aC0Wvwuoe7DNxHnEZ33voEQYJdGCjMeY+ofcECg4+P8zETwyhQw9M/MS8Zx5+CBYH0qNHjx49Xhb+H6JWCt7+7okIAAAAAElFTkSuQmCC';
- header('Content-type: image/png');
- echo base64_decode($data);
- exit;
-}
-else if (isset($_GET['background']))
-{
- $data='R0lGODlhMAEeAeYAAP///8ni6cTf5+72+PD3+c3k6+nz9ufy9ev099Pn7bnZ48bg6LfY4uHv8/r8/f3+/v7//7bX4cjh6fj7/Mvj6vz9/rva4+z19/X6+/f7/Pn8/fb6+7jZ4vv9/bra473b5Lzb5LXX4b7c5b/c5e31+NTo7tvs8dfq7/H3+bjY4tnq79Hm7c/l69nr8PL4+t7t8sDd5cLe5uPw9Nvr8Mri6fP4+tLn7er099Hm7O/2+dDm7OTw9OXx9Nbp7tbp7+Lv8+Du8szj6sXg57bY4d3s8djq7+jz9tzs8cPe58fh6M7k68Pf5+by9fz+/sDd5vT5+vT5+97t8bbY4trr8P7+/v7+/+Pw8+Xx9dXo7sHe5vH4+fP5+sHd5t/u8s/l7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAAAALAAAAAAwAR4BAAf/gCGCg4SFhoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnp+goaKNEaWmp6ipqqusra6vsLGys7S1tre4ubq7vL2+v8DBwsPExbBDyMnKy8zNzs/Q0dLT1NXW19jZ2tvc3d7KUuHi4+Tl5ufo6err7O3u7/Dx8vP09fb34wz6+/z9/v8AAwocSLCgwYMIEypcyLChw4cQI0qcSLGixYsYM2osmKKjx48gQ4ocSbKkyZMoU6pcybKly5cwY8qc+ZGDzZs4c+rcybOnz59AgwodSrSo0aNIkypdyrSp06dQo0qdSrWq1aAKsmrdyrWr169gw4odS7as2bNo06pdy7at27dw/+PKnUu3rt27ePOS9cC3r9+/gAMLHky4sOHDiBMrXsy4sePHkCNLnky5suXLmDNr3sz5sIXPoEOLHk26tOnTqFOrXs26tevXsGPLnk27tu3buHPr3s27t+/fqkEIH068uPHjyJMrX868ufPn0KNLn069uvXr2LNr3869u/fv4MOLb/6hvPnz6NOrX8++vfv38OPLn0+/vv37+PPr38+/v///AAYo4IAEFgifCAgmqOCCDDbo4IMQRijhhBRWaOGFGGao4YYcdujhhyCGKOKIJJZo4okoTjjCiiy26OKLMMYo44w01mjjjTjmqOOOPPbo449ABinkkEQWaeSRSCap5P+SNsLg5JNQRinllFRWaeWVWGap5ZZcdunll2CGKeaYZELpxJlopqnmmmy26eabcMYp55x01mnnnXjmqeeefPaZJheABirooIQWauihiCaq6KKMNuroo5BGKumklFZqqaBZZKrpppx26umnoIYq6qiklmrqqaimquqqrLbq6qubxiDrrLTWauutuOaq66689urrr8AGK+ywxBZr7LHI0orEssw26+yz0EYr7bTUVmvttdhmq+223Hbr7bfghtvsEuSWa+656Kar7rrstuvuu/DGK++89NZr77345quvuQL06++/AAcs8MAEF2zwwQgnrPDCDDfs8MMQRyzxxBRXbPH/xRhnrPHGHHeMsBAghyzyyCSXbPLJKKes8sost+zyyzDHLPPMNNdss8gL5Kzzzjz37PPPQAct9NBEF2300UgnrfTSTDft9NNQRy311FRXbfXVWGdNdBJcd+3112CHLfbYZJdt9tlop6322my37fbbcMctt9cS1G333XjnrffefPft99+ABy744IQXbvjhiCeu+OKMN+7445BHLvnklFcOeACYZ6755px37vnnoIcu+uikl2766ainrvrqrLfu+uuwxy777LTXbvvtuI9Ow+689+7778AHL/zwxBdv/PHIJ6/88sw37/zz0EffOwXUV2/99dhnr/323Hfv/ffghy/+//jkl2/++einr/767Lfv/vvwxy///PR/H8T9+Oev//789+///wAMoAAHSMACGvCACEygAhfIwAbmrwAQjKAEJ0jBClrwghjMoAY3yMEOevCDIAyhCEdIwhKa8IQoTKEKV8jCFrrwhTDcoBJmSMMa2vCGOMyhDnfIwx768IdADKIQh0jEIhrxiEhMYg1ZwMQmOvGJUIyiFKdIxSpa8YpYzKIWt8jFLnrxi2AMoxid6IUymvGMaEyjGtfIxja68Y1wjKMc50jHOtrxjnjMox73eEYd+PGPgAykIAdJyEIa8pCITKQiF8nIRjrykZCMpCQnSUlA4uCSmMykJjfJyU568v+ToAylKEdJylKa8pSoTKUqV8nKVmZyBbCMpSxnScta2vKWuMylLnfJy1768pfADKYwh0nMYhpTljZIpjKXycxmOvOZ0IymNKdJzWpa85rYzKY2t8nNbnrzm8tMgDjHSc5ymvOc6EynOtfJzna6853wjKc850nPetrznvjMpz73yc9++vOfAA2oQNtZgoIa9KAITahCF8rQhjr0oRCNqEQnStGKWvSiGM2oRjd6UCx49KMgDalIR0rSkpr0pChNqUpXytKWuvSlMI2pTGdKU5D24KY4zalOd8rTnvr0p0ANqlCHStSiGvWoSE2qUpfK1Kbm1AdQjapUp0rVqlr1qlj/zapWt8rVrnr1q2ANq1jHStaymlWqJ0irWtfK1ra69a1wjatc50rXutr1rnjNq173yte++vWvay2CYAdL2MIa9rCITaxiF8vYxjr2sZCNrGQnS9nKWvaymCWsCjbL2c569rOgDa1oR0va0pr2tKhNrWpXy9rWuva1sI1tZ1tA29ra9ra4za1ud8vb3vr2t8ANrnCHS9ziGve4yE2ucm07heY697nQja50p0vd6lr3utjNrna3y93ueve74A2veMf73BmY97zoTa9618ve9rr3vfCNr3znS9/62ve++M2vfvfLX/Sa4L8ADrCAB0zgAhv4wAhOsIIXzOAGO/jBEI6w/4QnTOEKB/gIGM6whjfM4Q57+MMgDrGIR0ziEpv4xChOsYpXzOIWu1jDRIixjGdM4xrb+MY4zrGOd8zjHvv4x0AOspCHTOQiG/nIM46CkpfM5CY7+clQjrKUp0zlKlv5yljOspa3zOUue/nLYGbyC8ZM5jKb+cxoTrOa18zmNrv5zXCOs5znTOc62/nOeM5zmbvA5z77+c+ADrSgB03oQhv60IhOtKIXzehGO/rRkI60pP0MhEpb+tKYzrSmN83pTnv606AOtahHTepSm/rUqE61qld96Qa4+tWwjrWsZ03rWtv61rjOta53zete+/rXwA62sIdN7GIb+9jITrayl//N7GY7O9c/iLa0p03talv72tjOtra3ze1ue/vb4A63uMdN7nKb+9zTtoK6183udrv73fCOt7znTe962/ve+M63vvfN7377+98AZ7cMBk7wghv84AhPuMIXzvCGO/zhEI+4xCdO8Ypb/OIYz3jBd8Dxjnv84yAPuchHTvKSm/zkKE+5ylfO8pa7/OUwj7nMPc6Dmtv85jjPuc53zvOe+/znQA+60IdO9KIb/ehIT7rSl37zKzj96VCPutSnTvWqW/3qWM+61rfO9a57/etgD7vYx052qDPh7GhPu9rXzva2u/3tcI+73OdO97rb/e54z7ve9873vqf9AIAPvOAHT/j/whv+8IhPvOIXz/jGO/7xkI+85CdP+cpb/vKYz7zmN8/5znv+86BfvBFGT/rSm/70qE+96lfP+ta7/vWwj73sZ0/72tv+9rjPfekNwPve+/73wA++8IdP/OIb//jIT77yl8/85jv/+dCPvvSnT/3qW//62M++9rfP/ePf4PvgD7/4x0/+8pv//OhPv/rXz/72u//98I+//OdP//qHHwH4z7/+98///vv//wAYgAI4gARYgAZ4gAiYgAq4gAzYgA74gBAYgRI4gRRYgRZ4gRg4gBewgRzYgR74gSAYgiI4giRYgiZ4giiYgiq4gizYgi74gjAYgzI4gzRYgzZ4gziY/4M6uIMmSAI++INAGIRCOIREWIRGeIRImIRKuIRM2IRO+IRQGIVSOIVUCIQDcIVYmIVauIVc2IVe+IVgGIZiOIZkWIZmeIZomIZquIZs2IZu+IZwGIdyOId0WId2eIdimAN6uId82Id++IeAGIiCOIiEWIiGeIiImIiKuIiM2IiO+IiQyIcEMImUWImWeImYmImauImc2Ime+ImgGIqiOIqkWIqmeIqomIqquIqs2Iqu+IqwGIuyOIueiAK2eIu4mIu6uIu82Iu++IvAGIzCOIzEWIzGeIzImIzKuIzMiIta8IzQGI3SOI3UWI3WeI3YmI3auI3c2I3e+I3gGI7iOP+O5FiO0egC6JiO6riO7NiO7viO8BiP8jiP9FiP9niP+JiP+riP/NiP/qiONRCQAjmQBFmQBnmQCJmQCrmQDNmQDvmQEBmREjmRFFmRFnmRA7kFGrmRHNmRHvmRIBmSIjmSJFmSJnmSKJmSKrmSLNmSLvmSMMmRTzCTNFmTNnmTOJmTOrmTPNmTPvmTQBmUQjmURFmURnmUSJmUNQkFTNmUTvmUUBmVUjmVVFmVVnmVWJmVWrmVXNmVXvmVYBmWYumUGFCWZnmWaJmWarmWbNmWbvmWcBmXcjmXdFmXdnmXeJmXermXfNmXfvmXgBmYgjmYhFmYcLkBiJmYirmYjNn/mI75mJAZmZI5mZRZmZZ5mZiZmZq5mZzZmZ75maAZmqI5mqRZmqZ5mqg5mRmwmqzZmq75mrAZm7I5m7RZm7Z5m7iZm7q5m7zZm775m8AZnMI5nMRZnMZ5nMiZnMq5nLY5Ac75nNAZndI5ndRZndZ5ndiZndq5ndzZnd75neAZnuI5nuRZnuZ5nuiZnuq5nuzZnu6ZnRoQn/I5n/RZn/Z5n/iZn/q5n/zZn/75nwAaoAI6oARaoAZ6oAiaoAq6oAzaoA76oBAaofzpABRaoRZ6oRiaoRq6oRzaoR76oSAaoiI6oiRaoiZ6oiiaoiq6oizaoi76ojAaozI6ozT6oR1w/6M4mqM6uqM82qM++qNAGqRCOqREWqRGeqRImqRKuqRM2qRO+qRQGqVSOqVUWqVWeqVCWgFauqVc2qVe+qVgGqZiOqZkWqZmeqZomqZquqZs2qZu+qZwGqdyOqd0Wqd2eqd4mqd6WqZN0Kd++qeAGqiCOqiEWqiGeqiImqiKuqiM2qiO+qiQGqmSOql/+gCWeqmYmqmauqmc2qme+qmgGqqiOqqkWqqmeqqomqqquqqs2qqu+qqwGquyOqu0Wqu2GqpUkKu6uqu82qu++qvAGqzCOqzEWqzGeqzImqzKuqzM2qzO+qy7WgXSOq3UWq3Weq3Ymq3auq3c2q3e+q3gGv+u4jqu5Fqu5nqu6EqtELCu7Nqu7vqu8Bqv8jqv9Fqv9nqv+Jqv+rqv/Nqv/vqvABuwAjuwBFuwBnuwCJuwCruw9goADvuwEBuxEjuxFFuxFnuxGJuxGruxHNuxHvuxIBuyIjuyJFuyJnuyKJuyKruyLNuyLvuyMBuzMjuzNFuzNnuzOJuzOruzPNuzPvuzQBu0Qju0RFu0Rnu0SJu0Sru0TNu0Tvu0UBu1Uju1VFu1Vnu1WJu1Wru1XNu1Xvu1YBu2Yju2ZFu2Znu2aJu2aru2bNu2bvu2cBu3cju3dFu3dnu3eJu3eru3fNu3fvu3gBu4gju4hFu4hnu4iJu4irv/uIzbuI77uJAbuZI7uZRbuZZ7uZibuZq7uZzbuZ77uaAbuqI7uqRbuqZ7uqibuqq7uqzbuq77urAbu7I7u7Rbu7Z7u7ibu7q7u7zbu777u8AbvMI7vMRbvMZ7vMibvMq7vMzbvM77vNAbvdI7vdRbvdZ7vdibvdq7vdzbvd77veAbvuI7vuRbvuZ7vuibvuq7vuzbvu77vvAbv/I7v/Rbv/Z7v/ibv/q7v/zbv/77vwAcwAI8wARcwAZ8wAicwAq8wAzcwA78wBAcwRI8wRRcwRZ8wRicwRq8wRzcwR78wSAcwiI8wiRcwiZ8wiicwiq8wizcwi78wjAcwzI8wzRcFcM2fMM4nMM6vMM83MM+/MNArLmBAAA7';
- header('Content-type: image/gif');
- echo base64_decode($data);
- exit;
-}
-
-$php_ok = (function_exists('version_compare') && version_compare(phpversion(), '4.3.0', '>='));
-$pcre_ok = extension_loaded('pcre');
-$curl_ok = function_exists('curl_exec');
-$zlib_ok = extension_loaded('zlib');
-$mbstring_ok = extension_loaded('mbstring');
-$iconv_ok = extension_loaded('iconv');
-if (extension_loaded('xmlreader'))
-{
- $xml_ok = true;
-}
-elseif (extension_loaded('xml'))
-{
- $parser_check = xml_parser_create();
- xml_parse_into_struct($parser_check, '<foo>&amp;</foo>', $values);
- xml_parser_free($parser_check);
- $xml_ok = isset($values[0]['value']);
-}
-else
-{
- $xml_ok = false;
-}
-
-header('Content-type: text/html; charset=UTF-8');
-
-?><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
-
-<html lang="en">
-<head>
-<title>SimplePie: Server Compatibility Test 1.2</title>
-
-<style type="text/css">
-body {
- font:14px/1.4em "Lucida Grande", Verdana, Arial, Helvetica, Clean, Sans, sans-serif;
- letter-spacing:0px;
- color:#333;
- margin:0;
- padding:0;
- background:#fff url(<?php echo pathinfo(__FILE__, PATHINFO_BASENAME); ?>?background) repeat-x top left;
-}
-
-div#site {
- width:550px;
- margin:20px auto 0 auto;
-}
-
-a {
- color:#000;
- text-decoration:underline;
- padding:0 1px;
-}
-
-a:hover {
- color:#fff;
- background-color:#333;
- text-decoration:none;
- padding:0 1px;
-}
-
-p {
- margin:0;
- padding:5px 0;
-}
-
-em {
- font-style:normal;
- background-color:#ffc;
-}
-
-ul, ol {
- margin:10px 0 10px 20px;
- padding:0 0 0 15px;
-}
-
-ul li, ol li {
- margin:0 0 7px 0;
- padding:0 0 0 3px;
-}
-
-h2 {
- font-size:18px;
- padding:0;
- margin:30px 0 10px 0;
-}
-
-h3 {
- font-size:16px;
- padding:0;
- margin:20px 0 5px 0;
-}
-
-h4 {
- font-size:14px;
- padding:0;
- margin:15px 0 5px 0;
-}
-
-code {
- font-size:1.1em;
- background-color:#f3f3ff;
- color:#000;
-}
-
-em strong {
- text-transform: uppercase;
-}
-
-table#chart {
- border-collapse:collapse;
-}
-
-table#chart th {
- background-color:#eee;
- padding:2px 3px;
- border:1px solid #fff;
-}
-
-table#chart td {
- text-align:center;
- padding:2px 3px;
- border:1px solid #eee;
-}
-
-table#chart tr.enabled td {
- /* Leave this alone */
-}
-
-table#chart tr.disabled td,
-table#chart tr.disabled td a {
- color:#999;
- font-style:italic;
-}
-
-table#chart tr.disabled td a {
- text-decoration:underline;
-}
-
-div.chunk {
- margin:20px 0 0 0;
- padding:0 0 10px 0;
- border-bottom:1px solid #ccc;
-}
-
-.footnote,
-.footnote a {
- font:10px/12px verdana, sans-serif;
- color:#aaa;
-}
-
-.footnote em {
- background-color:transparent;
- font-style:italic;
-}
-</style>
-
-<script type="text/javascript">
-// Sleight - Alpha transparency PNG's in Internet Explorer 5.5/6.0
-// (c) 2001, Aaron Boodman; http://www.youngpup.net
-
-if (navigator.platform == "Win32" && navigator.appName == "Microsoft Internet Explorer" && window.attachEvent) {
- document.writeln('<style type="text/css">img, input.image { visibility:hidden; } </style>');
- window.attachEvent("onload", fnLoadPngs);
-}
-
-function fnLoadPngs() {
- var rslt = navigator.appVersion.match(/MSIE (\d+\.\d+)/, '');
- var itsAllGood = (rslt != null && Number(rslt[1]) >= 5.5);
-
- for (var i = document.images.length - 1, img = null; (img = document.images[i]); i--) {
- if (itsAllGood && img.src.match(/\png$/i) != null) {
- var src = img.src;
- var div = document.createElement("DIV");
- div.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + src + "', sizing='scale')";
- div.style.width = img.width + "px";
- div.style.height = img.height + "px";
- img.replaceNode(div);
- }
- img.style.visibility = "visible";
- }
-}
-</script>
-
-</head>
-
-<body>
-
-<div id="site">
- <div id="content">
-
- <div class="chunk">
- <h2 style="text-align:center;"><img src="<?php echo pathinfo(__FILE__, PATHINFO_BASENAME); ?>?logopng" alt="SimplePie Compatibility Test" title="SimplePie Compatibility Test" /></h2>
- <table cellpadding="0" cellspacing="0" border="0" width="100%" id="chart">
- <thead>
- <tr>
- <th>Test</th>
- <th>Should Be</th>
- <th>What You Have</th>
- </tr>
- </thead>
- <tbody>
- <tr class="<?php echo ($php_ok) ? 'enabled' : 'disabled'; ?>">
- <td>PHP&sup1;</td>
- <td>4.3.0 or higher</td>
- <td><?php echo phpversion(); ?></td>
- </tr>
- <tr class="<?php echo ($xml_ok) ? 'enabled, and sane' : 'disabled, or broken'; ?>">
- <td><a href="http://php.net/xml">XML</a></td>
- <td>Enabled</td>
- <td><?php echo ($xml_ok) ? 'Enabled, and sane' : 'Disabled, or broken'; ?></td>
- </tr>
- <tr class="<?php echo ($pcre_ok) ? 'enabled' : 'disabled'; ?>">
- <td><a href="http://php.net/pcre">PCRE</a>&sup2;</td>
- <td>Enabled</td>
- <td><?php echo ($pcre_ok) ? 'Enabled' : 'Disabled'; ?></td>
- </tr>
- <tr class="<?php echo ($curl_ok) ? 'enabled' : 'disabled'; ?>">
- <td><a href="http://php.net/curl">cURL</a></td>
- <td>Enabled</td>
- <td><?php echo (extension_loaded('curl')) ? 'Enabled' : 'Disabled'; ?></td>
- </tr>
- <tr class="<?php echo ($zlib_ok) ? 'enabled' : 'disabled'; ?>">
- <td><a href="http://php.net/zlib">Zlib</a></td>
- <td>Enabled</td>
- <td><?php echo ($zlib_ok) ? 'Enabled' : 'Disabled'; ?></td>
- </tr>
- <tr class="<?php echo ($mbstring_ok) ? 'enabled' : 'disabled'; ?>">
- <td><a href="http://php.net/mbstring">mbstring</a></td>
- <td>Enabled</td>
- <td><?php echo ($mbstring_ok) ? 'Enabled' : 'Disabled'; ?></td>
- </tr>
- <tr class="<?php echo ($iconv_ok) ? 'enabled' : 'disabled'; ?>">
- <td><a href="http://php.net/iconv">iconv</a></td>
- <td>Enabled</td>
- <td><?php echo ($iconv_ok) ? 'Enabled' : 'Disabled'; ?></td>
- </tr>
- </tbody>
- </table>
- </div>
-
- <div class="chunk">
- <h3>What does this mean?</h3>
- <ol>
- <?php if ($php_ok && $xml_ok && $pcre_ok && $mbstring_ok && $iconv_ok && $curl_ok && $zlib_ok): ?>
- <li><em>You have everything you need to run SimplePie properly! Congratulations!</em></li>
- <?php else: ?>
- <?php if ($php_ok): ?>
- <li><strong>PHP:</strong> You are running a supported version of PHP. <em>No problems here.</em></li>
- <?php if ($xml_ok): ?>
- <li><strong>XML:</strong> You have XMLReader support or a version of XML support that isn't broken installed. <em>No problems here.</em></li>
- <?php if ($pcre_ok): ?>
- <li><strong>PCRE:</strong> You have PCRE support installed. <em>No problems here.</em></li>
- <?php if ($curl_ok): ?>
- <li><strong>cURL:</strong> You have <code>cURL</code> support installed. <em>No problems here.</em></li>
- <?php else: ?>
- <li><strong>cURL:</strong> The <code>cURL</code> extension is not available. SimplePie will use <code>fsockopen()</code> instead.</li>
- <?php endif; ?>
-
- <?php if ($zlib_ok): ?>
- <li><strong>Zlib:</strong> You have <code>Zlib</code> enabled. This allows SimplePie to support GZIP-encoded feeds. <em>No problems here.</em></li>
- <?php else: ?>
- <li><strong>Zlib:</strong> The <code>Zlib</code> extension is not available. SimplePie will ignore any GZIP-encoding, and instead handle feeds as uncompressed text.</li>
- <?php endif; ?>
-
- <?php if ($mbstring_ok && $iconv_ok): ?>
- <li><strong>mbstring and iconv:</strong> You have both <code>mbstring</code> and <code>iconv</code> installed! This will allow SimplePie to handle the greatest number of languages. Check the <a href="http://simplepie.org/wiki/faq/supported_character_encodings">Supported Character Encodings</a> chart to see what's supported on your webhost.</li>
- <?php elseif ($mbstring_ok): ?>
- <li><strong>mbstring:</strong> <code>mbstring</code> is installed, but <code>iconv</code> is not. Check the <a href="http://simplepie.org/wiki/faq/supported_character_encodings">Supported Character Encodings</a> chart to see what's supported on your webhost.</li>
- <?php elseif ($iconv_ok): ?>
- <li><strong>iconv:</strong> <code>iconv</code> is installed, but <code>mbstring</code> is not. Check the <a href="http://simplepie.org/wiki/faq/supported_character_encodings">Supported Character Encodings</a> chart to see what's supported on your webhost.</li>
- <?php else: ?>
- <li><strong>mbstring and iconv:</strong> <em>You do not have either of the extensions installed.</em> This will significantly impair your ability to read non-English feeds, as well as even some English ones. Check the <a href="http://simplepie.org/wiki/faq/supported_character_encodings">Supported Character Encodings</a> chart to see what's supported on your webhost.</li>
- <?php endif; ?>
- <?php else: ?>
- <li><strong>PCRE:</strong> Your PHP installation doesn't support Perl-Compatible Regular Expressions. <em>SimplePie is a no-go at the moment.</em></li>
- <?php endif; ?>
- <?php else: ?>
- <li><strong>XML:</strong> Your PHP installation doesn't support XML parsing. <em>SimplePie is a no-go at the moment.</em></li>
- <?php endif; ?>
- <?php else: ?>
- <li><strong>PHP:</strong> You are running an unsupported version of PHP. <em>SimplePie is a no-go at the moment.</em></li>
- <?php endif; ?>
- <?php endif; ?>
- </ol>
- </div>
-
- <div class="chunk">
- <?php if ($php_ok && $xml_ok && $pcre_ok && $mbstring_ok && $iconv_ok) { ?>
- <h3>Bottom Line: Yes, you can!</h3>
- <p><em>Your webhost has its act together!</em></p>
- <p>You can download the latest version of SimplePie from <a href="http://simplepie.org/downloads/">SimplePie.org</a> and install it by <a href="http://simplepie.org/wiki/setup/start">following the instructions</a>. You can find example uses with <a href="http://simplepie.org/ideas/">SimplePie Ideas</a>.</p>
- <p>Take the time to read <a href="http://simplepie.org/wiki/setup/start">Requirements and Getting Started</a> to make sure you're prepared to use SimplePie. No seriously, read them.</p>
- <p class="footnote"><em><strong>Note</strong></em>: Passing this test does not guarantee that SimplePie will run on your webhost &mdash; it only ensures that the basic requirements have been addressed.</p>
- <?php } else if ($php_ok && $xml_ok && $pcre_ok) { ?>
- <h3>Bottom Line: Yes, you can!</h3>
- <p><em>For most feeds, it'll run with no problems.</em> There are <a href="http://simplepie.org/wiki/faq/supported_character_encodings">certain languages</a> that you might have a hard time with though.</p>
- <p>You can download the latest version of SimplePie from <a href="http://simplepie.org/downloads/">SimplePie.org</a> and install it by <a href="http://simplepie.org/wiki/setup/start">following the instructions</a>. You can find example uses with <a href="http://simplepie.org/ideas/">SimplePie Ideas</a>.</p>
- <p>Take the time to read <a href="http://simplepie.org/wiki/setup/start">Requirements and Getting Started</a> to make sure you're prepared to use SimplePie. No seriously, read them.</p>
- <p class="footnote"><em><strong>Note</strong></em>: Passing this test does not guarantee that SimplePie will run on your webhost &mdash; it only ensures that the basic requirements have been addressed.</p>
- <?php } else { ?>
- <h3>Bottom Line: We're sorry…</h3>
- <p><em>Your webhost does not support the minimum requirements for SimplePie.</em> It may be a good idea to contact your webhost, and ask them to install a more recent version of PHP as well as the <code>xmlreader</code>, <code>xml</code>, <code>mbstring</code>, <code>iconv</code>, <code>curl</code>, and <code>zlib</code> extensions.</p>
- <?php } ?>
- </div>
-
- <div class="chunk">
- <p class="footnote">&sup1; &mdash; SimplePie 2 will not support PHP 4.x. The core PHP team has discontinued PHP 4.x patches and support. <a href="http://simplepie.org/blog/2007/07/13/simplepie-is-going-php5-only/">Read the announcement.</a></p>
- <p class="footnote">&sup2; &mdash; Some recent versions of the PCRE (PERL-Compatible Regular Expression) engine compiled into PHP have been buggy, and are the source of PHP segmentation faults (e.g. crashes) which cause random things like blank, white screens. Check the <a href="http://simplepie.org/support/">Support Forums</a> for the latest information on patches and ongoing fixes.</p>
- </div>
-
- </div>
-
-</div>
-
-</body>
-</html> \ No newline at end of file
diff --git a/library/simplepie/create.php b/library/simplepie/create.php
deleted file mode 100644
index 908ed182b..000000000
--- a/library/simplepie/create.php
+++ /dev/null
@@ -1,178 +0,0 @@
-<?php
-
-require_once 'simplepie.inc';
-
-function normalize_character_set($charset)
-{
- return strtolower(preg_replace('/(?:[^a-zA-Z0-9]+|([^0-9])0+)/', '\1', $charset));
-}
-
-function build_character_set_list()
-{
- $file = new SimplePie_File('http://www.iana.org/assignments/character-sets');
- if (!$file->success && !($file->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($file->status_code === 200 || $file->status_code > 206 && $file->status_code < 300)))
- {
- return false;
- }
- else
- {
- $data = explode("\n", $file->body);
- unset($file);
-
- foreach ($data as $line)
- {
- // New character set
- if (substr($line, 0, 5) === 'Name:')
- {
- // If we already have one, push it on to the array
- if (isset($aliases))
- {
- for ($i = 0, $count = count($aliases); $i < $count; $i++)
- {
- $aliases[$i] = normalize_character_set($aliases[$i]);
- }
- $charsets[$preferred] = array_unique($aliases);
- natsort($charsets[$preferred]);
- }
-
- $start = 5 + strspn($line, "\x09\x0A\x0B\xC\x0D\x20", 5);
- $chars = strcspn($line, "\x09\x0A\x0B\xC\x0D\x20", $start);
- $aliases = array(substr($line, $start, $chars));
- $preferred = end($aliases);
- }
- // Another alias
- elseif(substr($line, 0, 6) === 'Alias:')
- {
- $start = 7 + strspn($line, "\x09\x0A\x0B\xC\x0D\x20", 7);
- $chars = strcspn($line, "\x09\x0A\x0B\xC\x0D\x20", $start);
- $aliases[] = substr($line, $start, $chars);
-
- if (end($aliases) === 'None')
- {
- array_pop($aliases);
- }
- elseif (substr($line, 7 + $chars + 1, 21) === '(preferred MIME name)')
- {
- $preferred = end($aliases);
- }
- }
- }
-
- // Compatibility replacements
- $compat = array(
- 'EUC-KR' => 'windows-949',
- 'GB2312' => 'GBK',
- 'GB_2312-80' => 'GBK',
- 'ISO-8859-1' => 'windows-1252',
- 'ISO-8859-9' => 'windows-1254',
- 'ISO-8859-11' => 'windows-874',
- 'KS_C_5601-1987' => 'windows-949',
- 'TIS-620' => 'windows-874',
- //'US-ASCII' => 'windows-1252',
- 'x-x-big5' => 'Big5',
- );
-
- foreach ($compat as $real => $replace)
- {
- if (isset($charsets[$real]) && isset($charsets[$replace]))
- {
- $charsets[$replace] = array_merge($charsets[$replace], $charsets[$real]);
- unset($charsets[$real]);
- }
- elseif (isset($charsets[$real]))
- {
- $charsets[$replace] = $charsets[$real];
- $charsets[$replace][] = normalize_character_set($replace);
- unset($charsets[$real]);
- }
- else
- {
- $charsets[$replace][] = normalize_character_set($real);
- }
- $charsets[$replace] = array_unique($charsets[$replace]);
- natsort($charsets[$replace]);
- }
-
- // Sort it
- uksort($charsets, 'strnatcasecmp');
-
- // Check that nothing matches more than one
- $all = call_user_func_array('array_merge', $charsets);
- $all_count = array_count_values($all);
- if (max($all_count) > 1)
- {
- echo "Duplicated charsets:\n";
- foreach ($all_count as $charset => $count)
- {
- if ($count > 1)
- {
- echo "$charset\n";
- }
- }
- }
-
- // And we're done!
- return $charsets;
- }
-}
-
-function charset($charset)
-{
- $normalized_charset = normalize_character_set($charset);
- if ($charsets = build_character_set_list())
- {
- foreach ($charsets as $preferred => $aliases)
- {
- if (in_array($normalized_charset, $aliases))
- {
- return $preferred;
- }
- }
- return $charset;
- }
- else
- {
- return false;
- }
-}
-
-function build_function()
-{
- if ($charsets = build_character_set_list())
- {
- $return = <<<EOF
-function charset(\$charset)
-{
- // Normalization from UTS #22
- switch (strtolower(preg_replace('/(?:[^a-zA-Z0-9]+|([^0-9])0+)/', '\\1', \$charset)))
- {
-
-EOF;
- foreach ($charsets as $preferred => $aliases)
- {
- foreach ($aliases as $alias)
- {
- $return .= "\t\tcase " . var_export($alias, true) . ":\n";
- }
- $return .= "\t\t\treturn " . var_export($preferred, true) . ";\n\n";
- }
- $return .= <<<EOF
- default:
- return \$charset;
- }
-}
-EOF;
- return $return;
- }
- else
- {
- return false;
- }
-}
-
-if (php_sapi_name() === 'cli' && realpath($_SERVER['argv'][0]) === __FILE__)
-{
- echo build_function();
-}
-
-?> \ No newline at end of file
diff --git a/library/simplepie/db.sql b/library/simplepie/db.sql
deleted file mode 100644
index 13f504c21..000000000
--- a/library/simplepie/db.sql
+++ /dev/null
@@ -1,38 +0,0 @@
-/* SQLite */
-CREATE TABLE cache_data (
- id TEXT NOT NULL,
- items SMALLINT NOT NULL DEFAULT 0,
- data BLOB NOT NULL,
- mtime INTEGER UNSIGNED NOT NULL
-);
-CREATE UNIQUE INDEX id ON cache_data(id);
-
-CREATE TABLE items (
- feed_id TEXT NOT NULL,
- id TEXT NOT NULL,
- data TEXT NOT NULL,
- posted INTEGER UNSIGNED NOT NULL
-);
-CREATE INDEX feed_id ON items(feed_id);
-
-
-/* MySQL */
-CREATE TABLE `cache_data` (
- `id` TEXT CHARACTER SET utf8 NOT NULL,
- `items` SMALLINT NOT NULL DEFAULT 0,
- `data` BLOB NOT NULL,
- `mtime` INT UNSIGNED NOT NULL,
- UNIQUE (
- `id`(125)
- )
-);
-
-CREATE TABLE `items` (
- `feed_id` TEXT CHARACTER SET utf8 NOT NULL,
- `id` TEXT CHARACTER SET utf8 NOT NULL,
- `data` TEXT CHARACTER SET utf8 NOT NULL,
- `posted` INT UNSIGNED NOT NULL,
- INDEX `feed_id` (
- `feed_id`(125)
- )
-); \ No newline at end of file
diff --git a/library/simplepie/idn/idna_convert.class.php b/library/simplepie/idn/idna_convert.class.php
deleted file mode 100644
index ed2bae26d..000000000
--- a/library/simplepie/idn/idna_convert.class.php
+++ /dev/null
@@ -1,969 +0,0 @@
-<?php
-// {{{ license
-
-/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4 foldmethod=marker: */
-//
-// +----------------------------------------------------------------------+
-// | This library is free software; you can redistribute it and/or modify |
-// | it under the terms of the GNU Lesser General Public License as |
-// | published by the Free Software Foundation; either version 2.1 of the |
-// | License, or (at your option) any later version. |
-// | |
-// | This library is distributed in the hope that it will be useful, but |
-// | WITHOUT ANY WARRANTY; without even the implied warranty of |
-// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
-// | Lesser General Public License for more details. |
-// | |
-// | You should have received a copy of the GNU Lesser General Public |
-// | License along with this library; if not, write to the Free Software |
-// | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 |
-// | USA. |
-// +----------------------------------------------------------------------+
-//
-
-// }}}
-
-/**
- * Encode/decode Internationalized Domain Names.
- *
- * The class allows to convert internationalized domain names
- * (see RFC 3490 for details) as they can be used with various registries worldwide
- * to be translated between their original (localized) form and their encoded form
- * as it will be used in the DNS (Domain Name System).
- *
- * The class provides two public methods, encode() and decode(), which do exactly
- * what you would expect them to do. You are allowed to use complete domain names,
- * simple strings and complete email addresses as well. That means, that you might
- * use any of the following notations:
- *
- * - www.nörgler.com
- * - xn--nrgler-wxa
- * - xn--brse-5qa.xn--knrz-1ra.info
- *
- * Unicode input might be given as either UTF-8 string, UCS-4 string or UCS-4
- * array. Unicode output is available in the same formats.
- * You can select your preferred format via {@link set_paramter()}.
- *
- * ACE input and output is always expected to be ASCII.
- *
- * @author Matthias Sommerfeld <mso@phlylabs.de>
- * @copyright 2004-2007 phlyLabs Berlin, http://phlylabs.de
- * @version 0.5.1
- *
- */
-class idna_convert
-{
- /**
- * Holds all relevant mapping tables, loaded from a seperate file on construct
- * See RFC3454 for details
- *
- * @var array
- * @access private
- */
- var $NP = array();
-
- // Internal settings, do not mess with them
- var $_punycode_prefix = 'xn--';
- var $_invalid_ucs = 0x80000000;
- var $_max_ucs = 0x10FFFF;
- var $_base = 36;
- var $_tmin = 1;
- var $_tmax = 26;
- var $_skew = 38;
- var $_damp = 700;
- var $_initial_bias = 72;
- var $_initial_n = 0x80;
- var $_sbase = 0xAC00;
- var $_lbase = 0x1100;
- var $_vbase = 0x1161;
- var $_tbase = 0x11A7;
- var $_lcount = 19;
- var $_vcount = 21;
- var $_tcount = 28;
- var $_ncount = 588; // _vcount * _tcount
- var $_scount = 11172; // _lcount * _tcount * _vcount
- var $_error = false;
-
- // See {@link set_paramter()} for details of how to change the following
- // settings from within your script / application
- var $_api_encoding = 'utf8'; // Default input charset is UTF-8
- var $_allow_overlong = false; // Overlong UTF-8 encodings are forbidden
- var $_strict_mode = false; // Behave strict or not
-
- // The constructor
- function idna_convert($options = false)
- {
- $this->slast = $this->_sbase + $this->_lcount * $this->_vcount * $this->_tcount;
- if (function_exists('file_get_contents')) {
- $this->NP = unserialize(file_get_contents(dirname(__FILE__).'/npdata.ser'));
- } else {
- $this->NP = unserialize(join('', file(dirname(__FILE__).'/npdata.ser')));
- }
- // If parameters are given, pass these to the respective method
- if (is_array($options)) {
- return $this->set_parameter($options);
- }
- return true;
- }
-
- /**
- * Sets a new option value. Available options and values:
- * [encoding - Use either UTF-8, UCS4 as array or UCS4 as string as input ('utf8' for UTF-8,
- * 'ucs4_string' and 'ucs4_array' respectively for UCS4); The output is always UTF-8]
- * [overlong - Unicode does not allow unnecessarily long encodings of chars,
- * to allow this, set this parameter to true, else to false;
- * default is false.]
- * [strict - true: strict mode, good for registration purposes - Causes errors
- * on failures; false: loose mode, ideal for "wildlife" applications
- * by silently ignoring errors and returning the original input instead
- *
- * @param mixed Parameter to set (string: single parameter; array of Parameter => Value pairs)
- * @param string Value to use (if parameter 1 is a string)
- * @return boolean true on success, false otherwise
- * @access public
- */
- function set_parameter($option, $value = false)
- {
- if (!is_array($option)) {
- $option = array($option => $value);
- }
- foreach ($option as $k => $v) {
- switch ($k) {
- case 'encoding':
- switch ($v) {
- case 'utf8':
- case 'ucs4_string':
- case 'ucs4_array':
- $this->_api_encoding = $v;
- break;
- default:
- $this->_error('Set Parameter: Unknown parameter '.$v.' for option '.$k);
- return false;
- }
- break;
- case 'overlong':
- $this->_allow_overlong = ($v) ? true : false;
- break;
- case 'strict':
- $this->_strict_mode = ($v) ? true : false;
- break;
- default:
- $this->_error('Set Parameter: Unknown option '.$k);
- return false;
- }
- }
- return true;
- }
-
- /**
- * Decode a given ACE domain name
- * @param string Domain name (ACE string)
- * [@param string Desired output encoding, see {@link set_parameter}]
- * @return string Decoded Domain name (UTF-8 or UCS-4)
- * @access public
- */
- function decode($input, $one_time_encoding = false)
- {
- // Optionally set
- if ($one_time_encoding) {
- switch ($one_time_encoding) {
- case 'utf8':
- case 'ucs4_string':
- case 'ucs4_array':
- break;
- default:
- $this->_error('Unknown encoding '.$one_time_encoding);
- return false;
- }
- }
- // Make sure to drop any newline characters around
- $input = trim($input);
-
- // Negotiate input and try to determine, whether it is a plain string,
- // an email address or something like a complete URL
- if (strpos($input, '@')) { // Maybe it is an email address
- // No no in strict mode
- if ($this->_strict_mode) {
- $this->_error('Only simple domain name parts can be handled in strict mode');
- return false;
- }
- list ($email_pref, $input) = explode('@', $input, 2);
- $arr = explode('.', $input);
- foreach ($arr as $k => $v) {
- if (preg_match('!^'.preg_quote($this->_punycode_prefix, '!').'!', $v)) {
- $conv = $this->_decode($v);
- if ($conv) $arr[$k] = $conv;
- }
- }
- $input = join('.', $arr);
- $arr = explode('.', $email_pref);
- foreach ($arr as $k => $v) {
- if (preg_match('!^'.preg_quote($this->_punycode_prefix, '!').'!', $v)) {
- $conv = $this->_decode($v);
- if ($conv) $arr[$k] = $conv;
- }
- }
- $email_pref = join('.', $arr);
- $return = $email_pref . '@' . $input;
- } elseif (preg_match('![:\./]!', $input)) { // Or a complete domain name (with or without paths / parameters)
- // No no in strict mode
- if ($this->_strict_mode) {
- $this->_error('Only simple domain name parts can be handled in strict mode');
- return false;
- }
- $parsed = parse_url($input);
- if (isset($parsed['host'])) {
- $arr = explode('.', $parsed['host']);
- foreach ($arr as $k => $v) {
- $conv = $this->_decode($v);
- if ($conv) $arr[$k] = $conv;
- }
- $parsed['host'] = join('.', $arr);
- $return =
- (empty($parsed['scheme']) ? '' : $parsed['scheme'].(strtolower($parsed['scheme']) == 'mailto' ? ':' : '://'))
- .(empty($parsed['user']) ? '' : $parsed['user'].(empty($parsed['pass']) ? '' : ':'.$parsed['pass']).'@')
- .$parsed['host']
- .(empty($parsed['port']) ? '' : ':'.$parsed['port'])
- .(empty($parsed['path']) ? '' : $parsed['path'])
- .(empty($parsed['query']) ? '' : '?'.$parsed['query'])
- .(empty($parsed['fragment']) ? '' : '#'.$parsed['fragment']);
- } else { // parse_url seems to have failed, try without it
- $arr = explode('.', $input);
- foreach ($arr as $k => $v) {
- $conv = $this->_decode($v);
- $arr[$k] = ($conv) ? $conv : $v;
- }
- $return = join('.', $arr);
- }
- } else { // Otherwise we consider it being a pure domain name string
- $return = $this->_decode($input);
- if (!$return) $return = $input;
- }
- // The output is UTF-8 by default, other output formats need conversion here
- // If one time encoding is given, use this, else the objects property
- switch (($one_time_encoding) ? $one_time_encoding : $this->_api_encoding) {
- case 'utf8':
- return $return;
- break;
- case 'ucs4_string':
- return $this->_ucs4_to_ucs4_string($this->_utf8_to_ucs4($return));
- break;
- case 'ucs4_array':
- return $this->_utf8_to_ucs4($return);
- break;
- default:
- $this->_error('Unsupported output format');
- return false;
- }
- }
-
- /**
- * Encode a given UTF-8 domain name
- * @param string Domain name (UTF-8 or UCS-4)
- * [@param string Desired input encoding, see {@link set_parameter}]
- * @return string Encoded Domain name (ACE string)
- * @access public
- */
- function encode($decoded, $one_time_encoding = false)
- {
- // Forcing conversion of input to UCS4 array
- // If one time encoding is given, use this, else the objects property
- switch ($one_time_encoding ? $one_time_encoding : $this->_api_encoding) {
- case 'utf8':
- $decoded = $this->_utf8_to_ucs4($decoded);
- break;
- case 'ucs4_string':
- $decoded = $this->_ucs4_string_to_ucs4($decoded);
- case 'ucs4_array':
- break;
- default:
- $this->_error('Unsupported input format: '.($one_time_encoding ? $one_time_encoding : $this->_api_encoding));
- return false;
- }
-
- // No input, no output, what else did you expect?
- if (empty($decoded)) return '';
-
- // Anchors for iteration
- $last_begin = 0;
- // Output string
- $output = '';
- foreach ($decoded as $k => $v) {
- // Make sure to use just the plain dot
- switch($v) {
- case 0x3002:
- case 0xFF0E:
- case 0xFF61:
- $decoded[$k] = 0x2E;
- // Right, no break here, the above are converted to dots anyway
- // Stumbling across an anchoring character
- case 0x2E:
- case 0x2F:
- case 0x3A:
- case 0x3F:
- case 0x40:
- // Neither email addresses nor URLs allowed in strict mode
- if ($this->_strict_mode) {
- $this->_error('Neither email addresses nor URLs are allowed in strict mode.');
- return false;
- } else {
- // Skip first char
- if ($k) {
- $encoded = '';
- $encoded = $this->_encode(array_slice($decoded, $last_begin, (($k)-$last_begin)));
- if ($encoded) {
- $output .= $encoded;
- } else {
- $output .= $this->_ucs4_to_utf8(array_slice($decoded, $last_begin, (($k)-$last_begin)));
- }
- $output .= chr($decoded[$k]);
- }
- $last_begin = $k + 1;
- }
- }
- }
- // Catch the rest of the string
- if ($last_begin) {
- $inp_len = sizeof($decoded);
- $encoded = '';
- $encoded = $this->_encode(array_slice($decoded, $last_begin, (($inp_len)-$last_begin)));
- if ($encoded) {
- $output .= $encoded;
- } else {
- $output .= $this->_ucs4_to_utf8(array_slice($decoded, $last_begin, (($inp_len)-$last_begin)));
- }
- return $output;
- } else {
- if ($output = $this->_encode($decoded)) {
- return $output;
- } else {
- return $this->_ucs4_to_utf8($decoded);
- }
- }
- }
-
- /**
- * Use this method to get the last error ocurred
- * @param void
- * @return string The last error, that occured
- * @access public
- */
- function get_last_error()
- {
- return $this->_error;
- }
-
- /**
- * The actual decoding algorithm
- * @access private
- */
- function _decode($encoded)
- {
- // We do need to find the Punycode prefix
- if (!preg_match('!^'.preg_quote($this->_punycode_prefix, '!').'!', $encoded)) {
- $this->_error('This is not a punycode string');
- return false;
- }
- $encode_test = preg_replace('!^'.preg_quote($this->_punycode_prefix, '!').'!', '', $encoded);
- // If nothing left after removing the prefix, it is hopeless
- if (!$encode_test) {
- $this->_error('The given encoded string was empty');
- return false;
- }
- // Find last occurence of the delimiter
- $delim_pos = strrpos($encoded, '-');
- if ($delim_pos > strlen($this->_punycode_prefix)) {
- for ($k = strlen($this->_punycode_prefix); $k < $delim_pos; ++$k) {
- $decoded[] = ord($encoded{$k});
- }
- } else {
- $decoded = array();
- }
- $deco_len = count($decoded);
- $enco_len = strlen($encoded);
-
- // Wandering through the strings; init
- $is_first = true;
- $bias = $this->_initial_bias;
- $idx = 0;
- $char = $this->_initial_n;
-
- for ($enco_idx = ($delim_pos) ? ($delim_pos + 1) : 0; $enco_idx < $enco_len; ++$deco_len) {
- for ($old_idx = $idx, $w = 1, $k = $this->_base; 1 ; $k += $this->_base) {
- $digit = $this->_decode_digit($encoded{$enco_idx++});
- $idx += $digit * $w;
- $t = ($k <= $bias) ? $this->_tmin :
- (($k >= $bias + $this->_tmax) ? $this->_tmax : ($k - $bias));
- if ($digit < $t) break;
- $w = (int) ($w * ($this->_base - $t));
- }
- $bias = $this->_adapt($idx - $old_idx, $deco_len + 1, $is_first);
- $is_first = false;
- $char += (int) ($idx / ($deco_len + 1));
- $idx %= ($deco_len + 1);
- if ($deco_len > 0) {
- // Make room for the decoded char
- for ($i = $deco_len; $i > $idx; $i--) {
- $decoded[$i] = $decoded[($i - 1)];
- }
- }
- $decoded[$idx++] = $char;
- }
- return $this->_ucs4_to_utf8($decoded);
- }
-
- /**
- * The actual encoding algorithm
- * @access private
- */
- function _encode($decoded)
- {
- // We cannot encode a domain name containing the Punycode prefix
- $extract = strlen($this->_punycode_prefix);
- $check_pref = $this->_utf8_to_ucs4($this->_punycode_prefix);
- $check_deco = array_slice($decoded, 0, $extract);
-
- if ($check_pref == $check_deco) {
- $this->_error('This is already a punycode string');
- return false;
- }
- // We will not try to encode strings consisting of basic code points only
- $encodable = false;
- foreach ($decoded as $k => $v) {
- if ($v > 0x7a) {
- $encodable = true;
- break;
- }
- }
- if (!$encodable) {
- $this->_error('The given string does not contain encodable chars');
- return false;
- }
-
- // Do NAMEPREP
- $decoded = $this->_nameprep($decoded);
- if (!$decoded || !is_array($decoded)) return false; // NAMEPREP failed
-
- $deco_len = count($decoded);
- if (!$deco_len) return false; // Empty array
-
- $codecount = 0; // How many chars have been consumed
-
- $encoded = '';
- // Copy all basic code points to output
- for ($i = 0; $i < $deco_len; ++$i) {
- $test = $decoded[$i];
- // Will match [-0-9a-zA-Z]
- if ((0x2F < $test && $test < 0x40) || (0x40 < $test && $test < 0x5B)
- || (0x60 < $test && $test <= 0x7B) || (0x2D == $test)) {
- $encoded .= chr($decoded[$i]);
- $codecount++;
- }
- }
- if ($codecount == $deco_len) return $encoded; // All codepoints were basic ones
-
- // Start with the prefix; copy it to output
- $encoded = $this->_punycode_prefix.$encoded;
-
- // If we have basic code points in output, add an hyphen to the end
- if ($codecount) $encoded .= '-';
-
- // Now find and encode all non-basic code points
- $is_first = true;
- $cur_code = $this->_initial_n;
- $bias = $this->_initial_bias;
- $delta = 0;
- while ($codecount < $deco_len) {
- // Find the smallest code point >= the current code point and
- // remember the last ouccrence of it in the input
- for ($i = 0, $next_code = $this->_max_ucs; $i < $deco_len; $i++) {
- if ($decoded[$i] >= $cur_code && $decoded[$i] <= $next_code) {
- $next_code = $decoded[$i];
- }
- }
-
- $delta += ($next_code - $cur_code) * ($codecount + 1);
- $cur_code = $next_code;
-
- // Scan input again and encode all characters whose code point is $cur_code
- for ($i = 0; $i < $deco_len; $i++) {
- if ($decoded[$i] < $cur_code) {
- $delta++;
- } elseif ($decoded[$i] == $cur_code) {
- for ($q = $delta, $k = $this->_base; 1; $k += $this->_base) {
- $t = ($k <= $bias) ? $this->_tmin :
- (($k >= $bias + $this->_tmax) ? $this->_tmax : $k - $bias);
- if ($q < $t) break;
- $encoded .= $this->_encode_digit(intval($t + (($q - $t) % ($this->_base - $t)))); //v0.4.5 Changed from ceil() to intval()
- $q = (int) (($q - $t) / ($this->_base - $t));
- }
- $encoded .= $this->_encode_digit($q);
- $bias = $this->_adapt($delta, $codecount+1, $is_first);
- $codecount++;
- $delta = 0;
- $is_first = false;
- }
- }
- $delta++;
- $cur_code++;
- }
- return $encoded;
- }
-
- /**
- * Adapt the bias according to the current code point and position
- * @access private
- */
- function _adapt($delta, $npoints, $is_first)
- {
- $delta = intval($is_first ? ($delta / $this->_damp) : ($delta / 2));
- $delta += intval($delta / $npoints);
- for ($k = 0; $delta > (($this->_base - $this->_tmin) * $this->_tmax) / 2; $k += $this->_base) {
- $delta = intval($delta / ($this->_base - $this->_tmin));
- }
- return intval($k + ($this->_base - $this->_tmin + 1) * $delta / ($delta + $this->_skew));
- }
-
- /**
- * Encoding a certain digit
- * @access private
- */
- function _encode_digit($d)
- {
- return chr($d + 22 + 75 * ($d < 26));
- }
-
- /**
- * Decode a certain digit
- * @access private
- */
- function _decode_digit($cp)
- {
- $cp = ord($cp);
- return ($cp - 48 < 10) ? $cp - 22 : (($cp - 65 < 26) ? $cp - 65 : (($cp - 97 < 26) ? $cp - 97 : $this->_base));
- }
-
- /**
- * Internal error handling method
- * @access private
- */
- function _error($error = '')
- {
- $this->_error = $error;
- }
-
- /**
- * Do Nameprep according to RFC3491 and RFC3454
- * @param array Unicode Characters
- * @return string Unicode Characters, Nameprep'd
- * @access private
- */
- function _nameprep($input)
- {
- $output = array();
- $error = false;
- //
- // Mapping
- // Walking through the input array, performing the required steps on each of
- // the input chars and putting the result into the output array
- // While mapping required chars we apply the cannonical ordering
- foreach ($input as $v) {
- // Map to nothing == skip that code point
- if (in_array($v, $this->NP['map_nothing'])) continue;
-
- // Try to find prohibited input
- if (in_array($v, $this->NP['prohibit']) || in_array($v, $this->NP['general_prohibited'])) {
- $this->_error('NAMEPREP: Prohibited input U+'.sprintf('%08X', $v));
- return false;
- }
- foreach ($this->NP['prohibit_ranges'] as $range) {
- if ($range[0] <= $v && $v <= $range[1]) {
- $this->_error('NAMEPREP: Prohibited input U+'.sprintf('%08X', $v));
- return false;
- }
- }
- //
- // Hangul syllable decomposition
- if (0xAC00 <= $v && $v <= 0xD7AF) {
- foreach ($this->_hangul_decompose($v) as $out) {
- $output[] = (int) $out;
- }
- // There's a decomposition mapping for that code point
- } elseif (isset($this->NP['replacemaps'][$v])) {
- foreach ($this->_apply_cannonical_ordering($this->NP['replacemaps'][$v]) as $out) {
- $output[] = (int) $out;
- }
- } else {
- $output[] = (int) $v;
- }
- }
- // Before applying any Combining, try to rearrange any Hangul syllables
- $output = $this->_hangul_compose($output);
- //
- // Combine code points
- //
- $last_class = 0;
- $last_starter = 0;
- $out_len = count($output);
- for ($i = 0; $i < $out_len; ++$i) {
- $class = $this->_get_combining_class($output[$i]);
- if ((!$last_class || $last_class > $class) && $class) {
- // Try to match
- $seq_len = $i - $last_starter;
- $out = $this->_combine(array_slice($output, $last_starter, $seq_len));
- // On match: Replace the last starter with the composed character and remove
- // the now redundant non-starter(s)
- if ($out) {
- $output[$last_starter] = $out;
- if (count($out) != $seq_len) {
- for ($j = $i+1; $j < $out_len; ++$j) {
- $output[$j-1] = $output[$j];
- }
- unset($output[$out_len]);
- }
- // Rewind the for loop by one, since there can be more possible compositions
- $i--;
- $out_len--;
- $last_class = ($i == $last_starter) ? 0 : $this->_get_combining_class($output[$i-1]);
- continue;
- }
- }
- // The current class is 0
- if (!$class) $last_starter = $i;
- $last_class = $class;
- }
- return $output;
- }
-
- /**
- * Decomposes a Hangul syllable
- * (see http://www.unicode.org/unicode/reports/tr15/#Hangul
- * @param integer 32bit UCS4 code point
- * @return array Either Hangul Syllable decomposed or original 32bit value as one value array
- * @access private
- */
- function _hangul_decompose($char)
- {
- $sindex = (int) $char - $this->_sbase;
- if ($sindex < 0 || $sindex >= $this->_scount) {
- return array($char);
- }
- $result = array();
- $result[] = (int) $this->_lbase + $sindex / $this->_ncount;
- $result[] = (int) $this->_vbase + ($sindex % $this->_ncount) / $this->_tcount;
- $T = intval($this->_tbase + $sindex % $this->_tcount);
- if ($T != $this->_tbase) $result[] = $T;
- return $result;
- }
- /**
- * Ccomposes a Hangul syllable
- * (see http://www.unicode.org/unicode/reports/tr15/#Hangul
- * @param array Decomposed UCS4 sequence
- * @return array UCS4 sequence with syllables composed
- * @access private
- */
- function _hangul_compose($input)
- {
- $inp_len = count($input);
- if (!$inp_len) return array();
- $result = array();
- $last = (int) $input[0];
- $result[] = $last; // copy first char from input to output
-
- for ($i = 1; $i < $inp_len; ++$i) {
- $char = (int) $input[$i];
- $sindex = $last - $this->_sbase;
- $lindex = $last - $this->_lbase;
- $vindex = $char - $this->_vbase;
- $tindex = $char - $this->_tbase;
- // Find out, whether two current characters are LV and T
- if (0 <= $sindex && $sindex < $this->_scount && ($sindex % $this->_tcount == 0)
- && 0 <= $tindex && $tindex <= $this->_tcount) {
- // create syllable of form LVT
- $last += $tindex;
- $result[(count($result) - 1)] = $last; // reset last
- continue; // discard char
- }
- // Find out, whether two current characters form L and V
- if (0 <= $lindex && $lindex < $this->_lcount && 0 <= $vindex && $vindex < $this->_vcount) {
- // create syllable of form LV
- $last = (int) $this->_sbase + ($lindex * $this->_vcount + $vindex) * $this->_tcount;
- $result[(count($result) - 1)] = $last; // reset last
- continue; // discard char
- }
- // if neither case was true, just add the character
- $last = $char;
- $result[] = $char;
- }
- return $result;
- }
-
- /**
- * Returns the combining class of a certain wide char
- * @param integer Wide char to check (32bit integer)
- * @return integer Combining class if found, else 0
- * @access private
- */
- function _get_combining_class($char)
- {
- return isset($this->NP['norm_combcls'][$char]) ? $this->NP['norm_combcls'][$char] : 0;
- }
-
- /**
- * Apllies the cannonical ordering of a decomposed UCS4 sequence
- * @param array Decomposed UCS4 sequence
- * @return array Ordered USC4 sequence
- * @access private
- */
- function _apply_cannonical_ordering($input)
- {
- $swap = true;
- $size = count($input);
- while ($swap) {
- $swap = false;
- $last = $this->_get_combining_class(intval($input[0]));
- for ($i = 0; $i < $size-1; ++$i) {
- $next = $this->_get_combining_class(intval($input[$i+1]));
- if ($next != 0 && $last > $next) {
- // Move item leftward until it fits
- for ($j = $i + 1; $j > 0; --$j) {
- if ($this->_get_combining_class(intval($input[$j-1])) <= $next) break;
- $t = intval($input[$j]);
- $input[$j] = intval($input[$j-1]);
- $input[$j-1] = $t;
- $swap = true;
- }
- // Reentering the loop looking at the old character again
- $next = $last;
- }
- $last = $next;
- }
- }
- return $input;
- }
-
- /**
- * Do composition of a sequence of starter and non-starter
- * @param array UCS4 Decomposed sequence
- * @return array Ordered USC4 sequence
- * @access private
- */
- function _combine($input)
- {
- $inp_len = count($input);
- foreach ($this->NP['replacemaps'] as $np_src => $np_target) {
- if ($np_target[0] != $input[0]) continue;
- if (count($np_target) != $inp_len) continue;
- $hit = false;
- foreach ($input as $k2 => $v2) {
- if ($v2 == $np_target[$k2]) {
- $hit = true;
- } else {
- $hit = false;
- break;
- }
- }
- if ($hit) return $np_src;
- }
- return false;
- }
-
- /**
- * This converts an UTF-8 encoded string to its UCS-4 representation
- * By talking about UCS-4 "strings" we mean arrays of 32bit integers representing
- * each of the "chars". This is due to PHP not being able to handle strings with
- * bit depth different from 8. This apllies to the reverse method _ucs4_to_utf8(), too.
- * The following UTF-8 encodings are supported:
- * bytes bits representation
- * 1 7 0xxxxxxx
- * 2 11 110xxxxx 10xxxxxx
- * 3 16 1110xxxx 10xxxxxx 10xxxxxx
- * 4 21 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
- * 5 26 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
- * 6 31 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
- * Each x represents a bit that can be used to store character data.
- * The five and six byte sequences are part of Annex D of ISO/IEC 10646-1:2000
- * @access private
- */
- function _utf8_to_ucs4($input)
- {
- $output = array();
- $out_len = 0;
- $inp_len = strlen($input);
- $mode = 'next';
- $test = 'none';
- for ($k = 0; $k < $inp_len; ++$k) {
- $v = ord($input{$k}); // Extract byte from input string
-
- if ($v < 128) { // We found an ASCII char - put into stirng as is
- $output[$out_len] = $v;
- ++$out_len;
- if ('add' == $mode) {
- $this->_error('Conversion from UTF-8 to UCS-4 failed: malformed input at byte '.$k);
- return false;
- }
- continue;
- }
- if ('next' == $mode) { // Try to find the next start byte; determine the width of the Unicode char
- $start_byte = $v;
- $mode = 'add';
- $test = 'range';
- if ($v >> 5 == 6) { // &110xxxxx 10xxxxx
- $next_byte = 0; // Tells, how many times subsequent bitmasks must rotate 6bits to the left
- $v = ($v - 192) << 6;
- } elseif ($v >> 4 == 14) { // &1110xxxx 10xxxxxx 10xxxxxx
- $next_byte = 1;
- $v = ($v - 224) << 12;
- } elseif ($v >> 3 == 30) { // &11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
- $next_byte = 2;
- $v = ($v - 240) << 18;
- } elseif ($v >> 2 == 62) { // &111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
- $next_byte = 3;
- $v = ($v - 248) << 24;
- } elseif ($v >> 1 == 126) { // &1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
- $next_byte = 4;
- $v = ($v - 252) << 30;
- } else {
- $this->_error('This might be UTF-8, but I don\'t understand it at byte '.$k);
- return false;
- }
- if ('add' == $mode) {
- $output[$out_len] = (int) $v;
- ++$out_len;
- continue;
- }
- }
- if ('add' == $mode) {
- if (!$this->_allow_overlong && $test == 'range') {
- $test = 'none';
- if (($v < 0xA0 && $start_byte == 0xE0) || ($v < 0x90 && $start_byte == 0xF0) || ($v > 0x8F && $start_byte == 0xF4)) {
- $this->_error('Bogus UTF-8 character detected (out of legal range) at byte '.$k);
- return false;
- }
- }
- if ($v >> 6 == 2) { // Bit mask must be 10xxxxxx
- $v = ($v - 128) << ($next_byte * 6);
- $output[($out_len - 1)] += $v;
- --$next_byte;
- } else {
- $this->_error('Conversion from UTF-8 to UCS-4 failed: malformed input at byte '.$k);
- return false;
- }
- if ($next_byte < 0) {
- $mode = 'next';
- }
- }
- } // for
- return $output;
- }
-
- /**
- * Convert UCS-4 string into UTF-8 string
- * See _utf8_to_ucs4() for details
- * @access private
- */
- function _ucs4_to_utf8($input)
- {
- $output = '';
- $k = 0;
- foreach ($input as $v) {
- ++$k;
- // $v = ord($v);
- if ($v < 128) { // 7bit are transferred literally
- $output .= chr($v);
- } elseif ($v < (1 << 11)) { // 2 bytes
- $output .= chr(192 + ($v >> 6)) . chr(128 + ($v & 63));
- } elseif ($v < (1 << 16)) { // 3 bytes
- $output .= chr(224 + ($v >> 12)) . chr(128 + (($v >> 6) & 63)) . chr(128 + ($v & 63));
- } elseif ($v < (1 << 21)) { // 4 bytes
- $output .= chr(240 + ($v >> 18)) . chr(128 + (($v >> 12) & 63))
- . chr(128 + (($v >> 6) & 63)) . chr(128 + ($v & 63));
- } elseif ($v < (1 << 26)) { // 5 bytes
- $output .= chr(248 + ($v >> 24)) . chr(128 + (($v >> 18) & 63))
- . chr(128 + (($v >> 12) & 63)) . chr(128 + (($v >> 6) & 63))
- . chr(128 + ($v & 63));
- } elseif ($v < (1 << 31)) { // 6 bytes
- $output .= chr(252 + ($v >> 30)) . chr(128 + (($v >> 24) & 63))
- . chr(128 + (($v >> 18) & 63)) . chr(128 + (($v >> 12) & 63))
- . chr(128 + (($v >> 6) & 63)) . chr(128 + ($v & 63));
- } else {
- $this->_error('Conversion from UCS-4 to UTF-8 failed: malformed input at byte '.$k);
- return false;
- }
- }
- return $output;
- }
-
- /**
- * Convert UCS-4 array into UCS-4 string
- *
- * @access private
- */
- function _ucs4_to_ucs4_string($input)
- {
- $output = '';
- // Take array values and split output to 4 bytes per value
- // The bit mask is 255, which reads &11111111
- foreach ($input as $v) {
- $output .= chr(($v >> 24) & 255).chr(($v >> 16) & 255).chr(($v >> 8) & 255).chr($v & 255);
- }
- return $output;
- }
-
- /**
- * Convert UCS-4 strin into UCS-4 garray
- *
- * @access private
- */
- function _ucs4_string_to_ucs4($input)
- {
- $output = array();
- $inp_len = strlen($input);
- // Input length must be dividable by 4
- if ($inp_len % 4) {
- $this->_error('Input UCS4 string is broken');
- return false;
- }
- // Empty input - return empty output
- if (!$inp_len) return $output;
- for ($i = 0, $out_len = -1; $i < $inp_len; ++$i) {
- // Increment output position every 4 input bytes
- if (!($i % 4)) {
- $out_len++;
- $output[$out_len] = 0;
- }
- $output[$out_len] += ord($input{$i}) << (8 * (3 - ($i % 4) ) );
- }
- return $output;
- }
-}
-
-/**
-* Adapter class for aligning the API of idna_convert with that of Net_IDNA
-* @author Matthias Sommerfeld <mso@phlylabs.de>
-*/
-class Net_IDNA_php4 extends idna_convert
-{
- /**
- * Sets a new option value. Available options and values:
- * [encoding - Use either UTF-8, UCS4 as array or UCS4 as string as input ('utf8' for UTF-8,
- * 'ucs4_string' and 'ucs4_array' respectively for UCS4); The output is always UTF-8]
- * [overlong - Unicode does not allow unnecessarily long encodings of chars,
- * to allow this, set this parameter to true, else to false;
- * default is false.]
- * [strict - true: strict mode, good for registration purposes - Causes errors
- * on failures; false: loose mode, ideal for "wildlife" applications
- * by silently ignoring errors and returning the original input instead
- *
- * @param mixed Parameter to set (string: single parameter; array of Parameter => Value pairs)
- * @param string Value to use (if parameter 1 is a string)
- * @return boolean true on success, false otherwise
- * @access public
- */
- function setParams($option, $param = false)
- {
- return $this->IC->set_parameters($option, $param);
- }
-}
-
-?> \ No newline at end of file
diff --git a/library/simplepie/simplepie.inc b/library/simplepie/simplepie.inc
deleted file mode 100644
index 96ad06678..000000000
--- a/library/simplepie/simplepie.inc
+++ /dev/null
@@ -1,15150 +0,0 @@
-<?php
-/**
- * SimplePie
- *
- * A PHP-Based RSS and Atom Feed Framework.
- * Takes the hard work out of managing a complete RSS/Atom solution.
- *
- * Copyright (c) 2004-2009, Ryan Parman and Geoffrey Sneddon
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification, are
- * permitted provided that the following conditions are met:
- *
- * * Redistributions of source code must retain the above copyright notice, this list of
- * conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright notice, this list
- * of conditions and the following disclaimer in the documentation and/or other materials
- * provided with the distribution.
- *
- * * Neither the name of the SimplePie Team nor the names of its contributors may be used
- * to endorse or promote products derived from this software without specific prior
- * written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
- * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
- * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package SimplePie
- * @version 1.2.1-dev
- * @copyright 2004-2009 Ryan Parman, Geoffrey Sneddon
- * @author Ryan Parman
- * @author Geoffrey Sneddon
- * @link http://simplepie.org/ SimplePie
- * @link http://simplepie.org/support/ Please submit all bug reports and feature requests to the SimplePie forums
- * @license http://www.opensource.org/licenses/bsd-license.php BSD License
- * @todo phpDoc comments
- */
-
-/**
- * SimplePie Name
- */
-define('SIMPLEPIE_NAME', 'SimplePie');
-
-/**
- * SimplePie Version
- */
-define('SIMPLEPIE_VERSION', '1.2.1-dev');
-
-/**
- * SimplePie Build
- * @todo Hardcode for release (there's no need to have to call SimplePie_Misc::parse_date() only every load of simplepie.inc)
- */
-define('SIMPLEPIE_BUILD', gmdate('YmdHis', SimplePie_Misc::parse_date(substr('$Date$', 7, 25)) ? SimplePie_Misc::parse_date(substr('$Date$', 7, 25)) : filemtime(__FILE__)));
-
-/**
- * SimplePie Website URL
- */
-define('SIMPLEPIE_URL', 'http://simplepie.org');
-
-/**
- * SimplePie Useragent
- * @see SimplePie::set_useragent()
- */
-define('SIMPLEPIE_USERAGENT', SIMPLEPIE_NAME . '/' . SIMPLEPIE_VERSION . ' (Feed Parser; ' . SIMPLEPIE_URL . '; Allow like Gecko) Build/' . SIMPLEPIE_BUILD);
-
-/**
- * SimplePie Linkback
- */
-define('SIMPLEPIE_LINKBACK', '<a href="' . SIMPLEPIE_URL . '" title="' . SIMPLEPIE_NAME . ' ' . SIMPLEPIE_VERSION . '">' . SIMPLEPIE_NAME . '</a>');
-
-/**
- * No Autodiscovery
- * @see SimplePie::set_autodiscovery_level()
- */
-define('SIMPLEPIE_LOCATOR_NONE', 0);
-
-/**
- * Feed Link Element Autodiscovery
- * @see SimplePie::set_autodiscovery_level()
- */
-define('SIMPLEPIE_LOCATOR_AUTODISCOVERY', 1);
-
-/**
- * Local Feed Extension Autodiscovery
- * @see SimplePie::set_autodiscovery_level()
- */
-define('SIMPLEPIE_LOCATOR_LOCAL_EXTENSION', 2);
-
-/**
- * Local Feed Body Autodiscovery
- * @see SimplePie::set_autodiscovery_level()
- */
-define('SIMPLEPIE_LOCATOR_LOCAL_BODY', 4);
-
-/**
- * Remote Feed Extension Autodiscovery
- * @see SimplePie::set_autodiscovery_level()
- */
-define('SIMPLEPIE_LOCATOR_REMOTE_EXTENSION', 8);
-
-/**
- * Remote Feed Body Autodiscovery
- * @see SimplePie::set_autodiscovery_level()
- */
-define('SIMPLEPIE_LOCATOR_REMOTE_BODY', 16);
-
-/**
- * All Feed Autodiscovery
- * @see SimplePie::set_autodiscovery_level()
- */
-define('SIMPLEPIE_LOCATOR_ALL', 31);
-
-/**
- * No known feed type
- */
-define('SIMPLEPIE_TYPE_NONE', 0);
-
-/**
- * RSS 0.90
- */
-define('SIMPLEPIE_TYPE_RSS_090', 1);
-
-/**
- * RSS 0.91 (Netscape)
- */
-define('SIMPLEPIE_TYPE_RSS_091_NETSCAPE', 2);
-
-/**
- * RSS 0.91 (Userland)
- */
-define('SIMPLEPIE_TYPE_RSS_091_USERLAND', 4);
-
-/**
- * RSS 0.91 (both Netscape and Userland)
- */
-define('SIMPLEPIE_TYPE_RSS_091', 6);
-
-/**
- * RSS 0.92
- */
-define('SIMPLEPIE_TYPE_RSS_092', 8);
-
-/**
- * RSS 0.93
- */
-define('SIMPLEPIE_TYPE_RSS_093', 16);
-
-/**
- * RSS 0.94
- */
-define('SIMPLEPIE_TYPE_RSS_094', 32);
-
-/**
- * RSS 1.0
- */
-define('SIMPLEPIE_TYPE_RSS_10', 64);
-
-/**
- * RSS 2.0
- */
-define('SIMPLEPIE_TYPE_RSS_20', 128);
-
-/**
- * RDF-based RSS
- */
-define('SIMPLEPIE_TYPE_RSS_RDF', 65);
-
-/**
- * Non-RDF-based RSS (truly intended as syndication format)
- */
-define('SIMPLEPIE_TYPE_RSS_SYNDICATION', 190);
-
-/**
- * All RSS
- */
-define('SIMPLEPIE_TYPE_RSS_ALL', 255);
-
-/**
- * Atom 0.3
- */
-define('SIMPLEPIE_TYPE_ATOM_03', 256);
-
-/**
- * Atom 1.0
- */
-define('SIMPLEPIE_TYPE_ATOM_10', 512);
-
-/**
- * All Atom
- */
-define('SIMPLEPIE_TYPE_ATOM_ALL', 768);
-
-/**
- * All feed types
- */
-define('SIMPLEPIE_TYPE_ALL', 1023);
-
-/**
- * No construct
- */
-define('SIMPLEPIE_CONSTRUCT_NONE', 0);
-
-/**
- * Text construct
- */
-define('SIMPLEPIE_CONSTRUCT_TEXT', 1);
-
-/**
- * HTML construct
- */
-define('SIMPLEPIE_CONSTRUCT_HTML', 2);
-
-/**
- * XHTML construct
- */
-define('SIMPLEPIE_CONSTRUCT_XHTML', 4);
-
-/**
- * base64-encoded construct
- */
-define('SIMPLEPIE_CONSTRUCT_BASE64', 8);
-
-/**
- * IRI construct
- */
-define('SIMPLEPIE_CONSTRUCT_IRI', 16);
-
-/**
- * A construct that might be HTML
- */
-define('SIMPLEPIE_CONSTRUCT_MAYBE_HTML', 32);
-
-/**
- * All constructs
- */
-define('SIMPLEPIE_CONSTRUCT_ALL', 63);
-
-/**
- * Don't change case
- */
-define('SIMPLEPIE_SAME_CASE', 1);
-
-/**
- * Change to lowercase
- */
-define('SIMPLEPIE_LOWERCASE', 2);
-
-/**
- * Change to uppercase
- */
-define('SIMPLEPIE_UPPERCASE', 4);
-
-/**
- * PCRE for HTML attributes
- */
-define('SIMPLEPIE_PCRE_HTML_ATTRIBUTE', '((?:[\x09\x0A\x0B\x0C\x0D\x20]+[^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3E][^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3D\x3E]*(?:[\x09\x0A\x0B\x0C\x0D\x20]*=[\x09\x0A\x0B\x0C\x0D\x20]*(?:"(?:[^"]*)"|\'(?:[^\']*)\'|(?:[^\x09\x0A\x0B\x0C\x0D\x20\x22\x27\x3E][^\x09\x0A\x0B\x0C\x0D\x20\x3E]*)?))?)*)[\x09\x0A\x0B\x0C\x0D\x20]*');
-
-/**
- * PCRE for XML attributes
- */
-define('SIMPLEPIE_PCRE_XML_ATTRIBUTE', '((?:\s+(?:(?:[^\s:]+:)?[^\s:]+)\s*=\s*(?:"(?:[^"]*)"|\'(?:[^\']*)\'))*)\s*');
-
-/**
- * XML Namespace
- */
-define('SIMPLEPIE_NAMESPACE_XML', 'http://www.w3.org/XML/1998/namespace');
-
-/**
- * Atom 1.0 Namespace
- */
-define('SIMPLEPIE_NAMESPACE_ATOM_10', 'http://www.w3.org/2005/Atom');
-
-/**
- * Atom 0.3 Namespace
- */
-define('SIMPLEPIE_NAMESPACE_ATOM_03', 'http://purl.org/atom/ns#');
-
-/**
- * RDF Namespace
- */
-define('SIMPLEPIE_NAMESPACE_RDF', 'http://www.w3.org/1999/02/22-rdf-syntax-ns#');
-
-/**
- * RSS 0.90 Namespace
- */
-define('SIMPLEPIE_NAMESPACE_RSS_090', 'http://my.netscape.com/rdf/simple/0.9/');
-
-/**
- * RSS 1.0 Namespace
- */
-define('SIMPLEPIE_NAMESPACE_RSS_10', 'http://purl.org/rss/1.0/');
-
-/**
- * RSS 1.0 Content Module Namespace
- */
-define('SIMPLEPIE_NAMESPACE_RSS_10_MODULES_CONTENT', 'http://purl.org/rss/1.0/modules/content/');
-
-/**
- * RSS 2.0 Namespace
- * (Stupid, I know, but I'm certain it will confuse people less with support.)
- */
-define('SIMPLEPIE_NAMESPACE_RSS_20', '');
-
-/**
- * DC 1.0 Namespace
- */
-define('SIMPLEPIE_NAMESPACE_DC_10', 'http://purl.org/dc/elements/1.0/');
-
-/**
- * DC 1.1 Namespace
- */
-define('SIMPLEPIE_NAMESPACE_DC_11', 'http://purl.org/dc/elements/1.1/');
-
-/**
- * W3C Basic Geo (WGS84 lat/long) Vocabulary Namespace
- */
-define('SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO', 'http://www.w3.org/2003/01/geo/wgs84_pos#');
-
-/**
- * GeoRSS Namespace
- */
-define('SIMPLEPIE_NAMESPACE_GEORSS', 'http://www.georss.org/georss');
-
-/**
- * Media RSS Namespace
- */
-define('SIMPLEPIE_NAMESPACE_MEDIARSS', 'http://search.yahoo.com/mrss/');
-
-/**
- * Wrong Media RSS Namespace
- */
-define('SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG', 'http://search.yahoo.com/mrss');
-
-/**
- * iTunes RSS Namespace
- */
-define('SIMPLEPIE_NAMESPACE_ITUNES', 'http://www.itunes.com/dtds/podcast-1.0.dtd');
-
-/**
- * XHTML Namespace
- */
-define('SIMPLEPIE_NAMESPACE_XHTML', 'http://www.w3.org/1999/xhtml');
-
-/**
- * IANA Link Relations Registry
- */
-define('SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY', 'http://www.iana.org/assignments/relation/');
-
-/**
- * Whether we're running on PHP5
- */
-define('SIMPLEPIE_PHP5', version_compare(PHP_VERSION, '5.0.0', '>='));
-
-/**
- * No file source
- */
-define('SIMPLEPIE_FILE_SOURCE_NONE', 0);
-
-/**
- * Remote file source
- */
-define('SIMPLEPIE_FILE_SOURCE_REMOTE', 1);
-
-/**
- * Local file source
- */
-define('SIMPLEPIE_FILE_SOURCE_LOCAL', 2);
-
-/**
- * fsockopen() file source
- */
-define('SIMPLEPIE_FILE_SOURCE_FSOCKOPEN', 4);
-
-/**
- * cURL file source
- */
-define('SIMPLEPIE_FILE_SOURCE_CURL', 8);
-
-/**
- * file_get_contents() file source
- */
-define('SIMPLEPIE_FILE_SOURCE_FILE_GET_CONTENTS', 16);
-
-/**
- * SimplePie
- *
- * @package SimplePie
- */
-class SimplePie
-{
- /**
- * @var array Raw data
- * @access private
- */
- var $data = array();
-
- /**
- * @var mixed Error string
- * @access private
- */
- var $error;
-
- /**
- * @var object Instance of SimplePie_Sanitize (or other class)
- * @see SimplePie::set_sanitize_class()
- * @access private
- */
- var $sanitize;
-
- /**
- * @var string SimplePie Useragent
- * @see SimplePie::set_useragent()
- * @access private
- */
- var $useragent = SIMPLEPIE_USERAGENT;
-
- /**
- * @var string Feed URL
- * @see SimplePie::set_feed_url()
- * @access private
- */
- var $feed_url;
-
- /**
- * @var object Instance of SimplePie_File to use as a feed
- * @see SimplePie::set_file()
- * @access private
- */
- var $file;
-
- /**
- * @var string Raw feed data
- * @see SimplePie::set_raw_data()
- * @access private
- */
- var $raw_data;
-
- /**
- * @var int Timeout for fetching remote files
- * @see SimplePie::set_timeout()
- * @access private
- */
- var $timeout = 10;
-
- /**
- * @var bool Forces fsockopen() to be used for remote files instead
- * of cURL, even if a new enough version is installed
- * @see SimplePie::force_fsockopen()
- * @access private
- */
- var $force_fsockopen = false;
-
- /**
- * @var bool Force the given data/URL to be treated as a feed no matter what
- * it appears like
- * @see SimplePie::force_feed()
- * @access private
- */
- var $force_feed = false;
-
- /**
- * @var bool Enable/Disable XML dump
- * @see SimplePie::enable_xml_dump()
- * @access private
- */
- var $xml_dump = false;
-
- /**
- * @var bool Enable/Disable Caching
- * @see SimplePie::enable_cache()
- * @access private
- */
- var $cache = true;
-
- /**
- * @var int Cache duration (in seconds)
- * @see SimplePie::set_cache_duration()
- * @access private
- */
- var $cache_duration = 3600;
-
- /**
- * @var int Auto-discovery cache duration (in seconds)
- * @see SimplePie::set_autodiscovery_cache_duration()
- * @access private
- */
- var $autodiscovery_cache_duration = 604800; // 7 Days.
-
- /**
- * @var string Cache location (relative to executing script)
- * @see SimplePie::set_cache_location()
- * @access private
- */
- var $cache_location = './cache';
-
- /**
- * @var string Function that creates the cache filename
- * @see SimplePie::set_cache_name_function()
- * @access private
- */
- var $cache_name_function = 'md5';
-
- /**
- * @var bool Reorder feed by date descending
- * @see SimplePie::enable_order_by_date()
- * @access private
- */
- var $order_by_date = true;
-
- /**
- * @var mixed Force input encoding to be set to the follow value
- * (false, or anything type-cast to false, disables this feature)
- * @see SimplePie::set_input_encoding()
- * @access private
- */
- var $input_encoding = false;
-
- /**
- * @var int Feed Autodiscovery Level
- * @see SimplePie::set_autodiscovery_level()
- * @access private
- */
- var $autodiscovery = SIMPLEPIE_LOCATOR_ALL;
-
- /**
- * @var string Class used for caching feeds
- * @see SimplePie::set_cache_class()
- * @access private
- */
- var $cache_class = 'SimplePie_Cache';
-
- /**
- * @var string Class used for locating feeds
- * @see SimplePie::set_locator_class()
- * @access private
- */
- var $locator_class = 'SimplePie_Locator';
-
- /**
- * @var string Class used for parsing feeds
- * @see SimplePie::set_parser_class()
- * @access private
- */
- var $parser_class = 'SimplePie_Parser';
-
- /**
- * @var string Class used for fetching feeds
- * @see SimplePie::set_file_class()
- * @access private
- */
- var $file_class = 'SimplePie_File';
-
- /**
- * @var string Class used for items
- * @see SimplePie::set_item_class()
- * @access private
- */
- var $item_class = 'SimplePie_Item';
-
- /**
- * @var string Class used for authors
- * @see SimplePie::set_author_class()
- * @access private
- */
- var $author_class = 'SimplePie_Author';
-
- /**
- * @var string Class used for categories
- * @see SimplePie::set_category_class()
- * @access private
- */
- var $category_class = 'SimplePie_Category';
-
- /**
- * @var string Class used for enclosures
- * @see SimplePie::set_enclosures_class()
- * @access private
- */
- var $enclosure_class = 'SimplePie_Enclosure';
-
- /**
- * @var string Class used for Media RSS <media:text> captions
- * @see SimplePie::set_caption_class()
- * @access private
- */
- var $caption_class = 'SimplePie_Caption';
-
- /**
- * @var string Class used for Media RSS <media:copyright>
- * @see SimplePie::set_copyright_class()
- * @access private
- */
- var $copyright_class = 'SimplePie_Copyright';
-
- /**
- * @var string Class used for Media RSS <media:credit>
- * @see SimplePie::set_credit_class()
- * @access private
- */
- var $credit_class = 'SimplePie_Credit';
-
- /**
- * @var string Class used for Media RSS <media:rating>
- * @see SimplePie::set_rating_class()
- * @access private
- */
- var $rating_class = 'SimplePie_Rating';
-
- /**
- * @var string Class used for Media RSS <media:restriction>
- * @see SimplePie::set_restriction_class()
- * @access private
- */
- var $restriction_class = 'SimplePie_Restriction';
-
- /**
- * @var string Class used for content-type sniffing
- * @see SimplePie::set_content_type_sniffer_class()
- * @access private
- */
- var $content_type_sniffer_class = 'SimplePie_Content_Type_Sniffer';
-
- /**
- * @var string Class used for item sources.
- * @see SimplePie::set_source_class()
- * @access private
- */
- var $source_class = 'SimplePie_Source';
-
- /**
- * @var mixed Set javascript query string parameter (false, or
- * anything type-cast to false, disables this feature)
- * @see SimplePie::set_javascript()
- * @access private
- */
- var $javascript = 'js';
-
- /**
- * @var int Maximum number of feeds to check with autodiscovery
- * @see SimplePie::set_max_checked_feeds()
- * @access private
- */
- var $max_checked_feeds = 10;
-
- /**
- * @var array All the feeds found during the autodiscovery process
- * @see SimplePie::get_all_discovered_feeds()
- * @access private
- */
- var $all_discovered_feeds = array();
-
- /**
- * @var string Web-accessible path to the handler_favicon.php file.
- * @see SimplePie::set_favicon_handler()
- * @access private
- */
- var $favicon_handler = '';
-
- /**
- * @var string Web-accessible path to the handler_image.php file.
- * @see SimplePie::set_image_handler()
- * @access private
- */
- var $image_handler = '';
-
- /**
- * @var array Stores the URLs when multiple feeds are being initialized.
- * @see SimplePie::set_feed_url()
- * @access private
- */
- var $multifeed_url = array();
-
- /**
- * @var array Stores SimplePie objects when multiple feeds initialized.
- * @access private
- */
- var $multifeed_objects = array();
-
- /**
- * @var array Stores the get_object_vars() array for use with multifeeds.
- * @see SimplePie::set_feed_url()
- * @access private
- */
- var $config_settings = null;
-
- /**
- * @var integer Stores the number of items to return per-feed with multifeeds.
- * @see SimplePie::set_item_limit()
- * @access private
- */
- var $item_limit = 0;
-
- /**
- * @var array Stores the default attributes to be stripped by strip_attributes().
- * @see SimplePie::strip_attributes()
- * @access private
- */
- var $strip_attributes = array('bgsound', 'class', 'expr', 'id', 'style', 'onclick', 'onerror', 'onfinish', 'onmouseover', 'onmouseout', 'onfocus', 'onblur', 'lowsrc', 'dynsrc');
-
- /**
- * @var array Stores the default tags to be stripped by strip_htmltags().
- * @see SimplePie::strip_htmltags()
- * @access private
- */
- var $strip_htmltags = array('base', 'blink', 'body', 'doctype', 'embed', 'font', 'form', 'frame', 'frameset', 'html', 'input', 'marquee', 'meta', 'noscript', 'object', 'param', 'script', 'style');
-
- /**
- * The SimplePie class contains feed level data and options
- *
- * There are two ways that you can create a new SimplePie object. The first
- * is by passing a feed URL as a parameter to the SimplePie constructor
- * (as well as optionally setting the cache location and cache expiry). This
- * will initialise the whole feed with all of the default settings, and you
- * can begin accessing methods and properties immediately.
- *
- * The second way is to create the SimplePie object with no parameters
- * at all. This will enable you to set configuration options. After setting
- * them, you must initialise the feed using $feed->init(). At that point the
- * object's methods and properties will be available to you. This format is
- * what is used throughout this documentation.
- *
- * @access public
- * @since 1.0 Preview Release
- * @param string $feed_url This is the URL you want to parse.
- * @param string $cache_location This is where you want the cache to be stored.
- * @param int $cache_duration This is the number of seconds that you want to store the cache file for.
- */
- function SimplePie($feed_url = null, $cache_location = null, $cache_duration = null)
- {
- // Other objects, instances created here so we can set options on them
- $this->sanitize = new SimplePie_Sanitize;
-
- // Set options if they're passed to the constructor
- if ($cache_location !== null)
- {
- $this->set_cache_location($cache_location);
- }
-
- if ($cache_duration !== null)
- {
- $this->set_cache_duration($cache_duration);
- }
-
- // Only init the script if we're passed a feed URL
- if ($feed_url !== null)
- {
- $this->set_feed_url($feed_url);
- $this->init();
- }
- }
-
- /**
- * Used for converting object to a string
- */
- function __toString()
- {
- return md5(serialize($this->data));
- }
-
- /**
- * Remove items that link back to this before destroying this object
- */
- function __destruct()
- {
- if ((version_compare(PHP_VERSION, '5.3', '<') || !gc_enabled()) && !ini_get('zend.ze1_compatibility_mode'))
- {
- if (!empty($this->data['items']))
- {
- foreach ($this->data['items'] as $item)
- {
- $item->__destruct();
- }
- unset($item, $this->data['items']);
- }
- if (!empty($this->data['ordered_items']))
- {
- foreach ($this->data['ordered_items'] as $item)
- {
- $item->__destruct();
- }
- unset($item, $this->data['ordered_items']);
- }
- }
- }
-
- /**
- * Force the given data/URL to be treated as a feed no matter what it
- * appears like
- *
- * @access public
- * @since 1.1
- * @param bool $enable Force the given data/URL to be treated as a feed
- */
- function force_feed($enable = false)
- {
- $this->force_feed = (bool) $enable;
- }
-
- /**
- * This is the URL of the feed you want to parse.
- *
- * This allows you to enter the URL of the feed you want to parse, or the
- * website you want to try to use auto-discovery on. This takes priority
- * over any set raw data.
- *
- * You can set multiple feeds to mash together by passing an array instead
- * of a string for the $url. Remember that with each additional feed comes
- * additional processing and resources.
- *
- * @access public
- * @since 1.0 Preview Release
- * @param mixed $url This is the URL (or array of URLs) that you want to parse.
- * @see SimplePie::set_raw_data()
- */
- function set_feed_url($url)
- {
- if (is_array($url))
- {
- $this->multifeed_url = array();
- foreach ($url as $value)
- {
- $this->multifeed_url[] = SimplePie_Misc::fix_protocol($value, 1);
- }
- }
- else
- {
- $this->feed_url = SimplePie_Misc::fix_protocol($url, 1);
- }
- }
-
- /**
- * Provides an instance of SimplePie_File to use as a feed
- *
- * @access public
- * @param object &$file Instance of SimplePie_File (or subclass)
- * @return bool True on success, false on failure
- */
- function set_file(&$file)
- {
- if (is_a($file, 'SimplePie_File'))
- {
- $this->feed_url = $file->url;
- $this->file =& $file;
- return true;
- }
- return false;
- }
-
- /**
- * Allows you to use a string of RSS/Atom data instead of a remote feed.
- *
- * If you have a feed available as a string in PHP, you can tell SimplePie
- * to parse that data string instead of a remote feed. Any set feed URL
- * takes precedence.
- *
- * @access public
- * @since 1.0 Beta 3
- * @param string $data RSS or Atom data as a string.
- * @see SimplePie::set_feed_url()
- */
- function set_raw_data($data)
- {
- $this->raw_data = $data;
- }
-
- /**
- * Allows you to override the default timeout for fetching remote feeds.
- *
- * This allows you to change the maximum time the feed's server to respond
- * and send the feed back.
- *
- * @access public
- * @since 1.0 Beta 3
- * @param int $timeout The maximum number of seconds to spend waiting to retrieve a feed.
- */
- function set_timeout($timeout = 10)
- {
- $this->timeout = (int) $timeout;
- }
-
- /**
- * Forces SimplePie to use fsockopen() instead of the preferred cURL
- * functions.
- *
- * @access public
- * @since 1.0 Beta 3
- * @param bool $enable Force fsockopen() to be used
- */
- function force_fsockopen($enable = false)
- {
- $this->force_fsockopen = (bool) $enable;
- }
-
- /**
- * Outputs the raw XML content of the feed, after it has gone through
- * SimplePie's filters.
- *
- * Used only for debugging, this function will output the XML content as
- * text/xml. When SimplePie reads in a feed, it does a bit of cleaning up
- * before trying to parse it. Many parts of the feed are re-written in
- * memory, and in the end, you have a parsable feed. XML dump shows you the
- * actual XML that SimplePie tries to parse, which may or may not be very
- * different from the original feed.
- *
- * @access public
- * @since 1.0 Preview Release
- * @param bool $enable Enable XML dump
- */
- function enable_xml_dump($enable = false)
- {
- $this->xml_dump = (bool) $enable;
- }
-
- /**
- * Enables/disables caching in SimplePie.
- *
- * This option allows you to disable caching all-together in SimplePie.
- * However, disabling the cache can lead to longer load times.
- *
- * @access public
- * @since 1.0 Preview Release
- * @param bool $enable Enable caching
- */
- function enable_cache($enable = true)
- {
- $this->cache = (bool) $enable;
- }
-
- /**
- * Set the length of time (in seconds) that the contents of a feed
- * will be cached.
- *
- * @access public
- * @param int $seconds The feed content cache duration.
- */
- function set_cache_duration($seconds = 3600)
- {
- $this->cache_duration = (int) $seconds;
- }
-
- /**
- * Set the length of time (in seconds) that the autodiscovered feed
- * URL will be cached.
- *
- * @access public
- * @param int $seconds The autodiscovered feed URL cache duration.
- */
- function set_autodiscovery_cache_duration($seconds = 604800)
- {
- $this->autodiscovery_cache_duration = (int) $seconds;
- }
-
- /**
- * Set the file system location where the cached files should be stored.
- *
- * @access public
- * @param string $location The file system location.
- */
- function set_cache_location($location = './cache')
- {
- $this->cache_location = (string) $location;
- }
-
- /**
- * Determines whether feed items should be sorted into reverse chronological order.
- *
- * @access public
- * @param bool $enable Sort as reverse chronological order.
- */
- function enable_order_by_date($enable = true)
- {
- $this->order_by_date = (bool) $enable;
- }
-
- /**
- * Allows you to override the character encoding reported by the feed.
- *
- * @access public
- * @param string $encoding Character encoding.
- */
- function set_input_encoding($encoding = false)
- {
- if ($encoding)
- {
- $this->input_encoding = (string) $encoding;
- }
- else
- {
- $this->input_encoding = false;
- }
- }
-
- /**
- * Set how much feed autodiscovery to do
- *
- * @access public
- * @see SIMPLEPIE_LOCATOR_NONE
- * @see SIMPLEPIE_LOCATOR_AUTODISCOVERY
- * @see SIMPLEPIE_LOCATOR_LOCAL_EXTENSION
- * @see SIMPLEPIE_LOCATOR_LOCAL_BODY
- * @see SIMPLEPIE_LOCATOR_REMOTE_EXTENSION
- * @see SIMPLEPIE_LOCATOR_REMOTE_BODY
- * @see SIMPLEPIE_LOCATOR_ALL
- * @param int $level Feed Autodiscovery Level (level can be a
- * combination of the above constants, see bitwise OR operator)
- */
- function set_autodiscovery_level($level = SIMPLEPIE_LOCATOR_ALL)
- {
- $this->autodiscovery = (int) $level;
- }
-
- /**
- * Allows you to change which class SimplePie uses for caching.
- * Useful when you are overloading or extending SimplePie's default classes.
- *
- * @access public
- * @param string $class Name of custom class.
- * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
- * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
- */
- function set_cache_class($class = 'SimplePie_Cache')
- {
- if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Cache'))
- {
- $this->cache_class = $class;
- return true;
- }
- return false;
- }
-
- /**
- * Allows you to change which class SimplePie uses for auto-discovery.
- * Useful when you are overloading or extending SimplePie's default classes.
- *
- * @access public
- * @param string $class Name of custom class.
- * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
- * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
- */
- function set_locator_class($class = 'SimplePie_Locator')
- {
- if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Locator'))
- {
- $this->locator_class = $class;
- return true;
- }
- return false;
- }
-
- /**
- * Allows you to change which class SimplePie uses for XML parsing.
- * Useful when you are overloading or extending SimplePie's default classes.
- *
- * @access public
- * @param string $class Name of custom class.
- * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
- * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
- */
- function set_parser_class($class = 'SimplePie_Parser')
- {
- if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Parser'))
- {
- $this->parser_class = $class;
- return true;
- }
- return false;
- }
-
- /**
- * Allows you to change which class SimplePie uses for remote file fetching.
- * Useful when you are overloading or extending SimplePie's default classes.
- *
- * @access public
- * @param string $class Name of custom class.
- * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
- * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
- */
- function set_file_class($class = 'SimplePie_File')
- {
- if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_File'))
- {
- $this->file_class = $class;
- return true;
- }
- return false;
- }
-
- /**
- * Allows you to change which class SimplePie uses for data sanitization.
- * Useful when you are overloading or extending SimplePie's default classes.
- *
- * @access public
- * @param string $class Name of custom class.
- * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
- * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
- */
- function set_sanitize_class($class = 'SimplePie_Sanitize')
- {
- if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Sanitize'))
- {
- $this->sanitize = new $class;
- return true;
- }
- return false;
- }
-
- /**
- * Allows you to change which class SimplePie uses for handling feed items.
- * Useful when you are overloading or extending SimplePie's default classes.
- *
- * @access public
- * @param string $class Name of custom class.
- * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
- * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
- */
- function set_item_class($class = 'SimplePie_Item')
- {
- if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Item'))
- {
- $this->item_class = $class;
- return true;
- }
- return false;
- }
-
- /**
- * Allows you to change which class SimplePie uses for handling author data.
- * Useful when you are overloading or extending SimplePie's default classes.
- *
- * @access public
- * @param string $class Name of custom class.
- * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
- * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
- */
- function set_author_class($class = 'SimplePie_Author')
- {
- if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Author'))
- {
- $this->author_class = $class;
- return true;
- }
- return false;
- }
-
- /**
- * Allows you to change which class SimplePie uses for handling category data.
- * Useful when you are overloading or extending SimplePie's default classes.
- *
- * @access public
- * @param string $class Name of custom class.
- * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
- * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
- */
- function set_category_class($class = 'SimplePie_Category')
- {
- if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Category'))
- {
- $this->category_class = $class;
- return true;
- }
- return false;
- }
-
- /**
- * Allows you to change which class SimplePie uses for feed enclosures.
- * Useful when you are overloading or extending SimplePie's default classes.
- *
- * @access public
- * @param string $class Name of custom class.
- * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
- * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
- */
- function set_enclosure_class($class = 'SimplePie_Enclosure')
- {
- if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Enclosure'))
- {
- $this->enclosure_class = $class;
- return true;
- }
- return false;
- }
-
- /**
- * Allows you to change which class SimplePie uses for <media:text> captions
- * Useful when you are overloading or extending SimplePie's default classes.
- *
- * @access public
- * @param string $class Name of custom class.
- * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
- * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
- */
- function set_caption_class($class = 'SimplePie_Caption')
- {
- if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Caption'))
- {
- $this->caption_class = $class;
- return true;
- }
- return false;
- }
-
- /**
- * Allows you to change which class SimplePie uses for <media:copyright>
- * Useful when you are overloading or extending SimplePie's default classes.
- *
- * @access public
- * @param string $class Name of custom class.
- * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
- * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
- */
- function set_copyright_class($class = 'SimplePie_Copyright')
- {
- if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Copyright'))
- {
- $this->copyright_class = $class;
- return true;
- }
- return false;
- }
-
- /**
- * Allows you to change which class SimplePie uses for <media:credit>
- * Useful when you are overloading or extending SimplePie's default classes.
- *
- * @access public
- * @param string $class Name of custom class.
- * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
- * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
- */
- function set_credit_class($class = 'SimplePie_Credit')
- {
- if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Credit'))
- {
- $this->credit_class = $class;
- return true;
- }
- return false;
- }
-
- /**
- * Allows you to change which class SimplePie uses for <media:rating>
- * Useful when you are overloading or extending SimplePie's default classes.
- *
- * @access public
- * @param string $class Name of custom class.
- * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
- * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
- */
- function set_rating_class($class = 'SimplePie_Rating')
- {
- if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Rating'))
- {
- $this->rating_class = $class;
- return true;
- }
- return false;
- }
-
- /**
- * Allows you to change which class SimplePie uses for <media:restriction>
- * Useful when you are overloading or extending SimplePie's default classes.
- *
- * @access public
- * @param string $class Name of custom class.
- * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
- * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
- */
- function set_restriction_class($class = 'SimplePie_Restriction')
- {
- if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Restriction'))
- {
- $this->restriction_class = $class;
- return true;
- }
- return false;
- }
-
- /**
- * Allows you to change which class SimplePie uses for content-type sniffing.
- * Useful when you are overloading or extending SimplePie's default classes.
- *
- * @access public
- * @param string $class Name of custom class.
- * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
- * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
- */
- function set_content_type_sniffer_class($class = 'SimplePie_Content_Type_Sniffer')
- {
- if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Content_Type_Sniffer'))
- {
- $this->content_type_sniffer_class = $class;
- return true;
- }
- return false;
- }
-
- /**
- * Allows you to change which class SimplePie uses item sources.
- * Useful when you are overloading or extending SimplePie's default classes.
- *
- * @access public
- * @param string $class Name of custom class.
- * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
- * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
- */
- function set_source_class($class = 'SimplePie_Source')
- {
- if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Source'))
- {
- $this->source_class = $class;
- return true;
- }
- return false;
- }
-
- /**
- * Allows you to override the default user agent string.
- *
- * @access public
- * @param string $ua New user agent string.
- */
- function set_useragent($ua = SIMPLEPIE_USERAGENT)
- {
- $this->useragent = (string) $ua;
- }
-
- /**
- * Set callback function to create cache filename with
- *
- * @access public
- * @param mixed $function Callback function
- */
- function set_cache_name_function($function = 'md5')
- {
- if (is_callable($function))
- {
- $this->cache_name_function = $function;
- }
- }
-
- /**
- * Set javascript query string parameter
- *
- * @access public
- * @param mixed $get Javascript query string parameter
- */
- function set_javascript($get = 'js')
- {
- if ($get)
- {
- $this->javascript = (string) $get;
- }
- else
- {
- $this->javascript = false;
- }
- }
-
- /**
- * Set options to make SP as fast as possible. Forgoes a
- * substantial amount of data sanitization in favor of speed.
- *
- * @access public
- * @param bool $set Whether to set them or not
- */
- function set_stupidly_fast($set = false)
- {
- if ($set)
- {
- $this->enable_order_by_date(false);
- $this->remove_div(false);
- $this->strip_comments(false);
- $this->strip_htmltags(false);
- $this->strip_attributes(false);
- $this->set_image_handler(false);
- }
- }
-
- /**
- * Set maximum number of feeds to check with autodiscovery
- *
- * @access public
- * @param int $max Maximum number of feeds to check
- */
- function set_max_checked_feeds($max = 10)
- {
- $this->max_checked_feeds = (int) $max;
- }
-
- function remove_div($enable = true)
- {
- $this->sanitize->remove_div($enable);
- }
-
- function strip_htmltags($tags = '', $encode = null)
- {
- if ($tags === '')
- {
- $tags = $this->strip_htmltags;
- }
- $this->sanitize->strip_htmltags($tags);
- if ($encode !== null)
- {
- $this->sanitize->encode_instead_of_strip($tags);
- }
- }
-
- function encode_instead_of_strip($enable = true)
- {
- $this->sanitize->encode_instead_of_strip($enable);
- }
-
- function strip_attributes($attribs = '')
- {
- if ($attribs === '')
- {
- $attribs = $this->strip_attributes;
- }
- $this->sanitize->strip_attributes($attribs);
- }
-
- function set_output_encoding($encoding = 'UTF-8')
- {
- $this->sanitize->set_output_encoding($encoding);
- }
-
- function strip_comments($strip = false)
- {
- $this->sanitize->strip_comments($strip);
- }
-
- /**
- * Set element/attribute key/value pairs of HTML attributes
- * containing URLs that need to be resolved relative to the feed
- *
- * @access public
- * @since 1.0
- * @param array $element_attribute Element/attribute key/value pairs
- */
- function set_url_replacements($element_attribute = array('a' => 'href', 'area' => 'href', 'blockquote' => 'cite', 'del' => 'cite', 'form' => 'action', 'img' => array('longdesc', 'src'), 'input' => 'src', 'ins' => 'cite', 'q' => 'cite'))
- {
- $this->sanitize->set_url_replacements($element_attribute);
- }
-
- /**
- * Set the handler to enable the display of cached favicons.
- *
- * @access public
- * @param str $page Web-accessible path to the handler_favicon.php file.
- * @param str $qs The query string that the value should be passed to.
- */
- function set_favicon_handler($page = false, $qs = 'i')
- {
- if ($page !== false)
- {
- $this->favicon_handler = $page . '?' . $qs . '=';
- }
- else
- {
- $this->favicon_handler = '';
- }
- }
-
- /**
- * Set the handler to enable the display of cached images.
- *
- * @access public
- * @param str $page Web-accessible path to the handler_image.php file.
- * @param str $qs The query string that the value should be passed to.
- */
- function set_image_handler($page = false, $qs = 'i')
- {
- if ($page !== false)
- {
- $this->sanitize->set_image_handler($page . '?' . $qs . '=');
- }
- else
- {
- $this->image_handler = '';
- }
- }
-
- /**
- * Set the limit for items returned per-feed with multifeeds.
- *
- * @access public
- * @param integer $limit The maximum number of items to return.
- */
- function set_item_limit($limit = 0)
- {
- $this->item_limit = (int) $limit;
- }
-
- function init()
- {
- // Check absolute bare minimum requirements.
- if ((function_exists('version_compare') && version_compare(PHP_VERSION, '4.3.0', '<')) || !extension_loaded('xml') || !extension_loaded('pcre'))
- {
- return false;
- }
- // Then check the xml extension is sane (i.e., libxml 2.7.x issue on PHP < 5.2.9 and libxml 2.7.0 to 2.7.2 on any version) if we don't have xmlreader.
- elseif (!extension_loaded('xmlreader'))
- {
- static $xml_is_sane = null;
- if ($xml_is_sane === null)
- {
- $parser_check = xml_parser_create();
- xml_parse_into_struct($parser_check, '<foo>&amp;</foo>', $values);
- xml_parser_free($parser_check);
- $xml_is_sane = isset($values[0]['value']);
- }
- if (!$xml_is_sane)
- {
- return false;
- }
- }
-
- if (isset($_GET[$this->javascript]))
- {
- SimplePie_Misc::output_javascript();
- exit;
- }
-
- // Pass whatever was set with config options over to the sanitizer.
- $this->sanitize->pass_cache_data($this->cache, $this->cache_location, $this->cache_name_function, $this->cache_class);
- $this->sanitize->pass_file_data($this->file_class, $this->timeout, $this->useragent, $this->force_fsockopen);
-
- if ($this->feed_url !== null || $this->raw_data !== null)
- {
- $this->data = array();
- $this->multifeed_objects = array();
- $cache = false;
-
- if ($this->feed_url !== null)
- {
- $parsed_feed_url = SimplePie_Misc::parse_url($this->feed_url);
- // Decide whether to enable caching
- if ($this->cache && $parsed_feed_url['scheme'] !== '')
- {
- $cache = call_user_func(array($this->cache_class, 'create'), $this->cache_location, call_user_func($this->cache_name_function, $this->feed_url), 'spc');
- }
- // If it's enabled and we don't want an XML dump, use the cache
- if ($cache && !$this->xml_dump)
- {
- // Load the Cache
- $this->data = $cache->load();
- if (!empty($this->data))
- {
- // If the cache is for an outdated build of SimplePie
- if (!isset($this->data['build']) || $this->data['build'] !== SIMPLEPIE_BUILD)
- {
- $cache->unlink();
- $this->data = array();
- }
- // If we've hit a collision just rerun it with caching disabled
- elseif (isset($this->data['url']) && $this->data['url'] !== $this->feed_url)
- {
- $cache = false;
- $this->data = array();
- }
- // If we've got a non feed_url stored (if the page isn't actually a feed, or is a redirect) use that URL.
- elseif (isset($this->data['feed_url']))
- {
- // If the autodiscovery cache is still valid use it.
- if ($cache->mtime() + $this->autodiscovery_cache_duration > time())
- {
- // Do not need to do feed autodiscovery yet.
- if ($this->data['feed_url'] === $this->data['url'])
- {
- $cache->unlink();
- $this->data = array();
- }
- else
- {
- $this->set_feed_url($this->data['feed_url']);
- return $this->init();
- }
- }
- }
- // Check if the cache has been updated
- elseif ($cache->mtime() + $this->cache_duration < time())
- {
- // If we have last-modified and/or etag set
- if (isset($this->data['headers']['last-modified']) || isset($this->data['headers']['etag']))
- {
- $headers = array();
- if (isset($this->data['headers']['last-modified']))
- {
- $headers['if-modified-since'] = $this->data['headers']['last-modified'];
- }
- if (isset($this->data['headers']['etag']))
- {
- $headers['if-none-match'] = '"' . $this->data['headers']['etag'] . '"';
- }
- $file = new $this->file_class($this->feed_url, $this->timeout/10, 5, $headers, $this->useragent, $this->force_fsockopen);
- if ($file->success)
- {
- if ($file->status_code === 304)
- {
- $cache->touch();
- return true;
- }
- else
- {
- $headers = $file->headers;
- }
- }
- else
- {
- unset($file);
- }
- }
- }
- // If the cache is still valid, just return true
- else
- {
- return true;
- }
- }
- // If the cache is empty, delete it
- else
- {
- $cache->unlink();
- $this->data = array();
- }
- }
- // If we don't already have the file (it'll only exist if we've opened it to check if the cache has been modified), open it.
- if (!isset($file))
- {
- if (is_a($this->file, 'SimplePie_File') && $this->file->url === $this->feed_url)
- {
- $file =& $this->file;
- }
- else
- {
- $file = new $this->file_class($this->feed_url, $this->timeout, 5, null, $this->useragent, $this->force_fsockopen);
- }
- }
- // If the file connection has an error, set SimplePie::error to that and quit
- if (!$file->success && !($file->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($file->status_code === 200 || $file->status_code > 206 && $file->status_code < 300)))
- {
- $this->error = $file->error;
- if (!empty($this->data))
- {
- return true;
- }
- else
- {
- return false;
- }
- }
-
- if (!$this->force_feed)
- {
- // Check if the supplied URL is a feed, if it isn't, look for it.
- $locate = new $this->locator_class($file, $this->timeout, $this->useragent, $this->file_class, $this->max_checked_feeds, $this->content_type_sniffer_class);
- if (!$locate->is_feed($file))
- {
- // We need to unset this so that if SimplePie::set_file() has been called that object is untouched
- unset($file);
- if ($file = $locate->find($this->autodiscovery, $this->all_discovered_feeds))
- {
- if ($cache)
- {
- $this->data = array('url' => $this->feed_url, 'feed_url' => $file->url, 'build' => SIMPLEPIE_BUILD);
- if (!$cache->save($this))
- {
- trigger_error("$this->cache_location is not writeable. Make sure you've set the correct relative or absolute path, and that the location is server-writable.", E_USER_WARNING);
- }
- $cache = call_user_func(array($this->cache_class, 'create'), $this->cache_location, call_user_func($this->cache_name_function, $file->url), 'spc');
- }
- $this->feed_url = $file->url;
- }
- else
- {
- $this->error = "A feed could not be found at $this->feed_url. A feed with an invalid mime type may fall victim to this error, or " . SIMPLEPIE_NAME . " was unable to auto-discover it.. Use force_feed() if you are certain this URL is a real feed.";
- SimplePie_Misc::error($this->error, E_USER_NOTICE, __FILE__, __LINE__);
- return false;
- }
- }
- $locate = null;
- }
-
- $headers = $file->headers;
- $data = $file->body;
- $sniffer = new $this->content_type_sniffer_class($file);
- $sniffed = $sniffer->get_type();
- }
- else
- {
- $data = $this->raw_data;
- }
-
- // Set up array of possible encodings
- $encodings = array();
-
- // First check to see if input has been overridden.
- if ($this->input_encoding !== false)
- {
- $encodings[] = $this->input_encoding;
- }
-
- $application_types = array('application/xml', 'application/xml-dtd', 'application/xml-external-parsed-entity');
- $text_types = array('text/xml', 'text/xml-external-parsed-entity');
-
- // RFC 3023 (only applies to sniffed content)
- if (isset($sniffed))
- {
- if (in_array($sniffed, $application_types) || substr($sniffed, 0, 12) === 'application/' && substr($sniffed, -4) === '+xml')
- {
- if (isset($headers['content-type']) && preg_match('/;\x20?charset=([^;]*)/i', $headers['content-type'], $charset))
- {
- $encodings[] = strtoupper($charset[1]);
- }
- $encodings = array_merge($encodings, SimplePie_Misc::xml_encoding($data));
- $encodings[] = 'UTF-8';
- }
- elseif (in_array($sniffed, $text_types) || substr($sniffed, 0, 5) === 'text/' && substr($sniffed, -4) === '+xml')
- {
- if (isset($headers['content-type']) && preg_match('/;\x20?charset=([^;]*)/i', $headers['content-type'], $charset))
- {
- $encodings[] = $charset[1];
- }
- $encodings[] = 'US-ASCII';
- }
- // Text MIME-type default
- elseif (substr($sniffed, 0, 5) === 'text/')
- {
- $encodings[] = 'US-ASCII';
- }
- }
-
- // Fallback to XML 1.0 Appendix F.1/UTF-8/ISO-8859-1
- $encodings = array_merge($encodings, SimplePie_Misc::xml_encoding($data));
- $encodings[] = 'UTF-8';
- $encodings[] = 'ISO-8859-1';
-
- // There's no point in trying an encoding twice
- $encodings = array_unique($encodings);
-
- // If we want the XML, just output that with the most likely encoding and quit
- if ($this->xml_dump)
- {
- header('Content-type: text/xml; charset=' . $encodings[0]);
- echo $data;
- exit;
- }
-
- // Loop through each possible encoding, till we return something, or run out of possibilities
- foreach ($encodings as $encoding)
- {
- // Change the encoding to UTF-8 (as we always use UTF-8 internally)
- if ($utf8_data = SimplePie_Misc::change_encoding($data, $encoding, 'UTF-8'))
- {
- // Create new parser
- $parser = new $this->parser_class();
-
- // If it's parsed fine
- if ($parser->parse($utf8_data, 'UTF-8'))
- {
- $this->data = $parser->get_data();
- if ($this->get_type() & ~SIMPLEPIE_TYPE_NONE)
- {
- if (isset($headers))
- {
- $this->data['headers'] = $headers;
- }
- $this->data['build'] = SIMPLEPIE_BUILD;
-
- // Cache the file if caching is enabled
- if ($cache && !$cache->save($this))
- {
- trigger_error("$this->cache_location is not writeable. Make sure you've set the correct relative or absolute path, and that the location is server-writable.", E_USER_WARNING);
- }
- return true;
- }
- else
- {
- $this->error = "A feed could not be found at $this->feed_url. This does not appear to be a valid RSS or Atom feed.";
- SimplePie_Misc::error($this->error, E_USER_NOTICE, __FILE__, __LINE__);
- return false;
- }
- }
- }
- }
- if (isset($parser))
- {
- // We have an error, just set SimplePie_Misc::error to it and quit
- $this->error = sprintf('This XML document is invalid, likely due to invalid characters. XML error: %s at line %d, column %d', $parser->get_error_string(), $parser->get_current_line(), $parser->get_current_column());
- }
- else
- {
- $this->error = 'The data could not be converted to UTF-8. You MUST have either the iconv or mbstring extension installed. Upgrading to PHP 5.x (which includes iconv) is highly recommended.';
- }
- SimplePie_Misc::error($this->error, E_USER_NOTICE, __FILE__, __LINE__);
- return false;
- }
- elseif (!empty($this->multifeed_url))
- {
- $i = 0;
- $success = 0;
- $this->multifeed_objects = array();
- foreach ($this->multifeed_url as $url)
- {
- if (SIMPLEPIE_PHP5)
- {
- // This keyword needs to defy coding standards for PHP4 compatibility
- $this->multifeed_objects[$i] = clone($this);
- }
- else
- {
- $this->multifeed_objects[$i] = $this;
- }
- $this->multifeed_objects[$i]->set_feed_url($url);
- $success |= $this->multifeed_objects[$i]->init();
- $i++;
- }
- return (bool) $success;
- }
- else
- {
- return false;
- }
- }
-
- /**
- * Return the error message for the occured error
- *
- * @access public
- * @return string Error message
- */
- function error()
- {
- return $this->error;
- }
-
- function get_encoding()
- {
- return $this->sanitize->output_encoding;
- }
-
- function handle_content_type($mime = 'text/html')
- {
- if (!headers_sent())
- {
- $header = "Content-type: $mime;";
- if ($this->get_encoding())
- {
- $header .= ' charset=' . $this->get_encoding();
- }
- else
- {
- $header .= ' charset=UTF-8';
- }
- header($header);
- }
- }
-
- function get_type()
- {
- if (!isset($this->data['type']))
- {
- $this->data['type'] = SIMPLEPIE_TYPE_ALL;
- if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed']))
- {
- $this->data['type'] &= SIMPLEPIE_TYPE_ATOM_10;
- }
- elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed']))
- {
- $this->data['type'] &= SIMPLEPIE_TYPE_ATOM_03;
- }
- elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF']))
- {
- if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_10]['channel'])
- || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_10]['image'])
- || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_10]['item'])
- || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_10]['textinput']))
- {
- $this->data['type'] &= SIMPLEPIE_TYPE_RSS_10;
- }
- if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_090]['channel'])
- || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_090]['image'])
- || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_090]['item'])
- || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_090]['textinput']))
- {
- $this->data['type'] &= SIMPLEPIE_TYPE_RSS_090;
- }
- }
- elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss']))
- {
- $this->data['type'] &= SIMPLEPIE_TYPE_RSS_ALL;
- if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['attribs']['']['version']))
- {
- switch (trim($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['attribs']['']['version']))
- {
- case '0.91':
- $this->data['type'] &= SIMPLEPIE_TYPE_RSS_091;
- if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_20]['skiphours']['hour'][0]['data']))
- {
- switch (trim($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_20]['skiphours']['hour'][0]['data']))
- {
- case '0':
- $this->data['type'] &= SIMPLEPIE_TYPE_RSS_091_NETSCAPE;
- break;
-
- case '24':
- $this->data['type'] &= SIMPLEPIE_TYPE_RSS_091_USERLAND;
- break;
- }
- }
- break;
-
- case '0.92':
- $this->data['type'] &= SIMPLEPIE_TYPE_RSS_092;
- break;
-
- case '0.93':
- $this->data['type'] &= SIMPLEPIE_TYPE_RSS_093;
- break;
-
- case '0.94':
- $this->data['type'] &= SIMPLEPIE_TYPE_RSS_094;
- break;
-
- case '2.0':
- $this->data['type'] &= SIMPLEPIE_TYPE_RSS_20;
- break;
- }
- }
- }
- else
- {
- $this->data['type'] = SIMPLEPIE_TYPE_NONE;
- }
- }
- return $this->data['type'];
- }
-
- /**
- * Returns the URL for the favicon of the feed's website.
- *
- * @todo Cache atom:icon
- * @access public
- * @since 1.0
- */
- function get_favicon()
- {
- if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'icon'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
- }
- elseif (($url = $this->get_link()) !== null && preg_match('/^http(s)?:\/\//i', $url))
- {
- $favicon = SimplePie_Misc::absolutize_url('/favicon.ico', $url);
-
- if ($this->cache && $this->favicon_handler)
- {
- $favicon_filename = call_user_func($this->cache_name_function, $favicon);
- $cache = call_user_func(array($this->cache_class, 'create'), $this->cache_location, $favicon_filename, 'spi');
-
- if ($cache->load())
- {
- return $this->sanitize($this->favicon_handler . $favicon_filename, SIMPLEPIE_CONSTRUCT_IRI);
- }
- else
- {
- $file = new $this->file_class($favicon, $this->timeout / 10, 5, array('X-FORWARDED-FOR' => $_SERVER['REMOTE_ADDR']), $this->useragent, $this->force_fsockopen);
-
- if ($file->success && ($file->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($file->status_code === 200 || $file->status_code > 206 && $file->status_code < 300)) && strlen($file->body) > 0)
- {
- $sniffer = new $this->content_type_sniffer_class($file);
- if (substr($sniffer->get_type(), 0, 6) === 'image/')
- {
- if ($cache->save(array('headers' => $file->headers, 'body' => $file->body)))
- {
- return $this->sanitize($this->favicon_handler . $favicon_filename, SIMPLEPIE_CONSTRUCT_IRI);
- }
- else
- {
- trigger_error("$cache->name is not writeable. Make sure you've set the correct relative or absolute path, and that the location is server-writable.", E_USER_WARNING);
- return $this->sanitize($favicon, SIMPLEPIE_CONSTRUCT_IRI);
- }
- }
- // not an image
- else
- {
- return false;
- }
- }
- }
- }
- else
- {
- return $this->sanitize($favicon, SIMPLEPIE_CONSTRUCT_IRI);
- }
- }
- return false;
- }
-
- /**
- * @todo If we have a perm redirect we should return the new URL
- * @todo When we make the above change, let's support <itunes:new-feed-url> as well
- * @todo Also, |atom:link|@rel=self
- */
- function subscribe_url()
- {
- if ($this->feed_url !== null)
- {
- return $this->sanitize($this->feed_url, SIMPLEPIE_CONSTRUCT_IRI);
- }
- else
- {
- return null;
- }
- }
-
- function subscribe_feed()
- {
- if ($this->feed_url !== null)
- {
- return $this->sanitize(SimplePie_Misc::fix_protocol($this->feed_url, 2), SIMPLEPIE_CONSTRUCT_IRI);
- }
- else
- {
- return null;
- }
- }
-
- function subscribe_outlook()
- {
- if ($this->feed_url !== null)
- {
- return $this->sanitize('outlook' . SimplePie_Misc::fix_protocol($this->feed_url, 2), SIMPLEPIE_CONSTRUCT_IRI);
- }
- else
- {
- return null;
- }
- }
-
- function subscribe_podcast()
- {
- if ($this->feed_url !== null)
- {
- return $this->sanitize(SimplePie_Misc::fix_protocol($this->feed_url, 3), SIMPLEPIE_CONSTRUCT_IRI);
- }
- else
- {
- return null;
- }
- }
-
- function subscribe_itunes()
- {
- if ($this->feed_url !== null)
- {
- return $this->sanitize(SimplePie_Misc::fix_protocol($this->feed_url, 4), SIMPLEPIE_CONSTRUCT_IRI);
- }
- else
- {
- return null;
- }
- }
-
- /**
- * Creates the subscribe_* methods' return data
- *
- * @access private
- * @param string $feed_url String to prefix to the feed URL
- * @param string $site_url String to prefix to the site URL (and
- * suffix to the feed URL)
- * @return mixed URL if feed exists, false otherwise
- */
- function subscribe_service($feed_url, $site_url = null)
- {
- if ($this->subscribe_url())
- {
- $return = $feed_url . rawurlencode($this->feed_url);
- if ($site_url !== null && $this->get_link() !== null)
- {
- $return .= $site_url . rawurlencode($this->get_link());
- }
- return $this->sanitize($return, SIMPLEPIE_CONSTRUCT_IRI);
- }
- else
- {
- return null;
- }
- }
-
- function subscribe_aol()
- {
- return $this->subscribe_service('http://feeds.my.aol.com/add.jsp?url=');
- }
-
- function subscribe_bloglines()
- {
- return $this->subscribe_service('http://www.bloglines.com/sub/');
- }
-
- function subscribe_eskobo()
- {
- return $this->subscribe_service('http://www.eskobo.com/?AddToMyPage=');
- }
-
- function subscribe_feedfeeds()
- {
- return $this->subscribe_service('http://www.feedfeeds.com/add?feed=');
- }
-
- function subscribe_feedster()
- {
- return $this->subscribe_service('http://www.feedster.com/myfeedster.php?action=addrss&confirm=no&rssurl=');
- }
-
- function subscribe_google()
- {
- return $this->subscribe_service('http://fusion.google.com/add?feedurl=');
- }
-
- function subscribe_gritwire()
- {
- return $this->subscribe_service('http://my.gritwire.com/feeds/addExternalFeed.aspx?FeedUrl=');
- }
-
- function subscribe_msn()
- {
- return $this->subscribe_service('http://my.msn.com/addtomymsn.armx?id=rss&ut=', '&ru=');
- }
-
- function subscribe_netvibes()
- {
- return $this->subscribe_service('http://www.netvibes.com/subscribe.php?url=');
- }
-
- function subscribe_newsburst()
- {
- return $this->subscribe_service('http://www.newsburst.com/Source/?add=');
- }
-
- function subscribe_newsgator()
- {
- return $this->subscribe_service('http://www.newsgator.com/ngs/subscriber/subext.aspx?url=');
- }
-
- function subscribe_odeo()
- {
- return $this->subscribe_service('http://www.odeo.com/listen/subscribe?feed=');
- }
-
- function subscribe_podnova()
- {
- return $this->subscribe_service('http://www.podnova.com/index_your_podcasts.srf?action=add&url=');
- }
-
- function subscribe_rojo()
- {
- return $this->subscribe_service('http://www.rojo.com/add-subscription?resource=');
- }
-
- function subscribe_yahoo()
- {
- return $this->subscribe_service('http://add.my.yahoo.com/rss?url=');
- }
-
- function get_feed_tags($namespace, $tag)
- {
- $type = $this->get_type();
- if ($type & SIMPLEPIE_TYPE_ATOM_10)
- {
- if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]['child'][$namespace][$tag]))
- {
- return $this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]['child'][$namespace][$tag];
- }
- }
- if ($type & SIMPLEPIE_TYPE_ATOM_03)
- {
- if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]['child'][$namespace][$tag]))
- {
- return $this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]['child'][$namespace][$tag];
- }
- }
- if ($type & SIMPLEPIE_TYPE_RSS_RDF)
- {
- if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][$namespace][$tag]))
- {
- return $this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][$namespace][$tag];
- }
- }
- if ($type & SIMPLEPIE_TYPE_RSS_SYNDICATION)
- {
- if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][$namespace][$tag]))
- {
- return $this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][$namespace][$tag];
- }
- }
- return null;
- }
-
- function get_channel_tags($namespace, $tag)
- {
- $type = $this->get_type();
- if ($type & SIMPLEPIE_TYPE_ATOM_ALL)
- {
- if ($return = $this->get_feed_tags($namespace, $tag))
- {
- return $return;
- }
- }
- if ($type & SIMPLEPIE_TYPE_RSS_10)
- {
- if ($channel = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'channel'))
- {
- if (isset($channel[0]['child'][$namespace][$tag]))
- {
- return $channel[0]['child'][$namespace][$tag];
- }
- }
- }
- if ($type & SIMPLEPIE_TYPE_RSS_090)
- {
- if ($channel = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'channel'))
- {
- if (isset($channel[0]['child'][$namespace][$tag]))
- {
- return $channel[0]['child'][$namespace][$tag];
- }
- }
- }
- if ($type & SIMPLEPIE_TYPE_RSS_SYNDICATION)
- {
- if ($channel = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'channel'))
- {
- if (isset($channel[0]['child'][$namespace][$tag]))
- {
- return $channel[0]['child'][$namespace][$tag];
- }
- }
- }
- return null;
- }
-
- function get_image_tags($namespace, $tag)
- {
- $type = $this->get_type();
- if ($type & SIMPLEPIE_TYPE_RSS_10)
- {
- if ($image = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'image'))
- {
- if (isset($image[0]['child'][$namespace][$tag]))
- {
- return $image[0]['child'][$namespace][$tag];
- }
- }
- }
- if ($type & SIMPLEPIE_TYPE_RSS_090)
- {
- if ($image = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'image'))
- {
- if (isset($image[0]['child'][$namespace][$tag]))
- {
- return $image[0]['child'][$namespace][$tag];
- }
- }
- }
- if ($type & SIMPLEPIE_TYPE_RSS_SYNDICATION)
- {
- if ($image = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'image'))
- {
- if (isset($image[0]['child'][$namespace][$tag]))
- {
- return $image[0]['child'][$namespace][$tag];
- }
- }
- }
- return null;
- }
-
- function get_base($element = array())
- {
- if (!($this->get_type() & SIMPLEPIE_TYPE_RSS_SYNDICATION) && !empty($element['xml_base_explicit']) && isset($element['xml_base']))
- {
- return $element['xml_base'];
- }
- elseif ($this->get_link() !== null)
- {
- return $this->get_link();
- }
- else
- {
- return $this->subscribe_url();
- }
- }
-
- function sanitize($data, $type, $base = '')
- {
- return $this->sanitize->sanitize($data, $type, $base);
- }
-
- function get_title()
- {
- if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'title'))
- {
- return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0]));
- }
- elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'title'))
- {
- return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0]));
- }
- elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'title'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
- }
- elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'title'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
- }
- elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'title'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
- }
- elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'title'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'title'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- else
- {
- return null;
- }
- }
-
- function get_category($key = 0)
- {
- $categories = $this->get_categories();
- if (isset($categories[$key]))
- {
- return $categories[$key];
- }
- else
- {
- return null;
- }
- }
-
- function get_categories()
- {
- $categories = array();
-
- foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'category') as $category)
- {
- $term = null;
- $scheme = null;
- $label = null;
- if (isset($category['attribs']['']['term']))
- {
- $term = $this->sanitize($category['attribs']['']['term'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($category['attribs']['']['scheme']))
- {
- $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($category['attribs']['']['label']))
- {
- $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- $categories[] = new $this->category_class($term, $scheme, $label);
- }
- foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'category') as $category)
- {
- // This is really the label, but keep this as the term also for BC.
- // Label will also work on retrieving because that falls back to term.
- $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- if (isset($category['attribs']['']['domain']))
- {
- $scheme = $this->sanitize($category['attribs']['']['domain'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- else
- {
- $scheme = null;
- }
- $categories[] = new $this->category_class($term, $scheme, null);
- }
- foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'subject') as $category)
- {
- $categories[] = new $this->category_class($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
- }
- foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'subject') as $category)
- {
- $categories[] = new $this->category_class($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
- }
-
- if (!empty($categories))
- {
- return SimplePie_Misc::array_unique($categories);
- }
- else
- {
- return null;
- }
- }
-
- function get_author($key = 0)
- {
- $authors = $this->get_authors();
- if (isset($authors[$key]))
- {
- return $authors[$key];
- }
- else
- {
- return null;
- }
- }
-
- function get_authors()
- {
- $authors = array();
- foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'author') as $author)
- {
- $name = null;
- $uri = null;
- $email = null;
- $avatar = null;
- $name_date = null;
- $uri_date = null;
- $avatar_date = null;
-
- if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data']))
- {
- $name = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data']))
- {
- $uri = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]));
- }
- if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data']))
- {
- $email = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($author['child']['http://purl.org/macgirvin/dfrn/1.0']['avatar'][0]['data']))
- {
- $avatar = $this->sanitize($author['child']['http://purl.org/macgirvin/dfrn/1.0']['avatar'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author['child']['http://purl.org/macgirvin/dfrn/1.0']['avatar'][0]));
- }
- if (isset($author['child']['http://purl.org/macgirvin/dfrn/1.0']['name-updated'][0]['data']))
- {
- $name_date = $author['child']['http://purl.org/macgirvin/dfrn/1.0']['name-updated'][0]['data'];
- }
- if (isset($author['child']['http://purl.org/macgirvin/dfrn/1.0']['uri-updated'][0]['data']))
- {
- $uri_date = $author['child']['http://purl.org/macgirvin/dfrn/1.0']['uri-updated'][0]['data'];
- }
- if (isset($author['child']['http://purl.org/macgirvin/dfrn/1.0']['avatar-updated'][0]['data']))
- {
- $avatar_date = $author['child']['http://purl.org/macgirvin/dfrn/1.0']['avatar-updated'][0]['data'];
- }
-
- if ($name !== null || $email !== null || $uri !== null || $avatar !== null || $name_date !== null || $uri_date !== null || $avatar_date !== null )
- {
- $authors[] = new $this->author_class($name, $uri, $email, $avatar, $name_date, $uri_date, $avatar_date);
- }
- }
- if ($author = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'author'))
- {
- $name = null;
- $url = null;
- $email = null;
- if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data']))
- {
- $name = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data']))
- {
- $url = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]));
- }
- if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data']))
- {
- $email = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if ($name !== null || $email !== null || $url !== null)
- {
- $authors[] = new $this->author_class($name, $url, $email);
- }
- }
- foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'creator') as $author)
- {
- $authors[] = new $this->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
- }
- foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'creator') as $author)
- {
- $authors[] = new $this->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
- }
- foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'author') as $author)
- {
- $authors[] = new $this->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
- }
-
- if (!empty($authors))
- {
- return SimplePie_Misc::array_unique($authors);
- }
- else
- {
- return null;
- }
- }
-
- function get_contributor($key = 0)
- {
- $contributors = $this->get_contributors();
- if (isset($contributors[$key]))
- {
- return $contributors[$key];
- }
- else
- {
- return null;
- }
- }
-
- function get_contributors()
- {
- $contributors = array();
- foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'contributor') as $contributor)
- {
- $name = null;
- $uri = null;
- $email = null;
- if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data']))
- {
- $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data']))
- {
- $uri = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]));
- }
- if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data']))
- {
- $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if ($name !== null || $email !== null || $uri !== null)
- {
- $contributors[] = new $this->author_class($name, $uri, $email);
- }
- }
- foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'contributor') as $contributor)
- {
- $name = null;
- $url = null;
- $email = null;
- if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data']))
- {
- $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data']))
- {
- $url = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]));
- }
- if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data']))
- {
- $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if ($name !== null || $email !== null || $url !== null)
- {
- $contributors[] = new $this->author_class($name, $url, $email);
- }
- }
-
- if (!empty($contributors))
- {
- return SimplePie_Misc::array_unique($contributors);
- }
- else
- {
- return null;
- }
- }
-
- function get_link($key = 0, $rel = 'alternate')
- {
- $links = $this->get_links($rel);
- if (isset($links[$key]))
- {
- return $links[$key];
- }
- else
- {
- return null;
- }
- }
-
- /**
- * Added for parity between the parent-level and the item/entry-level.
- */
- function get_permalink()
- {
- return $this->get_link(0);
- }
-
- function get_links($rel = 'alternate')
- {
- if (!isset($this->data['links']))
- {
- $this->data['links'] = array();
- if ($links = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'link'))
- {
- foreach ($links as $link)
- {
- if (isset($link['attribs']['']['href']))
- {
- $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate';
- $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));
- }
- }
- }
- if ($links = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'link'))
- {
- foreach ($links as $link)
- {
- if (isset($link['attribs']['']['href']))
- {
- $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate';
- $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));
-
- }
- }
- }
- if ($links = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'link'))
- {
- $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
- }
- if ($links = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'link'))
- {
- $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
- }
- if ($links = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'link'))
- {
- $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
- }
-
- $keys = array_keys($this->data['links']);
- foreach ($keys as $key)
- {
- if (SimplePie_Misc::is_isegment_nz_nc($key))
- {
- if (isset($this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]))
- {
- $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] = array_merge($this->data['links'][$key], $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]);
- $this->data['links'][$key] =& $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key];
- }
- else
- {
- $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] =& $this->data['links'][$key];
- }
- }
- elseif (substr($key, 0, 41) === SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY)
- {
- $this->data['links'][substr($key, 41)] =& $this->data['links'][$key];
- }
- $this->data['links'][$key] = array_unique($this->data['links'][$key]);
- }
- }
-
- if (isset($this->data['links'][$rel]))
- {
- return $this->data['links'][$rel];
- }
- else
- {
- return null;
- }
- }
-
- function get_all_discovered_feeds()
- {
- return $this->all_discovered_feeds;
- }
-
- function get_description()
- {
- if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'subtitle'))
- {
- return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0]));
- }
- elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'tagline'))
- {
- return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0]));
- }
- elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'description'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
- }
- elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'description'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
- }
- elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'description'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));
- }
- elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'description'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'description'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'summary'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));
- }
- elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'subtitle'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));
- }
- else
- {
- return null;
- }
- }
-
- function get_copyright()
- {
- if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'rights'))
- {
- return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0]));
- }
- elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'copyright'))
- {
- return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0]));
- }
- elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'copyright'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'rights'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'rights'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- else
- {
- return null;
- }
- }
-
- function get_language()
- {
- if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'language'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'language'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'language'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]['xml_lang']))
- {
- return $this->sanitize($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]['xml_lang'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]['xml_lang']))
- {
- return $this->sanitize($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]['xml_lang'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['xml_lang']))
- {
- return $this->sanitize($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['xml_lang'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- elseif (isset($this->data['headers']['content-language']))
- {
- return $this->sanitize($this->data['headers']['content-language'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- else
- {
- return null;
- }
- }
-
- function get_latitude()
- {
-
- if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lat'))
- {
- return (float) $return[0]['data'];
- }
- elseif (($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match))
- {
- return (float) $match[1];
- }
- else
- {
- return null;
- }
- }
-
- function get_longitude()
- {
- if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'long'))
- {
- return (float) $return[0]['data'];
- }
- elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lon'))
- {
- return (float) $return[0]['data'];
- }
- elseif (($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match))
- {
- return (float) $match[2];
- }
- else
- {
- return null;
- }
- }
-
- function get_image_title()
- {
- if ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'title'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'title'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'title'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_DC_11, 'title'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_DC_10, 'title'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- else
- {
- return null;
- }
- }
-
- function get_image_url()
- {
- if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'image'))
- {
- return $this->sanitize($return[0]['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI);
- }
- elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'logo'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
- }
- elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'icon'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
- }
- elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'url'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
- }
- elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'url'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
- }
- elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'url'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
- }
- else
- {
- return null;
- }
- }
-
- function get_image_link()
- {
- if ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'link'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
- }
- elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'link'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
- }
- elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'link'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
- }
- else
- {
- return null;
- }
- }
-
- function get_image_width()
- {
- if ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'width'))
- {
- return round($return[0]['data']);
- }
- elseif ($this->get_type() & SIMPLEPIE_TYPE_RSS_SYNDICATION && $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'url'))
- {
- return 88.0;
- }
- else
- {
- return null;
- }
- }
-
- function get_image_height()
- {
- if ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'height'))
- {
- return round($return[0]['data']);
- }
- elseif ($this->get_type() & SIMPLEPIE_TYPE_RSS_SYNDICATION && $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'url'))
- {
- return 31.0;
- }
- else
- {
- return null;
- }
- }
-
- function get_item_quantity($max = 0)
- {
- $max = (int) $max;
- $qty = count($this->get_items());
- if ($max === 0)
- {
- return $qty;
- }
- else
- {
- return ($qty > $max) ? $max : $qty;
- }
- }
-
- function get_item($key = 0)
- {
- $items = $this->get_items();
- if (isset($items[$key]))
- {
- return $items[$key];
- }
- else
- {
- return null;
- }
- }
-
- function get_items($start = 0, $end = 0)
- {
- if (!isset($this->data['items']))
- {
- if (!empty($this->multifeed_objects))
- {
- $this->data['items'] = SimplePie::merge_items($this->multifeed_objects, $start, $end, $this->item_limit);
- }
- else
- {
- $this->data['items'] = array();
- if ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'entry'))
- {
- $keys = array_keys($items);
- foreach ($keys as $key)
- {
- $this->data['items'][] = new $this->item_class($this, $items[$key]);
- }
- }
- if ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'entry'))
- {
- $keys = array_keys($items);
- foreach ($keys as $key)
- {
- $this->data['items'][] = new $this->item_class($this, $items[$key]);
- }
- }
- if ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'item'))
- {
- $keys = array_keys($items);
- foreach ($keys as $key)
- {
- $this->data['items'][] = new $this->item_class($this, $items[$key]);
- }
- }
- if ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'item'))
- {
- $keys = array_keys($items);
- foreach ($keys as $key)
- {
- $this->data['items'][] = new $this->item_class($this, $items[$key]);
- }
- }
- if ($items = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'item'))
- {
- $keys = array_keys($items);
- foreach ($keys as $key)
- {
- $this->data['items'][] = new $this->item_class($this, $items[$key]);
- }
- }
- }
- }
-
- if (!empty($this->data['items']))
- {
- // If we want to order it by date, check if all items have a date, and then sort it
- if ($this->order_by_date && empty($this->multifeed_objects))
- {
- if (!isset($this->data['ordered_items']))
- {
- $do_sort = true;
- foreach ($this->data['items'] as $item)
- {
- if (!$item->get_date('U'))
- {
- $do_sort = false;
- break;
- }
- }
- $item = null;
- $this->data['ordered_items'] = $this->data['items'];
- if ($do_sort)
- {
- usort($this->data['ordered_items'], array(&$this, 'sort_items'));
- }
- }
- $items = $this->data['ordered_items'];
- }
- else
- {
- $items = $this->data['items'];
- }
-
- // Slice the data as desired
- if ($end === 0)
- {
- return array_slice($items, $start);
- }
- else
- {
- return array_slice($items, $start, $end);
- }
- }
- else
- {
- return array();
- }
- }
-
- /**
- * @static
- */
- function sort_items($a, $b)
- {
- return $a->get_date('U') <= $b->get_date('U');
- }
-
- /**
- * @static
- */
- function merge_items($urls, $start = 0, $end = 0, $limit = 0)
- {
- if (is_array($urls) && sizeof($urls) > 0)
- {
- $items = array();
- foreach ($urls as $arg)
- {
- if (is_a($arg, 'SimplePie'))
- {
- $items = array_merge($items, $arg->get_items(0, $limit));
- }
- else
- {
- trigger_error('Arguments must be SimplePie objects', E_USER_WARNING);
- }
- }
-
- $do_sort = true;
- foreach ($items as $item)
- {
- if (!$item->get_date('U'))
- {
- $do_sort = false;
- break;
- }
- }
- $item = null;
- if ($do_sort)
- {
- usort($items, array('SimplePie', 'sort_items'));
- }
-
- if ($end === 0)
- {
- return array_slice($items, $start);
- }
- else
- {
- return array_slice($items, $start, $end);
- }
- }
- else
- {
- trigger_error('Cannot merge zero SimplePie objects', E_USER_WARNING);
- return array();
- }
- }
-}
-
-class SimplePie_Item
-{
- var $feed;
- var $data = array();
-
- function SimplePie_Item($feed, $data)
- {
- $this->feed = $feed;
- $this->data = $data;
- }
-
- function __toString()
- {
- return md5(serialize($this->data));
- }
-
- /**
- * Remove items that link back to this before destroying this object
- */
- function __destruct()
- {
- if ((version_compare(PHP_VERSION, '5.3', '<') || !gc_enabled()) && !ini_get('zend.ze1_compatibility_mode'))
- {
- unset($this->feed);
- }
- }
-
- function get_item_tags($namespace, $tag)
- {
- if (isset($this->data['child'][$namespace][$tag]))
- {
- return $this->data['child'][$namespace][$tag];
- }
- else
- {
- return null;
- }
- }
-
- function get_base($element = array())
- {
- return $this->feed->get_base($element);
- }
-
- function sanitize($data, $type, $base = '')
- {
- return $this->feed->sanitize($data, $type, $base);
- }
-
- function get_feed()
- {
- return $this->feed;
- }
-
- function get_id($hash = false)
- {
- if (!$hash)
- {
- if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'id'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'id'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'guid'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'identifier'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'identifier'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- elseif (($return = $this->get_permalink()) !== null)
- {
- return $return;
- }
- elseif (($return = $this->get_title()) !== null)
- {
- return $return;
- }
- }
- if ($this->get_permalink() !== null || $this->get_title() !== null)
- {
- return md5($this->get_permalink() . $this->get_title());
- }
- else
- {
- return md5(serialize($this->data));
- }
- }
-
- function get_title()
- {
- if (!isset($this->data['title']))
- {
- if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'title'))
- {
- $this->data['title'] = $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0]));
- }
- elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'title'))
- {
- $this->data['title'] = $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0]));
- }
- elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'title'))
- {
- $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
- }
- elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'title'))
- {
- $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
- }
- elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'title'))
- {
- $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
- }
- elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'title'))
- {
- $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'title'))
- {
- $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- else
- {
- $this->data['title'] = null;
- }
- }
- return $this->data['title'];
- }
-
- function get_description($description_only = false)
- {
- if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'summary'))
- {
- return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0]));
- }
- elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'summary'))
- {
- return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0]));
- }
- elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'description'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
- }
- elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'description'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));
- }
- elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'description'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'description'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'summary'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));
- }
- elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'subtitle'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- elseif (!$description_only)
- {
- return $this->get_content(true);
- }
- else
- {
- return null;
- }
- }
-
- function get_content($content_only = false)
- {
- if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'content'))
- {
- return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_content_construct_type($return[0]['attribs']), $this->get_base($return[0]));
- }
- elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'content'))
- {
- return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0]));
- }
- elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10_MODULES_CONTENT, 'encoded'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));
- }
- elseif (!$content_only)
- {
- return $this->get_description(true);
- }
- else
- {
- return null;
- }
- }
-
- function get_category($key = 0)
- {
- $categories = $this->get_categories();
- if (isset($categories[$key]))
- {
- return $categories[$key];
- }
- else
- {
- return null;
- }
- }
-
- function get_categories()
- {
- $categories = array();
-
- foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'category') as $category)
- {
- $term = null;
- $scheme = null;
- $label = null;
- if (isset($category['attribs']['']['term']))
- {
- $term = $this->sanitize($category['attribs']['']['term'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($category['attribs']['']['scheme']))
- {
- $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($category['attribs']['']['label']))
- {
- $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- $categories[] = new $this->feed->category_class($term, $scheme, $label);
- }
- foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'category') as $category)
- {
- // This is really the label, but keep this as the term also for BC.
- // Label will also work on retrieving because that falls back to term.
- $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- if (isset($category['attribs']['']['domain']))
- {
- $scheme = $this->sanitize($category['attribs']['']['domain'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- else
- {
- $scheme = null;
- }
- $categories[] = new $this->feed->category_class($term, $scheme, null);
- }
- foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'subject') as $category)
- {
- $categories[] = new $this->feed->category_class($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
- }
- foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'subject') as $category)
- {
- $categories[] = new $this->feed->category_class($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
- }
-
- if (!empty($categories))
- {
- return SimplePie_Misc::array_unique($categories);
- }
- else
- {
- return null;
- }
- }
-
- function get_author($key = 0)
- {
- $authors = $this->get_authors();
- if (isset($authors[$key]))
- {
- return $authors[$key];
- }
- else
- {
- return null;
- }
- }
-
- function get_contributor($key = 0)
- {
- $contributors = $this->get_contributors();
- if (isset($contributors[$key]))
- {
- return $contributors[$key];
- }
- else
- {
- return null;
- }
- }
-
- function get_contributors()
- {
- $contributors = array();
- foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'contributor') as $contributor)
- {
- $name = null;
- $uri = null;
- $email = null;
- if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data']))
- {
- $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data']))
- {
- $uri = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]));
- }
- if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data']))
- {
- $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if ($name !== null || $email !== null || $uri !== null)
- {
- $contributors[] = new $this->feed->author_class($name, $uri, $email);
- }
- }
- foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'contributor') as $contributor)
- {
- $name = null;
- $url = null;
- $email = null;
- if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data']))
- {
- $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data']))
- {
- $url = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]));
- }
- if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data']))
- {
- $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if ($name !== null || $email !== null || $url !== null)
- {
- $contributors[] = new $this->feed->author_class($name, $url, $email);
- }
- }
-
- if (!empty($contributors))
- {
- return SimplePie_Misc::array_unique($contributors);
- }
- else
- {
- return null;
- }
- }
-
- function get_authors()
- {
- $authors = array();
- foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'author') as $author)
- {
- $name = null;
- $uri = null;
- $email = null;
- $avatar = null;
- $name_date = null;
- $uri_date = null;
- $avatar_date = null;
- if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data']))
- {
- $name = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data']))
- {
- $uri = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]));
- }
- if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data']))
- {
- $email = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($author['child']['http://purl.org/macgirvin/dfrn/1.0']['avatar'][0]['data']))
- {
- $avatar = $this->sanitize($author['child']['http://purl.org/macgirvin/dfrn/1.0']['avatar'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author['child']['http://purl.org/macgirvin/dfrn/1.0']['avatar'][0]));
- }
- if (isset($author['child']['http://purl.org/macgirvin/dfrn/1.0']['name-updated'][0]['data']))
- {
- $name_date = $author['child']['http://purl.org/macgirvin/dfrn/1.0']['name-updated'][0]['data'];
- }
- if (isset($author['child']['http://purl.org/macgirvin/dfrn/1.0']['uri-updated'][0]['data']))
- {
- $uri_date = $author['child']['http://purl.org/macgirvin/dfrn/1.0']['uri-updated'][0]['data'];
- }
- if (isset($author['child']['http://purl.org/macgirvin/dfrn/1.0']['avatar-updated'][0]['data']))
- {
- $avatar_date = $author['child']['http://purl.org/macgirvin/dfrn/1.0']['avatar-updated'][0]['data'];
- }
-
- if ($name !== null || $email !== null || $uri !== null || $avatar !== null || $name_date !== null || $uri_date !== null || $avatar_date !== null )
- {
- $authors[] = new $this->feed->author_class($name, $uri, $email, $avatar, $name_date, $uri_date, $avatar_date);
- }
- }
- if ($author = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'author'))
- {
- $name = null;
- $url = null;
- $email = null;
- if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data']))
- {
- $name = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data']))
- {
- $url = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]));
- }
- if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data']))
- {
- $email = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if ($name !== null || $email !== null || $url !== null)
- {
- $authors[] = new $this->feed->author_class($name, $url, $email);
- }
- }
- if ($author = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'author'))
- {
- $authors[] = new $this->feed->author_class(null, null, $this->sanitize($author[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
- }
- foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'creator') as $author)
- {
- $authors[] = new $this->feed->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
- }
- foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'creator') as $author)
- {
- $authors[] = new $this->feed->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
- }
- foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'author') as $author)
- {
- $authors[] = new $this->feed->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
- }
-
- if (!empty($authors))
- {
- return SimplePie_Misc::array_unique($authors);
- }
- elseif (($source = $this->get_source()) && ($authors = $source->get_authors()))
- {
- return $authors;
- }
- elseif ($authors = $this->feed->get_authors())
- {
- return $authors;
- }
- else
- {
- return null;
- }
- }
-
- function get_copyright()
- {
- if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'rights'))
- {
- return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0]));
- }
- elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'rights'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'rights'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- else
- {
- return null;
- }
- }
-
- function get_date($date_format = 'j F Y, g:i a')
- {
- if (!isset($this->data['date']))
- {
- if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'published'))
- {
- $this->data['date']['raw'] = $return[0]['data'];
- }
- elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'updated'))
- {
- $this->data['date']['raw'] = $return[0]['data'];
- }
- elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'issued'))
- {
- $this->data['date']['raw'] = $return[0]['data'];
- }
- elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'created'))
- {
- $this->data['date']['raw'] = $return[0]['data'];
- }
- elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'modified'))
- {
- $this->data['date']['raw'] = $return[0]['data'];
- }
- elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'pubDate'))
- {
- $this->data['date']['raw'] = $return[0]['data'];
- }
- elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'date'))
- {
- $this->data['date']['raw'] = $return[0]['data'];
- }
- elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'date'))
- {
- $this->data['date']['raw'] = $return[0]['data'];
- }
-
- if (!empty($this->data['date']['raw']))
- {
- $parser = SimplePie_Parse_Date::get();
- $this->data['date']['parsed'] = $parser->parse($this->data['date']['raw']);
- }
- else
- {
- $this->data['date'] = null;
- }
- }
- if ($this->data['date'])
- {
- $date_format = (string) $date_format;
- switch ($date_format)
- {
- case '':
- return $this->sanitize($this->data['date']['raw'], SIMPLEPIE_CONSTRUCT_TEXT);
-
- case 'U':
- return $this->data['date']['parsed'];
-
- default:
- return date($date_format, $this->data['date']['parsed']);
- }
- }
- else
- {
- return null;
- }
- }
-
- function get_local_date($date_format = '%c')
- {
- if (!$date_format)
- {
- return $this->sanitize($this->get_date(''), SIMPLEPIE_CONSTRUCT_TEXT);
- }
- elseif (($date = $this->get_date('U')) !== null)
- {
- return strftime($date_format, $date);
- }
- else
- {
- return null;
- }
- }
-
- function get_permalink()
- {
- $link = $this->get_link();
- $enclosure = $this->get_enclosure(0);
- if ($link !== null)
- {
- return $link;
- }
- elseif ($enclosure !== null)
- {
- return $enclosure->get_link();
- }
- else
- {
- return null;
- }
- }
-
- function get_link($key = 0, $rel = 'alternate')
- {
- $links = $this->get_links($rel);
- if ($links[$key] !== null)
- {
- return $links[$key];
- }
- else
- {
- return null;
- }
- }
-
- function get_links($rel = 'alternate')
- {
- if (!isset($this->data['links']))
- {
- $this->data['links'] = array();
- foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'link') as $link)
- {
- if (isset($link['attribs']['']['href']))
- {
- $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate';
- $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));
-
- }
- }
- foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'link') as $link)
- {
- if (isset($link['attribs']['']['href']))
- {
- $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate';
- $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));
- }
- }
- if ($links = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'link'))
- {
- $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
- }
- if ($links = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'link'))
- {
- $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
- }
- if ($links = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'link'))
- {
- $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
- }
- if ($links = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'guid'))
- {
- if (!isset($links[0]['attribs']['']['isPermaLink']) || strtolower(trim($links[0]['attribs']['']['isPermaLink'])) === 'true')
- {
- $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
- }
- }
-
- $keys = array_keys($this->data['links']);
- foreach ($keys as $key)
- {
- if (SimplePie_Misc::is_isegment_nz_nc($key))
- {
- if (isset($this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]))
- {
- $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] = array_merge($this->data['links'][$key], $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]);
- $this->data['links'][$key] =& $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key];
- }
- else
- {
- $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] =& $this->data['links'][$key];
- }
- }
- elseif (substr($key, 0, 41) === SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY)
- {
- $this->data['links'][substr($key, 41)] =& $this->data['links'][$key];
- }
- $this->data['links'][$key] = array_unique($this->data['links'][$key]);
- }
- }
- if (isset($this->data['links'][$rel]))
- {
- return $this->data['links'][$rel];
- }
- else
- {
- return null;
- }
- }
-
- /**
- * @todo Add ability to prefer one type of content over another (in a media group).
- */
- function get_enclosure($key = 0, $prefer = null)
- {
- $enclosures = $this->get_enclosures();
- if (isset($enclosures[$key]))
- {
- return $enclosures[$key];
- }
- else
- {
- return null;
- }
- }
-
- /**
- * Grabs all available enclosures (podcasts, etc.)
- *
- * Supports the <enclosure> RSS tag, as well as Media RSS and iTunes RSS.
- *
- * At this point, we're pretty much assuming that all enclosures for an item are the same content. Anything else is too complicated to properly support.
- *
- * @todo Add support for end-user defined sorting of enclosures by type/handler (so we can prefer the faster-loading FLV over MP4).
- * @todo If an element exists at a level, but it's value is empty, we should fall back to the value from the parent (if it exists).
- */
- function get_enclosures()
- {
- if (!isset($this->data['enclosures']))
- {
- $this->data['enclosures'] = array();
-
- // Elements
- $captions_parent = null;
- $categories_parent = null;
- $copyrights_parent = null;
- $credits_parent = null;
- $description_parent = null;
- $duration_parent = null;
- $hashes_parent = null;
- $keywords_parent = null;
- $player_parent = null;
- $ratings_parent = null;
- $restrictions_parent = null;
- $thumbnails_parent = null;
- $title_parent = null;
-
- // Let's do the channel and item-level ones first, and just re-use them if we need to.
- $parent = $this->get_feed();
-
- // CAPTIONS
- if ($captions = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'text'))
- {
- foreach ($captions as $caption)
- {
- $caption_type = null;
- $caption_lang = null;
- $caption_startTime = null;
- $caption_endTime = null;
- $caption_text = null;
- if (isset($caption['attribs']['']['type']))
- {
- $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($caption['attribs']['']['lang']))
- {
- $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($caption['attribs']['']['start']))
- {
- $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($caption['attribs']['']['end']))
- {
- $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($caption['data']))
- {
- $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- $captions_parent[] = new $this->feed->caption_class($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text);
- }
- }
- elseif ($captions = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'text'))
- {
- foreach ($captions as $caption)
- {
- $caption_type = null;
- $caption_lang = null;
- $caption_startTime = null;
- $caption_endTime = null;
- $caption_text = null;
- if (isset($caption['attribs']['']['type']))
- {
- $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($caption['attribs']['']['lang']))
- {
- $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($caption['attribs']['']['start']))
- {
- $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($caption['attribs']['']['end']))
- {
- $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($caption['data']))
- {
- $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- $captions_parent[] = new $this->feed->caption_class($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text);
- }
- }
- if (is_array($captions_parent))
- {
- $captions_parent = array_values(SimplePie_Misc::array_unique($captions_parent));
- }
-
- // CATEGORIES
- foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'category') as $category)
- {
- $term = null;
- $scheme = null;
- $label = null;
- if (isset($category['data']))
- {
- $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($category['attribs']['']['scheme']))
- {
- $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- else
- {
- $scheme = 'http://search.yahoo.com/mrss/category_schema';
- }
- if (isset($category['attribs']['']['label']))
- {
- $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- $categories_parent[] = new $this->feed->category_class($term, $scheme, $label);
- }
- foreach ((array) $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'category') as $category)
- {
- $term = null;
- $scheme = null;
- $label = null;
- if (isset($category['data']))
- {
- $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($category['attribs']['']['scheme']))
- {
- $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- else
- {
- $scheme = 'http://search.yahoo.com/mrss/category_schema';
- }
- if (isset($category['attribs']['']['label']))
- {
- $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- $categories_parent[] = new $this->feed->category_class($term, $scheme, $label);
- }
- foreach ((array) $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'category') as $category)
- {
- $term = null;
- $scheme = 'http://www.itunes.com/dtds/podcast-1.0.dtd';
- $label = null;
- if (isset($category['attribs']['']['text']))
- {
- $label = $this->sanitize($category['attribs']['']['text'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- $categories_parent[] = new $this->feed->category_class($term, $scheme, $label);
-
- if (isset($category['child'][SIMPLEPIE_NAMESPACE_ITUNES]['category']))
- {
- foreach ((array) $category['child'][SIMPLEPIE_NAMESPACE_ITUNES]['category'] as $subcategory)
- {
- if (isset($subcategory['attribs']['']['text']))
- {
- $label = $this->sanitize($subcategory['attribs']['']['text'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- $categories_parent[] = new $this->feed->category_class($term, $scheme, $label);
- }
- }
- }
- if (is_array($categories_parent))
- {
- $categories_parent = array_values(SimplePie_Misc::array_unique($categories_parent));
- }
-
- // COPYRIGHT
- if ($copyright = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'copyright'))
- {
- $copyright_url = null;
- $copyright_label = null;
- if (isset($copyright[0]['attribs']['']['url']))
- {
- $copyright_url = $this->sanitize($copyright[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($copyright[0]['data']))
- {
- $copyright_label = $this->sanitize($copyright[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- $copyrights_parent = new $this->feed->copyright_class($copyright_url, $copyright_label);
- }
- elseif ($copyright = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'copyright'))
- {
- $copyright_url = null;
- $copyright_label = null;
- if (isset($copyright[0]['attribs']['']['url']))
- {
- $copyright_url = $this->sanitize($copyright[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($copyright[0]['data']))
- {
- $copyright_label = $this->sanitize($copyright[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- $copyrights_parent = new $this->feed->copyright_class($copyright_url, $copyright_label);
- }
-
- // CREDITS
- if ($credits = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'credit'))
- {
- foreach ($credits as $credit)
- {
- $credit_role = null;
- $credit_scheme = null;
- $credit_name = null;
- if (isset($credit['attribs']['']['role']))
- {
- $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($credit['attribs']['']['scheme']))
- {
- $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- else
- {
- $credit_scheme = 'urn:ebu';
- }
- if (isset($credit['data']))
- {
- $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- $credits_parent[] = new $this->feed->credit_class($credit_role, $credit_scheme, $credit_name);
- }
- }
- elseif ($credits = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'credit'))
- {
- foreach ($credits as $credit)
- {
- $credit_role = null;
- $credit_scheme = null;
- $credit_name = null;
- if (isset($credit['attribs']['']['role']))
- {
- $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($credit['attribs']['']['scheme']))
- {
- $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- else
- {
- $credit_scheme = 'urn:ebu';
- }
- if (isset($credit['data']))
- {
- $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- $credits_parent[] = new $this->feed->credit_class($credit_role, $credit_scheme, $credit_name);
- }
- }
- if (is_array($credits_parent))
- {
- $credits_parent = array_values(SimplePie_Misc::array_unique($credits_parent));
- }
-
- // DESCRIPTION
- if ($description_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'description'))
- {
- if (isset($description_parent[0]['data']))
- {
- $description_parent = $this->sanitize($description_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- }
- elseif ($description_parent = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'description'))
- {
- if (isset($description_parent[0]['data']))
- {
- $description_parent = $this->sanitize($description_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- }
-
- // DURATION
- if ($duration_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'duration'))
- {
- $seconds = null;
- $minutes = null;
- $hours = null;
- if (isset($duration_parent[0]['data']))
- {
- $temp = explode(':', $this->sanitize($duration_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
- if (sizeof($temp) > 0)
- {
- (int) $seconds = array_pop($temp);
- }
- if (sizeof($temp) > 0)
- {
- (int) $minutes = array_pop($temp);
- $seconds += $minutes * 60;
- }
- if (sizeof($temp) > 0)
- {
- (int) $hours = array_pop($temp);
- $seconds += $hours * 3600;
- }
- unset($temp);
- $duration_parent = $seconds;
- }
- }
-
- // HASHES
- if ($hashes_iterator = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'hash'))
- {
- foreach ($hashes_iterator as $hash)
- {
- $value = null;
- $algo = null;
- if (isset($hash['data']))
- {
- $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($hash['attribs']['']['algo']))
- {
- $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- else
- {
- $algo = 'md5';
- }
- $hashes_parent[] = $algo.':'.$value;
- }
- }
- elseif ($hashes_iterator = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'hash'))
- {
- foreach ($hashes_iterator as $hash)
- {
- $value = null;
- $algo = null;
- if (isset($hash['data']))
- {
- $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($hash['attribs']['']['algo']))
- {
- $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- else
- {
- $algo = 'md5';
- }
- $hashes_parent[] = $algo.':'.$value;
- }
- }
- if (is_array($hashes_parent))
- {
- $hashes_parent = array_values(SimplePie_Misc::array_unique($hashes_parent));
- }
-
- // KEYWORDS
- if ($keywords = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'keywords'))
- {
- if (isset($keywords[0]['data']))
- {
- $temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
- foreach ($temp as $word)
- {
- $keywords_parent[] = trim($word);
- }
- }
- unset($temp);
- }
- elseif ($keywords = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'keywords'))
- {
- if (isset($keywords[0]['data']))
- {
- $temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
- foreach ($temp as $word)
- {
- $keywords_parent[] = trim($word);
- }
- }
- unset($temp);
- }
- elseif ($keywords = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'keywords'))
- {
- if (isset($keywords[0]['data']))
- {
- $temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
- foreach ($temp as $word)
- {
- $keywords_parent[] = trim($word);
- }
- }
- unset($temp);
- }
- elseif ($keywords = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'keywords'))
- {
- if (isset($keywords[0]['data']))
- {
- $temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
- foreach ($temp as $word)
- {
- $keywords_parent[] = trim($word);
- }
- }
- unset($temp);
- }
- if (is_array($keywords_parent))
- {
- $keywords_parent = array_values(SimplePie_Misc::array_unique($keywords_parent));
- }
-
- // PLAYER
- if ($player_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'player'))
- {
- if (isset($player_parent[0]['attribs']['']['url']))
- {
- $player_parent = $this->sanitize($player_parent[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
- }
- }
- elseif ($player_parent = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'player'))
- {
- if (isset($player_parent[0]['attribs']['']['url']))
- {
- $player_parent = $this->sanitize($player_parent[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
- }
- }
-
- // RATINGS
- if ($ratings = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'rating'))
- {
- foreach ($ratings as $rating)
- {
- $rating_scheme = null;
- $rating_value = null;
- if (isset($rating['attribs']['']['scheme']))
- {
- $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- else
- {
- $rating_scheme = 'urn:simple';
- }
- if (isset($rating['data']))
- {
- $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- $ratings_parent[] = new $this->feed->rating_class($rating_scheme, $rating_value);
- }
- }
- elseif ($ratings = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'explicit'))
- {
- foreach ($ratings as $rating)
- {
- $rating_scheme = 'urn:itunes';
- $rating_value = null;
- if (isset($rating['data']))
- {
- $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- $ratings_parent[] = new $this->feed->rating_class($rating_scheme, $rating_value);
- }
- }
- elseif ($ratings = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'rating'))
- {
- foreach ($ratings as $rating)
- {
- $rating_scheme = null;
- $rating_value = null;
- if (isset($rating['attribs']['']['scheme']))
- {
- $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- else
- {
- $rating_scheme = 'urn:simple';
- }
- if (isset($rating['data']))
- {
- $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- $ratings_parent[] = new $this->feed->rating_class($rating_scheme, $rating_value);
- }
- }
- elseif ($ratings = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'explicit'))
- {
- foreach ($ratings as $rating)
- {
- $rating_scheme = 'urn:itunes';
- $rating_value = null;
- if (isset($rating['data']))
- {
- $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- $ratings_parent[] = new $this->feed->rating_class($rating_scheme, $rating_value);
- }
- }
- if (is_array($ratings_parent))
- {
- $ratings_parent = array_values(SimplePie_Misc::array_unique($ratings_parent));
- }
-
- // RESTRICTIONS
- if ($restrictions = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'restriction'))
- {
- foreach ($restrictions as $restriction)
- {
- $restriction_relationship = null;
- $restriction_type = null;
- $restriction_value = null;
- if (isset($restriction['attribs']['']['relationship']))
- {
- $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($restriction['attribs']['']['type']))
- {
- $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($restriction['data']))
- {
- $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- $restrictions_parent[] = new $this->feed->restriction_class($restriction_relationship, $restriction_type, $restriction_value);
- }
- }
- elseif ($restrictions = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'block'))
- {
- foreach ($restrictions as $restriction)
- {
- $restriction_relationship = 'allow';
- $restriction_type = null;
- $restriction_value = 'itunes';
- if (isset($restriction['data']) && strtolower($restriction['data']) === 'yes')
- {
- $restriction_relationship = 'deny';
- }
- $restrictions_parent[] = new $this->feed->restriction_class($restriction_relationship, $restriction_type, $restriction_value);
- }
- }
- elseif ($restrictions = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'restriction'))
- {
- foreach ($restrictions as $restriction)
- {
- $restriction_relationship = null;
- $restriction_type = null;
- $restriction_value = null;
- if (isset($restriction['attribs']['']['relationship']))
- {
- $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($restriction['attribs']['']['type']))
- {
- $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($restriction['data']))
- {
- $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- $restrictions_parent[] = new $this->feed->restriction_class($restriction_relationship, $restriction_type, $restriction_value);
- }
- }
- elseif ($restrictions = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'block'))
- {
- foreach ($restrictions as $restriction)
- {
- $restriction_relationship = 'allow';
- $restriction_type = null;
- $restriction_value = 'itunes';
- if (isset($restriction['data']) && strtolower($restriction['data']) === 'yes')
- {
- $restriction_relationship = 'deny';
- }
- $restrictions_parent[] = new $this->feed->restriction_class($restriction_relationship, $restriction_type, $restriction_value);
- }
- }
- if (is_array($restrictions_parent))
- {
- $restrictions_parent = array_values(SimplePie_Misc::array_unique($restrictions_parent));
- }
-
- // THUMBNAILS
- if ($thumbnails = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'thumbnail'))
- {
- foreach ($thumbnails as $thumbnail)
- {
- if (isset($thumbnail['attribs']['']['url']))
- {
- $thumbnails_parent[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
- }
- }
- }
- elseif ($thumbnails = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'thumbnail'))
- {
- foreach ($thumbnails as $thumbnail)
- {
- if (isset($thumbnail['attribs']['']['url']))
- {
- $thumbnails_parent[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
- }
- }
- }
-
- // TITLES
- if ($title_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'title'))
- {
- if (isset($title_parent[0]['data']))
- {
- $title_parent = $this->sanitize($title_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- }
- elseif ($title_parent = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'title'))
- {
- if (isset($title_parent[0]['data']))
- {
- $title_parent = $this->sanitize($title_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- }
-
- // Clear the memory
- unset($parent);
-
- // Attributes
- $bitrate = null;
- $channels = null;
- $duration = null;
- $expression = null;
- $framerate = null;
- $height = null;
- $javascript = null;
- $lang = null;
- $length = null;
- $medium = null;
- $samplingrate = null;
- $type = null;
- $url = null;
- $width = null;
-
- // Elements
- $captions = null;
- $categories = null;
- $copyrights = null;
- $credits = null;
- $description = null;
- $hashes = null;
- $keywords = null;
- $player = null;
- $ratings = null;
- $restrictions = null;
- $thumbnails = null;
- $title = null;
-
- // If we have media:group tags, loop through them.
- foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'group') as $group)
- {
- if(isset($group['child']) && isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content']))
- {
- // If we have media:content tags, loop through them.
- foreach ((array) $group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content'] as $content)
- {
- if (isset($content['attribs']['']['url']))
- {
- // Attributes
- $bitrate = null;
- $channels = null;
- $duration = null;
- $expression = null;
- $framerate = null;
- $height = null;
- $javascript = null;
- $lang = null;
- $length = null;
- $medium = null;
- $samplingrate = null;
- $type = null;
- $url = null;
- $width = null;
-
- // Elements
- $captions = null;
- $categories = null;
- $copyrights = null;
- $credits = null;
- $description = null;
- $hashes = null;
- $keywords = null;
- $player = null;
- $ratings = null;
- $restrictions = null;
- $thumbnails = null;
- $title = null;
-
- // Start checking the attributes of media:content
- if (isset($content['attribs']['']['bitrate']))
- {
- $bitrate = $this->sanitize($content['attribs']['']['bitrate'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($content['attribs']['']['channels']))
- {
- $channels = $this->sanitize($content['attribs']['']['channels'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($content['attribs']['']['duration']))
- {
- $duration = $this->sanitize($content['attribs']['']['duration'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- else
- {
- $duration = $duration_parent;
- }
- if (isset($content['attribs']['']['expression']))
- {
- $expression = $this->sanitize($content['attribs']['']['expression'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($content['attribs']['']['framerate']))
- {
- $framerate = $this->sanitize($content['attribs']['']['framerate'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($content['attribs']['']['height']))
- {
- $height = $this->sanitize($content['attribs']['']['height'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($content['attribs']['']['lang']))
- {
- $lang = $this->sanitize($content['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($content['attribs']['']['fileSize']))
- {
- $length = ceil($content['attribs']['']['fileSize']);
- }
- if (isset($content['attribs']['']['medium']))
- {
- $medium = $this->sanitize($content['attribs']['']['medium'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($content['attribs']['']['samplingrate']))
- {
- $samplingrate = $this->sanitize($content['attribs']['']['samplingrate'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($content['attribs']['']['type']))
- {
- $type = $this->sanitize($content['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($content['attribs']['']['width']))
- {
- $width = $this->sanitize($content['attribs']['']['width'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- $url = $this->sanitize($content['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
-
- // Checking the other optional media: elements. Priority: media:content, media:group, item, channel
-
- // CAPTIONS
- if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text']))
- {
- foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'] as $caption)
- {
- $caption_type = null;
- $caption_lang = null;
- $caption_startTime = null;
- $caption_endTime = null;
- $caption_text = null;
- if (isset($caption['attribs']['']['type']))
- {
- $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($caption['attribs']['']['lang']))
- {
- $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($caption['attribs']['']['start']))
- {
- $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($caption['attribs']['']['end']))
- {
- $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($caption['data']))
- {
- $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- $captions[] = new $this->feed->caption_class($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text);
- }
- if (is_array($captions))
- {
- $captions = array_values(SimplePie_Misc::array_unique($captions));
- }
- }
- elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text']))
- {
- foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'] as $caption)
- {
- $caption_type = null;
- $caption_lang = null;
- $caption_startTime = null;
- $caption_endTime = null;
- $caption_text = null;
- if (isset($caption['attribs']['']['type']))
- {
- $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($caption['attribs']['']['lang']))
- {
- $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($caption['attribs']['']['start']))
- {
- $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($caption['attribs']['']['end']))
- {
- $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($caption['data']))
- {
- $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- $captions[] = new $this->feed->caption_class($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text);
- }
- if (is_array($captions))
- {
- $captions = array_values(SimplePie_Misc::array_unique($captions));
- }
- }
- else
- {
- $captions = $captions_parent;
- }
-
- // CATEGORIES
- if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category']))
- {
- foreach ((array) $content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'] as $category)
- {
- $term = null;
- $scheme = null;
- $label = null;
- if (isset($category['data']))
- {
- $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($category['attribs']['']['scheme']))
- {
- $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- else
- {
- $scheme = 'http://search.yahoo.com/mrss/category_schema';
- }
- if (isset($category['attribs']['']['label']))
- {
- $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- $categories[] = new $this->feed->category_class($term, $scheme, $label);
- }
- }
- if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category']))
- {
- foreach ((array) $group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'] as $category)
- {
- $term = null;
- $scheme = null;
- $label = null;
- if (isset($category['data']))
- {
- $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($category['attribs']['']['scheme']))
- {
- $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- else
- {
- $scheme = 'http://search.yahoo.com/mrss/category_schema';
- }
- if (isset($category['attribs']['']['label']))
- {
- $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- $categories[] = new $this->feed->category_class($term, $scheme, $label);
- }
- }
- if (is_array($categories) && is_array($categories_parent))
- {
- $categories = array_values(SimplePie_Misc::array_unique(array_merge($categories, $categories_parent)));
- }
- elseif (is_array($categories))
- {
- $categories = array_values(SimplePie_Misc::array_unique($categories));
- }
- elseif (is_array($categories_parent))
- {
- $categories = array_values(SimplePie_Misc::array_unique($categories_parent));
- }
-
- // COPYRIGHTS
- if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright']))
- {
- $copyright_url = null;
- $copyright_label = null;
- if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url']))
- {
- $copyright_url = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data']))
- {
- $copyright_label = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- $copyrights = new $this->feed->copyright_class($copyright_url, $copyright_label);
- }
- elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright']))
- {
- $copyright_url = null;
- $copyright_label = null;
- if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url']))
- {
- $copyright_url = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data']))
- {
- $copyright_label = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- $copyrights = new $this->feed->copyright_class($copyright_url, $copyright_label);
- }
- else
- {
- $copyrights = $copyrights_parent;
- }
-
- // CREDITS
- if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit']))
- {
- foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'] as $credit)
- {
- $credit_role = null;
- $credit_scheme = null;
- $credit_name = null;
- if (isset($credit['attribs']['']['role']))
- {
- $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($credit['attribs']['']['scheme']))
- {
- $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- else
- {
- $credit_scheme = 'urn:ebu';
- }
- if (isset($credit['data']))
- {
- $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- $credits[] = new $this->feed->credit_class($credit_role, $credit_scheme, $credit_name);
- }
- if (is_array($credits))
- {
- $credits = array_values(SimplePie_Misc::array_unique($credits));
- }
- }
- elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit']))
- {
- foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'] as $credit)
- {
- $credit_role = null;
- $credit_scheme = null;
- $credit_name = null;
- if (isset($credit['attribs']['']['role']))
- {
- $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($credit['attribs']['']['scheme']))
- {
- $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- else
- {
- $credit_scheme = 'urn:ebu';
- }
- if (isset($credit['data']))
- {
- $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- $credits[] = new $this->feed->credit_class($credit_role, $credit_scheme, $credit_name);
- }
- if (is_array($credits))
- {
- $credits = array_values(SimplePie_Misc::array_unique($credits));
- }
- }
- else
- {
- $credits = $credits_parent;
- }
-
- // DESCRIPTION
- if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description']))
- {
- $description = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description']))
- {
- $description = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- else
- {
- $description = $description_parent;
- }
-
- // HASHES
- if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash']))
- {
- foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'] as $hash)
- {
- $value = null;
- $algo = null;
- if (isset($hash['data']))
- {
- $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($hash['attribs']['']['algo']))
- {
- $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- else
- {
- $algo = 'md5';
- }
- $hashes[] = $algo.':'.$value;
- }
- if (is_array($hashes))
- {
- $hashes = array_values(SimplePie_Misc::array_unique($hashes));
- }
- }
- elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash']))
- {
- foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'] as $hash)
- {
- $value = null;
- $algo = null;
- if (isset($hash['data']))
- {
- $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($hash['attribs']['']['algo']))
- {
- $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- else
- {
- $algo = 'md5';
- }
- $hashes[] = $algo.':'.$value;
- }
- if (is_array($hashes))
- {
- $hashes = array_values(SimplePie_Misc::array_unique($hashes));
- }
- }
- else
- {
- $hashes = $hashes_parent;
- }
-
- // KEYWORDS
- if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords']))
- {
- if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data']))
- {
- $temp = explode(',', $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
- foreach ($temp as $word)
- {
- $keywords[] = trim($word);
- }
- unset($temp);
- }
- if (is_array($keywords))
- {
- $keywords = array_values(SimplePie_Misc::array_unique($keywords));
- }
- }
- elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords']))
- {
- if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data']))
- {
- $temp = explode(',', $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
- foreach ($temp as $word)
- {
- $keywords[] = trim($word);
- }
- unset($temp);
- }
- if (is_array($keywords))
- {
- $keywords = array_values(SimplePie_Misc::array_unique($keywords));
- }
- }
- else
- {
- $keywords = $keywords_parent;
- }
-
- // PLAYER
- if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player']))
- {
- $player = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
- }
- elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player']))
- {
- $player = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
- }
- else
- {
- $player = $player_parent;
- }
-
- // RATINGS
- if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating']))
- {
- foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'] as $rating)
- {
- $rating_scheme = null;
- $rating_value = null;
- if (isset($rating['attribs']['']['scheme']))
- {
- $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- else
- {
- $rating_scheme = 'urn:simple';
- }
- if (isset($rating['data']))
- {
- $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- $ratings[] = new $this->feed->rating_class($rating_scheme, $rating_value);
- }
- if (is_array($ratings))
- {
- $ratings = array_values(SimplePie_Misc::array_unique($ratings));
- }
- }
- elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating']))
- {
- foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'] as $rating)
- {
- $rating_scheme = null;
- $rating_value = null;
- if (isset($rating['attribs']['']['scheme']))
- {
- $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- else
- {
- $rating_scheme = 'urn:simple';
- }
- if (isset($rating['data']))
- {
- $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- $ratings[] = new $this->feed->rating_class($rating_scheme, $rating_value);
- }
- if (is_array($ratings))
- {
- $ratings = array_values(SimplePie_Misc::array_unique($ratings));
- }
- }
- else
- {
- $ratings = $ratings_parent;
- }
-
- // RESTRICTIONS
- if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction']))
- {
- foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'] as $restriction)
- {
- $restriction_relationship = null;
- $restriction_type = null;
- $restriction_value = null;
- if (isset($restriction['attribs']['']['relationship']))
- {
- $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($restriction['attribs']['']['type']))
- {
- $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($restriction['data']))
- {
- $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- $restrictions[] = new $this->feed->restriction_class($restriction_relationship, $restriction_type, $restriction_value);
- }
- if (is_array($restrictions))
- {
- $restrictions = array_values(SimplePie_Misc::array_unique($restrictions));
- }
- }
- elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction']))
- {
- foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'] as $restriction)
- {
- $restriction_relationship = null;
- $restriction_type = null;
- $restriction_value = null;
- if (isset($restriction['attribs']['']['relationship']))
- {
- $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($restriction['attribs']['']['type']))
- {
- $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($restriction['data']))
- {
- $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- $restrictions[] = new $this->feed->restriction_class($restriction_relationship, $restriction_type, $restriction_value);
- }
- if (is_array($restrictions))
- {
- $restrictions = array_values(SimplePie_Misc::array_unique($restrictions));
- }
- }
- else
- {
- $restrictions = $restrictions_parent;
- }
-
- // THUMBNAILS
- if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail']))
- {
- foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'] as $thumbnail)
- {
- $thumbnails[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
- }
- if (is_array($thumbnails))
- {
- $thumbnails = array_values(SimplePie_Misc::array_unique($thumbnails));
- }
- }
- elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail']))
- {
- foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'] as $thumbnail)
- {
- $thumbnails[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
- }
- if (is_array($thumbnails))
- {
- $thumbnails = array_values(SimplePie_Misc::array_unique($thumbnails));
- }
- }
- else
- {
- $thumbnails = $thumbnails_parent;
- }
-
- // TITLES
- if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title']))
- {
- $title = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title']))
- {
- $title = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- else
- {
- $title = $title_parent;
- }
-
- $this->data['enclosures'][] = new $this->feed->enclosure_class($url, $type, $length, $this->feed->javascript, $bitrate, $captions, $categories, $channels, $copyrights, $credits, $description, $duration, $expression, $framerate, $hashes, $height, $keywords, $lang, $medium, $player, $ratings, $restrictions, $samplingrate, $thumbnails, $title, $width);
- }
- }
- }
- }
-
- // If we have standalone media:content tags, loop through them.
- if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content']))
- {
- foreach ((array) $this->data['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content'] as $content)
- {
- if (isset($content['attribs']['']['url']))
- {
- // Attributes
- $bitrate = null;
- $channels = null;
- $duration = null;
- $expression = null;
- $framerate = null;
- $height = null;
- $javascript = null;
- $lang = null;
- $length = null;
- $medium = null;
- $samplingrate = null;
- $type = null;
- $url = null;
- $width = null;
-
- // Elements
- $captions = null;
- $categories = null;
- $copyrights = null;
- $credits = null;
- $description = null;
- $hashes = null;
- $keywords = null;
- $player = null;
- $ratings = null;
- $restrictions = null;
- $thumbnails = null;
- $title = null;
-
- // Start checking the attributes of media:content
- if (isset($content['attribs']['']['bitrate']))
- {
- $bitrate = $this->sanitize($content['attribs']['']['bitrate'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($content['attribs']['']['channels']))
- {
- $channels = $this->sanitize($content['attribs']['']['channels'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($content['attribs']['']['duration']))
- {
- $duration = $this->sanitize($content['attribs']['']['duration'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- else
- {
- $duration = $duration_parent;
- }
- if (isset($content['attribs']['']['expression']))
- {
- $expression = $this->sanitize($content['attribs']['']['expression'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($content['attribs']['']['framerate']))
- {
- $framerate = $this->sanitize($content['attribs']['']['framerate'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($content['attribs']['']['height']))
- {
- $height = $this->sanitize($content['attribs']['']['height'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($content['attribs']['']['lang']))
- {
- $lang = $this->sanitize($content['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($content['attribs']['']['fileSize']))
- {
- $length = ceil($content['attribs']['']['fileSize']);
- }
- if (isset($content['attribs']['']['medium']))
- {
- $medium = $this->sanitize($content['attribs']['']['medium'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($content['attribs']['']['samplingrate']))
- {
- $samplingrate = $this->sanitize($content['attribs']['']['samplingrate'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($content['attribs']['']['type']))
- {
- $type = $this->sanitize($content['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($content['attribs']['']['width']))
- {
- $width = $this->sanitize($content['attribs']['']['width'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- $url = $this->sanitize($content['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
-
- // Checking the other optional media: elements. Priority: media:content, media:group, item, channel
-
- // CAPTIONS
- if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text']))
- {
- foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'] as $caption)
- {
- $caption_type = null;
- $caption_lang = null;
- $caption_startTime = null;
- $caption_endTime = null;
- $caption_text = null;
- if (isset($caption['attribs']['']['type']))
- {
- $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($caption['attribs']['']['lang']))
- {
- $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($caption['attribs']['']['start']))
- {
- $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($caption['attribs']['']['end']))
- {
- $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($caption['data']))
- {
- $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- $captions[] = new $this->feed->caption_class($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text);
- }
- if (is_array($captions))
- {
- $captions = array_values(SimplePie_Misc::array_unique($captions));
- }
- }
- else
- {
- $captions = $captions_parent;
- }
-
- // CATEGORIES
- if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category']))
- {
- foreach ((array) $content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'] as $category)
- {
- $term = null;
- $scheme = null;
- $label = null;
- if (isset($category['data']))
- {
- $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($category['attribs']['']['scheme']))
- {
- $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- else
- {
- $scheme = 'http://search.yahoo.com/mrss/category_schema';
- }
- if (isset($category['attribs']['']['label']))
- {
- $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- $categories[] = new $this->feed->category_class($term, $scheme, $label);
- }
- }
- if (is_array($categories) && is_array($categories_parent))
- {
- $categories = array_values(SimplePie_Misc::array_unique(array_merge($categories, $categories_parent)));
- }
- elseif (is_array($categories))
- {
- $categories = array_values(SimplePie_Misc::array_unique($categories));
- }
- elseif (is_array($categories_parent))
- {
- $categories = array_values(SimplePie_Misc::array_unique($categories_parent));
- }
- else
- {
- $categories = null;
- }
-
- // COPYRIGHTS
- if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright']))
- {
- $copyright_url = null;
- $copyright_label = null;
- if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url']))
- {
- $copyright_url = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data']))
- {
- $copyright_label = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- $copyrights = new $this->feed->copyright_class($copyright_url, $copyright_label);
- }
- else
- {
- $copyrights = $copyrights_parent;
- }
-
- // CREDITS
- if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit']))
- {
- foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'] as $credit)
- {
- $credit_role = null;
- $credit_scheme = null;
- $credit_name = null;
- if (isset($credit['attribs']['']['role']))
- {
- $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($credit['attribs']['']['scheme']))
- {
- $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- else
- {
- $credit_scheme = 'urn:ebu';
- }
- if (isset($credit['data']))
- {
- $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- $credits[] = new $this->feed->credit_class($credit_role, $credit_scheme, $credit_name);
- }
- if (is_array($credits))
- {
- $credits = array_values(SimplePie_Misc::array_unique($credits));
- }
- }
- else
- {
- $credits = $credits_parent;
- }
-
- // DESCRIPTION
- if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description']))
- {
- $description = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- else
- {
- $description = $description_parent;
- }
-
- // HASHES
- if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash']))
- {
- foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'] as $hash)
- {
- $value = null;
- $algo = null;
- if (isset($hash['data']))
- {
- $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($hash['attribs']['']['algo']))
- {
- $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- else
- {
- $algo = 'md5';
- }
- $hashes[] = $algo.':'.$value;
- }
- if (is_array($hashes))
- {
- $hashes = array_values(SimplePie_Misc::array_unique($hashes));
- }
- }
- else
- {
- $hashes = $hashes_parent;
- }
-
- // KEYWORDS
- if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords']))
- {
- if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data']))
- {
- $temp = explode(',', $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
- foreach ($temp as $word)
- {
- $keywords[] = trim($word);
- }
- unset($temp);
- }
- if (is_array($keywords))
- {
- $keywords = array_values(SimplePie_Misc::array_unique($keywords));
- }
- }
- else
- {
- $keywords = $keywords_parent;
- }
-
- // PLAYER
- if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player']))
- {
- $player = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
- }
- else
- {
- $player = $player_parent;
- }
-
- // RATINGS
- if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating']))
- {
- foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'] as $rating)
- {
- $rating_scheme = null;
- $rating_value = null;
- if (isset($rating['attribs']['']['scheme']))
- {
- $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- else
- {
- $rating_scheme = 'urn:simple';
- }
- if (isset($rating['data']))
- {
- $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- $ratings[] = new $this->feed->rating_class($rating_scheme, $rating_value);
- }
- if (is_array($ratings))
- {
- $ratings = array_values(SimplePie_Misc::array_unique($ratings));
- }
- }
- else
- {
- $ratings = $ratings_parent;
- }
-
- // RESTRICTIONS
- if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction']))
- {
- foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'] as $restriction)
- {
- $restriction_relationship = null;
- $restriction_type = null;
- $restriction_value = null;
- if (isset($restriction['attribs']['']['relationship']))
- {
- $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($restriction['attribs']['']['type']))
- {
- $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($restriction['data']))
- {
- $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- $restrictions[] = new $this->feed->restriction_class($restriction_relationship, $restriction_type, $restriction_value);
- }
- if (is_array($restrictions))
- {
- $restrictions = array_values(SimplePie_Misc::array_unique($restrictions));
- }
- }
- else
- {
- $restrictions = $restrictions_parent;
- }
-
- // THUMBNAILS
- if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail']))
- {
- foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'] as $thumbnail)
- {
- $thumbnails[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
- }
- if (is_array($thumbnails))
- {
- $thumbnails = array_values(SimplePie_Misc::array_unique($thumbnails));
- }
- }
- else
- {
- $thumbnails = $thumbnails_parent;
- }
-
- // TITLES
- if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title']))
- {
- $title = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- else
- {
- $title = $title_parent;
- }
-
- $this->data['enclosures'][] = new $this->feed->enclosure_class($url, $type, $length, $this->feed->javascript, $bitrate, $captions, $categories, $channels, $copyrights, $credits, $description, $duration, $expression, $framerate, $hashes, $height, $keywords, $lang, $medium, $player, $ratings, $restrictions, $samplingrate, $thumbnails, $title, $width);
- }
- }
- }
-
- foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'link') as $link)
- {
- if (isset($link['attribs']['']['href']) && !empty($link['attribs']['']['rel']) && $link['attribs']['']['rel'] === 'enclosure')
- {
- // Attributes
- $bitrate = null;
- $channels = null;
- $duration = null;
- $expression = null;
- $framerate = null;
- $height = null;
- $javascript = null;
- $lang = null;
- $length = null;
- $medium = null;
- $samplingrate = null;
- $type = null;
- $url = null;
- $width = null;
- $title = $title_parent;
-
- $url = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));
- if (isset($link['attribs']['']['type']))
- {
- $type = $this->sanitize($link['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($link['attribs']['']['length']))
- {
- $length = ceil($link['attribs']['']['length']);
- }
- if (isset($link['attribs']['']['title']))
- {
- $title = $this->sanitize($link['attribs']['']['title'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
-
- // Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor
- $this->data['enclosures'][] = new $this->feed->enclosure_class($url, $type, $length, $this->feed->javascript, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title, $width);
- }
- }
-
- foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'link') as $link)
- {
- if (isset($link['attribs']['']['href']) && !empty($link['attribs']['']['rel']) && $link['attribs']['']['rel'] === 'enclosure')
- {
- // Attributes
- $bitrate = null;
- $channels = null;
- $duration = null;
- $expression = null;
- $framerate = null;
- $height = null;
- $javascript = null;
- $lang = null;
- $length = null;
- $medium = null;
- $samplingrate = null;
- $type = null;
- $url = null;
- $width = null;
-
- $url = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));
- if (isset($link['attribs']['']['type']))
- {
- $type = $this->sanitize($link['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($link['attribs']['']['length']))
- {
- $length = ceil($link['attribs']['']['length']);
- }
-
- // Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor
- $this->data['enclosures'][] = new $this->feed->enclosure_class($url, $type, $length, $this->feed->javascript, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title_parent, $width);
- }
- }
-
- if ($enclosure = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'enclosure'))
- {
- if (isset($enclosure[0]['attribs']['']['url']))
- {
- // Attributes
- $bitrate = null;
- $channels = null;
- $duration = null;
- $expression = null;
- $framerate = null;
- $height = null;
- $javascript = null;
- $lang = null;
- $length = null;
- $medium = null;
- $samplingrate = null;
- $type = null;
- $url = null;
- $width = null;
-
- $url = $this->sanitize($enclosure[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($enclosure[0]));
- if (isset($enclosure[0]['attribs']['']['type']))
- {
- $type = $this->sanitize($enclosure[0]['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($enclosure[0]['attribs']['']['length']))
- {
- $length = ceil($enclosure[0]['attribs']['']['length']);
- }
-
- // Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor
- $this->data['enclosures'][] = new $this->feed->enclosure_class($url, $type, $length, $this->feed->javascript, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title_parent, $width);
- }
- }
-
- if (sizeof($this->data['enclosures']) === 0 && ($url || $type || $length || $bitrate || $captions_parent || $categories_parent || $channels || $copyrights_parent || $credits_parent || $description_parent || $duration_parent || $expression || $framerate || $hashes_parent || $height || $keywords_parent || $lang || $medium || $player_parent || $ratings_parent || $restrictions_parent || $samplingrate || $thumbnails_parent || $title_parent || $width))
- {
- // Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor
- $this->data['enclosures'][] = new $this->feed->enclosure_class($url, $type, $length, $this->feed->javascript, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title_parent, $width);
- }
-
- $this->data['enclosures'] = array_values(SimplePie_Misc::array_unique($this->data['enclosures']));
- }
- if (!empty($this->data['enclosures']))
- {
- return $this->data['enclosures'];
- }
- else
- {
- return null;
- }
- }
-
- function get_latitude()
- {
- if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lat'))
- {
- return (float) $return[0]['data'];
- }
- elseif (($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match))
- {
- return (float) $match[1];
- }
- else
- {
- return null;
- }
- }
-
- function get_longitude()
- {
- if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'long'))
- {
- return (float) $return[0]['data'];
- }
- elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lon'))
- {
- return (float) $return[0]['data'];
- }
- elseif (($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match))
- {
- return (float) $match[2];
- }
- else
- {
- return null;
- }
- }
-
- function get_source()
- {
- if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'source'))
- {
- return new $this->feed->source_class($this, $return[0]);
- }
- else
- {
- return null;
- }
- }
-
- /**
- * Creates the add_to_* methods' return data
- *
- * @access private
- * @param string $item_url String to prefix to the item permalink
- * @param string $title_url String to prefix to the item title
- * (and suffix to the item permalink)
- * @return mixed URL if feed exists, false otherwise
- */
- function add_to_service($item_url, $title_url = null, $summary_url = null)
- {
- if ($this->get_permalink() !== null)
- {
- $return = $item_url . rawurlencode($this->get_permalink());
- if ($title_url !== null && $this->get_title() !== null)
- {
- $return .= $title_url . rawurlencode($this->get_title());
- }
- if ($summary_url !== null && $this->get_description() !== null)
- {
- $return .= $summary_url . rawurlencode($this->get_description());
- }
- return $this->sanitize($return, SIMPLEPIE_CONSTRUCT_IRI);
- }
- else
- {
- return null;
- }
- }
-
- function add_to_blinklist()
- {
- return $this->add_to_service('http://www.blinklist.com/index.php?Action=Blink/addblink.php&Description=&Url=', '&Title=');
- }
-
- function add_to_blogmarks()
- {
- return $this->add_to_service('http://blogmarks.net/my/new.php?mini=1&simple=1&url=', '&title=');
- }
-
- function add_to_delicious()
- {
- return $this->add_to_service('http://del.icio.us/post/?v=4&url=', '&title=');
- }
-
- function add_to_digg()
- {
- return $this->add_to_service('http://digg.com/submit?url=', '&title=', '&bodytext=');
- }
-
- function add_to_furl()
- {
- return $this->add_to_service('http://www.furl.net/storeIt.jsp?u=', '&t=');
- }
-
- function add_to_magnolia()
- {
- return $this->add_to_service('http://ma.gnolia.com/bookmarklet/add?url=', '&title=');
- }
-
- function add_to_myweb20()
- {
- return $this->add_to_service('http://myweb2.search.yahoo.com/myresults/bookmarklet?u=', '&t=');
- }
-
- function add_to_newsvine()
- {
- return $this->add_to_service('http://www.newsvine.com/_wine/save?u=', '&h=');
- }
-
- function add_to_reddit()
- {
- return $this->add_to_service('http://reddit.com/submit?url=', '&title=');
- }
-
- function add_to_segnalo()
- {
- return $this->add_to_service('http://segnalo.com/post.html.php?url=', '&title=');
- }
-
- function add_to_simpy()
- {
- return $this->add_to_service('http://www.simpy.com/simpy/LinkAdd.do?href=', '&title=');
- }
-
- function add_to_spurl()
- {
- return $this->add_to_service('http://www.spurl.net/spurl.php?v=3&url=', '&title=');
- }
-
- function add_to_wists()
- {
- return $this->add_to_service('http://wists.com/r.php?c=&r=', '&title=');
- }
-
- function search_technorati()
- {
- return $this->add_to_service('http://www.technorati.com/search/');
- }
-}
-
-class SimplePie_Source
-{
- var $item;
- var $data = array();
-
- function SimplePie_Source($item, $data)
- {
- $this->item = $item;
- $this->data = $data;
- }
-
- function __toString()
- {
- return md5(serialize($this->data));
- }
-
- function get_source_tags($namespace, $tag)
- {
- if (isset($this->data['child'][$namespace][$tag]))
- {
- return $this->data['child'][$namespace][$tag];
- }
- else
- {
- return null;
- }
- }
-
- function get_base($element = array())
- {
- return $this->item->get_base($element);
- }
-
- function sanitize($data, $type, $base = '')
- {
- return $this->item->sanitize($data, $type, $base);
- }
-
- function get_item()
- {
- return $this->item;
- }
-
- function get_title()
- {
- if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'title'))
- {
- return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0]));
- }
- elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'title'))
- {
- return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0]));
- }
- elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'title'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
- }
- elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'title'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
- }
- elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'title'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
- }
- elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'title'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'title'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- else
- {
- return null;
- }
- }
-
- function get_category($key = 0)
- {
- $categories = $this->get_categories();
- if (isset($categories[$key]))
- {
- return $categories[$key];
- }
- else
- {
- return null;
- }
- }
-
- function get_categories()
- {
- $categories = array();
-
- foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'category') as $category)
- {
- $term = null;
- $scheme = null;
- $label = null;
- if (isset($category['attribs']['']['term']))
- {
- $term = $this->sanitize($category['attribs']['']['term'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($category['attribs']['']['scheme']))
- {
- $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($category['attribs']['']['label']))
- {
- $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- $categories[] = new $this->item->feed->category_class($term, $scheme, $label);
- }
- foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'category') as $category)
- {
- // This is really the label, but keep this as the term also for BC.
- // Label will also work on retrieving because that falls back to term.
- $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- if (isset($category['attribs']['']['domain']))
- {
- $scheme = $this->sanitize($category['attribs']['']['domain'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- else
- {
- $scheme = null;
- }
- $categories[] = new $this->item->feed->category_class($term, $scheme, null);
- }
- foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'subject') as $category)
- {
- $categories[] = new $this->item->feed->category_class($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
- }
- foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'subject') as $category)
- {
- $categories[] = new $this->item->feed->category_class($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
- }
-
- if (!empty($categories))
- {
- return SimplePie_Misc::array_unique($categories);
- }
- else
- {
- return null;
- }
- }
-
- function get_author($key = 0)
- {
- $authors = $this->get_authors();
- if (isset($authors[$key]))
- {
- return $authors[$key];
- }
- else
- {
- return null;
- }
- }
-
- function get_authors()
- {
- $authors = array();
- foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'author') as $author)
- {
- $name = null;
- $uri = null;
- $email = null;
- $avatar = null;
- $name_date = null;
- $uri_date = null;
- $avatar_date = null;
-
- if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data']))
- {
- $name = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data']))
- {
- $uri = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]));
- }
- if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data']))
- {
- $email = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($author['child']['http://purl.org/macgirvin/dfrn/1.0']['avatar'][0]['data']))
- {
- $avatar = $this->sanitize($author['child']['http://purl.org/macgirvin/dfrn/1.0']['avatar'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author['child']['http://purl.org/macgirvin/dfrn/1.0']['avatar'][0]));
- }
- if (isset($author['child']['http://purl.org/macgirvin/dfrn/1.0']['name-updated'][0]['data']))
- {
- $name_date = $author['child']['http://purl.org/macgirvin/dfrn/1.0']['name-updated'][0]['data'];
- }
- if (isset($author['child']['http://purl.org/macgirvin/dfrn/1.0']['uri-updated'][0]['data']))
- {
- $uri_date = $author['child']['http://purl.org/macgirvin/dfrn/1.0']['uri-updated'][0]['data'];
- }
- if (isset($author['child']['http://purl.org/macgirvin/dfrn/1.0']['avatar-updated'][0]['data']))
- {
- $avatar_date = $author['child']['http://purl.org/macgirvin/dfrn/1.0']['avatar-updated'][0]['data'];
- }
-
- if ($name !== null || $email !== null || $uri !== null || $avatar !== null || $name_date !== null || $uri_date !== null || $avatar_date !== null )
- {
- $authors[] = new $this->item->feed->author_class($name, $uri, $email, $avatar, $name_date, $uri_date, $avatar_date);
- }
- }
- if ($author = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'author'))
- {
- $name = null;
- $url = null;
- $email = null;
- if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data']))
- {
- $name = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data']))
- {
- $url = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]));
- }
- if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data']))
- {
- $email = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if ($name !== null || $email !== null || $url !== null)
- {
- $authors[] = new $this->item->feed->author_class($name, $url, $email);
- }
- }
- foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'creator') as $author)
- {
- $authors[] = new $this->item->feed->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
- }
- foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'creator') as $author)
- {
- $authors[] = new $this->item->feed->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
- }
- foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'author') as $author)
- {
- $authors[] = new $this->item->feed->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
- }
-
- if (!empty($authors))
- {
- return SimplePie_Misc::array_unique($authors);
- }
- else
- {
- return null;
- }
- }
-
- function get_contributor($key = 0)
- {
- $contributors = $this->get_contributors();
- if (isset($contributors[$key]))
- {
- return $contributors[$key];
- }
- else
- {
- return null;
- }
- }
-
- function get_contributors()
- {
- $contributors = array();
- foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'contributor') as $contributor)
- {
- $name = null;
- $uri = null;
- $email = null;
- if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data']))
- {
- $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data']))
- {
- $uri = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]));
- }
- if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data']))
- {
- $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if ($name !== null || $email !== null || $uri !== null)
- {
- $contributors[] = new $this->item->feed->author_class($name, $uri, $email);
- }
- }
- foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'contributor') as $contributor)
- {
- $name = null;
- $url = null;
- $email = null;
- if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data']))
- {
- $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data']))
- {
- $url = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]));
- }
- if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data']))
- {
- $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- if ($name !== null || $email !== null || $url !== null)
- {
- $contributors[] = new $this->item->feed->author_class($name, $url, $email);
- }
- }
-
- if (!empty($contributors))
- {
- return SimplePie_Misc::array_unique($contributors);
- }
- else
- {
- return null;
- }
- }
-
- function get_link($key = 0, $rel = 'alternate')
- {
- $links = $this->get_links($rel);
- if (isset($links[$key]))
- {
- return $links[$key];
- }
- else
- {
- return null;
- }
- }
-
- /**
- * Added for parity between the parent-level and the item/entry-level.
- */
- function get_permalink()
- {
- return $this->get_link(0);
- }
-
- function get_links($rel = 'alternate')
- {
- if (!isset($this->data['links']))
- {
- $this->data['links'] = array();
- if ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'link'))
- {
- foreach ($links as $link)
- {
- if (isset($link['attribs']['']['href']))
- {
- $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate';
- $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));
- }
- }
- }
- if ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'link'))
- {
- foreach ($links as $link)
- {
- if (isset($link['attribs']['']['href']))
- {
- $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate';
- $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));
-
- }
- }
- }
- if ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'link'))
- {
- $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
- }
- if ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'link'))
- {
- $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
- }
- if ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'link'))
- {
- $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
- }
-
- $keys = array_keys($this->data['links']);
- foreach ($keys as $key)
- {
- if (SimplePie_Misc::is_isegment_nz_nc($key))
- {
- if (isset($this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]))
- {
- $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] = array_merge($this->data['links'][$key], $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]);
- $this->data['links'][$key] =& $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key];
- }
- else
- {
- $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] =& $this->data['links'][$key];
- }
- }
- elseif (substr($key, 0, 41) === SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY)
- {
- $this->data['links'][substr($key, 41)] =& $this->data['links'][$key];
- }
- $this->data['links'][$key] = array_unique($this->data['links'][$key]);
- }
- }
-
- if (isset($this->data['links'][$rel]))
- {
- return $this->data['links'][$rel];
- }
- else
- {
- return null;
- }
- }
-
- function get_description()
- {
- if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'subtitle'))
- {
- return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0]));
- }
- elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'tagline'))
- {
- return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0]));
- }
- elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'description'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
- }
- elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'description'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
- }
- elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'description'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
- }
- elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'description'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'description'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'summary'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));
- }
- elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'subtitle'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));
- }
- else
- {
- return null;
- }
- }
-
- function get_copyright()
- {
- if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'rights'))
- {
- return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0]));
- }
- elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'copyright'))
- {
- return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0]));
- }
- elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'copyright'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'rights'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'rights'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- else
- {
- return null;
- }
- }
-
- function get_language()
- {
- if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'language'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'language'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'language'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- elseif (isset($this->data['xml_lang']))
- {
- return $this->sanitize($this->data['xml_lang'], SIMPLEPIE_CONSTRUCT_TEXT);
- }
- else
- {
- return null;
- }
- }
-
- function get_latitude()
- {
- if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lat'))
- {
- return (float) $return[0]['data'];
- }
- elseif (($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match))
- {
- return (float) $match[1];
- }
- else
- {
- return null;
- }
- }
-
- function get_longitude()
- {
- if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'long'))
- {
- return (float) $return[0]['data'];
- }
- elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lon'))
- {
- return (float) $return[0]['data'];
- }
- elseif (($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match))
- {
- return (float) $match[2];
- }
- else
- {
- return null;
- }
- }
-
- function get_image_url()
- {
- if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'image'))
- {
- return $this->sanitize($return[0]['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI);
- }
- elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'logo'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
- }
- elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'icon'))
- {
- return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
- }
- else
- {
- return null;
- }
- }
-}
-
-class SimplePie_Author
-{
- var $name;
- var $link;
- var $email;
- var $avatar;
- var $name_date;
- var $uri_date;
- var $avatar_date;
-
- // Constructor, used to input the data
- function SimplePie_Author($name = null, $link = null, $email = null, $avatar = null, $name_date = null, $uri_date = null, $avatar_date = null)
- {
- $this->name = $name;
- $this->link = $link;
- $this->email = $email;
- $this->avatar = $avatar;
- $this->name_date = $name_date;
- $this->uri_date = $uri_date;
- $this->avatar_date = $avatar_date;
- }
-
- function __toString()
- {
- // There is no $this->data here
- return md5(serialize($this));
- }
-
- function get_name()
- {
- if ($this->name !== null)
- {
- return $this->name;
- }
- else
- {
- return null;
- }
- }
-
- function get_link()
- {
- if ($this->link !== null)
- {
- return $this->link;
- }
- else
- {
- return null;
- }
- }
-
- function get_email()
- {
- if ($this->email !== null)
- {
- return $this->email;
- }
- else
- {
- return null;
- }
- }
-
- function get_avatar()
- {
- if ($this->avatar !== null)
- {
- return $this->avatar;
- }
- else
- {
- return null;
- }
- }
-
- function get_name_date()
- {
- if ($this->name_date !== null)
- {
- return $this->name_date;
- }
- else
- {
- return null;
- }
- }
- function get_uri_date()
- {
- if ($this->uri_date !== null)
- {
- return $this->uri_date;
- }
- else
- {
- return null;
- }
- }
- function get_avatar_date()
- {
- if ($this->avatar_date !== null)
- {
- return $this->avatar_date;
- }
- else
- {
- return null;
- }
- }
-
-
-}
-
-class SimplePie_Category
-{
- var $term;
- var $scheme;
- var $label;
-
- // Constructor, used to input the data
- function SimplePie_Category($term = null, $scheme = null, $label = null)
- {
- $this->term = $term;
- $this->scheme = $scheme;
- $this->label = $label;
- }
-
- function __toString()
- {
- // There is no $this->data here
- return md5(serialize($this));
- }
-
- function get_term()
- {
- if ($this->term !== null)
- {
- return $this->term;
- }
- else
- {
- return null;
- }
- }
-
- function get_scheme()
- {
- if ($this->scheme !== null)
- {
- return $this->scheme;
- }
- else
- {
- return null;
- }
- }
-
- function get_label()
- {
- if ($this->label !== null)
- {
- return $this->label;
- }
- else
- {
- return $this->get_term();
- }
- }
-}
-
-class SimplePie_Enclosure
-{
- var $bitrate;
- var $captions;
- var $categories;
- var $channels;
- var $copyright;
- var $credits;
- var $description;
- var $duration;
- var $expression;
- var $framerate;
- var $handler;
- var $hashes;
- var $height;
- var $javascript;
- var $keywords;
- var $lang;
- var $length;
- var $link;
- var $medium;
- var $player;
- var $ratings;
- var $restrictions;
- var $samplingrate;
- var $thumbnails;
- var $title;
- var $type;
- var $width;
-
- // Constructor, used to input the data
- function SimplePie_Enclosure($link = null, $type = null, $length = null, $javascript = null, $bitrate = null, $captions = null, $categories = null, $channels = null, $copyright = null, $credits = null, $description = null, $duration = null, $expression = null, $framerate = null, $hashes = null, $height = null, $keywords = null, $lang = null, $medium = null, $player = null, $ratings = null, $restrictions = null, $samplingrate = null, $thumbnails = null, $title = null, $width = null)
- {
- $this->bitrate = $bitrate;
- $this->captions = $captions;
- $this->categories = $categories;
- $this->channels = $channels;
- $this->copyright = $copyright;
- $this->credits = $credits;
- $this->description = $description;
- $this->duration = $duration;
- $this->expression = $expression;
- $this->framerate = $framerate;
- $this->hashes = $hashes;
- $this->height = $height;
- $this->javascript = $javascript;
- $this->keywords = $keywords;
- $this->lang = $lang;
- $this->length = $length;
- $this->link = $link;
- $this->medium = $medium;
- $this->player = $player;
- $this->ratings = $ratings;
- $this->restrictions = $restrictions;
- $this->samplingrate = $samplingrate;
- $this->thumbnails = $thumbnails;
- $this->title = $title;
- $this->type = $type;
- $this->width = $width;
- if (class_exists('idna_convert'))
- {
- $idn = new idna_convert;
- $parsed = SimplePie_Misc::parse_url($link);
- $this->link = SimplePie_Misc::compress_parse_url($parsed['scheme'], $idn->encode($parsed['authority']), $parsed['path'], $parsed['query'], $parsed['fragment']);
- }
- $this->handler = $this->get_handler(); // Needs to load last
- }
-
- function __toString()
- {
- // There is no $this->data here
- return md5(serialize($this));
- }
-
- function get_bitrate()
- {
- if ($this->bitrate !== null)
- {
- return $this->bitrate;
- }
- else
- {
- return null;
- }
- }
-
- function get_caption($key = 0)
- {
- $captions = $this->get_captions();
- if (isset($captions[$key]))
- {
- return $captions[$key];
- }
- else
- {
- return null;
- }
- }
-
- function get_captions()
- {
- if ($this->captions !== null)
- {
- return $this->captions;
- }
- else
- {
- return null;
- }
- }
-
- function get_category($key = 0)
- {
- $categories = $this->get_categories();
- if (isset($categories[$key]))
- {
- return $categories[$key];
- }
- else
- {
- return null;
- }
- }
-
- function get_categories()
- {
- if ($this->categories !== null)
- {
- return $this->categories;
- }
- else
- {
- return null;
- }
- }
-
- function get_channels()
- {
- if ($this->channels !== null)
- {
- return $this->channels;
- }
- else
- {
- return null;
- }
- }
-
- function get_copyright()
- {
- if ($this->copyright !== null)
- {
- return $this->copyright;
- }
- else
- {
- return null;
- }
- }
-
- function get_credit($key = 0)
- {
- $credits = $this->get_credits();
- if (isset($credits[$key]))
- {
- return $credits[$key];
- }
- else
- {
- return null;
- }
- }
-
- function get_credits()
- {
- if ($this->credits !== null)
- {
- return $this->credits;
- }
- else
- {
- return null;
- }
- }
-
- function get_description()
- {
- if ($this->description !== null)
- {
- return $this->description;
- }
- else
- {
- return null;
- }
- }
-
- function get_duration($convert = false)
- {
- if ($this->duration !== null)
- {
- if ($convert)
- {
- $time = SimplePie_Misc::time_hms($this->duration);
- return $time;
- }
- else
- {
- return $this->duration;
- }
- }
- else
- {
- return null;
- }
- }
-
- function get_expression()
- {
- if ($this->expression !== null)
- {
- return $this->expression;
- }
- else
- {
- return 'full';
- }
- }
-
- function get_extension()
- {
- if ($this->link !== null)
- {
- $url = SimplePie_Misc::parse_url($this->link);
- if ($url['path'] !== '')
- {
- return pathinfo($url['path'], PATHINFO_EXTENSION);
- }
- }
- return null;
- }
-
- function get_framerate()
- {
- if ($this->framerate !== null)
- {
- return $this->framerate;
- }
- else
- {
- return null;
- }
- }
-
- function get_handler()
- {
- return $this->get_real_type(true);
- }
-
- function get_hash($key = 0)
- {
- $hashes = $this->get_hashes();
- if (isset($hashes[$key]))
- {
- return $hashes[$key];
- }
- else
- {
- return null;
- }
- }
-
- function get_hashes()
- {
- if ($this->hashes !== null)
- {
- return $this->hashes;
- }
- else
- {
- return null;
- }
- }
-
- function get_height()
- {
- if ($this->height !== null)
- {
- return $this->height;
- }
- else
- {
- return null;
- }
- }
-
- function get_language()
- {
- if ($this->lang !== null)
- {
- return $this->lang;
- }
- else
- {
- return null;
- }
- }
-
- function get_keyword($key = 0)
- {
- $keywords = $this->get_keywords();
- if (isset($keywords[$key]))
- {
- return $keywords[$key];
- }
- else
- {
- return null;
- }
- }
-
- function get_keywords()
- {
- if ($this->keywords !== null)
- {
- return $this->keywords;
- }
- else
- {
- return null;
- }
- }
-
- function get_length()
- {
- if ($this->length !== null)
- {
- return $this->length;
- }
- else
- {
- return null;
- }
- }
-
- function get_link()
- {
- if ($this->link !== null)
- {
- return urldecode($this->link);
- }
- else
- {
- return null;
- }
- }
-
- function get_medium()
- {
- if ($this->medium !== null)
- {
- return $this->medium;
- }
- else
- {
- return null;
- }
- }
-
- function get_player()
- {
- if ($this->player !== null)
- {
- return $this->player;
- }
- else
- {
- return null;
- }
- }
-
- function get_rating($key = 0)
- {
- $ratings = $this->get_ratings();
- if (isset($ratings[$key]))
- {
- return $ratings[$key];
- }
- else
- {
- return null;
- }
- }
-
- function get_ratings()
- {
- if ($this->ratings !== null)
- {
- return $this->ratings;
- }
- else
- {
- return null;
- }
- }
-
- function get_restriction($key = 0)
- {
- $restrictions = $this->get_restrictions();
- if (isset($restrictions[$key]))
- {
- return $restrictions[$key];
- }
- else
- {
- return null;
- }
- }
-
- function get_restrictions()
- {
- if ($this->restrictions !== null)
- {
- return $this->restrictions;
- }
- else
- {
- return null;
- }
- }
-
- function get_sampling_rate()
- {
- if ($this->samplingrate !== null)
- {
- return $this->samplingrate;
- }
- else
- {
- return null;
- }
- }
-
- function get_size()
- {
- $length = $this->get_length();
- if ($length !== null)
- {
- return round($length/1048576, 2);
- }
- else
- {
- return null;
- }
- }
-
- function get_thumbnail($key = 0)
- {
- $thumbnails = $this->get_thumbnails();
- if (isset($thumbnails[$key]))
- {
- return $thumbnails[$key];
- }
- else
- {
- return null;
- }
- }
-
- function get_thumbnails()
- {
- if ($this->thumbnails !== null)
- {
- return $this->thumbnails;
- }
- else
- {
- return null;
- }
- }
-
- function get_title()
- {
- if ($this->title !== null)
- {
- return $this->title;
- }
- else
- {
- return null;
- }
- }
-
- function get_type()
- {
- if ($this->type !== null)
- {
- return $this->type;
- }
- else
- {
- return null;
- }
- }
-
- function get_width()
- {
- if ($this->width !== null)
- {
- return $this->width;
- }
- else
- {
- return null;
- }
- }
-
- function native_embed($options='')
- {
- return $this->embed($options, true);
- }
-
- /**
- * @todo If the dimensions for media:content are defined, use them when width/height are set to 'auto'.
- */
- function embed($options = '', $native = false)
- {
- // Set up defaults
- $audio = '';
- $video = '';
- $alt = '';
- $altclass = '';
- $loop = 'false';
- $width = 'auto';
- $height = 'auto';
- $bgcolor = '#ffffff';
- $mediaplayer = '';
- $widescreen = false;
- $handler = $this->get_handler();
- $type = $this->get_real_type();
-
- // Process options and reassign values as necessary
- if (is_array($options))
- {
- extract($options);
- }
- else
- {
- $options = explode(',', $options);
- foreach($options as $option)
- {
- $opt = explode(':', $option, 2);
- if (isset($opt[0], $opt[1]))
- {
- $opt[0] = trim($opt[0]);
- $opt[1] = trim($opt[1]);
- switch ($opt[0])
- {
- case 'audio':
- $audio = $opt[1];
- break;
-
- case 'video':
- $video = $opt[1];
- break;
-
- case 'alt':
- $alt = $opt[1];
- break;
-
- case 'altclass':
- $altclass = $opt[1];
- break;
-
- case 'loop':
- $loop = $opt[1];
- break;
-
- case 'width':
- $width = $opt[1];
- break;
-
- case 'height':
- $height = $opt[1];
- break;
-
- case 'bgcolor':
- $bgcolor = $opt[1];
- break;
-
- case 'mediaplayer':
- $mediaplayer = $opt[1];
- break;
-
- case 'widescreen':
- $widescreen = $opt[1];
- break;
- }
- }
- }
- }
-
- $mime = explode('/', $type, 2);
- $mime = $mime[0];
-
- // Process values for 'auto'
- if ($width === 'auto')
- {
- if ($mime === 'video')
- {
- if ($height === 'auto')
- {
- $width = 480;
- }
- elseif ($widescreen)
- {
- $width = round((intval($height)/9)*16);
- }
- else
- {
- $width = round((intval($height)/3)*4);
- }
- }
- else
- {
- $width = '100%';
- }
- }
-
- if ($height === 'auto')
- {
- if ($mime === 'audio')
- {
- $height = 0;
- }
- elseif ($mime === 'video')
- {
- if ($width === 'auto')
- {
- if ($widescreen)
- {
- $height = 270;
- }
- else
- {
- $height = 360;
- }
- }
- elseif ($widescreen)
- {
- $height = round((intval($width)/16)*9);
- }
- else
- {
- $height = round((intval($width)/4)*3);
- }
- }
- else
- {
- $height = 376;
- }
- }
- elseif ($mime === 'audio')
- {
- $height = 0;
- }
-
- // Set proper placeholder value
- if ($mime === 'audio')
- {
- $placeholder = $audio;
- }
- elseif ($mime === 'video')
- {
- $placeholder = $video;
- }
-
- $embed = '';
-
- // Make sure the JS library is included
- if (!$native)
- {
- static $javascript_outputted = null;
- if (!$javascript_outputted && $this->javascript)
- {
- $embed .= '<script type="text/javascript" src="?' . htmlspecialchars($this->javascript) . '"></script>';
- $javascript_outputted = true;
- }
- }
-
- // Odeo Feed MP3's
- if ($handler === 'odeo')
- {
- if ($native)
- {
- $embed .= '<embed src="http://odeo.com/flash/audio_player_fullsize.swf" pluginspage="http://adobe.com/go/getflashplayer" type="application/x-shockwave-flash" quality="high" width="440" height="80" wmode="transparent" allowScriptAccess="any" flashvars="valid_sample_rate=true&external_url=' . $this->get_link() . '"></embed>';
- }
- else
- {
- $embed .= '<script type="text/javascript">embed_odeo("' . $this->get_link() . '");</script>';
- }
- }
-
- // Flash
- elseif ($handler === 'flash')
- {
- if ($native)
- {
- $embed .= "<embed src=\"" . $this->get_link() . "\" pluginspage=\"http://adobe.com/go/getflashplayer\" type=\"$type\" quality=\"high\" width=\"$width\" height=\"$height\" bgcolor=\"$bgcolor\" loop=\"$loop\"></embed>";
- }
- else
- {
- $embed .= "<script type='text/javascript'>embed_flash('$bgcolor', '$width', '$height', '" . $this->get_link() . "', '$loop', '$type');</script>";
- }
- }
-
- // Flash Media Player file types.
- // Preferred handler for MP3 file types.
- elseif ($handler === 'fmedia' || ($handler === 'mp3' && $mediaplayer !== ''))
- {
- $height += 20;
- if ($native)
- {
- $embed .= "<embed src=\"$mediaplayer\" pluginspage=\"http://adobe.com/go/getflashplayer\" type=\"application/x-shockwave-flash\" quality=\"high\" width=\"$width\" height=\"$height\" wmode=\"transparent\" flashvars=\"file=" . rawurlencode($this->get_link().'?file_extension=.'.$this->get_extension()) . "&autostart=false&repeat=$loop&showdigits=true&showfsbutton=false\"></embed>";
- }
- else
- {
- $embed .= "<script type='text/javascript'>embed_flv('$width', '$height', '" . rawurlencode($this->get_link().'?file_extension=.'.$this->get_extension()) . "', '$placeholder', '$loop', '$mediaplayer');</script>";
- }
- }
-
- // QuickTime 7 file types. Need to test with QuickTime 6.
- // Only handle MP3's if the Flash Media Player is not present.
- elseif ($handler === 'quicktime' || ($handler === 'mp3' && $mediaplayer === ''))
- {
- $height += 16;
- if ($native)
- {
- if ($placeholder !== '')
- {
- $embed .= "<embed type=\"$type\" style=\"cursor:hand; cursor:pointer;\" href=\"" . $this->get_link() . "\" src=\"$placeholder\" width=\"$width\" height=\"$height\" autoplay=\"false\" target=\"myself\" controller=\"false\" loop=\"$loop\" scale=\"aspect\" bgcolor=\"$bgcolor\" pluginspage=\"http://apple.com/quicktime/download/\"></embed>";
- }
- else
- {
- $embed .= "<embed type=\"$type\" style=\"cursor:hand; cursor:pointer;\" src=\"" . $this->get_link() . "\" width=\"$width\" height=\"$height\" autoplay=\"false\" target=\"myself\" controller=\"true\" loop=\"$loop\" scale=\"aspect\" bgcolor=\"$bgcolor\" pluginspage=\"http://apple.com/quicktime/download/\"></embed>";
- }
- }
- else
- {
- $embed .= "<script type='text/javascript'>embed_quicktime('$type', '$bgcolor', '$width', '$height', '" . $this->get_link() . "', '$placeholder', '$loop');</script>";
- }
- }
-
- // Windows Media
- elseif ($handler === 'wmedia')
- {
- $height += 45;
- if ($native)
- {
- $embed .= "<embed type=\"application/x-mplayer2\" src=\"" . $this->get_link() . "\" autosize=\"1\" width=\"$width\" height=\"$height\" showcontrols=\"1\" showstatusbar=\"0\" showdisplay=\"0\" autostart=\"0\"></embed>";
- }
- else
- {
- $embed .= "<script type='text/javascript'>embed_wmedia('$width', '$height', '" . $this->get_link() . "');</script>";
- }
- }
-
- // Everything else
- else $embed .= '<a href="' . $this->get_link() . '" class="' . $altclass . '">' . $alt . '</a>';
-
- return $embed;
- }
-
- function get_real_type($find_handler = false)
- {
- // If it's Odeo, let's get it out of the way.
- if (substr(strtolower($this->get_link()), 0, 15) === 'http://odeo.com')
- {
- return 'odeo';
- }
-
- // Mime-types by handler.
- $types_flash = array('application/x-shockwave-flash', 'application/futuresplash'); // Flash
- $types_fmedia = array('video/flv', 'video/x-flv','flv-application/octet-stream'); // Flash Media Player
- $types_quicktime = array('audio/3gpp', 'audio/3gpp2', 'audio/aac', 'audio/x-aac', 'audio/aiff', 'audio/x-aiff', 'audio/mid', 'audio/midi', 'audio/x-midi', 'audio/mp4', 'audio/m4a', 'audio/x-m4a', 'audio/wav', 'audio/x-wav', 'video/3gpp', 'video/3gpp2', 'video/m4v', 'video/x-m4v', 'video/mp4', 'video/mpeg', 'video/x-mpeg', 'video/quicktime', 'video/sd-video'); // QuickTime
- $types_wmedia = array('application/asx', 'application/x-mplayer2', 'audio/x-ms-wma', 'audio/x-ms-wax', 'video/x-ms-asf-plugin', 'video/x-ms-asf', 'video/x-ms-wm', 'video/x-ms-wmv', 'video/x-ms-wvx'); // Windows Media
- $types_mp3 = array('audio/mp3', 'audio/x-mp3', 'audio/mpeg', 'audio/x-mpeg'); // MP3
-
- if ($this->get_type() !== null)
- {
- $type = strtolower($this->type);
- }
- else
- {
- $type = null;
- }
-
- // If we encounter an unsupported mime-type, check the file extension and guess intelligently.
- if (!in_array($type, array_merge($types_flash, $types_fmedia, $types_quicktime, $types_wmedia, $types_mp3)))
- {
- switch (strtolower($this->get_extension()))
- {
- // Audio mime-types
- case 'aac':
- case 'adts':
- $type = 'audio/acc';
- break;
-
- case 'aif':
- case 'aifc':
- case 'aiff':
- case 'cdda':
- $type = 'audio/aiff';
- break;
-
- case 'bwf':
- $type = 'audio/wav';
- break;
-
- case 'kar':
- case 'mid':
- case 'midi':
- case 'smf':
- $type = 'audio/midi';
- break;
-
- case 'm4a':
- $type = 'audio/x-m4a';
- break;
-
- case 'mp3':
- case 'swa':
- $type = 'audio/mp3';
- break;
-
- case 'wav':
- $type = 'audio/wav';
- break;
-
- case 'wax':
- $type = 'audio/x-ms-wax';
- break;
-
- case 'wma':
- $type = 'audio/x-ms-wma';
- break;
-
- // Video mime-types
- case '3gp':
- case '3gpp':
- $type = 'video/3gpp';
- break;
-
- case '3g2':
- case '3gp2':
- $type = 'video/3gpp2';
- break;
-
- case 'asf':
- $type = 'video/x-ms-asf';
- break;
-
- case 'flv':
- $type = 'video/x-flv';
- break;
-
- case 'm1a':
- case 'm1s':
- case 'm1v':
- case 'm15':
- case 'm75':
- case 'mp2':
- case 'mpa':
- case 'mpeg':
- case 'mpg':
- case 'mpm':
- case 'mpv':
- $type = 'video/mpeg';
- break;
-
- case 'm4v':
- $type = 'video/x-m4v';
- break;
-
- case 'mov':
- case 'qt':
- $type = 'video/quicktime';
- break;
-
- case 'mp4':
- case 'mpg4':
- $type = 'video/mp4';
- break;
-
- case 'sdv':
- $type = 'video/sd-video';
- break;
-
- case 'wm':
- $type = 'video/x-ms-wm';
- break;
-
- case 'wmv':
- $type = 'video/x-ms-wmv';
- break;
-
- case 'wvx':
- $type = 'video/x-ms-wvx';
- break;
-
- // Flash mime-types
- case 'spl':
- $type = 'application/futuresplash';
- break;
-
- case 'swf':
- $type = 'application/x-shockwave-flash';
- break;
- }
- }
-
- if ($find_handler)
- {
- if (in_array($type, $types_flash))
- {
- return 'flash';
- }
- elseif (in_array($type, $types_fmedia))
- {
- return 'fmedia';
- }
- elseif (in_array($type, $types_quicktime))
- {
- return 'quicktime';
- }
- elseif (in_array($type, $types_wmedia))
- {
- return 'wmedia';
- }
- elseif (in_array($type, $types_mp3))
- {
- return 'mp3';
- }
- else
- {
- return null;
- }
- }
- else
- {
- return $type;
- }
- }
-}
-
-class SimplePie_Caption
-{
- var $type;
- var $lang;
- var $startTime;
- var $endTime;
- var $text;
-
- // Constructor, used to input the data
- function SimplePie_Caption($type = null, $lang = null, $startTime = null, $endTime = null, $text = null)
- {
- $this->type = $type;
- $this->lang = $lang;
- $this->startTime = $startTime;
- $this->endTime = $endTime;
- $this->text = $text;
- }
-
- function __toString()
- {
- // There is no $this->data here
- return md5(serialize($this));
- }
-
- function get_endtime()
- {
- if ($this->endTime !== null)
- {
- return $this->endTime;
- }
- else
- {
- return null;
- }
- }
-
- function get_language()
- {
- if ($this->lang !== null)
- {
- return $this->lang;
- }
- else
- {
- return null;
- }
- }
-
- function get_starttime()
- {
- if ($this->startTime !== null)
- {
- return $this->startTime;
- }
- else
- {
- return null;
- }
- }
-
- function get_text()
- {
- if ($this->text !== null)
- {
- return $this->text;
- }
- else
- {
- return null;
- }
- }
-
- function get_type()
- {
- if ($this->type !== null)
- {
- return $this->type;
- }
- else
- {
- return null;
- }
- }
-}
-
-class SimplePie_Credit
-{
- var $role;
- var $scheme;
- var $name;
-
- // Constructor, used to input the data
- function SimplePie_Credit($role = null, $scheme = null, $name = null)
- {
- $this->role = $role;
- $this->scheme = $scheme;
- $this->name = $name;
- }
-
- function __toString()
- {
- // There is no $this->data here
- return md5(serialize($this));
- }
-
- function get_role()
- {
- if ($this->role !== null)
- {
- return $this->role;
- }
- else
- {
- return null;
- }
- }
-
- function get_scheme()
- {
- if ($this->scheme !== null)
- {
- return $this->scheme;
- }
- else
- {
- return null;
- }
- }
-
- function get_name()
- {
- if ($this->name !== null)
- {
- return $this->name;
- }
- else
- {
- return null;
- }
- }
-}
-
-class SimplePie_Copyright
-{
- var $url;
- var $label;
-
- // Constructor, used to input the data
- function SimplePie_Copyright($url = null, $label = null)
- {
- $this->url = $url;
- $this->label = $label;
- }
-
- function __toString()
- {
- // There is no $this->data here
- return md5(serialize($this));
- }
-
- function get_url()
- {
- if ($this->url !== null)
- {
- return $this->url;
- }
- else
- {
- return null;
- }
- }
-
- function get_attribution()
- {
- if ($this->label !== null)
- {
- return $this->label;
- }
- else
- {
- return null;
- }
- }
-}
-
-class SimplePie_Rating
-{
- var $scheme;
- var $value;
-
- // Constructor, used to input the data
- function SimplePie_Rating($scheme = null, $value = null)
- {
- $this->scheme = $scheme;
- $this->value = $value;
- }
-
- function __toString()
- {
- // There is no $this->data here
- return md5(serialize($this));
- }
-
- function get_scheme()
- {
- if ($this->scheme !== null)
- {
- return $this->scheme;
- }
- else
- {
- return null;
- }
- }
-
- function get_value()
- {
- if ($this->value !== null)
- {
- return $this->value;
- }
- else
- {
- return null;
- }
- }
-}
-
-class SimplePie_Restriction
-{
- var $relationship;
- var $type;
- var $value;
-
- // Constructor, used to input the data
- function SimplePie_Restriction($relationship = null, $type = null, $value = null)
- {
- $this->relationship = $relationship;
- $this->type = $type;
- $this->value = $value;
- }
-
- function __toString()
- {
- // There is no $this->data here
- return md5(serialize($this));
- }
-
- function get_relationship()
- {
- if ($this->relationship !== null)
- {
- return $this->relationship;
- }
- else
- {
- return null;
- }
- }
-
- function get_type()
- {
- if ($this->type !== null)
- {
- return $this->type;
- }
- else
- {
- return null;
- }
- }
-
- function get_value()
- {
- if ($this->value !== null)
- {
- return $this->value;
- }
- else
- {
- return null;
- }
- }
-}
-
-/**
- * @todo Move to properly supporting RFC2616 (HTTP/1.1)
- */
-class SimplePie_File
-{
- var $url;
- var $useragent;
- var $success = true;
- var $headers = array();
- var $body;
- var $status_code;
- var $redirects = 0;
- var $error;
- var $method = SIMPLEPIE_FILE_SOURCE_NONE;
-
- function SimplePie_File($url, $timeout = 10, $redirects = 5, $headers = null, $useragent = null, $force_fsockopen = false)
- {
- if (class_exists('idna_convert'))
- {
- $idn = new idna_convert;
- $parsed = SimplePie_Misc::parse_url($url);
- $url = SimplePie_Misc::compress_parse_url($parsed['scheme'], $idn->encode($parsed['authority']), $parsed['path'], $parsed['query'], $parsed['fragment']);
- }
- $this->url = $url;
- $this->useragent = $useragent;
- if (preg_match('/^http(s)?:\/\//i', $url))
- {
- if ($useragent === null)
- {
- $useragent = ini_get('user_agent');
- $this->useragent = $useragent;
- }
- if (!is_array($headers))
- {
- $headers = array();
- }
- if (!$force_fsockopen && function_exists('curl_exec'))
- {
- $this->method = SIMPLEPIE_FILE_SOURCE_REMOTE | SIMPLEPIE_FILE_SOURCE_CURL;
- $fp = curl_init();
- $headers2 = array();
- foreach ($headers as $key => $value)
- {
- $headers2[] = "$key: $value";
- }
- if (version_compare(SimplePie_Misc::get_curl_version(), '7.10.5', '>='))
- {
- curl_setopt($fp, CURLOPT_ENCODING, '');
- }
- curl_setopt($fp, CURLOPT_URL, $url);
- curl_setopt($fp, CURLOPT_HEADER, 1);
- curl_setopt($fp, CURLOPT_RETURNTRANSFER, 1);
- curl_setopt($fp, CURLOPT_TIMEOUT, $timeout);
- curl_setopt($fp, CURLOPT_CONNECTTIMEOUT, $timeout);
- curl_setopt($fp, CURLOPT_REFERER, $url);
- curl_setopt($fp, CURLOPT_USERAGENT, $useragent);
- curl_setopt($fp, CURLOPT_HTTPHEADER, $headers2);
- if (!ini_get('open_basedir') && !ini_get('safe_mode') && version_compare(SimplePie_Misc::get_curl_version(), '7.15.2', '>='))
- {
- curl_setopt($fp, CURLOPT_FOLLOWLOCATION, 1);
- curl_setopt($fp, CURLOPT_MAXREDIRS, $redirects);
- }
-
- $this->headers = curl_exec($fp);
- if (curl_errno($fp) === 23 || curl_errno($fp) === 61)
- {
- curl_setopt($fp, CURLOPT_ENCODING, 'none');
- $this->headers = curl_exec($fp);
- }
- if (curl_errno($fp))
- {
- $this->error = 'cURL error ' . curl_errno($fp) . ': ' . curl_error($fp);
- $this->success = false;
- }
- else
- {
- $info = curl_getinfo($fp);
- curl_close($fp);
- $this->headers = explode("\r\n\r\n", $this->headers, $info['redirect_count'] + 1);
- $this->headers = array_pop($this->headers);
- $parser = new SimplePie_HTTP_Parser($this->headers);
- if ($parser->parse())
- {
- $this->headers = $parser->headers;
- $this->body = $parser->body;
- $this->status_code = $parser->status_code;
- if ((in_array($this->status_code, array(300, 301, 302, 303, 307)) || $this->status_code > 307 && $this->status_code < 400) && isset($this->headers['location']) && $this->redirects < $redirects)
- {
- $this->redirects++;
- $location = SimplePie_Misc::absolutize_url($this->headers['location'], $url);
- return $this->SimplePie_File($location, $timeout, $redirects, $headers, $useragent, $force_fsockopen);
- }
- }
- }
- }
- else
- {
- $this->method = SIMPLEPIE_FILE_SOURCE_REMOTE | SIMPLEPIE_FILE_SOURCE_FSOCKOPEN;
- $url_parts = parse_url($url);
- if (isset($url_parts['scheme']) && strtolower($url_parts['scheme']) === 'https')
- {
- $url_parts['host'] = "ssl://$url_parts[host]";
- $url_parts['port'] = 443;
- }
- if (!isset($url_parts['port']))
- {
- $url_parts['port'] = 80;
- }
- $fp = @fsockopen($url_parts['host'], $url_parts['port'], $errno, $errstr, $timeout);
- if (!$fp)
- {
- $this->error = 'fsockopen error: ' . $errstr;
- $this->success = false;
- }
- else
- {
- stream_set_timeout($fp, $timeout);
- if (isset($url_parts['path']))
- {
- if (isset($url_parts['query']))
- {
- $get = "$url_parts[path]?$url_parts[query]";
- }
- else
- {
- $get = $url_parts['path'];
- }
- }
- else
- {
- $get = '/';
- }
- $out = "GET $get HTTP/1.0\r\n";
- $out .= "Host: $url_parts[host]\r\n";
- $out .= "User-Agent: $useragent\r\n";
- if (extension_loaded('zlib'))
- {
- $out .= "Accept-Encoding: x-gzip,gzip,deflate\r\n";
- }
-
- if (isset($url_parts['user']) && isset($url_parts['pass']))
- {
- $out .= "Authorization: Basic " . base64_encode("$url_parts[user]:$url_parts[pass]") . "\r\n";
- }
- foreach ($headers as $key => $value)
- {
- $out .= "$key: $value\r\n";
- }
- $out .= "Connection: Close\r\n\r\n";
- fwrite($fp, $out);
-
- $info = stream_get_meta_data($fp);
-
- $this->headers = '';
- while (!$info['eof'] && !$info['timed_out'])
- {
- $this->headers .= fread($fp, 1160);
- $info = stream_get_meta_data($fp);
- }
- if (!$info['timed_out'])
- {
- $parser = new SimplePie_HTTP_Parser($this->headers);
- if ($parser->parse())
- {
- $this->headers = $parser->headers;
- $this->body = $parser->body;
- $this->status_code = $parser->status_code;
- if ((in_array($this->status_code, array(300, 301, 302, 303, 307)) || $this->status_code > 307 && $this->status_code < 400) && isset($this->headers['location']) && $this->redirects < $redirects)
- {
- $this->redirects++;
- $location = SimplePie_Misc::absolutize_url($this->headers['location'], $url);
- return $this->SimplePie_File($location, $timeout, $redirects, $headers, $useragent, $force_fsockopen);
- }
- if (isset($this->headers['content-encoding']))
- {
- // Hey, we act dumb elsewhere, so let's do that here too
- switch (strtolower(trim($this->headers['content-encoding'], "\x09\x0A\x0D\x20")))
- {
- case 'gzip':
- case 'x-gzip':
- $decoder = new SimplePie_gzdecode($this->body);
- if (!$decoder->parse())
- {
- $this->error = 'Unable to decode HTTP "gzip" stream';
- $this->success = false;
- }
- else
- {
- $this->body = $decoder->data;
- }
- break;
-
- case 'deflate':
- if (($body = gzuncompress($this->body)) === false)
- {
- if (($body = gzinflate($this->body)) === false)
- {
- $this->error = 'Unable to decode HTTP "deflate" stream';
- $this->success = false;
- }
- }
- $this->body = $body;
- break;
-
- default:
- $this->error = 'Unknown content coding';
- $this->success = false;
- }
- }
- }
- }
- else
- {
- $this->error = 'fsocket timed out';
- $this->success = false;
- }
- fclose($fp);
- }
- }
- }
- else
- {
- $this->method = SIMPLEPIE_FILE_SOURCE_LOCAL | SIMPLEPIE_FILE_SOURCE_FILE_GET_CONTENTS;
- if (!$this->body = file_get_contents($url))
- {
- $this->error = 'file_get_contents could not read the file';
- $this->success = false;
- }
- }
- }
-}
-
-/**
- * HTTP Response Parser
- *
- * @package SimplePie
- */
-class SimplePie_HTTP_Parser
-{
- /**
- * HTTP Version
- *
- * @access public
- * @var float
- */
- var $http_version = 0.0;
-
- /**
- * Status code
- *
- * @access public
- * @var int
- */
- var $status_code = 0;
-
- /**
- * Reason phrase
- *
- * @access public
- * @var string
- */
- var $reason = '';
-
- /**
- * Key/value pairs of the headers
- *
- * @access public
- * @var array
- */
- var $headers = array();
-
- /**
- * Body of the response
- *
- * @access public
- * @var string
- */
- var $body = '';
-
- /**
- * Current state of the state machine
- *
- * @access private
- * @var string
- */
- var $state = 'http_version';
-
- /**
- * Input data
- *
- * @access private
- * @var string
- */
- var $data = '';
-
- /**
- * Input data length (to avoid calling strlen() everytime this is needed)
- *
- * @access private
- * @var int
- */
- var $data_length = 0;
-
- /**
- * Current position of the pointer
- *
- * @var int
- * @access private
- */
- var $position = 0;
-
- /**
- * Name of the hedaer currently being parsed
- *
- * @access private
- * @var string
- */
- var $name = '';
-
- /**
- * Value of the hedaer currently being parsed
- *
- * @access private
- * @var string
- */
- var $value = '';
-
- /**
- * Create an instance of the class with the input data
- *
- * @access public
- * @param string $data Input data
- */
- function SimplePie_HTTP_Parser($data)
- {
- $this->data = $data;
- $this->data_length = strlen($this->data);
- }
-
- /**
- * Parse the input data
- *
- * @access public
- * @return bool true on success, false on failure
- */
- function parse()
- {
- while ($this->state && $this->state !== 'emit' && $this->has_data())
- {
- $state = $this->state;
- $this->$state();
- }
- $this->data = '';
- if ($this->state === 'emit' || $this->state === 'body')
- {
- return true;
- }
- else
- {
- $this->http_version = '';
- $this->status_code = '';
- $this->reason = '';
- $this->headers = array();
- $this->body = '';
- return false;
- }
- }
-
- /**
- * Check whether there is data beyond the pointer
- *
- * @access private
- * @return bool true if there is further data, false if not
- */
- function has_data()
- {
- return (bool) ($this->position < $this->data_length);
- }
-
- /**
- * See if the next character is LWS
- *
- * @access private
- * @return bool true if the next character is LWS, false if not
- */
- function is_linear_whitespace()
- {
- return (bool) ($this->data[$this->position] === "\x09"
- || $this->data[$this->position] === "\x20"
- || ($this->data[$this->position] === "\x0A"
- && isset($this->data[$this->position + 1])
- && ($this->data[$this->position + 1] === "\x09" || $this->data[$this->position + 1] === "\x20")));
- }
-
- /**
- * Parse the HTTP version
- *
- * @access private
- */
- function http_version()
- {
- if (strpos($this->data, "\x0A") !== false && strtoupper(substr($this->data, 0, 5)) === 'HTTP/')
- {
- $len = strspn($this->data, '0123456789.', 5);
- $this->http_version = substr($this->data, 5, $len);
- $this->position += 5 + $len;
- if (substr_count($this->http_version, '.') <= 1)
- {
- $this->http_version = (float) $this->http_version;
- $this->position += strspn($this->data, "\x09\x20", $this->position);
- $this->state = 'status';
- }
- else
- {
- $this->state = false;
- }
- }
- else
- {
- $this->state = false;
- }
- }
-
- /**
- * Parse the status code
- *
- * @access private
- */
- function status()
- {
- if ($len = strspn($this->data, '0123456789', $this->position))
- {
- $this->status_code = (int) substr($this->data, $this->position, $len);
- $this->position += $len;
- $this->state = 'reason';
- }
- else
- {
- $this->state = false;
- }
- }
-
- /**
- * Parse the reason phrase
- *
- * @access private
- */
- function reason()
- {
- $len = strcspn($this->data, "\x0A", $this->position);
- $this->reason = trim(substr($this->data, $this->position, $len), "\x09\x0D\x20");
- $this->position += $len + 1;
- $this->state = 'new_line';
- }
-
- /**
- * Deal with a new line, shifting data around as needed
- *
- * @access private
- */
- function new_line()
- {
- $this->value = trim($this->value, "\x0D\x20");
- if ($this->name !== '' && $this->value !== '')
- {
- $this->name = strtolower($this->name);
- if (isset($this->headers[$this->name]))
- {
- $this->headers[$this->name] .= ', ' . $this->value;
- }
- else
- {
- $this->headers[$this->name] = $this->value;
- }
- }
- $this->name = '';
- $this->value = '';
- if (substr($this->data[$this->position], 0, 2) === "\x0D\x0A")
- {
- $this->position += 2;
- $this->state = 'body';
- }
- elseif ($this->data[$this->position] === "\x0A")
- {
- $this->position++;
- $this->state = 'body';
- }
- else
- {
- $this->state = 'name';
- }
- }
-
- /**
- * Parse a header name
- *
- * @access private
- */
- function name()
- {
- $len = strcspn($this->data, "\x0A:", $this->position);
- if (isset($this->data[$this->position + $len]))
- {
- if ($this->data[$this->position + $len] === "\x0A")
- {
- $this->position += $len;
- $this->state = 'new_line';
- }
- else
- {
- $this->name = substr($this->data, $this->position, $len);
- $this->position += $len + 1;
- $this->state = 'value';
- }
- }
- else
- {
- $this->state = false;
- }
- }
-
- /**
- * Parse LWS, replacing consecutive LWS characters with a single space
- *
- * @access private
- */
- function linear_whitespace()
- {
- do
- {
- if (substr($this->data, $this->position, 2) === "\x0D\x0A")
- {
- $this->position += 2;
- }
- elseif ($this->data[$this->position] === "\x0A")
- {
- $this->position++;
- }
- $this->position += strspn($this->data, "\x09\x20", $this->position);
- } while ($this->has_data() && $this->is_linear_whitespace());
- $this->value .= "\x20";
- }
-
- /**
- * See what state to move to while within non-quoted header values
- *
- * @access private
- */
- function value()
- {
- if ($this->is_linear_whitespace())
- {
- $this->linear_whitespace();
- }
- else
- {
- switch ($this->data[$this->position])
- {
- case '"':
- $this->position++;
- $this->state = 'quote';
- break;
-
- case "\x0A":
- $this->position++;
- $this->state = 'new_line';
- break;
-
- default:
- $this->state = 'value_char';
- break;
- }
- }
- }
-
- /**
- * Parse a header value while outside quotes
- *
- * @access private
- */
- function value_char()
- {
- $len = strcspn($this->data, "\x09\x20\x0A\"", $this->position);
- $this->value .= substr($this->data, $this->position, $len);
- $this->position += $len;
- $this->state = 'value';
- }
-
- /**
- * See what state to move to while within quoted header values
- *
- * @access private
- */
- function quote()
- {
- if ($this->is_linear_whitespace())
- {
- $this->linear_whitespace();
- }
- else
- {
- switch ($this->data[$this->position])
- {
- case '"':
- $this->position++;
- $this->state = 'value';
- break;
-
- case "\x0A":
- $this->position++;
- $this->state = 'new_line';
- break;
-
- case '\\':
- $this->position++;
- $this->state = 'quote_escaped';
- break;
-
- default:
- $this->state = 'quote_char';
- break;
- }
- }
- }
-
- /**
- * Parse a header value while within quotes
- *
- * @access private
- */
- function quote_char()
- {
- $len = strcspn($this->data, "\x09\x20\x0A\"\\", $this->position);
- $this->value .= substr($this->data, $this->position, $len);
- $this->position += $len;
- $this->state = 'value';
- }
-
- /**
- * Parse an escaped character within quotes
- *
- * @access private
- */
- function quote_escaped()
- {
- $this->value .= $this->data[$this->position];
- $this->position++;
- $this->state = 'quote';
- }
-
- /**
- * Parse the body
- *
- * @access private
- */
- function body()
- {
- $this->body = substr($this->data, $this->position);
- $this->state = 'emit';
- }
-}
-
-/**
- * gzdecode
- *
- * @package SimplePie
- */
-class SimplePie_gzdecode
-{
- /**
- * Compressed data
- *
- * @access private
- * @see gzdecode::$data
- */
- var $compressed_data;
-
- /**
- * Size of compressed data
- *
- * @access private
- */
- var $compressed_size;
-
- /**
- * Minimum size of a valid gzip string
- *
- * @access private
- */
- var $min_compressed_size = 18;
-
- /**
- * Current position of pointer
- *
- * @access private
- */
- var $position = 0;
-
- /**
- * Flags (FLG)
- *
- * @access private
- */
- var $flags;
-
- /**
- * Uncompressed data
- *
- * @access public
- * @see gzdecode::$compressed_data
- */
- var $data;
-
- /**
- * Modified time
- *
- * @access public
- */
- var $MTIME;
-
- /**
- * Extra Flags
- *
- * @access public
- */
- var $XFL;
-
- /**
- * Operating System
- *
- * @access public
- */
- var $OS;
-
- /**
- * Subfield ID 1
- *
- * @access public
- * @see gzdecode::$extra_field
- * @see gzdecode::$SI2
- */
- var $SI1;
-
- /**
- * Subfield ID 2
- *
- * @access public
- * @see gzdecode::$extra_field
- * @see gzdecode::$SI1
- */
- var $SI2;
-
- /**
- * Extra field content
- *
- * @access public
- * @see gzdecode::$SI1
- * @see gzdecode::$SI2
- */
- var $extra_field;
-
- /**
- * Original filename
- *
- * @access public
- */
- var $filename;
-
- /**
- * Human readable comment
- *
- * @access public
- */
- var $comment;
-
- /**
- * Don't allow anything to be set
- *
- * @access public
- */
- function __set($name, $value)
- {
- trigger_error("Cannot write property $name", E_USER_ERROR);
- }
-
- /**
- * Set the compressed string and related properties
- *
- * @access public
- */
- function SimplePie_gzdecode($data)
- {
- $this->compressed_data = $data;
- $this->compressed_size = strlen($data);
- }
-
- /**
- * Decode the GZIP stream
- *
- * @access public
- */
- function parse()
- {
- if ($this->compressed_size >= $this->min_compressed_size)
- {
- // Check ID1, ID2, and CM
- if (substr($this->compressed_data, 0, 3) !== "\x1F\x8B\x08")
- {
- return false;
- }
-
- // Get the FLG (FLaGs)
- $this->flags = ord($this->compressed_data[3]);
-
- // FLG bits above (1 << 4) are reserved
- if ($this->flags > 0x1F)
- {
- return false;
- }
-
- // Advance the pointer after the above
- $this->position += 4;
-
- // MTIME
- $mtime = substr($this->compressed_data, $this->position, 4);
- // Reverse the string if we're on a big-endian arch because l is the only signed long and is machine endianness
- if (current(unpack('S', "\x00\x01")) === 1)
- {
- $mtime = strrev($mtime);
- }
- $this->MTIME = current(unpack('l', $mtime));
- $this->position += 4;
-
- // Get the XFL (eXtra FLags)
- $this->XFL = ord($this->compressed_data[$this->position++]);
-
- // Get the OS (Operating System)
- $this->OS = ord($this->compressed_data[$this->position++]);
-
- // Parse the FEXTRA
- if ($this->flags & 4)
- {
- // Read subfield IDs
- $this->SI1 = $this->compressed_data[$this->position++];
- $this->SI2 = $this->compressed_data[$this->position++];
-
- // SI2 set to zero is reserved for future use
- if ($this->SI2 === "\x00")
- {
- return false;
- }
-
- // Get the length of the extra field
- $len = current(unpack('v', substr($this->compressed_data, $this->position, 2)));
- $position += 2;
-
- // Check the length of the string is still valid
- $this->min_compressed_size += $len + 4;
- if ($this->compressed_size >= $this->min_compressed_size)
- {
- // Set the extra field to the given data
- $this->extra_field = substr($this->compressed_data, $this->position, $len);
- $this->position += $len;
- }
- else
- {
- return false;
- }
- }
-
- // Parse the FNAME
- if ($this->flags & 8)
- {
- // Get the length of the filename
- $len = strcspn($this->compressed_data, "\x00", $this->position);
-
- // Check the length of the string is still valid
- $this->min_compressed_size += $len + 1;
- if ($this->compressed_size >= $this->min_compressed_size)
- {
- // Set the original filename to the given string
- $this->filename = substr($this->compressed_data, $this->position, $len);
- $this->position += $len + 1;
- }
- else
- {
- return false;
- }
- }
-
- // Parse the FCOMMENT
- if ($this->flags & 16)
- {
- // Get the length of the comment
- $len = strcspn($this->compressed_data, "\x00", $this->position);
-
- // Check the length of the string is still valid
- $this->min_compressed_size += $len + 1;
- if ($this->compressed_size >= $this->min_compressed_size)
- {
- // Set the original comment to the given string
- $this->comment = substr($this->compressed_data, $this->position, $len);
- $this->position += $len + 1;
- }
- else
- {
- return false;
- }
- }
-
- // Parse the FHCRC
- if ($this->flags & 2)
- {
- // Check the length of the string is still valid
- $this->min_compressed_size += $len + 2;
- if ($this->compressed_size >= $this->min_compressed_size)
- {
- // Read the CRC
- $crc = current(unpack('v', substr($this->compressed_data, $this->position, 2)));
-
- // Check the CRC matches
- if ((crc32(substr($this->compressed_data, 0, $this->position)) & 0xFFFF) === $crc)
- {
- $this->position += 2;
- }
- else
- {
- return false;
- }
- }
- else
- {
- return false;
- }
- }
-
- // Decompress the actual data
- if (($this->data = gzinflate(substr($this->compressed_data, $this->position, -8))) === false)
- {
- return false;
- }
- else
- {
- $this->position = $this->compressed_size - 8;
- }
-
- // Check CRC of data
- $crc = current(unpack('V', substr($this->compressed_data, $this->position, 4)));
- $this->position += 4;
- /*if (extension_loaded('hash') && sprintf('%u', current(unpack('V', hash('crc32b', $this->data)))) !== sprintf('%u', $crc))
- {
- return false;
- }*/
-
- // Check ISIZE of data
- $isize = current(unpack('V', substr($this->compressed_data, $this->position, 4)));
- $this->position += 4;
- if (sprintf('%u', strlen($this->data) & 0xFFFFFFFF) !== sprintf('%u', $isize))
- {
- return false;
- }
-
- // Wow, against all odds, we've actually got a valid gzip string
- return true;
- }
- else
- {
- return false;
- }
- }
-}
-
-class SimplePie_Cache
-{
- /**
- * Don't call the constructor. Please.
- *
- * @access private
- */
- function SimplePie_Cache()
- {
- trigger_error('Please call SimplePie_Cache::create() instead of the constructor', E_USER_ERROR);
- }
-
- /**
- * Create a new SimplePie_Cache object
- *
- * @static
- * @access public
- */
- function create($location, $filename, $extension)
- {
- $location_iri = new SimplePie_IRI($location);
- switch ($location_iri->get_scheme())
- {
- case 'mysql':
- if (extension_loaded('mysql'))
- {
- return new SimplePie_Cache_MySQL($location_iri, $filename, $extension);
- }
- break;
-
- default:
- return new SimplePie_Cache_File($location, $filename, $extension);
- }
- }
-}
-
-class SimplePie_Cache_File
-{
- var $location;
- var $filename;
- var $extension;
- var $name;
-
- function SimplePie_Cache_File($location, $filename, $extension)
- {
- $this->location = $location;
- $this->filename = $filename;
- $this->extension = $extension;
- $this->name = "$this->location/$this->filename.$this->extension";
- }
-
- function save($data)
- {
- if (file_exists($this->name) && is_writeable($this->name) || file_exists($this->location) && is_writeable($this->location))
- {
- if (is_a($data, 'SimplePie'))
- {
- $data = $data->data;
- }
-
- $data = serialize($data);
-
- if (function_exists('file_put_contents'))
- {
- return (bool) file_put_contents($this->name, $data);
- }
- else
- {
- $fp = fopen($this->name, 'wb');
- if ($fp)
- {
- fwrite($fp, $data);
- fclose($fp);
- return true;
- }
- }
- }
- return false;
- }
-
- function load()
- {
- if (file_exists($this->name) && is_readable($this->name))
- {
- return unserialize(file_get_contents($this->name));
- }
- return false;
- }
-
- function mtime()
- {
- if (file_exists($this->name))
- {
- return filemtime($this->name);
- }
- return false;
- }
-
- function touch()
- {
- if (file_exists($this->name))
- {
- return touch($this->name);
- }
- return false;
- }
-
- function unlink()
- {
- if (file_exists($this->name))
- {
- return unlink($this->name);
- }
- return false;
- }
-}
-
-class SimplePie_Cache_DB
-{
- function prepare_simplepie_object_for_cache($data)
- {
- $items = $data->get_items();
- $items_by_id = array();
-
- if (!empty($items))
- {
- foreach ($items as $item)
- {
- $items_by_id[$item->get_id()] = $item;
- }
-
- if (count($items_by_id) !== count($items))
- {
- $items_by_id = array();
- foreach ($items as $item)
- {
- $items_by_id[$item->get_id(true)] = $item;
- }
- }
-
- if (isset($data->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]))
- {
- $channel =& $data->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0];
- }
- elseif (isset($data->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]))
- {
- $channel =& $data->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0];
- }
- elseif (isset($data->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]))
- {
- $channel =& $data->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0];
- }
- elseif (isset($data->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_20]['channel'][0]))
- {
- $channel =& $data->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_20]['channel'][0];
- }
- else
- {
- $channel = null;
- }
-
- if ($channel !== null)
- {
- if (isset($channel['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['entry']))
- {
- unset($channel['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['entry']);
- }
- if (isset($channel['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['entry']))
- {
- unset($channel['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['entry']);
- }
- if (isset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_10]['item']))
- {
- unset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_10]['item']);
- }
- if (isset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_090]['item']))
- {
- unset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_090]['item']);
- }
- if (isset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_20]['item']))
- {
- unset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_20]['item']);
- }
- }
- if (isset($data->data['items']))
- {
- unset($data->data['items']);
- }
- if (isset($data->data['ordered_items']))
- {
- unset($data->data['ordered_items']);
- }
- }
- return array(serialize($data->data), $items_by_id);
- }
-}
-
-class SimplePie_Cache_MySQL extends SimplePie_Cache_DB
-{
- var $mysql;
- var $options;
- var $id;
-
- function SimplePie_Cache_MySQL($mysql_location, $name, $extension)
- {
- $host = $mysql_location->get_host();
- if (SimplePie_Misc::stripos($host, 'unix(') === 0 && substr($host, -1) === ')')
- {
- $server = ':' . substr($host, 5, -1);
- }
- else
- {
- $server = $host;
- if ($mysql_location->get_port() !== null)
- {
- $server .= ':' . $mysql_location->get_port();
- }
- }
-
- if (strpos($mysql_location->get_userinfo(), ':') !== false)
- {
- list($username, $password) = explode(':', $mysql_location->get_userinfo(), 2);
- }
- else
- {
- $username = $mysql_location->get_userinfo();
- $password = null;
- }
-
- if ($this->mysql = mysql_connect($server, $username, $password))
- {
- $this->id = $name . $extension;
- $this->options = SimplePie_Misc::parse_str($mysql_location->get_query());
- if (!isset($this->options['prefix'][0]))
- {
- $this->options['prefix'][0] = '';
- }
-
- if (mysql_select_db(ltrim($mysql_location->get_path(), '/'))
- && mysql_query('SET NAMES utf8')
- && ($query = mysql_unbuffered_query('SHOW TABLES')))
- {
- $db = array();
- while ($row = mysql_fetch_row($query))
- {
- $db[] = $row[0];
- }
-
- if (!in_array($this->options['prefix'][0] . 'cache_data', $db))
- {
- if (!mysql_query('CREATE TABLE `' . $this->options['prefix'][0] . 'cache_data` (`id` TEXT CHARACTER SET utf8 NOT NULL, `items` SMALLINT NOT NULL DEFAULT 0, `data` BLOB NOT NULL, `mtime` INT UNSIGNED NOT NULL, UNIQUE (`id`(125)))'))
- {
- $this->mysql = null;
- }
- }
-
- if (!in_array($this->options['prefix'][0] . 'items', $db))
- {
- if (!mysql_query('CREATE TABLE `' . $this->options['prefix'][0] . 'items` (`feed_id` TEXT CHARACTER SET utf8 NOT NULL, `id` TEXT CHARACTER SET utf8 NOT NULL, `data` TEXT CHARACTER SET utf8 NOT NULL, `posted` INT UNSIGNED NOT NULL, INDEX `feed_id` (`feed_id`(125)))'))
- {
- $this->mysql = null;
- }
- }
- }
- else
- {
- $this->mysql = null;
- }
- }
- }
-
- function save($data)
- {
- if ($this->mysql)
- {
- $feed_id = "'" . mysql_real_escape_string($this->id) . "'";
-
- if (is_a($data, 'SimplePie'))
- {
- if (SIMPLEPIE_PHP5)
- {
- // This keyword needs to defy coding standards for PHP4 compatibility
- $data = clone($data);
- }
-
- $prepared = $this->prepare_simplepie_object_for_cache($data);
-
- if ($query = mysql_query('SELECT `id` FROM `' . $this->options['prefix'][0] . 'cache_data` WHERE `id` = ' . $feed_id, $this->mysql))
- {
- if (mysql_num_rows($query))
- {
- $items = count($prepared[1]);
- if ($items)
- {
- $sql = 'UPDATE `' . $this->options['prefix'][0] . 'cache_data` SET `items` = ' . $items . ', `data` = \'' . mysql_real_escape_string($prepared[0]) . '\', `mtime` = ' . time() . ' WHERE `id` = ' . $feed_id;
- }
- else
- {
- $sql = 'UPDATE `' . $this->options['prefix'][0] . 'cache_data` SET `data` = \'' . mysql_real_escape_string($prepared[0]) . '\', `mtime` = ' . time() . ' WHERE `id` = ' . $feed_id;
- }
-
- if (!mysql_query($sql, $this->mysql))
- {
- return false;
- }
- }
- elseif (!mysql_query('INSERT INTO `' . $this->options['prefix'][0] . 'cache_data` (`id`, `items`, `data`, `mtime`) VALUES(' . $feed_id . ', ' . count($prepared[1]) . ', \'' . mysql_real_escape_string($prepared[0]) . '\', ' . time() . ')', $this->mysql))
- {
- return false;
- }
-
- $ids = array_keys($prepared[1]);
- if (!empty($ids))
- {
- foreach ($ids as $id)
- {
- $database_ids[] = mysql_real_escape_string($id);
- }
-
- if ($query = mysql_unbuffered_query('SELECT `id` FROM `' . $this->options['prefix'][0] . 'items` WHERE `id` = \'' . implode('\' OR `id` = \'', $database_ids) . '\' AND `feed_id` = ' . $feed_id, $this->mysql))
- {
- $existing_ids = array();
- while ($row = mysql_fetch_row($query))
- {
- $existing_ids[] = $row[0];
- }
-
- $new_ids = array_diff($ids, $existing_ids);
-
- foreach ($new_ids as $new_id)
- {
- if (!($date = $prepared[1][$new_id]->get_date('U')))
- {
- $date = time();
- }
-
- if (!mysql_query('INSERT INTO `' . $this->options['prefix'][0] . 'items` (`feed_id`, `id`, `data`, `posted`) VALUES(' . $feed_id . ', \'' . mysql_real_escape_string($new_id) . '\', \'' . mysql_real_escape_string(serialize($prepared[1][$new_id]->data)) . '\', ' . $date . ')', $this->mysql))
- {
- return false;
- }
- }
- return true;
- }
- }
- else
- {
- return true;
- }
- }
- }
- elseif ($query = mysql_query('SELECT `id` FROM `' . $this->options['prefix'][0] . 'cache_data` WHERE `id` = ' . $feed_id, $this->mysql))
- {
- if (mysql_num_rows($query))
- {
- if (mysql_query('UPDATE `' . $this->options['prefix'][0] . 'cache_data` SET `items` = 0, `data` = \'' . mysql_real_escape_string(serialize($data)) . '\', `mtime` = ' . time() . ' WHERE `id` = ' . $feed_id, $this->mysql))
- {
- return true;
- }
- }
- elseif (mysql_query('INSERT INTO `' . $this->options['prefix'][0] . 'cache_data` (`id`, `items`, `data`, `mtime`) VALUES(\'' . mysql_real_escape_string($this->id) . '\', 0, \'' . mysql_real_escape_string(serialize($data)) . '\', ' . time() . ')', $this->mysql))
- {
- return true;
- }
- }
- }
- return false;
- }
-
- function load()
- {
- if ($this->mysql && ($query = mysql_query('SELECT `items`, `data` FROM `' . $this->options['prefix'][0] . 'cache_data` WHERE `id` = \'' . mysql_real_escape_string($this->id) . "'", $this->mysql)) && ($row = mysql_fetch_row($query)))
- {
- $data = unserialize($row[1]);
-
- if (isset($this->options['items'][0]))
- {
- $items = (int) $this->options['items'][0];
- }
- else
- {
- $items = (int) $row[0];
- }
-
- if ($items !== 0)
- {
- if (isset($data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]))
- {
- $feed =& $data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0];
- }
- elseif (isset($data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]))
- {
- $feed =& $data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0];
- }
- elseif (isset($data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]))
- {
- $feed =& $data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0];
- }
- elseif (isset($data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]))
- {
- $feed =& $data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0];
- }
- else
- {
- $feed = null;
- }
-
- if ($feed !== null)
- {
- $sql = 'SELECT `data` FROM `' . $this->options['prefix'][0] . 'items` WHERE `feed_id` = \'' . mysql_real_escape_string($this->id) . '\' ORDER BY `posted` DESC';
- if ($items > 0)
- {
- $sql .= ' LIMIT ' . $items;
- }
-
- if ($query = mysql_unbuffered_query($sql, $this->mysql))
- {
- while ($row = mysql_fetch_row($query))
- {
- $feed['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['entry'][] = unserialize($row[0]);
- }
- }
- else
- {
- return false;
- }
- }
- }
- return $data;
- }
- return false;
- }
-
- function mtime()
- {
- if ($this->mysql && ($query = mysql_query('SELECT `mtime` FROM `' . $this->options['prefix'][0] . 'cache_data` WHERE `id` = \'' . mysql_real_escape_string($this->id) . "'", $this->mysql)) && ($row = mysql_fetch_row($query)))
- {
- return $row[0];
- }
- else
- {
- return false;
- }
- }
-
- function touch()
- {
- if ($this->mysql && ($query = mysql_query('UPDATE `' . $this->options['prefix'][0] . 'cache_data` SET `mtime` = ' . time() . ' WHERE `id` = \'' . mysql_real_escape_string($this->id) . "'", $this->mysql)) && mysql_affected_rows($this->mysql))
- {
- return true;
- }
- else
- {
- return false;
- }
- }
-
- function unlink()
- {
- if ($this->mysql && ($query = mysql_query('DELETE FROM `' . $this->options['prefix'][0] . 'cache_data` WHERE `id` = \'' . mysql_real_escape_string($this->id) . "'", $this->mysql)) && ($query2 = mysql_query('DELETE FROM `' . $this->options['prefix'][0] . 'items` WHERE `feed_id` = \'' . mysql_real_escape_string($this->id) . "'", $this->mysql)))
- {
- return true;
- }
- else
- {
- return false;
- }
- }
-}
-
-class SimplePie_Misc
-{
- function time_hms($seconds)
- {
- $time = '';
-
- $hours = floor($seconds / 3600);
- $remainder = $seconds % 3600;
- if ($hours > 0)
- {
- $time .= $hours.':';
- }
-
- $minutes = floor($remainder / 60);
- $seconds = $remainder % 60;
- if ($minutes < 10 && $hours > 0)
- {
- $minutes = '0' . $minutes;
- }
- if ($seconds < 10)
- {
- $seconds = '0' . $seconds;
- }
-
- $time .= $minutes.':';
- $time .= $seconds;
-
- return $time;
- }
-
- function absolutize_url($relative, $base)
- {
-return $relative;
- $iri = SimplePie_IRI::absolutize(new SimplePie_IRI($base), $relative);
- return $iri->get_iri();
- }
-
- function remove_dot_segments($input)
- {
- $output = '';
- while (strpos($input, './') !== false || strpos($input, '/.') !== false || $input === '.' || $input === '..')
- {
- // A: If the input buffer begins with a prefix of "../" or "./", then remove that prefix from the input buffer; otherwise,
- if (strpos($input, '../') === 0)
- {
- $input = substr($input, 3);
- }
- elseif (strpos($input, './') === 0)
- {
- $input = substr($input, 2);
- }
- // B: if the input buffer begins with a prefix of "/./" or "/.", where "." is a complete path segment, then replace that prefix with "/" in the input buffer; otherwise,
- elseif (strpos($input, '/./') === 0)
- {
- $input = substr_replace($input, '/', 0, 3);
- }
- elseif ($input === '/.')
- {
- $input = '/';
- }
- // C: if the input buffer begins with a prefix of "/../" or "/..", where ".." is a complete path segment, then replace that prefix with "/" in the input buffer and remove the last segment and its preceding "/" (if any) from the output buffer; otherwise,
- elseif (strpos($input, '/../') === 0)
- {
- $input = substr_replace($input, '/', 0, 4);
- $output = substr_replace($output, '', strrpos($output, '/'));
- }
- elseif ($input === '/..')
- {
- $input = '/';
- $output = substr_replace($output, '', strrpos($output, '/'));
- }
- // D: if the input buffer consists only of "." or "..", then remove that from the input buffer; otherwise,
- elseif ($input === '.' || $input === '..')
- {
- $input = '';
- }
- // E: move the first path segment in the input buffer to the end of the output buffer, including the initial "/" character (if any) and any subsequent characters up to, but not including, the next "/" character or the end of the input buffer
- elseif (($pos = strpos($input, '/', 1)) !== false)
- {
- $output .= substr($input, 0, $pos);
- $input = substr_replace($input, '', 0, $pos);
- }
- else
- {
- $output .= $input;
- $input = '';
- }
- }
- return $output . $input;
- }
-
- function get_element($realname, $string)
- {
- $return = array();
- $name = preg_quote($realname, '/');
- if (preg_match_all("/<($name)" . SIMPLEPIE_PCRE_HTML_ATTRIBUTE . "(>(.*)<\/$name>|(\/)?>)/siU", $string, $matches, PREG_SET_ORDER | PREG_OFFSET_CAPTURE))
- {
- for ($i = 0, $total_matches = count($matches); $i < $total_matches; $i++)
- {
- $return[$i]['tag'] = $realname;
- $return[$i]['full'] = $matches[$i][0][0];
- $return[$i]['offset'] = $matches[$i][0][1];
- if (strlen($matches[$i][3][0]) <= 2)
- {
- $return[$i]['self_closing'] = true;
- }
- else
- {
- $return[$i]['self_closing'] = false;
- $return[$i]['content'] = $matches[$i][4][0];
- }
- $return[$i]['attribs'] = array();
- if (isset($matches[$i][2][0]) && preg_match_all('/[\x09\x0A\x0B\x0C\x0D\x20]+([^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3E][^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3D\x3E]*)(?:[\x09\x0A\x0B\x0C\x0D\x20]*=[\x09\x0A\x0B\x0C\x0D\x20]*(?:"([^"]*)"|\'([^\']*)\'|([^\x09\x0A\x0B\x0C\x0D\x20\x22\x27\x3E][^\x09\x0A\x0B\x0C\x0D\x20\x3E]*)?))?/', ' ' . $matches[$i][2][0] . ' ', $attribs, PREG_SET_ORDER))
- {
- for ($j = 0, $total_attribs = count($attribs); $j < $total_attribs; $j++)
- {
- if (count($attribs[$j]) === 2)
- {
- $attribs[$j][2] = $attribs[$j][1];
- }
- $return[$i]['attribs'][strtolower($attribs[$j][1])]['data'] = SimplePie_Misc::entities_decode(end($attribs[$j]), 'UTF-8');
- }
- }
- }
- }
- return $return;
- }
-
- function element_implode($element)
- {
- $full = "<$element[tag]";
- foreach ($element['attribs'] as $key => $value)
- {
- $key = strtolower($key);
- $full .= " $key=\"" . htmlspecialchars($value['data']) . '"';
- }
- if ($element['self_closing'])
- {
- $full .= ' />';
- }
- else
- {
- $full .= ">$element[content]</$element[tag]>";
- }
- return $full;
- }
-
- function error($message, $level, $file, $line)
- {
- if ((ini_get('error_reporting') & $level) > 0)
- {
- switch ($level)
- {
- case E_USER_ERROR:
- $note = 'PHP Error';
- break;
- case E_USER_WARNING:
- $note = 'PHP Warning';
- break;
- case E_USER_NOTICE:
- $note = 'PHP Notice';
- break;
- default:
- $note = 'Unknown Error';
- break;
- }
-
- $log_error = true;
- if (!function_exists('error_log'))
- {
- $log_error = false;
- }
-
- $log_file = @ini_get('error_log');
- if (!empty($log_file) && ('syslog' != $log_file) && !@is_writable($log_file))
- {
- $log_error = false;
- }
-
- if ($log_error)
- {
- @error_log("$note: $message in $file on line $line", 0);
- }
- }
-
- return $message;
- }
-
- /**
- * If a file has been cached, retrieve and display it.
- *
- * This is most useful for caching images (get_favicon(), etc.),
- * however it works for all cached files. This WILL NOT display ANY
- * file/image/page/whatever, but rather only display what has already
- * been cached by SimplePie.
- *
- * @access public
- * @see SimplePie::get_favicon()
- * @param str $identifier_url URL that is used to identify the content.
- * This may or may not be the actual URL of the live content.
- * @param str $cache_location Location of SimplePie's cache. Defaults
- * to './cache'.
- * @param str $cache_extension The file extension that the file was
- * cached with. Defaults to 'spc'.
- * @param str $cache_class Name of the cache-handling class being used
- * in SimplePie. Defaults to 'SimplePie_Cache', and should be left
- * as-is unless you've overloaded the class.
- * @param str $cache_name_function Obsolete. Exists for backwards
- * compatibility reasons only.
- */
- function display_cached_file($identifier_url, $cache_location = './cache', $cache_extension = 'spc', $cache_class = 'SimplePie_Cache', $cache_name_function = 'md5')
- {
- $cache = call_user_func(array($cache_class, 'create'), $cache_location, $identifier_url, $cache_extension);
-
- if ($file = $cache->load())
- {
- if (isset($file['headers']['content-type']))
- {
- header('Content-type:' . $file['headers']['content-type']);
- }
- else
- {
- header('Content-type: application/octet-stream');
- }
- header('Expires: ' . gmdate('D, d M Y H:i:s', time() + 604800) . ' GMT'); // 7 days
- echo $file['body'];
- exit;
- }
-
- die('Cached file for ' . $identifier_url . ' cannot be found.');
- }
-
- function fix_protocol($url, $http = 1)
- {
- $url = SimplePie_Misc::normalize_url($url);
- $parsed = SimplePie_Misc::parse_url($url);
- if ($parsed['scheme'] !== '' && $parsed['scheme'] !== 'http' && $parsed['scheme'] !== 'https')
- {
- return SimplePie_Misc::fix_protocol(SimplePie_Misc::compress_parse_url('http', $parsed['authority'], $parsed['path'], $parsed['query'], $parsed['fragment']), $http);
- }
-
- if ($parsed['scheme'] === '' && $parsed['authority'] === '' && !file_exists($url))
- {
- return SimplePie_Misc::fix_protocol(SimplePie_Misc::compress_parse_url('http', $parsed['path'], '', $parsed['query'], $parsed['fragment']), $http);
- }
-
- if ($http === 2 && $parsed['scheme'] !== '')
- {
- return "feed:$url";
- }
- elseif ($http === 3 && strtolower($parsed['scheme']) === 'http')
- {
- return substr_replace($url, 'podcast', 0, 4);
- }
- elseif ($http === 4 && strtolower($parsed['scheme']) === 'http')
- {
- return substr_replace($url, 'itpc', 0, 4);
- }
- else
- {
- return $url;
- }
- }
-
- function parse_url($url)
- {
- $iri = new SimplePie_IRI($url);
- return array(
- 'scheme' => (string) $iri->get_scheme(),
- 'authority' => (string) $iri->get_authority(),
- 'path' => (string) $iri->get_path(),
- 'query' => (string) $iri->get_query(),
- 'fragment' => (string) $iri->get_fragment()
- );
- }
-
- function compress_parse_url($scheme = '', $authority = '', $path = '', $query = '', $fragment = '')
- {
- $iri = new SimplePie_IRI('');
- $iri->set_scheme($scheme);
- $iri->set_authority($authority);
- $iri->set_path($path);
- $iri->set_query($query);
- $iri->set_fragment($fragment);
- return $iri->get_iri();
- }
-
- function normalize_url($url)
- {
- $iri = new SimplePie_IRI($url);
- return $iri->get_iri();
- }
-
- function percent_encoding_normalization($match)
- {
- $integer = hexdec($match[1]);
- if ($integer >= 0x41 && $integer <= 0x5A || $integer >= 0x61 && $integer <= 0x7A || $integer >= 0x30 && $integer <= 0x39 || $integer === 0x2D || $integer === 0x2E || $integer === 0x5F || $integer === 0x7E)
- {
- return chr($integer);
- }
- else
- {
- return strtoupper($match[0]);
- }
- }
-
- /**
- * Remove bad UTF-8 bytes
- *
- * PCRE Pattern to locate bad bytes in a UTF-8 string comes from W3C
- * FAQ: Multilingual Forms (modified to include full ASCII range)
- *
- * @author Geoffrey Sneddon
- * @see http://www.w3.org/International/questions/qa-forms-utf-8
- * @param string $str String to remove bad UTF-8 bytes from
- * @return string UTF-8 string
- */
- function utf8_bad_replace($str)
- {
- if (function_exists('iconv') && ($return = @iconv('UTF-8', 'UTF-8//IGNORE', $str)))
- {
- return $return;
- }
- elseif (function_exists('mb_convert_encoding') && ($return = @mb_convert_encoding($str, 'UTF-8', 'UTF-8')))
- {
- return $return;
- }
- elseif (preg_match_all('/(?:[\x00-\x7F]|[\xC2-\xDF][\x80-\xBF]|\xE0[\xA0-\xBF][\x80-\xBF]|[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}|\xED[\x80-\x9F][\x80-\xBF]|\xF0[\x90-\xBF][\x80-\xBF]{2}|[\xF1-\xF3][\x80-\xBF]{3}|\xF4[\x80-\x8F][\x80-\xBF]{2})+/', $str, $matches))
- {
- return implode("\xEF\xBF\xBD", $matches[0]);
- }
- elseif ($str !== '')
- {
- return "\xEF\xBF\xBD";
- }
- else
- {
- return '';
- }
- }
-
- /**
- * Converts a Windows-1252 encoded string to a UTF-8 encoded string
- *
- * @static
- * @access public
- * @param string $string Windows-1252 encoded string
- * @return string UTF-8 encoded string
- */
- function windows_1252_to_utf8($string)
- {
- static $convert_table = array("\x80" => "\xE2\x82\xAC", "\x81" => "\xEF\xBF\xBD", "\x82" => "\xE2\x80\x9A", "\x83" => "\xC6\x92", "\x84" => "\xE2\x80\x9E", "\x85" => "\xE2\x80\xA6", "\x86" => "\xE2\x80\xA0", "\x87" => "\xE2\x80\xA1", "\x88" => "\xCB\x86", "\x89" => "\xE2\x80\xB0", "\x8A" => "\xC5\xA0", "\x8B" => "\xE2\x80\xB9", "\x8C" => "\xC5\x92", "\x8D" => "\xEF\xBF\xBD", "\x8E" => "\xC5\xBD", "\x8F" => "\xEF\xBF\xBD", "\x90" => "\xEF\xBF\xBD", "\x91" => "\xE2\x80\x98", "\x92" => "\xE2\x80\x99", "\x93" => "\xE2\x80\x9C", "\x94" => "\xE2\x80\x9D", "\x95" => "\xE2\x80\xA2", "\x96" => "\xE2\x80\x93", "\x97" => "\xE2\x80\x94", "\x98" => "\xCB\x9C", "\x99" => "\xE2\x84\xA2", "\x9A" => "\xC5\xA1", "\x9B" => "\xE2\x80\xBA", "\x9C" => "\xC5\x93", "\x9D" => "\xEF\xBF\xBD", "\x9E" => "\xC5\xBE", "\x9F" => "\xC5\xB8", "\xA0" => "\xC2\xA0", "\xA1" => "\xC2\xA1", "\xA2" => "\xC2\xA2", "\xA3" => "\xC2\xA3", "\xA4" => "\xC2\xA4", "\xA5" => "\xC2\xA5", "\xA6" => "\xC2\xA6", "\xA7" => "\xC2\xA7", "\xA8" => "\xC2\xA8", "\xA9" => "\xC2\xA9", "\xAA" => "\xC2\xAA", "\xAB" => "\xC2\xAB", "\xAC" => "\xC2\xAC", "\xAD" => "\xC2\xAD", "\xAE" => "\xC2\xAE", "\xAF" => "\xC2\xAF", "\xB0" => "\xC2\xB0", "\xB1" => "\xC2\xB1", "\xB2" => "\xC2\xB2", "\xB3" => "\xC2\xB3", "\xB4" => "\xC2\xB4", "\xB5" => "\xC2\xB5", "\xB6" => "\xC2\xB6", "\xB7" => "\xC2\xB7", "\xB8" => "\xC2\xB8", "\xB9" => "\xC2\xB9", "\xBA" => "\xC2\xBA", "\xBB" => "\xC2\xBB", "\xBC" => "\xC2\xBC", "\xBD" => "\xC2\xBD", "\xBE" => "\xC2\xBE", "\xBF" => "\xC2\xBF", "\xC0" => "\xC3\x80", "\xC1" => "\xC3\x81", "\xC2" => "\xC3\x82", "\xC3" => "\xC3\x83", "\xC4" => "\xC3\x84", "\xC5" => "\xC3\x85", "\xC6" => "\xC3\x86", "\xC7" => "\xC3\x87", "\xC8" => "\xC3\x88", "\xC9" => "\xC3\x89", "\xCA" => "\xC3\x8A", "\xCB" => "\xC3\x8B", "\xCC" => "\xC3\x8C", "\xCD" => "\xC3\x8D", "\xCE" => "\xC3\x8E", "\xCF" => "\xC3\x8F", "\xD0" => "\xC3\x90", "\xD1" => "\xC3\x91", "\xD2" => "\xC3\x92", "\xD3" => "\xC3\x93", "\xD4" => "\xC3\x94", "\xD5" => "\xC3\x95", "\xD6" => "\xC3\x96", "\xD7" => "\xC3\x97", "\xD8" => "\xC3\x98", "\xD9" => "\xC3\x99", "\xDA" => "\xC3\x9A", "\xDB" => "\xC3\x9B", "\xDC" => "\xC3\x9C", "\xDD" => "\xC3\x9D", "\xDE" => "\xC3\x9E", "\xDF" => "\xC3\x9F", "\xE0" => "\xC3\xA0", "\xE1" => "\xC3\xA1", "\xE2" => "\xC3\xA2", "\xE3" => "\xC3\xA3", "\xE4" => "\xC3\xA4", "\xE5" => "\xC3\xA5", "\xE6" => "\xC3\xA6", "\xE7" => "\xC3\xA7", "\xE8" => "\xC3\xA8", "\xE9" => "\xC3\xA9", "\xEA" => "\xC3\xAA", "\xEB" => "\xC3\xAB", "\xEC" => "\xC3\xAC", "\xED" => "\xC3\xAD", "\xEE" => "\xC3\xAE", "\xEF" => "\xC3\xAF", "\xF0" => "\xC3\xB0", "\xF1" => "\xC3\xB1", "\xF2" => "\xC3\xB2", "\xF3" => "\xC3\xB3", "\xF4" => "\xC3\xB4", "\xF5" => "\xC3\xB5", "\xF6" => "\xC3\xB6", "\xF7" => "\xC3\xB7", "\xF8" => "\xC3\xB8", "\xF9" => "\xC3\xB9", "\xFA" => "\xC3\xBA", "\xFB" => "\xC3\xBB", "\xFC" => "\xC3\xBC", "\xFD" => "\xC3\xBD", "\xFE" => "\xC3\xBE", "\xFF" => "\xC3\xBF");
-
- return strtr($string, $convert_table);
- }
-
- function change_encoding($data, $input, $output)
- {
- $input = SimplePie_Misc::encoding($input);
- $output = SimplePie_Misc::encoding($output);
-
- // We fail to fail on non US-ASCII bytes
- if ($input === 'US-ASCII')
- {
- static $non_ascii_octects = '';
- if (!$non_ascii_octects)
- {
- for ($i = 0x80; $i <= 0xFF; $i++)
- {
- $non_ascii_octects .= chr($i);
- }
- }
- $data = substr($data, 0, strcspn($data, $non_ascii_octects));
- }
-
- // This is first, as behaviour of this is completely predictable
- if ($input === 'Windows-1252' && $output === 'UTF-8')
- {
- return SimplePie_Misc::windows_1252_to_utf8($data);
- }
- // This is second, as behaviour of this varies only with PHP version (the middle part of this expression checks the encoding is supported).
- elseif (function_exists('mb_convert_encoding') && @mb_convert_encoding("\x80", 'UTF-16BE', $input) !== "\x00\x80" && ($return = @mb_convert_encoding($data, $output, $input)))
- {
- return $return;
- }
- // This is last, as behaviour of this varies with OS userland and PHP version
- elseif (function_exists('iconv') && ($return = @iconv($input, $output, $data)))
- {
- return $return;
- }
- // If we can't do anything, just fail
- else
- {
- return false;
- }
- }
-
- function encoding($charset)
- {
- // Normalization from UTS #22
- switch (strtolower(preg_replace('/(?:[^a-zA-Z0-9]+|([^0-9])0+)/', '\1', $charset)))
- {
- case 'adobestandardencoding':
- case 'csadobestandardencoding':
- return 'Adobe-Standard-Encoding';
-
- case 'adobesymbolencoding':
- case 'cshppsmath':
- return 'Adobe-Symbol-Encoding';
-
- case 'ami1251':
- case 'amiga1251':
- return 'Amiga-1251';
-
- case 'ansix31101983':
- case 'csat5001983':
- case 'csiso99naplps':
- case 'isoir99':
- case 'naplps':
- return 'ANSI_X3.110-1983';
-
- case 'arabic7':
- case 'asmo449':
- case 'csiso89asmo449':
- case 'iso9036':
- case 'isoir89':
- return 'ASMO_449';
-
- case 'big5':
- case 'csbig5':
- case 'xxbig5':
- return 'Big5';
-
- case 'big5hkscs':
- return 'Big5-HKSCS';
-
- case 'bocu1':
- case 'csbocu1':
- return 'BOCU-1';
-
- case 'brf':
- case 'csbrf':
- return 'BRF';
-
- case 'bs4730':
- case 'csiso4unitedkingdom':
- case 'gb':
- case 'iso646gb':
- case 'isoir4':
- case 'uk':
- return 'BS_4730';
-
- case 'bsviewdata':
- case 'csiso47bsviewdata':
- case 'isoir47':
- return 'BS_viewdata';
-
- case 'cesu8':
- case 'cscesu8':
- return 'CESU-8';
-
- case 'ca':
- case 'csa71':
- case 'csaz243419851':
- case 'csiso121canadian1':
- case 'iso646ca':
- case 'isoir121':
- return 'CSA_Z243.4-1985-1';
-
- case 'csa72':
- case 'csaz243419852':
- case 'csiso122canadian2':
- case 'iso646ca2':
- case 'isoir122':
- return 'CSA_Z243.4-1985-2';
-
- case 'csaz24341985gr':
- case 'csiso123csaz24341985gr':
- case 'isoir123':
- return 'CSA_Z243.4-1985-gr';
-
- case 'csiso139csn369103':
- case 'csn369103':
- case 'isoir139':
- return 'CSN_369103';
-
- case 'csdecmcs':
- case 'dec':
- case 'decmcs':
- return 'DEC-MCS';
-
- case 'csiso21german':
- case 'de':
- case 'din66003':
- case 'iso646de':
- case 'isoir21':
- return 'DIN_66003';
-
- case 'csdkus':
- case 'dkus':
- return 'dk-us';
-
- case 'csiso646danish':
- case 'dk':
- case 'ds2089':
- case 'iso646dk':
- return 'DS_2089';
-
- case 'csibmebcdicatde':
- case 'ebcdicatde':
- return 'EBCDIC-AT-DE';
-
- case 'csebcdicatdea':
- case 'ebcdicatdea':
- return 'EBCDIC-AT-DE-A';
-
- case 'csebcdiccafr':
- case 'ebcdiccafr':
- return 'EBCDIC-CA-FR';
-
- case 'csebcdicdkno':
- case 'ebcdicdkno':
- return 'EBCDIC-DK-NO';
-
- case 'csebcdicdknoa':
- case 'ebcdicdknoa':
- return 'EBCDIC-DK-NO-A';
-
- case 'csebcdices':
- case 'ebcdices':
- return 'EBCDIC-ES';
-
- case 'csebcdicesa':
- case 'ebcdicesa':
- return 'EBCDIC-ES-A';
-
- case 'csebcdicess':
- case 'ebcdicess':
- return 'EBCDIC-ES-S';
-
- case 'csebcdicfise':
- case 'ebcdicfise':
- return 'EBCDIC-FI-SE';
-
- case 'csebcdicfisea':
- case 'ebcdicfisea':
- return 'EBCDIC-FI-SE-A';
-
- case 'csebcdicfr':
- case 'ebcdicfr':
- return 'EBCDIC-FR';
-
- case 'csebcdicit':
- case 'ebcdicit':
- return 'EBCDIC-IT';
-
- case 'csebcdicpt':
- case 'ebcdicpt':
- return 'EBCDIC-PT';
-
- case 'csebcdicuk':
- case 'ebcdicuk':
- return 'EBCDIC-UK';
-
- case 'csebcdicus':
- case 'ebcdicus':
- return 'EBCDIC-US';
-
- case 'csiso111ecmacyrillic':
- case 'ecmacyrillic':
- case 'isoir111':
- case 'koi8e':
- return 'ECMA-cyrillic';
-
- case 'csiso17spanish':
- case 'es':
- case 'iso646es':
- case 'isoir17':
- return 'ES';
-
- case 'csiso85spanish2':
- case 'es2':
- case 'iso646es2':
- case 'isoir85':
- return 'ES2';
-
- case 'cseucfixwidjapanese':
- case 'extendedunixcodefixedwidthforjapanese':
- return 'Extended_UNIX_Code_Fixed_Width_for_Japanese';
-
- case 'cseucpkdfmtjapanese':
- case 'eucjp':
- case 'extendedunixcodepackedformatforjapanese':
- return 'Extended_UNIX_Code_Packed_Format_for_Japanese';
-
- case 'gb18030':
- return 'GB18030';
-
- case 'chinese':
- case 'cp936':
- case 'csgb2312':
- case 'csiso58gb231280':
- case 'gb2312':
- case 'gb231280':
- case 'gbk':
- case 'isoir58':
- case 'ms936':
- case 'windows936':
- return 'GBK';
-
- case 'cn':
- case 'csiso57gb1988':
- case 'gb198880':
- case 'iso646cn':
- case 'isoir57':
- return 'GB_1988-80';
-
- case 'csiso153gost1976874':
- case 'gost1976874':
- case 'isoir153':
- case 'stsev35888':
- return 'GOST_19768-74';
-
- case 'csiso150':
- case 'csiso150greekccitt':
- case 'greekccitt':
- case 'isoir150':
- return 'greek-ccitt';
-
- case 'csiso88greek7':
- case 'greek7':
- case 'isoir88':
- return 'greek7';
-
- case 'csiso18greek7old':
- case 'greek7old':
- case 'isoir18':
- return 'greek7-old';
-
- case 'cshpdesktop':
- case 'hpdesktop':
- return 'HP-DeskTop';
-
- case 'cshplegal':
- case 'hplegal':
- return 'HP-Legal';
-
- case 'cshpmath8':
- case 'hpmath8':
- return 'HP-Math8';
-
- case 'cshppifont':
- case 'hppifont':
- return 'HP-Pi-font';
-
- case 'cshproman8':
- case 'hproman8':
- case 'r8':
- case 'roman8':
- return 'hp-roman8';
-
- case 'hzgb2312':
- return 'HZ-GB-2312';
-
- case 'csibmsymbols':
- case 'ibmsymbols':
- return 'IBM-Symbols';
-
- case 'csibmthai':
- case 'ibmthai':
- return 'IBM-Thai';
-
- case 'ccsid858':
- case 'cp858':
- case 'ibm858':
- case 'pcmultilingual850euro':
- return 'IBM00858';
-
- case 'ccsid924':
- case 'cp924':
- case 'ebcdiclatin9euro':
- case 'ibm924':
- return 'IBM00924';
-
- case 'ccsid1140':
- case 'cp1140':
- case 'ebcdicus37euro':
- case 'ibm1140':
- return 'IBM01140';
-
- case 'ccsid1141':
- case 'cp1141':
- case 'ebcdicde273euro':
- case 'ibm1141':
- return 'IBM01141';
-
- case 'ccsid1142':
- case 'cp1142':
- case 'ebcdicdk277euro':
- case 'ebcdicno277euro':
- case 'ibm1142':
- return 'IBM01142';
-
- case 'ccsid1143':
- case 'cp1143':
- case 'ebcdicfi278euro':
- case 'ebcdicse278euro':
- case 'ibm1143':
- return 'IBM01143';
-
- case 'ccsid1144':
- case 'cp1144':
- case 'ebcdicit280euro':
- case 'ibm1144':
- return 'IBM01144';
-
- case 'ccsid1145':
- case 'cp1145':
- case 'ebcdices284euro':
- case 'ibm1145':
- return 'IBM01145';
-
- case 'ccsid1146':
- case 'cp1146':
- case 'ebcdicgb285euro':
- case 'ibm1146':
- return 'IBM01146';
-
- case 'ccsid1147':
- case 'cp1147':
- case 'ebcdicfr297euro':
- case 'ibm1147':
- return 'IBM01147';
-
- case 'ccsid1148':
- case 'cp1148':
- case 'ebcdicinternational500euro':
- case 'ibm1148':
- return 'IBM01148';
-
- case 'ccsid1149':
- case 'cp1149':
- case 'ebcdicis871euro':
- case 'ibm1149':
- return 'IBM01149';
-
- case 'cp37':
- case 'csibm37':
- case 'ebcdiccpca':
- case 'ebcdiccpnl':
- case 'ebcdiccpus':
- case 'ebcdiccpwt':
- case 'ibm37':
- return 'IBM037';
-
- case 'cp38':
- case 'csibm38':
- case 'ebcdicint':
- case 'ibm38':
- return 'IBM038';
-
- case 'cp273':
- case 'csibm273':
- case 'ibm273':
- return 'IBM273';
-
- case 'cp274':
- case 'csibm274':
- case 'ebcdicbe':
- case 'ibm274':
- return 'IBM274';
-
- case 'cp275':
- case 'csibm275':
- case 'ebcdicbr':
- case 'ibm275':
- return 'IBM275';
-
- case 'csibm277':
- case 'ebcdiccpdk':
- case 'ebcdiccpno':
- case 'ibm277':
- return 'IBM277';
-
- case 'cp278':
- case 'csibm278':
- case 'ebcdiccpfi':
- case 'ebcdiccpse':
- case 'ibm278':
- return 'IBM278';
-
- case 'cp280':
- case 'csibm280':
- case 'ebcdiccpit':
- case 'ibm280':
- return 'IBM280';
-
- case 'cp281':
- case 'csibm281':
- case 'ebcdicjpe':
- case 'ibm281':
- return 'IBM281';
-
- case 'cp284':
- case 'csibm284':
- case 'ebcdiccpes':
- case 'ibm284':
- return 'IBM284';
-
- case 'cp285':
- case 'csibm285':
- case 'ebcdiccpgb':
- case 'ibm285':
- return 'IBM285';
-
- case 'cp290':
- case 'csibm290':
- case 'ebcdicjpkana':
- case 'ibm290':
- return 'IBM290';
-
- case 'cp297':
- case 'csibm297':
- case 'ebcdiccpfr':
- case 'ibm297':
- return 'IBM297';
-
- case 'cp420':
- case 'csibm420':
- case 'ebcdiccpar1':
- case 'ibm420':
- return 'IBM420';
-
- case 'cp423':
- case 'csibm423':
- case 'ebcdiccpgr':
- case 'ibm423':
- return 'IBM423';
-
- case 'cp424':
- case 'csibm424':
- case 'ebcdiccphe':
- case 'ibm424':
- return 'IBM424';
-
- case '437':
- case 'cp437':
- case 'cspc8codepage437':
- case 'ibm437':
- return 'IBM437';
-
- case 'cp500':
- case 'csibm500':
- case 'ebcdiccpbe':
- case 'ebcdiccpch':
- case 'ibm500':
- return 'IBM500';
-
- case 'cp775':
- case 'cspc775baltic':
- case 'ibm775':
- return 'IBM775';
-
- case '850':
- case 'cp850':
- case 'cspc850multilingual':
- case 'ibm850':
- return 'IBM850';
-
- case '851':
- case 'cp851':
- case 'csibm851':
- case 'ibm851':
- return 'IBM851';
-
- case '852':
- case 'cp852':
- case 'cspcp852':
- case 'ibm852':
- return 'IBM852';
-
- case '855':
- case 'cp855':
- case 'csibm855':
- case 'ibm855':
- return 'IBM855';
-
- case '857':
- case 'cp857':
- case 'csibm857':
- case 'ibm857':
- return 'IBM857';
-
- case '860':
- case 'cp860':
- case 'csibm860':
- case 'ibm860':
- return 'IBM860';
-
- case '861':
- case 'cp861':
- case 'cpis':
- case 'csibm861':
- case 'ibm861':
- return 'IBM861';
-
- case '862':
- case 'cp862':
- case 'cspc862latinhebrew':
- case 'ibm862':
- return 'IBM862';
-
- case '863':
- case 'cp863':
- case 'csibm863':
- case 'ibm863':
- return 'IBM863';
-
- case 'cp864':
- case 'csibm864':
- case 'ibm864':
- return 'IBM864';
-
- case '865':
- case 'cp865':
- case 'csibm865':
- case 'ibm865':
- return 'IBM865';
-
- case '866':
- case 'cp866':
- case 'csibm866':
- case 'ibm866':
- return 'IBM866';
-
- case 'cp868':
- case 'cpar':
- case 'csibm868':
- case 'ibm868':
- return 'IBM868';
-
- case '869':
- case 'cp869':
- case 'cpgr':
- case 'csibm869':
- case 'ibm869':
- return 'IBM869';
-
- case 'cp870':
- case 'csibm870':
- case 'ebcdiccproece':
- case 'ebcdiccpyu':
- case 'ibm870':
- return 'IBM870';
-
- case 'cp871':
- case 'csibm871':
- case 'ebcdiccpis':
- case 'ibm871':
- return 'IBM871';
-
- case 'cp880':
- case 'csibm880':
- case 'ebcdiccyrillic':
- case 'ibm880':
- return 'IBM880';
-
- case 'cp891':
- case 'csibm891':
- case 'ibm891':
- return 'IBM891';
-
- case 'cp903':
- case 'csibm903':
- case 'ibm903':
- return 'IBM903';
-
- case '904':
- case 'cp904':
- case 'csibbm904':
- case 'ibm904':
- return 'IBM904';
-
- case 'cp905':
- case 'csibm905':
- case 'ebcdiccptr':
- case 'ibm905':
- return 'IBM905';
-
- case 'cp918':
- case 'csibm918':
- case 'ebcdiccpar2':
- case 'ibm918':
- return 'IBM918';
-
- case 'cp1026':
- case 'csibm1026':
- case 'ibm1026':
- return 'IBM1026';
-
- case 'ibm1047':
- return 'IBM1047';
-
- case 'csiso143iecp271':
- case 'iecp271':
- case 'isoir143':
- return 'IEC_P27-1';
-
- case 'csiso49inis':
- case 'inis':
- case 'isoir49':
- return 'INIS';
-
- case 'csiso50inis8':
- case 'inis8':
- case 'isoir50':
- return 'INIS-8';
-
- case 'csiso51iniscyrillic':
- case 'iniscyrillic':
- case 'isoir51':
- return 'INIS-cyrillic';
-
- case 'csinvariant':
- case 'invariant':
- return 'INVARIANT';
-
- case 'iso2022cn':
- return 'ISO-2022-CN';
-
- case 'iso2022cnext':
- return 'ISO-2022-CN-EXT';
-
- case 'csiso2022jp':
- case 'iso2022jp':
- return 'ISO-2022-JP';
-
- case 'csiso2022jp2':
- case 'iso2022jp2':
- return 'ISO-2022-JP-2';
-
- case 'csiso2022kr':
- case 'iso2022kr':
- return 'ISO-2022-KR';
-
- case 'cswindows30latin1':
- case 'iso88591windows30latin1':
- return 'ISO-8859-1-Windows-3.0-Latin-1';
-
- case 'cswindows31latin1':
- case 'iso88591windows31latin1':
- return 'ISO-8859-1-Windows-3.1-Latin-1';
-
- case 'csisolatin2':
- case 'iso88592':
- case 'iso885921987':
- case 'isoir101':
- case 'l2':
- case 'latin2':
- return 'ISO-8859-2';
-
- case 'cswindows31latin2':
- case 'iso88592windowslatin2':
- return 'ISO-8859-2-Windows-Latin-2';
-
- case 'csisolatin3':
- case 'iso88593':
- case 'iso885931988':
- case 'isoir109':
- case 'l3':
- case 'latin3':
- return 'ISO-8859-3';
-
- case 'csisolatin4':
- case 'iso88594':
- case 'iso885941988':
- case 'isoir110':
- case 'l4':
- case 'latin4':
- return 'ISO-8859-4';
-
- case 'csisolatincyrillic':
- case 'cyrillic':
- case 'iso88595':
- case 'iso885951988':
- case 'isoir144':
- return 'ISO-8859-5';
-
- case 'arabic':
- case 'asmo708':
- case 'csisolatinarabic':
- case 'ecma114':
- case 'iso88596':
- case 'iso885961987':
- case 'isoir127':
- return 'ISO-8859-6';
-
- case 'csiso88596e':
- case 'iso88596e':
- return 'ISO-8859-6-E';
-
- case 'csiso88596i':
- case 'iso88596i':
- return 'ISO-8859-6-I';
-
- case 'csisolatingreek':
- case 'ecma118':
- case 'elot928':
- case 'greek':
- case 'greek8':
- case 'iso88597':
- case 'iso885971987':
- case 'isoir126':
- return 'ISO-8859-7';
-
- case 'csisolatinhebrew':
- case 'hebrew':
- case 'iso88598':
- case 'iso885981988':
- case 'isoir138':
- return 'ISO-8859-8';
-
- case 'csiso88598e':
- case 'iso88598e':
- return 'ISO-8859-8-E';
-
- case 'csiso88598i':
- case 'iso88598i':
- return 'ISO-8859-8-I';
-
- case 'cswindows31latin5':
- case 'iso88599windowslatin5':
- return 'ISO-8859-9-Windows-Latin-5';
-
- case 'csisolatin6':
- case 'iso885910':
- case 'iso8859101992':
- case 'isoir157':
- case 'l6':
- case 'latin6':
- return 'ISO-8859-10';
-
- case 'iso885913':
- return 'ISO-8859-13';
-
- case 'iso885914':
- case 'iso8859141998':
- case 'isoceltic':
- case 'isoir199':
- case 'l8':
- case 'latin8':
- return 'ISO-8859-14';
-
- case 'iso885915':
- case 'latin9':
- return 'ISO-8859-15';
-
- case 'iso885916':
- case 'iso8859162001':
- case 'isoir226':
- case 'l10':
- case 'latin10':
- return 'ISO-8859-16';
-
- case 'iso10646j1':
- return 'ISO-10646-J-1';
-
- case 'csunicode':
- case 'iso10646ucs2':
- return 'ISO-10646-UCS-2';
-
- case 'csucs4':
- case 'iso10646ucs4':
- return 'ISO-10646-UCS-4';
-
- case 'csunicodeascii':
- case 'iso10646ucsbasic':
- return 'ISO-10646-UCS-Basic';
-
- case 'csunicodelatin1':
- case 'iso10646':
- case 'iso10646unicodelatin1':
- return 'ISO-10646-Unicode-Latin1';
-
- case 'csiso10646utf1':
- case 'iso10646utf1':
- return 'ISO-10646-UTF-1';
-
- case 'csiso115481':
- case 'iso115481':
- case 'isotr115481':
- return 'ISO-11548-1';
-
- case 'csiso90':
- case 'isoir90':
- return 'iso-ir-90';
-
- case 'csunicodeibm1261':
- case 'isounicodeibm1261':
- return 'ISO-Unicode-IBM-1261';
-
- case 'csunicodeibm1264':
- case 'isounicodeibm1264':
- return 'ISO-Unicode-IBM-1264';
-
- case 'csunicodeibm1265':
- case 'isounicodeibm1265':
- return 'ISO-Unicode-IBM-1265';
-
- case 'csunicodeibm1268':
- case 'isounicodeibm1268':
- return 'ISO-Unicode-IBM-1268';
-
- case 'csunicodeibm1276':
- case 'isounicodeibm1276':
- return 'ISO-Unicode-IBM-1276';
-
- case 'csiso646basic1983':
- case 'iso646basic1983':
- case 'ref':
- return 'ISO_646.basic:1983';
-
- case 'csiso2intlrefversion':
- case 'irv':
- case 'iso646irv1983':
- case 'isoir2':
- return 'ISO_646.irv:1983';
-
- case 'csiso2033':
- case 'e13b':
- case 'iso20331983':
- case 'isoir98':
- return 'ISO_2033-1983';
-
- case 'csiso5427cyrillic':
- case 'iso5427':
- case 'isoir37':
- return 'ISO_5427';
-
- case 'iso5427cyrillic1981':
- case 'iso54271981':
- case 'isoir54':
- return 'ISO_5427:1981';
-
- case 'csiso5428greek':
- case 'iso54281980':
- case 'isoir55':
- return 'ISO_5428:1980';
-
- case 'csiso6937add':
- case 'iso6937225':
- case 'isoir152':
- return 'ISO_6937-2-25';
-
- case 'csisotextcomm':
- case 'iso69372add':
- case 'isoir142':
- return 'ISO_6937-2-add';
-
- case 'csiso8859supp':
- case 'iso8859supp':
- case 'isoir154':
- case 'latin125':
- return 'ISO_8859-supp';
-
- case 'csiso10367box':
- case 'iso10367box':
- case 'isoir155':
- return 'ISO_10367-box';
-
- case 'csiso15italian':
- case 'iso646it':
- case 'isoir15':
- case 'it':
- return 'IT';
-
- case 'csiso13jisc6220jp':
- case 'isoir13':
- case 'jisc62201969':
- case 'jisc62201969jp':
- case 'katakana':
- case 'x2017':
- return 'JIS_C6220-1969-jp';
-
- case 'csiso14jisc6220ro':
- case 'iso646jp':
- case 'isoir14':
- case 'jisc62201969ro':
- case 'jp':
- return 'JIS_C6220-1969-ro';
-
- case 'csiso42jisc62261978':
- case 'isoir42':
- case 'jisc62261978':
- return 'JIS_C6226-1978';
-
- case 'csiso87jisx208':
- case 'isoir87':
- case 'jisc62261983':
- case 'jisx2081983':
- case 'x208':
- return 'JIS_C6226-1983';
-
- case 'csiso91jisc62291984a':
- case 'isoir91':
- case 'jisc62291984a':
- case 'jpocra':
- return 'JIS_C6229-1984-a';
-
- case 'csiso92jisc62991984b':
- case 'iso646jpocrb':
- case 'isoir92':
- case 'jisc62291984b':
- case 'jpocrb':
- return 'JIS_C6229-1984-b';
-
- case 'csiso93jis62291984badd':
- case 'isoir93':
- case 'jisc62291984badd':
- case 'jpocrbadd':
- return 'JIS_C6229-1984-b-add';
-
- case 'csiso94jis62291984hand':
- case 'isoir94':
- case 'jisc62291984hand':
- case 'jpocrhand':
- return 'JIS_C6229-1984-hand';
-
- case 'csiso95jis62291984handadd':
- case 'isoir95':
- case 'jisc62291984handadd':
- case 'jpocrhandadd':
- return 'JIS_C6229-1984-hand-add';
-
- case 'csiso96jisc62291984kana':
- case 'isoir96':
- case 'jisc62291984kana':
- return 'JIS_C6229-1984-kana';
-
- case 'csjisencoding':
- case 'jisencoding':
- return 'JIS_Encoding';
-
- case 'cshalfwidthkatakana':
- case 'jisx201':
- case 'x201':
- return 'JIS_X0201';
-
- case 'csiso159jisx2121990':
- case 'isoir159':
- case 'jisx2121990':
- case 'x212':
- return 'JIS_X0212-1990';
-
- case 'csiso141jusib1002':
- case 'iso646yu':
- case 'isoir141':
- case 'js':
- case 'jusib1002':
- case 'yu':
- return 'JUS_I.B1.002';
-
- case 'csiso147macedonian':
- case 'isoir147':
- case 'jusib1003mac':
- case 'macedonian':
- return 'JUS_I.B1.003-mac';
-
- case 'csiso146serbian':
- case 'isoir146':
- case 'jusib1003serb':
- case 'serbian':
- return 'JUS_I.B1.003-serb';
-
- case 'koi7switched':
- return 'KOI7-switched';
-
- case 'cskoi8r':
- case 'koi8r':
- return 'KOI8-R';
-
- case 'koi8u':
- return 'KOI8-U';
-
- case 'csksc5636':
- case 'iso646kr':
- case 'ksc5636':
- return 'KSC5636';
-
- case 'cskz1048':
- case 'kz1048':
- case 'rk1048':
- case 'strk10482002':
- return 'KZ-1048';
-
- case 'csiso19latingreek':
- case 'isoir19':
- case 'latingreek':
- return 'latin-greek';
-
- case 'csiso27latingreek1':
- case 'isoir27':
- case 'latingreek1':
- return 'Latin-greek-1';
-
- case 'csiso158lap':
- case 'isoir158':
- case 'lap':
- case 'latinlap':
- return 'latin-lap';
-
- case 'csmacintosh':
- case 'mac':
- case 'macintosh':
- return 'macintosh';
-
- case 'csmicrosoftpublishing':
- case 'microsoftpublishing':
- return 'Microsoft-Publishing';
-
- case 'csmnem':
- case 'mnem':
- return 'MNEM';
-
- case 'csmnemonic':
- case 'mnemonic':
- return 'MNEMONIC';
-
- case 'csiso86hungarian':
- case 'hu':
- case 'iso646hu':
- case 'isoir86':
- case 'msz77953':
- return 'MSZ_7795.3';
-
- case 'csnatsdano':
- case 'isoir91':
- case 'natsdano':
- return 'NATS-DANO';
-
- case 'csnatsdanoadd':
- case 'isoir92':
- case 'natsdanoadd':
- return 'NATS-DANO-ADD';
-
- case 'csnatssefi':
- case 'isoir81':
- case 'natssefi':
- return 'NATS-SEFI';
-
- case 'csnatssefiadd':
- case 'isoir82':
- case 'natssefiadd':
- return 'NATS-SEFI-ADD';
-
- case 'csiso151cuba':
- case 'cuba':
- case 'iso646cu':
- case 'isoir151':
- case 'ncnc1081':
- return 'NC_NC00-10:81';
-
- case 'csiso69french':
- case 'fr':
- case 'iso646fr':
- case 'isoir69':
- case 'nfz62010':
- return 'NF_Z_62-010';
-
- case 'csiso25french':
- case 'iso646fr1':
- case 'isoir25':
- case 'nfz620101973':
- return 'NF_Z_62-010_(1973)';
-
- case 'csiso60danishnorwegian':
- case 'csiso60norwegian1':
- case 'iso646no':
- case 'isoir60':
- case 'no':
- case 'ns45511':
- return 'NS_4551-1';
-
- case 'csiso61norwegian2':
- case 'iso646no2':
- case 'isoir61':
- case 'no2':
- case 'ns45512':
- return 'NS_4551-2';
-
- case 'osdebcdicdf3irv':
- return 'OSD_EBCDIC_DF03_IRV';
-
- case 'osdebcdicdf41':
- return 'OSD_EBCDIC_DF04_1';
-
- case 'osdebcdicdf415':
- return 'OSD_EBCDIC_DF04_15';
-
- case 'cspc8danishnorwegian':
- case 'pc8danishnorwegian':
- return 'PC8-Danish-Norwegian';
-
- case 'cspc8turkish':
- case 'pc8turkish':
- return 'PC8-Turkish';
-
- case 'csiso16portuguese':
- case 'iso646pt':
- case 'isoir16':
- case 'pt':
- return 'PT';
-
- case 'csiso84portuguese2':
- case 'iso646pt2':
- case 'isoir84':
- case 'pt2':
- return 'PT2';
-
- case 'cp154':
- case 'csptcp154':
- case 'cyrillicasian':
- case 'pt154':
- case 'ptcp154':
- return 'PTCP154';
-
- case 'scsu':
- return 'SCSU';
-
- case 'csiso10swedish':
- case 'fi':
- case 'iso646fi':
- case 'iso646se':
- case 'isoir10':
- case 'se':
- case 'sen850200b':
- return 'SEN_850200_B';
-
- case 'csiso11swedishfornames':
- case 'iso646se2':
- case 'isoir11':
- case 'se2':
- case 'sen850200c':
- return 'SEN_850200_C';
-
- case 'csshiftjis':
- case 'mskanji':
- case 'shiftjis':
- return 'Shift_JIS';
-
- case 'csiso102t617bit':
- case 'isoir102':
- case 't617bit':
- return 'T.61-7bit';
-
- case 'csiso103t618bit':
- case 'isoir103':
- case 't61':
- case 't618bit':
- return 'T.61-8bit';
-
- case 'csiso128t101g2':
- case 'isoir128':
- case 't101g2':
- return 'T.101-G2';
-
- case 'cstscii':
- case 'tscii':
- return 'TSCII';
-
- case 'csunicode11':
- case 'unicode11':
- return 'UNICODE-1-1';
-
- case 'csunicode11utf7':
- case 'unicode11utf7':
- return 'UNICODE-1-1-UTF-7';
-
- case 'csunknown8bit':
- case 'unknown8bit':
- return 'UNKNOWN-8BIT';
-
- case 'ansix341968':
- case 'ansix341986':
- case 'ascii':
- case 'cp367':
- case 'csascii':
- case 'ibm367':
- case 'iso646irv1991':
- case 'iso646us':
- case 'isoir6':
- case 'us':
- case 'usascii':
- return 'US-ASCII';
-
- case 'csusdk':
- case 'usdk':
- return 'us-dk';
-
- case 'utf7':
- return 'UTF-7';
-
- case 'utf8':
- return 'UTF-8';
-
- case 'utf16':
- return 'UTF-16';
-
- case 'utf16be':
- return 'UTF-16BE';
-
- case 'utf16le':
- return 'UTF-16LE';
-
- case 'utf32':
- return 'UTF-32';
-
- case 'utf32be':
- return 'UTF-32BE';
-
- case 'utf32le':
- return 'UTF-32LE';
-
- case 'csventurainternational':
- case 'venturainternational':
- return 'Ventura-International';
-
- case 'csventuramath':
- case 'venturamath':
- return 'Ventura-Math';
-
- case 'csventuraus':
- case 'venturaus':
- return 'Ventura-US';
-
- case 'csiso70videotexsupp1':
- case 'isoir70':
- case 'videotexsuppl':
- return 'videotex-suppl';
-
- case 'csviqr':
- case 'viqr':
- return 'VIQR';
-
- case 'csviscii':
- case 'viscii':
- return 'VISCII';
-
- case 'cswindows31j':
- case 'windows31j':
- return 'Windows-31J';
-
- case 'iso885911':
- case 'tis620':
- return 'windows-874';
-
- case 'cseuckr':
- case 'csksc56011987':
- case 'euckr':
- case 'isoir149':
- case 'korean':
- case 'ksc5601':
- case 'ksc56011987':
- case 'ksc56011989':
- case 'windows949':
- return 'windows-949';
-
- case 'windows1250':
- return 'windows-1250';
-
- case 'windows1251':
- return 'windows-1251';
-
- case 'cp819':
- case 'csisolatin1':
- case 'ibm819':
- case 'iso88591':
- case 'iso885911987':
- case 'isoir100':
- case 'l1':
- case 'latin1':
- case 'windows1252':
- return 'windows-1252';
-
- case 'windows1253':
- return 'windows-1253';
-
- case 'csisolatin5':
- case 'iso88599':
- case 'iso885991989':
- case 'isoir148':
- case 'l5':
- case 'latin5':
- case 'windows1254':
- return 'windows-1254';
-
- case 'windows1255':
- return 'windows-1255';
-
- case 'windows1256':
- return 'windows-1256';
-
- case 'windows1257':
- return 'windows-1257';
-
- case 'windows1258':
- return 'windows-1258';
-
- default:
- return $charset;
- }
- }
-
- function get_curl_version()
- {
- if (is_array($curl = curl_version()))
- {
- $curl = $curl['version'];
- }
- elseif (substr($curl, 0, 5) === 'curl/')
- {
- $curl = substr($curl, 5, strcspn($curl, "\x09\x0A\x0B\x0C\x0D", 5));
- }
- elseif (substr($curl, 0, 8) === 'libcurl/')
- {
- $curl = substr($curl, 8, strcspn($curl, "\x09\x0A\x0B\x0C\x0D", 8));
- }
- else
- {
- $curl = 0;
- }
- return $curl;
- }
-
- function is_subclass_of($class1, $class2)
- {
- if (func_num_args() !== 2)
- {
- trigger_error('Wrong parameter count for SimplePie_Misc::is_subclass_of()', E_USER_WARNING);
- }
- elseif (version_compare(PHP_VERSION, '5.0.3', '>=') || is_object($class1))
- {
- return is_subclass_of($class1, $class2);
- }
- elseif (is_string($class1) && is_string($class2))
- {
- if (class_exists($class1))
- {
- if (class_exists($class2))
- {
- $class2 = strtolower($class2);
- while ($class1 = strtolower(get_parent_class($class1)))
- {
- if ($class1 === $class2)
- {
- return true;
- }
- }
- }
- }
- else
- {
- trigger_error('Unknown class passed as parameter', E_USER_WARNNG);
- }
- }
- return false;
- }
-
- /**
- * Strip HTML comments
- *
- * @access public
- * @param string $data Data to strip comments from
- * @return string Comment stripped string
- */
- function strip_comments($data)
- {
- $output = '';
- while (($start = strpos($data, '<!--')) !== false)
- {
- $output .= substr($data, 0, $start);
- if (($end = strpos($data, '-->', $start)) !== false)
- {
- $data = substr_replace($data, '', 0, $end + 3);
- }
- else
- {
- $data = '';
- }
- }
- return $output . $data;
- }
-
- function parse_date($dt)
- {
- $parser = SimplePie_Parse_Date::get();
- return $parser->parse($dt);
- }
-
- /**
- * Decode HTML entities
- *
- * @static
- * @access public
- * @param string $data Input data
- * @return string Output data
- */
- function entities_decode($data)
- {
- $decoder = new SimplePie_Decode_HTML_Entities($data);
- return $decoder->parse();
- }
-
- /**
- * Remove RFC822 comments
- *
- * @access public
- * @param string $data Data to strip comments from
- * @return string Comment stripped string
- */
- function uncomment_rfc822($string)
- {
- $string = (string) $string;
- $position = 0;
- $length = strlen($string);
- $depth = 0;
-
- $output = '';
-
- while ($position < $length && ($pos = strpos($string, '(', $position)) !== false)
- {
- $output .= substr($string, $position, $pos - $position);
- $position = $pos + 1;
- if ($string[$pos - 1] !== '\\')
- {
- $depth++;
- while ($depth && $position < $length)
- {
- $position += strcspn($string, '()', $position);
- if ($string[$position - 1] === '\\')
- {
- $position++;
- continue;
- }
- elseif (isset($string[$position]))
- {
- switch ($string[$position])
- {
- case '(':
- $depth++;
- break;
-
- case ')':
- $depth--;
- break;
- }
- $position++;
- }
- else
- {
- break;
- }
- }
- }
- else
- {
- $output .= '(';
- }
- }
- $output .= substr($string, $position);
-
- return $output;
- }
-
- function parse_mime($mime)
- {
- if (($pos = strpos($mime, ';')) === false)
- {
- return trim($mime);
- }
- else
- {
- return trim(substr($mime, 0, $pos));
- }
- }
-
- function htmlspecialchars_decode($string, $quote_style)
- {
- if (function_exists('htmlspecialchars_decode'))
- {
- return htmlspecialchars_decode($string, $quote_style);
- }
- else
- {
- return strtr($string, array_flip(get_html_translation_table(HTML_SPECIALCHARS, $quote_style)));
- }
- }
-
- function atom_03_construct_type($attribs)
- {
- if (isset($attribs['']['mode']) && strtolower(trim($attribs['']['mode']) === 'base64'))
- {
- $mode = SIMPLEPIE_CONSTRUCT_BASE64;
- }
- else
- {
- $mode = SIMPLEPIE_CONSTRUCT_NONE;
- }
- if (isset($attribs['']['type']))
- {
- switch (strtolower(trim($attribs['']['type'])))
- {
- case 'text':
- case 'text/plain':
- return SIMPLEPIE_CONSTRUCT_TEXT | $mode;
-
- case 'html':
- case 'text/html':
- return SIMPLEPIE_CONSTRUCT_HTML | $mode;
-
- case 'xhtml':
- case 'application/xhtml+xml':
- return SIMPLEPIE_CONSTRUCT_XHTML | $mode;
-
- default:
- return SIMPLEPIE_CONSTRUCT_NONE | $mode;
- }
- }
- else
- {
- return SIMPLEPIE_CONSTRUCT_TEXT | $mode;
- }
- }
-
- function atom_10_construct_type($attribs)
- {
- if (isset($attribs['']['type']))
- {
- switch (strtolower(trim($attribs['']['type'])))
- {
- case 'text':
- return SIMPLEPIE_CONSTRUCT_TEXT;
-
- case 'html':
- return SIMPLEPIE_CONSTRUCT_HTML;
-
- case 'xhtml':
- return SIMPLEPIE_CONSTRUCT_XHTML;
-
- default:
- return SIMPLEPIE_CONSTRUCT_NONE;
- }
- }
- return SIMPLEPIE_CONSTRUCT_TEXT;
- }
-
- function atom_10_content_construct_type($attribs)
- {
- if (isset($attribs['']['type']))
- {
- $type = strtolower(trim($attribs['']['type']));
- switch ($type)
- {
- case 'text':
- return SIMPLEPIE_CONSTRUCT_TEXT;
-
- case 'html':
- return SIMPLEPIE_CONSTRUCT_HTML;
-
- case 'xhtml':
- return SIMPLEPIE_CONSTRUCT_XHTML;
- }
- if (in_array(substr($type, -4), array('+xml', '/xml')) || substr($type, 0, 5) === 'text/')
- {
- return SIMPLEPIE_CONSTRUCT_NONE;
- }
- else
- {
- return SIMPLEPIE_CONSTRUCT_BASE64;
- }
- }
- else
- {
- return SIMPLEPIE_CONSTRUCT_TEXT;
- }
- }
-
- function is_isegment_nz_nc($string)
- {
- return (bool) preg_match('/^([A-Za-z0-9\-._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!$&\'()*+,;=@]|(%[0-9ABCDEF]{2}))+$/u', $string);
- }
-
- function space_seperated_tokens($string)
- {
- $space_characters = "\x20\x09\x0A\x0B\x0C\x0D";
- $string_length = strlen($string);
-
- $position = strspn($string, $space_characters);
- $tokens = array();
-
- while ($position < $string_length)
- {
- $len = strcspn($string, $space_characters, $position);
- $tokens[] = substr($string, $position, $len);
- $position += $len;
- $position += strspn($string, $space_characters, $position);
- }
-
- return $tokens;
- }
-
- function array_unique($array)
- {
- if (version_compare(PHP_VERSION, '5.2', '>='))
- {
- return array_unique($array);
- }
- else
- {
- $array = (array) $array;
- $new_array = array();
- $new_array_strings = array();
- foreach ($array as $key => $value)
- {
- if (is_object($value))
- {
- if (method_exists($value, '__toString'))
- {
- $cmp = $value->__toString();
- }
- else
- {
- trigger_error('Object of class ' . get_class($value) . ' could not be converted to string', E_USER_ERROR);
- }
- }
- elseif (is_array($value))
- {
- $cmp = (string) reset($value);
- }
- else
- {
- $cmp = (string) $value;
- }
- if (!in_array($cmp, $new_array_strings))
- {
- $new_array[$key] = $value;
- $new_array_strings[] = $cmp;
- }
- }
- return $new_array;
- }
- }
-
- /**
- * Converts a unicode codepoint to a UTF-8 character
- *
- * @static
- * @access public
- * @param int $codepoint Unicode codepoint
- * @return string UTF-8 character
- */
- function codepoint_to_utf8($codepoint)
- {
- $codepoint = (int) $codepoint;
- if ($codepoint < 0)
- {
- return false;
- }
- else if ($codepoint <= 0x7f)
- {
- return chr($codepoint);
- }
- else if ($codepoint <= 0x7ff)
- {
- return chr(0xc0 | ($codepoint >> 6)) . chr(0x80 | ($codepoint & 0x3f));
- }
- else if ($codepoint <= 0xffff)
- {
- return chr(0xe0 | ($codepoint >> 12)) . chr(0x80 | (($codepoint >> 6) & 0x3f)) . chr(0x80 | ($codepoint & 0x3f));
- }
- else if ($codepoint <= 0x10ffff)
- {
- return chr(0xf0 | ($codepoint >> 18)) . chr(0x80 | (($codepoint >> 12) & 0x3f)) . chr(0x80 | (($codepoint >> 6) & 0x3f)) . chr(0x80 | ($codepoint & 0x3f));
- }
- else
- {
- // U+FFFD REPLACEMENT CHARACTER
- return "\xEF\xBF\xBD";
- }
- }
-
- /**
- * Re-implementation of PHP 5's stripos()
- *
- * Returns the numeric position of the first occurrence of needle in the
- * haystack string.
- *
- * @static
- * @access string
- * @param object $haystack
- * @param string $needle Note that the needle may be a string of one or more
- * characters. If needle is not a string, it is converted to an integer
- * and applied as the ordinal value of a character.
- * @param int $offset The optional offset parameter allows you to specify which
- * character in haystack to start searching. The position returned is still
- * relative to the beginning of haystack.
- * @return bool If needle is not found, stripos() will return boolean false.
- */
- function stripos($haystack, $needle, $offset = 0)
- {
- if (function_exists('stripos'))
- {
- return stripos($haystack, $needle, $offset);
- }
- else
- {
- if (is_string($needle))
- {
- $needle = strtolower($needle);
- }
- elseif (is_int($needle) || is_bool($needle) || is_double($needle))
- {
- $needle = strtolower(chr($needle));
- }
- else
- {
- trigger_error('needle is not a string or an integer', E_USER_WARNING);
- return false;
- }
-
- return strpos(strtolower($haystack), $needle, $offset);
- }
- }
-
- /**
- * Similar to parse_str()
- *
- * Returns an associative array of name/value pairs, where the value is an
- * array of values that have used the same name
- *
- * @static
- * @access string
- * @param string $str The input string.
- * @return array
- */
- function parse_str($str)
- {
- $return = array();
- $str = explode('&', $str);
-
- foreach ($str as $section)
- {
- if (strpos($section, '=') !== false)
- {
- list($name, $value) = explode('=', $section, 2);
- $return[urldecode($name)][] = urldecode($value);
- }
- else
- {
- $return[urldecode($section)][] = null;
- }
- }
-
- return $return;
- }
-
- /**
- * Detect XML encoding, as per XML 1.0 Appendix F.1
- *
- * @todo Add support for EBCDIC
- * @param string $data XML data
- * @return array Possible encodings
- */
- function xml_encoding($data)
- {
- // UTF-32 Big Endian BOM
- if (substr($data, 0, 4) === "\x00\x00\xFE\xFF")
- {
- $encoding[] = 'UTF-32BE';
- }
- // UTF-32 Little Endian BOM
- elseif (substr($data, 0, 4) === "\xFF\xFE\x00\x00")
- {
- $encoding[] = 'UTF-32LE';
- }
- // UTF-16 Big Endian BOM
- elseif (substr($data, 0, 2) === "\xFE\xFF")
- {
- $encoding[] = 'UTF-16BE';
- }
- // UTF-16 Little Endian BOM
- elseif (substr($data, 0, 2) === "\xFF\xFE")
- {
- $encoding[] = 'UTF-16LE';
- }
- // UTF-8 BOM
- elseif (substr($data, 0, 3) === "\xEF\xBB\xBF")
- {
- $encoding[] = 'UTF-8';
- }
- // UTF-32 Big Endian Without BOM
- elseif (substr($data, 0, 20) === "\x00\x00\x00\x3C\x00\x00\x00\x3F\x00\x00\x00\x78\x00\x00\x00\x6D\x00\x00\x00\x6C")
- {
- if ($pos = strpos($data, "\x00\x00\x00\x3F\x00\x00\x00\x3E"))
- {
- $parser = new SimplePie_XML_Declaration_Parser(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 20), 'UTF-32BE', 'UTF-8'));
- if ($parser->parse())
- {
- $encoding[] = $parser->encoding;
- }
- }
- $encoding[] = 'UTF-32BE';
- }
- // UTF-32 Little Endian Without BOM
- elseif (substr($data, 0, 20) === "\x3C\x00\x00\x00\x3F\x00\x00\x00\x78\x00\x00\x00\x6D\x00\x00\x00\x6C\x00\x00\x00")
- {
- if ($pos = strpos($data, "\x3F\x00\x00\x00\x3E\x00\x00\x00"))
- {
- $parser = new SimplePie_XML_Declaration_Parser(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 20), 'UTF-32LE', 'UTF-8'));
- if ($parser->parse())
- {
- $encoding[] = $parser->encoding;
- }
- }
- $encoding[] = 'UTF-32LE';
- }
- // UTF-16 Big Endian Without BOM
- elseif (substr($data, 0, 10) === "\x00\x3C\x00\x3F\x00\x78\x00\x6D\x00\x6C")
- {
- if ($pos = strpos($data, "\x00\x3F\x00\x3E"))
- {
- $parser = new SimplePie_XML_Declaration_Parser(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 10), 'UTF-16BE', 'UTF-8'));
- if ($parser->parse())
- {
- $encoding[] = $parser->encoding;
- }
- }
- $encoding[] = 'UTF-16BE';
- }
- // UTF-16 Little Endian Without BOM
- elseif (substr($data, 0, 10) === "\x3C\x00\x3F\x00\x78\x00\x6D\x00\x6C\x00")
- {
- if ($pos = strpos($data, "\x3F\x00\x3E\x00"))
- {
- $parser = new SimplePie_XML_Declaration_Parser(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 10), 'UTF-16LE', 'UTF-8'));
- if ($parser->parse())
- {
- $encoding[] = $parser->encoding;
- }
- }
- $encoding[] = 'UTF-16LE';
- }
- // US-ASCII (or superset)
- elseif (substr($data, 0, 5) === "\x3C\x3F\x78\x6D\x6C")
- {
- if ($pos = strpos($data, "\x3F\x3E"))
- {
- $parser = new SimplePie_XML_Declaration_Parser(substr($data, 5, $pos - 5));
- if ($parser->parse())
- {
- $encoding[] = $parser->encoding;
- }
- }
- $encoding[] = 'UTF-8';
- }
- // Fallback to UTF-8
- else
- {
- $encoding[] = 'UTF-8';
- }
- return $encoding;
- }
-
- function output_javascript()
- {
- if (function_exists('ob_gzhandler'))
- {
- ob_start('ob_gzhandler');
- }
- header('Content-type: text/javascript; charset: UTF-8');
- header('Cache-Control: must-revalidate');
- header('Expires: ' . gmdate('D, d M Y H:i:s', time() + 604800) . ' GMT'); // 7 days
- ?>
-function embed_odeo(link) {
- document.writeln('<embed src="http://odeo.com/flash/audio_player_fullsize.swf" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" quality="high" width="440" height="80" wmode="transparent" allowScriptAccess="any" flashvars="valid_sample_rate=true&external_url='+link+'"></embed>');
-}
-
-function embed_quicktime(type, bgcolor, width, height, link, placeholder, loop) {
- if (placeholder != '') {
- document.writeln('<embed type="'+type+'" style="cursor:hand; cursor:pointer;" href="'+link+'" src="'+placeholder+'" width="'+width+'" height="'+height+'" autoplay="false" target="myself" controller="false" loop="'+loop+'" scale="aspect" bgcolor="'+bgcolor+'" pluginspage="http://www.apple.com/quicktime/download/"></embed>');
- }
- else {
- document.writeln('<embed type="'+type+'" style="cursor:hand; cursor:pointer;" src="'+link+'" width="'+width+'" height="'+height+'" autoplay="false" target="myself" controller="true" loop="'+loop+'" scale="aspect" bgcolor="'+bgcolor+'" pluginspage="http://www.apple.com/quicktime/download/"></embed>');
- }
-}
-
-function embed_flash(bgcolor, width, height, link, loop, type) {
- document.writeln('<embed src="'+link+'" pluginspage="http://www.macromedia.com/go/getflashplayer" type="'+type+'" quality="high" width="'+width+'" height="'+height+'" bgcolor="'+bgcolor+'" loop="'+loop+'"></embed>');
-}
-
-function embed_flv(width, height, link, placeholder, loop, player) {
- document.writeln('<embed src="'+player+'" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" quality="high" width="'+width+'" height="'+height+'" wmode="transparent" flashvars="file='+link+'&autostart=false&repeat='+loop+'&showdigits=true&showfsbutton=false"></embed>');
-}
-
-function embed_wmedia(width, height, link) {
- document.writeln('<embed type="application/x-mplayer2" src="'+link+'" autosize="1" width="'+width+'" height="'+height+'" showcontrols="1" showstatusbar="0" showdisplay="0" autostart="0"></embed>');
-}
- <?php
- }
-}
-
-/**
- * Decode HTML Entities
- *
- * This implements HTML5 as of revision 967 (2007-06-28)
- *
- * @package SimplePie
- */
-class SimplePie_Decode_HTML_Entities
-{
- /**
- * Data to be parsed
- *
- * @access private
- * @var string
- */
- var $data = '';
-
- /**
- * Currently consumed bytes
- *
- * @access private
- * @var string
- */
- var $consumed = '';
-
- /**
- * Position of the current byte being parsed
- *
- * @access private
- * @var int
- */
- var $position = 0;
-
- /**
- * Create an instance of the class with the input data
- *
- * @access public
- * @param string $data Input data
- */
- function SimplePie_Decode_HTML_Entities($data)
- {
- $this->data = $data;
- }
-
- /**
- * Parse the input data
- *
- * @access public
- * @return string Output data
- */
- function parse()
- {
- while (($this->position = strpos($this->data, '&', $this->position)) !== false)
- {
- $this->consume();
- $this->entity();
- $this->consumed = '';
- }
- return $this->data;
- }
-
- /**
- * Consume the next byte
- *
- * @access private
- * @return mixed The next byte, or false, if there is no more data
- */
- function consume()
- {
- if (isset($this->data[$this->position]))
- {
- $this->consumed .= $this->data[$this->position];
- return $this->data[$this->position++];
- }
- else
- {
- return false;
- }
- }
-
- /**
- * Consume a range of characters
- *
- * @access private
- * @param string $chars Characters to consume
- * @return mixed A series of characters that match the range, or false
- */
- function consume_range($chars)
- {
- if ($len = strspn($this->data, $chars, $this->position))
- {
- $data = substr($this->data, $this->position, $len);
- $this->consumed .= $data;
- $this->position += $len;
- return $data;
- }
- else
- {
- return false;
- }
- }
-
- /**
- * Unconsume one byte
- *
- * @access private
- */
- function unconsume()
- {
- $this->consumed = substr($this->consumed, 0, -1);
- $this->position--;
- }
-
- /**
- * Decode an entity
- *
- * @access private
- */
- function entity()
- {
- switch ($this->consume())
- {
- case "\x09":
- case "\x0A":
- case "\x0B":
- case "\x0B":
- case "\x0C":
- case "\x20":
- case "\x3C":
- case "\x26":
- case false:
- break;
-
- case "\x23":
- switch ($this->consume())
- {
- case "\x78":
- case "\x58":
- $range = '0123456789ABCDEFabcdef';
- $hex = true;
- break;
-
- default:
- $range = '0123456789';
- $hex = false;
- $this->unconsume();
- break;
- }
-
- if ($codepoint = $this->consume_range($range))
- {
- static $windows_1252_specials = array(0x0D => "\x0A", 0x80 => "\xE2\x82\xAC", 0x81 => "\xEF\xBF\xBD", 0x82 => "\xE2\x80\x9A", 0x83 => "\xC6\x92", 0x84 => "\xE2\x80\x9E", 0x85 => "\xE2\x80\xA6", 0x86 => "\xE2\x80\xA0", 0x87 => "\xE2\x80\xA1", 0x88 => "\xCB\x86", 0x89 => "\xE2\x80\xB0", 0x8A => "\xC5\xA0", 0x8B => "\xE2\x80\xB9", 0x8C => "\xC5\x92", 0x8D => "\xEF\xBF\xBD", 0x8E => "\xC5\xBD", 0x8F => "\xEF\xBF\xBD", 0x90 => "\xEF\xBF\xBD", 0x91 => "\xE2\x80\x98", 0x92 => "\xE2\x80\x99", 0x93 => "\xE2\x80\x9C", 0x94 => "\xE2\x80\x9D", 0x95 => "\xE2\x80\xA2", 0x96 => "\xE2\x80\x93", 0x97 => "\xE2\x80\x94", 0x98 => "\xCB\x9C", 0x99 => "\xE2\x84\xA2", 0x9A => "\xC5\xA1", 0x9B => "\xE2\x80\xBA", 0x9C => "\xC5\x93", 0x9D => "\xEF\xBF\xBD", 0x9E => "\xC5\xBE", 0x9F => "\xC5\xB8");
-
- if ($hex)
- {
- $codepoint = hexdec($codepoint);
- }
- else
- {
- $codepoint = intval($codepoint);
- }
-
- if (isset($windows_1252_specials[$codepoint]))
- {
- $replacement = $windows_1252_specials[$codepoint];
- }
- else
- {
- $replacement = SimplePie_Misc::codepoint_to_utf8($codepoint);
- }
-
- if (!in_array($this->consume(), array(';', false), true))
- {
- $this->unconsume();
- }
-
- $consumed_length = strlen($this->consumed);
- $this->data = substr_replace($this->data, $replacement, $this->position - $consumed_length, $consumed_length);
- $this->position += strlen($replacement) - $consumed_length;
- }
- break;
-
- default:
- static $entities = array('Aacute' => "\xC3\x81", 'aacute' => "\xC3\xA1", 'Aacute;' => "\xC3\x81", 'aacute;' => "\xC3\xA1", 'Acirc' => "\xC3\x82", 'acirc' => "\xC3\xA2", 'Acirc;' => "\xC3\x82", 'acirc;' => "\xC3\xA2", 'acute' => "\xC2\xB4", 'acute;' => "\xC2\xB4", 'AElig' => "\xC3\x86", 'aelig' => "\xC3\xA6", 'AElig;' => "\xC3\x86", 'aelig;' => "\xC3\xA6", 'Agrave' => "\xC3\x80", 'agrave' => "\xC3\xA0", 'Agrave;' => "\xC3\x80", 'agrave;' => "\xC3\xA0", 'alefsym;' => "\xE2\x84\xB5", 'Alpha;' => "\xCE\x91", 'alpha;' => "\xCE\xB1", 'AMP' => "\x26", 'amp' => "\x26", 'AMP;' => "\x26", 'amp;' => "\x26", 'and;' => "\xE2\x88\xA7", 'ang;' => "\xE2\x88\xA0", 'apos;' => "\x27", 'Aring' => "\xC3\x85", 'aring' => "\xC3\xA5", 'Aring;' => "\xC3\x85", 'aring;' => "\xC3\xA5", 'asymp;' => "\xE2\x89\x88", 'Atilde' => "\xC3\x83", 'atilde' => "\xC3\xA3", 'Atilde;' => "\xC3\x83", 'atilde;' => "\xC3\xA3", 'Auml' => "\xC3\x84", 'auml' => "\xC3\xA4", 'Auml;' => "\xC3\x84", 'auml;' => "\xC3\xA4", 'bdquo;' => "\xE2\x80\x9E", 'Beta;' => "\xCE\x92", 'beta;' => "\xCE\xB2", 'brvbar' => "\xC2\xA6", 'brvbar;' => "\xC2\xA6", 'bull;' => "\xE2\x80\xA2", 'cap;' => "\xE2\x88\xA9", 'Ccedil' => "\xC3\x87", 'ccedil' => "\xC3\xA7", 'Ccedil;' => "\xC3\x87", 'ccedil;' => "\xC3\xA7", 'cedil' => "\xC2\xB8", 'cedil;' => "\xC2\xB8", 'cent' => "\xC2\xA2", 'cent;' => "\xC2\xA2", 'Chi;' => "\xCE\xA7", 'chi;' => "\xCF\x87", 'circ;' => "\xCB\x86", 'clubs;' => "\xE2\x99\xA3", 'cong;' => "\xE2\x89\x85", 'COPY' => "\xC2\xA9", 'copy' => "\xC2\xA9", 'COPY;' => "\xC2\xA9", 'copy;' => "\xC2\xA9", 'crarr;' => "\xE2\x86\xB5", 'cup;' => "\xE2\x88\xAA", 'curren' => "\xC2\xA4", 'curren;' => "\xC2\xA4", 'Dagger;' => "\xE2\x80\xA1", 'dagger;' => "\xE2\x80\xA0", 'dArr;' => "\xE2\x87\x93", 'darr;' => "\xE2\x86\x93", 'deg' => "\xC2\xB0", 'deg;' => "\xC2\xB0", 'Delta;' => "\xCE\x94", 'delta;' => "\xCE\xB4", 'diams;' => "\xE2\x99\xA6", 'divide' => "\xC3\xB7", 'divide;' => "\xC3\xB7", 'Eacute' => "\xC3\x89", 'eacute' => "\xC3\xA9", 'Eacute;' => "\xC3\x89", 'eacute;' => "\xC3\xA9", 'Ecirc' => "\xC3\x8A", 'ecirc' => "\xC3\xAA", 'Ecirc;' => "\xC3\x8A", 'ecirc;' => "\xC3\xAA", 'Egrave' => "\xC3\x88", 'egrave' => "\xC3\xA8", 'Egrave;' => "\xC3\x88", 'egrave;' => "\xC3\xA8", 'empty;' => "\xE2\x88\x85", 'emsp;' => "\xE2\x80\x83", 'ensp;' => "\xE2\x80\x82", 'Epsilon;' => "\xCE\x95", 'epsilon;' => "\xCE\xB5", 'equiv;' => "\xE2\x89\xA1", 'Eta;' => "\xCE\x97", 'eta;' => "\xCE\xB7", 'ETH' => "\xC3\x90", 'eth' => "\xC3\xB0", 'ETH;' => "\xC3\x90", 'eth;' => "\xC3\xB0", 'Euml' => "\xC3\x8B", 'euml' => "\xC3\xAB", 'Euml;' => "\xC3\x8B", 'euml;' => "\xC3\xAB", 'euro;' => "\xE2\x82\xAC", 'exist;' => "\xE2\x88\x83", 'fnof;' => "\xC6\x92", 'forall;' => "\xE2\x88\x80", 'frac12' => "\xC2\xBD", 'frac12;' => "\xC2\xBD", 'frac14' => "\xC2\xBC", 'frac14;' => "\xC2\xBC", 'frac34' => "\xC2\xBE", 'frac34;' => "\xC2\xBE", 'frasl;' => "\xE2\x81\x84", 'Gamma;' => "\xCE\x93", 'gamma;' => "\xCE\xB3", 'ge;' => "\xE2\x89\xA5", 'GT' => "\x3E", 'gt' => "\x3E", 'GT;' => "\x3E", 'gt;' => "\x3E", 'hArr;' => "\xE2\x87\x94", 'harr;' => "\xE2\x86\x94", 'hearts;' => "\xE2\x99\xA5", 'hellip;' => "\xE2\x80\xA6", 'Iacute' => "\xC3\x8D", 'iacute' => "\xC3\xAD", 'Iacute;' => "\xC3\x8D", 'iacute;' => "\xC3\xAD", 'Icirc' => "\xC3\x8E", 'icirc' => "\xC3\xAE", 'Icirc;' => "\xC3\x8E", 'icirc;' => "\xC3\xAE", 'iexcl' => "\xC2\xA1", 'iexcl;' => "\xC2\xA1", 'Igrave' => "\xC3\x8C", 'igrave' => "\xC3\xAC", 'Igrave;' => "\xC3\x8C", 'igrave;' => "\xC3\xAC", 'image;' => "\xE2\x84\x91", 'infin;' => "\xE2\x88\x9E", 'int;' => "\xE2\x88\xAB", 'Iota;' => "\xCE\x99", 'iota;' => "\xCE\xB9", 'iquest' => "\xC2\xBF", 'iquest;' => "\xC2\xBF", 'isin;' => "\xE2\x88\x88", 'Iuml' => "\xC3\x8F", 'iuml' => "\xC3\xAF", 'Iuml;' => "\xC3\x8F", 'iuml;' => "\xC3\xAF", 'Kappa;' => "\xCE\x9A", 'kappa;' => "\xCE\xBA", 'Lambda;' => "\xCE\x9B", 'lambda;' => "\xCE\xBB", 'lang;' => "\xE3\x80\x88", 'laquo' => "\xC2\xAB", 'laquo;' => "\xC2\xAB", 'lArr;' => "\xE2\x87\x90", 'larr;' => "\xE2\x86\x90", 'lceil;' => "\xE2\x8C\x88", 'ldquo;' => "\xE2\x80\x9C", 'le;' => "\xE2\x89\xA4", 'lfloor;' => "\xE2\x8C\x8A", 'lowast;' => "\xE2\x88\x97", 'loz;' => "\xE2\x97\x8A", 'lrm;' => "\xE2\x80\x8E", 'lsaquo;' => "\xE2\x80\xB9", 'lsquo;' => "\xE2\x80\x98", 'LT' => "\x3C", 'lt' => "\x3C", 'LT;' => "\x3C", 'lt;' => "\x3C", 'macr' => "\xC2\xAF", 'macr;' => "\xC2\xAF", 'mdash;' => "\xE2\x80\x94", 'micro' => "\xC2\xB5", 'micro;' => "\xC2\xB5", 'middot' => "\xC2\xB7", 'middot;' => "\xC2\xB7", 'minus;' => "\xE2\x88\x92", 'Mu;' => "\xCE\x9C", 'mu;' => "\xCE\xBC", 'nabla;' => "\xE2\x88\x87", 'nbsp' => "\xC2\xA0", 'nbsp;' => "\xC2\xA0", 'ndash;' => "\xE2\x80\x93", 'ne;' => "\xE2\x89\xA0", 'ni;' => "\xE2\x88\x8B", 'not' => "\xC2\xAC", 'not;' => "\xC2\xAC", 'notin;' => "\xE2\x88\x89", 'nsub;' => "\xE2\x8A\x84", 'Ntilde' => "\xC3\x91", 'ntilde' => "\xC3\xB1", 'Ntilde;' => "\xC3\x91", 'ntilde;' => "\xC3\xB1", 'Nu;' => "\xCE\x9D", 'nu;' => "\xCE\xBD", 'Oacute' => "\xC3\x93", 'oacute' => "\xC3\xB3", 'Oacute;' => "\xC3\x93", 'oacute;' => "\xC3\xB3", 'Ocirc' => "\xC3\x94", 'ocirc' => "\xC3\xB4", 'Ocirc;' => "\xC3\x94", 'ocirc;' => "\xC3\xB4", 'OElig;' => "\xC5\x92", 'oelig;' => "\xC5\x93", 'Ograve' => "\xC3\x92", 'ograve' => "\xC3\xB2", 'Ograve;' => "\xC3\x92", 'ograve;' => "\xC3\xB2", 'oline;' => "\xE2\x80\xBE", 'Omega;' => "\xCE\xA9", 'omega;' => "\xCF\x89", 'Omicron;' => "\xCE\x9F", 'omicron;' => "\xCE\xBF", 'oplus;' => "\xE2\x8A\x95", 'or;' => "\xE2\x88\xA8", 'ordf' => "\xC2\xAA", 'ordf;' => "\xC2\xAA", 'ordm' => "\xC2\xBA", 'ordm;' => "\xC2\xBA", 'Oslash' => "\xC3\x98", 'oslash' => "\xC3\xB8", 'Oslash;' => "\xC3\x98", 'oslash;' => "\xC3\xB8", 'Otilde' => "\xC3\x95", 'otilde' => "\xC3\xB5", 'Otilde;' => "\xC3\x95", 'otilde;' => "\xC3\xB5", 'otimes;' => "\xE2\x8A\x97", 'Ouml' => "\xC3\x96", 'ouml' => "\xC3\xB6", 'Ouml;' => "\xC3\x96", 'ouml;' => "\xC3\xB6", 'para' => "\xC2\xB6", 'para;' => "\xC2\xB6", 'part;' => "\xE2\x88\x82", 'permil;' => "\xE2\x80\xB0", 'perp;' => "\xE2\x8A\xA5", 'Phi;' => "\xCE\xA6", 'phi;' => "\xCF\x86", 'Pi;' => "\xCE\xA0", 'pi;' => "\xCF\x80", 'piv;' => "\xCF\x96", 'plusmn' => "\xC2\xB1", 'plusmn;' => "\xC2\xB1", 'pound' => "\xC2\xA3", 'pound;' => "\xC2\xA3", 'Prime;' => "\xE2\x80\xB3", 'prime;' => "\xE2\x80\xB2", 'prod;' => "\xE2\x88\x8F", 'prop;' => "\xE2\x88\x9D", 'Psi;' => "\xCE\xA8", 'psi;' => "\xCF\x88", 'QUOT' => "\x22", 'quot' => "\x22", 'QUOT;' => "\x22", 'quot;' => "\x22", 'radic;' => "\xE2\x88\x9A", 'rang;' => "\xE3\x80\x89", 'raquo' => "\xC2\xBB", 'raquo;' => "\xC2\xBB", 'rArr;' => "\xE2\x87\x92", 'rarr;' => "\xE2\x86\x92", 'rceil;' => "\xE2\x8C\x89", 'rdquo;' => "\xE2\x80\x9D", 'real;' => "\xE2\x84\x9C", 'REG' => "\xC2\xAE", 'reg' => "\xC2\xAE", 'REG;' => "\xC2\xAE", 'reg;' => "\xC2\xAE", 'rfloor;' => "\xE2\x8C\x8B", 'Rho;' => "\xCE\xA1", 'rho;' => "\xCF\x81", 'rlm;' => "\xE2\x80\x8F", 'rsaquo;' => "\xE2\x80\xBA", 'rsquo;' => "\xE2\x80\x99", 'sbquo;' => "\xE2\x80\x9A", 'Scaron;' => "\xC5\xA0", 'scaron;' => "\xC5\xA1", 'sdot;' => "\xE2\x8B\x85", 'sect' => "\xC2\xA7", 'sect;' => "\xC2\xA7", 'shy' => "\xC2\xAD", 'shy;' => "\xC2\xAD", 'Sigma;' => "\xCE\xA3", 'sigma;' => "\xCF\x83", 'sigmaf;' => "\xCF\x82", 'sim;' => "\xE2\x88\xBC", 'spades;' => "\xE2\x99\xA0", 'sub;' => "\xE2\x8A\x82", 'sube;' => "\xE2\x8A\x86", 'sum;' => "\xE2\x88\x91", 'sup;' => "\xE2\x8A\x83", 'sup1' => "\xC2\xB9", 'sup1;' => "\xC2\xB9", 'sup2' => "\xC2\xB2", 'sup2;' => "\xC2\xB2", 'sup3' => "\xC2\xB3", 'sup3;' => "\xC2\xB3", 'supe;' => "\xE2\x8A\x87", 'szlig' => "\xC3\x9F", 'szlig;' => "\xC3\x9F", 'Tau;' => "\xCE\xA4", 'tau;' => "\xCF\x84", 'there4;' => "\xE2\x88\xB4", 'Theta;' => "\xCE\x98", 'theta;' => "\xCE\xB8", 'thetasym;' => "\xCF\x91", 'thinsp;' => "\xE2\x80\x89", 'THORN' => "\xC3\x9E", 'thorn' => "\xC3\xBE", 'THORN;' => "\xC3\x9E", 'thorn;' => "\xC3\xBE", 'tilde;' => "\xCB\x9C", 'times' => "\xC3\x97", 'times;' => "\xC3\x97", 'TRADE;' => "\xE2\x84\xA2", 'trade;' => "\xE2\x84\xA2", 'Uacute' => "\xC3\x9A", 'uacute' => "\xC3\xBA", 'Uacute;' => "\xC3\x9A", 'uacute;' => "\xC3\xBA", 'uArr;' => "\xE2\x87\x91", 'uarr;' => "\xE2\x86\x91", 'Ucirc' => "\xC3\x9B", 'ucirc' => "\xC3\xBB", 'Ucirc;' => "\xC3\x9B", 'ucirc;' => "\xC3\xBB", 'Ugrave' => "\xC3\x99", 'ugrave' => "\xC3\xB9", 'Ugrave;' => "\xC3\x99", 'ugrave;' => "\xC3\xB9", 'uml' => "\xC2\xA8", 'uml;' => "\xC2\xA8", 'upsih;' => "\xCF\x92", 'Upsilon;' => "\xCE\xA5", 'upsilon;' => "\xCF\x85", 'Uuml' => "\xC3\x9C", 'uuml' => "\xC3\xBC", 'Uuml;' => "\xC3\x9C", 'uuml;' => "\xC3\xBC", 'weierp;' => "\xE2\x84\x98", 'Xi;' => "\xCE\x9E", 'xi;' => "\xCE\xBE", 'Yacute' => "\xC3\x9D", 'yacute' => "\xC3\xBD", 'Yacute;' => "\xC3\x9D", 'yacute;' => "\xC3\xBD", 'yen' => "\xC2\xA5", 'yen;' => "\xC2\xA5", 'yuml' => "\xC3\xBF", 'Yuml;' => "\xC5\xB8", 'yuml;' => "\xC3\xBF", 'Zeta;' => "\xCE\x96", 'zeta;' => "\xCE\xB6", 'zwj;' => "\xE2\x80\x8D", 'zwnj;' => "\xE2\x80\x8C");
-
- for ($i = 0, $match = null; $i < 9 && $this->consume() !== false; $i++)
- {
- $consumed = substr($this->consumed, 1);
- if (isset($entities[$consumed]))
- {
- $match = $consumed;
- }
- }
-
- if ($match !== null)
- {
- $this->data = substr_replace($this->data, $entities[$match], $this->position - strlen($consumed) - 1, strlen($match) + 1);
- $this->position += strlen($entities[$match]) - strlen($consumed) - 1;
- }
- break;
- }
- }
-}
-
-/**
- * IRI parser/serialiser
- *
- * @package SimplePie
- */
-class SimplePie_IRI
-{
- /**
- * Scheme
- *
- * @access private
- * @var string
- */
- var $scheme;
-
- /**
- * User Information
- *
- * @access private
- * @var string
- */
- var $userinfo;
-
- /**
- * Host
- *
- * @access private
- * @var string
- */
- var $host;
-
- /**
- * Port
- *
- * @access private
- * @var string
- */
- var $port;
-
- /**
- * Path
- *
- * @access private
- * @var string
- */
- var $path;
-
- /**
- * Query
- *
- * @access private
- * @var string
- */
- var $query;
-
- /**
- * Fragment
- *
- * @access private
- * @var string
- */
- var $fragment;
-
- /**
- * Whether the object represents a valid IRI
- *
- * @access private
- * @var array
- */
- var $valid = array();
-
- /**
- * Return the entire IRI when you try and read the object as a string
- *
- * @access public
- * @return string
- */
- function __toString()
- {
- return $this->get_iri();
- }
-
- /**
- * Create a new IRI object, from a specified string
- *
- * @access public
- * @param string $iri
- * @return SimplePie_IRI
- */
- function SimplePie_IRI($iri)
- {
- $iri = (string) $iri;
- if ($iri !== '')
- {
- $parsed = $this->parse_iri($iri);
- $this->set_scheme($parsed['scheme']);
- $this->set_authority($parsed['authority']);
- $this->set_path($parsed['path']);
- $this->set_query($parsed['query']);
- $this->set_fragment($parsed['fragment']);
- }
- }
-
- /**
- * Create a new IRI object by resolving a relative IRI
- *
- * @static
- * @access public
- * @param SimplePie_IRI $base Base IRI
- * @param string $relative Relative IRI
- * @return SimplePie_IRI
- */
- function absolutize($base, $relative)
- {
- $relative = (string) $relative;
- if ($relative !== '')
- {
- $relative = new SimplePie_IRI($relative);
- if ($relative->get_scheme() !== null)
- {
- $target = $relative;
- }
- elseif ($base->get_iri() !== null)
- {
- if ($relative->get_authority() !== null)
- {
- $target = $relative;
- $target->set_scheme($base->get_scheme());
- }
- else
- {
- $target = new SimplePie_IRI('');
- $target->set_scheme($base->get_scheme());
- $target->set_userinfo($base->get_userinfo());
- $target->set_host($base->get_host());
- $target->set_port($base->get_port());
- if ($relative->get_path() !== null)
- {
- if (strpos($relative->get_path(), '/') === 0)
- {
- $target->set_path($relative->get_path());
- }
- elseif (($base->get_userinfo() !== null || $base->get_host() !== null || $base->get_port() !== null) && $base->get_path() === null)
- {
- $target->set_path('/' . $relative->get_path());
- }
- elseif (($last_segment = strrpos($base->get_path(), '/')) !== false)
- {
- $target->set_path(substr($base->get_path(), 0, $last_segment + 1) . $relative->get_path());
- }
- else
- {
- $target->set_path($relative->get_path());
- }
- $target->set_query($relative->get_query());
- }
- else
- {
- $target->set_path($base->get_path());
- if ($relative->get_query() !== null)
- {
- $target->set_query($relative->get_query());
- }
- elseif ($base->get_query() !== null)
- {
- $target->set_query($base->get_query());
- }
- }
- }
- $target->set_fragment($relative->get_fragment());
- }
- else
- {
- // No base URL, just return the relative URL
- $target = $relative;
- }
- }
- else
- {
- $target = $base;
- }
- return $target;
- }
-
- /**
- * Parse an IRI into scheme/authority/path/query/fragment segments
- *
- * @access private
- * @param string $iri
- * @return array
- */
- function parse_iri($iri)
- {
- preg_match('/^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?$/', $iri, $match);
- for ($i = count($match); $i <= 9; $i++)
- {
- $match[$i] = '';
- }
- return array('scheme' => $match[2], 'authority' => $match[4], 'path' => $match[5], 'query' => $match[7], 'fragment' => $match[9]);
- }
-
- /**
- * Remove dot segments from a path
- *
- * @access private
- * @param string $input
- * @return string
- */
- function remove_dot_segments($input)
- {
- $output = '';
- while (strpos($input, './') !== false || strpos($input, '/.') !== false || $input === '.' || $input === '..')
- {
- // A: If the input buffer begins with a prefix of "../" or "./", then remove that prefix from the input buffer; otherwise,
- if (strpos($input, '../') === 0)
- {
- $input = substr($input, 3);
- }
- elseif (strpos($input, './') === 0)
- {
- $input = substr($input, 2);
- }
- // B: if the input buffer begins with a prefix of "/./" or "/.", where "." is a complete path segment, then replace that prefix with "/" in the input buffer; otherwise,
- elseif (strpos($input, '/./') === 0)
- {
- $input = substr_replace($input, '/', 0, 3);
- }
- elseif ($input === '/.')
- {
- $input = '/';
- }
- // C: if the input buffer begins with a prefix of "/../" or "/..", where ".." is a complete path segment, then replace that prefix with "/" in the input buffer and remove the last segment and its preceding "/" (if any) from the output buffer; otherwise,
- elseif (strpos($input, '/../') === 0)
- {
- $input = substr_replace($input, '/', 0, 4);
- $output = substr_replace($output, '', strrpos($output, '/'));
- }
- elseif ($input === '/..')
- {
- $input = '/';
- $output = substr_replace($output, '', strrpos($output, '/'));
- }
- // D: if the input buffer consists only of "." or "..", then remove that from the input buffer; otherwise,
- elseif ($input === '.' || $input === '..')
- {
- $input = '';
- }
- // E: move the first path segment in the input buffer to the end of the output buffer, including the initial "/" character (if any) and any subsequent characters up to, but not including, the next "/" character or the end of the input buffer
- elseif (($pos = strpos($input, '/', 1)) !== false)
- {
- $output .= substr($input, 0, $pos);
- $input = substr_replace($input, '', 0, $pos);
- }
- else
- {
- $output .= $input;
- $input = '';
- }
- }
- return $output . $input;
- }
-
- /**
- * Replace invalid character with percent encoding
- *
- * @access private
- * @param string $string Input string
- * @param string $valid_chars Valid characters
- * @param int $case Normalise case
- * @return string
- */
- function replace_invalid_with_pct_encoding($string, $valid_chars, $case = SIMPLEPIE_SAME_CASE)
- {
- // Normalise case
- if ($case & SIMPLEPIE_LOWERCASE)
- {
- $string = strtolower($string);
- }
- elseif ($case & SIMPLEPIE_UPPERCASE)
- {
- $string = strtoupper($string);
- }
-
- // Store position and string length (to avoid constantly recalculating this)
- $position = 0;
- $strlen = strlen($string);
-
- // Loop as long as we have invalid characters, advancing the position to the next invalid character
- while (($position += strspn($string, $valid_chars, $position)) < $strlen)
- {
- // If we have a % character
- if ($string[$position] === '%')
- {
- // If we have a pct-encoded section
- if ($position + 2 < $strlen && strspn($string, '0123456789ABCDEFabcdef', $position + 1, 2) === 2)
- {
- // Get the the represented character
- $chr = chr(hexdec(substr($string, $position + 1, 2)));
-
- // If the character is valid, replace the pct-encoded with the actual character while normalising case
- if (strpos($valid_chars, $chr) !== false)
- {
- if ($case & SIMPLEPIE_LOWERCASE)
- {
- $chr = strtolower($chr);
- }
- elseif ($case & SIMPLEPIE_UPPERCASE)
- {
- $chr = strtoupper($chr);
- }
- $string = substr_replace($string, $chr, $position, 3);
- $strlen -= 2;
- $position++;
- }
-
- // Otherwise just normalise the pct-encoded to uppercase
- else
- {
- $string = substr_replace($string, strtoupper(substr($string, $position + 1, 2)), $position + 1, 2);
- $position += 3;
- }
- }
- // If we don't have a pct-encoded section, just replace the % with its own esccaped form
- else
- {
- $string = substr_replace($string, '%25', $position, 1);
- $strlen += 2;
- $position += 3;
- }
- }
- // If we have an invalid character, change into its pct-encoded form
- else
- {
- $replacement = sprintf("%%%02X", ord($string[$position]));
- $string = str_replace($string[$position], $replacement, $string);
- $strlen = strlen($string);
- }
- }
- return $string;
- }
-
- /**
- * Check if the object represents a valid IRI
- *
- * @access public
- * @return bool
- */
- function is_valid()
- {
- return array_sum($this->valid) === count($this->valid);
- }
-
- /**
- * Set the scheme. Returns true on success, false on failure (if there are
- * any invalid characters).
- *
- * @access public
- * @param string $scheme
- * @return bool
- */
- function set_scheme($scheme)
- {
- if ($scheme === null || $scheme === '')
- {
- $this->scheme = null;
- }
- else
- {
- $len = strlen($scheme);
- switch (true)
- {
- case $len > 1:
- if (!strspn($scheme, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-.', 1))
- {
- $this->scheme = null;
- $this->valid[__FUNCTION__] = false;
- return false;
- }
-
- case $len > 0:
- if (!strspn($scheme, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', 0, 1))
- {
- $this->scheme = null;
- $this->valid[__FUNCTION__] = false;
- return false;
- }
- }
- $this->scheme = strtolower($scheme);
- }
- $this->valid[__FUNCTION__] = true;
- return true;
- }
-
- /**
- * Set the authority. Returns true on success, false on failure (if there are
- * any invalid characters).
- *
- * @access public
- * @param string $authority
- * @return bool
- */
- function set_authority($authority)
- {
- if (($userinfo_end = strrpos($authority, '@')) !== false)
- {
- $userinfo = substr($authority, 0, $userinfo_end);
- $authority = substr($authority, $userinfo_end + 1);
- }
- else
- {
- $userinfo = null;
- }
-
- if (($port_start = strpos($authority, ':')) !== false)
- {
- $port = substr($authority, $port_start + 1);
- $authority = substr($authority, 0, $port_start);
- }
- else
- {
- $port = null;
- }
-
- return $this->set_userinfo($userinfo) && $this->set_host($authority) && $this->set_port($port);
- }
-
- /**
- * Set the userinfo.
- *
- * @access public
- * @param string $userinfo
- * @return bool
- */
- function set_userinfo($userinfo)
- {
- if ($userinfo === null || $userinfo === '')
- {
- $this->userinfo = null;
- }
- else
- {
- $this->userinfo = $this->replace_invalid_with_pct_encoding($userinfo, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~!$&\'()*+,;=:');
- }
- $this->valid[__FUNCTION__] = true;
- return true;
- }
-
- /**
- * Set the host. Returns true on success, false on failure (if there are
- * any invalid characters).
- *
- * @access public
- * @param string $host
- * @return bool
- */
- function set_host($host)
- {
- if ($host === null || $host === '')
- {
- $this->host = null;
- $this->valid[__FUNCTION__] = true;
- return true;
- }
- elseif ($host[0] === '[' && substr($host, -1) === ']')
- {
- if (Net_IPv6::checkIPv6(substr($host, 1, -1)))
- {
- $this->host = $host;
- $this->valid[__FUNCTION__] = true;
- return true;
- }
- else
- {
- $this->host = null;
- $this->valid[__FUNCTION__] = false;
- return false;
- }
- }
- else
- {
- $this->host = $this->replace_invalid_with_pct_encoding($host, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~!$&\'()*+,;=', SIMPLEPIE_LOWERCASE);
- $this->valid[__FUNCTION__] = true;
- return true;
- }
- }
-
- /**
- * Set the port. Returns true on success, false on failure (if there are
- * any invalid characters).
- *
- * @access public
- * @param string $port
- * @return bool
- */
- function set_port($port)
- {
- if ($port === null || $port === '')
- {
- $this->port = null;
- $this->valid[__FUNCTION__] = true;
- return true;
- }
- elseif (strspn($port, '0123456789') === strlen($port))
- {
- $this->port = (int) $port;
- $this->valid[__FUNCTION__] = true;
- return true;
- }
- else
- {
- $this->port = null;
- $this->valid[__FUNCTION__] = false;
- return false;
- }
- }
-
- /**
- * Set the path.
- *
- * @access public
- * @param string $path
- * @return bool
- */
- function set_path($path)
- {
- if ($path === null || $path === '')
- {
- $this->path = null;
- $this->valid[__FUNCTION__] = true;
- return true;
- }
- elseif (substr($path, 0, 2) === '//' && $this->userinfo === null && $this->host === null && $this->port === null)
- {
- $this->path = null;
- $this->valid[__FUNCTION__] = false;
- return false;
- }
- else
- {
- $this->path = $this->replace_invalid_with_pct_encoding($path, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~!$&\'()*+,;=@/');
- if ($this->scheme !== null)
- {
- $this->path = $this->remove_dot_segments($this->path);
- }
- $this->valid[__FUNCTION__] = true;
- return true;
- }
- }
-
- /**
- * Set the query.
- *
- * @access public
- * @param string $query
- * @return bool
- */
- function set_query($query)
- {
- if ($query === null || $query === '')
- {
- $this->query = null;
- }
- else
- {
- $this->query = $this->replace_invalid_with_pct_encoding($query, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~!$\'()*+,;:@/?');
- }
- $this->valid[__FUNCTION__] = true;
- return true;
- }
-
- /**
- * Set the fragment.
- *
- * @access public
- * @param string $fragment
- * @return bool
- */
- function set_fragment($fragment)
- {
- if ($fragment === null || $fragment === '')
- {
- $this->fragment = null;
- }
- else
- {
- $this->fragment = $this->replace_invalid_with_pct_encoding($fragment, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~!$&\'()*+,;=:@/?');
- }
- $this->valid[__FUNCTION__] = true;
- return true;
- }
-
- /**
- * Get the complete IRI
- *
- * @access public
- * @return string
- */
- function get_iri()
- {
- $iri = '';
- if ($this->scheme !== null)
- {
- $iri .= $this->scheme . ':';
- }
- if (($authority = $this->get_authority()) !== null)
- {
- $iri .= '//' . $authority;
- }
- if ($this->path !== null)
- {
- $iri .= $this->path;
- }
- if ($this->query !== null)
- {
- $iri .= '?' . $this->query;
- }
- if ($this->fragment !== null)
- {
- $iri .= '#' . $this->fragment;
- }
-
- if ($iri !== '')
- {
- return $iri;
- }
- else
- {
- return null;
- }
- }
-
- /**
- * Get the scheme
- *
- * @access public
- * @return string
- */
- function get_scheme()
- {
- return $this->scheme;
- }
-
- /**
- * Get the complete authority
- *
- * @access public
- * @return string
- */
- function get_authority()
- {
- $authority = '';
- if ($this->userinfo !== null)
- {
- $authority .= $this->userinfo . '@';
- }
- if ($this->host !== null)
- {
- $authority .= $this->host;
- }
- if ($this->port !== null)
- {
- $authority .= ':' . $this->port;
- }
-
- if ($authority !== '')
- {
- return $authority;
- }
- else
- {
- return null;
- }
- }
-
- /**
- * Get the user information
- *
- * @access public
- * @return string
- */
- function get_userinfo()
- {
- return $this->userinfo;
- }
-
- /**
- * Get the host
- *
- * @access public
- * @return string
- */
- function get_host()
- {
- return $this->host;
- }
-
- /**
- * Get the port
- *
- * @access public
- * @return string
- */
- function get_port()
- {
- return $this->port;
- }
-
- /**
- * Get the path
- *
- * @access public
- * @return string
- */
- function get_path()
- {
- return $this->path;
- }
-
- /**
- * Get the query
- *
- * @access public
- * @return string
- */
- function get_query()
- {
- return $this->query;
- }
-
- /**
- * Get the fragment
- *
- * @access public
- * @return string
- */
- function get_fragment()
- {
- return $this->fragment;
- }
-}
-
-/**
- * Class to validate and to work with IPv6 addresses.
- *
- * @package SimplePie
- * @copyright 2003-2005 The PHP Group
- * @license http://www.opensource.org/licenses/bsd-license.php
- * @link http://pear.php.net/package/Net_IPv6
- * @author Alexander Merz <alexander.merz@web.de>
- * @author elfrink at introweb dot nl
- * @author Josh Peck <jmp at joshpeck dot org>
- * @author Geoffrey Sneddon <geoffers@gmail.com>
- */
-class SimplePie_Net_IPv6
-{
- /**
- * Removes a possible existing netmask specification of an IP address.
- *
- * @param string $ip the (compressed) IP as Hex representation
- * @return string the IP the without netmask
- * @since 1.1.0
- * @access public
- * @static
- */
- function removeNetmaskSpec($ip)
- {
- if (strpos($ip, '/') !== false)
- {
- list($addr, $nm) = explode('/', $ip);
- }
- else
- {
- $addr = $ip;
- }
- return $addr;
- }
-
- /**
- * Uncompresses an IPv6 address
- *
- * RFC 2373 allows you to compress zeros in an address to '::'. This
- * function expects an valid IPv6 address and expands the '::' to
- * the required zeros.
- *
- * Example: FF01::101 -> FF01:0:0:0:0:0:0:101
- * ::1 -> 0:0:0:0:0:0:0:1
- *
- * @access public
- * @static
- * @param string $ip a valid IPv6-address (hex format)
- * @return string the uncompressed IPv6-address (hex format)
- */
- function Uncompress($ip)
- {
- $uip = SimplePie_Net_IPv6::removeNetmaskSpec($ip);
- $c1 = -1;
- $c2 = -1;
- if (strpos($ip, '::') !== false)
- {
- list($ip1, $ip2) = explode('::', $ip);
- if ($ip1 === '')
- {
- $c1 = -1;
- }
- else
- {
- $pos = 0;
- if (($pos = substr_count($ip1, ':')) > 0)
- {
- $c1 = $pos;
- }
- else
- {
- $c1 = 0;
- }
- }
- if ($ip2 === '')
- {
- $c2 = -1;
- }
- else
- {
- $pos = 0;
- if (($pos = substr_count($ip2, ':')) > 0)
- {
- $c2 = $pos;
- }
- else
- {
- $c2 = 0;
- }
- }
- if (strstr($ip2, '.'))
- {
- $c2++;
- }
- // ::
- if ($c1 === -1 && $c2 === -1)
- {
- $uip = '0:0:0:0:0:0:0:0';
- }
- // ::xxx
- else if ($c1 === -1)
- {
- $fill = str_repeat('0:', 7 - $c2);
- $uip = str_replace('::', $fill, $uip);
- }
- // xxx::
- else if ($c2 === -1)
- {
- $fill = str_repeat(':0', 7 - $c1);
- $uip = str_replace('::', $fill, $uip);
- }
- // xxx::xxx
- else
- {
- $fill = str_repeat(':0:', 6 - $c2 - $c1);
- $uip = str_replace('::', $fill, $uip);
- $uip = str_replace('::', ':', $uip);
- }
- }
- return $uip;
- }
-
- /**
- * Splits an IPv6 address into the IPv6 and a possible IPv4 part
- *
- * RFC 2373 allows you to note the last two parts of an IPv6 address as
- * an IPv4 compatible address
- *
- * Example: 0:0:0:0:0:0:13.1.68.3
- * 0:0:0:0:0:FFFF:129.144.52.38
- *
- * @access public
- * @static
- * @param string $ip a valid IPv6-address (hex format)
- * @return array [0] contains the IPv6 part, [1] the IPv4 part (hex format)
- */
- function SplitV64($ip)
- {
- $ip = SimplePie_Net_IPv6::Uncompress($ip);
- if (strstr($ip, '.'))
- {
- $pos = strrpos($ip, ':');
- $ip[$pos] = '_';
- $ipPart = explode('_', $ip);
- return $ipPart;
- }
- else
- {
- return array($ip, '');
- }
- }
-
- /**
- * Checks an IPv6 address
- *
- * Checks if the given IP is IPv6-compatible
- *
- * @access public
- * @static
- * @param string $ip a valid IPv6-address
- * @return bool true if $ip is an IPv6 address
- */
- function checkIPv6($ip)
- {
- $ipPart = SimplePie_Net_IPv6::SplitV64($ip);
- $count = 0;
- if (!empty($ipPart[0]))
- {
- $ipv6 = explode(':', $ipPart[0]);
- for ($i = 0; $i < count($ipv6); $i++)
- {
- $dec = hexdec($ipv6[$i]);
- $hex = strtoupper(preg_replace('/^[0]{1,3}(.*[0-9a-fA-F])$/', '\\1', $ipv6[$i]));
- if ($ipv6[$i] >= 0 && $dec <= 65535 && $hex === strtoupper(dechex($dec)))
- {
- $count++;
- }
- }
- if ($count === 8)
- {
- return true;
- }
- elseif ($count === 6 && !empty($ipPart[1]))
- {
- $ipv4 = explode('.', $ipPart[1]);
- $count = 0;
- foreach ($ipv4 as $ipv4_part)
- {
- if ($ipv4_part >= 0 && $ipv4_part <= 255 && preg_match('/^\d{1,3}$/', $ipv4_part))
- {
- $count++;
- }
- }
- if ($count === 4)
- {
- return true;
- }
- }
- else
- {
- return false;
- }
-
- }
- else
- {
- return false;
- }
- }
-}
-
-/**
- * Date Parser
- *
- * @package SimplePie
- */
-class SimplePie_Parse_Date
-{
- /**
- * Input data
- *
- * @access protected
- * @var string
- */
- var $date;
-
- /**
- * List of days, calendar day name => ordinal day number in the week
- *
- * @access protected
- * @var array
- */
- var $day = array(
- // English
- 'mon' => 1,
- 'monday' => 1,
- 'tue' => 2,
- 'tuesday' => 2,
- 'wed' => 3,
- 'wednesday' => 3,
- 'thu' => 4,
- 'thursday' => 4,
- 'fri' => 5,
- 'friday' => 5,
- 'sat' => 6,
- 'saturday' => 6,
- 'sun' => 7,
- 'sunday' => 7,
- // Dutch
- 'maandag' => 1,
- 'dinsdag' => 2,
- 'woensdag' => 3,
- 'donderdag' => 4,
- 'vrijdag' => 5,
- 'zaterdag' => 6,
- 'zondag' => 7,
- // French
- 'lundi' => 1,
- 'mardi' => 2,
- 'mercredi' => 3,
- 'jeudi' => 4,
- 'vendredi' => 5,
- 'samedi' => 6,
- 'dimanche' => 7,
- // German
- 'montag' => 1,
- 'dienstag' => 2,
- 'mittwoch' => 3,
- 'donnerstag' => 4,
- 'freitag' => 5,
- 'samstag' => 6,
- 'sonnabend' => 6,
- 'sonntag' => 7,
- // Italian
- 'lunedì' => 1,
- 'martedì' => 2,
- 'mercoledì' => 3,
- 'giovedì' => 4,
- 'venerdì' => 5,
- 'sabato' => 6,
- 'domenica' => 7,
- // Spanish
- 'lunes' => 1,
- 'martes' => 2,
- 'miércoles' => 3,
- 'jueves' => 4,
- 'viernes' => 5,
- 'sábado' => 6,
- 'domingo' => 7,
- // Finnish
- 'maanantai' => 1,
- 'tiistai' => 2,
- 'keskiviikko' => 3,
- 'torstai' => 4,
- 'perjantai' => 5,
- 'lauantai' => 6,
- 'sunnuntai' => 7,
- // Hungarian
- 'hétfő' => 1,
- 'kedd' => 2,
- 'szerda' => 3,
- 'csütörtok' => 4,
- 'péntek' => 5,
- 'szombat' => 6,
- 'vasárnap' => 7,
- // Greek
- 'Δευ' => 1,
- 'ΤÏι' => 2,
- 'Τετ' => 3,
- 'Πεμ' => 4,
- 'ΠαÏ' => 5,
- 'Σαβ' => 6,
- 'ΚυÏ' => 7,
- );
-
- /**
- * List of months, calendar month name => calendar month number
- *
- * @access protected
- * @var array
- */
- var $month = array(
- // English
- 'jan' => 1,
- 'january' => 1,
- 'feb' => 2,
- 'february' => 2,
- 'mar' => 3,
- 'march' => 3,
- 'apr' => 4,
- 'april' => 4,
- 'may' => 5,
- // No long form of May
- 'jun' => 6,
- 'june' => 6,
- 'jul' => 7,
- 'july' => 7,
- 'aug' => 8,
- 'august' => 8,
- 'sep' => 9,
- 'september' => 8,
- 'oct' => 10,
- 'october' => 10,
- 'nov' => 11,
- 'november' => 11,
- 'dec' => 12,
- 'december' => 12,
- // Dutch
- 'januari' => 1,
- 'februari' => 2,
- 'maart' => 3,
- 'april' => 4,
- 'mei' => 5,
- 'juni' => 6,
- 'juli' => 7,
- 'augustus' => 8,
- 'september' => 9,
- 'oktober' => 10,
- 'november' => 11,
- 'december' => 12,
- // French
- 'janvier' => 1,
- 'février' => 2,
- 'mars' => 3,
- 'avril' => 4,
- 'mai' => 5,
- 'juin' => 6,
- 'juillet' => 7,
- 'août' => 8,
- 'septembre' => 9,
- 'octobre' => 10,
- 'novembre' => 11,
- 'décembre' => 12,
- // German
- 'januar' => 1,
- 'februar' => 2,
- 'märz' => 3,
- 'april' => 4,
- 'mai' => 5,
- 'juni' => 6,
- 'juli' => 7,
- 'august' => 8,
- 'september' => 9,
- 'oktober' => 10,
- 'november' => 11,
- 'dezember' => 12,
- // Italian
- 'gennaio' => 1,
- 'febbraio' => 2,
- 'marzo' => 3,
- 'aprile' => 4,
- 'maggio' => 5,
- 'giugno' => 6,
- 'luglio' => 7,
- 'agosto' => 8,
- 'settembre' => 9,
- 'ottobre' => 10,
- 'novembre' => 11,
- 'dicembre' => 12,
- // Spanish
- 'enero' => 1,
- 'febrero' => 2,
- 'marzo' => 3,
- 'abril' => 4,
- 'mayo' => 5,
- 'junio' => 6,
- 'julio' => 7,
- 'agosto' => 8,
- 'septiembre' => 9,
- 'setiembre' => 9,
- 'octubre' => 10,
- 'noviembre' => 11,
- 'diciembre' => 12,
- // Finnish
- 'tammikuu' => 1,
- 'helmikuu' => 2,
- 'maaliskuu' => 3,
- 'huhtikuu' => 4,
- 'toukokuu' => 5,
- 'kesäkuu' => 6,
- 'heinäkuu' => 7,
- 'elokuu' => 8,
- 'suuskuu' => 9,
- 'lokakuu' => 10,
- 'marras' => 11,
- 'joulukuu' => 12,
- // Hungarian
- 'január' => 1,
- 'február' => 2,
- 'március' => 3,
- 'április' => 4,
- 'május' => 5,
- 'június' => 6,
- 'július' => 7,
- 'augusztus' => 8,
- 'szeptember' => 9,
- 'október' => 10,
- 'november' => 11,
- 'december' => 12,
- // Greek
- 'Ιαν' => 1,
- 'Φεβ' => 2,
- 'Μάώ' => 3,
- 'Μαώ' => 3,
- 'ΑπÏ' => 4,
- 'Μάι' => 5,
- 'Μαϊ' => 5,
- 'Μαι' => 5,
- 'ΙοÏν' => 6,
- 'Ιον' => 6,
- 'ΙοÏλ' => 7,
- 'Ιολ' => 7,
- 'ΑÏγ' => 8,
- 'Αυγ' => 8,
- 'Σεπ' => 9,
- 'Οκτ' => 10,
- 'Îοέ' => 11,
- 'Δεκ' => 12,
- );
-
- /**
- * List of timezones, abbreviation => offset from UTC
- *
- * @access protected
- * @var array
- */
- var $timezone = array(
- 'ACDT' => 37800,
- 'ACIT' => 28800,
- 'ACST' => 34200,
- 'ACT' => -18000,
- 'ACWDT' => 35100,
- 'ACWST' => 31500,
- 'AEDT' => 39600,
- 'AEST' => 36000,
- 'AFT' => 16200,
- 'AKDT' => -28800,
- 'AKST' => -32400,
- 'AMDT' => 18000,
- 'AMT' => -14400,
- 'ANAST' => 46800,
- 'ANAT' => 43200,
- 'ART' => -10800,
- 'AZOST' => -3600,
- 'AZST' => 18000,
- 'AZT' => 14400,
- 'BIOT' => 21600,
- 'BIT' => -43200,
- 'BOT' => -14400,
- 'BRST' => -7200,
- 'BRT' => -10800,
- 'BST' => 3600,
- 'BTT' => 21600,
- 'CAST' => 18000,
- 'CAT' => 7200,
- 'CCT' => 23400,
- 'CDT' => -18000,
- 'CEDT' => 7200,
- 'CET' => 3600,
- 'CGST' => -7200,
- 'CGT' => -10800,
- 'CHADT' => 49500,
- 'CHAST' => 45900,
- 'CIST' => -28800,
- 'CKT' => -36000,
- 'CLDT' => -10800,
- 'CLST' => -14400,
- 'COT' => -18000,
- 'CST' => -21600,
- 'CVT' => -3600,
- 'CXT' => 25200,
- 'DAVT' => 25200,
- 'DTAT' => 36000,
- 'EADT' => -18000,
- 'EAST' => -21600,
- 'EAT' => 10800,
- 'ECT' => -18000,
- 'EDT' => -14400,
- 'EEST' => 10800,
- 'EET' => 7200,
- 'EGT' => -3600,
- 'EKST' => 21600,
- 'EST' => -18000,
- 'FJT' => 43200,
- 'FKDT' => -10800,
- 'FKST' => -14400,
- 'FNT' => -7200,
- 'GALT' => -21600,
- 'GEDT' => 14400,
- 'GEST' => 10800,
- 'GFT' => -10800,
- 'GILT' => 43200,
- 'GIT' => -32400,
- 'GST' => 14400,
- 'GST' => -7200,
- 'GYT' => -14400,
- 'HAA' => -10800,
- 'HAC' => -18000,
- 'HADT' => -32400,
- 'HAE' => -14400,
- 'HAP' => -25200,
- 'HAR' => -21600,
- 'HAST' => -36000,
- 'HAT' => -9000,
- 'HAY' => -28800,
- 'HKST' => 28800,
- 'HMT' => 18000,
- 'HNA' => -14400,
- 'HNC' => -21600,
- 'HNE' => -18000,
- 'HNP' => -28800,
- 'HNR' => -25200,
- 'HNT' => -12600,
- 'HNY' => -32400,
- 'IRDT' => 16200,
- 'IRKST' => 32400,
- 'IRKT' => 28800,
- 'IRST' => 12600,
- 'JFDT' => -10800,
- 'JFST' => -14400,
- 'JST' => 32400,
- 'KGST' => 21600,
- 'KGT' => 18000,
- 'KOST' => 39600,
- 'KOVST' => 28800,
- 'KOVT' => 25200,
- 'KRAST' => 28800,
- 'KRAT' => 25200,
- 'KST' => 32400,
- 'LHDT' => 39600,
- 'LHST' => 37800,
- 'LINT' => 50400,
- 'LKT' => 21600,
- 'MAGST' => 43200,
- 'MAGT' => 39600,
- 'MAWT' => 21600,
- 'MDT' => -21600,
- 'MESZ' => 7200,
- 'MEZ' => 3600,
- 'MHT' => 43200,
- 'MIT' => -34200,
- 'MNST' => 32400,
- 'MSDT' => 14400,
- 'MSST' => 10800,
- 'MST' => -25200,
- 'MUT' => 14400,
- 'MVT' => 18000,
- 'MYT' => 28800,
- 'NCT' => 39600,
- 'NDT' => -9000,
- 'NFT' => 41400,
- 'NMIT' => 36000,
- 'NOVST' => 25200,
- 'NOVT' => 21600,
- 'NPT' => 20700,
- 'NRT' => 43200,
- 'NST' => -12600,
- 'NUT' => -39600,
- 'NZDT' => 46800,
- 'NZST' => 43200,
- 'OMSST' => 25200,
- 'OMST' => 21600,
- 'PDT' => -25200,
- 'PET' => -18000,
- 'PETST' => 46800,
- 'PETT' => 43200,
- 'PGT' => 36000,
- 'PHOT' => 46800,
- 'PHT' => 28800,
- 'PKT' => 18000,
- 'PMDT' => -7200,
- 'PMST' => -10800,
- 'PONT' => 39600,
- 'PST' => -28800,
- 'PWT' => 32400,
- 'PYST' => -10800,
- 'PYT' => -14400,
- 'RET' => 14400,
- 'ROTT' => -10800,
- 'SAMST' => 18000,
- 'SAMT' => 14400,
- 'SAST' => 7200,
- 'SBT' => 39600,
- 'SCDT' => 46800,
- 'SCST' => 43200,
- 'SCT' => 14400,
- 'SEST' => 3600,
- 'SGT' => 28800,
- 'SIT' => 28800,
- 'SRT' => -10800,
- 'SST' => -39600,
- 'SYST' => 10800,
- 'SYT' => 7200,
- 'TFT' => 18000,
- 'THAT' => -36000,
- 'TJT' => 18000,
- 'TKT' => -36000,
- 'TMT' => 18000,
- 'TOT' => 46800,
- 'TPT' => 32400,
- 'TRUT' => 36000,
- 'TVT' => 43200,
- 'TWT' => 28800,
- 'UYST' => -7200,
- 'UYT' => -10800,
- 'UZT' => 18000,
- 'VET' => -14400,
- 'VLAST' => 39600,
- 'VLAT' => 36000,
- 'VOST' => 21600,
- 'VUT' => 39600,
- 'WAST' => 7200,
- 'WAT' => 3600,
- 'WDT' => 32400,
- 'WEST' => 3600,
- 'WFT' => 43200,
- 'WIB' => 25200,
- 'WIT' => 32400,
- 'WITA' => 28800,
- 'WKST' => 18000,
- 'WST' => 28800,
- 'YAKST' => 36000,
- 'YAKT' => 32400,
- 'YAPT' => 36000,
- 'YEKST' => 21600,
- 'YEKT' => 18000,
- );
-
- /**
- * Cached PCRE for SimplePie_Parse_Date::$day
- *
- * @access protected
- * @var string
- */
- var $day_pcre;
-
- /**
- * Cached PCRE for SimplePie_Parse_Date::$month
- *
- * @access protected
- * @var string
- */
- var $month_pcre;
-
- /**
- * Array of user-added callback methods
- *
- * @access private
- * @var array
- */
- var $built_in = array();
-
- /**
- * Array of user-added callback methods
- *
- * @access private
- * @var array
- */
- var $user = array();
-
- /**
- * Create new SimplePie_Parse_Date object, and set self::day_pcre,
- * self::month_pcre, and self::built_in
- *
- * @access private
- */
- function SimplePie_Parse_Date()
- {
- $this->day_pcre = '(' . implode(array_keys($this->day), '|') . ')';
- $this->month_pcre = '(' . implode(array_keys($this->month), '|') . ')';
-
- static $cache;
- if (!isset($cache[get_class($this)]))
- {
- $all_methods = get_class_methods($this);
-
- foreach ($all_methods as $method)
- {
- if (strtolower(substr($method, 0, 5)) === 'date_')
- {
- $cache[get_class($this)][] = $method;
- }
- }
- }
-
- foreach ($cache[get_class($this)] as $method)
- {
- $this->built_in[] = $method;
- }
- }
-
- /**
- * Get the object
- *
- * @access public
- */
- function get()
- {
- static $object;
- if (!$object)
- {
- $object = new SimplePie_Parse_Date;
- }
- return $object;
- }
-
- /**
- * Parse a date
- *
- * @final
- * @access public
- * @param string $date Date to parse
- * @return int Timestamp corresponding to date string, or false on failure
- */
- function parse($date)
- {
- foreach ($this->user as $method)
- {
- if (($returned = call_user_func($method, $date)) !== false)
- {
- return $returned;
- }
- }
-
- foreach ($this->built_in as $method)
- {
- if (($returned = call_user_func(array(&$this, $method), $date)) !== false)
- {
- return $returned;
- }
- }
-
- return false;
- }
-
- /**
- * Add a callback method to parse a date
- *
- * @final
- * @access public
- * @param callback $callback
- */
- function add_callback($callback)
- {
- if (is_callable($callback))
- {
- $this->user[] = $callback;
- }
- else
- {
- trigger_error('User-supplied function must be a valid callback', E_USER_WARNING);
- }
- }
-
- /**
- * Parse a superset of W3C-DTF (allows hyphens and colons to be omitted, as
- * well as allowing any of upper or lower case "T", horizontal tabs, or
- * spaces to be used as the time seperator (including more than one))
- *
- * @access protected
- * @return int Timestamp
- */
- function date_w3cdtf($date)
- {
- static $pcre;
- if (!$pcre)
- {
- $year = '([0-9]{4})';
- $month = $day = $hour = $minute = $second = '([0-9]{2})';
- $decimal = '([0-9]*)';
- $zone = '(?:(Z)|([+\-])([0-9]{1,2}):?([0-9]{1,2}))';
- $pcre = '/^' . $year . '(?:-?' . $month . '(?:-?' . $day . '(?:[Tt\x09\x20]+' . $hour . '(?::?' . $minute . '(?::?' . $second . '(?:.' . $decimal . ')?)?)?' . $zone . ')?)?)?$/';
- }
- if (preg_match($pcre, $date, $match))
- {
- /*
- Capturing subpatterns:
- 1: Year
- 2: Month
- 3: Day
- 4: Hour
- 5: Minute
- 6: Second
- 7: Decimal fraction of a second
- 8: Zulu
- 9: Timezone ±
- 10: Timezone hours
- 11: Timezone minutes
- */
-
- // Fill in empty matches
- for ($i = count($match); $i <= 3; $i++)
- {
- $match[$i] = '1';
- }
-
- for ($i = count($match); $i <= 7; $i++)
- {
- $match[$i] = '0';
- }
-
- // Numeric timezone
- if (isset($match[9]) && $match[9] !== '')
- {
- $timezone = $match[10] * 3600;
- $timezone += $match[11] * 60;
- if ($match[9] === '-')
- {
- $timezone = 0 - $timezone;
- }
- }
- else
- {
- $timezone = 0;
- }
-
- // Convert the number of seconds to an integer, taking decimals into account
- $second = round($match[6] + $match[7] / pow(10, strlen($match[7])));
-
- return gmmktime($match[4], $match[5], $second, $match[2], $match[3], $match[1]) - $timezone;
- }
- else
- {
- return false;
- }
- }
-
- /**
- * Remove RFC822 comments
- *
- * @access protected
- * @param string $data Data to strip comments from
- * @return string Comment stripped string
- */
- function remove_rfc2822_comments($string)
- {
- $string = (string) $string;
- $position = 0;
- $length = strlen($string);
- $depth = 0;
-
- $output = '';
-
- while ($position < $length && ($pos = strpos($string, '(', $position)) !== false)
- {
- $output .= substr($string, $position, $pos - $position);
- $position = $pos + 1;
- if ($string[$pos - 1] !== '\\')
- {
- $depth++;
- while ($depth && $position < $length)
- {
- $position += strcspn($string, '()', $position);
- if ($string[$position - 1] === '\\')
- {
- $position++;
- continue;
- }
- elseif (isset($string[$position]))
- {
- switch ($string[$position])
- {
- case '(':
- $depth++;
- break;
-
- case ')':
- $depth--;
- break;
- }
- $position++;
- }
- else
- {
- break;
- }
- }
- }
- else
- {
- $output .= '(';
- }
- }
- $output .= substr($string, $position);
-
- return $output;
- }
-
- /**
- * Parse RFC2822's date format
- *
- * @access protected
- * @return int Timestamp
- */
- function date_rfc2822($date)
- {
- static $pcre;
- if (!$pcre)
- {
- $wsp = '[\x09\x20]';
- $fws = '(?:' . $wsp . '+|' . $wsp . '*(?:\x0D\x0A' . $wsp . '+)+)';
- $optional_fws = $fws . '?';
- $day_name = $this->day_pcre;
- $month = $this->month_pcre;
- $day = '([0-9]{1,2})';
- $hour = $minute = $second = '([0-9]{2})';
- $year = '([0-9]{2,4})';
- $num_zone = '([+\-])([0-9]{2})([0-9]{2})';
- $character_zone = '([A-Z]{1,5})';
- $zone = '(?:' . $num_zone . '|' . $character_zone . ')';
- $pcre = '/(?:' . $optional_fws . $day_name . $optional_fws . ',)?' . $optional_fws . $day . $fws . $month . $fws . $year . $fws . $hour . $optional_fws . ':' . $optional_fws . $minute . '(?:' . $optional_fws . ':' . $optional_fws . $second . ')?' . $fws . $zone . '/i';
- }
- if (preg_match($pcre, $this->remove_rfc2822_comments($date), $match))
- {
- /*
- Capturing subpatterns:
- 1: Day name
- 2: Day
- 3: Month
- 4: Year
- 5: Hour
- 6: Minute
- 7: Second
- 8: Timezone ±
- 9: Timezone hours
- 10: Timezone minutes
- 11: Alphabetic timezone
- */
-
- // Find the month number
- $month = $this->month[strtolower($match[3])];
-
- // Numeric timezone
- if ($match[8] !== '')
- {
- $timezone = $match[9] * 3600;
- $timezone += $match[10] * 60;
- if ($match[8] === '-')
- {
- $timezone = 0 - $timezone;
- }
- }
- // Character timezone
- elseif (isset($this->timezone[strtoupper($match[11])]))
- {
- $timezone = $this->timezone[strtoupper($match[11])];
- }
- // Assume everything else to be -0000
- else
- {
- $timezone = 0;
- }
-
- // Deal with 2/3 digit years
- if ($match[4] < 50)
- {
- $match[4] += 2000;
- }
- elseif ($match[4] < 1000)
- {
- $match[4] += 1900;
- }
-
- // Second is optional, if it is empty set it to zero
- if ($match[7] !== '')
- {
- $second = $match[7];
- }
- else
- {
- $second = 0;
- }
-
- return gmmktime($match[5], $match[6], $second, $month, $match[2], $match[4]) - $timezone;
- }
- else
- {
- return false;
- }
- }
-
- /**
- * Parse RFC850's date format
- *
- * @access protected
- * @return int Timestamp
- */
- function date_rfc850($date)
- {
- static $pcre;
- if (!$pcre)
- {
- $space = '[\x09\x20]+';
- $day_name = $this->day_pcre;
- $month = $this->month_pcre;
- $day = '([0-9]{1,2})';
- $year = $hour = $minute = $second = '([0-9]{2})';
- $zone = '([A-Z]{1,5})';
- $pcre = '/^' . $day_name . ',' . $space . $day . '-' . $month . '-' . $year . $space . $hour . ':' . $minute . ':' . $second . $space . $zone . '$/i';
- }
- if (preg_match($pcre, $date, $match))
- {
- /*
- Capturing subpatterns:
- 1: Day name
- 2: Day
- 3: Month
- 4: Year
- 5: Hour
- 6: Minute
- 7: Second
- 8: Timezone
- */
-
- // Month
- $month = $this->month[strtolower($match[3])];
-
- // Character timezone
- if (isset($this->timezone[strtoupper($match[8])]))
- {
- $timezone = $this->timezone[strtoupper($match[8])];
- }
- // Assume everything else to be -0000
- else
- {
- $timezone = 0;
- }
-
- // Deal with 2 digit year
- if ($match[4] < 50)
- {
- $match[4] += 2000;
- }
- else
- {
- $match[4] += 1900;
- }
-
- return gmmktime($match[5], $match[6], $match[7], $month, $match[2], $match[4]) - $timezone;
- }
- else
- {
- return false;
- }
- }
-
- /**
- * Parse C99's asctime()'s date format
- *
- * @access protected
- * @return int Timestamp
- */
- function date_asctime($date)
- {
- static $pcre;
- if (!$pcre)
- {
- $space = '[\x09\x20]+';
- $wday_name = $this->day_pcre;
- $mon_name = $this->month_pcre;
- $day = '([0-9]{1,2})';
- $hour = $sec = $min = '([0-9]{2})';
- $year = '([0-9]{4})';
- $terminator = '\x0A?\x00?';
- $pcre = '/^' . $wday_name . $space . $mon_name . $space . $day . $space . $hour . ':' . $min . ':' . $sec . $space . $year . $terminator . '$/i';
- }
- if (preg_match($pcre, $date, $match))
- {
- /*
- Capturing subpatterns:
- 1: Day name
- 2: Month
- 3: Day
- 4: Hour
- 5: Minute
- 6: Second
- 7: Year
- */
-
- $month = $this->month[strtolower($match[2])];
- return gmmktime($match[4], $match[5], $match[6], $month, $match[3], $match[7]);
- }
- else
- {
- return false;
- }
- }
-
- /**
- * Parse dates using strtotime()
- *
- * @access protected
- * @return int Timestamp
- */
- function date_strtotime($date)
- {
- $strtotime = strtotime($date);
- if ($strtotime === -1 || $strtotime === false)
- {
- return false;
- }
- else
- {
- return $strtotime;
- }
- }
-}
-
-/**
- * Content-type sniffing
- *
- * @package SimplePie
- */
-class SimplePie_Content_Type_Sniffer
-{
- /**
- * File object
- *
- * @var SimplePie_File
- * @access private
- */
- var $file;
-
- /**
- * Create an instance of the class with the input file
- *
- * @access public
- * @param SimplePie_Content_Type_Sniffer $file Input file
- */
- function SimplePie_Content_Type_Sniffer($file)
- {
- $this->file = $file;
- }
-
- /**
- * Get the Content-Type of the specified file
- *
- * @access public
- * @return string Actual Content-Type
- */
- function get_type()
- {
- if (isset($this->file->headers['content-type']))
- {
- if (!isset($this->file->headers['content-encoding'])
- && ($this->file->headers['content-type'] === 'text/plain'
- || $this->file->headers['content-type'] === 'text/plain; charset=ISO-8859-1'
- || $this->file->headers['content-type'] === 'text/plain; charset=iso-8859-1'))
- {
- return $this->text_or_binary();
- }
-
- if (($pos = strpos($this->file->headers['content-type'], ';')) !== false)
- {
- $official = substr($this->file->headers['content-type'], 0, $pos);
- }
- else
- {
- $official = $this->file->headers['content-type'];
- }
- $official = strtolower($official);
-
- if ($official === 'unknown/unknown'
- || $official === 'application/unknown')
- {
- return $this->unknown();
- }
- elseif (substr($official, -4) === '+xml'
- || $official === 'text/xml'
- || $official === 'application/xml')
- {
- return $official;
- }
- elseif (substr($official, 0, 6) === 'image/')
- {
- if ($return = $this->image())
- {
- return $return;
- }
- else
- {
- return $official;
- }
- }
- elseif ($official === 'text/html')
- {
- return $this->feed_or_html();
- }
- else
- {
- return $official;
- }
- }
- else
- {
- return $this->unknown();
- }
- }
-
- /**
- * Sniff text or binary
- *
- * @access private
- * @return string Actual Content-Type
- */
- function text_or_binary()
- {
- if (substr($this->file->body, 0, 2) === "\xFE\xFF"
- || substr($this->file->body, 0, 2) === "\xFF\xFE"
- || substr($this->file->body, 0, 4) === "\x00\x00\xFE\xFF"
- || substr($this->file->body, 0, 3) === "\xEF\xBB\xBF")
- {
- return 'text/plain';
- }
- elseif (preg_match('/[\x00-\x08\x0E-\x1A\x1C-\x1F]/', $this->file->body))
- {
- return 'application/octect-stream';
- }
- else
- {
- return 'text/plain';
- }
- }
-
- /**
- * Sniff unknown
- *
- * @access private
- * @return string Actual Content-Type
- */
- function unknown()
- {
- $ws = strspn($this->file->body, "\x09\x0A\x0B\x0C\x0D\x20");
- if (strtolower(substr($this->file->body, $ws, 14)) === '<!doctype html'
- || strtolower(substr($this->file->body, $ws, 5)) === '<html'
- || strtolower(substr($this->file->body, $ws, 7)) === '<script')
- {
- return 'text/html';
- }
- elseif (substr($this->file->body, 0, 5) === '%PDF-')
- {
- return 'application/pdf';
- }
- elseif (substr($this->file->body, 0, 11) === '%!PS-Adobe-')
- {
- return 'application/postscript';
- }
- elseif (substr($this->file->body, 0, 6) === 'GIF87a'
- || substr($this->file->body, 0, 6) === 'GIF89a')
- {
- return 'image/gif';
- }
- elseif (substr($this->file->body, 0, 8) === "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A")
- {
- return 'image/png';
- }
- elseif (substr($this->file->body, 0, 3) === "\xFF\xD8\xFF")
- {
- return 'image/jpeg';
- }
- elseif (substr($this->file->body, 0, 2) === "\x42\x4D")
- {
- return 'image/bmp';
- }
- else
- {
- return $this->text_or_binary();
- }
- }
-
- /**
- * Sniff images
- *
- * @access private
- * @return string Actual Content-Type
- */
- function image()
- {
- if (substr($this->file->body, 0, 6) === 'GIF87a'
- || substr($this->file->body, 0, 6) === 'GIF89a')
- {
- return 'image/gif';
- }
- elseif (substr($this->file->body, 0, 8) === "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A")
- {
- return 'image/png';
- }
- elseif (substr($this->file->body, 0, 3) === "\xFF\xD8\xFF")
- {
- return 'image/jpeg';
- }
- elseif (substr($this->file->body, 0, 2) === "\x42\x4D")
- {
- return 'image/bmp';
- }
- else
- {
- return false;
- }
- }
-
- /**
- * Sniff HTML
- *
- * @access private
- * @return string Actual Content-Type
- */
- function feed_or_html()
- {
- $len = strlen($this->file->body);
- $pos = strspn($this->file->body, "\x09\x0A\x0D\x20");
-
- while ($pos < $len)
- {
- switch ($this->file->body[$pos])
- {
- case "\x09":
- case "\x0A":
- case "\x0D":
- case "\x20":
- $pos += strspn($this->file->body, "\x09\x0A\x0D\x20", $pos);
- continue 2;
-
- case '<':
- $pos++;
- break;
-
- default:
- return 'text/html';
- }
-
- if (substr($this->file->body, $pos, 3) === '!--')
- {
- $pos += 3;
- if ($pos < $len && ($pos = strpos($this->file->body, '-->', $pos)) !== false)
- {
- $pos += 3;
- }
- else
- {
- return 'text/html';
- }
- }
- elseif (substr($this->file->body, $pos, 1) === '!')
- {
- if ($pos < $len && ($pos = strpos($this->file->body, '>', $pos)) !== false)
- {
- $pos++;
- }
- else
- {
- return 'text/html';
- }
- }
- elseif (substr($this->file->body, $pos, 1) === '?')
- {
- if ($pos < $len && ($pos = strpos($this->file->body, '?>', $pos)) !== false)
- {
- $pos += 2;
- }
- else
- {
- return 'text/html';
- }
- }
- elseif (substr($this->file->body, $pos, 3) === 'rss'
- || substr($this->file->body, $pos, 7) === 'rdf:RDF')
- {
- return 'application/rss+xml';
- }
- elseif (substr($this->file->body, $pos, 4) === 'feed')
- {
- return 'application/atom+xml';
- }
- else
- {
- return 'text/html';
- }
- }
-
- return 'text/html';
- }
-}
-
-/**
- * Parses the XML Declaration
- *
- * @package SimplePie
- */
-class SimplePie_XML_Declaration_Parser
-{
- /**
- * XML Version
- *
- * @access public
- * @var string
- */
- var $version = '1.0';
-
- /**
- * Encoding
- *
- * @access public
- * @var string
- */
- var $encoding = 'UTF-8';
-
- /**
- * Standalone
- *
- * @access public
- * @var bool
- */
- var $standalone = false;
-
- /**
- * Current state of the state machine
- *
- * @access private
- * @var string
- */
- var $state = 'before_version_name';
-
- /**
- * Input data
- *
- * @access private
- * @var string
- */
- var $data = '';
-
- /**
- * Input data length (to avoid calling strlen() everytime this is needed)
- *
- * @access private
- * @var int
- */
- var $data_length = 0;
-
- /**
- * Current position of the pointer
- *
- * @var int
- * @access private
- */
- var $position = 0;
-
- /**
- * Create an instance of the class with the input data
- *
- * @access public
- * @param string $data Input data
- */
- function SimplePie_XML_Declaration_Parser($data)
- {
- $this->data = $data;
- $this->data_length = strlen($this->data);
- }
-
- /**
- * Parse the input data
- *
- * @access public
- * @return bool true on success, false on failure
- */
- function parse()
- {
- while ($this->state && $this->state !== 'emit' && $this->has_data())
- {
- $state = $this->state;
- $this->$state();
- }
- $this->data = '';
- if ($this->state === 'emit')
- {
- return true;
- }
- else
- {
- $this->version = '';
- $this->encoding = '';
- $this->standalone = '';
- return false;
- }
- }
-
- /**
- * Check whether there is data beyond the pointer
- *
- * @access private
- * @return bool true if there is further data, false if not
- */
- function has_data()
- {
- return (bool) ($this->position < $this->data_length);
- }
-
- /**
- * Advance past any whitespace
- *
- * @return int Number of whitespace characters passed
- */
- function skip_whitespace()
- {
- $whitespace = strspn($this->data, "\x09\x0A\x0D\x20", $this->position);
- $this->position += $whitespace;
- return $whitespace;
- }
-
- /**
- * Read value
- */
- function get_value()
- {
- $quote = substr($this->data, $this->position, 1);
- if ($quote === '"' || $quote === "'")
- {
- $this->position++;
- $len = strcspn($this->data, $quote, $this->position);
- if ($this->has_data())
- {
- $value = substr($this->data, $this->position, $len);
- $this->position += $len + 1;
- return $value;
- }
- }
- return false;
- }
-
- function before_version_name()
- {
- if ($this->skip_whitespace())
- {
- $this->state = 'version_name';
- }
- else
- {
- $this->state = false;
- }
- }
-
- function version_name()
- {
- if (substr($this->data, $this->position, 7) === 'version')
- {
- $this->position += 7;
- $this->skip_whitespace();
- $this->state = 'version_equals';
- }
- else
- {
- $this->state = false;
- }
- }
-
- function version_equals()
- {
- if (substr($this->data, $this->position, 1) === '=')
- {
- $this->position++;
- $this->skip_whitespace();
- $this->state = 'version_value';
- }
- else
- {
- $this->state = false;
- }
- }
-
- function version_value()
- {
- if ($this->version = $this->get_value())
- {
- $this->skip_whitespace();
- if ($this->has_data())
- {
- $this->state = 'encoding_name';
- }
- else
- {
- $this->state = 'emit';
- }
- }
- else
- {
- $this->state = false;
- }
- }
-
- function encoding_name()
- {
- if (substr($this->data, $this->position, 8) === 'encoding')
- {
- $this->position += 8;
- $this->skip_whitespace();
- $this->state = 'encoding_equals';
- }
- else
- {
- $this->state = 'standalone_name';
- }
- }
-
- function encoding_equals()
- {
- if (substr($this->data, $this->position, 1) === '=')
- {
- $this->position++;
- $this->skip_whitespace();
- $this->state = 'encoding_value';
- }
- else
- {
- $this->state = false;
- }
- }
-
- function encoding_value()
- {
- if ($this->encoding = $this->get_value())
- {
- $this->skip_whitespace();
- if ($this->has_data())
- {
- $this->state = 'standalone_name';
- }
- else
- {
- $this->state = 'emit';
- }
- }
- else
- {
- $this->state = false;
- }
- }
-
- function standalone_name()
- {
- if (substr($this->data, $this->position, 10) === 'standalone')
- {
- $this->position += 10;
- $this->skip_whitespace();
- $this->state = 'standalone_equals';
- }
- else
- {
- $this->state = false;
- }
- }
-
- function standalone_equals()
- {
- if (substr($this->data, $this->position, 1) === '=')
- {
- $this->position++;
- $this->skip_whitespace();
- $this->state = 'standalone_value';
- }
- else
- {
- $this->state = false;
- }
- }
-
- function standalone_value()
- {
- if ($standalone = $this->get_value())
- {
- switch ($standalone)
- {
- case 'yes':
- $this->standalone = true;
- break;
-
- case 'no':
- $this->standalone = false;
- break;
-
- default:
- $this->state = false;
- return;
- }
-
- $this->skip_whitespace();
- if ($this->has_data())
- {
- $this->state = false;
- }
- else
- {
- $this->state = 'emit';
- }
- }
- else
- {
- $this->state = false;
- }
- }
-}
-
-class SimplePie_Locator
-{
- var $useragent;
- var $timeout;
- var $file;
- var $local = array();
- var $elsewhere = array();
- var $file_class = 'SimplePie_File';
- var $cached_entities = array();
- var $http_base;
- var $base;
- var $base_location = 0;
- var $checked_feeds = 0;
- var $max_checked_feeds = 10;
- var $content_type_sniffer_class = 'SimplePie_Content_Type_Sniffer';
-
- function SimplePie_Locator(&$file, $timeout = 10, $useragent = null, $file_class = 'SimplePie_File', $max_checked_feeds = 10, $content_type_sniffer_class = 'SimplePie_Content_Type_Sniffer')
- {
- $this->file =& $file;
- $this->file_class = $file_class;
- $this->useragent = $useragent;
- $this->timeout = $timeout;
- $this->max_checked_feeds = $max_checked_feeds;
- $this->content_type_sniffer_class = $content_type_sniffer_class;
- }
-
- function find($type = SIMPLEPIE_LOCATOR_ALL, &$working)
- {
- if ($this->is_feed($this->file))
- {
- return $this->file;
- }
-
- if ($this->file->method & SIMPLEPIE_FILE_SOURCE_REMOTE)
- {
- $sniffer = new $this->content_type_sniffer_class($this->file);
- if ($sniffer->get_type() !== 'text/html')
- {
- return null;
- }
- }
-
- if ($type & ~SIMPLEPIE_LOCATOR_NONE)
- {
- $this->get_base();
- }
-
- if ($type & SIMPLEPIE_LOCATOR_AUTODISCOVERY && $working = $this->autodiscovery())
- {
- return $working[0];
- }
-
- if ($type & (SIMPLEPIE_LOCATOR_LOCAL_EXTENSION | SIMPLEPIE_LOCATOR_LOCAL_BODY | SIMPLEPIE_LOCATOR_REMOTE_EXTENSION | SIMPLEPIE_LOCATOR_REMOTE_BODY) && $this->get_links())
- {
- if ($type & SIMPLEPIE_LOCATOR_LOCAL_EXTENSION && $working = $this->extension($this->local))
- {
- return $working;
- }
-
- if ($type & SIMPLEPIE_LOCATOR_LOCAL_BODY && $working = $this->body($this->local))
- {
- return $working;
- }
-
- if ($type & SIMPLEPIE_LOCATOR_REMOTE_EXTENSION && $working = $this->extension($this->elsewhere))
- {
- return $working;
- }
-
- if ($type & SIMPLEPIE_LOCATOR_REMOTE_BODY && $working = $this->body($this->elsewhere))
- {
- return $working;
- }
- }
- return null;
- }
-
- function is_feed(&$file)
- {
- if ($file->method & SIMPLEPIE_FILE_SOURCE_REMOTE)
- {
- $sniffer = new $this->content_type_sniffer_class($file);
- $sniffed = $sniffer->get_type();
- if (in_array($sniffed, array('application/rss+xml', 'application/rdf+xml', 'text/rdf', 'application/atom+xml', 'text/xml', 'application/xml')))
- {
- return true;
- }
- else
- {
- return false;
- }
- }
- elseif ($file->method & SIMPLEPIE_FILE_SOURCE_LOCAL)
- {
- return true;
- }
- else
- {
- return false;
- }
- }
-
- function get_base()
- {
- $this->http_base = $this->file->url;
- $this->base = $this->http_base;
- $elements = SimplePie_Misc::get_element('base', $this->file->body);
- foreach ($elements as $element)
- {
- if ($element['attribs']['href']['data'] !== '')
- {
- $this->base = SimplePie_Misc::absolutize_url(trim($element['attribs']['href']['data']), $this->http_base);
- $this->base_location = $element['offset'];
- break;
- }
- }
- }
-
- function autodiscovery()
- {
- $links = array_merge(SimplePie_Misc::get_element('link', $this->file->body), SimplePie_Misc::get_element('a', $this->file->body), SimplePie_Misc::get_element('area', $this->file->body));
- $done = array();
- $feeds = array();
- foreach ($links as $link)
- {
- if ($this->checked_feeds === $this->max_checked_feeds)
- {
- break;
- }
- if (isset($link['attribs']['href']['data']) && isset($link['attribs']['rel']['data']))
- {
- $rel = array_unique(SimplePie_Misc::space_seperated_tokens(strtolower($link['attribs']['rel']['data'])));
-
- if ($this->base_location < $link['offset'])
- {
- $href = SimplePie_Misc::absolutize_url(trim($link['attribs']['href']['data']), $this->base);
- }
- else
- {
- $href = SimplePie_Misc::absolutize_url(trim($link['attribs']['href']['data']), $this->http_base);
- }
-
- if (!in_array($href, $done) && in_array('feed', $rel) || (in_array('alternate', $rel) && !empty($link['attribs']['type']['data']) && in_array(strtolower(SimplePie_Misc::parse_mime($link['attribs']['type']['data'])), array('application/rss+xml', 'application/atom+xml'))) && !isset($feeds[$href]))
- {
- $this->checked_feeds++;
- $feed = new $this->file_class($href, $this->timeout, 5, null, $this->useragent);
- if ($feed->success && ($feed->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($feed->status_code === 200 || $feed->status_code > 206 && $feed->status_code < 300)) && $this->is_feed($feed))
- {
- $feeds[$href] = $feed;
- }
- }
- $done[] = $href;
- }
- }
-
- if (!empty($feeds))
- {
- return array_values($feeds);
- }
- else {
- return null;
- }
- }
-
- function get_links()
- {
- $links = SimplePie_Misc::get_element('a', $this->file->body);
- foreach ($links as $link)
- {
- if (isset($link['attribs']['href']['data']))
- {
- $href = trim($link['attribs']['href']['data']);
- $parsed = SimplePie_Misc::parse_url($href);
- if ($parsed['scheme'] === '' || preg_match('/^(http(s)|feed)?$/i', $parsed['scheme']))
- {
- if ($this->base_location < $link['offset'])
- {
- $href = SimplePie_Misc::absolutize_url(trim($link['attribs']['href']['data']), $this->base);
- }
- else
- {
- $href = SimplePie_Misc::absolutize_url(trim($link['attribs']['href']['data']), $this->http_base);
- }
-
- $current = SimplePie_Misc::parse_url($this->file->url);
-
- if ($parsed['authority'] === '' || $parsed['authority'] === $current['authority'])
- {
- $this->local[] = $href;
- }
- else
- {
- $this->elsewhere[] = $href;
- }
- }
- }
- }
- $this->local = array_unique($this->local);
- $this->elsewhere = array_unique($this->elsewhere);
- if (!empty($this->local) || !empty($this->elsewhere))
- {
- return true;
- }
- return null;
- }
-
- function extension(&$array)
- {
- foreach ($array as $key => $value)
- {
- if ($this->checked_feeds === $this->max_checked_feeds)
- {
- break;
- }
- if (in_array(strtolower(strrchr($value, '.')), array('.rss', '.rdf', '.atom', '.xml')))
- {
- $this->checked_feeds++;
- $feed = new $this->file_class($value, $this->timeout, 5, null, $this->useragent);
- if ($feed->success && ($feed->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($feed->status_code === 200 || $feed->status_code > 206 && $feed->status_code < 300)) && $this->is_feed($feed))
- {
- return $feed;
- }
- else
- {
- unset($array[$key]);
- }
- }
- }
- return null;
- }
-
- function body(&$array)
- {
- foreach ($array as $key => $value)
- {
- if ($this->checked_feeds === $this->max_checked_feeds)
- {
- break;
- }
- if (preg_match('/(rss|rdf|atom|xml)/i', $value))
- {
- $this->checked_feeds++;
- $feed = new $this->file_class($value, $this->timeout, 5, null, $this->useragent);
- if ($feed->success && ($feed->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($feed->status_code === 200 || $feed->status_code > 206 && $feed->status_code < 300)) && $this->is_feed($feed))
- {
- return $feed;
- }
- else
- {
- unset($array[$key]);
- }
- }
- }
- return null;
- }
-}
-
-class SimplePie_Parser
-{
- var $error_code;
- var $error_string;
- var $current_line;
- var $current_column;
- var $current_byte;
- var $separator = ' ';
- var $namespace = array('');
- var $element = array('');
- var $xml_base = array('');
- var $xml_base_explicit = array(false);
- var $xml_lang = array('');
- var $data = array();
- var $datas = array(array());
- var $current_xhtml_construct = -1;
- var $encoding;
-
- function parse(&$data, $encoding)
- {
- // Use UTF-8 if we get passed US-ASCII, as every US-ASCII character is a UTF-8 character
- if (strtoupper($encoding) === 'US-ASCII')
- {
- $this->encoding = 'UTF-8';
- }
- else
- {
- $this->encoding = $encoding;
- }
-
- // Strip BOM:
- // UTF-32 Big Endian BOM
- if (substr($data, 0, 4) === "\x00\x00\xFE\xFF")
- {
- $data = substr($data, 4);
- }
- // UTF-32 Little Endian BOM
- elseif (substr($data, 0, 4) === "\xFF\xFE\x00\x00")
- {
- $data = substr($data, 4);
- }
- // UTF-16 Big Endian BOM
- elseif (substr($data, 0, 2) === "\xFE\xFF")
- {
- $data = substr($data, 2);
- }
- // UTF-16 Little Endian BOM
- elseif (substr($data, 0, 2) === "\xFF\xFE")
- {
- $data = substr($data, 2);
- }
- // UTF-8 BOM
- elseif (substr($data, 0, 3) === "\xEF\xBB\xBF")
- {
- $data = substr($data, 3);
- }
-
- if (substr($data, 0, 5) === '<?xml' && strspn(substr($data, 5, 1), "\x09\x0A\x0D\x20") && ($pos = strpos($data, '?>')) !== false)
- {
- $declaration = new SimplePie_XML_Declaration_Parser(substr($data, 5, $pos - 5));
- if ($declaration->parse())
- {
- $data = substr($data, $pos + 2);
- $data = '<?xml version="' . $declaration->version . '" encoding="' . $encoding . '" standalone="' . (($declaration->standalone) ? 'yes' : 'no') . '"?>' . $data;
- }
- else
- {
- $this->error_string = 'SimplePie bug! Please report this!';
- return false;
- }
- }
-
- $return = true;
-
- static $xml_is_sane = null;
- if ($xml_is_sane === null)
- {
- $parser_check = xml_parser_create();
- xml_parse_into_struct($parser_check, '<foo>&amp;</foo>', $values);
- xml_parser_free($parser_check);
- $xml_is_sane = isset($values[0]['value']);
- }
-
- // Create the parser
- if ($xml_is_sane)
- {
- $xml = xml_parser_create_ns($this->encoding, $this->separator);
- xml_parser_set_option($xml, XML_OPTION_SKIP_WHITE, 1);
- xml_parser_set_option($xml, XML_OPTION_CASE_FOLDING, 0);
- xml_set_object($xml, $this);
- xml_set_character_data_handler($xml, 'cdata');
- xml_set_element_handler($xml, 'tag_open', 'tag_close');
-
- // Parse!
- if (!xml_parse($xml, $data, true))
- {
- $this->error_code = xml_get_error_code($xml);
- $this->error_string = xml_error_string($this->error_code);
- $return = false;
- }
- $this->current_line = xml_get_current_line_number($xml);
- $this->current_column = xml_get_current_column_number($xml);
- $this->current_byte = xml_get_current_byte_index($xml);
- xml_parser_free($xml);
- return $return;
- }
- else
- {
- libxml_clear_errors();
- $xml = new XMLReader();
- $xml->xml($data);
- while (@$xml->read())
- {
- switch ($xml->nodeType)
- {
-
- case constant('XMLReader::END_ELEMENT'):
- if ($xml->namespaceURI !== '')
- {
- $tagName = "{$xml->namespaceURI}{$this->separator}{$xml->localName}";
- }
- else
- {
- $tagName = $xml->localName;
- }
- $this->tag_close(null, $tagName);
- break;
- case constant('XMLReader::ELEMENT'):
- $empty = $xml->isEmptyElement;
- if ($xml->namespaceURI !== '')
- {
- $tagName = "{$xml->namespaceURI}{$this->separator}{$xml->localName}";
- }
- else
- {
- $tagName = $xml->localName;
- }
- $attributes = array();
- while ($xml->moveToNextAttribute())
- {
- if ($xml->namespaceURI !== '')
- {
- $attrName = "{$xml->namespaceURI}{$this->separator}{$xml->localName}";
- }
- else
- {
- $attrName = $xml->localName;
- }
- $attributes[$attrName] = $xml->value;
- }
- $this->tag_open(null, $tagName, $attributes);
- if ($empty)
- {
- $this->tag_close(null, $tagName);
- }
- break;
- case constant('XMLReader::TEXT'):
-
- case constant('XMLReader::CDATA'):
- $this->cdata(null, $xml->value);
- break;
- }
- }
- if ($error = libxml_get_last_error())
- {
- $this->error_code = $error->code;
- $this->error_string = $error->message;
- $this->current_line = $error->line;
- $this->current_column = $error->column;
- return false;
- }
- else
- {
- return true;
- }
- }
- }
-
- function get_error_code()
- {
- return $this->error_code;
- }
-
- function get_error_string()
- {
- return $this->error_string;
- }
-
- function get_current_line()
- {
- return $this->current_line;
- }
-
- function get_current_column()
- {
- return $this->current_column;
- }
-
- function get_current_byte()
- {
- return $this->current_byte;
- }
-
- function get_data()
- {
- return $this->data;
- }
-
- function tag_open($parser, $tag, $attributes)
- {
- list($this->namespace[], $this->element[]) = $this->split_ns($tag);
-
- $attribs = array();
- foreach ($attributes as $name => $value)
- {
- list($attrib_namespace, $attribute) = $this->split_ns($name);
- $attribs[$attrib_namespace][$attribute] = $value;
- }
-
- if (isset($attribs[SIMPLEPIE_NAMESPACE_XML]['base']))
- {
- $this->xml_base[] = SimplePie_Misc::absolutize_url($attribs[SIMPLEPIE_NAMESPACE_XML]['base'], end($this->xml_base));
- $this->xml_base_explicit[] = true;
- }
- else
- {
- $this->xml_base[] = end($this->xml_base);
- $this->xml_base_explicit[] = end($this->xml_base_explicit);
- }
-
- if (isset($attribs[SIMPLEPIE_NAMESPACE_XML]['lang']))
- {
- $this->xml_lang[] = $attribs[SIMPLEPIE_NAMESPACE_XML]['lang'];
- }
- else
- {
- $this->xml_lang[] = end($this->xml_lang);
- }
-
- if ($this->current_xhtml_construct >= 0)
- {
- $this->current_xhtml_construct++;
- if (end($this->namespace) === SIMPLEPIE_NAMESPACE_XHTML)
- {
- $this->data['data'] .= '<' . end($this->element);
- if (isset($attribs['']))
- {
- foreach ($attribs[''] as $name => $value)
- {
- $this->data['data'] .= ' ' . $name . '="' . htmlspecialchars($value, ENT_COMPAT, $this->encoding) . '"';
- }
- }
- $this->data['data'] .= '>';
- }
- }
- else
- {
- $this->datas[] =& $this->data;
- $this->data =& $this->data['child'][end($this->namespace)][end($this->element)][];
- $this->data = array('data' => '', 'attribs' => $attribs, 'xml_base' => end($this->xml_base), 'xml_base_explicit' => end($this->xml_base_explicit), 'xml_lang' => end($this->xml_lang));
- if ((end($this->namespace) === SIMPLEPIE_NAMESPACE_ATOM_03 && in_array(end($this->element), array('title', 'tagline', 'copyright', 'info', 'summary', 'content')) && isset($attribs['']['mode']) && $attribs['']['mode'] === 'xml')
- || (end($this->namespace) === SIMPLEPIE_NAMESPACE_ATOM_10 && in_array(end($this->element), array('rights', 'subtitle', 'summary', 'info', 'title', 'content')) && isset($attribs['']['type']) && $attribs['']['type'] === 'xhtml'))
- {
- $this->current_xhtml_construct = 0;
- }
- }
- }
-
- function cdata($parser, $cdata)
- {
- if ($this->current_xhtml_construct >= 0)
- {
- $this->data['data'] .= htmlspecialchars($cdata, ENT_QUOTES, $this->encoding);
- }
- else
- {
- $this->data['data'] .= $cdata;
- }
- }
-
- function tag_close($parser, $tag)
- {
- if ($this->current_xhtml_construct >= 0)
- {
- $this->current_xhtml_construct--;
- if (end($this->namespace) === SIMPLEPIE_NAMESPACE_XHTML && !in_array(end($this->element), array('area', 'base', 'basefont', 'br', 'col', 'frame', 'hr', 'img', 'input', 'isindex', 'link', 'meta', 'param')))
- {
- $this->data['data'] .= '</' . end($this->element) . '>';
- }
- }
- if ($this->current_xhtml_construct === -1)
- {
- $this->data =& $this->datas[count($this->datas) - 1];
- array_pop($this->datas);
- }
-
- array_pop($this->element);
- array_pop($this->namespace);
- array_pop($this->xml_base);
- array_pop($this->xml_base_explicit);
- array_pop($this->xml_lang);
- }
-
- function split_ns($string)
- {
- static $cache = array();
- if (!isset($cache[$string]))
- {
- if ($pos = strpos($string, $this->separator))
- {
- static $separator_length;
- if (!$separator_length)
- {
- $separator_length = strlen($this->separator);
- }
- $namespace = substr($string, 0, $pos);
- $local_name = substr($string, $pos + $separator_length);
- if (strtolower($namespace) === SIMPLEPIE_NAMESPACE_ITUNES)
- {
- $namespace = SIMPLEPIE_NAMESPACE_ITUNES;
- }
-
- // Normalize the Media RSS namespaces
- if ($namespace === SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG)
- {
- $namespace = SIMPLEPIE_NAMESPACE_MEDIARSS;
- }
- $cache[$string] = array($namespace, $local_name);
- }
- else
- {
- $cache[$string] = array('', $string);
- }
- }
- return $cache[$string];
- }
-}
-
-/**
- * @todo Move to using an actual HTML parser (this will allow tags to be properly stripped, and to switch between HTML and XHTML), this will also make it easier to shorten a string while preserving HTML tags
- */
-class SimplePie_Sanitize
-{
- // Private vars
- var $base;
-
- // Options
- var $remove_div = true;
- var $image_handler = '';
- var $strip_htmltags = array('base', 'blink', 'body', 'doctype', 'embed', 'font', 'form', 'frame', 'frameset', 'html', 'input', 'marquee', 'meta', 'noscript', 'object', 'param', 'script', 'style');
- var $encode_instead_of_strip = false;
- var $strip_attributes = array('bgsound', 'class', 'expr', 'id', 'style', 'onclick', 'onerror', 'onfinish', 'onmouseover', 'onmouseout', 'onfocus', 'onblur', 'lowsrc', 'dynsrc');
- var $strip_comments = false;
- var $output_encoding = 'UTF-8';
- var $enable_cache = true;
- var $cache_location = './cache';
- var $cache_name_function = 'md5';
- var $cache_class = 'SimplePie_Cache';
- var $file_class = 'SimplePie_File';
- var $timeout = 10;
- var $useragent = '';
- var $force_fsockopen = false;
-
- var $replace_url_attributes = array(
- 'a' => 'href',
- 'area' => 'href',
- 'blockquote' => 'cite',
- 'del' => 'cite',
- 'form' => 'action',
- 'img' => array('longdesc', 'src'),
- 'input' => 'src',
- 'ins' => 'cite',
- 'q' => 'cite'
- );
-
- function remove_div($enable = true)
- {
- $this->remove_div = (bool) $enable;
- }
-
- function set_image_handler($page = false)
- {
- if ($page)
- {
- $this->image_handler = (string) $page;
- }
- else
- {
- $this->image_handler = false;
- }
- }
-
- function pass_cache_data($enable_cache = true, $cache_location = './cache', $cache_name_function = 'md5', $cache_class = 'SimplePie_Cache')
- {
- if (isset($enable_cache))
- {
- $this->enable_cache = (bool) $enable_cache;
- }
-
- if ($cache_location)
- {
- $this->cache_location = (string) $cache_location;
- }
-
- if ($cache_name_function)
- {
- $this->cache_name_function = (string) $cache_name_function;
- }
-
- if ($cache_class)
- {
- $this->cache_class = (string) $cache_class;
- }
- }
-
- function pass_file_data($file_class = 'SimplePie_File', $timeout = 10, $useragent = '', $force_fsockopen = false)
- {
- if ($file_class)
- {
- $this->file_class = (string) $file_class;
- }
-
- if ($timeout)
- {
- $this->timeout = (string) $timeout;
- }
-
- if ($useragent)
- {
- $this->useragent = (string) $useragent;
- }
-
- if ($force_fsockopen)
- {
- $this->force_fsockopen = (string) $force_fsockopen;
- }
- }
-
- function strip_htmltags($tags = array('base', 'blink', 'body', 'doctype', 'embed', 'font', 'form', 'frame', 'frameset', 'html', 'input', 'marquee', 'meta', 'noscript', 'object', 'param', 'script', 'style'))
- {
- if ($tags)
- {
- if (is_array($tags))
- {
- $this->strip_htmltags = $tags;
- }
- else
- {
- $this->strip_htmltags = explode(',', $tags);
- }
- }
- else
- {
- $this->strip_htmltags = false;
- }
- }
-
- function encode_instead_of_strip($encode = false)
- {
- $this->encode_instead_of_strip = (bool) $encode;
- }
-
- function strip_attributes($attribs = array('bgsound', 'class', 'expr', 'id', 'style', 'onclick', 'onerror', 'onfinish', 'onmouseover', 'onmouseout', 'onfocus', 'onblur', 'lowsrc', 'dynsrc'))
- {
- if ($attribs)
- {
- if (is_array($attribs))
- {
- $this->strip_attributes = $attribs;
- }
- else
- {
- $this->strip_attributes = explode(',', $attribs);
- }
- }
- else
- {
- $this->strip_attributes = false;
- }
- }
-
- function strip_comments($strip = false)
- {
- $this->strip_comments = (bool) $strip;
- }
-
- function set_output_encoding($encoding = 'UTF-8')
- {
- $this->output_encoding = (string) $encoding;
- }
-
- /**
- * Set element/attribute key/value pairs of HTML attributes
- * containing URLs that need to be resolved relative to the feed
- *
- * @access public
- * @since 1.0
- * @param array $element_attribute Element/attribute key/value pairs
- */
- function set_url_replacements($element_attribute = array('a' => 'href', 'area' => 'href', 'blockquote' => 'cite', 'del' => 'cite', 'form' => 'action', 'img' => array('longdesc', 'src'), 'input' => 'src', 'ins' => 'cite', 'q' => 'cite'))
- {
- $this->replace_url_attributes = (array) $element_attribute;
- }
-
- function sanitize($data, $type, $base = '')
- {
- $data = trim($data);
- if ($data !== '' || $type & SIMPLEPIE_CONSTRUCT_IRI)
- {
- if ($type & SIMPLEPIE_CONSTRUCT_MAYBE_HTML)
- {
- if (preg_match('/(&(#(x[0-9a-fA-F]+|[0-9]+)|[a-zA-Z0-9]+)|<\/[A-Za-z][^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3E]*' . SIMPLEPIE_PCRE_HTML_ATTRIBUTE . '>)/', $data))
- {
- $type |= SIMPLEPIE_CONSTRUCT_HTML;
- }
- else
- {
- $type |= SIMPLEPIE_CONSTRUCT_TEXT;
- }
- }
-
- if ($type & SIMPLEPIE_CONSTRUCT_BASE64)
- {
- $data = base64_decode($data);
- }
-
- if ($type & SIMPLEPIE_CONSTRUCT_XHTML)
- {
- if ($this->remove_div)
- {
- $data = preg_replace('/^<div' . SIMPLEPIE_PCRE_XML_ATTRIBUTE . '>/', '', $data);
- $data = preg_replace('/<\/div>$/', '', $data);
- }
- else
- {
- $data = preg_replace('/^<div' . SIMPLEPIE_PCRE_XML_ATTRIBUTE . '>/', '<div>', $data);
- }
- }
-
- if ($type & (SIMPLEPIE_CONSTRUCT_HTML | SIMPLEPIE_CONSTRUCT_XHTML))
- {
- // Strip comments
- if ($this->strip_comments)
- {
- $data = SimplePie_Misc::strip_comments($data);
- }
-
- // Strip out HTML tags and attributes that might cause various security problems.
- // Based on recommendations by Mark Pilgrim at:
- // http://diveintomark.org/archives/2003/06/12/how_to_consume_rss_safely
- if ($this->strip_htmltags)
- {
- foreach ($this->strip_htmltags as $tag)
- {
- $pcre = "/<($tag)" . SIMPLEPIE_PCRE_HTML_ATTRIBUTE . "(>(.*)<\/$tag" . SIMPLEPIE_PCRE_HTML_ATTRIBUTE . '>|(\/)?>)/siU';
- while (preg_match($pcre, $data))
- {
- $data = preg_replace_callback($pcre, array(&$this, 'do_strip_htmltags'), $data);
- }
- }
- }
-
- if ($this->strip_attributes)
- {
- foreach ($this->strip_attributes as $attrib)
- {
- $data = preg_replace('/(<[A-Za-z][^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3E]*)' . SIMPLEPIE_PCRE_HTML_ATTRIBUTE . trim($attrib) . '(?:\s*=\s*(?:"(?:[^"]*)"|\'(?:[^\']*)\'|(?:[^\x09\x0A\x0B\x0C\x0D\x20\x22\x27\x3E][^\x09\x0A\x0B\x0C\x0D\x20\x3E]*)?))?' . SIMPLEPIE_PCRE_HTML_ATTRIBUTE . '>/', '\1\2\3>', $data);
- }
- }
-
- // Replace relative URLs
- $this->base = $base;
- foreach ($this->replace_url_attributes as $element => $attributes)
- {
- $data = $this->replace_urls($data, $element, $attributes);
- }
-
- // If image handling (caching, etc.) is enabled, cache and rewrite all the image tags.
- if (isset($this->image_handler) && ((string) $this->image_handler) !== '' && $this->enable_cache)
- {
- $images = SimplePie_Misc::get_element('img', $data);
- foreach ($images as $img)
- {
- if (isset($img['attribs']['src']['data']))
- {
- $image_url = call_user_func($this->cache_name_function, $img['attribs']['src']['data']);
- $cache = call_user_func(array($this->cache_class, 'create'), $this->cache_location, $image_url, 'spi');
-
- if ($cache->load())
- {
- $img['attribs']['src']['data'] = $this->image_handler . $image_url;
- $data = str_replace($img['full'], SimplePie_Misc::element_implode($img), $data);
- }
- else
- {
- $file = new $this->file_class($img['attribs']['src']['data'], $this->timeout, 5, array('X-FORWARDED-FOR' => $_SERVER['REMOTE_ADDR']), $this->useragent, $this->force_fsockopen);
- $headers = $file->headers;
-
- if ($file->success && ($file->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($file->status_code === 200 || $file->status_code > 206 && $file->status_code < 300)))
- {
- if ($cache->save(array('headers' => $file->headers, 'body' => $file->body)))
- {
- $img['attribs']['src']['data'] = $this->image_handler . $image_url;
- $data = str_replace($img['full'], SimplePie_Misc::element_implode($img), $data);
- }
- else
- {
- trigger_error("$this->cache_location is not writeable. Make sure you've set the correct relative or absolute path, and that the location is server-writable.", E_USER_WARNING);
- }
- }
- }
- }
- }
- }
-
- // Having (possibly) taken stuff out, there may now be whitespace at the beginning/end of the data
- $data = trim($data);
- }
-
- if ($type & SIMPLEPIE_CONSTRUCT_IRI)
- {
- $data = SimplePie_Misc::absolutize_url($data, $base);
- }
-
- if ($type & (SIMPLEPIE_CONSTRUCT_TEXT | SIMPLEPIE_CONSTRUCT_IRI))
- {
- $data = htmlspecialchars($data, ENT_COMPAT, 'UTF-8');
- }
-
- if ($this->output_encoding !== 'UTF-8')
- {
- $data = SimplePie_Misc::change_encoding($data, 'UTF-8', $this->output_encoding);
- }
- }
- return $data;
- }
-
- function replace_urls($data, $tag, $attributes)
- {
- if (!is_array($this->strip_htmltags) || !in_array($tag, $this->strip_htmltags))
- {
- $elements = SimplePie_Misc::get_element($tag, $data);
- foreach ($elements as $element)
- {
- if (is_array($attributes))
- {
- foreach ($attributes as $attribute)
- {
- if (isset($element['attribs'][$attribute]['data']))
- {
- $element['attribs'][$attribute]['data'] = SimplePie_Misc::absolutize_url($element['attribs'][$attribute]['data'], $this->base);
- $new_element = SimplePie_Misc::element_implode($element);
- $data = str_replace($element['full'], $new_element, $data);
- $element['full'] = $new_element;
- }
- }
- }
- elseif (isset($element['attribs'][$attributes]['data']))
- {
- $element['attribs'][$attributes]['data'] = SimplePie_Misc::absolutize_url($element['attribs'][$attributes]['data'], $this->base);
- $data = str_replace($element['full'], SimplePie_Misc::element_implode($element), $data);
- }
- }
- }
- return $data;
- }
-
- function do_strip_htmltags($match)
- {
- if ($this->encode_instead_of_strip)
- {
- if (isset($match[4]) && !in_array(strtolower($match[1]), array('script', 'style')))
- {
- $match[1] = htmlspecialchars($match[1], ENT_COMPAT, 'UTF-8');
- $match[2] = htmlspecialchars($match[2], ENT_COMPAT, 'UTF-8');
- return "&lt;$match[1]$match[2]&gt;$match[3]&lt;/$match[1]&gt;";
- }
- else
- {
- return htmlspecialchars($match[0], ENT_COMPAT, 'UTF-8');
- }
- }
- elseif (isset($match[4]) && !in_array(strtolower($match[1]), array('script', 'style')))
- {
- return $match[4];
- }
- else
- {
- return '';
- }
- }
-}
-
-?>
diff --git a/tests/phpunit-mariadb.xml b/tests/phpunit-mariadb.xml
new file mode 120000
index 000000000..63656b78b
--- /dev/null
+++ b/tests/phpunit-mariadb.xml
@@ -0,0 +1 @@
+phpunit-mysql.xml \ No newline at end of file
diff --git a/tests/phpunit-mysql.xml b/tests/phpunit-mysql.xml
new file mode 100644
index 000000000..171211094
--- /dev/null
+++ b/tests/phpunit-mysql.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/6.0/phpunit.xsd"
+ bootstrap="../boot.php"
+ forceCoversAnnotation="false"
+ beStrictAboutCoversAnnotation="true"
+ beStrictAboutOutputDuringTests="true"
+ beStrictAboutTodoAnnotatedTests="true"
+ verbose="true">
+ <testsuite name="Hubzilla default Test Suite">
+ <directory suffix="Test.php">./unit/</directory>
+ </testsuite>
+ <testsuite name="API Test Suite">
+ <directory suffix="Test.php" prefix="API">./unit/</directory>
+ </testsuite>
+ <testsuite name="Ex-/Import Test Suite">
+ <directory suffix="Test.php">./unit/eximport/</directory>
+ </testsuite>
+ <groups>
+ <exclude>
+ <group>postgresql</group>
+ </exclude>
+ </groups>
+ <!--cover reporting-->
+ <filter>
+ <whitelist processUncoveredFilesFromWhitelist="true">
+ <directory suffix=".php">../Zotlabs/</directory>
+ <directory suffix=".php">../include/</directory>
+ </whitelist>
+ </filter>
+ <logging>
+ <log type="junit" target="./results/junit.xml" logIncompleteSkipped="false"/>
+ <log type="coverage-clover" target="./results/coverage-clover.xml"/>
+ <log type="coverage-html" target="./results/coverage-report/" lowUpperBound="35"
+ highLowerBound="70"/>
+ </logging>
+</phpunit>
diff --git a/tests/phpunit-pgsql.xml b/tests/phpunit-pgsql.xml
new file mode 100644
index 000000000..ace14e196
--- /dev/null
+++ b/tests/phpunit-pgsql.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/6.0/phpunit.xsd"
+ bootstrap="../boot.php"
+ forceCoversAnnotation="false"
+ beStrictAboutCoversAnnotation="true"
+ beStrictAboutOutputDuringTests="true"
+ beStrictAboutTodoAnnotatedTests="true"
+ verbose="true">
+ <testsuite name="Hubzilla default Test Suite">
+ <directory suffix="Test.php">./unit/</directory>
+ </testsuite>
+ <testsuite name="API Test Suite">
+ <directory suffix="Test.php" prefix="API">./unit/</directory>
+ </testsuite>
+ <groups>
+ <exclude>
+ <group>mysql</group>
+ </exclude>
+ </groups>
+ <!--cover reporting-->
+ <filter>
+ <whitelist processUncoveredFilesFromWhitelist="true">
+ <directory suffix=".php">../Zotlabs/</directory>
+ <directory suffix=".php">../include/</directory>
+ </whitelist>
+ </filter>
+ <logging>
+ <log type="junit" target="./results/junit.xml" logIncompleteSkipped="false"/>
+ <log type="coverage-clover" target="./results/coverage-clover.xml"/>
+ <log type="coverage-html" target="./results/coverage-report/" lowUpperBound="35"
+ highLowerBound="70"/>
+ </logging>
+</phpunit>
diff --git a/tests/travis/gen_apidocs.sh b/tests/travis/gen_apidocs.sh
new file mode 100755
index 000000000..e5938e1e8
--- /dev/null
+++ b/tests/travis/gen_apidocs.sh
@@ -0,0 +1,69 @@
+#!/usr/bin/env bash
+
+#
+# Copyright (c) 2016 Hubzilla
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+#
+
+# Exit if anything fails
+set -e
+
+# Only create and deploy API documentation once, on first build job.
+# Waiting for upcoming 'Build Stages' Q1/Q2 2017 to make this cleaner.
+# https://github.com/travis-ci/travis-ci/issues/929
+if [[ "$TRAVIS_JOB_NUMBER" != "${TRAVIS_BUILD_NUMBER}.1" ]]; then
+ echo "Not the first build job. Creating API documentation only once is enough."
+ echo "We are finished ..."
+ exit
+fi
+
+echo "Doxygen version >= 1.8 is required"
+doxygen --version
+
+# Check if newer version of Doxygen should be used
+if [ ! -z "$DOXY_VER" ]; then
+ export DOXY_BINPATH=$HOME/doxygen/doxygen-$DOXY_VER/bin
+ if [ ! -e "$DOXY_BINPATH/doxygen" ]; then
+ echo "Installing newer Doxygen $DOXY_VER ..."
+ mkdir -p $HOME/doxygen && cd $HOME/doxygen
+ wget -O - http://ftp.stack.nl/pub/users/dimitri/doxygen-$DOXY_VER.linux.bin.tar.gz | tar xz
+ export PATH=$DOXY_BINPATH:$PATH
+ fi
+ echo "Doxygen version"
+ doxygen --version
+fi
+
+echo "Generating Doxygen API documentation ..."
+cd $TRAVIS_BUILD_DIR
+mkdir -p ./doc/html
+# Redirect stderr and stdout to log file and console to be able to review documentation errors
+doxygen $DOXYFILE 2>&1 | tee ./doc/html/doxygen.log
+
+# Check if Doxygen successfully created the documentation
+if [ -d "doc/html" ] && [ -f "doc/html/index.html" ]; then
+ echo "API documentation generated"
+ if [ -n "${TRAVIS_TAG}" ]; then
+ echo "Generate API documentation archive for release deployment ..."
+ zip -9 -r -q doc/hubzilla-api-documentation.zip doc/html/
+ fi
+else
+ echo "No API documentation files have been found" >&2
+ exit 1
+fi
diff --git a/tests/travis/prepare.sh b/tests/travis/prepare.sh
new file mode 100755
index 000000000..267b4ec46
--- /dev/null
+++ b/tests/travis/prepare.sh
@@ -0,0 +1,35 @@
+#!/usr/bin/env bash
+
+#
+# Copyright (c) 2016 Hubzilla
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+#
+
+# Exit if anything fails
+set -e
+
+# gd is required, show some info about the used one
+php -r "var_dump(gd_info());"
+
+
+echo "Creating required folders for Hubzilla ..."
+mkdir -p ./store/\[data\]/smarty3
+
+echo "TODO: create .htconfig"
diff --git a/tests/travis/prepare_mysql.sh b/tests/travis/prepare_mysql.sh
new file mode 100755
index 000000000..b3d84253c
--- /dev/null
+++ b/tests/travis/prepare_mysql.sh
@@ -0,0 +1,48 @@
+#!/usr/bin/env bash
+
+#
+# Copyright (c) 2016 Hubzilla
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+#
+
+# Exit if anything fails
+set -e
+
+echo "Preparing for MySQL ..."
+
+# Print out some MySQL information
+mysql --version
+mysql -e "SELECT VERSION();"
+mysql -e "SHOW VARIABLES LIKE 'max_allowed_packet';"
+mysql -e "SHOW VARIABLES LIKE 'collation_%';"
+mysql -e "SHOW VARIABLES LIKE 'character_set%';"
+mysql -e "SELECT @@sql_mode;"
+
+# Create Hubzilla database
+mysql -u root -e "CREATE DATABASE IF NOT EXISTS hubzilla;";
+mysql -u root -e "CREATE USER 'hubzilla'@'localhost' IDENTIFIED BY 'hubzilla';"
+mysql -u root -e "GRANT ALL ON hubzilla.* TO 'hubzilla'@'localhost';"
+
+# Import table structure
+mysql -u root hubzilla < ./install/schema_mysql.sql
+
+# Show databases and tables
+mysql -u root -e "SHOW DATABASES;"
+mysql -u root -e "USE hubzilla; SHOW TABLES;"
diff --git a/tests/travis/prepare_pgsql.sh b/tests/travis/prepare_pgsql.sh
new file mode 100755
index 000000000..63c7388cb
--- /dev/null
+++ b/tests/travis/prepare_pgsql.sh
@@ -0,0 +1,44 @@
+#!/usr/bin/env bash
+
+#
+# Copyright (c) 2016 Hubzilla
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+#
+
+# Exit if anything fails
+set -e
+
+echo "Preparing for PostgreSQL ..."
+
+# Print out some PostgreSQL information
+psql --version
+# Why does this hang further execution of the job?
+psql -U postgres -c "SELECT VERSION();"
+
+# Create Hubzilla database
+psql -U postgres -c "DROP DATABASE IF EXISTS hubzilla;"
+psql -U postgres -c "CREATE DATABASE hubzilla;"
+
+# Import table structure
+psql -U postgres -v ON_ERROR_STOP=1 hubzilla < ./install/schema_postgres.sql
+
+# Show databases and tables
+psql -U postgres -l
+psql -U postgres -d hubzilla -c "\dt;"
diff --git a/tests/unit/Access/AccessListTest.php b/tests/unit/Access/AccessListTest.php
new file mode 100644
index 000000000..3dbe5cd65
--- /dev/null
+++ b/tests/unit/Access/AccessListTest.php
@@ -0,0 +1,189 @@
+<?php
+/*
+ * Copyright (c) 2017 Hubzilla
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+namespace Zotlabs\Tests\Unit\Access;
+
+use Zotlabs\Tests\Unit\UnitTestCase;
+use Zotlabs\Access\AccessList;
+
+/**
+ * @brief Unit Test case for AccessList class.
+ *
+ * @covers Zotlabs\Access\AccessList
+ */
+class AccessListTest extends UnitTestCase {
+
+ /**
+ * @brief Expected result for most tests.
+ * @var array
+ */
+ protected $expectedResult = [
+ 'allow_cid' => '<acid><acid2>',
+ 'allow_gid' => '<agid>',
+ 'deny_cid' => '',
+ 'deny_gid' => '<dgid><dgid2>'
+ ];
+
+
+
+ public function testConstructor() {
+ $channel = [
+ 'channel_allow_cid' => '<acid><acid2>',
+ 'channel_allow_gid' => '<agid>',
+ 'channel_deny_cid' => '',
+ 'channel_deny_gid' => '<dgid><dgid2>'
+ ];
+
+ $accessList = new AccessList($channel);
+
+ $this->assertEquals($this->expectedResult, $accessList->get());
+ $this->assertFalse($accessList->get_explicit());
+ }
+
+ /**
+ * @expectedException PHPUnit\Framework\Error\Error
+ */
+ public function testPHPErrorOnInvalidConstructor() {
+ $accessList = new AccessList('invalid');
+ // Causes: "Illegal string offset 'channel_allow_cid'"
+ }
+
+ public function testDefaultGetExplicit() {
+ $accessList = new AccessList([]);
+
+ $this->assertFalse($accessList->get_explicit());
+ }
+
+ public function testDefaultGet() {
+ $arr = [
+ 'allow_cid' => '',
+ 'allow_gid' => '',
+ 'deny_cid' => '',
+ 'deny_gid' => ''
+ ];
+
+ $accessList = new AccessList([]);
+
+ $this->assertEquals($arr, $accessList->get());
+ }
+
+ public function testSet() {
+ $arr = [
+ 'allow_cid' => '<acid><acid2>',
+ 'allow_gid' => '<agid>',
+ 'deny_cid' => '',
+ 'deny_gid' => '<dgid><dgid2>'
+ ];
+ $accessList = new AccessList([]);
+
+ // default explicit true
+ $accessList->set($arr);
+
+ $this->assertEquals($this->expectedResult, $accessList->get());
+ $this->assertTrue($accessList->get_explicit());
+
+ // set explicit false
+ $accessList->set($arr, false);
+
+ $this->assertEquals($this->expectedResult, $accessList->get());
+ $this->assertFalse($accessList->get_explicit());
+ }
+
+ /**
+ * @expectedException PHPUnit\Framework\Error\Error
+ */
+ public function testPHPErrorOnInvalidSet() {
+ $accessList = new AccessList([]);
+
+ $accessList->set('invalid');
+ // Causes: "Illegal string offset 'allow_cid'"
+ }
+
+ /**
+ * set_from_array() calls some other functions, too which are not yet unit tested.
+ * @uses ::perms2str()
+ */
+ public function testSetFromArray() {
+ // array
+ $arraySetFromArray = [
+ 'contact_allow' => ['acid', 'acid2'],
+ 'group_allow' => ['agid'],
+ 'contact_deny' => [],
+ 'group_deny' => ['dgid', 'dgid2']
+ ];
+ $accessList = new AccessList([]);
+ $accessList->set_from_array($arraySetFromArray);
+
+ $this->assertEquals($this->expectedResult, $accessList->get());
+ $this->assertTrue($accessList->get_explicit());
+
+
+ // string
+ $stringSetFromArray = [
+ 'contact_allow' => 'acid,acid2',
+ 'group_allow' => 'agid',
+ 'contact_deny' => '',
+ 'group_deny' => 'dgid, dgid2'
+ ];
+ $accessList2 = new AccessList([]);
+ $accessList2->set_from_array($stringSetFromArray, false);
+
+ $this->assertEquals($this->expectedResult, $accessList2->get());
+ $this->assertFalse($accessList2->get_explicit());
+ }
+
+ /**
+ * @dataProvider isprivateProvider
+ */
+ public function testIsPrivate($channel) {
+ $accessListPublic = new AccessList([]);
+ $this->assertFalse($accessListPublic->is_private());
+
+ $accessListPrivate = new AccessList($channel);
+ $this->assertTrue($accessListPrivate->is_private());
+ }
+
+ public function isprivateProvider() {
+ return [
+ 'all set' => [[
+ 'channel_allow_cid' => '<acid>',
+ 'channel_allow_gid' => '<agid>',
+ 'channel_deny_cid' => '<dcid>',
+ 'channel_deny_gid' => '<dgid>'
+ ]],
+ 'only one set' => [[
+ 'channel_allow_cid' => '<acid>',
+ 'channel_allow_gid' => '',
+ 'channel_deny_cid' => '',
+ 'channel_deny_gid' => ''
+ ]],
+ 'acid+null' => [[
+ 'channel_allow_cid' => '<acid>',
+ 'channel_allow_gid' => null,
+ 'channel_deny_cid' => '',
+ 'channel_deny_gid' => ''
+ ]]
+ ];
+ }
+
+} \ No newline at end of file
diff --git a/tests/unit/Lib/PermissionDescriptionTest.php b/tests/unit/Lib/PermissionDescriptionTest.php
index b1da5a0fd..96c381d0c 100644
--- a/tests/unit/Lib/PermissionDescriptionTest.php
+++ b/tests/unit/Lib/PermissionDescriptionTest.php
@@ -1,6 +1,6 @@
<?php
/*
- * Copyright (c) 2016 Hubzilla
+ * Copyright (c) 2016-2017 Hubzilla
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -21,90 +21,77 @@
* SOFTWARE.
*/
-// Global namespace for fully qualified \App class.
-namespace {
- // General channel permissions in boot.php
- // 0 = Only you
- define ( 'PERMS_PUBLIC' , 0x0001 ); // anybody
- define ( 'PERMS_NETWORK' , 0x0002 ); // anybody in this network
- define ( 'PERMS_SITE' , 0x0004 ); // anybody on this site
- define ( 'PERMS_CONTACTS' , 0x0008 ); // any of my connections
- define ( 'PERMS_SPECIFIC' , 0x0080 ); // only specific connections
- define ( 'PERMS_AUTHED' , 0x0100 ); // anybody authenticated (could include visitors from other networks)
- define ( 'PERMS_PENDING' , 0x0200 ); // any connections including those who haven't yet been approved
- // log levels in boot.php
- define ( 'LOGGER_DEBUG', 2 );
+namespace Zotlabs\Tests\Unit\Lib;
- // Stub global fully qualified \App class for static function calls
- class App {
- // Stub get_hostname()
- public static function get_hostname() {
- return 'phpunit';
- }
- }
-}
+use phpmock\phpunit\PHPMock;
+use Zotlabs\Tests\Unit\UnitTestCase;
+use Zotlabs\Lib\PermissionDescription;
-// Stub global functions used in PermissionDescription with the help of
-// PHP's namespace resolution rules.
-namespace Zotlabs\Lib {
- // Stub global translate function t()
- function t($s) {
- return $s;
- }
- // Stub global log function logger()
- function logger($msg, $level = LOGGER_NORMAL, $priority = LOG_INFO) {
- // doesn't matter
- }
-}
+/**
+ * @brief Unit Test case for PermissionDescription class.
+ *
+ * @covers Zotlabs\Lib\PermissionDescription
+ */
+class PermissionDescriptionTest extends UnitTestCase {
-// regular namespace for this unit test
-namespace Zotlabs\Tests\Unit\Lib {
+ use PHPMock;
- use Zotlabs\Tests\Unit\UnitTestCase;
- use Zotlabs\Lib\PermissionDescription;
+ public function testFromDescription() {
+ $permDesc = PermissionDescription::fromDescription('test');
+ $permDesc2 = PermissionDescription::fromDescription('test');
+ $permDesc3 = PermissionDescription::fromDescription('test2');
- /**
- * @brief Unit Test case for ConnectionPool class.
- */
- class PermissionDescriptionTest extends UnitTestCase {
+ $this->assertEquals($permDesc, $permDesc2);
+ $this->assertNotEquals($permDesc, $permDesc3);
+ }
- public function testFromDescription() {
- $permDesc = PermissionDescription::fromDescription('test');
- $permDesc2 = PermissionDescription::fromDescription('test');
- $permDesc3 = PermissionDescription::fromDescription('test2');
+ public function testFromStandalonePermission() {
+ // Create a stub for global function t()
+ $t = $this->getFunctionMock('Zotlabs\Lib', 't');
+ $t->expects($this->atLeastOnce())->willReturnCallback(
+ function ($string) {
+ return $string;
+ }
+ );
+ // Create a mock for global function logger()
+ $this->getFunctionMock('Zotlabs\Lib', 'logger');
- $this->assertEquals($permDesc, $permDesc2);
- $this->assertNotEquals($permDesc, $permDesc3);
- }
+ $permDescUnknown = PermissionDescription::fromStandalonePermission(-1);
+ $permDescSelf = PermissionDescription::fromStandalonePermission(0);
- public function testFromStandalonePermission() {
- $permDescUnknown = PermissionDescription::fromStandalonePermission(-1);
- $permDescSelf = PermissionDescription::fromStandalonePermission(0);
+ $this->assertNull($permDescUnknown);
+ $this->assertNotNull($permDescSelf);
+ }
- $this->assertNull($permDescUnknown);
- $this->assertNotNull($permDescSelf);
- }
+ public function testFromGlobalPermission() {
+ //$permDesc = PermissionDescription::fromGlobalPermission('view_profile');
- public function testFromGlobalPermission() {
- //$permDesc = PermissionDescription::fromGlobalPermission('view_profile');
+ $this->markTestIncomplete(
+ 'The method fromGlobalPermission() is not yet testable ...'
+ );
+ }
- $this->markTestIncomplete(
- 'For this test we need more stubs...'
- );
- }
+ public function testGetPermissionDescription() {
+ // Create a stub for global function t()
+ $t = $this->getFunctionMock('Zotlabs\Lib', 't');
+ $t->expects($this->atLeastOnce())->willReturnCallback(
+ function ($string) {
+ return $string;
+ }
+ );
+ // Create a mock for global function logger()
+ $this->getFunctionMock('Zotlabs\Lib', 'logger');
- public function testGetPermissionDescription() {
+ // Create a stub for the PermissionDescription class
+ $stub = $this->createMock(PermissionDescription::class);
+ $stub->method('get_permission_description')
+ ->will($this->returnArgument(0));
- // fromStandalonePermission uses get_permission_description(), so that will not help
- //$permDescSelf = PermissionDescription::fromStandalonePermission(0);
- //$permDescPublic = PermissionDescription::fromStandalonePermission(PERMS_PUBLIC);
+ $permDescSelf = PermissionDescription::fromStandalonePermission(0);
+ $this->assertInstanceOf(PermissionDescription::class, $permDescSelf);
+ $this->assertEquals($permDescSelf->get_permission_description(), 'Only me');
- $this->markTestIncomplete(
- 'For this test we need a mock of PermissionDescription...'
- );
- //$permDescSelf =
- //$this->assertEquals($permDescSelf->, 'Only me');
- //$this->assertEquals($permDescPublic, 'Public');
- }
+ $permDescPublic = PermissionDescription::fromStandalonePermission(PERMS_PUBLIC);
+ $this->assertEquals($permDescPublic->get_permission_description(), 'Public');
}
}
diff --git a/tests/unit/TextTest.php b/tests/unit/TextTest.php
deleted file mode 100644
index 48c04bc54..000000000
--- a/tests/unit/TextTest.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-/**
- * this file contains tests for text.php
- *
- * @package test.util
- */
-
-use PHPUnit\Framework\TestCase;
-
-/** required, it is the file under test */
-require_once('include/text.php');
-
-/**
- * TestCase for the texter
- *
- * @author ken restivo
- * @package test.util
- */
-class TextTest extends TestCase {
- public function testGoodEmail() {
- $this->assertTrue(valid_email_regex('ken@spaz.org'));
- }
- public function testGoodEmail2() {
- $this->assertTrue(valid_email_regex('ken@restivo.org'));
- }
- public function testGoodEmail3() {
- $this->assertTrue(valid_email_regex('nobody@hubzilla.com'));
- }
- public function testBadEmail() {
- $this->assertFalse(valid_email_regex('nobody!uses!these!any.more'));
- }
-
-} \ No newline at end of file
diff --git a/tests/unit/includes/FeedutilsText.php b/tests/unit/includes/FeedutilsText.php
new file mode 100644
index 000000000..932a1b3a1
--- /dev/null
+++ b/tests/unit/includes/FeedutilsText.php
@@ -0,0 +1,55 @@
+<?php
+
+namespace Zotlabs\Tests\Unit\includes;
+
+use Zotlabs\Tests\Unit\UnitTestCase;
+
+/**
+ * @brief Unit Test case for include/feedutils.php file.
+ */
+class FeedutilsTest extends UnitTestCase {
+
+ public function test_normalise_id() {
+ $this->assertEquals('id', normalise_id('id'));
+ $this->assertEquals('id', normalise_id('X-ZOT:id'));
+ $this->assertEquals('id id2', normalise_id('X-ZOT:id X-ZOT:id2'));
+ $this->assertEmpty(normalise_id(''));
+ }
+
+ public function test_encode_rel_links() {
+ // invalid params return empty array
+ $this->assertEquals([], encode_rel_links('string'));
+ $this->assertEquals([], encode_rel_links([]));
+
+ $b = ['attribs' => ['' => [
+ 'rel' => 'rel_value',
+ 'type' => 'type_value',
+ 'href' => 'href_value'
+ ]]];
+ $blink1 = ['link1' => $b];
+ $bresult[] = $b['attribs'][''];
+ $this->assertEquals($bresult, encode_rel_links($blink1));
+ }
+
+/* public function test_encode_rel_links_fail() {
+ $a = [ 'key' => 'value'];
+ $this->assertFalse(encode_rel_links($a));
+ //Illegal string offset 'attribs'
+ }*/
+
+ public function test_atom_author() {
+ $this->assertEquals('', atom_author('', 'nick', 'name', 'uri', 72, 72, 'png', 'photourl'));
+
+ $a = '<tag>
+ <id>uri</id>
+ <name>nick</name>
+ <uri>uri</uri>
+ <link rel="photo" type="png" media:width="72" media:height="72" href="http://photourl" />
+ <link rel="avatar" type="png" media:width="72" media:height="72" href="http://photourl" />
+ <poco:preferredUsername>nick</poco:preferredUsername>
+ <poco:displayName>name<poco:displayName>
+</tag>';
+
+ $this->assertXmlStringEqualsXmlString($a, atom_author('tag', 'nick', 'name', 'uri', 72, 72, 'png', 'http://photourl'));
+ }
+}
diff --git a/tests/unit/includes/TextTest.php b/tests/unit/includes/TextTest.php
new file mode 100644
index 000000000..e2c7cbb9a
--- /dev/null
+++ b/tests/unit/includes/TextTest.php
@@ -0,0 +1,84 @@
+<?php
+
+namespace Zotlabs\Tests\Unit\includes;
+
+use Zotlabs\Tests\Unit\UnitTestCase;
+
+/**
+ * @brief Unit Test case for include/texter.php file.
+ *
+ * @author ken restivo
+ */
+class TextTest extends UnitTestCase {
+
+ public function testGoodEmail() {
+ $this->assertTrue(valid_email_regex('ken@spaz.org'));
+ $this->assertTrue(valid_email_regex('ken@restivo.org'));
+ $this->assertTrue(valid_email_regex('nobody@hubzilla.org'));
+ $this->assertTrue(valid_email_regex('foo+nobody@hubzilla.org'));
+ }
+
+ public function testBadEmail() {
+ $this->assertFalse(valid_email_regex('nobody!uses!these!any.more'));
+ $this->assertFalse(valid_email_regex('foo@bar@hubzilla.org'));
+ }
+
+ public function testPurifyHTML() {
+ // linebreaks
+ $htmlbr = 'first line<br />
+ one tab preserved
+
+empty line above';
+ $this->assertEquals($htmlbr, purify_html($htmlbr));
+
+ // HTML5 is not supported by HTMLPurifier yet, test our own configuration
+ $html5elements = '<section>section<nav>navigation</nav><article>main<a href="http://hubzilla.org/">hubzilla.org</a></article></section><footer>footer</footer>';
+ $this->assertEquals($html5elements, purify_html($html5elements));
+ $this->assertEquals('<button>button label</button>', purify_html('<button>button label</button>'));
+
+ // unsupported HTML5 elements
+ $this->assertEquals('Your HTML parser does not support HTML5 video.', purify_html('<video controls><source src="movie.ogg" type="video/ogg">Your HTML parser does not support HTML5 video.</video>'));
+ $this->assertEquals('Your HTML parser does not support HTML5 audio.', purify_html('<audio controls><source src="movie.ogg" "type="audio/ogg">Your HTML parser does not support HTML5 audio.</audio>'));
+
+ // preserve f6 and bootstrap additional data attributes from our own configuration
+ $this->assertEquals('<div data-title="title">text</div>', purify_html('<div data-title="title">text</div>'));
+ $this->assertEquals('<ul data-accordion-menu=""><li>item1</li></ul>', purify_html('<ul data-accordion-menu><li>item1</li></ul>'));
+ $this->assertEquals('<ul><li>item1</li></ul>', purify_html('<ul data-accordion-menu-unknown><li>item1</li></ul>'));
+ }
+
+ public function testPurifyHTML_html() {
+ $this->assertEquals('<div id="id01"><p class="class01">ids und classes</p></div>', purify_html('<div id="id01"><p class="class01">ids und classes</p></div>'));
+ $this->assertEquals('<div><p>close missing tags</p></div>', purify_html('<div><p>close missing tags'));
+ $this->assertEquals('<center>deprecated tag</center>', purify_html('<center>deprecated tag</center>'));
+ $this->assertEquals('<span></span><div>illegal nesting</div>', purify_html('<span><div>illegal nesting</div></span>'));
+ $this->assertEquals('<a href="#">link with target</a>', purify_html('<a href="#" target="_blank">link with target</a>'));
+ $this->assertEquals('<a href="#">link with rel="nofollow"</a>', purify_html('<a href="#" rel="nofollow">link with rel="nofollow"</a>'));
+ $this->assertEquals('a b', purify_html('a&nbsp;b'));
+ $this->assertEquals('ä ä € €', purify_html('ä &auml; &euro; &#8364;'));
+ $this->assertEquals('<img src="picture.png" alt="text" />', purify_html('<img src="picture.png" alt="text">'));
+ $this->assertEquals('', purify_html('<iframe width="560" height="315" src="https://www.youtube.com/embed/kiNGx5oL7hk" frameborder="0" allowfullscreen></iframe>'));
+ }
+
+ public function testPurifyHTML_js() {
+ $this->assertEquals('<div></div>', purify_html('<div><img src="javascript:evil();" onload="evil();"></div>'));
+ $this->assertEquals('<a href="#">link</a>', purify_html('<a href="#" onclick="alert(\'xss\')">link</a>'));
+ $this->assertEquals('', purify_html('<IMG SRC="javascript:alert(&#039;XSS&#039;);">'));
+ $this->assertEquals('', purify_html('<script>alter("42")</script>'));
+ }
+
+ public function testPurifyHTML_css() {
+ $this->assertEquals('<p style="color:#FF0000;background-color:#fff;">red</p>', purify_html('<p style="color:red; background-color:#fff">red</p>'));
+ $this->assertEquals('<p>invalid color</p>', purify_html('<p style="color:invalid; background-color:#jjkkmm">invalid color</p>'));
+ $this->assertEquals('<p>invalid style</p>', purify_html('<p style="foo:bar">invalid style</p>'));
+
+ // test our own CSS configuration
+ $this->assertEquals('<div>position removed</div>', purify_html('<div style="position:absolut">position removed</div>'));
+ $this->assertEquals('<div style="position:fixed;">position preserved</div>', purify_html('<div style="position:fixed">position preserved</div>', true));
+ $this->assertEquals('<div>invalid position removed</div>', purify_html('<div style="position:invalid">invalid position removed</div>', true));
+
+ $this->assertEquals('<div>position removed</div>', purify_html('<div style="top:10px; left:3em;">position removed</div>'));
+ $this->assertEquals('<div style="top:10px;left:3em;right:50%;">position preserved</div>', purify_html('<div style="top:10px; left:3em; right:50%;">position preserved</div>', true));
+ $this->assertEquals('<div>invalid position removed</div>', purify_html('<div style="top:10p">invalid position removed</div>', true));
+ }
+
+}
diff --git a/tests/unit/template_test.php b/tests/unit/template_test.php
index 1f9f80531..dfaecb4a1 100644
--- a/tests/unit/template_test.php
+++ b/tests/unit/template_test.php
@@ -25,12 +25,6 @@ function x($s,$k = NULL) {
}
}
-if(!function_exists('get_app')) {
-function get_app() {
- return new TemplateMockApp();
-}
-}
-
/**
* TestCase for the template engine
*
diff --git a/util/Doxyfile b/util/Doxyfile
index f6c0692ee..7be774a81 100644
--- a/util/Doxyfile
+++ b/util/Doxyfile
@@ -23,3 +23,15 @@ ALIASES += "TODO=\todo"
ALIASES += "BUG=\bug"
ALIASES += "hooks=\xrefitem hooks \"Hooks\" \"Hooks List\""
ALIASES += "HOOKS=\hooks"
+# Output
+QUIET = YES
+WARNINGS = YES
+# Dot tool config
+HAVE_DOT = YES
+DOT_IMAGE_FORMAT = svg
+INTERACTIVE_SVG = YES
+CLASS_GRAPH = YES
+COLLABORATION_GRAPH = NO
+# fix @var (https://bugzilla.gnome.org/show_bug.cgi?id=626105)
+#INPUT_FILTER = "sed -e 's/@var\s/@see /'"
+INPUT_FILTER = "php util/Doxygen_phpvarfilter.php"
diff --git a/util/Doxygen_phpvarfilter.php b/util/Doxygen_phpvarfilter.php
new file mode 100644
index 000000000..da6cf1666
--- /dev/null
+++ b/util/Doxygen_phpvarfilter.php
@@ -0,0 +1,18 @@
+<?php
+/**
+ * @file Doxygen_phpvarfilter.php
+ * @brief A Doxygen INPUT_FILTER to parse \@var member variable documentation.
+ *
+ * An input filter for Doxygen to parse \@var class member variable documentation,
+ * so it is a bit more compatible how anybody else interpretes it.
+ *
+ * @see http://stackoverflow.com/questions/4325224/doxygen-how-to-describe-class-member-variables-in-php/8472180#8472180
+ */
+
+$source = file_get_contents($argv[1]);
+
+$regexp = '#\@var\s+([^\s]+)([^/]+)/\s+(var|public|protected|private)\s+(\$[^\s;=]+)#';
+$replac = '${2} */ ${3} ${1} ${4}';
+$source = preg_replace($regexp, $replac, $source);
+
+echo $source;
diff --git a/util/db_update.php b/util/db_update.php
index ceef061c1..8fc7c7616 100644
--- a/util/db_update.php
+++ b/util/db_update.php
@@ -9,6 +9,7 @@ require_once('boot.php');
require_once('include/cli_startup.php');
cli_startup();
+$build = get_config('system','db_version');
echo "Old DB VERSION: " . $build . "\n";
echo "New DB VERSION: " . DB_UPDATE_VERSION . "\n";
@@ -16,7 +17,7 @@ echo "New DB VERSION: " . DB_UPDATE_VERSION . "\n";
if($build != DB_UPDATE_VERSION) {
echo "Updating database...";
- check_config($a);
+ check_config();
echo "Done\n";
}
diff --git a/util/fresh b/util/fresh
index 7f57931aa..0482d1215 100755
--- a/util/fresh
+++ b/util/fresh
@@ -44,8 +44,6 @@ fresh_main($argc,$argv);
function process_command($line) {
- $a = get_app();
-
// split args
App::$cmd = $line;
diff --git a/util/hmessages.po b/util/hmessages.po
index 867d1f1ce..1a9559509 100644
--- a/util/hmessages.po
+++ b/util/hmessages.po
@@ -6,9 +6,9 @@
#, fuzzy
msgid ""
msgstr ""
-"Project-Id-Version: 2.1\n"
+"Project-Id-Version: 2.3.5\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-02-17 00:05-0800\n"
+"POT-Creation-Date: 2017-05-01 15:36+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,2022 +17,2104 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+#: ../../Zotlabs/Access/Permissions.php:46
+msgid "Can view my channel stream and posts"
+msgstr ""
+
+#: ../../Zotlabs/Access/Permissions.php:47 ../../include/permissions.php:42
+msgid "Can send me their channel stream and posts"
+msgstr ""
+
+#: ../../Zotlabs/Access/Permissions.php:48 ../../include/permissions.php:36
+msgid "Can view my default channel profile"
+msgstr ""
+
+#: ../../Zotlabs/Access/Permissions.php:49 ../../include/permissions.php:37
+msgid "Can view my connections"
+msgstr ""
+
+#: ../../Zotlabs/Access/Permissions.php:50 ../../include/permissions.php:38
+msgid "Can view my file storage and photos"
+msgstr ""
+
+#: ../../Zotlabs/Access/Permissions.php:51
+msgid "Can upload/modify my file storage and photos"
+msgstr ""
+
+#: ../../Zotlabs/Access/Permissions.php:52
+msgid "Can view my channel webpages"
+msgstr ""
+
+#: ../../Zotlabs/Access/Permissions.php:53
+msgid "Can view my wiki pages"
+msgstr ""
+
+#: ../../Zotlabs/Access/Permissions.php:54
+msgid "Can create/edit my channel webpages"
+msgstr ""
+
+#: ../../Zotlabs/Access/Permissions.php:55
+msgid "Can write to my wiki pages"
+msgstr ""
+
+#: ../../Zotlabs/Access/Permissions.php:56
+msgid "Can post on my channel (wall) page"
+msgstr ""
+
+#: ../../Zotlabs/Access/Permissions.php:57 ../../include/permissions.php:44
+msgid "Can comment on or like my posts"
+msgstr ""
+
+#: ../../Zotlabs/Access/Permissions.php:58 ../../include/permissions.php:45
+msgid "Can send me private mail messages"
+msgstr ""
+
+#: ../../Zotlabs/Access/Permissions.php:59
+msgid "Can like/dislike profiles and profile things"
+msgstr ""
+
+#: ../../Zotlabs/Access/Permissions.php:60
+msgid "Can forward to all my channel connections via @+ mentions in posts"
+msgstr ""
+
+#: ../../Zotlabs/Access/Permissions.php:61
+msgid "Can chat with me"
+msgstr ""
+
+#: ../../Zotlabs/Access/Permissions.php:62 ../../include/permissions.php:53
+msgid "Can source my public posts in derived channels"
+msgstr ""
+
+#: ../../Zotlabs/Access/Permissions.php:63
+msgid "Can administer my channel"
+msgstr ""
+
#: ../../Zotlabs/Access/PermissionRoles.php:248
-#: ../../include/permissions.php:945
+#: ../../include/permissions.php:946
msgid "Social Networking"
msgstr ""
#: ../../Zotlabs/Access/PermissionRoles.php:249
-#: ../../include/permissions.php:945
+#: ../../include/permissions.php:946
msgid "Social - Mostly Public"
msgstr ""
#: ../../Zotlabs/Access/PermissionRoles.php:250
-#: ../../include/permissions.php:945
+#: ../../include/permissions.php:946
msgid "Social - Restricted"
msgstr ""
#: ../../Zotlabs/Access/PermissionRoles.php:251
-#: ../../include/permissions.php:945
+#: ../../include/permissions.php:946
msgid "Social - Private"
msgstr ""
#: ../../Zotlabs/Access/PermissionRoles.php:254
-#: ../../include/permissions.php:946
+#: ../../include/permissions.php:947
msgid "Community Forum"
msgstr ""
#: ../../Zotlabs/Access/PermissionRoles.php:255
-#: ../../include/permissions.php:946
+#: ../../include/permissions.php:947
msgid "Forum - Mostly Public"
msgstr ""
#: ../../Zotlabs/Access/PermissionRoles.php:256
-#: ../../include/permissions.php:946
+#: ../../include/permissions.php:947
msgid "Forum - Restricted"
msgstr ""
#: ../../Zotlabs/Access/PermissionRoles.php:257
-#: ../../include/permissions.php:946
+#: ../../include/permissions.php:947
msgid "Forum - Private"
msgstr ""
#: ../../Zotlabs/Access/PermissionRoles.php:260
-#: ../../include/permissions.php:947
+#: ../../include/permissions.php:948
msgid "Feed Republish"
msgstr ""
#: ../../Zotlabs/Access/PermissionRoles.php:261
-#: ../../include/permissions.php:947
+#: ../../include/permissions.php:948
msgid "Feed - Mostly Public"
msgstr ""
#: ../../Zotlabs/Access/PermissionRoles.php:262
-#: ../../include/permissions.php:947
+#: ../../include/permissions.php:948
msgid "Feed - Restricted"
msgstr ""
#: ../../Zotlabs/Access/PermissionRoles.php:265
-#: ../../include/permissions.php:948
+#: ../../include/permissions.php:949
msgid "Special Purpose"
msgstr ""
#: ../../Zotlabs/Access/PermissionRoles.php:266
-#: ../../include/permissions.php:948
+#: ../../include/permissions.php:949
msgid "Special - Celebrity/Soapbox"
msgstr ""
#: ../../Zotlabs/Access/PermissionRoles.php:267
-#: ../../include/permissions.php:948
+#: ../../include/permissions.php:949
msgid "Special - Group Repository"
msgstr ""
#: ../../Zotlabs/Access/PermissionRoles.php:270
-#: ../../Zotlabs/Module/Register.php:213 ../../Zotlabs/Module/Connedit.php:879
#: ../../Zotlabs/Module/New_channel.php:132
#: ../../Zotlabs/Module/Settings/Channel.php:463
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1148
-#: ../../extend/addon/addon/cdav/cdav.php:277
-#: ../../extend/addon/addon/cdav/cdav.php:284 ../../include/selectors.php:49
-#: ../../include/selectors.php:66 ../../include/selectors.php:104
-#: ../../include/selectors.php:140 ../../include/connections.php:901
-#: ../../include/connections.php:908 ../../include/permissions.php:949
+#: ../../Zotlabs/Module/Connedit.php:914 ../../Zotlabs/Module/Profiles.php:798
+#: ../../Zotlabs/Module/Register.php:213 ../../addon/cdav/Mod_Cdav.php:1148
+#: ../../addon/cdav/cdav.php:277 ../../addon/cdav/cdav.php:284
+#: ../../include/selectors.php:49 ../../include/selectors.php:66
+#: ../../include/selectors.php:104 ../../include/selectors.php:140
+#: ../../include/permissions.php:950 ../../include/connections.php:675
+#: ../../include/connections.php:682
msgid "Other"
msgstr ""
#: ../../Zotlabs/Access/PermissionRoles.php:271
-#: ../../include/permissions.php:949
+#: ../../include/permissions.php:950
msgid "Custom/Expert Mode"
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:46
-msgid "Can view my channel stream and posts"
+#: ../../Zotlabs/Module/Blocks.php:33 ../../Zotlabs/Module/Editlayout.php:31
+#: ../../Zotlabs/Module/Connect.php:17 ../../Zotlabs/Module/Achievements.php:15
+#: ../../Zotlabs/Module/Hcard.php:12 ../../Zotlabs/Module/Editblock.php:31
+#: ../../Zotlabs/Module/Profile.php:20 ../../Zotlabs/Module/Layouts.php:31
+#: ../../Zotlabs/Module/Editwebpage.php:32 ../../Zotlabs/Module/Webpages.php:33
+#: ../../Zotlabs/Module/Filestorage.php:59 ../../include/channel.php:945
+msgid "Requested profile is not available."
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:47 ../../include/permissions.php:42
-msgid "Can send me their channel stream and posts"
+#: ../../Zotlabs/Module/Blocks.php:73 ../../Zotlabs/Module/Blocks.php:80
+#: ../../Zotlabs/Module/Invite.php:17 ../../Zotlabs/Module/Invite.php:94
+#: ../../Zotlabs/Module/Editlayout.php:67
+#: ../../Zotlabs/Module/Editlayout.php:90 ../../Zotlabs/Module/Channel.php:115
+#: ../../Zotlabs/Module/Channel.php:245 ../../Zotlabs/Module/Channel.php:285
+#: ../../Zotlabs/Module/Settings.php:59 ../../Zotlabs/Module/Locs.php:87
+#: ../../Zotlabs/Module/Mitem.php:115 ../../Zotlabs/Module/Events.php:271
+#: ../../Zotlabs/Module/Appman.php:82 ../../Zotlabs/Module/Regmod.php:21
+#: ../../Zotlabs/Module/New_channel.php:77
+#: ../../Zotlabs/Module/New_channel.php:104
+#: ../../Zotlabs/Module/Sharedwithme.php:11 ../../Zotlabs/Module/Setup.php:212
+#: ../../Zotlabs/Module/Achievements.php:34 ../../Zotlabs/Module/Thing.php:274
+#: ../../Zotlabs/Module/Thing.php:294 ../../Zotlabs/Module/Thing.php:335
+#: ../../Zotlabs/Module/Api.php:24 ../../Zotlabs/Module/Editblock.php:67
+#: ../../Zotlabs/Module/Profile.php:83 ../../Zotlabs/Module/Profile.php:100
+#: ../../Zotlabs/Module/Mood.php:116 ../../Zotlabs/Module/Connections.php:29
+#: ../../Zotlabs/Module/Viewsrc.php:19 ../../Zotlabs/Module/Bookmarks.php:61
+#: ../../Zotlabs/Module/Photos.php:69 ../../Zotlabs/Module/Wiki.php:50
+#: ../../Zotlabs/Module/Wiki.php:216 ../../Zotlabs/Module/Wiki.php:315
+#: ../../Zotlabs/Module/Pdledit.php:29 ../../Zotlabs/Module/Poke.php:137
+#: ../../Zotlabs/Module/Profile_photo.php:280
+#: ../../Zotlabs/Module/Profile_photo.php:293
+#: ../../Zotlabs/Module/Authtest.php:16 ../../Zotlabs/Module/Item.php:221
+#: ../../Zotlabs/Module/Item.php:231 ../../Zotlabs/Module/Item.php:1038
+#: ../../Zotlabs/Module/Page.php:35 ../../Zotlabs/Module/Page.php:91
+#: ../../Zotlabs/Module/Connedit.php:385 ../../Zotlabs/Module/Chat.php:98
+#: ../../Zotlabs/Module/Chat.php:103 ../../Zotlabs/Module/Menu.php:78
+#: ../../Zotlabs/Module/Layouts.php:71 ../../Zotlabs/Module/Layouts.php:78
+#: ../../Zotlabs/Module/Layouts.php:89 ../../Zotlabs/Module/Group.php:13
+#: ../../Zotlabs/Module/Profiles.php:198 ../../Zotlabs/Module/Profiles.php:635
+#: ../../Zotlabs/Module/Editwebpage.php:68
+#: ../../Zotlabs/Module/Editwebpage.php:89
+#: ../../Zotlabs/Module/Editwebpage.php:107
+#: ../../Zotlabs/Module/Editwebpage.php:121 ../../Zotlabs/Module/Manage.php:10
+#: ../../Zotlabs/Module/Webpages.php:116 ../../Zotlabs/Module/Block.php:26
+#: ../../Zotlabs/Module/Block.php:76 ../../Zotlabs/Module/Editpost.php:17
+#: ../../Zotlabs/Module/Sources.php:74 ../../Zotlabs/Module/Like.php:181
+#: ../../Zotlabs/Module/Suggest.php:28 ../../Zotlabs/Module/Message.php:18
+#: ../../Zotlabs/Module/Mail.php:164 ../../Zotlabs/Module/Register.php:77
+#: ../../Zotlabs/Module/Cover_photo.php:281
+#: ../../Zotlabs/Module/Cover_photo.php:294 ../../Zotlabs/Module/Network.php:15
+#: ../../Zotlabs/Module/Filestorage.php:23
+#: ../../Zotlabs/Module/Filestorage.php:78
+#: ../../Zotlabs/Module/Filestorage.php:93
+#: ../../Zotlabs/Module/Filestorage.php:120 ../../Zotlabs/Module/Common.php:39
+#: ../../Zotlabs/Module/Viewconnections.php:28
+#: ../../Zotlabs/Module/Viewconnections.php:33
+#: ../../Zotlabs/Module/Service_limits.php:11 ../../Zotlabs/Module/Rate.php:113
+#: ../../Zotlabs/Module/Notifications.php:11 ../../Zotlabs/Lib/Chatroom.php:137
+#: ../../Zotlabs/Web/WebServer.php:131 ../../addon/keepout/keepout.php:36
+#: ../../addon/openid/Mod_Id.php:53 ../../addon/gitwiki/Mod_Gitwiki.php:196
+#: ../../addon/gitwiki/Mod_Gitwiki.php:292
+#: ../../addon/diaspora_reconnect/diaspora_reconnect.php:58
+#: ../../addon/pumpio/pumpio.php:40 ../../include/attach.php:144
+#: ../../include/attach.php:191 ../../include/attach.php:255
+#: ../../include/attach.php:269 ../../include/attach.php:276
+#: ../../include/attach.php:344 ../../include/attach.php:358
+#: ../../include/attach.php:365 ../../include/attach.php:442
+#: ../../include/attach.php:909 ../../include/attach.php:983
+#: ../../include/attach.php:1148 ../../include/items.php:3470
+#: ../../include/photos.php:27
+msgid "Permission denied."
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:48 ../../include/permissions.php:36
-msgid "Can view my default channel profile"
+#: ../../Zotlabs/Module/Blocks.php:97 ../../Zotlabs/Module/Blocks.php:155
+#: ../../Zotlabs/Module/Editblock.php:113
+msgid "Block Name"
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:49 ../../include/permissions.php:37
-msgid "Can view my connections"
+#: ../../Zotlabs/Module/Blocks.php:154 ../../include/text.php:2267
+msgid "Blocks"
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:50 ../../include/permissions.php:38
-msgid "Can view my file storage and photos"
+#: ../../Zotlabs/Module/Blocks.php:156
+msgid "Block Title"
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:51
-msgid "Can upload/modify my file storage and photos"
+#: ../../Zotlabs/Module/Blocks.php:157 ../../Zotlabs/Module/Menu.php:114
+#: ../../Zotlabs/Module/Layouts.php:191 ../../Zotlabs/Module/Webpages.php:256
+#: ../../include/page_widgets.php:47
+msgid "Created"
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:52
-msgid "Can view my channel webpages"
+#: ../../Zotlabs/Module/Blocks.php:158 ../../Zotlabs/Module/Menu.php:115
+#: ../../Zotlabs/Module/Layouts.php:192 ../../Zotlabs/Module/Webpages.php:257
+#: ../../include/page_widgets.php:48
+msgid "Edited"
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:53
-msgid "Can view my wiki pages"
+#: ../../Zotlabs/Module/Blocks.php:159 ../../Zotlabs/Module/New_channel.php:147
+#: ../../Zotlabs/Module/Connedit.php:917 ../../Zotlabs/Module/Menu.php:118
+#: ../../Zotlabs/Module/Layouts.php:185 ../../Zotlabs/Module/Profiles.php:801
+#: ../../Zotlabs/Module/Webpages.php:244 ../../Zotlabs/Storage/Browser.php:228
+#: ../../Zotlabs/Storage/Browser.php:332 ../../addon/cdav/Mod_Cdav.php:1151
+#: ../../addon/cdav/include/widgets.php:127
+#: ../../addon/cdav/include/widgets.php:164
+msgid "Create"
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:54
-msgid "Can create/edit my channel webpages"
+#: ../../Zotlabs/Module/Blocks.php:160 ../../Zotlabs/Module/Editlayout.php:114
+#: ../../Zotlabs/Module/Admin/Profs.php:154
+#: ../../Zotlabs/Module/Settings/Oauth.php:149
+#: ../../Zotlabs/Module/Thing.php:260 ../../Zotlabs/Module/Editblock.php:114
+#: ../../Zotlabs/Module/Connections.php:296
+#: ../../Zotlabs/Module/Connections.php:316 ../../Zotlabs/Module/Wiki.php:165
+#: ../../Zotlabs/Module/Wiki.php:275 ../../Zotlabs/Module/Menu.php:112
+#: ../../Zotlabs/Module/Layouts.php:193
+#: ../../Zotlabs/Module/Editwebpage.php:142
+#: ../../Zotlabs/Module/Webpages.php:245 ../../Zotlabs/Module/Editpost.php:80
+#: ../../Zotlabs/Lib/Apps.php:367 ../../Zotlabs/Lib/ThreadItem.php:107
+#: ../../Zotlabs/Storage/Browser.php:238
+#: ../../addon/cdav/include/widgets.php:125
+#: ../../addon/cdav/include/widgets.php:161
+#: ../../addon/gitwiki/Mod_Gitwiki.php:151
+#: ../../addon/gitwiki/Mod_Gitwiki.php:252 ../../include/channel.php:1044
+#: ../../include/channel.php:1048 ../../include/menu.php:113
+#: ../../include/page_widgets.php:9 ../../include/page_widgets.php:39
+msgid "Edit"
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:55
-msgid "Can write to my wiki pages"
+#: ../../Zotlabs/Module/Blocks.php:161 ../../Zotlabs/Module/Photos.php:1042
+#: ../../Zotlabs/Module/Layouts.php:194 ../../Zotlabs/Module/Webpages.php:246
+#: ../../addon/cdav/include/widgets.php:123 ../../include/conversation.php:1311
+msgid "Share"
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:56
-msgid "Can post on my channel (wall) page"
+#: ../../Zotlabs/Module/Blocks.php:162 ../../Zotlabs/Module/Editlayout.php:138
+#: ../../Zotlabs/Module/Admin/Accounts.php:173
+#: ../../Zotlabs/Module/Admin/Channels.php:149
+#: ../../Zotlabs/Module/Admin/Profs.php:155
+#: ../../Zotlabs/Module/Settings/Oauth.php:150
+#: ../../Zotlabs/Module/Thing.php:261 ../../Zotlabs/Module/Editblock.php:139
+#: ../../Zotlabs/Module/Connections.php:267
+#: ../../Zotlabs/Module/Photos.php:1143 ../../Zotlabs/Module/Connedit.php:650
+#: ../../Zotlabs/Module/Connedit.php:919 ../../Zotlabs/Module/Group.php:177
+#: ../../Zotlabs/Module/Profiles.php:803
+#: ../../Zotlabs/Module/Editwebpage.php:167
+#: ../../Zotlabs/Module/Webpages.php:247 ../../Zotlabs/Lib/Apps.php:368
+#: ../../Zotlabs/Lib/ThreadItem.php:127 ../../Zotlabs/Storage/Browser.php:239
+#: ../../addon/cdav/Mod_Cdav.php:864 ../../addon/cdav/Mod_Cdav.php:1153
+#: ../../include/conversation.php:654
+msgid "Delete"
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:57 ../../include/permissions.php:44
-msgid "Can comment on or like my posts"
+#: ../../Zotlabs/Module/Blocks.php:166 ../../Zotlabs/Module/Events.php:694
+#: ../../Zotlabs/Module/Wiki.php:167 ../../Zotlabs/Module/Layouts.php:198
+#: ../../Zotlabs/Module/Webpages.php:251 ../../Zotlabs/Module/Pubsites.php:59
+#: ../../addon/gitwiki/Mod_Gitwiki.php:153 ../../include/page_widgets.php:42
+msgid "View"
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:58 ../../include/permissions.php:45
-msgid "Can send me private mail messages"
+#: ../../Zotlabs/Module/Invite.php:29
+msgid "Total invitation limit exceeded."
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:59
-msgid "Can like/dislike profiles and profile things"
+#: ../../Zotlabs/Module/Invite.php:53
+#, php-format
+msgid "%s : Not a valid email address."
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:60
-msgid "Can forward to all my channel connections via @+ mentions in posts"
+#: ../../Zotlabs/Module/Invite.php:67
+msgid "Please join us on $Projectname"
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:61
-msgid "Can chat with me"
+#: ../../Zotlabs/Module/Invite.php:77
+msgid "Invitation limit exceeded. Please contact your site administrator."
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:62 ../../include/permissions.php:53
-msgid "Can source my public posts in derived channels"
+#: ../../Zotlabs/Module/Invite.php:82
+#, php-format
+msgid "%s : Message delivery failed."
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:63
-msgid "Can administer my channel"
-msgstr ""
+#: ../../Zotlabs/Module/Invite.php:86
+#, php-format
+msgid "%d message sent."
+msgid_plural "%d messages sent."
+msgstr[0] ""
+msgstr[1] ""
-#: ../../Zotlabs/Storage/Browser.php:106 ../../Zotlabs/Storage/Browser.php:237
-msgid "parent"
+#: ../../Zotlabs/Module/Invite.php:105
+msgid "You have no more invitations available"
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:130 ../../include/text.php:2695
-msgid "Collection"
+#: ../../Zotlabs/Module/Invite.php:136
+msgid "Send invitations"
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:133
-msgid "Principal"
+#: ../../Zotlabs/Module/Invite.php:137
+msgid "Enter email addresses, one per line:"
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:136
-msgid "Addressbook"
+#: ../../Zotlabs/Module/Invite.php:138 ../../Zotlabs/Module/Mail.php:303
+msgid "Your message:"
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:139
-msgid "Calendar"
+#: ../../Zotlabs/Module/Invite.php:139
+msgid "Please join my community on $Projectname."
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:142
-msgid "Schedule Inbox"
+#: ../../Zotlabs/Module/Invite.php:141
+msgid "You will need to supply this invitation code:"
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:145
-msgid "Schedule Outbox"
+#: ../../Zotlabs/Module/Invite.php:142
+msgid "1. Register at any $Projectname location (they are all inter-connected)"
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:163 ../../Zotlabs/Module/Photos.php:784
-#: ../../Zotlabs/Module/Photos.php:1244
-#: ../../Zotlabs/Module/Embedphotos.php:145 ../../Zotlabs/Lib/Apps.php:559
-#: ../../Zotlabs/Lib/Apps.php:637
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:745
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:746
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:753
-#: ../../include/conversation.php:1177 ../../include/widgets.php:1714
-msgid "Unknown"
+#: ../../Zotlabs/Module/Invite.php:144
+msgid "2. Enter my $Projectname network address into the site searchbar."
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:224 ../../Zotlabs/Module/Fbrowser.php:85
-#: ../../Zotlabs/Lib/Apps.php:224 ../../include/conversation.php:1843
-msgid "Files"
+#: ../../Zotlabs/Module/Invite.php:145
+msgid "or visit"
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:225
-msgid "Total"
+#: ../../Zotlabs/Module/Invite.php:147
+msgid "3. Click [Connect]"
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:227
-msgid "Shared"
+#: ../../Zotlabs/Module/Invite.php:149 ../../Zotlabs/Module/Locs.php:121
+#: ../../Zotlabs/Module/Mitem.php:243 ../../Zotlabs/Module/Events.php:493
+#: ../../Zotlabs/Module/Appman.php:134
+#: ../../Zotlabs/Module/Import_items.php:129 ../../Zotlabs/Module/Setup.php:309
+#: ../../Zotlabs/Module/Setup.php:357 ../../Zotlabs/Module/Connect.php:98
+#: ../../Zotlabs/Module/Admin/Features.php:66
+#: ../../Zotlabs/Module/Admin/Plugins.php:438
+#: ../../Zotlabs/Module/Admin/Accounts.php:166
+#: ../../Zotlabs/Module/Admin/Logs.php:84
+#: ../../Zotlabs/Module/Admin/Channels.php:147
+#: ../../Zotlabs/Module/Admin/Themes.php:158
+#: ../../Zotlabs/Module/Admin/Site.php:279
+#: ../../Zotlabs/Module/Admin/Profs.php:157
+#: ../../Zotlabs/Module/Admin/Account_edit.php:74
+#: ../../Zotlabs/Module/Admin/Security.php:104
+#: ../../Zotlabs/Module/Settings/Permcats.php:110
+#: ../../Zotlabs/Module/Settings/Channel.php:476
+#: ../../Zotlabs/Module/Settings/Features.php:47
+#: ../../Zotlabs/Module/Settings/Tokens.php:168
+#: ../../Zotlabs/Module/Settings/Account.php:118
+#: ../../Zotlabs/Module/Settings/Featured.php:50
+#: ../../Zotlabs/Module/Settings/Display.php:203
+#: ../../Zotlabs/Module/Settings/Oauth.php:87
+#: ../../Zotlabs/Module/Thing.php:320 ../../Zotlabs/Module/Thing.php:370
+#: ../../Zotlabs/Module/Import.php:514 ../../Zotlabs/Module/Cal.php:343
+#: ../../Zotlabs/Module/Mood.php:139 ../../Zotlabs/Module/Photos.php:657
+#: ../../Zotlabs/Module/Photos.php:1022 ../../Zotlabs/Module/Photos.php:1062
+#: ../../Zotlabs/Module/Photos.php:1180 ../../Zotlabs/Module/Wiki.php:169
+#: ../../Zotlabs/Module/Pdledit.php:74 ../../Zotlabs/Module/Poke.php:186
+#: ../../Zotlabs/Module/Connedit.php:882 ../../Zotlabs/Module/Chat.php:194
+#: ../../Zotlabs/Module/Chat.php:240 ../../Zotlabs/Module/Pconfig.php:107
+#: ../../Zotlabs/Module/Group.php:85 ../../Zotlabs/Module/Profiles.php:726
+#: ../../Zotlabs/Module/Sources.php:114 ../../Zotlabs/Module/Sources.php:149
+#: ../../Zotlabs/Module/Xchan.php:15 ../../Zotlabs/Module/Mail.php:449
+#: ../../Zotlabs/Module/Filestorage.php:165 ../../Zotlabs/Module/Rate.php:166
+#: ../../Zotlabs/Lib/ThreadItem.php:732 ../../Zotlabs/Widget/Eventstools.php:16
+#: ../../view/theme/redbasic/php/config.php:84
+#: ../../addon/skeleton/skeleton.php:65 ../../addon/gnusoc/gnusoc.php:134
+#: ../../addon/cdav/cdav.php:246 ../../addon/planets/planets.php:157
+#: ../../addon/openclipatar/openclipatar.php:53
+#: ../../addon/wppost/wppost.php:113 ../../addon/nsfw/nsfw.php:92
+#: ../../addon/ijpost/ijpost.php:89 ../../addon/dwpost/dwpost.php:89
+#: ../../addon/mailhost/mailhost.php:40
+#: ../../addon/likebanner/likebanner.php:57
+#: ../../addon/redphotos/redphotos.php:136 ../../addon/irc/irc.php:53
+#: ../../addon/ljpost/ljpost.php:86 ../../addon/startpage/startpage.php:113
+#: ../../addon/diaspora/diaspora.php:712
+#: ../../addon/gitwiki/Mod_Gitwiki.php:155
+#: ../../addon/rainbowtag/rainbowtag.php:85 ../../addon/visage/visage.php:170
+#: ../../addon/nsabait/nsabait.php:161 ../../addon/mailtest/mailtest.php:100
+#: ../../addon/openstreetmap/openstreetmap.php:168
+#: ../../addon/rtof/rtof.php:101 ../../addon/jappixmini/jappixmini.php:371
+#: ../../addon/superblock/superblock.php:120 ../../addon/nofed/nofed.php:80
+#: ../../addon/redred/redred.php:119 ../../addon/logrot/logrot.php:35
+#: ../../addon/frphotos/frphotos.php:96 ../../addon/chords/Mod_Chords.php:60
+#: ../../addon/libertree/libertree.php:85
+#: ../../addon/flattrwidget/flattrwidget.php:124
+#: ../../addon/statusnet/statusnet.php:322
+#: ../../addon/statusnet/statusnet.php:380
+#: ../../addon/statusnet/statusnet.php:432
+#: ../../addon/statusnet/statusnet.php:899 ../../addon/twitter/twitter.php:217
+#: ../../addon/twitter/twitter.php:259
+#: ../../addon/smileybutton/smileybutton.php:281 ../../addon/piwik/piwik.php:95
+#: ../../addon/pageheader/pageheader.php:48 ../../addon/xmpp/xmpp.php:69
+#: ../../addon/pumpio/pumpio.php:237 ../../addon/redfiles/redfiles.php:124
+#: ../../addon/hubwall/hubwall.php:95 ../../include/js_strings.php:22
+msgid "Submit"
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:228 ../../Zotlabs/Storage/Browser.php:321
-#: ../../Zotlabs/Module/Menu.php:118 ../../Zotlabs/Module/Connedit.php:882
-#: ../../Zotlabs/Module/New_channel.php:147
-#: ../../Zotlabs/Module/Blocks.php:159 ../../Zotlabs/Module/Layouts.php:184
-#: ../../Zotlabs/Module/Webpages.php:243
-#: ../../extend/addon/addon/cdav/include/widgets.php:127
-#: ../../extend/addon/addon/cdav/include/widgets.php:164
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1151
-msgid "Create"
+#: ../../Zotlabs/Module/Editlayout.php:79 ../../Zotlabs/Module/Editblock.php:79
+#: ../../Zotlabs/Module/Editblock.php:95
+#: ../../Zotlabs/Module/Editwebpage.php:80 ../../Zotlabs/Module/Editpost.php:24
+msgid "Item not found"
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:229 ../../Zotlabs/Storage/Browser.php:323
-#: ../../Zotlabs/Module/Photos.php:811 ../../Zotlabs/Module/Photos.php:1368
-#: ../../Zotlabs/Module/Cover_photo.php:357
-#: ../../Zotlabs/Module/Profile_photo.php:412
-#: ../../Zotlabs/Module/Embedphotos.php:157
-#: ../../extend/addon/addon/cdav/include/widgets.php:132
-#: ../../extend/addon/addon/cdav/include/widgets.php:168
-#: ../../include/widgets.php:1727
-msgid "Upload"
+#: ../../Zotlabs/Module/Editlayout.php:128 ../../Zotlabs/Module/Layouts.php:129
+#: ../../Zotlabs/Module/Layouts.php:189
+msgid "Layout Name"
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:233
-#: ../../Zotlabs/Module/Admin/Channels.php:159
-#: ../../Zotlabs/Module/Connedit.php:867
-#: ../../Zotlabs/Module/Sharedwithme.php:99 ../../Zotlabs/Module/Wiki.php:170
-#: ../../Zotlabs/Module/Settings/Oauth.php:89
-#: ../../Zotlabs/Module/Settings/Oauth.php:115
-#: ../../Zotlabs/Module/Chat.php:250
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1136
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:172
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:156
-#: ../../include/widgets.php:990
-msgid "Name"
+#: ../../Zotlabs/Module/Editlayout.php:129 ../../Zotlabs/Module/Layouts.php:132
+msgid "Layout Description (Optional)"
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:234 ../../Zotlabs/Module/Wiki.php:171
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:157
-msgid "Type"
+#: ../../Zotlabs/Module/Editlayout.php:137
+msgid "Edit Layout"
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:235
-#: ../../Zotlabs/Module/Sharedwithme.php:101 ../../include/text.php:1408
-msgid "Size"
+#: ../../Zotlabs/Module/Profperm.php:28 ../../Zotlabs/Module/Subthread.php:62
+#: ../../Zotlabs/Module/Import_items.php:120 ../../Zotlabs/Module/Group.php:72
+#: ../../Zotlabs/Module/Dreport.php:10 ../../Zotlabs/Module/Dreport.php:68
+#: ../../Zotlabs/Module/Like.php:283 ../../Zotlabs/Web/WebServer.php:130
+#: ../../addon/redphotos/redphotos.php:119 ../../addon/frphotos/frphotos.php:81
+#: ../../addon/redfiles/redfiles.php:109 ../../include/items.php:327
+msgid "Permission denied"
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:236
-#: ../../Zotlabs/Module/Sharedwithme.php:102
-msgid "Last Modified"
+#: ../../Zotlabs/Module/Profperm.php:34 ../../Zotlabs/Module/Profperm.php:63
+msgid "Invalid profile identifier."
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:238 ../../Zotlabs/Module/Editpost.php:85
-#: ../../Zotlabs/Module/Editblock.php:109
-#: ../../Zotlabs/Module/Connections.php:300
-#: ../../Zotlabs/Module/Connections.php:320
-#: ../../Zotlabs/Module/Admin/Profs.php:154
-#: ../../Zotlabs/Module/Editlayout.php:114
-#: ../../Zotlabs/Module/Editwebpage.php:145 ../../Zotlabs/Module/Menu.php:112
-#: ../../Zotlabs/Module/Blocks.php:160 ../../Zotlabs/Module/Layouts.php:192
-#: ../../Zotlabs/Module/Webpages.php:244 ../../Zotlabs/Module/Wiki.php:163
-#: ../../Zotlabs/Module/Wiki.php:273
-#: ../../Zotlabs/Module/Settings/Oauth.php:149
-#: ../../Zotlabs/Module/Thing.php:260 ../../Zotlabs/Lib/ThreadItem.php:106
-#: ../../Zotlabs/Lib/Apps.php:357
-#: ../../extend/addon/addon/cdav/include/widgets.php:125
-#: ../../extend/addon/addon/cdav/include/widgets.php:161
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:149
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:251
-#: ../../include/menu.php:113 ../../include/channel.php:1044
-#: ../../include/channel.php:1048 ../../include/page_widgets.php:9
-#: ../../include/page_widgets.php:39
-msgid "Edit"
+#: ../../Zotlabs/Module/Profperm.php:111
+msgid "Profile Visibility Editor"
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:239 ../../Zotlabs/Module/Photos.php:1174
-#: ../../Zotlabs/Module/Editblock.php:134
-#: ../../Zotlabs/Module/Connections.php:271
-#: ../../Zotlabs/Module/Admin/Profs.php:155
-#: ../../Zotlabs/Module/Admin/Accounts.php:173
-#: ../../Zotlabs/Module/Admin/Channels.php:149
-#: ../../Zotlabs/Module/Editlayout.php:137
-#: ../../Zotlabs/Module/Editwebpage.php:170
-#: ../../Zotlabs/Module/Connedit.php:626 ../../Zotlabs/Module/Connedit.php:884
-#: ../../Zotlabs/Module/Group.php:177 ../../Zotlabs/Module/Blocks.php:162
-#: ../../Zotlabs/Module/Webpages.php:246
-#: ../../Zotlabs/Module/Settings/Oauth.php:150
-#: ../../Zotlabs/Module/Thing.php:261 ../../Zotlabs/Lib/ThreadItem.php:126
-#: ../../Zotlabs/Lib/Apps.php:358
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:864
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1153
-#: ../../include/conversation.php:656
-msgid "Delete"
+#: ../../Zotlabs/Module/Profperm.php:113 ../../include/channel.php:1362
+msgid "Profile"
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:299
-#, php-format
-msgid "You are using %1$s of your available file storage."
+#: ../../Zotlabs/Module/Profperm.php:115
+msgid "Click on a contact to add or remove."
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:304
-#, php-format
-msgid "You are using %1$s of %2$s available file storage. (%3$s&#37;)"
+#: ../../Zotlabs/Module/Profperm.php:124
+msgid "Visible To"
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:315
-msgid "WARNING:"
+#: ../../Zotlabs/Module/Profperm.php:140
+#: ../../Zotlabs/Module/Connections.php:141
+msgid "All Connections"
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:320
-msgid "Create new folder"
+#: ../../Zotlabs/Module/Regdir.php:49 ../../Zotlabs/Module/Dirsearch.php:25
+msgid "This site is not a directory server"
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:322
-msgid "Upload file"
+#: ../../Zotlabs/Module/Channel.php:32 ../../Zotlabs/Module/Chat.php:25
+#: ../../addon/gitwiki/Mod_Gitwiki.php:28 ../../addon/chess/chess.php:403
+msgid "You must be logged in to see this page."
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:335
-msgid "Drop files here to immediately upload"
+#: ../../Zotlabs/Module/Channel.php:47 ../../Zotlabs/Module/Hcard.php:35
+#: ../../Zotlabs/Module/Profile.php:43
+msgid "Posts and comments"
msgstr ""
-#: ../../Zotlabs/Web/WebServer.php:127 ../../Zotlabs/Module/Like.php:283
-#: ../../Zotlabs/Module/Group.php:72 ../../Zotlabs/Module/Dreport.php:10
-#: ../../Zotlabs/Module/Dreport.php:68
-#: ../../Zotlabs/Module/Import_items.php:114
-#: ../../Zotlabs/Module/Profperm.php:28 ../../Zotlabs/Module/Subthread.php:62
-#: ../../extend/addon/addon/frphotos/frphotos.php:81
-#: ../../extend/addon/addon/redfiles/redfiles.php:109
-#: ../../extend/addon/addon/redphotos/redphotos.php:119
-#: ../../include/items.php:327
-msgid "Permission denied"
+#: ../../Zotlabs/Module/Channel.php:54 ../../Zotlabs/Module/Hcard.php:42
+#: ../../Zotlabs/Module/Profile.php:50
+msgid "Only posts"
msgstr ""
-#: ../../Zotlabs/Web/WebServer.php:128 ../../Zotlabs/Web/Router.php:67
-#: ../../Zotlabs/Module/Achievements.php:34
-#: ../../Zotlabs/Module/Register.php:77 ../../Zotlabs/Module/Photos.php:73
-#: ../../Zotlabs/Module/Editpost.php:17 ../../Zotlabs/Module/Authtest.php:16
-#: ../../Zotlabs/Module/Bookmarks.php:61 ../../Zotlabs/Module/Editblock.php:67
-#: ../../Zotlabs/Module/Page.php:35 ../../Zotlabs/Module/Page.php:91
-#: ../../Zotlabs/Module/Connections.php:33
-#: ../../Zotlabs/Module/Cover_photo.php:277
-#: ../../Zotlabs/Module/Cover_photo.php:290
-#: ../../Zotlabs/Module/Editlayout.php:67
-#: ../../Zotlabs/Module/Editlayout.php:90
-#: ../../Zotlabs/Module/Editwebpage.php:68
-#: ../../Zotlabs/Module/Editwebpage.php:89
-#: ../../Zotlabs/Module/Editwebpage.php:104
-#: ../../Zotlabs/Module/Editwebpage.php:126 ../../Zotlabs/Module/Like.php:181
-#: ../../Zotlabs/Module/Network.php:15 ../../Zotlabs/Module/Menu.php:78
-#: ../../Zotlabs/Module/Locs.php:87 ../../Zotlabs/Module/Connedit.php:388
-#: ../../Zotlabs/Module/Filestorage.php:23
-#: ../../Zotlabs/Module/Filestorage.php:78
-#: ../../Zotlabs/Module/Filestorage.php:93
-#: ../../Zotlabs/Module/Filestorage.php:120
-#: ../../Zotlabs/Module/Settings.php:59 ../../Zotlabs/Module/Group.php:13
-#: ../../Zotlabs/Module/Block.php:26 ../../Zotlabs/Module/Block.php:76
-#: ../../Zotlabs/Module/Manage.php:10 ../../Zotlabs/Module/Mitem.php:115
-#: ../../Zotlabs/Module/Appman.php:81 ../../Zotlabs/Module/Mood.php:116
-#: ../../Zotlabs/Module/Profiles.php:198 ../../Zotlabs/Module/Profiles.php:636
-#: ../../Zotlabs/Module/Api.php:24 ../../Zotlabs/Module/Invite.php:17
-#: ../../Zotlabs/Module/Invite.php:94 ../../Zotlabs/Module/New_channel.php:77
-#: ../../Zotlabs/Module/New_channel.php:104 ../../Zotlabs/Module/Setup.php:212
-#: ../../Zotlabs/Module/Notifications.php:11 ../../Zotlabs/Module/Poke.php:137
-#: ../../Zotlabs/Module/Item.php:220 ../../Zotlabs/Module/Item.php:230
-#: ../../Zotlabs/Module/Item.php:1067 ../../Zotlabs/Module/Profile.php:70
-#: ../../Zotlabs/Module/Profile.php:87 ../../Zotlabs/Module/Blocks.php:73
-#: ../../Zotlabs/Module/Blocks.php:80 ../../Zotlabs/Module/Layouts.php:71
-#: ../../Zotlabs/Module/Layouts.php:78 ../../Zotlabs/Module/Layouts.php:89
-#: ../../Zotlabs/Module/Rate.php:113
-#: ../../Zotlabs/Module/Profile_photo.php:274
-#: ../../Zotlabs/Module/Profile_photo.php:287
-#: ../../Zotlabs/Module/Events.php:271 ../../Zotlabs/Module/Common.php:39
-#: ../../Zotlabs/Module/Channel.php:107 ../../Zotlabs/Module/Channel.php:237
-#: ../../Zotlabs/Module/Channel.php:277 ../../Zotlabs/Module/Regmod.php:21
-#: ../../Zotlabs/Module/Pdledit.php:29 ../../Zotlabs/Module/Message.php:18
-#: ../../Zotlabs/Module/Service_limits.php:11
-#: ../../Zotlabs/Module/Webpages.php:116
-#: ../../Zotlabs/Module/Sharedwithme.php:11 ../../Zotlabs/Module/Wiki.php:49
-#: ../../Zotlabs/Module/Wiki.php:214 ../../Zotlabs/Module/Wiki.php:313
-#: ../../Zotlabs/Module/Wiki.php:318 ../../Zotlabs/Module/Sources.php:74
-#: ../../Zotlabs/Module/Suggest.php:30 ../../Zotlabs/Module/Thing.php:274
-#: ../../Zotlabs/Module/Thing.php:294 ../../Zotlabs/Module/Thing.php:335
-#: ../../Zotlabs/Module/Mail.php:164
-#: ../../Zotlabs/Module/Viewconnections.php:28
-#: ../../Zotlabs/Module/Viewconnections.php:33
-#: ../../Zotlabs/Module/Viewsrc.php:18 ../../Zotlabs/Module/Chat.php:100
-#: ../../Zotlabs/Module/Chat.php:105 ../../Zotlabs/Lib/Chatroom.php:137
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:55
-#: ../../extend/addon/addon/keepout/keepout.php:36
-#: ../../extend/addon/addon/pumpio/pumpio.php:40
-#: ../../extend/addon/addon/openid/Mod_Id.php:53
-#: ../../extend/addon/addon/diaspora_reconnect/diaspora_reconnect.php:58
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:194
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:291
-#: ../../include/attach.php:144 ../../include/attach.php:191
-#: ../../include/attach.php:255 ../../include/attach.php:269
-#: ../../include/attach.php:276 ../../include/attach.php:343
-#: ../../include/attach.php:357 ../../include/attach.php:364
-#: ../../include/attach.php:441 ../../include/attach.php:908
-#: ../../include/attach.php:979 ../../include/attach.php:1137
-#: ../../include/photos.php:27 ../../include/items.php:3445
-msgid "Permission denied."
+#: ../../Zotlabs/Module/Channel.php:112
+msgid "Insufficient permissions. Request redirected to profile page."
msgstr ""
-#: ../../Zotlabs/Web/Router.php:152 ../../Zotlabs/Module/Display.php:124
-#: ../../Zotlabs/Module/Page.php:94 ../../Zotlabs/Module/Block.php:79
-#: ../../Zotlabs/Lib/NativeWikiPage.php:502 ../../include/help.php:66
-msgid "Page not found."
+#: ../../Zotlabs/Module/Uexport.php:57 ../../Zotlabs/Module/Uexport.php:58
+msgid "Export Channel"
msgstr ""
-#: ../../Zotlabs/Zot/Auth.php:138
+#: ../../Zotlabs/Module/Uexport.php:59
msgid ""
-"Remote authentication blocked. You are logged into this site locally. Please "
-"logout and retry."
+"Export your basic channel information to a file. This acts as a backup of "
+"your connections, permissions, profile and basic data, which can be used to "
+"import your data to a new server hub, but does not contain your content."
msgstr ""
-#: ../../Zotlabs/Zot/Auth.php:250
-#: ../../extend/addon/addon/openid/Mod_Openid.php:76
-#: ../../extend/addon/addon/openid/Mod_Openid.php:178
-#, php-format
-msgid "Welcome %s. Remote authentication successful."
+#: ../../Zotlabs/Module/Uexport.php:60
+msgid "Export Content"
msgstr ""
-#: ../../Zotlabs/Module/Achievements.php:15
-#: ../../Zotlabs/Module/Connect.php:17 ../../Zotlabs/Module/Editblock.php:31
-#: ../../Zotlabs/Module/Editlayout.php:31
-#: ../../Zotlabs/Module/Editwebpage.php:32
-#: ../../Zotlabs/Module/Filestorage.php:59 ../../Zotlabs/Module/Hcard.php:12
-#: ../../Zotlabs/Module/Profile.php:20 ../../Zotlabs/Module/Blocks.php:33
-#: ../../Zotlabs/Module/Layouts.php:31 ../../Zotlabs/Module/Webpages.php:33
-#: ../../include/channel.php:945
-msgid "Requested profile is not available."
+#: ../../Zotlabs/Module/Uexport.php:61
+msgid ""
+"Export your channel information and recent content to a JSON backup that can "
+"be restored or imported to another server hub. This backs up all of your "
+"connections, permissions, profile data and several months of posts. This "
+"file may be VERY large. Please be patient - it may take several minutes for "
+"this download to begin."
msgstr ""
-#: ../../Zotlabs/Module/Achievements.php:38
-msgid "Some blurb about what to do when you're new here"
+#: ../../Zotlabs/Module/Uexport.php:63
+msgid "Export your posts from a given year."
msgstr ""
-#: ../../Zotlabs/Module/Display.php:17 ../../Zotlabs/Module/Photos.php:508
-#: ../../Zotlabs/Module/Search.php:17 ../../Zotlabs/Module/Ratings.php:83
-#: ../../Zotlabs/Module/Directory.php:64
-#: ../../Zotlabs/Module/Viewconnections.php:23
-#: ../../extend/addon/addon/friendica/dfrn_request.php:794
-msgid "Public access denied."
+#: ../../Zotlabs/Module/Uexport.php:65
+msgid ""
+"You may also export your posts and conversations for a particular year or "
+"month. Adjust the date in your browser location bar to select other dates. "
+"If the export fails (possibly due to memory exhaustion on your server hub), "
+"please try again selecting a more limited date range."
msgstr ""
-#: ../../Zotlabs/Module/Display.php:38 ../../Zotlabs/Module/Admin.php:60
-#: ../../Zotlabs/Module/Admin/Themes.php:69
-#: ../../Zotlabs/Module/Admin/Plugins.php:254
-#: ../../Zotlabs/Module/Filestorage.php:32 ../../Zotlabs/Module/Thing.php:89
-#: ../../Zotlabs/Module/Viewsrc.php:24 ../../include/items.php:3366
-msgid "Item not found."
+#: ../../Zotlabs/Module/Uexport.php:66
+#, php-format
+msgid ""
+"To select all posts for a given year, such as this year, visit <a href=\"%1$s"
+"\">%2$s</a>"
msgstr ""
-#: ../../Zotlabs/Module/Register.php:49
-msgid "Maximum daily site registrations exceeded. Please try again tomorrow."
+#: ../../Zotlabs/Module/Uexport.php:67
+#, php-format
+msgid ""
+"To select all posts for a given month, such as January of this year, visit "
+"<a href=\"%1$s\">%2$s</a>"
msgstr ""
-#: ../../Zotlabs/Module/Register.php:55
+#: ../../Zotlabs/Module/Uexport.php:68
+#, php-format
msgid ""
-"Please indicate acceptance of the Terms of Service. Registration failed."
+"These content files may be imported or restored by visiting <a href=\"%1$s\">"
+"%2$s</a> on any site containing your channel. For best results please import "
+"or restore these in date order (oldest first)."
msgstr ""
-#: ../../Zotlabs/Module/Register.php:89
-msgid "Passwords do not match."
+#: ../../Zotlabs/Module/Search.php:17 ../../Zotlabs/Module/Photos.php:490
+#: ../../Zotlabs/Module/Ratings.php:83 ../../Zotlabs/Module/Directory.php:63
+#: ../../Zotlabs/Module/Display.php:22
+#: ../../Zotlabs/Module/Viewconnections.php:23
+msgid "Public access denied."
msgstr ""
-#: ../../Zotlabs/Module/Register.php:131
-msgid ""
-"Registration successful. Please check your email for validation instructions."
+#: ../../Zotlabs/Module/Search.php:44 ../../Zotlabs/Module/Connections.php:312
+#: ../../Zotlabs/Lib/Apps.php:237 ../../Zotlabs/Widget/Sitesearch.php:31
+#: ../../include/text.php:1027 ../../include/text.php:1039
+#: ../../include/acl_selectors.php:213 ../../include/nav.php:164
+msgid "Search"
msgstr ""
-#: ../../Zotlabs/Module/Register.php:137
-msgid "Your registration is pending approval by the site owner."
+#: ../../Zotlabs/Module/Search.php:224
+#, php-format
+msgid "Items tagged with: %s"
msgstr ""
-#: ../../Zotlabs/Module/Register.php:140
-msgid "Your registration can not be processed."
+#: ../../Zotlabs/Module/Search.php:226
+#, php-format
+msgid "Search results for: %s"
msgstr ""
-#: ../../Zotlabs/Module/Register.php:184
-msgid "Registration on this hub is disabled."
+#: ../../Zotlabs/Module/Locs.php:25 ../../Zotlabs/Module/Locs.php:54
+msgid "Location not found."
msgstr ""
-#: ../../Zotlabs/Module/Register.php:193
-msgid "Registration on this hub is by approval only."
+#: ../../Zotlabs/Module/Locs.php:62
+msgid "Location lookup failed."
msgstr ""
-#: ../../Zotlabs/Module/Register.php:194
-msgid "<a href=\"pubsites\">Register at another affiliated hub.</a>"
+#: ../../Zotlabs/Module/Locs.php:66
+msgid ""
+"Please select another location to become primary before removing the primary "
+"location."
msgstr ""
-#: ../../Zotlabs/Module/Register.php:204
-msgid ""
-"This site has exceeded the number of allowed daily account registrations. "
-"Please try again tomorrow."
+#: ../../Zotlabs/Module/Locs.php:95
+msgid "Syncing locations"
msgstr ""
-#: ../../Zotlabs/Module/Register.php:221 ../../Zotlabs/Module/Siteinfo.php:27
-msgid "Terms of Service"
+#: ../../Zotlabs/Module/Locs.php:105
+msgid "No locations found."
msgstr ""
-#: ../../Zotlabs/Module/Register.php:227
-#, php-format
-msgid "I accept the %s for this website"
+#: ../../Zotlabs/Module/Locs.php:116
+msgid "Manage Channel Locations"
msgstr ""
-#: ../../Zotlabs/Module/Register.php:229
-#, php-format
-msgid "I am over 13 years of age and accept the %s for this website"
+#: ../../Zotlabs/Module/Locs.php:117 ../../Zotlabs/Module/Events.php:475
+#: ../../Zotlabs/Module/Profiles.php:509 ../../Zotlabs/Module/Profiles.php:737
+#: ../../Zotlabs/Module/Pubsites.php:51 ../../addon/cdav/Mod_Cdav.php:839
+#: ../../include/js_strings.php:25
+msgid "Location"
msgstr ""
-#: ../../Zotlabs/Module/Register.php:233
-msgid "Your email address"
+#: ../../Zotlabs/Module/Locs.php:118
+#: ../../Zotlabs/Module/Admin/Channels.php:160
+#: ../../Zotlabs/Module/Connedit.php:909 ../../Zotlabs/Module/Profiles.php:502
+#: ../../Zotlabs/Module/Profiles.php:793 ../../addon/cdav/Mod_Cdav.php:1143
+msgid "Address"
msgstr ""
-#: ../../Zotlabs/Module/Register.php:234
-msgid "Choose a password"
+#: ../../Zotlabs/Module/Locs.php:119
+msgid "Primary"
msgstr ""
-#: ../../Zotlabs/Module/Register.php:235
-msgid "Please re-enter your password"
+#: ../../Zotlabs/Module/Locs.php:120 ../../Zotlabs/Module/Menu.php:113
+msgid "Drop"
msgstr ""
-#: ../../Zotlabs/Module/Register.php:236
-msgid "Please enter your invitation code"
+#: ../../Zotlabs/Module/Locs.php:122
+msgid "Sync Now"
msgstr ""
-#: ../../Zotlabs/Module/Register.php:237
-#: ../../Zotlabs/Module/New_channel.php:134
-msgid "Name or caption"
+#: ../../Zotlabs/Module/Locs.php:123
+msgid "Please wait several minutes between consecutive operations."
msgstr ""
-#: ../../Zotlabs/Module/Register.php:237
-#: ../../Zotlabs/Module/New_channel.php:134
+#: ../../Zotlabs/Module/Locs.php:124
msgid ""
-"Examples: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \"Aviation "
-"Group\""
+"When possible, drop a location by logging into that website/hub and removing "
+"your channel."
msgstr ""
-#: ../../Zotlabs/Module/Register.php:239
-#: ../../Zotlabs/Module/New_channel.php:136
-msgid "Choose a short nickname"
+#: ../../Zotlabs/Module/Locs.php:125
+msgid "Use this form to drop the location if the hub is no longer operating."
msgstr ""
-#: ../../Zotlabs/Module/Register.php:239
-#: ../../Zotlabs/Module/New_channel.php:136
-#, php-format
-msgid ""
-"Your nickname will be used to create an easy to remember channel address e."
-"g. nickname%s"
+#: ../../Zotlabs/Module/Mitem.php:28 ../../Zotlabs/Module/Menu.php:144
+msgid "Menu not found."
msgstr ""
-#: ../../Zotlabs/Module/Register.php:240
-#: ../../Zotlabs/Module/New_channel.php:137
-msgid "Channel role and privacy"
+#: ../../Zotlabs/Module/Mitem.php:52
+msgid "Unable to create element."
msgstr ""
-#: ../../Zotlabs/Module/Register.php:240
-#: ../../Zotlabs/Module/New_channel.php:137
-msgid "Select a channel role with your privacy requirements."
+#: ../../Zotlabs/Module/Mitem.php:76
+msgid "Unable to update menu element."
msgstr ""
-#: ../../Zotlabs/Module/Register.php:240
-#: ../../Zotlabs/Module/New_channel.php:137
-msgid "Read more about roles"
+#: ../../Zotlabs/Module/Mitem.php:92
+msgid "Unable to add menu element."
msgstr ""
-#: ../../Zotlabs/Module/Register.php:241
-msgid "no"
+#: ../../Zotlabs/Module/Mitem.php:120 ../../Zotlabs/Module/Menu.php:166
+#: ../../Zotlabs/Module/Xchan.php:41
+msgid "Not found."
msgstr ""
-#: ../../Zotlabs/Module/Register.php:241
-msgid "yes"
+#: ../../Zotlabs/Module/Mitem.php:153 ../../Zotlabs/Module/Mitem.php:230
+msgid "Menu Item Permissions"
msgstr ""
-#: ../../Zotlabs/Module/Register.php:253
-#: ../../Zotlabs/Module/Admin/Site.php:261
-msgid "Registration"
+#: ../../Zotlabs/Module/Mitem.php:154 ../../Zotlabs/Module/Mitem.php:231
+#: ../../Zotlabs/Module/Settings/Channel.php:510
+msgid "(click to open/close)"
msgstr ""
-#: ../../Zotlabs/Module/Register.php:258
-msgid "Membership on this site is by invitation only."
+#: ../../Zotlabs/Module/Mitem.php:160 ../../Zotlabs/Module/Mitem.php:176
+msgid "Link Name"
msgstr ""
-#: ../../Zotlabs/Module/Register.php:270 ../../include/nav.php:162
-#: ../../boot.php:1713
-msgid "Register"
+#: ../../Zotlabs/Module/Mitem.php:161 ../../Zotlabs/Module/Mitem.php:239
+msgid "Link or Submenu Target"
msgstr ""
-#: ../../Zotlabs/Module/Register.php:271
-msgid ""
-"This site may require email verification after submitting this form. If you "
-"are returned to a login page, please check your email for instructions."
+#: ../../Zotlabs/Module/Mitem.php:161
+msgid "Enter URL of the link or select a menu name to create a submenu"
msgstr ""
-#: ../../Zotlabs/Module/Probe.php:28 ../../Zotlabs/Module/Probe.php:32
-#, php-format
-msgid "Fetching URL returns error: %1$s"
+#: ../../Zotlabs/Module/Mitem.php:162 ../../Zotlabs/Module/Mitem.php:240
+msgid "Use magic-auth if available"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:82
-msgid "Page owner information could not be retrieved."
+#: ../../Zotlabs/Module/Mitem.php:162 ../../Zotlabs/Module/Mitem.php:163
+#: ../../Zotlabs/Module/Mitem.php:240 ../../Zotlabs/Module/Mitem.php:241
+#: ../../Zotlabs/Module/Events.php:470 ../../Zotlabs/Module/Events.php:471
+#: ../../Zotlabs/Module/Removeme.php:63 ../../Zotlabs/Module/Admin/Site.php:237
+#: ../../Zotlabs/Module/Settings/Channel.php:294
+#: ../../Zotlabs/Module/Settings/Display.php:103
+#: ../../Zotlabs/Module/Api.php:97 ../../Zotlabs/Module/Photos.php:642
+#: ../../Zotlabs/Module/Wiki.php:180 ../../Zotlabs/Module/Connedit.php:392
+#: ../../Zotlabs/Module/Connedit.php:775 ../../Zotlabs/Module/Menu.php:100
+#: ../../Zotlabs/Module/Menu.php:157 ../../Zotlabs/Module/Profiles.php:681
+#: ../../Zotlabs/Module/Filestorage.php:160
+#: ../../Zotlabs/Module/Filestorage.php:168 ../../boot.php:1633
+#: ../../view/theme/redbasic/php/config.php:89
+#: ../../view/theme/redbasic/php/config.php:104 ../../addon/cdav/cdav.php:234
+#: ../../addon/planets/planets.php:153 ../../addon/wppost/wppost.php:82
+#: ../../addon/wppost/wppost.php:105 ../../addon/wppost/wppost.php:109
+#: ../../addon/nsfw/nsfw.php:84 ../../addon/ijpost/ijpost.php:73
+#: ../../addon/ijpost/ijpost.php:85 ../../addon/dwpost/dwpost.php:73
+#: ../../addon/dwpost/dwpost.php:85 ../../addon/ljpost/ljpost.php:70
+#: ../../addon/ljpost/ljpost.php:82 ../../addon/gitwiki/Mod_Gitwiki.php:166
+#: ../../addon/rainbowtag/rainbowtag.php:81 ../../addon/visage/visage.php:166
+#: ../../addon/nsabait/nsabait.php:157 ../../addon/rtof/rtof.php:81
+#: ../../addon/rtof/rtof.php:85 ../../addon/jappixmini/jappixmini.php:309
+#: ../../addon/jappixmini/jappixmini.php:313
+#: ../../addon/jappixmini/jappixmini.php:343
+#: ../../addon/jappixmini/jappixmini.php:351
+#: ../../addon/jappixmini/jappixmini.php:355
+#: ../../addon/jappixmini/jappixmini.php:359 ../../addon/nofed/nofed.php:72
+#: ../../addon/nofed/nofed.php:76 ../../addon/redred/redred.php:95
+#: ../../addon/redred/redred.php:99 ../../addon/libertree/libertree.php:69
+#: ../../addon/libertree/libertree.php:81
+#: ../../addon/flattrwidget/flattrwidget.php:120
+#: ../../addon/statusnet/statusnet.php:389
+#: ../../addon/statusnet/statusnet.php:411
+#: ../../addon/statusnet/statusnet.php:415
+#: ../../addon/statusnet/statusnet.php:424 ../../addon/twitter/twitter.php:242
+#: ../../addon/twitter/twitter.php:246 ../../addon/twitter/twitter.php:255
+#: ../../addon/smileybutton/smileybutton.php:273
+#: ../../addon/smileybutton/smileybutton.php:277 ../../addon/xmpp/xmpp.php:53
+#: ../../addon/pumpio/pumpio.php:219 ../../addon/pumpio/pumpio.php:223
+#: ../../addon/pumpio/pumpio.php:227 ../../addon/pumpio/pumpio.php:231
+#: ../../include/dir_fns.php:143 ../../include/dir_fns.php:144
+#: ../../include/dir_fns.php:145
+msgid "No"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:97 ../../Zotlabs/Module/Photos.php:729
-#: ../../Zotlabs/Module/Profile_photo.php:115
-#: ../../Zotlabs/Module/Profile_photo.php:220
-#: ../../include/photo/photo_driver.php:730
-msgid "Profile Photos"
+#: ../../Zotlabs/Module/Mitem.php:162 ../../Zotlabs/Module/Mitem.php:163
+#: ../../Zotlabs/Module/Mitem.php:240 ../../Zotlabs/Module/Mitem.php:241
+#: ../../Zotlabs/Module/Events.php:470 ../../Zotlabs/Module/Events.php:471
+#: ../../Zotlabs/Module/Removeme.php:63 ../../Zotlabs/Module/Admin/Site.php:239
+#: ../../Zotlabs/Module/Settings/Channel.php:294
+#: ../../Zotlabs/Module/Settings/Display.php:103
+#: ../../Zotlabs/Module/Api.php:96 ../../Zotlabs/Module/Photos.php:642
+#: ../../Zotlabs/Module/Wiki.php:180 ../../Zotlabs/Module/Connedit.php:392
+#: ../../Zotlabs/Module/Menu.php:100 ../../Zotlabs/Module/Menu.php:157
+#: ../../Zotlabs/Module/Profiles.php:681
+#: ../../Zotlabs/Module/Filestorage.php:160
+#: ../../Zotlabs/Module/Filestorage.php:168 ../../boot.php:1633
+#: ../../view/theme/redbasic/php/config.php:89
+#: ../../view/theme/redbasic/php/config.php:104 ../../addon/cdav/cdav.php:234
+#: ../../addon/planets/planets.php:153 ../../addon/wppost/wppost.php:82
+#: ../../addon/wppost/wppost.php:105 ../../addon/wppost/wppost.php:109
+#: ../../addon/nsfw/nsfw.php:84 ../../addon/ijpost/ijpost.php:73
+#: ../../addon/ijpost/ijpost.php:85 ../../addon/dwpost/dwpost.php:73
+#: ../../addon/dwpost/dwpost.php:85 ../../addon/ljpost/ljpost.php:70
+#: ../../addon/ljpost/ljpost.php:82 ../../addon/gitwiki/Mod_Gitwiki.php:166
+#: ../../addon/rainbowtag/rainbowtag.php:81 ../../addon/visage/visage.php:166
+#: ../../addon/nsabait/nsabait.php:157 ../../addon/rtof/rtof.php:81
+#: ../../addon/rtof/rtof.php:85 ../../addon/jappixmini/jappixmini.php:309
+#: ../../addon/jappixmini/jappixmini.php:313
+#: ../../addon/jappixmini/jappixmini.php:343
+#: ../../addon/jappixmini/jappixmini.php:351
+#: ../../addon/jappixmini/jappixmini.php:355
+#: ../../addon/jappixmini/jappixmini.php:359 ../../addon/nofed/nofed.php:72
+#: ../../addon/nofed/nofed.php:76 ../../addon/redred/redred.php:95
+#: ../../addon/redred/redred.php:99 ../../addon/libertree/libertree.php:69
+#: ../../addon/libertree/libertree.php:81
+#: ../../addon/flattrwidget/flattrwidget.php:120
+#: ../../addon/statusnet/statusnet.php:389
+#: ../../addon/statusnet/statusnet.php:411
+#: ../../addon/statusnet/statusnet.php:415
+#: ../../addon/statusnet/statusnet.php:424 ../../addon/twitter/twitter.php:242
+#: ../../addon/twitter/twitter.php:246 ../../addon/twitter/twitter.php:255
+#: ../../addon/smileybutton/smileybutton.php:273
+#: ../../addon/smileybutton/smileybutton.php:277 ../../addon/xmpp/xmpp.php:53
+#: ../../addon/pumpio/pumpio.php:219 ../../addon/pumpio/pumpio.php:223
+#: ../../addon/pumpio/pumpio.php:227 ../../addon/pumpio/pumpio.php:231
+#: ../../include/dir_fns.php:143 ../../include/dir_fns.php:144
+#: ../../include/dir_fns.php:145
+msgid "Yes"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:103 ../../Zotlabs/Module/Photos.php:129
-msgid "Album not found."
+#: ../../Zotlabs/Module/Mitem.php:163 ../../Zotlabs/Module/Mitem.php:241
+msgid "Open link in new window"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:112
-msgid "Delete Album"
+#: ../../Zotlabs/Module/Mitem.php:164 ../../Zotlabs/Module/Mitem.php:242
+msgid "Order in list"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:133
-msgid ""
-"Multiple storage folders exist with this album name, but within different "
-"directories. Please remove the desired folder or folders using the Files "
-"manager"
+#: ../../Zotlabs/Module/Mitem.php:164 ../../Zotlabs/Module/Mitem.php:242
+msgid "Higher numbers will sink to bottom of listing"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:190 ../../Zotlabs/Module/Photos.php:1054
-msgid "Delete Photo"
+#: ../../Zotlabs/Module/Mitem.php:165
+msgid "Submit and finish"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:519
-msgid "No photos selected"
+#: ../../Zotlabs/Module/Mitem.php:166
+msgid "Submit and continue"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:568
-msgid "Access to this item is restricted."
+#: ../../Zotlabs/Module/Mitem.php:174
+msgid "Menu:"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:607
-#, php-format
-msgid "%1$.2f MB of %2$.2f MB photo storage used."
+#: ../../Zotlabs/Module/Mitem.php:177
+msgid "Link Target"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:610
-#, php-format
-msgid "%1$.2f MB photo storage used."
+#: ../../Zotlabs/Module/Mitem.php:180
+msgid "Edit menu"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:646
-msgid "Upload Photos"
+#: ../../Zotlabs/Module/Mitem.php:183
+msgid "Edit element"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:650
-msgid "Enter an album name"
+#: ../../Zotlabs/Module/Mitem.php:184
+msgid "Drop element"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:651
-msgid "or select an existing album (doubleclick)"
+#: ../../Zotlabs/Module/Mitem.php:185
+msgid "New element"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:652
-msgid "Create a status post for this upload"
+#: ../../Zotlabs/Module/Mitem.php:186
+msgid "Edit this menu container"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:652 ../../Zotlabs/Module/Admin/Site.php:218
-#: ../../Zotlabs/Module/Menu.php:100 ../../Zotlabs/Module/Menu.php:157
-#: ../../Zotlabs/Module/Connedit.php:402 ../../Zotlabs/Module/Connedit.php:740
-#: ../../Zotlabs/Module/Filestorage.php:160
-#: ../../Zotlabs/Module/Filestorage.php:168 ../../Zotlabs/Module/Mitem.php:162
-#: ../../Zotlabs/Module/Mitem.php:163 ../../Zotlabs/Module/Mitem.php:240
-#: ../../Zotlabs/Module/Mitem.php:241 ../../Zotlabs/Module/Profiles.php:682
-#: ../../Zotlabs/Module/Api.php:97 ../../Zotlabs/Module/Events.php:470
-#: ../../Zotlabs/Module/Events.php:471 ../../Zotlabs/Module/Removeme.php:63
-#: ../../Zotlabs/Module/Wiki.php:178
-#: ../../Zotlabs/Module/Settings/Channel.php:294
-#: ../../Zotlabs/Module/Settings/Display.php:103
-#: ../../extend/addon/addon/dwpost/dwpost.php:73
-#: ../../extend/addon/addon/dwpost/dwpost.php:85
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:120
-#: ../../extend/addon/addon/friendica/dfrn_request.php:865
-#: ../../extend/addon/addon/ijpost/ijpost.php:73
-#: ../../extend/addon/addon/ijpost/ijpost.php:85
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:309
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:313
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:343
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:351
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:355
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:359
-#: ../../extend/addon/addon/libertree/libertree.php:69
-#: ../../extend/addon/addon/libertree/libertree.php:81
-#: ../../extend/addon/addon/ljpost/ljpost.php:70
-#: ../../extend/addon/addon/ljpost/ljpost.php:82
-#: ../../extend/addon/addon/nofed/nofed.php:72
-#: ../../extend/addon/addon/nofed/nofed.php:76
-#: ../../extend/addon/addon/nsabait/nsabait.php:157
-#: ../../extend/addon/addon/nsfw/nsfw.php:84
-#: ../../extend/addon/addon/planets/planets.php:153
-#: ../../extend/addon/addon/pumpio/pumpio.php:219
-#: ../../extend/addon/addon/pumpio/pumpio.php:223
-#: ../../extend/addon/addon/pumpio/pumpio.php:227
-#: ../../extend/addon/addon/pumpio/pumpio.php:231
-#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:81
-#: ../../extend/addon/addon/redred/redred.php:95
-#: ../../extend/addon/addon/redred/redred.php:99
-#: ../../extend/addon/addon/rtof/rtof.php:81
-#: ../../extend/addon/addon/rtof/rtof.php:85
-#: ../../extend/addon/addon/smileybutton/smileybutton.php:273
-#: ../../extend/addon/addon/smileybutton/smileybutton.php:277
-#: ../../extend/addon/addon/statusnet/statusnet.php:389
-#: ../../extend/addon/addon/statusnet/statusnet.php:411
-#: ../../extend/addon/addon/statusnet/statusnet.php:415
-#: ../../extend/addon/addon/statusnet/statusnet.php:424
-#: ../../extend/addon/addon/twitter/twitter.php:242
-#: ../../extend/addon/addon/twitter/twitter.php:246
-#: ../../extend/addon/addon/twitter/twitter.php:255
-#: ../../extend/addon/addon/visage/visage.php:166
-#: ../../extend/addon/addon/wppost/wppost.php:82
-#: ../../extend/addon/addon/wppost/wppost.php:105
-#: ../../extend/addon/addon/wppost/wppost.php:109
-#: ../../extend/addon/addon/xmpp/xmpp.php:53
-#: ../../extend/addon/addon/cdav/cdav.php:234
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:164
-#: ../../include/dir_fns.php:143 ../../include/dir_fns.php:144
-#: ../../include/dir_fns.php:145 ../../view/theme/redbasic/php/config.php:111
-#: ../../view/theme/redbasic/php/config.php:136 ../../boot.php:1736
-msgid "No"
+#: ../../Zotlabs/Module/Mitem.php:187
+msgid "Add menu element"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:652 ../../Zotlabs/Module/Admin/Site.php:220
-#: ../../Zotlabs/Module/Menu.php:100 ../../Zotlabs/Module/Menu.php:157
-#: ../../Zotlabs/Module/Connedit.php:402
-#: ../../Zotlabs/Module/Filestorage.php:160
-#: ../../Zotlabs/Module/Filestorage.php:168 ../../Zotlabs/Module/Mitem.php:162
-#: ../../Zotlabs/Module/Mitem.php:163 ../../Zotlabs/Module/Mitem.php:240
-#: ../../Zotlabs/Module/Mitem.php:241 ../../Zotlabs/Module/Profiles.php:682
-#: ../../Zotlabs/Module/Api.php:96 ../../Zotlabs/Module/Events.php:470
-#: ../../Zotlabs/Module/Events.php:471 ../../Zotlabs/Module/Removeme.php:63
-#: ../../Zotlabs/Module/Wiki.php:178
-#: ../../Zotlabs/Module/Settings/Channel.php:294
-#: ../../Zotlabs/Module/Settings/Display.php:103
-#: ../../extend/addon/addon/dwpost/dwpost.php:73
-#: ../../extend/addon/addon/dwpost/dwpost.php:85
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:120
-#: ../../extend/addon/addon/friendica/dfrn_request.php:865
-#: ../../extend/addon/addon/ijpost/ijpost.php:73
-#: ../../extend/addon/addon/ijpost/ijpost.php:85
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:309
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:313
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:343
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:351
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:355
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:359
-#: ../../extend/addon/addon/libertree/libertree.php:69
-#: ../../extend/addon/addon/libertree/libertree.php:81
-#: ../../extend/addon/addon/ljpost/ljpost.php:70
-#: ../../extend/addon/addon/ljpost/ljpost.php:82
-#: ../../extend/addon/addon/nofed/nofed.php:72
-#: ../../extend/addon/addon/nofed/nofed.php:76
-#: ../../extend/addon/addon/nsabait/nsabait.php:157
-#: ../../extend/addon/addon/nsfw/nsfw.php:84
-#: ../../extend/addon/addon/planets/planets.php:153
-#: ../../extend/addon/addon/pumpio/pumpio.php:219
-#: ../../extend/addon/addon/pumpio/pumpio.php:223
-#: ../../extend/addon/addon/pumpio/pumpio.php:227
-#: ../../extend/addon/addon/pumpio/pumpio.php:231
-#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:81
-#: ../../extend/addon/addon/redred/redred.php:95
-#: ../../extend/addon/addon/redred/redred.php:99
-#: ../../extend/addon/addon/rtof/rtof.php:81
-#: ../../extend/addon/addon/rtof/rtof.php:85
-#: ../../extend/addon/addon/smileybutton/smileybutton.php:273
-#: ../../extend/addon/addon/smileybutton/smileybutton.php:277
-#: ../../extend/addon/addon/statusnet/statusnet.php:389
-#: ../../extend/addon/addon/statusnet/statusnet.php:411
-#: ../../extend/addon/addon/statusnet/statusnet.php:415
-#: ../../extend/addon/addon/statusnet/statusnet.php:424
-#: ../../extend/addon/addon/twitter/twitter.php:242
-#: ../../extend/addon/addon/twitter/twitter.php:246
-#: ../../extend/addon/addon/twitter/twitter.php:255
-#: ../../extend/addon/addon/visage/visage.php:166
-#: ../../extend/addon/addon/wppost/wppost.php:82
-#: ../../extend/addon/addon/wppost/wppost.php:105
-#: ../../extend/addon/addon/wppost/wppost.php:109
-#: ../../extend/addon/addon/xmpp/xmpp.php:53
-#: ../../extend/addon/addon/cdav/cdav.php:234
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:164
-#: ../../include/dir_fns.php:143 ../../include/dir_fns.php:144
-#: ../../include/dir_fns.php:145 ../../view/theme/redbasic/php/config.php:111
-#: ../../view/theme/redbasic/php/config.php:136 ../../boot.php:1736
-msgid "Yes"
+#: ../../Zotlabs/Module/Mitem.php:188
+msgid "Delete this menu item"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:653
-msgid "Caption (optional):"
+#: ../../Zotlabs/Module/Mitem.php:189
+msgid "Edit this menu item"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:654
-msgid "Description (optional):"
+#: ../../Zotlabs/Module/Mitem.php:206
+msgid "Menu item not found."
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:657 ../../Zotlabs/Module/Photos.php:1042
-#: ../../Zotlabs/Module/Connedit.php:637
-#: ../../Zotlabs/Module/Filestorage.php:152 ../../Zotlabs/Module/Thing.php:313
-#: ../../Zotlabs/Module/Thing.php:363 ../../Zotlabs/Module/Chat.php:234
-#: ../../include/acl_selectors.php:218
-msgid "Permissions"
+#: ../../Zotlabs/Module/Mitem.php:219
+msgid "Menu item deleted."
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:667 ../../Zotlabs/Module/Photos.php:1053
-#: ../../Zotlabs/Module/Photos.php:1093 ../../Zotlabs/Module/Photos.php:1211
-#: ../../Zotlabs/Module/Connect.php:98
-#: ../../Zotlabs/Module/Admin/Features.php:66
-#: ../../Zotlabs/Module/Admin/Logs.php:84
-#: ../../Zotlabs/Module/Admin/Profs.php:157
-#: ../../Zotlabs/Module/Admin/Security.php:104
-#: ../../Zotlabs/Module/Admin/Themes.php:156
-#: ../../Zotlabs/Module/Admin/Account_edit.php:74
-#: ../../Zotlabs/Module/Admin/Accounts.php:166
-#: ../../Zotlabs/Module/Admin/Channels.php:147
-#: ../../Zotlabs/Module/Admin/Site.php:260
-#: ../../Zotlabs/Module/Admin/Plugins.php:433
-#: ../../Zotlabs/Module/Locs.php:121 ../../Zotlabs/Module/Connedit.php:847
-#: ../../Zotlabs/Module/Filestorage.php:165 ../../Zotlabs/Module/Cal.php:342
-#: ../../Zotlabs/Module/Group.php:85 ../../Zotlabs/Module/Import_items.php:122
-#: ../../Zotlabs/Module/Import.php:507 ../../Zotlabs/Module/Mitem.php:243
-#: ../../Zotlabs/Module/Appman.php:133 ../../Zotlabs/Module/Mood.php:139
-#: ../../Zotlabs/Module/Profiles.php:722 ../../Zotlabs/Module/Invite.php:149
-#: ../../Zotlabs/Module/Setup.php:309 ../../Zotlabs/Module/Setup.php:357
-#: ../../Zotlabs/Module/Poke.php:186 ../../Zotlabs/Module/Pconfig.php:107
-#: ../../Zotlabs/Module/Rate.php:166 ../../Zotlabs/Module/Events.php:493
-#: ../../Zotlabs/Module/Pdledit.php:74 ../../Zotlabs/Module/Wiki.php:167
-#: ../../Zotlabs/Module/Sources.php:114 ../../Zotlabs/Module/Sources.php:149
-#: ../../Zotlabs/Module/Settings/Features.php:47
-#: ../../Zotlabs/Module/Settings/Oauth.php:87
-#: ../../Zotlabs/Module/Settings/Account.php:118
-#: ../../Zotlabs/Module/Settings/Tokens.php:168
-#: ../../Zotlabs/Module/Settings/Featured.php:50
-#: ../../Zotlabs/Module/Settings/Channel.php:476
-#: ../../Zotlabs/Module/Settings/Display.php:196
-#: ../../Zotlabs/Module/Settings/Permcats.php:112
-#: ../../Zotlabs/Module/Thing.php:320 ../../Zotlabs/Module/Thing.php:370
-#: ../../Zotlabs/Module/Mail.php:413 ../../Zotlabs/Module/Chat.php:196
-#: ../../Zotlabs/Module/Chat.php:241 ../../Zotlabs/Module/Xchan.php:15
-#: ../../Zotlabs/Lib/ThreadItem.php:731
-#: ../../extend/addon/addon/chords/Mod_Chords.php:60
-#: ../../extend/addon/addon/diaspora/diaspora.php:714
-#: ../../extend/addon/addon/dwpost/dwpost.php:89
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:124
-#: ../../extend/addon/addon/friendica/friendica.php:128
-#: ../../extend/addon/addon/frphotos/frphotos.php:96
-#: ../../extend/addon/addon/hubwall/hubwall.php:95
-#: ../../extend/addon/addon/ijpost/ijpost.php:89
-#: ../../extend/addon/addon/irc/irc.php:53
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:371
-#: ../../extend/addon/addon/libertree/libertree.php:85
-#: ../../extend/addon/addon/ljpost/ljpost.php:86
-#: ../../extend/addon/addon/logrot/logrot.php:35
-#: ../../extend/addon/addon/mailhost/mailhost.php:40
-#: ../../extend/addon/addon/nofed/nofed.php:80
-#: ../../extend/addon/addon/nsabait/nsabait.php:161
-#: ../../extend/addon/addon/nsfw/nsfw.php:92
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:53
-#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:168
-#: ../../extend/addon/addon/pageheader/pageheader.php:48
-#: ../../extend/addon/addon/piwik/piwik.php:95
-#: ../../extend/addon/addon/planets/planets.php:157
-#: ../../extend/addon/addon/pumpio/pumpio.php:237
-#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:85
-#: ../../extend/addon/addon/redfiles/redfiles.php:124
-#: ../../extend/addon/addon/redphotos/redphotos.php:136
-#: ../../extend/addon/addon/redred/redred.php:119
-#: ../../extend/addon/addon/rtof/rtof.php:101
-#: ../../extend/addon/addon/skeleton/skeleton.php:65
-#: ../../extend/addon/addon/smileybutton/smileybutton.php:281
-#: ../../extend/addon/addon/startpage/startpage.php:113
-#: ../../extend/addon/addon/statusnet/statusnet.php:322
-#: ../../extend/addon/addon/statusnet/statusnet.php:380
-#: ../../extend/addon/addon/statusnet/statusnet.php:432
-#: ../../extend/addon/addon/statusnet/statusnet.php:899
-#: ../../extend/addon/addon/superblock/superblock.php:118
-#: ../../extend/addon/addon/twitter/twitter.php:217
-#: ../../extend/addon/addon/twitter/twitter.php:259
-#: ../../extend/addon/addon/visage/visage.php:170
-#: ../../extend/addon/addon/wppost/wppost.php:113
-#: ../../extend/addon/addon/xmpp/xmpp.php:69
-#: ../../extend/addon/addon/cdav/cdav.php:246
-#: ../../extend/addon/addon/likebanner/likebanner.php:57
-#: ../../extend/addon/addon/mailtest/mailtest.php:100
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:153
-#: ../../extend/addon/addon/gnusoc/gnusoc.php:133
-#: ../../include/widgets.php:815 ../../include/js_strings.php:22
-#: ../../view/theme/redbasic/php/config.php:106
-msgid "Submit"
+#: ../../Zotlabs/Module/Mitem.php:221
+msgid "Menu item could not be deleted."
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:685
-msgid "Album name could not be decoded"
+#: ../../Zotlabs/Module/Mitem.php:228
+msgid "Edit Menu Element"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:729
-msgid "Contact Photos"
+#: ../../Zotlabs/Module/Mitem.php:238
+msgid "Link text"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:752
-msgid "Show Newest First"
+#: ../../Zotlabs/Module/Events.php:25
+msgid "Calendar entries imported."
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:754
-msgid "Show Oldest First"
+#: ../../Zotlabs/Module/Events.php:27
+msgid "No calendar entries found."
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:778 ../../Zotlabs/Module/Photos.php:1335
-#: ../../Zotlabs/Module/Embedphotos.php:139 ../../include/widgets.php:1708
-msgid "View Photo"
+#: ../../Zotlabs/Module/Events.php:110
+msgid "Event can not end before it has started."
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:809
-#: ../../Zotlabs/Module/Embedphotos.php:155 ../../include/widgets.php:1725
-msgid "Edit Album"
+#: ../../Zotlabs/Module/Events.php:112 ../../Zotlabs/Module/Events.php:121
+#: ../../Zotlabs/Module/Events.php:143
+msgid "Unable to generate preview."
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:856
-msgid "Permission denied. Access to this item may be restricted."
+#: ../../Zotlabs/Module/Events.php:119
+msgid "Event title and start time are required."
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:858
-msgid "Photo not available"
+#: ../../Zotlabs/Module/Events.php:141 ../../Zotlabs/Module/Events.php:265
+msgid "Event not found."
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:916
-msgid "Use as profile photo"
+#: ../../Zotlabs/Module/Events.php:260 ../../Zotlabs/Module/Tagger.php:51
+#: ../../Zotlabs/Module/Like.php:372 ../../include/conversation.php:119
+#: ../../include/text.php:1940 ../../include/event.php:1141
+msgid "event"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:917
-msgid "Use as cover photo"
+#: ../../Zotlabs/Module/Events.php:460
+msgid "Edit event title"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:924
-msgid "Private Photo"
+#: ../../Zotlabs/Module/Events.php:460 ../../addon/cdav/Mod_Cdav.php:835
+msgid "Event title"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:935 ../../Zotlabs/Module/Cal.php:336
-#: ../../Zotlabs/Module/Cal.php:343 ../../Zotlabs/Module/Events.php:689
-#: ../../Zotlabs/Module/Events.php:698
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:846
-msgid "Previous"
+#: ../../Zotlabs/Module/Events.php:460 ../../Zotlabs/Module/Events.php:465
+#: ../../Zotlabs/Module/Appman.php:122 ../../Zotlabs/Module/Appman.php:123
+#: ../../Zotlabs/Module/Profiles.php:748 ../../Zotlabs/Module/Profiles.php:752
+#: ../../include/datetime.php:259
+msgid "Required"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:939
-msgid "View Full Size"
+#: ../../Zotlabs/Module/Events.php:462
+msgid "Categories (comma-separated list)"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:944 ../../Zotlabs/Module/Cal.php:337
-#: ../../Zotlabs/Module/Cal.php:344 ../../Zotlabs/Module/Setup.php:264
-#: ../../Zotlabs/Module/Events.php:690 ../../Zotlabs/Module/Events.php:699
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:847
-msgid "Next"
+#: ../../Zotlabs/Module/Events.php:463
+msgid "Edit Category"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:984
-#: ../../Zotlabs/Module/Admin/Plugins.php:450
-#: ../../Zotlabs/Module/Tagrm.php:137
-#: ../../extend/addon/addon/superblock/superblock.php:114
-msgid "Remove"
+#: ../../Zotlabs/Module/Events.php:463
+msgid "Category"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1028
-msgid "Edit photo"
+#: ../../Zotlabs/Module/Events.php:466
+msgid "Edit start date and time"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1030
-msgid "Rotate CW (right)"
+#: ../../Zotlabs/Module/Events.php:466 ../../addon/cdav/Mod_Cdav.php:836
+msgid "Start date and time"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1031
-msgid "Rotate CCW (left)"
+#: ../../Zotlabs/Module/Events.php:467 ../../Zotlabs/Module/Events.php:470
+msgid "Finish date and time are not known or not relevant"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1034
-msgid "Move photo to album"
+#: ../../Zotlabs/Module/Events.php:469
+msgid "Edit finish date and time"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1035
-msgid "Enter a new album name"
+#: ../../Zotlabs/Module/Events.php:469
+msgid "Finish date and time"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1036
-msgid "or select an existing one (doubleclick)"
+#: ../../Zotlabs/Module/Events.php:471 ../../Zotlabs/Module/Events.php:472
+msgid "Adjust for viewer timezone"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1039
-msgid "Caption"
+#: ../../Zotlabs/Module/Events.php:471
+msgid ""
+"Important for events that happen in a particular place. Not practical for "
+"global holidays."
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1041
-msgid "Add a Tag"
+#: ../../Zotlabs/Module/Events.php:473
+msgid "Edit Description"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1049
-msgid "Example: @bob, @Barbara_Jensen, @jim@example.com"
+#: ../../Zotlabs/Module/Events.php:473 ../../Zotlabs/Module/Appman.php:124
+#: ../../Zotlabs/Module/Rbmark.php:101
+#: ../../addon/rendezvous/rendezvous.php:173 ../../addon/cdav/Mod_Cdav.php:838
+msgid "Description"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1052
-msgid "Flag as adult in album view"
+#: ../../Zotlabs/Module/Events.php:475
+msgid "Edit Location"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1071 ../../Zotlabs/Lib/ThreadItem.php:268
-msgid "I like this (toggle)"
+#: ../../Zotlabs/Module/Events.php:478 ../../Zotlabs/Module/Photos.php:1063
+#: ../../Zotlabs/Module/Webpages.php:252 ../../Zotlabs/Lib/ThreadItem.php:741
+#: ../../include/conversation.php:1280 ../../include/page_widgets.php:43
+msgid "Preview"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1072 ../../Zotlabs/Lib/ThreadItem.php:269
-msgid "I don't like this (toggle)"
+#: ../../Zotlabs/Module/Events.php:479 ../../include/conversation.php:1343
+msgid "Permission settings"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1073 ../../Zotlabs/Module/Blocks.php:161
-#: ../../Zotlabs/Module/Layouts.php:193 ../../Zotlabs/Module/Webpages.php:245
-#: ../../extend/addon/addon/cdav/include/widgets.php:123
-#: ../../include/conversation.php:1378
-msgid "Share"
+#: ../../Zotlabs/Module/Events.php:489
+msgid "Timezone:"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1074 ../../Zotlabs/Lib/ThreadItem.php:411
-#: ../../include/conversation.php:738
-msgid "Please wait"
+#: ../../Zotlabs/Module/Events.php:494
+msgid "Advanced Options"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1090 ../../Zotlabs/Module/Photos.php:1208
-#: ../../Zotlabs/Lib/ThreadItem.php:728
-msgid "This is you"
+#: ../../Zotlabs/Module/Events.php:605 ../../Zotlabs/Module/Cal.php:264
+msgid "l, F j"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1092 ../../Zotlabs/Module/Photos.php:1210
-#: ../../Zotlabs/Lib/ThreadItem.php:730 ../../include/js_strings.php:6
-msgid "Comment"
+#: ../../Zotlabs/Module/Events.php:633
+msgid "Edit event"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1094 ../../Zotlabs/Module/Events.php:478
-#: ../../Zotlabs/Module/Webpages.php:251 ../../Zotlabs/Lib/ThreadItem.php:740
-#: ../../include/conversation.php:1347 ../../include/page_widgets.php:43
-msgid "Preview"
+#: ../../Zotlabs/Module/Events.php:635
+msgid "Delete event"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1108 ../../include/conversation.php:577
-msgctxt "title"
-msgid "Likes"
+#: ../../Zotlabs/Module/Events.php:660 ../../Zotlabs/Module/Cal.php:313
+#: ../../include/text.php:1759
+msgid "Link to Source"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1108 ../../include/conversation.php:577
-msgctxt "title"
-msgid "Dislikes"
+#: ../../Zotlabs/Module/Events.php:669
+msgid "calendar"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1109 ../../include/conversation.php:578
-msgctxt "title"
-msgid "Agree"
+#: ../../Zotlabs/Module/Events.php:688 ../../Zotlabs/Module/Cal.php:336
+msgid "Edit Event"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1109 ../../include/conversation.php:578
-msgctxt "title"
-msgid "Disagree"
+#: ../../Zotlabs/Module/Events.php:688 ../../Zotlabs/Module/Cal.php:336
+msgid "Create Event"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1109 ../../include/conversation.php:578
-msgctxt "title"
-msgid "Abstain"
+#: ../../Zotlabs/Module/Events.php:689 ../../Zotlabs/Module/Events.php:698
+#: ../../Zotlabs/Module/Cal.php:337 ../../Zotlabs/Module/Cal.php:344
+#: ../../Zotlabs/Module/Photos.php:911 ../../addon/cdav/Mod_Cdav.php:846
+msgid "Previous"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1110 ../../include/conversation.php:579
-msgctxt "title"
-msgid "Attending"
+#: ../../Zotlabs/Module/Events.php:690 ../../Zotlabs/Module/Events.php:699
+#: ../../Zotlabs/Module/Setup.php:264 ../../Zotlabs/Module/Cal.php:338
+#: ../../Zotlabs/Module/Cal.php:345 ../../Zotlabs/Module/Photos.php:920
+#: ../../addon/cdav/Mod_Cdav.php:847
+msgid "Next"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1110 ../../include/conversation.php:579
-msgctxt "title"
-msgid "Not attending"
+#: ../../Zotlabs/Module/Events.php:691 ../../Zotlabs/Module/Cal.php:339
+#: ../../include/channel.php:1365
+msgid "Export"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1110 ../../include/conversation.php:579
-msgctxt "title"
-msgid "Might attend"
+#: ../../Zotlabs/Module/Events.php:695 ../../addon/cdav/Mod_Cdav.php:849
+msgid "Month"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1127 ../../Zotlabs/Module/Photos.php:1139
-#: ../../Zotlabs/Lib/ThreadItem.php:186 ../../Zotlabs/Lib/ThreadItem.php:198
-#: ../../include/conversation.php:1928
-msgid "View all"
+#: ../../Zotlabs/Module/Events.php:696 ../../addon/cdav/Mod_Cdav.php:850
+msgid "Week"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1131 ../../Zotlabs/Lib/ThreadItem.php:190
-#: ../../include/taxonomy.php:403 ../../include/conversation.php:1952
-#: ../../include/channel.php:1273
-msgctxt "noun"
-msgid "Like"
-msgid_plural "Likes"
-msgstr[0] ""
-msgstr[1] ""
+#: ../../Zotlabs/Module/Events.php:697 ../../addon/cdav/Mod_Cdav.php:851
+msgid "Day"
+msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1136 ../../Zotlabs/Lib/ThreadItem.php:195
-#: ../../include/conversation.php:1955
-msgctxt "noun"
-msgid "Dislike"
-msgid_plural "Dislikes"
-msgstr[0] ""
-msgstr[1] ""
+#: ../../Zotlabs/Module/Events.php:700 ../../Zotlabs/Module/Cal.php:346
+#: ../../addon/cdav/Mod_Cdav.php:848
+msgid "Today"
+msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1236
-msgid "Photo Tools"
+#: ../../Zotlabs/Module/Events.php:731
+msgid "Event removed"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1245
-msgid "In This Photo:"
+#: ../../Zotlabs/Module/Events.php:734
+msgid "Failed to remove event"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1250
-msgid "Map"
+#: ../../Zotlabs/Module/Appman.php:38 ../../Zotlabs/Module/Appman.php:55
+msgid "App installed."
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1258 ../../Zotlabs/Lib/ThreadItem.php:400
-msgctxt "noun"
-msgid "Likes"
+#: ../../Zotlabs/Module/Appman.php:48
+msgid "Malformed app."
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1259 ../../Zotlabs/Lib/ThreadItem.php:401
-msgctxt "noun"
-msgid "Dislikes"
+#: ../../Zotlabs/Module/Appman.php:111
+msgid "Embed code"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1264 ../../Zotlabs/Lib/ThreadItem.php:406
-#: ../../include/acl_selectors.php:220
-msgid "Close"
+#: ../../Zotlabs/Module/Appman.php:117
+msgid "Edit App"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1341
-msgid "View Album"
+#: ../../Zotlabs/Module/Appman.php:117
+msgid "Create App"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1352 ../../Zotlabs/Module/Photos.php:1365
-#: ../../Zotlabs/Module/Photos.php:1366
-msgid "Recent Photos"
+#: ../../Zotlabs/Module/Appman.php:122
+msgid "Name of app"
msgstr ""
-#: ../../Zotlabs/Module/Editpost.php:24 ../../Zotlabs/Module/Editblock.php:79
-#: ../../Zotlabs/Module/Editblock.php:95
-#: ../../Zotlabs/Module/Editlayout.php:79
-#: ../../Zotlabs/Module/Editwebpage.php:80
-msgid "Item not found"
+#: ../../Zotlabs/Module/Appman.php:123
+msgid "Location (URL) of app"
msgstr ""
-#: ../../Zotlabs/Module/Editpost.php:35
-msgid "Item is not editable"
+#: ../../Zotlabs/Module/Appman.php:125
+msgid "Photo icon URL"
msgstr ""
-#: ../../Zotlabs/Module/Editpost.php:108 ../../Zotlabs/Module/Rpost.php:138
-msgid "Edit post"
+#: ../../Zotlabs/Module/Appman.php:125
+msgid "80 x 80 pixels - optional"
msgstr ""
-#: ../../Zotlabs/Module/Acl.php:117 ../../Zotlabs/Module/Lockview.php:117
-#: ../../Zotlabs/Module/Lockview.php:153 ../../include/acl_selectors.php:183
-msgctxt "acl"
-msgid "Profile"
+#: ../../Zotlabs/Module/Appman.php:126
+msgid "Categories (optional, comma separated list)"
msgstr ""
-#: ../../Zotlabs/Module/Acl.php:344
-msgid "network"
+#: ../../Zotlabs/Module/Appman.php:127
+msgid "Version ID"
msgstr ""
-#: ../../Zotlabs/Module/Acl.php:354
-msgid "RSS"
+#: ../../Zotlabs/Module/Appman.php:128
+msgid "Price of app"
msgstr ""
-#: ../../Zotlabs/Module/Help.php:23
-msgid "Documentation Search"
+#: ../../Zotlabs/Module/Appman.php:129
+msgid "Location (URL) to purchase app"
msgstr ""
-#: ../../Zotlabs/Module/Help.php:80 ../../include/conversation.php:1827
-msgid "About"
+#: ../../Zotlabs/Module/Regmod.php:15
+msgid "Please login."
msgstr ""
-#: ../../Zotlabs/Module/Help.php:81 ../../Zotlabs/Module/Group.php:197
-msgid "Members"
+#: ../../Zotlabs/Module/Magic.php:71
+msgid "Hub not found."
msgstr ""
-#: ../../Zotlabs/Module/Help.php:82
-msgid "Administrators"
+#: ../../Zotlabs/Module/Subthread.php:87 ../../Zotlabs/Module/Tagger.php:47
+#: ../../Zotlabs/Module/Like.php:370
+#: ../../addon/redphotos/redphotohelper.php:71
+#: ../../addon/diaspora/inbound.php:1783 ../../include/conversation.php:116
+#: ../../include/text.php:1937
+msgid "photo"
msgstr ""
-#: ../../Zotlabs/Module/Help.php:83
-msgid "Developers"
+#: ../../Zotlabs/Module/Subthread.php:87 ../../Zotlabs/Module/Like.php:370
+#: ../../addon/diaspora/inbound.php:1783 ../../include/conversation.php:144
+#: ../../include/text.php:1943
+msgid "status"
msgstr ""
-#: ../../Zotlabs/Module/Help.php:84
-msgid "Tutorials"
+#: ../../Zotlabs/Module/Subthread.php:118
+#, php-format
+msgid "%1$s is following %2$s's %3$s"
msgstr ""
-#: ../../Zotlabs/Module/Help.php:93
-msgid "$Projectname Documentation"
+#: ../../Zotlabs/Module/Subthread.php:120
+#, php-format
+msgid "%1$s stopped following %2$s's %3$s"
msgstr ""
-#: ../../Zotlabs/Module/Help.php:94
-msgid "Contents"
+#: ../../Zotlabs/Module/Import_items.php:48 ../../Zotlabs/Module/Import.php:64
+msgid "Nothing to import."
msgstr ""
-#: ../../Zotlabs/Module/Bookmarks.php:53
-msgid "Bookmark added"
+#: ../../Zotlabs/Module/Import_items.php:72 ../../Zotlabs/Module/Import.php:79
+#: ../../Zotlabs/Module/Import.php:95
+msgid "Unable to download data from old server"
msgstr ""
-#: ../../Zotlabs/Module/Bookmarks.php:75
-msgid "My Bookmarks"
+#: ../../Zotlabs/Module/Import_items.php:77 ../../Zotlabs/Module/Import.php:102
+msgid "Imported file is empty."
msgstr ""
-#: ../../Zotlabs/Module/Bookmarks.php:86
-msgid "My Connections Bookmarks"
+#: ../../Zotlabs/Module/Import_items.php:93 ../../Zotlabs/Module/Import.php:121
+#, php-format
+msgid "Warning: Database versions differ by %1$d updates."
msgstr ""
-#: ../../Zotlabs/Module/Connect.php:61 ../../Zotlabs/Module/Connect.php:109
-msgid "Continue"
+#: ../../Zotlabs/Module/Import_items.php:108
+msgid "Import completed"
msgstr ""
-#: ../../Zotlabs/Module/Connect.php:90
-msgid "Premium Channel Setup"
+#: ../../Zotlabs/Module/Import_items.php:125
+msgid "Import Items"
msgstr ""
-#: ../../Zotlabs/Module/Connect.php:92
-msgid "Enable premium channel connection restrictions"
+#: ../../Zotlabs/Module/Import_items.php:126
+msgid "Use this form to import existing posts and content from an export file."
msgstr ""
-#: ../../Zotlabs/Module/Connect.php:93
-msgid ""
-"Please enter your restrictions or conditions, such as paypal receipt, usage "
-"guidelines, etc."
+#: ../../Zotlabs/Module/Import_items.php:127
+#: ../../Zotlabs/Module/Import.php:501
+msgid "File to Upload"
msgstr ""
-#: ../../Zotlabs/Module/Connect.php:95 ../../Zotlabs/Module/Connect.php:115
-msgid ""
-"This channel may require additional steps or acknowledgement of the "
-"following conditions prior to connecting:"
+#: ../../Zotlabs/Module/New_channel.php:121 ../../Zotlabs/Module/Manage.php:136
+#, php-format
+msgid "You have created %1$.0f of %2$.0f allowed channels."
msgstr ""
-#: ../../Zotlabs/Module/Connect.php:96
-msgid ""
-"Potential connections will then see the following text before proceeding:"
+#: ../../Zotlabs/Module/New_channel.php:134
+#: ../../Zotlabs/Module/Register.php:237
+msgid "Name or caption"
msgstr ""
-#: ../../Zotlabs/Module/Connect.php:97 ../../Zotlabs/Module/Connect.php:118
+#: ../../Zotlabs/Module/New_channel.php:134
+#: ../../Zotlabs/Module/Register.php:237
msgid ""
-"By continuing, I certify that I have complied with any instructions provided "
-"on this page."
+"Examples: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \"Aviation "
+"Group\""
msgstr ""
-#: ../../Zotlabs/Module/Connect.php:106
-msgid "(No specific instructions have been provided by the channel owner.)"
+#: ../../Zotlabs/Module/New_channel.php:136
+#: ../../Zotlabs/Module/Register.php:239
+msgid "Choose a short nickname"
msgstr ""
-#: ../../Zotlabs/Module/Connect.php:114
-msgid "Restricted or Premium Channel"
+#: ../../Zotlabs/Module/New_channel.php:136
+#: ../../Zotlabs/Module/Register.php:239
+#, php-format
+msgid ""
+"Your nickname will be used to create an easy to remember channel address e."
+"g. nickname%s"
msgstr ""
-#: ../../Zotlabs/Module/Admin.php:94
-msgid "# Accounts"
+#: ../../Zotlabs/Module/New_channel.php:137
+#: ../../Zotlabs/Module/Register.php:240
+msgid "Channel role and privacy"
msgstr ""
-#: ../../Zotlabs/Module/Admin.php:95
-msgid "# blocked accounts"
+#: ../../Zotlabs/Module/New_channel.php:137
+#: ../../Zotlabs/Module/Register.php:240
+msgid "Select a channel role with your privacy requirements."
msgstr ""
-#: ../../Zotlabs/Module/Admin.php:96
-msgid "# expired accounts"
+#: ../../Zotlabs/Module/New_channel.php:137
+#: ../../Zotlabs/Module/Register.php:240
+msgid "Read more about roles"
msgstr ""
-#: ../../Zotlabs/Module/Admin.php:97
-msgid "# expiring accounts"
+#: ../../Zotlabs/Module/New_channel.php:140
+msgid "Create Channel"
msgstr ""
-#: ../../Zotlabs/Module/Admin.php:108
-msgid "# Channels"
+#: ../../Zotlabs/Module/New_channel.php:141
+msgid ""
+"A channel is your identity on this network. It can represent a person, a "
+"blog, or a forum to name a few. Channels can make connections with other "
+"channels to share information with highly detailed permissions."
msgstr ""
-#: ../../Zotlabs/Module/Admin.php:109
-msgid "# primary"
+#: ../../Zotlabs/Module/New_channel.php:142
+msgid ""
+"or <a href=\"import\">import an existing channel</a> from another location."
msgstr ""
-#: ../../Zotlabs/Module/Admin.php:110
-msgid "# clones"
+#: ../../Zotlabs/Module/Removeme.php:35
+msgid ""
+"Channel removals are not allowed within 48 hours of changing the account "
+"password."
msgstr ""
-#: ../../Zotlabs/Module/Admin.php:116
-msgid "Message queues"
+#: ../../Zotlabs/Module/Removeme.php:60
+msgid "Remove This Channel"
msgstr ""
-#: ../../Zotlabs/Module/Admin.php:133
-msgid "Your software should be updated"
+#: ../../Zotlabs/Module/Removeme.php:61
+#: ../../Zotlabs/Module/Removeaccount.php:58
+msgid "WARNING: "
msgstr ""
-#: ../../Zotlabs/Module/Admin.php:137 ../../Zotlabs/Module/Admin/Logs.php:82
-#: ../../Zotlabs/Module/Admin/Security.php:86
-#: ../../Zotlabs/Module/Admin/Themes.php:120
-#: ../../Zotlabs/Module/Admin/Themes.php:154
-#: ../../Zotlabs/Module/Admin/Accounts.php:164
-#: ../../Zotlabs/Module/Admin/Channels.php:145
-#: ../../Zotlabs/Module/Admin/Site.php:258
-#: ../../Zotlabs/Module/Admin/Plugins.php:336
-#: ../../Zotlabs/Module/Admin/Plugins.php:431
-msgid "Administration"
+#: ../../Zotlabs/Module/Removeme.php:61
+msgid "This channel will be completely removed from the network. "
msgstr ""
-#: ../../Zotlabs/Module/Admin.php:138
-msgid "Summary"
+#: ../../Zotlabs/Module/Removeme.php:61
+#: ../../Zotlabs/Module/Removeaccount.php:58
+msgid "This action is permanent and can not be undone!"
msgstr ""
-#: ../../Zotlabs/Module/Admin.php:141
-msgid "Registered accounts"
+#: ../../Zotlabs/Module/Removeme.php:62
+#: ../../Zotlabs/Module/Removeaccount.php:59
+msgid "Please enter your password for verification:"
msgstr ""
-#: ../../Zotlabs/Module/Admin.php:142
-msgid "Pending registrations"
+#: ../../Zotlabs/Module/Removeme.php:63
+msgid "Remove this channel and all its clones from the network"
msgstr ""
-#: ../../Zotlabs/Module/Admin.php:143
-msgid "Registered channels"
+#: ../../Zotlabs/Module/Removeme.php:63
+msgid ""
+"By default only the instance of the channel located on this hub will be "
+"removed from the network"
msgstr ""
-#: ../../Zotlabs/Module/Admin.php:144
-msgid "Active plugins"
+#: ../../Zotlabs/Module/Removeme.php:64
+#: ../../Zotlabs/Module/Settings/Channel.php:575
+msgid "Remove Channel"
msgstr ""
-#: ../../Zotlabs/Module/Admin.php:145
-msgid "Version"
+#: ../../Zotlabs/Module/Sharedwithme.php:99
+msgid "Files: shared with me"
msgstr ""
-#: ../../Zotlabs/Module/Admin.php:146
-msgid "Repository version (master)"
+#: ../../Zotlabs/Module/Sharedwithme.php:100
+#: ../../Zotlabs/Module/Admin/Channels.php:159
+#: ../../Zotlabs/Module/Settings/Oauth.php:89
+#: ../../Zotlabs/Module/Settings/Oauth.php:115
+#: ../../Zotlabs/Module/Wiki.php:172 ../../Zotlabs/Module/Connedit.php:902
+#: ../../Zotlabs/Module/Chat.php:249 ../../Zotlabs/Lib/NativeWikiPage.php:539
+#: ../../Zotlabs/Storage/Browser.php:233
+#: ../../Zotlabs/Widget/Wiki_page_history.php:22
+#: ../../addon/rendezvous/rendezvous.php:172 ../../addon/cdav/Mod_Cdav.php:1136
+#: ../../addon/gitwiki/Mod_Gitwiki.php:158
+msgid "Name"
msgstr ""
-#: ../../Zotlabs/Module/Admin.php:147
-msgid "Repository version (dev)"
+#: ../../Zotlabs/Module/Sharedwithme.php:101
+msgid "NEW"
msgstr ""
-#: ../../Zotlabs/Module/Editblock.php:108 ../../Zotlabs/Module/Blocks.php:97
-#: ../../Zotlabs/Module/Blocks.php:155
-msgid "Block Name"
+#: ../../Zotlabs/Module/Sharedwithme.php:102
+#: ../../Zotlabs/Storage/Browser.php:235 ../../include/text.php:1409
+msgid "Size"
msgstr ""
-#: ../../Zotlabs/Module/Editblock.php:111
-#: ../../Zotlabs/Module/Editwebpage.php:146 ../../Zotlabs/Module/Mail.php:287
-#: ../../Zotlabs/Module/Mail.php:412 ../../Zotlabs/Module/Chat.php:207
-#: ../../include/conversation.php:1295
-msgid "Insert web link"
+#: ../../Zotlabs/Module/Sharedwithme.php:103
+#: ../../Zotlabs/Storage/Browser.php:236
+msgid "Last Modified"
msgstr ""
-#: ../../Zotlabs/Module/Editblock.php:124 ../../include/conversation.php:1406
-msgid "Title (optional)"
+#: ../../Zotlabs/Module/Sharedwithme.php:104
+msgid "Remove all files"
msgstr ""
-#: ../../Zotlabs/Module/Editblock.php:133
-msgid "Edit Block"
+#: ../../Zotlabs/Module/Sharedwithme.php:105
+msgid "Remove this file"
msgstr ""
-#: ../../Zotlabs/Module/Page.php:40 ../../Zotlabs/Module/Block.php:31
-msgid "Invalid item."
+#: ../../Zotlabs/Module/Setup.php:176
+msgid "$Projectname Server - Setup"
msgstr ""
-#: ../../Zotlabs/Module/Page.php:56 ../../Zotlabs/Module/Cal.php:62
-#: ../../Zotlabs/Module/Block.php:43 ../../Zotlabs/Module/Chanview.php:96
-#: ../../Zotlabs/Module/Wall_upload.php:31
-msgid "Channel not found."
+#: ../../Zotlabs/Module/Setup.php:180
+msgid "Could not connect to database."
msgstr ""
-#: ../../Zotlabs/Module/Page.php:131
+#: ../../Zotlabs/Module/Setup.php:184
msgid ""
-"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod "
-"tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, "
-"quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo "
-"consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse "
-"cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat "
-"non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
+"Could not connect to specified site URL. Possible SSL certificate or DNS "
+"issue."
msgstr ""
-#: ../../Zotlabs/Module/Filer.php:52
-msgid "Save to Folder:"
+#: ../../Zotlabs/Module/Setup.php:191
+msgid "Could not create table."
msgstr ""
-#: ../../Zotlabs/Module/Filer.php:52
-msgid "- select -"
+#: ../../Zotlabs/Module/Setup.php:196
+msgid "Your site database has been installed."
msgstr ""
-#: ../../Zotlabs/Module/Filer.php:53 ../../Zotlabs/Module/Admin/Profs.php:74
-#: ../../Zotlabs/Module/Admin/Profs.php:94 ../../Zotlabs/Module/Rbmark.php:32
-#: ../../Zotlabs/Module/Rbmark.php:104 ../../include/widgets.php:202
-#: ../../include/text.php:1005 ../../include/text.php:1017
-msgid "Save"
+#: ../../Zotlabs/Module/Setup.php:200
+msgid ""
+"You may need to import the file \"install/schema_xxx.sql\" manually using a "
+"database client."
msgstr ""
-#: ../../Zotlabs/Module/Ping.php:254
-msgid "sent you a private message"
+#: ../../Zotlabs/Module/Setup.php:201 ../../Zotlabs/Module/Setup.php:263
+#: ../../Zotlabs/Module/Setup.php:748
+msgid "Please see the file \"install/INSTALL.txt\"."
msgstr ""
-#: ../../Zotlabs/Module/Ping.php:302
-msgid "added your channel"
+#: ../../Zotlabs/Module/Setup.php:260
+msgid "System check"
msgstr ""
-#: ../../Zotlabs/Module/Ping.php:312
-msgid "g A l F d"
+#: ../../Zotlabs/Module/Setup.php:265
+msgid "Check again"
msgstr ""
-#: ../../Zotlabs/Module/Ping.php:330
-msgid "[today]"
+#: ../../Zotlabs/Module/Setup.php:287
+msgid "Database connection"
msgstr ""
-#: ../../Zotlabs/Module/Ping.php:339
-msgid "posted an event"
+#: ../../Zotlabs/Module/Setup.php:288
+msgid ""
+"In order to install $Projectname we need to know how to connect to your "
+"database."
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:56
-#: ../../Zotlabs/Module/Connections.php:161
-#: ../../Zotlabs/Module/Connections.php:250
-msgid "Blocked"
+#: ../../Zotlabs/Module/Setup.php:289
+msgid ""
+"Please contact your hosting provider or site administrator if you have "
+"questions about these settings."
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:61
-#: ../../Zotlabs/Module/Connections.php:168
-#: ../../Zotlabs/Module/Connections.php:249
-msgid "Ignored"
+#: ../../Zotlabs/Module/Setup.php:290
+msgid ""
+"The database you specify below should already exist. If it does not, please "
+"create it before continuing."
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:66
-#: ../../Zotlabs/Module/Connections.php:182
-#: ../../Zotlabs/Module/Connections.php:248
-msgid "Hidden"
+#: ../../Zotlabs/Module/Setup.php:294
+msgid "Database Server Name"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:71
-#: ../../Zotlabs/Module/Connections.php:175
-#: ../../Zotlabs/Module/Connections.php:247
-msgid "Archived"
+#: ../../Zotlabs/Module/Setup.php:294
+msgid "Default is 127.0.0.1"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:76
-#: ../../Zotlabs/Module/Connections.php:86 ../../Zotlabs/Module/Menu.php:116
-#: ../../include/conversation.php:1724
-msgid "New"
+#: ../../Zotlabs/Module/Setup.php:295
+msgid "Database Port"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:92
-#: ../../Zotlabs/Module/Connections.php:107
-#: ../../Zotlabs/Module/Connedit.php:674 ../../include/widgets.php:544
-msgid "All"
+#: ../../Zotlabs/Module/Setup.php:295
+msgid "Communication port number - use 0 for default"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:138
-msgid "New Connections"
+#: ../../Zotlabs/Module/Setup.php:296
+msgid "Database Login Name"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:141
-msgid "Show pending (new) connections"
+#: ../../Zotlabs/Module/Setup.php:297
+msgid "Database Login Password"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:145
-#: ../../Zotlabs/Module/Profperm.php:140
-msgid "All Connections"
+#: ../../Zotlabs/Module/Setup.php:298
+msgid "Database Name"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:148
-msgid "Show all connections"
+#: ../../Zotlabs/Module/Setup.php:299
+msgid "Database Type"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:164
-msgid "Only show blocked connections"
+#: ../../Zotlabs/Module/Setup.php:301 ../../Zotlabs/Module/Setup.php:347
+msgid "Site administrator email address"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:171
-msgid "Only show ignored connections"
+#: ../../Zotlabs/Module/Setup.php:301 ../../Zotlabs/Module/Setup.php:347
+msgid ""
+"Your account email address must match this in order to use the web admin "
+"panel."
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:178
-msgid "Only show archived connections"
+#: ../../Zotlabs/Module/Setup.php:302 ../../Zotlabs/Module/Setup.php:349
+msgid "Website URL"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:185
-msgid "Only show hidden connections"
+#: ../../Zotlabs/Module/Setup.php:302 ../../Zotlabs/Module/Setup.php:349
+msgid "Please use SSL (https) URL if available."
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:246
-msgid "Pending approval"
+#: ../../Zotlabs/Module/Setup.php:303 ../../Zotlabs/Module/Setup.php:353
+msgid "Please select a default timezone for your website"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:262
-#, php-format
-msgid "%1$s [%2$s]"
+#: ../../Zotlabs/Module/Setup.php:328 ../../Zotlabs/Module/Admin/Site.php:258
+msgid "Basic/Minimal Social Networking"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:263
-msgid "Edit connection"
+#: ../../Zotlabs/Module/Setup.php:329 ../../Zotlabs/Module/Admin/Site.php:259
+msgid "Standard Configuration (default)"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:264
-msgid "Delete connection"
+#: ../../Zotlabs/Module/Setup.php:330 ../../Zotlabs/Module/Admin/Site.php:260
+msgid "Professional"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:273
-msgid "Channel address"
+#: ../../Zotlabs/Module/Setup.php:336
+msgid "Site settings"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:275
-msgid "Network"
+#: ../../Zotlabs/Module/Setup.php:351 ../../Zotlabs/Module/Admin/Site.php:289
+msgid "Server Configuration/Role"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:278
-msgid "Call"
+#: ../../Zotlabs/Module/Setup.php:392
+msgid "PHP version 5.5 or greater is required."
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:280
-msgid "Status"
+#: ../../Zotlabs/Module/Setup.php:393
+msgid "PHP version"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:282
-msgid "Connected"
+#: ../../Zotlabs/Module/Setup.php:409
+msgid "Could not find a command line version of PHP in the web server PATH."
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:284
-msgid "Approve connection"
+#: ../../Zotlabs/Module/Setup.php:410
+msgid ""
+"If you don't have a command line version of PHP installed on server, you "
+"will not be able to run background polling via cron."
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:285
-#: ../../Zotlabs/Module/Admin/Accounts.php:171
-msgid "Approve"
+#: ../../Zotlabs/Module/Setup.php:414
+msgid "PHP executable path"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:286
-msgid "Ignore connection"
+#: ../../Zotlabs/Module/Setup.php:414
+msgid ""
+"Enter full path to php executable. You can leave this blank to continue the "
+"installation."
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:287
-#: ../../Zotlabs/Module/Connedit.php:602
-msgid "Ignore"
+#: ../../Zotlabs/Module/Setup.php:419
+msgid "Command line PHP"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:288
-msgid "Recent activity"
+#: ../../Zotlabs/Module/Setup.php:429
+msgid ""
+"Unable to check command line PHP, as shell_exec() is disabled. This is "
+"required."
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:312 ../../Zotlabs/Lib/Apps.php:216
-#: ../../include/text.php:934 ../../include/nav.php:203
-msgid "Connections"
+#: ../../Zotlabs/Module/Setup.php:432
+msgid ""
+"The command line version of PHP on your system does not have "
+"\"register_argc_argv\" enabled."
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:316 ../../Zotlabs/Module/Search.php:44
-#: ../../Zotlabs/Lib/Apps.php:237 ../../include/acl_selectors.php:213
-#: ../../include/widgets.php:316 ../../include/text.php:1004
-#: ../../include/text.php:1016 ../../include/nav.php:180
-msgid "Search"
+#: ../../Zotlabs/Module/Setup.php:433
+msgid "This is required for message delivery to work."
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:317
-msgid "Search your connections"
+#: ../../Zotlabs/Module/Setup.php:436
+msgid "PHP register_argc_argv"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:318
-msgid "Connections search"
+#: ../../Zotlabs/Module/Setup.php:454
+#, php-format
+msgid ""
+"Your max allowed total upload size is set to %s. Maximum size of one file to "
+"upload is set to %s. You are allowed to upload up to %d files at once."
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:319
-#: ../../Zotlabs/Module/Directory.php:392
-#: ../../Zotlabs/Module/Directory.php:397 ../../include/contact_widgets.php:23
-msgid "Find"
+#: ../../Zotlabs/Module/Setup.php:459
+msgid "You can adjust these settings in the server php.ini file."
msgstr ""
-#: ../../Zotlabs/Module/Cover_photo.php:58
-#: ../../Zotlabs/Module/Profile_photo.php:61
-msgid "Image uploaded but image cropping failed."
+#: ../../Zotlabs/Module/Setup.php:461
+msgid "PHP upload limits"
msgstr ""
-#: ../../Zotlabs/Module/Cover_photo.php:134
-#: ../../Zotlabs/Module/Cover_photo.php:181
-msgid "Cover Photos"
+#: ../../Zotlabs/Module/Setup.php:484
+msgid ""
+"Error: the \"openssl_pkey_new\" function on this system is not able to "
+"generate encryption keys"
msgstr ""
-#: ../../Zotlabs/Module/Cover_photo.php:154
-#: ../../Zotlabs/Module/Profile_photo.php:135
-msgid "Image resize failed."
+#: ../../Zotlabs/Module/Setup.php:485
+msgid ""
+"If running under Windows, please see \"http://www.php.net/manual/en/openssl."
+"installation.php\"."
msgstr ""
-#: ../../Zotlabs/Module/Cover_photo.php:168
-#: ../../Zotlabs/Module/Profile_photo.php:197 ../../include/photos.php:149
-msgid "Unable to process image"
+#: ../../Zotlabs/Module/Setup.php:488
+msgid "Generate encryption keys"
msgstr ""
-#: ../../Zotlabs/Module/Cover_photo.php:192
-#: ../../Zotlabs/Module/Profile_photo.php:232
-msgid "Image upload failed."
+#: ../../Zotlabs/Module/Setup.php:505
+msgid "libCurl PHP module"
msgstr ""
-#: ../../Zotlabs/Module/Cover_photo.php:210
-#: ../../Zotlabs/Module/Profile_photo.php:251
-msgid "Unable to process image."
+#: ../../Zotlabs/Module/Setup.php:506
+msgid "GD graphics PHP module"
msgstr ""
-#: ../../Zotlabs/Module/Cover_photo.php:233 ../../include/items.php:4276
-msgid "female"
+#: ../../Zotlabs/Module/Setup.php:507
+msgid "OpenSSL PHP module"
msgstr ""
-#: ../../Zotlabs/Module/Cover_photo.php:234 ../../include/items.php:4277
-#, php-format
-msgid "%1$s updated her %2$s"
+#: ../../Zotlabs/Module/Setup.php:508
+msgid "PDO database PHP module"
msgstr ""
-#: ../../Zotlabs/Module/Cover_photo.php:235 ../../include/items.php:4278
-msgid "male"
+#: ../../Zotlabs/Module/Setup.php:509
+msgid "mb_string PHP module"
msgstr ""
-#: ../../Zotlabs/Module/Cover_photo.php:236 ../../include/items.php:4279
-#, php-format
-msgid "%1$s updated his %2$s"
+#: ../../Zotlabs/Module/Setup.php:510
+msgid "xml PHP module"
msgstr ""
-#: ../../Zotlabs/Module/Cover_photo.php:238 ../../include/items.php:4281
-#, php-format
-msgid "%1$s updated their %2$s"
+#: ../../Zotlabs/Module/Setup.php:514 ../../Zotlabs/Module/Setup.php:516
+msgid "Apache mod_rewrite module"
msgstr ""
-#: ../../Zotlabs/Module/Cover_photo.php:240 ../../include/channel.php:1764
-msgid "cover photo"
+#: ../../Zotlabs/Module/Setup.php:514
+msgid ""
+"Error: Apache webserver mod-rewrite module is required but not installed."
msgstr ""
-#: ../../Zotlabs/Module/Cover_photo.php:303
-#: ../../Zotlabs/Module/Cover_photo.php:318
-#: ../../Zotlabs/Module/Profile_photo.php:312
-#: ../../Zotlabs/Module/Profile_photo.php:354
-msgid "Photo not available."
+#: ../../Zotlabs/Module/Setup.php:520 ../../Zotlabs/Module/Setup.php:523
+msgid "exec"
msgstr ""
-#: ../../Zotlabs/Module/Cover_photo.php:354
-#: ../../Zotlabs/Module/Profile_photo.php:409
-msgid "Upload File:"
+#: ../../Zotlabs/Module/Setup.php:520
+msgid ""
+"Error: exec is required but is either not installed or has been disabled in "
+"php.ini"
msgstr ""
-#: ../../Zotlabs/Module/Cover_photo.php:355
-#: ../../Zotlabs/Module/Profile_photo.php:410
-msgid "Select a profile:"
+#: ../../Zotlabs/Module/Setup.php:526 ../../Zotlabs/Module/Setup.php:529
+msgid "shell_exec"
msgstr ""
-#: ../../Zotlabs/Module/Cover_photo.php:356
-msgid "Upload Cover Photo"
+#: ../../Zotlabs/Module/Setup.php:526
+msgid ""
+"Error: shell_exec is required but is either not installed or has been "
+"disabled in php.ini"
msgstr ""
-#: ../../Zotlabs/Module/Cover_photo.php:361
-#: ../../Zotlabs/Module/Profile_photo.php:418
-#: ../../Zotlabs/Module/Settings/Channel.php:404
-msgid "or"
+#: ../../Zotlabs/Module/Setup.php:534
+msgid "Error: libCURL PHP module required but not installed."
msgstr ""
-#: ../../Zotlabs/Module/Cover_photo.php:361
-#: ../../Zotlabs/Module/Profile_photo.php:418
-msgid "skip this step"
+#: ../../Zotlabs/Module/Setup.php:538
+msgid ""
+"Error: GD graphics PHP module with JPEG support required but not installed."
msgstr ""
-#: ../../Zotlabs/Module/Cover_photo.php:361
-#: ../../Zotlabs/Module/Profile_photo.php:418
-msgid "select a photo from your photo albums"
+#: ../../Zotlabs/Module/Setup.php:542
+msgid "Error: openssl PHP module required but not installed."
msgstr ""
-#: ../../Zotlabs/Module/Cover_photo.php:377
-#: ../../Zotlabs/Module/Profile_photo.php:437
-msgid "Crop Image"
+#: ../../Zotlabs/Module/Setup.php:546
+msgid "Error: PDO database PHP module required but not installed."
msgstr ""
-#: ../../Zotlabs/Module/Cover_photo.php:378
-#: ../../Zotlabs/Module/Profile_photo.php:438
-msgid "Please adjust the image cropping for optimum viewing."
+#: ../../Zotlabs/Module/Setup.php:550
+msgid "Error: mb_string PHP module required but not installed."
msgstr ""
-#: ../../Zotlabs/Module/Cover_photo.php:380
-#: ../../Zotlabs/Module/Profile_photo.php:440
-msgid "Done Editing"
+#: ../../Zotlabs/Module/Setup.php:554
+msgid "Error: xml PHP module required for DAV but not installed."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Features.php:55
-#: ../../Zotlabs/Module/Admin/Features.php:56
-#: ../../Zotlabs/Module/Settings/Features.php:38
-msgid "Off"
+#: ../../Zotlabs/Module/Setup.php:572
+msgid ""
+"The web installer needs to be able to create a file called \".htconfig.php\" "
+"in the top folder of your web server and it is unable to do so."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Features.php:55
-#: ../../Zotlabs/Module/Admin/Features.php:56
-#: ../../Zotlabs/Module/Settings/Features.php:38
-msgid "On"
+#: ../../Zotlabs/Module/Setup.php:573
+msgid ""
+"This is most often a permission setting, as the web server may not be able "
+"to write files in your folder - even if you can."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Features.php:56
-#, php-format
-msgid "Lock feature %s"
+#: ../../Zotlabs/Module/Setup.php:574
+msgid ""
+"At the end of this procedure, we will give you a text to save in a file "
+"named .htconfig.php in your Red top folder."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Features.php:64
-msgid "Manage Additional Features"
+#: ../../Zotlabs/Module/Setup.php:575
+msgid ""
+"You can alternatively skip this procedure and perform a manual installation. "
+"Please see the file \"install/INSTALL.txt\" for instructions."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Logs.php:28
-msgid "Log settings updated."
+#: ../../Zotlabs/Module/Setup.php:578
+msgid ".htconfig.php is writable"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Logs.php:83 ../../include/widgets.php:1618
-#: ../../include/widgets.php:1628
-msgid "Logs"
+#: ../../Zotlabs/Module/Setup.php:592
+msgid ""
+"This software uses the Smarty3 template engine to render its web views. "
+"Smarty3 compiles templates to PHP to speed up rendering."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Logs.php:85
-msgid "Clear"
+#: ../../Zotlabs/Module/Setup.php:593
+#, php-format
+msgid ""
+"In order to store these compiled templates, the web server needs to have "
+"write access to the directory %s under the top level web folder."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Logs.php:91
-msgid "Debugging"
+#: ../../Zotlabs/Module/Setup.php:594 ../../Zotlabs/Module/Setup.php:615
+msgid ""
+"Please ensure that the user that your web server runs as (e.g. www-data) has "
+"write access to this folder."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Logs.php:92
-msgid "Log file"
+#: ../../Zotlabs/Module/Setup.php:595
+#, php-format
+msgid ""
+"Note: as a security measure, you should give the web server write access to "
+"%s only--not the template files (.tpl) that it contains."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Logs.php:92
+#: ../../Zotlabs/Module/Setup.php:598
+#, php-format
+msgid "%s is writable"
+msgstr ""
+
+#: ../../Zotlabs/Module/Setup.php:614
msgid ""
-"Must be writable by web server. Relative to your top-level webserver "
-"directory."
+"This software uses the store directory to save uploaded files. The web "
+"server needs to have write access to the store directory under the top level "
+"web folder"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Logs.php:93
-msgid "Log level"
+#: ../../Zotlabs/Module/Setup.php:618
+msgid "store is writable"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Profs.php:69
-msgid "New Profile Field"
+#: ../../Zotlabs/Module/Setup.php:650
+msgid ""
+"SSL certificate cannot be validated. Fix certificate or disable https access "
+"to this site."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Profs.php:70
-#: ../../Zotlabs/Module/Admin/Profs.php:90
-msgid "Field nickname"
+#: ../../Zotlabs/Module/Setup.php:651
+msgid ""
+"If you have https access to your website or allow connections to TCP port "
+"443 (the https: port), you MUST use a browser-valid certificate. You MUST "
+"NOT use self-signed certificates!"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Profs.php:70
-#: ../../Zotlabs/Module/Admin/Profs.php:90
-msgid "System name of field"
+#: ../../Zotlabs/Module/Setup.php:652
+msgid ""
+"This restriction is incorporated because public posts from you may for "
+"example contain references to images on your own hub."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Profs.php:71
-#: ../../Zotlabs/Module/Admin/Profs.php:91
-msgid "Input type"
+#: ../../Zotlabs/Module/Setup.php:653
+msgid ""
+"If your certificate is not recognized, members of other sites (who may "
+"themselves have valid certificates) will get a warning message on their own "
+"site complaining about security issues."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Profs.php:72
-#: ../../Zotlabs/Module/Admin/Profs.php:92
-msgid "Field Name"
+#: ../../Zotlabs/Module/Setup.php:654
+msgid ""
+"This can cause usability issues elsewhere (not just on your own site) so we "
+"must insist on this requirement."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Profs.php:72
-#: ../../Zotlabs/Module/Admin/Profs.php:92
-msgid "Label on profile pages"
+#: ../../Zotlabs/Module/Setup.php:655
+msgid ""
+"Providers are available that issue free certificates which are browser-valid."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Profs.php:73
-#: ../../Zotlabs/Module/Admin/Profs.php:93
-msgid "Help text"
+#: ../../Zotlabs/Module/Setup.php:657
+msgid ""
+"If you are confident that the certificate is valid and signed by a trusted "
+"authority, check to see if you have failed to install an intermediate cert. "
+"These are not normally required by browsers, but are required for server-to-"
+"server communications."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Profs.php:73
-#: ../../Zotlabs/Module/Admin/Profs.php:93
-msgid "Additional info (optional)"
+#: ../../Zotlabs/Module/Setup.php:659
+msgid "SSL certificate validation"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Profs.php:83
-msgid "Field definition not found"
+#: ../../Zotlabs/Module/Setup.php:665
+msgid ""
+"Url rewrite in .htaccess is not working. Check your server configuration."
+"Test: "
msgstr ""
-#: ../../Zotlabs/Module/Admin/Profs.php:89
-msgid "Edit Profile Field"
+#: ../../Zotlabs/Module/Setup.php:668
+msgid "Url rewrite is working"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Profs.php:147 ../../include/widgets.php:1599
-msgid "Profile Fields"
+#: ../../Zotlabs/Module/Setup.php:682
+msgid ""
+"The database configuration file \".htconfig.php\" could not be written. "
+"Please use the enclosed text to create a configuration file in your web "
+"server root."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Profs.php:148
-msgid "Basic Profile Fields"
+#: ../../Zotlabs/Module/Setup.php:706 ../../addon/rendezvous/rendezvous.php:401
+#: ../../addon/cdav/cdav.php:41
+msgid "Errors encountered creating database tables."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Profs.php:149
-msgid "Advanced Profile Fields"
+#: ../../Zotlabs/Module/Setup.php:746
+msgid "<h1>What next</h1>"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Profs.php:149
-msgid "(In addition to basic fields)"
+#: ../../Zotlabs/Module/Setup.php:747
+msgid ""
+"IMPORTANT: You will need to [manually] setup a scheduled task for the poller."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Profs.php:151
-msgid "All available fields"
+#: ../../Zotlabs/Module/Connect.php:61 ../../Zotlabs/Module/Connect.php:109
+msgid "Continue"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Profs.php:152
-msgid "Custom Fields"
+#: ../../Zotlabs/Module/Connect.php:90
+msgid "Premium Channel Setup"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Profs.php:156
-msgid "Create Custom Field"
+#: ../../Zotlabs/Module/Connect.php:92
+msgid "Enable premium channel connection restrictions"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Security.php:77
+#: ../../Zotlabs/Module/Connect.php:93
msgid ""
-"By default, unfiltered HTML is allowed in embedded media. This is inherently "
-"insecure."
+"Please enter your restrictions or conditions, such as paypal receipt, usage "
+"guidelines, etc."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Security.php:80
+#: ../../Zotlabs/Module/Connect.php:95 ../../Zotlabs/Module/Connect.php:115
msgid ""
-"The recommended setting is to only allow unfiltered HTML from the following "
-"sites:"
+"This channel may require additional steps or acknowledgement of the "
+"following conditions prior to connecting:"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Security.php:81
+#: ../../Zotlabs/Module/Connect.php:96
msgid ""
-"https://youtube.com/<br />https://www.youtube.com/<br />https://youtu.be/"
-"<br />https://vimeo.com/<br />https://soundcloud.com/<br />"
+"Potential connections will then see the following text before proceeding:"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Security.php:82
+#: ../../Zotlabs/Module/Connect.php:97 ../../Zotlabs/Module/Connect.php:118
msgid ""
-"All other embedded content will be filtered, <strong>unless</strong> "
-"embedded content from that site is explicitly blocked."
+"By continuing, I certify that I have complied with any instructions provided "
+"on this page."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Security.php:87 ../../include/widgets.php:1594
-msgid "Security"
+#: ../../Zotlabs/Module/Connect.php:106
+msgid "(No specific instructions have been provided by the channel owner.)"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Security.php:89
-msgid "Block public"
+#: ../../Zotlabs/Module/Connect.php:114
+msgid "Restricted or Premium Channel"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Security.php:89
-msgid ""
-"Check to block public access to all otherwise public personal pages on this "
-"site unless you are currently authenticated."
+#: ../../Zotlabs/Module/Admin/Queue.php:35
+msgid "Queue Statistics"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Security.php:90
-msgid "Set \"Transport Security\" HTTP header"
+#: ../../Zotlabs/Module/Admin/Queue.php:36
+msgid "Total Entries"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Security.php:91
-msgid "Set \"Content Security Policy\" HTTP header"
+#: ../../Zotlabs/Module/Admin/Queue.php:37
+msgid "Priority"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Security.php:92
-msgid "Allowed email domains"
+#: ../../Zotlabs/Module/Admin/Queue.php:38
+msgid "Destination URL"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Security.php:92
-msgid ""
-"Comma separated list of domains which are allowed in email addresses for "
-"registrations to this site. Wildcards are accepted. Empty to allow any "
-"domains"
+#: ../../Zotlabs/Module/Admin/Queue.php:39
+msgid "Mark hub permanently offline"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Security.php:93
-msgid "Not allowed email domains"
+#: ../../Zotlabs/Module/Admin/Queue.php:40
+msgid "Empty queue for this hub"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Security.php:93
-msgid ""
-"Comma separated list of domains which are not allowed in email addresses for "
-"registrations to this site. Wildcards are accepted. Empty to allow any "
-"domains, unless allowed domains have been defined."
+#: ../../Zotlabs/Module/Admin/Queue.php:41
+msgid "Last known contact"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Security.php:94
-msgid "Allow communications only from these sites"
+#: ../../Zotlabs/Module/Admin/Features.php:55
+#: ../../Zotlabs/Module/Admin/Features.php:56
+#: ../../Zotlabs/Module/Settings/Features.php:38
+msgid "Off"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Security.php:94
-msgid ""
-"One site per line. Leave empty to allow communication from anywhere by "
-"default"
+#: ../../Zotlabs/Module/Admin/Features.php:55
+#: ../../Zotlabs/Module/Admin/Features.php:56
+#: ../../Zotlabs/Module/Settings/Features.php:38
+msgid "On"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Security.php:95
-msgid "Block communications from these sites"
+#: ../../Zotlabs/Module/Admin/Features.php:56
+#, php-format
+msgid "Lock feature %s"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Security.php:96
-msgid "Allow communications only from these channels"
+#: ../../Zotlabs/Module/Admin/Features.php:64
+msgid "Manage Additional Features"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Security.php:96
-msgid ""
-"One channel (hash) per line. Leave empty to allow from any channel by default"
+#: ../../Zotlabs/Module/Admin/Dbsync.php:19
+msgid "Update has been marked successful"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Security.php:97
-msgid "Block communications from these channels"
+#: ../../Zotlabs/Module/Admin/Dbsync.php:29
+#, php-format
+msgid "Executing %s failed. Check system logs."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Security.php:98
-msgid "Only allow embeds from secure (SSL) websites and links."
+#: ../../Zotlabs/Module/Admin/Dbsync.php:32
+#, php-format
+msgid "Update %s was successfully applied."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Security.php:99
-msgid "Allow unfiltered embedded HTML content only from these domains"
+#: ../../Zotlabs/Module/Admin/Dbsync.php:36
+#, php-format
+msgid "Update %s did not return a status. Unknown if it succeeded."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Security.php:99
-msgid "One site per line. By default embedded content is filtered."
+#: ../../Zotlabs/Module/Admin/Dbsync.php:39
+#, php-format
+msgid "Update function %s could not be found."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Security.php:100
-msgid "Block embedded HTML from these domains"
+#: ../../Zotlabs/Module/Admin/Dbsync.php:55
+msgid "No failed updates."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Themes.php:18
-msgid "Theme settings updated."
+#: ../../Zotlabs/Module/Admin/Dbsync.php:59
+msgid "Failed Updates"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Themes.php:58
-msgid "No themes found."
+#: ../../Zotlabs/Module/Admin/Dbsync.php:61
+msgid "Mark success (if update was manually applied)"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Themes.php:93
-#: ../../Zotlabs/Module/Admin/Plugins.php:305
-msgid "Disable"
+#: ../../Zotlabs/Module/Admin/Dbsync.php:62
+msgid "Attempt to execute this update step automatically"
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:259
+#: ../../Zotlabs/Module/Admin/Themes.php:72 ../../Zotlabs/Module/Thing.php:89
+#: ../../Zotlabs/Module/Viewsrc.php:25 ../../Zotlabs/Module/Display.php:35
+#: ../../Zotlabs/Module/Filestorage.php:32 ../../Zotlabs/Module/Admin.php:60
+#: ../../include/items.php:3391
+msgid "Item not found."
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:289
+#, php-format
+msgid "Plugin %s disabled."
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:294
+#, php-format
+msgid "Plugin %s enabled."
msgstr ""
+#: ../../Zotlabs/Module/Admin/Plugins.php:310
#: ../../Zotlabs/Module/Admin/Themes.php:95
-#: ../../Zotlabs/Module/Admin/Plugins.php:308
+msgid "Disable"
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:313
+#: ../../Zotlabs/Module/Admin/Themes.php:97
msgid "Enable"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Themes.php:114
-msgid "Screenshot"
+#: ../../Zotlabs/Module/Admin/Plugins.php:341
+#: ../../Zotlabs/Module/Admin/Plugins.php:436
+#: ../../Zotlabs/Module/Admin/Accounts.php:164
+#: ../../Zotlabs/Module/Admin/Logs.php:82
+#: ../../Zotlabs/Module/Admin/Channels.php:145
+#: ../../Zotlabs/Module/Admin/Themes.php:122
+#: ../../Zotlabs/Module/Admin/Themes.php:156
+#: ../../Zotlabs/Module/Admin/Site.php:277
+#: ../../Zotlabs/Module/Admin/Security.php:86
+#: ../../Zotlabs/Module/Admin.php:137
+msgid "Administration"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Themes.php:121
-#: ../../Zotlabs/Module/Admin/Themes.php:155 ../../include/widgets.php:1597
-msgid "Themes"
+#: ../../Zotlabs/Module/Admin/Plugins.php:342
+#: ../../Zotlabs/Module/Admin/Plugins.php:437 ../../Zotlabs/Widget/Admin.php:27
+msgid "Plugins"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Themes.php:122
-#: ../../Zotlabs/Module/Admin/Plugins.php:338
+#: ../../Zotlabs/Module/Admin/Plugins.php:343
+#: ../../Zotlabs/Module/Admin/Themes.php:124
msgid "Toggle"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Themes.php:123
-#: ../../Zotlabs/Module/Admin/Plugins.php:339 ../../Zotlabs/Lib/Apps.php:223
-#: ../../include/widgets.php:699 ../../include/nav.php:225
+#: ../../Zotlabs/Module/Admin/Plugins.php:344
+#: ../../Zotlabs/Module/Admin/Themes.php:125 ../../Zotlabs/Lib/Apps.php:223
+#: ../../Zotlabs/Widget/Settings_menu.php:131 ../../include/nav.php:207
msgid "Settings"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Themes.php:132
-#: ../../Zotlabs/Module/Admin/Plugins.php:346
+#: ../../Zotlabs/Module/Admin/Plugins.php:351
+#: ../../Zotlabs/Module/Admin/Themes.php:134
msgid "Author: "
msgstr ""
-#: ../../Zotlabs/Module/Admin/Themes.php:133
-#: ../../Zotlabs/Module/Admin/Plugins.php:347
+#: ../../Zotlabs/Module/Admin/Plugins.php:352
+#: ../../Zotlabs/Module/Admin/Themes.php:135
msgid "Maintainer: "
msgstr ""
-#: ../../Zotlabs/Module/Admin/Themes.php:160
-msgid "[Experimental]"
+#: ../../Zotlabs/Module/Admin/Plugins.php:353
+msgid "Minimum project version: "
msgstr ""
-#: ../../Zotlabs/Module/Admin/Themes.php:161
-msgid "[Unsupported]"
+#: ../../Zotlabs/Module/Admin/Plugins.php:354
+msgid "Maximum project version: "
msgstr ""
-#: ../../Zotlabs/Module/Admin/Account_edit.php:29
-#, php-format
-msgid "Password changed for account %d."
+#: ../../Zotlabs/Module/Admin/Plugins.php:355
+msgid "Minimum PHP version: "
msgstr ""
-#: ../../Zotlabs/Module/Admin/Account_edit.php:46
-msgid "Account settings updated."
+#: ../../Zotlabs/Module/Admin/Plugins.php:356
+msgid "Compatible Server Roles: "
msgstr ""
-#: ../../Zotlabs/Module/Admin/Account_edit.php:61
-msgid "Account not found."
+#: ../../Zotlabs/Module/Admin/Plugins.php:357
+msgid "Requires: "
msgstr ""
-#: ../../Zotlabs/Module/Admin/Account_edit.php:68
-msgid "Account Edit"
+#: ../../Zotlabs/Module/Admin/Plugins.php:358
+#: ../../Zotlabs/Module/Admin/Plugins.php:442
+msgid "Disabled - version incompatibility"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Account_edit.php:69
-msgid "New Password"
+#: ../../Zotlabs/Module/Admin/Plugins.php:411
+msgid "Enter the public git repository URL of the plugin repo."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Account_edit.php:70
-msgid "New Password again"
+#: ../../Zotlabs/Module/Admin/Plugins.php:412
+msgid "Plugin repo git URL"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Account_edit.php:71
-msgid "Technical skill level"
+#: ../../Zotlabs/Module/Admin/Plugins.php:413
+msgid "Custom repo name"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Account_edit.php:72
-msgid "Account language (for emails)"
+#: ../../Zotlabs/Module/Admin/Plugins.php:413
+msgid "(optional)"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Account_edit.php:73
-msgid "Service class"
+#: ../../Zotlabs/Module/Admin/Plugins.php:414
+msgid "Download Plugin Repo"
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:421
+msgid "Install new repo"
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:422 ../../Zotlabs/Lib/Apps.php:358
+msgid "Install"
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:423
+#: ../../Zotlabs/Module/Settings/Oauth.php:88
+#: ../../Zotlabs/Module/Settings/Oauth.php:114
+#: ../../Zotlabs/Module/Wiki.php:265 ../../Zotlabs/Module/Wiki.php:290
+#: ../../Zotlabs/Module/Connedit.php:920 ../../Zotlabs/Module/Fbrowser.php:66
+#: ../../Zotlabs/Module/Fbrowser.php:88 ../../Zotlabs/Module/Profiles.php:804
+#: ../../Zotlabs/Module/Filer.php:55 ../../Zotlabs/Module/Tagrm.php:15
+#: ../../Zotlabs/Module/Tagrm.php:138 ../../addon/cdav/Mod_Cdav.php:866
+#: ../../addon/cdav/Mod_Cdav.php:1154 ../../addon/js_upload/js_upload.php:46
+#: ../../addon/gitwiki/Mod_Gitwiki.php:244
+#: ../../addon/gitwiki/Mod_Gitwiki.php:267 ../../include/conversation.php:1327
+#: ../../include/conversation.php:1376
+msgid "Cancel"
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:445
+msgid "Manage Repos"
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:446
+msgid "Installed Plugin Repositories"
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:447
+msgid "Install a New Plugin Repository"
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:453
+#: ../../Zotlabs/Module/Settings/Oauth.php:42
+#: ../../Zotlabs/Module/Settings/Oauth.php:113
+#: ../../Zotlabs/Module/Connedit.php:918 ../../Zotlabs/Module/Profiles.php:802
+#: ../../Zotlabs/Lib/Apps.php:358 ../../addon/cdav/Mod_Cdav.php:1152
+msgid "Update"
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:454
+msgid "Switch branch"
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:455
+#: ../../Zotlabs/Module/Photos.php:960 ../../Zotlabs/Module/Tagrm.php:137
+#: ../../addon/superblock/superblock.php:116
+msgid "Remove"
msgstr ""
#: ../../Zotlabs/Module/Admin/Accounts.php:36
@@ -2069,7 +2151,8 @@ msgid "Account '%s' unblocked"
msgstr ""
#: ../../Zotlabs/Module/Admin/Accounts.php:165
-#: ../../Zotlabs/Module/Admin/Accounts.php:178 ../../include/widgets.php:1592
+#: ../../Zotlabs/Module/Admin/Accounts.php:178
+#: ../../Zotlabs/Widget/Admin.php:23
msgid "Accounts"
msgstr ""
@@ -2088,13 +2171,10 @@ msgstr ""
#: ../../Zotlabs/Module/Admin/Accounts.php:169
#: ../../Zotlabs/Module/Admin/Accounts.php:181
-#: ../../Zotlabs/Module/Connedit.php:871
-#: ../../extend/addon/addon/redred/redred.php:107
-#: ../../extend/addon/addon/rtof/rtof.php:93
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1140
-#: ../../extend/addon/addon/openid/MysqlProvider.php:56
-#: ../../extend/addon/addon/openid/MysqlProvider.php:57
-#: ../../include/network.php:2247
+#: ../../Zotlabs/Module/Connedit.php:906 ../../Zotlabs/Module/Profiles.php:790
+#: ../../addon/cdav/Mod_Cdav.php:1140 ../../addon/openid/MysqlProvider.php:56
+#: ../../addon/openid/MysqlProvider.php:57 ../../addon/rtof/rtof.php:93
+#: ../../addon/redred/redred.php:107 ../../include/network.php:2315
msgid "Email"
msgstr ""
@@ -2102,17 +2182,22 @@ msgstr ""
msgid "No registrations."
msgstr ""
+#: ../../Zotlabs/Module/Admin/Accounts.php:171
+#: ../../Zotlabs/Module/Connections.php:281
+msgid "Approve"
+msgstr ""
+
#: ../../Zotlabs/Module/Admin/Accounts.php:172
msgid "Deny"
msgstr ""
#: ../../Zotlabs/Module/Admin/Accounts.php:174
-#: ../../Zotlabs/Module/Connedit.php:594
+#: ../../Zotlabs/Module/Connedit.php:618
msgid "Block"
msgstr ""
#: ../../Zotlabs/Module/Admin/Accounts.php:175
-#: ../../Zotlabs/Module/Connedit.php:594
+#: ../../Zotlabs/Module/Connedit.php:618
msgid "Unblock"
msgstr ""
@@ -2152,6 +2237,37 @@ msgid ""
"this site will be permanently deleted!\\n\\nAre you sure?"
msgstr ""
+#: ../../Zotlabs/Module/Admin/Logs.php:28
+msgid "Log settings updated."
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Logs.php:83 ../../Zotlabs/Widget/Admin.php:48
+#: ../../Zotlabs/Widget/Admin.php:58
+msgid "Logs"
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Logs.php:85
+msgid "Clear"
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Logs.php:91
+msgid "Debugging"
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Logs.php:92
+msgid "Log file"
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Logs.php:92
+msgid ""
+"Must be writable by web server. Relative to your top-level webserver "
+"directory."
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Logs.php:93
+msgid "Log level"
+msgstr ""
+
#: ../../Zotlabs/Module/Admin/Channels.php:31
#, php-format
msgid "%s channel censored/uncensored"
@@ -2202,7 +2318,8 @@ msgstr ""
msgid "Channel '%s' code disallowed"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Channels.php:146 ../../include/widgets.php:1593
+#: ../../Zotlabs/Module/Admin/Channels.php:146
+#: ../../Zotlabs/Widget/Admin.php:24
msgid "Channels"
msgstr ""
@@ -2223,7 +2340,7 @@ msgid "Disallow Code"
msgstr ""
#: ../../Zotlabs/Module/Admin/Channels.php:154
-#: ../../include/conversation.php:1815
+#: ../../include/conversation.php:1760 ../../include/nav.php:369
msgid "Channel"
msgstr ""
@@ -2231,13 +2348,6 @@ msgstr ""
msgid "UID"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Channels.php:160
-#: ../../Zotlabs/Module/Locs.php:118 ../../Zotlabs/Module/Connedit.php:874
-#: ../../Zotlabs/Module/Profiles.php:503
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1143
-msgid "Address"
-msgstr ""
-
#: ../../Zotlabs/Module/Admin/Channels.php:162
msgid ""
"Selected channels will be deleted!\\n\\nEverything that was posted in these "
@@ -2250,3848 +2360,3708 @@ msgid ""
"channel on this site will be permanently deleted!\\n\\nAre you sure?"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Dbsync.php:19
-msgid "Update has been marked successful"
-msgstr ""
-
-#: ../../Zotlabs/Module/Admin/Dbsync.php:29
-#, php-format
-msgid "Executing %s failed. Check system logs."
-msgstr ""
-
-#: ../../Zotlabs/Module/Admin/Dbsync.php:32
-#, php-format
-msgid "Update %s was successfully applied."
-msgstr ""
-
-#: ../../Zotlabs/Module/Admin/Dbsync.php:36
-#, php-format
-msgid "Update %s did not return a status. Unknown if it succeeded."
+#: ../../Zotlabs/Module/Admin/Themes.php:26
+msgid "Theme settings updated."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Dbsync.php:39
-#, php-format
-msgid "Update function %s could not be found."
+#: ../../Zotlabs/Module/Admin/Themes.php:61
+msgid "No themes found."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Dbsync.php:55
-msgid "No failed updates."
+#: ../../Zotlabs/Module/Admin/Themes.php:116
+msgid "Screenshot"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Dbsync.php:59
-msgid "Failed Updates"
+#: ../../Zotlabs/Module/Admin/Themes.php:123
+#: ../../Zotlabs/Module/Admin/Themes.php:157 ../../Zotlabs/Widget/Admin.php:28
+msgid "Themes"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Dbsync.php:61
-msgid "Mark success (if update was manually applied)"
+#: ../../Zotlabs/Module/Admin/Themes.php:162
+msgid "[Experimental]"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Dbsync.php:62
-msgid "Attempt to execute this update step automatically"
+#: ../../Zotlabs/Module/Admin/Themes.php:163
+msgid "[Unsupported]"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:133
+#: ../../Zotlabs/Module/Admin/Site.php:144
msgid "Site settings updated."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:159 ../../include/text.php:2931
+#: ../../Zotlabs/Module/Admin/Site.php:170 ../../include/text.php:2915
msgid "Default"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:169
-#: ../../Zotlabs/Module/Settings/Display.php:143
+#: ../../Zotlabs/Module/Admin/Site.php:181
+#: ../../Zotlabs/Module/Settings/Display.php:137
+#, php-format
+msgid "%s - (Incompatible)"
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Site.php:188
+#: ../../Zotlabs/Module/Settings/Display.php:151
msgid "mobile"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:171
+#: ../../Zotlabs/Module/Admin/Site.php:190
msgid "experimental"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:173
+#: ../../Zotlabs/Module/Admin/Site.php:192
msgid "unsupported"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:219
+#: ../../Zotlabs/Module/Admin/Site.php:238
msgid "Yes - with approval"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:225
+#: ../../Zotlabs/Module/Admin/Site.php:244
msgid "My site is not a public server"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:226
+#: ../../Zotlabs/Module/Admin/Site.php:245
msgid "My site has paid access only"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:227
+#: ../../Zotlabs/Module/Admin/Site.php:246
msgid "My site has free access only"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:228
+#: ../../Zotlabs/Module/Admin/Site.php:247
msgid "My site offers free accounts with optional paid upgrades"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:239 ../../Zotlabs/Module/Setup.php:328
-msgid "Basic/Minimal Social Networking"
-msgstr ""
-
-#: ../../Zotlabs/Module/Admin/Site.php:240 ../../Zotlabs/Module/Setup.php:329
-msgid "Standard Configuration (default)"
-msgstr ""
-
-#: ../../Zotlabs/Module/Admin/Site.php:241 ../../Zotlabs/Module/Setup.php:330
-msgid "Professional"
-msgstr ""
-
-#: ../../Zotlabs/Module/Admin/Site.php:245 ../../Zotlabs/Lib/Techlevels.php:10
+#: ../../Zotlabs/Module/Admin/Site.php:264 ../../Zotlabs/Lib/Techlevels.php:10
msgid "Beginner/Basic"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:246 ../../Zotlabs/Lib/Techlevels.php:11
+#: ../../Zotlabs/Module/Admin/Site.php:265 ../../Zotlabs/Lib/Techlevels.php:11
msgid "Novice - not skilled but willing to learn"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:247 ../../Zotlabs/Lib/Techlevels.php:12
+#: ../../Zotlabs/Module/Admin/Site.php:266 ../../Zotlabs/Lib/Techlevels.php:12
msgid "Intermediate - somewhat comfortable"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:248 ../../Zotlabs/Lib/Techlevels.php:13
+#: ../../Zotlabs/Module/Admin/Site.php:267 ../../Zotlabs/Lib/Techlevels.php:13
msgid "Advanced - very comfortable"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:249 ../../Zotlabs/Lib/Techlevels.php:14
+#: ../../Zotlabs/Module/Admin/Site.php:268 ../../Zotlabs/Lib/Techlevels.php:14
msgid "Expert - I can write computer code"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:250 ../../Zotlabs/Lib/Techlevels.php:15
+#: ../../Zotlabs/Module/Admin/Site.php:269 ../../Zotlabs/Lib/Techlevels.php:15
msgid "Wizard - I probably know more than you do"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:259 ../../include/widgets.php:1591
+#: ../../Zotlabs/Module/Admin/Site.php:278 ../../Zotlabs/Widget/Admin.php:22
msgid "Site"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:262
+#: ../../Zotlabs/Module/Admin/Site.php:280
+#: ../../Zotlabs/Module/Register.php:253
+msgid "Registration"
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Site.php:281
msgid "File upload"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:263
+#: ../../Zotlabs/Module/Admin/Site.php:282
msgid "Policies"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:264
-#: ../../include/contact_widgets.php:16
+#: ../../Zotlabs/Module/Admin/Site.php:283 ../../include/contact_widgets.php:16
msgid "Advanced"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:268
-#: ../../extend/addon/addon/statusnet/statusnet.php:890
+#: ../../Zotlabs/Module/Admin/Site.php:287
+#: ../../addon/statusnet/statusnet.php:890
msgid "Site name"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:270 ../../Zotlabs/Module/Setup.php:351
-msgid "Server Configuration/Role"
-msgstr ""
-
-#: ../../Zotlabs/Module/Admin/Site.php:272
+#: ../../Zotlabs/Module/Admin/Site.php:291
msgid "Site default technical skill level"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:272
+#: ../../Zotlabs/Module/Admin/Site.php:291
msgid "Used to provide a member experience matched to technical comfort level"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:274
+#: ../../Zotlabs/Module/Admin/Site.php:293
msgid "Lock the technical skill level setting"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:274
+#: ../../Zotlabs/Module/Admin/Site.php:293
msgid "Members can set their own technical comfort level by default"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:276
+#: ../../Zotlabs/Module/Admin/Site.php:295
msgid "Banner/Logo"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:277
+#: ../../Zotlabs/Module/Admin/Site.php:296
msgid "Administrator Information"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:277
+#: ../../Zotlabs/Module/Admin/Site.php:296
msgid ""
"Contact information for site administrators. Displayed on siteinfo page. "
"BBCode can be used here"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:278
-#: ../../Zotlabs/Module/Siteinfo.php:23
+#: ../../Zotlabs/Module/Admin/Site.php:297 ../../Zotlabs/Module/Siteinfo.php:23
msgid "Site Information"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:278
+#: ../../Zotlabs/Module/Admin/Site.php:297
msgid ""
"Publicly visible description of this site. Displayed on siteinfo page. "
"BBCode can be used here"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:279
+#: ../../Zotlabs/Module/Admin/Site.php:298
msgid "System language"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:280
+#: ../../Zotlabs/Module/Admin/Site.php:299
msgid "System theme"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:280
+#: ../../Zotlabs/Module/Admin/Site.php:299
msgid ""
"Default system theme - may be over-ridden by user profiles - <a href='#' "
"id='cnftheme'>change theme settings</a>"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:281
+#: ../../Zotlabs/Module/Admin/Site.php:300
msgid "Mobile system theme"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:281
+#: ../../Zotlabs/Module/Admin/Site.php:300
msgid "Theme for mobile devices"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:283
+#: ../../Zotlabs/Module/Admin/Site.php:302
msgid "Allow Feeds as Connections"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:283
+#: ../../Zotlabs/Module/Admin/Site.php:302
msgid "(Heavy system resource usage)"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:284
+#: ../../Zotlabs/Module/Admin/Site.php:303
msgid "Maximum image size"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:284
+#: ../../Zotlabs/Module/Admin/Site.php:303
msgid ""
"Maximum size in bytes of uploaded images. Default is 0, which means no "
"limits."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:285
+#: ../../Zotlabs/Module/Admin/Site.php:304
msgid "Does this site allow new member registration?"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:286
+#: ../../Zotlabs/Module/Admin/Site.php:305
msgid "Invitation only"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:286
+#: ../../Zotlabs/Module/Admin/Site.php:305
msgid ""
"Only allow new member registrations with an invitation code. Above register "
"policy must be set to Yes."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:287
+#: ../../Zotlabs/Module/Admin/Site.php:306
msgid "Which best describes the types of account offered by this hub?"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:288
+#: ../../Zotlabs/Module/Admin/Site.php:307
msgid "Register text"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:288
+#: ../../Zotlabs/Module/Admin/Site.php:307
msgid "Will be displayed prominently on the registration page."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:289
+#: ../../Zotlabs/Module/Admin/Site.php:308
msgid "Site homepage to show visitors (default: login box)"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:289
+#: ../../Zotlabs/Module/Admin/Site.php:308
msgid ""
"example: 'public' to show public stream, 'page/sys/home' to show a system "
"webpage called 'home' or 'include:home.html' to include a file."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:290
+#: ../../Zotlabs/Module/Admin/Site.php:309
msgid "Preserve site homepage URL"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:290
+#: ../../Zotlabs/Module/Admin/Site.php:309
msgid ""
"Present the site homepage in a frame at the original location instead of "
"redirecting"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:291
+#: ../../Zotlabs/Module/Admin/Site.php:310
msgid "Accounts abandoned after x days"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:291
+#: ../../Zotlabs/Module/Admin/Site.php:310
msgid ""
"Will not waste system resources polling external sites for abandonded "
"accounts. Enter 0 for no time limit."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:292
+#: ../../Zotlabs/Module/Admin/Site.php:311
msgid "Allowed friend domains"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:292
+#: ../../Zotlabs/Module/Admin/Site.php:311
msgid ""
"Comma separated list of domains which are allowed to establish friendships "
"with this site. Wildcards are accepted. Empty to allow any domains"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:293
+#: ../../Zotlabs/Module/Admin/Site.php:312
msgid "Verify Email Addresses"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:293
+#: ../../Zotlabs/Module/Admin/Site.php:312
msgid ""
"Check to verify email addresses used in account registration (recommended)."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:294
+#: ../../Zotlabs/Module/Admin/Site.php:313
msgid "Force publish"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:294
+#: ../../Zotlabs/Module/Admin/Site.php:313
msgid ""
"Check to force all profiles on this site to be listed in the site directory."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:295
+#: ../../Zotlabs/Module/Admin/Site.php:314
msgid "Import Public Streams"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:295
+#: ../../Zotlabs/Module/Admin/Site.php:314
msgid ""
"Import and allow access to public content pulled from other sites. Warning: "
"this content is unmoderated."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:296
+#: ../../Zotlabs/Module/Admin/Site.php:315
msgid "Login on Homepage"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:296
+#: ../../Zotlabs/Module/Admin/Site.php:315
msgid ""
"Present a login box to visitors on the home page if no other content has "
"been configured."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:297
+#: ../../Zotlabs/Module/Admin/Site.php:316
msgid "Enable context help"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:297
+#: ../../Zotlabs/Module/Admin/Site.php:316
msgid ""
"Display contextual help for the current page when the help button is pressed."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:299
+#: ../../Zotlabs/Module/Admin/Site.php:318
+msgid "Reply-to email address for system generated email."
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Site.php:319
+msgid "Sender (From) email address for system generated email."
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Site.php:320
+msgid "Name of email sender for system generated email."
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Site.php:322
msgid "Directory Server URL"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:299
+#: ../../Zotlabs/Module/Admin/Site.php:322
msgid "Default directory server"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:301
+#: ../../Zotlabs/Module/Admin/Site.php:324
msgid "Proxy user"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:302
+#: ../../Zotlabs/Module/Admin/Site.php:325
msgid "Proxy URL"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:303
+#: ../../Zotlabs/Module/Admin/Site.php:326
msgid "Network timeout"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:303
+#: ../../Zotlabs/Module/Admin/Site.php:326
msgid "Value is in seconds. Set to 0 for unlimited (not recommended)."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:304
+#: ../../Zotlabs/Module/Admin/Site.php:327
msgid "Delivery interval"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:304
+#: ../../Zotlabs/Module/Admin/Site.php:327
msgid ""
"Delay background delivery processes by this many seconds to reduce system "
"load. Recommend: 4-5 for shared hosts, 2-3 for virtual private servers. 0-1 "
"for large dedicated servers."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:305
+#: ../../Zotlabs/Module/Admin/Site.php:328
msgid "Deliveries per process"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:305
+#: ../../Zotlabs/Module/Admin/Site.php:328
msgid ""
"Number of deliveries to attempt in a single operating system process. Adjust "
"if necessary to tune system performance. Recommend: 1-5."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:306
+#: ../../Zotlabs/Module/Admin/Site.php:329
msgid "Poll interval"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:306
+#: ../../Zotlabs/Module/Admin/Site.php:329
msgid ""
"Delay background polling processes by this many seconds to reduce system "
"load. If 0, use delivery interval."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:307
+#: ../../Zotlabs/Module/Admin/Site.php:330
msgid "Maximum Load Average"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:307
+#: ../../Zotlabs/Module/Admin/Site.php:330
msgid ""
"Maximum system load before delivery and poll processes are deferred - "
"default 50."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:308
+#: ../../Zotlabs/Module/Admin/Site.php:331
msgid "Expiration period in days for imported (grid/network) content"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:308
+#: ../../Zotlabs/Module/Admin/Site.php:331
msgid "0 for no expiration of imported content"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Plugins.php:284
-#, php-format
-msgid "Plugin %s disabled."
-msgstr ""
-
-#: ../../Zotlabs/Module/Admin/Plugins.php:289
-#, php-format
-msgid "Plugin %s enabled."
+#: ../../Zotlabs/Module/Admin/Profs.php:69
+msgid "New Profile Field"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Plugins.php:337
-#: ../../Zotlabs/Module/Admin/Plugins.php:432 ../../include/widgets.php:1596
-msgid "Plugins"
+#: ../../Zotlabs/Module/Admin/Profs.php:70
+#: ../../Zotlabs/Module/Admin/Profs.php:90
+msgid "Field nickname"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Plugins.php:348
-msgid "Minimum project version: "
+#: ../../Zotlabs/Module/Admin/Profs.php:70
+#: ../../Zotlabs/Module/Admin/Profs.php:90
+msgid "System name of field"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Plugins.php:349
-msgid "Maximum project version: "
+#: ../../Zotlabs/Module/Admin/Profs.php:71
+#: ../../Zotlabs/Module/Admin/Profs.php:91
+msgid "Input type"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Plugins.php:350
-msgid "Minimum PHP version: "
+#: ../../Zotlabs/Module/Admin/Profs.php:72
+#: ../../Zotlabs/Module/Admin/Profs.php:92
+msgid "Field Name"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Plugins.php:351
-msgid "Compatible Server Roles: "
+#: ../../Zotlabs/Module/Admin/Profs.php:72
+#: ../../Zotlabs/Module/Admin/Profs.php:92
+msgid "Label on profile pages"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Plugins.php:352
-msgid "Requires: "
+#: ../../Zotlabs/Module/Admin/Profs.php:73
+#: ../../Zotlabs/Module/Admin/Profs.php:93
+msgid "Help text"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Plugins.php:353
-#: ../../Zotlabs/Module/Admin/Plugins.php:437
-msgid "Disabled - version incompatibility"
+#: ../../Zotlabs/Module/Admin/Profs.php:73
+#: ../../Zotlabs/Module/Admin/Profs.php:93
+msgid "Additional info (optional)"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Plugins.php:406
-msgid "Enter the public git repository URL of the plugin repo."
+#: ../../Zotlabs/Module/Admin/Profs.php:74
+#: ../../Zotlabs/Module/Admin/Profs.php:94 ../../Zotlabs/Module/Rbmark.php:32
+#: ../../Zotlabs/Module/Rbmark.php:104 ../../Zotlabs/Module/Filer.php:53
+#: ../../Zotlabs/Widget/Notes.php:18 ../../include/text.php:1028
+#: ../../include/text.php:1040
+msgid "Save"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Plugins.php:407
-msgid "Plugin repo git URL"
+#: ../../Zotlabs/Module/Admin/Profs.php:83
+msgid "Field definition not found"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Plugins.php:408
-msgid "Custom repo name"
+#: ../../Zotlabs/Module/Admin/Profs.php:89
+msgid "Edit Profile Field"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Plugins.php:408
-msgid "(optional)"
+#: ../../Zotlabs/Module/Admin/Profs.php:147 ../../Zotlabs/Widget/Admin.php:30
+msgid "Profile Fields"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Plugins.php:409
-msgid "Download Plugin Repo"
+#: ../../Zotlabs/Module/Admin/Profs.php:148
+msgid "Basic Profile Fields"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Plugins.php:416
-msgid "Install new repo"
+#: ../../Zotlabs/Module/Admin/Profs.php:149
+msgid "Advanced Profile Fields"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Plugins.php:417 ../../Zotlabs/Lib/Apps.php:348
-msgid "Install"
+#: ../../Zotlabs/Module/Admin/Profs.php:149
+msgid "(In addition to basic fields)"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Plugins.php:418
-#: ../../Zotlabs/Module/Connedit.php:885 ../../Zotlabs/Module/Fbrowser.php:66
-#: ../../Zotlabs/Module/Fbrowser.php:88 ../../Zotlabs/Module/Wiki.php:263
-#: ../../Zotlabs/Module/Wiki.php:288
-#: ../../Zotlabs/Module/Settings/Oauth.php:88
-#: ../../Zotlabs/Module/Settings/Oauth.php:114
-#: ../../Zotlabs/Module/Tagrm.php:15 ../../Zotlabs/Module/Tagrm.php:138
-#: ../../extend/addon/addon/friendica/dfrn_request.php:879
-#: ../../extend/addon/addon/js_upload/js_upload.php:46
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:866
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1154
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:243
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:266
-#: ../../include/conversation.php:1394 ../../include/conversation.php:1443
-msgid "Cancel"
+#: ../../Zotlabs/Module/Admin/Profs.php:151
+msgid "All available fields"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Plugins.php:440
-msgid "Manage Repos"
+#: ../../Zotlabs/Module/Admin/Profs.php:152
+msgid "Custom Fields"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Plugins.php:441
-msgid "Installed Plugin Repositories"
+#: ../../Zotlabs/Module/Admin/Profs.php:156
+msgid "Create Custom Field"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Plugins.php:442
-msgid "Install a New Plugin Repository"
+#: ../../Zotlabs/Module/Admin/Account_edit.php:29
+#, php-format
+msgid "Password changed for account %d."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Plugins.php:448
-#: ../../Zotlabs/Module/Connedit.php:883
-#: ../../Zotlabs/Module/Settings/Oauth.php:42
-#: ../../Zotlabs/Module/Settings/Oauth.php:113 ../../Zotlabs/Lib/Apps.php:348
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1152
-msgid "Update"
+#: ../../Zotlabs/Module/Admin/Account_edit.php:46
+msgid "Account settings updated."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Plugins.php:449
-msgid "Switch branch"
+#: ../../Zotlabs/Module/Admin/Account_edit.php:61
+msgid "Account not found."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Queue.php:35
-msgid "Queue Statistics"
+#: ../../Zotlabs/Module/Admin/Account_edit.php:68
+msgid "Account Edit"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Queue.php:36
-msgid "Total Entries"
+#: ../../Zotlabs/Module/Admin/Account_edit.php:69
+msgid "New Password"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Queue.php:37
-msgid "Priority"
+#: ../../Zotlabs/Module/Admin/Account_edit.php:70
+msgid "New Password again"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Queue.php:38
-msgid "Destination URL"
+#: ../../Zotlabs/Module/Admin/Account_edit.php:71
+msgid "Technical skill level"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Queue.php:39
-msgid "Mark hub permanently offline"
+#: ../../Zotlabs/Module/Admin/Account_edit.php:72
+msgid "Account language (for emails)"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Queue.php:40
-msgid "Empty queue for this hub"
+#: ../../Zotlabs/Module/Admin/Account_edit.php:73
+msgid "Service class"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Queue.php:41
-msgid "Last known contact"
+#: ../../Zotlabs/Module/Admin/Security.php:77
+msgid ""
+"By default, unfiltered HTML is allowed in embedded media. This is inherently "
+"insecure."
msgstr ""
-#: ../../Zotlabs/Module/Search.php:223
-#, php-format
-msgid "Items tagged with: %s"
+#: ../../Zotlabs/Module/Admin/Security.php:80
+msgid ""
+"The recommended setting is to only allow unfiltered HTML from the following "
+"sites:"
msgstr ""
-#: ../../Zotlabs/Module/Search.php:225
-#, php-format
-msgid "Search results for: %s"
+#: ../../Zotlabs/Module/Admin/Security.php:81
+msgid ""
+"https://youtube.com/<br />https://www.youtube.com/<br />https://youtu.be/"
+"<br />https://vimeo.com/<br />https://soundcloud.com/<br />"
msgstr ""
-#: ../../Zotlabs/Module/Editlayout.php:127
-#: ../../Zotlabs/Module/Layouts.php:128 ../../Zotlabs/Module/Layouts.php:188
-msgid "Layout Name"
+#: ../../Zotlabs/Module/Admin/Security.php:82
+msgid ""
+"All other embedded content will be filtered, <strong>unless</strong> "
+"embedded content from that site is explicitly blocked."
msgstr ""
-#: ../../Zotlabs/Module/Editlayout.php:128
-#: ../../Zotlabs/Module/Layouts.php:131
-msgid "Layout Description (Optional)"
+#: ../../Zotlabs/Module/Admin/Security.php:87 ../../Zotlabs/Widget/Admin.php:25
+msgid "Security"
msgstr ""
-#: ../../Zotlabs/Module/Editlayout.php:136
-msgid "Edit Layout"
+#: ../../Zotlabs/Module/Admin/Security.php:89
+msgid "Block public"
msgstr ""
-#: ../../Zotlabs/Module/Editwebpage.php:142
-msgid "Page link"
+#: ../../Zotlabs/Module/Admin/Security.php:89
+msgid ""
+"Check to block public access to all otherwise public personal pages on this "
+"site unless you are currently authenticated."
msgstr ""
-#: ../../Zotlabs/Module/Editwebpage.php:169
-msgid "Edit Webpage"
+#: ../../Zotlabs/Module/Admin/Security.php:90
+msgid "Set \"Transport Security\" HTTP header"
msgstr ""
-#: ../../Zotlabs/Module/Like.php:19
-msgid "Like/Dislike"
+#: ../../Zotlabs/Module/Admin/Security.php:91
+msgid "Set \"Content Security Policy\" HTTP header"
msgstr ""
-#: ../../Zotlabs/Module/Like.php:24
-msgid "This action is restricted to members."
+#: ../../Zotlabs/Module/Admin/Security.php:92
+msgid "Allowed email domains"
msgstr ""
-#: ../../Zotlabs/Module/Like.php:25
+#: ../../Zotlabs/Module/Admin/Security.php:92
msgid ""
-"Please <a href=\"rmagic\">login with your $Projectname ID</a> or <a href="
-"\"register\">register as a new $Projectname member</a> to continue."
+"Comma separated list of domains which are allowed in email addresses for "
+"registrations to this site. Wildcards are accepted. Empty to allow any "
+"domains"
msgstr ""
-#: ../../Zotlabs/Module/Like.php:105 ../../Zotlabs/Module/Like.php:131
-#: ../../Zotlabs/Module/Like.php:169
-msgid "Invalid request."
+#: ../../Zotlabs/Module/Admin/Security.php:93
+msgid "Not allowed email domains"
msgstr ""
-#: ../../Zotlabs/Module/Like.php:117 ../../include/conversation.php:126
-msgid "channel"
+#: ../../Zotlabs/Module/Admin/Security.php:93
+msgid ""
+"Comma separated list of domains which are not allowed in email addresses for "
+"registrations to this site. Wildcards are accepted. Empty to allow any "
+"domains, unless allowed domains have been defined."
msgstr ""
-#: ../../Zotlabs/Module/Like.php:146
-msgid "thing"
+#: ../../Zotlabs/Module/Admin/Security.php:94
+msgid "Allow communications only from these sites"
msgstr ""
-#: ../../Zotlabs/Module/Like.php:192
-msgid "Channel unavailable."
+#: ../../Zotlabs/Module/Admin/Security.php:94
+msgid ""
+"One site per line. Leave empty to allow communication from anywhere by "
+"default"
msgstr ""
-#: ../../Zotlabs/Module/Like.php:240
-msgid "Previous action reversed."
+#: ../../Zotlabs/Module/Admin/Security.php:95
+msgid "Block communications from these sites"
msgstr ""
-#: ../../Zotlabs/Module/Like.php:370 ../../Zotlabs/Module/Subthread.php:87
-#: ../../Zotlabs/Module/Tagger.php:47
-#: ../../extend/addon/addon/diaspora/inbound.php:1794
-#: ../../extend/addon/addon/redphotos/redphotohelper.php:74
-#: ../../include/conversation.php:120 ../../include/text.php:1953
-msgid "photo"
+#: ../../Zotlabs/Module/Admin/Security.php:96
+msgid "Allow communications only from these channels"
msgstr ""
-#: ../../Zotlabs/Module/Like.php:370 ../../Zotlabs/Module/Subthread.php:87
-#: ../../extend/addon/addon/diaspora/inbound.php:1794
-#: ../../include/conversation.php:148 ../../include/text.php:1959
-msgid "status"
+#: ../../Zotlabs/Module/Admin/Security.php:96
+msgid ""
+"One channel (hash) per line. Leave empty to allow from any channel by default"
msgstr ""
-#: ../../Zotlabs/Module/Like.php:372 ../../Zotlabs/Module/Events.php:260
-#: ../../Zotlabs/Module/Tagger.php:51 ../../include/conversation.php:123
-#: ../../include/text.php:1956 ../../include/event.php:1000
-msgid "event"
+#: ../../Zotlabs/Module/Admin/Security.php:97
+msgid "Block communications from these channels"
msgstr ""
-#: ../../Zotlabs/Module/Like.php:419
-#: ../../extend/addon/addon/diaspora/inbound.php:1823
-#: ../../include/conversation.php:164
-#, php-format
-msgid "%1$s likes %2$s's %3$s"
+#: ../../Zotlabs/Module/Admin/Security.php:98
+msgid "Only allow embeds from secure (SSL) websites and links."
msgstr ""
-#: ../../Zotlabs/Module/Like.php:421 ../../include/conversation.php:167
-#, php-format
-msgid "%1$s doesn't like %2$s's %3$s"
+#: ../../Zotlabs/Module/Admin/Security.php:99
+msgid "Allow unfiltered embedded HTML content only from these domains"
msgstr ""
-#: ../../Zotlabs/Module/Like.php:423
-#, php-format
-msgid "%1$s agrees with %2$s's %3$s"
+#: ../../Zotlabs/Module/Admin/Security.php:99
+msgid "One site per line. By default embedded content is filtered."
msgstr ""
-#: ../../Zotlabs/Module/Like.php:425
-#, php-format
-msgid "%1$s doesn't agree with %2$s's %3$s"
+#: ../../Zotlabs/Module/Admin/Security.php:100
+msgid "Block embedded HTML from these domains"
msgstr ""
-#: ../../Zotlabs/Module/Like.php:427
-#, php-format
-msgid "%1$s abstains from a decision on %2$s's %3$s"
+#: ../../Zotlabs/Module/Lockview.php:75
+msgid "Remote privacy information not available."
msgstr ""
-#: ../../Zotlabs/Module/Like.php:429
-#, php-format
-msgid "%1$s is attending %2$s's %3$s"
+#: ../../Zotlabs/Module/Lockview.php:96
+msgid "Visible to:"
msgstr ""
-#: ../../Zotlabs/Module/Like.php:431
-#, php-format
-msgid "%1$s is not attending %2$s's %3$s"
+#: ../../Zotlabs/Module/Lockview.php:117 ../../Zotlabs/Module/Lockview.php:153
+#: ../../Zotlabs/Module/Acl.php:117 ../../include/acl_selectors.php:183
+msgctxt "acl"
+msgid "Profile"
msgstr ""
-#: ../../Zotlabs/Module/Like.php:433
-#, php-format
-msgid "%1$s may attend %2$s's %3$s"
+#: ../../Zotlabs/Module/Settings/Permcats.php:37
+msgid "Permission category saved."
msgstr ""
-#: ../../Zotlabs/Module/Like.php:538
-msgid "Action completed."
+#: ../../Zotlabs/Module/Settings/Permcats.php:61
+msgid ""
+"Use this form to create permission rules for various classes of people or "
+"connections."
msgstr ""
-#: ../../Zotlabs/Module/Like.php:539
-msgid "Thank you."
+#: ../../Zotlabs/Module/Settings/Permcats.php:94
+msgid "Permission Categories"
msgstr ""
-#: ../../Zotlabs/Module/Dirsearch.php:25 ../../Zotlabs/Module/Regdir.php:49
-msgid "This site is not a directory server"
+#: ../../Zotlabs/Module/Settings/Permcats.php:102
+msgid "Permission Name"
msgstr ""
-#: ../../Zotlabs/Module/Dirsearch.php:33
-msgid "This directory server requires an access token"
+#: ../../Zotlabs/Module/Settings/Permcats.php:103
+#: ../../Zotlabs/Module/Settings/Tokens.php:161
+#: ../../Zotlabs/Module/Connedit.php:886
+msgid "My Settings"
msgstr ""
-#: ../../Zotlabs/Module/Network.php:96
-msgid "No such group"
+#: ../../Zotlabs/Module/Settings/Permcats.php:105
+#: ../../Zotlabs/Module/Settings/Tokens.php:163
+#: ../../Zotlabs/Module/Connedit.php:881
+msgid "inherited"
msgstr ""
-#: ../../Zotlabs/Module/Network.php:136
-msgid "No such channel"
+#: ../../Zotlabs/Module/Settings/Permcats.php:108
+#: ../../Zotlabs/Module/Settings/Tokens.php:166
+#: ../../Zotlabs/Module/Connedit.php:888
+msgid "Individual Permissions"
msgstr ""
-#: ../../Zotlabs/Module/Network.php:141
-msgid "forum"
+#: ../../Zotlabs/Module/Settings/Permcats.php:109
+#: ../../Zotlabs/Module/Settings/Tokens.php:167
+#: ../../Zotlabs/Module/Connedit.php:889
+msgid ""
+"Some permissions may be inherited from your channel's <a href=\"settings"
+"\"><strong>privacy settings</strong></a>, which have higher priority than "
+"individual settings. You can <strong>not</strong> change those settings here."
msgstr ""
-#: ../../Zotlabs/Module/Network.php:153
-msgid "Search Results For:"
+#: ../../Zotlabs/Module/Settings/Channel.php:62
+#: ../../Zotlabs/Module/Settings/Channel.php:66
+#: ../../Zotlabs/Module/Settings/Channel.php:67
+#: ../../Zotlabs/Module/Settings/Channel.php:70
+#: ../../Zotlabs/Module/Settings/Channel.php:81
+#: ../../Zotlabs/Module/Connedit.php:707 ../../Zotlabs/Widget/Affinity.php:28
+#: ../../include/selectors.php:123 ../../include/channel.php:406
+#: ../../include/channel.php:407 ../../include/channel.php:414
+msgid "Friends"
msgstr ""
-#: ../../Zotlabs/Module/Network.php:221
-msgid "Privacy group is empty"
+#: ../../Zotlabs/Module/Settings/Channel.php:251
+#: ../../addon/rendezvous/rendezvous.php:82
+#: ../../addon/openstreetmap/openstreetmap.php:184
+#: ../../addon/msgfooter/msgfooter.php:54 ../../addon/logrot/logrot.php:54
+#: ../../addon/twitter/twitter.php:766 ../../addon/piwik/piwik.php:116
+#: ../../addon/xmpp/xmpp.php:102
+msgid "Settings updated."
msgstr ""
-#: ../../Zotlabs/Module/Network.php:230
-msgid "Privacy group: "
+#: ../../Zotlabs/Module/Settings/Channel.php:312
+msgid "Nobody except yourself"
msgstr ""
-#: ../../Zotlabs/Module/Network.php:256
-msgid "Invalid connection."
+#: ../../Zotlabs/Module/Settings/Channel.php:313
+msgid "Only those you specifically allow"
msgstr ""
-#: ../../Zotlabs/Module/Menu.php:49
-msgid "Unable to update menu."
+#: ../../Zotlabs/Module/Settings/Channel.php:314
+msgid "Approved connections"
msgstr ""
-#: ../../Zotlabs/Module/Menu.php:60
-msgid "Unable to create menu."
+#: ../../Zotlabs/Module/Settings/Channel.php:315
+msgid "Any connections"
msgstr ""
-#: ../../Zotlabs/Module/Menu.php:98 ../../Zotlabs/Module/Menu.php:110
-msgid "Menu Name"
+#: ../../Zotlabs/Module/Settings/Channel.php:316
+msgid "Anybody on this website"
msgstr ""
-#: ../../Zotlabs/Module/Menu.php:98
-msgid "Unique name (not visible on webpage) - required"
+#: ../../Zotlabs/Module/Settings/Channel.php:317
+msgid "Anybody in this network"
msgstr ""
-#: ../../Zotlabs/Module/Menu.php:99 ../../Zotlabs/Module/Menu.php:111
-msgid "Menu Title"
+#: ../../Zotlabs/Module/Settings/Channel.php:318
+msgid "Anybody authenticated"
msgstr ""
-#: ../../Zotlabs/Module/Menu.php:99
-msgid "Visible on webpage - leave empty for no title"
+#: ../../Zotlabs/Module/Settings/Channel.php:319
+msgid "Anybody on the internet"
msgstr ""
-#: ../../Zotlabs/Module/Menu.php:100
-msgid "Allow Bookmarks"
+#: ../../Zotlabs/Module/Settings/Channel.php:395
+msgid "Publish your default profile in the network directory"
msgstr ""
-#: ../../Zotlabs/Module/Menu.php:100 ../../Zotlabs/Module/Menu.php:157
-msgid "Menu may be used to store saved bookmarks"
+#: ../../Zotlabs/Module/Settings/Channel.php:400
+msgid "Allow us to suggest you as a potential friend to new members?"
msgstr ""
-#: ../../Zotlabs/Module/Menu.php:101 ../../Zotlabs/Module/Menu.php:159
-msgid "Submit and proceed"
+#: ../../Zotlabs/Module/Settings/Channel.php:404
+#: ../../Zotlabs/Module/Profile_photo.php:429
+#: ../../Zotlabs/Module/Cover_photo.php:365
+msgid "or"
msgstr ""
-#: ../../Zotlabs/Module/Menu.php:107 ../../include/text.php:2284
-msgid "Menus"
+#: ../../Zotlabs/Module/Settings/Channel.php:409
+msgid "Your channel address is"
msgstr ""
-#: ../../Zotlabs/Module/Menu.php:113 ../../Zotlabs/Module/Locs.php:120
-msgid "Drop"
+#: ../../Zotlabs/Module/Settings/Channel.php:412
+msgid "Your files/photos are accessible via WebDAV at"
msgstr ""
-#: ../../Zotlabs/Module/Menu.php:114 ../../Zotlabs/Module/Blocks.php:157
-#: ../../Zotlabs/Module/Layouts.php:190 ../../Zotlabs/Module/Webpages.php:255
-#: ../../include/page_widgets.php:47
-msgid "Created"
+#: ../../Zotlabs/Module/Settings/Channel.php:474
+msgid "Channel Settings"
msgstr ""
-#: ../../Zotlabs/Module/Menu.php:115 ../../Zotlabs/Module/Blocks.php:158
-#: ../../Zotlabs/Module/Layouts.php:191 ../../Zotlabs/Module/Webpages.php:256
-#: ../../include/page_widgets.php:48
-msgid "Edited"
+#: ../../Zotlabs/Module/Settings/Channel.php:481
+msgid "Basic Settings"
msgstr ""
-#: ../../Zotlabs/Module/Menu.php:117
-msgid "Bookmarks allowed"
+#: ../../Zotlabs/Module/Settings/Channel.php:482 ../../include/channel.php:1250
+msgid "Full Name:"
msgstr ""
-#: ../../Zotlabs/Module/Menu.php:119
-msgid "Delete this menu"
+#: ../../Zotlabs/Module/Settings/Channel.php:483
+#: ../../Zotlabs/Module/Settings/Account.php:119
+msgid "Email Address:"
msgstr ""
-#: ../../Zotlabs/Module/Menu.php:120 ../../Zotlabs/Module/Menu.php:154
-msgid "Edit menu contents"
+#: ../../Zotlabs/Module/Settings/Channel.php:484
+msgid "Your Timezone:"
msgstr ""
-#: ../../Zotlabs/Module/Menu.php:121
-msgid "Edit this menu"
+#: ../../Zotlabs/Module/Settings/Channel.php:485
+msgid "Default Post Location:"
msgstr ""
-#: ../../Zotlabs/Module/Menu.php:136
-msgid "Menu could not be deleted."
+#: ../../Zotlabs/Module/Settings/Channel.php:485
+msgid "Geographical location to display on your posts"
msgstr ""
-#: ../../Zotlabs/Module/Menu.php:144 ../../Zotlabs/Module/Mitem.php:28
-msgid "Menu not found."
+#: ../../Zotlabs/Module/Settings/Channel.php:486
+msgid "Use Browser Location:"
msgstr ""
-#: ../../Zotlabs/Module/Menu.php:149
-msgid "Edit Menu"
+#: ../../Zotlabs/Module/Settings/Channel.php:488
+msgid "Adult Content"
msgstr ""
-#: ../../Zotlabs/Module/Menu.php:153
-msgid "Add or remove entries to this menu"
+#: ../../Zotlabs/Module/Settings/Channel.php:488
+msgid ""
+"This channel frequently or regularly publishes adult content. (Please tag "
+"any adult material and/or nudity with #NSFW)"
msgstr ""
-#: ../../Zotlabs/Module/Menu.php:155
-msgid "Menu name"
+#: ../../Zotlabs/Module/Settings/Channel.php:490
+msgid "Security and Privacy Settings"
msgstr ""
-#: ../../Zotlabs/Module/Menu.php:155
-msgid "Must be unique, only seen by you"
+#: ../../Zotlabs/Module/Settings/Channel.php:493
+msgid "Your permissions are already configured. Click to view/adjust"
msgstr ""
-#: ../../Zotlabs/Module/Menu.php:156
-msgid "Menu title"
+#: ../../Zotlabs/Module/Settings/Channel.php:495
+msgid "Hide my online presence"
msgstr ""
-#: ../../Zotlabs/Module/Menu.php:156
-msgid "Menu title as seen by others"
+#: ../../Zotlabs/Module/Settings/Channel.php:495
+msgid "Prevents displaying in your profile that you are online"
msgstr ""
-#: ../../Zotlabs/Module/Menu.php:157
-msgid "Allow bookmarks"
+#: ../../Zotlabs/Module/Settings/Channel.php:497
+msgid "Simple Privacy Settings:"
msgstr ""
-#: ../../Zotlabs/Module/Menu.php:166 ../../Zotlabs/Module/Mitem.php:120
-#: ../../Zotlabs/Module/Xchan.php:41
-msgid "Not found."
+#: ../../Zotlabs/Module/Settings/Channel.php:498
+msgid ""
+"Very Public - <em>extremely permissive (should be used with caution)</em>"
msgstr ""
-#: ../../Zotlabs/Module/Locs.php:25 ../../Zotlabs/Module/Locs.php:54
-msgid "Location not found."
+#: ../../Zotlabs/Module/Settings/Channel.php:499
+msgid ""
+"Typical - <em>default public, privacy when desired (similar to social "
+"network permissions but with improved privacy)</em>"
msgstr ""
-#: ../../Zotlabs/Module/Locs.php:62
-msgid "Location lookup failed."
+#: ../../Zotlabs/Module/Settings/Channel.php:500
+msgid "Private - <em>default private, never open or public</em>"
msgstr ""
-#: ../../Zotlabs/Module/Locs.php:66
-msgid ""
-"Please select another location to become primary before removing the primary "
-"location."
+#: ../../Zotlabs/Module/Settings/Channel.php:501
+msgid "Blocked - <em>default blocked to/from everybody</em>"
msgstr ""
-#: ../../Zotlabs/Module/Locs.php:95
-msgid "Syncing locations"
+#: ../../Zotlabs/Module/Settings/Channel.php:503
+msgid "Allow others to tag your posts"
msgstr ""
-#: ../../Zotlabs/Module/Locs.php:105
-msgid "No locations found."
+#: ../../Zotlabs/Module/Settings/Channel.php:503
+msgid ""
+"Often used by the community to retro-actively flag inappropriate content"
msgstr ""
-#: ../../Zotlabs/Module/Locs.php:116
-msgid "Manage Channel Locations"
+#: ../../Zotlabs/Module/Settings/Channel.php:505
+msgid "Channel Permission Limits"
msgstr ""
-#: ../../Zotlabs/Module/Locs.php:117 ../../Zotlabs/Module/Pubsites.php:51
-#: ../../Zotlabs/Module/Profiles.php:510 ../../Zotlabs/Module/Profiles.php:733
-#: ../../Zotlabs/Module/Events.php:475
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:839
-#: ../../include/js_strings.php:25
-msgid "Location"
+#: ../../Zotlabs/Module/Settings/Channel.php:507
+msgid "Expire other channel content after this many days"
msgstr ""
-#: ../../Zotlabs/Module/Locs.php:119
-msgid "Primary"
+#: ../../Zotlabs/Module/Settings/Channel.php:507
+msgid "0 or blank to use the website limit."
msgstr ""
-#: ../../Zotlabs/Module/Locs.php:122
-msgid "Sync Now"
+#: ../../Zotlabs/Module/Settings/Channel.php:507
+#, php-format
+msgid "This website expires after %d days."
msgstr ""
-#: ../../Zotlabs/Module/Locs.php:123
-msgid "Please wait several minutes between consecutive operations."
+#: ../../Zotlabs/Module/Settings/Channel.php:507
+msgid "This website does not expire imported content."
msgstr ""
-#: ../../Zotlabs/Module/Locs.php:124
-msgid ""
-"When possible, drop a location by logging into that website/hub and removing "
-"your channel."
+#: ../../Zotlabs/Module/Settings/Channel.php:507
+msgid "The website limit takes precedence if lower than your limit."
msgstr ""
-#: ../../Zotlabs/Module/Locs.php:125
-msgid "Use this form to drop the location if the hub is no longer operating."
+#: ../../Zotlabs/Module/Settings/Channel.php:508
+msgid "Maximum Friend Requests/Day:"
msgstr ""
-#: ../../Zotlabs/Module/Pubsites.php:24 ../../include/widgets.php:1415
-msgid "Public Hubs"
+#: ../../Zotlabs/Module/Settings/Channel.php:508
+msgid "May reduce spam activity"
msgstr ""
-#: ../../Zotlabs/Module/Pubsites.php:27
-msgid ""
-"The listed hubs allow public registration for the $Projectname network. All "
-"hubs in the network are interlinked so membership on any of them conveys "
-"membership in the network as a whole. Some hubs may require subscription or "
-"provide tiered service plans. The hub itself <strong>may</strong> provide "
-"additional details."
+#: ../../Zotlabs/Module/Settings/Channel.php:509
+msgid "Default Access Control List (ACL)"
msgstr ""
-#: ../../Zotlabs/Module/Pubsites.php:33
-msgid "Hub URL"
+#: ../../Zotlabs/Module/Settings/Channel.php:511
+msgid "Use my default audience setting for the type of object published"
msgstr ""
-#: ../../Zotlabs/Module/Pubsites.php:33
-msgid "Access Type"
+#: ../../Zotlabs/Module/Settings/Channel.php:518
+msgid "Channel permissions category:"
msgstr ""
-#: ../../Zotlabs/Module/Pubsites.php:33
-msgid "Registration Policy"
+#: ../../Zotlabs/Module/Settings/Channel.php:519
+msgid "Default Permissions Group"
msgstr ""
-#: ../../Zotlabs/Module/Pubsites.php:33
-msgid "Stats"
+#: ../../Zotlabs/Module/Settings/Channel.php:525
+msgid "Maximum private messages per day from unknown people:"
msgstr ""
-#: ../../Zotlabs/Module/Pubsites.php:33
-msgid "Software"
+#: ../../Zotlabs/Module/Settings/Channel.php:525
+msgid "Useful to reduce spamming"
msgstr ""
-#: ../../Zotlabs/Module/Pubsites.php:35 ../../Zotlabs/Module/Ratings.php:97
-#: ../../include/conversation.php:941 ../../include/conversation.php:1099
-msgid "Ratings"
+#: ../../Zotlabs/Module/Settings/Channel.php:528
+msgid "Notification Settings"
msgstr ""
-#: ../../Zotlabs/Module/Pubsites.php:48
-msgid "Rate"
+#: ../../Zotlabs/Module/Settings/Channel.php:529
+msgid "By default post a status message when:"
msgstr ""
-#: ../../Zotlabs/Module/Pubsites.php:59 ../../Zotlabs/Module/Blocks.php:166
-#: ../../Zotlabs/Module/Layouts.php:197 ../../Zotlabs/Module/Events.php:694
-#: ../../Zotlabs/Module/Webpages.php:250 ../../Zotlabs/Module/Wiki.php:165
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:151
-#: ../../include/page_widgets.php:42
-msgid "View"
+#: ../../Zotlabs/Module/Settings/Channel.php:530
+msgid "accepting a friend request"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:82
-msgid "Could not access contact record."
+#: ../../Zotlabs/Module/Settings/Channel.php:531
+msgid "joining a forum/community"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:112
-msgid "Could not locate selected profile."
+#: ../../Zotlabs/Module/Settings/Channel.php:532
+msgid "making an <em>interesting</em> profile change"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:249
-msgid "Connection updated."
+#: ../../Zotlabs/Module/Settings/Channel.php:533
+msgid "Send a notification email when:"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:251
-msgid "Failed to update connection record."
+#: ../../Zotlabs/Module/Settings/Channel.php:534
+msgid "You receive a connection request"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:301
-msgid "is now connected to"
+#: ../../Zotlabs/Module/Settings/Channel.php:535
+msgid "Your connections are confirmed"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:434
-msgid "Could not access address book record."
+#: ../../Zotlabs/Module/Settings/Channel.php:536
+msgid "Someone writes on your profile wall"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:454
-msgid "Refresh failed - channel is currently unavailable."
+#: ../../Zotlabs/Module/Settings/Channel.php:537
+msgid "Someone writes a followup comment"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:469 ../../Zotlabs/Module/Connedit.php:478
-#: ../../Zotlabs/Module/Connedit.php:487 ../../Zotlabs/Module/Connedit.php:496
-#: ../../Zotlabs/Module/Connedit.php:509
-msgid "Unable to set address book parameters."
+#: ../../Zotlabs/Module/Settings/Channel.php:538
+msgid "You receive a private message"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:533
-msgid "Connection has been removed."
+#: ../../Zotlabs/Module/Settings/Channel.php:539
+msgid "You receive a friend suggestion"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:573 ../../Zotlabs/Lib/Apps.php:228
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:57
-#: ../../include/conversation.php:936 ../../include/conversation.php:1049
-#: ../../include/nav.php:103
-msgid "View Profile"
+#: ../../Zotlabs/Module/Settings/Channel.php:540
+msgid "You are tagged in a post"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:576
-#, php-format
-msgid "View %s's profile"
+#: ../../Zotlabs/Module/Settings/Channel.php:541
+msgid "You are poked/prodded/etc. in a post"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:580
-msgid "Refresh Permissions"
+#: ../../Zotlabs/Module/Settings/Channel.php:543
+msgid "Someone likes your post/comment"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:583
-msgid "Fetch updated permissions"
+#: ../../Zotlabs/Module/Settings/Channel.php:546
+msgid "Show visual notifications including:"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:587
-msgid "Recent Activity"
+#: ../../Zotlabs/Module/Settings/Channel.php:548
+msgid "Unseen grid activity"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:590
-msgid "View recent posts and comments"
+#: ../../Zotlabs/Module/Settings/Channel.php:549
+msgid "Unseen channel activity"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:597
-msgid "Block (or Unblock) all communications with this connection"
+#: ../../Zotlabs/Module/Settings/Channel.php:550
+msgid "Unseen private messages"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:598
-msgid "This connection is blocked!"
+#: ../../Zotlabs/Module/Settings/Channel.php:550
+#: ../../Zotlabs/Module/Settings/Channel.php:555
+#: ../../Zotlabs/Module/Settings/Channel.php:556
+#: ../../Zotlabs/Module/Settings/Channel.php:557
+#: ../../addon/jappixmini/jappixmini.php:343
+msgid "Recommended"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:602
-msgid "Unignore"
+#: ../../Zotlabs/Module/Settings/Channel.php:551
+msgid "Upcoming events"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:605
-msgid "Ignore (or Unignore) all inbound communications from this connection"
+#: ../../Zotlabs/Module/Settings/Channel.php:552
+msgid "Events today"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:606
-msgid "This connection is ignored!"
+#: ../../Zotlabs/Module/Settings/Channel.php:553
+msgid "Upcoming birthdays"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:610
-msgid "Unarchive"
+#: ../../Zotlabs/Module/Settings/Channel.php:553
+msgid "Not available in all themes"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:610
-msgid "Archive"
+#: ../../Zotlabs/Module/Settings/Channel.php:554
+msgid "System (personal) notifications"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:613
-msgid ""
-"Archive (or Unarchive) this connection - mark channel dead but keep content"
+#: ../../Zotlabs/Module/Settings/Channel.php:555
+msgid "System info messages"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:614
-msgid "This connection is archived!"
+#: ../../Zotlabs/Module/Settings/Channel.php:556
+msgid "System critical alerts"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:618
-msgid "Unhide"
+#: ../../Zotlabs/Module/Settings/Channel.php:557
+msgid "New connections"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:618
-msgid "Hide"
+#: ../../Zotlabs/Module/Settings/Channel.php:558
+msgid "System Registrations"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:621
-msgid "Hide or Unhide this connection from your other connections"
+#: ../../Zotlabs/Module/Settings/Channel.php:559
+msgid ""
+"Also show new wall posts, private messages and connections under Notices"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:622
-msgid "This connection is hidden!"
+#: ../../Zotlabs/Module/Settings/Channel.php:561
+msgid "Notify me of events this many days in advance"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:629
-msgid "Delete this connection"
+#: ../../Zotlabs/Module/Settings/Channel.php:561
+msgid "Must be greater than 0"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:640
-msgid "Open Individual Permissions section by default"
+#: ../../Zotlabs/Module/Settings/Channel.php:567
+msgid "Advanced Account/Page Type Settings"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:663
-msgid "Affinity"
+#: ../../Zotlabs/Module/Settings/Channel.php:568
+msgid "Change the behaviour of this account for special situations"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:666
-msgid "Open Set Affinity section by default"
+#: ../../Zotlabs/Module/Settings/Channel.php:570
+msgid "Miscellaneous Settings"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:670 ../../include/widgets.php:540
-msgid "Me"
+#: ../../Zotlabs/Module/Settings/Channel.php:571
+msgid "Default photo upload folder"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:671 ../../include/widgets.php:541
-msgid "Family"
+#: ../../Zotlabs/Module/Settings/Channel.php:571
+#: ../../Zotlabs/Module/Settings/Channel.php:572
+msgid "%Y - current year, %m - current month"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:672
-#: ../../Zotlabs/Module/Settings/Channel.php:62
-#: ../../Zotlabs/Module/Settings/Channel.php:66
-#: ../../Zotlabs/Module/Settings/Channel.php:67
-#: ../../Zotlabs/Module/Settings/Channel.php:70
-#: ../../Zotlabs/Module/Settings/Channel.php:81
-#: ../../include/selectors.php:123 ../../include/widgets.php:542
-#: ../../include/channel.php:408 ../../include/channel.php:409
-#: ../../include/channel.php:416
-msgid "Friends"
+#: ../../Zotlabs/Module/Settings/Channel.php:572
+msgid "Default file upload folder"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:673 ../../include/widgets.php:543
-msgid "Acquaintances"
+#: ../../Zotlabs/Module/Settings/Channel.php:574
+msgid "Personal menu to display in your channel pages"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:700
-msgid "Filter"
+#: ../../Zotlabs/Module/Settings/Channel.php:576
+msgid "Remove this channel."
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:703
-msgid "Open Custom Filter section by default"
+#: ../../Zotlabs/Module/Settings/Channel.php:577
+msgid "Firefox Share $Projectname provider"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:740
-msgid "Approve this connection"
+#: ../../Zotlabs/Module/Settings/Channel.php:578
+msgid "Start calendar week on Monday"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:740
-msgid "Accept connection to allow communication"
+#: ../../Zotlabs/Module/Settings/Features.php:45
+msgid "Additional Features"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:745
-msgid "Set Affinity"
+#: ../../Zotlabs/Module/Settings/Tokens.php:31
+#, php-format
+msgid "This channel is limited to %d tokens"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:748
-msgid "Set Profile"
+#: ../../Zotlabs/Module/Settings/Tokens.php:37
+msgid "Name and Password are required."
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:751
-msgid "Set Affinity & Profile"
+#: ../../Zotlabs/Module/Settings/Tokens.php:77
+msgid "Token saved."
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:809
-msgid "none"
+#: ../../Zotlabs/Module/Settings/Tokens.php:113
+msgid ""
+"Use this form to create temporary access identifiers to share things with "
+"non-members. These identities may be used in Access Control Lists and "
+"visitors may login using these credentials to access private content."
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:812 ../../include/widgets.php:675
-msgid "Connection Default Permissions"
+#: ../../Zotlabs/Module/Settings/Tokens.php:115
+msgid ""
+"You may also provide <em>dropbox</em> style access links to friends and "
+"associates by adding the Login Password to any specific site URL as shown. "
+"Examples:"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:812 ../../include/items.php:3932
-#, php-format
-msgid "Connection: %s"
+#: ../../Zotlabs/Module/Settings/Tokens.php:150
+#: ../../Zotlabs/Widget/Settings_menu.php:90
+msgid "Guest Access Tokens"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:813
-msgid "Apply these permissions automatically"
+#: ../../Zotlabs/Module/Settings/Tokens.php:157
+msgid "Login Name"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:813
-msgid "Connection requests will be approved without your interaction"
+#: ../../Zotlabs/Module/Settings/Tokens.php:158
+msgid "Login Password"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:814
-msgid "Permission role"
+#: ../../Zotlabs/Module/Settings/Tokens.php:159
+msgid "Expires (yyyy-mm-dd)"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:815
-msgid "Add permission role"
+#: ../../Zotlabs/Module/Settings/Tokens.php:160
+#: ../../Zotlabs/Module/Connedit.php:885
+msgid "Their Settings"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:821
-msgid "This connection's primary address is"
+#: ../../Zotlabs/Module/Settings/Account.php:20
+msgid "Not valid email."
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:822
-msgid "Available locations:"
+#: ../../Zotlabs/Module/Settings/Account.php:23
+msgid "Protected email address. Cannot change to that email."
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:826
-msgid ""
-"The permissions indicated on this page will be applied to all new "
-"connections."
+#: ../../Zotlabs/Module/Settings/Account.php:32
+msgid "System failure storing new email. Please try again."
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:827
-msgid "Connection Tools"
+#: ../../Zotlabs/Module/Settings/Account.php:40
+msgid "Technical skill level updated"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:829
-msgid "Slide to adjust your degree of friendship"
+#: ../../Zotlabs/Module/Settings/Account.php:56
+msgid "Password verification failed."
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:830 ../../Zotlabs/Module/Rate.php:155
-#: ../../include/js_strings.php:20
-msgid "Rating"
+#: ../../Zotlabs/Module/Settings/Account.php:63
+msgid "Passwords do not match. Password unchanged."
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:831
-msgid "Slide to adjust your rating"
+#: ../../Zotlabs/Module/Settings/Account.php:67
+msgid "Empty passwords are not allowed. Password unchanged."
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:832 ../../Zotlabs/Module/Connedit.php:837
-msgid "Optionally explain your rating"
+#: ../../Zotlabs/Module/Settings/Account.php:81
+msgid "Password changed."
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:834
-msgid "Custom Filter"
+#: ../../Zotlabs/Module/Settings/Account.php:83
+msgid "Password update failed. Please try again."
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:835
-msgid "Only import posts with this text"
+#: ../../Zotlabs/Module/Settings/Account.php:112
+msgid "Account Settings"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:835 ../../Zotlabs/Module/Connedit.php:836
-msgid ""
-"words one per line or #tags or /patterns/ or lang=xx, leave blank to import "
-"all posts"
+#: ../../Zotlabs/Module/Settings/Account.php:113
+msgid "Current Password"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:836
-msgid "Do not import posts with this text"
+#: ../../Zotlabs/Module/Settings/Account.php:114
+msgid "Enter New Password"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:838
-msgid "This information is public!"
+#: ../../Zotlabs/Module/Settings/Account.php:115
+msgid "Confirm New Password"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:843
-msgid "Connection Pending Approval"
+#: ../../Zotlabs/Module/Settings/Account.php:115
+msgid "Leave password fields blank unless changing"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:846
-#: ../../Zotlabs/Module/Settings/Tokens.php:163
-#: ../../Zotlabs/Module/Settings/Permcats.php:107
-msgid "inherited"
+#: ../../Zotlabs/Module/Settings/Account.php:116
+msgid "Your technical skill level"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:848
-#, php-format
-msgid ""
-"Please choose the profile you would like to display to %s when viewing your "
-"profile securely."
+#: ../../Zotlabs/Module/Settings/Account.php:116
+msgid "Used to provide a member experience matched to your comfort level"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:850
-#: ../../Zotlabs/Module/Settings/Tokens.php:160
-msgid "Their Settings"
+#: ../../Zotlabs/Module/Settings/Account.php:120
+#: ../../Zotlabs/Module/Removeaccount.php:61
+msgid "Remove Account"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:851
-#: ../../Zotlabs/Module/Settings/Tokens.php:161
-#: ../../Zotlabs/Module/Settings/Permcats.php:105
-msgid "My Settings"
+#: ../../Zotlabs/Module/Settings/Account.php:121
+msgid "Remove this account including all its channels"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:853
-#: ../../Zotlabs/Module/Settings/Tokens.php:166
-#: ../../Zotlabs/Module/Settings/Permcats.php:110
-msgid "Individual Permissions"
+#: ../../Zotlabs/Module/Settings/Featured.php:20
+msgid "Affinity Slider settings updated."
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:854
-#: ../../Zotlabs/Module/Settings/Tokens.php:167
-#: ../../Zotlabs/Module/Settings/Permcats.php:111
-msgid ""
-"Some permissions may be inherited from your channel's <a href=\"settings"
-"\"><strong>privacy settings</strong></a>, which have higher priority than "
-"individual settings. You can <strong>not</strong> change those settings here."
+#: ../../Zotlabs/Module/Settings/Featured.php:34
+msgid "No feature settings configured"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:855
-msgid ""
-"Some permissions may be inherited from your channel's <a href=\"settings"
-"\"><strong>privacy settings</strong></a>, which have higher priority than "
-"individual settings. You can change those settings here but they wont have "
-"any impact unless the inherited setting changes."
+#: ../../Zotlabs/Module/Settings/Featured.php:41
+msgid "Default maximum affinity level"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:856
-msgid "Last update:"
+#: ../../Zotlabs/Module/Settings/Featured.php:46
+msgid "Default minimum affinity level"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:865
-msgid "Details"
+#: ../../Zotlabs/Module/Settings/Featured.php:50
+msgid "Affinity Slider Settings"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:868
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1137
-msgid "Organisation"
+#: ../../Zotlabs/Module/Settings/Featured.php:60
+msgid "Feature/Addon Settings"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:869
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1138
-#: ../../include/page_widgets.php:46
-msgid "Title"
+#: ../../Zotlabs/Module/Settings/Display.php:145
+msgid "No special theme for mobile devices"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:870
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1139
-msgid "Phone"
+#: ../../Zotlabs/Module/Settings/Display.php:148
+#, php-format
+msgid "%s - (Experimental)"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:872
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1141
-msgid "Instant messenger"
+#: ../../Zotlabs/Module/Settings/Display.php:198
+msgid "Display Settings"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:873
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1142
-msgid "Website"
+#: ../../Zotlabs/Module/Settings/Display.php:199
+msgid "Theme Settings"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:875
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1144
-msgid "Note"
+#: ../../Zotlabs/Module/Settings/Display.php:200
+msgid "Custom Theme Settings"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:876
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1145
-#: ../../extend/addon/addon/cdav/cdav.php:270
-#: ../../include/connections.php:894
-msgid "Mobile"
+#: ../../Zotlabs/Module/Settings/Display.php:201
+msgid "Content Settings"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:877
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1146
-#: ../../extend/addon/addon/cdav/cdav.php:271
-#: ../../include/connections.php:895
-msgid "Home"
+#: ../../Zotlabs/Module/Settings/Display.php:207
+msgid "Display Theme:"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:878
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1147
-#: ../../extend/addon/addon/cdav/cdav.php:274
-#: ../../include/connections.php:898
-msgid "Work"
+#: ../../Zotlabs/Module/Settings/Display.php:208
+msgid "Select scheme"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:880
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:368
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1149
-msgid "Add Contact"
+#: ../../Zotlabs/Module/Settings/Display.php:210
+msgid "Mobile Theme:"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:881
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1150
-msgid "Add Field"
+#: ../../Zotlabs/Module/Settings/Display.php:211
+msgid "Preload images before rendering the page"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:886
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1155
-msgid "P.O. Box"
+#: ../../Zotlabs/Module/Settings/Display.php:211
+msgid ""
+"The subjective page load time will be longer but the page will be ready when "
+"displayed"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:887
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1156
-msgid "Additional"
+#: ../../Zotlabs/Module/Settings/Display.php:212
+msgid "Enable user zoom on mobile devices"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:888
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1157
-msgid "Street"
+#: ../../Zotlabs/Module/Settings/Display.php:213
+msgid "Update browser every xx seconds"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:889
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1158
-msgid "Locality"
+#: ../../Zotlabs/Module/Settings/Display.php:213
+msgid "Minimum of 10 seconds, no maximum"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:890
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1159
-msgid "Region"
+#: ../../Zotlabs/Module/Settings/Display.php:214
+msgid "Maximum number of conversations to load at any time:"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:891
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1160
-msgid "ZIP Code"
+#: ../../Zotlabs/Module/Settings/Display.php:214
+msgid "Maximum of 100 items"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:892 ../../Zotlabs/Module/Profiles.php:756
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1161
-msgid "Country"
+#: ../../Zotlabs/Module/Settings/Display.php:215
+msgid "Show emoticons (smilies) as images"
msgstr ""
-#: ../../Zotlabs/Module/Home.php:74 ../../Zotlabs/Module/Home.php:82
-#: ../../extend/addon/addon/opensearch/opensearch.php:42
-msgid "$Projectname"
+#: ../../Zotlabs/Module/Settings/Display.php:216
+msgid "Manual conversation updates"
msgstr ""
-#: ../../Zotlabs/Module/Home.php:92
-#, php-format
-msgid "Welcome to %s"
+#: ../../Zotlabs/Module/Settings/Display.php:216
+msgid "Default is on, turning this off may increase screen jumping"
msgstr ""
-#: ../../Zotlabs/Module/Filestorage.php:87
-msgid "Permission Denied."
+#: ../../Zotlabs/Module/Settings/Display.php:217
+msgid "Link post titles to source"
msgstr ""
-#: ../../Zotlabs/Module/Filestorage.php:103
-msgid "File not found."
+#: ../../Zotlabs/Module/Settings/Display.php:218
+msgid "System Page Layout Editor - (advanced)"
msgstr ""
-#: ../../Zotlabs/Module/Filestorage.php:146
-msgid "Edit file permissions"
+#: ../../Zotlabs/Module/Settings/Display.php:221
+msgid "Use blog/list mode on channel page"
msgstr ""
-#: ../../Zotlabs/Module/Filestorage.php:159
-msgid "Set/edit permissions"
+#: ../../Zotlabs/Module/Settings/Display.php:221
+#: ../../Zotlabs/Module/Settings/Display.php:222
+msgid "(comments displayed separately)"
msgstr ""
-#: ../../Zotlabs/Module/Filestorage.php:160
-msgid "Include all files and sub folders"
+#: ../../Zotlabs/Module/Settings/Display.php:222
+msgid "Use blog/list mode on grid page"
msgstr ""
-#: ../../Zotlabs/Module/Filestorage.php:161
-msgid "Return to file list"
+#: ../../Zotlabs/Module/Settings/Display.php:223
+msgid "Channel page max height of content (in pixels)"
msgstr ""
-#: ../../Zotlabs/Module/Filestorage.php:163
-msgid "Copy/paste this code to attach file to a post"
+#: ../../Zotlabs/Module/Settings/Display.php:223
+#: ../../Zotlabs/Module/Settings/Display.php:224
+msgid "click to expand content exceeding this height"
msgstr ""
-#: ../../Zotlabs/Module/Filestorage.php:164
-msgid "Copy/paste this URL to link file from a web page"
+#: ../../Zotlabs/Module/Settings/Display.php:224
+msgid "Grid page max height of content (in pixels)"
msgstr ""
-#: ../../Zotlabs/Module/Filestorage.php:166
-msgid "Share this file"
+#: ../../Zotlabs/Module/Settings/Oauth.php:34
+msgid "Name is required"
msgstr ""
-#: ../../Zotlabs/Module/Filestorage.php:167
-msgid "Show URL to this file"
+#: ../../Zotlabs/Module/Settings/Oauth.php:38
+msgid "Key and Secret are required"
msgstr ""
-#: ../../Zotlabs/Module/Filestorage.php:168
-msgid "Notify your contacts about this file"
+#: ../../Zotlabs/Module/Settings/Oauth.php:86
+#: ../../Zotlabs/Module/Settings/Oauth.php:112
+#: ../../Zotlabs/Module/Settings/Oauth.php:148
+msgid "Add application"
msgstr ""
-#: ../../Zotlabs/Module/Fbrowser.php:29 ../../Zotlabs/Lib/Apps.php:229
-#: ../../include/conversation.php:1836
-msgid "Photos"
+#: ../../Zotlabs/Module/Settings/Oauth.php:89
+msgid "Name of application"
msgstr ""
-#: ../../Zotlabs/Module/Apps.php:45 ../../include/widgets.php:102
-#: ../../include/nav.php:178
-msgid "Apps"
+#: ../../Zotlabs/Module/Settings/Oauth.php:90
+#: ../../Zotlabs/Module/Settings/Oauth.php:116
+#: ../../addon/statusnet/statusnet.php:893 ../../addon/twitter/twitter.php:775
+msgid "Consumer Key"
msgstr ""
-#: ../../Zotlabs/Module/Cal.php:69
-msgid "Permissions denied."
+#: ../../Zotlabs/Module/Settings/Oauth.php:90
+#: ../../Zotlabs/Module/Settings/Oauth.php:91
+msgid "Automatically generated - change if desired. Max length 20"
msgstr ""
-#: ../../Zotlabs/Module/Cal.php:263 ../../Zotlabs/Module/Events.php:605
-msgid "l, F j"
+#: ../../Zotlabs/Module/Settings/Oauth.php:91
+#: ../../Zotlabs/Module/Settings/Oauth.php:117
+#: ../../addon/statusnet/statusnet.php:892 ../../addon/twitter/twitter.php:776
+msgid "Consumer Secret"
msgstr ""
-#: ../../Zotlabs/Module/Cal.php:312 ../../Zotlabs/Module/Events.php:660
-#: ../../include/text.php:1761
-msgid "Link to Source"
+#: ../../Zotlabs/Module/Settings/Oauth.php:92
+#: ../../Zotlabs/Module/Settings/Oauth.php:118
+msgid "Redirect"
msgstr ""
-#: ../../Zotlabs/Module/Cal.php:335 ../../Zotlabs/Module/Events.php:688
-msgid "Edit Event"
+#: ../../Zotlabs/Module/Settings/Oauth.php:92
+msgid ""
+"Redirect URI - leave blank unless your application specifically requires this"
msgstr ""
-#: ../../Zotlabs/Module/Cal.php:335 ../../Zotlabs/Module/Events.php:688
-msgid "Create Event"
+#: ../../Zotlabs/Module/Settings/Oauth.php:93
+#: ../../Zotlabs/Module/Settings/Oauth.php:119
+msgid "Icon url"
msgstr ""
-#: ../../Zotlabs/Module/Cal.php:338 ../../Zotlabs/Module/Events.php:691
-#: ../../include/channel.php:1370
-msgid "Export"
+#: ../../Zotlabs/Module/Settings/Oauth.php:93
+#: ../../Zotlabs/Module/Sources.php:112 ../../Zotlabs/Module/Sources.php:147
+msgid "Optional"
msgstr ""
-#: ../../Zotlabs/Module/Cal.php:341 ../../include/text.php:2307
-msgid "Import"
+#: ../../Zotlabs/Module/Settings/Oauth.php:104
+msgid "Application not found."
msgstr ""
-#: ../../Zotlabs/Module/Cal.php:345 ../../Zotlabs/Module/Events.php:700
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:848
-msgid "Today"
+#: ../../Zotlabs/Module/Settings/Oauth.php:147
+msgid "Connected Apps"
msgstr ""
-#: ../../Zotlabs/Module/Group.php:24
-msgid "Privacy group created."
+#: ../../Zotlabs/Module/Settings/Oauth.php:151
+msgid "Client key starts with"
msgstr ""
-#: ../../Zotlabs/Module/Group.php:30
-msgid "Could not create privacy group."
+#: ../../Zotlabs/Module/Settings/Oauth.php:152
+msgid "No name"
msgstr ""
-#: ../../Zotlabs/Module/Group.php:42 ../../Zotlabs/Module/Group.php:141
-#: ../../include/items.php:3899
-msgid "Privacy group not found."
+#: ../../Zotlabs/Module/Settings/Oauth.php:153
+msgid "Remove authorization"
msgstr ""
-#: ../../Zotlabs/Module/Group.php:58
-msgid "Privacy group updated."
+#: ../../Zotlabs/Module/Embedphotos.php:140 ../../Zotlabs/Module/Photos.php:751
+#: ../../Zotlabs/Module/Photos.php:1290 ../../Zotlabs/Widget/Album.php:78
+msgid "View Photo"
msgstr ""
-#: ../../Zotlabs/Module/Group.php:90
-msgid "Create a group of channels."
+#: ../../Zotlabs/Module/Embedphotos.php:146 ../../Zotlabs/Module/Photos.php:757
+#: ../../Zotlabs/Module/Photos.php:1213 ../../Zotlabs/Lib/Apps.php:571
+#: ../../Zotlabs/Lib/Apps.php:649 ../../Zotlabs/Storage/Browser.php:163
+#: ../../Zotlabs/Widget/Album.php:84 ../../addon/cdav/Mod_Cdav.php:745
+#: ../../addon/cdav/Mod_Cdav.php:746 ../../addon/cdav/Mod_Cdav.php:753
+#: ../../include/conversation.php:1110
+msgid "Unknown"
msgstr ""
-#: ../../Zotlabs/Module/Group.php:91 ../../Zotlabs/Module/Group.php:184
-msgid "Privacy group name: "
+#: ../../Zotlabs/Module/Embedphotos.php:156 ../../Zotlabs/Module/Photos.php:782
+#: ../../Zotlabs/Widget/Album.php:95
+msgid "Edit Album"
msgstr ""
-#: ../../Zotlabs/Module/Group.php:93 ../../Zotlabs/Module/Group.php:187
-msgid "Members are visible to other channels"
+#: ../../Zotlabs/Module/Embedphotos.php:158 ../../Zotlabs/Module/Photos.php:784
+#: ../../Zotlabs/Module/Photos.php:1321
+#: ../../Zotlabs/Module/Profile_photo.php:423
+#: ../../Zotlabs/Module/Cover_photo.php:361
+#: ../../Zotlabs/Storage/Browser.php:229 ../../Zotlabs/Storage/Browser.php:334
+#: ../../Zotlabs/Widget/Album.php:97 ../../addon/cdav/include/widgets.php:132
+#: ../../addon/cdav/include/widgets.php:168
+msgid "Upload"
msgstr ""
-#: ../../Zotlabs/Module/Group.php:111
-msgid "Privacy group removed."
+#: ../../Zotlabs/Module/Achievements.php:38
+msgid "Some blurb about what to do when you're new here"
msgstr ""
-#: ../../Zotlabs/Module/Group.php:113
-msgid "Unable to remove privacy group."
+#: ../../Zotlabs/Module/Thing.php:114
+msgid "Thing updated"
msgstr ""
-#: ../../Zotlabs/Module/Group.php:183
-msgid "Privacy group editor"
+#: ../../Zotlabs/Module/Thing.php:166
+msgid "Object store: failed"
msgstr ""
-#: ../../Zotlabs/Module/Group.php:199
-msgid "All Connected Channels"
+#: ../../Zotlabs/Module/Thing.php:170
+msgid "Thing added"
msgstr ""
-#: ../../Zotlabs/Module/Group.php:231
-msgid "Click on a channel to add or remove."
+#: ../../Zotlabs/Module/Thing.php:196
+#, php-format
+msgid "OBJ: %1$s %2$s %3$s"
msgstr ""
-#: ../../Zotlabs/Module/Dreport.php:45
-msgid "Invalid message"
+#: ../../Zotlabs/Module/Thing.php:259
+msgid "Show Thing"
msgstr ""
-#: ../../Zotlabs/Module/Dreport.php:78
-msgid "no results"
+#: ../../Zotlabs/Module/Thing.php:266
+msgid "item not found."
msgstr ""
-#: ../../Zotlabs/Module/Dreport.php:93
-msgid "channel sync processed"
+#: ../../Zotlabs/Module/Thing.php:299
+msgid "Edit Thing"
msgstr ""
-#: ../../Zotlabs/Module/Dreport.php:97
-msgid "queued"
+#: ../../Zotlabs/Module/Thing.php:301 ../../Zotlabs/Module/Thing.php:355
+msgid "Select a profile"
msgstr ""
-#: ../../Zotlabs/Module/Dreport.php:101
-msgid "posted"
+#: ../../Zotlabs/Module/Thing.php:305 ../../Zotlabs/Module/Thing.php:358
+msgid "Post an activity"
msgstr ""
-#: ../../Zotlabs/Module/Dreport.php:105
-msgid "accepted for delivery"
+#: ../../Zotlabs/Module/Thing.php:305 ../../Zotlabs/Module/Thing.php:358
+msgid "Only sends to viewers of the applicable profile"
msgstr ""
-#: ../../Zotlabs/Module/Dreport.php:109
-msgid "updated"
+#: ../../Zotlabs/Module/Thing.php:307 ../../Zotlabs/Module/Thing.php:360
+msgid "Name of thing e.g. something"
msgstr ""
-#: ../../Zotlabs/Module/Dreport.php:112
-msgid "update ignored"
+#: ../../Zotlabs/Module/Thing.php:309 ../../Zotlabs/Module/Thing.php:361
+msgid "URL of thing (optional)"
msgstr ""
-#: ../../Zotlabs/Module/Dreport.php:115
-msgid "permission denied"
+#: ../../Zotlabs/Module/Thing.php:311 ../../Zotlabs/Module/Thing.php:362
+msgid "URL for photo of thing (optional)"
msgstr ""
-#: ../../Zotlabs/Module/Dreport.php:119
-msgid "recipient not found"
+#: ../../Zotlabs/Module/Thing.php:313 ../../Zotlabs/Module/Thing.php:363
+#: ../../Zotlabs/Module/Photos.php:647 ../../Zotlabs/Module/Photos.php:1011
+#: ../../Zotlabs/Module/Connedit.php:672 ../../Zotlabs/Module/Chat.php:233
+#: ../../Zotlabs/Module/Filestorage.php:152 ../../include/acl_selectors.php:218
+msgid "Permissions"
msgstr ""
-#: ../../Zotlabs/Module/Dreport.php:122
-msgid "mail recalled"
+#: ../../Zotlabs/Module/Thing.php:353
+msgid "Add Thing to your Profile"
msgstr ""
-#: ../../Zotlabs/Module/Dreport.php:125
-msgid "duplicate mail received"
+#: ../../Zotlabs/Module/Notify.php:57 ../../Zotlabs/Module/Notifications.php:38
+msgid "No more system notifications."
msgstr ""
-#: ../../Zotlabs/Module/Dreport.php:128
-msgid "mail delivered"
+#: ../../Zotlabs/Module/Notify.php:61 ../../Zotlabs/Module/Notifications.php:42
+msgid "System Notifications"
msgstr ""
-#: ../../Zotlabs/Module/Dreport.php:148
-#, php-format
-msgid "Delivery report for %1$s"
+#: ../../Zotlabs/Module/Follow.php:31
+msgid "Channel added."
msgstr ""
-#: ../../Zotlabs/Module/Dreport.php:151
-msgid "Options"
+#: ../../Zotlabs/Module/Import.php:144
+#, php-format
+msgid "Your service plan only allows %d channels."
msgstr ""
-#: ../../Zotlabs/Module/Dreport.php:152
-msgid "Redeliver"
+#: ../../Zotlabs/Module/Import.php:158
+msgid "No channel. Import failed."
msgstr ""
-#: ../../Zotlabs/Module/Impel.php:41 ../../include/bbcode.php:203
-msgid "webpage"
+#: ../../Zotlabs/Module/Import.php:466
+#: ../../addon/diaspora/import_diaspora.php:142
+msgid "Import completed."
msgstr ""
-#: ../../Zotlabs/Module/Impel.php:46 ../../include/bbcode.php:209
-msgid "block"
+#: ../../Zotlabs/Module/Import.php:494
+msgid "You must be logged in to use this feature."
msgstr ""
-#: ../../Zotlabs/Module/Impel.php:51 ../../include/bbcode.php:206
-msgid "layout"
+#: ../../Zotlabs/Module/Import.php:499
+msgid "Import Channel"
msgstr ""
-#: ../../Zotlabs/Module/Impel.php:58 ../../include/bbcode.php:212
-msgid "menu"
+#: ../../Zotlabs/Module/Import.php:500
+msgid ""
+"Use this form to import an existing channel from a different server/hub. You "
+"may retrieve the channel identity from the old server/hub via the network or "
+"provide an export file."
msgstr ""
-#: ../../Zotlabs/Module/Impel.php:191
-#, php-format
-msgid "%s element installed"
+#: ../../Zotlabs/Module/Import.php:502
+msgid "Or provide the old server/hub details"
msgstr ""
-#: ../../Zotlabs/Module/Impel.php:194
-#, php-format
-msgid "%s element installation failed"
+#: ../../Zotlabs/Module/Import.php:503
+msgid "Your old identity address (xyz@example.com)"
msgstr ""
-#: ../../Zotlabs/Module/Import_items.php:42 ../../Zotlabs/Module/Import.php:57
-msgid "Nothing to import."
+#: ../../Zotlabs/Module/Import.php:504
+msgid "Your old login email address"
msgstr ""
-#: ../../Zotlabs/Module/Import_items.php:66 ../../Zotlabs/Module/Import.php:69
-#: ../../Zotlabs/Module/Import.php:84
-msgid "Unable to download data from old server"
+#: ../../Zotlabs/Module/Import.php:505
+msgid "Your old login password"
msgstr ""
-#: ../../Zotlabs/Module/Import_items.php:72 ../../Zotlabs/Module/Import.php:91
-msgid "Imported file is empty."
+#: ../../Zotlabs/Module/Import.php:506
+msgid ""
+"For either option, please choose whether to make this hub your new primary "
+"address, or whether your old location should continue this role. You will be "
+"able to post from either location, but only one can be marked as the primary "
+"location for files, photos, and media."
msgstr ""
-#: ../../Zotlabs/Module/Import_items.php:88
-#: ../../Zotlabs/Module/Import.php:111
-#, php-format
-msgid "Warning: Database versions differ by %1$d updates."
+#: ../../Zotlabs/Module/Import.php:507
+msgid "Make this hub my primary location"
msgstr ""
-#: ../../Zotlabs/Module/Import_items.php:104
-msgid "Import completed"
+#: ../../Zotlabs/Module/Import.php:508
+msgid "Move this channel (disable all previous locations)"
msgstr ""
-#: ../../Zotlabs/Module/Import_items.php:119
-msgid "Import Items"
+#: ../../Zotlabs/Module/Import.php:509
+msgid "Import a few months of posts if possible (limited by available memory"
msgstr ""
-#: ../../Zotlabs/Module/Import_items.php:120
-msgid "Use this form to import existing posts and content from an export file."
+#: ../../Zotlabs/Module/Import.php:510
+msgid ""
+"This process may take several minutes to complete. Please submit the form "
+"only once and leave this page open until finished."
msgstr ""
-#: ../../Zotlabs/Module/Import_items.php:121
-#: ../../Zotlabs/Module/Import.php:495
-msgid "File to Upload"
+#: ../../Zotlabs/Module/Rmagic.php:35
+msgid "Authentication failed."
msgstr ""
-#: ../../Zotlabs/Module/Manage.php:136
-#: ../../Zotlabs/Module/New_channel.php:121
-#, php-format
-msgid "You have created %1$.0f of %2$.0f allowed channels."
+#: ../../Zotlabs/Module/Rmagic.php:75 ../../include/channel.php:1984
+msgid "Remote Authentication"
msgstr ""
-#: ../../Zotlabs/Module/Manage.php:143
-msgid "Create a new channel"
+#: ../../Zotlabs/Module/Rmagic.php:76 ../../include/channel.php:1985
+msgid "Enter your channel address (e.g. channel@example.com)"
msgstr ""
-#: ../../Zotlabs/Module/Manage.php:143 ../../Zotlabs/Module/Profiles.php:813
-#: ../../Zotlabs/Module/Wiki.php:166 ../../Zotlabs/Module/Chat.php:255
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:152
-msgid "Create New"
+#: ../../Zotlabs/Module/Rmagic.php:77 ../../include/channel.php:1986
+msgid "Authenticate"
msgstr ""
-#: ../../Zotlabs/Module/Manage.php:164 ../../Zotlabs/Lib/Apps.php:221
-#: ../../include/nav.php:223
-msgid "Channel Manager"
+#: ../../Zotlabs/Module/Cal.php:62 ../../Zotlabs/Module/Chanview.php:96
+#: ../../Zotlabs/Module/Page.php:56 ../../Zotlabs/Module/Wall_upload.php:31
+#: ../../Zotlabs/Module/Block.php:43
+msgid "Channel not found."
msgstr ""
-#: ../../Zotlabs/Module/Manage.php:165
-msgid "Current Channel"
+#: ../../Zotlabs/Module/Cal.php:69
+msgid "Permissions denied."
msgstr ""
-#: ../../Zotlabs/Module/Manage.php:167
-msgid "Switch to one of your channels by selecting it."
+#: ../../Zotlabs/Module/Cal.php:342 ../../include/text.php:2291
+msgid "Import"
msgstr ""
-#: ../../Zotlabs/Module/Manage.php:168
-msgid "Default Channel"
+#: ../../Zotlabs/Module/Api.php:72 ../../Zotlabs/Module/Api.php:93
+msgid "Authorize application connection"
msgstr ""
-#: ../../Zotlabs/Module/Manage.php:169
-msgid "Make Default"
+#: ../../Zotlabs/Module/Api.php:73
+msgid "Return to your app and insert this Security Code:"
msgstr ""
-#: ../../Zotlabs/Module/Manage.php:172
-#, php-format
-msgid "%d new messages"
+#: ../../Zotlabs/Module/Api.php:83
+msgid "Please login to continue."
msgstr ""
-#: ../../Zotlabs/Module/Manage.php:173
-#, php-format
-msgid "%d new introductions"
+#: ../../Zotlabs/Module/Api.php:95
+msgid ""
+"Do you want to authorize this application to access your posts and contacts, "
+"and/or create new posts for you?"
msgstr ""
-#: ../../Zotlabs/Module/Manage.php:175
-msgid "Delegated Channel"
+#: ../../Zotlabs/Module/Attach.php:13
+msgid "Item not available."
msgstr ""
-#: ../../Zotlabs/Module/Import.php:134
-#, php-format
-msgid "Your service plan only allows %d channels."
+#: ../../Zotlabs/Module/Editblock.php:116 ../../Zotlabs/Module/Chat.php:205
+#: ../../Zotlabs/Module/Editwebpage.php:143 ../../Zotlabs/Module/Mail.php:306
+#: ../../Zotlabs/Module/Mail.php:448 ../../include/conversation.php:1228
+msgid "Insert web link"
msgstr ""
-#: ../../Zotlabs/Module/Import.php:149
-msgid "No channel. Import failed."
+#: ../../Zotlabs/Module/Editblock.php:129 ../../include/conversation.php:1339
+msgid "Title (optional)"
msgstr ""
-#: ../../Zotlabs/Module/Import.php:467
-#: ../../extend/addon/addon/diaspora/import_diaspora.php:142
-msgid "Import completed."
+#: ../../Zotlabs/Module/Editblock.php:138
+msgid "Edit Block"
msgstr ""
-#: ../../Zotlabs/Module/Import.php:488
-msgid "You must be logged in to use this feature."
+#: ../../Zotlabs/Module/Profile.php:91
+msgid "vcard"
msgstr ""
-#: ../../Zotlabs/Module/Import.php:493
-msgid "Import Channel"
+#: ../../Zotlabs/Module/Apps.php:45
+msgid "Apps"
msgstr ""
-#: ../../Zotlabs/Module/Import.php:494
-msgid ""
-"Use this form to import an existing channel from a different server/hub. You "
-"may retrieve the channel identity from the old server/hub via the network or "
-"provide an export file."
+#: ../../Zotlabs/Module/Apps.php:48
+msgid "Manage apps"
msgstr ""
-#: ../../Zotlabs/Module/Import.php:496
-msgid "Or provide the old server/hub details"
+#: ../../Zotlabs/Module/Apps.php:49
+msgid "Create new app"
msgstr ""
-#: ../../Zotlabs/Module/Import.php:497
-msgid "Your old identity address (xyz@example.com)"
+#: ../../Zotlabs/Module/Mood.php:67 ../../include/conversation.php:256
+#, php-format
+msgctxt "mood"
+msgid "%1$s is %2$s"
msgstr ""
-#: ../../Zotlabs/Module/Import.php:498
-msgid "Your old login email address"
+#: ../../Zotlabs/Module/Mood.php:135 ../../Zotlabs/Lib/Apps.php:234
+msgid "Mood"
msgstr ""
-#: ../../Zotlabs/Module/Import.php:499
-msgid "Your old login password"
+#: ../../Zotlabs/Module/Mood.php:136
+msgid "Set your current mood and tell your friends"
msgstr ""
-#: ../../Zotlabs/Module/Import.php:500
-msgid ""
-"For either option, please choose whether to make this hub your new primary "
-"address, or whether your old location should continue this role. You will be "
-"able to post from either location, but only one can be marked as the primary "
-"location for files, photos, and media."
+#: ../../Zotlabs/Module/Connections.php:52
+#: ../../Zotlabs/Module/Connections.php:157
+#: ../../Zotlabs/Module/Connections.php:246
+msgid "Blocked"
msgstr ""
-#: ../../Zotlabs/Module/Import.php:501
-msgid "Make this hub my primary location"
+#: ../../Zotlabs/Module/Connections.php:57
+#: ../../Zotlabs/Module/Connections.php:164
+#: ../../Zotlabs/Module/Connections.php:245
+msgid "Ignored"
msgstr ""
-#: ../../Zotlabs/Module/Import.php:502
-msgid "Move this channel (disable all previous locations)"
+#: ../../Zotlabs/Module/Connections.php:62
+#: ../../Zotlabs/Module/Connections.php:178
+#: ../../Zotlabs/Module/Connections.php:244
+msgid "Hidden"
msgstr ""
-#: ../../Zotlabs/Module/Import.php:503
-msgid "Import a few months of posts if possible (limited by available memory"
+#: ../../Zotlabs/Module/Connections.php:67
+#: ../../Zotlabs/Module/Connections.php:171
+#: ../../Zotlabs/Module/Connections.php:243
+msgid "Archived"
msgstr ""
-#: ../../Zotlabs/Module/Import.php:504
-msgid ""
-"This process may take several minutes to complete. Please submit the form "
-"only once and leave this page open until finished."
+#: ../../Zotlabs/Module/Connections.php:72
+#: ../../Zotlabs/Module/Connections.php:82 ../../Zotlabs/Module/Menu.php:116
+#: ../../include/conversation.php:1666
+msgid "New"
msgstr ""
-#: ../../Zotlabs/Module/Lockview.php:75
-msgid "Remote privacy information not available."
+#: ../../Zotlabs/Module/Connections.php:88
+#: ../../Zotlabs/Module/Connections.php:103
+#: ../../Zotlabs/Module/Connedit.php:709 ../../Zotlabs/Widget/Affinity.php:30
+msgid "All"
msgstr ""
-#: ../../Zotlabs/Module/Lockview.php:96
-msgid "Visible to:"
+#: ../../Zotlabs/Module/Connections.php:134
+msgid "New Connections"
msgstr ""
-#: ../../Zotlabs/Module/Magic.php:71
-msgid "Hub not found."
+#: ../../Zotlabs/Module/Connections.php:137
+msgid "Show pending (new) connections"
msgstr ""
-#: ../../Zotlabs/Module/Mitem.php:52
-msgid "Unable to create element."
+#: ../../Zotlabs/Module/Connections.php:144
+msgid "Show all connections"
msgstr ""
-#: ../../Zotlabs/Module/Mitem.php:76
-msgid "Unable to update menu element."
+#: ../../Zotlabs/Module/Connections.php:160
+msgid "Only show blocked connections"
msgstr ""
-#: ../../Zotlabs/Module/Mitem.php:92
-msgid "Unable to add menu element."
+#: ../../Zotlabs/Module/Connections.php:167
+msgid "Only show ignored connections"
msgstr ""
-#: ../../Zotlabs/Module/Mitem.php:153 ../../Zotlabs/Module/Mitem.php:230
-msgid "Menu Item Permissions"
+#: ../../Zotlabs/Module/Connections.php:174
+msgid "Only show archived connections"
msgstr ""
-#: ../../Zotlabs/Module/Mitem.php:154 ../../Zotlabs/Module/Mitem.php:231
-#: ../../Zotlabs/Module/Settings/Channel.php:510
-msgid "(click to open/close)"
+#: ../../Zotlabs/Module/Connections.php:181
+msgid "Only show hidden connections"
msgstr ""
-#: ../../Zotlabs/Module/Mitem.php:160 ../../Zotlabs/Module/Mitem.php:176
-msgid "Link Name"
+#: ../../Zotlabs/Module/Connections.php:242
+msgid "Pending approval"
msgstr ""
-#: ../../Zotlabs/Module/Mitem.php:161 ../../Zotlabs/Module/Mitem.php:239
-msgid "Link or Submenu Target"
+#: ../../Zotlabs/Module/Connections.php:258
+#, php-format
+msgid "%1$s [%2$s]"
msgstr ""
-#: ../../Zotlabs/Module/Mitem.php:161
-msgid "Enter URL of the link or select a menu name to create a submenu"
+#: ../../Zotlabs/Module/Connections.php:259
+msgid "Edit connection"
msgstr ""
-#: ../../Zotlabs/Module/Mitem.php:162 ../../Zotlabs/Module/Mitem.php:240
-msgid "Use magic-auth if available"
+#: ../../Zotlabs/Module/Connections.php:260
+msgid "Delete connection"
msgstr ""
-#: ../../Zotlabs/Module/Mitem.php:163 ../../Zotlabs/Module/Mitem.php:241
-msgid "Open link in new window"
+#: ../../Zotlabs/Module/Connections.php:269
+msgid "Channel address"
msgstr ""
-#: ../../Zotlabs/Module/Mitem.php:164 ../../Zotlabs/Module/Mitem.php:242
-msgid "Order in list"
+#: ../../Zotlabs/Module/Connections.php:271
+msgid "Network"
msgstr ""
-#: ../../Zotlabs/Module/Mitem.php:164 ../../Zotlabs/Module/Mitem.php:242
-msgid "Higher numbers will sink to bottom of listing"
+#: ../../Zotlabs/Module/Connections.php:274
+msgid "Call"
msgstr ""
-#: ../../Zotlabs/Module/Mitem.php:165
-msgid "Submit and finish"
+#: ../../Zotlabs/Module/Connections.php:276
+msgid "Status"
msgstr ""
-#: ../../Zotlabs/Module/Mitem.php:166
-msgid "Submit and continue"
+#: ../../Zotlabs/Module/Connections.php:278
+msgid "Connected"
msgstr ""
-#: ../../Zotlabs/Module/Mitem.php:174
-msgid "Menu:"
+#: ../../Zotlabs/Module/Connections.php:280
+msgid "Approve connection"
msgstr ""
-#: ../../Zotlabs/Module/Mitem.php:177
-msgid "Link Target"
+#: ../../Zotlabs/Module/Connections.php:282
+msgid "Ignore connection"
msgstr ""
-#: ../../Zotlabs/Module/Mitem.php:180
-msgid "Edit menu"
+#: ../../Zotlabs/Module/Connections.php:283
+#: ../../Zotlabs/Module/Connedit.php:626
+msgid "Ignore"
msgstr ""
-#: ../../Zotlabs/Module/Mitem.php:183
-msgid "Edit element"
+#: ../../Zotlabs/Module/Connections.php:284
+msgid "Recent activity"
msgstr ""
-#: ../../Zotlabs/Module/Mitem.php:184
-msgid "Drop element"
+#: ../../Zotlabs/Module/Connections.php:308 ../../Zotlabs/Lib/Apps.php:216
+#: ../../include/text.php:957 ../../include/nav.php:185
+msgid "Connections"
msgstr ""
-#: ../../Zotlabs/Module/Mitem.php:185
-msgid "New element"
+#: ../../Zotlabs/Module/Connections.php:313
+msgid "Search your connections"
msgstr ""
-#: ../../Zotlabs/Module/Mitem.php:186
-msgid "Edit this menu container"
+#: ../../Zotlabs/Module/Connections.php:314
+msgid "Connections search"
msgstr ""
-#: ../../Zotlabs/Module/Mitem.php:187
-msgid "Add menu element"
+#: ../../Zotlabs/Module/Connections.php:315
+#: ../../Zotlabs/Module/Directory.php:391
+#: ../../Zotlabs/Module/Directory.php:396 ../../include/contact_widgets.php:23
+msgid "Find"
msgstr ""
-#: ../../Zotlabs/Module/Mitem.php:188
-msgid "Delete this menu item"
+#: ../../Zotlabs/Module/Viewsrc.php:43
+msgid "item"
msgstr ""
-#: ../../Zotlabs/Module/Mitem.php:189
-msgid "Edit this menu item"
+#: ../../Zotlabs/Module/Viewsrc.php:55
+msgid "Source of Item"
msgstr ""
-#: ../../Zotlabs/Module/Mitem.php:206
-msgid "Menu item not found."
+#: ../../Zotlabs/Module/Bookmarks.php:53
+msgid "Bookmark added"
msgstr ""
-#: ../../Zotlabs/Module/Mitem.php:219
-msgid "Menu item deleted."
+#: ../../Zotlabs/Module/Bookmarks.php:76
+msgid "My Bookmarks"
msgstr ""
-#: ../../Zotlabs/Module/Mitem.php:221
-msgid "Menu item could not be deleted."
+#: ../../Zotlabs/Module/Bookmarks.php:87
+msgid "My Connections Bookmarks"
msgstr ""
-#: ../../Zotlabs/Module/Mitem.php:228
-msgid "Edit Menu Element"
+#: ../../Zotlabs/Module/Removeaccount.php:35
+msgid ""
+"Account removals are not allowed within 48 hours of changing the account "
+"password."
msgstr ""
-#: ../../Zotlabs/Module/Mitem.php:238
-msgid "Link text"
+#: ../../Zotlabs/Module/Removeaccount.php:57
+msgid "Remove This Account"
msgstr ""
-#: ../../Zotlabs/Module/Appman.php:38 ../../Zotlabs/Module/Appman.php:54
-msgid "App installed."
+#: ../../Zotlabs/Module/Removeaccount.php:58
+msgid ""
+"This account and all its channels will be completely removed from the "
+"network. "
msgstr ""
-#: ../../Zotlabs/Module/Appman.php:47
-msgid "Malformed app."
+#: ../../Zotlabs/Module/Removeaccount.php:60
+msgid ""
+"Remove this account, all its channels and all its channel clones from the "
+"network"
msgstr ""
-#: ../../Zotlabs/Module/Appman.php:110
-msgid "Embed code"
+#: ../../Zotlabs/Module/Removeaccount.php:60
+msgid ""
+"By default only the instances of the channels located on this hub will be "
+"removed from the network"
msgstr ""
-#: ../../Zotlabs/Module/Appman.php:116
-msgid "Edit App"
+#: ../../Zotlabs/Module/Photos.php:78
+msgid "Page owner information could not be retrieved."
msgstr ""
-#: ../../Zotlabs/Module/Appman.php:116
-msgid "Create App"
+#: ../../Zotlabs/Module/Photos.php:94 ../../Zotlabs/Module/Photos.php:120
+msgid "Album not found."
msgstr ""
-#: ../../Zotlabs/Module/Appman.php:121
-msgid "Name of app"
+#: ../../Zotlabs/Module/Photos.php:103
+msgid "Delete Album"
msgstr ""
-#: ../../Zotlabs/Module/Appman.php:121 ../../Zotlabs/Module/Appman.php:122
-#: ../../Zotlabs/Module/Profiles.php:744 ../../Zotlabs/Module/Profiles.php:748
-#: ../../Zotlabs/Module/Events.php:460 ../../Zotlabs/Module/Events.php:465
-#: ../../include/datetime.php:259
-msgid "Required"
+#: ../../Zotlabs/Module/Photos.php:174 ../../Zotlabs/Module/Photos.php:1023
+msgid "Delete Photo"
msgstr ""
-#: ../../Zotlabs/Module/Appman.php:122
-msgid "Location (URL) of app"
+#: ../../Zotlabs/Module/Photos.php:501
+msgid "No photos selected"
msgstr ""
-#: ../../Zotlabs/Module/Appman.php:123 ../../Zotlabs/Module/Events.php:473
-#: ../../Zotlabs/Module/Rbmark.php:101
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:838
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:173
-msgid "Description"
+#: ../../Zotlabs/Module/Photos.php:550
+msgid "Access to this item is restricted."
msgstr ""
-#: ../../Zotlabs/Module/Appman.php:124
-msgid "Photo icon URL"
+#: ../../Zotlabs/Module/Photos.php:591
+#, php-format
+msgid "%1$.2f MB of %2$.2f MB photo storage used."
msgstr ""
-#: ../../Zotlabs/Module/Appman.php:124
-msgid "80 x 80 pixels - optional"
+#: ../../Zotlabs/Module/Photos.php:594
+#, php-format
+msgid "%1$.2f MB photo storage used."
msgstr ""
-#: ../../Zotlabs/Module/Appman.php:125
-msgid "Categories (optional, comma separated list)"
+#: ../../Zotlabs/Module/Photos.php:636
+msgid "Upload Photos"
msgstr ""
-#: ../../Zotlabs/Module/Appman.php:126
-msgid "Version ID"
+#: ../../Zotlabs/Module/Photos.php:640
+msgid "Enter an album name"
msgstr ""
-#: ../../Zotlabs/Module/Appman.php:127
-msgid "Price of app"
+#: ../../Zotlabs/Module/Photos.php:641
+msgid "or select an existing album (doubleclick)"
msgstr ""
-#: ../../Zotlabs/Module/Appman.php:128
-msgid "Location (URL) to purchase app"
+#: ../../Zotlabs/Module/Photos.php:642
+msgid "Create a status post for this upload"
msgstr ""
-#: ../../Zotlabs/Module/Ratings.php:70
-msgid "No ratings"
+#: ../../Zotlabs/Module/Photos.php:643
+msgid "Caption (optional):"
msgstr ""
-#: ../../Zotlabs/Module/Ratings.php:98
-msgid "Rating: "
+#: ../../Zotlabs/Module/Photos.php:644
+msgid "Description (optional):"
msgstr ""
-#: ../../Zotlabs/Module/Ratings.php:99
-msgid "Website: "
+#: ../../Zotlabs/Module/Photos.php:725
+msgid "Show Newest First"
msgstr ""
-#: ../../Zotlabs/Module/Ratings.php:101
-msgid "Description: "
+#: ../../Zotlabs/Module/Photos.php:727
+msgid "Show Oldest First"
msgstr ""
-#: ../../Zotlabs/Module/Attach.php:13
-msgid "Item not available."
+#: ../../Zotlabs/Module/Photos.php:832
+msgid "Permission denied. Access to this item may be restricted."
msgstr ""
-#: ../../Zotlabs/Module/Mood.php:67 ../../include/conversation.php:260
-#, php-format
-msgctxt "mood"
-msgid "%1$s is %2$s"
+#: ../../Zotlabs/Module/Photos.php:834
+msgid "Photo not available"
msgstr ""
-#: ../../Zotlabs/Module/Mood.php:135 ../../Zotlabs/Lib/Apps.php:234
-msgid "Mood"
+#: ../../Zotlabs/Module/Photos.php:892
+msgid "Use as profile photo"
msgstr ""
-#: ../../Zotlabs/Module/Mood.php:136
-msgid "Set your current mood and tell your friends"
+#: ../../Zotlabs/Module/Photos.php:893
+msgid "Use as cover photo"
msgstr ""
-#: ../../Zotlabs/Module/Notify.php:57
-#: ../../Zotlabs/Module/Notifications.php:38
-msgid "No more system notifications."
+#: ../../Zotlabs/Module/Photos.php:900
+msgid "Private Photo"
msgstr ""
-#: ../../Zotlabs/Module/Notify.php:61
-#: ../../Zotlabs/Module/Notifications.php:42
-msgid "System Notifications"
+#: ../../Zotlabs/Module/Photos.php:915
+msgid "View Full Size"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:24 ../../Zotlabs/Module/Profiles.php:184
-#: ../../Zotlabs/Module/Profiles.php:241 ../../Zotlabs/Module/Profiles.php:660
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:62
-msgid "Profile not found."
+#: ../../Zotlabs/Module/Photos.php:997
+msgid "Edit photo"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:44
-msgid "Profile deleted."
+#: ../../Zotlabs/Module/Photos.php:999
+msgid "Rotate CW (right)"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:68 ../../Zotlabs/Module/Profiles.php:105
-msgid "Profile-"
+#: ../../Zotlabs/Module/Photos.php:1000
+msgid "Rotate CCW (left)"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:90 ../../Zotlabs/Module/Profiles.php:127
-msgid "New profile created."
+#: ../../Zotlabs/Module/Photos.php:1003
+msgid "Move photo to album"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:111
-msgid "Profile unavailable to clone."
+#: ../../Zotlabs/Module/Photos.php:1004
+msgid "Enter a new album name"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:146
-msgid "Profile unavailable to export."
+#: ../../Zotlabs/Module/Photos.php:1005
+msgid "or select an existing one (doubleclick)"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:252
-msgid "Profile Name is required."
+#: ../../Zotlabs/Module/Photos.php:1008
+msgid "Caption"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:460
-msgid "Marital Status"
+#: ../../Zotlabs/Module/Photos.php:1010
+msgid "Add a Tag"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:464
-msgid "Romantic Partner"
+#: ../../Zotlabs/Module/Photos.php:1018
+msgid "Example: @bob, @Barbara_Jensen, @jim@example.com"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:468 ../../Zotlabs/Module/Profiles.php:771
-msgid "Likes"
+#: ../../Zotlabs/Module/Photos.php:1021
+msgid "Flag as adult in album view"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:472 ../../Zotlabs/Module/Profiles.php:772
-msgid "Dislikes"
+#: ../../Zotlabs/Module/Photos.php:1040 ../../Zotlabs/Lib/ThreadItem.php:269
+msgid "I like this (toggle)"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:476 ../../Zotlabs/Module/Profiles.php:779
-msgid "Work/Employment"
+#: ../../Zotlabs/Module/Photos.php:1041 ../../Zotlabs/Lib/ThreadItem.php:270
+msgid "I don't like this (toggle)"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:479
-msgid "Religion"
+#: ../../Zotlabs/Module/Photos.php:1043 ../../Zotlabs/Lib/ThreadItem.php:412
+#: ../../include/conversation.php:739
+msgid "Please wait"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:483
-msgid "Political Views"
+#: ../../Zotlabs/Module/Photos.php:1059 ../../Zotlabs/Module/Photos.php:1177
+#: ../../Zotlabs/Lib/ThreadItem.php:729
+msgid "This is you"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:487
-#: ../../extend/addon/addon/openid/MysqlProvider.php:74
-msgid "Gender"
+#: ../../Zotlabs/Module/Photos.php:1061 ../../Zotlabs/Module/Photos.php:1179
+#: ../../Zotlabs/Lib/ThreadItem.php:731 ../../include/js_strings.php:6
+msgid "Comment"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:491
-msgid "Sexual Preference"
+#: ../../Zotlabs/Module/Photos.php:1077 ../../include/conversation.php:574
+msgctxt "title"
+msgid "Likes"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:495
-msgid "Homepage"
+#: ../../Zotlabs/Module/Photos.php:1077 ../../include/conversation.php:574
+msgctxt "title"
+msgid "Dislikes"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:499
-msgid "Interests"
+#: ../../Zotlabs/Module/Photos.php:1078 ../../include/conversation.php:575
+msgctxt "title"
+msgid "Agree"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:595
-msgid "Profile updated."
+#: ../../Zotlabs/Module/Photos.php:1078 ../../include/conversation.php:575
+msgctxt "title"
+msgid "Disagree"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:679
-msgid "Hide your connections list from viewers of this profile"
+#: ../../Zotlabs/Module/Photos.php:1078 ../../include/conversation.php:575
+msgctxt "title"
+msgid "Abstain"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:721
-msgid "Edit Profile Details"
+#: ../../Zotlabs/Module/Photos.php:1079 ../../include/conversation.php:576
+msgctxt "title"
+msgid "Attending"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:723
-msgid "View this profile"
+#: ../../Zotlabs/Module/Photos.php:1079 ../../include/conversation.php:576
+msgctxt "title"
+msgid "Not attending"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:724 ../../Zotlabs/Module/Profiles.php:806
-#: ../../include/channel.php:1066
-msgid "Edit visibility"
+#: ../../Zotlabs/Module/Photos.php:1079 ../../include/conversation.php:576
+msgctxt "title"
+msgid "Might attend"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:725
-msgid "Profile Tools"
+#: ../../Zotlabs/Module/Photos.php:1096 ../../Zotlabs/Module/Photos.php:1108
+#: ../../Zotlabs/Lib/ThreadItem.php:187 ../../Zotlabs/Lib/ThreadItem.php:199
+msgid "View all"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:726
-msgid "Change cover photo"
-msgstr ""
+#: ../../Zotlabs/Module/Photos.php:1100 ../../Zotlabs/Lib/ThreadItem.php:191
+#: ../../include/conversation.php:1907 ../../include/channel.php:1268
+#: ../../include/taxonomy.php:403
+msgctxt "noun"
+msgid "Like"
+msgid_plural "Likes"
+msgstr[0] ""
+msgstr[1] ""
-#: ../../Zotlabs/Module/Profiles.php:727 ../../include/channel.php:1037
-msgid "Change profile photo"
-msgstr ""
+#: ../../Zotlabs/Module/Photos.php:1105 ../../Zotlabs/Lib/ThreadItem.php:196
+#: ../../include/conversation.php:1910
+msgctxt "noun"
+msgid "Dislike"
+msgid_plural "Dislikes"
+msgstr[0] ""
+msgstr[1] ""
-#: ../../Zotlabs/Module/Profiles.php:728
-msgid "Create a new profile using these settings"
+#: ../../Zotlabs/Module/Photos.php:1205
+msgid "Photo Tools"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:729
-msgid "Clone this profile"
+#: ../../Zotlabs/Module/Photos.php:1214
+msgid "In This Photo:"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:730
-msgid "Delete this profile"
+#: ../../Zotlabs/Module/Photos.php:1219
+msgid "Map"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:731
-msgid "Add profile things"
+#: ../../Zotlabs/Module/Photos.php:1227 ../../Zotlabs/Lib/ThreadItem.php:401
+msgctxt "noun"
+msgid "Likes"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:732 ../../include/conversation.php:1715
-#: ../../include/widgets.php:105
-msgid "Personal"
+#: ../../Zotlabs/Module/Photos.php:1228 ../../Zotlabs/Lib/ThreadItem.php:402
+msgctxt "noun"
+msgid "Dislikes"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:734
-msgid "Relation"
+#: ../../Zotlabs/Module/Photos.php:1233 ../../Zotlabs/Lib/ThreadItem.php:407
+#: ../../include/acl_selectors.php:220
+msgid "Close"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:735 ../../include/datetime.php:55
-msgid "Miscellaneous"
+#: ../../Zotlabs/Module/Photos.php:1305 ../../Zotlabs/Module/Photos.php:1318
+#: ../../Zotlabs/Module/Photos.php:1319 ../../include/photos.php:529
+msgid "Recent Photos"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:737
-msgid "Import profile from file"
+#: ../../Zotlabs/Module/Wiki.php:30
+msgid "Profile Unavailable."
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:738
-msgid "Export profile to file"
+#: ../../Zotlabs/Module/Wiki.php:44 ../../addon/gitwiki/Mod_Gitwiki.php:42
+msgid "Not found"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:739
-msgid "Your gender"
+#: ../../Zotlabs/Module/Wiki.php:68 ../../addon/gitwiki/Mod_Gitwiki.php:62
+msgid "Invalid channel"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:740
-msgid "Marital status"
+#: ../../Zotlabs/Module/Wiki.php:160 ../../addon/gitwiki/Mod_Gitwiki.php:146
+#: ../../include/conversation.php:1854 ../../include/nav.php:462
+msgid "Wikis"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:741
-msgid "Sexual preference"
+#: ../../Zotlabs/Module/Wiki.php:166 ../../addon/gitwiki/Mod_Gitwiki.php:152
+msgid "Download"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:744
-msgid "Profile name"
+#: ../../Zotlabs/Module/Wiki.php:168 ../../Zotlabs/Module/Chat.php:254
+#: ../../Zotlabs/Module/Profiles.php:834 ../../Zotlabs/Module/Manage.php:143
+#: ../../addon/gitwiki/Mod_Gitwiki.php:154
+msgid "Create New"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:746
-msgid "This is your default profile."
+#: ../../Zotlabs/Module/Wiki.php:170 ../../addon/gitwiki/Mod_Gitwiki.php:156
+msgid "Wiki name"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:748
-msgid "Your full name"
+#: ../../Zotlabs/Module/Wiki.php:171 ../../addon/gitwiki/Mod_Gitwiki.php:157
+msgid "Content type"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:749
-msgid "Title/Description"
+#: ../../Zotlabs/Module/Wiki.php:173 ../../Zotlabs/Storage/Browser.php:234
+#: ../../addon/gitwiki/Mod_Gitwiki.php:159
+msgid "Type"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:752
-msgid "Street address"
+#: ../../Zotlabs/Module/Wiki.php:180 ../../addon/gitwiki/Mod_Gitwiki.php:166
+msgid "Create a status post for this wiki"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:753
-msgid "Locality/City"
+#: ../../Zotlabs/Module/Wiki.php:205 ../../addon/gitwiki/Mod_Gitwiki.php:185
+msgid "Wiki not found"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:754
-msgid "Region/State"
+#: ../../Zotlabs/Module/Wiki.php:229 ../../addon/gitwiki/Mod_Gitwiki.php:210
+msgid "Rename page"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:755
-msgid "Postal/Zip code"
+#: ../../Zotlabs/Module/Wiki.php:233 ../../addon/gitwiki/Mod_Gitwiki.php:214
+msgid "Error retrieving page content"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:761
-msgid "Who (if applicable)"
+#: ../../Zotlabs/Module/Wiki.php:239
+msgid "New page"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:761
-msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
+#: ../../Zotlabs/Module/Wiki.php:263 ../../addon/gitwiki/Mod_Gitwiki.php:242
+msgid "Revision Comparison"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:762
-msgid "Since (date)"
+#: ../../Zotlabs/Module/Wiki.php:264 ../../addon/gitwiki/Mod_Gitwiki.php:243
+msgid "Revert"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:765
-msgid "Tell us about yourself"
+#: ../../Zotlabs/Module/Wiki.php:268
+msgid "Short description of your changes (optional)"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:766
-#: ../../extend/addon/addon/openid/MysqlProvider.php:68
-msgid "Homepage URL"
+#: ../../Zotlabs/Module/Wiki.php:275 ../../addon/gitwiki/Mod_Gitwiki.php:252
+msgid "Source"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:767
-msgid "Hometown"
+#: ../../Zotlabs/Module/Wiki.php:283 ../../addon/gitwiki/Mod_Gitwiki.php:260
+msgid "New page name"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:768
-msgid "Political views"
+#: ../../Zotlabs/Module/Wiki.php:288 ../../addon/gitwiki/Mod_Gitwiki.php:265
+#: ../../include/conversation.php:1232
+msgid "Embed image from photo albums"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:769
-msgid "Religious views"
+#: ../../Zotlabs/Module/Wiki.php:289 ../../addon/gitwiki/Mod_Gitwiki.php:266
+#: ../../include/conversation.php:1326
+msgid "Embed an image from your albums"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:770
-msgid "Keywords used in directory listings"
+#: ../../Zotlabs/Module/Wiki.php:291 ../../addon/gitwiki/Mod_Gitwiki.php:268
+#: ../../include/conversation.php:1328 ../../include/conversation.php:1375
+msgid "OK"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:770
-msgid "Example: fishing photography software"
+#: ../../Zotlabs/Module/Wiki.php:292 ../../addon/gitwiki/Mod_Gitwiki.php:269
+#: ../../include/conversation.php:1268
+msgid "Choose images to embed"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:773
-msgid "Musical interests"
+#: ../../Zotlabs/Module/Wiki.php:293 ../../addon/gitwiki/Mod_Gitwiki.php:270
+#: ../../include/conversation.php:1269
+msgid "Choose an album"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:774
-msgid "Books, literature"
+#: ../../Zotlabs/Module/Wiki.php:294 ../../addon/gitwiki/Mod_Gitwiki.php:271
+msgid "Choose a different album"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:775
-msgid "Television"
+#: ../../Zotlabs/Module/Wiki.php:295 ../../addon/gitwiki/Mod_Gitwiki.php:272
+#: ../../include/conversation.php:1271
+msgid "Error getting album list"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:776
-msgid "Film/Dance/Culture/Entertainment"
+#: ../../Zotlabs/Module/Wiki.php:296 ../../addon/gitwiki/Mod_Gitwiki.php:273
+#: ../../include/conversation.php:1272
+msgid "Error getting photo link"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:777
-msgid "Hobbies/Interests"
+#: ../../Zotlabs/Module/Wiki.php:297 ../../addon/gitwiki/Mod_Gitwiki.php:274
+#: ../../include/conversation.php:1273
+msgid "Error getting album"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:778
-msgid "Love/Romance"
+#: ../../Zotlabs/Module/Wiki.php:364 ../../addon/gitwiki/Mod_Gitwiki.php:337
+msgid "Error creating wiki. Invalid name."
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:780
-msgid "School/Education"
+#: ../../Zotlabs/Module/Wiki.php:371
+msgid "A wiki with this name already exists."
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:781
-msgid "Contact information and social networks"
+#: ../../Zotlabs/Module/Wiki.php:384 ../../addon/gitwiki/Mod_Gitwiki.php:348
+msgid "Wiki created, but error creating Home page."
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:782
-msgid "My other channels"
+#: ../../Zotlabs/Module/Wiki.php:391 ../../addon/gitwiki/Mod_Gitwiki.php:353
+msgid "Error creating wiki"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:802 ../../include/channel.php:1062
-msgid "Profile Image"
+#: ../../Zotlabs/Module/Wiki.php:403
+msgid "Wiki delete permission denied."
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:812 ../../include/channel.php:1044
-#: ../../include/nav.php:105
-msgid "Edit Profiles"
+#: ../../Zotlabs/Module/Wiki.php:413
+msgid "Error deleting wiki"
msgstr ""
-#: ../../Zotlabs/Module/Api.php:72 ../../Zotlabs/Module/Api.php:93
-msgid "Authorize application connection"
+#: ../../Zotlabs/Module/Wiki.php:439 ../../addon/gitwiki/Mod_Gitwiki.php:400
+msgid "New page created"
msgstr ""
-#: ../../Zotlabs/Module/Api.php:73
-msgid "Return to your app and insert this Security Code:"
+#: ../../Zotlabs/Module/Wiki.php:558
+msgid "Cannot delete Home"
msgstr ""
-#: ../../Zotlabs/Module/Api.php:83
-msgid "Please login to continue."
+#: ../../Zotlabs/Module/Wiki.php:622
+msgid "Current Revision"
msgstr ""
-#: ../../Zotlabs/Module/Api.php:95
-msgid ""
-"Do you want to authorize this application to access your posts and contacts, "
-"and/or create new posts for you?"
+#: ../../Zotlabs/Module/Wiki.php:622
+msgid "Selected Revision"
msgstr ""
-#: ../../Zotlabs/Module/Invite.php:29
-msgid "Total invitation limit exceeded."
+#: ../../Zotlabs/Module/Wiki.php:672
+msgid "You must be authenticated."
msgstr ""
-#: ../../Zotlabs/Module/Invite.php:53
-#, php-format
-msgid "%s : Not a valid email address."
+#: ../../Zotlabs/Module/Chanview.php:134
+msgid "toggle full screen mode"
msgstr ""
-#: ../../Zotlabs/Module/Invite.php:67
-msgid "Please join us on $Projectname"
+#: ../../Zotlabs/Module/Pdledit.php:21
+msgid "Layout updated."
msgstr ""
-#: ../../Zotlabs/Module/Invite.php:77
-msgid "Invitation limit exceeded. Please contact your site administrator."
+#: ../../Zotlabs/Module/Pdledit.php:34 ../../Zotlabs/Module/Chat.php:217
+msgid "Feature disabled."
msgstr ""
-#: ../../Zotlabs/Module/Invite.php:82
-#, php-format
-msgid "%s : Message delivery failed."
+#: ../../Zotlabs/Module/Pdledit.php:42 ../../Zotlabs/Module/Pdledit.php:69
+msgid "Edit System Page Description"
msgstr ""
-#: ../../Zotlabs/Module/Invite.php:86
-#, php-format
-msgid "%d message sent."
-msgid_plural "%d messages sent."
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../../Zotlabs/Module/Invite.php:105
-msgid "You have no more invitations available"
+#: ../../Zotlabs/Module/Pdledit.php:64
+msgid "Layout not found."
msgstr ""
-#: ../../Zotlabs/Module/Invite.php:136
-msgid "Send invitations"
+#: ../../Zotlabs/Module/Pdledit.php:70
+msgid "Module Name:"
msgstr ""
-#: ../../Zotlabs/Module/Invite.php:137
-msgid "Enter email addresses, one per line:"
+#: ../../Zotlabs/Module/Pdledit.php:71
+msgid "Layout Help"
msgstr ""
-#: ../../Zotlabs/Module/Invite.php:138 ../../Zotlabs/Module/Mail.php:284
-msgid "Your message:"
+#: ../../Zotlabs/Module/Poke.php:168 ../../Zotlabs/Lib/Apps.php:235
+#: ../../include/conversation.php:1042
+msgid "Poke"
msgstr ""
-#: ../../Zotlabs/Module/Invite.php:139
-msgid "Please join my community on $Projectname."
+#: ../../Zotlabs/Module/Poke.php:169
+msgid "Poke somebody"
msgstr ""
-#: ../../Zotlabs/Module/Invite.php:141
-msgid "You will need to supply this invitation code:"
+#: ../../Zotlabs/Module/Poke.php:172
+msgid "Poke/Prod"
msgstr ""
-#: ../../Zotlabs/Module/Invite.php:142
-msgid "1. Register at any $Projectname location (they are all inter-connected)"
+#: ../../Zotlabs/Module/Poke.php:173
+msgid "Poke, prod or do other things to somebody"
msgstr ""
-#: ../../Zotlabs/Module/Invite.php:144
-msgid "2. Enter my $Projectname network address into the site searchbar."
+#: ../../Zotlabs/Module/Poke.php:180
+msgid "Recipient"
msgstr ""
-#: ../../Zotlabs/Module/Invite.php:145
-msgid "or visit"
+#: ../../Zotlabs/Module/Poke.php:181
+msgid "Choose what you wish to do to recipient"
msgstr ""
-#: ../../Zotlabs/Module/Invite.php:147
-msgid "3. Click [Connect]"
+#: ../../Zotlabs/Module/Poke.php:184 ../../Zotlabs/Module/Poke.php:185
+msgid "Make this post private"
msgstr ""
-#: ../../Zotlabs/Module/Siteinfo.php:20
-msgid "About this site"
+#: ../../Zotlabs/Module/Profile_photo.php:61
+#: ../../Zotlabs/Module/Cover_photo.php:56
+msgid "Image uploaded but image cropping failed."
msgstr ""
-#: ../../Zotlabs/Module/Siteinfo.php:21
-msgid "Site Name"
+#: ../../Zotlabs/Module/Profile_photo.php:115
+#: ../../Zotlabs/Module/Profile_photo.php:226
+#: ../../include/photo/photo_driver.php:647
+msgid "Profile Photos"
msgstr ""
-#: ../../Zotlabs/Module/Siteinfo.php:25 ../../include/network.php:1972
-msgid "Administrator"
+#: ../../Zotlabs/Module/Profile_photo.php:137
+#: ../../Zotlabs/Module/Cover_photo.php:159
+msgid "Image resize failed."
msgstr ""
-#: ../../Zotlabs/Module/Siteinfo.php:28
-msgid "Software and Project information"
+#: ../../Zotlabs/Module/Profile_photo.php:196
+#: ../../addon/openclipatar/openclipatar.php:298
+msgid ""
+"Shift-reload the page or clear browser cache if the new photo does not "
+"display immediately."
msgstr ""
-#: ../../Zotlabs/Module/Siteinfo.php:29
-msgid "This site is powered by $Projectname"
+#: ../../Zotlabs/Module/Profile_photo.php:203
+#: ../../Zotlabs/Module/Cover_photo.php:173 ../../include/photos.php:149
+msgid "Unable to process image"
msgstr ""
-#: ../../Zotlabs/Module/Siteinfo.php:30
-msgid ""
-"Federated and decentralised networking and identity services provided by Zot"
+#: ../../Zotlabs/Module/Profile_photo.php:238
+#: ../../Zotlabs/Module/Cover_photo.php:197
+msgid "Image upload failed."
msgstr ""
-#: ../../Zotlabs/Module/Siteinfo.php:32
-#, php-format
-msgid "Version %s"
+#: ../../Zotlabs/Module/Profile_photo.php:257
+#: ../../Zotlabs/Module/Cover_photo.php:214
+msgid "Unable to process image."
msgstr ""
-#: ../../Zotlabs/Module/Siteinfo.php:33
-msgid "Project homepage"
+#: ../../Zotlabs/Module/Profile_photo.php:318
+#: ../../Zotlabs/Module/Profile_photo.php:365
+#: ../../Zotlabs/Module/Cover_photo.php:307
+#: ../../Zotlabs/Module/Cover_photo.php:322
+msgid "Photo not available."
msgstr ""
-#: ../../Zotlabs/Module/Siteinfo.php:34
-msgid "Developer homepage"
+#: ../../Zotlabs/Module/Profile_photo.php:420
+#: ../../Zotlabs/Module/Cover_photo.php:358
+msgid "Upload File:"
msgstr ""
-#: ../../Zotlabs/Module/New_channel.php:140
-msgid "Create Channel"
+#: ../../Zotlabs/Module/Profile_photo.php:421
+#: ../../Zotlabs/Module/Cover_photo.php:359
+msgid "Select a profile:"
msgstr ""
-#: ../../Zotlabs/Module/New_channel.php:141
-msgid ""
-"A channel is your identity on this network. It can represent a person, a "
-"blog, or a forum to name a few. Channels can make connections with other "
-"channels to share information with highly detailed permissions."
+#: ../../Zotlabs/Module/Profile_photo.php:422
+msgid "Use Photo for Profile"
msgstr ""
-#: ../../Zotlabs/Module/New_channel.php:142
-msgid ""
-"or <a href=\"import\">import an existing channel</a> from another location."
+#: ../../Zotlabs/Module/Profile_photo.php:422
+msgid "Upload Profile Photo"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:176
-msgid "$Projectname Server - Setup"
+#: ../../Zotlabs/Module/Profile_photo.php:423
+#: ../../addon/openclipatar/openclipatar.php:182
+#: ../../addon/openclipatar/openclipatar.php:194
+msgid "Use"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:180
-msgid "Could not connect to database."
+#: ../../Zotlabs/Module/Profile_photo.php:429
+#: ../../Zotlabs/Module/Cover_photo.php:365
+msgid "skip this step"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:184
-msgid ""
-"Could not connect to specified site URL. Possible SSL certificate or DNS "
-"issue."
+#: ../../Zotlabs/Module/Profile_photo.php:429
+#: ../../Zotlabs/Module/Cover_photo.php:365
+msgid "select a photo from your photo albums"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:191
-msgid "Could not create table."
+#: ../../Zotlabs/Module/Profile_photo.php:448
+#: ../../Zotlabs/Module/Cover_photo.php:381
+msgid "Crop Image"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:196
-msgid "Your site database has been installed."
+#: ../../Zotlabs/Module/Profile_photo.php:449
+#: ../../Zotlabs/Module/Cover_photo.php:382
+msgid "Please adjust the image cropping for optimum viewing."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:200
-msgid ""
-"You may need to import the file \"install/schema_xxx.sql\" manually using a "
-"database client."
+#: ../../Zotlabs/Module/Profile_photo.php:451
+#: ../../Zotlabs/Module/Cover_photo.php:384
+msgid "Done Editing"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:201 ../../Zotlabs/Module/Setup.php:263
-#: ../../Zotlabs/Module/Setup.php:750
-msgid "Please see the file \"install/INSTALL.txt\"."
+#: ../../Zotlabs/Module/Chatsvc.php:131
+msgid "Away"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:260
-msgid "System check"
+#: ../../Zotlabs/Module/Chatsvc.php:136
+msgid "Online"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:265
-msgid "Check again"
+#: ../../Zotlabs/Module/Item.php:185
+msgid "Unable to locate original post."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:287
-msgid "Database connection"
+#: ../../Zotlabs/Module/Item.php:451
+msgid "Empty post discarded."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:288
-msgid ""
-"In order to install $Projectname we need to know how to connect to your "
-"database."
+#: ../../Zotlabs/Module/Item.php:825
+msgid "Duplicate post suppressed."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:289
-msgid ""
-"Please contact your hosting provider or site administrator if you have "
-"questions about these settings."
+#: ../../Zotlabs/Module/Item.php:955
+msgid "System error. Post not saved."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:290
-msgid ""
-"The database you specify below should already exist. If it does not, please "
-"create it before continuing."
+#: ../../Zotlabs/Module/Item.php:1085
+msgid "Unable to obtain post information from database."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:294
-msgid "Database Server Name"
+#: ../../Zotlabs/Module/Item.php:1092
+#, php-format
+msgid "You have reached your limit of %1$.0f top level posts."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:294
-msgid "Default is 127.0.0.1"
+#: ../../Zotlabs/Module/Item.php:1099
+#, php-format
+msgid "You have reached your limit of %1$.0f webpages."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:295
-msgid "Database Port"
+#: ../../Zotlabs/Module/Ping.php:254
+msgid "sent you a private message"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:295
-msgid "Communication port number - use 0 for default"
+#: ../../Zotlabs/Module/Ping.php:302
+msgid "added your channel"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:296
-msgid "Database Login Name"
+#: ../../Zotlabs/Module/Ping.php:312
+msgid "g A l F d"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:297
-msgid "Database Login Password"
+#: ../../Zotlabs/Module/Ping.php:330
+msgid "[today]"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:298
-msgid "Database Name"
+#: ../../Zotlabs/Module/Ping.php:339
+msgid "posted an event"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:299
-msgid "Database Type"
+#: ../../Zotlabs/Module/Page.php:40 ../../Zotlabs/Module/Block.php:31
+msgid "Invalid item."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:301 ../../Zotlabs/Module/Setup.php:347
-msgid "Site administrator email address"
+#: ../../Zotlabs/Module/Page.php:94 ../../Zotlabs/Module/Block.php:79
+#: ../../Zotlabs/Module/Display.php:122
+#: ../../Zotlabs/Lib/NativeWikiPage.php:500 ../../Zotlabs/Web/Router.php:146
+#: ../../include/help.php:68
+msgid "Page not found."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:301 ../../Zotlabs/Module/Setup.php:347
+#: ../../Zotlabs/Module/Page.php:131
msgid ""
-"Your account email address must match this in order to use the web admin "
-"panel."
+"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod "
+"tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, "
+"quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo "
+"consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse "
+"cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat "
+"non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:302 ../../Zotlabs/Module/Setup.php:349
-msgid "Website URL"
+#: ../../Zotlabs/Module/Connedit.php:79
+msgid "Could not access contact record."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:302 ../../Zotlabs/Module/Setup.php:349
-msgid "Please use SSL (https) URL if available."
+#: ../../Zotlabs/Module/Connedit.php:109
+msgid "Could not locate selected profile."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:303 ../../Zotlabs/Module/Setup.php:353
-msgid "Please select a default timezone for your website"
+#: ../../Zotlabs/Module/Connedit.php:246
+msgid "Connection updated."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:336
-msgid "Site settings"
+#: ../../Zotlabs/Module/Connedit.php:248
+msgid "Failed to update connection record."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:392
-msgid "PHP version 5.5 or greater is required."
+#: ../../Zotlabs/Module/Connedit.php:298
+msgid "is now connected to"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:393
-msgid "PHP version"
+#: ../../Zotlabs/Module/Connedit.php:423
+msgid "Could not access address book record."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:409
-msgid "Could not find a command line version of PHP in the web server PATH."
+#: ../../Zotlabs/Module/Connedit.php:471
+msgid "Refresh failed - channel is currently unavailable."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:410
-msgid ""
-"If you don't have a command line version of PHP installed on server, you "
-"will not be able to run background polling via cron."
+#: ../../Zotlabs/Module/Connedit.php:486 ../../Zotlabs/Module/Connedit.php:495
+#: ../../Zotlabs/Module/Connedit.php:504 ../../Zotlabs/Module/Connedit.php:513
+#: ../../Zotlabs/Module/Connedit.php:526
+msgid "Unable to set address book parameters."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:414
-msgid "PHP executable path"
+#: ../../Zotlabs/Module/Connedit.php:550
+msgid "Connection has been removed."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:414
-msgid ""
-"Enter full path to php executable. You can leave this blank to continue the "
-"installation."
+#: ../../Zotlabs/Module/Connedit.php:590 ../../Zotlabs/Lib/Apps.php:228
+#: ../../addon/openclipatar/openclipatar.php:57
+#: ../../include/conversation.php:982 ../../include/nav.php:106
+msgid "View Profile"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:419
-msgid "Command line PHP"
+#: ../../Zotlabs/Module/Connedit.php:593
+#, php-format
+msgid "View %s's profile"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:429
-msgid ""
-"Unable to check command line PHP, as shell_exec() is disabled. This is "
-"required."
+#: ../../Zotlabs/Module/Connedit.php:597
+msgid "Refresh Permissions"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:432
-msgid ""
-"The command line version of PHP on your system does not have "
-"\"register_argc_argv\" enabled."
+#: ../../Zotlabs/Module/Connedit.php:600
+msgid "Fetch updated permissions"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:433
-msgid "This is required for message delivery to work."
+#: ../../Zotlabs/Module/Connedit.php:604
+msgid "Refresh Photo"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:436
-msgid "PHP register_argc_argv"
+#: ../../Zotlabs/Module/Connedit.php:607
+msgid "Fetch updated photo"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:454
-#, php-format
-msgid ""
-"Your max allowed total upload size is set to %s. Maximum size of one file to "
-"upload is set to %s. You are allowed to upload up to %d files at once."
+#: ../../Zotlabs/Module/Connedit.php:611
+msgid "Recent Activity"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:459
-msgid "You can adjust these settings in the server php.ini file."
+#: ../../Zotlabs/Module/Connedit.php:614
+msgid "View recent posts and comments"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:461
-msgid "PHP upload limits"
+#: ../../Zotlabs/Module/Connedit.php:621
+msgid "Block (or Unblock) all communications with this connection"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:484
-msgid ""
-"Error: the \"openssl_pkey_new\" function on this system is not able to "
-"generate encryption keys"
+#: ../../Zotlabs/Module/Connedit.php:622
+msgid "This connection is blocked!"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:485
-msgid ""
-"If running under Windows, please see \"http://www.php.net/manual/en/openssl."
-"installation.php\"."
+#: ../../Zotlabs/Module/Connedit.php:626
+msgid "Unignore"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:488
-msgid "Generate encryption keys"
+#: ../../Zotlabs/Module/Connedit.php:629
+msgid "Ignore (or Unignore) all inbound communications from this connection"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:505
-msgid "libCurl PHP module"
+#: ../../Zotlabs/Module/Connedit.php:630
+msgid "This connection is ignored!"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:506
-msgid "GD graphics PHP module"
+#: ../../Zotlabs/Module/Connedit.php:634
+msgid "Unarchive"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:507
-msgid "OpenSSL PHP module"
+#: ../../Zotlabs/Module/Connedit.php:634
+msgid "Archive"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:508
-msgid "PDO database PHP module"
+#: ../../Zotlabs/Module/Connedit.php:637
+msgid ""
+"Archive (or Unarchive) this connection - mark channel dead but keep content"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:509
-msgid "mb_string PHP module"
+#: ../../Zotlabs/Module/Connedit.php:638
+msgid "This connection is archived!"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:510
-msgid "xml PHP module"
+#: ../../Zotlabs/Module/Connedit.php:642
+msgid "Unhide"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:514 ../../Zotlabs/Module/Setup.php:516
-msgid "Apache mod_rewrite module"
+#: ../../Zotlabs/Module/Connedit.php:642
+msgid "Hide"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:514
-msgid ""
-"Error: Apache webserver mod-rewrite module is required but not installed."
+#: ../../Zotlabs/Module/Connedit.php:645
+msgid "Hide or Unhide this connection from your other connections"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:520 ../../Zotlabs/Module/Setup.php:523
-msgid "exec"
+#: ../../Zotlabs/Module/Connedit.php:646
+msgid "This connection is hidden!"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:520
-msgid ""
-"Error: exec is required but is either not installed or has been disabled in "
-"php.ini"
+#: ../../Zotlabs/Module/Connedit.php:653
+msgid "Delete this connection"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:526 ../../Zotlabs/Module/Setup.php:529
-msgid "shell_exec"
+#: ../../Zotlabs/Module/Connedit.php:661
+msgid "Fetch Vcard"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:526
-msgid ""
-"Error: shell_exec is required but is either not installed or has been "
-"disabled in php.ini"
+#: ../../Zotlabs/Module/Connedit.php:664
+msgid "Fetch electronic calling card for this connection"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:534
-msgid "Error: libCURL PHP module required but not installed."
+#: ../../Zotlabs/Module/Connedit.php:675
+msgid "Open Individual Permissions section by default"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:538
-msgid ""
-"Error: GD graphics PHP module with JPEG support required but not installed."
+#: ../../Zotlabs/Module/Connedit.php:698
+msgid "Affinity"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:542
-msgid "Error: openssl PHP module required but not installed."
+#: ../../Zotlabs/Module/Connedit.php:701
+msgid "Open Set Affinity section by default"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:546
-msgid "Error: PDO database PHP module required but not installed."
+#: ../../Zotlabs/Module/Connedit.php:705 ../../Zotlabs/Widget/Affinity.php:26
+msgid "Me"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:550
-msgid "Error: mb_string PHP module required but not installed."
+#: ../../Zotlabs/Module/Connedit.php:706 ../../Zotlabs/Widget/Affinity.php:27
+msgid "Family"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:554
-msgid "Error: xml PHP module required for DAV but not installed."
+#: ../../Zotlabs/Module/Connedit.php:708 ../../Zotlabs/Widget/Affinity.php:29
+msgid "Acquaintances"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:572
-msgid ""
-"The web installer needs to be able to create a file called \".htconfig.php\" "
-"in the top folder of your web server and it is unable to do so."
+#: ../../Zotlabs/Module/Connedit.php:735
+msgid "Filter"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:573
-msgid ""
-"This is most often a permission setting, as the web server may not be able "
-"to write files in your folder - even if you can."
+#: ../../Zotlabs/Module/Connedit.php:738
+msgid "Open Custom Filter section by default"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:574
-msgid ""
-"At the end of this procedure, we will give you a text to save in a file "
-"named .htconfig.php in your Red top folder."
+#: ../../Zotlabs/Module/Connedit.php:775
+msgid "Approve this connection"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:575
-msgid ""
-"You can alternatively skip this procedure and perform a manual installation. "
-"Please see the file \"install/INSTALL.txt\" for instructions."
+#: ../../Zotlabs/Module/Connedit.php:775
+msgid "Accept connection to allow communication"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:578
-msgid ".htconfig.php is writable"
+#: ../../Zotlabs/Module/Connedit.php:780
+msgid "Set Affinity"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:592
-msgid ""
-"This software uses the Smarty3 template engine to render its web views. "
-"Smarty3 compiles templates to PHP to speed up rendering."
+#: ../../Zotlabs/Module/Connedit.php:783
+msgid "Set Profile"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:593
-#, php-format
-msgid ""
-"In order to store these compiled templates, the web server needs to have "
-"write access to the directory %s under the top level web folder."
+#: ../../Zotlabs/Module/Connedit.php:786
+msgid "Set Affinity & Profile"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:594 ../../Zotlabs/Module/Setup.php:615
-msgid ""
-"Please ensure that the user that your web server runs as (e.g. www-data) has "
-"write access to this folder."
+#: ../../Zotlabs/Module/Connedit.php:844
+msgid "none"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:595
-#, php-format
-msgid ""
-"Note: as a security measure, you should give the web server write access to "
-"%s only--not the template files (.tpl) that it contains."
+#: ../../Zotlabs/Module/Connedit.php:847
+#: ../../Zotlabs/Widget/Settings_menu.php:107
+msgid "Connection Default Permissions"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:598
+#: ../../Zotlabs/Module/Connedit.php:847 ../../include/items.php:3955
#, php-format
-msgid "%s is writable"
-msgstr ""
-
-#: ../../Zotlabs/Module/Setup.php:614
-msgid ""
-"This software uses the store directory to save uploaded files. The web "
-"server needs to have write access to the store directory under the top level "
-"web folder"
+msgid "Connection: %s"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:618
-msgid "store is writable"
+#: ../../Zotlabs/Module/Connedit.php:848
+msgid "Apply these permissions automatically"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:651
-msgid ""
-"SSL certificate cannot be validated. Fix certificate or disable https access "
-"to this site."
+#: ../../Zotlabs/Module/Connedit.php:848
+msgid "Connection requests will be approved without your interaction"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:652
-msgid ""
-"If you have https access to your website or allow connections to TCP port "
-"443 (the https: port), you MUST use a browser-valid certificate. You MUST "
-"NOT use self-signed certificates!"
+#: ../../Zotlabs/Module/Connedit.php:849
+msgid "Permission role"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:653
-msgid ""
-"This restriction is incorporated because public posts from you may for "
-"example contain references to images on your own hub."
+#: ../../Zotlabs/Module/Connedit.php:850
+msgid "Add permission role"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:654
-msgid ""
-"If your certificate is not recognized, members of other sites (who may "
-"themselves have valid certificates) will get a warning message on their own "
-"site complaining about security issues."
+#: ../../Zotlabs/Module/Connedit.php:856
+msgid "This connection's primary address is"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:655
-msgid ""
-"This can cause usability issues elsewhere (not just on your own site) so we "
-"must insist on this requirement."
+#: ../../Zotlabs/Module/Connedit.php:857
+msgid "Available locations:"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:656
+#: ../../Zotlabs/Module/Connedit.php:861
msgid ""
-"Providers are available that issue free certificates which are browser-valid."
+"The permissions indicated on this page will be applied to all new "
+"connections."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:658
-msgid ""
-"If you are confident that the certificate is valid and signed by a trusted "
-"authority, check to see if you have failed to install an intermediate cert. "
-"These are not normally required by browsers, but are required for server-to-"
-"server communications."
+#: ../../Zotlabs/Module/Connedit.php:862
+msgid "Connection Tools"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:660
-msgid "SSL certificate validation"
+#: ../../Zotlabs/Module/Connedit.php:864
+msgid "Slide to adjust your degree of friendship"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:666
-msgid ""
-"Url rewrite in .htaccess is not working. Check your server configuration."
-"Test: "
+#: ../../Zotlabs/Module/Connedit.php:865 ../../Zotlabs/Module/Rate.php:155
+#: ../../include/js_strings.php:20
+msgid "Rating"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:669
-msgid "Url rewrite is working"
+#: ../../Zotlabs/Module/Connedit.php:866
+msgid "Slide to adjust your rating"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:683
-msgid ""
-"The database configuration file \".htconfig.php\" could not be written. "
-"Please use the enclosed text to create a configuration file in your web "
-"server root."
+#: ../../Zotlabs/Module/Connedit.php:867 ../../Zotlabs/Module/Connedit.php:872
+msgid "Optionally explain your rating"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:707
-#: ../../extend/addon/addon/cdav/cdav.php:41
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:401
-msgid "Errors encountered creating database tables."
+#: ../../Zotlabs/Module/Connedit.php:869
+msgid "Custom Filter"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:748
-msgid "<h1>What next</h1>"
+#: ../../Zotlabs/Module/Connedit.php:870
+msgid "Only import posts with this text"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:749
+#: ../../Zotlabs/Module/Connedit.php:870 ../../Zotlabs/Module/Connedit.php:871
msgid ""
-"IMPORTANT: You will need to [manually] setup a scheduled task for the poller."
-msgstr ""
-
-#: ../../Zotlabs/Module/Notifications.php:43 ../../include/nav.php:208
-msgid "Mark all system notifications seen"
-msgstr ""
-
-#: ../../Zotlabs/Module/Poke.php:168 ../../Zotlabs/Lib/Apps.php:235
-#: ../../include/conversation.php:942 ../../include/conversation.php:1109
-msgid "Poke"
+"words one per line or #tags or /patterns/ or lang=xx, leave blank to import "
+"all posts"
msgstr ""
-#: ../../Zotlabs/Module/Poke.php:169
-msgid "Poke somebody"
+#: ../../Zotlabs/Module/Connedit.php:871
+msgid "Do not import posts with this text"
msgstr ""
-#: ../../Zotlabs/Module/Poke.php:172
-msgid "Poke/Prod"
+#: ../../Zotlabs/Module/Connedit.php:873
+msgid "This information is public!"
msgstr ""
-#: ../../Zotlabs/Module/Poke.php:173
-msgid "Poke, prod or do other things to somebody"
+#: ../../Zotlabs/Module/Connedit.php:878
+msgid "Connection Pending Approval"
msgstr ""
-#: ../../Zotlabs/Module/Poke.php:180
-msgid "Recipient"
+#: ../../Zotlabs/Module/Connedit.php:883
+#, php-format
+msgid ""
+"Please choose the profile you would like to display to %s when viewing your "
+"profile securely."
msgstr ""
-#: ../../Zotlabs/Module/Poke.php:181
-msgid "Choose what you wish to do to recipient"
+#: ../../Zotlabs/Module/Connedit.php:890
+msgid ""
+"Some permissions may be inherited from your channel's <a href=\"settings"
+"\"><strong>privacy settings</strong></a>, which have higher priority than "
+"individual settings. You can change those settings here but they wont have "
+"any impact unless the inherited setting changes."
msgstr ""
-#: ../../Zotlabs/Module/Poke.php:184 ../../Zotlabs/Module/Poke.php:185
-msgid "Make this post private"
+#: ../../Zotlabs/Module/Connedit.php:891
+msgid "Last update:"
msgstr ""
-#: ../../Zotlabs/Module/Oexchange.php:27
-msgid "Unable to find your hub."
+#: ../../Zotlabs/Module/Connedit.php:900
+msgid "Details"
msgstr ""
-#: ../../Zotlabs/Module/Oexchange.php:41
-msgid "Post successful."
+#: ../../Zotlabs/Module/Connedit.php:903 ../../addon/cdav/Mod_Cdav.php:1137
+msgid "Organisation"
msgstr ""
-#: ../../Zotlabs/Module/Item.php:184
-msgid "Unable to locate original post."
+#: ../../Zotlabs/Module/Connedit.php:904 ../../addon/cdav/Mod_Cdav.php:1138
+#: ../../include/page_widgets.php:46
+msgid "Title"
msgstr ""
-#: ../../Zotlabs/Module/Item.php:450
-msgid "Empty post discarded."
+#: ../../Zotlabs/Module/Connedit.php:905 ../../Zotlabs/Module/Profiles.php:789
+#: ../../addon/cdav/Mod_Cdav.php:1139
+msgid "Phone"
msgstr ""
-#: ../../Zotlabs/Module/Item.php:492
-msgid "Executable content type not permitted to this channel."
+#: ../../Zotlabs/Module/Connedit.php:907 ../../Zotlabs/Module/Profiles.php:791
+#: ../../addon/cdav/Mod_Cdav.php:1141
+msgid "Instant messenger"
msgstr ""
-#: ../../Zotlabs/Module/Item.php:842
-msgid "Duplicate post suppressed."
+#: ../../Zotlabs/Module/Connedit.php:908 ../../Zotlabs/Module/Profiles.php:792
+#: ../../addon/cdav/Mod_Cdav.php:1142
+msgid "Website"
msgstr ""
-#: ../../Zotlabs/Module/Item.php:984
-msgid "System error. Post not saved."
+#: ../../Zotlabs/Module/Connedit.php:910 ../../Zotlabs/Module/Profiles.php:794
+#: ../../addon/cdav/Mod_Cdav.php:1144
+msgid "Note"
msgstr ""
-#: ../../Zotlabs/Module/Item.php:1114
-msgid "Unable to obtain post information from database."
+#: ../../Zotlabs/Module/Connedit.php:911 ../../Zotlabs/Module/Profiles.php:795
+#: ../../addon/cdav/Mod_Cdav.php:1145 ../../addon/cdav/cdav.php:270
+#: ../../include/connections.php:668
+msgid "Mobile"
msgstr ""
-#: ../../Zotlabs/Module/Item.php:1121
-#, php-format
-msgid "You have reached your limit of %1$.0f top level posts."
+#: ../../Zotlabs/Module/Connedit.php:912 ../../Zotlabs/Module/Profiles.php:796
+#: ../../addon/cdav/Mod_Cdav.php:1146 ../../addon/cdav/cdav.php:271
+#: ../../include/connections.php:669
+msgid "Home"
msgstr ""
-#: ../../Zotlabs/Module/Item.php:1128
-#, php-format
-msgid "You have reached your limit of %1$.0f webpages."
+#: ../../Zotlabs/Module/Connedit.php:913 ../../Zotlabs/Module/Profiles.php:797
+#: ../../addon/cdav/Mod_Cdav.php:1147 ../../addon/cdav/cdav.php:274
+#: ../../include/connections.php:672
+msgid "Work"
msgstr ""
-#: ../../Zotlabs/Module/Pconfig.php:26 ../../Zotlabs/Module/Pconfig.php:59
-msgid "This setting requires special processing and editing has been blocked."
+#: ../../Zotlabs/Module/Connedit.php:915 ../../Zotlabs/Module/Profiles.php:799
+#: ../../addon/cdav/Mod_Cdav.php:1149 ../../addon/jappixmini/jappixmini.php:368
+msgid "Add Contact"
msgstr ""
-#: ../../Zotlabs/Module/Pconfig.php:48
-msgid "Configuration Editor"
+#: ../../Zotlabs/Module/Connedit.php:916 ../../Zotlabs/Module/Profiles.php:800
+#: ../../addon/cdav/Mod_Cdav.php:1150
+msgid "Add Field"
msgstr ""
-#: ../../Zotlabs/Module/Pconfig.php:49
-msgid ""
-"Warning: Changing some settings could render your channel inoperable. Please "
-"leave this page unless you are comfortable with and knowledgeable about how "
-"to correctly use this feature."
+#: ../../Zotlabs/Module/Connedit.php:921 ../../addon/cdav/Mod_Cdav.php:1155
+msgid "P.O. Box"
msgstr ""
-#: ../../Zotlabs/Module/Profile.php:78
-msgid "vcard"
+#: ../../Zotlabs/Module/Connedit.php:922 ../../addon/cdav/Mod_Cdav.php:1156
+msgid "Additional"
msgstr ""
-#: ../../Zotlabs/Module/Blocks.php:154 ../../include/text.php:2283
-msgid "Blocks"
+#: ../../Zotlabs/Module/Connedit.php:923 ../../addon/cdav/Mod_Cdav.php:1157
+msgid "Street"
msgstr ""
-#: ../../Zotlabs/Module/Blocks.php:156
-msgid "Block Title"
+#: ../../Zotlabs/Module/Connedit.php:924 ../../addon/cdav/Mod_Cdav.php:1158
+msgid "Locality"
msgstr ""
-#: ../../Zotlabs/Module/Layouts.php:183 ../../include/text.php:2285
-msgid "Layouts"
+#: ../../Zotlabs/Module/Connedit.php:925 ../../addon/cdav/Mod_Cdav.php:1159
+msgid "Region"
msgstr ""
-#: ../../Zotlabs/Module/Layouts.php:185 ../../Zotlabs/Lib/Apps.php:232
-#: ../../include/nav.php:174 ../../include/help.php:53
-#: ../../include/help.php:59
-msgid "Help"
+#: ../../Zotlabs/Module/Connedit.php:926 ../../addon/cdav/Mod_Cdav.php:1160
+msgid "ZIP Code"
msgstr ""
-#: ../../Zotlabs/Module/Layouts.php:185
-msgid "Comanche page description language help"
+#: ../../Zotlabs/Module/Connedit.php:927 ../../Zotlabs/Module/Profiles.php:760
+#: ../../addon/cdav/Mod_Cdav.php:1161
+msgid "Country"
msgstr ""
-#: ../../Zotlabs/Module/Layouts.php:189
-msgid "Layout Description"
+#: ../../Zotlabs/Module/Chat.php:179
+msgid "Room not found"
msgstr ""
-#: ../../Zotlabs/Module/Layouts.php:194
-msgid "Download PDL file"
+#: ../../Zotlabs/Module/Chat.php:195
+msgid "Leave Room"
msgstr ""
-#: ../../Zotlabs/Module/Rate.php:156
-msgid "Website:"
+#: ../../Zotlabs/Module/Chat.php:196
+msgid "Delete Room"
msgstr ""
-#: ../../Zotlabs/Module/Rate.php:159
-#, php-format
-msgid "Remote Channel [%s] (not yet known on this site)"
+#: ../../Zotlabs/Module/Chat.php:197
+msgid "I am away right now"
msgstr ""
-#: ../../Zotlabs/Module/Rate.php:160
-msgid "Rating (this information is public)"
+#: ../../Zotlabs/Module/Chat.php:198
+msgid "I am online"
msgstr ""
-#: ../../Zotlabs/Module/Rate.php:161
-msgid "Optionally explain your rating (this information is public)"
+#: ../../Zotlabs/Module/Chat.php:200
+msgid "Bookmark this room"
msgstr ""
-#: ../../Zotlabs/Module/Profile_photo.php:190
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:295
-msgid ""
-"Shift-reload the page or clear browser cache if the new photo does not "
-"display immediately."
+#: ../../Zotlabs/Module/Chat.php:203 ../../Zotlabs/Module/Mail.php:259
+#: ../../Zotlabs/Module/Mail.php:380 ../../include/conversation.php:1263
+msgid "Please enter a link URL:"
msgstr ""
-#: ../../Zotlabs/Module/Profile_photo.php:411
-msgid "Use Photo for Profile"
+#: ../../Zotlabs/Module/Chat.php:204 ../../Zotlabs/Module/Mail.php:312
+#: ../../Zotlabs/Module/Mail.php:454 ../../Zotlabs/Lib/ThreadItem.php:744
+#: ../../include/conversation.php:1373
+msgid "Encrypt text"
msgstr ""
-#: ../../Zotlabs/Module/Profile_photo.php:411
-msgid "Upload Profile Photo"
+#: ../../Zotlabs/Module/Chat.php:230
+msgid "New Chatroom"
msgstr ""
-#: ../../Zotlabs/Module/Profile_photo.php:412
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:182
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:194
-msgid "Use"
+#: ../../Zotlabs/Module/Chat.php:231
+msgid "Chatroom name"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:25
-msgid "Calendar entries imported."
+#: ../../Zotlabs/Module/Chat.php:232
+msgid "Expiration of chats (minutes)"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:27
-msgid "No calendar entries found."
+#: ../../Zotlabs/Module/Chat.php:248
+#, php-format
+msgid "%1$s's Chatrooms"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:110
-msgid "Event can not end before it has started."
+#: ../../Zotlabs/Module/Chat.php:253
+msgid "No chatrooms available"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:112 ../../Zotlabs/Module/Events.php:121
-#: ../../Zotlabs/Module/Events.php:143
-msgid "Unable to generate preview."
+#: ../../Zotlabs/Module/Chat.php:257
+msgid "Expiration"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:119
-msgid "Event title and start time are required."
+#: ../../Zotlabs/Module/Chat.php:258
+msgid "min"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:141 ../../Zotlabs/Module/Events.php:265
-msgid "Event not found."
+#: ../../Zotlabs/Module/Fbrowser.php:29 ../../Zotlabs/Lib/Apps.php:229
+#: ../../include/conversation.php:1783 ../../include/nav.php:392
+msgid "Photos"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:460
-msgid "Edit event title"
+#: ../../Zotlabs/Module/Fbrowser.php:85 ../../Zotlabs/Lib/Apps.php:224
+#: ../../Zotlabs/Storage/Browser.php:224 ../../include/conversation.php:1791
+#: ../../include/nav.php:400
+msgid "Files"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:460
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:835
-msgid "Event title"
+#: ../../Zotlabs/Module/Menu.php:49
+msgid "Unable to update menu."
msgstr ""
-#: ../../Zotlabs/Module/Events.php:462
-msgid "Categories (comma-separated list)"
+#: ../../Zotlabs/Module/Menu.php:60
+msgid "Unable to create menu."
msgstr ""
-#: ../../Zotlabs/Module/Events.php:463
-msgid "Edit Category"
+#: ../../Zotlabs/Module/Menu.php:98 ../../Zotlabs/Module/Menu.php:110
+msgid "Menu Name"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:463
-msgid "Category"
+#: ../../Zotlabs/Module/Menu.php:98
+msgid "Unique name (not visible on webpage) - required"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:466
-msgid "Edit start date and time"
+#: ../../Zotlabs/Module/Menu.php:99 ../../Zotlabs/Module/Menu.php:111
+msgid "Menu Title"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:466
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:836
-msgid "Start date and time"
+#: ../../Zotlabs/Module/Menu.php:99
+msgid "Visible on webpage - leave empty for no title"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:467 ../../Zotlabs/Module/Events.php:470
-msgid "Finish date and time are not known or not relevant"
+#: ../../Zotlabs/Module/Menu.php:100
+msgid "Allow Bookmarks"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:469
-msgid "Edit finish date and time"
+#: ../../Zotlabs/Module/Menu.php:100 ../../Zotlabs/Module/Menu.php:157
+msgid "Menu may be used to store saved bookmarks"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:469
-msgid "Finish date and time"
+#: ../../Zotlabs/Module/Menu.php:101 ../../Zotlabs/Module/Menu.php:159
+msgid "Submit and proceed"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:471 ../../Zotlabs/Module/Events.php:472
-msgid "Adjust for viewer timezone"
+#: ../../Zotlabs/Module/Menu.php:107 ../../include/text.php:2268
+msgid "Menus"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:471
-msgid ""
-"Important for events that happen in a particular place. Not practical for "
-"global holidays."
+#: ../../Zotlabs/Module/Menu.php:117
+msgid "Bookmarks allowed"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:473
-msgid "Edit Description"
+#: ../../Zotlabs/Module/Menu.php:119
+msgid "Delete this menu"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:475
-msgid "Edit Location"
+#: ../../Zotlabs/Module/Menu.php:120 ../../Zotlabs/Module/Menu.php:154
+msgid "Edit menu contents"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:479 ../../include/conversation.php:1410
-msgid "Permission settings"
+#: ../../Zotlabs/Module/Menu.php:121
+msgid "Edit this menu"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:489
-msgid "Timezone:"
+#: ../../Zotlabs/Module/Menu.php:136
+msgid "Menu could not be deleted."
msgstr ""
-#: ../../Zotlabs/Module/Events.php:494
-msgid "Advanced Options"
+#: ../../Zotlabs/Module/Menu.php:149
+msgid "Edit Menu"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:633
-msgid "Edit event"
+#: ../../Zotlabs/Module/Menu.php:153
+msgid "Add or remove entries to this menu"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:635
-msgid "Delete event"
+#: ../../Zotlabs/Module/Menu.php:155
+msgid "Menu name"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:669
-msgid "calendar"
+#: ../../Zotlabs/Module/Menu.php:155
+msgid "Must be unique, only seen by you"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:695
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:849
-msgid "Month"
+#: ../../Zotlabs/Module/Menu.php:156
+msgid "Menu title"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:696
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:850
-msgid "Week"
+#: ../../Zotlabs/Module/Menu.php:156
+msgid "Menu title as seen by others"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:697
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:851
-msgid "Day"
+#: ../../Zotlabs/Module/Menu.php:157
+msgid "Allow bookmarks"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:731
-msgid "Event removed"
+#: ../../Zotlabs/Module/Layouts.php:184 ../../include/text.php:2269
+msgid "Layouts"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:734
-msgid "Failed to remove event"
+#: ../../Zotlabs/Module/Layouts.php:186 ../../Zotlabs/Lib/Apps.php:232
+#: ../../include/nav.php:161 ../../include/nav.php:268
+#: ../../include/help.php:55 ../../include/help.php:61
+msgid "Help"
msgstr ""
-#: ../../Zotlabs/Module/Common.php:14
-msgid "No channel."
+#: ../../Zotlabs/Module/Layouts.php:186
+msgid "Comanche page description language help"
msgstr ""
-#: ../../Zotlabs/Module/Common.php:43
-msgid "Common connections"
+#: ../../Zotlabs/Module/Layouts.php:190
+msgid "Layout Description"
msgstr ""
-#: ../../Zotlabs/Module/Common.php:48
-msgid "No connections in common."
+#: ../../Zotlabs/Module/Layouts.php:195
+msgid "Download PDL file"
msgstr ""
-#: ../../Zotlabs/Module/Chanview.php:134
-msgid "toggle full screen mode"
+#: ../../Zotlabs/Module/Tagger.php:55 ../../include/bbcode.php:274
+msgid "post"
msgstr ""
-#: ../../Zotlabs/Module/Profperm.php:34 ../../Zotlabs/Module/Profperm.php:63
-msgid "Invalid profile identifier."
+#: ../../Zotlabs/Module/Tagger.php:57 ../../include/conversation.php:146
+#: ../../include/text.php:1945
+msgid "comment"
msgstr ""
-#: ../../Zotlabs/Module/Profperm.php:111
-msgid "Profile Visibility Editor"
+#: ../../Zotlabs/Module/Tagger.php:95
+#, php-format
+msgid "%1$s tagged %2$s's %3$s with %4$s"
msgstr ""
-#: ../../Zotlabs/Module/Profperm.php:113 ../../include/channel.php:1367
-msgid "Profile"
+#: ../../Zotlabs/Module/Pconfig.php:26 ../../Zotlabs/Module/Pconfig.php:59
+msgid "This setting requires special processing and editing has been blocked."
msgstr ""
-#: ../../Zotlabs/Module/Profperm.php:115
-msgid "Click on a contact to add or remove."
+#: ../../Zotlabs/Module/Pconfig.php:48
+msgid "Configuration Editor"
msgstr ""
-#: ../../Zotlabs/Module/Profperm.php:124
-msgid "Visible To"
+#: ../../Zotlabs/Module/Pconfig.php:49
+msgid ""
+"Warning: Changing some settings could render your channel inoperable. Please "
+"leave this page unless you are comfortable with and knowledgeable about how "
+"to correctly use this feature."
msgstr ""
-#: ../../Zotlabs/Module/Channel.php:32 ../../Zotlabs/Module/Chat.php:25
-#: ../../extend/addon/addon/chess/chess.php:400
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:26
-msgid "You must be logged in to see this page."
+#: ../../Zotlabs/Module/Group.php:24
+msgid "Privacy group created."
msgstr ""
-#: ../../Zotlabs/Module/Channel.php:44
-msgid "Posts and comments"
+#: ../../Zotlabs/Module/Group.php:30
+msgid "Could not create privacy group."
msgstr ""
-#: ../../Zotlabs/Module/Channel.php:45
-msgid "Only posts"
+#: ../../Zotlabs/Module/Group.php:42 ../../Zotlabs/Module/Group.php:141
+#: ../../include/items.php:3922
+msgid "Privacy group not found."
msgstr ""
-#: ../../Zotlabs/Module/Channel.php:104
-msgid "Insufficient permissions. Request redirected to profile page."
+#: ../../Zotlabs/Module/Group.php:58
+msgid "Privacy group updated."
msgstr ""
-#: ../../Zotlabs/Module/Lostpass.php:19
-msgid "No valid account found."
+#: ../../Zotlabs/Module/Group.php:90
+msgid "Create a group of channels."
msgstr ""
-#: ../../Zotlabs/Module/Lostpass.php:33
-msgid "Password reset request issued. Check your email."
+#: ../../Zotlabs/Module/Group.php:91 ../../Zotlabs/Module/Group.php:184
+msgid "Privacy group name: "
msgstr ""
-#: ../../Zotlabs/Module/Lostpass.php:39 ../../Zotlabs/Module/Lostpass.php:108
-#, php-format
-msgid "Site Member (%s)"
+#: ../../Zotlabs/Module/Group.php:93 ../../Zotlabs/Module/Group.php:187
+msgid "Members are visible to other channels"
msgstr ""
-#: ../../Zotlabs/Module/Lostpass.php:44 ../../Zotlabs/Module/Lostpass.php:49
-#, php-format
-msgid "Password reset requested at %s"
+#: ../../Zotlabs/Module/Group.php:111
+msgid "Privacy group removed."
msgstr ""
-#: ../../Zotlabs/Module/Lostpass.php:68
-msgid ""
-"Request could not be verified. (You may have previously submitted it.) "
-"Password reset failed."
+#: ../../Zotlabs/Module/Group.php:113
+msgid "Unable to remove privacy group."
msgstr ""
-#: ../../Zotlabs/Module/Lostpass.php:91 ../../boot.php:1740
-msgid "Password Reset"
+#: ../../Zotlabs/Module/Group.php:183
+msgid "Privacy group editor"
msgstr ""
-#: ../../Zotlabs/Module/Lostpass.php:92
-msgid "Your password has been reset as requested."
+#: ../../Zotlabs/Module/Group.php:197 ../../Zotlabs/Module/Help.php:81
+msgid "Members"
msgstr ""
-#: ../../Zotlabs/Module/Lostpass.php:93
-msgid "Your new password is"
+#: ../../Zotlabs/Module/Group.php:199
+msgid "All Connected Channels"
msgstr ""
-#: ../../Zotlabs/Module/Lostpass.php:94
-msgid "Save or copy your new password - and then"
+#: ../../Zotlabs/Module/Group.php:231
+msgid "Click on a channel to add or remove."
msgstr ""
-#: ../../Zotlabs/Module/Lostpass.php:95
-msgid "click here to login"
+#: ../../Zotlabs/Module/Profiles.php:24 ../../Zotlabs/Module/Profiles.php:184
+#: ../../Zotlabs/Module/Profiles.php:241 ../../Zotlabs/Module/Profiles.php:659
+msgid "Profile not found."
msgstr ""
-#: ../../Zotlabs/Module/Lostpass.php:96
-msgid ""
-"Your password may be changed from the <em>Settings</em> page after "
-"successful login."
+#: ../../Zotlabs/Module/Profiles.php:44
+msgid "Profile deleted."
msgstr ""
-#: ../../Zotlabs/Module/Lostpass.php:117
-#, php-format
-msgid "Your password has changed at %s"
+#: ../../Zotlabs/Module/Profiles.php:68 ../../Zotlabs/Module/Profiles.php:105
+msgid "Profile-"
msgstr ""
-#: ../../Zotlabs/Module/Lostpass.php:130
-msgid "Forgot your Password?"
+#: ../../Zotlabs/Module/Profiles.php:90 ../../Zotlabs/Module/Profiles.php:127
+msgid "New profile created."
msgstr ""
-#: ../../Zotlabs/Module/Lostpass.php:131
-msgid ""
-"Enter your email address and submit to have your password reset. Then check "
-"your email for further instructions."
+#: ../../Zotlabs/Module/Profiles.php:111
+msgid "Profile unavailable to clone."
msgstr ""
-#: ../../Zotlabs/Module/Lostpass.php:132
-msgid "Email Address"
+#: ../../Zotlabs/Module/Profiles.php:146
+msgid "Profile unavailable to export."
msgstr ""
-#: ../../Zotlabs/Module/Lostpass.php:133
-msgid "Reset"
+#: ../../Zotlabs/Module/Profiles.php:252
+msgid "Profile Name is required."
msgstr ""
-#: ../../Zotlabs/Module/Rbmark.php:94
-msgid "Select a bookmark folder"
+#: ../../Zotlabs/Module/Profiles.php:459
+msgid "Marital Status"
msgstr ""
-#: ../../Zotlabs/Module/Rbmark.php:99
-msgid "Save Bookmark"
+#: ../../Zotlabs/Module/Profiles.php:463
+msgid "Romantic Partner"
msgstr ""
-#: ../../Zotlabs/Module/Rbmark.php:100
-msgid "URL of bookmark"
+#: ../../Zotlabs/Module/Profiles.php:467 ../../Zotlabs/Module/Profiles.php:775
+msgid "Likes"
msgstr ""
-#: ../../Zotlabs/Module/Rbmark.php:105
-msgid "Or enter new bookmark folder name"
+#: ../../Zotlabs/Module/Profiles.php:471 ../../Zotlabs/Module/Profiles.php:776
+msgid "Dislikes"
msgstr ""
-#: ../../Zotlabs/Module/Follow.php:31
-msgid "Channel added."
+#: ../../Zotlabs/Module/Profiles.php:475 ../../Zotlabs/Module/Profiles.php:783
+msgid "Work/Employment"
msgstr ""
-#: ../../Zotlabs/Module/Rmagic.php:35
-msgid "Authentication failed."
+#: ../../Zotlabs/Module/Profiles.php:478
+msgid "Religion"
msgstr ""
-#: ../../Zotlabs/Module/Rmagic.php:75 ../../include/channel.php:1991
-msgid "Remote Authentication"
+#: ../../Zotlabs/Module/Profiles.php:482
+msgid "Political Views"
msgstr ""
-#: ../../Zotlabs/Module/Rmagic.php:76 ../../include/channel.php:1992
-msgid "Enter your channel address (e.g. channel@example.com)"
+#: ../../Zotlabs/Module/Profiles.php:486
+#: ../../addon/openid/MysqlProvider.php:74
+msgid "Gender"
msgstr ""
-#: ../../Zotlabs/Module/Rmagic.php:77 ../../include/channel.php:1993
-msgid "Authenticate"
+#: ../../Zotlabs/Module/Profiles.php:490
+msgid "Sexual Preference"
msgstr ""
-#: ../../Zotlabs/Module/Regmod.php:15
-msgid "Please login."
+#: ../../Zotlabs/Module/Profiles.php:494
+msgid "Homepage"
msgstr ""
-#: ../../Zotlabs/Module/Removeaccount.php:35
-msgid ""
-"Account removals are not allowed within 48 hours of changing the account "
-"password."
+#: ../../Zotlabs/Module/Profiles.php:498
+msgid "Interests"
msgstr ""
-#: ../../Zotlabs/Module/Removeaccount.php:57
-msgid "Remove This Account"
+#: ../../Zotlabs/Module/Profiles.php:594
+msgid "Profile updated."
msgstr ""
-#: ../../Zotlabs/Module/Removeaccount.php:58
-#: ../../Zotlabs/Module/Removeme.php:61
-msgid "WARNING: "
+#: ../../Zotlabs/Module/Profiles.php:678
+msgid "Hide your connections list from viewers of this profile"
msgstr ""
-#: ../../Zotlabs/Module/Removeaccount.php:58
-msgid ""
-"This account and all its channels will be completely removed from the "
-"network. "
+#: ../../Zotlabs/Module/Profiles.php:725
+msgid "Edit Profile Details"
msgstr ""
-#: ../../Zotlabs/Module/Removeaccount.php:58
-#: ../../Zotlabs/Module/Removeme.php:61
-msgid "This action is permanent and can not be undone!"
+#: ../../Zotlabs/Module/Profiles.php:727
+msgid "View this profile"
msgstr ""
-#: ../../Zotlabs/Module/Removeaccount.php:59
-#: ../../Zotlabs/Module/Removeme.php:62
-msgid "Please enter your password for verification:"
+#: ../../Zotlabs/Module/Profiles.php:728 ../../Zotlabs/Module/Profiles.php:827
+#: ../../include/channel.php:1066
+msgid "Edit visibility"
msgstr ""
-#: ../../Zotlabs/Module/Removeaccount.php:60
-msgid ""
-"Remove this account, all its channels and all its channel clones from the "
-"network"
+#: ../../Zotlabs/Module/Profiles.php:729
+msgid "Profile Tools"
msgstr ""
-#: ../../Zotlabs/Module/Removeaccount.php:60
-msgid ""
-"By default only the instances of the channels located on this hub will be "
-"removed from the network"
+#: ../../Zotlabs/Module/Profiles.php:730
+msgid "Change cover photo"
msgstr ""
-#: ../../Zotlabs/Module/Removeaccount.php:61
-#: ../../Zotlabs/Module/Settings/Account.php:120
-msgid "Remove Account"
+#: ../../Zotlabs/Module/Profiles.php:731 ../../include/channel.php:1037
+msgid "Change profile photo"
msgstr ""
-#: ../../Zotlabs/Module/Pdledit.php:21
-msgid "Layout updated."
+#: ../../Zotlabs/Module/Profiles.php:732
+msgid "Create a new profile using these settings"
msgstr ""
-#: ../../Zotlabs/Module/Pdledit.php:34 ../../Zotlabs/Module/Chat.php:218
-msgid "Feature disabled."
+#: ../../Zotlabs/Module/Profiles.php:733
+msgid "Clone this profile"
msgstr ""
-#: ../../Zotlabs/Module/Pdledit.php:42 ../../Zotlabs/Module/Pdledit.php:69
-msgid "Edit System Page Description"
+#: ../../Zotlabs/Module/Profiles.php:734
+msgid "Delete this profile"
msgstr ""
-#: ../../Zotlabs/Module/Pdledit.php:64
-msgid "Layout not found."
+#: ../../Zotlabs/Module/Profiles.php:735
+msgid "Add profile things"
msgstr ""
-#: ../../Zotlabs/Module/Pdledit.php:70
-msgid "Module Name:"
+#: ../../Zotlabs/Module/Profiles.php:736 ../../include/conversation.php:1657
+msgid "Personal"
msgstr ""
-#: ../../Zotlabs/Module/Pdledit.php:71
-msgid "Layout Help"
+#: ../../Zotlabs/Module/Profiles.php:738
+msgid "Relation"
msgstr ""
-#: ../../Zotlabs/Module/Uexport.php:57 ../../Zotlabs/Module/Uexport.php:58
-msgid "Export Channel"
+#: ../../Zotlabs/Module/Profiles.php:739 ../../include/datetime.php:55
+msgid "Miscellaneous"
msgstr ""
-#: ../../Zotlabs/Module/Uexport.php:59
-msgid ""
-"Export your basic channel information to a file. This acts as a backup of "
-"your connections, permissions, profile and basic data, which can be used to "
-"import your data to a new server hub, but does not contain your content."
+#: ../../Zotlabs/Module/Profiles.php:741
+msgid "Import profile from file"
msgstr ""
-#: ../../Zotlabs/Module/Uexport.php:60
-msgid "Export Content"
+#: ../../Zotlabs/Module/Profiles.php:742
+msgid "Export profile to file"
msgstr ""
-#: ../../Zotlabs/Module/Uexport.php:61
-msgid ""
-"Export your channel information and recent content to a JSON backup that can "
-"be restored or imported to another server hub. This backs up all of your "
-"connections, permissions, profile data and several months of posts. This "
-"file may be VERY large. Please be patient - it may take several minutes for "
-"this download to begin."
+#: ../../Zotlabs/Module/Profiles.php:743
+msgid "Your gender"
msgstr ""
-#: ../../Zotlabs/Module/Uexport.php:63
-msgid "Export your posts from a given year."
+#: ../../Zotlabs/Module/Profiles.php:744
+msgid "Marital status"
msgstr ""
-#: ../../Zotlabs/Module/Uexport.php:65
-msgid ""
-"You may also export your posts and conversations for a particular year or "
-"month. Adjust the date in your browser location bar to select other dates. "
-"If the export fails (possibly due to memory exhaustion on your server hub), "
-"please try again selecting a more limited date range."
+#: ../../Zotlabs/Module/Profiles.php:745
+msgid "Sexual preference"
msgstr ""
-#: ../../Zotlabs/Module/Uexport.php:66
-#, php-format
-msgid ""
-"To select all posts for a given year, such as this year, visit <a href=\"%1$s"
-"\">%2$s</a>"
+#: ../../Zotlabs/Module/Profiles.php:748
+msgid "Profile name"
msgstr ""
-#: ../../Zotlabs/Module/Uexport.php:67
-#, php-format
-msgid ""
-"To select all posts for a given month, such as January of this year, visit "
-"<a href=\"%1$s\">%2$s</a>"
+#: ../../Zotlabs/Module/Profiles.php:750
+msgid "This is your default profile."
msgstr ""
-#: ../../Zotlabs/Module/Uexport.php:68
-#, php-format
-msgid ""
-"These content files may be imported or restored by visiting <a href=\"%1$s\">"
-"%2$s</a> on any site containing your channel. For best results please import "
-"or restore these in date order (oldest first)."
+#: ../../Zotlabs/Module/Profiles.php:752
+msgid "Your full name"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:246
-#, php-format
-msgid "%d rating"
-msgid_plural "%d ratings"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../../Zotlabs/Module/Directory.php:257
-msgid "Gender: "
+#: ../../Zotlabs/Module/Profiles.php:753
+msgid "Title/Description"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:259
-msgid "Status: "
+#: ../../Zotlabs/Module/Profiles.php:756
+msgid "Street address"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:261
-msgid "Homepage: "
+#: ../../Zotlabs/Module/Profiles.php:757
+msgid "Locality/City"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:310 ../../include/channel.php:1298
-msgid "Age:"
+#: ../../Zotlabs/Module/Profiles.php:758
+msgid "Region/State"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:315 ../../include/markdown.php:561
-#: ../../include/channel.php:1134 ../../include/event.php:52
-#: ../../include/event.php:84
-msgid "Location:"
+#: ../../Zotlabs/Module/Profiles.php:759
+msgid "Postal/Zip code"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:321
-msgid "Description:"
+#: ../../Zotlabs/Module/Profiles.php:765
+msgid "Who (if applicable)"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:326 ../../include/channel.php:1314
-msgid "Hometown:"
+#: ../../Zotlabs/Module/Profiles.php:765
+msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:328 ../../include/channel.php:1322
-msgid "About:"
+#: ../../Zotlabs/Module/Profiles.php:766
+msgid "Since (date)"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:329 ../../Zotlabs/Module/Suggest.php:56
-#: ../../include/connections.php:110 ../../include/conversation.php:938
-#: ../../include/conversation.php:1069 ../../include/widgets.php:148
-#: ../../include/widgets.php:185 ../../include/channel.php:1119
-msgid "Connect"
+#: ../../Zotlabs/Module/Profiles.php:769
+msgid "Tell us about yourself"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:330
-msgid "Public Forum:"
+#: ../../Zotlabs/Module/Profiles.php:770
+#: ../../addon/openid/MysqlProvider.php:68
+msgid "Homepage URL"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:333
-msgid "Keywords: "
+#: ../../Zotlabs/Module/Profiles.php:771
+msgid "Hometown"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:336
-msgid "Don't suggest"
+#: ../../Zotlabs/Module/Profiles.php:772
+msgid "Political views"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:338
-msgid "Common connections:"
+#: ../../Zotlabs/Module/Profiles.php:773
+msgid "Religious views"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:387
-msgid "Global Directory"
+#: ../../Zotlabs/Module/Profiles.php:774
+msgid "Keywords used in directory listings"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:387
-msgid "Local Directory"
+#: ../../Zotlabs/Module/Profiles.php:774
+msgid "Example: fishing photography software"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:393
-msgid "Finding:"
+#: ../../Zotlabs/Module/Profiles.php:777
+msgid "Musical interests"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:396 ../../Zotlabs/Module/Suggest.php:64
-#: ../../include/contact_widgets.php:24
-msgid "Channel Suggestions"
+#: ../../Zotlabs/Module/Profiles.php:778
+msgid "Books, literature"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:398
-msgid "next page"
+#: ../../Zotlabs/Module/Profiles.php:779
+msgid "Television"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:398
-msgid "previous page"
+#: ../../Zotlabs/Module/Profiles.php:780
+msgid "Film/Dance/Culture/Entertainment"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:399
-msgid "Sort options"
+#: ../../Zotlabs/Module/Profiles.php:781
+msgid "Hobbies/Interests"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:400
-msgid "Alphabetic"
+#: ../../Zotlabs/Module/Profiles.php:782
+msgid "Love/Romance"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:401
-msgid "Reverse Alphabetic"
+#: ../../Zotlabs/Module/Profiles.php:784
+msgid "School/Education"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:402
-msgid "Newest to Oldest"
+#: ../../Zotlabs/Module/Profiles.php:785
+msgid "Contact information and social networks"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:403
-msgid "Oldest to Newest"
+#: ../../Zotlabs/Module/Profiles.php:786
+msgid "My other channels"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:420
-msgid "No entries (some entries may be hidden)."
+#: ../../Zotlabs/Module/Profiles.php:788
+msgid "Communications"
msgstr ""
-#: ../../Zotlabs/Module/Chatsvc.php:131
-msgid "Away"
+#: ../../Zotlabs/Module/Profiles.php:823 ../../include/channel.php:1062
+msgid "Profile Image"
msgstr ""
-#: ../../Zotlabs/Module/Chatsvc.php:136
-msgid "Online"
+#: ../../Zotlabs/Module/Profiles.php:833 ../../include/channel.php:1044
+#: ../../include/nav.php:109
+msgid "Edit Profiles"
msgstr ""
-#: ../../Zotlabs/Module/Service_limits.php:23
-msgid "No service class restrictions found."
+#: ../../Zotlabs/Module/Editwebpage.php:139
+msgid "Page link"
msgstr ""
-#: ../../Zotlabs/Module/Webpages.php:52
-msgid "Import Webpage Elements"
+#: ../../Zotlabs/Module/Editwebpage.php:166
+msgid "Edit Webpage"
msgstr ""
-#: ../../Zotlabs/Module/Webpages.php:53
-msgid "Import selected"
+#: ../../Zotlabs/Module/Manage.php:143
+msgid "Create a new channel"
msgstr ""
-#: ../../Zotlabs/Module/Webpages.php:76
-msgid "Export Webpage Elements"
+#: ../../Zotlabs/Module/Manage.php:168 ../../Zotlabs/Lib/Apps.php:221
+#: ../../include/nav.php:205
+msgid "Channel Manager"
msgstr ""
-#: ../../Zotlabs/Module/Webpages.php:77
-msgid "Export selected"
+#: ../../Zotlabs/Module/Manage.php:169
+msgid "Current Channel"
msgstr ""
-#: ../../Zotlabs/Module/Webpages.php:241 ../../Zotlabs/Lib/Apps.php:225
-#: ../../include/conversation.php:1889
-msgid "Webpages"
+#: ../../Zotlabs/Module/Manage.php:171
+msgid "Switch to one of your channels by selecting it."
msgstr ""
-#: ../../Zotlabs/Module/Webpages.php:252 ../../include/page_widgets.php:44
-msgid "Actions"
+#: ../../Zotlabs/Module/Manage.php:172
+msgid "Default Channel"
msgstr ""
-#: ../../Zotlabs/Module/Webpages.php:253 ../../include/page_widgets.php:45
-msgid "Page Link"
+#: ../../Zotlabs/Module/Manage.php:173
+msgid "Make Default"
msgstr ""
-#: ../../Zotlabs/Module/Webpages.php:254
-msgid "Page Title"
+#: ../../Zotlabs/Module/Manage.php:176
+#, php-format
+msgid "%d new messages"
msgstr ""
-#: ../../Zotlabs/Module/Webpages.php:284
-msgid "Invalid file type."
+#: ../../Zotlabs/Module/Manage.php:177
+#, php-format
+msgid "%d new introductions"
msgstr ""
-#: ../../Zotlabs/Module/Webpages.php:296
-msgid "Error opening zip file"
+#: ../../Zotlabs/Module/Manage.php:179
+msgid "Delegated Channel"
msgstr ""
-#: ../../Zotlabs/Module/Webpages.php:307
-msgid "Invalid folder path."
+#: ../../Zotlabs/Module/Dirsearch.php:33
+msgid "This directory server requires an access token"
msgstr ""
-#: ../../Zotlabs/Module/Webpages.php:334
-msgid "No webpage elements detected."
+#: ../../Zotlabs/Module/Siteinfo.php:20
+msgid "About this site"
msgstr ""
-#: ../../Zotlabs/Module/Webpages.php:409
-msgid "Import complete."
+#: ../../Zotlabs/Module/Siteinfo.php:21
+msgid "Site Name"
msgstr ""
-#: ../../Zotlabs/Module/Removeme.php:35
-msgid ""
-"Channel removals are not allowed within 48 hours of changing the account "
-"password."
+#: ../../Zotlabs/Module/Siteinfo.php:25 ../../include/network.php:2025
+msgid "Administrator"
msgstr ""
-#: ../../Zotlabs/Module/Removeme.php:60
-msgid "Remove This Channel"
+#: ../../Zotlabs/Module/Siteinfo.php:27 ../../Zotlabs/Module/Register.php:221
+msgid "Terms of Service"
msgstr ""
-#: ../../Zotlabs/Module/Removeme.php:61
-msgid "This channel will be completely removed from the network. "
+#: ../../Zotlabs/Module/Siteinfo.php:28
+msgid "Software and Project information"
msgstr ""
-#: ../../Zotlabs/Module/Removeme.php:63
-msgid "Remove this channel and all its clones from the network"
+#: ../../Zotlabs/Module/Siteinfo.php:29
+msgid "This site is powered by $Projectname"
msgstr ""
-#: ../../Zotlabs/Module/Removeme.php:63
+#: ../../Zotlabs/Module/Siteinfo.php:30
msgid ""
-"By default only the instance of the channel located on this hub will be "
-"removed from the network"
-msgstr ""
-
-#: ../../Zotlabs/Module/Removeme.php:64
-#: ../../Zotlabs/Module/Settings/Channel.php:575
-msgid "Remove Channel"
+"Federated and decentralised networking and identity services provided by Zot"
msgstr ""
-#: ../../Zotlabs/Module/Sharedwithme.php:98
-msgid "Files: shared with me"
+#: ../../Zotlabs/Module/Siteinfo.php:32
+#, php-format
+msgid "Version %s"
msgstr ""
-#: ../../Zotlabs/Module/Sharedwithme.php:100
-msgid "NEW"
+#: ../../Zotlabs/Module/Siteinfo.php:33
+msgid "Project homepage"
msgstr ""
-#: ../../Zotlabs/Module/Sharedwithme.php:103
-msgid "Remove all files"
+#: ../../Zotlabs/Module/Siteinfo.php:34
+msgid "Developer homepage"
msgstr ""
-#: ../../Zotlabs/Module/Sharedwithme.php:104
-msgid "Remove this file"
+#: ../../Zotlabs/Module/Ratings.php:70
+msgid "No ratings"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:29
-msgid "Profile Unavailable."
+#: ../../Zotlabs/Module/Ratings.php:97 ../../Zotlabs/Module/Pubsites.php:35
+#: ../../include/conversation.php:1032
+msgid "Ratings"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:43
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:40
-msgid "Not found"
+#: ../../Zotlabs/Module/Ratings.php:98
+msgid "Rating: "
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:67
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:60
-msgid "Invalid channel"
+#: ../../Zotlabs/Module/Ratings.php:99
+msgid "Website: "
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:158
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:144
-#: ../../include/conversation.php:1900
-msgid "Wikis"
+#: ../../Zotlabs/Module/Ratings.php:101
+msgid "Description: "
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:164
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:150
-msgid "Download"
+#: ../../Zotlabs/Module/Webpages.php:52
+msgid "Import Webpage Elements"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:168
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:154
-msgid "Wiki name"
+#: ../../Zotlabs/Module/Webpages.php:53
+msgid "Import selected"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:169
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:155
-msgid "Content type"
+#: ../../Zotlabs/Module/Webpages.php:76
+msgid "Export Webpage Elements"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:178
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:164
-msgid "Create a status post for this wiki"
+#: ../../Zotlabs/Module/Webpages.php:77
+msgid "Export selected"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:203
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:183
-msgid "Wiki not found"
+#: ../../Zotlabs/Module/Webpages.php:242 ../../Zotlabs/Lib/Apps.php:225
+#: ../../include/conversation.php:1841 ../../include/nav.php:449
+msgid "Webpages"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:227
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:208
-msgid "Rename page"
+#: ../../Zotlabs/Module/Webpages.php:253 ../../include/page_widgets.php:44
+msgid "Actions"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:231
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:212
-msgid "Error retrieving page content"
+#: ../../Zotlabs/Module/Webpages.php:254 ../../include/page_widgets.php:45
+msgid "Page Link"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:261
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:241
-msgid "Revision Comparison"
+#: ../../Zotlabs/Module/Webpages.php:255
+msgid "Page Title"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:262
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:242
-msgid "Revert"
+#: ../../Zotlabs/Module/Webpages.php:285
+msgid "Invalid file type."
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:266
-msgid "Short description of your changes (optional)"
+#: ../../Zotlabs/Module/Webpages.php:297
+msgid "Error opening zip file"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:273
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:251
-msgid "Source"
+#: ../../Zotlabs/Module/Webpages.php:308
+msgid "Invalid folder path."
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:281
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:259
-msgid "New page name"
+#: ../../Zotlabs/Module/Webpages.php:335
+msgid "No webpage elements detected."
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:286
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:264
-#: ../../include/conversation.php:1299
-msgid "Embed image from photo albums"
+#: ../../Zotlabs/Module/Webpages.php:410
+msgid "Import complete."
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:287
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:265
-#: ../../include/conversation.php:1393
-msgid "Embed an image from your albums"
+#: ../../Zotlabs/Module/Editpost.php:38
+msgid "Item is not editable"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:289
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:267
-#: ../../include/conversation.php:1395 ../../include/conversation.php:1442
-msgid "OK"
+#: ../../Zotlabs/Module/Editpost.php:103 ../../Zotlabs/Module/Rpost.php:138
+msgid "Edit post"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:290
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:268
-#: ../../include/conversation.php:1335
-msgid "Choose images to embed"
+#: ../../Zotlabs/Module/Dreport.php:45
+msgid "Invalid message"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:291
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:269
-#: ../../include/conversation.php:1336
-msgid "Choose an album"
+#: ../../Zotlabs/Module/Dreport.php:78
+msgid "no results"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:292
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:270
-msgid "Choose a different album"
+#: ../../Zotlabs/Module/Dreport.php:93
+msgid "channel sync processed"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:293
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:271
-#: ../../include/conversation.php:1338
-msgid "Error getting album list"
+#: ../../Zotlabs/Module/Dreport.php:97
+msgid "queued"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:294
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:272
-#: ../../include/conversation.php:1339
-msgid "Error getting photo link"
+#: ../../Zotlabs/Module/Dreport.php:101
+msgid "posted"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:295
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:273
-#: ../../include/conversation.php:1340
-msgid "Error getting album"
+#: ../../Zotlabs/Module/Dreport.php:105
+msgid "accepted for delivery"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:364
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:337
-msgid "Error creating wiki. Invalid name."
+#: ../../Zotlabs/Module/Dreport.php:109
+msgid "updated"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:376
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:348
-msgid "Wiki created, but error creating Home page."
+#: ../../Zotlabs/Module/Dreport.php:112
+msgid "update ignored"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:383
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:353
-msgid "Error creating wiki"
+#: ../../Zotlabs/Module/Dreport.php:115
+msgid "permission denied"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:395
-msgid "Wiki delete permission denied."
+#: ../../Zotlabs/Module/Dreport.php:119
+msgid "recipient not found"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:405
-msgid "Error deleting wiki"
+#: ../../Zotlabs/Module/Dreport.php:122
+msgid "mail recalled"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:431
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:400
-msgid "New page created"
+#: ../../Zotlabs/Module/Dreport.php:125
+msgid "duplicate mail received"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:546
-msgid "Cannot delete Home"
+#: ../../Zotlabs/Module/Dreport.php:128
+msgid "mail delivered"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:610
-msgid "Current Revision"
+#: ../../Zotlabs/Module/Dreport.php:148
+#, php-format
+msgid "Delivery report for %1$s"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:610
-msgid "Selected Revision"
+#: ../../Zotlabs/Module/Dreport.php:151
+msgid "Options"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:660
-msgid "You must be authenticated."
+#: ../../Zotlabs/Module/Dreport.php:152
+msgid "Redeliver"
msgstr ""
#: ../../Zotlabs/Module/Sources.php:37
@@ -6110,8 +6080,8 @@ msgstr ""
msgid "*"
msgstr ""
-#: ../../Zotlabs/Module/Sources.php:96 ../../include/widgets.php:691
-#: ../../include/features.php:213
+#: ../../Zotlabs/Module/Sources.php:96
+#: ../../Zotlabs/Widget/Settings_menu.php:123 ../../include/features.php:213
msgid "Channel Sources"
msgstr ""
@@ -6147,11 +6117,6 @@ msgid ""
"separated)"
msgstr ""
-#: ../../Zotlabs/Module/Sources.php:112 ../../Zotlabs/Module/Sources.php:147
-#: ../../Zotlabs/Module/Settings/Oauth.php:93
-msgid "Optional"
-msgstr ""
-
#: ../../Zotlabs/Module/Sources.php:133 ../../Zotlabs/Module/Sources.php:161
msgid "Source not found."
msgstr ""
@@ -6172,1017 +6137,1144 @@ msgstr ""
msgid "Unable to remove source."
msgstr ""
-#: ../../Zotlabs/Module/Subthread.php:118
+#: ../../Zotlabs/Module/Like.php:19
+msgid "Like/Dislike"
+msgstr ""
+
+#: ../../Zotlabs/Module/Like.php:24
+msgid "This action is restricted to members."
+msgstr ""
+
+#: ../../Zotlabs/Module/Like.php:25
+msgid ""
+"Please <a href=\"rmagic\">login with your $Projectname ID</a> or <a href="
+"\"register\">register as a new $Projectname member</a> to continue."
+msgstr ""
+
+#: ../../Zotlabs/Module/Like.php:105 ../../Zotlabs/Module/Like.php:131
+#: ../../Zotlabs/Module/Like.php:169
+msgid "Invalid request."
+msgstr ""
+
+#: ../../Zotlabs/Module/Like.php:117 ../../include/conversation.php:122
+msgid "channel"
+msgstr ""
+
+#: ../../Zotlabs/Module/Like.php:146
+msgid "thing"
+msgstr ""
+
+#: ../../Zotlabs/Module/Like.php:192
+msgid "Channel unavailable."
+msgstr ""
+
+#: ../../Zotlabs/Module/Like.php:240
+msgid "Previous action reversed."
+msgstr ""
+
+#: ../../Zotlabs/Module/Like.php:419 ../../addon/diaspora/inbound.php:1812
+#: ../../include/conversation.php:160
#, php-format
-msgid "%1$s is following %2$s's %3$s"
+msgid "%1$s likes %2$s's %3$s"
msgstr ""
-#: ../../Zotlabs/Module/Subthread.php:120
+#: ../../Zotlabs/Module/Like.php:421 ../../include/conversation.php:163
#, php-format
-msgid "%1$s stopped following %2$s's %3$s"
+msgid "%1$s doesn't like %2$s's %3$s"
msgstr ""
-#: ../../Zotlabs/Module/Suggest.php:39
-msgid ""
-"No suggestions available. If this is a new site, please try again in 24 "
-"hours."
+#: ../../Zotlabs/Module/Like.php:423
+#, php-format
+msgid "%1$s agrees with %2$s's %3$s"
msgstr ""
-#: ../../Zotlabs/Module/Suggest.php:58 ../../include/widgets.php:150
-msgid "Ignore/Hide"
+#: ../../Zotlabs/Module/Like.php:425
+#, php-format
+msgid "%1$s doesn't agree with %2$s's %3$s"
msgstr ""
-#: ../../Zotlabs/Module/Tagger.php:55 ../../include/bbcode.php:274
-msgid "post"
+#: ../../Zotlabs/Module/Like.php:427
+#, php-format
+msgid "%1$s abstains from a decision on %2$s's %3$s"
msgstr ""
-#: ../../Zotlabs/Module/Tagger.php:57 ../../include/conversation.php:150
-#: ../../include/text.php:1961
-msgid "comment"
+#: ../../Zotlabs/Module/Like.php:429
+#, php-format
+msgid "%1$s is attending %2$s's %3$s"
msgstr ""
-#: ../../Zotlabs/Module/Tagger.php:95
+#: ../../Zotlabs/Module/Like.php:431
#, php-format
-msgid "%1$s tagged %2$s's %3$s with %4$s"
+msgid "%1$s is not attending %2$s's %3$s"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Features.php:45
-msgid "Additional Features"
+#: ../../Zotlabs/Module/Like.php:433
+#, php-format
+msgid "%1$s may attend %2$s's %3$s"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Oauth.php:34
-msgid "Name is required"
+#: ../../Zotlabs/Module/Like.php:538
+msgid "Action completed."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Oauth.php:38
-msgid "Key and Secret are required"
+#: ../../Zotlabs/Module/Like.php:539
+msgid "Thank you."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Oauth.php:86
-#: ../../Zotlabs/Module/Settings/Oauth.php:112
-#: ../../Zotlabs/Module/Settings/Oauth.php:148
-msgid "Add application"
+#: ../../Zotlabs/Module/Directory.php:245
+#, php-format
+msgid "%d rating"
+msgid_plural "%d ratings"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../Zotlabs/Module/Directory.php:256
+msgid "Gender: "
msgstr ""
-#: ../../Zotlabs/Module/Settings/Oauth.php:89
-msgid "Name of application"
+#: ../../Zotlabs/Module/Directory.php:258
+msgid "Status: "
msgstr ""
-#: ../../Zotlabs/Module/Settings/Oauth.php:90
-#: ../../Zotlabs/Module/Settings/Oauth.php:116
-#: ../../extend/addon/addon/statusnet/statusnet.php:893
-#: ../../extend/addon/addon/twitter/twitter.php:775
-msgid "Consumer Key"
+#: ../../Zotlabs/Module/Directory.php:260
+msgid "Homepage: "
msgstr ""
-#: ../../Zotlabs/Module/Settings/Oauth.php:90
-#: ../../Zotlabs/Module/Settings/Oauth.php:91
-msgid "Automatically generated - change if desired. Max length 20"
+#: ../../Zotlabs/Module/Directory.php:309 ../../include/channel.php:1293
+msgid "Age:"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Oauth.php:91
-#: ../../Zotlabs/Module/Settings/Oauth.php:117
-#: ../../extend/addon/addon/statusnet/statusnet.php:892
-#: ../../extend/addon/addon/twitter/twitter.php:776
-msgid "Consumer Secret"
+#: ../../Zotlabs/Module/Directory.php:314 ../../include/markdown.php:560
+#: ../../include/channel.php:1134 ../../include/event.php:52
+#: ../../include/event.php:84
+msgid "Location:"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Oauth.php:92
-#: ../../Zotlabs/Module/Settings/Oauth.php:118
-msgid "Redirect"
+#: ../../Zotlabs/Module/Directory.php:320
+msgid "Description:"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Oauth.php:92
-msgid ""
-"Redirect URI - leave blank unless your application specifically requires this"
+#: ../../Zotlabs/Module/Directory.php:325 ../../include/channel.php:1309
+msgid "Hometown:"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Oauth.php:93
-#: ../../Zotlabs/Module/Settings/Oauth.php:119
-msgid "Icon url"
+#: ../../Zotlabs/Module/Directory.php:327 ../../include/channel.php:1317
+msgid "About:"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Oauth.php:104
-msgid "Application not found."
+#: ../../Zotlabs/Module/Directory.php:328 ../../Zotlabs/Module/Suggest.php:54
+#: ../../Zotlabs/Widget/Follow.php:32 ../../Zotlabs/Widget/Suggestions.php:44
+#: ../../include/conversation.php:1002 ../../include/channel.php:1119
+#: ../../include/connections.php:110
+msgid "Connect"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Oauth.php:147
-msgid "Connected Apps"
+#: ../../Zotlabs/Module/Directory.php:329
+msgid "Public Forum:"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Oauth.php:151
-msgid "Client key starts with"
+#: ../../Zotlabs/Module/Directory.php:332
+msgid "Keywords: "
msgstr ""
-#: ../../Zotlabs/Module/Settings/Oauth.php:152
-msgid "No name"
+#: ../../Zotlabs/Module/Directory.php:335
+msgid "Don't suggest"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Oauth.php:153
-msgid "Remove authorization"
+#: ../../Zotlabs/Module/Directory.php:337
+msgid "Common connections:"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Account.php:20
-msgid "Not valid email."
+#: ../../Zotlabs/Module/Directory.php:386
+msgid "Global Directory"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Account.php:23
-msgid "Protected email address. Cannot change to that email."
+#: ../../Zotlabs/Module/Directory.php:386
+msgid "Local Directory"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Account.php:32
-msgid "System failure storing new email. Please try again."
+#: ../../Zotlabs/Module/Directory.php:392
+msgid "Finding:"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Account.php:40
-msgid "Technical skill level updated"
+#: ../../Zotlabs/Module/Directory.php:395 ../../Zotlabs/Module/Suggest.php:62
+#: ../../include/contact_widgets.php:24
+msgid "Channel Suggestions"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Account.php:56
-msgid "Password verification failed."
+#: ../../Zotlabs/Module/Directory.php:397
+msgid "next page"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Account.php:63
-msgid "Passwords do not match. Password unchanged."
+#: ../../Zotlabs/Module/Directory.php:397
+msgid "previous page"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Account.php:67
-msgid "Empty passwords are not allowed. Password unchanged."
+#: ../../Zotlabs/Module/Directory.php:398
+msgid "Sort options"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Account.php:81
-msgid "Password changed."
+#: ../../Zotlabs/Module/Directory.php:399
+msgid "Alphabetic"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Account.php:83
-msgid "Password update failed. Please try again."
+#: ../../Zotlabs/Module/Directory.php:400
+msgid "Reverse Alphabetic"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Account.php:112
-msgid "Account Settings"
+#: ../../Zotlabs/Module/Directory.php:401
+msgid "Newest to Oldest"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Account.php:113
-msgid "Current Password"
+#: ../../Zotlabs/Module/Directory.php:402
+msgid "Oldest to Newest"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Account.php:114
-msgid "Enter New Password"
+#: ../../Zotlabs/Module/Directory.php:419
+msgid "No entries (some entries may be hidden)."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Account.php:115
-msgid "Confirm New Password"
+#: ../../Zotlabs/Module/Xchan.php:10
+msgid "Xchan Lookup"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Account.php:115
-msgid "Leave password fields blank unless changing"
+#: ../../Zotlabs/Module/Xchan.php:13
+msgid "Lookup xchan beginning with (or webbie): "
msgstr ""
-#: ../../Zotlabs/Module/Settings/Account.php:116
-msgid "Your technical skill level"
+#: ../../Zotlabs/Module/Suggest.php:37
+msgid ""
+"No suggestions available. If this is a new site, please try again in 24 "
+"hours."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Account.php:116
-msgid "Used to provide a member experience matched to your comfort level"
+#: ../../Zotlabs/Module/Suggest.php:56 ../../Zotlabs/Widget/Suggestions.php:46
+msgid "Ignore/Hide"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Account.php:119
-#: ../../Zotlabs/Module/Settings/Channel.php:483
-msgid "Email Address:"
+#: ../../Zotlabs/Module/Oexchange.php:27
+msgid "Unable to find your hub."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Account.php:121
-msgid "Remove this account including all its channels"
+#: ../../Zotlabs/Module/Oexchange.php:41
+msgid "Post successful."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Tokens.php:31
-#, php-format
-msgid "This channel is limited to %d tokens"
+#: ../../Zotlabs/Module/Mail.php:65
+msgid "Unable to lookup recipient."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Tokens.php:37
-msgid "Name and Password are required."
+#: ../../Zotlabs/Module/Mail.php:72
+msgid "Unable to communicate with requested channel."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Tokens.php:77
-msgid "Token saved."
+#: ../../Zotlabs/Module/Mail.php:79
+msgid "Cannot verify requested channel."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Tokens.php:113
-msgid ""
-"Use this form to create temporary access identifiers to share things with "
-"non-members. These identities may be used in Access Control Lists and "
-"visitors may login using these credentials to access private content."
+#: ../../Zotlabs/Module/Mail.php:97
+msgid "Selected channel has private message restrictions. Send failed."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Tokens.php:115
-msgid ""
-"You may also provide <em>dropbox</em> style access links to friends and "
-"associates by adding the Login Password to any specific site URL as shown. "
-"Examples:"
+#: ../../Zotlabs/Module/Mail.php:178
+msgid "Messages"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Tokens.php:150 ../../include/widgets.php:658
-msgid "Guest Access Tokens"
+#: ../../Zotlabs/Module/Mail.php:191
+msgid "message"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Tokens.php:157
-msgid "Login Name"
+#: ../../Zotlabs/Module/Mail.php:232
+msgid "Message recalled."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Tokens.php:158
-msgid "Login Password"
+#: ../../Zotlabs/Module/Mail.php:245
+msgid "Conversation removed."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Tokens.php:159
-msgid "Expires (yyyy-mm-dd)"
+#: ../../Zotlabs/Module/Mail.php:260 ../../Zotlabs/Module/Mail.php:381
+msgid "Expires YYYY-MM-DD HH:MM"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Featured.php:20
-msgid "Affinity Slider settings updated."
+#: ../../Zotlabs/Module/Mail.php:288
+msgid "Requested channel is not in this network"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Featured.php:34
-msgid "No feature settings configured"
+#: ../../Zotlabs/Module/Mail.php:296
+msgid "Send Private Message"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Featured.php:41
-msgid "Default maximum affinity level"
+#: ../../Zotlabs/Module/Mail.php:297 ../../Zotlabs/Module/Mail.php:439
+msgid "To:"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Featured.php:46
-msgid "Default minimum affinity level"
+#: ../../Zotlabs/Module/Mail.php:300 ../../Zotlabs/Module/Mail.php:441
+msgid "Subject:"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Featured.php:50
-msgid "Affinity Slider Settings"
+#: ../../Zotlabs/Module/Mail.php:305 ../../Zotlabs/Module/Mail.php:447
+#: ../../include/conversation.php:1323
+msgid "Attach file"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Featured.php:60
-msgid "Feature/Addon Settings"
+#: ../../Zotlabs/Module/Mail.php:307
+msgid "Send"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:251
-#: ../../extend/addon/addon/logrot/logrot.php:54
-#: ../../extend/addon/addon/msgfooter/msgfooter.php:54
-#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:184
-#: ../../extend/addon/addon/piwik/piwik.php:116
-#: ../../extend/addon/addon/twitter/twitter.php:766
-#: ../../extend/addon/addon/xmpp/xmpp.php:102
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:82
-msgid "Settings updated."
+#: ../../Zotlabs/Module/Mail.php:310 ../../Zotlabs/Module/Mail.php:452
+#: ../../include/conversation.php:1368
+msgid "Set expiration date"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:312
-msgid "Nobody except yourself"
+#: ../../Zotlabs/Module/Mail.php:411
+msgid "Delete message"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:313
-msgid "Only those you specifically allow"
+#: ../../Zotlabs/Module/Mail.php:412
+msgid "Delivery report"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:314
-msgid "Approved connections"
+#: ../../Zotlabs/Module/Mail.php:413
+msgid "Recall message"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:315
-msgid "Any connections"
+#: ../../Zotlabs/Module/Mail.php:415
+msgid "Message has been recalled."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:316
-msgid "Anybody on this website"
+#: ../../Zotlabs/Module/Mail.php:432
+msgid "Delete Conversation"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:317
-msgid "Anybody in this network"
+#: ../../Zotlabs/Module/Mail.php:434
+msgid ""
+"No secure communications available. You <strong>may</strong> be able to "
+"respond from the sender's profile page."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:318
-msgid "Anybody authenticated"
+#: ../../Zotlabs/Module/Mail.php:438
+msgid "Send Reply"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:319
-msgid "Anybody on the internet"
+#: ../../Zotlabs/Module/Mail.php:443
+#, php-format
+msgid "Your message for %s (%s):"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:395
-msgid "Publish your default profile in the network directory"
+#: ../../Zotlabs/Module/Pubsites.php:24 ../../Zotlabs/Widget/Pubsites.php:12
+msgid "Public Hubs"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:400
-msgid "Allow us to suggest you as a potential friend to new members?"
+#: ../../Zotlabs/Module/Pubsites.php:27
+msgid ""
+"The listed hubs allow public registration for the $Projectname network. All "
+"hubs in the network are interlinked so membership on any of them conveys "
+"membership in the network as a whole. Some hubs may require subscription or "
+"provide tiered service plans. The hub itself <strong>may</strong> provide "
+"additional details."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:409
-msgid "Your channel address is"
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Hub URL"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:412
-msgid "Your files/photos are accessible via WebDAV at"
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Access Type"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:474
-msgid "Channel Settings"
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Registration Policy"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:481
-msgid "Basic Settings"
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Stats"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:482
-#: ../../include/channel.php:1255
-msgid "Full Name:"
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Software"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:484
-msgid "Your Timezone:"
+#: ../../Zotlabs/Module/Pubsites.php:48
+msgid "Rate"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:485
-msgid "Default Post Location:"
+#: ../../Zotlabs/Module/Impel.php:41 ../../include/bbcode.php:203
+msgid "webpage"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:485
-msgid "Geographical location to display on your posts"
+#: ../../Zotlabs/Module/Impel.php:46 ../../include/bbcode.php:209
+msgid "block"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:486
-msgid "Use Browser Location:"
+#: ../../Zotlabs/Module/Impel.php:51 ../../include/bbcode.php:206
+msgid "layout"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:488
-msgid "Adult Content"
+#: ../../Zotlabs/Module/Impel.php:58 ../../include/bbcode.php:212
+msgid "menu"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:488
-msgid ""
-"This channel frequently or regularly publishes adult content. (Please tag "
-"any adult material and/or nudity with #NSFW)"
+#: ../../Zotlabs/Module/Impel.php:181
+#, php-format
+msgid "%s element installed"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:490
-msgid "Security and Privacy Settings"
+#: ../../Zotlabs/Module/Impel.php:184
+#, php-format
+msgid "%s element installation failed"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:493
-msgid "Your permissions are already configured. Click to view/adjust"
+#: ../../Zotlabs/Module/Rbmark.php:94
+msgid "Select a bookmark folder"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:495
-msgid "Hide my online presence"
+#: ../../Zotlabs/Module/Rbmark.php:99
+msgid "Save Bookmark"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:495
-msgid "Prevents displaying in your profile that you are online"
+#: ../../Zotlabs/Module/Rbmark.php:100
+msgid "URL of bookmark"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:497
-msgid "Simple Privacy Settings:"
+#: ../../Zotlabs/Module/Rbmark.php:105
+msgid "Or enter new bookmark folder name"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:498
+#: ../../Zotlabs/Module/Filer.php:52
+msgid "Enter a folder name"
+msgstr ""
+
+#: ../../Zotlabs/Module/Filer.php:52
+msgid "or select an existing folder (doubleclick)"
+msgstr ""
+
+#: ../../Zotlabs/Module/Filer.php:54 ../../Zotlabs/Lib/ThreadItem.php:137
+msgid "Save to Folder"
+msgstr ""
+
+#: ../../Zotlabs/Module/Probe.php:28 ../../Zotlabs/Module/Probe.php:32
+#, php-format
+msgid "Fetching URL returns error: %1$s"
+msgstr ""
+
+#: ../../Zotlabs/Module/Register.php:49
+msgid "Maximum daily site registrations exceeded. Please try again tomorrow."
+msgstr ""
+
+#: ../../Zotlabs/Module/Register.php:55
msgid ""
-"Very Public - <em>extremely permissive (should be used with caution)</em>"
+"Please indicate acceptance of the Terms of Service. Registration failed."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:499
+#: ../../Zotlabs/Module/Register.php:89
+msgid "Passwords do not match."
+msgstr ""
+
+#: ../../Zotlabs/Module/Register.php:131
msgid ""
-"Typical - <em>default public, privacy when desired (similar to social "
-"network permissions but with improved privacy)</em>"
+"Registration successful. Please check your email for validation instructions."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:500
-msgid "Private - <em>default private, never open or public</em>"
+#: ../../Zotlabs/Module/Register.php:137
+msgid "Your registration is pending approval by the site owner."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:501
-msgid "Blocked - <em>default blocked to/from everybody</em>"
+#: ../../Zotlabs/Module/Register.php:140
+msgid "Your registration can not be processed."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:503
-msgid "Allow others to tag your posts"
+#: ../../Zotlabs/Module/Register.php:184
+msgid "Registration on this hub is disabled."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:503
-msgid ""
-"Often used by the community to retro-actively flag inappropriate content"
+#: ../../Zotlabs/Module/Register.php:193
+msgid "Registration on this hub is by approval only."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:505
-msgid "Channel Permission Limits"
+#: ../../Zotlabs/Module/Register.php:194
+msgid "<a href=\"pubsites\">Register at another affiliated hub.</a>"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:507
-msgid "Expire other channel content after this many days"
+#: ../../Zotlabs/Module/Register.php:204
+msgid ""
+"This site has exceeded the number of allowed daily account registrations. "
+"Please try again tomorrow."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:507
-msgid "0 or blank to use the website limit."
+#: ../../Zotlabs/Module/Register.php:227
+#, php-format
+msgid "I accept the %s for this website"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:507
+#: ../../Zotlabs/Module/Register.php:229
#, php-format
-msgid "This website expires after %d days."
+msgid "I am over 13 years of age and accept the %s for this website"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:507
-msgid "This website does not expire imported content."
+#: ../../Zotlabs/Module/Register.php:233
+msgid "Your email address"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:507
-msgid "The website limit takes precedence if lower than your limit."
+#: ../../Zotlabs/Module/Register.php:234
+msgid "Choose a password"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:508
-msgid "Maximum Friend Requests/Day:"
+#: ../../Zotlabs/Module/Register.php:235
+msgid "Please re-enter your password"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:508
-msgid "May reduce spam activity"
+#: ../../Zotlabs/Module/Register.php:236
+msgid "Please enter your invitation code"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:509
-msgid "Default Access Control List (ACL)"
+#: ../../Zotlabs/Module/Register.php:241
+msgid "no"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:511
-msgid "Use my default audience setting for the type of object published"
+#: ../../Zotlabs/Module/Register.php:241
+msgid "yes"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:518
-msgid "Channel permissions category:"
+#: ../../Zotlabs/Module/Register.php:258
+msgid "Membership on this site is by invitation only."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:519
-msgid "Default Permissions Group"
+#: ../../Zotlabs/Module/Register.php:270 ../../boot.php:1610
+#: ../../include/nav.php:149
+msgid "Register"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:525
-msgid "Maximum private messages per day from unknown people:"
+#: ../../Zotlabs/Module/Register.php:271
+msgid ""
+"This site may require email verification after submitting this form. If you "
+"are returned to a login page, please check your email for instructions."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:525
-msgid "Useful to reduce spamming"
+#: ../../Zotlabs/Module/Cover_photo.php:136
+#: ../../Zotlabs/Module/Cover_photo.php:186
+msgid "Cover Photos"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:528
-msgid "Notification Settings"
+#: ../../Zotlabs/Module/Cover_photo.php:237 ../../include/items.php:4303
+msgid "female"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:529
-msgid "By default post a status message when:"
+#: ../../Zotlabs/Module/Cover_photo.php:238 ../../include/items.php:4304
+#, php-format
+msgid "%1$s updated her %2$s"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:530
-msgid "accepting a friend request"
+#: ../../Zotlabs/Module/Cover_photo.php:239 ../../include/items.php:4305
+msgid "male"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:531
-msgid "joining a forum/community"
+#: ../../Zotlabs/Module/Cover_photo.php:240 ../../include/items.php:4306
+#, php-format
+msgid "%1$s updated his %2$s"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:532
-msgid "making an <em>interesting</em> profile change"
+#: ../../Zotlabs/Module/Cover_photo.php:242 ../../include/items.php:4308
+#, php-format
+msgid "%1$s updated their %2$s"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:533
-msgid "Send a notification email when:"
+#: ../../Zotlabs/Module/Cover_photo.php:244 ../../include/channel.php:1759
+msgid "cover photo"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:534
-msgid "You receive a connection request"
+#: ../../Zotlabs/Module/Cover_photo.php:360
+msgid "Upload Cover Photo"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:535
-msgid "Your connections are confirmed"
+#: ../../Zotlabs/Module/Help.php:23
+msgid "Documentation Search"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:536
-msgid "Someone writes on your profile wall"
+#: ../../Zotlabs/Module/Help.php:80 ../../include/conversation.php:1773
+#: ../../include/nav.php:382
+msgid "About"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:537
-msgid "Someone writes a followup comment"
+#: ../../Zotlabs/Module/Help.php:82
+msgid "Administrators"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:538
-msgid "You receive a private message"
+#: ../../Zotlabs/Module/Help.php:83
+msgid "Developers"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:539
-msgid "You receive a friend suggestion"
+#: ../../Zotlabs/Module/Help.php:84
+msgid "Tutorials"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:540
-msgid "You are tagged in a post"
+#: ../../Zotlabs/Module/Help.php:93
+msgid "$Projectname Documentation"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:541
-msgid "You are poked/prodded/etc. in a post"
+#: ../../Zotlabs/Module/Help.php:94
+msgid "Contents"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:543
-msgid "Someone likes your post/comment"
+#: ../../Zotlabs/Module/Tagrm.php:48 ../../Zotlabs/Module/Tagrm.php:98
+msgid "Tag removed"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:546
-msgid "Show visual notifications including:"
+#: ../../Zotlabs/Module/Tagrm.php:123
+msgid "Remove Item Tag"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:548
-msgid "Unseen grid activity"
+#: ../../Zotlabs/Module/Tagrm.php:125
+msgid "Select a tag to remove: "
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:549
-msgid "Unseen channel activity"
+#: ../../Zotlabs/Module/Network.php:96
+msgid "No such group"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:550
-msgid "Unseen private messages"
+#: ../../Zotlabs/Module/Network.php:136
+msgid "No such channel"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:550
-#: ../../Zotlabs/Module/Settings/Channel.php:555
-#: ../../Zotlabs/Module/Settings/Channel.php:556
-#: ../../Zotlabs/Module/Settings/Channel.php:557
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:343
-msgid "Recommended"
+#: ../../Zotlabs/Module/Network.php:141
+msgid "forum"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:551
-msgid "Upcoming events"
+#: ../../Zotlabs/Module/Network.php:153
+msgid "Search Results For:"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:552
-msgid "Events today"
+#: ../../Zotlabs/Module/Network.php:221
+msgid "Privacy group is empty"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:553
-msgid "Upcoming birthdays"
+#: ../../Zotlabs/Module/Network.php:230
+msgid "Privacy group: "
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:553
-msgid "Not available in all themes"
+#: ../../Zotlabs/Module/Network.php:256
+msgid "Invalid connection."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:554
-msgid "System (personal) notifications"
+#: ../../Zotlabs/Module/Network.php:275 ../../addon/redred/redred.php:65
+msgid "Invalid channel."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:555
-msgid "System info messages"
+#: ../../Zotlabs/Module/Acl.php:344
+msgid "network"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:556
-msgid "System critical alerts"
+#: ../../Zotlabs/Module/Acl.php:354
+msgid "RSS"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:557
-msgid "New connections"
+#: ../../Zotlabs/Module/Home.php:74 ../../Zotlabs/Module/Home.php:82
+#: ../../addon/opensearch/opensearch.php:42
+msgid "$Projectname"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:558
-msgid "System Registrations"
+#: ../../Zotlabs/Module/Home.php:92
+#, php-format
+msgid "Welcome to %s"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:559
-msgid ""
-"Also show new wall posts, private messages and connections under Notices"
+#: ../../Zotlabs/Module/Filestorage.php:87
+msgid "Permission Denied."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:561
-msgid "Notify me of events this many days in advance"
+#: ../../Zotlabs/Module/Filestorage.php:103
+msgid "File not found."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:561
-msgid "Must be greater than 0"
+#: ../../Zotlabs/Module/Filestorage.php:146
+msgid "Edit file permissions"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:567
-msgid "Advanced Account/Page Type Settings"
+#: ../../Zotlabs/Module/Filestorage.php:159
+msgid "Set/edit permissions"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:568
-msgid "Change the behaviour of this account for special situations"
+#: ../../Zotlabs/Module/Filestorage.php:160
+msgid "Include all files and sub folders"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:570
-msgid "Miscellaneous Settings"
+#: ../../Zotlabs/Module/Filestorage.php:161
+msgid "Return to file list"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:571
-msgid "Default photo upload folder"
+#: ../../Zotlabs/Module/Filestorage.php:163
+msgid "Copy/paste this code to attach file to a post"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:571
-#: ../../Zotlabs/Module/Settings/Channel.php:572
-msgid "%Y - current year, %m - current month"
+#: ../../Zotlabs/Module/Filestorage.php:164
+msgid "Copy/paste this URL to link file from a web page"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:572
-msgid "Default file upload folder"
+#: ../../Zotlabs/Module/Filestorage.php:166
+msgid "Share this file"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:574
-msgid "Personal menu to display in your channel pages"
+#: ../../Zotlabs/Module/Filestorage.php:167
+msgid "Show URL to this file"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:576
-msgid "Remove this channel."
+#: ../../Zotlabs/Module/Filestorage.php:168
+msgid "Notify your contacts about this file"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:577
-msgid "Firefox Share $Projectname provider"
+#: ../../Zotlabs/Module/Common.php:14
+msgid "No channel."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:578
-msgid "Start calendar week on monday"
+#: ../../Zotlabs/Module/Common.php:43
+msgid "Common connections"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Display.php:137
-msgid "No special theme for mobile devices"
+#: ../../Zotlabs/Module/Common.php:48
+msgid "No connections in common."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Display.php:140
+#: ../../Zotlabs/Module/Viewconnections.php:65
+msgid "No connections."
+msgstr ""
+
+#: ../../Zotlabs/Module/Viewconnections.php:78
#, php-format
-msgid "%s - (Experimental)"
+msgid "Visit %s's profile [%s]"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Display.php:191
-msgid "Display Settings"
+#: ../../Zotlabs/Module/Viewconnections.php:107
+msgid "View Connections"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Display.php:192
-msgid "Theme Settings"
+#: ../../Zotlabs/Module/Admin.php:94
+msgid "# Accounts"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Display.php:193
-msgid "Custom Theme Settings"
+#: ../../Zotlabs/Module/Admin.php:95
+msgid "# blocked accounts"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Display.php:194
-msgid "Content Settings"
+#: ../../Zotlabs/Module/Admin.php:96
+msgid "# expired accounts"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Display.php:200
-msgid "Display Theme:"
+#: ../../Zotlabs/Module/Admin.php:97
+msgid "# expiring accounts"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Display.php:201
-msgid "Select scheme"
+#: ../../Zotlabs/Module/Admin.php:108
+msgid "# Channels"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Display.php:203
-msgid "Mobile Theme:"
+#: ../../Zotlabs/Module/Admin.php:109
+msgid "# primary"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Display.php:204
-msgid "Preload images before rendering the page"
+#: ../../Zotlabs/Module/Admin.php:110
+msgid "# clones"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Display.php:204
-msgid ""
-"The subjective page load time will be longer but the page will be ready when "
-"displayed"
+#: ../../Zotlabs/Module/Admin.php:116
+msgid "Message queues"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Display.php:205
-msgid "Enable user zoom on mobile devices"
+#: ../../Zotlabs/Module/Admin.php:133
+msgid "Your software should be updated"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Display.php:206
-msgid "Update browser every xx seconds"
+#: ../../Zotlabs/Module/Admin.php:138
+msgid "Summary"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Display.php:206
-msgid "Minimum of 10 seconds, no maximum"
+#: ../../Zotlabs/Module/Admin.php:141
+msgid "Registered accounts"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Display.php:207
-msgid "Maximum number of conversations to load at any time:"
+#: ../../Zotlabs/Module/Admin.php:142
+msgid "Pending registrations"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Display.php:207
-msgid "Maximum of 100 items"
+#: ../../Zotlabs/Module/Admin.php:143
+msgid "Registered channels"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Display.php:208
-msgid "Show emoticons (smilies) as images"
+#: ../../Zotlabs/Module/Admin.php:144
+msgid "Active plugins"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Display.php:209
-msgid "Manual conversation updates"
+#: ../../Zotlabs/Module/Admin.php:145
+msgid "Version"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Display.php:209
-msgid "Default is on, turning this off may increase screen jumping"
+#: ../../Zotlabs/Module/Admin.php:146
+msgid "Repository version (master)"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Display.php:210
-msgid "Link post titles to source"
+#: ../../Zotlabs/Module/Admin.php:147
+msgid "Repository version (dev)"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Display.php:211
-msgid "System Page Layout Editor - (advanced)"
+#: ../../Zotlabs/Module/Service_limits.php:23
+msgid "No service class restrictions found."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Display.php:214
-msgid "Use blog/list mode on channel page"
+#: ../../Zotlabs/Module/Rate.php:156
+msgid "Website:"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Display.php:214
-#: ../../Zotlabs/Module/Settings/Display.php:215
-msgid "(comments displayed separately)"
+#: ../../Zotlabs/Module/Rate.php:159
+#, php-format
+msgid "Remote Channel [%s] (not yet known on this site)"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Display.php:215
-msgid "Use blog/list mode on grid page"
+#: ../../Zotlabs/Module/Rate.php:160
+msgid "Rating (this information is public)"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Display.php:216
-msgid "Channel page max height of content (in pixels)"
+#: ../../Zotlabs/Module/Rate.php:161
+msgid "Optionally explain your rating (this information is public)"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Display.php:216
-#: ../../Zotlabs/Module/Settings/Display.php:217
-msgid "click to expand content exceeding this height"
+#: ../../Zotlabs/Module/Lostpass.php:19
+msgid "No valid account found."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Display.php:217
-msgid "Grid page max height of content (in pixels)"
+#: ../../Zotlabs/Module/Lostpass.php:33
+msgid "Password reset request issued. Check your email."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Permcats.php:37
-msgid "Permission category saved."
+#: ../../Zotlabs/Module/Lostpass.php:39 ../../Zotlabs/Module/Lostpass.php:108
+#, php-format
+msgid "Site Member (%s)"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Permcats.php:63
+#: ../../Zotlabs/Module/Lostpass.php:44 ../../Zotlabs/Module/Lostpass.php:49
+#, php-format
+msgid "Password reset requested at %s"
+msgstr ""
+
+#: ../../Zotlabs/Module/Lostpass.php:68
msgid ""
-"Use this form to create permission rules for various classes of people or "
-"connections."
+"Request could not be verified. (You may have previously submitted it.) "
+"Password reset failed."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Permcats.php:96
-msgid "Permission Categories"
+#: ../../Zotlabs/Module/Lostpass.php:91 ../../boot.php:1637
+msgid "Password Reset"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Permcats.php:104
-msgid "Permission Name"
+#: ../../Zotlabs/Module/Lostpass.php:92
+msgid "Your password has been reset as requested."
msgstr ""
-#: ../../Zotlabs/Module/Tagrm.php:48 ../../Zotlabs/Module/Tagrm.php:98
-msgid "Tag removed"
+#: ../../Zotlabs/Module/Lostpass.php:93
+msgid "Your new password is"
msgstr ""
-#: ../../Zotlabs/Module/Tagrm.php:123
-msgid "Remove Item Tag"
+#: ../../Zotlabs/Module/Lostpass.php:94
+msgid "Save or copy your new password - and then"
msgstr ""
-#: ../../Zotlabs/Module/Tagrm.php:125
-msgid "Select a tag to remove: "
+#: ../../Zotlabs/Module/Lostpass.php:95
+msgid "click here to login"
msgstr ""
-#: ../../Zotlabs/Module/Thing.php:114
-msgid "Thing updated"
+#: ../../Zotlabs/Module/Lostpass.php:96
+msgid ""
+"Your password may be changed from the <em>Settings</em> page after "
+"successful login."
msgstr ""
-#: ../../Zotlabs/Module/Thing.php:166
-msgid "Object store: failed"
+#: ../../Zotlabs/Module/Lostpass.php:117
+#, php-format
+msgid "Your password has changed at %s"
msgstr ""
-#: ../../Zotlabs/Module/Thing.php:170
-msgid "Thing added"
+#: ../../Zotlabs/Module/Lostpass.php:130
+msgid "Forgot your Password?"
msgstr ""
-#: ../../Zotlabs/Module/Thing.php:196
-#, php-format
-msgid "OBJ: %1$s %2$s %3$s"
+#: ../../Zotlabs/Module/Lostpass.php:131
+msgid ""
+"Enter your email address and submit to have your password reset. Then check "
+"your email for further instructions."
msgstr ""
-#: ../../Zotlabs/Module/Thing.php:259
-msgid "Show Thing"
+#: ../../Zotlabs/Module/Lostpass.php:132
+msgid "Email Address"
msgstr ""
-#: ../../Zotlabs/Module/Thing.php:266
-msgid "item not found."
+#: ../../Zotlabs/Module/Lostpass.php:133
+msgid "Reset"
msgstr ""
-#: ../../Zotlabs/Module/Thing.php:299
-msgid "Edit Thing"
+#: ../../Zotlabs/Module/Notifications.php:43 ../../include/nav.php:190
+msgid "Mark all system notifications seen"
msgstr ""
-#: ../../Zotlabs/Module/Thing.php:301 ../../Zotlabs/Module/Thing.php:355
-msgid "Select a profile"
+#: ../../Zotlabs/Lib/Apps.php:212
+msgid "Site Admin"
msgstr ""
-#: ../../Zotlabs/Module/Thing.php:305 ../../Zotlabs/Module/Thing.php:358
-msgid "Post an activity"
+#: ../../Zotlabs/Lib/Apps.php:213 ../../addon/buglink/buglink.php:16
+msgid "Report Bug"
msgstr ""
-#: ../../Zotlabs/Module/Thing.php:305 ../../Zotlabs/Module/Thing.php:358
-msgid "Only sends to viewers of the applicable profile"
+#: ../../Zotlabs/Lib/Apps.php:214
+msgid "View Bookmarks"
msgstr ""
-#: ../../Zotlabs/Module/Thing.php:307 ../../Zotlabs/Module/Thing.php:360
-msgid "Name of thing e.g. something"
+#: ../../Zotlabs/Lib/Apps.php:215
+msgid "My Chatrooms"
msgstr ""
-#: ../../Zotlabs/Module/Thing.php:309 ../../Zotlabs/Module/Thing.php:361
-msgid "URL of thing (optional)"
+#: ../../Zotlabs/Lib/Apps.php:217
+msgid "Firefox Share"
msgstr ""
-#: ../../Zotlabs/Module/Thing.php:311 ../../Zotlabs/Module/Thing.php:362
-msgid "URL for photo of thing (optional)"
+#: ../../Zotlabs/Lib/Apps.php:218
+msgid "Remote Diagnostics"
msgstr ""
-#: ../../Zotlabs/Module/Thing.php:353
-msgid "Add Thing to your Profile"
+#: ../../Zotlabs/Lib/Apps.php:219 ../../include/features.php:337
+msgid "Suggest Channels"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:65
-msgid "Unable to lookup recipient."
+#: ../../Zotlabs/Lib/Apps.php:220 ../../boot.php:1629 ../../include/nav.php:117
+msgid "Login"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:72
-msgid "Unable to communicate with requested channel."
+#: ../../Zotlabs/Lib/Apps.php:222
+msgid "Activity"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:79
-msgid "Cannot verify requested channel."
+#: ../../Zotlabs/Lib/Apps.php:226 ../../include/conversation.php:1857
+#: ../../include/features.php:99 ../../include/nav.php:465
+msgid "Wiki"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:97
-msgid "Selected channel has private message restrictions. Send failed."
+#: ../../Zotlabs/Lib/Apps.php:227 ../../include/nav.php:180
+msgid "Channel Home"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:178
-msgid "Messages"
+#: ../../Zotlabs/Lib/Apps.php:230 ../../include/conversation.php:1802
+#: ../../include/conversation.php:1805 ../../include/nav.php:200
+#: ../../include/nav.php:411 ../../include/nav.php:414
+msgid "Events"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:213
-msgid "Message recalled."
+#: ../../Zotlabs/Lib/Apps.php:231
+msgid "Directory"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:226
-msgid "Conversation removed."
+#: ../../Zotlabs/Lib/Apps.php:233 ../../include/nav.php:192
+msgid "Mail"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:240 ../../Zotlabs/Module/Mail.php:349
-#: ../../Zotlabs/Module/Chat.php:205 ../../include/conversation.php:1330
-msgid "Please enter a link URL:"
+#: ../../Zotlabs/Lib/Apps.php:236
+msgid "Chat"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:241 ../../Zotlabs/Module/Mail.php:350
-msgid "Expires YYYY-MM-DD HH:MM"
+#: ../../Zotlabs/Lib/Apps.php:238
+msgid "Probe"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:269
-msgid "Requested channel is not in this network"
+#: ../../Zotlabs/Lib/Apps.php:239
+msgid "Suggest"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:277
-msgid "Send Private Message"
+#: ../../Zotlabs/Lib/Apps.php:240
+msgid "Random Channel"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:278 ../../Zotlabs/Module/Mail.php:403
-msgid "To:"
+#: ../../Zotlabs/Lib/Apps.php:241
+msgid "Invite"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:281 ../../Zotlabs/Module/Mail.php:405
-msgid "Subject:"
+#: ../../Zotlabs/Lib/Apps.php:242 ../../Zotlabs/Widget/Admin.php:26
+msgid "Features"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:286 ../../Zotlabs/Module/Mail.php:411
-#: ../../include/conversation.php:1390
-msgid "Attach file"
+#: ../../Zotlabs/Lib/Apps.php:243 ../../addon/openid/MysqlProvider.php:69
+msgid "Language"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:288
-msgid "Send"
+#: ../../Zotlabs/Lib/Apps.php:244
+msgid "Post"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:291 ../../Zotlabs/Module/Mail.php:416
-#: ../../include/conversation.php:1435
-msgid "Set expiration date"
+#: ../../Zotlabs/Lib/Apps.php:245 ../../addon/openid/MysqlProvider.php:58
+#: ../../addon/openid/MysqlProvider.php:59
+#: ../../addon/openid/MysqlProvider.php:60
+msgid "Profile Photo"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:293 ../../Zotlabs/Module/Mail.php:418
-#: ../../Zotlabs/Module/Chat.php:206 ../../Zotlabs/Lib/ThreadItem.php:743
-#: ../../include/conversation.php:1440
-msgid "Encrypt text"
+#: ../../Zotlabs/Lib/Apps.php:365
+msgid "Purchase"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:375
-msgid "Delete message"
+#: ../../Zotlabs/Lib/Apps.php:369
+msgid "Undelete"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:376
-msgid "Delivery report"
+#: ../../Zotlabs/Lib/Apps.php:374
+msgid "Add to app-tray"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:377
-msgid "Recall message"
+#: ../../Zotlabs/Lib/Apps.php:375
+msgid "Remove from app-tray"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:379
-msgid "Message has been recalled."
+#: ../../Zotlabs/Lib/Permcat.php:58
+msgctxt "permcat"
+msgid "default"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:396
-msgid "Delete Conversation"
+#: ../../Zotlabs/Lib/Permcat.php:96
+msgctxt "permcat"
+msgid "follower"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:398
-msgid ""
-"No secure communications available. You <strong>may</strong> be able to "
-"respond from the sender's profile page."
+#: ../../Zotlabs/Lib/Permcat.php:100
+msgctxt "permcat"
+msgid "contributor"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:402
-msgid "Send Reply"
+#: ../../Zotlabs/Lib/Permcat.php:104
+msgctxt "permcat"
+msgid "publisher"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:407
-#, php-format
-msgid "Your message for %s (%s):"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:42
+#: ../../Zotlabs/Lib/NativeWikiPage.php:83
+msgid "(No Title)"
msgstr ""
-#: ../../Zotlabs/Module/Viewconnections.php:65
-msgid "No connections."
+#: ../../Zotlabs/Lib/NativeWikiPage.php:97
+msgid "Wiki page create failed."
msgstr ""
-#: ../../Zotlabs/Module/Viewconnections.php:78
-#, php-format
-msgid "Visit %s's profile [%s]"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:110
+msgid "Wiki not found."
msgstr ""
-#: ../../Zotlabs/Module/Viewconnections.php:107
-msgid "View Connections"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:121
+msgid "Destination name already exists"
msgstr ""
-#: ../../Zotlabs/Module/Viewsrc.php:44
-msgid "Source of Item"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:147
+#: ../../Zotlabs/Lib/NativeWikiPage.php:342
+msgid "Page not found"
msgstr ""
-#: ../../Zotlabs/Module/Chat.php:181
-msgid "Room not found"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:177
+msgid "Error reading page content"
msgstr ""
-#: ../../Zotlabs/Module/Chat.php:197
-msgid "Leave Room"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:333
+#: ../../Zotlabs/Lib/NativeWikiPage.php:381
+#: ../../Zotlabs/Lib/NativeWikiPage.php:448
+#: ../../Zotlabs/Lib/NativeWikiPage.php:489
+msgid "Error reading wiki"
msgstr ""
-#: ../../Zotlabs/Module/Chat.php:198
-msgid "Delete Room"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:369
+msgid "Page update failed."
msgstr ""
-#: ../../Zotlabs/Module/Chat.php:199
-msgid "I am away right now"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:403
+msgid "Nothing deleted"
msgstr ""
-#: ../../Zotlabs/Module/Chat.php:200
-msgid "I am online"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:469
+msgid "Compare: object not found."
msgstr ""
-#: ../../Zotlabs/Module/Chat.php:202
-msgid "Bookmark this room"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:475
+msgid "Page updated"
msgstr ""
-#: ../../Zotlabs/Module/Chat.php:231
-msgid "New Chatroom"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:478
+msgid "Untitled"
msgstr ""
-#: ../../Zotlabs/Module/Chat.php:232
-msgid "Chatroom name"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:484
+msgid "Wiki resource_id required for git commit"
msgstr ""
-#: ../../Zotlabs/Module/Chat.php:233
-msgid "Expiration of chats (minutes)"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:540
+#: ../../Zotlabs/Widget/Wiki_page_history.php:23
+msgctxt "wiki_history"
+msgid "Message"
+msgstr ""
+
+#: ../../Zotlabs/Lib/NativeWikiPage.php:578
+#: ../../addon/gitwiki/gitwiki_backend.php:579 ../../include/bbcode.php:610
+#: ../../include/bbcode.php:756
+msgid "Different viewers will see this text differently"
+msgstr ""
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:34
+#: ../../include/acl_selectors.php:128
+msgid "Visible to your default audience"
+msgstr ""
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:107
+#: ../../include/acl_selectors.php:201
+msgid "Only me"
msgstr ""
-#: ../../Zotlabs/Module/Chat.php:249
+#: ../../Zotlabs/Lib/PermissionDescription.php:108
+msgid "Public"
+msgstr ""
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:109
+msgid "Anybody in the $Projectname network"
+msgstr ""
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:110
#, php-format
-msgid "%1$s's Chatrooms"
+msgid "Any account on %s"
msgstr ""
-#: ../../Zotlabs/Module/Chat.php:254
-msgid "No chatrooms available"
+#: ../../Zotlabs/Lib/PermissionDescription.php:111
+msgid "Any of my connections"
msgstr ""
-#: ../../Zotlabs/Module/Chat.php:258
-msgid "Expiration"
+#: ../../Zotlabs/Lib/PermissionDescription.php:112
+msgid "Only connections I specifically allow"
msgstr ""
-#: ../../Zotlabs/Module/Chat.php:259
-msgid "min"
+#: ../../Zotlabs/Lib/PermissionDescription.php:113
+msgid "Anybody authenticated (could include visitors from other networks)"
msgstr ""
-#: ../../Zotlabs/Module/Xchan.php:10
-msgid "Xchan Lookup"
+#: ../../Zotlabs/Lib/PermissionDescription.php:114
+msgid "Any connections including those who haven't yet been approved"
msgstr ""
-#: ../../Zotlabs/Module/Xchan.php:13
-msgid "Lookup xchan beginning with (or webbie): "
+#: ../../Zotlabs/Lib/PermissionDescription.php:150
+msgid ""
+"This is your default setting for the audience of your normal stream, and "
+"posts."
+msgstr ""
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:151
+msgid ""
+"This is your default setting for who can view your default channel profile"
+msgstr ""
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:152
+msgid "This is your default setting for who can view your connections"
+msgstr ""
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:153
+msgid ""
+"This is your default setting for who can view your file storage and photos"
+msgstr ""
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:154
+msgid "This is your default setting for the audience of your webpages"
msgstr ""
#: ../../Zotlabs/Lib/Chatroom.php:27
@@ -7205,22 +7297,21 @@ msgstr ""
msgid "Room is full"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:60 ../../include/network.php:1924
+#: ../../Zotlabs/Lib/Enotify.php:60 ../../include/network.php:1977
msgid "$Projectname Notification"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:61 ../../extend/addon/addon/diaspora/p.php:46
-#: ../../extend/addon/addon/diaspora/util.php:218
-#: ../../extend/addon/addon/diaspora/util.php:231
-#: ../../include/network.php:1925
+#: ../../Zotlabs/Lib/Enotify.php:61 ../../addon/diaspora/util.php:218
+#: ../../addon/diaspora/util.php:231 ../../addon/diaspora/p.php:46
+#: ../../include/network.php:1978
msgid "$projectname"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:63 ../../include/network.php:1927
+#: ../../Zotlabs/Lib/Enotify.php:63 ../../include/network.php:1980
msgid "Thank You,"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:65 ../../include/network.php:1929
+#: ../../Zotlabs/Lib/Enotify.php:65 ../../include/network.php:1982
#, php-format
msgid "%s Administrator"
msgstr ""
@@ -7414,205 +7505,152 @@ msgstr ""
msgid "Please visit %s to approve or reject the suggestion."
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:619
+#: ../../Zotlabs/Lib/Enotify.php:620
msgid "[$Projectname:Notify]"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:779
+#: ../../Zotlabs/Lib/Enotify.php:780
msgid "created a new post"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:780
+#: ../../Zotlabs/Lib/Enotify.php:781
#, php-format
msgid "commented on %s's post"
msgstr ""
-#: ../../Zotlabs/Lib/PermissionDescription.php:34
-#: ../../include/acl_selectors.php:128
-msgid "Visible to your default audience"
-msgstr ""
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:107
-#: ../../include/acl_selectors.php:201
-msgid "Only me"
-msgstr ""
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:108
-msgid "Public"
-msgstr ""
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:109
-msgid "Anybody in the $Projectname network"
+#: ../../Zotlabs/Lib/NativeWiki.php:128
+msgid "Wiki files deleted successfully"
msgstr ""
-#: ../../Zotlabs/Lib/PermissionDescription.php:110
+#: ../../Zotlabs/Lib/DB_Upgrade.php:93
#, php-format
-msgid "Any account on %s"
-msgstr ""
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:111
-msgid "Any of my connections"
-msgstr ""
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:112
-msgid "Only connections I specifically allow"
-msgstr ""
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:113
-msgid "Anybody authenticated (could include visitors from other networks)"
-msgstr ""
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:114
-msgid "Any connections including those who haven't yet been approved"
-msgstr ""
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:150
-msgid ""
-"This is your default setting for the audience of your normal stream, and "
-"posts."
-msgstr ""
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:151
-msgid ""
-"This is your default setting for who can view your default channel profile"
-msgstr ""
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:152
-msgid "This is your default setting for who can view your connections"
-msgstr ""
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:153
-msgid ""
-"This is your default setting for who can view your file storage and photos"
+msgid "Update Error at %s"
msgstr ""
-#: ../../Zotlabs/Lib/PermissionDescription.php:154
-msgid "This is your default setting for the audience of your webpages"
+#: ../../Zotlabs/Lib/DB_Upgrade.php:99
+#, php-format
+msgid "Update %s failed. See error logs."
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:95 ../../include/conversation.php:663
+#: ../../Zotlabs/Lib/ThreadItem.php:96 ../../include/conversation.php:661
msgid "Private Message"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:132 ../../include/conversation.php:655
+#: ../../Zotlabs/Lib/ThreadItem.php:133 ../../include/conversation.php:653
msgid "Select"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:136
-msgid "Save to Folder"
-msgstr ""
-
-#: ../../Zotlabs/Lib/ThreadItem.php:157
+#: ../../Zotlabs/Lib/ThreadItem.php:158
msgid "I will attend"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:157
+#: ../../Zotlabs/Lib/ThreadItem.php:158
msgid "I will not attend"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:157
+#: ../../Zotlabs/Lib/ThreadItem.php:158
msgid "I might attend"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:167
+#: ../../Zotlabs/Lib/ThreadItem.php:168
msgid "I agree"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:167
+#: ../../Zotlabs/Lib/ThreadItem.php:168
msgid "I disagree"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:167
+#: ../../Zotlabs/Lib/ThreadItem.php:168
msgid "I abstain"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:223
+#: ../../Zotlabs/Lib/ThreadItem.php:224
msgid "Add Star"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:224
+#: ../../Zotlabs/Lib/ThreadItem.php:225
msgid "Remove Star"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:225
+#: ../../Zotlabs/Lib/ThreadItem.php:226
msgid "Toggle Star Status"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:229
+#: ../../Zotlabs/Lib/ThreadItem.php:230
msgid "starred"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:239 ../../include/conversation.php:670
+#: ../../Zotlabs/Lib/ThreadItem.php:240 ../../include/conversation.php:668
msgid "Message signature validated"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:240 ../../include/conversation.php:671
+#: ../../Zotlabs/Lib/ThreadItem.php:241 ../../include/conversation.php:669
msgid "Message signature incorrect"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:248
+#: ../../Zotlabs/Lib/ThreadItem.php:249
msgid "Add Tag"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:268 ../../include/taxonomy.php:316
+#: ../../Zotlabs/Lib/ThreadItem.php:269 ../../include/taxonomy.php:316
msgid "like"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:269 ../../include/taxonomy.php:317
+#: ../../Zotlabs/Lib/ThreadItem.php:270 ../../include/taxonomy.php:317
msgid "dislike"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:273
+#: ../../Zotlabs/Lib/ThreadItem.php:274
msgid "Share This"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:273
+#: ../../Zotlabs/Lib/ThreadItem.php:274
msgid "share"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:282
+#: ../../Zotlabs/Lib/ThreadItem.php:283
msgid "Delivery Report"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:300
+#: ../../Zotlabs/Lib/ThreadItem.php:301
#, php-format
msgid "%d comment"
msgid_plural "%d comments"
msgstr[0] ""
msgstr[1] ""
-#: ../../Zotlabs/Lib/ThreadItem.php:329 ../../Zotlabs/Lib/ThreadItem.php:330
+#: ../../Zotlabs/Lib/ThreadItem.php:330 ../../Zotlabs/Lib/ThreadItem.php:331
#, php-format
msgid "View %s's profile - %s"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:333
+#: ../../Zotlabs/Lib/ThreadItem.php:334
msgid "to"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:334
+#: ../../Zotlabs/Lib/ThreadItem.php:335
msgid "via"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:335
+#: ../../Zotlabs/Lib/ThreadItem.php:336
msgid "Wall-to-Wall"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:336
+#: ../../Zotlabs/Lib/ThreadItem.php:337
msgid "via Wall-To-Wall:"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:350 ../../include/conversation.php:717
+#: ../../Zotlabs/Lib/ThreadItem.php:350 ../../include/conversation.php:718
#, php-format
msgid "from %s"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:353 ../../include/conversation.php:720
+#: ../../Zotlabs/Lib/ThreadItem.php:353 ../../include/conversation.php:721
#, php-format
msgid "last edited: %s"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:354 ../../include/conversation.php:721
+#: ../../Zotlabs/Lib/ThreadItem.php:354 ../../include/conversation.php:722
#, php-format
msgid "Expires: %s"
msgstr ""
@@ -7633,3389 +7671,3075 @@ msgstr ""
msgid "Voting Options"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:383
-#: ../../extend/addon/addon/bookmarker/bookmarker.php:38
+#: ../../Zotlabs/Lib/ThreadItem.php:384
+#: ../../addon/bookmarker/bookmarker.php:38
msgid "Save Bookmarks"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:384
+#: ../../Zotlabs/Lib/ThreadItem.php:385
msgid "Add to Calendar"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:393
+#: ../../Zotlabs/Lib/ThreadItem.php:394
msgid "Mark all seen"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:442 ../../include/js_strings.php:7
+#: ../../Zotlabs/Lib/ThreadItem.php:443 ../../include/js_strings.php:7
#, php-format
msgid "%s show all"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:732 ../../include/conversation.php:1385
+#: ../../Zotlabs/Lib/ThreadItem.php:733 ../../include/conversation.php:1318
msgid "Bold"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:733 ../../include/conversation.php:1386
+#: ../../Zotlabs/Lib/ThreadItem.php:734 ../../include/conversation.php:1319
msgid "Italic"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:734 ../../include/conversation.php:1387
+#: ../../Zotlabs/Lib/ThreadItem.php:735 ../../include/conversation.php:1320
msgid "Underline"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:735 ../../include/conversation.php:1388
+#: ../../Zotlabs/Lib/ThreadItem.php:736 ../../include/conversation.php:1321
msgid "Quote"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:736 ../../include/conversation.php:1389
+#: ../../Zotlabs/Lib/ThreadItem.php:737 ../../include/conversation.php:1322
msgid "Code"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:737
+#: ../../Zotlabs/Lib/ThreadItem.php:738
msgid "Image"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:738
+#: ../../Zotlabs/Lib/ThreadItem.php:739
msgid "Insert Link"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:739
+#: ../../Zotlabs/Lib/ThreadItem.php:740
msgid "Video"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:212
-msgid "Site Admin"
-msgstr ""
-
-#: ../../Zotlabs/Lib/Apps.php:213
-#: ../../extend/addon/addon/buglink/buglink.php:16
-msgid "Report Bug"
-msgstr ""
-
-#: ../../Zotlabs/Lib/Apps.php:214
-msgid "View Bookmarks"
-msgstr ""
-
-#: ../../Zotlabs/Lib/Apps.php:215
-msgid "My Chatrooms"
-msgstr ""
-
-#: ../../Zotlabs/Lib/Apps.php:217
-msgid "Firefox Share"
-msgstr ""
-
-#: ../../Zotlabs/Lib/Apps.php:218
-msgid "Remote Diagnostics"
+#: ../../Zotlabs/Zot/Auth.php:138
+msgid ""
+"Remote authentication blocked. You are logged into this site locally. Please "
+"logout and retry."
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:219 ../../include/features.php:337
-msgid "Suggest Channels"
+#: ../../Zotlabs/Zot/Auth.php:250 ../../addon/openid/Mod_Openid.php:76
+#: ../../addon/openid/Mod_Openid.php:178
+#, php-format
+msgid "Welcome %s. Remote authentication successful."
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:220 ../../include/nav.php:130
-#: ../../boot.php:1732
-msgid "Login"
+#: ../../Zotlabs/Storage/Browser.php:106 ../../Zotlabs/Storage/Browser.php:237
+msgid "parent"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:222 ../../include/nav.php:194
-msgid "Grid"
+#: ../../Zotlabs/Storage/Browser.php:130 ../../include/text.php:2679
+msgid "Collection"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:226 ../../include/conversation.php:1903
-#: ../../include/features.php:99
-msgid "Wiki"
+#: ../../Zotlabs/Storage/Browser.php:133
+msgid "Principal"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:227 ../../include/nav.php:198
-msgid "Channel Home"
+#: ../../Zotlabs/Storage/Browser.php:136
+msgid "Addressbook"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:230 ../../include/conversation.php:1853
-#: ../../include/conversation.php:1856 ../../include/nav.php:218
-msgid "Events"
+#: ../../Zotlabs/Storage/Browser.php:139
+msgid "Calendar"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:231 ../../include/nav.php:182
-msgid "Directory"
+#: ../../Zotlabs/Storage/Browser.php:142
+msgid "Schedule Inbox"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:233 ../../include/nav.php:210
-msgid "Mail"
+#: ../../Zotlabs/Storage/Browser.php:145
+msgid "Schedule Outbox"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:236
-msgid "Chat"
+#: ../../Zotlabs/Storage/Browser.php:225
+msgid "Total"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:238
-msgid "Probe"
+#: ../../Zotlabs/Storage/Browser.php:227
+msgid "Shared"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:239
-msgid "Suggest"
+#: ../../Zotlabs/Storage/Browser.php:301
+#, php-format
+msgid "You are using %1$s of your available file storage."
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:240
-msgid "Random Channel"
+#: ../../Zotlabs/Storage/Browser.php:306
+#, php-format
+msgid "You are using %1$s of %2$s available file storage. (%3$s&#37;)"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:241
-msgid "Invite"
+#: ../../Zotlabs/Storage/Browser.php:317
+msgid "WARNING:"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:242 ../../include/widgets.php:1595
-msgid "Features"
+#: ../../Zotlabs/Storage/Browser.php:327
+msgid ""
+"Please use DAV to upload large (video, audio) files.<br>See <a class=\"zrl\" "
+"href=\"help/member/member_guide#Cloud_Desktop_Clients\">Cloud Desktop "
+"Clients</a>"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:243
-#: ../../extend/addon/addon/openid/MysqlProvider.php:69
-msgid "Language"
+#: ../../Zotlabs/Storage/Browser.php:331
+msgid "Create new folder"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:244
-msgid "Post"
+#: ../../Zotlabs/Storage/Browser.php:333
+msgid "Upload file"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:245
-#: ../../extend/addon/addon/openid/MysqlProvider.php:58
-#: ../../extend/addon/addon/openid/MysqlProvider.php:59
-#: ../../extend/addon/addon/openid/MysqlProvider.php:60
-msgid "Profile Photo"
+#: ../../Zotlabs/Storage/Browser.php:347
+msgid "Drop files here to immediately upload"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:355
-msgid "Purchase"
+#: ../../Zotlabs/Widget/Forums.php:85
+msgid "Forums"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:359
-msgid "Undelete"
+#: ../../Zotlabs/Widget/Appcategories.php:39
+#: ../../Zotlabs/Widget/Tagcloud.php:25 ../../include/contact_widgets.php:91
+#: ../../include/taxonomy.php:188 ../../include/taxonomy.php:270
+msgid "Categories"
msgstr ""
-#: ../../Zotlabs/Lib/NativeWiki.php:126
-msgid "Wiki files deleted successfully"
+#: ../../Zotlabs/Widget/Appcategories.php:42 ../../Zotlabs/Widget/Filer.php:31
+#: ../../include/contact_widgets.php:56 ../../include/contact_widgets.php:94
+msgid "Everything"
msgstr ""
-#: ../../Zotlabs/Lib/Permcat.php:58
-msgctxt "permcat"
-msgid "default"
+#: ../../Zotlabs/Widget/Eventstools.php:13
+msgid "Events Tools"
msgstr ""
-#: ../../Zotlabs/Lib/Permcat.php:96
-msgctxt "permcat"
-msgid "follower"
+#: ../../Zotlabs/Widget/Eventstools.php:14
+msgid "Export Calendar"
msgstr ""
-#: ../../Zotlabs/Lib/Permcat.php:100
-msgctxt "permcat"
-msgid "contributor"
+#: ../../Zotlabs/Widget/Eventstools.php:15
+msgid "Import Calendar"
msgstr ""
-#: ../../Zotlabs/Lib/Permcat.php:104
-msgctxt "permcat"
-msgid "publisher"
+#: ../../Zotlabs/Widget/Suggestedchats.php:32
+msgid "Suggested Chatrooms"
msgstr ""
-#: ../../Zotlabs/Lib/NativeWikiPage.php:31
-#: ../../Zotlabs/Lib/NativeWikiPage.php:62
-msgid "(No Title)"
+#: ../../Zotlabs/Widget/Mailmenu.php:13
+msgid "Private Mail Menu"
msgstr ""
-#: ../../Zotlabs/Lib/NativeWikiPage.php:76
-msgid "Wiki page create failed."
+#: ../../Zotlabs/Widget/Mailmenu.php:15
+msgid "Combined View"
msgstr ""
-#: ../../Zotlabs/Lib/NativeWikiPage.php:89
-msgid "Wiki not found."
+#: ../../Zotlabs/Widget/Mailmenu.php:20 ../../include/nav.php:195
+msgid "Inbox"
msgstr ""
-#: ../../Zotlabs/Lib/NativeWikiPage.php:100
-msgid "Destination name already exists"
+#: ../../Zotlabs/Widget/Mailmenu.php:25 ../../include/nav.php:196
+msgid "Outbox"
msgstr ""
-#: ../../Zotlabs/Lib/NativeWikiPage.php:126
-#: ../../Zotlabs/Lib/NativeWikiPage.php:345
-msgid "Page not found"
+#: ../../Zotlabs/Widget/Mailmenu.php:30 ../../include/nav.php:197
+msgid "New Message"
msgstr ""
-#: ../../Zotlabs/Lib/NativeWikiPage.php:156
-msgid "Error reading page content"
+#: ../../Zotlabs/Widget/Chatroom_list.php:16
+#: ../../include/conversation.php:1816 ../../include/conversation.php:1819
+#: ../../include/nav.php:425 ../../include/nav.php:428
+msgid "Chatrooms"
msgstr ""
-#: ../../Zotlabs/Lib/NativeWikiPage.php:338
-#: ../../Zotlabs/Lib/NativeWikiPage.php:383
-#: ../../Zotlabs/Lib/NativeWikiPage.php:450
-#: ../../Zotlabs/Lib/NativeWikiPage.php:491
-msgid "Error reading wiki"
+#: ../../Zotlabs/Widget/Chatroom_list.php:20
+msgid "Overview"
msgstr ""
-#: ../../Zotlabs/Lib/NativeWikiPage.php:371
-msgid "Page update failed."
+#: ../../Zotlabs/Widget/Rating.php:51
+msgid "Rating Tools"
msgstr ""
-#: ../../Zotlabs/Lib/NativeWikiPage.php:405
-msgid "Nothing deleted"
+#: ../../Zotlabs/Widget/Rating.php:55 ../../Zotlabs/Widget/Rating.php:57
+msgid "Rate Me"
msgstr ""
-#: ../../Zotlabs/Lib/NativeWikiPage.php:471
-msgid "Compare: object not found."
+#: ../../Zotlabs/Widget/Rating.php:60
+msgid "View Ratings"
msgstr ""
-#: ../../Zotlabs/Lib/NativeWikiPage.php:477
-msgid "Page updated"
+#: ../../Zotlabs/Widget/Activity.php:50
+msgctxt "widget"
+msgid "Activity"
msgstr ""
-#: ../../Zotlabs/Lib/NativeWikiPage.php:480
-msgid "Untitled"
+#: ../../Zotlabs/Widget/Follow.php:22
+#, php-format
+msgid "You have %1$.0f of %2$.0f allowed connections."
msgstr ""
-#: ../../Zotlabs/Lib/NativeWikiPage.php:486
-msgid "Wiki resource_id required for git commit"
+#: ../../Zotlabs/Widget/Follow.php:29
+msgid "Add New Connection"
msgstr ""
-#: ../../Zotlabs/Lib/NativeWikiPage.php:557
-#: ../../extend/addon/addon/gitwiki/gitwiki_backend.php:579
-#: ../../include/bbcode.php:610 ../../include/bbcode.php:756
-msgid "Different viewers will see this text differently"
+#: ../../Zotlabs/Widget/Follow.php:30
+msgid "Enter channel address"
msgstr ""
-#: ../../extend/addon/addon/adultphotoflag/adultphotoflag.php:24
-msgid "Flag Adult Photos"
+#: ../../Zotlabs/Widget/Follow.php:31
+msgid "Examples: bob@example.com, https://example.com/barbara"
msgstr ""
-#: ../../extend/addon/addon/adultphotoflag/adultphotoflag.php:25
-msgid ""
-"Provide photo edit option to hide inappropriate photos from default album "
-"view"
+#: ../../Zotlabs/Widget/Wiki_list.php:15 ../../addon/gitwiki/gitwiki.php:95
+msgid "Wiki List"
msgstr ""
-#: ../../extend/addon/addon/chords/Mod_Chords.php:44
-msgid ""
-"This is a fairly comprehensive and complete guitar chord dictionary which "
-"will list most of the available ways to play a certain chord, starting from "
-"the base of the fingerboard up to a few frets beyond the twelfth fret "
-"(beyond which everything repeats). A couple of non-standard tunings are "
-"provided for the benefit of slide players, etc."
+#: ../../Zotlabs/Widget/Archive.php:43
+msgid "Archives"
msgstr ""
-#: ../../extend/addon/addon/chords/Mod_Chords.php:46
-msgid ""
-"Chord names start with a root note (A-G) and may include sharps (#) and "
-"flats (b). This software will parse most of the standard naming conventions "
-"such as maj, min, dim, sus(2 or 4), aug, with optional repeating elements."
+#: ../../Zotlabs/Widget/Conversations.php:17
+#: ../../Zotlabs/Widget/Conversations.php:29
+msgid "Conversations"
msgstr ""
-#: ../../extend/addon/addon/chords/Mod_Chords.php:48
-msgid ""
-"Valid examples include A, A7, Am7, Amaj7, Amaj9, Ammaj7, Aadd4, Asus2Add4, "
-"E7b13b11 ..."
+#: ../../Zotlabs/Widget/Conversations.php:21
+msgid "Received Messages"
msgstr ""
-#: ../../extend/addon/addon/chords/Mod_Chords.php:51
-msgid "Guitar Chords"
+#: ../../Zotlabs/Widget/Conversations.php:25
+msgid "Sent Messages"
msgstr ""
-#: ../../extend/addon/addon/chords/Mod_Chords.php:52
-msgid "The complete online chord dictionary"
+#: ../../Zotlabs/Widget/Conversations.php:39
+msgid "No messages."
msgstr ""
-#: ../../extend/addon/addon/chords/Mod_Chords.php:57
-msgid "Tuning"
+#: ../../Zotlabs/Widget/Conversations.php:57
+msgid "Delete conversation"
msgstr ""
-#: ../../extend/addon/addon/chords/Mod_Chords.php:58
-msgid "Chord name: example: Em7"
+#: ../../Zotlabs/Widget/Chatroom_members.php:11
+msgid "Chat Members"
msgstr ""
-#: ../../extend/addon/addon/chords/Mod_Chords.php:59
-msgid "Show for left handed stringing"
+#: ../../Zotlabs/Widget/Photo.php:48 ../../Zotlabs/Widget/Photo_rand.php:58
+msgid "photo/image"
msgstr ""
-#: ../../extend/addon/addon/chords/chords.php:33
-msgid "Quick Reference"
+#: ../../Zotlabs/Widget/Savedsearch.php:75
+msgid "Remove term"
msgstr ""
-#: ../../extend/addon/addon/diaspora/import_diaspora.php:16
-msgid "No username found in import file."
+#: ../../Zotlabs/Widget/Savedsearch.php:83 ../../include/features.php:301
+msgid "Saved Searches"
msgstr ""
-#: ../../extend/addon/addon/diaspora/import_diaspora.php:41
-#: ../../include/import.php:51
-msgid "Unable to create a unique channel address. Import failed."
+#: ../../Zotlabs/Widget/Savedsearch.php:84 ../../include/group.php:336
+msgid "add"
msgstr ""
-#: ../../extend/addon/addon/diaspora/diaspora.php:677
-msgid "Diaspora Protocol Settings updated."
+#: ../../Zotlabs/Widget/Notes.php:16
+msgid "Notes"
msgstr ""
-#: ../../extend/addon/addon/diaspora/diaspora.php:696
-msgid "Enable the Diaspora protocol for this channel"
+#: ../../Zotlabs/Widget/Wiki_pages.php:54 ../../addon/gitwiki/gitwiki.php:76
+msgid "Wiki Pages"
msgstr ""
-#: ../../extend/addon/addon/diaspora/diaspora.php:700
-msgid "Allow any Diaspora member to comment on your public posts"
+#: ../../Zotlabs/Widget/Wiki_pages.php:60 ../../addon/gitwiki/gitwiki.php:81
+msgid "Add new page"
msgstr ""
-#: ../../extend/addon/addon/diaspora/diaspora.php:704
-msgid "Prevent your hashtags from being redirected to other sites"
+#: ../../Zotlabs/Widget/Wiki_pages.php:61 ../../addon/gitwiki/gitwiki.php:82
+msgid "Page name"
msgstr ""
-#: ../../extend/addon/addon/diaspora/diaspora.php:709
-msgid "Followed hashtags (comma separated, do not include the #)"
+#: ../../Zotlabs/Widget/Affinity.php:49
+msgid "Refresh"
msgstr ""
-#: ../../extend/addon/addon/diaspora/diaspora.php:714
-msgid "Diaspora Protocol Settings"
+#: ../../Zotlabs/Widget/Tasklist.php:23
+msgid "Tasks"
msgstr ""
-#: ../../extend/addon/addon/dirstats/dirstats.php:94
-msgid "Hubzilla Directory Stats"
+#: ../../Zotlabs/Widget/Suggestions.php:51
+msgid "Suggestions"
msgstr ""
-#: ../../extend/addon/addon/dirstats/dirstats.php:95
-msgid "Total Hubs"
+#: ../../Zotlabs/Widget/Suggestions.php:52
+msgid "See more..."
msgstr ""
-#: ../../extend/addon/addon/dirstats/dirstats.php:97
-msgid "Hubzilla Hubs"
+#: ../../Zotlabs/Widget/Filer.php:28 ../../include/contact_widgets.php:53
+#: ../../include/features.php:390
+msgid "Saved Folders"
msgstr ""
-#: ../../extend/addon/addon/dirstats/dirstats.php:99
-msgid "Friendica Hubs"
+#: ../../Zotlabs/Widget/Cover_photo.php:54
+msgid "Click to show more"
msgstr ""
-#: ../../extend/addon/addon/dirstats/dirstats.php:101
-msgid "Diaspora Pods"
+#: ../../Zotlabs/Widget/Admin.php:23 ../../Zotlabs/Widget/Admin.php:60
+msgid "Member registrations waiting for confirmation"
msgstr ""
-#: ../../extend/addon/addon/dirstats/dirstats.php:103
-msgid "Hubzilla Channels"
+#: ../../Zotlabs/Widget/Admin.php:29
+msgid "Inspect queue"
msgstr ""
-#: ../../extend/addon/addon/dirstats/dirstats.php:105
-msgid "Friendica Channels"
+#: ../../Zotlabs/Widget/Admin.php:31
+msgid "DB updates"
msgstr ""
-#: ../../extend/addon/addon/dirstats/dirstats.php:107
-msgid "Diaspora Channels"
+#: ../../Zotlabs/Widget/Admin.php:55 ../../include/nav.php:215
+msgid "Admin"
msgstr ""
-#: ../../extend/addon/addon/dirstats/dirstats.php:109
-msgid "Aged 35 and above"
+#: ../../Zotlabs/Widget/Admin.php:56
+msgid "Plugin Features"
msgstr ""
-#: ../../extend/addon/addon/dirstats/dirstats.php:111
-msgid "Aged 34 and under"
+#: ../../Zotlabs/Widget/Settings_menu.php:35
+msgid "Account settings"
msgstr ""
-#: ../../extend/addon/addon/dirstats/dirstats.php:113
-msgid "Average Age"
+#: ../../Zotlabs/Widget/Settings_menu.php:41
+msgid "Channel settings"
msgstr ""
-#: ../../extend/addon/addon/dirstats/dirstats.php:115
-msgid "Known Chatrooms"
+#: ../../Zotlabs/Widget/Settings_menu.php:50
+msgid "Additional features"
msgstr ""
-#: ../../extend/addon/addon/dirstats/dirstats.php:117
-msgid "Known Tags"
+#: ../../Zotlabs/Widget/Settings_menu.php:57
+msgid "Feature/Addon settings"
msgstr ""
-#: ../../extend/addon/addon/dirstats/dirstats.php:119
-msgid ""
-"Please note Diaspora and Friendica statistics are merely those **this "
-"directory** is aware of, and not all those known in the network. This also "
-"applies to chatrooms,"
+#: ../../Zotlabs/Widget/Settings_menu.php:63
+msgid "Display settings"
msgstr ""
-#: ../../extend/addon/addon/donate/donate.php:21
-msgid "Project Servers and Resources"
+#: ../../Zotlabs/Widget/Settings_menu.php:70
+msgid "Manage locations"
msgstr ""
-#: ../../extend/addon/addon/donate/donate.php:22
-msgid "Project Creator and Tech Lead"
+#: ../../Zotlabs/Widget/Settings_menu.php:77
+msgid "Export channel"
msgstr ""
-#: ../../extend/addon/addon/donate/donate.php:23
-msgid "Admin, developer, directorymin, support bloke"
+#: ../../Zotlabs/Widget/Settings_menu.php:83
+msgid "Connected apps"
msgstr ""
-#: ../../extend/addon/addon/donate/donate.php:50
-msgid ""
-"And the hundreds of other people and organisations who helped make the "
-"Hubzilla possible."
+#: ../../Zotlabs/Widget/Settings_menu.php:98 ../../include/features.php:153
+msgid "Permission Groups"
msgstr ""
-#: ../../extend/addon/addon/donate/donate.php:53
-msgid ""
-"The Redmatrix/Hubzilla projects are provided primarily by volunteers giving "
-"their time and expertise - and often paying out of pocket for services they "
-"share with others."
+#: ../../Zotlabs/Widget/Settings_menu.php:115
+msgid "Premium Channel Settings"
msgstr ""
-#: ../../extend/addon/addon/donate/donate.php:54
-msgid ""
-"There is no corporate funding and no ads, and we do not collect and sell "
-"your personal information. (We don't control your personal information - "
-"<strong>you do</strong>.)"
+#: ../../Zotlabs/Widget/Bookmarkedchats.php:24
+msgid "Bookmarked Chatrooms"
msgstr ""
-#: ../../extend/addon/addon/donate/donate.php:55
-msgid ""
-"Help support our ground-breaking work in decentralisation, web identity, and "
-"privacy."
+#: ../../util/nconfig.php:34
+msgid "Source channel not found."
msgstr ""
-#: ../../extend/addon/addon/donate/donate.php:57
-msgid ""
-"Your donations keep servers and services running and also helps us to "
-"provide innovative new features and continued development."
+#: ../../boot.php:1162 ../../addon/opensearch/opensearch.php:26
+#, php-format
+msgctxt "opensearch"
+msgid "Search %1$s (%2$s)"
msgstr ""
-#: ../../extend/addon/addon/donate/donate.php:60
-msgid "Donate"
+#: ../../boot.php:1162 ../../addon/opensearch/opensearch.php:28
+msgctxt "opensearch"
+msgid "$Projectname"
msgstr ""
-#: ../../extend/addon/addon/donate/donate.php:62
-msgid ""
-"Choose a project, developer, or public hub to support with a one-time "
-"donation"
+#: ../../boot.php:1609
+msgid "Create an account to access services and applications"
msgstr ""
-#: ../../extend/addon/addon/donate/donate.php:63
-msgid "Donate Now"
+#: ../../boot.php:1628 ../../include/nav.php:103 ../../include/nav.php:127
+msgid "Logout"
msgstr ""
-#: ../../extend/addon/addon/donate/donate.php:64
-msgid ""
-"<strong><em>Or</em></strong> become a project sponsor (Hubzilla Project only)"
+#: ../../boot.php:1631
+msgid "Login/Email"
msgstr ""
-#: ../../extend/addon/addon/donate/donate.php:65
-msgid ""
-"Please indicate if you would like your first name or full name (or nothing) "
-"to appear in our sponsor listing"
+#: ../../boot.php:1632
+msgid "Password"
msgstr ""
-#: ../../extend/addon/addon/donate/donate.php:66
-msgid "Sponsor"
+#: ../../boot.php:1633
+msgid "Remember me"
msgstr ""
-#: ../../extend/addon/addon/donate/donate.php:69
-msgid "Special thanks to: "
+#: ../../boot.php:1636
+msgid "Forgot your password?"
msgstr ""
-#: ../../extend/addon/addon/dwpost/dwpost.php:42
-msgid "Post to Dreamwidth"
+#: ../../boot.php:2174
+msgid "toggle mobile"
msgstr ""
-#: ../../extend/addon/addon/dwpost/dwpost.php:73
-msgid "Enable Dreamwidth Post Plugin"
+#: ../../boot.php:2327
+#, php-format
+msgid "[$Projectname] Website SSL error for %s"
msgstr ""
-#: ../../extend/addon/addon/dwpost/dwpost.php:77
-msgid "Dreamwidth username"
+#: ../../boot.php:2332
+msgid "Website SSL certificate is not valid. Please correct."
msgstr ""
-#: ../../extend/addon/addon/dwpost/dwpost.php:81
-msgid "Dreamwidth password"
+#: ../../boot.php:2450
+#, php-format
+msgid "[$Projectname] Cron tasks not running on %s"
msgstr ""
-#: ../../extend/addon/addon/dwpost/dwpost.php:85
-msgid "Post to Dreamwidth by default"
+#: ../../boot.php:2455
+msgid "Cron/Scheduled tasks not running."
msgstr ""
-#: ../../extend/addon/addon/dwpost/dwpost.php:89
-msgid "Dreamwidth Post Settings"
+#: ../../boot.php:2456 ../../include/datetime.php:286
+msgid "never"
msgstr ""
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:45
-msgid "Flattr this!"
+#: ../../view/theme/redbasic/php/config.php:9
+msgid "Focus (Hubzilla default)"
msgstr ""
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:83
-msgid "Flattr widget settings updated."
+#: ../../view/theme/redbasic/php/config.php:88
+msgid "Theme settings"
msgstr ""
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:100
-msgid "Flattr user"
+#: ../../view/theme/redbasic/php/config.php:89
+msgid "Narrow navbar"
msgstr ""
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:104
-msgid "URL of the Thing to flattr"
+#: ../../view/theme/redbasic/php/config.php:90
+msgid "Navigation bar background color"
msgstr ""
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:104
-msgid "If empty channel URL is used"
+#: ../../view/theme/redbasic/php/config.php:91
+msgid "Navigation bar icon color "
msgstr ""
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:108
-msgid "Title of the Thing to flattr"
+#: ../../view/theme/redbasic/php/config.php:92
+msgid "Navigation bar active icon color "
msgstr ""
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:108
-msgid "If empty \"channel name on The Hubzilla\" will be used"
+#: ../../view/theme/redbasic/php/config.php:93
+msgid "Link color"
msgstr ""
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:112
-msgid "Static or dynamic flattr button"
+#: ../../view/theme/redbasic/php/config.php:94
+msgid "Set font-color for banner"
msgstr ""
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:112
-msgid "static"
+#: ../../view/theme/redbasic/php/config.php:95
+msgid "Set the background color"
msgstr ""
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:112
-msgid "dynamic"
+#: ../../view/theme/redbasic/php/config.php:96
+msgid "Set the background image"
msgstr ""
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:116
-msgid "Alignment of the widget"
+#: ../../view/theme/redbasic/php/config.php:97
+msgid "Set the background color of items"
msgstr ""
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:116
-msgid "left"
+#: ../../view/theme/redbasic/php/config.php:98
+msgid "Set the background color of comments"
msgstr ""
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:116
-msgid "right"
+#: ../../view/theme/redbasic/php/config.php:99
+msgid "Set font-size for the entire application"
msgstr ""
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:120
-msgid "Enable Flattr widget"
+#: ../../view/theme/redbasic/php/config.php:99
+msgid "Examples: 1rem, 100%, 16px"
msgstr ""
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:124
-msgid "Flattr Widget Settings"
+#: ../../view/theme/redbasic/php/config.php:100
+msgid "Set font-color for posts and comments"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:118
-msgid "Contact not found."
+#: ../../view/theme/redbasic/php/config.php:101
+msgid "Set radius of corners"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:119
-msgid ""
-"This may occasionally happen if contact was requested by both persons and it "
-"has already been approved."
+#: ../../view/theme/redbasic/php/config.php:101
+msgid "Example: 4px"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:238
-msgid "Response from remote site was not understood."
+#: ../../view/theme/redbasic/php/config.php:102
+msgid "Set shadow depth of photos"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:247
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:252
-msgid "Unexpected response from remote site: "
+#: ../../view/theme/redbasic/php/config.php:103
+msgid "Set maximum width of content region in pixel"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:261
-msgid "Confirmation completed successfully."
+#: ../../view/theme/redbasic/php/config.php:103
+msgid "Leave empty for default width"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:263
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:277
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:284
-msgid "Remote site reported: "
+#: ../../view/theme/redbasic/php/config.php:104
+msgid "Left align page content"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:275
-msgid "Temporary failure. Please wait and try again."
+#: ../../view/theme/redbasic/php/config.php:105
+msgid "Set size of conversation author photo"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:282
-msgid "Introduction failed or was revoked."
+#: ../../view/theme/redbasic/php/config.php:106
+msgid "Set size of followup author photos"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:428
-msgid "Unable to set contact photo."
+#: ../../addon/rendezvous/rendezvous.php:57
+msgid "Errors encountered deleting database table "
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:485
-#, php-format
-msgid "%1$s is now friends with %2$s"
+#: ../../addon/rendezvous/rendezvous.php:95 ../../addon/twitter/twitter.php:773
+msgid "Submit Settings"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:570
-#, php-format
-msgid "No user record found for '%s' "
+#: ../../addon/rendezvous/rendezvous.php:96
+msgid "Drop tables when uninstalling?"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:580
-msgid "Our site encryption key is apparently messed up."
+#: ../../addon/rendezvous/rendezvous.php:96
+msgid ""
+"If checked, the Rendezvous database tables will be deleted when the plugin "
+"is uninstalled."
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:591
-msgid "Empty site URL was provided or URL could not be decrypted by us."
+#: ../../addon/rendezvous/rendezvous.php:97
+msgid "Mapbox Access Token"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:612
-msgid "Contact record was not found for you on our site."
+#: ../../addon/rendezvous/rendezvous.php:97
+msgid ""
+"If you enter a Mapbox access token, it will be used to retrieve map tiles "
+"from Mapbox instead of the default OpenStreetMap tile server."
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:626
-#, php-format
-msgid "Site public key not available in contact record for URL %s."
+#: ../../addon/rendezvous/rendezvous.php:162
+msgid "Rendezvous"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:646
+#: ../../addon/rendezvous/rendezvous.php:167
msgid ""
-"The ID provided by your system is a duplicate on our system. It should work "
-"if you try again."
+"This identity has been deleted by another member due to inactivity. Please "
+"press the \"New identity\" button or refresh the page to register a new "
+"identity. You may use the same name."
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:657
-msgid "Unable to set your contact credentials on our system."
+#: ../../addon/rendezvous/rendezvous.php:168
+msgid "Welcome to Rendezvous!"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:724
-msgid "Unable to update your contact profile details on our system"
+#: ../../addon/rendezvous/rendezvous.php:169
+msgid ""
+"Enter your name to join this rendezvous. To begin sharing your location with "
+"the other members, tap the GPS control. When your location is discovered, a "
+"red dot will appear and others will be able to see you on the map."
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:751
-#: ../../extend/addon/addon/friendica/dfrn_request.php:749
-msgid "[Name Withheld]"
+#: ../../addon/rendezvous/rendezvous.php:171
+msgid "Let's meet here"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:796
-#, php-format
-msgid "%1$s has joined %2$s"
+#: ../../addon/rendezvous/rendezvous.php:174
+msgid "New marker"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_poll.php:103
-#: ../../extend/addon/addon/friendica/dfrn_poll.php:536
-#, php-format
-msgid "%1$s welcomes %2$s"
+#: ../../addon/rendezvous/rendezvous.php:175
+msgid "Edit marker"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:102
-msgid "This introduction has already been accepted."
+#: ../../addon/rendezvous/rendezvous.php:176
+msgid "New identity"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:123
-#: ../../extend/addon/addon/friendica/dfrn_request.php:528
-msgid "Profile location is not valid or does not contain profile information."
+#: ../../addon/rendezvous/rendezvous.php:177
+msgid "Delete marker"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:128
-#: ../../extend/addon/addon/friendica/dfrn_request.php:533
-msgid "Warning: profile location has no identifiable owner name."
+#: ../../addon/rendezvous/rendezvous.php:178
+msgid "Delete member"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:130
-#: ../../extend/addon/addon/friendica/dfrn_request.php:535
-msgid "Warning: profile location has no profile photo."
+#: ../../addon/rendezvous/rendezvous.php:179
+msgid "Edit proximity alert"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:133
-#: ../../extend/addon/addon/friendica/dfrn_request.php:538
-#, php-format
-msgid "%d required parameter was not found at the given location"
-msgid_plural "%d required parameters were not found at the given location"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../../extend/addon/addon/friendica/dfrn_request.php:180
-msgid "Introduction complete."
+#: ../../addon/rendezvous/rendezvous.php:180
+msgid ""
+"A proximity alert will be issued when this member is within a certain radius "
+"of you.<br><br>Enter a radius in meters (0 to disable):"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:224
-msgid "Unrecoverable protocol error."
+#: ../../addon/rendezvous/rendezvous.php:180
+#: ../../addon/rendezvous/rendezvous.php:185
+msgid "distance"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:252
-msgid "Profile unavailable."
+#: ../../addon/rendezvous/rendezvous.php:181
+msgid "Proximity alert distance (meters)"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:277
-#, php-format
-msgid "%s has received too many connection requests today."
+#: ../../addon/rendezvous/rendezvous.php:182
+#: ../../addon/rendezvous/rendezvous.php:184
+msgid ""
+"A proximity alert will be issued when you are within a certain radius of the "
+"marker location.<br><br>Enter a radius in meters (0 to disable):"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:278
-msgid "Spam protection measures have been invoked."
+#: ../../addon/rendezvous/rendezvous.php:183
+msgid "Marker proximity alert"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:279
-msgid "Friends are advised to please try again in 24 hours."
+#: ../../addon/rendezvous/rendezvous.php:186
+msgid "Reminder note"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:341
-msgid "Invalid locator"
+#: ../../addon/rendezvous/rendezvous.php:187
+msgid ""
+"Enter a note to be displayed when you are within the specified proximity..."
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:350
-msgid "Invalid email address."
+#: ../../addon/rendezvous/rendezvous.php:199
+msgid "Add new rendezvous"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:377
-msgid "This account has not been configured for email. Request failed."
+#: ../../addon/rendezvous/rendezvous.php:200
+msgid ""
+"Create a new rendezvous and share the access link with those you wish to "
+"invite to the group. Those who open the link become members of the "
+"rendezvous. They can view other member locations, add markers to the map, or "
+"share their own locations with the group."
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:473
-msgid "Unable to resolve your name at the provided location."
+#: ../../addon/skeleton/skeleton.php:59
+msgid "Some setting"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:486
-msgid "You have already introduced yourself here."
+#: ../../addon/skeleton/skeleton.php:61
+msgid "A setting"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:490
-#, php-format
-msgid "Apparently you are already friends with %s."
+#: ../../addon/skeleton/skeleton.php:64
+msgid "Skeleton Settings"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:511
-msgid "Invalid profile URL."
+#: ../../addon/gnusoc/gnusoc.php:119
+msgid "GNU-Social Protocol Settings updated."
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:517
-msgid "Disallowed profile URL."
+#: ../../addon/gnusoc/gnusoc.php:130
+msgid "Enable the GNU-Social protocol for this channel"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:587
-msgid "Failed to update contact record."
+#: ../../addon/gnusoc/gnusoc.php:134
+msgid "GNU-Social Protocol Settings"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:608
-msgid "Your introduction has been sent."
+#: ../../addon/gnusoc/gnusoc.php:324
+msgid "Follow"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:662
-msgid "Please login to confirm introduction."
+#: ../../addon/gnusoc/gnusoc.php:327
+#, php-format
+msgid "%1$s is now following %2$s"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:676
-msgid ""
-"Incorrect identity currently logged in. Please login to <strong>this</"
-"strong> profile."
+#: ../../addon/cdav/Mod_Cdav.php:744
+msgid "INVALID EVENT DISMISSED!"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:690
-#: ../../extend/addon/addon/friendica/dfrn_request.php:707
-msgid "Confirm"
+#: ../../addon/cdav/Mod_Cdav.php:745
+msgid "Summary: "
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:702
-msgid "Hide this contact"
+#: ../../addon/cdav/Mod_Cdav.php:746
+msgid "Date: "
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:705
-#, php-format
-msgid "Welcome home %s."
+#: ../../addon/cdav/Mod_Cdav.php:747 ../../addon/cdav/Mod_Cdav.php:754
+msgid "Reason: "
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:706
-#, php-format
-msgid "Please confirm your introduction/connection request to %s."
+#: ../../addon/cdav/Mod_Cdav.php:752
+msgid "INVALID CARD DISMISSED!"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:836
-msgid ""
-"Please enter your 'Identity Address' from one of the following supported "
-"communications networks:"
+#: ../../addon/cdav/Mod_Cdav.php:753
+msgid "Name: "
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:857
-#, php-format
+#: ../../addon/cdav/Mod_Cdav.php:770
msgid ""
-"If you are not yet a member of the free social web, <a href=\"%s/siteinfo"
-"\">follow this link to find a public Friendica site and join us today</a>."
+"You have to enable this plugin in Feature/Addon Settings > CalDAV/CardDAV "
+"Settings before you can use it."
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:862
-msgid "Friend/Connection Request"
+#: ../../addon/cdav/Mod_Cdav.php:836 ../../addon/cdav/Mod_Cdav.php:837
+msgid "Example: YYYY-MM-DD HH:mm"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:863
-msgid ""
-"Examples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, "
-"testuser@identi.ca"
+#: ../../addon/cdav/Mod_Cdav.php:837
+msgid "End date and time"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:864
-msgid "Please answer the following:"
+#: ../../addon/cdav/Mod_Cdav.php:852
+msgid "List month"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:865
-#, php-format
-msgid "Does %s know you?"
+#: ../../addon/cdav/Mod_Cdav.php:853
+msgid "List week"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:869
-msgid "Add a personal note:"
+#: ../../addon/cdav/Mod_Cdav.php:854
+msgid "List day"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:871
-#: ../../include/network.php:2242 ../../include/network.php:2243
-msgid "Friendica"
+#: ../../addon/cdav/Mod_Cdav.php:861
+msgid "More"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:872
-msgid "StatusNet/Federated Social Web"
+#: ../../addon/cdav/Mod_Cdav.php:862
+msgid "Less"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:873
-#: ../../include/network.php:2248
-msgid "Diaspora"
+#: ../../addon/cdav/Mod_Cdav.php:863
+msgid "Select calendar"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:874
-#, php-format
-msgid ""
-" - please do not use this form. Instead, enter %s into your Diaspora search "
-"bar."
+#: ../../addon/cdav/Mod_Cdav.php:865
+msgid "Delete all"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:875
-msgid "Your Identity Address:"
+#: ../../addon/cdav/Mod_Cdav.php:867
+msgid "Sorry! Editing of recurrent events is not yet implemented."
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:878
-msgid "Submit Request"
+#: ../../addon/cdav/cdav.php:36
+msgid "Errors encountered creating database table: "
msgstr ""
-#: ../../extend/addon/addon/friendica/friendica.php:113
-#: ../../extend/addon/addon/gnusoc/gnusoc.php:118
-msgid "GNU-Social Protocol Settings updated."
+#: ../../addon/cdav/cdav.php:197
+msgid "Default Calendar"
msgstr ""
-#: ../../extend/addon/addon/friendica/friendica.php:124
-msgid "Enable the (experimental) GNU-Social protocol for this channel"
+#: ../../addon/cdav/cdav.php:206
+msgid "Default Addressbook"
msgstr ""
-#: ../../extend/addon/addon/friendica/friendica.php:128
-#: ../../extend/addon/addon/gnusoc/gnusoc.php:133
-msgid "GNU-Social Protocol Settings"
+#: ../../addon/cdav/cdav.php:215
+msgid "CalDAV/CardDAV Settings saved."
msgstr ""
-#: ../../extend/addon/addon/friendica/friendica.php:185
-#: ../../extend/addon/addon/gnusoc/gnusoc.php:323
-msgid "Follow"
+#: ../../addon/cdav/cdav.php:234
+msgid "Enable CalDAV/CardDAV Server for this channel"
msgstr ""
-#: ../../extend/addon/addon/friendica/friendica.php:188
-#: ../../extend/addon/addon/gnusoc/gnusoc.php:326
+#: ../../addon/cdav/cdav.php:237
#, php-format
-msgid "%1$s is now following %2$s"
-msgstr ""
-
-#: ../../extend/addon/addon/frphotos/frphotos.php:91
-msgid "Friendica Photo Album Import"
-msgstr ""
-
-#: ../../extend/addon/addon/frphotos/frphotos.php:92
-msgid "This will import all your Friendica photo albums to this Red channel."
-msgstr ""
-
-#: ../../extend/addon/addon/frphotos/frphotos.php:93
-msgid "Friendica Server base URL"
-msgstr ""
-
-#: ../../extend/addon/addon/frphotos/frphotos.php:94
-msgid "Friendica Login Username"
-msgstr ""
-
-#: ../../extend/addon/addon/frphotos/frphotos.php:95
-msgid "Friendica Login Password"
-msgstr ""
-
-#: ../../extend/addon/addon/hubwall/hubwall.php:19
-msgid "Send email to all members"
+msgid "Your CalDAV resources are located at %s "
msgstr ""
-#: ../../extend/addon/addon/hubwall/hubwall.php:33
+#: ../../addon/cdav/cdav.php:240
#, php-format
-msgid "$1%s Administrator"
-msgstr ""
-
-#: ../../extend/addon/addon/hubwall/hubwall.php:50
-#: ../../extend/addon/addon/mailtest/mailtest.php:50
-msgid "No recipients found."
+msgid "Your CardDAV resources are located at %s "
msgstr ""
-#: ../../extend/addon/addon/hubwall/hubwall.php:73
-#, php-format
-msgid "%1$d of %2$d messages sent."
+#: ../../addon/cdav/cdav.php:246
+msgid "CalDAV/CardDAV Settings"
msgstr ""
-#: ../../extend/addon/addon/hubwall/hubwall.php:81
-msgid "Send email to all hub members."
+#: ../../addon/cdav/cdav.php:272 ../../include/connections.php:670
+msgid "Home, Voice"
msgstr ""
-#: ../../extend/addon/addon/hubwall/hubwall.php:92
-#: ../../extend/addon/addon/mailtest/mailtest.php:96
-msgid "Message subject"
+#: ../../addon/cdav/cdav.php:273 ../../include/connections.php:671
+msgid "Home, Fax"
msgstr ""
-#: ../../extend/addon/addon/hubwall/hubwall.php:93
-msgid "Sender Email address"
+#: ../../addon/cdav/cdav.php:275 ../../include/connections.php:673
+msgid "Work, Voice"
msgstr ""
-#: ../../extend/addon/addon/hubwall/hubwall.php:94
-msgid "Test mode (only send to hub administrator)"
+#: ../../addon/cdav/cdav.php:276 ../../include/connections.php:674
+msgid "Work, Fax"
msgstr ""
-#: ../../extend/addon/addon/ijpost/ijpost.php:42
-msgid "Post to Insanejournal"
+#: ../../addon/cdav/include/widgets.php:37
+msgid "Select Channel"
msgstr ""
-#: ../../extend/addon/addon/ijpost/ijpost.php:73
-msgid "Enable InsaneJournal Post Plugin"
+#: ../../addon/cdav/include/widgets.php:42
+msgid "Read-write"
msgstr ""
-#: ../../extend/addon/addon/ijpost/ijpost.php:77
-msgid "InsaneJournal username"
+#: ../../addon/cdav/include/widgets.php:43
+msgid "Read-only"
msgstr ""
-#: ../../extend/addon/addon/ijpost/ijpost.php:81
-msgid "InsaneJournal password"
+#: ../../addon/cdav/include/widgets.php:116
+msgid "My Calendars"
msgstr ""
-#: ../../extend/addon/addon/ijpost/ijpost.php:85
-msgid "Post to InsaneJournal by default"
+#: ../../addon/cdav/include/widgets.php:118
+msgid "Shared Calendars"
msgstr ""
-#: ../../extend/addon/addon/ijpost/ijpost.php:89
-msgid "InsaneJournal Post Settings"
+#: ../../addon/cdav/include/widgets.php:122
+msgid "Share this calendar"
msgstr ""
-#: ../../extend/addon/addon/ijpost/ijpost.php:104
-msgid "Insane Journal Settings saved."
+#: ../../addon/cdav/include/widgets.php:124
+msgid "Calendar name and color"
msgstr ""
-#: ../../extend/addon/addon/irc/irc.php:45
-msgid "Channels to auto connect"
+#: ../../addon/cdav/include/widgets.php:126
+msgid "Create new calendar"
msgstr ""
-#: ../../extend/addon/addon/irc/irc.php:45
-#: ../../extend/addon/addon/irc/irc.php:49
-msgid "Comma separated list"
+#: ../../addon/cdav/include/widgets.php:128
+msgid "Calendar Name"
msgstr ""
-#: ../../extend/addon/addon/irc/irc.php:49
-#: ../../extend/addon/addon/irc/irc.php:96
-msgid "Popular Channels"
+#: ../../addon/cdav/include/widgets.php:129
+msgid "Calendar Tools"
msgstr ""
-#: ../../extend/addon/addon/irc/irc.php:53
-msgid "IRC Settings"
+#: ../../addon/cdav/include/widgets.php:130
+msgid "Import calendar"
msgstr ""
-#: ../../extend/addon/addon/irc/irc.php:69
-msgid "IRC settings saved."
+#: ../../addon/cdav/include/widgets.php:131
+msgid "Select a calendar to import to"
msgstr ""
-#: ../../extend/addon/addon/irc/irc.php:74
-msgid "IRC Chatroom"
+#: ../../addon/cdav/include/widgets.php:158
+msgid "Addressbooks"
msgstr ""
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:305
-#: ../../include/channel.php:1139 ../../include/channel.php:1301
-msgid "Status:"
+#: ../../addon/cdav/include/widgets.php:160
+msgid "Addressbook name"
msgstr ""
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:309
-msgid "Activate addon"
+#: ../../addon/cdav/include/widgets.php:162
+msgid "Create new addressbook"
msgstr ""
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:313
-msgid "Hide Jappixmini Chat-Widget from the webinterface"
+#: ../../addon/cdav/include/widgets.php:163
+msgid "Addressbook Name"
msgstr ""
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:318
-msgid "Jabber username"
+#: ../../addon/cdav/include/widgets.php:165
+msgid "Addressbook Tools"
msgstr ""
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:324
-msgid "Jabber server"
+#: ../../addon/cdav/include/widgets.php:166
+msgid "Import addressbook"
msgstr ""
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:330
-msgid "Jabber BOSH host URL"
+#: ../../addon/cdav/include/widgets.php:167
+msgid "Select an addressbook to import to"
msgstr ""
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:337
-msgid "Jabber password"
+#: ../../addon/planets/planets.php:121
+msgid "Planets Settings updated."
msgstr ""
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:343
-msgid "Encrypt Jabber password with Hubzilla password"
+#: ../../addon/planets/planets.php:153
+msgid "Enable Planets Plugin"
msgstr ""
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:347
-#: ../../extend/addon/addon/redred/redred.php:115
-msgid "Hubzilla password"
+#: ../../addon/planets/planets.php:157
+msgid "Planets Settings"
msgstr ""
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:351
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:355
-msgid "Approve subscription requests from Hubzilla contacts automatically"
+#: ../../addon/openclipatar/openclipatar.php:50
+#: ../../addon/openclipatar/openclipatar.php:128
+msgid "System defaults:"
msgstr ""
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:359
-msgid "Purge internal list of jabber addresses of contacts"
+#: ../../addon/openclipatar/openclipatar.php:54
+msgid "Preferred Clipart IDs"
msgstr ""
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:364
-msgid "Configuration Help"
+#: ../../addon/openclipatar/openclipatar.php:54
+msgid "List of preferred clipart ids. These will be shown first."
msgstr ""
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:371
-msgid "Jappix Mini Settings"
+#: ../../addon/openclipatar/openclipatar.php:55
+msgid "Default Search Term"
msgstr ""
-#: ../../extend/addon/addon/js_upload/js_upload.php:44
-msgid "Upload a file"
+#: ../../addon/openclipatar/openclipatar.php:55
+msgid "The default search term. These will be shown second."
msgstr ""
-#: ../../extend/addon/addon/js_upload/js_upload.php:45
-msgid "Drop files here to upload"
+#: ../../addon/openclipatar/openclipatar.php:56
+msgid "Return After"
msgstr ""
-#: ../../extend/addon/addon/js_upload/js_upload.php:47
-msgid "Failed"
+#: ../../addon/openclipatar/openclipatar.php:56
+msgid "Page to load after image selection."
msgstr ""
-#: ../../extend/addon/addon/js_upload/js_upload.php:315
-msgid "No files were uploaded."
+#: ../../addon/openclipatar/openclipatar.php:58 ../../include/channel.php:1048
+#: ../../include/nav.php:111
+msgid "Edit Profile"
msgstr ""
-#: ../../extend/addon/addon/js_upload/js_upload.php:322
-msgid "Uploaded file is empty"
+#: ../../addon/openclipatar/openclipatar.php:59
+msgid "Profile List"
msgstr ""
-#: ../../extend/addon/addon/js_upload/js_upload.php:335
-msgid "Image exceeds size limit of "
+#: ../../addon/openclipatar/openclipatar.php:61
+msgid "Order of Preferred"
msgstr ""
-#: ../../extend/addon/addon/js_upload/js_upload.php:347
-msgid "File has an invalid extension, it should be one of "
+#: ../../addon/openclipatar/openclipatar.php:61
+msgid "Sort order of preferred clipart ids."
msgstr ""
-#: ../../extend/addon/addon/js_upload/js_upload.php:359
-msgid "Upload was cancelled, or server error encountered"
+#: ../../addon/openclipatar/openclipatar.php:62
+#: ../../addon/openclipatar/openclipatar.php:68
+msgid "Newest first"
msgstr ""
-#: ../../extend/addon/addon/ldapauth/ldapauth.php:61
-msgid "An account has been created for you."
+#: ../../addon/openclipatar/openclipatar.php:65
+msgid "As entered"
msgstr ""
-#: ../../extend/addon/addon/ldapauth/ldapauth.php:68
-msgid "Authentication successful but rejected: account creation is disabled."
+#: ../../addon/openclipatar/openclipatar.php:67
+msgid "Order of other"
msgstr ""
-#: ../../extend/addon/addon/libertree/libertree.php:38
-msgid "Post to Libertree"
+#: ../../addon/openclipatar/openclipatar.php:67
+msgid "Sort order of other clipart ids."
msgstr ""
-#: ../../extend/addon/addon/libertree/libertree.php:69
-msgid "Enable Libertree Post Plugin"
+#: ../../addon/openclipatar/openclipatar.php:69
+msgid "Most downloaded first"
msgstr ""
-#: ../../extend/addon/addon/libertree/libertree.php:73
-msgid "Libertree API token"
+#: ../../addon/openclipatar/openclipatar.php:70
+msgid "Most liked first"
msgstr ""
-#: ../../extend/addon/addon/libertree/libertree.php:77
-msgid "Libertree site URL"
+#: ../../addon/openclipatar/openclipatar.php:72
+msgid "Preferred IDs Message"
msgstr ""
-#: ../../extend/addon/addon/libertree/libertree.php:81
-msgid "Post to Libertree by default"
+#: ../../addon/openclipatar/openclipatar.php:72
+msgid "Message to display above preferred results."
msgstr ""
-#: ../../extend/addon/addon/libertree/libertree.php:85
-msgid "Libertree Post Settings"
+#: ../../addon/openclipatar/openclipatar.php:78
+msgid "Uploaded by: "
msgstr ""
-#: ../../extend/addon/addon/libertree/libertree.php:99
-msgid "Libertree Settings saved."
+#: ../../addon/openclipatar/openclipatar.php:78
+msgid "Drawn by: "
msgstr ""
-#: ../../extend/addon/addon/ljpost/ljpost.php:42
-msgid "Post to LiveJournal"
+#: ../../addon/openclipatar/openclipatar.php:192
+msgid "Or select from a free OpenClipart.org image:"
msgstr ""
-#: ../../extend/addon/addon/ljpost/ljpost.php:70
-msgid "Enable LiveJournal Post Plugin"
+#: ../../addon/openclipatar/openclipatar.php:195
+msgid "Search Term"
msgstr ""
-#: ../../extend/addon/addon/ljpost/ljpost.php:74
-msgid "LiveJournal username"
+#: ../../addon/openclipatar/openclipatar.php:232
+msgid "Unknown error. Please try again later."
msgstr ""
-#: ../../extend/addon/addon/ljpost/ljpost.php:78
-msgid "LiveJournal password"
+#: ../../addon/openclipatar/openclipatar.php:308
+msgid "Profile photo updated successfully."
msgstr ""
-#: ../../extend/addon/addon/ljpost/ljpost.php:82
-msgid "Post to LiveJournal by default"
+#: ../../addon/adultphotoflag/adultphotoflag.php:24
+msgid "Flag Adult Photos"
msgstr ""
-#: ../../extend/addon/addon/ljpost/ljpost.php:86
-msgid "LiveJournal Post Settings"
+#: ../../addon/adultphotoflag/adultphotoflag.php:25
+msgid ""
+"Provide photo edit option to hide inappropriate photos from default album "
+"view"
msgstr ""
-#: ../../extend/addon/addon/ljpost/ljpost.php:101
-msgid "LiveJournal Settings saved."
+#: ../../addon/wppost/wppost.php:45
+msgid "Post to WordPress"
msgstr ""
-#: ../../extend/addon/addon/logrot/logrot.php:36
-msgid "Logfile archive directory"
+#: ../../addon/wppost/wppost.php:82
+msgid "Enable WordPress Post Plugin"
msgstr ""
-#: ../../extend/addon/addon/logrot/logrot.php:36
-msgid "Directory to store rotated logs"
+#: ../../addon/wppost/wppost.php:86
+msgid "WordPress username"
msgstr ""
-#: ../../extend/addon/addon/logrot/logrot.php:37
-msgid "Logfile size in bytes before rotating"
+#: ../../addon/wppost/wppost.php:90
+msgid "WordPress password"
msgstr ""
-#: ../../extend/addon/addon/logrot/logrot.php:38
-msgid "Number of logfiles to retain"
+#: ../../addon/wppost/wppost.php:94
+msgid "WordPress API URL"
msgstr ""
-#: ../../extend/addon/addon/mailhost/mailhost.php:36
-msgid "Email notification hub"
+#: ../../addon/wppost/wppost.php:95
+msgid "Typically https://your-blog.tld/xmlrpc.php"
msgstr ""
-#: ../../extend/addon/addon/mailhost/mailhost.php:36
-msgid "Hostname"
+#: ../../addon/wppost/wppost.php:98
+msgid "WordPress blogid"
msgstr ""
-#: ../../extend/addon/addon/mailhost/mailhost.php:40
-msgid "Mailhost Settings"
+#: ../../addon/wppost/wppost.php:99
+msgid "For multi-user sites such as wordpress.com, otherwise leave blank"
msgstr ""
-#: ../../extend/addon/addon/mailhost/mailhost.php:54
-msgid "MAILHOST Settings saved."
+#: ../../addon/wppost/wppost.php:105
+msgid "Post to WordPress by default"
msgstr ""
-#: ../../extend/addon/addon/moremoods/moremoods.php:19
-msgid "lonely"
+#: ../../addon/wppost/wppost.php:109
+msgid "Forward comments (requires hubzilla_wp plugin)"
msgstr ""
-#: ../../extend/addon/addon/moremoods/moremoods.php:20
-msgid "drunk"
+#: ../../addon/wppost/wppost.php:113
+msgid "WordPress Post Settings"
msgstr ""
-#: ../../extend/addon/addon/moremoods/moremoods.php:21
-msgid "horny"
+#: ../../addon/wppost/wppost.php:129
+msgid "Wordpress Settings saved."
msgstr ""
-#: ../../extend/addon/addon/moremoods/moremoods.php:22
-msgid "stoned"
+#: ../../addon/nsfw/nsfw.php:80
+msgid ""
+"This plugin looks in posts for the words/text you specify below, and "
+"collapses any content containing those keywords so it is not displayed at "
+"inappropriate times, such as sexual innuendo that may be improper in a work "
+"setting. It is polite and recommended to tag any content containing nudity "
+"with #NSFW. This filter can also match any other word/text you specify, and "
+"can thereby be used as a general purpose content filter."
msgstr ""
-#: ../../extend/addon/addon/moremoods/moremoods.php:23
-msgid "fucked up"
+#: ../../addon/nsfw/nsfw.php:84
+msgid "Enable Content filter"
msgstr ""
-#: ../../extend/addon/addon/moremoods/moremoods.php:24
-msgid "clusterfucked"
+#: ../../addon/nsfw/nsfw.php:88
+msgid "Comma separated list of keywords to hide"
msgstr ""
-#: ../../extend/addon/addon/moremoods/moremoods.php:25
-msgid "crazy"
+#: ../../addon/nsfw/nsfw.php:88
+msgid "Word, /regular-expression/, lang=xx, lang!=xx"
msgstr ""
-#: ../../extend/addon/addon/moremoods/moremoods.php:26
-msgid "hurt"
+#: ../../addon/nsfw/nsfw.php:92
+msgid "Not Safe For Work Settings"
msgstr ""
-#: ../../extend/addon/addon/moremoods/moremoods.php:27
-msgid "sleepy"
+#: ../../addon/nsfw/nsfw.php:92
+msgid "General Purpose Content Filter"
msgstr ""
-#: ../../extend/addon/addon/moremoods/moremoods.php:28
-msgid "grumpy"
+#: ../../addon/nsfw/nsfw.php:110
+msgid "NSFW Settings saved."
msgstr ""
-#: ../../extend/addon/addon/moremoods/moremoods.php:29
-msgid "high"
+#: ../../addon/nsfw/nsfw.php:207
+msgid "Possible adult content"
msgstr ""
-#: ../../extend/addon/addon/moremoods/moremoods.php:30
-msgid "semi-conscious"
+#: ../../addon/nsfw/nsfw.php:211
+#, php-format
+msgid "%s - view"
msgstr ""
-#: ../../extend/addon/addon/moremoods/moremoods.php:31
-msgid "in love"
+#: ../../addon/ijpost/ijpost.php:42
+msgid "Post to Insanejournal"
msgstr ""
-#: ../../extend/addon/addon/moremoods/moremoods.php:32
-msgid "in lust"
+#: ../../addon/ijpost/ijpost.php:73
+msgid "Enable InsaneJournal Post Plugin"
msgstr ""
-#: ../../extend/addon/addon/moremoods/moremoods.php:33
-msgid "naked"
+#: ../../addon/ijpost/ijpost.php:77
+msgid "InsaneJournal username"
msgstr ""
-#: ../../extend/addon/addon/moremoods/moremoods.php:34
-msgid "stinky"
+#: ../../addon/ijpost/ijpost.php:81
+msgid "InsaneJournal password"
msgstr ""
-#: ../../extend/addon/addon/moremoods/moremoods.php:35
-msgid "sweaty"
+#: ../../addon/ijpost/ijpost.php:85
+msgid "Post to InsaneJournal by default"
msgstr ""
-#: ../../extend/addon/addon/moremoods/moremoods.php:36
-msgid "bleeding out"
+#: ../../addon/ijpost/ijpost.php:89
+msgid "InsaneJournal Post Settings"
msgstr ""
-#: ../../extend/addon/addon/moremoods/moremoods.php:37
-msgid "victorious"
+#: ../../addon/ijpost/ijpost.php:104
+msgid "Insane Journal Settings saved."
msgstr ""
-#: ../../extend/addon/addon/moremoods/moremoods.php:38
-msgid "defeated"
+#: ../../addon/js_upload/js_upload.php:44
+msgid "Upload a file"
msgstr ""
-#: ../../extend/addon/addon/moremoods/moremoods.php:39
-msgid "envious"
+#: ../../addon/js_upload/js_upload.php:45
+msgid "Drop files here to upload"
msgstr ""
-#: ../../extend/addon/addon/moremoods/moremoods.php:40
-msgid "jealous"
+#: ../../addon/js_upload/js_upload.php:47
+msgid "Failed"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:19
-msgid "bitchslap"
+#: ../../addon/js_upload/js_upload.php:315
+msgid "No files were uploaded."
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:19
-msgid "bitchslapped"
+#: ../../addon/js_upload/js_upload.php:322
+msgid "Uploaded file is empty"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:20
-msgid "shag"
+#: ../../addon/js_upload/js_upload.php:335
+msgid "Image exceeds size limit of "
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:20
-msgid "shagged"
+#: ../../addon/js_upload/js_upload.php:347
+msgid "File has an invalid extension, it should be one of "
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:21
-msgid "patent"
+#: ../../addon/js_upload/js_upload.php:359
+msgid "Upload was cancelled, or server error encountered"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:21
-msgid "patented"
+#: ../../addon/dwpost/dwpost.php:42
+msgid "Post to Dreamwidth"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:22
-msgid "hug"
+#: ../../addon/dwpost/dwpost.php:73
+msgid "Enable Dreamwidth Post Plugin"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:22
-msgid "hugged"
+#: ../../addon/dwpost/dwpost.php:77
+msgid "Dreamwidth username"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:23
-msgid "murder"
+#: ../../addon/dwpost/dwpost.php:81
+msgid "Dreamwidth password"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:23
-msgid "murdered"
+#: ../../addon/dwpost/dwpost.php:85
+msgid "Post to Dreamwidth by default"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:24
-msgid "worship"
+#: ../../addon/dwpost/dwpost.php:89
+msgid "Dreamwidth Post Settings"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:24
-msgid "worshipped"
+#: ../../addon/firefox/firefox.php:23
+msgid "Install Firefox Sharing Tools"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:25
-msgid "kiss"
+#: ../../addon/firefox/firefox.php:34
+msgid "Share content from Firefox to $Projectname"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:25
-msgid "kissed"
+#: ../../addon/firefox/firefox.php:37
+msgid "Install Firefox Sharing Tools to this web browser"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:26
-msgid "tempt"
+#: ../../addon/dirstats/dirstats.php:94
+msgid "Hubzilla Directory Stats"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:26
-msgid "tempted"
+#: ../../addon/dirstats/dirstats.php:95
+msgid "Total Hubs"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:27
-msgid "raise eyebrows at"
+#: ../../addon/dirstats/dirstats.php:97
+msgid "Hubzilla Hubs"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:27
-msgid "raised their eyebrows at"
+#: ../../addon/dirstats/dirstats.php:99
+msgid "Friendica Hubs"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:28
-msgid "insult"
+#: ../../addon/dirstats/dirstats.php:101
+msgid "Diaspora Pods"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:28
-msgid "insulted"
+#: ../../addon/dirstats/dirstats.php:103
+msgid "Hubzilla Channels"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:29
-msgid "praise"
+#: ../../addon/dirstats/dirstats.php:105
+msgid "Friendica Channels"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:29
-msgid "praised"
+#: ../../addon/dirstats/dirstats.php:107
+msgid "Diaspora Channels"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:30
-msgid "be dubious of"
+#: ../../addon/dirstats/dirstats.php:109
+msgid "Aged 35 and above"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:30
-msgid "was dubious of"
+#: ../../addon/dirstats/dirstats.php:111
+msgid "Aged 34 and under"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:31
-msgid "eat"
+#: ../../addon/dirstats/dirstats.php:113
+msgid "Average Age"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:31
-msgid "ate"
+#: ../../addon/dirstats/dirstats.php:115
+msgid "Known Chatrooms"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:32
-msgid "giggle and fawn at"
+#: ../../addon/dirstats/dirstats.php:117
+msgid "Known Tags"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:32
-msgid "giggled and fawned at"
+#: ../../addon/dirstats/dirstats.php:119
+msgid ""
+"Please note Diaspora and Friendica statistics are merely those **this "
+"directory** is aware of, and not all those known in the network. This also "
+"applies to chatrooms,"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:33
-msgid "doubt"
+#: ../../addon/mailhost/mailhost.php:36
+msgid "Email notification hub"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:33
-msgid "doubted"
+#: ../../addon/mailhost/mailhost.php:36
+msgid "Hostname"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:34
-msgid "glare"
+#: ../../addon/mailhost/mailhost.php:40
+msgid "Mailhost Settings"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:34
-msgid "glared at"
+#: ../../addon/mailhost/mailhost.php:54
+msgid "MAILHOST Settings saved."
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:35
-msgid "fuck"
+#: ../../addon/likebanner/likebanner.php:51
+msgid "Your Webbie:"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:35
-msgid "fucked"
+#: ../../addon/likebanner/likebanner.php:54
+msgid "Fontsize (px):"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:36
-msgid "bonk"
+#: ../../addon/likebanner/likebanner.php:68
+msgid "Link:"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:36
-msgid "bonked"
+#: ../../addon/likebanner/likebanner.php:70
+msgid "Like us on Hubzilla"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:37
-msgid "declare undying love for"
+#: ../../addon/likebanner/likebanner.php:72
+msgid "Embed:"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:37
-msgid "declared undying love for"
+#: ../../addon/redphotos/redphotos.php:106
+msgid "Photos imported"
msgstr ""
-#: ../../extend/addon/addon/msgfooter/msgfooter.php:46
-#: ../../extend/addon/addon/xmpp/xmpp.php:91
-msgid "Save Settings"
+#: ../../addon/redphotos/redphotos.php:129
+msgid "Redmatrix Photo Album Import"
msgstr ""
-#: ../../extend/addon/addon/msgfooter/msgfooter.php:47
-msgid "text to include in all outgoing posts from this site"
+#: ../../addon/redphotos/redphotos.php:130
+msgid "This will import all your Redmatrix photo albums to this channel."
msgstr ""
-#: ../../extend/addon/addon/nofed/nofed.php:42
-msgid "Federate"
+#: ../../addon/redphotos/redphotos.php:131
+#: ../../addon/redfiles/redfiles.php:121
+msgid "Redmatrix Server base URL"
msgstr ""
-#: ../../extend/addon/addon/nofed/nofed.php:56
-msgid "nofed Settings saved."
+#: ../../addon/redphotos/redphotos.php:132
+#: ../../addon/redfiles/redfiles.php:122
+msgid "Redmatrix Login Username"
msgstr ""
-#: ../../extend/addon/addon/nofed/nofed.php:72
-msgid "Allow Federation Toggle"
+#: ../../addon/redphotos/redphotos.php:133
+#: ../../addon/redfiles/redfiles.php:123
+msgid "Redmatrix Login Password"
msgstr ""
-#: ../../extend/addon/addon/nofed/nofed.php:76
-msgid "Federate posts by default"
+#: ../../addon/redphotos/redphotos.php:134
+msgid "Import just this album"
msgstr ""
-#: ../../extend/addon/addon/nofed/nofed.php:80
-msgid "NoFed Settings"
+#: ../../addon/redphotos/redphotos.php:134
+msgid "Leave blank to import all albums"
msgstr ""
-#: ../../extend/addon/addon/nsabait/nsabait.php:125
-msgid "Nsabait Settings updated."
+#: ../../addon/redphotos/redphotos.php:135
+msgid "Maximum count to import"
msgstr ""
-#: ../../extend/addon/addon/nsabait/nsabait.php:157
-msgid "Enable NSAbait Plugin"
+#: ../../addon/redphotos/redphotos.php:135
+msgid "0 or blank to import all available"
msgstr ""
-#: ../../extend/addon/addon/nsabait/nsabait.php:161
-msgid "NSAbait Settings"
+#: ../../addon/irc/irc.php:45
+msgid "Channels to auto connect"
msgstr ""
-#: ../../extend/addon/addon/nsfw/nsfw.php:80
-msgid ""
-"This plugin looks in posts for the words/text you specify below, and "
-"collapses any content containing those keywords so it is not displayed at "
-"inappropriate times, such as sexual innuendo that may be improper in a work "
-"setting. It is polite and recommended to tag any content containing nudity "
-"with #NSFW. This filter can also match any other word/text you specify, and "
-"can thereby be used as a general purpose content filter."
+#: ../../addon/irc/irc.php:45 ../../addon/irc/irc.php:49
+msgid "Comma separated list"
msgstr ""
-#: ../../extend/addon/addon/nsfw/nsfw.php:84
-msgid "Enable Content filter"
+#: ../../addon/irc/irc.php:49 ../../addon/irc/irc.php:96
+msgid "Popular Channels"
msgstr ""
-#: ../../extend/addon/addon/nsfw/nsfw.php:88
-msgid "Comma separated list of keywords to hide"
+#: ../../addon/irc/irc.php:53
+msgid "IRC Settings"
msgstr ""
-#: ../../extend/addon/addon/nsfw/nsfw.php:88
-msgid "Word, /regular-expression/, lang=xx, lang!=xx"
+#: ../../addon/irc/irc.php:69
+msgid "IRC settings saved."
msgstr ""
-#: ../../extend/addon/addon/nsfw/nsfw.php:92
-msgid "Not Safe For Work Settings"
+#: ../../addon/irc/irc.php:74
+msgid "IRC Chatroom"
msgstr ""
-#: ../../extend/addon/addon/nsfw/nsfw.php:92
-msgid "General Purpose Content Filter"
+#: ../../addon/ljpost/ljpost.php:42
+msgid "Post to LiveJournal"
msgstr ""
-#: ../../extend/addon/addon/nsfw/nsfw.php:110
-msgid "NSFW Settings saved."
+#: ../../addon/ljpost/ljpost.php:70
+msgid "Enable LiveJournal Post Plugin"
msgstr ""
-#: ../../extend/addon/addon/nsfw/nsfw.php:207
-msgid "Possible adult content"
+#: ../../addon/ljpost/ljpost.php:74
+msgid "LiveJournal username"
msgstr ""
-#: ../../extend/addon/addon/nsfw/nsfw.php:211
-#, php-format
-msgid "%s - view"
+#: ../../addon/ljpost/ljpost.php:78
+msgid "LiveJournal password"
msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:50
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:128
-msgid "System defaults:"
+#: ../../addon/ljpost/ljpost.php:82
+msgid "Post to LiveJournal by default"
msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:54
-msgid "Preferred Clipart IDs"
+#: ../../addon/ljpost/ljpost.php:86
+msgid "LiveJournal Post Settings"
msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:54
-msgid "List of preferred clipart ids. These will be shown first."
+#: ../../addon/ljpost/ljpost.php:101
+msgid "LiveJournal Settings saved."
msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:55
-msgid "Default Search Term"
+#: ../../addon/openid/openid.php:49
+msgid ""
+"We encountered a problem while logging in with the OpenID you provided. "
+"Please check the correct spelling of the ID."
msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:55
-msgid "The default search term. These will be shown second."
+#: ../../addon/openid/openid.php:49
+msgid "The error message was:"
msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:56
-msgid "Return After"
+#: ../../addon/openid/MysqlProvider.php:52
+msgid "First Name"
msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:56
-msgid "Page to load after image selection."
+#: ../../addon/openid/MysqlProvider.php:53
+msgid "Last Name"
msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:58
-#: ../../include/channel.php:1048 ../../include/nav.php:107
-msgid "Edit Profile"
+#: ../../addon/openid/MysqlProvider.php:54 ../../addon/redred/redred.php:111
+msgid "Nickname"
msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:59
-msgid "Profile List"
+#: ../../addon/openid/MysqlProvider.php:55
+msgid "Full Name"
msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:61
-msgid "Order of Preferred"
+#: ../../addon/openid/MysqlProvider.php:61
+msgid "Profile Photo 16px"
msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:61
-msgid "Sort order of preferred clipart ids."
+#: ../../addon/openid/MysqlProvider.php:62
+msgid "Profile Photo 32px"
msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:62
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:68
-msgid "Newest first"
+#: ../../addon/openid/MysqlProvider.php:63
+msgid "Profile Photo 48px"
msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:65
-msgid "As entered"
+#: ../../addon/openid/MysqlProvider.php:64
+msgid "Profile Photo 64px"
msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:67
-msgid "Order of other"
+#: ../../addon/openid/MysqlProvider.php:65
+msgid "Profile Photo 80px"
msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:67
-msgid "Sort order of other clipart ids."
+#: ../../addon/openid/MysqlProvider.php:66
+msgid "Profile Photo 128px"
msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:69
-msgid "Most downloaded first"
+#: ../../addon/openid/MysqlProvider.php:67
+msgid "Timezone"
msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:70
-msgid "Most liked first"
+#: ../../addon/openid/MysqlProvider.php:70
+msgid "Birth Year"
msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:72
-msgid "Preferred IDs Message"
+#: ../../addon/openid/MysqlProvider.php:71
+msgid "Birth Month"
msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:72
-msgid "Message to display above preferred results."
+#: ../../addon/openid/MysqlProvider.php:72
+msgid "Birth Day"
msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:78
-msgid "Uploaded by: "
+#: ../../addon/openid/MysqlProvider.php:73
+msgid "Birthdate"
msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:78
-msgid "Drawn by: "
+#: ../../addon/openid/Mod_Openid.php:30
+msgid "OpenID protocol error. No ID returned."
msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:192
-msgid "Or select from a free OpenClipart.org image:"
+#: ../../addon/openid/Mod_Openid.php:188 ../../include/auth.php:286
+msgid "Login failed."
msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:195
-msgid "Search Term"
+#: ../../addon/openid/Mod_Id.php:85 ../../include/selectors.php:49
+#: ../../include/selectors.php:66
+msgid "Male"
msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:232
-msgid "Unknown error. Please try again later."
+#: ../../addon/openid/Mod_Id.php:87 ../../include/selectors.php:49
+#: ../../include/selectors.php:66
+msgid "Female"
msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:305
-msgid "Profile photo updated successfully."
+#: ../../addon/randpost/randpost.php:97
+msgid "You're welcome."
msgstr ""
-#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:146
-msgid "View Larger"
+#: ../../addon/randpost/randpost.php:98
+msgid "Ah shucks..."
msgstr ""
-#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:169
-msgid "Tile Server URL"
+#: ../../addon/randpost/randpost.php:99
+msgid "Don't mention it."
msgstr ""
-#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:169
-msgid ""
-"A list of <a href=\"http://wiki.openstreetmap.org/wiki/TMS\" target=\"_blank"
-"\">public tile servers</a>"
+#: ../../addon/randpost/randpost.php:100
+msgid "&lt;blush&gt;"
msgstr ""
-#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:170
-msgid "Nominatim (reverse geocoding) Server URL"
+#: ../../addon/startpage/startpage.php:109
+msgid "Page to load after login"
msgstr ""
-#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:170
+#: ../../addon/startpage/startpage.php:109
msgid ""
-"A list of <a href=\"http://wiki.openstreetmap.org/wiki/Nominatim\" target="
-"\"_blank\">Nominatim servers</a>"
-msgstr ""
-
-#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:171
-msgid "Default zoom"
+"Examples: &quot;apps&quot;, &quot;network?f=&gid=37&quot; (privacy "
+"collection), &quot;channel&quot; or &quot;notifications/system&quot; (leave "
+"blank for default network page (grid)."
msgstr ""
-#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:171
-msgid ""
-"The default zoom level. (1:world, 18:highest, also depends on tile server)"
+#: ../../addon/startpage/startpage.php:113
+msgid "Startpage Settings"
msgstr ""
-#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:172
-msgid "Include marker on map"
+#: ../../addon/morepokes/morepokes.php:19
+msgid "bitchslap"
msgstr ""
-#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:172
-msgid "Include a marker on the map."
+#: ../../addon/morepokes/morepokes.php:19
+msgid "bitchslapped"
msgstr ""
-#: ../../extend/addon/addon/pageheader/pageheader.php:43
-msgid "Message to display on every page on this server"
+#: ../../addon/morepokes/morepokes.php:20
+msgid "shag"
msgstr ""
-#: ../../extend/addon/addon/pageheader/pageheader.php:48
-msgid "Pageheader Settings"
+#: ../../addon/morepokes/morepokes.php:20
+msgid "shagged"
msgstr ""
-#: ../../extend/addon/addon/pageheader/pageheader.php:64
-msgid "pageheader Settings saved."
+#: ../../addon/morepokes/morepokes.php:21
+msgid "patent"
msgstr ""
-#: ../../extend/addon/addon/piwik/piwik.php:85
-msgid ""
-"This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> "
-"analytics tool."
+#: ../../addon/morepokes/morepokes.php:21
+msgid "patented"
msgstr ""
-#: ../../extend/addon/addon/piwik/piwik.php:88
-#, php-format
-msgid ""
-"If you do not want that your visits are logged this way you <a href='%s'>can "
-"set a cookie to prevent Piwik from tracking further visits of the site</a> "
-"(opt-out)."
+#: ../../addon/morepokes/morepokes.php:22
+msgid "hug"
msgstr ""
-#: ../../extend/addon/addon/piwik/piwik.php:96
-msgid "Piwik Base URL"
+#: ../../addon/morepokes/morepokes.php:22
+msgid "hugged"
msgstr ""
-#: ../../extend/addon/addon/piwik/piwik.php:96
-msgid ""
-"Absolute path to your Piwik installation. (without protocol (http/s), with "
-"trailing slash)"
+#: ../../addon/morepokes/morepokes.php:23
+msgid "murder"
msgstr ""
-#: ../../extend/addon/addon/piwik/piwik.php:97
-msgid "Site ID"
+#: ../../addon/morepokes/morepokes.php:23
+msgid "murdered"
msgstr ""
-#: ../../extend/addon/addon/piwik/piwik.php:98
-msgid "Show opt-out cookie link?"
+#: ../../addon/morepokes/morepokes.php:24
+msgid "worship"
msgstr ""
-#: ../../extend/addon/addon/piwik/piwik.php:99
-msgid "Asynchronous tracking"
+#: ../../addon/morepokes/morepokes.php:24
+msgid "worshipped"
msgstr ""
-#: ../../extend/addon/addon/piwik/piwik.php:100
-msgid "Enable frontend JavaScript error tracking"
+#: ../../addon/morepokes/morepokes.php:25
+msgid "kiss"
msgstr ""
-#: ../../extend/addon/addon/piwik/piwik.php:100
-msgid "This feature requires Piwik >= 2.2.0"
+#: ../../addon/morepokes/morepokes.php:25
+msgid "kissed"
msgstr ""
-#: ../../extend/addon/addon/planets/planets.php:121
-msgid "Planets Settings updated."
+#: ../../addon/morepokes/morepokes.php:26
+msgid "tempt"
msgstr ""
-#: ../../extend/addon/addon/planets/planets.php:153
-msgid "Enable Planets Plugin"
+#: ../../addon/morepokes/morepokes.php:26
+msgid "tempted"
msgstr ""
-#: ../../extend/addon/addon/planets/planets.php:157
-msgid "Planets Settings"
+#: ../../addon/morepokes/morepokes.php:27
+msgid "raise eyebrows at"
msgstr ""
-#: ../../extend/addon/addon/pumpio/pumpio.php:148
-msgid "You are now authenticated to pumpio."
+#: ../../addon/morepokes/morepokes.php:27
+msgid "raised their eyebrows at"
msgstr ""
-#: ../../extend/addon/addon/pumpio/pumpio.php:149
-msgid "return to the featured settings page"
+#: ../../addon/morepokes/morepokes.php:28
+msgid "insult"
msgstr ""
-#: ../../extend/addon/addon/pumpio/pumpio.php:163
-msgid "Post to Pump.io"
+#: ../../addon/morepokes/morepokes.php:28
+msgid "insulted"
msgstr ""
-#: ../../extend/addon/addon/pumpio/pumpio.php:198
-msgid "Pump.io servername"
+#: ../../addon/morepokes/morepokes.php:29
+msgid "praise"
msgstr ""
-#: ../../extend/addon/addon/pumpio/pumpio.php:198
-msgid "Without \"http://\" or \"https://\""
+#: ../../addon/morepokes/morepokes.php:29
+msgid "praised"
msgstr ""
-#: ../../extend/addon/addon/pumpio/pumpio.php:202
-msgid "Pump.io username"
+#: ../../addon/morepokes/morepokes.php:30
+msgid "be dubious of"
msgstr ""
-#: ../../extend/addon/addon/pumpio/pumpio.php:202
-msgid "Without the servername"
+#: ../../addon/morepokes/morepokes.php:30
+msgid "was dubious of"
msgstr ""
-#: ../../extend/addon/addon/pumpio/pumpio.php:213
-msgid "You are not authenticated to pumpio"
+#: ../../addon/morepokes/morepokes.php:31
+msgid "eat"
msgstr ""
-#: ../../extend/addon/addon/pumpio/pumpio.php:215
-msgid "(Re-)Authenticate your pump.io connection"
+#: ../../addon/morepokes/morepokes.php:31
+msgid "ate"
msgstr ""
-#: ../../extend/addon/addon/pumpio/pumpio.php:219
-msgid "Enable pump.io Post Plugin"
+#: ../../addon/morepokes/morepokes.php:32
+msgid "giggle and fawn at"
msgstr ""
-#: ../../extend/addon/addon/pumpio/pumpio.php:223
-msgid "Post to pump.io by default"
+#: ../../addon/morepokes/morepokes.php:32
+msgid "giggled and fawned at"
msgstr ""
-#: ../../extend/addon/addon/pumpio/pumpio.php:227
-msgid "Should posts be public"
+#: ../../addon/morepokes/morepokes.php:33
+msgid "doubt"
msgstr ""
-#: ../../extend/addon/addon/pumpio/pumpio.php:231
-msgid "Mirror all public posts"
+#: ../../addon/morepokes/morepokes.php:33
+msgid "doubted"
msgstr ""
-#: ../../extend/addon/addon/pumpio/pumpio.php:237
-msgid "Pump.io Post Settings"
+#: ../../addon/morepokes/morepokes.php:34
+msgid "glare"
msgstr ""
-#: ../../extend/addon/addon/pumpio/pumpio.php:266
-msgid "PumpIO Settings saved."
+#: ../../addon/morepokes/morepokes.php:34
+msgid "glared at"
msgstr ""
-#: ../../extend/addon/addon/qrator/qrator.php:48
-msgid "QR code"
+#: ../../addon/morepokes/morepokes.php:35
+msgid "fuck"
msgstr ""
-#: ../../extend/addon/addon/qrator/qrator.php:63
-msgid "QR Generator"
+#: ../../addon/morepokes/morepokes.php:35
+msgid "fucked"
msgstr ""
-#: ../../extend/addon/addon/qrator/qrator.php:64
-msgid "Enter some text"
+#: ../../addon/morepokes/morepokes.php:36
+msgid "bonk"
msgstr ""
-#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:81
-msgid "Enable Rainbowtag"
+#: ../../addon/morepokes/morepokes.php:36
+msgid "bonked"
msgstr ""
-#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:85
-msgid "Rainbowtag Settings"
+#: ../../addon/morepokes/morepokes.php:37
+msgid "declare undying love for"
msgstr ""
-#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:101
-msgid "Rainbowtag Settings saved."
+#: ../../addon/morepokes/morepokes.php:37
+msgid "declared undying love for"
msgstr ""
-#: ../../extend/addon/addon/randpost/randpost.php:97
-msgid "You're welcome."
+#: ../../addon/diaspora/diaspora.php:675
+msgid "Diaspora Protocol Settings updated."
msgstr ""
-#: ../../extend/addon/addon/randpost/randpost.php:98
-msgid "Ah shucks..."
+#: ../../addon/diaspora/diaspora.php:694
+msgid "Enable the Diaspora protocol for this channel"
msgstr ""
-#: ../../extend/addon/addon/randpost/randpost.php:99
-msgid "Don't mention it."
+#: ../../addon/diaspora/diaspora.php:698
+msgid "Allow any Diaspora member to comment on your public posts"
msgstr ""
-#: ../../extend/addon/addon/randpost/randpost.php:100
-msgid "&lt;blush&gt;"
+#: ../../addon/diaspora/diaspora.php:702
+msgid "Prevent your hashtags from being redirected to other sites"
msgstr ""
-#: ../../extend/addon/addon/redfiles/redfiles.php:119
-msgid "Redmatrix File Storage Import"
+#: ../../addon/diaspora/diaspora.php:707
+msgid "Followed hashtags (comma separated, do not include the #)"
msgstr ""
-#: ../../extend/addon/addon/redfiles/redfiles.php:120
-msgid "This will import all your Redmatrix cloud files to this channel."
+#: ../../addon/diaspora/diaspora.php:712
+msgid "Diaspora Protocol Settings"
msgstr ""
-#: ../../extend/addon/addon/redfiles/redfiles.php:121
-#: ../../extend/addon/addon/redphotos/redphotos.php:131
-msgid "Redmatrix Server base URL"
+#: ../../addon/diaspora/import_diaspora.php:16
+msgid "No username found in import file."
msgstr ""
-#: ../../extend/addon/addon/redfiles/redfiles.php:122
-#: ../../extend/addon/addon/redphotos/redphotos.php:132
-msgid "Redmatrix Login Username"
+#: ../../addon/diaspora/import_diaspora.php:41 ../../include/import.php:62
+msgid "Unable to create a unique channel address. Import failed."
msgstr ""
-#: ../../extend/addon/addon/redfiles/redfiles.php:123
-#: ../../extend/addon/addon/redphotos/redphotos.php:133
-msgid "Redmatrix Login Password"
+#: ../../addon/gitwiki/Mod_Gitwiki.php:107
+msgid "Error retrieving wiki"
msgstr ""
-#: ../../extend/addon/addon/redfiles/redfilehelper.php:67
-msgid "file"
+#: ../../addon/gitwiki/Mod_Gitwiki.php:114
+msgid "Error creating zip file export folder"
msgstr ""
-#: ../../extend/addon/addon/redphotos/redphotos.php:106
-msgid "Photos imported"
+#: ../../addon/gitwiki/Mod_Gitwiki.php:132
+msgid "Error downloading wiki: "
msgstr ""
-#: ../../extend/addon/addon/redphotos/redphotos.php:129
-msgid "Redmatrix Photo Album Import"
+#: ../../addon/testdrive/testdrive.php:104
+#, php-format
+msgid "Your account on %s will expire in a few days."
msgstr ""
-#: ../../extend/addon/addon/redphotos/redphotos.php:130
-msgid "This will import all your Redmatrix photo albums to this channel."
+#: ../../addon/testdrive/testdrive.php:105
+msgid "Your $Productname test account is about to expire."
msgstr ""
-#: ../../extend/addon/addon/redphotos/redphotos.php:134
-msgid "Import just this album"
+#: ../../addon/rainbowtag/rainbowtag.php:81
+msgid "Enable Rainbowtag"
msgstr ""
-#: ../../extend/addon/addon/redphotos/redphotos.php:134
-msgid "Leave blank to import all albums"
+#: ../../addon/rainbowtag/rainbowtag.php:85
+msgid "Rainbowtag Settings"
msgstr ""
-#: ../../extend/addon/addon/redphotos/redphotos.php:135
-msgid "Maximum count to import"
+#: ../../addon/rainbowtag/rainbowtag.php:101
+msgid "Rainbowtag Settings saved."
msgstr ""
-#: ../../extend/addon/addon/redphotos/redphotos.php:135
-msgid "0 or blank to import all available"
+#: ../../addon/upload_limits/upload_limits.php:25
+msgid "Show Upload Limits"
msgstr ""
-#: ../../extend/addon/addon/redred/redred.php:45
-msgid "Post to Red"
+#: ../../addon/upload_limits/upload_limits.php:27
+msgid "Hubzilla configured maximum size: "
msgstr ""
-#: ../../extend/addon/addon/redred/redred.php:60
-msgid "Channel is required."
+#: ../../addon/upload_limits/upload_limits.php:28
+msgid "PHP upload_max_filesize: "
msgstr ""
-#: ../../extend/addon/addon/redred/redred.php:65
-msgid "Invalid channel."
+#: ../../addon/upload_limits/upload_limits.php:29
+msgid "PHP post_max_size (must be larger than upload_max_filesize): "
msgstr ""
-#: ../../extend/addon/addon/redred/redred.php:76
-msgid "redred Settings saved."
+#: ../../addon/visage/visage.php:93
+msgid "Recent Channel/Profile Viewers"
msgstr ""
-#: ../../extend/addon/addon/redred/redred.php:95
-msgid "Allow posting to another Hubzilla Channel"
+#: ../../addon/visage/visage.php:98
+msgid "This plugin/addon has not been configured."
msgstr ""
-#: ../../extend/addon/addon/redred/redred.php:99
-msgid "Send public postings to Hubzilla channel by default"
+#: ../../addon/visage/visage.php:99
+#, php-format
+msgid "Please visit the Visage settings on %s"
msgstr ""
-#: ../../extend/addon/addon/redred/redred.php:103
-msgid "Hubzilla API Path"
+#: ../../addon/visage/visage.php:99
+msgid "your feature settings page"
msgstr ""
-#: ../../extend/addon/addon/redred/redred.php:103
-#: ../../extend/addon/addon/rtof/rtof.php:89
-msgid "https://{sitename}/api"
+#: ../../addon/visage/visage.php:112
+msgid "No entries."
msgstr ""
-#: ../../extend/addon/addon/redred/redred.php:107
-msgid "Hubzilla login name"
+#: ../../addon/visage/visage.php:166
+msgid "Enable Visage Visitor Logging"
msgstr ""
-#: ../../extend/addon/addon/redred/redred.php:111
-msgid "Hubzilla channel name"
+#: ../../addon/visage/visage.php:170
+msgid "Visage Settings"
msgstr ""
-#: ../../extend/addon/addon/redred/redred.php:111
-#: ../../extend/addon/addon/openid/MysqlProvider.php:54
-msgid "Nickname"
+#: ../../addon/nsabait/nsabait.php:125
+msgid "Nsabait Settings updated."
msgstr ""
-#: ../../extend/addon/addon/redred/redred.php:119
-msgid "Hubzilla Crosspost Settings"
+#: ../../addon/nsabait/nsabait.php:157
+msgid "Enable NSAbait Plugin"
msgstr ""
-#: ../../extend/addon/addon/rtof/rtof.php:45
-msgid "Post to Friendica"
+#: ../../addon/nsabait/nsabait.php:161
+msgid "NSAbait Settings"
msgstr ""
-#: ../../extend/addon/addon/rtof/rtof.php:62
-msgid "rtof Settings saved."
+#: ../../addon/mailtest/mailtest.php:19
+msgid "Send test email"
msgstr ""
-#: ../../extend/addon/addon/rtof/rtof.php:81
-msgid "Allow posting to Friendica"
+#: ../../addon/mailtest/mailtest.php:50 ../../addon/hubwall/hubwall.php:50
+msgid "No recipients found."
msgstr ""
-#: ../../extend/addon/addon/rtof/rtof.php:85
-msgid "Send public postings to Friendica by default"
+#: ../../addon/mailtest/mailtest.php:66
+msgid "Mail sent."
msgstr ""
-#: ../../extend/addon/addon/rtof/rtof.php:89
-msgid "Friendica API Path"
+#: ../../addon/mailtest/mailtest.php:68
+msgid "Sending of mail failed."
msgstr ""
-#: ../../extend/addon/addon/rtof/rtof.php:93
-msgid "Friendica login name"
+#: ../../addon/mailtest/mailtest.php:77
+msgid "Mail Test"
msgstr ""
-#: ../../extend/addon/addon/rtof/rtof.php:97
-msgid "Friendica password"
+#: ../../addon/mailtest/mailtest.php:96 ../../addon/hubwall/hubwall.php:92
+msgid "Message subject"
msgstr ""
-#: ../../extend/addon/addon/rtof/rtof.php:101
-msgid "Hubzilla to Friendica Post Settings"
+#: ../../addon/diaspora_reconnect/diaspora_reconnect.php:44
+#, php-format
+msgid "Reconnecting %d connections"
msgstr ""
-#: ../../extend/addon/addon/sendzid/sendzid.php:25
-msgid "Extended Identity Sharing"
+#: ../../addon/diaspora_reconnect/diaspora_reconnect.php:63
+msgid "Diaspora Reconnect"
msgstr ""
-#: ../../extend/addon/addon/sendzid/sendzid.php:26
+#: ../../addon/diaspora_reconnect/diaspora_reconnect.php:65
msgid ""
-"Share your identity with all websites on the internet. When disabled, "
-"identity is only shared with sites in the matrix."
-msgstr ""
-
-#: ../../extend/addon/addon/skeleton/skeleton.php:59
-msgid "Some setting"
-msgstr ""
-
-#: ../../extend/addon/addon/skeleton/skeleton.php:61
-msgid "A setting"
+"Use this form to re-establish Diaspora connections which were initially made "
+"from a different hub."
msgstr ""
-#: ../../extend/addon/addon/skeleton/skeleton.php:64
-msgid "Skeleton Settings"
+#: ../../addon/diaspora_reconnect/diaspora_reconnect.php:70
+msgid "Reconnect"
msgstr ""
-#: ../../extend/addon/addon/smileybutton/smileybutton.php:273
-msgid "Deactivate the feature"
+#: ../../addon/openstreetmap/openstreetmap.php:146
+msgid "View Larger"
msgstr ""
-#: ../../extend/addon/addon/smileybutton/smileybutton.php:277
-msgid "Hide the button and show the smilies directly."
+#: ../../addon/openstreetmap/openstreetmap.php:169
+msgid "Tile Server URL"
msgstr ""
-#: ../../extend/addon/addon/smileybutton/smileybutton.php:281
-msgid "Smileybutton Settings"
+#: ../../addon/openstreetmap/openstreetmap.php:169
+msgid ""
+"A list of <a href=\"http://wiki.openstreetmap.org/wiki/TMS\" target=\"_blank"
+"\">public tile servers</a>"
msgstr ""
-#: ../../extend/addon/addon/startpage/startpage.php:109
-msgid "Page to load after login"
+#: ../../addon/openstreetmap/openstreetmap.php:170
+msgid "Nominatim (reverse geocoding) Server URL"
msgstr ""
-#: ../../extend/addon/addon/startpage/startpage.php:109
+#: ../../addon/openstreetmap/openstreetmap.php:170
msgid ""
-"Examples: &quot;apps&quot;, &quot;network?f=&gid=37&quot; (privacy "
-"collection), &quot;channel&quot; or &quot;notifications/system&quot; (leave "
-"blank for default network page (grid)."
-msgstr ""
-
-#: ../../extend/addon/addon/startpage/startpage.php:113
-msgid "Startpage Settings"
+"A list of <a href=\"http://wiki.openstreetmap.org/wiki/Nominatim\" target="
+"\"_blank\">Nominatim servers</a>"
msgstr ""
-#: ../../extend/addon/addon/statusnet/statusnet.php:143
-msgid "Post to GNU social"
+#: ../../addon/openstreetmap/openstreetmap.php:171
+msgid "Default zoom"
msgstr ""
-#: ../../extend/addon/addon/statusnet/statusnet.php:195
+#: ../../addon/openstreetmap/openstreetmap.php:171
msgid ""
-"Please contact your site administrator.<br />The provided API URL is not "
-"valid."
-msgstr ""
-
-#: ../../extend/addon/addon/statusnet/statusnet.php:232
-msgid "We could not contact the GNU social API with the Path you entered."
+"The default zoom level. (1:world, 18:highest, also depends on tile server)"
msgstr ""
-#: ../../extend/addon/addon/statusnet/statusnet.php:266
-msgid "GNU social settings updated."
+#: ../../addon/openstreetmap/openstreetmap.php:172
+msgid "Include marker on map"
msgstr ""
-#: ../../extend/addon/addon/statusnet/statusnet.php:310
-msgid "Globally Available GNU social OAuthKeys"
+#: ../../addon/openstreetmap/openstreetmap.php:172
+msgid "Include a marker on the map."
msgstr ""
-#: ../../extend/addon/addon/statusnet/statusnet.php:312
-msgid ""
-"There are preconfigured OAuth key pairs for some GNU social servers "
-"available. If you are using one of them, please use these credentials.<br /"
-">If not feel free to connect to any other GNU social instance (see below)."
+#: ../../addon/msgfooter/msgfooter.php:46 ../../addon/xmpp/xmpp.php:91
+msgid "Save Settings"
msgstr ""
-#: ../../extend/addon/addon/statusnet/statusnet.php:327
-msgid "Provide your own OAuth Credentials"
+#: ../../addon/msgfooter/msgfooter.php:47
+msgid "text to include in all outgoing posts from this site"
msgstr ""
-#: ../../extend/addon/addon/statusnet/statusnet.php:329
-msgid ""
-"No consumer key pair for GNU social found. Register your Hubzilla Account as "
-"an desktop client on your GNU social account, copy the consumer key pair "
-"here and enter the API base root.<br />Before you register your own OAuth "
-"key pair ask the administrator if there is already a key pair for this "
-"Hubzilla installation at your favourite GNU social installation."
+#: ../../addon/rtof/rtof.php:45
+msgid "Post to Friendica"
msgstr ""
-#: ../../extend/addon/addon/statusnet/statusnet.php:333
-msgid "OAuth Consumer Key"
+#: ../../addon/rtof/rtof.php:62
+msgid "rtof Settings saved."
msgstr ""
-#: ../../extend/addon/addon/statusnet/statusnet.php:337
-msgid "OAuth Consumer Secret"
+#: ../../addon/rtof/rtof.php:81
+msgid "Allow posting to Friendica"
msgstr ""
-#: ../../extend/addon/addon/statusnet/statusnet.php:341
-msgid "Base API Path"
+#: ../../addon/rtof/rtof.php:85
+msgid "Send public postings to Friendica by default"
msgstr ""
-#: ../../extend/addon/addon/statusnet/statusnet.php:341
-msgid "Remember the trailing /"
+#: ../../addon/rtof/rtof.php:89
+msgid "Friendica API Path"
msgstr ""
-#: ../../extend/addon/addon/statusnet/statusnet.php:345
-msgid "GNU social application name"
+#: ../../addon/rtof/rtof.php:89 ../../addon/redred/redred.php:103
+msgid "https://{sitename}/api"
msgstr ""
-#: ../../extend/addon/addon/statusnet/statusnet.php:368
-msgid ""
-"To connect to your GNU social account click the button below to get a "
-"security code from GNU social which you have to copy into the input box "
-"below and submit the form. Only your <strong>public</strong> posts will be "
-"posted to GNU social."
+#: ../../addon/rtof/rtof.php:93
+msgid "Friendica login name"
msgstr ""
-#: ../../extend/addon/addon/statusnet/statusnet.php:370
-msgid "Log in with GNU social"
+#: ../../addon/rtof/rtof.php:97
+msgid "Friendica password"
msgstr ""
-#: ../../extend/addon/addon/statusnet/statusnet.php:373
-msgid "Copy the security code from GNU social here"
+#: ../../addon/rtof/rtof.php:101
+msgid "Hubzilla to Friendica Post Settings"
msgstr ""
-#: ../../extend/addon/addon/statusnet/statusnet.php:383
-msgid "Cancel Connection Process"
+#: ../../addon/jappixmini/jappixmini.php:305 ../../include/channel.php:1139
+#: ../../include/channel.php:1296
+msgid "Status:"
msgstr ""
-#: ../../extend/addon/addon/statusnet/statusnet.php:385
-msgid "Current GNU social API is"
+#: ../../addon/jappixmini/jappixmini.php:309
+msgid "Activate addon"
msgstr ""
-#: ../../extend/addon/addon/statusnet/statusnet.php:389
-msgid "Cancel GNU social Connection"
+#: ../../addon/jappixmini/jappixmini.php:313
+msgid "Hide Jappixmini Chat-Widget from the webinterface"
msgstr ""
-#: ../../extend/addon/addon/statusnet/statusnet.php:401
-#: ../../extend/addon/addon/twitter/twitter.php:232
-msgid "Currently connected to: "
+#: ../../addon/jappixmini/jappixmini.php:318
+msgid "Jabber username"
msgstr ""
-#: ../../extend/addon/addon/statusnet/statusnet.php:406
-msgid ""
-"<strong>Note</strong>: Due your privacy settings (<em>Hide your profile "
-"details from unknown viewers?</em>) the link potentially included in public "
-"postings relayed to GNU social will lead the visitor to a blank page "
-"informing the visitor that the access to your profile has been restricted."
+#: ../../addon/jappixmini/jappixmini.php:324
+msgid "Jabber server"
msgstr ""
-#: ../../extend/addon/addon/statusnet/statusnet.php:411
-msgid "Allow posting to GNU social"
+#: ../../addon/jappixmini/jappixmini.php:330
+msgid "Jabber BOSH host URL"
msgstr ""
-#: ../../extend/addon/addon/statusnet/statusnet.php:411
-msgid ""
-"If enabled your public postings can be posted to the associated GNU-social "
-"account"
+#: ../../addon/jappixmini/jappixmini.php:337
+msgid "Jabber password"
msgstr ""
-#: ../../extend/addon/addon/statusnet/statusnet.php:415
-msgid "Post to GNU social by default"
+#: ../../addon/jappixmini/jappixmini.php:343
+msgid "Encrypt Jabber password with Hubzilla password"
msgstr ""
-#: ../../extend/addon/addon/statusnet/statusnet.php:415
-msgid ""
-"If enabled your public postings will be posted to the associated GNU-social "
-"account by default"
+#: ../../addon/jappixmini/jappixmini.php:347 ../../addon/redred/redred.php:115
+msgid "Hubzilla password"
msgstr ""
-#: ../../extend/addon/addon/statusnet/statusnet.php:424
-#: ../../extend/addon/addon/twitter/twitter.php:255
-msgid "Clear OAuth configuration"
+#: ../../addon/jappixmini/jappixmini.php:351
+#: ../../addon/jappixmini/jappixmini.php:355
+msgid "Approve subscription requests from Hubzilla contacts automatically"
msgstr ""
-#: ../../extend/addon/addon/statusnet/statusnet.php:432
-msgid "GNU social Post Settings"
+#: ../../addon/jappixmini/jappixmini.php:359
+msgid "Purge internal list of jabber addresses of contacts"
msgstr ""
-#: ../../extend/addon/addon/statusnet/statusnet.php:891
-msgid "API URL"
+#: ../../addon/jappixmini/jappixmini.php:364
+msgid "Configuration Help"
msgstr ""
-#: ../../extend/addon/addon/statusnet/statusnet.php:894
-msgid "Application name"
+#: ../../addon/jappixmini/jappixmini.php:371
+msgid "Jappix Mini Settings"
msgstr ""
-#: ../../extend/addon/addon/superblock/superblock.php:110
+#: ../../addon/superblock/superblock.php:112
msgid "Currently blocked"
msgstr ""
-#: ../../extend/addon/addon/superblock/superblock.php:112
+#: ../../addon/superblock/superblock.php:114
msgid "No channels currently blocked"
msgstr ""
-#: ../../extend/addon/addon/superblock/superblock.php:118
+#: ../../addon/superblock/superblock.php:120
msgid "\"Superblock\" Settings"
msgstr ""
-#: ../../extend/addon/addon/superblock/superblock.php:322
+#: ../../addon/superblock/superblock.php:345
msgid "Block Completely"
msgstr ""
-#: ../../extend/addon/addon/superblock/superblock.php:371
+#: ../../addon/superblock/superblock.php:394
msgid "superblock settings updated"
msgstr ""
-#: ../../extend/addon/addon/testdrive/testdrive.php:104
-#, php-format
-msgid "Your account on %s will expire in a few days."
-msgstr ""
-
-#: ../../extend/addon/addon/testdrive/testdrive.php:105
-msgid "Your $Productname test account is about to expire."
-msgstr ""
-
-#: ../../extend/addon/addon/tictac/tictac.php:21
-msgid "Three Dimensional Tic-Tac-Toe"
-msgstr ""
-
-#: ../../extend/addon/addon/tictac/tictac.php:54
-msgid "3D Tic-Tac-Toe"
+#: ../../addon/nofed/nofed.php:42
+msgid "Federate"
msgstr ""
-#: ../../extend/addon/addon/tictac/tictac.php:59
-msgid "New game"
+#: ../../addon/nofed/nofed.php:56
+msgid "nofed Settings saved."
msgstr ""
-#: ../../extend/addon/addon/tictac/tictac.php:60
-msgid "New game with handicap"
+#: ../../addon/nofed/nofed.php:72
+msgid "Allow Federation Toggle"
msgstr ""
-#: ../../extend/addon/addon/tictac/tictac.php:61
-msgid ""
-"Three dimensional tic-tac-toe is just like the traditional game except that "
-"it is played on multiple levels simultaneously. "
+#: ../../addon/nofed/nofed.php:76
+msgid "Federate posts by default"
msgstr ""
-#: ../../extend/addon/addon/tictac/tictac.php:62
-msgid ""
-"In this case there are three levels. You win by getting three in a row on "
-"any level, as well as up, down, and diagonally across the different levels."
+#: ../../addon/nofed/nofed.php:80
+msgid "NoFed Settings"
msgstr ""
-#: ../../extend/addon/addon/tictac/tictac.php:64
-msgid ""
-"The handicap game disables the center position on the middle level because "
-"the player claiming this square often has an unfair advantage."
+#: ../../addon/redred/redred.php:45
+msgid "Post to Red"
msgstr ""
-#: ../../extend/addon/addon/tictac/tictac.php:183
-msgid "You go first..."
+#: ../../addon/redred/redred.php:60
+msgid "Channel is required."
msgstr ""
-#: ../../extend/addon/addon/tictac/tictac.php:188
-msgid "I'm going first this time..."
+#: ../../addon/redred/redred.php:76
+msgid "redred Settings saved."
msgstr ""
-#: ../../extend/addon/addon/tictac/tictac.php:194
-msgid "You won!"
+#: ../../addon/redred/redred.php:95
+msgid "Allow posting to another Hubzilla Channel"
msgstr ""
-#: ../../extend/addon/addon/tictac/tictac.php:200
-#: ../../extend/addon/addon/tictac/tictac.php:225
-msgid "\"Cat\" game!"
+#: ../../addon/redred/redred.php:99
+msgid "Send public postings to Hubzilla channel by default"
msgstr ""
-#: ../../extend/addon/addon/tictac/tictac.php:223
-msgid "I won!"
+#: ../../addon/redred/redred.php:103
+msgid "Hubzilla API Path"
msgstr ""
-#: ../../extend/addon/addon/tour/tour.php:75
-msgid "Edit your profile and change settings."
+#: ../../addon/redred/redred.php:107
+msgid "Hubzilla login name"
msgstr ""
-#: ../../extend/addon/addon/tour/tour.php:76
-msgid "Click here to see activity from your connections."
+#: ../../addon/redred/redred.php:111
+msgid "Hubzilla channel name"
msgstr ""
-#: ../../extend/addon/addon/tour/tour.php:77
-msgid "Click here to see your channel home."
+#: ../../addon/redred/redred.php:119
+msgid "Hubzilla Crosspost Settings"
msgstr ""
-#: ../../extend/addon/addon/tour/tour.php:78
-msgid "You can access your private messages from here."
+#: ../../addon/logrot/logrot.php:36
+msgid "Logfile archive directory"
msgstr ""
-#: ../../extend/addon/addon/tour/tour.php:79
-msgid "Create new events here."
+#: ../../addon/logrot/logrot.php:36
+msgid "Directory to store rotated logs"
msgstr ""
-#: ../../extend/addon/addon/tour/tour.php:80
-msgid ""
-"You can accept new connections and change permissions for existing ones "
-"here. You can also e.g. create groups of contacts."
+#: ../../addon/logrot/logrot.php:37
+msgid "Logfile size in bytes before rotating"
msgstr ""
-#: ../../extend/addon/addon/tour/tour.php:81
-msgid "System notifications will arrive here"
+#: ../../addon/logrot/logrot.php:38
+msgid "Number of logfiles to retain"
msgstr ""
-#: ../../extend/addon/addon/tour/tour.php:82
-msgid "Search for content and users"
+#: ../../addon/frphotos/frphotos.php:91
+msgid "Friendica Photo Album Import"
msgstr ""
-#: ../../extend/addon/addon/tour/tour.php:83
-msgid "Browse for new contacts"
+#: ../../addon/frphotos/frphotos.php:92
+msgid "This will import all your Friendica photo albums to this Red channel."
msgstr ""
-#: ../../extend/addon/addon/tour/tour.php:84
-msgid "Launch installed apps"
+#: ../../addon/frphotos/frphotos.php:93
+msgid "Friendica Server base URL"
msgstr ""
-#: ../../extend/addon/addon/tour/tour.php:85
-msgid "Looking for help? Click here."
+#: ../../addon/frphotos/frphotos.php:94
+msgid "Friendica Login Username"
msgstr ""
-#: ../../extend/addon/addon/tour/tour.php:86
-msgid ""
-"New events have occurred in your network. Click here to see what has "
-"happened!"
+#: ../../addon/frphotos/frphotos.php:95
+msgid "Friendica Login Password"
msgstr ""
-#: ../../extend/addon/addon/tour/tour.php:87
-msgid "You have received a new private message. Click here to see from who!"
+#: ../../addon/donate/donate.php:21
+msgid "Project Servers and Resources"
msgstr ""
-#: ../../extend/addon/addon/tour/tour.php:88
-msgid "There are events this week. Click here too see which!"
+#: ../../addon/donate/donate.php:22
+msgid "Project Creator and Tech Lead"
msgstr ""
-#: ../../extend/addon/addon/tour/tour.php:89
-msgid "You have received a new introduction. Click here to see who!"
+#: ../../addon/donate/donate.php:23
+msgid "Admin, developer, directorymin, support bloke"
msgstr ""
-#: ../../extend/addon/addon/tour/tour.php:90
+#: ../../addon/donate/donate.php:50
msgid ""
-"There is a new system notification. Click here to see what has happened!"
-msgstr ""
-
-#: ../../extend/addon/addon/tour/tour.php:93
-msgid "Click here to share text, images, videos and sound."
-msgstr ""
-
-#: ../../extend/addon/addon/tour/tour.php:94
-msgid "You can write an optional title for your update (good for long posts)."
-msgstr ""
-
-#: ../../extend/addon/addon/tour/tour.php:95
-msgid "Entering some categories here makes it easier to find your post later."
-msgstr ""
-
-#: ../../extend/addon/addon/tour/tour.php:96
-msgid "Share photos, links, location, etc."
+"And the hundreds of other people and organisations who helped make the "
+"Hubzilla possible."
msgstr ""
-#: ../../extend/addon/addon/tour/tour.php:97
+#: ../../addon/donate/donate.php:53
msgid ""
-"Only want to share content for a while? Make it expire at a certain date."
-msgstr ""
-
-#: ../../extend/addon/addon/tour/tour.php:98
-msgid "You can password protect content."
-msgstr ""
-
-#: ../../extend/addon/addon/tour/tour.php:99
-msgid "Choose who you share with."
-msgstr ""
-
-#: ../../extend/addon/addon/tour/tour.php:101
-msgid "Click here when you are done."
-msgstr ""
-
-#: ../../extend/addon/addon/tour/tour.php:104
-msgid "Adjust from which channels posts should be displayed."
-msgstr ""
-
-#: ../../extend/addon/addon/tour/tour.php:105
-msgid "Only show posts from channels in the specified privacy group."
+"The Redmatrix/Hubzilla projects are provided primarily by volunteers giving "
+"their time and expertise - and often paying out of pocket for services they "
+"share with others."
msgstr ""
-#: ../../extend/addon/addon/tour/tour.php:109
+#: ../../addon/donate/donate.php:54
msgid ""
-"Easily find posts containing tags (keywords preceded by the \"#\" symbol)."
-msgstr ""
-
-#: ../../extend/addon/addon/tour/tour.php:110
-msgid "Easily find posts in given category."
-msgstr ""
-
-#: ../../extend/addon/addon/tour/tour.php:111
-msgid "Easily find posts by date."
+"There is no corporate funding and no ads, and we do not collect and sell "
+"your personal information. (We don't control your personal information - "
+"<strong>you do</strong>.)"
msgstr ""
-#: ../../extend/addon/addon/tour/tour.php:112
+#: ../../addon/donate/donate.php:55
msgid ""
-"Suggested users who have volounteered to be shown as suggestions, and who we "
-"think you might find interesting."
-msgstr ""
-
-#: ../../extend/addon/addon/tour/tour.php:113
-msgid "Here you see channels you have connected to."
-msgstr ""
-
-#: ../../extend/addon/addon/tour/tour.php:114
-msgid "Save your search so you can repeat it at a later date."
+"Help support our ground-breaking work in decentralisation, web identity, and "
+"privacy."
msgstr ""
-#: ../../extend/addon/addon/tour/tour.php:117
+#: ../../addon/donate/donate.php:57
msgid ""
-"If you see this icon you can be sure that the sender is who it say it is. It "
-"is normal that it is not always possible to verify the sender, so the icon "
-"will be missing sometimes. There is usually no need to worry about that."
+"Your donations keep servers and services running and also helps us to "
+"provide innovative new features and continued development."
msgstr ""
-#: ../../extend/addon/addon/tour/tour.php:118
-msgid ""
-"Danger! It seems someone tried to forge a message! This message is not "
-"necessarily from who it says it is from!"
+#: ../../addon/donate/donate.php:60
+msgid "Donate"
msgstr ""
-#: ../../extend/addon/addon/tour/tour.php:125
+#: ../../addon/donate/donate.php:62
msgid ""
-"Welcome to Hubzilla! Would you like to see a tour of the UI?</p> <p>You can "
-"pause it at any time and continue where you left off by reloading the page, "
-"or navigting to another page.</p><p>You can also advance by pressing the "
-"return key"
-msgstr ""
-
-#: ../../extend/addon/addon/twitter/twitter.php:99
-msgid "Post to Twitter"
+"Choose a project, developer, or public hub to support with a one-time "
+"donation"
msgstr ""
-#: ../../extend/addon/addon/twitter/twitter.php:154
-msgid "Twitter settings updated."
+#: ../../addon/donate/donate.php:63
+msgid "Donate Now"
msgstr ""
-#: ../../extend/addon/addon/twitter/twitter.php:183
+#: ../../addon/donate/donate.php:64
msgid ""
-"No consumer key pair for Twitter found. Please contact your site "
-"administrator."
+"<strong><em>Or</em></strong> become a project sponsor (Hubzilla Project only)"
msgstr ""
-#: ../../extend/addon/addon/twitter/twitter.php:205
+#: ../../addon/donate/donate.php:65
msgid ""
-"At this Hubzilla instance the Twitter plugin was enabled but you have not "
-"yet connected your account to your Twitter account. To do so click the "
-"button below to get a PIN from Twitter which you have to copy into the input "
-"box below and submit the form. Only your <strong>public</strong> posts will "
-"be posted to Twitter."
+"Please indicate if you would like your first name or full name (or nothing) "
+"to appear in our sponsor listing"
msgstr ""
-#: ../../extend/addon/addon/twitter/twitter.php:207
-msgid "Log in with Twitter"
+#: ../../addon/donate/donate.php:66
+msgid "Sponsor"
msgstr ""
-#: ../../extend/addon/addon/twitter/twitter.php:210
-msgid "Copy the PIN from Twitter here"
+#: ../../addon/donate/donate.php:69
+msgid "Special thanks to: "
msgstr ""
-#: ../../extend/addon/addon/twitter/twitter.php:237
+#: ../../addon/chords/Mod_Chords.php:44
msgid ""
-"<strong>Note:</strong> Due your privacy settings (<em>Hide your profile "
-"details from unknown viewers?</em>) the link potentially included in public "
-"postings relayed to Twitter will lead the visitor to a blank page informing "
-"the visitor that the access to your profile has been restricted."
+"This is a fairly comprehensive and complete guitar chord dictionary which "
+"will list most of the available ways to play a certain chord, starting from "
+"the base of the fingerboard up to a few frets beyond the twelfth fret "
+"(beyond which everything repeats). A couple of non-standard tunings are "
+"provided for the benefit of slide players, etc."
msgstr ""
-#: ../../extend/addon/addon/twitter/twitter.php:242
-msgid "Allow posting to Twitter"
+#: ../../addon/chords/Mod_Chords.php:46
+msgid ""
+"Chord names start with a root note (A-G) and may include sharps (#) and "
+"flats (b). This software will parse most of the standard naming conventions "
+"such as maj, min, dim, sus(2 or 4), aug, with optional repeating elements."
msgstr ""
-#: ../../extend/addon/addon/twitter/twitter.php:242
+#: ../../addon/chords/Mod_Chords.php:48
msgid ""
-"If enabled your public postings can be posted to the associated Twitter "
-"account"
+"Valid examples include A, A7, Am7, Amaj7, Amaj9, Ammaj7, Aadd4, Asus2Add4, "
+"E7b13b11 ..."
msgstr ""
-#: ../../extend/addon/addon/twitter/twitter.php:246
-msgid "Send public postings to Twitter by default"
+#: ../../addon/chords/Mod_Chords.php:51
+msgid "Guitar Chords"
msgstr ""
-#: ../../extend/addon/addon/twitter/twitter.php:246
-msgid ""
-"If enabled your public postings will be posted to the associated Twitter "
-"account by default"
+#: ../../addon/chords/Mod_Chords.php:52
+msgid "The complete online chord dictionary"
msgstr ""
-#: ../../extend/addon/addon/twitter/twitter.php:264
-msgid "Twitter Post Settings"
+#: ../../addon/chords/Mod_Chords.php:57
+msgid "Tuning"
msgstr ""
-#: ../../extend/addon/addon/twitter/twitter.php:773
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:95
-msgid "Submit Settings"
+#: ../../addon/chords/Mod_Chords.php:58
+msgid "Chord name: example: Em7"
msgstr ""
-#: ../../extend/addon/addon/upload_limits/upload_limits.php:25
-msgid "Show Upload Limits"
+#: ../../addon/chords/Mod_Chords.php:59
+msgid "Show for left handed stringing"
msgstr ""
-#: ../../extend/addon/addon/upload_limits/upload_limits.php:27
-msgid "Hubzilla configured maximum size: "
+#: ../../addon/chords/chords.php:33
+msgid "Quick Reference"
msgstr ""
-#: ../../extend/addon/addon/upload_limits/upload_limits.php:28
-msgid "PHP upload_max_filesize: "
+#: ../../addon/libertree/libertree.php:38
+msgid "Post to Libertree"
msgstr ""
-#: ../../extend/addon/addon/upload_limits/upload_limits.php:29
-msgid "PHP post_max_size (must be larger than upload_max_filesize): "
+#: ../../addon/libertree/libertree.php:69
+msgid "Enable Libertree Post Plugin"
msgstr ""
-#: ../../extend/addon/addon/visage/visage.php:93
-msgid "Recent Channel/Profile Viewers"
+#: ../../addon/libertree/libertree.php:73
+msgid "Libertree API token"
msgstr ""
-#: ../../extend/addon/addon/visage/visage.php:98
-msgid "This plugin/addon has not been configured."
+#: ../../addon/libertree/libertree.php:77
+msgid "Libertree site URL"
msgstr ""
-#: ../../extend/addon/addon/visage/visage.php:99
-#, php-format
-msgid "Please visit the Visage settings on %s"
+#: ../../addon/libertree/libertree.php:81
+msgid "Post to Libertree by default"
msgstr ""
-#: ../../extend/addon/addon/visage/visage.php:99
-msgid "your feature settings page"
+#: ../../addon/libertree/libertree.php:85
+msgid "Libertree Post Settings"
msgstr ""
-#: ../../extend/addon/addon/visage/visage.php:112
-msgid "No entries."
+#: ../../addon/libertree/libertree.php:99
+msgid "Libertree Settings saved."
msgstr ""
-#: ../../extend/addon/addon/visage/visage.php:166
-msgid "Enable Visage Visitor Logging"
+#: ../../addon/flattrwidget/flattrwidget.php:45
+msgid "Flattr this!"
msgstr ""
-#: ../../extend/addon/addon/visage/visage.php:170
-msgid "Visage Settings"
+#: ../../addon/flattrwidget/flattrwidget.php:83
+msgid "Flattr widget settings updated."
msgstr ""
-#: ../../extend/addon/addon/wholikesme/wholikesme.php:29
-msgid "Who likes me?"
+#: ../../addon/flattrwidget/flattrwidget.php:100
+msgid "Flattr user"
msgstr ""
-#: ../../extend/addon/addon/wppost/wppost.php:45
-msgid "Post to WordPress"
+#: ../../addon/flattrwidget/flattrwidget.php:104
+msgid "URL of the Thing to flattr"
msgstr ""
-#: ../../extend/addon/addon/wppost/wppost.php:82
-msgid "Enable WordPress Post Plugin"
+#: ../../addon/flattrwidget/flattrwidget.php:104
+msgid "If empty channel URL is used"
msgstr ""
-#: ../../extend/addon/addon/wppost/wppost.php:86
-msgid "WordPress username"
+#: ../../addon/flattrwidget/flattrwidget.php:108
+msgid "Title of the Thing to flattr"
msgstr ""
-#: ../../extend/addon/addon/wppost/wppost.php:90
-msgid "WordPress password"
+#: ../../addon/flattrwidget/flattrwidget.php:108
+msgid "If empty \"channel name on The Hubzilla\" will be used"
msgstr ""
-#: ../../extend/addon/addon/wppost/wppost.php:94
-msgid "WordPress API URL"
+#: ../../addon/flattrwidget/flattrwidget.php:112
+msgid "Static or dynamic flattr button"
msgstr ""
-#: ../../extend/addon/addon/wppost/wppost.php:95
-msgid "Typically https://your-blog.tld/xmlrpc.php"
+#: ../../addon/flattrwidget/flattrwidget.php:112
+msgid "static"
msgstr ""
-#: ../../extend/addon/addon/wppost/wppost.php:98
-msgid "WordPress blogid"
+#: ../../addon/flattrwidget/flattrwidget.php:112
+msgid "dynamic"
msgstr ""
-#: ../../extend/addon/addon/wppost/wppost.php:99
-msgid "For multi-user sites such as wordpress.com, otherwise leave blank"
+#: ../../addon/flattrwidget/flattrwidget.php:116
+msgid "Alignment of the widget"
msgstr ""
-#: ../../extend/addon/addon/wppost/wppost.php:105
-msgid "Post to WordPress by default"
+#: ../../addon/flattrwidget/flattrwidget.php:116
+msgid "left"
msgstr ""
-#: ../../extend/addon/addon/wppost/wppost.php:109
-msgid "Forward comments (requires hubzilla_wp plugin)"
+#: ../../addon/flattrwidget/flattrwidget.php:116
+msgid "right"
msgstr ""
-#: ../../extend/addon/addon/wppost/wppost.php:113
-msgid "WordPress Post Settings"
+#: ../../addon/flattrwidget/flattrwidget.php:120
+msgid "Enable Flattr widget"
msgstr ""
-#: ../../extend/addon/addon/wppost/wppost.php:129
-msgid "Wordpress Settings saved."
+#: ../../addon/flattrwidget/flattrwidget.php:124
+msgid "Flattr Widget Settings"
msgstr ""
-#: ../../extend/addon/addon/xmpp/xmpp.php:31
-msgid "XMPP settings updated."
+#: ../../addon/statusnet/statusnet.php:143
+msgid "Post to GNU social"
msgstr ""
-#: ../../extend/addon/addon/xmpp/xmpp.php:53
-msgid "Enable Chat"
+#: ../../addon/statusnet/statusnet.php:195
+msgid ""
+"Please contact your site administrator.<br />The provided API URL is not "
+"valid."
msgstr ""
-#: ../../extend/addon/addon/xmpp/xmpp.php:58
-msgid "Individual credentials"
+#: ../../addon/statusnet/statusnet.php:232
+msgid "We could not contact the GNU social API with the Path you entered."
msgstr ""
-#: ../../extend/addon/addon/xmpp/xmpp.php:64
-msgid "Jabber BOSH server"
+#: ../../addon/statusnet/statusnet.php:266
+msgid "GNU social settings updated."
msgstr ""
-#: ../../extend/addon/addon/xmpp/xmpp.php:69
-msgid "XMPP Settings"
+#: ../../addon/statusnet/statusnet.php:310
+msgid "Globally Available GNU social OAuthKeys"
msgstr ""
-#: ../../extend/addon/addon/xmpp/xmpp.php:92
-msgid "Jabber BOSH host"
+#: ../../addon/statusnet/statusnet.php:312
+msgid ""
+"There are preconfigured OAuth key pairs for some GNU social servers "
+"available. If you are using one of them, please use these credentials.<br /"
+">If not feel free to connect to any other GNU social instance (see below)."
msgstr ""
-#: ../../extend/addon/addon/xmpp/xmpp.php:93
-msgid "Use central userbase"
+#: ../../addon/statusnet/statusnet.php:327
+msgid "Provide your own OAuth Credentials"
msgstr ""
-#: ../../extend/addon/addon/xmpp/xmpp.php:93
+#: ../../addon/statusnet/statusnet.php:329
msgid ""
-"If enabled, members will automatically login to an ejabberd server that has "
-"to be installed on this machine with synchronized credentials via the "
-"\"auth_ejabberd.php\" script."
-msgstr ""
-
-#: ../../extend/addon/addon/cdav/include/widgets.php:37
-msgid "Select Channel"
+"No consumer key pair for GNU social found. Register your Hubzilla Account as "
+"an desktop client on your GNU social account, copy the consumer key pair "
+"here and enter the API base root.<br />Before you register your own OAuth "
+"key pair ask the administrator if there is already a key pair for this "
+"Hubzilla installation at your favourite GNU social installation."
msgstr ""
-#: ../../extend/addon/addon/cdav/include/widgets.php:42
-msgid "Read-write"
+#: ../../addon/statusnet/statusnet.php:333
+msgid "OAuth Consumer Key"
msgstr ""
-#: ../../extend/addon/addon/cdav/include/widgets.php:43
-msgid "Read-only"
+#: ../../addon/statusnet/statusnet.php:337
+msgid "OAuth Consumer Secret"
msgstr ""
-#: ../../extend/addon/addon/cdav/include/widgets.php:116
-msgid "My Calendars"
+#: ../../addon/statusnet/statusnet.php:341
+msgid "Base API Path"
msgstr ""
-#: ../../extend/addon/addon/cdav/include/widgets.php:118
-msgid "Shared Calendars"
+#: ../../addon/statusnet/statusnet.php:341
+msgid "Remember the trailing /"
msgstr ""
-#: ../../extend/addon/addon/cdav/include/widgets.php:122
-msgid "Share this calendar"
+#: ../../addon/statusnet/statusnet.php:345
+msgid "GNU social application name"
msgstr ""
-#: ../../extend/addon/addon/cdav/include/widgets.php:124
-msgid "Calendar name and color"
+#: ../../addon/statusnet/statusnet.php:368
+msgid ""
+"To connect to your GNU social account click the button below to get a "
+"security code from GNU social which you have to copy into the input box "
+"below and submit the form. Only your <strong>public</strong> posts will be "
+"posted to GNU social."
msgstr ""
-#: ../../extend/addon/addon/cdav/include/widgets.php:126
-msgid "Create new calendar"
+#: ../../addon/statusnet/statusnet.php:370
+msgid "Log in with GNU social"
msgstr ""
-#: ../../extend/addon/addon/cdav/include/widgets.php:128
-msgid "Calendar Name"
+#: ../../addon/statusnet/statusnet.php:373
+msgid "Copy the security code from GNU social here"
msgstr ""
-#: ../../extend/addon/addon/cdav/include/widgets.php:129
-msgid "Calendar Tools"
+#: ../../addon/statusnet/statusnet.php:383
+msgid "Cancel Connection Process"
msgstr ""
-#: ../../extend/addon/addon/cdav/include/widgets.php:130
-msgid "Import calendar"
+#: ../../addon/statusnet/statusnet.php:385
+msgid "Current GNU social API is"
msgstr ""
-#: ../../extend/addon/addon/cdav/include/widgets.php:131
-msgid "Select a calendar to import to"
+#: ../../addon/statusnet/statusnet.php:389
+msgid "Cancel GNU social Connection"
msgstr ""
-#: ../../extend/addon/addon/cdav/include/widgets.php:158
-msgid "Addressbooks"
+#: ../../addon/statusnet/statusnet.php:401 ../../addon/twitter/twitter.php:232
+msgid "Currently connected to: "
msgstr ""
-#: ../../extend/addon/addon/cdav/include/widgets.php:160
-msgid "Addressbook name"
+#: ../../addon/statusnet/statusnet.php:406
+msgid ""
+"<strong>Note</strong>: Due your privacy settings (<em>Hide your profile "
+"details from unknown viewers?</em>) the link potentially included in public "
+"postings relayed to GNU social will lead the visitor to a blank page "
+"informing the visitor that the access to your profile has been restricted."
msgstr ""
-#: ../../extend/addon/addon/cdav/include/widgets.php:162
-msgid "Create new addressbook"
+#: ../../addon/statusnet/statusnet.php:411
+msgid "Allow posting to GNU social"
msgstr ""
-#: ../../extend/addon/addon/cdav/include/widgets.php:163
-msgid "Addressbook Name"
+#: ../../addon/statusnet/statusnet.php:411
+msgid ""
+"If enabled your public postings can be posted to the associated GNU-social "
+"account"
msgstr ""
-#: ../../extend/addon/addon/cdav/include/widgets.php:165
-msgid "Addressbook Tools"
+#: ../../addon/statusnet/statusnet.php:415
+msgid "Post to GNU social by default"
msgstr ""
-#: ../../extend/addon/addon/cdav/include/widgets.php:166
-msgid "Import addressbook"
+#: ../../addon/statusnet/statusnet.php:415
+msgid ""
+"If enabled your public postings will be posted to the associated GNU-social "
+"account by default"
msgstr ""
-#: ../../extend/addon/addon/cdav/include/widgets.php:167
-msgid "Select an addressbook to import to"
+#: ../../addon/statusnet/statusnet.php:424 ../../addon/twitter/twitter.php:255
+msgid "Clear OAuth configuration"
msgstr ""
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:744
-msgid "INVALID EVENT DISMISSED!"
+#: ../../addon/statusnet/statusnet.php:432
+msgid "GNU social Post Settings"
msgstr ""
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:745
-msgid "Summary: "
+#: ../../addon/statusnet/statusnet.php:891
+msgid "API URL"
msgstr ""
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:746
-msgid "Date: "
+#: ../../addon/statusnet/statusnet.php:894
+msgid "Application name"
msgstr ""
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:747
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:754
-msgid "Reason: "
+#: ../../addon/qrator/qrator.php:48
+msgid "QR code"
msgstr ""
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:752
-msgid "INVALID CARD DISMISSED!"
+#: ../../addon/qrator/qrator.php:63
+msgid "QR Generator"
msgstr ""
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:753
-msgid "Name: "
+#: ../../addon/qrator/qrator.php:64
+msgid "Enter some text"
msgstr ""
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:770
-msgid ""
-"You have to enable this plugin in Feature/Addon Settings > CalDAV/CardDAV "
-"Settings before you can use it."
+#: ../../addon/chess/chess.php:276 ../../addon/chess/chess.php:433
+msgid "Invalid game."
msgstr ""
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:836
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:837
-msgid "Example: YYYY-MM-DD HH:mm"
+#: ../../addon/chess/chess.php:282 ../../addon/chess/chess.php:439
+msgid "You are not a player in this game."
msgstr ""
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:837
-msgid "End date and time"
+#: ../../addon/chess/chess.php:315
+msgid "You must be a local channel to create a game."
msgstr ""
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:852
-msgid "List month"
+#: ../../addon/chess/chess.php:333
+msgid "You must select one opponent that is not yourself."
msgstr ""
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:853
-msgid "List week"
+#: ../../addon/chess/chess.php:336
+msgid "Creating new game..."
msgstr ""
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:854
-msgid "List day"
+#: ../../addon/chess/chess.php:342
+msgid "You must select white or black."
msgstr ""
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:861
-msgid "More"
+#: ../../addon/chess/chess.php:349
+msgid "Error creating new game."
msgstr ""
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:862
-msgid "Less"
+#: ../../addon/chess/chess.php:381 ../../include/channel.php:899
+msgid "Requested channel is not available."
msgstr ""
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:863
-msgid "Select calendar"
+#: ../../addon/chess/chess.php:395
+msgid "You must select a local channel /chess/channelname"
msgstr ""
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:865
-msgid "Delete all"
+#: ../../addon/chess/chess.php:923
+msgid "Enable notifications"
msgstr ""
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:867
-msgid "Sorry! Editing of recurrent events is not yet implemented."
+#: ../../addon/twitter/twitter.php:99
+msgid "Post to Twitter"
msgstr ""
-#: ../../extend/addon/addon/cdav/cdav.php:36
-msgid "Errors encountered creating database table: "
+#: ../../addon/twitter/twitter.php:154
+msgid "Twitter settings updated."
msgstr ""
-#: ../../extend/addon/addon/cdav/cdav.php:197
-msgid "Default Calendar"
+#: ../../addon/twitter/twitter.php:183
+msgid ""
+"No consumer key pair for Twitter found. Please contact your site "
+"administrator."
msgstr ""
-#: ../../extend/addon/addon/cdav/cdav.php:206
-msgid "Default Addressbook"
+#: ../../addon/twitter/twitter.php:205
+msgid ""
+"At this Hubzilla instance the Twitter plugin was enabled but you have not "
+"yet connected your account to your Twitter account. To do so click the "
+"button below to get a PIN from Twitter which you have to copy into the input "
+"box below and submit the form. Only your <strong>public</strong> posts will "
+"be posted to Twitter."
msgstr ""
-#: ../../extend/addon/addon/cdav/cdav.php:215
-msgid "CalDAV/CardDAV Settings saved."
+#: ../../addon/twitter/twitter.php:207
+msgid "Log in with Twitter"
msgstr ""
-#: ../../extend/addon/addon/cdav/cdav.php:234
-msgid "Enable CalDAV/CardDAV Server for this channel"
+#: ../../addon/twitter/twitter.php:210
+msgid "Copy the PIN from Twitter here"
msgstr ""
-#: ../../extend/addon/addon/cdav/cdav.php:237
-#, php-format
-msgid "Your CalDAV resources are located at %s "
+#: ../../addon/twitter/twitter.php:237
+msgid ""
+"<strong>Note:</strong> Due your privacy settings (<em>Hide your profile "
+"details from unknown viewers?</em>) the link potentially included in public "
+"postings relayed to Twitter will lead the visitor to a blank page informing "
+"the visitor that the access to your profile has been restricted."
msgstr ""
-#: ../../extend/addon/addon/cdav/cdav.php:240
-#, php-format
-msgid "Your CardDAV resources are located at %s "
+#: ../../addon/twitter/twitter.php:242
+msgid "Allow posting to Twitter"
msgstr ""
-#: ../../extend/addon/addon/cdav/cdav.php:246
-msgid "CalDAV/CardDAV Settings"
+#: ../../addon/twitter/twitter.php:242
+msgid ""
+"If enabled your public postings can be posted to the associated Twitter "
+"account"
msgstr ""
-#: ../../extend/addon/addon/cdav/cdav.php:272
-#: ../../include/connections.php:896
-msgid "Home, Voice"
+#: ../../addon/twitter/twitter.php:246
+msgid "Send public postings to Twitter by default"
msgstr ""
-#: ../../extend/addon/addon/cdav/cdav.php:273
-#: ../../include/connections.php:897
-msgid "Home, Fax"
+#: ../../addon/twitter/twitter.php:246
+msgid ""
+"If enabled your public postings will be posted to the associated Twitter "
+"account by default"
msgstr ""
-#: ../../extend/addon/addon/cdav/cdav.php:275
-#: ../../include/connections.php:899
-msgid "Work, Voice"
+#: ../../addon/twitter/twitter.php:264
+msgid "Twitter Post Settings"
msgstr ""
-#: ../../extend/addon/addon/cdav/cdav.php:276
-#: ../../include/connections.php:900
-msgid "Work, Fax"
+#: ../../addon/smileybutton/smileybutton.php:273
+msgid "Deactivate the feature"
msgstr ""
-#: ../../extend/addon/addon/chess/chess.php:276
-#: ../../extend/addon/addon/chess/chess.php:430
-msgid "Invalid game."
+#: ../../addon/smileybutton/smileybutton.php:277
+msgid "Hide the button and show the smilies directly."
msgstr ""
-#: ../../extend/addon/addon/chess/chess.php:282
-#: ../../extend/addon/addon/chess/chess.php:436
-msgid "You are not a player in this game."
+#: ../../addon/smileybutton/smileybutton.php:281
+msgid "Smileybutton Settings"
msgstr ""
-#: ../../extend/addon/addon/chess/chess.php:315
-msgid "You must be a local channel to create a game."
+#: ../../addon/piwik/piwik.php:85
+msgid ""
+"This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> "
+"analytics tool."
msgstr ""
-#: ../../extend/addon/addon/chess/chess.php:333
-msgid "You must select one opponent that is not yourself."
+#: ../../addon/piwik/piwik.php:88
+#, php-format
+msgid ""
+"If you do not want that your visits are logged this way you <a href='%s'>can "
+"set a cookie to prevent Piwik from tracking further visits of the site</a> "
+"(opt-out)."
msgstr ""
-#: ../../extend/addon/addon/chess/chess.php:336
-msgid "Creating new game..."
+#: ../../addon/piwik/piwik.php:96
+msgid "Piwik Base URL"
msgstr ""
-#: ../../extend/addon/addon/chess/chess.php:342
-msgid "You must select white or black."
+#: ../../addon/piwik/piwik.php:96
+msgid ""
+"Absolute path to your Piwik installation. (without protocol (http/s), with "
+"trailing slash)"
msgstr ""
-#: ../../extend/addon/addon/chess/chess.php:349
-msgid "Error creating new game."
+#: ../../addon/piwik/piwik.php:97
+msgid "Site ID"
msgstr ""
-#: ../../extend/addon/addon/chess/chess.php:379 ../../include/channel.php:899
-msgid "Requested channel is not available."
+#: ../../addon/piwik/piwik.php:98
+msgid "Show opt-out cookie link?"
msgstr ""
-#: ../../extend/addon/addon/chess/chess.php:392
-msgid "You must select a local channel /chess/channelname"
+#: ../../addon/piwik/piwik.php:99
+msgid "Asynchronous tracking"
msgstr ""
-#: ../../extend/addon/addon/chess/chess.php:920
-msgid "Enable notifications"
+#: ../../addon/piwik/piwik.php:100
+msgid "Enable frontend JavaScript error tracking"
msgstr ""
-#: ../../extend/addon/addon/likebanner/likebanner.php:51
-msgid "Your Webbie:"
+#: ../../addon/piwik/piwik.php:100
+msgid "This feature requires Piwik >= 2.2.0"
msgstr ""
-#: ../../extend/addon/addon/likebanner/likebanner.php:54
-msgid "Fontsize (px):"
+#: ../../addon/tour/tour.php:75
+msgid "Edit your profile and change settings."
msgstr ""
-#: ../../extend/addon/addon/likebanner/likebanner.php:68
-msgid "Link:"
+#: ../../addon/tour/tour.php:76
+msgid "Click here to see activity from your connections."
msgstr ""
-#: ../../extend/addon/addon/likebanner/likebanner.php:70
-msgid "Like us on Hubzilla"
+#: ../../addon/tour/tour.php:77
+msgid "Click here to see your channel home."
msgstr ""
-#: ../../extend/addon/addon/likebanner/likebanner.php:72
-msgid "Embed:"
+#: ../../addon/tour/tour.php:78
+msgid "You can access your private messages from here."
msgstr ""
-#: ../../extend/addon/addon/openid/Mod_Id.php:85
-#: ../../include/selectors.php:49 ../../include/selectors.php:66
-msgid "Male"
+#: ../../addon/tour/tour.php:79
+msgid "Create new events here."
msgstr ""
-#: ../../extend/addon/addon/openid/Mod_Id.php:87
-#: ../../include/selectors.php:49 ../../include/selectors.php:66
-msgid "Female"
+#: ../../addon/tour/tour.php:80
+msgid ""
+"You can accept new connections and change permissions for existing ones "
+"here. You can also e.g. create groups of contacts."
msgstr ""
-#: ../../extend/addon/addon/openid/MysqlProvider.php:52
-msgid "First Name"
+#: ../../addon/tour/tour.php:81
+msgid "System notifications will arrive here"
msgstr ""
-#: ../../extend/addon/addon/openid/MysqlProvider.php:53
-msgid "Last Name"
+#: ../../addon/tour/tour.php:82
+msgid "Search for content and users"
msgstr ""
-#: ../../extend/addon/addon/openid/MysqlProvider.php:55
-msgid "Full Name"
+#: ../../addon/tour/tour.php:83
+msgid "Browse for new contacts"
msgstr ""
-#: ../../extend/addon/addon/openid/MysqlProvider.php:61
-msgid "Profile Photo 16px"
+#: ../../addon/tour/tour.php:84
+msgid "Launch installed apps"
msgstr ""
-#: ../../extend/addon/addon/openid/MysqlProvider.php:62
-msgid "Profile Photo 32px"
+#: ../../addon/tour/tour.php:85
+msgid "Looking for help? Click here."
msgstr ""
-#: ../../extend/addon/addon/openid/MysqlProvider.php:63
-msgid "Profile Photo 48px"
+#: ../../addon/tour/tour.php:86
+msgid ""
+"New events have occurred in your network. Click here to see what has "
+"happened!"
msgstr ""
-#: ../../extend/addon/addon/openid/MysqlProvider.php:64
-msgid "Profile Photo 64px"
+#: ../../addon/tour/tour.php:87
+msgid "You have received a new private message. Click here to see from who!"
msgstr ""
-#: ../../extend/addon/addon/openid/MysqlProvider.php:65
-msgid "Profile Photo 80px"
+#: ../../addon/tour/tour.php:88
+msgid "There are events this week. Click here too see which!"
msgstr ""
-#: ../../extend/addon/addon/openid/MysqlProvider.php:66
-msgid "Profile Photo 128px"
+#: ../../addon/tour/tour.php:89
+msgid "You have received a new introduction. Click here to see who!"
msgstr ""
-#: ../../extend/addon/addon/openid/MysqlProvider.php:67
-msgid "Timezone"
+#: ../../addon/tour/tour.php:90
+msgid ""
+"There is a new system notification. Click here to see what has happened!"
msgstr ""
-#: ../../extend/addon/addon/openid/MysqlProvider.php:70
-msgid "Birth Year"
+#: ../../addon/tour/tour.php:93
+msgid "Click here to share text, images, videos and sound."
msgstr ""
-#: ../../extend/addon/addon/openid/MysqlProvider.php:71
-msgid "Birth Month"
+#: ../../addon/tour/tour.php:94
+msgid "You can write an optional title for your update (good for long posts)."
msgstr ""
-#: ../../extend/addon/addon/openid/MysqlProvider.php:72
-msgid "Birth Day"
+#: ../../addon/tour/tour.php:95
+msgid "Entering some categories here makes it easier to find your post later."
msgstr ""
-#: ../../extend/addon/addon/openid/MysqlProvider.php:73
-msgid "Birthdate"
+#: ../../addon/tour/tour.php:96
+msgid "Share photos, links, location, etc."
msgstr ""
-#: ../../extend/addon/addon/openid/openid.php:49
+#: ../../addon/tour/tour.php:97
msgid ""
-"We encountered a problem while logging in with the OpenID you provided. "
-"Please check the correct spelling of the ID."
+"Only want to share content for a while? Make it expire at a certain date."
msgstr ""
-#: ../../extend/addon/addon/openid/openid.php:49
-msgid "The error message was:"
+#: ../../addon/tour/tour.php:98
+msgid "You can password protect content."
msgstr ""
-#: ../../extend/addon/addon/openid/Mod_Openid.php:30
-msgid "OpenID protocol error. No ID returned."
+#: ../../addon/tour/tour.php:99
+msgid "Choose who you share with."
msgstr ""
-#: ../../extend/addon/addon/openid/Mod_Openid.php:188
-#: ../../include/auth.php:286
-msgid "Login failed."
+#: ../../addon/tour/tour.php:101
+msgid "Click here when you are done."
msgstr ""
-#: ../../extend/addon/addon/diaspora_reconnect/diaspora_reconnect.php:44
-#, php-format
-msgid "Reconnecting %d connections"
+#: ../../addon/tour/tour.php:104
+msgid "Adjust from which channels posts should be displayed."
msgstr ""
-#: ../../extend/addon/addon/diaspora_reconnect/diaspora_reconnect.php:63
-msgid "Diaspora Reconnect"
+#: ../../addon/tour/tour.php:105
+msgid "Only show posts from channels in the specified privacy group."
msgstr ""
-#: ../../extend/addon/addon/diaspora_reconnect/diaspora_reconnect.php:65
+#: ../../addon/tour/tour.php:109
msgid ""
-"Use this form to re-establish Diaspora connections which were initially made "
-"from a different hub."
-msgstr ""
-
-#: ../../extend/addon/addon/diaspora_reconnect/diaspora_reconnect.php:70
-msgid "Reconnect"
-msgstr ""
-
-#: ../../extend/addon/addon/mailtest/mailtest.php:19
-msgid "Send test email"
+"Easily find posts containing tags (keywords preceded by the \"#\" symbol)."
msgstr ""
-#: ../../extend/addon/addon/mailtest/mailtest.php:66
-msgid "Mail sent."
+#: ../../addon/tour/tour.php:110
+msgid "Easily find posts in given category."
msgstr ""
-#: ../../extend/addon/addon/mailtest/mailtest.php:68
-msgid "Sending of mail failed."
+#: ../../addon/tour/tour.php:111
+msgid "Easily find posts by date."
msgstr ""
-#: ../../extend/addon/addon/mailtest/mailtest.php:77
-msgid "Mail Test"
+#: ../../addon/tour/tour.php:112
+msgid ""
+"Suggested users who have volounteered to be shown as suggestions, and who we "
+"think you might find interesting."
msgstr ""
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:57
-msgid "Errors encountered deleting database table "
+#: ../../addon/tour/tour.php:113
+msgid "Here you see channels you have connected to."
msgstr ""
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:96
-msgid "Drop tables when uninstalling?"
+#: ../../addon/tour/tour.php:114
+msgid "Save your search so you can repeat it at a later date."
msgstr ""
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:96
+#: ../../addon/tour/tour.php:117
msgid ""
-"If checked, the Rendezvous database tables will be deleted when the plugin "
-"is uninstalled."
-msgstr ""
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:97
-msgid "Mapbox Access Token"
+"If you see this icon you can be sure that the sender is who it say it is. It "
+"is normal that it is not always possible to verify the sender, so the icon "
+"will be missing sometimes. There is usually no need to worry about that."
msgstr ""
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:97
+#: ../../addon/tour/tour.php:118
msgid ""
-"If you enter a Mapbox access token, it will be used to retrieve map tiles "
-"from Mapbox instead of the default OpenStreetMap tile server."
-msgstr ""
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:162
-msgid "Rendezvous"
+"Danger! It seems someone tried to forge a message! This message is not "
+"necessarily from who it says it is from!"
msgstr ""
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:167
+#: ../../addon/tour/tour.php:125
msgid ""
-"This identity has been deleted by another member due to inactivity. Please "
-"press the \"New identity\" button or refresh the page to register a new "
-"identity. You may use the same name."
+"Welcome to Hubzilla! Would you like to see a tour of the UI?</p> <p>You can "
+"pause it at any time and continue where you left off by reloading the page, "
+"or navigting to another page.</p><p>You can also advance by pressing the "
+"return key"
msgstr ""
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:168
-msgid "Welcome to Rendezvous!"
+#: ../../addon/sendzid/sendzid.php:25
+msgid "Extended Identity Sharing"
msgstr ""
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:169
+#: ../../addon/sendzid/sendzid.php:26
msgid ""
-"Enter your name to join this rendezvous. To begin sharing your location with "
-"the other members, tap the GPS control. When your location is discovered, a "
-"red dot will appear and others will be able to see you on the map."
-msgstr ""
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:171
-msgid "Let's meet here"
-msgstr ""
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:174
-msgid "New marker"
-msgstr ""
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:175
-msgid "Edit marker"
+"Share your identity with all websites on the internet. When disabled, "
+"identity is only shared with sites in the matrix."
msgstr ""
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:176
-msgid "New identity"
+#: ../../addon/tictac/tictac.php:21
+msgid "Three Dimensional Tic-Tac-Toe"
msgstr ""
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:177
-msgid "Delete marker"
+#: ../../addon/tictac/tictac.php:54
+msgid "3D Tic-Tac-Toe"
msgstr ""
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:178
-msgid "Delete member"
+#: ../../addon/tictac/tictac.php:59
+msgid "New game"
msgstr ""
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:179
-msgid "Edit proximity alert"
+#: ../../addon/tictac/tictac.php:60
+msgid "New game with handicap"
msgstr ""
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:180
+#: ../../addon/tictac/tictac.php:61
msgid ""
-"A proximity alert will be issued when this member is within a certain radius "
-"of you.<br><br>Enter a radius in meters (0 to disable):"
-msgstr ""
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:180
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:185
-msgid "distance"
-msgstr ""
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:181
-msgid "Proximity alert distance (meters)"
+"Three dimensional tic-tac-toe is just like the traditional game except that "
+"it is played on multiple levels simultaneously. "
msgstr ""
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:182
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:184
+#: ../../addon/tictac/tictac.php:62
msgid ""
-"A proximity alert will be issued when you are within a certain radius of the "
-"marker location.<br><br>Enter a radius in meters (0 to disable):"
+"In this case there are three levels. You win by getting three in a row on "
+"any level, as well as up, down, and diagonally across the different levels."
msgstr ""
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:183
-msgid "Marker proximity alert"
+#: ../../addon/tictac/tictac.php:64
+msgid ""
+"The handicap game disables the center position on the middle level because "
+"the player claiming this square often has an unfair advantage."
msgstr ""
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:186
-msgid "Reminder note"
+#: ../../addon/tictac/tictac.php:183
+msgid "You go first..."
msgstr ""
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:187
-msgid ""
-"Enter a note to be displayed when you are within the specified proximity..."
+#: ../../addon/tictac/tictac.php:188
+msgid "I'm going first this time..."
msgstr ""
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:199
-msgid "Add new rendezvous"
+#: ../../addon/tictac/tictac.php:194
+msgid "You won!"
msgstr ""
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:200
-msgid ""
-"Create a new rendezvous and share the access link with those you wish to "
-"invite to the group. Those who open the link become members of the "
-"rendezvous. They can view other member locations, add markers to the map, or "
-"share their own locations with the group."
+#: ../../addon/tictac/tictac.php:200 ../../addon/tictac/tictac.php:225
+msgid "\"Cat\" game!"
msgstr ""
-#: ../../extend/addon/addon/firefox/firefox.php:23
-msgid "Install Firefox Sharing Tools"
+#: ../../addon/tictac/tictac.php:223
+msgid "I won!"
msgstr ""
-#: ../../extend/addon/addon/firefox/firefox.php:34
-msgid "Share content from Firefox to $Projectname"
+#: ../../addon/pageheader/pageheader.php:43
+msgid "Message to display on every page on this server"
msgstr ""
-#: ../../extend/addon/addon/firefox/firefox.php:37
-msgid "Install Firefox Sharing Tools to this web browser"
+#: ../../addon/pageheader/pageheader.php:48
+msgid "Pageheader Settings"
msgstr ""
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:105
-msgid "Error retrieving wiki"
+#: ../../addon/pageheader/pageheader.php:64
+msgid "pageheader Settings saved."
msgstr ""
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:112
-msgid "Error creating zip file export folder"
+#: ../../addon/moremoods/moremoods.php:19
+msgid "lonely"
msgstr ""
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:130
-msgid "Error downloading wiki: "
+#: ../../addon/moremoods/moremoods.php:20
+msgid "drunk"
msgstr ""
-#: ../../extend/addon/addon/gitwiki/gitwiki.php:76
-#: ../../include/widgets.php:970
-msgid "Wiki Pages"
+#: ../../addon/moremoods/moremoods.php:21
+msgid "horny"
msgstr ""
-#: ../../extend/addon/addon/gitwiki/gitwiki.php:81
-#: ../../include/widgets.php:976
-msgid "Add new page"
+#: ../../addon/moremoods/moremoods.php:22
+msgid "stoned"
msgstr ""
-#: ../../extend/addon/addon/gitwiki/gitwiki.php:82
-#: ../../include/widgets.php:977
-msgid "Page name"
+#: ../../addon/moremoods/moremoods.php:23
+msgid "fucked up"
msgstr ""
-#: ../../extend/addon/addon/gitwiki/gitwiki.php:95
-#: ../../include/widgets.php:927
-msgid "Wiki List"
+#: ../../addon/moremoods/moremoods.php:24
+msgid "clusterfucked"
msgstr ""
-#: ../../extend/addon/addon/gnusoc/gnusoc.php:129
-msgid "Enable the GNU-Social protocol for this channel"
+#: ../../addon/moremoods/moremoods.php:25
+msgid "crazy"
msgstr ""
-#: ../../extend/addon/addon/opensearch/opensearch.php:26 ../../boot.php:1187
-#, php-format
-msgctxt "opensearch"
-msgid "Search %1$s (%2$s)"
+#: ../../addon/moremoods/moremoods.php:26
+msgid "hurt"
msgstr ""
-#: ../../extend/addon/addon/opensearch/opensearch.php:28 ../../boot.php:1187
-msgctxt "opensearch"
-msgid "$Projectname"
+#: ../../addon/moremoods/moremoods.php:27
+msgid "sleepy"
msgstr ""
-#: ../../extend/addon/addon/opensearch/opensearch.php:43
-msgid "Search $Projectname"
+#: ../../addon/moremoods/moremoods.php:28
+msgid "grumpy"
msgstr ""
-#: ../../include/dba/dba_driver.php:187
-#, php-format
-msgid "Cannot locate DNS info for database server '%s'"
+#: ../../addon/moremoods/moremoods.php:29
+msgid "high"
msgstr ""
-#: ../../include/language.php:367 ../../include/text.php:1783
-msgid "default"
+#: ../../addon/moremoods/moremoods.php:30
+msgid "semi-conscious"
msgstr ""
-#: ../../include/language.php:380
-msgid "Select an alternate language"
+#: ../../addon/moremoods/moremoods.php:31
+msgid "in love"
msgstr ""
-#: ../../include/account.php:35
-msgid "Not a valid email address"
+#: ../../addon/moremoods/moremoods.php:32
+msgid "in lust"
msgstr ""
-#: ../../include/account.php:37
-msgid "Your email domain is not among those allowed on this site"
+#: ../../addon/moremoods/moremoods.php:33
+msgid "naked"
msgstr ""
-#: ../../include/account.php:43
-msgid "Your email address is already registered at this site."
+#: ../../addon/moremoods/moremoods.php:34
+msgid "stinky"
msgstr ""
-#: ../../include/account.php:75
-msgid "An invitation is required."
+#: ../../addon/moremoods/moremoods.php:35
+msgid "sweaty"
msgstr ""
-#: ../../include/account.php:79
-msgid "Invitation could not be verified."
+#: ../../addon/moremoods/moremoods.php:36
+msgid "bleeding out"
msgstr ""
-#: ../../include/account.php:130
-msgid "Please enter the required information."
+#: ../../addon/moremoods/moremoods.php:37
+msgid "victorious"
msgstr ""
-#: ../../include/account.php:198
-msgid "Failed to store account information."
+#: ../../addon/moremoods/moremoods.php:38
+msgid "defeated"
msgstr ""
-#: ../../include/account.php:263
-#, php-format
-msgid "Registration confirmation for %s"
+#: ../../addon/moremoods/moremoods.php:39
+msgid "envious"
msgstr ""
-#: ../../include/account.php:330
-#, php-format
-msgid "Registration request at %s"
+#: ../../addon/moremoods/moremoods.php:40
+msgid "jealous"
msgstr ""
-#: ../../include/account.php:352
-msgid "your registration password"
+#: ../../addon/xmpp/xmpp.php:31
+msgid "XMPP settings updated."
msgstr ""
-#: ../../include/account.php:358 ../../include/account.php:420
-#, php-format
-msgid "Registration details for %s"
+#: ../../addon/xmpp/xmpp.php:53
+msgid "Enable Chat"
msgstr ""
-#: ../../include/account.php:431
-msgid "Account approved."
+#: ../../addon/xmpp/xmpp.php:58
+msgid "Individual credentials"
msgstr ""
-#: ../../include/account.php:471
-#, php-format
-msgid "Registration revoked for %s"
+#: ../../addon/xmpp/xmpp.php:64
+msgid "Jabber BOSH server"
msgstr ""
-#: ../../include/account.php:756 ../../include/account.php:758
-msgid "Click here to upgrade."
+#: ../../addon/xmpp/xmpp.php:69
+msgid "XMPP Settings"
msgstr ""
-#: ../../include/account.php:764
-msgid "This action exceeds the limits set by your subscription plan."
+#: ../../addon/xmpp/xmpp.php:92
+msgid "Jabber BOSH host"
msgstr ""
-#: ../../include/account.php:769
-msgid "This action is not available under your subscription plan."
+#: ../../addon/xmpp/xmpp.php:93
+msgid "Use central userbase"
msgstr ""
-#: ../../include/acl_selectors.php:208
-msgid "Who can see this?"
+#: ../../addon/xmpp/xmpp.php:93
+msgid ""
+"If enabled, members will automatically login to an ejabberd server that has "
+"to be installed on this machine with synchronized credentials via the "
+"\"auth_ejabberd.php\" script."
msgstr ""
-#: ../../include/acl_selectors.php:209
-msgid "Custom selection"
+#: ../../addon/wholikesme/wholikesme.php:29
+msgid "Who likes me?"
msgstr ""
-#: ../../include/acl_selectors.php:210
-msgid ""
-"Select \"Show\" to allow viewing. \"Don't show\" lets you override and limit "
-"the scope of \"Show\"."
+#: ../../addon/pumpio/pumpio.php:148
+msgid "You are now authenticated to pumpio."
msgstr ""
-#: ../../include/acl_selectors.php:211
-msgid "Show"
+#: ../../addon/pumpio/pumpio.php:149
+msgid "return to the featured settings page"
msgstr ""
-#: ../../include/acl_selectors.php:212
-msgid "Don't show"
+#: ../../addon/pumpio/pumpio.php:163
+msgid "Post to Pump.io"
msgstr ""
-#: ../../include/acl_selectors.php:245
-#, php-format
-msgid ""
-"Post permissions %s cannot be changed %s after a post is shared.</br />These "
-"permissions set who is allowed to view the post."
+#: ../../addon/pumpio/pumpio.php:198
+msgid "Pump.io servername"
msgstr ""
-#: ../../include/taxonomy.php:188 ../../include/taxonomy.php:270
-#: ../../include/widgets.php:46 ../../include/widgets.php:469
-#: ../../include/contact_widgets.php:91
-msgid "Categories"
+#: ../../addon/pumpio/pumpio.php:198
+msgid "Without \"http://\" or \"https://\""
msgstr ""
-#: ../../include/taxonomy.php:228 ../../include/taxonomy.php:249
-msgid "Tags"
+#: ../../addon/pumpio/pumpio.php:202
+msgid "Pump.io username"
msgstr ""
-#: ../../include/taxonomy.php:293
-msgid "Keywords"
+#: ../../addon/pumpio/pumpio.php:202
+msgid "Without the servername"
msgstr ""
-#: ../../include/taxonomy.php:314
-msgid "have"
+#: ../../addon/pumpio/pumpio.php:213
+msgid "You are not authenticated to pumpio"
msgstr ""
-#: ../../include/taxonomy.php:314
-msgid "has"
+#: ../../addon/pumpio/pumpio.php:215
+msgid "(Re-)Authenticate your pump.io connection"
msgstr ""
-#: ../../include/taxonomy.php:315
-msgid "want"
+#: ../../addon/pumpio/pumpio.php:219
+msgid "Enable pump.io Post Plugin"
msgstr ""
-#: ../../include/taxonomy.php:315
-msgid "wants"
+#: ../../addon/pumpio/pumpio.php:223
+msgid "Post to pump.io by default"
msgstr ""
-#: ../../include/taxonomy.php:316
-msgid "likes"
+#: ../../addon/pumpio/pumpio.php:227
+msgid "Should posts be public"
msgstr ""
-#: ../../include/taxonomy.php:317
-msgid "dislikes"
+#: ../../addon/pumpio/pumpio.php:231
+msgid "Mirror all public posts"
msgstr ""
-#: ../../include/markdown.php:444
-msgid "Attachments:"
+#: ../../addon/pumpio/pumpio.php:237
+msgid "Pump.io Post Settings"
msgstr ""
-#: ../../include/markdown.php:539 ../../include/event.php:22
-#: ../../include/event.php:69
-msgid "l F d, Y \\@ g:i A"
+#: ../../addon/pumpio/pumpio.php:266
+msgid "PumpIO Settings saved."
msgstr ""
-#: ../../include/markdown.php:541
-msgid "$Projectname event notification:"
+#: ../../addon/ldapauth/ldapauth.php:61
+msgid "An account has been created for you."
msgstr ""
-#: ../../include/markdown.php:545 ../../include/event.php:30
-#: ../../include/event.php:73
-msgid "Starts:"
+#: ../../addon/ldapauth/ldapauth.php:68
+msgid "Authentication successful but rejected: account creation is disabled."
msgstr ""
-#: ../../include/markdown.php:553 ../../include/event.php:40
-#: ../../include/event.php:77
-msgid "Finishes:"
+#: ../../addon/opensearch/opensearch.php:43
+msgid "Search $Projectname"
msgstr ""
-#: ../../include/datetime.php:147
-msgid "Birthday"
+#: ../../addon/redfiles/redfiles.php:119
+msgid "Redmatrix File Storage Import"
msgstr ""
-#: ../../include/datetime.php:149
-msgid "Age: "
+#: ../../addon/redfiles/redfiles.php:120
+msgid "This will import all your Redmatrix cloud files to this channel."
msgstr ""
-#: ../../include/datetime.php:151
-msgid "YYYY-MM-DD or MM-DD"
+#: ../../addon/redfiles/redfilehelper.php:64
+msgid "file"
msgstr ""
-#: ../../include/datetime.php:286 ../../boot.php:2578
-msgid "never"
+#: ../../addon/hubwall/hubwall.php:19
+msgid "Send email to all members"
msgstr ""
-#: ../../include/datetime.php:292
-msgid "less than a second ago"
+#: ../../addon/hubwall/hubwall.php:33
+#, php-format
+msgid "$1%s Administrator"
msgstr ""
-#: ../../include/datetime.php:310
+#: ../../addon/hubwall/hubwall.php:73
#, php-format
-msgctxt "e.g. 22 hours ago, 1 minute ago"
-msgid "%1$d %2$s ago"
+msgid "%1$d of %2$d messages sent."
msgstr ""
-#: ../../include/datetime.php:321
-msgctxt "relative_date"
-msgid "year"
-msgid_plural "years"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../../include/datetime.php:324
-msgctxt "relative_date"
-msgid "month"
-msgid_plural "months"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../../include/datetime.php:327
-msgctxt "relative_date"
-msgid "week"
-msgid_plural "weeks"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../../include/datetime.php:330
-msgctxt "relative_date"
-msgid "day"
-msgid_plural "days"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../../include/datetime.php:333
-msgctxt "relative_date"
-msgid "hour"
-msgid_plural "hours"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../../include/datetime.php:336
-msgctxt "relative_date"
-msgid "minute"
-msgid_plural "minutes"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../../include/datetime.php:339
-msgctxt "relative_date"
-msgid "second"
-msgid_plural "seconds"
-msgstr[0] ""
-msgstr[1] ""
+#: ../../addon/hubwall/hubwall.php:81
+msgid "Send email to all hub members."
+msgstr ""
-#: ../../include/datetime.php:576
-#, php-format
-msgid "%1$s's birthday"
+#: ../../addon/hubwall/hubwall.php:93
+msgid "Sender Email address"
msgstr ""
-#: ../../include/datetime.php:577
-#, php-format
-msgid "Happy Birthday %1$s"
+#: ../../addon/hubwall/hubwall.php:94
+msgid "Test mode (only send to hub administrator)"
msgstr ""
#: ../../include/selectors.php:30
@@ -11258,738 +10982,719 @@ msgstr ""
msgid "Ask me"
msgstr ""
-#: ../../include/connections.php:127
-msgid "New window"
-msgstr ""
-
-#: ../../include/connections.php:128
-msgid "Open the selected location in a different window or browser tab"
-msgstr ""
-
-#: ../../include/connections.php:246
-#, php-format
-msgid "User '%s' deleted"
-msgstr ""
-
-#: ../../include/conversation.php:204
+#: ../../include/conversation.php:200
#, php-format
msgid "%1$s is now connected with %2$s"
msgstr ""
-#: ../../include/conversation.php:239
+#: ../../include/conversation.php:235
#, php-format
msgid "%1$s poked %2$s"
msgstr ""
-#: ../../include/conversation.php:243 ../../include/text.php:1092
-#: ../../include/text.php:1097
+#: ../../include/conversation.php:239 ../../include/text.php:1115
+#: ../../include/text.php:1120
msgid "poked"
msgstr ""
-#: ../../include/conversation.php:690
+#: ../../include/conversation.php:691
#, php-format
msgid "View %s's profile @ %s"
msgstr ""
-#: ../../include/conversation.php:710
+#: ../../include/conversation.php:711
msgid "Categories:"
msgstr ""
-#: ../../include/conversation.php:711
+#: ../../include/conversation.php:712
msgid "Filed under:"
msgstr ""
-#: ../../include/conversation.php:736
+#: ../../include/conversation.php:737
msgid "View in context"
msgstr ""
-#: ../../include/conversation.php:832
+#: ../../include/conversation.php:834
msgid "remove"
msgstr ""
-#: ../../include/conversation.php:836 ../../include/nav.php:292
+#: ../../include/conversation.php:838 ../../include/nav.php:272
msgid "Loading..."
msgstr ""
-#: ../../include/conversation.php:837
+#: ../../include/conversation.php:839
msgid "Delete Selected Items"
msgstr ""
-#: ../../include/conversation.php:930 ../../include/conversation.php:972
+#: ../../include/conversation.php:882
msgid "View Source"
msgstr ""
-#: ../../include/conversation.php:931 ../../include/conversation.php:982
+#: ../../include/conversation.php:892
msgid "Follow Thread"
msgstr ""
-#: ../../include/conversation.php:932 ../../include/conversation.php:991
+#: ../../include/conversation.php:901
msgid "Unfollow Thread"
msgstr ""
-#: ../../include/conversation.php:937 ../../include/conversation.php:1059
+#: ../../include/conversation.php:992
msgid "Activity/Posts"
msgstr ""
-#: ../../include/conversation.php:939 ../../include/conversation.php:1079
+#: ../../include/conversation.php:1012
msgid "Edit Connection"
msgstr ""
-#: ../../include/conversation.php:940 ../../include/conversation.php:1089
+#: ../../include/conversation.php:1022
msgid "Message"
msgstr ""
-#: ../../include/conversation.php:1223
+#: ../../include/conversation.php:1156
#, php-format
msgid "%s likes this."
msgstr ""
-#: ../../include/conversation.php:1223
+#: ../../include/conversation.php:1156
#, php-format
msgid "%s doesn't like this."
msgstr ""
-#: ../../include/conversation.php:1227
+#: ../../include/conversation.php:1160
#, php-format
msgid "<span %1$s>%2$d people</span> like this."
msgid_plural "<span %1$s>%2$d people</span> like this."
msgstr[0] ""
msgstr[1] ""
-#: ../../include/conversation.php:1229
+#: ../../include/conversation.php:1162
#, php-format
msgid "<span %1$s>%2$d people</span> don't like this."
msgid_plural "<span %1$s>%2$d people</span> don't like this."
msgstr[0] ""
msgstr[1] ""
-#: ../../include/conversation.php:1235
+#: ../../include/conversation.php:1168
msgid "and"
msgstr ""
-#: ../../include/conversation.php:1238
+#: ../../include/conversation.php:1171
#, php-format
msgid ", and %d other people"
msgid_plural ", and %d other people"
msgstr[0] ""
msgstr[1] ""
-#: ../../include/conversation.php:1239
+#: ../../include/conversation.php:1172
#, php-format
msgid "%s like this."
msgstr ""
-#: ../../include/conversation.php:1239
+#: ../../include/conversation.php:1172
#, php-format
msgid "%s don't like this."
msgstr ""
-#: ../../include/conversation.php:1282
+#: ../../include/conversation.php:1215
msgid "Set your location"
msgstr ""
-#: ../../include/conversation.php:1283
+#: ../../include/conversation.php:1216
msgid "Clear browser location"
msgstr ""
-#: ../../include/conversation.php:1331
+#: ../../include/conversation.php:1264
msgid "Tag term:"
msgstr ""
-#: ../../include/conversation.php:1332
+#: ../../include/conversation.php:1265
msgid "Where are you right now?"
msgstr ""
-#: ../../include/conversation.php:1337
+#: ../../include/conversation.php:1270
msgid "Choose a different album..."
msgstr ""
-#: ../../include/conversation.php:1341
+#: ../../include/conversation.php:1274
msgid "Comments enabled"
msgstr ""
-#: ../../include/conversation.php:1342
+#: ../../include/conversation.php:1275
msgid "Comments disabled"
msgstr ""
-#: ../../include/conversation.php:1380
+#: ../../include/conversation.php:1313
msgid "Page link name"
msgstr ""
-#: ../../include/conversation.php:1383
+#: ../../include/conversation.php:1316
msgid "Post as"
msgstr ""
-#: ../../include/conversation.php:1397
+#: ../../include/conversation.php:1330
msgid "Toggle voting"
msgstr ""
-#: ../../include/conversation.php:1400
+#: ../../include/conversation.php:1333
msgid "Disable comments"
msgstr ""
-#: ../../include/conversation.php:1401
+#: ../../include/conversation.php:1334
msgid "Toggle comments"
msgstr ""
-#: ../../include/conversation.php:1409
+#: ../../include/conversation.php:1342
msgid "Categories (optional, comma-separated list)"
msgstr ""
-#: ../../include/conversation.php:1432
+#: ../../include/conversation.php:1365
msgid "Other networks and post services"
msgstr ""
-#: ../../include/conversation.php:1438
+#: ../../include/conversation.php:1371
msgid "Set publish date"
msgstr ""
-#: ../../include/conversation.php:1692
+#: ../../include/conversation.php:1634
msgid "Discover"
msgstr ""
-#: ../../include/conversation.php:1695
+#: ../../include/conversation.php:1637
msgid "Imported public streams"
msgstr ""
-#: ../../include/conversation.php:1700
+#: ../../include/conversation.php:1642
msgid "Commented Order"
msgstr ""
-#: ../../include/conversation.php:1703
+#: ../../include/conversation.php:1645
msgid "Sort by Comment Date"
msgstr ""
-#: ../../include/conversation.php:1707
+#: ../../include/conversation.php:1649
msgid "Posted Order"
msgstr ""
-#: ../../include/conversation.php:1710
+#: ../../include/conversation.php:1652
msgid "Sort by Post Date"
msgstr ""
-#: ../../include/conversation.php:1718
+#: ../../include/conversation.php:1660
msgid "Posts that mention or involve you"
msgstr ""
-#: ../../include/conversation.php:1727
+#: ../../include/conversation.php:1669
msgid "Activity Stream - by date"
msgstr ""
-#: ../../include/conversation.php:1733
+#: ../../include/conversation.php:1675
msgid "Starred"
msgstr ""
-#: ../../include/conversation.php:1736
+#: ../../include/conversation.php:1678
msgid "Favourite Posts"
msgstr ""
-#: ../../include/conversation.php:1743
+#: ../../include/conversation.php:1685
msgid "Spam"
msgstr ""
-#: ../../include/conversation.php:1746
+#: ../../include/conversation.php:1688
msgid "Posts flagged as SPAM"
msgstr ""
-#: ../../include/conversation.php:1818
+#: ../../include/conversation.php:1763 ../../include/nav.php:372
msgid "Status Messages and Posts"
msgstr ""
-#: ../../include/conversation.php:1830
+#: ../../include/conversation.php:1776 ../../include/nav.php:385
msgid "Profile Details"
msgstr ""
-#: ../../include/conversation.php:1839 ../../include/photos.php:515
+#: ../../include/conversation.php:1786 ../../include/nav.php:395
+#: ../../include/photos.php:528
msgid "Photo Albums"
msgstr ""
-#: ../../include/conversation.php:1846
+#: ../../include/conversation.php:1794 ../../include/nav.php:403
msgid "Files and Storage"
msgstr ""
-#: ../../include/conversation.php:1866 ../../include/conversation.php:1869
-#: ../../include/widgets.php:902
-msgid "Chatrooms"
-msgstr ""
-
-#: ../../include/conversation.php:1879
+#: ../../include/conversation.php:1830 ../../include/nav.php:438
msgid "Bookmarks"
msgstr ""
-#: ../../include/conversation.php:1882
+#: ../../include/conversation.php:1833 ../../include/nav.php:441
msgid "Saved Bookmarks"
msgstr ""
-#: ../../include/conversation.php:1892
+#: ../../include/conversation.php:1844 ../../include/nav.php:452
msgid "View Webpages"
msgstr ""
-#: ../../include/conversation.php:1958
+#: ../../include/conversation.php:1913
msgctxt "noun"
msgid "Attending"
msgid_plural "Attending"
msgstr[0] ""
msgstr[1] ""
-#: ../../include/conversation.php:1961
+#: ../../include/conversation.php:1916
msgctxt "noun"
msgid "Not Attending"
msgid_plural "Not Attending"
msgstr[0] ""
msgstr[1] ""
-#: ../../include/conversation.php:1964
+#: ../../include/conversation.php:1919
msgctxt "noun"
msgid "Undecided"
msgid_plural "Undecided"
msgstr[0] ""
msgstr[1] ""
-#: ../../include/conversation.php:1967
+#: ../../include/conversation.php:1922
msgctxt "noun"
msgid "Agree"
msgid_plural "Agrees"
msgstr[0] ""
msgstr[1] ""
-#: ../../include/conversation.php:1970
+#: ../../include/conversation.php:1925
msgctxt "noun"
msgid "Disagree"
msgid_plural "Disagrees"
msgstr[0] ""
msgstr[1] ""
-#: ../../include/conversation.php:1973
+#: ../../include/conversation.php:1928
msgctxt "noun"
msgid "Abstain"
msgid_plural "Abstains"
msgstr[0] ""
msgstr[1] ""
-#: ../../include/message.php:32
-msgid "Unable to determine sender."
+#: ../../include/permissions.php:35
+msgid "Can view my normal stream and posts"
msgstr ""
-#: ../../include/message.php:69
-msgid "No recipient provided."
+#: ../../include/permissions.php:39
+msgid "Can view my webpages"
msgstr ""
-#: ../../include/message.php:74
-msgid "[no subject]"
+#: ../../include/permissions.php:43
+msgid "Can post on my channel page (\"wall\")"
msgstr ""
-#: ../../include/message.php:225
-msgid "Stored post could not be verified."
+#: ../../include/permissions.php:46
+msgid "Can like/dislike stuff"
msgstr ""
-#: ../../include/security.php:117
-msgid "guest:"
+#: ../../include/permissions.php:46
+msgid "Profiles and things other than posts/comments"
msgstr ""
-#: ../../include/security.php:532
-msgid ""
-"The form security token was not correct. This probably happened because the "
-"form has been opened for too long (>3 hours) before submitting it."
+#: ../../include/permissions.php:48
+msgid "Can forward to all my channel contacts via post @mentions"
msgstr ""
-#: ../../include/widgets.php:103
-msgid "System"
+#: ../../include/permissions.php:48
+msgid "Advanced - useful for creating group forum channels"
msgstr ""
-#: ../../include/widgets.php:106
-msgid "New App"
+#: ../../include/permissions.php:49
+msgid "Can chat with me (when available)"
msgstr ""
-#: ../../include/widgets.php:107
-msgid "Edit Apps"
+#: ../../include/permissions.php:50
+msgid "Can write to my file storage and photos"
msgstr ""
-#: ../../include/widgets.php:155
-msgid "Suggestions"
+#: ../../include/permissions.php:51
+msgid "Can edit my webpages"
msgstr ""
-#: ../../include/widgets.php:156
-msgid "See more..."
+#: ../../include/permissions.php:53
+msgid "Somewhat advanced - very useful in open communities"
msgstr ""
-#: ../../include/widgets.php:176
-#, php-format
-msgid "You have %1$.0f of %2$.0f allowed connections."
+#: ../../include/permissions.php:55
+msgid "Can administer my channel resources"
msgstr ""
-#: ../../include/widgets.php:182
-msgid "Add New Connection"
+#: ../../include/permissions.php:55
+msgid "Extremely advanced. Leave this alone unless you know what you are doing"
msgstr ""
-#: ../../include/widgets.php:183
-msgid "Enter channel address"
+#: ../../include/dir_fns.php:141
+msgid "Directory Options"
msgstr ""
-#: ../../include/widgets.php:184
-msgid "Examples: bob@example.com, https://example.com/barbara"
+#: ../../include/dir_fns.php:143
+msgid "Safe Mode"
msgstr ""
-#: ../../include/widgets.php:200
-msgid "Notes"
+#: ../../include/dir_fns.php:144
+msgid "Public Forums Only"
msgstr ""
-#: ../../include/widgets.php:276
-msgid "Remove term"
+#: ../../include/dir_fns.php:145
+msgid "This Website Only"
msgstr ""
-#: ../../include/widgets.php:284 ../../include/features.php:301
-msgid "Saved Searches"
+#: ../../include/bookmarks.php:34
+#, php-format
+msgid "%1$s's bookmarks"
msgstr ""
-#: ../../include/widgets.php:285 ../../include/group.php:336
-msgid "add"
+#: ../../include/import.php:41
+msgid ""
+"Cannot create a duplicate channel identifier on this system. Import failed."
msgstr ""
-#: ../../include/widgets.php:347 ../../include/contact_widgets.php:53
-#: ../../include/features.php:390
-msgid "Saved Folders"
+#: ../../include/import.php:105
+msgid "Cloned channel not found. Import failed."
msgstr ""
-#: ../../include/widgets.php:350 ../../include/widgets.php:472
-#: ../../include/contact_widgets.php:56 ../../include/contact_widgets.php:94
-msgid "Everything"
+#: ../../include/text.php:478
+msgid "prev"
msgstr ""
-#: ../../include/widgets.php:391
-msgid "Archives"
+#: ../../include/text.php:480
+msgid "first"
msgstr ""
-#: ../../include/widgets.php:563
-msgid "Refresh"
+#: ../../include/text.php:509
+msgid "last"
msgstr ""
-#: ../../include/widgets.php:603
-msgid "Account settings"
+#: ../../include/text.php:512
+msgid "next"
msgstr ""
-#: ../../include/widgets.php:609
-msgid "Channel settings"
+#: ../../include/text.php:523
+msgid "older"
msgstr ""
-#: ../../include/widgets.php:618
-msgid "Additional features"
+#: ../../include/text.php:525
+msgid "newer"
msgstr ""
-#: ../../include/widgets.php:625
-msgid "Feature/Addon settings"
+#: ../../include/text.php:945
+msgid "No connections"
msgstr ""
-#: ../../include/widgets.php:631
-msgid "Display settings"
+#: ../../include/text.php:970
+#, php-format
+msgid "View all %s connections"
msgstr ""
-#: ../../include/widgets.php:638
-msgid "Manage locations"
+#: ../../include/text.php:1115 ../../include/text.php:1120
+msgid "poke"
msgstr ""
-#: ../../include/widgets.php:645
-msgid "Export channel"
+#: ../../include/text.php:1121
+msgid "ping"
msgstr ""
-#: ../../include/widgets.php:651
-msgid "Connected apps"
+#: ../../include/text.php:1121
+msgid "pinged"
msgstr ""
-#: ../../include/widgets.php:666 ../../include/features.php:153
-msgid "Permission Groups"
+#: ../../include/text.php:1122
+msgid "prod"
msgstr ""
-#: ../../include/widgets.php:683
-msgid "Premium Channel Settings"
+#: ../../include/text.php:1122
+msgid "prodded"
msgstr ""
-#: ../../include/widgets.php:712
-msgid "Private Mail Menu"
+#: ../../include/text.php:1123
+msgid "slap"
msgstr ""
-#: ../../include/widgets.php:714
-msgid "Combined View"
+#: ../../include/text.php:1123
+msgid "slapped"
msgstr ""
-#: ../../include/widgets.php:719 ../../include/nav.php:213
-msgid "Inbox"
+#: ../../include/text.php:1124
+msgid "finger"
msgstr ""
-#: ../../include/widgets.php:724 ../../include/nav.php:214
-msgid "Outbox"
+#: ../../include/text.php:1124
+msgid "fingered"
msgstr ""
-#: ../../include/widgets.php:729 ../../include/nav.php:215
-msgid "New Message"
+#: ../../include/text.php:1125
+msgid "rebuff"
msgstr ""
-#: ../../include/widgets.php:746 ../../include/widgets.php:758
-msgid "Conversations"
+#: ../../include/text.php:1125
+msgid "rebuffed"
msgstr ""
-#: ../../include/widgets.php:750
-msgid "Received Messages"
+#: ../../include/text.php:1137
+msgid "happy"
msgstr ""
-#: ../../include/widgets.php:754
-msgid "Sent Messages"
+#: ../../include/text.php:1138
+msgid "sad"
msgstr ""
-#: ../../include/widgets.php:768
-msgid "No messages."
+#: ../../include/text.php:1139
+msgid "mellow"
msgstr ""
-#: ../../include/widgets.php:786
-msgid "Delete conversation"
+#: ../../include/text.php:1140
+msgid "tired"
msgstr ""
-#: ../../include/widgets.php:812
-msgid "Events Tools"
+#: ../../include/text.php:1141
+msgid "perky"
msgstr ""
-#: ../../include/widgets.php:813
-msgid "Export Calendar"
+#: ../../include/text.php:1142
+msgid "angry"
msgstr ""
-#: ../../include/widgets.php:814
-msgid "Import Calendar"
+#: ../../include/text.php:1143
+msgid "stupefied"
msgstr ""
-#: ../../include/widgets.php:906
-msgid "Overview"
+#: ../../include/text.php:1144
+msgid "puzzled"
msgstr ""
-#: ../../include/widgets.php:913
-msgid "Chat Members"
+#: ../../include/text.php:1145
+msgid "interested"
msgstr ""
-#: ../../include/widgets.php:991
-msgctxt "wiki_history"
-msgid "Message"
+#: ../../include/text.php:1146
+msgid "bitter"
msgstr ""
-#: ../../include/widgets.php:1013
-msgid "Bookmarked Chatrooms"
+#: ../../include/text.php:1147
+msgid "cheerful"
msgstr ""
-#: ../../include/widgets.php:1044
-msgid "Suggested Chatrooms"
+#: ../../include/text.php:1148
+msgid "alive"
msgstr ""
-#: ../../include/widgets.php:1189 ../../include/widgets.php:1301
-msgid "photo/image"
+#: ../../include/text.php:1149
+msgid "annoyed"
msgstr ""
-#: ../../include/widgets.php:1244
-msgid "Click to show more"
+#: ../../include/text.php:1150
+msgid "anxious"
msgstr ""
-#: ../../include/widgets.php:1395
-msgid "Rating Tools"
+#: ../../include/text.php:1151
+msgid "cranky"
msgstr ""
-#: ../../include/widgets.php:1399 ../../include/widgets.php:1401
-msgid "Rate Me"
+#: ../../include/text.php:1152
+msgid "disturbed"
msgstr ""
-#: ../../include/widgets.php:1404
-msgid "View Ratings"
+#: ../../include/text.php:1153
+msgid "frustrated"
msgstr ""
-#: ../../include/widgets.php:1497
-msgid "Forums"
+#: ../../include/text.php:1154
+msgid "depressed"
msgstr ""
-#: ../../include/widgets.php:1526
-msgid "Tasks"
+#: ../../include/text.php:1155
+msgid "motivated"
msgstr ""
-#: ../../include/widgets.php:1592 ../../include/widgets.php:1630
-msgid "Member registrations waiting for confirmation"
+#: ../../include/text.php:1156
+msgid "relaxed"
msgstr ""
-#: ../../include/widgets.php:1598
-msgid "Inspect queue"
+#: ../../include/text.php:1157
+msgid "surprised"
msgstr ""
-#: ../../include/widgets.php:1600
-msgid "DB updates"
+#: ../../include/text.php:1335 ../../include/js_strings.php:70
+msgid "Monday"
msgstr ""
-#: ../../include/widgets.php:1625 ../../include/nav.php:233
-msgid "Admin"
+#: ../../include/text.php:1335 ../../include/js_strings.php:71
+msgid "Tuesday"
msgstr ""
-#: ../../include/widgets.php:1626
-msgid "Plugin Features"
+#: ../../include/text.php:1335 ../../include/js_strings.php:72
+msgid "Wednesday"
msgstr ""
-#: ../../include/zot.php:652
-msgid "Invalid data packet"
+#: ../../include/text.php:1335 ../../include/js_strings.php:73
+msgid "Thursday"
msgstr ""
-#: ../../include/zot.php:668
-msgid "Unable to verify channel signature"
+#: ../../include/text.php:1335 ../../include/js_strings.php:74
+msgid "Friday"
msgstr ""
-#: ../../include/zot.php:2319
-#, php-format
-msgid "Unable to verify site signature for %s"
+#: ../../include/text.php:1335 ../../include/js_strings.php:75
+msgid "Saturday"
msgstr ""
-#: ../../include/zot.php:3725
-msgid "invalid target signature"
+#: ../../include/text.php:1335 ../../include/js_strings.php:69
+msgid "Sunday"
msgstr ""
-#: ../../include/channel.php:33
-msgid "Unable to obtain identity information from database"
+#: ../../include/text.php:1339 ../../include/js_strings.php:45
+msgid "January"
msgstr ""
-#: ../../include/channel.php:67
-msgid "Empty name"
+#: ../../include/text.php:1339 ../../include/js_strings.php:46
+msgid "February"
msgstr ""
-#: ../../include/channel.php:70
-msgid "Name too long"
+#: ../../include/text.php:1339 ../../include/js_strings.php:47
+msgid "March"
msgstr ""
-#: ../../include/channel.php:181
-msgid "No account identifier"
+#: ../../include/text.php:1339 ../../include/js_strings.php:48
+msgid "April"
msgstr ""
-#: ../../include/channel.php:193
-msgid "Nickname is required."
+#: ../../include/text.php:1339
+msgid "May"
msgstr ""
-#: ../../include/channel.php:207
-msgid "Reserved nickname. Please choose another."
+#: ../../include/text.php:1339 ../../include/js_strings.php:50
+msgid "June"
msgstr ""
-#: ../../include/channel.php:212
-msgid ""
-"Nickname has unsupported characters or is already being used on this site."
+#: ../../include/text.php:1339 ../../include/js_strings.php:51
+msgid "July"
msgstr ""
-#: ../../include/channel.php:272
-msgid "Unable to retrieve created identity"
+#: ../../include/text.php:1339 ../../include/js_strings.php:52
+msgid "August"
msgstr ""
-#: ../../include/channel.php:344
-msgid "Default Profile"
+#: ../../include/text.php:1339 ../../include/js_strings.php:53
+msgid "September"
msgstr ""
-#: ../../include/channel.php:1045
-msgid "Create New Profile"
+#: ../../include/text.php:1339 ../../include/js_strings.php:54
+msgid "October"
msgstr ""
-#: ../../include/channel.php:1065
-msgid "Visible to everybody"
+#: ../../include/text.php:1339 ../../include/js_strings.php:55
+msgid "November"
msgstr ""
-#: ../../include/channel.php:1138 ../../include/channel.php:1257
-msgid "Gender:"
+#: ../../include/text.php:1339 ../../include/js_strings.php:56
+msgid "December"
msgstr ""
-#: ../../include/channel.php:1140 ../../include/channel.php:1312
-msgid "Homepage:"
+#: ../../include/text.php:1403 ../../include/text.php:1407
+msgid "Unknown Attachment"
msgstr ""
-#: ../../include/channel.php:1141
-msgid "Online Now"
+#: ../../include/text.php:1409
+msgid "unknown"
msgstr ""
-#: ../../include/channel.php:1262
-msgid "Like this channel"
+#: ../../include/text.php:1445
+msgid "remove category"
msgstr ""
-#: ../../include/channel.php:1286
-msgid "j F, Y"
+#: ../../include/text.php:1519
+msgid "remove from file"
msgstr ""
-#: ../../include/channel.php:1287
-msgid "j F"
+#: ../../include/text.php:1781 ../../include/language.php:367
+msgid "default"
msgstr ""
-#: ../../include/channel.php:1294
-msgid "Birthday:"
+#: ../../include/text.php:1789
+msgid "Page layout"
msgstr ""
-#: ../../include/channel.php:1307
-#, php-format
-msgid "for %1$d %2$s"
+#: ../../include/text.php:1789
+msgid "You can create your own with the layouts tool"
msgstr ""
-#: ../../include/channel.php:1310
-msgid "Sexual Preference:"
+#: ../../include/text.php:1817
+msgid "Page content type"
msgstr ""
-#: ../../include/channel.php:1316
-msgid "Tags:"
+#: ../../include/text.php:1950
+msgid "activity"
msgstr ""
-#: ../../include/channel.php:1318
-msgid "Political Views:"
+#: ../../include/text.php:2264
+msgid "Design Tools"
msgstr ""
-#: ../../include/channel.php:1320
-msgid "Religion:"
+#: ../../include/text.php:2270
+msgid "Pages"
msgstr ""
-#: ../../include/channel.php:1324
-msgid "Hobbies/Interests:"
+#: ../../include/text.php:2292
+msgid "Import website..."
msgstr ""
-#: ../../include/channel.php:1326
-msgid "Likes:"
+#: ../../include/text.php:2293
+msgid "Select folder to import"
msgstr ""
-#: ../../include/channel.php:1328
-msgid "Dislikes:"
+#: ../../include/text.php:2294
+msgid "Import from a zipped folder:"
msgstr ""
-#: ../../include/channel.php:1330
-msgid "Contact information and Social Networks:"
+#: ../../include/text.php:2295
+msgid "Import from cloud files:"
msgstr ""
-#: ../../include/channel.php:1332
-msgid "My other channels:"
+#: ../../include/text.php:2296
+msgid "/cloud/channel/path/to/folder"
msgstr ""
-#: ../../include/channel.php:1334
-msgid "Musical interests:"
+#: ../../include/text.php:2297
+msgid "Enter path to website files"
msgstr ""
-#: ../../include/channel.php:1336
-msgid "Books, literature:"
+#: ../../include/text.php:2298
+msgid "Select folder"
msgstr ""
-#: ../../include/channel.php:1338
-msgid "Television:"
+#: ../../include/text.php:2299
+msgid "Export website..."
msgstr ""
-#: ../../include/channel.php:1340
-msgid "Film/dance/culture/entertainment:"
+#: ../../include/text.php:2300
+msgid "Export to a zip file"
msgstr ""
-#: ../../include/channel.php:1342
-msgid "Love/Romance:"
+#: ../../include/text.php:2301
+msgid "website.zip"
msgstr ""
-#: ../../include/channel.php:1344
-msgid "Work/employment:"
+#: ../../include/text.php:2302
+msgid "Enter a name for the zip file."
msgstr ""
-#: ../../include/channel.php:1346
-msgid "School/education:"
+#: ../../include/text.php:2303
+msgid "Export to cloud files"
msgstr ""
-#: ../../include/channel.php:1369
-msgid "Like this thing"
+#: ../../include/text.php:2304
+msgid "/path/to/export/folder"
msgstr ""
-#: ../../include/page_widgets.php:7
-msgid "New Page"
+#: ../../include/text.php:2305
+msgid "Enter a path to a cloud files destination."
+msgstr ""
+
+#: ../../include/text.php:2306
+msgid "Specify folder"
msgstr ""
#: ../../include/contact_widgets.php:11
@@ -12038,840 +11743,747 @@ msgstr[1] ""
msgid "show more"
msgstr ""
-#: ../../include/selectors.php:123
-msgid "Partners"
-msgstr ""
-
-#: ../../include/selectors.php:123 ../../include/selectors.php:140
-msgid "Cohabiting"
-msgstr ""
-
-#: ../../include/selectors.php:123
-msgid "Common law"
-msgstr ""
-
-#: ../../include/js_strings.php:45 ../../include/text.php:1325
-msgid "January"
+#: ../../include/markdown.php:444
+msgid "Attachments:"
msgstr ""
-#: ../../include/js_strings.php:46 ../../include/text.php:1325
-msgid "February"
+#: ../../include/markdown.php:538 ../../include/event.php:22
+#: ../../include/event.php:69
+msgid "l F d, Y \\@ g:i A"
msgstr ""
-#: ../../include/js_strings.php:47 ../../include/text.php:1325
-msgid "March"
+#: ../../include/markdown.php:540
+msgid "$Projectname event notification:"
msgstr ""
-#: ../../include/js_strings.php:48 ../../include/text.php:1325
-msgid "April"
+#: ../../include/markdown.php:544 ../../include/event.php:30
+#: ../../include/event.php:73
+msgid "Starts:"
msgstr ""
-#: ../../include/js_strings.php:49
-msgctxt "long"
-msgid "May"
+#: ../../include/markdown.php:552 ../../include/event.php:40
+#: ../../include/event.php:77
+msgid "Finishes:"
msgstr ""
-#: ../../include/js_strings.php:50 ../../include/text.php:1325
-msgid "June"
+#: ../../include/follow.php:26
+msgid "Channel is blocked on this site."
msgstr ""
-#: ../../include/js_strings.php:51 ../../include/text.php:1325
-msgid "July"
+#: ../../include/follow.php:31
+msgid "Channel location missing."
msgstr ""
-#: ../../include/js_strings.php:52 ../../include/text.php:1325
-msgid "August"
+#: ../../include/follow.php:73
+msgid "Response from remote channel was incomplete."
msgstr ""
-#: ../../include/js_strings.php:53 ../../include/text.php:1325
-msgid "September"
+#: ../../include/follow.php:90
+msgid "Channel was deleted and no longer exists."
msgstr ""
-#: ../../include/js_strings.php:54 ../../include/text.php:1325
-msgid "October"
+#: ../../include/follow.php:140 ../../include/follow.php:175
+msgid "Protocol disabled."
msgstr ""
-#: ../../include/js_strings.php:55 ../../include/text.php:1325
-msgid "November"
+#: ../../include/follow.php:163
+msgid "Channel discovery failed."
msgstr ""
-#: ../../include/js_strings.php:56 ../../include/text.php:1325
-msgid "December"
+#: ../../include/follow.php:202
+msgid "Cannot connect to yourself."
msgstr ""
-#: ../../include/js_strings.php:57
-msgid "Jan"
+#: ../../include/js_strings.php:5
+msgid "Delete this item?"
msgstr ""
-#: ../../include/selectors.php:123
-msgid "Swinger"
+#: ../../include/js_strings.php:8
+#, php-format
+msgid "%s show less"
msgstr ""
-#: ../../include/selectors.php:123
-msgid "Betrayed"
+#: ../../include/js_strings.php:9
+#, php-format
+msgid "%s expand"
msgstr ""
-#: ../../include/selectors.php:123 ../../include/selectors.php:140
-msgid "Separated"
+#: ../../include/js_strings.php:10
+#, php-format
+msgid "%s collapse"
msgstr ""
-#: ../../include/selectors.php:123
-msgid "Unstable"
+#: ../../include/js_strings.php:11
+msgid "Password too short"
msgstr ""
-#: ../../include/selectors.php:123 ../../include/selectors.php:140
-msgid "Divorced"
+#: ../../include/js_strings.php:12
+msgid "Passwords do not match"
msgstr ""
-#: ../../include/selectors.php:123
-msgid "Imaginarily divorced"
+#: ../../include/js_strings.php:13
+msgid "everybody"
msgstr ""
-#: ../../include/selectors.php:123 ../../include/selectors.php:140
-msgid "Widowed"
+#: ../../include/js_strings.php:14
+msgid "Secret Passphrase"
msgstr ""
-#: ../../include/selectors.php:123
-msgid "Uncertain"
+#: ../../include/js_strings.php:15
+msgid "Passphrase hint"
msgstr ""
-#: ../../include/selectors.php:123 ../../include/selectors.php:140
-msgid "It's complicated"
+#: ../../include/js_strings.php:16
+msgid "Notice: Permissions have changed but have not yet been submitted."
msgstr ""
-#: ../../include/selectors.php:123
-msgid "Don't care"
+#: ../../include/js_strings.php:17
+msgid "close all"
msgstr ""
-#: ../../include/selectors.php:123
-msgid "Ask me"
+#: ../../include/js_strings.php:18
+msgid "Nothing new here"
msgstr ""
-#: ../../include/js_strings.php:69 ../../include/text.php:1321
-msgid "Sunday"
+#: ../../include/js_strings.php:19
+msgid "Rate This Channel (this is public)"
msgstr ""
-#: ../../include/js_strings.php:70 ../../include/text.php:1321
-msgid "Monday"
+#: ../../include/js_strings.php:21
+msgid "Describe (optional)"
msgstr ""
-#: ../../include/js_strings.php:71 ../../include/text.php:1321
-msgid "Tuesday"
+#: ../../include/js_strings.php:23
+msgid "Please enter a link URL"
msgstr ""
-#: ../../include/js_strings.php:72 ../../include/text.php:1321
-msgid "Wednesday"
+#: ../../include/js_strings.php:24
+msgid "Unsaved changes. Are you sure you wish to leave this page?"
msgstr ""
-#: ../../include/js_strings.php:73 ../../include/text.php:1321
-msgid "Thursday"
+#: ../../include/js_strings.php:27
+msgid "timeago.prefixAgo"
msgstr ""
-#: ../../include/js_strings.php:74 ../../include/text.php:1321
-msgid "Friday"
+#: ../../include/js_strings.php:28
+msgid "timeago.prefixFromNow"
msgstr ""
-#: ../../include/js_strings.php:75 ../../include/text.php:1321
-msgid "Saturday"
+#: ../../include/js_strings.php:29
+msgid "ago"
msgstr ""
-#: ../../include/js_strings.php:76
-msgid "Sun"
+#: ../../include/js_strings.php:30
+msgid "from now"
msgstr ""
-#: ../../include/permissions.php:39
-msgid "Can view my webpages"
+#: ../../include/js_strings.php:31
+msgid "less than a minute"
msgstr ""
-#: ../../include/permissions.php:43
-msgid "Can post on my channel page (\"wall\")"
+#: ../../include/js_strings.php:32
+msgid "about a minute"
msgstr ""
-#: ../../include/permissions.php:46
-msgid "Can like/dislike stuff"
+#: ../../include/js_strings.php:33
+#, php-format
+msgid "%d minutes"
msgstr ""
-#: ../../include/js_strings.php:80
-msgid "Thu"
+#: ../../include/js_strings.php:34
+msgid "about an hour"
msgstr ""
-#: ../../include/js_strings.php:81
-msgid "Fri"
+#: ../../include/js_strings.php:35
+#, php-format
+msgid "about %d hours"
msgstr ""
-#: ../../include/js_strings.php:82
-msgid "Sat"
+#: ../../include/js_strings.php:36
+msgid "a day"
msgstr ""
-#: ../../include/js_strings.php:83
-msgctxt "calendar"
-msgid "today"
+#: ../../include/js_strings.php:37
+#, php-format
+msgid "%d days"
msgstr ""
-#: ../../include/js_strings.php:84
-msgctxt "calendar"
-msgid "month"
+#: ../../include/js_strings.php:38
+msgid "about a month"
msgstr ""
-#: ../../include/js_strings.php:85
-msgctxt "calendar"
-msgid "week"
+#: ../../include/js_strings.php:39
+#, php-format
+msgid "%d months"
msgstr ""
-#: ../../include/js_strings.php:86
-msgctxt "calendar"
-msgid "day"
+#: ../../include/js_strings.php:40
+msgid "about a year"
msgstr ""
-#: ../../include/js_strings.php:87
-msgctxt "calendar"
-msgid "All day"
+#: ../../include/js_strings.php:41
+#, php-format
+msgid "%d years"
msgstr ""
-#: ../../include/dir_fns.php:141
-msgid "Directory Options"
+#: ../../include/js_strings.php:42
+msgid " "
msgstr ""
-#: ../../include/dir_fns.php:143
-msgid "Safe Mode"
+#: ../../include/js_strings.php:43
+msgid "timeago.numbers"
msgstr ""
-#: ../../include/dir_fns.php:144
-msgid "Public Forums Only"
+#: ../../include/js_strings.php:49
+msgctxt "long"
+msgid "May"
msgstr ""
-#: ../../include/dir_fns.php:145
-msgid "This Website Only"
+#: ../../include/js_strings.php:57
+msgid "Jan"
msgstr ""
-#: ../../include/attach.php:250 ../../include/attach.php:338
-msgid "Item was not found."
+#: ../../include/js_strings.php:58
+msgid "Feb"
msgstr ""
-#: ../../include/attach.php:499
-msgid "No source file."
+#: ../../include/js_strings.php:59
+msgid "Mar"
msgstr ""
-#: ../../include/attach.php:521
-msgid "Cannot locate file to replace"
+#: ../../include/js_strings.php:60
+msgid "Apr"
msgstr ""
-#: ../../include/attach.php:539
-msgid "Cannot locate file to revise/update"
+#: ../../include/js_strings.php:61
+msgctxt "short"
+msgid "May"
msgstr ""
-#: ../../include/attach.php:670
-#, php-format
-msgid "File exceeds size limit of %d"
+#: ../../include/js_strings.php:62
+msgid "Jun"
msgstr ""
-#: ../../include/attach.php:684
-#, php-format
-msgid "You have reached your limit of %1$.0f Mbytes attachment storage."
+#: ../../include/js_strings.php:63
+msgid "Jul"
msgstr ""
-#: ../../include/attach.php:854
-msgid "File upload failed. Possible system limit or action terminated."
+#: ../../include/js_strings.php:64
+msgid "Aug"
msgstr ""
-#: ../../include/attach.php:867
-msgid "Stored file could not be verified. Upload failed."
+#: ../../include/js_strings.php:65
+msgid "Sep"
msgstr ""
-#: ../../include/attach.php:922 ../../include/attach.php:938
-msgid "Path not available."
+#: ../../include/js_strings.php:66
+msgid "Oct"
msgstr ""
-#: ../../include/attach.php:984 ../../include/attach.php:1142
-msgid "Empty pathname"
+#: ../../include/js_strings.php:67
+msgid "Nov"
msgstr ""
-#: ../../include/attach.php:1010
-msgid "duplicate filename or path"
+#: ../../include/js_strings.php:68
+msgid "Dec"
msgstr ""
-#: ../../include/attach.php:1032
-msgid "Path not found."
+#: ../../include/js_strings.php:76
+msgid "Sun"
msgstr ""
-#: ../../include/attach.php:1096
-msgid "mkdir failed."
+#: ../../include/js_strings.php:77
+msgid "Mon"
msgstr ""
-#: ../../include/attach.php:1100
-msgid "database storage failed."
+#: ../../include/js_strings.php:78
+msgid "Tue"
msgstr ""
-#: ../../include/attach.php:1148
-msgid "Empty path"
+#: ../../include/js_strings.php:79
+msgid "Wed"
msgstr ""
-#: ../../include/network.php:733
-msgid "view full size"
+#: ../../include/js_strings.php:80
+msgid "Thu"
msgstr ""
-#: ../../include/network.php:1988
-msgid "No Subject"
+#: ../../include/js_strings.php:81
+msgid "Fri"
msgstr ""
-#: ../../include/network.php:2244
-msgid "OStatus"
+#: ../../include/js_strings.php:82
+msgid "Sat"
msgstr ""
-#: ../../include/network.php:2245
-msgid "GNU-Social"
+#: ../../include/js_strings.php:83
+msgctxt "calendar"
+msgid "today"
msgstr ""
-#: ../../include/network.php:2246
-msgid "RSS/Atom"
+#: ../../include/js_strings.php:84
+msgctxt "calendar"
+msgid "month"
msgstr ""
-#: ../../include/network.php:2249
-msgid "Facebook"
+#: ../../include/js_strings.php:85
+msgctxt "calendar"
+msgid "week"
msgstr ""
-#: ../../include/network.php:2250
-msgid "Zot"
+#: ../../include/js_strings.php:86
+msgctxt "calendar"
+msgid "day"
msgstr ""
-#: ../../include/network.php:2251
-msgid "LinkedIn"
+#: ../../include/js_strings.php:87
+msgctxt "calendar"
+msgid "All day"
msgstr ""
-#: ../../include/network.php:2252
-msgid "XMPP/IM"
+#: ../../include/message.php:30
+msgid "Unable to determine sender."
msgstr ""
-#: ../../include/network.php:2253
-msgid "MySpace"
+#: ../../include/message.php:69
+msgid "No recipient provided."
msgstr ""
-#: ../../include/oembed.php:308
-msgid " by "
+#: ../../include/message.php:74
+msgid "[no subject]"
msgstr ""
-#: ../../include/oembed.php:309
-msgid " on "
+#: ../../include/message.php:227
+msgid "Stored post could not be verified."
msgstr ""
-#: ../../include/oembed.php:338
-msgid "Embedded content"
+#: ../../include/activities.php:41
+msgid " and "
msgstr ""
-#: ../../include/oembed.php:347
-msgid "Embedding disabled"
+#: ../../include/activities.php:49
+msgid "public profile"
msgstr ""
-#: ../../include/photos.php:115
+#: ../../include/activities.php:58
#, php-format
-msgid "Image exceeds website size limit of %lu bytes"
-msgstr ""
-
-#: ../../include/photos.php:122
-msgid "Image file is empty."
-msgstr ""
-
-#: ../../include/photos.php:260
-msgid "Photo storage failed."
-msgstr ""
-
-#: ../../include/photos.php:300
-msgid "a new photo"
+msgid "%1$s changed %2$s to &ldquo;%3$s&rdquo;"
msgstr ""
-#: ../../include/photos.php:304
+#: ../../include/activities.php:59
#, php-format
-msgctxt "photo_upload"
-msgid "%1$s posted %2$s to %3$s"
-msgstr ""
-
-#: ../../include/photos.php:519
-msgid "Upload New Photos"
-msgstr ""
-
-#: ../../include/text.php:460
-msgid "prev"
-msgstr ""
-
-#: ../../include/text.php:462
-msgid "first"
-msgstr ""
-
-#: ../../include/text.php:491
-msgid "last"
-msgstr ""
-
-#: ../../include/text.php:494
-msgid "next"
-msgstr ""
-
-#: ../../include/text.php:505
-msgid "older"
-msgstr ""
-
-#: ../../include/text.php:507
-msgid "newer"
-msgstr ""
-
-#: ../../include/text.php:922
-msgid "No connections"
+msgid "Visit %1$s's %2$s"
msgstr ""
-#: ../../include/text.php:947
+#: ../../include/activities.php:62
#, php-format
-msgid "View all %s connections"
-msgstr ""
-
-#: ../../include/text.php:1092 ../../include/text.php:1097
-msgid "poke"
-msgstr ""
-
-#: ../../include/text.php:1098
-msgid "ping"
+msgid "%1$s has an updated %2$s, changing %3$s."
msgstr ""
-#: ../../include/text.php:1098
-msgid "pinged"
+#: ../../include/attach.php:250 ../../include/attach.php:339
+msgid "Item was not found."
msgstr ""
-#: ../../include/text.php:1099
-msgid "prod"
+#: ../../include/attach.php:500
+msgid "No source file."
msgstr ""
-#: ../../include/text.php:1099
-msgid "prodded"
+#: ../../include/attach.php:522
+msgid "Cannot locate file to replace"
msgstr ""
-#: ../../include/text.php:1100
-msgid "slap"
+#: ../../include/attach.php:540
+msgid "Cannot locate file to revise/update"
msgstr ""
-#: ../../include/text.php:1100
-msgid "slapped"
+#: ../../include/attach.php:671
+#, php-format
+msgid "File exceeds size limit of %d"
msgstr ""
-#: ../../include/text.php:1101
-msgid "finger"
+#: ../../include/attach.php:685
+#, php-format
+msgid "You have reached your limit of %1$.0f Mbytes attachment storage."
msgstr ""
-#: ../../include/text.php:1101
-msgid "fingered"
+#: ../../include/attach.php:855
+msgid "File upload failed. Possible system limit or action terminated."
msgstr ""
-#: ../../include/text.php:1102
-msgid "rebuff"
+#: ../../include/attach.php:868
+msgid "Stored file could not be verified. Upload failed."
msgstr ""
-#: ../../include/text.php:1102
-msgid "rebuffed"
+#: ../../include/attach.php:923 ../../include/attach.php:939
+msgid "Path not available."
msgstr ""
-#: ../../include/text.php:1114
-msgid "happy"
+#: ../../include/attach.php:988 ../../include/attach.php:1153
+msgid "Empty pathname"
msgstr ""
-#: ../../include/text.php:1115
-msgid "sad"
+#: ../../include/attach.php:1014
+msgid "duplicate filename or path"
msgstr ""
-#: ../../include/text.php:1116
-msgid "mellow"
+#: ../../include/attach.php:1039
+msgid "Path not found."
msgstr ""
-#: ../../include/text.php:1117
-msgid "tired"
+#: ../../include/attach.php:1107
+msgid "mkdir failed."
msgstr ""
-#: ../../include/text.php:1118
-msgid "perky"
+#: ../../include/attach.php:1111
+msgid "database storage failed."
msgstr ""
-#: ../../include/text.php:1119
-msgid "angry"
+#: ../../include/attach.php:1159
+msgid "Empty path"
msgstr ""
-#: ../../include/text.php:1120
-msgid "stupefied"
+#: ../../include/security.php:117
+msgid "guest:"
msgstr ""
-#: ../../include/text.php:1121
-msgid "puzzled"
+#: ../../include/security.php:532
+msgid ""
+"The form security token was not correct. This probably happened because the "
+"form has been opened for too long (>3 hours) before submitting it."
msgstr ""
-#: ../../include/text.php:1122
-msgid "interested"
+#: ../../include/items.php:869 ../../include/items.php:916
+msgid "(Unknown)"
msgstr ""
-#: ../../include/text.php:1123
-msgid "bitter"
+#: ../../include/items.php:1110
+msgid "Visible to anybody on the internet."
msgstr ""
-#: ../../include/text.php:1124
-msgid "cheerful"
+#: ../../include/items.php:1112
+msgid "Visible to you only."
msgstr ""
-#: ../../include/text.php:1125
-msgid "alive"
+#: ../../include/items.php:1114
+msgid "Visible to anybody in this network."
msgstr ""
-#: ../../include/text.php:1126
-msgid "annoyed"
+#: ../../include/items.php:1116
+msgid "Visible to anybody authenticated."
msgstr ""
-#: ../../include/text.php:1127
-msgid "anxious"
+#: ../../include/items.php:1118
+#, php-format
+msgid "Visible to anybody on %s."
msgstr ""
-#: ../../include/text.php:1128
-msgid "cranky"
+#: ../../include/items.php:1120
+msgid "Visible to all connections."
msgstr ""
-#: ../../include/text.php:1129
-msgid "disturbed"
+#: ../../include/items.php:1122
+msgid "Visible to approved connections."
msgstr ""
-#: ../../include/text.php:1130
-msgid "frustrated"
+#: ../../include/items.php:1124
+msgid "Visible to specific connections."
msgstr ""
-#: ../../include/text.php:1131
-msgid "depressed"
+#: ../../include/items.php:3938
+msgid "Privacy group is empty."
msgstr ""
-#: ../../include/text.php:1132
-msgid "motivated"
+#: ../../include/items.php:3945
+#, php-format
+msgid "Privacy group: %s"
msgstr ""
-#: ../../include/text.php:1133
-msgid "relaxed"
+#: ../../include/items.php:3957
+msgid "Connection not found."
msgstr ""
-#: ../../include/text.php:1134
-msgid "surprised"
+#: ../../include/items.php:4310
+msgid "profile photo"
msgstr ""
-#: ../../include/text.php:1325
-msgid "May"
+#: ../../include/items.php:4506
+#, php-format
+msgid "[Edited %s]"
msgstr ""
-#: ../../include/text.php:1402 ../../include/text.php:1406
-msgid "Unknown Attachment"
+#: ../../include/items.php:4506
+msgctxt "edit_activity"
+msgid "Post"
msgstr ""
-#: ../../include/text.php:1408
-msgid "unknown"
+#: ../../include/items.php:4506
+msgctxt "edit_activity"
+msgid "Comment"
msgstr ""
-#: ../../include/text.php:1444
-msgid "remove category"
+#: ../../include/channel.php:33
+msgid "Unable to obtain identity information from database"
msgstr ""
-#: ../../include/text.php:1521
-msgid "remove from file"
+#: ../../include/channel.php:67
+msgid "Empty name"
msgstr ""
-#: ../../include/text.php:1791
-msgid "Page layout"
+#: ../../include/channel.php:70
+msgid "Name too long"
msgstr ""
-#: ../../include/text.php:1791
-msgid "You can create your own with the layouts tool"
+#: ../../include/channel.php:181
+msgid "No account identifier"
msgstr ""
-#: ../../include/text.php:1833
-msgid "Page content type"
+#: ../../include/channel.php:193
+msgid "Nickname is required."
msgstr ""
-#: ../../include/text.php:1966
-msgid "activity"
+#: ../../include/channel.php:207
+msgid "Reserved nickname. Please choose another."
msgstr ""
-#: ../../include/text.php:2280
-msgid "Design Tools"
+#: ../../include/channel.php:212
+msgid ""
+"Nickname has unsupported characters or is already being used on this site."
msgstr ""
-#: ../../include/text.php:2286
-msgid "Pages"
+#: ../../include/channel.php:270
+msgid "Unable to retrieve created identity"
msgstr ""
-#: ../../include/text.php:2308
-msgid "Import website..."
+#: ../../include/channel.php:342
+msgid "Default Profile"
msgstr ""
-#: ../../include/text.php:2309
-msgid "Select folder to import"
+#: ../../include/channel.php:1045
+msgid "Create New Profile"
msgstr ""
-#: ../../include/text.php:2310
-msgid "Import from a zipped folder:"
+#: ../../include/channel.php:1065
+msgid "Visible to everybody"
msgstr ""
-#: ../../include/text.php:2311
-msgid "Import from cloud files:"
+#: ../../include/channel.php:1138 ../../include/channel.php:1252
+msgid "Gender:"
msgstr ""
-#: ../../include/text.php:2312
-msgid "/cloud/channel/path/to/folder"
+#: ../../include/channel.php:1140 ../../include/channel.php:1307
+msgid "Homepage:"
msgstr ""
-#: ../../include/text.php:2313
-msgid "Enter path to website files"
+#: ../../include/channel.php:1141
+msgid "Online Now"
msgstr ""
-#: ../../include/text.php:2314
-msgid "Select folder"
+#: ../../include/channel.php:1257
+msgid "Like this channel"
msgstr ""
-#: ../../include/text.php:2315
-msgid "Export website..."
+#: ../../include/channel.php:1281
+msgid "j F, Y"
msgstr ""
-#: ../../include/text.php:2316
-msgid "Export to a zip file"
+#: ../../include/channel.php:1282
+msgid "j F"
msgstr ""
-#: ../../include/text.php:2317
-msgid "website.zip"
+#: ../../include/channel.php:1289
+msgid "Birthday:"
msgstr ""
-#: ../../include/text.php:2318
-msgid "Enter a name for the zip file."
+#: ../../include/channel.php:1302
+#, php-format
+msgid "for %1$d %2$s"
msgstr ""
-#: ../../include/text.php:2319
-msgid "Export to cloud files"
+#: ../../include/channel.php:1305
+msgid "Sexual Preference:"
msgstr ""
-#: ../../include/text.php:2320
-msgid "/path/to/export/folder"
+#: ../../include/channel.php:1311
+msgid "Tags:"
msgstr ""
-#: ../../include/text.php:2321
-msgid "Enter a path to a cloud files destination."
+#: ../../include/channel.php:1313
+msgid "Political Views:"
msgstr ""
-#: ../../include/text.php:2322
-msgid "Specify folder"
+#: ../../include/channel.php:1315
+msgid "Religion:"
msgstr ""
-#: ../../include/nav.php:88
-msgid "Remote authentication"
+#: ../../include/channel.php:1319
+msgid "Hobbies/Interests:"
msgstr ""
-#: ../../include/nav.php:88
-msgid "Click to authenticate to your home hub"
+#: ../../include/channel.php:1321
+msgid "Likes:"
msgstr ""
-#: ../../include/nav.php:99 ../../include/nav.php:140 ../../boot.php:1731
-msgid "Logout"
+#: ../../include/channel.php:1323
+msgid "Dislikes:"
msgstr ""
-#: ../../include/nav.php:99 ../../include/nav.php:140
-msgid "End this session"
+#: ../../include/channel.php:1325
+msgid "Contact information and Social Networks:"
msgstr ""
-#: ../../include/nav.php:103
-msgid "Your profile page"
+#: ../../include/channel.php:1327
+msgid "My other channels:"
msgstr ""
-#: ../../include/nav.php:105
-msgid "Manage/Edit profiles"
+#: ../../include/channel.php:1329
+msgid "Musical interests:"
msgstr ""
-#: ../../include/nav.php:107
-msgid "Edit your profile"
+#: ../../include/channel.php:1331
+msgid "Books, literature:"
msgstr ""
-#: ../../include/nav.php:130
-msgid "Sign in"
+#: ../../include/channel.php:1333
+msgid "Television:"
msgstr ""
-#: ../../include/nav.php:155
-msgid "Get me home"
+#: ../../include/channel.php:1335
+msgid "Film/dance/culture/entertainment:"
msgstr ""
-#: ../../include/nav.php:157
-msgid "Log me out of this site"
+#: ../../include/channel.php:1337
+msgid "Love/Romance:"
msgstr ""
-#: ../../include/nav.php:162
-msgid "Create an account"
+#: ../../include/channel.php:1339
+msgid "Work/employment:"
msgstr ""
-#: ../../include/nav.php:174
-msgid "Help and documentation"
+#: ../../include/channel.php:1341
+msgid "School/education:"
msgstr ""
-#: ../../include/nav.php:178
-msgid "Applications, utilities, links, games"
+#: ../../include/channel.php:1364
+msgid "Like this thing"
msgstr ""
-#: ../../include/nav.php:180
-msgid "Search site @name, #tag, ?docs, content"
+#: ../../include/channel.php:2139
+#, php-format
+msgid "User '%s' deleted"
msgstr ""
-#: ../../include/nav.php:182
-msgid "Channel Directory"
+#: ../../include/event.php:1004
+msgid "This event has been added to your calendar."
msgstr ""
-#: ../../include/nav.php:194
-msgid "Your grid"
+#: ../../include/event.php:1204
+msgid "Not specified"
msgstr ""
-#: ../../include/nav.php:195
-msgid "View your network/grid"
+#: ../../include/event.php:1205
+msgid "Needs Action"
msgstr ""
-#: ../../include/nav.php:196
-msgid "Mark all grid notifications seen"
+#: ../../include/event.php:1206
+msgid "Completed"
msgstr ""
-#: ../../include/nav.php:198
-msgid "Channel home"
+#: ../../include/event.php:1207
+msgid "In Process"
msgstr ""
-#: ../../include/nav.php:199
-msgid "View your channel home"
+#: ../../include/event.php:1208
+msgid "Cancelled"
msgstr ""
-#: ../../include/nav.php:200
-msgid "Mark all channel notifications seen"
+#: ../../include/network.php:776
+msgid "view full size"
msgstr ""
-#: ../../include/nav.php:206
-msgid "Notices"
+#: ../../include/network.php:2042
+msgid "No Subject"
msgstr ""
-#: ../../include/nav.php:206
-msgid "Notifications"
+#: ../../include/network.php:2310 ../../include/network.php:2311
+msgid "Friendica"
msgstr ""
-#: ../../include/nav.php:207
-msgid "View all notifications"
+#: ../../include/network.php:2312
+msgid "OStatus"
msgstr ""
-#: ../../include/nav.php:210
-msgid "Private mail"
+#: ../../include/network.php:2313
+msgid "GNU-Social"
msgstr ""
-#: ../../include/nav.php:211
-msgid "View your private messages"
+#: ../../include/network.php:2314
+msgid "RSS/Atom"
msgstr ""
-#: ../../include/nav.php:212
-msgid "Mark all private messages seen"
+#: ../../include/network.php:2316
+msgid "Diaspora"
msgstr ""
-#: ../../include/nav.php:218
-msgid "Event Calendar"
+#: ../../include/network.php:2317
+msgid "Facebook"
msgstr ""
-#: ../../include/nav.php:219
-msgid "View events"
+#: ../../include/network.php:2318
+msgid "Zot"
msgstr ""
-#: ../../include/nav.php:220
-msgid "Mark all events seen"
+#: ../../include/network.php:2319
+msgid "LinkedIn"
msgstr ""
-#: ../../include/nav.php:223
-msgid "Manage Your Channels"
+#: ../../include/network.php:2320
+msgid "XMPP/IM"
msgstr ""
-#: ../../include/nav.php:225
-msgid "Account/Channel Settings"
+#: ../../include/network.php:2321
+msgid "MySpace"
msgstr ""
-#: ../../include/nav.php:233
-msgid "Site Setup and Configuration"
+#: ../../include/page_widgets.php:7
+msgid "New Page"
msgstr ""
-#: ../../include/nav.php:288
-msgid "Documentation"
+#: ../../include/language.php:380
+msgid "Select an alternate language"
msgstr ""
-#: ../../include/nav.php:297
-msgid "@name, #tag, ?doc, content"
+#: ../../include/acl_selectors.php:208
+msgid "Who can see this?"
msgstr ""
-#: ../../include/nav.php:298
-msgid "Please wait..."
+#: ../../include/acl_selectors.php:209
+msgid "Custom selection"
msgstr ""
-#: ../../include/import.php:30
+#: ../../include/acl_selectors.php:210
msgid ""
-"Cannot create a duplicate channel identifier on this system. Import failed."
-msgstr ""
-
-#: ../../include/import.php:90
-msgid "Channel clone failed. Import failed."
-msgstr ""
-
-#: ../../include/import.php:100
-msgid "Cloned channel not found. Import failed."
-msgstr ""
-
-#: ../../include/import.php:1373
-msgid "Unable to import element \""
-msgstr ""
-
-#: ../../include/auth.php:148
-msgid "Logged out."
-msgstr ""
-
-#: ../../include/auth.php:275
-msgid "Failed authentication"
-msgstr ""
-
-#: ../../include/follow.php:26
-msgid "Channel is blocked on this site."
-msgstr ""
-
-#: ../../include/follow.php:31
-msgid "Channel location missing."
-msgstr ""
-
-#: ../../include/follow.php:73
-msgid "Response from remote channel was incomplete."
-msgstr ""
-
-#: ../../include/follow.php:90
-msgid "Channel was deleted and no longer exists."
-msgstr ""
-
-#: ../../include/follow.php:140 ../../include/follow.php:175
-msgid "Protocol disabled."
-msgstr ""
-
-#: ../../include/follow.php:163
-msgid "Channel discovery failed."
-msgstr ""
-
-#: ../../include/follow.php:202
-msgid "Cannot connect to yourself."
-msgstr ""
-
-#: ../../include/activities.php:41
-msgid " and "
+"Select \"Show\" to allow viewing. \"Don't show\" lets you override and limit "
+"the scope of \"Show\"."
msgstr ""
-#: ../../include/activities.php:49
-msgid "public profile"
+#: ../../include/acl_selectors.php:211
+msgid "Show"
msgstr ""
-#: ../../include/activities.php:58
-#, php-format
-msgid "%1$s changed %2$s to &ldquo;%3$s&rdquo;"
+#: ../../include/acl_selectors.php:212
+msgid "Don't show"
msgstr ""
-#: ../../include/activities.php:59
+#: ../../include/acl_selectors.php:245
#, php-format
-msgid "Visit %1$s's %2$s"
+msgid ""
+"Post permissions %s cannot be changed %s after a post is shared.</br />These "
+"permissions set who is allowed to view the post."
msgstr ""
-#: ../../include/activities.php:62
+#: ../../include/dba/dba_driver.php:189
#, php-format
-msgid "%1$s has an updated %2$s, changing %3$s."
+msgid "Cannot locate DNS info for database server '%s'"
msgstr ""
#: ../../include/bbcode.php:134 ../../include/bbcode.php:1040
@@ -12917,185 +12529,20 @@ msgstr ""
msgid "$1 wrote:"
msgstr ""
-#: ../../include/bookmarks.php:34
-#, php-format
-msgid "%1$s's bookmarks"
-msgstr ""
-
-#: ../../include/group.php:26
-msgid ""
-"A deleted group with this name was revived. Existing item permissions "
-"<strong>may</strong> apply to this group and any future members. If this is "
-"not what you intended, please create another group with a different name."
-msgstr ""
-
-#: ../../include/group.php:268
-msgid "Add new connections to this privacy group"
-msgstr ""
-
-#: ../../include/group.php:309
-msgid "edit"
-msgstr ""
-
-#: ../../include/group.php:331 ../../include/features.php:292
-msgid "Privacy Groups"
-msgstr ""
-
-#: ../../include/group.php:332
-msgid "Edit group"
-msgstr ""
-
-#: ../../include/group.php:333
-msgid "Add privacy group"
-msgstr ""
-
-#: ../../include/group.php:334
-msgid "Channels not in any privacy group"
-msgstr ""
-
-#: ../../include/event.php:863
-msgid "This event has been added to your calendar."
-msgstr ""
-
-#: ../../include/event.php:1063
-msgid "Not specified"
-msgstr ""
-
-#: ../../include/event.php:1064
-msgid "Needs Action"
-msgstr ""
-
-#: ../../include/event.php:1065
-msgid "Completed"
-msgstr ""
-
-#: ../../include/event.php:1066
-msgid "In Process"
-msgstr ""
-
-#: ../../include/event.php:1067
-msgid "Cancelled"
-msgstr ""
-
-#: ../../include/items.php:841 ../../include/items.php:888
-msgid "(Unknown)"
-msgstr ""
-
-#: ../../include/items.php:1089
-msgid "Visible to anybody on the internet."
-msgstr ""
-
-#: ../../include/items.php:1091
-msgid "Visible to you only."
-msgstr ""
-
-#: ../../include/items.php:1093
-msgid "Visible to anybody in this network."
-msgstr ""
-
-#: ../../include/items.php:1095
-msgid "Visible to anybody authenticated."
-msgstr ""
-
-#: ../../include/items.php:1097
-#, php-format
-msgid "Visible to anybody on %s."
-msgstr ""
-
-#: ../../include/items.php:1099
-msgid "Visible to all connections."
-msgstr ""
-
-#: ../../include/items.php:1101
-msgid "Visible to approved connections."
-msgstr ""
-
-#: ../../include/items.php:1103
-msgid "Visible to specific connections."
-msgstr ""
-
-#: ../../include/items.php:3915
-msgid "Privacy group is empty."
-msgstr ""
-
-#: ../../include/items.php:3922
-#, php-format
-msgid "Privacy group: %s"
-msgstr ""
-
-#: ../../include/items.php:3934
-msgid "Connection not found."
-msgstr ""
-
-#: ../../include/items.php:4283
-msgid "profile photo"
-msgstr ""
-
-#: ../../include/items.php:4479
-#, php-format
-msgid "[Edited %s]"
-msgstr ""
-
-#: ../../include/items.php:4479
-msgctxt "edit_activity"
-msgid "Post"
-msgstr ""
-
-#: ../../include/items.php:4479
-msgctxt "edit_activity"
-msgid "Comment"
-msgstr ""
-
-#: ../../include/permissions.php:35
-msgid "Can view my normal stream and posts"
-msgstr ""
-
-#: ../../include/permissions.php:39
-msgid "Can view my webpages"
-msgstr ""
-
-#: ../../include/permissions.php:43
-msgid "Can post on my channel page (\"wall\")"
-msgstr ""
-
-#: ../../include/permissions.php:46
-msgid "Can like/dislike stuff"
-msgstr ""
-
-#: ../../include/permissions.php:46
-msgid "Profiles and things other than posts/comments"
-msgstr ""
-
-#: ../../include/permissions.php:48
-msgid "Can forward to all my channel contacts via post @mentions"
-msgstr ""
-
-#: ../../include/permissions.php:48
-msgid "Advanced - useful for creating group forum channels"
-msgstr ""
-
-#: ../../include/permissions.php:49
-msgid "Can chat with me (when available)"
-msgstr ""
-
-#: ../../include/permissions.php:50
-msgid "Can write to my file storage and photos"
-msgstr ""
-
-#: ../../include/permissions.php:51
-msgid "Can edit my webpages"
+#: ../../include/oembed.php:315
+msgid " by "
msgstr ""
-#: ../../include/permissions.php:53
-msgid "Somewhat advanced - very useful in open communities"
+#: ../../include/oembed.php:316
+msgid " on "
msgstr ""
-#: ../../include/permissions.php:55
-msgid "Can administer my channel resources"
+#: ../../include/oembed.php:345
+msgid "Embedded content"
msgstr ""
-#: ../../include/permissions.php:55
-msgid "Extremely advanced. Leave this alone unless you know what you are doing"
+#: ../../include/oembed.php:354
+msgid "Embedding disabled"
msgstr ""
#: ../../include/features.php:58
@@ -13289,6 +12736,10 @@ msgstr ""
msgid "Ability to select posts by date ranges"
msgstr ""
+#: ../../include/features.php:292 ../../include/group.php:331
+msgid "Privacy Groups"
+msgstr ""
+
#: ../../include/features.php:293
msgid "Enable management and selection of privacy groups"
msgstr ""
@@ -13399,198 +12850,414 @@ msgid ""
"channel"
msgstr ""
-#: ../../include/help.php:31
-msgid "Help:"
+#: ../../include/taxonomy.php:228 ../../include/taxonomy.php:249
+msgid "Tags"
msgstr ""
-#: ../../include/help.php:63
-msgid "Not Found"
+#: ../../include/taxonomy.php:293
+msgid "Keywords"
msgstr ""
-#: ../../util/nconfig.php:34
-msgid "Source channel not found."
+#: ../../include/taxonomy.php:314
+msgid "have"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:9
-msgid "Focus (Hubzilla default)"
+#: ../../include/taxonomy.php:314
+msgid "has"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:110
-msgid "Theme settings"
+#: ../../include/taxonomy.php:315
+msgid "want"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:111
-msgid "Narrow navbar"
+#: ../../include/taxonomy.php:315
+msgid "wants"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:112
-msgid "Navigation bar background color"
+#: ../../include/taxonomy.php:316
+msgid "likes"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:113
-msgid "Navigation bar gradient top color"
+#: ../../include/taxonomy.php:317
+msgid "dislikes"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:114
-msgid "Navigation bar gradient bottom color"
+#: ../../include/account.php:35
+msgid "Not a valid email address"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:115
-msgid "Navigation active button gradient top color"
+#: ../../include/account.php:37
+msgid "Your email domain is not among those allowed on this site"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:116
-msgid "Navigation active button gradient bottom color"
+#: ../../include/account.php:43
+msgid "Your email address is already registered at this site."
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:117
-msgid "Navigation bar border color "
+#: ../../include/account.php:75
+msgid "An invitation is required."
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:118
-msgid "Navigation bar icon color "
+#: ../../include/account.php:79
+msgid "Invitation could not be verified."
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:119
-msgid "Navigation bar active icon color "
+#: ../../include/account.php:130
+msgid "Please enter the required information."
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:120
-msgid "link color"
+#: ../../include/account.php:198
+msgid "Failed to store account information."
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:121
-msgid "Set font-color for banner"
+#: ../../include/account.php:263
+#, php-format
+msgid "Registration confirmation for %s"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:122
-msgid "Set the background color"
+#: ../../include/account.php:330
+#, php-format
+msgid "Registration request at %s"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:123
-msgid "Set the background image"
+#: ../../include/account.php:352
+msgid "your registration password"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:124
-msgid "Set the background color of items"
+#: ../../include/account.php:358 ../../include/account.php:420
+#, php-format
+msgid "Registration details for %s"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:125
-msgid "Set the background color of comments"
+#: ../../include/account.php:431
+msgid "Account approved."
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:126
-msgid "Set the border color of comments"
+#: ../../include/account.php:471
+#, php-format
+msgid "Registration revoked for %s"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:127
-msgid "Set the indent for comments"
+#: ../../include/account.php:756 ../../include/account.php:758
+msgid "Click here to upgrade."
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:128
-msgid "Set the basic color for item icons"
+#: ../../include/account.php:764
+msgid "This action exceeds the limits set by your subscription plan."
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:129
-msgid "Set the hover color for item icons"
+#: ../../include/account.php:769
+msgid "This action is not available under your subscription plan."
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:130
-msgid "Set font-size for the entire application"
+#: ../../include/datetime.php:147
+msgid "Birthday"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:130
-msgid "Example: 14px"
+#: ../../include/datetime.php:149
+msgid "Age: "
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:131
-msgid "Set font-size for posts and comments"
+#: ../../include/datetime.php:151
+msgid "YYYY-MM-DD or MM-DD"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:132
-msgid "Set font-color for posts and comments"
+#: ../../include/datetime.php:292
+msgid "less than a second ago"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:133
-msgid "Set radius of corners"
+#: ../../include/datetime.php:310
+#, php-format
+msgctxt "e.g. 22 hours ago, 1 minute ago"
+msgid "%1$d %2$s ago"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:134
-msgid "Set shadow depth of photos"
+#: ../../include/datetime.php:321
+msgctxt "relative_date"
+msgid "year"
+msgid_plural "years"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../include/datetime.php:324
+msgctxt "relative_date"
+msgid "month"
+msgid_plural "months"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../include/datetime.php:327
+msgctxt "relative_date"
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../include/datetime.php:330
+msgctxt "relative_date"
+msgid "day"
+msgid_plural "days"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../include/datetime.php:333
+msgctxt "relative_date"
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../include/datetime.php:336
+msgctxt "relative_date"
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../include/datetime.php:339
+msgctxt "relative_date"
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../include/datetime.php:576
+#, php-format
+msgid "%1$s's birthday"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:135
-msgid "Set maximum width of content region in pixel"
+#: ../../include/datetime.php:577
+#, php-format
+msgid "Happy Birthday %1$s"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:135
-msgid "Leave empty for default width"
+#: ../../include/nav.php:92
+msgid "Remote authentication"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:136
-msgid "Left align page content"
+#: ../../include/nav.php:92
+msgid "Click to authenticate to your home hub"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:137
-msgid "Set minimum opacity of nav bar - to hide it"
+#: ../../include/nav.php:103 ../../include/nav.php:127
+msgid "End this session"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:138
-msgid "Set size of conversation author photo"
+#: ../../include/nav.php:106
+msgid "Your profile page"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:139
-msgid "Set size of followup author photos"
+#: ../../include/nav.php:109
+msgid "Manage/Edit profiles"
msgstr ""
-#: ../../boot.php:1505
-#, php-format
-msgid "Update %s failed. See error logs."
+#: ../../include/nav.php:111
+msgid "Edit your profile"
msgstr ""
-#: ../../boot.php:1508
-#, php-format
-msgid "Update Error at %s"
+#: ../../include/nav.php:117
+msgid "Sign in"
msgstr ""
-#: ../../boot.php:1712
-msgid "Create an account to access services and applications"
+#: ../../include/nav.php:142
+msgid "Take me home"
msgstr ""
-#: ../../boot.php:1734
-msgid "Login/Email"
+#: ../../include/nav.php:144
+msgid "Log me out of this site"
msgstr ""
-#: ../../boot.php:1735
-msgid "Password"
+#: ../../include/nav.php:149
+msgid "Create an account"
msgstr ""
-#: ../../boot.php:1736
-msgid "Remember me"
+#: ../../include/nav.php:161
+msgid "Help and documentation"
msgstr ""
-#: ../../boot.php:1739
-msgid "Forgot your password?"
+#: ../../include/nav.php:164
+msgid "Search site @name, #tag, ?docs, content"
msgstr ""
-#: ../../boot.php:2300
-msgid "toggle mobile"
+#: ../../include/nav.php:176
+msgid "Grid"
msgstr ""
-#: ../../boot.php:2455
-msgid "Website SSL certificate is not valid. Please correct."
+#: ../../include/nav.php:176
+msgid "Your grid"
+msgstr ""
+
+#: ../../include/nav.php:177
+msgid "View your network/grid"
msgstr ""
-#: ../../boot.php:2458
+#: ../../include/nav.php:178
+msgid "Mark all grid notifications seen"
+msgstr ""
+
+#: ../../include/nav.php:180
+msgid "Channel home"
+msgstr ""
+
+#: ../../include/nav.php:181
+msgid "View your channel home"
+msgstr ""
+
+#: ../../include/nav.php:182
+msgid "Mark all channel notifications seen"
+msgstr ""
+
+#: ../../include/nav.php:188
+msgid "Notices"
+msgstr ""
+
+#: ../../include/nav.php:188
+msgid "Notifications"
+msgstr ""
+
+#: ../../include/nav.php:189
+msgid "View all notifications"
+msgstr ""
+
+#: ../../include/nav.php:192
+msgid "Private mail"
+msgstr ""
+
+#: ../../include/nav.php:193
+msgid "View your private messages"
+msgstr ""
+
+#: ../../include/nav.php:194
+msgid "Mark all private messages seen"
+msgstr ""
+
+#: ../../include/nav.php:200
+msgid "Event Calendar"
+msgstr ""
+
+#: ../../include/nav.php:201
+msgid "View events"
+msgstr ""
+
+#: ../../include/nav.php:202
+msgid "Mark all events seen"
+msgstr ""
+
+#: ../../include/nav.php:205
+msgid "Manage Your Channels"
+msgstr ""
+
+#: ../../include/nav.php:207
+msgid "Account/Channel Settings"
+msgstr ""
+
+#: ../../include/nav.php:215
+msgid "Site Setup and Configuration"
+msgstr ""
+
+#: ../../include/nav.php:277
+msgid "@name, #tag, ?doc, content"
+msgstr ""
+
+#: ../../include/nav.php:278
+msgid "Please wait..."
+msgstr ""
+
+#: ../../include/nav.php:280
+msgid "Add Apps"
+msgstr ""
+
+#: ../../include/photos.php:115
#, php-format
-msgid "[hubzilla] Website SSL error for %s"
+msgid "Image exceeds website size limit of %lu bytes"
msgstr ""
-#: ../../boot.php:2577
-msgid "Cron/Scheduled tasks not running."
+#: ../../include/photos.php:122
+msgid "Image file is empty."
+msgstr ""
+
+#: ../../include/photos.php:261
+msgid "Photo storage failed."
msgstr ""
-#: ../../boot.php:2581
+#: ../../include/photos.php:301
+msgid "a new photo"
+msgstr ""
+
+#: ../../include/photos.php:305
#, php-format
-msgid "[hubzilla] Cron tasks not running on %s"
+msgctxt "photo_upload"
+msgid "%1$s posted %2$s to %3$s"
+msgstr ""
+
+#: ../../include/photos.php:533
+msgid "Upload New Photos"
+msgstr ""
+
+#: ../../include/zot.php:646
+msgid "Invalid data packet"
+msgstr ""
+
+#: ../../include/zot.php:662
+msgid "Unable to verify channel signature"
+msgstr ""
+
+#: ../../include/zot.php:2313
+#, php-format
+msgid "Unable to verify site signature for %s"
+msgstr ""
+
+#: ../../include/zot.php:3764
+msgid "invalid target signature"
+msgstr ""
+
+#: ../../include/group.php:26
+msgid ""
+"A deleted group with this name was revived. Existing item permissions "
+"<strong>may</strong> apply to this group and any future members. If this is "
+"not what you intended, please create another group with a different name."
+msgstr ""
+
+#: ../../include/group.php:268
+msgid "Add new connections to this privacy group"
+msgstr ""
+
+#: ../../include/group.php:309
+msgid "edit"
+msgstr ""
+
+#: ../../include/group.php:332
+msgid "Edit group"
+msgstr ""
+
+#: ../../include/group.php:333
+msgid "Add privacy group"
+msgstr ""
+
+#: ../../include/group.php:334
+msgid "Channels not in any privacy group"
+msgstr ""
+
+#: ../../include/connections.php:127
+msgid "New window"
+msgstr ""
+
+#: ../../include/connections.php:128
+msgid "Open the selected location in a different window or browser tab"
+msgstr ""
+
+#: ../../include/auth.php:148
+msgid "Logged out."
+msgstr ""
+
+#: ../../include/auth.php:275
+msgid "Failed authentication"
+msgstr ""
+
+#: ../../include/help.php:33
+msgid "Help:"
+msgstr ""
+
+#: ../../include/help.php:65
+msgid "Not Found"
msgstr ""
diff --git a/util/typo.php b/util/typo.php
index f9c9e5353..a8d363340 100644
--- a/util/typo.php
+++ b/util/typo.php
@@ -28,17 +28,18 @@
include_once($file);
}
- echo "Directory: include/RedDAV\n";
- $files = glob('include/RedDAV/*.php');
+ echo "Directory: include/photo\n";
+ $files = glob('include/photo/*.php');
foreach($files as $file) {
echo $file . "\n";
include_once($file);
}
+
echo "Directory: Zotlabs\n";
$files = glob('Zotlabs/*/*.php');
foreach($files as $file) {
- if(strpos($file,'SiteModule') === false) {
+ if((strpos($file,'SiteModule') === false) || (strpos($file,'SiteWidget') === false)) {
echo $file . "\n";
include_once($file);
}
@@ -51,21 +52,6 @@
include_once($file);
}
-
- echo "Directory: include/photo\n";
- $files = glob('include/photo/*.php');
- foreach($files as $file) {
- echo $file . "\n";
- include_once($file);
- }
-
-// echo "Directory: mod\n";
-// $files = glob('mod/*.php');
-// foreach($files as $file) {
-// echo $file . "\n";
-// include_once($file);
-// }
-
echo "Directory: addon\n";
$dirs = glob('addon/*');
@@ -93,6 +79,5 @@
foreach($files as $file) {
echo $file . "\n";
- passthru($phpath . ' util/typohelper.php ' . $file);
-// include_once($file);
+ passthru($phpath . ' util/typohelper.php ' . $file);
}
diff --git a/vendor/autoload.php b/vendor/autoload.php
index 063a1b7e1..8b4926c3d 100644
--- a/vendor/autoload.php
+++ b/vendor/autoload.php
@@ -2,6 +2,6 @@
// autoload.php @generated by Composer
-require_once __DIR__ . '/composer' . '/autoload_real.php';
+require_once __DIR__ . '/composer/autoload_real.php';
return ComposerAutoloaderInit7b34d7e50a62201ec5d5e526a5b8b35d::getLoader();
diff --git a/vendor/bshaffer/oauth2-server-php/CHANGELOG.md b/vendor/bshaffer/oauth2-server-php/CHANGELOG.md
new file mode 100644
index 000000000..4fddd72c9
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/CHANGELOG.md
@@ -0,0 +1,182 @@
+CHANGELOG for 1.x
+=================
+
+This changelog references the relevant changes (bug and security fixes) done
+in 1.x minor versions.
+
+To see the files changed for a given bug, go to https://github.com/bshaffer/oauth2-server-php/issues/### where ### is the bug number
+To get the diff between two versions, go to https://github.com/bshaffer/oauth2-server-php/compare/v1.0...v1.1
+To get the diff for a specific change, go to https://github.com/bshaffer/oauth2-server-php/commit/XXX where XXX is the change hash
+
+* 1.9.0 (2016-01-06)
+
+ PR: https://github.com/bshaffer/oauth2-server-php/pull/788
+
+ * bug #645 - Allow null for client_secret
+ * bug #651 - Fix bug in isPublicClient of Cassandra Storage
+ * bug #670 - Bug in client's scope restriction
+ * bug #672 - Implemented method to override the password hashing algorithm
+ * bug #698 - Fix Token Response's Content-Type to application/json
+ * bug #729 - Ensures unsetAccessToken and unsetRefreshToken return a bool
+ * bug #749 - Fix UserClaims for CodeIdToken
+ * bug #784 - RFC6750 compatibility
+ * bug #776 - Fix "redirect_uri_mismatch" for URIs with encoded characters
+ * bug #759 - no access token supplied to resource controller results in empty request body
+ * bug #773 - Use OpenSSL random method before attempting Mcrypt's.
+ * bug #790 - Add mongo db
+
+* 1.8.0 (2015-09-18)
+
+ PR: https://github.com/bshaffer/oauth2-server-php/pull/643
+
+ * bug #594 - adds jti
+ * bug #598 - fixes lifetime configurations for JWTs
+ * bug #634 - fixes travis builds, upgrade to containers
+ * bug #586 - support for revoking tokens
+ * bug #636 - Adds FirebaseJWT bridge
+ * bug #639 - Mongo HHVM compatibility
+
+* 1.7.0 (2015-04-23)
+
+ PR: https://github.com/bshaffer/oauth2-server-php/pull/572
+
+ * bug #500 - PDO fetch mode changed from FETCH_BOTH to FETCH_ASSOC
+ * bug #508 - Case insensitive for Bearer token header name ba716d4
+ * bug #512 - validateRedirectUri is now public
+ * bug #530 - Add PublicKeyInterface, UserClaimsInterface to Cassandra Storage
+ * bug #505 - DynamoDB storage fixes
+ * bug #556 - adds "code id_token" return type to openid connect
+ * bug #563 - Include "issuer" config key for JwtAccessToken
+ * bug #564 - Fixes JWT vulnerability
+ * bug #571 - Added unset_refresh_token_after_use option
+
+* 1.6 (2015-01-16)
+
+ PR: https://github.com/bshaffer/oauth2-server-php/pull/496
+
+ * bug 437 - renames CryptoToken to JwtAccessToken / use_crypto_tokens to use_jwt_access_tokens
+ * bug 447 - Adds a Couchbase storage implementation
+ * bug 460 - Rename JWT claims to match spec
+ * bug 470 - order does not matter for multi-valued response types
+ * bug 471 - Make validateAuthorizeRequest available for POST in addition to GET
+ * bug 475 - Adds JTI table definitiion
+ * bug 481 - better randomness for generating access tokens
+ * bug 480 - Use hash_equals() for signature verification (prevents remote timing attacks)
+ * bugs 489, 491, 498 - misc other fixes
+
+* 1.5 (2014-08-27)
+
+ PR: https://github.com/bshaffer/oauth2-server-php/pull/446
+
+ * bug #399 - Add DynamoDB Support
+ * bug #404 - renamed error name for malformed/expired tokens
+ * bug #412 - Openid connect: fixes for claims with more than one scope / Add support for the prompt parameter ('consent' and 'none')
+ * bug #411 - fixes xml output
+ * bug #413 - fixes invalid format error
+ * bug #401 - fixes code standards / whitespace
+ * bug #354 - bundles PDO SQL with the library
+ * [BC] bug #397 - refresh tokens should not be encrypted
+ * bug #423 - makes "scope" optional for refresh token storage
+
+* 1.4 (2014-06-12)
+
+ PR: https://github.com/bshaffer/oauth2-server-php/pull/392
+
+ * bug #189 Storage\PDO - allows DSN string in constructor
+ * bug #233 Bearer Tokens - allows token in request body for PUT requests
+ * bug #346 Fixes open_basedir warning
+ * bug #351 Adds OpenID Connect support
+ * bug #355 Adds php 5.6 and HHVM to travis.ci testing
+ * [BC] bug #358 Adds `getQuerystringIdentifier()` to the GrantType interface
+ * bug #363 Encryption\JWT - Allows for subclassing JWT Headers
+ * bug #349 Bearer Tokens - adds requestHasToken method for when access tokens are optional
+ * bug #301 Encryption\JWT - fixes urlSafeB64Encode(): ensures newlines are replaced as expected
+ * bug #323 ResourceController - client_id is no longer required to be returned when calling getAccessToken
+ * bug #367 Storage\PDO - adds Postgres support
+ * bug #368 Access Tokens - use mcrypt_create_iv or openssl_random_pseudo_bytes to create token string
+ * bug #376 Request - allows case insensitive headers
+ * bug #384 Storage\PDO - can pass in PDO options in constructor of PDO storage
+ * misc fixes #361, #292, #373, #374, #379, #396
+* 1.3 (2014-02-27)
+
+ PR: https://github.com/bshaffer/oauth2-server-php/pull/325
+
+ * bug #311 adds cassandra storage
+ * bug #298 fixes response code for user credentials grant type
+ * bug #318 adds 'use_crypto_tokens' config to Server class for better DX
+ * [BC] bug #320 pass client_id to getDefaultScope
+ * bug #324 better feedback when running tests
+ * bug #335 adds support for non-expiring refresh tokens
+ * bug #333 fixes Pdo storage for getClientKey
+ * bug #336 fixes Redis storage for expireAuthorizationCode
+
+* 1.3 (2014-02-27)
+
+ PR: https://github.com/bshaffer/oauth2-server-php/pull/325
+
+ * bug #311 adds cassandra storage
+ * bug #298 fixes response code for user credentials grant type
+ * bug #318 adds 'use_crypto_tokens' config to Server class for better DX
+ * bug #320 pass client_id to getDefaultScope
+ * bug #324 better feedback when running tests
+ * bug #335 adds support for non-expiring refresh tokens
+ * bug #333 fixes Pdo storage for getClientKey
+ * bug #336 fixes Redis storage for expireAuthorizationCode
+
+* 1.2 (2014-01-03)
+
+ PR: https://github.com/bshaffer/oauth2-server-php/pull/288
+
+ * bug #285 changed response header from 200 to 401 when empty token received
+ * bug #286 adds documentation and links to spec for not including error messages when no token is supplied
+ * bug #280 ensures PHP warnings do not get thrown as a result of an invalid argument to $jwt->decode()
+ * bug #279 predis wrong number of arguments
+ * bug #277 Securing JS WebApp client secret w/ password grant type
+
+* 1.1 (2013-12-17)
+
+ PR: https://github.com/bshaffer/oauth2-server-php/pull/276
+
+ * bug #278 adds refresh token configuration to Server class
+ * bug #274 Supplying a null client_id and client_secret grants API access
+ * bug #244 [MongoStorage] More detailed implementation info
+ * bug #268 Implement jti for JWT Bearer tokens to prevent replay attacks.
+ * bug #266 Removing unused argument to getAccessTokenData
+ * bug #247 Make Bearer token type consistent
+ * bug #253 Fixing CryptoToken refresh token lifetime
+ * bug #246 refactors public key logic to be more intuitive
+ * bug #245 adds support for JSON crypto tokens
+ * bug #230 Remove unused columns in oauth_clients
+ * bug #215 makes Redis Scope Storage obey the same paradigm as PDO
+ * bug #228 removes scope group
+ * bug #227 squelches open basedir restriction error
+ * bug #223 Updated docblocks for RefreshTokenInterface.php
+ * bug #224 Adds protected properties
+ * bug #217 Implement ScopeInterface for PDO, Redis
+
+* 1.0 (2013-08-12)
+
+ * bug #203 Add redirect\_status_code config param for AuthorizeController
+ * bug #205 ensures unnecessary ? is not set when ** bug
+ * bug #204 Fixed call to LogicException
+ * bug #202 Add explode to checkRestrictedGrant in PDO Storage
+ * bug #197 adds support for 'false' default scope ** bug
+ * bug #192 reference errors and adds tests
+ * bug #194 makes some appropriate properties ** bug
+ * bug #191 passes config to HttpBasic
+ * bug #190 validates client credentials before ** bug
+ * bug #171 Fix wrong redirect following authorization step
+ * bug #187 client_id is now passed to getDefaultScope().
+ * bug #176 Require refresh_token in getRefreshToken response
+ * bug #174 make user\_id not required for refresh_token grant
+ * bug #173 Duplication in JwtBearer Grant
+ * bug #168 user\_id not required for authorization_code grant
+ * bug #133 hardens default security for user object
+ * bug #163 allows redirect\_uri on authorization_code to be NULL in docs example
+ * bug #162 adds getToken on ResourceController for convenience
+ * bug #161 fixes fatal error
+ * bug #163 Invalid redirect_uri handling
+ * bug #156 user\_id in OAuth2\_Storage_AuthorizationCodeInterface::getAuthorizationCode() response
+ * bug #157 Fix for extending access and refresh tokens
+ * bug #154 ResponseInterface: getParameter method is used in the library but not defined in the interface
+ * bug #148 Add more detail to examples in Readme.md
diff --git a/vendor/bshaffer/oauth2-server-php/LICENSE b/vendor/bshaffer/oauth2-server-php/LICENSE
new file mode 100644
index 000000000..d7ece8467
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/LICENSE
@@ -0,0 +1,21 @@
+The MIT License
+
+Copyright (c) 2014 Brent Shaffer
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/vendor/bshaffer/oauth2-server-php/README.md b/vendor/bshaffer/oauth2-server-php/README.md
new file mode 100644
index 000000000..4ceda6cf9
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/README.md
@@ -0,0 +1,8 @@
+oauth2-server-php
+=================
+
+[![Build Status](https://travis-ci.org/bshaffer/oauth2-server-php.svg?branch=develop)](https://travis-ci.org/bshaffer/oauth2-server-php)
+
+[![Total Downloads](https://poser.pugx.org/bshaffer/oauth2-server-php/downloads.png)](https://packagist.org/packages/bshaffer/oauth2-server-php)
+
+View the [complete documentation](http://bshaffer.github.io/oauth2-server-php-docs/) \ No newline at end of file
diff --git a/vendor/bshaffer/oauth2-server-php/composer.json b/vendor/bshaffer/oauth2-server-php/composer.json
new file mode 100644
index 000000000..561699f5e
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/composer.json
@@ -0,0 +1,34 @@
+{
+ "name": "bshaffer/oauth2-server-php",
+ "description":"OAuth2 Server for PHP",
+ "keywords":["oauth","oauth2","auth"],
+ "type":"library",
+ "license":"MIT",
+ "authors":[
+ {
+ "name":"Brent Shaffer",
+ "email": "bshafs@gmail.com",
+ "homepage":"http://brentertainment.com"
+ }
+ ],
+ "homepage": "http://github.com/bshaffer/oauth2-server-php",
+ "autoload": {
+ "psr-0": { "OAuth2": "src/" }
+ },
+ "require":{
+ "php":">=5.3.9"
+ },
+ "require-dev": {
+ "aws/aws-sdk-php": "~2.8",
+ "firebase/php-jwt": "~2.2",
+ "predis/predis": "dev-master",
+ "thobbs/phpcassa": "dev-master",
+ "mongodb/mongodb": "^1.1"
+ },
+ "suggest": {
+ "predis/predis": "Required to use Redis storage",
+ "thobbs/phpcassa": "Required to use Cassandra storage",
+ "aws/aws-sdk-php": "~2.8 is required to use DynamoDB storage",
+ "firebase/php-jwt": "~1.1 is required to use MondoDB storage"
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Autoloader.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Autoloader.php
new file mode 100644
index 000000000..ecfb6ba75
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Autoloader.php
@@ -0,0 +1,48 @@
+<?php
+
+namespace OAuth2;
+
+/**
+ * Autoloads OAuth2 classes
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ * @license MIT License
+ */
+class Autoloader
+{
+ private $dir;
+
+ public function __construct($dir = null)
+ {
+ if (is_null($dir)) {
+ $dir = dirname(__FILE__).'/..';
+ }
+ $this->dir = $dir;
+ }
+ /**
+ * Registers OAuth2\Autoloader as an SPL autoloader.
+ */
+ public static function register($dir = null)
+ {
+ ini_set('unserialize_callback_func', 'spl_autoload_call');
+ spl_autoload_register(array(new self($dir), 'autoload'));
+ }
+
+ /**
+ * Handles autoloading of classes.
+ *
+ * @param string $class A class name.
+ *
+ * @return boolean Returns true if the class has been loaded
+ */
+ public function autoload($class)
+ {
+ if (0 !== strpos($class, 'OAuth2')) {
+ return;
+ }
+
+ if (file_exists($file = $this->dir.'/'.str_replace('\\', '/', $class).'.php')) {
+ require $file;
+ }
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/ClientAssertionType/ClientAssertionTypeInterface.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/ClientAssertionType/ClientAssertionTypeInterface.php
new file mode 100644
index 000000000..29c7171b5
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/ClientAssertionType/ClientAssertionTypeInterface.php
@@ -0,0 +1,15 @@
+<?php
+
+namespace OAuth2\ClientAssertionType;
+
+use OAuth2\RequestInterface;
+use OAuth2\ResponseInterface;
+
+/**
+ * Interface for all OAuth2 Client Assertion Types
+ */
+interface ClientAssertionTypeInterface
+{
+ public function validateRequest(RequestInterface $request, ResponseInterface $response);
+ public function getClientId();
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/ClientAssertionType/HttpBasic.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/ClientAssertionType/HttpBasic.php
new file mode 100644
index 000000000..0ecb7e18d
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/ClientAssertionType/HttpBasic.php
@@ -0,0 +1,123 @@
+<?php
+
+namespace OAuth2\ClientAssertionType;
+
+use OAuth2\Storage\ClientCredentialsInterface;
+use OAuth2\RequestInterface;
+use OAuth2\ResponseInterface;
+
+/**
+ * Validate a client via Http Basic authentication
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+class HttpBasic implements ClientAssertionTypeInterface
+{
+ private $clientData;
+
+ protected $storage;
+ protected $config;
+
+ /**
+ * @param OAuth2\Storage\ClientCredentialsInterface $clientStorage REQUIRED Storage class for retrieving client credentials information
+ * @param array $config OPTIONAL Configuration options for the server
+ * <code>
+ * $config = array(
+ * 'allow_credentials_in_request_body' => true, // whether to look for credentials in the POST body in addition to the Authorize HTTP Header
+ * 'allow_public_clients' => true // if true, "public clients" (clients without a secret) may be authenticated
+ * );
+ * </code>
+ */
+ public function __construct(ClientCredentialsInterface $storage, array $config = array())
+ {
+ $this->storage = $storage;
+ $this->config = array_merge(array(
+ 'allow_credentials_in_request_body' => true,
+ 'allow_public_clients' => true,
+ ), $config);
+ }
+
+ public function validateRequest(RequestInterface $request, ResponseInterface $response)
+ {
+ if (!$clientData = $this->getClientCredentials($request, $response)) {
+ return false;
+ }
+
+ if (!isset($clientData['client_id'])) {
+ throw new \LogicException('the clientData array must have "client_id" set');
+ }
+
+ if (!isset($clientData['client_secret']) || $clientData['client_secret'] == '') {
+ if (!$this->config['allow_public_clients']) {
+ $response->setError(400, 'invalid_client', 'client credentials are required');
+
+ return false;
+ }
+
+ if (!$this->storage->isPublicClient($clientData['client_id'])) {
+ $response->setError(400, 'invalid_client', 'This client is invalid or must authenticate using a client secret');
+
+ return false;
+ }
+ } elseif ($this->storage->checkClientCredentials($clientData['client_id'], $clientData['client_secret']) === false) {
+ $response->setError(400, 'invalid_client', 'The client credentials are invalid');
+
+ return false;
+ }
+
+ $this->clientData = $clientData;
+
+ return true;
+ }
+
+ public function getClientId()
+ {
+ return $this->clientData['client_id'];
+ }
+
+ /**
+ * Internal function used to get the client credentials from HTTP basic
+ * auth or POST data.
+ *
+ * According to the spec (draft 20), the client_id can be provided in
+ * the Basic Authorization header (recommended) or via GET/POST.
+ *
+ * @return
+ * A list containing the client identifier and password, for example
+ * @code
+ * return array(
+ * "client_id" => CLIENT_ID, // REQUIRED the client id
+ * "client_secret" => CLIENT_SECRET, // OPTIONAL the client secret (may be omitted for public clients)
+ * );
+ * @endcode
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-2.3.1
+ *
+ * @ingroup oauth2_section_2
+ */
+ public function getClientCredentials(RequestInterface $request, ResponseInterface $response = null)
+ {
+ if (!is_null($request->headers('PHP_AUTH_USER')) && !is_null($request->headers('PHP_AUTH_PW'))) {
+ return array('client_id' => $request->headers('PHP_AUTH_USER'), 'client_secret' => $request->headers('PHP_AUTH_PW'));
+ }
+
+ if ($this->config['allow_credentials_in_request_body']) {
+ // Using POST for HttpBasic authorization is not recommended, but is supported by specification
+ if (!is_null($request->request('client_id'))) {
+ /**
+ * client_secret can be null if the client's password is an empty string
+ * @see http://tools.ietf.org/html/rfc6749#section-2.3.1
+ */
+
+ return array('client_id' => $request->request('client_id'), 'client_secret' => $request->request('client_secret'));
+ }
+ }
+
+ if ($response) {
+ $message = $this->config['allow_credentials_in_request_body'] ? ' or body' : '';
+ $response->setError(400, 'invalid_client', 'Client credentials were not found in the headers'.$message);
+ }
+
+ return null;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Controller/AuthorizeController.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Controller/AuthorizeController.php
new file mode 100644
index 000000000..ea7f54a87
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Controller/AuthorizeController.php
@@ -0,0 +1,393 @@
+<?php
+
+namespace OAuth2\Controller;
+
+use OAuth2\Storage\ClientInterface;
+use OAuth2\ScopeInterface;
+use OAuth2\RequestInterface;
+use OAuth2\ResponseInterface;
+use OAuth2\Scope;
+
+/**
+ * @see OAuth2\Controller\AuthorizeControllerInterface
+ */
+class AuthorizeController implements AuthorizeControllerInterface
+{
+ private $scope;
+ private $state;
+ private $client_id;
+ private $redirect_uri;
+ private $response_type;
+
+ protected $clientStorage;
+ protected $responseTypes;
+ protected $config;
+ protected $scopeUtil;
+
+ /**
+ * @param OAuth2\Storage\ClientInterface $clientStorage REQUIRED Instance of OAuth2\Storage\ClientInterface to retrieve client information
+ * @param array $responseTypes OPTIONAL Array of OAuth2\ResponseType\ResponseTypeInterface objects. Valid array
+ * keys are "code" and "token"
+ * @param array $config OPTIONAL Configuration options for the server
+ * <code>
+ * $config = array(
+ * 'allow_implicit' => false, // if the controller should allow the "implicit" grant type
+ * 'enforce_state' => true // if the controller should require the "state" parameter
+ * 'require_exact_redirect_uri' => true, // if the controller should require an exact match on the "redirect_uri" parameter
+ * 'redirect_status_code' => 302, // HTTP status code to use for redirect responses
+ * );
+ * </code>
+ * @param OAuth2\ScopeInterface $scopeUtil OPTIONAL Instance of OAuth2\ScopeInterface to validate the requested scope
+ */
+ public function __construct(ClientInterface $clientStorage, array $responseTypes = array(), array $config = array(), ScopeInterface $scopeUtil = null)
+ {
+ $this->clientStorage = $clientStorage;
+ $this->responseTypes = $responseTypes;
+ $this->config = array_merge(array(
+ 'allow_implicit' => false,
+ 'enforce_state' => true,
+ 'require_exact_redirect_uri' => true,
+ 'redirect_status_code' => 302,
+ ), $config);
+
+ if (is_null($scopeUtil)) {
+ $scopeUtil = new Scope();
+ }
+ $this->scopeUtil = $scopeUtil;
+ }
+
+ public function handleAuthorizeRequest(RequestInterface $request, ResponseInterface $response, $is_authorized, $user_id = null)
+ {
+ if (!is_bool($is_authorized)) {
+ throw new \InvalidArgumentException('Argument "is_authorized" must be a boolean. This method must know if the user has granted access to the client.');
+ }
+
+ // We repeat this, because we need to re-validate. The request could be POSTed
+ // by a 3rd-party (because we are not internally enforcing NONCEs, etc)
+ if (!$this->validateAuthorizeRequest($request, $response)) {
+ return;
+ }
+
+ // If no redirect_uri is passed in the request, use client's registered one
+ if (empty($this->redirect_uri)) {
+ $clientData = $this->clientStorage->getClientDetails($this->client_id);
+ $registered_redirect_uri = $clientData['redirect_uri'];
+ }
+
+ // the user declined access to the client's application
+ if ($is_authorized === false) {
+ $redirect_uri = $this->redirect_uri ?: $registered_redirect_uri;
+ $this->setNotAuthorizedResponse($request, $response, $redirect_uri, $user_id);
+
+ return;
+ }
+
+ // build the parameters to set in the redirect URI
+ if (!$params = $this->buildAuthorizeParameters($request, $response, $user_id)) {
+ return;
+ }
+
+ $authResult = $this->responseTypes[$this->response_type]->getAuthorizeResponse($params, $user_id);
+
+ list($redirect_uri, $uri_params) = $authResult;
+
+ if (empty($redirect_uri) && !empty($registered_redirect_uri)) {
+ $redirect_uri = $registered_redirect_uri;
+ }
+
+ $uri = $this->buildUri($redirect_uri, $uri_params);
+
+ // return redirect response
+ $response->setRedirect($this->config['redirect_status_code'], $uri);
+ }
+
+ protected function setNotAuthorizedResponse(RequestInterface $request, ResponseInterface $response, $redirect_uri, $user_id = null)
+ {
+ $error = 'access_denied';
+ $error_message = 'The user denied access to your application';
+ $response->setRedirect($this->config['redirect_status_code'], $redirect_uri, $this->state, $error, $error_message);
+ }
+
+ /*
+ * We have made this protected so this class can be extended to add/modify
+ * these parameters
+ */
+ protected function buildAuthorizeParameters($request, $response, $user_id)
+ {
+ // @TODO: we should be explicit with this in the future
+ $params = array(
+ 'scope' => $this->scope,
+ 'state' => $this->state,
+ 'client_id' => $this->client_id,
+ 'redirect_uri' => $this->redirect_uri,
+ 'response_type' => $this->response_type,
+ );
+
+ return $params;
+ }
+
+ /**
+ * @param RequestInterface $request
+ * @param ResponseInterface $response
+ * @return bool
+ */
+ public function validateAuthorizeRequest(RequestInterface $request, ResponseInterface $response)
+ {
+ // Make sure a valid client id was supplied (we can not redirect because we were unable to verify the URI)
+ if (!$client_id = $request->query('client_id', $request->request('client_id'))) {
+ // We don't have a good URI to use
+ $response->setError(400, 'invalid_client', "No client id supplied");
+
+ return false;
+ }
+
+ // Get client details
+ if (!$clientData = $this->clientStorage->getClientDetails($client_id)) {
+ $response->setError(400, 'invalid_client', 'The client id supplied is invalid');
+
+ return false;
+ }
+
+ $registered_redirect_uri = isset($clientData['redirect_uri']) ? $clientData['redirect_uri'] : '';
+
+ // Make sure a valid redirect_uri was supplied. If specified, it must match the clientData URI.
+ // @see http://tools.ietf.org/html/rfc6749#section-3.1.2
+ // @see http://tools.ietf.org/html/rfc6749#section-4.1.2.1
+ // @see http://tools.ietf.org/html/rfc6749#section-4.2.2.1
+ if ($supplied_redirect_uri = $request->query('redirect_uri', $request->request('redirect_uri'))) {
+ // validate there is no fragment supplied
+ $parts = parse_url($supplied_redirect_uri);
+ if (isset($parts['fragment']) && $parts['fragment']) {
+ $response->setError(400, 'invalid_uri', 'The redirect URI must not contain a fragment');
+
+ return false;
+ }
+
+ // validate against the registered redirect uri(s) if available
+ if ($registered_redirect_uri && !$this->validateRedirectUri($supplied_redirect_uri, $registered_redirect_uri)) {
+ $response->setError(400, 'redirect_uri_mismatch', 'The redirect URI provided is missing or does not match', '#section-3.1.2');
+
+ return false;
+ }
+ $redirect_uri = $supplied_redirect_uri;
+ } else {
+ // use the registered redirect_uri if none has been supplied, if possible
+ if (!$registered_redirect_uri) {
+ $response->setError(400, 'invalid_uri', 'No redirect URI was supplied or stored');
+
+ return false;
+ }
+
+ if (count(explode(' ', $registered_redirect_uri)) > 1) {
+ $response->setError(400, 'invalid_uri', 'A redirect URI must be supplied when multiple redirect URIs are registered', '#section-3.1.2.3');
+
+ return false;
+ }
+ $redirect_uri = $registered_redirect_uri;
+ }
+
+ // Select the redirect URI
+ $response_type = $request->query('response_type', $request->request('response_type'));
+
+ // for multiple-valued response types - make them alphabetical
+ if (false !== strpos($response_type, ' ')) {
+ $types = explode(' ', $response_type);
+ sort($types);
+ $response_type = ltrim(implode(' ', $types));
+ }
+
+ $state = $request->query('state', $request->request('state'));
+
+ // type and client_id are required
+ if (!$response_type || !in_array($response_type, $this->getValidResponseTypes())) {
+ $response->setRedirect($this->config['redirect_status_code'], $redirect_uri, $state, 'invalid_request', 'Invalid or missing response type', null);
+
+ return false;
+ }
+
+ if ($response_type == self::RESPONSE_TYPE_AUTHORIZATION_CODE) {
+ if (!isset($this->responseTypes['code'])) {
+ $response->setRedirect($this->config['redirect_status_code'], $redirect_uri, $state, 'unsupported_response_type', 'authorization code grant type not supported', null);
+
+ return false;
+ }
+ if (!$this->clientStorage->checkRestrictedGrantType($client_id, 'authorization_code')) {
+ $response->setRedirect($this->config['redirect_status_code'], $redirect_uri, $state, 'unauthorized_client', 'The grant type is unauthorized for this client_id', null);
+
+ return false;
+ }
+ if ($this->responseTypes['code']->enforceRedirect() && !$redirect_uri) {
+ $response->setError(400, 'redirect_uri_mismatch', 'The redirect URI is mandatory and was not supplied');
+
+ return false;
+ }
+ } else {
+ if (!$this->config['allow_implicit']) {
+ $response->setRedirect($this->config['redirect_status_code'], $redirect_uri, $state, 'unsupported_response_type', 'implicit grant type not supported', null);
+
+ return false;
+ }
+ if (!$this->clientStorage->checkRestrictedGrantType($client_id, 'implicit')) {
+ $response->setRedirect($this->config['redirect_status_code'], $redirect_uri, $state, 'unauthorized_client', 'The grant type is unauthorized for this client_id', null);
+
+ return false;
+ }
+ }
+
+ // validate requested scope if it exists
+ $requestedScope = $this->scopeUtil->getScopeFromRequest($request);
+
+ if ($requestedScope) {
+ // restrict scope by client specific scope if applicable,
+ // otherwise verify the scope exists
+ $clientScope = $this->clientStorage->getClientScope($client_id);
+ if ((empty($clientScope) && !$this->scopeUtil->scopeExists($requestedScope))
+ || (!empty($clientScope) && !$this->scopeUtil->checkScope($requestedScope, $clientScope))) {
+ $response->setRedirect($this->config['redirect_status_code'], $redirect_uri, $state, 'invalid_scope', 'An unsupported scope was requested', null);
+
+ return false;
+ }
+ } else {
+ // use a globally-defined default scope
+ $defaultScope = $this->scopeUtil->getDefaultScope($client_id);
+
+ if (false === $defaultScope) {
+ $response->setRedirect($this->config['redirect_status_code'], $redirect_uri, $state, 'invalid_client', 'This application requires you specify a scope parameter', null);
+
+ return false;
+ }
+
+ $requestedScope = $defaultScope;
+ }
+
+ // Validate state parameter exists (if configured to enforce this)
+ if ($this->config['enforce_state'] && !$state) {
+ $response->setRedirect($this->config['redirect_status_code'], $redirect_uri, null, 'invalid_request', 'The state parameter is required');
+
+ return false;
+ }
+
+ // save the input data and return true
+ $this->scope = $requestedScope;
+ $this->state = $state;
+ $this->client_id = $client_id;
+ // Only save the SUPPLIED redirect URI (@see http://tools.ietf.org/html/rfc6749#section-4.1.3)
+ $this->redirect_uri = $supplied_redirect_uri;
+ $this->response_type = $response_type;
+
+ return true;
+ }
+
+ /**
+ * Build the absolute URI based on supplied URI and parameters.
+ *
+ * @param $uri An absolute URI.
+ * @param $params Parameters to be append as GET.
+ *
+ * @return
+ * An absolute URI with supplied parameters.
+ *
+ * @ingroup oauth2_section_4
+ */
+ private function buildUri($uri, $params)
+ {
+ $parse_url = parse_url($uri);
+
+ // Add our params to the parsed uri
+ foreach ($params as $k => $v) {
+ if (isset($parse_url[$k])) {
+ $parse_url[$k] .= "&" . http_build_query($v, '', '&');
+ } else {
+ $parse_url[$k] = http_build_query($v, '', '&');
+ }
+ }
+
+ // Put humpty dumpty back together
+ return
+ ((isset($parse_url["scheme"])) ? $parse_url["scheme"] . "://" : "")
+ . ((isset($parse_url["user"])) ? $parse_url["user"]
+ . ((isset($parse_url["pass"])) ? ":" . $parse_url["pass"] : "") . "@" : "")
+ . ((isset($parse_url["host"])) ? $parse_url["host"] : "")
+ . ((isset($parse_url["port"])) ? ":" . $parse_url["port"] : "")
+ . ((isset($parse_url["path"])) ? $parse_url["path"] : "")
+ . ((isset($parse_url["query"]) && !empty($parse_url['query'])) ? "?" . $parse_url["query"] : "")
+ . ((isset($parse_url["fragment"])) ? "#" . $parse_url["fragment"] : "")
+ ;
+ }
+
+ protected function getValidResponseTypes()
+ {
+ return array(
+ self::RESPONSE_TYPE_ACCESS_TOKEN,
+ self::RESPONSE_TYPE_AUTHORIZATION_CODE,
+ );
+ }
+
+ /**
+ * Internal method for validating redirect URI supplied
+ *
+ * @param string $inputUri The submitted URI to be validated
+ * @param string $registeredUriString The allowed URI(s) to validate against. Can be a space-delimited string of URIs to
+ * allow for multiple URIs
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-3.1.2
+ */
+ protected function validateRedirectUri($inputUri, $registeredUriString)
+ {
+ if (!$inputUri || !$registeredUriString) {
+ return false; // if either one is missing, assume INVALID
+ }
+
+ $registered_uris = preg_split('/\s+/', $registeredUriString);
+ foreach ($registered_uris as $registered_uri) {
+ if ($this->config['require_exact_redirect_uri']) {
+ // the input uri is validated against the registered uri using exact match
+ if (strcmp($inputUri, $registered_uri) === 0) {
+ return true;
+ }
+ } else {
+ $registered_uri_length = strlen($registered_uri);
+ if ($registered_uri_length === 0) {
+ return false;
+ }
+
+ // the input uri is validated against the registered uri using case-insensitive match of the initial string
+ // i.e. additional query parameters may be applied
+ if (strcasecmp(substr($inputUri, 0, $registered_uri_length), $registered_uri) === 0) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Convenience methods to access the parameters derived from the validated request
+ */
+
+ public function getScope()
+ {
+ return $this->scope;
+ }
+
+ public function getState()
+ {
+ return $this->state;
+ }
+
+ public function getClientId()
+ {
+ return $this->client_id;
+ }
+
+ public function getRedirectUri()
+ {
+ return $this->redirect_uri;
+ }
+
+ public function getResponseType()
+ {
+ return $this->response_type;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Controller/AuthorizeControllerInterface.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Controller/AuthorizeControllerInterface.php
new file mode 100644
index 000000000..fa07ae8d2
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Controller/AuthorizeControllerInterface.php
@@ -0,0 +1,43 @@
+<?php
+
+namespace OAuth2\Controller;
+
+use OAuth2\RequestInterface;
+use OAuth2\ResponseInterface;
+
+/**
+ * This controller is called when a user should be authorized
+ * by an authorization server. As OAuth2 does not handle
+ * authorization directly, this controller ensures the request is valid, but
+ * requires the application to determine the value of $is_authorized
+ *
+ * ex:
+ * > $user_id = $this->somehowDetermineUserId();
+ * > $is_authorized = $this->somehowDetermineUserAuthorization();
+ * > $response = new OAuth2\Response();
+ * > $authorizeController->handleAuthorizeRequest(
+ * > OAuth2\Request::createFromGlobals(),
+ * > $response,
+ * > $is_authorized,
+ * > $user_id);
+ * > $response->send();
+ *
+ */
+interface AuthorizeControllerInterface
+{
+ /**
+ * List of possible authentication response types.
+ * The "authorization_code" mechanism exclusively supports 'code'
+ * and the "implicit" mechanism exclusively supports 'token'.
+ *
+ * @var string
+ * @see http://tools.ietf.org/html/rfc6749#section-4.1.1
+ * @see http://tools.ietf.org/html/rfc6749#section-4.2.1
+ */
+ const RESPONSE_TYPE_AUTHORIZATION_CODE = 'code';
+ const RESPONSE_TYPE_ACCESS_TOKEN = 'token';
+
+ public function handleAuthorizeRequest(RequestInterface $request, ResponseInterface $response, $is_authorized, $user_id = null);
+
+ public function validateAuthorizeRequest(RequestInterface $request, ResponseInterface $response);
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Controller/ResourceController.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Controller/ResourceController.php
new file mode 100644
index 000000000..3cfaaaf12
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Controller/ResourceController.php
@@ -0,0 +1,111 @@
+<?php
+
+namespace OAuth2\Controller;
+
+use OAuth2\TokenType\TokenTypeInterface;
+use OAuth2\Storage\AccessTokenInterface;
+use OAuth2\ScopeInterface;
+use OAuth2\RequestInterface;
+use OAuth2\ResponseInterface;
+use OAuth2\Scope;
+
+/**
+ * @see OAuth2\Controller\ResourceControllerInterface
+ */
+class ResourceController implements ResourceControllerInterface
+{
+ private $token;
+
+ protected $tokenType;
+ protected $tokenStorage;
+ protected $config;
+ protected $scopeUtil;
+
+ public function __construct(TokenTypeInterface $tokenType, AccessTokenInterface $tokenStorage, $config = array(), ScopeInterface $scopeUtil = null)
+ {
+ $this->tokenType = $tokenType;
+ $this->tokenStorage = $tokenStorage;
+
+ $this->config = array_merge(array(
+ 'www_realm' => 'Service',
+ ), $config);
+
+ if (is_null($scopeUtil)) {
+ $scopeUtil = new Scope();
+ }
+ $this->scopeUtil = $scopeUtil;
+ }
+
+ public function verifyResourceRequest(RequestInterface $request, ResponseInterface $response, $scope = null)
+ {
+ $token = $this->getAccessTokenData($request, $response);
+
+ // Check if we have token data
+ if (is_null($token)) {
+ return false;
+ }
+
+ /**
+ * Check scope, if provided
+ * If token doesn't have a scope, it's null/empty, or it's insufficient, then throw 403
+ * @see http://tools.ietf.org/html/rfc6750#section-3.1
+ */
+ if ($scope && (!isset($token["scope"]) || !$token["scope"] || !$this->scopeUtil->checkScope($scope, $token["scope"]))) {
+ $response->setError(403, 'insufficient_scope', 'The request requires higher privileges than provided by the access token');
+ $response->addHttpHeaders(array(
+ 'WWW-Authenticate' => sprintf('%s realm="%s", scope="%s", error="%s", error_description="%s"',
+ $this->tokenType->getTokenType(),
+ $this->config['www_realm'],
+ $scope,
+ $response->getParameter('error'),
+ $response->getParameter('error_description')
+ )
+ ));
+
+ return false;
+ }
+
+ // allow retrieval of the token
+ $this->token = $token;
+
+ return (bool) $token;
+ }
+
+ public function getAccessTokenData(RequestInterface $request, ResponseInterface $response)
+ {
+ // Get the token parameter
+ if ($token_param = $this->tokenType->getAccessTokenParameter($request, $response)) {
+ // Get the stored token data (from the implementing subclass)
+ // Check we have a well formed token
+ // Check token expiration (expires is a mandatory paramter)
+ if (!$token = $this->tokenStorage->getAccessToken($token_param)) {
+ $response->setError(401, 'invalid_token', 'The access token provided is invalid');
+ } elseif (!isset($token["expires"]) || !isset($token["client_id"])) {
+ $response->setError(401, 'malformed_token', 'Malformed token (missing "expires")');
+ } elseif (time() > $token["expires"]) {
+ $response->setError(401, 'invalid_token', 'The access token provided has expired');
+ } else {
+ return $token;
+ }
+ }
+
+ $authHeader = sprintf('%s realm="%s"', $this->tokenType->getTokenType(), $this->config['www_realm']);
+
+ if ($error = $response->getParameter('error')) {
+ $authHeader = sprintf('%s, error="%s"', $authHeader, $error);
+ if ($error_description = $response->getParameter('error_description')) {
+ $authHeader = sprintf('%s, error_description="%s"', $authHeader, $error_description);
+ }
+ }
+
+ $response->addHttpHeaders(array('WWW-Authenticate' => $authHeader));
+
+ return null;
+ }
+
+ // convenience method to allow retrieval of the token
+ public function getToken()
+ {
+ return $this->token;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Controller/ResourceControllerInterface.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Controller/ResourceControllerInterface.php
new file mode 100644
index 000000000..611421935
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Controller/ResourceControllerInterface.php
@@ -0,0 +1,26 @@
+<?php
+
+namespace OAuth2\Controller;
+
+use OAuth2\RequestInterface;
+use OAuth2\ResponseInterface;
+
+/**
+ * This controller is called when a "resource" is requested.
+ * call verifyResourceRequest in order to determine if the request
+ * contains a valid token.
+ *
+ * ex:
+ * > if (!$resourceController->verifyResourceRequest(OAuth2\Request::createFromGlobals(), $response = new OAuth2\Response())) {
+ * > $response->send(); // authorization failed
+ * > die();
+ * > }
+ * > return json_encode($resource); // valid token! Send the stuff!
+ *
+ */
+interface ResourceControllerInterface
+{
+ public function verifyResourceRequest(RequestInterface $request, ResponseInterface $response, $scope = null);
+
+ public function getAccessTokenData(RequestInterface $request, ResponseInterface $response);
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Controller/TokenController.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Controller/TokenController.php
new file mode 100644
index 000000000..5d2d731fe
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Controller/TokenController.php
@@ -0,0 +1,295 @@
+<?php
+
+namespace OAuth2\Controller;
+
+use OAuth2\ResponseType\AccessTokenInterface;
+use OAuth2\ClientAssertionType\ClientAssertionTypeInterface;
+use OAuth2\GrantType\GrantTypeInterface;
+use OAuth2\ScopeInterface;
+use OAuth2\Scope;
+use OAuth2\Storage\ClientInterface;
+use OAuth2\RequestInterface;
+use OAuth2\ResponseInterface;
+
+/**
+ * @see \OAuth2\Controller\TokenControllerInterface
+ */
+class TokenController implements TokenControllerInterface
+{
+ /**
+ * @var AccessTokenInterface
+ */
+ protected $accessToken;
+
+ /**
+ * @var array
+ */
+ protected $grantTypes;
+
+ /**
+ * @var ClientAssertionTypeInterface
+ */
+ protected $clientAssertionType;
+
+ /**
+ * @var Scope|ScopeInterface
+ */
+ protected $scopeUtil;
+
+ /**
+ * @var ClientInterface
+ */
+ protected $clientStorage;
+
+ public function __construct(AccessTokenInterface $accessToken, ClientInterface $clientStorage, array $grantTypes = array(), ClientAssertionTypeInterface $clientAssertionType = null, ScopeInterface $scopeUtil = null)
+ {
+ if (is_null($clientAssertionType)) {
+ foreach ($grantTypes as $grantType) {
+ if (!$grantType instanceof ClientAssertionTypeInterface) {
+ throw new \InvalidArgumentException('You must supply an instance of OAuth2\ClientAssertionType\ClientAssertionTypeInterface or only use grant types which implement OAuth2\ClientAssertionType\ClientAssertionTypeInterface');
+ }
+ }
+ }
+ $this->clientAssertionType = $clientAssertionType;
+ $this->accessToken = $accessToken;
+ $this->clientStorage = $clientStorage;
+ foreach ($grantTypes as $grantType) {
+ $this->addGrantType($grantType);
+ }
+
+ if (is_null($scopeUtil)) {
+ $scopeUtil = new Scope();
+ }
+ $this->scopeUtil = $scopeUtil;
+ }
+
+ public function handleTokenRequest(RequestInterface $request, ResponseInterface $response)
+ {
+ if ($token = $this->grantAccessToken($request, $response)) {
+ // @see http://tools.ietf.org/html/rfc6749#section-5.1
+ // server MUST disable caching in headers when tokens are involved
+ $response->setStatusCode(200);
+ $response->addParameters($token);
+ $response->addHttpHeaders(array(
+ 'Cache-Control' => 'no-store',
+ 'Pragma' => 'no-cache',
+ 'Content-Type' => 'application/json'
+ ));
+ }
+ }
+
+ /**
+ * Grant or deny a requested access token.
+ * This would be called from the "/token" endpoint as defined in the spec.
+ * You can call your endpoint whatever you want.
+ *
+ * @param RequestInterface $request Request object to grant access token
+ * @param ResponseInterface $response
+ *
+ * @throws \InvalidArgumentException
+ * @throws \LogicException
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-4
+ * @see http://tools.ietf.org/html/rfc6749#section-10.6
+ * @see http://tools.ietf.org/html/rfc6749#section-4.1.3
+ *
+ * @ingroup oauth2_section_4
+ */
+ public function grantAccessToken(RequestInterface $request, ResponseInterface $response)
+ {
+ if (strtolower($request->server('REQUEST_METHOD')) != 'post') {
+ $response->setError(405, 'invalid_request', 'The request method must be POST when requesting an access token', '#section-3.2');
+ $response->addHttpHeaders(array('Allow' => 'POST'));
+
+ return null;
+ }
+
+ /**
+ * Determine grant type from request
+ * and validate the request for that grant type
+ */
+ if (!$grantTypeIdentifier = $request->request('grant_type')) {
+ $response->setError(400, 'invalid_request', 'The grant type was not specified in the request');
+
+ return null;
+ }
+
+ if (!isset($this->grantTypes[$grantTypeIdentifier])) {
+ /* TODO: If this is an OAuth2 supported grant type that we have chosen not to implement, throw a 501 Not Implemented instead */
+ $response->setError(400, 'unsupported_grant_type', sprintf('Grant type "%s" not supported', $grantTypeIdentifier));
+
+ return null;
+ }
+
+ $grantType = $this->grantTypes[$grantTypeIdentifier];
+
+ /**
+ * Retrieve the client information from the request
+ * ClientAssertionTypes allow for grant types which also assert the client data
+ * in which case ClientAssertion is handled in the validateRequest method
+ *
+ * @see OAuth2\GrantType\JWTBearer
+ * @see OAuth2\GrantType\ClientCredentials
+ */
+ if (!$grantType instanceof ClientAssertionTypeInterface) {
+ if (!$this->clientAssertionType->validateRequest($request, $response)) {
+ return null;
+ }
+ $clientId = $this->clientAssertionType->getClientId();
+ }
+
+ /**
+ * Retrieve the grant type information from the request
+ * The GrantTypeInterface object handles all validation
+ * If the object is an instance of ClientAssertionTypeInterface,
+ * That logic is handled here as well
+ */
+ if (!$grantType->validateRequest($request, $response)) {
+ return null;
+ }
+
+ if ($grantType instanceof ClientAssertionTypeInterface) {
+ $clientId = $grantType->getClientId();
+ } else {
+ // validate the Client ID (if applicable)
+ if (!is_null($storedClientId = $grantType->getClientId()) && $storedClientId != $clientId) {
+ $response->setError(400, 'invalid_grant', sprintf('%s doesn\'t exist or is invalid for the client', $grantTypeIdentifier));
+
+ return null;
+ }
+ }
+
+ /**
+ * Validate the client can use the requested grant type
+ */
+ if (!$this->clientStorage->checkRestrictedGrantType($clientId, $grantTypeIdentifier)) {
+ $response->setError(400, 'unauthorized_client', 'The grant type is unauthorized for this client_id');
+
+ return false;
+ }
+
+ /**
+ * Validate the scope of the token
+ *
+ * requestedScope - the scope specified in the token request
+ * availableScope - the scope associated with the grant type
+ * ex: in the case of the "Authorization Code" grant type,
+ * the scope is specified in the authorize request
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-3.3
+ */
+
+ $requestedScope = $this->scopeUtil->getScopeFromRequest($request);
+ $availableScope = $grantType->getScope();
+
+ if ($requestedScope) {
+ // validate the requested scope
+ if ($availableScope) {
+ if (!$this->scopeUtil->checkScope($requestedScope, $availableScope)) {
+ $response->setError(400, 'invalid_scope', 'The scope requested is invalid for this request');
+
+ return null;
+ }
+ } else {
+ // validate the client has access to this scope
+ if ($clientScope = $this->clientStorage->getClientScope($clientId)) {
+ if (!$this->scopeUtil->checkScope($requestedScope, $clientScope)) {
+ $response->setError(400, 'invalid_scope', 'The scope requested is invalid for this client');
+
+ return false;
+ }
+ } elseif (!$this->scopeUtil->scopeExists($requestedScope)) {
+ $response->setError(400, 'invalid_scope', 'An unsupported scope was requested');
+
+ return null;
+ }
+ }
+ } elseif ($availableScope) {
+ // use the scope associated with this grant type
+ $requestedScope = $availableScope;
+ } else {
+ // use a globally-defined default scope
+ $defaultScope = $this->scopeUtil->getDefaultScope($clientId);
+
+ // "false" means default scopes are not allowed
+ if (false === $defaultScope) {
+ $response->setError(400, 'invalid_scope', 'This application requires you specify a scope parameter');
+
+ return null;
+ }
+
+ $requestedScope = $defaultScope;
+ }
+
+ return $grantType->createAccessToken($this->accessToken, $clientId, $grantType->getUserId(), $requestedScope);
+ }
+
+ /**
+ * addGrantType
+ *
+ * @param GrantTypeInterface $grantType the grant type to add for the specified identifier
+ * @param string $identifier a string passed in as "grant_type" in the response that will call this grantType
+ */
+ public function addGrantType(GrantTypeInterface $grantType, $identifier = null)
+ {
+ if (is_null($identifier) || is_numeric($identifier)) {
+ $identifier = $grantType->getQuerystringIdentifier();
+ }
+
+ $this->grantTypes[$identifier] = $grantType;
+ }
+
+ public function handleRevokeRequest(RequestInterface $request, ResponseInterface $response)
+ {
+ if ($this->revokeToken($request, $response)) {
+ $response->setStatusCode(200);
+ $response->addParameters(array('revoked' => true));
+ }
+ }
+
+ /**
+ * Revoke a refresh or access token. Returns true on success and when tokens are invalid
+ *
+ * Note: invalid tokens do not cause an error response since the client
+ * cannot handle such an error in a reasonable way. Moreover, the
+ * purpose of the revocation request, invalidating the particular token,
+ * is already achieved.
+ *
+ * @param RequestInterface $request
+ * @param ResponseInterface $response
+ * @return bool|null
+ */
+ public function revokeToken(RequestInterface $request, ResponseInterface $response)
+ {
+ if (strtolower($request->server('REQUEST_METHOD')) != 'post') {
+ $response->setError(405, 'invalid_request', 'The request method must be POST when revoking an access token', '#section-3.2');
+ $response->addHttpHeaders(array('Allow' => 'POST'));
+
+ return null;
+ }
+
+ $token_type_hint = $request->request('token_type_hint');
+ if (!in_array($token_type_hint, array(null, 'access_token', 'refresh_token'), true)) {
+ $response->setError(400, 'invalid_request', 'Token type hint must be either \'access_token\' or \'refresh_token\'');
+
+ return null;
+ }
+
+ $token = $request->request('token');
+ if ($token === null) {
+ $response->setError(400, 'invalid_request', 'Missing token parameter to revoke');
+
+ return null;
+ }
+
+ // @todo remove this check for v2.0
+ if (!method_exists($this->accessToken, 'revokeToken')) {
+ $class = get_class($this->accessToken);
+ throw new \RuntimeException("AccessToken {$class} does not implement required revokeToken method");
+ }
+
+ $this->accessToken->revokeToken($token, $token_type_hint);
+
+ return true;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Controller/TokenControllerInterface.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Controller/TokenControllerInterface.php
new file mode 100644
index 000000000..72d72570f
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Controller/TokenControllerInterface.php
@@ -0,0 +1,32 @@
+<?php
+
+namespace OAuth2\Controller;
+
+use OAuth2\RequestInterface;
+use OAuth2\ResponseInterface;
+
+/**
+ * This controller is called when a token is being requested.
+ * it is called to handle all grant types the application supports.
+ * It also validates the client's credentials
+ *
+ * ex:
+ * > $tokenController->handleTokenRequest(OAuth2\Request::createFromGlobals(), $response = new OAuth2\Response());
+ * > $response->send();
+ *
+ */
+interface TokenControllerInterface
+{
+ /**
+ * handleTokenRequest
+ *
+ * @param $request
+ * OAuth2\RequestInterface - The current http request
+ * @param $response
+ * OAuth2\ResponseInterface - An instance of OAuth2\ResponseInterface to contain the response data
+ *
+ */
+ public function handleTokenRequest(RequestInterface $request, ResponseInterface $response);
+
+ public function grantAccessToken(RequestInterface $request, ResponseInterface $response);
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Encryption/EncryptionInterface.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Encryption/EncryptionInterface.php
new file mode 100644
index 000000000..2d336c664
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Encryption/EncryptionInterface.php
@@ -0,0 +1,11 @@
+<?php
+
+namespace OAuth2\Encryption;
+
+interface EncryptionInterface
+{
+ public function encode($payload, $key, $algorithm = null);
+ public function decode($payload, $key, $algorithm = null);
+ public function urlSafeB64Encode($data);
+ public function urlSafeB64Decode($b64);
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Encryption/FirebaseJwt.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Encryption/FirebaseJwt.php
new file mode 100644
index 000000000..1b527e0a0
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Encryption/FirebaseJwt.php
@@ -0,0 +1,47 @@
+<?php
+
+namespace OAuth2\Encryption;
+
+/**
+ * Bridge file to use the firebase/php-jwt package for JWT encoding and decoding.
+ * @author Francis Chuang <francis.chuang@gmail.com>
+ */
+class FirebaseJwt implements EncryptionInterface
+{
+ public function __construct()
+ {
+ if (!class_exists('\JWT')) {
+ throw new \ErrorException('firebase/php-jwt must be installed to use this feature. You can do this by running "composer require firebase/php-jwt"');
+ }
+ }
+
+ public function encode($payload, $key, $alg = 'HS256', $keyId = null)
+ {
+ return \JWT::encode($payload, $key, $alg, $keyId);
+ }
+
+ public function decode($jwt, $key = null, $allowedAlgorithms = null)
+ {
+ try {
+
+ //Maintain BC: Do not verify if no algorithms are passed in.
+ if (!$allowedAlgorithms) {
+ $key = null;
+ }
+
+ return (array)\JWT::decode($jwt, $key, $allowedAlgorithms);
+ } catch (\Exception $e) {
+ return false;
+ }
+ }
+
+ public function urlSafeB64Encode($data)
+ {
+ return \JWT::urlsafeB64Encode($data);
+ }
+
+ public function urlSafeB64Decode($b64)
+ {
+ return \JWT::urlsafeB64Decode($b64);
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Encryption/Jwt.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Encryption/Jwt.php
new file mode 100644
index 000000000..ee576e643
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Encryption/Jwt.php
@@ -0,0 +1,173 @@
+<?php
+
+namespace OAuth2\Encryption;
+
+/**
+ * @link https://github.com/F21/jwt
+ * @author F21
+ */
+class Jwt implements EncryptionInterface
+{
+ public function encode($payload, $key, $algo = 'HS256')
+ {
+ $header = $this->generateJwtHeader($payload, $algo);
+
+ $segments = array(
+ $this->urlSafeB64Encode(json_encode($header)),
+ $this->urlSafeB64Encode(json_encode($payload))
+ );
+
+ $signing_input = implode('.', $segments);
+
+ $signature = $this->sign($signing_input, $key, $algo);
+ $segments[] = $this->urlsafeB64Encode($signature);
+
+ return implode('.', $segments);
+ }
+
+ public function decode($jwt, $key = null, $allowedAlgorithms = true)
+ {
+ if (!strpos($jwt, '.')) {
+ return false;
+ }
+
+ $tks = explode('.', $jwt);
+
+ if (count($tks) != 3) {
+ return false;
+ }
+
+ list($headb64, $payloadb64, $cryptob64) = $tks;
+
+ if (null === ($header = json_decode($this->urlSafeB64Decode($headb64), true))) {
+ return false;
+ }
+
+ if (null === $payload = json_decode($this->urlSafeB64Decode($payloadb64), true)) {
+ return false;
+ }
+
+ $sig = $this->urlSafeB64Decode($cryptob64);
+
+ if ((bool) $allowedAlgorithms) {
+ if (!isset($header['alg'])) {
+ return false;
+ }
+
+ // check if bool arg supplied here to maintain BC
+ if (is_array($allowedAlgorithms) && !in_array($header['alg'], $allowedAlgorithms)) {
+ return false;
+ }
+
+ if (!$this->verifySignature($sig, "$headb64.$payloadb64", $key, $header['alg'])) {
+ return false;
+ }
+ }
+
+ return $payload;
+ }
+
+ private function verifySignature($signature, $input, $key, $algo = 'HS256')
+ {
+ // use constants when possible, for HipHop support
+ switch ($algo) {
+ case'HS256':
+ case'HS384':
+ case'HS512':
+ return $this->hash_equals(
+ $this->sign($input, $key, $algo),
+ $signature
+ );
+
+ case 'RS256':
+ return openssl_verify($input, $signature, $key, defined('OPENSSL_ALGO_SHA256') ? OPENSSL_ALGO_SHA256 : 'sha256') === 1;
+
+ case 'RS384':
+ return @openssl_verify($input, $signature, $key, defined('OPENSSL_ALGO_SHA384') ? OPENSSL_ALGO_SHA384 : 'sha384') === 1;
+
+ case 'RS512':
+ return @openssl_verify($input, $signature, $key, defined('OPENSSL_ALGO_SHA512') ? OPENSSL_ALGO_SHA512 : 'sha512') === 1;
+
+ default:
+ throw new \InvalidArgumentException("Unsupported or invalid signing algorithm.");
+ }
+ }
+
+ private function sign($input, $key, $algo = 'HS256')
+ {
+ switch ($algo) {
+ case 'HS256':
+ return hash_hmac('sha256', $input, $key, true);
+
+ case 'HS384':
+ return hash_hmac('sha384', $input, $key, true);
+
+ case 'HS512':
+ return hash_hmac('sha512', $input, $key, true);
+
+ case 'RS256':
+ return $this->generateRSASignature($input, $key, defined('OPENSSL_ALGO_SHA256') ? OPENSSL_ALGO_SHA256 : 'sha256');
+
+ case 'RS384':
+ return $this->generateRSASignature($input, $key, defined('OPENSSL_ALGO_SHA384') ? OPENSSL_ALGO_SHA384 : 'sha384');
+
+ case 'RS512':
+ return $this->generateRSASignature($input, $key, defined('OPENSSL_ALGO_SHA512') ? OPENSSL_ALGO_SHA512 : 'sha512');
+
+ default:
+ throw new \Exception("Unsupported or invalid signing algorithm.");
+ }
+ }
+
+ private function generateRSASignature($input, $key, $algo)
+ {
+ if (!openssl_sign($input, $signature, $key, $algo)) {
+ throw new \Exception("Unable to sign data.");
+ }
+
+ return $signature;
+ }
+
+ public function urlSafeB64Encode($data)
+ {
+ $b64 = base64_encode($data);
+ $b64 = str_replace(array('+', '/', "\r", "\n", '='),
+ array('-', '_'),
+ $b64);
+
+ return $b64;
+ }
+
+ public function urlSafeB64Decode($b64)
+ {
+ $b64 = str_replace(array('-', '_'),
+ array('+', '/'),
+ $b64);
+
+ return base64_decode($b64);
+ }
+
+ /**
+ * Override to create a custom header
+ */
+ protected function generateJwtHeader($payload, $algorithm)
+ {
+ return array(
+ 'typ' => 'JWT',
+ 'alg' => $algorithm,
+ );
+ }
+
+ protected function hash_equals($a, $b)
+ {
+ if (function_exists('hash_equals')) {
+ return hash_equals($a, $b);
+ }
+ $diff = strlen($a) ^ strlen($b);
+ for ($i = 0; $i < strlen($a) && $i < strlen($b); $i++) {
+ $diff |= ord($a[$i]) ^ ord($b[$i]);
+ }
+
+ return $diff === 0;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/GrantType/AuthorizationCode.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/GrantType/AuthorizationCode.php
new file mode 100644
index 000000000..cae9f787d
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/GrantType/AuthorizationCode.php
@@ -0,0 +1,100 @@
+<?php
+
+namespace OAuth2\GrantType;
+
+use OAuth2\Storage\AuthorizationCodeInterface;
+use OAuth2\ResponseType\AccessTokenInterface;
+use OAuth2\RequestInterface;
+use OAuth2\ResponseInterface;
+
+/**
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+class AuthorizationCode implements GrantTypeInterface
+{
+ protected $storage;
+ protected $authCode;
+
+ /**
+ * @param \OAuth2\Storage\AuthorizationCodeInterface $storage REQUIRED Storage class for retrieving authorization code information
+ */
+ public function __construct(AuthorizationCodeInterface $storage)
+ {
+ $this->storage = $storage;
+ }
+
+ public function getQuerystringIdentifier()
+ {
+ return 'authorization_code';
+ }
+
+ public function validateRequest(RequestInterface $request, ResponseInterface $response)
+ {
+ if (!$request->request('code')) {
+ $response->setError(400, 'invalid_request', 'Missing parameter: "code" is required');
+
+ return false;
+ }
+
+ $code = $request->request('code');
+ if (!$authCode = $this->storage->getAuthorizationCode($code)) {
+ $response->setError(400, 'invalid_grant', 'Authorization code doesn\'t exist or is invalid for the client');
+
+ return false;
+ }
+
+ /*
+ * 4.1.3 - ensure that the "redirect_uri" parameter is present if the "redirect_uri" parameter was included in the initial authorization request
+ * @uri - http://tools.ietf.org/html/rfc6749#section-4.1.3
+ */
+ if (isset($authCode['redirect_uri']) && $authCode['redirect_uri']) {
+ if (!$request->request('redirect_uri') || urldecode($request->request('redirect_uri')) != urldecode($authCode['redirect_uri'])) {
+ $response->setError(400, 'redirect_uri_mismatch', "The redirect URI is missing or do not match", "#section-4.1.3");
+
+ return false;
+ }
+ }
+
+ if (!isset($authCode['expires'])) {
+ throw new \Exception('Storage must return authcode with a value for "expires"');
+ }
+
+ if ($authCode["expires"] < time()) {
+ $response->setError(400, 'invalid_grant', "The authorization code has expired");
+
+ return false;
+ }
+
+ if (!isset($authCode['code'])) {
+ $authCode['code'] = $code; // used to expire the code after the access token is granted
+ }
+
+ $this->authCode = $authCode;
+
+ return true;
+ }
+
+ public function getClientId()
+ {
+ return $this->authCode['client_id'];
+ }
+
+ public function getScope()
+ {
+ return isset($this->authCode['scope']) ? $this->authCode['scope'] : null;
+ }
+
+ public function getUserId()
+ {
+ return isset($this->authCode['user_id']) ? $this->authCode['user_id'] : null;
+ }
+
+ public function createAccessToken(AccessTokenInterface $accessToken, $client_id, $user_id, $scope)
+ {
+ $token = $accessToken->createAccessToken($client_id, $user_id, $scope);
+ $this->storage->expireAuthorizationCode($this->authCode['code']);
+
+ return $token;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/GrantType/ClientCredentials.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/GrantType/ClientCredentials.php
new file mode 100644
index 000000000..f953e4e8d
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/GrantType/ClientCredentials.php
@@ -0,0 +1,67 @@
+<?php
+
+namespace OAuth2\GrantType;
+
+use OAuth2\ClientAssertionType\HttpBasic;
+use OAuth2\ResponseType\AccessTokenInterface;
+use OAuth2\Storage\ClientCredentialsInterface;
+
+/**
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ *
+ * @see OAuth2\ClientAssertionType_HttpBasic
+ */
+class ClientCredentials extends HttpBasic implements GrantTypeInterface
+{
+ private $clientData;
+
+ public function __construct(ClientCredentialsInterface $storage, array $config = array())
+ {
+ /**
+ * The client credentials grant type MUST only be used by confidential clients
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-4.4
+ */
+ $config['allow_public_clients'] = false;
+
+ parent::__construct($storage, $config);
+ }
+
+ public function getQuerystringIdentifier()
+ {
+ return 'client_credentials';
+ }
+
+ public function getScope()
+ {
+ $this->loadClientData();
+
+ return isset($this->clientData['scope']) ? $this->clientData['scope'] : null;
+ }
+
+ public function getUserId()
+ {
+ $this->loadClientData();
+
+ return isset($this->clientData['user_id']) ? $this->clientData['user_id'] : null;
+ }
+
+ public function createAccessToken(AccessTokenInterface $accessToken, $client_id, $user_id, $scope)
+ {
+ /**
+ * Client Credentials Grant does NOT include a refresh token
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-4.4.3
+ */
+ $includeRefreshToken = false;
+
+ return $accessToken->createAccessToken($client_id, $user_id, $scope, $includeRefreshToken);
+ }
+
+ private function loadClientData()
+ {
+ if (!$this->clientData) {
+ $this->clientData = $this->storage->getClientDetails($this->getClientId());
+ }
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/GrantType/GrantTypeInterface.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/GrantType/GrantTypeInterface.php
new file mode 100644
index 000000000..98489e9c1
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/GrantType/GrantTypeInterface.php
@@ -0,0 +1,20 @@
+<?php
+
+namespace OAuth2\GrantType;
+
+use OAuth2\ResponseType\AccessTokenInterface;
+use OAuth2\RequestInterface;
+use OAuth2\ResponseInterface;
+
+/**
+ * Interface for all OAuth2 Grant Types
+ */
+interface GrantTypeInterface
+{
+ public function getQuerystringIdentifier();
+ public function validateRequest(RequestInterface $request, ResponseInterface $response);
+ public function getClientId();
+ public function getUserId();
+ public function getScope();
+ public function createAccessToken(AccessTokenInterface $accessToken, $client_id, $user_id, $scope);
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/GrantType/JwtBearer.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/GrantType/JwtBearer.php
new file mode 100644
index 000000000..bb11a6954
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/GrantType/JwtBearer.php
@@ -0,0 +1,226 @@
+<?php
+
+namespace OAuth2\GrantType;
+
+use OAuth2\ClientAssertionType\ClientAssertionTypeInterface;
+use OAuth2\Storage\JwtBearerInterface;
+use OAuth2\Encryption\Jwt;
+use OAuth2\Encryption\EncryptionInterface;
+use OAuth2\ResponseType\AccessTokenInterface;
+use OAuth2\RequestInterface;
+use OAuth2\ResponseInterface;
+
+/**
+ * The JWT bearer authorization grant implements JWT (JSON Web Tokens) as a grant type per the IETF draft.
+ *
+ * @see http://tools.ietf.org/html/draft-ietf-oauth-jwt-bearer-04#section-4
+ *
+ * @author F21
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+class JwtBearer implements GrantTypeInterface, ClientAssertionTypeInterface
+{
+ private $jwt;
+
+ protected $storage;
+ protected $audience;
+ protected $jwtUtil;
+ protected $allowedAlgorithms;
+
+ /**
+ * Creates an instance of the JWT bearer grant type.
+ *
+ * @param OAuth2\Storage\JWTBearerInterface|JwtBearerInterface $storage A valid storage interface that implements storage hooks for the JWT bearer grant type.
+ * @param string $audience The audience to validate the token against. This is usually the full URI of the OAuth token requests endpoint.
+ * @param EncryptionInterface|OAuth2\Encryption\JWT $jwtUtil OPTONAL The class used to decode, encode and verify JWTs.
+ * @param array $config
+ */
+ public function __construct(JwtBearerInterface $storage, $audience, EncryptionInterface $jwtUtil = null, array $config = array())
+ {
+ $this->storage = $storage;
+ $this->audience = $audience;
+
+ if (is_null($jwtUtil)) {
+ $jwtUtil = new Jwt();
+ }
+
+ $this->config = array_merge(array(
+ 'allowed_algorithms' => array('RS256', 'RS384', 'RS512')
+ ), $config);
+
+ $this->jwtUtil = $jwtUtil;
+
+ $this->allowedAlgorithms = $this->config['allowed_algorithms'];
+ }
+
+ /**
+ * Returns the grant_type get parameter to identify the grant type request as JWT bearer authorization grant.
+ *
+ * @return
+ * The string identifier for grant_type.
+ *
+ * @see OAuth2\GrantType\GrantTypeInterface::getQuerystringIdentifier()
+ */
+ public function getQuerystringIdentifier()
+ {
+ return 'urn:ietf:params:oauth:grant-type:jwt-bearer';
+ }
+
+ /**
+ * Validates the data from the decoded JWT.
+ *
+ * @return
+ * TRUE if the JWT request is valid and can be decoded. Otherwise, FALSE is returned.
+ *
+ * @see OAuth2\GrantType\GrantTypeInterface::getTokenData()
+ */
+ public function validateRequest(RequestInterface $request, ResponseInterface $response)
+ {
+ if (!$request->request("assertion")) {
+ $response->setError(400, 'invalid_request', 'Missing parameters: "assertion" required');
+
+ return null;
+ }
+
+ // Store the undecoded JWT for later use
+ $undecodedJWT = $request->request('assertion');
+
+ // Decode the JWT
+ $jwt = $this->jwtUtil->decode($request->request('assertion'), null, false);
+
+ if (!$jwt) {
+ $response->setError(400, 'invalid_request', "JWT is malformed");
+
+ return null;
+ }
+
+ // ensure these properties contain a value
+ // @todo: throw malformed error for missing properties
+ $jwt = array_merge(array(
+ 'scope' => null,
+ 'iss' => null,
+ 'sub' => null,
+ 'aud' => null,
+ 'exp' => null,
+ 'nbf' => null,
+ 'iat' => null,
+ 'jti' => null,
+ 'typ' => null,
+ ), $jwt);
+
+ if (!isset($jwt['iss'])) {
+ $response->setError(400, 'invalid_grant', "Invalid issuer (iss) provided");
+
+ return null;
+ }
+
+ if (!isset($jwt['sub'])) {
+ $response->setError(400, 'invalid_grant', "Invalid subject (sub) provided");
+
+ return null;
+ }
+
+ if (!isset($jwt['exp'])) {
+ $response->setError(400, 'invalid_grant', "Expiration (exp) time must be present");
+
+ return null;
+ }
+
+ // Check expiration
+ if (ctype_digit($jwt['exp'])) {
+ if ($jwt['exp'] <= time()) {
+ $response->setError(400, 'invalid_grant', "JWT has expired");
+
+ return null;
+ }
+ } else {
+ $response->setError(400, 'invalid_grant', "Expiration (exp) time must be a unix time stamp");
+
+ return null;
+ }
+
+ // Check the not before time
+ if ($notBefore = $jwt['nbf']) {
+ if (ctype_digit($notBefore)) {
+ if ($notBefore > time()) {
+ $response->setError(400, 'invalid_grant', "JWT cannot be used before the Not Before (nbf) time");
+
+ return null;
+ }
+ } else {
+ $response->setError(400, 'invalid_grant', "Not Before (nbf) time must be a unix time stamp");
+
+ return null;
+ }
+ }
+
+ // Check the audience if required to match
+ if (!isset($jwt['aud']) || ($jwt['aud'] != $this->audience)) {
+ $response->setError(400, 'invalid_grant', "Invalid audience (aud)");
+
+ return null;
+ }
+
+ // Check the jti (nonce)
+ // @see http://tools.ietf.org/html/draft-ietf-oauth-json-web-token-13#section-4.1.7
+ if (isset($jwt['jti'])) {
+ $jti = $this->storage->getJti($jwt['iss'], $jwt['sub'], $jwt['aud'], $jwt['exp'], $jwt['jti']);
+
+ //Reject if jti is used and jwt is still valid (exp parameter has not expired).
+ if ($jti && $jti['expires'] > time()) {
+ $response->setError(400, 'invalid_grant', "JSON Token Identifier (jti) has already been used");
+
+ return null;
+ } else {
+ $this->storage->setJti($jwt['iss'], $jwt['sub'], $jwt['aud'], $jwt['exp'], $jwt['jti']);
+ }
+ }
+
+ // Get the iss's public key
+ // @see http://tools.ietf.org/html/draft-ietf-oauth-json-web-token-06#section-4.1.1
+ if (!$key = $this->storage->getClientKey($jwt['iss'], $jwt['sub'])) {
+ $response->setError(400, 'invalid_grant', "Invalid issuer (iss) or subject (sub) provided");
+
+ return null;
+ }
+
+ // Verify the JWT
+ if (!$this->jwtUtil->decode($undecodedJWT, $key, $this->allowedAlgorithms)) {
+ $response->setError(400, 'invalid_grant', "JWT failed signature verification");
+
+ return null;
+ }
+
+ $this->jwt = $jwt;
+
+ return true;
+ }
+
+ public function getClientId()
+ {
+ return $this->jwt['iss'];
+ }
+
+ public function getUserId()
+ {
+ return $this->jwt['sub'];
+ }
+
+ public function getScope()
+ {
+ return null;
+ }
+
+ /**
+ * Creates an access token that is NOT associated with a refresh token.
+ * If a subject (sub) the name of the user/account we are accessing data on behalf of.
+ *
+ * @see OAuth2\GrantType\GrantTypeInterface::createAccessToken()
+ */
+ public function createAccessToken(AccessTokenInterface $accessToken, $client_id, $user_id, $scope)
+ {
+ $includeRefreshToken = false;
+
+ return $accessToken->createAccessToken($client_id, $user_id, $scope, $includeRefreshToken);
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/GrantType/RefreshToken.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/GrantType/RefreshToken.php
new file mode 100644
index 000000000..e55385222
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/GrantType/RefreshToken.php
@@ -0,0 +1,111 @@
+<?php
+
+namespace OAuth2\GrantType;
+
+use OAuth2\Storage\RefreshTokenInterface;
+use OAuth2\ResponseType\AccessTokenInterface;
+use OAuth2\RequestInterface;
+use OAuth2\ResponseInterface;
+
+/**
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+class RefreshToken implements GrantTypeInterface
+{
+ private $refreshToken;
+
+ protected $storage;
+ protected $config;
+
+ /**
+ * @param OAuth2\Storage\RefreshTokenInterface $storage REQUIRED Storage class for retrieving refresh token information
+ * @param array $config OPTIONAL Configuration options for the server
+ * <code>
+ * $config = array(
+ * 'always_issue_new_refresh_token' => true, // whether to issue a new refresh token upon successful token request
+ * 'unset_refresh_token_after_use' => true // whether to unset the refresh token after after using
+ * );
+ * </code>
+ */
+ public function __construct(RefreshTokenInterface $storage, $config = array())
+ {
+ $this->config = array_merge(array(
+ 'always_issue_new_refresh_token' => false,
+ 'unset_refresh_token_after_use' => true
+ ), $config);
+
+ // to preserve B.C. with v1.6
+ // @see https://github.com/bshaffer/oauth2-server-php/pull/580
+ // @todo - remove in v2.0
+ if (isset($config['always_issue_new_refresh_token']) && !isset($config['unset_refresh_token_after_use'])) {
+ $this->config['unset_refresh_token_after_use'] = $config['always_issue_new_refresh_token'];
+ }
+
+ $this->storage = $storage;
+ }
+
+ public function getQuerystringIdentifier()
+ {
+ return 'refresh_token';
+ }
+
+ public function validateRequest(RequestInterface $request, ResponseInterface $response)
+ {
+ if (!$request->request("refresh_token")) {
+ $response->setError(400, 'invalid_request', 'Missing parameter: "refresh_token" is required');
+
+ return null;
+ }
+
+ if (!$refreshToken = $this->storage->getRefreshToken($request->request("refresh_token"))) {
+ $response->setError(400, 'invalid_grant', 'Invalid refresh token');
+
+ return null;
+ }
+
+ if ($refreshToken['expires'] > 0 && $refreshToken["expires"] < time()) {
+ $response->setError(400, 'invalid_grant', 'Refresh token has expired');
+
+ return null;
+ }
+
+ // store the refresh token locally so we can delete it when a new refresh token is generated
+ $this->refreshToken = $refreshToken;
+
+ return true;
+ }
+
+ public function getClientId()
+ {
+ return $this->refreshToken['client_id'];
+ }
+
+ public function getUserId()
+ {
+ return isset($this->refreshToken['user_id']) ? $this->refreshToken['user_id'] : null;
+ }
+
+ public function getScope()
+ {
+ return isset($this->refreshToken['scope']) ? $this->refreshToken['scope'] : null;
+ }
+
+ public function createAccessToken(AccessTokenInterface $accessToken, $client_id, $user_id, $scope)
+ {
+ /*
+ * It is optional to force a new refresh token when a refresh token is used.
+ * However, if a new refresh token is issued, the old one MUST be expired
+ * @see http://tools.ietf.org/html/rfc6749#section-6
+ */
+ $issueNewRefreshToken = $this->config['always_issue_new_refresh_token'];
+ $unsetRefreshToken = $this->config['unset_refresh_token_after_use'];
+ $token = $accessToken->createAccessToken($client_id, $user_id, $scope, $issueNewRefreshToken);
+
+ if ($unsetRefreshToken) {
+ $this->storage->unsetRefreshToken($this->refreshToken['refresh_token']);
+ }
+
+ return $token;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/GrantType/UserCredentials.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/GrantType/UserCredentials.php
new file mode 100644
index 000000000..f165538ba
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/GrantType/UserCredentials.php
@@ -0,0 +1,83 @@
+<?php
+
+namespace OAuth2\GrantType;
+
+use OAuth2\Storage\UserCredentialsInterface;
+use OAuth2\ResponseType\AccessTokenInterface;
+use OAuth2\RequestInterface;
+use OAuth2\ResponseInterface;
+
+/**
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+class UserCredentials implements GrantTypeInterface
+{
+ private $userInfo;
+
+ protected $storage;
+
+ /**
+ * @param OAuth2\Storage\UserCredentialsInterface $storage REQUIRED Storage class for retrieving user credentials information
+ */
+ public function __construct(UserCredentialsInterface $storage)
+ {
+ $this->storage = $storage;
+ }
+
+ public function getQuerystringIdentifier()
+ {
+ return 'password';
+ }
+
+ public function validateRequest(RequestInterface $request, ResponseInterface $response)
+ {
+ if (!$request->request("password") || !$request->request("username")) {
+ $response->setError(400, 'invalid_request', 'Missing parameters: "username" and "password" required');
+
+ return null;
+ }
+
+ if (!$this->storage->checkUserCredentials($request->request("username"), $request->request("password"))) {
+ $response->setError(401, 'invalid_grant', 'Invalid username and password combination');
+
+ return null;
+ }
+
+ $userInfo = $this->storage->getUserDetails($request->request("username"));
+
+ if (empty($userInfo)) {
+ $response->setError(400, 'invalid_grant', 'Unable to retrieve user information');
+
+ return null;
+ }
+
+ if (!isset($userInfo['user_id'])) {
+ throw new \LogicException("you must set the user_id on the array returned by getUserDetails");
+ }
+
+ $this->userInfo = $userInfo;
+
+ return true;
+ }
+
+ public function getClientId()
+ {
+ return null;
+ }
+
+ public function getUserId()
+ {
+ return $this->userInfo['user_id'];
+ }
+
+ public function getScope()
+ {
+ return isset($this->userInfo['scope']) ? $this->userInfo['scope'] : null;
+ }
+
+ public function createAccessToken(AccessTokenInterface $accessToken, $client_id, $user_id, $scope)
+ {
+ return $accessToken->createAccessToken($client_id, $user_id, $scope);
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Controller/AuthorizeController.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Controller/AuthorizeController.php
new file mode 100644
index 000000000..c9b5c6af7
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Controller/AuthorizeController.php
@@ -0,0 +1,106 @@
+<?php
+
+namespace OAuth2\OpenID\Controller;
+
+use OAuth2\Controller\AuthorizeController as BaseAuthorizeController;
+use OAuth2\RequestInterface;
+use OAuth2\ResponseInterface;
+
+/**
+ * @see OAuth2\Controller\AuthorizeControllerInterface
+ */
+class AuthorizeController extends BaseAuthorizeController implements AuthorizeControllerInterface
+{
+ private $nonce;
+
+ protected function setNotAuthorizedResponse(RequestInterface $request, ResponseInterface $response, $redirect_uri, $user_id = null)
+ {
+ $prompt = $request->query('prompt', 'consent');
+ if ($prompt == 'none') {
+ if (is_null($user_id)) {
+ $error = 'login_required';
+ $error_message = 'The user must log in';
+ } else {
+ $error = 'interaction_required';
+ $error_message = 'The user must grant access to your application';
+ }
+ } else {
+ $error = 'consent_required';
+ $error_message = 'The user denied access to your application';
+ }
+
+ $response->setRedirect($this->config['redirect_status_code'], $redirect_uri, $this->getState(), $error, $error_message);
+ }
+
+ protected function buildAuthorizeParameters($request, $response, $user_id)
+ {
+ if (!$params = parent::buildAuthorizeParameters($request, $response, $user_id)) {
+ return;
+ }
+
+ // Generate an id token if needed.
+ if ($this->needsIdToken($this->getScope()) && $this->getResponseType() == self::RESPONSE_TYPE_AUTHORIZATION_CODE) {
+ $params['id_token'] = $this->responseTypes['id_token']->createIdToken($this->getClientId(), $user_id, $this->nonce);
+ }
+
+ // add the nonce to return with the redirect URI
+ $params['nonce'] = $this->nonce;
+
+ return $params;
+ }
+
+ public function validateAuthorizeRequest(RequestInterface $request, ResponseInterface $response)
+ {
+ if (!parent::validateAuthorizeRequest($request, $response)) {
+ return false;
+ }
+
+ $nonce = $request->query('nonce');
+
+ // Validate required nonce for "id_token" and "id_token token"
+ if (!$nonce && in_array($this->getResponseType(), array(self::RESPONSE_TYPE_ID_TOKEN, self::RESPONSE_TYPE_ID_TOKEN_TOKEN))) {
+ $response->setError(400, 'invalid_nonce', 'This application requires you specify a nonce parameter');
+
+ return false;
+ }
+
+ $this->nonce = $nonce;
+
+ return true;
+ }
+
+ protected function getValidResponseTypes()
+ {
+ return array(
+ self::RESPONSE_TYPE_ACCESS_TOKEN,
+ self::RESPONSE_TYPE_AUTHORIZATION_CODE,
+ self::RESPONSE_TYPE_ID_TOKEN,
+ self::RESPONSE_TYPE_ID_TOKEN_TOKEN,
+ self::RESPONSE_TYPE_CODE_ID_TOKEN,
+ );
+ }
+
+ /**
+ * Returns whether the current request needs to generate an id token.
+ *
+ * ID Tokens are a part of the OpenID Connect specification, so this
+ * method checks whether OpenID Connect is enabled in the server settings
+ * and whether the openid scope was requested.
+ *
+ * @param $request_scope
+ * A space-separated string of scopes.
+ *
+ * @return
+ * TRUE if an id token is needed, FALSE otherwise.
+ */
+ public function needsIdToken($request_scope)
+ {
+ // see if the "openid" scope exists in the requested scope
+ return $this->scopeUtil->checkScope('openid', $request_scope);
+ }
+
+ public function getNonce()
+ {
+ return $this->nonce;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Controller/AuthorizeControllerInterface.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Controller/AuthorizeControllerInterface.php
new file mode 100644
index 000000000..1e231d844
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Controller/AuthorizeControllerInterface.php
@@ -0,0 +1,10 @@
+<?php
+
+namespace OAuth2\OpenID\Controller;
+
+interface AuthorizeControllerInterface
+{
+ const RESPONSE_TYPE_ID_TOKEN = 'id_token';
+ const RESPONSE_TYPE_ID_TOKEN_TOKEN = 'id_token token';
+ const RESPONSE_TYPE_CODE_ID_TOKEN = 'code id_token';
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Controller/UserInfoController.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Controller/UserInfoController.php
new file mode 100644
index 000000000..30cb942d0
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Controller/UserInfoController.php
@@ -0,0 +1,58 @@
+<?php
+
+namespace OAuth2\OpenID\Controller;
+
+use OAuth2\Scope;
+use OAuth2\TokenType\TokenTypeInterface;
+use OAuth2\Storage\AccessTokenInterface;
+use OAuth2\OpenID\Storage\UserClaimsInterface;
+use OAuth2\Controller\ResourceController;
+use OAuth2\ScopeInterface;
+use OAuth2\RequestInterface;
+use OAuth2\ResponseInterface;
+
+/**
+ * @see OAuth2\Controller\UserInfoControllerInterface
+ */
+class UserInfoController extends ResourceController implements UserInfoControllerInterface
+{
+ private $token;
+
+ protected $tokenType;
+ protected $tokenStorage;
+ protected $userClaimsStorage;
+ protected $config;
+ protected $scopeUtil;
+
+ public function __construct(TokenTypeInterface $tokenType, AccessTokenInterface $tokenStorage, UserClaimsInterface $userClaimsStorage, $config = array(), ScopeInterface $scopeUtil = null)
+ {
+ $this->tokenType = $tokenType;
+ $this->tokenStorage = $tokenStorage;
+ $this->userClaimsStorage = $userClaimsStorage;
+
+ $this->config = array_merge(array(
+ 'www_realm' => 'Service',
+ ), $config);
+
+ if (is_null($scopeUtil)) {
+ $scopeUtil = new Scope();
+ }
+ $this->scopeUtil = $scopeUtil;
+ }
+
+ public function handleUserInfoRequest(RequestInterface $request, ResponseInterface $response)
+ {
+ if (!$this->verifyResourceRequest($request, $response, 'openid')) {
+ return;
+ }
+
+ $token = $this->getToken();
+ $claims = $this->userClaimsStorage->getUserClaims($token['user_id'], $token['scope']);
+ // The sub Claim MUST always be returned in the UserInfo Response.
+ // http://openid.net/specs/openid-connect-core-1_0.html#UserInfoResponse
+ $claims += array(
+ 'sub' => $token['user_id'],
+ );
+ $response->addParameters($claims);
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Controller/UserInfoControllerInterface.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Controller/UserInfoControllerInterface.php
new file mode 100644
index 000000000..a89049d49
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Controller/UserInfoControllerInterface.php
@@ -0,0 +1,23 @@
+<?php
+
+namespace OAuth2\OpenID\Controller;
+
+use OAuth2\RequestInterface;
+use OAuth2\ResponseInterface;
+
+/**
+ * This controller is called when the user claims for OpenID Connect's
+ * UserInfo endpoint should be returned.
+ *
+ * ex:
+ * > $response = new OAuth2\Response();
+ * > $userInfoController->handleUserInfoRequest(
+ * > OAuth2\Request::createFromGlobals(),
+ * > $response;
+ * > $response->send();
+ *
+ */
+interface UserInfoControllerInterface
+{
+ public function handleUserInfoRequest(RequestInterface $request, ResponseInterface $response);
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/GrantType/AuthorizationCode.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/GrantType/AuthorizationCode.php
new file mode 100644
index 000000000..8ed1edc26
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/GrantType/AuthorizationCode.php
@@ -0,0 +1,33 @@
+<?php
+
+namespace OAuth2\OpenID\GrantType;
+
+use OAuth2\GrantType\AuthorizationCode as BaseAuthorizationCode;
+use OAuth2\ResponseType\AccessTokenInterface;
+
+/**
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+class AuthorizationCode extends BaseAuthorizationCode
+{
+ public function createAccessToken(AccessTokenInterface $accessToken, $client_id, $user_id, $scope)
+ {
+ $includeRefreshToken = true;
+ if (isset($this->authCode['id_token'])) {
+ // OpenID Connect requests include the refresh token only if the
+ // offline_access scope has been requested and granted.
+ $scopes = explode(' ', trim($scope));
+ $includeRefreshToken = in_array('offline_access', $scopes);
+ }
+
+ $token = $accessToken->createAccessToken($client_id, $user_id, $scope, $includeRefreshToken);
+ if (isset($this->authCode['id_token'])) {
+ $token['id_token'] = $this->authCode['id_token'];
+ }
+
+ $this->storage->expireAuthorizationCode($this->authCode['code']);
+
+ return $token;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/AuthorizationCode.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/AuthorizationCode.php
new file mode 100644
index 000000000..8971954c5
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/AuthorizationCode.php
@@ -0,0 +1,60 @@
+<?php
+
+namespace OAuth2\OpenID\ResponseType;
+
+use OAuth2\ResponseType\AuthorizationCode as BaseAuthorizationCode;
+use OAuth2\OpenID\Storage\AuthorizationCodeInterface as AuthorizationCodeStorageInterface;
+
+/**
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+class AuthorizationCode extends BaseAuthorizationCode implements AuthorizationCodeInterface
+{
+ public function __construct(AuthorizationCodeStorageInterface $storage, array $config = array())
+ {
+ parent::__construct($storage, $config);
+ }
+
+ public function getAuthorizeResponse($params, $user_id = null)
+ {
+ // build the URL to redirect to
+ $result = array('query' => array());
+
+ $params += array('scope' => null, 'state' => null, 'id_token' => null);
+
+ $result['query']['code'] = $this->createAuthorizationCode($params['client_id'], $user_id, $params['redirect_uri'], $params['scope'], $params['id_token']);
+
+ if (isset($params['state'])) {
+ $result['query']['state'] = $params['state'];
+ }
+
+ return array($params['redirect_uri'], $result);
+ }
+
+ /**
+ * Handle the creation of the authorization code.
+ *
+ * @param $client_id
+ * Client identifier related to the authorization code
+ * @param $user_id
+ * User ID associated with the authorization code
+ * @param $redirect_uri
+ * An absolute URI to which the authorization server will redirect the
+ * user-agent to when the end-user authorization step is completed.
+ * @param $scope
+ * (optional) Scopes to be stored in space-separated string.
+ * @param $id_token
+ * (optional) The OpenID Connect id_token.
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-4
+ * @ingroup oauth2_section_4
+ */
+ public function createAuthorizationCode($client_id, $user_id, $redirect_uri, $scope = null, $id_token = null)
+ {
+ $code = $this->generateAuthorizationCode();
+ $this->storage->setAuthorizationCode($code, $client_id, $user_id, $redirect_uri, time() + $this->config['auth_code_lifetime'], $scope, $id_token);
+
+ return $code;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/AuthorizationCodeInterface.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/AuthorizationCodeInterface.php
new file mode 100644
index 000000000..ea4779255
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/AuthorizationCodeInterface.php
@@ -0,0 +1,27 @@
+<?php
+
+namespace OAuth2\OpenID\ResponseType;
+
+use OAuth2\ResponseType\AuthorizationCodeInterface as BaseAuthorizationCodeInterface;
+
+/**
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+interface AuthorizationCodeInterface extends BaseAuthorizationCodeInterface
+{
+ /**
+ * Handle the creation of the authorization code.
+ *
+ * @param $client_id Client identifier related to the authorization code
+ * @param $user_id User ID associated with the authorization code
+ * @param $redirect_uri An absolute URI to which the authorization server will redirect the
+ * user-agent to when the end-user authorization step is completed.
+ * @param $scope OPTIONAL Scopes to be stored in space-separated string.
+ * @param $id_token OPTIONAL The OpenID Connect id_token.
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-4
+ * @ingroup oauth2_section_4
+ */
+ public function createAuthorizationCode($client_id, $user_id, $redirect_uri, $scope = null, $id_token = null);
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/CodeIdToken.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/CodeIdToken.php
new file mode 100644
index 000000000..ac7764d6c
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/CodeIdToken.php
@@ -0,0 +1,24 @@
+<?php
+
+namespace OAuth2\OpenID\ResponseType;
+
+class CodeIdToken implements CodeIdTokenInterface
+{
+ protected $authCode;
+ protected $idToken;
+
+ public function __construct(AuthorizationCodeInterface $authCode, IdTokenInterface $idToken)
+ {
+ $this->authCode = $authCode;
+ $this->idToken = $idToken;
+ }
+
+ public function getAuthorizeResponse($params, $user_id = null)
+ {
+ $result = $this->authCode->getAuthorizeResponse($params, $user_id);
+ $resultIdToken = $this->idToken->getAuthorizeResponse($params, $user_id);
+ $result[1]['query']['id_token'] = $resultIdToken[1]['fragment']['id_token'];
+
+ return $result;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/CodeIdTokenInterface.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/CodeIdTokenInterface.php
new file mode 100644
index 000000000..629adcca8
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/CodeIdTokenInterface.php
@@ -0,0 +1,9 @@
+<?php
+
+namespace OAuth2\OpenID\ResponseType;
+
+use OAuth2\ResponseType\ResponseTypeInterface;
+
+interface CodeIdTokenInterface extends ResponseTypeInterface
+{
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/IdToken.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/IdToken.php
new file mode 100644
index 000000000..97777fbf2
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/IdToken.php
@@ -0,0 +1,124 @@
+<?php
+
+namespace OAuth2\OpenID\ResponseType;
+
+use OAuth2\Encryption\EncryptionInterface;
+use OAuth2\Encryption\Jwt;
+use OAuth2\Storage\PublicKeyInterface;
+use OAuth2\OpenID\Storage\UserClaimsInterface;
+
+class IdToken implements IdTokenInterface
+{
+ protected $userClaimsStorage;
+ protected $publicKeyStorage;
+ protected $config;
+ protected $encryptionUtil;
+
+ public function __construct(UserClaimsInterface $userClaimsStorage, PublicKeyInterface $publicKeyStorage, array $config = array(), EncryptionInterface $encryptionUtil = null)
+ {
+ $this->userClaimsStorage = $userClaimsStorage;
+ $this->publicKeyStorage = $publicKeyStorage;
+ if (is_null($encryptionUtil)) {
+ $encryptionUtil = new Jwt();
+ }
+ $this->encryptionUtil = $encryptionUtil;
+
+ if (!isset($config['issuer'])) {
+ throw new \LogicException('config parameter "issuer" must be set');
+ }
+ $this->config = array_merge(array(
+ 'id_lifetime' => 3600,
+ ), $config);
+ }
+
+ public function getAuthorizeResponse($params, $userInfo = null)
+ {
+ // build the URL to redirect to
+ $result = array('query' => array());
+ $params += array('scope' => null, 'state' => null, 'nonce' => null);
+
+ // create the id token.
+ list($user_id, $auth_time) = $this->getUserIdAndAuthTime($userInfo);
+ $userClaims = $this->userClaimsStorage->getUserClaims($user_id, $params['scope']);
+
+ $id_token = $this->createIdToken($params['client_id'], $userInfo, $params['nonce'], $userClaims, null);
+ $result["fragment"] = array('id_token' => $id_token);
+ if (isset($params['state'])) {
+ $result["fragment"]["state"] = $params['state'];
+ }
+
+ return array($params['redirect_uri'], $result);
+ }
+
+ public function createIdToken($client_id, $userInfo, $nonce = null, $userClaims = null, $access_token = null)
+ {
+ // pull auth_time from user info if supplied
+ list($user_id, $auth_time) = $this->getUserIdAndAuthTime($userInfo);
+
+ $token = array(
+ 'iss' => $this->config['issuer'],
+ 'sub' => $user_id,
+ 'aud' => $client_id,
+ 'iat' => time(),
+ 'exp' => time() + $this->config['id_lifetime'],
+ 'auth_time' => $auth_time,
+ );
+
+ if ($nonce) {
+ $token['nonce'] = $nonce;
+ }
+
+ if ($userClaims) {
+ $token += $userClaims;
+ }
+
+ if ($access_token) {
+ $token['at_hash'] = $this->createAtHash($access_token, $client_id);
+ }
+
+ return $this->encodeToken($token, $client_id);
+ }
+
+ protected function createAtHash($access_token, $client_id = null)
+ {
+ // maps HS256 and RS256 to sha256, etc.
+ $algorithm = $this->publicKeyStorage->getEncryptionAlgorithm($client_id);
+ $hash_algorithm = 'sha' . substr($algorithm, 2);
+ $hash = hash($hash_algorithm, $access_token, true);
+ $at_hash = substr($hash, 0, strlen($hash) / 2);
+
+ return $this->encryptionUtil->urlSafeB64Encode($at_hash);
+ }
+
+ protected function encodeToken(array $token, $client_id = null)
+ {
+ $private_key = $this->publicKeyStorage->getPrivateKey($client_id);
+ $algorithm = $this->publicKeyStorage->getEncryptionAlgorithm($client_id);
+
+ return $this->encryptionUtil->encode($token, $private_key, $algorithm);
+ }
+
+ private function getUserIdAndAuthTime($userInfo)
+ {
+ $auth_time = null;
+
+ // support an array for user_id / auth_time
+ if (is_array($userInfo)) {
+ if (!isset($userInfo['user_id'])) {
+ throw new \LogicException('if $user_id argument is an array, user_id index must be set');
+ }
+
+ $auth_time = isset($userInfo['auth_time']) ? $userInfo['auth_time'] : null;
+ $user_id = $userInfo['user_id'];
+ } else {
+ $user_id = $userInfo;
+ }
+
+ if (is_null($auth_time)) {
+ $auth_time = time();
+ }
+
+ // userInfo is a scalar, and so this is the $user_id. Auth Time is null
+ return array($user_id, $auth_time);
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/IdTokenInterface.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/IdTokenInterface.php
new file mode 100644
index 000000000..0bd2f8391
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/IdTokenInterface.php
@@ -0,0 +1,29 @@
+<?php
+
+namespace OAuth2\OpenID\ResponseType;
+
+use OAuth2\ResponseType\ResponseTypeInterface;
+
+interface IdTokenInterface extends ResponseTypeInterface
+{
+ /**
+ * Create the id token.
+ *
+ * If Authorization Code Flow is used, the id_token is generated when the
+ * authorization code is issued, and later returned from the token endpoint
+ * together with the access_token.
+ * If the Implicit Flow is used, the token and id_token are generated and
+ * returned together.
+ *
+ * @param string $client_id The client id.
+ * @param string $user_id The user id.
+ * @param string $nonce OPTIONAL The nonce.
+ * @param string $userClaims OPTIONAL Claims about the user.
+ * @param string $access_token OPTIONAL The access token, if known.
+ *
+ * @return string The ID Token represented as a JSON Web Token (JWT).
+ *
+ * @see http://openid.net/specs/openid-connect-core-1_0.html#IDToken
+ */
+ public function createIdToken($client_id, $userInfo, $nonce = null, $userClaims = null, $access_token = null);
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/IdTokenToken.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/IdTokenToken.php
new file mode 100644
index 000000000..f0c59799b
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/IdTokenToken.php
@@ -0,0 +1,27 @@
+<?php
+
+namespace OAuth2\OpenID\ResponseType;
+
+use OAuth2\ResponseType\AccessTokenInterface;
+
+class IdTokenToken implements IdTokenTokenInterface
+{
+ protected $accessToken;
+ protected $idToken;
+
+ public function __construct(AccessTokenInterface $accessToken, IdTokenInterface $idToken)
+ {
+ $this->accessToken = $accessToken;
+ $this->idToken = $idToken;
+ }
+
+ public function getAuthorizeResponse($params, $user_id = null)
+ {
+ $result = $this->accessToken->getAuthorizeResponse($params, $user_id);
+ $access_token = $result[1]['fragment']['access_token'];
+ $id_token = $this->idToken->createIdToken($params['client_id'], $user_id, $params['nonce'], null, $access_token);
+ $result[1]['fragment']['id_token'] = $id_token;
+
+ return $result;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/IdTokenTokenInterface.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/IdTokenTokenInterface.php
new file mode 100644
index 000000000..ac13e2032
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/IdTokenTokenInterface.php
@@ -0,0 +1,9 @@
+<?php
+
+namespace OAuth2\OpenID\ResponseType;
+
+use OAuth2\ResponseType\ResponseTypeInterface;
+
+interface IdTokenTokenInterface extends ResponseTypeInterface
+{
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Storage/AuthorizationCodeInterface.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Storage/AuthorizationCodeInterface.php
new file mode 100644
index 000000000..51dd867ec
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Storage/AuthorizationCodeInterface.php
@@ -0,0 +1,37 @@
+<?php
+
+namespace OAuth2\OpenID\Storage;
+
+use OAuth2\Storage\AuthorizationCodeInterface as BaseAuthorizationCodeInterface;
+/**
+ * Implement this interface to specify where the OAuth2 Server
+ * should get/save authorization codes for the "Authorization Code"
+ * grant type
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+interface AuthorizationCodeInterface extends BaseAuthorizationCodeInterface
+{
+ /**
+ * Take the provided authorization code values and store them somewhere.
+ *
+ * This function should be the storage counterpart to getAuthCode().
+ *
+ * If storage fails for some reason, we're not currently checking for
+ * any sort of success/failure, so you should bail out of the script
+ * and provide a descriptive fail message.
+ *
+ * Required for OAuth2::GRANT_TYPE_AUTH_CODE.
+ *
+ * @param $code authorization code to be stored.
+ * @param $client_id client identifier to be stored.
+ * @param $user_id user identifier to be stored.
+ * @param string $redirect_uri redirect URI(s) to be stored in a space-separated string.
+ * @param int $expires expiration to be stored as a Unix timestamp.
+ * @param string $scope OPTIONAL scopes to be stored in space-separated string.
+ * @param string $id_token OPTIONAL the OpenID Connect id_token.
+ *
+ * @ingroup oauth2_section_4
+ */
+ public function setAuthorizationCode($code, $client_id, $user_id, $redirect_uri, $expires, $scope = null, $id_token = null);
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Storage/UserClaimsInterface.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Storage/UserClaimsInterface.php
new file mode 100644
index 000000000..f230bef9e
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Storage/UserClaimsInterface.php
@@ -0,0 +1,38 @@
+<?php
+
+namespace OAuth2\OpenID\Storage;
+
+/**
+ * Implement this interface to specify where the OAuth2 Server
+ * should retrieve user claims for the OpenID Connect id_token.
+ */
+interface UserClaimsInterface
+{
+ // valid scope values to pass into the user claims API call
+ const VALID_CLAIMS = 'profile email address phone';
+
+ // fields returned for the claims above
+ const PROFILE_CLAIM_VALUES = 'name family_name given_name middle_name nickname preferred_username profile picture website gender birthdate zoneinfo locale updated_at';
+ const EMAIL_CLAIM_VALUES = 'email email_verified';
+ const ADDRESS_CLAIM_VALUES = 'formatted street_address locality region postal_code country';
+ const PHONE_CLAIM_VALUES = 'phone_number phone_number_verified';
+
+ /**
+ * Return claims about the provided user id.
+ *
+ * Groups of claims are returned based on the requested scopes. No group
+ * is required, and no claim is required.
+ *
+ * @param $user_id
+ * The id of the user for which claims should be returned.
+ * @param $scope
+ * The requested scope.
+ * Scopes with matching claims: profile, email, address, phone.
+ *
+ * @return
+ * An array in the claim => value format.
+ *
+ * @see http://openid.net/specs/openid-connect-core-1_0.html#ScopeClaims
+ */
+ public function getUserClaims($user_id, $scope);
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Request.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Request.php
new file mode 100644
index 000000000..c92cee821
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Request.php
@@ -0,0 +1,213 @@
+<?php
+
+namespace OAuth2;
+
+/**
+ * OAuth2\Request
+ * This class is taken from the Symfony2 Framework and is part of the Symfony package.
+ * See Symfony\Component\HttpFoundation\Request (https://github.com/symfony/symfony)
+ */
+class Request implements RequestInterface
+{
+ public $attributes;
+ public $request;
+ public $query;
+ public $server;
+ public $files;
+ public $cookies;
+ public $headers;
+ public $content;
+
+ /**
+ * Constructor.
+ *
+ * @param array $query The GET parameters
+ * @param array $request The POST parameters
+ * @param array $attributes The request attributes (parameters parsed from the PATH_INFO, ...)
+ * @param array $cookies The COOKIE parameters
+ * @param array $files The FILES parameters
+ * @param array $server The SERVER parameters
+ * @param string $content The raw body data
+ *
+ * @api
+ */
+ public function __construct(array $query = array(), array $request = array(), array $attributes = array(), array $cookies = array(), array $files = array(), array $server = array(), $content = null, array $headers = null)
+ {
+ $this->initialize($query, $request, $attributes, $cookies, $files, $server, $content, $headers);
+ }
+
+ /**
+ * Sets the parameters for this request.
+ *
+ * This method also re-initializes all properties.
+ *
+ * @param array $query The GET parameters
+ * @param array $request The POST parameters
+ * @param array $attributes The request attributes (parameters parsed from the PATH_INFO, ...)
+ * @param array $cookies The COOKIE parameters
+ * @param array $files The FILES parameters
+ * @param array $server The SERVER parameters
+ * @param string $content The raw body data
+ *
+ * @api
+ */
+ public function initialize(array $query = array(), array $request = array(), array $attributes = array(), array $cookies = array(), array $files = array(), array $server = array(), $content = null, array $headers = null)
+ {
+ $this->request = $request;
+ $this->query = $query;
+ $this->attributes = $attributes;
+ $this->cookies = $cookies;
+ $this->files = $files;
+ $this->server = $server;
+ $this->content = $content;
+ $this->headers = is_null($headers) ? $this->getHeadersFromServer($this->server) : $headers;
+ }
+
+ public function query($name, $default = null)
+ {
+ return isset($this->query[$name]) ? $this->query[$name] : $default;
+ }
+
+ public function request($name, $default = null)
+ {
+ return isset($this->request[$name]) ? $this->request[$name] : $default;
+ }
+
+ public function server($name, $default = null)
+ {
+ return isset($this->server[$name]) ? $this->server[$name] : $default;
+ }
+
+ public function headers($name, $default = null)
+ {
+ $headers = array_change_key_case($this->headers);
+ $name = strtolower($name);
+
+ return isset($headers[$name]) ? $headers[$name] : $default;
+ }
+
+ public function getAllQueryParameters()
+ {
+ return $this->query;
+ }
+
+ /**
+ * Returns the request body content.
+ *
+ * @param Boolean $asResource If true, a resource will be returned
+ *
+ * @return string|resource The request body content or a resource to read the body stream.
+ */
+ public function getContent($asResource = false)
+ {
+ if (false === $this->content || (true === $asResource && null !== $this->content)) {
+ throw new \LogicException('getContent() can only be called once when using the resource return type.');
+ }
+
+ if (true === $asResource) {
+ $this->content = false;
+
+ return fopen('php://input', 'rb');
+ }
+
+ if (null === $this->content) {
+ $this->content = file_get_contents('php://input');
+ }
+
+ return $this->content;
+ }
+
+ private function getHeadersFromServer($server)
+ {
+ $headers = array();
+ foreach ($server as $key => $value) {
+ if (0 === strpos($key, 'HTTP_')) {
+ $headers[substr($key, 5)] = $value;
+ }
+ // CONTENT_* are not prefixed with HTTP_
+ elseif (in_array($key, array('CONTENT_LENGTH', 'CONTENT_MD5', 'CONTENT_TYPE'))) {
+ $headers[$key] = $value;
+ }
+ }
+
+ if (isset($server['PHP_AUTH_USER'])) {
+ $headers['PHP_AUTH_USER'] = $server['PHP_AUTH_USER'];
+ $headers['PHP_AUTH_PW'] = isset($server['PHP_AUTH_PW']) ? $server['PHP_AUTH_PW'] : '';
+ } else {
+ /*
+ * php-cgi under Apache does not pass HTTP Basic user/pass to PHP by default
+ * For this workaround to work, add this line to your .htaccess file:
+ * RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
+ *
+ * A sample .htaccess file:
+ * RewriteEngine On
+ * RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
+ * RewriteCond %{REQUEST_FILENAME} !-f
+ * RewriteRule ^(.*)$ app.php [QSA,L]
+ */
+
+ $authorizationHeader = null;
+ if (isset($server['HTTP_AUTHORIZATION'])) {
+ $authorizationHeader = $server['HTTP_AUTHORIZATION'];
+ } elseif (isset($server['REDIRECT_HTTP_AUTHORIZATION'])) {
+ $authorizationHeader = $server['REDIRECT_HTTP_AUTHORIZATION'];
+ } elseif (function_exists('apache_request_headers')) {
+ $requestHeaders = (array) apache_request_headers();
+
+ // Server-side fix for bug in old Android versions (a nice side-effect of this fix means we don't care about capitalization for Authorization)
+ $requestHeaders = array_combine(array_map('ucwords', array_keys($requestHeaders)), array_values($requestHeaders));
+
+ if (isset($requestHeaders['Authorization'])) {
+ $authorizationHeader = trim($requestHeaders['Authorization']);
+ }
+ }
+
+ if (null !== $authorizationHeader) {
+ $headers['AUTHORIZATION'] = $authorizationHeader;
+ // Decode AUTHORIZATION header into PHP_AUTH_USER and PHP_AUTH_PW when authorization header is basic
+ if (0 === stripos($authorizationHeader, 'basic')) {
+ $exploded = explode(':', base64_decode(substr($authorizationHeader, 6)));
+ if (count($exploded) == 2) {
+ list($headers['PHP_AUTH_USER'], $headers['PHP_AUTH_PW']) = $exploded;
+ }
+ }
+ }
+ }
+
+ // PHP_AUTH_USER/PHP_AUTH_PW
+ if (isset($headers['PHP_AUTH_USER'])) {
+ $headers['AUTHORIZATION'] = 'Basic '.base64_encode($headers['PHP_AUTH_USER'].':'.$headers['PHP_AUTH_PW']);
+ }
+
+ return $headers;
+ }
+
+ /**
+ * Creates a new request with values from PHP's super globals.
+ *
+ * @return Request A new request
+ *
+ * @api
+ */
+ public static function createFromGlobals()
+ {
+ $class = get_called_class();
+ $request = new $class($_GET, $_POST, array(), $_COOKIE, $_FILES, $_SERVER);
+
+ $contentType = $request->server('CONTENT_TYPE', '');
+ $requestMethod = $request->server('REQUEST_METHOD', 'GET');
+ if (0 === strpos($contentType, 'application/x-www-form-urlencoded')
+ && in_array(strtoupper($requestMethod), array('PUT', 'DELETE'))
+ ) {
+ parse_str($request->getContent(), $data);
+ $request->request = $data;
+ } elseif (0 === strpos($contentType, 'application/json')
+ && in_array(strtoupper($requestMethod), array('POST', 'PUT', 'DELETE'))
+ ) {
+ $data = json_decode($request->getContent(), true);
+ $request->request = $data;
+ }
+
+ return $request;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/RequestInterface.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/RequestInterface.php
new file mode 100644
index 000000000..8a70d5fad
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/RequestInterface.php
@@ -0,0 +1,16 @@
+<?php
+
+namespace OAuth2;
+
+interface RequestInterface
+{
+ public function query($name, $default = null);
+
+ public function request($name, $default = null);
+
+ public function server($name, $default = null);
+
+ public function headers($name, $default = null);
+
+ public function getAllQueryParameters();
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Response.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Response.php
new file mode 100644
index 000000000..fc1e62a98
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Response.php
@@ -0,0 +1,369 @@
+<?php
+
+namespace OAuth2;
+
+/**
+ * Class to handle OAuth2 Responses in a graceful way. Use this interface
+ * to output the proper OAuth2 responses.
+ *
+ * @see OAuth2\ResponseInterface
+ *
+ * This class borrows heavily from the Symfony2 Framework and is part of the symfony package
+ * @see Symfony\Component\HttpFoundation\Request (https://github.com/symfony/symfony)
+ */
+class Response implements ResponseInterface
+{
+ public $version;
+ protected $statusCode = 200;
+ protected $statusText;
+ protected $parameters = array();
+ protected $httpHeaders = array();
+
+ public static $statusTexts = array(
+ 100 => 'Continue',
+ 101 => 'Switching Protocols',
+ 200 => 'OK',
+ 201 => 'Created',
+ 202 => 'Accepted',
+ 203 => 'Non-Authoritative Information',
+ 204 => 'No Content',
+ 205 => 'Reset Content',
+ 206 => 'Partial Content',
+ 300 => 'Multiple Choices',
+ 301 => 'Moved Permanently',
+ 302 => 'Found',
+ 303 => 'See Other',
+ 304 => 'Not Modified',
+ 305 => 'Use Proxy',
+ 307 => 'Temporary Redirect',
+ 400 => 'Bad Request',
+ 401 => 'Unauthorized',
+ 402 => 'Payment Required',
+ 403 => 'Forbidden',
+ 404 => 'Not Found',
+ 405 => 'Method Not Allowed',
+ 406 => 'Not Acceptable',
+ 407 => 'Proxy Authentication Required',
+ 408 => 'Request Timeout',
+ 409 => 'Conflict',
+ 410 => 'Gone',
+ 411 => 'Length Required',
+ 412 => 'Precondition Failed',
+ 413 => 'Request Entity Too Large',
+ 414 => 'Request-URI Too Long',
+ 415 => 'Unsupported Media Type',
+ 416 => 'Requested Range Not Satisfiable',
+ 417 => 'Expectation Failed',
+ 418 => 'I\'m a teapot',
+ 500 => 'Internal Server Error',
+ 501 => 'Not Implemented',
+ 502 => 'Bad Gateway',
+ 503 => 'Service Unavailable',
+ 504 => 'Gateway Timeout',
+ 505 => 'HTTP Version Not Supported',
+ );
+
+ public function __construct($parameters = array(), $statusCode = 200, $headers = array())
+ {
+ $this->setParameters($parameters);
+ $this->setStatusCode($statusCode);
+ $this->setHttpHeaders($headers);
+ $this->version = '1.1';
+ }
+
+ /**
+ * Converts the response object to string containing all headers and the response content.
+ *
+ * @return string The response with headers and content
+ */
+ public function __toString()
+ {
+ $headers = array();
+ foreach ($this->httpHeaders as $name => $value) {
+ $headers[$name] = (array) $value;
+ }
+
+ return
+ sprintf('HTTP/%s %s %s', $this->version, $this->statusCode, $this->statusText)."\r\n".
+ $this->getHttpHeadersAsString($headers)."\r\n".
+ $this->getResponseBody();
+ }
+
+ /**
+ * Returns the build header line.
+ *
+ * @param string $name The header name
+ * @param string $value The header value
+ *
+ * @return string The built header line
+ */
+ protected function buildHeader($name, $value)
+ {
+ return sprintf("%s: %s\n", $name, $value);
+ }
+
+ public function getStatusCode()
+ {
+ return $this->statusCode;
+ }
+
+ public function setStatusCode($statusCode, $text = null)
+ {
+ $this->statusCode = (int) $statusCode;
+ if ($this->isInvalid()) {
+ throw new \InvalidArgumentException(sprintf('The HTTP status code "%s" is not valid.', $statusCode));
+ }
+
+ $this->statusText = false === $text ? '' : (null === $text ? self::$statusTexts[$this->statusCode] : $text);
+ }
+
+ public function getStatusText()
+ {
+ return $this->statusText;
+ }
+
+ public function getParameters()
+ {
+ return $this->parameters;
+ }
+
+ public function setParameters(array $parameters)
+ {
+ $this->parameters = $parameters;
+ }
+
+ public function addParameters(array $parameters)
+ {
+ $this->parameters = array_merge($this->parameters, $parameters);
+ }
+
+ public function getParameter($name, $default = null)
+ {
+ return isset($this->parameters[$name]) ? $this->parameters[$name] : $default;
+ }
+
+ public function setParameter($name, $value)
+ {
+ $this->parameters[$name] = $value;
+ }
+
+ public function setHttpHeaders(array $httpHeaders)
+ {
+ $this->httpHeaders = $httpHeaders;
+ }
+
+ public function setHttpHeader($name, $value)
+ {
+ $this->httpHeaders[$name] = $value;
+ }
+
+ public function addHttpHeaders(array $httpHeaders)
+ {
+ $this->httpHeaders = array_merge($this->httpHeaders, $httpHeaders);
+ }
+
+ public function getHttpHeaders()
+ {
+ return $this->httpHeaders;
+ }
+
+ public function getHttpHeader($name, $default = null)
+ {
+ return isset($this->httpHeaders[$name]) ? $this->httpHeaders[$name] : $default;
+ }
+
+ public function getResponseBody($format = 'json')
+ {
+ switch ($format) {
+ case 'json':
+ return $this->parameters ? json_encode($this->parameters) : '';
+ case 'xml':
+ // this only works for single-level arrays
+ $xml = new \SimpleXMLElement('<response/>');
+ foreach ($this->parameters as $key => $param) {
+ $xml->addChild($key, $param);
+ }
+
+ return $xml->asXML();
+ }
+
+ throw new \InvalidArgumentException(sprintf('The format %s is not supported', $format));
+
+ }
+
+ public function send($format = 'json')
+ {
+ // headers have already been sent by the developer
+ if (headers_sent()) {
+ return;
+ }
+
+ switch ($format) {
+ case 'json':
+ $this->setHttpHeader('Content-Type', 'application/json');
+ break;
+ case 'xml':
+ $this->setHttpHeader('Content-Type', 'text/xml');
+ break;
+ }
+ // status
+ header(sprintf('HTTP/%s %s %s', $this->version, $this->statusCode, $this->statusText));
+
+ foreach ($this->getHttpHeaders() as $name => $header) {
+ header(sprintf('%s: %s', $name, $header));
+ }
+ echo $this->getResponseBody($format);
+ }
+
+ public function setError($statusCode, $error, $errorDescription = null, $errorUri = null)
+ {
+ $parameters = array(
+ 'error' => $error,
+ 'error_description' => $errorDescription,
+ );
+
+ if (!is_null($errorUri)) {
+ if (strlen($errorUri) > 0 && $errorUri[0] == '#') {
+ // we are referencing an oauth bookmark (for brevity)
+ $errorUri = 'http://tools.ietf.org/html/rfc6749' . $errorUri;
+ }
+ $parameters['error_uri'] = $errorUri;
+ }
+
+ $httpHeaders = array(
+ 'Cache-Control' => 'no-store'
+ );
+
+ $this->setStatusCode($statusCode);
+ $this->addParameters($parameters);
+ $this->addHttpHeaders($httpHeaders);
+
+ if (!$this->isClientError() && !$this->isServerError()) {
+ throw new \InvalidArgumentException(sprintf('The HTTP status code is not an error ("%s" given).', $statusCode));
+ }
+ }
+
+ public function setRedirect($statusCode, $url, $state = null, $error = null, $errorDescription = null, $errorUri = null)
+ {
+ if (empty($url)) {
+ throw new \InvalidArgumentException('Cannot redirect to an empty URL.');
+ }
+
+ $parameters = array();
+
+ if (!is_null($state)) {
+ $parameters['state'] = $state;
+ }
+
+ if (!is_null($error)) {
+ $this->setError(400, $error, $errorDescription, $errorUri);
+ }
+ $this->setStatusCode($statusCode);
+ $this->addParameters($parameters);
+
+ if (count($this->parameters) > 0) {
+ // add parameters to URL redirection
+ $parts = parse_url($url);
+ $sep = isset($parts['query']) && count($parts['query']) > 0 ? '&' : '?';
+ $url .= $sep . http_build_query($this->parameters);
+ }
+
+ $this->addHttpHeaders(array('Location' => $url));
+
+ if (!$this->isRedirection()) {
+ throw new \InvalidArgumentException(sprintf('The HTTP status code is not a redirect ("%s" given).', $statusCode));
+ }
+ }
+
+ // http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
+ /**
+ * @return Boolean
+ *
+ * @api
+ */
+ public function isInvalid()
+ {
+ return $this->statusCode < 100 || $this->statusCode >= 600;
+ }
+
+ /**
+ * @return Boolean
+ *
+ * @api
+ */
+ public function isInformational()
+ {
+ return $this->statusCode >= 100 && $this->statusCode < 200;
+ }
+
+ /**
+ * @return Boolean
+ *
+ * @api
+ */
+ public function isSuccessful()
+ {
+ return $this->statusCode >= 200 && $this->statusCode < 300;
+ }
+
+ /**
+ * @return Boolean
+ *
+ * @api
+ */
+ public function isRedirection()
+ {
+ return $this->statusCode >= 300 && $this->statusCode < 400;
+ }
+
+ /**
+ * @return Boolean
+ *
+ * @api
+ */
+ public function isClientError()
+ {
+ return $this->statusCode >= 400 && $this->statusCode < 500;
+ }
+
+ /**
+ * @return Boolean
+ *
+ * @api
+ */
+ public function isServerError()
+ {
+ return $this->statusCode >= 500 && $this->statusCode < 600;
+ }
+
+ /*
+ * Functions from Symfony2 HttpFoundation - output pretty header
+ */
+ private function getHttpHeadersAsString($headers)
+ {
+ if (count($headers) == 0) {
+ return '';
+ }
+
+ $max = max(array_map('strlen', array_keys($headers))) + 1;
+ $content = '';
+ ksort($headers);
+ foreach ($headers as $name => $values) {
+ foreach ($values as $value) {
+ $content .= sprintf("%-{$max}s %s\r\n", $this->beautifyHeaderName($name).':', $value);
+ }
+ }
+
+ return $content;
+ }
+
+ private function beautifyHeaderName($name)
+ {
+ return preg_replace_callback('/\-(.)/', array($this, 'beautifyCallback'), ucfirst($name));
+ }
+
+ private function beautifyCallback($match)
+ {
+ return '-'.strtoupper($match[1]);
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/ResponseInterface.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/ResponseInterface.php
new file mode 100644
index 000000000..c99b5f7d1
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/ResponseInterface.php
@@ -0,0 +1,24 @@
+<?php
+
+namespace OAuth2;
+
+/**
+ * Interface which represents an object response. Meant to handle and display the proper OAuth2 Responses
+ * for errors and successes
+ *
+ * @see OAuth2\Response
+ */
+interface ResponseInterface
+{
+ public function addParameters(array $parameters);
+
+ public function addHttpHeaders(array $httpHeaders);
+
+ public function setStatusCode($statusCode);
+
+ public function setError($statusCode, $name, $description = null, $uri = null);
+
+ public function setRedirect($statusCode, $url, $state = null, $error = null, $errorDescription = null, $errorUri = null);
+
+ public function getParameter($name);
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/AccessToken.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/AccessToken.php
new file mode 100644
index 000000000..98f51218f
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/AccessToken.php
@@ -0,0 +1,194 @@
+<?php
+
+namespace OAuth2\ResponseType;
+
+use OAuth2\Storage\AccessTokenInterface as AccessTokenStorageInterface;
+use OAuth2\Storage\RefreshTokenInterface;
+
+/**
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+class AccessToken implements AccessTokenInterface
+{
+ protected $tokenStorage;
+ protected $refreshStorage;
+ protected $config;
+
+ /**
+ * @param OAuth2\Storage\AccessTokenInterface $tokenStorage REQUIRED Storage class for saving access token information
+ * @param OAuth2\Storage\RefreshTokenInterface $refreshStorage OPTIONAL Storage class for saving refresh token information
+ * @param array $config OPTIONAL Configuration options for the server
+ * <code>
+ * $config = array(
+ * 'token_type' => 'bearer', // token type identifier
+ * 'access_lifetime' => 3600, // time before access token expires
+ * 'refresh_token_lifetime' => 1209600, // time before refresh token expires
+ * );
+ * </endcode>
+ */
+ public function __construct(AccessTokenStorageInterface $tokenStorage, RefreshTokenInterface $refreshStorage = null, array $config = array())
+ {
+ $this->tokenStorage = $tokenStorage;
+ $this->refreshStorage = $refreshStorage;
+
+ $this->config = array_merge(array(
+ 'token_type' => 'bearer',
+ 'access_lifetime' => 3600,
+ 'refresh_token_lifetime' => 1209600,
+ ), $config);
+ }
+
+ public function getAuthorizeResponse($params, $user_id = null)
+ {
+ // build the URL to redirect to
+ $result = array('query' => array());
+
+ $params += array('scope' => null, 'state' => null);
+
+ /*
+ * a refresh token MUST NOT be included in the fragment
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-4.2.2
+ */
+ $includeRefreshToken = false;
+ $result["fragment"] = $this->createAccessToken($params['client_id'], $user_id, $params['scope'], $includeRefreshToken);
+
+ if (isset($params['state'])) {
+ $result["fragment"]["state"] = $params['state'];
+ }
+
+ return array($params['redirect_uri'], $result);
+ }
+
+ /**
+ * Handle the creation of access token, also issue refresh token if supported / desirable.
+ *
+ * @param $client_id client identifier related to the access token.
+ * @param $user_id user ID associated with the access token
+ * @param $scope OPTIONAL scopes to be stored in space-separated string.
+ * @param bool $includeRefreshToken if true, a new refresh_token will be added to the response
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-5
+ * @ingroup oauth2_section_5
+ */
+ public function createAccessToken($client_id, $user_id, $scope = null, $includeRefreshToken = true)
+ {
+ $token = array(
+ "access_token" => $this->generateAccessToken(),
+ "expires_in" => $this->config['access_lifetime'],
+ "token_type" => $this->config['token_type'],
+ "scope" => $scope
+ );
+
+ $this->tokenStorage->setAccessToken($token["access_token"], $client_id, $user_id, $this->config['access_lifetime'] ? time() + $this->config['access_lifetime'] : null, $scope);
+
+ /*
+ * Issue a refresh token also, if we support them
+ *
+ * Refresh Tokens are considered supported if an instance of OAuth2\Storage\RefreshTokenInterface
+ * is supplied in the constructor
+ */
+ if ($includeRefreshToken && $this->refreshStorage) {
+ $token["refresh_token"] = $this->generateRefreshToken();
+ $expires = 0;
+ if ($this->config['refresh_token_lifetime'] > 0) {
+ $expires = time() + $this->config['refresh_token_lifetime'];
+ }
+ $this->refreshStorage->setRefreshToken($token['refresh_token'], $client_id, $user_id, $expires, $scope);
+ }
+
+ return $token;
+ }
+
+ /**
+ * Generates an unique access token.
+ *
+ * Implementing classes may want to override this function to implement
+ * other access token generation schemes.
+ *
+ * @return
+ * An unique access token.
+ *
+ * @ingroup oauth2_section_4
+ */
+ protected function generateAccessToken()
+ {
+ if (function_exists('openssl_random_pseudo_bytes')) {
+ $randomData = openssl_random_pseudo_bytes(20);
+ if ($randomData !== false && strlen($randomData) === 20) {
+ return bin2hex($randomData);
+ }
+ }
+ if (function_exists('mcrypt_create_iv')) {
+ $randomData = mcrypt_create_iv(20, MCRYPT_DEV_URANDOM);
+ if ($randomData !== false && strlen($randomData) === 20) {
+ return bin2hex($randomData);
+ }
+ }
+ if (@file_exists('/dev/urandom')) { // Get 100 bytes of random data
+ $randomData = file_get_contents('/dev/urandom', false, null, 0, 20);
+ if ($randomData !== false && strlen($randomData) === 20) {
+ return bin2hex($randomData);
+ }
+ }
+ // Last resort which you probably should just get rid of:
+ $randomData = mt_rand() . mt_rand() . mt_rand() . mt_rand() . microtime(true) . uniqid(mt_rand(), true);
+
+ return substr(hash('sha512', $randomData), 0, 40);
+ }
+
+ /**
+ * Generates an unique refresh token
+ *
+ * Implementing classes may want to override this function to implement
+ * other refresh token generation schemes.
+ *
+ * @return
+ * An unique refresh.
+ *
+ * @ingroup oauth2_section_4
+ * @see OAuth2::generateAccessToken()
+ */
+ protected function generateRefreshToken()
+ {
+ return $this->generateAccessToken(); // let's reuse the same scheme for token generation
+ }
+
+ /**
+ * Handle the revoking of refresh tokens, and access tokens if supported / desirable
+ * RFC7009 specifies that "If the server is unable to locate the token using
+ * the given hint, it MUST extend its search across all of its supported token types"
+ *
+ * @param $token
+ * @param null $tokenTypeHint
+ * @return boolean
+ */
+ public function revokeToken($token, $tokenTypeHint = null)
+ {
+ if ($tokenTypeHint == 'refresh_token') {
+ if ($this->refreshStorage && $revoked = $this->refreshStorage->unsetRefreshToken($token)) {
+ return true;
+ }
+ }
+
+ /** @TODO remove in v2 */
+ if (!method_exists($this->tokenStorage, 'unsetAccessToken')) {
+ throw new \RuntimeException(
+ sprintf('Token storage %s must implement unsetAccessToken method', get_class($this->tokenStorage)
+ ));
+ }
+
+ $revoked = $this->tokenStorage->unsetAccessToken($token);
+
+ // if a typehint is supplied and fails, try other storages
+ // @see https://tools.ietf.org/html/rfc7009#section-2.1
+ if (!$revoked && $tokenTypeHint != 'refresh_token') {
+ if ($this->refreshStorage) {
+ $revoked = $this->refreshStorage->unsetRefreshToken($token);
+ }
+ }
+
+ return $revoked;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/AccessTokenInterface.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/AccessTokenInterface.php
new file mode 100644
index 000000000..4bd3928d8
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/AccessTokenInterface.php
@@ -0,0 +1,34 @@
+<?php
+
+namespace OAuth2\ResponseType;
+
+/**
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+interface AccessTokenInterface extends ResponseTypeInterface
+{
+ /**
+ * Handle the creation of access token, also issue refresh token if supported / desirable.
+ *
+ * @param $client_id client identifier related to the access token.
+ * @param $user_id user ID associated with the access token
+ * @param $scope OPTONAL scopes to be stored in space-separated string.
+ * @param bool $includeRefreshToken if true, a new refresh_token will be added to the response
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-5
+ * @ingroup oauth2_section_5
+ */
+ public function createAccessToken($client_id, $user_id, $scope = null, $includeRefreshToken = true);
+
+ /**
+ * Handle the revoking of refresh tokens, and access tokens if supported / desirable
+ *
+ * @param $token
+ * @param $tokenTypeHint
+ * @return mixed
+ *
+ * @todo v2.0 include this method in interface. Omitted to maintain BC in v1.x
+ */
+ //public function revokeToken($token, $tokenTypeHint);
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/AuthorizationCode.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/AuthorizationCode.php
new file mode 100644
index 000000000..52aeb4be5
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/AuthorizationCode.php
@@ -0,0 +1,100 @@
+<?php
+
+namespace OAuth2\ResponseType;
+
+use OAuth2\Storage\AuthorizationCodeInterface as AuthorizationCodeStorageInterface;
+
+/**
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+class AuthorizationCode implements AuthorizationCodeInterface
+{
+ protected $storage;
+ protected $config;
+
+ public function __construct(AuthorizationCodeStorageInterface $storage, array $config = array())
+ {
+ $this->storage = $storage;
+ $this->config = array_merge(array(
+ 'enforce_redirect' => false,
+ 'auth_code_lifetime' => 30,
+ ), $config);
+ }
+
+ public function getAuthorizeResponse($params, $user_id = null)
+ {
+ // build the URL to redirect to
+ $result = array('query' => array());
+
+ $params += array('scope' => null, 'state' => null);
+
+ $result['query']['code'] = $this->createAuthorizationCode($params['client_id'], $user_id, $params['redirect_uri'], $params['scope']);
+
+ if (isset($params['state'])) {
+ $result['query']['state'] = $params['state'];
+ }
+
+ return array($params['redirect_uri'], $result);
+ }
+
+ /**
+ * Handle the creation of the authorization code.
+ *
+ * @param $client_id
+ * Client identifier related to the authorization code
+ * @param $user_id
+ * User ID associated with the authorization code
+ * @param $redirect_uri
+ * An absolute URI to which the authorization server will redirect the
+ * user-agent to when the end-user authorization step is completed.
+ * @param $scope
+ * (optional) Scopes to be stored in space-separated string.
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-4
+ * @ingroup oauth2_section_4
+ */
+ public function createAuthorizationCode($client_id, $user_id, $redirect_uri, $scope = null)
+ {
+ $code = $this->generateAuthorizationCode();
+ $this->storage->setAuthorizationCode($code, $client_id, $user_id, $redirect_uri, time() + $this->config['auth_code_lifetime'], $scope);
+
+ return $code;
+ }
+
+ /**
+ * @return
+ * TRUE if the grant type requires a redirect_uri, FALSE if not
+ */
+ public function enforceRedirect()
+ {
+ return $this->config['enforce_redirect'];
+ }
+
+ /**
+ * Generates an unique auth code.
+ *
+ * Implementing classes may want to override this function to implement
+ * other auth code generation schemes.
+ *
+ * @return
+ * An unique auth code.
+ *
+ * @ingroup oauth2_section_4
+ */
+ protected function generateAuthorizationCode()
+ {
+ $tokenLen = 40;
+ if (function_exists('openssl_random_pseudo_bytes')) {
+ $randomData = openssl_random_pseudo_bytes(100);
+ } elseif (function_exists('mcrypt_create_iv')) {
+ $randomData = mcrypt_create_iv(100, MCRYPT_DEV_URANDOM);
+ } elseif (@file_exists('/dev/urandom')) { // Get 100 bytes of random data
+ $randomData = file_get_contents('/dev/urandom', false, null, 0, 100) . uniqid(mt_rand(), true);
+ } else {
+ $randomData = mt_rand() . mt_rand() . mt_rand() . mt_rand() . microtime(true) . uniqid(mt_rand(), true);
+ }
+
+ return substr(hash('sha512', $randomData), 0, $tokenLen);
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/AuthorizationCodeInterface.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/AuthorizationCodeInterface.php
new file mode 100644
index 000000000..df777e221
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/AuthorizationCodeInterface.php
@@ -0,0 +1,30 @@
+<?php
+
+namespace OAuth2\ResponseType;
+
+/**
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+interface AuthorizationCodeInterface extends ResponseTypeInterface
+{
+ /**
+ * @return
+ * TRUE if the grant type requires a redirect_uri, FALSE if not
+ */
+ public function enforceRedirect();
+
+ /**
+ * Handle the creation of the authorization code.
+ *
+ * @param $client_id client identifier related to the authorization code
+ * @param $user_id user id associated with the authorization code
+ * @param $redirect_uri an absolute URI to which the authorization server will redirect the
+ * user-agent to when the end-user authorization step is completed.
+ * @param $scope OPTIONAL scopes to be stored in space-separated string.
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-4
+ * @ingroup oauth2_section_4
+ */
+ public function createAuthorizationCode($client_id, $user_id, $redirect_uri, $scope = null);
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/JwtAccessToken.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/JwtAccessToken.php
new file mode 100644
index 000000000..3942fe41e
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/JwtAccessToken.php
@@ -0,0 +1,124 @@
+<?php
+
+namespace OAuth2\ResponseType;
+
+use OAuth2\Encryption\EncryptionInterface;
+use OAuth2\Encryption\Jwt;
+use OAuth2\Storage\AccessTokenInterface as AccessTokenStorageInterface;
+use OAuth2\Storage\RefreshTokenInterface;
+use OAuth2\Storage\PublicKeyInterface;
+use OAuth2\Storage\Memory;
+
+/**
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+class JwtAccessToken extends AccessToken
+{
+ protected $publicKeyStorage;
+ protected $encryptionUtil;
+
+ /**
+ * @param $config
+ * - store_encrypted_token_string (bool true)
+ * whether the entire encrypted string is stored,
+ * or just the token ID is stored
+ */
+ public function __construct(PublicKeyInterface $publicKeyStorage = null, AccessTokenStorageInterface $tokenStorage = null, RefreshTokenInterface $refreshStorage = null, array $config = array(), EncryptionInterface $encryptionUtil = null)
+ {
+ $this->publicKeyStorage = $publicKeyStorage;
+ $config = array_merge(array(
+ 'store_encrypted_token_string' => true,
+ 'issuer' => ''
+ ), $config);
+ if (is_null($tokenStorage)) {
+ // a pass-thru, so we can call the parent constructor
+ $tokenStorage = new Memory();
+ }
+ if (is_null($encryptionUtil)) {
+ $encryptionUtil = new Jwt();
+ }
+ $this->encryptionUtil = $encryptionUtil;
+ parent::__construct($tokenStorage, $refreshStorage, $config);
+ }
+
+ /**
+ * Handle the creation of access token, also issue refresh token if supported / desirable.
+ *
+ * @param $client_id
+ * Client identifier related to the access token.
+ * @param $user_id
+ * User ID associated with the access token
+ * @param $scope
+ * (optional) Scopes to be stored in space-separated string.
+ * @param bool $includeRefreshToken
+ * If true, a new refresh_token will be added to the response
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-5
+ * @ingroup oauth2_section_5
+ */
+ public function createAccessToken($client_id, $user_id, $scope = null, $includeRefreshToken = true)
+ {
+ // token to encrypt
+ $expires = time() + $this->config['access_lifetime'];
+ $id = $this->generateAccessToken();
+ $jwtAccessToken = array(
+ 'id' => $id, // for BC (see #591)
+ 'jti' => $id,
+ 'iss' => $this->config['issuer'],
+ 'aud' => $client_id,
+ 'sub' => $user_id,
+ 'exp' => $expires,
+ 'iat' => time(),
+ 'token_type' => $this->config['token_type'],
+ 'scope' => $scope
+ );
+
+ /*
+ * Encode the token data into a single access_token string
+ */
+ $access_token = $this->encodeToken($jwtAccessToken, $client_id);
+
+ /*
+ * Save the token to a secondary storage. This is implemented on the
+ * OAuth2\Storage\JwtAccessToken side, and will not actually store anything,
+ * if no secondary storage has been supplied
+ */
+ $token_to_store = $this->config['store_encrypted_token_string'] ? $access_token : $jwtAccessToken['id'];
+ $this->tokenStorage->setAccessToken($token_to_store, $client_id, $user_id, $this->config['access_lifetime'] ? time() + $this->config['access_lifetime'] : null, $scope);
+
+ // token to return to the client
+ $token = array(
+ 'access_token' => $access_token,
+ 'expires_in' => $this->config['access_lifetime'],
+ 'token_type' => $this->config['token_type'],
+ 'scope' => $scope
+ );
+
+ /*
+ * Issue a refresh token also, if we support them
+ *
+ * Refresh Tokens are considered supported if an instance of OAuth2\Storage\RefreshTokenInterface
+ * is supplied in the constructor
+ */
+ if ($includeRefreshToken && $this->refreshStorage) {
+ $refresh_token = $this->generateRefreshToken();
+ $expires = 0;
+ if ($this->config['refresh_token_lifetime'] > 0) {
+ $expires = time() + $this->config['refresh_token_lifetime'];
+ }
+ $this->refreshStorage->setRefreshToken($refresh_token, $client_id, $user_id, $expires, $scope);
+ $token['refresh_token'] = $refresh_token;
+ }
+
+ return $token;
+ }
+
+ protected function encodeToken(array $token, $client_id = null)
+ {
+ $private_key = $this->publicKeyStorage->getPrivateKey($client_id);
+ $algorithm = $this->publicKeyStorage->getEncryptionAlgorithm($client_id);
+
+ return $this->encryptionUtil->encode($token, $private_key, $algorithm);
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/ResponseTypeInterface.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/ResponseTypeInterface.php
new file mode 100644
index 000000000..f8e26a5b0
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/ResponseTypeInterface.php
@@ -0,0 +1,8 @@
+<?php
+
+namespace OAuth2\ResponseType;
+
+interface ResponseTypeInterface
+{
+ public function getAuthorizeResponse($params, $user_id = null);
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Scope.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Scope.php
new file mode 100644
index 000000000..c44350bfd
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Scope.php
@@ -0,0 +1,103 @@
+<?php
+
+namespace OAuth2;
+
+use OAuth2\Storage\Memory;
+use OAuth2\Storage\ScopeInterface as ScopeStorageInterface;
+
+/**
+* @see OAuth2\ScopeInterface
+*/
+class Scope implements ScopeInterface
+{
+ protected $storage;
+
+ /**
+ * @param mixed @storage
+ * Either an array of supported scopes, or an instance of OAuth2\Storage\ScopeInterface
+ */
+ public function __construct($storage = null)
+ {
+ if (is_null($storage) || is_array($storage)) {
+ $storage = new Memory((array) $storage);
+ }
+
+ if (!$storage instanceof ScopeStorageInterface) {
+ throw new \InvalidArgumentException("Argument 1 to OAuth2\Scope must be null, an array, or instance of OAuth2\Storage\ScopeInterface");
+ }
+
+ $this->storage = $storage;
+ }
+
+ /**
+ * Check if everything in required scope is contained in available scope.
+ *
+ * @param $required_scope
+ * A space-separated string of scopes.
+ *
+ * @return
+ * TRUE if everything in required scope is contained in available scope,
+ * and FALSE if it isn't.
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-7
+ *
+ * @ingroup oauth2_section_7
+ */
+ public function checkScope($required_scope, $available_scope)
+ {
+ $required_scope = explode(' ', trim($required_scope));
+ $available_scope = explode(' ', trim($available_scope));
+
+ return (count(array_diff($required_scope, $available_scope)) == 0);
+ }
+
+ /**
+ * Check if the provided scope exists in storage.
+ *
+ * @param $scope
+ * A space-separated string of scopes.
+ *
+ * @return
+ * TRUE if it exists, FALSE otherwise.
+ */
+ public function scopeExists($scope)
+ {
+ // Check reserved scopes first.
+ $scope = explode(' ', trim($scope));
+ $reservedScope = $this->getReservedScopes();
+ $nonReservedScopes = array_diff($scope, $reservedScope);
+ if (count($nonReservedScopes) == 0) {
+ return true;
+ } else {
+ // Check the storage for non-reserved scopes.
+ $nonReservedScopes = implode(' ', $nonReservedScopes);
+
+ return $this->storage->scopeExists($nonReservedScopes);
+ }
+ }
+
+ public function getScopeFromRequest(RequestInterface $request)
+ {
+ // "scope" is valid if passed in either POST or QUERY
+ return $request->request('scope', $request->query('scope'));
+ }
+
+ public function getDefaultScope($client_id = null)
+ {
+ return $this->storage->getDefaultScope($client_id);
+ }
+
+ /**
+ * Get reserved scopes needed by the server.
+ *
+ * In case OpenID Connect is used, these scopes must include:
+ * 'openid', offline_access'.
+ *
+ * @return
+ * An array of reserved scopes.
+ */
+ public function getReservedScopes()
+ {
+ return array('openid', 'offline_access');
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/ScopeInterface.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/ScopeInterface.php
new file mode 100644
index 000000000..5b60f9aee
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/ScopeInterface.php
@@ -0,0 +1,40 @@
+<?php
+
+namespace OAuth2;
+
+use OAuth2\Storage\ScopeInterface as ScopeStorageInterface;
+
+/**
+ * Class to handle scope implementation logic
+ *
+ * @see OAuth2\Storage\ScopeInterface
+ */
+interface ScopeInterface extends ScopeStorageInterface
+{
+ /**
+ * Check if everything in required scope is contained in available scope.
+ *
+ * @param $required_scope
+ * A space-separated string of scopes.
+ *
+ * @return
+ * TRUE if everything in required scope is contained in available scope,
+ * and FALSE if it isn't.
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-7
+ *
+ * @ingroup oauth2_section_7
+ */
+ public function checkScope($required_scope, $available_scope);
+
+ /**
+ * Return scope info from request
+ *
+ * @param OAuth2\RequestInterface
+ * Request object to check
+ *
+ * @return
+ * string representation of requested scope
+ */
+ public function getScopeFromRequest(RequestInterface $request);
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Server.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Server.php
new file mode 100644
index 000000000..9cfcb83a5
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Server.php
@@ -0,0 +1,879 @@
+<?php
+
+namespace OAuth2;
+
+use OAuth2\Controller\ResourceControllerInterface;
+use OAuth2\Controller\ResourceController;
+use OAuth2\OpenID\Controller\UserInfoControllerInterface;
+use OAuth2\OpenID\Controller\UserInfoController;
+use OAuth2\OpenID\Controller\AuthorizeController as OpenIDAuthorizeController;
+use OAuth2\OpenID\ResponseType\AuthorizationCode as OpenIDAuthorizationCodeResponseType;
+use OAuth2\OpenID\Storage\AuthorizationCodeInterface as OpenIDAuthorizationCodeInterface;
+use OAuth2\OpenID\GrantType\AuthorizationCode as OpenIDAuthorizationCodeGrantType;
+use OAuth2\Controller\AuthorizeControllerInterface;
+use OAuth2\Controller\AuthorizeController;
+use OAuth2\Controller\TokenControllerInterface;
+use OAuth2\Controller\TokenController;
+use OAuth2\ClientAssertionType\ClientAssertionTypeInterface;
+use OAuth2\ClientAssertionType\HttpBasic;
+use OAuth2\ResponseType\ResponseTypeInterface;
+use OAuth2\ResponseType\AuthorizationCode as AuthorizationCodeResponseType;
+use OAuth2\ResponseType\AccessToken;
+use OAuth2\ResponseType\JwtAccessToken;
+use OAuth2\OpenID\ResponseType\CodeIdToken;
+use OAuth2\OpenID\ResponseType\IdToken;
+use OAuth2\OpenID\ResponseType\IdTokenToken;
+use OAuth2\TokenType\TokenTypeInterface;
+use OAuth2\TokenType\Bearer;
+use OAuth2\GrantType\GrantTypeInterface;
+use OAuth2\GrantType\UserCredentials;
+use OAuth2\GrantType\ClientCredentials;
+use OAuth2\GrantType\RefreshToken;
+use OAuth2\GrantType\AuthorizationCode;
+use OAuth2\Storage\JwtAccessToken as JwtAccessTokenStorage;
+use OAuth2\Storage\JwtAccessTokenInterface;
+
+/**
+* Server class for OAuth2
+* This class serves as a convience class which wraps the other Controller classes
+*
+* @see OAuth2\Controller\ResourceController
+* @see OAuth2\Controller\AuthorizeController
+* @see OAuth2\Controller\TokenController
+*/
+class Server implements ResourceControllerInterface,
+ AuthorizeControllerInterface,
+ TokenControllerInterface,
+ UserInfoControllerInterface
+{
+ // misc properties
+ /**
+ * @var Response
+ */
+ protected $response;
+
+ /**
+ * @var array
+ */
+ protected $config;
+
+ /**
+ * @var array
+ */
+ protected $storages;
+
+ // servers
+ /**
+ * @var AuthorizeControllerInterface
+ */
+ protected $authorizeController;
+
+ /**
+ * @var TokenControllerInterface
+ */
+ protected $tokenController;
+
+ /**
+ * @var ResourceControllerInterface
+ */
+ protected $resourceController;
+
+ /**
+ * @var UserInfoControllerInterface
+ */
+ protected $userInfoController;
+
+ // config classes
+ protected $grantTypes;
+ protected $responseTypes;
+ protected $tokenType;
+
+ /**
+ * @var ScopeInterface
+ */
+ protected $scopeUtil;
+ protected $clientAssertionType;
+
+ protected $storageMap = array(
+ 'access_token' => 'OAuth2\Storage\AccessTokenInterface',
+ 'authorization_code' => 'OAuth2\Storage\AuthorizationCodeInterface',
+ 'client_credentials' => 'OAuth2\Storage\ClientCredentialsInterface',
+ 'client' => 'OAuth2\Storage\ClientInterface',
+ 'refresh_token' => 'OAuth2\Storage\RefreshTokenInterface',
+ 'user_credentials' => 'OAuth2\Storage\UserCredentialsInterface',
+ 'user_claims' => 'OAuth2\OpenID\Storage\UserClaimsInterface',
+ 'public_key' => 'OAuth2\Storage\PublicKeyInterface',
+ 'jwt_bearer' => 'OAuth2\Storage\JWTBearerInterface',
+ 'scope' => 'OAuth2\Storage\ScopeInterface',
+ );
+
+ protected $responseTypeMap = array(
+ 'token' => 'OAuth2\ResponseType\AccessTokenInterface',
+ 'code' => 'OAuth2\ResponseType\AuthorizationCodeInterface',
+ 'id_token' => 'OAuth2\OpenID\ResponseType\IdTokenInterface',
+ 'id_token token' => 'OAuth2\OpenID\ResponseType\IdTokenTokenInterface',
+ 'code id_token' => 'OAuth2\OpenID\ResponseType\CodeIdTokenInterface',
+ );
+
+ /**
+ * @param mixed $storage (array or OAuth2\Storage) - single object or array of objects implementing the
+ * required storage types (ClientCredentialsInterface and AccessTokenInterface as a minimum)
+ * @param array $config specify a different token lifetime, token header name, etc
+ * @param array $grantTypes An array of OAuth2\GrantType\GrantTypeInterface to use for granting access tokens
+ * @param array $responseTypes Response types to use. array keys should be "code" and and "token" for
+ * Access Token and Authorization Code response types
+ * @param \OAuth2\TokenType\TokenTypeInterface $tokenType The token type object to use. Valid token types are "bearer" and "mac"
+ * @param \OAuth2\ScopeInterface $scopeUtil The scope utility class to use to validate scope
+ * @param \OAuth2\ClientAssertionType\ClientAssertionTypeInterface $clientAssertionType The method in which to verify the client identity. Default is HttpBasic
+ *
+ * @ingroup oauth2_section_7
+ */
+ public function __construct($storage = array(), array $config = array(), array $grantTypes = array(), array $responseTypes = array(), TokenTypeInterface $tokenType = null, ScopeInterface $scopeUtil = null, ClientAssertionTypeInterface $clientAssertionType = null)
+ {
+ $storage = is_array($storage) ? $storage : array($storage);
+ $this->storages = array();
+ foreach ($storage as $key => $service) {
+ $this->addStorage($service, $key);
+ }
+
+ // merge all config values. These get passed to our controller objects
+ $this->config = array_merge(array(
+ 'use_jwt_access_tokens' => false,
+ 'store_encrypted_token_string' => true,
+ 'use_openid_connect' => false,
+ 'id_lifetime' => 3600,
+ 'access_lifetime' => 3600,
+ 'www_realm' => 'Service',
+ 'token_param_name' => 'access_token',
+ 'token_bearer_header_name' => 'Bearer',
+ 'enforce_state' => true,
+ 'require_exact_redirect_uri' => true,
+ 'allow_implicit' => false,
+ 'allow_credentials_in_request_body' => true,
+ 'allow_public_clients' => true,
+ 'always_issue_new_refresh_token' => false,
+ 'unset_refresh_token_after_use' => true,
+ ), $config);
+
+ foreach ($grantTypes as $key => $grantType) {
+ $this->addGrantType($grantType, $key);
+ }
+
+ foreach ($responseTypes as $key => $responseType) {
+ $this->addResponseType($responseType, $key);
+ }
+
+ $this->tokenType = $tokenType;
+ $this->scopeUtil = $scopeUtil;
+ $this->clientAssertionType = $clientAssertionType;
+
+ if ($this->config['use_openid_connect']) {
+ $this->validateOpenIdConnect();
+ }
+ }
+
+ public function getAuthorizeController()
+ {
+ if (is_null($this->authorizeController)) {
+ $this->authorizeController = $this->createDefaultAuthorizeController();
+ }
+
+ return $this->authorizeController;
+ }
+
+ public function getTokenController()
+ {
+ if (is_null($this->tokenController)) {
+ $this->tokenController = $this->createDefaultTokenController();
+ }
+
+ return $this->tokenController;
+ }
+
+ public function getResourceController()
+ {
+ if (is_null($this->resourceController)) {
+ $this->resourceController = $this->createDefaultResourceController();
+ }
+
+ return $this->resourceController;
+ }
+
+ public function getUserInfoController()
+ {
+ if (is_null($this->userInfoController)) {
+ $this->userInfoController = $this->createDefaultUserInfoController();
+ }
+
+ return $this->userInfoController;
+ }
+
+ /**
+ * every getter deserves a setter
+ *
+ * @param AuthorizeControllerInterface $authorizeController
+ */
+ public function setAuthorizeController(AuthorizeControllerInterface $authorizeController)
+ {
+ $this->authorizeController = $authorizeController;
+ }
+
+ /**
+ * every getter deserves a setter
+ *
+ * @param TokenControllerInterface $tokenController
+ */
+ public function setTokenController(TokenControllerInterface $tokenController)
+ {
+ $this->tokenController = $tokenController;
+ }
+
+ /**
+ * every getter deserves a setter
+ *
+ * @param ResourceControllerInterface $resourceController
+ */
+ public function setResourceController(ResourceControllerInterface $resourceController)
+ {
+ $this->resourceController = $resourceController;
+ }
+
+ /**
+ * every getter deserves a setter
+ *
+ * @param UserInfoControllerInterface $userInfoController
+ */
+ public function setUserInfoController(UserInfoControllerInterface $userInfoController)
+ {
+ $this->userInfoController = $userInfoController;
+ }
+
+ /**
+ * Return claims about the authenticated end-user.
+ * This would be called from the "/UserInfo" endpoint as defined in the spec.
+ *
+ * @param $request - \OAuth2\RequestInterface
+ * Request object to grant access token
+ *
+ * @param $response - \OAuth2\ResponseInterface
+ * Response object containing error messages (failure) or user claims (success)
+ *
+ * @return ResponseInterface
+ *
+ * @throws \InvalidArgumentException
+ * @throws \LogicException
+ *
+ * @see http://openid.net/specs/openid-connect-core-1_0.html#UserInfo
+ */
+ public function handleUserInfoRequest(RequestInterface $request, ResponseInterface $response = null)
+ {
+ $this->response = is_null($response) ? new Response() : $response;
+ $this->getUserInfoController()->handleUserInfoRequest($request, $this->response);
+
+ return $this->response;
+ }
+
+ /**
+ * Grant or deny a requested access token.
+ * This would be called from the "/token" endpoint as defined in the spec.
+ * Obviously, you can call your endpoint whatever you want.
+ *
+ * @param $request - \OAuth2\RequestInterface
+ * Request object to grant access token
+ *
+ * @param $response - \OAuth2\ResponseInterface
+ * Response object containing error messages (failure) or access token (success)
+ *
+ * @return ResponseInterface
+ *
+ * @throws \InvalidArgumentException
+ * @throws \LogicException
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-4
+ * @see http://tools.ietf.org/html/rfc6749#section-10.6
+ * @see http://tools.ietf.org/html/rfc6749#section-4.1.3
+ *
+ * @ingroup oauth2_section_4
+ */
+ public function handleTokenRequest(RequestInterface $request, ResponseInterface $response = null)
+ {
+ $this->response = is_null($response) ? new Response() : $response;
+ $this->getTokenController()->handleTokenRequest($request, $this->response);
+
+ return $this->response;
+ }
+
+ public function grantAccessToken(RequestInterface $request, ResponseInterface $response = null)
+ {
+ $this->response = is_null($response) ? new Response() : $response;
+ $value = $this->getTokenController()->grantAccessToken($request, $this->response);
+
+ return $value;
+ }
+
+ /**
+ * Handle a revoke token request
+ * This would be called from the "/revoke" endpoint as defined in the draft Token Revocation spec
+ *
+ * @see https://tools.ietf.org/html/rfc7009#section-2
+ *
+ * @param RequestInterface $request
+ * @param ResponseInterface $response
+ * @return Response|ResponseInterface
+ */
+ public function handleRevokeRequest(RequestInterface $request, ResponseInterface $response = null)
+ {
+ $this->response = is_null($response) ? new Response() : $response;
+ $this->getTokenController()->handleRevokeRequest($request, $this->response);
+
+ return $this->response;
+ }
+
+ /**
+ * Redirect the user appropriately after approval.
+ *
+ * After the user has approved or denied the resource request the
+ * authorization server should call this function to redirect the user
+ * appropriately.
+ *
+ * @param $request
+ * The request should have the follow parameters set in the querystring:
+ * - response_type: The requested response: an access token, an
+ * authorization code, or both.
+ * - client_id: The client identifier as described in Section 2.
+ * - redirect_uri: An absolute URI to which the authorization server
+ * will redirect the user-agent to when the end-user authorization
+ * step is completed.
+ * - scope: (optional) The scope of the resource request expressed as a
+ * list of space-delimited strings.
+ * - state: (optional) An opaque value used by the client to maintain
+ * state between the request and callback.
+ * @param ResponseInterface $response
+ * @param $is_authorized
+ * TRUE or FALSE depending on whether the user authorized the access.
+ * @param $user_id
+ * Identifier of user who authorized the client
+ *
+ * @return Response
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-4
+ *
+ * @ingroup oauth2_section_4
+ */
+ public function handleAuthorizeRequest(RequestInterface $request, ResponseInterface $response, $is_authorized, $user_id = null)
+ {
+ $this->response = $response;
+ $this->getAuthorizeController()->handleAuthorizeRequest($request, $this->response, $is_authorized, $user_id);
+
+ return $this->response;
+ }
+
+ /**
+ * Pull the authorization request data out of the HTTP request.
+ * - The redirect_uri is OPTIONAL as per draft 20. But your implementation can enforce it
+ * by setting $config['enforce_redirect'] to true.
+ * - The state is OPTIONAL but recommended to enforce CSRF. Draft 21 states, however, that
+ * CSRF protection is MANDATORY. You can enforce this by setting the $config['enforce_state'] to true.
+ *
+ * The draft specifies that the parameters should be retrieved from GET, override the Response
+ * object to change this
+ *
+ * @return
+ * The authorization parameters so the authorization server can prompt
+ * the user for approval if valid.
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-4.1.1
+ * @see http://tools.ietf.org/html/rfc6749#section-10.12
+ *
+ * @ingroup oauth2_section_3
+ */
+ public function validateAuthorizeRequest(RequestInterface $request, ResponseInterface $response = null)
+ {
+ $this->response = is_null($response) ? new Response() : $response;
+ $value = $this->getAuthorizeController()->validateAuthorizeRequest($request, $this->response);
+
+ return $value;
+ }
+
+ public function verifyResourceRequest(RequestInterface $request, ResponseInterface $response = null, $scope = null)
+ {
+ $this->response = is_null($response) ? new Response() : $response;
+ $value = $this->getResourceController()->verifyResourceRequest($request, $this->response, $scope);
+
+ return $value;
+ }
+
+ public function getAccessTokenData(RequestInterface $request, ResponseInterface $response = null)
+ {
+ $this->response = is_null($response) ? new Response() : $response;
+ $value = $this->getResourceController()->getAccessTokenData($request, $this->response);
+
+ return $value;
+ }
+
+ public function addGrantType(GrantTypeInterface $grantType, $identifier = null)
+ {
+ if (!is_string($identifier)) {
+ $identifier = $grantType->getQuerystringIdentifier();
+ }
+
+ $this->grantTypes[$identifier] = $grantType;
+
+ // persist added grant type down to TokenController
+ if (!is_null($this->tokenController)) {
+ $this->getTokenController()->addGrantType($grantType, $identifier);
+ }
+ }
+
+ /**
+ * Set a storage object for the server
+ *
+ * @param $storage
+ * An object implementing one of the Storage interfaces
+ * @param $key
+ * If null, the storage is set to the key of each storage interface it implements
+ *
+ * @see storageMap
+ */
+ public function addStorage($storage, $key = null)
+ {
+ // if explicitly set to a valid key, do not "magically" set below
+ if (isset($this->storageMap[$key])) {
+ if (!is_null($storage) && !$storage instanceof $this->storageMap[$key]) {
+ throw new \InvalidArgumentException(sprintf('storage of type "%s" must implement interface "%s"', $key, $this->storageMap[$key]));
+ }
+ $this->storages[$key] = $storage;
+
+ // special logic to handle "client" and "client_credentials" strangeness
+ if ($key === 'client' && !isset($this->storages['client_credentials'])) {
+ if ($storage instanceof \OAuth2\Storage\ClientCredentialsInterface) {
+ $this->storages['client_credentials'] = $storage;
+ }
+ } elseif ($key === 'client_credentials' && !isset($this->storages['client'])) {
+ if ($storage instanceof \OAuth2\Storage\ClientInterface) {
+ $this->storages['client'] = $storage;
+ }
+ }
+ } elseif (!is_null($key) && !is_numeric($key)) {
+ throw new \InvalidArgumentException(sprintf('unknown storage key "%s", must be one of [%s]', $key, implode(', ', array_keys($this->storageMap))));
+ } else {
+ $set = false;
+ foreach ($this->storageMap as $type => $interface) {
+ if ($storage instanceof $interface) {
+ $this->storages[$type] = $storage;
+ $set = true;
+ }
+ }
+
+ if (!$set) {
+ throw new \InvalidArgumentException(sprintf('storage of class "%s" must implement one of [%s]', get_class($storage), implode(', ', $this->storageMap)));
+ }
+ }
+ }
+
+ public function addResponseType(ResponseTypeInterface $responseType, $key = null)
+ {
+ $key = $this->normalizeResponseType($key);
+
+ if (isset($this->responseTypeMap[$key])) {
+ if (!$responseType instanceof $this->responseTypeMap[$key]) {
+ throw new \InvalidArgumentException(sprintf('responseType of type "%s" must implement interface "%s"', $key, $this->responseTypeMap[$key]));
+ }
+ $this->responseTypes[$key] = $responseType;
+ } elseif (!is_null($key) && !is_numeric($key)) {
+ throw new \InvalidArgumentException(sprintf('unknown responseType key "%s", must be one of [%s]', $key, implode(', ', array_keys($this->responseTypeMap))));
+ } else {
+ $set = false;
+ foreach ($this->responseTypeMap as $type => $interface) {
+ if ($responseType instanceof $interface) {
+ $this->responseTypes[$type] = $responseType;
+ $set = true;
+ }
+ }
+
+ if (!$set) {
+ throw new \InvalidArgumentException(sprintf('Unknown response type %s. Please implement one of [%s]', get_class($responseType), implode(', ', $this->responseTypeMap)));
+ }
+ }
+ }
+
+ public function getScopeUtil()
+ {
+ if (!$this->scopeUtil) {
+ $storage = isset($this->storages['scope']) ? $this->storages['scope'] : null;
+ $this->scopeUtil = new Scope($storage);
+ }
+
+ return $this->scopeUtil;
+ }
+
+ /**
+ * every getter deserves a setter
+ *
+ * @param ScopeInterface $scopeUtil
+ */
+ public function setScopeUtil($scopeUtil)
+ {
+ $this->scopeUtil = $scopeUtil;
+ }
+
+ protected function createDefaultAuthorizeController()
+ {
+ if (!isset($this->storages['client'])) {
+ throw new \LogicException('You must supply a storage object implementing \OAuth2\Storage\ClientInterface to use the authorize server');
+ }
+ if (0 == count($this->responseTypes)) {
+ $this->responseTypes = $this->getDefaultResponseTypes();
+ }
+ if ($this->config['use_openid_connect'] && !isset($this->responseTypes['id_token'])) {
+ $this->responseTypes['id_token'] = $this->createDefaultIdTokenResponseType();
+ if ($this->config['allow_implicit']) {
+ $this->responseTypes['id_token token'] = $this->createDefaultIdTokenTokenResponseType();
+ }
+ }
+
+ $config = array_intersect_key($this->config, array_flip(explode(' ', 'allow_implicit enforce_state require_exact_redirect_uri')));
+
+ if ($this->config['use_openid_connect']) {
+ return new OpenIDAuthorizeController($this->storages['client'], $this->responseTypes, $config, $this->getScopeUtil());
+ }
+
+ return new AuthorizeController($this->storages['client'], $this->responseTypes, $config, $this->getScopeUtil());
+ }
+
+ protected function createDefaultTokenController()
+ {
+ if (0 == count($this->grantTypes)) {
+ $this->grantTypes = $this->getDefaultGrantTypes();
+ }
+
+ if (is_null($this->clientAssertionType)) {
+ // see if HttpBasic assertion type is requred. If so, then create it from storage classes.
+ foreach ($this->grantTypes as $grantType) {
+ if (!$grantType instanceof ClientAssertionTypeInterface) {
+ if (!isset($this->storages['client_credentials'])) {
+ throw new \LogicException('You must supply a storage object implementing OAuth2\Storage\ClientCredentialsInterface to use the token server');
+ }
+ $config = array_intersect_key($this->config, array_flip(explode(' ', 'allow_credentials_in_request_body allow_public_clients')));
+ $this->clientAssertionType = new HttpBasic($this->storages['client_credentials'], $config);
+ break;
+ }
+ }
+ }
+
+ if (!isset($this->storages['client'])) {
+ throw new \LogicException('You must supply a storage object implementing OAuth2\Storage\ClientInterface to use the token server');
+ }
+
+ $accessTokenResponseType = $this->getAccessTokenResponseType();
+
+ return new TokenController($accessTokenResponseType, $this->storages['client'], $this->grantTypes, $this->clientAssertionType, $this->getScopeUtil());
+ }
+
+ protected function createDefaultResourceController()
+ {
+ if ($this->config['use_jwt_access_tokens']) {
+ // overwrites access token storage with crypto token storage if "use_jwt_access_tokens" is set
+ if (!isset($this->storages['access_token']) || !$this->storages['access_token'] instanceof JwtAccessTokenInterface) {
+ $this->storages['access_token'] = $this->createDefaultJwtAccessTokenStorage();
+ }
+ } elseif (!isset($this->storages['access_token'])) {
+ throw new \LogicException('You must supply a storage object implementing OAuth2\Storage\AccessTokenInterface or use JwtAccessTokens to use the resource server');
+ }
+
+ if (!$this->tokenType) {
+ $this->tokenType = $this->getDefaultTokenType();
+ }
+
+ $config = array_intersect_key($this->config, array('www_realm' => ''));
+
+ return new ResourceController($this->tokenType, $this->storages['access_token'], $config, $this->getScopeUtil());
+ }
+
+ protected function createDefaultUserInfoController()
+ {
+ if ($this->config['use_jwt_access_tokens']) {
+ // overwrites access token storage with crypto token storage if "use_jwt_access_tokens" is set
+ if (!isset($this->storages['access_token']) || !$this->storages['access_token'] instanceof JwtAccessTokenInterface) {
+ $this->storages['access_token'] = $this->createDefaultJwtAccessTokenStorage();
+ }
+ } elseif (!isset($this->storages['access_token'])) {
+ throw new \LogicException('You must supply a storage object implementing OAuth2\Storage\AccessTokenInterface or use JwtAccessTokens to use the UserInfo server');
+ }
+
+ if (!isset($this->storages['user_claims'])) {
+ throw new \LogicException('You must supply a storage object implementing OAuth2\OpenID\Storage\UserClaimsInterface to use the UserInfo server');
+ }
+
+ if (!$this->tokenType) {
+ $this->tokenType = $this->getDefaultTokenType();
+ }
+
+ $config = array_intersect_key($this->config, array('www_realm' => ''));
+
+ return new UserInfoController($this->tokenType, $this->storages['access_token'], $this->storages['user_claims'], $config, $this->getScopeUtil());
+ }
+
+ protected function getDefaultTokenType()
+ {
+ $config = array_intersect_key($this->config, array_flip(explode(' ', 'token_param_name token_bearer_header_name')));
+
+ return new Bearer($config);
+ }
+
+ protected function getDefaultResponseTypes()
+ {
+ $responseTypes = array();
+
+ if ($this->config['allow_implicit']) {
+ $responseTypes['token'] = $this->getAccessTokenResponseType();
+ }
+
+ if ($this->config['use_openid_connect']) {
+ $responseTypes['id_token'] = $this->getIdTokenResponseType();
+ if ($this->config['allow_implicit']) {
+ $responseTypes['id_token token'] = $this->getIdTokenTokenResponseType();
+ }
+ }
+
+ if (isset($this->storages['authorization_code'])) {
+ $config = array_intersect_key($this->config, array_flip(explode(' ', 'enforce_redirect auth_code_lifetime')));
+ if ($this->config['use_openid_connect']) {
+ if (!$this->storages['authorization_code'] instanceof OpenIDAuthorizationCodeInterface) {
+ throw new \LogicException('Your authorization_code storage must implement OAuth2\OpenID\Storage\AuthorizationCodeInterface to work when "use_openid_connect" is true');
+ }
+ $responseTypes['code'] = new OpenIDAuthorizationCodeResponseType($this->storages['authorization_code'], $config);
+ $responseTypes['code id_token'] = new CodeIdToken($responseTypes['code'], $responseTypes['id_token']);
+ } else {
+ $responseTypes['code'] = new AuthorizationCodeResponseType($this->storages['authorization_code'], $config);
+ }
+ }
+
+ if (count($responseTypes) == 0) {
+ throw new \LogicException('You must supply an array of response_types in the constructor or implement a OAuth2\Storage\AuthorizationCodeInterface storage object or set "allow_implicit" to true and implement a OAuth2\Storage\AccessTokenInterface storage object');
+ }
+
+ return $responseTypes;
+ }
+
+ protected function getDefaultGrantTypes()
+ {
+ $grantTypes = array();
+
+ if (isset($this->storages['user_credentials'])) {
+ $grantTypes['password'] = new UserCredentials($this->storages['user_credentials']);
+ }
+
+ if (isset($this->storages['client_credentials'])) {
+ $config = array_intersect_key($this->config, array('allow_credentials_in_request_body' => ''));
+ $grantTypes['client_credentials'] = new ClientCredentials($this->storages['client_credentials'], $config);
+ }
+
+ if (isset($this->storages['refresh_token'])) {
+ $config = array_intersect_key($this->config, array_flip(explode(' ', 'always_issue_new_refresh_token unset_refresh_token_after_use')));
+ $grantTypes['refresh_token'] = new RefreshToken($this->storages['refresh_token'], $config);
+ }
+
+ if (isset($this->storages['authorization_code'])) {
+ if ($this->config['use_openid_connect']) {
+ if (!$this->storages['authorization_code'] instanceof OpenIDAuthorizationCodeInterface) {
+ throw new \LogicException('Your authorization_code storage must implement OAuth2\OpenID\Storage\AuthorizationCodeInterface to work when "use_openid_connect" is true');
+ }
+ $grantTypes['authorization_code'] = new OpenIDAuthorizationCodeGrantType($this->storages['authorization_code']);
+ } else {
+ $grantTypes['authorization_code'] = new AuthorizationCode($this->storages['authorization_code']);
+ }
+ }
+
+ if (count($grantTypes) == 0) {
+ throw new \LogicException('Unable to build default grant types - You must supply an array of grant_types in the constructor');
+ }
+
+ return $grantTypes;
+ }
+
+ protected function getAccessTokenResponseType()
+ {
+ if (isset($this->responseTypes['token'])) {
+ return $this->responseTypes['token'];
+ }
+
+ if ($this->config['use_jwt_access_tokens']) {
+ return $this->createDefaultJwtAccessTokenResponseType();
+ }
+
+ return $this->createDefaultAccessTokenResponseType();
+ }
+
+ protected function getIdTokenResponseType()
+ {
+ if (isset($this->responseTypes['id_token'])) {
+ return $this->responseTypes['id_token'];
+ }
+
+ return $this->createDefaultIdTokenResponseType();
+ }
+
+ protected function getIdTokenTokenResponseType()
+ {
+ if (isset($this->responseTypes['id_token token'])) {
+ return $this->responseTypes['id_token token'];
+ }
+
+ return $this->createDefaultIdTokenTokenResponseType();
+ }
+
+ /**
+ * For Resource Controller
+ */
+ protected function createDefaultJwtAccessTokenStorage()
+ {
+ if (!isset($this->storages['public_key'])) {
+ throw new \LogicException('You must supply a storage object implementing OAuth2\Storage\PublicKeyInterface to use crypto tokens');
+ }
+ $tokenStorage = null;
+ if (!empty($this->config['store_encrypted_token_string']) && isset($this->storages['access_token'])) {
+ $tokenStorage = $this->storages['access_token'];
+ }
+ // wrap the access token storage as required.
+ return new JwtAccessTokenStorage($this->storages['public_key'], $tokenStorage);
+ }
+
+ /**
+ * For Authorize and Token Controllers
+ */
+ protected function createDefaultJwtAccessTokenResponseType()
+ {
+ if (!isset($this->storages['public_key'])) {
+ throw new \LogicException('You must supply a storage object implementing OAuth2\Storage\PublicKeyInterface to use crypto tokens');
+ }
+
+ $tokenStorage = null;
+ if (isset($this->storages['access_token'])) {
+ $tokenStorage = $this->storages['access_token'];
+ }
+
+ $refreshStorage = null;
+ if (isset($this->storages['refresh_token'])) {
+ $refreshStorage = $this->storages['refresh_token'];
+ }
+
+ $config = array_intersect_key($this->config, array_flip(explode(' ', 'store_encrypted_token_string issuer access_lifetime refresh_token_lifetime')));
+
+ return new JwtAccessToken($this->storages['public_key'], $tokenStorage, $refreshStorage, $config);
+ }
+
+ protected function createDefaultAccessTokenResponseType()
+ {
+ if (!isset($this->storages['access_token'])) {
+ throw new \LogicException('You must supply a response type implementing OAuth2\ResponseType\AccessTokenInterface, or a storage object implementing OAuth2\Storage\AccessTokenInterface to use the token server');
+ }
+
+ $refreshStorage = null;
+ if (isset($this->storages['refresh_token'])) {
+ $refreshStorage = $this->storages['refresh_token'];
+ }
+
+ $config = array_intersect_key($this->config, array_flip(explode(' ', 'access_lifetime refresh_token_lifetime')));
+ $config['token_type'] = $this->tokenType ? $this->tokenType->getTokenType() : $this->getDefaultTokenType()->getTokenType();
+
+ return new AccessToken($this->storages['access_token'], $refreshStorage, $config);
+ }
+
+ protected function createDefaultIdTokenResponseType()
+ {
+ if (!isset($this->storages['user_claims'])) {
+ throw new \LogicException('You must supply a storage object implementing OAuth2\OpenID\Storage\UserClaimsInterface to use openid connect');
+ }
+ if (!isset($this->storages['public_key'])) {
+ throw new \LogicException('You must supply a storage object implementing OAuth2\Storage\PublicKeyInterface to use openid connect');
+ }
+
+ $config = array_intersect_key($this->config, array_flip(explode(' ', 'issuer id_lifetime')));
+
+ return new IdToken($this->storages['user_claims'], $this->storages['public_key'], $config);
+ }
+
+ protected function createDefaultIdTokenTokenResponseType()
+ {
+ return new IdTokenToken($this->getAccessTokenResponseType(), $this->getIdTokenResponseType());
+ }
+
+ protected function validateOpenIdConnect()
+ {
+ $authCodeGrant = $this->getGrantType('authorization_code');
+ if (!empty($authCodeGrant) && !$authCodeGrant instanceof OpenIDAuthorizationCodeGrantType) {
+ throw new \InvalidArgumentException('You have enabled OpenID Connect, but supplied a grant type that does not support it.');
+ }
+ }
+
+ protected function normalizeResponseType($name)
+ {
+ // for multiple-valued response types - make them alphabetical
+ if (!empty($name) && false !== strpos($name, ' ')) {
+ $types = explode(' ', $name);
+ sort($types);
+ $name = implode(' ', $types);
+ }
+
+ return $name;
+ }
+
+ public function getResponse()
+ {
+ return $this->response;
+ }
+
+ public function getStorages()
+ {
+ return $this->storages;
+ }
+
+ public function getStorage($name)
+ {
+ return isset($this->storages[$name]) ? $this->storages[$name] : null;
+ }
+
+ public function getGrantTypes()
+ {
+ return $this->grantTypes;
+ }
+
+ public function getGrantType($name)
+ {
+ return isset($this->grantTypes[$name]) ? $this->grantTypes[$name] : null;
+ }
+
+ public function getResponseTypes()
+ {
+ return $this->responseTypes;
+ }
+
+ public function getResponseType($name)
+ {
+ // for multiple-valued response types - make them alphabetical
+ $name = $this->normalizeResponseType($name);
+
+ return isset($this->responseTypes[$name]) ? $this->responseTypes[$name] : null;
+ }
+
+ public function getTokenType()
+ {
+ return $this->tokenType;
+ }
+
+ public function getClientAssertionType()
+ {
+ return $this->clientAssertionType;
+ }
+
+ public function setConfig($name, $value)
+ {
+ $this->config[$name] = $value;
+ }
+
+ public function getConfig($name, $default = null)
+ {
+ return isset($this->config[$name]) ? $this->config[$name] : $default;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/AccessTokenInterface.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/AccessTokenInterface.php
new file mode 100644
index 000000000..1819158af
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/AccessTokenInterface.php
@@ -0,0 +1,64 @@
+<?php
+
+namespace OAuth2\Storage;
+
+/**
+ * Implement this interface to specify where the OAuth2 Server
+ * should get/save access tokens
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+interface AccessTokenInterface
+{
+ /**
+ * Look up the supplied oauth_token from storage.
+ *
+ * We need to retrieve access token data as we create and verify tokens.
+ *
+ * @param $oauth_token
+ * oauth_token to be check with.
+ *
+ * @return
+ * An associative array as below, and return NULL if the supplied oauth_token
+ * is invalid:
+ * - expires: Stored expiration in unix timestamp.
+ * - client_id: (optional) Stored client identifier.
+ * - user_id: (optional) Stored user identifier.
+ * - scope: (optional) Stored scope values in space-separated string.
+ * - id_token: (optional) Stored id_token (if "use_openid_connect" is true).
+ *
+ * @ingroup oauth2_section_7
+ */
+ public function getAccessToken($oauth_token);
+
+ /**
+ * Store the supplied access token values to storage.
+ *
+ * We need to store access token data as we create and verify tokens.
+ *
+ * @param $oauth_token oauth_token to be stored.
+ * @param $client_id client identifier to be stored.
+ * @param $user_id user identifier to be stored.
+ * @param int $expires expiration to be stored as a Unix timestamp.
+ * @param string $scope OPTIONAL Scopes to be stored in space-separated string.
+ *
+ * @ingroup oauth2_section_4
+ */
+ public function setAccessToken($oauth_token, $client_id, $user_id, $expires, $scope = null);
+
+ /**
+ * Expire an access token.
+ *
+ * This is not explicitly required in the spec, but if defined in a draft RFC for token
+ * revoking (RFC 7009) https://tools.ietf.org/html/rfc7009
+ *
+ * @param $access_token
+ * Access token to be expired.
+ *
+ * @return BOOL true if an access token was unset, false if not
+ * @ingroup oauth2_section_6
+ *
+ * @todo v2.0 include this method in interface. Omitted to maintain BC in v1.x
+ */
+ //public function unsetAccessToken($access_token);
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/AuthorizationCodeInterface.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/AuthorizationCodeInterface.php
new file mode 100644
index 000000000..edc7c70e5
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/AuthorizationCodeInterface.php
@@ -0,0 +1,86 @@
+<?php
+
+namespace OAuth2\Storage;
+
+/**
+ * Implement this interface to specify where the OAuth2 Server
+ * should get/save authorization codes for the "Authorization Code"
+ * grant type
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+interface AuthorizationCodeInterface
+{
+ /**
+ * The Authorization Code grant type supports a response type of "code".
+ *
+ * @var string
+ * @see http://tools.ietf.org/html/rfc6749#section-1.4.1
+ * @see http://tools.ietf.org/html/rfc6749#section-4.2
+ */
+ const RESPONSE_TYPE_CODE = "code";
+
+ /**
+ * Fetch authorization code data (probably the most common grant type).
+ *
+ * Retrieve the stored data for the given authorization code.
+ *
+ * Required for OAuth2::GRANT_TYPE_AUTH_CODE.
+ *
+ * @param $code
+ * Authorization code to be check with.
+ *
+ * @return
+ * An associative array as below, and NULL if the code is invalid
+ * @code
+ * return array(
+ * "client_id" => CLIENT_ID, // REQUIRED Stored client identifier
+ * "user_id" => USER_ID, // REQUIRED Stored user identifier
+ * "expires" => EXPIRES, // REQUIRED Stored expiration in unix timestamp
+ * "redirect_uri" => REDIRECT_URI, // REQUIRED Stored redirect URI
+ * "scope" => SCOPE, // OPTIONAL Stored scope values in space-separated string
+ * );
+ * @endcode
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-4.1
+ *
+ * @ingroup oauth2_section_4
+ */
+ public function getAuthorizationCode($code);
+
+ /**
+ * Take the provided authorization code values and store them somewhere.
+ *
+ * This function should be the storage counterpart to getAuthCode().
+ *
+ * If storage fails for some reason, we're not currently checking for
+ * any sort of success/failure, so you should bail out of the script
+ * and provide a descriptive fail message.
+ *
+ * Required for OAuth2::GRANT_TYPE_AUTH_CODE.
+ *
+ * @param string $code Authorization code to be stored.
+ * @param mixed $client_id Client identifier to be stored.
+ * @param mixed $user_id User identifier to be stored.
+ * @param string $redirect_uri Redirect URI(s) to be stored in a space-separated string.
+ * @param int $expires Expiration to be stored as a Unix timestamp.
+ * @param string $scope OPTIONAL Scopes to be stored in space-separated string.
+ *
+ * @ingroup oauth2_section_4
+ */
+ public function setAuthorizationCode($code, $client_id, $user_id, $redirect_uri, $expires, $scope = null);
+
+ /**
+ * once an Authorization Code is used, it must be expired
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-4.1.2
+ *
+ * The client MUST NOT use the authorization code
+ * more than once. If an authorization code is used more than
+ * once, the authorization server MUST deny the request and SHOULD
+ * revoke (when possible) all tokens previously issued based on
+ * that authorization code
+ *
+ */
+ public function expireAuthorizationCode($code);
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/Cassandra.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/Cassandra.php
new file mode 100644
index 000000000..c5048c08d
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/Cassandra.php
@@ -0,0 +1,480 @@
+<?php
+
+namespace OAuth2\Storage;
+
+use phpcassa\ColumnFamily;
+use phpcassa\ColumnSlice;
+use phpcassa\Connection\ConnectionPool;
+use OAuth2\OpenID\Storage\UserClaimsInterface;
+use OAuth2\OpenID\Storage\AuthorizationCodeInterface as OpenIDAuthorizationCodeInterface;
+
+/**
+ * Cassandra storage for all storage types
+ *
+ * To use, install "thobbs/phpcassa" via composer
+ * <code>
+ * composer require thobbs/phpcassa:dev-master
+ * </code>
+ *
+ * Once this is done, instantiate the
+ * <code>
+ * $cassandra = new \phpcassa\Connection\ConnectionPool('oauth2_server', array('127.0.0.1:9160'));
+ * </code>
+ *
+ * Then, register the storage client:
+ * <code>
+ * $storage = new OAuth2\Storage\Cassandra($cassandra);
+ * $storage->setClientDetails($client_id, $client_secret, $redirect_uri);
+ * </code>
+ *
+ * @see test/lib/OAuth2/Storage/Bootstrap::getCassandraStorage
+ */
+class Cassandra implements AuthorizationCodeInterface,
+ AccessTokenInterface,
+ ClientCredentialsInterface,
+ UserCredentialsInterface,
+ RefreshTokenInterface,
+ JwtBearerInterface,
+ ScopeInterface,
+ PublicKeyInterface,
+ UserClaimsInterface,
+ OpenIDAuthorizationCodeInterface
+{
+
+ private $cache;
+
+ /* The cassandra client */
+ protected $cassandra;
+
+ /* Configuration array */
+ protected $config;
+
+ /**
+ * Cassandra Storage! uses phpCassa
+ *
+ * @param \phpcassa\ConnectionPool $cassandra
+ * @param array $config
+ */
+ public function __construct($connection = array(), array $config = array())
+ {
+ if ($connection instanceof ConnectionPool) {
+ $this->cassandra = $connection;
+ } else {
+ if (!is_array($connection)) {
+ throw new \InvalidArgumentException('First argument to OAuth2\Storage\Cassandra must be an instance of phpcassa\Connection\ConnectionPool or a configuration array');
+ }
+ $connection = array_merge(array(
+ 'keyspace' => 'oauth2',
+ 'servers' => null,
+ ), $connection);
+
+ $this->cassandra = new ConnectionPool($connection['keyspace'], $connection['servers']);
+ }
+
+ $this->config = array_merge(array(
+ // cassandra config
+ 'column_family' => 'auth',
+
+ // key names
+ 'client_key' => 'oauth_clients:',
+ 'access_token_key' => 'oauth_access_tokens:',
+ 'refresh_token_key' => 'oauth_refresh_tokens:',
+ 'code_key' => 'oauth_authorization_codes:',
+ 'user_key' => 'oauth_users:',
+ 'jwt_key' => 'oauth_jwt:',
+ 'scope_key' => 'oauth_scopes:',
+ 'public_key_key' => 'oauth_public_keys:',
+ ), $config);
+ }
+
+ protected function getValue($key)
+ {
+ if (isset($this->cache[$key])) {
+ return $this->cache[$key];
+ }
+ $cf = new ColumnFamily($this->cassandra, $this->config['column_family']);
+
+ try {
+ $value = $cf->get($key, new ColumnSlice("", ""));
+ $value = array_shift($value);
+ } catch (\cassandra\NotFoundException $e) {
+ return false;
+ }
+
+ return json_decode($value, true);
+ }
+
+ protected function setValue($key, $value, $expire = 0)
+ {
+ $this->cache[$key] = $value;
+
+ $cf = new ColumnFamily($this->cassandra, $this->config['column_family']);
+
+ $str = json_encode($value);
+ if ($expire > 0) {
+ try {
+ $seconds = $expire - time();
+ // __data key set as C* requires a field, note: max TTL can only be 630720000 seconds
+ $cf->insert($key, array('__data' => $str), null, $seconds);
+ } catch (\Exception $e) {
+ return false;
+ }
+ } else {
+ try {
+ // __data key set as C* requires a field
+ $cf->insert($key, array('__data' => $str));
+ } catch (\Exception $e) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ protected function expireValue($key)
+ {
+ unset($this->cache[$key]);
+
+ $cf = new ColumnFamily($this->cassandra, $this->config['column_family']);
+
+ if ($cf->get_count($key) > 0) {
+ try {
+ // __data key set as C* requires a field
+ $cf->remove($key, array('__data'));
+ } catch (\Exception $e) {
+ return false;
+ }
+
+ return true;
+ }
+
+ return false;
+ }
+
+ /* AuthorizationCodeInterface */
+ public function getAuthorizationCode($code)
+ {
+ return $this->getValue($this->config['code_key'] . $code);
+ }
+
+ public function setAuthorizationCode($authorization_code, $client_id, $user_id, $redirect_uri, $expires, $scope = null, $id_token = null)
+ {
+ return $this->setValue(
+ $this->config['code_key'] . $authorization_code,
+ compact('authorization_code', 'client_id', 'user_id', 'redirect_uri', 'expires', 'scope', 'id_token'),
+ $expires
+ );
+ }
+
+ public function expireAuthorizationCode($code)
+ {
+ $key = $this->config['code_key'] . $code;
+ unset($this->cache[$key]);
+
+ return $this->expireValue($key);
+ }
+
+ /* UserCredentialsInterface */
+ public function checkUserCredentials($username, $password)
+ {
+ if ($user = $this->getUser($username)) {
+ return $this->checkPassword($user, $password);
+ }
+
+ return false;
+ }
+
+ // plaintext passwords are bad! Override this for your application
+ protected function checkPassword($user, $password)
+ {
+ return $user['password'] == $this->hashPassword($password);
+ }
+
+ // use a secure hashing algorithm when storing passwords. Override this for your application
+ protected function hashPassword($password)
+ {
+ return sha1($password);
+ }
+
+ public function getUserDetails($username)
+ {
+ return $this->getUser($username);
+ }
+
+ public function getUser($username)
+ {
+ if (!$userInfo = $this->getValue($this->config['user_key'] . $username)) {
+ return false;
+ }
+
+ // the default behavior is to use "username" as the user_id
+ return array_merge(array(
+ 'user_id' => $username,
+ ), $userInfo);
+ }
+
+ public function setUser($username, $password, $first_name = null, $last_name = null)
+ {
+ $password = $this->hashPassword($password);
+
+ return $this->setValue(
+ $this->config['user_key'] . $username,
+ compact('username', 'password', 'first_name', 'last_name')
+ );
+ }
+
+ /* ClientCredentialsInterface */
+ public function checkClientCredentials($client_id, $client_secret = null)
+ {
+ if (!$client = $this->getClientDetails($client_id)) {
+ return false;
+ }
+
+ return isset($client['client_secret'])
+ && $client['client_secret'] == $client_secret;
+ }
+
+ public function isPublicClient($client_id)
+ {
+ if (!$client = $this->getClientDetails($client_id)) {
+ return false;
+ }
+
+ return empty($client['client_secret']);
+ }
+
+ /* ClientInterface */
+ public function getClientDetails($client_id)
+ {
+ return $this->getValue($this->config['client_key'] . $client_id);
+ }
+
+ public function setClientDetails($client_id, $client_secret = null, $redirect_uri = null, $grant_types = null, $scope = null, $user_id = null)
+ {
+ return $this->setValue(
+ $this->config['client_key'] . $client_id,
+ compact('client_id', 'client_secret', 'redirect_uri', 'grant_types', 'scope', 'user_id')
+ );
+ }
+
+ public function checkRestrictedGrantType($client_id, $grant_type)
+ {
+ $details = $this->getClientDetails($client_id);
+ if (isset($details['grant_types'])) {
+ $grant_types = explode(' ', $details['grant_types']);
+
+ return in_array($grant_type, (array) $grant_types);
+ }
+
+ // if grant_types are not defined, then none are restricted
+ return true;
+ }
+
+ /* RefreshTokenInterface */
+ public function getRefreshToken($refresh_token)
+ {
+ return $this->getValue($this->config['refresh_token_key'] . $refresh_token);
+ }
+
+ public function setRefreshToken($refresh_token, $client_id, $user_id, $expires, $scope = null)
+ {
+ return $this->setValue(
+ $this->config['refresh_token_key'] . $refresh_token,
+ compact('refresh_token', 'client_id', 'user_id', 'expires', 'scope'),
+ $expires
+ );
+ }
+
+ public function unsetRefreshToken($refresh_token)
+ {
+ return $this->expireValue($this->config['refresh_token_key'] . $refresh_token);
+ }
+
+ /* AccessTokenInterface */
+ public function getAccessToken($access_token)
+ {
+ return $this->getValue($this->config['access_token_key'].$access_token);
+ }
+
+ public function setAccessToken($access_token, $client_id, $user_id, $expires, $scope = null)
+ {
+ return $this->setValue(
+ $this->config['access_token_key'].$access_token,
+ compact('access_token', 'client_id', 'user_id', 'expires', 'scope'),
+ $expires
+ );
+ }
+
+ public function unsetAccessToken($access_token)
+ {
+ return $this->expireValue($this->config['access_token_key'] . $access_token);
+ }
+
+ /* ScopeInterface */
+ public function scopeExists($scope)
+ {
+ $scope = explode(' ', $scope);
+
+ $result = $this->getValue($this->config['scope_key'].'supported:global');
+
+ $supportedScope = explode(' ', (string) $result);
+
+ return (count(array_diff($scope, $supportedScope)) == 0);
+ }
+
+ public function getDefaultScope($client_id = null)
+ {
+ if (is_null($client_id) || !$result = $this->getValue($this->config['scope_key'].'default:'.$client_id)) {
+ $result = $this->getValue($this->config['scope_key'].'default:global');
+ }
+
+ return $result;
+ }
+
+ public function setScope($scope, $client_id = null, $type = 'supported')
+ {
+ if (!in_array($type, array('default', 'supported'))) {
+ throw new \InvalidArgumentException('"$type" must be one of "default", "supported"');
+ }
+
+ if (is_null($client_id)) {
+ $key = $this->config['scope_key'].$type.':global';
+ } else {
+ $key = $this->config['scope_key'].$type.':'.$client_id;
+ }
+
+ return $this->setValue($key, $scope);
+ }
+
+ /*JWTBearerInterface */
+ public function getClientKey($client_id, $subject)
+ {
+ if (!$jwt = $this->getValue($this->config['jwt_key'] . $client_id)) {
+ return false;
+ }
+
+ if (isset($jwt['subject']) && $jwt['subject'] == $subject ) {
+ return $jwt['key'];
+ }
+
+ return null;
+ }
+
+ public function setClientKey($client_id, $key, $subject = null)
+ {
+ return $this->setValue($this->config['jwt_key'] . $client_id, array(
+ 'key' => $key,
+ 'subject' => $subject
+ ));
+ }
+
+ /*ScopeInterface */
+ public function getClientScope($client_id)
+ {
+ if (!$clientDetails = $this->getClientDetails($client_id)) {
+ return false;
+ }
+
+ if (isset($clientDetails['scope'])) {
+ return $clientDetails['scope'];
+ }
+
+ return null;
+ }
+
+ public function getJti($client_id, $subject, $audience, $expiration, $jti)
+ {
+ //TODO: Needs cassandra implementation.
+ throw new \Exception('getJti() for the Cassandra driver is currently unimplemented.');
+ }
+
+ public function setJti($client_id, $subject, $audience, $expiration, $jti)
+ {
+ //TODO: Needs cassandra implementation.
+ throw new \Exception('setJti() for the Cassandra driver is currently unimplemented.');
+ }
+
+ /* PublicKeyInterface */
+ public function getPublicKey($client_id = '')
+ {
+ $public_key = $this->getValue($this->config['public_key_key'] . $client_id);
+ if (is_array($public_key)) {
+ return $public_key['public_key'];
+ }
+ $public_key = $this->getValue($this->config['public_key_key']);
+ if (is_array($public_key)) {
+ return $public_key['public_key'];
+ }
+ }
+
+ public function getPrivateKey($client_id = '')
+ {
+ $public_key = $this->getValue($this->config['public_key_key'] . $client_id);
+ if (is_array($public_key)) {
+ return $public_key['private_key'];
+ }
+ $public_key = $this->getValue($this->config['public_key_key']);
+ if (is_array($public_key)) {
+ return $public_key['private_key'];
+ }
+ }
+
+ public function getEncryptionAlgorithm($client_id = null)
+ {
+ $public_key = $this->getValue($this->config['public_key_key'] . $client_id);
+ if (is_array($public_key)) {
+ return $public_key['encryption_algorithm'];
+ }
+ $public_key = $this->getValue($this->config['public_key_key']);
+ if (is_array($public_key)) {
+ return $public_key['encryption_algorithm'];
+ }
+
+ return 'RS256';
+ }
+
+ /* UserClaimsInterface */
+ public function getUserClaims($user_id, $claims)
+ {
+ $userDetails = $this->getUserDetails($user_id);
+ if (!is_array($userDetails)) {
+ return false;
+ }
+
+ $claims = explode(' ', trim($claims));
+ $userClaims = array();
+
+ // for each requested claim, if the user has the claim, set it in the response
+ $validClaims = explode(' ', self::VALID_CLAIMS);
+ foreach ($validClaims as $validClaim) {
+ if (in_array($validClaim, $claims)) {
+ if ($validClaim == 'address') {
+ // address is an object with subfields
+ $userClaims['address'] = $this->getUserClaim($validClaim, $userDetails['address'] ?: $userDetails);
+ } else {
+ $userClaims = array_merge($userClaims, $this->getUserClaim($validClaim, $userDetails));
+ }
+ }
+ }
+
+ return $userClaims;
+ }
+
+ protected function getUserClaim($claim, $userDetails)
+ {
+ $userClaims = array();
+ $claimValuesString = constant(sprintf('self::%s_CLAIM_VALUES', strtoupper($claim)));
+ $claimValues = explode(' ', $claimValuesString);
+
+ foreach ($claimValues as $value) {
+ if ($value == 'email_verified') {
+ $userClaims[$value] = $userDetails[$value]=='true' ? true : false;
+ } else {
+ $userClaims[$value] = isset($userDetails[$value]) ? $userDetails[$value] : null;
+ }
+ }
+
+ return $userClaims;
+ }
+
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/ClientCredentialsInterface.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/ClientCredentialsInterface.php
new file mode 100644
index 000000000..3318c6966
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/ClientCredentialsInterface.php
@@ -0,0 +1,49 @@
+<?php
+
+namespace OAuth2\Storage;
+
+/**
+ * Implement this interface to specify how the OAuth2 Server
+ * should verify client credentials
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+interface ClientCredentialsInterface extends ClientInterface
+{
+
+ /**
+ * Make sure that the client credentials is valid.
+ *
+ * @param $client_id
+ * Client identifier to be check with.
+ * @param $client_secret
+ * (optional) If a secret is required, check that they've given the right one.
+ *
+ * @return
+ * TRUE if the client credentials are valid, and MUST return FALSE if it isn't.
+ * @endcode
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-3.1
+ *
+ * @ingroup oauth2_section_3
+ */
+ public function checkClientCredentials($client_id, $client_secret = null);
+
+ /**
+ * Determine if the client is a "public" client, and therefore
+ * does not require passing credentials for certain grant types
+ *
+ * @param $client_id
+ * Client identifier to be check with.
+ *
+ * @return
+ * TRUE if the client is public, and FALSE if it isn't.
+ * @endcode
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-2.3
+ * @see https://github.com/bshaffer/oauth2-server-php/issues/257
+ *
+ * @ingroup oauth2_section_2
+ */
+ public function isPublicClient($client_id);
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/ClientInterface.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/ClientInterface.php
new file mode 100644
index 000000000..09a5bffc1
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/ClientInterface.php
@@ -0,0 +1,66 @@
+<?php
+
+namespace OAuth2\Storage;
+
+/**
+ * Implement this interface to specify where the OAuth2 Server
+ * should retrieve client information
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+interface ClientInterface
+{
+ /**
+ * Get client details corresponding client_id.
+ *
+ * OAuth says we should store request URIs for each registered client.
+ * Implement this function to grab the stored URI for a given client id.
+ *
+ * @param $client_id
+ * Client identifier to be check with.
+ *
+ * @return array
+ * Client details. The only mandatory key in the array is "redirect_uri".
+ * This function MUST return FALSE if the given client does not exist or is
+ * invalid. "redirect_uri" can be space-delimited to allow for multiple valid uris.
+ * <code>
+ * return array(
+ * "redirect_uri" => REDIRECT_URI, // REQUIRED redirect_uri registered for the client
+ * "client_id" => CLIENT_ID, // OPTIONAL the client id
+ * "grant_types" => GRANT_TYPES, // OPTIONAL an array of restricted grant types
+ * "user_id" => USER_ID, // OPTIONAL the user identifier associated with this client
+ * "scope" => SCOPE, // OPTIONAL the scopes allowed for this client
+ * );
+ * </code>
+ *
+ * @ingroup oauth2_section_4
+ */
+ public function getClientDetails($client_id);
+
+ /**
+ * Get the scope associated with this client
+ *
+ * @return
+ * STRING the space-delineated scope list for the specified client_id
+ */
+ public function getClientScope($client_id);
+
+ /**
+ * Check restricted grant types of corresponding client identifier.
+ *
+ * If you want to restrict clients to certain grant types, override this
+ * function.
+ *
+ * @param $client_id
+ * Client identifier to be check with.
+ * @param $grant_type
+ * Grant type to be check with
+ *
+ * @return
+ * TRUE if the grant type is supported by this client identifier, and
+ * FALSE if it isn't.
+ *
+ * @ingroup oauth2_section_4
+ */
+ public function checkRestrictedGrantType($client_id, $grant_type);
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/CouchbaseDB.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/CouchbaseDB.php
new file mode 100755
index 000000000..1eb55f027
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/CouchbaseDB.php
@@ -0,0 +1,331 @@
+<?php
+
+namespace OAuth2\Storage;
+
+use OAuth2\OpenID\Storage\AuthorizationCodeInterface as OpenIDAuthorizationCodeInterface;
+
+/**
+ * Simple Couchbase storage for all storage types
+ *
+ * This class should be extended or overridden as required
+ *
+ * NOTE: Passwords are stored in plaintext, which is never
+ * a good idea. Be sure to override this for your application
+ *
+ * @author Tom Park <tom@raucter.com>
+ */
+class CouchbaseDB implements AuthorizationCodeInterface,
+ AccessTokenInterface,
+ ClientCredentialsInterface,
+ UserCredentialsInterface,
+ RefreshTokenInterface,
+ JwtBearerInterface,
+ OpenIDAuthorizationCodeInterface
+{
+ protected $db;
+ protected $config;
+
+ public function __construct($connection, $config = array())
+ {
+ if ($connection instanceof \Couchbase) {
+ $this->db = $connection;
+ } else {
+ if (!is_array($connection) || !is_array($connection['servers'])) {
+ throw new \InvalidArgumentException('First argument to OAuth2\Storage\CouchbaseDB must be an instance of Couchbase or a configuration array containing a server array');
+ }
+
+ $this->db = new \Couchbase($connection['servers'], (!isset($connection['username'])) ? '' : $connection['username'], (!isset($connection['password'])) ? '' : $connection['password'], $connection['bucket'], false);
+ }
+
+ $this->config = array_merge(array(
+ 'client_table' => 'oauth_clients',
+ 'access_token_table' => 'oauth_access_tokens',
+ 'refresh_token_table' => 'oauth_refresh_tokens',
+ 'code_table' => 'oauth_authorization_codes',
+ 'user_table' => 'oauth_users',
+ 'jwt_table' => 'oauth_jwt',
+ ), $config);
+ }
+
+ // Helper function to access couchbase item by type:
+ protected function getObjectByType($name,$id)
+ {
+ return json_decode($this->db->get($this->config[$name].'-'.$id),true);
+ }
+
+ // Helper function to set couchbase item by type:
+ protected function setObjectByType($name,$id,$array)
+ {
+ $array['type'] = $name;
+
+ return $this->db->set($this->config[$name].'-'.$id,json_encode($array));
+ }
+
+ // Helper function to delete couchbase item by type, wait for persist to at least 1 node
+ protected function deleteObjectByType($name,$id)
+ {
+ $this->db->delete($this->config[$name].'-'.$id,"",1);
+ }
+
+ /* ClientCredentialsInterface */
+ public function checkClientCredentials($client_id, $client_secret = null)
+ {
+ if ($result = $this->getObjectByType('client_table',$client_id)) {
+ return $result['client_secret'] == $client_secret;
+ }
+
+ return false;
+ }
+
+ public function isPublicClient($client_id)
+ {
+ if (!$result = $this->getObjectByType('client_table',$client_id)) {
+ return false;
+ }
+
+ return empty($result['client_secret']);
+ }
+
+ /* ClientInterface */
+ public function getClientDetails($client_id)
+ {
+ $result = $this->getObjectByType('client_table',$client_id);
+
+ return is_null($result) ? false : $result;
+ }
+
+ public function setClientDetails($client_id, $client_secret = null, $redirect_uri = null, $grant_types = null, $scope = null, $user_id = null)
+ {
+ if ($this->getClientDetails($client_id)) {
+
+ $this->setObjectByType('client_table',$client_id, array(
+ 'client_id' => $client_id,
+ 'client_secret' => $client_secret,
+ 'redirect_uri' => $redirect_uri,
+ 'grant_types' => $grant_types,
+ 'scope' => $scope,
+ 'user_id' => $user_id,
+ ));
+ } else {
+ $this->setObjectByType('client_table',$client_id, array(
+ 'client_id' => $client_id,
+ 'client_secret' => $client_secret,
+ 'redirect_uri' => $redirect_uri,
+ 'grant_types' => $grant_types,
+ 'scope' => $scope,
+ 'user_id' => $user_id,
+ ));
+ }
+
+ return true;
+ }
+
+ public function checkRestrictedGrantType($client_id, $grant_type)
+ {
+ $details = $this->getClientDetails($client_id);
+ if (isset($details['grant_types'])) {
+ $grant_types = explode(' ', $details['grant_types']);
+
+ return in_array($grant_type, $grant_types);
+ }
+
+ // if grant_types are not defined, then none are restricted
+ return true;
+ }
+
+ /* AccessTokenInterface */
+ public function getAccessToken($access_token)
+ {
+ $token = $this->getObjectByType('access_token_table',$access_token);
+
+ return is_null($token) ? false : $token;
+ }
+
+ public function setAccessToken($access_token, $client_id, $user_id, $expires, $scope = null)
+ {
+ // if it exists, update it.
+ if ($this->getAccessToken($access_token)) {
+ $this->setObjectByType('access_token_table',$access_token, array(
+ 'access_token' => $access_token,
+ 'client_id' => $client_id,
+ 'expires' => $expires,
+ 'user_id' => $user_id,
+ 'scope' => $scope
+ ));
+ } else {
+ $this->setObjectByType('access_token_table',$access_token, array(
+ 'access_token' => $access_token,
+ 'client_id' => $client_id,
+ 'expires' => $expires,
+ 'user_id' => $user_id,
+ 'scope' => $scope
+ ));
+ }
+
+ return true;
+ }
+
+ /* AuthorizationCodeInterface */
+ public function getAuthorizationCode($code)
+ {
+ $code = $this->getObjectByType('code_table',$code);
+
+ return is_null($code) ? false : $code;
+ }
+
+ public function setAuthorizationCode($code, $client_id, $user_id, $redirect_uri, $expires, $scope = null, $id_token = null)
+ {
+ // if it exists, update it.
+ if ($this->getAuthorizationCode($code)) {
+ $this->setObjectByType('code_table',$code, array(
+ 'authorization_code' => $code,
+ 'client_id' => $client_id,
+ 'user_id' => $user_id,
+ 'redirect_uri' => $redirect_uri,
+ 'expires' => $expires,
+ 'scope' => $scope,
+ 'id_token' => $id_token,
+ ));
+ } else {
+ $this->setObjectByType('code_table',$code,array(
+ 'authorization_code' => $code,
+ 'client_id' => $client_id,
+ 'user_id' => $user_id,
+ 'redirect_uri' => $redirect_uri,
+ 'expires' => $expires,
+ 'scope' => $scope,
+ 'id_token' => $id_token,
+ ));
+ }
+
+ return true;
+ }
+
+ public function expireAuthorizationCode($code)
+ {
+ $this->deleteObjectByType('code_table',$code);
+
+ return true;
+ }
+
+ /* UserCredentialsInterface */
+ public function checkUserCredentials($username, $password)
+ {
+ if ($user = $this->getUser($username)) {
+ return $this->checkPassword($user, $password);
+ }
+
+ return false;
+ }
+
+ public function getUserDetails($username)
+ {
+ if ($user = $this->getUser($username)) {
+ $user['user_id'] = $user['username'];
+ }
+
+ return $user;
+ }
+
+ /* RefreshTokenInterface */
+ public function getRefreshToken($refresh_token)
+ {
+ $token = $this->getObjectByType('refresh_token_table',$refresh_token);
+
+ return is_null($token) ? false : $token;
+ }
+
+ public function setRefreshToken($refresh_token, $client_id, $user_id, $expires, $scope = null)
+ {
+ $this->setObjectByType('refresh_token_table',$refresh_token, array(
+ 'refresh_token' => $refresh_token,
+ 'client_id' => $client_id,
+ 'user_id' => $user_id,
+ 'expires' => $expires,
+ 'scope' => $scope
+ ));
+
+ return true;
+ }
+
+ public function unsetRefreshToken($refresh_token)
+ {
+ $this->deleteObjectByType('refresh_token_table',$refresh_token);
+
+ return true;
+ }
+
+ // plaintext passwords are bad! Override this for your application
+ protected function checkPassword($user, $password)
+ {
+ return $user['password'] == $password;
+ }
+
+ public function getUser($username)
+ {
+ $result = $this->getObjectByType('user_table',$username);
+
+ return is_null($result) ? false : $result;
+ }
+
+ public function setUser($username, $password, $firstName = null, $lastName = null)
+ {
+ if ($this->getUser($username)) {
+ $this->setObjectByType('user_table',$username, array(
+ 'username' => $username,
+ 'password' => $password,
+ 'first_name' => $firstName,
+ 'last_name' => $lastName
+ ));
+
+ } else {
+ $this->setObjectByType('user_table',$username, array(
+ 'username' => $username,
+ 'password' => $password,
+ 'first_name' => $firstName,
+ 'last_name' => $lastName
+ ));
+
+ }
+
+ return true;
+ }
+
+ public function getClientKey($client_id, $subject)
+ {
+ if (!$jwt = $this->getObjectByType('jwt_table',$client_id)) {
+ return false;
+ }
+
+ if (isset($jwt['subject']) && $jwt['subject'] == $subject) {
+ return $jwt['key'];
+ }
+
+ return false;
+ }
+
+ public function getClientScope($client_id)
+ {
+ if (!$clientDetails = $this->getClientDetails($client_id)) {
+ return false;
+ }
+
+ if (isset($clientDetails['scope'])) {
+ return $clientDetails['scope'];
+ }
+
+ return null;
+ }
+
+ public function getJti($client_id, $subject, $audience, $expiration, $jti)
+ {
+ //TODO: Needs couchbase implementation.
+ throw new \Exception('getJti() for the Couchbase driver is currently unimplemented.');
+ }
+
+ public function setJti($client_id, $subject, $audience, $expiration, $jti)
+ {
+ //TODO: Needs couchbase implementation.
+ throw new \Exception('setJti() for the Couchbase driver is currently unimplemented.');
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/DynamoDB.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/DynamoDB.php
new file mode 100644
index 000000000..8347ab258
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/DynamoDB.php
@@ -0,0 +1,540 @@
+<?php
+
+namespace OAuth2\Storage;
+
+use Aws\DynamoDb\DynamoDbClient;
+
+use OAuth2\OpenID\Storage\UserClaimsInterface;
+use OAuth2\OpenID\Storage\AuthorizationCodeInterface as OpenIDAuthorizationCodeInterface;
+/**
+ * DynamoDB storage for all storage types
+ *
+ * To use, install "aws/aws-sdk-php" via composer
+ * <code>
+ * composer require aws/aws-sdk-php:dev-master
+ * </code>
+ *
+ * Once this is done, instantiate the DynamoDB client
+ * <code>
+ * $storage = new OAuth2\Storage\Dynamodb(array("key" => "YOURKEY", "secret" => "YOURSECRET", "region" => "YOURREGION"));
+ * </code>
+ *
+ * Table :
+ * - oauth_access_tokens (primary hash key : access_token)
+ * - oauth_authorization_codes (primary hash key : authorization_code)
+ * - oauth_clients (primary hash key : client_id)
+ * - oauth_jwt (primary hash key : client_id, primary range key : subject)
+ * - oauth_public_keys (primary hash key : client_id)
+ * - oauth_refresh_tokens (primary hash key : refresh_token)
+ * - oauth_scopes (primary hash key : scope, secondary index : is_default-index hash key is_default)
+ * - oauth_users (primary hash key : username)
+ *
+ * @author Frederic AUGUSTE <frederic.auguste at gmail dot com>
+ */
+class DynamoDB implements
+ AuthorizationCodeInterface,
+ AccessTokenInterface,
+ ClientCredentialsInterface,
+ UserCredentialsInterface,
+ RefreshTokenInterface,
+ JwtBearerInterface,
+ ScopeInterface,
+ PublicKeyInterface,
+ UserClaimsInterface,
+ OpenIDAuthorizationCodeInterface
+{
+ protected $client;
+ protected $config;
+
+ public function __construct($connection, $config = array())
+ {
+ if (!($connection instanceof DynamoDbClient)) {
+ if (!is_array($connection)) {
+ throw new \InvalidArgumentException('First argument to OAuth2\Storage\Dynamodb must be an instance a configuration array containt key, secret, region');
+ }
+ if (!array_key_exists("key",$connection) || !array_key_exists("secret",$connection) || !array_key_exists("region",$connection) ) {
+ throw new \InvalidArgumentException('First argument to OAuth2\Storage\Dynamodb must be an instance a configuration array containt key, secret, region');
+ }
+ $this->client = DynamoDbClient::factory(array(
+ 'key' => $connection["key"],
+ 'secret' => $connection["secret"],
+ 'region' =>$connection["region"]
+ ));
+ } else {
+ $this->client = $connection;
+ }
+
+ $this->config = array_merge(array(
+ 'client_table' => 'oauth_clients',
+ 'access_token_table' => 'oauth_access_tokens',
+ 'refresh_token_table' => 'oauth_refresh_tokens',
+ 'code_table' => 'oauth_authorization_codes',
+ 'user_table' => 'oauth_users',
+ 'jwt_table' => 'oauth_jwt',
+ 'scope_table' => 'oauth_scopes',
+ 'public_key_table' => 'oauth_public_keys',
+ ), $config);
+ }
+
+ /* OAuth2\Storage\ClientCredentialsInterface */
+ public function checkClientCredentials($client_id, $client_secret = null)
+ {
+ $result = $this->client->getItem(array(
+ "TableName"=> $this->config['client_table'],
+ "Key" => array('client_id' => array('S' => $client_id))
+ ));
+
+ return $result->count()==1 && $result["Item"]["client_secret"]["S"] == $client_secret;
+ }
+
+ public function isPublicClient($client_id)
+ {
+ $result = $this->client->getItem(array(
+ "TableName"=> $this->config['client_table'],
+ "Key" => array('client_id' => array('S' => $client_id))
+ ));
+
+ if ($result->count()==0) {
+ return false ;
+ }
+
+ return empty($result["Item"]["client_secret"]);
+ }
+
+ /* OAuth2\Storage\ClientInterface */
+ public function getClientDetails($client_id)
+ {
+ $result = $this->client->getItem(array(
+ "TableName"=> $this->config['client_table'],
+ "Key" => array('client_id' => array('S' => $client_id))
+ ));
+ if ($result->count()==0) {
+ return false ;
+ }
+ $result = $this->dynamo2array($result);
+ foreach (array('client_id', 'client_secret', 'redirect_uri', 'grant_types', 'scope', 'user_id') as $key => $val) {
+ if (!array_key_exists ($val, $result)) {
+ $result[$val] = null;
+ }
+ }
+
+ return $result;
+ }
+
+ public function setClientDetails($client_id, $client_secret = null, $redirect_uri = null, $grant_types = null, $scope = null, $user_id = null)
+ {
+ $clientData = compact('client_id', 'client_secret', 'redirect_uri', 'grant_types', 'scope', 'user_id');
+ $clientData = array_filter($clientData, 'self::isNotEmpty');
+
+ $result = $this->client->putItem(array(
+ 'TableName' => $this->config['client_table'],
+ 'Item' => $this->client->formatAttributes($clientData)
+ ));
+
+ return true;
+ }
+
+ public function checkRestrictedGrantType($client_id, $grant_type)
+ {
+ $details = $this->getClientDetails($client_id);
+ if (isset($details['grant_types'])) {
+ $grant_types = explode(' ', $details['grant_types']);
+
+ return in_array($grant_type, (array) $grant_types);
+ }
+
+ // if grant_types are not defined, then none are restricted
+ return true;
+ }
+
+ /* OAuth2\Storage\AccessTokenInterface */
+ public function getAccessToken($access_token)
+ {
+ $result = $this->client->getItem(array(
+ "TableName"=> $this->config['access_token_table'],
+ "Key" => array('access_token' => array('S' => $access_token))
+ ));
+ if ($result->count()==0) {
+ return false ;
+ }
+ $token = $this->dynamo2array($result);
+ if (array_key_exists ('expires', $token)) {
+ $token['expires'] = strtotime($token['expires']);
+ }
+
+ return $token;
+ }
+
+ public function setAccessToken($access_token, $client_id, $user_id, $expires, $scope = null)
+ {
+ // convert expires to datestring
+ $expires = date('Y-m-d H:i:s', $expires);
+
+ $clientData = compact('access_token', 'client_id', 'user_id', 'expires', 'scope');
+ $clientData = array_filter($clientData, 'self::isNotEmpty');
+
+ $result = $this->client->putItem(array(
+ 'TableName' => $this->config['access_token_table'],
+ 'Item' => $this->client->formatAttributes($clientData)
+ ));
+
+ return true;
+
+ }
+
+ public function unsetAccessToken($access_token)
+ {
+ $result = $this->client->deleteItem(array(
+ 'TableName' => $this->config['access_token_table'],
+ 'Key' => $this->client->formatAttributes(array("access_token" => $access_token)),
+ 'ReturnValues' => 'ALL_OLD',
+ ));
+
+ return null !== $result->get('Attributes');
+ }
+
+ /* OAuth2\Storage\AuthorizationCodeInterface */
+ public function getAuthorizationCode($code)
+ {
+ $result = $this->client->getItem(array(
+ "TableName"=> $this->config['code_table'],
+ "Key" => array('authorization_code' => array('S' => $code))
+ ));
+ if ($result->count()==0) {
+ return false ;
+ }
+ $token = $this->dynamo2array($result);
+ if (!array_key_exists("id_token", $token )) {
+ $token['id_token'] = null;
+ }
+ $token['expires'] = strtotime($token['expires']);
+
+ return $token;
+
+ }
+
+ public function setAuthorizationCode($authorization_code, $client_id, $user_id, $redirect_uri, $expires, $scope = null, $id_token = null)
+ {
+ // convert expires to datestring
+ $expires = date('Y-m-d H:i:s', $expires);
+
+ $clientData = compact('authorization_code', 'client_id', 'user_id', 'redirect_uri', 'expires', 'id_token', 'scope');
+ $clientData = array_filter($clientData, 'self::isNotEmpty');
+
+ $result = $this->client->putItem(array(
+ 'TableName' => $this->config['code_table'],
+ 'Item' => $this->client->formatAttributes($clientData)
+ ));
+
+ return true;
+ }
+
+ public function expireAuthorizationCode($code)
+ {
+
+ $result = $this->client->deleteItem(array(
+ 'TableName' => $this->config['code_table'],
+ 'Key' => $this->client->formatAttributes(array("authorization_code" => $code))
+ ));
+
+ return true;
+ }
+
+ /* OAuth2\Storage\UserCredentialsInterface */
+ public function checkUserCredentials($username, $password)
+ {
+ if ($user = $this->getUser($username)) {
+ return $this->checkPassword($user, $password);
+ }
+
+ return false;
+ }
+
+ public function getUserDetails($username)
+ {
+ return $this->getUser($username);
+ }
+
+ /* UserClaimsInterface */
+ public function getUserClaims($user_id, $claims)
+ {
+ if (!$userDetails = $this->getUserDetails($user_id)) {
+ return false;
+ }
+
+ $claims = explode(' ', trim($claims));
+ $userClaims = array();
+
+ // for each requested claim, if the user has the claim, set it in the response
+ $validClaims = explode(' ', self::VALID_CLAIMS);
+ foreach ($validClaims as $validClaim) {
+ if (in_array($validClaim, $claims)) {
+ if ($validClaim == 'address') {
+ // address is an object with subfields
+ $userClaims['address'] = $this->getUserClaim($validClaim, $userDetails['address'] ?: $userDetails);
+ } else {
+ $userClaims = array_merge($userClaims, $this->getUserClaim($validClaim, $userDetails));
+ }
+ }
+ }
+
+ return $userClaims;
+ }
+
+ protected function getUserClaim($claim, $userDetails)
+ {
+ $userClaims = array();
+ $claimValuesString = constant(sprintf('self::%s_CLAIM_VALUES', strtoupper($claim)));
+ $claimValues = explode(' ', $claimValuesString);
+
+ foreach ($claimValues as $value) {
+ if ($value == 'email_verified') {
+ $userClaims[$value] = $userDetails[$value]=='true' ? true : false;
+ } else {
+ $userClaims[$value] = isset($userDetails[$value]) ? $userDetails[$value] : null;
+ }
+ }
+
+ return $userClaims;
+ }
+
+ /* OAuth2\Storage\RefreshTokenInterface */
+ public function getRefreshToken($refresh_token)
+ {
+ $result = $this->client->getItem(array(
+ "TableName"=> $this->config['refresh_token_table'],
+ "Key" => array('refresh_token' => array('S' => $refresh_token))
+ ));
+ if ($result->count()==0) {
+ return false ;
+ }
+ $token = $this->dynamo2array($result);
+ $token['expires'] = strtotime($token['expires']);
+
+ return $token;
+ }
+
+ public function setRefreshToken($refresh_token, $client_id, $user_id, $expires, $scope = null)
+ {
+ // convert expires to datestring
+ $expires = date('Y-m-d H:i:s', $expires);
+
+ $clientData = compact('refresh_token', 'client_id', 'user_id', 'expires', 'scope');
+ $clientData = array_filter($clientData, 'self::isNotEmpty');
+
+ $result = $this->client->putItem(array(
+ 'TableName' => $this->config['refresh_token_table'],
+ 'Item' => $this->client->formatAttributes($clientData)
+ ));
+
+ return true;
+ }
+
+ public function unsetRefreshToken($refresh_token)
+ {
+ $result = $this->client->deleteItem(array(
+ 'TableName' => $this->config['refresh_token_table'],
+ 'Key' => $this->client->formatAttributes(array("refresh_token" => $refresh_token))
+ ));
+
+ return true;
+ }
+
+ // plaintext passwords are bad! Override this for your application
+ protected function checkPassword($user, $password)
+ {
+ return $user['password'] == $this->hashPassword($password);
+ }
+
+ // use a secure hashing algorithm when storing passwords. Override this for your application
+ protected function hashPassword($password)
+ {
+ return sha1($password);
+ }
+
+ public function getUser($username)
+ {
+ $result = $this->client->getItem(array(
+ "TableName"=> $this->config['user_table'],
+ "Key" => array('username' => array('S' => $username))
+ ));
+ if ($result->count()==0) {
+ return false ;
+ }
+ $token = $this->dynamo2array($result);
+ $token['user_id'] = $username;
+
+ return $token;
+ }
+
+ public function setUser($username, $password, $first_name = null, $last_name = null)
+ {
+ // do not store in plaintext
+ $password = $this->hashPassword($password);
+
+ $clientData = compact('username', 'password', 'first_name', 'last_name');
+ $clientData = array_filter($clientData, 'self::isNotEmpty');
+
+ $result = $this->client->putItem(array(
+ 'TableName' => $this->config['user_table'],
+ 'Item' => $this->client->formatAttributes($clientData)
+ ));
+
+ return true;
+
+ }
+
+ /* ScopeInterface */
+ public function scopeExists($scope)
+ {
+ $scope = explode(' ', $scope);
+ $scope_query = array();
+ $count = 0;
+ foreach ($scope as $key => $val) {
+ $result = $this->client->query(array(
+ 'TableName' => $this->config['scope_table'],
+ 'Select' => 'COUNT',
+ 'KeyConditions' => array(
+ 'scope' => array(
+ 'AttributeValueList' => array(array('S' => $val)),
+ 'ComparisonOperator' => 'EQ'
+ )
+ )
+ ));
+ $count += $result['Count'];
+ }
+
+ return $count == count($scope);
+ }
+
+ public function getDefaultScope($client_id = null)
+ {
+
+ $result = $this->client->query(array(
+ 'TableName' => $this->config['scope_table'],
+ 'IndexName' => 'is_default-index',
+ 'Select' => 'ALL_ATTRIBUTES',
+ 'KeyConditions' => array(
+ 'is_default' => array(
+ 'AttributeValueList' => array(array('S' => 'true')),
+ 'ComparisonOperator' => 'EQ',
+ ),
+ )
+ ));
+ $defaultScope = array();
+ if ($result->count() > 0) {
+ $array = $result->toArray();
+ foreach ($array["Items"] as $item) {
+ $defaultScope[] = $item['scope']['S'];
+ }
+
+ return empty($defaultScope) ? null : implode(' ', $defaultScope);
+ }
+
+ return null;
+ }
+
+ /* JWTBearerInterface */
+ public function getClientKey($client_id, $subject)
+ {
+ $result = $this->client->getItem(array(
+ "TableName"=> $this->config['jwt_table'],
+ "Key" => array('client_id' => array('S' => $client_id), 'subject' => array('S' => $subject))
+ ));
+ if ($result->count()==0) {
+ return false ;
+ }
+ $token = $this->dynamo2array($result);
+
+ return $token['public_key'];
+ }
+
+ public function getClientScope($client_id)
+ {
+ if (!$clientDetails = $this->getClientDetails($client_id)) {
+ return false;
+ }
+
+ if (isset($clientDetails['scope'])) {
+ return $clientDetails['scope'];
+ }
+
+ return null;
+ }
+
+ public function getJti($client_id, $subject, $audience, $expires, $jti)
+ {
+ //TODO not use.
+ }
+
+ public function setJti($client_id, $subject, $audience, $expires, $jti)
+ {
+ //TODO not use.
+ }
+
+ /* PublicKeyInterface */
+ public function getPublicKey($client_id = '0')
+ {
+
+ $result = $this->client->getItem(array(
+ "TableName"=> $this->config['public_key_table'],
+ "Key" => array('client_id' => array('S' => $client_id))
+ ));
+ if ($result->count()==0) {
+ return false ;
+ }
+ $token = $this->dynamo2array($result);
+
+ return $token['public_key'];
+
+ }
+
+ public function getPrivateKey($client_id = '0')
+ {
+ $result = $this->client->getItem(array(
+ "TableName"=> $this->config['public_key_table'],
+ "Key" => array('client_id' => array('S' => $client_id))
+ ));
+ if ($result->count()==0) {
+ return false ;
+ }
+ $token = $this->dynamo2array($result);
+
+ return $token['private_key'];
+ }
+
+ public function getEncryptionAlgorithm($client_id = null)
+ {
+ $result = $this->client->getItem(array(
+ "TableName"=> $this->config['public_key_table'],
+ "Key" => array('client_id' => array('S' => $client_id))
+ ));
+ if ($result->count()==0) {
+ return 'RS256' ;
+ }
+ $token = $this->dynamo2array($result);
+
+ return $token['encryption_algorithm'];
+ }
+
+ /**
+ * Transform dynamodb resultset to an array.
+ * @param $dynamodbResult
+ * @return $array
+ */
+ private function dynamo2array($dynamodbResult)
+ {
+ $result = array();
+ foreach ($dynamodbResult["Item"] as $key => $val) {
+ $result[$key] = $val["S"];
+ $result[] = $val["S"];
+ }
+
+ return $result;
+ }
+
+ private static function isNotEmpty($value)
+ {
+ return null !== $value && '' !== $value;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/JwtAccessToken.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/JwtAccessToken.php
new file mode 100644
index 000000000..75b49d301
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/JwtAccessToken.php
@@ -0,0 +1,88 @@
+<?php
+
+namespace OAuth2\Storage;
+
+use OAuth2\Encryption\EncryptionInterface;
+use OAuth2\Encryption\Jwt;
+
+/**
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+class JwtAccessToken implements JwtAccessTokenInterface
+{
+ protected $publicKeyStorage;
+ protected $tokenStorage;
+ protected $encryptionUtil;
+
+ /**
+ * @param OAuth2\Encryption\PublicKeyInterface $publicKeyStorage the public key encryption to use
+ * @param OAuth2\Storage\AccessTokenInterface $tokenStorage OPTIONAL persist the access token to another storage. This is useful if
+ * you want to retain access token grant information somewhere, but
+ * is not necessary when using this grant type.
+ * @param OAuth2\Encryption\EncryptionInterface $encryptionUtil OPTIONAL class to use for "encode" and "decode" functions.
+ */
+ public function __construct(PublicKeyInterface $publicKeyStorage, AccessTokenInterface $tokenStorage = null, EncryptionInterface $encryptionUtil = null)
+ {
+ $this->publicKeyStorage = $publicKeyStorage;
+ $this->tokenStorage = $tokenStorage;
+ if (is_null($encryptionUtil)) {
+ $encryptionUtil = new Jwt;
+ }
+ $this->encryptionUtil = $encryptionUtil;
+ }
+
+ public function getAccessToken($oauth_token)
+ {
+ // just decode the token, don't verify
+ if (!$tokenData = $this->encryptionUtil->decode($oauth_token, null, false)) {
+ return false;
+ }
+
+ $client_id = isset($tokenData['aud']) ? $tokenData['aud'] : null;
+ $public_key = $this->publicKeyStorage->getPublicKey($client_id);
+ $algorithm = $this->publicKeyStorage->getEncryptionAlgorithm($client_id);
+
+ // now that we have the client_id, verify the token
+ if (false === $this->encryptionUtil->decode($oauth_token, $public_key, array($algorithm))) {
+ return false;
+ }
+
+ // normalize the JWT claims to the format expected by other components in this library
+ return $this->convertJwtToOAuth2($tokenData);
+ }
+
+ public function setAccessToken($oauth_token, $client_id, $user_id, $expires, $scope = null)
+ {
+ if ($this->tokenStorage) {
+ return $this->tokenStorage->setAccessToken($oauth_token, $client_id, $user_id, $expires, $scope);
+ }
+ }
+
+ public function unsetAccessToken($access_token)
+ {
+ if ($this->tokenStorage) {
+ return $this->tokenStorage->unsetAccessToken($access_token);
+ }
+ }
+
+
+ // converts a JWT access token into an OAuth2-friendly format
+ protected function convertJwtToOAuth2($tokenData)
+ {
+ $keyMapping = array(
+ 'aud' => 'client_id',
+ 'exp' => 'expires',
+ 'sub' => 'user_id'
+ );
+
+ foreach ($keyMapping as $jwtKey => $oauth2Key) {
+ if (isset($tokenData[$jwtKey])) {
+ $tokenData[$oauth2Key] = $tokenData[$jwtKey];
+ unset($tokenData[$jwtKey]);
+ }
+ }
+
+ return $tokenData;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/JwtAccessTokenInterface.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/JwtAccessTokenInterface.php
new file mode 100644
index 000000000..3abb2aa2d
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/JwtAccessTokenInterface.php
@@ -0,0 +1,14 @@
+<?php
+
+namespace OAuth2\Storage;
+
+/**
+ * No specific methods, but allows the library to check "instanceof"
+ * against interface rather than class
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+interface JwtAccessTokenInterface extends AccessTokenInterface
+{
+
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/JwtBearerInterface.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/JwtBearerInterface.php
new file mode 100644
index 000000000..c83aa72ea
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/JwtBearerInterface.php
@@ -0,0 +1,74 @@
+<?php
+
+namespace OAuth2\Storage;
+
+/**
+ * Implement this interface to specify where the OAuth2 Server
+ * should get the JWT key for clients
+ *
+ * @TODO consider extending ClientInterface, as this will almost always
+ * be the same storage as retrieving clientData
+ *
+ * @author F21
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+interface JwtBearerInterface
+{
+ /**
+ * Get the public key associated with a client_id
+ *
+ * @param $client_id
+ * Client identifier to be checked with.
+ *
+ * @return
+ * STRING Return the public key for the client_id if it exists, and MUST return FALSE if it doesn't.
+ */
+ public function getClientKey($client_id, $subject);
+
+ /**
+ * Get a jti (JSON token identifier) by matching against the client_id, subject, audience and expiration.
+ *
+ * @param $client_id
+ * Client identifier to match.
+ *
+ * @param $subject
+ * The subject to match.
+ *
+ * @param $audience
+ * The audience to match.
+ *
+ * @param $expiration
+ * The expiration of the jti.
+ *
+ * @param $jti
+ * The jti to match.
+ *
+ * @return
+ * An associative array as below, and return NULL if the jti does not exist.
+ * - issuer: Stored client identifier.
+ * - subject: Stored subject.
+ * - audience: Stored audience.
+ * - expires: Stored expiration in unix timestamp.
+ * - jti: The stored jti.
+ */
+ public function getJti($client_id, $subject, $audience, $expiration, $jti);
+
+ /**
+ * Store a used jti so that we can check against it to prevent replay attacks.
+ * @param $client_id
+ * Client identifier to insert.
+ *
+ * @param $subject
+ * The subject to insert.
+ *
+ * @param $audience
+ * The audience to insert.
+ *
+ * @param $expiration
+ * The expiration of the jti.
+ *
+ * @param $jti
+ * The jti to insert.
+ */
+ public function setJti($client_id, $subject, $audience, $expiration, $jti);
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/Memory.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/Memory.php
new file mode 100644
index 000000000..42d833ccb
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/Memory.php
@@ -0,0 +1,381 @@
+<?php
+
+namespace OAuth2\Storage;
+
+use OAuth2\OpenID\Storage\UserClaimsInterface;
+use OAuth2\OpenID\Storage\AuthorizationCodeInterface as OpenIDAuthorizationCodeInterface;
+
+/**
+ * Simple in-memory storage for all storage types
+ *
+ * NOTE: This class should never be used in production, and is
+ * a stub class for example use only
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+class Memory implements AuthorizationCodeInterface,
+ UserCredentialsInterface,
+ UserClaimsInterface,
+ AccessTokenInterface,
+ ClientCredentialsInterface,
+ RefreshTokenInterface,
+ JwtBearerInterface,
+ ScopeInterface,
+ PublicKeyInterface,
+ OpenIDAuthorizationCodeInterface
+{
+ public $authorizationCodes;
+ public $userCredentials;
+ public $clientCredentials;
+ public $refreshTokens;
+ public $accessTokens;
+ public $jwt;
+ public $jti;
+ public $supportedScopes;
+ public $defaultScope;
+ public $keys;
+
+ public function __construct($params = array())
+ {
+ $params = array_merge(array(
+ 'authorization_codes' => array(),
+ 'user_credentials' => array(),
+ 'client_credentials' => array(),
+ 'refresh_tokens' => array(),
+ 'access_tokens' => array(),
+ 'jwt' => array(),
+ 'jti' => array(),
+ 'default_scope' => null,
+ 'supported_scopes' => array(),
+ 'keys' => array(),
+ ), $params);
+
+ $this->authorizationCodes = $params['authorization_codes'];
+ $this->userCredentials = $params['user_credentials'];
+ $this->clientCredentials = $params['client_credentials'];
+ $this->refreshTokens = $params['refresh_tokens'];
+ $this->accessTokens = $params['access_tokens'];
+ $this->jwt = $params['jwt'];
+ $this->jti = $params['jti'];
+ $this->supportedScopes = $params['supported_scopes'];
+ $this->defaultScope = $params['default_scope'];
+ $this->keys = $params['keys'];
+ }
+
+ /* AuthorizationCodeInterface */
+ public function getAuthorizationCode($code)
+ {
+ if (!isset($this->authorizationCodes[$code])) {
+ return false;
+ }
+
+ return array_merge(array(
+ 'authorization_code' => $code,
+ ), $this->authorizationCodes[$code]);
+ }
+
+ public function setAuthorizationCode($code, $client_id, $user_id, $redirect_uri, $expires, $scope = null, $id_token = null)
+ {
+ $this->authorizationCodes[$code] = compact('code', 'client_id', 'user_id', 'redirect_uri', 'expires', 'scope', 'id_token');
+
+ return true;
+ }
+
+ public function setAuthorizationCodes($authorization_codes)
+ {
+ $this->authorizationCodes = $authorization_codes;
+ }
+
+ public function expireAuthorizationCode($code)
+ {
+ unset($this->authorizationCodes[$code]);
+ }
+
+ /* UserCredentialsInterface */
+ public function checkUserCredentials($username, $password)
+ {
+ $userDetails = $this->getUserDetails($username);
+
+ return $userDetails && $userDetails['password'] && $userDetails['password'] === $password;
+ }
+
+ public function setUser($username, $password, $firstName = null, $lastName = null)
+ {
+ $this->userCredentials[$username] = array(
+ 'password' => $password,
+ 'first_name' => $firstName,
+ 'last_name' => $lastName,
+ );
+
+ return true;
+ }
+
+ public function getUserDetails($username)
+ {
+ if (!isset($this->userCredentials[$username])) {
+ return false;
+ }
+
+ return array_merge(array(
+ 'user_id' => $username,
+ 'password' => null,
+ 'first_name' => null,
+ 'last_name' => null,
+ ), $this->userCredentials[$username]);
+ }
+
+ /* UserClaimsInterface */
+ public function getUserClaims($user_id, $claims)
+ {
+ if (!$userDetails = $this->getUserDetails($user_id)) {
+ return false;
+ }
+
+ $claims = explode(' ', trim($claims));
+ $userClaims = array();
+
+ // for each requested claim, if the user has the claim, set it in the response
+ $validClaims = explode(' ', self::VALID_CLAIMS);
+ foreach ($validClaims as $validClaim) {
+ if (in_array($validClaim, $claims)) {
+ if ($validClaim == 'address') {
+ // address is an object with subfields
+ $userClaims['address'] = $this->getUserClaim($validClaim, $userDetails['address'] ?: $userDetails);
+ } else {
+ $userClaims = array_merge($userClaims, $this->getUserClaim($validClaim, $userDetails));
+ }
+ }
+ }
+
+ return $userClaims;
+ }
+
+ protected function getUserClaim($claim, $userDetails)
+ {
+ $userClaims = array();
+ $claimValuesString = constant(sprintf('self::%s_CLAIM_VALUES', strtoupper($claim)));
+ $claimValues = explode(' ', $claimValuesString);
+
+ foreach ($claimValues as $value) {
+ $userClaims[$value] = isset($userDetails[$value]) ? $userDetails[$value] : null;
+ }
+
+ return $userClaims;
+ }
+
+ /* ClientCredentialsInterface */
+ public function checkClientCredentials($client_id, $client_secret = null)
+ {
+ return isset($this->clientCredentials[$client_id]['client_secret']) && $this->clientCredentials[$client_id]['client_secret'] === $client_secret;
+ }
+
+ public function isPublicClient($client_id)
+ {
+ if (!isset($this->clientCredentials[$client_id])) {
+ return false;
+ }
+
+ return empty($this->clientCredentials[$client_id]['client_secret']);
+ }
+
+ /* ClientInterface */
+ public function getClientDetails($client_id)
+ {
+ if (!isset($this->clientCredentials[$client_id])) {
+ return false;
+ }
+
+ $clientDetails = array_merge(array(
+ 'client_id' => $client_id,
+ 'client_secret' => null,
+ 'redirect_uri' => null,
+ 'scope' => null,
+ ), $this->clientCredentials[$client_id]);
+
+ return $clientDetails;
+ }
+
+ public function checkRestrictedGrantType($client_id, $grant_type)
+ {
+ if (isset($this->clientCredentials[$client_id]['grant_types'])) {
+ $grant_types = explode(' ', $this->clientCredentials[$client_id]['grant_types']);
+
+ return in_array($grant_type, $grant_types);
+ }
+
+ // if grant_types are not defined, then none are restricted
+ return true;
+ }
+
+ public function setClientDetails($client_id, $client_secret = null, $redirect_uri = null, $grant_types = null, $scope = null, $user_id = null)
+ {
+ $this->clientCredentials[$client_id] = array(
+ 'client_id' => $client_id,
+ 'client_secret' => $client_secret,
+ 'redirect_uri' => $redirect_uri,
+ 'grant_types' => $grant_types,
+ 'scope' => $scope,
+ 'user_id' => $user_id,
+ );
+
+ return true;
+ }
+
+ /* RefreshTokenInterface */
+ public function getRefreshToken($refresh_token)
+ {
+ return isset($this->refreshTokens[$refresh_token]) ? $this->refreshTokens[$refresh_token] : false;
+ }
+
+ public function setRefreshToken($refresh_token, $client_id, $user_id, $expires, $scope = null)
+ {
+ $this->refreshTokens[$refresh_token] = compact('refresh_token', 'client_id', 'user_id', 'expires', 'scope');
+
+ return true;
+ }
+
+ public function unsetRefreshToken($refresh_token)
+ {
+ if (isset($this->refreshTokens[$refresh_token])) {
+ unset($this->refreshTokens[$refresh_token]);
+
+ return true;
+ }
+
+ return false;
+ }
+
+ public function setRefreshTokens($refresh_tokens)
+ {
+ $this->refreshTokens = $refresh_tokens;
+ }
+
+ /* AccessTokenInterface */
+ public function getAccessToken($access_token)
+ {
+ return isset($this->accessTokens[$access_token]) ? $this->accessTokens[$access_token] : false;
+ }
+
+ public function setAccessToken($access_token, $client_id, $user_id, $expires, $scope = null, $id_token = null)
+ {
+ $this->accessTokens[$access_token] = compact('access_token', 'client_id', 'user_id', 'expires', 'scope', 'id_token');
+
+ return true;
+ }
+
+ public function unsetAccessToken($access_token)
+ {
+ if (isset($this->accessTokens[$access_token])) {
+ unset($this->accessTokens[$access_token]);
+
+ return true;
+ }
+
+ return false;
+ }
+
+ public function scopeExists($scope)
+ {
+ $scope = explode(' ', trim($scope));
+
+ return (count(array_diff($scope, $this->supportedScopes)) == 0);
+ }
+
+ public function getDefaultScope($client_id = null)
+ {
+ return $this->defaultScope;
+ }
+
+ /*JWTBearerInterface */
+ public function getClientKey($client_id, $subject)
+ {
+ if (isset($this->jwt[$client_id])) {
+ $jwt = $this->jwt[$client_id];
+ if ($jwt) {
+ if ($jwt["subject"] == $subject) {
+ return $jwt["key"];
+ }
+ }
+ }
+
+ return false;
+ }
+
+ public function getClientScope($client_id)
+ {
+ if (!$clientDetails = $this->getClientDetails($client_id)) {
+ return false;
+ }
+
+ if (isset($clientDetails['scope'])) {
+ return $clientDetails['scope'];
+ }
+
+ return null;
+ }
+
+ public function getJti($client_id, $subject, $audience, $expires, $jti)
+ {
+ foreach ($this->jti as $storedJti) {
+ if ($storedJti['issuer'] == $client_id && $storedJti['subject'] == $subject && $storedJti['audience'] == $audience && $storedJti['expires'] == $expires && $storedJti['jti'] == $jti) {
+ return array(
+ 'issuer' => $storedJti['issuer'],
+ 'subject' => $storedJti['subject'],
+ 'audience' => $storedJti['audience'],
+ 'expires' => $storedJti['expires'],
+ 'jti' => $storedJti['jti']
+ );
+ }
+ }
+
+ return null;
+ }
+
+ public function setJti($client_id, $subject, $audience, $expires, $jti)
+ {
+ $this->jti[] = array('issuer' => $client_id, 'subject' => $subject, 'audience' => $audience, 'expires' => $expires, 'jti' => $jti);
+ }
+
+ /*PublicKeyInterface */
+ public function getPublicKey($client_id = null)
+ {
+ if (isset($this->keys[$client_id])) {
+ return $this->keys[$client_id]['public_key'];
+ }
+
+ // use a global encryption pair
+ if (isset($this->keys['public_key'])) {
+ return $this->keys['public_key'];
+ }
+
+ return false;
+ }
+
+ public function getPrivateKey($client_id = null)
+ {
+ if (isset($this->keys[$client_id])) {
+ return $this->keys[$client_id]['private_key'];
+ }
+
+ // use a global encryption pair
+ if (isset($this->keys['private_key'])) {
+ return $this->keys['private_key'];
+ }
+
+ return false;
+ }
+
+ public function getEncryptionAlgorithm($client_id = null)
+ {
+ if (isset($this->keys[$client_id]['encryption_algorithm'])) {
+ return $this->keys[$client_id]['encryption_algorithm'];
+ }
+
+ // use a global encryption algorithm
+ if (isset($this->keys['encryption_algorithm'])) {
+ return $this->keys['encryption_algorithm'];
+ }
+
+ return 'RS256';
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/Mongo.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/Mongo.php
new file mode 100644
index 000000000..eea06e315
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/Mongo.php
@@ -0,0 +1,392 @@
+<?php
+
+namespace OAuth2\Storage;
+
+use OAuth2\OpenID\Storage\AuthorizationCodeInterface as OpenIDAuthorizationCodeInterface;
+
+/**
+ * Simple MongoDB storage for all storage types
+ *
+ * NOTE: This class is meant to get users started
+ * quickly. If your application requires further
+ * customization, extend this class or create your own.
+ *
+ * NOTE: Passwords are stored in plaintext, which is never
+ * a good idea. Be sure to override this for your application
+ *
+ * @author Julien Chaumond <chaumond@gmail.com>
+ */
+class Mongo implements AuthorizationCodeInterface,
+ AccessTokenInterface,
+ ClientCredentialsInterface,
+ UserCredentialsInterface,
+ RefreshTokenInterface,
+ JwtBearerInterface,
+ PublicKeyInterface,
+ OpenIDAuthorizationCodeInterface
+{
+ protected $db;
+ protected $config;
+
+ public function __construct($connection, $config = array())
+ {
+ if ($connection instanceof \MongoDB) {
+ $this->db = $connection;
+ } else {
+ if (!is_array($connection)) {
+ throw new \InvalidArgumentException('First argument to OAuth2\Storage\Mongo must be an instance of MongoDB or a configuration array');
+ }
+ $server = sprintf('mongodb://%s:%d', $connection['host'], $connection['port']);
+ $m = new \MongoClient($server);
+ $this->db = $m->{$connection['database']};
+ }
+
+ $this->config = array_merge(array(
+ 'client_table' => 'oauth_clients',
+ 'access_token_table' => 'oauth_access_tokens',
+ 'refresh_token_table' => 'oauth_refresh_tokens',
+ 'code_table' => 'oauth_authorization_codes',
+ 'user_table' => 'oauth_users',
+ 'key_table' => 'oauth_keys',
+ 'jwt_table' => 'oauth_jwt',
+ ), $config);
+ }
+
+ // Helper function to access a MongoDB collection by `type`:
+ protected function collection($name)
+ {
+ return $this->db->{$this->config[$name]};
+ }
+
+ /* ClientCredentialsInterface */
+ public function checkClientCredentials($client_id, $client_secret = null)
+ {
+ if ($result = $this->collection('client_table')->findOne(array('client_id' => $client_id))) {
+ return $result['client_secret'] == $client_secret;
+ }
+
+ return false;
+ }
+
+ public function isPublicClient($client_id)
+ {
+ if (!$result = $this->collection('client_table')->findOne(array('client_id' => $client_id))) {
+ return false;
+ }
+
+ return empty($result['client_secret']);
+ }
+
+ /* ClientInterface */
+ public function getClientDetails($client_id)
+ {
+ $result = $this->collection('client_table')->findOne(array('client_id' => $client_id));
+
+ return is_null($result) ? false : $result;
+ }
+
+ public function setClientDetails($client_id, $client_secret = null, $redirect_uri = null, $grant_types = null, $scope = null, $user_id = null)
+ {
+ if ($this->getClientDetails($client_id)) {
+ $this->collection('client_table')->update(
+ array('client_id' => $client_id),
+ array('$set' => array(
+ 'client_secret' => $client_secret,
+ 'redirect_uri' => $redirect_uri,
+ 'grant_types' => $grant_types,
+ 'scope' => $scope,
+ 'user_id' => $user_id,
+ ))
+ );
+ } else {
+ $client = array(
+ 'client_id' => $client_id,
+ 'client_secret' => $client_secret,
+ 'redirect_uri' => $redirect_uri,
+ 'grant_types' => $grant_types,
+ 'scope' => $scope,
+ 'user_id' => $user_id,
+ );
+ $this->collection('client_table')->insert($client);
+ }
+
+ return true;
+ }
+
+ public function checkRestrictedGrantType($client_id, $grant_type)
+ {
+ $details = $this->getClientDetails($client_id);
+ if (isset($details['grant_types'])) {
+ $grant_types = explode(' ', $details['grant_types']);
+
+ return in_array($grant_type, $grant_types);
+ }
+
+ // if grant_types are not defined, then none are restricted
+ return true;
+ }
+
+ /* AccessTokenInterface */
+ public function getAccessToken($access_token)
+ {
+ $token = $this->collection('access_token_table')->findOne(array('access_token' => $access_token));
+
+ return is_null($token) ? false : $token;
+ }
+
+ public function setAccessToken($access_token, $client_id, $user_id, $expires, $scope = null)
+ {
+ // if it exists, update it.
+ if ($this->getAccessToken($access_token)) {
+ $this->collection('access_token_table')->update(
+ array('access_token' => $access_token),
+ array('$set' => array(
+ 'client_id' => $client_id,
+ 'expires' => $expires,
+ 'user_id' => $user_id,
+ 'scope' => $scope
+ ))
+ );
+ } else {
+ $token = array(
+ 'access_token' => $access_token,
+ 'client_id' => $client_id,
+ 'expires' => $expires,
+ 'user_id' => $user_id,
+ 'scope' => $scope
+ );
+ $this->collection('access_token_table')->insert($token);
+ }
+
+ return true;
+ }
+
+ public function unsetAccessToken($access_token)
+ {
+ $result = $this->collection('access_token_table')->remove(array(
+ 'access_token' => $access_token
+ ), array('w' => 1));
+
+ return $result['n'] > 0;
+ }
+
+
+ /* AuthorizationCodeInterface */
+ public function getAuthorizationCode($code)
+ {
+ $code = $this->collection('code_table')->findOne(array('authorization_code' => $code));
+
+ return is_null($code) ? false : $code;
+ }
+
+ public function setAuthorizationCode($code, $client_id, $user_id, $redirect_uri, $expires, $scope = null, $id_token = null)
+ {
+ // if it exists, update it.
+ if ($this->getAuthorizationCode($code)) {
+ $this->collection('code_table')->update(
+ array('authorization_code' => $code),
+ array('$set' => array(
+ 'client_id' => $client_id,
+ 'user_id' => $user_id,
+ 'redirect_uri' => $redirect_uri,
+ 'expires' => $expires,
+ 'scope' => $scope,
+ 'id_token' => $id_token,
+ ))
+ );
+ } else {
+ $token = array(
+ 'authorization_code' => $code,
+ 'client_id' => $client_id,
+ 'user_id' => $user_id,
+ 'redirect_uri' => $redirect_uri,
+ 'expires' => $expires,
+ 'scope' => $scope,
+ 'id_token' => $id_token,
+ );
+ $this->collection('code_table')->insert($token);
+ }
+
+ return true;
+ }
+
+ public function expireAuthorizationCode($code)
+ {
+ $this->collection('code_table')->remove(array('authorization_code' => $code));
+
+ return true;
+ }
+
+ /* UserCredentialsInterface */
+ public function checkUserCredentials($username, $password)
+ {
+ if ($user = $this->getUser($username)) {
+ return $this->checkPassword($user, $password);
+ }
+
+ return false;
+ }
+
+ public function getUserDetails($username)
+ {
+ if ($user = $this->getUser($username)) {
+ $user['user_id'] = $user['username'];
+ }
+
+ return $user;
+ }
+
+ /* RefreshTokenInterface */
+ public function getRefreshToken($refresh_token)
+ {
+ $token = $this->collection('refresh_token_table')->findOne(array('refresh_token' => $refresh_token));
+
+ return is_null($token) ? false : $token;
+ }
+
+ public function setRefreshToken($refresh_token, $client_id, $user_id, $expires, $scope = null)
+ {
+ $token = array(
+ 'refresh_token' => $refresh_token,
+ 'client_id' => $client_id,
+ 'user_id' => $user_id,
+ 'expires' => $expires,
+ 'scope' => $scope
+ );
+ $this->collection('refresh_token_table')->insert($token);
+
+ return true;
+ }
+
+ public function unsetRefreshToken($refresh_token)
+ {
+ $result = $this->collection('refresh_token_table')->remove(array(
+ 'refresh_token' => $refresh_token
+ ), array('w' => 1));
+
+ return $result['n'] > 0;
+ }
+
+ // plaintext passwords are bad! Override this for your application
+ protected function checkPassword($user, $password)
+ {
+ return $user['password'] == $password;
+ }
+
+ public function getUser($username)
+ {
+ $result = $this->collection('user_table')->findOne(array('username' => $username));
+
+ return is_null($result) ? false : $result;
+ }
+
+ public function setUser($username, $password, $firstName = null, $lastName = null)
+ {
+ if ($this->getUser($username)) {
+ $this->collection('user_table')->update(
+ array('username' => $username),
+ array('$set' => array(
+ 'password' => $password,
+ 'first_name' => $firstName,
+ 'last_name' => $lastName
+ ))
+ );
+ } else {
+ $user = array(
+ 'username' => $username,
+ 'password' => $password,
+ 'first_name' => $firstName,
+ 'last_name' => $lastName
+ );
+ $this->collection('user_table')->insert($user);
+ }
+
+ return true;
+ }
+
+ public function getClientKey($client_id, $subject)
+ {
+ $result = $this->collection('jwt_table')->findOne(array(
+ 'client_id' => $client_id,
+ 'subject' => $subject
+ ));
+
+ return is_null($result) ? false : $result['key'];
+ }
+
+ public function getClientScope($client_id)
+ {
+ if (!$clientDetails = $this->getClientDetails($client_id)) {
+ return false;
+ }
+
+ if (isset($clientDetails['scope'])) {
+ return $clientDetails['scope'];
+ }
+
+ return null;
+ }
+
+ public function getJti($client_id, $subject, $audience, $expiration, $jti)
+ {
+ //TODO: Needs mongodb implementation.
+ throw new \Exception('getJti() for the MongoDB driver is currently unimplemented.');
+ }
+
+ public function setJti($client_id, $subject, $audience, $expiration, $jti)
+ {
+ //TODO: Needs mongodb implementation.
+ throw new \Exception('setJti() for the MongoDB driver is currently unimplemented.');
+ }
+
+ public function getPublicKey($client_id = null)
+ {
+ if ($client_id) {
+ $result = $this->collection('key_table')->findOne(array(
+ 'client_id' => $client_id
+ ));
+ if ($result) {
+ return $result['public_key'];
+ }
+ }
+
+ $result = $this->collection('key_table')->findOne(array(
+ 'client_id' => null
+ ));
+ return is_null($result) ? false : $result['public_key'];
+ }
+
+ public function getPrivateKey($client_id = null)
+ {
+ if ($client_id) {
+ $result = $this->collection('key_table')->findOne(array(
+ 'client_id' => $client_id
+ ));
+ if ($result) {
+ return $result['private_key'];
+ }
+ }
+
+ $result = $this->collection('key_table')->findOne(array(
+ 'client_id' => null
+ ));
+ return is_null($result) ? false : $result['private_key'];
+ }
+
+ public function getEncryptionAlgorithm($client_id = null)
+ {
+ if ($client_id) {
+ $result = $this->collection('key_table')->findOne(array(
+ 'client_id' => $client_id
+ ));
+ if ($result) {
+ return $result['encryption_algorithm'];
+ }
+ }
+
+ $result = $this->collection('key_table')->findOne(array(
+ 'client_id' => null
+ ));
+ return is_null($result) ? 'RS256' : $result['encryption_algorithm'];
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/MongoDB.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/MongoDB.php
new file mode 100644
index 000000000..64f740fc1
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/MongoDB.php
@@ -0,0 +1,380 @@
+<?php
+
+namespace OAuth2\Storage;
+
+use MongoDB\Client;
+use MongoDB\Database;
+use OAuth2\OpenID\Storage\AuthorizationCodeInterface as OpenIDAuthorizationCodeInterface;
+
+/**
+ * Simple MongoDB storage for all storage types
+ *
+ * NOTE: This class is meant to get users started
+ * quickly. If your application requires further
+ * customization, extend this class or create your own.
+ *
+ * NOTE: Passwords are stored in plaintext, which is never
+ * a good idea. Be sure to override this for your application
+ *
+ * @author Julien Chaumond <chaumond@gmail.com>
+ */
+class MongoDB implements AuthorizationCodeInterface,
+ UserCredentialsInterface,
+ AccessTokenInterface,
+ ClientCredentialsInterface,
+ RefreshTokenInterface,
+ JwtBearerInterface,
+ PublicKeyInterface,
+ OpenIDAuthorizationCodeInterface
+{
+ protected $db;
+ protected $config;
+
+ public function __construct($connection, $config = array())
+ {
+ if ($connection instanceof Database) {
+ $this->db = $connection;
+ } else {
+ if (!is_array($connection)) {
+ throw new \InvalidArgumentException('First argument to OAuth2\Storage\Mongo must be an instance of MongoDB\Database or a configuration array');
+ }
+ $server = sprintf('mongodb://%s:%d', $connection['host'], $connection['port']);
+ $m = new Client($server);
+ $this->db = $m->selectDatabase($connection['database']);
+ }
+ $this->config = array_merge(array(
+ 'client_table' => 'oauth_clients',
+ 'access_token_table' => 'oauth_access_tokens',
+ 'refresh_token_table' => 'oauth_refresh_tokens',
+ 'code_table' => 'oauth_authorization_codes',
+ 'user_table' => 'oauth_users',
+ 'jwt_table' => 'oauth_jwt',
+ 'jti_table' => 'oauth_jti',
+ 'scope_table' => 'oauth_scopes',
+ 'key_table' => 'oauth_keys',
+ ), $config);
+ }
+
+ /* ClientCredentialsInterface */
+ public function checkClientCredentials($client_id, $client_secret = null)
+ {
+ if ($result = $this->collection('client_table')->findOne(array('client_id' => $client_id))) {
+ return $result['client_secret'] == $client_secret;
+ }
+ return false;
+ }
+
+ public function isPublicClient($client_id)
+ {
+ if (!$result = $this->collection('client_table')->findOne(array('client_id' => $client_id))) {
+ return false;
+ }
+ return empty($result['client_secret']);
+ }
+
+ /* ClientInterface */
+ public function getClientDetails($client_id)
+ {
+ $result = $this->collection('client_table')->findOne(array('client_id' => $client_id));
+ return is_null($result) ? false : $result;
+ }
+
+ public function setClientDetails($client_id, $client_secret = null, $redirect_uri = null, $grant_types = null, $scope = null, $user_id = null)
+ {
+ if ($this->getClientDetails($client_id)) {
+ $result = $this->collection('client_table')->updateOne(
+ array('client_id' => $client_id),
+ array('$set' => array(
+ 'client_secret' => $client_secret,
+ 'redirect_uri' => $redirect_uri,
+ 'grant_types' => $grant_types,
+ 'scope' => $scope,
+ 'user_id' => $user_id,
+ ))
+ );
+ return $result->getMatchedCount() > 0;
+ }
+ $client = array(
+ 'client_id' => $client_id,
+ 'client_secret' => $client_secret,
+ 'redirect_uri' => $redirect_uri,
+ 'grant_types' => $grant_types,
+ 'scope' => $scope,
+ 'user_id' => $user_id,
+ );
+ $result = $this->collection('client_table')->insertOne($client);
+ return $result->getInsertedCount() > 0;
+ }
+
+ public function checkRestrictedGrantType($client_id, $grant_type)
+ {
+ $details = $this->getClientDetails($client_id);
+ if (isset($details['grant_types'])) {
+ $grant_types = explode(' ', $details['grant_types']);
+ return in_array($grant_type, $grant_types);
+ }
+ // if grant_types are not defined, then none are restricted
+ return true;
+ }
+
+ /* AccessTokenInterface */
+ public function getAccessToken($access_token)
+ {
+ $token = $this->collection('access_token_table')->findOne(array('access_token' => $access_token));
+ return is_null($token) ? false : $token;
+ }
+
+ public function setAccessToken($access_token, $client_id, $user_id, $expires, $scope = null)
+ {
+ // if it exists, update it.
+ if ($this->getAccessToken($access_token)) {
+ $result = $this->collection('access_token_table')->updateOne(
+ array('access_token' => $access_token),
+ array('$set' => array(
+ 'client_id' => $client_id,
+ 'expires' => $expires,
+ 'user_id' => $user_id,
+ 'scope' => $scope
+ ))
+ );
+ return $result->getMatchedCount() > 0;
+ }
+ $token = array(
+ 'access_token' => $access_token,
+ 'client_id' => $client_id,
+ 'expires' => $expires,
+ 'user_id' => $user_id,
+ 'scope' => $scope
+ );
+ $result = $this->collection('access_token_table')->insertOne($token);
+ return $result->getInsertedCount() > 0;
+ }
+
+ public function unsetAccessToken($access_token)
+ {
+ $result = $this->collection('access_token_table')->deleteOne(array(
+ 'access_token' => $access_token
+ ));
+ return $result->getDeletedCount() > 0;
+ }
+
+ /* AuthorizationCodeInterface */
+ public function getAuthorizationCode($code)
+ {
+ $code = $this->collection('code_table')->findOne(array(
+ 'authorization_code' => $code
+ ));
+ return is_null($code) ? false : $code;
+ }
+
+ public function setAuthorizationCode($code, $client_id, $user_id, $redirect_uri, $expires, $scope = null, $id_token = null)
+ {
+ // if it exists, update it.
+ if ($this->getAuthorizationCode($code)) {
+ $result = $this->collection('code_table')->updateOne(
+ array('authorization_code' => $code),
+ array('$set' => array(
+ 'client_id' => $client_id,
+ 'user_id' => $user_id,
+ 'redirect_uri' => $redirect_uri,
+ 'expires' => $expires,
+ 'scope' => $scope,
+ 'id_token' => $id_token,
+ ))
+ );
+ return $result->getMatchedCount() > 0;
+ }
+ $token = array(
+ 'authorization_code' => $code,
+ 'client_id' => $client_id,
+ 'user_id' => $user_id,
+ 'redirect_uri' => $redirect_uri,
+ 'expires' => $expires,
+ 'scope' => $scope,
+ 'id_token' => $id_token,
+ );
+ $result = $this->collection('code_table')->insertOne($token);
+ return $result->getInsertedCount() > 0;
+ }
+
+ public function expireAuthorizationCode($code)
+ {
+ $result = $this->collection('code_table')->deleteOne(array(
+ 'authorization_code' => $code
+ ));
+ return $result->getDeletedCount() > 0;
+ }
+
+ /* UserCredentialsInterface */
+ public function checkUserCredentials($username, $password)
+ {
+ if ($user = $this->getUser($username)) {
+ return $this->checkPassword($user, $password);
+ }
+ return false;
+ }
+
+ public function getUserDetails($username)
+ {
+ if ($user = $this->getUser($username)) {
+ $user['user_id'] = $user['username'];
+ }
+ return $user;
+ }
+
+ /* RefreshTokenInterface */
+ public function getRefreshToken($refresh_token)
+ {
+ $token = $this->collection('refresh_token_table')->findOne(array(
+ 'refresh_token' => $refresh_token
+ ));
+ return is_null($token) ? false : $token;
+ }
+
+ public function setRefreshToken($refresh_token, $client_id, $user_id, $expires, $scope = null)
+ {
+ $token = array(
+ 'refresh_token' => $refresh_token,
+ 'client_id' => $client_id,
+ 'user_id' => $user_id,
+ 'expires' => $expires,
+ 'scope' => $scope
+ );
+ $result = $this->collection('refresh_token_table')->insertOne($token);
+ return $result->getInsertedCount() > 0;
+ }
+
+ public function unsetRefreshToken($refresh_token)
+ {
+ $result = $this->collection('refresh_token_table')->deleteOne(array(
+ 'refresh_token' => $refresh_token
+ ));
+ return $result->getDeletedCount() > 0;
+ }
+
+ // plaintext passwords are bad! Override this for your application
+ protected function checkPassword($user, $password)
+ {
+ return $user['password'] == $password;
+ }
+
+ public function getUser($username)
+ {
+ $result = $this->collection('user_table')->findOne(array('username' => $username));
+ return is_null($result) ? false : $result;
+ }
+
+ public function setUser($username, $password, $firstName = null, $lastName = null)
+ {
+ if ($this->getUser($username)) {
+ $result = $this->collection('user_table')->updateOne(
+ array('username' => $username),
+ array('$set' => array(
+ 'password' => $password,
+ 'first_name' => $firstName,
+ 'last_name' => $lastName
+ ))
+ );
+
+ return $result->getMatchedCount() > 0;
+ }
+
+ $user = array(
+ 'username' => $username,
+ 'password' => $password,
+ 'first_name' => $firstName,
+ 'last_name' => $lastName
+ );
+ $result = $this->collection('user_table')->insertOne($user);
+ return $result->getInsertedCount() > 0;
+ }
+
+ public function getClientKey($client_id, $subject)
+ {
+ $result = $this->collection('jwt_table')->findOne(array(
+ 'client_id' => $client_id,
+ 'subject' => $subject
+ ));
+ return is_null($result) ? false : $result['key'];
+ }
+
+ public function getClientScope($client_id)
+ {
+ if (!$clientDetails = $this->getClientDetails($client_id)) {
+ return false;
+ }
+ if (isset($clientDetails['scope'])) {
+ return $clientDetails['scope'];
+ }
+ return null;
+ }
+
+ public function getJti($client_id, $subject, $audience, $expires, $jti)
+ {
+ //TODO: Needs mongodb implementation.
+ throw new \Exception('getJti() for the MongoDB driver is currently unimplemented.');
+ }
+
+ public function setJti($client_id, $subject, $audience, $expires, $jti)
+ {
+ //TODO: Needs mongodb implementation.
+ throw new \Exception('setJti() for the MongoDB driver is currently unimplemented.');
+ }
+
+ public function getPublicKey($client_id = null)
+ {
+ if ($client_id) {
+ $result = $this->collection('key_table')->findOne(array(
+ 'client_id' => $client_id
+ ));
+ if ($result) {
+ return $result['public_key'];
+ }
+ }
+
+ $result = $this->collection('key_table')->findOne(array(
+ 'client_id' => null
+ ));
+ return is_null($result) ? false : $result['public_key'];
+ }
+
+ public function getPrivateKey($client_id = null)
+ {
+ if ($client_id) {
+ $result = $this->collection('key_table')->findOne(array(
+ 'client_id' => $client_id
+ ));
+ if ($result) {
+ return $result['private_key'];
+ }
+ }
+
+ $result = $this->collection('key_table')->findOne(array(
+ 'client_id' => null
+ ));
+ return is_null($result) ? false : $result['private_key'];
+ }
+
+ public function getEncryptionAlgorithm($client_id = null)
+ {
+ if ($client_id) {
+ $result = $this->collection('key_table')->findOne(array(
+ 'client_id' => $client_id
+ ));
+ if ($result) {
+ return $result['encryption_algorithm'];
+ }
+ }
+
+ $result = $this->collection('key_table')->findOne(array(
+ 'client_id' => null
+ ));
+ return is_null($result) ? 'RS256' : $result['encryption_algorithm'];
+ }
+
+ // Helper function to access a MongoDB collection by `type`:
+ protected function collection($name)
+ {
+ return $this->db->{$this->config[$name]};
+ }
+} \ No newline at end of file
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/Pdo.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/Pdo.php
new file mode 100644
index 000000000..ae5107e29
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/Pdo.php
@@ -0,0 +1,553 @@
+<?php
+
+namespace OAuth2\Storage;
+
+use OAuth2\OpenID\Storage\UserClaimsInterface;
+use OAuth2\OpenID\Storage\AuthorizationCodeInterface as OpenIDAuthorizationCodeInterface;
+
+/**
+ * Simple PDO storage for all storage types
+ *
+ * NOTE: This class is meant to get users started
+ * quickly. If your application requires further
+ * customization, extend this class or create your own.
+ *
+ * NOTE: Passwords are stored in plaintext, which is never
+ * a good idea. Be sure to override this for your application
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+class Pdo implements
+ AuthorizationCodeInterface,
+ AccessTokenInterface,
+ ClientCredentialsInterface,
+ UserCredentialsInterface,
+ RefreshTokenInterface,
+ JwtBearerInterface,
+ ScopeInterface,
+ PublicKeyInterface,
+ UserClaimsInterface,
+ OpenIDAuthorizationCodeInterface
+{
+ protected $db;
+ protected $config;
+
+ public function __construct($connection, $config = array())
+ {
+ if (!$connection instanceof \PDO) {
+ if (is_string($connection)) {
+ $connection = array('dsn' => $connection);
+ }
+ if (!is_array($connection)) {
+ throw new \InvalidArgumentException('First argument to OAuth2\Storage\Pdo must be an instance of PDO, a DSN string, or a configuration array');
+ }
+ if (!isset($connection['dsn'])) {
+ throw new \InvalidArgumentException('configuration array must contain "dsn"');
+ }
+ // merge optional parameters
+ $connection = array_merge(array(
+ 'username' => null,
+ 'password' => null,
+ 'options' => array(),
+ ), $connection);
+ $connection = new \PDO($connection['dsn'], $connection['username'], $connection['password'], $connection['options']);
+ }
+ $this->db = $connection;
+
+ // debugging
+ $connection->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
+
+ $this->config = array_merge(array(
+ 'client_table' => 'oauth_clients',
+ 'access_token_table' => 'oauth_access_tokens',
+ 'refresh_token_table' => 'oauth_refresh_tokens',
+ 'code_table' => 'oauth_authorization_codes',
+ 'user_table' => 'oauth_users',
+ 'jwt_table' => 'oauth_jwt',
+ 'jti_table' => 'oauth_jti',
+ 'scope_table' => 'oauth_scopes',
+ 'public_key_table' => 'oauth_public_keys',
+ ), $config);
+ }
+
+ /* OAuth2\Storage\ClientCredentialsInterface */
+ public function checkClientCredentials($client_id, $client_secret = null)
+ {
+ $stmt = $this->db->prepare(sprintf('SELECT * from %s where client_id = :client_id', $this->config['client_table']));
+ $stmt->execute(compact('client_id'));
+ $result = $stmt->fetch(\PDO::FETCH_ASSOC);
+
+ // make this extensible
+ return $result && $result['client_secret'] == $client_secret;
+ }
+
+ public function isPublicClient($client_id)
+ {
+ $stmt = $this->db->prepare(sprintf('SELECT * from %s where client_id = :client_id', $this->config['client_table']));
+ $stmt->execute(compact('client_id'));
+
+ if (!$result = $stmt->fetch(\PDO::FETCH_ASSOC)) {
+ return false;
+ }
+
+ return empty($result['client_secret']);
+ }
+
+ /* OAuth2\Storage\ClientInterface */
+ public function getClientDetails($client_id)
+ {
+ $stmt = $this->db->prepare(sprintf('SELECT * from %s where client_id = :client_id', $this->config['client_table']));
+ $stmt->execute(compact('client_id'));
+
+ return $stmt->fetch(\PDO::FETCH_ASSOC);
+ }
+
+ public function setClientDetails($client_id, $client_secret = null, $redirect_uri = null, $grant_types = null, $scope = null, $user_id = null)
+ {
+ // if it exists, update it.
+ if ($this->getClientDetails($client_id)) {
+ $stmt = $this->db->prepare($sql = sprintf('UPDATE %s SET client_secret=:client_secret, redirect_uri=:redirect_uri, grant_types=:grant_types, scope=:scope, user_id=:user_id where client_id=:client_id', $this->config['client_table']));
+ } else {
+ $stmt = $this->db->prepare(sprintf('INSERT INTO %s (client_id, client_secret, redirect_uri, grant_types, scope, user_id) VALUES (:client_id, :client_secret, :redirect_uri, :grant_types, :scope, :user_id)', $this->config['client_table']));
+ }
+
+ return $stmt->execute(compact('client_id', 'client_secret', 'redirect_uri', 'grant_types', 'scope', 'user_id'));
+ }
+
+ public function checkRestrictedGrantType($client_id, $grant_type)
+ {
+ $details = $this->getClientDetails($client_id);
+ if (isset($details['grant_types'])) {
+ $grant_types = explode(' ', $details['grant_types']);
+
+ return in_array($grant_type, (array) $grant_types);
+ }
+
+ // if grant_types are not defined, then none are restricted
+ return true;
+ }
+
+ /* OAuth2\Storage\AccessTokenInterface */
+ public function getAccessToken($access_token)
+ {
+ $stmt = $this->db->prepare(sprintf('SELECT * from %s where access_token = :access_token', $this->config['access_token_table']));
+
+ $token = $stmt->execute(compact('access_token'));
+ if ($token = $stmt->fetch(\PDO::FETCH_ASSOC)) {
+ // convert date string back to timestamp
+ $token['expires'] = strtotime($token['expires']);
+ }
+
+ return $token;
+ }
+
+ public function setAccessToken($access_token, $client_id, $user_id, $expires, $scope = null)
+ {
+ // convert expires to datestring
+ $expires = date('Y-m-d H:i:s', $expires);
+
+ // if it exists, update it.
+ if ($this->getAccessToken($access_token)) {
+ $stmt = $this->db->prepare(sprintf('UPDATE %s SET client_id=:client_id, expires=:expires, user_id=:user_id, scope=:scope where access_token=:access_token', $this->config['access_token_table']));
+ } else {
+ $stmt = $this->db->prepare(sprintf('INSERT INTO %s (access_token, client_id, expires, user_id, scope) VALUES (:access_token, :client_id, :expires, :user_id, :scope)', $this->config['access_token_table']));
+ }
+
+ return $stmt->execute(compact('access_token', 'client_id', 'user_id', 'expires', 'scope'));
+ }
+
+ public function unsetAccessToken($access_token)
+ {
+ $stmt = $this->db->prepare(sprintf('DELETE FROM %s WHERE access_token = :access_token', $this->config['access_token_table']));
+
+ $stmt->execute(compact('access_token'));
+
+ return $stmt->rowCount() > 0;
+ }
+
+ /* OAuth2\Storage\AuthorizationCodeInterface */
+ public function getAuthorizationCode($code)
+ {
+ $stmt = $this->db->prepare(sprintf('SELECT * from %s where authorization_code = :code', $this->config['code_table']));
+ $stmt->execute(compact('code'));
+
+ if ($code = $stmt->fetch(\PDO::FETCH_ASSOC)) {
+ // convert date string back to timestamp
+ $code['expires'] = strtotime($code['expires']);
+ }
+
+ return $code;
+ }
+
+ public function setAuthorizationCode($code, $client_id, $user_id, $redirect_uri, $expires, $scope = null, $id_token = null)
+ {
+ if (func_num_args() > 6) {
+ // we are calling with an id token
+ return call_user_func_array(array($this, 'setAuthorizationCodeWithIdToken'), func_get_args());
+ }
+
+ // convert expires to datestring
+ $expires = date('Y-m-d H:i:s', $expires);
+
+ // if it exists, update it.
+ if ($this->getAuthorizationCode($code)) {
+ $stmt = $this->db->prepare($sql = sprintf('UPDATE %s SET client_id=:client_id, user_id=:user_id, redirect_uri=:redirect_uri, expires=:expires, scope=:scope where authorization_code=:code', $this->config['code_table']));
+ } else {
+ $stmt = $this->db->prepare(sprintf('INSERT INTO %s (authorization_code, client_id, user_id, redirect_uri, expires, scope) VALUES (:code, :client_id, :user_id, :redirect_uri, :expires, :scope)', $this->config['code_table']));
+ }
+
+ return $stmt->execute(compact('code', 'client_id', 'user_id', 'redirect_uri', 'expires', 'scope'));
+ }
+
+ private function setAuthorizationCodeWithIdToken($code, $client_id, $user_id, $redirect_uri, $expires, $scope = null, $id_token = null)
+ {
+ // convert expires to datestring
+ $expires = date('Y-m-d H:i:s', $expires);
+
+ // if it exists, update it.
+ if ($this->getAuthorizationCode($code)) {
+ $stmt = $this->db->prepare($sql = sprintf('UPDATE %s SET client_id=:client_id, user_id=:user_id, redirect_uri=:redirect_uri, expires=:expires, scope=:scope, id_token =:id_token where authorization_code=:code', $this->config['code_table']));
+ } else {
+ $stmt = $this->db->prepare(sprintf('INSERT INTO %s (authorization_code, client_id, user_id, redirect_uri, expires, scope, id_token) VALUES (:code, :client_id, :user_id, :redirect_uri, :expires, :scope, :id_token)', $this->config['code_table']));
+ }
+
+ return $stmt->execute(compact('code', 'client_id', 'user_id', 'redirect_uri', 'expires', 'scope', 'id_token'));
+ }
+
+ public function expireAuthorizationCode($code)
+ {
+ $stmt = $this->db->prepare(sprintf('DELETE FROM %s WHERE authorization_code = :code', $this->config['code_table']));
+
+ return $stmt->execute(compact('code'));
+ }
+
+ /* OAuth2\Storage\UserCredentialsInterface */
+ public function checkUserCredentials($username, $password)
+ {
+ if ($user = $this->getUser($username)) {
+ return $this->checkPassword($user, $password);
+ }
+
+ return false;
+ }
+
+ public function getUserDetails($username)
+ {
+ return $this->getUser($username);
+ }
+
+ /* UserClaimsInterface */
+ public function getUserClaims($user_id, $claims)
+ {
+ if (!$userDetails = $this->getUserDetails($user_id)) {
+ return false;
+ }
+
+ $claims = explode(' ', trim($claims));
+ $userClaims = array();
+
+ // for each requested claim, if the user has the claim, set it in the response
+ $validClaims = explode(' ', self::VALID_CLAIMS);
+ foreach ($validClaims as $validClaim) {
+ if (in_array($validClaim, $claims)) {
+ if ($validClaim == 'address') {
+ // address is an object with subfields
+ $userClaims['address'] = $this->getUserClaim($validClaim, $userDetails['address'] ?: $userDetails);
+ } else {
+ $userClaims = array_merge($userClaims, $this->getUserClaim($validClaim, $userDetails));
+ }
+ }
+ }
+
+ return $userClaims;
+ }
+
+ protected function getUserClaim($claim, $userDetails)
+ {
+ $userClaims = array();
+ $claimValuesString = constant(sprintf('self::%s_CLAIM_VALUES', strtoupper($claim)));
+ $claimValues = explode(' ', $claimValuesString);
+
+ foreach ($claimValues as $value) {
+ $userClaims[$value] = isset($userDetails[$value]) ? $userDetails[$value] : null;
+ }
+
+ return $userClaims;
+ }
+
+ /* OAuth2\Storage\RefreshTokenInterface */
+ public function getRefreshToken($refresh_token)
+ {
+ $stmt = $this->db->prepare(sprintf('SELECT * FROM %s WHERE refresh_token = :refresh_token', $this->config['refresh_token_table']));
+
+ $token = $stmt->execute(compact('refresh_token'));
+ if ($token = $stmt->fetch(\PDO::FETCH_ASSOC)) {
+ // convert expires to epoch time
+ $token['expires'] = strtotime($token['expires']);
+ }
+
+ return $token;
+ }
+
+ public function setRefreshToken($refresh_token, $client_id, $user_id, $expires, $scope = null)
+ {
+ // convert expires to datestring
+ $expires = date('Y-m-d H:i:s', $expires);
+
+ $stmt = $this->db->prepare(sprintf('INSERT INTO %s (refresh_token, client_id, user_id, expires, scope) VALUES (:refresh_token, :client_id, :user_id, :expires, :scope)', $this->config['refresh_token_table']));
+
+ return $stmt->execute(compact('refresh_token', 'client_id', 'user_id', 'expires', 'scope'));
+ }
+
+ public function unsetRefreshToken($refresh_token)
+ {
+ $stmt = $this->db->prepare(sprintf('DELETE FROM %s WHERE refresh_token = :refresh_token', $this->config['refresh_token_table']));
+
+ $stmt->execute(compact('refresh_token'));
+
+ return $stmt->rowCount() > 0;
+ }
+
+ // plaintext passwords are bad! Override this for your application
+ protected function checkPassword($user, $password)
+ {
+ return $user['password'] == $this->hashPassword($password);
+ }
+
+ // use a secure hashing algorithm when storing passwords. Override this for your application
+ protected function hashPassword($password)
+ {
+ return sha1($password);
+ }
+
+ public function getUser($username)
+ {
+ $stmt = $this->db->prepare($sql = sprintf('SELECT * from %s where username=:username', $this->config['user_table']));
+ $stmt->execute(array('username' => $username));
+
+ if (!$userInfo = $stmt->fetch(\PDO::FETCH_ASSOC)) {
+ return false;
+ }
+
+ // the default behavior is to use "username" as the user_id
+ return array_merge(array(
+ 'user_id' => $username
+ ), $userInfo);
+ }
+
+ public function setUser($username, $password, $firstName = null, $lastName = null)
+ {
+ // do not store in plaintext
+ $password = $this->hashPassword($password);
+
+ // if it exists, update it.
+ if ($this->getUser($username)) {
+ $stmt = $this->db->prepare($sql = sprintf('UPDATE %s SET password=:password, first_name=:firstName, last_name=:lastName where username=:username', $this->config['user_table']));
+ } else {
+ $stmt = $this->db->prepare(sprintf('INSERT INTO %s (username, password, first_name, last_name) VALUES (:username, :password, :firstName, :lastName)', $this->config['user_table']));
+ }
+
+ return $stmt->execute(compact('username', 'password', 'firstName', 'lastName'));
+ }
+
+ /* ScopeInterface */
+ public function scopeExists($scope)
+ {
+ $scope = explode(' ', $scope);
+ $whereIn = implode(',', array_fill(0, count($scope), '?'));
+ $stmt = $this->db->prepare(sprintf('SELECT count(scope) as count FROM %s WHERE scope IN (%s)', $this->config['scope_table'], $whereIn));
+ $stmt->execute($scope);
+
+ if ($result = $stmt->fetch(\PDO::FETCH_ASSOC)) {
+ return $result['count'] == count($scope);
+ }
+
+ return false;
+ }
+
+ public function getDefaultScope($client_id = null)
+ {
+ $stmt = $this->db->prepare(sprintf('SELECT scope FROM %s WHERE is_default=:is_default', $this->config['scope_table']));
+ $stmt->execute(array('is_default' => true));
+
+ if ($result = $stmt->fetchAll(\PDO::FETCH_ASSOC)) {
+ $defaultScope = array_map(function ($row) {
+ return $row['scope'];
+ }, $result);
+
+ return implode(' ', $defaultScope);
+ }
+
+ return null;
+ }
+
+ /* JWTBearerInterface */
+ public function getClientKey($client_id, $subject)
+ {
+ $stmt = $this->db->prepare($sql = sprintf('SELECT public_key from %s where client_id=:client_id AND subject=:subject', $this->config['jwt_table']));
+
+ $stmt->execute(array('client_id' => $client_id, 'subject' => $subject));
+
+ return $stmt->fetchColumn();
+ }
+
+ public function getClientScope($client_id)
+ {
+ if (!$clientDetails = $this->getClientDetails($client_id)) {
+ return false;
+ }
+
+ if (isset($clientDetails['scope'])) {
+ return $clientDetails['scope'];
+ }
+
+ return null;
+ }
+
+ public function getJti($client_id, $subject, $audience, $expires, $jti)
+ {
+ $stmt = $this->db->prepare($sql = sprintf('SELECT * FROM %s WHERE issuer=:client_id AND subject=:subject AND audience=:audience AND expires=:expires AND jti=:jti', $this->config['jti_table']));
+
+ $stmt->execute(compact('client_id', 'subject', 'audience', 'expires', 'jti'));
+
+ if ($result = $stmt->fetch(\PDO::FETCH_ASSOC)) {
+ return array(
+ 'issuer' => $result['issuer'],
+ 'subject' => $result['subject'],
+ 'audience' => $result['audience'],
+ 'expires' => $result['expires'],
+ 'jti' => $result['jti'],
+ );
+ }
+
+ return null;
+ }
+
+ public function setJti($client_id, $subject, $audience, $expires, $jti)
+ {
+ $stmt = $this->db->prepare(sprintf('INSERT INTO %s (issuer, subject, audience, expires, jti) VALUES (:client_id, :subject, :audience, :expires, :jti)', $this->config['jti_table']));
+
+ return $stmt->execute(compact('client_id', 'subject', 'audience', 'expires', 'jti'));
+ }
+
+ /* PublicKeyInterface */
+ public function getPublicKey($client_id = null)
+ {
+ $stmt = $this->db->prepare($sql = sprintf('SELECT public_key FROM %s WHERE client_id=:client_id OR client_id IS NULL ORDER BY client_id IS NOT NULL DESC', $this->config['public_key_table']));
+
+ $stmt->execute(compact('client_id'));
+ if ($result = $stmt->fetch(\PDO::FETCH_ASSOC)) {
+ return $result['public_key'];
+ }
+ }
+
+ public function getPrivateKey($client_id = null)
+ {
+ $stmt = $this->db->prepare($sql = sprintf('SELECT private_key FROM %s WHERE client_id=:client_id OR client_id IS NULL ORDER BY client_id IS NOT NULL DESC', $this->config['public_key_table']));
+
+ $stmt->execute(compact('client_id'));
+ if ($result = $stmt->fetch(\PDO::FETCH_ASSOC)) {
+ return $result['private_key'];
+ }
+ }
+
+ public function getEncryptionAlgorithm($client_id = null)
+ {
+ $stmt = $this->db->prepare($sql = sprintf('SELECT encryption_algorithm FROM %s WHERE client_id=:client_id OR client_id IS NULL ORDER BY client_id IS NOT NULL DESC', $this->config['public_key_table']));
+
+ $stmt->execute(compact('client_id'));
+ if ($result = $stmt->fetch(\PDO::FETCH_ASSOC)) {
+ return $result['encryption_algorithm'];
+ }
+
+ return 'RS256';
+ }
+
+ /**
+ * DDL to create OAuth2 database and tables for PDO storage
+ *
+ * @see https://github.com/dsquier/oauth2-server-php-mysql
+ */
+ public function getBuildSql($dbName = 'oauth2_server_php')
+ {
+ $sql = "
+ CREATE TABLE {$this->config['client_table']} (
+ client_id VARCHAR(80) NOT NULL,
+ client_secret VARCHAR(80),
+ redirect_uri VARCHAR(2000),
+ grant_types VARCHAR(80),
+ scope VARCHAR(4000),
+ user_id VARCHAR(80),
+ PRIMARY KEY (client_id)
+ );
+
+ CREATE TABLE {$this->config['access_token_table']} (
+ access_token VARCHAR(40) NOT NULL,
+ client_id VARCHAR(80) NOT NULL,
+ user_id VARCHAR(80),
+ expires TIMESTAMP NOT NULL,
+ scope VARCHAR(4000),
+ PRIMARY KEY (access_token)
+ );
+
+ CREATE TABLE {$this->config['code_table']} (
+ authorization_code VARCHAR(40) NOT NULL,
+ client_id VARCHAR(80) NOT NULL,
+ user_id VARCHAR(80),
+ redirect_uri VARCHAR(2000),
+ expires TIMESTAMP NOT NULL,
+ scope VARCHAR(4000),
+ id_token VARCHAR(1000),
+ PRIMARY KEY (authorization_code)
+ );
+
+ CREATE TABLE {$this->config['refresh_token_table']} (
+ refresh_token VARCHAR(40) NOT NULL,
+ client_id VARCHAR(80) NOT NULL,
+ user_id VARCHAR(80),
+ expires TIMESTAMP NOT NULL,
+ scope VARCHAR(4000),
+ PRIMARY KEY (refresh_token)
+ );
+
+ CREATE TABLE {$this->config['user_table']} (
+ username VARCHAR(80),
+ password VARCHAR(80),
+ first_name VARCHAR(80),
+ last_name VARCHAR(80),
+ email VARCHAR(80),
+ email_verified BOOLEAN,
+ scope VARCHAR(4000)
+ );
+
+ CREATE TABLE {$this->config['scope_table']} (
+ scope VARCHAR(80) NOT NULL,
+ is_default BOOLEAN,
+ PRIMARY KEY (scope)
+ );
+
+ CREATE TABLE {$this->config['jwt_table']} (
+ client_id VARCHAR(80) NOT NULL,
+ subject VARCHAR(80),
+ public_key VARCHAR(2000) NOT NULL
+ );
+
+ CREATE TABLE {$this->config['jti_table']} (
+ issuer VARCHAR(80) NOT NULL,
+ subject VARCHAR(80),
+ audience VARCHAR(80),
+ expires TIMESTAMP NOT NULL,
+ jti VARCHAR(2000) NOT NULL
+ );
+
+ CREATE TABLE {$this->config['public_key_table']} (
+ client_id VARCHAR(80),
+ public_key VARCHAR(2000),
+ private_key VARCHAR(2000),
+ encryption_algorithm VARCHAR(100) DEFAULT 'RS256'
+ )
+";
+
+ return $sql;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/PublicKeyInterface.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/PublicKeyInterface.php
new file mode 100644
index 000000000..108418d3a
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/PublicKeyInterface.php
@@ -0,0 +1,16 @@
+<?php
+
+namespace OAuth2\Storage;
+
+/**
+ * Implement this interface to specify where the OAuth2 Server
+ * should get public/private key information
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+interface PublicKeyInterface
+{
+ public function getPublicKey($client_id = null);
+ public function getPrivateKey($client_id = null);
+ public function getEncryptionAlgorithm($client_id = null);
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/Redis.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/Redis.php
new file mode 100644
index 000000000..e6294e22d
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/Redis.php
@@ -0,0 +1,321 @@
+<?php
+
+namespace OAuth2\Storage;
+
+use OAuth2\OpenID\Storage\AuthorizationCodeInterface as OpenIDAuthorizationCodeInterface;
+
+/**
+ * redis storage for all storage types
+ *
+ * To use, install "predis/predis" via composer
+ *
+ * Register client:
+ * <code>
+ * $storage = new OAuth2\Storage\Redis($redis);
+ * $storage->setClientDetails($client_id, $client_secret, $redirect_uri);
+ * </code>
+ */
+class Redis implements AuthorizationCodeInterface,
+ AccessTokenInterface,
+ ClientCredentialsInterface,
+ UserCredentialsInterface,
+ RefreshTokenInterface,
+ JwtBearerInterface,
+ ScopeInterface,
+ OpenIDAuthorizationCodeInterface
+{
+
+ private $cache;
+
+ /* The redis client */
+ protected $redis;
+
+ /* Configuration array */
+ protected $config;
+
+ /**
+ * Redis Storage!
+ *
+ * @param \Predis\Client $redis
+ * @param array $config
+ */
+ public function __construct($redis, $config=array())
+ {
+ $this->redis = $redis;
+ $this->config = array_merge(array(
+ 'client_key' => 'oauth_clients:',
+ 'access_token_key' => 'oauth_access_tokens:',
+ 'refresh_token_key' => 'oauth_refresh_tokens:',
+ 'code_key' => 'oauth_authorization_codes:',
+ 'user_key' => 'oauth_users:',
+ 'jwt_key' => 'oauth_jwt:',
+ 'scope_key' => 'oauth_scopes:',
+ ), $config);
+ }
+
+ protected function getValue($key)
+ {
+ if ( isset($this->cache[$key]) ) {
+ return $this->cache[$key];
+ }
+ $value = $this->redis->get($key);
+ if ( isset($value) ) {
+ return json_decode($value, true);
+ } else {
+ return false;
+ }
+ }
+
+ protected function setValue($key, $value, $expire=0)
+ {
+ $this->cache[$key] = $value;
+ $str = json_encode($value);
+ if ($expire > 0) {
+ $seconds = $expire - time();
+ $ret = $this->redis->setex($key, $seconds, $str);
+ } else {
+ $ret = $this->redis->set($key, $str);
+ }
+
+ // check that the key was set properly
+ // if this fails, an exception will usually thrown, so this step isn't strictly necessary
+ return is_bool($ret) ? $ret : $ret->getPayload() == 'OK';
+ }
+
+ protected function expireValue($key)
+ {
+ unset($this->cache[$key]);
+
+ return $this->redis->del($key);
+ }
+
+ /* AuthorizationCodeInterface */
+ public function getAuthorizationCode($code)
+ {
+ return $this->getValue($this->config['code_key'] . $code);
+ }
+
+ public function setAuthorizationCode($authorization_code, $client_id, $user_id, $redirect_uri, $expires, $scope = null, $id_token = null)
+ {
+ return $this->setValue(
+ $this->config['code_key'] . $authorization_code,
+ compact('authorization_code', 'client_id', 'user_id', 'redirect_uri', 'expires', 'scope', 'id_token'),
+ $expires
+ );
+ }
+
+ public function expireAuthorizationCode($code)
+ {
+ $key = $this->config['code_key'] . $code;
+ unset($this->cache[$key]);
+
+ return $this->expireValue($key);
+ }
+
+ /* UserCredentialsInterface */
+ public function checkUserCredentials($username, $password)
+ {
+ $user = $this->getUserDetails($username);
+
+ return $user && $user['password'] === $password;
+ }
+
+ public function getUserDetails($username)
+ {
+ return $this->getUser($username);
+ }
+
+ public function getUser($username)
+ {
+ if (!$userInfo = $this->getValue($this->config['user_key'] . $username)) {
+ return false;
+ }
+
+ // the default behavior is to use "username" as the user_id
+ return array_merge(array(
+ 'user_id' => $username,
+ ), $userInfo);
+ }
+
+ public function setUser($username, $password, $first_name = null, $last_name = null)
+ {
+ return $this->setValue(
+ $this->config['user_key'] . $username,
+ compact('username', 'password', 'first_name', 'last_name')
+ );
+ }
+
+ /* ClientCredentialsInterface */
+ public function checkClientCredentials($client_id, $client_secret = null)
+ {
+ if (!$client = $this->getClientDetails($client_id)) {
+ return false;
+ }
+
+ return isset($client['client_secret'])
+ && $client['client_secret'] == $client_secret;
+ }
+
+ public function isPublicClient($client_id)
+ {
+ if (!$client = $this->getClientDetails($client_id)) {
+ return false;
+ }
+
+ return empty($client['client_secret']);
+ }
+
+ /* ClientInterface */
+ public function getClientDetails($client_id)
+ {
+ return $this->getValue($this->config['client_key'] . $client_id);
+ }
+
+ public function setClientDetails($client_id, $client_secret = null, $redirect_uri = null, $grant_types = null, $scope = null, $user_id = null)
+ {
+ return $this->setValue(
+ $this->config['client_key'] . $client_id,
+ compact('client_id', 'client_secret', 'redirect_uri', 'grant_types', 'scope', 'user_id')
+ );
+ }
+
+ public function checkRestrictedGrantType($client_id, $grant_type)
+ {
+ $details = $this->getClientDetails($client_id);
+ if (isset($details['grant_types'])) {
+ $grant_types = explode(' ', $details['grant_types']);
+
+ return in_array($grant_type, (array) $grant_types);
+ }
+
+ // if grant_types are not defined, then none are restricted
+ return true;
+ }
+
+ /* RefreshTokenInterface */
+ public function getRefreshToken($refresh_token)
+ {
+ return $this->getValue($this->config['refresh_token_key'] . $refresh_token);
+ }
+
+ public function setRefreshToken($refresh_token, $client_id, $user_id, $expires, $scope = null)
+ {
+ return $this->setValue(
+ $this->config['refresh_token_key'] . $refresh_token,
+ compact('refresh_token', 'client_id', 'user_id', 'expires', 'scope'),
+ $expires
+ );
+ }
+
+ public function unsetRefreshToken($refresh_token)
+ {
+ $result = $this->expireValue($this->config['refresh_token_key'] . $refresh_token);
+
+ return $result > 0;
+ }
+
+ /* AccessTokenInterface */
+ public function getAccessToken($access_token)
+ {
+ return $this->getValue($this->config['access_token_key'].$access_token);
+ }
+
+ public function setAccessToken($access_token, $client_id, $user_id, $expires, $scope = null)
+ {
+ return $this->setValue(
+ $this->config['access_token_key'].$access_token,
+ compact('access_token', 'client_id', 'user_id', 'expires', 'scope'),
+ $expires
+ );
+ }
+
+ public function unsetAccessToken($access_token)
+ {
+ $result = $this->expireValue($this->config['access_token_key'] . $access_token);
+
+ return $result > 0;
+ }
+
+ /* ScopeInterface */
+ public function scopeExists($scope)
+ {
+ $scope = explode(' ', $scope);
+
+ $result = $this->getValue($this->config['scope_key'].'supported:global');
+
+ $supportedScope = explode(' ', (string) $result);
+
+ return (count(array_diff($scope, $supportedScope)) == 0);
+ }
+
+ public function getDefaultScope($client_id = null)
+ {
+ if (is_null($client_id) || !$result = $this->getValue($this->config['scope_key'].'default:'.$client_id)) {
+ $result = $this->getValue($this->config['scope_key'].'default:global');
+ }
+
+ return $result;
+ }
+
+ public function setScope($scope, $client_id = null, $type = 'supported')
+ {
+ if (!in_array($type, array('default', 'supported'))) {
+ throw new \InvalidArgumentException('"$type" must be one of "default", "supported"');
+ }
+
+ if (is_null($client_id)) {
+ $key = $this->config['scope_key'].$type.':global';
+ } else {
+ $key = $this->config['scope_key'].$type.':'.$client_id;
+ }
+
+ return $this->setValue($key, $scope);
+ }
+
+ /*JWTBearerInterface */
+ public function getClientKey($client_id, $subject)
+ {
+ if (!$jwt = $this->getValue($this->config['jwt_key'] . $client_id)) {
+ return false;
+ }
+
+ if (isset($jwt['subject']) && $jwt['subject'] == $subject) {
+ return $jwt['key'];
+ }
+
+ return null;
+ }
+
+ public function setClientKey($client_id, $key, $subject = null)
+ {
+ return $this->setValue($this->config['jwt_key'] . $client_id, array(
+ 'key' => $key,
+ 'subject' => $subject
+ ));
+ }
+
+ public function getClientScope($client_id)
+ {
+ if (!$clientDetails = $this->getClientDetails($client_id)) {
+ return false;
+ }
+
+ if (isset($clientDetails['scope'])) {
+ return $clientDetails['scope'];
+ }
+
+ return null;
+ }
+
+ public function getJti($client_id, $subject, $audience, $expiration, $jti)
+ {
+ //TODO: Needs redis implementation.
+ throw new \Exception('getJti() for the Redis driver is currently unimplemented.');
+ }
+
+ public function setJti($client_id, $subject, $audience, $expiration, $jti)
+ {
+ //TODO: Needs redis implementation.
+ throw new \Exception('setJti() for the Redis driver is currently unimplemented.');
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/RefreshTokenInterface.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/RefreshTokenInterface.php
new file mode 100644
index 000000000..e6407e440
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/RefreshTokenInterface.php
@@ -0,0 +1,82 @@
+<?php
+
+namespace OAuth2\Storage;
+
+/**
+ * Implement this interface to specify where the OAuth2 Server
+ * should get/save refresh tokens for the "Refresh Token"
+ * grant type
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+interface RefreshTokenInterface
+{
+ /**
+ * Grant refresh access tokens.
+ *
+ * Retrieve the stored data for the given refresh token.
+ *
+ * Required for OAuth2::GRANT_TYPE_REFRESH_TOKEN.
+ *
+ * @param $refresh_token
+ * Refresh token to be check with.
+ *
+ * @return
+ * An associative array as below, and NULL if the refresh_token is
+ * invalid:
+ * - refresh_token: Refresh token identifier.
+ * - client_id: Client identifier.
+ * - user_id: User identifier.
+ * - expires: Expiration unix timestamp, or 0 if the token doesn't expire.
+ * - scope: (optional) Scope values in space-separated string.
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-6
+ *
+ * @ingroup oauth2_section_6
+ */
+ public function getRefreshToken($refresh_token);
+
+ /**
+ * Take the provided refresh token values and store them somewhere.
+ *
+ * This function should be the storage counterpart to getRefreshToken().
+ *
+ * If storage fails for some reason, we're not currently checking for
+ * any sort of success/failure, so you should bail out of the script
+ * and provide a descriptive fail message.
+ *
+ * Required for OAuth2::GRANT_TYPE_REFRESH_TOKEN.
+ *
+ * @param $refresh_token
+ * Refresh token to be stored.
+ * @param $client_id
+ * Client identifier to be stored.
+ * @param $user_id
+ * User identifier to be stored.
+ * @param $expires
+ * Expiration timestamp to be stored. 0 if the token doesn't expire.
+ * @param $scope
+ * (optional) Scopes to be stored in space-separated string.
+ *
+ * @ingroup oauth2_section_6
+ */
+ public function setRefreshToken($refresh_token, $client_id, $user_id, $expires, $scope = null);
+
+ /**
+ * Expire a used refresh token.
+ *
+ * This is not explicitly required in the spec, but is almost implied.
+ * After granting a new refresh token, the old one is no longer useful and
+ * so should be forcibly expired in the data store so it can't be used again.
+ *
+ * If storage fails for some reason, we're not currently checking for
+ * any sort of success/failure, so you should bail out of the script
+ * and provide a descriptive fail message.
+ *
+ * @param $refresh_token
+ * Refresh token to be expired.
+ *
+ * @ingroup oauth2_section_6
+ */
+ public function unsetRefreshToken($refresh_token);
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/ScopeInterface.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/ScopeInterface.php
new file mode 100644
index 000000000..a8292269b
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/ScopeInterface.php
@@ -0,0 +1,46 @@
+<?php
+
+namespace OAuth2\Storage;
+
+/**
+ * Implement this interface to specify where the OAuth2 Server
+ * should retrieve data involving the relevent scopes associated
+ * with this implementation.
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+interface ScopeInterface
+{
+ /**
+ * Check if the provided scope exists.
+ *
+ * @param $scope
+ * A space-separated string of scopes.
+ *
+ * @return
+ * TRUE if it exists, FALSE otherwise.
+ */
+ public function scopeExists($scope);
+
+ /**
+ * The default scope to use in the event the client
+ * does not request one. By returning "false", a
+ * request_error is returned by the server to force a
+ * scope request by the client. By returning "null",
+ * opt out of requiring scopes
+ *
+ * @param $client_id
+ * An optional client id that can be used to return customized default scopes.
+ *
+ * @return
+ * string representation of default scope, null if
+ * scopes are not defined, or false to force scope
+ * request by the client
+ *
+ * ex:
+ * 'default'
+ * ex:
+ * null
+ */
+ public function getDefaultScope($client_id = null);
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/UserCredentialsInterface.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/UserCredentialsInterface.php
new file mode 100644
index 000000000..6e0fd7bad
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/UserCredentialsInterface.php
@@ -0,0 +1,52 @@
+<?php
+
+namespace OAuth2\Storage;
+
+/**
+ * Implement this interface to specify where the OAuth2 Server
+ * should retrieve user credentials for the
+ * "Resource Owner Password Credentials" grant type
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+interface UserCredentialsInterface
+{
+ /**
+ * Grant access tokens for basic user credentials.
+ *
+ * Check the supplied username and password for validity.
+ *
+ * You can also use the $client_id param to do any checks required based
+ * on a client, if you need that.
+ *
+ * Required for OAuth2::GRANT_TYPE_USER_CREDENTIALS.
+ *
+ * @param $username
+ * Username to be check with.
+ * @param $password
+ * Password to be check with.
+ *
+ * @return
+ * TRUE if the username and password are valid, and FALSE if it isn't.
+ * Moreover, if the username and password are valid, and you want to
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-4.3
+ *
+ * @ingroup oauth2_section_4
+ */
+ public function checkUserCredentials($username, $password);
+
+ /**
+ * @return
+ * ARRAY the associated "user_id" and optional "scope" values
+ * This function MUST return FALSE if the requested user does not exist or is
+ * invalid. "scope" is a space-separated list of restricted scopes.
+ * @code
+ * return array(
+ * "user_id" => USER_ID, // REQUIRED user_id to be stored with the authorization code or access token
+ * "scope" => SCOPE // OPTIONAL space-separated list of restricted scopes
+ * );
+ * @endcode
+ */
+ public function getUserDetails($username);
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/TokenType/Bearer.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/TokenType/Bearer.php
new file mode 100644
index 000000000..8ac8596ac
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/TokenType/Bearer.php
@@ -0,0 +1,130 @@
+<?php
+
+namespace OAuth2\TokenType;
+
+use OAuth2\RequestInterface;
+use OAuth2\ResponseInterface;
+
+/**
+*
+*/
+class Bearer implements TokenTypeInterface
+{
+ private $config;
+
+ public function __construct(array $config = array())
+ {
+ $this->config = array_merge(array(
+ 'token_param_name' => 'access_token',
+ 'token_bearer_header_name' => 'Bearer',
+ ), $config);
+ }
+
+ public function getTokenType()
+ {
+ return 'Bearer';
+ }
+
+ /**
+ * Check if the request has supplied token
+ *
+ * @see https://github.com/bshaffer/oauth2-server-php/issues/349#issuecomment-37993588
+ */
+ public function requestHasToken(RequestInterface $request)
+ {
+ $headers = $request->headers('AUTHORIZATION');
+
+ // check the header, then the querystring, then the request body
+ return !empty($headers) || (bool) ($request->request($this->config['token_param_name'])) || (bool) ($request->query($this->config['token_param_name']));
+ }
+
+ /**
+ * This is a convenience function that can be used to get the token, which can then
+ * be passed to getAccessTokenData(). The constraints specified by the draft are
+ * attempted to be adheared to in this method.
+ *
+ * As per the Bearer spec (draft 8, section 2) - there are three ways for a client
+ * to specify the bearer token, in order of preference: Authorization Header,
+ * POST and GET.
+ *
+ * NB: Resource servers MUST accept tokens via the Authorization scheme
+ * (http://tools.ietf.org/html/rfc6750#section-2).
+ *
+ * @todo Should we enforce TLS/SSL in this function?
+ *
+ * @see http://tools.ietf.org/html/rfc6750#section-2.1
+ * @see http://tools.ietf.org/html/rfc6750#section-2.2
+ * @see http://tools.ietf.org/html/rfc6750#section-2.3
+ *
+ * Old Android version bug (at least with version 2.2)
+ * @see http://code.google.com/p/android/issues/detail?id=6684
+ *
+ */
+ public function getAccessTokenParameter(RequestInterface $request, ResponseInterface $response)
+ {
+ $headers = $request->headers('AUTHORIZATION');
+
+ /**
+ * Ensure more than one method is not used for including an
+ * access token
+ *
+ * @see http://tools.ietf.org/html/rfc6750#section-3.1
+ */
+ $methodsUsed = !empty($headers) + (bool) ($request->query($this->config['token_param_name'])) + (bool) ($request->request($this->config['token_param_name']));
+ if ($methodsUsed > 1) {
+ $response->setError(400, 'invalid_request', 'Only one method may be used to authenticate at a time (Auth header, GET or POST)');
+
+ return null;
+ }
+
+ /**
+ * If no authentication is provided, set the status code
+ * to 401 and return no other error information
+ *
+ * @see http://tools.ietf.org/html/rfc6750#section-3.1
+ */
+ if ($methodsUsed == 0) {
+ $response->setStatusCode(401);
+
+ return null;
+ }
+
+ // HEADER: Get the access token from the header
+ if (!empty($headers)) {
+ if (!preg_match('/' . $this->config['token_bearer_header_name'] . '\s(\S+)/i', $headers, $matches)) {
+ $response->setError(400, 'invalid_request', 'Malformed auth header');
+
+ return null;
+ }
+
+ return $matches[1];
+ }
+
+ if ($request->request($this->config['token_param_name'])) {
+ // // POST: Get the token from POST data
+ if (!in_array(strtolower($request->server('REQUEST_METHOD')), array('post', 'put'))) {
+ $response->setError(400, 'invalid_request', 'When putting the token in the body, the method must be POST or PUT', '#section-2.2');
+
+ return null;
+ }
+
+ $contentType = $request->server('CONTENT_TYPE');
+ if (false !== $pos = strpos($contentType, ';')) {
+ $contentType = substr($contentType, 0, $pos);
+ }
+
+ if ($contentType !== null && $contentType != 'application/x-www-form-urlencoded') {
+ // IETF specifies content-type. NB: Not all webservers populate this _SERVER variable
+ // @see http://tools.ietf.org/html/rfc6750#section-2.2
+ $response->setError(400, 'invalid_request', 'The content type for POST requests must be "application/x-www-form-urlencoded"');
+
+ return null;
+ }
+
+ return $request->request($this->config['token_param_name']);
+ }
+
+ // GET method
+ return $request->query($this->config['token_param_name']);
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/TokenType/Mac.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/TokenType/Mac.php
new file mode 100644
index 000000000..fe6a86aa6
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/TokenType/Mac.php
@@ -0,0 +1,22 @@
+<?php
+
+namespace OAuth2\TokenType;
+
+use OAuth2\RequestInterface;
+use OAuth2\ResponseInterface;
+
+/**
+* This is not yet supported!
+*/
+class Mac implements TokenTypeInterface
+{
+ public function getTokenType()
+ {
+ return 'mac';
+ }
+
+ public function getAccessTokenParameter(RequestInterface $request, ResponseInterface $response)
+ {
+ throw new \LogicException("Not supported");
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/TokenType/TokenTypeInterface.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/TokenType/TokenTypeInterface.php
new file mode 100644
index 000000000..ad77d4a25
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/TokenType/TokenTypeInterface.php
@@ -0,0 +1,21 @@
+<?php
+
+namespace OAuth2\TokenType;
+
+use OAuth2\RequestInterface;
+use OAuth2\ResponseInterface;
+
+interface TokenTypeInterface
+{
+ /**
+ * Token type identification string
+ *
+ * ex: "bearer" or "mac"
+ */
+ public function getTokenType();
+
+ /**
+ * Retrieves the token string from the request object
+ */
+ public function getAccessTokenParameter(RequestInterface $request, ResponseInterface $response);
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/AutoloadTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/AutoloadTest.php
new file mode 100644
index 000000000..5901bdc42
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/AutoloadTest.php
@@ -0,0 +1,16 @@
+<?php
+
+namespace OAuth2;
+
+class AutoloadTest extends \PHPUnit_Framework_TestCase
+{
+ public function testClassesExist()
+ {
+ // autoloader is called in test/bootstrap.php
+ $this->assertTrue(class_exists('OAuth2\Server'));
+ $this->assertTrue(class_exists('OAuth2\Request'));
+ $this->assertTrue(class_exists('OAuth2\Response'));
+ $this->assertTrue(class_exists('OAuth2\GrantType\UserCredentials'));
+ $this->assertTrue(interface_exists('OAuth2\Storage\AccessTokenInterface'));
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/Controller/AuthorizeControllerTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Controller/AuthorizeControllerTest.php
new file mode 100644
index 000000000..3bfc760e4
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Controller/AuthorizeControllerTest.php
@@ -0,0 +1,492 @@
+<?php
+
+namespace OAuth2\Controller;
+
+use OAuth2\Storage\Memory;
+use OAuth2\Scope;
+use OAuth2\Storage\Bootstrap;
+use OAuth2\Server;
+use OAuth2\GrantType\AuthorizationCode;
+use OAuth2\Request;
+use OAuth2\Response;
+use OAuth2\Request\TestRequest;
+
+class AuthorizeControllerTest extends \PHPUnit_Framework_TestCase
+{
+ public function testNoClientIdResponse()
+ {
+ $server = $this->getTestServer();
+ $request = new Request();
+ $server->handleAuthorizeRequest($request, $response = new Response(), false);
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_client');
+ $this->assertEquals($response->getParameter('error_description'), 'No client id supplied');
+ }
+
+ public function testInvalidClientIdResponse()
+ {
+ $server = $this->getTestServer();
+ $request = new Request(array(
+ 'client_id' => 'Fake Client ID', // invalid client id
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), false);
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_client');
+ $this->assertEquals($response->getParameter('error_description'), 'The client id supplied is invalid');
+ }
+
+ public function testNoRedirectUriSuppliedOrStoredResponse()
+ {
+ $server = $this->getTestServer();
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID', // valid client id
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), false);
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_uri');
+ $this->assertEquals($response->getParameter('error_description'), 'No redirect URI was supplied or stored');
+ }
+
+ public function testNoResponseTypeResponse()
+ {
+ $server = $this->getTestServer();
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID', // valid client id
+ 'redirect_uri' => 'http://adobe.com', // valid redirect URI
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), false);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $location = $response->getHttpHeader('Location');
+ $parts = parse_url($location);
+ parse_str($parts['query'], $query);
+
+ $this->assertEquals($query['error'], 'invalid_request');
+ $this->assertEquals($query['error_description'], 'Invalid or missing response type');
+ }
+
+ public function testInvalidResponseTypeResponse()
+ {
+ $server = $this->getTestServer();
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID', // valid client id
+ 'redirect_uri' => 'http://adobe.com', // valid redirect URI
+ 'response_type' => 'invalid', // invalid response type
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), false);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $location = $response->getHttpHeader('Location');
+ $parts = parse_url($location);
+ parse_str($parts['query'], $query);
+
+ $this->assertEquals($query['error'], 'invalid_request');
+ $this->assertEquals($query['error_description'], 'Invalid or missing response type');
+ }
+
+ public function testRedirectUriFragmentResponse()
+ {
+ $server = $this->getTestServer();
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID', // valid client id
+ 'redirect_uri' => 'http://adobe.com#fragment', // valid redirect URI
+ 'response_type' => 'code', // invalid response type
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_uri');
+ $this->assertEquals($response->getParameter('error_description'), 'The redirect URI must not contain a fragment');
+ }
+
+ public function testEnforceState()
+ {
+ $server = $this->getTestServer(array('enforce_state' => true));
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID', // valid client id
+ 'redirect_uri' => 'http://adobe.com', // valid redirect URI
+ 'response_type' => 'code',
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $location = $response->getHttpHeader('Location');
+ $parts = parse_url($location);
+ parse_str($parts['query'], $query);
+
+ $this->assertEquals($query['error'], 'invalid_request');
+ $this->assertEquals($query['error_description'], 'The state parameter is required');
+ }
+
+ public function testDoNotEnforceState()
+ {
+ $server = $this->getTestServer(array('enforce_state' => false));
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID', // valid client id
+ 'redirect_uri' => 'http://adobe.com', // valid redirect URI
+ 'response_type' => 'code',
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $this->assertNotContains('error', $response->getHttpHeader('Location'));
+ }
+
+ public function testEnforceScope()
+ {
+ $server = $this->getTestServer();
+ $scopeStorage = new Memory(array('default_scope' => false, 'supported_scopes' => array('testscope')));
+ $server->setScopeUtil(new Scope($scopeStorage));
+
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID', // valid client id
+ 'redirect_uri' => 'http://adobe.com', // valid redirect URI
+ 'response_type' => 'code',
+ 'state' => 'xyz',
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $parts = parse_url($response->getHttpHeader('Location'));
+ parse_str($parts['query'], $query);
+
+ $this->assertEquals($query['error'], 'invalid_client');
+ $this->assertEquals($query['error_description'], 'This application requires you specify a scope parameter');
+
+ $request->query['scope'] = 'testscope';
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $this->assertNotContains('error', $response->getHttpHeader('Location'));
+ }
+
+ public function testInvalidRedirectUri()
+ {
+ $server = $this->getTestServer();
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID with Redirect Uri', // valid client id
+ 'redirect_uri' => 'http://adobe.com', // invalid redirect URI
+ 'response_type' => 'code',
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'redirect_uri_mismatch');
+ $this->assertEquals($response->getParameter('error_description'), 'The redirect URI provided is missing or does not match');
+ }
+
+ public function testInvalidRedirectUriApprovedByBuggyRegisteredUri()
+ {
+ $server = $this->getTestServer();
+ $server->setConfig('require_exact_redirect_uri', false);
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID with Buggy Redirect Uri', // valid client id
+ 'redirect_uri' => 'http://adobe.com', // invalid redirect URI
+ 'response_type' => 'code',
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'redirect_uri_mismatch');
+ $this->assertEquals($response->getParameter('error_description'), 'The redirect URI provided is missing or does not match');
+ }
+
+ public function testNoRedirectUriWithMultipleRedirectUris()
+ {
+ $server = $this->getTestServer();
+
+ // create a request with no "redirect_uri" in querystring
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID with Multiple Redirect Uris', // valid client id
+ 'response_type' => 'code',
+ ));
+
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_uri');
+ $this->assertEquals($response->getParameter('error_description'), 'A redirect URI must be supplied when multiple redirect URIs are registered');
+ }
+
+ public function testRedirectUriWithValidRedirectUri()
+ {
+ $server = $this->getTestServer();
+
+ // create a request with no "redirect_uri" in querystring
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID with Redirect Uri Parts', // valid client id
+ 'response_type' => 'code',
+ 'redirect_uri' => 'http://user:pass@brentertainment.com:2222/authorize/cb?auth_type=oauth&test=true',
+ 'state' => 'xyz',
+ ));
+
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $this->assertContains('code', $response->getHttpHeader('Location'));
+ }
+
+ public function testRedirectUriWithDifferentQueryAndExactMatchRequired()
+ {
+ $server = $this->getTestServer(array('require_exact_redirect_uri' => true));
+
+ // create a request with no "redirect_uri" in querystring
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID with Redirect Uri Parts', // valid client id
+ 'response_type' => 'code',
+ 'redirect_uri' => 'http://user:pass@brentertainment.com:2222/authorize/cb?auth_type=oauth&test=true&hereisa=querystring',
+ ));
+
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'redirect_uri_mismatch');
+ $this->assertEquals($response->getParameter('error_description'), 'The redirect URI provided is missing or does not match');
+ }
+
+ public function testRedirectUriWithDifferentQueryAndExactMatchNotRequired()
+ {
+ $server = $this->getTestServer(array('require_exact_redirect_uri' => false));
+
+ // create a request with no "redirect_uri" in querystring
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID with Redirect Uri Parts', // valid client id
+ 'response_type' => 'code',
+ 'redirect_uri' => 'http://user:pass@brentertainment.com:2222/authorize/cb?auth_type=oauth&test=true&hereisa=querystring',
+ 'state' => 'xyz',
+ ));
+
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $this->assertContains('code', $response->getHttpHeader('Location'));
+ }
+
+ public function testMultipleRedirectUris()
+ {
+ $server = $this->getTestServer();
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID with Multiple Redirect Uris', // valid client id
+ 'redirect_uri' => 'http://brentertainment.com', // valid redirect URI
+ 'response_type' => 'code',
+ 'state' => 'xyz'
+ ));
+
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+ $this->assertEquals($response->getStatusCode(), 302);
+ $this->assertContains('code', $response->getHttpHeader('Location'));
+
+ // call again with different (but still valid) redirect URI
+ $request->query['redirect_uri'] = 'http://morehazards.com';
+
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+ $this->assertEquals($response->getStatusCode(), 302);
+ $this->assertContains('code', $response->getHttpHeader('Location'));
+ }
+
+ /**
+ * @see http://tools.ietf.org/html/rfc6749#section-4.1.3
+ * @see https://github.com/bshaffer/oauth2-server-php/issues/163
+ */
+ public function testNoRedirectUriSuppliedDoesNotRequireTokenRedirectUri()
+ {
+ $server = $this->getTestServer();
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID with Redirect Uri', // valid client id
+ 'response_type' => 'code',
+ 'state' => 'xyz',
+ ));
+
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+ $this->assertEquals($response->getStatusCode(), 302);
+ $this->assertContains('state', $response->getHttpHeader('Location'));
+ $this->assertStringStartsWith('http://brentertainment.com?code=', $response->getHttpHeader('Location'));
+
+ $parts = parse_url($response->getHttpHeader('Location'));
+ parse_str($parts['query'], $query);
+
+ // call token endpoint with no redirect_uri supplied
+ $request = TestRequest::createPost(array(
+ 'client_id' => 'Test Client ID with Redirect Uri', // valid client id
+ 'client_secret' => 'TestSecret2',
+ 'grant_type' => 'authorization_code',
+ 'code' => $query['code'],
+ ));
+
+ $server->handleTokenRequest($request, $response = new Response(), true);
+ $this->assertEquals($response->getStatusCode(), 200);
+ $this->assertNotNull($response->getParameter('access_token'));
+ }
+
+ public function testUserDeniesAccessResponse()
+ {
+ $server = $this->getTestServer();
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID', // valid client id
+ 'redirect_uri' => 'http://adobe.com', // valid redirect URI
+ 'response_type' => 'code',
+ 'state' => 'xyz',
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), false);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $location = $response->getHttpHeader('Location');
+ $parts = parse_url($location);
+ parse_str($parts['query'], $query);
+
+ $this->assertEquals($query['error'], 'access_denied');
+ $this->assertEquals($query['error_description'], 'The user denied access to your application');
+ }
+
+ public function testCodeQueryParamIsSet()
+ {
+ $server = $this->getTestServer();
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID', // valid client id
+ 'redirect_uri' => 'http://adobe.com', // valid redirect URI
+ 'response_type' => 'code',
+ 'state' => 'xyz',
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $location = $response->getHttpHeader('Location');
+ $parts = parse_url($location);
+ parse_str($parts['query'], $query);
+
+ $location = $response->getHttpHeader('Location');
+ $parts = parse_url($location);
+
+ $this->assertEquals('http', $parts['scheme']); // same as passed in to redirect_uri
+ $this->assertEquals('adobe.com', $parts['host']); // same as passed in to redirect_uri
+ $this->assertArrayHasKey('query', $parts);
+ $this->assertFalse(isset($parts['fragment']));
+
+ // assert fragment is in "application/x-www-form-urlencoded" format
+ parse_str($parts['query'], $query);
+ $this->assertNotNull($query);
+ $this->assertArrayHasKey('code', $query);
+
+ // ensure no id_token was saved, since the openid scope wasn't requested
+ $storage = $server->getStorage('authorization_code');
+ $code = $storage->getAuthorizationCode($query['code']);
+ $this->assertTrue(empty($code['id_token']));
+
+ // ensure no error was returned
+ $this->assertFalse(isset($query['error']));
+ $this->assertFalse(isset($query['error_description']));
+ }
+
+ public function testSuccessfulRequestReturnsStateParameter()
+ {
+ $server = $this->getTestServer(array('allow_implicit' => true));
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID', // valid client id
+ 'redirect_uri' => 'http://adobe.com', // valid redirect URI
+ 'response_type' => 'code',
+ 'state' => 'test', // valid state string (just needs to be passed back to us)
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+
+ $location = $response->getHttpHeader('Location');
+ $parts = parse_url($location);
+ $this->assertArrayHasKey('query', $parts);
+ parse_str($parts['query'], $query);
+
+ $this->assertArrayHasKey('state', $query);
+ $this->assertEquals($query['state'], 'test');
+
+ // ensure no error was returned
+ $this->assertFalse(isset($query['error']));
+ $this->assertFalse(isset($query['error_description']));
+ }
+
+ public function testSuccessfulRequestStripsExtraParameters()
+ {
+ $server = $this->getTestServer(array('allow_implicit' => true));
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID', // valid client id
+ 'redirect_uri' => 'http://adobe.com', // valid redirect URI
+ 'response_type' => 'code',
+ 'state' => 'test', // valid state string (just needs to be passed back to us)
+ 'fake' => 'something', // extra query param
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $location = $response->getHttpHeader('Location');
+ $this->assertNotContains('error', $location);
+
+ $parts = parse_url($location);
+ $this->assertFalse(isset($parts['fake']));
+ $this->assertArrayHasKey('query', $parts);
+ parse_str($parts['query'], $query);
+
+ $this->assertFalse(isset($parmas['fake']));
+ $this->assertArrayHasKey('state', $query);
+ $this->assertEquals($query['state'], 'test');
+ }
+
+ public function testSuccessfulOpenidConnectRequest()
+ {
+ $server = $this->getTestServer(array(
+ 'use_openid_connect' => true,
+ 'issuer' => 'bojanz',
+ ));
+
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID',
+ 'redirect_uri' => 'http://adobe.com',
+ 'response_type' => 'code',
+ 'state' => 'xyz',
+ 'scope' => 'openid',
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $location = $response->getHttpHeader('Location');
+ $parts = parse_url($location);
+ parse_str($parts['query'], $query);
+
+ $location = $response->getHttpHeader('Location');
+ $parts = parse_url($location);
+ $this->assertArrayHasKey('query', $parts);
+ $this->assertFalse(isset($parts['fragment']));
+
+ // assert fragment is in "application/x-www-form-urlencoded" format
+ parse_str($parts['query'], $query);
+ $this->assertNotNull($query);
+ $this->assertArrayHasKey('code', $query);
+
+ // ensure no error was returned
+ $this->assertFalse(isset($query['error']));
+ $this->assertFalse(isset($query['error_description']));
+
+ // confirm that the id_token has been created.
+ $storage = $server->getStorage('authorization_code');
+ $code = $storage->getAuthorizationCode($query['code']);
+ $this->assertTrue(!empty($code['id_token']));
+ }
+
+ public function testCreateController()
+ {
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $controller = new AuthorizeController($storage);
+ }
+
+ private function getTestServer($config = array())
+ {
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $server = new Server($storage, $config);
+
+ // Add the two types supported for authorization grant
+ $server->addGrantType(new AuthorizationCode($storage));
+
+ return $server;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/Controller/ResourceControllerTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Controller/ResourceControllerTest.php
new file mode 100644
index 000000000..b277514a5
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Controller/ResourceControllerTest.php
@@ -0,0 +1,176 @@
+<?php
+
+namespace OAuth2\Controller;
+
+use OAuth2\Storage\Bootstrap;
+use OAuth2\Server;
+use OAuth2\GrantType\AuthorizationCode;
+use OAuth2\Request;
+use OAuth2\Response;
+
+class ResourceControllerTest extends \PHPUnit_Framework_TestCase
+{
+ public function testNoAccessToken()
+ {
+ $server = $this->getTestServer();
+ $request = Request::createFromGlobals();
+ $allow = $server->verifyResourceRequest($request, $response = new Response());
+ $this->assertFalse($allow);
+
+ $this->assertEquals($response->getStatusCode(), 401);
+ $this->assertNull($response->getParameter('error'));
+ $this->assertNull($response->getParameter('error_description'));
+ $this->assertEquals('', $response->getResponseBody());
+ }
+
+ public function testMalformedHeader()
+ {
+ $server = $this->getTestServer();
+ $request = Request::createFromGlobals();
+ $request->headers['AUTHORIZATION'] = 'tH1s i5 B0gU5';
+ $allow = $server->verifyResourceRequest($request, $response = new Response());
+ $this->assertFalse($allow);
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_request');
+ $this->assertEquals($response->getParameter('error_description'), 'Malformed auth header');
+ }
+
+ public function testMultipleTokensSubmitted()
+ {
+ $server = $this->getTestServer();
+ $request = Request::createFromGlobals();
+ $request->request['access_token'] = 'TEST';
+ $request->query['access_token'] = 'TEST';
+ $allow = $server->verifyResourceRequest($request, $response = new Response());
+ $this->assertFalse($allow);
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_request');
+ $this->assertEquals($response->getParameter('error_description'), 'Only one method may be used to authenticate at a time (Auth header, GET or POST)');
+ }
+
+ public function testInvalidRequestMethod()
+ {
+ $server = $this->getTestServer();
+ $request = Request::createFromGlobals();
+ $request->server['REQUEST_METHOD'] = 'GET';
+ $request->request['access_token'] = 'TEST';
+ $allow = $server->verifyResourceRequest($request, $response = new Response());
+ $this->assertFalse($allow);
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_request');
+ $this->assertEquals($response->getParameter('error_description'), 'When putting the token in the body, the method must be POST or PUT');
+ }
+
+ public function testInvalidContentType()
+ {
+ $server = $this->getTestServer();
+ $request = Request::createFromGlobals();
+ $request->server['REQUEST_METHOD'] = 'POST';
+ $request->server['CONTENT_TYPE'] = 'application/json';
+ $request->request['access_token'] = 'TEST';
+ $allow = $server->verifyResourceRequest($request, $response = new Response());
+ $this->assertFalse($allow);
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_request');
+ $this->assertEquals($response->getParameter('error_description'), 'The content type for POST requests must be "application/x-www-form-urlencoded"');
+ }
+
+ public function testInvalidToken()
+ {
+ $server = $this->getTestServer();
+ $request = Request::createFromGlobals();
+ $request->headers['AUTHORIZATION'] = 'Bearer TESTTOKEN';
+ $allow = $server->verifyResourceRequest($request, $response = new Response());
+ $this->assertFalse($allow);
+
+ $this->assertEquals($response->getStatusCode(), 401);
+ $this->assertEquals($response->getParameter('error'), 'invalid_token');
+ $this->assertEquals($response->getParameter('error_description'), 'The access token provided is invalid');
+ }
+
+ public function testExpiredToken()
+ {
+ $server = $this->getTestServer();
+ $request = Request::createFromGlobals();
+ $request->headers['AUTHORIZATION'] = 'Bearer accesstoken-expired';
+ $allow = $server->verifyResourceRequest($request, $response = new Response());
+ $this->assertFalse($allow);
+
+ $this->assertEquals($response->getStatusCode(), 401);
+ $this->assertEquals($response->getParameter('error'), 'invalid_token');
+ $this->assertEquals($response->getParameter('error_description'), 'The access token provided has expired');
+ }
+
+ public function testOutOfScopeToken()
+ {
+ $server = $this->getTestServer();
+ $request = Request::createFromGlobals();
+ $request->headers['AUTHORIZATION'] = 'Bearer accesstoken-scope';
+ $scope = 'outofscope';
+ $allow = $server->verifyResourceRequest($request, $response = new Response(), $scope);
+ $this->assertFalse($allow);
+
+ $this->assertEquals($response->getStatusCode(), 403);
+ $this->assertEquals($response->getParameter('error'), 'insufficient_scope');
+ $this->assertEquals($response->getParameter('error_description'), 'The request requires higher privileges than provided by the access token');
+
+ // verify the "scope" has been set in the "WWW-Authenticate" header
+ preg_match('/scope="(.*?)"/', $response->getHttpHeader('WWW-Authenticate'), $matches);
+ $this->assertEquals(2, count($matches));
+ $this->assertEquals($matches[1], 'outofscope');
+ }
+
+ public function testMalformedToken()
+ {
+ $server = $this->getTestServer();
+ $request = Request::createFromGlobals();
+ $request->headers['AUTHORIZATION'] = 'Bearer accesstoken-malformed';
+ $allow = $server->verifyResourceRequest($request, $response = new Response());
+ $this->assertFalse($allow);
+
+ $this->assertEquals($response->getStatusCode(), 401);
+ $this->assertEquals($response->getParameter('error'), 'malformed_token');
+ $this->assertEquals($response->getParameter('error_description'), 'Malformed token (missing "expires")');
+ }
+
+ public function testValidToken()
+ {
+ $server = $this->getTestServer();
+ $request = Request::createFromGlobals();
+ $request->headers['AUTHORIZATION'] = 'Bearer accesstoken-scope';
+ $allow = $server->verifyResourceRequest($request, $response = new Response());
+ $this->assertTrue($allow);
+ }
+
+ public function testValidTokenWithScopeParam()
+ {
+ $server = $this->getTestServer();
+ $request = Request::createFromGlobals();
+ $request->headers['AUTHORIZATION'] = 'Bearer accesstoken-scope';
+ $request->query['scope'] = 'testscope';
+ $allow = $server->verifyResourceRequest($request, $response = new Response());
+ $this->assertTrue($allow);
+ }
+
+ public function testCreateController()
+ {
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $tokenType = new \OAuth2\TokenType\Bearer();
+ $controller = new ResourceController($tokenType, $storage);
+ }
+
+ private function getTestServer($config = array())
+ {
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $server = new Server($storage, $config);
+
+ // Add the two types supported for authorization grant
+ $server->addGrantType(new AuthorizationCode($storage));
+
+ return $server;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/Controller/TokenControllerTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Controller/TokenControllerTest.php
new file mode 100644
index 000000000..4a217bd55
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Controller/TokenControllerTest.php
@@ -0,0 +1,289 @@
+<?php
+
+namespace OAuth2\Controller;
+
+use OAuth2\Storage\Bootstrap;
+use OAuth2\Server;
+use OAuth2\GrantType\AuthorizationCode;
+use OAuth2\GrantType\ClientCredentials;
+use OAuth2\GrantType\UserCredentials;
+use OAuth2\Scope;
+use OAuth2\Request\TestRequest;
+use OAuth2\Response;
+
+class TokenControllerTest extends \PHPUnit_Framework_TestCase
+{
+ public function testNoGrantType()
+ {
+ // add the test parameters in memory
+ $server = $this->getTestServer();
+ $server->handleTokenRequest(TestRequest::createPost(), $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_request');
+ $this->assertEquals($response->getParameter('error_description'), 'The grant type was not specified in the request');
+ }
+
+ public function testInvalidGrantType()
+ {
+ // add the test parameters in memory
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'invalid_grant_type', // invalid grant type
+ ));
+ $server->handleTokenRequest($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'unsupported_grant_type');
+ $this->assertEquals($response->getParameter('error_description'), 'Grant type "invalid_grant_type" not supported');
+ }
+
+ public function testNoClientId()
+ {
+ // add the test parameters in memory
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'code' => 'testcode',
+ ));
+ $server->handleTokenRequest($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_client');
+ $this->assertEquals($response->getParameter('error_description'), 'Client credentials were not found in the headers or body');
+ }
+
+ public function testNoClientSecretWithConfidentialClient()
+ {
+ // add the test parameters in memory
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'code' => 'testcode',
+ 'client_id' => 'Test Client ID', // valid client id
+ ));
+ $server->handleTokenRequest($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_client');
+ $this->assertEquals($response->getParameter('error_description'), 'This client is invalid or must authenticate using a client secret');
+ }
+
+ public function testNoClientSecretWithEmptySecret()
+ {
+ // add the test parameters in memory
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'code' => 'testcode-empty-secret',
+ 'client_id' => 'Test Client ID Empty Secret', // valid client id
+ ));
+ $server->handleTokenRequest($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 200);
+ }
+
+ public function testInvalidClientId()
+ {
+ // add the test parameters in memory
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'code' => 'testcode',
+ 'client_id' => 'Fake Client ID', // invalid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ ));
+ $server->handleTokenRequest($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_client');
+ $this->assertEquals($response->getParameter('error_description'), 'The client credentials are invalid');
+ }
+
+ public function testInvalidClientSecret()
+ {
+ // add the test parameters in memory
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'code' => 'testcode',
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'Fake Client Secret', // invalid client secret
+ ));
+ $server->handleTokenRequest($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_client');
+ $this->assertEquals($response->getParameter('error_description'), 'The client credentials are invalid');
+ }
+
+ public function testValidTokenResponse()
+ {
+ // add the test parameters in memory
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'code' => 'testcode', // valid authorization code
+ ));
+ $server->handleTokenRequest($request, $response = new Response());
+
+ $this->assertTrue($response instanceof Response);
+ $this->assertEquals($response->getStatusCode(), 200);
+ $this->assertNull($response->getParameter('error'));
+ $this->assertNull($response->getParameter('error_description'));
+ $this->assertNotNull($response->getParameter('access_token'));
+ $this->assertNotNull($response->getParameter('expires_in'));
+ $this->assertNotNull($response->getParameter('token_type'));
+ }
+
+ public function testValidClientIdScope()
+ {
+ // add the test parameters in memory
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'code' => 'testcode',
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'scope' => 'clientscope1 clientscope2'
+ ));
+ $server->handleTokenRequest($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 200);
+ $this->assertNull($response->getParameter('error'));
+ $this->assertNull($response->getParameter('error_description'));
+ $this->assertEquals('clientscope1 clientscope2', $response->getParameter('scope'));
+ }
+
+ public function testInvalidClientIdScope()
+ {
+ // add the test parameters in memory
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'code' => 'testcode-with-scope',
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'scope' => 'clientscope3'
+ ));
+ $server->handleTokenRequest($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_scope');
+ $this->assertEquals($response->getParameter('error_description'), 'The scope requested is invalid for this request');
+ }
+
+ public function testEnforceScope()
+ {
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $server = new Server($storage);
+ $server->addGrantType(new ClientCredentials($storage));
+
+ $scope = new Scope(array(
+ 'default_scope' => false,
+ 'supported_scopes' => array('testscope')
+ ));
+ $server->setScopeUtil($scope);
+
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'client_credentials', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ ));
+ $response = $server->handleTokenRequest($request);
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_scope');
+ $this->assertEquals($response->getParameter('error_description'), 'This application requires you specify a scope parameter');
+ }
+
+ public function testCanReceiveAccessTokenUsingPasswordGrantTypeWithoutClientSecret()
+ {
+ // add the test parameters in memory
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $server = new Server($storage);
+ $server->addGrantType(new UserCredentials($storage));
+
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'password', // valid grant type
+ 'client_id' => 'Test Client ID For Password Grant', // valid client id
+ 'username' => 'johndoe', // valid username
+ 'password' => 'password', // valid password for username
+ ));
+ $server->handleTokenRequest($request, $response = new Response());
+
+ $this->assertTrue($response instanceof Response);
+ $this->assertEquals(200, $response->getStatusCode(), var_export($response, 1));
+ $this->assertNull($response->getParameter('error'));
+ $this->assertNull($response->getParameter('error_description'));
+ $this->assertNotNull($response->getParameter('access_token'));
+ $this->assertNotNull($response->getParameter('expires_in'));
+ $this->assertNotNull($response->getParameter('token_type'));
+ }
+
+ public function testInvalidTokenTypeHintForRevoke()
+ {
+ $server = $this->getTestServer();
+
+ $request = TestRequest::createPost(array(
+ 'token_type_hint' => 'foo',
+ 'token' => 'sometoken'
+ ));
+
+ $server->handleRevokeRequest($request, $response = new Response());
+
+ $this->assertTrue($response instanceof Response);
+ $this->assertEquals(400, $response->getStatusCode(), var_export($response, 1));
+ $this->assertEquals($response->getParameter('error'), 'invalid_request');
+ $this->assertEquals($response->getParameter('error_description'), 'Token type hint must be either \'access_token\' or \'refresh_token\'');
+ }
+
+ public function testMissingTokenForRevoke()
+ {
+ $server = $this->getTestServer();
+
+ $request = TestRequest::createPost(array(
+ 'token_type_hint' => 'access_token'
+ ));
+
+ $server->handleRevokeRequest($request, $response = new Response());
+ $this->assertTrue($response instanceof Response);
+ $this->assertEquals(400, $response->getStatusCode(), var_export($response, 1));
+ $this->assertEquals($response->getParameter('error'), 'invalid_request');
+ $this->assertEquals($response->getParameter('error_description'), 'Missing token parameter to revoke');
+ }
+
+ public function testInvalidRequestMethodForRevoke()
+ {
+ $server = $this->getTestServer();
+
+ $request = new TestRequest();
+ $request->setQuery(array(
+ 'token_type_hint' => 'access_token'
+ ));
+
+ $server->handleRevokeRequest($request, $response = new Response());
+ $this->assertTrue($response instanceof Response);
+ $this->assertEquals(405, $response->getStatusCode(), var_export($response, 1));
+ $this->assertEquals($response->getParameter('error'), 'invalid_request');
+ $this->assertEquals($response->getParameter('error_description'), 'The request method must be POST when revoking an access token');
+ }
+
+ public function testCreateController()
+ {
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $accessToken = new \OAuth2\ResponseType\AccessToken($storage);
+ $controller = new TokenController($accessToken, $storage);
+ }
+
+ private function getTestServer()
+ {
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $server = new Server($storage);
+ $server->addGrantType(new AuthorizationCode($storage));
+
+ return $server;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/Encryption/FirebaseJwtTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Encryption/FirebaseJwtTest.php
new file mode 100644
index 000000000..d34136767
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Encryption/FirebaseJwtTest.php
@@ -0,0 +1,102 @@
+<?php
+
+namespace OAuth2\Encryption;
+
+use OAuth2\Storage\Bootstrap;
+
+class FirebaseJwtTest extends \PHPUnit_Framework_TestCase
+{
+ private $privateKey;
+
+ public function setUp()
+ {
+ $this->privateKey = <<<EOD
+-----BEGIN RSA PRIVATE KEY-----
+MIICXAIBAAKBgQC5/SxVlE8gnpFqCxgl2wjhzY7ucEi00s0kUg3xp7lVEvgLgYcA
+nHiWp+gtSjOFfH2zsvpiWm6Lz5f743j/FEzHIO1owR0p4d9pOaJK07d01+RzoQLO
+IQAgXrr4T1CCWUesncwwPBVCyy2Mw3Nmhmr9MrF8UlvdRKBxriRnlP3qJQIDAQAB
+AoGAVgJJVU4fhYMu1e5JfYAcTGfF+Gf+h3iQm4JCpoUcxMXf5VpB9ztk3K7LRN5y
+kwFuFALpnUAarRcUPs0D8FoP4qBluKksbAtgHkO7bMSH9emN+mH4le4qpFlR7+P1
+3fLE2Y19IBwPwEfClC+TpJvuog6xqUYGPlg6XLq/MxQUB4ECQQDgovP1v+ONSeGS
+R+NgJTR47noTkQT3M2izlce/OG7a+O0yw6BOZjNXqH2wx3DshqMcPUFrTjibIClP
+l/tEQ3ShAkEA0/TdBYDtXpNNjqg0R9GVH2pw7Kh68ne6mZTuj0kCgFYpUF6L6iMm
+zXamIJ51rTDsTyKTAZ1JuAhAsK/M2BbDBQJAKQ5fXEkIA+i+64dsDUR/hKLBeRYG
+PFAPENONQGvGBwt7/s02XV3cgGbxIgAxqWkqIp0neb9AJUoJgtyaNe3GQQJANoL4
+QQ0af0NVJAZgg8QEHTNL3aGrFSbzx8IE5Lb7PLRsJa5bP5lQxnDoYuU+EI/Phr62
+niisp/b/ZDGidkTMXQJBALeRsH1I+LmICAvWXpLKa9Gv0zGCwkuIJLiUbV9c6CVh
+suocCAteQwL5iW2gA4AnYr5OGeHFsEl7NCQcwfPZpJ0=
+-----END RSA PRIVATE KEY-----
+EOD;
+ }
+
+ /** @dataProvider provideClientCredentials */
+ public function testJwtUtil($client_id, $client_key)
+ {
+ $jwtUtil = new FirebaseJwt();
+
+ $params = array(
+ 'iss' => $client_id,
+ 'exp' => time() + 1000,
+ 'iat' => time(),
+ 'sub' => 'testuser@ourdomain.com',
+ 'aud' => 'http://myapp.com/oauth/auth',
+ 'scope' => null,
+ );
+
+ $encoded = $jwtUtil->encode($params, $this->privateKey, 'RS256');
+
+ // test BC behaviour of trusting the algorithm in the header
+ $payload = $jwtUtil->decode($encoded, $client_key, array('RS256'));
+ $this->assertEquals($params, $payload);
+
+ // test BC behaviour of not verifying by passing false
+ $payload = $jwtUtil->decode($encoded, $client_key, false);
+ $this->assertEquals($params, $payload);
+
+ // test the new restricted algorithms header
+ $payload = $jwtUtil->decode($encoded, $client_key, array('RS256'));
+ $this->assertEquals($params, $payload);
+ }
+
+ public function testInvalidJwt()
+ {
+ $jwtUtil = new FirebaseJwt();
+
+ $this->assertFalse($jwtUtil->decode('goob'));
+ $this->assertFalse($jwtUtil->decode('go.o.b'));
+ }
+
+ /** @dataProvider provideClientCredentials */
+ public function testInvalidJwtHeader($client_id, $client_key)
+ {
+ $jwtUtil = new FirebaseJwt();
+
+ $params = array(
+ 'iss' => $client_id,
+ 'exp' => time() + 1000,
+ 'iat' => time(),
+ 'sub' => 'testuser@ourdomain.com',
+ 'aud' => 'http://myapp.com/oauth/auth',
+ 'scope' => null,
+ );
+
+ // testing for algorithm tampering when only RSA256 signing is allowed
+ // @see https://auth0.com/blog/2015/03/31/critical-vulnerabilities-in-json-web-token-libraries/
+ $tampered = $jwtUtil->encode($params, $client_key, 'HS256');
+
+ $payload = $jwtUtil->decode($tampered, $client_key, array('RS256'));
+
+ $this->assertFalse($payload);
+ }
+
+ public function provideClientCredentials()
+ {
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $client_id = 'Test Client ID';
+ $client_key = $storage->getClientKey($client_id, "testuser@ourdomain.com");
+
+ return array(
+ array($client_id, $client_key),
+ );
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/Encryption/JwtTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Encryption/JwtTest.php
new file mode 100644
index 000000000..214eebac8
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Encryption/JwtTest.php
@@ -0,0 +1,102 @@
+<?php
+
+namespace OAuth2\Encryption;
+
+use OAuth2\Storage\Bootstrap;
+
+class JwtTest extends \PHPUnit_Framework_TestCase
+{
+ private $privateKey;
+
+ public function setUp()
+ {
+ $this->privateKey = <<<EOD
+-----BEGIN RSA PRIVATE KEY-----
+MIICXAIBAAKBgQC5/SxVlE8gnpFqCxgl2wjhzY7ucEi00s0kUg3xp7lVEvgLgYcA
+nHiWp+gtSjOFfH2zsvpiWm6Lz5f743j/FEzHIO1owR0p4d9pOaJK07d01+RzoQLO
+IQAgXrr4T1CCWUesncwwPBVCyy2Mw3Nmhmr9MrF8UlvdRKBxriRnlP3qJQIDAQAB
+AoGAVgJJVU4fhYMu1e5JfYAcTGfF+Gf+h3iQm4JCpoUcxMXf5VpB9ztk3K7LRN5y
+kwFuFALpnUAarRcUPs0D8FoP4qBluKksbAtgHkO7bMSH9emN+mH4le4qpFlR7+P1
+3fLE2Y19IBwPwEfClC+TpJvuog6xqUYGPlg6XLq/MxQUB4ECQQDgovP1v+ONSeGS
+R+NgJTR47noTkQT3M2izlce/OG7a+O0yw6BOZjNXqH2wx3DshqMcPUFrTjibIClP
+l/tEQ3ShAkEA0/TdBYDtXpNNjqg0R9GVH2pw7Kh68ne6mZTuj0kCgFYpUF6L6iMm
+zXamIJ51rTDsTyKTAZ1JuAhAsK/M2BbDBQJAKQ5fXEkIA+i+64dsDUR/hKLBeRYG
+PFAPENONQGvGBwt7/s02XV3cgGbxIgAxqWkqIp0neb9AJUoJgtyaNe3GQQJANoL4
+QQ0af0NVJAZgg8QEHTNL3aGrFSbzx8IE5Lb7PLRsJa5bP5lQxnDoYuU+EI/Phr62
+niisp/b/ZDGidkTMXQJBALeRsH1I+LmICAvWXpLKa9Gv0zGCwkuIJLiUbV9c6CVh
+suocCAteQwL5iW2gA4AnYr5OGeHFsEl7NCQcwfPZpJ0=
+-----END RSA PRIVATE KEY-----
+EOD;
+ }
+
+ /** @dataProvider provideClientCredentials */
+ public function testJwtUtil($client_id, $client_key)
+ {
+ $jwtUtil = new Jwt();
+
+ $params = array(
+ 'iss' => $client_id,
+ 'exp' => time() + 1000,
+ 'iat' => time(),
+ 'sub' => 'testuser@ourdomain.com',
+ 'aud' => 'http://myapp.com/oauth/auth',
+ 'scope' => null,
+ );
+
+ $encoded = $jwtUtil->encode($params, $this->privateKey, 'RS256');
+
+ // test BC behaviour of trusting the algorithm in the header
+ $payload = $jwtUtil->decode($encoded, $client_key);
+ $this->assertEquals($params, $payload);
+
+ // test BC behaviour of not verifying by passing false
+ $payload = $jwtUtil->decode($encoded, $client_key, false);
+ $this->assertEquals($params, $payload);
+
+ // test the new restricted algorithms header
+ $payload = $jwtUtil->decode($encoded, $client_key, array('RS256'));
+ $this->assertEquals($params, $payload);
+ }
+
+ public function testInvalidJwt()
+ {
+ $jwtUtil = new Jwt();
+
+ $this->assertFalse($jwtUtil->decode('goob'));
+ $this->assertFalse($jwtUtil->decode('go.o.b'));
+ }
+
+ /** @dataProvider provideClientCredentials */
+ public function testInvalidJwtHeader($client_id, $client_key)
+ {
+ $jwtUtil = new Jwt();
+
+ $params = array(
+ 'iss' => $client_id,
+ 'exp' => time() + 1000,
+ 'iat' => time(),
+ 'sub' => 'testuser@ourdomain.com',
+ 'aud' => 'http://myapp.com/oauth/auth',
+ 'scope' => null,
+ );
+
+ // testing for algorithm tampering when only RSA256 signing is allowed
+ // @see https://auth0.com/blog/2015/03/31/critical-vulnerabilities-in-json-web-token-libraries/
+ $tampered = $jwtUtil->encode($params, $client_key, 'HS256');
+
+ $payload = $jwtUtil->decode($tampered, $client_key, array('RS256'));
+
+ $this->assertFalse($payload);
+ }
+
+ public function provideClientCredentials()
+ {
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $client_id = 'Test Client ID';
+ $client_key = $storage->getClientKey($client_id, "testuser@ourdomain.com");
+
+ return array(
+ array($client_id, $client_key),
+ );
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/GrantType/AuthorizationCodeTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/GrantType/AuthorizationCodeTest.php
new file mode 100644
index 000000000..356b8e53c
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/GrantType/AuthorizationCodeTest.php
@@ -0,0 +1,223 @@
+<?php
+
+namespace OAuth2\GrantType;
+
+use OAuth2\Storage\Bootstrap;
+use OAuth2\Server;
+use OAuth2\Request\TestRequest;
+use OAuth2\Response;
+
+class AuthorizationCodeTest extends \PHPUnit_Framework_TestCase
+{
+ public function testNoCode()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ ));
+ $server->handleTokenRequest($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_request');
+ $this->assertEquals($response->getParameter('error_description'), 'Missing parameter: "code" is required');
+ }
+
+ public function testInvalidCode()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'code' => 'InvalidCode', // invalid authorization code
+ ));
+ $server->handleTokenRequest($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_grant');
+ $this->assertEquals($response->getParameter('error_description'), 'Authorization code doesn\'t exist or is invalid for the client');
+ }
+
+ public function testCodeCannotBeUsedTwice()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'code' => 'testcode', // valid code
+ ));
+ $server->handleTokenRequest($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 200);
+ $this->assertNotNull($response->getParameter('access_token'));
+
+ // try to use the same code again
+ $server->handleTokenRequest($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_grant');
+ $this->assertEquals($response->getParameter('error_description'), 'Authorization code doesn\'t exist or is invalid for the client');
+ }
+
+ public function testExpiredCode()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'code' => 'testcode-expired', // expired authorization code
+ ));
+ $server->handleTokenRequest($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_grant');
+ $this->assertEquals($response->getParameter('error_description'), 'The authorization code has expired');
+ }
+
+ public function testValidCode()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'code' => 'testcode', // valid code
+ ));
+ $token = $server->grantAccessToken($request, new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+ }
+
+ public function testValidRedirectUri()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'redirect_uri' => 'http://brentertainment.com/voil%C3%A0', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'code' => 'testcode-redirect-uri', // valid code
+ ));
+ $token = $server->grantAccessToken($request, new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+ }
+
+ public function testValidCodeNoScope()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'code' => 'testcode-with-scope', // valid code
+ ));
+ $token = $server->grantAccessToken($request, new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+ $this->assertArrayHasKey('scope', $token);
+ $this->assertEquals($token['scope'], 'scope1 scope2');
+ }
+
+ public function testValidCodeSameScope()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'code' => 'testcode-with-scope', // valid code
+ 'scope' => 'scope2 scope1',
+ ));
+ $token = $server->grantAccessToken($request, new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+ $this->assertArrayHasKey('scope', $token);
+ $this->assertEquals($token['scope'], 'scope2 scope1');
+ }
+
+ public function testValidCodeLessScope()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'code' => 'testcode-with-scope', // valid code
+ 'scope' => 'scope1',
+ ));
+ $token = $server->grantAccessToken($request, new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+ $this->assertArrayHasKey('scope', $token);
+ $this->assertEquals($token['scope'], 'scope1');
+ }
+
+ public function testValidCodeDifferentScope()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'code' => 'testcode-with-scope', // valid code
+ 'scope' => 'scope3',
+ ));
+ $token = $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_scope');
+ $this->assertEquals($response->getParameter('error_description'), 'The scope requested is invalid for this request');
+ }
+
+ public function testValidCodeInvalidScope()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'code' => 'testcode-with-scope', // valid code
+ 'scope' => 'invalid-scope',
+ ));
+ $token = $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_scope');
+ $this->assertEquals($response->getParameter('error_description'), 'The scope requested is invalid for this request');
+ }
+
+ public function testValidClientDifferentCode()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'client_id' => 'Test Some Other Client', // valid client id
+ 'client_secret' => 'TestSecret3', // valid client secret
+ 'code' => 'testcode', // valid code
+ ));
+ $token = $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_grant');
+ $this->assertEquals($response->getParameter('error_description'), 'authorization_code doesn\'t exist or is invalid for the client');
+ }
+
+ private function getTestServer()
+ {
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $server = new Server($storage);
+ $server->addGrantType(new AuthorizationCode($storage));
+
+ return $server;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/GrantType/ClientCredentialsTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/GrantType/ClientCredentialsTest.php
new file mode 100644
index 000000000..f0d46ccb3
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/GrantType/ClientCredentialsTest.php
@@ -0,0 +1,159 @@
+<?php
+
+namespace OAuth2\GrantType;
+
+use OAuth2\Storage\Bootstrap;
+use OAuth2\Server;
+use OAuth2\Request\TestRequest;
+use OAuth2\Request;
+use OAuth2\Response;
+
+class ClientCredentialsTest extends \PHPUnit_Framework_TestCase
+{
+ public function testInvalidCredentials()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'client_credentials', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'FakeSecret', // valid client secret
+ ));
+ $server->handleTokenRequest($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_client');
+ $this->assertEquals($response->getParameter('error_description'), 'The client credentials are invalid');
+ }
+
+ public function testValidCredentials()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'client_credentials', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ ));
+ $token = $server->grantAccessToken($request, new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('scope', $token);
+ $this->assertNull($token['scope']);
+ }
+
+ public function testValidCredentialsWithScope()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'client_credentials', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'scope' => 'scope1',
+ ));
+ $token = $server->grantAccessToken($request, new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+ $this->assertArrayHasKey('scope', $token);
+ $this->assertEquals($token['scope'], 'scope1');
+ }
+
+ public function testValidCredentialsInvalidScope()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'client_credentials', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'scope' => 'invalid-scope',
+ ));
+ $token = $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_scope');
+ $this->assertEquals($response->getParameter('error_description'), 'An unsupported scope was requested');
+ }
+
+ public function testValidCredentialsInHeader()
+ {
+ // create with HTTP_AUTHORIZATION in header
+ $server = $this->getTestServer();
+ $headers = array('HTTP_AUTHORIZATION' => 'Basic '.base64_encode('Test Client ID:TestSecret'), 'REQUEST_METHOD' => 'POST');
+ $params = array('grant_type' => 'client_credentials');
+ $request = new Request(array(), $params, array(), array(), array(), $headers);
+ $token = $server->grantAccessToken($request, new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+ $this->assertNotNull($token['access_token']);
+
+ // create using PHP Authorization Globals
+ $headers = array('PHP_AUTH_USER' => 'Test Client ID', 'PHP_AUTH_PW' => 'TestSecret', 'REQUEST_METHOD' => 'POST');
+ $params = array('grant_type' => 'client_credentials');
+ $request = new Request(array(), $params, array(), array(), array(), $headers);
+ $token = $server->grantAccessToken($request, new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+ $this->assertNotNull($token['access_token']);
+ }
+
+ public function testValidCredentialsInRequest()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'client_credentials', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ ));
+ $token = $server->grantAccessToken($request, new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+ $this->assertNotNull($token['access_token']);
+ }
+
+ public function testValidCredentialsInQuerystring()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'client_credentials', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ ));
+ $token = $server->grantAccessToken($request, new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+ $this->assertNotNull($token['access_token']);
+ }
+
+ public function testClientUserIdIsSetInAccessToken()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'client_credentials', // valid grant type
+ 'client_id' => 'Client ID With User ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ ));
+ $token = $server->grantAccessToken($request, new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+
+ // verify the user_id was associated with the token
+ $storage = $server->getStorage('client');
+ $token = $storage->getAccessToken($token['access_token']);
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('user_id', $token);
+ $this->assertEquals($token['user_id'], 'brent@brentertainment.com');
+ }
+
+ private function getTestServer()
+ {
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $server = new Server($storage);
+ $server->addGrantType(new ClientCredentials($storage));
+
+ return $server;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/GrantType/ImplicitTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/GrantType/ImplicitTest.php
new file mode 100644
index 000000000..a47aae3e8
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/GrantType/ImplicitTest.php
@@ -0,0 +1,143 @@
+<?php
+
+namespace OAuth2\GrantType;
+
+use OAuth2\Storage\Bootstrap;
+use OAuth2\Server;
+use OAuth2\Request;
+use OAuth2\Response;
+
+class ImplicitTest extends \PHPUnit_Framework_TestCase
+{
+ public function testImplicitNotAllowedResponse()
+ {
+ $server = $this->getTestServer();
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID', // valid client id
+ 'redirect_uri' => 'http://adobe.com', // valid redirect URI
+ 'response_type' => 'token', // invalid response type
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), false);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $location = $response->getHttpHeader('Location');
+ $parts = parse_url($location);
+ parse_str($parts['query'], $query);
+
+ $this->assertEquals($query['error'], 'unsupported_response_type');
+ $this->assertEquals($query['error_description'], 'implicit grant type not supported');
+ }
+
+ public function testUserDeniesAccessResponse()
+ {
+ $server = $this->getTestServer(array('allow_implicit' => true));
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID', // valid client id
+ 'redirect_uri' => 'http://adobe.com', // valid redirect URI
+ 'response_type' => 'token', // valid response type
+ 'state' => 'xyz',
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), false);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $location = $response->getHttpHeader('Location');
+ $parts = parse_url($location);
+ parse_str($parts['query'], $query);
+
+ $this->assertEquals($query['error'], 'access_denied');
+ $this->assertEquals($query['error_description'], 'The user denied access to your application');
+ }
+
+ public function testSuccessfulRequestFragmentParameter()
+ {
+ $server = $this->getTestServer(array('allow_implicit' => true));
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID', // valid client id
+ 'redirect_uri' => 'http://adobe.com', // valid redirect URI
+ 'response_type' => 'token', // valid response type
+ 'state' => 'xyz',
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $this->assertNull($response->getParameter('error'));
+ $this->assertNull($response->getParameter('error_description'));
+
+ $location = $response->getHttpHeader('Location');
+ $parts = parse_url($location);
+
+ $this->assertEquals('http', $parts['scheme']); // same as passed in to redirect_uri
+ $this->assertEquals('adobe.com', $parts['host']); // same as passed in to redirect_uri
+ $this->assertArrayHasKey('fragment', $parts);
+ $this->assertFalse(isset($parts['query']));
+
+ // assert fragment is in "application/x-www-form-urlencoded" format
+ parse_str($parts['fragment'], $params);
+ $this->assertNotNull($params);
+ $this->assertArrayHasKey('access_token', $params);
+ $this->assertArrayHasKey('expires_in', $params);
+ $this->assertArrayHasKey('token_type', $params);
+ }
+
+ public function testSuccessfulRequestReturnsStateParameter()
+ {
+ $server = $this->getTestServer(array('allow_implicit' => true));
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID', // valid client id
+ 'redirect_uri' => 'http://adobe.com', // valid redirect URI
+ 'response_type' => 'token', // valid response type
+ 'state' => 'test', // valid state string (just needs to be passed back to us)
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $this->assertNull($response->getParameter('error'));
+ $this->assertNull($response->getParameter('error_description'));
+
+ $location = $response->getHttpHeader('Location');
+ $parts = parse_url($location);
+ $this->assertArrayHasKey('fragment', $parts);
+ parse_str($parts['fragment'], $params);
+
+ $this->assertArrayHasKey('state', $params);
+ $this->assertEquals($params['state'], 'test');
+ }
+
+ public function testSuccessfulRequestStripsExtraParameters()
+ {
+ $server = $this->getTestServer(array('allow_implicit' => true));
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID', // valid client id
+ 'redirect_uri' => 'http://adobe.com?fake=something', // valid redirect URI
+ 'response_type' => 'token', // valid response type
+ 'state' => 'test', // valid state string (just needs to be passed back to us)
+ 'fake' => 'something', // add extra param to querystring
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $this->assertNull($response->getParameter('error'));
+ $this->assertNull($response->getParameter('error_description'));
+
+ $location = $response->getHttpHeader('Location');
+ $parts = parse_url($location);
+ $this->assertFalse(isset($parts['fake']));
+ $this->assertArrayHasKey('fragment', $parts);
+ parse_str($parts['fragment'], $params);
+
+ $this->assertFalse(isset($params['fake']));
+ $this->assertArrayHasKey('state', $params);
+ $this->assertEquals($params['state'], 'test');
+ }
+
+ private function getTestServer($config = array())
+ {
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $server = new Server($storage, $config);
+
+ // Add the two types supported for authorization grant
+ $server->addGrantType(new AuthorizationCode($storage));
+
+ return $server;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/GrantType/JwtBearerTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/GrantType/JwtBearerTest.php
new file mode 100644
index 000000000..0a6c4b827
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/GrantType/JwtBearerTest.php
@@ -0,0 +1,360 @@
+<?php
+
+namespace OAuth2\GrantType;
+
+use OAuth2\Storage\Bootstrap;
+use OAuth2\Server;
+use OAuth2\Request\TestRequest;
+use OAuth2\Response;
+use OAuth2\Encryption\Jwt;
+
+class JwtBearerTest extends \PHPUnit_Framework_TestCase
+{
+ private $privateKey;
+
+ public function setUp()
+ {
+ $this->privateKey = <<<EOD
+-----BEGIN RSA PRIVATE KEY-----
+MIICXAIBAAKBgQC5/SxVlE8gnpFqCxgl2wjhzY7ucEi00s0kUg3xp7lVEvgLgYcA
+nHiWp+gtSjOFfH2zsvpiWm6Lz5f743j/FEzHIO1owR0p4d9pOaJK07d01+RzoQLO
+IQAgXrr4T1CCWUesncwwPBVCyy2Mw3Nmhmr9MrF8UlvdRKBxriRnlP3qJQIDAQAB
+AoGAVgJJVU4fhYMu1e5JfYAcTGfF+Gf+h3iQm4JCpoUcxMXf5VpB9ztk3K7LRN5y
+kwFuFALpnUAarRcUPs0D8FoP4qBluKksbAtgHkO7bMSH9emN+mH4le4qpFlR7+P1
+3fLE2Y19IBwPwEfClC+TpJvuog6xqUYGPlg6XLq/MxQUB4ECQQDgovP1v+ONSeGS
+R+NgJTR47noTkQT3M2izlce/OG7a+O0yw6BOZjNXqH2wx3DshqMcPUFrTjibIClP
+l/tEQ3ShAkEA0/TdBYDtXpNNjqg0R9GVH2pw7Kh68ne6mZTuj0kCgFYpUF6L6iMm
+zXamIJ51rTDsTyKTAZ1JuAhAsK/M2BbDBQJAKQ5fXEkIA+i+64dsDUR/hKLBeRYG
+PFAPENONQGvGBwt7/s02XV3cgGbxIgAxqWkqIp0neb9AJUoJgtyaNe3GQQJANoL4
+QQ0af0NVJAZgg8QEHTNL3aGrFSbzx8IE5Lb7PLRsJa5bP5lQxnDoYuU+EI/Phr62
+niisp/b/ZDGidkTMXQJBALeRsH1I+LmICAvWXpLKa9Gv0zGCwkuIJLiUbV9c6CVh
+suocCAteQwL5iW2gA4AnYr5OGeHFsEl7NCQcwfPZpJ0=
+-----END RSA PRIVATE KEY-----
+EOD;
+ }
+
+ public function testMalformedJWT()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
+ ));
+
+ //Get the jwt and break it
+ $jwt = $this->getJWT();
+ $jwt = substr_replace($jwt, 'broken', 3, 6);
+
+ $request->request['assertion'] = $jwt;
+
+ $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_request');
+ $this->assertEquals($response->getParameter('error_description'), 'JWT is malformed');
+ }
+
+ public function testBrokenSignature()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
+ ));
+
+ //Get the jwt and break signature
+ $jwt = $this->getJWT() . 'notSupposeToBeHere';
+ $request->request['assertion'] = $jwt;
+
+ $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_grant');
+ $this->assertEquals($response->getParameter('error_description'), 'JWT failed signature verification');
+ }
+
+ public function testExpiredJWT()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
+ ));
+
+ //Get an expired JWT
+ $jwt = $this->getJWT(1234);
+ $request->request['assertion'] = $jwt;
+
+ $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_grant');
+ $this->assertEquals($response->getParameter('error_description'), 'JWT has expired');
+ }
+
+ public function testBadExp()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
+ ));
+
+ //Get an expired JWT
+ $jwt = $this->getJWT('badtimestamp');
+ $request->request['assertion'] = $jwt;
+
+ $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_grant');
+ $this->assertEquals($response->getParameter('error_description'), 'Expiration (exp) time must be a unix time stamp');
+ }
+
+ public function testNoAssert()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
+ ));
+
+ //Do not pass the assert (JWT)
+
+ $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_request');
+ $this->assertEquals($response->getParameter('error_description'), 'Missing parameters: "assertion" required');
+ }
+
+ public function testNotBefore()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
+ ));
+
+ //Get a future NBF
+ $jwt = $this->getJWT(null, time() + 10000);
+ $request->request['assertion'] = $jwt;
+
+ $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_grant');
+ $this->assertEquals($response->getParameter('error_description'), 'JWT cannot be used before the Not Before (nbf) time');
+ }
+
+ public function testBadNotBefore()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
+ ));
+
+ //Get a non timestamp nbf
+ $jwt = $this->getJWT(null, 'notatimestamp');
+ $request->request['assertion'] = $jwt;
+
+ $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_grant');
+ $this->assertEquals($response->getParameter('error_description'), 'Not Before (nbf) time must be a unix time stamp');
+ }
+
+ public function testNonMatchingAudience()
+ {
+ $server = $this->getTestServer('http://google.com/oauth/o/auth');
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
+ 'assertion' => $this->getJWT(),
+ ));
+
+ $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_grant');
+ $this->assertEquals($response->getParameter('error_description'), 'Invalid audience (aud)');
+ }
+
+ public function testBadClientID()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
+ 'assertion' => $this->getJWT(null, null, null, 'bad_client_id'),
+ ));
+
+ $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_grant');
+ $this->assertEquals($response->getParameter('error_description'), 'Invalid issuer (iss) or subject (sub) provided');
+ }
+
+ public function testBadSubject()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
+ 'assertion' => $this->getJWT(null, null, 'anotheruser@ourdomain,com'),
+ ));
+
+ $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_grant');
+ $this->assertEquals($response->getParameter('error_description'), 'Invalid issuer (iss) or subject (sub) provided');
+ }
+
+ public function testMissingKey()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
+ 'assertion' => $this->getJWT(null, null, null, 'Missing Key Cli,nt'),
+ ));
+
+ $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_grant');
+ $this->assertEquals($response->getParameter('error_description'), 'Invalid issuer (iss) or subject (sub) provided');
+ }
+
+ public function testValidJwt()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
+ 'assertion' => $this->getJWT(), // valid assertion
+ ));
+
+ $token = $server->grantAccessToken($request, new Response());
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+ }
+
+ public function testValidJwtWithScope()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
+ 'assertion' => $this->getJWT(null, null, null, 'Test Client ID'), // valid assertion
+ 'scope' => 'scope1', // valid scope
+ ));
+ $token = $server->grantAccessToken($request, new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+ $this->assertArrayHasKey('scope', $token);
+ $this->assertEquals($token['scope'], 'scope1');
+ }
+
+ public function testValidJwtInvalidScope()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
+ 'assertion' => $this->getJWT(null, null, null, 'Test Client ID'), // valid assertion
+ 'scope' => 'invalid-scope', // invalid scope
+ ));
+ $token = $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_scope');
+ $this->assertEquals($response->getParameter('error_description'), 'An unsupported scope was requested');
+ }
+
+ public function testValidJti()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
+ 'assertion' => $this->getJWT(null, null, 'testuser@ourdomain.com', 'Test Client ID', 'unused_jti'), // valid assertion with invalid scope
+ ));
+ $token = $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+ }
+
+ public function testInvalidJti()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
+ 'assertion' => $this->getJWT(99999999900, null, 'testuser@ourdomain.com', 'Test Client ID', 'used_jti'), // valid assertion with invalid scope
+ ));
+ $token = $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_grant');
+ $this->assertEquals($response->getParameter('error_description'), 'JSON Token Identifier (jti) has already been used');
+ }
+
+ public function testJtiReplayAttack()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
+ 'assertion' => $this->getJWT(99999999900, null, 'testuser@ourdomain.com', 'Test Client ID', 'totally_new_jti'), // valid assertion with invalid scope
+ ));
+ $token = $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+
+ //Replay the same request
+ $token = $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_grant');
+ $this->assertEquals($response->getParameter('error_description'), 'JSON Token Identifier (jti) has already been used');
+ }
+
+ /**
+ * Generates a JWT
+ * @param $exp The expiration date. If the current time is greater than the exp, the JWT is invalid.
+ * @param $nbf The "not before" time. If the current time is less than the nbf, the JWT is invalid.
+ * @param $sub The subject we are acting on behalf of. This could be the email address of the user in the system.
+ * @param $iss The issuer, usually the client_id.
+ * @return string
+ */
+ private function getJWT($exp = null, $nbf = null, $sub = null, $iss = 'Test Client ID', $jti = null)
+ {
+ if (!$exp) {
+ $exp = time() + 1000;
+ }
+
+ if (!$sub) {
+ $sub = "testuser@ourdomain.com";
+ }
+
+ $params = array(
+ 'iss' => $iss,
+ 'exp' => $exp,
+ 'iat' => time(),
+ 'sub' => $sub,
+ 'aud' => 'http://myapp.com/oauth/auth',
+ );
+
+ if ($nbf) {
+ $params['nbf'] = $nbf;
+ }
+
+ if ($jti) {
+ $params['jti'] = $jti;
+ }
+
+ $jwtUtil = new Jwt();
+
+ return $jwtUtil->encode($params, $this->privateKey, 'RS256');
+ }
+
+ private function getTestServer($audience = 'http://myapp.com/oauth/auth')
+ {
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $server = new Server($storage);
+ $server->addGrantType(new JwtBearer($storage, $audience, new Jwt()));
+
+ return $server;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/GrantType/RefreshTokenTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/GrantType/RefreshTokenTest.php
new file mode 100644
index 000000000..a458aad8a
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/GrantType/RefreshTokenTest.php
@@ -0,0 +1,204 @@
+<?php
+
+namespace OAuth2\GrantType;
+
+use OAuth2\Storage\Bootstrap;
+use OAuth2\Server;
+use OAuth2\Request\TestRequest;
+use OAuth2\Response;
+
+class RefreshTokenTest extends \PHPUnit_Framework_TestCase
+{
+ private $storage;
+
+ public function testNoRefreshToken()
+ {
+ $server = $this->getTestServer();
+ $server->addGrantType(new RefreshToken($this->storage));
+
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'refresh_token', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ ));
+ $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_request');
+ $this->assertEquals($response->getParameter('error_description'), 'Missing parameter: "refresh_token" is required');
+ }
+
+ public function testInvalidRefreshToken()
+ {
+ $server = $this->getTestServer();
+ $server->addGrantType(new RefreshToken($this->storage));
+
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'refresh_token', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'refresh_token' => 'fake-token', // invalid refresh token
+ ));
+ $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_grant');
+ $this->assertEquals($response->getParameter('error_description'), 'Invalid refresh token');
+ }
+
+ public function testValidRefreshTokenWithNewRefreshTokenInResponse()
+ {
+ $server = $this->getTestServer();
+ $server->addGrantType(new RefreshToken($this->storage, array('always_issue_new_refresh_token' => true)));
+
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'refresh_token', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'refresh_token' => 'test-refreshtoken', // valid refresh token
+ ));
+ $token = $server->grantAccessToken($request, new Response());
+ $this->assertTrue(isset($token['refresh_token']), 'refresh token should always refresh');
+
+ $refresh_token = $this->storage->getRefreshToken($token['refresh_token']);
+ $this->assertNotNull($refresh_token);
+ $this->assertEquals($refresh_token['refresh_token'], $token['refresh_token']);
+ $this->assertEquals($refresh_token['client_id'], $request->request('client_id'));
+ $this->assertTrue($token['refresh_token'] != 'test-refreshtoken', 'the refresh token returned is not the one used');
+ $used_token = $this->storage->getRefreshToken('test-refreshtoken');
+ $this->assertFalse($used_token, 'the refresh token used is no longer valid');
+ }
+
+ public function testValidRefreshTokenDoesNotUnsetToken()
+ {
+ $server = $this->getTestServer();
+ $server->addGrantType(new RefreshToken($this->storage, array(
+ 'always_issue_new_refresh_token' => true,
+ 'unset_refresh_token_after_use' => false,
+ )));
+
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'refresh_token', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'refresh_token' => 'test-refreshtoken', // valid refresh token
+ ));
+ $token = $server->grantAccessToken($request, new Response());
+ $this->assertTrue(isset($token['refresh_token']), 'refresh token should always refresh');
+
+ $used_token = $this->storage->getRefreshToken('test-refreshtoken');
+ $this->assertNotNull($used_token, 'the refresh token used is still valid');
+ }
+
+ public function testValidRefreshTokenWithNoRefreshTokenInResponse()
+ {
+ $server = $this->getTestServer();
+ $server->addGrantType(new RefreshToken($this->storage, array('always_issue_new_refresh_token' => false)));
+
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'refresh_token', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'refresh_token' => 'test-refreshtoken', // valid refresh token
+ ));
+ $token = $server->grantAccessToken($request, new Response());
+ $this->assertFalse(isset($token['refresh_token']), 'refresh token should not be returned');
+
+ $used_token = $this->storage->getRefreshToken('test-refreshtoken');
+ $this->assertNotNull($used_token, 'the refresh token used is still valid');
+ }
+
+ public function testValidRefreshTokenSameScope()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'refresh_token', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'refresh_token' => 'test-refreshtoken-with-scope', // valid refresh token (with scope)
+ 'scope' => 'scope2 scope1',
+ ));
+ $token = $server->grantAccessToken($request, new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+ $this->assertArrayHasKey('scope', $token);
+ $this->assertEquals($token['scope'], 'scope2 scope1');
+ }
+
+ public function testValidRefreshTokenLessScope()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'refresh_token', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'refresh_token' => 'test-refreshtoken-with-scope', // valid refresh token (with scope)
+ 'scope' => 'scope1',
+ ));
+ $token = $server->grantAccessToken($request, new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+ $this->assertArrayHasKey('scope', $token);
+ $this->assertEquals($token['scope'], 'scope1');
+ }
+
+ public function testValidRefreshTokenDifferentScope()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'refresh_token', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'refresh_token' => 'test-refreshtoken-with-scope', // valid refresh token (with scope)
+ 'scope' => 'scope3',
+ ));
+ $token = $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_scope');
+ $this->assertEquals($response->getParameter('error_description'), 'The scope requested is invalid for this request');
+ }
+
+ public function testValidRefreshTokenInvalidScope()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'refresh_token', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'refresh_token' => 'test-refreshtoken-with-scope', // valid refresh token (with scope)
+ 'scope' => 'invalid-scope',
+ ));
+ $token = $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_scope');
+ $this->assertEquals($response->getParameter('error_description'), 'The scope requested is invalid for this request');
+ }
+
+ public function testValidClientDifferentRefreshToken()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'refresh_token', // valid grant type
+ 'client_id' => 'Test Some Other Client', // valid client id
+ 'client_secret' => 'TestSecret3', // valid client secret
+ 'refresh_token' => 'test-refreshtoken', // valid refresh token
+ ));
+ $token = $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_grant');
+ $this->assertEquals($response->getParameter('error_description'), 'refresh_token doesn\'t exist or is invalid for the client');
+ }
+
+ private function getTestServer()
+ {
+ $this->storage = Bootstrap::getInstance()->getMemoryStorage();
+ $server = new Server($this->storage);
+
+ return $server;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/GrantType/UserCredentialsTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/GrantType/UserCredentialsTest.php
new file mode 100644
index 000000000..18943d055
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/GrantType/UserCredentialsTest.php
@@ -0,0 +1,172 @@
+<?php
+
+namespace OAuth2\GrantType;
+
+use OAuth2\Storage\Bootstrap;
+use OAuth2\Server;
+use OAuth2\Request\TestRequest;
+use OAuth2\Response;
+
+class UserCredentialsTest extends \PHPUnit_Framework_TestCase
+{
+ public function testNoUsername()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'password', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'password' => 'testpass', // valid password
+ ));
+ $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_request');
+ $this->assertEquals($response->getParameter('error_description'), 'Missing parameters: "username" and "password" required');
+ }
+
+ public function testNoPassword()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'password', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'username' => 'test-username', // valid username
+ ));
+ $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_request');
+ $this->assertEquals($response->getParameter('error_description'), 'Missing parameters: "username" and "password" required');
+ }
+
+ public function testInvalidUsername()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'password', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'username' => 'fake-username', // valid username
+ 'password' => 'testpass', // valid password
+ ));
+ $token = $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 401);
+ $this->assertEquals($response->getParameter('error'), 'invalid_grant');
+ $this->assertEquals($response->getParameter('error_description'), 'Invalid username and password combination');
+ }
+
+ public function testInvalidPassword()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'password', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'username' => 'test-username', // valid username
+ 'password' => 'fakepass', // invalid password
+ ));
+ $token = $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 401);
+ $this->assertEquals($response->getParameter('error'), 'invalid_grant');
+ $this->assertEquals($response->getParameter('error_description'), 'Invalid username and password combination');
+ }
+
+ public function testValidCredentials()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'password', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'username' => 'test-username', // valid username
+ 'password' => 'testpass', // valid password
+ ));
+ $token = $server->grantAccessToken($request, new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+ }
+
+ public function testValidCredentialsWithScope()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'password', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'username' => 'test-username', // valid username
+ 'password' => 'testpass', // valid password
+ 'scope' => 'scope1', // valid scope
+ ));
+ $token = $server->grantAccessToken($request, new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+ $this->assertArrayHasKey('scope', $token);
+ $this->assertEquals($token['scope'], 'scope1');
+ }
+
+ public function testValidCredentialsInvalidScope()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'password', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'username' => 'test-username', // valid username
+ 'password' => 'testpass', // valid password
+ 'scope' => 'invalid-scope',
+ ));
+ $token = $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_scope');
+ $this->assertEquals($response->getParameter('error_description'), 'An unsupported scope was requested');
+ }
+
+ public function testNoSecretWithPublicClient()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'password', // valid grant type
+ 'client_id' => 'Test Client ID Empty Secret', // valid public client
+ 'username' => 'test-username', // valid username
+ 'password' => 'testpass', // valid password
+ ));
+
+ $token = $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+ }
+
+ public function testNoSecretWithConfidentialClient()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'password', // valid grant type
+ 'client_id' => 'Test Client ID', // valid public client
+ 'username' => 'test-username', // valid username
+ 'password' => 'testpass', // valid password
+ ));
+
+ $token = $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_client');
+ $this->assertEquals($response->getParameter('error_description'), 'This client is invalid or must authenticate using a client secret');
+ }
+
+ private function getTestServer()
+ {
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $server = new Server($storage);
+ $server->addGrantType(new UserCredentials($storage));
+
+ return $server;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/Controller/AuthorizeControllerTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/Controller/AuthorizeControllerTest.php
new file mode 100644
index 000000000..46de936d8
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/Controller/AuthorizeControllerTest.php
@@ -0,0 +1,182 @@
+<?php
+
+namespace OAuth2\OpenID\Controller;
+
+use OAuth2\Storage\Bootstrap;
+use OAuth2\Server;
+use OAuth2\Request;
+use OAuth2\Response;
+
+class AuthorizeControllerTest extends \PHPUnit_Framework_TestCase
+{
+ public function testValidateAuthorizeRequest()
+ {
+ $server = $this->getTestServer();
+
+ $response = new Response();
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID', // valid client id
+ 'redirect_uri' => 'http://adobe.com', // valid redirect URI
+ 'response_type' => 'id_token',
+ 'state' => 'af0ifjsldkj',
+ 'nonce' => 'n-0S6_WzA2Mj',
+ ));
+
+ // Test valid id_token request
+ $server->handleAuthorizeRequest($request, $response, true);
+
+ $parts = parse_url($response->getHttpHeader('Location'));
+ parse_str($parts['fragment'], $query);
+
+ $this->assertEquals('n-0S6_WzA2Mj', $server->getAuthorizeController()->getNonce());
+ $this->assertEquals($query['state'], 'af0ifjsldkj');
+
+ $this->assertArrayHasKey('id_token', $query);
+ $this->assertArrayHasKey('state', $query);
+ $this->assertArrayNotHasKey('access_token', $query);
+ $this->assertArrayNotHasKey('expires_in', $query);
+ $this->assertArrayNotHasKey('token_type', $query);
+
+ // Test valid token id_token request
+ $request->query['response_type'] = 'id_token token';
+ $server->handleAuthorizeRequest($request, $response, true);
+
+ $parts = parse_url($response->getHttpHeader('Location'));
+ parse_str($parts['fragment'], $query);
+
+ $this->assertEquals('n-0S6_WzA2Mj', $server->getAuthorizeController()->getNonce());
+ $this->assertEquals($query['state'], 'af0ifjsldkj');
+
+ $this->assertArrayHasKey('access_token', $query);
+ $this->assertArrayHasKey('expires_in', $query);
+ $this->assertArrayHasKey('token_type', $query);
+ $this->assertArrayHasKey('state', $query);
+ $this->assertArrayHasKey('id_token', $query);
+
+ // assert that with multiple-valued response types, order does not matter
+ $request->query['response_type'] = 'token id_token';
+ $server->handleAuthorizeRequest($request, $response, true);
+
+ $parts = parse_url($response->getHttpHeader('Location'));
+ parse_str($parts['fragment'], $query);
+
+ $this->assertEquals('n-0S6_WzA2Mj', $server->getAuthorizeController()->getNonce());
+ $this->assertEquals($query['state'], 'af0ifjsldkj');
+
+ $this->assertArrayHasKey('access_token', $query);
+ $this->assertArrayHasKey('expires_in', $query);
+ $this->assertArrayHasKey('token_type', $query);
+ $this->assertArrayHasKey('state', $query);
+ $this->assertArrayHasKey('id_token', $query);
+
+ // assert that with multiple-valued response types with extra spaces do not matter
+ $request->query['response_type'] = ' token id_token ';
+ $server->handleAuthorizeRequest($request, $response, true);
+
+ $parts = parse_url($response->getHttpHeader('Location'));
+ parse_str($parts['fragment'], $query);
+
+ $this->assertEquals('n-0S6_WzA2Mj', $server->getAuthorizeController()->getNonce());
+ $this->assertEquals($query['state'], 'af0ifjsldkj');
+
+ $this->assertArrayHasKey('access_token', $query);
+ $this->assertArrayHasKey('expires_in', $query);
+ $this->assertArrayHasKey('token_type', $query);
+ $this->assertArrayHasKey('state', $query);
+ $this->assertArrayHasKey('id_token', $query);
+ }
+
+ public function testMissingNonce()
+ {
+ $server = $this->getTestServer();
+ $authorize = $server->getAuthorizeController();
+
+ $response = new Response();
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID', // valid client id
+ 'redirect_uri' => 'http://adobe.com', // valid redirect URI
+ 'response_type' => 'id_token',
+ 'state' => 'xyz',
+ ));
+
+ // Test missing nonce for 'id_token' response type
+ $server->handleAuthorizeRequest($request, $response, true);
+ $params = $response->getParameters();
+
+ $this->assertEquals($params['error'], 'invalid_nonce');
+ $this->assertEquals($params['error_description'], 'This application requires you specify a nonce parameter');
+
+ // Test missing nonce for 'id_token token' response type
+ $request->query['response_type'] = 'id_token token';
+ $server->handleAuthorizeRequest($request, $response, true);
+ $params = $response->getParameters();
+
+ $this->assertEquals($params['error'], 'invalid_nonce');
+ $this->assertEquals($params['error_description'], 'This application requires you specify a nonce parameter');
+ }
+
+ public function testNotGrantedApplication()
+ {
+ $server = $this->getTestServer();
+
+ $response = new Response();
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID', // valid client id
+ 'redirect_uri' => 'http://adobe.com', // valid redirect URI
+ 'response_type' => 'id_token',
+ 'state' => 'af0ifjsldkj',
+ 'nonce' => 'n-0S6_WzA2Mj',
+ ));
+
+ // Test not approved application
+ $server->handleAuthorizeRequest($request, $response, false);
+
+ $params = $response->getParameters();
+
+ $this->assertEquals($params['error'], 'consent_required');
+ $this->assertEquals($params['error_description'], 'The user denied access to your application');
+
+ // Test not approved application with prompt parameter
+ $request->query['prompt'] = 'none';
+ $server->handleAuthorizeRequest($request, $response, false);
+
+ $params = $response->getParameters();
+
+ $this->assertEquals($params['error'], 'login_required');
+ $this->assertEquals($params['error_description'], 'The user must log in');
+
+ // Test not approved application with user_id set
+ $request->query['prompt'] = 'none';
+ $server->handleAuthorizeRequest($request, $response, false, 'some-user-id');
+
+ $params = $response->getParameters();
+
+ $this->assertEquals($params['error'], 'interaction_required');
+ $this->assertEquals($params['error_description'], 'The user must grant access to your application');
+ }
+
+ public function testNeedsIdToken()
+ {
+ $server = $this->getTestServer();
+ $authorize = $server->getAuthorizeController();
+
+ $this->assertTrue($authorize->needsIdToken('openid'));
+ $this->assertTrue($authorize->needsIdToken('openid profile'));
+ $this->assertFalse($authorize->needsIdToken(''));
+ $this->assertFalse($authorize->needsIdToken('some-scope'));
+ }
+
+ private function getTestServer($config = array())
+ {
+ $config += array(
+ 'use_openid_connect' => true,
+ 'issuer' => 'phpunit',
+ 'allow_implicit' => true
+ );
+
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $server = new Server($storage, $config);
+
+ return $server;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/Controller/UserInfoControllerTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/Controller/UserInfoControllerTest.php
new file mode 100644
index 000000000..b1b687077
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/Controller/UserInfoControllerTest.php
@@ -0,0 +1,44 @@
+<?php
+
+namespace OAuth2\OpenID\Controller;
+
+use OAuth2\Storage\Bootstrap;
+use OAuth2\Server;
+use OAuth2\Request;
+use OAuth2\Response;
+
+class UserInfoControllerTest extends \PHPUnit_Framework_TestCase
+{
+ public function testCreateController()
+ {
+ $tokenType = new \OAuth2\TokenType\Bearer();
+ $storage = new \OAuth2\Storage\Memory();
+ $controller = new UserInfoController($tokenType, $storage, $storage);
+
+ $response = new Response();
+ $controller->handleUserInfoRequest(new Request(), $response);
+ $this->assertEquals(401, $response->getStatusCode());
+ }
+
+ public function testValidToken()
+ {
+ $server = $this->getTestServer();
+ $request = Request::createFromGlobals();
+ $request->headers['AUTHORIZATION'] = 'Bearer accesstoken-openid-connect';
+ $response = new Response();
+
+ $server->handleUserInfoRequest($request, $response);
+ $parameters = $response->getParameters();
+ $this->assertEquals($parameters['sub'], 'testuser');
+ $this->assertEquals($parameters['email'], 'testuser@test.com');
+ $this->assertEquals($parameters['email_verified'], true);
+ }
+
+ private function getTestServer($config = array())
+ {
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $server = new Server($storage, $config);
+
+ return $server;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/GrantType/AuthorizationCodeTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/GrantType/AuthorizationCodeTest.php
new file mode 100644
index 000000000..776002d1e
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/GrantType/AuthorizationCodeTest.php
@@ -0,0 +1,57 @@
+<?php
+
+namespace OAuth2\OpenID\GrantType;
+
+use OAuth2\Storage\Bootstrap;
+use OAuth2\Server;
+use OAuth2\Request\TestRequest;
+use OAuth2\Response;
+
+class AuthorizationCodeTest extends \PHPUnit_Framework_TestCase
+{
+ public function testValidCode()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'code' => 'testcode-openid', // valid code
+ ));
+ $token = $server->grantAccessToken($request, new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('id_token', $token);
+ $this->assertEquals('test_id_token', $token['id_token']);
+
+ // this is only true if "offline_access" was requested
+ $this->assertFalse(isset($token['refresh_token']));
+ }
+
+ public function testOfflineAccess()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'code' => 'testcode-openid', // valid code
+ 'scope' => 'offline_access', // valid code
+ ));
+ $token = $server->grantAccessToken($request, new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('id_token', $token);
+ $this->assertEquals('test_id_token', $token['id_token']);
+ $this->assertTrue(isset($token['refresh_token']));
+ }
+
+ private function getTestServer()
+ {
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $server = new Server($storage, array('use_openid_connect' => true));
+ $server->addGrantType(new AuthorizationCode($storage));
+
+ return $server;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/ResponseType/CodeIdTokenTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/ResponseType/CodeIdTokenTest.php
new file mode 100644
index 000000000..b0311434a
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/ResponseType/CodeIdTokenTest.php
@@ -0,0 +1,182 @@
+<?php
+
+namespace OAuth2\OpenID\ResponseType;
+
+use OAuth2\Server;
+use OAuth2\Request;
+use OAuth2\Response;
+use OAuth2\Storage\Bootstrap;
+use OAuth2\GrantType\ClientCredentials;
+
+class CodeIdTokenTest extends \PHPUnit_Framework_TestCase
+{
+ public function testHandleAuthorizeRequest()
+ {
+ // add the test parameters in memory
+ $server = $this->getTestServer();
+
+ $request = new Request(array(
+ 'response_type' => 'code id_token',
+ 'redirect_uri' => 'http://adobe.com',
+ 'client_id' => 'Test Client ID',
+ 'scope' => 'openid',
+ 'state' => 'test',
+ 'nonce' => 'test',
+ ));
+
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $location = $response->getHttpHeader('Location');
+ $this->assertNotContains('error', $location);
+
+ $parts = parse_url($location);
+ $this->assertArrayHasKey('query', $parts);
+
+ // assert fragment is in "application/x-www-form-urlencoded" format
+ parse_str($parts['query'], $params);
+ $this->assertNotNull($params);
+ $this->assertArrayHasKey('id_token', $params);
+ $this->assertArrayHasKey('code', $params);
+
+ // validate ID Token
+ $parts = explode('.', $params['id_token']);
+ foreach ($parts as &$part) {
+ // Each part is a base64url encoded json string.
+ $part = str_replace(array('-', '_'), array('+', '/'), $part);
+ $part = base64_decode($part);
+ $part = json_decode($part, true);
+ }
+ list($header, $claims, $signature) = $parts;
+
+ $this->assertArrayHasKey('iss', $claims);
+ $this->assertArrayHasKey('sub', $claims);
+ $this->assertArrayHasKey('aud', $claims);
+ $this->assertArrayHasKey('iat', $claims);
+ $this->assertArrayHasKey('exp', $claims);
+ $this->assertArrayHasKey('auth_time', $claims);
+ $this->assertArrayHasKey('nonce', $claims);
+
+ // only exists if an access token was granted along with the id_token
+ $this->assertArrayNotHasKey('at_hash', $claims);
+
+ $this->assertEquals($claims['iss'], 'test');
+ $this->assertEquals($claims['aud'], 'Test Client ID');
+ $this->assertEquals($claims['nonce'], 'test');
+ $duration = $claims['exp'] - $claims['iat'];
+ $this->assertEquals($duration, 3600);
+ }
+
+ public function testUserClaimsWithUserId()
+ {
+ // add the test parameters in memory
+ $server = $this->getTestServer();
+
+ $request = new Request(array(
+ 'response_type' => 'code id_token',
+ 'redirect_uri' => 'http://adobe.com',
+ 'client_id' => 'Test Client ID',
+ 'scope' => 'openid email',
+ 'state' => 'test',
+ 'nonce' => 'test',
+ ));
+
+ $userId = 'testuser';
+ $server->handleAuthorizeRequest($request, $response = new Response(), true, $userId);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $location = $response->getHttpHeader('Location');
+ $this->assertNotContains('error', $location);
+
+ $parts = parse_url($location);
+ $this->assertArrayHasKey('query', $parts);
+
+ // assert fragment is in "application/x-www-form-urlencoded" format
+ parse_str($parts['query'], $params);
+ $this->assertNotNull($params);
+ $this->assertArrayHasKey('id_token', $params);
+ $this->assertArrayHasKey('code', $params);
+
+ // validate ID Token
+ $parts = explode('.', $params['id_token']);
+ foreach ($parts as &$part) {
+ // Each part is a base64url encoded json string.
+ $part = str_replace(array('-', '_'), array('+', '/'), $part);
+ $part = base64_decode($part);
+ $part = json_decode($part, true);
+ }
+ list($header, $claims, $signature) = $parts;
+
+ $this->assertArrayHasKey('email', $claims);
+ $this->assertArrayHasKey('email_verified', $claims);
+ $this->assertNotNull($claims['email']);
+ $this->assertNotNull($claims['email_verified']);
+ }
+
+ public function testUserClaimsWithoutUserId()
+ {
+ // add the test parameters in memory
+ $server = $this->getTestServer();
+
+ $request = new Request(array(
+ 'response_type' => 'code id_token',
+ 'redirect_uri' => 'http://adobe.com',
+ 'client_id' => 'Test Client ID',
+ 'scope' => 'openid email',
+ 'state' => 'test',
+ 'nonce' => 'test',
+ ));
+
+ $userId = null;
+ $server->handleAuthorizeRequest($request, $response = new Response(), true, $userId);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $location = $response->getHttpHeader('Location');
+ $this->assertNotContains('error', $location);
+
+ $parts = parse_url($location);
+ $this->assertArrayHasKey('query', $parts);
+
+ // assert fragment is in "application/x-www-form-urlencoded" format
+ parse_str($parts['query'], $params);
+ $this->assertNotNull($params);
+ $this->assertArrayHasKey('id_token', $params);
+ $this->assertArrayHasKey('code', $params);
+
+ // validate ID Token
+ $parts = explode('.', $params['id_token']);
+ foreach ($parts as &$part) {
+ // Each part is a base64url encoded json string.
+ $part = str_replace(array('-', '_'), array('+', '/'), $part);
+ $part = base64_decode($part);
+ $part = json_decode($part, true);
+ }
+ list($header, $claims, $signature) = $parts;
+
+ $this->assertArrayNotHasKey('email', $claims);
+ $this->assertArrayNotHasKey('email_verified', $claims);
+ }
+
+ private function getTestServer($config = array())
+ {
+ $config += array(
+ 'use_openid_connect' => true,
+ 'issuer' => 'test',
+ 'id_lifetime' => 3600,
+ 'allow_implicit' => true,
+ );
+
+ $memoryStorage = Bootstrap::getInstance()->getMemoryStorage();
+ $memoryStorage->supportedScopes[] = 'email';
+ $responseTypes = array(
+ 'code' => $code = new AuthorizationCode($memoryStorage),
+ 'id_token' => $idToken = new IdToken($memoryStorage, $memoryStorage, $config),
+ 'code id_token' => new CodeIdToken($code, $idToken),
+ );
+
+ $server = new Server($memoryStorage, $config, array(), $responseTypes);
+ $server->addGrantType(new ClientCredentials($memoryStorage));
+
+ return $server;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/ResponseType/IdTokenTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/ResponseType/IdTokenTest.php
new file mode 100644
index 000000000..e772f6be4
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/ResponseType/IdTokenTest.php
@@ -0,0 +1,184 @@
+<?php
+
+namespace OAuth2\OpenID\ResponseType;
+
+use OAuth2\Server;
+use OAuth2\Request;
+use OAuth2\Response;
+use OAuth2\Storage\Bootstrap;
+use OAuth2\GrantType\ClientCredentials;
+use OAuth2\Encryption\Jwt;
+
+class IdTokenTest extends \PHPUnit_Framework_TestCase
+{
+ public function testValidateAuthorizeRequest()
+ {
+ $query = array(
+ 'response_type' => 'id_token',
+ 'redirect_uri' => 'http://adobe.com',
+ 'client_id' => 'Test Client ID',
+ 'scope' => 'openid',
+ 'state' => 'test',
+ );
+
+ // attempt to do the request without a nonce.
+ $server = $this->getTestServer(array('allow_implicit' => true));
+ $request = new Request($query);
+ $valid = $server->validateAuthorizeRequest($request, $response = new Response());
+
+ // Add a nonce and retry.
+ $query['nonce'] = 'test';
+ $request = new Request($query);
+ $valid = $server->validateAuthorizeRequest($request, $response = new Response());
+ $this->assertTrue($valid);
+ }
+
+ public function testHandleAuthorizeRequest()
+ {
+ // add the test parameters in memory
+ $server = $this->getTestServer(array('allow_implicit' => true));
+ $request = new Request(array(
+ 'response_type' => 'id_token',
+ 'redirect_uri' => 'http://adobe.com',
+ 'client_id' => 'Test Client ID',
+ 'scope' => 'openid email',
+ 'state' => 'test',
+ 'nonce' => 'test',
+ ));
+
+ $user_id = 'testuser';
+ $server->handleAuthorizeRequest($request, $response = new Response(), true, $user_id);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $location = $response->getHttpHeader('Location');
+ $this->assertNotContains('error', $location);
+
+ $parts = parse_url($location);
+ $this->assertArrayHasKey('fragment', $parts);
+ $this->assertFalse(isset($parts['query']));
+
+ // assert fragment is in "application/x-www-form-urlencoded" format
+ parse_str($parts['fragment'], $params);
+ $this->assertNotNull($params);
+ $this->assertArrayHasKey('id_token', $params);
+ $this->assertArrayNotHasKey('access_token', $params);
+ $this->validateIdToken($params['id_token']);
+ }
+
+ public function testPassInAuthTime()
+ {
+ $server = $this->getTestServer(array('allow_implicit' => true));
+ $request = new Request(array(
+ 'response_type' => 'id_token',
+ 'redirect_uri' => 'http://adobe.com',
+ 'client_id' => 'Test Client ID',
+ 'scope' => 'openid email',
+ 'state' => 'test',
+ 'nonce' => 'test',
+ ));
+
+ // test with a scalar user id
+ $user_id = 'testuser123';
+ $server->handleAuthorizeRequest($request, $response = new Response(), true, $user_id);
+
+ list($header, $payload, $signature) = $this->extractTokenDataFromResponse($response);
+
+ $this->assertTrue(is_array($payload));
+ $this->assertArrayHasKey('sub', $payload);
+ $this->assertEquals($user_id, $payload['sub']);
+ $this->assertArrayHasKey('auth_time', $payload);
+
+ // test with an array of user info
+ $userInfo = array(
+ 'user_id' => 'testuser1234',
+ 'auth_time' => date('Y-m-d H:i:s', strtotime('20 minutes ago')
+ ));
+
+ $server->handleAuthorizeRequest($request, $response = new Response(), true, $userInfo);
+
+ list($header, $payload, $signature) = $this->extractTokenDataFromResponse($response);
+
+ $this->assertTrue(is_array($payload));
+ $this->assertArrayHasKey('sub', $payload);
+ $this->assertEquals($userInfo['user_id'], $payload['sub']);
+ $this->assertArrayHasKey('auth_time', $payload);
+ $this->assertEquals($userInfo['auth_time'], $payload['auth_time']);
+ }
+
+ private function extractTokenDataFromResponse(Response $response)
+ {
+ $this->assertEquals($response->getStatusCode(), 302);
+ $location = $response->getHttpHeader('Location');
+ $this->assertNotContains('error', $location);
+
+ $parts = parse_url($location);
+ $this->assertArrayHasKey('fragment', $parts);
+ $this->assertFalse(isset($parts['query']));
+
+ parse_str($parts['fragment'], $params);
+ $this->assertNotNull($params);
+ $this->assertArrayHasKey('id_token', $params);
+ $this->assertArrayNotHasKey('access_token', $params);
+
+ list($headb64, $payloadb64, $signature) = explode('.', $params['id_token']);
+
+ $jwt = new Jwt();
+ $header = json_decode($jwt->urlSafeB64Decode($headb64), true);
+ $payload = json_decode($jwt->urlSafeB64Decode($payloadb64), true);
+
+ return array($header, $payload, $signature);
+ }
+
+ private function validateIdToken($id_token)
+ {
+ $parts = explode('.', $id_token);
+ foreach ($parts as &$part) {
+ // Each part is a base64url encoded json string.
+ $part = str_replace(array('-', '_'), array('+', '/'), $part);
+ $part = base64_decode($part);
+ $part = json_decode($part, true);
+ }
+ list($header, $claims, $signature) = $parts;
+
+ $this->assertArrayHasKey('iss', $claims);
+ $this->assertArrayHasKey('sub', $claims);
+ $this->assertArrayHasKey('aud', $claims);
+ $this->assertArrayHasKey('iat', $claims);
+ $this->assertArrayHasKey('exp', $claims);
+ $this->assertArrayHasKey('auth_time', $claims);
+ $this->assertArrayHasKey('nonce', $claims);
+ $this->assertArrayHasKey('email', $claims);
+ $this->assertArrayHasKey('email_verified', $claims);
+
+ $this->assertEquals($claims['iss'], 'test');
+ $this->assertEquals($claims['aud'], 'Test Client ID');
+ $this->assertEquals($claims['nonce'], 'test');
+ $this->assertEquals($claims['email'], 'testuser@test.com');
+ $duration = $claims['exp'] - $claims['iat'];
+ $this->assertEquals($duration, 3600);
+ }
+
+ private function getTestServer($config = array())
+ {
+ $config += array(
+ 'use_openid_connect' => true,
+ 'issuer' => 'test',
+ 'id_lifetime' => 3600,
+ );
+
+ $memoryStorage = Bootstrap::getInstance()->getMemoryStorage();
+ $memoryStorage->supportedScopes[] = 'email';
+ $storage = array(
+ 'client' => $memoryStorage,
+ 'scope' => $memoryStorage,
+ );
+ $responseTypes = array(
+ 'id_token' => new IdToken($memoryStorage, $memoryStorage, $config),
+ );
+
+ $server = new Server($storage, $config, array(), $responseTypes);
+ $server->addGrantType(new ClientCredentials($memoryStorage));
+
+ return $server;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/ResponseType/IdTokenTokenTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/ResponseType/IdTokenTokenTest.php
new file mode 100644
index 000000000..bc564d37b
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/ResponseType/IdTokenTokenTest.php
@@ -0,0 +1,91 @@
+<?php
+
+namespace OAuth2\OpenID\ResponseType;
+
+use OAuth2\Server;
+use OAuth2\Request;
+use OAuth2\Response;
+use OAuth2\Storage\Bootstrap;
+use OAuth2\GrantType\ClientCredentials;
+use OAuth2\ResponseType\AccessToken;
+
+class IdTokenTokenTest extends \PHPUnit_Framework_TestCase
+{
+
+ public function testHandleAuthorizeRequest()
+ {
+ // add the test parameters in memory
+ $server = $this->getTestServer(array('allow_implicit' => true));
+
+ $request = new Request(array(
+ 'response_type' => 'id_token token',
+ 'redirect_uri' => 'http://adobe.com',
+ 'client_id' => 'Test Client ID',
+ 'scope' => 'openid',
+ 'state' => 'test',
+ 'nonce' => 'test',
+ ));
+
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $location = $response->getHttpHeader('Location');
+ $this->assertNotContains('error', $location);
+
+ $parts = parse_url($location);
+ $this->assertArrayHasKey('fragment', $parts);
+ $this->assertFalse(isset($parts['query']));
+
+ // assert fragment is in "application/x-www-form-urlencoded" format
+ parse_str($parts['fragment'], $params);
+ $this->assertNotNull($params);
+ $this->assertArrayHasKey('id_token', $params);
+ $this->assertArrayHasKey('access_token', $params);
+
+ // validate ID Token
+ $parts = explode('.', $params['id_token']);
+ foreach ($parts as &$part) {
+ // Each part is a base64url encoded json string.
+ $part = str_replace(array('-', '_'), array('+', '/'), $part);
+ $part = base64_decode($part);
+ $part = json_decode($part, true);
+ }
+ list($header, $claims, $signature) = $parts;
+
+ $this->assertArrayHasKey('iss', $claims);
+ $this->assertArrayHasKey('sub', $claims);
+ $this->assertArrayHasKey('aud', $claims);
+ $this->assertArrayHasKey('iat', $claims);
+ $this->assertArrayHasKey('exp', $claims);
+ $this->assertArrayHasKey('auth_time', $claims);
+ $this->assertArrayHasKey('nonce', $claims);
+ $this->assertArrayHasKey('at_hash', $claims);
+
+ $this->assertEquals($claims['iss'], 'test');
+ $this->assertEquals($claims['aud'], 'Test Client ID');
+ $this->assertEquals($claims['nonce'], 'test');
+ $duration = $claims['exp'] - $claims['iat'];
+ $this->assertEquals($duration, 3600);
+ }
+
+ private function getTestServer($config = array())
+ {
+ $config += array(
+ 'use_openid_connect' => true,
+ 'issuer' => 'test',
+ 'id_lifetime' => 3600,
+ );
+
+ $memoryStorage = Bootstrap::getInstance()->getMemoryStorage();
+ $responseTypes = array(
+ 'token' => $token = new AccessToken($memoryStorage, $memoryStorage),
+ 'id_token' => $idToken = new IdToken($memoryStorage, $memoryStorage, $config),
+ 'id_token token' => new IdTokenToken($token, $idToken),
+ );
+
+ $server = new Server($memoryStorage, $config, array(), $responseTypes);
+ $server->addGrantType(new ClientCredentials($memoryStorage));
+
+ return $server;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/Storage/AuthorizationCodeTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/Storage/AuthorizationCodeTest.php
new file mode 100644
index 000000000..bdfb085e3
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/Storage/AuthorizationCodeTest.php
@@ -0,0 +1,95 @@
+<?php
+
+namespace OAuth2\OpenID\Storage;
+
+use OAuth2\Storage\BaseTest;
+use OAuth2\Storage\NullStorage;
+
+class AuthorizationCodeTest extends BaseTest
+{
+ /** @dataProvider provideStorage */
+ public function testCreateAuthorizationCode($storage)
+ {
+ if ($storage instanceof NullStorage) {
+ $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
+
+ return;
+ }
+
+ if (!$storage instanceof AuthorizationCodeInterface) {
+ return;
+ }
+
+ // assert code we are about to add does not exist
+ $code = $storage->getAuthorizationCode('new-openid-code');
+ $this->assertFalse($code);
+
+ // add new code
+ $expires = time() + 20;
+ $scope = null;
+ $id_token = 'fake_id_token';
+ $success = $storage->setAuthorizationCode('new-openid-code', 'client ID', 'SOMEUSERID', 'http://example.com', $expires, $scope, $id_token);
+ $this->assertTrue($success);
+
+ $code = $storage->getAuthorizationCode('new-openid-code');
+ $this->assertNotNull($code);
+ $this->assertArrayHasKey('authorization_code', $code);
+ $this->assertArrayHasKey('client_id', $code);
+ $this->assertArrayHasKey('user_id', $code);
+ $this->assertArrayHasKey('redirect_uri', $code);
+ $this->assertArrayHasKey('expires', $code);
+ $this->assertEquals($code['authorization_code'], 'new-openid-code');
+ $this->assertEquals($code['client_id'], 'client ID');
+ $this->assertEquals($code['user_id'], 'SOMEUSERID');
+ $this->assertEquals($code['redirect_uri'], 'http://example.com');
+ $this->assertEquals($code['expires'], $expires);
+ $this->assertEquals($code['id_token'], $id_token);
+
+ // change existing code
+ $expires = time() + 42;
+ $new_id_token = 'fake_id_token-2';
+ $success = $storage->setAuthorizationCode('new-openid-code', 'client ID2', 'SOMEOTHERID', 'http://example.org', $expires, $scope, $new_id_token);
+ $this->assertTrue($success);
+
+ $code = $storage->getAuthorizationCode('new-openid-code');
+ $this->assertNotNull($code);
+ $this->assertArrayHasKey('authorization_code', $code);
+ $this->assertArrayHasKey('client_id', $code);
+ $this->assertArrayHasKey('user_id', $code);
+ $this->assertArrayHasKey('redirect_uri', $code);
+ $this->assertArrayHasKey('expires', $code);
+ $this->assertEquals($code['authorization_code'], 'new-openid-code');
+ $this->assertEquals($code['client_id'], 'client ID2');
+ $this->assertEquals($code['user_id'], 'SOMEOTHERID');
+ $this->assertEquals($code['redirect_uri'], 'http://example.org');
+ $this->assertEquals($code['expires'], $expires);
+ $this->assertEquals($code['id_token'], $new_id_token);
+ }
+
+ /** @dataProvider provideStorage */
+ public function testRemoveIdTokenFromAuthorizationCode($storage)
+ {
+ // add new code
+ $expires = time() + 20;
+ $scope = null;
+ $id_token = 'fake_id_token_to_remove';
+ $authcode = 'new-openid-code-'.rand();
+ $success = $storage->setAuthorizationCode($authcode, 'client ID', 'SOMEUSERID', 'http://example.com', $expires, $scope, $id_token);
+ $this->assertTrue($success);
+
+ // verify params were set
+ $code = $storage->getAuthorizationCode($authcode);
+ $this->assertNotNull($code);
+ $this->assertArrayHasKey('id_token', $code);
+ $this->assertEquals($code['id_token'], $id_token);
+
+ // remove the id_token
+ $success = $storage->setAuthorizationCode($authcode, 'client ID', 'SOMEUSERID', 'http://example.com', $expires, $scope, null);
+
+ // verify the "id_token" is now null
+ $code = $storage->getAuthorizationCode($authcode);
+ $this->assertNotNull($code);
+ $this->assertArrayHasKey('id_token', $code);
+ $this->assertEquals($code['id_token'], null);
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/Storage/UserClaimsTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/Storage/UserClaimsTest.php
new file mode 100644
index 000000000..840f6c566
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/Storage/UserClaimsTest.php
@@ -0,0 +1,41 @@
+<?php
+
+namespace OAuth2\OpenID\Storage;
+
+use OAuth2\Storage\BaseTest;
+use OAuth2\Storage\NullStorage;
+
+class UserClaimsTest extends BaseTest
+{
+ /** @dataProvider provideStorage */
+ public function testGetUserClaims($storage)
+ {
+ if ($storage instanceof NullStorage) {
+ $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
+
+ return;
+ }
+
+ if (!$storage instanceof UserClaimsInterface) {
+ // incompatible storage
+ return;
+ }
+
+ // invalid user
+ $claims = $storage->getUserClaims('fake-user', '');
+ $this->assertFalse($claims);
+
+ // valid user (no scope)
+ $claims = $storage->getUserClaims('testuser', '');
+
+ /* assert the decoded token is the same */
+ $this->assertFalse(isset($claims['email']));
+
+ // valid user
+ $claims = $storage->getUserClaims('testuser', 'email');
+
+ /* assert the decoded token is the same */
+ $this->assertEquals($claims['email'], "testuser@test.com");
+ $this->assertEquals($claims['email_verified'], true);
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/RequestTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/RequestTest.php
new file mode 100644
index 000000000..10db3215c
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/RequestTest.php
@@ -0,0 +1,98 @@
+<?php
+
+namespace OAuth2;
+
+use OAuth2\Request\TestRequest;
+use OAuth2\Storage\Bootstrap;
+use OAuth2\GrantType\AuthorizationCode;
+
+class RequestTest extends \PHPUnit_Framework_TestCase
+{
+ public function testRequestOverride()
+ {
+ $request = new TestRequest();
+ $server = $this->getTestServer();
+
+ // Smoke test for override request class
+ // $server->handleTokenRequest($request, $response = new Response());
+ // $this->assertInstanceOf('Response', $response);
+ // $server->handleAuthorizeRequest($request, $response = new Response(), true);
+ // $this->assertInstanceOf('Response', $response);
+ // $response = $server->verifyResourceRequest($request, $response = new Response());
+ // $this->assertTrue(is_bool($response));
+
+ /*** make some valid requests ***/
+
+ // Valid Token Request
+ $request->setPost(array(
+ 'grant_type' => 'authorization_code',
+ 'client_id' => 'Test Client ID',
+ 'client_secret' => 'TestSecret',
+ 'code' => 'testcode',
+ ));
+ $server->handleTokenRequest($request, $response = new Response());
+ $this->assertEquals($response->getStatusCode(), 200);
+ $this->assertNull($response->getParameter('error'));
+ $this->assertNotNUll($response->getParameter('access_token'));
+ }
+
+ public function testHeadersReturnsValueByKey()
+ {
+ $request = new Request(
+ array(),
+ array(),
+ array(),
+ array(),
+ array(),
+ array(),
+ array(),
+ array('AUTHORIZATION' => 'Basic secret')
+ );
+
+ $this->assertEquals('Basic secret', $request->headers('AUTHORIZATION'));
+ }
+
+ public function testHeadersReturnsDefaultIfHeaderNotPresent()
+ {
+ $request = new Request();
+
+ $this->assertEquals('Bearer', $request->headers('AUTHORIZATION', 'Bearer'));
+ }
+
+ public function testHeadersIsCaseInsensitive()
+ {
+ $request = new Request(
+ array(),
+ array(),
+ array(),
+ array(),
+ array(),
+ array(),
+ array(),
+ array('AUTHORIZATION' => 'Basic secret')
+ );
+
+ $this->assertEquals('Basic secret', $request->headers('Authorization'));
+ }
+
+ public function testRequestReturnsPostParamIfNoQueryParamAvailable()
+ {
+ $request = new Request(
+ array(),
+ array('client_id' => 'correct')
+ );
+
+ $this->assertEquals('correct', $request->query('client_id', $request->request('client_id')));
+ }
+
+ private function getTestServer($config = array())
+ {
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $server = new Server($storage, $config);
+
+ // Add the two types supported for authorization grant
+ $server->addGrantType(new AuthorizationCode($storage));
+
+ return $server;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/ResponseTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/ResponseTest.php
new file mode 100644
index 000000000..b8149005d
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/ResponseTest.php
@@ -0,0 +1,17 @@
+<?php
+
+namespace OAuth2;
+
+class ResponseTest extends \PHPUnit_Framework_TestCase
+{
+ public function testRenderAsXml()
+ {
+ $response = new Response(array(
+ 'foo' => 'bar',
+ 'halland' => 'oates',
+ ));
+
+ $string = $response->getResponseBody('xml');
+ $this->assertContains('<response><foo>bar</foo><halland>oates</halland></response>', $string);
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/ResponseType/AccessTokenTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/ResponseType/AccessTokenTest.php
new file mode 100644
index 000000000..0ed1c82fc
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/ResponseType/AccessTokenTest.php
@@ -0,0 +1,107 @@
+<?php
+
+namespace OAuth2\ResponseType;
+
+use OAuth2\Server;
+use OAuth2\Storage\Memory;
+
+class AccessTokenTest extends \PHPUnit_Framework_TestCase
+{
+ public function testRevokeAccessTokenWithTypeHint()
+ {
+ $tokenStorage = new Memory(array(
+ 'access_tokens' => array(
+ 'revoke' => array('mytoken'),
+ ),
+ ));
+
+ $this->assertEquals(array('mytoken'), $tokenStorage->getAccessToken('revoke'));
+ $accessToken = new AccessToken($tokenStorage);
+ $accessToken->revokeToken('revoke', 'access_token');
+ $this->assertFalse($tokenStorage->getAccessToken('revoke'));
+ }
+
+ public function testRevokeAccessTokenWithoutTypeHint()
+ {
+ $tokenStorage = new Memory(array(
+ 'access_tokens' => array(
+ 'revoke' => array('mytoken'),
+ ),
+ ));
+
+ $this->assertEquals(array('mytoken'), $tokenStorage->getAccessToken('revoke'));
+ $accessToken = new AccessToken($tokenStorage);
+ $accessToken->revokeToken('revoke');
+ $this->assertFalse($tokenStorage->getAccessToken('revoke'));
+ }
+
+ public function testRevokeRefreshTokenWithTypeHint()
+ {
+ $tokenStorage = new Memory(array(
+ 'refresh_tokens' => array(
+ 'revoke' => array('mytoken'),
+ ),
+ ));
+
+ $this->assertEquals(array('mytoken'), $tokenStorage->getRefreshToken('revoke'));
+ $accessToken = new AccessToken(new Memory, $tokenStorage);
+ $accessToken->revokeToken('revoke', 'refresh_token');
+ $this->assertFalse($tokenStorage->getRefreshToken('revoke'));
+ }
+
+ public function testRevokeRefreshTokenWithoutTypeHint()
+ {
+ $tokenStorage = new Memory(array(
+ 'refresh_tokens' => array(
+ 'revoke' => array('mytoken'),
+ ),
+ ));
+
+ $this->assertEquals(array('mytoken'), $tokenStorage->getRefreshToken('revoke'));
+ $accessToken = new AccessToken(new Memory, $tokenStorage);
+ $accessToken->revokeToken('revoke');
+ $this->assertFalse($tokenStorage->getRefreshToken('revoke'));
+ }
+
+ public function testRevokeAccessTokenWithRefreshTokenTypeHint()
+ {
+ $tokenStorage = new Memory(array(
+ 'access_tokens' => array(
+ 'revoke' => array('mytoken'),
+ ),
+ ));
+
+ $this->assertEquals(array('mytoken'), $tokenStorage->getAccessToken('revoke'));
+ $accessToken = new AccessToken($tokenStorage);
+ $accessToken->revokeToken('revoke', 'refresh_token');
+ $this->assertFalse($tokenStorage->getAccessToken('revoke'));
+ }
+
+ public function testRevokeAccessTokenWithBogusTypeHint()
+ {
+ $tokenStorage = new Memory(array(
+ 'access_tokens' => array(
+ 'revoke' => array('mytoken'),
+ ),
+ ));
+
+ $this->assertEquals(array('mytoken'), $tokenStorage->getAccessToken('revoke'));
+ $accessToken = new AccessToken($tokenStorage);
+ $accessToken->revokeToken('revoke', 'foo');
+ $this->assertFalse($tokenStorage->getAccessToken('revoke'));
+ }
+
+ public function testRevokeRefreshTokenWithBogusTypeHint()
+ {
+ $tokenStorage = new Memory(array(
+ 'refresh_tokens' => array(
+ 'revoke' => array('mytoken'),
+ ),
+ ));
+
+ $this->assertEquals(array('mytoken'), $tokenStorage->getRefreshToken('revoke'));
+ $accessToken = new AccessToken(new Memory, $tokenStorage);
+ $accessToken->revokeToken('revoke', 'foo');
+ $this->assertFalse($tokenStorage->getRefreshToken('revoke'));
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/ResponseType/JwtAccessTokenTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/ResponseType/JwtAccessTokenTest.php
new file mode 100644
index 000000000..51b01a927
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/ResponseType/JwtAccessTokenTest.php
@@ -0,0 +1,160 @@
+<?php
+
+namespace OAuth2\ResponseType;
+
+use OAuth2\Server;
+use OAuth2\Response;
+use OAuth2\Request\TestRequest;
+use OAuth2\Storage\Bootstrap;
+use OAuth2\Storage\JwtAccessToken as JwtAccessTokenStorage;
+use OAuth2\GrantType\ClientCredentials;
+use OAuth2\GrantType\UserCredentials;
+use OAuth2\GrantType\RefreshToken;
+use OAuth2\Encryption\Jwt;
+
+class JwtAccessTokenTest extends \PHPUnit_Framework_TestCase
+{
+ public function testCreateAccessToken()
+ {
+ $server = $this->getTestServer();
+ $jwtResponseType = $server->getResponseType('token');
+
+ $accessToken = $jwtResponseType->createAccessToken('Test Client ID', 123, 'test', false);
+ $jwt = new Jwt;
+ $decodedAccessToken = $jwt->decode($accessToken['access_token'], null, false);
+
+ $this->assertArrayHasKey('id', $decodedAccessToken);
+ $this->assertArrayHasKey('jti', $decodedAccessToken);
+ $this->assertArrayHasKey('iss', $decodedAccessToken);
+ $this->assertArrayHasKey('aud', $decodedAccessToken);
+ $this->assertArrayHasKey('exp', $decodedAccessToken);
+ $this->assertArrayHasKey('iat', $decodedAccessToken);
+ $this->assertArrayHasKey('token_type', $decodedAccessToken);
+ $this->assertArrayHasKey('scope', $decodedAccessToken);
+
+ $this->assertEquals('https://api.example.com', $decodedAccessToken['iss']);
+ $this->assertEquals('Test Client ID', $decodedAccessToken['aud']);
+ $this->assertEquals(123, $decodedAccessToken['sub']);
+ $delta = $decodedAccessToken['exp'] - $decodedAccessToken['iat'];
+ $this->assertEquals(3600, $delta);
+ $this->assertEquals($decodedAccessToken['id'], $decodedAccessToken['jti']);
+ }
+
+ public function testGrantJwtAccessToken()
+ {
+ // add the test parameters in memory
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'client_credentials', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ ));
+ $server->handleTokenRequest($request, $response = new Response());
+
+ $this->assertNotNull($response->getParameter('access_token'));
+ $this->assertEquals(2, substr_count($response->getParameter('access_token'), '.'));
+ }
+
+ public function testAccessResourceWithJwtAccessToken()
+ {
+ // add the test parameters in memory
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'client_credentials', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ ));
+ $server->handleTokenRequest($request, $response = new Response());
+ $this->assertNotNull($JwtAccessToken = $response->getParameter('access_token'));
+
+ // make a call to the resource server using the crypto token
+ $request = TestRequest::createPost(array(
+ 'access_token' => $JwtAccessToken,
+ ));
+
+ $this->assertTrue($server->verifyResourceRequest($request));
+ }
+
+ public function testAccessResourceWithJwtAccessTokenUsingSecondaryStorage()
+ {
+ // add the test parameters in memory
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'client_credentials', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ ));
+ $server->handleTokenRequest($request, $response = new Response());
+ $this->assertNotNull($JwtAccessToken = $response->getParameter('access_token'));
+
+ // make a call to the resource server using the crypto token
+ $request = TestRequest::createPost(array(
+ 'access_token' => $JwtAccessToken,
+ ));
+
+ // create a resource server with the "memory" storage from the grant server
+ $resourceServer = new Server($server->getStorage('client_credentials'));
+
+ $this->assertTrue($resourceServer->verifyResourceRequest($request));
+ }
+
+ public function testJwtAccessTokenWithRefreshToken()
+ {
+ $server = $this->getTestServer();
+
+ // add "UserCredentials" grant type and "JwtAccessToken" response type
+ // and ensure "JwtAccessToken" response type has "RefreshToken" storage
+ $memoryStorage = Bootstrap::getInstance()->getMemoryStorage();
+ $server->addGrantType(new UserCredentials($memoryStorage));
+ $server->addGrantType(new RefreshToken($memoryStorage));
+ $server->addResponseType(new JwtAccessToken($memoryStorage, $memoryStorage, $memoryStorage), 'token');
+
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'password', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'username' => 'test-username', // valid username
+ 'password' => 'testpass', // valid password
+ ));
+
+ // make the call to grant a crypto token
+ $server->handleTokenRequest($request, $response = new Response());
+ $this->assertNotNull($JwtAccessToken = $response->getParameter('access_token'));
+ $this->assertNotNull($refreshToken = $response->getParameter('refresh_token'));
+
+ // decode token and make sure refresh_token isn't set
+ list($header, $payload, $signature) = explode('.', $JwtAccessToken);
+ $decodedToken = json_decode(base64_decode($payload), true);
+ $this->assertFalse(array_key_exists('refresh_token', $decodedToken));
+
+ // use the refresh token to get another access token
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'refresh_token',
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'refresh_token' => $refreshToken,
+ ));
+
+ $server->handleTokenRequest($request, $response = new Response());
+ $this->assertNotNull($response->getParameter('access_token'));
+ }
+
+ private function getTestServer()
+ {
+ $memoryStorage = Bootstrap::getInstance()->getMemoryStorage();
+
+ $storage = array(
+ 'access_token' => new JwtAccessTokenStorage($memoryStorage),
+ 'client' => $memoryStorage,
+ 'client_credentials' => $memoryStorage,
+ );
+ $server = new Server($storage);
+ $server->addGrantType(new ClientCredentials($memoryStorage));
+
+ // make the "token" response type a JwtAccessToken
+ $config = array('issuer' => 'https://api.example.com');
+ $server->addResponseType(new JwtAccessToken($memoryStorage, $memoryStorage, null, $config));
+
+ return $server;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/ScopeTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/ScopeTest.php
new file mode 100644
index 000000000..99f9cf6eb
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/ScopeTest.php
@@ -0,0 +1,42 @@
+<?php
+
+namespace OAuth2;
+
+use OAuth2\Storage\Memory;
+
+class ScopeTest extends \PHPUnit_Framework_TestCase
+{
+ public function testCheckScope()
+ {
+ $scopeUtil = new Scope();
+
+ $this->assertFalse($scopeUtil->checkScope('invalid', 'list of scopes'));
+ $this->assertTrue($scopeUtil->checkScope('valid', 'valid and-some other-scopes'));
+ $this->assertTrue($scopeUtil->checkScope('valid another-valid', 'valid another-valid and-some other-scopes'));
+ // all scopes must match
+ $this->assertFalse($scopeUtil->checkScope('valid invalid', 'valid and-some other-scopes'));
+ $this->assertFalse($scopeUtil->checkScope('valid valid2 invalid', 'valid valid2 and-some other-scopes'));
+ }
+
+ public function testScopeStorage()
+ {
+ $scopeUtil = new Scope();
+ $this->assertEquals($scopeUtil->getDefaultScope(), null);
+
+ $scopeUtil = new Scope(array(
+ 'default_scope' => 'default',
+ 'supported_scopes' => array('this', 'that', 'another'),
+ ));
+ $this->assertEquals($scopeUtil->getDefaultScope(), 'default');
+ $this->assertTrue($scopeUtil->scopeExists('this that another', 'client_id'));
+
+ $memoryStorage = new Memory(array(
+ 'default_scope' => 'base',
+ 'supported_scopes' => array('only-this-one'),
+ ));
+ $scopeUtil = new Scope($memoryStorage);
+
+ $this->assertEquals($scopeUtil->getDefaultScope(), 'base');
+ $this->assertTrue($scopeUtil->scopeExists('only-this-one', 'client_id'));
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/ServerTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/ServerTest.php
new file mode 100644
index 000000000..747e120f5
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/ServerTest.php
@@ -0,0 +1,684 @@
+<?php
+
+namespace OAuth2;
+
+use OAuth2\Request\TestRequest;
+use OAuth2\ResponseType\AuthorizationCode;
+use OAuth2\Storage\Bootstrap;
+
+class ServerTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @expectedException LogicException OAuth2\Storage\ClientInterface
+ **/
+ public function testGetAuthorizeControllerWithNoClientStorageThrowsException()
+ {
+ // must set Client Storage
+ $server = new Server();
+ $server->getAuthorizeController();
+ }
+
+ /**
+ * @expectedException LogicException OAuth2\Storage\AccessTokenInterface
+ **/
+ public function testGetAuthorizeControllerWithNoAccessTokenStorageThrowsException()
+ {
+ // must set AccessToken or AuthorizationCode
+ $server = new Server();
+ $server->addStorage($this->getMock('OAuth2\Storage\ClientInterface'));
+ $server->getAuthorizeController();
+ }
+
+ public function testGetAuthorizeControllerWithClientStorageAndAccessTokenResponseType()
+ {
+ // must set AccessToken or AuthorizationCode
+ $server = new Server();
+ $server->addStorage($this->getMock('OAuth2\Storage\ClientInterface'));
+ $server->addResponseType($this->getMock('OAuth2\ResponseType\AccessTokenInterface'));
+
+ $this->assertNotNull($server->getAuthorizeController());
+ }
+
+ public function testGetAuthorizeControllerWithClientStorageAndAuthorizationCodeResponseType()
+ {
+ // must set AccessToken or AuthorizationCode
+ $server = new Server();
+ $server->addStorage($this->getMock('OAuth2\Storage\ClientInterface'));
+ $server->addResponseType($this->getMock('OAuth2\ResponseType\AuthorizationCodeInterface'));
+
+ $this->assertNotNull($server->getAuthorizeController());
+ }
+
+ /**
+ * @expectedException LogicException allow_implicit
+ **/
+ public function testGetAuthorizeControllerWithClientStorageAndAccessTokenStorageThrowsException()
+ {
+ // must set AuthorizationCode or AccessToken / implicit
+ $server = new Server();
+ $server->addStorage($this->getMock('OAuth2\Storage\ClientInterface'));
+ $server->addStorage($this->getMock('OAuth2\Storage\AccessTokenInterface'));
+
+ $this->assertNotNull($server->getAuthorizeController());
+ }
+
+ public function testGetAuthorizeControllerWithClientStorageAndAccessTokenStorage()
+ {
+ // must set AuthorizationCode or AccessToken / implicit
+ $server = new Server(array(), array('allow_implicit' => true));
+ $server->addStorage($this->getMock('OAuth2\Storage\ClientInterface'));
+ $server->addStorage($this->getMock('OAuth2\Storage\AccessTokenInterface'));
+
+ $this->assertNotNull($server->getAuthorizeController());
+ }
+
+ public function testGetAuthorizeControllerWithClientStorageAndAuthorizationCodeStorage()
+ {
+ // must set AccessToken or AuthorizationCode
+ $server = new Server();
+ $server->addStorage($this->getMock('OAuth2\Storage\ClientInterface'));
+ $server->addStorage($this->getMock('OAuth2\Storage\AuthorizationCodeInterface'));
+
+ $this->assertNotNull($server->getAuthorizeController());
+ }
+
+ /**
+ * @expectedException LogicException grant_types
+ **/
+ public function testGetTokenControllerWithGrantTypeStorageThrowsException()
+ {
+ $server = new Server();
+ $server->getTokenController();
+ }
+
+ /**
+ * @expectedException LogicException OAuth2\Storage\ClientCredentialsInterface
+ **/
+ public function testGetTokenControllerWithNoClientCredentialsStorageThrowsException()
+ {
+ $server = new Server();
+ $server->addStorage($this->getMock('OAuth2\Storage\UserCredentialsInterface'));
+ $server->getTokenController();
+ }
+
+ /**
+ * @expectedException LogicException OAuth2\Storage\AccessTokenInterface
+ **/
+ public function testGetTokenControllerWithNoAccessTokenStorageThrowsException()
+ {
+ $server = new Server();
+ $server->addStorage($this->getMock('OAuth2\Storage\ClientCredentialsInterface'));
+ $server->getTokenController();
+ }
+
+ public function testGetTokenControllerWithAccessTokenAndClientCredentialsStorage()
+ {
+ $server = new Server();
+ $server->addStorage($this->getMock('OAuth2\Storage\AccessTokenInterface'));
+ $server->addStorage($this->getMock('OAuth2\Storage\ClientCredentialsInterface'));
+ $server->getTokenController();
+ }
+
+ public function testGetTokenControllerAccessTokenStorageAndClientCredentialsStorageAndGrantTypes()
+ {
+ $server = new Server();
+ $server->addStorage($this->getMock('OAuth2\Storage\AccessTokenInterface'));
+ $server->addStorage($this->getMock('OAuth2\Storage\ClientCredentialsInterface'));
+ $server->addGrantType($this->getMockBuilder('OAuth2\GrantType\AuthorizationCode')->disableOriginalConstructor()->getMock());
+ $server->getTokenController();
+ }
+
+ /**
+ * @expectedException LogicException OAuth2\Storage\AccessTokenInterface
+ **/
+ public function testGetResourceControllerWithNoAccessTokenStorageThrowsException()
+ {
+ $server = new Server();
+ $server->getResourceController();
+ }
+
+ public function testGetResourceControllerWithAccessTokenStorage()
+ {
+ $server = new Server();
+ $server->addStorage($this->getMock('OAuth2\Storage\AccessTokenInterface'));
+ $server->getResourceController();
+ }
+
+ /**
+ * @expectedException InvalidArgumentException OAuth2\Storage\AccessTokenInterface
+ **/
+ public function testAddingStorageWithInvalidClass()
+ {
+ $server = new Server();
+ $server->addStorage(new \StdClass());
+ }
+
+ /**
+ * @expectedException InvalidArgumentException access_token
+ **/
+ public function testAddingStorageWithInvalidKey()
+ {
+ $server = new Server();
+ $server->addStorage($this->getMock('OAuth2\Storage\AccessTokenInterface'), 'nonexistant_storage');
+ }
+
+ /**
+ * @expectedException InvalidArgumentException OAuth2\Storage\AuthorizationCodeInterface
+ **/
+ public function testAddingStorageWithInvalidKeyStorageCombination()
+ {
+ $server = new Server();
+ $server->addStorage($this->getMock('OAuth2\Storage\AccessTokenInterface'), 'authorization_code');
+ }
+
+ public function testAddingStorageWithValidKeyOnlySetsThatKey()
+ {
+ $server = new Server();
+ $server->addStorage($this->getMock('OAuth2\Storage\Memory'), 'access_token');
+
+ $reflection = new \ReflectionClass($server);
+ $prop = $reflection->getProperty('storages');
+ $prop->setAccessible(true);
+
+ $storages = $prop->getValue($server); // get the private "storages" property
+
+ $this->assertEquals(1, count($storages));
+ $this->assertTrue(isset($storages['access_token']));
+ $this->assertFalse(isset($storages['authorization_code']));
+ }
+
+ public function testAddingClientStorageSetsClientCredentialsStorageByDefault()
+ {
+ $server = new Server();
+ $memory = $this->getMock('OAuth2\Storage\Memory');
+ $server->addStorage($memory, 'client');
+
+ $client_credentials = $server->getStorage('client_credentials');
+
+ $this->assertNotNull($client_credentials);
+ $this->assertEquals($client_credentials, $memory);
+ }
+
+ public function testAddStorageWithNullValue()
+ {
+ $memory = $this->getMock('OAuth2\Storage\Memory');
+ $server = new Server($memory);
+ $server->addStorage(null, 'refresh_token');
+
+ $client_credentials = $server->getStorage('client_credentials');
+
+ $this->assertNotNull($client_credentials);
+ $this->assertEquals($client_credentials, $memory);
+
+ $refresh_token = $server->getStorage('refresh_token');
+
+ $this->assertNull($refresh_token);
+ }
+
+ public function testNewServerWithNullStorageValue()
+ {
+ $memory = $this->getMock('OAuth2\Storage\Memory');
+ $server = new Server(array(
+ 'client_credentials' => $memory,
+ 'refresh_token' => null,
+ ));
+
+ $client_credentials = $server->getStorage('client_credentials');
+
+ $this->assertNotNull($client_credentials);
+ $this->assertEquals($client_credentials, $memory);
+
+ $refresh_token = $server->getStorage('refresh_token');
+
+ $this->assertNull($refresh_token);
+ }
+
+ public function testAddingClientCredentialsStorageSetsClientStorageByDefault()
+ {
+ $server = new Server();
+ $memory = $this->getMock('OAuth2\Storage\Memory');
+ $server->addStorage($memory, 'client_credentials');
+
+ $client = $server->getStorage('client');
+
+ $this->assertNotNull($client);
+ $this->assertEquals($client, $memory);
+ }
+
+ public function testSettingClientStorageByDefaultDoesNotOverrideSetStorage()
+ {
+ $server = new Server();
+ $pdo = $this->getMockBuilder('OAuth2\Storage\Pdo')
+ ->disableOriginalConstructor()->getMock();
+
+ $memory = $this->getMock('OAuth2\Storage\Memory');
+
+ $server->addStorage($pdo, 'client');
+ $server->addStorage($memory, 'client_credentials');
+
+ $client = $server->getStorage('client');
+ $client_credentials = $server->getStorage('client_credentials');
+
+ $this->assertEquals($client, $pdo);
+ $this->assertEquals($client_credentials, $memory);
+ }
+
+ public function testAddingResponseType()
+ {
+ $storage = $this->getMock('OAuth2\Storage\Memory');
+ $storage
+ ->expects($this->any())
+ ->method('getClientDetails')
+ ->will($this->returnValue(array('client_id' => 'some_client')));
+ $storage
+ ->expects($this->any())
+ ->method('checkRestrictedGrantType')
+ ->will($this->returnValue(true));
+
+ // add with the "code" key explicitly set
+ $codeType = new AuthorizationCode($storage);
+ $server = new Server();
+ $server->addStorage($storage);
+ $server->addResponseType($codeType);
+ $request = new Request(array(
+ 'response_type' => 'code',
+ 'client_id' => 'some_client',
+ 'redirect_uri' => 'http://example.com',
+ 'state' => 'xyx',
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ // the response is successful
+ $this->assertEquals($response->getStatusCode(), 302);
+ $parts = parse_url($response->getHttpHeader('Location'));
+ parse_str($parts['query'], $query);
+ $this->assertTrue(isset($query['code']));
+ $this->assertFalse(isset($query['error']));
+
+ // add with the "code" key not set
+ $codeType = new AuthorizationCode($storage);
+ $server = new Server(array($storage), array(), array(), array($codeType));
+ $request = new Request(array(
+ 'response_type' => 'code',
+ 'client_id' => 'some_client',
+ 'redirect_uri' => 'http://example.com',
+ 'state' => 'xyx',
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ // the response is successful
+ $this->assertEquals($response->getStatusCode(), 302);
+ $parts = parse_url($response->getHttpHeader('Location'));
+ parse_str($parts['query'], $query);
+ $this->assertTrue(isset($query['code']));
+ $this->assertFalse(isset($query['error']));
+ }
+
+ public function testCustomClientAssertionType()
+ {
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code',
+ 'client_id' =>'Test Client ID',
+ 'code' => 'testcode',
+ ));
+ // verify the mock clientAssertionType was called as expected
+ $clientAssertionType = $this->getMock('OAuth2\ClientAssertionType\ClientAssertionTypeInterface', array('validateRequest', 'getClientId'));
+ $clientAssertionType
+ ->expects($this->once())
+ ->method('validateRequest')
+ ->will($this->returnValue(true));
+ $clientAssertionType
+ ->expects($this->once())
+ ->method('getClientId')
+ ->will($this->returnValue('Test Client ID'));
+
+ // create mock storage
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $server = new Server(array($storage), array(), array(), array(), null, null, $clientAssertionType);
+ $server->handleTokenRequest($request, $response = new Response());
+ }
+
+ public function testHttpBasicConfig()
+ {
+ // create mock storage
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $server = new Server(array($storage), array(
+ 'allow_credentials_in_request_body' => false,
+ 'allow_public_clients' => false
+ ));
+ $server->getTokenController();
+ $httpBasic = $server->getClientAssertionType();
+
+ $reflection = new \ReflectionClass($httpBasic);
+ $prop = $reflection->getProperty('config');
+ $prop->setAccessible(true);
+
+ $config = $prop->getValue($httpBasic); // get the private "config" property
+
+ $this->assertEquals($config['allow_credentials_in_request_body'], false);
+ $this->assertEquals($config['allow_public_clients'], false);
+ }
+
+ public function testRefreshTokenConfig()
+ {
+ // create mock storage
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $server1 = new Server(array($storage));
+ $server2 = new Server(array($storage), array('always_issue_new_refresh_token' => true, 'unset_refresh_token_after_use' => false));
+
+ $server1->getTokenController();
+ $refreshToken1 = $server1->getGrantType('refresh_token');
+
+ $server2->getTokenController();
+ $refreshToken2 = $server2->getGrantType('refresh_token');
+
+ $reflection1 = new \ReflectionClass($refreshToken1);
+ $prop1 = $reflection1->getProperty('config');
+ $prop1->setAccessible(true);
+
+ $reflection2 = new \ReflectionClass($refreshToken2);
+ $prop2 = $reflection2->getProperty('config');
+ $prop2->setAccessible(true);
+
+ // get the private "config" property
+ $config1 = $prop1->getValue($refreshToken1);
+ $config2 = $prop2->getValue($refreshToken2);
+
+ $this->assertEquals($config1['always_issue_new_refresh_token'], false);
+ $this->assertEquals($config2['always_issue_new_refresh_token'], true);
+
+ $this->assertEquals($config1['unset_refresh_token_after_use'], true);
+ $this->assertEquals($config2['unset_refresh_token_after_use'], false);
+ }
+
+ /**
+ * Test setting "always_issue_new_refresh_token" on a server level
+ *
+ * @see test/OAuth2/GrantType/RefreshTokenTest::testValidRefreshTokenWithNewRefreshTokenInResponse
+ **/
+ public function testValidRefreshTokenWithNewRefreshTokenInResponse()
+ {
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $server = new Server($storage, array('always_issue_new_refresh_token' => true));
+
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'refresh_token', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'refresh_token' => 'test-refreshtoken', // valid refresh token
+ ));
+ $token = $server->grantAccessToken($request, new Response());
+ $this->assertTrue(isset($token['refresh_token']), 'refresh token should always refresh');
+
+ $refresh_token = $storage->getRefreshToken($token['refresh_token']);
+ $this->assertNotNull($refresh_token);
+ $this->assertEquals($refresh_token['refresh_token'], $token['refresh_token']);
+ $this->assertEquals($refresh_token['client_id'], $request->request('client_id'));
+ $this->assertTrue($token['refresh_token'] != 'test-refreshtoken', 'the refresh token returned is not the one used');
+ $used_token = $storage->getRefreshToken('test-refreshtoken');
+ $this->assertFalse($used_token, 'the refresh token used is no longer valid');
+ }
+
+ /**
+ * @expectedException InvalidArgumentException OAuth2\ResponseType\AuthorizationCodeInterface
+ **/
+ public function testAddingUnknownResponseTypeThrowsException()
+ {
+ $server = new Server();
+ $server->addResponseType($this->getMock('OAuth2\ResponseType\ResponseTypeInterface'));
+ }
+
+ /**
+ * @expectedException LogicException OAuth2\Storage\PublicKeyInterface
+ **/
+ public function testUsingJwtAccessTokensWithoutPublicKeyStorageThrowsException()
+ {
+ $server = new Server(array(), array('use_jwt_access_tokens' => true));
+ $server->addGrantType($this->getMock('OAuth2\GrantType\GrantTypeInterface'));
+ $server->addStorage($this->getMock('OAuth2\Storage\ClientCredentialsInterface'));
+ $server->addStorage($this->getMock('OAuth2\Storage\ClientCredentialsInterface'));
+
+ $server->getTokenController();
+ }
+
+ public function testUsingJustJwtAccessTokenStorageWithResourceControllerIsOkay()
+ {
+ $pubkey = $this->getMock('OAuth2\Storage\PublicKeyInterface');
+ $server = new Server(array($pubkey), array('use_jwt_access_tokens' => true));
+
+ $this->assertNotNull($server->getResourceController());
+ $this->assertInstanceOf('OAuth2\Storage\PublicKeyInterface', $server->getStorage('public_key'));
+ }
+
+ /**
+ * @expectedException LogicException OAuth2\Storage\ClientInterface
+ **/
+ public function testUsingJustJwtAccessTokenStorageWithAuthorizeControllerThrowsException()
+ {
+ $pubkey = $this->getMock('OAuth2\Storage\PublicKeyInterface');
+ $server = new Server(array($pubkey), array('use_jwt_access_tokens' => true));
+ $this->assertNotNull($server->getAuthorizeController());
+ }
+
+ /**
+ * @expectedException LogicException grant_types
+ **/
+ public function testUsingJustJwtAccessTokenStorageWithTokenControllerThrowsException()
+ {
+ $pubkey = $this->getMock('OAuth2\Storage\PublicKeyInterface');
+ $server = new Server(array($pubkey), array('use_jwt_access_tokens' => true));
+ $server->getTokenController();
+ }
+
+ public function testUsingJwtAccessTokenAndClientStorageWithAuthorizeControllerIsOkay()
+ {
+ $pubkey = $this->getMock('OAuth2\Storage\PublicKeyInterface');
+ $client = $this->getMock('OAuth2\Storage\ClientInterface');
+ $server = new Server(array($pubkey, $client), array('use_jwt_access_tokens' => true, 'allow_implicit' => true));
+ $this->assertNotNull($server->getAuthorizeController());
+
+ $this->assertInstanceOf('OAuth2\ResponseType\JwtAccessToken', $server->getResponseType('token'));
+ }
+
+ /**
+ * @expectedException LogicException UserClaims
+ **/
+ public function testUsingOpenIDConnectWithoutUserClaimsThrowsException()
+ {
+ $client = $this->getMock('OAuth2\Storage\ClientInterface');
+ $server = new Server($client, array('use_openid_connect' => true));
+
+ $server->getAuthorizeController();
+ }
+
+ /**
+ * @expectedException LogicException PublicKeyInterface
+ **/
+ public function testUsingOpenIDConnectWithoutPublicKeyThrowsException()
+ {
+ $client = $this->getMock('OAuth2\Storage\ClientInterface');
+ $userclaims = $this->getMock('OAuth2\OPenID\Storage\UserClaimsInterface');
+ $server = new Server(array($client, $userclaims), array('use_openid_connect' => true));
+
+ $server->getAuthorizeController();
+ }
+
+ /**
+ * @expectedException LogicException issuer
+ **/
+ public function testUsingOpenIDConnectWithoutIssuerThrowsException()
+ {
+ $client = $this->getMock('OAuth2\Storage\ClientInterface');
+ $userclaims = $this->getMock('OAuth2\OpenID\Storage\UserClaimsInterface');
+ $pubkey = $this->getMock('OAuth2\Storage\PublicKeyInterface');
+ $server = new Server(array($client, $userclaims, $pubkey), array('use_openid_connect' => true));
+
+ $server->getAuthorizeController();
+ }
+
+ public function testUsingOpenIDConnectWithIssuerPublicKeyAndUserClaimsIsOkay()
+ {
+ $client = $this->getMock('OAuth2\Storage\ClientInterface');
+ $userclaims = $this->getMock('OAuth2\OpenID\Storage\UserClaimsInterface');
+ $pubkey = $this->getMock('OAuth2\Storage\PublicKeyInterface');
+ $server = new Server(array($client, $userclaims, $pubkey), array(
+ 'use_openid_connect' => true,
+ 'issuer' => 'someguy',
+ ));
+
+ $server->getAuthorizeController();
+
+ $this->assertInstanceOf('OAuth2\OpenID\ResponseType\IdTokenInterface', $server->getResponseType('id_token'));
+ $this->assertNull($server->getResponseType('id_token token'));
+ }
+
+ /**
+ * @expectedException LogicException OAuth2\ResponseType\AccessTokenInterface
+ **/
+ public function testUsingOpenIDConnectWithAllowImplicitWithoutTokenStorageThrowsException()
+ {
+ $client = $this->getMock('OAuth2\Storage\ClientInterface');
+ $userclaims = $this->getMock('OAuth2\OpenID\Storage\UserClaimsInterface');
+ $pubkey = $this->getMock('OAuth2\Storage\PublicKeyInterface');
+ $server = new Server(array($client, $userclaims, $pubkey), array(
+ 'use_openid_connect' => true,
+ 'issuer' => 'someguy',
+ 'allow_implicit' => true,
+ ));
+
+ $server->getAuthorizeController();
+ }
+
+ public function testUsingOpenIDConnectWithAllowImplicitAndUseJwtAccessTokensIsOkay()
+ {
+ $client = $this->getMock('OAuth2\Storage\ClientInterface');
+ $userclaims = $this->getMock('OAuth2\OpenID\Storage\UserClaimsInterface');
+ $pubkey = $this->getMock('OAuth2\Storage\PublicKeyInterface');
+ $server = new Server(array($client, $userclaims, $pubkey), array(
+ 'use_openid_connect' => true,
+ 'issuer' => 'someguy',
+ 'allow_implicit' => true,
+ 'use_jwt_access_tokens' => true,
+ ));
+
+ $server->getAuthorizeController();
+
+ $this->assertInstanceOf('OAuth2\OpenID\ResponseType\IdTokenInterface', $server->getResponseType('id_token'));
+ $this->assertInstanceOf('OAuth2\OpenID\ResponseType\IdTokenTokenInterface', $server->getResponseType('id_token token'));
+ }
+
+ public function testUsingOpenIDConnectWithAllowImplicitAndAccessTokenStorageIsOkay()
+ {
+ $client = $this->getMock('OAuth2\Storage\ClientInterface');
+ $userclaims = $this->getMock('OAuth2\OpenID\Storage\UserClaimsInterface');
+ $pubkey = $this->getMock('OAuth2\Storage\PublicKeyInterface');
+ $token = $this->getMock('OAuth2\Storage\AccessTokenInterface');
+ $server = new Server(array($client, $userclaims, $pubkey, $token), array(
+ 'use_openid_connect' => true,
+ 'issuer' => 'someguy',
+ 'allow_implicit' => true,
+ ));
+
+ $server->getAuthorizeController();
+
+ $this->assertInstanceOf('OAuth2\OpenID\ResponseType\IdTokenInterface', $server->getResponseType('id_token'));
+ $this->assertInstanceOf('OAuth2\OpenID\ResponseType\IdTokenTokenInterface', $server->getResponseType('id_token token'));
+ }
+
+ public function testUsingOpenIDConnectWithAllowImplicitAndAccessTokenResponseTypeIsOkay()
+ {
+ $client = $this->getMock('OAuth2\Storage\ClientInterface');
+ $userclaims = $this->getMock('OAuth2\OpenID\Storage\UserClaimsInterface');
+ $pubkey = $this->getMock('OAuth2\Storage\PublicKeyInterface');
+ // $token = $this->getMock('OAuth2\Storage\AccessTokenInterface');
+ $server = new Server(array($client, $userclaims, $pubkey), array(
+ 'use_openid_connect' => true,
+ 'issuer' => 'someguy',
+ 'allow_implicit' => true,
+ ));
+
+ $token = $this->getMock('OAuth2\ResponseType\AccessTokenInterface');
+ $server->addResponseType($token, 'token');
+
+ $server->getAuthorizeController();
+
+ $this->assertInstanceOf('OAuth2\OpenID\ResponseType\IdTokenInterface', $server->getResponseType('id_token'));
+ $this->assertInstanceOf('OAuth2\OpenID\ResponseType\IdTokenTokenInterface', $server->getResponseType('id_token token'));
+ }
+
+ /**
+ * @expectedException LogicException OAuth2\OpenID\Storage\AuthorizationCodeInterface
+ **/
+ public function testUsingOpenIDConnectWithAuthorizationCodeStorageThrowsException()
+ {
+ $client = $this->getMock('OAuth2\Storage\ClientCredentialsInterface');
+ $userclaims = $this->getMock('OAuth2\OpenID\Storage\UserClaimsInterface');
+ $pubkey = $this->getMock('OAuth2\Storage\PublicKeyInterface');
+ $token = $this->getMock('OAuth2\Storage\AccessTokenInterface');
+ $authcode = $this->getMock('OAuth2\Storage\AuthorizationCodeInterface');
+
+ $server = new Server(array($client, $userclaims, $pubkey, $token, $authcode), array(
+ 'use_openid_connect' => true,
+ 'issuer' => 'someguy'
+ ));
+
+ $server->getTokenController();
+
+ $this->assertInstanceOf('OAuth2\OpenID\GrantType\AuthorizationCode', $server->getGrantType('authorization_code'));
+ }
+
+ public function testUsingOpenIDConnectWithOpenIDAuthorizationCodeStorageCreatesOpenIDAuthorizationCodeGrantType()
+ {
+ $client = $this->getMock('OAuth2\Storage\ClientCredentialsInterface');
+ $userclaims = $this->getMock('OAuth2\OpenID\Storage\UserClaimsInterface');
+ $pubkey = $this->getMock('OAuth2\Storage\PublicKeyInterface');
+ $token = $this->getMock('OAuth2\Storage\AccessTokenInterface');
+ $authcode = $this->getMock('OAuth2\OpenID\Storage\AuthorizationCodeInterface');
+
+ $server = new Server(array($client, $userclaims, $pubkey, $token, $authcode), array(
+ 'use_openid_connect' => true,
+ 'issuer' => 'someguy'
+ ));
+
+ $server->getTokenController();
+
+ $this->assertInstanceOf('OAuth2\OpenID\GrantType\AuthorizationCode', $server->getGrantType('authorization_code'));
+ }
+
+ public function testMultipleValuedResponseTypeOrderDoesntMatter()
+ {
+ $responseType = $this->getMock('OAuth2\OpenID\ResponseType\IdTokenTokenInterface');
+ $server = new Server(array(), array(), array(), array(
+ 'token id_token' => $responseType,
+ ));
+
+ $this->assertEquals($responseType, $server->getResponseType('id_token token'));
+ }
+
+ public function testAddGrantTypeWithoutKey()
+ {
+ $server = new Server();
+ $server->addGrantType(new \OAuth2\GrantType\AuthorizationCode($this->getMock('OAuth2\Storage\AuthorizationCodeInterface')));
+
+ $grantTypes = $server->getGrantTypes();
+ $this->assertEquals('authorization_code', key($grantTypes));
+ }
+
+ public function testAddGrantTypeWithKey()
+ {
+ $server = new Server();
+ $server->addGrantType(new \OAuth2\GrantType\AuthorizationCode($this->getMock('OAuth2\Storage\AuthorizationCodeInterface')), 'ac');
+
+ $grantTypes = $server->getGrantTypes();
+ $this->assertEquals('ac', key($grantTypes));
+ }
+
+ public function testAddGrantTypeWithKeyNotString()
+ {
+ $server = new Server();
+ $server->addGrantType(new \OAuth2\GrantType\AuthorizationCode($this->getMock('OAuth2\Storage\AuthorizationCodeInterface')), 42);
+
+ $grantTypes = $server->getGrantTypes();
+ $this->assertEquals('authorization_code', key($grantTypes));
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/AccessTokenTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/AccessTokenTest.php
new file mode 100644
index 000000000..b34e0bfc0
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/AccessTokenTest.php
@@ -0,0 +1,102 @@
+<?php
+
+namespace OAuth2\Storage;
+
+class AccessTokenTest extends BaseTest
+{
+ /** @dataProvider provideStorage */
+ public function testSetAccessToken(AccessTokenInterface $storage)
+ {
+ if ($storage instanceof NullStorage) {
+ $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
+
+ return;
+ }
+
+ // assert token we are about to add does not exist
+ $token = $storage->getAccessToken('newtoken');
+ $this->assertFalse($token);
+
+ // add new token
+ $expires = time() + 20;
+ $success = $storage->setAccessToken('newtoken', 'client ID', 'SOMEUSERID', $expires);
+ $this->assertTrue($success);
+
+ $token = $storage->getAccessToken('newtoken');
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+ $this->assertArrayHasKey('client_id', $token);
+ $this->assertArrayHasKey('user_id', $token);
+ $this->assertArrayHasKey('expires', $token);
+ $this->assertEquals($token['access_token'], 'newtoken');
+ $this->assertEquals($token['client_id'], 'client ID');
+ $this->assertEquals($token['user_id'], 'SOMEUSERID');
+ $this->assertEquals($token['expires'], $expires);
+
+ // change existing token
+ $expires = time() + 42;
+ $success = $storage->setAccessToken('newtoken', 'client ID2', 'SOMEOTHERID', $expires);
+ $this->assertTrue($success);
+
+ $token = $storage->getAccessToken('newtoken');
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+ $this->assertArrayHasKey('client_id', $token);
+ $this->assertArrayHasKey('user_id', $token);
+ $this->assertArrayHasKey('expires', $token);
+ $this->assertEquals($token['access_token'], 'newtoken');
+ $this->assertEquals($token['client_id'], 'client ID2');
+ $this->assertEquals($token['user_id'], 'SOMEOTHERID');
+ $this->assertEquals($token['expires'], $expires);
+
+ // add token with scope having an empty string value
+ $expires = time() + 42;
+ $success = $storage->setAccessToken('newtoken', 'client ID', 'SOMEOTHERID', $expires, '');
+ $this->assertTrue($success);
+ }
+
+ /** @dataProvider provideStorage */
+ public function testUnsetAccessToken(AccessTokenInterface $storage)
+ {
+ if ($storage instanceof NullStorage || !method_exists($storage, 'unsetAccessToken')) {
+ $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
+
+ return;
+ }
+
+ // assert token we are about to unset does not exist
+ $token = $storage->getAccessToken('revokabletoken');
+ $this->assertFalse($token);
+
+ // add new token
+ $expires = time() + 20;
+ $success = $storage->setAccessToken('revokabletoken', 'client ID', 'SOMEUSERID', $expires);
+ $this->assertTrue($success);
+
+ // assert unsetAccessToken returns true
+ $result = $storage->unsetAccessToken('revokabletoken');
+ $this->assertTrue($result);
+
+ // assert token we unset does not exist
+ $token = $storage->getAccessToken('revokabletoken');
+ $this->assertFalse($token);
+ }
+
+ /** @dataProvider provideStorage */
+ public function testUnsetAccessTokenReturnsFalse(AccessTokenInterface $storage)
+ {
+ if ($storage instanceof NullStorage || !method_exists($storage, 'unsetAccessToken')) {
+ $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
+
+ return;
+ }
+
+ // assert token we are about to unset does not exist
+ $token = $storage->getAccessToken('nonexistanttoken');
+ $this->assertFalse($token);
+
+ // assert unsetAccessToken returns false
+ $result = $storage->unsetAccessToken('nonexistanttoken');
+ $this->assertFalse($result);
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/AuthorizationCodeTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/AuthorizationCodeTest.php
new file mode 100644
index 000000000..2d901b501
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/AuthorizationCodeTest.php
@@ -0,0 +1,106 @@
+<?php
+
+namespace OAuth2\Storage;
+
+class AuthorizationCodeTest extends BaseTest
+{
+ /** @dataProvider provideStorage */
+ public function testGetAuthorizationCode(AuthorizationCodeInterface $storage)
+ {
+ if ($storage instanceof NullStorage) {
+ $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
+
+ return;
+ }
+
+ // nonexistant client_id
+ $details = $storage->getAuthorizationCode('faketoken');
+ $this->assertFalse($details);
+
+ // valid client_id
+ $details = $storage->getAuthorizationCode('testtoken');
+ $this->assertNotNull($details);
+ }
+
+ /** @dataProvider provideStorage */
+ public function testSetAuthorizationCode(AuthorizationCodeInterface $storage)
+ {
+ if ($storage instanceof NullStorage) {
+ $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
+
+ return;
+ }
+
+ // assert code we are about to add does not exist
+ $code = $storage->getAuthorizationCode('newcode');
+ $this->assertFalse($code);
+
+ // add new code
+ $expires = time() + 20;
+ $success = $storage->setAuthorizationCode('newcode', 'client ID', 'SOMEUSERID', 'http://example.com', $expires);
+ $this->assertTrue($success);
+
+ $code = $storage->getAuthorizationCode('newcode');
+ $this->assertNotNull($code);
+ $this->assertArrayHasKey('authorization_code', $code);
+ $this->assertArrayHasKey('client_id', $code);
+ $this->assertArrayHasKey('user_id', $code);
+ $this->assertArrayHasKey('redirect_uri', $code);
+ $this->assertArrayHasKey('expires', $code);
+ $this->assertEquals($code['authorization_code'], 'newcode');
+ $this->assertEquals($code['client_id'], 'client ID');
+ $this->assertEquals($code['user_id'], 'SOMEUSERID');
+ $this->assertEquals($code['redirect_uri'], 'http://example.com');
+ $this->assertEquals($code['expires'], $expires);
+
+ // change existing code
+ $expires = time() + 42;
+ $success = $storage->setAuthorizationCode('newcode', 'client ID2', 'SOMEOTHERID', 'http://example.org', $expires);
+ $this->assertTrue($success);
+
+ $code = $storage->getAuthorizationCode('newcode');
+ $this->assertNotNull($code);
+ $this->assertArrayHasKey('authorization_code', $code);
+ $this->assertArrayHasKey('client_id', $code);
+ $this->assertArrayHasKey('user_id', $code);
+ $this->assertArrayHasKey('redirect_uri', $code);
+ $this->assertArrayHasKey('expires', $code);
+ $this->assertEquals($code['authorization_code'], 'newcode');
+ $this->assertEquals($code['client_id'], 'client ID2');
+ $this->assertEquals($code['user_id'], 'SOMEOTHERID');
+ $this->assertEquals($code['redirect_uri'], 'http://example.org');
+ $this->assertEquals($code['expires'], $expires);
+
+ // add new code with scope having an empty string value
+ $expires = time() + 20;
+ $success = $storage->setAuthorizationCode('newcode', 'client ID', 'SOMEUSERID', 'http://example.com', $expires, '');
+ $this->assertTrue($success);
+ }
+
+ /** @dataProvider provideStorage */
+ public function testExpireAccessToken(AccessTokenInterface $storage)
+ {
+ if ($storage instanceof NullStorage) {
+ $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
+
+ return;
+ }
+
+ // create a valid code
+ $expires = time() + 20;
+ $success = $storage->setAuthorizationCode('code-to-expire', 'client ID', 'SOMEUSERID', 'http://example.com', time() + 20);
+ $this->assertTrue($success);
+
+ // verify the new code exists
+ $code = $storage->getAuthorizationCode('code-to-expire');
+ $this->assertNotNull($code);
+
+ $this->assertArrayHasKey('authorization_code', $code);
+ $this->assertEquals($code['authorization_code'], 'code-to-expire');
+
+ // now expire the code and ensure it's no longer available
+ $storage->expireAuthorizationCode('code-to-expire');
+ $code = $storage->getAuthorizationCode('code-to-expire');
+ $this->assertFalse($code);
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/ClientCredentialsTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/ClientCredentialsTest.php
new file mode 100644
index 000000000..15289af30
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/ClientCredentialsTest.php
@@ -0,0 +1,28 @@
+<?php
+
+namespace OAuth2\Storage;
+
+class ClientCredentialsTest extends BaseTest
+{
+ /** @dataProvider provideStorage */
+ public function testCheckClientCredentials(ClientCredentialsInterface $storage)
+ {
+ if ($storage instanceof NullStorage) {
+ $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
+
+ return;
+ }
+
+ // nonexistant client_id
+ $pass = $storage->checkClientCredentials('fakeclient', 'testpass');
+ $this->assertFalse($pass);
+
+ // invalid password
+ $pass = $storage->checkClientCredentials('oauth_test_client', 'invalidcredentials');
+ $this->assertFalse($pass);
+
+ // valid credentials
+ $pass = $storage->checkClientCredentials('oauth_test_client', 'testpass');
+ $this->assertTrue($pass);
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/ClientTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/ClientTest.php
new file mode 100644
index 000000000..6a5cc0b49
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/ClientTest.php
@@ -0,0 +1,110 @@
+<?php
+
+namespace OAuth2\Storage;
+
+class ClientTest extends BaseTest
+{
+ /** @dataProvider provideStorage */
+ public function testGetClientDetails(ClientInterface $storage)
+ {
+ if ($storage instanceof NullStorage) {
+ $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
+
+ return;
+ }
+
+ // nonexistant client_id
+ $details = $storage->getClientDetails('fakeclient');
+ $this->assertFalse($details);
+
+ // valid client_id
+ $details = $storage->getClientDetails('oauth_test_client');
+ $this->assertNotNull($details);
+ $this->assertArrayHasKey('client_id', $details);
+ $this->assertArrayHasKey('client_secret', $details);
+ $this->assertArrayHasKey('redirect_uri', $details);
+ }
+
+ /** @dataProvider provideStorage */
+ public function testCheckRestrictedGrantType(ClientInterface $storage)
+ {
+ if ($storage instanceof NullStorage) {
+ $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
+
+ return;
+ }
+
+ // Check invalid
+ $pass = $storage->checkRestrictedGrantType('oauth_test_client', 'authorization_code');
+ $this->assertFalse($pass);
+
+ // Check valid
+ $pass = $storage->checkRestrictedGrantType('oauth_test_client', 'implicit');
+ $this->assertTrue($pass);
+ }
+
+ /** @dataProvider provideStorage */
+ public function testGetAccessToken(ClientInterface $storage)
+ {
+ if ($storage instanceof NullStorage) {
+ $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
+
+ return;
+ }
+
+ // nonexistant client_id
+ $details = $storage->getAccessToken('faketoken');
+ $this->assertFalse($details);
+
+ // valid client_id
+ $details = $storage->getAccessToken('testtoken');
+ $this->assertNotNull($details);
+ }
+
+ /** @dataProvider provideStorage */
+ public function testIsPublicClient(ClientInterface $storage)
+ {
+ if ($storage instanceof NullStorage) {
+ $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
+
+ return;
+ }
+
+ $publicClientId = 'public-client-'.rand();
+ $confidentialClientId = 'confidential-client-'.rand();
+
+ // create a new client
+ $success1 = $storage->setClientDetails($publicClientId, '');
+ $success2 = $storage->setClientDetails($confidentialClientId, 'some-secret');
+ $this->assertTrue($success1);
+ $this->assertTrue($success2);
+
+ // assert isPublicClient for both
+ $this->assertTrue($storage->isPublicClient($publicClientId));
+ $this->assertFalse($storage->isPublicClient($confidentialClientId));
+ }
+
+ /** @dataProvider provideStorage */
+ public function testSaveClient(ClientInterface $storage)
+ {
+ if ($storage instanceof NullStorage) {
+ $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
+
+ return;
+ }
+
+ $clientId = 'some-client-'.rand();
+
+ // create a new client
+ $success = $storage->setClientDetails($clientId, 'somesecret', 'http://test.com', 'client_credentials', 'clientscope1', 'brent@brentertainment.com');
+ $this->assertTrue($success);
+
+ // valid client_id
+ $details = $storage->getClientDetails($clientId);
+ $this->assertEquals($details['client_secret'], 'somesecret');
+ $this->assertEquals($details['redirect_uri'], 'http://test.com');
+ $this->assertEquals($details['grant_types'], 'client_credentials');
+ $this->assertEquals($details['scope'], 'clientscope1');
+ $this->assertEquals($details['user_id'], 'brent@brentertainment.com');
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/DynamoDBTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/DynamoDBTest.php
new file mode 100644
index 000000000..2147f0914
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/DynamoDBTest.php
@@ -0,0 +1,40 @@
+<?php
+
+namespace OAuth2\Storage;
+
+class DynamoDBTest extends BaseTest
+{
+ public function testGetDefaultScope()
+ {
+ $client = $this->getMockBuilder('\Aws\DynamoDb\DynamoDbClient')
+ ->disableOriginalConstructor()
+ ->setMethods(array('query'))
+ ->getMock();
+
+ $return = $this->getMockBuilder('\Guzzle\Service\Resource\Model')
+ ->setMethods(array('count', 'toArray'))
+ ->getMock();
+
+ $data = array(
+ 'Items' => array(),
+ 'Count' => 0,
+ 'ScannedCount'=> 0
+ );
+
+ $return->expects($this->once())
+ ->method('count')
+ ->will($this->returnValue(count($data)));
+
+ $return->expects($this->once())
+ ->method('toArray')
+ ->will($this->returnValue($data));
+
+ // should return null default scope if none is set in database
+ $client->expects($this->once())
+ ->method('query')
+ ->will($this->returnValue($return));
+
+ $storage = new DynamoDB($client);
+ $this->assertNull($storage->getDefaultScope());
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/JwtAccessTokenTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/JwtAccessTokenTest.php
new file mode 100644
index 000000000..a6acbea1f
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/JwtAccessTokenTest.php
@@ -0,0 +1,41 @@
+<?php
+
+namespace OAuth2\Storage;
+
+use OAuth2\Encryption\Jwt;
+
+class JwtAccessTokenTest extends BaseTest
+{
+ /** @dataProvider provideStorage */
+ public function testSetAccessToken($storage)
+ {
+ if (!$storage instanceof PublicKey) {
+ // incompatible storage
+ return;
+ }
+
+ $crypto = new jwtAccessToken($storage);
+
+ $publicKeyStorage = Bootstrap::getInstance()->getMemoryStorage();
+ $encryptionUtil = new Jwt();
+
+ $jwtAccessToken = array(
+ 'access_token' => rand(),
+ 'expires' => time() + 100,
+ 'scope' => 'foo',
+ );
+
+ $token = $encryptionUtil->encode($jwtAccessToken, $storage->getPrivateKey(), $storage->getEncryptionAlgorithm());
+
+ $this->assertNotNull($token);
+
+ $tokenData = $crypto->getAccessToken($token);
+
+ $this->assertTrue(is_array($tokenData));
+
+ /* assert the decoded token is the same */
+ $this->assertEquals($tokenData['access_token'], $jwtAccessToken['access_token']);
+ $this->assertEquals($tokenData['expires'], $jwtAccessToken['expires']);
+ $this->assertEquals($tokenData['scope'], $jwtAccessToken['scope']);
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/JwtBearerTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/JwtBearerTest.php
new file mode 100644
index 000000000..d0ab9b899
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/JwtBearerTest.php
@@ -0,0 +1,25 @@
+<?php
+
+namespace OAuth2\Storage;
+
+class JwtBearerTest extends BaseTest
+{
+ /** @dataProvider provideStorage */
+ public function testGetClientKey(JwtBearerInterface $storage)
+ {
+ if ($storage instanceof NullStorage) {
+ $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
+
+ return;
+ }
+
+ // nonexistant client_id
+ $key = $storage->getClientKey('this-is-not-real', 'nor-is-this');
+ $this->assertFalse($key);
+
+ // valid client_id and subject
+ $key = $storage->getClientKey('oauth_test_client', 'test_subject');
+ $this->assertNotNull($key);
+ $this->assertEquals($key, Bootstrap::getInstance()->getTestPublicKey());
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/PdoTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/PdoTest.php
new file mode 100644
index 000000000..57eb39072
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/PdoTest.php
@@ -0,0 +1,39 @@
+<?php
+
+namespace OAuth2\Storage;
+
+class PdoTest extends BaseTest
+{
+ public function testCreatePdoStorageUsingPdoClass()
+ {
+ $pdo = new \PDO(sprintf('sqlite://%s', Bootstrap::getInstance()->getSqliteDir()));
+ $storage = new Pdo($pdo);
+
+ $this->assertNotNull($storage->getClientDetails('oauth_test_client'));
+ }
+
+ public function testCreatePdoStorageUsingDSN()
+ {
+ $dsn = sprintf('sqlite://%s', Bootstrap::getInstance()->getSqliteDir());
+ $storage = new Pdo($dsn);
+
+ $this->assertNotNull($storage->getClientDetails('oauth_test_client'));
+ }
+
+ public function testCreatePdoStorageUsingConfig()
+ {
+ $config = array('dsn' => sprintf('sqlite://%s', Bootstrap::getInstance()->getSqliteDir()));
+ $storage = new Pdo($config);
+
+ $this->assertNotNull($storage->getClientDetails('oauth_test_client'));
+ }
+
+ /**
+ * @expectedException InvalidArgumentException dsn
+ */
+ public function testCreatePdoStorageWithoutDSNThrowsException()
+ {
+ $config = array('username' => 'brent', 'password' => 'brentisaballer');
+ $storage = new Pdo($config);
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/PublicKeyTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/PublicKeyTest.php
new file mode 100644
index 000000000..f85195870
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/PublicKeyTest.php
@@ -0,0 +1,29 @@
+<?php
+
+namespace OAuth2\Storage;
+
+class PublicKeyTest extends BaseTest
+{
+ /** @dataProvider provideStorage */
+ public function testSetAccessToken($storage)
+ {
+ if ($storage instanceof NullStorage) {
+ $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
+
+ return;
+ }
+
+ if (!$storage instanceof PublicKeyInterface) {
+ // incompatible storage
+ return;
+ }
+
+ $configDir = Bootstrap::getInstance()->getConfigDir();
+ $globalPublicKey = file_get_contents($configDir.'/keys/id_rsa.pub');
+ $globalPrivateKey = file_get_contents($configDir.'/keys/id_rsa');
+
+ /* assert values from storage */
+ $this->assertEquals($storage->getPublicKey(), $globalPublicKey);
+ $this->assertEquals($storage->getPrivateKey(), $globalPrivateKey);
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/RefreshTokenTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/RefreshTokenTest.php
new file mode 100644
index 000000000..314c93195
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/RefreshTokenTest.php
@@ -0,0 +1,41 @@
+<?php
+
+namespace OAuth2\Storage;
+
+class RefreshTokenTest extends BaseTest
+{
+ /** @dataProvider provideStorage */
+ public function testSetRefreshToken(RefreshTokenInterface $storage)
+ {
+ if ($storage instanceof NullStorage) {
+ $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
+
+ return;
+ }
+
+ // assert token we are about to add does not exist
+ $token = $storage->getRefreshToken('refreshtoken');
+ $this->assertFalse($token);
+
+ // add new token
+ $expires = time() + 20;
+ $success = $storage->setRefreshToken('refreshtoken', 'client ID', 'SOMEUSERID', $expires);
+ $this->assertTrue($success);
+
+ $token = $storage->getRefreshToken('refreshtoken');
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('refresh_token', $token);
+ $this->assertArrayHasKey('client_id', $token);
+ $this->assertArrayHasKey('user_id', $token);
+ $this->assertArrayHasKey('expires', $token);
+ $this->assertEquals($token['refresh_token'], 'refreshtoken');
+ $this->assertEquals($token['client_id'], 'client ID');
+ $this->assertEquals($token['user_id'], 'SOMEUSERID');
+ $this->assertEquals($token['expires'], $expires);
+
+ // add token with scope having an empty string value
+ $expires = time() + 20;
+ $success = $storage->setRefreshToken('refreshtoken2', 'client ID', 'SOMEUSERID', $expires, '');
+ $this->assertTrue($success);
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/ScopeTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/ScopeTest.php
new file mode 100644
index 000000000..fd1edeb93
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/ScopeTest.php
@@ -0,0 +1,53 @@
+<?php
+
+namespace OAuth2\Storage;
+
+use OAuth2\Scope;
+
+class ScopeTest extends BaseTest
+{
+ /** @dataProvider provideStorage */
+ public function testScopeExists($storage)
+ {
+ if ($storage instanceof NullStorage) {
+ $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
+
+ return;
+ }
+
+ if (!$storage instanceof ScopeInterface) {
+ // incompatible storage
+ return;
+ }
+
+ //Test getting scopes
+ $scopeUtil = new Scope($storage);
+ $this->assertTrue($scopeUtil->scopeExists('supportedscope1'));
+ $this->assertTrue($scopeUtil->scopeExists('supportedscope1 supportedscope2 supportedscope3'));
+ $this->assertFalse($scopeUtil->scopeExists('fakescope'));
+ $this->assertFalse($scopeUtil->scopeExists('supportedscope1 supportedscope2 supportedscope3 fakescope'));
+ }
+
+ /** @dataProvider provideStorage */
+ public function testGetDefaultScope($storage)
+ {
+ if ($storage instanceof NullStorage) {
+ $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
+
+ return;
+ }
+
+ if (!$storage instanceof ScopeInterface) {
+ // incompatible storage
+ return;
+ }
+
+ // test getting default scope
+ $scopeUtil = new Scope($storage);
+ $expected = explode(' ', $scopeUtil->getDefaultScope());
+ $actual = explode(' ', 'defaultscope1 defaultscope2');
+ sort($expected);
+ sort($actual);
+ $this->assertEquals($expected, $actual);
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/UserCredentialsTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/UserCredentialsTest.php
new file mode 100644
index 000000000..65655a6b2
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/UserCredentialsTest.php
@@ -0,0 +1,40 @@
+<?php
+
+namespace OAuth2\Storage;
+
+class UserCredentialsTest extends BaseTest
+{
+ /** @dataProvider provideStorage */
+ public function testCheckUserCredentials(UserCredentialsInterface $storage)
+ {
+ if ($storage instanceof NullStorage) {
+ $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
+
+ return;
+ }
+
+ // create a new user for testing
+ $success = $storage->setUser('testusername', 'testpass', 'Test', 'User');
+ $this->assertTrue($success);
+
+ // correct credentials
+ $this->assertTrue($storage->checkUserCredentials('testusername', 'testpass'));
+ // invalid password
+ $this->assertFalse($storage->checkUserCredentials('testusername', 'fakepass'));
+ // invalid username
+ $this->assertFalse($storage->checkUserCredentials('fakeusername', 'testpass'));
+
+ // invalid username
+ $this->assertFalse($storage->getUserDetails('fakeusername'));
+
+ // ensure all properties are set
+ $user = $storage->getUserDetails('testusername');
+ $this->assertTrue($user !== false);
+ $this->assertArrayHasKey('user_id', $user);
+ $this->assertArrayHasKey('first_name', $user);
+ $this->assertArrayHasKey('last_name', $user);
+ $this->assertEquals($user['user_id'], 'testusername');
+ $this->assertEquals($user['first_name'], 'Test');
+ $this->assertEquals($user['last_name'], 'User');
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/TokenType/BearerTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/TokenType/BearerTest.php
new file mode 100644
index 000000000..a2e000e22
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/TokenType/BearerTest.php
@@ -0,0 +1,58 @@
+<?php
+
+namespace OAuth2\TokenType;
+
+use OAuth2\Request\TestRequest;
+use OAuth2\Response;
+
+class BearerTest extends \PHPUnit_Framework_TestCase
+{
+ public function testValidContentTypeWithCharset()
+ {
+ $bearer = new Bearer();
+ $request = TestRequest::createPost(array(
+ 'access_token' => 'ThisIsMyAccessToken'
+ ));
+ $request->server['CONTENT_TYPE'] = 'application/x-www-form-urlencoded; charset=UTF-8';
+
+ $param = $bearer->getAccessTokenParameter($request, $response = new Response());
+ $this->assertEquals($param, 'ThisIsMyAccessToken');
+ }
+
+ public function testInvalidContentType()
+ {
+ $bearer = new Bearer();
+ $request = TestRequest::createPost(array(
+ 'access_token' => 'ThisIsMyAccessToken'
+ ));
+ $request->server['CONTENT_TYPE'] = 'application/json; charset=UTF-8';
+
+ $param = $bearer->getAccessTokenParameter($request, $response = new Response());
+ $this->assertNull($param);
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_request');
+ $this->assertEquals($response->getParameter('error_description'), 'The content type for POST requests must be "application/x-www-form-urlencoded"');
+ }
+
+ public function testValidRequestUsingAuthorizationHeader()
+ {
+ $bearer = new Bearer();
+ $request = new TestRequest();
+ $request->headers['AUTHORIZATION'] = 'Bearer MyToken';
+ $request->server['CONTENT_TYPE'] = 'application/x-www-form-urlencoded; charset=UTF-8';
+
+ $param = $bearer->getAccessTokenParameter($request, $response = new Response());
+ $this->assertEquals('MyToken', $param);
+ }
+
+ public function testValidRequestUsingAuthorizationHeaderCaseInsensitive()
+ {
+ $bearer = new Bearer();
+ $request = new TestRequest();
+ $request->server['CONTENT_TYPE'] = 'application/x-www-form-urlencoded; charset=UTF-8';
+ $request->headers['Authorization'] = 'Bearer MyToken';
+
+ $param = $bearer->getAccessTokenParameter($request, $response = new Response());
+ $this->assertEquals('MyToken', $param);
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/bootstrap.php b/vendor/bshaffer/oauth2-server-php/test/bootstrap.php
new file mode 100644
index 000000000..0a4af0716
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/bootstrap.php
@@ -0,0 +1,12 @@
+<?php
+
+require_once(dirname(__FILE__).'/../src/OAuth2/Autoloader.php');
+OAuth2\Autoloader::register();
+
+// register test classes
+OAuth2\Autoloader::register(dirname(__FILE__).'/lib');
+
+// register vendors if possible
+if (file_exists(__DIR__.'/../vendor/autoload.php')) {
+ require_once(__DIR__.'/../vendor/autoload.php');
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/cleanup.php b/vendor/bshaffer/oauth2-server-php/test/cleanup.php
new file mode 100644
index 000000000..8663a901b
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/cleanup.php
@@ -0,0 +1,15 @@
+<?php
+
+require_once(dirname(__FILE__).'/../src/OAuth2/Autoloader.php');
+OAuth2\Autoloader::register();
+
+// register test classes
+OAuth2\Autoloader::register(dirname(__FILE__).'/lib');
+
+// register vendors if possible
+if (file_exists(__DIR__.'/../vendor/autoload.php')) {
+ require_once(__DIR__.'/../vendor/autoload.php');
+}
+
+// remove the dynamoDB database that was created for this build
+OAuth2\Storage\Bootstrap::getInstance()->cleanupTravisDynamoDb();
diff --git a/vendor/bshaffer/oauth2-server-php/test/config/keys/id_rsa b/vendor/bshaffer/oauth2-server-php/test/config/keys/id_rsa
new file mode 100644
index 000000000..e8b9eff2d
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/config/keys/id_rsa
@@ -0,0 +1,15 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIICXQIBAAKBgQC8fpi06NfVYHAOAnxNMVnTXr/ptsLsNjP+uAt2eO0cc5J9H5XV
+8lFVujOrRu/JWi1TDmAvOaf/6A3BphIA1Pwp0AAqlZdwizIum8j0KzpsGYH5qReN
+QDwF3oUSKMsQCCGCDHrDYifG/pRi9bN1ZVjEXPr35HJuBe+FQpZTs8DewwIDAQAB
+AoGARfNxNknmtx/n1bskZ/01iZRzAge6BLEE0LV6Q4gS7mkRZu/Oyiv39Sl5vUlA
++WdGxLjkBwKNjxGN8Vxw9/ASd8rSsqeAUYIwAeifXrHhj5DBPQT/pDPkeFnp9B1w
+C6jo+3AbBQ4/b0ONSIEnCL2xGGglSIAxO17T1ViXp7lzXPECQQDe63nkRdWM0OCb
+oaHQPT3E26224maIstrGFUdt9yw3yJf4bOF7TtiPLlLuHsTTge3z+fG6ntC0xG56
+1cl37C3ZAkEA2HdVcRGugNp/qmVz4LJTpD+WZKi73PLAO47wDOrYh9Pn2I6fcEH0
+CPnggt1ko4ujvGzFTvRH64HXa6aPCv1j+wJBAMQMah3VQPNf/DlDVFEUmw9XeBZg
+VHaifX851aEjgXLp6qVj9IYCmLiLsAmVa9rr6P7p8asD418nZlaHUHE0eDkCQQCr
+uxis6GMx1Ka971jcJX2X696LoxXPd0KsvXySMupv79yagKPa8mgBiwPjrnK+EPVo
+cj6iochA/bSCshP/mwFrAkBHEKPi6V6gb94JinCT7x3weahbdp6bJ6/nzBH/p9VA
+HoT1JtwNFhGv9BCjmDydshQHfSWpY9NxlccBKL7ITm8R
+-----END RSA PRIVATE KEY----- \ No newline at end of file
diff --git a/vendor/bshaffer/oauth2-server-php/test/config/keys/id_rsa.pub b/vendor/bshaffer/oauth2-server-php/test/config/keys/id_rsa.pub
new file mode 100644
index 000000000..1ac15f5eb
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/config/keys/id_rsa.pub
@@ -0,0 +1,16 @@
+-----BEGIN CERTIFICATE-----
+MIICiDCCAfGgAwIBAgIBADANBgkqhkiG9w0BAQQFADA9MQswCQYDVQQGEwJVUzEL
+MAkGA1UECBMCVVQxITAfBgNVBAoTGFZpZ25ldHRlIENvcnBvcmF0aW9uIFNCWDAe
+Fw0xMTEwMTUwMzE4MjdaFw0zMTEwMTAwMzE4MjdaMD0xCzAJBgNVBAYTAlVTMQsw
+CQYDVQQIEwJVVDEhMB8GA1UEChMYVmlnbmV0dGUgQ29ycG9yYXRpb24gU0JYMIGf
+MA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8fpi06NfVYHAOAnxNMVnTXr/ptsLs
+NjP+uAt2eO0cc5J9H5XV8lFVujOrRu/JWi1TDmAvOaf/6A3BphIA1Pwp0AAqlZdw
+izIum8j0KzpsGYH5qReNQDwF3oUSKMsQCCGCDHrDYifG/pRi9bN1ZVjEXPr35HJu
+Be+FQpZTs8DewwIDAQABo4GXMIGUMB0GA1UdDgQWBBRe8hrEXm+Yim4YlD5Nx+1K
+vCYs9DBlBgNVHSMEXjBcgBRe8hrEXm+Yim4YlD5Nx+1KvCYs9KFBpD8wPTELMAkG
+A1UEBhMCVVMxCzAJBgNVBAgTAlVUMSEwHwYDVQQKExhWaWduZXR0ZSBDb3Jwb3Jh
+dGlvbiBTQliCAQAwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQBjhyRD
+lM7vnLn6drgQVftW5V9nDFAyPAuiGvMIKFSbiAf1PxXCRn5sfJquwWKsJUi4ZGNl
+aViXdFmN6/F13PSM+yg63tpKy0fYqMbTM+Oe5WuSHkSW1VuYNHV+24adgNk/FRDL
+FRrlM1f6s9VTLWvwGItjfrof0Ba8Uq7ZDSb9Xg==
+-----END CERTIFICATE----- \ No newline at end of file
diff --git a/vendor/bshaffer/oauth2-server-php/test/config/storage.json b/vendor/bshaffer/oauth2-server-php/test/config/storage.json
new file mode 100644
index 000000000..52d3f2399
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/config/storage.json
@@ -0,0 +1,188 @@
+{
+ "authorization_codes": {
+ "testcode": {
+ "client_id": "Test Client ID",
+ "user_id": "",
+ "redirect_uri": "",
+ "expires": "9999999999",
+ "id_token": "IDTOKEN"
+ },
+ "testcode-with-scope": {
+ "client_id": "Test Client ID",
+ "user_id": "",
+ "redirect_uri": "",
+ "expires": "9999999999",
+ "scope": "scope1 scope2"
+ },
+ "testcode-expired": {
+ "client_id": "Test Client ID",
+ "user_id": "",
+ "redirect_uri": "",
+ "expires": "1356998400"
+ },
+ "testcode-empty-secret": {
+ "client_id": "Test Client ID Empty Secret",
+ "user_id": "",
+ "redirect_uri": "",
+ "expires": "9999999999"
+ },
+ "testcode-openid": {
+ "client_id": "Test Client ID",
+ "user_id": "",
+ "redirect_uri": "",
+ "expires": "9999999999",
+ "id_token": "test_id_token"
+ },
+ "testcode-redirect-uri": {
+ "client_id": "Test Client ID",
+ "user_id": "",
+ "redirect_uri": "http://brentertainment.com/voil%C3%A0",
+ "expires": "9999999999",
+ "id_token": "IDTOKEN"
+ }
+ },
+ "client_credentials" : {
+ "Test Client ID": {
+ "client_secret": "TestSecret"
+ },
+ "Test Client ID with Redirect Uri": {
+ "client_secret": "TestSecret2",
+ "redirect_uri": "http://brentertainment.com"
+ },
+ "Test Client ID with Buggy Redirect Uri": {
+ "client_secret": "TestSecret2",
+ "redirect_uri": " http://brentertainment.com"
+ },
+ "Test Client ID with Multiple Redirect Uris": {
+ "client_secret": "TestSecret3",
+ "redirect_uri": "http://brentertainment.com http://morehazards.com"
+ },
+ "Test Client ID with Redirect Uri Parts": {
+ "client_secret": "TestSecret4",
+ "redirect_uri": "http://user:pass@brentertainment.com:2222/authorize/cb?auth_type=oauth&test=true"
+ },
+ "Test Some Other Client": {
+ "client_secret": "TestSecret3"
+ },
+ "Test Client ID Empty Secret": {
+ "client_secret": ""
+ },
+ "Test Client ID For Password Grant": {
+ "grant_types": "password",
+ "client_secret": ""
+ },
+ "Client ID With User ID": {
+ "client_secret": "TestSecret",
+ "user_id": "brent@brentertainment.com"
+ },
+ "oauth_test_client": {
+ "client_secret": "testpass",
+ "grant_types": "implicit password"
+ }
+ },
+ "user_credentials" : {
+ "test-username": {
+ "password": "testpass"
+ },
+ "testusername": {
+ "password": "testpass"
+ },
+ "testuser": {
+ "password": "password",
+ "email": "testuser@test.com",
+ "email_verified": true
+ },
+ "johndoe": {
+ "password": "password"
+ }
+ },
+ "refresh_tokens" : {
+ "test-refreshtoken": {
+ "refresh_token": "test-refreshtoken",
+ "client_id": "Test Client ID",
+ "user_id": "test-username",
+ "expires": 0,
+ "scope": null
+ },
+ "test-refreshtoken-with-scope": {
+ "refresh_token": "test-refreshtoken",
+ "client_id": "Test Client ID",
+ "user_id": "test-username",
+ "expires": 0,
+ "scope": "scope1 scope2"
+ }
+ },
+ "access_tokens" : {
+ "accesstoken-expired": {
+ "access_token": "accesstoken-expired",
+ "client_id": "Test Client ID",
+ "expires": 1234567,
+ "scope": null
+ },
+ "accesstoken-scope": {
+ "access_token": "accesstoken-scope",
+ "client_id": "Test Client ID",
+ "expires": 99999999900,
+ "scope": "testscope"
+ },
+ "accesstoken-openid-connect": {
+ "access_token": "accesstoken-openid-connect",
+ "client_id": "Test Client ID",
+ "user_id": "testuser",
+ "expires": 99999999900,
+ "scope": "openid email"
+ },
+ "accesstoken-malformed": {
+ "access_token": "accesstoken-mallformed",
+ "expires": 99999999900,
+ "scope": "testscope"
+ }
+ },
+ "jwt": {
+ "Test Client ID": {
+ "key": "-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC5/SxVlE8gnpFqCxgl2wjhzY7u\ncEi00s0kUg3xp7lVEvgLgYcAnHiWp+gtSjOFfH2zsvpiWm6Lz5f743j/FEzHIO1o\nwR0p4d9pOaJK07d01+RzoQLOIQAgXrr4T1CCWUesncwwPBVCyy2Mw3Nmhmr9MrF8\nUlvdRKBxriRnlP3qJQIDAQAB\n-----END PUBLIC KEY-----",
+ "subject": "testuser@ourdomain.com"
+ },
+ "Test Client ID PHP-5.2": {
+ "key": "mysecretkey",
+ "subject": "testuser@ourdomain.com"
+ },
+ "Missing Key Client": {
+ "key": null,
+ "subject": "testuser@ourdomain.com"
+ },
+ "Missing Key Client PHP-5.2": {
+ "key": null,
+ "subject": "testuser@ourdomain.com"
+ },
+ "oauth_test_client": {
+ "key": "-----BEGIN CERTIFICATE-----\nMIICiDCCAfGgAwIBAgIBADANBgkqhkiG9w0BAQQFADA9MQswCQYDVQQGEwJVUzEL\nMAkGA1UECBMCVVQxITAfBgNVBAoTGFZpZ25ldHRlIENvcnBvcmF0aW9uIFNCWDAe\nFw0xMTEwMTUwMzE4MjdaFw0zMTEwMTAwMzE4MjdaMD0xCzAJBgNVBAYTAlVTMQsw\nCQYDVQQIEwJVVDEhMB8GA1UEChMYVmlnbmV0dGUgQ29ycG9yYXRpb24gU0JYMIGf\nMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8fpi06NfVYHAOAnxNMVnTXr/ptsLs\nNjP+uAt2eO0cc5J9H5XV8lFVujOrRu/JWi1TDmAvOaf/6A3BphIA1Pwp0AAqlZdw\nizIum8j0KzpsGYH5qReNQDwF3oUSKMsQCCGCDHrDYifG/pRi9bN1ZVjEXPr35HJu\nBe+FQpZTs8DewwIDAQABo4GXMIGUMB0GA1UdDgQWBBRe8hrEXm+Yim4YlD5Nx+1K\nvCYs9DBlBgNVHSMEXjBcgBRe8hrEXm+Yim4YlD5Nx+1KvCYs9KFBpD8wPTELMAkG\nA1UEBhMCVVMxCzAJBgNVBAgTAlVUMSEwHwYDVQQKExhWaWduZXR0ZSBDb3Jwb3Jh\ndGlvbiBTQliCAQAwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQBjhyRD\nlM7vnLn6drgQVftW5V9nDFAyPAuiGvMIKFSbiAf1PxXCRn5sfJquwWKsJUi4ZGNl\naViXdFmN6/F13PSM+yg63tpKy0fYqMbTM+Oe5WuSHkSW1VuYNHV+24adgNk/FRDL\nFRrlM1f6s9VTLWvwGItjfrof0Ba8Uq7ZDSb9Xg==\n-----END CERTIFICATE-----",
+ "subject": "test_subject"
+ }
+ },
+ "jti": [
+ {
+ "issuer": "Test Client ID",
+ "subject": "testuser@ourdomain.com",
+ "audience": "http://myapp.com/oauth/auth",
+ "expires": 99999999900,
+ "jti": "used_jti"
+ }
+ ],
+ "supported_scopes" : [
+ "scope1",
+ "scope2",
+ "scope3",
+ "clientscope1",
+ "clientscope2",
+ "clientscope3",
+ "supportedscope1",
+ "supportedscope2",
+ "supportedscope3",
+ "supportedscope4"
+ ],
+ "keys": {
+ "public_key": "-----BEGIN CERTIFICATE-----\nMIICiDCCAfGgAwIBAgIBADANBgkqhkiG9w0BAQQFADA9MQswCQYDVQQGEwJVUzEL\nMAkGA1UECBMCVVQxITAfBgNVBAoTGFZpZ25ldHRlIENvcnBvcmF0aW9uIFNCWDAe\nFw0xMTEwMTUwMzE4MjdaFw0zMTEwMTAwMzE4MjdaMD0xCzAJBgNVBAYTAlVTMQsw\nCQYDVQQIEwJVVDEhMB8GA1UEChMYVmlnbmV0dGUgQ29ycG9yYXRpb24gU0JYMIGf\nMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8fpi06NfVYHAOAnxNMVnTXr/ptsLs\nNjP+uAt2eO0cc5J9H5XV8lFVujOrRu/JWi1TDmAvOaf/6A3BphIA1Pwp0AAqlZdw\nizIum8j0KzpsGYH5qReNQDwF3oUSKMsQCCGCDHrDYifG/pRi9bN1ZVjEXPr35HJu\nBe+FQpZTs8DewwIDAQABo4GXMIGUMB0GA1UdDgQWBBRe8hrEXm+Yim4YlD5Nx+1K\nvCYs9DBlBgNVHSMEXjBcgBRe8hrEXm+Yim4YlD5Nx+1KvCYs9KFBpD8wPTELMAkG\nA1UEBhMCVVMxCzAJBgNVBAgTAlVUMSEwHwYDVQQKExhWaWduZXR0ZSBDb3Jwb3Jh\ndGlvbiBTQliCAQAwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQBjhyRD\nlM7vnLn6drgQVftW5V9nDFAyPAuiGvMIKFSbiAf1PxXCRn5sfJquwWKsJUi4ZGNl\naViXdFmN6/F13PSM+yg63tpKy0fYqMbTM+Oe5WuSHkSW1VuYNHV+24adgNk/FRDL\nFRrlM1f6s9VTLWvwGItjfrof0Ba8Uq7ZDSb9Xg==\n-----END CERTIFICATE-----",
+ "private_key": "-----BEGIN RSA PRIVATE KEY-----\nMIICXQIBAAKBgQC8fpi06NfVYHAOAnxNMVnTXr/ptsLsNjP+uAt2eO0cc5J9H5XV\n8lFVujOrRu/JWi1TDmAvOaf/6A3BphIA1Pwp0AAqlZdwizIum8j0KzpsGYH5qReN\nQDwF3oUSKMsQCCGCDHrDYifG/pRi9bN1ZVjEXPr35HJuBe+FQpZTs8DewwIDAQAB\nAoGARfNxNknmtx/n1bskZ/01iZRzAge6BLEE0LV6Q4gS7mkRZu/Oyiv39Sl5vUlA\n+WdGxLjkBwKNjxGN8Vxw9/ASd8rSsqeAUYIwAeifXrHhj5DBPQT/pDPkeFnp9B1w\nC6jo+3AbBQ4/b0ONSIEnCL2xGGglSIAxO17T1ViXp7lzXPECQQDe63nkRdWM0OCb\noaHQPT3E26224maIstrGFUdt9yw3yJf4bOF7TtiPLlLuHsTTge3z+fG6ntC0xG56\n1cl37C3ZAkEA2HdVcRGugNp/qmVz4LJTpD+WZKi73PLAO47wDOrYh9Pn2I6fcEH0\nCPnggt1ko4ujvGzFTvRH64HXa6aPCv1j+wJBAMQMah3VQPNf/DlDVFEUmw9XeBZg\nVHaifX851aEjgXLp6qVj9IYCmLiLsAmVa9rr6P7p8asD418nZlaHUHE0eDkCQQCr\nuxis6GMx1Ka971jcJX2X696LoxXPd0KsvXySMupv79yagKPa8mgBiwPjrnK+EPVo\ncj6iochA/bSCshP/mwFrAkBHEKPi6V6gb94JinCT7x3weahbdp6bJ6/nzBH/p9VA\nHoT1JtwNFhGv9BCjmDydshQHfSWpY9NxlccBKL7ITm8R\n-----END RSA PRIVATE KEY-----"
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/lib/OAuth2/Request/TestRequest.php b/vendor/bshaffer/oauth2-server-php/test/lib/OAuth2/Request/TestRequest.php
new file mode 100644
index 000000000..7bbce28a4
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/lib/OAuth2/Request/TestRequest.php
@@ -0,0 +1,61 @@
+<?php
+
+namespace OAuth2\Request;
+
+use OAuth2\Request;
+use OAuth2\RequestInterface;
+
+/**
+*
+*/
+class TestRequest extends Request implements RequestInterface
+{
+ public $query, $request, $server, $headers;
+
+ public function __construct()
+ {
+ $this->query = $_GET;
+ $this->request = $_POST;
+ $this->server = $_SERVER;
+ $this->headers = array();
+ }
+
+ public function query($name, $default = null)
+ {
+ return isset($this->query[$name]) ? $this->query[$name] : $default;
+ }
+
+ public function request($name, $default = null)
+ {
+ return isset($this->request[$name]) ? $this->request[$name] : $default;
+ }
+
+ public function server($name, $default = null)
+ {
+ return isset($this->server[$name]) ? $this->server[$name] : $default;
+ }
+
+ public function getAllQueryParameters()
+ {
+ return $this->query;
+ }
+
+ public function setQuery(array $query)
+ {
+ $this->query = $query;
+ }
+
+ public function setPost(array $params)
+ {
+ $this->server['REQUEST_METHOD'] = 'POST';
+ $this->request = $params;
+ }
+
+ public static function createPost(array $params = array())
+ {
+ $request = new self();
+ $request->setPost($params);
+
+ return $request;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/lib/OAuth2/Storage/BaseTest.php b/vendor/bshaffer/oauth2-server-php/test/lib/OAuth2/Storage/BaseTest.php
new file mode 100755
index 000000000..f0b1274a2
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/lib/OAuth2/Storage/BaseTest.php
@@ -0,0 +1,36 @@
+<?php
+
+namespace OAuth2\Storage;
+
+abstract class BaseTest extends \PHPUnit_Framework_TestCase
+{
+ public function provideStorage()
+ {
+ $memory = Bootstrap::getInstance()->getMemoryStorage();
+ $sqlite = Bootstrap::getInstance()->getSqlitePdo();
+ $mysql = Bootstrap::getInstance()->getMysqlPdo();
+ $postgres = Bootstrap::getInstance()->getPostgresPdo();
+ $mongo = Bootstrap::getInstance()->getMongo();
+ $mongoDb = Bootstrap::getInstance()->getMongoDB();
+ $redis = Bootstrap::getInstance()->getRedisStorage();
+ $cassandra = Bootstrap::getInstance()->getCassandraStorage();
+ $dynamodb = Bootstrap::getInstance()->getDynamoDbStorage();
+ $couchbase = Bootstrap::getInstance()->getCouchbase();
+
+ /* hack until we can fix "default_scope" dependencies in other tests */
+ $memory->defaultScope = 'defaultscope1 defaultscope2';
+
+ return array(
+ array($memory),
+ array($sqlite),
+ array($mysql),
+ array($postgres),
+ array($mongo),
+ array($mongoDb),
+ array($redis),
+ array($cassandra),
+ array($dynamodb),
+ array($couchbase),
+ );
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/lib/OAuth2/Storage/Bootstrap.php b/vendor/bshaffer/oauth2-server-php/test/lib/OAuth2/Storage/Bootstrap.php
new file mode 100755
index 000000000..3d7bdd4e9
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/lib/OAuth2/Storage/Bootstrap.php
@@ -0,0 +1,967 @@
+<?php
+
+namespace OAuth2\Storage;
+
+class Bootstrap
+{
+ const DYNAMODB_PHP_VERSION = 'none';
+
+ protected static $instance;
+ private $mysql;
+ private $sqlite;
+ private $postgres;
+ private $mongo;
+ private $mongoDb;
+ private $redis;
+ private $cassandra;
+ private $configDir;
+ private $dynamodb;
+ private $couchbase;
+
+ public function __construct()
+ {
+ $this->configDir = __DIR__.'/../../../config';
+ }
+
+ public static function getInstance()
+ {
+ if (!self::$instance) {
+ self::$instance = new self();
+ }
+
+ return self::$instance;
+ }
+
+ public function getSqlitePdo()
+ {
+ if (!$this->sqlite) {
+ $this->removeSqliteDb();
+ $pdo = new \PDO(sprintf('sqlite://%s', $this->getSqliteDir()));
+ $pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
+ $this->createSqliteDb($pdo);
+
+ $this->sqlite = new Pdo($pdo);
+ }
+
+ return $this->sqlite;
+ }
+
+ public function getPostgresPdo()
+ {
+ if (!$this->postgres) {
+ if (in_array('pgsql', \PDO::getAvailableDrivers())) {
+ $this->removePostgresDb();
+ $this->createPostgresDb();
+ if ($pdo = $this->getPostgresDriver()) {
+ $pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
+ $this->populatePostgresDb($pdo);
+ $this->postgres = new Pdo($pdo);
+ }
+ } else {
+ $this->postgres = new NullStorage('Postgres', 'Missing postgres PDO extension.');
+ }
+ }
+
+ return $this->postgres;
+ }
+
+ public function getPostgresDriver()
+ {
+ try {
+ $pdo = new \PDO('pgsql:host=localhost;dbname=oauth2_server_php', 'postgres');
+
+ return $pdo;
+ } catch (\PDOException $e) {
+ $this->postgres = new NullStorage('Postgres', $e->getMessage());
+ }
+ }
+
+ public function getMemoryStorage()
+ {
+ return new Memory(json_decode(file_get_contents($this->configDir. '/storage.json'), true));
+ }
+
+ public function getRedisStorage()
+ {
+ if (!$this->redis) {
+ if (class_exists('Predis\Client')) {
+ $redis = new \Predis\Client();
+ if ($this->testRedisConnection($redis)) {
+ $redis->flushdb();
+ $this->redis = new Redis($redis);
+ $this->createRedisDb($this->redis);
+ } else {
+ $this->redis = new NullStorage('Redis', 'Unable to connect to redis server on port 6379');
+ }
+ } else {
+ $this->redis = new NullStorage('Redis', 'Missing redis library. Please run "composer.phar require predis/predis:dev-master"');
+ }
+ }
+
+ return $this->redis;
+ }
+
+ private function testRedisConnection(\Predis\Client $redis)
+ {
+ try {
+ $redis->connect();
+ } catch (\Predis\CommunicationException $exception) {
+ // we were unable to connect to the redis server
+ return false;
+ }
+
+ return true;
+ }
+
+ public function getMysqlPdo()
+ {
+ if (!$this->mysql) {
+ $pdo = null;
+ try {
+ $pdo = new \PDO('mysql:host=localhost;', 'root');
+ } catch (\PDOException $e) {
+ $this->mysql = new NullStorage('MySQL', 'Unable to connect to MySQL on root@localhost');
+ }
+
+ if ($pdo) {
+ $pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
+ $this->removeMysqlDb($pdo);
+ $this->createMysqlDb($pdo);
+
+ $this->mysql = new Pdo($pdo);
+ }
+ }
+
+ return $this->mysql;
+ }
+
+ public function getMongo()
+ {
+ if (!$this->mongo) {
+ if (class_exists('MongoClient')) {
+ $mongo = new \MongoClient('mongodb://localhost:27017', array('connect' => false));
+ if ($this->testMongoConnection($mongo)) {
+ $db = $mongo->oauth2_server_php_legacy;
+ $this->removeMongo($db);
+ $this->createMongo($db);
+
+ $this->mongo = new Mongo($db);
+ } else {
+ $this->mongo = new NullStorage('Mongo', 'Unable to connect to mongo server on "localhost:27017"');
+ }
+ } else {
+ $this->mongo = new NullStorage('Mongo', 'Missing mongo php extension. Please install mongo.so');
+ }
+ }
+
+ return $this->mongo;
+ }
+
+ public function getMongoDb()
+ {
+ if (!$this->mongoDb) {
+ if (class_exists('MongoDB\Client')) {
+ $mongoDb = new \MongoDB\Client('mongodb://localhost:27017');
+ if ($this->testMongoDBConnection($mongoDb)) {
+ $db = $mongoDb->oauth2_server_php;
+ $this->removeMongoDb($db);
+ $this->createMongoDb($db);
+
+ $this->mongoDb = new MongoDB($db);
+ } else {
+ $this->mongoDb = new NullStorage('MongoDB', 'Unable to connect to mongo server on "localhost:27017"');
+ }
+ } else {
+ $this->mongoDb = new NullStorage('MongoDB', 'Missing MongoDB php extension. Please install mongodb.so');
+ }
+ }
+
+ return $this->mongoDb;
+ }
+
+ private function testMongoConnection(\MongoClient $mongo)
+ {
+ try {
+ $mongo->connect();
+ } catch (\MongoConnectionException $e) {
+ return false;
+ }
+
+ return true;
+ }
+
+ private function testMongoDBConnection(\MongoDB\Client $mongo)
+ {
+ return true;
+ }
+
+ public function getCouchbase()
+ {
+ if (!$this->couchbase) {
+ if ($this->getEnvVar('SKIP_COUCHBASE_TESTS')) {
+ $this->couchbase = new NullStorage('Couchbase', 'Skipping Couchbase tests');
+ } elseif (!class_exists('Couchbase')) {
+ $this->couchbase = new NullStorage('Couchbase', 'Missing Couchbase php extension. Please install couchbase.so');
+ } else {
+ // round-about way to make sure couchbase is working
+ // this is required because it throws a "floating point exception" otherwise
+ $code = "new \Couchbase(array('localhost:8091'), '', '', 'auth', false);";
+ $exec = sprintf('php -r "%s"', $code);
+ $ret = exec($exec, $test, $var);
+ if ($ret != 0) {
+ $couchbase = new \Couchbase(array('localhost:8091'), '', '', 'auth', false);
+ if ($this->testCouchbaseConnection($couchbase)) {
+ $this->clearCouchbase($couchbase);
+ $this->createCouchbaseDB($couchbase);
+
+ $this->couchbase = new CouchbaseDB($couchbase);
+ } else {
+ $this->couchbase = new NullStorage('Couchbase', 'Unable to connect to Couchbase server on "localhost:8091"');
+ }
+ } else {
+ $this->couchbase = new NullStorage('Couchbase', 'Error while trying to connect to Couchbase');
+ }
+ }
+ }
+
+ return $this->couchbase;
+ }
+
+ private function testCouchbaseConnection(\Couchbase $couchbase)
+ {
+ try {
+ if (count($couchbase->getServers()) > 0) {
+ return true;
+ }
+ } catch (\CouchbaseException $e) {
+ return false;
+ }
+
+ return true;
+ }
+
+ public function getCassandraStorage()
+ {
+ if (!$this->cassandra) {
+ if (class_exists('phpcassa\ColumnFamily')) {
+ $cassandra = new \phpcassa\Connection\ConnectionPool('oauth2_test', array('127.0.0.1:9160'));
+ if ($this->testCassandraConnection($cassandra)) {
+ $this->removeCassandraDb();
+ $this->cassandra = new Cassandra($cassandra);
+ $this->createCassandraDb($this->cassandra);
+ } else {
+ $this->cassandra = new NullStorage('Cassandra', 'Unable to connect to cassandra server on "127.0.0.1:9160"');
+ }
+ } else {
+ $this->cassandra = new NullStorage('Cassandra', 'Missing cassandra library. Please run "composer.phar require thobbs/phpcassa:dev-master"');
+ }
+ }
+
+ return $this->cassandra;
+ }
+
+ private function testCassandraConnection(\phpcassa\Connection\ConnectionPool $cassandra)
+ {
+ try {
+ new \phpcassa\SystemManager('localhost:9160');
+ } catch (\Exception $e) {
+ return false;
+ }
+
+ return true;
+ }
+
+ private function removeCassandraDb()
+ {
+ $sys = new \phpcassa\SystemManager('localhost:9160');
+
+ try {
+ $sys->drop_keyspace('oauth2_test');
+ } catch (\cassandra\InvalidRequestException $e) {
+
+ }
+ }
+
+ private function createCassandraDb(Cassandra $storage)
+ {
+ // create the cassandra keyspace and column family
+ $sys = new \phpcassa\SystemManager('localhost:9160');
+
+ $sys->create_keyspace('oauth2_test', array(
+ "strategy_class" => \phpcassa\Schema\StrategyClass::SIMPLE_STRATEGY,
+ "strategy_options" => array('replication_factor' => '1')
+ ));
+
+ $sys->create_column_family('oauth2_test', 'auth');
+ $cassandra = new \phpcassa\Connection\ConnectionPool('oauth2_test', array('127.0.0.1:9160'));
+ $cf = new \phpcassa\ColumnFamily($cassandra, 'auth');
+
+ // populate the data
+ $storage->setClientDetails("oauth_test_client", "testpass", "http://example.com", 'implicit password');
+ $storage->setAccessToken("testtoken", "Some Client", '', time() + 1000);
+ $storage->setAuthorizationCode("testcode", "Some Client", '', '', time() + 1000);
+
+ $storage->setScope('supportedscope1 supportedscope2 supportedscope3 supportedscope4');
+ $storage->setScope('defaultscope1 defaultscope2', null, 'default');
+
+ $storage->setScope('clientscope1 clientscope2', 'Test Client ID');
+ $storage->setScope('clientscope1 clientscope2', 'Test Client ID', 'default');
+
+ $storage->setScope('clientscope1 clientscope2 clientscope3', 'Test Client ID 2');
+ $storage->setScope('clientscope1 clientscope2', 'Test Client ID 2', 'default');
+
+ $storage->setScope('clientscope1 clientscope2', 'Test Default Scope Client ID');
+ $storage->setScope('clientscope1 clientscope2', 'Test Default Scope Client ID', 'default');
+
+ $storage->setScope('clientscope1 clientscope2 clientscope3', 'Test Default Scope Client ID 2');
+ $storage->setScope('clientscope3', 'Test Default Scope Client ID 2', 'default');
+
+ $storage->setClientKey('oauth_test_client', $this->getTestPublicKey(), 'test_subject');
+
+ $cf->insert("oauth_public_keys:ClientID_One", array('__data' => json_encode(array("public_key" => "client_1_public", "private_key" => "client_1_private", "encryption_algorithm" => "RS256"))));
+ $cf->insert("oauth_public_keys:ClientID_Two", array('__data' => json_encode(array("public_key" => "client_2_public", "private_key" => "client_2_private", "encryption_algorithm" => "RS256"))));
+ $cf->insert("oauth_public_keys:", array('__data' => json_encode(array("public_key" => $this->getTestPublicKey(), "private_key" => $this->getTestPrivateKey(), "encryption_algorithm" => "RS256"))));
+
+ $cf->insert("oauth_users:testuser", array('__data' =>json_encode(array("password" => "password", "email" => "testuser@test.com", "email_verified" => true))));
+
+ }
+
+ private function createSqliteDb(\PDO $pdo)
+ {
+ $this->runPdoSql($pdo);
+ }
+
+ private function removeSqliteDb()
+ {
+ if (file_exists($this->getSqliteDir())) {
+ unlink($this->getSqliteDir());
+ }
+ }
+
+ private function createMysqlDb(\PDO $pdo)
+ {
+ $pdo->exec('CREATE DATABASE oauth2_server_php');
+ $pdo->exec('USE oauth2_server_php');
+ $this->runPdoSql($pdo);
+ }
+
+ private function removeMysqlDb(\PDO $pdo)
+ {
+ $pdo->exec('DROP DATABASE IF EXISTS oauth2_server_php');
+ }
+
+ private function createPostgresDb()
+ {
+ if (!`psql postgres -tAc "SELECT 1 FROM pg_roles WHERE rolname='postgres'"`) {
+ `createuser -s -r postgres`;
+ }
+
+ `createdb -O postgres oauth2_server_php`;
+ }
+
+ private function populatePostgresDb(\PDO $pdo)
+ {
+ $this->runPdoSql($pdo);
+ }
+
+ private function removePostgresDb()
+ {
+ if (trim(`psql -l | grep oauth2_server_php | wc -l`)) {
+ `dropdb oauth2_server_php`;
+ }
+ }
+
+ public function runPdoSql(\PDO $pdo)
+ {
+ $storage = new Pdo($pdo);
+ foreach (explode(';', $storage->getBuildSql()) as $statement) {
+ $result = $pdo->exec($statement);
+ }
+
+ // set up scopes
+ $sql = 'INSERT INTO oauth_scopes (scope) VALUES (?)';
+ foreach (explode(' ', 'supportedscope1 supportedscope2 supportedscope3 supportedscope4 clientscope1 clientscope2 clientscope3') as $supportedScope) {
+ $pdo->prepare($sql)->execute(array($supportedScope));
+ }
+
+ $sql = 'INSERT INTO oauth_scopes (scope, is_default) VALUES (?, ?)';
+ foreach (array('defaultscope1', 'defaultscope2') as $defaultScope) {
+ $pdo->prepare($sql)->execute(array($defaultScope, true));
+ }
+
+ // set up clients
+ $sql = 'INSERT INTO oauth_clients (client_id, client_secret, scope, grant_types) VALUES (?, ?, ?, ?)';
+ $pdo->prepare($sql)->execute(array('Test Client ID', 'TestSecret', 'clientscope1 clientscope2', null));
+ $pdo->prepare($sql)->execute(array('Test Client ID 2', 'TestSecret', 'clientscope1 clientscope2 clientscope3', null));
+ $pdo->prepare($sql)->execute(array('Test Default Scope Client ID', 'TestSecret', 'clientscope1 clientscope2', null));
+ $pdo->prepare($sql)->execute(array('oauth_test_client', 'testpass', null, 'implicit password'));
+
+ // set up misc
+ $sql = 'INSERT INTO oauth_access_tokens (access_token, client_id, expires, user_id) VALUES (?, ?, ?, ?)';
+ $pdo->prepare($sql)->execute(array('testtoken', 'Some Client', date('Y-m-d H:i:s', strtotime('+1 hour')), null));
+ $pdo->prepare($sql)->execute(array('accesstoken-openid-connect', 'Some Client', date('Y-m-d H:i:s', strtotime('+1 hour')), 'testuser'));
+
+ $sql = 'INSERT INTO oauth_authorization_codes (authorization_code, client_id, expires) VALUES (?, ?, ?)';
+ $pdo->prepare($sql)->execute(array('testcode', 'Some Client', date('Y-m-d H:i:s', strtotime('+1 hour'))));
+
+ $sql = 'INSERT INTO oauth_users (username, password, email, email_verified) VALUES (?, ?, ?, ?)';
+ $pdo->prepare($sql)->execute(array('testuser', 'password', 'testuser@test.com', true));
+
+ $sql = 'INSERT INTO oauth_public_keys (client_id, public_key, private_key, encryption_algorithm) VALUES (?, ?, ?, ?)';
+ $pdo->prepare($sql)->execute(array('ClientID_One', 'client_1_public', 'client_1_private', 'RS256'));
+ $pdo->prepare($sql)->execute(array('ClientID_Two', 'client_2_public', 'client_2_private', 'RS256'));
+
+ $sql = 'INSERT INTO oauth_public_keys (client_id, public_key, private_key, encryption_algorithm) VALUES (?, ?, ?, ?)';
+ $pdo->prepare($sql)->execute(array(null, $this->getTestPublicKey(), $this->getTestPrivateKey(), 'RS256'));
+
+ $sql = 'INSERT INTO oauth_jwt (client_id, subject, public_key) VALUES (?, ?, ?)';
+ $pdo->prepare($sql)->execute(array('oauth_test_client', 'test_subject', $this->getTestPublicKey()));
+ }
+
+ public function getSqliteDir()
+ {
+ return $this->configDir. '/test.sqlite';
+ }
+
+ public function getConfigDir()
+ {
+ return $this->configDir;
+ }
+
+ private function createCouchbaseDB(\Couchbase $db)
+ {
+ $db->set('oauth_clients-oauth_test_client',json_encode(array(
+ 'client_id' => "oauth_test_client",
+ 'client_secret' => "testpass",
+ 'redirect_uri' => "http://example.com",
+ 'grant_types' => 'implicit password'
+ )));
+
+ $db->set('oauth_access_tokens-testtoken',json_encode(array(
+ 'access_token' => "testtoken",
+ 'client_id' => "Some Client"
+ )));
+
+ $db->set('oauth_authorization_codes-testcode',json_encode(array(
+ 'access_token' => "testcode",
+ 'client_id' => "Some Client"
+ )));
+
+ $db->set('oauth_users-testuser',json_encode(array(
+ 'username' => 'testuser',
+ 'password' => 'password',
+ 'email' => 'testuser@test.com',
+ 'email_verified' => true,
+ )));
+
+ $db->set('oauth_jwt-oauth_test_client',json_encode(array(
+ 'client_id' => 'oauth_test_client',
+ 'key' => $this->getTestPublicKey(),
+ 'subject' => 'test_subject',
+ )));
+ }
+
+ private function clearCouchbase(\Couchbase $cb)
+ {
+ $cb->delete('oauth_authorization_codes-new-openid-code');
+ $cb->delete('oauth_access_tokens-newtoken');
+ $cb->delete('oauth_authorization_codes-newcode');
+ $cb->delete('oauth_refresh_tokens-refreshtoken');
+ }
+
+ private function createMongo(\MongoDB $db)
+ {
+ $db->oauth_clients->insert(array(
+ 'client_id' => "oauth_test_client",
+ 'client_secret' => "testpass",
+ 'redirect_uri' => "http://example.com",
+ 'grant_types' => 'implicit password'
+ ));
+
+ $db->oauth_access_tokens->insert(array(
+ 'access_token' => "testtoken",
+ 'client_id' => "Some Client"
+ ));
+
+ $db->oauth_authorization_codes->insert(array(
+ 'authorization_code' => "testcode",
+ 'client_id' => "Some Client"
+ ));
+
+ $db->oauth_users->insert(array(
+ 'username' => 'testuser',
+ 'password' => 'password',
+ 'email' => 'testuser@test.com',
+ 'email_verified' => true,
+ ));
+
+ $db->oauth_keys->insert(array(
+ 'client_id' => null,
+ 'public_key' => $this->getTestPublicKey(),
+ 'private_key' => $this->getTestPrivateKey(),
+ 'encryption_algorithm' => 'RS256'
+ ));
+
+ $db->oauth_jwt->insert(array(
+ 'client_id' => 'oauth_test_client',
+ 'key' => $this->getTestPublicKey(),
+ 'subject' => 'test_subject',
+ ));
+ }
+
+ public function removeMongo(\MongoDB $db)
+ {
+ $db->drop();
+ }
+
+ private function createMongoDB(\MongoDB\Database $db)
+ {
+ $db->oauth_clients->insertOne(array(
+ 'client_id' => "oauth_test_client",
+ 'client_secret' => "testpass",
+ 'redirect_uri' => "http://example.com",
+ 'grant_types' => 'implicit password'
+ ));
+
+ $db->oauth_access_tokens->insertOne(array(
+ 'access_token' => "testtoken",
+ 'client_id' => "Some Client"
+ ));
+
+ $db->oauth_authorization_codes->insertOne(array(
+ 'authorization_code' => "testcode",
+ 'client_id' => "Some Client"
+ ));
+
+ $db->oauth_users->insertOne(array(
+ 'username' => 'testuser',
+ 'password' => 'password',
+ 'email' => 'testuser@test.com',
+ 'email_verified' => true,
+ ));
+
+ $db->oauth_keys->insertOne(array(
+ 'client_id' => null,
+ 'public_key' => $this->getTestPublicKey(),
+ 'private_key' => $this->getTestPrivateKey(),
+ 'encryption_algorithm' => 'RS256'
+ ));
+
+ $db->oauth_jwt->insertOne(array(
+ 'client_id' => 'oauth_test_client',
+ 'key' => $this->getTestPublicKey(),
+ 'subject' => 'test_subject',
+ ));
+ }
+
+ public function removeMongoDB(\MongoDB\Database $db)
+ {
+ $db->drop();
+ }
+
+ private function createRedisDb(Redis $storage)
+ {
+ $storage->setClientDetails("oauth_test_client", "testpass", "http://example.com", 'implicit password');
+ $storage->setAccessToken("testtoken", "Some Client", '', time() + 1000);
+ $storage->setAuthorizationCode("testcode", "Some Client", '', '', time() + 1000);
+ $storage->setUser("testuser", "password");
+
+ $storage->setScope('supportedscope1 supportedscope2 supportedscope3 supportedscope4');
+ $storage->setScope('defaultscope1 defaultscope2', null, 'default');
+
+ $storage->setScope('clientscope1 clientscope2', 'Test Client ID');
+ $storage->setScope('clientscope1 clientscope2', 'Test Client ID', 'default');
+
+ $storage->setScope('clientscope1 clientscope2 clientscope3', 'Test Client ID 2');
+ $storage->setScope('clientscope1 clientscope2', 'Test Client ID 2', 'default');
+
+ $storage->setScope('clientscope1 clientscope2', 'Test Default Scope Client ID');
+ $storage->setScope('clientscope1 clientscope2', 'Test Default Scope Client ID', 'default');
+
+ $storage->setScope('clientscope1 clientscope2 clientscope3', 'Test Default Scope Client ID 2');
+ $storage->setScope('clientscope3', 'Test Default Scope Client ID 2', 'default');
+
+ $storage->setClientKey('oauth_test_client', $this->getTestPublicKey(), 'test_subject');
+ }
+
+ public function getTestPublicKey()
+ {
+ return file_get_contents(__DIR__.'/../../../config/keys/id_rsa.pub');
+ }
+
+ private function getTestPrivateKey()
+ {
+ return file_get_contents(__DIR__.'/../../../config/keys/id_rsa');
+ }
+
+ public function getDynamoDbStorage()
+ {
+ if (!$this->dynamodb) {
+ // only run once per travis build
+ if (true == $this->getEnvVar('TRAVIS')) {
+ if (self::DYNAMODB_PHP_VERSION != $this->getEnvVar('TRAVIS_PHP_VERSION')) {
+ $this->dynamodb = new NullStorage('DynamoDb', 'Skipping for travis.ci - only run once per build');
+
+ return;
+ }
+ }
+ if (class_exists('\Aws\DynamoDb\DynamoDbClient')) {
+ if ($client = $this->getDynamoDbClient()) {
+ // travis runs a unique set of tables per build, to avoid conflict
+ $prefix = '';
+ if ($build_id = $this->getEnvVar('TRAVIS_JOB_NUMBER')) {
+ $prefix = sprintf('build_%s_', $build_id);
+ } else {
+ if (!$this->deleteDynamoDb($client, $prefix, true)) {
+ return $this->dynamodb = new NullStorage('DynamoDb', 'Timed out while waiting for DynamoDB deletion (30 seconds)');
+ }
+ }
+ $this->createDynamoDb($client, $prefix);
+ $this->populateDynamoDb($client, $prefix);
+ $config = array(
+ 'client_table' => $prefix.'oauth_clients',
+ 'access_token_table' => $prefix.'oauth_access_tokens',
+ 'refresh_token_table' => $prefix.'oauth_refresh_tokens',
+ 'code_table' => $prefix.'oauth_authorization_codes',
+ 'user_table' => $prefix.'oauth_users',
+ 'jwt_table' => $prefix.'oauth_jwt',
+ 'scope_table' => $prefix.'oauth_scopes',
+ 'public_key_table' => $prefix.'oauth_public_keys',
+ );
+ $this->dynamodb = new DynamoDB($client, $config);
+ } elseif (!$this->dynamodb) {
+ $this->dynamodb = new NullStorage('DynamoDb', 'unable to connect to DynamoDB');
+ }
+ } else {
+ $this->dynamodb = new NullStorage('DynamoDb', 'Missing DynamoDB library. Please run "composer.phar require aws/aws-sdk-php:dev-master');
+ }
+ }
+
+ return $this->dynamodb;
+ }
+
+ private function getDynamoDbClient()
+ {
+ $config = array();
+ // check for environment variables
+ if (($key = $this->getEnvVar('AWS_ACCESS_KEY_ID')) && ($secret = $this->getEnvVar('AWS_SECRET_KEY'))) {
+ $config['key'] = $key;
+ $config['secret'] = $secret;
+ } else {
+ // fall back on ~/.aws/credentials file
+ // @see http://docs.aws.amazon.com/aws-sdk-php/guide/latest/credentials.html#credential-profiles
+ if (!file_exists($this->getEnvVar('HOME') . '/.aws/credentials')) {
+ $this->dynamodb = new NullStorage('DynamoDb', 'No aws credentials file found, and no AWS_ACCESS_KEY_ID or AWS_SECRET_KEY environment variable set');
+
+ return;
+ }
+
+ // set profile in AWS_PROFILE environment variable, defaults to "default"
+ $config['profile'] = $this->getEnvVar('AWS_PROFILE', 'default');
+ }
+
+ // set region in AWS_REGION environment variable, defaults to "us-east-1"
+ $config['region'] = $this->getEnvVar('AWS_REGION', \Aws\Common\Enum\Region::US_EAST_1);
+
+ return \Aws\DynamoDb\DynamoDbClient::factory($config);
+ }
+
+ private function deleteDynamoDb(\Aws\DynamoDb\DynamoDbClient $client, $prefix = null, $waitForDeletion = false)
+ {
+ $tablesList = explode(' ', 'oauth_access_tokens oauth_authorization_codes oauth_clients oauth_jwt oauth_public_keys oauth_refresh_tokens oauth_scopes oauth_users');
+ $nbTables = count($tablesList);
+
+ // Delete all table.
+ foreach ($tablesList as $key => $table) {
+ try {
+ $client->deleteTable(array('TableName' => $prefix.$table));
+ } catch (\Aws\DynamoDb\Exception\DynamoDbException $e) {
+ // Table does not exist : nothing to do
+ }
+ }
+
+ // Wait for deleting
+ if ($waitForDeletion) {
+ $retries = 5;
+ $nbTableDeleted = 0;
+ while ($nbTableDeleted != $nbTables) {
+ $nbTableDeleted = 0;
+ foreach ($tablesList as $key => $table) {
+ try {
+ $result = $client->describeTable(array('TableName' => $prefix.$table));
+ } catch (\Aws\DynamoDb\Exception\DynamoDbException $e) {
+ // Table does not exist : nothing to do
+ $nbTableDeleted++;
+ }
+ }
+ if ($nbTableDeleted != $nbTables) {
+ if ($retries < 0) {
+ // we are tired of waiting
+ return false;
+ }
+ sleep(5);
+ echo "Sleeping 5 seconds for DynamoDB ($retries more retries)...\n";
+ $retries--;
+ }
+ }
+ }
+
+ return true;
+ }
+
+ private function createDynamoDb(\Aws\DynamoDb\DynamoDbClient $client, $prefix = null)
+ {
+ $tablesList = explode(' ', 'oauth_access_tokens oauth_authorization_codes oauth_clients oauth_jwt oauth_public_keys oauth_refresh_tokens oauth_scopes oauth_users');
+ $nbTables = count($tablesList);
+ $client->createTable(array(
+ 'TableName' => $prefix.'oauth_access_tokens',
+ 'AttributeDefinitions' => array(
+ array('AttributeName' => 'access_token','AttributeType' => 'S')
+ ),
+ 'KeySchema' => array(array('AttributeName' => 'access_token','KeyType' => 'HASH')),
+ 'ProvisionedThroughput' => array('ReadCapacityUnits' => 1,'WriteCapacityUnits' => 1)
+ ));
+
+ $client->createTable(array(
+ 'TableName' => $prefix.'oauth_authorization_codes',
+ 'AttributeDefinitions' => array(
+ array('AttributeName' => 'authorization_code','AttributeType' => 'S')
+ ),
+ 'KeySchema' => array(array('AttributeName' => 'authorization_code','KeyType' => 'HASH')),
+ 'ProvisionedThroughput' => array('ReadCapacityUnits' => 1,'WriteCapacityUnits' => 1)
+ ));
+
+ $client->createTable(array(
+ 'TableName' => $prefix.'oauth_clients',
+ 'AttributeDefinitions' => array(
+ array('AttributeName' => 'client_id','AttributeType' => 'S')
+ ),
+ 'KeySchema' => array(array('AttributeName' => 'client_id','KeyType' => 'HASH')),
+ 'ProvisionedThroughput' => array('ReadCapacityUnits' => 1,'WriteCapacityUnits' => 1)
+ ));
+
+ $client->createTable(array(
+ 'TableName' => $prefix.'oauth_jwt',
+ 'AttributeDefinitions' => array(
+ array('AttributeName' => 'client_id','AttributeType' => 'S'),
+ array('AttributeName' => 'subject','AttributeType' => 'S')
+ ),
+ 'KeySchema' => array(
+ array('AttributeName' => 'client_id','KeyType' => 'HASH'),
+ array('AttributeName' => 'subject','KeyType' => 'RANGE')
+ ),
+ 'ProvisionedThroughput' => array('ReadCapacityUnits' => 1,'WriteCapacityUnits' => 1)
+ ));
+
+ $client->createTable(array(
+ 'TableName' => $prefix.'oauth_public_keys',
+ 'AttributeDefinitions' => array(
+ array('AttributeName' => 'client_id','AttributeType' => 'S')
+ ),
+ 'KeySchema' => array(array('AttributeName' => 'client_id','KeyType' => 'HASH')),
+ 'ProvisionedThroughput' => array('ReadCapacityUnits' => 1,'WriteCapacityUnits' => 1)
+ ));
+
+ $client->createTable(array(
+ 'TableName' => $prefix.'oauth_refresh_tokens',
+ 'AttributeDefinitions' => array(
+ array('AttributeName' => 'refresh_token','AttributeType' => 'S')
+ ),
+ 'KeySchema' => array(array('AttributeName' => 'refresh_token','KeyType' => 'HASH')),
+ 'ProvisionedThroughput' => array('ReadCapacityUnits' => 1,'WriteCapacityUnits' => 1)
+ ));
+
+ $client->createTable(array(
+ 'TableName' => $prefix.'oauth_scopes',
+ 'AttributeDefinitions' => array(
+ array('AttributeName' => 'scope','AttributeType' => 'S'),
+ array('AttributeName' => 'is_default','AttributeType' => 'S')
+ ),
+ 'KeySchema' => array(array('AttributeName' => 'scope','KeyType' => 'HASH')),
+ 'GlobalSecondaryIndexes' => array(
+ array(
+ 'IndexName' => 'is_default-index',
+ 'KeySchema' => array(array('AttributeName' => 'is_default', 'KeyType' => 'HASH')),
+ 'Projection' => array('ProjectionType' => 'ALL'),
+ 'ProvisionedThroughput' => array('ReadCapacityUnits' => 1,'WriteCapacityUnits' => 1)
+ ),
+ ),
+ 'ProvisionedThroughput' => array('ReadCapacityUnits' => 1,'WriteCapacityUnits' => 1)
+ ));
+
+ $client->createTable(array(
+ 'TableName' => $prefix.'oauth_users',
+ 'AttributeDefinitions' => array(array('AttributeName' => 'username','AttributeType' => 'S')),
+ 'KeySchema' => array(array('AttributeName' => 'username','KeyType' => 'HASH')),
+ 'ProvisionedThroughput' => array('ReadCapacityUnits' => 1,'WriteCapacityUnits' => 1)
+ ));
+
+ // Wait for creation
+ $nbTableCreated = 0;
+ while ($nbTableCreated != $nbTables) {
+ $nbTableCreated = 0;
+ foreach ($tablesList as $key => $table) {
+ try {
+ $result = $client->describeTable(array('TableName' => $prefix.$table));
+ if ($result['Table']['TableStatus'] == 'ACTIVE') {
+ $nbTableCreated++;
+ }
+ } catch (\Aws\DynamoDb\Exception\DynamoDbException $e) {
+ // Table does not exist : nothing to do
+ $nbTableCreated++;
+ }
+ }
+ if ($nbTableCreated != $nbTables) {
+ sleep(1);
+ }
+ }
+ }
+
+ private function populateDynamoDb($client, $prefix = null)
+ {
+ // set up scopes
+ foreach (explode(' ', 'supportedscope1 supportedscope2 supportedscope3 supportedscope4 clientscope1 clientscope2 clientscope3') as $supportedScope) {
+ $client->putItem(array(
+ 'TableName' => $prefix.'oauth_scopes',
+ 'Item' => array('scope' => array('S' => $supportedScope))
+ ));
+ }
+
+ foreach (array('defaultscope1', 'defaultscope2') as $defaultScope) {
+ $client->putItem(array(
+ 'TableName' => $prefix.'oauth_scopes',
+ 'Item' => array('scope' => array('S' => $defaultScope), 'is_default' => array('S' => "true"))
+ ));
+ }
+
+ $client->putItem(array(
+ 'TableName' => $prefix.'oauth_clients',
+ 'Item' => array(
+ 'client_id' => array('S' => 'Test Client ID'),
+ 'client_secret' => array('S' => 'TestSecret'),
+ 'scope' => array('S' => 'clientscope1 clientscope2')
+ )
+ ));
+
+ $client->putItem(array(
+ 'TableName' => $prefix.'oauth_clients',
+ 'Item' => array(
+ 'client_id' => array('S' => 'Test Client ID 2'),
+ 'client_secret' => array('S' => 'TestSecret'),
+ 'scope' => array('S' => 'clientscope1 clientscope2 clientscope3')
+ )
+ ));
+
+ $client->putItem(array(
+ 'TableName' => $prefix.'oauth_clients',
+ 'Item' => array(
+ 'client_id' => array('S' => 'Test Default Scope Client ID'),
+ 'client_secret' => array('S' => 'TestSecret'),
+ 'scope' => array('S' => 'clientscope1 clientscope2')
+ )
+ ));
+
+ $client->putItem(array(
+ 'TableName' => $prefix.'oauth_clients',
+ 'Item' => array(
+ 'client_id' => array('S' => 'oauth_test_client'),
+ 'client_secret' => array('S' => 'testpass'),
+ 'grant_types' => array('S' => 'implicit password')
+ )
+ ));
+
+ $client->putItem(array(
+ 'TableName' => $prefix.'oauth_access_tokens',
+ 'Item' => array(
+ 'access_token' => array('S' => 'testtoken'),
+ 'client_id' => array('S' => 'Some Client'),
+ )
+ ));
+
+ $client->putItem(array(
+ 'TableName' => $prefix.'oauth_access_tokens',
+ 'Item' => array(
+ 'access_token' => array('S' => 'accesstoken-openid-connect'),
+ 'client_id' => array('S' => 'Some Client'),
+ 'user_id' => array('S' => 'testuser'),
+ )
+ ));
+
+ $client->putItem(array(
+ 'TableName' => $prefix.'oauth_authorization_codes',
+ 'Item' => array(
+ 'authorization_code' => array('S' => 'testcode'),
+ 'client_id' => array('S' => 'Some Client'),
+ )
+ ));
+
+ $client->putItem(array(
+ 'TableName' => $prefix.'oauth_users',
+ 'Item' => array(
+ 'username' => array('S' => 'testuser'),
+ 'password' => array('S' => 'password'),
+ 'email' => array('S' => 'testuser@test.com'),
+ 'email_verified' => array('S' => 'true'),
+ )
+ ));
+
+ $client->putItem(array(
+ 'TableName' => $prefix.'oauth_public_keys',
+ 'Item' => array(
+ 'client_id' => array('S' => 'ClientID_One'),
+ 'public_key' => array('S' => 'client_1_public'),
+ 'private_key' => array('S' => 'client_1_private'),
+ 'encryption_algorithm' => array('S' => 'RS256'),
+ )
+ ));
+
+ $client->putItem(array(
+ 'TableName' => $prefix.'oauth_public_keys',
+ 'Item' => array(
+ 'client_id' => array('S' => 'ClientID_Two'),
+ 'public_key' => array('S' => 'client_2_public'),
+ 'private_key' => array('S' => 'client_2_private'),
+ 'encryption_algorithm' => array('S' => 'RS256'),
+ )
+ ));
+
+ $client->putItem(array(
+ 'TableName' => $prefix.'oauth_public_keys',
+ 'Item' => array(
+ 'client_id' => array('S' => '0'),
+ 'public_key' => array('S' => $this->getTestPublicKey()),
+ 'private_key' => array('S' => $this->getTestPrivateKey()),
+ 'encryption_algorithm' => array('S' => 'RS256'),
+ )
+ ));
+
+ $client->putItem(array(
+ 'TableName' => $prefix.'oauth_jwt',
+ 'Item' => array(
+ 'client_id' => array('S' => 'oauth_test_client'),
+ 'subject' => array('S' => 'test_subject'),
+ 'public_key' => array('S' => $this->getTestPublicKey()),
+ )
+ ));
+ }
+
+ public function cleanupTravisDynamoDb($prefix = null)
+ {
+ if (is_null($prefix)) {
+ // skip this when not applicable
+ if (!$this->getEnvVar('TRAVIS') || self::DYNAMODB_PHP_VERSION != $this->getEnvVar('TRAVIS_PHP_VERSION')) {
+ return;
+ }
+
+ $prefix = sprintf('build_%s_', $this->getEnvVar('TRAVIS_JOB_NUMBER'));
+ }
+
+ $client = $this->getDynamoDbClient();
+ $this->deleteDynamoDb($client, $prefix);
+ }
+
+ private function getEnvVar($var, $default = null)
+ {
+ return isset($_SERVER[$var]) ? $_SERVER[$var] : (getenv($var) ?: $default);
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/lib/OAuth2/Storage/NullStorage.php b/vendor/bshaffer/oauth2-server-php/test/lib/OAuth2/Storage/NullStorage.php
new file mode 100644
index 000000000..6caa62068
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/lib/OAuth2/Storage/NullStorage.php
@@ -0,0 +1,32 @@
+<?php
+
+namespace OAuth2\Storage;
+
+/**
+*
+*/
+class NullStorage extends Memory
+{
+ private $name;
+ private $description;
+
+ public function __construct($name, $description = null)
+ {
+ $this->name = $name;
+ $this->description = $description;
+ }
+
+ public function __toString()
+ {
+ return $this->name;
+ }
+
+ public function getMessage()
+ {
+ if ($this->description) {
+ return $this->description;
+ }
+
+ return $this->name;
+ }
+}
diff --git a/vendor/composer/ClassLoader.php b/vendor/composer/ClassLoader.php
index ac67d302a..2c72175e7 100644
--- a/vendor/composer/ClassLoader.php
+++ b/vendor/composer/ClassLoader.php
@@ -55,6 +55,7 @@ class ClassLoader
private $classMap = array();
private $classMapAuthoritative = false;
private $missingClasses = array();
+ private $apcuPrefix;
public function getPrefixes()
{
@@ -272,6 +273,26 @@ class ClassLoader
}
/**
+ * APCu prefix to use to cache found/not-found classes, if the extension is enabled.
+ *
+ * @param string|null $apcuPrefix
+ */
+ public function setApcuPrefix($apcuPrefix)
+ {
+ $this->apcuPrefix = function_exists('apcu_fetch') && ini_get('apc.enabled') ? $apcuPrefix : null;
+ }
+
+ /**
+ * The APCu prefix in use, or null if APCu caching is not enabled.
+ *
+ * @return string|null
+ */
+ public function getApcuPrefix()
+ {
+ return $this->apcuPrefix;
+ }
+
+ /**
* Registers this instance as an autoloader.
*
* @param bool $prepend Whether to prepend the autoloader or not
@@ -313,11 +334,6 @@ class ClassLoader
*/
public function findFile($class)
{
- // work around for PHP 5.3.0 - 5.3.2 https://bugs.php.net/50731
- if ('\\' == $class[0]) {
- $class = substr($class, 1);
- }
-
// class map lookup
if (isset($this->classMap[$class])) {
return $this->classMap[$class];
@@ -325,6 +341,12 @@ class ClassLoader
if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {
return false;
}
+ if (null !== $this->apcuPrefix) {
+ $file = apcu_fetch($this->apcuPrefix.$class, $hit);
+ if ($hit) {
+ return $file;
+ }
+ }
$file = $this->findFileWithExtension($class, '.php');
@@ -333,6 +355,10 @@ class ClassLoader
$file = $this->findFileWithExtension($class, '.hh');
}
+ if (null !== $this->apcuPrefix) {
+ apcu_add($this->apcuPrefix.$class, $file);
+ }
+
if (false === $file) {
// Remember that this class does not exist.
$this->missingClasses[$class] = true;
@@ -348,9 +374,13 @@ class ClassLoader
$first = $class[0];
if (isset($this->prefixLengthsPsr4[$first])) {
- foreach ($this->prefixLengthsPsr4[$first] as $prefix => $length) {
- if (0 === strpos($class, $prefix)) {
- foreach ($this->prefixDirsPsr4[$prefix] as $dir) {
+ $subPath = $class;
+ while (false !== $lastPos = strrpos($subPath, '\\')) {
+ $subPath = substr($subPath, 0, $lastPos);
+ $search = $subPath.'\\';
+ if (isset($this->prefixDirsPsr4[$search])) {
+ foreach ($this->prefixDirsPsr4[$search] as $dir) {
+ $length = $this->prefixLengthsPsr4[$first][$search];
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) {
return $file;
}
diff --git a/vendor/composer/LICENSE b/vendor/composer/LICENSE
index 1a2812488..f27399a04 100644
--- a/vendor/composer/LICENSE
+++ b/vendor/composer/LICENSE
@@ -1,5 +1,5 @@
-Copyright (c) 2016 Nils Adermann, Jordi Boggiano
+Copyright (c) Nils Adermann, Jordi Boggiano
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php
index 54b09f68b..5899fb9ed 100644
--- a/vendor/composer/autoload_classmap.php
+++ b/vendor/composer/autoload_classmap.php
@@ -6,7 +6,315 @@ $vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
+ 'HTMLPurifier' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier.php',
+ 'HTMLPurifier_Arborize' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Arborize.php',
+ 'HTMLPurifier_AttrCollections' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrCollections.php',
+ 'HTMLPurifier_AttrDef' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef.php',
+ 'HTMLPurifier_AttrDef_CSS' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS.php',
+ 'HTMLPurifier_AttrDef_CSS_AlphaValue' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/AlphaValue.php',
+ 'HTMLPurifier_AttrDef_CSS_Background' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Background.php',
+ 'HTMLPurifier_AttrDef_CSS_BackgroundPosition' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php',
+ 'HTMLPurifier_AttrDef_CSS_Border' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Border.php',
+ 'HTMLPurifier_AttrDef_CSS_Color' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Color.php',
+ 'HTMLPurifier_AttrDef_CSS_Composite' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Composite.php',
+ 'HTMLPurifier_AttrDef_CSS_DenyElementDecorator' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php',
+ 'HTMLPurifier_AttrDef_CSS_Filter' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Filter.php',
+ 'HTMLPurifier_AttrDef_CSS_Font' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Font.php',
+ 'HTMLPurifier_AttrDef_CSS_FontFamily' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/FontFamily.php',
+ 'HTMLPurifier_AttrDef_CSS_Ident' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Ident.php',
+ 'HTMLPurifier_AttrDef_CSS_ImportantDecorator' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/ImportantDecorator.php',
+ 'HTMLPurifier_AttrDef_CSS_Length' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Length.php',
+ 'HTMLPurifier_AttrDef_CSS_ListStyle' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/ListStyle.php',
+ 'HTMLPurifier_AttrDef_CSS_Multiple' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Multiple.php',
+ 'HTMLPurifier_AttrDef_CSS_Number' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Number.php',
+ 'HTMLPurifier_AttrDef_CSS_Percentage' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Percentage.php',
+ 'HTMLPurifier_AttrDef_CSS_TextDecoration' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/TextDecoration.php',
+ 'HTMLPurifier_AttrDef_CSS_URI' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/URI.php',
+ 'HTMLPurifier_AttrDef_Clone' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Clone.php',
+ 'HTMLPurifier_AttrDef_Enum' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Enum.php',
+ 'HTMLPurifier_AttrDef_HTML_Bool' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Bool.php',
+ 'HTMLPurifier_AttrDef_HTML_Class' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Class.php',
+ 'HTMLPurifier_AttrDef_HTML_Color' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Color.php',
+ 'HTMLPurifier_AttrDef_HTML_FrameTarget' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/FrameTarget.php',
+ 'HTMLPurifier_AttrDef_HTML_ID' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/ID.php',
+ 'HTMLPurifier_AttrDef_HTML_Length' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Length.php',
+ 'HTMLPurifier_AttrDef_HTML_LinkTypes' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/LinkTypes.php',
+ 'HTMLPurifier_AttrDef_HTML_MultiLength' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/MultiLength.php',
+ 'HTMLPurifier_AttrDef_HTML_Nmtokens' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Nmtokens.php',
+ 'HTMLPurifier_AttrDef_HTML_Pixels' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Pixels.php',
+ 'HTMLPurifier_AttrDef_Integer' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Integer.php',
+ 'HTMLPurifier_AttrDef_Lang' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Lang.php',
+ 'HTMLPurifier_AttrDef_Switch' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Switch.php',
+ 'HTMLPurifier_AttrDef_Text' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Text.php',
+ 'HTMLPurifier_AttrDef_URI' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI.php',
+ 'HTMLPurifier_AttrDef_URI_Email' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Email.php',
+ 'HTMLPurifier_AttrDef_URI_Email_SimpleCheck' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Email/SimpleCheck.php',
+ 'HTMLPurifier_AttrDef_URI_Host' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Host.php',
+ 'HTMLPurifier_AttrDef_URI_IPv4' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/IPv4.php',
+ 'HTMLPurifier_AttrDef_URI_IPv6' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/IPv6.php',
+ 'HTMLPurifier_AttrTransform' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform.php',
+ 'HTMLPurifier_AttrTransform_Background' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Background.php',
+ 'HTMLPurifier_AttrTransform_BdoDir' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/BdoDir.php',
+ 'HTMLPurifier_AttrTransform_BgColor' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/BgColor.php',
+ 'HTMLPurifier_AttrTransform_BoolToCSS' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/BoolToCSS.php',
+ 'HTMLPurifier_AttrTransform_Border' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Border.php',
+ 'HTMLPurifier_AttrTransform_EnumToCSS' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/EnumToCSS.php',
+ 'HTMLPurifier_AttrTransform_ImgRequired' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ImgRequired.php',
+ 'HTMLPurifier_AttrTransform_ImgSpace' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ImgSpace.php',
+ 'HTMLPurifier_AttrTransform_Input' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Input.php',
+ 'HTMLPurifier_AttrTransform_Lang' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Lang.php',
+ 'HTMLPurifier_AttrTransform_Length' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Length.php',
+ 'HTMLPurifier_AttrTransform_Name' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Name.php',
+ 'HTMLPurifier_AttrTransform_NameSync' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/NameSync.php',
+ 'HTMLPurifier_AttrTransform_Nofollow' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Nofollow.php',
+ 'HTMLPurifier_AttrTransform_SafeEmbed' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeEmbed.php',
+ 'HTMLPurifier_AttrTransform_SafeObject' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeObject.php',
+ 'HTMLPurifier_AttrTransform_SafeParam' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeParam.php',
+ 'HTMLPurifier_AttrTransform_ScriptRequired' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ScriptRequired.php',
+ 'HTMLPurifier_AttrTransform_TargetBlank' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/TargetBlank.php',
+ 'HTMLPurifier_AttrTransform_TargetNoopener' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/TargetNoopener.php',
+ 'HTMLPurifier_AttrTransform_TargetNoreferrer' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/TargetNoreferrer.php',
+ 'HTMLPurifier_AttrTransform_Textarea' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Textarea.php',
+ 'HTMLPurifier_AttrTypes' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTypes.php',
+ 'HTMLPurifier_AttrValidator' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrValidator.php',
+ 'HTMLPurifier_Bootstrap' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Bootstrap.php',
+ 'HTMLPurifier_CSSDefinition' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/CSSDefinition.php',
+ 'HTMLPurifier_ChildDef' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef.php',
+ 'HTMLPurifier_ChildDef_Chameleon' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Chameleon.php',
+ 'HTMLPurifier_ChildDef_Custom' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Custom.php',
+ 'HTMLPurifier_ChildDef_Empty' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Empty.php',
+ 'HTMLPurifier_ChildDef_List' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/List.php',
+ 'HTMLPurifier_ChildDef_Optional' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Optional.php',
+ 'HTMLPurifier_ChildDef_Required' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Required.php',
+ 'HTMLPurifier_ChildDef_StrictBlockquote' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/StrictBlockquote.php',
+ 'HTMLPurifier_ChildDef_Table' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Table.php',
+ 'HTMLPurifier_Config' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Config.php',
+ 'HTMLPurifier_ConfigSchema' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema.php',
+ 'HTMLPurifier_ConfigSchema_Builder_ConfigSchema' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Builder/ConfigSchema.php',
+ 'HTMLPurifier_ConfigSchema_Builder_Xml' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Builder/Xml.php',
+ 'HTMLPurifier_ConfigSchema_Exception' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Exception.php',
+ 'HTMLPurifier_ConfigSchema_Interchange' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange.php',
+ 'HTMLPurifier_ConfigSchema_InterchangeBuilder' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/InterchangeBuilder.php',
+ 'HTMLPurifier_ConfigSchema_Interchange_Directive' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange/Directive.php',
+ 'HTMLPurifier_ConfigSchema_Interchange_Id' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange/Id.php',
+ 'HTMLPurifier_ConfigSchema_Validator' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Validator.php',
+ 'HTMLPurifier_ConfigSchema_ValidatorAtom' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/ValidatorAtom.php',
+ 'HTMLPurifier_ContentSets' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/ContentSets.php',
+ 'HTMLPurifier_Context' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Context.php',
+ 'HTMLPurifier_Definition' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Definition.php',
+ 'HTMLPurifier_DefinitionCache' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache.php',
+ 'HTMLPurifier_DefinitionCacheFactory' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCacheFactory.php',
+ 'HTMLPurifier_DefinitionCache_Decorator' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator.php',
+ 'HTMLPurifier_DefinitionCache_Decorator_Cleanup' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php',
+ 'HTMLPurifier_DefinitionCache_Decorator_Memory' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Memory.php',
+ 'HTMLPurifier_DefinitionCache_Null' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Null.php',
+ 'HTMLPurifier_DefinitionCache_Serializer' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Serializer.php',
+ 'HTMLPurifier_Doctype' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Doctype.php',
+ 'HTMLPurifier_DoctypeRegistry' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/DoctypeRegistry.php',
+ 'HTMLPurifier_ElementDef' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/ElementDef.php',
+ 'HTMLPurifier_Encoder' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Encoder.php',
+ 'HTMLPurifier_EntityLookup' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/EntityLookup.php',
+ 'HTMLPurifier_EntityParser' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/EntityParser.php',
+ 'HTMLPurifier_ErrorCollector' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/ErrorCollector.php',
+ 'HTMLPurifier_ErrorStruct' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/ErrorStruct.php',
+ 'HTMLPurifier_Exception' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Exception.php',
+ 'HTMLPurifier_Filter' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Filter.php',
+ 'HTMLPurifier_Filter_ExtractStyleBlocks' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Filter/ExtractStyleBlocks.php',
+ 'HTMLPurifier_Filter_YouTube' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Filter/YouTube.php',
+ 'HTMLPurifier_Generator' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Generator.php',
+ 'HTMLPurifier_HTMLDefinition' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLDefinition.php',
+ 'HTMLPurifier_HTMLModule' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule.php',
+ 'HTMLPurifier_HTMLModuleManager' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModuleManager.php',
+ 'HTMLPurifier_HTMLModule_Bdo' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Bdo.php',
+ 'HTMLPurifier_HTMLModule_CommonAttributes' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/CommonAttributes.php',
+ 'HTMLPurifier_HTMLModule_Edit' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Edit.php',
+ 'HTMLPurifier_HTMLModule_Forms' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Forms.php',
+ 'HTMLPurifier_HTMLModule_Hypertext' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Hypertext.php',
+ 'HTMLPurifier_HTMLModule_Iframe' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Iframe.php',
+ 'HTMLPurifier_HTMLModule_Image' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Image.php',
+ 'HTMLPurifier_HTMLModule_Legacy' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Legacy.php',
+ 'HTMLPurifier_HTMLModule_List' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/List.php',
+ 'HTMLPurifier_HTMLModule_Name' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Name.php',
+ 'HTMLPurifier_HTMLModule_Nofollow' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Nofollow.php',
+ 'HTMLPurifier_HTMLModule_NonXMLCommonAttributes' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php',
+ 'HTMLPurifier_HTMLModule_Object' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Object.php',
+ 'HTMLPurifier_HTMLModule_Presentation' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Presentation.php',
+ 'HTMLPurifier_HTMLModule_Proprietary' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Proprietary.php',
+ 'HTMLPurifier_HTMLModule_Ruby' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Ruby.php',
+ 'HTMLPurifier_HTMLModule_SafeEmbed' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeEmbed.php',
+ 'HTMLPurifier_HTMLModule_SafeObject' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeObject.php',
+ 'HTMLPurifier_HTMLModule_SafeScripting' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeScripting.php',
+ 'HTMLPurifier_HTMLModule_Scripting' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Scripting.php',
+ 'HTMLPurifier_HTMLModule_StyleAttribute' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/StyleAttribute.php',
+ 'HTMLPurifier_HTMLModule_Tables' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tables.php',
+ 'HTMLPurifier_HTMLModule_Target' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Target.php',
+ 'HTMLPurifier_HTMLModule_TargetBlank' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/TargetBlank.php',
+ 'HTMLPurifier_HTMLModule_TargetNoopener' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/TargetNoopener.php',
+ 'HTMLPurifier_HTMLModule_TargetNoreferrer' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/TargetNoreferrer.php',
+ 'HTMLPurifier_HTMLModule_Text' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Text.php',
+ 'HTMLPurifier_HTMLModule_Tidy' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy.php',
+ 'HTMLPurifier_HTMLModule_Tidy_Name' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Name.php',
+ 'HTMLPurifier_HTMLModule_Tidy_Proprietary' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Proprietary.php',
+ 'HTMLPurifier_HTMLModule_Tidy_Strict' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Strict.php',
+ 'HTMLPurifier_HTMLModule_Tidy_Transitional' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Transitional.php',
+ 'HTMLPurifier_HTMLModule_Tidy_XHTML' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/XHTML.php',
+ 'HTMLPurifier_HTMLModule_Tidy_XHTMLAndHTML4' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/XHTMLAndHTML4.php',
+ 'HTMLPurifier_HTMLModule_XMLCommonAttributes' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/XMLCommonAttributes.php',
+ 'HTMLPurifier_IDAccumulator' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/IDAccumulator.php',
+ 'HTMLPurifier_Injector' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Injector.php',
+ 'HTMLPurifier_Injector_AutoParagraph' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Injector/AutoParagraph.php',
+ 'HTMLPurifier_Injector_DisplayLinkURI' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Injector/DisplayLinkURI.php',
+ 'HTMLPurifier_Injector_Linkify' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Injector/Linkify.php',
+ 'HTMLPurifier_Injector_PurifierLinkify' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Injector/PurifierLinkify.php',
+ 'HTMLPurifier_Injector_RemoveEmpty' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Injector/RemoveEmpty.php',
+ 'HTMLPurifier_Injector_RemoveSpansWithoutAttributes' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Injector/RemoveSpansWithoutAttributes.php',
+ 'HTMLPurifier_Injector_SafeObject' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Injector/SafeObject.php',
+ 'HTMLPurifier_Language' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Language.php',
+ 'HTMLPurifier_LanguageFactory' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/LanguageFactory.php',
+ 'HTMLPurifier_Language_en_x_test' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Language/classes/en-x-test.php',
+ 'HTMLPurifier_Length' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Length.php',
+ 'HTMLPurifier_Lexer' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Lexer.php',
+ 'HTMLPurifier_Lexer_DOMLex' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/DOMLex.php',
+ 'HTMLPurifier_Lexer_DirectLex' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/DirectLex.php',
+ 'HTMLPurifier_Lexer_PH5P' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/PH5P.php',
+ 'HTMLPurifier_Node' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Node.php',
+ 'HTMLPurifier_Node_Comment' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Node/Comment.php',
+ 'HTMLPurifier_Node_Element' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Node/Element.php',
+ 'HTMLPurifier_Node_Text' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Node/Text.php',
+ 'HTMLPurifier_PercentEncoder' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/PercentEncoder.php',
+ 'HTMLPurifier_Printer' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Printer.php',
+ 'HTMLPurifier_Printer_CSSDefinition' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Printer/CSSDefinition.php',
+ 'HTMLPurifier_Printer_ConfigForm' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.php',
+ 'HTMLPurifier_Printer_ConfigForm_NullDecorator' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.php',
+ 'HTMLPurifier_Printer_ConfigForm_bool' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.php',
+ 'HTMLPurifier_Printer_ConfigForm_default' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.php',
+ 'HTMLPurifier_Printer_HTMLDefinition' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Printer/HTMLDefinition.php',
+ 'HTMLPurifier_PropertyList' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/PropertyList.php',
+ 'HTMLPurifier_PropertyListIterator' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/PropertyListIterator.php',
+ 'HTMLPurifier_Queue' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Queue.php',
+ 'HTMLPurifier_Strategy' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Strategy.php',
+ 'HTMLPurifier_Strategy_Composite' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/Composite.php',
+ 'HTMLPurifier_Strategy_Core' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/Core.php',
+ 'HTMLPurifier_Strategy_FixNesting' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/FixNesting.php',
+ 'HTMLPurifier_Strategy_MakeWellFormed' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/MakeWellFormed.php',
+ 'HTMLPurifier_Strategy_RemoveForeignElements' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/RemoveForeignElements.php',
+ 'HTMLPurifier_Strategy_ValidateAttributes' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/ValidateAttributes.php',
+ 'HTMLPurifier_StringHash' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/StringHash.php',
+ 'HTMLPurifier_StringHashParser' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/StringHashParser.php',
+ 'HTMLPurifier_TagTransform' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/TagTransform.php',
+ 'HTMLPurifier_TagTransform_Font' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/TagTransform/Font.php',
+ 'HTMLPurifier_TagTransform_Simple' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/TagTransform/Simple.php',
+ 'HTMLPurifier_Token' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Token.php',
+ 'HTMLPurifier_TokenFactory' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/TokenFactory.php',
+ 'HTMLPurifier_Token_Comment' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Token/Comment.php',
+ 'HTMLPurifier_Token_Empty' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Token/Empty.php',
+ 'HTMLPurifier_Token_End' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Token/End.php',
+ 'HTMLPurifier_Token_Start' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Token/Start.php',
+ 'HTMLPurifier_Token_Tag' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Token/Tag.php',
+ 'HTMLPurifier_Token_Text' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Token/Text.php',
+ 'HTMLPurifier_URI' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/URI.php',
+ 'HTMLPurifier_URIDefinition' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/URIDefinition.php',
+ 'HTMLPurifier_URIFilter' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter.php',
+ 'HTMLPurifier_URIFilter_DisableExternal' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/DisableExternal.php',
+ 'HTMLPurifier_URIFilter_DisableExternalResources' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/DisableExternalResources.php',
+ 'HTMLPurifier_URIFilter_DisableResources' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/DisableResources.php',
+ 'HTMLPurifier_URIFilter_HostBlacklist' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/HostBlacklist.php',
+ 'HTMLPurifier_URIFilter_MakeAbsolute' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/MakeAbsolute.php',
+ 'HTMLPurifier_URIFilter_Munge' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/Munge.php',
+ 'HTMLPurifier_URIFilter_SafeIframe' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/SafeIframe.php',
+ 'HTMLPurifier_URIParser' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/URIParser.php',
+ 'HTMLPurifier_URIScheme' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme.php',
+ 'HTMLPurifier_URISchemeRegistry' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/URISchemeRegistry.php',
+ 'HTMLPurifier_URIScheme_data' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/data.php',
+ 'HTMLPurifier_URIScheme_file' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/file.php',
+ 'HTMLPurifier_URIScheme_ftp' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/ftp.php',
+ 'HTMLPurifier_URIScheme_http' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/http.php',
+ 'HTMLPurifier_URIScheme_https' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/https.php',
+ 'HTMLPurifier_URIScheme_mailto' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/mailto.php',
+ 'HTMLPurifier_URIScheme_news' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/news.php',
+ 'HTMLPurifier_URIScheme_nntp' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/nntp.php',
+ 'HTMLPurifier_URIScheme_tel' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/tel.php',
+ 'HTMLPurifier_UnitConverter' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/UnitConverter.php',
+ 'HTMLPurifier_VarParser' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/VarParser.php',
+ 'HTMLPurifier_VarParserException' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/VarParserException.php',
+ 'HTMLPurifier_VarParser_Flexible' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/VarParser/Flexible.php',
+ 'HTMLPurifier_VarParser_Native' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/VarParser/Native.php',
+ 'HTMLPurifier_Zipper' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Zipper.php',
'Hubzilla\\Import\\Import' => $baseDir . '/include/Import/Importer.php',
+ 'Markdownify\\Converter' => $vendorDir . '/pixel418/markdownify/src/Converter.php',
+ 'Markdownify\\ConverterExtra' => $vendorDir . '/pixel418/markdownify/src/ConverterExtra.php',
+ 'Markdownify\\Parser' => $vendorDir . '/pixel418/markdownify/src/Parser.php',
+ 'Michelf\\Markdown' => $vendorDir . '/michelf/php-markdown/Michelf/Markdown.php',
+ 'Michelf\\MarkdownExtra' => $vendorDir . '/michelf/php-markdown/Michelf/MarkdownExtra.php',
+ 'Michelf\\MarkdownInterface' => $vendorDir . '/michelf/php-markdown/Michelf/MarkdownInterface.php',
+ 'OAuth2\\Autoloader' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Autoloader.php',
+ 'OAuth2\\ClientAssertionType\\ClientAssertionTypeInterface' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/ClientAssertionType/ClientAssertionTypeInterface.php',
+ 'OAuth2\\ClientAssertionType\\HttpBasic' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/ClientAssertionType/HttpBasic.php',
+ 'OAuth2\\Controller\\AuthorizeController' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Controller/AuthorizeController.php',
+ 'OAuth2\\Controller\\AuthorizeControllerInterface' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Controller/AuthorizeControllerInterface.php',
+ 'OAuth2\\Controller\\ResourceController' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Controller/ResourceController.php',
+ 'OAuth2\\Controller\\ResourceControllerInterface' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Controller/ResourceControllerInterface.php',
+ 'OAuth2\\Controller\\TokenController' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Controller/TokenController.php',
+ 'OAuth2\\Controller\\TokenControllerInterface' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Controller/TokenControllerInterface.php',
+ 'OAuth2\\Encryption\\EncryptionInterface' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Encryption/EncryptionInterface.php',
+ 'OAuth2\\Encryption\\FirebaseJwt' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Encryption/FirebaseJwt.php',
+ 'OAuth2\\Encryption\\Jwt' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Encryption/Jwt.php',
+ 'OAuth2\\GrantType\\AuthorizationCode' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/GrantType/AuthorizationCode.php',
+ 'OAuth2\\GrantType\\ClientCredentials' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/GrantType/ClientCredentials.php',
+ 'OAuth2\\GrantType\\GrantTypeInterface' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/GrantType/GrantTypeInterface.php',
+ 'OAuth2\\GrantType\\JwtBearer' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/GrantType/JwtBearer.php',
+ 'OAuth2\\GrantType\\RefreshToken' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/GrantType/RefreshToken.php',
+ 'OAuth2\\GrantType\\UserCredentials' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/GrantType/UserCredentials.php',
+ 'OAuth2\\OpenID\\Controller\\AuthorizeController' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Controller/AuthorizeController.php',
+ 'OAuth2\\OpenID\\Controller\\AuthorizeControllerInterface' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Controller/AuthorizeControllerInterface.php',
+ 'OAuth2\\OpenID\\Controller\\UserInfoController' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Controller/UserInfoController.php',
+ 'OAuth2\\OpenID\\Controller\\UserInfoControllerInterface' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Controller/UserInfoControllerInterface.php',
+ 'OAuth2\\OpenID\\GrantType\\AuthorizationCode' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/OpenID/GrantType/AuthorizationCode.php',
+ 'OAuth2\\OpenID\\ResponseType\\AuthorizationCode' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/AuthorizationCode.php',
+ 'OAuth2\\OpenID\\ResponseType\\AuthorizationCodeInterface' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/AuthorizationCodeInterface.php',
+ 'OAuth2\\OpenID\\ResponseType\\CodeIdToken' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/CodeIdToken.php',
+ 'OAuth2\\OpenID\\ResponseType\\CodeIdTokenInterface' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/CodeIdTokenInterface.php',
+ 'OAuth2\\OpenID\\ResponseType\\IdToken' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/IdToken.php',
+ 'OAuth2\\OpenID\\ResponseType\\IdTokenInterface' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/IdTokenInterface.php',
+ 'OAuth2\\OpenID\\ResponseType\\IdTokenToken' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/IdTokenToken.php',
+ 'OAuth2\\OpenID\\ResponseType\\IdTokenTokenInterface' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/IdTokenTokenInterface.php',
+ 'OAuth2\\OpenID\\Storage\\AuthorizationCodeInterface' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Storage/AuthorizationCodeInterface.php',
+ 'OAuth2\\OpenID\\Storage\\UserClaimsInterface' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Storage/UserClaimsInterface.php',
+ 'OAuth2\\Request' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Request.php',
+ 'OAuth2\\RequestInterface' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/RequestInterface.php',
+ 'OAuth2\\Response' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Response.php',
+ 'OAuth2\\ResponseInterface' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/ResponseInterface.php',
+ 'OAuth2\\ResponseType\\AccessToken' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/AccessToken.php',
+ 'OAuth2\\ResponseType\\AccessTokenInterface' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/AccessTokenInterface.php',
+ 'OAuth2\\ResponseType\\AuthorizationCode' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/AuthorizationCode.php',
+ 'OAuth2\\ResponseType\\AuthorizationCodeInterface' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/AuthorizationCodeInterface.php',
+ 'OAuth2\\ResponseType\\JwtAccessToken' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/JwtAccessToken.php',
+ 'OAuth2\\ResponseType\\ResponseTypeInterface' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/ResponseTypeInterface.php',
+ 'OAuth2\\Scope' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Scope.php',
+ 'OAuth2\\ScopeInterface' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/ScopeInterface.php',
+ 'OAuth2\\Server' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Server.php',
+ 'OAuth2\\Storage\\AccessTokenInterface' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/AccessTokenInterface.php',
+ 'OAuth2\\Storage\\AuthorizationCodeInterface' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/AuthorizationCodeInterface.php',
+ 'OAuth2\\Storage\\Cassandra' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/Cassandra.php',
+ 'OAuth2\\Storage\\ClientCredentialsInterface' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/ClientCredentialsInterface.php',
+ 'OAuth2\\Storage\\ClientInterface' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/ClientInterface.php',
+ 'OAuth2\\Storage\\CouchbaseDB' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/CouchbaseDB.php',
+ 'OAuth2\\Storage\\DynamoDB' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/DynamoDB.php',
+ 'OAuth2\\Storage\\JwtAccessToken' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/JwtAccessToken.php',
+ 'OAuth2\\Storage\\JwtAccessTokenInterface' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/JwtAccessTokenInterface.php',
+ 'OAuth2\\Storage\\JwtBearerInterface' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/JwtBearerInterface.php',
+ 'OAuth2\\Storage\\Memory' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/Memory.php',
+ 'OAuth2\\Storage\\Mongo' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/Mongo.php',
+ 'OAuth2\\Storage\\MongoDB' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/MongoDB.php',
+ 'OAuth2\\Storage\\Pdo' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/Pdo.php',
+ 'OAuth2\\Storage\\PublicKeyInterface' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/PublicKeyInterface.php',
+ 'OAuth2\\Storage\\Redis' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/Redis.php',
+ 'OAuth2\\Storage\\RefreshTokenInterface' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/RefreshTokenInterface.php',
+ 'OAuth2\\Storage\\ScopeInterface' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/ScopeInterface.php',
+ 'OAuth2\\Storage\\UserCredentialsInterface' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/UserCredentialsInterface.php',
+ 'OAuth2\\TokenType\\Bearer' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/TokenType/Bearer.php',
+ 'OAuth2\\TokenType\\Mac' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/TokenType/Mac.php',
+ 'OAuth2\\TokenType\\TokenTypeInterface' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/TokenType/TokenTypeInterface.php',
'Psr\\Log\\AbstractLogger' => $vendorDir . '/psr/log/Psr/Log/AbstractLogger.php',
'Psr\\Log\\InvalidArgumentException' => $vendorDir . '/psr/log/Psr/Log/InvalidArgumentException.php',
'Psr\\Log\\LogLevel' => $vendorDir . '/psr/log/Psr/Log/LogLevel.php',
@@ -353,10 +661,46 @@ return array(
'Sabre\\Xml\\Writer' => $vendorDir . '/sabre/xml/lib/Writer.php',
'Sabre\\Xml\\XmlDeserializable' => $vendorDir . '/sabre/xml/lib/XmlDeserializable.php',
'Sabre\\Xml\\XmlSerializable' => $vendorDir . '/sabre/xml/lib/XmlSerializable.php',
+ 'SimplePie' => $vendorDir . '/simplepie/simplepie/library/SimplePie.php',
+ 'SimplePie_Author' => $vendorDir . '/simplepie/simplepie/library/SimplePie/Author.php',
+ 'SimplePie_Cache' => $vendorDir . '/simplepie/simplepie/library/SimplePie/Cache.php',
+ 'SimplePie_Cache_Base' => $vendorDir . '/simplepie/simplepie/library/SimplePie/Cache/Base.php',
+ 'SimplePie_Cache_DB' => $vendorDir . '/simplepie/simplepie/library/SimplePie/Cache/DB.php',
+ 'SimplePie_Cache_File' => $vendorDir . '/simplepie/simplepie/library/SimplePie/Cache/File.php',
+ 'SimplePie_Cache_Memcache' => $vendorDir . '/simplepie/simplepie/library/SimplePie/Cache/Memcache.php',
+ 'SimplePie_Cache_Memcached' => $vendorDir . '/simplepie/simplepie/library/SimplePie/Cache/Memcached.php',
+ 'SimplePie_Cache_MySQL' => $vendorDir . '/simplepie/simplepie/library/SimplePie/Cache/MySQL.php',
+ 'SimplePie_Cache_Redis' => $vendorDir . '/simplepie/simplepie/library/SimplePie/Cache/Redis.php',
+ 'SimplePie_Caption' => $vendorDir . '/simplepie/simplepie/library/SimplePie/Caption.php',
+ 'SimplePie_Category' => $vendorDir . '/simplepie/simplepie/library/SimplePie/Category.php',
+ 'SimplePie_Content_Type_Sniffer' => $vendorDir . '/simplepie/simplepie/library/SimplePie/Content/Type/Sniffer.php',
+ 'SimplePie_Copyright' => $vendorDir . '/simplepie/simplepie/library/SimplePie/Copyright.php',
+ 'SimplePie_Core' => $vendorDir . '/simplepie/simplepie/library/SimplePie/Core.php',
+ 'SimplePie_Credit' => $vendorDir . '/simplepie/simplepie/library/SimplePie/Credit.php',
+ 'SimplePie_Decode_HTML_Entities' => $vendorDir . '/simplepie/simplepie/library/SimplePie/Decode/HTML/Entities.php',
+ 'SimplePie_Enclosure' => $vendorDir . '/simplepie/simplepie/library/SimplePie/Enclosure.php',
+ 'SimplePie_Exception' => $vendorDir . '/simplepie/simplepie/library/SimplePie/Exception.php',
+ 'SimplePie_File' => $vendorDir . '/simplepie/simplepie/library/SimplePie/File.php',
+ 'SimplePie_HTTP_Parser' => $vendorDir . '/simplepie/simplepie/library/SimplePie/HTTP/Parser.php',
+ 'SimplePie_IRI' => $vendorDir . '/simplepie/simplepie/library/SimplePie/IRI.php',
+ 'SimplePie_Item' => $vendorDir . '/simplepie/simplepie/library/SimplePie/Item.php',
+ 'SimplePie_Locator' => $vendorDir . '/simplepie/simplepie/library/SimplePie/Locator.php',
+ 'SimplePie_Misc' => $vendorDir . '/simplepie/simplepie/library/SimplePie/Misc.php',
+ 'SimplePie_Net_IPv6' => $vendorDir . '/simplepie/simplepie/library/SimplePie/Net/IPv6.php',
+ 'SimplePie_Parse_Date' => $vendorDir . '/simplepie/simplepie/library/SimplePie/Parse/Date.php',
+ 'SimplePie_Parser' => $vendorDir . '/simplepie/simplepie/library/SimplePie/Parser.php',
+ 'SimplePie_Rating' => $vendorDir . '/simplepie/simplepie/library/SimplePie/Rating.php',
+ 'SimplePie_Registry' => $vendorDir . '/simplepie/simplepie/library/SimplePie/Registry.php',
+ 'SimplePie_Restriction' => $vendorDir . '/simplepie/simplepie/library/SimplePie/Restriction.php',
+ 'SimplePie_Sanitize' => $vendorDir . '/simplepie/simplepie/library/SimplePie/Sanitize.php',
+ 'SimplePie_Source' => $vendorDir . '/simplepie/simplepie/library/SimplePie/Source.php',
+ 'SimplePie_XML_Declaration_Parser' => $vendorDir . '/simplepie/simplepie/library/SimplePie/XML/Declaration/Parser.php',
+ 'SimplePie_gzdecode' => $vendorDir . '/simplepie/simplepie/library/SimplePie/gzdecode.php',
'Zotlabs\\Access\\AccessList' => $baseDir . '/Zotlabs/Access/AccessList.php',
'Zotlabs\\Access\\PermissionLimits' => $baseDir . '/Zotlabs/Access/PermissionLimits.php',
'Zotlabs\\Access\\PermissionRoles' => $baseDir . '/Zotlabs/Access/PermissionRoles.php',
'Zotlabs\\Access\\Permissions' => $baseDir . '/Zotlabs/Access/Permissions.php',
+ 'Zotlabs\\Daemon\\Addon' => $baseDir . '/Zotlabs/Daemon/Addon.php',
'Zotlabs\\Daemon\\Checksites' => $baseDir . '/Zotlabs/Daemon/Checksites.php',
'Zotlabs\\Daemon\\Cli_suggest' => $baseDir . '/Zotlabs/Daemon/Cli_suggest.php',
'Zotlabs\\Daemon\\Cron' => $baseDir . '/Zotlabs/Daemon/Cron.php',
@@ -388,10 +732,15 @@ return array(
'Zotlabs\\Lib\\Cache' => $baseDir . '/Zotlabs/Lib/Cache.php',
'Zotlabs\\Lib\\Chatroom' => $baseDir . '/Zotlabs/Lib/Chatroom.php',
'Zotlabs\\Lib\\Config' => $baseDir . '/Zotlabs/Lib/Config.php',
+ 'Zotlabs\\Lib\\DB_Upgrade' => $baseDir . '/Zotlabs/Lib/DB_Upgrade.php',
'Zotlabs\\Lib\\Enotify' => $baseDir . '/Zotlabs/Lib/Enotify.php',
'Zotlabs\\Lib\\ExtendedZip' => $baseDir . '/Zotlabs/Lib/ExtendedZip.php',
'Zotlabs\\Lib\\IConfig' => $baseDir . '/Zotlabs/Lib/IConfig.php',
+ 'Zotlabs\\Lib\\MarkdownSoap' => $baseDir . '/Zotlabs/Lib/MarkdownSoap.php',
+ 'Zotlabs\\Lib\\NativeWiki' => $baseDir . '/Zotlabs/Lib/NativeWiki.php',
+ 'Zotlabs\\Lib\\NativeWikiPage' => $baseDir . '/Zotlabs/Lib/NativeWikiPage.php',
'Zotlabs\\Lib\\PConfig' => $baseDir . '/Zotlabs/Lib/PConfig.php',
+ 'Zotlabs\\Lib\\Permcat' => $baseDir . '/Zotlabs/Lib/Permcat.php',
'Zotlabs\\Lib\\PermissionDescription' => $baseDir . '/Zotlabs/Lib/PermissionDescription.php',
'Zotlabs\\Lib\\ProtoDriver' => $baseDir . '/Zotlabs/Lib/ProtoDriver.php',
'Zotlabs\\Lib\\SuperCurl' => $baseDir . '/Zotlabs/Lib/SuperCurl.php',
@@ -478,7 +827,6 @@ return array(
'Zotlabs\\Module\\Magic' => $baseDir . '/Zotlabs/Module/Magic.php',
'Zotlabs\\Module\\Mail' => $baseDir . '/Zotlabs/Module/Mail.php',
'Zotlabs\\Module\\Manage' => $baseDir . '/Zotlabs/Module/Manage.php',
- 'Zotlabs\\Module\\Match' => $baseDir . '/Zotlabs/Module/Match.php',
'Zotlabs\\Module\\Menu' => $baseDir . '/Zotlabs/Module/Menu.php',
'Zotlabs\\Module\\Message' => $baseDir . '/Zotlabs/Module/Message.php',
'Zotlabs\\Module\\Mitem' => $baseDir . '/Zotlabs/Module/Mitem.php',
@@ -492,10 +840,12 @@ return array(
'Zotlabs\\Module\\Oembed' => $baseDir . '/Zotlabs/Module/Oembed.php',
'Zotlabs\\Module\\Oep' => $baseDir . '/Zotlabs/Module/Oep.php',
'Zotlabs\\Module\\Oexchange' => $baseDir . '/Zotlabs/Module/Oexchange.php',
+ 'Zotlabs\\Module\\Ofeed' => $baseDir . '/Zotlabs/Module/Ofeed.php',
'Zotlabs\\Module\\Online' => $baseDir . '/Zotlabs/Module/Online.php',
'Zotlabs\\Module\\Page' => $baseDir . '/Zotlabs/Module/Page.php',
'Zotlabs\\Module\\Pconfig' => $baseDir . '/Zotlabs/Module/Pconfig.php',
'Zotlabs\\Module\\Pdledit' => $baseDir . '/Zotlabs/Module/Pdledit.php',
+ 'Zotlabs\\Module\\Permcat' => $baseDir . '/Zotlabs/Module/Permcat.php',
'Zotlabs\\Module\\Photo' => $baseDir . '/Zotlabs/Module/Photo.php',
'Zotlabs\\Module\\Photos' => $baseDir . '/Zotlabs/Module/Photos.php',
'Zotlabs\\Module\\Ping' => $baseDir . '/Zotlabs/Module/Ping.php',
@@ -525,7 +875,6 @@ return array(
'Zotlabs\\Module\\Removeme' => $baseDir . '/Zotlabs/Module/Removeme.php',
'Zotlabs\\Module\\Rmagic' => $baseDir . '/Zotlabs/Module/Rmagic.php',
'Zotlabs\\Module\\Rpost' => $baseDir . '/Zotlabs/Module/Rpost.php',
- 'Zotlabs\\Module\\Rsd_xml' => $baseDir . '/Zotlabs/Module/Rsd_xml.php',
'Zotlabs\\Module\\Search' => $baseDir . '/Zotlabs/Module/Search.php',
'Zotlabs\\Module\\Search_ac' => $baseDir . '/Zotlabs/Module/Search_ac.php',
'Zotlabs\\Module\\Service_limits' => $baseDir . '/Zotlabs/Module/Service_limits.php',
@@ -536,6 +885,7 @@ return array(
'Zotlabs\\Module\\Settings\\Featured' => $baseDir . '/Zotlabs/Module/Settings/Featured.php',
'Zotlabs\\Module\\Settings\\Features' => $baseDir . '/Zotlabs/Module/Settings/Features.php',
'Zotlabs\\Module\\Settings\\Oauth' => $baseDir . '/Zotlabs/Module/Settings/Oauth.php',
+ 'Zotlabs\\Module\\Settings\\Permcats' => $baseDir . '/Zotlabs/Module/Settings/Permcats.php',
'Zotlabs\\Module\\Settings\\Tokens' => $baseDir . '/Zotlabs/Module/Settings/Tokens.php',
'Zotlabs\\Module\\Setup' => $baseDir . '/Zotlabs/Module/Setup.php',
'Zotlabs\\Module\\Share' => $baseDir . '/Zotlabs/Module/Share.php',
@@ -596,12 +946,65 @@ return array(
'Zotlabs\\Text\\Tagadelic' => $baseDir . '/Zotlabs/Text/Tagadelic.php',
'Zotlabs\\Web\\CheckJS' => $baseDir . '/Zotlabs/Web/CheckJS.php',
'Zotlabs\\Web\\Controller' => $baseDir . '/Zotlabs/Web/Controller.php',
+ 'Zotlabs\\Web\\HTTPHeaders' => $baseDir . '/Zotlabs/Web/HTTPHeaders.php',
'Zotlabs\\Web\\HttpMeta' => $baseDir . '/Zotlabs/Web/HttpMeta.php',
'Zotlabs\\Web\\Router' => $baseDir . '/Zotlabs/Web/Router.php',
'Zotlabs\\Web\\Session' => $baseDir . '/Zotlabs/Web/Session.php',
'Zotlabs\\Web\\SessionHandler' => $baseDir . '/Zotlabs/Web/SessionHandler.php',
'Zotlabs\\Web\\SubModule' => $baseDir . '/Zotlabs/Web/SubModule.php',
'Zotlabs\\Web\\WebServer' => $baseDir . '/Zotlabs/Web/WebServer.php',
+ 'Zotlabs\\Widget\\Activity' => $baseDir . '/Zotlabs/Widget/Activity.php',
+ 'Zotlabs\\Widget\\Admin' => $baseDir . '/Zotlabs/Widget/Admin.php',
+ 'Zotlabs\\Widget\\Affinity' => $baseDir . '/Zotlabs/Widget/Affinity.php',
+ 'Zotlabs\\Widget\\Album' => $baseDir . '/Zotlabs/Widget/Album.php',
+ 'Zotlabs\\Widget\\Appcategories' => $baseDir . '/Zotlabs/Widget/Appcategories.php',
+ 'Zotlabs\\Widget\\Appcloud' => $baseDir . '/Zotlabs/Widget/Appcloud.php',
+ 'Zotlabs\\Widget\\Archive' => $baseDir . '/Zotlabs/Widget/Archive.php',
+ 'Zotlabs\\Widget\\Bookmarkedchats' => $baseDir . '/Zotlabs/Widget/Bookmarkedchats.php',
+ 'Zotlabs\\Widget\\Catcloud_wall' => $baseDir . '/Zotlabs/Widget/Catcloud_wall.php',
+ 'Zotlabs\\Widget\\Categories' => $baseDir . '/Zotlabs/Widget/Categories.php',
+ 'Zotlabs\\Widget\\Chatroom_list' => $baseDir . '/Zotlabs/Widget/Chatroom_list.php',
+ 'Zotlabs\\Widget\\Chatroom_members' => $baseDir . '/Zotlabs/Widget/Chatroom_members.php',
+ 'Zotlabs\\Widget\\Clock' => $baseDir . '/Zotlabs/Widget/Clock.php',
+ 'Zotlabs\\Widget\\Collections' => $baseDir . '/Zotlabs/Widget/Collections.php',
+ 'Zotlabs\\Widget\\Conversations' => $baseDir . '/Zotlabs/Widget/Conversations.php',
+ 'Zotlabs\\Widget\\Cover_photo' => $baseDir . '/Zotlabs/Widget/Cover_photo.php',
+ 'Zotlabs\\Widget\\Design_tools' => $baseDir . '/Zotlabs/Widget/Design_tools.php',
+ 'Zotlabs\\Widget\\Dirsort' => $baseDir . '/Zotlabs/Widget/Dirsort.php',
+ 'Zotlabs\\Widget\\Dirtags' => $baseDir . '/Zotlabs/Widget/Dirtags.php',
+ 'Zotlabs\\Widget\\Eventstools' => $baseDir . '/Zotlabs/Widget/Eventstools.php',
+ 'Zotlabs\\Widget\\Filer' => $baseDir . '/Zotlabs/Widget/Filer.php',
+ 'Zotlabs\\Widget\\Findpeople' => $baseDir . '/Zotlabs/Widget/Findpeople.php',
+ 'Zotlabs\\Widget\\Follow' => $baseDir . '/Zotlabs/Widget/Follow.php',
+ 'Zotlabs\\Widget\\Forums' => $baseDir . '/Zotlabs/Widget/Forums.php',
+ 'Zotlabs\\Widget\\Fullprofile' => $baseDir . '/Zotlabs/Widget/Fullprofile.php',
+ 'Zotlabs\\Widget\\Helpindex' => $baseDir . '/Zotlabs/Widget/Helpindex.php',
+ 'Zotlabs\\Widget\\Item' => $baseDir . '/Zotlabs/Widget/Item.php',
+ 'Zotlabs\\Widget\\Mailmenu' => $baseDir . '/Zotlabs/Widget/Mailmenu.php',
+ 'Zotlabs\\Widget\\Menu_preview' => $baseDir . '/Zotlabs/Widget/Menu_preview.php',
+ 'Zotlabs\\Widget\\Notes' => $baseDir . '/Zotlabs/Widget/Notes.php',
+ 'Zotlabs\\Widget\\Photo' => $baseDir . '/Zotlabs/Widget/Photo.php',
+ 'Zotlabs\\Widget\\Photo_albums' => $baseDir . '/Zotlabs/Widget/Photo_albums.php',
+ 'Zotlabs\\Widget\\Photo_rand' => $baseDir . '/Zotlabs/Widget/Photo_rand.php',
+ 'Zotlabs\\Widget\\Profile' => $baseDir . '/Zotlabs/Widget/Profile.php',
+ 'Zotlabs\\Widget\\Pubsites' => $baseDir . '/Zotlabs/Widget/Pubsites.php',
+ 'Zotlabs\\Widget\\Random_block' => $baseDir . '/Zotlabs/Widget/Random_block.php',
+ 'Zotlabs\\Widget\\Rating' => $baseDir . '/Zotlabs/Widget/Rating.php',
+ 'Zotlabs\\Widget\\Savedsearch' => $baseDir . '/Zotlabs/Widget/Savedsearch.php',
+ 'Zotlabs\\Widget\\Settings_menu' => $baseDir . '/Zotlabs/Widget/Settings_menu.php',
+ 'Zotlabs\\Widget\\Shortprofile' => $baseDir . '/Zotlabs/Widget/Shortprofile.php',
+ 'Zotlabs\\Widget\\Sitesearch' => $baseDir . '/Zotlabs/Widget/Sitesearch.php',
+ 'Zotlabs\\Widget\\Suggestedchats' => $baseDir . '/Zotlabs/Widget/Suggestedchats.php',
+ 'Zotlabs\\Widget\\Suggestions' => $baseDir . '/Zotlabs/Widget/Suggestions.php',
+ 'Zotlabs\\Widget\\Tagcloud' => $baseDir . '/Zotlabs/Widget/Tagcloud.php',
+ 'Zotlabs\\Widget\\Tagcloud_wall' => $baseDir . '/Zotlabs/Widget/Tagcloud_wall.php',
+ 'Zotlabs\\Widget\\Tasklist' => $baseDir . '/Zotlabs/Widget/Tasklist.php',
+ 'Zotlabs\\Widget\\Vcard' => $baseDir . '/Zotlabs/Widget/Vcard.php',
+ 'Zotlabs\\Widget\\Website_portation_tools' => $baseDir . '/Zotlabs/Widget/Website_portation_tools.php',
+ 'Zotlabs\\Widget\\Wiki_list' => $baseDir . '/Zotlabs/Widget/Wiki_list.php',
+ 'Zotlabs\\Widget\\Wiki_page_history' => $baseDir . '/Zotlabs/Widget/Wiki_page_history.php',
+ 'Zotlabs\\Widget\\Wiki_pages' => $baseDir . '/Zotlabs/Widget/Wiki_pages.php',
+ 'Zotlabs\\Widget\\Zcard' => $baseDir . '/Zotlabs/Widget/Zcard.php',
'Zotlabs\\Zot\\Auth' => $baseDir . '/Zotlabs/Zot/Auth.php',
'Zotlabs\\Zot\\DReport' => $baseDir . '/Zotlabs/Zot/DReport.php',
'Zotlabs\\Zot\\Finger' => $baseDir . '/Zotlabs/Zot/Finger.php',
diff --git a/vendor/composer/autoload_files.php b/vendor/composer/autoload_files.php
index a78cbe6fb..bbe6fd553 100644
--- a/vendor/composer/autoload_files.php
+++ b/vendor/composer/autoload_files.php
@@ -13,4 +13,5 @@ return array(
'3569eecfeed3bcf0bad3c998a494ecb8' => $vendorDir . '/sabre/xml/lib/Deserializer/functions.php',
'93aa591bc4ca510c520999e34229ee79' => $vendorDir . '/sabre/xml/lib/Serializer/functions.php',
'ebdb698ed4152ae445614b69b5e4bb6a' => $vendorDir . '/sabre/http/lib/functions.php',
+ '2cffec82183ee1cea088009cef9a6fc3' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier.composer.php',
);
diff --git a/vendor/composer/autoload_namespaces.php b/vendor/composer/autoload_namespaces.php
index b7fc0125d..d7070bbbf 100644
--- a/vendor/composer/autoload_namespaces.php
+++ b/vendor/composer/autoload_namespaces.php
@@ -6,4 +6,8 @@ $vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
+ 'SimplePie' => array($vendorDir . '/simplepie/simplepie/library'),
+ 'OAuth2' => array($vendorDir . '/bshaffer/oauth2-server-php/src'),
+ 'Michelf' => array($vendorDir . '/michelf/php-markdown'),
+ 'HTMLPurifier' => array($vendorDir . '/ezyang/htmlpurifier/library'),
);
diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php
index e8ea2ed78..00a183cc1 100644
--- a/vendor/composer/autoload_psr4.php
+++ b/vendor/composer/autoload_psr4.php
@@ -7,6 +7,7 @@ $baseDir = dirname($vendorDir);
return array(
'Zotlabs\\' => array($baseDir . '/Zotlabs'),
+ 'Test\\Markdownify\\' => array($vendorDir . '/pixel418/markdownify/test'),
'Sabre\\Xml\\' => array($vendorDir . '/sabre/xml/lib'),
'Sabre\\VObject\\' => array($vendorDir . '/sabre/vobject/lib'),
'Sabre\\Uri\\' => array($vendorDir . '/sabre/uri/lib'),
@@ -17,5 +18,6 @@ return array(
'Sabre\\CardDAV\\' => array($vendorDir . '/sabre/dav/lib/CardDAV'),
'Sabre\\CalDAV\\' => array($vendorDir . '/sabre/dav/lib/CalDAV'),
'Psr\\Log\\' => array($vendorDir . '/psr/log/Psr/Log'),
+ 'Markdownify\\' => array($vendorDir . '/pixel418/markdownify/src'),
'Hubzilla\\' => array($baseDir . '/include'),
);
diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php
index 24b45085d..bcae78e29 100644
--- a/vendor/composer/autoload_real.php
+++ b/vendor/composer/autoload_real.php
@@ -23,7 +23,7 @@ class ComposerAutoloaderInit7b34d7e50a62201ec5d5e526a5b8b35d
self::$loader = $loader = new \Composer\Autoload\ClassLoader();
spl_autoload_unregister(array('ComposerAutoloaderInit7b34d7e50a62201ec5d5e526a5b8b35d', 'loadClassLoader'));
- $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION');
+ $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
if ($useStaticLoader) {
require_once __DIR__ . '/autoload_static.php';
diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php
index 7f2551665..53b9b20c3 100644
--- a/vendor/composer/autoload_static.php
+++ b/vendor/composer/autoload_static.php
@@ -14,6 +14,7 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d
'3569eecfeed3bcf0bad3c998a494ecb8' => __DIR__ . '/..' . '/sabre/xml/lib/Deserializer/functions.php',
'93aa591bc4ca510c520999e34229ee79' => __DIR__ . '/..' . '/sabre/xml/lib/Serializer/functions.php',
'ebdb698ed4152ae445614b69b5e4bb6a' => __DIR__ . '/..' . '/sabre/http/lib/functions.php',
+ '2cffec82183ee1cea088009cef9a6fc3' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier.composer.php',
);
public static $prefixLengthsPsr4 = array (
@@ -21,6 +22,10 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d
array (
'Zotlabs\\' => 8,
),
+ 'T' =>
+ array (
+ 'Test\\Markdownify\\' => 17,
+ ),
'S' =>
array (
'Sabre\\Xml\\' => 10,
@@ -37,6 +42,10 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d
array (
'Psr\\Log\\' => 8,
),
+ 'M' =>
+ array (
+ 'Markdownify\\' => 12,
+ ),
'H' =>
array (
'Hubzilla\\' => 9,
@@ -48,6 +57,10 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d
array (
0 => __DIR__ . '/../..' . '/Zotlabs',
),
+ 'Test\\Markdownify\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/pixel418/markdownify/test',
+ ),
'Sabre\\Xml\\' =>
array (
0 => __DIR__ . '/..' . '/sabre/xml/lib',
@@ -88,14 +101,357 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d
array (
0 => __DIR__ . '/..' . '/psr/log/Psr/Log',
),
+ 'Markdownify\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/pixel418/markdownify/src',
+ ),
'Hubzilla\\' =>
array (
0 => __DIR__ . '/../..' . '/include',
),
);
+ public static $prefixesPsr0 = array (
+ 'S' =>
+ array (
+ 'SimplePie' =>
+ array (
+ 0 => __DIR__ . '/..' . '/simplepie/simplepie/library',
+ ),
+ ),
+ 'O' =>
+ array (
+ 'OAuth2' =>
+ array (
+ 0 => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src',
+ ),
+ ),
+ 'M' =>
+ array (
+ 'Michelf' =>
+ array (
+ 0 => __DIR__ . '/..' . '/michelf/php-markdown',
+ ),
+ ),
+ 'H' =>
+ array (
+ 'HTMLPurifier' =>
+ array (
+ 0 => __DIR__ . '/..' . '/ezyang/htmlpurifier/library',
+ ),
+ ),
+ );
+
public static $classMap = array (
+ 'HTMLPurifier' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier.php',
+ 'HTMLPurifier_Arborize' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Arborize.php',
+ 'HTMLPurifier_AttrCollections' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrCollections.php',
+ 'HTMLPurifier_AttrDef' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef.php',
+ 'HTMLPurifier_AttrDef_CSS' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS.php',
+ 'HTMLPurifier_AttrDef_CSS_AlphaValue' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/AlphaValue.php',
+ 'HTMLPurifier_AttrDef_CSS_Background' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Background.php',
+ 'HTMLPurifier_AttrDef_CSS_BackgroundPosition' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php',
+ 'HTMLPurifier_AttrDef_CSS_Border' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Border.php',
+ 'HTMLPurifier_AttrDef_CSS_Color' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Color.php',
+ 'HTMLPurifier_AttrDef_CSS_Composite' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Composite.php',
+ 'HTMLPurifier_AttrDef_CSS_DenyElementDecorator' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php',
+ 'HTMLPurifier_AttrDef_CSS_Filter' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Filter.php',
+ 'HTMLPurifier_AttrDef_CSS_Font' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Font.php',
+ 'HTMLPurifier_AttrDef_CSS_FontFamily' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/FontFamily.php',
+ 'HTMLPurifier_AttrDef_CSS_Ident' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Ident.php',
+ 'HTMLPurifier_AttrDef_CSS_ImportantDecorator' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/ImportantDecorator.php',
+ 'HTMLPurifier_AttrDef_CSS_Length' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Length.php',
+ 'HTMLPurifier_AttrDef_CSS_ListStyle' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/ListStyle.php',
+ 'HTMLPurifier_AttrDef_CSS_Multiple' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Multiple.php',
+ 'HTMLPurifier_AttrDef_CSS_Number' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Number.php',
+ 'HTMLPurifier_AttrDef_CSS_Percentage' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Percentage.php',
+ 'HTMLPurifier_AttrDef_CSS_TextDecoration' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/TextDecoration.php',
+ 'HTMLPurifier_AttrDef_CSS_URI' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/URI.php',
+ 'HTMLPurifier_AttrDef_Clone' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Clone.php',
+ 'HTMLPurifier_AttrDef_Enum' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Enum.php',
+ 'HTMLPurifier_AttrDef_HTML_Bool' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Bool.php',
+ 'HTMLPurifier_AttrDef_HTML_Class' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Class.php',
+ 'HTMLPurifier_AttrDef_HTML_Color' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Color.php',
+ 'HTMLPurifier_AttrDef_HTML_FrameTarget' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/FrameTarget.php',
+ 'HTMLPurifier_AttrDef_HTML_ID' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/ID.php',
+ 'HTMLPurifier_AttrDef_HTML_Length' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Length.php',
+ 'HTMLPurifier_AttrDef_HTML_LinkTypes' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/LinkTypes.php',
+ 'HTMLPurifier_AttrDef_HTML_MultiLength' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/MultiLength.php',
+ 'HTMLPurifier_AttrDef_HTML_Nmtokens' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Nmtokens.php',
+ 'HTMLPurifier_AttrDef_HTML_Pixels' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Pixels.php',
+ 'HTMLPurifier_AttrDef_Integer' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Integer.php',
+ 'HTMLPurifier_AttrDef_Lang' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Lang.php',
+ 'HTMLPurifier_AttrDef_Switch' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Switch.php',
+ 'HTMLPurifier_AttrDef_Text' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Text.php',
+ 'HTMLPurifier_AttrDef_URI' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI.php',
+ 'HTMLPurifier_AttrDef_URI_Email' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Email.php',
+ 'HTMLPurifier_AttrDef_URI_Email_SimpleCheck' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Email/SimpleCheck.php',
+ 'HTMLPurifier_AttrDef_URI_Host' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Host.php',
+ 'HTMLPurifier_AttrDef_URI_IPv4' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/IPv4.php',
+ 'HTMLPurifier_AttrDef_URI_IPv6' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/IPv6.php',
+ 'HTMLPurifier_AttrTransform' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform.php',
+ 'HTMLPurifier_AttrTransform_Background' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Background.php',
+ 'HTMLPurifier_AttrTransform_BdoDir' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/BdoDir.php',
+ 'HTMLPurifier_AttrTransform_BgColor' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/BgColor.php',
+ 'HTMLPurifier_AttrTransform_BoolToCSS' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/BoolToCSS.php',
+ 'HTMLPurifier_AttrTransform_Border' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Border.php',
+ 'HTMLPurifier_AttrTransform_EnumToCSS' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/EnumToCSS.php',
+ 'HTMLPurifier_AttrTransform_ImgRequired' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ImgRequired.php',
+ 'HTMLPurifier_AttrTransform_ImgSpace' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ImgSpace.php',
+ 'HTMLPurifier_AttrTransform_Input' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Input.php',
+ 'HTMLPurifier_AttrTransform_Lang' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Lang.php',
+ 'HTMLPurifier_AttrTransform_Length' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Length.php',
+ 'HTMLPurifier_AttrTransform_Name' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Name.php',
+ 'HTMLPurifier_AttrTransform_NameSync' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/NameSync.php',
+ 'HTMLPurifier_AttrTransform_Nofollow' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Nofollow.php',
+ 'HTMLPurifier_AttrTransform_SafeEmbed' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeEmbed.php',
+ 'HTMLPurifier_AttrTransform_SafeObject' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeObject.php',
+ 'HTMLPurifier_AttrTransform_SafeParam' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeParam.php',
+ 'HTMLPurifier_AttrTransform_ScriptRequired' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ScriptRequired.php',
+ 'HTMLPurifier_AttrTransform_TargetBlank' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/TargetBlank.php',
+ 'HTMLPurifier_AttrTransform_TargetNoopener' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/TargetNoopener.php',
+ 'HTMLPurifier_AttrTransform_TargetNoreferrer' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/TargetNoreferrer.php',
+ 'HTMLPurifier_AttrTransform_Textarea' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Textarea.php',
+ 'HTMLPurifier_AttrTypes' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTypes.php',
+ 'HTMLPurifier_AttrValidator' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrValidator.php',
+ 'HTMLPurifier_Bootstrap' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Bootstrap.php',
+ 'HTMLPurifier_CSSDefinition' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/CSSDefinition.php',
+ 'HTMLPurifier_ChildDef' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef.php',
+ 'HTMLPurifier_ChildDef_Chameleon' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Chameleon.php',
+ 'HTMLPurifier_ChildDef_Custom' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Custom.php',
+ 'HTMLPurifier_ChildDef_Empty' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Empty.php',
+ 'HTMLPurifier_ChildDef_List' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/List.php',
+ 'HTMLPurifier_ChildDef_Optional' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Optional.php',
+ 'HTMLPurifier_ChildDef_Required' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Required.php',
+ 'HTMLPurifier_ChildDef_StrictBlockquote' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/StrictBlockquote.php',
+ 'HTMLPurifier_ChildDef_Table' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Table.php',
+ 'HTMLPurifier_Config' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Config.php',
+ 'HTMLPurifier_ConfigSchema' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema.php',
+ 'HTMLPurifier_ConfigSchema_Builder_ConfigSchema' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Builder/ConfigSchema.php',
+ 'HTMLPurifier_ConfigSchema_Builder_Xml' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Builder/Xml.php',
+ 'HTMLPurifier_ConfigSchema_Exception' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Exception.php',
+ 'HTMLPurifier_ConfigSchema_Interchange' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange.php',
+ 'HTMLPurifier_ConfigSchema_InterchangeBuilder' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/InterchangeBuilder.php',
+ 'HTMLPurifier_ConfigSchema_Interchange_Directive' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange/Directive.php',
+ 'HTMLPurifier_ConfigSchema_Interchange_Id' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange/Id.php',
+ 'HTMLPurifier_ConfigSchema_Validator' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Validator.php',
+ 'HTMLPurifier_ConfigSchema_ValidatorAtom' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/ValidatorAtom.php',
+ 'HTMLPurifier_ContentSets' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/ContentSets.php',
+ 'HTMLPurifier_Context' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Context.php',
+ 'HTMLPurifier_Definition' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Definition.php',
+ 'HTMLPurifier_DefinitionCache' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache.php',
+ 'HTMLPurifier_DefinitionCacheFactory' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCacheFactory.php',
+ 'HTMLPurifier_DefinitionCache_Decorator' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator.php',
+ 'HTMLPurifier_DefinitionCache_Decorator_Cleanup' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php',
+ 'HTMLPurifier_DefinitionCache_Decorator_Memory' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Memory.php',
+ 'HTMLPurifier_DefinitionCache_Null' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Null.php',
+ 'HTMLPurifier_DefinitionCache_Serializer' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Serializer.php',
+ 'HTMLPurifier_Doctype' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Doctype.php',
+ 'HTMLPurifier_DoctypeRegistry' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/DoctypeRegistry.php',
+ 'HTMLPurifier_ElementDef' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/ElementDef.php',
+ 'HTMLPurifier_Encoder' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Encoder.php',
+ 'HTMLPurifier_EntityLookup' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/EntityLookup.php',
+ 'HTMLPurifier_EntityParser' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/EntityParser.php',
+ 'HTMLPurifier_ErrorCollector' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/ErrorCollector.php',
+ 'HTMLPurifier_ErrorStruct' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/ErrorStruct.php',
+ 'HTMLPurifier_Exception' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Exception.php',
+ 'HTMLPurifier_Filter' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Filter.php',
+ 'HTMLPurifier_Filter_ExtractStyleBlocks' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Filter/ExtractStyleBlocks.php',
+ 'HTMLPurifier_Filter_YouTube' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Filter/YouTube.php',
+ 'HTMLPurifier_Generator' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Generator.php',
+ 'HTMLPurifier_HTMLDefinition' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLDefinition.php',
+ 'HTMLPurifier_HTMLModule' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule.php',
+ 'HTMLPurifier_HTMLModuleManager' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModuleManager.php',
+ 'HTMLPurifier_HTMLModule_Bdo' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Bdo.php',
+ 'HTMLPurifier_HTMLModule_CommonAttributes' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/CommonAttributes.php',
+ 'HTMLPurifier_HTMLModule_Edit' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Edit.php',
+ 'HTMLPurifier_HTMLModule_Forms' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Forms.php',
+ 'HTMLPurifier_HTMLModule_Hypertext' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Hypertext.php',
+ 'HTMLPurifier_HTMLModule_Iframe' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Iframe.php',
+ 'HTMLPurifier_HTMLModule_Image' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Image.php',
+ 'HTMLPurifier_HTMLModule_Legacy' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Legacy.php',
+ 'HTMLPurifier_HTMLModule_List' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/List.php',
+ 'HTMLPurifier_HTMLModule_Name' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Name.php',
+ 'HTMLPurifier_HTMLModule_Nofollow' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Nofollow.php',
+ 'HTMLPurifier_HTMLModule_NonXMLCommonAttributes' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php',
+ 'HTMLPurifier_HTMLModule_Object' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Object.php',
+ 'HTMLPurifier_HTMLModule_Presentation' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Presentation.php',
+ 'HTMLPurifier_HTMLModule_Proprietary' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Proprietary.php',
+ 'HTMLPurifier_HTMLModule_Ruby' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Ruby.php',
+ 'HTMLPurifier_HTMLModule_SafeEmbed' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeEmbed.php',
+ 'HTMLPurifier_HTMLModule_SafeObject' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeObject.php',
+ 'HTMLPurifier_HTMLModule_SafeScripting' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeScripting.php',
+ 'HTMLPurifier_HTMLModule_Scripting' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Scripting.php',
+ 'HTMLPurifier_HTMLModule_StyleAttribute' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/StyleAttribute.php',
+ 'HTMLPurifier_HTMLModule_Tables' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tables.php',
+ 'HTMLPurifier_HTMLModule_Target' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Target.php',
+ 'HTMLPurifier_HTMLModule_TargetBlank' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/TargetBlank.php',
+ 'HTMLPurifier_HTMLModule_TargetNoopener' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/TargetNoopener.php',
+ 'HTMLPurifier_HTMLModule_TargetNoreferrer' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/TargetNoreferrer.php',
+ 'HTMLPurifier_HTMLModule_Text' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Text.php',
+ 'HTMLPurifier_HTMLModule_Tidy' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy.php',
+ 'HTMLPurifier_HTMLModule_Tidy_Name' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Name.php',
+ 'HTMLPurifier_HTMLModule_Tidy_Proprietary' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Proprietary.php',
+ 'HTMLPurifier_HTMLModule_Tidy_Strict' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Strict.php',
+ 'HTMLPurifier_HTMLModule_Tidy_Transitional' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Transitional.php',
+ 'HTMLPurifier_HTMLModule_Tidy_XHTML' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/XHTML.php',
+ 'HTMLPurifier_HTMLModule_Tidy_XHTMLAndHTML4' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/XHTMLAndHTML4.php',
+ 'HTMLPurifier_HTMLModule_XMLCommonAttributes' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/XMLCommonAttributes.php',
+ 'HTMLPurifier_IDAccumulator' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/IDAccumulator.php',
+ 'HTMLPurifier_Injector' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Injector.php',
+ 'HTMLPurifier_Injector_AutoParagraph' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Injector/AutoParagraph.php',
+ 'HTMLPurifier_Injector_DisplayLinkURI' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Injector/DisplayLinkURI.php',
+ 'HTMLPurifier_Injector_Linkify' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Injector/Linkify.php',
+ 'HTMLPurifier_Injector_PurifierLinkify' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Injector/PurifierLinkify.php',
+ 'HTMLPurifier_Injector_RemoveEmpty' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Injector/RemoveEmpty.php',
+ 'HTMLPurifier_Injector_RemoveSpansWithoutAttributes' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Injector/RemoveSpansWithoutAttributes.php',
+ 'HTMLPurifier_Injector_SafeObject' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Injector/SafeObject.php',
+ 'HTMLPurifier_Language' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Language.php',
+ 'HTMLPurifier_LanguageFactory' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/LanguageFactory.php',
+ 'HTMLPurifier_Language_en_x_test' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Language/classes/en-x-test.php',
+ 'HTMLPurifier_Length' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Length.php',
+ 'HTMLPurifier_Lexer' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Lexer.php',
+ 'HTMLPurifier_Lexer_DOMLex' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/DOMLex.php',
+ 'HTMLPurifier_Lexer_DirectLex' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/DirectLex.php',
+ 'HTMLPurifier_Lexer_PH5P' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/PH5P.php',
+ 'HTMLPurifier_Node' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Node.php',
+ 'HTMLPurifier_Node_Comment' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Node/Comment.php',
+ 'HTMLPurifier_Node_Element' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Node/Element.php',
+ 'HTMLPurifier_Node_Text' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Node/Text.php',
+ 'HTMLPurifier_PercentEncoder' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/PercentEncoder.php',
+ 'HTMLPurifier_Printer' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Printer.php',
+ 'HTMLPurifier_Printer_CSSDefinition' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Printer/CSSDefinition.php',
+ 'HTMLPurifier_Printer_ConfigForm' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.php',
+ 'HTMLPurifier_Printer_ConfigForm_NullDecorator' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.php',
+ 'HTMLPurifier_Printer_ConfigForm_bool' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.php',
+ 'HTMLPurifier_Printer_ConfigForm_default' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.php',
+ 'HTMLPurifier_Printer_HTMLDefinition' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Printer/HTMLDefinition.php',
+ 'HTMLPurifier_PropertyList' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/PropertyList.php',
+ 'HTMLPurifier_PropertyListIterator' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/PropertyListIterator.php',
+ 'HTMLPurifier_Queue' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Queue.php',
+ 'HTMLPurifier_Strategy' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Strategy.php',
+ 'HTMLPurifier_Strategy_Composite' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/Composite.php',
+ 'HTMLPurifier_Strategy_Core' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/Core.php',
+ 'HTMLPurifier_Strategy_FixNesting' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/FixNesting.php',
+ 'HTMLPurifier_Strategy_MakeWellFormed' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/MakeWellFormed.php',
+ 'HTMLPurifier_Strategy_RemoveForeignElements' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/RemoveForeignElements.php',
+ 'HTMLPurifier_Strategy_ValidateAttributes' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/ValidateAttributes.php',
+ 'HTMLPurifier_StringHash' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/StringHash.php',
+ 'HTMLPurifier_StringHashParser' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/StringHashParser.php',
+ 'HTMLPurifier_TagTransform' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/TagTransform.php',
+ 'HTMLPurifier_TagTransform_Font' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/TagTransform/Font.php',
+ 'HTMLPurifier_TagTransform_Simple' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/TagTransform/Simple.php',
+ 'HTMLPurifier_Token' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Token.php',
+ 'HTMLPurifier_TokenFactory' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/TokenFactory.php',
+ 'HTMLPurifier_Token_Comment' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Token/Comment.php',
+ 'HTMLPurifier_Token_Empty' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Token/Empty.php',
+ 'HTMLPurifier_Token_End' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Token/End.php',
+ 'HTMLPurifier_Token_Start' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Token/Start.php',
+ 'HTMLPurifier_Token_Tag' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Token/Tag.php',
+ 'HTMLPurifier_Token_Text' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Token/Text.php',
+ 'HTMLPurifier_URI' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/URI.php',
+ 'HTMLPurifier_URIDefinition' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/URIDefinition.php',
+ 'HTMLPurifier_URIFilter' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter.php',
+ 'HTMLPurifier_URIFilter_DisableExternal' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/DisableExternal.php',
+ 'HTMLPurifier_URIFilter_DisableExternalResources' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/DisableExternalResources.php',
+ 'HTMLPurifier_URIFilter_DisableResources' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/DisableResources.php',
+ 'HTMLPurifier_URIFilter_HostBlacklist' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/HostBlacklist.php',
+ 'HTMLPurifier_URIFilter_MakeAbsolute' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/MakeAbsolute.php',
+ 'HTMLPurifier_URIFilter_Munge' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/Munge.php',
+ 'HTMLPurifier_URIFilter_SafeIframe' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/SafeIframe.php',
+ 'HTMLPurifier_URIParser' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/URIParser.php',
+ 'HTMLPurifier_URIScheme' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme.php',
+ 'HTMLPurifier_URISchemeRegistry' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/URISchemeRegistry.php',
+ 'HTMLPurifier_URIScheme_data' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/data.php',
+ 'HTMLPurifier_URIScheme_file' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/file.php',
+ 'HTMLPurifier_URIScheme_ftp' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/ftp.php',
+ 'HTMLPurifier_URIScheme_http' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/http.php',
+ 'HTMLPurifier_URIScheme_https' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/https.php',
+ 'HTMLPurifier_URIScheme_mailto' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/mailto.php',
+ 'HTMLPurifier_URIScheme_news' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/news.php',
+ 'HTMLPurifier_URIScheme_nntp' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/nntp.php',
+ 'HTMLPurifier_URIScheme_tel' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/tel.php',
+ 'HTMLPurifier_UnitConverter' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/UnitConverter.php',
+ 'HTMLPurifier_VarParser' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/VarParser.php',
+ 'HTMLPurifier_VarParserException' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/VarParserException.php',
+ 'HTMLPurifier_VarParser_Flexible' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/VarParser/Flexible.php',
+ 'HTMLPurifier_VarParser_Native' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/VarParser/Native.php',
+ 'HTMLPurifier_Zipper' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Zipper.php',
'Hubzilla\\Import\\Import' => __DIR__ . '/../..' . '/include/Import/Importer.php',
+ 'Markdownify\\Converter' => __DIR__ . '/..' . '/pixel418/markdownify/src/Converter.php',
+ 'Markdownify\\ConverterExtra' => __DIR__ . '/..' . '/pixel418/markdownify/src/ConverterExtra.php',
+ 'Markdownify\\Parser' => __DIR__ . '/..' . '/pixel418/markdownify/src/Parser.php',
+ 'Michelf\\Markdown' => __DIR__ . '/..' . '/michelf/php-markdown/Michelf/Markdown.php',
+ 'Michelf\\MarkdownExtra' => __DIR__ . '/..' . '/michelf/php-markdown/Michelf/MarkdownExtra.php',
+ 'Michelf\\MarkdownInterface' => __DIR__ . '/..' . '/michelf/php-markdown/Michelf/MarkdownInterface.php',
+ 'OAuth2\\Autoloader' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Autoloader.php',
+ 'OAuth2\\ClientAssertionType\\ClientAssertionTypeInterface' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/ClientAssertionType/ClientAssertionTypeInterface.php',
+ 'OAuth2\\ClientAssertionType\\HttpBasic' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/ClientAssertionType/HttpBasic.php',
+ 'OAuth2\\Controller\\AuthorizeController' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Controller/AuthorizeController.php',
+ 'OAuth2\\Controller\\AuthorizeControllerInterface' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Controller/AuthorizeControllerInterface.php',
+ 'OAuth2\\Controller\\ResourceController' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Controller/ResourceController.php',
+ 'OAuth2\\Controller\\ResourceControllerInterface' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Controller/ResourceControllerInterface.php',
+ 'OAuth2\\Controller\\TokenController' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Controller/TokenController.php',
+ 'OAuth2\\Controller\\TokenControllerInterface' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Controller/TokenControllerInterface.php',
+ 'OAuth2\\Encryption\\EncryptionInterface' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Encryption/EncryptionInterface.php',
+ 'OAuth2\\Encryption\\FirebaseJwt' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Encryption/FirebaseJwt.php',
+ 'OAuth2\\Encryption\\Jwt' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Encryption/Jwt.php',
+ 'OAuth2\\GrantType\\AuthorizationCode' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/GrantType/AuthorizationCode.php',
+ 'OAuth2\\GrantType\\ClientCredentials' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/GrantType/ClientCredentials.php',
+ 'OAuth2\\GrantType\\GrantTypeInterface' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/GrantType/GrantTypeInterface.php',
+ 'OAuth2\\GrantType\\JwtBearer' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/GrantType/JwtBearer.php',
+ 'OAuth2\\GrantType\\RefreshToken' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/GrantType/RefreshToken.php',
+ 'OAuth2\\GrantType\\UserCredentials' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/GrantType/UserCredentials.php',
+ 'OAuth2\\OpenID\\Controller\\AuthorizeController' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Controller/AuthorizeController.php',
+ 'OAuth2\\OpenID\\Controller\\AuthorizeControllerInterface' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Controller/AuthorizeControllerInterface.php',
+ 'OAuth2\\OpenID\\Controller\\UserInfoController' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Controller/UserInfoController.php',
+ 'OAuth2\\OpenID\\Controller\\UserInfoControllerInterface' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Controller/UserInfoControllerInterface.php',
+ 'OAuth2\\OpenID\\GrantType\\AuthorizationCode' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/OpenID/GrantType/AuthorizationCode.php',
+ 'OAuth2\\OpenID\\ResponseType\\AuthorizationCode' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/AuthorizationCode.php',
+ 'OAuth2\\OpenID\\ResponseType\\AuthorizationCodeInterface' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/AuthorizationCodeInterface.php',
+ 'OAuth2\\OpenID\\ResponseType\\CodeIdToken' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/CodeIdToken.php',
+ 'OAuth2\\OpenID\\ResponseType\\CodeIdTokenInterface' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/CodeIdTokenInterface.php',
+ 'OAuth2\\OpenID\\ResponseType\\IdToken' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/IdToken.php',
+ 'OAuth2\\OpenID\\ResponseType\\IdTokenInterface' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/IdTokenInterface.php',
+ 'OAuth2\\OpenID\\ResponseType\\IdTokenToken' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/IdTokenToken.php',
+ 'OAuth2\\OpenID\\ResponseType\\IdTokenTokenInterface' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/IdTokenTokenInterface.php',
+ 'OAuth2\\OpenID\\Storage\\AuthorizationCodeInterface' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Storage/AuthorizationCodeInterface.php',
+ 'OAuth2\\OpenID\\Storage\\UserClaimsInterface' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Storage/UserClaimsInterface.php',
+ 'OAuth2\\Request' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Request.php',
+ 'OAuth2\\RequestInterface' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/RequestInterface.php',
+ 'OAuth2\\Response' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Response.php',
+ 'OAuth2\\ResponseInterface' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/ResponseInterface.php',
+ 'OAuth2\\ResponseType\\AccessToken' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/AccessToken.php',
+ 'OAuth2\\ResponseType\\AccessTokenInterface' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/AccessTokenInterface.php',
+ 'OAuth2\\ResponseType\\AuthorizationCode' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/AuthorizationCode.php',
+ 'OAuth2\\ResponseType\\AuthorizationCodeInterface' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/AuthorizationCodeInterface.php',
+ 'OAuth2\\ResponseType\\JwtAccessToken' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/JwtAccessToken.php',
+ 'OAuth2\\ResponseType\\ResponseTypeInterface' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/ResponseTypeInterface.php',
+ 'OAuth2\\Scope' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Scope.php',
+ 'OAuth2\\ScopeInterface' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/ScopeInterface.php',
+ 'OAuth2\\Server' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Server.php',
+ 'OAuth2\\Storage\\AccessTokenInterface' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/AccessTokenInterface.php',
+ 'OAuth2\\Storage\\AuthorizationCodeInterface' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/AuthorizationCodeInterface.php',
+ 'OAuth2\\Storage\\Cassandra' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/Cassandra.php',
+ 'OAuth2\\Storage\\ClientCredentialsInterface' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/ClientCredentialsInterface.php',
+ 'OAuth2\\Storage\\ClientInterface' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/ClientInterface.php',
+ 'OAuth2\\Storage\\CouchbaseDB' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/CouchbaseDB.php',
+ 'OAuth2\\Storage\\DynamoDB' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/DynamoDB.php',
+ 'OAuth2\\Storage\\JwtAccessToken' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/JwtAccessToken.php',
+ 'OAuth2\\Storage\\JwtAccessTokenInterface' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/JwtAccessTokenInterface.php',
+ 'OAuth2\\Storage\\JwtBearerInterface' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/JwtBearerInterface.php',
+ 'OAuth2\\Storage\\Memory' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/Memory.php',
+ 'OAuth2\\Storage\\Mongo' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/Mongo.php',
+ 'OAuth2\\Storage\\MongoDB' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/MongoDB.php',
+ 'OAuth2\\Storage\\Pdo' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/Pdo.php',
+ 'OAuth2\\Storage\\PublicKeyInterface' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/PublicKeyInterface.php',
+ 'OAuth2\\Storage\\Redis' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/Redis.php',
+ 'OAuth2\\Storage\\RefreshTokenInterface' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/RefreshTokenInterface.php',
+ 'OAuth2\\Storage\\ScopeInterface' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/ScopeInterface.php',
+ 'OAuth2\\Storage\\UserCredentialsInterface' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/UserCredentialsInterface.php',
+ 'OAuth2\\TokenType\\Bearer' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/TokenType/Bearer.php',
+ 'OAuth2\\TokenType\\Mac' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/TokenType/Mac.php',
+ 'OAuth2\\TokenType\\TokenTypeInterface' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/TokenType/TokenTypeInterface.php',
'Psr\\Log\\AbstractLogger' => __DIR__ . '/..' . '/psr/log/Psr/Log/AbstractLogger.php',
'Psr\\Log\\InvalidArgumentException' => __DIR__ . '/..' . '/psr/log/Psr/Log/InvalidArgumentException.php',
'Psr\\Log\\LogLevel' => __DIR__ . '/..' . '/psr/log/Psr/Log/LogLevel.php',
@@ -442,10 +798,46 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d
'Sabre\\Xml\\Writer' => __DIR__ . '/..' . '/sabre/xml/lib/Writer.php',
'Sabre\\Xml\\XmlDeserializable' => __DIR__ . '/..' . '/sabre/xml/lib/XmlDeserializable.php',
'Sabre\\Xml\\XmlSerializable' => __DIR__ . '/..' . '/sabre/xml/lib/XmlSerializable.php',
+ 'SimplePie' => __DIR__ . '/..' . '/simplepie/simplepie/library/SimplePie.php',
+ 'SimplePie_Author' => __DIR__ . '/..' . '/simplepie/simplepie/library/SimplePie/Author.php',
+ 'SimplePie_Cache' => __DIR__ . '/..' . '/simplepie/simplepie/library/SimplePie/Cache.php',
+ 'SimplePie_Cache_Base' => __DIR__ . '/..' . '/simplepie/simplepie/library/SimplePie/Cache/Base.php',
+ 'SimplePie_Cache_DB' => __DIR__ . '/..' . '/simplepie/simplepie/library/SimplePie/Cache/DB.php',
+ 'SimplePie_Cache_File' => __DIR__ . '/..' . '/simplepie/simplepie/library/SimplePie/Cache/File.php',
+ 'SimplePie_Cache_Memcache' => __DIR__ . '/..' . '/simplepie/simplepie/library/SimplePie/Cache/Memcache.php',
+ 'SimplePie_Cache_Memcached' => __DIR__ . '/..' . '/simplepie/simplepie/library/SimplePie/Cache/Memcached.php',
+ 'SimplePie_Cache_MySQL' => __DIR__ . '/..' . '/simplepie/simplepie/library/SimplePie/Cache/MySQL.php',
+ 'SimplePie_Cache_Redis' => __DIR__ . '/..' . '/simplepie/simplepie/library/SimplePie/Cache/Redis.php',
+ 'SimplePie_Caption' => __DIR__ . '/..' . '/simplepie/simplepie/library/SimplePie/Caption.php',
+ 'SimplePie_Category' => __DIR__ . '/..' . '/simplepie/simplepie/library/SimplePie/Category.php',
+ 'SimplePie_Content_Type_Sniffer' => __DIR__ . '/..' . '/simplepie/simplepie/library/SimplePie/Content/Type/Sniffer.php',
+ 'SimplePie_Copyright' => __DIR__ . '/..' . '/simplepie/simplepie/library/SimplePie/Copyright.php',
+ 'SimplePie_Core' => __DIR__ . '/..' . '/simplepie/simplepie/library/SimplePie/Core.php',
+ 'SimplePie_Credit' => __DIR__ . '/..' . '/simplepie/simplepie/library/SimplePie/Credit.php',
+ 'SimplePie_Decode_HTML_Entities' => __DIR__ . '/..' . '/simplepie/simplepie/library/SimplePie/Decode/HTML/Entities.php',
+ 'SimplePie_Enclosure' => __DIR__ . '/..' . '/simplepie/simplepie/library/SimplePie/Enclosure.php',
+ 'SimplePie_Exception' => __DIR__ . '/..' . '/simplepie/simplepie/library/SimplePie/Exception.php',
+ 'SimplePie_File' => __DIR__ . '/..' . '/simplepie/simplepie/library/SimplePie/File.php',
+ 'SimplePie_HTTP_Parser' => __DIR__ . '/..' . '/simplepie/simplepie/library/SimplePie/HTTP/Parser.php',
+ 'SimplePie_IRI' => __DIR__ . '/..' . '/simplepie/simplepie/library/SimplePie/IRI.php',
+ 'SimplePie_Item' => __DIR__ . '/..' . '/simplepie/simplepie/library/SimplePie/Item.php',
+ 'SimplePie_Locator' => __DIR__ . '/..' . '/simplepie/simplepie/library/SimplePie/Locator.php',
+ 'SimplePie_Misc' => __DIR__ . '/..' . '/simplepie/simplepie/library/SimplePie/Misc.php',
+ 'SimplePie_Net_IPv6' => __DIR__ . '/..' . '/simplepie/simplepie/library/SimplePie/Net/IPv6.php',
+ 'SimplePie_Parse_Date' => __DIR__ . '/..' . '/simplepie/simplepie/library/SimplePie/Parse/Date.php',
+ 'SimplePie_Parser' => __DIR__ . '/..' . '/simplepie/simplepie/library/SimplePie/Parser.php',
+ 'SimplePie_Rating' => __DIR__ . '/..' . '/simplepie/simplepie/library/SimplePie/Rating.php',
+ 'SimplePie_Registry' => __DIR__ . '/..' . '/simplepie/simplepie/library/SimplePie/Registry.php',
+ 'SimplePie_Restriction' => __DIR__ . '/..' . '/simplepie/simplepie/library/SimplePie/Restriction.php',
+ 'SimplePie_Sanitize' => __DIR__ . '/..' . '/simplepie/simplepie/library/SimplePie/Sanitize.php',
+ 'SimplePie_Source' => __DIR__ . '/..' . '/simplepie/simplepie/library/SimplePie/Source.php',
+ 'SimplePie_XML_Declaration_Parser' => __DIR__ . '/..' . '/simplepie/simplepie/library/SimplePie/XML/Declaration/Parser.php',
+ 'SimplePie_gzdecode' => __DIR__ . '/..' . '/simplepie/simplepie/library/SimplePie/gzdecode.php',
'Zotlabs\\Access\\AccessList' => __DIR__ . '/../..' . '/Zotlabs/Access/AccessList.php',
'Zotlabs\\Access\\PermissionLimits' => __DIR__ . '/../..' . '/Zotlabs/Access/PermissionLimits.php',
'Zotlabs\\Access\\PermissionRoles' => __DIR__ . '/../..' . '/Zotlabs/Access/PermissionRoles.php',
'Zotlabs\\Access\\Permissions' => __DIR__ . '/../..' . '/Zotlabs/Access/Permissions.php',
+ 'Zotlabs\\Daemon\\Addon' => __DIR__ . '/../..' . '/Zotlabs/Daemon/Addon.php',
'Zotlabs\\Daemon\\Checksites' => __DIR__ . '/../..' . '/Zotlabs/Daemon/Checksites.php',
'Zotlabs\\Daemon\\Cli_suggest' => __DIR__ . '/../..' . '/Zotlabs/Daemon/Cli_suggest.php',
'Zotlabs\\Daemon\\Cron' => __DIR__ . '/../..' . '/Zotlabs/Daemon/Cron.php',
@@ -477,10 +869,15 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d
'Zotlabs\\Lib\\Cache' => __DIR__ . '/../..' . '/Zotlabs/Lib/Cache.php',
'Zotlabs\\Lib\\Chatroom' => __DIR__ . '/../..' . '/Zotlabs/Lib/Chatroom.php',
'Zotlabs\\Lib\\Config' => __DIR__ . '/../..' . '/Zotlabs/Lib/Config.php',
+ 'Zotlabs\\Lib\\DB_Upgrade' => __DIR__ . '/../..' . '/Zotlabs/Lib/DB_Upgrade.php',
'Zotlabs\\Lib\\Enotify' => __DIR__ . '/../..' . '/Zotlabs/Lib/Enotify.php',
'Zotlabs\\Lib\\ExtendedZip' => __DIR__ . '/../..' . '/Zotlabs/Lib/ExtendedZip.php',
'Zotlabs\\Lib\\IConfig' => __DIR__ . '/../..' . '/Zotlabs/Lib/IConfig.php',
+ 'Zotlabs\\Lib\\MarkdownSoap' => __DIR__ . '/../..' . '/Zotlabs/Lib/MarkdownSoap.php',
+ 'Zotlabs\\Lib\\NativeWiki' => __DIR__ . '/../..' . '/Zotlabs/Lib/NativeWiki.php',
+ 'Zotlabs\\Lib\\NativeWikiPage' => __DIR__ . '/../..' . '/Zotlabs/Lib/NativeWikiPage.php',
'Zotlabs\\Lib\\PConfig' => __DIR__ . '/../..' . '/Zotlabs/Lib/PConfig.php',
+ 'Zotlabs\\Lib\\Permcat' => __DIR__ . '/../..' . '/Zotlabs/Lib/Permcat.php',
'Zotlabs\\Lib\\PermissionDescription' => __DIR__ . '/../..' . '/Zotlabs/Lib/PermissionDescription.php',
'Zotlabs\\Lib\\ProtoDriver' => __DIR__ . '/../..' . '/Zotlabs/Lib/ProtoDriver.php',
'Zotlabs\\Lib\\SuperCurl' => __DIR__ . '/../..' . '/Zotlabs/Lib/SuperCurl.php',
@@ -539,7 +936,6 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d
'Zotlabs\\Module\\Events' => __DIR__ . '/../..' . '/Zotlabs/Module/Events.php',
'Zotlabs\\Module\\Fbrowser' => __DIR__ . '/../..' . '/Zotlabs/Module/Fbrowser.php',
'Zotlabs\\Module\\Feed' => __DIR__ . '/../..' . '/Zotlabs/Module/Feed.php',
- 'Zotlabs\\Module\\Ffsapi' => __DIR__ . '/../..' . '/Zotlabs/Module/Ffsapi.php',
'Zotlabs\\Module\\Fhublocs' => __DIR__ . '/../..' . '/Zotlabs/Module/Fhublocs.php',
'Zotlabs\\Module\\File_upload' => __DIR__ . '/../..' . '/Zotlabs/Module/File_upload.php',
'Zotlabs\\Module\\Filer' => __DIR__ . '/../..' . '/Zotlabs/Module/Filer.php',
@@ -568,7 +964,6 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d
'Zotlabs\\Module\\Magic' => __DIR__ . '/../..' . '/Zotlabs/Module/Magic.php',
'Zotlabs\\Module\\Mail' => __DIR__ . '/../..' . '/Zotlabs/Module/Mail.php',
'Zotlabs\\Module\\Manage' => __DIR__ . '/../..' . '/Zotlabs/Module/Manage.php',
- 'Zotlabs\\Module\\Match' => __DIR__ . '/../..' . '/Zotlabs/Module/Match.php',
'Zotlabs\\Module\\Menu' => __DIR__ . '/../..' . '/Zotlabs/Module/Menu.php',
'Zotlabs\\Module\\Message' => __DIR__ . '/../..' . '/Zotlabs/Module/Message.php',
'Zotlabs\\Module\\Mitem' => __DIR__ . '/../..' . '/Zotlabs/Module/Mitem.php',
@@ -582,11 +977,12 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d
'Zotlabs\\Module\\Oembed' => __DIR__ . '/../..' . '/Zotlabs/Module/Oembed.php',
'Zotlabs\\Module\\Oep' => __DIR__ . '/../..' . '/Zotlabs/Module/Oep.php',
'Zotlabs\\Module\\Oexchange' => __DIR__ . '/../..' . '/Zotlabs/Module/Oexchange.php',
+ 'Zotlabs\\Module\\Ofeed' => __DIR__ . '/../..' . '/Zotlabs/Module/Ofeed.php',
'Zotlabs\\Module\\Online' => __DIR__ . '/../..' . '/Zotlabs/Module/Online.php',
- 'Zotlabs\\Module\\Opensearch' => __DIR__ . '/../..' . '/Zotlabs/Module/Opensearch.php',
'Zotlabs\\Module\\Page' => __DIR__ . '/../..' . '/Zotlabs/Module/Page.php',
'Zotlabs\\Module\\Pconfig' => __DIR__ . '/../..' . '/Zotlabs/Module/Pconfig.php',
'Zotlabs\\Module\\Pdledit' => __DIR__ . '/../..' . '/Zotlabs/Module/Pdledit.php',
+ 'Zotlabs\\Module\\Permcat' => __DIR__ . '/../..' . '/Zotlabs/Module/Permcat.php',
'Zotlabs\\Module\\Photo' => __DIR__ . '/../..' . '/Zotlabs/Module/Photo.php',
'Zotlabs\\Module\\Photos' => __DIR__ . '/../..' . '/Zotlabs/Module/Photos.php',
'Zotlabs\\Module\\Ping' => __DIR__ . '/../..' . '/Zotlabs/Module/Ping.php',
@@ -616,7 +1012,6 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d
'Zotlabs\\Module\\Removeme' => __DIR__ . '/../..' . '/Zotlabs/Module/Removeme.php',
'Zotlabs\\Module\\Rmagic' => __DIR__ . '/../..' . '/Zotlabs/Module/Rmagic.php',
'Zotlabs\\Module\\Rpost' => __DIR__ . '/../..' . '/Zotlabs/Module/Rpost.php',
- 'Zotlabs\\Module\\Rsd_xml' => __DIR__ . '/../..' . '/Zotlabs/Module/Rsd_xml.php',
'Zotlabs\\Module\\Search' => __DIR__ . '/../..' . '/Zotlabs/Module/Search.php',
'Zotlabs\\Module\\Search_ac' => __DIR__ . '/../..' . '/Zotlabs/Module/Search_ac.php',
'Zotlabs\\Module\\Service_limits' => __DIR__ . '/../..' . '/Zotlabs/Module/Service_limits.php',
@@ -627,6 +1022,7 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d
'Zotlabs\\Module\\Settings\\Featured' => __DIR__ . '/../..' . '/Zotlabs/Module/Settings/Featured.php',
'Zotlabs\\Module\\Settings\\Features' => __DIR__ . '/../..' . '/Zotlabs/Module/Settings/Features.php',
'Zotlabs\\Module\\Settings\\Oauth' => __DIR__ . '/../..' . '/Zotlabs/Module/Settings/Oauth.php',
+ 'Zotlabs\\Module\\Settings\\Permcats' => __DIR__ . '/../..' . '/Zotlabs/Module/Settings/Permcats.php',
'Zotlabs\\Module\\Settings\\Tokens' => __DIR__ . '/../..' . '/Zotlabs/Module/Settings/Tokens.php',
'Zotlabs\\Module\\Setup' => __DIR__ . '/../..' . '/Zotlabs/Module/Setup.php',
'Zotlabs\\Module\\Share' => __DIR__ . '/../..' . '/Zotlabs/Module/Share.php',
@@ -687,12 +1083,65 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d
'Zotlabs\\Text\\Tagadelic' => __DIR__ . '/../..' . '/Zotlabs/Text/Tagadelic.php',
'Zotlabs\\Web\\CheckJS' => __DIR__ . '/../..' . '/Zotlabs/Web/CheckJS.php',
'Zotlabs\\Web\\Controller' => __DIR__ . '/../..' . '/Zotlabs/Web/Controller.php',
+ 'Zotlabs\\Web\\HTTPHeaders' => __DIR__ . '/../..' . '/Zotlabs/Web/HTTPHeaders.php',
'Zotlabs\\Web\\HttpMeta' => __DIR__ . '/../..' . '/Zotlabs/Web/HttpMeta.php',
'Zotlabs\\Web\\Router' => __DIR__ . '/../..' . '/Zotlabs/Web/Router.php',
'Zotlabs\\Web\\Session' => __DIR__ . '/../..' . '/Zotlabs/Web/Session.php',
'Zotlabs\\Web\\SessionHandler' => __DIR__ . '/../..' . '/Zotlabs/Web/SessionHandler.php',
'Zotlabs\\Web\\SubModule' => __DIR__ . '/../..' . '/Zotlabs/Web/SubModule.php',
'Zotlabs\\Web\\WebServer' => __DIR__ . '/../..' . '/Zotlabs/Web/WebServer.php',
+ 'Zotlabs\\Widget\\Activity' => __DIR__ . '/../..' . '/Zotlabs/Widget/Activity.php',
+ 'Zotlabs\\Widget\\Admin' => __DIR__ . '/../..' . '/Zotlabs/Widget/Admin.php',
+ 'Zotlabs\\Widget\\Affinity' => __DIR__ . '/../..' . '/Zotlabs/Widget/Affinity.php',
+ 'Zotlabs\\Widget\\Album' => __DIR__ . '/../..' . '/Zotlabs/Widget/Album.php',
+ 'Zotlabs\\Widget\\Appcategories' => __DIR__ . '/../..' . '/Zotlabs/Widget/Appcategories.php',
+ 'Zotlabs\\Widget\\Appcloud' => __DIR__ . '/../..' . '/Zotlabs/Widget/Appcloud.php',
+ 'Zotlabs\\Widget\\Archive' => __DIR__ . '/../..' . '/Zotlabs/Widget/Archive.php',
+ 'Zotlabs\\Widget\\Bookmarkedchats' => __DIR__ . '/../..' . '/Zotlabs/Widget/Bookmarkedchats.php',
+ 'Zotlabs\\Widget\\Catcloud_wall' => __DIR__ . '/../..' . '/Zotlabs/Widget/Catcloud_wall.php',
+ 'Zotlabs\\Widget\\Categories' => __DIR__ . '/../..' . '/Zotlabs/Widget/Categories.php',
+ 'Zotlabs\\Widget\\Chatroom_list' => __DIR__ . '/../..' . '/Zotlabs/Widget/Chatroom_list.php',
+ 'Zotlabs\\Widget\\Chatroom_members' => __DIR__ . '/../..' . '/Zotlabs/Widget/Chatroom_members.php',
+ 'Zotlabs\\Widget\\Clock' => __DIR__ . '/../..' . '/Zotlabs/Widget/Clock.php',
+ 'Zotlabs\\Widget\\Collections' => __DIR__ . '/../..' . '/Zotlabs/Widget/Collections.php',
+ 'Zotlabs\\Widget\\Conversations' => __DIR__ . '/../..' . '/Zotlabs/Widget/Conversations.php',
+ 'Zotlabs\\Widget\\Cover_photo' => __DIR__ . '/../..' . '/Zotlabs/Widget/Cover_photo.php',
+ 'Zotlabs\\Widget\\Design_tools' => __DIR__ . '/../..' . '/Zotlabs/Widget/Design_tools.php',
+ 'Zotlabs\\Widget\\Dirsort' => __DIR__ . '/../..' . '/Zotlabs/Widget/Dirsort.php',
+ 'Zotlabs\\Widget\\Dirtags' => __DIR__ . '/../..' . '/Zotlabs/Widget/Dirtags.php',
+ 'Zotlabs\\Widget\\Eventstools' => __DIR__ . '/../..' . '/Zotlabs/Widget/Eventstools.php',
+ 'Zotlabs\\Widget\\Filer' => __DIR__ . '/../..' . '/Zotlabs/Widget/Filer.php',
+ 'Zotlabs\\Widget\\Findpeople' => __DIR__ . '/../..' . '/Zotlabs/Widget/Findpeople.php',
+ 'Zotlabs\\Widget\\Follow' => __DIR__ . '/../..' . '/Zotlabs/Widget/Follow.php',
+ 'Zotlabs\\Widget\\Forums' => __DIR__ . '/../..' . '/Zotlabs/Widget/Forums.php',
+ 'Zotlabs\\Widget\\Fullprofile' => __DIR__ . '/../..' . '/Zotlabs/Widget/Fullprofile.php',
+ 'Zotlabs\\Widget\\Helpindex' => __DIR__ . '/../..' . '/Zotlabs/Widget/Helpindex.php',
+ 'Zotlabs\\Widget\\Item' => __DIR__ . '/../..' . '/Zotlabs/Widget/Item.php',
+ 'Zotlabs\\Widget\\Mailmenu' => __DIR__ . '/../..' . '/Zotlabs/Widget/Mailmenu.php',
+ 'Zotlabs\\Widget\\Menu_preview' => __DIR__ . '/../..' . '/Zotlabs/Widget/Menu_preview.php',
+ 'Zotlabs\\Widget\\Notes' => __DIR__ . '/../..' . '/Zotlabs/Widget/Notes.php',
+ 'Zotlabs\\Widget\\Photo' => __DIR__ . '/../..' . '/Zotlabs/Widget/Photo.php',
+ 'Zotlabs\\Widget\\Photo_albums' => __DIR__ . '/../..' . '/Zotlabs/Widget/Photo_albums.php',
+ 'Zotlabs\\Widget\\Photo_rand' => __DIR__ . '/../..' . '/Zotlabs/Widget/Photo_rand.php',
+ 'Zotlabs\\Widget\\Profile' => __DIR__ . '/../..' . '/Zotlabs/Widget/Profile.php',
+ 'Zotlabs\\Widget\\Pubsites' => __DIR__ . '/../..' . '/Zotlabs/Widget/Pubsites.php',
+ 'Zotlabs\\Widget\\Random_block' => __DIR__ . '/../..' . '/Zotlabs/Widget/Random_block.php',
+ 'Zotlabs\\Widget\\Rating' => __DIR__ . '/../..' . '/Zotlabs/Widget/Rating.php',
+ 'Zotlabs\\Widget\\Savedsearch' => __DIR__ . '/../..' . '/Zotlabs/Widget/Savedsearch.php',
+ 'Zotlabs\\Widget\\Settings_menu' => __DIR__ . '/../..' . '/Zotlabs/Widget/Settings_menu.php',
+ 'Zotlabs\\Widget\\Shortprofile' => __DIR__ . '/../..' . '/Zotlabs/Widget/Shortprofile.php',
+ 'Zotlabs\\Widget\\Sitesearch' => __DIR__ . '/../..' . '/Zotlabs/Widget/Sitesearch.php',
+ 'Zotlabs\\Widget\\Suggestedchats' => __DIR__ . '/../..' . '/Zotlabs/Widget/Suggestedchats.php',
+ 'Zotlabs\\Widget\\Suggestions' => __DIR__ . '/../..' . '/Zotlabs/Widget/Suggestions.php',
+ 'Zotlabs\\Widget\\Tagcloud' => __DIR__ . '/../..' . '/Zotlabs/Widget/Tagcloud.php',
+ 'Zotlabs\\Widget\\Tagcloud_wall' => __DIR__ . '/../..' . '/Zotlabs/Widget/Tagcloud_wall.php',
+ 'Zotlabs\\Widget\\Tasklist' => __DIR__ . '/../..' . '/Zotlabs/Widget/Tasklist.php',
+ 'Zotlabs\\Widget\\Vcard' => __DIR__ . '/../..' . '/Zotlabs/Widget/Vcard.php',
+ 'Zotlabs\\Widget\\Website_portation_tools' => __DIR__ . '/../..' . '/Zotlabs/Widget/Website_portation_tools.php',
+ 'Zotlabs\\Widget\\Wiki_list' => __DIR__ . '/../..' . '/Zotlabs/Widget/Wiki_list.php',
+ 'Zotlabs\\Widget\\Wiki_page_history' => __DIR__ . '/../..' . '/Zotlabs/Widget/Wiki_page_history.php',
+ 'Zotlabs\\Widget\\Wiki_pages' => __DIR__ . '/../..' . '/Zotlabs/Widget/Wiki_pages.php',
+ 'Zotlabs\\Widget\\Zcard' => __DIR__ . '/../..' . '/Zotlabs/Widget/Zcard.php',
'Zotlabs\\Zot\\Auth' => __DIR__ . '/../..' . '/Zotlabs/Zot/Auth.php',
'Zotlabs\\Zot\\DReport' => __DIR__ . '/../..' . '/Zotlabs/Zot/DReport.php',
'Zotlabs\\Zot\\Finger' => __DIR__ . '/../..' . '/Zotlabs/Zot/Finger.php',
@@ -707,6 +1156,7 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d
return \Closure::bind(function () use ($loader) {
$loader->prefixLengthsPsr4 = ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d::$prefixLengthsPsr4;
$loader->prefixDirsPsr4 = ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d::$prefixDirsPsr4;
+ $loader->prefixesPsr0 = ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d::$prefixesPsr0;
$loader->classMap = ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d::$classMap;
}, null, ClassLoader::class);
diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json
index 88acfc40c..7e4f0bb29 100644
--- a/vendor/composer/installed.json
+++ b/vendor/composer/installed.json
@@ -21,7 +21,7 @@
"phpunit/phpunit": "*",
"sabre/cs": "~0.0.1"
},
- "time": "2016-03-08 02:29:27",
+ "time": "2016-03-08T02:29:27+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@@ -79,7 +79,7 @@
"suggest": {
"hoa/bench": "If you would like to run the benchmark scripts"
},
- "time": "2016-07-15 19:52:17",
+ "time": "2016-07-15T19:52:17+00:00",
"bin": [
"bin/vobject",
"bin/generate_vcards"
@@ -173,7 +173,7 @@
"phpunit/phpunit": "*",
"sabre/cs": "~0.0.4"
},
- "time": "2015-11-05 20:14:39",
+ "time": "2015-11-05T20:14:39+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@@ -238,7 +238,7 @@
"suggest": {
"ext-curl": " to make http requests with the Client class"
},
- "time": "2016-01-06 23:00:08",
+ "time": "2016-01-06T23:00:08+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@@ -310,7 +310,7 @@
"ext-curl": "*",
"ext-pdo": "*"
},
- "time": "2016-06-28 02:44:05",
+ "time": "2016-06-28T02:44:05+00:00",
"bin": [
"bin/sabredav",
"bin/naturalselection"
@@ -379,7 +379,7 @@
"phpunit/phpunit": "*",
"sabre/cs": "~1.0.0"
},
- "time": "2016-10-09 22:57:52",
+ "time": "2016-10-09T22:57:52+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@@ -435,7 +435,7 @@
"require": {
"php": ">=5.3.0"
},
- "time": "2016-10-10 12:19:37",
+ "time": "2016-10-10T12:19:37+00:00",
"type": "library",
"extra": {
"branch-alias": {
@@ -465,5 +465,288 @@
"psr",
"psr-3"
]
+ },
+ {
+ "name": "michelf/php-markdown",
+ "version": "1.7.0",
+ "version_normalized": "1.7.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/michelf/php-markdown.git",
+ "reference": "1f51cc520948f66cd2af8cbc45a5ee175e774220"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/michelf/php-markdown/zipball/1f51cc520948f66cd2af8cbc45a5ee175e774220",
+ "reference": "1f51cc520948f66cd2af8cbc45a5ee175e774220",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "time": "2016-10-29T18:58:20+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-lib": "1.4.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-0": {
+ "Michelf": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Michel Fortin",
+ "email": "michel.fortin@michelf.ca",
+ "homepage": "https://michelf.ca/",
+ "role": "Developer"
+ },
+ {
+ "name": "John Gruber",
+ "homepage": "https://daringfireball.net/"
+ }
+ ],
+ "description": "PHP Markdown",
+ "homepage": "https://michelf.ca/projects/php-markdown/",
+ "keywords": [
+ "markdown"
+ ]
+ },
+ {
+ "name": "pixel418/markdownify",
+ "version": "v2.2.1",
+ "version_normalized": "2.2.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Elephant418/Markdownify.git",
+ "reference": "0160677f04c784550dd10fd72fdf3994967db848"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Elephant418/Markdownify/zipball/0160677f04c784550dd10fd72fdf3994967db848",
+ "reference": "0160677f04c784550dd10fd72fdf3994967db848",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.8"
+ },
+ "time": "2016-09-21T13:01:43+00:00",
+ "type": "lib",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Markdownify\\": "src",
+ "Test\\Markdownify\\": "test"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "LGPL"
+ ],
+ "authors": [
+ {
+ "name": "Peter Kruithof",
+ "email": "pkruithof@gmail.com",
+ "homepage": "http://pkruithof.tumblr.com/"
+ },
+ {
+ "name": "Milian Wolff",
+ "email": "mail@milianw.de",
+ "homepage": "http://milianw.de"
+ },
+ {
+ "name": "Thomas Zilliox",
+ "email": "hello@tzi.fr",
+ "homepage": "http://tzi.fr"
+ }
+ ],
+ "description": "The HTML to Markdown converter for PHP ",
+ "homepage": "https://github.com/elephant418/Markdownify",
+ "keywords": [
+ "markdown",
+ "markdownify"
+ ]
+ },
+ {
+ "name": "bshaffer/oauth2-server-php",
+ "version": "v1.9.0",
+ "version_normalized": "1.9.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/bshaffer/oauth2-server-php.git",
+ "reference": "8856aed1a98d6da596ae3f9b8095b5c7a1581697"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/bshaffer/oauth2-server-php/zipball/8856aed1a98d6da596ae3f9b8095b5c7a1581697",
+ "reference": "8856aed1a98d6da596ae3f9b8095b5c7a1581697",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.9"
+ },
+ "require-dev": {
+ "aws/aws-sdk-php": "~2.8",
+ "firebase/php-jwt": "~2.2",
+ "mongodb/mongodb": "^1.1",
+ "predis/predis": "dev-master",
+ "thobbs/phpcassa": "dev-master"
+ },
+ "suggest": {
+ "aws/aws-sdk-php": "~2.8 is required to use DynamoDB storage",
+ "firebase/php-jwt": "~1.1 is required to use MondoDB storage",
+ "predis/predis": "Required to use Redis storage",
+ "thobbs/phpcassa": "Required to use Cassandra storage"
+ },
+ "time": "2017-01-06T23:20:00+00:00",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-0": {
+ "OAuth2": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Brent Shaffer",
+ "email": "bshafs@gmail.com",
+ "homepage": "http://brentertainment.com"
+ }
+ ],
+ "description": "OAuth2 Server for PHP",
+ "homepage": "http://github.com/bshaffer/oauth2-server-php",
+ "keywords": [
+ "auth",
+ "oauth",
+ "oauth2"
+ ]
+ },
+ {
+ "name": "ezyang/htmlpurifier",
+ "version": "v4.9.2",
+ "version_normalized": "4.9.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ezyang/htmlpurifier.git",
+ "reference": "6d50e5282afdfdfc3e0ff6d192aff56c5629b3d4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/6d50e5282afdfdfc3e0ff6d192aff56c5629b3d4",
+ "reference": "6d50e5282afdfdfc3e0ff6d192aff56c5629b3d4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.2"
+ },
+ "require-dev": {
+ "simpletest/simpletest": "^1.1"
+ },
+ "time": "2017-03-13T06:30:53+00:00",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-0": {
+ "HTMLPurifier": "library/"
+ },
+ "files": [
+ "library/HTMLPurifier.composer.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "LGPL"
+ ],
+ "authors": [
+ {
+ "name": "Edward Z. Yang",
+ "email": "admin@htmlpurifier.org",
+ "homepage": "http://ezyang.com"
+ }
+ ],
+ "description": "Standards compliant HTML filter written in PHP",
+ "homepage": "http://htmlpurifier.org/",
+ "keywords": [
+ "html"
+ ]
+ },
+ {
+ "name": "simplepie/simplepie",
+ "version": "1.5",
+ "version_normalized": "1.5.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/simplepie/simplepie.git",
+ "reference": "5de5551953f95feef12cf355a7a26a70f94aa3ab"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/simplepie/simplepie/zipball/5de5551953f95feef12cf355a7a26a70f94aa3ab",
+ "reference": "5de5551953f95feef12cf355a7a26a70f94aa3ab",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4 || ~5"
+ },
+ "suggest": {
+ "mf2/mf2": "Microformat module that allows for parsing HTML for microformats"
+ },
+ "time": "2017-04-17T07:29:31+00:00",
+ "type": "library",
+ "installation-source": "source",
+ "autoload": {
+ "psr-0": {
+ "SimplePie": "library"
+ }
+ },
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Ryan Parman",
+ "homepage": "http://ryanparman.com/",
+ "role": "Creator, alumnus developer"
+ },
+ {
+ "name": "Geoffrey Sneddon",
+ "homepage": "http://gsnedders.com/",
+ "role": "Alumnus developer"
+ },
+ {
+ "name": "Ryan McCue",
+ "email": "me@ryanmccue.info",
+ "homepage": "http://ryanmccue.info/",
+ "role": "Developer"
+ }
+ ],
+ "description": "A simple Atom/RSS parsing library for PHP",
+ "homepage": "http://simplepie.org/",
+ "keywords": [
+ "atom",
+ "feeds",
+ "rss"
+ ],
+ "support": {
+ "source": "https://github.com/simplepie/simplepie/tree/1.5",
+ "issues": "https://github.com/simplepie/simplepie/issues"
+ }
}
]
diff --git a/library/htmlpurifier-4.6.0-lite/CREDITS b/vendor/ezyang/htmlpurifier/CREDITS
index 7921b45af..7921b45af 100644
--- a/library/htmlpurifier-4.6.0-lite/CREDITS
+++ b/vendor/ezyang/htmlpurifier/CREDITS
diff --git a/vendor/ezyang/htmlpurifier/INSTALL b/vendor/ezyang/htmlpurifier/INSTALL
new file mode 100644
index 000000000..e6dd02afa
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/INSTALL
@@ -0,0 +1,373 @@
+
+Install
+ How to install HTML Purifier
+
+HTML Purifier is designed to run out of the box, so actually using the
+library is extremely easy. (Although... if you were looking for a
+step-by-step installation GUI, you've downloaded the wrong software!)
+
+While the impatient can get going immediately with some of the sample
+code at the bottom of this library, it's well worth reading this entire
+document--most of the other documentation assumes that you are familiar
+with these contents.
+
+
+---------------------------------------------------------------------------
+1. Compatibility
+
+HTML Purifier is PHP 5 and PHP 7, and is actively tested from PHP 5.0.5
+and up. It has no core dependencies with other libraries.
+
+These optional extensions can enhance the capabilities of HTML Purifier:
+
+ * iconv : Converts text to and from non-UTF-8 encodings
+ * bcmath : Used for unit conversion and imagecrash protection
+ * tidy : Used for pretty-printing HTML
+
+These optional libraries can enhance the capabilities of HTML Purifier:
+
+ * CSSTidy : Clean CSS stylesheets using %Core.ExtractStyleBlocks
+ Note: You should use the modernized fork of CSSTidy available
+ at https://github.com/Cerdic/CSSTidy
+ * Net_IDNA2 (PEAR) : IRI support using %Core.EnableIDNA
+ Note: This is not necessary for PHP 5.3 or later
+
+---------------------------------------------------------------------------
+2. Reconnaissance
+
+A big plus of HTML Purifier is its inerrant support of standards, so
+your web-pages should be standards-compliant. (They should also use
+semantic markup, but that's another issue altogether, one HTML Purifier
+cannot fix without reading your mind.)
+
+HTML Purifier can process these doctypes:
+
+* XHTML 1.0 Transitional (default)
+* XHTML 1.0 Strict
+* HTML 4.01 Transitional
+* HTML 4.01 Strict
+* XHTML 1.1
+
+...and these character encodings:
+
+* UTF-8 (default)
+* Any encoding iconv supports (with crippled internationalization support)
+
+These defaults reflect what my choices would be if I were authoring an
+HTML document, however, what you choose depends on the nature of your
+codebase. If you don't know what doctype you are using, you can determine
+the doctype from this identifier at the top of your source code:
+
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+...and the character encoding from this code:
+
+ <meta http-equiv="Content-type" content="text/html;charset=ENCODING">
+
+If the character encoding declaration is missing, STOP NOW, and
+read 'docs/enduser-utf8.html' (web accessible at
+http://htmlpurifier.org/docs/enduser-utf8.html). In fact, even if it is
+present, read this document anyway, as many websites specify their
+document's character encoding incorrectly.
+
+
+---------------------------------------------------------------------------
+3. Including the library
+
+The procedure is quite simple:
+
+ require_once '/path/to/library/HTMLPurifier.auto.php';
+
+This will setup an autoloader, so the library's files are only included
+when you use them.
+
+Only the contents in the library/ folder are necessary, so you can remove
+everything else when using HTML Purifier in a production environment.
+
+If you installed HTML Purifier via PEAR, all you need to do is:
+
+ require_once 'HTMLPurifier.auto.php';
+
+Please note that the usual PEAR practice of including just the classes you
+want will not work with HTML Purifier's autoloading scheme.
+
+Advanced users, read on; other users can skip to section 4.
+
+Autoload compatibility
+----------------------
+
+ HTML Purifier attempts to be as smart as possible when registering an
+ autoloader, but there are some cases where you will need to change
+ your own code to accomodate HTML Purifier. These are those cases:
+
+ PHP VERSION IS LESS THAN 5.1.2, AND YOU'VE DEFINED __autoload
+ Because spl_autoload_register() doesn't exist in early versions
+ of PHP 5, HTML Purifier has no way of adding itself to the autoload
+ stack. Modify your __autoload function to test
+ HTMLPurifier_Bootstrap::autoload($class)
+
+ For example, suppose your autoload function looks like this:
+
+ function __autoload($class) {
+ require str_replace('_', '/', $class) . '.php';
+ return true;
+ }
+
+ A modified version with HTML Purifier would look like this:
+
+ function __autoload($class) {
+ if (HTMLPurifier_Bootstrap::autoload($class)) return true;
+ require str_replace('_', '/', $class) . '.php';
+ return true;
+ }
+
+ Note that there *is* some custom behavior in our autoloader; the
+ original autoloader in our example would work for 99% of the time,
+ but would fail when including language files.
+
+ AN __autoload FUNCTION IS DECLARED AFTER OUR AUTOLOADER IS REGISTERED
+ spl_autoload_register() has the curious behavior of disabling
+ the existing __autoload() handler. Users need to explicitly
+ spl_autoload_register('__autoload'). Because we use SPL when it
+ is available, __autoload() will ALWAYS be disabled. If __autoload()
+ is declared before HTML Purifier is loaded, this is not a problem:
+ HTML Purifier will register the function for you. But if it is
+ declared afterwards, it will mysteriously not work. This
+ snippet of code (after your autoloader is defined) will fix it:
+
+ spl_autoload_register('__autoload')
+
+ Users should also be on guard if they use a version of PHP previous
+ to 5.1.2 without an autoloader--HTML Purifier will define __autoload()
+ for you, which can collide with an autoloader that was added by *you*
+ later.
+
+
+For better performance
+----------------------
+
+ Opcode caches, which greatly speed up PHP initialization for scripts
+ with large amounts of code (HTML Purifier included), don't like
+ autoloaders. We offer an include file that includes all of HTML Purifier's
+ files in one go in an opcode cache friendly manner:
+
+ // If /path/to/library isn't already in your include path, uncomment
+ // the below line:
+ // require '/path/to/library/HTMLPurifier.path.php';
+
+ require 'HTMLPurifier.includes.php';
+
+ Optional components still need to be included--you'll know if you try to
+ use a feature and you get a class doesn't exists error! The autoloader
+ can be used in conjunction with this approach to catch classes that are
+ missing. Simply add this afterwards:
+
+ require 'HTMLPurifier.autoload.php';
+
+Standalone version
+------------------
+
+ HTML Purifier has a standalone distribution; you can also generate
+ a standalone file from the full version by running the script
+ maintenance/generate-standalone.php . The standalone version has the
+ benefit of having most of its code in one file, so parsing is much
+ faster and the library is easier to manage.
+
+ If HTMLPurifier.standalone.php exists in the library directory, you
+ can use it like this:
+
+ require '/path/to/HTMLPurifier.standalone.php';
+
+ This is equivalent to including HTMLPurifier.includes.php, except that
+ the contents of standalone/ will be added to your path. To override this
+ behavior, specify a new HTMLPURIFIER_PREFIX where standalone files can
+ be found (usually, this will be one directory up, the "true" library
+ directory in full distributions). Don't forget to set your path too!
+
+ The autoloader can be added to the end to ensure the classes are
+ loaded when necessary; otherwise you can manually include them.
+ To use the autoloader, use this:
+
+ require 'HTMLPurifier.autoload.php';
+
+For advanced users
+------------------
+
+ HTMLPurifier.auto.php performs a number of operations that can be done
+ individually. These are:
+
+ HTMLPurifier.path.php
+ Puts /path/to/library in the include path. For high performance,
+ this should be done in php.ini.
+
+ HTMLPurifier.autoload.php
+ Registers our autoload handler HTMLPurifier_Bootstrap::autoload($class).
+
+ You can do these operations by yourself--in fact, you must modify your own
+ autoload handler if you are using a version of PHP earlier than PHP 5.1.2
+ (See "Autoload compatibility" above).
+
+
+---------------------------------------------------------------------------
+4. Configuration
+
+HTML Purifier is designed to run out-of-the-box, but occasionally HTML
+Purifier needs to be told what to do. If you answer no to any of these
+questions, read on; otherwise, you can skip to the next section (or, if you're
+into configuring things just for the heck of it, skip to 4.3).
+
+* Am I using UTF-8?
+* Am I using XHTML 1.0 Transitional?
+
+If you answered no to any of these questions, instantiate a configuration
+object and read on:
+
+ $config = HTMLPurifier_Config::createDefault();
+
+
+4.1. Setting a different character encoding
+
+You really shouldn't use any other encoding except UTF-8, especially if you
+plan to support multilingual websites (read section three for more details).
+However, switching to UTF-8 is not always immediately feasible, so we can
+adapt.
+
+HTML Purifier uses iconv to support other character encodings, as such,
+any encoding that iconv supports <http://www.gnu.org/software/libiconv/>
+HTML Purifier supports with this code:
+
+ $config->set('Core.Encoding', /* put your encoding here */);
+
+An example usage for Latin-1 websites (the most common encoding for English
+websites):
+
+ $config->set('Core.Encoding', 'ISO-8859-1');
+
+Note that HTML Purifier's support for non-Unicode encodings is crippled by the
+fact that any character not supported by that encoding will be silently
+dropped, EVEN if it is ampersand escaped. If you want to work around
+this, you are welcome to read docs/enduser-utf8.html for a fix,
+but please be cognizant of the issues the "solution" creates (for this
+reason, I do not include the solution in this document).
+
+
+4.2. Setting a different doctype
+
+For those of you using HTML 4.01 Transitional, you can disable
+XHTML output like this:
+
+ $config->set('HTML.Doctype', 'HTML 4.01 Transitional');
+
+Other supported doctypes include:
+
+ * HTML 4.01 Strict
+ * HTML 4.01 Transitional
+ * XHTML 1.0 Strict
+ * XHTML 1.0 Transitional
+ * XHTML 1.1
+
+
+4.3. Other settings
+
+There are more configuration directives which can be read about
+here: <http://htmlpurifier.org/live/configdoc/plain.html> They're a bit boring,
+but they can help out for those of you who like to exert maximum control over
+your code. Some of the more interesting ones are configurable at the
+demo <http://htmlpurifier.org/demo.php> and are well worth looking into
+for your own system.
+
+For example, you can fine tune allowed elements and attributes, convert
+relative URLs to absolute ones, and even autoparagraph input text! These
+are, respectively, %HTML.Allowed, %URI.MakeAbsolute and %URI.Base, and
+%AutoFormat.AutoParagraph. The %Namespace.Directive naming convention
+translates to:
+
+ $config->set('Namespace.Directive', $value);
+
+E.g.
+
+ $config->set('HTML.Allowed', 'p,b,a[href],i');
+ $config->set('URI.Base', 'http://www.example.com');
+ $config->set('URI.MakeAbsolute', true);
+ $config->set('AutoFormat.AutoParagraph', true);
+
+
+---------------------------------------------------------------------------
+5. Caching
+
+HTML Purifier generates some cache files (generally one or two) to speed up
+its execution. For maximum performance, make sure that
+library/HTMLPurifier/DefinitionCache/Serializer is writeable by the webserver.
+
+If you are in the library/ folder of HTML Purifier, you can set the
+appropriate permissions using:
+
+ chmod -R 0755 HTMLPurifier/DefinitionCache/Serializer
+
+If the above command doesn't work, you may need to assign write permissions
+to group:
+
+ chmod -R 0775 HTMLPurifier/DefinitionCache/Serializer
+
+You can also chmod files via your FTP client; this option
+is usually accessible by right clicking the corresponding directory and
+then selecting "chmod" or "file permissions".
+
+Starting with 2.0.1, HTML Purifier will generate friendly error messages
+that will tell you exactly what you have to chmod the directory to, if in doubt,
+follow its advice.
+
+If you are unable or unwilling to give write permissions to the cache
+directory, you can either disable the cache (and suffer a performance
+hit):
+
+ $config->set('Core.DefinitionCache', null);
+
+Or move the cache directory somewhere else (no trailing slash):
+
+ $config->set('Cache.SerializerPath', '/home/user/absolute/path');
+
+
+---------------------------------------------------------------------------
+6. Using the code
+
+The interface is mind-numbingly simple:
+
+ $purifier = new HTMLPurifier($config);
+ $clean_html = $purifier->purify( $dirty_html );
+
+That's it! For more examples, check out docs/examples/ (they aren't very
+different though). Also, docs/enduser-slow.html gives advice on what to
+do if HTML Purifier is slowing down your application.
+
+
+---------------------------------------------------------------------------
+7. Quick install
+
+First, make sure library/HTMLPurifier/DefinitionCache/Serializer is
+writable by the webserver (see Section 5: Caching above for details).
+If your website is in UTF-8 and XHTML Transitional, use this code:
+
+<?php
+ require_once '/path/to/htmlpurifier/library/HTMLPurifier.auto.php';
+
+ $config = HTMLPurifier_Config::createDefault();
+ $purifier = new HTMLPurifier($config);
+ $clean_html = $purifier->purify($dirty_html);
+?>
+
+If your website is in a different encoding or doctype, use this code:
+
+<?php
+ require_once '/path/to/htmlpurifier/library/HTMLPurifier.auto.php';
+
+ $config = HTMLPurifier_Config::createDefault();
+ $config->set('Core.Encoding', 'ISO-8859-1'); // replace with your encoding
+ $config->set('HTML.Doctype', 'HTML 4.01 Transitional'); // replace with your doctype
+ $purifier = new HTMLPurifier($config);
+
+ $clean_html = $purifier->purify($dirty_html);
+?>
+
+ vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/INSTALL.fr.utf8 b/vendor/ezyang/htmlpurifier/INSTALL.fr.utf8
new file mode 100644
index 000000000..95164abba
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/INSTALL.fr.utf8
@@ -0,0 +1,60 @@
+
+Installation
+ Comment installer HTML Purifier
+
+Attention : Ce document est encodé en UTF-8, si les lettres avec des accents
+ne s'affichent pas, prenez un meilleur éditeur de texte.
+
+L'installation de HTML Purifier est très simple, parce qu'il n'a pas besoin
+de configuration. Pour les utilisateurs impatients, le code se trouve dans le
+pied de page, mais je recommande de lire le document.
+
+1. Compatibilité
+
+HTML Purifier fonctionne avec PHP 5. PHP 5.0.5 est la dernière version testée.
+Il ne dépend pas d'autres librairies.
+
+Les extensions optionnelles sont iconv (généralement déjà installée) et tidy
+(répendue aussi). Si vous utilisez UTF-8 et que vous ne voulez pas l'indentation,
+vous pouvez utiliser HTML Purifier sans ces extensions.
+
+
+2. Inclure la librairie
+
+Quand vous devez l'utilisez, incluez le :
+
+ require_once('/path/to/library/HTMLPurifier.auto.php');
+
+Ne pas l'inclure si ce n'est pas nécessaire, car HTML Purifier est lourd.
+
+HTML Purifier utilise "autoload". Si vous avez défini la fonction __autoload,
+vous devez ajouter cette fonction :
+
+ spl_autoload_register('__autoload')
+
+Plus d'informations dans le document "INSTALL".
+
+3. Installation rapide
+
+Si votre site Web est en UTF-8 et XHTML Transitional, utilisez :
+
+<?php
+ require_once('/path/to/htmlpurifier/library/HTMLPurifier.auto.php');
+ $purificateur = new HTMLPurifier();
+ $html_propre = $purificateur->purify($html_a_purifier);
+?>
+
+Sinon, utilisez :
+
+<?php
+ require_once('/path/to/html/purifier/library/HTMLPurifier.auto.load');
+ $config = $HTMLPurifier_Config::createDefault();
+ $config->set('Core', 'Encoding', 'ISO-8859-1'); //Remplacez par votre
+ encodage
+ $config->set('Core', 'XHTML', true); //Remplacer par false si HTML 4.01
+ $purificateur = new HTMLPurifier($config);
+ $html_propre = $purificateur->purify($html_a_purifier);
+?>
+
+
+ vim: et sw=4 sts=4
diff --git a/library/htmlpurifier-4.6.0-lite/LICENSE b/vendor/ezyang/htmlpurifier/LICENSE
index 8c88a20d4..8c88a20d4 100644
--- a/library/htmlpurifier-4.6.0-lite/LICENSE
+++ b/vendor/ezyang/htmlpurifier/LICENSE
diff --git a/vendor/ezyang/htmlpurifier/NEWS b/vendor/ezyang/htmlpurifier/NEWS
new file mode 100644
index 000000000..82ebedf3e
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/NEWS
@@ -0,0 +1,1168 @@
+NEWS ( CHANGELOG and HISTORY ) HTMLPurifier
+|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+
+= KEY ====================
+ # Breaks back-compat
+ ! Feature
+ - Bugfix
+ + Sub-comment
+ . Internal change
+==========================
+
+4.9.2, released 2017-03-12
+- Fixes PHP 5.3 compatibility
+- Fix breakage when decoding decimal entities. Thanks @rybakit (#129)
+
+4.9.1, released 2017-03-08
+! %URI.DefaultScheme can now be set to null, in which case
+ all relative paths are removed.
+! New CSS properties: min-width, max-width, min-height, max-height (#94)
+! Transparency (rgba) and hsl/hsla supported where color CSS is present.
+ Thanks @fxbt for contributing the patch. (#118)
+- When idn_to_ascii is defined, we might accept malformed
+ hostnames. Apply validation to the result in such cases.
+- Close directory when done in Serializer DefinitionCache (#100)
+- Deleted some asserts to avoid linters from choking (#97)
+- Rework Serializer cache behavior to avoid chmod'ing if possible (#32)
+- Embedded semicolons in strings in CSS are now handled correctly!
+- We accidentally dropped certain Unicode characters if there was
+ one or more invalid characters. This has been fixed, thanks
+ to mpyw <ryosuke_i_628@yahoo.co.jp>
+- Fix for "Don't truncate upon encountering </div> when using DOMLex"
+ caused a regression with HTML 4.01 Strict parsing with libxml 2.9.1
+ (and maybe later versions, but known OK with libxml 2.9.4). The
+ fix is to go about handling truncation a bit more cleverly so that
+ we can wrap with divs (sidestepping the bug) but slurping out the
+ rest of the text in case it ran off the end. (#78)
+- Fix PREG_BACKTRACK_LIMIT_ERROR in HTMLPurifier_Filter_ExtractStyle.
+ Thanks @breathbath for contributing the report and fix (#120)
+- Fix entity decoding algorithm to be more conservative about
+ decoding entities that are missing trailing semicolon.
+ To get old behavior, set %Core.LegacyEntityDecoder to true.
+ (#119)
+- Workaround libxml bug when HTML tags are embedded inside
+ script tags. To disable workaround set %Core.AggressivelyRemoveScript
+ to false. (#83)
+# By default, when a link has a target attribute associated
+ with it, we now also add rel="noopener" in order to
+ prevent the new window from being able to overwrite
+ the original frame. To disable this protection,
+ set %HTML.TargetNoopener to FALSE.
+
+4.9.0 was cut on Git but never properly released; when we did the
+real release we decided to skip this version number.
+
+4.8.0, released 2016-07-16
+# By default, when a link has a target attribute associated
+ with it, we now also add rel="noreferrer" in order to
+ prevent the new window from being able to overwrite
+ the original frame. To disable this protection,
+ set %HTML.TargetNoreferrer to FALSE.
+! Full PHP 7 compatibility, the test suite is ALL GO.
+! %CSS.AllowDuplicates permits duplicate CSS properties.
+! Support for 'tel' URIs.
+! Partial support for 'border-radius' properties when %CSS.AllowProprietary is true.
+ The slash syntax, i.e., 'border-radius: 2em 1em 4em / 0.5em 3em' is not
+ yet supported.
+! %Attr.ID.HTML5 turns on HTML5-style ID handling.
+- alt truncation could result in malformed UTF-8 sequence. Don't
+ truncate. Thanks Brandon Farber for reporting.
+- Linkify regex is smarter, based off of Gruber's regex.
+- IDNA supported natively on PHP 5.3 and later.
+- Non all-numeric top-level names (e.g., foo.1f, 1f) are now
+ allowed.
+- Minor bounds error fix to squash a PHP 7 notice.
+- Support non-/tmp temporary directories for data:// validation
+- Give a better error message when a user attempts to allow
+ ul/ol without allowing li.
+- On some versions of PHP, the Serializer DefinitionCache could
+ infinite loop when the directory exists but is not listable. (#49)
+- Don't match for <body> inside comments with
+ %Core.ConvertDocumentToFragment. (#67)
+- SafeObject is now less case sensitive. (#57)
+- AutoFormat.RemoveEmpty.Predicate now correctly renders in
+ web form. (#85)
+
+4.7.0, released 2015-08-04
+# opacity is now considered a "tricky" CSS property rather than a
+ proprietary one.
+! %AutoFormat.RemoveEmpty.Predicate for specifying exactly when
+ an element should be considered "empty" (maybe preserve if it
+ has attributes), and modify iframe support so that the iframe
+ is removed if it is missing a src attribute. Thanks meeva for
+ reporting.
+- Don't truncate upon encountering </div> when using DOMLex. Thanks
+ Myrto Christina for finally convincing me to fix this.
+- Update YouTube filter for new code.
+- Fix parsing of rgb() values with spaces in them for 'border'
+ attribute.
+- Don't remove foo="" attributes if foo is a boolean attribute. Thanks
+ valME for reporting.
+
+4.6.0, released 2013-11-30
+# Secure URI munge hashing algorithm has changed to hash_hmac("sha256", $url, $secret).
+ Please update any verification scripts you may have.
+# URI parsing algorithm was made more strict, so only prefixes which
+ looks like schemes will actually be schemes. Thanks
+ Michael Gusev <mgusev@sugarcrm.com> for fixing.
+# %Core.EscapeInvalidChildren is no longer supported, and no longer does
+ anything.
+! New directive %Core.AllowHostnameUnderscore which allows underscores
+ in hostnames.
+- Eliminate quadratic behavior in DOMLex by using a proper queue.
+ Thanks Ole Laursen for noticing this.
+- Rewritten MakeWellFormed/FixNesting implementation eliminates quadratic
+ behavior in the rest of the purificaiton pipeline. Thanks Chedburn
+ Networks for sponsoring this work.
+- Made Linkify URL parser a bit less permissive, so that non-breaking
+ spaces and commas are not included as part of URL. Thanks nAS for fixing.
+- Fix some bad interactions with %HTML.Allowed and injectors. Thanks
+ David Hirtz for reporting.
+- Fix infinite loop in DirectLex. Thanks Ashar Javed (@soaj1664ashar)
+ for reporting.
+
+4.5.0, released 2013-02-17
+# Fix bug where stacked attribute transforms clobber each other;
+ this also means it's no longer possible to override attribute
+ transforms in later modules. No internal code was using this
+ but this may break some clients.
+# We now use SHA-1 to identify cached definitions, instead of MD5.
+! Support display:inline-block
+! Support for more white-space CSS values.
+! Permit underscores in font families
+! Support for page-break-* CSS3 properties when proprietary properties
+ are enabled.
+! New directive %Core.DisableExcludes; can be set to 'true' to turn off
+ SGML excludes checking. If HTML Purifier is removing too much text
+ and you don't care about full standards compliance, try setting this to
+ 'true'.
+- Use prepend for SPL autoloading on PHP 5.3 and later.
+- Fix bug with nofollow transform when pre-existing rel exists.
+- Fix bug where background:url() always gets lower-cased
+ (but not background-image:url())
+- Fix bug with non lower-case color names in HTML
+- Fix bug where data URI validation doesn't remove temporary files.
+ Thanks Javier Marín Ros <javiermarinros@gmail.com> for reporting.
+- Don't remove certain empty tags on RemoveEmpty.
+
+4.4.0, released 2012-01-18
+# Removed PEARSax3 handler.
+# URI.Munge now munges URIs inside the same host that go from https
+ to http. Reported by Neike Taika-Tessaro.
+# Core.EscapeNonASCIICharacters now always transforms entities to
+ entities, even if target encoding is UTF-8.
+# Tighten up selector validation in ExtractStyleBlocks.
+ Non-syntactically valid selectors are now rejected, along with
+ some of the more obscure ones such as attribute selectors, the
+ :lang pseudoselector, and anything not in CSS2.1. Furthermore,
+ ID and class selectors now work properly with the relevant
+ configuration attributes. Also, mute errors when parsing CSS
+ with CSS Tidy. Reported by Mario Heiderich and Norman Hippert.
+! Added support for 'scope' attribute on tables.
+! Added %HTML.TargetBlank, which adds target="blank" to all outgoing links.
+! Properly handle sub-lists directly nested inside of lists in
+ a standards compliant way, by moving them into the preceding <li>
+! Added %HTML.AllowedComments and %HTML.AllowedCommentsRegexp for
+ limited allowed comments in untrusted situations.
+! Implement iframes, and allow them to be used in untrusted mode with
+ %HTML.SafeIframe and %URI.SafeIframeRegexp. Thanks Bradley M. Froehle
+ <brad.froehle@gmail.com> for submitting an initial version of the patch.
+! The Forms module now works properly for transitional doctypes.
+! Added support for internationalized domain names. You need the PEAR
+ Net_IDNA2 module to be in your path; if it is installed, ensure the
+ class can be loaded and then set %Core.EnableIDNA to true.
+- Color keywords are now case insensitive. Thanks Yzmir Ramirez
+ <yramirez-htmlpurifier@adicio.com> for reporting.
+- Explicitly initialize anonModule variable to null.
+- Do not duplicate nofollow if already present. Thanks 178
+ for reporting.
+- Do not add nofollow if hostname matches our current host. Thanks 178
+ for reporting, and Neike Taika-Tessaro for helping diagnose.
+- Do not unset parser variable; this fixes intermittent serialization
+ problems. Thanks Neike Taika-Tessaro for reporting, bill
+ <10010tiger@gmail.com> for diagnosing.
+- Fix iconv truncation bug, where non-UTF-8 target encodings see
+ output truncated after around 8000 characters. Thanks Jörg Ludwig
+ <joerg.ludwig@iserv.eu> for reporting.
+- Fix broken table content model for XHTML1.1 (and also earlier
+ versions, although the W3C validator doesn't catch those violations).
+ Thanks GlitchMr <glitch.mr@gmail.com> for reporting.
+
+4.3.0, released 2011-03-27
+# Fixed broken caching of customized raw definitions, but requires an
+ API change. The old API still works but will emit a warning,
+ see http://htmlpurifier.org/docs/enduser-customize.html#optimized
+ for how to upgrade your code.
+# Protect against Internet Explorer innerHTML behavior by specially
+ treating attributes with backticks but no angled brackets, quotes or
+ spaces. This constitutes a slight semantic change, which can be
+ reverted using %Output.FixInnerHTML. Reported by Neike Taika-Tessaro
+ and Mario Heiderich.
+# Protect against cssText/innerHTML by restricting allowed characters
+ used in fonts further than mandated by the specification and encoding
+ some extra special characters in URLs. Reported by Neike
+ Taika-Tessaro and Mario Heiderich.
+! Added %HTML.Nofollow to add rel="nofollow" to external links.
+! More types of SPL autoloaders allowed on later versions of PHP.
+! Implementations for position, top, left, right, bottom, z-index
+ when %CSS.Trusted is on.
+! Add %Cache.SerializerPermissions option for custom serializer
+ directory/file permissions
+! Fix longstanding bug in Flash support for non-IE browsers, and
+ allow more wmode attributes.
+! Add %CSS.AllowedFonts to restrict permissible font names.
+- Switch to an iterative traversal of the DOM, which prevents us
+ from running out of stack space for deeply nested documents.
+ Thanks Maxim Krizhanovsky for contributing a patch.
+- Make removal of conditional IE comments ungreedy; thanks Bernd
+ for reporting.
+- Escape CDATA before removing Internet Explorer comments.
+- Fix removal of id attributes under certain conditions by ensuring
+ armor attributes are preserved when recreating tags.
+- Check if schema.ser was corrupted.
+- Check if zend.ze1_compatibility_mode is on, and error out if it is.
+ This safety check is only done for HTMLPurifier.auto.php; if you
+ are using standalone or the specialized includes files, you're
+ expected to know what you're doing.
+- Stop repeatedly writing the cache file after I'm done customizing a
+ raw definition. Reported by ajh.
+- Switch to using require_once in the Bootstrap to work around bad
+ interaction with Zend Debugger and APC. Reported by Antonio Parraga.
+- Fix URI handling when hostname is missing but scheme is present.
+ Reported by Neike Taika-Tessaro.
+- Fix missing numeric entities on DirectLex; thanks Neike Taika-Tessaro
+ for reporting.
+- Fix harmless notice from indexing into empty string. Thanks Matthijs
+ Kooijman <matthijs@stdin.nl> for reporting.
+- Don't autoclose no parent elements are able to support the element
+ that triggered the autoclose. In particular fixes strange behavior
+ of stray <li> tags. Thanks pkuliga@gmail.com for reporting and
+ Neike Taika-Tessaro <pinkgothic@gmail.com> for debugging assistance.
+
+4.2.0, released 2010-09-15
+! Added %Core.RemoveProcessingInstructions, which lets you remove
+ <? ... ?> statements.
+! Added %URI.DisableResources functionality; the directive originally
+ did nothing. Thanks David Rothstein for reporting.
+! Add documentation about configuration directive types.
+! Add %CSS.ForbiddenProperties configuration directive.
+! Add %HTML.FlashAllowFullScreen to permit embedded Flash objects
+ to utilize full-screen mode.
+! Add optional support for the <code>file</code> URI scheme, enable
+ by explicitly setting %URI.AllowedSchemes.
+! Add %Core.NormalizeNewlines options to allow turning off newline
+ normalization.
+- Fix improper handling of Internet Explorer conditional comments
+ by parser. Thanks zmonteca for reporting.
+- Fix missing attributes bug when running on Mac Snow Leopard and APC.
+ Thanks sidepodcast for the fix.
+- Warn if an element is allowed, but an attribute it requires is
+ not allowed.
+
+4.1.1, released 2010-05-31
+- Fix undefined index warnings in maintenance scripts.
+- Fix bug in DirectLex for parsing elements with a single attribute
+ with entities.
+- Rewrite CSS output logic for font-family and url(). Thanks Mario
+ Heiderich <mario.heiderich@googlemail.com> for reporting and Takeshi
+ Terada <t-terada@violet.plala.or.jp> for suggesting the fix.
+- Emit an error for CollectErrors if a body is extracted
+- Fix bug where in background-position for center keyword handling.
+- Fix infinite loop when a wrapper element is inserted in a context
+ where it's not allowed. Thanks Lars <lars@renoz.dk> for reporting.
+- Remove +x bit and shebang from index.php; only supported mode is to
+ explicitly call it with php.
+- Make test script less chatty when log_errors is on.
+
+4.1.0, released 2010-04-26
+! Support proprietary height attribute on table element
+! Support YouTube slideshows that contain /cp/ in their URL.
+! Support for data: URI scheme; not enabled by default, add it using
+ %URI.AllowedSchemes
+! Support flashvars when using %HTML.SafeObject and %HTML.SafeEmbed.
+! Support for Internet Explorer compatibility with %HTML.SafeObject
+ using %Output.FlashCompat.
+! Handle <ol><ol> properly, by inserting the necessary <li> tag.
+- Always quote the insides of url(...) in CSS.
+
+4.0.0, released 2009-07-07
+# APIs for ConfigSchema subsystem have substantially changed. See
+ docs/dev-config-bcbreaks.txt for details; in essence, anything that
+ had both namespace and directive now have a single unified key.
+# Some configuration directives were renamed, specifically:
+ %AutoFormatParam.PurifierLinkifyDocURL -> %AutoFormat.PurifierLinkify.DocURL
+ %FilterParam.ExtractStyleBlocksEscaping -> %Filter.ExtractStyleBlocks.Escaping
+ %FilterParam.ExtractStyleBlocksScope -> %Filter.ExtractStyleBlocks.Scope
+ %FilterParam.ExtractStyleBlocksTidyImpl -> %Filter.ExtractStyleBlocks.TidyImpl
+ As usual, the old directive names will still work, but will throw E_NOTICE
+ errors.
+# The allowed values for class have been relaxed to allow all of CDATA for
+ doctypes that are not XHTML 1.1 or XHTML 2.0. For old behavior, set
+ %Attr.ClassUseCDATA to false.
+# Instead of appending the content model to an old content model, a blank
+ element will replace the old content model. You can use #SUPER to get
+ the old content model.
+! More robust support for name="" and id=""
+! HTMLPurifier_Config::inherit($config) allows you to inherit one
+ configuration, and have changes to that configuration be propagated
+ to all of its children.
+! Implement %HTML.Attr.Name.UseCDATA, which relaxes validation rules on
+ the name attribute when set. Use with care. Thanks Ian Cook for
+ sponsoring.
+! Implement %AutoFormat.RemoveEmpty.RemoveNbsp, which removes empty
+ tags that contain non-breaking spaces as well other whitespace. You
+ can also modify which tags should have &nbsp; maintained with
+ %AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions.
+! Implement %Attr.AllowedClasses, which allows administrators to restrict
+ classes users can use to a specified finite set of classes, and
+ %Attr.ForbiddenClasses, which is the logical inverse.
+! You can now maintain your own configuration schema directories by
+ creating a config-schema.php file or passing an extra argument. Check
+ docs/dev-config-schema.html for more details.
+! Added HTMLPurifier_Config->serialize() method, which lets you save away
+ your configuration in a compact serial file, which you can unserialize
+ and use directly without having to go through the overhead of setup.
+- Fix bug where URIDefinition would not get cleared if it's directives got
+ changed.
+- Fix fatal error in HTMLPurifier_Encoder on certain platforms (probably NetBSD 5.0)
+- Fix bug in Linkify autoformatter involving <a><span>http://foo</span></a>
+- Make %URI.Munge not apply to links that have the same host as your host.
+- Prevent stray </body> tag from truncating output, if a second </body>
+ is present.
+. Created script maintenance/rename-config.php for renaming a configuration
+ directive while maintaining its alias. This script does not change source code.
+. Implement namespace locking for definition construction, to prevent
+ bugs where a directive is used for definition construction but is not
+ used to construct the cache hash.
+
+3.3.0, released 2009-02-16
+! Implement CSS property 'overflow' when %CSS.AllowTricky is true.
+! Implement generic property list classess
+- Fix bug with testEncodingSupportsASCII() algorithm when iconv() implementation
+ does not do the "right thing" with characters not supported in the output
+ set.
+- Spellcheck UTF-8: The Secret To Character Encoding
+- Fix improper removal of the contents of elements with only whitespace. Thanks
+ Eric Wald for reporting.
+- Fix broken test suite in versions of PHP without spl_autoload_register()
+- Fix degenerate case with YouTube filter involving double hyphens.
+ Thanks Pierre Attar for reporting.
+- Fix YouTube rendering problem on certain versions of Firefox.
+- Fix CSSDefinition Printer problems with decorators
+- Add text parameter to unit tests, forces text output
+. Add verbose mode to command line test runner, use (--verbose)
+. Turn on unit tests for UnitConverter
+. Fix missing version number in configuration %Attr.DefaultImageAlt (added 3.2.0)
+. Fix newline errors that caused spurious failures when CRLF HTML Purifier was
+ tested on Linux.
+. Removed trailing whitespace from all text files, see
+ remote-trailing-whitespace.php maintenance script.
+. Convert configuration to use property list backend.
+
+3.2.0, released 2008-10-31
+# Using %Core.CollectErrors forces line number/column tracking on, whereas
+ previously you could theoretically turn it off.
+# HTMLPurifier_Injector->notifyEnd() is formally deprecated. Please
+ use handleEnd() instead.
+! %Output.AttrSort for when you need your attributes in alphabetical order to
+ deal with a bug in FCKEditor. Requested by frank farmer.
+! Enable HTML comments when %HTML.Trusted is on. Requested by Waldo Jaquith.
+! Proper support for name attribute. It is now allowed and equivalent to the id
+ attribute in a and img tags, and is only converted to id when %HTML.TidyLevel
+ is heavy (for all doctypes).
+! %AutoFormat.RemoveEmpty to remove some empty tags from documents. Please don't
+ use on hand-written HTML.
+! Add error-cases for unsupported elements in MakeWellFormed. This enables
+ the strategy to be used, standalone, on untrusted input.
+! %Core.AggressivelyFixLt is on by default. This causes more sensible
+ processing of left angled brackets in smileys and other whatnot.
+! Test scripts now have a 'type' parameter, which lets you say 'htmlpurifier',
+ 'phpt', 'vtest', etc. in order to only execute those tests. This supercedes
+ the --only-phpt parameter, although for backwards-compatibility the flag
+ will still work.
+! AutoParagraph auto-formatter will now preserve double-newlines upon output.
+ Users who are not performing inbound filtering, this may seem a little
+ useless, but as a bonus, the test suite and handling of edge cases is also
+ improved.
+! Experimental implementation of forms for %HTML.Trusted
+! Track column numbers when maintain line numbers is on
+! Proprietary 'background' attribute on table-related elements converted into
+ corresponding CSS. Thanks Fusemail for sponsoring this feature!
+! Add forward(), forwardUntilEndToken(), backward() and current() to Injector
+ supertype.
+! HTMLPurifier_Injector->handleEnd() permits modification to end tokens. The
+ time of operation varies slightly from notifyEnd() as *all* end tokens are
+ processed by the injector before they are subject to the well-formedness rules.
+! %Attr.DefaultImageAlt allows overriding default behavior of setting alt to
+ basename of image when not present.
+! %AutoFormat.DisplayLinkURI neuters <a> tags into plain text URLs.
+- Fix two bugs in %URI.MakeAbsolute; one involving empty paths in base URLs,
+ the other involving an undefined $is_folder error.
+- Throw error when %Core.Encoding is set to a spurious value. Previously,
+ this errored silently and returned false.
+- Redirected stderr to stdout for flush error output.
+- %URI.DisableExternal will now use the host in %URI.Base if %URI.Host is not
+ available.
+- Do not re-munge URL if the output URL has the same host as the input URL.
+ Requested by Chris.
+- Fix error in documentation regarding %Filter.ExtractStyleBlocks
+- Prevent <![CDATA[<body></body>]]> from triggering %Core.ConvertDocumentToFragment
+- Fix bug with inline elements in blockquotes conflicting with strict doctype
+- Detect if HTML support is disabled for DOM by checking for loadHTML() method.
+- Fix bug where dots and double-dots in absolute URLs without hostname were
+ not collapsed by URIFilter_MakeAbsolute.
+- Fix bug with anonymous modules operating on SafeEmbed or SafeObject elements
+ by reordering their addition.
+- Will now throw exception on many error conditions during lexer creation; also
+ throw an exception when MaintainLineNumbers is true, but a non-tracksLineNumbers
+ is being used.
+- Detect if domxml extension is loaded, and use DirectLEx accordingly.
+- Improve handling of big numbers with floating point arithmetic in UnitConverter.
+ Reported by David Morton.
+. Strategy_MakeWellFormed now operates in-place, saving memory and allowing
+ for more interesting filter-backtracking
+. New HTMLPurifier_Injector->rewind() functionality, allows injectors to rewind
+ index to reprocess tokens.
+. StringHashParser now allows for multiline sections with "empty" content;
+ previously the section would remain undefined.
+. Added --quick option to multitest.php, which tests only the most recent
+ release for each series.
+. Added --distro option to multitest.php, which accepts either 'normal' or
+ 'standalone'. This supercedes --exclude-normal and --exclude-standalone
+
+3.1.1, released 2008-06-19
+# %URI.Munge now, by default, does not munge resources (for example, <img src="">)
+ In order to enable this again, please set %URI.MungeResources to true.
+! More robust imagecrash protection with height/width CSS with %CSS.MaxImgLength,
+ and height/width HTML with %HTML.MaxImgLength.
+! %URI.MungeSecretKey for secure URI munging. Thanks Chris
+ for sponsoring this feature. Check out the corresponding documentation
+ for details. (Att Nightly testers: The API for this feature changed before
+ the general release. Namely, rename your directives %URI.SecureMungeSecretKey =>
+ %URI.MungeSecretKey and and %URI.SecureMunge => %URI.Munge)
+! Implemented post URI filtering. Set member variable $post to true to set
+ a URIFilter as such.
+! Allow modules to define injectors via $info_injector. Injectors are
+ automatically disabled if injector's needed elements are not found.
+! Support for "safe" objects added, use %HTML.SafeObject and %HTML.SafeEmbed.
+ Thanks Chris for sponsoring. If you've been using ad hoc code from the
+ forums, PLEASE use this instead.
+! Added substitutions for %e, %n, %a and %p in %URI.Munge (in order,
+ embedded, tag name, attribute name, CSS property name). See %URI.Munge
+ for more details. Requested by Jochem Blok.
+- Disable percent height/width attributes for img.
+- AttrValidator operations are now atomic; updates to attributes are not
+ manifest in token until end of operations. This prevents naughty internal
+ code from directly modifying CurrentToken when they're not supposed to.
+ This semantics change was requested by frank farmer.
+- Percent encoding checks enabled for URI query and fragment
+- Fix stray backslashes in font-family; CSS Unicode character escapes are
+ now properly resolved (although *only* in font-family). Thanks Takeshi Terada
+ for reporting.
+- Improve parseCDATA algorithm to take into account newline normalization
+- Account for browser confusion between Yen character and backslash in
+ Shift_JIS encoding. This fix generalizes to any other encoding which is not
+ a strict superset of printable ASCII. Thanks Takeshi Terada for reporting.
+- Fix missing configuration parameter in Generator calls. Thanks vs for the
+ partial patch.
+- Improved adherence to Unicode by checking for non-character codepoints.
+ Thanks Geoffrey Sneddon for reporting. This may result in degraded
+ performance for extremely large inputs.
+- Allow CSS property-value pair ''text-decoration: none''. Thanks Jochem Blok
+ for reporting.
+. Added HTMLPurifier_UnitConverter and HTMLPurifier_Length for convenient
+ handling of CSS-style lengths. HTMLPurifier_AttrDef_CSS_Length now uses
+ this class.
+. API of HTMLPurifier_AttrDef_CSS_Length changed from __construct($disable_negative)
+ to __construct($min, $max). __construct(true) is equivalent to
+ __construct('0').
+. Added HTMLPurifier_AttrDef_Switch class
+. Rename HTMLPurifier_HTMLModule_Tidy->construct() to setup() and bubble method
+ up inheritance hierarchy to HTMLPurifier_HTMLModule. All HTMLModules
+ get this called with the configuration object. All modules now
+ use this rather than __construct(), although legacy code using constructors
+ will still work--the new format, however, lets modules access the
+ configuration object for HTML namespace dependant tweaks.
+. AttrDef_HTML_Pixels now takes a single construction parameter, pixels.
+. ConfigSchema data-structure heavily optimized; on average it uses a third
+ the memory it did previously. The interface has changed accordingly,
+ consult changes to HTMLPurifier_Config for details.
+. Variable parsing types now are magic integers instead of strings
+. Added benchmark for ConfigSchema
+. HTMLPurifier_Generator requires $config and $context parameters. If you
+ don't know what they should be, use HTMLPurifier_Config::createDefault()
+ and new HTMLPurifier_Context().
+. Printers now properly distinguish between output configuration, and
+ target configuration. This is not applicable to scripts using
+ the Printers for HTML Purifier related tasks.
+. HTML/CSS Printers must be primed with prepareGenerator($gen_config), otherwise
+ fatal errors will ensue.
+. URIFilter->prepare can return false in order to abort loading of the filter
+. Factory for AttrDef_URI implemented, URI#embedded to indicate URI that embeds
+ an external resource.
+. %URI.Munge functionality factored out into a post-filter class.
+. Added CurrentCSSProperty context variable during CSS validation
+
+3.1.0, released 2008-05-18
+# Unnecessary references to objects (vestiges of PHP4) removed from method
+ signatures. The following methods do not need references when assigning from
+ them and will result in E_STRICT errors if you try:
+ + HTMLPurifier_Config->get*Definition() [* = HTML, CSS]
+ + HTMLPurifier_ConfigSchema::instance()
+ + HTMLPurifier_DefinitionCacheFactory::instance()
+ + HTMLPurifier_DefinitionCacheFactory->create()
+ + HTMLPurifier_DoctypeRegistry->register()
+ + HTMLPurifier_DoctypeRegistry->get()
+ + HTMLPurifier_HTMLModule->addElement()
+ + HTMLPurifier_HTMLModule->addBlankElement()
+ + HTMLPurifier_LanguageFactory::instance()
+# Printer_ConfigForm's get*() functions were static-ified
+# %HTML.ForbiddenAttributes requires attribute declarations to be in the
+ form of tag@attr, NOT tag.attr (which will throw an error and won't do
+ anything). This is for forwards compatibility with XML; you'd do best
+ to migrate an %HTML.AllowedAttributes directives to this syntax too.
+! Allow index to be false for config from form creation
+! Added HTMLPurifier::VERSION constant
+! Commas, not dashes, used for serializer IDs. This change is forwards-compatible
+ and allows for version numbers like "3.1.0-dev".
+! %HTML.Allowed deals gracefully with whitespace anywhere, anytime!
+! HTML Purifier's URI handling is a lot more robust, with much stricter
+ validation checks and better percent encoding handling. Thanks Gareth Heyes
+ for indicating security vulnerabilities from lax percent encoding.
+! Bootstrap autoloader deals more robustly with classes that don't exist,
+ preventing class_exists($class, true) from barfing.
+- InterchangeBuilder now alphabetizes its lists
+- Validation error in configdoc output fixed
+- Iconv and other encoding errors muted even with custom error handlers that
+ do not honor error_reporting
+- Add protection against imagecrash attack with CSS height/width
+- HTMLPurifier::instance() created for consistency, is equivalent to getInstance()
+- Fixed and revamped broken ConfigForm smoketest
+- Bug with bool/null fields in Printer_ConfigForm fixed
+- Bug with global forbidden attributes fixed
+- Improved error messages for allowed and forbidden HTML elements and attributes
+- Missing (or null) in configdoc documentation restored
+- If DOM throws and exception during parsing with PH5P (occurs in newer versions
+ of DOM), HTML Purifier punts to DirectLex
+- Fatal error with unserialization of ScriptRequired
+- Created directories are now chmod'ed properly
+- Fixed bug with fallback languages in LanguageFactory
+- Standalone testing setup properly with autoload
+. Out-of-date documentation revised
+. UTF-8 encoding check optimization as suggested by Diego
+. HTMLPurifier_Error removed in favor of exceptions
+. More copy() function removed; should use clone instead
+. More extensive unit tests for HTMLDefinition
+. assertPurification moved to central harness
+. HTMLPurifier_Generator accepts $config and $context parameters during
+ instantiation, not runtime
+. Double-quotes outside of attribute values are now unescaped
+
+3.1.0rc1, released 2008-04-22
+# Autoload support added. Internal require_once's removed in favor of an
+ explicit require list or autoloading. To use HTML Purifier,
+ you must now either use HTMLPurifier.auto.php
+ or HTMLPurifier.includes.php; setting the include path and including
+ HTMLPurifier.php is insufficient--in such cases include HTMLPurifier.autoload.php
+ as well to register our autoload handler (or modify your autoload function
+ to check HTMLPurifier_Bootstrap::getPath($class)). You can also use
+ HTMLPurifier.safe-includes.php for a less performance friendly but more
+ user-friendly library load.
+# HTMLPurifier_ConfigSchema static functions are officially deprecated. Schema
+ information is stored in the ConfigSchema directory, and the
+ maintenance/generate-schema-cache.php generates the schema.ser file, which
+ is now instantiated. Support for userland schema changes coming soon!
+# HTMLPurifier_Config will now throw E_USER_NOTICE when you use a directive
+ alias; to get rid of these errors just modify your configuration to use
+ the new directive name.
+# HTMLPurifier->addFilter is deprecated; built-in filters can now be
+ enabled using %Filter.$filter_name or by setting your own filters using
+ %Filter.Custom
+# Directive-level safety properties superceded in favor of module-level
+ safety. Internal method HTMLModule->addElement() has changed, although
+ the externally visible HTMLDefinition->addElement has *not* changed.
+! Extra utility classes for testing and non-library operations can
+ be found in extras/. Specifically, these are FSTools and ConfigDoc.
+ You may find a use for these in your own project, but right now they
+ are highly experimental and volatile.
+! Integration with PHPT allows for automated smoketests
+! Limited support for proprietary HTML elements, namely <marquee>, sponsored
+ by Chris. You can enable them with %HTML.Proprietary if your client
+ demands them.
+! Support for !important CSS cascade modifier. By default, this will be stripped
+ from CSS, but you can enable it using %CSS.AllowImportant
+! Support for display and visibility CSS properties added, set %CSS.AllowTricky
+ to true to use them.
+! HTML Purifier now has its own Exception hierarchy under HTMLPurifier_Exception.
+ Developer error (not enduser error) can cause these to be triggered.
+! Experimental kses() wrapper introduced with HTMLPurifier.kses.php
+! Finally %CSS.AllowedProperties for tweaking allowed CSS properties without
+ mucking around with HTMLPurifier_CSSDefinition
+! ConfigDoc output has been enhanced with version and deprecation info.
+! %HTML.ForbiddenAttributes and %HTML.ForbiddenElements implemented.
+- Autoclose now operates iteratively, i.e. <span><span><div> now has
+ both span tags closed.
+- Various HTMLPurifier_Config convenience functions now accept another parameter
+ $schema which defines what HTMLPurifier_ConfigSchema to use besides the
+ global default.
+- Fix bug with trusted script handling in libxml versions later than 2.6.28.
+- Fix bug in ExtractStyleBlocks with comments in style tags
+- Fix bug in comment parsing for DirectLex
+- Flush output now displayed when in command line mode for unit tester
+- Fix bug with rgb(0, 1, 2) color syntax with spaces inside shorthand syntax
+- HTMLPurifier_HTMLDefinition->addAttribute can now be called multiple times
+ on the same element without emitting errors.
+- Fixed fatal error in PH5P lexer with invalid tag names
+. Plugins now get their own changelogs according to project conventions.
+. Convert tokens to use instanceof, reducing memory footprint and
+ improving comparison speed.
+. Dry runs now supported in SimpleTest; testing facilities improved
+. Bootstrap class added for handling autoloading functionality
+. Implemented recursive glob at FSTools->globr
+. ConfigSchema now has instance methods for all corresponding define*
+ static methods.
+. A couple of new historical maintenance scripts were added.
+. HTMLPurifier/HTMLModule/Tidy/XHTMLAndHTML4.php split into two files
+. tests/index.php can now be run from any directory.
+. HTMLPurifier_Token subclasses split into seperate files
+. HTMLPURIFIER_PREFIX now is defined in Bootstrap.php, NOT HTMLPurifier.php
+. HTMLPURIFIER_PREFIX can now be defined outside of HTML Purifier
+. New --php=php flag added, allows PHP executable to be specified (command
+ line only!)
+. htmlpurifier_add_test() preferred method to translate test files in to
+ classes, because it handles PHPT files too.
+. Debugger class is deprecated and will be removed soon.
+. Command line argument parsing for testing scripts revamped, now --opt value
+ format is supported.
+. Smoketests now cleanup after magic quotes
+. Generator now can output comments (however, comments are still stripped
+ from HTML Purifier output)
+. HTMLPurifier_ConfigSchema->validate() deprecated in favor of
+ HTMLPurifier_VarParser->parse()
+. Integers auto-cast into float type by VarParser.
+. HTMLPURIFIER_STRICT removed; no validation is performed on runtime, only
+ during cache generation
+. Reordered script calls in maintenance/flush.php
+. Command line scripts now honor exit codes
+. When --flush fails in unit testers, abort tests and print message
+. Improved documentation in docs/dev-flush.html about the maintenance scripts
+. copy() methods removed in favor of clone keyword
+
+3.0.0, released 2008-01-06
+# HTML Purifier is PHP 5 only! The 2.1.x branch will be maintained
+ until PHP 4 is completely deprecated, but no new features will be added
+ to it.
+ + Visibility declarations added
+ + Constructor methods renamed to __construct()
+ + PHP4 reference cruft removed (in progress)
+! CSS properties are now case-insensitive
+! DefinitionCacheFactory now can register new implementations
+! New HTMLPurifier_Filter_ExtractStyleBlocks for extracting <style> from
+ documents and cleaning their contents up. Requires the CSSTidy library
+ <http://csstidy.sourceforge.net/>. You can access the blocks with the
+ 'StyleBlocks' Context variable ($purifier->context->get('StyleBlocks')).
+ The output CSS can also be "scoped" for a specific element, use:
+ %Filter.ExtractStyleBlocksScope
+! Experimental support for some proprietary CSS attributes allowed:
+ opacity (and all of the browser-specific equivalents) and scrollbar colors.
+ Enable by setting %CSS.Proprietary to true.
+- Colors missing # but in hex form will be corrected
+- CSS Number algorithm improved
+- Unit testing and multi-testing now on steroids: command lines,
+ XML output, and other goodies now added.
+. Unit tests for Injector improved
+. New classes:
+ + HTMLPurifier_AttrDef_CSS_AlphaValue
+ + HTMLPurifier_AttrDef_CSS_Filter
+. Multitest now has a file docblock
+
+2.1.3, released 2007-11-05
+! tests/multitest.php allows you to test multiple versions by running
+ tests/index.php through multiple interpreters using `phpv` shell
+ script (you must provide this script!)
+- Fixed poor include ordering for Email URI AttrDefs, causes fatal errors
+ on some systems.
+- Injector algorithm further refined: off-by-one error regarding skip
+ counts for dormant injectors fixed
+- Corrective blockquote definition now enabled for HTML 4.01 Strict
+- Fatal error when <img> tag (or any other element with required attributes)
+ has 'id' attribute fixed, thanks NykO18 for reporting
+- Fix warning emitted when a non-supported URI scheme is passed to the
+ MakeAbsolute URIFilter, thanks NykO18 (again)
+- Further refine AutoParagraph injector. Behavior inside of elements
+ allowing paragraph tags clarified: only inline content delimeted by
+ double newlines (not block elements) are paragraphed.
+- Buggy treatment of end tags of elements that have required attributes
+ fixed (does not manifest on default tag-set)
+- Spurious internal content reorganization error suppressed
+- HTMLDefinition->addElement now returns a reference to the created
+ element object, as implied by the documentation
+- Phorum mod's HTML Purifier help message expanded (unreleased elsewhere)
+- Fix a theoretical class of infinite loops from DirectLex reported
+ by Nate Abele
+- Work around unnecessary DOMElement type-cast in PH5P that caused errors
+ in PHP 5.1
+- Work around PHP 4 SimpleTest lack-of-error complaining for one-time-only
+ HTMLDefinition errors, this may indicate problems with error-collecting
+ facilities in PHP 5
+- Make ErrorCollectorEMock work in both PHP 4 and PHP 5
+- Make PH5P work with PHP 5.0 by removing unnecessary array parameter typedef
+. %Core.AcceptFullDocuments renamed to %Core.ConvertDocumentToFragment
+ to better communicate its purpose
+. Error unit tests can now specify the expectation of no errors. Future
+ iterations of the harness will be extremely strict about what errors
+ are allowed
+. Extend Injector hooks to allow for more powerful injector routines
+. HTMLDefinition->addBlankElement created, as according to the HTMLModule
+ method
+. Doxygen configuration file updated, with minor improvements
+. Test runner now checks for similarly named files in conf/ directory too.
+. Minor cosmetic change to flush-definition-cache.php: trailing newline is
+ outputted
+. Maintenance script for generating PH5P patch added, original PH5P source
+ file also added under version control
+. Full unit test runner script title made more descriptive with PHP version
+. Updated INSTALL file to state that 4.3.7 is the earliest version we
+ are actively testing
+
+2.1.2, released 2007-09-03
+! Implemented Object module for trusted users
+! Implemented experimental HTML5 parsing mode using PH5P. To use, add
+ this to your code:
+ require_once 'HTMLPurifier/Lexer/PH5P.php';
+ $config->set('Core', 'LexerImpl', 'PH5P');
+ Note that this Lexer introduces some classes not in the HTMLPurifier
+ namespace. Also, this is PHP5 only.
+! CSS property border-spacing implemented
+- Fix non-visible parsing error in DirectLex with empty tags that have
+ slashes inside attribute values.
+- Fix typo in CSS definition: border-collapse:seperate; was incorrectly
+ accepted as valid CSS. Usually non-visible, because this styling is the
+ default for tables in most browsers. Thanks Brett Zamir for pointing
+ this out.
+- Fix validation errors in configuration form
+- Hammer out a bunch of edge-case bugs in the standalone distribution
+- Inclusion reflection removed from URISchemeRegistry; you must manually
+ include any new schema files you wish to use
+- Numerous typo fixes in documentation thanks to Brett Zamir
+. Unit test refactoring for one logical test per test function
+. Config and context parameters in ComplexHarness deprecated: instead, edit
+ the $config and $context member variables
+. HTML wrapper in DOMLex now takes DTD identifiers into account; doesn't
+ really make a difference, but is good for completeness sake
+. merge-library.php script refactored for greater code reusability and
+ PHP4 compatibility
+
+2.1.1, released 2007-08-04
+- Fix show-stopper bug in %URI.MakeAbsolute functionality
+- Fix PHP4 syntax error in standalone version
+. Add prefix directory to include path for standalone, this prevents
+ other installations from clobbering the standalone's URI schemes
+. Single test methods can be invoked by prefixing with __only
+
+2.1.0, released 2007-08-02
+# flush-htmldefinition-cache.php superseded in favor of a generic
+ flush-definition-cache.php script, you can clear a specific cache
+ by passing its name as a parameter to the script
+! Phorum mod implemented for HTML Purifier
+! With %Core.AggressivelyFixLt, <3 and similar emoticons no longer
+ trigger HTML removal in PHP5 (DOMLex). This directive is not necessary
+ for PHP4 (DirectLex).
+! Standalone file now available, which greatly reduces the amount of
+ includes (although there are still a few files that reside in the
+ standalone folder)
+! Relative URIs can now be transformed into their absolute equivalents
+ using %URI.Base and %URI.MakeAbsolute
+! Ruby implemented for XHTML 1.1
+! You can now define custom URI filtering behavior, see enduser-uri-filter.html
+ for more details
+! UTF-8 font names now supported in CSS
+- AutoFormatters emit friendly error messages if tags or attributes they
+ need are not allowed
+- ConfigForm's compactification of directive names is now configurable
+- AutoParagraph autoformatter algorithm refined after field-testing
+- XHTML 1.1 now applies XHTML 1.0 Strict cleanup routines, namely
+ blockquote wrapping
+- Contents of <style> tags removed by default when tags are removed
+. HTMLPurifier_Config->getSerial() implemented, this is extremely useful
+ for output cache invalidation
+. ConfigForm printer now can retrieve CSS and JS files as strings, in
+ case HTML Purifier's directory is not publically accessible
+. Introduce new text/itext configuration directive values: these represent
+ longer strings that would be more appropriately edited with a textarea
+. Allow newlines to act as separators for lists, hashes, lookups and
+ %HTML.Allowed
+. ConfigForm generates textareas instead of text inputs for lists, hashes,
+ lookups, text and itext fields
+. Hidden element content removal genericized: %Core.HiddenElements can
+ be used to customize this behavior, by default <script> and <style> are
+ hidden
+. Added HTMLPURIFIER_PREFIX constant, should be used instead of dirname(__FILE__)
+. Custom ChildDef added to default include list
+. URIScheme reflection improved: will not attempt to include file if class
+ already exists. May clobber autoload, so I need to keep an eye on it
+. ConfigSchema heavily optimized, will only collect information and validate
+ definitions when HTMLPURIFIER_SCHEMA_STRICT is true.
+. AttrDef_URI unit tests and implementation refactored
+. benchmarks/ directory now protected from public view with .htaccess file;
+ run the tests via command line
+. URI scheme is munged off if there is no authority and the scheme is the
+ default one
+. All unit tests inherit from HTMLPurifier_Harness, not UnitTestCase
+. Interface for URIScheme changed
+. Generic URI object to hold components of URI added, most systems involved
+ in URI validation have been migrated to use it
+. Custom filtering for URIs factored out to URIDefinition interface for
+ maximum extensibility
+
+2.0.1, released 2007-06-27
+! Tag auto-closing now based on a ChildDef heuristic rather than a
+ manually set auto_close array; some behavior may change
+! Experimental AutoFormat functionality added: auto-paragraph and
+ linkify your HTML input by setting %AutoFormat.AutoParagraph and
+ %AutoFormat.Linkify to true
+! Newlines normalized internally, and then converted back to the
+ value of PHP_EOL. If this is not desired, set your newline format
+ using %Output.Newline.
+! Beta error collection, messages are implemented for the most generic
+ cases involving Lexing or Strategies
+- Clean up special case code for <script> tags
+- Reorder includes for DefinitionCache decorators, fixes a possible
+ missing class error
+- Fixed bug where manually modified definitions were not saved via cache
+ (mostly harmless, except for the fact that it would be a little slower)
+- Configuration objects with different serials do not clobber each
+ others when revision numbers are unequal
+- Improve Serializer DefinitionCache directory permissions checks
+- DefinitionCache no longer throws errors when it encounters old
+ serial files that do not conform to the current style
+- Stray xmlns attributes removed from configuration documentation
+- configForm.php smoketest no longer has XSS vulnerability due to
+ unescaped print_r output
+- Printer adheres to configuration's directives on output format
+- Fix improperly named form field in ConfigForm printer
+. Rewire some test-cases to swallow errors rather than expect them
+. HTMLDefinition printer updated with some of the new attributes
+. DefinitionCache keys reordered to reflect precedence: version number,
+ hash, then revision number
+. %Core.DefinitionCache renamed to %Cache.DefinitionImpl
+. Interlinking in configuration documentation added using
+ Injector_PurifierLinkify
+. Directives now keep track of aliases to themselves
+. Error collector now requires a severity to be passed, use PHP's internal
+ error constants for this
+. HTMLPurifier_Config::getAllowedDirectivesForForm implemented, allows
+ much easier selective embedding of configuration values
+. Doctype objects now accept public and system DTD identifiers
+. %HTML.Doctype is now constrained by specific values, to specify a custom
+ doctype use new %HTML.CustomDoctype
+. ConfigForm truncates long directives to keep the form small, and does
+ not re-output namespaces
+
+2.0.0, released 2007-06-20
+# Completely refactored HTMLModuleManager, decentralizing safety
+ information
+# Transform modules changed to Tidy modules, which offer more flexibility
+ and better modularization
+# Configuration object now finalizes itself when a read operation is
+ performed on it, ensuring that its internal state stays consistent.
+ To revert this behavior, you can set the $autoFinalize member variable
+ off, but it's not recommended.
+# New compact syntax for AttrDef objects that can be used to instantiate
+ new objects via make()
+# Definitions (esp. HTMLDefinition) are now cached for a significant
+ performance boost. You can disable caching by setting %Core.DefinitionCache
+ to null. You CANNOT edit raw definitions without setting the corresponding
+ DefinitionID directive (%HTML.DefinitionID for HTMLDefinition).
+# Contents between <script> tags are now completely removed if <script>
+ is not allowed
+# Prototype-declarations for Lexer removed in favor of configuration
+ determination of Lexer implementations.
+! HTML Purifier now works in PHP 4.3.2.
+! Configuration form-editing API makes tweaking HTMLPurifier_Config a
+ breeze!
+! Configuration directives that accept hashes now allow new string
+ format: key1:value1,key2:value2
+! ConfigDoc now factored into OOP design
+! All deprecated elements now natively supported
+! Implement TinyMCE styled whitelist specification format in
+ %HTML.Allowed
+! Config object gives more friendly error messages when things go wrong
+! Advanced API implemented: easy functions for creating elements (addElement)
+ and attributes (addAttribute) on HTMLDefinition
+! Add native support for required attributes
+- Deprecated and removed EnableRedundantUTF8Cleaning. It didn't even work!
+- DOMLex will not emit errors when a custom error handler that does not
+ honor error_reporting is used
+- StrictBlockquote child definition refrains from wrapping whitespace
+ in tags now.
+- Bug resulting from tag transforms to non-allowed elements fixed
+- ChildDef_Custom's regex generation has been improved, removing several
+ false positives
+. Unit test for ElementDef created, ElementDef behavior modified to
+ be more flexible
+. Added convenience functions for HTMLModule constructors
+. AttrTypes now has accessor functions that should be used instead
+ of directly manipulating info
+. TagTransform_Center deprecated in favor of generic TagTransform_Simple
+. Add extra protection in AttrDef_URI against phantom Schemes
+. Doctype object added to HTMLDefinition which describes certain aspects
+ of the operational document type
+. Lexer is now pre-emptively included, with a conditional include for the
+ PHP5 only version.
+. HTMLDefinition and CSSDefinition have a common parent class: Definition.
+. DirectLex can now track line-numbers
+. Preliminary error collector is in place, although no code actually reports
+ errors yet
+. Factor out most of ValidateAttributes to new AttrValidator class
+
+1.6.1, released 2007-05-05
+! Support for more deprecated attributes via transformations:
+ + hspace and vspace in img
+ + size and noshade in hr
+ + nowrap in td
+ + clear in br
+ + align in caption, table, img and hr
+ + type in ul, ol and li
+! DirectLex now preserves text in which a < bracket is followed by
+ a non-alphanumeric character. This means that certain emoticons
+ are now preserved.
+! %Core.RemoveInvalidImg is now operational, when set to false invalid
+ images will hang around with an empty src
+! target attribute in a tag supported, use %Attr.AllowedFrameTargets
+ to enable
+! CSS property white-space now allows nowrap (supported in all modern
+ browsers) but not others (which have spotty browser implementations)
+! XHTML 1.1 mode now sort-of works without any fatal errors, and
+ lang is now moved over to xml:lang.
+! Attribute transformation smoketest available at smoketests/attrTransform.php
+! Transformation of font's size attribute now handles super-large numbers
+- Possibly fatal bug with __autoload() fixed in module manager
+- Invert HTMLModuleManager->addModule() processing order to check
+ prefixes first and then the literal module
+- Empty strings get converted to empty arrays instead of arrays with
+ an empty string in them.
+- Merging in attribute lists now works.
+. Demo script removed: it has been added to the website's repository
+. Basic.php script modified to work out of the box
+. Refactor AttrTransform classes to reduce duplication
+. AttrTransform_TextAlign axed in favor of a more general
+ AttrTransform_EnumToCSS, refer to HTMLModule/TransformToStrict.php to
+ see how the new equivalent is implemented
+. Unit tests now use exclusively assertIdentical
+
+1.6.0, released 2007-04-01
+! Support for most common deprecated attributes via transformations:
+ + bgcolor in td, th, tr and table
+ + border in img
+ + name in a and img
+ + width in td, th and hr
+ + height in td, th
+! Support for CSS attribute 'height' added
+! Support for rel and rev attributes in a tags added, use %Attr.AllowedRel
+ and %Attr.AllowedRev to activate
+- You can define ID blacklists using regular expressions via
+ %Attr.IDBlacklistRegexp
+- Error messages are emitted when you attempt to "allow" elements or
+ attributes that HTML Purifier does not support
+- Fix segfault in unit test. The problem is not very reproduceable and
+ I don't know what causes it, but a six line patch fixed it.
+
+1.5.0, released 2007-03-23
+! Added a rudimentary I18N and L10N system modeled off MediaWiki. It
+ doesn't actually do anything yet, but keep your eyes peeled.
+! docs/enduser-utf8.html explains how to use UTF-8 and HTML Purifier
+! Newly structured HTMLDefinition modeled off of XHTML 1.1 modules.
+ I am loathe to release beta quality APIs, but this is exactly that;
+ don't use the internal interfaces if you're not willing to do migration
+ later on.
+- Allow 'x' subtag in language codes
+- Fixed buggy chameleon-support for ins and del
+. Added support for IDREF attributes (i.e. for)
+. Renamed HTMLPurifier_AttrDef_Class to HTMLPurifier_AttrDef_Nmtokens
+. Removed context variable ParentType, replaced with IsInline, which
+ is false when you're not inline and an integer of the parent that
+ caused you to become inline when you are (so possibly zero)
+. Removed ElementDef->type in favor of ElementDef->descendants_are_inline
+ and HTMLDefinition->content_sets
+. StrictBlockquote now reports what elements its supposed to allow,
+ rather than what it does allow
+. Removed HTMLDefinition->info_flow_elements in favor of
+ HTMLDefinition->content_sets['Flow']
+. Removed redundant "exclusionary" definitions from DTD roster
+. StrictBlockquote now requires a construction parameter as if it
+ were an Required ChildDef, this is the "real" set of allowed elements
+. AttrDef partitioned into HTML, CSS and URI segments
+. Modify Youtube filter regexp to be multiline
+. Require both PHP5 and DOM extension in order to use DOMLex, fixes
+ some edge cases where a DOMDocument class exists in a PHP4 environment
+ due to DOM XML extension.
+
+1.4.1, released 2007-01-21
+! docs/enduser-youtube.html updated according to new functionality
+- YouTube IDs can have underscores and dashes
+
+1.4.0, released 2007-01-21
+! Implemented list-style-image, URIs now allowed in list-style
+! Implemented background-image, background-repeat, background-attachment
+ and background-position CSS properties. Shorthand property background
+ supports all of these properties.
+! Configuration documentation looks nicer
+! Added %Core.EscapeNonASCIICharacters to workaround loss of Unicode
+ characters while %Core.Encoding is set to a non-UTF-8 encoding.
+! Support for configuration directive aliases added
+! Config object can now be instantiated from ini files
+! YouTube preservation code added to the core, with two lines of code
+ you can add it as a filter to your code. See smoketests/preserveYouTube.php
+ for sample code.
+! Moved SLOW to docs/enduser-slow.html and added code examples
+- Replaced version check with functionality check for DOM (thanks Stephen
+ Khoo)
+. Added smoketest 'all.php', which loads all other smoketests via frames
+. Implemented AttrDef_CSSURI for url(http://google.com) style declarations
+. Added convenient single test selector form on test runner
+
+1.3.2, released 2006-12-25
+! HTMLPurifier object now accepts configuration arrays, no need to manually
+ instantiate a configuration object
+! Context object now accessible to outside
+! Added enduser-youtube.html, explains how to embed YouTube videos. See
+ also corresponding smoketest preserveYouTube.php.
+! Added purifyArray(), which takes a list of HTML and purifies it all
+! Added static member variable $version to HTML Purifier with PHP-compatible
+ version number string.
+- Fixed fatal error thrown by upper-cased language attributes
+- printDefinition.php: added labels, added better clarification
+. HTMLPurifier_Config::create() added, takes mixed variable and converts into
+ a HTMLPurifier_Config object.
+
+1.3.1, released 2006-12-06
+! Added HTMLPurifier.func.php stub for a convenient function to call the library
+- Fixed bug in RemoveInvalidImg code that caused all images to be dropped
+ (thanks to .mario for reporting this)
+. Standardized all attribute handling variables to attr, made it plural
+
+1.3.0, released 2006-11-26
+# Invalid images are now removed, rather than replaced with a dud
+ <img src="" alt="Invalid image" />. Previous behavior can be restored
+ with new directive %Core.RemoveInvalidImg set to false.
+! (X)HTML Strict now supported
+ + Transparently handles inline elements in block context (blockquote)
+! Added GET method to demo for easier validation, added 50kb max input size
+! New directive %HTML.BlockWrapper, for block-ifying inline elements
+! New directive %HTML.Parent, allows you to only allow inline content
+! New directives %HTML.AllowedElements and %HTML.AllowedAttributes to let
+ users narrow the set of allowed tags
+! <li value="4"> and <ul start="2"> now allowed in loose mode
+! New directives %URI.DisableExternalResources and %URI.DisableResources
+! New directive %Attr.DisableURI, which eliminates all hyperlinking
+! New directive %URI.Munge, munges URI so you can use some sort of redirector
+ service to avoid PageRank leaks or warn users that they are exiting your site.
+! Added spiffy new smoketest printDefinition.php, which lets you twiddle with
+ the configuration settings and see how the internal rules are affected.
+! New directive %URI.HostBlacklist for blocking links to bad hosts.
+ xssAttacks.php smoketest updated accordingly.
+- Added missing type to ChildDef_Chameleon
+- Remove Tidy option from demo if there is not Tidy available
+. ChildDef_Required guards against empty tags
+. Lookup table HTMLDefinition->info_flow_elements added
+. Added peace-of-mind variable initialization to Strategy_FixNesting
+. Added HTMLPurifier->info_parent_def, parent child processing made special
+. Added internal documents briefly summarizing future progression of HTML
+. HTMLPurifier_Config->getBatch($namespace) added
+. More lenient casting to bool from string in HTMLPurifier_ConfigSchema
+. Refactored ChildDef classes into their own files
+
+1.2.0, released 2006-11-19
+# ID attributes now disabled by default. New directives:
+ + %HTML.EnableAttrID - restores old behavior by allowing IDs
+ + %Attr.IDPrefix - %Attr.IDBlacklist alternative that munges all user IDs
+ so that they don't collide with your IDs
+ + %Attr.IDPrefixLocal - Same as above, but for when there are multiple
+ instances of user content on the page
+ + Profuse documentation on how to use these available in docs/enduser-id.txt
+! Added MODx plugin <http://modxcms.com/forums/index.php/topic,6604.0.html>
+! Added percent encoding normalization
+! XSS attacks smoketest given facelift
+! Configuration documentation now has table of contents
+! Added %URI.DisableExternal, which prevents links to external websites. You
+ can also use %URI.Host to permit absolute linking to subdomains
+! Non-accessible resources (ex. mailto) blocked from embedded URIs (img src)
+- Type variable in HTMLDefinition was not being set properly, fixed
+- Documentation updated
+ + TODO added request Phalanger
+ + TODO added request Native compression
+ + TODO added request Remove redundant tags
+ + TODO added possible plaintext formatter for HTML Purifier documentation
+ + Updated ConfigDoc TODO
+ + Improved inline comments in AttrDef/Class.php, AttrDef/CSS.php
+ and AttrDef/Host.php
+ + Revamped documentation into HTML, along with misc updates
+- HTMLPurifier_Context doesn't throw a variable reference error if you attempt
+ to retrieve a non-existent variable
+. Switched to purify()-wide Context object registry
+. Refactored unit tests to minimize duplication
+. XSS attack sheet updated
+. configdoc.xml now has xml:space attached to default value nodes
+. Allow configuration directives to permit null values
+. Cleaned up test-cases to remove unnecessary swallowErrors()
+
+1.1.2, released 2006-09-30
+! Add HTMLPurifier.auto.php stub file that configures include_path
+- Documentation updated
+ + INSTALL document rewritten
+ + TODO added semi-lossy conversion
+ + API Doxygen docs' file exclusions updated
+ + Added notes on HTML versus XML attribute whitespace handling
+ + Noted that HTMLPurifier_ChildDef_Custom isn't being used
+ + Noted that config object's definitions are cached versions
+- Fixed lack of attribute parsing in HTMLPurifier_Lexer_PEARSax3
+- ftp:// URIs now have their typecodes checked
+- Hooked up HTMLPurifier_ChildDef_Custom's unit tests (they weren't being run)
+. Line endings standardized throughout project (svn:eol-style standardized)
+. Refactored parseData() to general Lexer class
+. Tester named "HTML Purifier" not "HTMLPurifier"
+
+1.1.1, released 2006-09-24
+! Configuration option to optionally Tidy up output for indentation to make up
+ for dropped whitespace by DOMLex (pretty-printing for the entire application
+ should be done by a page-wide Tidy)
+- Various documentation updates
+- Fixed parse error in configuration documentation script
+- Fixed fatal error in benchmark scripts, slightly augmented
+- As far as possible, whitespace is preserved in-between table children
+- Sample test-settings.php file included
+
+1.1.0, released 2006-09-16
+! Directive documentation generation using XSLT
+! XHTML can now be turned off, output becomes <br>
+- Made URI validator more forgiving: will ignore leading and trailing
+ quotes, apostrophes and less than or greater than signs.
+- Enforce alphanumeric namespace and directive names for configuration.
+- Table child definition made more flexible, will fix up poorly ordered elements
+. Renamed ConfigDef to ConfigSchema
+
+1.0.1, released 2006-09-04
+- Fixed slight bug in DOMLex attribute parsing
+- Fixed rejection of case-insensitive configuration values when there is a
+ set of allowed values. This manifested in %Core.Encoding.
+- Fixed rejection of inline style declarations that had lots of extra
+ space in them. This manifested in TinyMCE.
+
+1.0.0, released 2006-09-01
+! Shorthand CSS properties implemented: font, border, background, list-style
+! Basic color keywords translated into hexadecimal values
+! Table CSS properties implemented
+! Support for charsets other than UTF-8 (defined by iconv)
+! Malformed UTF-8 and non-SGML character detection and cleaning implemented
+- Fixed broken numeric entity conversion
+- API documentation completed
+. (HTML|CSS)Definition de-singleton-ized
+
+1.0.0beta, released 2006-08-16
+! First public release, most functionality implemented. Notable omissions are:
+ + Shorthand CSS properties
+ + Table CSS properties
+ + Deprecated attribute transformations
+
+ vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/README.md b/vendor/ezyang/htmlpurifier/README.md
new file mode 100644
index 000000000..b321f2b69
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/README.md
@@ -0,0 +1,29 @@
+HTML Purifier [![Build Status](https://secure.travis-ci.org/ezyang/htmlpurifier.svg?branch=master)](http://travis-ci.org/ezyang/htmlpurifier)
+=============
+
+HTML Purifier is an HTML filtering solution that uses a unique combination
+of robust whitelists and agressive parsing to ensure that not only are
+XSS attacks thwarted, but the resulting HTML is standards compliant.
+
+HTML Purifier is oriented towards richly formatted documents from
+untrusted sources that require CSS and a full tag-set. This library can
+be configured to accept a more restrictive set of tags, but it won't be
+as efficient as more bare-bones parsers. It will, however, do the job
+right, which may be more important.
+
+Places to go:
+
+* See INSTALL for a quick installation guide
+* See docs/ for developer-oriented documentation, code examples and
+ an in-depth installation guide.
+* See WYSIWYG for information on editors like TinyMCE and FCKeditor
+
+HTML Purifier can be found on the web at: [http://htmlpurifier.org/](http://htmlpurifier.org/)
+
+## Installation
+
+Package available on [Composer](https://packagist.org/packages/ezyang/htmlpurifier).
+
+If you're using Composer to manage dependencies, you can use
+
+ $ composer require "ezyang/htmlpurifier": "dev-master"
diff --git a/vendor/ezyang/htmlpurifier/TODO b/vendor/ezyang/htmlpurifier/TODO
new file mode 100644
index 000000000..1afb33cbf
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/TODO
@@ -0,0 +1,150 @@
+
+TODO List
+
+= KEY ====================
+ # Flagship
+ - Regular
+ ? Maybe I'll Do It
+==========================
+
+If no interest is expressed for a feature that may require a considerable
+amount of effort to implement, it may get endlessly delayed. Do not be
+afraid to cast your vote for the next feature to be implemented!
+
+Things to do as soon as possible:
+
+ - http://htmlpurifier.org/phorum/read.php?3,5560,6307#msg-6307
+ - Think about allowing explicit order of operations hooks for transforms
+ - Fix "<.<" bug (trailing < is removed if not EOD)
+ - Build in better internal state dumps and debugging tools for remote
+ debugging
+ - Allowed/Allowed* have strange interactions when both set
+ ? Transform lone embeds into object tags
+ - Deprecated config options that emit warnings when you set them (with'
+ a way of muting the warning if you really want to)
+ - Make HTML.Trusted work with Output.FlashCompat
+ - HTML.Trusted and HTML.SafeObject have funny interaction; general
+ problem is what to do when a module "supersedes" another
+ (see also tables and basic tables.) This is a little dicier
+ because HTML.SafeObject has some extra functionality that
+ trusted might find useful. See http://htmlpurifier.org/phorum/read.php?3,5762,6100
+
+FUTURE VERSIONS
+---------------
+
+4.9 release [OMG CONFIG PONIES]
+ ! Fix Printer. It's from the old days when we didn't have decent XML classes
+ ! Factor demo.php into a set of Printer classes, and then create a stub
+ file for users here (inside the actual HTML Purifier library)
+ - Fix error handling with form construction
+ - Do encoding validation in Printers, or at least, where user data comes in
+ - Config: Add examples to everything (make built-in which also automatically
+ gives output)
+ - Add "register" field to config schemas to eliminate dependence on
+ naming conventions (try to remember why we ultimately decided on tihs)
+
+5.0 release [HTML 5]
+ # Swap out code to use html5lib tokenizer and tree-builder
+ ! Allow turning off of FixNesting and required attribute insertion
+
+5.1 release [It's All About Trust] (floating)
+ # Implement untrusted, dangerous elements/attributes
+ # Implement IDREF support (harder than it seems, since you cannot have
+ IDREFs to non-existent IDs)
+ - Implement <area> (client and server side image maps are blocking
+ on IDREF support)
+ # Frameset XHTML 1.0 and HTML 4.01 doctypes
+ - Figure out how to simultaneously set %CSS.Trusted and %HTML.Trusted (?)
+
+5.2 release [Error'ed]
+ # Error logging for filtering/cleanup procedures
+ # Additional support for poorly written HTML
+ - Microsoft Word HTML cleaning (i.e. MsoNormal, but research essential!)
+ - Friendly strict handling of <address> (block -> <br>)
+ - XSS-attempt detection--certain errors are flagged XSS-like
+ - Append something to duplicate IDs so they're still usable (impl. note: the
+ dupe detector would also need to detect the suffix as well)
+
+6.0 release [Beyond HTML]
+ # Legit token based CSS parsing (will require revamping almost every
+ AttrDef class). Probably will use CSSTidy
+ # More control over allowed CSS properties using a modularization
+ # IRI support (this includes IDN)
+ - Standardize token armor for all areas of processing
+
+7.0 release [To XML and Beyond]
+ - Extended HTML capabilities based on namespacing and tag transforms (COMPLEX)
+ - Hooks for adding custom processors to custom namespaced tags and
+ attributes, offer default implementation
+ - Lots of documentation and samples
+
+Ongoing
+ - More refactoring to take advantage of PHP5's facilities
+ - Refactor unit tests into lots of test methods
+ - Plugins for major CMSes (COMPLEX)
+ - phpBB
+ - Also, a FAQ for extension writers with HTML Purifier
+
+AutoFormat
+ - Smileys
+ - Syntax highlighting (with GeSHi) with <pre> and possibly <?php
+ - Look at http://drupal.org/project/Modules/category/63 for ideas
+
+Neat feature related
+ ! Support exporting configuration, so users can easily tweak settings
+ in the demo, and then copy-paste into their own setup
+ - Advanced URI filtering schemes (see docs/proposal-new-directives.txt)
+ - Allow scoped="scoped" attribute in <style> tags; may be troublesome
+ because regular CSS has no way of uniquely identifying nodes, so we'd
+ have to generate IDs
+ - Explain how to use HTML Purifier in non-PHP languages / create
+ a simple command line stub (or complicated?)
+ - Fixes for Firefox's inability to handle COL alignment props (Bug 915)
+ - Automatically add non-breaking spaces to empty table cells when
+ empty-cells:show is applied to have compatibility with Internet Explorer
+ - Table of Contents generation (XHTML Compiler might be reusable). May also
+ be out-of-band information.
+ - Full set of color keywords. Also, a way to add onto them without
+ finalizing the configuration object.
+ - Write a var_export and memcached DefinitionCache - Denis
+ - Built-in support for target="_blank" on all external links
+ - Convert RTL/LTR override characters to <bdo> tags, or vice versa on demand.
+ Also, enable disabling of directionality
+ ? Externalize inline CSS to promote clean HTML, proposed by Sander Tekelenburg
+ ? Remove redundant tags, ex. <u><u>Underlined</u></u>. Implementation notes:
+ 1. Analyzing which tags to remove duplicants
+ 2. Ensure attributes are merged into the parent tag
+ 3. Extend the tag exclusion system to specify whether or not the
+ contents should be dropped or not (currently, there's code that could do
+ something like this if it didn't drop the inner text too.)
+ ? Make AutoParagraph also support paragraph-izing double <br> tags, and not
+ just double newlines. This is kind of tough to do in the current framework,
+ though, and might be reasonably approximated by search replacing double <br>s
+ with newlines before running it through HTML Purifier.
+
+Maintenance related (slightly boring)
+ # CHMOD install script for PEAR installs
+ ! Factor out command line parser into its own class, and unit test it
+ - Reduce size of internal data-structures (esp. HTMLDefinition)
+ - Allow merging configurations. Thus,
+ a -> b -> default
+ c -> d -> default
+ becomes
+ a -> b -> c -> d -> default
+ Maybe allow more fine-grained tuning of this behavior. Alternatively,
+ encourage people to use short plist depths before building them up.
+ - Time PHPT tests
+
+ChildDef related (very boring)
+ - Abstract ChildDef_BlockQuote to work with all elements that only
+ allow blocks in them, required or optional
+ - Implement lenient <ruby> child validation
+
+Wontfix
+ - Non-lossy smart alternate character encoding transformations (unless
+ patch provided)
+ - Pretty-printing HTML: users can use Tidy on the output on entire page
+ - Native content compression, whitespace stripping: use gzip if this is
+ really important
+
+ vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/VERSION b/vendor/ezyang/htmlpurifier/VERSION
new file mode 100644
index 000000000..b550c72a1
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/VERSION
@@ -0,0 +1 @@
+4.9.2 \ No newline at end of file
diff --git a/vendor/ezyang/htmlpurifier/WHATSNEW b/vendor/ezyang/htmlpurifier/WHATSNEW
new file mode 100644
index 000000000..b435e664b
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/WHATSNEW
@@ -0,0 +1,12 @@
+HTML Purifier 4.9.x is a maintenance release, collecting a year
+of accumulated bug fixes plus a few new features. New features
+include support for min/max-width/height CSS, and rgba/hsl/hsla
+in color specifications. Major bugfixes include improvements
+in the Serializer cache to avoid chmod'ing directories, better
+entity decoding (we won't accidentally encode entities that occur
+in URLs) and rel="noopener" on links with target attributes,
+to prevent them from overwriting the original frame.
+
+4.9.0 was skipped due to a packaging problem; 4.9.2 fixes two
+major regressions in PHP 5.3 support and entity decoding; no
+other functional changes were applied.
diff --git a/vendor/ezyang/htmlpurifier/WYSIWYG b/vendor/ezyang/htmlpurifier/WYSIWYG
new file mode 100644
index 000000000..c518aacdd
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/WYSIWYG
@@ -0,0 +1,20 @@
+
+WYSIWYG - What You See Is What You Get
+ HTML Purifier: A Pretty Good Fit for TinyMCE and FCKeditor
+
+Javascript-based WYSIWYG editors, simply stated, are quite amazing. But I've
+always been wary about using them due to security issues: they handle the
+client-side magic, but once you've been served a piping hot load of unfiltered
+HTML, what should be done then? In some situations, you can serve it uncleaned,
+since you only offer these facilities to trusted(?) authors.
+
+Unfortunantely, for blog comments and anonymous input, BBCode, Textile and
+other markup languages still reign supreme. Put simply: filtering HTML is
+hard work, and these WYSIWYG authors don't offer anything to alleviate that
+trouble. Therein lies the solution:
+
+HTML Purifier is perfect for filtering pure-HTML input from WYSIWYG editors.
+
+Enough said.
+
+ vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/composer.json b/vendor/ezyang/htmlpurifier/composer.json
new file mode 100644
index 000000000..80fee3db3
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/composer.json
@@ -0,0 +1,25 @@
+{
+ "name": "ezyang/htmlpurifier",
+ "description": "Standards compliant HTML filter written in PHP",
+ "type": "library",
+ "keywords": ["html"],
+ "homepage": "http://htmlpurifier.org/",
+ "license": "LGPL",
+ "authors": [
+ {
+ "name": "Edward Z. Yang",
+ "email": "admin@htmlpurifier.org",
+ "homepage": "http://ezyang.com"
+ }
+ ],
+ "require": {
+ "php": ">=5.2"
+ },
+ "require-dev": {
+ "simpletest/simpletest": "^1.1"
+ },
+ "autoload": {
+ "psr-0": { "HTMLPurifier": "library/" },
+ "files": ["library/HTMLPurifier.composer.php"]
+ }
+}
diff --git a/vendor/ezyang/htmlpurifier/extras/ConfigDoc/HTMLXSLTProcessor.php b/vendor/ezyang/htmlpurifier/extras/ConfigDoc/HTMLXSLTProcessor.php
new file mode 100644
index 000000000..1cfec5d76
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/extras/ConfigDoc/HTMLXSLTProcessor.php
@@ -0,0 +1,91 @@
+<?php
+
+/**
+ * Decorator/extender XSLT processor specifically for HTML documents.
+ */
+class ConfigDoc_HTMLXSLTProcessor
+{
+
+ /**
+ * Instance of XSLTProcessor
+ */
+ protected $xsltProcessor;
+
+ public function __construct($proc = false)
+ {
+ if ($proc === false) $proc = new XSLTProcessor();
+ $this->xsltProcessor = $proc;
+ }
+
+ /**
+ * @note Allows a string $xsl filename to be passed
+ */
+ public function importStylesheet($xsl)
+ {
+ if (is_string($xsl)) {
+ $xsl_file = $xsl;
+ $xsl = new DOMDocument();
+ $xsl->load($xsl_file);
+ }
+ return $this->xsltProcessor->importStylesheet($xsl);
+ }
+
+ /**
+ * Transforms an XML file into compatible XHTML based on the stylesheet
+ * @param $xml XML DOM tree, or string filename
+ * @return string HTML output
+ * @todo Rename to transformToXHTML, as transformToHTML is misleading
+ */
+ public function transformToHTML($xml)
+ {
+ if (is_string($xml)) {
+ $dom = new DOMDocument();
+ $dom->load($xml);
+ } else {
+ $dom = $xml;
+ }
+ $out = $this->xsltProcessor->transformToXML($dom);
+
+ // fudges for HTML backwards compatibility
+ // assumes that document is XHTML
+ $out = str_replace('/>', ' />', $out); // <br /> not <br/>
+ $out = str_replace(' xmlns=""', '', $out); // rm unnecessary xmlns
+
+ if (class_exists('Tidy')) {
+ // cleanup output
+ $config = array(
+ 'indent' => true,
+ 'output-xhtml' => true,
+ 'wrap' => 80
+ );
+ $tidy = new Tidy;
+ $tidy->parseString($out, $config, 'utf8');
+ $tidy->cleanRepair();
+ $out = (string) $tidy;
+ }
+
+ return $out;
+ }
+
+ /**
+ * Bulk sets parameters for the XSL stylesheet
+ * @param array $options Associative array of options to set
+ */
+ public function setParameters($options)
+ {
+ foreach ($options as $name => $value) {
+ $this->xsltProcessor->setParameter('', $name, $value);
+ }
+ }
+
+ /**
+ * Forward any other calls to the XSLT processor
+ */
+ public function __call($name, $arguments)
+ {
+ call_user_func_array(array($this->xsltProcessor, $name), $arguments);
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/extras/FSTools.php b/vendor/ezyang/htmlpurifier/extras/FSTools.php
new file mode 100644
index 000000000..ce0076316
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/extras/FSTools.php
@@ -0,0 +1,164 @@
+<?php
+
+/**
+ * Filesystem tools not provided by default; can recursively create, copy
+ * and delete folders. Some template methods are provided for extensibility.
+ *
+ * @note This class must be instantiated to be used, although it does
+ * not maintain state.
+ */
+class FSTools
+{
+
+ private static $singleton;
+
+ /**
+ * Returns a global instance of FSTools
+ */
+ public static function singleton()
+ {
+ if (empty(FSTools::$singleton)) FSTools::$singleton = new FSTools();
+ return FSTools::$singleton;
+ }
+
+ /**
+ * Sets our global singleton to something else; useful for overloading
+ * functions.
+ */
+ public static function setSingleton($singleton)
+ {
+ FSTools::$singleton = $singleton;
+ }
+
+ /**
+ * Recursively creates a directory
+ * @param string $folder Name of folder to create
+ * @note Adapted from the PHP manual comment 76612
+ */
+ public function mkdirr($folder)
+ {
+ $folders = preg_split("#[\\\\/]#", $folder);
+ $base = '';
+ for($i = 0, $c = count($folders); $i < $c; $i++) {
+ if(empty($folders[$i])) {
+ if (!$i) {
+ // special case for root level
+ $base .= DIRECTORY_SEPARATOR;
+ }
+ continue;
+ }
+ $base .= $folders[$i];
+ if(!is_dir($base)){
+ $this->mkdir($base);
+ }
+ $base .= DIRECTORY_SEPARATOR;
+ }
+ }
+
+ /**
+ * Copy a file, or recursively copy a folder and its contents; modified
+ * so that copied files, if PHP, have includes removed
+ * @note Adapted from http://aidanlister.com/repos/v/function.copyr.php
+ */
+ public function copyr($source, $dest)
+ {
+ // Simple copy for a file
+ if (is_file($source)) {
+ return $this->copy($source, $dest);
+ }
+ // Make destination directory
+ if (!is_dir($dest)) {
+ $this->mkdir($dest);
+ }
+ // Loop through the folder
+ $dir = $this->dir($source);
+ while ( false !== ($entry = $dir->read()) ) {
+ // Skip pointers
+ if ($entry == '.' || $entry == '..') {
+ continue;
+ }
+ if (!$this->copyable($entry)) {
+ continue;
+ }
+ // Deep copy directories
+ if ($dest !== "$source/$entry") {
+ $this->copyr("$source/$entry", "$dest/$entry");
+ }
+ }
+ // Clean up
+ $dir->close();
+ return true;
+ }
+
+ /**
+ * Overloadable function that tests a filename for copyability. By
+ * default, everything should be copied; you can restrict things to
+ * ignore hidden files, unreadable files, etc. This function
+ * applies to copyr().
+ */
+ public function copyable($file)
+ {
+ return true;
+ }
+
+ /**
+ * Delete a file, or a folder and its contents
+ * @note Adapted from http://aidanlister.com/repos/v/function.rmdirr.php
+ */
+ public function rmdirr($dirname)
+ {
+ // Sanity check
+ if (!$this->file_exists($dirname)) {
+ return false;
+ }
+
+ // Simple delete for a file
+ if ($this->is_file($dirname) || $this->is_link($dirname)) {
+ return $this->unlink($dirname);
+ }
+
+ // Loop through the folder
+ $dir = $this->dir($dirname);
+ while (false !== $entry = $dir->read()) {
+ // Skip pointers
+ if ($entry == '.' || $entry == '..') {
+ continue;
+ }
+ // Recurse
+ $this->rmdirr($dirname . DIRECTORY_SEPARATOR . $entry);
+ }
+
+ // Clean up
+ $dir->close();
+ return $this->rmdir($dirname);
+ }
+
+ /**
+ * Recursively globs a directory.
+ */
+ public function globr($dir, $pattern, $flags = NULL)
+ {
+ $files = $this->glob("$dir/$pattern", $flags);
+ if ($files === false) $files = array();
+ $sub_dirs = $this->glob("$dir/*", GLOB_ONLYDIR);
+ if ($sub_dirs === false) $sub_dirs = array();
+ foreach ($sub_dirs as $sub_dir) {
+ $sub_files = $this->globr($sub_dir, $pattern, $flags);
+ $files = array_merge($files, $sub_files);
+ }
+ return $files;
+ }
+
+ /**
+ * Allows for PHP functions to be called and be stubbed.
+ * @warning This function will not work for functions that need
+ * to pass references; manually define a stub function for those.
+ */
+ public function __call($name, $args)
+ {
+ return call_user_func_array($name, $args);
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/extras/FSTools/File.php b/vendor/ezyang/htmlpurifier/extras/FSTools/File.php
new file mode 100644
index 000000000..6453a7a45
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/extras/FSTools/File.php
@@ -0,0 +1,141 @@
+<?php
+
+/**
+ * Represents a file in the filesystem
+ *
+ * @warning Be sure to distinguish between get() and write() versus
+ * read() and put(), the former operates on the entire file, while
+ * the latter operates on a handle.
+ */
+class FSTools_File
+{
+
+ /** Filename of file this object represents */
+ protected $name;
+
+ /** Handle for the file */
+ protected $handle = false;
+
+ /** Instance of FSTools for interfacing with filesystem */
+ protected $fs;
+
+ /**
+ * Filename of file you wish to instantiate.
+ * @note This file need not exist
+ */
+ public function __construct($name, $fs = false)
+ {
+ $this->name = $name;
+ $this->fs = $fs ? $fs : FSTools::singleton();
+ }
+
+ /** Returns the filename of the file. */
+ public function getName() {return $this->name;}
+
+ /** Returns directory of the file without trailing slash */
+ public function getDirectory() {return $this->fs->dirname($this->name);}
+
+ /**
+ * Retrieves the contents of a file
+ * @todo Throw an exception if file doesn't exist
+ */
+ public function get()
+ {
+ return $this->fs->file_get_contents($this->name);
+ }
+
+ /** Writes contents to a file, creates new file if necessary */
+ public function write($contents)
+ {
+ return $this->fs->file_put_contents($this->name, $contents);
+ }
+
+ /** Deletes the file */
+ public function delete()
+ {
+ return $this->fs->unlink($this->name);
+ }
+
+ /** Returns true if file exists and is a file. */
+ public function exists()
+ {
+ return $this->fs->is_file($this->name);
+ }
+
+ /** Returns last file modification time */
+ public function getMTime()
+ {
+ return $this->fs->filemtime($this->name);
+ }
+
+ /**
+ * Chmod a file
+ * @note We ignore errors because of some weird owner trickery due
+ * to SVN duality
+ */
+ public function chmod($octal_code)
+ {
+ return @$this->fs->chmod($this->name, $octal_code);
+ }
+
+ /** Opens file's handle */
+ public function open($mode)
+ {
+ if ($this->handle) $this->close();
+ $this->handle = $this->fs->fopen($this->name, $mode);
+ return true;
+ }
+
+ /** Closes file's handle */
+ public function close()
+ {
+ if (!$this->handle) return false;
+ $status = $this->fs->fclose($this->handle);
+ $this->handle = false;
+ return $status;
+ }
+
+ /** Retrieves a line from an open file, with optional max length $length */
+ public function getLine($length = null)
+ {
+ if (!$this->handle) $this->open('r');
+ if ($length === null) return $this->fs->fgets($this->handle);
+ else return $this->fs->fgets($this->handle, $length);
+ }
+
+ /** Retrieves a character from an open file */
+ public function getChar()
+ {
+ if (!$this->handle) $this->open('r');
+ return $this->fs->fgetc($this->handle);
+ }
+
+ /** Retrieves an $length bytes of data from an open data */
+ public function read($length)
+ {
+ if (!$this->handle) $this->open('r');
+ return $this->fs->fread($this->handle, $length);
+ }
+
+ /** Writes to an open file */
+ public function put($string)
+ {
+ if (!$this->handle) $this->open('a');
+ return $this->fs->fwrite($this->handle, $string);
+ }
+
+ /** Returns TRUE if the end of the file has been reached */
+ public function eof()
+ {
+ if (!$this->handle) return true;
+ return $this->fs->feof($this->handle);
+ }
+
+ public function __destruct()
+ {
+ if ($this->handle) $this->close();
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/extras/HTMLPurifierExtras.auto.php b/vendor/ezyang/htmlpurifier/extras/HTMLPurifierExtras.auto.php
new file mode 100644
index 000000000..4016d8afd
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/extras/HTMLPurifierExtras.auto.php
@@ -0,0 +1,11 @@
+<?php
+
+/**
+ * This is a stub include that automatically configures the include path.
+ */
+
+set_include_path(dirname(__FILE__) . PATH_SEPARATOR . get_include_path() );
+require_once 'HTMLPurifierExtras.php';
+require_once 'HTMLPurifierExtras.autoload.php';
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/extras/HTMLPurifierExtras.autoload.php b/vendor/ezyang/htmlpurifier/extras/HTMLPurifierExtras.autoload.php
new file mode 100644
index 000000000..de4a8aaaf
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/extras/HTMLPurifierExtras.autoload.php
@@ -0,0 +1,26 @@
+<?php
+
+/**
+ * @file
+ * Convenience file that registers autoload handler for HTML Purifier.
+ *
+ * @warning
+ * This autoloader does not contain the compatibility code seen in
+ * HTMLPurifier_Bootstrap; the user is expected to make any necessary
+ * changes to use this library.
+ */
+
+if (function_exists('spl_autoload_register')) {
+ spl_autoload_register(array('HTMLPurifierExtras', 'autoload'));
+ if (function_exists('__autoload')) {
+ // Be polite and ensure that userland autoload gets retained
+ spl_autoload_register('__autoload');
+ }
+} elseif (!function_exists('__autoload')) {
+ function __autoload($class)
+ {
+ return HTMLPurifierExtras::autoload($class);
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/extras/HTMLPurifierExtras.php b/vendor/ezyang/htmlpurifier/extras/HTMLPurifierExtras.php
new file mode 100644
index 000000000..35c2ca7e7
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/extras/HTMLPurifierExtras.php
@@ -0,0 +1,31 @@
+<?php
+
+/**
+ * Meta-class for HTML Purifier's extra class hierarchies, similar to
+ * HTMLPurifier_Bootstrap.
+ */
+class HTMLPurifierExtras
+{
+
+ public static function autoload($class)
+ {
+ $path = HTMLPurifierExtras::getPath($class);
+ if (!$path) return false;
+ require $path;
+ return true;
+ }
+
+ public static function getPath($class)
+ {
+ if (
+ strncmp('FSTools', $class, 7) !== 0 &&
+ strncmp('ConfigDoc', $class, 9) !== 0
+ ) return false;
+ // Custom implementations can go here
+ // Standard implementation:
+ return str_replace('_', '/', $class) . '.php';
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/extras/README b/vendor/ezyang/htmlpurifier/extras/README
new file mode 100644
index 000000000..4bfece79e
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/extras/README
@@ -0,0 +1,32 @@
+
+HTML Purifier Extras
+ The Method Behind The Madness!
+
+The extras/ folder in HTML Purifier contains--you guessed it--extra things
+for HTML Purifier. Specifically, these are two extra libraries called
+FSTools and ConfigSchema. They're extra for a reason: you don't need them
+if you're using HTML Purifier for normal usage: filtering HTML. However,
+if you're a developer, and would like to test HTML Purifier, or need to
+use one of HTML Purifier's maintenance scripts, chances are they'll need
+these libraries. Who knows: maybe you'll find them useful too!
+
+Here are the libraries:
+
+
+FSTools
+-------
+
+Short for File System Tools, this is a poor-man's object-oriented wrapper for
+the filesystem. It currently consists of two classes:
+
+- FSTools: This is a singleton that contains a manner of useful functions
+ such as recursive glob, directory removal, etc, as well as the ability
+ to call arbitrary native PHP functions through it like $FS->fopen(...).
+ This makes it a lot simpler to mock these filesystem calls for unit testing.
+
+- FSTools_File: This object represents a single file, and has almost any
+ method imaginable one would need.
+
+Check the files themselves for more information.
+
+ vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier.auto.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.auto.php
index 1960c399f..1960c399f 100644
--- a/library/HTMLPurifier.auto.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.auto.php
diff --git a/library/HTMLPurifier.autoload.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.autoload.php
index c3ea67e81..c3ea67e81 100644
--- a/library/HTMLPurifier.autoload.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.autoload.php
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier.composer.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.composer.php
new file mode 100644
index 000000000..52acc56b0
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.composer.php
@@ -0,0 +1,4 @@
+<?php
+if (!defined('HTMLPURIFIER_PREFIX')) {
+ define('HTMLPURIFIER_PREFIX', dirname(__FILE__));
+}
diff --git a/library/HTMLPurifier.func.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.func.php
index 64b140bec..64b140bec 100644
--- a/library/HTMLPurifier.func.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.func.php
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier.includes.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.includes.php
new file mode 100644
index 000000000..7779fe34d
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.includes.php
@@ -0,0 +1,234 @@
+<?php
+
+/**
+ * @file
+ * This file was auto-generated by generate-includes.php and includes all of
+ * the core files required by HTML Purifier. Use this if performance is a
+ * primary concern and you are using an opcode cache. PLEASE DO NOT EDIT THIS
+ * FILE, changes will be overwritten the next time the script is run.
+ *
+ * @version 4.9.2
+ *
+ * @warning
+ * You must *not* include any other HTML Purifier files before this file,
+ * because 'require' not 'require_once' is used.
+ *
+ * @warning
+ * This file requires that the include path contains the HTML Purifier
+ * library directory; this is not auto-set.
+ */
+
+require 'HTMLPurifier.php';
+require 'HTMLPurifier/Arborize.php';
+require 'HTMLPurifier/AttrCollections.php';
+require 'HTMLPurifier/AttrDef.php';
+require 'HTMLPurifier/AttrTransform.php';
+require 'HTMLPurifier/AttrTypes.php';
+require 'HTMLPurifier/AttrValidator.php';
+require 'HTMLPurifier/Bootstrap.php';
+require 'HTMLPurifier/Definition.php';
+require 'HTMLPurifier/CSSDefinition.php';
+require 'HTMLPurifier/ChildDef.php';
+require 'HTMLPurifier/Config.php';
+require 'HTMLPurifier/ConfigSchema.php';
+require 'HTMLPurifier/ContentSets.php';
+require 'HTMLPurifier/Context.php';
+require 'HTMLPurifier/DefinitionCache.php';
+require 'HTMLPurifier/DefinitionCacheFactory.php';
+require 'HTMLPurifier/Doctype.php';
+require 'HTMLPurifier/DoctypeRegistry.php';
+require 'HTMLPurifier/ElementDef.php';
+require 'HTMLPurifier/Encoder.php';
+require 'HTMLPurifier/EntityLookup.php';
+require 'HTMLPurifier/EntityParser.php';
+require 'HTMLPurifier/ErrorCollector.php';
+require 'HTMLPurifier/ErrorStruct.php';
+require 'HTMLPurifier/Exception.php';
+require 'HTMLPurifier/Filter.php';
+require 'HTMLPurifier/Generator.php';
+require 'HTMLPurifier/HTMLDefinition.php';
+require 'HTMLPurifier/HTMLModule.php';
+require 'HTMLPurifier/HTMLModuleManager.php';
+require 'HTMLPurifier/IDAccumulator.php';
+require 'HTMLPurifier/Injector.php';
+require 'HTMLPurifier/Language.php';
+require 'HTMLPurifier/LanguageFactory.php';
+require 'HTMLPurifier/Length.php';
+require 'HTMLPurifier/Lexer.php';
+require 'HTMLPurifier/Node.php';
+require 'HTMLPurifier/PercentEncoder.php';
+require 'HTMLPurifier/PropertyList.php';
+require 'HTMLPurifier/PropertyListIterator.php';
+require 'HTMLPurifier/Queue.php';
+require 'HTMLPurifier/Strategy.php';
+require 'HTMLPurifier/StringHash.php';
+require 'HTMLPurifier/StringHashParser.php';
+require 'HTMLPurifier/TagTransform.php';
+require 'HTMLPurifier/Token.php';
+require 'HTMLPurifier/TokenFactory.php';
+require 'HTMLPurifier/URI.php';
+require 'HTMLPurifier/URIDefinition.php';
+require 'HTMLPurifier/URIFilter.php';
+require 'HTMLPurifier/URIParser.php';
+require 'HTMLPurifier/URIScheme.php';
+require 'HTMLPurifier/URISchemeRegistry.php';
+require 'HTMLPurifier/UnitConverter.php';
+require 'HTMLPurifier/VarParser.php';
+require 'HTMLPurifier/VarParserException.php';
+require 'HTMLPurifier/Zipper.php';
+require 'HTMLPurifier/AttrDef/CSS.php';
+require 'HTMLPurifier/AttrDef/Clone.php';
+require 'HTMLPurifier/AttrDef/Enum.php';
+require 'HTMLPurifier/AttrDef/Integer.php';
+require 'HTMLPurifier/AttrDef/Lang.php';
+require 'HTMLPurifier/AttrDef/Switch.php';
+require 'HTMLPurifier/AttrDef/Text.php';
+require 'HTMLPurifier/AttrDef/URI.php';
+require 'HTMLPurifier/AttrDef/CSS/Number.php';
+require 'HTMLPurifier/AttrDef/CSS/AlphaValue.php';
+require 'HTMLPurifier/AttrDef/CSS/Background.php';
+require 'HTMLPurifier/AttrDef/CSS/BackgroundPosition.php';
+require 'HTMLPurifier/AttrDef/CSS/Border.php';
+require 'HTMLPurifier/AttrDef/CSS/Color.php';
+require 'HTMLPurifier/AttrDef/CSS/Composite.php';
+require 'HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php';
+require 'HTMLPurifier/AttrDef/CSS/Filter.php';
+require 'HTMLPurifier/AttrDef/CSS/Font.php';
+require 'HTMLPurifier/AttrDef/CSS/FontFamily.php';
+require 'HTMLPurifier/AttrDef/CSS/Ident.php';
+require 'HTMLPurifier/AttrDef/CSS/ImportantDecorator.php';
+require 'HTMLPurifier/AttrDef/CSS/Length.php';
+require 'HTMLPurifier/AttrDef/CSS/ListStyle.php';
+require 'HTMLPurifier/AttrDef/CSS/Multiple.php';
+require 'HTMLPurifier/AttrDef/CSS/Percentage.php';
+require 'HTMLPurifier/AttrDef/CSS/TextDecoration.php';
+require 'HTMLPurifier/AttrDef/CSS/URI.php';
+require 'HTMLPurifier/AttrDef/HTML/Bool.php';
+require 'HTMLPurifier/AttrDef/HTML/Nmtokens.php';
+require 'HTMLPurifier/AttrDef/HTML/Class.php';
+require 'HTMLPurifier/AttrDef/HTML/Color.php';
+require 'HTMLPurifier/AttrDef/HTML/FrameTarget.php';
+require 'HTMLPurifier/AttrDef/HTML/ID.php';
+require 'HTMLPurifier/AttrDef/HTML/Pixels.php';
+require 'HTMLPurifier/AttrDef/HTML/Length.php';
+require 'HTMLPurifier/AttrDef/HTML/LinkTypes.php';
+require 'HTMLPurifier/AttrDef/HTML/MultiLength.php';
+require 'HTMLPurifier/AttrDef/URI/Email.php';
+require 'HTMLPurifier/AttrDef/URI/Host.php';
+require 'HTMLPurifier/AttrDef/URI/IPv4.php';
+require 'HTMLPurifier/AttrDef/URI/IPv6.php';
+require 'HTMLPurifier/AttrDef/URI/Email/SimpleCheck.php';
+require 'HTMLPurifier/AttrTransform/Background.php';
+require 'HTMLPurifier/AttrTransform/BdoDir.php';
+require 'HTMLPurifier/AttrTransform/BgColor.php';
+require 'HTMLPurifier/AttrTransform/BoolToCSS.php';
+require 'HTMLPurifier/AttrTransform/Border.php';
+require 'HTMLPurifier/AttrTransform/EnumToCSS.php';
+require 'HTMLPurifier/AttrTransform/ImgRequired.php';
+require 'HTMLPurifier/AttrTransform/ImgSpace.php';
+require 'HTMLPurifier/AttrTransform/Input.php';
+require 'HTMLPurifier/AttrTransform/Lang.php';
+require 'HTMLPurifier/AttrTransform/Length.php';
+require 'HTMLPurifier/AttrTransform/Name.php';
+require 'HTMLPurifier/AttrTransform/NameSync.php';
+require 'HTMLPurifier/AttrTransform/Nofollow.php';
+require 'HTMLPurifier/AttrTransform/SafeEmbed.php';
+require 'HTMLPurifier/AttrTransform/SafeObject.php';
+require 'HTMLPurifier/AttrTransform/SafeParam.php';
+require 'HTMLPurifier/AttrTransform/ScriptRequired.php';
+require 'HTMLPurifier/AttrTransform/TargetBlank.php';
+require 'HTMLPurifier/AttrTransform/TargetNoopener.php';
+require 'HTMLPurifier/AttrTransform/TargetNoreferrer.php';
+require 'HTMLPurifier/AttrTransform/Textarea.php';
+require 'HTMLPurifier/ChildDef/Chameleon.php';
+require 'HTMLPurifier/ChildDef/Custom.php';
+require 'HTMLPurifier/ChildDef/Empty.php';
+require 'HTMLPurifier/ChildDef/List.php';
+require 'HTMLPurifier/ChildDef/Required.php';
+require 'HTMLPurifier/ChildDef/Optional.php';
+require 'HTMLPurifier/ChildDef/StrictBlockquote.php';
+require 'HTMLPurifier/ChildDef/Table.php';
+require 'HTMLPurifier/DefinitionCache/Decorator.php';
+require 'HTMLPurifier/DefinitionCache/Null.php';
+require 'HTMLPurifier/DefinitionCache/Serializer.php';
+require 'HTMLPurifier/DefinitionCache/Decorator/Cleanup.php';
+require 'HTMLPurifier/DefinitionCache/Decorator/Memory.php';
+require 'HTMLPurifier/HTMLModule/Bdo.php';
+require 'HTMLPurifier/HTMLModule/CommonAttributes.php';
+require 'HTMLPurifier/HTMLModule/Edit.php';
+require 'HTMLPurifier/HTMLModule/Forms.php';
+require 'HTMLPurifier/HTMLModule/Hypertext.php';
+require 'HTMLPurifier/HTMLModule/Iframe.php';
+require 'HTMLPurifier/HTMLModule/Image.php';
+require 'HTMLPurifier/HTMLModule/Legacy.php';
+require 'HTMLPurifier/HTMLModule/List.php';
+require 'HTMLPurifier/HTMLModule/Name.php';
+require 'HTMLPurifier/HTMLModule/Nofollow.php';
+require 'HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php';
+require 'HTMLPurifier/HTMLModule/Object.php';
+require 'HTMLPurifier/HTMLModule/Presentation.php';
+require 'HTMLPurifier/HTMLModule/Proprietary.php';
+require 'HTMLPurifier/HTMLModule/Ruby.php';
+require 'HTMLPurifier/HTMLModule/SafeEmbed.php';
+require 'HTMLPurifier/HTMLModule/SafeObject.php';
+require 'HTMLPurifier/HTMLModule/SafeScripting.php';
+require 'HTMLPurifier/HTMLModule/Scripting.php';
+require 'HTMLPurifier/HTMLModule/StyleAttribute.php';
+require 'HTMLPurifier/HTMLModule/Tables.php';
+require 'HTMLPurifier/HTMLModule/Target.php';
+require 'HTMLPurifier/HTMLModule/TargetBlank.php';
+require 'HTMLPurifier/HTMLModule/TargetNoopener.php';
+require 'HTMLPurifier/HTMLModule/TargetNoreferrer.php';
+require 'HTMLPurifier/HTMLModule/Text.php';
+require 'HTMLPurifier/HTMLModule/Tidy.php';
+require 'HTMLPurifier/HTMLModule/XMLCommonAttributes.php';
+require 'HTMLPurifier/HTMLModule/Tidy/Name.php';
+require 'HTMLPurifier/HTMLModule/Tidy/Proprietary.php';
+require 'HTMLPurifier/HTMLModule/Tidy/XHTMLAndHTML4.php';
+require 'HTMLPurifier/HTMLModule/Tidy/Strict.php';
+require 'HTMLPurifier/HTMLModule/Tidy/Transitional.php';
+require 'HTMLPurifier/HTMLModule/Tidy/XHTML.php';
+require 'HTMLPurifier/Injector/AutoParagraph.php';
+require 'HTMLPurifier/Injector/DisplayLinkURI.php';
+require 'HTMLPurifier/Injector/Linkify.php';
+require 'HTMLPurifier/Injector/PurifierLinkify.php';
+require 'HTMLPurifier/Injector/RemoveEmpty.php';
+require 'HTMLPurifier/Injector/RemoveSpansWithoutAttributes.php';
+require 'HTMLPurifier/Injector/SafeObject.php';
+require 'HTMLPurifier/Lexer/DOMLex.php';
+require 'HTMLPurifier/Lexer/DirectLex.php';
+require 'HTMLPurifier/Node/Comment.php';
+require 'HTMLPurifier/Node/Element.php';
+require 'HTMLPurifier/Node/Text.php';
+require 'HTMLPurifier/Strategy/Composite.php';
+require 'HTMLPurifier/Strategy/Core.php';
+require 'HTMLPurifier/Strategy/FixNesting.php';
+require 'HTMLPurifier/Strategy/MakeWellFormed.php';
+require 'HTMLPurifier/Strategy/RemoveForeignElements.php';
+require 'HTMLPurifier/Strategy/ValidateAttributes.php';
+require 'HTMLPurifier/TagTransform/Font.php';
+require 'HTMLPurifier/TagTransform/Simple.php';
+require 'HTMLPurifier/Token/Comment.php';
+require 'HTMLPurifier/Token/Tag.php';
+require 'HTMLPurifier/Token/Empty.php';
+require 'HTMLPurifier/Token/End.php';
+require 'HTMLPurifier/Token/Start.php';
+require 'HTMLPurifier/Token/Text.php';
+require 'HTMLPurifier/URIFilter/DisableExternal.php';
+require 'HTMLPurifier/URIFilter/DisableExternalResources.php';
+require 'HTMLPurifier/URIFilter/DisableResources.php';
+require 'HTMLPurifier/URIFilter/HostBlacklist.php';
+require 'HTMLPurifier/URIFilter/MakeAbsolute.php';
+require 'HTMLPurifier/URIFilter/Munge.php';
+require 'HTMLPurifier/URIFilter/SafeIframe.php';
+require 'HTMLPurifier/URIScheme/data.php';
+require 'HTMLPurifier/URIScheme/file.php';
+require 'HTMLPurifier/URIScheme/ftp.php';
+require 'HTMLPurifier/URIScheme/http.php';
+require 'HTMLPurifier/URIScheme/https.php';
+require 'HTMLPurifier/URIScheme/mailto.php';
+require 'HTMLPurifier/URIScheme/news.php';
+require 'HTMLPurifier/URIScheme/nntp.php';
+require 'HTMLPurifier/URIScheme/tel.php';
+require 'HTMLPurifier/VarParser/Flexible.php';
+require 'HTMLPurifier/VarParser/Native.php';
diff --git a/library/HTMLPurifier.kses.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.kses.php
index 752290077..752290077 100644
--- a/library/HTMLPurifier.kses.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.kses.php
diff --git a/library/HTMLPurifier.path.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.path.php
index 39b1b6531..39b1b6531 100644
--- a/library/HTMLPurifier.path.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.path.php
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.php
new file mode 100644
index 000000000..9c539e225
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.php
@@ -0,0 +1,292 @@
+<?php
+
+/*! @mainpage
+ *
+ * HTML Purifier is an HTML filter that will take an arbitrary snippet of
+ * HTML and rigorously test, validate and filter it into a version that
+ * is safe for output onto webpages. It achieves this by:
+ *
+ * -# Lexing (parsing into tokens) the document,
+ * -# Executing various strategies on the tokens:
+ * -# Removing all elements not in the whitelist,
+ * -# Making the tokens well-formed,
+ * -# Fixing the nesting of the nodes, and
+ * -# Validating attributes of the nodes; and
+ * -# Generating HTML from the purified tokens.
+ *
+ * However, most users will only need to interface with the HTMLPurifier
+ * and HTMLPurifier_Config.
+ */
+
+/*
+ HTML Purifier 4.9.2 - Standards Compliant HTML Filtering
+ Copyright (C) 2006-2008 Edward Z. Yang
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * Facade that coordinates HTML Purifier's subsystems in order to purify HTML.
+ *
+ * @note There are several points in which configuration can be specified
+ * for HTML Purifier. The precedence of these (from lowest to
+ * highest) is as follows:
+ * -# Instance: new HTMLPurifier($config)
+ * -# Invocation: purify($html, $config)
+ * These configurations are entirely independent of each other and
+ * are *not* merged (this behavior may change in the future).
+ *
+ * @todo We need an easier way to inject strategies using the configuration
+ * object.
+ */
+class HTMLPurifier
+{
+
+ /**
+ * Version of HTML Purifier.
+ * @type string
+ */
+ public $version = '4.9.2';
+
+ /**
+ * Constant with version of HTML Purifier.
+ */
+ const VERSION = '4.9.2';
+
+ /**
+ * Global configuration object.
+ * @type HTMLPurifier_Config
+ */
+ public $config;
+
+ /**
+ * Array of extra filter objects to run on HTML,
+ * for backwards compatibility.
+ * @type HTMLPurifier_Filter[]
+ */
+ private $filters = array();
+
+ /**
+ * Single instance of HTML Purifier.
+ * @type HTMLPurifier
+ */
+ private static $instance;
+
+ /**
+ * @type HTMLPurifier_Strategy_Core
+ */
+ protected $strategy;
+
+ /**
+ * @type HTMLPurifier_Generator
+ */
+ protected $generator;
+
+ /**
+ * Resultant context of last run purification.
+ * Is an array of contexts if the last called method was purifyArray().
+ * @type HTMLPurifier_Context
+ */
+ public $context;
+
+ /**
+ * Initializes the purifier.
+ *
+ * @param HTMLPurifier_Config|mixed $config Optional HTMLPurifier_Config object
+ * for all instances of the purifier, if omitted, a default
+ * configuration is supplied (which can be overridden on a
+ * per-use basis).
+ * The parameter can also be any type that
+ * HTMLPurifier_Config::create() supports.
+ */
+ public function __construct($config = null)
+ {
+ $this->config = HTMLPurifier_Config::create($config);
+ $this->strategy = new HTMLPurifier_Strategy_Core();
+ }
+
+ /**
+ * Adds a filter to process the output. First come first serve
+ *
+ * @param HTMLPurifier_Filter $filter HTMLPurifier_Filter object
+ */
+ public function addFilter($filter)
+ {
+ trigger_error(
+ 'HTMLPurifier->addFilter() is deprecated, use configuration directives' .
+ ' in the Filter namespace or Filter.Custom',
+ E_USER_WARNING
+ );
+ $this->filters[] = $filter;
+ }
+
+ /**
+ * Filters an HTML snippet/document to be XSS-free and standards-compliant.
+ *
+ * @param string $html String of HTML to purify
+ * @param HTMLPurifier_Config $config Config object for this operation,
+ * if omitted, defaults to the config object specified during this
+ * object's construction. The parameter can also be any type
+ * that HTMLPurifier_Config::create() supports.
+ *
+ * @return string Purified HTML
+ */
+ public function purify($html, $config = null)
+ {
+ // :TODO: make the config merge in, instead of replace
+ $config = $config ? HTMLPurifier_Config::create($config) : $this->config;
+
+ // implementation is partially environment dependant, partially
+ // configuration dependant
+ $lexer = HTMLPurifier_Lexer::create($config);
+
+ $context = new HTMLPurifier_Context();
+
+ // setup HTML generator
+ $this->generator = new HTMLPurifier_Generator($config, $context);
+ $context->register('Generator', $this->generator);
+
+ // set up global context variables
+ if ($config->get('Core.CollectErrors')) {
+ // may get moved out if other facilities use it
+ $language_factory = HTMLPurifier_LanguageFactory::instance();
+ $language = $language_factory->create($config, $context);
+ $context->register('Locale', $language);
+
+ $error_collector = new HTMLPurifier_ErrorCollector($context);
+ $context->register('ErrorCollector', $error_collector);
+ }
+
+ // setup id_accumulator context, necessary due to the fact that
+ // AttrValidator can be called from many places
+ $id_accumulator = HTMLPurifier_IDAccumulator::build($config, $context);
+ $context->register('IDAccumulator', $id_accumulator);
+
+ $html = HTMLPurifier_Encoder::convertToUTF8($html, $config, $context);
+
+ // setup filters
+ $filter_flags = $config->getBatch('Filter');
+ $custom_filters = $filter_flags['Custom'];
+ unset($filter_flags['Custom']);
+ $filters = array();
+ foreach ($filter_flags as $filter => $flag) {
+ if (!$flag) {
+ continue;
+ }
+ if (strpos($filter, '.') !== false) {
+ continue;
+ }
+ $class = "HTMLPurifier_Filter_$filter";
+ $filters[] = new $class;
+ }
+ foreach ($custom_filters as $filter) {
+ // maybe "HTMLPurifier_Filter_$filter", but be consistent with AutoFormat
+ $filters[] = $filter;
+ }
+ $filters = array_merge($filters, $this->filters);
+ // maybe prepare(), but later
+
+ for ($i = 0, $filter_size = count($filters); $i < $filter_size; $i++) {
+ $html = $filters[$i]->preFilter($html, $config, $context);
+ }
+
+ // purified HTML
+ $html =
+ $this->generator->generateFromTokens(
+ // list of tokens
+ $this->strategy->execute(
+ // list of un-purified tokens
+ $lexer->tokenizeHTML(
+ // un-purified HTML
+ $html,
+ $config,
+ $context
+ ),
+ $config,
+ $context
+ )
+ );
+
+ for ($i = $filter_size - 1; $i >= 0; $i--) {
+ $html = $filters[$i]->postFilter($html, $config, $context);
+ }
+
+ $html = HTMLPurifier_Encoder::convertFromUTF8($html, $config, $context);
+ $this->context =& $context;
+ return $html;
+ }
+
+ /**
+ * Filters an array of HTML snippets
+ *
+ * @param string[] $array_of_html Array of html snippets
+ * @param HTMLPurifier_Config $config Optional config object for this operation.
+ * See HTMLPurifier::purify() for more details.
+ *
+ * @return string[] Array of purified HTML
+ */
+ public function purifyArray($array_of_html, $config = null)
+ {
+ $context_array = array();
+ foreach ($array_of_html as $key => $html) {
+ $array_of_html[$key] = $this->purify($html, $config);
+ $context_array[$key] = $this->context;
+ }
+ $this->context = $context_array;
+ return $array_of_html;
+ }
+
+ /**
+ * Singleton for enforcing just one HTML Purifier in your system
+ *
+ * @param HTMLPurifier|HTMLPurifier_Config $prototype Optional prototype
+ * HTMLPurifier instance to overload singleton with,
+ * or HTMLPurifier_Config instance to configure the
+ * generated version with.
+ *
+ * @return HTMLPurifier
+ */
+ public static function instance($prototype = null)
+ {
+ if (!self::$instance || $prototype) {
+ if ($prototype instanceof HTMLPurifier) {
+ self::$instance = $prototype;
+ } elseif ($prototype) {
+ self::$instance = new HTMLPurifier($prototype);
+ } else {
+ self::$instance = new HTMLPurifier();
+ }
+ }
+ return self::$instance;
+ }
+
+ /**
+ * Singleton for enforcing just one HTML Purifier in your system
+ *
+ * @param HTMLPurifier|HTMLPurifier_Config $prototype Optional prototype
+ * HTMLPurifier instance to overload singleton with,
+ * or HTMLPurifier_Config instance to configure the
+ * generated version with.
+ *
+ * @return HTMLPurifier
+ * @note Backwards compatibility, see instance()
+ */
+ public static function getInstance($prototype = null)
+ {
+ return HTMLPurifier::instance($prototype);
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier.safe-includes.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.safe-includes.php
new file mode 100644
index 000000000..a3261f8a3
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.safe-includes.php
@@ -0,0 +1,228 @@
+<?php
+
+/**
+ * @file
+ * This file was auto-generated by generate-includes.php and includes all of
+ * the core files required by HTML Purifier. This is a convenience stub that
+ * includes all files using dirname(__FILE__) and require_once. PLEASE DO NOT
+ * EDIT THIS FILE, changes will be overwritten the next time the script is run.
+ *
+ * Changes to include_path are not necessary.
+ */
+
+$__dir = dirname(__FILE__);
+
+require_once $__dir . '/HTMLPurifier.php';
+require_once $__dir . '/HTMLPurifier/Arborize.php';
+require_once $__dir . '/HTMLPurifier/AttrCollections.php';
+require_once $__dir . '/HTMLPurifier/AttrDef.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform.php';
+require_once $__dir . '/HTMLPurifier/AttrTypes.php';
+require_once $__dir . '/HTMLPurifier/AttrValidator.php';
+require_once $__dir . '/HTMLPurifier/Bootstrap.php';
+require_once $__dir . '/HTMLPurifier/Definition.php';
+require_once $__dir . '/HTMLPurifier/CSSDefinition.php';
+require_once $__dir . '/HTMLPurifier/ChildDef.php';
+require_once $__dir . '/HTMLPurifier/Config.php';
+require_once $__dir . '/HTMLPurifier/ConfigSchema.php';
+require_once $__dir . '/HTMLPurifier/ContentSets.php';
+require_once $__dir . '/HTMLPurifier/Context.php';
+require_once $__dir . '/HTMLPurifier/DefinitionCache.php';
+require_once $__dir . '/HTMLPurifier/DefinitionCacheFactory.php';
+require_once $__dir . '/HTMLPurifier/Doctype.php';
+require_once $__dir . '/HTMLPurifier/DoctypeRegistry.php';
+require_once $__dir . '/HTMLPurifier/ElementDef.php';
+require_once $__dir . '/HTMLPurifier/Encoder.php';
+require_once $__dir . '/HTMLPurifier/EntityLookup.php';
+require_once $__dir . '/HTMLPurifier/EntityParser.php';
+require_once $__dir . '/HTMLPurifier/ErrorCollector.php';
+require_once $__dir . '/HTMLPurifier/ErrorStruct.php';
+require_once $__dir . '/HTMLPurifier/Exception.php';
+require_once $__dir . '/HTMLPurifier/Filter.php';
+require_once $__dir . '/HTMLPurifier/Generator.php';
+require_once $__dir . '/HTMLPurifier/HTMLDefinition.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule.php';
+require_once $__dir . '/HTMLPurifier/HTMLModuleManager.php';
+require_once $__dir . '/HTMLPurifier/IDAccumulator.php';
+require_once $__dir . '/HTMLPurifier/Injector.php';
+require_once $__dir . '/HTMLPurifier/Language.php';
+require_once $__dir . '/HTMLPurifier/LanguageFactory.php';
+require_once $__dir . '/HTMLPurifier/Length.php';
+require_once $__dir . '/HTMLPurifier/Lexer.php';
+require_once $__dir . '/HTMLPurifier/Node.php';
+require_once $__dir . '/HTMLPurifier/PercentEncoder.php';
+require_once $__dir . '/HTMLPurifier/PropertyList.php';
+require_once $__dir . '/HTMLPurifier/PropertyListIterator.php';
+require_once $__dir . '/HTMLPurifier/Queue.php';
+require_once $__dir . '/HTMLPurifier/Strategy.php';
+require_once $__dir . '/HTMLPurifier/StringHash.php';
+require_once $__dir . '/HTMLPurifier/StringHashParser.php';
+require_once $__dir . '/HTMLPurifier/TagTransform.php';
+require_once $__dir . '/HTMLPurifier/Token.php';
+require_once $__dir . '/HTMLPurifier/TokenFactory.php';
+require_once $__dir . '/HTMLPurifier/URI.php';
+require_once $__dir . '/HTMLPurifier/URIDefinition.php';
+require_once $__dir . '/HTMLPurifier/URIFilter.php';
+require_once $__dir . '/HTMLPurifier/URIParser.php';
+require_once $__dir . '/HTMLPurifier/URIScheme.php';
+require_once $__dir . '/HTMLPurifier/URISchemeRegistry.php';
+require_once $__dir . '/HTMLPurifier/UnitConverter.php';
+require_once $__dir . '/HTMLPurifier/VarParser.php';
+require_once $__dir . '/HTMLPurifier/VarParserException.php';
+require_once $__dir . '/HTMLPurifier/Zipper.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/CSS.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/Clone.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/Enum.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/Integer.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/Lang.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/Switch.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/Text.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/URI.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Number.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/CSS/AlphaValue.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Background.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Border.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Color.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Composite.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Filter.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Font.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/CSS/FontFamily.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Ident.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/CSS/ImportantDecorator.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Length.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/CSS/ListStyle.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Multiple.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Percentage.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/CSS/TextDecoration.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/CSS/URI.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/HTML/Bool.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/HTML/Nmtokens.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/HTML/Class.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/HTML/Color.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/HTML/FrameTarget.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/HTML/ID.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/HTML/Pixels.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/HTML/Length.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/HTML/LinkTypes.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/HTML/MultiLength.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/URI/Email.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/URI/Host.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/URI/IPv4.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/URI/IPv6.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/URI/Email/SimpleCheck.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/Background.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/BdoDir.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/BgColor.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/BoolToCSS.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/Border.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/EnumToCSS.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/ImgRequired.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/ImgSpace.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/Input.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/Lang.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/Length.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/Name.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/NameSync.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/Nofollow.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/SafeEmbed.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/SafeObject.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/SafeParam.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/ScriptRequired.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/TargetBlank.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/TargetNoopener.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/TargetNoreferrer.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/Textarea.php';
+require_once $__dir . '/HTMLPurifier/ChildDef/Chameleon.php';
+require_once $__dir . '/HTMLPurifier/ChildDef/Custom.php';
+require_once $__dir . '/HTMLPurifier/ChildDef/Empty.php';
+require_once $__dir . '/HTMLPurifier/ChildDef/List.php';
+require_once $__dir . '/HTMLPurifier/ChildDef/Required.php';
+require_once $__dir . '/HTMLPurifier/ChildDef/Optional.php';
+require_once $__dir . '/HTMLPurifier/ChildDef/StrictBlockquote.php';
+require_once $__dir . '/HTMLPurifier/ChildDef/Table.php';
+require_once $__dir . '/HTMLPurifier/DefinitionCache/Decorator.php';
+require_once $__dir . '/HTMLPurifier/DefinitionCache/Null.php';
+require_once $__dir . '/HTMLPurifier/DefinitionCache/Serializer.php';
+require_once $__dir . '/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php';
+require_once $__dir . '/HTMLPurifier/DefinitionCache/Decorator/Memory.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Bdo.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/CommonAttributes.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Edit.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Forms.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Hypertext.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Iframe.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Image.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Legacy.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/List.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Name.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Nofollow.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Object.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Presentation.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Proprietary.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Ruby.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/SafeEmbed.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/SafeObject.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/SafeScripting.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Scripting.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/StyleAttribute.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Tables.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Target.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/TargetBlank.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/TargetNoopener.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/TargetNoreferrer.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Text.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Tidy.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/XMLCommonAttributes.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Tidy/Name.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Tidy/Proprietary.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Tidy/XHTMLAndHTML4.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Tidy/Strict.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Tidy/Transitional.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Tidy/XHTML.php';
+require_once $__dir . '/HTMLPurifier/Injector/AutoParagraph.php';
+require_once $__dir . '/HTMLPurifier/Injector/DisplayLinkURI.php';
+require_once $__dir . '/HTMLPurifier/Injector/Linkify.php';
+require_once $__dir . '/HTMLPurifier/Injector/PurifierLinkify.php';
+require_once $__dir . '/HTMLPurifier/Injector/RemoveEmpty.php';
+require_once $__dir . '/HTMLPurifier/Injector/RemoveSpansWithoutAttributes.php';
+require_once $__dir . '/HTMLPurifier/Injector/SafeObject.php';
+require_once $__dir . '/HTMLPurifier/Lexer/DOMLex.php';
+require_once $__dir . '/HTMLPurifier/Lexer/DirectLex.php';
+require_once $__dir . '/HTMLPurifier/Node/Comment.php';
+require_once $__dir . '/HTMLPurifier/Node/Element.php';
+require_once $__dir . '/HTMLPurifier/Node/Text.php';
+require_once $__dir . '/HTMLPurifier/Strategy/Composite.php';
+require_once $__dir . '/HTMLPurifier/Strategy/Core.php';
+require_once $__dir . '/HTMLPurifier/Strategy/FixNesting.php';
+require_once $__dir . '/HTMLPurifier/Strategy/MakeWellFormed.php';
+require_once $__dir . '/HTMLPurifier/Strategy/RemoveForeignElements.php';
+require_once $__dir . '/HTMLPurifier/Strategy/ValidateAttributes.php';
+require_once $__dir . '/HTMLPurifier/TagTransform/Font.php';
+require_once $__dir . '/HTMLPurifier/TagTransform/Simple.php';
+require_once $__dir . '/HTMLPurifier/Token/Comment.php';
+require_once $__dir . '/HTMLPurifier/Token/Tag.php';
+require_once $__dir . '/HTMLPurifier/Token/Empty.php';
+require_once $__dir . '/HTMLPurifier/Token/End.php';
+require_once $__dir . '/HTMLPurifier/Token/Start.php';
+require_once $__dir . '/HTMLPurifier/Token/Text.php';
+require_once $__dir . '/HTMLPurifier/URIFilter/DisableExternal.php';
+require_once $__dir . '/HTMLPurifier/URIFilter/DisableExternalResources.php';
+require_once $__dir . '/HTMLPurifier/URIFilter/DisableResources.php';
+require_once $__dir . '/HTMLPurifier/URIFilter/HostBlacklist.php';
+require_once $__dir . '/HTMLPurifier/URIFilter/MakeAbsolute.php';
+require_once $__dir . '/HTMLPurifier/URIFilter/Munge.php';
+require_once $__dir . '/HTMLPurifier/URIFilter/SafeIframe.php';
+require_once $__dir . '/HTMLPurifier/URIScheme/data.php';
+require_once $__dir . '/HTMLPurifier/URIScheme/file.php';
+require_once $__dir . '/HTMLPurifier/URIScheme/ftp.php';
+require_once $__dir . '/HTMLPurifier/URIScheme/http.php';
+require_once $__dir . '/HTMLPurifier/URIScheme/https.php';
+require_once $__dir . '/HTMLPurifier/URIScheme/mailto.php';
+require_once $__dir . '/HTMLPurifier/URIScheme/news.php';
+require_once $__dir . '/HTMLPurifier/URIScheme/nntp.php';
+require_once $__dir . '/HTMLPurifier/URIScheme/tel.php';
+require_once $__dir . '/HTMLPurifier/VarParser/Flexible.php';
+require_once $__dir . '/HTMLPurifier/VarParser/Native.php';
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Arborize.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Arborize.php
new file mode 100644
index 000000000..d2e9d22a2
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Arborize.php
@@ -0,0 +1,71 @@
+<?php
+
+/**
+ * Converts a stream of HTMLPurifier_Token into an HTMLPurifier_Node,
+ * and back again.
+ *
+ * @note This transformation is not an equivalence. We mutate the input
+ * token stream to make it so; see all [MUT] markers in code.
+ */
+class HTMLPurifier_Arborize
+{
+ public static function arborize($tokens, $config, $context) {
+ $definition = $config->getHTMLDefinition();
+ $parent = new HTMLPurifier_Token_Start($definition->info_parent);
+ $stack = array($parent->toNode());
+ foreach ($tokens as $token) {
+ $token->skip = null; // [MUT]
+ $token->carryover = null; // [MUT]
+ if ($token instanceof HTMLPurifier_Token_End) {
+ $token->start = null; // [MUT]
+ $r = array_pop($stack);
+ //assert($r->name === $token->name);
+ //assert(empty($token->attr));
+ $r->endCol = $token->col;
+ $r->endLine = $token->line;
+ $r->endArmor = $token->armor;
+ continue;
+ }
+ $node = $token->toNode();
+ $stack[count($stack)-1]->children[] = $node;
+ if ($token instanceof HTMLPurifier_Token_Start) {
+ $stack[] = $node;
+ }
+ }
+ //assert(count($stack) == 1);
+ return $stack[0];
+ }
+
+ public static function flatten($node, $config, $context) {
+ $level = 0;
+ $nodes = array($level => new HTMLPurifier_Queue(array($node)));
+ $closingTokens = array();
+ $tokens = array();
+ do {
+ while (!$nodes[$level]->isEmpty()) {
+ $node = $nodes[$level]->shift(); // FIFO
+ list($start, $end) = $node->toTokenPair();
+ if ($level > 0) {
+ $tokens[] = $start;
+ }
+ if ($end !== NULL) {
+ $closingTokens[$level][] = $end;
+ }
+ if ($node instanceof HTMLPurifier_Node_Element) {
+ $level++;
+ $nodes[$level] = new HTMLPurifier_Queue();
+ foreach ($node->children as $childNode) {
+ $nodes[$level]->push($childNode);
+ }
+ }
+ }
+ $level--;
+ if ($level && isset($closingTokens[$level])) {
+ while ($token = array_pop($closingTokens[$level])) {
+ $tokens[] = $token;
+ }
+ }
+ } while ($level > 0);
+ return $tokens;
+ }
+}
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrCollections.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrCollections.php
new file mode 100644
index 000000000..c7b17cf14
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrCollections.php
@@ -0,0 +1,148 @@
+<?php
+
+/**
+ * Defines common attribute collections that modules reference
+ */
+
+class HTMLPurifier_AttrCollections
+{
+
+ /**
+ * Associative array of attribute collections, indexed by name.
+ * @type array
+ */
+ public $info = array();
+
+ /**
+ * Performs all expansions on internal data for use by other inclusions
+ * It also collects all attribute collection extensions from
+ * modules
+ * @param HTMLPurifier_AttrTypes $attr_types HTMLPurifier_AttrTypes instance
+ * @param HTMLPurifier_HTMLModule[] $modules Hash array of HTMLPurifier_HTMLModule members
+ */
+ public function __construct($attr_types, $modules)
+ {
+ $this->doConstruct($attr_types, $modules);
+ }
+
+ public function doConstruct($attr_types, $modules)
+ {
+ // load extensions from the modules
+ foreach ($modules as $module) {
+ foreach ($module->attr_collections as $coll_i => $coll) {
+ if (!isset($this->info[$coll_i])) {
+ $this->info[$coll_i] = array();
+ }
+ foreach ($coll as $attr_i => $attr) {
+ if ($attr_i === 0 && isset($this->info[$coll_i][$attr_i])) {
+ // merge in includes
+ $this->info[$coll_i][$attr_i] = array_merge(
+ $this->info[$coll_i][$attr_i],
+ $attr
+ );
+ continue;
+ }
+ $this->info[$coll_i][$attr_i] = $attr;
+ }
+ }
+ }
+ // perform internal expansions and inclusions
+ foreach ($this->info as $name => $attr) {
+ // merge attribute collections that include others
+ $this->performInclusions($this->info[$name]);
+ // replace string identifiers with actual attribute objects
+ $this->expandIdentifiers($this->info[$name], $attr_types);
+ }
+ }
+
+ /**
+ * Takes a reference to an attribute associative array and performs
+ * all inclusions specified by the zero index.
+ * @param array &$attr Reference to attribute array
+ */
+ public function performInclusions(&$attr)
+ {
+ if (!isset($attr[0])) {
+ return;
+ }
+ $merge = $attr[0];
+ $seen = array(); // recursion guard
+ // loop through all the inclusions
+ for ($i = 0; isset($merge[$i]); $i++) {
+ if (isset($seen[$merge[$i]])) {
+ continue;
+ }
+ $seen[$merge[$i]] = true;
+ // foreach attribute of the inclusion, copy it over
+ if (!isset($this->info[$merge[$i]])) {
+ continue;
+ }
+ foreach ($this->info[$merge[$i]] as $key => $value) {
+ if (isset($attr[$key])) {
+ continue;
+ } // also catches more inclusions
+ $attr[$key] = $value;
+ }
+ if (isset($this->info[$merge[$i]][0])) {
+ // recursion
+ $merge = array_merge($merge, $this->info[$merge[$i]][0]);
+ }
+ }
+ unset($attr[0]);
+ }
+
+ /**
+ * Expands all string identifiers in an attribute array by replacing
+ * them with the appropriate values inside HTMLPurifier_AttrTypes
+ * @param array &$attr Reference to attribute array
+ * @param HTMLPurifier_AttrTypes $attr_types HTMLPurifier_AttrTypes instance
+ */
+ public function expandIdentifiers(&$attr, $attr_types)
+ {
+ // because foreach will process new elements we add, make sure we
+ // skip duplicates
+ $processed = array();
+
+ foreach ($attr as $def_i => $def) {
+ // skip inclusions
+ if ($def_i === 0) {
+ continue;
+ }
+
+ if (isset($processed[$def_i])) {
+ continue;
+ }
+
+ // determine whether or not attribute is required
+ if ($required = (strpos($def_i, '*') !== false)) {
+ // rename the definition
+ unset($attr[$def_i]);
+ $def_i = trim($def_i, '*');
+ $attr[$def_i] = $def;
+ }
+
+ $processed[$def_i] = true;
+
+ // if we've already got a literal object, move on
+ if (is_object($def)) {
+ // preserve previous required
+ $attr[$def_i]->required = ($required || $attr[$def_i]->required);
+ continue;
+ }
+
+ if ($def === false) {
+ unset($attr[$def_i]);
+ continue;
+ }
+
+ if ($t = $attr_types->get($def)) {
+ $attr[$def_i] = $t;
+ $attr[$def_i]->required = $required;
+ } else {
+ unset($attr[$def_i]);
+ }
+ }
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef.php
new file mode 100644
index 000000000..739646fa7
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef.php
@@ -0,0 +1,144 @@
+<?php
+
+/**
+ * Base class for all validating attribute definitions.
+ *
+ * This family of classes forms the core for not only HTML attribute validation,
+ * but also any sort of string that needs to be validated or cleaned (which
+ * means CSS properties and composite definitions are defined here too).
+ * Besides defining (through code) what precisely makes the string valid,
+ * subclasses are also responsible for cleaning the code if possible.
+ */
+
+abstract class HTMLPurifier_AttrDef
+{
+
+ /**
+ * Tells us whether or not an HTML attribute is minimized.
+ * Has no meaning in other contexts.
+ * @type bool
+ */
+ public $minimized = false;
+
+ /**
+ * Tells us whether or not an HTML attribute is required.
+ * Has no meaning in other contexts
+ * @type bool
+ */
+ public $required = false;
+
+ /**
+ * Validates and cleans passed string according to a definition.
+ *
+ * @param string $string String to be validated and cleaned.
+ * @param HTMLPurifier_Config $config Mandatory HTMLPurifier_Config object.
+ * @param HTMLPurifier_Context $context Mandatory HTMLPurifier_Context object.
+ */
+ abstract public function validate($string, $config, $context);
+
+ /**
+ * Convenience method that parses a string as if it were CDATA.
+ *
+ * This method process a string in the manner specified at
+ * <http://www.w3.org/TR/html4/types.html#h-6.2> by removing
+ * leading and trailing whitespace, ignoring line feeds, and replacing
+ * carriage returns and tabs with spaces. While most useful for HTML
+ * attributes specified as CDATA, it can also be applied to most CSS
+ * values.
+ *
+ * @note This method is not entirely standards compliant, as trim() removes
+ * more types of whitespace than specified in the spec. In practice,
+ * this is rarely a problem, as those extra characters usually have
+ * already been removed by HTMLPurifier_Encoder.
+ *
+ * @warning This processing is inconsistent with XML's whitespace handling
+ * as specified by section 3.3.3 and referenced XHTML 1.0 section
+ * 4.7. However, note that we are NOT necessarily
+ * parsing XML, thus, this behavior may still be correct. We
+ * assume that newlines have been normalized.
+ */
+ public function parseCDATA($string)
+ {
+ $string = trim($string);
+ $string = str_replace(array("\n", "\t", "\r"), ' ', $string);
+ return $string;
+ }
+
+ /**
+ * Factory method for creating this class from a string.
+ * @param string $string String construction info
+ * @return HTMLPurifier_AttrDef Created AttrDef object corresponding to $string
+ */
+ public function make($string)
+ {
+ // default implementation, return a flyweight of this object.
+ // If $string has an effect on the returned object (i.e. you
+ // need to overload this method), it is best
+ // to clone or instantiate new copies. (Instantiation is safer.)
+ return $this;
+ }
+
+ /**
+ * Removes spaces from rgb(0, 0, 0) so that shorthand CSS properties work
+ * properly. THIS IS A HACK!
+ * @param string $string a CSS colour definition
+ * @return string
+ */
+ protected function mungeRgb($string)
+ {
+ $p = '\s*(\d+(\.\d+)?([%]?))\s*';
+
+ if (preg_match('/(rgba|hsla)\(/', $string)) {
+ return preg_replace('/(rgba|hsla)\('.$p.','.$p.','.$p.','.$p.'\)/', '\1(\2,\5,\8,\11)', $string);
+ }
+
+ return preg_replace('/(rgb|hsl)\('.$p.','.$p.','.$p.'\)/', '\1(\2,\5,\8)', $string);
+ }
+
+ /**
+ * Parses a possibly escaped CSS string and returns the "pure"
+ * version of it.
+ */
+ protected function expandCSSEscape($string)
+ {
+ // flexibly parse it
+ $ret = '';
+ for ($i = 0, $c = strlen($string); $i < $c; $i++) {
+ if ($string[$i] === '\\') {
+ $i++;
+ if ($i >= $c) {
+ $ret .= '\\';
+ break;
+ }
+ if (ctype_xdigit($string[$i])) {
+ $code = $string[$i];
+ for ($a = 1, $i++; $i < $c && $a < 6; $i++, $a++) {
+ if (!ctype_xdigit($string[$i])) {
+ break;
+ }
+ $code .= $string[$i];
+ }
+ // We have to be extremely careful when adding
+ // new characters, to make sure we're not breaking
+ // the encoding.
+ $char = HTMLPurifier_Encoder::unichr(hexdec($code));
+ if (HTMLPurifier_Encoder::cleanUTF8($char) === '') {
+ continue;
+ }
+ $ret .= $char;
+ if ($i < $c && trim($string[$i]) !== '') {
+ $i--;
+ }
+ continue;
+ }
+ if ($string[$i] === "\n") {
+ continue;
+ }
+ }
+ $ret .= $string[$i];
+ }
+ return $ret;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS.php
new file mode 100644
index 000000000..ad2cb90ad
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS.php
@@ -0,0 +1,136 @@
+<?php
+
+/**
+ * Validates the HTML attribute style, otherwise known as CSS.
+ * @note We don't implement the whole CSS specification, so it might be
+ * difficult to reuse this component in the context of validating
+ * actual stylesheet declarations.
+ * @note If we were really serious about validating the CSS, we would
+ * tokenize the styles and then parse the tokens. Obviously, we
+ * are not doing that. Doing that could seriously harm performance,
+ * but would make these components a lot more viable for a CSS
+ * filtering solution.
+ */
+class HTMLPurifier_AttrDef_CSS extends HTMLPurifier_AttrDef
+{
+
+ /**
+ * @param string $css
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool|string
+ */
+ public function validate($css, $config, $context)
+ {
+ $css = $this->parseCDATA($css);
+
+ $definition = $config->getCSSDefinition();
+ $allow_duplicates = $config->get("CSS.AllowDuplicates");
+
+
+ // According to the CSS2.1 spec, the places where a
+ // non-delimiting semicolon can appear are in strings
+ // escape sequences. So here is some dumb hack to
+ // handle quotes.
+ $len = strlen($css);
+ $accum = "";
+ $declarations = array();
+ $quoted = false;
+ for ($i = 0; $i < $len; $i++) {
+ $c = strcspn($css, ";'\"", $i);
+ $accum .= substr($css, $i, $c);
+ $i += $c;
+ if ($i == $len) break;
+ $d = $css[$i];
+ if ($quoted) {
+ $accum .= $d;
+ if ($d == $quoted) {
+ $quoted = false;
+ }
+ } else {
+ if ($d == ";") {
+ $declarations[] = $accum;
+ $accum = "";
+ } else {
+ $accum .= $d;
+ $quoted = $d;
+ }
+ }
+ }
+ if ($accum != "") $declarations[] = $accum;
+
+ $propvalues = array();
+ $new_declarations = '';
+
+ /**
+ * Name of the current CSS property being validated.
+ */
+ $property = false;
+ $context->register('CurrentCSSProperty', $property);
+
+ foreach ($declarations as $declaration) {
+ if (!$declaration) {
+ continue;
+ }
+ if (!strpos($declaration, ':')) {
+ continue;
+ }
+ list($property, $value) = explode(':', $declaration, 2);
+ $property = trim($property);
+ $value = trim($value);
+ $ok = false;
+ do {
+ if (isset($definition->info[$property])) {
+ $ok = true;
+ break;
+ }
+ if (ctype_lower($property)) {
+ break;
+ }
+ $property = strtolower($property);
+ if (isset($definition->info[$property])) {
+ $ok = true;
+ break;
+ }
+ } while (0);
+ if (!$ok) {
+ continue;
+ }
+ // inefficient call, since the validator will do this again
+ if (strtolower(trim($value)) !== 'inherit') {
+ // inherit works for everything (but only on the base property)
+ $result = $definition->info[$property]->validate(
+ $value,
+ $config,
+ $context
+ );
+ } else {
+ $result = 'inherit';
+ }
+ if ($result === false) {
+ continue;
+ }
+ if ($allow_duplicates) {
+ $new_declarations .= "$property:$result;";
+ } else {
+ $propvalues[$property] = $result;
+ }
+ }
+
+ $context->destroy('CurrentCSSProperty');
+
+ // procedure does not write the new CSS simultaneously, so it's
+ // slightly inefficient, but it's the only way of getting rid of
+ // duplicates. Perhaps config to optimize it, but not now.
+
+ foreach ($propvalues as $prop => $value) {
+ $new_declarations .= "$prop:$value;";
+ }
+
+ return $new_declarations ? $new_declarations : false;
+
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/AttrDef/CSS/AlphaValue.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/AlphaValue.php
index af2b83dff..af2b83dff 100644
--- a/library/HTMLPurifier/AttrDef/CSS/AlphaValue.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/AlphaValue.php
diff --git a/library/HTMLPurifier/AttrDef/CSS/Background.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Background.php
index 7f1ea3b0f..7f1ea3b0f 100644
--- a/library/HTMLPurifier/AttrDef/CSS/Background.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Background.php
diff --git a/library/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php
index 4580ef5a9..4580ef5a9 100644
--- a/library/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php
diff --git a/library/HTMLPurifier/AttrDef/CSS/Border.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Border.php
index 16243ba1e..16243ba1e 100644
--- a/library/HTMLPurifier/AttrDef/CSS/Border.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Border.php
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Color.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Color.php
new file mode 100644
index 000000000..d7287a00c
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Color.php
@@ -0,0 +1,161 @@
+<?php
+
+/**
+ * Validates Color as defined by CSS.
+ */
+class HTMLPurifier_AttrDef_CSS_Color extends HTMLPurifier_AttrDef
+{
+
+ /**
+ * @type HTMLPurifier_AttrDef_CSS_AlphaValue
+ */
+ protected $alpha;
+
+ public function __construct()
+ {
+ $this->alpha = new HTMLPurifier_AttrDef_CSS_AlphaValue();
+ }
+
+ /**
+ * @param string $color
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool|string
+ */
+ public function validate($color, $config, $context)
+ {
+ static $colors = null;
+ if ($colors === null) {
+ $colors = $config->get('Core.ColorKeywords');
+ }
+
+ $color = trim($color);
+ if ($color === '') {
+ return false;
+ }
+
+ $lower = strtolower($color);
+ if (isset($colors[$lower])) {
+ return $colors[$lower];
+ }
+
+ if (preg_match('#(rgb|rgba|hsl|hsla)\(#', $color, $matches) === 1) {
+ $length = strlen($color);
+ if (strpos($color, ')') !== $length - 1) {
+ return false;
+ }
+
+ // get used function : rgb, rgba, hsl or hsla
+ $function = $matches[1];
+
+ $parameters_size = 3;
+ $alpha_channel = false;
+ if (substr($function, -1) === 'a') {
+ $parameters_size = 4;
+ $alpha_channel = true;
+ }
+
+ /*
+ * Allowed types for values :
+ * parameter_position => [type => max_value]
+ */
+ $allowed_types = array(
+ 1 => array('percentage' => 100, 'integer' => 255),
+ 2 => array('percentage' => 100, 'integer' => 255),
+ 3 => array('percentage' => 100, 'integer' => 255),
+ );
+ $allow_different_types = false;
+
+ if (strpos($function, 'hsl') !== false) {
+ $allowed_types = array(
+ 1 => array('integer' => 360),
+ 2 => array('percentage' => 100),
+ 3 => array('percentage' => 100),
+ );
+ $allow_different_types = true;
+ }
+
+ $values = trim(str_replace($function, '', $color), ' ()');
+
+ $parts = explode(',', $values);
+ if (count($parts) !== $parameters_size) {
+ return false;
+ }
+
+ $type = false;
+ $new_parts = array();
+ $i = 0;
+
+ foreach ($parts as $part) {
+ $i++;
+ $part = trim($part);
+
+ if ($part === '') {
+ return false;
+ }
+
+ // different check for alpha channel
+ if ($alpha_channel === true && $i === count($parts)) {
+ $result = $this->alpha->validate($part, $config, $context);
+
+ if ($result === false) {
+ return false;
+ }
+
+ $new_parts[] = (string)$result;
+ continue;
+ }
+
+ if (substr($part, -1) === '%') {
+ $current_type = 'percentage';
+ } else {
+ $current_type = 'integer';
+ }
+
+ if (!array_key_exists($current_type, $allowed_types[$i])) {
+ return false;
+ }
+
+ if (!$type) {
+ $type = $current_type;
+ }
+
+ if ($allow_different_types === false && $type != $current_type) {
+ return false;
+ }
+
+ $max_value = $allowed_types[$i][$current_type];
+
+ if ($current_type == 'integer') {
+ // Return value between range 0 -> $max_value
+ $new_parts[] = (int)max(min($part, $max_value), 0);
+ } elseif ($current_type == 'percentage') {
+ $new_parts[] = (float)max(min(rtrim($part, '%'), $max_value), 0) . '%';
+ }
+ }
+
+ $new_values = implode(',', $new_parts);
+
+ $color = $function . '(' . $new_values . ')';
+ } else {
+ // hexadecimal handling
+ if ($color[0] === '#') {
+ $hex = substr($color, 1);
+ } else {
+ $hex = $color;
+ $color = '#' . $color;
+ }
+ $length = strlen($hex);
+ if ($length !== 3 && $length !== 6) {
+ return false;
+ }
+ if (!ctype_xdigit($hex)) {
+ return false;
+ }
+ }
+ return $color;
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/AttrDef/CSS/Composite.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Composite.php
index 9c1750554..9c1750554 100644
--- a/library/HTMLPurifier/AttrDef/CSS/Composite.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Composite.php
diff --git a/library/HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php
index 9d77cc9aa..9d77cc9aa 100644
--- a/library/HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php
diff --git a/library/HTMLPurifier/AttrDef/CSS/Filter.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Filter.php
index bde4c3301..bde4c3301 100644
--- a/library/HTMLPurifier/AttrDef/CSS/Filter.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Filter.php
diff --git a/library/HTMLPurifier/AttrDef/CSS/Font.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Font.php
index 579b97ef1..579b97ef1 100644
--- a/library/HTMLPurifier/AttrDef/CSS/Font.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Font.php
diff --git a/library/HTMLPurifier/AttrDef/CSS/FontFamily.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/FontFamily.php
index 74e24c881..74e24c881 100644
--- a/library/HTMLPurifier/AttrDef/CSS/FontFamily.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/FontFamily.php
diff --git a/library/HTMLPurifier/AttrDef/CSS/Ident.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Ident.php
index 973002c17..973002c17 100644
--- a/library/HTMLPurifier/AttrDef/CSS/Ident.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Ident.php
diff --git a/library/HTMLPurifier/AttrDef/CSS/ImportantDecorator.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/ImportantDecorator.php
index ffc989fe8..ffc989fe8 100644
--- a/library/HTMLPurifier/AttrDef/CSS/ImportantDecorator.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/ImportantDecorator.php
diff --git a/library/HTMLPurifier/AttrDef/CSS/Length.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Length.php
index f12453a04..f12453a04 100644
--- a/library/HTMLPurifier/AttrDef/CSS/Length.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Length.php
diff --git a/library/HTMLPurifier/AttrDef/CSS/ListStyle.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/ListStyle.php
index e74d42654..e74d42654 100644
--- a/library/HTMLPurifier/AttrDef/CSS/ListStyle.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/ListStyle.php
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Multiple.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Multiple.php
new file mode 100644
index 000000000..e707f871c
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Multiple.php
@@ -0,0 +1,71 @@
+<?php
+
+/**
+ * Framework class for strings that involve multiple values.
+ *
+ * Certain CSS properties such as border-width and margin allow multiple
+ * lengths to be specified. This class can take a vanilla border-width
+ * definition and multiply it, usually into a max of four.
+ *
+ * @note Even though the CSS specification isn't clear about it, inherit
+ * can only be used alone: it will never manifest as part of a multi
+ * shorthand declaration. Thus, this class does not allow inherit.
+ */
+class HTMLPurifier_AttrDef_CSS_Multiple extends HTMLPurifier_AttrDef
+{
+ /**
+ * Instance of component definition to defer validation to.
+ * @type HTMLPurifier_AttrDef
+ * @todo Make protected
+ */
+ public $single;
+
+ /**
+ * Max number of values allowed.
+ * @todo Make protected
+ */
+ public $max;
+
+ /**
+ * @param HTMLPurifier_AttrDef $single HTMLPurifier_AttrDef to multiply
+ * @param int $max Max number of values allowed (usually four)
+ */
+ public function __construct($single, $max = 4)
+ {
+ $this->single = $single;
+ $this->max = $max;
+ }
+
+ /**
+ * @param string $string
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool|string
+ */
+ public function validate($string, $config, $context)
+ {
+ $string = $this->mungeRgb($this->parseCDATA($string));
+ if ($string === '') {
+ return false;
+ }
+ $parts = explode(' ', $string); // parseCDATA replaced \r, \t and \n
+ $length = count($parts);
+ $final = '';
+ for ($i = 0, $num = 0; $i < $length && $num < $this->max; $i++) {
+ if (ctype_space($parts[$i])) {
+ continue;
+ }
+ $result = $this->single->validate($parts[$i], $config, $context);
+ if ($result !== false) {
+ $final .= $result . ' ';
+ $num++;
+ }
+ }
+ if ($final === '') {
+ return false;
+ }
+ return rtrim($final);
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/AttrDef/CSS/Number.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Number.php
index 8edc159e7..8edc159e7 100644
--- a/library/HTMLPurifier/AttrDef/CSS/Number.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Number.php
diff --git a/library/HTMLPurifier/AttrDef/CSS/Percentage.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Percentage.php
index f0f25c50a..f0f25c50a 100644
--- a/library/HTMLPurifier/AttrDef/CSS/Percentage.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Percentage.php
diff --git a/library/HTMLPurifier/AttrDef/CSS/TextDecoration.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/TextDecoration.php
index 5fd4b7f7b..5fd4b7f7b 100644
--- a/library/HTMLPurifier/AttrDef/CSS/TextDecoration.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/TextDecoration.php
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/URI.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/URI.php
new file mode 100644
index 000000000..6617acace
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/URI.php
@@ -0,0 +1,77 @@
+<?php
+
+/**
+ * Validates a URI in CSS syntax, which uses url('http://example.com')
+ * @note While theoretically speaking a URI in a CSS document could
+ * be non-embedded, as of CSS2 there is no such usage so we're
+ * generalizing it. This may need to be changed in the future.
+ * @warning Since HTMLPurifier_AttrDef_CSS blindly uses semicolons as
+ * the separator, you cannot put a literal semicolon in
+ * in the URI. Try percent encoding it, in that case.
+ */
+class HTMLPurifier_AttrDef_CSS_URI extends HTMLPurifier_AttrDef_URI
+{
+
+ public function __construct()
+ {
+ parent::__construct(true); // always embedded
+ }
+
+ /**
+ * @param string $uri_string
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool|string
+ */
+ public function validate($uri_string, $config, $context)
+ {
+ // parse the URI out of the string and then pass it onto
+ // the parent object
+
+ $uri_string = $this->parseCDATA($uri_string);
+ if (strpos($uri_string, 'url(') !== 0) {
+ return false;
+ }
+ $uri_string = substr($uri_string, 4);
+ if (strlen($uri_string) == 0) {
+ return false;
+ }
+ $new_length = strlen($uri_string) - 1;
+ if ($uri_string[$new_length] != ')') {
+ return false;
+ }
+ $uri = trim(substr($uri_string, 0, $new_length));
+
+ if (!empty($uri) && ($uri[0] == "'" || $uri[0] == '"')) {
+ $quote = $uri[0];
+ $new_length = strlen($uri) - 1;
+ if ($uri[$new_length] !== $quote) {
+ return false;
+ }
+ $uri = substr($uri, 1, $new_length - 1);
+ }
+
+ $uri = $this->expandCSSEscape($uri);
+
+ $result = parent::validate($uri, $config, $context);
+
+ if ($result === false) {
+ return false;
+ }
+
+ // extra sanity check; should have been done by URI
+ $result = str_replace(array('"', "\\", "\n", "\x0c", "\r"), "", $result);
+
+ // suspicious characters are ()'; we're going to percent encode
+ // them for safety.
+ $result = str_replace(array('(', ')', "'"), array('%28', '%29', '%27'), $result);
+
+ // there's an extra bug where ampersands lose their escaping on
+ // an innerHTML cycle, so a very unlucky query parameter could
+ // then change the meaning of the URL. Unfortunately, there's
+ // not much we can do about that...
+ return "url(\"$result\")";
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/AttrDef/Clone.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Clone.php
index 6698a00c0..6698a00c0 100644
--- a/library/HTMLPurifier/AttrDef/Clone.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Clone.php
diff --git a/library/HTMLPurifier/AttrDef/Enum.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Enum.php
index 8abda7f6e..8abda7f6e 100644
--- a/library/HTMLPurifier/AttrDef/Enum.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Enum.php
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Bool.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Bool.php
new file mode 100644
index 000000000..dea15d2cd
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Bool.php
@@ -0,0 +1,48 @@
+<?php
+
+/**
+ * Validates a boolean attribute
+ */
+class HTMLPurifier_AttrDef_HTML_Bool extends HTMLPurifier_AttrDef
+{
+
+ /**
+ * @type bool
+ */
+ protected $name;
+
+ /**
+ * @type bool
+ */
+ public $minimized = true;
+
+ /**
+ * @param bool $name
+ */
+ public function __construct($name = false)
+ {
+ $this->name = $name;
+ }
+
+ /**
+ * @param string $string
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool|string
+ */
+ public function validate($string, $config, $context)
+ {
+ return $this->name;
+ }
+
+ /**
+ * @param string $string Name of attribute
+ * @return HTMLPurifier_AttrDef_HTML_Bool
+ */
+ public function make($string)
+ {
+ return new HTMLPurifier_AttrDef_HTML_Bool($string);
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/AttrDef/HTML/Class.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Class.php
index d5013488f..d5013488f 100644
--- a/library/HTMLPurifier/AttrDef/HTML/Class.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Class.php
diff --git a/library/HTMLPurifier/AttrDef/HTML/Color.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Color.php
index 946ebb782..946ebb782 100644
--- a/library/HTMLPurifier/AttrDef/HTML/Color.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Color.php
diff --git a/library/HTMLPurifier/AttrDef/HTML/FrameTarget.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/FrameTarget.php
index d79ba12b3..d79ba12b3 100644
--- a/library/HTMLPurifier/AttrDef/HTML/FrameTarget.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/FrameTarget.php
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/ID.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/ID.php
new file mode 100644
index 000000000..4ba45610f
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/ID.php
@@ -0,0 +1,113 @@
+<?php
+
+/**
+ * Validates the HTML attribute ID.
+ * @warning Even though this is the id processor, it
+ * will ignore the directive Attr:IDBlacklist, since it will only
+ * go according to the ID accumulator. Since the accumulator is
+ * automatically generated, it will have already absorbed the
+ * blacklist. If you're hacking around, make sure you use load()!
+ */
+
+class HTMLPurifier_AttrDef_HTML_ID extends HTMLPurifier_AttrDef
+{
+
+ // selector is NOT a valid thing to use for IDREFs, because IDREFs
+ // *must* target IDs that exist, whereas selector #ids do not.
+
+ /**
+ * Determines whether or not we're validating an ID in a CSS
+ * selector context.
+ * @type bool
+ */
+ protected $selector;
+
+ /**
+ * @param bool $selector
+ */
+ public function __construct($selector = false)
+ {
+ $this->selector = $selector;
+ }
+
+ /**
+ * @param string $id
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool|string
+ */
+ public function validate($id, $config, $context)
+ {
+ if (!$this->selector && !$config->get('Attr.EnableID')) {
+ return false;
+ }
+
+ $id = trim($id); // trim it first
+
+ if ($id === '') {
+ return false;
+ }
+
+ $prefix = $config->get('Attr.IDPrefix');
+ if ($prefix !== '') {
+ $prefix .= $config->get('Attr.IDPrefixLocal');
+ // prevent re-appending the prefix
+ if (strpos($id, $prefix) !== 0) {
+ $id = $prefix . $id;
+ }
+ } elseif ($config->get('Attr.IDPrefixLocal') !== '') {
+ trigger_error(
+ '%Attr.IDPrefixLocal cannot be used unless ' .
+ '%Attr.IDPrefix is set',
+ E_USER_WARNING
+ );
+ }
+
+ if (!$this->selector) {
+ $id_accumulator =& $context->get('IDAccumulator');
+ if (isset($id_accumulator->ids[$id])) {
+ return false;
+ }
+ }
+
+ // we purposely avoid using regex, hopefully this is faster
+
+ if ($config->get('Attr.ID.HTML5') === true) {
+ if (preg_match('/[\t\n\x0b\x0c ]/', $id)) {
+ return false;
+ }
+ } else {
+ if (ctype_alpha($id)) {
+ // OK
+ } else {
+ if (!ctype_alpha(@$id[0])) {
+ return false;
+ }
+ // primitive style of regexps, I suppose
+ $trim = trim(
+ $id,
+ 'A..Za..z0..9:-._'
+ );
+ if ($trim !== '') {
+ return false;
+ }
+ }
+ }
+
+ $regexp = $config->get('Attr.IDBlacklistRegexp');
+ if ($regexp && preg_match($regexp, $id)) {
+ return false;
+ }
+
+ if (!$this->selector) {
+ $id_accumulator->add($id);
+ }
+
+ // if no change was made to the ID, return the result
+ // else, return the new id if stripping whitespace made it
+ // valid, or return false.
+ return $id;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/AttrDef/HTML/Length.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Length.php
index 1c4006fbb..1c4006fbb 100644
--- a/library/HTMLPurifier/AttrDef/HTML/Length.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Length.php
diff --git a/library/HTMLPurifier/AttrDef/HTML/LinkTypes.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/LinkTypes.php
index 63fa04c15..63fa04c15 100644
--- a/library/HTMLPurifier/AttrDef/HTML/LinkTypes.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/LinkTypes.php
diff --git a/library/HTMLPurifier/AttrDef/HTML/MultiLength.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/MultiLength.php
index bbb20f2f8..bbb20f2f8 100644
--- a/library/HTMLPurifier/AttrDef/HTML/MultiLength.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/MultiLength.php
diff --git a/library/HTMLPurifier/AttrDef/HTML/Nmtokens.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Nmtokens.php
index f79683b4f..f79683b4f 100644
--- a/library/HTMLPurifier/AttrDef/HTML/Nmtokens.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Nmtokens.php
diff --git a/library/HTMLPurifier/AttrDef/HTML/Pixels.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Pixels.php
index a1d019e09..a1d019e09 100644
--- a/library/HTMLPurifier/AttrDef/HTML/Pixels.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Pixels.php
diff --git a/library/HTMLPurifier/AttrDef/Integer.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Integer.php
index 400e707d2..400e707d2 100644
--- a/library/HTMLPurifier/AttrDef/Integer.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Integer.php
diff --git a/library/HTMLPurifier/AttrDef/Lang.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Lang.php
index 2a55cea64..2a55cea64 100644
--- a/library/HTMLPurifier/AttrDef/Lang.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Lang.php
diff --git a/library/HTMLPurifier/AttrDef/Switch.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Switch.php
index c7eb3199a..c7eb3199a 100644
--- a/library/HTMLPurifier/AttrDef/Switch.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Switch.php
diff --git a/library/HTMLPurifier/AttrDef/Text.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Text.php
index 4553a4ea9..4553a4ea9 100644
--- a/library/HTMLPurifier/AttrDef/Text.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Text.php
diff --git a/library/HTMLPurifier/AttrDef/URI.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI.php
index c1cd89772..c1cd89772 100644
--- a/library/HTMLPurifier/AttrDef/URI.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI.php
diff --git a/library/HTMLPurifier/AttrDef/URI/Email.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Email.php
index daf32b764..daf32b764 100644
--- a/library/HTMLPurifier/AttrDef/URI/Email.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Email.php
diff --git a/library/HTMLPurifier/AttrDef/URI/Email/SimpleCheck.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Email/SimpleCheck.php
index 52c0d5968..52c0d5968 100644
--- a/library/HTMLPurifier/AttrDef/URI/Email/SimpleCheck.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Email/SimpleCheck.php
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Host.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Host.php
new file mode 100644
index 000000000..3b4d18674
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Host.php
@@ -0,0 +1,138 @@
+<?php
+
+/**
+ * Validates a host according to the IPv4, IPv6 and DNS (future) specifications.
+ */
+class HTMLPurifier_AttrDef_URI_Host extends HTMLPurifier_AttrDef
+{
+
+ /**
+ * IPv4 sub-validator.
+ * @type HTMLPurifier_AttrDef_URI_IPv4
+ */
+ protected $ipv4;
+
+ /**
+ * IPv6 sub-validator.
+ * @type HTMLPurifier_AttrDef_URI_IPv6
+ */
+ protected $ipv6;
+
+ public function __construct()
+ {
+ $this->ipv4 = new HTMLPurifier_AttrDef_URI_IPv4();
+ $this->ipv6 = new HTMLPurifier_AttrDef_URI_IPv6();
+ }
+
+ /**
+ * @param string $string
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool|string
+ */
+ public function validate($string, $config, $context)
+ {
+ $length = strlen($string);
+ // empty hostname is OK; it's usually semantically equivalent:
+ // the default host as defined by a URI scheme is used:
+ //
+ // If the URI scheme defines a default for host, then that
+ // default applies when the host subcomponent is undefined
+ // or when the registered name is empty (zero length).
+ if ($string === '') {
+ return '';
+ }
+ if ($length > 1 && $string[0] === '[' && $string[$length - 1] === ']') {
+ //IPv6
+ $ip = substr($string, 1, $length - 2);
+ $valid = $this->ipv6->validate($ip, $config, $context);
+ if ($valid === false) {
+ return false;
+ }
+ return '[' . $valid . ']';
+ }
+
+ // need to do checks on unusual encodings too
+ $ipv4 = $this->ipv4->validate($string, $config, $context);
+ if ($ipv4 !== false) {
+ return $ipv4;
+ }
+
+ // A regular domain name.
+
+ // This doesn't match I18N domain names, but we don't have proper IRI support,
+ // so force users to insert Punycode.
+
+ // There is not a good sense in which underscores should be
+ // allowed, since it's technically not! (And if you go as
+ // far to allow everything as specified by the DNS spec...
+ // well, that's literally everything, modulo some space limits
+ // for the components and the overall name (which, by the way,
+ // we are NOT checking!). So we (arbitrarily) decide this:
+ // let's allow underscores wherever we would have allowed
+ // hyphens, if they are enabled. This is a pretty good match
+ // for browser behavior, for example, a large number of browsers
+ // cannot handle foo_.example.com, but foo_bar.example.com is
+ // fairly well supported.
+ $underscore = $config->get('Core.AllowHostnameUnderscore') ? '_' : '';
+
+ // Based off of RFC 1738, but amended so that
+ // as per RFC 3696, the top label need only not be all numeric.
+ // The productions describing this are:
+ $a = '[a-z]'; // alpha
+ $an = '[a-z0-9]'; // alphanum
+ $and = "[a-z0-9-$underscore]"; // alphanum | "-"
+ // domainlabel = alphanum | alphanum *( alphanum | "-" ) alphanum
+ $domainlabel = "$an(?:$and*$an)?";
+ // AMENDED as per RFC 3696
+ // toplabel = alphanum | alphanum *( alphanum | "-" ) alphanum
+ // side condition: not all numeric
+ $toplabel = "$an(?:$and*$an)?";
+ // hostname = *( domainlabel "." ) toplabel [ "." ]
+ if (preg_match("/^(?:$domainlabel\.)*($toplabel)\.?$/i", $string, $matches)) {
+ if (!ctype_digit($matches[1])) {
+ return $string;
+ }
+ }
+
+ // PHP 5.3 and later support this functionality natively
+ if (function_exists('idn_to_ascii')) {
+ $string = idn_to_ascii($string);
+
+ // If we have Net_IDNA2 support, we can support IRIs by
+ // punycoding them. (This is the most portable thing to do,
+ // since otherwise we have to assume browsers support
+ } elseif ($config->get('Core.EnableIDNA')) {
+ $idna = new Net_IDNA2(array('encoding' => 'utf8', 'overlong' => false, 'strict' => true));
+ // we need to encode each period separately
+ $parts = explode('.', $string);
+ try {
+ $new_parts = array();
+ foreach ($parts as $part) {
+ $encodable = false;
+ for ($i = 0, $c = strlen($part); $i < $c; $i++) {
+ if (ord($part[$i]) > 0x7a) {
+ $encodable = true;
+ break;
+ }
+ }
+ if (!$encodable) {
+ $new_parts[] = $part;
+ } else {
+ $new_parts[] = $idna->encode($part);
+ }
+ }
+ $string = implode('.', $new_parts);
+ } catch (Exception $e) {
+ // XXX error reporting
+ }
+ }
+ // Try again
+ if (preg_match("/^($domainlabel\.)*$toplabel\.?$/i", $string)) {
+ return $string;
+ }
+ return false;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/AttrDef/URI/IPv4.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/IPv4.php
index 30ac16c9e..30ac16c9e 100644
--- a/library/HTMLPurifier/AttrDef/URI/IPv4.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/IPv4.php
diff --git a/library/HTMLPurifier/AttrDef/URI/IPv6.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/IPv6.php
index f243793ee..f243793ee 100644
--- a/library/HTMLPurifier/AttrDef/URI/IPv6.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/IPv6.php
diff --git a/library/HTMLPurifier/AttrTransform.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform.php
index b428331f1..b428331f1 100644
--- a/library/HTMLPurifier/AttrTransform.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform.php
diff --git a/library/HTMLPurifier/AttrTransform/Background.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Background.php
index 2f72869a5..2f72869a5 100644
--- a/library/HTMLPurifier/AttrTransform/Background.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Background.php
diff --git a/library/HTMLPurifier/AttrTransform/BdoDir.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/BdoDir.php
index d66c04a5b..d66c04a5b 100644
--- a/library/HTMLPurifier/AttrTransform/BdoDir.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/BdoDir.php
diff --git a/library/HTMLPurifier/AttrTransform/BgColor.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/BgColor.php
index 0f51fd2ce..0f51fd2ce 100644
--- a/library/HTMLPurifier/AttrTransform/BgColor.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/BgColor.php
diff --git a/library/HTMLPurifier/AttrTransform/BoolToCSS.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/BoolToCSS.php
index f25cd0195..f25cd0195 100644
--- a/library/HTMLPurifier/AttrTransform/BoolToCSS.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/BoolToCSS.php
diff --git a/library/HTMLPurifier/AttrTransform/Border.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Border.php
index 057dc017f..057dc017f 100644
--- a/library/HTMLPurifier/AttrTransform/Border.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Border.php
diff --git a/library/HTMLPurifier/AttrTransform/EnumToCSS.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/EnumToCSS.php
index 7ccd0e3fb..7ccd0e3fb 100644
--- a/library/HTMLPurifier/AttrTransform/EnumToCSS.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/EnumToCSS.php
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ImgRequired.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ImgRequired.php
new file mode 100644
index 000000000..235ebb34b
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ImgRequired.php
@@ -0,0 +1,47 @@
+<?php
+
+// must be called POST validation
+
+/**
+ * Transform that supplies default values for the src and alt attributes
+ * in img tags, as well as prevents the img tag from being removed
+ * because of a missing alt tag. This needs to be registered as both
+ * a pre and post attribute transform.
+ */
+class HTMLPurifier_AttrTransform_ImgRequired extends HTMLPurifier_AttrTransform
+{
+
+ /**
+ * @param array $attr
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return array
+ */
+ public function transform($attr, $config, $context)
+ {
+ $src = true;
+ if (!isset($attr['src'])) {
+ if ($config->get('Core.RemoveInvalidImg')) {
+ return $attr;
+ }
+ $attr['src'] = $config->get('Attr.DefaultInvalidImage');
+ $src = false;
+ }
+
+ if (!isset($attr['alt'])) {
+ if ($src) {
+ $alt = $config->get('Attr.DefaultImageAlt');
+ if ($alt === null) {
+ $attr['alt'] = basename($attr['src']);
+ } else {
+ $attr['alt'] = $alt;
+ }
+ } else {
+ $attr['alt'] = $config->get('Attr.DefaultInvalidImageAlt');
+ }
+ }
+ return $attr;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/AttrTransform/ImgSpace.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ImgSpace.php
index 350b3358f..350b3358f 100644
--- a/library/HTMLPurifier/AttrTransform/ImgSpace.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ImgSpace.php
diff --git a/library/HTMLPurifier/AttrTransform/Input.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Input.php
index 3ab47ed8c..3ab47ed8c 100644
--- a/library/HTMLPurifier/AttrTransform/Input.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Input.php
diff --git a/library/HTMLPurifier/AttrTransform/Lang.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Lang.php
index 5b0aff0e4..5b0aff0e4 100644
--- a/library/HTMLPurifier/AttrTransform/Lang.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Lang.php
diff --git a/library/HTMLPurifier/AttrTransform/Length.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Length.php
index 853f33549..853f33549 100644
--- a/library/HTMLPurifier/AttrTransform/Length.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Length.php
diff --git a/library/HTMLPurifier/AttrTransform/Name.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Name.php
index 63cce6837..63cce6837 100644
--- a/library/HTMLPurifier/AttrTransform/Name.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Name.php
diff --git a/library/HTMLPurifier/AttrTransform/NameSync.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/NameSync.php
index 36079b786..36079b786 100644
--- a/library/HTMLPurifier/AttrTransform/NameSync.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/NameSync.php
diff --git a/library/HTMLPurifier/AttrTransform/Nofollow.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Nofollow.php
index 1057ebee1..1057ebee1 100644
--- a/library/HTMLPurifier/AttrTransform/Nofollow.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Nofollow.php
diff --git a/library/HTMLPurifier/AttrTransform/SafeEmbed.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeEmbed.php
index 231c81a3f..231c81a3f 100644
--- a/library/HTMLPurifier/AttrTransform/SafeEmbed.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeEmbed.php
diff --git a/library/HTMLPurifier/AttrTransform/SafeObject.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeObject.php
index d1f3a4d2e..d1f3a4d2e 100644
--- a/library/HTMLPurifier/AttrTransform/SafeObject.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeObject.php
diff --git a/library/HTMLPurifier/AttrTransform/SafeParam.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeParam.php
index 1143b4b49..1143b4b49 100644
--- a/library/HTMLPurifier/AttrTransform/SafeParam.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeParam.php
diff --git a/library/HTMLPurifier/AttrTransform/ScriptRequired.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ScriptRequired.php
index b7057bbf8..b7057bbf8 100644
--- a/library/HTMLPurifier/AttrTransform/ScriptRequired.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ScriptRequired.php
diff --git a/library/HTMLPurifier/AttrTransform/TargetBlank.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/TargetBlank.php
index dd63ea89c..dd63ea89c 100644
--- a/library/HTMLPurifier/AttrTransform/TargetBlank.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/TargetBlank.php
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/TargetNoopener.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/TargetNoopener.php
new file mode 100644
index 000000000..1db3c6c09
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/TargetNoopener.php
@@ -0,0 +1,37 @@
+<?php
+
+// must be called POST validation
+
+/**
+ * Adds rel="noopener" to any links which target a different window
+ * than the current one. This is used to prevent malicious websites
+ * from silently replacing the original window, which could be used
+ * to do phishing.
+ * This transform is controlled by %HTML.TargetNoopener.
+ */
+class HTMLPurifier_AttrTransform_TargetNoopener extends HTMLPurifier_AttrTransform
+{
+ /**
+ * @param array $attr
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return array
+ */
+ public function transform($attr, $config, $context)
+ {
+ if (isset($attr['rel'])) {
+ $rels = explode(' ', $attr['rel']);
+ } else {
+ $rels = array();
+ }
+ if (isset($attr['target']) && !in_array('noopener', $rels)) {
+ $rels[] = 'noopener';
+ }
+ if (!empty($rels) || isset($attr['rel'])) {
+ $attr['rel'] = implode(' ', $rels);
+ }
+
+ return $attr;
+ }
+}
+
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/TargetNoreferrer.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/TargetNoreferrer.php
new file mode 100644
index 000000000..587dc2e07
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/TargetNoreferrer.php
@@ -0,0 +1,37 @@
+<?php
+
+// must be called POST validation
+
+/**
+ * Adds rel="noreferrer" to any links which target a different window
+ * than the current one. This is used to prevent malicious websites
+ * from silently replacing the original window, which could be used
+ * to do phishing.
+ * This transform is controlled by %HTML.TargetNoreferrer.
+ */
+class HTMLPurifier_AttrTransform_TargetNoreferrer extends HTMLPurifier_AttrTransform
+{
+ /**
+ * @param array $attr
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return array
+ */
+ public function transform($attr, $config, $context)
+ {
+ if (isset($attr['rel'])) {
+ $rels = explode(' ', $attr['rel']);
+ } else {
+ $rels = array();
+ }
+ if (isset($attr['target']) && !in_array('noreferrer', $rels)) {
+ $rels[] = 'noreferrer';
+ }
+ if (!empty($rels) || isset($attr['rel'])) {
+ $attr['rel'] = implode(' ', $rels);
+ }
+
+ return $attr;
+ }
+}
+
diff --git a/library/HTMLPurifier/AttrTransform/Textarea.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Textarea.php
index 6a9f33a0c..6a9f33a0c 100644
--- a/library/HTMLPurifier/AttrTransform/Textarea.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Textarea.php
diff --git a/library/HTMLPurifier/AttrTypes.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTypes.php
index 3b70520b6..3b70520b6 100644
--- a/library/HTMLPurifier/AttrTypes.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTypes.php
diff --git a/library/HTMLPurifier/AttrValidator.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrValidator.php
index f97dc93ed..f97dc93ed 100644
--- a/library/HTMLPurifier/AttrValidator.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrValidator.php
diff --git a/library/HTMLPurifier/Bootstrap.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Bootstrap.php
index 707122bb2..707122bb2 100644
--- a/library/HTMLPurifier/Bootstrap.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Bootstrap.php
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/CSSDefinition.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/CSSDefinition.php
new file mode 100644
index 000000000..47dfd1f66
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/CSSDefinition.php
@@ -0,0 +1,491 @@
+<?php
+
+/**
+ * Defines allowed CSS attributes and what their values are.
+ * @see HTMLPurifier_HTMLDefinition
+ */
+class HTMLPurifier_CSSDefinition extends HTMLPurifier_Definition
+{
+
+ public $type = 'CSS';
+
+ /**
+ * Assoc array of attribute name to definition object.
+ * @type HTMLPurifier_AttrDef[]
+ */
+ public $info = array();
+
+ /**
+ * Constructs the info array. The meat of this class.
+ * @param HTMLPurifier_Config $config
+ */
+ protected function doSetup($config)
+ {
+ $this->info['text-align'] = new HTMLPurifier_AttrDef_Enum(
+ array('left', 'right', 'center', 'justify'),
+ false
+ );
+
+ $border_style =
+ $this->info['border-bottom-style'] =
+ $this->info['border-right-style'] =
+ $this->info['border-left-style'] =
+ $this->info['border-top-style'] = new HTMLPurifier_AttrDef_Enum(
+ array(
+ 'none',
+ 'hidden',
+ 'dotted',
+ 'dashed',
+ 'solid',
+ 'double',
+ 'groove',
+ 'ridge',
+ 'inset',
+ 'outset'
+ ),
+ false
+ );
+
+ $this->info['border-style'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_style);
+
+ $this->info['clear'] = new HTMLPurifier_AttrDef_Enum(
+ array('none', 'left', 'right', 'both'),
+ false
+ );
+ $this->info['float'] = new HTMLPurifier_AttrDef_Enum(
+ array('none', 'left', 'right'),
+ false
+ );
+ $this->info['font-style'] = new HTMLPurifier_AttrDef_Enum(
+ array('normal', 'italic', 'oblique'),
+ false
+ );
+ $this->info['font-variant'] = new HTMLPurifier_AttrDef_Enum(
+ array('normal', 'small-caps'),
+ false
+ );
+
+ $uri_or_none = new HTMLPurifier_AttrDef_CSS_Composite(
+ array(
+ new HTMLPurifier_AttrDef_Enum(array('none')),
+ new HTMLPurifier_AttrDef_CSS_URI()
+ )
+ );
+
+ $this->info['list-style-position'] = new HTMLPurifier_AttrDef_Enum(
+ array('inside', 'outside'),
+ false
+ );
+ $this->info['list-style-type'] = new HTMLPurifier_AttrDef_Enum(
+ array(
+ 'disc',
+ 'circle',
+ 'square',
+ 'decimal',
+ 'lower-roman',
+ 'upper-roman',
+ 'lower-alpha',
+ 'upper-alpha',
+ 'none'
+ ),
+ false
+ );
+ $this->info['list-style-image'] = $uri_or_none;
+
+ $this->info['list-style'] = new HTMLPurifier_AttrDef_CSS_ListStyle($config);
+
+ $this->info['text-transform'] = new HTMLPurifier_AttrDef_Enum(
+ array('capitalize', 'uppercase', 'lowercase', 'none'),
+ false
+ );
+ $this->info['color'] = new HTMLPurifier_AttrDef_CSS_Color();
+
+ $this->info['background-image'] = $uri_or_none;
+ $this->info['background-repeat'] = new HTMLPurifier_AttrDef_Enum(
+ array('repeat', 'repeat-x', 'repeat-y', 'no-repeat')
+ );
+ $this->info['background-attachment'] = new HTMLPurifier_AttrDef_Enum(
+ array('scroll', 'fixed')
+ );
+ $this->info['background-position'] = new HTMLPurifier_AttrDef_CSS_BackgroundPosition();
+
+ $border_color =
+ $this->info['border-top-color'] =
+ $this->info['border-bottom-color'] =
+ $this->info['border-left-color'] =
+ $this->info['border-right-color'] =
+ $this->info['background-color'] = new HTMLPurifier_AttrDef_CSS_Composite(
+ array(
+ new HTMLPurifier_AttrDef_Enum(array('transparent')),
+ new HTMLPurifier_AttrDef_CSS_Color()
+ )
+ );
+
+ $this->info['background'] = new HTMLPurifier_AttrDef_CSS_Background($config);
+
+ $this->info['border-color'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_color);
+
+ $border_width =
+ $this->info['border-top-width'] =
+ $this->info['border-bottom-width'] =
+ $this->info['border-left-width'] =
+ $this->info['border-right-width'] = new HTMLPurifier_AttrDef_CSS_Composite(
+ array(
+ new HTMLPurifier_AttrDef_Enum(array('thin', 'medium', 'thick')),
+ new HTMLPurifier_AttrDef_CSS_Length('0') //disallow negative
+ )
+ );
+
+ $this->info['border-width'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_width);
+
+ $this->info['letter-spacing'] = new HTMLPurifier_AttrDef_CSS_Composite(
+ array(
+ new HTMLPurifier_AttrDef_Enum(array('normal')),
+ new HTMLPurifier_AttrDef_CSS_Length()
+ )
+ );
+
+ $this->info['word-spacing'] = new HTMLPurifier_AttrDef_CSS_Composite(
+ array(
+ new HTMLPurifier_AttrDef_Enum(array('normal')),
+ new HTMLPurifier_AttrDef_CSS_Length()
+ )
+ );
+
+ $this->info['font-size'] = new HTMLPurifier_AttrDef_CSS_Composite(
+ array(
+ new HTMLPurifier_AttrDef_Enum(
+ array(
+ 'xx-small',
+ 'x-small',
+ 'small',
+ 'medium',
+ 'large',
+ 'x-large',
+ 'xx-large',
+ 'larger',
+ 'smaller'
+ )
+ ),
+ new HTMLPurifier_AttrDef_CSS_Percentage(),
+ new HTMLPurifier_AttrDef_CSS_Length()
+ )
+ );
+
+ $this->info['line-height'] = new HTMLPurifier_AttrDef_CSS_Composite(
+ array(
+ new HTMLPurifier_AttrDef_Enum(array('normal')),
+ new HTMLPurifier_AttrDef_CSS_Number(true), // no negatives
+ new HTMLPurifier_AttrDef_CSS_Length('0'),
+ new HTMLPurifier_AttrDef_CSS_Percentage(true)
+ )
+ );
+
+ $margin =
+ $this->info['margin-top'] =
+ $this->info['margin-bottom'] =
+ $this->info['margin-left'] =
+ $this->info['margin-right'] = new HTMLPurifier_AttrDef_CSS_Composite(
+ array(
+ new HTMLPurifier_AttrDef_CSS_Length(),
+ new HTMLPurifier_AttrDef_CSS_Percentage(),
+ new HTMLPurifier_AttrDef_Enum(array('auto'))
+ )
+ );
+
+ $this->info['margin'] = new HTMLPurifier_AttrDef_CSS_Multiple($margin);
+
+ // non-negative
+ $padding =
+ $this->info['padding-top'] =
+ $this->info['padding-bottom'] =
+ $this->info['padding-left'] =
+ $this->info['padding-right'] = new HTMLPurifier_AttrDef_CSS_Composite(
+ array(
+ new HTMLPurifier_AttrDef_CSS_Length('0'),
+ new HTMLPurifier_AttrDef_CSS_Percentage(true)
+ )
+ );
+
+ $this->info['padding'] = new HTMLPurifier_AttrDef_CSS_Multiple($padding);
+
+ $this->info['text-indent'] = new HTMLPurifier_AttrDef_CSS_Composite(
+ array(
+ new HTMLPurifier_AttrDef_CSS_Length(),
+ new HTMLPurifier_AttrDef_CSS_Percentage()
+ )
+ );
+
+ $trusted_wh = new HTMLPurifier_AttrDef_CSS_Composite(
+ array(
+ new HTMLPurifier_AttrDef_CSS_Length('0'),
+ new HTMLPurifier_AttrDef_CSS_Percentage(true),
+ new HTMLPurifier_AttrDef_Enum(array('auto'))
+ )
+ );
+ $max = $config->get('CSS.MaxImgLength');
+
+ $this->info['min-width'] =
+ $this->info['max-width'] =
+ $this->info['min-height'] =
+ $this->info['max-height'] =
+ $this->info['width'] =
+ $this->info['height'] =
+ $max === null ?
+ $trusted_wh :
+ new HTMLPurifier_AttrDef_Switch(
+ 'img',
+ // For img tags:
+ new HTMLPurifier_AttrDef_CSS_Composite(
+ array(
+ new HTMLPurifier_AttrDef_CSS_Length('0', $max),
+ new HTMLPurifier_AttrDef_Enum(array('auto'))
+ )
+ ),
+ // For everyone else:
+ $trusted_wh
+ );
+
+ $this->info['text-decoration'] = new HTMLPurifier_AttrDef_CSS_TextDecoration();
+
+ $this->info['font-family'] = new HTMLPurifier_AttrDef_CSS_FontFamily();
+
+ // this could use specialized code
+ $this->info['font-weight'] = new HTMLPurifier_AttrDef_Enum(
+ array(
+ 'normal',
+ 'bold',
+ 'bolder',
+ 'lighter',
+ '100',
+ '200',
+ '300',
+ '400',
+ '500',
+ '600',
+ '700',
+ '800',
+ '900'
+ ),
+ false
+ );
+
+ // MUST be called after other font properties, as it references
+ // a CSSDefinition object
+ $this->info['font'] = new HTMLPurifier_AttrDef_CSS_Font($config);
+
+ // same here
+ $this->info['border'] =
+ $this->info['border-bottom'] =
+ $this->info['border-top'] =
+ $this->info['border-left'] =
+ $this->info['border-right'] = new HTMLPurifier_AttrDef_CSS_Border($config);
+
+ $this->info['border-collapse'] = new HTMLPurifier_AttrDef_Enum(
+ array('collapse', 'separate')
+ );
+
+ $this->info['caption-side'] = new HTMLPurifier_AttrDef_Enum(
+ array('top', 'bottom')
+ );
+
+ $this->info['table-layout'] = new HTMLPurifier_AttrDef_Enum(
+ array('auto', 'fixed')
+ );
+
+ $this->info['vertical-align'] = new HTMLPurifier_AttrDef_CSS_Composite(
+ array(
+ new HTMLPurifier_AttrDef_Enum(
+ array(
+ 'baseline',
+ 'sub',
+ 'super',
+ 'top',
+ 'text-top',
+ 'middle',
+ 'bottom',
+ 'text-bottom'
+ )
+ ),
+ new HTMLPurifier_AttrDef_CSS_Length(),
+ new HTMLPurifier_AttrDef_CSS_Percentage()
+ )
+ );
+
+ $this->info['border-spacing'] = new HTMLPurifier_AttrDef_CSS_Multiple(new HTMLPurifier_AttrDef_CSS_Length(), 2);
+
+ // These CSS properties don't work on many browsers, but we live
+ // in THE FUTURE!
+ $this->info['white-space'] = new HTMLPurifier_AttrDef_Enum(
+ array('nowrap', 'normal', 'pre', 'pre-wrap', 'pre-line')
+ );
+
+ if ($config->get('CSS.Proprietary')) {
+ $this->doSetupProprietary($config);
+ }
+
+ if ($config->get('CSS.AllowTricky')) {
+ $this->doSetupTricky($config);
+ }
+
+ if ($config->get('CSS.Trusted')) {
+ $this->doSetupTrusted($config);
+ }
+
+ $allow_important = $config->get('CSS.AllowImportant');
+ // wrap all attr-defs with decorator that handles !important
+ foreach ($this->info as $k => $v) {
+ $this->info[$k] = new HTMLPurifier_AttrDef_CSS_ImportantDecorator($v, $allow_important);
+ }
+
+ $this->setupConfigStuff($config);
+ }
+
+ /**
+ * @param HTMLPurifier_Config $config
+ */
+ protected function doSetupProprietary($config)
+ {
+ // Internet Explorer only scrollbar colors
+ $this->info['scrollbar-arrow-color'] = new HTMLPurifier_AttrDef_CSS_Color();
+ $this->info['scrollbar-base-color'] = new HTMLPurifier_AttrDef_CSS_Color();
+ $this->info['scrollbar-darkshadow-color'] = new HTMLPurifier_AttrDef_CSS_Color();
+ $this->info['scrollbar-face-color'] = new HTMLPurifier_AttrDef_CSS_Color();
+ $this->info['scrollbar-highlight-color'] = new HTMLPurifier_AttrDef_CSS_Color();
+ $this->info['scrollbar-shadow-color'] = new HTMLPurifier_AttrDef_CSS_Color();
+
+ // vendor specific prefixes of opacity
+ $this->info['-moz-opacity'] = new HTMLPurifier_AttrDef_CSS_AlphaValue();
+ $this->info['-khtml-opacity'] = new HTMLPurifier_AttrDef_CSS_AlphaValue();
+
+ // only opacity, for now
+ $this->info['filter'] = new HTMLPurifier_AttrDef_CSS_Filter();
+
+ // more CSS3
+ $this->info['page-break-after'] =
+ $this->info['page-break-before'] = new HTMLPurifier_AttrDef_Enum(
+ array(
+ 'auto',
+ 'always',
+ 'avoid',
+ 'left',
+ 'right'
+ )
+ );
+ $this->info['page-break-inside'] = new HTMLPurifier_AttrDef_Enum(array('auto', 'avoid'));
+
+ $border_radius = new HTMLPurifier_AttrDef_CSS_Composite(
+ array(
+ new HTMLPurifier_AttrDef_CSS_Percentage(true), // disallow negative
+ new HTMLPurifier_AttrDef_CSS_Length('0') // disallow negative
+ ));
+
+ $this->info['border-top-left-radius'] =
+ $this->info['border-top-right-radius'] =
+ $this->info['border-bottom-right-radius'] =
+ $this->info['border-bottom-left-radius'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_radius, 2);
+ // TODO: support SLASH syntax
+ $this->info['border-radius'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_radius, 4);
+
+ }
+
+ /**
+ * @param HTMLPurifier_Config $config
+ */
+ protected function doSetupTricky($config)
+ {
+ $this->info['display'] = new HTMLPurifier_AttrDef_Enum(
+ array(
+ 'inline',
+ 'block',
+ 'list-item',
+ 'run-in',
+ 'compact',
+ 'marker',
+ 'table',
+ 'inline-block',
+ 'inline-table',
+ 'table-row-group',
+ 'table-header-group',
+ 'table-footer-group',
+ 'table-row',
+ 'table-column-group',
+ 'table-column',
+ 'table-cell',
+ 'table-caption',
+ 'none'
+ )
+ );
+ $this->info['visibility'] = new HTMLPurifier_AttrDef_Enum(
+ array('visible', 'hidden', 'collapse')
+ );
+ $this->info['overflow'] = new HTMLPurifier_AttrDef_Enum(array('visible', 'hidden', 'auto', 'scroll'));
+ $this->info['opacity'] = new HTMLPurifier_AttrDef_CSS_AlphaValue();
+ }
+
+ /**
+ * @param HTMLPurifier_Config $config
+ */
+ protected function doSetupTrusted($config)
+ {
+ $this->info['position'] = new HTMLPurifier_AttrDef_Enum(
+ array('static', 'relative', 'absolute', 'fixed')
+ );
+ $this->info['top'] =
+ $this->info['left'] =
+ $this->info['right'] =
+ $this->info['bottom'] = new HTMLPurifier_AttrDef_CSS_Composite(
+ array(
+ new HTMLPurifier_AttrDef_CSS_Length(),
+ new HTMLPurifier_AttrDef_CSS_Percentage(),
+ new HTMLPurifier_AttrDef_Enum(array('auto')),
+ )
+ );
+ $this->info['z-index'] = new HTMLPurifier_AttrDef_CSS_Composite(
+ array(
+ new HTMLPurifier_AttrDef_Integer(),
+ new HTMLPurifier_AttrDef_Enum(array('auto')),
+ )
+ );
+ }
+
+ /**
+ * Performs extra config-based processing. Based off of
+ * HTMLPurifier_HTMLDefinition.
+ * @param HTMLPurifier_Config $config
+ * @todo Refactor duplicate elements into common class (probably using
+ * composition, not inheritance).
+ */
+ protected function setupConfigStuff($config)
+ {
+ // setup allowed elements
+ $support = "(for information on implementing this, see the " .
+ "support forums) ";
+ $allowed_properties = $config->get('CSS.AllowedProperties');
+ if ($allowed_properties !== null) {
+ foreach ($this->info as $name => $d) {
+ if (!isset($allowed_properties[$name])) {
+ unset($this->info[$name]);
+ }
+ unset($allowed_properties[$name]);
+ }
+ // emit errors
+ foreach ($allowed_properties as $name => $d) {
+ // :TODO: Is this htmlspecialchars() call really necessary?
+ $name = htmlspecialchars($name);
+ trigger_error("Style attribute '$name' is not supported $support", E_USER_WARNING);
+ }
+ }
+
+ $forbidden_properties = $config->get('CSS.ForbiddenProperties');
+ if ($forbidden_properties !== null) {
+ foreach ($this->info as $name => $d) {
+ if (isset($forbidden_properties[$name])) {
+ unset($this->info[$name]);
+ }
+ }
+ }
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/ChildDef.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef.php
index 8eb17b82e..8eb17b82e 100644
--- a/library/HTMLPurifier/ChildDef.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef.php
diff --git a/library/HTMLPurifier/ChildDef/Chameleon.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Chameleon.php
index 7439be26b..7439be26b 100644
--- a/library/HTMLPurifier/ChildDef/Chameleon.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Chameleon.php
diff --git a/library/HTMLPurifier/ChildDef/Custom.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Custom.php
index 128132e96..128132e96 100644
--- a/library/HTMLPurifier/ChildDef/Custom.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Custom.php
diff --git a/library/HTMLPurifier/ChildDef/Empty.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Empty.php
index a8a6cbdd2..a8a6cbdd2 100644
--- a/library/HTMLPurifier/ChildDef/Empty.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Empty.php
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/List.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/List.php
new file mode 100644
index 000000000..5a53a4b49
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/List.php
@@ -0,0 +1,92 @@
+<?php
+
+/**
+ * Definition for list containers ul and ol.
+ *
+ * What does this do? The big thing is to handle ol/ul at the top
+ * level of list nodes, which should be handled specially by /folding/
+ * them into the previous list node. We generally shouldn't ever
+ * see other disallowed elements, because the autoclose behavior
+ * in MakeWellFormed handles it.
+ */
+class HTMLPurifier_ChildDef_List extends HTMLPurifier_ChildDef
+{
+ /**
+ * @type string
+ */
+ public $type = 'list';
+ /**
+ * @type array
+ */
+ // lying a little bit, so that we can handle ul and ol ourselves
+ // XXX: This whole business with 'wrap' is all a bit unsatisfactory
+ public $elements = array('li' => true, 'ul' => true, 'ol' => true);
+
+ /**
+ * @param array $children
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return array
+ */
+ public function validateChildren($children, $config, $context)
+ {
+ // Flag for subclasses
+ $this->whitespace = false;
+
+ // if there are no tokens, delete parent node
+ if (empty($children)) {
+ return false;
+ }
+
+ // if li is not allowed, delete parent node
+ if (!isset($config->getHTMLDefinition()->info['li'])) {
+ trigger_error("Cannot allow ul/ol without allowing li", E_USER_WARNING);
+ return false;
+ }
+
+ // the new set of children
+ $result = array();
+
+ // a little sanity check to make sure it's not ALL whitespace
+ $all_whitespace = true;
+
+ $current_li = false;
+
+ foreach ($children as $node) {
+ if (!empty($node->is_whitespace)) {
+ $result[] = $node;
+ continue;
+ }
+ $all_whitespace = false; // phew, we're not talking about whitespace
+
+ if ($node->name === 'li') {
+ // good
+ $current_li = $node;
+ $result[] = $node;
+ } else {
+ // we want to tuck this into the previous li
+ // Invariant: we expect the node to be ol/ul
+ // ToDo: Make this more robust in the case of not ol/ul
+ // by distinguishing between existing li and li created
+ // to handle non-list elements; non-list elements should
+ // not be appended to an existing li; only li created
+ // for non-list. This distinction is not currently made.
+ if ($current_li === false) {
+ $current_li = new HTMLPurifier_Node_Element('li');
+ $result[] = $current_li;
+ }
+ $current_li->children[] = $node;
+ $current_li->empty = false; // XXX fascinating! Check for this error elsewhere ToDo
+ }
+ }
+ if (empty($result)) {
+ return false;
+ }
+ if ($all_whitespace) {
+ return false;
+ }
+ return $result;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/ChildDef/Optional.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Optional.php
index b9468063b..b9468063b 100644
--- a/library/HTMLPurifier/ChildDef/Optional.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Optional.php
diff --git a/library/HTMLPurifier/ChildDef/Required.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Required.php
index 0d1c8f5f3..0d1c8f5f3 100644
--- a/library/HTMLPurifier/ChildDef/Required.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Required.php
diff --git a/library/HTMLPurifier/ChildDef/StrictBlockquote.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/StrictBlockquote.php
index 3270a46e1..3270a46e1 100644
--- a/library/HTMLPurifier/ChildDef/StrictBlockquote.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/StrictBlockquote.php
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Table.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Table.php
new file mode 100644
index 000000000..cb6b3e6cd
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Table.php
@@ -0,0 +1,224 @@
+<?php
+
+/**
+ * Definition for tables. The general idea is to extract out all of the
+ * essential bits, and then reconstruct it later.
+ *
+ * This is a bit confusing, because the DTDs and the W3C
+ * validators seem to disagree on the appropriate definition. The
+ * DTD claims:
+ *
+ * (CAPTION?, (COL*|COLGROUP*), THEAD?, TFOOT?, TBODY+)
+ *
+ * But actually, the HTML4 spec then has this to say:
+ *
+ * The TBODY start tag is always required except when the table
+ * contains only one table body and no table head or foot sections.
+ * The TBODY end tag may always be safely omitted.
+ *
+ * So the DTD is kind of wrong. The validator is, unfortunately, kind
+ * of on crack.
+ *
+ * The definition changed again in XHTML1.1; and in my opinion, this
+ * formulation makes the most sense.
+ *
+ * caption?, ( col* | colgroup* ), (( thead?, tfoot?, tbody+ ) | ( tr+ ))
+ *
+ * Essentially, we have two modes: thead/tfoot/tbody mode, and tr mode.
+ * If we encounter a thead, tfoot or tbody, we are placed in the former
+ * mode, and we *must* wrap any stray tr segments with a tbody. But if
+ * we don't run into any of them, just have tr tags is OK.
+ */
+class HTMLPurifier_ChildDef_Table extends HTMLPurifier_ChildDef
+{
+ /**
+ * @type bool
+ */
+ public $allow_empty = false;
+
+ /**
+ * @type string
+ */
+ public $type = 'table';
+
+ /**
+ * @type array
+ */
+ public $elements = array(
+ 'tr' => true,
+ 'tbody' => true,
+ 'thead' => true,
+ 'tfoot' => true,
+ 'caption' => true,
+ 'colgroup' => true,
+ 'col' => true
+ );
+
+ public function __construct()
+ {
+ }
+
+ /**
+ * @param array $children
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return array
+ */
+ public function validateChildren($children, $config, $context)
+ {
+ if (empty($children)) {
+ return false;
+ }
+
+ // only one of these elements is allowed in a table
+ $caption = false;
+ $thead = false;
+ $tfoot = false;
+
+ // whitespace
+ $initial_ws = array();
+ $after_caption_ws = array();
+ $after_thead_ws = array();
+ $after_tfoot_ws = array();
+
+ // as many of these as you want
+ $cols = array();
+ $content = array();
+
+ $tbody_mode = false; // if true, then we need to wrap any stray
+ // <tr>s with a <tbody>.
+
+ $ws_accum =& $initial_ws;
+
+ foreach ($children as $node) {
+ if ($node instanceof HTMLPurifier_Node_Comment) {
+ $ws_accum[] = $node;
+ continue;
+ }
+ switch ($node->name) {
+ case 'tbody':
+ $tbody_mode = true;
+ // fall through
+ case 'tr':
+ $content[] = $node;
+ $ws_accum =& $content;
+ break;
+ case 'caption':
+ // there can only be one caption!
+ if ($caption !== false) break;
+ $caption = $node;
+ $ws_accum =& $after_caption_ws;
+ break;
+ case 'thead':
+ $tbody_mode = true;
+ // XXX This breaks rendering properties with
+ // Firefox, which never floats a <thead> to
+ // the top. Ever. (Our scheme will float the
+ // first <thead> to the top.) So maybe
+ // <thead>s that are not first should be
+ // turned into <tbody>? Very tricky, indeed.
+ if ($thead === false) {
+ $thead = $node;
+ $ws_accum =& $after_thead_ws;
+ } else {
+ // Oops, there's a second one! What
+ // should we do? Current behavior is to
+ // transmutate the first and last entries into
+ // tbody tags, and then put into content.
+ // Maybe a better idea is to *attach
+ // it* to the existing thead or tfoot?
+ // We don't do this, because Firefox
+ // doesn't float an extra tfoot to the
+ // bottom like it does for the first one.
+ $node->name = 'tbody';
+ $content[] = $node;
+ $ws_accum =& $content;
+ }
+ break;
+ case 'tfoot':
+ // see above for some aveats
+ $tbody_mode = true;
+ if ($tfoot === false) {
+ $tfoot = $node;
+ $ws_accum =& $after_tfoot_ws;
+ } else {
+ $node->name = 'tbody';
+ $content[] = $node;
+ $ws_accum =& $content;
+ }
+ break;
+ case 'colgroup':
+ case 'col':
+ $cols[] = $node;
+ $ws_accum =& $cols;
+ break;
+ case '#PCDATA':
+ // How is whitespace handled? We treat is as sticky to
+ // the *end* of the previous element. So all of the
+ // nonsense we have worked on is to keep things
+ // together.
+ if (!empty($node->is_whitespace)) {
+ $ws_accum[] = $node;
+ }
+ break;
+ }
+ }
+
+ if (empty($content)) {
+ return false;
+ }
+
+ $ret = $initial_ws;
+ if ($caption !== false) {
+ $ret[] = $caption;
+ $ret = array_merge($ret, $after_caption_ws);
+ }
+ if ($cols !== false) {
+ $ret = array_merge($ret, $cols);
+ }
+ if ($thead !== false) {
+ $ret[] = $thead;
+ $ret = array_merge($ret, $after_thead_ws);
+ }
+ if ($tfoot !== false) {
+ $ret[] = $tfoot;
+ $ret = array_merge($ret, $after_tfoot_ws);
+ }
+
+ if ($tbody_mode) {
+ // we have to shuffle tr into tbody
+ $current_tr_tbody = null;
+
+ foreach($content as $node) {
+ switch ($node->name) {
+ case 'tbody':
+ $current_tr_tbody = null;
+ $ret[] = $node;
+ break;
+ case 'tr':
+ if ($current_tr_tbody === null) {
+ $current_tr_tbody = new HTMLPurifier_Node_Element('tbody');
+ $ret[] = $current_tr_tbody;
+ }
+ $current_tr_tbody->children[] = $node;
+ break;
+ case '#PCDATA':
+ //assert($node->is_whitespace);
+ if ($current_tr_tbody === null) {
+ $ret[] = $node;
+ } else {
+ $current_tr_tbody->children[] = $node;
+ }
+ break;
+ }
+ }
+ } else {
+ $ret = array_merge($ret, $content);
+ }
+
+ return $ret;
+
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Config.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Config.php
new file mode 100644
index 000000000..69e6d2765
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Config.php
@@ -0,0 +1,920 @@
+<?php
+
+/**
+ * Configuration object that triggers customizable behavior.
+ *
+ * @warning This class is strongly defined: that means that the class
+ * will fail if an undefined directive is retrieved or set.
+ *
+ * @note Many classes that could (although many times don't) use the
+ * configuration object make it a mandatory parameter. This is
+ * because a configuration object should always be forwarded,
+ * otherwise, you run the risk of missing a parameter and then
+ * being stumped when a configuration directive doesn't work.
+ *
+ * @todo Reconsider some of the public member variables
+ */
+class HTMLPurifier_Config
+{
+
+ /**
+ * HTML Purifier's version
+ * @type string
+ */
+ public $version = '4.9.2';
+
+ /**
+ * Whether or not to automatically finalize
+ * the object if a read operation is done.
+ * @type bool
+ */
+ public $autoFinalize = true;
+
+ // protected member variables
+
+ /**
+ * Namespace indexed array of serials for specific namespaces.
+ * @see getSerial() for more info.
+ * @type string[]
+ */
+ protected $serials = array();
+
+ /**
+ * Serial for entire configuration object.
+ * @type string
+ */
+ protected $serial;
+
+ /**
+ * Parser for variables.
+ * @type HTMLPurifier_VarParser_Flexible
+ */
+ protected $parser = null;
+
+ /**
+ * Reference HTMLPurifier_ConfigSchema for value checking.
+ * @type HTMLPurifier_ConfigSchema
+ * @note This is public for introspective purposes. Please don't
+ * abuse!
+ */
+ public $def;
+
+ /**
+ * Indexed array of definitions.
+ * @type HTMLPurifier_Definition[]
+ */
+ protected $definitions;
+
+ /**
+ * Whether or not config is finalized.
+ * @type bool
+ */
+ protected $finalized = false;
+
+ /**
+ * Property list containing configuration directives.
+ * @type array
+ */
+ protected $plist;
+
+ /**
+ * Whether or not a set is taking place due to an alias lookup.
+ * @type bool
+ */
+ private $aliasMode;
+
+ /**
+ * Set to false if you do not want line and file numbers in errors.
+ * (useful when unit testing). This will also compress some errors
+ * and exceptions.
+ * @type bool
+ */
+ public $chatty = true;
+
+ /**
+ * Current lock; only gets to this namespace are allowed.
+ * @type string
+ */
+ private $lock;
+
+ /**
+ * Constructor
+ * @param HTMLPurifier_ConfigSchema $definition ConfigSchema that defines
+ * what directives are allowed.
+ * @param HTMLPurifier_PropertyList $parent
+ */
+ public function __construct($definition, $parent = null)
+ {
+ $parent = $parent ? $parent : $definition->defaultPlist;
+ $this->plist = new HTMLPurifier_PropertyList($parent);
+ $this->def = $definition; // keep a copy around for checking
+ $this->parser = new HTMLPurifier_VarParser_Flexible();
+ }
+
+ /**
+ * Convenience constructor that creates a config object based on a mixed var
+ * @param mixed $config Variable that defines the state of the config
+ * object. Can be: a HTMLPurifier_Config() object,
+ * an array of directives based on loadArray(),
+ * or a string filename of an ini file.
+ * @param HTMLPurifier_ConfigSchema $schema Schema object
+ * @return HTMLPurifier_Config Configured object
+ */
+ public static function create($config, $schema = null)
+ {
+ if ($config instanceof HTMLPurifier_Config) {
+ // pass-through
+ return $config;
+ }
+ if (!$schema) {
+ $ret = HTMLPurifier_Config::createDefault();
+ } else {
+ $ret = new HTMLPurifier_Config($schema);
+ }
+ if (is_string($config)) {
+ $ret->loadIni($config);
+ } elseif (is_array($config)) $ret->loadArray($config);
+ return $ret;
+ }
+
+ /**
+ * Creates a new config object that inherits from a previous one.
+ * @param HTMLPurifier_Config $config Configuration object to inherit from.
+ * @return HTMLPurifier_Config object with $config as its parent.
+ */
+ public static function inherit(HTMLPurifier_Config $config)
+ {
+ return new HTMLPurifier_Config($config->def, $config->plist);
+ }
+
+ /**
+ * Convenience constructor that creates a default configuration object.
+ * @return HTMLPurifier_Config default object.
+ */
+ public static function createDefault()
+ {
+ $definition = HTMLPurifier_ConfigSchema::instance();
+ $config = new HTMLPurifier_Config($definition);
+ return $config;
+ }
+
+ /**
+ * Retrieves a value from the configuration.
+ *
+ * @param string $key String key
+ * @param mixed $a
+ *
+ * @return mixed
+ */
+ public function get($key, $a = null)
+ {
+ if ($a !== null) {
+ $this->triggerError(
+ "Using deprecated API: use \$config->get('$key.$a') instead",
+ E_USER_WARNING
+ );
+ $key = "$key.$a";
+ }
+ if (!$this->finalized) {
+ $this->autoFinalize();
+ }
+ if (!isset($this->def->info[$key])) {
+ // can't add % due to SimpleTest bug
+ $this->triggerError(
+ 'Cannot retrieve value of undefined directive ' . htmlspecialchars($key),
+ E_USER_WARNING
+ );
+ return;
+ }
+ if (isset($this->def->info[$key]->isAlias)) {
+ $d = $this->def->info[$key];
+ $this->triggerError(
+ 'Cannot get value from aliased directive, use real name ' . $d->key,
+ E_USER_ERROR
+ );
+ return;
+ }
+ if ($this->lock) {
+ list($ns) = explode('.', $key);
+ if ($ns !== $this->lock) {
+ $this->triggerError(
+ 'Cannot get value of namespace ' . $ns . ' when lock for ' .
+ $this->lock .
+ ' is active, this probably indicates a Definition setup method ' .
+ 'is accessing directives that are not within its namespace',
+ E_USER_ERROR
+ );
+ return;
+ }
+ }
+ return $this->plist->get($key);
+ }
+
+ /**
+ * Retrieves an array of directives to values from a given namespace
+ *
+ * @param string $namespace String namespace
+ *
+ * @return array
+ */
+ public function getBatch($namespace)
+ {
+ if (!$this->finalized) {
+ $this->autoFinalize();
+ }
+ $full = $this->getAll();
+ if (!isset($full[$namespace])) {
+ $this->triggerError(
+ 'Cannot retrieve undefined namespace ' .
+ htmlspecialchars($namespace),
+ E_USER_WARNING
+ );
+ return;
+ }
+ return $full[$namespace];
+ }
+
+ /**
+ * Returns a SHA-1 signature of a segment of the configuration object
+ * that uniquely identifies that particular configuration
+ *
+ * @param string $namespace Namespace to get serial for
+ *
+ * @return string
+ * @note Revision is handled specially and is removed from the batch
+ * before processing!
+ */
+ public function getBatchSerial($namespace)
+ {
+ if (empty($this->serials[$namespace])) {
+ $batch = $this->getBatch($namespace);
+ unset($batch['DefinitionRev']);
+ $this->serials[$namespace] = sha1(serialize($batch));
+ }
+ return $this->serials[$namespace];
+ }
+
+ /**
+ * Returns a SHA-1 signature for the entire configuration object
+ * that uniquely identifies that particular configuration
+ *
+ * @return string
+ */
+ public function getSerial()
+ {
+ if (empty($this->serial)) {
+ $this->serial = sha1(serialize($this->getAll()));
+ }
+ return $this->serial;
+ }
+
+ /**
+ * Retrieves all directives, organized by namespace
+ *
+ * @warning This is a pretty inefficient function, avoid if you can
+ */
+ public function getAll()
+ {
+ if (!$this->finalized) {
+ $this->autoFinalize();
+ }
+ $ret = array();
+ foreach ($this->plist->squash() as $name => $value) {
+ list($ns, $key) = explode('.', $name, 2);
+ $ret[$ns][$key] = $value;
+ }
+ return $ret;
+ }
+
+ /**
+ * Sets a value to configuration.
+ *
+ * @param string $key key
+ * @param mixed $value value
+ * @param mixed $a
+ */
+ public function set($key, $value, $a = null)
+ {
+ if (strpos($key, '.') === false) {
+ $namespace = $key;
+ $directive = $value;
+ $value = $a;
+ $key = "$key.$directive";
+ $this->triggerError("Using deprecated API: use \$config->set('$key', ...) instead", E_USER_NOTICE);
+ } else {
+ list($namespace) = explode('.', $key);
+ }
+ if ($this->isFinalized('Cannot set directive after finalization')) {
+ return;
+ }
+ if (!isset($this->def->info[$key])) {
+ $this->triggerError(
+ 'Cannot set undefined directive ' . htmlspecialchars($key) . ' to value',
+ E_USER_WARNING
+ );
+ return;
+ }
+ $def = $this->def->info[$key];
+
+ if (isset($def->isAlias)) {
+ if ($this->aliasMode) {
+ $this->triggerError(
+ 'Double-aliases not allowed, please fix '.
+ 'ConfigSchema bug with' . $key,
+ E_USER_ERROR
+ );
+ return;
+ }
+ $this->aliasMode = true;
+ $this->set($def->key, $value);
+ $this->aliasMode = false;
+ $this->triggerError("$key is an alias, preferred directive name is {$def->key}", E_USER_NOTICE);
+ return;
+ }
+
+ // Raw type might be negative when using the fully optimized form
+ // of stdclass, which indicates allow_null == true
+ $rtype = is_int($def) ? $def : $def->type;
+ if ($rtype < 0) {
+ $type = -$rtype;
+ $allow_null = true;
+ } else {
+ $type = $rtype;
+ $allow_null = isset($def->allow_null);
+ }
+
+ try {
+ $value = $this->parser->parse($value, $type, $allow_null);
+ } catch (HTMLPurifier_VarParserException $e) {
+ $this->triggerError(
+ 'Value for ' . $key . ' is of invalid type, should be ' .
+ HTMLPurifier_VarParser::getTypeName($type),
+ E_USER_WARNING
+ );
+ return;
+ }
+ if (is_string($value) && is_object($def)) {
+ // resolve value alias if defined
+ if (isset($def->aliases[$value])) {
+ $value = $def->aliases[$value];
+ }
+ // check to see if the value is allowed
+ if (isset($def->allowed) && !isset($def->allowed[$value])) {
+ $this->triggerError(
+ 'Value not supported, valid values are: ' .
+ $this->_listify($def->allowed),
+ E_USER_WARNING
+ );
+ return;
+ }
+ }
+ $this->plist->set($key, $value);
+
+ // reset definitions if the directives they depend on changed
+ // this is a very costly process, so it's discouraged
+ // with finalization
+ if ($namespace == 'HTML' || $namespace == 'CSS' || $namespace == 'URI') {
+ $this->definitions[$namespace] = null;
+ }
+
+ $this->serials[$namespace] = false;
+ }
+
+ /**
+ * Convenience function for error reporting
+ *
+ * @param array $lookup
+ *
+ * @return string
+ */
+ private function _listify($lookup)
+ {
+ $list = array();
+ foreach ($lookup as $name => $b) {
+ $list[] = $name;
+ }
+ return implode(', ', $list);
+ }
+
+ /**
+ * Retrieves object reference to the HTML definition.
+ *
+ * @param bool $raw Return a copy that has not been setup yet. Must be
+ * called before it's been setup, otherwise won't work.
+ * @param bool $optimized If true, this method may return null, to
+ * indicate that a cached version of the modified
+ * definition object is available and no further edits
+ * are necessary. Consider using
+ * maybeGetRawHTMLDefinition, which is more explicitly
+ * named, instead.
+ *
+ * @return HTMLPurifier_HTMLDefinition
+ */
+ public function getHTMLDefinition($raw = false, $optimized = false)
+ {
+ return $this->getDefinition('HTML', $raw, $optimized);
+ }
+
+ /**
+ * Retrieves object reference to the CSS definition
+ *
+ * @param bool $raw Return a copy that has not been setup yet. Must be
+ * called before it's been setup, otherwise won't work.
+ * @param bool $optimized If true, this method may return null, to
+ * indicate that a cached version of the modified
+ * definition object is available and no further edits
+ * are necessary. Consider using
+ * maybeGetRawCSSDefinition, which is more explicitly
+ * named, instead.
+ *
+ * @return HTMLPurifier_CSSDefinition
+ */
+ public function getCSSDefinition($raw = false, $optimized = false)
+ {
+ return $this->getDefinition('CSS', $raw, $optimized);
+ }
+
+ /**
+ * Retrieves object reference to the URI definition
+ *
+ * @param bool $raw Return a copy that has not been setup yet. Must be
+ * called before it's been setup, otherwise won't work.
+ * @param bool $optimized If true, this method may return null, to
+ * indicate that a cached version of the modified
+ * definition object is available and no further edits
+ * are necessary. Consider using
+ * maybeGetRawURIDefinition, which is more explicitly
+ * named, instead.
+ *
+ * @return HTMLPurifier_URIDefinition
+ */
+ public function getURIDefinition($raw = false, $optimized = false)
+ {
+ return $this->getDefinition('URI', $raw, $optimized);
+ }
+
+ /**
+ * Retrieves a definition
+ *
+ * @param string $type Type of definition: HTML, CSS, etc
+ * @param bool $raw Whether or not definition should be returned raw
+ * @param bool $optimized Only has an effect when $raw is true. Whether
+ * or not to return null if the result is already present in
+ * the cache. This is off by default for backwards
+ * compatibility reasons, but you need to do things this
+ * way in order to ensure that caching is done properly.
+ * Check out enduser-customize.html for more details.
+ * We probably won't ever change this default, as much as the
+ * maybe semantics is the "right thing to do."
+ *
+ * @throws HTMLPurifier_Exception
+ * @return HTMLPurifier_Definition
+ */
+ public function getDefinition($type, $raw = false, $optimized = false)
+ {
+ if ($optimized && !$raw) {
+ throw new HTMLPurifier_Exception("Cannot set optimized = true when raw = false");
+ }
+ if (!$this->finalized) {
+ $this->autoFinalize();
+ }
+ // temporarily suspend locks, so we can handle recursive definition calls
+ $lock = $this->lock;
+ $this->lock = null;
+ $factory = HTMLPurifier_DefinitionCacheFactory::instance();
+ $cache = $factory->create($type, $this);
+ $this->lock = $lock;
+ if (!$raw) {
+ // full definition
+ // ---------------
+ // check if definition is in memory
+ if (!empty($this->definitions[$type])) {
+ $def = $this->definitions[$type];
+ // check if the definition is setup
+ if ($def->setup) {
+ return $def;
+ } else {
+ $def->setup($this);
+ if ($def->optimized) {
+ $cache->add($def, $this);
+ }
+ return $def;
+ }
+ }
+ // check if definition is in cache
+ $def = $cache->get($this);
+ if ($def) {
+ // definition in cache, save to memory and return it
+ $this->definitions[$type] = $def;
+ return $def;
+ }
+ // initialize it
+ $def = $this->initDefinition($type);
+ // set it up
+ $this->lock = $type;
+ $def->setup($this);
+ $this->lock = null;
+ // save in cache
+ $cache->add($def, $this);
+ // return it
+ return $def;
+ } else {
+ // raw definition
+ // --------------
+ // check preconditions
+ $def = null;
+ if ($optimized) {
+ if (is_null($this->get($type . '.DefinitionID'))) {
+ // fatally error out if definition ID not set
+ throw new HTMLPurifier_Exception(
+ "Cannot retrieve raw version without specifying %$type.DefinitionID"
+ );
+ }
+ }
+ if (!empty($this->definitions[$type])) {
+ $def = $this->definitions[$type];
+ if ($def->setup && !$optimized) {
+ $extra = $this->chatty ?
+ " (try moving this code block earlier in your initialization)" :
+ "";
+ throw new HTMLPurifier_Exception(
+ "Cannot retrieve raw definition after it has already been setup" .
+ $extra
+ );
+ }
+ if ($def->optimized === null) {
+ $extra = $this->chatty ? " (try flushing your cache)" : "";
+ throw new HTMLPurifier_Exception(
+ "Optimization status of definition is unknown" . $extra
+ );
+ }
+ if ($def->optimized !== $optimized) {
+ $msg = $optimized ? "optimized" : "unoptimized";
+ $extra = $this->chatty ?
+ " (this backtrace is for the first inconsistent call, which was for a $msg raw definition)"
+ : "";
+ throw new HTMLPurifier_Exception(
+ "Inconsistent use of optimized and unoptimized raw definition retrievals" . $extra
+ );
+ }
+ }
+ // check if definition was in memory
+ if ($def) {
+ if ($def->setup) {
+ // invariant: $optimized === true (checked above)
+ return null;
+ } else {
+ return $def;
+ }
+ }
+ // if optimized, check if definition was in cache
+ // (because we do the memory check first, this formulation
+ // is prone to cache slamming, but I think
+ // guaranteeing that either /all/ of the raw
+ // setup code or /none/ of it is run is more important.)
+ if ($optimized) {
+ // This code path only gets run once; once we put
+ // something in $definitions (which is guaranteed by the
+ // trailing code), we always short-circuit above.
+ $def = $cache->get($this);
+ if ($def) {
+ // save the full definition for later, but don't
+ // return it yet
+ $this->definitions[$type] = $def;
+ return null;
+ }
+ }
+ // check invariants for creation
+ if (!$optimized) {
+ if (!is_null($this->get($type . '.DefinitionID'))) {
+ if ($this->chatty) {
+ $this->triggerError(
+ 'Due to a documentation error in previous version of HTML Purifier, your ' .
+ 'definitions are not being cached. If this is OK, you can remove the ' .
+ '%$type.DefinitionRev and %$type.DefinitionID declaration. Otherwise, ' .
+ 'modify your code to use maybeGetRawDefinition, and test if the returned ' .
+ 'value is null before making any edits (if it is null, that means that a ' .
+ 'cached version is available, and no raw operations are necessary). See ' .
+ '<a href="http://htmlpurifier.org/docs/enduser-customize.html#optimized">' .
+ 'Customize</a> for more details',
+ E_USER_WARNING
+ );
+ } else {
+ $this->triggerError(
+ "Useless DefinitionID declaration",
+ E_USER_WARNING
+ );
+ }
+ }
+ }
+ // initialize it
+ $def = $this->initDefinition($type);
+ $def->optimized = $optimized;
+ return $def;
+ }
+ throw new HTMLPurifier_Exception("The impossible happened!");
+ }
+
+ /**
+ * Initialise definition
+ *
+ * @param string $type What type of definition to create
+ *
+ * @return HTMLPurifier_CSSDefinition|HTMLPurifier_HTMLDefinition|HTMLPurifier_URIDefinition
+ * @throws HTMLPurifier_Exception
+ */
+ private function initDefinition($type)
+ {
+ // quick checks failed, let's create the object
+ if ($type == 'HTML') {
+ $def = new HTMLPurifier_HTMLDefinition();
+ } elseif ($type == 'CSS') {
+ $def = new HTMLPurifier_CSSDefinition();
+ } elseif ($type == 'URI') {
+ $def = new HTMLPurifier_URIDefinition();
+ } else {
+ throw new HTMLPurifier_Exception(
+ "Definition of $type type not supported"
+ );
+ }
+ $this->definitions[$type] = $def;
+ return $def;
+ }
+
+ public function maybeGetRawDefinition($name)
+ {
+ return $this->getDefinition($name, true, true);
+ }
+
+ /**
+ * @return HTMLPurifier_HTMLDefinition
+ */
+ public function maybeGetRawHTMLDefinition()
+ {
+ return $this->getDefinition('HTML', true, true);
+ }
+
+ /**
+ * @return HTMLPurifier_CSSDefinition
+ */
+ public function maybeGetRawCSSDefinition()
+ {
+ return $this->getDefinition('CSS', true, true);
+ }
+
+ /**
+ * @return HTMLPurifier_URIDefinition
+ */
+ public function maybeGetRawURIDefinition()
+ {
+ return $this->getDefinition('URI', true, true);
+ }
+
+ /**
+ * Loads configuration values from an array with the following structure:
+ * Namespace.Directive => Value
+ *
+ * @param array $config_array Configuration associative array
+ */
+ public function loadArray($config_array)
+ {
+ if ($this->isFinalized('Cannot load directives after finalization')) {
+ return;
+ }
+ foreach ($config_array as $key => $value) {
+ $key = str_replace('_', '.', $key);
+ if (strpos($key, '.') !== false) {
+ $this->set($key, $value);
+ } else {
+ $namespace = $key;
+ $namespace_values = $value;
+ foreach ($namespace_values as $directive => $value2) {
+ $this->set($namespace .'.'. $directive, $value2);
+ }
+ }
+ }
+ }
+
+ /**
+ * Returns a list of array(namespace, directive) for all directives
+ * that are allowed in a web-form context as per an allowed
+ * namespaces/directives list.
+ *
+ * @param array $allowed List of allowed namespaces/directives
+ * @param HTMLPurifier_ConfigSchema $schema Schema to use, if not global copy
+ *
+ * @return array
+ */
+ public static function getAllowedDirectivesForForm($allowed, $schema = null)
+ {
+ if (!$schema) {
+ $schema = HTMLPurifier_ConfigSchema::instance();
+ }
+ if ($allowed !== true) {
+ if (is_string($allowed)) {
+ $allowed = array($allowed);
+ }
+ $allowed_ns = array();
+ $allowed_directives = array();
+ $blacklisted_directives = array();
+ foreach ($allowed as $ns_or_directive) {
+ if (strpos($ns_or_directive, '.') !== false) {
+ // directive
+ if ($ns_or_directive[0] == '-') {
+ $blacklisted_directives[substr($ns_or_directive, 1)] = true;
+ } else {
+ $allowed_directives[$ns_or_directive] = true;
+ }
+ } else {
+ // namespace
+ $allowed_ns[$ns_or_directive] = true;
+ }
+ }
+ }
+ $ret = array();
+ foreach ($schema->info as $key => $def) {
+ list($ns, $directive) = explode('.', $key, 2);
+ if ($allowed !== true) {
+ if (isset($blacklisted_directives["$ns.$directive"])) {
+ continue;
+ }
+ if (!isset($allowed_directives["$ns.$directive"]) && !isset($allowed_ns[$ns])) {
+ continue;
+ }
+ }
+ if (isset($def->isAlias)) {
+ continue;
+ }
+ if ($directive == 'DefinitionID' || $directive == 'DefinitionRev') {
+ continue;
+ }
+ $ret[] = array($ns, $directive);
+ }
+ return $ret;
+ }
+
+ /**
+ * Loads configuration values from $_GET/$_POST that were posted
+ * via ConfigForm
+ *
+ * @param array $array $_GET or $_POST array to import
+ * @param string|bool $index Index/name that the config variables are in
+ * @param array|bool $allowed List of allowed namespaces/directives
+ * @param bool $mq_fix Boolean whether or not to enable magic quotes fix
+ * @param HTMLPurifier_ConfigSchema $schema Schema to use, if not global copy
+ *
+ * @return mixed
+ */
+ public static function loadArrayFromForm($array, $index = false, $allowed = true, $mq_fix = true, $schema = null)
+ {
+ $ret = HTMLPurifier_Config::prepareArrayFromForm($array, $index, $allowed, $mq_fix, $schema);
+ $config = HTMLPurifier_Config::create($ret, $schema);
+ return $config;
+ }
+
+ /**
+ * Merges in configuration values from $_GET/$_POST to object. NOT STATIC.
+ *
+ * @param array $array $_GET or $_POST array to import
+ * @param string|bool $index Index/name that the config variables are in
+ * @param array|bool $allowed List of allowed namespaces/directives
+ * @param bool $mq_fix Boolean whether or not to enable magic quotes fix
+ */
+ public function mergeArrayFromForm($array, $index = false, $allowed = true, $mq_fix = true)
+ {
+ $ret = HTMLPurifier_Config::prepareArrayFromForm($array, $index, $allowed, $mq_fix, $this->def);
+ $this->loadArray($ret);
+ }
+
+ /**
+ * Prepares an array from a form into something usable for the more
+ * strict parts of HTMLPurifier_Config
+ *
+ * @param array $array $_GET or $_POST array to import
+ * @param string|bool $index Index/name that the config variables are in
+ * @param array|bool $allowed List of allowed namespaces/directives
+ * @param bool $mq_fix Boolean whether or not to enable magic quotes fix
+ * @param HTMLPurifier_ConfigSchema $schema Schema to use, if not global copy
+ *
+ * @return array
+ */
+ public static function prepareArrayFromForm($array, $index = false, $allowed = true, $mq_fix = true, $schema = null)
+ {
+ if ($index !== false) {
+ $array = (isset($array[$index]) && is_array($array[$index])) ? $array[$index] : array();
+ }
+ $mq = $mq_fix && function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc();
+
+ $allowed = HTMLPurifier_Config::getAllowedDirectivesForForm($allowed, $schema);
+ $ret = array();
+ foreach ($allowed as $key) {
+ list($ns, $directive) = $key;
+ $skey = "$ns.$directive";
+ if (!empty($array["Null_$skey"])) {
+ $ret[$ns][$directive] = null;
+ continue;
+ }
+ if (!isset($array[$skey])) {
+ continue;
+ }
+ $value = $mq ? stripslashes($array[$skey]) : $array[$skey];
+ $ret[$ns][$directive] = $value;
+ }
+ return $ret;
+ }
+
+ /**
+ * Loads configuration values from an ini file
+ *
+ * @param string $filename Name of ini file
+ */
+ public function loadIni($filename)
+ {
+ if ($this->isFinalized('Cannot load directives after finalization')) {
+ return;
+ }
+ $array = parse_ini_file($filename, true);
+ $this->loadArray($array);
+ }
+
+ /**
+ * Checks whether or not the configuration object is finalized.
+ *
+ * @param string|bool $error String error message, or false for no error
+ *
+ * @return bool
+ */
+ public function isFinalized($error = false)
+ {
+ if ($this->finalized && $error) {
+ $this->triggerError($error, E_USER_ERROR);
+ }
+ return $this->finalized;
+ }
+
+ /**
+ * Finalizes configuration only if auto finalize is on and not
+ * already finalized
+ */
+ public function autoFinalize()
+ {
+ if ($this->autoFinalize) {
+ $this->finalize();
+ } else {
+ $this->plist->squash(true);
+ }
+ }
+
+ /**
+ * Finalizes a configuration object, prohibiting further change
+ */
+ public function finalize()
+ {
+ $this->finalized = true;
+ $this->parser = null;
+ }
+
+ /**
+ * Produces a nicely formatted error message by supplying the
+ * stack frame information OUTSIDE of HTMLPurifier_Config.
+ *
+ * @param string $msg An error message
+ * @param int $no An error number
+ */
+ protected function triggerError($msg, $no)
+ {
+ // determine previous stack frame
+ $extra = '';
+ if ($this->chatty) {
+ $trace = debug_backtrace();
+ // zip(tail(trace), trace) -- but PHP is not Haskell har har
+ for ($i = 0, $c = count($trace); $i < $c - 1; $i++) {
+ // XXX this is not correct on some versions of HTML Purifier
+ if ($trace[$i + 1]['class'] === 'HTMLPurifier_Config') {
+ continue;
+ }
+ $frame = $trace[$i];
+ $extra = " invoked on line {$frame['line']} in file {$frame['file']}";
+ break;
+ }
+ }
+ trigger_error($msg . $extra, $no);
+ }
+
+ /**
+ * Returns a serialized form of the configuration object that can
+ * be reconstituted.
+ *
+ * @return string
+ */
+ public function serialize()
+ {
+ $this->getDefinition('HTML');
+ $this->getDefinition('CSS');
+ $this->getDefinition('URI');
+ return serialize($this);
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/ConfigSchema.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema.php
index bfbb0f92f..bfbb0f92f 100644
--- a/library/HTMLPurifier/ConfigSchema.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema.php
diff --git a/library/HTMLPurifier/ConfigSchema/Builder/ConfigSchema.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Builder/ConfigSchema.php
index d5906cd46..d5906cd46 100644
--- a/library/HTMLPurifier/ConfigSchema/Builder/ConfigSchema.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Builder/ConfigSchema.php
diff --git a/library/HTMLPurifier/ConfigSchema/Builder/Xml.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Builder/Xml.php
index 5fa56f7dd..5fa56f7dd 100644
--- a/library/HTMLPurifier/ConfigSchema/Builder/Xml.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Builder/Xml.php
diff --git a/library/HTMLPurifier/ConfigSchema/Exception.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Exception.php
index 2671516c5..2671516c5 100644
--- a/library/HTMLPurifier/ConfigSchema/Exception.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Exception.php
diff --git a/library/HTMLPurifier/ConfigSchema/Interchange.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange.php
index 0e08ae8fe..0e08ae8fe 100644
--- a/library/HTMLPurifier/ConfigSchema/Interchange.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange.php
diff --git a/library/HTMLPurifier/ConfigSchema/Interchange/Directive.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange/Directive.php
index 127a39a67..127a39a67 100644
--- a/library/HTMLPurifier/ConfigSchema/Interchange/Directive.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange/Directive.php
diff --git a/library/HTMLPurifier/ConfigSchema/Interchange/Id.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange/Id.php
index 126f09d95..126f09d95 100644
--- a/library/HTMLPurifier/ConfigSchema/Interchange/Id.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange/Id.php
diff --git a/library/HTMLPurifier/ConfigSchema/InterchangeBuilder.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/InterchangeBuilder.php
index 655e6dd1b..655e6dd1b 100644
--- a/library/HTMLPurifier/ConfigSchema/InterchangeBuilder.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/InterchangeBuilder.php
diff --git a/library/HTMLPurifier/ConfigSchema/Validator.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Validator.php
index fb3127788..fb3127788 100644
--- a/library/HTMLPurifier/ConfigSchema/Validator.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Validator.php
diff --git a/library/HTMLPurifier/ConfigSchema/ValidatorAtom.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/ValidatorAtom.php
index c9aa3644a..c9aa3644a 100644
--- a/library/HTMLPurifier/ConfigSchema/ValidatorAtom.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/ValidatorAtom.php
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema.ser b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema.ser
new file mode 100644
index 000000000..371e948f1
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema.ser
Binary files differ
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedClasses.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedClasses.txt
index 0517fed0a..0517fed0a 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedClasses.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedClasses.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedFrameTargets.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedFrameTargets.txt
index 249edd647..249edd647 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedFrameTargets.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedFrameTargets.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRel.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRel.txt
index 9a8fa6a2e..9a8fa6a2e 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRel.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRel.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRev.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRev.txt
index b01788348..b01788348 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRev.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRev.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Attr.ClassUseCDATA.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.ClassUseCDATA.txt
index e774b823b..e774b823b 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Attr.ClassUseCDATA.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.ClassUseCDATA.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultImageAlt.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultImageAlt.txt
index 533165e17..533165e17 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultImageAlt.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultImageAlt.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImage.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImage.txt
index 9eb7e3846..9eb7e3846 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImage.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImage.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImageAlt.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImageAlt.txt
index 2f17bf477..2f17bf477 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImageAlt.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImageAlt.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultTextDir.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultTextDir.txt
index 52654b53a..52654b53a 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultTextDir.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultTextDir.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Attr.EnableID.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.EnableID.txt
index 6440d2103..6440d2103 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Attr.EnableID.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.EnableID.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Attr.ForbiddenClasses.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.ForbiddenClasses.txt
index f31d226f5..f31d226f5 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Attr.ForbiddenClasses.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.ForbiddenClasses.txt
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.ID.HTML5.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.ID.HTML5.txt
new file mode 100644
index 000000000..735d4b7a1
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.ID.HTML5.txt
@@ -0,0 +1,10 @@
+Attr.ID.HTML5
+TYPE: bool/null
+DEFAULT: null
+VERSION: 4.8.0
+--DESCRIPTION--
+In HTML5, restrictions on the format of the id attribute have been significantly
+relaxed, such that any string is valid so long as it contains no spaces and
+is at least one character. In lieu of a general HTML5 compatibility flag,
+set this configuration directive to true to use the relaxed rules.
+--# vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklist.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklist.txt
index 5f2b5e3d2..5f2b5e3d2 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklist.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklist.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklistRegexp.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklistRegexp.txt
index 6f5824586..6f5824586 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklistRegexp.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklistRegexp.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefix.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefix.txt
index cc49d43fd..cc49d43fd 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefix.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefix.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefixLocal.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefixLocal.txt
index 2c5924a7a..2c5924a7a 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefixLocal.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefixLocal.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.AutoParagraph.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.AutoParagraph.txt
index d5caa1bb9..d5caa1bb9 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.AutoParagraph.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.AutoParagraph.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.Custom.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.Custom.txt
index 2a476481a..2a476481a 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.Custom.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.Custom.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.DisplayLinkURI.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.DisplayLinkURI.txt
index 663064a34..663064a34 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.DisplayLinkURI.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.DisplayLinkURI.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.Linkify.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.Linkify.txt
index 3a48ba960..3a48ba960 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.Linkify.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.Linkify.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.DocURL.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.DocURL.txt
index db58b1346..db58b1346 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.DocURL.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.DocURL.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.txt
index 7996488be..7996488be 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.txt
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.Predicate.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.Predicate.txt
new file mode 100644
index 000000000..6367fe23c
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.Predicate.txt
@@ -0,0 +1,14 @@
+AutoFormat.RemoveEmpty.Predicate
+TYPE: hash
+VERSION: 4.7.0
+DEFAULT: array('colgroup' => array(), 'th' => array(), 'td' => array(), 'iframe' => array('src'))
+--DESCRIPTION--
+<p>
+ Given that an element has no contents, it will be removed by default, unless
+ this predicate dictates otherwise. The predicate can either be an associative
+ map from tag name to list of attributes that must be present for the element
+ to be considered preserved: thus, the default always preserves <code>colgroup</code>,
+ <code>th</code> and <code>td</code>, and also <code>iframe</code> if it
+ has a <code>src</code>.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions.txt
index 35c393b4e..35c393b4e 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.txt
index ca17eb1dc..ca17eb1dc 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.txt
index 34657ba47..34657ba47 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveSpansWithoutAttributes.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveSpansWithoutAttributes.txt
index dde990ab2..dde990ab2 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveSpansWithoutAttributes.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveSpansWithoutAttributes.txt
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowDuplicates.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowDuplicates.txt
new file mode 100644
index 000000000..4d054b1f0
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowDuplicates.txt
@@ -0,0 +1,11 @@
+CSS.AllowDuplicates
+TYPE: bool
+DEFAULT: false
+VERSION: 4.8.0
+--DESCRIPTION--
+<p>
+ By default, HTML Purifier removes duplicate CSS properties,
+ like <code>color:red; color:blue</code>. If this is set to
+ true, duplicate properties are allowed.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowImportant.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowImportant.txt
index b324608f7..b324608f7 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowImportant.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowImportant.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowTricky.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowTricky.txt
index 748be0eec..748be0eec 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowTricky.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowTricky.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowedFonts.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowedFonts.txt
index 3fd465406..3fd465406 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowedFonts.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowedFonts.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowedProperties.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowedProperties.txt
index 460112ebe..460112ebe 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowedProperties.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowedProperties.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/CSS.DefinitionRev.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.DefinitionRev.txt
index 5cb7dda3b..5cb7dda3b 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/CSS.DefinitionRev.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.DefinitionRev.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/CSS.ForbiddenProperties.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.ForbiddenProperties.txt
index f1f5c5f12..f1f5c5f12 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/CSS.ForbiddenProperties.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.ForbiddenProperties.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/CSS.MaxImgLength.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.MaxImgLength.txt
index 7a3291470..7a3291470 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/CSS.MaxImgLength.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.MaxImgLength.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/CSS.Proprietary.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.Proprietary.txt
index 148eedb8b..148eedb8b 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/CSS.Proprietary.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.Proprietary.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/CSS.Trusted.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.Trusted.txt
index e733a61e8..e733a61e8 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/CSS.Trusted.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.Trusted.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Cache.DefinitionImpl.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Cache.DefinitionImpl.txt
index c486724c8..c486724c8 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Cache.DefinitionImpl.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Cache.DefinitionImpl.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPath.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPath.txt
index 54036507d..54036507d 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPath.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPath.txt
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPermissions.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPermissions.txt
new file mode 100644
index 000000000..2e0cc8104
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPermissions.txt
@@ -0,0 +1,16 @@
+Cache.SerializerPermissions
+TYPE: int/null
+VERSION: 4.3.0
+DEFAULT: 0755
+--DESCRIPTION--
+
+<p>
+ Directory permissions of the files and directories created inside
+ the DefinitionCache/Serializer or other custom serializer path.
+</p>
+<p>
+ In HTML Purifier 4.8.0, this also supports <code>NULL</code>,
+ which means that no chmod'ing or directory creation shall
+ occur.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyFixLt.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyFixLt.txt
index 568cbf3b3..568cbf3b3 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyFixLt.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyFixLt.txt
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyRemoveScript.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyRemoveScript.txt
new file mode 100644
index 000000000..b2b6ab149
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyRemoveScript.txt
@@ -0,0 +1,16 @@
+Core.AggressivelyRemoveScript
+TYPE: bool
+VERSION: 4.9.0
+DEFAULT: true
+--DESCRIPTION--
+<p>
+ This directive enables aggressive pre-filter removal of
+ script tags. This is not necessary for security,
+ but it can help work around a bug in libxml where embedded
+ HTML elements inside script sections cause the parser to
+ choke. To revert to pre-4.9.0 behavior, set this to false.
+ This directive has no effect if %Core.Trusted is true,
+ %Core.RemoveScriptContents is false, or %Core.HiddenElements
+ does not contain script.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Core.AllowHostnameUnderscore.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.AllowHostnameUnderscore.txt
index 2c910cc7d..2c910cc7d 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Core.AllowHostnameUnderscore.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.AllowHostnameUnderscore.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Core.CollectErrors.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.CollectErrors.txt
index d7317911f..d7317911f 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Core.CollectErrors.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.CollectErrors.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Core.ColorKeywords.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.ColorKeywords.txt
index c572c14ec..c572c14ec 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Core.ColorKeywords.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.ColorKeywords.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Core.ConvertDocumentToFragment.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.ConvertDocumentToFragment.txt
index 64b114fce..64b114fce 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Core.ConvertDocumentToFragment.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.ConvertDocumentToFragment.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Core.DirectLexLineNumberSyncInterval.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.DirectLexLineNumberSyncInterval.txt
index 36f16e07e..36f16e07e 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Core.DirectLexLineNumberSyncInterval.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.DirectLexLineNumberSyncInterval.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Core.DisableExcludes.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.DisableExcludes.txt
index 1cd4c2c96..1cd4c2c96 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Core.DisableExcludes.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.DisableExcludes.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Core.EnableIDNA.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EnableIDNA.txt
index ce243c35d..ce243c35d 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Core.EnableIDNA.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EnableIDNA.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Core.Encoding.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.Encoding.txt
index 8bfb47c3a..8bfb47c3a 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Core.Encoding.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.Encoding.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidChildren.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidChildren.txt
index a3881be75..a3881be75 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidChildren.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidChildren.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidTags.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidTags.txt
index a7a5b249b..a7a5b249b 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidTags.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidTags.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeNonASCIICharacters.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeNonASCIICharacters.txt
index abb499948..abb499948 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeNonASCIICharacters.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeNonASCIICharacters.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Core.HiddenElements.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.HiddenElements.txt
index 915391edb..915391edb 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Core.HiddenElements.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.HiddenElements.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Core.Language.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.Language.txt
index 233fca14f..233fca14f 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Core.Language.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.Language.txt
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.LegacyEntityDecoder.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.LegacyEntityDecoder.txt
new file mode 100644
index 000000000..392b43649
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.LegacyEntityDecoder.txt
@@ -0,0 +1,36 @@
+Core.LegacyEntityDecoder
+TYPE: bool
+VERSION: 4.9.0
+DEFAULT: false
+--DESCRIPTION--
+<p>
+ Prior to HTML Purifier 4.9.0, entities were decoded by performing
+ a global search replace for all entities whose decoded versions
+ did not have special meanings under HTML, and replaced them with
+ their decoded versions. We would match all entities, even if they did
+ not have a trailing semicolon, but only if there weren't any trailing
+ alphanumeric characters.
+</p>
+<table>
+<tr><th>Original</th><th>Text</th><th>Attribute</th></tr>
+<tr><td>&amp;yen;</td><td>&yen;</td><td>&yen;</td></tr>
+<tr><td>&amp;yen</td><td>&yen;</td><td>&yen;</td></tr>
+<tr><td>&amp;yena</td><td>&amp;yena</td><td>&amp;yena</td></tr>
+<tr><td>&amp;yen=</td><td>&yen;=</td><td>&yen;=</td></tr>
+</table>
+<p>
+ In HTML Purifier 4.9.0, we changed the behavior of entity parsing
+ to match entities that had missing trailing semicolons in less
+ cases, to more closely match HTML5 parsing behavior:
+</p>
+<table>
+<tr><th>Original</th><th>Text</th><th>Attribute</th></tr>
+<tr><td>&amp;yen;</td><td>&yen;</td><td>&yen;</td></tr>
+<tr><td>&amp;yen</td><td>&yen;</td><td>&yen;</td></tr>
+<tr><td>&amp;yena</td><td>&yen;a</td><td>&amp;yena</td></tr>
+<tr><td>&amp;yen=</td><td>&yen;=</td><td>&amp;yen=</td></tr>
+</table>
+<p>
+ This flag reverts back to pre-HTML Purifier 4.9.0 behavior.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Core.LexerImpl.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.LexerImpl.txt
index 8983e2cca..8983e2cca 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Core.LexerImpl.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.LexerImpl.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Core.MaintainLineNumbers.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.MaintainLineNumbers.txt
index eb841a759..eb841a759 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Core.MaintainLineNumbers.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.MaintainLineNumbers.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Core.NormalizeNewlines.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.NormalizeNewlines.txt
index d77f5360d..d77f5360d 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Core.NormalizeNewlines.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.NormalizeNewlines.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveInvalidImg.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveInvalidImg.txt
index 4070c2a0d..4070c2a0d 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveInvalidImg.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveInvalidImg.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveProcessingInstructions.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveProcessingInstructions.txt
index 3397d9f71..3397d9f71 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveProcessingInstructions.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveProcessingInstructions.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveScriptContents.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveScriptContents.txt
index a4cd966df..a4cd966df 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveScriptContents.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveScriptContents.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Filter.Custom.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.Custom.txt
index 3db50ef20..3db50ef20 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Filter.Custom.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.Custom.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Escaping.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Escaping.txt
index 16829bcda..16829bcda 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Escaping.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Escaping.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Scope.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Scope.txt
index 7f95f54d1..7f95f54d1 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Scope.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Scope.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.TidyImpl.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.TidyImpl.txt
index 6c231b2d7..6c231b2d7 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.TidyImpl.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.TidyImpl.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.txt
index 078d08741..078d08741 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Filter.YouTube.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.YouTube.txt
index 321eaa2d8..321eaa2d8 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Filter.YouTube.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.YouTube.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/HTML.Allowed.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Allowed.txt
index 0b2c106da..0b2c106da 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/HTML.Allowed.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Allowed.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedAttributes.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedAttributes.txt
index fcf093f17..fcf093f17 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedAttributes.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedAttributes.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedComments.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedComments.txt
index 140e21423..140e21423 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedComments.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedComments.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedCommentsRegexp.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedCommentsRegexp.txt
index f22e977d4..f22e977d4 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedCommentsRegexp.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedCommentsRegexp.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedElements.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedElements.txt
index 1d3fa7907..1d3fa7907 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedElements.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedElements.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedModules.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedModules.txt
index 5a59a55c0..5a59a55c0 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedModules.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedModules.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/HTML.Attr.Name.UseCDATA.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Attr.Name.UseCDATA.txt
index 151fb7b82..151fb7b82 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/HTML.Attr.Name.UseCDATA.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Attr.Name.UseCDATA.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/HTML.BlockWrapper.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.BlockWrapper.txt
index 45ae469ec..45ae469ec 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/HTML.BlockWrapper.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.BlockWrapper.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/HTML.CoreModules.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.CoreModules.txt
index 524618879..524618879 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/HTML.CoreModules.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.CoreModules.txt
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.CustomDoctype.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.CustomDoctype.txt
new file mode 100644
index 000000000..6ed70b599
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.CustomDoctype.txt
@@ -0,0 +1,9 @@
+HTML.CustomDoctype
+TYPE: string/null
+VERSION: 2.0.1
+DEFAULT: NULL
+--DESCRIPTION--
+
+A custom doctype for power-users who defined their own document
+type. This directive only applies when %HTML.Doctype is blank.
+--# vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionID.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionID.txt
index 103db754a..103db754a 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionID.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionID.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionRev.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionRev.txt
index 229ae0267..229ae0267 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionRev.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionRev.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/HTML.Doctype.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Doctype.txt
index 9dab497f2..9dab497f2 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/HTML.Doctype.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Doctype.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/HTML.FlashAllowFullScreen.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.FlashAllowFullScreen.txt
index 7878dc0bf..7878dc0bf 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/HTML.FlashAllowFullScreen.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.FlashAllowFullScreen.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenAttributes.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenAttributes.txt
index 57358f9ba..57358f9ba 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenAttributes.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenAttributes.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenElements.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenElements.txt
index 93a53e14f..93a53e14f 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenElements.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenElements.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/HTML.MaxImgLength.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.MaxImgLength.txt
index e424c386e..e424c386e 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/HTML.MaxImgLength.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.MaxImgLength.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/HTML.Nofollow.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Nofollow.txt
index 700b30924..700b30924 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/HTML.Nofollow.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Nofollow.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/HTML.Parent.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Parent.txt
index 62e8e160c..62e8e160c 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/HTML.Parent.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Parent.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/HTML.Proprietary.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Proprietary.txt
index dfb720496..dfb720496 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/HTML.Proprietary.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Proprietary.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeEmbed.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeEmbed.txt
index cdda09a4c..cdda09a4c 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeEmbed.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeEmbed.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeIframe.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeIframe.txt
index 5eb6ec2b5..5eb6ec2b5 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeIframe.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeIframe.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeObject.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeObject.txt
index ceb342e22..ceb342e22 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeObject.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeObject.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeScripting.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeScripting.txt
index 5ebc7a19d..5ebc7a19d 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeScripting.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeScripting.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/HTML.Strict.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Strict.txt
index a8b1de56b..a8b1de56b 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/HTML.Strict.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Strict.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/HTML.TargetBlank.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TargetBlank.txt
index 587a16778..587a16778 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/HTML.TargetBlank.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TargetBlank.txt
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TargetNoopener.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TargetNoopener.txt
new file mode 100644
index 000000000..dd514c0de
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TargetNoopener.txt
@@ -0,0 +1,10 @@
+--# vim: et sw=4 sts=4
+HTML.TargetNoopener
+TYPE: bool
+VERSION: 4.8.0
+DEFAULT: TRUE
+--DESCRIPTION--
+If enabled, noopener rel attributes are added to links which have
+a target attribute associated with them. This prevents malicious
+destinations from overwriting the original window.
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TargetNoreferrer.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TargetNoreferrer.txt
new file mode 100644
index 000000000..cb5a0b0e5
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TargetNoreferrer.txt
@@ -0,0 +1,9 @@
+HTML.TargetNoreferrer
+TYPE: bool
+VERSION: 4.8.0
+DEFAULT: TRUE
+--DESCRIPTION--
+If enabled, noreferrer rel attributes are added to links which have
+a target attribute associated with them. This prevents malicious
+destinations from overwriting the original window.
+--# vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyAdd.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyAdd.txt
index b4c271b7f..b4c271b7f 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyAdd.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyAdd.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyLevel.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyLevel.txt
index 4186ccd0d..4186ccd0d 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyLevel.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyLevel.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyRemove.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyRemove.txt
index 996762bd1..996762bd1 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyRemove.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyRemove.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/HTML.Trusted.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Trusted.txt
index 1db9237e9..1db9237e9 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/HTML.Trusted.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Trusted.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/HTML.XHTML.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.XHTML.txt
index 2a47e384f..2a47e384f 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/HTML.XHTML.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.XHTML.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Output.CommentScriptContents.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.CommentScriptContents.txt
index 08921fde7..08921fde7 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Output.CommentScriptContents.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.CommentScriptContents.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Output.FixInnerHTML.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.FixInnerHTML.txt
index d6f0d9f29..d6f0d9f29 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Output.FixInnerHTML.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.FixInnerHTML.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Output.FlashCompat.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.FlashCompat.txt
index 93398e859..93398e859 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Output.FlashCompat.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.FlashCompat.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Output.Newline.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.Newline.txt
index 79f8ad82c..79f8ad82c 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Output.Newline.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.Newline.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Output.SortAttr.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.SortAttr.txt
index 232b02362..232b02362 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Output.SortAttr.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.SortAttr.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Output.TidyFormat.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.TidyFormat.txt
index 06bab00a0..06bab00a0 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Output.TidyFormat.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.TidyFormat.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Test.ForceNoIconv.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Test.ForceNoIconv.txt
index 071bc0295..071bc0295 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Test.ForceNoIconv.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Test.ForceNoIconv.txt
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.AllowedSchemes.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.AllowedSchemes.txt
new file mode 100644
index 000000000..eb97307e2
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.AllowedSchemes.txt
@@ -0,0 +1,18 @@
+URI.AllowedSchemes
+TYPE: lookup
+--DEFAULT--
+array (
+ 'http' => true,
+ 'https' => true,
+ 'mailto' => true,
+ 'ftp' => true,
+ 'nntp' => true,
+ 'news' => true,
+ 'tel' => true,
+)
+--DESCRIPTION--
+Whitelist that defines the schemes that a URI is allowed to have. This
+prevents XSS attacks from using pseudo-schemes like javascript or mocha.
+There is also support for the <code>data</code> and <code>file</code>
+URI schemes, but they are not enabled by default.
+--# vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/ConfigSchema/schema/URI.Base.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Base.txt
index 876f0680c..876f0680c 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/URI.Base.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Base.txt
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefaultScheme.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefaultScheme.txt
new file mode 100644
index 000000000..834bc08c0
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefaultScheme.txt
@@ -0,0 +1,15 @@
+URI.DefaultScheme
+TYPE: string/null
+DEFAULT: 'http'
+--DESCRIPTION--
+
+<p>
+ Defines through what scheme the output will be served, in order to
+ select the proper object validator when no scheme information is present.
+</p>
+
+<p>
+ Starting with HTML Purifier 4.9.0, the default scheme can be null, in
+ which case we reject all URIs which do not have explicit schemes.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionID.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionID.txt
index f05312ba8..f05312ba8 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionID.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionID.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionRev.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionRev.txt
index 80cfea93f..80cfea93f 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionRev.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionRev.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/URI.Disable.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Disable.txt
index 71ce025a2..71ce025a2 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/URI.Disable.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Disable.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternal.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternal.txt
index 13c122c8c..13c122c8c 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternal.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternal.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternalResources.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternalResources.txt
index abcc1efd6..abcc1efd6 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternalResources.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternalResources.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/URI.DisableResources.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DisableResources.txt
index f891de499..f891de499 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/URI.DisableResources.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DisableResources.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/URI.Host.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Host.txt
index ee83b121d..ee83b121d 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/URI.Host.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Host.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/URI.HostBlacklist.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.HostBlacklist.txt
index 0b6df7625..0b6df7625 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/URI.HostBlacklist.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.HostBlacklist.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/URI.MakeAbsolute.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.MakeAbsolute.txt
index 4214900a5..4214900a5 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/URI.MakeAbsolute.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.MakeAbsolute.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/URI.Munge.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Munge.txt
index 58c81dcc4..58c81dcc4 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/URI.Munge.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Munge.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/URI.MungeResources.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.MungeResources.txt
index 6fce0fdc3..6fce0fdc3 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/URI.MungeResources.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.MungeResources.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/URI.MungeSecretKey.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.MungeSecretKey.txt
index 1e17c1d46..1e17c1d46 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/URI.MungeSecretKey.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.MungeSecretKey.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/URI.OverrideAllowedSchemes.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.OverrideAllowedSchemes.txt
index 23331a4e7..23331a4e7 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/URI.OverrideAllowedSchemes.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.OverrideAllowedSchemes.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/URI.SafeIframeRegexp.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.SafeIframeRegexp.txt
index 79084832b..79084832b 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/URI.SafeIframeRegexp.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.SafeIframeRegexp.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/info.ini b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/info.ini
index 5de4505e1..5de4505e1 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/info.ini
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/info.ini
diff --git a/library/HTMLPurifier/ContentSets.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ContentSets.php
index 543e3f8f1..543e3f8f1 100644
--- a/library/HTMLPurifier/ContentSets.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ContentSets.php
diff --git a/library/HTMLPurifier/Context.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Context.php
index 00e509c85..00e509c85 100644
--- a/library/HTMLPurifier/Context.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Context.php
diff --git a/library/HTMLPurifier/Definition.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Definition.php
index bc6d43364..bc6d43364 100644
--- a/library/HTMLPurifier/Definition.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Definition.php
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache.php
new file mode 100644
index 000000000..9aa8ff354
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache.php
@@ -0,0 +1,129 @@
+<?php
+
+/**
+ * Abstract class representing Definition cache managers that implements
+ * useful common methods and is a factory.
+ * @todo Create a separate maintenance file advanced users can use to
+ * cache their custom HTMLDefinition, which can be loaded
+ * via a configuration directive
+ * @todo Implement memcached
+ */
+abstract class HTMLPurifier_DefinitionCache
+{
+ /**
+ * @type string
+ */
+ public $type;
+
+ /**
+ * @param string $type Type of definition objects this instance of the
+ * cache will handle.
+ */
+ public function __construct($type)
+ {
+ $this->type = $type;
+ }
+
+ /**
+ * Generates a unique identifier for a particular configuration
+ * @param HTMLPurifier_Config $config Instance of HTMLPurifier_Config
+ * @return string
+ */
+ public function generateKey($config)
+ {
+ return $config->version . ',' . // possibly replace with function calls
+ $config->getBatchSerial($this->type) . ',' .
+ $config->get($this->type . '.DefinitionRev');
+ }
+
+ /**
+ * Tests whether or not a key is old with respect to the configuration's
+ * version and revision number.
+ * @param string $key Key to test
+ * @param HTMLPurifier_Config $config Instance of HTMLPurifier_Config to test against
+ * @return bool
+ */
+ public function isOld($key, $config)
+ {
+ if (substr_count($key, ',') < 2) {
+ return true;
+ }
+ list($version, $hash, $revision) = explode(',', $key, 3);
+ $compare = version_compare($version, $config->version);
+ // version mismatch, is always old
+ if ($compare != 0) {
+ return true;
+ }
+ // versions match, ids match, check revision number
+ if ($hash == $config->getBatchSerial($this->type) &&
+ $revision < $config->get($this->type . '.DefinitionRev')) {
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Checks if a definition's type jives with the cache's type
+ * @note Throws an error on failure
+ * @param HTMLPurifier_Definition $def Definition object to check
+ * @return bool true if good, false if not
+ */
+ public function checkDefType($def)
+ {
+ if ($def->type !== $this->type) {
+ trigger_error("Cannot use definition of type {$def->type} in cache for {$this->type}");
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Adds a definition object to the cache
+ * @param HTMLPurifier_Definition $def
+ * @param HTMLPurifier_Config $config
+ */
+ abstract public function add($def, $config);
+
+ /**
+ * Unconditionally saves a definition object to the cache
+ * @param HTMLPurifier_Definition $def
+ * @param HTMLPurifier_Config $config
+ */
+ abstract public function set($def, $config);
+
+ /**
+ * Replace an object in the cache
+ * @param HTMLPurifier_Definition $def
+ * @param HTMLPurifier_Config $config
+ */
+ abstract public function replace($def, $config);
+
+ /**
+ * Retrieves a definition object from the cache
+ * @param HTMLPurifier_Config $config
+ */
+ abstract public function get($config);
+
+ /**
+ * Removes a definition object to the cache
+ * @param HTMLPurifier_Config $config
+ */
+ abstract public function remove($config);
+
+ /**
+ * Clears all objects from cache
+ * @param HTMLPurifier_Config $config
+ */
+ abstract public function flush($config);
+
+ /**
+ * Clears all expired (older version or revision) objects from cache
+ * @note Be careful implementing this method as flush. Flush must
+ * not interfere with other Definition types, and cleanup()
+ * should not be repeatedly called by userland code.
+ * @param HTMLPurifier_Config $config
+ */
+ abstract public function cleanup($config);
+}
+
+// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/DefinitionCache/Decorator.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator.php
index b57a51b6c..b57a51b6c 100644
--- a/library/HTMLPurifier/DefinitionCache/Decorator.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator.php
diff --git a/library/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php
index 4991777ce..4991777ce 100644
--- a/library/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php
diff --git a/library/HTMLPurifier/DefinitionCache/Decorator/Memory.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Memory.php
index d529dce48..d529dce48 100644
--- a/library/HTMLPurifier/DefinitionCache/Decorator/Memory.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Memory.php
diff --git a/library/HTMLPurifier/DefinitionCache/Decorator/Template.php.in b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Template.php.in
index b1fec8d36..b1fec8d36 100644
--- a/library/HTMLPurifier/DefinitionCache/Decorator/Template.php.in
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Template.php.in
diff --git a/library/HTMLPurifier/DefinitionCache/Null.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Null.php
index d9a75ce22..d9a75ce22 100644
--- a/library/HTMLPurifier/DefinitionCache/Null.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Null.php
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Serializer.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Serializer.php
new file mode 100644
index 000000000..952e48d47
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Serializer.php
@@ -0,0 +1,306 @@
+<?php
+
+class HTMLPurifier_DefinitionCache_Serializer extends HTMLPurifier_DefinitionCache
+{
+
+ /**
+ * @param HTMLPurifier_Definition $def
+ * @param HTMLPurifier_Config $config
+ * @return int|bool
+ */
+ public function add($def, $config)
+ {
+ if (!$this->checkDefType($def)) {
+ return;
+ }
+ $file = $this->generateFilePath($config);
+ if (file_exists($file)) {
+ return false;
+ }
+ if (!$this->_prepareDir($config)) {
+ return false;
+ }
+ return $this->_write($file, serialize($def), $config);
+ }
+
+ /**
+ * @param HTMLPurifier_Definition $def
+ * @param HTMLPurifier_Config $config
+ * @return int|bool
+ */
+ public function set($def, $config)
+ {
+ if (!$this->checkDefType($def)) {
+ return;
+ }
+ $file = $this->generateFilePath($config);
+ if (!$this->_prepareDir($config)) {
+ return false;
+ }
+ return $this->_write($file, serialize($def), $config);
+ }
+
+ /**
+ * @param HTMLPurifier_Definition $def
+ * @param HTMLPurifier_Config $config
+ * @return int|bool
+ */
+ public function replace($def, $config)
+ {
+ if (!$this->checkDefType($def)) {
+ return;
+ }
+ $file = $this->generateFilePath($config);
+ if (!file_exists($file)) {
+ return false;
+ }
+ if (!$this->_prepareDir($config)) {
+ return false;
+ }
+ return $this->_write($file, serialize($def), $config);
+ }
+
+ /**
+ * @param HTMLPurifier_Config $config
+ * @return bool|HTMLPurifier_Config
+ */
+ public function get($config)
+ {
+ $file = $this->generateFilePath($config);
+ if (!file_exists($file)) {
+ return false;
+ }
+ return unserialize(file_get_contents($file));
+ }
+
+ /**
+ * @param HTMLPurifier_Config $config
+ * @return bool
+ */
+ public function remove($config)
+ {
+ $file = $this->generateFilePath($config);
+ if (!file_exists($file)) {
+ return false;
+ }
+ return unlink($file);
+ }
+
+ /**
+ * @param HTMLPurifier_Config $config
+ * @return bool
+ */
+ public function flush($config)
+ {
+ if (!$this->_prepareDir($config)) {
+ return false;
+ }
+ $dir = $this->generateDirectoryPath($config);
+ $dh = opendir($dir);
+ // Apparently, on some versions of PHP, readdir will return
+ // an empty string if you pass an invalid argument to readdir.
+ // So you need this test. See #49.
+ if (false === $dh) {
+ return false;
+ }
+ while (false !== ($filename = readdir($dh))) {
+ if (empty($filename)) {
+ continue;
+ }
+ if ($filename[0] === '.') {
+ continue;
+ }
+ unlink($dir . '/' . $filename);
+ }
+ closedir($dh);
+ return true;
+ }
+
+ /**
+ * @param HTMLPurifier_Config $config
+ * @return bool
+ */
+ public function cleanup($config)
+ {
+ if (!$this->_prepareDir($config)) {
+ return false;
+ }
+ $dir = $this->generateDirectoryPath($config);
+ $dh = opendir($dir);
+ // See #49 (and above).
+ if (false === $dh) {
+ return false;
+ }
+ while (false !== ($filename = readdir($dh))) {
+ if (empty($filename)) {
+ continue;
+ }
+ if ($filename[0] === '.') {
+ continue;
+ }
+ $key = substr($filename, 0, strlen($filename) - 4);
+ if ($this->isOld($key, $config)) {
+ unlink($dir . '/' . $filename);
+ }
+ }
+ closedir($dh);
+ return true;
+ }
+
+ /**
+ * Generates the file path to the serial file corresponding to
+ * the configuration and definition name
+ * @param HTMLPurifier_Config $config
+ * @return string
+ * @todo Make protected
+ */
+ public function generateFilePath($config)
+ {
+ $key = $this->generateKey($config);
+ return $this->generateDirectoryPath($config) . '/' . $key . '.ser';
+ }
+
+ /**
+ * Generates the path to the directory contain this cache's serial files
+ * @param HTMLPurifier_Config $config
+ * @return string
+ * @note No trailing slash
+ * @todo Make protected
+ */
+ public function generateDirectoryPath($config)
+ {
+ $base = $this->generateBaseDirectoryPath($config);
+ return $base . '/' . $this->type;
+ }
+
+ /**
+ * Generates path to base directory that contains all definition type
+ * serials
+ * @param HTMLPurifier_Config $config
+ * @return mixed|string
+ * @todo Make protected
+ */
+ public function generateBaseDirectoryPath($config)
+ {
+ $base = $config->get('Cache.SerializerPath');
+ $base = is_null($base) ? HTMLPURIFIER_PREFIX . '/HTMLPurifier/DefinitionCache/Serializer' : $base;
+ return $base;
+ }
+
+ /**
+ * Convenience wrapper function for file_put_contents
+ * @param string $file File name to write to
+ * @param string $data Data to write into file
+ * @param HTMLPurifier_Config $config
+ * @return int|bool Number of bytes written if success, or false if failure.
+ */
+ private function _write($file, $data, $config)
+ {
+ $result = file_put_contents($file, $data);
+ if ($result !== false) {
+ // set permissions of the new file (no execute)
+ $chmod = $config->get('Cache.SerializerPermissions');
+ if ($chmod !== null) {
+ chmod($file, $chmod & 0666);
+ }
+ }
+ return $result;
+ }
+
+ /**
+ * Prepares the directory that this type stores the serials in
+ * @param HTMLPurifier_Config $config
+ * @return bool True if successful
+ */
+ private function _prepareDir($config)
+ {
+ $directory = $this->generateDirectoryPath($config);
+ $chmod = $config->get('Cache.SerializerPermissions');
+ if ($chmod === null) {
+ // TODO: This races
+ if (is_dir($directory)) return true;
+ return mkdir($directory);
+ }
+ if (!is_dir($directory)) {
+ $base = $this->generateBaseDirectoryPath($config);
+ if (!is_dir($base)) {
+ trigger_error(
+ 'Base directory ' . $base . ' does not exist,
+ please create or change using %Cache.SerializerPath',
+ E_USER_WARNING
+ );
+ return false;
+ } elseif (!$this->_testPermissions($base, $chmod)) {
+ return false;
+ }
+ if (!mkdir($directory, $chmod)) {
+ trigger_error(
+ 'Could not create directory ' . $directory . '',
+ E_USER_WARNING
+ );
+ return false;
+ }
+ if (!$this->_testPermissions($directory, $chmod)) {
+ return false;
+ }
+ } elseif (!$this->_testPermissions($directory, $chmod)) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Tests permissions on a directory and throws out friendly
+ * error messages and attempts to chmod it itself if possible
+ * @param string $dir Directory path
+ * @param int $chmod Permissions
+ * @return bool True if directory is writable
+ */
+ private function _testPermissions($dir, $chmod)
+ {
+ // early abort, if it is writable, everything is hunky-dory
+ if (is_writable($dir)) {
+ return true;
+ }
+ if (!is_dir($dir)) {
+ // generally, you'll want to handle this beforehand
+ // so a more specific error message can be given
+ trigger_error(
+ 'Directory ' . $dir . ' does not exist',
+ E_USER_WARNING
+ );
+ return false;
+ }
+ if (function_exists('posix_getuid') && $chmod !== null) {
+ // POSIX system, we can give more specific advice
+ if (fileowner($dir) === posix_getuid()) {
+ // we can chmod it ourselves
+ $chmod = $chmod | 0700;
+ if (chmod($dir, $chmod)) {
+ return true;
+ }
+ } elseif (filegroup($dir) === posix_getgid()) {
+ $chmod = $chmod | 0070;
+ } else {
+ // PHP's probably running as nobody, so we'll
+ // need to give global permissions
+ $chmod = $chmod | 0777;
+ }
+ trigger_error(
+ 'Directory ' . $dir . ' not writable, ' .
+ 'please chmod to ' . decoct($chmod),
+ E_USER_WARNING
+ );
+ } else {
+ // generic error message
+ trigger_error(
+ 'Directory ' . $dir . ' not writable, ' .
+ 'please alter file permissions',
+ E_USER_WARNING
+ );
+ }
+ return false;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/DefinitionCache/Serializer/README b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Serializer/README
index 2e35c1c3d..2e35c1c3d 100644..100755
--- a/library/HTMLPurifier/DefinitionCache/Serializer/README
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Serializer/README
diff --git a/library/HTMLPurifier/DefinitionCacheFactory.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCacheFactory.php
index fd1cc9be4..fd1cc9be4 100644
--- a/library/HTMLPurifier/DefinitionCacheFactory.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCacheFactory.php
diff --git a/library/HTMLPurifier/Doctype.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Doctype.php
index 4acd06e5b..4acd06e5b 100644
--- a/library/HTMLPurifier/Doctype.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Doctype.php
diff --git a/library/HTMLPurifier/DoctypeRegistry.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DoctypeRegistry.php
index acc1d64a6..acc1d64a6 100644
--- a/library/HTMLPurifier/DoctypeRegistry.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DoctypeRegistry.php
diff --git a/library/HTMLPurifier/ElementDef.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ElementDef.php
index d5311cedc..d5311cedc 100644
--- a/library/HTMLPurifier/ElementDef.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ElementDef.php
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Encoder.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Encoder.php
new file mode 100644
index 000000000..b94f17542
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Encoder.php
@@ -0,0 +1,617 @@
+<?php
+
+/**
+ * A UTF-8 specific character encoder that handles cleaning and transforming.
+ * @note All functions in this class should be static.
+ */
+class HTMLPurifier_Encoder
+{
+
+ /**
+ * Constructor throws fatal error if you attempt to instantiate class
+ */
+ private function __construct()
+ {
+ trigger_error('Cannot instantiate encoder, call methods statically', E_USER_ERROR);
+ }
+
+ /**
+ * Error-handler that mutes errors, alternative to shut-up operator.
+ */
+ public static function muteErrorHandler()
+ {
+ }
+
+ /**
+ * iconv wrapper which mutes errors, but doesn't work around bugs.
+ * @param string $in Input encoding
+ * @param string $out Output encoding
+ * @param string $text The text to convert
+ * @return string
+ */
+ public static function unsafeIconv($in, $out, $text)
+ {
+ set_error_handler(array('HTMLPurifier_Encoder', 'muteErrorHandler'));
+ $r = iconv($in, $out, $text);
+ restore_error_handler();
+ return $r;
+ }
+
+ /**
+ * iconv wrapper which mutes errors and works around bugs.
+ * @param string $in Input encoding
+ * @param string $out Output encoding
+ * @param string $text The text to convert
+ * @param int $max_chunk_size
+ * @return string
+ */
+ public static function iconv($in, $out, $text, $max_chunk_size = 8000)
+ {
+ $code = self::testIconvTruncateBug();
+ if ($code == self::ICONV_OK) {
+ return self::unsafeIconv($in, $out, $text);
+ } elseif ($code == self::ICONV_TRUNCATES) {
+ // we can only work around this if the input character set
+ // is utf-8
+ if ($in == 'utf-8') {
+ if ($max_chunk_size < 4) {
+ trigger_error('max_chunk_size is too small', E_USER_WARNING);
+ return false;
+ }
+ // split into 8000 byte chunks, but be careful to handle
+ // multibyte boundaries properly
+ if (($c = strlen($text)) <= $max_chunk_size) {
+ return self::unsafeIconv($in, $out, $text);
+ }
+ $r = '';
+ $i = 0;
+ while (true) {
+ if ($i + $max_chunk_size >= $c) {
+ $r .= self::unsafeIconv($in, $out, substr($text, $i));
+ break;
+ }
+ // wibble the boundary
+ if (0x80 != (0xC0 & ord($text[$i + $max_chunk_size]))) {
+ $chunk_size = $max_chunk_size;
+ } elseif (0x80 != (0xC0 & ord($text[$i + $max_chunk_size - 1]))) {
+ $chunk_size = $max_chunk_size - 1;
+ } elseif (0x80 != (0xC0 & ord($text[$i + $max_chunk_size - 2]))) {
+ $chunk_size = $max_chunk_size - 2;
+ } elseif (0x80 != (0xC0 & ord($text[$i + $max_chunk_size - 3]))) {
+ $chunk_size = $max_chunk_size - 3;
+ } else {
+ return false; // rather confusing UTF-8...
+ }
+ $chunk = substr($text, $i, $chunk_size); // substr doesn't mind overlong lengths
+ $r .= self::unsafeIconv($in, $out, $chunk);
+ $i += $chunk_size;
+ }
+ return $r;
+ } else {
+ return false;
+ }
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * Cleans a UTF-8 string for well-formedness and SGML validity
+ *
+ * It will parse according to UTF-8 and return a valid UTF8 string, with
+ * non-SGML codepoints excluded.
+ *
+ * Specifically, it will permit:
+ * \x{9}\x{A}\x{D}\x{20}-\x{7E}\x{A0}-\x{D7FF}\x{E000}-\x{FFFD}\x{10000}-\x{10FFFF}
+ * Source: https://www.w3.org/TR/REC-xml/#NT-Char
+ * Arguably this function should be modernized to the HTML5 set
+ * of allowed characters:
+ * https://www.w3.org/TR/html5/syntax.html#preprocessing-the-input-stream
+ * which simultaneously expand and restrict the set of allowed characters.
+ *
+ * @param string $str The string to clean
+ * @param bool $force_php
+ * @return string
+ *
+ * @note Just for reference, the non-SGML code points are 0 to 31 and
+ * 127 to 159, inclusive. However, we allow code points 9, 10
+ * and 13, which are the tab, line feed and carriage return
+ * respectively. 128 and above the code points map to multibyte
+ * UTF-8 representations.
+ *
+ * @note Fallback code adapted from utf8ToUnicode by Henri Sivonen and
+ * hsivonen@iki.fi at <http://iki.fi/hsivonen/php-utf8/> under the
+ * LGPL license. Notes on what changed are inside, but in general,
+ * the original code transformed UTF-8 text into an array of integer
+ * Unicode codepoints. Understandably, transforming that back to
+ * a string would be somewhat expensive, so the function was modded to
+ * directly operate on the string. However, this discourages code
+ * reuse, and the logic enumerated here would be useful for any
+ * function that needs to be able to understand UTF-8 characters.
+ * As of right now, only smart lossless character encoding converters
+ * would need that, and I'm probably not going to implement them.
+ */
+ public static function cleanUTF8($str, $force_php = false)
+ {
+ // UTF-8 validity is checked since PHP 4.3.5
+ // This is an optimization: if the string is already valid UTF-8, no
+ // need to do PHP stuff. 99% of the time, this will be the case.
+ if (preg_match(
+ '/^[\x{9}\x{A}\x{D}\x{20}-\x{7E}\x{A0}-\x{D7FF}\x{E000}-\x{FFFD}\x{10000}-\x{10FFFF}]*$/Du',
+ $str
+ )) {
+ return $str;
+ }
+
+ $mState = 0; // cached expected number of octets after the current octet
+ // until the beginning of the next UTF8 character sequence
+ $mUcs4 = 0; // cached Unicode character
+ $mBytes = 1; // cached expected number of octets in the current sequence
+
+ // original code involved an $out that was an array of Unicode
+ // codepoints. Instead of having to convert back into UTF-8, we've
+ // decided to directly append valid UTF-8 characters onto a string
+ // $out once they're done. $char accumulates raw bytes, while $mUcs4
+ // turns into the Unicode code point, so there's some redundancy.
+
+ $out = '';
+ $char = '';
+
+ $len = strlen($str);
+ for ($i = 0; $i < $len; $i++) {
+ $in = ord($str{$i});
+ $char .= $str[$i]; // append byte to char
+ if (0 == $mState) {
+ // When mState is zero we expect either a US-ASCII character
+ // or a multi-octet sequence.
+ if (0 == (0x80 & ($in))) {
+ // US-ASCII, pass straight through.
+ if (($in <= 31 || $in == 127) &&
+ !($in == 9 || $in == 13 || $in == 10) // save \r\t\n
+ ) {
+ // control characters, remove
+ } else {
+ $out .= $char;
+ }
+ // reset
+ $char = '';
+ $mBytes = 1;
+ } elseif (0xC0 == (0xE0 & ($in))) {
+ // First octet of 2 octet sequence
+ $mUcs4 = ($in);
+ $mUcs4 = ($mUcs4 & 0x1F) << 6;
+ $mState = 1;
+ $mBytes = 2;
+ } elseif (0xE0 == (0xF0 & ($in))) {
+ // First octet of 3 octet sequence
+ $mUcs4 = ($in);
+ $mUcs4 = ($mUcs4 & 0x0F) << 12;
+ $mState = 2;
+ $mBytes = 3;
+ } elseif (0xF0 == (0xF8 & ($in))) {
+ // First octet of 4 octet sequence
+ $mUcs4 = ($in);
+ $mUcs4 = ($mUcs4 & 0x07) << 18;
+ $mState = 3;
+ $mBytes = 4;
+ } elseif (0xF8 == (0xFC & ($in))) {
+ // First octet of 5 octet sequence.
+ //
+ // This is illegal because the encoded codepoint must be
+ // either:
+ // (a) not the shortest form or
+ // (b) outside the Unicode range of 0-0x10FFFF.
+ // Rather than trying to resynchronize, we will carry on
+ // until the end of the sequence and let the later error
+ // handling code catch it.
+ $mUcs4 = ($in);
+ $mUcs4 = ($mUcs4 & 0x03) << 24;
+ $mState = 4;
+ $mBytes = 5;
+ } elseif (0xFC == (0xFE & ($in))) {
+ // First octet of 6 octet sequence, see comments for 5
+ // octet sequence.
+ $mUcs4 = ($in);
+ $mUcs4 = ($mUcs4 & 1) << 30;
+ $mState = 5;
+ $mBytes = 6;
+ } else {
+ // Current octet is neither in the US-ASCII range nor a
+ // legal first octet of a multi-octet sequence.
+ $mState = 0;
+ $mUcs4 = 0;
+ $mBytes = 1;
+ $char = '';
+ }
+ } else {
+ // When mState is non-zero, we expect a continuation of the
+ // multi-octet sequence
+ if (0x80 == (0xC0 & ($in))) {
+ // Legal continuation.
+ $shift = ($mState - 1) * 6;
+ $tmp = $in;
+ $tmp = ($tmp & 0x0000003F) << $shift;
+ $mUcs4 |= $tmp;
+
+ if (0 == --$mState) {
+ // End of the multi-octet sequence. mUcs4 now contains
+ // the final Unicode codepoint to be output
+
+ // Check for illegal sequences and codepoints.
+
+ // From Unicode 3.1, non-shortest form is illegal
+ if (((2 == $mBytes) && ($mUcs4 < 0x0080)) ||
+ ((3 == $mBytes) && ($mUcs4 < 0x0800)) ||
+ ((4 == $mBytes) && ($mUcs4 < 0x10000)) ||
+ (4 < $mBytes) ||
+ // From Unicode 3.2, surrogate characters = illegal
+ (($mUcs4 & 0xFFFFF800) == 0xD800) ||
+ // Codepoints outside the Unicode range are illegal
+ ($mUcs4 > 0x10FFFF)
+ ) {
+
+ } elseif (0xFEFF != $mUcs4 && // omit BOM
+ // check for valid Char unicode codepoints
+ (
+ 0x9 == $mUcs4 ||
+ 0xA == $mUcs4 ||
+ 0xD == $mUcs4 ||
+ (0x20 <= $mUcs4 && 0x7E >= $mUcs4) ||
+ // 7F-9F is not strictly prohibited by XML,
+ // but it is non-SGML, and thus we don't allow it
+ (0xA0 <= $mUcs4 && 0xD7FF >= $mUcs4) ||
+ (0xE000 <= $mUcs4 && 0xFFFD >= $mUcs4) ||
+ (0x10000 <= $mUcs4 && 0x10FFFF >= $mUcs4)
+ )
+ ) {
+ $out .= $char;
+ }
+ // initialize UTF8 cache (reset)
+ $mState = 0;
+ $mUcs4 = 0;
+ $mBytes = 1;
+ $char = '';
+ }
+ } else {
+ // ((0xC0 & (*in) != 0x80) && (mState != 0))
+ // Incomplete multi-octet sequence.
+ // used to result in complete fail, but we'll reset
+ $mState = 0;
+ $mUcs4 = 0;
+ $mBytes = 1;
+ $char ='';
+ }
+ }
+ }
+ return $out;
+ }
+
+ /**
+ * Translates a Unicode codepoint into its corresponding UTF-8 character.
+ * @note Based on Feyd's function at
+ * <http://forums.devnetwork.net/viewtopic.php?p=191404#191404>,
+ * which is in public domain.
+ * @note While we're going to do code point parsing anyway, a good
+ * optimization would be to refuse to translate code points that
+ * are non-SGML characters. However, this could lead to duplication.
+ * @note This is very similar to the unichr function in
+ * maintenance/generate-entity-file.php (although this is superior,
+ * due to its sanity checks).
+ */
+
+ // +----------+----------+----------+----------+
+ // | 33222222 | 22221111 | 111111 | |
+ // | 10987654 | 32109876 | 54321098 | 76543210 | bit
+ // +----------+----------+----------+----------+
+ // | | | | 0xxxxxxx | 1 byte 0x00000000..0x0000007F
+ // | | | 110yyyyy | 10xxxxxx | 2 byte 0x00000080..0x000007FF
+ // | | 1110zzzz | 10yyyyyy | 10xxxxxx | 3 byte 0x00000800..0x0000FFFF
+ // | 11110www | 10wwzzzz | 10yyyyyy | 10xxxxxx | 4 byte 0x00010000..0x0010FFFF
+ // +----------+----------+----------+----------+
+ // | 00000000 | 00011111 | 11111111 | 11111111 | Theoretical upper limit of legal scalars: 2097151 (0x001FFFFF)
+ // | 00000000 | 00010000 | 11111111 | 11111111 | Defined upper limit of legal scalar codes
+ // +----------+----------+----------+----------+
+
+ public static function unichr($code)
+ {
+ if ($code > 1114111 or $code < 0 or
+ ($code >= 55296 and $code <= 57343) ) {
+ // bits are set outside the "valid" range as defined
+ // by UNICODE 4.1.0
+ return '';
+ }
+
+ $x = $y = $z = $w = 0;
+ if ($code < 128) {
+ // regular ASCII character
+ $x = $code;
+ } else {
+ // set up bits for UTF-8
+ $x = ($code & 63) | 128;
+ if ($code < 2048) {
+ $y = (($code & 2047) >> 6) | 192;
+ } else {
+ $y = (($code & 4032) >> 6) | 128;
+ if ($code < 65536) {
+ $z = (($code >> 12) & 15) | 224;
+ } else {
+ $z = (($code >> 12) & 63) | 128;
+ $w = (($code >> 18) & 7) | 240;
+ }
+ }
+ }
+ // set up the actual character
+ $ret = '';
+ if ($w) {
+ $ret .= chr($w);
+ }
+ if ($z) {
+ $ret .= chr($z);
+ }
+ if ($y) {
+ $ret .= chr($y);
+ }
+ $ret .= chr($x);
+
+ return $ret;
+ }
+
+ /**
+ * @return bool
+ */
+ public static function iconvAvailable()
+ {
+ static $iconv = null;
+ if ($iconv === null) {
+ $iconv = function_exists('iconv') && self::testIconvTruncateBug() != self::ICONV_UNUSABLE;
+ }
+ return $iconv;
+ }
+
+ /**
+ * Convert a string to UTF-8 based on configuration.
+ * @param string $str The string to convert
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return string
+ */
+ public static function convertToUTF8($str, $config, $context)
+ {
+ $encoding = $config->get('Core.Encoding');
+ if ($encoding === 'utf-8') {
+ return $str;
+ }
+ static $iconv = null;
+ if ($iconv === null) {
+ $iconv = self::iconvAvailable();
+ }
+ if ($iconv && !$config->get('Test.ForceNoIconv')) {
+ // unaffected by bugs, since UTF-8 support all characters
+ $str = self::unsafeIconv($encoding, 'utf-8//IGNORE', $str);
+ if ($str === false) {
+ // $encoding is not a valid encoding
+ trigger_error('Invalid encoding ' . $encoding, E_USER_ERROR);
+ return '';
+ }
+ // If the string is bjorked by Shift_JIS or a similar encoding
+ // that doesn't support all of ASCII, convert the naughty
+ // characters to their true byte-wise ASCII/UTF-8 equivalents.
+ $str = strtr($str, self::testEncodingSupportsASCII($encoding));
+ return $str;
+ } elseif ($encoding === 'iso-8859-1') {
+ $str = utf8_encode($str);
+ return $str;
+ }
+ $bug = HTMLPurifier_Encoder::testIconvTruncateBug();
+ if ($bug == self::ICONV_OK) {
+ trigger_error('Encoding not supported, please install iconv', E_USER_ERROR);
+ } else {
+ trigger_error(
+ 'You have a buggy version of iconv, see https://bugs.php.net/bug.php?id=48147 ' .
+ 'and http://sourceware.org/bugzilla/show_bug.cgi?id=13541',
+ E_USER_ERROR
+ );
+ }
+ }
+
+ /**
+ * Converts a string from UTF-8 based on configuration.
+ * @param string $str The string to convert
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return string
+ * @note Currently, this is a lossy conversion, with unexpressable
+ * characters being omitted.
+ */
+ public static function convertFromUTF8($str, $config, $context)
+ {
+ $encoding = $config->get('Core.Encoding');
+ if ($escape = $config->get('Core.EscapeNonASCIICharacters')) {
+ $str = self::convertToASCIIDumbLossless($str);
+ }
+ if ($encoding === 'utf-8') {
+ return $str;
+ }
+ static $iconv = null;
+ if ($iconv === null) {
+ $iconv = self::iconvAvailable();
+ }
+ if ($iconv && !$config->get('Test.ForceNoIconv')) {
+ // Undo our previous fix in convertToUTF8, otherwise iconv will barf
+ $ascii_fix = self::testEncodingSupportsASCII($encoding);
+ if (!$escape && !empty($ascii_fix)) {
+ $clear_fix = array();
+ foreach ($ascii_fix as $utf8 => $native) {
+ $clear_fix[$utf8] = '';
+ }
+ $str = strtr($str, $clear_fix);
+ }
+ $str = strtr($str, array_flip($ascii_fix));
+ // Normal stuff
+ $str = self::iconv('utf-8', $encoding . '//IGNORE', $str);
+ return $str;
+ } elseif ($encoding === 'iso-8859-1') {
+ $str = utf8_decode($str);
+ return $str;
+ }
+ trigger_error('Encoding not supported', E_USER_ERROR);
+ // You might be tempted to assume that the ASCII representation
+ // might be OK, however, this is *not* universally true over all
+ // encodings. So we take the conservative route here, rather
+ // than forcibly turn on %Core.EscapeNonASCIICharacters
+ }
+
+ /**
+ * Lossless (character-wise) conversion of HTML to ASCII
+ * @param string $str UTF-8 string to be converted to ASCII
+ * @return string ASCII encoded string with non-ASCII character entity-ized
+ * @warning Adapted from MediaWiki, claiming fair use: this is a common
+ * algorithm. If you disagree with this license fudgery,
+ * implement it yourself.
+ * @note Uses decimal numeric entities since they are best supported.
+ * @note This is a DUMB function: it has no concept of keeping
+ * character entities that the projected character encoding
+ * can allow. We could possibly implement a smart version
+ * but that would require it to also know which Unicode
+ * codepoints the charset supported (not an easy task).
+ * @note Sort of with cleanUTF8() but it assumes that $str is
+ * well-formed UTF-8
+ */
+ public static function convertToASCIIDumbLossless($str)
+ {
+ $bytesleft = 0;
+ $result = '';
+ $working = 0;
+ $len = strlen($str);
+ for ($i = 0; $i < $len; $i++) {
+ $bytevalue = ord($str[$i]);
+ if ($bytevalue <= 0x7F) { //0xxx xxxx
+ $result .= chr($bytevalue);
+ $bytesleft = 0;
+ } elseif ($bytevalue <= 0xBF) { //10xx xxxx
+ $working = $working << 6;
+ $working += ($bytevalue & 0x3F);
+ $bytesleft--;
+ if ($bytesleft <= 0) {
+ $result .= "&#" . $working . ";";
+ }
+ } elseif ($bytevalue <= 0xDF) { //110x xxxx
+ $working = $bytevalue & 0x1F;
+ $bytesleft = 1;
+ } elseif ($bytevalue <= 0xEF) { //1110 xxxx
+ $working = $bytevalue & 0x0F;
+ $bytesleft = 2;
+ } else { //1111 0xxx
+ $working = $bytevalue & 0x07;
+ $bytesleft = 3;
+ }
+ }
+ return $result;
+ }
+
+ /** No bugs detected in iconv. */
+ const ICONV_OK = 0;
+
+ /** Iconv truncates output if converting from UTF-8 to another
+ * character set with //IGNORE, and a non-encodable character is found */
+ const ICONV_TRUNCATES = 1;
+
+ /** Iconv does not support //IGNORE, making it unusable for
+ * transcoding purposes */
+ const ICONV_UNUSABLE = 2;
+
+ /**
+ * glibc iconv has a known bug where it doesn't handle the magic
+ * //IGNORE stanza correctly. In particular, rather than ignore
+ * characters, it will return an EILSEQ after consuming some number
+ * of characters, and expect you to restart iconv as if it were
+ * an E2BIG. Old versions of PHP did not respect the errno, and
+ * returned the fragment, so as a result you would see iconv
+ * mysteriously truncating output. We can work around this by
+ * manually chopping our input into segments of about 8000
+ * characters, as long as PHP ignores the error code. If PHP starts
+ * paying attention to the error code, iconv becomes unusable.
+ *
+ * @return int Error code indicating severity of bug.
+ */
+ public static function testIconvTruncateBug()
+ {
+ static $code = null;
+ if ($code === null) {
+ // better not use iconv, otherwise infinite loop!
+ $r = self::unsafeIconv('utf-8', 'ascii//IGNORE', "\xCE\xB1" . str_repeat('a', 9000));
+ if ($r === false) {
+ $code = self::ICONV_UNUSABLE;
+ } elseif (($c = strlen($r)) < 9000) {
+ $code = self::ICONV_TRUNCATES;
+ } elseif ($c > 9000) {
+ trigger_error(
+ 'Your copy of iconv is extremely buggy. Please notify HTML Purifier maintainers: ' .
+ 'include your iconv version as per phpversion()',
+ E_USER_ERROR
+ );
+ } else {
+ $code = self::ICONV_OK;
+ }
+ }
+ return $code;
+ }
+
+ /**
+ * This expensive function tests whether or not a given character
+ * encoding supports ASCII. 7/8-bit encodings like Shift_JIS will
+ * fail this test, and require special processing. Variable width
+ * encodings shouldn't ever fail.
+ *
+ * @param string $encoding Encoding name to test, as per iconv format
+ * @param bool $bypass Whether or not to bypass the precompiled arrays.
+ * @return Array of UTF-8 characters to their corresponding ASCII,
+ * which can be used to "undo" any overzealous iconv action.
+ */
+ public static function testEncodingSupportsASCII($encoding, $bypass = false)
+ {
+ // All calls to iconv here are unsafe, proof by case analysis:
+ // If ICONV_OK, no difference.
+ // If ICONV_TRUNCATE, all calls involve one character inputs,
+ // so bug is not triggered.
+ // If ICONV_UNUSABLE, this call is irrelevant
+ static $encodings = array();
+ if (!$bypass) {
+ if (isset($encodings[$encoding])) {
+ return $encodings[$encoding];
+ }
+ $lenc = strtolower($encoding);
+ switch ($lenc) {
+ case 'shift_jis':
+ return array("\xC2\xA5" => '\\', "\xE2\x80\xBE" => '~');
+ case 'johab':
+ return array("\xE2\x82\xA9" => '\\');
+ }
+ if (strpos($lenc, 'iso-8859-') === 0) {
+ return array();
+ }
+ }
+ $ret = array();
+ if (self::unsafeIconv('UTF-8', $encoding, 'a') === false) {
+ return false;
+ }
+ for ($i = 0x20; $i <= 0x7E; $i++) { // all printable ASCII chars
+ $c = chr($i); // UTF-8 char
+ $r = self::unsafeIconv('UTF-8', "$encoding//IGNORE", $c); // initial conversion
+ if ($r === '' ||
+ // This line is needed for iconv implementations that do not
+ // omit characters that do not exist in the target character set
+ ($r === $c && self::unsafeIconv($encoding, 'UTF-8//IGNORE', $r) !== $c)
+ ) {
+ // Reverse engineer: what's the UTF-8 equiv of this byte
+ // sequence? This assumes that there's no variable width
+ // encoding that doesn't support ASCII.
+ $ret[self::unsafeIconv($encoding, 'UTF-8//IGNORE', $c)] = $c;
+ }
+ }
+ $encodings[$encoding] = $ret;
+ return $ret;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/EntityLookup.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/EntityLookup.php
index f12ff13a3..f12ff13a3 100644
--- a/library/HTMLPurifier/EntityLookup.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/EntityLookup.php
diff --git a/library/HTMLPurifier/EntityLookup/entities.ser b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/EntityLookup/entities.ser
index e8b08128b..e8b08128b 100644
--- a/library/HTMLPurifier/EntityLookup/entities.ser
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/EntityLookup/entities.ser
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/EntityParser.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/EntityParser.php
new file mode 100644
index 000000000..c372b5a6a
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/EntityParser.php
@@ -0,0 +1,285 @@
+<?php
+
+// if want to implement error collecting here, we'll need to use some sort
+// of global data (probably trigger_error) because it's impossible to pass
+// $config or $context to the callback functions.
+
+/**
+ * Handles referencing and derefencing character entities
+ */
+class HTMLPurifier_EntityParser
+{
+
+ /**
+ * Reference to entity lookup table.
+ * @type HTMLPurifier_EntityLookup
+ */
+ protected $_entity_lookup;
+
+ /**
+ * Callback regex string for entities in text.
+ * @type string
+ */
+ protected $_textEntitiesRegex;
+
+ /**
+ * Callback regex string for entities in attributes.
+ * @type string
+ */
+ protected $_attrEntitiesRegex;
+
+ /**
+ * Tests if the beginning of a string is a semi-optional regex
+ */
+ protected $_semiOptionalPrefixRegex;
+
+ public function __construct() {
+ // From
+ // http://stackoverflow.com/questions/15532252/why-is-reg-being-rendered-as-without-the-bounding-semicolon
+ $semi_optional = "quot|QUOT|lt|LT|gt|GT|amp|AMP|AElig|Aacute|Acirc|Agrave|Aring|Atilde|Auml|COPY|Ccedil|ETH|Eacute|Ecirc|Egrave|Euml|Iacute|Icirc|Igrave|Iuml|Ntilde|Oacute|Ocirc|Ograve|Oslash|Otilde|Ouml|REG|THORN|Uacute|Ucirc|Ugrave|Uuml|Yacute|aacute|acirc|acute|aelig|agrave|aring|atilde|auml|brvbar|ccedil|cedil|cent|copy|curren|deg|divide|eacute|ecirc|egrave|eth|euml|frac12|frac14|frac34|iacute|icirc|iexcl|igrave|iquest|iuml|laquo|macr|micro|middot|nbsp|not|ntilde|oacute|ocirc|ograve|ordf|ordm|oslash|otilde|ouml|para|plusmn|pound|raquo|reg|sect|shy|sup1|sup2|sup3|szlig|thorn|times|uacute|ucirc|ugrave|uml|uuml|yacute|yen|yuml";
+
+ // NB: three empty captures to put the fourth match in the right
+ // place
+ $this->_semiOptionalPrefixRegex = "/&()()()($semi_optional)/";
+
+ $this->_textEntitiesRegex =
+ '/&(?:'.
+ // hex
+ '[#]x([a-fA-F0-9]+);?|'.
+ // dec
+ '[#]0*(\d+);?|'.
+ // string (mandatory semicolon)
+ // NB: order matters: match semicolon preferentially
+ '([A-Za-z_:][A-Za-z0-9.\-_:]*);|'.
+ // string (optional semicolon)
+ "($semi_optional)".
+ ')/';
+
+ $this->_attrEntitiesRegex =
+ '/&(?:'.
+ // hex
+ '[#]x([a-fA-F0-9]+);?|'.
+ // dec
+ '[#]0*(\d+);?|'.
+ // string (mandatory semicolon)
+ // NB: order matters: match semicolon preferentially
+ '([A-Za-z_:][A-Za-z0-9.\-_:]*);|'.
+ // string (optional semicolon)
+ // don't match if trailing is equals or alphanumeric (URL
+ // like)
+ "($semi_optional)(?![=;A-Za-z0-9])".
+ ')/';
+
+ }
+
+ /**
+ * Substitute entities with the parsed equivalents. Use this on
+ * textual data in an HTML document (as opposed to attributes.)
+ *
+ * @param string $string String to have entities parsed.
+ * @return string Parsed string.
+ */
+ public function substituteTextEntities($string)
+ {
+ return preg_replace_callback(
+ $this->_textEntitiesRegex,
+ array($this, 'entityCallback'),
+ $string
+ );
+ }
+
+ /**
+ * Substitute entities with the parsed equivalents. Use this on
+ * attribute contents in documents.
+ *
+ * @param string $string String to have entities parsed.
+ * @return string Parsed string.
+ */
+ public function substituteAttrEntities($string)
+ {
+ return preg_replace_callback(
+ $this->_attrEntitiesRegex,
+ array($this, 'entityCallback'),
+ $string
+ );
+ }
+
+ /**
+ * Callback function for substituteNonSpecialEntities() that does the work.
+ *
+ * @param array $matches PCRE matches array, with 0 the entire match, and
+ * either index 1, 2 or 3 set with a hex value, dec value,
+ * or string (respectively).
+ * @return string Replacement string.
+ */
+
+ protected function entityCallback($matches)
+ {
+ $entity = $matches[0];
+ $hex_part = @$matches[1];
+ $dec_part = @$matches[2];
+ $named_part = empty($matches[3]) ? @$matches[4] : $matches[3];
+ if ($hex_part !== NULL && $hex_part !== "") {
+ return HTMLPurifier_Encoder::unichr(hexdec($hex_part));
+ } elseif ($dec_part !== NULL && $dec_part !== "") {
+ return HTMLPurifier_Encoder::unichr((int) $dec_part);
+ } else {
+ if (!$this->_entity_lookup) {
+ $this->_entity_lookup = HTMLPurifier_EntityLookup::instance();
+ }
+ if (isset($this->_entity_lookup->table[$named_part])) {
+ return $this->_entity_lookup->table[$named_part];
+ } else {
+ // exact match didn't match anything, so test if
+ // any of the semicolon optional match the prefix.
+ // Test that this is an EXACT match is important to
+ // prevent infinite loop
+ if (!empty($matches[3])) {
+ return preg_replace_callback(
+ $this->_semiOptionalPrefixRegex,
+ array($this, 'entityCallback'),
+ $entity
+ );
+ }
+ return $entity;
+ }
+ }
+ }
+
+ // LEGACY CODE BELOW
+
+ /**
+ * Callback regex string for parsing entities.
+ * @type string
+ */
+ protected $_substituteEntitiesRegex =
+ '/&(?:[#]x([a-fA-F0-9]+)|[#]0*(\d+)|([A-Za-z_:][A-Za-z0-9.\-_:]*));?/';
+ // 1. hex 2. dec 3. string (XML style)
+
+ /**
+ * Decimal to parsed string conversion table for special entities.
+ * @type array
+ */
+ protected $_special_dec2str =
+ array(
+ 34 => '"',
+ 38 => '&',
+ 39 => "'",
+ 60 => '<',
+ 62 => '>'
+ );
+
+ /**
+ * Stripped entity names to decimal conversion table for special entities.
+ * @type array
+ */
+ protected $_special_ent2dec =
+ array(
+ 'quot' => 34,
+ 'amp' => 38,
+ 'lt' => 60,
+ 'gt' => 62
+ );
+
+ /**
+ * Substitutes non-special entities with their parsed equivalents. Since
+ * running this whenever you have parsed character is t3h 5uck, we run
+ * it before everything else.
+ *
+ * @param string $string String to have non-special entities parsed.
+ * @return string Parsed string.
+ */
+ public function substituteNonSpecialEntities($string)
+ {
+ // it will try to detect missing semicolons, but don't rely on it
+ return preg_replace_callback(
+ $this->_substituteEntitiesRegex,
+ array($this, 'nonSpecialEntityCallback'),
+ $string
+ );
+ }
+
+ /**
+ * Callback function for substituteNonSpecialEntities() that does the work.
+ *
+ * @param array $matches PCRE matches array, with 0 the entire match, and
+ * either index 1, 2 or 3 set with a hex value, dec value,
+ * or string (respectively).
+ * @return string Replacement string.
+ */
+
+ protected function nonSpecialEntityCallback($matches)
+ {
+ // replaces all but big five
+ $entity = $matches[0];
+ $is_num = (@$matches[0][1] === '#');
+ if ($is_num) {
+ $is_hex = (@$entity[2] === 'x');
+ $code = $is_hex ? hexdec($matches[1]) : (int) $matches[2];
+ // abort for special characters
+ if (isset($this->_special_dec2str[$code])) {
+ return $entity;
+ }
+ return HTMLPurifier_Encoder::unichr($code);
+ } else {
+ if (isset($this->_special_ent2dec[$matches[3]])) {
+ return $entity;
+ }
+ if (!$this->_entity_lookup) {
+ $this->_entity_lookup = HTMLPurifier_EntityLookup::instance();
+ }
+ if (isset($this->_entity_lookup->table[$matches[3]])) {
+ return $this->_entity_lookup->table[$matches[3]];
+ } else {
+ return $entity;
+ }
+ }
+ }
+
+ /**
+ * Substitutes only special entities with their parsed equivalents.
+ *
+ * @notice We try to avoid calling this function because otherwise, it
+ * would have to be called a lot (for every parsed section).
+ *
+ * @param string $string String to have non-special entities parsed.
+ * @return string Parsed string.
+ */
+ public function substituteSpecialEntities($string)
+ {
+ return preg_replace_callback(
+ $this->_substituteEntitiesRegex,
+ array($this, 'specialEntityCallback'),
+ $string
+ );
+ }
+
+ /**
+ * Callback function for substituteSpecialEntities() that does the work.
+ *
+ * This callback has same syntax as nonSpecialEntityCallback().
+ *
+ * @param array $matches PCRE-style matches array, with 0 the entire match, and
+ * either index 1, 2 or 3 set with a hex value, dec value,
+ * or string (respectively).
+ * @return string Replacement string.
+ */
+ protected function specialEntityCallback($matches)
+ {
+ $entity = $matches[0];
+ $is_num = (@$matches[0][1] === '#');
+ if ($is_num) {
+ $is_hex = (@$entity[2] === 'x');
+ $int = $is_hex ? hexdec($matches[1]) : (int) $matches[2];
+ return isset($this->_special_dec2str[$int]) ?
+ $this->_special_dec2str[$int] :
+ $entity;
+ } else {
+ return isset($this->_special_ent2dec[$matches[3]]) ?
+ $this->_special_dec2str[$this->_special_ent2dec[$matches[3]]] :
+ $entity;
+ }
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/ErrorCollector.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ErrorCollector.php
index d47e3f2e2..d47e3f2e2 100644
--- a/library/HTMLPurifier/ErrorCollector.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ErrorCollector.php
diff --git a/library/HTMLPurifier/ErrorStruct.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ErrorStruct.php
index cf869d321..cf869d321 100644
--- a/library/HTMLPurifier/ErrorStruct.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ErrorStruct.php
diff --git a/library/HTMLPurifier/Exception.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Exception.php
index be85b4c56..be85b4c56 100644
--- a/library/HTMLPurifier/Exception.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Exception.php
diff --git a/library/HTMLPurifier/Filter.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Filter.php
index c1f41ee16..c1f41ee16 100644
--- a/library/HTMLPurifier/Filter.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Filter.php
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Filter/ExtractStyleBlocks.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Filter/ExtractStyleBlocks.php
new file mode 100644
index 000000000..66f70b0fc
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Filter/ExtractStyleBlocks.php
@@ -0,0 +1,341 @@
+<?php
+
+// why is this a top level function? Because PHP 5.2.0 doesn't seem to
+// understand how to interpret this filter if it's a static method.
+// It's all really silly, but if we go this route it might be reasonable
+// to coalesce all of these methods into one.
+function htmlpurifier_filter_extractstyleblocks_muteerrorhandler()
+{
+}
+
+/**
+ * This filter extracts <style> blocks from input HTML, cleans them up
+ * using CSSTidy, and then places them in $purifier->context->get('StyleBlocks')
+ * so they can be used elsewhere in the document.
+ *
+ * @note
+ * See tests/HTMLPurifier/Filter/ExtractStyleBlocksTest.php for
+ * sample usage.
+ *
+ * @note
+ * This filter can also be used on stylesheets not included in the
+ * document--something purists would probably prefer. Just directly
+ * call HTMLPurifier_Filter_ExtractStyleBlocks->cleanCSS()
+ */
+class HTMLPurifier_Filter_ExtractStyleBlocks extends HTMLPurifier_Filter
+{
+ /**
+ * @type string
+ */
+ public $name = 'ExtractStyleBlocks';
+
+ /**
+ * @type array
+ */
+ private $_styleMatches = array();
+
+ /**
+ * @type csstidy
+ */
+ private $_tidy;
+
+ /**
+ * @type HTMLPurifier_AttrDef_HTML_ID
+ */
+ private $_id_attrdef;
+
+ /**
+ * @type HTMLPurifier_AttrDef_CSS_Ident
+ */
+ private $_class_attrdef;
+
+ /**
+ * @type HTMLPurifier_AttrDef_Enum
+ */
+ private $_enum_attrdef;
+
+ public function __construct()
+ {
+ $this->_tidy = new csstidy();
+ $this->_tidy->set_cfg('lowercase_s', false);
+ $this->_id_attrdef = new HTMLPurifier_AttrDef_HTML_ID(true);
+ $this->_class_attrdef = new HTMLPurifier_AttrDef_CSS_Ident();
+ $this->_enum_attrdef = new HTMLPurifier_AttrDef_Enum(
+ array(
+ 'first-child',
+ 'link',
+ 'visited',
+ 'active',
+ 'hover',
+ 'focus'
+ )
+ );
+ }
+
+ /**
+ * Save the contents of CSS blocks to style matches
+ * @param array $matches preg_replace style $matches array
+ */
+ protected function styleCallback($matches)
+ {
+ $this->_styleMatches[] = $matches[1];
+ }
+
+ /**
+ * Removes inline <style> tags from HTML, saves them for later use
+ * @param string $html
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return string
+ * @todo Extend to indicate non-text/css style blocks
+ */
+ public function preFilter($html, $config, $context)
+ {
+ $tidy = $config->get('Filter.ExtractStyleBlocks.TidyImpl');
+ if ($tidy !== null) {
+ $this->_tidy = $tidy;
+ }
+ // NB: this must be NON-greedy because if we have
+ // <style>foo</style> <style>bar</style>
+ // we must not grab foo</style> <style>bar
+ $html = preg_replace_callback('#<style(?:\s.*)?>(.*)<\/style>#isU', array($this, 'styleCallback'), $html);
+ $style_blocks = $this->_styleMatches;
+ $this->_styleMatches = array(); // reset
+ $context->register('StyleBlocks', $style_blocks); // $context must not be reused
+ if ($this->_tidy) {
+ foreach ($style_blocks as &$style) {
+ $style = $this->cleanCSS($style, $config, $context);
+ }
+ }
+ return $html;
+ }
+
+ /**
+ * Takes CSS (the stuff found in <style>) and cleans it.
+ * @warning Requires CSSTidy <http://csstidy.sourceforge.net/>
+ * @param string $css CSS styling to clean
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @throws HTMLPurifier_Exception
+ * @return string Cleaned CSS
+ */
+ public function cleanCSS($css, $config, $context)
+ {
+ // prepare scope
+ $scope = $config->get('Filter.ExtractStyleBlocks.Scope');
+ if ($scope !== null) {
+ $scopes = array_map('trim', explode(',', $scope));
+ } else {
+ $scopes = array();
+ }
+ // remove comments from CSS
+ $css = trim($css);
+ if (strncmp('<!--', $css, 4) === 0) {
+ $css = substr($css, 4);
+ }
+ if (strlen($css) > 3 && substr($css, -3) == '-->') {
+ $css = substr($css, 0, -3);
+ }
+ $css = trim($css);
+ set_error_handler('htmlpurifier_filter_extractstyleblocks_muteerrorhandler');
+ $this->_tidy->parse($css);
+ restore_error_handler();
+ $css_definition = $config->getDefinition('CSS');
+ $html_definition = $config->getDefinition('HTML');
+ $new_css = array();
+ foreach ($this->_tidy->css as $k => $decls) {
+ // $decls are all CSS declarations inside an @ selector
+ $new_decls = array();
+ foreach ($decls as $selector => $style) {
+ $selector = trim($selector);
+ if ($selector === '') {
+ continue;
+ } // should not happen
+ // Parse the selector
+ // Here is the relevant part of the CSS grammar:
+ //
+ // ruleset
+ // : selector [ ',' S* selector ]* '{' ...
+ // selector
+ // : simple_selector [ combinator selector | S+ [ combinator? selector ]? ]?
+ // combinator
+ // : '+' S*
+ // : '>' S*
+ // simple_selector
+ // : element_name [ HASH | class | attrib | pseudo ]*
+ // | [ HASH | class | attrib | pseudo ]+
+ // element_name
+ // : IDENT | '*'
+ // ;
+ // class
+ // : '.' IDENT
+ // ;
+ // attrib
+ // : '[' S* IDENT S* [ [ '=' | INCLUDES | DASHMATCH ] S*
+ // [ IDENT | STRING ] S* ]? ']'
+ // ;
+ // pseudo
+ // : ':' [ IDENT | FUNCTION S* [IDENT S*]? ')' ]
+ // ;
+ //
+ // For reference, here are the relevant tokens:
+ //
+ // HASH #{name}
+ // IDENT {ident}
+ // INCLUDES ==
+ // DASHMATCH |=
+ // STRING {string}
+ // FUNCTION {ident}\(
+ //
+ // And the lexical scanner tokens
+ //
+ // name {nmchar}+
+ // nmchar [_a-z0-9-]|{nonascii}|{escape}
+ // nonascii [\240-\377]
+ // escape {unicode}|\\[^\r\n\f0-9a-f]
+ // unicode \\{h}}{1,6}(\r\n|[ \t\r\n\f])?
+ // ident -?{nmstart}{nmchar*}
+ // nmstart [_a-z]|{nonascii}|{escape}
+ // string {string1}|{string2}
+ // string1 \"([^\n\r\f\\"]|\\{nl}|{escape})*\"
+ // string2 \'([^\n\r\f\\"]|\\{nl}|{escape})*\'
+ //
+ // We'll implement a subset (in order to reduce attack
+ // surface); in particular:
+ //
+ // - No Unicode support
+ // - No escapes support
+ // - No string support (by proxy no attrib support)
+ // - element_name is matched against allowed
+ // elements (some people might find this
+ // annoying...)
+ // - Pseudo-elements one of :first-child, :link,
+ // :visited, :active, :hover, :focus
+
+ // handle ruleset
+ $selectors = array_map('trim', explode(',', $selector));
+ $new_selectors = array();
+ foreach ($selectors as $sel) {
+ // split on +, > and spaces
+ $basic_selectors = preg_split('/\s*([+> ])\s*/', $sel, -1, PREG_SPLIT_DELIM_CAPTURE);
+ // even indices are chunks, odd indices are
+ // delimiters
+ $nsel = null;
+ $delim = null; // guaranteed to be non-null after
+ // two loop iterations
+ for ($i = 0, $c = count($basic_selectors); $i < $c; $i++) {
+ $x = $basic_selectors[$i];
+ if ($i % 2) {
+ // delimiter
+ if ($x === ' ') {
+ $delim = ' ';
+ } else {
+ $delim = ' ' . $x . ' ';
+ }
+ } else {
+ // simple selector
+ $components = preg_split('/([#.:])/', $x, -1, PREG_SPLIT_DELIM_CAPTURE);
+ $sdelim = null;
+ $nx = null;
+ for ($j = 0, $cc = count($components); $j < $cc; $j++) {
+ $y = $components[$j];
+ if ($j === 0) {
+ if ($y === '*' || isset($html_definition->info[$y = strtolower($y)])) {
+ $nx = $y;
+ } else {
+ // $nx stays null; this matters
+ // if we don't manage to find
+ // any valid selector content,
+ // in which case we ignore the
+ // outer $delim
+ }
+ } elseif ($j % 2) {
+ // set delimiter
+ $sdelim = $y;
+ } else {
+ $attrdef = null;
+ if ($sdelim === '#') {
+ $attrdef = $this->_id_attrdef;
+ } elseif ($sdelim === '.') {
+ $attrdef = $this->_class_attrdef;
+ } elseif ($sdelim === ':') {
+ $attrdef = $this->_enum_attrdef;
+ } else {
+ throw new HTMLPurifier_Exception('broken invariant sdelim and preg_split');
+ }
+ $r = $attrdef->validate($y, $config, $context);
+ if ($r !== false) {
+ if ($r !== true) {
+ $y = $r;
+ }
+ if ($nx === null) {
+ $nx = '';
+ }
+ $nx .= $sdelim . $y;
+ }
+ }
+ }
+ if ($nx !== null) {
+ if ($nsel === null) {
+ $nsel = $nx;
+ } else {
+ $nsel .= $delim . $nx;
+ }
+ } else {
+ // delimiters to the left of invalid
+ // basic selector ignored
+ }
+ }
+ }
+ if ($nsel !== null) {
+ if (!empty($scopes)) {
+ foreach ($scopes as $s) {
+ $new_selectors[] = "$s $nsel";
+ }
+ } else {
+ $new_selectors[] = $nsel;
+ }
+ }
+ }
+ if (empty($new_selectors)) {
+ continue;
+ }
+ $selector = implode(', ', $new_selectors);
+ foreach ($style as $name => $value) {
+ if (!isset($css_definition->info[$name])) {
+ unset($style[$name]);
+ continue;
+ }
+ $def = $css_definition->info[$name];
+ $ret = $def->validate($value, $config, $context);
+ if ($ret === false) {
+ unset($style[$name]);
+ } else {
+ $style[$name] = $ret;
+ }
+ }
+ $new_decls[$selector] = $style;
+ }
+ $new_css[$k] = $new_decls;
+ }
+ // remove stuff that shouldn't be used, could be reenabled
+ // after security risks are analyzed
+ $this->_tidy->css = $new_css;
+ $this->_tidy->import = array();
+ $this->_tidy->charset = null;
+ $this->_tidy->namespace = null;
+ $css = $this->_tidy->print->plain();
+ // we are going to escape any special characters <>& to ensure
+ // that no funny business occurs (i.e. </style> in a font-family prop).
+ if ($config->get('Filter.ExtractStyleBlocks.Escaping')) {
+ $css = str_replace(
+ array('<', '>', '&'),
+ array('\3C ', '\3E ', '\26 '),
+ $css
+ );
+ }
+ return $css;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Filter/YouTube.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Filter/YouTube.php
new file mode 100644
index 000000000..276d8362f
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Filter/YouTube.php
@@ -0,0 +1,65 @@
+<?php
+
+class HTMLPurifier_Filter_YouTube extends HTMLPurifier_Filter
+{
+
+ /**
+ * @type string
+ */
+ public $name = 'YouTube';
+
+ /**
+ * @param string $html
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return string
+ */
+ public function preFilter($html, $config, $context)
+ {
+ $pre_regex = '#<object[^>]+>.+?' .
+ '(?:http:)?//www.youtube.com/((?:v|cp)/[A-Za-z0-9\-_=]+).+?</object>#s';
+ $pre_replace = '<span class="youtube-embed">\1</span>';
+ return preg_replace($pre_regex, $pre_replace, $html);
+ }
+
+ /**
+ * @param string $html
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return string
+ */
+ public function postFilter($html, $config, $context)
+ {
+ $post_regex = '#<span class="youtube-embed">((?:v|cp)/[A-Za-z0-9\-_=]+)</span>#';
+ return preg_replace_callback($post_regex, array($this, 'postFilterCallback'), $html);
+ }
+
+ /**
+ * @param $url
+ * @return string
+ */
+ protected function armorUrl($url)
+ {
+ return str_replace('--', '-&#45;', $url);
+ }
+
+ /**
+ * @param array $matches
+ * @return string
+ */
+ protected function postFilterCallback($matches)
+ {
+ $url = $this->armorUrl($matches[1]);
+ return '<object width="425" height="350" type="application/x-shockwave-flash" ' .
+ 'data="//www.youtube.com/' . $url . '">' .
+ '<param name="movie" value="//www.youtube.com/' . $url . '"></param>' .
+ '<!--[if IE]>' .
+ '<embed src="//www.youtube.com/' . $url . '"' .
+ 'type="application/x-shockwave-flash"' .
+ 'wmode="transparent" width="425" height="350" />' .
+ '<![endif]-->' .
+ '</object>';
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/Generator.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Generator.php
index 6fb568714..6fb568714 100644
--- a/library/HTMLPurifier/Generator.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Generator.php
diff --git a/library/HTMLPurifier/HTMLDefinition.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLDefinition.php
index 9b7b334dd..9b7b334dd 100644
--- a/library/HTMLPurifier/HTMLDefinition.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLDefinition.php
diff --git a/library/HTMLPurifier/HTMLModule.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule.php
index bb3a9230b..bb3a9230b 100644
--- a/library/HTMLPurifier/HTMLModule.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule.php
diff --git a/library/HTMLPurifier/HTMLModule/Bdo.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Bdo.php
index 1e67c790d..1e67c790d 100644
--- a/library/HTMLPurifier/HTMLModule/Bdo.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Bdo.php
diff --git a/library/HTMLPurifier/HTMLModule/CommonAttributes.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/CommonAttributes.php
index a96ab1bef..a96ab1bef 100644
--- a/library/HTMLPurifier/HTMLModule/CommonAttributes.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/CommonAttributes.php
diff --git a/library/HTMLPurifier/HTMLModule/Edit.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Edit.php
index a9042a357..a9042a357 100644
--- a/library/HTMLPurifier/HTMLModule/Edit.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Edit.php
diff --git a/library/HTMLPurifier/HTMLModule/Forms.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Forms.php
index 6f7ddbc05..6f7ddbc05 100644
--- a/library/HTMLPurifier/HTMLModule/Forms.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Forms.php
diff --git a/library/HTMLPurifier/HTMLModule/Hypertext.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Hypertext.php
index 72d7a31e6..72d7a31e6 100644
--- a/library/HTMLPurifier/HTMLModule/Hypertext.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Hypertext.php
diff --git a/library/HTMLPurifier/HTMLModule/Iframe.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Iframe.php
index f7e7c91c0..f7e7c91c0 100644
--- a/library/HTMLPurifier/HTMLModule/Iframe.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Iframe.php
diff --git a/library/HTMLPurifier/HTMLModule/Image.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Image.php
index 0f5fdb3ba..0f5fdb3ba 100644
--- a/library/HTMLPurifier/HTMLModule/Image.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Image.php
diff --git a/library/HTMLPurifier/HTMLModule/Legacy.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Legacy.php
index 86b529957..86b529957 100644
--- a/library/HTMLPurifier/HTMLModule/Legacy.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Legacy.php
diff --git a/library/HTMLPurifier/HTMLModule/List.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/List.php
index 7a20ff701..7a20ff701 100644
--- a/library/HTMLPurifier/HTMLModule/List.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/List.php
diff --git a/library/HTMLPurifier/HTMLModule/Name.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Name.php
index 60c054515..60c054515 100644
--- a/library/HTMLPurifier/HTMLModule/Name.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Name.php
diff --git a/library/HTMLPurifier/HTMLModule/Nofollow.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Nofollow.php
index dc9410a89..dc9410a89 100644
--- a/library/HTMLPurifier/HTMLModule/Nofollow.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Nofollow.php
diff --git a/library/HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php
index da722253a..da722253a 100644
--- a/library/HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php
diff --git a/library/HTMLPurifier/HTMLModule/Object.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Object.php
index 2f9efc5c8..2f9efc5c8 100644
--- a/library/HTMLPurifier/HTMLModule/Object.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Object.php
diff --git a/library/HTMLPurifier/HTMLModule/Presentation.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Presentation.php
index 6458ce9d8..6458ce9d8 100644
--- a/library/HTMLPurifier/HTMLModule/Presentation.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Presentation.php
diff --git a/library/HTMLPurifier/HTMLModule/Proprietary.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Proprietary.php
index 5ee3c8e67..5ee3c8e67 100644
--- a/library/HTMLPurifier/HTMLModule/Proprietary.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Proprietary.php
diff --git a/library/HTMLPurifier/HTMLModule/Ruby.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Ruby.php
index a0d48924d..a0d48924d 100644
--- a/library/HTMLPurifier/HTMLModule/Ruby.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Ruby.php
diff --git a/library/HTMLPurifier/HTMLModule/SafeEmbed.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeEmbed.php
index 04e6689ea..04e6689ea 100644
--- a/library/HTMLPurifier/HTMLModule/SafeEmbed.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeEmbed.php
diff --git a/library/HTMLPurifier/HTMLModule/SafeObject.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeObject.php
index 1297f80a3..1297f80a3 100644
--- a/library/HTMLPurifier/HTMLModule/SafeObject.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeObject.php
diff --git a/library/HTMLPurifier/HTMLModule/SafeScripting.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeScripting.php
index 0330cd97f..0330cd97f 100644
--- a/library/HTMLPurifier/HTMLModule/SafeScripting.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeScripting.php
diff --git a/library/HTMLPurifier/HTMLModule/Scripting.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Scripting.php
index 8b28a7b7e..8b28a7b7e 100644
--- a/library/HTMLPurifier/HTMLModule/Scripting.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Scripting.php
diff --git a/library/HTMLPurifier/HTMLModule/StyleAttribute.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/StyleAttribute.php
index 497b832ae..497b832ae 100644
--- a/library/HTMLPurifier/HTMLModule/StyleAttribute.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/StyleAttribute.php
diff --git a/library/HTMLPurifier/HTMLModule/Tables.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tables.php
index 8a0b3b461..8a0b3b461 100644
--- a/library/HTMLPurifier/HTMLModule/Tables.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tables.php
diff --git a/library/HTMLPurifier/HTMLModule/Target.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Target.php
index b188ac936..b188ac936 100644
--- a/library/HTMLPurifier/HTMLModule/Target.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Target.php
diff --git a/library/HTMLPurifier/HTMLModule/TargetBlank.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/TargetBlank.php
index 58ccc6894..58ccc6894 100644
--- a/library/HTMLPurifier/HTMLModule/TargetBlank.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/TargetBlank.php
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/TargetNoopener.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/TargetNoopener.php
new file mode 100644
index 000000000..b967ff566
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/TargetNoopener.php
@@ -0,0 +1,21 @@
+<?php
+
+/**
+ * Module adds the target-based noopener attribute transformation to a tags. It
+ * is enabled by HTML.TargetNoopener
+ */
+class HTMLPurifier_HTMLModule_TargetNoopener extends HTMLPurifier_HTMLModule
+{
+ /**
+ * @type string
+ */
+ public $name = 'TargetNoopener';
+
+ /**
+ * @param HTMLPurifier_Config $config
+ */
+ public function setup($config) {
+ $a = $this->addBlankElement('a');
+ $a->attr_transform_post[] = new HTMLPurifier_AttrTransform_TargetNoopener();
+ }
+}
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/TargetNoreferrer.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/TargetNoreferrer.php
new file mode 100644
index 000000000..32484d601
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/TargetNoreferrer.php
@@ -0,0 +1,21 @@
+<?php
+
+/**
+ * Module adds the target-based noreferrer attribute transformation to a tags. It
+ * is enabled by HTML.TargetNoreferrer
+ */
+class HTMLPurifier_HTMLModule_TargetNoreferrer extends HTMLPurifier_HTMLModule
+{
+ /**
+ * @type string
+ */
+ public $name = 'TargetNoreferrer';
+
+ /**
+ * @param HTMLPurifier_Config $config
+ */
+ public function setup($config) {
+ $a = $this->addBlankElement('a');
+ $a->attr_transform_post[] = new HTMLPurifier_AttrTransform_TargetNoreferrer();
+ }
+}
diff --git a/library/HTMLPurifier/HTMLModule/Text.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Text.php
index 7a65e0048..7a65e0048 100644
--- a/library/HTMLPurifier/HTMLModule/Text.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Text.php
diff --git a/library/HTMLPurifier/HTMLModule/Tidy.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy.php
index 08aa23247..08aa23247 100644
--- a/library/HTMLPurifier/HTMLModule/Tidy.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy.php
diff --git a/library/HTMLPurifier/HTMLModule/Tidy/Name.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Name.php
index a995161b2..a995161b2 100644
--- a/library/HTMLPurifier/HTMLModule/Tidy/Name.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Name.php
diff --git a/library/HTMLPurifier/HTMLModule/Tidy/Proprietary.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Proprietary.php
index 332643821..332643821 100644
--- a/library/HTMLPurifier/HTMLModule/Tidy/Proprietary.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Proprietary.php
diff --git a/library/HTMLPurifier/HTMLModule/Tidy/Strict.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Strict.php
index 803c44fab..803c44fab 100644
--- a/library/HTMLPurifier/HTMLModule/Tidy/Strict.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Strict.php
diff --git a/library/HTMLPurifier/HTMLModule/Tidy/Transitional.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Transitional.php
index c095ad974..c095ad974 100644
--- a/library/HTMLPurifier/HTMLModule/Tidy/Transitional.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Transitional.php
diff --git a/library/HTMLPurifier/HTMLModule/Tidy/XHTML.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/XHTML.php
index 3ecddc434..3ecddc434 100644
--- a/library/HTMLPurifier/HTMLModule/Tidy/XHTML.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/XHTML.php
diff --git a/library/HTMLPurifier/HTMLModule/Tidy/XHTMLAndHTML4.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/XHTMLAndHTML4.php
index c4f16a4dc..c4f16a4dc 100644
--- a/library/HTMLPurifier/HTMLModule/Tidy/XHTMLAndHTML4.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/XHTMLAndHTML4.php
diff --git a/library/HTMLPurifier/HTMLModule/XMLCommonAttributes.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/XMLCommonAttributes.php
index 01dbe9deb..01dbe9deb 100644
--- a/library/HTMLPurifier/HTMLModule/XMLCommonAttributes.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/XMLCommonAttributes.php
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModuleManager.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModuleManager.php
new file mode 100644
index 000000000..38c058fe2
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModuleManager.php
@@ -0,0 +1,467 @@
+<?php
+
+class HTMLPurifier_HTMLModuleManager
+{
+
+ /**
+ * @type HTMLPurifier_DoctypeRegistry
+ */
+ public $doctypes;
+
+ /**
+ * Instance of current doctype.
+ * @type string
+ */
+ public $doctype;
+
+ /**
+ * @type HTMLPurifier_AttrTypes
+ */
+ public $attrTypes;
+
+ /**
+ * Active instances of modules for the specified doctype are
+ * indexed, by name, in this array.
+ * @type HTMLPurifier_HTMLModule[]
+ */
+ public $modules = array();
+
+ /**
+ * Array of recognized HTMLPurifier_HTMLModule instances,
+ * indexed by module's class name. This array is usually lazy loaded, but a
+ * user can overload a module by pre-emptively registering it.
+ * @type HTMLPurifier_HTMLModule[]
+ */
+ public $registeredModules = array();
+
+ /**
+ * List of extra modules that were added by the user
+ * using addModule(). These get unconditionally merged into the current doctype, whatever
+ * it may be.
+ * @type HTMLPurifier_HTMLModule[]
+ */
+ public $userModules = array();
+
+ /**
+ * Associative array of element name to list of modules that have
+ * definitions for the element; this array is dynamically filled.
+ * @type array
+ */
+ public $elementLookup = array();
+
+ /**
+ * List of prefixes we should use for registering small names.
+ * @type array
+ */
+ public $prefixes = array('HTMLPurifier_HTMLModule_');
+
+ /**
+ * @type HTMLPurifier_ContentSets
+ */
+ public $contentSets;
+
+ /**
+ * @type HTMLPurifier_AttrCollections
+ */
+ public $attrCollections;
+
+ /**
+ * If set to true, unsafe elements and attributes will be allowed.
+ * @type bool
+ */
+ public $trusted = false;
+
+ public function __construct()
+ {
+ // editable internal objects
+ $this->attrTypes = new HTMLPurifier_AttrTypes();
+ $this->doctypes = new HTMLPurifier_DoctypeRegistry();
+
+ // setup basic modules
+ $common = array(
+ 'CommonAttributes', 'Text', 'Hypertext', 'List',
+ 'Presentation', 'Edit', 'Bdo', 'Tables', 'Image',
+ 'StyleAttribute',
+ // Unsafe:
+ 'Scripting', 'Object', 'Forms',
+ // Sorta legacy, but present in strict:
+ 'Name',
+ );
+ $transitional = array('Legacy', 'Target', 'Iframe');
+ $xml = array('XMLCommonAttributes');
+ $non_xml = array('NonXMLCommonAttributes');
+
+ // setup basic doctypes
+ $this->doctypes->register(
+ 'HTML 4.01 Transitional',
+ false,
+ array_merge($common, $transitional, $non_xml),
+ array('Tidy_Transitional', 'Tidy_Proprietary'),
+ array(),
+ '-//W3C//DTD HTML 4.01 Transitional//EN',
+ 'http://www.w3.org/TR/html4/loose.dtd'
+ );
+
+ $this->doctypes->register(
+ 'HTML 4.01 Strict',
+ false,
+ array_merge($common, $non_xml),
+ array('Tidy_Strict', 'Tidy_Proprietary', 'Tidy_Name'),
+ array(),
+ '-//W3C//DTD HTML 4.01//EN',
+ 'http://www.w3.org/TR/html4/strict.dtd'
+ );
+
+ $this->doctypes->register(
+ 'XHTML 1.0 Transitional',
+ true,
+ array_merge($common, $transitional, $xml, $non_xml),
+ array('Tidy_Transitional', 'Tidy_XHTML', 'Tidy_Proprietary', 'Tidy_Name'),
+ array(),
+ '-//W3C//DTD XHTML 1.0 Transitional//EN',
+ 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'
+ );
+
+ $this->doctypes->register(
+ 'XHTML 1.0 Strict',
+ true,
+ array_merge($common, $xml, $non_xml),
+ array('Tidy_Strict', 'Tidy_XHTML', 'Tidy_Strict', 'Tidy_Proprietary', 'Tidy_Name'),
+ array(),
+ '-//W3C//DTD XHTML 1.0 Strict//EN',
+ 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'
+ );
+
+ $this->doctypes->register(
+ 'XHTML 1.1',
+ true,
+ // Iframe is a real XHTML 1.1 module, despite being
+ // "transitional"!
+ array_merge($common, $xml, array('Ruby', 'Iframe')),
+ array('Tidy_Strict', 'Tidy_XHTML', 'Tidy_Proprietary', 'Tidy_Strict', 'Tidy_Name'), // Tidy_XHTML1_1
+ array(),
+ '-//W3C//DTD XHTML 1.1//EN',
+ 'http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd'
+ );
+
+ }
+
+ /**
+ * Registers a module to the recognized module list, useful for
+ * overloading pre-existing modules.
+ * @param $module Mixed: string module name, with or without
+ * HTMLPurifier_HTMLModule prefix, or instance of
+ * subclass of HTMLPurifier_HTMLModule.
+ * @param $overload Boolean whether or not to overload previous modules.
+ * If this is not set, and you do overload a module,
+ * HTML Purifier will complain with a warning.
+ * @note This function will not call autoload, you must instantiate
+ * (and thus invoke) autoload outside the method.
+ * @note If a string is passed as a module name, different variants
+ * will be tested in this order:
+ * - Check for HTMLPurifier_HTMLModule_$name
+ * - Check all prefixes with $name in order they were added
+ * - Check for literal object name
+ * - Throw fatal error
+ * If your object name collides with an internal class, specify
+ * your module manually. All modules must have been included
+ * externally: registerModule will not perform inclusions for you!
+ */
+ public function registerModule($module, $overload = false)
+ {
+ if (is_string($module)) {
+ // attempt to load the module
+ $original_module = $module;
+ $ok = false;
+ foreach ($this->prefixes as $prefix) {
+ $module = $prefix . $original_module;
+ if (class_exists($module)) {
+ $ok = true;
+ break;
+ }
+ }
+ if (!$ok) {
+ $module = $original_module;
+ if (!class_exists($module)) {
+ trigger_error(
+ $original_module . ' module does not exist',
+ E_USER_ERROR
+ );
+ return;
+ }
+ }
+ $module = new $module();
+ }
+ if (empty($module->name)) {
+ trigger_error('Module instance of ' . get_class($module) . ' must have name');
+ return;
+ }
+ if (!$overload && isset($this->registeredModules[$module->name])) {
+ trigger_error('Overloading ' . $module->name . ' without explicit overload parameter', E_USER_WARNING);
+ }
+ $this->registeredModules[$module->name] = $module;
+ }
+
+ /**
+ * Adds a module to the current doctype by first registering it,
+ * and then tacking it on to the active doctype
+ */
+ public function addModule($module)
+ {
+ $this->registerModule($module);
+ if (is_object($module)) {
+ $module = $module->name;
+ }
+ $this->userModules[] = $module;
+ }
+
+ /**
+ * Adds a class prefix that registerModule() will use to resolve a
+ * string name to a concrete class
+ */
+ public function addPrefix($prefix)
+ {
+ $this->prefixes[] = $prefix;
+ }
+
+ /**
+ * Performs processing on modules, after being called you may
+ * use getElement() and getElements()
+ * @param HTMLPurifier_Config $config
+ */
+ public function setup($config)
+ {
+ $this->trusted = $config->get('HTML.Trusted');
+
+ // generate
+ $this->doctype = $this->doctypes->make($config);
+ $modules = $this->doctype->modules;
+
+ // take out the default modules that aren't allowed
+ $lookup = $config->get('HTML.AllowedModules');
+ $special_cases = $config->get('HTML.CoreModules');
+
+ if (is_array($lookup)) {
+ foreach ($modules as $k => $m) {
+ if (isset($special_cases[$m])) {
+ continue;
+ }
+ if (!isset($lookup[$m])) {
+ unset($modules[$k]);
+ }
+ }
+ }
+
+ // custom modules
+ if ($config->get('HTML.Proprietary')) {
+ $modules[] = 'Proprietary';
+ }
+ if ($config->get('HTML.SafeObject')) {
+ $modules[] = 'SafeObject';
+ }
+ if ($config->get('HTML.SafeEmbed')) {
+ $modules[] = 'SafeEmbed';
+ }
+ if ($config->get('HTML.SafeScripting') !== array()) {
+ $modules[] = 'SafeScripting';
+ }
+ if ($config->get('HTML.Nofollow')) {
+ $modules[] = 'Nofollow';
+ }
+ if ($config->get('HTML.TargetBlank')) {
+ $modules[] = 'TargetBlank';
+ }
+ // NB: HTML.TargetNoreferrer and HTML.TargetNoopener must be AFTER HTML.TargetBlank
+ // so that its post-attr-transform gets run afterwards.
+ if ($config->get('HTML.TargetNoreferrer')) {
+ $modules[] = 'TargetNoreferrer';
+ }
+ if ($config->get('HTML.TargetNoopener')) {
+ $modules[] = 'TargetNoopener';
+ }
+
+ // merge in custom modules
+ $modules = array_merge($modules, $this->userModules);
+
+ foreach ($modules as $module) {
+ $this->processModule($module);
+ $this->modules[$module]->setup($config);
+ }
+
+ foreach ($this->doctype->tidyModules as $module) {
+ $this->processModule($module);
+ $this->modules[$module]->setup($config);
+ }
+
+ // prepare any injectors
+ foreach ($this->modules as $module) {
+ $n = array();
+ foreach ($module->info_injector as $injector) {
+ if (!is_object($injector)) {
+ $class = "HTMLPurifier_Injector_$injector";
+ $injector = new $class;
+ }
+ $n[$injector->name] = $injector;
+ }
+ $module->info_injector = $n;
+ }
+
+ // setup lookup table based on all valid modules
+ foreach ($this->modules as $module) {
+ foreach ($module->info as $name => $def) {
+ if (!isset($this->elementLookup[$name])) {
+ $this->elementLookup[$name] = array();
+ }
+ $this->elementLookup[$name][] = $module->name;
+ }
+ }
+
+ // note the different choice
+ $this->contentSets = new HTMLPurifier_ContentSets(
+ // content set assembly deals with all possible modules,
+ // not just ones deemed to be "safe"
+ $this->modules
+ );
+ $this->attrCollections = new HTMLPurifier_AttrCollections(
+ $this->attrTypes,
+ // there is no way to directly disable a global attribute,
+ // but using AllowedAttributes or simply not including
+ // the module in your custom doctype should be sufficient
+ $this->modules
+ );
+ }
+
+ /**
+ * Takes a module and adds it to the active module collection,
+ * registering it if necessary.
+ */
+ public function processModule($module)
+ {
+ if (!isset($this->registeredModules[$module]) || is_object($module)) {
+ $this->registerModule($module);
+ }
+ $this->modules[$module] = $this->registeredModules[$module];
+ }
+
+ /**
+ * Retrieves merged element definitions.
+ * @return Array of HTMLPurifier_ElementDef
+ */
+ public function getElements()
+ {
+ $elements = array();
+ foreach ($this->modules as $module) {
+ if (!$this->trusted && !$module->safe) {
+ continue;
+ }
+ foreach ($module->info as $name => $v) {
+ if (isset($elements[$name])) {
+ continue;
+ }
+ $elements[$name] = $this->getElement($name);
+ }
+ }
+
+ // remove dud elements, this happens when an element that
+ // appeared to be safe actually wasn't
+ foreach ($elements as $n => $v) {
+ if ($v === false) {
+ unset($elements[$n]);
+ }
+ }
+
+ return $elements;
+
+ }
+
+ /**
+ * Retrieves a single merged element definition
+ * @param string $name Name of element
+ * @param bool $trusted Boolean trusted overriding parameter: set to true
+ * if you want the full version of an element
+ * @return HTMLPurifier_ElementDef Merged HTMLPurifier_ElementDef
+ * @note You may notice that modules are getting iterated over twice (once
+ * in getElements() and once here). This
+ * is because
+ */
+ public function getElement($name, $trusted = null)
+ {
+ if (!isset($this->elementLookup[$name])) {
+ return false;
+ }
+
+ // setup global state variables
+ $def = false;
+ if ($trusted === null) {
+ $trusted = $this->trusted;
+ }
+
+ // iterate through each module that has registered itself to this
+ // element
+ foreach ($this->elementLookup[$name] as $module_name) {
+ $module = $this->modules[$module_name];
+
+ // refuse to create/merge from a module that is deemed unsafe--
+ // pretend the module doesn't exist--when trusted mode is not on.
+ if (!$trusted && !$module->safe) {
+ continue;
+ }
+
+ // clone is used because, ideally speaking, the original
+ // definition should not be modified. Usually, this will
+ // make no difference, but for consistency's sake
+ $new_def = clone $module->info[$name];
+
+ if (!$def && $new_def->standalone) {
+ $def = $new_def;
+ } elseif ($def) {
+ // This will occur even if $new_def is standalone. In practice,
+ // this will usually result in a full replacement.
+ $def->mergeIn($new_def);
+ } else {
+ // :TODO:
+ // non-standalone definitions that don't have a standalone
+ // to merge into could be deferred to the end
+ // HOWEVER, it is perfectly valid for a non-standalone
+ // definition to lack a standalone definition, even
+ // after all processing: this allows us to safely
+ // specify extra attributes for elements that may not be
+ // enabled all in one place. In particular, this might
+ // be the case for trusted elements. WARNING: care must
+ // be taken that the /extra/ definitions are all safe.
+ continue;
+ }
+
+ // attribute value expansions
+ $this->attrCollections->performInclusions($def->attr);
+ $this->attrCollections->expandIdentifiers($def->attr, $this->attrTypes);
+
+ // descendants_are_inline, for ChildDef_Chameleon
+ if (is_string($def->content_model) &&
+ strpos($def->content_model, 'Inline') !== false) {
+ if ($name != 'del' && $name != 'ins') {
+ // this is for you, ins/del
+ $def->descendants_are_inline = true;
+ }
+ }
+
+ $this->contentSets->generateChildDef($def, $module);
+ }
+
+ // This can occur if there is a blank definition, but no base to
+ // mix it in with
+ if (!$def) {
+ return false;
+ }
+
+ // add information on required attributes
+ foreach ($def->attr as $attr_name => $attr_def) {
+ if ($attr_def->required) {
+ $def->required_attr[] = $attr_name;
+ }
+ }
+ return $def;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/IDAccumulator.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/IDAccumulator.php
index 65c902c07..65c902c07 100644
--- a/library/HTMLPurifier/IDAccumulator.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/IDAccumulator.php
diff --git a/library/HTMLPurifier/Injector.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector.php
index 5060eef9e..5060eef9e 100644
--- a/library/HTMLPurifier/Injector.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector.php
diff --git a/library/HTMLPurifier/Injector/AutoParagraph.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/AutoParagraph.php
index 4afdd128d..4afdd128d 100644
--- a/library/HTMLPurifier/Injector/AutoParagraph.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/AutoParagraph.php
diff --git a/library/HTMLPurifier/Injector/DisplayLinkURI.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/DisplayLinkURI.php
index c19b1bc27..c19b1bc27 100644
--- a/library/HTMLPurifier/Injector/DisplayLinkURI.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/DisplayLinkURI.php
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/Linkify.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/Linkify.php
new file mode 100644
index 000000000..74f83eaa7
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/Linkify.php
@@ -0,0 +1,64 @@
+<?php
+
+/**
+ * Injector that converts http, https and ftp text URLs to actual links.
+ */
+class HTMLPurifier_Injector_Linkify extends HTMLPurifier_Injector
+{
+ /**
+ * @type string
+ */
+ public $name = 'Linkify';
+
+ /**
+ * @type array
+ */
+ public $needed = array('a' => array('href'));
+
+ /**
+ * @param HTMLPurifier_Token $token
+ */
+ public function handleText(&$token)
+ {
+ if (!$this->allowsElement('a')) {
+ return;
+ }
+
+ if (strpos($token->data, '://') === false) {
+ // our really quick heuristic failed, abort
+ // this may not work so well if we want to match things like
+ // "google.com", but then again, most people don't
+ return;
+ }
+
+ // there is/are URL(s). Let's split the string.
+ // We use this regex:
+ // https://gist.github.com/gruber/249502
+ // but with @cscott's backtracking fix and also
+ // the Unicode characters un-Unicodified.
+ $bits = preg_split(
+ '/\\b((?:[a-z][\\w\\-]+:(?:\\/{1,3}|[a-z0-9%])|www\\d{0,3}[.]|[a-z0-9.\\-]+[.][a-z]{2,4}\\/)(?:[^\\s()<>]|\\((?:[^\\s()<>]|(?:\\([^\\s()<>]+\\)))*\\))+(?:\\((?:[^\\s()<>]|(?:\\([^\\s()<>]+\\)))*\\)|[^\\s`!()\\[\\]{};:\'".,<>?\x{00ab}\x{00bb}\x{201c}\x{201d}\x{2018}\x{2019}]))/iu',
+ $token->data, -1, PREG_SPLIT_DELIM_CAPTURE);
+
+
+ $token = array();
+
+ // $i = index
+ // $c = count
+ // $l = is link
+ for ($i = 0, $c = count($bits), $l = false; $i < $c; $i++, $l = !$l) {
+ if (!$l) {
+ if ($bits[$i] === '') {
+ continue;
+ }
+ $token[] = new HTMLPurifier_Token_Text($bits[$i]);
+ } else {
+ $token[] = new HTMLPurifier_Token_Start('a', array('href' => $bits[$i]));
+ $token[] = new HTMLPurifier_Token_Text($bits[$i]);
+ $token[] = new HTMLPurifier_Token_End('a');
+ }
+ }
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/Injector/PurifierLinkify.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/PurifierLinkify.php
index cb9046f33..cb9046f33 100644
--- a/library/HTMLPurifier/Injector/PurifierLinkify.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/PurifierLinkify.php
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/RemoveEmpty.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/RemoveEmpty.php
new file mode 100644
index 000000000..0ebc477c6
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/RemoveEmpty.php
@@ -0,0 +1,112 @@
+<?php
+
+class HTMLPurifier_Injector_RemoveEmpty extends HTMLPurifier_Injector
+{
+ /**
+ * @type HTMLPurifier_Context
+ */
+ private $context;
+
+ /**
+ * @type HTMLPurifier_Config
+ */
+ private $config;
+
+ /**
+ * @type HTMLPurifier_AttrValidator
+ */
+ private $attrValidator;
+
+ /**
+ * @type bool
+ */
+ private $removeNbsp;
+
+ /**
+ * @type bool
+ */
+ private $removeNbspExceptions;
+
+ /**
+ * Cached contents of %AutoFormat.RemoveEmpty.Predicate
+ * @type array
+ */
+ private $exclude;
+
+ /**
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return void
+ */
+ public function prepare($config, $context)
+ {
+ parent::prepare($config, $context);
+ $this->config = $config;
+ $this->context = $context;
+ $this->removeNbsp = $config->get('AutoFormat.RemoveEmpty.RemoveNbsp');
+ $this->removeNbspExceptions = $config->get('AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions');
+ $this->exclude = $config->get('AutoFormat.RemoveEmpty.Predicate');
+ foreach ($this->exclude as $key => $attrs) {
+ if (!is_array($attrs)) {
+ // HACK, see HTMLPurifier/Printer/ConfigForm.php
+ $this->exclude[$key] = explode(';', $attrs);
+ }
+ }
+ $this->attrValidator = new HTMLPurifier_AttrValidator();
+ }
+
+ /**
+ * @param HTMLPurifier_Token $token
+ */
+ public function handleElement(&$token)
+ {
+ if (!$token instanceof HTMLPurifier_Token_Start) {
+ return;
+ }
+ $next = false;
+ $deleted = 1; // the current tag
+ for ($i = count($this->inputZipper->back) - 1; $i >= 0; $i--, $deleted++) {
+ $next = $this->inputZipper->back[$i];
+ if ($next instanceof HTMLPurifier_Token_Text) {
+ if ($next->is_whitespace) {
+ continue;
+ }
+ if ($this->removeNbsp && !isset($this->removeNbspExceptions[$token->name])) {
+ $plain = str_replace("\xC2\xA0", "", $next->data);
+ $isWsOrNbsp = $plain === '' || ctype_space($plain);
+ if ($isWsOrNbsp) {
+ continue;
+ }
+ }
+ }
+ break;
+ }
+ if (!$next || ($next instanceof HTMLPurifier_Token_End && $next->name == $token->name)) {
+ $this->attrValidator->validateToken($token, $this->config, $this->context);
+ $token->armor['ValidateAttributes'] = true;
+ if (isset($this->exclude[$token->name])) {
+ $r = true;
+ foreach ($this->exclude[$token->name] as $elem) {
+ if (!isset($token->attr[$elem])) $r = false;
+ }
+ if ($r) return;
+ }
+ if (isset($token->attr['id']) || isset($token->attr['name'])) {
+ return;
+ }
+ $token = $deleted + 1;
+ for ($b = 0, $c = count($this->inputZipper->front); $b < $c; $b++) {
+ $prev = $this->inputZipper->front[$b];
+ if ($prev instanceof HTMLPurifier_Token_Text && $prev->is_whitespace) {
+ continue;
+ }
+ break;
+ }
+ // This is safe because we removed the token that triggered this.
+ $this->rewindOffset($b+$deleted);
+ return;
+ }
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/Injector/RemoveSpansWithoutAttributes.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/RemoveSpansWithoutAttributes.php
index 9ee7aa84d..9ee7aa84d 100644
--- a/library/HTMLPurifier/Injector/RemoveSpansWithoutAttributes.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/RemoveSpansWithoutAttributes.php
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/SafeObject.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/SafeObject.php
new file mode 100644
index 000000000..317f7864d
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/SafeObject.php
@@ -0,0 +1,124 @@
+<?php
+
+/**
+ * Adds important param elements to inside of object in order to make
+ * things safe.
+ */
+class HTMLPurifier_Injector_SafeObject extends HTMLPurifier_Injector
+{
+ /**
+ * @type string
+ */
+ public $name = 'SafeObject';
+
+ /**
+ * @type array
+ */
+ public $needed = array('object', 'param');
+
+ /**
+ * @type array
+ */
+ protected $objectStack = array();
+
+ /**
+ * @type array
+ */
+ protected $paramStack = array();
+
+ /**
+ * Keep this synchronized with AttrTransform/SafeParam.php.
+ * @type array
+ */
+ protected $addParam = array(
+ 'allowScriptAccess' => 'never',
+ 'allowNetworking' => 'internal',
+ );
+
+ /**
+ * These are all lower-case keys.
+ * @type array
+ */
+ protected $allowedParam = array(
+ 'wmode' => true,
+ 'movie' => true,
+ 'flashvars' => true,
+ 'src' => true,
+ 'allowfullscreen' => true, // if omitted, assume to be 'false'
+ );
+
+ /**
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return void
+ */
+ public function prepare($config, $context)
+ {
+ parent::prepare($config, $context);
+ }
+
+ /**
+ * @param HTMLPurifier_Token $token
+ */
+ public function handleElement(&$token)
+ {
+ if ($token->name == 'object') {
+ $this->objectStack[] = $token;
+ $this->paramStack[] = array();
+ $new = array($token);
+ foreach ($this->addParam as $name => $value) {
+ $new[] = new HTMLPurifier_Token_Empty('param', array('name' => $name, 'value' => $value));
+ }
+ $token = $new;
+ } elseif ($token->name == 'param') {
+ $nest = count($this->currentNesting) - 1;
+ if ($nest >= 0 && $this->currentNesting[$nest]->name === 'object') {
+ $i = count($this->objectStack) - 1;
+ if (!isset($token->attr['name'])) {
+ $token = false;
+ return;
+ }
+ $n = $token->attr['name'];
+ // We need this fix because YouTube doesn't supply a data
+ // attribute, which we need if a type is specified. This is
+ // *very* Flash specific.
+ if (!isset($this->objectStack[$i]->attr['data']) &&
+ ($token->attr['name'] == 'movie' || $token->attr['name'] == 'src')
+ ) {
+ $this->objectStack[$i]->attr['data'] = $token->attr['value'];
+ }
+ // Check if the parameter is the correct value but has not
+ // already been added
+ if (!isset($this->paramStack[$i][$n]) &&
+ isset($this->addParam[$n]) &&
+ $token->attr['name'] === $this->addParam[$n]) {
+ // keep token, and add to param stack
+ $this->paramStack[$i][$n] = true;
+ } elseif (isset($this->allowedParam[strtolower($n)])) {
+ // keep token, don't do anything to it
+ // (could possibly check for duplicates here)
+ // Note: In principle, parameters should be case sensitive.
+ // But it seems they are not really; so accept any case.
+ } else {
+ $token = false;
+ }
+ } else {
+ // not directly inside an object, DENY!
+ $token = false;
+ }
+ }
+ }
+
+ public function handleEnd(&$token)
+ {
+ // This is the WRONG way of handling the object and param stacks;
+ // we should be inserting them directly on the relevant object tokens
+ // so that the global stack handling handles it.
+ if ($token->name == 'object') {
+ array_pop($this->objectStack);
+ array_pop($this->paramStack);
+ }
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/Language.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Language.php
index 65277dd43..65277dd43 100644
--- a/library/HTMLPurifier/Language.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Language.php
diff --git a/library/HTMLPurifier/Language/classes/en-x-test.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Language/classes/en-x-test.php
index 8828f5cde..8828f5cde 100644
--- a/library/HTMLPurifier/Language/classes/en-x-test.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Language/classes/en-x-test.php
diff --git a/library/HTMLPurifier/Language/messages/en-x-test.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Language/messages/en-x-test.php
index 1c046f379..1c046f379 100644
--- a/library/HTMLPurifier/Language/messages/en-x-test.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Language/messages/en-x-test.php
diff --git a/library/HTMLPurifier/Language/messages/en-x-testmini.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Language/messages/en-x-testmini.php
index 806c83fbf..806c83fbf 100644
--- a/library/HTMLPurifier/Language/messages/en-x-testmini.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Language/messages/en-x-testmini.php
diff --git a/library/HTMLPurifier/Language/messages/en.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Language/messages/en.php
index c7f197e1e..c7f197e1e 100644
--- a/library/HTMLPurifier/Language/messages/en.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Language/messages/en.php
diff --git a/library/HTMLPurifier/LanguageFactory.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/LanguageFactory.php
index 4e35272d8..4e35272d8 100644
--- a/library/HTMLPurifier/LanguageFactory.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/LanguageFactory.php
diff --git a/library/HTMLPurifier/Length.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Length.php
index bbfbe6624..bbfbe6624 100644
--- a/library/HTMLPurifier/Length.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Length.php
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer.php
new file mode 100644
index 000000000..99b3c7df0
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer.php
@@ -0,0 +1,382 @@
+<?php
+
+/**
+ * Forgivingly lexes HTML (SGML-style) markup into tokens.
+ *
+ * A lexer parses a string of SGML-style markup and converts them into
+ * corresponding tokens. It doesn't check for well-formedness, although its
+ * internal mechanism may make this automatic (such as the case of
+ * HTMLPurifier_Lexer_DOMLex). There are several implementations to choose
+ * from.
+ *
+ * A lexer is HTML-oriented: it might work with XML, but it's not
+ * recommended, as we adhere to a subset of the specification for optimization
+ * reasons. This might change in the future. Also, most tokenizers are not
+ * expected to handle DTDs or PIs.
+ *
+ * This class should not be directly instantiated, but you may use create() to
+ * retrieve a default copy of the lexer. Being a supertype, this class
+ * does not actually define any implementation, but offers commonly used
+ * convenience functions for subclasses.
+ *
+ * @note The unit tests will instantiate this class for testing purposes, as
+ * many of the utility functions require a class to be instantiated.
+ * This means that, even though this class is not runnable, it will
+ * not be declared abstract.
+ *
+ * @par
+ *
+ * @note
+ * We use tokens rather than create a DOM representation because DOM would:
+ *
+ * @par
+ * -# Require more processing and memory to create,
+ * -# Is not streamable, and
+ * -# Has the entire document structure (html and body not needed).
+ *
+ * @par
+ * However, DOM is helpful in that it makes it easy to move around nodes
+ * without a lot of lookaheads to see when a tag is closed. This is a
+ * limitation of the token system and some workarounds would be nice.
+ */
+class HTMLPurifier_Lexer
+{
+
+ /**
+ * Whether or not this lexer implements line-number/column-number tracking.
+ * If it does, set to true.
+ */
+ public $tracksLineNumbers = false;
+
+ // -- STATIC ----------------------------------------------------------
+
+ /**
+ * Retrieves or sets the default Lexer as a Prototype Factory.
+ *
+ * By default HTMLPurifier_Lexer_DOMLex will be returned. There are
+ * a few exceptions involving special features that only DirectLex
+ * implements.
+ *
+ * @note The behavior of this class has changed, rather than accepting
+ * a prototype object, it now accepts a configuration object.
+ * To specify your own prototype, set %Core.LexerImpl to it.
+ * This change in behavior de-singletonizes the lexer object.
+ *
+ * @param HTMLPurifier_Config $config
+ * @return HTMLPurifier_Lexer
+ * @throws HTMLPurifier_Exception
+ */
+ public static function create($config)
+ {
+ if (!($config instanceof HTMLPurifier_Config)) {
+ $lexer = $config;
+ trigger_error(
+ "Passing a prototype to
+ HTMLPurifier_Lexer::create() is deprecated, please instead
+ use %Core.LexerImpl",
+ E_USER_WARNING
+ );
+ } else {
+ $lexer = $config->get('Core.LexerImpl');
+ }
+
+ $needs_tracking =
+ $config->get('Core.MaintainLineNumbers') ||
+ $config->get('Core.CollectErrors');
+
+ $inst = null;
+ if (is_object($lexer)) {
+ $inst = $lexer;
+ } else {
+ if (is_null($lexer)) {
+ do {
+ // auto-detection algorithm
+ if ($needs_tracking) {
+ $lexer = 'DirectLex';
+ break;
+ }
+
+ if (class_exists('DOMDocument') &&
+ method_exists('DOMDocument', 'loadHTML') &&
+ !extension_loaded('domxml')
+ ) {
+ // check for DOM support, because while it's part of the
+ // core, it can be disabled compile time. Also, the PECL
+ // domxml extension overrides the default DOM, and is evil
+ // and nasty and we shan't bother to support it
+ $lexer = 'DOMLex';
+ } else {
+ $lexer = 'DirectLex';
+ }
+ } while (0);
+ } // do..while so we can break
+
+ // instantiate recognized string names
+ switch ($lexer) {
+ case 'DOMLex':
+ $inst = new HTMLPurifier_Lexer_DOMLex();
+ break;
+ case 'DirectLex':
+ $inst = new HTMLPurifier_Lexer_DirectLex();
+ break;
+ case 'PH5P':
+ $inst = new HTMLPurifier_Lexer_PH5P();
+ break;
+ default:
+ throw new HTMLPurifier_Exception(
+ "Cannot instantiate unrecognized Lexer type " .
+ htmlspecialchars($lexer)
+ );
+ }
+ }
+
+ if (!$inst) {
+ throw new HTMLPurifier_Exception('No lexer was instantiated');
+ }
+
+ // once PHP DOM implements native line numbers, or we
+ // hack out something using XSLT, remove this stipulation
+ if ($needs_tracking && !$inst->tracksLineNumbers) {
+ throw new HTMLPurifier_Exception(
+ 'Cannot use lexer that does not support line numbers with ' .
+ 'Core.MaintainLineNumbers or Core.CollectErrors (use DirectLex instead)'
+ );
+ }
+
+ return $inst;
+
+ }
+
+ // -- CONVENIENCE MEMBERS ---------------------------------------------
+
+ public function __construct()
+ {
+ $this->_entity_parser = new HTMLPurifier_EntityParser();
+ }
+
+ /**
+ * Most common entity to raw value conversion table for special entities.
+ * @type array
+ */
+ protected $_special_entity2str =
+ array(
+ '&quot;' => '"',
+ '&amp;' => '&',
+ '&lt;' => '<',
+ '&gt;' => '>',
+ '&#39;' => "'",
+ '&#039;' => "'",
+ '&#x27;' => "'"
+ );
+
+ public function parseText($string, $config) {
+ return $this->parseData($string, false, $config);
+ }
+
+ public function parseAttr($string, $config) {
+ return $this->parseData($string, true, $config);
+ }
+
+ /**
+ * Parses special entities into the proper characters.
+ *
+ * This string will translate escaped versions of the special characters
+ * into the correct ones.
+ *
+ * @param string $string String character data to be parsed.
+ * @return string Parsed character data.
+ */
+ public function parseData($string, $is_attr, $config)
+ {
+ // following functions require at least one character
+ if ($string === '') {
+ return '';
+ }
+
+ // subtracts amps that cannot possibly be escaped
+ $num_amp = substr_count($string, '&') - substr_count($string, '& ') -
+ ($string[strlen($string) - 1] === '&' ? 1 : 0);
+
+ if (!$num_amp) {
+ return $string;
+ } // abort if no entities
+ $num_esc_amp = substr_count($string, '&amp;');
+ $string = strtr($string, $this->_special_entity2str);
+
+ // code duplication for sake of optimization, see above
+ $num_amp_2 = substr_count($string, '&') - substr_count($string, '& ') -
+ ($string[strlen($string) - 1] === '&' ? 1 : 0);
+
+ if ($num_amp_2 <= $num_esc_amp) {
+ return $string;
+ }
+
+ // hmm... now we have some uncommon entities. Use the callback.
+ if ($config->get('Core.LegacyEntityDecoder')) {
+ $string = $this->_entity_parser->substituteSpecialEntities($string);
+ } else {
+ if ($is_attr) {
+ $string = $this->_entity_parser->substituteAttrEntities($string);
+ } else {
+ $string = $this->_entity_parser->substituteTextEntities($string);
+ }
+ }
+ return $string;
+ }
+
+ /**
+ * Lexes an HTML string into tokens.
+ * @param $string String HTML.
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return HTMLPurifier_Token[] array representation of HTML.
+ */
+ public function tokenizeHTML($string, $config, $context)
+ {
+ trigger_error('Call to abstract class', E_USER_ERROR);
+ }
+
+ /**
+ * Translates CDATA sections into regular sections (through escaping).
+ * @param string $string HTML string to process.
+ * @return string HTML with CDATA sections escaped.
+ */
+ protected static function escapeCDATA($string)
+ {
+ return preg_replace_callback(
+ '/<!\[CDATA\[(.+?)\]\]>/s',
+ array('HTMLPurifier_Lexer', 'CDATACallback'),
+ $string
+ );
+ }
+
+ /**
+ * Special CDATA case that is especially convoluted for <script>
+ * @param string $string HTML string to process.
+ * @return string HTML with CDATA sections escaped.
+ */
+ protected static function escapeCommentedCDATA($string)
+ {
+ return preg_replace_callback(
+ '#<!--//--><!\[CDATA\[//><!--(.+?)//--><!\]\]>#s',
+ array('HTMLPurifier_Lexer', 'CDATACallback'),
+ $string
+ );
+ }
+
+ /**
+ * Special Internet Explorer conditional comments should be removed.
+ * @param string $string HTML string to process.
+ * @return string HTML with conditional comments removed.
+ */
+ protected static function removeIEConditional($string)
+ {
+ return preg_replace(
+ '#<!--\[if [^>]+\]>.*?<!\[endif\]-->#si', // probably should generalize for all strings
+ '',
+ $string
+ );
+ }
+
+ /**
+ * Callback function for escapeCDATA() that does the work.
+ *
+ * @warning Though this is public in order to let the callback happen,
+ * calling it directly is not recommended.
+ * @param array $matches PCRE matches array, with index 0 the entire match
+ * and 1 the inside of the CDATA section.
+ * @return string Escaped internals of the CDATA section.
+ */
+ protected static function CDATACallback($matches)
+ {
+ // not exactly sure why the character set is needed, but whatever
+ return htmlspecialchars($matches[1], ENT_COMPAT, 'UTF-8');
+ }
+
+ /**
+ * Takes a piece of HTML and normalizes it by converting entities, fixing
+ * encoding, extracting bits, and other good stuff.
+ * @param string $html HTML.
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return string
+ * @todo Consider making protected
+ */
+ public function normalize($html, $config, $context)
+ {
+ // normalize newlines to \n
+ if ($config->get('Core.NormalizeNewlines')) {
+ $html = str_replace("\r\n", "\n", $html);
+ $html = str_replace("\r", "\n", $html);
+ }
+
+ if ($config->get('HTML.Trusted')) {
+ // escape convoluted CDATA
+ $html = $this->escapeCommentedCDATA($html);
+ }
+
+ // escape CDATA
+ $html = $this->escapeCDATA($html);
+
+ $html = $this->removeIEConditional($html);
+
+ // extract body from document if applicable
+ if ($config->get('Core.ConvertDocumentToFragment')) {
+ $e = false;
+ if ($config->get('Core.CollectErrors')) {
+ $e =& $context->get('ErrorCollector');
+ }
+ $new_html = $this->extractBody($html);
+ if ($e && $new_html != $html) {
+ $e->send(E_WARNING, 'Lexer: Extracted body');
+ }
+ $html = $new_html;
+ }
+
+ // expand entities that aren't the big five
+ if ($config->get('Core.LegacyEntityDecoder')) {
+ $html = $this->_entity_parser->substituteNonSpecialEntities($html);
+ }
+
+ // clean into wellformed UTF-8 string for an SGML context: this has
+ // to be done after entity expansion because the entities sometimes
+ // represent non-SGML characters (horror, horror!)
+ $html = HTMLPurifier_Encoder::cleanUTF8($html);
+
+ // if processing instructions are to removed, remove them now
+ if ($config->get('Core.RemoveProcessingInstructions')) {
+ $html = preg_replace('#<\?.+?\?>#s', '', $html);
+ }
+
+ $hidden_elements = $config->get('Core.HiddenElements');
+ if ($config->get('Core.AggressivelyRemoveScript') &&
+ !($config->get('HTML.Trusted') || !$config->get('Core.RemoveScriptContents')
+ || empty($hidden_elements["script"]))) {
+ $html = preg_replace('#<script[^>]*>.*?</script>#i', '', $html);
+ }
+
+ return $html;
+ }
+
+ /**
+ * Takes a string of HTML (fragment or document) and returns the content
+ * @todo Consider making protected
+ */
+ public function extractBody($html)
+ {
+ $matches = array();
+ $result = preg_match('|(.*?)<body[^>]*>(.*)</body>|is', $html, $matches);
+ if ($result) {
+ // Make sure it's not in a comment
+ $comment_start = strrpos($matches[1], '<!--');
+ $comment_end = strrpos($matches[1], '-->');
+ if ($comment_start === false ||
+ ($comment_end !== false && $comment_end > $comment_start)) {
+ return $matches[2];
+ }
+ }
+ return $html;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/DOMLex.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/DOMLex.php
new file mode 100644
index 000000000..22ab5820c
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/DOMLex.php
@@ -0,0 +1,291 @@
+<?php
+
+/**
+ * Parser that uses PHP 5's DOM extension (part of the core).
+ *
+ * In PHP 5, the DOM XML extension was revamped into DOM and added to the core.
+ * It gives us a forgiving HTML parser, which we use to transform the HTML
+ * into a DOM, and then into the tokens. It is blazingly fast (for large
+ * documents, it performs twenty times faster than
+ * HTMLPurifier_Lexer_DirectLex,and is the default choice for PHP 5.
+ *
+ * @note Any empty elements will have empty tokens associated with them, even if
+ * this is prohibited by the spec. This is cannot be fixed until the spec
+ * comes into play.
+ *
+ * @note PHP's DOM extension does not actually parse any entities, we use
+ * our own function to do that.
+ *
+ * @warning DOM tends to drop whitespace, which may wreak havoc on indenting.
+ * If this is a huge problem, due to the fact that HTML is hand
+ * edited and you are unable to get a parser cache that caches the
+ * the output of HTML Purifier while keeping the original HTML lying
+ * around, you may want to run Tidy on the resulting output or use
+ * HTMLPurifier_DirectLex
+ */
+
+class HTMLPurifier_Lexer_DOMLex extends HTMLPurifier_Lexer
+{
+
+ /**
+ * @type HTMLPurifier_TokenFactory
+ */
+ private $factory;
+
+ public function __construct()
+ {
+ // setup the factory
+ parent::__construct();
+ $this->factory = new HTMLPurifier_TokenFactory();
+ }
+
+ /**
+ * @param string $html
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return HTMLPurifier_Token[]
+ */
+ public function tokenizeHTML($html, $config, $context)
+ {
+ $html = $this->normalize($html, $config, $context);
+
+ // attempt to armor stray angled brackets that cannot possibly
+ // form tags and thus are probably being used as emoticons
+ if ($config->get('Core.AggressivelyFixLt')) {
+ $char = '[^a-z!\/]';
+ $comment = "/<!--(.*?)(-->|\z)/is";
+ $html = preg_replace_callback($comment, array($this, 'callbackArmorCommentEntities'), $html);
+ do {
+ $old = $html;
+ $html = preg_replace("/<($char)/i", '&lt;\\1', $html);
+ } while ($html !== $old);
+ $html = preg_replace_callback($comment, array($this, 'callbackUndoCommentSubst'), $html); // fix comments
+ }
+
+ // preprocess html, essential for UTF-8
+ $html = $this->wrapHTML($html, $config, $context);
+
+ $doc = new DOMDocument();
+ $doc->encoding = 'UTF-8'; // theoretically, the above has this covered
+
+ set_error_handler(array($this, 'muteErrorHandler'));
+ $doc->loadHTML($html);
+ restore_error_handler();
+
+ $body = $doc->getElementsByTagName('html')->item(0)-> // <html>
+ getElementsByTagName('body')->item(0); // <body>
+
+ $div = $body->getElementsByTagName('div')->item(0); // <div>
+ $tokens = array();
+ $this->tokenizeDOM($div, $tokens, $config);
+ // If the div has a sibling, that means we tripped across
+ // a premature </div> tag. So remove the div we parsed,
+ // and then tokenize the rest of body. We can't tokenize
+ // the sibling directly as we'll lose the tags in that case.
+ if ($div->nextSibling) {
+ $body->removeChild($div);
+ $this->tokenizeDOM($body, $tokens, $config);
+ }
+ return $tokens;
+ }
+
+ /**
+ * Iterative function that tokenizes a node, putting it into an accumulator.
+ * To iterate is human, to recurse divine - L. Peter Deutsch
+ * @param DOMNode $node DOMNode to be tokenized.
+ * @param HTMLPurifier_Token[] $tokens Array-list of already tokenized tokens.
+ * @return HTMLPurifier_Token of node appended to previously passed tokens.
+ */
+ protected function tokenizeDOM($node, &$tokens, $config)
+ {
+ $level = 0;
+ $nodes = array($level => new HTMLPurifier_Queue(array($node)));
+ $closingNodes = array();
+ do {
+ while (!$nodes[$level]->isEmpty()) {
+ $node = $nodes[$level]->shift(); // FIFO
+ $collect = $level > 0 ? true : false;
+ $needEndingTag = $this->createStartNode($node, $tokens, $collect, $config);
+ if ($needEndingTag) {
+ $closingNodes[$level][] = $node;
+ }
+ if ($node->childNodes && $node->childNodes->length) {
+ $level++;
+ $nodes[$level] = new HTMLPurifier_Queue();
+ foreach ($node->childNodes as $childNode) {
+ $nodes[$level]->push($childNode);
+ }
+ }
+ }
+ $level--;
+ if ($level && isset($closingNodes[$level])) {
+ while ($node = array_pop($closingNodes[$level])) {
+ $this->createEndNode($node, $tokens);
+ }
+ }
+ } while ($level > 0);
+ }
+
+ /**
+ * @param DOMNode $node DOMNode to be tokenized.
+ * @param HTMLPurifier_Token[] $tokens Array-list of already tokenized tokens.
+ * @param bool $collect Says whether or start and close are collected, set to
+ * false at first recursion because it's the implicit DIV
+ * tag you're dealing with.
+ * @return bool if the token needs an endtoken
+ * @todo data and tagName properties don't seem to exist in DOMNode?
+ */
+ protected function createStartNode($node, &$tokens, $collect, $config)
+ {
+ // intercept non element nodes. WE MUST catch all of them,
+ // but we're not getting the character reference nodes because
+ // those should have been preprocessed
+ if ($node->nodeType === XML_TEXT_NODE) {
+ $tokens[] = $this->factory->createText($node->data);
+ return false;
+ } elseif ($node->nodeType === XML_CDATA_SECTION_NODE) {
+ // undo libxml's special treatment of <script> and <style> tags
+ $last = end($tokens);
+ $data = $node->data;
+ // (note $node->tagname is already normalized)
+ if ($last instanceof HTMLPurifier_Token_Start && ($last->name == 'script' || $last->name == 'style')) {
+ $new_data = trim($data);
+ if (substr($new_data, 0, 4) === '<!--') {
+ $data = substr($new_data, 4);
+ if (substr($data, -3) === '-->') {
+ $data = substr($data, 0, -3);
+ } else {
+ // Highly suspicious! Not sure what to do...
+ }
+ }
+ }
+ $tokens[] = $this->factory->createText($this->parseText($data, $config));
+ return false;
+ } elseif ($node->nodeType === XML_COMMENT_NODE) {
+ // this is code is only invoked for comments in script/style in versions
+ // of libxml pre-2.6.28 (regular comments, of course, are still
+ // handled regularly)
+ $tokens[] = $this->factory->createComment($node->data);
+ return false;
+ } elseif ($node->nodeType !== XML_ELEMENT_NODE) {
+ // not-well tested: there may be other nodes we have to grab
+ return false;
+ }
+
+ $attr = $node->hasAttributes() ? $this->transformAttrToAssoc($node->attributes) : array();
+
+ // We still have to make sure that the element actually IS empty
+ if (!$node->childNodes->length) {
+ if ($collect) {
+ $tokens[] = $this->factory->createEmpty($node->tagName, $attr);
+ }
+ return false;
+ } else {
+ if ($collect) {
+ $tokens[] = $this->factory->createStart(
+ $tag_name = $node->tagName, // somehow, it get's dropped
+ $attr
+ );
+ }
+ return true;
+ }
+ }
+
+ /**
+ * @param DOMNode $node
+ * @param HTMLPurifier_Token[] $tokens
+ */
+ protected function createEndNode($node, &$tokens)
+ {
+ $tokens[] = $this->factory->createEnd($node->tagName);
+ }
+
+
+ /**
+ * Converts a DOMNamedNodeMap of DOMAttr objects into an assoc array.
+ *
+ * @param DOMNamedNodeMap $node_map DOMNamedNodeMap of DOMAttr objects.
+ * @return array Associative array of attributes.
+ */
+ protected function transformAttrToAssoc($node_map)
+ {
+ // NamedNodeMap is documented very well, so we're using undocumented
+ // features, namely, the fact that it implements Iterator and
+ // has a ->length attribute
+ if ($node_map->length === 0) {
+ return array();
+ }
+ $array = array();
+ foreach ($node_map as $attr) {
+ $array[$attr->name] = $attr->value;
+ }
+ return $array;
+ }
+
+ /**
+ * An error handler that mutes all errors
+ * @param int $errno
+ * @param string $errstr
+ */
+ public function muteErrorHandler($errno, $errstr)
+ {
+ }
+
+ /**
+ * Callback function for undoing escaping of stray angled brackets
+ * in comments
+ * @param array $matches
+ * @return string
+ */
+ public function callbackUndoCommentSubst($matches)
+ {
+ return '<!--' . strtr($matches[1], array('&amp;' => '&', '&lt;' => '<')) . $matches[2];
+ }
+
+ /**
+ * Callback function that entity-izes ampersands in comments so that
+ * callbackUndoCommentSubst doesn't clobber them
+ * @param array $matches
+ * @return string
+ */
+ public function callbackArmorCommentEntities($matches)
+ {
+ return '<!--' . str_replace('&', '&amp;', $matches[1]) . $matches[2];
+ }
+
+ /**
+ * Wraps an HTML fragment in the necessary HTML
+ * @param string $html
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return string
+ */
+ protected function wrapHTML($html, $config, $context, $use_div = true)
+ {
+ $def = $config->getDefinition('HTML');
+ $ret = '';
+
+ if (!empty($def->doctype->dtdPublic) || !empty($def->doctype->dtdSystem)) {
+ $ret .= '<!DOCTYPE html ';
+ if (!empty($def->doctype->dtdPublic)) {
+ $ret .= 'PUBLIC "' . $def->doctype->dtdPublic . '" ';
+ }
+ if (!empty($def->doctype->dtdSystem)) {
+ $ret .= '"' . $def->doctype->dtdSystem . '" ';
+ }
+ $ret .= '>';
+ }
+
+ $ret .= '<html><head>';
+ $ret .= '<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />';
+ // No protection if $html contains a stray </div>!
+ $ret .= '</head><body>';
+ if ($use_div) $ret .= '<div>';
+ $ret .= $html;
+ if ($use_div) $ret .= '</div>';
+ $ret .= '</body></html>';
+ return $ret;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/DirectLex.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/DirectLex.php
new file mode 100644
index 000000000..6f1308966
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/DirectLex.php
@@ -0,0 +1,539 @@
+<?php
+
+/**
+ * Our in-house implementation of a parser.
+ *
+ * A pure PHP parser, DirectLex has absolutely no dependencies, making
+ * it a reasonably good default for PHP4. Written with efficiency in mind,
+ * it can be four times faster than HTMLPurifier_Lexer_PEARSax3, although it
+ * pales in comparison to HTMLPurifier_Lexer_DOMLex.
+ *
+ * @todo Reread XML spec and document differences.
+ */
+class HTMLPurifier_Lexer_DirectLex extends HTMLPurifier_Lexer
+{
+ /**
+ * @type bool
+ */
+ public $tracksLineNumbers = true;
+
+ /**
+ * Whitespace characters for str(c)spn.
+ * @type string
+ */
+ protected $_whitespace = "\x20\x09\x0D\x0A";
+
+ /**
+ * Callback function for script CDATA fudge
+ * @param array $matches, in form of array(opening tag, contents, closing tag)
+ * @return string
+ */
+ protected function scriptCallback($matches)
+ {
+ return $matches[1] . htmlspecialchars($matches[2], ENT_COMPAT, 'UTF-8') . $matches[3];
+ }
+
+ /**
+ * @param String $html
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return array|HTMLPurifier_Token[]
+ */
+ public function tokenizeHTML($html, $config, $context)
+ {
+ // special normalization for script tags without any armor
+ // our "armor" heurstic is a < sign any number of whitespaces after
+ // the first script tag
+ if ($config->get('HTML.Trusted')) {
+ $html = preg_replace_callback(
+ '#(<script[^>]*>)(\s*[^<].+?)(</script>)#si',
+ array($this, 'scriptCallback'),
+ $html
+ );
+ }
+
+ $html = $this->normalize($html, $config, $context);
+
+ $cursor = 0; // our location in the text
+ $inside_tag = false; // whether or not we're parsing the inside of a tag
+ $array = array(); // result array
+
+ // This is also treated to mean maintain *column* numbers too
+ $maintain_line_numbers = $config->get('Core.MaintainLineNumbers');
+
+ if ($maintain_line_numbers === null) {
+ // automatically determine line numbering by checking
+ // if error collection is on
+ $maintain_line_numbers = $config->get('Core.CollectErrors');
+ }
+
+ if ($maintain_line_numbers) {
+ $current_line = 1;
+ $current_col = 0;
+ $length = strlen($html);
+ } else {
+ $current_line = false;
+ $current_col = false;
+ $length = false;
+ }
+ $context->register('CurrentLine', $current_line);
+ $context->register('CurrentCol', $current_col);
+ $nl = "\n";
+ // how often to manually recalculate. This will ALWAYS be right,
+ // but it's pretty wasteful. Set to 0 to turn off
+ $synchronize_interval = $config->get('Core.DirectLexLineNumberSyncInterval');
+
+ $e = false;
+ if ($config->get('Core.CollectErrors')) {
+ $e =& $context->get('ErrorCollector');
+ }
+
+ // for testing synchronization
+ $loops = 0;
+
+ while (++$loops) {
+ // $cursor is either at the start of a token, or inside of
+ // a tag (i.e. there was a < immediately before it), as indicated
+ // by $inside_tag
+
+ if ($maintain_line_numbers) {
+ // $rcursor, however, is always at the start of a token.
+ $rcursor = $cursor - (int)$inside_tag;
+
+ // Column number is cheap, so we calculate it every round.
+ // We're interested at the *end* of the newline string, so
+ // we need to add strlen($nl) == 1 to $nl_pos before subtracting it
+ // from our "rcursor" position.
+ $nl_pos = strrpos($html, $nl, $rcursor - $length);
+ $current_col = $rcursor - (is_bool($nl_pos) ? 0 : $nl_pos + 1);
+
+ // recalculate lines
+ if ($synchronize_interval && // synchronization is on
+ $cursor > 0 && // cursor is further than zero
+ $loops % $synchronize_interval === 0) { // time to synchronize!
+ $current_line = 1 + $this->substrCount($html, $nl, 0, $cursor);
+ }
+ }
+
+ $position_next_lt = strpos($html, '<', $cursor);
+ $position_next_gt = strpos($html, '>', $cursor);
+
+ // triggers on "<b>asdf</b>" but not "asdf <b></b>"
+ // special case to set up context
+ if ($position_next_lt === $cursor) {
+ $inside_tag = true;
+ $cursor++;
+ }
+
+ if (!$inside_tag && $position_next_lt !== false) {
+ // We are not inside tag and there still is another tag to parse
+ $token = new
+ HTMLPurifier_Token_Text(
+ $this->parseText(
+ substr(
+ $html,
+ $cursor,
+ $position_next_lt - $cursor
+ ), $config
+ )
+ );
+ if ($maintain_line_numbers) {
+ $token->rawPosition($current_line, $current_col);
+ $current_line += $this->substrCount($html, $nl, $cursor, $position_next_lt - $cursor);
+ }
+ $array[] = $token;
+ $cursor = $position_next_lt + 1;
+ $inside_tag = true;
+ continue;
+ } elseif (!$inside_tag) {
+ // We are not inside tag but there are no more tags
+ // If we're already at the end, break
+ if ($cursor === strlen($html)) {
+ break;
+ }
+ // Create Text of rest of string
+ $token = new
+ HTMLPurifier_Token_Text(
+ $this->parseText(
+ substr(
+ $html,
+ $cursor
+ ), $config
+ )
+ );
+ if ($maintain_line_numbers) {
+ $token->rawPosition($current_line, $current_col);
+ }
+ $array[] = $token;
+ break;
+ } elseif ($inside_tag && $position_next_gt !== false) {
+ // We are in tag and it is well formed
+ // Grab the internals of the tag
+ $strlen_segment = $position_next_gt - $cursor;
+
+ if ($strlen_segment < 1) {
+ // there's nothing to process!
+ $token = new HTMLPurifier_Token_Text('<');
+ $cursor++;
+ continue;
+ }
+
+ $segment = substr($html, $cursor, $strlen_segment);
+
+ if ($segment === false) {
+ // somehow, we attempted to access beyond the end of
+ // the string, defense-in-depth, reported by Nate Abele
+ break;
+ }
+
+ // Check if it's a comment
+ if (substr($segment, 0, 3) === '!--') {
+ // re-determine segment length, looking for -->
+ $position_comment_end = strpos($html, '-->', $cursor);
+ if ($position_comment_end === false) {
+ // uh oh, we have a comment that extends to
+ // infinity. Can't be helped: set comment
+ // end position to end of string
+ if ($e) {
+ $e->send(E_WARNING, 'Lexer: Unclosed comment');
+ }
+ $position_comment_end = strlen($html);
+ $end = true;
+ } else {
+ $end = false;
+ }
+ $strlen_segment = $position_comment_end - $cursor;
+ $segment = substr($html, $cursor, $strlen_segment);
+ $token = new
+ HTMLPurifier_Token_Comment(
+ substr(
+ $segment,
+ 3,
+ $strlen_segment - 3
+ )
+ );
+ if ($maintain_line_numbers) {
+ $token->rawPosition($current_line, $current_col);
+ $current_line += $this->substrCount($html, $nl, $cursor, $strlen_segment);
+ }
+ $array[] = $token;
+ $cursor = $end ? $position_comment_end : $position_comment_end + 3;
+ $inside_tag = false;
+ continue;
+ }
+
+ // Check if it's an end tag
+ $is_end_tag = (strpos($segment, '/') === 0);
+ if ($is_end_tag) {
+ $type = substr($segment, 1);
+ $token = new HTMLPurifier_Token_End($type);
+ if ($maintain_line_numbers) {
+ $token->rawPosition($current_line, $current_col);
+ $current_line += $this->substrCount($html, $nl, $cursor, $position_next_gt - $cursor);
+ }
+ $array[] = $token;
+ $inside_tag = false;
+ $cursor = $position_next_gt + 1;
+ continue;
+ }
+
+ // Check leading character is alnum, if not, we may
+ // have accidently grabbed an emoticon. Translate into
+ // text and go our merry way
+ if (!ctype_alpha($segment[0])) {
+ // XML: $segment[0] !== '_' && $segment[0] !== ':'
+ if ($e) {
+ $e->send(E_NOTICE, 'Lexer: Unescaped lt');
+ }
+ $token = new HTMLPurifier_Token_Text('<');
+ if ($maintain_line_numbers) {
+ $token->rawPosition($current_line, $current_col);
+ $current_line += $this->substrCount($html, $nl, $cursor, $position_next_gt - $cursor);
+ }
+ $array[] = $token;
+ $inside_tag = false;
+ continue;
+ }
+
+ // Check if it is explicitly self closing, if so, remove
+ // trailing slash. Remember, we could have a tag like <br>, so
+ // any later token processing scripts must convert improperly
+ // classified EmptyTags from StartTags.
+ $is_self_closing = (strrpos($segment, '/') === $strlen_segment - 1);
+ if ($is_self_closing) {
+ $strlen_segment--;
+ $segment = substr($segment, 0, $strlen_segment);
+ }
+
+ // Check if there are any attributes
+ $position_first_space = strcspn($segment, $this->_whitespace);
+
+ if ($position_first_space >= $strlen_segment) {
+ if ($is_self_closing) {
+ $token = new HTMLPurifier_Token_Empty($segment);
+ } else {
+ $token = new HTMLPurifier_Token_Start($segment);
+ }
+ if ($maintain_line_numbers) {
+ $token->rawPosition($current_line, $current_col);
+ $current_line += $this->substrCount($html, $nl, $cursor, $position_next_gt - $cursor);
+ }
+ $array[] = $token;
+ $inside_tag = false;
+ $cursor = $position_next_gt + 1;
+ continue;
+ }
+
+ // Grab out all the data
+ $type = substr($segment, 0, $position_first_space);
+ $attribute_string =
+ trim(
+ substr(
+ $segment,
+ $position_first_space
+ )
+ );
+ if ($attribute_string) {
+ $attr = $this->parseAttributeString(
+ $attribute_string,
+ $config,
+ $context
+ );
+ } else {
+ $attr = array();
+ }
+
+ if ($is_self_closing) {
+ $token = new HTMLPurifier_Token_Empty($type, $attr);
+ } else {
+ $token = new HTMLPurifier_Token_Start($type, $attr);
+ }
+ if ($maintain_line_numbers) {
+ $token->rawPosition($current_line, $current_col);
+ $current_line += $this->substrCount($html, $nl, $cursor, $position_next_gt - $cursor);
+ }
+ $array[] = $token;
+ $cursor = $position_next_gt + 1;
+ $inside_tag = false;
+ continue;
+ } else {
+ // inside tag, but there's no ending > sign
+ if ($e) {
+ $e->send(E_WARNING, 'Lexer: Missing gt');
+ }
+ $token = new
+ HTMLPurifier_Token_Text(
+ '<' .
+ $this->parseText(
+ substr($html, $cursor), $config
+ )
+ );
+ if ($maintain_line_numbers) {
+ $token->rawPosition($current_line, $current_col);
+ }
+ // no cursor scroll? Hmm...
+ $array[] = $token;
+ break;
+ }
+ break;
+ }
+
+ $context->destroy('CurrentLine');
+ $context->destroy('CurrentCol');
+ return $array;
+ }
+
+ /**
+ * PHP 5.0.x compatible substr_count that implements offset and length
+ * @param string $haystack
+ * @param string $needle
+ * @param int $offset
+ * @param int $length
+ * @return int
+ */
+ protected function substrCount($haystack, $needle, $offset, $length)
+ {
+ static $oldVersion;
+ if ($oldVersion === null) {
+ $oldVersion = version_compare(PHP_VERSION, '5.1', '<');
+ }
+ if ($oldVersion) {
+ $haystack = substr($haystack, $offset, $length);
+ return substr_count($haystack, $needle);
+ } else {
+ return substr_count($haystack, $needle, $offset, $length);
+ }
+ }
+
+ /**
+ * Takes the inside of an HTML tag and makes an assoc array of attributes.
+ *
+ * @param string $string Inside of tag excluding name.
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return array Assoc array of attributes.
+ */
+ public function parseAttributeString($string, $config, $context)
+ {
+ $string = (string)$string; // quick typecast
+
+ if ($string == '') {
+ return array();
+ } // no attributes
+
+ $e = false;
+ if ($config->get('Core.CollectErrors')) {
+ $e =& $context->get('ErrorCollector');
+ }
+
+ // let's see if we can abort as quickly as possible
+ // one equal sign, no spaces => one attribute
+ $num_equal = substr_count($string, '=');
+ $has_space = strpos($string, ' ');
+ if ($num_equal === 0 && !$has_space) {
+ // bool attribute
+ return array($string => $string);
+ } elseif ($num_equal === 1 && !$has_space) {
+ // only one attribute
+ list($key, $quoted_value) = explode('=', $string);
+ $quoted_value = trim($quoted_value);
+ if (!$key) {
+ if ($e) {
+ $e->send(E_ERROR, 'Lexer: Missing attribute key');
+ }
+ return array();
+ }
+ if (!$quoted_value) {
+ return array($key => '');
+ }
+ $first_char = @$quoted_value[0];
+ $last_char = @$quoted_value[strlen($quoted_value) - 1];
+
+ $same_quote = ($first_char == $last_char);
+ $open_quote = ($first_char == '"' || $first_char == "'");
+
+ if ($same_quote && $open_quote) {
+ // well behaved
+ $value = substr($quoted_value, 1, strlen($quoted_value) - 2);
+ } else {
+ // not well behaved
+ if ($open_quote) {
+ if ($e) {
+ $e->send(E_ERROR, 'Lexer: Missing end quote');
+ }
+ $value = substr($quoted_value, 1);
+ } else {
+ $value = $quoted_value;
+ }
+ }
+ if ($value === false) {
+ $value = '';
+ }
+ return array($key => $this->parseAttr($value, $config));
+ }
+
+ // setup loop environment
+ $array = array(); // return assoc array of attributes
+ $cursor = 0; // current position in string (moves forward)
+ $size = strlen($string); // size of the string (stays the same)
+
+ // if we have unquoted attributes, the parser expects a terminating
+ // space, so let's guarantee that there's always a terminating space.
+ $string .= ' ';
+
+ $old_cursor = -1;
+ while ($cursor < $size) {
+ if ($old_cursor >= $cursor) {
+ throw new Exception("Infinite loop detected");
+ }
+ $old_cursor = $cursor;
+
+ $cursor += ($value = strspn($string, $this->_whitespace, $cursor));
+ // grab the key
+
+ $key_begin = $cursor; //we're currently at the start of the key
+
+ // scroll past all characters that are the key (not whitespace or =)
+ $cursor += strcspn($string, $this->_whitespace . '=', $cursor);
+
+ $key_end = $cursor; // now at the end of the key
+
+ $key = substr($string, $key_begin, $key_end - $key_begin);
+
+ if (!$key) {
+ if ($e) {
+ $e->send(E_ERROR, 'Lexer: Missing attribute key');
+ }
+ $cursor += 1 + strcspn($string, $this->_whitespace, $cursor + 1); // prevent infinite loop
+ continue; // empty key
+ }
+
+ // scroll past all whitespace
+ $cursor += strspn($string, $this->_whitespace, $cursor);
+
+ if ($cursor >= $size) {
+ $array[$key] = $key;
+ break;
+ }
+
+ // if the next character is an equal sign, we've got a regular
+ // pair, otherwise, it's a bool attribute
+ $first_char = @$string[$cursor];
+
+ if ($first_char == '=') {
+ // key="value"
+
+ $cursor++;
+ $cursor += strspn($string, $this->_whitespace, $cursor);
+
+ if ($cursor === false) {
+ $array[$key] = '';
+ break;
+ }
+
+ // we might be in front of a quote right now
+
+ $char = @$string[$cursor];
+
+ if ($char == '"' || $char == "'") {
+ // it's quoted, end bound is $char
+ $cursor++;
+ $value_begin = $cursor;
+ $cursor = strpos($string, $char, $cursor);
+ $value_end = $cursor;
+ } else {
+ // it's not quoted, end bound is whitespace
+ $value_begin = $cursor;
+ $cursor += strcspn($string, $this->_whitespace, $cursor);
+ $value_end = $cursor;
+ }
+
+ // we reached a premature end
+ if ($cursor === false) {
+ $cursor = $size;
+ $value_end = $cursor;
+ }
+
+ $value = substr($string, $value_begin, $value_end - $value_begin);
+ if ($value === false) {
+ $value = '';
+ }
+ $array[$key] = $this->parseAttr($value, $config);
+ $cursor++;
+ } else {
+ // boolattr
+ if ($key !== '') {
+ $array[$key] = $key;
+ } else {
+ // purely theoretical
+ if ($e) {
+ $e->send(E_ERROR, 'Lexer: Missing attribute key');
+ }
+ }
+ }
+ }
+ return $array;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/PH5P.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/PH5P.php
new file mode 100644
index 000000000..0b452d17f
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/PH5P.php
@@ -0,0 +1,4788 @@
+<?php
+
+/**
+ * Experimental HTML5-based parser using Jeroen van der Meer's PH5P library.
+ * Occupies space in the HTML5 pseudo-namespace, which may cause conflicts.
+ *
+ * @note
+ * Recent changes to PHP's DOM extension have resulted in some fatal
+ * error conditions with the original version of PH5P. Pending changes,
+ * this lexer will punt to DirectLex if DOM throws an exception.
+ */
+
+class HTMLPurifier_Lexer_PH5P extends HTMLPurifier_Lexer_DOMLex
+{
+ /**
+ * @param string $html
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return HTMLPurifier_Token[]
+ */
+ public function tokenizeHTML($html, $config, $context)
+ {
+ $new_html = $this->normalize($html, $config, $context);
+ $new_html = $this->wrapHTML($new_html, $config, $context, false /* no div */);
+ try {
+ $parser = new HTML5($new_html);
+ $doc = $parser->save();
+ } catch (DOMException $e) {
+ // Uh oh, it failed. Punt to DirectLex.
+ $lexer = new HTMLPurifier_Lexer_DirectLex();
+ $context->register('PH5PError', $e); // save the error, so we can detect it
+ return $lexer->tokenizeHTML($html, $config, $context); // use original HTML
+ }
+ $tokens = array();
+ $this->tokenizeDOM(
+ $doc->getElementsByTagName('html')->item(0)-> // <html>
+ getElementsByTagName('body')->item(0) // <body>
+ ,
+ $tokens, $config
+ );
+ return $tokens;
+ }
+}
+
+/*
+
+Copyright 2007 Jeroen van der Meer <http://jero.net/>
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+class HTML5
+{
+ private $data;
+ private $char;
+ private $EOF;
+ private $state;
+ private $tree;
+ private $token;
+ private $content_model;
+ private $escape = false;
+ private $entities = array(
+ 'AElig;',
+ 'AElig',
+ 'AMP;',
+ 'AMP',
+ 'Aacute;',
+ 'Aacute',
+ 'Acirc;',
+ 'Acirc',
+ 'Agrave;',
+ 'Agrave',
+ 'Alpha;',
+ 'Aring;',
+ 'Aring',
+ 'Atilde;',
+ 'Atilde',
+ 'Auml;',
+ 'Auml',
+ 'Beta;',
+ 'COPY;',
+ 'COPY',
+ 'Ccedil;',
+ 'Ccedil',
+ 'Chi;',
+ 'Dagger;',
+ 'Delta;',
+ 'ETH;',
+ 'ETH',
+ 'Eacute;',
+ 'Eacute',
+ 'Ecirc;',
+ 'Ecirc',
+ 'Egrave;',
+ 'Egrave',
+ 'Epsilon;',
+ 'Eta;',
+ 'Euml;',
+ 'Euml',
+ 'GT;',
+ 'GT',
+ 'Gamma;',
+ 'Iacute;',
+ 'Iacute',
+ 'Icirc;',
+ 'Icirc',
+ 'Igrave;',
+ 'Igrave',
+ 'Iota;',
+ 'Iuml;',
+ 'Iuml',
+ 'Kappa;',
+ 'LT;',
+ 'LT',
+ 'Lambda;',
+ 'Mu;',
+ 'Ntilde;',
+ 'Ntilde',
+ 'Nu;',
+ 'OElig;',
+ 'Oacute;',
+ 'Oacute',
+ 'Ocirc;',
+ 'Ocirc',
+ 'Ograve;',
+ 'Ograve',
+ 'Omega;',
+ 'Omicron;',
+ 'Oslash;',
+ 'Oslash',
+ 'Otilde;',
+ 'Otilde',
+ 'Ouml;',
+ 'Ouml',
+ 'Phi;',
+ 'Pi;',
+ 'Prime;',
+ 'Psi;',
+ 'QUOT;',
+ 'QUOT',
+ 'REG;',
+ 'REG',
+ 'Rho;',
+ 'Scaron;',
+ 'Sigma;',
+ 'THORN;',
+ 'THORN',
+ 'TRADE;',
+ 'Tau;',
+ 'Theta;',
+ 'Uacute;',
+ 'Uacute',
+ 'Ucirc;',
+ 'Ucirc',
+ 'Ugrave;',
+ 'Ugrave',
+ 'Upsilon;',
+ 'Uuml;',
+ 'Uuml',
+ 'Xi;',
+ 'Yacute;',
+ 'Yacute',
+ 'Yuml;',
+ 'Zeta;',
+ 'aacute;',
+ 'aacute',
+ 'acirc;',
+ 'acirc',
+ 'acute;',
+ 'acute',
+ 'aelig;',
+ 'aelig',
+ 'agrave;',
+ 'agrave',
+ 'alefsym;',
+ 'alpha;',
+ 'amp;',
+ 'amp',
+ 'and;',
+ 'ang;',
+ 'apos;',
+ 'aring;',
+ 'aring',
+ 'asymp;',
+ 'atilde;',
+ 'atilde',
+ 'auml;',
+ 'auml',
+ 'bdquo;',
+ 'beta;',
+ 'brvbar;',
+ 'brvbar',
+ 'bull;',
+ 'cap;',
+ 'ccedil;',
+ 'ccedil',
+ 'cedil;',
+ 'cedil',
+ 'cent;',
+ 'cent',
+ 'chi;',
+ 'circ;',
+ 'clubs;',
+ 'cong;',
+ 'copy;',
+ 'copy',
+ 'crarr;',
+ 'cup;',
+ 'curren;',
+ 'curren',
+ 'dArr;',
+ 'dagger;',
+ 'darr;',
+ 'deg;',
+ 'deg',
+ 'delta;',
+ 'diams;',
+ 'divide;',
+ 'divide',
+ 'eacute;',
+ 'eacute',
+ 'ecirc;',
+ 'ecirc',
+ 'egrave;',
+ 'egrave',
+ 'empty;',
+ 'emsp;',
+ 'ensp;',
+ 'epsilon;',
+ 'equiv;',
+ 'eta;',
+ 'eth;',
+ 'eth',
+ 'euml;',
+ 'euml',
+ 'euro;',
+ 'exist;',
+ 'fnof;',
+ 'forall;',
+ 'frac12;',
+ 'frac12',
+ 'frac14;',
+ 'frac14',
+ 'frac34;',
+ 'frac34',
+ 'frasl;',
+ 'gamma;',
+ 'ge;',
+ 'gt;',
+ 'gt',
+ 'hArr;',
+ 'harr;',
+ 'hearts;',
+ 'hellip;',
+ 'iacute;',
+ 'iacute',
+ 'icirc;',
+ 'icirc',
+ 'iexcl;',
+ 'iexcl',
+ 'igrave;',
+ 'igrave',
+ 'image;',
+ 'infin;',
+ 'int;',
+ 'iota;',
+ 'iquest;',
+ 'iquest',
+ 'isin;',
+ 'iuml;',
+ 'iuml',
+ 'kappa;',
+ 'lArr;',
+ 'lambda;',
+ 'lang;',
+ 'laquo;',
+ 'laquo',
+ 'larr;',
+ 'lceil;',
+ 'ldquo;',
+ 'le;',
+ 'lfloor;',
+ 'lowast;',
+ 'loz;',
+ 'lrm;',
+ 'lsaquo;',
+ 'lsquo;',
+ 'lt;',
+ 'lt',
+ 'macr;',
+ 'macr',
+ 'mdash;',
+ 'micro;',
+ 'micro',
+ 'middot;',
+ 'middot',
+ 'minus;',
+ 'mu;',
+ 'nabla;',
+ 'nbsp;',
+ 'nbsp',
+ 'ndash;',
+ 'ne;',
+ 'ni;',
+ 'not;',
+ 'not',
+ 'notin;',
+ 'nsub;',
+ 'ntilde;',
+ 'ntilde',
+ 'nu;',
+ 'oacute;',
+ 'oacute',
+ 'ocirc;',
+ 'ocirc',
+ 'oelig;',
+ 'ograve;',
+ 'ograve',
+ 'oline;',
+ 'omega;',
+ 'omicron;',
+ 'oplus;',
+ 'or;',
+ 'ordf;',
+ 'ordf',
+ 'ordm;',
+ 'ordm',
+ 'oslash;',
+ 'oslash',
+ 'otilde;',
+ 'otilde',
+ 'otimes;',
+ 'ouml;',
+ 'ouml',
+ 'para;',
+ 'para',
+ 'part;',
+ 'permil;',
+ 'perp;',
+ 'phi;',
+ 'pi;',
+ 'piv;',
+ 'plusmn;',
+ 'plusmn',
+ 'pound;',
+ 'pound',
+ 'prime;',
+ 'prod;',
+ 'prop;',
+ 'psi;',
+ 'quot;',
+ 'quot',
+ 'rArr;',
+ 'radic;',
+ 'rang;',
+ 'raquo;',
+ 'raquo',
+ 'rarr;',
+ 'rceil;',
+ 'rdquo;',
+ 'real;',
+ 'reg;',
+ 'reg',
+ 'rfloor;',
+ 'rho;',
+ 'rlm;',
+ 'rsaquo;',
+ 'rsquo;',
+ 'sbquo;',
+ 'scaron;',
+ 'sdot;',
+ 'sect;',
+ 'sect',
+ 'shy;',
+ 'shy',
+ 'sigma;',
+ 'sigmaf;',
+ 'sim;',
+ 'spades;',
+ 'sub;',
+ 'sube;',
+ 'sum;',
+ 'sup1;',
+ 'sup1',
+ 'sup2;',
+ 'sup2',
+ 'sup3;',
+ 'sup3',
+ 'sup;',
+ 'supe;',
+ 'szlig;',
+ 'szlig',
+ 'tau;',
+ 'there4;',
+ 'theta;',
+ 'thetasym;',
+ 'thinsp;',
+ 'thorn;',
+ 'thorn',
+ 'tilde;',
+ 'times;',
+ 'times',
+ 'trade;',
+ 'uArr;',
+ 'uacute;',
+ 'uacute',
+ 'uarr;',
+ 'ucirc;',
+ 'ucirc',
+ 'ugrave;',
+ 'ugrave',
+ 'uml;',
+ 'uml',
+ 'upsih;',
+ 'upsilon;',
+ 'uuml;',
+ 'uuml',
+ 'weierp;',
+ 'xi;',
+ 'yacute;',
+ 'yacute',
+ 'yen;',
+ 'yen',
+ 'yuml;',
+ 'yuml',
+ 'zeta;',
+ 'zwj;',
+ 'zwnj;'
+ );
+
+ const PCDATA = 0;
+ const RCDATA = 1;
+ const CDATA = 2;
+ const PLAINTEXT = 3;
+
+ const DOCTYPE = 0;
+ const STARTTAG = 1;
+ const ENDTAG = 2;
+ const COMMENT = 3;
+ const CHARACTR = 4;
+ const EOF = 5;
+
+ public function __construct($data)
+ {
+ $this->data = $data;
+ $this->char = -1;
+ $this->EOF = strlen($data);
+ $this->tree = new HTML5TreeConstructer;
+ $this->content_model = self::PCDATA;
+
+ $this->state = 'data';
+
+ while ($this->state !== null) {
+ $this->{$this->state . 'State'}();
+ }
+ }
+
+ public function save()
+ {
+ return $this->tree->save();
+ }
+
+ private function char()
+ {
+ return ($this->char < $this->EOF)
+ ? $this->data[$this->char]
+ : false;
+ }
+
+ private function character($s, $l = 0)
+ {
+ if ($s + $l < $this->EOF) {
+ if ($l === 0) {
+ return $this->data[$s];
+ } else {
+ return substr($this->data, $s, $l);
+ }
+ }
+ }
+
+ private function characters($char_class, $start)
+ {
+ return preg_replace('#^([' . $char_class . ']+).*#s', '\\1', substr($this->data, $start));
+ }
+
+ private function dataState()
+ {
+ // Consume the next input character
+ $this->char++;
+ $char = $this->char();
+
+ if ($char === '&' && ($this->content_model === self::PCDATA || $this->content_model === self::RCDATA)) {
+ /* U+0026 AMPERSAND (&)
+ When the content model flag is set to one of the PCDATA or RCDATA
+ states: switch to the entity data state. Otherwise: treat it as per
+ the "anything else" entry below. */
+ $this->state = 'entityData';
+
+ } elseif ($char === '-') {
+ /* If the content model flag is set to either the RCDATA state or
+ the CDATA state, and the escape flag is false, and there are at
+ least three characters before this one in the input stream, and the
+ last four characters in the input stream, including this one, are
+ U+003C LESS-THAN SIGN, U+0021 EXCLAMATION MARK, U+002D HYPHEN-MINUS,
+ and U+002D HYPHEN-MINUS ("<!--"), then set the escape flag to true. */
+ if (($this->content_model === self::RCDATA || $this->content_model ===
+ self::CDATA) && $this->escape === false &&
+ $this->char >= 3 && $this->character($this->char - 4, 4) === '<!--'
+ ) {
+ $this->escape = true;
+ }
+
+ /* In any case, emit the input character as a character token. Stay
+ in the data state. */
+ $this->emitToken(
+ array(
+ 'type' => self::CHARACTR,
+ 'data' => $char
+ )
+ );
+
+ /* U+003C LESS-THAN SIGN (<) */
+ } elseif ($char === '<' && ($this->content_model === self::PCDATA ||
+ (($this->content_model === self::RCDATA ||
+ $this->content_model === self::CDATA) && $this->escape === false))
+ ) {
+ /* When the content model flag is set to the PCDATA state: switch
+ to the tag open state.
+
+ When the content model flag is set to either the RCDATA state or
+ the CDATA state and the escape flag is false: switch to the tag
+ open state.
+
+ Otherwise: treat it as per the "anything else" entry below. */
+ $this->state = 'tagOpen';
+
+ /* U+003E GREATER-THAN SIGN (>) */
+ } elseif ($char === '>') {
+ /* If the content model flag is set to either the RCDATA state or
+ the CDATA state, and the escape flag is true, and the last three
+ characters in the input stream including this one are U+002D
+ HYPHEN-MINUS, U+002D HYPHEN-MINUS, U+003E GREATER-THAN SIGN ("-->"),
+ set the escape flag to false. */
+ if (($this->content_model === self::RCDATA ||
+ $this->content_model === self::CDATA) && $this->escape === true &&
+ $this->character($this->char, 3) === '-->'
+ ) {
+ $this->escape = false;
+ }
+
+ /* In any case, emit the input character as a character token.
+ Stay in the data state. */
+ $this->emitToken(
+ array(
+ 'type' => self::CHARACTR,
+ 'data' => $char
+ )
+ );
+
+ } elseif ($this->char === $this->EOF) {
+ /* EOF
+ Emit an end-of-file token. */
+ $this->EOF();
+
+ } elseif ($this->content_model === self::PLAINTEXT) {
+ /* When the content model flag is set to the PLAINTEXT state
+ THIS DIFFERS GREATLY FROM THE SPEC: Get the remaining characters of
+ the text and emit it as a character token. */
+ $this->emitToken(
+ array(
+ 'type' => self::CHARACTR,
+ 'data' => substr($this->data, $this->char)
+ )
+ );
+
+ $this->EOF();
+
+ } else {
+ /* Anything else
+ THIS DIFFERS GREATLY FROM THE SPEC: Get as many character that
+ otherwise would also be treated as a character token and emit it
+ as a single character token. Stay in the data state. */
+ $len = strcspn($this->data, '<&', $this->char);
+ $char = substr($this->data, $this->char, $len);
+ $this->char += $len - 1;
+
+ $this->emitToken(
+ array(
+ 'type' => self::CHARACTR,
+ 'data' => $char
+ )
+ );
+
+ $this->state = 'data';
+ }
+ }
+
+ private function entityDataState()
+ {
+ // Attempt to consume an entity.
+ $entity = $this->entity();
+
+ // If nothing is returned, emit a U+0026 AMPERSAND character token.
+ // Otherwise, emit the character token that was returned.
+ $char = (!$entity) ? '&' : $entity;
+ $this->emitToken(
+ array(
+ 'type' => self::CHARACTR,
+ 'data' => $char
+ )
+ );
+
+ // Finally, switch to the data state.
+ $this->state = 'data';
+ }
+
+ private function tagOpenState()
+ {
+ switch ($this->content_model) {
+ case self::RCDATA:
+ case self::CDATA:
+ /* If the next input character is a U+002F SOLIDUS (/) character,
+ consume it and switch to the close tag open state. If the next
+ input character is not a U+002F SOLIDUS (/) character, emit a
+ U+003C LESS-THAN SIGN character token and switch to the data
+ state to process the next input character. */
+ if ($this->character($this->char + 1) === '/') {
+ $this->char++;
+ $this->state = 'closeTagOpen';
+
+ } else {
+ $this->emitToken(
+ array(
+ 'type' => self::CHARACTR,
+ 'data' => '<'
+ )
+ );
+
+ $this->state = 'data';
+ }
+ break;
+
+ case self::PCDATA:
+ // If the content model flag is set to the PCDATA state
+ // Consume the next input character:
+ $this->char++;
+ $char = $this->char();
+
+ if ($char === '!') {
+ /* U+0021 EXCLAMATION MARK (!)
+ Switch to the markup declaration open state. */
+ $this->state = 'markupDeclarationOpen';
+
+ } elseif ($char === '/') {
+ /* U+002F SOLIDUS (/)
+ Switch to the close tag open state. */
+ $this->state = 'closeTagOpen';
+
+ } elseif (preg_match('/^[A-Za-z]$/', $char)) {
+ /* U+0041 LATIN LETTER A through to U+005A LATIN LETTER Z
+ Create a new start tag token, set its tag name to the lowercase
+ version of the input character (add 0x0020 to the character's code
+ point), then switch to the tag name state. (Don't emit the token
+ yet; further details will be filled in before it is emitted.) */
+ $this->token = array(
+ 'name' => strtolower($char),
+ 'type' => self::STARTTAG,
+ 'attr' => array()
+ );
+
+ $this->state = 'tagName';
+
+ } elseif ($char === '>') {
+ /* U+003E GREATER-THAN SIGN (>)
+ Parse error. Emit a U+003C LESS-THAN SIGN character token and a
+ U+003E GREATER-THAN SIGN character token. Switch to the data state. */
+ $this->emitToken(
+ array(
+ 'type' => self::CHARACTR,
+ 'data' => '<>'
+ )
+ );
+
+ $this->state = 'data';
+
+ } elseif ($char === '?') {
+ /* U+003F QUESTION MARK (?)
+ Parse error. Switch to the bogus comment state. */
+ $this->state = 'bogusComment';
+
+ } else {
+ /* Anything else
+ Parse error. Emit a U+003C LESS-THAN SIGN character token and
+ reconsume the current input character in the data state. */
+ $this->emitToken(
+ array(
+ 'type' => self::CHARACTR,
+ 'data' => '<'
+ )
+ );
+
+ $this->char--;
+ $this->state = 'data';
+ }
+ break;
+ }
+ }
+
+ private function closeTagOpenState()
+ {
+ $next_node = strtolower($this->characters('A-Za-z', $this->char + 1));
+ $the_same = count($this->tree->stack) > 0 && $next_node === end($this->tree->stack)->nodeName;
+
+ if (($this->content_model === self::RCDATA || $this->content_model === self::CDATA) &&
+ (!$the_same || ($the_same && (!preg_match(
+ '/[\t\n\x0b\x0c >\/]/',
+ $this->character($this->char + 1 + strlen($next_node))
+ ) || $this->EOF === $this->char)))
+ ) {
+ /* If the content model flag is set to the RCDATA or CDATA states then
+ examine the next few characters. If they do not match the tag name of
+ the last start tag token emitted (case insensitively), or if they do but
+ they are not immediately followed by one of the following characters:
+ * U+0009 CHARACTER TABULATION
+ * U+000A LINE FEED (LF)
+ * U+000B LINE TABULATION
+ * U+000C FORM FEED (FF)
+ * U+0020 SPACE
+ * U+003E GREATER-THAN SIGN (>)
+ * U+002F SOLIDUS (/)
+ * EOF
+ ...then there is a parse error. Emit a U+003C LESS-THAN SIGN character
+ token, a U+002F SOLIDUS character token, and switch to the data state
+ to process the next input character. */
+ $this->emitToken(
+ array(
+ 'type' => self::CHARACTR,
+ 'data' => '</'
+ )
+ );
+
+ $this->state = 'data';
+
+ } else {
+ /* Otherwise, if the content model flag is set to the PCDATA state,
+ or if the next few characters do match that tag name, consume the
+ next input character: */
+ $this->char++;
+ $char = $this->char();
+
+ if (preg_match('/^[A-Za-z]$/', $char)) {
+ /* U+0041 LATIN LETTER A through to U+005A LATIN LETTER Z
+ Create a new end tag token, set its tag name to the lowercase version
+ of the input character (add 0x0020 to the character's code point), then
+ switch to the tag name state. (Don't emit the token yet; further details
+ will be filled in before it is emitted.) */
+ $this->token = array(
+ 'name' => strtolower($char),
+ 'type' => self::ENDTAG
+ );
+
+ $this->state = 'tagName';
+
+ } elseif ($char === '>') {
+ /* U+003E GREATER-THAN SIGN (>)
+ Parse error. Switch to the data state. */
+ $this->state = 'data';
+
+ } elseif ($this->char === $this->EOF) {
+ /* EOF
+ Parse error. Emit a U+003C LESS-THAN SIGN character token and a U+002F
+ SOLIDUS character token. Reconsume the EOF character in the data state. */
+ $this->emitToken(
+ array(
+ 'type' => self::CHARACTR,
+ 'data' => '</'
+ )
+ );
+
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ /* Parse error. Switch to the bogus comment state. */
+ $this->state = 'bogusComment';
+ }
+ }
+ }
+
+ private function tagNameState()
+ {
+ // Consume the next input character:
+ $this->char++;
+ $char = $this->character($this->char);
+
+ if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
+ /* U+0009 CHARACTER TABULATION
+ U+000A LINE FEED (LF)
+ U+000B LINE TABULATION
+ U+000C FORM FEED (FF)
+ U+0020 SPACE
+ Switch to the before attribute name state. */
+ $this->state = 'beforeAttributeName';
+
+ } elseif ($char === '>') {
+ /* U+003E GREATER-THAN SIGN (>)
+ Emit the current tag token. Switch to the data state. */
+ $this->emitToken($this->token);
+ $this->state = 'data';
+
+ } elseif ($this->char === $this->EOF) {
+ /* EOF
+ Parse error. Emit the current tag token. Reconsume the EOF
+ character in the data state. */
+ $this->emitToken($this->token);
+
+ $this->char--;
+ $this->state = 'data';
+
+ } elseif ($char === '/') {
+ /* U+002F SOLIDUS (/)
+ Parse error unless this is a permitted slash. Switch to the before
+ attribute name state. */
+ $this->state = 'beforeAttributeName';
+
+ } else {
+ /* Anything else
+ Append the current input character to the current tag token's tag name.
+ Stay in the tag name state. */
+ $this->token['name'] .= strtolower($char);
+ $this->state = 'tagName';
+ }
+ }
+
+ private function beforeAttributeNameState()
+ {
+ // Consume the next input character:
+ $this->char++;
+ $char = $this->character($this->char);
+
+ if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
+ /* U+0009 CHARACTER TABULATION
+ U+000A LINE FEED (LF)
+ U+000B LINE TABULATION
+ U+000C FORM FEED (FF)
+ U+0020 SPACE
+ Stay in the before attribute name state. */
+ $this->state = 'beforeAttributeName';
+
+ } elseif ($char === '>') {
+ /* U+003E GREATER-THAN SIGN (>)
+ Emit the current tag token. Switch to the data state. */
+ $this->emitToken($this->token);
+ $this->state = 'data';
+
+ } elseif ($char === '/') {
+ /* U+002F SOLIDUS (/)
+ Parse error unless this is a permitted slash. Stay in the before
+ attribute name state. */
+ $this->state = 'beforeAttributeName';
+
+ } elseif ($this->char === $this->EOF) {
+ /* EOF
+ Parse error. Emit the current tag token. Reconsume the EOF
+ character in the data state. */
+ $this->emitToken($this->token);
+
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ /* Anything else
+ Start a new attribute in the current tag token. Set that attribute's
+ name to the current input character, and its value to the empty string.
+ Switch to the attribute name state. */
+ $this->token['attr'][] = array(
+ 'name' => strtolower($char),
+ 'value' => null
+ );
+
+ $this->state = 'attributeName';
+ }
+ }
+
+ private function attributeNameState()
+ {
+ // Consume the next input character:
+ $this->char++;
+ $char = $this->character($this->char);
+
+ if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
+ /* U+0009 CHARACTER TABULATION
+ U+000A LINE FEED (LF)
+ U+000B LINE TABULATION
+ U+000C FORM FEED (FF)
+ U+0020 SPACE
+ Stay in the before attribute name state. */
+ $this->state = 'afterAttributeName';
+
+ } elseif ($char === '=') {
+ /* U+003D EQUALS SIGN (=)
+ Switch to the before attribute value state. */
+ $this->state = 'beforeAttributeValue';
+
+ } elseif ($char === '>') {
+ /* U+003E GREATER-THAN SIGN (>)
+ Emit the current tag token. Switch to the data state. */
+ $this->emitToken($this->token);
+ $this->state = 'data';
+
+ } elseif ($char === '/' && $this->character($this->char + 1) !== '>') {
+ /* U+002F SOLIDUS (/)
+ Parse error unless this is a permitted slash. Switch to the before
+ attribute name state. */
+ $this->state = 'beforeAttributeName';
+
+ } elseif ($this->char === $this->EOF) {
+ /* EOF
+ Parse error. Emit the current tag token. Reconsume the EOF
+ character in the data state. */
+ $this->emitToken($this->token);
+
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ /* Anything else
+ Append the current input character to the current attribute's name.
+ Stay in the attribute name state. */
+ $last = count($this->token['attr']) - 1;
+ $this->token['attr'][$last]['name'] .= strtolower($char);
+
+ $this->state = 'attributeName';
+ }
+ }
+
+ private function afterAttributeNameState()
+ {
+ // Consume the next input character:
+ $this->char++;
+ $char = $this->character($this->char);
+
+ if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
+ /* U+0009 CHARACTER TABULATION
+ U+000A LINE FEED (LF)
+ U+000B LINE TABULATION
+ U+000C FORM FEED (FF)
+ U+0020 SPACE
+ Stay in the after attribute name state. */
+ $this->state = 'afterAttributeName';
+
+ } elseif ($char === '=') {
+ /* U+003D EQUALS SIGN (=)
+ Switch to the before attribute value state. */
+ $this->state = 'beforeAttributeValue';
+
+ } elseif ($char === '>') {
+ /* U+003E GREATER-THAN SIGN (>)
+ Emit the current tag token. Switch to the data state. */
+ $this->emitToken($this->token);
+ $this->state = 'data';
+
+ } elseif ($char === '/' && $this->character($this->char + 1) !== '>') {
+ /* U+002F SOLIDUS (/)
+ Parse error unless this is a permitted slash. Switch to the
+ before attribute name state. */
+ $this->state = 'beforeAttributeName';
+
+ } elseif ($this->char === $this->EOF) {
+ /* EOF
+ Parse error. Emit the current tag token. Reconsume the EOF
+ character in the data state. */
+ $this->emitToken($this->token);
+
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ /* Anything else
+ Start a new attribute in the current tag token. Set that attribute's
+ name to the current input character, and its value to the empty string.
+ Switch to the attribute name state. */
+ $this->token['attr'][] = array(
+ 'name' => strtolower($char),
+ 'value' => null
+ );
+
+ $this->state = 'attributeName';
+ }
+ }
+
+ private function beforeAttributeValueState()
+ {
+ // Consume the next input character:
+ $this->char++;
+ $char = $this->character($this->char);
+
+ if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
+ /* U+0009 CHARACTER TABULATION
+ U+000A LINE FEED (LF)
+ U+000B LINE TABULATION
+ U+000C FORM FEED (FF)
+ U+0020 SPACE
+ Stay in the before attribute value state. */
+ $this->state = 'beforeAttributeValue';
+
+ } elseif ($char === '"') {
+ /* U+0022 QUOTATION MARK (")
+ Switch to the attribute value (double-quoted) state. */
+ $this->state = 'attributeValueDoubleQuoted';
+
+ } elseif ($char === '&') {
+ /* U+0026 AMPERSAND (&)
+ Switch to the attribute value (unquoted) state and reconsume
+ this input character. */
+ $this->char--;
+ $this->state = 'attributeValueUnquoted';
+
+ } elseif ($char === '\'') {
+ /* U+0027 APOSTROPHE (')
+ Switch to the attribute value (single-quoted) state. */
+ $this->state = 'attributeValueSingleQuoted';
+
+ } elseif ($char === '>') {
+ /* U+003E GREATER-THAN SIGN (>)
+ Emit the current tag token. Switch to the data state. */
+ $this->emitToken($this->token);
+ $this->state = 'data';
+
+ } else {
+ /* Anything else
+ Append the current input character to the current attribute's value.
+ Switch to the attribute value (unquoted) state. */
+ $last = count($this->token['attr']) - 1;
+ $this->token['attr'][$last]['value'] .= $char;
+
+ $this->state = 'attributeValueUnquoted';
+ }
+ }
+
+ private function attributeValueDoubleQuotedState()
+ {
+ // Consume the next input character:
+ $this->char++;
+ $char = $this->character($this->char);
+
+ if ($char === '"') {
+ /* U+0022 QUOTATION MARK (")
+ Switch to the before attribute name state. */
+ $this->state = 'beforeAttributeName';
+
+ } elseif ($char === '&') {
+ /* U+0026 AMPERSAND (&)
+ Switch to the entity in attribute value state. */
+ $this->entityInAttributeValueState('double');
+
+ } elseif ($this->char === $this->EOF) {
+ /* EOF
+ Parse error. Emit the current tag token. Reconsume the character
+ in the data state. */
+ $this->emitToken($this->token);
+
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ /* Anything else
+ Append the current input character to the current attribute's value.
+ Stay in the attribute value (double-quoted) state. */
+ $last = count($this->token['attr']) - 1;
+ $this->token['attr'][$last]['value'] .= $char;
+
+ $this->state = 'attributeValueDoubleQuoted';
+ }
+ }
+
+ private function attributeValueSingleQuotedState()
+ {
+ // Consume the next input character:
+ $this->char++;
+ $char = $this->character($this->char);
+
+ if ($char === '\'') {
+ /* U+0022 QUOTATION MARK (')
+ Switch to the before attribute name state. */
+ $this->state = 'beforeAttributeName';
+
+ } elseif ($char === '&') {
+ /* U+0026 AMPERSAND (&)
+ Switch to the entity in attribute value state. */
+ $this->entityInAttributeValueState('single');
+
+ } elseif ($this->char === $this->EOF) {
+ /* EOF
+ Parse error. Emit the current tag token. Reconsume the character
+ in the data state. */
+ $this->emitToken($this->token);
+
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ /* Anything else
+ Append the current input character to the current attribute's value.
+ Stay in the attribute value (single-quoted) state. */
+ $last = count($this->token['attr']) - 1;
+ $this->token['attr'][$last]['value'] .= $char;
+
+ $this->state = 'attributeValueSingleQuoted';
+ }
+ }
+
+ private function attributeValueUnquotedState()
+ {
+ // Consume the next input character:
+ $this->char++;
+ $char = $this->character($this->char);
+
+ if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
+ /* U+0009 CHARACTER TABULATION
+ U+000A LINE FEED (LF)
+ U+000B LINE TABULATION
+ U+000C FORM FEED (FF)
+ U+0020 SPACE
+ Switch to the before attribute name state. */
+ $this->state = 'beforeAttributeName';
+
+ } elseif ($char === '&') {
+ /* U+0026 AMPERSAND (&)
+ Switch to the entity in attribute value state. */
+ $this->entityInAttributeValueState();
+
+ } elseif ($char === '>') {
+ /* U+003E GREATER-THAN SIGN (>)
+ Emit the current tag token. Switch to the data state. */
+ $this->emitToken($this->token);
+ $this->state = 'data';
+
+ } else {
+ /* Anything else
+ Append the current input character to the current attribute's value.
+ Stay in the attribute value (unquoted) state. */
+ $last = count($this->token['attr']) - 1;
+ $this->token['attr'][$last]['value'] .= $char;
+
+ $this->state = 'attributeValueUnquoted';
+ }
+ }
+
+ private function entityInAttributeValueState()
+ {
+ // Attempt to consume an entity.
+ $entity = $this->entity();
+
+ // If nothing is returned, append a U+0026 AMPERSAND character to the
+ // current attribute's value. Otherwise, emit the character token that
+ // was returned.
+ $char = (!$entity)
+ ? '&'
+ : $entity;
+
+ $last = count($this->token['attr']) - 1;
+ $this->token['attr'][$last]['value'] .= $char;
+ }
+
+ private function bogusCommentState()
+ {
+ /* Consume every character up to the first U+003E GREATER-THAN SIGN
+ character (>) or the end of the file (EOF), whichever comes first. Emit
+ a comment token whose data is the concatenation of all the characters
+ starting from and including the character that caused the state machine
+ to switch into the bogus comment state, up to and including the last
+ consumed character before the U+003E character, if any, or up to the
+ end of the file otherwise. (If the comment was started by the end of
+ the file (EOF), the token is empty.) */
+ $data = $this->characters('^>', $this->char);
+ $this->emitToken(
+ array(
+ 'data' => $data,
+ 'type' => self::COMMENT
+ )
+ );
+
+ $this->char += strlen($data);
+
+ /* Switch to the data state. */
+ $this->state = 'data';
+
+ /* If the end of the file was reached, reconsume the EOF character. */
+ if ($this->char === $this->EOF) {
+ $this->char = $this->EOF - 1;
+ }
+ }
+
+ private function markupDeclarationOpenState()
+ {
+ /* If the next two characters are both U+002D HYPHEN-MINUS (-)
+ characters, consume those two characters, create a comment token whose
+ data is the empty string, and switch to the comment state. */
+ if ($this->character($this->char + 1, 2) === '--') {
+ $this->char += 2;
+ $this->state = 'comment';
+ $this->token = array(
+ 'data' => null,
+ 'type' => self::COMMENT
+ );
+
+ /* Otherwise if the next seven chacacters are a case-insensitive match
+ for the word "DOCTYPE", then consume those characters and switch to the
+ DOCTYPE state. */
+ } elseif (strtolower($this->character($this->char + 1, 7)) === 'doctype') {
+ $this->char += 7;
+ $this->state = 'doctype';
+
+ /* Otherwise, is is a parse error. Switch to the bogus comment state.
+ The next character that is consumed, if any, is the first character
+ that will be in the comment. */
+ } else {
+ $this->char++;
+ $this->state = 'bogusComment';
+ }
+ }
+
+ private function commentState()
+ {
+ /* Consume the next input character: */
+ $this->char++;
+ $char = $this->char();
+
+ /* U+002D HYPHEN-MINUS (-) */
+ if ($char === '-') {
+ /* Switch to the comment dash state */
+ $this->state = 'commentDash';
+
+ /* EOF */
+ } elseif ($this->char === $this->EOF) {
+ /* Parse error. Emit the comment token. Reconsume the EOF character
+ in the data state. */
+ $this->emitToken($this->token);
+ $this->char--;
+ $this->state = 'data';
+
+ /* Anything else */
+ } else {
+ /* Append the input character to the comment token's data. Stay in
+ the comment state. */
+ $this->token['data'] .= $char;
+ }
+ }
+
+ private function commentDashState()
+ {
+ /* Consume the next input character: */
+ $this->char++;
+ $char = $this->char();
+
+ /* U+002D HYPHEN-MINUS (-) */
+ if ($char === '-') {
+ /* Switch to the comment end state */
+ $this->state = 'commentEnd';
+
+ /* EOF */
+ } elseif ($this->char === $this->EOF) {
+ /* Parse error. Emit the comment token. Reconsume the EOF character
+ in the data state. */
+ $this->emitToken($this->token);
+ $this->char--;
+ $this->state = 'data';
+
+ /* Anything else */
+ } else {
+ /* Append a U+002D HYPHEN-MINUS (-) character and the input
+ character to the comment token's data. Switch to the comment state. */
+ $this->token['data'] .= '-' . $char;
+ $this->state = 'comment';
+ }
+ }
+
+ private function commentEndState()
+ {
+ /* Consume the next input character: */
+ $this->char++;
+ $char = $this->char();
+
+ if ($char === '>') {
+ $this->emitToken($this->token);
+ $this->state = 'data';
+
+ } elseif ($char === '-') {
+ $this->token['data'] .= '-';
+
+ } elseif ($this->char === $this->EOF) {
+ $this->emitToken($this->token);
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ $this->token['data'] .= '--' . $char;
+ $this->state = 'comment';
+ }
+ }
+
+ private function doctypeState()
+ {
+ /* Consume the next input character: */
+ $this->char++;
+ $char = $this->char();
+
+ if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
+ $this->state = 'beforeDoctypeName';
+
+ } else {
+ $this->char--;
+ $this->state = 'beforeDoctypeName';
+ }
+ }
+
+ private function beforeDoctypeNameState()
+ {
+ /* Consume the next input character: */
+ $this->char++;
+ $char = $this->char();
+
+ if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
+ // Stay in the before DOCTYPE name state.
+
+ } elseif (preg_match('/^[a-z]$/', $char)) {
+ $this->token = array(
+ 'name' => strtoupper($char),
+ 'type' => self::DOCTYPE,
+ 'error' => true
+ );
+
+ $this->state = 'doctypeName';
+
+ } elseif ($char === '>') {
+ $this->emitToken(
+ array(
+ 'name' => null,
+ 'type' => self::DOCTYPE,
+ 'error' => true
+ )
+ );
+
+ $this->state = 'data';
+
+ } elseif ($this->char === $this->EOF) {
+ $this->emitToken(
+ array(
+ 'name' => null,
+ 'type' => self::DOCTYPE,
+ 'error' => true
+ )
+ );
+
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ $this->token = array(
+ 'name' => $char,
+ 'type' => self::DOCTYPE,
+ 'error' => true
+ );
+
+ $this->state = 'doctypeName';
+ }
+ }
+
+ private function doctypeNameState()
+ {
+ /* Consume the next input character: */
+ $this->char++;
+ $char = $this->char();
+
+ if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
+ $this->state = 'AfterDoctypeName';
+
+ } elseif ($char === '>') {
+ $this->emitToken($this->token);
+ $this->state = 'data';
+
+ } elseif (preg_match('/^[a-z]$/', $char)) {
+ $this->token['name'] .= strtoupper($char);
+
+ } elseif ($this->char === $this->EOF) {
+ $this->emitToken($this->token);
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ $this->token['name'] .= $char;
+ }
+
+ $this->token['error'] = ($this->token['name'] === 'HTML')
+ ? false
+ : true;
+ }
+
+ private function afterDoctypeNameState()
+ {
+ /* Consume the next input character: */
+ $this->char++;
+ $char = $this->char();
+
+ if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
+ // Stay in the DOCTYPE name state.
+
+ } elseif ($char === '>') {
+ $this->emitToken($this->token);
+ $this->state = 'data';
+
+ } elseif ($this->char === $this->EOF) {
+ $this->emitToken($this->token);
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ $this->token['error'] = true;
+ $this->state = 'bogusDoctype';
+ }
+ }
+
+ private function bogusDoctypeState()
+ {
+ /* Consume the next input character: */
+ $this->char++;
+ $char = $this->char();
+
+ if ($char === '>') {
+ $this->emitToken($this->token);
+ $this->state = 'data';
+
+ } elseif ($this->char === $this->EOF) {
+ $this->emitToken($this->token);
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ // Stay in the bogus DOCTYPE state.
+ }
+ }
+
+ private function entity()
+ {
+ $start = $this->char;
+
+ // This section defines how to consume an entity. This definition is
+ // used when parsing entities in text and in attributes.
+
+ // The behaviour depends on the identity of the next character (the
+ // one immediately after the U+0026 AMPERSAND character):
+
+ switch ($this->character($this->char + 1)) {
+ // U+0023 NUMBER SIGN (#)
+ case '#':
+
+ // The behaviour further depends on the character after the
+ // U+0023 NUMBER SIGN:
+ switch ($this->character($this->char + 1)) {
+ // U+0078 LATIN SMALL LETTER X
+ // U+0058 LATIN CAPITAL LETTER X
+ case 'x':
+ case 'X':
+ // Follow the steps below, but using the range of
+ // characters U+0030 DIGIT ZERO through to U+0039 DIGIT
+ // NINE, U+0061 LATIN SMALL LETTER A through to U+0066
+ // LATIN SMALL LETTER F, and U+0041 LATIN CAPITAL LETTER
+ // A, through to U+0046 LATIN CAPITAL LETTER F (in other
+ // words, 0-9, A-F, a-f).
+ $char = 1;
+ $char_class = '0-9A-Fa-f';
+ break;
+
+ // Anything else
+ default:
+ // Follow the steps below, but using the range of
+ // characters U+0030 DIGIT ZERO through to U+0039 DIGIT
+ // NINE (i.e. just 0-9).
+ $char = 0;
+ $char_class = '0-9';
+ break;
+ }
+
+ // Consume as many characters as match the range of characters
+ // given above.
+ $this->char++;
+ $e_name = $this->characters($char_class, $this->char + $char + 1);
+ $entity = $this->character($start, $this->char);
+ $cond = strlen($e_name) > 0;
+
+ // The rest of the parsing happens bellow.
+ break;
+
+ // Anything else
+ default:
+ // Consume the maximum number of characters possible, with the
+ // consumed characters case-sensitively matching one of the
+ // identifiers in the first column of the entities table.
+
+ $e_name = $this->characters('0-9A-Za-z;', $this->char + 1);
+ $len = strlen($e_name);
+
+ for ($c = 1; $c <= $len; $c++) {
+ $id = substr($e_name, 0, $c);
+ $this->char++;
+
+ if (in_array($id, $this->entities)) {
+ if ($e_name[$c - 1] !== ';') {
+ if ($c < $len && $e_name[$c] == ';') {
+ $this->char++; // consume extra semicolon
+ }
+ }
+ $entity = $id;
+ break;
+ }
+ }
+
+ $cond = isset($entity);
+ // The rest of the parsing happens bellow.
+ break;
+ }
+
+ if (!$cond) {
+ // If no match can be made, then this is a parse error. No
+ // characters are consumed, and nothing is returned.
+ $this->char = $start;
+ return false;
+ }
+
+ // Return a character token for the character corresponding to the
+ // entity name (as given by the second column of the entities table).
+ return html_entity_decode('&' . rtrim($entity, ';') . ';', ENT_QUOTES, 'UTF-8');
+ }
+
+ private function emitToken($token)
+ {
+ $emit = $this->tree->emitToken($token);
+
+ if (is_int($emit)) {
+ $this->content_model = $emit;
+
+ } elseif ($token['type'] === self::ENDTAG) {
+ $this->content_model = self::PCDATA;
+ }
+ }
+
+ private function EOF()
+ {
+ $this->state = null;
+ $this->tree->emitToken(
+ array(
+ 'type' => self::EOF
+ )
+ );
+ }
+}
+
+class HTML5TreeConstructer
+{
+ public $stack = array();
+
+ private $phase;
+ private $mode;
+ private $dom;
+ private $foster_parent = null;
+ private $a_formatting = array();
+
+ private $head_pointer = null;
+ private $form_pointer = null;
+
+ private $scoping = array('button', 'caption', 'html', 'marquee', 'object', 'table', 'td', 'th');
+ private $formatting = array(
+ 'a',
+ 'b',
+ 'big',
+ 'em',
+ 'font',
+ 'i',
+ 'nobr',
+ 's',
+ 'small',
+ 'strike',
+ 'strong',
+ 'tt',
+ 'u'
+ );
+ private $special = array(
+ 'address',
+ 'area',
+ 'base',
+ 'basefont',
+ 'bgsound',
+ 'blockquote',
+ 'body',
+ 'br',
+ 'center',
+ 'col',
+ 'colgroup',
+ 'dd',
+ 'dir',
+ 'div',
+ 'dl',
+ 'dt',
+ 'embed',
+ 'fieldset',
+ 'form',
+ 'frame',
+ 'frameset',
+ 'h1',
+ 'h2',
+ 'h3',
+ 'h4',
+ 'h5',
+ 'h6',
+ 'head',
+ 'hr',
+ 'iframe',
+ 'image',
+ 'img',
+ 'input',
+ 'isindex',
+ 'li',
+ 'link',
+ 'listing',
+ 'menu',
+ 'meta',
+ 'noembed',
+ 'noframes',
+ 'noscript',
+ 'ol',
+ 'optgroup',
+ 'option',
+ 'p',
+ 'param',
+ 'plaintext',
+ 'pre',
+ 'script',
+ 'select',
+ 'spacer',
+ 'style',
+ 'tbody',
+ 'textarea',
+ 'tfoot',
+ 'thead',
+ 'title',
+ 'tr',
+ 'ul',
+ 'wbr'
+ );
+
+ // The different phases.
+ const INIT_PHASE = 0;
+ const ROOT_PHASE = 1;
+ const MAIN_PHASE = 2;
+ const END_PHASE = 3;
+
+ // The different insertion modes for the main phase.
+ const BEFOR_HEAD = 0;
+ const IN_HEAD = 1;
+ const AFTER_HEAD = 2;
+ const IN_BODY = 3;
+ const IN_TABLE = 4;
+ const IN_CAPTION = 5;
+ const IN_CGROUP = 6;
+ const IN_TBODY = 7;
+ const IN_ROW = 8;
+ const IN_CELL = 9;
+ const IN_SELECT = 10;
+ const AFTER_BODY = 11;
+ const IN_FRAME = 12;
+ const AFTR_FRAME = 13;
+
+ // The different types of elements.
+ const SPECIAL = 0;
+ const SCOPING = 1;
+ const FORMATTING = 2;
+ const PHRASING = 3;
+
+ const MARKER = 0;
+
+ public function __construct()
+ {
+ $this->phase = self::INIT_PHASE;
+ $this->mode = self::BEFOR_HEAD;
+ $this->dom = new DOMDocument;
+
+ $this->dom->encoding = 'UTF-8';
+ $this->dom->preserveWhiteSpace = true;
+ $this->dom->substituteEntities = true;
+ $this->dom->strictErrorChecking = false;
+ }
+
+ // Process tag tokens
+ public function emitToken($token)
+ {
+ switch ($this->phase) {
+ case self::INIT_PHASE:
+ return $this->initPhase($token);
+ break;
+ case self::ROOT_PHASE:
+ return $this->rootElementPhase($token);
+ break;
+ case self::MAIN_PHASE:
+ return $this->mainPhase($token);
+ break;
+ case self::END_PHASE :
+ return $this->trailingEndPhase($token);
+ break;
+ }
+ }
+
+ private function initPhase($token)
+ {
+ /* Initially, the tree construction stage must handle each token
+ emitted from the tokenisation stage as follows: */
+
+ /* A DOCTYPE token that is marked as being in error
+ A comment token
+ A start tag token
+ An end tag token
+ A character token that is not one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE
+ An end-of-file token */
+ if ((isset($token['error']) && $token['error']) ||
+ $token['type'] === HTML5::COMMENT ||
+ $token['type'] === HTML5::STARTTAG ||
+ $token['type'] === HTML5::ENDTAG ||
+ $token['type'] === HTML5::EOF ||
+ ($token['type'] === HTML5::CHARACTR && isset($token['data']) &&
+ !preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data']))
+ ) {
+ /* This specification does not define how to handle this case. In
+ particular, user agents may ignore the entirety of this specification
+ altogether for such documents, and instead invoke special parse modes
+ with a greater emphasis on backwards compatibility. */
+
+ $this->phase = self::ROOT_PHASE;
+ return $this->rootElementPhase($token);
+
+ /* A DOCTYPE token marked as being correct */
+ } elseif (isset($token['error']) && !$token['error']) {
+ /* Append a DocumentType node to the Document node, with the name
+ attribute set to the name given in the DOCTYPE token (which will be
+ "HTML"), and the other attributes specific to DocumentType objects
+ set to null, empty lists, or the empty string as appropriate. */
+ $doctype = new DOMDocumentType(null, null, 'HTML');
+
+ /* Then, switch to the root element phase of the tree construction
+ stage. */
+ $this->phase = self::ROOT_PHASE;
+
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE */
+ } elseif (isset($token['data']) && preg_match(
+ '/^[\t\n\x0b\x0c ]+$/',
+ $token['data']
+ )
+ ) {
+ /* Append that character to the Document node. */
+ $text = $this->dom->createTextNode($token['data']);
+ $this->dom->appendChild($text);
+ }
+ }
+
+ private function rootElementPhase($token)
+ {
+ /* After the initial phase, as each token is emitted from the tokenisation
+ stage, it must be processed as described in this section. */
+
+ /* A DOCTYPE token */
+ if ($token['type'] === HTML5::DOCTYPE) {
+ // Parse error. Ignore the token.
+
+ /* A comment token */
+ } elseif ($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the Document object with the data
+ attribute set to the data given in the comment token. */
+ $comment = $this->dom->createComment($token['data']);
+ $this->dom->appendChild($comment);
+
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE */
+ } elseif ($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])
+ ) {
+ /* Append that character to the Document node. */
+ $text = $this->dom->createTextNode($token['data']);
+ $this->dom->appendChild($text);
+
+ /* A character token that is not one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED
+ (FF), or U+0020 SPACE
+ A start tag token
+ An end tag token
+ An end-of-file token */
+ } elseif (($token['type'] === HTML5::CHARACTR &&
+ !preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) ||
+ $token['type'] === HTML5::STARTTAG ||
+ $token['type'] === HTML5::ENDTAG ||
+ $token['type'] === HTML5::EOF
+ ) {
+ /* Create an HTMLElement node with the tag name html, in the HTML
+ namespace. Append it to the Document object. Switch to the main
+ phase and reprocess the current token. */
+ $html = $this->dom->createElement('html');
+ $this->dom->appendChild($html);
+ $this->stack[] = $html;
+
+ $this->phase = self::MAIN_PHASE;
+ return $this->mainPhase($token);
+ }
+ }
+
+ private function mainPhase($token)
+ {
+ /* Tokens in the main phase must be handled as follows: */
+
+ /* A DOCTYPE token */
+ if ($token['type'] === HTML5::DOCTYPE) {
+ // Parse error. Ignore the token.
+
+ /* A start tag token with the tag name "html" */
+ } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'html') {
+ /* If this start tag token was not the first start tag token, then
+ it is a parse error. */
+
+ /* For each attribute on the token, check to see if the attribute
+ is already present on the top element of the stack of open elements.
+ If it is not, add the attribute and its corresponding value to that
+ element. */
+ foreach ($token['attr'] as $attr) {
+ if (!$this->stack[0]->hasAttribute($attr['name'])) {
+ $this->stack[0]->setAttribute($attr['name'], $attr['value']);
+ }
+ }
+
+ /* An end-of-file token */
+ } elseif ($token['type'] === HTML5::EOF) {
+ /* Generate implied end tags. */
+ $this->generateImpliedEndTags();
+
+ /* Anything else. */
+ } else {
+ /* Depends on the insertion mode: */
+ switch ($this->mode) {
+ case self::BEFOR_HEAD:
+ return $this->beforeHead($token);
+ break;
+ case self::IN_HEAD:
+ return $this->inHead($token);
+ break;
+ case self::AFTER_HEAD:
+ return $this->afterHead($token);
+ break;
+ case self::IN_BODY:
+ return $this->inBody($token);
+ break;
+ case self::IN_TABLE:
+ return $this->inTable($token);
+ break;
+ case self::IN_CAPTION:
+ return $this->inCaption($token);
+ break;
+ case self::IN_CGROUP:
+ return $this->inColumnGroup($token);
+ break;
+ case self::IN_TBODY:
+ return $this->inTableBody($token);
+ break;
+ case self::IN_ROW:
+ return $this->inRow($token);
+ break;
+ case self::IN_CELL:
+ return $this->inCell($token);
+ break;
+ case self::IN_SELECT:
+ return $this->inSelect($token);
+ break;
+ case self::AFTER_BODY:
+ return $this->afterBody($token);
+ break;
+ case self::IN_FRAME:
+ return $this->inFrameset($token);
+ break;
+ case self::AFTR_FRAME:
+ return $this->afterFrameset($token);
+ break;
+ case self::END_PHASE:
+ return $this->trailingEndPhase($token);
+ break;
+ }
+ }
+ }
+
+ private function beforeHead($token)
+ {
+ /* Handle the token as follows: */
+
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE */
+ if ($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])
+ ) {
+ /* Append the character to the current node. */
+ $this->insertText($token['data']);
+
+ /* A comment token */
+ } elseif ($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the current node with the data attribute
+ set to the data given in the comment token. */
+ $this->insertComment($token['data']);
+
+ /* A start tag token with the tag name "head" */
+ } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'head') {
+ /* Create an element for the token, append the new element to the
+ current node and push it onto the stack of open elements. */
+ $element = $this->insertElement($token);
+
+ /* Set the head element pointer to this new element node. */
+ $this->head_pointer = $element;
+
+ /* Change the insertion mode to "in head". */
+ $this->mode = self::IN_HEAD;
+
+ /* A start tag token whose tag name is one of: "base", "link", "meta",
+ "script", "style", "title". Or an end tag with the tag name "html".
+ Or a character token that is not one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE. Or any other start tag token */
+ } elseif ($token['type'] === HTML5::STARTTAG ||
+ ($token['type'] === HTML5::ENDTAG && $token['name'] === 'html') ||
+ ($token['type'] === HTML5::CHARACTR && !preg_match(
+ '/^[\t\n\x0b\x0c ]$/',
+ $token['data']
+ ))
+ ) {
+ /* Act as if a start tag token with the tag name "head" and no
+ attributes had been seen, then reprocess the current token. */
+ $this->beforeHead(
+ array(
+ 'name' => 'head',
+ 'type' => HTML5::STARTTAG,
+ 'attr' => array()
+ )
+ );
+
+ return $this->inHead($token);
+
+ /* Any other end tag */
+ } elseif ($token['type'] === HTML5::ENDTAG) {
+ /* Parse error. Ignore the token. */
+ }
+ }
+
+ private function inHead($token)
+ {
+ /* Handle the token as follows: */
+
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE.
+
+ THIS DIFFERS FROM THE SPEC: If the current node is either a title, style
+ or script element, append the character to the current node regardless
+ of its content. */
+ if (($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) || (
+ $token['type'] === HTML5::CHARACTR && in_array(
+ end($this->stack)->nodeName,
+ array('title', 'style', 'script')
+ ))
+ ) {
+ /* Append the character to the current node. */
+ $this->insertText($token['data']);
+
+ /* A comment token */
+ } elseif ($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the current node with the data attribute
+ set to the data given in the comment token. */
+ $this->insertComment($token['data']);
+
+ } elseif ($token['type'] === HTML5::ENDTAG &&
+ in_array($token['name'], array('title', 'style', 'script'))
+ ) {
+ array_pop($this->stack);
+ return HTML5::PCDATA;
+
+ /* A start tag with the tag name "title" */
+ } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'title') {
+ /* Create an element for the token and append the new element to the
+ node pointed to by the head element pointer, or, if that is null
+ (innerHTML case), to the current node. */
+ if ($this->head_pointer !== null) {
+ $element = $this->insertElement($token, false);
+ $this->head_pointer->appendChild($element);
+
+ } else {
+ $element = $this->insertElement($token);
+ }
+
+ /* Switch the tokeniser's content model flag to the RCDATA state. */
+ return HTML5::RCDATA;
+
+ /* A start tag with the tag name "style" */
+ } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'style') {
+ /* Create an element for the token and append the new element to the
+ node pointed to by the head element pointer, or, if that is null
+ (innerHTML case), to the current node. */
+ if ($this->head_pointer !== null) {
+ $element = $this->insertElement($token, false);
+ $this->head_pointer->appendChild($element);
+
+ } else {
+ $this->insertElement($token);
+ }
+
+ /* Switch the tokeniser's content model flag to the CDATA state. */
+ return HTML5::CDATA;
+
+ /* A start tag with the tag name "script" */
+ } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'script') {
+ /* Create an element for the token. */
+ $element = $this->insertElement($token, false);
+ $this->head_pointer->appendChild($element);
+
+ /* Switch the tokeniser's content model flag to the CDATA state. */
+ return HTML5::CDATA;
+
+ /* A start tag with the tag name "base", "link", or "meta" */
+ } elseif ($token['type'] === HTML5::STARTTAG && in_array(
+ $token['name'],
+ array('base', 'link', 'meta')
+ )
+ ) {
+ /* Create an element for the token and append the new element to the
+ node pointed to by the head element pointer, or, if that is null
+ (innerHTML case), to the current node. */
+ if ($this->head_pointer !== null) {
+ $element = $this->insertElement($token, false);
+ $this->head_pointer->appendChild($element);
+ array_pop($this->stack);
+
+ } else {
+ $this->insertElement($token);
+ }
+
+ /* An end tag with the tag name "head" */
+ } elseif ($token['type'] === HTML5::ENDTAG && $token['name'] === 'head') {
+ /* If the current node is a head element, pop the current node off
+ the stack of open elements. */
+ if ($this->head_pointer->isSameNode(end($this->stack))) {
+ array_pop($this->stack);
+
+ /* Otherwise, this is a parse error. */
+ } else {
+ // k
+ }
+
+ /* Change the insertion mode to "after head". */
+ $this->mode = self::AFTER_HEAD;
+
+ /* A start tag with the tag name "head" or an end tag except "html". */
+ } elseif (($token['type'] === HTML5::STARTTAG && $token['name'] === 'head') ||
+ ($token['type'] === HTML5::ENDTAG && $token['name'] !== 'html')
+ ) {
+ // Parse error. Ignore the token.
+
+ /* Anything else */
+ } else {
+ /* If the current node is a head element, act as if an end tag
+ token with the tag name "head" had been seen. */
+ if ($this->head_pointer->isSameNode(end($this->stack))) {
+ $this->inHead(
+ array(
+ 'name' => 'head',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+
+ /* Otherwise, change the insertion mode to "after head". */
+ } else {
+ $this->mode = self::AFTER_HEAD;
+ }
+
+ /* Then, reprocess the current token. */
+ return $this->afterHead($token);
+ }
+ }
+
+ private function afterHead($token)
+ {
+ /* Handle the token as follows: */
+
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE */
+ if ($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])
+ ) {
+ /* Append the character to the current node. */
+ $this->insertText($token['data']);
+
+ /* A comment token */
+ } elseif ($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the current node with the data attribute
+ set to the data given in the comment token. */
+ $this->insertComment($token['data']);
+
+ /* A start tag token with the tag name "body" */
+ } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'body') {
+ /* Insert a body element for the token. */
+ $this->insertElement($token);
+
+ /* Change the insertion mode to "in body". */
+ $this->mode = self::IN_BODY;
+
+ /* A start tag token with the tag name "frameset" */
+ } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'frameset') {
+ /* Insert a frameset element for the token. */
+ $this->insertElement($token);
+
+ /* Change the insertion mode to "in frameset". */
+ $this->mode = self::IN_FRAME;
+
+ /* A start tag token whose tag name is one of: "base", "link", "meta",
+ "script", "style", "title" */
+ } elseif ($token['type'] === HTML5::STARTTAG && in_array(
+ $token['name'],
+ array('base', 'link', 'meta', 'script', 'style', 'title')
+ )
+ ) {
+ /* Parse error. Switch the insertion mode back to "in head" and
+ reprocess the token. */
+ $this->mode = self::IN_HEAD;
+ return $this->inHead($token);
+
+ /* Anything else */
+ } else {
+ /* Act as if a start tag token with the tag name "body" and no
+ attributes had been seen, and then reprocess the current token. */
+ $this->afterHead(
+ array(
+ 'name' => 'body',
+ 'type' => HTML5::STARTTAG,
+ 'attr' => array()
+ )
+ );
+
+ return $this->inBody($token);
+ }
+ }
+
+ private function inBody($token)
+ {
+ /* Handle the token as follows: */
+
+ switch ($token['type']) {
+ /* A character token */
+ case HTML5::CHARACTR:
+ /* Reconstruct the active formatting elements, if any. */
+ $this->reconstructActiveFormattingElements();
+
+ /* Append the token's character to the current node. */
+ $this->insertText($token['data']);
+ break;
+
+ /* A comment token */
+ case HTML5::COMMENT:
+ /* Append a Comment node to the current node with the data
+ attribute set to the data given in the comment token. */
+ $this->insertComment($token['data']);
+ break;
+
+ case HTML5::STARTTAG:
+ switch ($token['name']) {
+ /* A start tag token whose tag name is one of: "script",
+ "style" */
+ case 'script':
+ case 'style':
+ /* Process the token as if the insertion mode had been "in
+ head". */
+ return $this->inHead($token);
+ break;
+
+ /* A start tag token whose tag name is one of: "base", "link",
+ "meta", "title" */
+ case 'base':
+ case 'link':
+ case 'meta':
+ case 'title':
+ /* Parse error. Process the token as if the insertion mode
+ had been "in head". */
+ return $this->inHead($token);
+ break;
+
+ /* A start tag token with the tag name "body" */
+ case 'body':
+ /* Parse error. If the second element on the stack of open
+ elements is not a body element, or, if the stack of open
+ elements has only one node on it, then ignore the token.
+ (innerHTML case) */
+ if (count($this->stack) === 1 || $this->stack[1]->nodeName !== 'body') {
+ // Ignore
+
+ /* Otherwise, for each attribute on the token, check to see
+ if the attribute is already present on the body element (the
+ second element) on the stack of open elements. If it is not,
+ add the attribute and its corresponding value to that
+ element. */
+ } else {
+ foreach ($token['attr'] as $attr) {
+ if (!$this->stack[1]->hasAttribute($attr['name'])) {
+ $this->stack[1]->setAttribute($attr['name'], $attr['value']);
+ }
+ }
+ }
+ break;
+
+ /* A start tag whose tag name is one of: "address",
+ "blockquote", "center", "dir", "div", "dl", "fieldset",
+ "listing", "menu", "ol", "p", "ul" */
+ case 'address':
+ case 'blockquote':
+ case 'center':
+ case 'dir':
+ case 'div':
+ case 'dl':
+ case 'fieldset':
+ case 'listing':
+ case 'menu':
+ case 'ol':
+ case 'p':
+ case 'ul':
+ /* If the stack of open elements has a p element in scope,
+ then act as if an end tag with the tag name p had been
+ seen. */
+ if ($this->elementInScope('p')) {
+ $this->emitToken(
+ array(
+ 'name' => 'p',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+ }
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+ break;
+
+ /* A start tag whose tag name is "form" */
+ case 'form':
+ /* If the form element pointer is not null, ignore the
+ token with a parse error. */
+ if ($this->form_pointer !== null) {
+ // Ignore.
+
+ /* Otherwise: */
+ } else {
+ /* If the stack of open elements has a p element in
+ scope, then act as if an end tag with the tag name p
+ had been seen. */
+ if ($this->elementInScope('p')) {
+ $this->emitToken(
+ array(
+ 'name' => 'p',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+ }
+
+ /* Insert an HTML element for the token, and set the
+ form element pointer to point to the element created. */
+ $element = $this->insertElement($token);
+ $this->form_pointer = $element;
+ }
+ break;
+
+ /* A start tag whose tag name is "li", "dd" or "dt" */
+ case 'li':
+ case 'dd':
+ case 'dt':
+ /* If the stack of open elements has a p element in scope,
+ then act as if an end tag with the tag name p had been
+ seen. */
+ if ($this->elementInScope('p')) {
+ $this->emitToken(
+ array(
+ 'name' => 'p',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+ }
+
+ $stack_length = count($this->stack) - 1;
+
+ for ($n = $stack_length; 0 <= $n; $n--) {
+ /* 1. Initialise node to be the current node (the
+ bottommost node of the stack). */
+ $stop = false;
+ $node = $this->stack[$n];
+ $cat = $this->getElementCategory($node->tagName);
+
+ /* 2. If node is an li, dd or dt element, then pop all
+ the nodes from the current node up to node, including
+ node, then stop this algorithm. */
+ if ($token['name'] === $node->tagName || ($token['name'] !== 'li'
+ && ($node->tagName === 'dd' || $node->tagName === 'dt'))
+ ) {
+ for ($x = $stack_length; $x >= $n; $x--) {
+ array_pop($this->stack);
+ }
+
+ break;
+ }
+
+ /* 3. If node is not in the formatting category, and is
+ not in the phrasing category, and is not an address or
+ div element, then stop this algorithm. */
+ if ($cat !== self::FORMATTING && $cat !== self::PHRASING &&
+ $node->tagName !== 'address' && $node->tagName !== 'div'
+ ) {
+ break;
+ }
+ }
+
+ /* Finally, insert an HTML element with the same tag
+ name as the token's. */
+ $this->insertElement($token);
+ break;
+
+ /* A start tag token whose tag name is "plaintext" */
+ case 'plaintext':
+ /* If the stack of open elements has a p element in scope,
+ then act as if an end tag with the tag name p had been
+ seen. */
+ if ($this->elementInScope('p')) {
+ $this->emitToken(
+ array(
+ 'name' => 'p',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+ }
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ return HTML5::PLAINTEXT;
+ break;
+
+ /* A start tag whose tag name is one of: "h1", "h2", "h3", "h4",
+ "h5", "h6" */
+ case 'h1':
+ case 'h2':
+ case 'h3':
+ case 'h4':
+ case 'h5':
+ case 'h6':
+ /* If the stack of open elements has a p element in scope,
+ then act as if an end tag with the tag name p had been seen. */
+ if ($this->elementInScope('p')) {
+ $this->emitToken(
+ array(
+ 'name' => 'p',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+ }
+
+ /* If the stack of open elements has in scope an element whose
+ tag name is one of "h1", "h2", "h3", "h4", "h5", or "h6", then
+ this is a parse error; pop elements from the stack until an
+ element with one of those tag names has been popped from the
+ stack. */
+ while ($this->elementInScope(array('h1', 'h2', 'h3', 'h4', 'h5', 'h6'))) {
+ array_pop($this->stack);
+ }
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+ break;
+
+ /* A start tag whose tag name is "a" */
+ case 'a':
+ /* If the list of active formatting elements contains
+ an element whose tag name is "a" between the end of the
+ list and the last marker on the list (or the start of
+ the list if there is no marker on the list), then this
+ is a parse error; act as if an end tag with the tag name
+ "a" had been seen, then remove that element from the list
+ of active formatting elements and the stack of open
+ elements if the end tag didn't already remove it (it
+ might not have if the element is not in table scope). */
+ $leng = count($this->a_formatting);
+
+ for ($n = $leng - 1; $n >= 0; $n--) {
+ if ($this->a_formatting[$n] === self::MARKER) {
+ break;
+
+ } elseif ($this->a_formatting[$n]->nodeName === 'a') {
+ $this->emitToken(
+ array(
+ 'name' => 'a',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+ break;
+ }
+ }
+
+ /* Reconstruct the active formatting elements, if any. */
+ $this->reconstructActiveFormattingElements();
+
+ /* Insert an HTML element for the token. */
+ $el = $this->insertElement($token);
+
+ /* Add that element to the list of active formatting
+ elements. */
+ $this->a_formatting[] = $el;
+ break;
+
+ /* A start tag whose tag name is one of: "b", "big", "em", "font",
+ "i", "nobr", "s", "small", "strike", "strong", "tt", "u" */
+ case 'b':
+ case 'big':
+ case 'em':
+ case 'font':
+ case 'i':
+ case 'nobr':
+ case 's':
+ case 'small':
+ case 'strike':
+ case 'strong':
+ case 'tt':
+ case 'u':
+ /* Reconstruct the active formatting elements, if any. */
+ $this->reconstructActiveFormattingElements();
+
+ /* Insert an HTML element for the token. */
+ $el = $this->insertElement($token);
+
+ /* Add that element to the list of active formatting
+ elements. */
+ $this->a_formatting[] = $el;
+ break;
+
+ /* A start tag token whose tag name is "button" */
+ case 'button':
+ /* If the stack of open elements has a button element in scope,
+ then this is a parse error; act as if an end tag with the tag
+ name "button" had been seen, then reprocess the token. (We don't
+ do that. Unnecessary.) */
+ if ($this->elementInScope('button')) {
+ $this->inBody(
+ array(
+ 'name' => 'button',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+ }
+
+ /* Reconstruct the active formatting elements, if any. */
+ $this->reconstructActiveFormattingElements();
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ /* Insert a marker at the end of the list of active
+ formatting elements. */
+ $this->a_formatting[] = self::MARKER;
+ break;
+
+ /* A start tag token whose tag name is one of: "marquee", "object" */
+ case 'marquee':
+ case 'object':
+ /* Reconstruct the active formatting elements, if any. */
+ $this->reconstructActiveFormattingElements();
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ /* Insert a marker at the end of the list of active
+ formatting elements. */
+ $this->a_formatting[] = self::MARKER;
+ break;
+
+ /* A start tag token whose tag name is "xmp" */
+ case 'xmp':
+ /* Reconstruct the active formatting elements, if any. */
+ $this->reconstructActiveFormattingElements();
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ /* Switch the content model flag to the CDATA state. */
+ return HTML5::CDATA;
+ break;
+
+ /* A start tag whose tag name is "table" */
+ case 'table':
+ /* If the stack of open elements has a p element in scope,
+ then act as if an end tag with the tag name p had been seen. */
+ if ($this->elementInScope('p')) {
+ $this->emitToken(
+ array(
+ 'name' => 'p',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+ }
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ /* Change the insertion mode to "in table". */
+ $this->mode = self::IN_TABLE;
+ break;
+
+ /* A start tag whose tag name is one of: "area", "basefont",
+ "bgsound", "br", "embed", "img", "param", "spacer", "wbr" */
+ case 'area':
+ case 'basefont':
+ case 'bgsound':
+ case 'br':
+ case 'embed':
+ case 'img':
+ case 'param':
+ case 'spacer':
+ case 'wbr':
+ /* Reconstruct the active formatting elements, if any. */
+ $this->reconstructActiveFormattingElements();
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ /* Immediately pop the current node off the stack of open elements. */
+ array_pop($this->stack);
+ break;
+
+ /* A start tag whose tag name is "hr" */
+ case 'hr':
+ /* If the stack of open elements has a p element in scope,
+ then act as if an end tag with the tag name p had been seen. */
+ if ($this->elementInScope('p')) {
+ $this->emitToken(
+ array(
+ 'name' => 'p',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+ }
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ /* Immediately pop the current node off the stack of open elements. */
+ array_pop($this->stack);
+ break;
+
+ /* A start tag whose tag name is "image" */
+ case 'image':
+ /* Parse error. Change the token's tag name to "img" and
+ reprocess it. (Don't ask.) */
+ $token['name'] = 'img';
+ return $this->inBody($token);
+ break;
+
+ /* A start tag whose tag name is "input" */
+ case 'input':
+ /* Reconstruct the active formatting elements, if any. */
+ $this->reconstructActiveFormattingElements();
+
+ /* Insert an input element for the token. */
+ $element = $this->insertElement($token, false);
+
+ /* If the form element pointer is not null, then associate the
+ input element with the form element pointed to by the form
+ element pointer. */
+ $this->form_pointer !== null
+ ? $this->form_pointer->appendChild($element)
+ : end($this->stack)->appendChild($element);
+
+ /* Pop that input element off the stack of open elements. */
+ array_pop($this->stack);
+ break;
+
+ /* A start tag whose tag name is "isindex" */
+ case 'isindex':
+ /* Parse error. */
+ // w/e
+
+ /* If the form element pointer is not null,
+ then ignore the token. */
+ if ($this->form_pointer === null) {
+ /* Act as if a start tag token with the tag name "form" had
+ been seen. */
+ $this->inBody(
+ array(
+ 'name' => 'body',
+ 'type' => HTML5::STARTTAG,
+ 'attr' => array()
+ )
+ );
+
+ /* Act as if a start tag token with the tag name "hr" had
+ been seen. */
+ $this->inBody(
+ array(
+ 'name' => 'hr',
+ 'type' => HTML5::STARTTAG,
+ 'attr' => array()
+ )
+ );
+
+ /* Act as if a start tag token with the tag name "p" had
+ been seen. */
+ $this->inBody(
+ array(
+ 'name' => 'p',
+ 'type' => HTML5::STARTTAG,
+ 'attr' => array()
+ )
+ );
+
+ /* Act as if a start tag token with the tag name "label"
+ had been seen. */
+ $this->inBody(
+ array(
+ 'name' => 'label',
+ 'type' => HTML5::STARTTAG,
+ 'attr' => array()
+ )
+ );
+
+ /* Act as if a stream of character tokens had been seen. */
+ $this->insertText(
+ 'This is a searchable index. ' .
+ 'Insert your search keywords here: '
+ );
+
+ /* Act as if a start tag token with the tag name "input"
+ had been seen, with all the attributes from the "isindex"
+ token, except with the "name" attribute set to the value
+ "isindex" (ignoring any explicit "name" attribute). */
+ $attr = $token['attr'];
+ $attr[] = array('name' => 'name', 'value' => 'isindex');
+
+ $this->inBody(
+ array(
+ 'name' => 'input',
+ 'type' => HTML5::STARTTAG,
+ 'attr' => $attr
+ )
+ );
+
+ /* Act as if a stream of character tokens had been seen
+ (see below for what they should say). */
+ $this->insertText(
+ 'This is a searchable index. ' .
+ 'Insert your search keywords here: '
+ );
+
+ /* Act as if an end tag token with the tag name "label"
+ had been seen. */
+ $this->inBody(
+ array(
+ 'name' => 'label',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+
+ /* Act as if an end tag token with the tag name "p" had
+ been seen. */
+ $this->inBody(
+ array(
+ 'name' => 'p',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+
+ /* Act as if a start tag token with the tag name "hr" had
+ been seen. */
+ $this->inBody(
+ array(
+ 'name' => 'hr',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+
+ /* Act as if an end tag token with the tag name "form" had
+ been seen. */
+ $this->inBody(
+ array(
+ 'name' => 'form',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+ }
+ break;
+
+ /* A start tag whose tag name is "textarea" */
+ case 'textarea':
+ $this->insertElement($token);
+
+ /* Switch the tokeniser's content model flag to the
+ RCDATA state. */
+ return HTML5::RCDATA;
+ break;
+
+ /* A start tag whose tag name is one of: "iframe", "noembed",
+ "noframes" */
+ case 'iframe':
+ case 'noembed':
+ case 'noframes':
+ $this->insertElement($token);
+
+ /* Switch the tokeniser's content model flag to the CDATA state. */
+ return HTML5::CDATA;
+ break;
+
+ /* A start tag whose tag name is "select" */
+ case 'select':
+ /* Reconstruct the active formatting elements, if any. */
+ $this->reconstructActiveFormattingElements();
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ /* Change the insertion mode to "in select". */
+ $this->mode = self::IN_SELECT;
+ break;
+
+ /* A start or end tag whose tag name is one of: "caption", "col",
+ "colgroup", "frame", "frameset", "head", "option", "optgroup",
+ "tbody", "td", "tfoot", "th", "thead", "tr". */
+ case 'caption':
+ case 'col':
+ case 'colgroup':
+ case 'frame':
+ case 'frameset':
+ case 'head':
+ case 'option':
+ case 'optgroup':
+ case 'tbody':
+ case 'td':
+ case 'tfoot':
+ case 'th':
+ case 'thead':
+ case 'tr':
+ // Parse error. Ignore the token.
+ break;
+
+ /* A start or end tag whose tag name is one of: "event-source",
+ "section", "nav", "article", "aside", "header", "footer",
+ "datagrid", "command" */
+ case 'event-source':
+ case 'section':
+ case 'nav':
+ case 'article':
+ case 'aside':
+ case 'header':
+ case 'footer':
+ case 'datagrid':
+ case 'command':
+ // Work in progress!
+ break;
+
+ /* A start tag token not covered by the previous entries */
+ default:
+ /* Reconstruct the active formatting elements, if any. */
+ $this->reconstructActiveFormattingElements();
+
+ $this->insertElement($token, true, true);
+ break;
+ }
+ break;
+
+ case HTML5::ENDTAG:
+ switch ($token['name']) {
+ /* An end tag with the tag name "body" */
+ case 'body':
+ /* If the second element in the stack of open elements is
+ not a body element, this is a parse error. Ignore the token.
+ (innerHTML case) */
+ if (count($this->stack) < 2 || $this->stack[1]->nodeName !== 'body') {
+ // Ignore.
+
+ /* If the current node is not the body element, then this
+ is a parse error. */
+ } elseif (end($this->stack)->nodeName !== 'body') {
+ // Parse error.
+ }
+
+ /* Change the insertion mode to "after body". */
+ $this->mode = self::AFTER_BODY;
+ break;
+
+ /* An end tag with the tag name "html" */
+ case 'html':
+ /* Act as if an end tag with tag name "body" had been seen,
+ then, if that token wasn't ignored, reprocess the current
+ token. */
+ $this->inBody(
+ array(
+ 'name' => 'body',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+
+ return $this->afterBody($token);
+ break;
+
+ /* An end tag whose tag name is one of: "address", "blockquote",
+ "center", "dir", "div", "dl", "fieldset", "listing", "menu",
+ "ol", "pre", "ul" */
+ case 'address':
+ case 'blockquote':
+ case 'center':
+ case 'dir':
+ case 'div':
+ case 'dl':
+ case 'fieldset':
+ case 'listing':
+ case 'menu':
+ case 'ol':
+ case 'pre':
+ case 'ul':
+ /* If the stack of open elements has an element in scope
+ with the same tag name as that of the token, then generate
+ implied end tags. */
+ if ($this->elementInScope($token['name'])) {
+ $this->generateImpliedEndTags();
+
+ /* Now, if the current node is not an element with
+ the same tag name as that of the token, then this
+ is a parse error. */
+ // w/e
+
+ /* If the stack of open elements has an element in
+ scope with the same tag name as that of the token,
+ then pop elements from this stack until an element
+ with that tag name has been popped from the stack. */
+ for ($n = count($this->stack) - 1; $n >= 0; $n--) {
+ if ($this->stack[$n]->nodeName === $token['name']) {
+ $n = -1;
+ }
+
+ array_pop($this->stack);
+ }
+ }
+ break;
+
+ /* An end tag whose tag name is "form" */
+ case 'form':
+ /* If the stack of open elements has an element in scope
+ with the same tag name as that of the token, then generate
+ implied end tags. */
+ if ($this->elementInScope($token['name'])) {
+ $this->generateImpliedEndTags();
+
+ }
+
+ if (end($this->stack)->nodeName !== $token['name']) {
+ /* Now, if the current node is not an element with the
+ same tag name as that of the token, then this is a parse
+ error. */
+ // w/e
+
+ } else {
+ /* Otherwise, if the current node is an element with
+ the same tag name as that of the token pop that element
+ from the stack. */
+ array_pop($this->stack);
+ }
+
+ /* In any case, set the form element pointer to null. */
+ $this->form_pointer = null;
+ break;
+
+ /* An end tag whose tag name is "p" */
+ case 'p':
+ /* If the stack of open elements has a p element in scope,
+ then generate implied end tags, except for p elements. */
+ if ($this->elementInScope('p')) {
+ $this->generateImpliedEndTags(array('p'));
+
+ /* If the current node is not a p element, then this is
+ a parse error. */
+ // k
+
+ /* If the stack of open elements has a p element in
+ scope, then pop elements from this stack until the stack
+ no longer has a p element in scope. */
+ for ($n = count($this->stack) - 1; $n >= 0; $n--) {
+ if ($this->elementInScope('p')) {
+ array_pop($this->stack);
+
+ } else {
+ break;
+ }
+ }
+ }
+ break;
+
+ /* An end tag whose tag name is "dd", "dt", or "li" */
+ case 'dd':
+ case 'dt':
+ case 'li':
+ /* If the stack of open elements has an element in scope
+ whose tag name matches the tag name of the token, then
+ generate implied end tags, except for elements with the
+ same tag name as the token. */
+ if ($this->elementInScope($token['name'])) {
+ $this->generateImpliedEndTags(array($token['name']));
+
+ /* If the current node is not an element with the same
+ tag name as the token, then this is a parse error. */
+ // w/e
+
+ /* If the stack of open elements has an element in scope
+ whose tag name matches the tag name of the token, then
+ pop elements from this stack until an element with that
+ tag name has been popped from the stack. */
+ for ($n = count($this->stack) - 1; $n >= 0; $n--) {
+ if ($this->stack[$n]->nodeName === $token['name']) {
+ $n = -1;
+ }
+
+ array_pop($this->stack);
+ }
+ }
+ break;
+
+ /* An end tag whose tag name is one of: "h1", "h2", "h3", "h4",
+ "h5", "h6" */
+ case 'h1':
+ case 'h2':
+ case 'h3':
+ case 'h4':
+ case 'h5':
+ case 'h6':
+ $elements = array('h1', 'h2', 'h3', 'h4', 'h5', 'h6');
+
+ /* If the stack of open elements has in scope an element whose
+ tag name is one of "h1", "h2", "h3", "h4", "h5", or "h6", then
+ generate implied end tags. */
+ if ($this->elementInScope($elements)) {
+ $this->generateImpliedEndTags();
+
+ /* Now, if the current node is not an element with the same
+ tag name as that of the token, then this is a parse error. */
+ // w/e
+
+ /* If the stack of open elements has in scope an element
+ whose tag name is one of "h1", "h2", "h3", "h4", "h5", or
+ "h6", then pop elements from the stack until an element
+ with one of those tag names has been popped from the stack. */
+ while ($this->elementInScope($elements)) {
+ array_pop($this->stack);
+ }
+ }
+ break;
+
+ /* An end tag whose tag name is one of: "a", "b", "big", "em",
+ "font", "i", "nobr", "s", "small", "strike", "strong", "tt", "u" */
+ case 'a':
+ case 'b':
+ case 'big':
+ case 'em':
+ case 'font':
+ case 'i':
+ case 'nobr':
+ case 's':
+ case 'small':
+ case 'strike':
+ case 'strong':
+ case 'tt':
+ case 'u':
+ /* 1. Let the formatting element be the last element in
+ the list of active formatting elements that:
+ * is between the end of the list and the last scope
+ marker in the list, if any, or the start of the list
+ otherwise, and
+ * has the same tag name as the token.
+ */
+ while (true) {
+ for ($a = count($this->a_formatting) - 1; $a >= 0; $a--) {
+ if ($this->a_formatting[$a] === self::MARKER) {
+ break;
+
+ } elseif ($this->a_formatting[$a]->tagName === $token['name']) {
+ $formatting_element = $this->a_formatting[$a];
+ $in_stack = in_array($formatting_element, $this->stack, true);
+ $fe_af_pos = $a;
+ break;
+ }
+ }
+
+ /* If there is no such node, or, if that node is
+ also in the stack of open elements but the element
+ is not in scope, then this is a parse error. Abort
+ these steps. The token is ignored. */
+ if (!isset($formatting_element) || ($in_stack &&
+ !$this->elementInScope($token['name']))
+ ) {
+ break;
+
+ /* Otherwise, if there is such a node, but that node
+ is not in the stack of open elements, then this is a
+ parse error; remove the element from the list, and
+ abort these steps. */
+ } elseif (isset($formatting_element) && !$in_stack) {
+ unset($this->a_formatting[$fe_af_pos]);
+ $this->a_formatting = array_merge($this->a_formatting);
+ break;
+ }
+
+ /* 2. Let the furthest block be the topmost node in the
+ stack of open elements that is lower in the stack
+ than the formatting element, and is not an element in
+ the phrasing or formatting categories. There might
+ not be one. */
+ $fe_s_pos = array_search($formatting_element, $this->stack, true);
+ $length = count($this->stack);
+
+ for ($s = $fe_s_pos + 1; $s < $length; $s++) {
+ $category = $this->getElementCategory($this->stack[$s]->nodeName);
+
+ if ($category !== self::PHRASING && $category !== self::FORMATTING) {
+ $furthest_block = $this->stack[$s];
+ }
+ }
+
+ /* 3. If there is no furthest block, then the UA must
+ skip the subsequent steps and instead just pop all
+ the nodes from the bottom of the stack of open
+ elements, from the current node up to the formatting
+ element, and remove the formatting element from the
+ list of active formatting elements. */
+ if (!isset($furthest_block)) {
+ for ($n = $length - 1; $n >= $fe_s_pos; $n--) {
+ array_pop($this->stack);
+ }
+
+ unset($this->a_formatting[$fe_af_pos]);
+ $this->a_formatting = array_merge($this->a_formatting);
+ break;
+ }
+
+ /* 4. Let the common ancestor be the element
+ immediately above the formatting element in the stack
+ of open elements. */
+ $common_ancestor = $this->stack[$fe_s_pos - 1];
+
+ /* 5. If the furthest block has a parent node, then
+ remove the furthest block from its parent node. */
+ if ($furthest_block->parentNode !== null) {
+ $furthest_block->parentNode->removeChild($furthest_block);
+ }
+
+ /* 6. Let a bookmark note the position of the
+ formatting element in the list of active formatting
+ elements relative to the elements on either side
+ of it in the list. */
+ $bookmark = $fe_af_pos;
+
+ /* 7. Let node and last node be the furthest block.
+ Follow these steps: */
+ $node = $furthest_block;
+ $last_node = $furthest_block;
+
+ while (true) {
+ for ($n = array_search($node, $this->stack, true) - 1; $n >= 0; $n--) {
+ /* 7.1 Let node be the element immediately
+ prior to node in the stack of open elements. */
+ $node = $this->stack[$n];
+
+ /* 7.2 If node is not in the list of active
+ formatting elements, then remove node from
+ the stack of open elements and then go back
+ to step 1. */
+ if (!in_array($node, $this->a_formatting, true)) {
+ unset($this->stack[$n]);
+ $this->stack = array_merge($this->stack);
+
+ } else {
+ break;
+ }
+ }
+
+ /* 7.3 Otherwise, if node is the formatting
+ element, then go to the next step in the overall
+ algorithm. */
+ if ($node === $formatting_element) {
+ break;
+
+ /* 7.4 Otherwise, if last node is the furthest
+ block, then move the aforementioned bookmark to
+ be immediately after the node in the list of
+ active formatting elements. */
+ } elseif ($last_node === $furthest_block) {
+ $bookmark = array_search($node, $this->a_formatting, true) + 1;
+ }
+
+ /* 7.5 If node has any children, perform a
+ shallow clone of node, replace the entry for
+ node in the list of active formatting elements
+ with an entry for the clone, replace the entry
+ for node in the stack of open elements with an
+ entry for the clone, and let node be the clone. */
+ if ($node->hasChildNodes()) {
+ $clone = $node->cloneNode();
+ $s_pos = array_search($node, $this->stack, true);
+ $a_pos = array_search($node, $this->a_formatting, true);
+
+ $this->stack[$s_pos] = $clone;
+ $this->a_formatting[$a_pos] = $clone;
+ $node = $clone;
+ }
+
+ /* 7.6 Insert last node into node, first removing
+ it from its previous parent node if any. */
+ if ($last_node->parentNode !== null) {
+ $last_node->parentNode->removeChild($last_node);
+ }
+
+ $node->appendChild($last_node);
+
+ /* 7.7 Let last node be node. */
+ $last_node = $node;
+ }
+
+ /* 8. Insert whatever last node ended up being in
+ the previous step into the common ancestor node,
+ first removing it from its previous parent node if
+ any. */
+ if ($last_node->parentNode !== null) {
+ $last_node->parentNode->removeChild($last_node);
+ }
+
+ $common_ancestor->appendChild($last_node);
+
+ /* 9. Perform a shallow clone of the formatting
+ element. */
+ $clone = $formatting_element->cloneNode();
+
+ /* 10. Take all of the child nodes of the furthest
+ block and append them to the clone created in the
+ last step. */
+ while ($furthest_block->hasChildNodes()) {
+ $child = $furthest_block->firstChild;
+ $furthest_block->removeChild($child);
+ $clone->appendChild($child);
+ }
+
+ /* 11. Append that clone to the furthest block. */
+ $furthest_block->appendChild($clone);
+
+ /* 12. Remove the formatting element from the list
+ of active formatting elements, and insert the clone
+ into the list of active formatting elements at the
+ position of the aforementioned bookmark. */
+ $fe_af_pos = array_search($formatting_element, $this->a_formatting, true);
+ unset($this->a_formatting[$fe_af_pos]);
+ $this->a_formatting = array_merge($this->a_formatting);
+
+ $af_part1 = array_slice($this->a_formatting, 0, $bookmark - 1);
+ $af_part2 = array_slice($this->a_formatting, $bookmark, count($this->a_formatting));
+ $this->a_formatting = array_merge($af_part1, array($clone), $af_part2);
+
+ /* 13. Remove the formatting element from the stack
+ of open elements, and insert the clone into the stack
+ of open elements immediately after (i.e. in a more
+ deeply nested position than) the position of the
+ furthest block in that stack. */
+ $fe_s_pos = array_search($formatting_element, $this->stack, true);
+ $fb_s_pos = array_search($furthest_block, $this->stack, true);
+ unset($this->stack[$fe_s_pos]);
+
+ $s_part1 = array_slice($this->stack, 0, $fb_s_pos);
+ $s_part2 = array_slice($this->stack, $fb_s_pos + 1, count($this->stack));
+ $this->stack = array_merge($s_part1, array($clone), $s_part2);
+
+ /* 14. Jump back to step 1 in this series of steps. */
+ unset($formatting_element, $fe_af_pos, $fe_s_pos, $furthest_block);
+ }
+ break;
+
+ /* An end tag token whose tag name is one of: "button",
+ "marquee", "object" */
+ case 'button':
+ case 'marquee':
+ case 'object':
+ /* If the stack of open elements has an element in scope whose
+ tag name matches the tag name of the token, then generate implied
+ tags. */
+ if ($this->elementInScope($token['name'])) {
+ $this->generateImpliedEndTags();
+
+ /* Now, if the current node is not an element with the same
+ tag name as the token, then this is a parse error. */
+ // k
+
+ /* Now, if the stack of open elements has an element in scope
+ whose tag name matches the tag name of the token, then pop
+ elements from the stack until that element has been popped from
+ the stack, and clear the list of active formatting elements up
+ to the last marker. */
+ for ($n = count($this->stack) - 1; $n >= 0; $n--) {
+ if ($this->stack[$n]->nodeName === $token['name']) {
+ $n = -1;
+ }
+
+ array_pop($this->stack);
+ }
+
+ $marker = end(array_keys($this->a_formatting, self::MARKER, true));
+
+ for ($n = count($this->a_formatting) - 1; $n > $marker; $n--) {
+ array_pop($this->a_formatting);
+ }
+ }
+ break;
+
+ /* Or an end tag whose tag name is one of: "area", "basefont",
+ "bgsound", "br", "embed", "hr", "iframe", "image", "img",
+ "input", "isindex", "noembed", "noframes", "param", "select",
+ "spacer", "table", "textarea", "wbr" */
+ case 'area':
+ case 'basefont':
+ case 'bgsound':
+ case 'br':
+ case 'embed':
+ case 'hr':
+ case 'iframe':
+ case 'image':
+ case 'img':
+ case 'input':
+ case 'isindex':
+ case 'noembed':
+ case 'noframes':
+ case 'param':
+ case 'select':
+ case 'spacer':
+ case 'table':
+ case 'textarea':
+ case 'wbr':
+ // Parse error. Ignore the token.
+ break;
+
+ /* An end tag token not covered by the previous entries */
+ default:
+ for ($n = count($this->stack) - 1; $n >= 0; $n--) {
+ /* Initialise node to be the current node (the bottommost
+ node of the stack). */
+ $node = end($this->stack);
+
+ /* If node has the same tag name as the end tag token,
+ then: */
+ if ($token['name'] === $node->nodeName) {
+ /* Generate implied end tags. */
+ $this->generateImpliedEndTags();
+
+ /* If the tag name of the end tag token does not
+ match the tag name of the current node, this is a
+ parse error. */
+ // k
+
+ /* Pop all the nodes from the current node up to
+ node, including node, then stop this algorithm. */
+ for ($x = count($this->stack) - $n; $x >= $n; $x--) {
+ array_pop($this->stack);
+ }
+
+ } else {
+ $category = $this->getElementCategory($node);
+
+ if ($category !== self::SPECIAL && $category !== self::SCOPING) {
+ /* Otherwise, if node is in neither the formatting
+ category nor the phrasing category, then this is a
+ parse error. Stop this algorithm. The end tag token
+ is ignored. */
+ return false;
+ }
+ }
+ }
+ break;
+ }
+ break;
+ }
+ }
+
+ private function inTable($token)
+ {
+ $clear = array('html', 'table');
+
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE */
+ if ($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])
+ ) {
+ /* Append the character to the current node. */
+ $text = $this->dom->createTextNode($token['data']);
+ end($this->stack)->appendChild($text);
+
+ /* A comment token */
+ } elseif ($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the current node with the data
+ attribute set to the data given in the comment token. */
+ $comment = $this->dom->createComment($token['data']);
+ end($this->stack)->appendChild($comment);
+
+ /* A start tag whose tag name is "caption" */
+ } elseif ($token['type'] === HTML5::STARTTAG &&
+ $token['name'] === 'caption'
+ ) {
+ /* Clear the stack back to a table context. */
+ $this->clearStackToTableContext($clear);
+
+ /* Insert a marker at the end of the list of active
+ formatting elements. */
+ $this->a_formatting[] = self::MARKER;
+
+ /* Insert an HTML element for the token, then switch the
+ insertion mode to "in caption". */
+ $this->insertElement($token);
+ $this->mode = self::IN_CAPTION;
+
+ /* A start tag whose tag name is "colgroup" */
+ } elseif ($token['type'] === HTML5::STARTTAG &&
+ $token['name'] === 'colgroup'
+ ) {
+ /* Clear the stack back to a table context. */
+ $this->clearStackToTableContext($clear);
+
+ /* Insert an HTML element for the token, then switch the
+ insertion mode to "in column group". */
+ $this->insertElement($token);
+ $this->mode = self::IN_CGROUP;
+
+ /* A start tag whose tag name is "col" */
+ } elseif ($token['type'] === HTML5::STARTTAG &&
+ $token['name'] === 'col'
+ ) {
+ $this->inTable(
+ array(
+ 'name' => 'colgroup',
+ 'type' => HTML5::STARTTAG,
+ 'attr' => array()
+ )
+ );
+
+ $this->inColumnGroup($token);
+
+ /* A start tag whose tag name is one of: "tbody", "tfoot", "thead" */
+ } elseif ($token['type'] === HTML5::STARTTAG && in_array(
+ $token['name'],
+ array('tbody', 'tfoot', 'thead')
+ )
+ ) {
+ /* Clear the stack back to a table context. */
+ $this->clearStackToTableContext($clear);
+
+ /* Insert an HTML element for the token, then switch the insertion
+ mode to "in table body". */
+ $this->insertElement($token);
+ $this->mode = self::IN_TBODY;
+
+ /* A start tag whose tag name is one of: "td", "th", "tr" */
+ } elseif ($token['type'] === HTML5::STARTTAG &&
+ in_array($token['name'], array('td', 'th', 'tr'))
+ ) {
+ /* Act as if a start tag token with the tag name "tbody" had been
+ seen, then reprocess the current token. */
+ $this->inTable(
+ array(
+ 'name' => 'tbody',
+ 'type' => HTML5::STARTTAG,
+ 'attr' => array()
+ )
+ );
+
+ return $this->inTableBody($token);
+
+ /* A start tag whose tag name is "table" */
+ } elseif ($token['type'] === HTML5::STARTTAG &&
+ $token['name'] === 'table'
+ ) {
+ /* Parse error. Act as if an end tag token with the tag name "table"
+ had been seen, then, if that token wasn't ignored, reprocess the
+ current token. */
+ $this->inTable(
+ array(
+ 'name' => 'table',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+
+ return $this->mainPhase($token);
+
+ /* An end tag whose tag name is "table" */
+ } elseif ($token['type'] === HTML5::ENDTAG &&
+ $token['name'] === 'table'
+ ) {
+ /* If the stack of open elements does not have an element in table
+ scope with the same tag name as the token, this is a parse error.
+ Ignore the token. (innerHTML case) */
+ if (!$this->elementInScope($token['name'], true)) {
+ return false;
+
+ /* Otherwise: */
+ } else {
+ /* Generate implied end tags. */
+ $this->generateImpliedEndTags();
+
+ /* Now, if the current node is not a table element, then this
+ is a parse error. */
+ // w/e
+
+ /* Pop elements from this stack until a table element has been
+ popped from the stack. */
+ while (true) {
+ $current = end($this->stack)->nodeName;
+ array_pop($this->stack);
+
+ if ($current === 'table') {
+ break;
+ }
+ }
+
+ /* Reset the insertion mode appropriately. */
+ $this->resetInsertionMode();
+ }
+
+ /* An end tag whose tag name is one of: "body", "caption", "col",
+ "colgroup", "html", "tbody", "td", "tfoot", "th", "thead", "tr" */
+ } elseif ($token['type'] === HTML5::ENDTAG && in_array(
+ $token['name'],
+ array(
+ 'body',
+ 'caption',
+ 'col',
+ 'colgroup',
+ 'html',
+ 'tbody',
+ 'td',
+ 'tfoot',
+ 'th',
+ 'thead',
+ 'tr'
+ )
+ )
+ ) {
+ // Parse error. Ignore the token.
+
+ /* Anything else */
+ } else {
+ /* Parse error. Process the token as if the insertion mode was "in
+ body", with the following exception: */
+
+ /* If the current node is a table, tbody, tfoot, thead, or tr
+ element, then, whenever a node would be inserted into the current
+ node, it must instead be inserted into the foster parent element. */
+ if (in_array(
+ end($this->stack)->nodeName,
+ array('table', 'tbody', 'tfoot', 'thead', 'tr')
+ )
+ ) {
+ /* The foster parent element is the parent element of the last
+ table element in the stack of open elements, if there is a
+ table element and it has such a parent element. If there is no
+ table element in the stack of open elements (innerHTML case),
+ then the foster parent element is the first element in the
+ stack of open elements (the html element). Otherwise, if there
+ is a table element in the stack of open elements, but the last
+ table element in the stack of open elements has no parent, or
+ its parent node is not an element, then the foster parent
+ element is the element before the last table element in the
+ stack of open elements. */
+ for ($n = count($this->stack) - 1; $n >= 0; $n--) {
+ if ($this->stack[$n]->nodeName === 'table') {
+ $table = $this->stack[$n];
+ break;
+ }
+ }
+
+ if (isset($table) && $table->parentNode !== null) {
+ $this->foster_parent = $table->parentNode;
+
+ } elseif (!isset($table)) {
+ $this->foster_parent = $this->stack[0];
+
+ } elseif (isset($table) && ($table->parentNode === null ||
+ $table->parentNode->nodeType !== XML_ELEMENT_NODE)
+ ) {
+ $this->foster_parent = $this->stack[$n - 1];
+ }
+ }
+
+ $this->inBody($token);
+ }
+ }
+
+ private function inCaption($token)
+ {
+ /* An end tag whose tag name is "caption" */
+ if ($token['type'] === HTML5::ENDTAG && $token['name'] === 'caption') {
+ /* If the stack of open elements does not have an element in table
+ scope with the same tag name as the token, this is a parse error.
+ Ignore the token. (innerHTML case) */
+ if (!$this->elementInScope($token['name'], true)) {
+ // Ignore
+
+ /* Otherwise: */
+ } else {
+ /* Generate implied end tags. */
+ $this->generateImpliedEndTags();
+
+ /* Now, if the current node is not a caption element, then this
+ is a parse error. */
+ // w/e
+
+ /* Pop elements from this stack until a caption element has
+ been popped from the stack. */
+ while (true) {
+ $node = end($this->stack)->nodeName;
+ array_pop($this->stack);
+
+ if ($node === 'caption') {
+ break;
+ }
+ }
+
+ /* Clear the list of active formatting elements up to the last
+ marker. */
+ $this->clearTheActiveFormattingElementsUpToTheLastMarker();
+
+ /* Switch the insertion mode to "in table". */
+ $this->mode = self::IN_TABLE;
+ }
+
+ /* A start tag whose tag name is one of: "caption", "col", "colgroup",
+ "tbody", "td", "tfoot", "th", "thead", "tr", or an end tag whose tag
+ name is "table" */
+ } elseif (($token['type'] === HTML5::STARTTAG && in_array(
+ $token['name'],
+ array(
+ 'caption',
+ 'col',
+ 'colgroup',
+ 'tbody',
+ 'td',
+ 'tfoot',
+ 'th',
+ 'thead',
+ 'tr'
+ )
+ )) || ($token['type'] === HTML5::ENDTAG &&
+ $token['name'] === 'table')
+ ) {
+ /* Parse error. Act as if an end tag with the tag name "caption"
+ had been seen, then, if that token wasn't ignored, reprocess the
+ current token. */
+ $this->inCaption(
+ array(
+ 'name' => 'caption',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+
+ return $this->inTable($token);
+
+ /* An end tag whose tag name is one of: "body", "col", "colgroup",
+ "html", "tbody", "td", "tfoot", "th", "thead", "tr" */
+ } elseif ($token['type'] === HTML5::ENDTAG && in_array(
+ $token['name'],
+ array(
+ 'body',
+ 'col',
+ 'colgroup',
+ 'html',
+ 'tbody',
+ 'tfoot',
+ 'th',
+ 'thead',
+ 'tr'
+ )
+ )
+ ) {
+ // Parse error. Ignore the token.
+
+ /* Anything else */
+ } else {
+ /* Process the token as if the insertion mode was "in body". */
+ $this->inBody($token);
+ }
+ }
+
+ private function inColumnGroup($token)
+ {
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE */
+ if ($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])
+ ) {
+ /* Append the character to the current node. */
+ $text = $this->dom->createTextNode($token['data']);
+ end($this->stack)->appendChild($text);
+
+ /* A comment token */
+ } elseif ($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the current node with the data
+ attribute set to the data given in the comment token. */
+ $comment = $this->dom->createComment($token['data']);
+ end($this->stack)->appendChild($comment);
+
+ /* A start tag whose tag name is "col" */
+ } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'col') {
+ /* Insert a col element for the token. Immediately pop the current
+ node off the stack of open elements. */
+ $this->insertElement($token);
+ array_pop($this->stack);
+
+ /* An end tag whose tag name is "colgroup" */
+ } elseif ($token['type'] === HTML5::ENDTAG &&
+ $token['name'] === 'colgroup'
+ ) {
+ /* If the current node is the root html element, then this is a
+ parse error, ignore the token. (innerHTML case) */
+ if (end($this->stack)->nodeName === 'html') {
+ // Ignore
+
+ /* Otherwise, pop the current node (which will be a colgroup
+ element) from the stack of open elements. Switch the insertion
+ mode to "in table". */
+ } else {
+ array_pop($this->stack);
+ $this->mode = self::IN_TABLE;
+ }
+
+ /* An end tag whose tag name is "col" */
+ } elseif ($token['type'] === HTML5::ENDTAG && $token['name'] === 'col') {
+ /* Parse error. Ignore the token. */
+
+ /* Anything else */
+ } else {
+ /* Act as if an end tag with the tag name "colgroup" had been seen,
+ and then, if that token wasn't ignored, reprocess the current token. */
+ $this->inColumnGroup(
+ array(
+ 'name' => 'colgroup',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+
+ return $this->inTable($token);
+ }
+ }
+
+ private function inTableBody($token)
+ {
+ $clear = array('tbody', 'tfoot', 'thead', 'html');
+
+ /* A start tag whose tag name is "tr" */
+ if ($token['type'] === HTML5::STARTTAG && $token['name'] === 'tr') {
+ /* Clear the stack back to a table body context. */
+ $this->clearStackToTableContext($clear);
+
+ /* Insert a tr element for the token, then switch the insertion
+ mode to "in row". */
+ $this->insertElement($token);
+ $this->mode = self::IN_ROW;
+
+ /* A start tag whose tag name is one of: "th", "td" */
+ } elseif ($token['type'] === HTML5::STARTTAG &&
+ ($token['name'] === 'th' || $token['name'] === 'td')
+ ) {
+ /* Parse error. Act as if a start tag with the tag name "tr" had
+ been seen, then reprocess the current token. */
+ $this->inTableBody(
+ array(
+ 'name' => 'tr',
+ 'type' => HTML5::STARTTAG,
+ 'attr' => array()
+ )
+ );
+
+ return $this->inRow($token);
+
+ /* An end tag whose tag name is one of: "tbody", "tfoot", "thead" */
+ } elseif ($token['type'] === HTML5::ENDTAG &&
+ in_array($token['name'], array('tbody', 'tfoot', 'thead'))
+ ) {
+ /* If the stack of open elements does not have an element in table
+ scope with the same tag name as the token, this is a parse error.
+ Ignore the token. */
+ if (!$this->elementInScope($token['name'], true)) {
+ // Ignore
+
+ /* Otherwise: */
+ } else {
+ /* Clear the stack back to a table body context. */
+ $this->clearStackToTableContext($clear);
+
+ /* Pop the current node from the stack of open elements. Switch
+ the insertion mode to "in table". */
+ array_pop($this->stack);
+ $this->mode = self::IN_TABLE;
+ }
+
+ /* A start tag whose tag name is one of: "caption", "col", "colgroup",
+ "tbody", "tfoot", "thead", or an end tag whose tag name is "table" */
+ } elseif (($token['type'] === HTML5::STARTTAG && in_array(
+ $token['name'],
+ array('caption', 'col', 'colgroup', 'tbody', 'tfoor', 'thead')
+ )) ||
+ ($token['type'] === HTML5::STARTTAG && $token['name'] === 'table')
+ ) {
+ /* If the stack of open elements does not have a tbody, thead, or
+ tfoot element in table scope, this is a parse error. Ignore the
+ token. (innerHTML case) */
+ if (!$this->elementInScope(array('tbody', 'thead', 'tfoot'), true)) {
+ // Ignore.
+
+ /* Otherwise: */
+ } else {
+ /* Clear the stack back to a table body context. */
+ $this->clearStackToTableContext($clear);
+
+ /* Act as if an end tag with the same tag name as the current
+ node ("tbody", "tfoot", or "thead") had been seen, then
+ reprocess the current token. */
+ $this->inTableBody(
+ array(
+ 'name' => end($this->stack)->nodeName,
+ 'type' => HTML5::ENDTAG
+ )
+ );
+
+ return $this->mainPhase($token);
+ }
+
+ /* An end tag whose tag name is one of: "body", "caption", "col",
+ "colgroup", "html", "td", "th", "tr" */
+ } elseif ($token['type'] === HTML5::ENDTAG && in_array(
+ $token['name'],
+ array('body', 'caption', 'col', 'colgroup', 'html', 'td', 'th', 'tr')
+ )
+ ) {
+ /* Parse error. Ignore the token. */
+
+ /* Anything else */
+ } else {
+ /* Process the token as if the insertion mode was "in table". */
+ $this->inTable($token);
+ }
+ }
+
+ private function inRow($token)
+ {
+ $clear = array('tr', 'html');
+
+ /* A start tag whose tag name is one of: "th", "td" */
+ if ($token['type'] === HTML5::STARTTAG &&
+ ($token['name'] === 'th' || $token['name'] === 'td')
+ ) {
+ /* Clear the stack back to a table row context. */
+ $this->clearStackToTableContext($clear);
+
+ /* Insert an HTML element for the token, then switch the insertion
+ mode to "in cell". */
+ $this->insertElement($token);
+ $this->mode = self::IN_CELL;
+
+ /* Insert a marker at the end of the list of active formatting
+ elements. */
+ $this->a_formatting[] = self::MARKER;
+
+ /* An end tag whose tag name is "tr" */
+ } elseif ($token['type'] === HTML5::ENDTAG && $token['name'] === 'tr') {
+ /* If the stack of open elements does not have an element in table
+ scope with the same tag name as the token, this is a parse error.
+ Ignore the token. (innerHTML case) */
+ if (!$this->elementInScope($token['name'], true)) {
+ // Ignore.
+
+ /* Otherwise: */
+ } else {
+ /* Clear the stack back to a table row context. */
+ $this->clearStackToTableContext($clear);
+
+ /* Pop the current node (which will be a tr element) from the
+ stack of open elements. Switch the insertion mode to "in table
+ body". */
+ array_pop($this->stack);
+ $this->mode = self::IN_TBODY;
+ }
+
+ /* A start tag whose tag name is one of: "caption", "col", "colgroup",
+ "tbody", "tfoot", "thead", "tr" or an end tag whose tag name is "table" */
+ } elseif ($token['type'] === HTML5::STARTTAG && in_array(
+ $token['name'],
+ array('caption', 'col', 'colgroup', 'tbody', 'tfoot', 'thead', 'tr')
+ )
+ ) {
+ /* Act as if an end tag with the tag name "tr" had been seen, then,
+ if that token wasn't ignored, reprocess the current token. */
+ $this->inRow(
+ array(
+ 'name' => 'tr',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+
+ return $this->inCell($token);
+
+ /* An end tag whose tag name is one of: "tbody", "tfoot", "thead" */
+ } elseif ($token['type'] === HTML5::ENDTAG &&
+ in_array($token['name'], array('tbody', 'tfoot', 'thead'))
+ ) {
+ /* If the stack of open elements does not have an element in table
+ scope with the same tag name as the token, this is a parse error.
+ Ignore the token. */
+ if (!$this->elementInScope($token['name'], true)) {
+ // Ignore.
+
+ /* Otherwise: */
+ } else {
+ /* Otherwise, act as if an end tag with the tag name "tr" had
+ been seen, then reprocess the current token. */
+ $this->inRow(
+ array(
+ 'name' => 'tr',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+
+ return $this->inCell($token);
+ }
+
+ /* An end tag whose tag name is one of: "body", "caption", "col",
+ "colgroup", "html", "td", "th" */
+ } elseif ($token['type'] === HTML5::ENDTAG && in_array(
+ $token['name'],
+ array('body', 'caption', 'col', 'colgroup', 'html', 'td', 'th', 'tr')
+ )
+ ) {
+ /* Parse error. Ignore the token. */
+
+ /* Anything else */
+ } else {
+ /* Process the token as if the insertion mode was "in table". */
+ $this->inTable($token);
+ }
+ }
+
+ private function inCell($token)
+ {
+ /* An end tag whose tag name is one of: "td", "th" */
+ if ($token['type'] === HTML5::ENDTAG &&
+ ($token['name'] === 'td' || $token['name'] === 'th')
+ ) {
+ /* If the stack of open elements does not have an element in table
+ scope with the same tag name as that of the token, then this is a
+ parse error and the token must be ignored. */
+ if (!$this->elementInScope($token['name'], true)) {
+ // Ignore.
+
+ /* Otherwise: */
+ } else {
+ /* Generate implied end tags, except for elements with the same
+ tag name as the token. */
+ $this->generateImpliedEndTags(array($token['name']));
+
+ /* Now, if the current node is not an element with the same tag
+ name as the token, then this is a parse error. */
+ // k
+
+ /* Pop elements from this stack until an element with the same
+ tag name as the token has been popped from the stack. */
+ while (true) {
+ $node = end($this->stack)->nodeName;
+ array_pop($this->stack);
+
+ if ($node === $token['name']) {
+ break;
+ }
+ }
+
+ /* Clear the list of active formatting elements up to the last
+ marker. */
+ $this->clearTheActiveFormattingElementsUpToTheLastMarker();
+
+ /* Switch the insertion mode to "in row". (The current node
+ will be a tr element at this point.) */
+ $this->mode = self::IN_ROW;
+ }
+
+ /* A start tag whose tag name is one of: "caption", "col", "colgroup",
+ "tbody", "td", "tfoot", "th", "thead", "tr" */
+ } elseif ($token['type'] === HTML5::STARTTAG && in_array(
+ $token['name'],
+ array(
+ 'caption',
+ 'col',
+ 'colgroup',
+ 'tbody',
+ 'td',
+ 'tfoot',
+ 'th',
+ 'thead',
+ 'tr'
+ )
+ )
+ ) {
+ /* If the stack of open elements does not have a td or th element
+ in table scope, then this is a parse error; ignore the token.
+ (innerHTML case) */
+ if (!$this->elementInScope(array('td', 'th'), true)) {
+ // Ignore.
+
+ /* Otherwise, close the cell (see below) and reprocess the current
+ token. */
+ } else {
+ $this->closeCell();
+ return $this->inRow($token);
+ }
+
+ /* A start tag whose tag name is one of: "caption", "col", "colgroup",
+ "tbody", "td", "tfoot", "th", "thead", "tr" */
+ } elseif ($token['type'] === HTML5::STARTTAG && in_array(
+ $token['name'],
+ array(
+ 'caption',
+ 'col',
+ 'colgroup',
+ 'tbody',
+ 'td',
+ 'tfoot',
+ 'th',
+ 'thead',
+ 'tr'
+ )
+ )
+ ) {
+ /* If the stack of open elements does not have a td or th element
+ in table scope, then this is a parse error; ignore the token.
+ (innerHTML case) */
+ if (!$this->elementInScope(array('td', 'th'), true)) {
+ // Ignore.
+
+ /* Otherwise, close the cell (see below) and reprocess the current
+ token. */
+ } else {
+ $this->closeCell();
+ return $this->inRow($token);
+ }
+
+ /* An end tag whose tag name is one of: "body", "caption", "col",
+ "colgroup", "html" */
+ } elseif ($token['type'] === HTML5::ENDTAG && in_array(
+ $token['name'],
+ array('body', 'caption', 'col', 'colgroup', 'html')
+ )
+ ) {
+ /* Parse error. Ignore the token. */
+
+ /* An end tag whose tag name is one of: "table", "tbody", "tfoot",
+ "thead", "tr" */
+ } elseif ($token['type'] === HTML5::ENDTAG && in_array(
+ $token['name'],
+ array('table', 'tbody', 'tfoot', 'thead', 'tr')
+ )
+ ) {
+ /* If the stack of open elements does not have an element in table
+ scope with the same tag name as that of the token (which can only
+ happen for "tbody", "tfoot" and "thead", or, in the innerHTML case),
+ then this is a parse error and the token must be ignored. */
+ if (!$this->elementInScope($token['name'], true)) {
+ // Ignore.
+
+ /* Otherwise, close the cell (see below) and reprocess the current
+ token. */
+ } else {
+ $this->closeCell();
+ return $this->inRow($token);
+ }
+
+ /* Anything else */
+ } else {
+ /* Process the token as if the insertion mode was "in body". */
+ $this->inBody($token);
+ }
+ }
+
+ private function inSelect($token)
+ {
+ /* Handle the token as follows: */
+
+ /* A character token */
+ if ($token['type'] === HTML5::CHARACTR) {
+ /* Append the token's character to the current node. */
+ $this->insertText($token['data']);
+
+ /* A comment token */
+ } elseif ($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the current node with the data
+ attribute set to the data given in the comment token. */
+ $this->insertComment($token['data']);
+
+ /* A start tag token whose tag name is "option" */
+ } elseif ($token['type'] === HTML5::STARTTAG &&
+ $token['name'] === 'option'
+ ) {
+ /* If the current node is an option element, act as if an end tag
+ with the tag name "option" had been seen. */
+ if (end($this->stack)->nodeName === 'option') {
+ $this->inSelect(
+ array(
+ 'name' => 'option',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+ }
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ /* A start tag token whose tag name is "optgroup" */
+ } elseif ($token['type'] === HTML5::STARTTAG &&
+ $token['name'] === 'optgroup'
+ ) {
+ /* If the current node is an option element, act as if an end tag
+ with the tag name "option" had been seen. */
+ if (end($this->stack)->nodeName === 'option') {
+ $this->inSelect(
+ array(
+ 'name' => 'option',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+ }
+
+ /* If the current node is an optgroup element, act as if an end tag
+ with the tag name "optgroup" had been seen. */
+ if (end($this->stack)->nodeName === 'optgroup') {
+ $this->inSelect(
+ array(
+ 'name' => 'optgroup',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+ }
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ /* An end tag token whose tag name is "optgroup" */
+ } elseif ($token['type'] === HTML5::ENDTAG &&
+ $token['name'] === 'optgroup'
+ ) {
+ /* First, if the current node is an option element, and the node
+ immediately before it in the stack of open elements is an optgroup
+ element, then act as if an end tag with the tag name "option" had
+ been seen. */
+ $elements_in_stack = count($this->stack);
+
+ if ($this->stack[$elements_in_stack - 1]->nodeName === 'option' &&
+ $this->stack[$elements_in_stack - 2]->nodeName === 'optgroup'
+ ) {
+ $this->inSelect(
+ array(
+ 'name' => 'option',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+ }
+
+ /* If the current node is an optgroup element, then pop that node
+ from the stack of open elements. Otherwise, this is a parse error,
+ ignore the token. */
+ if ($this->stack[$elements_in_stack - 1] === 'optgroup') {
+ array_pop($this->stack);
+ }
+
+ /* An end tag token whose tag name is "option" */
+ } elseif ($token['type'] === HTML5::ENDTAG &&
+ $token['name'] === 'option'
+ ) {
+ /* If the current node is an option element, then pop that node
+ from the stack of open elements. Otherwise, this is a parse error,
+ ignore the token. */
+ if (end($this->stack)->nodeName === 'option') {
+ array_pop($this->stack);
+ }
+
+ /* An end tag whose tag name is "select" */
+ } elseif ($token['type'] === HTML5::ENDTAG &&
+ $token['name'] === 'select'
+ ) {
+ /* If the stack of open elements does not have an element in table
+ scope with the same tag name as the token, this is a parse error.
+ Ignore the token. (innerHTML case) */
+ if (!$this->elementInScope($token['name'], true)) {
+ // w/e
+
+ /* Otherwise: */
+ } else {
+ /* Pop elements from the stack of open elements until a select
+ element has been popped from the stack. */
+ while (true) {
+ $current = end($this->stack)->nodeName;
+ array_pop($this->stack);
+
+ if ($current === 'select') {
+ break;
+ }
+ }
+
+ /* Reset the insertion mode appropriately. */
+ $this->resetInsertionMode();
+ }
+
+ /* A start tag whose tag name is "select" */
+ } elseif ($token['name'] === 'select' &&
+ $token['type'] === HTML5::STARTTAG
+ ) {
+ /* Parse error. Act as if the token had been an end tag with the
+ tag name "select" instead. */
+ $this->inSelect(
+ array(
+ 'name' => 'select',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+
+ /* An end tag whose tag name is one of: "caption", "table", "tbody",
+ "tfoot", "thead", "tr", "td", "th" */
+ } elseif (in_array(
+ $token['name'],
+ array(
+ 'caption',
+ 'table',
+ 'tbody',
+ 'tfoot',
+ 'thead',
+ 'tr',
+ 'td',
+ 'th'
+ )
+ ) && $token['type'] === HTML5::ENDTAG
+ ) {
+ /* Parse error. */
+ // w/e
+
+ /* If the stack of open elements has an element in table scope with
+ the same tag name as that of the token, then act as if an end tag
+ with the tag name "select" had been seen, and reprocess the token.
+ Otherwise, ignore the token. */
+ if ($this->elementInScope($token['name'], true)) {
+ $this->inSelect(
+ array(
+ 'name' => 'select',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+
+ $this->mainPhase($token);
+ }
+
+ /* Anything else */
+ } else {
+ /* Parse error. Ignore the token. */
+ }
+ }
+
+ private function afterBody($token)
+ {
+ /* Handle the token as follows: */
+
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE */
+ if ($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])
+ ) {
+ /* Process the token as it would be processed if the insertion mode
+ was "in body". */
+ $this->inBody($token);
+
+ /* A comment token */
+ } elseif ($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the first element in the stack of open
+ elements (the html element), with the data attribute set to the
+ data given in the comment token. */
+ $comment = $this->dom->createComment($token['data']);
+ $this->stack[0]->appendChild($comment);
+
+ /* An end tag with the tag name "html" */
+ } elseif ($token['type'] === HTML5::ENDTAG && $token['name'] === 'html') {
+ /* If the parser was originally created in order to handle the
+ setting of an element's innerHTML attribute, this is a parse error;
+ ignore the token. (The element will be an html element in this
+ case.) (innerHTML case) */
+
+ /* Otherwise, switch to the trailing end phase. */
+ $this->phase = self::END_PHASE;
+
+ /* Anything else */
+ } else {
+ /* Parse error. Set the insertion mode to "in body" and reprocess
+ the token. */
+ $this->mode = self::IN_BODY;
+ return $this->inBody($token);
+ }
+ }
+
+ private function inFrameset($token)
+ {
+ /* Handle the token as follows: */
+
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ U+000D CARRIAGE RETURN (CR), or U+0020 SPACE */
+ if ($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])
+ ) {
+ /* Append the character to the current node. */
+ $this->insertText($token['data']);
+
+ /* A comment token */
+ } elseif ($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the current node with the data
+ attribute set to the data given in the comment token. */
+ $this->insertComment($token['data']);
+
+ /* A start tag with the tag name "frameset" */
+ } elseif ($token['name'] === 'frameset' &&
+ $token['type'] === HTML5::STARTTAG
+ ) {
+ $this->insertElement($token);
+
+ /* An end tag with the tag name "frameset" */
+ } elseif ($token['name'] === 'frameset' &&
+ $token['type'] === HTML5::ENDTAG
+ ) {
+ /* If the current node is the root html element, then this is a
+ parse error; ignore the token. (innerHTML case) */
+ if (end($this->stack)->nodeName === 'html') {
+ // Ignore
+
+ } else {
+ /* Otherwise, pop the current node from the stack of open
+ elements. */
+ array_pop($this->stack);
+
+ /* If the parser was not originally created in order to handle
+ the setting of an element's innerHTML attribute (innerHTML case),
+ and the current node is no longer a frameset element, then change
+ the insertion mode to "after frameset". */
+ $this->mode = self::AFTR_FRAME;
+ }
+
+ /* A start tag with the tag name "frame" */
+ } elseif ($token['name'] === 'frame' &&
+ $token['type'] === HTML5::STARTTAG
+ ) {
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ /* Immediately pop the current node off the stack of open elements. */
+ array_pop($this->stack);
+
+ /* A start tag with the tag name "noframes" */
+ } elseif ($token['name'] === 'noframes' &&
+ $token['type'] === HTML5::STARTTAG
+ ) {
+ /* Process the token as if the insertion mode had been "in body". */
+ $this->inBody($token);
+
+ /* Anything else */
+ } else {
+ /* Parse error. Ignore the token. */
+ }
+ }
+
+ private function afterFrameset($token)
+ {
+ /* Handle the token as follows: */
+
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ U+000D CARRIAGE RETURN (CR), or U+0020 SPACE */
+ if ($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])
+ ) {
+ /* Append the character to the current node. */
+ $this->insertText($token['data']);
+
+ /* A comment token */
+ } elseif ($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the current node with the data
+ attribute set to the data given in the comment token. */
+ $this->insertComment($token['data']);
+
+ /* An end tag with the tag name "html" */
+ } elseif ($token['name'] === 'html' &&
+ $token['type'] === HTML5::ENDTAG
+ ) {
+ /* Switch to the trailing end phase. */
+ $this->phase = self::END_PHASE;
+
+ /* A start tag with the tag name "noframes" */
+ } elseif ($token['name'] === 'noframes' &&
+ $token['type'] === HTML5::STARTTAG
+ ) {
+ /* Process the token as if the insertion mode had been "in body". */
+ $this->inBody($token);
+
+ /* Anything else */
+ } else {
+ /* Parse error. Ignore the token. */
+ }
+ }
+
+ private function trailingEndPhase($token)
+ {
+ /* After the main phase, as each token is emitted from the tokenisation
+ stage, it must be processed as described in this section. */
+
+ /* A DOCTYPE token */
+ if ($token['type'] === HTML5::DOCTYPE) {
+ // Parse error. Ignore the token.
+
+ /* A comment token */
+ } elseif ($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the Document object with the data
+ attribute set to the data given in the comment token. */
+ $comment = $this->dom->createComment($token['data']);
+ $this->dom->appendChild($comment);
+
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE */
+ } elseif ($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])
+ ) {
+ /* Process the token as it would be processed in the main phase. */
+ $this->mainPhase($token);
+
+ /* A character token that is not one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE. Or a start tag token. Or an end tag token. */
+ } elseif (($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) ||
+ $token['type'] === HTML5::STARTTAG || $token['type'] === HTML5::ENDTAG
+ ) {
+ /* Parse error. Switch back to the main phase and reprocess the
+ token. */
+ $this->phase = self::MAIN_PHASE;
+ return $this->mainPhase($token);
+
+ /* An end-of-file token */
+ } elseif ($token['type'] === HTML5::EOF) {
+ /* OMG DONE!! */
+ }
+ }
+
+ private function insertElement($token, $append = true, $check = false)
+ {
+ // Proprietary workaround for libxml2's limitations with tag names
+ if ($check) {
+ // Slightly modified HTML5 tag-name modification,
+ // removing anything that's not an ASCII letter, digit, or hyphen
+ $token['name'] = preg_replace('/[^a-z0-9-]/i', '', $token['name']);
+ // Remove leading hyphens and numbers
+ $token['name'] = ltrim($token['name'], '-0..9');
+ // In theory, this should ever be needed, but just in case
+ if ($token['name'] === '') {
+ $token['name'] = 'span';
+ } // arbitrary generic choice
+ }
+
+ $el = $this->dom->createElement($token['name']);
+
+ foreach ($token['attr'] as $attr) {
+ if (!$el->hasAttribute($attr['name'])) {
+ $el->setAttribute($attr['name'], $attr['value']);
+ }
+ }
+
+ $this->appendToRealParent($el);
+ $this->stack[] = $el;
+
+ return $el;
+ }
+
+ private function insertText($data)
+ {
+ $text = $this->dom->createTextNode($data);
+ $this->appendToRealParent($text);
+ }
+
+ private function insertComment($data)
+ {
+ $comment = $this->dom->createComment($data);
+ $this->appendToRealParent($comment);
+ }
+
+ private function appendToRealParent($node)
+ {
+ if ($this->foster_parent === null) {
+ end($this->stack)->appendChild($node);
+
+ } elseif ($this->foster_parent !== null) {
+ /* If the foster parent element is the parent element of the
+ last table element in the stack of open elements, then the new
+ node must be inserted immediately before the last table element
+ in the stack of open elements in the foster parent element;
+ otherwise, the new node must be appended to the foster parent
+ element. */
+ for ($n = count($this->stack) - 1; $n >= 0; $n--) {
+ if ($this->stack[$n]->nodeName === 'table' &&
+ $this->stack[$n]->parentNode !== null
+ ) {
+ $table = $this->stack[$n];
+ break;
+ }
+ }
+
+ if (isset($table) && $this->foster_parent->isSameNode($table->parentNode)) {
+ $this->foster_parent->insertBefore($node, $table);
+ } else {
+ $this->foster_parent->appendChild($node);
+ }
+
+ $this->foster_parent = null;
+ }
+ }
+
+ private function elementInScope($el, $table = false)
+ {
+ if (is_array($el)) {
+ foreach ($el as $element) {
+ if ($this->elementInScope($element, $table)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ $leng = count($this->stack);
+
+ for ($n = 0; $n < $leng; $n++) {
+ /* 1. Initialise node to be the current node (the bottommost node of
+ the stack). */
+ $node = $this->stack[$leng - 1 - $n];
+
+ if ($node->tagName === $el) {
+ /* 2. If node is the target node, terminate in a match state. */
+ return true;
+
+ } elseif ($node->tagName === 'table') {
+ /* 3. Otherwise, if node is a table element, terminate in a failure
+ state. */
+ return false;
+
+ } elseif ($table === true && in_array(
+ $node->tagName,
+ array(
+ 'caption',
+ 'td',
+ 'th',
+ 'button',
+ 'marquee',
+ 'object'
+ )
+ )
+ ) {
+ /* 4. Otherwise, if the algorithm is the "has an element in scope"
+ variant (rather than the "has an element in table scope" variant),
+ and node is one of the following, terminate in a failure state. */
+ return false;
+
+ } elseif ($node === $node->ownerDocument->documentElement) {
+ /* 5. Otherwise, if node is an html element (root element), terminate
+ in a failure state. (This can only happen if the node is the topmost
+ node of the stack of open elements, and prevents the next step from
+ being invoked if there are no more elements in the stack.) */
+ return false;
+ }
+
+ /* Otherwise, set node to the previous entry in the stack of open
+ elements and return to step 2. (This will never fail, since the loop
+ will always terminate in the previous step if the top of the stack
+ is reached.) */
+ }
+ }
+
+ private function reconstructActiveFormattingElements()
+ {
+ /* 1. If there are no entries in the list of active formatting elements,
+ then there is nothing to reconstruct; stop this algorithm. */
+ $formatting_elements = count($this->a_formatting);
+
+ if ($formatting_elements === 0) {
+ return false;
+ }
+
+ /* 3. Let entry be the last (most recently added) element in the list
+ of active formatting elements. */
+ $entry = end($this->a_formatting);
+
+ /* 2. If the last (most recently added) entry in the list of active
+ formatting elements is a marker, or if it is an element that is in the
+ stack of open elements, then there is nothing to reconstruct; stop this
+ algorithm. */
+ if ($entry === self::MARKER || in_array($entry, $this->stack, true)) {
+ return false;
+ }
+
+ for ($a = $formatting_elements - 1; $a >= 0; true) {
+ /* 4. If there are no entries before entry in the list of active
+ formatting elements, then jump to step 8. */
+ if ($a === 0) {
+ $step_seven = false;
+ break;
+ }
+
+ /* 5. Let entry be the entry one earlier than entry in the list of
+ active formatting elements. */
+ $a--;
+ $entry = $this->a_formatting[$a];
+
+ /* 6. If entry is neither a marker nor an element that is also in
+ thetack of open elements, go to step 4. */
+ if ($entry === self::MARKER || in_array($entry, $this->stack, true)) {
+ break;
+ }
+ }
+
+ while (true) {
+ /* 7. Let entry be the element one later than entry in the list of
+ active formatting elements. */
+ if (isset($step_seven) && $step_seven === true) {
+ $a++;
+ $entry = $this->a_formatting[$a];
+ }
+
+ /* 8. Perform a shallow clone of the element entry to obtain clone. */
+ $clone = $entry->cloneNode();
+
+ /* 9. Append clone to the current node and push it onto the stack
+ of open elements so that it is the new current node. */
+ end($this->stack)->appendChild($clone);
+ $this->stack[] = $clone;
+
+ /* 10. Replace the entry for entry in the list with an entry for
+ clone. */
+ $this->a_formatting[$a] = $clone;
+
+ /* 11. If the entry for clone in the list of active formatting
+ elements is not the last entry in the list, return to step 7. */
+ if (end($this->a_formatting) !== $clone) {
+ $step_seven = true;
+ } else {
+ break;
+ }
+ }
+ }
+
+ private function clearTheActiveFormattingElementsUpToTheLastMarker()
+ {
+ /* When the steps below require the UA to clear the list of active
+ formatting elements up to the last marker, the UA must perform the
+ following steps: */
+
+ while (true) {
+ /* 1. Let entry be the last (most recently added) entry in the list
+ of active formatting elements. */
+ $entry = end($this->a_formatting);
+
+ /* 2. Remove entry from the list of active formatting elements. */
+ array_pop($this->a_formatting);
+
+ /* 3. If entry was a marker, then stop the algorithm at this point.
+ The list has been cleared up to the last marker. */
+ if ($entry === self::MARKER) {
+ break;
+ }
+ }
+ }
+
+ private function generateImpliedEndTags($exclude = array())
+ {
+ /* When the steps below require the UA to generate implied end tags,
+ then, if the current node is a dd element, a dt element, an li element,
+ a p element, a td element, a th element, or a tr element, the UA must
+ act as if an end tag with the respective tag name had been seen and
+ then generate implied end tags again. */
+ $node = end($this->stack);
+ $elements = array_diff(array('dd', 'dt', 'li', 'p', 'td', 'th', 'tr'), $exclude);
+
+ while (in_array(end($this->stack)->nodeName, $elements)) {
+ array_pop($this->stack);
+ }
+ }
+
+ private function getElementCategory($node)
+ {
+ $name = $node->tagName;
+ if (in_array($name, $this->special)) {
+ return self::SPECIAL;
+ } elseif (in_array($name, $this->scoping)) {
+ return self::SCOPING;
+ } elseif (in_array($name, $this->formatting)) {
+ return self::FORMATTING;
+ } else {
+ return self::PHRASING;
+ }
+ }
+
+ private function clearStackToTableContext($elements)
+ {
+ /* When the steps above require the UA to clear the stack back to a
+ table context, it means that the UA must, while the current node is not
+ a table element or an html element, pop elements from the stack of open
+ elements. If this causes any elements to be popped from the stack, then
+ this is a parse error. */
+ while (true) {
+ $node = end($this->stack)->nodeName;
+
+ if (in_array($node, $elements)) {
+ break;
+ } else {
+ array_pop($this->stack);
+ }
+ }
+ }
+
+ private function resetInsertionMode()
+ {
+ /* 1. Let last be false. */
+ $last = false;
+ $leng = count($this->stack);
+
+ for ($n = $leng - 1; $n >= 0; $n--) {
+ /* 2. Let node be the last node in the stack of open elements. */
+ $node = $this->stack[$n];
+
+ /* 3. If node is the first node in the stack of open elements, then
+ set last to true. If the element whose innerHTML attribute is being
+ set is neither a td element nor a th element, then set node to the
+ element whose innerHTML attribute is being set. (innerHTML case) */
+ if ($this->stack[0]->isSameNode($node)) {
+ $last = true;
+ }
+
+ /* 4. If node is a select element, then switch the insertion mode to
+ "in select" and abort these steps. (innerHTML case) */
+ if ($node->nodeName === 'select') {
+ $this->mode = self::IN_SELECT;
+ break;
+
+ /* 5. If node is a td or th element, then switch the insertion mode
+ to "in cell" and abort these steps. */
+ } elseif ($node->nodeName === 'td' || $node->nodeName === 'th') {
+ $this->mode = self::IN_CELL;
+ break;
+
+ /* 6. If node is a tr element, then switch the insertion mode to
+ "in row" and abort these steps. */
+ } elseif ($node->nodeName === 'tr') {
+ $this->mode = self::IN_ROW;
+ break;
+
+ /* 7. If node is a tbody, thead, or tfoot element, then switch the
+ insertion mode to "in table body" and abort these steps. */
+ } elseif (in_array($node->nodeName, array('tbody', 'thead', 'tfoot'))) {
+ $this->mode = self::IN_TBODY;
+ break;
+
+ /* 8. If node is a caption element, then switch the insertion mode
+ to "in caption" and abort these steps. */
+ } elseif ($node->nodeName === 'caption') {
+ $this->mode = self::IN_CAPTION;
+ break;
+
+ /* 9. If node is a colgroup element, then switch the insertion mode
+ to "in column group" and abort these steps. (innerHTML case) */
+ } elseif ($node->nodeName === 'colgroup') {
+ $this->mode = self::IN_CGROUP;
+ break;
+
+ /* 10. If node is a table element, then switch the insertion mode
+ to "in table" and abort these steps. */
+ } elseif ($node->nodeName === 'table') {
+ $this->mode = self::IN_TABLE;
+ break;
+
+ /* 11. If node is a head element, then switch the insertion mode
+ to "in body" ("in body"! not "in head"!) and abort these steps.
+ (innerHTML case) */
+ } elseif ($node->nodeName === 'head') {
+ $this->mode = self::IN_BODY;
+ break;
+
+ /* 12. If node is a body element, then switch the insertion mode to
+ "in body" and abort these steps. */
+ } elseif ($node->nodeName === 'body') {
+ $this->mode = self::IN_BODY;
+ break;
+
+ /* 13. If node is a frameset element, then switch the insertion
+ mode to "in frameset" and abort these steps. (innerHTML case) */
+ } elseif ($node->nodeName === 'frameset') {
+ $this->mode = self::IN_FRAME;
+ break;
+
+ /* 14. If node is an html element, then: if the head element
+ pointer is null, switch the insertion mode to "before head",
+ otherwise, switch the insertion mode to "after head". In either
+ case, abort these steps. (innerHTML case) */
+ } elseif ($node->nodeName === 'html') {
+ $this->mode = ($this->head_pointer === null)
+ ? self::BEFOR_HEAD
+ : self::AFTER_HEAD;
+
+ break;
+
+ /* 15. If last is true, then set the insertion mode to "in body"
+ and abort these steps. (innerHTML case) */
+ } elseif ($last) {
+ $this->mode = self::IN_BODY;
+ break;
+ }
+ }
+ }
+
+ private function closeCell()
+ {
+ /* If the stack of open elements has a td or th element in table scope,
+ then act as if an end tag token with that tag name had been seen. */
+ foreach (array('td', 'th') as $cell) {
+ if ($this->elementInScope($cell, true)) {
+ $this->inCell(
+ array(
+ 'name' => $cell,
+ 'type' => HTML5::ENDTAG
+ )
+ );
+
+ break;
+ }
+ }
+ }
+
+ public function save()
+ {
+ return $this->dom;
+ }
+}
diff --git a/library/HTMLPurifier/Node.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Node.php
index 3995fec9f..3995fec9f 100644
--- a/library/HTMLPurifier/Node.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Node.php
diff --git a/library/HTMLPurifier/Node/Comment.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Node/Comment.php
index 38ba19394..38ba19394 100644
--- a/library/HTMLPurifier/Node/Comment.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Node/Comment.php
diff --git a/library/HTMLPurifier/Node/Element.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Node/Element.php
index 6cbf56dad..6cbf56dad 100644
--- a/library/HTMLPurifier/Node/Element.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Node/Element.php
diff --git a/library/HTMLPurifier/Node/Text.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Node/Text.php
index aec916647..aec916647 100644
--- a/library/HTMLPurifier/Node/Text.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Node/Text.php
diff --git a/library/HTMLPurifier/PercentEncoder.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/PercentEncoder.php
index 18c8bbb00..18c8bbb00 100644
--- a/library/HTMLPurifier/PercentEncoder.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/PercentEncoder.php
diff --git a/library/HTMLPurifier/Printer.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer.php
index 549e4cea1..549e4cea1 100644
--- a/library/HTMLPurifier/Printer.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer.php
diff --git a/library/HTMLPurifier/Printer/CSSDefinition.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/CSSDefinition.php
index 29505fe12..29505fe12 100644
--- a/library/HTMLPurifier/Printer/CSSDefinition.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/CSSDefinition.php
diff --git a/library/HTMLPurifier/Printer/ConfigForm.css b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.css
index 3ff1a88aa..3ff1a88aa 100644
--- a/library/HTMLPurifier/Printer/ConfigForm.css
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.css
diff --git a/library/HTMLPurifier/Printer/ConfigForm.js b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.js
index cba00c9b8..cba00c9b8 100644
--- a/library/HTMLPurifier/Printer/ConfigForm.js
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.js
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.php
new file mode 100644
index 000000000..65a777904
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.php
@@ -0,0 +1,451 @@
+<?php
+
+/**
+ * @todo Rewrite to use Interchange objects
+ */
+class HTMLPurifier_Printer_ConfigForm extends HTMLPurifier_Printer
+{
+
+ /**
+ * Printers for specific fields.
+ * @type HTMLPurifier_Printer[]
+ */
+ protected $fields = array();
+
+ /**
+ * Documentation URL, can have fragment tagged on end.
+ * @type string
+ */
+ protected $docURL;
+
+ /**
+ * Name of form element to stuff config in.
+ * @type string
+ */
+ protected $name;
+
+ /**
+ * Whether or not to compress directive names, clipping them off
+ * after a certain amount of letters. False to disable or integer letters
+ * before clipping.
+ * @type bool
+ */
+ protected $compress = false;
+
+ /**
+ * @param string $name Form element name for directives to be stuffed into
+ * @param string $doc_url String documentation URL, will have fragment tagged on
+ * @param bool $compress Integer max length before compressing a directive name, set to false to turn off
+ */
+ public function __construct(
+ $name,
+ $doc_url = null,
+ $compress = false
+ ) {
+ parent::__construct();
+ $this->docURL = $doc_url;
+ $this->name = $name;
+ $this->compress = $compress;
+ // initialize sub-printers
+ $this->fields[0] = new HTMLPurifier_Printer_ConfigForm_default();
+ $this->fields[HTMLPurifier_VarParser::BOOL] = new HTMLPurifier_Printer_ConfigForm_bool();
+ }
+
+ /**
+ * Sets default column and row size for textareas in sub-printers
+ * @param $cols Integer columns of textarea, null to use default
+ * @param $rows Integer rows of textarea, null to use default
+ */
+ public function setTextareaDimensions($cols = null, $rows = null)
+ {
+ if ($cols) {
+ $this->fields['default']->cols = $cols;
+ }
+ if ($rows) {
+ $this->fields['default']->rows = $rows;
+ }
+ }
+
+ /**
+ * Retrieves styling, in case it is not accessible by webserver
+ */
+ public static function getCSS()
+ {
+ return file_get_contents(HTMLPURIFIER_PREFIX . '/HTMLPurifier/Printer/ConfigForm.css');
+ }
+
+ /**
+ * Retrieves JavaScript, in case it is not accessible by webserver
+ */
+ public static function getJavaScript()
+ {
+ return file_get_contents(HTMLPURIFIER_PREFIX . '/HTMLPurifier/Printer/ConfigForm.js');
+ }
+
+ /**
+ * Returns HTML output for a configuration form
+ * @param HTMLPurifier_Config|array $config Configuration object of current form state, or an array
+ * where [0] has an HTML namespace and [1] is being rendered.
+ * @param array|bool $allowed Optional namespace(s) and directives to restrict form to.
+ * @param bool $render_controls
+ * @return string
+ */
+ public function render($config, $allowed = true, $render_controls = true)
+ {
+ if (is_array($config) && isset($config[0])) {
+ $gen_config = $config[0];
+ $config = $config[1];
+ } else {
+ $gen_config = $config;
+ }
+
+ $this->config = $config;
+ $this->genConfig = $gen_config;
+ $this->prepareGenerator($gen_config);
+
+ $allowed = HTMLPurifier_Config::getAllowedDirectivesForForm($allowed, $config->def);
+ $all = array();
+ foreach ($allowed as $key) {
+ list($ns, $directive) = $key;
+ $all[$ns][$directive] = $config->get($ns . '.' . $directive);
+ }
+
+ $ret = '';
+ $ret .= $this->start('table', array('class' => 'hp-config'));
+ $ret .= $this->start('thead');
+ $ret .= $this->start('tr');
+ $ret .= $this->element('th', 'Directive', array('class' => 'hp-directive'));
+ $ret .= $this->element('th', 'Value', array('class' => 'hp-value'));
+ $ret .= $this->end('tr');
+ $ret .= $this->end('thead');
+ foreach ($all as $ns => $directives) {
+ $ret .= $this->renderNamespace($ns, $directives);
+ }
+ if ($render_controls) {
+ $ret .= $this->start('tbody');
+ $ret .= $this->start('tr');
+ $ret .= $this->start('td', array('colspan' => 2, 'class' => 'controls'));
+ $ret .= $this->elementEmpty('input', array('type' => 'submit', 'value' => 'Submit'));
+ $ret .= '[<a href="?">Reset</a>]';
+ $ret .= $this->end('td');
+ $ret .= $this->end('tr');
+ $ret .= $this->end('tbody');
+ }
+ $ret .= $this->end('table');
+ return $ret;
+ }
+
+ /**
+ * Renders a single namespace
+ * @param $ns String namespace name
+ * @param array $directives array of directives to values
+ * @return string
+ */
+ protected function renderNamespace($ns, $directives)
+ {
+ $ret = '';
+ $ret .= $this->start('tbody', array('class' => 'namespace'));
+ $ret .= $this->start('tr');
+ $ret .= $this->element('th', $ns, array('colspan' => 2));
+ $ret .= $this->end('tr');
+ $ret .= $this->end('tbody');
+ $ret .= $this->start('tbody');
+ foreach ($directives as $directive => $value) {
+ $ret .= $this->start('tr');
+ $ret .= $this->start('th');
+ if ($this->docURL) {
+ $url = str_replace('%s', urlencode("$ns.$directive"), $this->docURL);
+ $ret .= $this->start('a', array('href' => $url));
+ }
+ $attr = array('for' => "{$this->name}:$ns.$directive");
+
+ // crop directive name if it's too long
+ if (!$this->compress || (strlen($directive) < $this->compress)) {
+ $directive_disp = $directive;
+ } else {
+ $directive_disp = substr($directive, 0, $this->compress - 2) . '...';
+ $attr['title'] = $directive;
+ }
+
+ $ret .= $this->element(
+ 'label',
+ $directive_disp,
+ // component printers must create an element with this id
+ $attr
+ );
+ if ($this->docURL) {
+ $ret .= $this->end('a');
+ }
+ $ret .= $this->end('th');
+
+ $ret .= $this->start('td');
+ $def = $this->config->def->info["$ns.$directive"];
+ if (is_int($def)) {
+ $allow_null = $def < 0;
+ $type = abs($def);
+ } else {
+ $type = $def->type;
+ $allow_null = isset($def->allow_null);
+ }
+ if (!isset($this->fields[$type])) {
+ $type = 0;
+ } // default
+ $type_obj = $this->fields[$type];
+ if ($allow_null) {
+ $type_obj = new HTMLPurifier_Printer_ConfigForm_NullDecorator($type_obj);
+ }
+ $ret .= $type_obj->render($ns, $directive, $value, $this->name, array($this->genConfig, $this->config));
+ $ret .= $this->end('td');
+ $ret .= $this->end('tr');
+ }
+ $ret .= $this->end('tbody');
+ return $ret;
+ }
+
+}
+
+/**
+ * Printer decorator for directives that accept null
+ */
+class HTMLPurifier_Printer_ConfigForm_NullDecorator extends HTMLPurifier_Printer
+{
+ /**
+ * Printer being decorated
+ * @type HTMLPurifier_Printer
+ */
+ protected $obj;
+
+ /**
+ * @param HTMLPurifier_Printer $obj Printer to decorate
+ */
+ public function __construct($obj)
+ {
+ parent::__construct();
+ $this->obj = $obj;
+ }
+
+ /**
+ * @param string $ns
+ * @param string $directive
+ * @param string $value
+ * @param string $name
+ * @param HTMLPurifier_Config|array $config
+ * @return string
+ */
+ public function render($ns, $directive, $value, $name, $config)
+ {
+ if (is_array($config) && isset($config[0])) {
+ $gen_config = $config[0];
+ $config = $config[1];
+ } else {
+ $gen_config = $config;
+ }
+ $this->prepareGenerator($gen_config);
+
+ $ret = '';
+ $ret .= $this->start('label', array('for' => "$name:Null_$ns.$directive"));
+ $ret .= $this->element('span', "$ns.$directive:", array('class' => 'verbose'));
+ $ret .= $this->text(' Null/Disabled');
+ $ret .= $this->end('label');
+ $attr = array(
+ 'type' => 'checkbox',
+ 'value' => '1',
+ 'class' => 'null-toggle',
+ 'name' => "$name" . "[Null_$ns.$directive]",
+ 'id' => "$name:Null_$ns.$directive",
+ 'onclick' => "toggleWriteability('$name:$ns.$directive',checked)" // INLINE JAVASCRIPT!!!!
+ );
+ if ($this->obj instanceof HTMLPurifier_Printer_ConfigForm_bool) {
+ // modify inline javascript slightly
+ $attr['onclick'] =
+ "toggleWriteability('$name:Yes_$ns.$directive',checked);" .
+ "toggleWriteability('$name:No_$ns.$directive',checked)";
+ }
+ if ($value === null) {
+ $attr['checked'] = 'checked';
+ }
+ $ret .= $this->elementEmpty('input', $attr);
+ $ret .= $this->text(' or ');
+ $ret .= $this->elementEmpty('br');
+ $ret .= $this->obj->render($ns, $directive, $value, $name, array($gen_config, $config));
+ return $ret;
+ }
+}
+
+/**
+ * Swiss-army knife configuration form field printer
+ */
+class HTMLPurifier_Printer_ConfigForm_default extends HTMLPurifier_Printer
+{
+ /**
+ * @type int
+ */
+ public $cols = 18;
+
+ /**
+ * @type int
+ */
+ public $rows = 5;
+
+ /**
+ * @param string $ns
+ * @param string $directive
+ * @param string $value
+ * @param string $name
+ * @param HTMLPurifier_Config|array $config
+ * @return string
+ */
+ public function render($ns, $directive, $value, $name, $config)
+ {
+ if (is_array($config) && isset($config[0])) {
+ $gen_config = $config[0];
+ $config = $config[1];
+ } else {
+ $gen_config = $config;
+ }
+ $this->prepareGenerator($gen_config);
+ // this should probably be split up a little
+ $ret = '';
+ $def = $config->def->info["$ns.$directive"];
+ if (is_int($def)) {
+ $type = abs($def);
+ } else {
+ $type = $def->type;
+ }
+ if (is_array($value)) {
+ switch ($type) {
+ case HTMLPurifier_VarParser::LOOKUP:
+ $array = $value;
+ $value = array();
+ foreach ($array as $val => $b) {
+ $value[] = $val;
+ }
+ //TODO does this need a break?
+ case HTMLPurifier_VarParser::ALIST:
+ $value = implode(PHP_EOL, $value);
+ break;
+ case HTMLPurifier_VarParser::HASH:
+ $nvalue = '';
+ foreach ($value as $i => $v) {
+ if (is_array($v)) {
+ // HACK
+ $v = implode(";", $v);
+ }
+ $nvalue .= "$i:$v" . PHP_EOL;
+ }
+ $value = $nvalue;
+ break;
+ default:
+ $value = '';
+ }
+ }
+ if ($type === HTMLPurifier_VarParser::MIXED) {
+ return 'Not supported';
+ $value = serialize($value);
+ }
+ $attr = array(
+ 'name' => "$name" . "[$ns.$directive]",
+ 'id' => "$name:$ns.$directive"
+ );
+ if ($value === null) {
+ $attr['disabled'] = 'disabled';
+ }
+ if (isset($def->allowed)) {
+ $ret .= $this->start('select', $attr);
+ foreach ($def->allowed as $val => $b) {
+ $attr = array();
+ if ($value == $val) {
+ $attr['selected'] = 'selected';
+ }
+ $ret .= $this->element('option', $val, $attr);
+ }
+ $ret .= $this->end('select');
+ } elseif ($type === HTMLPurifier_VarParser::TEXT ||
+ $type === HTMLPurifier_VarParser::ITEXT ||
+ $type === HTMLPurifier_VarParser::ALIST ||
+ $type === HTMLPurifier_VarParser::HASH ||
+ $type === HTMLPurifier_VarParser::LOOKUP) {
+ $attr['cols'] = $this->cols;
+ $attr['rows'] = $this->rows;
+ $ret .= $this->start('textarea', $attr);
+ $ret .= $this->text($value);
+ $ret .= $this->end('textarea');
+ } else {
+ $attr['value'] = $value;
+ $attr['type'] = 'text';
+ $ret .= $this->elementEmpty('input', $attr);
+ }
+ return $ret;
+ }
+}
+
+/**
+ * Bool form field printer
+ */
+class HTMLPurifier_Printer_ConfigForm_bool extends HTMLPurifier_Printer
+{
+ /**
+ * @param string $ns
+ * @param string $directive
+ * @param string $value
+ * @param string $name
+ * @param HTMLPurifier_Config|array $config
+ * @return string
+ */
+ public function render($ns, $directive, $value, $name, $config)
+ {
+ if (is_array($config) && isset($config[0])) {
+ $gen_config = $config[0];
+ $config = $config[1];
+ } else {
+ $gen_config = $config;
+ }
+ $this->prepareGenerator($gen_config);
+ $ret = '';
+ $ret .= $this->start('div', array('id' => "$name:$ns.$directive"));
+
+ $ret .= $this->start('label', array('for' => "$name:Yes_$ns.$directive"));
+ $ret .= $this->element('span', "$ns.$directive:", array('class' => 'verbose'));
+ $ret .= $this->text(' Yes');
+ $ret .= $this->end('label');
+
+ $attr = array(
+ 'type' => 'radio',
+ 'name' => "$name" . "[$ns.$directive]",
+ 'id' => "$name:Yes_$ns.$directive",
+ 'value' => '1'
+ );
+ if ($value === true) {
+ $attr['checked'] = 'checked';
+ }
+ if ($value === null) {
+ $attr['disabled'] = 'disabled';
+ }
+ $ret .= $this->elementEmpty('input', $attr);
+
+ $ret .= $this->start('label', array('for' => "$name:No_$ns.$directive"));
+ $ret .= $this->element('span', "$ns.$directive:", array('class' => 'verbose'));
+ $ret .= $this->text(' No');
+ $ret .= $this->end('label');
+
+ $attr = array(
+ 'type' => 'radio',
+ 'name' => "$name" . "[$ns.$directive]",
+ 'id' => "$name:No_$ns.$directive",
+ 'value' => '0'
+ );
+ if ($value === false) {
+ $attr['checked'] = 'checked';
+ }
+ if ($value === null) {
+ $attr['disabled'] = 'disabled';
+ }
+ $ret .= $this->elementEmpty('input', $attr);
+
+ $ret .= $this->end('div');
+
+ return $ret;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/Printer/HTMLDefinition.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/HTMLDefinition.php
index 5f2f2f8a7..5f2f2f8a7 100644
--- a/library/HTMLPurifier/Printer/HTMLDefinition.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/HTMLDefinition.php
diff --git a/library/HTMLPurifier/PropertyList.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/PropertyList.php
index 189348fd9..189348fd9 100644
--- a/library/HTMLPurifier/PropertyList.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/PropertyList.php
diff --git a/library/HTMLPurifier/PropertyListIterator.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/PropertyListIterator.php
index 15b330ea3..15b330ea3 100644
--- a/library/HTMLPurifier/PropertyListIterator.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/PropertyListIterator.php
diff --git a/library/HTMLPurifier/Queue.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Queue.php
index f58db9042..f58db9042 100644
--- a/library/HTMLPurifier/Queue.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Queue.php
diff --git a/library/HTMLPurifier/Strategy.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy.php
index e1ff3b72d..e1ff3b72d 100644
--- a/library/HTMLPurifier/Strategy.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy.php
diff --git a/library/HTMLPurifier/Strategy/Composite.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/Composite.php
index d7d35ce7d..d7d35ce7d 100644
--- a/library/HTMLPurifier/Strategy/Composite.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/Composite.php
diff --git a/library/HTMLPurifier/Strategy/Core.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/Core.php
index 4414c17d6..4414c17d6 100644
--- a/library/HTMLPurifier/Strategy/Core.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/Core.php
diff --git a/library/HTMLPurifier/Strategy/FixNesting.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/FixNesting.php
index 6fa673db9..6fa673db9 100644
--- a/library/HTMLPurifier/Strategy/FixNesting.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/FixNesting.php
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/MakeWellFormed.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/MakeWellFormed.php
new file mode 100644
index 000000000..a6eb09e45
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/MakeWellFormed.php
@@ -0,0 +1,659 @@
+<?php
+
+/**
+ * Takes tokens makes them well-formed (balance end tags, etc.)
+ *
+ * Specification of the armor attributes this strategy uses:
+ *
+ * - MakeWellFormed_TagClosedError: This armor field is used to
+ * suppress tag closed errors for certain tokens [TagClosedSuppress],
+ * in particular, if a tag was generated automatically by HTML
+ * Purifier, we may rely on our infrastructure to close it for us
+ * and shouldn't report an error to the user [TagClosedAuto].
+ */
+class HTMLPurifier_Strategy_MakeWellFormed extends HTMLPurifier_Strategy
+{
+
+ /**
+ * Array stream of tokens being processed.
+ * @type HTMLPurifier_Token[]
+ */
+ protected $tokens;
+
+ /**
+ * Current token.
+ * @type HTMLPurifier_Token
+ */
+ protected $token;
+
+ /**
+ * Zipper managing the true state.
+ * @type HTMLPurifier_Zipper
+ */
+ protected $zipper;
+
+ /**
+ * Current nesting of elements.
+ * @type array
+ */
+ protected $stack;
+
+ /**
+ * Injectors active in this stream processing.
+ * @type HTMLPurifier_Injector[]
+ */
+ protected $injectors;
+
+ /**
+ * Current instance of HTMLPurifier_Config.
+ * @type HTMLPurifier_Config
+ */
+ protected $config;
+
+ /**
+ * Current instance of HTMLPurifier_Context.
+ * @type HTMLPurifier_Context
+ */
+ protected $context;
+
+ /**
+ * @param HTMLPurifier_Token[] $tokens
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return HTMLPurifier_Token[]
+ * @throws HTMLPurifier_Exception
+ */
+ public function execute($tokens, $config, $context)
+ {
+ $definition = $config->getHTMLDefinition();
+
+ // local variables
+ $generator = new HTMLPurifier_Generator($config, $context);
+ $escape_invalid_tags = $config->get('Core.EscapeInvalidTags');
+ // used for autoclose early abortion
+ $global_parent_allowed_elements = $definition->info_parent_def->child->getAllowedElements($config);
+ $e = $context->get('ErrorCollector', true);
+ $i = false; // injector index
+ list($zipper, $token) = HTMLPurifier_Zipper::fromArray($tokens);
+ if ($token === NULL) {
+ return array();
+ }
+ $reprocess = false; // whether or not to reprocess the same token
+ $stack = array();
+
+ // member variables
+ $this->stack =& $stack;
+ $this->tokens =& $tokens;
+ $this->token =& $token;
+ $this->zipper =& $zipper;
+ $this->config = $config;
+ $this->context = $context;
+
+ // context variables
+ $context->register('CurrentNesting', $stack);
+ $context->register('InputZipper', $zipper);
+ $context->register('CurrentToken', $token);
+
+ // -- begin INJECTOR --
+
+ $this->injectors = array();
+
+ $injectors = $config->getBatch('AutoFormat');
+ $def_injectors = $definition->info_injector;
+ $custom_injectors = $injectors['Custom'];
+ unset($injectors['Custom']); // special case
+ foreach ($injectors as $injector => $b) {
+ // XXX: Fix with a legitimate lookup table of enabled filters
+ if (strpos($injector, '.') !== false) {
+ continue;
+ }
+ $injector = "HTMLPurifier_Injector_$injector";
+ if (!$b) {
+ continue;
+ }
+ $this->injectors[] = new $injector;
+ }
+ foreach ($def_injectors as $injector) {
+ // assumed to be objects
+ $this->injectors[] = $injector;
+ }
+ foreach ($custom_injectors as $injector) {
+ if (!$injector) {
+ continue;
+ }
+ if (is_string($injector)) {
+ $injector = "HTMLPurifier_Injector_$injector";
+ $injector = new $injector;
+ }
+ $this->injectors[] = $injector;
+ }
+
+ // give the injectors references to the definition and context
+ // variables for performance reasons
+ foreach ($this->injectors as $ix => $injector) {
+ $error = $injector->prepare($config, $context);
+ if (!$error) {
+ continue;
+ }
+ array_splice($this->injectors, $ix, 1); // rm the injector
+ trigger_error("Cannot enable {$injector->name} injector because $error is not allowed", E_USER_WARNING);
+ }
+
+ // -- end INJECTOR --
+
+ // a note on reprocessing:
+ // In order to reduce code duplication, whenever some code needs
+ // to make HTML changes in order to make things "correct", the
+ // new HTML gets sent through the purifier, regardless of its
+ // status. This means that if we add a start token, because it
+ // was totally necessary, we don't have to update nesting; we just
+ // punt ($reprocess = true; continue;) and it does that for us.
+
+ // isset is in loop because $tokens size changes during loop exec
+ for (;;
+ // only increment if we don't need to reprocess
+ $reprocess ? $reprocess = false : $token = $zipper->next($token)) {
+
+ // check for a rewind
+ if (is_int($i)) {
+ // possibility: disable rewinding if the current token has a
+ // rewind set on it already. This would offer protection from
+ // infinite loop, but might hinder some advanced rewinding.
+ $rewind_offset = $this->injectors[$i]->getRewindOffset();
+ if (is_int($rewind_offset)) {
+ for ($j = 0; $j < $rewind_offset; $j++) {
+ if (empty($zipper->front)) break;
+ $token = $zipper->prev($token);
+ // indicate that other injectors should not process this token,
+ // but we need to reprocess it. See Note [Injector skips]
+ unset($token->skip[$i]);
+ $token->rewind = $i;
+ if ($token instanceof HTMLPurifier_Token_Start) {
+ array_pop($this->stack);
+ } elseif ($token instanceof HTMLPurifier_Token_End) {
+ $this->stack[] = $token->start;
+ }
+ }
+ }
+ $i = false;
+ }
+
+ // handle case of document end
+ if ($token === NULL) {
+ // kill processing if stack is empty
+ if (empty($this->stack)) {
+ break;
+ }
+
+ // peek
+ $top_nesting = array_pop($this->stack);
+ $this->stack[] = $top_nesting;
+
+ // send error [TagClosedSuppress]
+ if ($e && !isset($top_nesting->armor['MakeWellFormed_TagClosedError'])) {
+ $e->send(E_NOTICE, 'Strategy_MakeWellFormed: Tag closed by document end', $top_nesting);
+ }
+
+ // append, don't splice, since this is the end
+ $token = new HTMLPurifier_Token_End($top_nesting->name);
+
+ // punt!
+ $reprocess = true;
+ continue;
+ }
+
+ //echo '<br>'; printZipper($zipper, $token);//printTokens($this->stack);
+ //flush();
+
+ // quick-check: if it's not a tag, no need to process
+ if (empty($token->is_tag)) {
+ if ($token instanceof HTMLPurifier_Token_Text) {
+ foreach ($this->injectors as $i => $injector) {
+ if (isset($token->skip[$i])) {
+ // See Note [Injector skips]
+ continue;
+ }
+ if ($token->rewind !== null && $token->rewind !== $i) {
+ continue;
+ }
+ // XXX fuckup
+ $r = $token;
+ $injector->handleText($r);
+ $token = $this->processToken($r, $i);
+ $reprocess = true;
+ break;
+ }
+ }
+ // another possibility is a comment
+ continue;
+ }
+
+ if (isset($definition->info[$token->name])) {
+ $type = $definition->info[$token->name]->child->type;
+ } else {
+ $type = false; // Type is unknown, treat accordingly
+ }
+
+ // quick tag checks: anything that's *not* an end tag
+ $ok = false;
+ if ($type === 'empty' && $token instanceof HTMLPurifier_Token_Start) {
+ // claims to be a start tag but is empty
+ $token = new HTMLPurifier_Token_Empty(
+ $token->name,
+ $token->attr,
+ $token->line,
+ $token->col,
+ $token->armor
+ );
+ $ok = true;
+ } elseif ($type && $type !== 'empty' && $token instanceof HTMLPurifier_Token_Empty) {
+ // claims to be empty but really is a start tag
+ // NB: this assignment is required
+ $old_token = $token;
+ $token = new HTMLPurifier_Token_End($token->name);
+ $token = $this->insertBefore(
+ new HTMLPurifier_Token_Start($old_token->name, $old_token->attr, $old_token->line, $old_token->col, $old_token->armor)
+ );
+ // punt (since we had to modify the input stream in a non-trivial way)
+ $reprocess = true;
+ continue;
+ } elseif ($token instanceof HTMLPurifier_Token_Empty) {
+ // real empty token
+ $ok = true;
+ } elseif ($token instanceof HTMLPurifier_Token_Start) {
+ // start tag
+
+ // ...unless they also have to close their parent
+ if (!empty($this->stack)) {
+
+ // Performance note: you might think that it's rather
+ // inefficient, recalculating the autoclose information
+ // for every tag that a token closes (since when we
+ // do an autoclose, we push a new token into the
+ // stream and then /process/ that, before
+ // re-processing this token.) But this is
+ // necessary, because an injector can make an
+ // arbitrary transformations to the autoclosing
+ // tokens we introduce, so things may have changed
+ // in the meantime. Also, doing the inefficient thing is
+ // "easy" to reason about (for certain perverse definitions
+ // of "easy")
+
+ $parent = array_pop($this->stack);
+ $this->stack[] = $parent;
+
+ $parent_def = null;
+ $parent_elements = null;
+ $autoclose = false;
+ if (isset($definition->info[$parent->name])) {
+ $parent_def = $definition->info[$parent->name];
+ $parent_elements = $parent_def->child->getAllowedElements($config);
+ $autoclose = !isset($parent_elements[$token->name]);
+ }
+
+ if ($autoclose && $definition->info[$token->name]->wrap) {
+ // Check if an element can be wrapped by another
+ // element to make it valid in a context (for
+ // example, <ul><ul> needs a <li> in between)
+ $wrapname = $definition->info[$token->name]->wrap;
+ $wrapdef = $definition->info[$wrapname];
+ $elements = $wrapdef->child->getAllowedElements($config);
+ if (isset($elements[$token->name]) && isset($parent_elements[$wrapname])) {
+ $newtoken = new HTMLPurifier_Token_Start($wrapname);
+ $token = $this->insertBefore($newtoken);
+ $reprocess = true;
+ continue;
+ }
+ }
+
+ $carryover = false;
+ if ($autoclose && $parent_def->formatting) {
+ $carryover = true;
+ }
+
+ if ($autoclose) {
+ // check if this autoclose is doomed to fail
+ // (this rechecks $parent, which his harmless)
+ $autoclose_ok = isset($global_parent_allowed_elements[$token->name]);
+ if (!$autoclose_ok) {
+ foreach ($this->stack as $ancestor) {
+ $elements = $definition->info[$ancestor->name]->child->getAllowedElements($config);
+ if (isset($elements[$token->name])) {
+ $autoclose_ok = true;
+ break;
+ }
+ if ($definition->info[$token->name]->wrap) {
+ $wrapname = $definition->info[$token->name]->wrap;
+ $wrapdef = $definition->info[$wrapname];
+ $wrap_elements = $wrapdef->child->getAllowedElements($config);
+ if (isset($wrap_elements[$token->name]) && isset($elements[$wrapname])) {
+ $autoclose_ok = true;
+ break;
+ }
+ }
+ }
+ }
+ if ($autoclose_ok) {
+ // errors need to be updated
+ $new_token = new HTMLPurifier_Token_End($parent->name);
+ $new_token->start = $parent;
+ // [TagClosedSuppress]
+ if ($e && !isset($parent->armor['MakeWellFormed_TagClosedError'])) {
+ if (!$carryover) {
+ $e->send(E_NOTICE, 'Strategy_MakeWellFormed: Tag auto closed', $parent);
+ } else {
+ $e->send(E_NOTICE, 'Strategy_MakeWellFormed: Tag carryover', $parent);
+ }
+ }
+ if ($carryover) {
+ $element = clone $parent;
+ // [TagClosedAuto]
+ $element->armor['MakeWellFormed_TagClosedError'] = true;
+ $element->carryover = true;
+ $token = $this->processToken(array($new_token, $token, $element));
+ } else {
+ $token = $this->insertBefore($new_token);
+ }
+ } else {
+ $token = $this->remove();
+ }
+ $reprocess = true;
+ continue;
+ }
+
+ }
+ $ok = true;
+ }
+
+ if ($ok) {
+ foreach ($this->injectors as $i => $injector) {
+ if (isset($token->skip[$i])) {
+ // See Note [Injector skips]
+ continue;
+ }
+ if ($token->rewind !== null && $token->rewind !== $i) {
+ continue;
+ }
+ $r = $token;
+ $injector->handleElement($r);
+ $token = $this->processToken($r, $i);
+ $reprocess = true;
+ break;
+ }
+ if (!$reprocess) {
+ // ah, nothing interesting happened; do normal processing
+ if ($token instanceof HTMLPurifier_Token_Start) {
+ $this->stack[] = $token;
+ } elseif ($token instanceof HTMLPurifier_Token_End) {
+ throw new HTMLPurifier_Exception(
+ 'Improper handling of end tag in start code; possible error in MakeWellFormed'
+ );
+ }
+ }
+ continue;
+ }
+
+ // sanity check: we should be dealing with a closing tag
+ if (!$token instanceof HTMLPurifier_Token_End) {
+ throw new HTMLPurifier_Exception('Unaccounted for tag token in input stream, bug in HTML Purifier');
+ }
+
+ // make sure that we have something open
+ if (empty($this->stack)) {
+ if ($escape_invalid_tags) {
+ if ($e) {
+ $e->send(E_WARNING, 'Strategy_MakeWellFormed: Unnecessary end tag to text');
+ }
+ $token = new HTMLPurifier_Token_Text($generator->generateFromToken($token));
+ } else {
+ if ($e) {
+ $e->send(E_WARNING, 'Strategy_MakeWellFormed: Unnecessary end tag removed');
+ }
+ $token = $this->remove();
+ }
+ $reprocess = true;
+ continue;
+ }
+
+ // first, check for the simplest case: everything closes neatly.
+ // Eventually, everything passes through here; if there are problems
+ // we modify the input stream accordingly and then punt, so that
+ // the tokens get processed again.
+ $current_parent = array_pop($this->stack);
+ if ($current_parent->name == $token->name) {
+ $token->start = $current_parent;
+ foreach ($this->injectors as $i => $injector) {
+ if (isset($token->skip[$i])) {
+ // See Note [Injector skips]
+ continue;
+ }
+ if ($token->rewind !== null && $token->rewind !== $i) {
+ continue;
+ }
+ $r = $token;
+ $injector->handleEnd($r);
+ $token = $this->processToken($r, $i);
+ $this->stack[] = $current_parent;
+ $reprocess = true;
+ break;
+ }
+ continue;
+ }
+
+ // okay, so we're trying to close the wrong tag
+
+ // undo the pop previous pop
+ $this->stack[] = $current_parent;
+
+ // scroll back the entire nest, trying to find our tag.
+ // (feature could be to specify how far you'd like to go)
+ $size = count($this->stack);
+ // -2 because -1 is the last element, but we already checked that
+ $skipped_tags = false;
+ for ($j = $size - 2; $j >= 0; $j--) {
+ if ($this->stack[$j]->name == $token->name) {
+ $skipped_tags = array_slice($this->stack, $j);
+ break;
+ }
+ }
+
+ // we didn't find the tag, so remove
+ if ($skipped_tags === false) {
+ if ($escape_invalid_tags) {
+ if ($e) {
+ $e->send(E_WARNING, 'Strategy_MakeWellFormed: Stray end tag to text');
+ }
+ $token = new HTMLPurifier_Token_Text($generator->generateFromToken($token));
+ } else {
+ if ($e) {
+ $e->send(E_WARNING, 'Strategy_MakeWellFormed: Stray end tag removed');
+ }
+ $token = $this->remove();
+ }
+ $reprocess = true;
+ continue;
+ }
+
+ // do errors, in REVERSE $j order: a,b,c with </a></b></c>
+ $c = count($skipped_tags);
+ if ($e) {
+ for ($j = $c - 1; $j > 0; $j--) {
+ // notice we exclude $j == 0, i.e. the current ending tag, from
+ // the errors... [TagClosedSuppress]
+ if (!isset($skipped_tags[$j]->armor['MakeWellFormed_TagClosedError'])) {
+ $e->send(E_NOTICE, 'Strategy_MakeWellFormed: Tag closed by element end', $skipped_tags[$j]);
+ }
+ }
+ }
+
+ // insert tags, in FORWARD $j order: c,b,a with </a></b></c>
+ $replace = array($token);
+ for ($j = 1; $j < $c; $j++) {
+ // ...as well as from the insertions
+ $new_token = new HTMLPurifier_Token_End($skipped_tags[$j]->name);
+ $new_token->start = $skipped_tags[$j];
+ array_unshift($replace, $new_token);
+ if (isset($definition->info[$new_token->name]) && $definition->info[$new_token->name]->formatting) {
+ // [TagClosedAuto]
+ $element = clone $skipped_tags[$j];
+ $element->carryover = true;
+ $element->armor['MakeWellFormed_TagClosedError'] = true;
+ $replace[] = $element;
+ }
+ }
+ $token = $this->processToken($replace);
+ $reprocess = true;
+ continue;
+ }
+
+ $context->destroy('CurrentToken');
+ $context->destroy('CurrentNesting');
+ $context->destroy('InputZipper');
+
+ unset($this->injectors, $this->stack, $this->tokens);
+ return $zipper->toArray($token);
+ }
+
+ /**
+ * Processes arbitrary token values for complicated substitution patterns.
+ * In general:
+ *
+ * If $token is an array, it is a list of tokens to substitute for the
+ * current token. These tokens then get individually processed. If there
+ * is a leading integer in the list, that integer determines how many
+ * tokens from the stream should be removed.
+ *
+ * If $token is a regular token, it is swapped with the current token.
+ *
+ * If $token is false, the current token is deleted.
+ *
+ * If $token is an integer, that number of tokens (with the first token
+ * being the current one) will be deleted.
+ *
+ * @param HTMLPurifier_Token|array|int|bool $token Token substitution value
+ * @param HTMLPurifier_Injector|int $injector Injector that performed the substitution; default is if
+ * this is not an injector related operation.
+ * @throws HTMLPurifier_Exception
+ */
+ protected function processToken($token, $injector = -1)
+ {
+ // Zend OpCache miscompiles $token = array($token), so
+ // avoid this pattern. See: https://github.com/ezyang/htmlpurifier/issues/108
+
+ // normalize forms of token
+ if (is_object($token)) {
+ $tmp = $token;
+ $token = array(1, $tmp);
+ }
+ if (is_int($token)) {
+ $tmp = $token;
+ $token = array($tmp);
+ }
+ if ($token === false) {
+ $token = array(1);
+ }
+ if (!is_array($token)) {
+ throw new HTMLPurifier_Exception('Invalid token type from injector');
+ }
+ if (!is_int($token[0])) {
+ array_unshift($token, 1);
+ }
+ if ($token[0] === 0) {
+ throw new HTMLPurifier_Exception('Deleting zero tokens is not valid');
+ }
+
+ // $token is now an array with the following form:
+ // array(number nodes to delete, new node 1, new node 2, ...)
+
+ $delete = array_shift($token);
+ list($old, $r) = $this->zipper->splice($this->token, $delete, $token);
+
+ if ($injector > -1) {
+ // See Note [Injector skips]
+ // Determine appropriate skips. Here's what the code does:
+ // *If* we deleted one or more tokens, copy the skips
+ // of those tokens into the skips of the new tokens (in $token).
+ // Also, mark the newly inserted tokens as having come from
+ // $injector.
+ $oldskip = isset($old[0]) ? $old[0]->skip : array();
+ foreach ($token as $object) {
+ $object->skip = $oldskip;
+ $object->skip[$injector] = true;
+ }
+ }
+
+ return $r;
+
+ }
+
+ /**
+ * Inserts a token before the current token. Cursor now points to
+ * this token. You must reprocess after this.
+ * @param HTMLPurifier_Token $token
+ */
+ private function insertBefore($token)
+ {
+ // NB not $this->zipper->insertBefore(), due to positioning
+ // differences
+ $splice = $this->zipper->splice($this->token, 0, array($token));
+
+ return $splice[1];
+ }
+
+ /**
+ * Removes current token. Cursor now points to new token occupying previously
+ * occupied space. You must reprocess after this.
+ */
+ private function remove()
+ {
+ return $this->zipper->delete();
+ }
+}
+
+// Note [Injector skips]
+// ~~~~~~~~~~~~~~~~~~~~~
+// When I originally designed this class, the idea behind the 'skip'
+// property of HTMLPurifier_Token was to help avoid infinite loops
+// in injector processing. For example, suppose you wrote an injector
+// that bolded swear words. Naively, you might write it so that
+// whenever you saw ****, you replaced it with <strong>****</strong>.
+//
+// When this happens, we will reprocess all of the tokens with the
+// other injectors. Now there is an opportunity for infinite loop:
+// if we rerun the swear-word injector on these tokens, we might
+// see **** and then reprocess again to get
+// <strong><strong>****</strong></strong> ad infinitum.
+//
+// Thus, the idea of a skip is that once we process a token with
+// an injector, we mark all of those tokens as having "come from"
+// the injector, and we never run the injector again on these
+// tokens.
+//
+// There were two more complications, however:
+//
+// - With HTMLPurifier_Injector_RemoveEmpty, we noticed that if
+// you had <b><i></i></b>, after you removed the <i></i>, you
+// really would like this injector to go back and reprocess
+// the <b> tag, discovering that it is now empty and can be
+// removed. So we reintroduced the possibility of infinite looping
+// by adding a "rewind" function, which let you go back to an
+// earlier point in the token stream and reprocess it with injectors.
+// Needless to say, we need to UN-skip the token so it gets
+// reprocessed.
+//
+// - Suppose that you successfuly process a token, replace it with
+// one with your skip mark, but now another injector wants to
+// process the skipped token with another token. Should you continue
+// to skip that new token, or reprocess it? If you reprocess,
+// you can end up with an infinite loop where one injector converts
+// <a> to <b>, and then another injector converts it back. So
+// we inherit the skips, but for some reason, I thought that we
+// should inherit the skip from the first token of the token
+// that we deleted. Why? Well, it seems to work OK.
+//
+// If I were to redesign this functionality, I would absolutely not
+// go about doing it this way: the semantics are just not very well
+// defined, and in any case you probably wanted to operate on trees,
+// not token streams.
+
+// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/Strategy/RemoveForeignElements.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/RemoveForeignElements.php
index 1a8149ecc..1a8149ecc 100644
--- a/library/HTMLPurifier/Strategy/RemoveForeignElements.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/RemoveForeignElements.php
diff --git a/library/HTMLPurifier/Strategy/ValidateAttributes.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/ValidateAttributes.php
index fbb3d27c8..fbb3d27c8 100644
--- a/library/HTMLPurifier/Strategy/ValidateAttributes.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/ValidateAttributes.php
diff --git a/library/HTMLPurifier/StringHash.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/StringHash.php
index c07370197..c07370197 100644
--- a/library/HTMLPurifier/StringHash.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/StringHash.php
diff --git a/library/HTMLPurifier/StringHashParser.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/StringHashParser.php
index 7c73f8083..7c73f8083 100644
--- a/library/HTMLPurifier/StringHashParser.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/StringHashParser.php
diff --git a/library/HTMLPurifier/TagTransform.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/TagTransform.php
index 7b8d83343..7b8d83343 100644
--- a/library/HTMLPurifier/TagTransform.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/TagTransform.php
diff --git a/library/HTMLPurifier/TagTransform/Font.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/TagTransform/Font.php
index 7853d90bc..7853d90bc 100644
--- a/library/HTMLPurifier/TagTransform/Font.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/TagTransform/Font.php
diff --git a/library/HTMLPurifier/TagTransform/Simple.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/TagTransform/Simple.php
index 71bf10b91..71bf10b91 100644
--- a/library/HTMLPurifier/TagTransform/Simple.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/TagTransform/Simple.php
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token.php
new file mode 100644
index 000000000..84d3619a3
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token.php
@@ -0,0 +1,100 @@
+<?php
+
+/**
+ * Abstract base token class that all others inherit from.
+ */
+abstract class HTMLPurifier_Token
+{
+ /**
+ * Line number node was on in source document. Null if unknown.
+ * @type int
+ */
+ public $line;
+
+ /**
+ * Column of line node was on in source document. Null if unknown.
+ * @type int
+ */
+ public $col;
+
+ /**
+ * Lookup array of processing that this token is exempt from.
+ * Currently, valid values are "ValidateAttributes" and
+ * "MakeWellFormed_TagClosedError"
+ * @type array
+ */
+ public $armor = array();
+
+ /**
+ * Used during MakeWellFormed. See Note [Injector skips]
+ * @type
+ */
+ public $skip;
+
+ /**
+ * @type
+ */
+ public $rewind;
+
+ /**
+ * @type
+ */
+ public $carryover;
+
+ /**
+ * @param string $n
+ * @return null|string
+ */
+ public function __get($n)
+ {
+ if ($n === 'type') {
+ trigger_error('Deprecated type property called; use instanceof', E_USER_NOTICE);
+ switch (get_class($this)) {
+ case 'HTMLPurifier_Token_Start':
+ return 'start';
+ case 'HTMLPurifier_Token_Empty':
+ return 'empty';
+ case 'HTMLPurifier_Token_End':
+ return 'end';
+ case 'HTMLPurifier_Token_Text':
+ return 'text';
+ case 'HTMLPurifier_Token_Comment':
+ return 'comment';
+ default:
+ return null;
+ }
+ }
+ }
+
+ /**
+ * Sets the position of the token in the source document.
+ * @param int $l
+ * @param int $c
+ */
+ public function position($l = null, $c = null)
+ {
+ $this->line = $l;
+ $this->col = $c;
+ }
+
+ /**
+ * Convenience function for DirectLex settings line/col position.
+ * @param int $l
+ * @param int $c
+ */
+ public function rawPosition($l, $c)
+ {
+ if ($c === -1) {
+ $l++;
+ }
+ $this->line = $l;
+ $this->col = $c;
+ }
+
+ /**
+ * Converts a token into its corresponding node.
+ */
+ abstract public function toNode();
+}
+
+// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/Token/Comment.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/Comment.php
index 23453c705..23453c705 100644
--- a/library/HTMLPurifier/Token/Comment.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/Comment.php
diff --git a/library/HTMLPurifier/Token/Empty.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/Empty.php
index 78a95f555..78a95f555 100644
--- a/library/HTMLPurifier/Token/Empty.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/Empty.php
diff --git a/library/HTMLPurifier/Token/End.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/End.php
index 59b38fdc5..59b38fdc5 100644
--- a/library/HTMLPurifier/Token/End.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/End.php
diff --git a/library/HTMLPurifier/Token/Start.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/Start.php
index 019f317ad..019f317ad 100644
--- a/library/HTMLPurifier/Token/Start.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/Start.php
diff --git a/library/HTMLPurifier/Token/Tag.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/Tag.php
index d643fa64e..d643fa64e 100644
--- a/library/HTMLPurifier/Token/Tag.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/Tag.php
diff --git a/library/HTMLPurifier/Token/Text.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/Text.php
index f26a1c211..f26a1c211 100644
--- a/library/HTMLPurifier/Token/Text.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/Text.php
diff --git a/library/HTMLPurifier/TokenFactory.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/TokenFactory.php
index dea2446b9..dea2446b9 100644
--- a/library/HTMLPurifier/TokenFactory.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/TokenFactory.php
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URI.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URI.php
new file mode 100644
index 000000000..9c5be39d1
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URI.php
@@ -0,0 +1,316 @@
+<?php
+
+/**
+ * HTML Purifier's internal representation of a URI.
+ * @note
+ * Internal data-structures are completely escaped. If the data needs
+ * to be used in a non-URI context (which is very unlikely), be sure
+ * to decode it first. The URI may not necessarily be well-formed until
+ * validate() is called.
+ */
+class HTMLPurifier_URI
+{
+ /**
+ * @type string
+ */
+ public $scheme;
+
+ /**
+ * @type string
+ */
+ public $userinfo;
+
+ /**
+ * @type string
+ */
+ public $host;
+
+ /**
+ * @type int
+ */
+ public $port;
+
+ /**
+ * @type string
+ */
+ public $path;
+
+ /**
+ * @type string
+ */
+ public $query;
+
+ /**
+ * @type string
+ */
+ public $fragment;
+
+ /**
+ * @param string $scheme
+ * @param string $userinfo
+ * @param string $host
+ * @param int $port
+ * @param string $path
+ * @param string $query
+ * @param string $fragment
+ * @note Automatically normalizes scheme and port
+ */
+ public function __construct($scheme, $userinfo, $host, $port, $path, $query, $fragment)
+ {
+ $this->scheme = is_null($scheme) || ctype_lower($scheme) ? $scheme : strtolower($scheme);
+ $this->userinfo = $userinfo;
+ $this->host = $host;
+ $this->port = is_null($port) ? $port : (int)$port;
+ $this->path = $path;
+ $this->query = $query;
+ $this->fragment = $fragment;
+ }
+
+ /**
+ * Retrieves a scheme object corresponding to the URI's scheme/default
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return HTMLPurifier_URIScheme Scheme object appropriate for validating this URI
+ */
+ public function getSchemeObj($config, $context)
+ {
+ $registry = HTMLPurifier_URISchemeRegistry::instance();
+ if ($this->scheme !== null) {
+ $scheme_obj = $registry->getScheme($this->scheme, $config, $context);
+ if (!$scheme_obj) {
+ return false;
+ } // invalid scheme, clean it out
+ } else {
+ // no scheme: retrieve the default one
+ $def = $config->getDefinition('URI');
+ $scheme_obj = $def->getDefaultScheme($config, $context);
+ if (!$scheme_obj) {
+ if ($def->defaultScheme !== null) {
+ // something funky happened to the default scheme object
+ trigger_error(
+ 'Default scheme object "' . $def->defaultScheme . '" was not readable',
+ E_USER_WARNING
+ );
+ } // suppress error if it's null
+ return false;
+ }
+ }
+ return $scheme_obj;
+ }
+
+ /**
+ * Generic validation method applicable for all schemes. May modify
+ * this URI in order to get it into a compliant form.
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool True if validation/filtering succeeds, false if failure
+ */
+ public function validate($config, $context)
+ {
+ // ABNF definitions from RFC 3986
+ $chars_sub_delims = '!$&\'()*+,;=';
+ $chars_gen_delims = ':/?#[]@';
+ $chars_pchar = $chars_sub_delims . ':@';
+
+ // validate host
+ if (!is_null($this->host)) {
+ $host_def = new HTMLPurifier_AttrDef_URI_Host();
+ $this->host = $host_def->validate($this->host, $config, $context);
+ if ($this->host === false) {
+ $this->host = null;
+ }
+ }
+
+ // validate scheme
+ // NOTE: It's not appropriate to check whether or not this
+ // scheme is in our registry, since a URIFilter may convert a
+ // URI that we don't allow into one we do. So instead, we just
+ // check if the scheme can be dropped because there is no host
+ // and it is our default scheme.
+ if (!is_null($this->scheme) && is_null($this->host) || $this->host === '') {
+ // support for relative paths is pretty abysmal when the
+ // scheme is present, so axe it when possible
+ $def = $config->getDefinition('URI');
+ if ($def->defaultScheme === $this->scheme) {
+ $this->scheme = null;
+ }
+ }
+
+ // validate username
+ if (!is_null($this->userinfo)) {
+ $encoder = new HTMLPurifier_PercentEncoder($chars_sub_delims . ':');
+ $this->userinfo = $encoder->encode($this->userinfo);
+ }
+
+ // validate port
+ if (!is_null($this->port)) {
+ if ($this->port < 1 || $this->port > 65535) {
+ $this->port = null;
+ }
+ }
+
+ // validate path
+ $segments_encoder = new HTMLPurifier_PercentEncoder($chars_pchar . '/');
+ if (!is_null($this->host)) { // this catches $this->host === ''
+ // path-abempty (hier and relative)
+ // http://www.example.com/my/path
+ // //www.example.com/my/path (looks odd, but works, and
+ // recognized by most browsers)
+ // (this set is valid or invalid on a scheme by scheme
+ // basis, so we'll deal with it later)
+ // file:///my/path
+ // ///my/path
+ $this->path = $segments_encoder->encode($this->path);
+ } elseif ($this->path !== '') {
+ if ($this->path[0] === '/') {
+ // path-absolute (hier and relative)
+ // http:/my/path
+ // /my/path
+ if (strlen($this->path) >= 2 && $this->path[1] === '/') {
+ // This could happen if both the host gets stripped
+ // out
+ // http://my/path
+ // //my/path
+ $this->path = '';
+ } else {
+ $this->path = $segments_encoder->encode($this->path);
+ }
+ } elseif (!is_null($this->scheme)) {
+ // path-rootless (hier)
+ // http:my/path
+ // Short circuit evaluation means we don't need to check nz
+ $this->path = $segments_encoder->encode($this->path);
+ } else {
+ // path-noscheme (relative)
+ // my/path
+ // (once again, not checking nz)
+ $segment_nc_encoder = new HTMLPurifier_PercentEncoder($chars_sub_delims . '@');
+ $c = strpos($this->path, '/');
+ if ($c !== false) {
+ $this->path =
+ $segment_nc_encoder->encode(substr($this->path, 0, $c)) .
+ $segments_encoder->encode(substr($this->path, $c));
+ } else {
+ $this->path = $segment_nc_encoder->encode($this->path);
+ }
+ }
+ } else {
+ // path-empty (hier and relative)
+ $this->path = ''; // just to be safe
+ }
+
+ // qf = query and fragment
+ $qf_encoder = new HTMLPurifier_PercentEncoder($chars_pchar . '/?');
+
+ if (!is_null($this->query)) {
+ $this->query = $qf_encoder->encode($this->query);
+ }
+
+ if (!is_null($this->fragment)) {
+ $this->fragment = $qf_encoder->encode($this->fragment);
+ }
+ return true;
+ }
+
+ /**
+ * Convert URI back to string
+ * @return string URI appropriate for output
+ */
+ public function toString()
+ {
+ // reconstruct authority
+ $authority = null;
+ // there is a rendering difference between a null authority
+ // (http:foo-bar) and an empty string authority
+ // (http:///foo-bar).
+ if (!is_null($this->host)) {
+ $authority = '';
+ if (!is_null($this->userinfo)) {
+ $authority .= $this->userinfo . '@';
+ }
+ $authority .= $this->host;
+ if (!is_null($this->port)) {
+ $authority .= ':' . $this->port;
+ }
+ }
+
+ // Reconstruct the result
+ // One might wonder about parsing quirks from browsers after
+ // this reconstruction. Unfortunately, parsing behavior depends
+ // on what *scheme* was employed (file:///foo is handled *very*
+ // differently than http:///foo), so unfortunately we have to
+ // defer to the schemes to do the right thing.
+ $result = '';
+ if (!is_null($this->scheme)) {
+ $result .= $this->scheme . ':';
+ }
+ if (!is_null($authority)) {
+ $result .= '//' . $authority;
+ }
+ $result .= $this->path;
+ if (!is_null($this->query)) {
+ $result .= '?' . $this->query;
+ }
+ if (!is_null($this->fragment)) {
+ $result .= '#' . $this->fragment;
+ }
+
+ return $result;
+ }
+
+ /**
+ * Returns true if this URL might be considered a 'local' URL given
+ * the current context. This is true when the host is null, or
+ * when it matches the host supplied to the configuration.
+ *
+ * Note that this does not do any scheme checking, so it is mostly
+ * only appropriate for metadata that doesn't care about protocol
+ * security. isBenign is probably what you actually want.
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool
+ */
+ public function isLocal($config, $context)
+ {
+ if ($this->host === null) {
+ return true;
+ }
+ $uri_def = $config->getDefinition('URI');
+ if ($uri_def->host === $this->host) {
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Returns true if this URL should be considered a 'benign' URL,
+ * that is:
+ *
+ * - It is a local URL (isLocal), and
+ * - It has a equal or better level of security
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool
+ */
+ public function isBenign($config, $context)
+ {
+ if (!$this->isLocal($config, $context)) {
+ return false;
+ }
+
+ $scheme_obj = $this->getSchemeObj($config, $context);
+ if (!$scheme_obj) {
+ return false;
+ } // conservative approach
+
+ $current_scheme_obj = $config->getDefinition('URI')->getDefaultScheme($config, $context);
+ if ($current_scheme_obj->secure) {
+ if (!$scheme_obj->secure) {
+ return false;
+ }
+ }
+ return true;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/URIDefinition.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIDefinition.php
index e0bd8bcca..e0bd8bcca 100644
--- a/library/HTMLPurifier/URIDefinition.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIDefinition.php
diff --git a/library/HTMLPurifier/URIFilter.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter.php
index 09724e9f4..09724e9f4 100644
--- a/library/HTMLPurifier/URIFilter.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter.php
diff --git a/library/HTMLPurifier/URIFilter/DisableExternal.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/DisableExternal.php
index ced1b1376..ced1b1376 100644
--- a/library/HTMLPurifier/URIFilter/DisableExternal.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/DisableExternal.php
diff --git a/library/HTMLPurifier/URIFilter/DisableExternalResources.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/DisableExternalResources.php
index c6562169e..c6562169e 100644
--- a/library/HTMLPurifier/URIFilter/DisableExternalResources.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/DisableExternalResources.php
diff --git a/library/HTMLPurifier/URIFilter/DisableResources.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/DisableResources.php
index d5c412c44..d5c412c44 100644
--- a/library/HTMLPurifier/URIFilter/DisableResources.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/DisableResources.php
diff --git a/library/HTMLPurifier/URIFilter/HostBlacklist.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/HostBlacklist.php
index a6645c17e..a6645c17e 100644
--- a/library/HTMLPurifier/URIFilter/HostBlacklist.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/HostBlacklist.php
diff --git a/library/HTMLPurifier/URIFilter/MakeAbsolute.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/MakeAbsolute.php
index c507bbff8..c507bbff8 100644
--- a/library/HTMLPurifier/URIFilter/MakeAbsolute.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/MakeAbsolute.php
diff --git a/library/HTMLPurifier/URIFilter/Munge.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/Munge.php
index 6e03315a1..6e03315a1 100644
--- a/library/HTMLPurifier/URIFilter/Munge.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/Munge.php
diff --git a/library/HTMLPurifier/URIFilter/SafeIframe.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/SafeIframe.php
index f609c47a3..f609c47a3 100644
--- a/library/HTMLPurifier/URIFilter/SafeIframe.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/SafeIframe.php
diff --git a/library/HTMLPurifier/URIParser.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIParser.php
index 0e7381a07..0e7381a07 100644
--- a/library/HTMLPurifier/URIParser.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIParser.php
diff --git a/library/HTMLPurifier/URIScheme.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme.php
index fe9e82cf2..fe9e82cf2 100644
--- a/library/HTMLPurifier/URIScheme.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme.php
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/data.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/data.php
new file mode 100644
index 000000000..41c49d553
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/data.php
@@ -0,0 +1,136 @@
+<?php
+
+/**
+ * Implements data: URI for base64 encoded images supported by GD.
+ */
+class HTMLPurifier_URIScheme_data extends HTMLPurifier_URIScheme
+{
+ /**
+ * @type bool
+ */
+ public $browsable = true;
+
+ /**
+ * @type array
+ */
+ public $allowed_types = array(
+ // you better write validation code for other types if you
+ // decide to allow them
+ 'image/jpeg' => true,
+ 'image/gif' => true,
+ 'image/png' => true,
+ );
+ // this is actually irrelevant since we only write out the path
+ // component
+ /**
+ * @type bool
+ */
+ public $may_omit_host = true;
+
+ /**
+ * @param HTMLPurifier_URI $uri
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool
+ */
+ public function doValidate(&$uri, $config, $context)
+ {
+ $result = explode(',', $uri->path, 2);
+ $is_base64 = false;
+ $charset = null;
+ $content_type = null;
+ if (count($result) == 2) {
+ list($metadata, $data) = $result;
+ // do some legwork on the metadata
+ $metas = explode(';', $metadata);
+ while (!empty($metas)) {
+ $cur = array_shift($metas);
+ if ($cur == 'base64') {
+ $is_base64 = true;
+ break;
+ }
+ if (substr($cur, 0, 8) == 'charset=') {
+ // doesn't match if there are arbitrary spaces, but
+ // whatever dude
+ if ($charset !== null) {
+ continue;
+ } // garbage
+ $charset = substr($cur, 8); // not used
+ } else {
+ if ($content_type !== null) {
+ continue;
+ } // garbage
+ $content_type = $cur;
+ }
+ }
+ } else {
+ $data = $result[0];
+ }
+ if ($content_type !== null && empty($this->allowed_types[$content_type])) {
+ return false;
+ }
+ if ($charset !== null) {
+ // error; we don't allow plaintext stuff
+ $charset = null;
+ }
+ $data = rawurldecode($data);
+ if ($is_base64) {
+ $raw_data = base64_decode($data);
+ } else {
+ $raw_data = $data;
+ }
+ if ( strlen($raw_data) < 12 ) {
+ // error; exif_imagetype throws exception with small files,
+ // and this likely indicates a corrupt URI/failed parse anyway
+ return false;
+ }
+ // XXX probably want to refactor this into a general mechanism
+ // for filtering arbitrary content types
+ if (function_exists('sys_get_temp_dir')) {
+ $file = tempnam(sys_get_temp_dir(), "");
+ } else {
+ $file = tempnam("/tmp", "");
+ }
+ file_put_contents($file, $raw_data);
+ if (function_exists('exif_imagetype')) {
+ $image_code = exif_imagetype($file);
+ unlink($file);
+ } elseif (function_exists('getimagesize')) {
+ set_error_handler(array($this, 'muteErrorHandler'));
+ $info = getimagesize($file);
+ restore_error_handler();
+ unlink($file);
+ if ($info == false) {
+ return false;
+ }
+ $image_code = $info[2];
+ } else {
+ trigger_error("could not find exif_imagetype or getimagesize functions", E_USER_ERROR);
+ }
+ $real_content_type = image_type_to_mime_type($image_code);
+ if ($real_content_type != $content_type) {
+ // we're nice guys; if the content type is something else we
+ // support, change it over
+ if (empty($this->allowed_types[$real_content_type])) {
+ return false;
+ }
+ $content_type = $real_content_type;
+ }
+ // ok, it's kosher, rewrite what we need
+ $uri->userinfo = null;
+ $uri->host = null;
+ $uri->port = null;
+ $uri->fragment = null;
+ $uri->query = null;
+ $uri->path = "$content_type;base64," . base64_encode($raw_data);
+ return true;
+ }
+
+ /**
+ * @param int $errno
+ * @param string $errstr
+ */
+ public function muteErrorHandler($errno, $errstr)
+ {
+ }
+}
diff --git a/library/HTMLPurifier/URIScheme/file.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/file.php
index 215be4ba8..215be4ba8 100644
--- a/library/HTMLPurifier/URIScheme/file.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/file.php
diff --git a/library/HTMLPurifier/URIScheme/ftp.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/ftp.php
index 1eb43ee5c..1eb43ee5c 100644
--- a/library/HTMLPurifier/URIScheme/ftp.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/ftp.php
diff --git a/library/HTMLPurifier/URIScheme/http.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/http.php
index ce69ec438..ce69ec438 100644
--- a/library/HTMLPurifier/URIScheme/http.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/http.php
diff --git a/library/HTMLPurifier/URIScheme/https.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/https.php
index 0e96882db..0e96882db 100644
--- a/library/HTMLPurifier/URIScheme/https.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/https.php
diff --git a/library/HTMLPurifier/URIScheme/mailto.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/mailto.php
index c3a6b602a..c3a6b602a 100644
--- a/library/HTMLPurifier/URIScheme/mailto.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/mailto.php
diff --git a/library/HTMLPurifier/URIScheme/news.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/news.php
index 7490927d6..7490927d6 100644
--- a/library/HTMLPurifier/URIScheme/news.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/news.php
diff --git a/library/HTMLPurifier/URIScheme/nntp.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/nntp.php
index f211d715e..f211d715e 100644
--- a/library/HTMLPurifier/URIScheme/nntp.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/nntp.php
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/tel.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/tel.php
new file mode 100644
index 000000000..8cd193352
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/tel.php
@@ -0,0 +1,46 @@
+<?php
+
+/**
+ * Validates tel (for phone numbers).
+ *
+ * The relevant specifications for this protocol are RFC 3966 and RFC 5341,
+ * but this class takes a much simpler approach: we normalize phone
+ * numbers so that they only include (possibly) a leading plus,
+ * and then any number of digits and x'es.
+ */
+
+class HTMLPurifier_URIScheme_tel extends HTMLPurifier_URIScheme
+{
+ /**
+ * @type bool
+ */
+ public $browsable = false;
+
+ /**
+ * @type bool
+ */
+ public $may_omit_host = true;
+
+ /**
+ * @param HTMLPurifier_URI $uri
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool
+ */
+ public function doValidate(&$uri, $config, $context)
+ {
+ $uri->userinfo = null;
+ $uri->host = null;
+ $uri->port = null;
+
+ // Delete all non-numeric characters, non-x characters
+ // from phone number, EXCEPT for a leading plus sign.
+ $uri->path = preg_replace('/(?!^\+)[^\dx]/', '',
+ // Normalize e(x)tension to lower-case
+ str_replace('X', 'x', $uri->path));
+
+ return true;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/URISchemeRegistry.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URISchemeRegistry.php
index 4ac8a0b76..4ac8a0b76 100644
--- a/library/HTMLPurifier/URISchemeRegistry.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URISchemeRegistry.php
diff --git a/library/HTMLPurifier/UnitConverter.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/UnitConverter.php
index 166f3bf30..166f3bf30 100644
--- a/library/HTMLPurifier/UnitConverter.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/UnitConverter.php
diff --git a/library/HTMLPurifier/VarParser.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/VarParser.php
index 50cba6910..50cba6910 100644
--- a/library/HTMLPurifier/VarParser.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/VarParser.php
diff --git a/library/HTMLPurifier/VarParser/Flexible.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/VarParser/Flexible.php
index b15016c5b..b15016c5b 100644
--- a/library/HTMLPurifier/VarParser/Flexible.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/VarParser/Flexible.php
diff --git a/library/HTMLPurifier/VarParser/Native.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/VarParser/Native.php
index f11c318ef..f11c318ef 100644
--- a/library/HTMLPurifier/VarParser/Native.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/VarParser/Native.php
diff --git a/library/HTMLPurifier/VarParserException.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/VarParserException.php
index 5df341495..5df341495 100644
--- a/library/HTMLPurifier/VarParserException.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/VarParserException.php
diff --git a/library/HTMLPurifier/Zipper.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Zipper.php
index 6e21ea070..6e21ea070 100644
--- a/library/HTMLPurifier/Zipper.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Zipper.php
diff --git a/vendor/ezyang/htmlpurifier/maintenance/.htaccess b/vendor/ezyang/htmlpurifier/maintenance/.htaccess
new file mode 100644
index 000000000..3a4288278
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/.htaccess
@@ -0,0 +1 @@
+Deny from all
diff --git a/vendor/ezyang/htmlpurifier/maintenance/PH5P.patch b/vendor/ezyang/htmlpurifier/maintenance/PH5P.patch
new file mode 100644
index 000000000..763709509
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/PH5P.patch
@@ -0,0 +1,102 @@
+--- C:\Users\Edward\Webs\htmlpurifier\maintenance\PH5P.php 2008-07-07 09:12:12.000000000 -0400
++++ C:\Users\Edward\Webs\htmlpurifier\maintenance/PH5P.new.php 2008-12-06 02:29:34.988800000 -0500
+@@ -65,7 +65,7 @@
+
+ public function __construct($data) {
+ $data = str_replace("\r\n", "\n", $data);
+- $date = str_replace("\r", null, $data);
++ $data = str_replace("\r", null, $data);
+
+ $this->data = $data;
+ $this->char = -1;
+@@ -211,7 +211,10 @@
+ // If nothing is returned, emit a U+0026 AMPERSAND character token.
+ // Otherwise, emit the character token that was returned.
+ $char = (!$entity) ? '&' : $entity;
+- $this->emitToken($char);
++ $this->emitToken(array(
++ 'type' => self::CHARACTR,
++ 'data' => $char
++ ));
+
+ // Finally, switch to the data state.
+ $this->state = 'data';
+@@ -708,7 +711,7 @@
+ } elseif($char === '&') {
+ /* U+0026 AMPERSAND (&)
+ Switch to the entity in attribute value state. */
+- $this->entityInAttributeValueState('non');
++ $this->entityInAttributeValueState();
+
+ } elseif($char === '>') {
+ /* U+003E GREATER-THAN SIGN (>)
+@@ -738,7 +741,8 @@
+ ? '&'
+ : $entity;
+
+- $this->emitToken($char);
++ $last = count($this->token['attr']) - 1;
++ $this->token['attr'][$last]['value'] .= $char;
+ }
+
+ private function bogusCommentState() {
+@@ -1066,6 +1070,11 @@
+ $this->char++;
+
+ if(in_array($id, $this->entities)) {
++ if ($e_name[$c-1] !== ';') {
++ if ($c < $len && $e_name[$c] == ';') {
++ $this->char++; // consume extra semicolon
++ }
++ }
+ $entity = $id;
+ break;
+ }
+@@ -2084,7 +2093,7 @@
+ /* Reconstruct the active formatting elements, if any. */
+ $this->reconstructActiveFormattingElements();
+
+- $this->insertElement($token);
++ $this->insertElement($token, true, true);
+ break;
+ }
+ break;
+@@ -3465,7 +3474,18 @@
+ }
+ }
+
+- private function insertElement($token, $append = true) {
++ private function insertElement($token, $append = true, $check = false) {
++ // Proprietary workaround for libxml2's limitations with tag names
++ if ($check) {
++ // Slightly modified HTML5 tag-name modification,
++ // removing anything that's not an ASCII letter, digit, or hyphen
++ $token['name'] = preg_replace('/[^a-z0-9-]/i', '', $token['name']);
++ // Remove leading hyphens and numbers
++ $token['name'] = ltrim($token['name'], '-0..9');
++ // In theory, this should ever be needed, but just in case
++ if ($token['name'] === '') $token['name'] = 'span'; // arbitrary generic choice
++ }
++
+ $el = $this->dom->createElement($token['name']);
+
+ foreach($token['attr'] as $attr) {
+@@ -3659,7 +3679,7 @@
+ }
+ }
+
+- private function generateImpliedEndTags(array $exclude = array()) {
++ private function generateImpliedEndTags($exclude = array()) {
+ /* When the steps below require the UA to generate implied end tags,
+ then, if the current node is a dd element, a dt element, an li element,
+ a p element, a td element, a th element, or a tr element, the UA must
+@@ -3673,7 +3693,8 @@
+ }
+ }
+
+- private function getElementCategory($name) {
++ private function getElementCategory($node) {
++ $name = $node->tagName;
+ if(in_array($name, $this->special))
+ return self::SPECIAL;
+
diff --git a/vendor/ezyang/htmlpurifier/maintenance/PH5P.php b/vendor/ezyang/htmlpurifier/maintenance/PH5P.php
new file mode 100644
index 000000000..9d83dcbf5
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/PH5P.php
@@ -0,0 +1,3889 @@
+<?php
+class HTML5
+{
+ private $data;
+ private $char;
+ private $EOF;
+ private $state;
+ private $tree;
+ private $token;
+ private $content_model;
+ private $escape = false;
+ private $entities = array('AElig;','AElig','AMP;','AMP','Aacute;','Aacute',
+ 'Acirc;','Acirc','Agrave;','Agrave','Alpha;','Aring;','Aring','Atilde;',
+ 'Atilde','Auml;','Auml','Beta;','COPY;','COPY','Ccedil;','Ccedil','Chi;',
+ 'Dagger;','Delta;','ETH;','ETH','Eacute;','Eacute','Ecirc;','Ecirc','Egrave;',
+ 'Egrave','Epsilon;','Eta;','Euml;','Euml','GT;','GT','Gamma;','Iacute;',
+ 'Iacute','Icirc;','Icirc','Igrave;','Igrave','Iota;','Iuml;','Iuml','Kappa;',
+ 'LT;','LT','Lambda;','Mu;','Ntilde;','Ntilde','Nu;','OElig;','Oacute;',
+ 'Oacute','Ocirc;','Ocirc','Ograve;','Ograve','Omega;','Omicron;','Oslash;',
+ 'Oslash','Otilde;','Otilde','Ouml;','Ouml','Phi;','Pi;','Prime;','Psi;',
+ 'QUOT;','QUOT','REG;','REG','Rho;','Scaron;','Sigma;','THORN;','THORN',
+ 'TRADE;','Tau;','Theta;','Uacute;','Uacute','Ucirc;','Ucirc','Ugrave;',
+ 'Ugrave','Upsilon;','Uuml;','Uuml','Xi;','Yacute;','Yacute','Yuml;','Zeta;',
+ 'aacute;','aacute','acirc;','acirc','acute;','acute','aelig;','aelig',
+ 'agrave;','agrave','alefsym;','alpha;','amp;','amp','and;','ang;','apos;',
+ 'aring;','aring','asymp;','atilde;','atilde','auml;','auml','bdquo;','beta;',
+ 'brvbar;','brvbar','bull;','cap;','ccedil;','ccedil','cedil;','cedil',
+ 'cent;','cent','chi;','circ;','clubs;','cong;','copy;','copy','crarr;',
+ 'cup;','curren;','curren','dArr;','dagger;','darr;','deg;','deg','delta;',
+ 'diams;','divide;','divide','eacute;','eacute','ecirc;','ecirc','egrave;',
+ 'egrave','empty;','emsp;','ensp;','epsilon;','equiv;','eta;','eth;','eth',
+ 'euml;','euml','euro;','exist;','fnof;','forall;','frac12;','frac12',
+ 'frac14;','frac14','frac34;','frac34','frasl;','gamma;','ge;','gt;','gt',
+ 'hArr;','harr;','hearts;','hellip;','iacute;','iacute','icirc;','icirc',
+ 'iexcl;','iexcl','igrave;','igrave','image;','infin;','int;','iota;',
+ 'iquest;','iquest','isin;','iuml;','iuml','kappa;','lArr;','lambda;','lang;',
+ 'laquo;','laquo','larr;','lceil;','ldquo;','le;','lfloor;','lowast;','loz;',
+ 'lrm;','lsaquo;','lsquo;','lt;','lt','macr;','macr','mdash;','micro;','micro',
+ 'middot;','middot','minus;','mu;','nabla;','nbsp;','nbsp','ndash;','ne;',
+ 'ni;','not;','not','notin;','nsub;','ntilde;','ntilde','nu;','oacute;',
+ 'oacute','ocirc;','ocirc','oelig;','ograve;','ograve','oline;','omega;',
+ 'omicron;','oplus;','or;','ordf;','ordf','ordm;','ordm','oslash;','oslash',
+ 'otilde;','otilde','otimes;','ouml;','ouml','para;','para','part;','permil;',
+ 'perp;','phi;','pi;','piv;','plusmn;','plusmn','pound;','pound','prime;',
+ 'prod;','prop;','psi;','quot;','quot','rArr;','radic;','rang;','raquo;',
+ 'raquo','rarr;','rceil;','rdquo;','real;','reg;','reg','rfloor;','rho;',
+ 'rlm;','rsaquo;','rsquo;','sbquo;','scaron;','sdot;','sect;','sect','shy;',
+ 'shy','sigma;','sigmaf;','sim;','spades;','sub;','sube;','sum;','sup1;',
+ 'sup1','sup2;','sup2','sup3;','sup3','sup;','supe;','szlig;','szlig','tau;',
+ 'there4;','theta;','thetasym;','thinsp;','thorn;','thorn','tilde;','times;',
+ 'times','trade;','uArr;','uacute;','uacute','uarr;','ucirc;','ucirc',
+ 'ugrave;','ugrave','uml;','uml','upsih;','upsilon;','uuml;','uuml','weierp;',
+ 'xi;','yacute;','yacute','yen;','yen','yuml;','yuml','zeta;','zwj;','zwnj;');
+
+ const PCDATA = 0;
+ const RCDATA = 1;
+ const CDATA = 2;
+ const PLAINTEXT = 3;
+
+ const DOCTYPE = 0;
+ const STARTTAG = 1;
+ const ENDTAG = 2;
+ const COMMENT = 3;
+ const CHARACTR = 4;
+ const EOF = 5;
+
+ public function __construct($data)
+ {
+ $data = str_replace("\r\n", "\n", $data);
+ $date = str_replace("\r", null, $data);
+
+ $this->data = $data;
+ $this->char = -1;
+ $this->EOF = strlen($data);
+ $this->tree = new HTML5TreeConstructer;
+ $this->content_model = self::PCDATA;
+
+ $this->state = 'data';
+
+ while($this->state !== null) {
+ $this->{$this->state.'State'}();
+ }
+ }
+
+ public function save()
+ {
+ return $this->tree->save();
+ }
+
+ private function char()
+ {
+ return ($this->char < $this->EOF)
+ ? $this->data[$this->char]
+ : false;
+ }
+
+ private function character($s, $l = 0)
+ {
+ if($s + $l < $this->EOF) {
+ if($l === 0) {
+ return $this->data[$s];
+ } else {
+ return substr($this->data, $s, $l);
+ }
+ }
+ }
+
+ private function characters($char_class, $start)
+ {
+ return preg_replace('#^(['.$char_class.']+).*#s', '\\1', substr($this->data, $start));
+ }
+
+ private function dataState()
+ {
+ // Consume the next input character
+ $this->char++;
+ $char = $this->char();
+
+ if($char === '&' && ($this->content_model === self::PCDATA || $this->content_model === self::RCDATA)) {
+ /* U+0026 AMPERSAND (&)
+ When the content model flag is set to one of the PCDATA or RCDATA
+ states: switch to the entity data state. Otherwise: treat it as per
+ the "anything else" entry below. */
+ $this->state = 'entityData';
+
+ } elseif($char === '-') {
+ /* If the content model flag is set to either the RCDATA state or
+ the CDATA state, and the escape flag is false, and there are at
+ least three characters before this one in the input stream, and the
+ last four characters in the input stream, including this one, are
+ U+003C LESS-THAN SIGN, U+0021 EXCLAMATION MARK, U+002D HYPHEN-MINUS,
+ and U+002D HYPHEN-MINUS ("<!--"), then set the escape flag to true. */
+ if(($this->content_model === self::RCDATA || $this->content_model ===
+ self::CDATA) && $this->escape === false &&
+ $this->char >= 3 && $this->character($this->char - 4, 4) === '<!--') {
+ $this->escape = true;
+ }
+
+ /* In any case, emit the input character as a character token. Stay
+ in the data state. */
+ $this->emitToken(array(
+ 'type' => self::CHARACTR,
+ 'data' => $char
+ ));
+
+ /* U+003C LESS-THAN SIGN (<) */
+ } elseif($char === '<' && ($this->content_model === self::PCDATA ||
+ (($this->content_model === self::RCDATA ||
+ $this->content_model === self::CDATA) && $this->escape === false))) {
+ /* When the content model flag is set to the PCDATA state: switch
+ to the tag open state.
+
+ When the content model flag is set to either the RCDATA state or
+ the CDATA state and the escape flag is false: switch to the tag
+ open state.
+
+ Otherwise: treat it as per the "anything else" entry below. */
+ $this->state = 'tagOpen';
+
+ /* U+003E GREATER-THAN SIGN (>) */
+ } elseif($char === '>') {
+ /* If the content model flag is set to either the RCDATA state or
+ the CDATA state, and the escape flag is true, and the last three
+ characters in the input stream including this one are U+002D
+ HYPHEN-MINUS, U+002D HYPHEN-MINUS, U+003E GREATER-THAN SIGN ("-->"),
+ set the escape flag to false. */
+ if(($this->content_model === self::RCDATA ||
+ $this->content_model === self::CDATA) && $this->escape === true &&
+ $this->character($this->char, 3) === '-->') {
+ $this->escape = false;
+ }
+
+ /* In any case, emit the input character as a character token.
+ Stay in the data state. */
+ $this->emitToken(array(
+ 'type' => self::CHARACTR,
+ 'data' => $char
+ ));
+
+ } elseif($this->char === $this->EOF) {
+ /* EOF
+ Emit an end-of-file token. */
+ $this->EOF();
+
+ } elseif($this->content_model === self::PLAINTEXT) {
+ /* When the content model flag is set to the PLAINTEXT state
+ THIS DIFFERS GREATLY FROM THE SPEC: Get the remaining characters of
+ the text and emit it as a character token. */
+ $this->emitToken(array(
+ 'type' => self::CHARACTR,
+ 'data' => substr($this->data, $this->char)
+ ));
+
+ $this->EOF();
+
+ } else {
+ /* Anything else
+ THIS DIFFERS GREATLY FROM THE SPEC: Get as many character that
+ otherwise would also be treated as a character token and emit it
+ as a single character token. Stay in the data state. */
+ $len = strcspn($this->data, '<&', $this->char);
+ $char = substr($this->data, $this->char, $len);
+ $this->char += $len - 1;
+
+ $this->emitToken(array(
+ 'type' => self::CHARACTR,
+ 'data' => $char
+ ));
+
+ $this->state = 'data';
+ }
+ }
+
+ private function entityDataState()
+ {
+ // Attempt to consume an entity.
+ $entity = $this->entity();
+
+ // If nothing is returned, emit a U+0026 AMPERSAND character token.
+ // Otherwise, emit the character token that was returned.
+ $char = (!$entity) ? '&' : $entity;
+ $this->emitToken($char);
+
+ // Finally, switch to the data state.
+ $this->state = 'data';
+ }
+
+ private function tagOpenState()
+ {
+ switch($this->content_model) {
+ case self::RCDATA:
+ case self::CDATA:
+ /* If the next input character is a U+002F SOLIDUS (/) character,
+ consume it and switch to the close tag open state. If the next
+ input character is not a U+002F SOLIDUS (/) character, emit a
+ U+003C LESS-THAN SIGN character token and switch to the data
+ state to process the next input character. */
+ if($this->character($this->char + 1) === '/') {
+ $this->char++;
+ $this->state = 'closeTagOpen';
+
+ } else {
+ $this->emitToken(array(
+ 'type' => self::CHARACTR,
+ 'data' => '<'
+ ));
+
+ $this->state = 'data';
+ }
+ break;
+
+ case self::PCDATA:
+ // If the content model flag is set to the PCDATA state
+ // Consume the next input character:
+ $this->char++;
+ $char = $this->char();
+
+ if($char === '!') {
+ /* U+0021 EXCLAMATION MARK (!)
+ Switch to the markup declaration open state. */
+ $this->state = 'markupDeclarationOpen';
+
+ } elseif($char === '/') {
+ /* U+002F SOLIDUS (/)
+ Switch to the close tag open state. */
+ $this->state = 'closeTagOpen';
+
+ } elseif(preg_match('/^[A-Za-z]$/', $char)) {
+ /* U+0041 LATIN LETTER A through to U+005A LATIN LETTER Z
+ Create a new start tag token, set its tag name to the lowercase
+ version of the input character (add 0x0020 to the character's code
+ point), then switch to the tag name state. (Don't emit the token
+ yet; further details will be filled in before it is emitted.) */
+ $this->token = array(
+ 'name' => strtolower($char),
+ 'type' => self::STARTTAG,
+ 'attr' => array()
+ );
+
+ $this->state = 'tagName';
+
+ } elseif($char === '>') {
+ /* U+003E GREATER-THAN SIGN (>)
+ Parse error. Emit a U+003C LESS-THAN SIGN character token and a
+ U+003E GREATER-THAN SIGN character token. Switch to the data state. */
+ $this->emitToken(array(
+ 'type' => self::CHARACTR,
+ 'data' => '<>'
+ ));
+
+ $this->state = 'data';
+
+ } elseif($char === '?') {
+ /* U+003F QUESTION MARK (?)
+ Parse error. Switch to the bogus comment state. */
+ $this->state = 'bogusComment';
+
+ } else {
+ /* Anything else
+ Parse error. Emit a U+003C LESS-THAN SIGN character token and
+ reconsume the current input character in the data state. */
+ $this->emitToken(array(
+ 'type' => self::CHARACTR,
+ 'data' => '<'
+ ));
+
+ $this->char--;
+ $this->state = 'data';
+ }
+ break;
+ }
+ }
+
+ private function closeTagOpenState()
+ {
+ $next_node = strtolower($this->characters('A-Za-z', $this->char + 1));
+ $the_same = count($this->tree->stack) > 0 && $next_node === end($this->tree->stack)->nodeName;
+
+ if(($this->content_model === self::RCDATA || $this->content_model === self::CDATA) &&
+ (!$the_same || ($the_same && (!preg_match('/[\t\n\x0b\x0c >\/]/',
+ $this->character($this->char + 1 + strlen($next_node))) || $this->EOF === $this->char)))) {
+ /* If the content model flag is set to the RCDATA or CDATA states then
+ examine the next few characters. If they do not match the tag name of
+ the last start tag token emitted (case insensitively), or if they do but
+ they are not immediately followed by one of the following characters:
+ * U+0009 CHARACTER TABULATION
+ * U+000A LINE FEED (LF)
+ * U+000B LINE TABULATION
+ * U+000C FORM FEED (FF)
+ * U+0020 SPACE
+ * U+003E GREATER-THAN SIGN (>)
+ * U+002F SOLIDUS (/)
+ * EOF
+ ...then there is a parse error. Emit a U+003C LESS-THAN SIGN character
+ token, a U+002F SOLIDUS character token, and switch to the data state
+ to process the next input character. */
+ $this->emitToken(array(
+ 'type' => self::CHARACTR,
+ 'data' => '</'
+ ));
+
+ $this->state = 'data';
+
+ } else {
+ /* Otherwise, if the content model flag is set to the PCDATA state,
+ or if the next few characters do match that tag name, consume the
+ next input character: */
+ $this->char++;
+ $char = $this->char();
+
+ if(preg_match('/^[A-Za-z]$/', $char)) {
+ /* U+0041 LATIN LETTER A through to U+005A LATIN LETTER Z
+ Create a new end tag token, set its tag name to the lowercase version
+ of the input character (add 0x0020 to the character's code point), then
+ switch to the tag name state. (Don't emit the token yet; further details
+ will be filled in before it is emitted.) */
+ $this->token = array(
+ 'name' => strtolower($char),
+ 'type' => self::ENDTAG
+ );
+
+ $this->state = 'tagName';
+
+ } elseif($char === '>') {
+ /* U+003E GREATER-THAN SIGN (>)
+ Parse error. Switch to the data state. */
+ $this->state = 'data';
+
+ } elseif($this->char === $this->EOF) {
+ /* EOF
+ Parse error. Emit a U+003C LESS-THAN SIGN character token and a U+002F
+ SOLIDUS character token. Reconsume the EOF character in the data state. */
+ $this->emitToken(array(
+ 'type' => self::CHARACTR,
+ 'data' => '</'
+ ));
+
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ /* Parse error. Switch to the bogus comment state. */
+ $this->state = 'bogusComment';
+ }
+ }
+ }
+
+ private function tagNameState()
+ {
+ // Consume the next input character:
+ $this->char++;
+ $char = $this->character($this->char);
+
+ if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
+ /* U+0009 CHARACTER TABULATION
+ U+000A LINE FEED (LF)
+ U+000B LINE TABULATION
+ U+000C FORM FEED (FF)
+ U+0020 SPACE
+ Switch to the before attribute name state. */
+ $this->state = 'beforeAttributeName';
+
+ } elseif($char === '>') {
+ /* U+003E GREATER-THAN SIGN (>)
+ Emit the current tag token. Switch to the data state. */
+ $this->emitToken($this->token);
+ $this->state = 'data';
+
+ } elseif($this->char === $this->EOF) {
+ /* EOF
+ Parse error. Emit the current tag token. Reconsume the EOF
+ character in the data state. */
+ $this->emitToken($this->token);
+
+ $this->char--;
+ $this->state = 'data';
+
+ } elseif($char === '/') {
+ /* U+002F SOLIDUS (/)
+ Parse error unless this is a permitted slash. Switch to the before
+ attribute name state. */
+ $this->state = 'beforeAttributeName';
+
+ } else {
+ /* Anything else
+ Append the current input character to the current tag token's tag name.
+ Stay in the tag name state. */
+ $this->token['name'] .= strtolower($char);
+ $this->state = 'tagName';
+ }
+ }
+
+ private function beforeAttributeNameState()
+ {
+ // Consume the next input character:
+ $this->char++;
+ $char = $this->character($this->char);
+
+ if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
+ /* U+0009 CHARACTER TABULATION
+ U+000A LINE FEED (LF)
+ U+000B LINE TABULATION
+ U+000C FORM FEED (FF)
+ U+0020 SPACE
+ Stay in the before attribute name state. */
+ $this->state = 'beforeAttributeName';
+
+ } elseif($char === '>') {
+ /* U+003E GREATER-THAN SIGN (>)
+ Emit the current tag token. Switch to the data state. */
+ $this->emitToken($this->token);
+ $this->state = 'data';
+
+ } elseif($char === '/') {
+ /* U+002F SOLIDUS (/)
+ Parse error unless this is a permitted slash. Stay in the before
+ attribute name state. */
+ $this->state = 'beforeAttributeName';
+
+ } elseif($this->char === $this->EOF) {
+ /* EOF
+ Parse error. Emit the current tag token. Reconsume the EOF
+ character in the data state. */
+ $this->emitToken($this->token);
+
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ /* Anything else
+ Start a new attribute in the current tag token. Set that attribute's
+ name to the current input character, and its value to the empty string.
+ Switch to the attribute name state. */
+ $this->token['attr'][] = array(
+ 'name' => strtolower($char),
+ 'value' => null
+ );
+
+ $this->state = 'attributeName';
+ }
+ }
+
+ private function attributeNameState()
+ {
+ // Consume the next input character:
+ $this->char++;
+ $char = $this->character($this->char);
+
+ if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
+ /* U+0009 CHARACTER TABULATION
+ U+000A LINE FEED (LF)
+ U+000B LINE TABULATION
+ U+000C FORM FEED (FF)
+ U+0020 SPACE
+ Stay in the before attribute name state. */
+ $this->state = 'afterAttributeName';
+
+ } elseif($char === '=') {
+ /* U+003D EQUALS SIGN (=)
+ Switch to the before attribute value state. */
+ $this->state = 'beforeAttributeValue';
+
+ } elseif($char === '>') {
+ /* U+003E GREATER-THAN SIGN (>)
+ Emit the current tag token. Switch to the data state. */
+ $this->emitToken($this->token);
+ $this->state = 'data';
+
+ } elseif($char === '/' && $this->character($this->char + 1) !== '>') {
+ /* U+002F SOLIDUS (/)
+ Parse error unless this is a permitted slash. Switch to the before
+ attribute name state. */
+ $this->state = 'beforeAttributeName';
+
+ } elseif($this->char === $this->EOF) {
+ /* EOF
+ Parse error. Emit the current tag token. Reconsume the EOF
+ character in the data state. */
+ $this->emitToken($this->token);
+
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ /* Anything else
+ Append the current input character to the current attribute's name.
+ Stay in the attribute name state. */
+ $last = count($this->token['attr']) - 1;
+ $this->token['attr'][$last]['name'] .= strtolower($char);
+
+ $this->state = 'attributeName';
+ }
+ }
+
+ private function afterAttributeNameState()
+ {
+ // Consume the next input character:
+ $this->char++;
+ $char = $this->character($this->char);
+
+ if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
+ /* U+0009 CHARACTER TABULATION
+ U+000A LINE FEED (LF)
+ U+000B LINE TABULATION
+ U+000C FORM FEED (FF)
+ U+0020 SPACE
+ Stay in the after attribute name state. */
+ $this->state = 'afterAttributeName';
+
+ } elseif($char === '=') {
+ /* U+003D EQUALS SIGN (=)
+ Switch to the before attribute value state. */
+ $this->state = 'beforeAttributeValue';
+
+ } elseif($char === '>') {
+ /* U+003E GREATER-THAN SIGN (>)
+ Emit the current tag token. Switch to the data state. */
+ $this->emitToken($this->token);
+ $this->state = 'data';
+
+ } elseif($char === '/' && $this->character($this->char + 1) !== '>') {
+ /* U+002F SOLIDUS (/)
+ Parse error unless this is a permitted slash. Switch to the
+ before attribute name state. */
+ $this->state = 'beforeAttributeName';
+
+ } elseif($this->char === $this->EOF) {
+ /* EOF
+ Parse error. Emit the current tag token. Reconsume the EOF
+ character in the data state. */
+ $this->emitToken($this->token);
+
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ /* Anything else
+ Start a new attribute in the current tag token. Set that attribute's
+ name to the current input character, and its value to the empty string.
+ Switch to the attribute name state. */
+ $this->token['attr'][] = array(
+ 'name' => strtolower($char),
+ 'value' => null
+ );
+
+ $this->state = 'attributeName';
+ }
+ }
+
+ private function beforeAttributeValueState()
+ {
+ // Consume the next input character:
+ $this->char++;
+ $char = $this->character($this->char);
+
+ if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
+ /* U+0009 CHARACTER TABULATION
+ U+000A LINE FEED (LF)
+ U+000B LINE TABULATION
+ U+000C FORM FEED (FF)
+ U+0020 SPACE
+ Stay in the before attribute value state. */
+ $this->state = 'beforeAttributeValue';
+
+ } elseif($char === '"') {
+ /* U+0022 QUOTATION MARK (")
+ Switch to the attribute value (double-quoted) state. */
+ $this->state = 'attributeValueDoubleQuoted';
+
+ } elseif($char === '&') {
+ /* U+0026 AMPERSAND (&)
+ Switch to the attribute value (unquoted) state and reconsume
+ this input character. */
+ $this->char--;
+ $this->state = 'attributeValueUnquoted';
+
+ } elseif($char === '\'') {
+ /* U+0027 APOSTROPHE (')
+ Switch to the attribute value (single-quoted) state. */
+ $this->state = 'attributeValueSingleQuoted';
+
+ } elseif($char === '>') {
+ /* U+003E GREATER-THAN SIGN (>)
+ Emit the current tag token. Switch to the data state. */
+ $this->emitToken($this->token);
+ $this->state = 'data';
+
+ } else {
+ /* Anything else
+ Append the current input character to the current attribute's value.
+ Switch to the attribute value (unquoted) state. */
+ $last = count($this->token['attr']) - 1;
+ $this->token['attr'][$last]['value'] .= $char;
+
+ $this->state = 'attributeValueUnquoted';
+ }
+ }
+
+ private function attributeValueDoubleQuotedState()
+ {
+ // Consume the next input character:
+ $this->char++;
+ $char = $this->character($this->char);
+
+ if($char === '"') {
+ /* U+0022 QUOTATION MARK (")
+ Switch to the before attribute name state. */
+ $this->state = 'beforeAttributeName';
+
+ } elseif($char === '&') {
+ /* U+0026 AMPERSAND (&)
+ Switch to the entity in attribute value state. */
+ $this->entityInAttributeValueState('double');
+
+ } elseif($this->char === $this->EOF) {
+ /* EOF
+ Parse error. Emit the current tag token. Reconsume the character
+ in the data state. */
+ $this->emitToken($this->token);
+
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ /* Anything else
+ Append the current input character to the current attribute's value.
+ Stay in the attribute value (double-quoted) state. */
+ $last = count($this->token['attr']) - 1;
+ $this->token['attr'][$last]['value'] .= $char;
+
+ $this->state = 'attributeValueDoubleQuoted';
+ }
+ }
+
+ private function attributeValueSingleQuotedState()
+ {
+ // Consume the next input character:
+ $this->char++;
+ $char = $this->character($this->char);
+
+ if($char === '\'') {
+ /* U+0022 QUOTATION MARK (')
+ Switch to the before attribute name state. */
+ $this->state = 'beforeAttributeName';
+
+ } elseif($char === '&') {
+ /* U+0026 AMPERSAND (&)
+ Switch to the entity in attribute value state. */
+ $this->entityInAttributeValueState('single');
+
+ } elseif($this->char === $this->EOF) {
+ /* EOF
+ Parse error. Emit the current tag token. Reconsume the character
+ in the data state. */
+ $this->emitToken($this->token);
+
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ /* Anything else
+ Append the current input character to the current attribute's value.
+ Stay in the attribute value (single-quoted) state. */
+ $last = count($this->token['attr']) - 1;
+ $this->token['attr'][$last]['value'] .= $char;
+
+ $this->state = 'attributeValueSingleQuoted';
+ }
+ }
+
+ private function attributeValueUnquotedState()
+ {
+ // Consume the next input character:
+ $this->char++;
+ $char = $this->character($this->char);
+
+ if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
+ /* U+0009 CHARACTER TABULATION
+ U+000A LINE FEED (LF)
+ U+000B LINE TABULATION
+ U+000C FORM FEED (FF)
+ U+0020 SPACE
+ Switch to the before attribute name state. */
+ $this->state = 'beforeAttributeName';
+
+ } elseif($char === '&') {
+ /* U+0026 AMPERSAND (&)
+ Switch to the entity in attribute value state. */
+ $this->entityInAttributeValueState('non');
+
+ } elseif($char === '>') {
+ /* U+003E GREATER-THAN SIGN (>)
+ Emit the current tag token. Switch to the data state. */
+ $this->emitToken($this->token);
+ $this->state = 'data';
+
+ } else {
+ /* Anything else
+ Append the current input character to the current attribute's value.
+ Stay in the attribute value (unquoted) state. */
+ $last = count($this->token['attr']) - 1;
+ $this->token['attr'][$last]['value'] .= $char;
+
+ $this->state = 'attributeValueUnquoted';
+ }
+ }
+
+ private function entityInAttributeValueState()
+ {
+ // Attempt to consume an entity.
+ $entity = $this->entity();
+
+ // If nothing is returned, append a U+0026 AMPERSAND character to the
+ // current attribute's value. Otherwise, emit the character token that
+ // was returned.
+ $char = (!$entity)
+ ? '&'
+ : $entity;
+
+ $this->emitToken($char);
+ }
+
+ private function bogusCommentState()
+ {
+ /* Consume every character up to the first U+003E GREATER-THAN SIGN
+ character (>) or the end of the file (EOF), whichever comes first. Emit
+ a comment token whose data is the concatenation of all the characters
+ starting from and including the character that caused the state machine
+ to switch into the bogus comment state, up to and including the last
+ consumed character before the U+003E character, if any, or up to the
+ end of the file otherwise. (If the comment was started by the end of
+ the file (EOF), the token is empty.) */
+ $data = $this->characters('^>', $this->char);
+ $this->emitToken(array(
+ 'data' => $data,
+ 'type' => self::COMMENT
+ ));
+
+ $this->char += strlen($data);
+
+ /* Switch to the data state. */
+ $this->state = 'data';
+
+ /* If the end of the file was reached, reconsume the EOF character. */
+ if($this->char === $this->EOF) {
+ $this->char = $this->EOF - 1;
+ }
+ }
+
+ private function markupDeclarationOpenState()
+ {
+ /* If the next two characters are both U+002D HYPHEN-MINUS (-)
+ characters, consume those two characters, create a comment token whose
+ data is the empty string, and switch to the comment state. */
+ if($this->character($this->char + 1, 2) === '--') {
+ $this->char += 2;
+ $this->state = 'comment';
+ $this->token = array(
+ 'data' => null,
+ 'type' => self::COMMENT
+ );
+
+ /* Otherwise if the next seven chacacters are a case-insensitive match
+ for the word "DOCTYPE", then consume those characters and switch to the
+ DOCTYPE state. */
+ } elseif(strtolower($this->character($this->char + 1, 7)) === 'doctype') {
+ $this->char += 7;
+ $this->state = 'doctype';
+
+ /* Otherwise, is is a parse error. Switch to the bogus comment state.
+ The next character that is consumed, if any, is the first character
+ that will be in the comment. */
+ } else {
+ $this->char++;
+ $this->state = 'bogusComment';
+ }
+ }
+
+ private function commentState()
+ {
+ /* Consume the next input character: */
+ $this->char++;
+ $char = $this->char();
+
+ /* U+002D HYPHEN-MINUS (-) */
+ if($char === '-') {
+ /* Switch to the comment dash state */
+ $this->state = 'commentDash';
+
+ /* EOF */
+ } elseif($this->char === $this->EOF) {
+ /* Parse error. Emit the comment token. Reconsume the EOF character
+ in the data state. */
+ $this->emitToken($this->token);
+ $this->char--;
+ $this->state = 'data';
+
+ /* Anything else */
+ } else {
+ /* Append the input character to the comment token's data. Stay in
+ the comment state. */
+ $this->token['data'] .= $char;
+ }
+ }
+
+ private function commentDashState()
+ {
+ /* Consume the next input character: */
+ $this->char++;
+ $char = $this->char();
+
+ /* U+002D HYPHEN-MINUS (-) */
+ if($char === '-') {
+ /* Switch to the comment end state */
+ $this->state = 'commentEnd';
+
+ /* EOF */
+ } elseif($this->char === $this->EOF) {
+ /* Parse error. Emit the comment token. Reconsume the EOF character
+ in the data state. */
+ $this->emitToken($this->token);
+ $this->char--;
+ $this->state = 'data';
+
+ /* Anything else */
+ } else {
+ /* Append a U+002D HYPHEN-MINUS (-) character and the input
+ character to the comment token's data. Switch to the comment state. */
+ $this->token['data'] .= '-'.$char;
+ $this->state = 'comment';
+ }
+ }
+
+ private function commentEndState()
+ {
+ /* Consume the next input character: */
+ $this->char++;
+ $char = $this->char();
+
+ if($char === '>') {
+ $this->emitToken($this->token);
+ $this->state = 'data';
+
+ } elseif($char === '-') {
+ $this->token['data'] .= '-';
+
+ } elseif($this->char === $this->EOF) {
+ $this->emitToken($this->token);
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ $this->token['data'] .= '--'.$char;
+ $this->state = 'comment';
+ }
+ }
+
+ private function doctypeState()
+ {
+ /* Consume the next input character: */
+ $this->char++;
+ $char = $this->char();
+
+ if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
+ $this->state = 'beforeDoctypeName';
+
+ } else {
+ $this->char--;
+ $this->state = 'beforeDoctypeName';
+ }
+ }
+
+ private function beforeDoctypeNameState()
+ {
+ /* Consume the next input character: */
+ $this->char++;
+ $char = $this->char();
+
+ if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
+ // Stay in the before DOCTYPE name state.
+
+ } elseif(preg_match('/^[a-z]$/', $char)) {
+ $this->token = array(
+ 'name' => strtoupper($char),
+ 'type' => self::DOCTYPE,
+ 'error' => true
+ );
+
+ $this->state = 'doctypeName';
+
+ } elseif($char === '>') {
+ $this->emitToken(array(
+ 'name' => null,
+ 'type' => self::DOCTYPE,
+ 'error' => true
+ ));
+
+ $this->state = 'data';
+
+ } elseif($this->char === $this->EOF) {
+ $this->emitToken(array(
+ 'name' => null,
+ 'type' => self::DOCTYPE,
+ 'error' => true
+ ));
+
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ $this->token = array(
+ 'name' => $char,
+ 'type' => self::DOCTYPE,
+ 'error' => true
+ );
+
+ $this->state = 'doctypeName';
+ }
+ }
+
+ private function doctypeNameState()
+ {
+ /* Consume the next input character: */
+ $this->char++;
+ $char = $this->char();
+
+ if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
+ $this->state = 'AfterDoctypeName';
+
+ } elseif($char === '>') {
+ $this->emitToken($this->token);
+ $this->state = 'data';
+
+ } elseif(preg_match('/^[a-z]$/', $char)) {
+ $this->token['name'] .= strtoupper($char);
+
+ } elseif($this->char === $this->EOF) {
+ $this->emitToken($this->token);
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ $this->token['name'] .= $char;
+ }
+
+ $this->token['error'] = ($this->token['name'] === 'HTML')
+ ? false
+ : true;
+ }
+
+ private function afterDoctypeNameState()
+ {
+ /* Consume the next input character: */
+ $this->char++;
+ $char = $this->char();
+
+ if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
+ // Stay in the DOCTYPE name state.
+
+ } elseif($char === '>') {
+ $this->emitToken($this->token);
+ $this->state = 'data';
+
+ } elseif($this->char === $this->EOF) {
+ $this->emitToken($this->token);
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ $this->token['error'] = true;
+ $this->state = 'bogusDoctype';
+ }
+ }
+
+ private function bogusDoctypeState()
+ {
+ /* Consume the next input character: */
+ $this->char++;
+ $char = $this->char();
+
+ if($char === '>') {
+ $this->emitToken($this->token);
+ $this->state = 'data';
+
+ } elseif($this->char === $this->EOF) {
+ $this->emitToken($this->token);
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ // Stay in the bogus DOCTYPE state.
+ }
+ }
+
+ private function entity()
+ {
+ $start = $this->char;
+
+ // This section defines how to consume an entity. This definition is
+ // used when parsing entities in text and in attributes.
+
+ // The behaviour depends on the identity of the next character (the
+ // one immediately after the U+0026 AMPERSAND character):
+
+ switch($this->character($this->char + 1)) {
+ // U+0023 NUMBER SIGN (#)
+ case '#':
+
+ // The behaviour further depends on the character after the
+ // U+0023 NUMBER SIGN:
+ switch($this->character($this->char + 1)) {
+ // U+0078 LATIN SMALL LETTER X
+ // U+0058 LATIN CAPITAL LETTER X
+ case 'x':
+ case 'X':
+ // Follow the steps below, but using the range of
+ // characters U+0030 DIGIT ZERO through to U+0039 DIGIT
+ // NINE, U+0061 LATIN SMALL LETTER A through to U+0066
+ // LATIN SMALL LETTER F, and U+0041 LATIN CAPITAL LETTER
+ // A, through to U+0046 LATIN CAPITAL LETTER F (in other
+ // words, 0-9, A-F, a-f).
+ $char = 1;
+ $char_class = '0-9A-Fa-f';
+ break;
+
+ // Anything else
+ default:
+ // Follow the steps below, but using the range of
+ // characters U+0030 DIGIT ZERO through to U+0039 DIGIT
+ // NINE (i.e. just 0-9).
+ $char = 0;
+ $char_class = '0-9';
+ break;
+ }
+
+ // Consume as many characters as match the range of characters
+ // given above.
+ $this->char++;
+ $e_name = $this->characters($char_class, $this->char + $char + 1);
+ $entity = $this->character($start, $this->char);
+ $cond = strlen($e_name) > 0;
+
+ // The rest of the parsing happens bellow.
+ break;
+
+ // Anything else
+ default:
+ // Consume the maximum number of characters possible, with the
+ // consumed characters case-sensitively matching one of the
+ // identifiers in the first column of the entities table.
+ $e_name = $this->characters('0-9A-Za-z;', $this->char + 1);
+ $len = strlen($e_name);
+
+ for($c = 1; $c <= $len; $c++) {
+ $id = substr($e_name, 0, $c);
+ $this->char++;
+
+ if(in_array($id, $this->entities)) {
+ $entity = $id;
+ break;
+ }
+ }
+
+ $cond = isset($entity);
+ // The rest of the parsing happens bellow.
+ break;
+ }
+
+ if(!$cond) {
+ // If no match can be made, then this is a parse error. No
+ // characters are consumed, and nothing is returned.
+ $this->char = $start;
+ return false;
+ }
+
+ // Return a character token for the character corresponding to the
+ // entity name (as given by the second column of the entities table).
+ return html_entity_decode('&'.$entity.';', ENT_QUOTES, 'UTF-8');
+ }
+
+ private function emitToken($token)
+ {
+ $emit = $this->tree->emitToken($token);
+
+ if(is_int($emit)) {
+ $this->content_model = $emit;
+
+ } elseif($token['type'] === self::ENDTAG) {
+ $this->content_model = self::PCDATA;
+ }
+ }
+
+ private function EOF()
+ {
+ $this->state = null;
+ $this->tree->emitToken(array(
+ 'type' => self::EOF
+ ));
+ }
+}
+
+class HTML5TreeConstructer
+{
+ public $stack = array();
+
+ private $phase;
+ private $mode;
+ private $dom;
+ private $foster_parent = null;
+ private $a_formatting = array();
+
+ private $head_pointer = null;
+ private $form_pointer = null;
+
+ private $scoping = array('button','caption','html','marquee','object','table','td','th');
+ private $formatting = array('a','b','big','em','font','i','nobr','s','small','strike','strong','tt','u');
+ private $special = array('address','area','base','basefont','bgsound',
+ 'blockquote','body','br','center','col','colgroup','dd','dir','div','dl',
+ 'dt','embed','fieldset','form','frame','frameset','h1','h2','h3','h4','h5',
+ 'h6','head','hr','iframe','image','img','input','isindex','li','link',
+ 'listing','menu','meta','noembed','noframes','noscript','ol','optgroup',
+ 'option','p','param','plaintext','pre','script','select','spacer','style',
+ 'tbody','textarea','tfoot','thead','title','tr','ul','wbr');
+
+ // The different phases.
+ const INIT_PHASE = 0;
+ const ROOT_PHASE = 1;
+ const MAIN_PHASE = 2;
+ const END_PHASE = 3;
+
+ // The different insertion modes for the main phase.
+ const BEFOR_HEAD = 0;
+ const IN_HEAD = 1;
+ const AFTER_HEAD = 2;
+ const IN_BODY = 3;
+ const IN_TABLE = 4;
+ const IN_CAPTION = 5;
+ const IN_CGROUP = 6;
+ const IN_TBODY = 7;
+ const IN_ROW = 8;
+ const IN_CELL = 9;
+ const IN_SELECT = 10;
+ const AFTER_BODY = 11;
+ const IN_FRAME = 12;
+ const AFTR_FRAME = 13;
+
+ // The different types of elements.
+ const SPECIAL = 0;
+ const SCOPING = 1;
+ const FORMATTING = 2;
+ const PHRASING = 3;
+
+ const MARKER = 0;
+
+ public function __construct()
+ {
+ $this->phase = self::INIT_PHASE;
+ $this->mode = self::BEFOR_HEAD;
+ $this->dom = new DOMDocument;
+
+ $this->dom->encoding = 'UTF-8';
+ $this->dom->preserveWhiteSpace = true;
+ $this->dom->substituteEntities = true;
+ $this->dom->strictErrorChecking = false;
+ }
+
+ // Process tag tokens
+ public function emitToken($token)
+ {
+ switch($this->phase) {
+ case self::INIT_PHASE: return $this->initPhase($token); break;
+ case self::ROOT_PHASE: return $this->rootElementPhase($token); break;
+ case self::MAIN_PHASE: return $this->mainPhase($token); break;
+ case self::END_PHASE : return $this->trailingEndPhase($token); break;
+ }
+ }
+
+ private function initPhase($token)
+ {
+ /* Initially, the tree construction stage must handle each token
+ emitted from the tokenisation stage as follows: */
+
+ /* A DOCTYPE token that is marked as being in error
+ A comment token
+ A start tag token
+ An end tag token
+ A character token that is not one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE
+ An end-of-file token */
+ if((isset($token['error']) && $token['error']) ||
+ $token['type'] === HTML5::COMMENT ||
+ $token['type'] === HTML5::STARTTAG ||
+ $token['type'] === HTML5::ENDTAG ||
+ $token['type'] === HTML5::EOF ||
+ ($token['type'] === HTML5::CHARACTR && isset($token['data']) &&
+ !preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data']))) {
+ /* This specification does not define how to handle this case. In
+ particular, user agents may ignore the entirety of this specification
+ altogether for such documents, and instead invoke special parse modes
+ with a greater emphasis on backwards compatibility. */
+
+ $this->phase = self::ROOT_PHASE;
+ return $this->rootElementPhase($token);
+
+ /* A DOCTYPE token marked as being correct */
+ } elseif(isset($token['error']) && !$token['error']) {
+ /* Append a DocumentType node to the Document node, with the name
+ attribute set to the name given in the DOCTYPE token (which will be
+ "HTML"), and the other attributes specific to DocumentType objects
+ set to null, empty lists, or the empty string as appropriate. */
+ $doctype = new DOMDocumentType(null, null, 'HTML');
+
+ /* Then, switch to the root element phase of the tree construction
+ stage. */
+ $this->phase = self::ROOT_PHASE;
+
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE */
+ } elseif(isset($token['data']) && preg_match('/^[\t\n\x0b\x0c ]+$/',
+ $token['data'])) {
+ /* Append that character to the Document node. */
+ $text = $this->dom->createTextNode($token['data']);
+ $this->dom->appendChild($text);
+ }
+ }
+
+ private function rootElementPhase($token)
+ {
+ /* After the initial phase, as each token is emitted from the tokenisation
+ stage, it must be processed as described in this section. */
+
+ /* A DOCTYPE token */
+ if($token['type'] === HTML5::DOCTYPE) {
+ // Parse error. Ignore the token.
+
+ /* A comment token */
+ } elseif($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the Document object with the data
+ attribute set to the data given in the comment token. */
+ $comment = $this->dom->createComment($token['data']);
+ $this->dom->appendChild($comment);
+
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE */
+ } elseif($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) {
+ /* Append that character to the Document node. */
+ $text = $this->dom->createTextNode($token['data']);
+ $this->dom->appendChild($text);
+
+ /* A character token that is not one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED
+ (FF), or U+0020 SPACE
+ A start tag token
+ An end tag token
+ An end-of-file token */
+ } elseif(($token['type'] === HTML5::CHARACTR &&
+ !preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) ||
+ $token['type'] === HTML5::STARTTAG ||
+ $token['type'] === HTML5::ENDTAG ||
+ $token['type'] === HTML5::EOF) {
+ /* Create an HTMLElement node with the tag name html, in the HTML
+ namespace. Append it to the Document object. Switch to the main
+ phase and reprocess the current token. */
+ $html = $this->dom->createElement('html');
+ $this->dom->appendChild($html);
+ $this->stack[] = $html;
+
+ $this->phase = self::MAIN_PHASE;
+ return $this->mainPhase($token);
+ }
+ }
+
+ private function mainPhase($token)
+ {
+ /* Tokens in the main phase must be handled as follows: */
+
+ /* A DOCTYPE token */
+ if($token['type'] === HTML5::DOCTYPE) {
+ // Parse error. Ignore the token.
+
+ /* A start tag token with the tag name "html" */
+ } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'html') {
+ /* If this start tag token was not the first start tag token, then
+ it is a parse error. */
+
+ /* For each attribute on the token, check to see if the attribute
+ is already present on the top element of the stack of open elements.
+ If it is not, add the attribute and its corresponding value to that
+ element. */
+ foreach($token['attr'] as $attr) {
+ if(!$this->stack[0]->hasAttribute($attr['name'])) {
+ $this->stack[0]->setAttribute($attr['name'], $attr['value']);
+ }
+ }
+
+ /* An end-of-file token */
+ } elseif($token['type'] === HTML5::EOF) {
+ /* Generate implied end tags. */
+ $this->generateImpliedEndTags();
+
+ /* Anything else. */
+ } else {
+ /* Depends on the insertion mode: */
+ switch($this->mode) {
+ case self::BEFOR_HEAD: return $this->beforeHead($token); break;
+ case self::IN_HEAD: return $this->inHead($token); break;
+ case self::AFTER_HEAD: return $this->afterHead($token); break;
+ case self::IN_BODY: return $this->inBody($token); break;
+ case self::IN_TABLE: return $this->inTable($token); break;
+ case self::IN_CAPTION: return $this->inCaption($token); break;
+ case self::IN_CGROUP: return $this->inColumnGroup($token); break;
+ case self::IN_TBODY: return $this->inTableBody($token); break;
+ case self::IN_ROW: return $this->inRow($token); break;
+ case self::IN_CELL: return $this->inCell($token); break;
+ case self::IN_SELECT: return $this->inSelect($token); break;
+ case self::AFTER_BODY: return $this->afterBody($token); break;
+ case self::IN_FRAME: return $this->inFrameset($token); break;
+ case self::AFTR_FRAME: return $this->afterFrameset($token); break;
+ case self::END_PHASE: return $this->trailingEndPhase($token); break;
+ }
+ }
+ }
+
+ private function beforeHead($token)
+ {
+ /* Handle the token as follows: */
+
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE */
+ if($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) {
+ /* Append the character to the current node. */
+ $this->insertText($token['data']);
+
+ /* A comment token */
+ } elseif($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the current node with the data attribute
+ set to the data given in the comment token. */
+ $this->insertComment($token['data']);
+
+ /* A start tag token with the tag name "head" */
+ } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'head') {
+ /* Create an element for the token, append the new element to the
+ current node and push it onto the stack of open elements. */
+ $element = $this->insertElement($token);
+
+ /* Set the head element pointer to this new element node. */
+ $this->head_pointer = $element;
+
+ /* Change the insertion mode to "in head". */
+ $this->mode = self::IN_HEAD;
+
+ /* A start tag token whose tag name is one of: "base", "link", "meta",
+ "script", "style", "title". Or an end tag with the tag name "html".
+ Or a character token that is not one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE. Or any other start tag token */
+ } elseif($token['type'] === HTML5::STARTTAG ||
+ ($token['type'] === HTML5::ENDTAG && $token['name'] === 'html') ||
+ ($token['type'] === HTML5::CHARACTR && !preg_match('/^[\t\n\x0b\x0c ]$/',
+ $token['data']))) {
+ /* Act as if a start tag token with the tag name "head" and no
+ attributes had been seen, then reprocess the current token. */
+ $this->beforeHead(array(
+ 'name' => 'head',
+ 'type' => HTML5::STARTTAG,
+ 'attr' => array()
+ ));
+
+ return $this->inHead($token);
+
+ /* Any other end tag */
+ } elseif($token['type'] === HTML5::ENDTAG) {
+ /* Parse error. Ignore the token. */
+ }
+ }
+
+ private function inHead($token)
+ {
+ /* Handle the token as follows: */
+
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE.
+
+ THIS DIFFERS FROM THE SPEC: If the current node is either a title, style
+ or script element, append the character to the current node regardless
+ of its content. */
+ if(($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) || (
+ $token['type'] === HTML5::CHARACTR && in_array(end($this->stack)->nodeName,
+ array('title', 'style', 'script')))) {
+ /* Append the character to the current node. */
+ $this->insertText($token['data']);
+
+ /* A comment token */
+ } elseif($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the current node with the data attribute
+ set to the data given in the comment token. */
+ $this->insertComment($token['data']);
+
+ } elseif($token['type'] === HTML5::ENDTAG &&
+ in_array($token['name'], array('title', 'style', 'script'))) {
+ array_pop($this->stack);
+ return HTML5::PCDATA;
+
+ /* A start tag with the tag name "title" */
+ } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'title') {
+ /* Create an element for the token and append the new element to the
+ node pointed to by the head element pointer, or, if that is null
+ (innerHTML case), to the current node. */
+ if($this->head_pointer !== null) {
+ $element = $this->insertElement($token, false);
+ $this->head_pointer->appendChild($element);
+
+ } else {
+ $element = $this->insertElement($token);
+ }
+
+ /* Switch the tokeniser's content model flag to the RCDATA state. */
+ return HTML5::RCDATA;
+
+ /* A start tag with the tag name "style" */
+ } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'style') {
+ /* Create an element for the token and append the new element to the
+ node pointed to by the head element pointer, or, if that is null
+ (innerHTML case), to the current node. */
+ if($this->head_pointer !== null) {
+ $element = $this->insertElement($token, false);
+ $this->head_pointer->appendChild($element);
+
+ } else {
+ $this->insertElement($token);
+ }
+
+ /* Switch the tokeniser's content model flag to the CDATA state. */
+ return HTML5::CDATA;
+
+ /* A start tag with the tag name "script" */
+ } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'script') {
+ /* Create an element for the token. */
+ $element = $this->insertElement($token, false);
+ $this->head_pointer->appendChild($element);
+
+ /* Switch the tokeniser's content model flag to the CDATA state. */
+ return HTML5::CDATA;
+
+ /* A start tag with the tag name "base", "link", or "meta" */
+ } elseif($token['type'] === HTML5::STARTTAG && in_array($token['name'],
+ array('base', 'link', 'meta'))) {
+ /* Create an element for the token and append the new element to the
+ node pointed to by the head element pointer, or, if that is null
+ (innerHTML case), to the current node. */
+ if($this->head_pointer !== null) {
+ $element = $this->insertElement($token, false);
+ $this->head_pointer->appendChild($element);
+ array_pop($this->stack);
+
+ } else {
+ $this->insertElement($token);
+ }
+
+ /* An end tag with the tag name "head" */
+ } elseif($token['type'] === HTML5::ENDTAG && $token['name'] === 'head') {
+ /* If the current node is a head element, pop the current node off
+ the stack of open elements. */
+ if($this->head_pointer->isSameNode(end($this->stack))) {
+ array_pop($this->stack);
+
+ /* Otherwise, this is a parse error. */
+ } else {
+ // k
+ }
+
+ /* Change the insertion mode to "after head". */
+ $this->mode = self::AFTER_HEAD;
+
+ /* A start tag with the tag name "head" or an end tag except "html". */
+ } elseif(($token['type'] === HTML5::STARTTAG && $token['name'] === 'head') ||
+ ($token['type'] === HTML5::ENDTAG && $token['name'] !== 'html')) {
+ // Parse error. Ignore the token.
+
+ /* Anything else */
+ } else {
+ /* If the current node is a head element, act as if an end tag
+ token with the tag name "head" had been seen. */
+ if($this->head_pointer->isSameNode(end($this->stack))) {
+ $this->inHead(array(
+ 'name' => 'head',
+ 'type' => HTML5::ENDTAG
+ ));
+
+ /* Otherwise, change the insertion mode to "after head". */
+ } else {
+ $this->mode = self::AFTER_HEAD;
+ }
+
+ /* Then, reprocess the current token. */
+ return $this->afterHead($token);
+ }
+ }
+
+ private function afterHead($token)
+ {
+ /* Handle the token as follows: */
+
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE */
+ if($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) {
+ /* Append the character to the current node. */
+ $this->insertText($token['data']);
+
+ /* A comment token */
+ } elseif($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the current node with the data attribute
+ set to the data given in the comment token. */
+ $this->insertComment($token['data']);
+
+ /* A start tag token with the tag name "body" */
+ } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'body') {
+ /* Insert a body element for the token. */
+ $this->insertElement($token);
+
+ /* Change the insertion mode to "in body". */
+ $this->mode = self::IN_BODY;
+
+ /* A start tag token with the tag name "frameset" */
+ } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'frameset') {
+ /* Insert a frameset element for the token. */
+ $this->insertElement($token);
+
+ /* Change the insertion mode to "in frameset". */
+ $this->mode = self::IN_FRAME;
+
+ /* A start tag token whose tag name is one of: "base", "link", "meta",
+ "script", "style", "title" */
+ } elseif($token['type'] === HTML5::STARTTAG && in_array($token['name'],
+ array('base', 'link', 'meta', 'script', 'style', 'title'))) {
+ /* Parse error. Switch the insertion mode back to "in head" and
+ reprocess the token. */
+ $this->mode = self::IN_HEAD;
+ return $this->inHead($token);
+
+ /* Anything else */
+ } else {
+ /* Act as if a start tag token with the tag name "body" and no
+ attributes had been seen, and then reprocess the current token. */
+ $this->afterHead(array(
+ 'name' => 'body',
+ 'type' => HTML5::STARTTAG,
+ 'attr' => array()
+ ));
+
+ return $this->inBody($token);
+ }
+ }
+
+ private function inBody($token)
+ {
+ /* Handle the token as follows: */
+
+ switch($token['type']) {
+ /* A character token */
+ case HTML5::CHARACTR:
+ /* Reconstruct the active formatting elements, if any. */
+ $this->reconstructActiveFormattingElements();
+
+ /* Append the token's character to the current node. */
+ $this->insertText($token['data']);
+ break;
+
+ /* A comment token */
+ case HTML5::COMMENT:
+ /* Append a Comment node to the current node with the data
+ attribute set to the data given in the comment token. */
+ $this->insertComment($token['data']);
+ break;
+
+ case HTML5::STARTTAG:
+ switch($token['name']) {
+ /* A start tag token whose tag name is one of: "script",
+ "style" */
+ case 'script': case 'style':
+ /* Process the token as if the insertion mode had been "in
+ head". */
+ return $this->inHead($token);
+ break;
+
+ /* A start tag token whose tag name is one of: "base", "link",
+ "meta", "title" */
+ case 'base': case 'link': case 'meta': case 'title':
+ /* Parse error. Process the token as if the insertion mode
+ had been "in head". */
+ return $this->inHead($token);
+ break;
+
+ /* A start tag token with the tag name "body" */
+ case 'body':
+ /* Parse error. If the second element on the stack of open
+ elements is not a body element, or, if the stack of open
+ elements has only one node on it, then ignore the token.
+ (innerHTML case) */
+ if(count($this->stack) === 1 || $this->stack[1]->nodeName !== 'body') {
+ // Ignore
+
+ /* Otherwise, for each attribute on the token, check to see
+ if the attribute is already present on the body element (the
+ second element) on the stack of open elements. If it is not,
+ add the attribute and its corresponding value to that
+ element. */
+ } else {
+ foreach($token['attr'] as $attr) {
+ if(!$this->stack[1]->hasAttribute($attr['name'])) {
+ $this->stack[1]->setAttribute($attr['name'], $attr['value']);
+ }
+ }
+ }
+ break;
+
+ /* A start tag whose tag name is one of: "address",
+ "blockquote", "center", "dir", "div", "dl", "fieldset",
+ "listing", "menu", "ol", "p", "ul" */
+ case 'address': case 'blockquote': case 'center': case 'dir':
+ case 'div': case 'dl': case 'fieldset': case 'listing':
+ case 'menu': case 'ol': case 'p': case 'ul':
+ /* If the stack of open elements has a p element in scope,
+ then act as if an end tag with the tag name p had been
+ seen. */
+ if($this->elementInScope('p')) {
+ $this->emitToken(array(
+ 'name' => 'p',
+ 'type' => HTML5::ENDTAG
+ ));
+ }
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+ break;
+
+ /* A start tag whose tag name is "form" */
+ case 'form':
+ /* If the form element pointer is not null, ignore the
+ token with a parse error. */
+ if($this->form_pointer !== null) {
+ // Ignore.
+
+ /* Otherwise: */
+ } else {
+ /* If the stack of open elements has a p element in
+ scope, then act as if an end tag with the tag name p
+ had been seen. */
+ if($this->elementInScope('p')) {
+ $this->emitToken(array(
+ 'name' => 'p',
+ 'type' => HTML5::ENDTAG
+ ));
+ }
+
+ /* Insert an HTML element for the token, and set the
+ form element pointer to point to the element created. */
+ $element = $this->insertElement($token);
+ $this->form_pointer = $element;
+ }
+ break;
+
+ /* A start tag whose tag name is "li", "dd" or "dt" */
+ case 'li': case 'dd': case 'dt':
+ /* If the stack of open elements has a p element in scope,
+ then act as if an end tag with the tag name p had been
+ seen. */
+ if($this->elementInScope('p')) {
+ $this->emitToken(array(
+ 'name' => 'p',
+ 'type' => HTML5::ENDTAG
+ ));
+ }
+
+ $stack_length = count($this->stack) - 1;
+
+ for($n = $stack_length; 0 <= $n; $n--) {
+ /* 1. Initialise node to be the current node (the
+ bottommost node of the stack). */
+ $stop = false;
+ $node = $this->stack[$n];
+ $cat = $this->getElementCategory($node->tagName);
+
+ /* 2. If node is an li, dd or dt element, then pop all
+ the nodes from the current node up to node, including
+ node, then stop this algorithm. */
+ if($token['name'] === $node->tagName || ($token['name'] !== 'li'
+ && ($node->tagName === 'dd' || $node->tagName === 'dt'))) {
+ for($x = $stack_length; $x >= $n ; $x--) {
+ array_pop($this->stack);
+ }
+
+ break;
+ }
+
+ /* 3. If node is not in the formatting category, and is
+ not in the phrasing category, and is not an address or
+ div element, then stop this algorithm. */
+ if($cat !== self::FORMATTING && $cat !== self::PHRASING &&
+ $node->tagName !== 'address' && $node->tagName !== 'div') {
+ break;
+ }
+ }
+
+ /* Finally, insert an HTML element with the same tag
+ name as the token's. */
+ $this->insertElement($token);
+ break;
+
+ /* A start tag token whose tag name is "plaintext" */
+ case 'plaintext':
+ /* If the stack of open elements has a p element in scope,
+ then act as if an end tag with the tag name p had been
+ seen. */
+ if($this->elementInScope('p')) {
+ $this->emitToken(array(
+ 'name' => 'p',
+ 'type' => HTML5::ENDTAG
+ ));
+ }
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ return HTML5::PLAINTEXT;
+ break;
+
+ /* A start tag whose tag name is one of: "h1", "h2", "h3", "h4",
+ "h5", "h6" */
+ case 'h1': case 'h2': case 'h3': case 'h4': case 'h5': case 'h6':
+ /* If the stack of open elements has a p element in scope,
+ then act as if an end tag with the tag name p had been seen. */
+ if($this->elementInScope('p')) {
+ $this->emitToken(array(
+ 'name' => 'p',
+ 'type' => HTML5::ENDTAG
+ ));
+ }
+
+ /* If the stack of open elements has in scope an element whose
+ tag name is one of "h1", "h2", "h3", "h4", "h5", or "h6", then
+ this is a parse error; pop elements from the stack until an
+ element with one of those tag names has been popped from the
+ stack. */
+ while($this->elementInScope(array('h1', 'h2', 'h3', 'h4', 'h5', 'h6'))) {
+ array_pop($this->stack);
+ }
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+ break;
+
+ /* A start tag whose tag name is "a" */
+ case 'a':
+ /* If the list of active formatting elements contains
+ an element whose tag name is "a" between the end of the
+ list and the last marker on the list (or the start of
+ the list if there is no marker on the list), then this
+ is a parse error; act as if an end tag with the tag name
+ "a" had been seen, then remove that element from the list
+ of active formatting elements and the stack of open
+ elements if the end tag didn't already remove it (it
+ might not have if the element is not in table scope). */
+ $leng = count($this->a_formatting);
+
+ for($n = $leng - 1; $n >= 0; $n--) {
+ if($this->a_formatting[$n] === self::MARKER) {
+ break;
+
+ } elseif($this->a_formatting[$n]->nodeName === 'a') {
+ $this->emitToken(array(
+ 'name' => 'a',
+ 'type' => HTML5::ENDTAG
+ ));
+ break;
+ }
+ }
+
+ /* Reconstruct the active formatting elements, if any. */
+ $this->reconstructActiveFormattingElements();
+
+ /* Insert an HTML element for the token. */
+ $el = $this->insertElement($token);
+
+ /* Add that element to the list of active formatting
+ elements. */
+ $this->a_formatting[] = $el;
+ break;
+
+ /* A start tag whose tag name is one of: "b", "big", "em", "font",
+ "i", "nobr", "s", "small", "strike", "strong", "tt", "u" */
+ case 'b': case 'big': case 'em': case 'font': case 'i':
+ case 'nobr': case 's': case 'small': case 'strike':
+ case 'strong': case 'tt': case 'u':
+ /* Reconstruct the active formatting elements, if any. */
+ $this->reconstructActiveFormattingElements();
+
+ /* Insert an HTML element for the token. */
+ $el = $this->insertElement($token);
+
+ /* Add that element to the list of active formatting
+ elements. */
+ $this->a_formatting[] = $el;
+ break;
+
+ /* A start tag token whose tag name is "button" */
+ case 'button':
+ /* If the stack of open elements has a button element in scope,
+ then this is a parse error; act as if an end tag with the tag
+ name "button" had been seen, then reprocess the token. (We don't
+ do that. Unnecessary.) */
+ if($this->elementInScope('button')) {
+ $this->inBody(array(
+ 'name' => 'button',
+ 'type' => HTML5::ENDTAG
+ ));
+ }
+
+ /* Reconstruct the active formatting elements, if any. */
+ $this->reconstructActiveFormattingElements();
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ /* Insert a marker at the end of the list of active
+ formatting elements. */
+ $this->a_formatting[] = self::MARKER;
+ break;
+
+ /* A start tag token whose tag name is one of: "marquee", "object" */
+ case 'marquee': case 'object':
+ /* Reconstruct the active formatting elements, if any. */
+ $this->reconstructActiveFormattingElements();
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ /* Insert a marker at the end of the list of active
+ formatting elements. */
+ $this->a_formatting[] = self::MARKER;
+ break;
+
+ /* A start tag token whose tag name is "xmp" */
+ case 'xmp':
+ /* Reconstruct the active formatting elements, if any. */
+ $this->reconstructActiveFormattingElements();
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ /* Switch the content model flag to the CDATA state. */
+ return HTML5::CDATA;
+ break;
+
+ /* A start tag whose tag name is "table" */
+ case 'table':
+ /* If the stack of open elements has a p element in scope,
+ then act as if an end tag with the tag name p had been seen. */
+ if($this->elementInScope('p')) {
+ $this->emitToken(array(
+ 'name' => 'p',
+ 'type' => HTML5::ENDTAG
+ ));
+ }
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ /* Change the insertion mode to "in table". */
+ $this->mode = self::IN_TABLE;
+ break;
+
+ /* A start tag whose tag name is one of: "area", "basefont",
+ "bgsound", "br", "embed", "img", "param", "spacer", "wbr" */
+ case 'area': case 'basefont': case 'bgsound': case 'br':
+ case 'embed': case 'img': case 'param': case 'spacer':
+ case 'wbr':
+ /* Reconstruct the active formatting elements, if any. */
+ $this->reconstructActiveFormattingElements();
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ /* Immediately pop the current node off the stack of open elements. */
+ array_pop($this->stack);
+ break;
+
+ /* A start tag whose tag name is "hr" */
+ case 'hr':
+ /* If the stack of open elements has a p element in scope,
+ then act as if an end tag with the tag name p had been seen. */
+ if($this->elementInScope('p')) {
+ $this->emitToken(array(
+ 'name' => 'p',
+ 'type' => HTML5::ENDTAG
+ ));
+ }
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ /* Immediately pop the current node off the stack of open elements. */
+ array_pop($this->stack);
+ break;
+
+ /* A start tag whose tag name is "image" */
+ case 'image':
+ /* Parse error. Change the token's tag name to "img" and
+ reprocess it. (Don't ask.) */
+ $token['name'] = 'img';
+ return $this->inBody($token);
+ break;
+
+ /* A start tag whose tag name is "input" */
+ case 'input':
+ /* Reconstruct the active formatting elements, if any. */
+ $this->reconstructActiveFormattingElements();
+
+ /* Insert an input element for the token. */
+ $element = $this->insertElement($token, false);
+
+ /* If the form element pointer is not null, then associate the
+ input element with the form element pointed to by the form
+ element pointer. */
+ $this->form_pointer !== null
+ ? $this->form_pointer->appendChild($element)
+ : end($this->stack)->appendChild($element);
+
+ /* Pop that input element off the stack of open elements. */
+ array_pop($this->stack);
+ break;
+
+ /* A start tag whose tag name is "isindex" */
+ case 'isindex':
+ /* Parse error. */
+ // w/e
+
+ /* If the form element pointer is not null,
+ then ignore the token. */
+ if($this->form_pointer === null) {
+ /* Act as if a start tag token with the tag name "form" had
+ been seen. */
+ $this->inBody(array(
+ 'name' => 'body',
+ 'type' => HTML5::STARTTAG,
+ 'attr' => array()
+ ));
+
+ /* Act as if a start tag token with the tag name "hr" had
+ been seen. */
+ $this->inBody(array(
+ 'name' => 'hr',
+ 'type' => HTML5::STARTTAG,
+ 'attr' => array()
+ ));
+
+ /* Act as if a start tag token with the tag name "p" had
+ been seen. */
+ $this->inBody(array(
+ 'name' => 'p',
+ 'type' => HTML5::STARTTAG,
+ 'attr' => array()
+ ));
+
+ /* Act as if a start tag token with the tag name "label"
+ had been seen. */
+ $this->inBody(array(
+ 'name' => 'label',
+ 'type' => HTML5::STARTTAG,
+ 'attr' => array()
+ ));
+
+ /* Act as if a stream of character tokens had been seen. */
+ $this->insertText('This is a searchable index. '.
+ 'Insert your search keywords here: ');
+
+ /* Act as if a start tag token with the tag name "input"
+ had been seen, with all the attributes from the "isindex"
+ token, except with the "name" attribute set to the value
+ "isindex" (ignoring any explicit "name" attribute). */
+ $attr = $token['attr'];
+ $attr[] = array('name' => 'name', 'value' => 'isindex');
+
+ $this->inBody(array(
+ 'name' => 'input',
+ 'type' => HTML5::STARTTAG,
+ 'attr' => $attr
+ ));
+
+ /* Act as if a stream of character tokens had been seen
+ (see below for what they should say). */
+ $this->insertText('This is a searchable index. '.
+ 'Insert your search keywords here: ');
+
+ /* Act as if an end tag token with the tag name "label"
+ had been seen. */
+ $this->inBody(array(
+ 'name' => 'label',
+ 'type' => HTML5::ENDTAG
+ ));
+
+ /* Act as if an end tag token with the tag name "p" had
+ been seen. */
+ $this->inBody(array(
+ 'name' => 'p',
+ 'type' => HTML5::ENDTAG
+ ));
+
+ /* Act as if a start tag token with the tag name "hr" had
+ been seen. */
+ $this->inBody(array(
+ 'name' => 'hr',
+ 'type' => HTML5::ENDTAG
+ ));
+
+ /* Act as if an end tag token with the tag name "form" had
+ been seen. */
+ $this->inBody(array(
+ 'name' => 'form',
+ 'type' => HTML5::ENDTAG
+ ));
+ }
+ break;
+
+ /* A start tag whose tag name is "textarea" */
+ case 'textarea':
+ $this->insertElement($token);
+
+ /* Switch the tokeniser's content model flag to the
+ RCDATA state. */
+ return HTML5::RCDATA;
+ break;
+
+ /* A start tag whose tag name is one of: "iframe", "noembed",
+ "noframes" */
+ case 'iframe': case 'noembed': case 'noframes':
+ $this->insertElement($token);
+
+ /* Switch the tokeniser's content model flag to the CDATA state. */
+ return HTML5::CDATA;
+ break;
+
+ /* A start tag whose tag name is "select" */
+ case 'select':
+ /* Reconstruct the active formatting elements, if any. */
+ $this->reconstructActiveFormattingElements();
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ /* Change the insertion mode to "in select". */
+ $this->mode = self::IN_SELECT;
+ break;
+
+ /* A start or end tag whose tag name is one of: "caption", "col",
+ "colgroup", "frame", "frameset", "head", "option", "optgroup",
+ "tbody", "td", "tfoot", "th", "thead", "tr". */
+ case 'caption': case 'col': case 'colgroup': case 'frame':
+ case 'frameset': case 'head': case 'option': case 'optgroup':
+ case 'tbody': case 'td': case 'tfoot': case 'th': case 'thead':
+ case 'tr':
+ // Parse error. Ignore the token.
+ break;
+
+ /* A start or end tag whose tag name is one of: "event-source",
+ "section", "nav", "article", "aside", "header", "footer",
+ "datagrid", "command" */
+ case 'event-source': case 'section': case 'nav': case 'article':
+ case 'aside': case 'header': case 'footer': case 'datagrid':
+ case 'command':
+ // Work in progress!
+ break;
+
+ /* A start tag token not covered by the previous entries */
+ default:
+ /* Reconstruct the active formatting elements, if any. */
+ $this->reconstructActiveFormattingElements();
+
+ $this->insertElement($token);
+ break;
+ }
+ break;
+
+ case HTML5::ENDTAG:
+ switch($token['name']) {
+ /* An end tag with the tag name "body" */
+ case 'body':
+ /* If the second element in the stack of open elements is
+ not a body element, this is a parse error. Ignore the token.
+ (innerHTML case) */
+ if(count($this->stack) < 2 || $this->stack[1]->nodeName !== 'body') {
+ // Ignore.
+
+ /* If the current node is not the body element, then this
+ is a parse error. */
+ } elseif(end($this->stack)->nodeName !== 'body') {
+ // Parse error.
+ }
+
+ /* Change the insertion mode to "after body". */
+ $this->mode = self::AFTER_BODY;
+ break;
+
+ /* An end tag with the tag name "html" */
+ case 'html':
+ /* Act as if an end tag with tag name "body" had been seen,
+ then, if that token wasn't ignored, reprocess the current
+ token. */
+ $this->inBody(array(
+ 'name' => 'body',
+ 'type' => HTML5::ENDTAG
+ ));
+
+ return $this->afterBody($token);
+ break;
+
+ /* An end tag whose tag name is one of: "address", "blockquote",
+ "center", "dir", "div", "dl", "fieldset", "listing", "menu",
+ "ol", "pre", "ul" */
+ case 'address': case 'blockquote': case 'center': case 'dir':
+ case 'div': case 'dl': case 'fieldset': case 'listing':
+ case 'menu': case 'ol': case 'pre': case 'ul':
+ /* If the stack of open elements has an element in scope
+ with the same tag name as that of the token, then generate
+ implied end tags. */
+ if($this->elementInScope($token['name'])) {
+ $this->generateImpliedEndTags();
+
+ /* Now, if the current node is not an element with
+ the same tag name as that of the token, then this
+ is a parse error. */
+ // w/e
+
+ /* If the stack of open elements has an element in
+ scope with the same tag name as that of the token,
+ then pop elements from this stack until an element
+ with that tag name has been popped from the stack. */
+ for($n = count($this->stack) - 1; $n >= 0; $n--) {
+ if($this->stack[$n]->nodeName === $token['name']) {
+ $n = -1;
+ }
+
+ array_pop($this->stack);
+ }
+ }
+ break;
+
+ /* An end tag whose tag name is "form" */
+ case 'form':
+ /* If the stack of open elements has an element in scope
+ with the same tag name as that of the token, then generate
+ implied end tags. */
+ if($this->elementInScope($token['name'])) {
+ $this->generateImpliedEndTags();
+
+ }
+
+ if(end($this->stack)->nodeName !== $token['name']) {
+ /* Now, if the current node is not an element with the
+ same tag name as that of the token, then this is a parse
+ error. */
+ // w/e
+
+ } else {
+ /* Otherwise, if the current node is an element with
+ the same tag name as that of the token pop that element
+ from the stack. */
+ array_pop($this->stack);
+ }
+
+ /* In any case, set the form element pointer to null. */
+ $this->form_pointer = null;
+ break;
+
+ /* An end tag whose tag name is "p" */
+ case 'p':
+ /* If the stack of open elements has a p element in scope,
+ then generate implied end tags, except for p elements. */
+ if($this->elementInScope('p')) {
+ $this->generateImpliedEndTags(array('p'));
+
+ /* If the current node is not a p element, then this is
+ a parse error. */
+ // k
+
+ /* If the stack of open elements has a p element in
+ scope, then pop elements from this stack until the stack
+ no longer has a p element in scope. */
+ for($n = count($this->stack) - 1; $n >= 0; $n--) {
+ if($this->elementInScope('p')) {
+ array_pop($this->stack);
+
+ } else {
+ break;
+ }
+ }
+ }
+ break;
+
+ /* An end tag whose tag name is "dd", "dt", or "li" */
+ case 'dd': case 'dt': case 'li':
+ /* If the stack of open elements has an element in scope
+ whose tag name matches the tag name of the token, then
+ generate implied end tags, except for elements with the
+ same tag name as the token. */
+ if($this->elementInScope($token['name'])) {
+ $this->generateImpliedEndTags(array($token['name']));
+
+ /* If the current node is not an element with the same
+ tag name as the token, then this is a parse error. */
+ // w/e
+
+ /* If the stack of open elements has an element in scope
+ whose tag name matches the tag name of the token, then
+ pop elements from this stack until an element with that
+ tag name has been popped from the stack. */
+ for($n = count($this->stack) - 1; $n >= 0; $n--) {
+ if($this->stack[$n]->nodeName === $token['name']) {
+ $n = -1;
+ }
+
+ array_pop($this->stack);
+ }
+ }
+ break;
+
+ /* An end tag whose tag name is one of: "h1", "h2", "h3", "h4",
+ "h5", "h6" */
+ case 'h1': case 'h2': case 'h3': case 'h4': case 'h5': case 'h6':
+ $elements = array('h1', 'h2', 'h3', 'h4', 'h5', 'h6');
+
+ /* If the stack of open elements has in scope an element whose
+ tag name is one of "h1", "h2", "h3", "h4", "h5", or "h6", then
+ generate implied end tags. */
+ if($this->elementInScope($elements)) {
+ $this->generateImpliedEndTags();
+
+ /* Now, if the current node is not an element with the same
+ tag name as that of the token, then this is a parse error. */
+ // w/e
+
+ /* If the stack of open elements has in scope an element
+ whose tag name is one of "h1", "h2", "h3", "h4", "h5", or
+ "h6", then pop elements from the stack until an element
+ with one of those tag names has been popped from the stack. */
+ while($this->elementInScope($elements)) {
+ array_pop($this->stack);
+ }
+ }
+ break;
+
+ /* An end tag whose tag name is one of: "a", "b", "big", "em",
+ "font", "i", "nobr", "s", "small", "strike", "strong", "tt", "u" */
+ case 'a': case 'b': case 'big': case 'em': case 'font':
+ case 'i': case 'nobr': case 's': case 'small': case 'strike':
+ case 'strong': case 'tt': case 'u':
+ /* 1. Let the formatting element be the last element in
+ the list of active formatting elements that:
+ * is between the end of the list and the last scope
+ marker in the list, if any, or the start of the list
+ otherwise, and
+ * has the same tag name as the token.
+ */
+ while(true) {
+ for($a = count($this->a_formatting) - 1; $a >= 0; $a--) {
+ if($this->a_formatting[$a] === self::MARKER) {
+ break;
+
+ } elseif($this->a_formatting[$a]->tagName === $token['name']) {
+ $formatting_element = $this->a_formatting[$a];
+ $in_stack = in_array($formatting_element, $this->stack, true);
+ $fe_af_pos = $a;
+ break;
+ }
+ }
+
+ /* If there is no such node, or, if that node is
+ also in the stack of open elements but the element
+ is not in scope, then this is a parse error. Abort
+ these steps. The token is ignored. */
+ if(!isset($formatting_element) || ($in_stack &&
+ !$this->elementInScope($token['name']))) {
+ break;
+
+ /* Otherwise, if there is such a node, but that node
+ is not in the stack of open elements, then this is a
+ parse error; remove the element from the list, and
+ abort these steps. */
+ } elseif(isset($formatting_element) && !$in_stack) {
+ unset($this->a_formatting[$fe_af_pos]);
+ $this->a_formatting = array_merge($this->a_formatting);
+ break;
+ }
+
+ /* 2. Let the furthest block be the topmost node in the
+ stack of open elements that is lower in the stack
+ than the formatting element, and is not an element in
+ the phrasing or formatting categories. There might
+ not be one. */
+ $fe_s_pos = array_search($formatting_element, $this->stack, true);
+ $length = count($this->stack);
+
+ for($s = $fe_s_pos + 1; $s < $length; $s++) {
+ $category = $this->getElementCategory($this->stack[$s]->nodeName);
+
+ if($category !== self::PHRASING && $category !== self::FORMATTING) {
+ $furthest_block = $this->stack[$s];
+ }
+ }
+
+ /* 3. If there is no furthest block, then the UA must
+ skip the subsequent steps and instead just pop all
+ the nodes from the bottom of the stack of open
+ elements, from the current node up to the formatting
+ element, and remove the formatting element from the
+ list of active formatting elements. */
+ if(!isset($furthest_block)) {
+ for($n = $length - 1; $n >= $fe_s_pos; $n--) {
+ array_pop($this->stack);
+ }
+
+ unset($this->a_formatting[$fe_af_pos]);
+ $this->a_formatting = array_merge($this->a_formatting);
+ break;
+ }
+
+ /* 4. Let the common ancestor be the element
+ immediately above the formatting element in the stack
+ of open elements. */
+ $common_ancestor = $this->stack[$fe_s_pos - 1];
+
+ /* 5. If the furthest block has a parent node, then
+ remove the furthest block from its parent node. */
+ if($furthest_block->parentNode !== null) {
+ $furthest_block->parentNode->removeChild($furthest_block);
+ }
+
+ /* 6. Let a bookmark note the position of the
+ formatting element in the list of active formatting
+ elements relative to the elements on either side
+ of it in the list. */
+ $bookmark = $fe_af_pos;
+
+ /* 7. Let node and last node be the furthest block.
+ Follow these steps: */
+ $node = $furthest_block;
+ $last_node = $furthest_block;
+
+ while(true) {
+ for($n = array_search($node, $this->stack, true) - 1; $n >= 0; $n--) {
+ /* 7.1 Let node be the element immediately
+ prior to node in the stack of open elements. */
+ $node = $this->stack[$n];
+
+ /* 7.2 If node is not in the list of active
+ formatting elements, then remove node from
+ the stack of open elements and then go back
+ to step 1. */
+ if(!in_array($node, $this->a_formatting, true)) {
+ unset($this->stack[$n]);
+ $this->stack = array_merge($this->stack);
+
+ } else {
+ break;
+ }
+ }
+
+ /* 7.3 Otherwise, if node is the formatting
+ element, then go to the next step in the overall
+ algorithm. */
+ if($node === $formatting_element) {
+ break;
+
+ /* 7.4 Otherwise, if last node is the furthest
+ block, then move the aforementioned bookmark to
+ be immediately after the node in the list of
+ active formatting elements. */
+ } elseif($last_node === $furthest_block) {
+ $bookmark = array_search($node, $this->a_formatting, true) + 1;
+ }
+
+ /* 7.5 If node has any children, perform a
+ shallow clone of node, replace the entry for
+ node in the list of active formatting elements
+ with an entry for the clone, replace the entry
+ for node in the stack of open elements with an
+ entry for the clone, and let node be the clone. */
+ if($node->hasChildNodes()) {
+ $clone = $node->cloneNode();
+ $s_pos = array_search($node, $this->stack, true);
+ $a_pos = array_search($node, $this->a_formatting, true);
+
+ $this->stack[$s_pos] = $clone;
+ $this->a_formatting[$a_pos] = $clone;
+ $node = $clone;
+ }
+
+ /* 7.6 Insert last node into node, first removing
+ it from its previous parent node if any. */
+ if($last_node->parentNode !== null) {
+ $last_node->parentNode->removeChild($last_node);
+ }
+
+ $node->appendChild($last_node);
+
+ /* 7.7 Let last node be node. */
+ $last_node = $node;
+ }
+
+ /* 8. Insert whatever last node ended up being in
+ the previous step into the common ancestor node,
+ first removing it from its previous parent node if
+ any. */
+ if($last_node->parentNode !== null) {
+ $last_node->parentNode->removeChild($last_node);
+ }
+
+ $common_ancestor->appendChild($last_node);
+
+ /* 9. Perform a shallow clone of the formatting
+ element. */
+ $clone = $formatting_element->cloneNode();
+
+ /* 10. Take all of the child nodes of the furthest
+ block and append them to the clone created in the
+ last step. */
+ while($furthest_block->hasChildNodes()) {
+ $child = $furthest_block->firstChild;
+ $furthest_block->removeChild($child);
+ $clone->appendChild($child);
+ }
+
+ /* 11. Append that clone to the furthest block. */
+ $furthest_block->appendChild($clone);
+
+ /* 12. Remove the formatting element from the list
+ of active formatting elements, and insert the clone
+ into the list of active formatting elements at the
+ position of the aforementioned bookmark. */
+ $fe_af_pos = array_search($formatting_element, $this->a_formatting, true);
+ unset($this->a_formatting[$fe_af_pos]);
+ $this->a_formatting = array_merge($this->a_formatting);
+
+ $af_part1 = array_slice($this->a_formatting, 0, $bookmark - 1);
+ $af_part2 = array_slice($this->a_formatting, $bookmark, count($this->a_formatting));
+ $this->a_formatting = array_merge($af_part1, array($clone), $af_part2);
+
+ /* 13. Remove the formatting element from the stack
+ of open elements, and insert the clone into the stack
+ of open elements immediately after (i.e. in a more
+ deeply nested position than) the position of the
+ furthest block in that stack. */
+ $fe_s_pos = array_search($formatting_element, $this->stack, true);
+ $fb_s_pos = array_search($furthest_block, $this->stack, true);
+ unset($this->stack[$fe_s_pos]);
+
+ $s_part1 = array_slice($this->stack, 0, $fb_s_pos);
+ $s_part2 = array_slice($this->stack, $fb_s_pos + 1, count($this->stack));
+ $this->stack = array_merge($s_part1, array($clone), $s_part2);
+
+ /* 14. Jump back to step 1 in this series of steps. */
+ unset($formatting_element, $fe_af_pos, $fe_s_pos, $furthest_block);
+ }
+ break;
+
+ /* An end tag token whose tag name is one of: "button",
+ "marquee", "object" */
+ case 'button': case 'marquee': case 'object':
+ /* If the stack of open elements has an element in scope whose
+ tag name matches the tag name of the token, then generate implied
+ tags. */
+ if($this->elementInScope($token['name'])) {
+ $this->generateImpliedEndTags();
+
+ /* Now, if the current node is not an element with the same
+ tag name as the token, then this is a parse error. */
+ // k
+
+ /* Now, if the stack of open elements has an element in scope
+ whose tag name matches the tag name of the token, then pop
+ elements from the stack until that element has been popped from
+ the stack, and clear the list of active formatting elements up
+ to the last marker. */
+ for($n = count($this->stack) - 1; $n >= 0; $n--) {
+ if($this->stack[$n]->nodeName === $token['name']) {
+ $n = -1;
+ }
+
+ array_pop($this->stack);
+ }
+
+ $marker = end(array_keys($this->a_formatting, self::MARKER, true));
+
+ for($n = count($this->a_formatting) - 1; $n > $marker; $n--) {
+ array_pop($this->a_formatting);
+ }
+ }
+ break;
+
+ /* Or an end tag whose tag name is one of: "area", "basefont",
+ "bgsound", "br", "embed", "hr", "iframe", "image", "img",
+ "input", "isindex", "noembed", "noframes", "param", "select",
+ "spacer", "table", "textarea", "wbr" */
+ case 'area': case 'basefont': case 'bgsound': case 'br':
+ case 'embed': case 'hr': case 'iframe': case 'image':
+ case 'img': case 'input': case 'isindex': case 'noembed':
+ case 'noframes': case 'param': case 'select': case 'spacer':
+ case 'table': case 'textarea': case 'wbr':
+ // Parse error. Ignore the token.
+ break;
+
+ /* An end tag token not covered by the previous entries */
+ default:
+ for($n = count($this->stack) - 1; $n >= 0; $n--) {
+ /* Initialise node to be the current node (the bottommost
+ node of the stack). */
+ $node = end($this->stack);
+
+ /* If node has the same tag name as the end tag token,
+ then: */
+ if($token['name'] === $node->nodeName) {
+ /* Generate implied end tags. */
+ $this->generateImpliedEndTags();
+
+ /* If the tag name of the end tag token does not
+ match the tag name of the current node, this is a
+ parse error. */
+ // k
+
+ /* Pop all the nodes from the current node up to
+ node, including node, then stop this algorithm. */
+ for($x = count($this->stack) - $n; $x >= $n; $x--) {
+ array_pop($this->stack);
+ }
+
+ } else {
+ $category = $this->getElementCategory($node);
+
+ if($category !== self::SPECIAL && $category !== self::SCOPING) {
+ /* Otherwise, if node is in neither the formatting
+ category nor the phrasing category, then this is a
+ parse error. Stop this algorithm. The end tag token
+ is ignored. */
+ return false;
+ }
+ }
+ }
+ break;
+ }
+ break;
+ }
+ }
+
+ private function inTable($token)
+ {
+ $clear = array('html', 'table');
+
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE */
+ if($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) {
+ /* Append the character to the current node. */
+ $text = $this->dom->createTextNode($token['data']);
+ end($this->stack)->appendChild($text);
+
+ /* A comment token */
+ } elseif($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the current node with the data
+ attribute set to the data given in the comment token. */
+ $comment = $this->dom->createComment($token['data']);
+ end($this->stack)->appendChild($comment);
+
+ /* A start tag whose tag name is "caption" */
+ } elseif($token['type'] === HTML5::STARTTAG &&
+ $token['name'] === 'caption') {
+ /* Clear the stack back to a table context. */
+ $this->clearStackToTableContext($clear);
+
+ /* Insert a marker at the end of the list of active
+ formatting elements. */
+ $this->a_formatting[] = self::MARKER;
+
+ /* Insert an HTML element for the token, then switch the
+ insertion mode to "in caption". */
+ $this->insertElement($token);
+ $this->mode = self::IN_CAPTION;
+
+ /* A start tag whose tag name is "colgroup" */
+ } elseif($token['type'] === HTML5::STARTTAG &&
+ $token['name'] === 'colgroup') {
+ /* Clear the stack back to a table context. */
+ $this->clearStackToTableContext($clear);
+
+ /* Insert an HTML element for the token, then switch the
+ insertion mode to "in column group". */
+ $this->insertElement($token);
+ $this->mode = self::IN_CGROUP;
+
+ /* A start tag whose tag name is "col" */
+ } elseif($token['type'] === HTML5::STARTTAG &&
+ $token['name'] === 'col') {
+ $this->inTable(array(
+ 'name' => 'colgroup',
+ 'type' => HTML5::STARTTAG,
+ 'attr' => array()
+ ));
+
+ $this->inColumnGroup($token);
+
+ /* A start tag whose tag name is one of: "tbody", "tfoot", "thead" */
+ } elseif($token['type'] === HTML5::STARTTAG && in_array($token['name'],
+ array('tbody', 'tfoot', 'thead'))) {
+ /* Clear the stack back to a table context. */
+ $this->clearStackToTableContext($clear);
+
+ /* Insert an HTML element for the token, then switch the insertion
+ mode to "in table body". */
+ $this->insertElement($token);
+ $this->mode = self::IN_TBODY;
+
+ /* A start tag whose tag name is one of: "td", "th", "tr" */
+ } elseif($token['type'] === HTML5::STARTTAG &&
+ in_array($token['name'], array('td', 'th', 'tr'))) {
+ /* Act as if a start tag token with the tag name "tbody" had been
+ seen, then reprocess the current token. */
+ $this->inTable(array(
+ 'name' => 'tbody',
+ 'type' => HTML5::STARTTAG,
+ 'attr' => array()
+ ));
+
+ return $this->inTableBody($token);
+
+ /* A start tag whose tag name is "table" */
+ } elseif($token['type'] === HTML5::STARTTAG &&
+ $token['name'] === 'table') {
+ /* Parse error. Act as if an end tag token with the tag name "table"
+ had been seen, then, if that token wasn't ignored, reprocess the
+ current token. */
+ $this->inTable(array(
+ 'name' => 'table',
+ 'type' => HTML5::ENDTAG
+ ));
+
+ return $this->mainPhase($token);
+
+ /* An end tag whose tag name is "table" */
+ } elseif($token['type'] === HTML5::ENDTAG &&
+ $token['name'] === 'table') {
+ /* If the stack of open elements does not have an element in table
+ scope with the same tag name as the token, this is a parse error.
+ Ignore the token. (innerHTML case) */
+ if(!$this->elementInScope($token['name'], true)) {
+ return false;
+
+ /* Otherwise: */
+ } else {
+ /* Generate implied end tags. */
+ $this->generateImpliedEndTags();
+
+ /* Now, if the current node is not a table element, then this
+ is a parse error. */
+ // w/e
+
+ /* Pop elements from this stack until a table element has been
+ popped from the stack. */
+ while(true) {
+ $current = end($this->stack)->nodeName;
+ array_pop($this->stack);
+
+ if($current === 'table') {
+ break;
+ }
+ }
+
+ /* Reset the insertion mode appropriately. */
+ $this->resetInsertionMode();
+ }
+
+ /* An end tag whose tag name is one of: "body", "caption", "col",
+ "colgroup", "html", "tbody", "td", "tfoot", "th", "thead", "tr" */
+ } elseif($token['type'] === HTML5::ENDTAG && in_array($token['name'],
+ array('body', 'caption', 'col', 'colgroup', 'html', 'tbody', 'td',
+ 'tfoot', 'th', 'thead', 'tr'))) {
+ // Parse error. Ignore the token.
+
+ /* Anything else */
+ } else {
+ /* Parse error. Process the token as if the insertion mode was "in
+ body", with the following exception: */
+
+ /* If the current node is a table, tbody, tfoot, thead, or tr
+ element, then, whenever a node would be inserted into the current
+ node, it must instead be inserted into the foster parent element. */
+ if(in_array(end($this->stack)->nodeName,
+ array('table', 'tbody', 'tfoot', 'thead', 'tr'))) {
+ /* The foster parent element is the parent element of the last
+ table element in the stack of open elements, if there is a
+ table element and it has such a parent element. If there is no
+ table element in the stack of open elements (innerHTML case),
+ then the foster parent element is the first element in the
+ stack of open elements (the html element). Otherwise, if there
+ is a table element in the stack of open elements, but the last
+ table element in the stack of open elements has no parent, or
+ its parent node is not an element, then the foster parent
+ element is the element before the last table element in the
+ stack of open elements. */
+ for($n = count($this->stack) - 1; $n >= 0; $n--) {
+ if($this->stack[$n]->nodeName === 'table') {
+ $table = $this->stack[$n];
+ break;
+ }
+ }
+
+ if(isset($table) && $table->parentNode !== null) {
+ $this->foster_parent = $table->parentNode;
+
+ } elseif(!isset($table)) {
+ $this->foster_parent = $this->stack[0];
+
+ } elseif(isset($table) && ($table->parentNode === null ||
+ $table->parentNode->nodeType !== XML_ELEMENT_NODE)) {
+ $this->foster_parent = $this->stack[$n - 1];
+ }
+ }
+
+ $this->inBody($token);
+ }
+ }
+
+ private function inCaption($token)
+ {
+ /* An end tag whose tag name is "caption" */
+ if($token['type'] === HTML5::ENDTAG && $token['name'] === 'caption') {
+ /* If the stack of open elements does not have an element in table
+ scope with the same tag name as the token, this is a parse error.
+ Ignore the token. (innerHTML case) */
+ if(!$this->elementInScope($token['name'], true)) {
+ // Ignore
+
+ /* Otherwise: */
+ } else {
+ /* Generate implied end tags. */
+ $this->generateImpliedEndTags();
+
+ /* Now, if the current node is not a caption element, then this
+ is a parse error. */
+ // w/e
+
+ /* Pop elements from this stack until a caption element has
+ been popped from the stack. */
+ while(true) {
+ $node = end($this->stack)->nodeName;
+ array_pop($this->stack);
+
+ if($node === 'caption') {
+ break;
+ }
+ }
+
+ /* Clear the list of active formatting elements up to the last
+ marker. */
+ $this->clearTheActiveFormattingElementsUpToTheLastMarker();
+
+ /* Switch the insertion mode to "in table". */
+ $this->mode = self::IN_TABLE;
+ }
+
+ /* A start tag whose tag name is one of: "caption", "col", "colgroup",
+ "tbody", "td", "tfoot", "th", "thead", "tr", or an end tag whose tag
+ name is "table" */
+ } elseif(($token['type'] === HTML5::STARTTAG && in_array($token['name'],
+ array('caption', 'col', 'colgroup', 'tbody', 'td', 'tfoot', 'th',
+ 'thead', 'tr'))) || ($token['type'] === HTML5::ENDTAG &&
+ $token['name'] === 'table')) {
+ /* Parse error. Act as if an end tag with the tag name "caption"
+ had been seen, then, if that token wasn't ignored, reprocess the
+ current token. */
+ $this->inCaption(array(
+ 'name' => 'caption',
+ 'type' => HTML5::ENDTAG
+ ));
+
+ return $this->inTable($token);
+
+ /* An end tag whose tag name is one of: "body", "col", "colgroup",
+ "html", "tbody", "td", "tfoot", "th", "thead", "tr" */
+ } elseif($token['type'] === HTML5::ENDTAG && in_array($token['name'],
+ array('body', 'col', 'colgroup', 'html', 'tbody', 'tfoot', 'th',
+ 'thead', 'tr'))) {
+ // Parse error. Ignore the token.
+
+ /* Anything else */
+ } else {
+ /* Process the token as if the insertion mode was "in body". */
+ $this->inBody($token);
+ }
+ }
+
+ private function inColumnGroup($token)
+ {
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE */
+ if($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) {
+ /* Append the character to the current node. */
+ $text = $this->dom->createTextNode($token['data']);
+ end($this->stack)->appendChild($text);
+
+ /* A comment token */
+ } elseif($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the current node with the data
+ attribute set to the data given in the comment token. */
+ $comment = $this->dom->createComment($token['data']);
+ end($this->stack)->appendChild($comment);
+
+ /* A start tag whose tag name is "col" */
+ } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'col') {
+ /* Insert a col element for the token. Immediately pop the current
+ node off the stack of open elements. */
+ $this->insertElement($token);
+ array_pop($this->stack);
+
+ /* An end tag whose tag name is "colgroup" */
+ } elseif($token['type'] === HTML5::ENDTAG &&
+ $token['name'] === 'colgroup') {
+ /* If the current node is the root html element, then this is a
+ parse error, ignore the token. (innerHTML case) */
+ if(end($this->stack)->nodeName === 'html') {
+ // Ignore
+
+ /* Otherwise, pop the current node (which will be a colgroup
+ element) from the stack of open elements. Switch the insertion
+ mode to "in table". */
+ } else {
+ array_pop($this->stack);
+ $this->mode = self::IN_TABLE;
+ }
+
+ /* An end tag whose tag name is "col" */
+ } elseif($token['type'] === HTML5::ENDTAG && $token['name'] === 'col') {
+ /* Parse error. Ignore the token. */
+
+ /* Anything else */
+ } else {
+ /* Act as if an end tag with the tag name "colgroup" had been seen,
+ and then, if that token wasn't ignored, reprocess the current token. */
+ $this->inColumnGroup(array(
+ 'name' => 'colgroup',
+ 'type' => HTML5::ENDTAG
+ ));
+
+ return $this->inTable($token);
+ }
+ }
+
+ private function inTableBody($token)
+ {
+ $clear = array('tbody', 'tfoot', 'thead', 'html');
+
+ /* A start tag whose tag name is "tr" */
+ if($token['type'] === HTML5::STARTTAG && $token['name'] === 'tr') {
+ /* Clear the stack back to a table body context. */
+ $this->clearStackToTableContext($clear);
+
+ /* Insert a tr element for the token, then switch the insertion
+ mode to "in row". */
+ $this->insertElement($token);
+ $this->mode = self::IN_ROW;
+
+ /* A start tag whose tag name is one of: "th", "td" */
+ } elseif($token['type'] === HTML5::STARTTAG &&
+ ($token['name'] === 'th' || $token['name'] === 'td')) {
+ /* Parse error. Act as if a start tag with the tag name "tr" had
+ been seen, then reprocess the current token. */
+ $this->inTableBody(array(
+ 'name' => 'tr',
+ 'type' => HTML5::STARTTAG,
+ 'attr' => array()
+ ));
+
+ return $this->inRow($token);
+
+ /* An end tag whose tag name is one of: "tbody", "tfoot", "thead" */
+ } elseif($token['type'] === HTML5::ENDTAG &&
+ in_array($token['name'], array('tbody', 'tfoot', 'thead'))) {
+ /* If the stack of open elements does not have an element in table
+ scope with the same tag name as the token, this is a parse error.
+ Ignore the token. */
+ if(!$this->elementInScope($token['name'], true)) {
+ // Ignore
+
+ /* Otherwise: */
+ } else {
+ /* Clear the stack back to a table body context. */
+ $this->clearStackToTableContext($clear);
+
+ /* Pop the current node from the stack of open elements. Switch
+ the insertion mode to "in table". */
+ array_pop($this->stack);
+ $this->mode = self::IN_TABLE;
+ }
+
+ /* A start tag whose tag name is one of: "caption", "col", "colgroup",
+ "tbody", "tfoot", "thead", or an end tag whose tag name is "table" */
+ } elseif(($token['type'] === HTML5::STARTTAG && in_array($token['name'],
+ array('caption', 'col', 'colgroup', 'tbody', 'tfoor', 'thead'))) ||
+ ($token['type'] === HTML5::STARTTAG && $token['name'] === 'table')) {
+ /* If the stack of open elements does not have a tbody, thead, or
+ tfoot element in table scope, this is a parse error. Ignore the
+ token. (innerHTML case) */
+ if(!$this->elementInScope(array('tbody', 'thead', 'tfoot'), true)) {
+ // Ignore.
+
+ /* Otherwise: */
+ } else {
+ /* Clear the stack back to a table body context. */
+ $this->clearStackToTableContext($clear);
+
+ /* Act as if an end tag with the same tag name as the current
+ node ("tbody", "tfoot", or "thead") had been seen, then
+ reprocess the current token. */
+ $this->inTableBody(array(
+ 'name' => end($this->stack)->nodeName,
+ 'type' => HTML5::ENDTAG
+ ));
+
+ return $this->mainPhase($token);
+ }
+
+ /* An end tag whose tag name is one of: "body", "caption", "col",
+ "colgroup", "html", "td", "th", "tr" */
+ } elseif($token['type'] === HTML5::ENDTAG && in_array($token['name'],
+ array('body', 'caption', 'col', 'colgroup', 'html', 'td', 'th', 'tr'))) {
+ /* Parse error. Ignore the token. */
+
+ /* Anything else */
+ } else {
+ /* Process the token as if the insertion mode was "in table". */
+ $this->inTable($token);
+ }
+ }
+
+ private function inRow($token)
+ {
+ $clear = array('tr', 'html');
+
+ /* A start tag whose tag name is one of: "th", "td" */
+ if($token['type'] === HTML5::STARTTAG &&
+ ($token['name'] === 'th' || $token['name'] === 'td')) {
+ /* Clear the stack back to a table row context. */
+ $this->clearStackToTableContext($clear);
+
+ /* Insert an HTML element for the token, then switch the insertion
+ mode to "in cell". */
+ $this->insertElement($token);
+ $this->mode = self::IN_CELL;
+
+ /* Insert a marker at the end of the list of active formatting
+ elements. */
+ $this->a_formatting[] = self::MARKER;
+
+ /* An end tag whose tag name is "tr" */
+ } elseif($token['type'] === HTML5::ENDTAG && $token['name'] === 'tr') {
+ /* If the stack of open elements does not have an element in table
+ scope with the same tag name as the token, this is a parse error.
+ Ignore the token. (innerHTML case) */
+ if(!$this->elementInScope($token['name'], true)) {
+ // Ignore.
+
+ /* Otherwise: */
+ } else {
+ /* Clear the stack back to a table row context. */
+ $this->clearStackToTableContext($clear);
+
+ /* Pop the current node (which will be a tr element) from the
+ stack of open elements. Switch the insertion mode to "in table
+ body". */
+ array_pop($this->stack);
+ $this->mode = self::IN_TBODY;
+ }
+
+ /* A start tag whose tag name is one of: "caption", "col", "colgroup",
+ "tbody", "tfoot", "thead", "tr" or an end tag whose tag name is "table" */
+ } elseif($token['type'] === HTML5::STARTTAG && in_array($token['name'],
+ array('caption', 'col', 'colgroup', 'tbody', 'tfoot', 'thead', 'tr'))) {
+ /* Act as if an end tag with the tag name "tr" had been seen, then,
+ if that token wasn't ignored, reprocess the current token. */
+ $this->inRow(array(
+ 'name' => 'tr',
+ 'type' => HTML5::ENDTAG
+ ));
+
+ return $this->inCell($token);
+
+ /* An end tag whose tag name is one of: "tbody", "tfoot", "thead" */
+ } elseif($token['type'] === HTML5::ENDTAG &&
+ in_array($token['name'], array('tbody', 'tfoot', 'thead'))) {
+ /* If the stack of open elements does not have an element in table
+ scope with the same tag name as the token, this is a parse error.
+ Ignore the token. */
+ if(!$this->elementInScope($token['name'], true)) {
+ // Ignore.
+
+ /* Otherwise: */
+ } else {
+ /* Otherwise, act as if an end tag with the tag name "tr" had
+ been seen, then reprocess the current token. */
+ $this->inRow(array(
+ 'name' => 'tr',
+ 'type' => HTML5::ENDTAG
+ ));
+
+ return $this->inCell($token);
+ }
+
+ /* An end tag whose tag name is one of: "body", "caption", "col",
+ "colgroup", "html", "td", "th" */
+ } elseif($token['type'] === HTML5::ENDTAG && in_array($token['name'],
+ array('body', 'caption', 'col', 'colgroup', 'html', 'td', 'th', 'tr'))) {
+ /* Parse error. Ignore the token. */
+
+ /* Anything else */
+ } else {
+ /* Process the token as if the insertion mode was "in table". */
+ $this->inTable($token);
+ }
+ }
+
+ private function inCell($token)
+ {
+ /* An end tag whose tag name is one of: "td", "th" */
+ if($token['type'] === HTML5::ENDTAG &&
+ ($token['name'] === 'td' || $token['name'] === 'th')) {
+ /* If the stack of open elements does not have an element in table
+ scope with the same tag name as that of the token, then this is a
+ parse error and the token must be ignored. */
+ if(!$this->elementInScope($token['name'], true)) {
+ // Ignore.
+
+ /* Otherwise: */
+ } else {
+ /* Generate implied end tags, except for elements with the same
+ tag name as the token. */
+ $this->generateImpliedEndTags(array($token['name']));
+
+ /* Now, if the current node is not an element with the same tag
+ name as the token, then this is a parse error. */
+ // k
+
+ /* Pop elements from this stack until an element with the same
+ tag name as the token has been popped from the stack. */
+ while(true) {
+ $node = end($this->stack)->nodeName;
+ array_pop($this->stack);
+
+ if($node === $token['name']) {
+ break;
+ }
+ }
+
+ /* Clear the list of active formatting elements up to the last
+ marker. */
+ $this->clearTheActiveFormattingElementsUpToTheLastMarker();
+
+ /* Switch the insertion mode to "in row". (The current node
+ will be a tr element at this point.) */
+ $this->mode = self::IN_ROW;
+ }
+
+ /* A start tag whose tag name is one of: "caption", "col", "colgroup",
+ "tbody", "td", "tfoot", "th", "thead", "tr" */
+ } elseif($token['type'] === HTML5::STARTTAG && in_array($token['name'],
+ array('caption', 'col', 'colgroup', 'tbody', 'td', 'tfoot', 'th',
+ 'thead', 'tr'))) {
+ /* If the stack of open elements does not have a td or th element
+ in table scope, then this is a parse error; ignore the token.
+ (innerHTML case) */
+ if(!$this->elementInScope(array('td', 'th'), true)) {
+ // Ignore.
+
+ /* Otherwise, close the cell (see below) and reprocess the current
+ token. */
+ } else {
+ $this->closeCell();
+ return $this->inRow($token);
+ }
+
+ /* A start tag whose tag name is one of: "caption", "col", "colgroup",
+ "tbody", "td", "tfoot", "th", "thead", "tr" */
+ } elseif($token['type'] === HTML5::STARTTAG && in_array($token['name'],
+ array('caption', 'col', 'colgroup', 'tbody', 'td', 'tfoot', 'th',
+ 'thead', 'tr'))) {
+ /* If the stack of open elements does not have a td or th element
+ in table scope, then this is a parse error; ignore the token.
+ (innerHTML case) */
+ if(!$this->elementInScope(array('td', 'th'), true)) {
+ // Ignore.
+
+ /* Otherwise, close the cell (see below) and reprocess the current
+ token. */
+ } else {
+ $this->closeCell();
+ return $this->inRow($token);
+ }
+
+ /* An end tag whose tag name is one of: "body", "caption", "col",
+ "colgroup", "html" */
+ } elseif($token['type'] === HTML5::ENDTAG && in_array($token['name'],
+ array('body', 'caption', 'col', 'colgroup', 'html'))) {
+ /* Parse error. Ignore the token. */
+
+ /* An end tag whose tag name is one of: "table", "tbody", "tfoot",
+ "thead", "tr" */
+ } elseif($token['type'] === HTML5::ENDTAG && in_array($token['name'],
+ array('table', 'tbody', 'tfoot', 'thead', 'tr'))) {
+ /* If the stack of open elements does not have an element in table
+ scope with the same tag name as that of the token (which can only
+ happen for "tbody", "tfoot" and "thead", or, in the innerHTML case),
+ then this is a parse error and the token must be ignored. */
+ if(!$this->elementInScope($token['name'], true)) {
+ // Ignore.
+
+ /* Otherwise, close the cell (see below) and reprocess the current
+ token. */
+ } else {
+ $this->closeCell();
+ return $this->inRow($token);
+ }
+
+ /* Anything else */
+ } else {
+ /* Process the token as if the insertion mode was "in body". */
+ $this->inBody($token);
+ }
+ }
+
+ private function inSelect($token)
+ {
+ /* Handle the token as follows: */
+
+ /* A character token */
+ if($token['type'] === HTML5::CHARACTR) {
+ /* Append the token's character to the current node. */
+ $this->insertText($token['data']);
+
+ /* A comment token */
+ } elseif($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the current node with the data
+ attribute set to the data given in the comment token. */
+ $this->insertComment($token['data']);
+
+ /* A start tag token whose tag name is "option" */
+ } elseif($token['type'] === HTML5::STARTTAG &&
+ $token['name'] === 'option') {
+ /* If the current node is an option element, act as if an end tag
+ with the tag name "option" had been seen. */
+ if(end($this->stack)->nodeName === 'option') {
+ $this->inSelect(array(
+ 'name' => 'option',
+ 'type' => HTML5::ENDTAG
+ ));
+ }
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ /* A start tag token whose tag name is "optgroup" */
+ } elseif($token['type'] === HTML5::STARTTAG &&
+ $token['name'] === 'optgroup') {
+ /* If the current node is an option element, act as if an end tag
+ with the tag name "option" had been seen. */
+ if(end($this->stack)->nodeName === 'option') {
+ $this->inSelect(array(
+ 'name' => 'option',
+ 'type' => HTML5::ENDTAG
+ ));
+ }
+
+ /* If the current node is an optgroup element, act as if an end tag
+ with the tag name "optgroup" had been seen. */
+ if(end($this->stack)->nodeName === 'optgroup') {
+ $this->inSelect(array(
+ 'name' => 'optgroup',
+ 'type' => HTML5::ENDTAG
+ ));
+ }
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ /* An end tag token whose tag name is "optgroup" */
+ } elseif($token['type'] === HTML5::ENDTAG &&
+ $token['name'] === 'optgroup') {
+ /* First, if the current node is an option element, and the node
+ immediately before it in the stack of open elements is an optgroup
+ element, then act as if an end tag with the tag name "option" had
+ been seen. */
+ $elements_in_stack = count($this->stack);
+
+ if($this->stack[$elements_in_stack - 1]->nodeName === 'option' &&
+ $this->stack[$elements_in_stack - 2]->nodeName === 'optgroup') {
+ $this->inSelect(array(
+ 'name' => 'option',
+ 'type' => HTML5::ENDTAG
+ ));
+ }
+
+ /* If the current node is an optgroup element, then pop that node
+ from the stack of open elements. Otherwise, this is a parse error,
+ ignore the token. */
+ if($this->stack[$elements_in_stack - 1] === 'optgroup') {
+ array_pop($this->stack);
+ }
+
+ /* An end tag token whose tag name is "option" */
+ } elseif($token['type'] === HTML5::ENDTAG &&
+ $token['name'] === 'option') {
+ /* If the current node is an option element, then pop that node
+ from the stack of open elements. Otherwise, this is a parse error,
+ ignore the token. */
+ if(end($this->stack)->nodeName === 'option') {
+ array_pop($this->stack);
+ }
+
+ /* An end tag whose tag name is "select" */
+ } elseif($token['type'] === HTML5::ENDTAG &&
+ $token['name'] === 'select') {
+ /* If the stack of open elements does not have an element in table
+ scope with the same tag name as the token, this is a parse error.
+ Ignore the token. (innerHTML case) */
+ if(!$this->elementInScope($token['name'], true)) {
+ // w/e
+
+ /* Otherwise: */
+ } else {
+ /* Pop elements from the stack of open elements until a select
+ element has been popped from the stack. */
+ while(true) {
+ $current = end($this->stack)->nodeName;
+ array_pop($this->stack);
+
+ if($current === 'select') {
+ break;
+ }
+ }
+
+ /* Reset the insertion mode appropriately. */
+ $this->resetInsertionMode();
+ }
+
+ /* A start tag whose tag name is "select" */
+ } elseif($token['name'] === 'select' &&
+ $token['type'] === HTML5::STARTTAG) {
+ /* Parse error. Act as if the token had been an end tag with the
+ tag name "select" instead. */
+ $this->inSelect(array(
+ 'name' => 'select',
+ 'type' => HTML5::ENDTAG
+ ));
+
+ /* An end tag whose tag name is one of: "caption", "table", "tbody",
+ "tfoot", "thead", "tr", "td", "th" */
+ } elseif(in_array($token['name'], array('caption', 'table', 'tbody',
+ 'tfoot', 'thead', 'tr', 'td', 'th')) && $token['type'] === HTML5::ENDTAG) {
+ /* Parse error. */
+ // w/e
+
+ /* If the stack of open elements has an element in table scope with
+ the same tag name as that of the token, then act as if an end tag
+ with the tag name "select" had been seen, and reprocess the token.
+ Otherwise, ignore the token. */
+ if($this->elementInScope($token['name'], true)) {
+ $this->inSelect(array(
+ 'name' => 'select',
+ 'type' => HTML5::ENDTAG
+ ));
+
+ $this->mainPhase($token);
+ }
+
+ /* Anything else */
+ } else {
+ /* Parse error. Ignore the token. */
+ }
+ }
+
+ private function afterBody($token)
+ {
+ /* Handle the token as follows: */
+
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE */
+ if($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) {
+ /* Process the token as it would be processed if the insertion mode
+ was "in body". */
+ $this->inBody($token);
+
+ /* A comment token */
+ } elseif($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the first element in the stack of open
+ elements (the html element), with the data attribute set to the
+ data given in the comment token. */
+ $comment = $this->dom->createComment($token['data']);
+ $this->stack[0]->appendChild($comment);
+
+ /* An end tag with the tag name "html" */
+ } elseif($token['type'] === HTML5::ENDTAG && $token['name'] === 'html') {
+ /* If the parser was originally created in order to handle the
+ setting of an element's innerHTML attribute, this is a parse error;
+ ignore the token. (The element will be an html element in this
+ case.) (innerHTML case) */
+
+ /* Otherwise, switch to the trailing end phase. */
+ $this->phase = self::END_PHASE;
+
+ /* Anything else */
+ } else {
+ /* Parse error. Set the insertion mode to "in body" and reprocess
+ the token. */
+ $this->mode = self::IN_BODY;
+ return $this->inBody($token);
+ }
+ }
+
+ private function inFrameset($token)
+ {
+ /* Handle the token as follows: */
+
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ U+000D CARRIAGE RETURN (CR), or U+0020 SPACE */
+ if($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) {
+ /* Append the character to the current node. */
+ $this->insertText($token['data']);
+
+ /* A comment token */
+ } elseif($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the current node with the data
+ attribute set to the data given in the comment token. */
+ $this->insertComment($token['data']);
+
+ /* A start tag with the tag name "frameset" */
+ } elseif($token['name'] === 'frameset' &&
+ $token['type'] === HTML5::STARTTAG) {
+ $this->insertElement($token);
+
+ /* An end tag with the tag name "frameset" */
+ } elseif($token['name'] === 'frameset' &&
+ $token['type'] === HTML5::ENDTAG) {
+ /* If the current node is the root html element, then this is a
+ parse error; ignore the token. (innerHTML case) */
+ if(end($this->stack)->nodeName === 'html') {
+ // Ignore
+
+ } else {
+ /* Otherwise, pop the current node from the stack of open
+ elements. */
+ array_pop($this->stack);
+
+ /* If the parser was not originally created in order to handle
+ the setting of an element's innerHTML attribute (innerHTML case),
+ and the current node is no longer a frameset element, then change
+ the insertion mode to "after frameset". */
+ $this->mode = self::AFTR_FRAME;
+ }
+
+ /* A start tag with the tag name "frame" */
+ } elseif($token['name'] === 'frame' &&
+ $token['type'] === HTML5::STARTTAG) {
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ /* Immediately pop the current node off the stack of open elements. */
+ array_pop($this->stack);
+
+ /* A start tag with the tag name "noframes" */
+ } elseif($token['name'] === 'noframes' &&
+ $token['type'] === HTML5::STARTTAG) {
+ /* Process the token as if the insertion mode had been "in body". */
+ $this->inBody($token);
+
+ /* Anything else */
+ } else {
+ /* Parse error. Ignore the token. */
+ }
+ }
+
+ private function afterFrameset($token)
+ {
+ /* Handle the token as follows: */
+
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ U+000D CARRIAGE RETURN (CR), or U+0020 SPACE */
+ if($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) {
+ /* Append the character to the current node. */
+ $this->insertText($token['data']);
+
+ /* A comment token */
+ } elseif($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the current node with the data
+ attribute set to the data given in the comment token. */
+ $this->insertComment($token['data']);
+
+ /* An end tag with the tag name "html" */
+ } elseif($token['name'] === 'html' &&
+ $token['type'] === HTML5::ENDTAG) {
+ /* Switch to the trailing end phase. */
+ $this->phase = self::END_PHASE;
+
+ /* A start tag with the tag name "noframes" */
+ } elseif($token['name'] === 'noframes' &&
+ $token['type'] === HTML5::STARTTAG) {
+ /* Process the token as if the insertion mode had been "in body". */
+ $this->inBody($token);
+
+ /* Anything else */
+ } else {
+ /* Parse error. Ignore the token. */
+ }
+ }
+
+ private function trailingEndPhase($token)
+ {
+ /* After the main phase, as each token is emitted from the tokenisation
+ stage, it must be processed as described in this section. */
+
+ /* A DOCTYPE token */
+ if($token['type'] === HTML5::DOCTYPE) {
+ // Parse error. Ignore the token.
+
+ /* A comment token */
+ } elseif($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the Document object with the data
+ attribute set to the data given in the comment token. */
+ $comment = $this->dom->createComment($token['data']);
+ $this->dom->appendChild($comment);
+
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE */
+ } elseif($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) {
+ /* Process the token as it would be processed in the main phase. */
+ $this->mainPhase($token);
+
+ /* A character token that is not one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE. Or a start tag token. Or an end tag token. */
+ } elseif(($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) ||
+ $token['type'] === HTML5::STARTTAG || $token['type'] === HTML5::ENDTAG) {
+ /* Parse error. Switch back to the main phase and reprocess the
+ token. */
+ $this->phase = self::MAIN_PHASE;
+ return $this->mainPhase($token);
+
+ /* An end-of-file token */
+ } elseif($token['type'] === HTML5::EOF) {
+ /* OMG DONE!! */
+ }
+ }
+
+ private function insertElement($token, $append = true)
+ {
+ $el = $this->dom->createElement($token['name']);
+
+ foreach($token['attr'] as $attr) {
+ if(!$el->hasAttribute($attr['name'])) {
+ $el->setAttribute($attr['name'], $attr['value']);
+ }
+ }
+
+ $this->appendToRealParent($el);
+ $this->stack[] = $el;
+
+ return $el;
+ }
+
+ private function insertText($data)
+ {
+ $text = $this->dom->createTextNode($data);
+ $this->appendToRealParent($text);
+ }
+
+ private function insertComment($data)
+ {
+ $comment = $this->dom->createComment($data);
+ $this->appendToRealParent($comment);
+ }
+
+ private function appendToRealParent($node)
+ {
+ if($this->foster_parent === null) {
+ end($this->stack)->appendChild($node);
+
+ } elseif($this->foster_parent !== null) {
+ /* If the foster parent element is the parent element of the
+ last table element in the stack of open elements, then the new
+ node must be inserted immediately before the last table element
+ in the stack of open elements in the foster parent element;
+ otherwise, the new node must be appended to the foster parent
+ element. */
+ for($n = count($this->stack) - 1; $n >= 0; $n--) {
+ if($this->stack[$n]->nodeName === 'table' &&
+ $this->stack[$n]->parentNode !== null) {
+ $table = $this->stack[$n];
+ break;
+ }
+ }
+
+ if(isset($table) && $this->foster_parent->isSameNode($table->parentNode))
+ $this->foster_parent->insertBefore($node, $table);
+ else
+ $this->foster_parent->appendChild($node);
+
+ $this->foster_parent = null;
+ }
+ }
+
+ private function elementInScope($el, $table = false)
+ {
+ if(is_array($el)) {
+ foreach($el as $element) {
+ if($this->elementInScope($element, $table)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ $leng = count($this->stack);
+
+ for($n = 0; $n < $leng; $n++) {
+ /* 1. Initialise node to be the current node (the bottommost node of
+ the stack). */
+ $node = $this->stack[$leng - 1 - $n];
+
+ if($node->tagName === $el) {
+ /* 2. If node is the target node, terminate in a match state. */
+ return true;
+
+ } elseif($node->tagName === 'table') {
+ /* 3. Otherwise, if node is a table element, terminate in a failure
+ state. */
+ return false;
+
+ } elseif($table === true && in_array($node->tagName, array('caption', 'td',
+ 'th', 'button', 'marquee', 'object'))) {
+ /* 4. Otherwise, if the algorithm is the "has an element in scope"
+ variant (rather than the "has an element in table scope" variant),
+ and node is one of the following, terminate in a failure state. */
+ return false;
+
+ } elseif($node === $node->ownerDocument->documentElement) {
+ /* 5. Otherwise, if node is an html element (root element), terminate
+ in a failure state. (This can only happen if the node is the topmost
+ node of the stack of open elements, and prevents the next step from
+ being invoked if there are no more elements in the stack.) */
+ return false;
+ }
+
+ /* Otherwise, set node to the previous entry in the stack of open
+ elements and return to step 2. (This will never fail, since the loop
+ will always terminate in the previous step if the top of the stack
+ is reached.) */
+ }
+ }
+
+ private function reconstructActiveFormattingElements()
+ {
+ /* 1. If there are no entries in the list of active formatting elements,
+ then there is nothing to reconstruct; stop this algorithm. */
+ $formatting_elements = count($this->a_formatting);
+
+ if($formatting_elements === 0) {
+ return false;
+ }
+
+ /* 3. Let entry be the last (most recently added) element in the list
+ of active formatting elements. */
+ $entry = end($this->a_formatting);
+
+ /* 2. If the last (most recently added) entry in the list of active
+ formatting elements is a marker, or if it is an element that is in the
+ stack of open elements, then there is nothing to reconstruct; stop this
+ algorithm. */
+ if($entry === self::MARKER || in_array($entry, $this->stack, true)) {
+ return false;
+ }
+
+ for($a = $formatting_elements - 1; $a >= 0; true) {
+ /* 4. If there are no entries before entry in the list of active
+ formatting elements, then jump to step 8. */
+ if($a === 0) {
+ $step_seven = false;
+ break;
+ }
+
+ /* 5. Let entry be the entry one earlier than entry in the list of
+ active formatting elements. */
+ $a--;
+ $entry = $this->a_formatting[$a];
+
+ /* 6. If entry is neither a marker nor an element that is also in
+ thetack of open elements, go to step 4. */
+ if($entry === self::MARKER || in_array($entry, $this->stack, true)) {
+ break;
+ }
+ }
+
+ while(true) {
+ /* 7. Let entry be the element one later than entry in the list of
+ active formatting elements. */
+ if(isset($step_seven) && $step_seven === true) {
+ $a++;
+ $entry = $this->a_formatting[$a];
+ }
+
+ /* 8. Perform a shallow clone of the element entry to obtain clone. */
+ $clone = $entry->cloneNode();
+
+ /* 9. Append clone to the current node and push it onto the stack
+ of open elements so that it is the new current node. */
+ end($this->stack)->appendChild($clone);
+ $this->stack[] = $clone;
+
+ /* 10. Replace the entry for entry in the list with an entry for
+ clone. */
+ $this->a_formatting[$a] = $clone;
+
+ /* 11. If the entry for clone in the list of active formatting
+ elements is not the last entry in the list, return to step 7. */
+ if(end($this->a_formatting) !== $clone) {
+ $step_seven = true;
+ } else {
+ break;
+ }
+ }
+ }
+
+ private function clearTheActiveFormattingElementsUpToTheLastMarker()
+ {
+ /* When the steps below require the UA to clear the list of active
+ formatting elements up to the last marker, the UA must perform the
+ following steps: */
+
+ while(true) {
+ /* 1. Let entry be the last (most recently added) entry in the list
+ of active formatting elements. */
+ $entry = end($this->a_formatting);
+
+ /* 2. Remove entry from the list of active formatting elements. */
+ array_pop($this->a_formatting);
+
+ /* 3. If entry was a marker, then stop the algorithm at this point.
+ The list has been cleared up to the last marker. */
+ if($entry === self::MARKER) {
+ break;
+ }
+ }
+ }
+
+ private function generateImpliedEndTags(array $exclude = array())
+ {
+ /* When the steps below require the UA to generate implied end tags,
+ then, if the current node is a dd element, a dt element, an li element,
+ a p element, a td element, a th element, or a tr element, the UA must
+ act as if an end tag with the respective tag name had been seen and
+ then generate implied end tags again. */
+ $node = end($this->stack);
+ $elements = array_diff(array('dd', 'dt', 'li', 'p', 'td', 'th', 'tr'), $exclude);
+
+ while(in_array(end($this->stack)->nodeName, $elements)) {
+ array_pop($this->stack);
+ }
+ }
+
+ private function getElementCategory($name)
+ {
+ if(in_array($name, $this->special))
+ return self::SPECIAL;
+
+ elseif(in_array($name, $this->scoping))
+ return self::SCOPING;
+
+ elseif(in_array($name, $this->formatting))
+ return self::FORMATTING;
+
+ else
+ return self::PHRASING;
+ }
+
+ private function clearStackToTableContext($elements)
+ {
+ /* When the steps above require the UA to clear the stack back to a
+ table context, it means that the UA must, while the current node is not
+ a table element or an html element, pop elements from the stack of open
+ elements. If this causes any elements to be popped from the stack, then
+ this is a parse error. */
+ while(true) {
+ $node = end($this->stack)->nodeName;
+
+ if(in_array($node, $elements)) {
+ break;
+ } else {
+ array_pop($this->stack);
+ }
+ }
+ }
+
+ private function resetInsertionMode()
+ {
+ /* 1. Let last be false. */
+ $last = false;
+ $leng = count($this->stack);
+
+ for($n = $leng - 1; $n >= 0; $n--) {
+ /* 2. Let node be the last node in the stack of open elements. */
+ $node = $this->stack[$n];
+
+ /* 3. If node is the first node in the stack of open elements, then
+ set last to true. If the element whose innerHTML attribute is being
+ set is neither a td element nor a th element, then set node to the
+ element whose innerHTML attribute is being set. (innerHTML case) */
+ if($this->stack[0]->isSameNode($node)) {
+ $last = true;
+ }
+
+ /* 4. If node is a select element, then switch the insertion mode to
+ "in select" and abort these steps. (innerHTML case) */
+ if($node->nodeName === 'select') {
+ $this->mode = self::IN_SELECT;
+ break;
+
+ /* 5. If node is a td or th element, then switch the insertion mode
+ to "in cell" and abort these steps. */
+ } elseif($node->nodeName === 'td' || $node->nodeName === 'th') {
+ $this->mode = self::IN_CELL;
+ break;
+
+ /* 6. If node is a tr element, then switch the insertion mode to
+ "in row" and abort these steps. */
+ } elseif($node->nodeName === 'tr') {
+ $this->mode = self::IN_ROW;
+ break;
+
+ /* 7. If node is a tbody, thead, or tfoot element, then switch the
+ insertion mode to "in table body" and abort these steps. */
+ } elseif(in_array($node->nodeName, array('tbody', 'thead', 'tfoot'))) {
+ $this->mode = self::IN_TBODY;
+ break;
+
+ /* 8. If node is a caption element, then switch the insertion mode
+ to "in caption" and abort these steps. */
+ } elseif($node->nodeName === 'caption') {
+ $this->mode = self::IN_CAPTION;
+ break;
+
+ /* 9. If node is a colgroup element, then switch the insertion mode
+ to "in column group" and abort these steps. (innerHTML case) */
+ } elseif($node->nodeName === 'colgroup') {
+ $this->mode = self::IN_CGROUP;
+ break;
+
+ /* 10. If node is a table element, then switch the insertion mode
+ to "in table" and abort these steps. */
+ } elseif($node->nodeName === 'table') {
+ $this->mode = self::IN_TABLE;
+ break;
+
+ /* 11. If node is a head element, then switch the insertion mode
+ to "in body" ("in body"! not "in head"!) and abort these steps.
+ (innerHTML case) */
+ } elseif($node->nodeName === 'head') {
+ $this->mode = self::IN_BODY;
+ break;
+
+ /* 12. If node is a body element, then switch the insertion mode to
+ "in body" and abort these steps. */
+ } elseif($node->nodeName === 'body') {
+ $this->mode = self::IN_BODY;
+ break;
+
+ /* 13. If node is a frameset element, then switch the insertion
+ mode to "in frameset" and abort these steps. (innerHTML case) */
+ } elseif($node->nodeName === 'frameset') {
+ $this->mode = self::IN_FRAME;
+ break;
+
+ /* 14. If node is an html element, then: if the head element
+ pointer is null, switch the insertion mode to "before head",
+ otherwise, switch the insertion mode to "after head". In either
+ case, abort these steps. (innerHTML case) */
+ } elseif($node->nodeName === 'html') {
+ $this->mode = ($this->head_pointer === null)
+ ? self::BEFOR_HEAD
+ : self::AFTER_HEAD;
+
+ break;
+
+ /* 15. If last is true, then set the insertion mode to "in body"
+ and abort these steps. (innerHTML case) */
+ } elseif($last) {
+ $this->mode = self::IN_BODY;
+ break;
+ }
+ }
+ }
+
+ private function closeCell()
+ {
+ /* If the stack of open elements has a td or th element in table scope,
+ then act as if an end tag token with that tag name had been seen. */
+ foreach(array('td', 'th') as $cell) {
+ if($this->elementInScope($cell, true)) {
+ $this->inCell(array(
+ 'name' => $cell,
+ 'type' => HTML5::ENDTAG
+ ));
+
+ break;
+ }
+ }
+ }
+
+ public function save()
+ {
+ return $this->dom;
+ }
+}
diff --git a/vendor/ezyang/htmlpurifier/maintenance/add-vimline.php b/vendor/ezyang/htmlpurifier/maintenance/add-vimline.php
new file mode 100644
index 000000000..d6a8eb202
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/add-vimline.php
@@ -0,0 +1,130 @@
+#!/usr/bin/php
+<?php
+
+chdir(dirname(__FILE__));
+require_once 'common.php';
+assertCli();
+
+/**
+ * @file
+ * Adds vimline to files
+ */
+
+chdir(dirname(__FILE__) . '/..');
+$FS = new FSTools();
+
+$vimline = 'vim: et sw=4 sts=4';
+
+$files = $FS->globr('.', '*');
+foreach ($files as $file) {
+ if (
+ !is_file($file) ||
+ prefix_is('./docs/doxygen', $file) ||
+ prefix_is('./library/standalone', $file) ||
+ prefix_is('./docs/specimens', $file) ||
+ postfix_is('.ser', $file) ||
+ postfix_is('.tgz', $file) ||
+ postfix_is('.patch', $file) ||
+ postfix_is('.dtd', $file) ||
+ postfix_is('.ent', $file) ||
+ postfix_is('.png', $file) ||
+ postfix_is('.ico', $file) ||
+ // wontfix
+ postfix_is('.vtest', $file) ||
+ postfix_is('.svg', $file) ||
+ postfix_is('.phpt', $file) ||
+ postfix_is('VERSION', $file) ||
+ postfix_is('WHATSNEW', $file) ||
+ postfix_is('configdoc/usage.xml', $file) ||
+ postfix_is('library/HTMLPurifier.includes.php', $file) ||
+ postfix_is('library/HTMLPurifier.safe-includes.php', $file) ||
+ postfix_is('smoketests/xssAttacks.xml', $file) ||
+ // phpt files
+ postfix_is('.diff', $file) ||
+ postfix_is('.exp', $file) ||
+ postfix_is('.log', $file) ||
+ postfix_is('.out', $file) ||
+
+ $file == './library/HTMLPurifier/Lexer/PH5P.php' ||
+ $file == './maintenance/PH5P.php'
+ ) continue;
+ $ext = strrchr($file, '.');
+ if (
+ postfix_is('README', $file) ||
+ postfix_is('LICENSE', $file) ||
+ postfix_is('CREDITS', $file) ||
+ postfix_is('INSTALL', $file) ||
+ postfix_is('NEWS', $file) ||
+ postfix_is('TODO', $file) ||
+ postfix_is('WYSIWYG', $file) ||
+ postfix_is('Changelog', $file)
+ ) $ext = '.txt';
+ if (postfix_is('Doxyfile', $file)) $ext = 'Doxyfile';
+ if (postfix_is('.php.in', $file)) $ext = '.php';
+ $no_nl = false;
+ switch ($ext) {
+ case '.php':
+ case '.inc':
+ case '.js':
+ $line = '// %s';
+ break;
+ case '.html':
+ case '.xsl':
+ case '.xml':
+ case '.htc':
+ $line = "<!-- %s\n-->";
+ break;
+ case '.htmlt':
+ $no_nl = true;
+ $line = '--# %s';
+ break;
+ case '.ini':
+ $line = '; %s';
+ break;
+ case '.css':
+ $line = '/* %s */';
+ break;
+ case '.bat':
+ $line = 'rem %s';
+ break;
+ case '.txt':
+ case '.utf8':
+ if (
+ prefix_is('./library/HTMLPurifier/ConfigSchema', $file) ||
+ prefix_is('./smoketests/test-schema', $file) ||
+ prefix_is('./tests/HTMLPurifier/StringHashParser', $file)
+ ) {
+ $no_nl = true;
+ $line = '--# %s';
+ } else {
+ $line = ' %s';
+ }
+ break;
+ case 'Doxyfile':
+ $line = '# %s';
+ break;
+ default:
+ throw new Exception('Unknown file: ' . $file);
+ }
+
+ echo "$file\n";
+ $contents = file_get_contents($file);
+
+ $regex = '~' . str_replace('%s', 'vim: .+', preg_quote($line, '~')) . '~m';
+ $contents = preg_replace($regex, '', $contents);
+
+ $contents = rtrim($contents);
+
+ if (strpos($contents, "\r\n") !== false) $nl = "\r\n";
+ elseif (strpos($contents, "\n") !== false) $nl = "\n";
+ elseif (strpos($contents, "\r") !== false) $nl = "\r";
+ else $nl = PHP_EOL;
+
+ if (!$no_nl) $contents .= $nl;
+ $contents .= $nl . str_replace('%s', $vimline, $line) . $nl;
+
+ file_put_contents($file, $contents);
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/maintenance/common.php b/vendor/ezyang/htmlpurifier/maintenance/common.php
new file mode 100644
index 000000000..342bc205a
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/common.php
@@ -0,0 +1,25 @@
+<?php
+
+function assertCli()
+{
+ if (php_sapi_name() != 'cli' && !getenv('PHP_IS_CLI')) {
+ echo 'Script cannot be called from web-browser (if you are indeed calling via cli,
+set environment variable PHP_IS_CLI to work around this).';
+ exit(1);
+ }
+}
+
+function prefix_is($comp, $subject)
+{
+ return strncmp($comp, $subject, strlen($comp)) === 0;
+}
+
+function postfix_is($comp, $subject)
+{
+ return strlen($subject) < $comp ? false : substr($subject, -strlen($comp)) === $comp;
+}
+
+// Load useful stuff like FSTools
+require_once dirname(__FILE__) . '/../extras/HTMLPurifierExtras.auto.php';
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/maintenance/compile-doxygen.sh b/vendor/ezyang/htmlpurifier/maintenance/compile-doxygen.sh
new file mode 100755
index 000000000..ecd1127fd
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/compile-doxygen.sh
@@ -0,0 +1,11 @@
+#!/bin/bash
+cd ..
+mkdir docs/doxygen
+rm -Rf docs/doxygen/*
+doxygen 1>docs/doxygen/info.log 2>docs/doxygen/errors.log
+if [ "$?" != 0 ]; then
+ cat docs/doxygen/errors.log
+ exit
+fi
+cd docs
+tar czf doxygen.tgz doxygen
diff --git a/vendor/ezyang/htmlpurifier/maintenance/config-scanner.php b/vendor/ezyang/htmlpurifier/maintenance/config-scanner.php
new file mode 100644
index 000000000..c614d1fbc
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/config-scanner.php
@@ -0,0 +1,155 @@
+#!/usr/bin/php
+<?php
+
+chdir(dirname(__FILE__));
+require_once 'common.php';
+require_once '../library/HTMLPurifier.auto.php';
+assertCli();
+
+if (version_compare(PHP_VERSION, '5.2.2', '<')) {
+ echo "This script requires PHP 5.2.2 or later, for tokenizer line numbers.";
+ exit(1);
+}
+
+/**
+ * @file
+ * Scans HTML Purifier source code for $config tokens and records the
+ * directive being used; configdoc can use this info later.
+ *
+ * Currently, this just dumps all the info onto the console. Eventually, it
+ * will create an XML file that our XSLT transform can use.
+ */
+
+$FS = new FSTools();
+chdir(dirname(__FILE__) . '/../library/');
+$raw_files = $FS->globr('.', '*.php');
+$files = array();
+foreach ($raw_files as $file) {
+ $file = substr($file, 2); // rm leading './'
+ if (strncmp('standalone/', $file, 11) === 0) continue; // rm generated files
+ if (substr_count($file, '.') > 1) continue; // rm meta files
+ $files[] = $file;
+}
+
+/**
+ * Moves the $i cursor to the next non-whitespace token
+ */
+function consumeWhitespace($tokens, &$i)
+{
+ do {$i++;} while (is_array($tokens[$i]) && $tokens[$i][0] === T_WHITESPACE);
+}
+
+/**
+ * Tests whether or not a token is a particular type. There are three run-cases:
+ * - ($token, $expect_token): tests if the token is $expect_token type;
+ * - ($token, $expect_value): tests if the token is the string $expect_value;
+ * - ($token, $expect_token, $expect_value): tests if token is $expect_token type, and
+ * its string representation is $expect_value
+ */
+function testToken($token, $value_or_token, $value = null)
+{
+ if (is_null($value)) {
+ if (is_int($value_or_token)) return is_array($token) && $token[0] === $value_or_token;
+ else return $token === $value_or_token;
+ } else {
+ return is_array($token) && $token[0] === $value_or_token && $token[1] === $value;
+ }
+}
+
+$counter = 0;
+$full_counter = 0;
+$tracker = array();
+
+foreach ($files as $file) {
+ $tokens = token_get_all(file_get_contents($file));
+ $file = str_replace('\\', '/', $file);
+ for ($i = 0, $c = count($tokens); $i < $c; $i++) {
+ $ok = false;
+ // Match $config
+ if (!$ok && testToken($tokens[$i], T_VARIABLE, '$config')) $ok = true;
+ // Match $this->config
+ while (!$ok && testToken($tokens[$i], T_VARIABLE, '$this')) {
+ consumeWhitespace($tokens, $i);
+ if (!testToken($tokens[$i], T_OBJECT_OPERATOR)) break;
+ consumeWhitespace($tokens, $i);
+ if (testToken($tokens[$i], T_STRING, 'config')) $ok = true;
+ break;
+ }
+ if (!$ok) continue;
+
+ $ok = false;
+ for($i++; $i < $c; $i++) {
+ if ($tokens[$i] === ',' || $tokens[$i] === ')' || $tokens[$i] === ';') {
+ break;
+ }
+ if (is_string($tokens[$i])) continue;
+ if ($tokens[$i][0] === T_OBJECT_OPERATOR) {
+ $ok = true;
+ break;
+ }
+ }
+ if (!$ok) continue;
+
+ $line = $tokens[$i][2];
+
+ consumeWhitespace($tokens, $i);
+ if (!testToken($tokens[$i], T_STRING, 'get')) continue;
+
+ consumeWhitespace($tokens, $i);
+ if (!testToken($tokens[$i], '(')) continue;
+
+ $full_counter++;
+
+ $matched = false;
+ do {
+
+ // What we currently don't match are batch retrievals, and
+ // wildcard retrievals. This data might be useful in the future,
+ // which is why we have a do {} while loop that doesn't actually
+ // do anything.
+
+ consumeWhitespace($tokens, $i);
+ if (!testToken($tokens[$i], T_CONSTANT_ENCAPSED_STRING)) continue;
+ $id = substr($tokens[$i][1], 1, -1);
+
+ $counter++;
+ $matched = true;
+
+ if (!isset($tracker[$id])) $tracker[$id] = array();
+ if (!isset($tracker[$id][$file])) $tracker[$id][$file] = array();
+ $tracker[$id][$file][] = $line;
+
+ } while (0);
+
+ //echo "$file:$line uses $namespace.$directive\n";
+ }
+}
+
+echo "\n$counter/$full_counter instances of \$config or \$this->config found in source code.\n";
+
+echo "Generating XML... ";
+
+$xw = new XMLWriter();
+$xw->openURI('../configdoc/usage.xml');
+$xw->setIndent(true);
+$xw->startDocument('1.0', 'UTF-8');
+$xw->startElement('usage');
+foreach ($tracker as $id => $files) {
+ $xw->startElement('directive');
+ $xw->writeAttribute('id', $id);
+ foreach ($files as $file => $lines) {
+ $xw->startElement('file');
+ $xw->writeAttribute('name', $file);
+ foreach ($lines as $line) {
+ $xw->writeElement('line', $line);
+ }
+ $xw->endElement();
+ }
+ $xw->endElement();
+}
+$xw->endElement();
+$xw->flush();
+
+echo "done!\n";
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/maintenance/flush-definition-cache.php b/vendor/ezyang/htmlpurifier/maintenance/flush-definition-cache.php
new file mode 100755
index 000000000..138badb65
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/flush-definition-cache.php
@@ -0,0 +1,42 @@
+#!/usr/bin/php
+<?php
+
+chdir(dirname(__FILE__));
+require_once 'common.php';
+assertCli();
+
+/**
+ * @file
+ * Flushes the definition serial cache. This file should be
+ * called if changes to any subclasses of HTMLPurifier_Definition
+ * or related classes (such as HTMLPurifier_HTMLModule) are made. This
+ * may also be necessary if you've modified a customized version.
+ *
+ * @param Accepts one argument, cache type to flush; otherwise flushes all
+ * the caches.
+ */
+
+echo "Flushing cache... \n";
+
+require_once(dirname(__FILE__) . '/../library/HTMLPurifier.auto.php');
+
+$config = HTMLPurifier_Config::createDefault();
+
+$names = array('HTML', 'CSS', 'URI', 'Test');
+if (isset($argv[1])) {
+ if (in_array($argv[1], $names)) {
+ $names = array($argv[1]);
+ } else {
+ throw new Exception("Cache parameter {$argv[1]} is not a valid cache");
+ }
+}
+
+foreach ($names as $name) {
+ echo " - Flushing $name\n";
+ $cache = new HTMLPurifier_DefinitionCache_Serializer($name);
+ $cache->flush($config);
+}
+
+echo "Cache flushed successfully.\n";
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/maintenance/flush.php b/vendor/ezyang/htmlpurifier/maintenance/flush.php
new file mode 100644
index 000000000..c0853d230
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/flush.php
@@ -0,0 +1,30 @@
+#!/usr/bin/php
+<?php
+
+chdir(dirname(__FILE__));
+require_once 'common.php';
+assertCli();
+
+/**
+ * @file
+ * Runs all generation/flush cache scripts to ensure that somewhat volatile
+ * generated files are up-to-date.
+ */
+
+function e($cmd)
+{
+ echo "\$ $cmd\n";
+ passthru($cmd, $status);
+ echo "\n";
+ if ($status) exit($status);
+}
+
+$php = empty($_SERVER['argv'][1]) ? 'php' : $_SERVER['argv'][1];
+
+e($php . ' generate-includes.php');
+e($php . ' generate-schema-cache.php');
+e($php . ' flush-definition-cache.php');
+e($php . ' generate-standalone.php');
+e($php . ' config-scanner.php');
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/maintenance/generate-entity-file.php b/vendor/ezyang/htmlpurifier/maintenance/generate-entity-file.php
new file mode 100755
index 000000000..ff1713e39
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/generate-entity-file.php
@@ -0,0 +1,75 @@
+#!/usr/bin/php
+<?php
+
+chdir(dirname(__FILE__));
+require_once 'common.php';
+assertCli();
+
+/**
+ * @file
+ * Parses *.ent files into an entity lookup table, and then serializes and
+ * writes the whole kaboodle to a file. The resulting file is cached so
+ * that this script does not need to be run. This script should rarely,
+ * if ever, be run, since HTML's entities are fairly immutable.
+ */
+
+// here's where the entity files are located, assuming working directory
+// is the same as the location of this PHP file. Needs trailing slash.
+$entity_dir = '../docs/entities/';
+
+// defines the output file for the serialized content.
+$output_file = '../library/HTMLPurifier/EntityLookup/entities.ser';
+
+// courtesy of a PHP manual comment
+function unichr($dec)
+{
+ if ($dec < 128) {
+ $utf = chr($dec);
+ } elseif ($dec < 2048) {
+ $utf = chr(192 + (($dec - ($dec % 64)) / 64));
+ $utf .= chr(128 + ($dec % 64));
+ } else {
+ $utf = chr(224 + (($dec - ($dec % 4096)) / 4096));
+ $utf .= chr(128 + ((($dec % 4096) - ($dec % 64)) / 64));
+ $utf .= chr(128 + ($dec % 64));
+ }
+ return $utf;
+}
+
+if ( !is_dir($entity_dir) ) exit("Fatal Error: Can't find entity directory.\n");
+if ( file_exists($output_file) ) exit("Fatal Error: output file already exists.\n");
+
+$dh = @opendir($entity_dir);
+if ( !$dh ) exit("Fatal Error: Cannot read entity directory.\n");
+
+$entity_files = array();
+while (($file = readdir($dh)) !== false) {
+ if (@$file[0] === '.') continue;
+ if (substr(strrchr($file, "."), 1) !== 'ent') continue;
+ $entity_files[] = $file;
+}
+closedir($dh);
+
+if ( !$entity_files ) exit("Fatal Error: No entity files to parse.\n");
+
+$entity_table = array();
+$regexp = '/<!ENTITY\s+([A-Za-z0-9]+)\s+"&#(?:38;#)?([0-9]+);">/';
+
+foreach ( $entity_files as $file ) {
+ $contents = file_get_contents($entity_dir . $file);
+ $matches = array();
+ preg_match_all($regexp, $contents, $matches, PREG_SET_ORDER);
+ foreach ($matches as $match) {
+ $entity_table[$match[1]] = unichr($match[2]);
+ }
+}
+
+$output = serialize($entity_table);
+
+$fh = fopen($output_file, 'w');
+fwrite($fh, $output);
+fclose($fh);
+
+echo "Completed successfully.";
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/maintenance/generate-includes.php b/vendor/ezyang/htmlpurifier/maintenance/generate-includes.php
new file mode 100644
index 000000000..01e1c2aba
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/generate-includes.php
@@ -0,0 +1,192 @@
+#!/usr/bin/php
+<?php
+
+chdir(dirname(__FILE__));
+require_once 'common.php';
+require_once '../tests/path2class.func.php';
+require_once '../library/HTMLPurifier/Bootstrap.php';
+assertCli();
+
+/**
+ * @file
+ * Generates an include stub for users who do not want to use the autoloader.
+ * When new files are added to HTML Purifier's main codebase, this file should
+ * be called.
+ */
+
+chdir(dirname(__FILE__) . '/../library/');
+$FS = new FSTools();
+
+$exclude_dirs = array(
+ 'HTMLPurifier/Language/',
+ 'HTMLPurifier/ConfigSchema/',
+ 'HTMLPurifier/Filter/',
+ 'HTMLPurifier/Printer/',
+ /* These should be excluded, but need to have ConfigSchema support first
+
+ */
+);
+$exclude_files = array(
+ 'HTMLPurifier/Lexer/PEARSax3.php',
+ 'HTMLPurifier/Lexer/PH5P.php',
+ 'HTMLPurifier/Printer.php',
+);
+
+// Determine what files need to be included:
+echo 'Scanning for files... ';
+$raw_files = $FS->globr('.', '*.php');
+if (!$raw_files) throw new Exception('Did not find any PHP source files');
+$files = array();
+foreach ($raw_files as $file) {
+ $file = substr($file, 2); // rm leading './'
+ if (strncmp('standalone/', $file, 11) === 0) continue; // rm generated files
+ if (substr_count($file, '.') > 1) continue; // rm meta files
+ $ok = true;
+ foreach ($exclude_dirs as $dir) {
+ if (strncmp($dir, $file, strlen($dir)) === 0) {
+ $ok = false;
+ break;
+ }
+ }
+ if (!$ok) continue; // rm excluded directories
+ if (in_array($file, $exclude_files)) continue; // rm excluded files
+ $files[] = $file;
+}
+echo "done!\n";
+
+// Reorder list so that dependencies are included first:
+
+/**
+ * Returns a lookup array of dependencies for a file.
+ *
+ * @note This function expects that format $name extends $parent on one line
+ *
+ * @param string $file
+ * File to check dependencies of.
+ * @return array
+ * Lookup array of files the file is dependent on, sorted accordingly.
+ */
+function get_dependency_lookup($file)
+{
+ static $cache = array();
+ if (isset($cache[$file])) return $cache[$file];
+ if (!file_exists($file)) {
+ echo "File doesn't exist: $file\n";
+ return array();
+ }
+ $fh = fopen($file, 'r');
+ $deps = array();
+ while (!feof($fh)) {
+ $line = fgets($fh);
+ if (strncmp('class', $line, 5) === 0) {
+ // The implementation here is fragile and will break if we attempt
+ // to use interfaces. Beware!
+ $arr = explode(' extends ', trim($line, ' {'."\n\r"), 2);
+ if (count($arr) < 2) break;
+ $parent = $arr[1];
+ $dep_file = HTMLPurifier_Bootstrap::getPath($parent);
+ if (!$dep_file) break;
+ $deps[$dep_file] = true;
+ break;
+ }
+ }
+ fclose($fh);
+ foreach (array_keys($deps) as $file) {
+ // Extra dependencies must come *before* base dependencies
+ $deps = get_dependency_lookup($file) + $deps;
+ }
+ $cache[$file] = $deps;
+ return $deps;
+}
+
+/**
+ * Sorts files based on dependencies. This function is lazy and will not
+ * group files with dependencies together; it will merely ensure that a file
+ * is never included before its dependencies are.
+ *
+ * @param $files
+ * Files array to sort.
+ * @return
+ * Sorted array ($files is not modified by reference!)
+ */
+function dep_sort($files)
+{
+ $ret = array();
+ $cache = array();
+ foreach ($files as $file) {
+ if (isset($cache[$file])) continue;
+ $deps = get_dependency_lookup($file);
+ foreach (array_keys($deps) as $dep) {
+ if (!isset($cache[$dep])) {
+ $ret[] = $dep;
+ $cache[$dep] = true;
+ }
+ }
+ $cache[$file] = true;
+ $ret[] = $file;
+ }
+ return $ret;
+}
+
+$files = dep_sort($files);
+
+// Build the actual include stub:
+
+$version = trim(file_get_contents('../VERSION'));
+
+// stub
+$php = "<?php
+
+/**
+ * @file
+ * This file was auto-generated by generate-includes.php and includes all of
+ * the core files required by HTML Purifier. Use this if performance is a
+ * primary concern and you are using an opcode cache. PLEASE DO NOT EDIT THIS
+ * FILE, changes will be overwritten the next time the script is run.
+ *
+ * @version $version
+ *
+ * @warning
+ * You must *not* include any other HTML Purifier files before this file,
+ * because 'require' not 'require_once' is used.
+ *
+ * @warning
+ * This file requires that the include path contains the HTML Purifier
+ * library directory; this is not auto-set.
+ */
+
+";
+
+foreach ($files as $file) {
+ $php .= "require '$file';" . PHP_EOL;
+}
+
+echo "Writing HTMLPurifier.includes.php... ";
+file_put_contents('HTMLPurifier.includes.php', $php);
+echo "done!\n";
+
+$php = "<?php
+
+/**
+ * @file
+ * This file was auto-generated by generate-includes.php and includes all of
+ * the core files required by HTML Purifier. This is a convenience stub that
+ * includes all files using dirname(__FILE__) and require_once. PLEASE DO NOT
+ * EDIT THIS FILE, changes will be overwritten the next time the script is run.
+ *
+ * Changes to include_path are not necessary.
+ */
+
+\$__dir = dirname(__FILE__);
+
+";
+
+foreach ($files as $file) {
+ $php .= "require_once \$__dir . '/$file';" . PHP_EOL;
+}
+
+echo "Writing HTMLPurifier.safe-includes.php... ";
+file_put_contents('HTMLPurifier.safe-includes.php', $php);
+echo "done!\n";
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/maintenance/generate-ph5p-patch.php b/vendor/ezyang/htmlpurifier/maintenance/generate-ph5p-patch.php
new file mode 100644
index 000000000..c92a7d211
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/generate-ph5p-patch.php
@@ -0,0 +1,22 @@
+<?php
+
+/**
+ * @file
+ * This file compares our version of PH5P with Jero's original version, and
+ * generates a patch of the differences. This script should be run whenever
+ * library/HTMLPurifier/Lexer/PH5P.php is modified.
+ */
+
+$orig = realpath(dirname(__FILE__) . '/PH5P.php');
+$new = realpath(dirname(__FILE__) . '/../library/HTMLPurifier/Lexer/PH5P.php');
+$newt = dirname(__FILE__) . '/PH5P.new.php'; // temporary file
+
+// minor text-processing of new file to get into same format as original
+$new_src = file_get_contents($new);
+$new_src = '<?php' . PHP_EOL . substr($new_src, strpos($new_src, 'class HTML5 {'));
+
+file_put_contents($newt, $new_src);
+shell_exec("diff -u \"$orig\" \"$newt\" > PH5P.patch");
+unlink($newt);
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/maintenance/generate-schema-cache.php b/vendor/ezyang/htmlpurifier/maintenance/generate-schema-cache.php
new file mode 100644
index 000000000..339ff12da
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/generate-schema-cache.php
@@ -0,0 +1,45 @@
+#!/usr/bin/php
+<?php
+
+require_once dirname(__FILE__) . '/common.php';
+require_once dirname(__FILE__) . '/../library/HTMLPurifier.auto.php';
+assertCli();
+
+/**
+ * @file
+ * Generates a schema cache file, saving it to
+ * library/HTMLPurifier/ConfigSchema/schema.ser.
+ *
+ * This should be run when new configuration options are added to
+ * HTML Purifier. A cached version is available via the repository
+ * so this does not normally have to be regenerated.
+ *
+ * If you have a directory containing custom configuration schema files,
+ * you can simple add a path to that directory as a parameter to
+ * this, and they will get included.
+ */
+
+$target = dirname(__FILE__) . '/../library/HTMLPurifier/ConfigSchema/schema.ser';
+
+$builder = new HTMLPurifier_ConfigSchema_InterchangeBuilder();
+$interchange = new HTMLPurifier_ConfigSchema_Interchange();
+
+$builder->buildDir($interchange);
+
+$loader = dirname(__FILE__) . '/../config-schema.php';
+if (file_exists($loader)) include $loader;
+foreach ($_SERVER['argv'] as $i => $dir) {
+ if ($i === 0) continue;
+ $builder->buildDir($interchange, realpath($dir));
+}
+
+$interchange->validate();
+
+$schema_builder = new HTMLPurifier_ConfigSchema_Builder_ConfigSchema();
+$schema = $schema_builder->build($interchange);
+
+echo "Saving schema... ";
+file_put_contents($target, serialize($schema));
+echo "done!\n";
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/maintenance/generate-standalone.php b/vendor/ezyang/htmlpurifier/maintenance/generate-standalone.php
new file mode 100755
index 000000000..254d4d83b
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/generate-standalone.php
@@ -0,0 +1,159 @@
+#!/usr/bin/php
+<?php
+
+chdir(dirname(__FILE__));
+require_once 'common.php';
+assertCli();
+
+/**
+ * @file
+ * Compiles all of HTML Purifier's library files into one big file
+ * named HTMLPurifier.standalone.php. This is usually called during the
+ * release process.
+ */
+
+/**
+ * Global hash that tracks already loaded includes
+ */
+$GLOBALS['loaded'] = array();
+
+/**
+ * Custom FSTools for this script that overloads some behavior
+ * @warning The overloading of copy() is not necessarily global for
+ * this script. Watch out!
+ */
+class MergeLibraryFSTools extends FSTools
+{
+ public function copyable($entry)
+ {
+ // Skip hidden files
+ if ($entry[0] == '.') {
+ return false;
+ }
+ return true;
+ }
+ public function copy($source, $dest)
+ {
+ copy_and_remove_includes($source, $dest);
+ }
+}
+$FS = new MergeLibraryFSTools();
+
+/**
+ * Replaces the includes inside PHP source code with the corresponding
+ * source.
+ * @param string $text PHP source code to replace includes from
+ */
+function replace_includes($text)
+{
+ // also remove vim modelines
+ return preg_replace_callback(
+ "/require(?:_once)? ['\"]([^'\"]+)['\"];/",
+ 'replace_includes_callback',
+ $text
+ );
+}
+
+/**
+ * Removes leading PHP tags from included files. Assumes that there is
+ * no trailing tag. Also removes vim modelines.
+ * @note This is safe for files that have internal <?php
+ * @param string $text Text to have leading PHP tag from
+ */
+function remove_php_tags($text)
+{
+ $text = preg_replace('#// vim:.+#', '', $text);
+ return substr($text, 5);
+}
+
+/**
+ * Copies the contents of a directory to the standalone directory
+ * @param string $dir Directory to copy
+ */
+function make_dir_standalone($dir)
+{
+ global $FS;
+ return $FS->copyr($dir, 'standalone/' . $dir);
+}
+
+/**
+ * Copies the contents of a file to the standalone directory
+ * @param string $file File to copy
+ */
+function make_file_standalone($file)
+{
+ global $FS;
+ $FS->mkdirr('standalone/' . dirname($file));
+ copy_and_remove_includes($file, 'standalone/' . $file);
+ return true;
+}
+
+/**
+ * Copies a file to another location recursively, if it is a PHP file
+ * remove includes
+ * @param string $file Original file
+ * @param string $sfile New location of file
+ */
+function copy_and_remove_includes($file, $sfile)
+{
+ $contents = file_get_contents($file);
+ if (strrchr($file, '.') === '.php') $contents = replace_includes($contents);
+ return file_put_contents($sfile, $contents);
+}
+
+/**
+ * @param $matches preg_replace_callback matches array, where index 1
+ * is the filename to include
+ */
+function replace_includes_callback($matches)
+{
+ $file = $matches[1];
+ $preserve = array(
+ // PEAR (external)
+ 'XML/HTMLSax3.php' => 1
+ );
+ if (isset($preserve[$file])) {
+ return $matches[0];
+ }
+ if (isset($GLOBALS['loaded'][$file])) return '';
+ $GLOBALS['loaded'][$file] = true;
+ return replace_includes(remove_php_tags(file_get_contents($file)));
+}
+
+echo 'Generating includes file... ';
+shell_exec('php generate-includes.php');
+echo "done!\n";
+
+chdir(dirname(__FILE__) . '/../library/');
+
+echo 'Creating full file...';
+$contents = replace_includes(file_get_contents('HTMLPurifier.includes.php'));
+$contents = str_replace(
+ // Note that bootstrap is now inside the standalone file
+ "define('HTMLPURIFIER_PREFIX', realpath(dirname(__FILE__) . '/..'));",
+ "define('HTMLPURIFIER_PREFIX', dirname(__FILE__) . '/standalone');
+ set_include_path(HTMLPURIFIER_PREFIX . PATH_SEPARATOR . get_include_path());",
+ $contents
+);
+file_put_contents('HTMLPurifier.standalone.php', $contents);
+echo ' done!' . PHP_EOL;
+
+echo 'Creating standalone directory...';
+$FS->rmdirr('standalone'); // ensure a clean copy
+
+// data files
+$FS->mkdirr('standalone/HTMLPurifier/DefinitionCache/Serializer');
+make_file_standalone('HTMLPurifier/EntityLookup/entities.ser');
+make_file_standalone('HTMLPurifier/ConfigSchema/schema.ser');
+
+// non-standard inclusion setup
+make_dir_standalone('HTMLPurifier/ConfigSchema');
+make_dir_standalone('HTMLPurifier/Language');
+make_dir_standalone('HTMLPurifier/Filter');
+make_dir_standalone('HTMLPurifier/Printer');
+make_file_standalone('HTMLPurifier/Printer.php');
+make_file_standalone('HTMLPurifier/Lexer/PH5P.php');
+
+echo ' done!' . PHP_EOL;
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/maintenance/merge-library.php b/vendor/ezyang/htmlpurifier/maintenance/merge-library.php
new file mode 100755
index 000000000..de2eecdc0
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/merge-library.php
@@ -0,0 +1,11 @@
+#!/usr/bin/php
+<?php
+
+/**
+ * @file
+ * Deprecated in favor of generate-standalone.php.
+ */
+
+require dirname(__FILE__) . '/generate-standalone.php';
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/maintenance/old-extract-schema.php b/vendor/ezyang/htmlpurifier/maintenance/old-extract-schema.php
new file mode 100644
index 000000000..514a08dd9
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/old-extract-schema.php
@@ -0,0 +1,71 @@
+#!/usr/bin/php
+<?php
+
+chdir(dirname(__FILE__));
+require_once 'common.php';
+assertCli();
+
+echo "Please do not run this script. It is here for historical purposes only.";
+exit;
+
+/**
+ * @file
+ * Extracts all definitions inside a configuration schema
+ * (HTMLPurifier_ConfigSchema) and exports them as plain text files.
+ *
+ * @todo Extract version numbers.
+ */
+
+define('HTMLPURIFIER_SCHEMA_STRICT', true); // description data needs to be collected
+require_once dirname(__FILE__) . '/../library/HTMLPurifier.auto.php';
+
+// We need includes to ensure all HTMLPurifier_ConfigSchema calls are
+// performed.
+require_once 'HTMLPurifier.includes.php';
+
+// Also, these extra files will be necessary.
+require_once 'HTMLPurifier/Filter/ExtractStyleBlocks.php';
+
+/**
+ * Takes a hash and saves its contents to library/HTMLPurifier/ConfigSchema/
+ */
+function saveHash($hash)
+{
+ if ($hash === false) return;
+ $dir = realpath(dirname(__FILE__) . '/../library/HTMLPurifier/ConfigSchema');
+ $name = $hash['ID'] . '.txt';
+ $file = $dir . '/' . $name;
+ if (file_exists($file)) {
+ trigger_error("File already exists; skipped $name");
+ return;
+ }
+ $file = new FSTools_File($file);
+ $file->open('w');
+ $multiline = false;
+ foreach ($hash as $key => $value) {
+ $multiline = $multiline || (strpos($value, "\n") !== false);
+ if ($multiline) {
+ $file->put("--$key--" . PHP_EOL);
+ $file->put(str_replace("\n", PHP_EOL, $value) . PHP_EOL);
+ } else {
+ if ($key == 'ID') {
+ $file->put("$value" . PHP_EOL);
+ } else {
+ $file->put("$key: $value" . PHP_EOL);
+ }
+ }
+ }
+ $file->close();
+}
+
+$schema = HTMLPurifier_ConfigSchema::instance();
+$adapter = new HTMLPurifier_ConfigSchema_StringHashReverseAdapter($schema);
+
+foreach ($schema->info as $ns => $ns_array) {
+ saveHash($adapter->get($ns));
+ foreach ($ns_array as $dir => $x) {
+ saveHash($adapter->get($ns, $dir));
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/maintenance/old-remove-require-once.php b/vendor/ezyang/htmlpurifier/maintenance/old-remove-require-once.php
new file mode 100644
index 000000000..f47c7d0f1
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/old-remove-require-once.php
@@ -0,0 +1,32 @@
+#!/usr/bin/php
+<?php
+
+chdir(dirname(__FILE__));
+require_once 'common.php';
+assertCli();
+
+echo "Please do not run this script. It is here for historical purposes only.";
+exit;
+
+/**
+ * @file
+ * Removes leading includes from files.
+ *
+ * @note
+ * This does not remove inline includes; those must be handled manually.
+ */
+
+chdir(dirname(__FILE__) . '/../tests/HTMLPurifier');
+$FS = new FSTools();
+
+$files = $FS->globr('.', '*.php');
+foreach ($files as $file) {
+ if (substr_count(basename($file), '.') > 1) continue;
+ $old_code = file_get_contents($file);
+ $new_code = preg_replace("#^require_once .+[\n\r]*#m", '', $old_code);
+ if ($old_code !== $new_code) {
+ file_put_contents($file, $new_code);
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/maintenance/old-remove-schema-def.php b/vendor/ezyang/htmlpurifier/maintenance/old-remove-schema-def.php
new file mode 100644
index 000000000..5ae031973
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/old-remove-schema-def.php
@@ -0,0 +1,32 @@
+#!/usr/bin/php
+<?php
+
+chdir(dirname(__FILE__));
+require_once 'common.php';
+assertCli();
+
+echo "Please do not run this script. It is here for historical purposes only.";
+exit;
+
+/**
+ * @file
+ * Removes ConfigSchema function calls from source files.
+ */
+
+chdir(dirname(__FILE__) . '/../library/');
+$FS = new FSTools();
+
+$files = $FS->globr('.', '*.php');
+foreach ($files as $file) {
+ if (substr_count(basename($file), '.') > 1) continue;
+ $old_code = file_get_contents($file);
+ $new_code = preg_replace("#^HTMLPurifier_ConfigSchema::.+?\);[\n\r]*#ms", '', $old_code);
+ if ($old_code !== $new_code) {
+ file_put_contents($file, $new_code);
+ }
+ if (preg_match('#^\s+HTMLPurifier_ConfigSchema::#m', $new_code)) {
+ echo "Indented ConfigSchema call in $file\n";
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/maintenance/regenerate-docs.sh b/vendor/ezyang/htmlpurifier/maintenance/regenerate-docs.sh
new file mode 100755
index 000000000..6f4d720ff
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/regenerate-docs.sh
@@ -0,0 +1,5 @@
+#!/bin/bash -e
+./compile-doxygen.sh
+cd ../docs
+scp doxygen.tgz htmlpurifier.org:/home/ezyang/htmlpurifier.org
+ssh htmlpurifier.org "cd /home/ezyang/htmlpurifier.org && ./reload-docs.sh"
diff --git a/vendor/ezyang/htmlpurifier/maintenance/remove-trailing-whitespace.php b/vendor/ezyang/htmlpurifier/maintenance/remove-trailing-whitespace.php
new file mode 100644
index 000000000..857870546
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/remove-trailing-whitespace.php
@@ -0,0 +1,37 @@
+#!/usr/bin/php
+<?php
+
+chdir(dirname(__FILE__));
+require_once 'common.php';
+assertCli();
+
+/**
+ * @file
+ * Removes trailing whitespace from files.
+ */
+
+chdir(dirname(__FILE__) . '/..');
+$FS = new FSTools();
+
+$files = $FS->globr('.', '{,.}*', GLOB_BRACE);
+foreach ($files as $file) {
+ if (
+ !is_file($file) ||
+ prefix_is('./.git', $file) ||
+ prefix_is('./docs/doxygen', $file) ||
+ postfix_is('.ser', $file) ||
+ postfix_is('.tgz', $file) ||
+ postfix_is('.patch', $file) ||
+ postfix_is('.dtd', $file) ||
+ postfix_is('.ent', $file) ||
+ $file == './library/HTMLPurifier/Lexer/PH5P.php' ||
+ $file == './maintenance/PH5P.php'
+ ) continue;
+ $contents = file_get_contents($file);
+ $result = preg_replace('/^(.*?)[ \t]+(\r?)$/m', '\1\2', $contents, -1, $count);
+ if (!$count) continue;
+ echo "$file\n";
+ file_put_contents($file, $result);
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/maintenance/rename-config.php b/vendor/ezyang/htmlpurifier/maintenance/rename-config.php
new file mode 100644
index 000000000..6e59e2a79
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/rename-config.php
@@ -0,0 +1,84 @@
+#!/usr/bin/php
+<?php
+
+chdir(dirname(__FILE__));
+require_once 'common.php';
+require_once '../library/HTMLPurifier.auto.php';
+assertCli();
+
+/**
+ * @file
+ * Renames a configuration directive. This involves renaming the file,
+ * adding an alias, and then regenerating the cache. You still have to
+ * manually go through and fix any calls to the directive.
+ * @warning This script doesn't handle multi-stringhash files.
+ */
+
+$argv = $_SERVER['argv'];
+if (count($argv) < 3) {
+ echo "Usage: {$argv[0]} OldName NewName\n";
+ exit(1);
+}
+
+chdir('../library/HTMLPurifier/ConfigSchema/schema');
+
+$old = $argv[1];
+$new = $argv[2];
+
+if (!file_exists("$old.txt")) {
+ echo "Cannot move undefined configuration directive $old\n";
+ exit(1);
+}
+
+if ($old === $new) {
+ echo "Attempting to move to self, aborting\n";
+ exit(1);
+}
+
+if (file_exists("$new.txt")) {
+ echo "Cannot move to already defined directive $new\n";
+ exit(1);
+}
+
+$file = "$old.txt";
+$builder = new HTMLPurifier_ConfigSchema_InterchangeBuilder();
+$interchange = new HTMLPurifier_ConfigSchema_Interchange();
+$builder->buildFile($interchange, $file);
+$contents = file_get_contents($file);
+
+if (strpos($contents, "\r\n") !== false) {
+ $nl = "\r\n";
+} elseif (strpos($contents, "\r") !== false) {
+ $nl = "\r";
+} else {
+ $nl = "\n";
+}
+
+// replace name with new name
+$contents = str_replace($old, $new, $contents);
+
+if ($interchange->directives[$old]->aliases) {
+ $pos_alias = strpos($contents, 'ALIASES:');
+ $pos_ins = strpos($contents, $nl, $pos_alias);
+ if ($pos_ins === false) $pos_ins = strlen($contents);
+ $contents =
+ substr($contents, 0, $pos_ins) . ", $old" . substr($contents, $pos_ins);
+ file_put_contents($file, $contents);
+} else {
+ $lines = explode($nl, $contents);
+ $insert = false;
+ foreach ($lines as $n => $line) {
+ if (strncmp($line, '--', 2) === 0) {
+ $insert = $n;
+ break;
+ }
+ }
+ if (!$insert) {
+ $lines[] = "ALIASES: $old";
+ } else {
+ array_splice($lines, $insert, 0, "ALIASES: $old");
+ }
+ file_put_contents($file, implode($nl, $lines));
+}
+
+rename("$old.txt", "$new.txt") || exit(1);
diff --git a/vendor/ezyang/htmlpurifier/maintenance/update-config.php b/vendor/ezyang/htmlpurifier/maintenance/update-config.php
new file mode 100644
index 000000000..2d8a7a9c1
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/update-config.php
@@ -0,0 +1,34 @@
+#!/usr/bin/php
+<?php
+
+chdir(dirname(__FILE__));
+require_once 'common.php';
+assertCli();
+
+/**
+ * @file
+ * Converts all instances of $config->set and $config->get to the new
+ * format, as described by docs/dev-config-bcbreaks.txt
+ */
+
+$FS = new FSTools();
+chdir(dirname(__FILE__) . '/..');
+$raw_files = $FS->globr('.', '*.php');
+foreach ($raw_files as $file) {
+ $file = substr($file, 2); // rm leading './'
+ if (strpos($file, 'library/standalone/') === 0) continue;
+ if (strpos($file, 'maintenance/update-config.php') === 0) continue;
+ if (strpos($file, 'test-settings.php') === 0) continue;
+ if (substr_count($file, '.') > 1) continue; // rm meta files
+ // process the file
+ $contents = file_get_contents($file);
+ $contents = preg_replace(
+ "#config->(set|get)\('(.+?)', '(.+?)'#",
+ "config->\\1('\\2.\\3'",
+ $contents
+ );
+ if ($contents === '') continue;
+ file_put_contents($file, $contents);
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/package.php b/vendor/ezyang/htmlpurifier/package.php
new file mode 100644
index 000000000..bfef93622
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/package.php
@@ -0,0 +1,61 @@
+<?php
+
+set_time_limit(0);
+
+require_once 'PEAR/PackageFileManager2.php';
+require_once 'PEAR/PackageFileManager/File.php';
+PEAR::setErrorHandling(PEAR_ERROR_PRINT);
+$pkg = new PEAR_PackageFileManager2;
+
+$pkg->setOptions(
+ array(
+ 'baseinstalldir' => '/',
+ 'packagefile' => 'package.xml',
+ 'packagedirectory' => realpath(dirname(__FILE__) . '/library'),
+ 'filelistgenerator' => 'file',
+ 'include' => array('*'),
+ 'dir_roles' => array('/' => 'php'), // hack to put *.ser files in the right place
+ 'ignore' => array(
+ 'HTMLPurifier.standalone.php',
+ 'HTMLPurifier.path.php',
+ '*.tar.gz',
+ '*.tgz',
+ 'standalone/'
+ ),
+ )
+);
+
+$pkg->setPackage('HTMLPurifier');
+$pkg->setLicense('LGPL', 'http://www.gnu.org/licenses/lgpl.html');
+$pkg->setSummary('Standards-compliant HTML filter');
+$pkg->setDescription(
+ 'HTML Purifier is an HTML filter that will remove all malicious code
+ (better known as XSS) with a thoroughly audited, secure yet permissive
+ whitelist and will also make sure your documents are standards
+ compliant.'
+);
+
+$pkg->addMaintainer('lead', 'ezyang', 'Edward Z. Yang', 'admin@htmlpurifier.org', 'yes');
+
+$version = trim(file_get_contents('VERSION'));
+$api_version = substr($version, 0, strrpos($version, '.'));
+
+$pkg->setChannel('htmlpurifier.org');
+$pkg->setAPIVersion($api_version);
+$pkg->setAPIStability('stable');
+$pkg->setReleaseVersion($version);
+$pkg->setReleaseStability('stable');
+
+$pkg->addRelease();
+
+$pkg->setNotes(file_get_contents('WHATSNEW'));
+$pkg->setPackageType('php');
+
+$pkg->setPhpDep('5.0.0');
+$pkg->setPearinstallerDep('1.4.3');
+
+$pkg->generateContents();
+
+$pkg->writePackageFile();
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/phpdoc.ini b/vendor/ezyang/htmlpurifier/phpdoc.ini
new file mode 100644
index 000000000..c4c372353
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/phpdoc.ini
@@ -0,0 +1,102 @@
+;; phpDocumentor parse configuration file
+;;
+;; This file is designed to cut down on repetitive typing on the command-line or web interface
+;; You can copy this file to create a number of configuration files that can be used with the
+;; command-line switch -c, as in phpdoc -c default.ini or phpdoc -c myini.ini. The web
+;; interface will automatically generate a list of .ini files that can be used.
+;;
+;; default.ini is used to generate the online manual at http://www.phpdoc.org/docs
+;;
+;; ALL .ini files must be in the user subdirectory of phpDocumentor with an extension of .ini
+;;
+;; Copyright 2002, Greg Beaver <cellog@users.sourceforge.net>
+;;
+;; WARNING: do not change the name of any command-line parameters, phpDocumentor will ignore them
+
+[Parse Data]
+;; title of all the documentation
+;; legal values: any string
+title = HTML Purifier API Documentation
+
+;; parse files that start with a . like .bash_profile
+;; legal values: true, false
+hidden = false
+
+;; show elements marked @access private in documentation by setting this to on
+;; legal values: on, off
+parseprivate = off
+
+;; parse with javadoc-like description (first sentence is always the short description)
+;; legal values: on, off
+javadocdesc = on
+
+;; add any custom @tags separated by commas here
+;; legal values: any legal tagname separated by commas.
+;customtags = mytag1,mytag2
+
+;; This is only used by the XML:DocBook/peardoc2 converter
+defaultcategoryname = Documentation
+
+;; what is the main package?
+;; legal values: alphanumeric string plus - and _
+defaultpackagename = HTMLPurifier
+
+;; output any parsing information? set to on for cron jobs
+;; legal values: on
+;quiet = on
+
+;; parse a PEAR-style repository. Do not turn this on if your project does
+;; not have a parent directory named "pear"
+;; legal values: on/off
+;pear = on
+
+;; where should the documentation be written?
+;; legal values: a legal path
+target = docs/phpdoc
+
+;; Which files should be parsed out as special documentation files, such as README,
+;; INSTALL and CHANGELOG? This overrides the default files found in
+;; phpDocumentor.ini (this file is not a user .ini file, but the global file)
+readmeinstallchangelog = README, INSTALL, NEWS, WYSIWYG, SLOW, LICENSE, CREDITS
+
+;; limit output to the specified packages, even if others are parsed
+;; legal values: package names separated by commas
+;packageoutput = package1,package2
+
+;; comma-separated list of files to parse
+;; legal values: paths separated by commas
+;filename = /path/to/file1,/path/to/file2,fileincurrentdirectory
+
+;; comma-separated list of directories to parse
+;; legal values: directory paths separated by commas
+;directory = /path1,/path2,.,..,subdirectory
+;directory = /home/jeichorn/cvs/pear
+directory = .
+
+;; template base directory (the equivalent directory of <installdir>/phpDocumentor)
+;templatebase = /path/to/my/templates
+
+;; directory to find any example files in through @example and {@example} tags
+;examplesdir = /path/to/my/templates
+
+;; comma-separated list of files, directories or wildcards ? and * (any wildcard) to ignore
+;; legal values: any wildcard strings separated by commas
+;ignore = /path/to/ignore*,*list.php,myfile.php,subdirectory/
+ignore = *tests*,*benchmarks*,*docs*,*test-settings.php,*configdoc*,*maintenance*,*smoketests*,*standalone*,*.svn*,*conf*
+
+sourcecode = on
+
+;; comma-separated list of Converters to use in outputformat:Convertername:templatedirectory format
+;; legal values: HTML:frames:default,HTML:frames:l0l33t,HTML:frames:phpdoc.de,HTML:frames:phphtmllib,
+;; HTML:frames:earthli,
+;; HTML:frames:DOM/default,HTML:frames:DOM/l0l33t,HTML:frames:DOM/phpdoc.de,
+;; HTML:frames:DOM/phphtmllib,HTML:frames:DOM/earthli
+;; HTML:Smarty:default,HTML:Smarty:PHP,HTML:Smarty:HandS
+;; PDF:default:default,CHM:default:default,XML:DocBook/peardoc2:default
+output=HTML:frames:default
+
+;; turn this option on if you want highlighted source code for every file
+;; legal values: on/off
+sourcecode = on
+
+; vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/plugins/modx.txt b/vendor/ezyang/htmlpurifier/plugins/modx.txt
new file mode 100644
index 000000000..0763821b5
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/plugins/modx.txt
@@ -0,0 +1,112 @@
+
+MODx Plugin
+
+MODx <http://www.modxcms.com/> is an open source PHP application framework.
+I first came across them in my referrer logs when tillda asked if anyone
+could implement an HTML Purifier plugin. This forum thread
+<http://modxcms.com/forums/index.php/topic,6604.0.html> eventually resulted
+in the fruition of this plugin that davidm says, "is on top of my favorite
+list." HTML Purifier goes great with WYSIWYG editors!
+
+
+
+1. Credits
+
+PaulGregory wrote the overall structure of the code. I added the
+slashes hack.
+
+
+
+2. Install
+
+First, you need to place HTML Purifier library somewhere. The code here
+assumes that you've placed in MODx's assets/plugins/htmlpurifier (no version
+number).
+
+Log into the manager, and navigate:
+
+Resources > Manage Resources > Plugins tab > New Plugin
+
+Type in a name (probably HTML Purifier), and copy paste this code into the
+textarea:
+
+--------------------------------------------------------------------------------
+$e = &$modx->Event;
+if ($e->name == 'OnBeforeDocFormSave') {
+ global $content;
+
+ include_once '../assets/plugins/htmlpurifier/library/HTMLPurifier.auto.php';
+ $purifier = new HTMLPurifier();
+
+ static $magic_quotes = null;
+ if ($magic_quotes === null) {
+ // this is an ugly hack because this hook hasn't
+ // had the backslashes removed yet when magic_quotes_gpc is on,
+ // but HTMLPurifier must not have the quotes slashed.
+ $magic_quotes = get_magic_quotes_gpc();
+ }
+
+ if ($magic_quotes) $content = stripslashes($content);
+ $content = $purifier->purify($content);
+ if ($magic_quotes) $content = addslashes($content);
+}
+--------------------------------------------------------------------------------
+
+Then navigate to the System Events tab and check "OnBeforeDocFormSave".
+Save the plugin. HTML Purifier now is integrated!
+
+
+
+3. Making sure it works
+
+You can test HTML Purifier by deliberately putting in crappy HTML and seeing
+whether or not it gets fixed. A better way is to put in something like this:
+
+<p lang="fr">Il est bon</p>
+
+...and seeing whether or not the content comes out as:
+
+<p lang="fr" xml:lang="fr">Il est bon</p>
+
+(lang to xml:lang synchronization is one of the many features HTML Purifier
+has).
+
+
+
+4. Caveat Emptor
+
+This code does not intercept save requests from the QuickEdit plugin, this may
+be added in a later version. It also modifies things on save, so there's a
+slight chance that HTML Purifier may make a boo-boo and accidently mess things
+up (the original version is not saved).
+
+Finally, make sure that MODx is using UTF-8. If you are using, say, a French
+localisation, you may be using Latin-1, if that's the case, configure
+HTML Purifier properly like this:
+
+$config = HTMLPurifier_Config::createDefault();
+$config->set('Core', 'Encoding', 'ISO-8859-1'); // or whatever encoding
+$purifier = new HTMLPurifier($config);
+
+
+
+5. Known Bugs
+
+'rn' characters sometimes mysteriously appear after purification. We are
+currently investigating this issue. See: <http://htmlpurifier.org/phorum/read.php?3,1866>
+
+
+
+6. See Also
+
+A modified version of Jot 1.1.3 is available, which integrates with HTML
+Purifier. You can check it out here: <http://modxcms.com/forums/index.php/topic,25621.msg161970.html>
+
+
+X. Changelog
+
+2008-06-16
+- Updated code to work with 3.1.0 and later
+- Add Known Bugs and See Also section
+
+ vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/plugins/phorum/.gitignore b/vendor/ezyang/htmlpurifier/plugins/phorum/.gitignore
new file mode 100644
index 000000000..8325e0902
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/plugins/phorum/.gitignore
@@ -0,0 +1,2 @@
+migrate.php
+htmlpurifier/*
diff --git a/vendor/ezyang/htmlpurifier/plugins/phorum/Changelog b/vendor/ezyang/htmlpurifier/plugins/phorum/Changelog
new file mode 100644
index 000000000..9f939e54a
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/plugins/phorum/Changelog
@@ -0,0 +1,27 @@
+Changelog HTMLPurifier : Phorum Mod
+|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+
+= KEY ====================
+ # Breaks back-compat
+ ! Feature
+ - Bugfix
+ + Sub-comment
+ . Internal change
+==========================
+
+Version 4.0.0 for Phorum 5.2, released July 9, 2009
+# Works only with HTML Purifier 4.0.0
+! Better installation documentation
+- Fixed double encoded quotes
+- Fixed fatal error when migrate.php is blank
+
+Version 3.0.0 for Phorum 5.2, released January 12, 2008
+# WYSIWYG and suppress_message options are now configurable via web
+ interface.
+- Module now compatible with Phorum 5.2, primary bugs were in migration
+ code as well as signature and edit message handling. This module is NOT
+ compatible with Phorum 5.1.
+- Buggy WYSIWYG mode refined
+. AutoFormatParam added to list of default configuration namespaces
+
+ vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/plugins/phorum/INSTALL b/vendor/ezyang/htmlpurifier/plugins/phorum/INSTALL
new file mode 100644
index 000000000..23c76fc5c
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/plugins/phorum/INSTALL
@@ -0,0 +1,84 @@
+
+Install
+ How to install the Phorum HTML Purifier plugin
+
+0. PREREQUISITES
+----------------
+This Phorum module only works on PHP5 and with HTML Purifier 4.0.0
+or later.
+
+1. UNZIP
+--------
+Unzip phorum-htmlpurifier-x.y.z, producing an htmlpurifier folder.
+You've already done this step if you're reading this!
+
+2. MOVE
+-------
+Move the htmlpurifier folder to the mods/ folder of your Phorum
+installation, so the directory structure looks like:
+
+phorum/
+ mods/
+ htmlpurifier/
+ INSTALL - this install file
+ info.txt, ... - the module files
+ htmlpurifier/
+
+3. INSTALL HTML PURIFIER
+------------------------
+Download and unzip HTML Purifier <htmlpurifier.org>. Place the contents of
+the library/ folder in the htmlpurifier/htmlpurifier folder. Your directory
+structure will look like:
+
+phorum/
+ mods/
+ htmlpurifier/
+ htmlpurifier/
+ HTMLPurifier.auto.php
+ ... - other files
+ HTMLPurifier/
+
+Advanced users:
+ If you have HTML Purifier installed elsewhere on your server,
+ all you need is an HTMLPurifier.auto.php file in the library folder which
+ includes the HTMLPurifier.auto.php file in your install.
+
+4. MIGRATE
+----------
+If you're setting up a new Phorum installation, all you need to do is create
+a blank migrate.php file in the htmlpurifier module folder (NOT the library
+folder.
+
+If you have an old Phorum installation and was using BBCode,
+copy migrate.bbcode.php to migrate.php. If you were using a different input
+format, follow the instructions in migrate.bbcode.php to create your own custom
+migrate.php file.
+
+Your directory structure should now look like this:
+
+phorum/
+ mods/
+ htmlpurifier/
+ migrate.php
+
+5. ENABLE
+---------
+Navigate to your Phorum admin panel at http://example.com/phorum/admin.php,
+click on Global Settings > Modules, scroll to "HTML Purifier Phorum Mod" and
+turn it On.
+
+6. MIGRATE SIGNATURES
+---------------------
+If you're setting up a new Phorum installation, skip this step.
+
+If you allowed your users to make signatures, navigate to the module settings
+page of HTML Purifier (Global Settings > Modules > HTML Purifier Phorum Mod >
+Configure), type in "yes" in the "Confirm" box, and press "Migrate."
+
+ONLY DO THIS ONCE! BE SURE TO BACK UP YOUR DATABASE!
+
+7. CONFIGURE
+------------
+Configure using Edit settings. See that page for more information.
+
+ vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/plugins/phorum/README b/vendor/ezyang/htmlpurifier/plugins/phorum/README
new file mode 100644
index 000000000..0524ed39d
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/plugins/phorum/README
@@ -0,0 +1,45 @@
+
+HTML Purifier Phorum Mod - Filter your HTML the Standards-Compliant Way!
+
+This Phorum mod enables HTML posting on Phorum. Under normal circumstances,
+this would cause a huge security risk, but because we are running
+HTML through HTML Purifier, output is guaranteed to be XSS free and
+standards-compliant.
+
+This mod requires HTML input, and previous markup languages need to be
+converted accordingly. Thus, it is vital that you create a 'migrate.php'
+file that works with your installation. If you're using the built-in
+BBCode formatting, simply move migrate.bbcode.php to that place; for
+other markup languages, consult said file for instructions on how
+to adapt it to your needs.
+
+ -- NOTE -------------------------------------------------
+ You can also run this module in parallel with another
+ formatting module; this module attempts to place itself
+ at the end of the filtering chain. However, if any
+ previous modules produce insecure HTML (for instance,
+ a JavaScript email obfuscator) they will get cleaned.
+
+This module will not work if 'migrate.php' is not created, and an improperly
+made migration file may *CORRUPT* Phorum, so please take your time to
+do this correctly. It should go without saying to *BACKUP YOUR DATABASE*
+before attempting anything here. If no migration is necessary, you can
+simply create a blank migrate.php file. HTML Purifier is smart and will
+not re-migrate already processed messages. However, the original code
+is irretrievably lost (we may change this in the future.)
+
+This module will not automatically migrate user signatures, because this
+process may take a long time. After installing the HTML Purifier module and
+then configuring 'migrate.php', navigate to Settings and click 'Migrate
+Signatures' to migrate all user signatures to HTML.
+
+All of HTML Purifier's usual functions are configurable via the mod settings
+page. If you require custom configuration, create config.php file in
+the mod directory that edits a $config variable. Be sure, also, to
+set $PHORUM['mod_htmlpurifier']['wysiwyg'] to TRUE if you are using a
+WYSIWYG editor (you can do this through a common hook or the web
+configuration form).
+
+Visit HTML Purifier at <http://htmlpurifier.org/>.
+
+ vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/plugins/phorum/config.default.php b/vendor/ezyang/htmlpurifier/plugins/phorum/config.default.php
new file mode 100644
index 000000000..e047c0b42
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/plugins/phorum/config.default.php
@@ -0,0 +1,57 @@
+<?php
+
+if(!defined("PHORUM")) exit;
+
+// default HTML Purifier configuration settings
+$config->set('HTML.Allowed',
+ // alphabetically sorted
+'a[href|title]
+abbr[title]
+acronym[title]
+b
+blockquote[cite]
+br
+caption
+cite
+code
+dd
+del
+dfn
+div
+dl
+dt
+em
+i
+img[src|alt|title|class]
+ins
+kbd
+li
+ol
+p
+pre
+s
+strike
+strong
+sub
+sup
+table
+tbody
+td
+tfoot
+th
+thead
+tr
+tt
+u
+ul
+var');
+$config->set('AutoFormat.AutoParagraph', true);
+$config->set('AutoFormat.Linkify', true);
+$config->set('HTML.Doctype', 'XHTML 1.0 Transitional');
+$config->set('Core.AggressivelyFixLt', true);
+$config->set('Core.Encoding', $GLOBALS['PHORUM']['DATA']['CHARSET']); // we'll change this eventually
+if (strtolower($GLOBALS['PHORUM']['DATA']['CHARSET']) !== 'utf-8') {
+ $config->set('Core.EscapeNonASCIICharacters', true);
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/plugins/phorum/htmlpurifier.php b/vendor/ezyang/htmlpurifier/plugins/phorum/htmlpurifier.php
new file mode 100644
index 000000000..f66d8c36c
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/plugins/phorum/htmlpurifier.php
@@ -0,0 +1,316 @@
+<?php
+
+/**
+ * HTML Purifier Phorum Mod. Filter your HTML the Standards-Compliant Way!
+ *
+ * This Phorum mod enables users to post raw HTML into Phorum. But never
+ * fear: with the help of HTML Purifier, this HTML will be beat into
+ * de-XSSed and standards-compliant form, safe for general consumption.
+ * It is not recommended, but possible to run this mod in parallel
+ * with other formatters (in short, please DISABLE the BBcode mod).
+ *
+ * For help migrating from your previous markup language to pure HTML
+ * please check the migrate.bbcode.php file.
+ *
+ * If you'd like to use this with a WYSIWYG editor, make sure that
+ * editor sets $PHORUM['mod_htmlpurifier']['wysiwyg'] to true. Otherwise,
+ * administrators who need to edit other people's comments may be at
+ * risk for some nasty attacks.
+ *
+ * Tested with Phorum 5.2.11.
+ */
+
+// Note: Cache data is base64 encoded because Phorum insists on flinging
+// to the user and expecting it to come back unharmed, newlines and
+// all, which ain't happening. It's slower, it takes up more space, but
+// at least it won't get mutilated
+
+/**
+ * Purifies a data array
+ */
+function phorum_htmlpurifier_format($data)
+{
+ $PHORUM = $GLOBALS["PHORUM"];
+
+ $purifier =& HTMLPurifier::getInstance();
+ $cache_serial = $PHORUM['mod_htmlpurifier']['body_cache_serial'];
+
+ foreach($data as $message_id => $message){
+ if(isset($message['body'])) {
+
+ if ($message_id) {
+ // we're dealing with a real message, not a fake, so
+ // there a number of shortcuts that can be taken
+
+ if (isset($message['meta']['htmlpurifier_light'])) {
+ // format hook was called outside of Phorum's normal
+ // functions, do the abridged purification
+ $data[$message_id]['body'] = $purifier->purify($message['body']);
+ continue;
+ }
+
+ if (!empty($PHORUM['args']['purge'])) {
+ // purge the cache, must be below the following if
+ unset($message['meta']['body_cache']);
+ }
+
+ if (
+ isset($message['meta']['body_cache']) &&
+ isset($message['meta']['body_cache_serial']) &&
+ $message['meta']['body_cache_serial'] == $cache_serial
+ ) {
+ // cached version is present, bail out early
+ $data[$message_id]['body'] = base64_decode($message['meta']['body_cache']);
+ continue;
+ }
+ }
+
+ // migration might edit this array, that's why it's defined
+ // so early
+ $updated_message = array();
+
+ // create the $body variable
+ if (
+ $message_id && // message must be real to migrate
+ !isset($message['meta']['body_cache_serial'])
+ ) {
+ // perform migration
+ $fake_data = array();
+ list($signature, $edit_message) = phorum_htmlpurifier_remove_sig_and_editmessage($message);
+ $fake_data[$message_id] = $message;
+ $fake_data = phorum_htmlpurifier_migrate($fake_data);
+ $body = $fake_data[$message_id]['body'];
+ $body = str_replace("<phorum break>\n", "\n", $body);
+ $updated_message['body'] = $body; // save it in
+ $body .= $signature . $edit_message; // add it back in
+ } else {
+ // reverse Phorum's pre-processing
+ $body = $message['body'];
+ // order is important
+ $body = str_replace("<phorum break>\n", "\n", $body);
+ $body = str_replace(array('&lt;','&gt;','&amp;', '&quot;'), array('<','>','&','"'), $body);
+ if (!$message_id && defined('PHORUM_CONTROL_CENTER')) {
+ // we're in control.php, so it was double-escaped
+ $body = str_replace(array('&lt;','&gt;','&amp;', '&quot;'), array('<','>','&','"'), $body);
+ }
+ }
+
+ $body = $purifier->purify($body);
+
+ // dynamically update the cache (MUST BE DONE HERE!)
+ // this is inefficient because it's one db call per
+ // cache miss, but once the cache is in place things are
+ // a lot zippier.
+
+ if ($message_id) { // make sure it's not a fake id
+ $updated_message['meta'] = $message['meta'];
+ $updated_message['meta']['body_cache'] = base64_encode($body);
+ $updated_message['meta']['body_cache_serial'] = $cache_serial;
+ phorum_db_update_message($message_id, $updated_message);
+ }
+
+ // must not get overloaded until after we cache it, otherwise
+ // we'll inadvertently change the original text
+ $data[$message_id]['body'] = $body;
+
+ }
+ }
+
+ return $data;
+}
+
+// -----------------------------------------------------------------------
+// This is fragile code, copied from read.php:596 (Phorum 5.2.6). Please
+// keep this code in-sync with Phorum
+
+/**
+ * Generates a signature based on a message array
+ */
+function phorum_htmlpurifier_generate_sig($row)
+{
+ $phorum_sig = '';
+ if(isset($row["user"]["signature"])
+ && isset($row['meta']['show_signature']) && $row['meta']['show_signature']==1){
+ $phorum_sig=trim($row["user"]["signature"]);
+ if(!empty($phorum_sig)){
+ $phorum_sig="\n\n$phorum_sig";
+ }
+ }
+ return $phorum_sig;
+}
+
+/**
+ * Generates an edit message based on a message array
+ */
+function phorum_htmlpurifier_generate_editmessage($row)
+{
+ $PHORUM = $GLOBALS['PHORUM'];
+ $editmessage = '';
+ if(isset($row['meta']['edit_count']) && $row['meta']['edit_count'] > 0) {
+ $editmessage = str_replace ("%count%", $row['meta']['edit_count'], $PHORUM["DATA"]["LANG"]["EditedMessage"]);
+ $editmessage = str_replace ("%lastedit%", phorum_date($PHORUM["short_date_time"],$row['meta']['edit_date']), $editmessage);
+ $editmessage = str_replace ("%lastuser%", $row['meta']['edit_username'], $editmessage);
+ $editmessage = "\n\n\n\n$editmessage";
+ }
+ return $editmessage;
+}
+
+// End fragile code
+// -----------------------------------------------------------------------
+
+/**
+ * Removes the signature and edit message from a message
+ * @param $row Message passed by reference
+ */
+function phorum_htmlpurifier_remove_sig_and_editmessage(&$row)
+{
+ $signature = phorum_htmlpurifier_generate_sig($row);
+ $editmessage = phorum_htmlpurifier_generate_editmessage($row);
+ $replacements = array();
+ // we need to remove add <phorum break> as that is the form these
+ // extra bits are in.
+ if ($signature) $replacements[str_replace("\n", "<phorum break>\n", $signature)] = '';
+ if ($editmessage) $replacements[str_replace("\n", "<phorum break>\n", $editmessage)] = '';
+ $row['body'] = strtr($row['body'], $replacements);
+ return array($signature, $editmessage);
+}
+
+/**
+ * Indicate that data is fully HTML and not from migration, invalidate
+ * previous caches
+ * @note This function could generate the actual cache entries, but
+ * since there's data missing that must be deferred to the first read
+ */
+function phorum_htmlpurifier_posting($message)
+{
+ $PHORUM = $GLOBALS["PHORUM"];
+ unset($message['meta']['body_cache']); // invalidate the cache
+ $message['meta']['body_cache_serial'] = $PHORUM['mod_htmlpurifier']['body_cache_serial'];
+ return $message;
+}
+
+/**
+ * Overload quoting mechanism to prevent default, mail-style quote from happening
+ */
+function phorum_htmlpurifier_quote($array)
+{
+ $PHORUM = $GLOBALS["PHORUM"];
+ $purifier =& HTMLPurifier::getInstance();
+ $text = $purifier->purify($array[1]);
+ $source = htmlspecialchars($array[0]);
+ return "<blockquote cite=\"$source\">\n$text\n</blockquote>";
+}
+
+/**
+ * Ensure that our format hook is processed last. Also, loads the library.
+ * @credits <http://secretsauce.phorum.org/snippets/make_bbcode_last_formatter.php.txt>
+ */
+function phorum_htmlpurifier_common()
+{
+ require_once(dirname(__FILE__).'/htmlpurifier/HTMLPurifier.auto.php');
+ require(dirname(__FILE__).'/init-config.php');
+
+ $config = phorum_htmlpurifier_get_config();
+ HTMLPurifier::getInstance($config);
+
+ // increment revision.txt if you want to invalidate the cache
+ $GLOBALS['PHORUM']['mod_htmlpurifier']['body_cache_serial'] = $config->getSerial();
+
+ // load migration
+ if (file_exists(dirname(__FILE__) . '/migrate.php')) {
+ include(dirname(__FILE__) . '/migrate.php');
+ } else {
+ echo '<strong>Error:</strong> No migration path specified for HTML Purifier, please check
+ <tt>modes/htmlpurifier/migrate.bbcode.php</tt> for instructions on
+ how to migrate from your previous markup language.';
+ exit;
+ }
+
+ if (!function_exists('phorum_htmlpurifier_migrate')) {
+ // Dummy function
+ function phorum_htmlpurifier_migrate($data) {return $data;}
+ }
+
+}
+
+/**
+ * Pre-emptively performs purification if it looks like a WYSIWYG editor
+ * is being used
+ */
+function phorum_htmlpurifier_before_editor($message)
+{
+ if (!empty($GLOBALS['PHORUM']['mod_htmlpurifier']['wysiwyg'])) {
+ if (!empty($message['body'])) {
+ $body = $message['body'];
+ // de-entity-ize contents
+ $body = str_replace(array('&lt;','&gt;','&amp;'), array('<','>','&'), $body);
+ $purifier =& HTMLPurifier::getInstance();
+ $body = $purifier->purify($body);
+ // re-entity-ize contents
+ $body = htmlspecialchars($body, ENT_QUOTES, $GLOBALS['PHORUM']['DATA']['CHARSET']);
+ $message['body'] = $body;
+ }
+ }
+ return $message;
+}
+
+function phorum_htmlpurifier_editor_after_subject()
+{
+ // don't show this message if it's a WYSIWYG editor, since it will
+ // then be handled automatically
+ if (!empty($GLOBALS['PHORUM']['mod_htmlpurifier']['wysiwyg'])) {
+ $i = $GLOBALS['PHORUM']['DATA']['MODE'];
+ if ($i == 'quote' || $i == 'edit' || $i == 'moderation') {
+ ?>
+ <div>
+ <p>
+ <strong>Notice:</strong> HTML has been scrubbed for your safety.
+ If you would like to see the original, turn off WYSIWYG mode
+ (consult your administrator for details.)
+ </p>
+ </div>
+ <?php
+ }
+ return;
+ }
+ if (!empty($GLOBALS['PHORUM']['mod_htmlpurifier']['suppress_message'])) return;
+ ?><div class="htmlpurifier-help">
+ <p>
+ <strong>HTML input</strong> is enabled. Make sure you escape all HTML and
+ angled brackets with <code>&amp;lt;</code> and <code>&amp;gt;</code>.
+ </p><?php
+ $purifier =& HTMLPurifier::getInstance();
+ $config = $purifier->config;
+ if ($config->get('AutoFormat.AutoParagraph')) {
+ ?><p>
+ <strong>Auto-paragraphing</strong> is enabled. Double
+ newlines will be converted to paragraphs; for single
+ newlines, use the <code>pre</code> tag.
+ </p><?php
+ }
+ $html_definition = $config->getDefinition('HTML');
+ $allowed = array();
+ foreach ($html_definition->info as $name => $x) $allowed[] = "<code>$name</code>";
+ sort($allowed);
+ $allowed_text = implode(', ', $allowed);
+ ?><p><strong>Allowed tags:</strong> <?php
+ echo $allowed_text;
+ ?>.</p><?php
+ ?>
+ </p>
+ <p>
+ For inputting literal code such as HTML and PHP for display, use
+ CDATA tags to auto-escape your angled brackets, and <code>pre</code>
+ to preserve newlines:
+ </p>
+ <pre>&lt;pre&gt;&lt;![CDATA[
+<em>Place code here</em>
+]]&gt;&lt;/pre&gt;</pre>
+ <p>
+ Power users, you can hide this notice with:
+ <pre>.htmlpurifier-help {display:none;}</pre>
+ </p>
+ </div><?php
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/plugins/phorum/info.txt b/vendor/ezyang/htmlpurifier/plugins/phorum/info.txt
new file mode 100644
index 000000000..723465490
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/plugins/phorum/info.txt
@@ -0,0 +1,18 @@
+title: HTML Purifier Phorum Mod
+desc: This module enables standards-compliant HTML filtering on Phorum. Please check migrate.bbcode.php before enabling this mod.
+author: Edward Z. Yang
+url: http://htmlpurifier.org/
+version: 4.0.0
+
+hook: format|phorum_htmlpurifier_format
+hook: quote|phorum_htmlpurifier_quote
+hook: posting_custom_action|phorum_htmlpurifier_posting
+hook: common|phorum_htmlpurifier_common
+hook: before_editor|phorum_htmlpurifier_before_editor
+hook: tpl_editor_after_subject|phorum_htmlpurifier_editor_after_subject
+
+# This module is meant to be a drop-in for bbcode, so make it run last.
+priority: run module after *
+priority: run hook format after *
+
+ vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/plugins/phorum/init-config.php b/vendor/ezyang/htmlpurifier/plugins/phorum/init-config.php
new file mode 100644
index 000000000..e19787b4b
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/plugins/phorum/init-config.php
@@ -0,0 +1,30 @@
+<?php
+
+/**
+ * Initializes the appropriate configuration from either a PHP file
+ * or a module configuration value
+ * @return Instance of HTMLPurifier_Config
+ */
+function phorum_htmlpurifier_get_config($default = false)
+{
+ global $PHORUM;
+ $config_exists = phorum_htmlpurifier_config_file_exists();
+ if ($default || $config_exists || !isset($PHORUM['mod_htmlpurifier']['config'])) {
+ $config = HTMLPurifier_Config::createDefault();
+ include(dirname(__FILE__) . '/config.default.php');
+ if ($config_exists) {
+ include(dirname(__FILE__) . '/config.php');
+ }
+ unset($PHORUM['mod_htmlpurifier']['config']); // unnecessary
+ } else {
+ $config = HTMLPurifier_Config::create($PHORUM['mod_htmlpurifier']['config']);
+ }
+ return $config;
+}
+
+function phorum_htmlpurifier_config_file_exists()
+{
+ return file_exists(dirname(__FILE__) . '/config.php');
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/plugins/phorum/migrate.bbcode.php b/vendor/ezyang/htmlpurifier/plugins/phorum/migrate.bbcode.php
new file mode 100644
index 000000000..0d0919455
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/plugins/phorum/migrate.bbcode.php
@@ -0,0 +1,31 @@
+<?php
+
+/**
+ * This file is responsible for migrating from a specific markup language
+ * like BBCode or Markdown to HTML. WARNING: THIS PROCESS IS NOT REVERSIBLE
+ *
+ * Copy this file to 'migrate.php' and it will automatically work for
+ * BBCode; you may need to tweak this a little to get it to work for other
+ * languages (usually, just replace the include name and the function name).
+ *
+ * If you do NOT want to have any migration performed (for instance, you
+ * are installing the module on a new forum with no posts), simply remove
+ * phorum_htmlpurifier_migrate() function. You still need migrate.php
+ * present, otherwise the module won't work. This ensures that the user
+ * explicitly says, "No, I do not need to migrate."
+ */
+
+if(!defined("PHORUM")) exit;
+
+require_once(dirname(__FILE__) . "/../bbcode/bbcode.php");
+
+/**
+ * 'format' hook style function that will be called to convert
+ * legacy markup into HTML.
+ */
+function phorum_htmlpurifier_migrate($data)
+{
+ return phorum_mod_bbcode_format($data); // bbcode's 'format' hook
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/plugins/phorum/settings.php b/vendor/ezyang/htmlpurifier/plugins/phorum/settings.php
new file mode 100644
index 000000000..8158f0282
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/plugins/phorum/settings.php
@@ -0,0 +1,64 @@
+<?php
+
+// based off of BBCode's settings file
+
+/**
+ * HTML Purifier Phorum mod settings configuration. This provides
+ * a convenient web-interface for editing the most common HTML Purifier
+ * configuration directives. You can also specify custom configuration
+ * by creating a 'config.php' file.
+ */
+
+if(!defined("PHORUM_ADMIN")) exit;
+
+// error reporting is good!
+error_reporting(E_ALL ^ E_NOTICE);
+
+// load library and other paraphenalia
+require_once './include/admin/PhorumInputForm.php';
+require_once (dirname(__FILE__) . '/htmlpurifier/HTMLPurifier.auto.php');
+require_once (dirname(__FILE__) . '/init-config.php');
+require_once (dirname(__FILE__) . '/settings/migrate-sigs-form.php');
+require_once (dirname(__FILE__) . '/settings/migrate-sigs.php');
+require_once (dirname(__FILE__) . '/settings/form.php');
+require_once (dirname(__FILE__) . '/settings/save.php');
+
+// define friendly configuration directives. you can expand this array
+// to get more web-definable directives
+$PHORUM['mod_htmlpurifier']['directives'] = array(
+ 'URI.Host', // auto-detectable
+ 'URI.DisableExternal',
+ 'URI.DisableExternalResources',
+ 'URI.DisableResources',
+ 'URI.Munge',
+ 'URI.HostBlacklist',
+ 'URI.Disable',
+ 'HTML.TidyLevel',
+ 'HTML.Doctype', // auto-detectable
+ 'HTML.Allowed',
+ 'AutoFormat',
+ '-AutoFormat.Custom',
+ 'AutoFormatParam',
+ 'Output.TidyFormat',
+);
+
+// lower this setting if you're getting time outs/out of memory
+$PHORUM['mod_htmlpurifier']['migrate-sigs-increment'] = 100;
+
+if (isset($_POST['reset'])) {
+ unset($PHORUM['mod_htmlpurifier']['config']);
+}
+
+if ($offset = phorum_htmlpurifier_migrate_sigs_check()) {
+ // migrate signatures
+ phorum_htmlpurifier_migrate_sigs($offset);
+} elseif(!empty($_POST)){
+ // save settings
+ phorum_htmlpurifier_save_settings();
+}
+
+phorum_htmlpurifier_show_migrate_sigs_form();
+echo '<br />';
+phorum_htmlpurifier_show_form();
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/plugins/phorum/settings/form.php b/vendor/ezyang/htmlpurifier/plugins/phorum/settings/form.php
new file mode 100644
index 000000000..9b6ad5f39
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/plugins/phorum/settings/form.php
@@ -0,0 +1,95 @@
+<?php
+
+function phorum_htmlpurifier_show_form()
+{
+ if (phorum_htmlpurifier_config_file_exists()) {
+ phorum_htmlpurifier_show_config_info();
+ return;
+ }
+
+ global $PHORUM;
+
+ $config = phorum_htmlpurifier_get_config();
+
+ $frm = new PhorumInputForm ("", "post", "Save");
+ $frm->hidden("module", "modsettings");
+ $frm->hidden("mod", "htmlpurifier"); // this is the directory name that the Settings file lives in
+
+ if (!empty($error)){
+ echo "$error<br />";
+ }
+
+ $frm->addbreak("Edit settings for the HTML Purifier module");
+
+ $frm->addMessage('<p>The box below sets <code>$PHORUM[\'mod_htmlpurifier\'][\'wysiwyg\']</code>.
+ When checked, contents sent for edit are now purified and the
+ informative message is disabled. If your WYSIWYG editor is disabled for
+ admin edits, you can safely keep this unchecked.</p>');
+ $frm->addRow('Use WYSIWYG?', $frm->checkbox('wysiwyg', '1', '', $PHORUM['mod_htmlpurifier']['wysiwyg']));
+
+ $frm->addMessage('<p>The box below sets <code>$PHORUM[\'mod_htmlpurifier\'][\'suppress_message\']</code>,
+ which removes the big how-to use
+ HTML Purifier message.</p>');
+ $frm->addRow('Suppress information?', $frm->checkbox('suppress_message', '1', '', $PHORUM['mod_htmlpurifier']['suppress_message']));
+
+ $frm->addMessage('<p>Click on directive links to read what each option does
+ (links do not open in new windows).</p>
+ <p>For more flexibility (for instance, you want to edit the full
+ range of configuration directives), you can create a <tt>config.php</tt>
+ file in your <tt>mods/htmlpurifier/</tt> directory. Doing so will,
+ however, make the web configuration interface unavailable.</p>');
+
+ require_once 'HTMLPurifier/Printer/ConfigForm.php';
+ $htmlpurifier_form = new HTMLPurifier_Printer_ConfigForm('config', 'http://htmlpurifier.org/live/configdoc/plain.html#%s');
+ $htmlpurifier_form->setTextareaDimensions(23, 7); // widen a little, since we have space
+
+ $frm->addMessage($htmlpurifier_form->render(
+ $config, $PHORUM['mod_htmlpurifier']['directives'], false));
+
+ $frm->addMessage("<strong>Warning: Changing HTML Purifier's configuration will invalidate
+ the cache. Expect to see a flurry of database activity after you change
+ any of these settings.</strong>");
+
+ $frm->addrow('Reset to defaults:', $frm->checkbox("reset", "1", "", false));
+
+ // hack to include extra styling
+ echo '<style type="text/css">' . $htmlpurifier_form->getCSS() . '
+ .hp-config {margin-left:auto;margin-right:auto;}
+ </style>';
+ $js = $htmlpurifier_form->getJavaScript();
+ echo '<script type="text/javascript">'."<!--\n$js\n//-->".'</script>';
+
+ $frm->show();
+}
+
+function phorum_htmlpurifier_show_config_info()
+{
+ global $PHORUM;
+
+ // update mod_htmlpurifier for housekeeping
+ phorum_htmlpurifier_commit_settings();
+
+ // politely tell user how to edit settings manually
+?>
+ <div class="input-form-td-break">How to edit settings for HTML Purifier module</div>
+ <p>
+ A <tt>config.php</tt> file exists in your <tt>mods/htmlpurifier/</tt>
+ directory. This file contains your custom configuration: in order to
+ change it, please navigate to that file and edit it accordingly.
+ You can also set <code>$GLOBALS['PHORUM']['mod_htmlpurifier']['wysiwyg']</code>
+ or <code>$GLOBALS['PHORUM']['mod_htmlpurifier']['suppress_message']</code>
+ </p>
+ <p>
+ To use the web interface, delete <tt>config.php</tt> (or rename it to
+ <tt>config.php.bak</tt>).
+ </p>
+ <p>
+ <strong>Warning: Changing HTML Purifier's configuration will invalidate
+ the cache. Expect to see a flurry of database activity after you change
+ any of these settings.</strong>
+ </p>
+<?php
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/plugins/phorum/settings/migrate-sigs-form.php b/vendor/ezyang/htmlpurifier/plugins/phorum/settings/migrate-sigs-form.php
new file mode 100644
index 000000000..abea3b51d
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/plugins/phorum/settings/migrate-sigs-form.php
@@ -0,0 +1,22 @@
+<?php
+
+function phorum_htmlpurifier_show_migrate_sigs_form()
+{
+ $frm = new PhorumInputForm ('', "post", "Migrate");
+ $frm->hidden("module", "modsettings");
+ $frm->hidden("mod", "htmlpurifier");
+ $frm->hidden("migrate-sigs", "1");
+ $frm->addbreak("Migrate user signatures to HTML");
+ $frm->addMessage('This operation will migrate your users signatures
+ to HTML. <strong>This process is irreversible and must only be performed once.</strong>
+ Type in yes in the confirmation field to migrate.');
+ if (!file_exists(dirname(__FILE__) . '/../migrate.php')) {
+ $frm->addMessage('Migration file does not exist, cannot migrate signatures.
+ Please check <tt>migrate.bbcode.php</tt> on how to create an appropriate file.');
+ } else {
+ $frm->addrow('Confirm:', $frm->text_box("confirmation", ""));
+ }
+ $frm->show();
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/plugins/phorum/settings/migrate-sigs.php b/vendor/ezyang/htmlpurifier/plugins/phorum/settings/migrate-sigs.php
new file mode 100644
index 000000000..5ea9cd0b8
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/plugins/phorum/settings/migrate-sigs.php
@@ -0,0 +1,79 @@
+<?php
+
+function phorum_htmlpurifier_migrate_sigs_check()
+{
+ global $PHORUM;
+ $offset = 0;
+ if (!empty($_POST['migrate-sigs'])) {
+ if (!isset($_POST['confirmation']) || strtolower($_POST['confirmation']) !== 'yes') {
+ echo 'Invalid confirmation code.';
+ exit;
+ }
+ $PHORUM['mod_htmlpurifier']['migrate-sigs'] = true;
+ phorum_db_update_settings(array("mod_htmlpurifier"=>$PHORUM["mod_htmlpurifier"]));
+ $offset = 1;
+ } elseif (!empty($_GET['migrate-sigs']) && $PHORUM['mod_htmlpurifier']['migrate-sigs']) {
+ $offset = (int) $_GET['migrate-sigs'];
+ }
+ return $offset;
+}
+
+function phorum_htmlpurifier_migrate_sigs($offset)
+{
+ global $PHORUM;
+
+ if(!$offset) return; // bail out quick if $offset == 0
+
+ // theoretically, we could get rid of this multi-request
+ // doo-hickery if safe mode is off
+ @set_time_limit(0); // attempt to let this run
+ $increment = $PHORUM['mod_htmlpurifier']['migrate-sigs-increment'];
+
+ require_once(dirname(__FILE__) . '/../migrate.php');
+ // migrate signatures
+ // do this in batches so we don't run out of time/space
+ $end = $offset + $increment;
+ $user_ids = array();
+ for ($i = $offset; $i < $end; $i++) {
+ $user_ids[] = $i;
+ }
+ $userinfos = phorum_db_user_get_fields($user_ids, 'signature');
+ foreach ($userinfos as $i => $user) {
+ if (empty($user['signature'])) continue;
+ $sig = $user['signature'];
+ // perform standard Phorum processing on the sig
+ $sig = str_replace(array("&","<",">"), array("&amp;","&lt;","&gt;"), $sig);
+ $sig = preg_replace("/<((http|https|ftp):\/\/[a-z0-9;\/\?:@=\&\$\-_\.\+!*'\(\),~%]+?)>/i", "$1", $sig);
+ // prepare fake data to pass to migration function
+ $fake_data = array(array("author"=>"", "email"=>"", "subject"=>"", 'body' => $sig));
+ list($fake_message) = phorum_htmlpurifier_migrate($fake_data);
+ $user['signature'] = $fake_message['body'];
+ if (!phorum_api_user_save($user)) {
+ exit('Error while saving user data');
+ }
+ }
+ unset($userinfos); // free up memory
+
+ // query for highest ID in database
+ $type = $PHORUM['DBCONFIG']['type'];
+ $sql = "select MAX(user_id) from {$PHORUM['user_table']}";
+ $row = phorum_db_interact(DB_RETURN_ROW, $sql);
+ $top_id = (int) $row[0];
+
+ $offset += $increment;
+ if ($offset > $top_id) { // test for end condition
+ echo 'Migration finished';
+ $PHORUM['mod_htmlpurifier']['migrate-sigs'] = false;
+ phorum_htmlpurifier_commit_settings();
+ return true;
+ }
+ $host = $_SERVER['HTTP_HOST'];
+ $uri = rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
+ $extra = 'admin.php?module=modsettings&mod=htmlpurifier&migrate-sigs=' . $offset;
+ // relies on output buffering to work
+ header("Location: http://$host$uri/$extra");
+ exit;
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/plugins/phorum/settings/save.php b/vendor/ezyang/htmlpurifier/plugins/phorum/settings/save.php
new file mode 100644
index 000000000..2aefaf83a
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/plugins/phorum/settings/save.php
@@ -0,0 +1,29 @@
+<?php
+
+function phorum_htmlpurifier_save_settings()
+{
+ global $PHORUM;
+ if (phorum_htmlpurifier_config_file_exists()) {
+ echo "Cannot update settings, <code>mods/htmlpurifier/config.php</code> already exists. To change
+ settings, edit that file. To use the web form, delete that file.<br />";
+ } else {
+ $config = phorum_htmlpurifier_get_config(true);
+ if (!isset($_POST['reset'])) $config->mergeArrayFromForm($_POST, 'config', $PHORUM['mod_htmlpurifier']['directives']);
+ $PHORUM['mod_htmlpurifier']['config'] = $config->getAll();
+ }
+ $PHORUM['mod_htmlpurifier']['wysiwyg'] = !empty($_POST['wysiwyg']);
+ $PHORUM['mod_htmlpurifier']['suppress_message'] = !empty($_POST['suppress_message']);
+ if(!phorum_htmlpurifier_commit_settings()){
+ $error="Database error while updating settings.";
+ } else {
+ echo "Settings Updated<br />";
+ }
+}
+
+function phorum_htmlpurifier_commit_settings()
+{
+ global $PHORUM;
+ return phorum_db_update_settings(array("mod_htmlpurifier"=>$PHORUM["mod_htmlpurifier"]));
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/release1-update.php b/vendor/ezyang/htmlpurifier/release1-update.php
new file mode 100644
index 000000000..834d38567
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/release1-update.php
@@ -0,0 +1,110 @@
+<?php
+
+// release script
+// PHP 5.0 only
+
+if (php_sapi_name() != 'cli') {
+ echo 'Release script cannot be called from web-browser.';
+ exit;
+}
+
+if (!isset($argv[1])) {
+ echo
+'php release.php [version]
+ HTML Purifier release script
+';
+ exit;
+}
+
+$version = trim($argv[1]);
+
+// Bump version numbers:
+
+// ...in VERSION
+file_put_contents('VERSION', $version);
+
+// ...in NEWS
+if ($is_dev = (strpos($version, 'dev') === false)) {
+ $date = date('Y-m-d');
+ $news_c = str_replace(
+ $l = "$version, unknown release date",
+ "$version, released $date",
+ file_get_contents('NEWS'),
+ $c
+ );
+ if (!$c) {
+ echo 'Could not update NEWS, missing ' . $l . PHP_EOL;
+ exit;
+ } elseif ($c > 1) {
+ echo 'More than one release declaration in NEWS replaced' . PHP_EOL;
+ exit;
+ }
+ file_put_contents('NEWS', $news_c);
+}
+
+// ...in Doxyfile
+$doxyfile_c = preg_replace(
+ '/(?<=PROJECT_NUMBER {9}= )[^\s]+/m', // brittle
+ $version,
+ file_get_contents('Doxyfile'),
+ 1, $c
+);
+if (!$c) {
+ echo 'Could not update Doxyfile, missing PROJECT_NUMBER.' . PHP_EOL;
+ exit;
+}
+file_put_contents('Doxyfile', $doxyfile_c);
+
+// ...in HTMLPurifier.php
+$htmlpurifier_c = file_get_contents('library/HTMLPurifier.php');
+$htmlpurifier_c = preg_replace(
+ '/HTML Purifier .+? - /',
+ "HTML Purifier $version - ",
+ $htmlpurifier_c,
+ 1, $c
+);
+if (!$c) {
+ echo 'Could not update HTMLPurifier.php, missing HTML Purifier [version] header.' . PHP_EOL;
+ exit;
+}
+$htmlpurifier_c = preg_replace(
+ '/public \$version = \'.+?\';/',
+ "public \$version = '$version';",
+ $htmlpurifier_c,
+ 1, $c
+);
+if (!$c) {
+ echo 'Could not update HTMLPurifier.php, missing public $version.' . PHP_EOL;
+ exit;
+}
+$htmlpurifier_c = preg_replace(
+ '/const VERSION = \'.+?\';/',
+ "const VERSION = '$version';",
+ $htmlpurifier_c,
+ 1, $c
+);
+if (!$c) {
+ echo 'Could not update HTMLPurifier.php, missing const $version.' . PHP_EOL;
+ exit;
+}
+file_put_contents('library/HTMLPurifier.php', $htmlpurifier_c);
+
+$config_c = file_get_contents('library/HTMLPurifier/Config.php');
+$config_c = preg_replace(
+ '/public \$version = \'.+?\';/',
+ "public \$version = '$version';",
+ $config_c,
+ 1, $c
+);
+if (!$c) {
+ echo 'Could not update Config.php, missing public $version.' . PHP_EOL;
+ exit;
+}
+file_put_contents('library/HTMLPurifier/Config.php', $config_c);
+
+passthru('php maintenance/flush.php');
+
+if ($is_dev) echo "Review changes, write something in WHATSNEW and FOCUS, and then commit with log 'Release $version.'" . PHP_EOL;
+else echo "Numbers updated to dev, no other modifications necessary!";
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/release2-tag.php b/vendor/ezyang/htmlpurifier/release2-tag.php
new file mode 100644
index 000000000..25e5300d8
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/release2-tag.php
@@ -0,0 +1,22 @@
+<?php
+
+// Tags releases
+
+if (php_sapi_name() != 'cli') {
+ echo 'Release script cannot be called from web-browser.';
+ exit;
+}
+
+require 'svn.php';
+
+$svn_info = my_svn_info('.');
+
+$version = trim(file_get_contents('VERSION'));
+
+$trunk_url = $svn_info['Repository Root'] . '/htmlpurifier/trunk';
+$trunk_tag_url = $svn_info['Repository Root'] . '/htmlpurifier/tags/' . $version;
+
+echo "Tagging trunk to tags/$version...";
+passthru("svn copy --message \"Tag $version release.\" $trunk_url $trunk_tag_url");
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/test-settings.sample.php b/vendor/ezyang/htmlpurifier/test-settings.sample.php
new file mode 100644
index 000000000..480b66279
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/test-settings.sample.php
@@ -0,0 +1,74 @@
+<?php
+
+// ATTENTION! DO NOT EDIT THIS FILE!
+// This file is necessary to run the unit tests and profiling scripts.
+// Please copy it to 'test-settings.php' and make the necessary edits.
+
+// Note: The only external library you *need* is SimpleTest; everything else
+// is optional.
+
+// We've got a lot of tests, so we recommend turning the limit off.
+set_time_limit(0);
+
+// Turning off output buffering will prevent mysterious errors from core dumps.
+$data = @ob_get_clean();
+if ($data !== false && $data !== '') {
+ echo "Output buffer contains data [".urlencode($data)."]\n";
+ exit;
+}
+
+// -----------------------------------------------------------------------------
+// REQUIRED SETTINGS
+
+// Note on running SimpleTest:
+// You want the Git copy of SimpleTest, found here:
+// https://github.com/simpletest/simpletest/
+//
+// If SimpleTest is borked with HTML Purifier, please contact me or
+// the SimpleTest devs; I am a developer for SimpleTest so I should be
+// able to quickly assess a fix. SimpleTest's problem is my problem!
+
+// Where is SimpleTest located? Remember to include a trailing slash!
+$simpletest_location = '/path/to/simpletest/';
+
+// -----------------------------------------------------------------------------
+// OPTIONAL SETTINGS
+
+// Note on running PHPT:
+// Vanilla PHPT from https://github.com/tswicegood/PHPT_Core should
+// work fine on Linux w/o multitest.
+//
+// To do multitest or Windows testing, you'll need some more
+// patches at https://github.com/ezyang/PHPT_Core
+//
+// I haven't tested the Windows setup in a while so I don't know if
+// it still works.
+
+// Should PHPT tests be enabled?
+$GLOBALS['HTMLPurifierTest']['PHPT'] = false;
+
+// If PHPT isn't in your Path via PEAR, set that here:
+// set_include_path('/path/to/phpt/Core/src' . PATH_SEPARATOR . get_include_path());
+
+// Where is CSSTidy located? (Include trailing slash. Leave false to disable.)
+$csstidy_location = false;
+
+// For tests/multitest.php, which versions to test?
+$versions_to_test = array();
+
+// Stable PHP binary to use when invoking maintenance scripts.
+$php = 'php';
+
+// For tests/multitest.php, what is the multi-version executable? It must
+// accept an extra parameter (version number) before all other arguments
+$phpv = false;
+
+// Should PEAR tests be run? If you've got a valid PEAR installation, set this
+// to true (or, if it's not in the include path, to its install directory).
+$GLOBALS['HTMLPurifierTest']['PEAR'] = false;
+
+// If PEAR is enabled, what PEAR tests should be run? (Note: you will
+// need to ensure these libraries are installed)
+$GLOBALS['HTMLPurifierTest']['Net_IDNA2'] = true;
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/test-settings.travis.php b/vendor/ezyang/htmlpurifier/test-settings.travis.php
new file mode 100644
index 000000000..b1edce4aa
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/test-settings.travis.php
@@ -0,0 +1,72 @@
+<?php
+
+// This file is the configuration for Travis testing.
+
+// Note: The only external library you *need* is SimpleTest; everything else
+// is optional.
+
+// We've got a lot of tests, so we recommend turning the limit off.
+set_time_limit(0);
+
+// Turning off output buffering will prevent mysterious errors from core dumps.
+$data = @ob_get_clean();
+if ($data !== false && $data !== '') {
+ echo "Output buffer contains data [".urlencode($data)."]\n";
+ exit;
+}
+
+// -----------------------------------------------------------------------------
+// REQUIRED SETTINGS
+
+// Note on running SimpleTest:
+// You want the Git copy of SimpleTest, found here:
+// https://github.com/simpletest/simpletest/
+//
+// If SimpleTest is borked with HTML Purifier, please contact me or
+// the SimpleTest devs; I am a developer for SimpleTest so I should be
+// able to quickly assess a fix. SimpleTest's problem is my problem!
+
+// Where is SimpleTest located? Remember to include a trailing slash!
+$simpletest_location = dirname(__FILE__) . '/simpletest/';
+
+// -----------------------------------------------------------------------------
+// OPTIONAL SETTINGS
+
+// Note on running PHPT:
+// Vanilla PHPT from https://github.com/tswicegood/PHPT_Core should
+// work fine on Linux w/o multitest.
+//
+// To do multitest or Windows testing, you'll need some more
+// patches at https://github.com/ezyang/PHPT_Core
+//
+// I haven't tested the Windows setup in a while so I don't know if
+// it still works.
+
+// Should PHPT tests be enabled?
+$GLOBALS['HTMLPurifierTest']['PHPT'] = false;
+
+// If PHPT isn't in your Path via PEAR, set that here:
+// set_include_path('/path/to/phpt/Core/src' . PATH_SEPARATOR . get_include_path());
+
+// Where is CSSTidy located? (Include trailing slash. Leave false to disable.)
+$csstidy_location = false;
+
+// For tests/multitest.php, which versions to test?
+$versions_to_test = array();
+
+// Stable PHP binary to use when invoking maintenance scripts.
+$php = 'php';
+
+// For tests/multitest.php, what is the multi-version executable? It must
+// accept an extra parameter (version number) before all other arguments
+$phpv = false;
+
+// Should PEAR tests be run? If you've got a valid PEAR installation, set this
+// to true (or, if it's not in the include path, to its install directory).
+$GLOBALS['HTMLPurifierTest']['PEAR'] = false;
+
+// If PEAR is enabled, what PEAR tests should be run? (Note: you will
+// need to ensure these libraries are installed)
+$GLOBALS['HTMLPurifierTest']['Net_IDNA2'] = true;
+
+// vim: et sw=4 sts=4
diff --git a/vendor/michelf/php-markdown/License.md b/vendor/michelf/php-markdown/License.md
new file mode 100644
index 000000000..c16197b69
--- /dev/null
+++ b/vendor/michelf/php-markdown/License.md
@@ -0,0 +1,36 @@
+PHP Markdown Lib
+Copyright (c) 2004-2016 Michel Fortin
+<https://michelf.ca/>
+All rights reserved.
+
+Based on Markdown
+Copyright (c) 2003-2006 John Gruber
+<https://daringfireball.net/>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name "Markdown" nor the names of its contributors may
+ be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+This software is provided by the copyright holders and contributors "as
+is" and any express or implied warranties, including, but not limited
+to, the implied warranties of merchantability and fitness for a
+particular purpose are disclaimed. In no event shall the copyright owner
+or contributors be liable for any direct, indirect, incidental, special,
+exemplary, or consequential damages (including, but not limited to,
+procurement of substitute goods or services; loss of use, data, or
+profits; or business interruption) however caused and on any theory of
+liability, whether in contract, strict liability, or tort (including
+negligence or otherwise) arising in any way out of the use of this
+software, even if advised of the possibility of such damage.
diff --git a/vendor/michelf/php-markdown/Michelf/Markdown.inc.php b/vendor/michelf/php-markdown/Michelf/Markdown.inc.php
new file mode 100644
index 000000000..e2bd3808e
--- /dev/null
+++ b/vendor/michelf/php-markdown/Michelf/Markdown.inc.php
@@ -0,0 +1,10 @@
+<?php
+
+// Use this file if you cannot use class autoloading. It will include all the
+// files needed for the Markdown parser.
+//
+// Take a look at the PSR-0-compatible class autoloading implementation
+// in the Readme.php file if you want a simple autoloader setup.
+
+require_once dirname(__FILE__) . '/MarkdownInterface.php';
+require_once dirname(__FILE__) . '/Markdown.php';
diff --git a/vendor/michelf/php-markdown/Michelf/Markdown.php b/vendor/michelf/php-markdown/Michelf/Markdown.php
new file mode 100644
index 000000000..c3eaf4464
--- /dev/null
+++ b/vendor/michelf/php-markdown/Michelf/Markdown.php
@@ -0,0 +1,1896 @@
+<?php
+/**
+ * Markdown - A text-to-HTML conversion tool for web writers
+ *
+ * @package php-markdown
+ * @author Michel Fortin <michel.fortin@michelf.com>
+ * @copyright 2004-2016 Michel Fortin <https://michelf.com/projects/php-markdown/>
+ * @copyright (Original Markdown) 2004-2006 John Gruber <https://daringfireball.net/projects/markdown/>
+ */
+
+namespace Michelf;
+
+/**
+ * Markdown Parser Class
+ */
+class Markdown implements MarkdownInterface {
+ /**
+ * Define the package version
+ * @var string
+ */
+ const MARKDOWNLIB_VERSION = "1.7.0";
+
+ /**
+ * Simple function interface - Initialize the parser and return the result
+ * of its transform method. This will work fine for derived classes too.
+ *
+ * @api
+ *
+ * @param string $text
+ * @return string
+ */
+ public static function defaultTransform($text) {
+ // Take parser class on which this function was called.
+ $parser_class = \get_called_class();
+
+ // Try to take parser from the static parser list
+ static $parser_list;
+ $parser =& $parser_list[$parser_class];
+
+ // Create the parser it not already set
+ if (!$parser) {
+ $parser = new $parser_class;
+ }
+
+ // Transform text using parser.
+ return $parser->transform($text);
+ }
+
+ /**
+ * Configuration variables
+ */
+
+ /**
+ * Change to ">" for HTML output.
+ * @var string
+ */
+ public $empty_element_suffix = " />";
+
+ /**
+ * The width of indentation of the output markup
+ * @var int
+ */
+ public $tab_width = 4;
+
+ /**
+ * Change to `true` to disallow markup or entities.
+ * @var boolean
+ */
+ public $no_markup = false;
+ public $no_entities = false;
+
+
+ /**
+ * Change to `true` to enable line breaks on \n without two trailling spaces
+ * @var boolean
+ */
+ public $hard_wrap = false;
+
+ /**
+ * Predefined URLs and titles for reference links and images.
+ * @var array
+ */
+ public $predef_urls = array();
+ public $predef_titles = array();
+
+ /**
+ * Optional filter function for URLs
+ * @var callable
+ */
+ public $url_filter_func = null;
+
+ /**
+ * Optional header id="" generation callback function.
+ * @var callable
+ */
+ public $header_id_func = null;
+
+ /**
+ * Optional function for converting code block content to HTML
+ * @var callable
+ */
+ public $code_block_content_func = null;
+
+ /**
+ * Optional function for converting code span content to HTML.
+ * @var callable
+ */
+ public $code_span_content_func = null;
+
+ /**
+ * Class attribute to toggle "enhanced ordered list" behaviour
+ * setting this to true will allow ordered lists to start from the index
+ * number that is defined first.
+ *
+ * For example:
+ * 2. List item two
+ * 3. List item three
+ *
+ * Becomes:
+ * <ol start="2">
+ * <li>List item two</li>
+ * <li>List item three</li>
+ * </ol>
+ *
+ * @var bool
+ */
+ public $enhanced_ordered_list = false;
+
+ /**
+ * Parser implementation
+ */
+
+ /**
+ * Regex to match balanced [brackets].
+ * Needed to insert a maximum bracked depth while converting to PHP.
+ * @var int
+ */
+ protected $nested_brackets_depth = 6;
+ protected $nested_brackets_re;
+
+ protected $nested_url_parenthesis_depth = 4;
+ protected $nested_url_parenthesis_re;
+
+ /**
+ * Table of hash values for escaped characters:
+ * @var string
+ */
+ protected $escape_chars = '\`*_{}[]()>#+-.!';
+ protected $escape_chars_re;
+
+ /**
+ * Constructor function. Initialize appropriate member variables.
+ * @return void
+ */
+ public function __construct() {
+ $this->_initDetab();
+ $this->prepareItalicsAndBold();
+
+ $this->nested_brackets_re =
+ str_repeat('(?>[^\[\]]+|\[', $this->nested_brackets_depth).
+ str_repeat('\])*', $this->nested_brackets_depth);
+
+ $this->nested_url_parenthesis_re =
+ str_repeat('(?>[^()\s]+|\(', $this->nested_url_parenthesis_depth).
+ str_repeat('(?>\)))*', $this->nested_url_parenthesis_depth);
+
+ $this->escape_chars_re = '['.preg_quote($this->escape_chars).']';
+
+ // Sort document, block, and span gamut in ascendent priority order.
+ asort($this->document_gamut);
+ asort($this->block_gamut);
+ asort($this->span_gamut);
+ }
+
+
+ /**
+ * Internal hashes used during transformation.
+ * @var array
+ */
+ protected $urls = array();
+ protected $titles = array();
+ protected $html_hashes = array();
+
+ /**
+ * Status flag to avoid invalid nesting.
+ * @var boolean
+ */
+ protected $in_anchor = false;
+
+ /**
+ * Called before the transformation process starts to setup parser states.
+ * @return void
+ */
+ protected function setup() {
+ // Clear global hashes.
+ $this->urls = $this->predef_urls;
+ $this->titles = $this->predef_titles;
+ $this->html_hashes = array();
+ $this->in_anchor = false;
+ }
+
+ /**
+ * Called after the transformation process to clear any variable which may
+ * be taking up memory unnecessarly.
+ * @return void
+ */
+ protected function teardown() {
+ $this->urls = array();
+ $this->titles = array();
+ $this->html_hashes = array();
+ }
+
+ /**
+ * Main function. Performs some preprocessing on the input text and pass
+ * it through the document gamut.
+ *
+ * @api
+ *
+ * @param string $text
+ * @return string
+ */
+ public function transform($text) {
+ $this->setup();
+
+ # Remove UTF-8 BOM and marker character in input, if present.
+ $text = preg_replace('{^\xEF\xBB\xBF|\x1A}', '', $text);
+
+ # Standardize line endings:
+ # DOS to Unix and Mac to Unix
+ $text = preg_replace('{\r\n?}', "\n", $text);
+
+ # Make sure $text ends with a couple of newlines:
+ $text .= "\n\n";
+
+ # Convert all tabs to spaces.
+ $text = $this->detab($text);
+
+ # Turn block-level HTML blocks into hash entries
+ $text = $this->hashHTMLBlocks($text);
+
+ # Strip any lines consisting only of spaces and tabs.
+ # This makes subsequent regexen easier to write, because we can
+ # match consecutive blank lines with /\n+/ instead of something
+ # contorted like /[ ]*\n+/ .
+ $text = preg_replace('/^[ ]+$/m', '', $text);
+
+ # Run document gamut methods.
+ foreach ($this->document_gamut as $method => $priority) {
+ $text = $this->$method($text);
+ }
+
+ $this->teardown();
+
+ return $text . "\n";
+ }
+
+ /**
+ * Define the document gamut
+ * @var array
+ */
+ protected $document_gamut = array(
+ // Strip link definitions, store in hashes.
+ "stripLinkDefinitions" => 20,
+ "runBasicBlockGamut" => 30,
+ );
+
+ /**
+ * Strips link definitions from text, stores the URLs and titles in
+ * hash references
+ * @param string $text
+ * @return string
+ */
+ protected function stripLinkDefinitions($text) {
+
+ $less_than_tab = $this->tab_width - 1;
+
+ // Link defs are in the form: ^[id]: url "optional title"
+ $text = preg_replace_callback('{
+ ^[ ]{0,'.$less_than_tab.'}\[(.+)\][ ]?: # id = $1
+ [ ]*
+ \n? # maybe *one* newline
+ [ ]*
+ (?:
+ <(.+?)> # url = $2
+ |
+ (\S+?) # url = $3
+ )
+ [ ]*
+ \n? # maybe one newline
+ [ ]*
+ (?:
+ (?<=\s) # lookbehind for whitespace
+ ["(]
+ (.*?) # title = $4
+ [")]
+ [ ]*
+ )? # title is optional
+ (?:\n+|\Z)
+ }xm',
+ array($this, '_stripLinkDefinitions_callback'),
+ $text
+ );
+ return $text;
+ }
+
+ /**
+ * The callback to strip link definitions
+ * @param array $matches
+ * @return string
+ */
+ protected function _stripLinkDefinitions_callback($matches) {
+ $link_id = strtolower($matches[1]);
+ $url = $matches[2] == '' ? $matches[3] : $matches[2];
+ $this->urls[$link_id] = $url;
+ $this->titles[$link_id] =& $matches[4];
+ return ''; // String that will replace the block
+ }
+
+ /**
+ * Hashify HTML blocks
+ * @param string $text
+ * @return string
+ */
+ protected function hashHTMLBlocks($text) {
+ if ($this->no_markup) {
+ return $text;
+ }
+
+ $less_than_tab = $this->tab_width - 1;
+
+ /**
+ * Hashify HTML blocks:
+ *
+ * We only want to do this for block-level HTML tags, such as headers,
+ * lists, and tables. That's because we still want to wrap <p>s around
+ * "paragraphs" that are wrapped in non-block-level tags, such as
+ * anchors, phrase emphasis, and spans. The list of tags we're looking
+ * for is hard-coded:
+ *
+ * * List "a" is made of tags which can be both inline or block-level.
+ * These will be treated block-level when the start tag is alone on
+ * its line, otherwise they're not matched here and will be taken as
+ * inline later.
+ * * List "b" is made of tags which are always block-level;
+ */
+ $block_tags_a_re = 'ins|del';
+ $block_tags_b_re = 'p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|address|'.
+ 'script|noscript|style|form|fieldset|iframe|math|svg|'.
+ 'article|section|nav|aside|hgroup|header|footer|'.
+ 'figure';
+
+ // Regular expression for the content of a block tag.
+ $nested_tags_level = 4;
+ $attr = '
+ (?> # optional tag attributes
+ \s # starts with whitespace
+ (?>
+ [^>"/]+ # text outside quotes
+ |
+ /+(?!>) # slash not followed by ">"
+ |
+ "[^"]*" # text inside double quotes (tolerate ">")
+ |
+ \'[^\']*\' # text inside single quotes (tolerate ">")
+ )*
+ )?
+ ';
+ $content =
+ str_repeat('
+ (?>
+ [^<]+ # content without tag
+ |
+ <\2 # nested opening tag
+ '.$attr.' # attributes
+ (?>
+ />
+ |
+ >', $nested_tags_level). // end of opening tag
+ '.*?'. // last level nested tag content
+ str_repeat('
+ </\2\s*> # closing nested tag
+ )
+ |
+ <(?!/\2\s*> # other tags with a different name
+ )
+ )*',
+ $nested_tags_level);
+ $content2 = str_replace('\2', '\3', $content);
+
+ /**
+ * First, look for nested blocks, e.g.:
+ * <div>
+ * <div>
+ * tags for inner block must be indented.
+ * </div>
+ * </div>
+ *
+ * The outermost tags must start at the left margin for this to match,
+ * and the inner nested divs must be indented.
+ * We need to do this before the next, more liberal match, because the
+ * next match will start at the first `<div>` and stop at the
+ * first `</div>`.
+ */
+ $text = preg_replace_callback('{(?>
+ (?>
+ (?<=\n) # Starting on its own line
+ | # or
+ \A\n? # the at beginning of the doc
+ )
+ ( # save in $1
+
+ # Match from `\n<tag>` to `</tag>\n`, handling nested tags
+ # in between.
+
+ [ ]{0,'.$less_than_tab.'}
+ <('.$block_tags_b_re.')# start tag = $2
+ '.$attr.'> # attributes followed by > and \n
+ '.$content.' # content, support nesting
+ </\2> # the matching end tag
+ [ ]* # trailing spaces/tabs
+ (?=\n+|\Z) # followed by a newline or end of document
+
+ | # Special version for tags of group a.
+
+ [ ]{0,'.$less_than_tab.'}
+ <('.$block_tags_a_re.')# start tag = $3
+ '.$attr.'>[ ]*\n # attributes followed by >
+ '.$content2.' # content, support nesting
+ </\3> # the matching end tag
+ [ ]* # trailing spaces/tabs
+ (?=\n+|\Z) # followed by a newline or end of document
+
+ | # Special case just for <hr />. It was easier to make a special
+ # case than to make the other regex more complicated.
+
+ [ ]{0,'.$less_than_tab.'}
+ <(hr) # start tag = $2
+ '.$attr.' # attributes
+ /?> # the matching end tag
+ [ ]*
+ (?=\n{2,}|\Z) # followed by a blank line or end of document
+
+ | # Special case for standalone HTML comments:
+
+ [ ]{0,'.$less_than_tab.'}
+ (?s:
+ <!-- .*? -->
+ )
+ [ ]*
+ (?=\n{2,}|\Z) # followed by a blank line or end of document
+
+ | # PHP and ASP-style processor instructions (<? and <%)
+
+ [ ]{0,'.$less_than_tab.'}
+ (?s:
+ <([?%]) # $2
+ .*?
+ \2>
+ )
+ [ ]*
+ (?=\n{2,}|\Z) # followed by a blank line or end of document
+
+ )
+ )}Sxmi',
+ array($this, '_hashHTMLBlocks_callback'),
+ $text
+ );
+
+ return $text;
+ }
+
+ /**
+ * The callback for hashing HTML blocks
+ * @param string $matches
+ * @return string
+ */
+ protected function _hashHTMLBlocks_callback($matches) {
+ $text = $matches[1];
+ $key = $this->hashBlock($text);
+ return "\n\n$key\n\n";
+ }
+
+ /**
+ * Called whenever a tag must be hashed when a function insert an atomic
+ * element in the text stream. Passing $text to through this function gives
+ * a unique text-token which will be reverted back when calling unhash.
+ *
+ * The $boundary argument specify what character should be used to surround
+ * the token. By convension, "B" is used for block elements that needs not
+ * to be wrapped into paragraph tags at the end, ":" is used for elements
+ * that are word separators and "X" is used in the general case.
+ *
+ * @param string $text
+ * @param string $boundary
+ * @return string
+ */
+ protected function hashPart($text, $boundary = 'X') {
+ // Swap back any tag hash found in $text so we do not have to `unhash`
+ // multiple times at the end.
+ $text = $this->unhash($text);
+
+ // Then hash the block.
+ static $i = 0;
+ $key = "$boundary\x1A" . ++$i . $boundary;
+ $this->html_hashes[$key] = $text;
+ return $key; // String that will replace the tag.
+ }
+
+ /**
+ * Shortcut function for hashPart with block-level boundaries.
+ * @param string $text
+ * @return string
+ */
+ protected function hashBlock($text) {
+ return $this->hashPart($text, 'B');
+ }
+
+ /**
+ * Define the block gamut - these are all the transformations that form
+ * block-level tags like paragraphs, headers, and list items.
+ * @var array
+ */
+ protected $block_gamut = array(
+ "doHeaders" => 10,
+ "doHorizontalRules" => 20,
+ "doLists" => 40,
+ "doCodeBlocks" => 50,
+ "doBlockQuotes" => 60,
+ );
+
+ /**
+ * Run block gamut tranformations.
+ *
+ * We need to escape raw HTML in Markdown source before doing anything
+ * else. This need to be done for each block, and not only at the
+ * begining in the Markdown function since hashed blocks can be part of
+ * list items and could have been indented. Indented blocks would have
+ * been seen as a code block in a previous pass of hashHTMLBlocks.
+ *
+ * @param string $text
+ * @return string
+ */
+ protected function runBlockGamut($text) {
+ $text = $this->hashHTMLBlocks($text);
+ return $this->runBasicBlockGamut($text);
+ }
+
+ /**
+ * Run block gamut tranformations, without hashing HTML blocks. This is
+ * useful when HTML blocks are known to be already hashed, like in the first
+ * whole-document pass.
+ *
+ * @param string $text
+ * @return string
+ */
+ protected function runBasicBlockGamut($text) {
+
+ foreach ($this->block_gamut as $method => $priority) {
+ $text = $this->$method($text);
+ }
+
+ // Finally form paragraph and restore hashed blocks.
+ $text = $this->formParagraphs($text);
+
+ return $text;
+ }
+
+ /**
+ * Convert horizontal rules
+ * @param string $text
+ * @return string
+ */
+ protected function doHorizontalRules($text) {
+ return preg_replace(
+ '{
+ ^[ ]{0,3} # Leading space
+ ([-*_]) # $1: First marker
+ (?> # Repeated marker group
+ [ ]{0,2} # Zero, one, or two spaces.
+ \1 # Marker character
+ ){2,} # Group repeated at least twice
+ [ ]* # Tailing spaces
+ $ # End of line.
+ }mx',
+ "\n".$this->hashBlock("<hr$this->empty_element_suffix")."\n",
+ $text
+ );
+ }
+
+ /**
+ * These are all the transformations that occur *within* block-level
+ * tags like paragraphs, headers, and list items.
+ * @var array
+ */
+ protected $span_gamut = array(
+ // Process character escapes, code spans, and inline HTML
+ // in one shot.
+ "parseSpan" => -30,
+ // Process anchor and image tags. Images must come first,
+ // because ![foo][f] looks like an anchor.
+ "doImages" => 10,
+ "doAnchors" => 20,
+ // Make links out of things like `<https://example.com/>`
+ // Must come after doAnchors, because you can use < and >
+ // delimiters in inline links like [this](<url>).
+ "doAutoLinks" => 30,
+ "encodeAmpsAndAngles" => 40,
+ "doItalicsAndBold" => 50,
+ "doHardBreaks" => 60,
+ );
+
+ /**
+ * Run span gamut transformations
+ * @param string $text
+ * @return string
+ */
+ protected function runSpanGamut($text) {
+ foreach ($this->span_gamut as $method => $priority) {
+ $text = $this->$method($text);
+ }
+
+ return $text;
+ }
+
+ /**
+ * Do hard breaks
+ * @param string $text
+ * @return string
+ */
+ protected function doHardBreaks($text) {
+ if ($this->hard_wrap) {
+ return preg_replace_callback('/ *\n/',
+ array($this, '_doHardBreaks_callback'), $text);
+ } else {
+ return preg_replace_callback('/ {2,}\n/',
+ array($this, '_doHardBreaks_callback'), $text);
+ }
+ }
+
+ /**
+ * Trigger part hashing for the hard break (callback method)
+ * @param array $matches
+ * @return string
+ */
+ protected function _doHardBreaks_callback($matches) {
+ return $this->hashPart("<br$this->empty_element_suffix\n");
+ }
+
+ /**
+ * Turn Markdown link shortcuts into XHTML <a> tags.
+ * @param string $text
+ * @return string
+ */
+ protected function doAnchors($text) {
+ if ($this->in_anchor) {
+ return $text;
+ }
+ $this->in_anchor = true;
+
+ // First, handle reference-style links: [link text] [id]
+ $text = preg_replace_callback('{
+ ( # wrap whole match in $1
+ \[
+ ('.$this->nested_brackets_re.') # link text = $2
+ \]
+
+ [ ]? # one optional space
+ (?:\n[ ]*)? # one optional newline followed by spaces
+
+ \[
+ (.*?) # id = $3
+ \]
+ )
+ }xs',
+ array($this, '_doAnchors_reference_callback'), $text);
+
+ // Next, inline-style links: [link text](url "optional title")
+ $text = preg_replace_callback('{
+ ( # wrap whole match in $1
+ \[
+ ('.$this->nested_brackets_re.') # link text = $2
+ \]
+ \( # literal paren
+ [ \n]*
+ (?:
+ <(.+?)> # href = $3
+ |
+ ('.$this->nested_url_parenthesis_re.') # href = $4
+ )
+ [ \n]*
+ ( # $5
+ ([\'"]) # quote char = $6
+ (.*?) # Title = $7
+ \6 # matching quote
+ [ \n]* # ignore any spaces/tabs between closing quote and )
+ )? # title is optional
+ \)
+ )
+ }xs',
+ array($this, '_doAnchors_inline_callback'), $text);
+
+ // Last, handle reference-style shortcuts: [link text]
+ // These must come last in case you've also got [link text][1]
+ // or [link text](/foo)
+ $text = preg_replace_callback('{
+ ( # wrap whole match in $1
+ \[
+ ([^\[\]]+) # link text = $2; can\'t contain [ or ]
+ \]
+ )
+ }xs',
+ array($this, '_doAnchors_reference_callback'), $text);
+
+ $this->in_anchor = false;
+ return $text;
+ }
+
+ /**
+ * Callback method to parse referenced anchors
+ * @param string $matches
+ * @return string
+ */
+ protected function _doAnchors_reference_callback($matches) {
+ $whole_match = $matches[1];
+ $link_text = $matches[2];
+ $link_id =& $matches[3];
+
+ if ($link_id == "") {
+ // for shortcut links like [this][] or [this].
+ $link_id = $link_text;
+ }
+
+ // lower-case and turn embedded newlines into spaces
+ $link_id = strtolower($link_id);
+ $link_id = preg_replace('{[ ]?\n}', ' ', $link_id);
+
+ if (isset($this->urls[$link_id])) {
+ $url = $this->urls[$link_id];
+ $url = $this->encodeURLAttribute($url);
+
+ $result = "<a href=\"$url\"";
+ if ( isset( $this->titles[$link_id] ) ) {
+ $title = $this->titles[$link_id];
+ $title = $this->encodeAttribute($title);
+ $result .= " title=\"$title\"";
+ }
+
+ $link_text = $this->runSpanGamut($link_text);
+ $result .= ">$link_text</a>";
+ $result = $this->hashPart($result);
+ } else {
+ $result = $whole_match;
+ }
+ return $result;
+ }
+
+ /**
+ * Callback method to parse inline anchors
+ * @param string $matches
+ * @return string
+ */
+ protected function _doAnchors_inline_callback($matches) {
+ $whole_match = $matches[1];
+ $link_text = $this->runSpanGamut($matches[2]);
+ $url = $matches[3] == '' ? $matches[4] : $matches[3];
+ $title =& $matches[7];
+
+ // If the URL was of the form <s p a c e s> it got caught by the HTML
+ // tag parser and hashed. Need to reverse the process before using
+ // the URL.
+ $unhashed = $this->unhash($url);
+ if ($unhashed != $url)
+ $url = preg_replace('/^<(.*)>$/', '\1', $unhashed);
+
+ $url = $this->encodeURLAttribute($url);
+
+ $result = "<a href=\"$url\"";
+ if (isset($title)) {
+ $title = $this->encodeAttribute($title);
+ $result .= " title=\"$title\"";
+ }
+
+ $link_text = $this->runSpanGamut($link_text);
+ $result .= ">$link_text</a>";
+
+ return $this->hashPart($result);
+ }
+
+ /**
+ * Turn Markdown image shortcuts into <img> tags.
+ * @param string $text
+ * @return string
+ */
+ protected function doImages($text) {
+ // First, handle reference-style labeled images: ![alt text][id]
+ $text = preg_replace_callback('{
+ ( # wrap whole match in $1
+ !\[
+ ('.$this->nested_brackets_re.') # alt text = $2
+ \]
+
+ [ ]? # one optional space
+ (?:\n[ ]*)? # one optional newline followed by spaces
+
+ \[
+ (.*?) # id = $3
+ \]
+
+ )
+ }xs',
+ array($this, '_doImages_reference_callback'), $text);
+
+ // Next, handle inline images: ![alt text](url "optional title")
+ // Don't forget: encode * and _
+ $text = preg_replace_callback('{
+ ( # wrap whole match in $1
+ !\[
+ ('.$this->nested_brackets_re.') # alt text = $2
+ \]
+ \s? # One optional whitespace character
+ \( # literal paren
+ [ \n]*
+ (?:
+ <(\S*)> # src url = $3
+ |
+ ('.$this->nested_url_parenthesis_re.') # src url = $4
+ )
+ [ \n]*
+ ( # $5
+ ([\'"]) # quote char = $6
+ (.*?) # title = $7
+ \6 # matching quote
+ [ \n]*
+ )? # title is optional
+ \)
+ )
+ }xs',
+ array($this, '_doImages_inline_callback'), $text);
+
+ return $text;
+ }
+
+ /**
+ * Callback to parse references image tags
+ * @param array $matches
+ * @return string
+ */
+ protected function _doImages_reference_callback($matches) {
+ $whole_match = $matches[1];
+ $alt_text = $matches[2];
+ $link_id = strtolower($matches[3]);
+
+ if ($link_id == "") {
+ $link_id = strtolower($alt_text); // for shortcut links like ![this][].
+ }
+
+ $alt_text = $this->encodeAttribute($alt_text);
+ if (isset($this->urls[$link_id])) {
+ $url = $this->encodeURLAttribute($this->urls[$link_id]);
+ $result = "<img src=\"$url\" alt=\"$alt_text\"";
+ if (isset($this->titles[$link_id])) {
+ $title = $this->titles[$link_id];
+ $title = $this->encodeAttribute($title);
+ $result .= " title=\"$title\"";
+ }
+ $result .= $this->empty_element_suffix;
+ $result = $this->hashPart($result);
+ } else {
+ // If there's no such link ID, leave intact:
+ $result = $whole_match;
+ }
+
+ return $result;
+ }
+
+ /**
+ * Callback to parse inline image tags
+ * @param array $matches
+ * @return string
+ */
+ protected function _doImages_inline_callback($matches) {
+ $whole_match = $matches[1];
+ $alt_text = $matches[2];
+ $url = $matches[3] == '' ? $matches[4] : $matches[3];
+ $title =& $matches[7];
+
+ $alt_text = $this->encodeAttribute($alt_text);
+ $url = $this->encodeURLAttribute($url);
+ $result = "<img src=\"$url\" alt=\"$alt_text\"";
+ if (isset($title)) {
+ $title = $this->encodeAttribute($title);
+ $result .= " title=\"$title\""; // $title already quoted
+ }
+ $result .= $this->empty_element_suffix;
+
+ return $this->hashPart($result);
+ }
+
+ /**
+ * Parse Markdown heading elements to HTML
+ * @param string $text
+ * @return string
+ */
+ protected function doHeaders($text) {
+ /**
+ * Setext-style headers:
+ * Header 1
+ * ========
+ *
+ * Header 2
+ * --------
+ */
+ $text = preg_replace_callback('{ ^(.+?)[ ]*\n(=+|-+)[ ]*\n+ }mx',
+ array($this, '_doHeaders_callback_setext'), $text);
+
+ /**
+ * atx-style headers:
+ * # Header 1
+ * ## Header 2
+ * ## Header 2 with closing hashes ##
+ * ...
+ * ###### Header 6
+ */
+ $text = preg_replace_callback('{
+ ^(\#{1,6}) # $1 = string of #\'s
+ [ ]*
+ (.+?) # $2 = Header text
+ [ ]*
+ \#* # optional closing #\'s (not counted)
+ \n+
+ }xm',
+ array($this, '_doHeaders_callback_atx'), $text);
+
+ return $text;
+ }
+
+ /**
+ * Setext header parsing callback
+ * @param array $matches
+ * @return string
+ */
+ protected function _doHeaders_callback_setext($matches) {
+ // Terrible hack to check we haven't found an empty list item.
+ if ($matches[2] == '-' && preg_match('{^-(?: |$)}', $matches[1])) {
+ return $matches[0];
+ }
+
+ $level = $matches[2]{0} == '=' ? 1 : 2;
+
+ // ID attribute generation
+ $idAtt = $this->_generateIdFromHeaderValue($matches[1]);
+
+ $block = "<h$level$idAtt>".$this->runSpanGamut($matches[1])."</h$level>";
+ return "\n" . $this->hashBlock($block) . "\n\n";
+ }
+
+ /**
+ * ATX header parsing callback
+ * @param array $matches
+ * @return string
+ */
+ protected function _doHeaders_callback_atx($matches) {
+ // ID attribute generation
+ $idAtt = $this->_generateIdFromHeaderValue($matches[2]);
+
+ $level = strlen($matches[1]);
+ $block = "<h$level$idAtt>".$this->runSpanGamut($matches[2])."</h$level>";
+ return "\n" . $this->hashBlock($block) . "\n\n";
+ }
+
+ /**
+ * If a header_id_func property is set, we can use it to automatically
+ * generate an id attribute.
+ *
+ * This method returns a string in the form id="foo", or an empty string
+ * otherwise.
+ * @param string $headerValue
+ * @return string
+ */
+ protected function _generateIdFromHeaderValue($headerValue) {
+ if (!is_callable($this->header_id_func)) {
+ return "";
+ }
+
+ $idValue = call_user_func($this->header_id_func, $headerValue);
+ if (!$idValue) {
+ return "";
+ }
+
+ return ' id="' . $this->encodeAttribute($idValue) . '"';
+ }
+
+ /**
+ * Form HTML ordered (numbered) and unordered (bulleted) lists.
+ * @param string $text
+ * @return string
+ */
+ protected function doLists($text) {
+ $less_than_tab = $this->tab_width - 1;
+
+ // Re-usable patterns to match list item bullets and number markers:
+ $marker_ul_re = '[*+-]';
+ $marker_ol_re = '\d+[\.]';
+
+ $markers_relist = array(
+ $marker_ul_re => $marker_ol_re,
+ $marker_ol_re => $marker_ul_re,
+ );
+
+ foreach ($markers_relist as $marker_re => $other_marker_re) {
+ // Re-usable pattern to match any entirel ul or ol list:
+ $whole_list_re = '
+ ( # $1 = whole list
+ ( # $2
+ ([ ]{0,'.$less_than_tab.'}) # $3 = number of spaces
+ ('.$marker_re.') # $4 = first list item marker
+ [ ]+
+ )
+ (?s:.+?)
+ ( # $5
+ \z
+ |
+ \n{2,}
+ (?=\S)
+ (?! # Negative lookahead for another list item marker
+ [ ]*
+ '.$marker_re.'[ ]+
+ )
+ |
+ (?= # Lookahead for another kind of list
+ \n
+ \3 # Must have the same indentation
+ '.$other_marker_re.'[ ]+
+ )
+ )
+ )
+ '; // mx
+
+ // We use a different prefix before nested lists than top-level lists.
+ //See extended comment in _ProcessListItems().
+
+ if ($this->list_level) {
+ $text = preg_replace_callback('{
+ ^
+ '.$whole_list_re.'
+ }mx',
+ array($this, '_doLists_callback'), $text);
+ } else {
+ $text = preg_replace_callback('{
+ (?:(?<=\n)\n|\A\n?) # Must eat the newline
+ '.$whole_list_re.'
+ }mx',
+ array($this, '_doLists_callback'), $text);
+ }
+ }
+
+ return $text;
+ }
+
+ /**
+ * List parsing callback
+ * @param array $matches
+ * @return string
+ */
+ protected function _doLists_callback($matches) {
+ // Re-usable patterns to match list item bullets and number markers:
+ $marker_ul_re = '[*+-]';
+ $marker_ol_re = '\d+[\.]';
+ $marker_any_re = "(?:$marker_ul_re|$marker_ol_re)";
+ $marker_ol_start_re = '[0-9]+';
+
+ $list = $matches[1];
+ $list_type = preg_match("/$marker_ul_re/", $matches[4]) ? "ul" : "ol";
+
+ $marker_any_re = ( $list_type == "ul" ? $marker_ul_re : $marker_ol_re );
+
+ $list .= "\n";
+ $result = $this->processListItems($list, $marker_any_re);
+
+ $ol_start = 1;
+ if ($this->enhanced_ordered_list) {
+ // Get the start number for ordered list.
+ if ($list_type == 'ol') {
+ $ol_start_array = array();
+ $ol_start_check = preg_match("/$marker_ol_start_re/", $matches[4], $ol_start_array);
+ if ($ol_start_check){
+ $ol_start = $ol_start_array[0];
+ }
+ }
+ }
+
+ if ($ol_start > 1 && $list_type == 'ol'){
+ $result = $this->hashBlock("<$list_type start=\"$ol_start\">\n" . $result . "</$list_type>");
+ } else {
+ $result = $this->hashBlock("<$list_type>\n" . $result . "</$list_type>");
+ }
+ return "\n". $result ."\n\n";
+ }
+
+ /**
+ * Nesting tracker for list levels
+ * @var integer
+ */
+ protected $list_level = 0;
+
+ /**
+ * Process the contents of a single ordered or unordered list, splitting it
+ * into individual list items.
+ * @param string $list_str
+ * @param string $marker_any_re
+ * @return string
+ */
+ protected function processListItems($list_str, $marker_any_re) {
+ /**
+ * The $this->list_level global keeps track of when we're inside a list.
+ * Each time we enter a list, we increment it; when we leave a list,
+ * we decrement. If it's zero, we're not in a list anymore.
+ *
+ * We do this because when we're not inside a list, we want to treat
+ * something like this:
+ *
+ * I recommend upgrading to version
+ * 8. Oops, now this line is treated
+ * as a sub-list.
+ *
+ * As a single paragraph, despite the fact that the second line starts
+ * with a digit-period-space sequence.
+ *
+ * Whereas when we're inside a list (or sub-list), that line will be
+ * treated as the start of a sub-list. What a kludge, huh? This is
+ * an aspect of Markdown's syntax that's hard to parse perfectly
+ * without resorting to mind-reading. Perhaps the solution is to
+ * change the syntax rules such that sub-lists must start with a
+ * starting cardinal number; e.g. "1." or "a.".
+ */
+ $this->list_level++;
+
+ // Trim trailing blank lines:
+ $list_str = preg_replace("/\n{2,}\\z/", "\n", $list_str);
+
+ $list_str = preg_replace_callback('{
+ (\n)? # leading line = $1
+ (^[ ]*) # leading whitespace = $2
+ ('.$marker_any_re.' # list marker and space = $3
+ (?:[ ]+|(?=\n)) # space only required if item is not empty
+ )
+ ((?s:.*?)) # list item text = $4
+ (?:(\n+(?=\n))|\n) # tailing blank line = $5
+ (?= \n* (\z | \2 ('.$marker_any_re.') (?:[ ]+|(?=\n))))
+ }xm',
+ array($this, '_processListItems_callback'), $list_str);
+
+ $this->list_level--;
+ return $list_str;
+ }
+
+ /**
+ * List item parsing callback
+ * @param array $matches
+ * @return string
+ */
+ protected function _processListItems_callback($matches) {
+ $item = $matches[4];
+ $leading_line =& $matches[1];
+ $leading_space =& $matches[2];
+ $marker_space = $matches[3];
+ $tailing_blank_line =& $matches[5];
+
+ if ($leading_line || $tailing_blank_line ||
+ preg_match('/\n{2,}/', $item))
+ {
+ // Replace marker with the appropriate whitespace indentation
+ $item = $leading_space . str_repeat(' ', strlen($marker_space)) . $item;
+ $item = $this->runBlockGamut($this->outdent($item)."\n");
+ } else {
+ // Recursion for sub-lists:
+ $item = $this->doLists($this->outdent($item));
+ $item = $this->formParagraphs($item, false);
+ }
+
+ return "<li>" . $item . "</li>\n";
+ }
+
+ /**
+ * Process Markdown `<pre><code>` blocks.
+ * @param string $text
+ * @return string
+ */
+ protected function doCodeBlocks($text) {
+ $text = preg_replace_callback('{
+ (?:\n\n|\A\n?)
+ ( # $1 = the code block -- one or more lines, starting with a space/tab
+ (?>
+ [ ]{'.$this->tab_width.'} # Lines must start with a tab or a tab-width of spaces
+ .*\n+
+ )+
+ )
+ ((?=^[ ]{0,'.$this->tab_width.'}\S)|\Z) # Lookahead for non-space at line-start, or end of doc
+ }xm',
+ array($this, '_doCodeBlocks_callback'), $text);
+
+ return $text;
+ }
+
+ /**
+ * Code block parsing callback
+ * @param array $matches
+ * @return string
+ */
+ protected function _doCodeBlocks_callback($matches) {
+ $codeblock = $matches[1];
+
+ $codeblock = $this->outdent($codeblock);
+ if ($this->code_block_content_func) {
+ $codeblock = call_user_func($this->code_block_content_func, $codeblock, "");
+ } else {
+ $codeblock = htmlspecialchars($codeblock, ENT_NOQUOTES);
+ }
+
+ # trim leading newlines and trailing newlines
+ $codeblock = preg_replace('/\A\n+|\n+\z/', '', $codeblock);
+
+ $codeblock = "<pre><code>$codeblock\n</code></pre>";
+ return "\n\n" . $this->hashBlock($codeblock) . "\n\n";
+ }
+
+ /**
+ * Create a code span markup for $code. Called from handleSpanToken.
+ * @param string $code
+ * @return string
+ */
+ protected function makeCodeSpan($code) {
+ if ($this->code_span_content_func) {
+ $code = call_user_func($this->code_span_content_func, $code);
+ } else {
+ $code = htmlspecialchars(trim($code), ENT_NOQUOTES);
+ }
+ return $this->hashPart("<code>$code</code>");
+ }
+
+ /**
+ * Define the emphasis operators with their regex matches
+ * @var array
+ */
+ protected $em_relist = array(
+ '' => '(?:(?<!\*)\*(?!\*)|(?<!_)_(?!_))(?![\.,:;]?\s)',
+ '*' => '(?<![\s*])\*(?!\*)',
+ '_' => '(?<![\s_])_(?!_)',
+ );
+
+ /**
+ * Define the strong operators with their regex matches
+ * @var array
+ */
+ protected $strong_relist = array(
+ '' => '(?:(?<!\*)\*\*(?!\*)|(?<!_)__(?!_))(?![\.,:;]?\s)',
+ '**' => '(?<![\s*])\*\*(?!\*)',
+ '__' => '(?<![\s_])__(?!_)',
+ );
+
+ /**
+ * Define the emphasis + strong operators with their regex matches
+ * @var array
+ */
+ protected $em_strong_relist = array(
+ '' => '(?:(?<!\*)\*\*\*(?!\*)|(?<!_)___(?!_))(?![\.,:;]?\s)',
+ '***' => '(?<![\s*])\*\*\*(?!\*)',
+ '___' => '(?<![\s_])___(?!_)',
+ );
+
+ /**
+ * Container for prepared regular expressions
+ * @var array
+ */
+ protected $em_strong_prepared_relist;
+
+ /**
+ * Prepare regular expressions for searching emphasis tokens in any
+ * context.
+ * @return void
+ */
+ protected function prepareItalicsAndBold() {
+ foreach ($this->em_relist as $em => $em_re) {
+ foreach ($this->strong_relist as $strong => $strong_re) {
+ // Construct list of allowed token expressions.
+ $token_relist = array();
+ if (isset($this->em_strong_relist["$em$strong"])) {
+ $token_relist[] = $this->em_strong_relist["$em$strong"];
+ }
+ $token_relist[] = $em_re;
+ $token_relist[] = $strong_re;
+
+ // Construct master expression from list.
+ $token_re = '{(' . implode('|', $token_relist) . ')}';
+ $this->em_strong_prepared_relist["$em$strong"] = $token_re;
+ }
+ }
+ }
+
+ /**
+ * Convert Markdown italics (emphasis) and bold (strong) to HTML
+ * @param string $text
+ * @return string
+ */
+ protected function doItalicsAndBold($text) {
+ $token_stack = array('');
+ $text_stack = array('');
+ $em = '';
+ $strong = '';
+ $tree_char_em = false;
+
+ while (1) {
+ // Get prepared regular expression for seraching emphasis tokens
+ // in current context.
+ $token_re = $this->em_strong_prepared_relist["$em$strong"];
+
+ // Each loop iteration search for the next emphasis token.
+ // Each token is then passed to handleSpanToken.
+ $parts = preg_split($token_re, $text, 2, PREG_SPLIT_DELIM_CAPTURE);
+ $text_stack[0] .= $parts[0];
+ $token =& $parts[1];
+ $text =& $parts[2];
+
+ if (empty($token)) {
+ // Reached end of text span: empty stack without emitting.
+ // any more emphasis.
+ while ($token_stack[0]) {
+ $text_stack[1] .= array_shift($token_stack);
+ $text_stack[0] .= array_shift($text_stack);
+ }
+ break;
+ }
+
+ $token_len = strlen($token);
+ if ($tree_char_em) {
+ // Reached closing marker while inside a three-char emphasis.
+ if ($token_len == 3) {
+ // Three-char closing marker, close em and strong.
+ array_shift($token_stack);
+ $span = array_shift($text_stack);
+ $span = $this->runSpanGamut($span);
+ $span = "<strong><em>$span</em></strong>";
+ $text_stack[0] .= $this->hashPart($span);
+ $em = '';
+ $strong = '';
+ } else {
+ // Other closing marker: close one em or strong and
+ // change current token state to match the other
+ $token_stack[0] = str_repeat($token{0}, 3-$token_len);
+ $tag = $token_len == 2 ? "strong" : "em";
+ $span = $text_stack[0];
+ $span = $this->runSpanGamut($span);
+ $span = "<$tag>$span</$tag>";
+ $text_stack[0] = $this->hashPart($span);
+ $$tag = ''; // $$tag stands for $em or $strong
+ }
+ $tree_char_em = false;
+ } else if ($token_len == 3) {
+ if ($em) {
+ // Reached closing marker for both em and strong.
+ // Closing strong marker:
+ for ($i = 0; $i < 2; ++$i) {
+ $shifted_token = array_shift($token_stack);
+ $tag = strlen($shifted_token) == 2 ? "strong" : "em";
+ $span = array_shift($text_stack);
+ $span = $this->runSpanGamut($span);
+ $span = "<$tag>$span</$tag>";
+ $text_stack[0] .= $this->hashPart($span);
+ $$tag = ''; // $$tag stands for $em or $strong
+ }
+ } else {
+ // Reached opening three-char emphasis marker. Push on token
+ // stack; will be handled by the special condition above.
+ $em = $token{0};
+ $strong = "$em$em";
+ array_unshift($token_stack, $token);
+ array_unshift($text_stack, '');
+ $tree_char_em = true;
+ }
+ } else if ($token_len == 2) {
+ if ($strong) {
+ // Unwind any dangling emphasis marker:
+ if (strlen($token_stack[0]) == 1) {
+ $text_stack[1] .= array_shift($token_stack);
+ $text_stack[0] .= array_shift($text_stack);
+ }
+ // Closing strong marker:
+ array_shift($token_stack);
+ $span = array_shift($text_stack);
+ $span = $this->runSpanGamut($span);
+ $span = "<strong>$span</strong>";
+ $text_stack[0] .= $this->hashPart($span);
+ $strong = '';
+ } else {
+ array_unshift($token_stack, $token);
+ array_unshift($text_stack, '');
+ $strong = $token;
+ }
+ } else {
+ // Here $token_len == 1
+ if ($em) {
+ if (strlen($token_stack[0]) == 1) {
+ // Closing emphasis marker:
+ array_shift($token_stack);
+ $span = array_shift($text_stack);
+ $span = $this->runSpanGamut($span);
+ $span = "<em>$span</em>";
+ $text_stack[0] .= $this->hashPart($span);
+ $em = '';
+ } else {
+ $text_stack[0] .= $token;
+ }
+ } else {
+ array_unshift($token_stack, $token);
+ array_unshift($text_stack, '');
+ $em = $token;
+ }
+ }
+ }
+ return $text_stack[0];
+ }
+
+ /**
+ * Parse Markdown blockquotes to HTML
+ * @param string $text
+ * @return string
+ */
+ protected function doBlockQuotes($text) {
+ $text = preg_replace_callback('/
+ ( # Wrap whole match in $1
+ (?>
+ ^[ ]*>[ ]? # ">" at the start of a line
+ .+\n # rest of the first line
+ (.+\n)* # subsequent consecutive lines
+ \n* # blanks
+ )+
+ )
+ /xm',
+ array($this, '_doBlockQuotes_callback'), $text);
+
+ return $text;
+ }
+
+ /**
+ * Blockquote parsing callback
+ * @param array $matches
+ * @return string
+ */
+ protected function _doBlockQuotes_callback($matches) {
+ $bq = $matches[1];
+ // trim one level of quoting - trim whitespace-only lines
+ $bq = preg_replace('/^[ ]*>[ ]?|^[ ]+$/m', '', $bq);
+ $bq = $this->runBlockGamut($bq); // recurse
+
+ $bq = preg_replace('/^/m', " ", $bq);
+ // These leading spaces cause problem with <pre> content,
+ // so we need to fix that:
+ $bq = preg_replace_callback('{(\s*<pre>.+?</pre>)}sx',
+ array($this, '_doBlockQuotes_callback2'), $bq);
+
+ return "\n" . $this->hashBlock("<blockquote>\n$bq\n</blockquote>") . "\n\n";
+ }
+
+ /**
+ * Blockquote parsing callback
+ * @param array $matches
+ * @return string
+ */
+ protected function _doBlockQuotes_callback2($matches) {
+ $pre = $matches[1];
+ $pre = preg_replace('/^ /m', '', $pre);
+ return $pre;
+ }
+
+ /**
+ * Parse paragraphs
+ *
+ * @param string $text String to process in paragraphs
+ * @param boolean $wrap_in_p Whether paragraphs should be wrapped in <p> tags
+ * @return string
+ */
+ protected function formParagraphs($text, $wrap_in_p = true) {
+ // Strip leading and trailing lines:
+ $text = preg_replace('/\A\n+|\n+\z/', '', $text);
+
+ $grafs = preg_split('/\n{2,}/', $text, -1, PREG_SPLIT_NO_EMPTY);
+
+ // Wrap <p> tags and unhashify HTML blocks
+ foreach ($grafs as $key => $value) {
+ if (!preg_match('/^B\x1A[0-9]+B$/', $value)) {
+ // Is a paragraph.
+ $value = $this->runSpanGamut($value);
+ if ($wrap_in_p) {
+ $value = preg_replace('/^([ ]*)/', "<p>", $value);
+ $value .= "</p>";
+ }
+ $grafs[$key] = $this->unhash($value);
+ } else {
+ // Is a block.
+ // Modify elements of @grafs in-place...
+ $graf = $value;
+ $block = $this->html_hashes[$graf];
+ $graf = $block;
+// if (preg_match('{
+// \A
+// ( # $1 = <div> tag
+// <div \s+
+// [^>]*
+// \b
+// markdown\s*=\s* ([\'"]) # $2 = attr quote char
+// 1
+// \2
+// [^>]*
+// >
+// )
+// ( # $3 = contents
+// .*
+// )
+// (</div>) # $4 = closing tag
+// \z
+// }xs', $block, $matches))
+// {
+// list(, $div_open, , $div_content, $div_close) = $matches;
+//
+// // We can't call Markdown(), because that resets the hash;
+// // that initialization code should be pulled into its own sub, though.
+// $div_content = $this->hashHTMLBlocks($div_content);
+//
+// // Run document gamut methods on the content.
+// foreach ($this->document_gamut as $method => $priority) {
+// $div_content = $this->$method($div_content);
+// }
+//
+// $div_open = preg_replace(
+// '{\smarkdown\s*=\s*([\'"]).+?\1}', '', $div_open);
+//
+// $graf = $div_open . "\n" . $div_content . "\n" . $div_close;
+// }
+ $grafs[$key] = $graf;
+ }
+ }
+
+ return implode("\n\n", $grafs);
+ }
+
+ /**
+ * Encode text for a double-quoted HTML attribute. This function
+ * is *not* suitable for attributes enclosed in single quotes.
+ * @param string $text
+ * @return string
+ */
+ protected function encodeAttribute($text) {
+ $text = $this->encodeAmpsAndAngles($text);
+ $text = str_replace('"', '&quot;', $text);
+ return $text;
+ }
+
+ /**
+ * Encode text for a double-quoted HTML attribute containing a URL,
+ * applying the URL filter if set. Also generates the textual
+ * representation for the URL (removing mailto: or tel:) storing it in $text.
+ * This function is *not* suitable for attributes enclosed in single quotes.
+ *
+ * @param string $url
+ * @param string &$text Passed by reference
+ * @return string URL
+ */
+ protected function encodeURLAttribute($url, &$text = null) {
+ if ($this->url_filter_func) {
+ $url = call_user_func($this->url_filter_func, $url);
+ }
+
+ if (preg_match('{^mailto:}i', $url)) {
+ $url = $this->encodeEntityObfuscatedAttribute($url, $text, 7);
+ } else if (preg_match('{^tel:}i', $url)) {
+ $url = $this->encodeAttribute($url);
+ $text = substr($url, 4);
+ } else {
+ $url = $this->encodeAttribute($url);
+ $text = $url;
+ }
+
+ return $url;
+ }
+
+ /**
+ * Smart processing for ampersands and angle brackets that need to
+ * be encoded. Valid character entities are left alone unless the
+ * no-entities mode is set.
+ * @param string $text
+ * @return string
+ */
+ protected function encodeAmpsAndAngles($text) {
+ if ($this->no_entities) {
+ $text = str_replace('&', '&amp;', $text);
+ } else {
+ // Ampersand-encoding based entirely on Nat Irons's Amputator
+ // MT plugin: <http://bumppo.net/projects/amputator/>
+ $text = preg_replace('/&(?!#?[xX]?(?:[0-9a-fA-F]+|\w+);)/',
+ '&amp;', $text);
+ }
+ // Encode remaining <'s
+ $text = str_replace('<', '&lt;', $text);
+
+ return $text;
+ }
+
+ /**
+ * Parse Markdown automatic links to anchor HTML tags
+ * @param string $text
+ * @return string
+ */
+ protected function doAutoLinks($text) {
+ $text = preg_replace_callback('{<((https?|ftp|dict|tel):[^\'">\s]+)>}i',
+ array($this, '_doAutoLinks_url_callback'), $text);
+
+ // Email addresses: <address@domain.foo>
+ $text = preg_replace_callback('{
+ <
+ (?:mailto:)?
+ (
+ (?:
+ [-!#$%&\'*+/=?^_`.{|}~\w\x80-\xFF]+
+ |
+ ".*?"
+ )
+ \@
+ (?:
+ [-a-z0-9\x80-\xFF]+(\.[-a-z0-9\x80-\xFF]+)*\.[a-z]+
+ |
+ \[[\d.a-fA-F:]+\] # IPv4 & IPv6
+ )
+ )
+ >
+ }xi',
+ array($this, '_doAutoLinks_email_callback'), $text);
+
+ return $text;
+ }
+
+ /**
+ * Parse URL callback
+ * @param array $matches
+ * @return string
+ */
+ protected function _doAutoLinks_url_callback($matches) {
+ $url = $this->encodeURLAttribute($matches[1], $text);
+ $link = "<a href=\"$url\">$text</a>";
+ return $this->hashPart($link);
+ }
+
+ /**
+ * Parse email address callback
+ * @param array $matches
+ * @return string
+ */
+ protected function _doAutoLinks_email_callback($matches) {
+ $addr = $matches[1];
+ $url = $this->encodeURLAttribute("mailto:$addr", $text);
+ $link = "<a href=\"$url\">$text</a>";
+ return $this->hashPart($link);
+ }
+
+ /**
+ * Input: some text to obfuscate, e.g. "mailto:foo@example.com"
+ *
+ * Output: the same text but with most characters encoded as either a
+ * decimal or hex entity, in the hopes of foiling most address
+ * harvesting spam bots. E.g.:
+ *
+ * &#109;&#x61;&#105;&#x6c;&#116;&#x6f;&#58;&#x66;o&#111;
+ * &#x40;&#101;&#x78;&#97;&#x6d;&#112;&#x6c;&#101;&#46;&#x63;&#111;
+ * &#x6d;
+ *
+ * Note: the additional output $tail is assigned the same value as the
+ * ouput, minus the number of characters specified by $head_length.
+ *
+ * Based by a filter by Matthew Wickline, posted to BBEdit-Talk.
+ * With some optimizations by Milian Wolff. Forced encoding of HTML
+ * attribute special characters by Allan Odgaard.
+ *
+ * @param string $text
+ * @param string &$tail
+ * @param integer $head_length
+ * @return string
+ */
+ protected function encodeEntityObfuscatedAttribute($text, &$tail = null, $head_length = 0) {
+ if ($text == "") {
+ return $tail = "";
+ }
+
+ $chars = preg_split('/(?<!^)(?!$)/', $text);
+ $seed = (int)abs(crc32($text) / strlen($text)); // Deterministic seed.
+
+ foreach ($chars as $key => $char) {
+ $ord = ord($char);
+ // Ignore non-ascii chars.
+ if ($ord < 128) {
+ $r = ($seed * (1 + $key)) % 100; // Pseudo-random function.
+ // roughly 10% raw, 45% hex, 45% dec
+ // '@' *must* be encoded. I insist.
+ // '"' and '>' have to be encoded inside the attribute
+ if ($r > 90 && strpos('@"&>', $char) === false) {
+ /* do nothing */
+ } else if ($r < 45) {
+ $chars[$key] = '&#x'.dechex($ord).';';
+ } else {
+ $chars[$key] = '&#'.$ord.';';
+ }
+ }
+ }
+
+ $text = implode('', $chars);
+ $tail = $head_length ? implode('', array_slice($chars, $head_length)) : $text;
+
+ return $text;
+ }
+
+ /**
+ * Take the string $str and parse it into tokens, hashing embeded HTML,
+ * escaped characters and handling code spans.
+ * @param string $str
+ * @return string
+ */
+ protected function parseSpan($str) {
+ $output = '';
+
+ $span_re = '{
+ (
+ \\\\'.$this->escape_chars_re.'
+ |
+ (?<![`\\\\])
+ `+ # code span marker
+ '.( $this->no_markup ? '' : '
+ |
+ <!-- .*? --> # comment
+ |
+ <\?.*?\?> | <%.*?%> # processing instruction
+ |
+ <[!$]?[-a-zA-Z0-9:_]+ # regular tags
+ (?>
+ \s
+ (?>[^"\'>]+|"[^"]*"|\'[^\']*\')*
+ )?
+ >
+ |
+ <[-a-zA-Z0-9:_]+\s*/> # xml-style empty tag
+ |
+ </[-a-zA-Z0-9:_]+\s*> # closing tag
+ ').'
+ )
+ }xs';
+
+ while (1) {
+ // Each loop iteration seach for either the next tag, the next
+ // openning code span marker, or the next escaped character.
+ // Each token is then passed to handleSpanToken.
+ $parts = preg_split($span_re, $str, 2, PREG_SPLIT_DELIM_CAPTURE);
+
+ // Create token from text preceding tag.
+ if ($parts[0] != "") {
+ $output .= $parts[0];
+ }
+
+ // Check if we reach the end.
+ if (isset($parts[1])) {
+ $output .= $this->handleSpanToken($parts[1], $parts[2]);
+ $str = $parts[2];
+ } else {
+ break;
+ }
+ }
+
+ return $output;
+ }
+
+ /**
+ * Handle $token provided by parseSpan by determining its nature and
+ * returning the corresponding value that should replace it.
+ * @param string $token
+ * @param string &$str
+ * @return string
+ */
+ protected function handleSpanToken($token, &$str) {
+ switch ($token{0}) {
+ case "\\":
+ return $this->hashPart("&#". ord($token{1}). ";");
+ case "`":
+ // Search for end marker in remaining text.
+ if (preg_match('/^(.*?[^`])'.preg_quote($token).'(?!`)(.*)$/sm',
+ $str, $matches))
+ {
+ $str = $matches[2];
+ $codespan = $this->makeCodeSpan($matches[1]);
+ return $this->hashPart($codespan);
+ }
+ return $token; // Return as text since no ending marker found.
+ default:
+ return $this->hashPart($token);
+ }
+ }
+
+ /**
+ * Remove one level of line-leading tabs or spaces
+ * @param string $text
+ * @return string
+ */
+ protected function outdent($text) {
+ return preg_replace('/^(\t|[ ]{1,' . $this->tab_width . '})/m', '', $text);
+ }
+
+
+ /**
+ * String length function for detab. `_initDetab` will create a function to
+ * handle UTF-8 if the default function does not exist.
+ * @var string
+ */
+ protected $utf8_strlen = 'mb_strlen';
+
+ /**
+ * Replace tabs with the appropriate amount of spaces.
+ *
+ * For each line we separate the line in blocks delemited by tab characters.
+ * Then we reconstruct every line by adding the appropriate number of space
+ * between each blocks.
+ *
+ * @param string $text
+ * @return string
+ */
+ protected function detab($text) {
+ $text = preg_replace_callback('/^.*\t.*$/m',
+ array($this, '_detab_callback'), $text);
+
+ return $text;
+ }
+
+ /**
+ * Replace tabs callback
+ * @param string $matches
+ * @return string
+ */
+ protected function _detab_callback($matches) {
+ $line = $matches[0];
+ $strlen = $this->utf8_strlen; // strlen function for UTF-8.
+
+ // Split in blocks.
+ $blocks = explode("\t", $line);
+ // Add each blocks to the line.
+ $line = $blocks[0];
+ unset($blocks[0]); // Do not add first block twice.
+ foreach ($blocks as $block) {
+ // Calculate amount of space, insert spaces, insert block.
+ $amount = $this->tab_width -
+ $strlen($line, 'UTF-8') % $this->tab_width;
+ $line .= str_repeat(" ", $amount) . $block;
+ }
+ return $line;
+ }
+
+ /**
+ * Check for the availability of the function in the `utf8_strlen` property
+ * (initially `mb_strlen`). If the function is not available, create a
+ * function that will loosely count the number of UTF-8 characters with a
+ * regular expression.
+ * @return void
+ */
+ protected function _initDetab() {
+
+ if (function_exists($this->utf8_strlen)) {
+ return;
+ }
+
+ $this->utf8_strlen = create_function('$text', 'return preg_match_all(
+ "/[\\\\x00-\\\\xBF]|[\\\\xC0-\\\\xFF][\\\\x80-\\\\xBF]*/",
+ $text, $m);');
+ }
+
+ /**
+ * Swap back in all the tags hashed by _HashHTMLBlocks.
+ * @param string $text
+ * @return string
+ */
+ protected function unhash($text) {
+ return preg_replace_callback('/(.)\x1A[0-9]+\1/',
+ array($this, '_unhash_callback'), $text);
+ }
+
+ /**
+ * Unhashing callback
+ * @param array $matches
+ * @return string
+ */
+ protected function _unhash_callback($matches) {
+ return $this->html_hashes[$matches[0]];
+ }
+}
diff --git a/vendor/michelf/php-markdown/Michelf/MarkdownExtra.inc.php b/vendor/michelf/php-markdown/Michelf/MarkdownExtra.inc.php
new file mode 100644
index 000000000..d09bd7a48
--- /dev/null
+++ b/vendor/michelf/php-markdown/Michelf/MarkdownExtra.inc.php
@@ -0,0 +1,11 @@
+<?php
+
+// Use this file if you cannot use class autoloading. It will include all the
+// files needed for the MarkdownExtra parser.
+//
+// Take a look at the PSR-0-compatible class autoloading implementation
+// in the Readme.php file if you want a simple autoloader setup.
+
+require_once dirname(__FILE__) . '/MarkdownInterface.php';
+require_once dirname(__FILE__) . '/Markdown.php';
+require_once dirname(__FILE__) . '/MarkdownExtra.php';
diff --git a/vendor/michelf/php-markdown/Michelf/MarkdownExtra.php b/vendor/michelf/php-markdown/Michelf/MarkdownExtra.php
new file mode 100644
index 000000000..ac6b1b4f2
--- /dev/null
+++ b/vendor/michelf/php-markdown/Michelf/MarkdownExtra.php
@@ -0,0 +1,1785 @@
+<?php
+/**
+ * Markdown Extra - A text-to-HTML conversion tool for web writers
+ *
+ * @package php-markdown
+ * @author Michel Fortin <michel.fortin@michelf.com>
+ * @copyright 2004-2016 Michel Fortin <https://michelf.com/projects/php-markdown/>
+ * @copyright (Original Markdown) 2004-2006 John Gruber <https://daringfireball.net/projects/markdown/>
+ */
+
+namespace Michelf;
+
+/**
+ * Markdown Extra Parser Class
+ */
+class MarkdownExtra extends \Michelf\Markdown {
+ /**
+ * Configuration variables
+ */
+
+ /**
+ * Prefix for footnote ids.
+ * @var string
+ */
+ public $fn_id_prefix = "";
+
+ /**
+ * Optional title attribute for footnote links and backlinks.
+ * @var string
+ */
+ public $fn_link_title = "";
+ public $fn_backlink_title = "";
+
+ /**
+ * Optional class attribute for footnote links and backlinks.
+ * @var string
+ */
+ public $fn_link_class = "footnote-ref";
+ public $fn_backlink_class = "footnote-backref";
+
+ /**
+ * Content to be displayed within footnote backlinks. The default is '↩';
+ * the U+FE0E on the end is a Unicode variant selector used to prevent iOS
+ * from displaying the arrow character as an emoji.
+ * @var string
+ */
+ public $fn_backlink_html = '&#8617;&#xFE0E;';
+
+ /**
+ * Class name for table cell alignment (%% replaced left/center/right)
+ * For instance: 'go-%%' becomes 'go-left' or 'go-right' or 'go-center'
+ * If empty, the align attribute is used instead of a class name.
+ * @var string
+ */
+ public $table_align_class_tmpl = '';
+
+ /**
+ * Optional class prefix for fenced code block.
+ * @var string
+ */
+ public $code_class_prefix = "";
+
+ /**
+ * Class attribute for code blocks goes on the `code` tag;
+ * setting this to true will put attributes on the `pre` tag instead.
+ * @var boolean
+ */
+ public $code_attr_on_pre = false;
+
+ /**
+ * Predefined abbreviations.
+ * @var array
+ */
+ public $predef_abbr = array();
+
+ /**
+ * Parser implementation
+ */
+
+ /**
+ * Constructor function. Initialize the parser object.
+ * @return void
+ */
+ public function __construct() {
+ // Add extra escapable characters before parent constructor
+ // initialize the table.
+ $this->escape_chars .= ':|';
+
+ // Insert extra document, block, and span transformations.
+ // Parent constructor will do the sorting.
+ $this->document_gamut += array(
+ "doFencedCodeBlocks" => 5,
+ "stripFootnotes" => 15,
+ "stripAbbreviations" => 25,
+ "appendFootnotes" => 50,
+ );
+ $this->block_gamut += array(
+ "doFencedCodeBlocks" => 5,
+ "doTables" => 15,
+ "doDefLists" => 45,
+ );
+ $this->span_gamut += array(
+ "doFootnotes" => 5,
+ "doAbbreviations" => 70,
+ );
+
+ $this->enhanced_ordered_list = true;
+ parent::__construct();
+ }
+
+
+ /**
+ * Extra variables used during extra transformations.
+ * @var array
+ */
+ protected $footnotes = array();
+ protected $footnotes_ordered = array();
+ protected $footnotes_ref_count = array();
+ protected $footnotes_numbers = array();
+ protected $abbr_desciptions = array();
+ /** @var @string */
+ protected $abbr_word_re = '';
+
+ /**
+ * Give the current footnote number.
+ * @var integer
+ */
+ protected $footnote_counter = 1;
+
+ /**
+ * Setting up Extra-specific variables.
+ */
+ protected function setup() {
+ parent::setup();
+
+ $this->footnotes = array();
+ $this->footnotes_ordered = array();
+ $this->footnotes_ref_count = array();
+ $this->footnotes_numbers = array();
+ $this->abbr_desciptions = array();
+ $this->abbr_word_re = '';
+ $this->footnote_counter = 1;
+
+ foreach ($this->predef_abbr as $abbr_word => $abbr_desc) {
+ if ($this->abbr_word_re)
+ $this->abbr_word_re .= '|';
+ $this->abbr_word_re .= preg_quote($abbr_word);
+ $this->abbr_desciptions[$abbr_word] = trim($abbr_desc);
+ }
+ }
+
+ /**
+ * Clearing Extra-specific variables.
+ */
+ protected function teardown() {
+ $this->footnotes = array();
+ $this->footnotes_ordered = array();
+ $this->footnotes_ref_count = array();
+ $this->footnotes_numbers = array();
+ $this->abbr_desciptions = array();
+ $this->abbr_word_re = '';
+
+ parent::teardown();
+ }
+
+
+ /**
+ * Extra attribute parser
+ */
+
+ /**
+ * Expression to use to catch attributes (includes the braces)
+ * @var string
+ */
+ protected $id_class_attr_catch_re = '\{((?>[ ]*[#.a-z][-_:a-zA-Z0-9=]+){1,})[ ]*\}';
+
+ /**
+ * Expression to use when parsing in a context when no capture is desired
+ * @var string
+ */
+ protected $id_class_attr_nocatch_re = '\{(?>[ ]*[#.a-z][-_:a-zA-Z0-9=]+){1,}[ ]*\}';
+
+ /**
+ * Parse attributes caught by the $this->id_class_attr_catch_re expression
+ * and return the HTML-formatted list of attributes.
+ *
+ * Currently supported attributes are .class and #id.
+ *
+ * In addition, this method also supports supplying a default Id value,
+ * which will be used to populate the id attribute in case it was not
+ * overridden.
+ * @param string $tag_name
+ * @param string $attr
+ * @param mixed $defaultIdValue
+ * @param array $classes
+ * @return string
+ */
+ protected function doExtraAttributes($tag_name, $attr, $defaultIdValue = null, $classes = array()) {
+ if (empty($attr) && !$defaultIdValue && empty($classes)) return "";
+
+ // Split on components
+ preg_match_all('/[#.a-z][-_:a-zA-Z0-9=]+/', $attr, $matches);
+ $elements = $matches[0];
+
+ // Handle classes and IDs (only first ID taken into account)
+ $attributes = array();
+ $id = false;
+ foreach ($elements as $element) {
+ if ($element{0} == '.') {
+ $classes[] = substr($element, 1);
+ } else if ($element{0} == '#') {
+ if ($id === false) $id = substr($element, 1);
+ } else if (strpos($element, '=') > 0) {
+ $parts = explode('=', $element, 2);
+ $attributes[] = $parts[0] . '="' . $parts[1] . '"';
+ }
+ }
+
+ if (!$id) $id = $defaultIdValue;
+
+ // Compose attributes as string
+ $attr_str = "";
+ if (!empty($id)) {
+ $attr_str .= ' id="'.$this->encodeAttribute($id) .'"';
+ }
+ if (!empty($classes)) {
+ $attr_str .= ' class="'. implode(" ", $classes) . '"';
+ }
+ if (!$this->no_markup && !empty($attributes)) {
+ $attr_str .= ' '.implode(" ", $attributes);
+ }
+ return $attr_str;
+ }
+
+ /**
+ * Strips link definitions from text, stores the URLs and titles in
+ * hash references.
+ * @param string $text
+ * @return string
+ */
+ protected function stripLinkDefinitions($text) {
+ $less_than_tab = $this->tab_width - 1;
+
+ // Link defs are in the form: ^[id]: url "optional title"
+ $text = preg_replace_callback('{
+ ^[ ]{0,'.$less_than_tab.'}\[(.+)\][ ]?: # id = $1
+ [ ]*
+ \n? # maybe *one* newline
+ [ ]*
+ (?:
+ <(.+?)> # url = $2
+ |
+ (\S+?) # url = $3
+ )
+ [ ]*
+ \n? # maybe one newline
+ [ ]*
+ (?:
+ (?<=\s) # lookbehind for whitespace
+ ["(]
+ (.*?) # title = $4
+ [")]
+ [ ]*
+ )? # title is optional
+ (?:[ ]* '.$this->id_class_attr_catch_re.' )? # $5 = extra id & class attr
+ (?:\n+|\Z)
+ }xm',
+ array($this, '_stripLinkDefinitions_callback'),
+ $text);
+ return $text;
+ }
+
+ /**
+ * Strip link definition callback
+ * @param array $matches
+ * @return string
+ */
+ protected function _stripLinkDefinitions_callback($matches) {
+ $link_id = strtolower($matches[1]);
+ $url = $matches[2] == '' ? $matches[3] : $matches[2];
+ $this->urls[$link_id] = $url;
+ $this->titles[$link_id] =& $matches[4];
+ $this->ref_attr[$link_id] = $this->doExtraAttributes("", $dummy =& $matches[5]);
+ return ''; // String that will replace the block
+ }
+
+
+ /**
+ * HTML block parser
+ */
+
+ /**
+ * Tags that are always treated as block tags
+ * @var string
+ */
+ protected $block_tags_re = 'p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|address|form|fieldset|iframe|hr|legend|article|section|nav|aside|hgroup|header|footer|figcaption|figure';
+
+ /**
+ * Tags treated as block tags only if the opening tag is alone on its line
+ * @var string
+ */
+ protected $context_block_tags_re = 'script|noscript|style|ins|del|iframe|object|source|track|param|math|svg|canvas|audio|video';
+
+ /**
+ * Tags where markdown="1" default to span mode:
+ * @var string
+ */
+ protected $contain_span_tags_re = 'p|h[1-6]|li|dd|dt|td|th|legend|address';
+
+ /**
+ * Tags which must not have their contents modified, no matter where
+ * they appear
+ * @var string
+ */
+ protected $clean_tags_re = 'script|style|math|svg';
+
+ /**
+ * Tags that do not need to be closed.
+ * @var string
+ */
+ protected $auto_close_tags_re = 'hr|img|param|source|track';
+
+ /**
+ * Hashify HTML Blocks and "clean tags".
+ *
+ * We only want to do this for block-level HTML tags, such as headers,
+ * lists, and tables. That's because we still want to wrap <p>s around
+ * "paragraphs" that are wrapped in non-block-level tags, such as anchors,
+ * phrase emphasis, and spans. The list of tags we're looking for is
+ * hard-coded.
+ *
+ * This works by calling _HashHTMLBlocks_InMarkdown, which then calls
+ * _HashHTMLBlocks_InHTML when it encounter block tags. When the markdown="1"
+ * attribute is found within a tag, _HashHTMLBlocks_InHTML calls back
+ * _HashHTMLBlocks_InMarkdown to handle the Markdown syntax within the tag.
+ * These two functions are calling each other. It's recursive!
+ * @param string $text
+ * @return string
+ */
+ protected function hashHTMLBlocks($text) {
+ if ($this->no_markup) {
+ return $text;
+ }
+
+ // Call the HTML-in-Markdown hasher.
+ list($text, ) = $this->_hashHTMLBlocks_inMarkdown($text);
+
+ return $text;
+ }
+
+ /**
+ * Parse markdown text, calling _HashHTMLBlocks_InHTML for block tags.
+ *
+ * * $indent is the number of space to be ignored when checking for code
+ * blocks. This is important because if we don't take the indent into
+ * account, something like this (which looks right) won't work as expected:
+ *
+ * <div>
+ * <div markdown="1">
+ * Hello World. <-- Is this a Markdown code block or text?
+ * </div> <-- Is this a Markdown code block or a real tag?
+ * <div>
+ *
+ * If you don't like this, just don't indent the tag on which
+ * you apply the markdown="1" attribute.
+ *
+ * * If $enclosing_tag_re is not empty, stops at the first unmatched closing
+ * tag with that name. Nested tags supported.
+ *
+ * * If $span is true, text inside must treated as span. So any double
+ * newline will be replaced by a single newline so that it does not create
+ * paragraphs.
+ *
+ * Returns an array of that form: ( processed text , remaining text )
+ *
+ * @param string $text
+ * @param integer $indent
+ * @param string $enclosing_tag_re
+ * @param boolean $span
+ * @return array
+ */
+ protected function _hashHTMLBlocks_inMarkdown($text, $indent = 0,
+ $enclosing_tag_re = '', $span = false)
+ {
+
+ if ($text === '') return array('', '');
+
+ // Regex to check for the presense of newlines around a block tag.
+ $newline_before_re = '/(?:^\n?|\n\n)*$/';
+ $newline_after_re =
+ '{
+ ^ # Start of text following the tag.
+ (?>[ ]*<!--.*?-->)? # Optional comment.
+ [ ]*\n # Must be followed by newline.
+ }xs';
+
+ // Regex to match any tag.
+ $block_tag_re =
+ '{
+ ( # $2: Capture whole tag.
+ </? # Any opening or closing tag.
+ (?> # Tag name.
+ ' . $this->block_tags_re . ' |
+ ' . $this->context_block_tags_re . ' |
+ ' . $this->clean_tags_re . ' |
+ (?!\s)'.$enclosing_tag_re . '
+ )
+ (?:
+ (?=[\s"\'/a-zA-Z0-9]) # Allowed characters after tag name.
+ (?>
+ ".*?" | # Double quotes (can contain `>`)
+ \'.*?\' | # Single quotes (can contain `>`)
+ .+? # Anything but quotes and `>`.
+ )*?
+ )?
+ > # End of tag.
+ |
+ <!-- .*? --> # HTML Comment
+ |
+ <\?.*?\?> | <%.*?%> # Processing instruction
+ |
+ <!\[CDATA\[.*?\]\]> # CData Block
+ ' . ( !$span ? ' # If not in span.
+ |
+ # Indented code block
+ (?: ^[ ]*\n | ^ | \n[ ]*\n )
+ [ ]{' . ($indent + 4) . '}[^\n]* \n
+ (?>
+ (?: [ ]{' . ($indent + 4) . '}[^\n]* | [ ]* ) \n
+ )*
+ |
+ # Fenced code block marker
+ (?<= ^ | \n )
+ [ ]{0,' . ($indent + 3) . '}(?:~{3,}|`{3,})
+ [ ]*
+ (?: \.?[-_:a-zA-Z0-9]+ )? # standalone class name
+ [ ]*
+ (?: ' . $this->id_class_attr_nocatch_re . ' )? # extra attributes
+ [ ]*
+ (?= \n )
+ ' : '' ) . ' # End (if not is span).
+ |
+ # Code span marker
+ # Note, this regex needs to go after backtick fenced
+ # code blocks but it should also be kept outside of the
+ # "if not in span" condition adding backticks to the parser
+ `+
+ )
+ }xs';
+
+
+ $depth = 0; // Current depth inside the tag tree.
+ $parsed = ""; // Parsed text that will be returned.
+
+ // Loop through every tag until we find the closing tag of the parent
+ // or loop until reaching the end of text if no parent tag specified.
+ do {
+ // Split the text using the first $tag_match pattern found.
+ // Text before pattern will be first in the array, text after
+ // pattern will be at the end, and between will be any catches made
+ // by the pattern.
+ $parts = preg_split($block_tag_re, $text, 2,
+ PREG_SPLIT_DELIM_CAPTURE);
+
+ // If in Markdown span mode, add a empty-string span-level hash
+ // after each newline to prevent triggering any block element.
+ if ($span) {
+ $void = $this->hashPart("", ':');
+ $newline = "\n$void";
+ $parts[0] = $void . str_replace("\n", $newline, $parts[0]) . $void;
+ }
+
+ $parsed .= $parts[0]; // Text before current tag.
+
+ // If end of $text has been reached. Stop loop.
+ if (count($parts) < 3) {
+ $text = "";
+ break;
+ }
+
+ $tag = $parts[1]; // Tag to handle.
+ $text = $parts[2]; // Remaining text after current tag.
+ $tag_re = preg_quote($tag); // For use in a regular expression.
+
+ // Check for: Fenced code block marker.
+ // Note: need to recheck the whole tag to disambiguate backtick
+ // fences from code spans
+ if (preg_match('{^\n?([ ]{0,' . ($indent + 3) . '})(~{3,}|`{3,})[ ]*(?:\.?[-_:a-zA-Z0-9]+)?[ ]*(?:' . $this->id_class_attr_nocatch_re . ')?[ ]*\n?$}', $tag, $capture)) {
+ // Fenced code block marker: find matching end marker.
+ $fence_indent = strlen($capture[1]); // use captured indent in re
+ $fence_re = $capture[2]; // use captured fence in re
+ if (preg_match('{^(?>.*\n)*?[ ]{' . ($fence_indent) . '}' . $fence_re . '[ ]*(?:\n|$)}', $text,
+ $matches))
+ {
+ // End marker found: pass text unchanged until marker.
+ $parsed .= $tag . $matches[0];
+ $text = substr($text, strlen($matches[0]));
+ }
+ else {
+ // No end marker: just skip it.
+ $parsed .= $tag;
+ }
+ }
+ // Check for: Indented code block.
+ else if ($tag{0} == "\n" || $tag{0} == " ") {
+ // Indented code block: pass it unchanged, will be handled
+ // later.
+ $parsed .= $tag;
+ }
+ // Check for: Code span marker
+ // Note: need to check this after backtick fenced code blocks
+ else if ($tag{0} == "`") {
+ // Find corresponding end marker.
+ $tag_re = preg_quote($tag);
+ if (preg_match('{^(?>.+?|\n(?!\n))*?(?<!`)' . $tag_re . '(?!`)}',
+ $text, $matches))
+ {
+ // End marker found: pass text unchanged until marker.
+ $parsed .= $tag . $matches[0];
+ $text = substr($text, strlen($matches[0]));
+ }
+ else {
+ // Unmatched marker: just skip it.
+ $parsed .= $tag;
+ }
+ }
+ // Check for: Opening Block level tag or
+ // Opening Context Block tag (like ins and del)
+ // used as a block tag (tag is alone on it's line).
+ else if (preg_match('{^<(?:' . $this->block_tags_re . ')\b}', $tag) ||
+ ( preg_match('{^<(?:' . $this->context_block_tags_re . ')\b}', $tag) &&
+ preg_match($newline_before_re, $parsed) &&
+ preg_match($newline_after_re, $text) )
+ )
+ {
+ // Need to parse tag and following text using the HTML parser.
+ list($block_text, $text) =
+ $this->_hashHTMLBlocks_inHTML($tag . $text, "hashBlock", true);
+
+ // Make sure it stays outside of any paragraph by adding newlines.
+ $parsed .= "\n\n$block_text\n\n";
+ }
+ // Check for: Clean tag (like script, math)
+ // HTML Comments, processing instructions.
+ else if (preg_match('{^<(?:' . $this->clean_tags_re . ')\b}', $tag) ||
+ $tag{1} == '!' || $tag{1} == '?')
+ {
+ // Need to parse tag and following text using the HTML parser.
+ // (don't check for markdown attribute)
+ list($block_text, $text) =
+ $this->_hashHTMLBlocks_inHTML($tag . $text, "hashClean", false);
+
+ $parsed .= $block_text;
+ }
+ // Check for: Tag with same name as enclosing tag.
+ else if ($enclosing_tag_re !== '' &&
+ // Same name as enclosing tag.
+ preg_match('{^</?(?:' . $enclosing_tag_re . ')\b}', $tag))
+ {
+ // Increase/decrease nested tag count.
+ if ($tag{1} == '/') $depth--;
+ else if ($tag{strlen($tag)-2} != '/') $depth++;
+
+ if ($depth < 0) {
+ // Going out of parent element. Clean up and break so we
+ // return to the calling function.
+ $text = $tag . $text;
+ break;
+ }
+
+ $parsed .= $tag;
+ }
+ else {
+ $parsed .= $tag;
+ }
+ } while ($depth >= 0);
+
+ return array($parsed, $text);
+ }
+
+ /**
+ * Parse HTML, calling _HashHTMLBlocks_InMarkdown for block tags.
+ *
+ * * Calls $hash_method to convert any blocks.
+ * * Stops when the first opening tag closes.
+ * * $md_attr indicate if the use of the `markdown="1"` attribute is allowed.
+ * (it is not inside clean tags)
+ *
+ * Returns an array of that form: ( processed text , remaining text )
+ * @param string $text
+ * @param string $hash_method
+ * @param string $md_attr
+ * @return array
+ */
+ protected function _hashHTMLBlocks_inHTML($text, $hash_method, $md_attr) {
+ if ($text === '') return array('', '');
+
+ // Regex to match `markdown` attribute inside of a tag.
+ $markdown_attr_re = '
+ {
+ \s* # Eat whitespace before the `markdown` attribute
+ markdown
+ \s*=\s*
+ (?>
+ (["\']) # $1: quote delimiter
+ (.*?) # $2: attribute value
+ \1 # matching delimiter
+ |
+ ([^\s>]*) # $3: unquoted attribute value
+ )
+ () # $4: make $3 always defined (avoid warnings)
+ }xs';
+
+ // Regex to match any tag.
+ $tag_re = '{
+ ( # $2: Capture whole tag.
+ </? # Any opening or closing tag.
+ [\w:$]+ # Tag name.
+ (?:
+ (?=[\s"\'/a-zA-Z0-9]) # Allowed characters after tag name.
+ (?>
+ ".*?" | # Double quotes (can contain `>`)
+ \'.*?\' | # Single quotes (can contain `>`)
+ .+? # Anything but quotes and `>`.
+ )*?
+ )?
+ > # End of tag.
+ |
+ <!-- .*? --> # HTML Comment
+ |
+ <\?.*?\?> | <%.*?%> # Processing instruction
+ |
+ <!\[CDATA\[.*?\]\]> # CData Block
+ )
+ }xs';
+
+ $original_text = $text; // Save original text in case of faliure.
+
+ $depth = 0; // Current depth inside the tag tree.
+ $block_text = ""; // Temporary text holder for current text.
+ $parsed = ""; // Parsed text that will be returned.
+
+ // Get the name of the starting tag.
+ // (This pattern makes $base_tag_name_re safe without quoting.)
+ if (preg_match('/^<([\w:$]*)\b/', $text, $matches))
+ $base_tag_name_re = $matches[1];
+
+ // Loop through every tag until we find the corresponding closing tag.
+ do {
+ // Split the text using the first $tag_match pattern found.
+ // Text before pattern will be first in the array, text after
+ // pattern will be at the end, and between will be any catches made
+ // by the pattern.
+ $parts = preg_split($tag_re, $text, 2, PREG_SPLIT_DELIM_CAPTURE);
+
+ if (count($parts) < 3) {
+ // End of $text reached with unbalenced tag(s).
+ // In that case, we return original text unchanged and pass the
+ // first character as filtered to prevent an infinite loop in the
+ // parent function.
+ return array($original_text{0}, substr($original_text, 1));
+ }
+
+ $block_text .= $parts[0]; // Text before current tag.
+ $tag = $parts[1]; // Tag to handle.
+ $text = $parts[2]; // Remaining text after current tag.
+
+ // Check for: Auto-close tag (like <hr/>)
+ // Comments and Processing Instructions.
+ if (preg_match('{^</?(?:' . $this->auto_close_tags_re . ')\b}', $tag) ||
+ $tag{1} == '!' || $tag{1} == '?')
+ {
+ // Just add the tag to the block as if it was text.
+ $block_text .= $tag;
+ }
+ else {
+ // Increase/decrease nested tag count. Only do so if
+ // the tag's name match base tag's.
+ if (preg_match('{^</?' . $base_tag_name_re . '\b}', $tag)) {
+ if ($tag{1} == '/') $depth--;
+ else if ($tag{strlen($tag)-2} != '/') $depth++;
+ }
+
+ // Check for `markdown="1"` attribute and handle it.
+ if ($md_attr &&
+ preg_match($markdown_attr_re, $tag, $attr_m) &&
+ preg_match('/^1|block|span$/', $attr_m[2] . $attr_m[3]))
+ {
+ // Remove `markdown` attribute from opening tag.
+ $tag = preg_replace($markdown_attr_re, '', $tag);
+
+ // Check if text inside this tag must be parsed in span mode.
+ $this->mode = $attr_m[2] . $attr_m[3];
+ $span_mode = $this->mode == 'span' || $this->mode != 'block' &&
+ preg_match('{^<(?:' . $this->contain_span_tags_re . ')\b}', $tag);
+
+ // Calculate indent before tag.
+ if (preg_match('/(?:^|\n)( *?)(?! ).*?$/', $block_text, $matches)) {
+ $strlen = $this->utf8_strlen;
+ $indent = $strlen($matches[1], 'UTF-8');
+ } else {
+ $indent = 0;
+ }
+
+ // End preceding block with this tag.
+ $block_text .= $tag;
+ $parsed .= $this->$hash_method($block_text);
+
+ // Get enclosing tag name for the ParseMarkdown function.
+ // (This pattern makes $tag_name_re safe without quoting.)
+ preg_match('/^<([\w:$]*)\b/', $tag, $matches);
+ $tag_name_re = $matches[1];
+
+ // Parse the content using the HTML-in-Markdown parser.
+ list ($block_text, $text)
+ = $this->_hashHTMLBlocks_inMarkdown($text, $indent,
+ $tag_name_re, $span_mode);
+
+ // Outdent markdown text.
+ if ($indent > 0) {
+ $block_text = preg_replace("/^[ ]{1,$indent}/m", "",
+ $block_text);
+ }
+
+ // Append tag content to parsed text.
+ if (!$span_mode) $parsed .= "\n\n$block_text\n\n";
+ else $parsed .= "$block_text";
+
+ // Start over with a new block.
+ $block_text = "";
+ }
+ else $block_text .= $tag;
+ }
+
+ } while ($depth > 0);
+
+ // Hash last block text that wasn't processed inside the loop.
+ $parsed .= $this->$hash_method($block_text);
+
+ return array($parsed, $text);
+ }
+
+ /**
+ * Called whenever a tag must be hashed when a function inserts a "clean" tag
+ * in $text, it passes through this function and is automaticaly escaped,
+ * blocking invalid nested overlap.
+ * @param string $text
+ * @return string
+ */
+ protected function hashClean($text) {
+ return $this->hashPart($text, 'C');
+ }
+
+ /**
+ * Turn Markdown link shortcuts into XHTML <a> tags.
+ * @param string $text
+ * @return string
+ */
+ protected function doAnchors($text) {
+ if ($this->in_anchor) {
+ return $text;
+ }
+ $this->in_anchor = true;
+
+ // First, handle reference-style links: [link text] [id]
+ $text = preg_replace_callback('{
+ ( # wrap whole match in $1
+ \[
+ (' . $this->nested_brackets_re . ') # link text = $2
+ \]
+
+ [ ]? # one optional space
+ (?:\n[ ]*)? # one optional newline followed by spaces
+
+ \[
+ (.*?) # id = $3
+ \]
+ )
+ }xs',
+ array($this, '_doAnchors_reference_callback'), $text);
+
+ // Next, inline-style links: [link text](url "optional title")
+ $text = preg_replace_callback('{
+ ( # wrap whole match in $1
+ \[
+ (' . $this->nested_brackets_re . ') # link text = $2
+ \]
+ \( # literal paren
+ [ \n]*
+ (?:
+ <(.+?)> # href = $3
+ |
+ (' . $this->nested_url_parenthesis_re . ') # href = $4
+ )
+ [ \n]*
+ ( # $5
+ ([\'"]) # quote char = $6
+ (.*?) # Title = $7
+ \6 # matching quote
+ [ \n]* # ignore any spaces/tabs between closing quote and )
+ )? # title is optional
+ \)
+ (?:[ ]? ' . $this->id_class_attr_catch_re . ' )? # $8 = id/class attributes
+ )
+ }xs',
+ array($this, '_doAnchors_inline_callback'), $text);
+
+ // Last, handle reference-style shortcuts: [link text]
+ // These must come last in case you've also got [link text][1]
+ // or [link text](/foo)
+ $text = preg_replace_callback('{
+ ( # wrap whole match in $1
+ \[
+ ([^\[\]]+) # link text = $2; can\'t contain [ or ]
+ \]
+ )
+ }xs',
+ array($this, '_doAnchors_reference_callback'), $text);
+
+ $this->in_anchor = false;
+ return $text;
+ }
+
+ /**
+ * Callback for reference anchors
+ * @param array $matches
+ * @return string
+ */
+ protected function _doAnchors_reference_callback($matches) {
+ $whole_match = $matches[1];
+ $link_text = $matches[2];
+ $link_id =& $matches[3];
+
+ if ($link_id == "") {
+ // for shortcut links like [this][] or [this].
+ $link_id = $link_text;
+ }
+
+ // lower-case and turn embedded newlines into spaces
+ $link_id = strtolower($link_id);
+ $link_id = preg_replace('{[ ]?\n}', ' ', $link_id);
+
+ if (isset($this->urls[$link_id])) {
+ $url = $this->urls[$link_id];
+ $url = $this->encodeURLAttribute($url);
+
+ $result = "<a href=\"$url\"";
+ if ( isset( $this->titles[$link_id] ) ) {
+ $title = $this->titles[$link_id];
+ $title = $this->encodeAttribute($title);
+ $result .= " title=\"$title\"";
+ }
+ if (isset($this->ref_attr[$link_id]))
+ $result .= $this->ref_attr[$link_id];
+
+ $link_text = $this->runSpanGamut($link_text);
+ $result .= ">$link_text</a>";
+ $result = $this->hashPart($result);
+ }
+ else {
+ $result = $whole_match;
+ }
+ return $result;
+ }
+
+ /**
+ * Callback for inline anchors
+ * @param array $matches
+ * @return string
+ */
+ protected function _doAnchors_inline_callback($matches) {
+ $whole_match = $matches[1];
+ $link_text = $this->runSpanGamut($matches[2]);
+ $url = $matches[3] == '' ? $matches[4] : $matches[3];
+ $title =& $matches[7];
+ $attr = $this->doExtraAttributes("a", $dummy =& $matches[8]);
+
+ // if the URL was of the form <s p a c e s> it got caught by the HTML
+ // tag parser and hashed. Need to reverse the process before using the URL.
+ $unhashed = $this->unhash($url);
+ if ($unhashed != $url)
+ $url = preg_replace('/^<(.*)>$/', '\1', $unhashed);
+
+ $url = $this->encodeURLAttribute($url);
+
+ $result = "<a href=\"$url\"";
+ if (isset($title)) {
+ $title = $this->encodeAttribute($title);
+ $result .= " title=\"$title\"";
+ }
+ $result .= $attr;
+
+ $link_text = $this->runSpanGamut($link_text);
+ $result .= ">$link_text</a>";
+
+ return $this->hashPart($result);
+ }
+
+ /**
+ * Turn Markdown image shortcuts into <img> tags.
+ * @param string $text
+ * @return string
+ */
+ protected function doImages($text) {
+ // First, handle reference-style labeled images: ![alt text][id]
+ $text = preg_replace_callback('{
+ ( # wrap whole match in $1
+ !\[
+ (' . $this->nested_brackets_re . ') # alt text = $2
+ \]
+
+ [ ]? # one optional space
+ (?:\n[ ]*)? # one optional newline followed by spaces
+
+ \[
+ (.*?) # id = $3
+ \]
+
+ )
+ }xs',
+ array($this, '_doImages_reference_callback'), $text);
+
+ // Next, handle inline images: ![alt text](url "optional title")
+ // Don't forget: encode * and _
+ $text = preg_replace_callback('{
+ ( # wrap whole match in $1
+ !\[
+ (' . $this->nested_brackets_re . ') # alt text = $2
+ \]
+ \s? # One optional whitespace character
+ \( # literal paren
+ [ \n]*
+ (?:
+ <(\S*)> # src url = $3
+ |
+ (' . $this->nested_url_parenthesis_re . ') # src url = $4
+ )
+ [ \n]*
+ ( # $5
+ ([\'"]) # quote char = $6
+ (.*?) # title = $7
+ \6 # matching quote
+ [ \n]*
+ )? # title is optional
+ \)
+ (?:[ ]? ' . $this->id_class_attr_catch_re . ' )? # $8 = id/class attributes
+ )
+ }xs',
+ array($this, '_doImages_inline_callback'), $text);
+
+ return $text;
+ }
+
+ /**
+ * Callback for referenced images
+ * @param array $matches
+ * @return string
+ */
+ protected function _doImages_reference_callback($matches) {
+ $whole_match = $matches[1];
+ $alt_text = $matches[2];
+ $link_id = strtolower($matches[3]);
+
+ if ($link_id == "") {
+ $link_id = strtolower($alt_text); // for shortcut links like ![this][].
+ }
+
+ $alt_text = $this->encodeAttribute($alt_text);
+ if (isset($this->urls[$link_id])) {
+ $url = $this->encodeURLAttribute($this->urls[$link_id]);
+ $result = "<img src=\"$url\" alt=\"$alt_text\"";
+ if (isset($this->titles[$link_id])) {
+ $title = $this->titles[$link_id];
+ $title = $this->encodeAttribute($title);
+ $result .= " title=\"$title\"";
+ }
+ if (isset($this->ref_attr[$link_id]))
+ $result .= $this->ref_attr[$link_id];
+ $result .= $this->empty_element_suffix;
+ $result = $this->hashPart($result);
+ }
+ else {
+ // If there's no such link ID, leave intact:
+ $result = $whole_match;
+ }
+
+ return $result;
+ }
+
+ /**
+ * Callback for inline images
+ * @param array $matches
+ * @return string
+ */
+ protected function _doImages_inline_callback($matches) {
+ $whole_match = $matches[1];
+ $alt_text = $matches[2];
+ $url = $matches[3] == '' ? $matches[4] : $matches[3];
+ $title =& $matches[7];
+ $attr = $this->doExtraAttributes("img", $dummy =& $matches[8]);
+
+ $alt_text = $this->encodeAttribute($alt_text);
+ $url = $this->encodeURLAttribute($url);
+ $result = "<img src=\"$url\" alt=\"$alt_text\"";
+ if (isset($title)) {
+ $title = $this->encodeAttribute($title);
+ $result .= " title=\"$title\""; // $title already quoted
+ }
+ $result .= $attr;
+ $result .= $this->empty_element_suffix;
+
+ return $this->hashPart($result);
+ }
+
+ /**
+ * Process markdown headers. Redefined to add ID and class attribute support.
+ * @param string $text
+ * @return string
+ */
+ protected function doHeaders($text) {
+ // Setext-style headers:
+ // Header 1 {#header1}
+ // ========
+ //
+ // Header 2 {#header2 .class1 .class2}
+ // --------
+ //
+ $text = preg_replace_callback(
+ '{
+ (^.+?) # $1: Header text
+ (?:[ ]+ ' . $this->id_class_attr_catch_re . ' )? # $3 = id/class attributes
+ [ ]*\n(=+|-+)[ ]*\n+ # $3: Header footer
+ }mx',
+ array($this, '_doHeaders_callback_setext'), $text);
+
+ // atx-style headers:
+ // # Header 1 {#header1}
+ // ## Header 2 {#header2}
+ // ## Header 2 with closing hashes ## {#header3.class1.class2}
+ // ...
+ // ###### Header 6 {.class2}
+ //
+ $text = preg_replace_callback('{
+ ^(\#{1,6}) # $1 = string of #\'s
+ [ ]*
+ (.+?) # $2 = Header text
+ [ ]*
+ \#* # optional closing #\'s (not counted)
+ (?:[ ]+ ' . $this->id_class_attr_catch_re . ' )? # $3 = id/class attributes
+ [ ]*
+ \n+
+ }xm',
+ array($this, '_doHeaders_callback_atx'), $text);
+
+ return $text;
+ }
+
+ /**
+ * Callback for setext headers
+ * @param array $matches
+ * @return string
+ */
+ protected function _doHeaders_callback_setext($matches) {
+ if ($matches[3] == '-' && preg_match('{^- }', $matches[1])) {
+ return $matches[0];
+ }
+
+ $level = $matches[3]{0} == '=' ? 1 : 2;
+
+ $defaultId = is_callable($this->header_id_func) ? call_user_func($this->header_id_func, $matches[1]) : null;
+
+ $attr = $this->doExtraAttributes("h$level", $dummy =& $matches[2], $defaultId);
+ $block = "<h$level$attr>" . $this->runSpanGamut($matches[1]) . "</h$level>";
+ return "\n" . $this->hashBlock($block) . "\n\n";
+ }
+
+ /**
+ * Callback for atx headers
+ * @param array $matches
+ * @return string
+ */
+ protected function _doHeaders_callback_atx($matches) {
+ $level = strlen($matches[1]);
+
+ $defaultId = is_callable($this->header_id_func) ? call_user_func($this->header_id_func, $matches[2]) : null;
+ $attr = $this->doExtraAttributes("h$level", $dummy =& $matches[3], $defaultId);
+ $block = "<h$level$attr>" . $this->runSpanGamut($matches[2]) . "</h$level>";
+ return "\n" . $this->hashBlock($block) . "\n\n";
+ }
+
+ /**
+ * Form HTML tables.
+ * @param string $text
+ * @return string
+ */
+ protected function doTables($text) {
+ $less_than_tab = $this->tab_width - 1;
+ // Find tables with leading pipe.
+ //
+ // | Header 1 | Header 2
+ // | -------- | --------
+ // | Cell 1 | Cell 2
+ // | Cell 3 | Cell 4
+ $text = preg_replace_callback('
+ {
+ ^ # Start of a line
+ [ ]{0,' . $less_than_tab . '} # Allowed whitespace.
+ [|] # Optional leading pipe (present)
+ (.+) \n # $1: Header row (at least one pipe)
+
+ [ ]{0,' . $less_than_tab . '} # Allowed whitespace.
+ [|] ([ ]*[-:]+[-| :]*) \n # $2: Header underline
+
+ ( # $3: Cells
+ (?>
+ [ ]* # Allowed whitespace.
+ [|] .* \n # Row content.
+ )*
+ )
+ (?=\n|\Z) # Stop at final double newline.
+ }xm',
+ array($this, '_doTable_leadingPipe_callback'), $text);
+
+ // Find tables without leading pipe.
+ //
+ // Header 1 | Header 2
+ // -------- | --------
+ // Cell 1 | Cell 2
+ // Cell 3 | Cell 4
+ $text = preg_replace_callback('
+ {
+ ^ # Start of a line
+ [ ]{0,' . $less_than_tab . '} # Allowed whitespace.
+ (\S.*[|].*) \n # $1: Header row (at least one pipe)
+
+ [ ]{0,' . $less_than_tab . '} # Allowed whitespace.
+ ([-:]+[ ]*[|][-| :]*) \n # $2: Header underline
+
+ ( # $3: Cells
+ (?>
+ .* [|] .* \n # Row content
+ )*
+ )
+ (?=\n|\Z) # Stop at final double newline.
+ }xm',
+ array($this, '_DoTable_callback'), $text);
+
+ return $text;
+ }
+
+ /**
+ * Callback for removing the leading pipe for each row
+ * @param array $matches
+ * @return string
+ */
+ protected function _doTable_leadingPipe_callback($matches) {
+ $head = $matches[1];
+ $underline = $matches[2];
+ $content = $matches[3];
+
+ $content = preg_replace('/^ *[|]/m', '', $content);
+
+ return $this->_doTable_callback(array($matches[0], $head, $underline, $content));
+ }
+
+ /**
+ * Make the align attribute in a table
+ * @param string $alignname
+ * @return string
+ */
+ protected function _doTable_makeAlignAttr($alignname)
+ {
+ if (empty($this->table_align_class_tmpl)) {
+ return " align=\"$alignname\"";
+ }
+
+ $classname = str_replace('%%', $alignname, $this->table_align_class_tmpl);
+ return " class=\"$classname\"";
+ }
+
+ /**
+ * Calback for processing tables
+ * @param array $matches
+ * @return string
+ */
+ protected function _doTable_callback($matches) {
+ $head = $matches[1];
+ $underline = $matches[2];
+ $content = $matches[3];
+
+ // Remove any tailing pipes for each line.
+ $head = preg_replace('/[|] *$/m', '', $head);
+ $underline = preg_replace('/[|] *$/m', '', $underline);
+ $content = preg_replace('/[|] *$/m', '', $content);
+
+ // Reading alignement from header underline.
+ $separators = preg_split('/ *[|] */', $underline);
+ foreach ($separators as $n => $s) {
+ if (preg_match('/^ *-+: *$/', $s))
+ $attr[$n] = $this->_doTable_makeAlignAttr('right');
+ else if (preg_match('/^ *:-+: *$/', $s))
+ $attr[$n] = $this->_doTable_makeAlignAttr('center');
+ else if (preg_match('/^ *:-+ *$/', $s))
+ $attr[$n] = $this->_doTable_makeAlignAttr('left');
+ else
+ $attr[$n] = '';
+ }
+
+ // Parsing span elements, including code spans, character escapes,
+ // and inline HTML tags, so that pipes inside those gets ignored.
+ $head = $this->parseSpan($head);
+ $headers = preg_split('/ *[|] */', $head);
+ $col_count = count($headers);
+ $attr = array_pad($attr, $col_count, '');
+
+ // Write column headers.
+ $text = "<table>\n";
+ $text .= "<thead>\n";
+ $text .= "<tr>\n";
+ foreach ($headers as $n => $header)
+ $text .= " <th$attr[$n]>" . $this->runSpanGamut(trim($header)) . "</th>\n";
+ $text .= "</tr>\n";
+ $text .= "</thead>\n";
+
+ // Split content by row.
+ $rows = explode("\n", trim($content, "\n"));
+
+ $text .= "<tbody>\n";
+ foreach ($rows as $row) {
+ // Parsing span elements, including code spans, character escapes,
+ // and inline HTML tags, so that pipes inside those gets ignored.
+ $row = $this->parseSpan($row);
+
+ // Split row by cell.
+ $row_cells = preg_split('/ *[|] */', $row, $col_count);
+ $row_cells = array_pad($row_cells, $col_count, '');
+
+ $text .= "<tr>\n";
+ foreach ($row_cells as $n => $cell)
+ $text .= " <td$attr[$n]>" . $this->runSpanGamut(trim($cell)) . "</td>\n";
+ $text .= "</tr>\n";
+ }
+ $text .= "</tbody>\n";
+ $text .= "</table>";
+
+ return $this->hashBlock($text) . "\n";
+ }
+
+ /**
+ * Form HTML definition lists.
+ * @param string $text
+ * @return string
+ */
+ protected function doDefLists($text) {
+ $less_than_tab = $this->tab_width - 1;
+
+ // Re-usable pattern to match any entire dl list:
+ $whole_list_re = '(?>
+ ( # $1 = whole list
+ ( # $2
+ [ ]{0,' . $less_than_tab . '}
+ ((?>.*\S.*\n)+) # $3 = defined term
+ \n?
+ [ ]{0,' . $less_than_tab . '}:[ ]+ # colon starting definition
+ )
+ (?s:.+?)
+ ( # $4
+ \z
+ |
+ \n{2,}
+ (?=\S)
+ (?! # Negative lookahead for another term
+ [ ]{0,' . $less_than_tab . '}
+ (?: \S.*\n )+? # defined term
+ \n?
+ [ ]{0,' . $less_than_tab . '}:[ ]+ # colon starting definition
+ )
+ (?! # Negative lookahead for another definition
+ [ ]{0,' . $less_than_tab . '}:[ ]+ # colon starting definition
+ )
+ )
+ )
+ )'; // mx
+
+ $text = preg_replace_callback('{
+ (?>\A\n?|(?<=\n\n))
+ ' . $whole_list_re . '
+ }mx',
+ array($this, '_doDefLists_callback'), $text);
+
+ return $text;
+ }
+
+ /**
+ * Callback for processing definition lists
+ * @param array $matches
+ * @return string
+ */
+ protected function _doDefLists_callback($matches) {
+ // Re-usable patterns to match list item bullets and number markers:
+ $list = $matches[1];
+
+ // Turn double returns into triple returns, so that we can make a
+ // paragraph for the last item in a list, if necessary:
+ $result = trim($this->processDefListItems($list));
+ $result = "<dl>\n" . $result . "\n</dl>";
+ return $this->hashBlock($result) . "\n\n";
+ }
+
+ /**
+ * Process the contents of a single definition list, splitting it
+ * into individual term and definition list items.
+ * @param string $list_str
+ * @return string
+ */
+ protected function processDefListItems($list_str) {
+
+ $less_than_tab = $this->tab_width - 1;
+
+ // Trim trailing blank lines:
+ $list_str = preg_replace("/\n{2,}\\z/", "\n", $list_str);
+
+ // Process definition terms.
+ $list_str = preg_replace_callback('{
+ (?>\A\n?|\n\n+) # leading line
+ ( # definition terms = $1
+ [ ]{0,' . $less_than_tab . '} # leading whitespace
+ (?!\:[ ]|[ ]) # negative lookahead for a definition
+ # mark (colon) or more whitespace.
+ (?> \S.* \n)+? # actual term (not whitespace).
+ )
+ (?=\n?[ ]{0,3}:[ ]) # lookahead for following line feed
+ # with a definition mark.
+ }xm',
+ array($this, '_processDefListItems_callback_dt'), $list_str);
+
+ // Process actual definitions.
+ $list_str = preg_replace_callback('{
+ \n(\n+)? # leading line = $1
+ ( # marker space = $2
+ [ ]{0,' . $less_than_tab . '} # whitespace before colon
+ \:[ ]+ # definition mark (colon)
+ )
+ ((?s:.+?)) # definition text = $3
+ (?= \n+ # stop at next definition mark,
+ (?: # next term or end of text
+ [ ]{0,' . $less_than_tab . '} \:[ ] |
+ <dt> | \z
+ )
+ )
+ }xm',
+ array($this, '_processDefListItems_callback_dd'), $list_str);
+
+ return $list_str;
+ }
+
+ /**
+ * Callback for <dt> elements in definition lists
+ * @param array $matches
+ * @return string
+ */
+ protected function _processDefListItems_callback_dt($matches) {
+ $terms = explode("\n", trim($matches[1]));
+ $text = '';
+ foreach ($terms as $term) {
+ $term = $this->runSpanGamut(trim($term));
+ $text .= "\n<dt>" . $term . "</dt>";
+ }
+ return $text . "\n";
+ }
+
+ /**
+ * Callback for <dd> elements in definition lists
+ * @param array $matches
+ * @return string
+ */
+ protected function _processDefListItems_callback_dd($matches) {
+ $leading_line = $matches[1];
+ $marker_space = $matches[2];
+ $def = $matches[3];
+
+ if ($leading_line || preg_match('/\n{2,}/', $def)) {
+ // Replace marker with the appropriate whitespace indentation
+ $def = str_repeat(' ', strlen($marker_space)) . $def;
+ $def = $this->runBlockGamut($this->outdent($def . "\n\n"));
+ $def = "\n". $def ."\n";
+ }
+ else {
+ $def = rtrim($def);
+ $def = $this->runSpanGamut($this->outdent($def));
+ }
+
+ return "\n<dd>" . $def . "</dd>\n";
+ }
+
+ /**
+ * Adding the fenced code block syntax to regular Markdown:
+ *
+ * ~~~
+ * Code block
+ * ~~~
+ *
+ * @param string $text
+ * @return string
+ */
+ protected function doFencedCodeBlocks($text) {
+
+ $less_than_tab = $this->tab_width;
+
+ $text = preg_replace_callback('{
+ (?:\n|\A)
+ # 1: Opening marker
+ (
+ (?:~{3,}|`{3,}) # 3 or more tildes/backticks.
+ )
+ [ ]*
+ (?:
+ \.?([-_:a-zA-Z0-9]+) # 2: standalone class name
+ )?
+ [ ]*
+ (?:
+ ' . $this->id_class_attr_catch_re . ' # 3: Extra attributes
+ )?
+ [ ]* \n # Whitespace and newline following marker.
+
+ # 4: Content
+ (
+ (?>
+ (?!\1 [ ]* \n) # Not a closing marker.
+ .*\n+
+ )+
+ )
+
+ # Closing marker.
+ \1 [ ]* (?= \n )
+ }xm',
+ array($this, '_doFencedCodeBlocks_callback'), $text);
+
+ return $text;
+ }
+
+ /**
+ * Callback to process fenced code blocks
+ * @param array $matches
+ * @return string
+ */
+ protected function _doFencedCodeBlocks_callback($matches) {
+ $classname =& $matches[2];
+ $attrs =& $matches[3];
+ $codeblock = $matches[4];
+
+ if ($this->code_block_content_func) {
+ $codeblock = call_user_func($this->code_block_content_func, $codeblock, $classname);
+ } else {
+ $codeblock = htmlspecialchars($codeblock, ENT_NOQUOTES);
+ }
+
+ $codeblock = preg_replace_callback('/^\n+/',
+ array($this, '_doFencedCodeBlocks_newlines'), $codeblock);
+
+ $classes = array();
+ if ($classname != "") {
+ if ($classname{0} == '.')
+ $classname = substr($classname, 1);
+ $classes[] = $this->code_class_prefix . $classname;
+ }
+ $attr_str = $this->doExtraAttributes($this->code_attr_on_pre ? "pre" : "code", $attrs, null, $classes);
+ $pre_attr_str = $this->code_attr_on_pre ? $attr_str : '';
+ $code_attr_str = $this->code_attr_on_pre ? '' : $attr_str;
+ $codeblock = "<pre$pre_attr_str><code$code_attr_str>$codeblock</code></pre>";
+
+ return "\n\n".$this->hashBlock($codeblock)."\n\n";
+ }
+
+ /**
+ * Replace new lines in fenced code blocks
+ * @param array $matches
+ * @return string
+ */
+ protected function _doFencedCodeBlocks_newlines($matches) {
+ return str_repeat("<br$this->empty_element_suffix",
+ strlen($matches[0]));
+ }
+
+ /**
+ * Redefining emphasis markers so that emphasis by underscore does not
+ * work in the middle of a word.
+ * @var array
+ */
+ protected $em_relist = array(
+ '' => '(?:(?<!\*)\*(?!\*)|(?<![a-zA-Z0-9_])_(?!_))(?![\.,:;]?\s)',
+ '*' => '(?<![\s*])\*(?!\*)',
+ '_' => '(?<![\s_])_(?![a-zA-Z0-9_])',
+ );
+ protected $strong_relist = array(
+ '' => '(?:(?<!\*)\*\*(?!\*)|(?<![a-zA-Z0-9_])__(?!_))(?![\.,:;]?\s)',
+ '**' => '(?<![\s*])\*\*(?!\*)',
+ '__' => '(?<![\s_])__(?![a-zA-Z0-9_])',
+ );
+ protected $em_strong_relist = array(
+ '' => '(?:(?<!\*)\*\*\*(?!\*)|(?<![a-zA-Z0-9_])___(?!_))(?![\.,:;]?\s)',
+ '***' => '(?<![\s*])\*\*\*(?!\*)',
+ '___' => '(?<![\s_])___(?![a-zA-Z0-9_])',
+ );
+
+ /**
+ * Parse text into paragraphs
+ * @param string $text String to process in paragraphs
+ * @param boolean $wrap_in_p Whether paragraphs should be wrapped in <p> tags
+ * @return string HTML output
+ */
+ protected function formParagraphs($text, $wrap_in_p = true) {
+ // Strip leading and trailing lines:
+ $text = preg_replace('/\A\n+|\n+\z/', '', $text);
+
+ $grafs = preg_split('/\n{2,}/', $text, -1, PREG_SPLIT_NO_EMPTY);
+
+ // Wrap <p> tags and unhashify HTML blocks
+ foreach ($grafs as $key => $value) {
+ $value = trim($this->runSpanGamut($value));
+
+ // Check if this should be enclosed in a paragraph.
+ // Clean tag hashes & block tag hashes are left alone.
+ $is_p = $wrap_in_p && !preg_match('/^B\x1A[0-9]+B|^C\x1A[0-9]+C$/', $value);
+
+ if ($is_p) {
+ $value = "<p>$value</p>";
+ }
+ $grafs[$key] = $value;
+ }
+
+ // Join grafs in one text, then unhash HTML tags.
+ $text = implode("\n\n", $grafs);
+
+ // Finish by removing any tag hashes still present in $text.
+ $text = $this->unhash($text);
+
+ return $text;
+ }
+
+
+ /**
+ * Footnotes - Strips link definitions from text, stores the URLs and
+ * titles in hash references.
+ * @param string $text
+ * @return string
+ */
+ protected function stripFootnotes($text) {
+ $less_than_tab = $this->tab_width - 1;
+
+ // Link defs are in the form: [^id]: url "optional title"
+ $text = preg_replace_callback('{
+ ^[ ]{0,' . $less_than_tab . '}\[\^(.+?)\][ ]?: # note_id = $1
+ [ ]*
+ \n? # maybe *one* newline
+ ( # text = $2 (no blank lines allowed)
+ (?:
+ .+ # actual text
+ |
+ \n # newlines but
+ (?!\[.+?\][ ]?:\s)# negative lookahead for footnote or link definition marker.
+ (?!\n+[ ]{0,3}\S)# ensure line is not blank and followed
+ # by non-indented content
+ )*
+ )
+ }xm',
+ array($this, '_stripFootnotes_callback'),
+ $text);
+ return $text;
+ }
+
+ /**
+ * Callback for stripping footnotes
+ * @param array $matches
+ * @return string
+ */
+ protected function _stripFootnotes_callback($matches) {
+ $note_id = $this->fn_id_prefix . $matches[1];
+ $this->footnotes[$note_id] = $this->outdent($matches[2]);
+ return ''; // String that will replace the block
+ }
+
+ /**
+ * Replace footnote references in $text [^id] with a special text-token
+ * which will be replaced by the actual footnote marker in appendFootnotes.
+ * @param string $text
+ * @return string
+ */
+ protected function doFootnotes($text) {
+ if (!$this->in_anchor) {
+ $text = preg_replace('{\[\^(.+?)\]}', "F\x1Afn:\\1\x1A:", $text);
+ }
+ return $text;
+ }
+
+ /**
+ * Append footnote list to text
+ * @param string $text
+ * @return string
+ */
+ protected function appendFootnotes($text) {
+ $text = preg_replace_callback('{F\x1Afn:(.*?)\x1A:}',
+ array($this, '_appendFootnotes_callback'), $text);
+
+ if (!empty($this->footnotes_ordered)) {
+ $text .= "\n\n";
+ $text .= "<div class=\"footnotes\">\n";
+ $text .= "<hr" . $this->empty_element_suffix . "\n";
+ $text .= "<ol>\n\n";
+
+ $attr = "";
+ if ($this->fn_backlink_class != "") {
+ $class = $this->fn_backlink_class;
+ $class = $this->encodeAttribute($class);
+ $attr .= " class=\"$class\"";
+ }
+ if ($this->fn_backlink_title != "") {
+ $title = $this->fn_backlink_title;
+ $title = $this->encodeAttribute($title);
+ $attr .= " title=\"$title\"";
+ }
+ $backlink_text = $this->fn_backlink_html;
+ $num = 0;
+
+ while (!empty($this->footnotes_ordered)) {
+ $footnote = reset($this->footnotes_ordered);
+ $note_id = key($this->footnotes_ordered);
+ unset($this->footnotes_ordered[$note_id]);
+ $ref_count = $this->footnotes_ref_count[$note_id];
+ unset($this->footnotes_ref_count[$note_id]);
+ unset($this->footnotes[$note_id]);
+
+ $footnote .= "\n"; // Need to append newline before parsing.
+ $footnote = $this->runBlockGamut("$footnote\n");
+ $footnote = preg_replace_callback('{F\x1Afn:(.*?)\x1A:}',
+ array($this, '_appendFootnotes_callback'), $footnote);
+
+ $attr = str_replace("%%", ++$num, $attr);
+ $note_id = $this->encodeAttribute($note_id);
+
+ // Prepare backlink, multiple backlinks if multiple references
+ $backlink = "<a href=\"#fnref:$note_id\"$attr>$backlink_text</a>";
+ for ($ref_num = 2; $ref_num <= $ref_count; ++$ref_num) {
+ $backlink .= " <a href=\"#fnref$ref_num:$note_id\"$attr>$backlink_text</a>";
+ }
+ // Add backlink to last paragraph; create new paragraph if needed.
+ if (preg_match('{</p>$}', $footnote)) {
+ $footnote = substr($footnote, 0, -4) . "&#160;$backlink</p>";
+ } else {
+ $footnote .= "\n\n<p>$backlink</p>";
+ }
+
+ $text .= "<li id=\"fn:$note_id\">\n";
+ $text .= $footnote . "\n";
+ $text .= "</li>\n\n";
+ }
+
+ $text .= "</ol>\n";
+ $text .= "</div>";
+ }
+ return $text;
+ }
+
+ /**
+ * Callback for appending footnotes
+ * @param array $matches
+ * @return string
+ */
+ protected function _appendFootnotes_callback($matches) {
+ $node_id = $this->fn_id_prefix . $matches[1];
+
+ // Create footnote marker only if it has a corresponding footnote *and*
+ // the footnote hasn't been used by another marker.
+ if (isset($this->footnotes[$node_id])) {
+ $num =& $this->footnotes_numbers[$node_id];
+ if (!isset($num)) {
+ // Transfer footnote content to the ordered list and give it its
+ // number
+ $this->footnotes_ordered[$node_id] = $this->footnotes[$node_id];
+ $this->footnotes_ref_count[$node_id] = 1;
+ $num = $this->footnote_counter++;
+ $ref_count_mark = '';
+ } else {
+ $ref_count_mark = $this->footnotes_ref_count[$node_id] += 1;
+ }
+
+ $attr = "";
+ if ($this->fn_link_class != "") {
+ $class = $this->fn_link_class;
+ $class = $this->encodeAttribute($class);
+ $attr .= " class=\"$class\"";
+ }
+ if ($this->fn_link_title != "") {
+ $title = $this->fn_link_title;
+ $title = $this->encodeAttribute($title);
+ $attr .= " title=\"$title\"";
+ }
+
+ $attr = str_replace("%%", $num, $attr);
+ $node_id = $this->encodeAttribute($node_id);
+
+ return
+ "<sup id=\"fnref$ref_count_mark:$node_id\">".
+ "<a href=\"#fn:$node_id\"$attr>$num</a>".
+ "</sup>";
+ }
+
+ return "[^" . $matches[1] . "]";
+ }
+
+
+ /**
+ * Abbreviations - strips abbreviations from text, stores titles in hash
+ * references.
+ * @param string $text
+ * @return string
+ */
+ protected function stripAbbreviations($text) {
+ $less_than_tab = $this->tab_width - 1;
+
+ // Link defs are in the form: [id]*: url "optional title"
+ $text = preg_replace_callback('{
+ ^[ ]{0,' . $less_than_tab . '}\*\[(.+?)\][ ]?: # abbr_id = $1
+ (.*) # text = $2 (no blank lines allowed)
+ }xm',
+ array($this, '_stripAbbreviations_callback'),
+ $text);
+ return $text;
+ }
+
+ /**
+ * Callback for stripping abbreviations
+ * @param array $matches
+ * @return string
+ */
+ protected function _stripAbbreviations_callback($matches) {
+ $abbr_word = $matches[1];
+ $abbr_desc = $matches[2];
+ if ($this->abbr_word_re) {
+ $this->abbr_word_re .= '|';
+ }
+ $this->abbr_word_re .= preg_quote($abbr_word);
+ $this->abbr_desciptions[$abbr_word] = trim($abbr_desc);
+ return ''; // String that will replace the block
+ }
+
+ /**
+ * Find defined abbreviations in text and wrap them in <abbr> elements.
+ * @param string $text
+ * @return string
+ */
+ protected function doAbbreviations($text) {
+ if ($this->abbr_word_re) {
+ // cannot use the /x modifier because abbr_word_re may
+ // contain significant spaces:
+ $text = preg_replace_callback('{' .
+ '(?<![\w\x1A])' .
+ '(?:' . $this->abbr_word_re . ')' .
+ '(?![\w\x1A])' .
+ '}',
+ array($this, '_doAbbreviations_callback'), $text);
+ }
+ return $text;
+ }
+
+ /**
+ * Callback for processing abbreviations
+ * @param array $matches
+ * @return string
+ */
+ protected function _doAbbreviations_callback($matches) {
+ $abbr = $matches[0];
+ if (isset($this->abbr_desciptions[$abbr])) {
+ $desc = $this->abbr_desciptions[$abbr];
+ if (empty($desc)) {
+ return $this->hashPart("<abbr>$abbr</abbr>");
+ } else {
+ $desc = $this->encodeAttribute($desc);
+ return $this->hashPart("<abbr title=\"$desc\">$abbr</abbr>");
+ }
+ } else {
+ return $matches[0];
+ }
+ }
+}
diff --git a/vendor/michelf/php-markdown/Michelf/MarkdownInterface.inc.php b/vendor/michelf/php-markdown/Michelf/MarkdownInterface.inc.php
new file mode 100644
index 000000000..c4e9ac7f6
--- /dev/null
+++ b/vendor/michelf/php-markdown/Michelf/MarkdownInterface.inc.php
@@ -0,0 +1,9 @@
+<?php
+
+// Use this file if you cannot use class autoloading. It will include all the
+// files needed for the MarkdownInterface interface.
+//
+// Take a look at the PSR-0-compatible class autoloading implementation
+// in the Readme.php file if you want a simple autoloader setup.
+
+require_once dirname(__FILE__) . '/MarkdownInterface.php';
diff --git a/vendor/michelf/php-markdown/Michelf/MarkdownInterface.php b/vendor/michelf/php-markdown/Michelf/MarkdownInterface.php
new file mode 100644
index 000000000..8512e3753
--- /dev/null
+++ b/vendor/michelf/php-markdown/Michelf/MarkdownInterface.php
@@ -0,0 +1,38 @@
+<?php
+/**
+ * Markdown - A text-to-HTML conversion tool for web writers
+ *
+ * @package php-markdown
+ * @author Michel Fortin <michel.fortin@michelf.com>
+ * @copyright 2004-2016 Michel Fortin <https://michelf.com/projects/php-markdown/>
+ * @copyright (Original Markdown) 2004-2006 John Gruber <https://daringfireball.net/projects/markdown/>
+ */
+
+namespace Michelf;
+
+/**
+ * Markdown Parser Interface
+ */
+interface MarkdownInterface {
+ /**
+ * Initialize the parser and return the result of its transform method.
+ * This will work fine for derived classes too.
+ *
+ * @api
+ *
+ * @param string $text
+ * @return string
+ */
+ public static function defaultTransform($text);
+
+ /**
+ * Main function. Performs some preprocessing on the input text
+ * and pass it through the document gamut.
+ *
+ * @api
+ *
+ * @param string $text
+ * @return string
+ */
+ public function transform($text);
+}
diff --git a/vendor/michelf/php-markdown/Readme.md b/vendor/michelf/php-markdown/Readme.md
new file mode 100644
index 000000000..044407106
--- /dev/null
+++ b/vendor/michelf/php-markdown/Readme.md
@@ -0,0 +1,384 @@
+PHP Markdown
+============
+
+PHP Markdown Lib 1.7.0 - 29 Oct 2016
+
+by Michel Fortin
+<https://michelf.ca/>
+
+based on Markdown by John Gruber
+<https://daringfireball.net/>
+
+
+Introduction
+------------
+
+This is a library package that includes the PHP Markdown parser and its
+sibling PHP Markdown Extra with additional features.
+
+Markdown is a text-to-HTML conversion tool for web writers. Markdown
+allows you to write using an easy-to-read, easy-to-write plain text
+format, then convert it to structurally valid XHTML (or HTML).
+
+"Markdown" is actually two things: a plain text markup syntax, and a
+software tool, originally written in Perl, that converts the plain text
+markup to HTML. PHP Markdown is a port to PHP of the original Markdown
+program by John Gruber.
+
+* [Full documentation of the Markdown syntax](<https://daringfireball.net/projects/markdown/>)
+ — Daring Fireball (John Gruber)
+* [Markdown Extra syntax additions](<https://michelf.ca/projects/php-markdown/extra/>)
+ — Michel Fortin
+
+
+Requirement
+-----------
+
+This library package requires PHP 5.3 or later.
+
+Note: The older plugin/library hybrid package for PHP Markdown and
+PHP Markdown Extra is still maintained and will work with PHP 4.0.5 and later.
+
+Before PHP 5.3.7, pcre.backtrack_limit defaults to 100 000, which is too small
+in many situations. You might need to set it to higher values. Later PHP
+releases defaults to 1 000 000, which is usually fine.
+
+
+Usage
+-----
+
+This library package is meant to be used with class autoloading. For autoloading
+to work, your project needs have setup a PSR-0-compatible autoloader. See the
+included Readme.php file for a minimal autoloader setup. (If you cannot use
+autoloading, see below.)
+
+With class autoloading in place, putting the 'Michelf' folder in your
+include path should be enough for this to work:
+
+ use \Michelf\Markdown;
+ $my_html = Markdown::defaultTransform($my_text);
+
+Markdown Extra syntax is also available the same way:
+
+ use \Michelf\MarkdownExtra;
+ $my_html = MarkdownExtra::defaultTransform($my_text);
+
+If you wish to use PHP Markdown with another text filter function
+built to parse HTML, you should filter the text *after* the `transform`
+function call. This is an example with [PHP SmartyPants][psp]:
+
+ use \Michelf\Markdown, \Michelf\SmartyPants;
+ $my_html = Markdown::defaultTransform($my_text);
+ $my_html = SmartyPants::defaultTransform($my_html);
+
+All these examples are using the static `defaultTransform` static function
+found inside the parser class. If you want to customize the parser
+configuration, you can also instantiate it directly and change some
+configuration variables:
+
+ use \Michelf\MarkdownExtra;
+ $parser = new MarkdownExtra;
+ $parser->fn_id_prefix = "post22-";
+ $my_html = $parser->transform($my_text);
+
+To learn more, see the full list of [configuration variables].
+
+ [configuration variables]: https://michelf.ca/projects/php-markdown/configuration/
+
+
+### Usage without an autoloader
+
+If you cannot use class autoloading, you can still use `include` or `require`
+to access the parser. To load the `\Michelf\Markdown` parser, do it this way:
+
+ require_once 'Michelf/Markdown.inc.php';
+
+Or, if you need the `\Michelf\MarkdownExtra` parser:
+
+ require_once 'Michelf/MarkdownExtra.inc.php';
+
+While the plain `.php` files depend on autoloading to work correctly, using the
+`.inc.php` files instead will eagerly load the dependencies that would be
+loaded on demand if you were using autoloading.
+
+
+Public API and Versioning Policy
+---------------------------------
+
+Version numbers are of the form *major*.*minor*.*patch*.
+
+The public API of PHP Markdown consist of the two parser classes `Markdown`
+and `MarkdownExtra`, their constructors, the `transform` and `defaultTransform`
+functions and their configuration variables. The public API is stable for
+a given major version number. It might get additions when the minor version
+number increments.
+
+**Protected members are not considered public API.** This is unconventional
+and deserves an explanation. Incrementing the major version number every time
+the underlying implementation of something changes is going to give
+nonessential version numbers for the vast majority of people who just use the
+parser. Protected members are meant to create parser subclasses that behave in
+different ways. Very few people create parser subclasses. I don't want to
+discourage it by making everything private, but at the same time I can't
+guarantee any stable hook between versions if you use protected members.
+
+**Syntax changes** will increment the minor number for new features, and the
+patch number for small corrections. A *new feature* is something that needs a
+change in the syntax documentation. Note that since PHP Markdown Lib includes
+two parsers, a syntax change for either of them will increment the minor
+number. Also note that there is nothing perfectly backward-compatible with the
+Markdown syntax: all inputs are always valid, so new features always replace
+something that was previously legal, although generally nonsensical to do.
+
+
+Bugs
+----
+
+To file bug reports please send email to:
+<michel.fortin@michelf.ca>
+
+Please include with your report: (1) the example input; (2) the output you
+expected; (3) the output PHP Markdown actually produced.
+
+If you have a problem where Markdown gives you an empty result, first check
+that the backtrack limit is not too low by running `php --info | grep pcre`.
+See Installation and Requirement above for details.
+
+
+Development and Testing
+-----------------------
+
+Pull requests for fixing bugs are welcome. Proposed new features are
+going to be meticulously reviewed -- taking into account backward compatibility,
+potential side effects, and future extensibility -- before deciding on
+acceptance or rejection.
+
+If you make a pull request that includes changes to the parser please add
+tests for what is being changed to [MDTest][] and make a pull request there
+too.
+
+ [MDTest]: https://github.com/michelf/mdtest/
+
+
+Donations
+---------
+
+If you wish to make a donation that will help me devote more time to
+PHP Markdown, please visit [michelf.ca/donate] or send Bitcoin to
+[1HiuX34czvVPPdhXbUAsAu7pZcesniDCGH].
+
+ [michelf.ca/donate]: https://michelf.ca/donate/#!Thanks%20for%20PHP%20Markdown
+ [1HiuX34czvVPPdhXbUAsAu7pZcesniDCGH]: bitcoin:1HiuX34czvVPPdhXbUAsAu7pZcesniDCGH
+
+
+Version History
+---------------
+
+PHP Markdown Lib 1.7.0 (29 Oct 2016)
+
+* Added a `hard_wrap` configuration variable to make all newline characters
+ in the text become `<br>` tags in the HTML output. By default, according
+ to the standard Markdown syntax these newlines are ignored unless they a
+ preceded by two spaces. Thanks to Jonathan Cohlmeyer for the implementation.
+
+* Improved the parsing of list items to fix problematic cases that came to
+ light with the addition of `hard_wrap`. This should have no effect on the
+ output except span-level list items that ended with two spaces (and thus
+ ended with a line break).
+
+* Added a `code_span_content_func` configuration variable which takes a
+ function that will convert the content of the code span to HTML. This can
+ be useful to implement syntax highlighting. Although contrary to its
+ code block equivalent, there is no syntax for specifying a language.
+ Credits to styxit for the implementation.
+
+* Fixed a Markdwon Extra issue where two-space-at-end-of-line hard breaks
+ wouldn't work inside of HTML block elements such as `<p markdown="1">`
+ where the element expects only span-level content.
+
+* In the parser code, switched to PHPDoc comment format. Thanks to
+ Robbie Averill for the help.
+
+
+PHP Markdown Lib 1.6.0 (23 Dec 2015)
+
+Note: this version was incorrectly released as 1.5.1 on Dec 22, a number
+that contradicted the versioning policy.
+
+* For fenced code blocks in Markdown Extra, can now set a class name for the
+ code block's language before the special attribute block. Previously, this
+ class name was only allowed in the absence of the special attribute block.
+
+* Added a `code_block_content_func` configuration variable which takes a
+ function that will convert the content of the code block to HTML. This is
+ most useful for syntax highlighting. For fenced code blocks in Markdown
+ Extra, the function has access to the language class name (the one outside
+ of the special attribute block). Credits to Mario Konrad for providing the
+ implementation.
+
+* The curled arrow character for the backlink in footnotes is now followed
+ by a Unicode variant selector to prevent it from being displayed in emoji
+ form on iOS.
+
+ Note that in older browsers the variant selector is often interpreted as a
+ separate character, making it visible after the arrow. So there is now a
+ also a `fn_backlink_html` configuration variable that can be used to set
+ the link text to something else. Credits to Dana for providing the
+ implementation.
+
+* Fixed an issue in MarkdownExtra where long header lines followed by a
+ special attribute block would hit the backtrack limit an cause an empty
+ string to be returned.
+
+
+PHP Markdown Lib 1.5.0 (1 Mar 2015)
+
+* Added the ability start ordered lists with a number different from 1 and
+ and have that reflected in the HTML output. This can be enabled with
+ the `enhanced_ordered_lists` configuration variable for the Markdown
+ parser; it is enabled by default for Markdown Extra.
+ Credits to Matt Gorle for providing the implementation.
+
+* Added the ability to insert custom HTML attributes with simple values
+ everywhere an extra attribute block is allowed (links, images, headers).
+ The value must be unquoted, cannot contains spaces and is limited to
+ alphanumeric ASCII characters.
+ Credits to Peter Droogmans for providing the implementation.
+
+* Added a `header_id_func` configuration variable which takes a function
+ that can generate an `id` attribute value from the header text.
+ Credits to Evert Pot for providing the implementation.
+
+* Added a `url_filter_func` configuration variable which takes a function
+ that can rewrite any link or image URL to something different.
+
+
+PHP Markdown Lib 1.4.1 (4 May 2014)
+
+* The HTML block parser will now treat `<figure>` as a block-level element
+ (as it should) and no longer wrap it in `<p>` or parse it's content with
+ the as Markdown syntax (although with Extra you can use `markdown="1"`
+ if you wish to use the Markdown syntax inside it).
+
+* The content of `<style>` elements will now be left alone, its content
+ won't be interpreted as Markdown.
+
+* Corrected an bug where some inline links with spaces in them would not
+ work even when surounded with angle brackets:
+
+ [link](<s p a c e s>)
+
+* Fixed an issue where email addresses with quotes in them would not always
+ have the quotes escaped in the link attribute, causing broken links (and
+ invalid HTML).
+
+* Fixed the case were a link definition following a footnote definition would
+ be swallowed by the footnote unless it was separated by a blank line.
+
+
+PHP Markdown Lib 1.4.0 (29 Nov 2013)
+
+* Added support for the `tel:` URL scheme in automatic links.
+
+ <tel:+1-111-111-1111>
+
+ It gets converted to this (note the `tel:` prefix becomes invisible):
+
+ <a href="tel:+1-111-111-1111">+1-111-111-1111</a>
+
+* Added backtick fenced code blocks to MarkdownExtra, originally from
+ Github-Flavored Markdown.
+
+* Added an interface called MarkdownInterface implemented by both
+ the Markdown and MarkdownExtra parsers. You can use the interface if
+ you want to create a mockup parser object for unit testing.
+
+* For those of you who cannot use class autoloading, you can now
+ include `Michelf/Markdown.inc.php` or `Michelf/MarkdownExtra.inc.php` (note
+ the `.inc.php` extension) to automatically include other files required
+ by the parser.
+
+
+PHP Markdown Lib 1.3 (11 Apr 2013)
+
+This is the first release of PHP Markdown Lib. This package requires PHP
+version 5.3 or later and is designed to work with PSR-0 autoloading and,
+optionally with Composer. Here is a list of the changes since
+PHP Markdown Extra 1.2.6:
+
+* Plugin interface for WordPress and other systems is no longer present in
+ the Lib package. The classic package is still available if you need it:
+ <https://michelf.ca/projects/php-markdown/classic/>
+
+* Added `public` and `protected` protection attributes, plus a section about
+ what is "public API" and what isn't in the Readme file.
+
+* Changed HTML output for footnotes: now instead of adding `rel` and `rev`
+ attributes, footnotes links have the class name `footnote-ref` and
+ backlinks `footnote-backref`.
+
+* Fixed some regular expressions to make PCRE not shout warnings about POSIX
+ collation classes (dependent on your version of PCRE).
+
+* Added optional class and id attributes to images and links using the same
+ syntax as for headers:
+
+ [link](url){#id .class}
+ ![img](url){#id .class}
+
+ It work too for reference-style links and images. In this case you need
+ to put those attributes at the reference definition:
+
+ [link][linkref] or [linkref]
+ ![img][linkref]
+
+ [linkref]: url "optional title" {#id .class}
+
+* Fixed a PHP notice message triggered when some table column separator
+ markers are missing on the separator line below column headers.
+
+* Fixed a small mistake that could cause the parser to retain an invalid
+ state related to parsing links across multiple runs. This was never
+ observed (that I know of), but it's still worth fixing.
+
+
+Copyright and License
+---------------------
+
+PHP Markdown Lib
+Copyright (c) 2004-2016 Michel Fortin
+<https://michelf.ca/>
+All rights reserved.
+
+Based on Markdown
+Copyright (c) 2003-2005 John Gruber
+<https://daringfireball.net/>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the
+ distribution.
+
+* Neither the name "Markdown" nor the names of its contributors may
+ be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+This software is provided by the copyright holders and contributors "as
+is" and any express or implied warranties, including, but not limited
+to, the implied warranties of merchantability and fitness for a
+particular purpose are disclaimed. In no event shall the copyright owner
+or contributors be liable for any direct, indirect, incidental, special,
+exemplary, or consequential damages (including, but not limited to,
+procurement of substitute goods or services; loss of use, data, or
+profits; or business interruption) however caused and on any theory of
+liability, whether in contract, strict liability, or tort (including
+negligence or otherwise) arising in any way out of the use of this
+software, even if advised of the possibility of such damage.
diff --git a/vendor/michelf/php-markdown/Readme.php b/vendor/michelf/php-markdown/Readme.php
new file mode 100644
index 000000000..89449dea4
--- /dev/null
+++ b/vendor/michelf/php-markdown/Readme.php
@@ -0,0 +1,31 @@
+<?php
+
+// This file passes the content of the Readme.md file in the same directory
+// through the Markdown filter. You can adapt this sample code in any way
+// you like.
+
+// Install PSR-0-compatible class autoloader
+spl_autoload_register(function($class){
+ require preg_replace('{\\\\|_(?!.*\\\\)}', DIRECTORY_SEPARATOR, ltrim($class, '\\')).'.php';
+});
+
+// Get Markdown class
+use \Michelf\Markdown;
+
+// Read file and pass content through the Markdown parser
+$text = file_get_contents('Readme.md');
+$html = Markdown::defaultTransform($text);
+
+?>
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>PHP Markdown Lib - Readme</title>
+ </head>
+ <body>
+ <?php
+ // Put HTML content in the document
+ echo $html;
+ ?>
+ </body>
+</html>
diff --git a/vendor/michelf/php-markdown/composer.json b/vendor/michelf/php-markdown/composer.json
new file mode 100644
index 000000000..36a4f744a
--- /dev/null
+++ b/vendor/michelf/php-markdown/composer.json
@@ -0,0 +1,31 @@
+{
+ "name": "michelf/php-markdown",
+ "type": "library",
+ "description": "PHP Markdown",
+ "homepage": "https://michelf.ca/projects/php-markdown/",
+ "keywords": ["markdown"],
+ "license": "BSD-3-Clause",
+ "authors": [
+ {
+ "name": "Michel Fortin",
+ "email": "michel.fortin@michelf.ca",
+ "homepage": "https://michelf.ca/",
+ "role": "Developer"
+ },
+ {
+ "name": "John Gruber",
+ "homepage": "https://daringfireball.net/"
+ }
+ ],
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "autoload": {
+ "psr-0": { "Michelf": "" }
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-lib": "1.4.x-dev"
+ }
+ }
+}
diff --git a/vendor/pixel418/markdownify/CHANGELOG.md b/vendor/pixel418/markdownify/CHANGELOG.md
new file mode 100644
index 000000000..a0900fdf5
--- /dev/null
+++ b/vendor/pixel418/markdownify/CHANGELOG.md
@@ -0,0 +1,76 @@
+CHANGELOG
+==============
+
+
+21/09/2016 v2.2.1
+--------------
+
+ * Fix: Moving trailing whitespace from inline elements outside of the element
+ * Feature: Use PSR-4
+ * Feature: PHP 7.0 support in continuous integration
+ * Doc: Update of the README
+
+
+07/09/2016 v2.2.0
+--------------
+
+ * Fix: Reset state between each parsing
+
+
+19/02/2016 v2.1.11
+--------------
+
+ * Fix: Empty table cell conversion
+
+
+10/02/2016 v2.1.10
+--------------
+
+ * Fix: Handle nested table.
+
+
+01/04/2015 v2.1.9
+--------------
+
+ * Fix: Handle HTML breaks & spaces in a less destructive way.
+
+
+26/03/2015 v2.1.8
+--------------
+
+ * Fix: Use alternative italic character
+ * Fix: Handle HTML breaks inside another tag
+ * Fix: Handle HTML spaces around tags
+
+
+07/11/2014 v2.1.7
+--------------
+
+ * Change composer name to "elephant418/markdownify"
+
+
+14/07/2014 v2.1.6
+--------------
+
+ * Fix: Simulate a paragraph for inline text preceding block element
+ * Fix: Nested lists
+ * Fix: setKeepHTML method
+ * Feature: PHP 5.5 & 5.6 support in continuous integration
+
+
+16/03/2014 v2.1.5
+--------------
+
+Add display settings
+
+ * Test: Add tests for footnotes after every paragraph or not
+ * Feature: Allow to display link reference in paragraph, without footnotes
+
+
+27/02/2014 v2.1.4
+--------------
+
+Improve how ConverterExtra handle id & class attributes:
+
+ * Feature: Allow id & class attributes on links
+ * Feature: Allow class attributes on headings \ No newline at end of file
diff --git a/library/markdownify/LICENSE_LGPL.txt b/vendor/pixel418/markdownify/LICENSE
index 5ab7695ab..5ab7695ab 100644
--- a/library/markdownify/LICENSE_LGPL.txt
+++ b/vendor/pixel418/markdownify/LICENSE
diff --git a/vendor/pixel418/markdownify/README.md b/vendor/pixel418/markdownify/README.md
new file mode 100644
index 000000000..8855b0d05
--- /dev/null
+++ b/vendor/pixel418/markdownify/README.md
@@ -0,0 +1,63 @@
+# Markdownify
+
+[![Build Status](https://travis-ci.org/Elephant418/Markdownify.png?branch=master)](https://travis-ci.org/Elephant418/Markdownify?branch=master)
+[![Total Downloads](https://poser.pugx.org/pixel418/markdownify/downloads)](https://packagist.org/packages/pixel418/markdownify)
+[![License LGPL](https://poser.pugx.org/pixel418/markdownify/license)](https://opensource.org/licenses/lgpl-2.1.php)
+
+The HTML to Markdown converter for PHP
+
+[Code example](#code-example) | [How to Install](#how-to-install) | [How to Contribute](#how-to-contribute) | [Author & Community](#author--community)
+
+
+
+Code example
+--------
+
+### Markdown
+
+```php
+$converter = new Markdownify\Converter;
+$converter->parseString('<h1>Heading</h1>');
+// Returns: # Heading
+```
+
+### Markdown Extra [as defined by @michelf](http://michelf.ca/projects/php-markdown/extra/)
+
+```php
+$converter = new Markdownify\ConverterExtra;
+$converter->parseString('<h1 id="md">Heading</h1>');
+// Returns: # Heading {#md}
+```
+
+
+
+How to Install
+--------
+
+This library package requires `PHP 5.3` or later.<br>
+Install [Composer](http://getcomposer.org/doc/01-basic-usage.md#installation) and run the following command to get the latest version:
+
+```sh
+composer require pixel418/markdownify
+```
+
+
+
+How to Contribute
+--------
+
+1. Fork the Markdownify repository
+2. Create a new branch for each feature or improvement
+3. Send a pull request from each feature branch to the **v2.x** branch
+
+If you don't know much about pull request, you can read [the Github article](https://help.github.com/articles/using-pull-requests)
+
+
+
+Author & Community
+--------
+
+Markdownify is under [LGPL License](http://opensource.org/licenses/LGPL-2.1)<br>
+It was created by [Milian Wolff](http://milianw.de)<br>
+It was converted to a Symfony Bundle by [Peter Kruithof](https://github.com/pkruithof)<br>
+It is maintained by [Thomas ZILLIOX](http://tzi.fr)
diff --git a/vendor/pixel418/markdownify/composer.json b/vendor/pixel418/markdownify/composer.json
new file mode 100644
index 000000000..71d9f3565
--- /dev/null
+++ b/vendor/pixel418/markdownify/composer.json
@@ -0,0 +1,38 @@
+{
+ "name": "pixel418/markdownify",
+ "type": "lib",
+ "description": "The HTML to Markdown converter for PHP ",
+ "keywords": ["markdown", "markdownify"],
+ "license": "LGPL",
+ "homepage": "https://github.com/elephant418/Markdownify",
+ "authors": [
+ {
+ "name": "Milian Wolff",
+ "email": "mail@milianw.de",
+ "homepage": "http://milianw.de"
+
+ },
+ {
+ "name": "Peter Kruithof",
+ "email": "pkruithof@gmail.com",
+ "homepage": "http://pkruithof.tumblr.com/"
+ },
+ {
+ "name": "Thomas Zilliox",
+ "email": "hello@tzi.fr",
+ "homepage": "http://tzi.fr"
+ }
+ ],
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.8"
+ },
+ "autoload": {
+ "psr-4": {
+ "Markdownify\\": "src",
+ "Test\\Markdownify\\": "test"
+ }
+ }
+}
diff --git a/vendor/pixel418/markdownify/src/Converter.php b/vendor/pixel418/markdownify/src/Converter.php
new file mode 100644
index 000000000..77c62dc7e
--- /dev/null
+++ b/vendor/pixel418/markdownify/src/Converter.php
@@ -0,0 +1,1400 @@
+<?php
+
+/* This file is part of the Markdownify project, which is under LGPL license */
+
+namespace Markdownify;
+
+/**
+ * default configuration
+ */
+define('MDFY_BODYWIDTH', false);
+define('MDFY_KEEPHTML', true);
+
+/**
+ * HTML to Markdown converter class
+ */
+class Converter
+{
+ /**
+ * html parser object
+ *
+ * @var parseHTML
+ */
+ protected $parser;
+
+ /**
+ * markdown output
+ *
+ * @var string
+ */
+ protected $output;
+
+ /**
+ * stack with tags which where not converted to html
+ *
+ * @var array<string>
+ */
+ protected $notConverted = array();
+
+ /**
+ * skip conversion to markdown
+ *
+ * @var bool
+ */
+ protected $skipConversion = false;
+
+ /* options */
+
+ /**
+ * keep html tags which cannot be converted to markdown
+ *
+ * @var bool
+ */
+ protected $keepHTML = false;
+
+ /**
+ * wrap output, set to 0 to skip wrapping
+ *
+ * @var int
+ */
+ protected $bodyWidth = 0;
+
+ /**
+ * minimum body width
+ *
+ * @var int
+ */
+ protected $minBodyWidth = 25;
+
+ /**
+ * position where the link reference will be displayed
+ *
+ *
+ * @var int
+ */
+ protected $linkPosition;
+ const LINK_AFTER_CONTENT = 0;
+ const LINK_AFTER_PARAGRAPH = 1;
+ const LINK_IN_PARAGRAPH = 2;
+
+ /**
+ * stores current buffers
+ *
+ * @var array<string>
+ */
+ protected $buffer = array();
+
+ /**
+ * stores current buffers
+ *
+ * @var array<string>
+ */
+ protected $footnotes = array();
+
+ /**
+ * tags with elements which can be handled by markdown
+ *
+ * @var array<string>
+ */
+ protected $isMarkdownable = array(
+ 'p' => array(),
+ 'ul' => array(),
+ 'ol' => array(),
+ 'li' => array(),
+ 'br' => array(),
+ 'blockquote' => array(),
+ 'code' => array(),
+ 'pre' => array(),
+ 'a' => array(
+ 'href' => 'required',
+ 'title' => 'optional',
+ ),
+ 'strong' => array(),
+ 'b' => array(),
+ 'em' => array(),
+ 'i' => array(),
+ 'img' => array(
+ 'src' => 'required',
+ 'alt' => 'optional',
+ 'title' => 'optional',
+ ),
+ 'h1' => array(),
+ 'h2' => array(),
+ 'h3' => array(),
+ 'h4' => array(),
+ 'h5' => array(),
+ 'h6' => array(),
+ 'hr' => array(),
+ );
+
+ /**
+ * html tags to be ignored (contents will be parsed)
+ *
+ * @var array<string>
+ */
+ protected $ignore = array(
+ 'html',
+ 'body',
+ );
+
+ /**
+ * html tags to be dropped (contents will not be parsed!)
+ *
+ * @var array<string>
+ */
+ protected $drop = array(
+ 'script',
+ 'head',
+ 'style',
+ 'form',
+ 'area',
+ 'object',
+ 'param',
+ 'iframe',
+ );
+
+ /**
+ * html block tags that allow inline & block children
+ *
+ * @var array<string>
+ */
+ protected $allowMixedChildren = array(
+ 'li'
+ );
+
+ /**
+ * Markdown indents which could be wrapped
+ * @note: use strings in regex format
+ *
+ * @var array<string>
+ */
+ protected $wrappableIndents = array(
+ '\* ', // ul
+ '\d. ', // ol
+ '\d\d. ', // ol
+ '> ', // blockquote
+ '', // p
+ );
+
+ /**
+ * list of chars which have to be escaped in normal text
+ * @note: use strings in regex format
+ *
+ * @var array
+ *
+ * TODO: what's with block chars / sequences at the beginning of a block?
+ */
+ protected $escapeInText = array(
+ '\*\*([^*]+)\*\*' => '\*\*$1\*\*', // strong
+ '\*([^*]+)\*' => '\*$1\*', // em
+ '__(?! |_)(.+)(?!<_| )__' => '\_\_$1\_\_', // strong
+ '_(?! |_)(.+)(?!<_| )_' => '\_$1\_', // em
+ '([-*_])([ ]{0,2}\1){2,}' => '\\\\$0', // hr
+ '`' => '\`', // code
+ '\[(.+)\](\s*\()' => '\[$1\]$2', // links: [text] (url) => [text\] (url)
+ '\[(.+)\](\s*)\[(.*)\]' => '\[$1\]$2\[$3\]', // links: [text][id] => [text\][id\]
+ '^#(#{0,5}) ' => '\#$1 ', // header
+ );
+
+ /**
+ * wether last processed node was a block tag or not
+ *
+ * @var bool
+ */
+ protected $lastWasBlockTag = false;
+
+ /**
+ * name of last closed tag
+ *
+ * @var string
+ */
+ protected $lastClosedTag = '';
+
+ /**
+ * number of line breaks before next inline output
+ */
+ protected $lineBreaks = 0;
+
+ /**
+ * node stack, e.g. for <a> and <abbr> tags
+ *
+ * @var array<array>
+ */
+ protected $stack = array();
+
+ /**
+ * current indentation
+ *
+ * @var string
+ */
+ protected $indent = '';
+
+ /**
+ * constructor, set options, setup parser
+ *
+ * @param int $linkPosition define the position of links
+ * @param int $bodyWidth whether or not to wrap the output to the given width
+ * defaults to false
+ * @param bool $keepHTML whether to keep non markdownable HTML or to discard it
+ * defaults to true (HTML will be kept)
+ * @return void
+ */
+ public function __construct($linkPosition = self::LINK_AFTER_CONTENT, $bodyWidth = MDFY_BODYWIDTH, $keepHTML = MDFY_KEEPHTML)
+ {
+ $this->linkPosition = $linkPosition;
+ $this->keepHTML = $keepHTML;
+
+ if ($bodyWidth > $this->minBodyWidth) {
+ $this->bodyWidth = intval($bodyWidth);
+ } else {
+ $this->bodyWidth = false;
+ }
+
+ $this->parser = new Parser;
+ $this->parser->noTagsInCode = true;
+
+ // we don't have to do this every time
+ $search = array();
+ $replace = array();
+ foreach ($this->escapeInText as $s => $r) {
+ array_push($search, '@(?<!\\\)' . $s . '@U');
+ array_push($replace, $r);
+ }
+ $this->escapeInText = array(
+ 'search' => $search,
+ 'replace' => $replace
+ );
+ }
+
+ /**
+ * parse a HTML string
+ *
+ * @param string $html
+ * @return string markdown formatted
+ */
+ public function parseString($html)
+ {
+ $this->resetState();
+
+ $this->parser->html = $html;
+ $this->parse();
+
+ return $this->output;
+ }
+
+ /**
+ * set the position where the link reference will be displayed
+ *
+ * @param int $linkPosition
+ * @return void
+ */
+ public function setLinkPosition($linkPosition)
+ {
+ $this->linkPosition = $linkPosition;
+ }
+
+ /**
+ * set keep HTML tags which cannot be converted to markdown
+ *
+ * @param bool $linkPosition
+ * @return void
+ */
+ public function setKeepHTML($keepHTML)
+ {
+ $this->keepHTML = $keepHTML;
+ }
+
+ /**
+ * iterate through the nodes and decide what we
+ * shall do with the current node
+ *
+ * @param void
+ * @return void
+ */
+ protected function parse()
+ {
+ $this->output = '';
+ // drop tags
+ $this->parser->html = preg_replace('#<(' . implode('|', $this->drop) . ')[^>]*>.*</\\1>#sU', '', $this->parser->html);
+ while ($this->parser->nextNode()) {
+ switch ($this->parser->nodeType) {
+ case 'doctype':
+ break;
+ case 'pi':
+ case 'comment':
+ if ($this->keepHTML) {
+ $this->flushLinebreaks();
+ $this->out($this->parser->node);
+ $this->setLineBreaks(2);
+ }
+ // else drop
+ break;
+ case 'text':
+ $this->handleText();
+ break;
+ case 'tag':
+ if (in_array($this->parser->tagName, $this->ignore)) {
+ break;
+ }
+ // If the previous tag was not a block element, we simulate a paragraph tag
+ if ($this->parser->isBlockElement && $this->parser->isNextToInlineContext && !in_array($this->parent(), $this->allowMixedChildren)) {
+ $this->setLineBreaks(2);
+ }
+ if ($this->parser->isStartTag) {
+ $this->flushLinebreaks();
+ }
+ if ($this->skipConversion) {
+ $this->isMarkdownable(); // update notConverted
+ $this->handleTagToText();
+ continue;
+ }
+
+ // block elements
+ if (!$this->parser->keepWhitespace && $this->parser->isBlockElement) {
+ $this->fixBlockElementSpacing();
+ }
+
+ // inline elements
+ if (!$this->parser->keepWhitespace && $this->parser->isInlineContext) {
+ $this->fixInlineElementSpacing();
+ }
+
+ if ($this->isMarkdownable()) {
+ if ($this->parser->isBlockElement && $this->parser->isStartTag && !$this->lastWasBlockTag && !empty($this->output)) {
+ if (!empty($this->buffer)) {
+ $str =& $this->buffer[count($this->buffer) - 1];
+ } else {
+ $str =& $this->output;
+ }
+ if (substr($str, -strlen($this->indent) - 1) != "\n" . $this->indent) {
+ $str .= "\n" . $this->indent;
+ }
+ }
+ $func = 'handleTag_' . $this->parser->tagName;
+ $this->$func();
+ if ($this->linkPosition == self::LINK_AFTER_PARAGRAPH && $this->parser->isBlockElement && !$this->parser->isStartTag && empty($this->parser->openTags)) {
+ $this->flushFootnotes();
+ }
+ if (!$this->parser->isStartTag) {
+ $this->lastClosedTag = $this->parser->tagName;
+ }
+ } else {
+ $this->handleTagToText();
+ $this->lastClosedTag = '';
+ }
+ break;
+ default:
+ trigger_error('invalid node type', E_USER_ERROR);
+ break;
+ }
+ $this->lastWasBlockTag = $this->parser->nodeType == 'tag' && $this->parser->isStartTag && $this->parser->isBlockElement;
+ }
+ if (!empty($this->buffer)) {
+ // trigger_error('buffer was not flushed, this is a bug. please report!', E_USER_WARNING);
+ while (!empty($this->buffer)) {
+ $this->out($this->unbuffer());
+ }
+ }
+ // cleanup
+ $this->output = rtrim(str_replace('&amp;', '&', str_replace('&lt;', '<', str_replace('&gt;', '>', $this->output))));
+ // end parsing, flush stacked tags
+ $this->flushFootnotes();
+ $this->stack = array();
+ }
+
+ /**
+ * check if current tag can be converted to Markdown
+ *
+ * @param void
+ * @return bool
+ */
+ protected function isMarkdownable()
+ {
+ if (!isset($this->isMarkdownable[$this->parser->tagName])) {
+ // simply not markdownable
+
+ return false;
+ }
+ if ($this->parser->isStartTag) {
+ $return = true;
+ if ($this->keepHTML) {
+ $diff = array_diff(array_keys($this->parser->tagAttributes), array_keys($this->isMarkdownable[$this->parser->tagName]));
+ if (!empty($diff)) {
+ // non markdownable attributes given
+ $return = false;
+ }
+ }
+ if ($return) {
+ foreach ($this->isMarkdownable[$this->parser->tagName] as $attr => $type) {
+ if ($type == 'required' && !isset($this->parser->tagAttributes[$attr])) {
+ // required markdown attribute not given
+ $return = false;
+ break;
+ }
+ }
+ }
+ if (!$return) {
+ array_push($this->notConverted, $this->parser->tagName . '::' . implode('/', $this->parser->openTags));
+ }
+
+ return $return;
+ } else {
+ if (!empty($this->notConverted) && end($this->notConverted) === $this->parser->tagName . '::' . implode('/', $this->parser->openTags)) {
+ array_pop($this->notConverted);
+
+ return false;
+ }
+
+ return true;
+ }
+ }
+
+ /**
+ * output footnotes
+ *
+ * @param void
+ * @return void
+ */
+ protected function flushFootnotes()
+ {
+ $out = false;
+ foreach ($this->footnotes as $k => $tag) {
+ if (!isset($tag['unstacked'])) {
+ if (!$out) {
+ $out = true;
+ $this->out("\n\n", true);
+ } else {
+ $this->out("\n", true);
+ }
+ $this->out(' [' . $tag['linkID'] . ']: ' . $this->getLinkReference($tag), true);
+ $tag['unstacked'] = true;
+ $this->footnotes[$k] = $tag;
+ }
+ }
+ }
+
+ /**
+ * return formated link reference
+ *
+ * @param array $tag
+ * @return string link reference
+ */
+ protected function getLinkReference($tag)
+ {
+ return $tag['href'] . (isset($tag['title']) ? ' "' . $tag['title'] . '"' : '');
+ }
+
+ /**
+ * flush enqued linebreaks
+ *
+ * @param void
+ * @return void
+ */
+ protected function flushLinebreaks()
+ {
+ if ($this->lineBreaks && !empty($this->output)) {
+ $this->out(str_repeat("\n" . $this->indent, $this->lineBreaks), true);
+ }
+ $this->lineBreaks = 0;
+ }
+
+ /**
+ * handle non Markdownable tags
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTagToText()
+ {
+ if (!$this->keepHTML) {
+ if (!$this->parser->isStartTag && $this->parser->isBlockElement) {
+ $this->setLineBreaks(2);
+ }
+ } else {
+ // dont convert to markdown inside this tag
+ /** TODO: markdown extra **/
+ if (!$this->parser->isEmptyTag) {
+ if ($this->parser->isStartTag) {
+ if (!$this->skipConversion) {
+ $this->skipConversion = $this->parser->tagName . '::' . implode('/', $this->parser->openTags);
+ }
+ } else {
+ if ($this->skipConversion == $this->parser->tagName . '::' . implode('/', $this->parser->openTags)) {
+ $this->skipConversion = false;
+ }
+ }
+ }
+
+ if ($this->parser->isBlockElement) {
+ if ($this->parser->isStartTag) {
+ // looks like ins or del are block elements now
+ if (in_array($this->parent(), array('ins', 'del'))) {
+ $this->out("\n", true);
+ $this->indent(' ');
+ }
+ // don't indent inside <pre> tags
+ if ($this->parser->tagName == 'pre') {
+ $this->out($this->parser->node);
+ static $indent;
+ $indent = $this->indent;
+ $this->indent = '';
+ } else {
+ $this->out($this->parser->node . "\n" . $this->indent);
+ if (!$this->parser->isEmptyTag) {
+ $this->indent(' ');
+ } else {
+ $this->setLineBreaks(1);
+ }
+ $this->parser->html = ltrim($this->parser->html);
+ }
+ } else {
+ if (!$this->parser->keepWhitespace) {
+ $this->output = rtrim($this->output);
+ }
+ if ($this->parser->tagName != 'pre') {
+ $this->indent(' ');
+ $this->out("\n" . $this->indent . $this->parser->node);
+ } else {
+ // reset indentation
+ $this->out($this->parser->node);
+ static $indent;
+ $this->indent = $indent;
+ }
+
+ if (in_array($this->parent(), array('ins', 'del'))) {
+ // ins or del was block element
+ $this->out("\n");
+ $this->indent(' ');
+ }
+ if ($this->parser->tagName == 'li') {
+ $this->setLineBreaks(1);
+ } else {
+ $this->setLineBreaks(2);
+ }
+ }
+ } else {
+ $this->out($this->parser->node);
+ }
+ if (in_array($this->parser->tagName, array('code', 'pre'))) {
+ if ($this->parser->isStartTag) {
+ $this->buffer();
+ } else {
+ // add stuff so cleanup just reverses this
+ $this->out(str_replace('&lt;', '&amp;lt;', str_replace('&gt;', '&amp;gt;', $this->unbuffer())));
+ }
+ }
+ }
+ }
+
+ /**
+ * handle plain text
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleText()
+ {
+ if ($this->hasParent('pre') && strpos($this->parser->node, "\n") !== false) {
+ $this->parser->node = str_replace("\n", "\n" . $this->indent, $this->parser->node);
+ }
+ if (!$this->hasParent('code') && !$this->hasParent('pre')) {
+ // entity decode
+ $this->parser->node = $this->decode($this->parser->node);
+ if (!$this->skipConversion) {
+ // escape some chars in normal Text
+ $this->parser->node = preg_replace($this->escapeInText['search'], $this->escapeInText['replace'], $this->parser->node);
+ }
+ } else {
+ $this->parser->node = str_replace(array('&quot;', '&apos'), array('"', '\''), $this->parser->node);
+ }
+ $this->out($this->parser->node);
+ $this->lastClosedTag = '';
+ }
+
+ /**
+ * handle <em> and <i> tags
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTag_em()
+ {
+ $this->out('_', true);
+ }
+
+ protected function handleTag_i()
+ {
+ $this->handleTag_em();
+ }
+
+ /**
+ * handle <strong> and <b> tags
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTag_strong()
+ {
+ $this->out('**', true);
+ }
+
+ protected function handleTag_b()
+ {
+ $this->handleTag_strong();
+ }
+
+ /**
+ * handle <h1> tags
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTag_h1()
+ {
+ $this->handleHeader(1);
+ }
+
+ /**
+ * handle <h2> tags
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTag_h2()
+ {
+ $this->handleHeader(2);
+ }
+
+ /**
+ * handle <h3> tags
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTag_h3()
+ {
+ $this->handleHeader(3);
+ }
+
+ /**
+ * handle <h4> tags
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTag_h4()
+ {
+ $this->handleHeader(4);
+ }
+
+ /**
+ * handle <h5> tags
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTag_h5()
+ {
+ $this->handleHeader(5);
+ }
+
+ /**
+ * handle <h6> tags
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTag_h6()
+ {
+ $this->handleHeader(6);
+ }
+
+ /**
+ * handle header tags (<h1> - <h6>)
+ *
+ * @param int $level 1-6
+ * @return void
+ */
+ protected function handleHeader($level)
+ {
+ if ($this->parser->isStartTag) {
+ $this->out(str_repeat('#', $level) . ' ', true);
+ } else {
+ $this->setLineBreaks(2);
+ }
+ }
+
+ /**
+ * handle <p> tags
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTag_p()
+ {
+ if (!$this->parser->isStartTag) {
+ $this->setLineBreaks(2);
+ }
+ }
+
+ /**
+ * handle <a> tags
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTag_a()
+ {
+ if ($this->parser->isStartTag) {
+ $this->buffer();
+ $this->handleTag_a_parser();
+ $this->stack();
+ } else {
+ $tag = $this->unstack();
+ $buffer = $this->unbuffer();
+ $this->handleTag_a_converter($tag, $buffer);
+ $this->out($this->handleTag_a_converter($tag, $buffer), true);
+ }
+ }
+
+ /**
+ * handle <a> tags parsing
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTag_a_parser()
+ {
+ if (isset($this->parser->tagAttributes['title'])) {
+ $this->parser->tagAttributes['title'] = $this->decode($this->parser->tagAttributes['title']);
+ } else {
+ $this->parser->tagAttributes['title'] = null;
+ }
+ $this->parser->tagAttributes['href'] = $this->decode(trim($this->parser->tagAttributes['href']));
+ }
+
+ /**
+ * handle <a> tags conversion
+ *
+ * @param array $tag
+ * @param string $buffer
+ * @return string The markdownified link
+ */
+ protected function handleTag_a_converter($tag, $buffer)
+ {
+ if (empty($tag['href']) && empty($tag['title'])) {
+ // empty links... testcase mania, who would possibly do anything like that?!
+ return '[' . $buffer . ']()';
+ }
+
+ if ($buffer == $tag['href'] && empty($tag['title'])) {
+ // <http://example.com>
+ return '<' . $buffer . '>';
+ }
+
+ $bufferDecoded = $this->decode(trim($buffer));
+ if (substr($tag['href'], 0, 7) == 'mailto:' && 'mailto:' . $bufferDecoded == $tag['href']) {
+ if (is_null($tag['title'])) {
+ // <mail@example.com>
+ return '<' . $bufferDecoded . '>';
+ }
+ // [mail@example.com][1]
+ // ...
+ // [1]: mailto:mail@example.com Title
+ $tag['href'] = 'mailto:' . $bufferDecoded;
+ }
+
+ if ($this->linkPosition == self::LINK_IN_PARAGRAPH) {
+ return '[' . $buffer . '](' . $this->getLinkReference($tag) . ')';
+ }
+
+ // [This link][id]
+ foreach ($this->footnotes as $tag2) {
+ if ($tag2['href'] == $tag['href'] && $tag2['title'] === $tag['title']) {
+ $tag['linkID'] = $tag2['linkID'];
+ break;
+ }
+ }
+ if (!isset($tag['linkID'])) {
+ $tag['linkID'] = count($this->footnotes) + 1;
+ array_push($this->footnotes, $tag);
+ }
+
+ return '[' . $buffer . '][' . $tag['linkID'] . ']';
+ }
+
+ /**
+ * handle <img /> tags
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTag_img()
+ {
+ if (!$this->parser->isStartTag) {
+ return; // just to be sure this is really an empty tag...
+ }
+
+ if (isset($this->parser->tagAttributes['title'])) {
+ $this->parser->tagAttributes['title'] = $this->decode($this->parser->tagAttributes['title']);
+ } else {
+ $this->parser->tagAttributes['title'] = null;
+ }
+ if (isset($this->parser->tagAttributes['alt'])) {
+ $this->parser->tagAttributes['alt'] = $this->decode($this->parser->tagAttributes['alt']);
+ } else {
+ $this->parser->tagAttributes['alt'] = null;
+ }
+
+ if (empty($this->parser->tagAttributes['src'])) {
+ // support for "empty" images... dunno if this is really needed
+ // but there are some test cases which do that...
+ if (!empty($this->parser->tagAttributes['title'])) {
+ $this->parser->tagAttributes['title'] = ' ' . $this->parser->tagAttributes['title'] . ' ';
+ }
+ $this->out('![' . $this->parser->tagAttributes['alt'] . '](' . $this->parser->tagAttributes['title'] . ')', true);
+
+ return;
+ } else {
+ $this->parser->tagAttributes['src'] = $this->decode($this->parser->tagAttributes['src']);
+ }
+
+ $out = '![' . $this->parser->tagAttributes['alt'] . ']';
+ if ($this->linkPosition == self::LINK_IN_PARAGRAPH) {
+ $out .= '(' . $this->parser->tagAttributes['src'];
+ if ($this->parser->tagAttributes['title']) {
+ $out .= ' "' . $this->parser->tagAttributes['title'] . '"';
+ }
+ $out .= ')';
+ $this->out($out, true);
+ return;
+ }
+
+ // ![This image][id]
+ $link_id = false;
+ if (!empty($this->footnotes)) {
+ foreach ($this->footnotes as $tag) {
+ if ($tag['href'] == $this->parser->tagAttributes['src']
+ && $tag['title'] === $this->parser->tagAttributes['title']
+ ) {
+ $link_id = $tag['linkID'];
+ break;
+ }
+ }
+ }
+ if (!$link_id) {
+ $link_id = count($this->footnotes) + 1;
+ $tag = array(
+ 'href' => $this->parser->tagAttributes['src'],
+ 'linkID' => $link_id,
+ 'title' => $this->parser->tagAttributes['title']
+ );
+ array_push($this->footnotes, $tag);
+ }
+ $out .= '[' . $link_id . ']';
+
+ $this->out($out, true);
+ }
+
+ /**
+ * handle <code> tags
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTag_code()
+ {
+ if ($this->hasParent('pre')) {
+ // ignore code blocks inside <pre>
+
+ return;
+ }
+ if ($this->parser->isStartTag) {
+ $this->buffer();
+ } else {
+ $buffer = $this->unbuffer();
+ // use as many backticks as needed
+ preg_match_all('#`+#', $buffer, $matches);
+ if (!empty($matches[0])) {
+ rsort($matches[0]);
+
+ $ticks = '`';
+ while (true) {
+ if (!in_array($ticks, $matches[0])) {
+ break;
+ }
+ $ticks .= '`';
+ }
+ } else {
+ $ticks = '`';
+ }
+ if ($buffer[0] == '`' || substr($buffer, -1) == '`') {
+ $buffer = ' ' . $buffer . ' ';
+ }
+ $this->out($ticks . $buffer . $ticks, true);
+ }
+ }
+
+ /**
+ * handle <pre> tags
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTag_pre()
+ {
+ if ($this->keepHTML && $this->parser->isStartTag) {
+ // check if a simple <code> follows
+ if (!preg_match('#^\s*<code\s*>#Us', $this->parser->html)) {
+ // this is no standard markdown code block
+ $this->handleTagToText();
+
+ return;
+ }
+ }
+ $this->indent(' ');
+ if (!$this->parser->isStartTag) {
+ $this->setLineBreaks(2);
+ } else {
+ $this->parser->html = ltrim($this->parser->html);
+ }
+ }
+
+ /**
+ * handle <blockquote> tags
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTag_blockquote()
+ {
+ $this->indent('> ');
+ }
+
+ /**
+ * handle <ul> tags
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTag_ul()
+ {
+ if ($this->parser->isStartTag) {
+ $this->stack();
+ if (!$this->keepHTML && $this->lastClosedTag == $this->parser->tagName) {
+ $this->out("\n" . $this->indent . '<!-- -->' . "\n" . $this->indent . "\n" . $this->indent);
+ }
+ } else {
+ $this->unstack();
+ if ($this->parent() != 'li' || preg_match('#^\s*(</li\s*>\s*<li\s*>\s*)?<(p|blockquote)\s*>#sU', $this->parser->html)) {
+ // dont make Markdown add unneeded paragraphs
+ $this->setLineBreaks(2);
+ }
+ }
+ }
+
+ /**
+ * handle <ul> tags
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTag_ol()
+ {
+ // same as above
+ $this->parser->tagAttributes['num'] = 0;
+ $this->handleTag_ul();
+ }
+
+ /**
+ * handle <li> tags
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTag_li()
+ {
+ if ($this->parent() == 'ol') {
+ $parent =& $this->getStacked('ol');
+ if ($this->parser->isStartTag) {
+ $parent['num']++;
+ $this->out(str_repeat(' ', 3 - strlen($parent['num'])) . $parent['num'] . '. ', true);
+ }
+ } else {
+ if ($this->parser->isStartTag) {
+ $this->out(' * ', true);
+ }
+ }
+ $this->indent(' ', false);
+ if (!$this->parser->isStartTag) {
+ $this->setLineBreaks(1);
+ }
+ }
+
+ /**
+ * handle <hr /> tags
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTag_hr()
+ {
+ if (!$this->parser->isStartTag) {
+ return; // just to be sure this really is an empty tag
+ }
+ $this->out('* * *', true);
+ $this->setLineBreaks(2);
+ }
+
+ /**
+ * handle <br /> tags
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTag_br()
+ {
+ $this->out(" \n" . $this->indent, true);
+ $this->parser->html = ltrim($this->parser->html);
+ }
+
+ /**
+ * add current node to the stack
+ * this only stores the attributes
+ *
+ * @param void
+ * @return void
+ */
+ protected function stack()
+ {
+ if (!isset($this->stack[$this->parser->tagName])) {
+ $this->stack[$this->parser->tagName] = array();
+ }
+ array_push($this->stack[$this->parser->tagName], $this->parser->tagAttributes);
+ }
+
+ /**
+ * remove current tag from stack
+ *
+ * @param void
+ * @return array
+ */
+ protected function unstack()
+ {
+ if (!isset($this->stack[$this->parser->tagName]) || !is_array($this->stack[$this->parser->tagName])) {
+ trigger_error('Trying to unstack from empty stack. This must not happen.', E_USER_ERROR);
+ }
+
+ return array_pop($this->stack[$this->parser->tagName]);
+ }
+
+ /**
+ * get last stacked element of type $tagName
+ *
+ * @param string $tagName
+ * @return array
+ */
+ protected function &getStacked($tagName)
+ {
+ // no end() so it can be referenced
+ return $this->stack[$tagName][count($this->stack[$tagName]) - 1];
+ }
+
+ /**
+ * set number of line breaks before next start tag
+ *
+ * @param int $number
+ * @return void
+ */
+ protected function setLineBreaks($number)
+ {
+ if ($this->lineBreaks < $number) {
+ $this->lineBreaks = $number;
+ }
+ }
+
+ /**
+ * buffer next parser output until unbuffer() is called
+ *
+ * @param void
+ * @return void
+ */
+ protected function buffer()
+ {
+ array_push($this->buffer, '');
+ }
+
+ /**
+ * end current buffer and return buffered output
+ *
+ * @param void
+ * @return string
+ */
+ protected function unbuffer()
+ {
+ return array_pop($this->buffer);
+ }
+
+ /**
+ * append string to the correct var, either
+ * directly to $this->output or to the current
+ * buffers
+ *
+ * @param string $put
+ * @param boolean $nowrap
+ * @return void
+ */
+ protected function out($put, $nowrap = false)
+ {
+ if (empty($put)) {
+ return;
+ }
+ if (!empty($this->buffer)) {
+ $this->buffer[count($this->buffer) - 1] .= $put;
+ } else {
+ if ($this->bodyWidth && !$this->parser->keepWhitespace) { // wrap lines
+ // get last line
+ $pos = strrpos($this->output, "\n");
+ if ($pos === false) {
+ $line = $this->output;
+ } else {
+ $line = substr($this->output, $pos);
+ }
+
+ if ($nowrap) {
+ if ($put[0] != "\n" && $this->strlen($line) + $this->strlen($put) > $this->bodyWidth) {
+ $this->output .= "\n" . $this->indent . $put;
+ } else {
+ $this->output .= $put;
+ }
+
+ return;
+ } else {
+ $put .= "\n"; // make sure we get all lines in the while below
+ $lineLen = $this->strlen($line);
+ while ($pos = strpos($put, "\n")) {
+ $putLine = substr($put, 0, $pos + 1);
+ $put = substr($put, $pos + 1);
+ $putLen = $this->strlen($putLine);
+ if ($lineLen + $putLen < $this->bodyWidth) {
+ $this->output .= $putLine;
+ $lineLen = $putLen;
+ } else {
+ $split = preg_split('#^(.{0,' . ($this->bodyWidth - $lineLen) . '})\b#', $putLine, 2, PREG_SPLIT_OFFSET_CAPTURE | PREG_SPLIT_DELIM_CAPTURE);
+ $this->output .= rtrim($split[1][0]) . "\n" . $this->indent . $this->wordwrap(ltrim($split[2][0]), $this->bodyWidth, "\n" . $this->indent, false);
+ }
+ }
+ $this->output = substr($this->output, 0, -1);
+
+ return;
+ }
+ } else {
+ $this->output .= $put;
+ }
+ }
+ }
+
+ /**
+ * indent next output (start tag) or unindent (end tag)
+ *
+ * @param string $str indentation
+ * @param bool $output add indendation to output
+ * @return void
+ */
+ protected function indent($str, $output = true)
+ {
+ if ($this->parser->isStartTag) {
+ $this->indent .= $str;
+ if ($output) {
+ $this->out($str, true);
+ }
+ } else {
+ $this->indent = substr($this->indent, 0, -strlen($str));
+ }
+ }
+
+ /**
+ * decode email addresses
+ *
+ * @author derernst@gmx.ch <http://www.php.net/manual/en/function.html-entity-decode.php#68536>
+ * @author Milian Wolff <http://milianw.de>
+ */
+ protected function decode($text, $quote_style = ENT_QUOTES)
+ {
+ return htmlspecialchars_decode($text, $quote_style);
+ }
+
+ /**
+ * callback for decode() which converts a hexadecimal entity to UTF-8
+ *
+ * @param array $matches
+ * @return string UTF-8 encoded
+ */
+ protected function _decode_hex($matches)
+ {
+ return $this->unichr(hexdec($matches[1]));
+ }
+
+ /**
+ * callback for decode() which converts a numerical entity to UTF-8
+ *
+ * @param array $matches
+ * @return string UTF-8 encoded
+ */
+ protected function _decode_numeric($matches)
+ {
+ return $this->unichr($matches[1]);
+ }
+
+ /**
+ * UTF-8 chr() which supports numeric entities
+ *
+ * @author grey - greywyvern - com <http://www.php.net/manual/en/function.chr.php#55978>
+ * @param array $matches
+ * @return string UTF-8 encoded
+ */
+ protected function unichr($dec)
+ {
+ if ($dec < 128) {
+ $utf = chr($dec);
+ } elseif ($dec < 2048) {
+ $utf = chr(192 + (($dec - ($dec % 64)) / 64));
+ $utf .= chr(128 + ($dec % 64));
+ } else {
+ $utf = chr(224 + (($dec - ($dec % 4096)) / 4096));
+ $utf .= chr(128 + ((($dec % 4096) - ($dec % 64)) / 64));
+ $utf .= chr(128 + ($dec % 64));
+ }
+
+ return $utf;
+ }
+
+ /**
+ * UTF-8 strlen()
+ *
+ * @param string $str
+ * @return int
+ *
+ * @author dtorop 932 at hotmail dot com <http://www.php.net/manual/en/function.strlen.php#37975>
+ * @author Milian Wolff <http://milianw.de>
+ */
+ protected function strlen($str)
+ {
+ if (function_exists('mb_strlen')) {
+ return mb_strlen($str, 'UTF-8');
+ } else {
+ return preg_match_all('/[\x00-\x7F\xC0-\xFD]/', $str, $var_empty);
+ }
+ }
+
+ /**
+ * wordwrap for utf8 encoded strings
+ *
+ * @param string $str
+ * @param integer $len
+ * @param string $what
+ * @return string
+ */
+ protected function wordwrap($str, $width, $break, $cut = false)
+ {
+ if (!$cut) {
+ $regexp = '#^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){1,' . $width . '}\b#';
+ } else {
+ $regexp = '#^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){' . $width . '}#';
+ }
+ $return = '';
+ while (preg_match($regexp, $str, $matches)) {
+ $string = $matches[0];
+ $str = ltrim(substr($str, strlen($string)));
+ if (!$cut && isset($str[0]) && in_array($str[0], array('.', '!', ';', ':', '?', ','))) {
+ $string .= $str[0];
+ $str = ltrim(substr($str, 1));
+ }
+ $return .= $string . $break;
+ }
+
+ return $return . ltrim($str);
+ }
+
+ /**
+ * check if current node has a $tagName as parent (somewhere, not only the direct parent)
+ *
+ * @param string $tagName
+ * @return bool
+ */
+ protected function hasParent($tagName)
+ {
+ return in_array($tagName, $this->parser->openTags);
+ }
+
+ /**
+ * get tagName of direct parent tag
+ *
+ * @param void
+ * @return string $tagName
+ */
+ protected function parent()
+ {
+ return end($this->parser->openTags);
+ }
+
+ /**
+ * Trims whitespace in block-level elements, on the left side.
+ */
+ protected function fixBlockElementSpacing()
+ {
+ if ($this->parser->isStartTag) {
+ $this->parser->html = ltrim($this->parser->html);
+ }
+ }
+
+ /**
+ * Moves leading/trailing whitespace from inline elements outside of the
+ * element. This is to fix cases like `<strong> Text</strong>`, which if
+ * converted to `** strong**` would be incorrect Markdown.
+ *
+ * Examples:
+ *
+ * * leading: `<strong> Text</strong>` becomes ` <strong>Text</strong>`
+ * * trailing: `<strong>Text </strong>` becomes `<strong>Text</strong> `
+ */
+ protected function fixInlineElementSpacing()
+ {
+ if ($this->parser->isStartTag) {
+ // move spaces after the start element to before the element
+ if (preg_match('~^(\s+)~', $this->parser->html, $matches)) {
+ $this->out($matches[1]);
+ $this->parser->html = ltrim($this->parser->html, " \t\0\x0B");
+ }
+ } else {
+ if (!empty($this->buffer)) {
+ $str =& $this->buffer[count($this->buffer) - 1];
+ } else {
+ $str =& $this->output;
+ }
+
+ // move spaces before the end element to after the element
+ if (preg_match('~(\s+)$~', $str, $matches)) {
+ $str = rtrim($str, " \t\0\x0B");
+ $this->parser->html = $matches[1] . $this->parser->html;
+ }
+ }
+ }
+
+ /**
+ * Resetting the state forces the instance to behave as a fresh instance.
+ * Ideal for running within a loop where you want to maintain a single instance.
+ */
+ protected function resetState()
+ {
+ $this->notConverted = array();
+ $this->skipConversion = false;
+ $this->buffer = array();
+ $this->indent = '';
+ $this->stack = array();
+ $this->lineBreaks = 0;
+ $this->lastClosedTag = '';
+ $this->lastWasBlockTag = false;
+ $this->footnotes = array();
+ }
+}
diff --git a/vendor/pixel418/markdownify/src/ConverterExtra.php b/vendor/pixel418/markdownify/src/ConverterExtra.php
new file mode 100644
index 000000000..733955448
--- /dev/null
+++ b/vendor/pixel418/markdownify/src/ConverterExtra.php
@@ -0,0 +1,573 @@
+<?php
+
+/* This file is part of the Markdownify project, which is under LGPL license */
+
+namespace Markdownify;
+
+class ConverterExtra extends Converter
+{
+
+ /**
+ * table data, including rows with content and the maximum width of each col
+ *
+ * @var array
+ */
+ protected $table = array();
+
+ /**
+ * current col
+ *
+ * @var int
+ */
+ protected $col = -1;
+
+ /**
+ * current row
+ *
+ * @var int
+ */
+ protected $row = 0;
+
+ /**
+ * constructor, see Markdownify::Markdownify() for more information
+ */
+ public function __construct($linksAfterEachParagraph = self::LINK_AFTER_CONTENT, $bodyWidth = MDFY_BODYWIDTH, $keepHTML = MDFY_KEEPHTML)
+ {
+ parent::__construct($linksAfterEachParagraph, $bodyWidth, $keepHTML);
+
+ // new markdownable tags & attributes
+ // header ids: # foo {bar}
+ $this->isMarkdownable['h1']['id'] = 'optional';
+ $this->isMarkdownable['h1']['class'] = 'optional';
+ $this->isMarkdownable['h2']['id'] = 'optional';
+ $this->isMarkdownable['h2']['class'] = 'optional';
+ $this->isMarkdownable['h3']['id'] = 'optional';
+ $this->isMarkdownable['h3']['class'] = 'optional';
+ $this->isMarkdownable['h4']['id'] = 'optional';
+ $this->isMarkdownable['h4']['class'] = 'optional';
+ $this->isMarkdownable['h5']['id'] = 'optional';
+ $this->isMarkdownable['h5']['class'] = 'optional';
+ $this->isMarkdownable['h6']['id'] = 'optional';
+ $this->isMarkdownable['h6']['class'] = 'optional';
+ // tables
+ $this->isMarkdownable['table'] = array();
+ $this->isMarkdownable['th'] = array(
+ 'align' => 'optional',
+ );
+ $this->isMarkdownable['td'] = array(
+ 'align' => 'optional',
+ );
+ $this->isMarkdownable['tr'] = array();
+ array_push($this->ignore, 'thead');
+ array_push($this->ignore, 'tbody');
+ array_push($this->ignore, 'tfoot');
+ // definition lists
+ $this->isMarkdownable['dl'] = array();
+ $this->isMarkdownable['dd'] = array();
+ $this->isMarkdownable['dt'] = array();
+ // link class
+ $this->isMarkdownable['a']['id'] = 'optional';
+ $this->isMarkdownable['a']['class'] = 'optional';
+ // footnotes
+ $this->isMarkdownable['fnref'] = array(
+ 'target' => 'required',
+ );
+ $this->isMarkdownable['footnotes'] = array();
+ $this->isMarkdownable['fn'] = array(
+ 'name' => 'required',
+ );
+ $this->parser->blockElements['fnref'] = false;
+ $this->parser->blockElements['fn'] = true;
+ $this->parser->blockElements['footnotes'] = true;
+ // abbr
+ $this->isMarkdownable['abbr'] = array(
+ 'title' => 'required',
+ );
+ // build RegEx lookahead to decide wether table can pe parsed or not
+ $inlineTags = array_keys($this->parser->blockElements, false);
+ $colContents = '(?:[^<]|<(?:' . implode('|', $inlineTags) . '|[^a-z]))*';
+ $this->tableLookaheadHeader = '{
+ ^\s*(?:<thead\s*>)?\s* # open optional thead
+ <tr\s*>\s*(?: # start required row with headers
+ <th(?:\s+align=("|\')(?:left|center|right)\1)?\s*> # header with optional align
+ \s*' . $colContents . '\s* # contents
+ </th>\s* # close header
+ )+</tr> # close row with headers
+ \s*(?:</thead>)? # close optional thead
+ }sxi';
+ $this->tdSubstitute = '\s*' . $colContents . '\s* # contents
+ </td>\s*';
+ $this->tableLookaheadBody = '{
+ \s*(?:<tbody\s*>)?\s* # open optional tbody
+ (?:<tr\s*>\s* # start row
+ %s # cols to be substituted
+ </tr>)+ # close row
+ \s*(?:</tbody>)? # close optional tbody
+ \s*</table> # close table
+ }sxi';
+ }
+
+ /**
+ * handle header tags (<h1> - <h6>)
+ *
+ * @param int $level 1-6
+ * @return void
+ */
+ protected function handleHeader($level)
+ {
+ if ($this->parser->isStartTag) {
+ $this->parser->tagAttributes['cssSelector'] = $this->getCurrentCssSelector();
+ $this->stack();
+ } else {
+ $tag = $this->unstack();
+ if (!empty($tag['cssSelector'])) {
+ // {#id.class}
+ $this->out(' {' . $tag['cssSelector'] . '}');
+ }
+ }
+ parent::handleHeader($level);
+ }
+
+ /**
+ * handle <a> tags parsing
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTag_a_parser()
+ {
+ parent::handleTag_a_parser();
+ $this->parser->tagAttributes['cssSelector'] = $this->getCurrentCssSelector();
+ }
+
+ /**
+ * handle <a> tags conversion
+ *
+ * @param array $tag
+ * @param string $buffer
+ * @return string The markdownified link
+ */
+ protected function handleTag_a_converter($tag, $buffer)
+ {
+ $output = parent::handleTag_a_converter($tag, $buffer);
+ if (!empty($tag['cssSelector'])) {
+ // [This link][id]{#id.class}
+ $output .= '{' . $tag['cssSelector'] . '}';
+ }
+
+ return $output;
+ }
+
+ /**
+ * handle <abbr> tags
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTag_abbr()
+ {
+ if ($this->parser->isStartTag) {
+ $this->stack();
+ $this->buffer();
+ } else {
+ $tag = $this->unstack();
+ $tag['text'] = $this->unbuffer();
+ $add = true;
+ foreach ($this->stack['abbr'] as $stacked) {
+ if ($stacked['text'] == $tag['text']) {
+ /** TODO: differing abbr definitions, i.e. different titles for same text **/
+ $add = false;
+ break;
+ }
+ }
+ $this->out($tag['text']);
+ if ($add) {
+ array_push($this->stack['abbr'], $tag);
+ }
+ }
+ }
+
+ /**
+ * flush stacked abbr tags
+ *
+ * @param void
+ * @return void
+ */
+ protected function flushStacked_abbr()
+ {
+ $out = array();
+ foreach ($this->stack['abbr'] as $k => $tag) {
+ if (!isset($tag['unstacked'])) {
+ array_push($out, ' *[' . $tag['text'] . ']: ' . $tag['title']);
+ $tag['unstacked'] = true;
+ $this->stack['abbr'][$k] = $tag;
+ }
+ }
+ if (!empty($out)) {
+ $this->out("\n\n" . implode("\n", $out));
+ }
+ }
+
+ /**
+ * handle <table> tags
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTag_table()
+ {
+ if ($this->parser->isStartTag) {
+ // check if upcoming table can be converted
+ if ($this->keepHTML) {
+ if (preg_match($this->tableLookaheadHeader, $this->parser->html, $matches)) {
+ // header seems good, now check body
+ // get align & number of cols
+ preg_match_all('#<th(?:\s+align=("|\')(left|right|center)\1)?\s*>#si', $matches[0], $cols);
+ $regEx = '';
+ $i = 1;
+ $aligns = array();
+ foreach ($cols[2] as $align) {
+ $align = strtolower($align);
+ array_push($aligns, $align);
+ if (empty($align)) {
+ $align = 'left'; // default value
+ }
+ $td = '\s+align=("|\')' . $align . '\\' . $i;
+ $i++;
+ if ($align == 'left') {
+ // look for empty align or left
+ $td = '(?:' . $td . ')?';
+ }
+ $td = '<td' . $td . '\s*>';
+ $regEx .= $td . $this->tdSubstitute;
+ }
+ $regEx = sprintf($this->tableLookaheadBody, $regEx);
+ if (preg_match($regEx, $this->parser->html, $matches, null, strlen($matches[0]))) {
+ // this is a markdownable table tag!
+ $this->table = array(
+ 'rows' => array(),
+ 'col_widths' => array(),
+ 'aligns' => $aligns,
+ );
+ $this->row = 0;
+ } else {
+ // non markdownable table
+ $this->handleTagToText();
+ }
+ } else {
+ // non markdownable table
+ $this->handleTagToText();
+ }
+ } else {
+ $this->table = array(
+ 'rows' => array(),
+ 'col_widths' => array(),
+ 'aligns' => array(),
+ );
+ $this->row = 0;
+ }
+ } else {
+ // finally build the table in Markdown Extra syntax
+ $separator = array();
+ if (!isset($this->table['aligns'])) {
+ $this->table['aligns'] = array();
+ }
+ // seperator with correct align identifiers
+ foreach ($this->table['aligns'] as $col => $align) {
+ if (!$this->keepHTML && !isset($this->table['col_widths'][$col])) {
+ break;
+ }
+ $left = ' ';
+ $right = ' ';
+ switch ($align) {
+ case 'left':
+ $left = ':';
+ break;
+ case 'center':
+ $right = ':';
+ $left = ':';
+ case 'right':
+ $right = ':';
+ break;
+ }
+ array_push($separator, $left . str_repeat('-', $this->table['col_widths'][$col]) . $right);
+ }
+ $separator = '|' . implode('|', $separator) . '|';
+
+ $rows = array();
+ // add padding
+ array_walk_recursive($this->table['rows'], array(&$this, 'alignTdContent'));
+ $header = array_shift($this->table['rows']);
+ array_push($rows, '| ' . implode(' | ', $header) . ' |');
+ array_push($rows, $separator);
+ foreach ($this->table['rows'] as $row) {
+ array_push($rows, '| ' . implode(' | ', $row) . ' |');
+ }
+ $this->out(implode("\n" . $this->indent, $rows));
+ $this->table = array();
+ $this->setLineBreaks(2);
+ }
+ }
+
+ /**
+ * properly pad content so it is aligned as whished
+ * should be used with array_walk_recursive on $this->table['rows']
+ *
+ * @param string &$content
+ * @param int $col
+ * @return void
+ */
+ protected function alignTdContent(&$content, $col)
+ {
+ if (!isset($this->table['aligns'][$col])) {
+ $this->table['aligns'][$col] = 'left';
+ }
+ switch ($this->table['aligns'][$col]) {
+ default:
+ case 'left':
+ $content .= str_repeat(' ', $this->table['col_widths'][$col] - $this->strlen($content));
+ break;
+ case 'right':
+ $content = str_repeat(' ', $this->table['col_widths'][$col] - $this->strlen($content)) . $content;
+ break;
+ case 'center':
+ $paddingNeeded = $this->table['col_widths'][$col] - $this->strlen($content);
+ $left = floor($paddingNeeded / 2);
+ $right = $paddingNeeded - $left;
+ $content = str_repeat(' ', $left) . $content . str_repeat(' ', $right);
+ break;
+ }
+ }
+
+ /**
+ * handle <tr> tags
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTag_tr()
+ {
+ if ($this->parser->isStartTag) {
+ $this->col = -1;
+ } else {
+ $this->row++;
+ }
+ }
+
+ /**
+ * handle <td> tags
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTag_td()
+ {
+ if ($this->parser->isStartTag) {
+ $this->col++;
+ if (!isset($this->table['col_widths'][$this->col])) {
+ $this->table['col_widths'][$this->col] = 0;
+ }
+ $this->buffer();
+ } else {
+ $buffer = trim($this->unbuffer());
+ if (!isset($this->table['col_widths'][$this->col])) {
+ $this->table['col_widths'][$this->col] = 0;
+ }
+ $this->table['col_widths'][$this->col] = max($this->table['col_widths'][$this->col], $this->strlen($buffer));
+ $this->table['rows'][$this->row][$this->col] = $buffer;
+ }
+ }
+
+ /**
+ * handle <th> tags
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTag_th()
+ {
+ if (!$this->keepHTML && !isset($this->table['rows'][1]) && !isset($this->table['aligns'][$this->col + 1])) {
+ if (isset($this->parser->tagAttributes['align'])) {
+ $this->table['aligns'][$this->col + 1] = $this->parser->tagAttributes['align'];
+ } else {
+ $this->table['aligns'][$this->col + 1] = '';
+ }
+ }
+ $this->handleTag_td();
+ }
+
+ /**
+ * handle <dl> tags
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTag_dl()
+ {
+ if (!$this->parser->isStartTag) {
+ $this->setLineBreaks(2);
+ }
+ }
+
+ /**
+ * handle <dt> tags
+ *
+ * @param void
+ * @return void
+ **/
+ protected function handleTag_dt()
+ {
+ if (!$this->parser->isStartTag) {
+ $this->setLineBreaks(1);
+ }
+ }
+
+ /**
+ * handle <dd> tags
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTag_dd()
+ {
+ if ($this->parser->isStartTag) {
+ if (substr(ltrim($this->parser->html), 0, 3) == '<p>') {
+ // next comes a paragraph, so we'll need an extra line
+ $this->out("\n" . $this->indent);
+ } elseif (substr($this->output, -2) == "\n\n") {
+ $this->output = substr($this->output, 0, -1);
+ }
+ $this->out(': ');
+ $this->indent(' ', false);
+ } else {
+ // lookahead for next dt
+ if (substr(ltrim($this->parser->html), 0, 4) == '<dt>') {
+ $this->setLineBreaks(2);
+ } else {
+ $this->setLineBreaks(1);
+ }
+ $this->indent(' ');
+ }
+ }
+
+ /**
+ * handle <fnref /> tags (custom footnote references, see markdownify_extra::parseString())
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTag_fnref()
+ {
+ $this->out('[^' . $this->parser->tagAttributes['target'] . ']');
+ }
+
+ /**
+ * handle <fn> tags (custom footnotes, see markdownify_extra::parseString()
+ * and markdownify_extra::_makeFootnotes())
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTag_fn()
+ {
+ if ($this->parser->isStartTag) {
+ $this->out('[^' . $this->parser->tagAttributes['name'] . ']:');
+ $this->setLineBreaks(1);
+ } else {
+ $this->setLineBreaks(2);
+ }
+ $this->indent(' ');
+ }
+
+ /**
+ * handle <footnotes> tag (custom footnotes, see markdownify_extra::parseString()
+ * and markdownify_extra::_makeFootnotes())
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTag_footnotes()
+ {
+ if (!$this->parser->isStartTag) {
+ $this->setLineBreaks(2);
+ }
+ }
+
+ /**
+ * parse a HTML string, clean up footnotes prior
+ *
+ * @param string $HTML input
+ * @return string Markdown formatted output
+ */
+ public function parseString($html)
+ {
+ /** TODO: custom markdown-extra options, e.g. titles & classes **/
+ // <sup id="fnref:..."><a href"#fn..." rel="footnote">...</a></sup>
+ // => <fnref target="..." />
+ $html = preg_replace('@<sup id="fnref:([^"]+)">\s*<a href="#fn:\1" rel="footnote">\s*\d+\s*</a>\s*</sup>@Us', '<fnref target="$1" />', $html);
+ // <div class="footnotes">
+ // <hr />
+ // <ol>
+ //
+ // <li id="fn:...">...</li>
+ // ...
+ //
+ // </ol>
+ // </div>
+ // =>
+ // <footnotes>
+ // <fn name="...">...</fn>
+ // ...
+ // </footnotes>
+ $html = preg_replace_callback('#<div class="footnotes">\s*<hr />\s*<ol>\s*(.+)\s*</ol>\s*</div>#Us', array(&$this, '_makeFootnotes'), $html);
+
+ return parent::parseString($html);
+ }
+
+ /**
+ * replace HTML representation of footnotes with something more easily parsable
+ *
+ * @note this is a callback to be used in parseString()
+ *
+ * @param array $matches
+ * @return string
+ */
+ protected function _makeFootnotes($matches)
+ {
+ // <li id="fn:1">
+ // ...
+ // <a href="#fnref:block" rev="footnote">&#8617;</a></p>
+ // </li>
+ // => <fn name="1">...</fn>
+ // remove footnote link
+ $fns = preg_replace('@\s*(&#160;\s*)?<a href="#fnref:[^"]+" rev="footnote"[^>]*>&#8617;</a>\s*@s', '', $matches[1]);
+ // remove empty paragraph
+ $fns = preg_replace('@<p>\s*</p>@s', '', $fns);
+ // <li id="fn:1">...</li> -> <footnote nr="1">...</footnote>
+ $fns = str_replace('<li id="fn:', '<fn name="', $fns);
+
+ $fns = '<footnotes>' . $fns . '</footnotes>';
+
+ return preg_replace('#</li>\s*(?=(?:<fn|</footnotes>))#s', '</fn>$1', $fns);
+ }
+
+ /**
+ * handle <a> tags parsing
+ *
+ * @param void
+ * @return void
+ */
+ protected function getCurrentCssSelector()
+ {
+ $cssSelector = '';
+ if (isset($this->parser->tagAttributes['id'])) {
+ $cssSelector .= '#' . $this->decode($this->parser->tagAttributes['id']);
+ }
+ if (isset($this->parser->tagAttributes['class'])) {
+ $classes = explode(' ', $this->decode($this->parser->tagAttributes['class']));
+ $classes = array_filter($classes);
+ $cssSelector .= '.' . join('.', $classes);
+ }
+ return $cssSelector;
+ }
+}
diff --git a/vendor/pixel418/markdownify/src/Parser.php b/vendor/pixel418/markdownify/src/Parser.php
new file mode 100644
index 000000000..90fcdf9f8
--- /dev/null
+++ b/vendor/pixel418/markdownify/src/Parser.php
@@ -0,0 +1,564 @@
+<?php
+
+/* This file is part of the Markdownify project, which is under LGPL license */
+
+namespace Markdownify;
+
+class Parser
+{
+ public static $skipWhitespace = true;
+ public static $a_ord;
+ public static $z_ord;
+ public static $special_ords;
+
+ /**
+ * tags which are always empty (<br /> etc.)
+ *
+ * @var array<string>
+ */
+ public $emptyTags = array(
+ 'br',
+ 'hr',
+ 'input',
+ 'img',
+ 'area',
+ 'link',
+ 'meta',
+ 'param',
+ );
+
+ /**
+ * tags with preformatted text
+ * whitespaces wont be touched in them
+ *
+ * @var array<string>
+ */
+ public $preformattedTags = array(
+ 'script',
+ 'style',
+ 'pre',
+ 'code',
+ );
+
+ /**
+ * supress HTML tags inside preformatted tags (see above)
+ *
+ * @var bool
+ */
+ public $noTagsInCode = false;
+
+ /**
+ * html to be parsed
+ *
+ * @var string
+ */
+ public $html = '';
+
+ /**
+ * node type:
+ *
+ * - tag (see isStartTag)
+ * - text (includes cdata)
+ * - comment
+ * - doctype
+ * - pi (processing instruction)
+ *
+ * @var string
+ */
+ public $nodeType = '';
+
+ /**
+ * current node content, i.e. either a
+ * simple string (text node), or something like
+ * <tag attrib="value"...>
+ *
+ * @var string
+ */
+ public $node = '';
+
+ /**
+ * wether current node is an opening tag (<a>) or not (</a>)
+ * set to NULL if current node is not a tag
+ * NOTE: empty tags (<br />) set this to true as well!
+ *
+ * @var bool | null
+ */
+ public $isStartTag = null;
+
+ /**
+ * wether current node is an empty tag (<br />) or not (<a></a>)
+ *
+ * @var bool | null
+ */
+ public $isEmptyTag = null;
+
+ /**
+ * tag name
+ *
+ * @var string | null
+ */
+ public $tagName = '';
+
+ /**
+ * attributes of current tag
+ *
+ * @var array (attribName=>value) | null
+ */
+ public $tagAttributes = null;
+
+ /**
+ * whether or not the actual context is a inline context
+ *
+ * @var bool | null
+ */
+ public $isInlineContext = null;
+
+ /**
+ * whether the current tag is a block element
+ *
+ * @var bool | null
+ */
+ public $isBlockElement = null;
+
+ /**
+ * whether the previous tag (browser) is a block element
+ *
+ * @var bool | null
+ */
+ public $isNextToInlineContext = null;
+
+ /**
+ * keep whitespace
+ *
+ * @var int
+ */
+ public $keepWhitespace = 0;
+
+ /**
+ * list of open tags
+ * count this to get current depth
+ *
+ * @var array
+ */
+ public $openTags = array();
+
+ /**
+ * list of block elements
+ *
+ * @var array
+ * TODO: what shall we do with <del> and <ins> ?!
+ */
+ public $blockElements = array(
+ // tag name => <bool> is block
+ // block elements
+ 'address' => true,
+ 'blockquote' => true,
+ 'center' => true,
+ 'del' => true,
+ 'dir' => true,
+ 'div' => true,
+ 'dl' => true,
+ 'fieldset' => true,
+ 'form' => true,
+ 'h1' => true,
+ 'h2' => true,
+ 'h3' => true,
+ 'h4' => true,
+ 'h5' => true,
+ 'h6' => true,
+ 'hr' => true,
+ 'ins' => true,
+ 'isindex' => true,
+ 'menu' => true,
+ 'noframes' => true,
+ 'noscript' => true,
+ 'ol' => true,
+ 'p' => true,
+ 'pre' => true,
+ 'table' => true,
+ 'ul' => true,
+ // set table elements and list items to block as well
+ 'thead' => true,
+ 'tbody' => true,
+ 'tfoot' => true,
+ 'td' => true,
+ 'tr' => true,
+ 'th' => true,
+ 'li' => true,
+ 'dd' => true,
+ 'dt' => true,
+ // header items and html / body as well
+ 'html' => true,
+ 'body' => true,
+ 'head' => true,
+ 'meta' => true,
+ 'link' => true,
+ 'style' => true,
+ 'title' => true,
+ // unfancy media tags, when indented should be rendered as block
+ 'map' => true,
+ 'object' => true,
+ 'param' => true,
+ 'embed' => true,
+ 'area' => true,
+ // inline elements
+ 'a' => false,
+ 'abbr' => false,
+ 'acronym' => false,
+ 'applet' => false,
+ 'b' => false,
+ 'basefont' => false,
+ 'bdo' => false,
+ 'big' => false,
+ 'br' => false,
+ 'button' => false,
+ 'cite' => false,
+ 'code' => false,
+ 'del' => false,
+ 'dfn' => false,
+ 'em' => false,
+ 'font' => false,
+ 'i' => false,
+ 'img' => false,
+ 'ins' => false,
+ 'input' => false,
+ 'iframe' => false,
+ 'kbd' => false,
+ 'label' => false,
+ 'q' => false,
+ 'samp' => false,
+ 'script' => false,
+ 'select' => false,
+ 'small' => false,
+ 'span' => false,
+ 'strong' => false,
+ 'sub' => false,
+ 'sup' => false,
+ 'textarea' => false,
+ 'tt' => false,
+ 'var' => false,
+ );
+
+ /**
+ * get next node, set $this->html prior!
+ *
+ * @param void
+ * @return bool
+ */
+ public function nextNode()
+ {
+ if (empty($this->html)) {
+ // we are done with parsing the html string
+
+ return false;
+ }
+
+ if ($this->isStartTag && !$this->isEmptyTag) {
+ array_push($this->openTags, $this->tagName);
+ if (in_array($this->tagName, $this->preformattedTags)) {
+ // dont truncate whitespaces for <code> or <pre> contents
+ $this->keepWhitespace++;
+ }
+ }
+
+ if ($this->html[0] == '<') {
+ $token = substr($this->html, 0, 9);
+ if (substr($token, 0, 2) == '<?') {
+ // xml prolog or other pi's
+ /** TODO **/
+ // trigger_error('this might need some work', E_USER_NOTICE);
+ $pos = strpos($this->html, '>');
+ $this->setNode('pi', $pos + 1);
+
+ return true;
+ }
+ if (substr($token, 0, 4) == '<!--') {
+ // comment
+ $pos = strpos($this->html, '-->');
+ if ($pos === false) {
+ // could not find a closing -->, use next gt instead
+ // this is firefox' behaviour
+ $pos = strpos($this->html, '>') + 1;
+ } else {
+ $pos += 3;
+ }
+ $this->setNode('comment', $pos);
+
+ static::$skipWhitespace = true;
+
+ return true;
+ }
+ if ($token == '<!DOCTYPE') {
+ // doctype
+ $this->setNode('doctype', strpos($this->html, '>') + 1);
+
+ static::$skipWhitespace = true;
+
+ return true;
+ }
+ if ($token == '<![CDATA[') {
+ // cdata, use text node
+
+ // remove leading <![CDATA[
+ $this->html = substr($this->html, 9);
+
+ $this->setNode('text', strpos($this->html, ']]>') + 3);
+
+ // remove trailing ]]> and trim
+ $this->node = substr($this->node, 0, -3);
+ $this->handleWhitespaces();
+
+ static::$skipWhitespace = true;
+
+ return true;
+ }
+ if ($this->parseTag()) {
+ // seems to be a tag
+ // handle whitespaces
+ if ($this->isBlockElement) {
+ static::$skipWhitespace = true;
+ } else {
+ static::$skipWhitespace = false;
+ }
+
+ return true;
+ }
+ }
+ if ($this->keepWhitespace) {
+ static::$skipWhitespace = false;
+ }
+ // when we get here it seems to be a text node
+ $pos = strpos($this->html, '<');
+ if ($pos === false) {
+ $pos = strlen($this->html);
+ }
+ $this->setNode('text', $pos);
+ $this->handleWhitespaces();
+ if (static::$skipWhitespace && $this->node == ' ') {
+ return $this->nextNode();
+ }
+ $this->isInlineContext = true;
+ static::$skipWhitespace = false;
+
+ return true;
+ }
+
+ /**
+ * parse tag, set tag name and attributes, see if it's a closing tag and so forth...
+ *
+ * @param void
+ * @return bool
+ */
+ protected function parseTag()
+ {
+ if (!isset(static::$a_ord)) {
+ static::$a_ord = ord('a');
+ static::$z_ord = ord('z');
+ static::$special_ords = array(
+ ord(':'), // for xml:lang
+ ord('-'), // for http-equiv
+ );
+ }
+
+ $tagName = '';
+
+ $pos = 1;
+ $isStartTag = $this->html[$pos] != '/';
+ if (!$isStartTag) {
+ $pos++;
+ }
+ // get tagName
+ while (isset($this->html[$pos])) {
+ $pos_ord = ord(strtolower($this->html[$pos]));
+ if (($pos_ord >= static::$a_ord && $pos_ord <= static::$z_ord) || (!empty($tagName) && is_numeric($this->html[$pos]))) {
+ $tagName .= $this->html[$pos];
+ $pos++;
+ } else {
+ $pos--;
+ break;
+ }
+ }
+
+ $tagName = strtolower($tagName);
+ if (empty($tagName) || !isset($this->blockElements[$tagName])) {
+ // something went wrong => invalid tag
+ $this->invalidTag();
+
+ return false;
+ }
+ if ($this->noTagsInCode && end($this->openTags) == 'code' && !($tagName == 'code' && !$isStartTag)) {
+ // we supress all HTML tags inside code tags
+ $this->invalidTag();
+
+ return false;
+ }
+
+ // get tag attributes
+ /** TODO: in html 4 attributes do not need to be quoted **/
+ $isEmptyTag = false;
+ $attributes = array();
+ $currAttrib = '';
+ while (isset($this->html[$pos + 1])) {
+ $pos++;
+ // close tag
+ if ($this->html[$pos] == '>' || $this->html[$pos] . $this->html[$pos + 1] == '/>') {
+ if ($this->html[$pos] == '/') {
+ $isEmptyTag = true;
+ $pos++;
+ }
+ break;
+ }
+
+ $pos_ord = ord(strtolower($this->html[$pos]));
+ if (($pos_ord >= static::$a_ord && $pos_ord <= static::$z_ord) || in_array($pos_ord, static::$special_ords)) {
+ // attribute name
+ $currAttrib .= $this->html[$pos];
+ } elseif (in_array($this->html[$pos], array(' ', "\t", "\n"))) {
+ // drop whitespace
+ } elseif (in_array($this->html[$pos] . $this->html[$pos + 1], array('="', "='"))) {
+ // get attribute value
+ $pos++;
+ $await = $this->html[$pos]; // single or double quote
+ $pos++;
+ $value = '';
+ while (isset($this->html[$pos]) && $this->html[$pos] != $await) {
+ $value .= $this->html[$pos];
+ $pos++;
+ }
+ $attributes[$currAttrib] = $value;
+ $currAttrib = '';
+ } else {
+ $this->invalidTag();
+
+ return false;
+ }
+ }
+ if ($this->html[$pos] != '>') {
+ $this->invalidTag();
+
+ return false;
+ }
+
+ if (!empty($currAttrib)) {
+ // html 4 allows something like <option selected> instead of <option selected="selected">
+ $attributes[$currAttrib] = $currAttrib;
+ }
+ if (!$isStartTag) {
+ if (!empty($attributes) || $tagName != end($this->openTags)) {
+ // end tags must not contain any attributes
+ // or maybe we did not expect a different tag to be closed
+ $this->invalidTag();
+
+ return false;
+ }
+ array_pop($this->openTags);
+ if (in_array($tagName, $this->preformattedTags)) {
+ $this->keepWhitespace--;
+ }
+ }
+ $pos++;
+ $this->node = substr($this->html, 0, $pos);
+ $this->html = substr($this->html, $pos);
+ $this->tagName = $tagName;
+ $this->tagAttributes = $attributes;
+ $this->isStartTag = $isStartTag;
+ $this->isEmptyTag = $isEmptyTag || in_array($tagName, $this->emptyTags);
+ if ($this->isEmptyTag) {
+ // might be not well formed
+ $this->node = preg_replace('# */? *>$#', ' />', $this->node);
+ }
+ $this->nodeType = 'tag';
+ $this->isBlockElement = $this->blockElements[$tagName];
+ $this->isNextToInlineContext = $isStartTag && $this->isInlineContext;
+ $this->isInlineContext = !$this->isBlockElement;
+ return true;
+ }
+
+ /**
+ * handle invalid tags
+ *
+ * @param void
+ * @return void
+ */
+ protected function invalidTag()
+ {
+ $this->html = substr_replace($this->html, '&lt;', 0, 1);
+ }
+
+ /**
+ * update all vars and make $this->html shorter
+ *
+ * @param string $type see description for $this->nodeType
+ * @param int $pos to which position shall we cut?
+ * @return void
+ */
+ protected function setNode($type, $pos)
+ {
+ if ($this->nodeType == 'tag') {
+ // set tag specific vars to null
+ // $type == tag should not be called here
+ // see this::parseTag() for more
+ $this->tagName = null;
+ $this->tagAttributes = null;
+ $this->isStartTag = null;
+ $this->isEmptyTag = null;
+ $this->isBlockElement = null;
+
+ }
+ $this->nodeType = $type;
+ $this->node = substr($this->html, 0, $pos);
+ $this->html = substr($this->html, $pos);
+ }
+
+ /**
+ * check if $this->html begins with $str
+ *
+ * @param string $str
+ * @return bool
+ */
+ protected function match($str)
+ {
+ return substr($this->html, 0, strlen($str)) == $str;
+ }
+
+ /**
+ * truncate whitespaces
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleWhitespaces()
+ {
+ if ($this->keepWhitespace) {
+ // <pre> or <code> before...
+
+ return;
+ }
+ // truncate multiple whitespaces to a single one
+ $this->node = preg_replace('#\s+#s', ' ', $this->node);
+ }
+
+ /**
+ * normalize self::node
+ *
+ * @param void
+ * @return void
+ */
+ protected function normalizeNode()
+ {
+ $this->node = '<';
+ if (!$this->isStartTag) {
+ $this->node .= '/' . $this->tagName . '>';
+
+ return;
+ }
+ $this->node .= $this->tagName;
+ foreach ($this->tagAttributes as $name => $value) {
+ $this->node .= ' ' . $name . '="' . str_replace('"', '&quot;', $value) . '"';
+ }
+ if ($this->isEmptyTag) {
+ $this->node .= ' /';
+ }
+ $this->node .= '>';
+ }
+}
diff --git a/library/simplepie/LICENSE.txt b/vendor/simplepie/simplepie/LICENSE.txt
index a822a4bd9..a822a4bd9 100644
--- a/library/simplepie/LICENSE.txt
+++ b/vendor/simplepie/simplepie/LICENSE.txt
diff --git a/vendor/simplepie/simplepie/README.markdown b/vendor/simplepie/simplepie/README.markdown
new file mode 100644
index 000000000..c346204d0
--- /dev/null
+++ b/vendor/simplepie/simplepie/README.markdown
@@ -0,0 +1,113 @@
+SimplePie
+=========
+
+SimplePie is a very fast and easy-to-use class, written in PHP, that puts the
+'simple' back into 'really simple syndication'. Flexible enough to suit
+beginners and veterans alike, SimplePie is focused on [speed, ease of use,
+compatibility and standards compliance][what_is].
+
+[what_is]: http://simplepie.org/wiki/faq/what_is_simplepie
+
+
+Requirements
+------------
+* PHP 5.3.0+ (5.3.6+ recommended since SimplePie 1.4.2)
+ * Support for PHP 5.2 stopped in branch `one-dot-three`
+ * Support for PHP 4 stopped in branch `one-dot-two`
+* libxml2 (certain 2.7.x releases are too buggy for words, and will crash)
+* One of iconv, mbstring or intl extensions
+* cURL or fsockopen()
+* PCRE support
+
+
+What comes in the package?
+--------------------------
+1. `library/` - SimplePie classes for use with the autoloader
+2. `autoloader.php` - The SimplePie Autoloader if you want to use the separate
+ file version.
+3. `README.markdown` - This document.
+4. `LICENSE.txt` - A copy of the BSD license.
+5. `compatibility_test/` - The SimplePie compatibility test that checks your
+ server for required settings.
+6. `demo/` - A basic feed reader demo that shows off some of SimplePie's more
+ noticeable features.
+7. `idn/` - A third-party library that SimplePie can optionally use to
+ understand Internationalized Domain Names (IDNs).
+8. `build/` - Scripts related to generating pieces of SimplePie
+9. `test/` - SimplePie's unit test suite.
+
+### Where's `simplepie.inc`?
+Since SimplePie 1.3, we've split the classes into separate files to make it easier
+to maintain and use.
+
+If you'd like a single monolithic file, you can run `php build/compile.php` to
+generate `SimplePie.compiled.php`.
+
+To start the demo
+-----------------
+1. Upload this package to your webserver.
+2. Make sure that the cache folder inside of the demo folder is server-writable.
+3. Navigate your browser to the demo folder.
+
+
+Need support?
+-------------
+For further setup and install documentation, function references, etc., visit
+[the wiki][wiki]. If you're using the latest version off GitHub, you can also
+check out the [API documentation][].
+
+If you can't find an answer to your question in the documentation, head on over
+to one of our [support channels][]. For bug reports and feature requests, visit
+the [issue tracker][].
+
+[API documentation]: http://dev.simplepie.org/api/
+[wiki]: http://simplepie.org/wiki/
+[support channels]: http://simplepie.org/support/
+[issue tracker]: http://github.com/simplepie/simplepie/issues
+
+
+Project status
+--------------
+SimplePie is currently maintained by Malcolm Blaney.
+
+As an open source project, SimplePie is maintained on a somewhat sporadic basis.
+This means that feature requests may not be fulfilled straight away, as time has
+to be prioritized.
+
+If you'd like to contribute to SimplePie, the best way to get started is to fork
+the project on GitHub and send pull requests for patches. When doing so, please
+be aware of our [coding standards][].
+
+[coding standards]: http://simplepie.org/wiki/misc/coding_standards
+
+
+Authors and contributors
+------------------------
+### Current
+* [Malcolm Blaney][] (Maintainer, support)
+
+### Alumni
+* [Ryan McCue][] (developer, support)
+* [Ryan Parman][] (Creator, developer, evangelism, support)
+* [Geoffrey Sneddon][] (Lead developer)
+* [Michael Shipley][] (Submitter of patches, support)
+* [Steve Minutillo][] (Submitter of patches)
+
+[Malcolm Blaney]: https://unicyclic.com/mal
+[Ryan McCue]: http://ryanmccue.info
+[Ryan Parman]: http://ryanparman.com
+[Geoffrey Sneddon]: http://gsnedders.com
+[Michael Shipley]: http://michaelpshipley.com
+[Steve Minutillo]: http://minutillo.com/steve/
+
+
+### Contributors
+For a complete list of contributors:
+
+1. Pull down the latest SimplePie code
+2. In the `simplepie` directory, run `git shortlog -ns`
+
+
+License
+-------
+[New BSD license](http://www.opensource.org/licenses/BSD-3-Clause)
diff --git a/vendor/simplepie/simplepie/autoloader.php b/vendor/simplepie/simplepie/autoloader.php
new file mode 100644
index 000000000..fd7690da2
--- /dev/null
+++ b/vendor/simplepie/simplepie/autoloader.php
@@ -0,0 +1,85 @@
+<?php
+/**
+ * SimplePie
+ *
+ * A PHP-Based RSS and Atom Feed Framework.
+ * Takes the hard work out of managing a complete RSS/Atom solution.
+ *
+ * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * * Neither the name of the SimplePie Team nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
+ * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @package SimplePie
+ * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @author Ryan Parman
+ * @author Geoffrey Sneddon
+ * @author Ryan McCue
+ * @link http://simplepie.org/ SimplePie
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ */
+
+
+// autoloader
+spl_autoload_register(array(new SimplePie_Autoloader(), 'autoload'));
+
+if (!class_exists('SimplePie'))
+{
+ trigger_error('Autoloader not registered properly', E_USER_ERROR);
+}
+
+/**
+ * Autoloader class
+ *
+ * @package SimplePie
+ * @subpackage API
+ */
+class SimplePie_Autoloader
+{
+ /**
+ * Constructor
+ */
+ public function __construct()
+ {
+ $this->path = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'library';
+ }
+
+ /**
+ * Autoloader
+ *
+ * @param string $class The name of the class to attempt to load.
+ */
+ public function autoload($class)
+ {
+ // Only load the class if it starts with "SimplePie"
+ if (strpos($class, 'SimplePie') !== 0)
+ {
+ return;
+ }
+
+ $filename = $this->path . DIRECTORY_SEPARATOR . str_replace('_', DIRECTORY_SEPARATOR, $class) . '.php';
+ include $filename;
+ }
+} \ No newline at end of file
diff --git a/vendor/simplepie/simplepie/composer.json b/vendor/simplepie/simplepie/composer.json
new file mode 100644
index 000000000..b5965b26f
--- /dev/null
+++ b/vendor/simplepie/simplepie/composer.json
@@ -0,0 +1,40 @@
+{
+ "name": "simplepie/simplepie",
+ "description": "A simple Atom/RSS parsing library for PHP",
+ "type": "library",
+ "keywords": ["rss", "atom", "feeds"],
+ "homepage": "http://simplepie.org/",
+ "license": "BSD-3-Clause",
+ "authors": [
+ {
+ "name": "Ryan Parman",
+ "homepage": "http://ryanparman.com/",
+ "role": "Creator, alumnus developer"
+ },
+ {
+ "name": "Geoffrey Sneddon",
+ "homepage": "http://gsnedders.com/",
+ "role": "Alumnus developer"
+ },
+ {
+ "name": "Ryan McCue",
+ "email": "me@ryanmccue.info",
+ "homepage": "http://ryanmccue.info/",
+ "role": "Developer"
+ }
+ ],
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4 || ~5"
+ },
+ "suggest": {
+ "mf2/mf2": "Microformat module that allows for parsing HTML for microformats"
+ },
+ "autoload": {
+ "psr-0": {
+ "SimplePie": "library"
+ }
+ }
+}
diff --git a/vendor/simplepie/simplepie/db.sql b/vendor/simplepie/simplepie/db.sql
new file mode 100644
index 000000000..879382940
--- /dev/null
+++ b/vendor/simplepie/simplepie/db.sql
@@ -0,0 +1,40 @@
+/* SQLite */
+CREATE TABLE cache_data (
+ id TEXT NOT NULL,
+ items SMALLINT NOT NULL DEFAULT 0,
+ data BLOB NOT NULL,
+ mtime INTEGER UNSIGNED NOT NULL
+);
+CREATE UNIQUE INDEX id ON cache_data(id);
+
+CREATE TABLE items (
+ feed_id TEXT NOT NULL,
+ id TEXT NOT NULL,
+ data TEXT NOT NULL,
+ posted INTEGER UNSIGNED NOT NULL
+);
+CREATE INDEX feed_id ON items(feed_id);
+
+
+/* MySQL */
+--- Don't paste this to create tables, since SimplePie will create
+--- tables by its own.
+CREATE TABLE `cache_data` (
+ `id` TEXT CHARACTER SET utf8 NOT NULL,
+ `items` SMALLINT NOT NULL DEFAULT 0,
+ `data` BLOB NOT NULL,
+ `mtime` INT UNSIGNED NOT NULL,
+ UNIQUE (
+ `id`(125)
+ )
+);
+
+CREATE TABLE `items` (
+ `feed_id` TEXT CHARACTER SET utf8 NOT NULL,
+ `id` TEXT CHARACTER SET utf8 NOT NULL,
+ `data` MEDIUMBLOB NOT NULL,
+ `posted` INT UNSIGNED NOT NULL,
+ INDEX `feed_id` (
+ `feed_id`(125)
+ )
+); \ No newline at end of file
diff --git a/library/simplepie/idn/LICENCE b/vendor/simplepie/simplepie/idn/LICENCE
index 25a1d22df..25a1d22df 100644
--- a/library/simplepie/idn/LICENCE
+++ b/vendor/simplepie/simplepie/idn/LICENCE
diff --git a/library/simplepie/idn/ReadMe.txt b/vendor/simplepie/simplepie/idn/ReadMe.txt
index 7ca8c7e6d..7ca8c7e6d 100644
--- a/library/simplepie/idn/ReadMe.txt
+++ b/vendor/simplepie/simplepie/idn/ReadMe.txt
diff --git a/vendor/simplepie/simplepie/idn/idna_convert.class.php b/vendor/simplepie/simplepie/idn/idna_convert.class.php
new file mode 100644
index 000000000..eb9d5f516
--- /dev/null
+++ b/vendor/simplepie/simplepie/idn/idna_convert.class.php
@@ -0,0 +1,969 @@
+<?php
+// {{{ license
+
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4 foldmethod=marker: */
+//
+// +----------------------------------------------------------------------+
+// | This library is free software; you can redistribute it and/or modify |
+// | it under the terms of the GNU Lesser General Public License as |
+// | published by the Free Software Foundation; either version 2.1 of the |
+// | License, or (at your option) any later version. |
+// | |
+// | This library is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | Lesser General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU Lesser General Public |
+// | License along with this library; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 |
+// | USA. |
+// +----------------------------------------------------------------------+
+//
+
+// }}}
+
+/**
+ * Encode/decode Internationalized Domain Names.
+ *
+ * The class allows to convert internationalized domain names
+ * (see RFC 3490 for details) as they can be used with various registries worldwide
+ * to be translated between their original (localized) form and their encoded form
+ * as it will be used in the DNS (Domain Name System).
+ *
+ * The class provides two public methods, encode() and decode(), which do exactly
+ * what you would expect them to do. You are allowed to use complete domain names,
+ * simple strings and complete email addresses as well. That means, that you might
+ * use any of the following notations:
+ *
+ * - www.nörgler.com
+ * - xn--nrgler-wxa
+ * - xn--brse-5qa.xn--knrz-1ra.info
+ *
+ * Unicode input might be given as either UTF-8 string, UCS-4 string or UCS-4
+ * array. Unicode output is available in the same formats.
+ * You can select your preferred format via {@link set_paramter()}.
+ *
+ * ACE input and output is always expected to be ASCII.
+ *
+ * @author Matthias Sommerfeld <mso@phlylabs.de>
+ * @copyright 2004-2007 phlyLabs Berlin, http://phlylabs.de
+ * @version 0.5.1
+ *
+ */
+class idna_convert
+{
+ /**
+ * Holds all relevant mapping tables, loaded from a seperate file on construct
+ * See RFC3454 for details
+ *
+ * @var array
+ * @access private
+ */
+ var $NP = array();
+
+ // Internal settings, do not mess with them
+ var $_punycode_prefix = 'xn--';
+ var $_invalid_ucs = 0x80000000;
+ var $_max_ucs = 0x10FFFF;
+ var $_base = 36;
+ var $_tmin = 1;
+ var $_tmax = 26;
+ var $_skew = 38;
+ var $_damp = 700;
+ var $_initial_bias = 72;
+ var $_initial_n = 0x80;
+ var $_sbase = 0xAC00;
+ var $_lbase = 0x1100;
+ var $_vbase = 0x1161;
+ var $_tbase = 0x11A7;
+ var $_lcount = 19;
+ var $_vcount = 21;
+ var $_tcount = 28;
+ var $_ncount = 588; // _vcount * _tcount
+ var $_scount = 11172; // _lcount * _tcount * _vcount
+ var $_error = false;
+
+ // See {@link set_paramter()} for details of how to change the following
+ // settings from within your script / application
+ var $_api_encoding = 'utf8'; // Default input charset is UTF-8
+ var $_allow_overlong = false; // Overlong UTF-8 encodings are forbidden
+ var $_strict_mode = false; // Behave strict or not
+
+ // The constructor
+ function __construct($options = false)
+ {
+ $this->slast = $this->_sbase + $this->_lcount * $this->_vcount * $this->_tcount;
+ if (function_exists('file_get_contents')) {
+ $this->NP = unserialize(file_get_contents(dirname(__FILE__).'/npdata.ser'));
+ } else {
+ $this->NP = unserialize(join('', file(dirname(__FILE__).'/npdata.ser')));
+ }
+ // If parameters are given, pass these to the respective method
+ if (is_array($options)) {
+ return $this->set_parameter($options);
+ }
+ return true;
+ }
+
+ /**
+ * Sets a new option value. Available options and values:
+ * [encoding - Use either UTF-8, UCS4 as array or UCS4 as string as input ('utf8' for UTF-8,
+ * 'ucs4_string' and 'ucs4_array' respectively for UCS4); The output is always UTF-8]
+ * [overlong - Unicode does not allow unnecessarily long encodings of chars,
+ * to allow this, set this parameter to true, else to false;
+ * default is false.]
+ * [strict - true: strict mode, good for registration purposes - Causes errors
+ * on failures; false: loose mode, ideal for "wildlife" applications
+ * by silently ignoring errors and returning the original input instead
+ *
+ * @param mixed Parameter to set (string: single parameter; array of Parameter => Value pairs)
+ * @param string Value to use (if parameter 1 is a string)
+ * @return boolean true on success, false otherwise
+ * @access public
+ */
+ function set_parameter($option, $value = false)
+ {
+ if (!is_array($option)) {
+ $option = array($option => $value);
+ }
+ foreach ($option as $k => $v) {
+ switch ($k) {
+ case 'encoding':
+ switch ($v) {
+ case 'utf8':
+ case 'ucs4_string':
+ case 'ucs4_array':
+ $this->_api_encoding = $v;
+ break;
+ default:
+ $this->_error('Set Parameter: Unknown parameter '.$v.' for option '.$k);
+ return false;
+ }
+ break;
+ case 'overlong':
+ $this->_allow_overlong = ($v) ? true : false;
+ break;
+ case 'strict':
+ $this->_strict_mode = ($v) ? true : false;
+ break;
+ default:
+ $this->_error('Set Parameter: Unknown option '.$k);
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Decode a given ACE domain name
+ * @param string Domain name (ACE string)
+ * [@param string Desired output encoding, see {@link set_parameter}]
+ * @return string Decoded Domain name (UTF-8 or UCS-4)
+ * @access public
+ */
+ function decode($input, $one_time_encoding = false)
+ {
+ // Optionally set
+ if ($one_time_encoding) {
+ switch ($one_time_encoding) {
+ case 'utf8':
+ case 'ucs4_string':
+ case 'ucs4_array':
+ break;
+ default:
+ $this->_error('Unknown encoding '.$one_time_encoding);
+ return false;
+ }
+ }
+ // Make sure to drop any newline characters around
+ $input = trim($input);
+
+ // Negotiate input and try to determine, whether it is a plain string,
+ // an email address or something like a complete URL
+ if (strpos($input, '@')) { // Maybe it is an email address
+ // No no in strict mode
+ if ($this->_strict_mode) {
+ $this->_error('Only simple domain name parts can be handled in strict mode');
+ return false;
+ }
+ list ($email_pref, $input) = explode('@', $input, 2);
+ $arr = explode('.', $input);
+ foreach ($arr as $k => $v) {
+ if (preg_match('!^'.preg_quote($this->_punycode_prefix, '!').'!', $v)) {
+ $conv = $this->_decode($v);
+ if ($conv) $arr[$k] = $conv;
+ }
+ }
+ $input = join('.', $arr);
+ $arr = explode('.', $email_pref);
+ foreach ($arr as $k => $v) {
+ if (preg_match('!^'.preg_quote($this->_punycode_prefix, '!').'!', $v)) {
+ $conv = $this->_decode($v);
+ if ($conv) $arr[$k] = $conv;
+ }
+ }
+ $email_pref = join('.', $arr);
+ $return = $email_pref . '@' . $input;
+ } elseif (preg_match('![:\./]!', $input)) { // Or a complete domain name (with or without paths / parameters)
+ // No no in strict mode
+ if ($this->_strict_mode) {
+ $this->_error('Only simple domain name parts can be handled in strict mode');
+ return false;
+ }
+ $parsed = parse_url($input);
+ if (isset($parsed['host'])) {
+ $arr = explode('.', $parsed['host']);
+ foreach ($arr as $k => $v) {
+ $conv = $this->_decode($v);
+ if ($conv) $arr[$k] = $conv;
+ }
+ $parsed['host'] = join('.', $arr);
+ $return =
+ (empty($parsed['scheme']) ? '' : $parsed['scheme'].(strtolower($parsed['scheme']) == 'mailto' ? ':' : '://'))
+ .(empty($parsed['user']) ? '' : $parsed['user'].(empty($parsed['pass']) ? '' : ':'.$parsed['pass']).'@')
+ .$parsed['host']
+ .(empty($parsed['port']) ? '' : ':'.$parsed['port'])
+ .(empty($parsed['path']) ? '' : $parsed['path'])
+ .(empty($parsed['query']) ? '' : '?'.$parsed['query'])
+ .(empty($parsed['fragment']) ? '' : '#'.$parsed['fragment']);
+ } else { // parse_url seems to have failed, try without it
+ $arr = explode('.', $input);
+ foreach ($arr as $k => $v) {
+ $conv = $this->_decode($v);
+ $arr[$k] = ($conv) ? $conv : $v;
+ }
+ $return = join('.', $arr);
+ }
+ } else { // Otherwise we consider it being a pure domain name string
+ $return = $this->_decode($input);
+ if (!$return) $return = $input;
+ }
+ // The output is UTF-8 by default, other output formats need conversion here
+ // If one time encoding is given, use this, else the objects property
+ switch (($one_time_encoding) ? $one_time_encoding : $this->_api_encoding) {
+ case 'utf8':
+ return $return;
+ break;
+ case 'ucs4_string':
+ return $this->_ucs4_to_ucs4_string($this->_utf8_to_ucs4($return));
+ break;
+ case 'ucs4_array':
+ return $this->_utf8_to_ucs4($return);
+ break;
+ default:
+ $this->_error('Unsupported output format');
+ return false;
+ }
+ }
+
+ /**
+ * Encode a given UTF-8 domain name
+ * @param string Domain name (UTF-8 or UCS-4)
+ * [@param string Desired input encoding, see {@link set_parameter}]
+ * @return string Encoded Domain name (ACE string)
+ * @access public
+ */
+ function encode($decoded, $one_time_encoding = false)
+ {
+ // Forcing conversion of input to UCS4 array
+ // If one time encoding is given, use this, else the objects property
+ switch ($one_time_encoding ? $one_time_encoding : $this->_api_encoding) {
+ case 'utf8':
+ $decoded = $this->_utf8_to_ucs4($decoded);
+ break;
+ case 'ucs4_string':
+ $decoded = $this->_ucs4_string_to_ucs4($decoded);
+ case 'ucs4_array':
+ break;
+ default:
+ $this->_error('Unsupported input format: '.($one_time_encoding ? $one_time_encoding : $this->_api_encoding));
+ return false;
+ }
+
+ // No input, no output, what else did you expect?
+ if (empty($decoded)) return '';
+
+ // Anchors for iteration
+ $last_begin = 0;
+ // Output string
+ $output = '';
+ foreach ($decoded as $k => $v) {
+ // Make sure to use just the plain dot
+ switch($v) {
+ case 0x3002:
+ case 0xFF0E:
+ case 0xFF61:
+ $decoded[$k] = 0x2E;
+ // Right, no break here, the above are converted to dots anyway
+ // Stumbling across an anchoring character
+ case 0x2E:
+ case 0x2F:
+ case 0x3A:
+ case 0x3F:
+ case 0x40:
+ // Neither email addresses nor URLs allowed in strict mode
+ if ($this->_strict_mode) {
+ $this->_error('Neither email addresses nor URLs are allowed in strict mode.');
+ return false;
+ } else {
+ // Skip first char
+ if ($k) {
+ $encoded = '';
+ $encoded = $this->_encode(array_slice($decoded, $last_begin, (($k)-$last_begin)));
+ if ($encoded) {
+ $output .= $encoded;
+ } else {
+ $output .= $this->_ucs4_to_utf8(array_slice($decoded, $last_begin, (($k)-$last_begin)));
+ }
+ $output .= chr($decoded[$k]);
+ }
+ $last_begin = $k + 1;
+ }
+ }
+ }
+ // Catch the rest of the string
+ if ($last_begin) {
+ $inp_len = sizeof($decoded);
+ $encoded = '';
+ $encoded = $this->_encode(array_slice($decoded, $last_begin, (($inp_len)-$last_begin)));
+ if ($encoded) {
+ $output .= $encoded;
+ } else {
+ $output .= $this->_ucs4_to_utf8(array_slice($decoded, $last_begin, (($inp_len)-$last_begin)));
+ }
+ return $output;
+ } else {
+ if ($output = $this->_encode($decoded)) {
+ return $output;
+ } else {
+ return $this->_ucs4_to_utf8($decoded);
+ }
+ }
+ }
+
+ /**
+ * Use this method to get the last error ocurred
+ * @param void
+ * @return string The last error, that occured
+ * @access public
+ */
+ function get_last_error()
+ {
+ return $this->_error;
+ }
+
+ /**
+ * The actual decoding algorithm
+ * @access private
+ */
+ function _decode($encoded)
+ {
+ // We do need to find the Punycode prefix
+ if (!preg_match('!^'.preg_quote($this->_punycode_prefix, '!').'!', $encoded)) {
+ $this->_error('This is not a punycode string');
+ return false;
+ }
+ $encode_test = preg_replace('!^'.preg_quote($this->_punycode_prefix, '!').'!', '', $encoded);
+ // If nothing left after removing the prefix, it is hopeless
+ if (!$encode_test) {
+ $this->_error('The given encoded string was empty');
+ return false;
+ }
+ // Find last occurence of the delimiter
+ $delim_pos = strrpos($encoded, '-');
+ if ($delim_pos > strlen($this->_punycode_prefix)) {
+ for ($k = strlen($this->_punycode_prefix); $k < $delim_pos; ++$k) {
+ $decoded[] = ord($encoded{$k});
+ }
+ } else {
+ $decoded = array();
+ }
+ $deco_len = count($decoded);
+ $enco_len = strlen($encoded);
+
+ // Wandering through the strings; init
+ $is_first = true;
+ $bias = $this->_initial_bias;
+ $idx = 0;
+ $char = $this->_initial_n;
+
+ for ($enco_idx = ($delim_pos) ? ($delim_pos + 1) : 0; $enco_idx < $enco_len; ++$deco_len) {
+ for ($old_idx = $idx, $w = 1, $k = $this->_base; 1 ; $k += $this->_base) {
+ $digit = $this->_decode_digit($encoded{$enco_idx++});
+ $idx += $digit * $w;
+ $t = ($k <= $bias) ? $this->_tmin :
+ (($k >= $bias + $this->_tmax) ? $this->_tmax : ($k - $bias));
+ if ($digit < $t) break;
+ $w = (int) ($w * ($this->_base - $t));
+ }
+ $bias = $this->_adapt($idx - $old_idx, $deco_len + 1, $is_first);
+ $is_first = false;
+ $char += (int) ($idx / ($deco_len + 1));
+ $idx %= ($deco_len + 1);
+ if ($deco_len > 0) {
+ // Make room for the decoded char
+ for ($i = $deco_len; $i > $idx; $i--) {
+ $decoded[$i] = $decoded[($i - 1)];
+ }
+ }
+ $decoded[$idx++] = $char;
+ }
+ return $this->_ucs4_to_utf8($decoded);
+ }
+
+ /**
+ * The actual encoding algorithm
+ * @access private
+ */
+ function _encode($decoded)
+ {
+ // We cannot encode a domain name containing the Punycode prefix
+ $extract = strlen($this->_punycode_prefix);
+ $check_pref = $this->_utf8_to_ucs4($this->_punycode_prefix);
+ $check_deco = array_slice($decoded, 0, $extract);
+
+ if ($check_pref == $check_deco) {
+ $this->_error('This is already a punycode string');
+ return false;
+ }
+ // We will not try to encode strings consisting of basic code points only
+ $encodable = false;
+ foreach ($decoded as $k => $v) {
+ if ($v > 0x7a) {
+ $encodable = true;
+ break;
+ }
+ }
+ if (!$encodable) {
+ $this->_error('The given string does not contain encodable chars');
+ return false;
+ }
+
+ // Do NAMEPREP
+ $decoded = $this->_nameprep($decoded);
+ if (!$decoded || !is_array($decoded)) return false; // NAMEPREP failed
+
+ $deco_len = count($decoded);
+ if (!$deco_len) return false; // Empty array
+
+ $codecount = 0; // How many chars have been consumed
+
+ $encoded = '';
+ // Copy all basic code points to output
+ for ($i = 0; $i < $deco_len; ++$i) {
+ $test = $decoded[$i];
+ // Will match [-0-9a-zA-Z]
+ if ((0x2F < $test && $test < 0x40) || (0x40 < $test && $test < 0x5B)
+ || (0x60 < $test && $test <= 0x7B) || (0x2D == $test)) {
+ $encoded .= chr($decoded[$i]);
+ $codecount++;
+ }
+ }
+ if ($codecount == $deco_len) return $encoded; // All codepoints were basic ones
+
+ // Start with the prefix; copy it to output
+ $encoded = $this->_punycode_prefix.$encoded;
+
+ // If we have basic code points in output, add an hyphen to the end
+ if ($codecount) $encoded .= '-';
+
+ // Now find and encode all non-basic code points
+ $is_first = true;
+ $cur_code = $this->_initial_n;
+ $bias = $this->_initial_bias;
+ $delta = 0;
+ while ($codecount < $deco_len) {
+ // Find the smallest code point >= the current code point and
+ // remember the last ouccrence of it in the input
+ for ($i = 0, $next_code = $this->_max_ucs; $i < $deco_len; $i++) {
+ if ($decoded[$i] >= $cur_code && $decoded[$i] <= $next_code) {
+ $next_code = $decoded[$i];
+ }
+ }
+
+ $delta += ($next_code - $cur_code) * ($codecount + 1);
+ $cur_code = $next_code;
+
+ // Scan input again and encode all characters whose code point is $cur_code
+ for ($i = 0; $i < $deco_len; $i++) {
+ if ($decoded[$i] < $cur_code) {
+ $delta++;
+ } elseif ($decoded[$i] == $cur_code) {
+ for ($q = $delta, $k = $this->_base; 1; $k += $this->_base) {
+ $t = ($k <= $bias) ? $this->_tmin :
+ (($k >= $bias + $this->_tmax) ? $this->_tmax : $k - $bias);
+ if ($q < $t) break;
+ $encoded .= $this->_encode_digit(intval($t + (($q - $t) % ($this->_base - $t)))); //v0.4.5 Changed from ceil() to intval()
+ $q = (int) (($q - $t) / ($this->_base - $t));
+ }
+ $encoded .= $this->_encode_digit($q);
+ $bias = $this->_adapt($delta, $codecount+1, $is_first);
+ $codecount++;
+ $delta = 0;
+ $is_first = false;
+ }
+ }
+ $delta++;
+ $cur_code++;
+ }
+ return $encoded;
+ }
+
+ /**
+ * Adapt the bias according to the current code point and position
+ * @access private
+ */
+ function _adapt($delta, $npoints, $is_first)
+ {
+ $delta = intval($is_first ? ($delta / $this->_damp) : ($delta / 2));
+ $delta += intval($delta / $npoints);
+ for ($k = 0; $delta > (($this->_base - $this->_tmin) * $this->_tmax) / 2; $k += $this->_base) {
+ $delta = intval($delta / ($this->_base - $this->_tmin));
+ }
+ return intval($k + ($this->_base - $this->_tmin + 1) * $delta / ($delta + $this->_skew));
+ }
+
+ /**
+ * Encoding a certain digit
+ * @access private
+ */
+ function _encode_digit($d)
+ {
+ return chr($d + 22 + 75 * ($d < 26));
+ }
+
+ /**
+ * Decode a certain digit
+ * @access private
+ */
+ function _decode_digit($cp)
+ {
+ $cp = ord($cp);
+ return ($cp - 48 < 10) ? $cp - 22 : (($cp - 65 < 26) ? $cp - 65 : (($cp - 97 < 26) ? $cp - 97 : $this->_base));
+ }
+
+ /**
+ * Internal error handling method
+ * @access private
+ */
+ function _error($error = '')
+ {
+ $this->_error = $error;
+ }
+
+ /**
+ * Do Nameprep according to RFC3491 and RFC3454
+ * @param array Unicode Characters
+ * @return string Unicode Characters, Nameprep'd
+ * @access private
+ */
+ function _nameprep($input)
+ {
+ $output = array();
+ $error = false;
+ //
+ // Mapping
+ // Walking through the input array, performing the required steps on each of
+ // the input chars and putting the result into the output array
+ // While mapping required chars we apply the cannonical ordering
+ foreach ($input as $v) {
+ // Map to nothing == skip that code point
+ if (in_array($v, $this->NP['map_nothing'])) continue;
+
+ // Try to find prohibited input
+ if (in_array($v, $this->NP['prohibit']) || in_array($v, $this->NP['general_prohibited'])) {
+ $this->_error('NAMEPREP: Prohibited input U+'.sprintf('%08X', $v));
+ return false;
+ }
+ foreach ($this->NP['prohibit_ranges'] as $range) {
+ if ($range[0] <= $v && $v <= $range[1]) {
+ $this->_error('NAMEPREP: Prohibited input U+'.sprintf('%08X', $v));
+ return false;
+ }
+ }
+ //
+ // Hangul syllable decomposition
+ if (0xAC00 <= $v && $v <= 0xD7AF) {
+ foreach ($this->_hangul_decompose($v) as $out) {
+ $output[] = (int) $out;
+ }
+ // There's a decomposition mapping for that code point
+ } elseif (isset($this->NP['replacemaps'][$v])) {
+ foreach ($this->_apply_cannonical_ordering($this->NP['replacemaps'][$v]) as $out) {
+ $output[] = (int) $out;
+ }
+ } else {
+ $output[] = (int) $v;
+ }
+ }
+ // Before applying any Combining, try to rearrange any Hangul syllables
+ $output = $this->_hangul_compose($output);
+ //
+ // Combine code points
+ //
+ $last_class = 0;
+ $last_starter = 0;
+ $out_len = count($output);
+ for ($i = 0; $i < $out_len; ++$i) {
+ $class = $this->_get_combining_class($output[$i]);
+ if ((!$last_class || $last_class > $class) && $class) {
+ // Try to match
+ $seq_len = $i - $last_starter;
+ $out = $this->_combine(array_slice($output, $last_starter, $seq_len));
+ // On match: Replace the last starter with the composed character and remove
+ // the now redundant non-starter(s)
+ if ($out) {
+ $output[$last_starter] = $out;
+ if (count($out) != $seq_len) {
+ for ($j = $i+1; $j < $out_len; ++$j) {
+ $output[$j-1] = $output[$j];
+ }
+ unset($output[$out_len]);
+ }
+ // Rewind the for loop by one, since there can be more possible compositions
+ $i--;
+ $out_len--;
+ $last_class = ($i == $last_starter) ? 0 : $this->_get_combining_class($output[$i-1]);
+ continue;
+ }
+ }
+ // The current class is 0
+ if (!$class) $last_starter = $i;
+ $last_class = $class;
+ }
+ return $output;
+ }
+
+ /**
+ * Decomposes a Hangul syllable
+ * (see http://www.unicode.org/unicode/reports/tr15/#Hangul
+ * @param integer 32bit UCS4 code point
+ * @return array Either Hangul Syllable decomposed or original 32bit value as one value array
+ * @access private
+ */
+ function _hangul_decompose($char)
+ {
+ $sindex = (int) $char - $this->_sbase;
+ if ($sindex < 0 || $sindex >= $this->_scount) {
+ return array($char);
+ }
+ $result = array();
+ $result[] = (int) $this->_lbase + $sindex / $this->_ncount;
+ $result[] = (int) $this->_vbase + ($sindex % $this->_ncount) / $this->_tcount;
+ $T = intval($this->_tbase + $sindex % $this->_tcount);
+ if ($T != $this->_tbase) $result[] = $T;
+ return $result;
+ }
+ /**
+ * Ccomposes a Hangul syllable
+ * (see http://www.unicode.org/unicode/reports/tr15/#Hangul
+ * @param array Decomposed UCS4 sequence
+ * @return array UCS4 sequence with syllables composed
+ * @access private
+ */
+ function _hangul_compose($input)
+ {
+ $inp_len = count($input);
+ if (!$inp_len) return array();
+ $result = array();
+ $last = (int) $input[0];
+ $result[] = $last; // copy first char from input to output
+
+ for ($i = 1; $i < $inp_len; ++$i) {
+ $char = (int) $input[$i];
+ $sindex = $last - $this->_sbase;
+ $lindex = $last - $this->_lbase;
+ $vindex = $char - $this->_vbase;
+ $tindex = $char - $this->_tbase;
+ // Find out, whether two current characters are LV and T
+ if (0 <= $sindex && $sindex < $this->_scount && ($sindex % $this->_tcount == 0)
+ && 0 <= $tindex && $tindex <= $this->_tcount) {
+ // create syllable of form LVT
+ $last += $tindex;
+ $result[(count($result) - 1)] = $last; // reset last
+ continue; // discard char
+ }
+ // Find out, whether two current characters form L and V
+ if (0 <= $lindex && $lindex < $this->_lcount && 0 <= $vindex && $vindex < $this->_vcount) {
+ // create syllable of form LV
+ $last = (int) $this->_sbase + ($lindex * $this->_vcount + $vindex) * $this->_tcount;
+ $result[(count($result) - 1)] = $last; // reset last
+ continue; // discard char
+ }
+ // if neither case was true, just add the character
+ $last = $char;
+ $result[] = $char;
+ }
+ return $result;
+ }
+
+ /**
+ * Returns the combining class of a certain wide char
+ * @param integer Wide char to check (32bit integer)
+ * @return integer Combining class if found, else 0
+ * @access private
+ */
+ function _get_combining_class($char)
+ {
+ return isset($this->NP['norm_combcls'][$char]) ? $this->NP['norm_combcls'][$char] : 0;
+ }
+
+ /**
+ * Apllies the cannonical ordering of a decomposed UCS4 sequence
+ * @param array Decomposed UCS4 sequence
+ * @return array Ordered USC4 sequence
+ * @access private
+ */
+ function _apply_cannonical_ordering($input)
+ {
+ $swap = true;
+ $size = count($input);
+ while ($swap) {
+ $swap = false;
+ $last = $this->_get_combining_class(intval($input[0]));
+ for ($i = 0; $i < $size-1; ++$i) {
+ $next = $this->_get_combining_class(intval($input[$i+1]));
+ if ($next != 0 && $last > $next) {
+ // Move item leftward until it fits
+ for ($j = $i + 1; $j > 0; --$j) {
+ if ($this->_get_combining_class(intval($input[$j-1])) <= $next) break;
+ $t = intval($input[$j]);
+ $input[$j] = intval($input[$j-1]);
+ $input[$j-1] = $t;
+ $swap = true;
+ }
+ // Reentering the loop looking at the old character again
+ $next = $last;
+ }
+ $last = $next;
+ }
+ }
+ return $input;
+ }
+
+ /**
+ * Do composition of a sequence of starter and non-starter
+ * @param array UCS4 Decomposed sequence
+ * @return array Ordered USC4 sequence
+ * @access private
+ */
+ function _combine($input)
+ {
+ $inp_len = count($input);
+ foreach ($this->NP['replacemaps'] as $np_src => $np_target) {
+ if ($np_target[0] != $input[0]) continue;
+ if (count($np_target) != $inp_len) continue;
+ $hit = false;
+ foreach ($input as $k2 => $v2) {
+ if ($v2 == $np_target[$k2]) {
+ $hit = true;
+ } else {
+ $hit = false;
+ break;
+ }
+ }
+ if ($hit) return $np_src;
+ }
+ return false;
+ }
+
+ /**
+ * This converts an UTF-8 encoded string to its UCS-4 representation
+ * By talking about UCS-4 "strings" we mean arrays of 32bit integers representing
+ * each of the "chars". This is due to PHP not being able to handle strings with
+ * bit depth different from 8. This apllies to the reverse method _ucs4_to_utf8(), too.
+ * The following UTF-8 encodings are supported:
+ * bytes bits representation
+ * 1 7 0xxxxxxx
+ * 2 11 110xxxxx 10xxxxxx
+ * 3 16 1110xxxx 10xxxxxx 10xxxxxx
+ * 4 21 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
+ * 5 26 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
+ * 6 31 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
+ * Each x represents a bit that can be used to store character data.
+ * The five and six byte sequences are part of Annex D of ISO/IEC 10646-1:2000
+ * @access private
+ */
+ function _utf8_to_ucs4($input)
+ {
+ $output = array();
+ $out_len = 0;
+ $inp_len = strlen($input);
+ $mode = 'next';
+ $test = 'none';
+ for ($k = 0; $k < $inp_len; ++$k) {
+ $v = ord($input{$k}); // Extract byte from input string
+
+ if ($v < 128) { // We found an ASCII char - put into stirng as is
+ $output[$out_len] = $v;
+ ++$out_len;
+ if ('add' == $mode) {
+ $this->_error('Conversion from UTF-8 to UCS-4 failed: malformed input at byte '.$k);
+ return false;
+ }
+ continue;
+ }
+ if ('next' == $mode) { // Try to find the next start byte; determine the width of the Unicode char
+ $start_byte = $v;
+ $mode = 'add';
+ $test = 'range';
+ if ($v >> 5 == 6) { // &110xxxxx 10xxxxx
+ $next_byte = 0; // Tells, how many times subsequent bitmasks must rotate 6bits to the left
+ $v = ($v - 192) << 6;
+ } elseif ($v >> 4 == 14) { // &1110xxxx 10xxxxxx 10xxxxxx
+ $next_byte = 1;
+ $v = ($v - 224) << 12;
+ } elseif ($v >> 3 == 30) { // &11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
+ $next_byte = 2;
+ $v = ($v - 240) << 18;
+ } elseif ($v >> 2 == 62) { // &111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
+ $next_byte = 3;
+ $v = ($v - 248) << 24;
+ } elseif ($v >> 1 == 126) { // &1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
+ $next_byte = 4;
+ $v = ($v - 252) << 30;
+ } else {
+ $this->_error('This might be UTF-8, but I don\'t understand it at byte '.$k);
+ return false;
+ }
+ if ('add' == $mode) {
+ $output[$out_len] = (int) $v;
+ ++$out_len;
+ continue;
+ }
+ }
+ if ('add' == $mode) {
+ if (!$this->_allow_overlong && $test == 'range') {
+ $test = 'none';
+ if (($v < 0xA0 && $start_byte == 0xE0) || ($v < 0x90 && $start_byte == 0xF0) || ($v > 0x8F && $start_byte == 0xF4)) {
+ $this->_error('Bogus UTF-8 character detected (out of legal range) at byte '.$k);
+ return false;
+ }
+ }
+ if ($v >> 6 == 2) { // Bit mask must be 10xxxxxx
+ $v = ($v - 128) << ($next_byte * 6);
+ $output[($out_len - 1)] += $v;
+ --$next_byte;
+ } else {
+ $this->_error('Conversion from UTF-8 to UCS-4 failed: malformed input at byte '.$k);
+ return false;
+ }
+ if ($next_byte < 0) {
+ $mode = 'next';
+ }
+ }
+ } // for
+ return $output;
+ }
+
+ /**
+ * Convert UCS-4 string into UTF-8 string
+ * See _utf8_to_ucs4() for details
+ * @access private
+ */
+ function _ucs4_to_utf8($input)
+ {
+ $output = '';
+ $k = 0;
+ foreach ($input as $v) {
+ ++$k;
+ // $v = ord($v);
+ if ($v < 128) { // 7bit are transferred literally
+ $output .= chr($v);
+ } elseif ($v < (1 << 11)) { // 2 bytes
+ $output .= chr(192 + ($v >> 6)) . chr(128 + ($v & 63));
+ } elseif ($v < (1 << 16)) { // 3 bytes
+ $output .= chr(224 + ($v >> 12)) . chr(128 + (($v >> 6) & 63)) . chr(128 + ($v & 63));
+ } elseif ($v < (1 << 21)) { // 4 bytes
+ $output .= chr(240 + ($v >> 18)) . chr(128 + (($v >> 12) & 63))
+ . chr(128 + (($v >> 6) & 63)) . chr(128 + ($v & 63));
+ } elseif ($v < (1 << 26)) { // 5 bytes
+ $output .= chr(248 + ($v >> 24)) . chr(128 + (($v >> 18) & 63))
+ . chr(128 + (($v >> 12) & 63)) . chr(128 + (($v >> 6) & 63))
+ . chr(128 + ($v & 63));
+ } elseif ($v < (1 << 31)) { // 6 bytes
+ $output .= chr(252 + ($v >> 30)) . chr(128 + (($v >> 24) & 63))
+ . chr(128 + (($v >> 18) & 63)) . chr(128 + (($v >> 12) & 63))
+ . chr(128 + (($v >> 6) & 63)) . chr(128 + ($v & 63));
+ } else {
+ $this->_error('Conversion from UCS-4 to UTF-8 failed: malformed input at byte '.$k);
+ return false;
+ }
+ }
+ return $output;
+ }
+
+ /**
+ * Convert UCS-4 array into UCS-4 string
+ *
+ * @access private
+ */
+ function _ucs4_to_ucs4_string($input)
+ {
+ $output = '';
+ // Take array values and split output to 4 bytes per value
+ // The bit mask is 255, which reads &11111111
+ foreach ($input as $v) {
+ $output .= chr(($v >> 24) & 255).chr(($v >> 16) & 255).chr(($v >> 8) & 255).chr($v & 255);
+ }
+ return $output;
+ }
+
+ /**
+ * Convert UCS-4 strin into UCS-4 garray
+ *
+ * @access private
+ */
+ function _ucs4_string_to_ucs4($input)
+ {
+ $output = array();
+ $inp_len = strlen($input);
+ // Input length must be dividable by 4
+ if ($inp_len % 4) {
+ $this->_error('Input UCS4 string is broken');
+ return false;
+ }
+ // Empty input - return empty output
+ if (!$inp_len) return $output;
+ for ($i = 0, $out_len = -1; $i < $inp_len; ++$i) {
+ // Increment output position every 4 input bytes
+ if (!($i % 4)) {
+ $out_len++;
+ $output[$out_len] = 0;
+ }
+ $output[$out_len] += ord($input{$i}) << (8 * (3 - ($i % 4) ) );
+ }
+ return $output;
+ }
+}
+
+/**
+* Adapter class for aligning the API of idna_convert with that of Net_IDNA
+* @author Matthias Sommerfeld <mso@phlylabs.de>
+*/
+class Net_IDNA_php4 extends idna_convert
+{
+ /**
+ * Sets a new option value. Available options and values:
+ * [encoding - Use either UTF-8, UCS4 as array or UCS4 as string as input ('utf8' for UTF-8,
+ * 'ucs4_string' and 'ucs4_array' respectively for UCS4); The output is always UTF-8]
+ * [overlong - Unicode does not allow unnecessarily long encodings of chars,
+ * to allow this, set this parameter to true, else to false;
+ * default is false.]
+ * [strict - true: strict mode, good for registration purposes - Causes errors
+ * on failures; false: loose mode, ideal for "wildlife" applications
+ * by silently ignoring errors and returning the original input instead
+ *
+ * @param mixed Parameter to set (string: single parameter; array of Parameter => Value pairs)
+ * @param string Value to use (if parameter 1 is a string)
+ * @return boolean true on success, false otherwise
+ * @access public
+ */
+ function setParams($option, $param = false)
+ {
+ return $this->IC->set_parameters($option, $param);
+ }
+}
+
+?>
diff --git a/library/simplepie/idn/npdata.ser b/vendor/simplepie/simplepie/idn/npdata.ser
index d7ce6d03f..d7ce6d03f 100644
--- a/library/simplepie/idn/npdata.ser
+++ b/vendor/simplepie/simplepie/idn/npdata.ser
diff --git a/vendor/simplepie/simplepie/library/SimplePie.php b/vendor/simplepie/simplepie/library/SimplePie.php
new file mode 100755
index 000000000..428bfc068
--- /dev/null
+++ b/vendor/simplepie/simplepie/library/SimplePie.php
@@ -0,0 +1,3303 @@
+<?php
+/**
+ * SimplePie
+ *
+ * A PHP-Based RSS and Atom Feed Framework.
+ * Takes the hard work out of managing a complete RSS/Atom solution.
+ *
+ * Copyright (c) 2004-2017, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * * Neither the name of the SimplePie Team nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
+ * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @package SimplePie
+ * @version 1.5
+ * @copyright 2004-2017 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @author Ryan Parman
+ * @author Geoffrey Sneddon
+ * @author Ryan McCue
+ * @link http://simplepie.org/ SimplePie
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ */
+
+/**
+ * SimplePie Name
+ */
+define('SIMPLEPIE_NAME', 'SimplePie');
+
+/**
+ * SimplePie Version
+ */
+define('SIMPLEPIE_VERSION', '1.5');
+
+/**
+ * SimplePie Build
+ * @todo Hardcode for release (there's no need to have to call SimplePie_Misc::get_build() only every load of simplepie.inc)
+ */
+define('SIMPLEPIE_BUILD', gmdate('YmdHis', SimplePie_Misc::get_build()));
+
+/**
+ * SimplePie Website URL
+ */
+define('SIMPLEPIE_URL', 'http://simplepie.org');
+
+/**
+ * SimplePie Useragent
+ * @see SimplePie::set_useragent()
+ */
+define('SIMPLEPIE_USERAGENT', SIMPLEPIE_NAME . '/' . SIMPLEPIE_VERSION . ' (Feed Parser; ' . SIMPLEPIE_URL . '; Allow like Gecko) Build/' . SIMPLEPIE_BUILD);
+
+/**
+ * SimplePie Linkback
+ */
+define('SIMPLEPIE_LINKBACK', '<a href="' . SIMPLEPIE_URL . '" title="' . SIMPLEPIE_NAME . ' ' . SIMPLEPIE_VERSION . '">' . SIMPLEPIE_NAME . '</a>');
+
+/**
+ * No Autodiscovery
+ * @see SimplePie::set_autodiscovery_level()
+ */
+define('SIMPLEPIE_LOCATOR_NONE', 0);
+
+/**
+ * Feed Link Element Autodiscovery
+ * @see SimplePie::set_autodiscovery_level()
+ */
+define('SIMPLEPIE_LOCATOR_AUTODISCOVERY', 1);
+
+/**
+ * Local Feed Extension Autodiscovery
+ * @see SimplePie::set_autodiscovery_level()
+ */
+define('SIMPLEPIE_LOCATOR_LOCAL_EXTENSION', 2);
+
+/**
+ * Local Feed Body Autodiscovery
+ * @see SimplePie::set_autodiscovery_level()
+ */
+define('SIMPLEPIE_LOCATOR_LOCAL_BODY', 4);
+
+/**
+ * Remote Feed Extension Autodiscovery
+ * @see SimplePie::set_autodiscovery_level()
+ */
+define('SIMPLEPIE_LOCATOR_REMOTE_EXTENSION', 8);
+
+/**
+ * Remote Feed Body Autodiscovery
+ * @see SimplePie::set_autodiscovery_level()
+ */
+define('SIMPLEPIE_LOCATOR_REMOTE_BODY', 16);
+
+/**
+ * All Feed Autodiscovery
+ * @see SimplePie::set_autodiscovery_level()
+ */
+define('SIMPLEPIE_LOCATOR_ALL', 31);
+
+/**
+ * No known feed type
+ */
+define('SIMPLEPIE_TYPE_NONE', 0);
+
+/**
+ * RSS 0.90
+ */
+define('SIMPLEPIE_TYPE_RSS_090', 1);
+
+/**
+ * RSS 0.91 (Netscape)
+ */
+define('SIMPLEPIE_TYPE_RSS_091_NETSCAPE', 2);
+
+/**
+ * RSS 0.91 (Userland)
+ */
+define('SIMPLEPIE_TYPE_RSS_091_USERLAND', 4);
+
+/**
+ * RSS 0.91 (both Netscape and Userland)
+ */
+define('SIMPLEPIE_TYPE_RSS_091', 6);
+
+/**
+ * RSS 0.92
+ */
+define('SIMPLEPIE_TYPE_RSS_092', 8);
+
+/**
+ * RSS 0.93
+ */
+define('SIMPLEPIE_TYPE_RSS_093', 16);
+
+/**
+ * RSS 0.94
+ */
+define('SIMPLEPIE_TYPE_RSS_094', 32);
+
+/**
+ * RSS 1.0
+ */
+define('SIMPLEPIE_TYPE_RSS_10', 64);
+
+/**
+ * RSS 2.0
+ */
+define('SIMPLEPIE_TYPE_RSS_20', 128);
+
+/**
+ * RDF-based RSS
+ */
+define('SIMPLEPIE_TYPE_RSS_RDF', 65);
+
+/**
+ * Non-RDF-based RSS (truly intended as syndication format)
+ */
+define('SIMPLEPIE_TYPE_RSS_SYNDICATION', 190);
+
+/**
+ * All RSS
+ */
+define('SIMPLEPIE_TYPE_RSS_ALL', 255);
+
+/**
+ * Atom 0.3
+ */
+define('SIMPLEPIE_TYPE_ATOM_03', 256);
+
+/**
+ * Atom 1.0
+ */
+define('SIMPLEPIE_TYPE_ATOM_10', 512);
+
+/**
+ * All Atom
+ */
+define('SIMPLEPIE_TYPE_ATOM_ALL', 768);
+
+/**
+ * All feed types
+ */
+define('SIMPLEPIE_TYPE_ALL', 1023);
+
+/**
+ * No construct
+ */
+define('SIMPLEPIE_CONSTRUCT_NONE', 0);
+
+/**
+ * Text construct
+ */
+define('SIMPLEPIE_CONSTRUCT_TEXT', 1);
+
+/**
+ * HTML construct
+ */
+define('SIMPLEPIE_CONSTRUCT_HTML', 2);
+
+/**
+ * XHTML construct
+ */
+define('SIMPLEPIE_CONSTRUCT_XHTML', 4);
+
+/**
+ * base64-encoded construct
+ */
+define('SIMPLEPIE_CONSTRUCT_BASE64', 8);
+
+/**
+ * IRI construct
+ */
+define('SIMPLEPIE_CONSTRUCT_IRI', 16);
+
+/**
+ * A construct that might be HTML
+ */
+define('SIMPLEPIE_CONSTRUCT_MAYBE_HTML', 32);
+
+/**
+ * All constructs
+ */
+define('SIMPLEPIE_CONSTRUCT_ALL', 63);
+
+/**
+ * Don't change case
+ */
+define('SIMPLEPIE_SAME_CASE', 1);
+
+/**
+ * Change to lowercase
+ */
+define('SIMPLEPIE_LOWERCASE', 2);
+
+/**
+ * Change to uppercase
+ */
+define('SIMPLEPIE_UPPERCASE', 4);
+
+/**
+ * PCRE for HTML attributes
+ */
+define('SIMPLEPIE_PCRE_HTML_ATTRIBUTE', '((?:[\x09\x0A\x0B\x0C\x0D\x20]+[^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3E][^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3D\x3E]*(?:[\x09\x0A\x0B\x0C\x0D\x20]*=[\x09\x0A\x0B\x0C\x0D\x20]*(?:"(?:[^"]*)"|\'(?:[^\']*)\'|(?:[^\x09\x0A\x0B\x0C\x0D\x20\x22\x27\x3E][^\x09\x0A\x0B\x0C\x0D\x20\x3E]*)?))?)*)[\x09\x0A\x0B\x0C\x0D\x20]*');
+
+/**
+ * PCRE for XML attributes
+ */
+define('SIMPLEPIE_PCRE_XML_ATTRIBUTE', '((?:\s+(?:(?:[^\s:]+:)?[^\s:]+)\s*=\s*(?:"(?:[^"]*)"|\'(?:[^\']*)\'))*)\s*');
+
+/**
+ * XML Namespace
+ */
+define('SIMPLEPIE_NAMESPACE_XML', 'http://www.w3.org/XML/1998/namespace');
+
+/**
+ * Atom 1.0 Namespace
+ */
+define('SIMPLEPIE_NAMESPACE_ATOM_10', 'http://www.w3.org/2005/Atom');
+
+/**
+ * Atom 0.3 Namespace
+ */
+define('SIMPLEPIE_NAMESPACE_ATOM_03', 'http://purl.org/atom/ns#');
+
+/**
+ * RDF Namespace
+ */
+define('SIMPLEPIE_NAMESPACE_RDF', 'http://www.w3.org/1999/02/22-rdf-syntax-ns#');
+
+/**
+ * RSS 0.90 Namespace
+ */
+define('SIMPLEPIE_NAMESPACE_RSS_090', 'http://my.netscape.com/rdf/simple/0.9/');
+
+/**
+ * RSS 1.0 Namespace
+ */
+define('SIMPLEPIE_NAMESPACE_RSS_10', 'http://purl.org/rss/1.0/');
+
+/**
+ * RSS 1.0 Content Module Namespace
+ */
+define('SIMPLEPIE_NAMESPACE_RSS_10_MODULES_CONTENT', 'http://purl.org/rss/1.0/modules/content/');
+
+/**
+ * RSS 2.0 Namespace
+ * (Stupid, I know, but I'm certain it will confuse people less with support.)
+ */
+define('SIMPLEPIE_NAMESPACE_RSS_20', '');
+
+/**
+ * DC 1.0 Namespace
+ */
+define('SIMPLEPIE_NAMESPACE_DC_10', 'http://purl.org/dc/elements/1.0/');
+
+/**
+ * DC 1.1 Namespace
+ */
+define('SIMPLEPIE_NAMESPACE_DC_11', 'http://purl.org/dc/elements/1.1/');
+
+/**
+ * W3C Basic Geo (WGS84 lat/long) Vocabulary Namespace
+ */
+define('SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO', 'http://www.w3.org/2003/01/geo/wgs84_pos#');
+
+/**
+ * GeoRSS Namespace
+ */
+define('SIMPLEPIE_NAMESPACE_GEORSS', 'http://www.georss.org/georss');
+
+/**
+ * Media RSS Namespace
+ */
+define('SIMPLEPIE_NAMESPACE_MEDIARSS', 'http://search.yahoo.com/mrss/');
+
+/**
+ * Wrong Media RSS Namespace. Caused by a long-standing typo in the spec.
+ */
+define('SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG', 'http://search.yahoo.com/mrss');
+
+/**
+ * Wrong Media RSS Namespace #2. New namespace introduced in Media RSS 1.5.
+ */
+define('SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG2', 'http://video.search.yahoo.com/mrss');
+
+/**
+ * Wrong Media RSS Namespace #3. A possible typo of the Media RSS 1.5 namespace.
+ */
+define('SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG3', 'http://video.search.yahoo.com/mrss/');
+
+/**
+ * Wrong Media RSS Namespace #4. New spec location after the RSS Advisory Board takes it over, but not a valid namespace.
+ */
+define('SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG4', 'http://www.rssboard.org/media-rss');
+
+/**
+ * Wrong Media RSS Namespace #5. A possible typo of the RSS Advisory Board URL.
+ */
+define('SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG5', 'http://www.rssboard.org/media-rss/');
+
+/**
+ * iTunes RSS Namespace
+ */
+define('SIMPLEPIE_NAMESPACE_ITUNES', 'http://www.itunes.com/dtds/podcast-1.0.dtd');
+
+/**
+ * XHTML Namespace
+ */
+define('SIMPLEPIE_NAMESPACE_XHTML', 'http://www.w3.org/1999/xhtml');
+
+/**
+ * IANA Link Relations Registry
+ */
+define('SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY', 'http://www.iana.org/assignments/relation/');
+
+/**
+ * No file source
+ */
+define('SIMPLEPIE_FILE_SOURCE_NONE', 0);
+
+/**
+ * Remote file source
+ */
+define('SIMPLEPIE_FILE_SOURCE_REMOTE', 1);
+
+/**
+ * Local file source
+ */
+define('SIMPLEPIE_FILE_SOURCE_LOCAL', 2);
+
+/**
+ * fsockopen() file source
+ */
+define('SIMPLEPIE_FILE_SOURCE_FSOCKOPEN', 4);
+
+/**
+ * cURL file source
+ */
+define('SIMPLEPIE_FILE_SOURCE_CURL', 8);
+
+/**
+ * file_get_contents() file source
+ */
+define('SIMPLEPIE_FILE_SOURCE_FILE_GET_CONTENTS', 16);
+
+
+
+/**
+ * SimplePie
+ *
+ * @package SimplePie
+ * @subpackage API
+ */
+class SimplePie
+{
+ /**
+ * @var array Raw data
+ * @access private
+ */
+ public $data = array();
+
+ /**
+ * @var mixed Error string
+ * @access private
+ */
+ public $error;
+
+ /**
+ * @var object Instance of SimplePie_Sanitize (or other class)
+ * @see SimplePie::set_sanitize_class()
+ * @access private
+ */
+ public $sanitize;
+
+ /**
+ * @var string SimplePie Useragent
+ * @see SimplePie::set_useragent()
+ * @access private
+ */
+ public $useragent = SIMPLEPIE_USERAGENT;
+
+ /**
+ * @var string Feed URL
+ * @see SimplePie::set_feed_url()
+ * @access private
+ */
+ public $feed_url;
+
+ /**
+ * @var string Original feed URL, or new feed URL iff HTTP 301 Moved Permanently
+ * @see SimplePie::subscribe_url()
+ * @access private
+ */
+ public $permanent_url = null;
+
+ /**
+ * @var object Instance of SimplePie_File to use as a feed
+ * @see SimplePie::set_file()
+ * @access private
+ */
+ public $file;
+
+ /**
+ * @var string Raw feed data
+ * @see SimplePie::set_raw_data()
+ * @access private
+ */
+ public $raw_data;
+
+ /**
+ * @var int Timeout for fetching remote files
+ * @see SimplePie::set_timeout()
+ * @access private
+ */
+ public $timeout = 10;
+
+ /**
+ * @var array Custom curl options
+ * @see SimplePie::set_curl_options()
+ * @access private
+ */
+ public $curl_options = array();
+
+ /**
+ * @var bool Forces fsockopen() to be used for remote files instead
+ * of cURL, even if a new enough version is installed
+ * @see SimplePie::force_fsockopen()
+ * @access private
+ */
+ public $force_fsockopen = false;
+
+ /**
+ * @var bool Force the given data/URL to be treated as a feed no matter what
+ * it appears like
+ * @see SimplePie::force_feed()
+ * @access private
+ */
+ public $force_feed = false;
+
+ /**
+ * @var bool Enable/Disable Caching
+ * @see SimplePie::enable_cache()
+ * @access private
+ */
+ public $cache = true;
+
+ /**
+ * @var bool Force SimplePie to fallback to expired cache, if enabled,
+ * when feed is unavailable.
+ * @see SimplePie::force_cache_fallback()
+ * @access private
+ */
+ public $force_cache_fallback = false;
+
+ /**
+ * @var int Cache duration (in seconds)
+ * @see SimplePie::set_cache_duration()
+ * @access private
+ */
+ public $cache_duration = 3600;
+
+ /**
+ * @var int Auto-discovery cache duration (in seconds)
+ * @see SimplePie::set_autodiscovery_cache_duration()
+ * @access private
+ */
+ public $autodiscovery_cache_duration = 604800; // 7 Days.
+
+ /**
+ * @var string Cache location (relative to executing script)
+ * @see SimplePie::set_cache_location()
+ * @access private
+ */
+ public $cache_location = './cache';
+
+ /**
+ * @var string Function that creates the cache filename
+ * @see SimplePie::set_cache_name_function()
+ * @access private
+ */
+ public $cache_name_function = 'md5';
+
+ /**
+ * @var bool Reorder feed by date descending
+ * @see SimplePie::enable_order_by_date()
+ * @access private
+ */
+ public $order_by_date = true;
+
+ /**
+ * @var mixed Force input encoding to be set to the follow value
+ * (false, or anything type-cast to false, disables this feature)
+ * @see SimplePie::set_input_encoding()
+ * @access private
+ */
+ public $input_encoding = false;
+
+ /**
+ * @var int Feed Autodiscovery Level
+ * @see SimplePie::set_autodiscovery_level()
+ * @access private
+ */
+ public $autodiscovery = SIMPLEPIE_LOCATOR_ALL;
+
+ /**
+ * Class registry object
+ *
+ * @var SimplePie_Registry
+ */
+ public $registry;
+
+ /**
+ * @var int Maximum number of feeds to check with autodiscovery
+ * @see SimplePie::set_max_checked_feeds()
+ * @access private
+ */
+ public $max_checked_feeds = 10;
+
+ /**
+ * @var array All the feeds found during the autodiscovery process
+ * @see SimplePie::get_all_discovered_feeds()
+ * @access private
+ */
+ public $all_discovered_feeds = array();
+
+ /**
+ * @var string Web-accessible path to the handler_image.php file.
+ * @see SimplePie::set_image_handler()
+ * @access private
+ */
+ public $image_handler = '';
+
+ /**
+ * @var array Stores the URLs when multiple feeds are being initialized.
+ * @see SimplePie::set_feed_url()
+ * @access private
+ */
+ public $multifeed_url = array();
+
+ /**
+ * @var array Stores SimplePie objects when multiple feeds initialized.
+ * @access private
+ */
+ public $multifeed_objects = array();
+
+ /**
+ * @var array Stores the get_object_vars() array for use with multifeeds.
+ * @see SimplePie::set_feed_url()
+ * @access private
+ */
+ public $config_settings = null;
+
+ /**
+ * @var integer Stores the number of items to return per-feed with multifeeds.
+ * @see SimplePie::set_item_limit()
+ * @access private
+ */
+ public $item_limit = 0;
+
+ /**
+ * @var bool Stores if last-modified and/or etag headers were sent with the
+ * request when checking a feed.
+ */
+ public $check_modified = false;
+
+ /**
+ * @var array Stores the default attributes to be stripped by strip_attributes().
+ * @see SimplePie::strip_attributes()
+ * @access private
+ */
+ public $strip_attributes = array('bgsound', 'class', 'expr', 'id', 'style', 'onclick', 'onerror', 'onfinish', 'onmouseover', 'onmouseout', 'onfocus', 'onblur', 'lowsrc', 'dynsrc');
+
+ /**
+ * @var array Stores the default attributes to add to different tags by add_attributes().
+ * @see SimplePie::add_attributes()
+ * @access private
+ */
+ public $add_attributes = array('audio' => array('preload' => 'none'), 'iframe' => array('sandbox' => 'allow-scripts allow-same-origin'), 'video' => array('preload' => 'none'));
+
+ /**
+ * @var array Stores the default tags to be stripped by strip_htmltags().
+ * @see SimplePie::strip_htmltags()
+ * @access private
+ */
+ public $strip_htmltags = array('base', 'blink', 'body', 'doctype', 'embed', 'font', 'form', 'frame', 'frameset', 'html', 'iframe', 'input', 'marquee', 'meta', 'noscript', 'object', 'param', 'script', 'style');
+
+ /**
+ * @var bool Should we throw exceptions, or use the old-style error property?
+ * @access private
+ */
+ public $enable_exceptions = false;
+
+ /**
+ * The SimplePie class contains feed level data and options
+ *
+ * To use SimplePie, create the SimplePie object with no parameters. You can
+ * then set configuration options using the provided methods. After setting
+ * them, you must initialise the feed using $feed->init(). At that point the
+ * object's methods and properties will be available to you.
+ *
+ * Previously, it was possible to pass in the feed URL along with cache
+ * options directly into the constructor. This has been removed as of 1.3 as
+ * it caused a lot of confusion.
+ *
+ * @since 1.0 Preview Release
+ */
+ public function __construct()
+ {
+ if (version_compare(PHP_VERSION, '5.3', '<'))
+ {
+ trigger_error('Please upgrade to PHP 5.3 or newer.');
+ die();
+ }
+
+ // Other objects, instances created here so we can set options on them
+ $this->sanitize = new SimplePie_Sanitize();
+ $this->registry = new SimplePie_Registry();
+
+ if (func_num_args() > 0)
+ {
+ $level = defined('E_USER_DEPRECATED') ? E_USER_DEPRECATED : E_USER_WARNING;
+ trigger_error('Passing parameters to the constructor is no longer supported. Please use set_feed_url(), set_cache_location(), and set_cache_duration() directly.', $level);
+
+ $args = func_get_args();
+ switch (count($args)) {
+ case 3:
+ $this->set_cache_duration($args[2]);
+ case 2:
+ $this->set_cache_location($args[1]);
+ case 1:
+ $this->set_feed_url($args[0]);
+ $this->init();
+ }
+ }
+ }
+
+ /**
+ * Used for converting object to a string
+ */
+ public function __toString()
+ {
+ return md5(serialize($this->data));
+ }
+
+ /**
+ * Remove items that link back to this before destroying this object
+ */
+ public function __destruct()
+ {
+ if ((version_compare(PHP_VERSION, '5.3', '<') || !gc_enabled()) && !ini_get('zend.ze1_compatibility_mode'))
+ {
+ if (!empty($this->data['items']))
+ {
+ foreach ($this->data['items'] as $item)
+ {
+ $item->__destruct();
+ }
+ unset($item, $this->data['items']);
+ }
+ if (!empty($this->data['ordered_items']))
+ {
+ foreach ($this->data['ordered_items'] as $item)
+ {
+ $item->__destruct();
+ }
+ unset($item, $this->data['ordered_items']);
+ }
+ }
+ }
+
+ /**
+ * Force the given data/URL to be treated as a feed
+ *
+ * This tells SimplePie to ignore the content-type provided by the server.
+ * Be careful when using this option, as it will also disable autodiscovery.
+ *
+ * @since 1.1
+ * @param bool $enable Force the given data/URL to be treated as a feed
+ */
+ public function force_feed($enable = false)
+ {
+ $this->force_feed = (bool) $enable;
+ }
+
+ /**
+ * Set the URL of the feed you want to parse
+ *
+ * This allows you to enter the URL of the feed you want to parse, or the
+ * website you want to try to use auto-discovery on. This takes priority
+ * over any set raw data.
+ *
+ * You can set multiple feeds to mash together by passing an array instead
+ * of a string for the $url. Remember that with each additional feed comes
+ * additional processing and resources.
+ *
+ * @since 1.0 Preview Release
+ * @see set_raw_data()
+ * @param string|array $url This is the URL (or array of URLs) that you want to parse.
+ */
+ public function set_feed_url($url)
+ {
+ $this->multifeed_url = array();
+ if (is_array($url))
+ {
+ foreach ($url as $value)
+ {
+ $this->multifeed_url[] = $this->registry->call('Misc', 'fix_protocol', array($value, 1));
+ }
+ }
+ else
+ {
+ $this->feed_url = $this->registry->call('Misc', 'fix_protocol', array($url, 1));
+ $this->permanent_url = $this->feed_url;
+ }
+ }
+
+ /**
+ * Set an instance of {@see SimplePie_File} to use as a feed
+ *
+ * @param SimplePie_File &$file
+ * @return bool True on success, false on failure
+ */
+ public function set_file(&$file)
+ {
+ if ($file instanceof SimplePie_File)
+ {
+ $this->feed_url = $file->url;
+ $this->permanent_url = $this->feed_url;
+ $this->file =& $file;
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Set the raw XML data to parse
+ *
+ * Allows you to use a string of RSS/Atom data instead of a remote feed.
+ *
+ * If you have a feed available as a string in PHP, you can tell SimplePie
+ * to parse that data string instead of a remote feed. Any set feed URL
+ * takes precedence.
+ *
+ * @since 1.0 Beta 3
+ * @param string $data RSS or Atom data as a string.
+ * @see set_feed_url()
+ */
+ public function set_raw_data($data)
+ {
+ $this->raw_data = $data;
+ }
+
+ /**
+ * Set the the default timeout for fetching remote feeds
+ *
+ * This allows you to change the maximum time the feed's server to respond
+ * and send the feed back.
+ *
+ * @since 1.0 Beta 3
+ * @param int $timeout The maximum number of seconds to spend waiting to retrieve a feed.
+ */
+ public function set_timeout($timeout = 10)
+ {
+ $this->timeout = (int) $timeout;
+ }
+
+ /**
+ * Set custom curl options
+ *
+ * This allows you to change default curl options
+ *
+ * @since 1.0 Beta 3
+ * @param array $curl_options Curl options to add to default settings
+ */
+ public function set_curl_options(array $curl_options = array())
+ {
+ $this->curl_options = $curl_options;
+ }
+
+ /**
+ * Force SimplePie to use fsockopen() instead of cURL
+ *
+ * @since 1.0 Beta 3
+ * @param bool $enable Force fsockopen() to be used
+ */
+ public function force_fsockopen($enable = false)
+ {
+ $this->force_fsockopen = (bool) $enable;
+ }
+
+ /**
+ * Enable/disable caching in SimplePie.
+ *
+ * This option allows you to disable caching all-together in SimplePie.
+ * However, disabling the cache can lead to longer load times.
+ *
+ * @since 1.0 Preview Release
+ * @param bool $enable Enable caching
+ */
+ public function enable_cache($enable = true)
+ {
+ $this->cache = (bool) $enable;
+ }
+
+ /**
+ * SimplePie to continue to fall back to expired cache, if enabled, when
+ * feed is unavailable.
+ *
+ * This tells SimplePie to ignore any file errors and fall back to cache
+ * instead. This only works if caching is enabled and cached content
+ * still exists.
+
+ * @param bool $enable Force use of cache on fail.
+ */
+ public function force_cache_fallback($enable = false)
+ {
+ $this->force_cache_fallback= (bool) $enable;
+ }
+
+ /**
+ * Set the length of time (in seconds) that the contents of a feed will be
+ * cached
+ *
+ * @param int $seconds The feed content cache duration
+ */
+ public function set_cache_duration($seconds = 3600)
+ {
+ $this->cache_duration = (int) $seconds;
+ }
+
+ /**
+ * Set the length of time (in seconds) that the autodiscovered feed URL will
+ * be cached
+ *
+ * @param int $seconds The autodiscovered feed URL cache duration.
+ */
+ public function set_autodiscovery_cache_duration($seconds = 604800)
+ {
+ $this->autodiscovery_cache_duration = (int) $seconds;
+ }
+
+ /**
+ * Set the file system location where the cached files should be stored
+ *
+ * @param string $location The file system location.
+ */
+ public function set_cache_location($location = './cache')
+ {
+ $this->cache_location = (string) $location;
+ }
+
+ /**
+ * Set whether feed items should be sorted into reverse chronological order
+ *
+ * @param bool $enable Sort as reverse chronological order.
+ */
+ public function enable_order_by_date($enable = true)
+ {
+ $this->order_by_date = (bool) $enable;
+ }
+
+ /**
+ * Set the character encoding used to parse the feed
+ *
+ * This overrides the encoding reported by the feed, however it will fall
+ * back to the normal encoding detection if the override fails
+ *
+ * @param string $encoding Character encoding
+ */
+ public function set_input_encoding($encoding = false)
+ {
+ if ($encoding)
+ {
+ $this->input_encoding = (string) $encoding;
+ }
+ else
+ {
+ $this->input_encoding = false;
+ }
+ }
+
+ /**
+ * Set how much feed autodiscovery to do
+ *
+ * @see SIMPLEPIE_LOCATOR_NONE
+ * @see SIMPLEPIE_LOCATOR_AUTODISCOVERY
+ * @see SIMPLEPIE_LOCATOR_LOCAL_EXTENSION
+ * @see SIMPLEPIE_LOCATOR_LOCAL_BODY
+ * @see SIMPLEPIE_LOCATOR_REMOTE_EXTENSION
+ * @see SIMPLEPIE_LOCATOR_REMOTE_BODY
+ * @see SIMPLEPIE_LOCATOR_ALL
+ * @param int $level Feed Autodiscovery Level (level can be a combination of the above constants, see bitwise OR operator)
+ */
+ public function set_autodiscovery_level($level = SIMPLEPIE_LOCATOR_ALL)
+ {
+ $this->autodiscovery = (int) $level;
+ }
+
+ /**
+ * Get the class registry
+ *
+ * Use this to override SimplePie's default classes
+ * @see SimplePie_Registry
+ * @return SimplePie_Registry
+ */
+ public function &get_registry()
+ {
+ return $this->registry;
+ }
+
+ /**#@+
+ * Useful when you are overloading or extending SimplePie's default classes.
+ *
+ * @deprecated Use {@see get_registry()} instead
+ * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
+ * @param string $class Name of custom class
+ * @return boolean True on success, false otherwise
+ */
+ /**
+ * Set which class SimplePie uses for caching
+ */
+ public function set_cache_class($class = 'SimplePie_Cache')
+ {
+ return $this->registry->register('Cache', $class, true);
+ }
+
+ /**
+ * Set which class SimplePie uses for auto-discovery
+ */
+ public function set_locator_class($class = 'SimplePie_Locator')
+ {
+ return $this->registry->register('Locator', $class, true);
+ }
+
+ /**
+ * Set which class SimplePie uses for XML parsing
+ */
+ public function set_parser_class($class = 'SimplePie_Parser')
+ {
+ return $this->registry->register('Parser', $class, true);
+ }
+
+ /**
+ * Set which class SimplePie uses for remote file fetching
+ */
+ public function set_file_class($class = 'SimplePie_File')
+ {
+ return $this->registry->register('File', $class, true);
+ }
+
+ /**
+ * Set which class SimplePie uses for data sanitization
+ */
+ public function set_sanitize_class($class = 'SimplePie_Sanitize')
+ {
+ return $this->registry->register('Sanitize', $class, true);
+ }
+
+ /**
+ * Set which class SimplePie uses for handling feed items
+ */
+ public function set_item_class($class = 'SimplePie_Item')
+ {
+ return $this->registry->register('Item', $class, true);
+ }
+
+ /**
+ * Set which class SimplePie uses for handling author data
+ */
+ public function set_author_class($class = 'SimplePie_Author')
+ {
+ return $this->registry->register('Author', $class, true);
+ }
+
+ /**
+ * Set which class SimplePie uses for handling category data
+ */
+ public function set_category_class($class = 'SimplePie_Category')
+ {
+ return $this->registry->register('Category', $class, true);
+ }
+
+ /**
+ * Set which class SimplePie uses for feed enclosures
+ */
+ public function set_enclosure_class($class = 'SimplePie_Enclosure')
+ {
+ return $this->registry->register('Enclosure', $class, true);
+ }
+
+ /**
+ * Set which class SimplePie uses for `<media:text>` captions
+ */
+ public function set_caption_class($class = 'SimplePie_Caption')
+ {
+ return $this->registry->register('Caption', $class, true);
+ }
+
+ /**
+ * Set which class SimplePie uses for `<media:copyright>`
+ */
+ public function set_copyright_class($class = 'SimplePie_Copyright')
+ {
+ return $this->registry->register('Copyright', $class, true);
+ }
+
+ /**
+ * Set which class SimplePie uses for `<media:credit>`
+ */
+ public function set_credit_class($class = 'SimplePie_Credit')
+ {
+ return $this->registry->register('Credit', $class, true);
+ }
+
+ /**
+ * Set which class SimplePie uses for `<media:rating>`
+ */
+ public function set_rating_class($class = 'SimplePie_Rating')
+ {
+ return $this->registry->register('Rating', $class, true);
+ }
+
+ /**
+ * Set which class SimplePie uses for `<media:restriction>`
+ */
+ public function set_restriction_class($class = 'SimplePie_Restriction')
+ {
+ return $this->registry->register('Restriction', $class, true);
+ }
+
+ /**
+ * Set which class SimplePie uses for content-type sniffing
+ */
+ public function set_content_type_sniffer_class($class = 'SimplePie_Content_Type_Sniffer')
+ {
+ return $this->registry->register('Content_Type_Sniffer', $class, true);
+ }
+
+ /**
+ * Set which class SimplePie uses item sources
+ */
+ public function set_source_class($class = 'SimplePie_Source')
+ {
+ return $this->registry->register('Source', $class, true);
+ }
+ /**#@-*/
+
+ /**
+ * Set the user agent string
+ *
+ * @param string $ua New user agent string.
+ */
+ public function set_useragent($ua = SIMPLEPIE_USERAGENT)
+ {
+ $this->useragent = (string) $ua;
+ }
+
+ /**
+ * Set callback function to create cache filename with
+ *
+ * @param mixed $function Callback function
+ */
+ public function set_cache_name_function($function = 'md5')
+ {
+ if (is_callable($function))
+ {
+ $this->cache_name_function = $function;
+ }
+ }
+
+ /**
+ * Set options to make SP as fast as possible
+ *
+ * Forgoes a substantial amount of data sanitization in favor of speed. This
+ * turns SimplePie into a dumb parser of feeds.
+ *
+ * @param bool $set Whether to set them or not
+ */
+ public function set_stupidly_fast($set = false)
+ {
+ if ($set)
+ {
+ $this->enable_order_by_date(false);
+ $this->remove_div(false);
+ $this->strip_comments(false);
+ $this->strip_htmltags(false);
+ $this->strip_attributes(false);
+ $this->add_attributes(false);
+ $this->set_image_handler(false);
+ }
+ }
+
+ /**
+ * Set maximum number of feeds to check with autodiscovery
+ *
+ * @param int $max Maximum number of feeds to check
+ */
+ public function set_max_checked_feeds($max = 10)
+ {
+ $this->max_checked_feeds = (int) $max;
+ }
+
+ public function remove_div($enable = true)
+ {
+ $this->sanitize->remove_div($enable);
+ }
+
+ public function strip_htmltags($tags = '', $encode = null)
+ {
+ if ($tags === '')
+ {
+ $tags = $this->strip_htmltags;
+ }
+ $this->sanitize->strip_htmltags($tags);
+ if ($encode !== null)
+ {
+ $this->sanitize->encode_instead_of_strip($tags);
+ }
+ }
+
+ public function encode_instead_of_strip($enable = true)
+ {
+ $this->sanitize->encode_instead_of_strip($enable);
+ }
+
+ public function strip_attributes($attribs = '')
+ {
+ if ($attribs === '')
+ {
+ $attribs = $this->strip_attributes;
+ }
+ $this->sanitize->strip_attributes($attribs);
+ }
+
+ public function add_attributes($attribs = '')
+ {
+ if ($attribs === '')
+ {
+ $attribs = $this->add_attributes;
+ }
+ $this->sanitize->add_attributes($attribs);
+ }
+
+ /**
+ * Set the output encoding
+ *
+ * Allows you to override SimplePie's output to match that of your webpage.
+ * This is useful for times when your webpages are not being served as
+ * UTF-8. This setting will be obeyed by {@see handle_content_type()}, and
+ * is similar to {@see set_input_encoding()}.
+ *
+ * It should be noted, however, that not all character encodings can support
+ * all characters. If your page is being served as ISO-8859-1 and you try
+ * to display a Japanese feed, you'll likely see garbled characters.
+ * Because of this, it is highly recommended to ensure that your webpages
+ * are served as UTF-8.
+ *
+ * The number of supported character encodings depends on whether your web
+ * host supports {@link http://php.net/mbstring mbstring},
+ * {@link http://php.net/iconv iconv}, or both. See
+ * {@link http://simplepie.org/wiki/faq/Supported_Character_Encodings} for
+ * more information.
+ *
+ * @param string $encoding
+ */
+ public function set_output_encoding($encoding = 'UTF-8')
+ {
+ $this->sanitize->set_output_encoding($encoding);
+ }
+
+ public function strip_comments($strip = false)
+ {
+ $this->sanitize->strip_comments($strip);
+ }
+
+ /**
+ * Set element/attribute key/value pairs of HTML attributes
+ * containing URLs that need to be resolved relative to the feed
+ *
+ * Defaults to |a|@href, |area|@href, |blockquote|@cite, |del|@cite,
+ * |form|@action, |img|@longdesc, |img|@src, |input|@src, |ins|@cite,
+ * |q|@cite
+ *
+ * @since 1.0
+ * @param array|null $element_attribute Element/attribute key/value pairs, null for default
+ */
+ public function set_url_replacements($element_attribute = null)
+ {
+ $this->sanitize->set_url_replacements($element_attribute);
+ }
+
+ /**
+ * Set the handler to enable the display of cached images.
+ *
+ * @param str $page Web-accessible path to the handler_image.php file.
+ * @param str $qs The query string that the value should be passed to.
+ */
+ public function set_image_handler($page = false, $qs = 'i')
+ {
+ if ($page !== false)
+ {
+ $this->sanitize->set_image_handler($page . '?' . $qs . '=');
+ }
+ else
+ {
+ $this->image_handler = '';
+ }
+ }
+
+ /**
+ * Set the limit for items returned per-feed with multifeeds
+ *
+ * @param integer $limit The maximum number of items to return.
+ */
+ public function set_item_limit($limit = 0)
+ {
+ $this->item_limit = (int) $limit;
+ }
+
+ /**
+ * Enable throwing exceptions
+ *
+ * @param boolean $enable Should we throw exceptions, or use the old-style error property?
+ */
+ public function enable_exceptions($enable = true)
+ {
+ $this->enable_exceptions = $enable;
+ }
+
+ /**
+ * Initialize the feed object
+ *
+ * This is what makes everything happen. Period. This is where all of the
+ * configuration options get processed, feeds are fetched, cached, and
+ * parsed, and all of that other good stuff.
+ *
+ * @return boolean True if successful, false otherwise
+ */
+ public function init()
+ {
+ // Check absolute bare minimum requirements.
+ if (!extension_loaded('xml') || !extension_loaded('pcre'))
+ {
+ $this->error = 'XML or PCRE extensions not loaded!';
+ return false;
+ }
+ // Then check the xml extension is sane (i.e., libxml 2.7.x issue on PHP < 5.2.9 and libxml 2.7.0 to 2.7.2 on any version) if we don't have xmlreader.
+ elseif (!extension_loaded('xmlreader'))
+ {
+ static $xml_is_sane = null;
+ if ($xml_is_sane === null)
+ {
+ $parser_check = xml_parser_create();
+ xml_parse_into_struct($parser_check, '<foo>&amp;</foo>', $values);
+ xml_parser_free($parser_check);
+ $xml_is_sane = isset($values[0]['value']);
+ }
+ if (!$xml_is_sane)
+ {
+ return false;
+ }
+ }
+
+ if (method_exists($this->sanitize, 'set_registry'))
+ {
+ $this->sanitize->set_registry($this->registry);
+ }
+
+ // Pass whatever was set with config options over to the sanitizer.
+ // Pass the classes in for legacy support; new classes should use the registry instead
+ $this->sanitize->pass_cache_data($this->cache, $this->cache_location, $this->cache_name_function, $this->registry->get_class('Cache'));
+ $this->sanitize->pass_file_data($this->registry->get_class('File'), $this->timeout, $this->useragent, $this->force_fsockopen, $this->curl_options);
+
+ if (!empty($this->multifeed_url))
+ {
+ $i = 0;
+ $success = 0;
+ $this->multifeed_objects = array();
+ $this->error = array();
+ foreach ($this->multifeed_url as $url)
+ {
+ $this->multifeed_objects[$i] = clone $this;
+ $this->multifeed_objects[$i]->set_feed_url($url);
+ $single_success = $this->multifeed_objects[$i]->init();
+ $success |= $single_success;
+ if (!$single_success)
+ {
+ $this->error[$i] = $this->multifeed_objects[$i]->error();
+ }
+ $i++;
+ }
+ return (bool) $success;
+ }
+ elseif ($this->feed_url === null && $this->raw_data === null)
+ {
+ return false;
+ }
+
+ $this->error = null;
+ $this->data = array();
+ $this->check_modified = false;
+ $this->multifeed_objects = array();
+ $cache = false;
+
+ if ($this->feed_url !== null)
+ {
+ $parsed_feed_url = $this->registry->call('Misc', 'parse_url', array($this->feed_url));
+
+ // Decide whether to enable caching
+ if ($this->cache && $parsed_feed_url['scheme'] !== '')
+ {
+ $cache = $this->registry->call('Cache', 'get_handler', array($this->cache_location, call_user_func($this->cache_name_function, $this->feed_url), 'spc'));
+ }
+
+ // Fetch the data via SimplePie_File into $this->raw_data
+ if (($fetched = $this->fetch_data($cache)) === true)
+ {
+ return true;
+ }
+ elseif ($fetched === false) {
+ return false;
+ }
+
+ list($headers, $sniffed) = $fetched;
+ }
+
+ // Empty response check
+ if(empty($this->raw_data)){
+ $this->error = "A feed could not be found at `$this->feed_url`. Empty body.";
+ $this->registry->call('Misc', 'error', array($this->error, E_USER_NOTICE, __FILE__, __LINE__));
+ return false;
+ }
+
+ // Set up array of possible encodings
+ $encodings = array();
+
+ // First check to see if input has been overridden.
+ if ($this->input_encoding !== false)
+ {
+ $encodings[] = strtoupper($this->input_encoding);
+ }
+
+ $application_types = array('application/xml', 'application/xml-dtd', 'application/xml-external-parsed-entity');
+ $text_types = array('text/xml', 'text/xml-external-parsed-entity');
+
+ // RFC 3023 (only applies to sniffed content)
+ if (isset($sniffed))
+ {
+ if (in_array($sniffed, $application_types) || substr($sniffed, 0, 12) === 'application/' && substr($sniffed, -4) === '+xml')
+ {
+ if (isset($headers['content-type']) && preg_match('/;\x20?charset=([^;]*)/i', $headers['content-type'], $charset))
+ {
+ $encodings[] = strtoupper($charset[1]);
+ }
+ $encodings = array_merge($encodings, $this->registry->call('Misc', 'xml_encoding', array($this->raw_data, &$this->registry)));
+ $encodings[] = 'UTF-8';
+ }
+ elseif (in_array($sniffed, $text_types) || substr($sniffed, 0, 5) === 'text/' && substr($sniffed, -4) === '+xml')
+ {
+ if (isset($headers['content-type']) && preg_match('/;\x20?charset=([^;]*)/i', $headers['content-type'], $charset))
+ {
+ $encodings[] = strtoupper($charset[1]);
+ }
+ $encodings[] = 'US-ASCII';
+ }
+ // Text MIME-type default
+ elseif (substr($sniffed, 0, 5) === 'text/')
+ {
+ $encodings[] = 'UTF-8';
+ }
+ }
+
+ // Fallback to XML 1.0 Appendix F.1/UTF-8/ISO-8859-1
+ $encodings = array_merge($encodings, $this->registry->call('Misc', 'xml_encoding', array($this->raw_data, &$this->registry)));
+ $encodings[] = 'UTF-8';
+ $encodings[] = 'ISO-8859-1';
+
+ // There's no point in trying an encoding twice
+ $encodings = array_unique($encodings);
+
+ // Loop through each possible encoding, till we return something, or run out of possibilities
+ foreach ($encodings as $encoding)
+ {
+ // Change the encoding to UTF-8 (as we always use UTF-8 internally)
+ if ($utf8_data = $this->registry->call('Misc', 'change_encoding', array($this->raw_data, $encoding, 'UTF-8')))
+ {
+ // Create new parser
+ $parser = $this->registry->create('Parser');
+
+ // If it's parsed fine
+ if ($parser->parse($utf8_data, 'UTF-8', $this->permanent_url))
+ {
+ $this->data = $parser->get_data();
+ if (!($this->get_type() & ~SIMPLEPIE_TYPE_NONE))
+ {
+ $this->error = "A feed could not be found at `$this->feed_url`. This does not appear to be a valid RSS or Atom feed.";
+ $this->registry->call('Misc', 'error', array($this->error, E_USER_NOTICE, __FILE__, __LINE__));
+ return false;
+ }
+
+ if (isset($headers))
+ {
+ $this->data['headers'] = $headers;
+ }
+ $this->data['build'] = SIMPLEPIE_BUILD;
+
+ // Cache the file if caching is enabled
+ if ($cache && !$cache->save($this))
+ {
+ trigger_error("$this->cache_location is not writeable. Make sure you've set the correct relative or absolute path, and that the location is server-writable.", E_USER_WARNING);
+ }
+ return true;
+ }
+ }
+ }
+
+ if (isset($parser))
+ {
+ // We have an error, just set SimplePie_Misc::error to it and quit
+ $this->error = $this->feed_url;
+ $this->error .= sprintf(' is invalid XML, likely due to invalid characters. XML error: %s at line %d, column %d', $parser->get_error_string(), $parser->get_current_line(), $parser->get_current_column());
+ }
+ else
+ {
+ $this->error = 'The data could not be converted to UTF-8.';
+ if (!extension_loaded('mbstring') && !extension_loaded('iconv') && !class_exists('\UConverter')) {
+ $this->error .= ' You MUST have either the iconv, mbstring or intl (PHP 5.5+) extension installed and enabled.';
+ } else {
+ $missingExtensions = array();
+ if (!extension_loaded('iconv')) {
+ $missingExtensions[] = 'iconv';
+ }
+ if (!extension_loaded('mbstring')) {
+ $missingExtensions[] = 'mbstring';
+ }
+ if (!class_exists('\UConverter')) {
+ $missingExtensions[] = 'intl (PHP 5.5+)';
+ }
+ $this->error .= ' Try installing/enabling the ' . implode(' or ', $missingExtensions) . ' extension.';
+ }
+ }
+
+ $this->registry->call('Misc', 'error', array($this->error, E_USER_NOTICE, __FILE__, __LINE__));
+
+ return false;
+ }
+
+ /**
+ * Fetch the data via SimplePie_File
+ *
+ * If the data is already cached, attempt to fetch it from there instead
+ * @param SimplePie_Cache|false $cache Cache handler, or false to not load from the cache
+ * @return array|true Returns true if the data was loaded from the cache, or an array of HTTP headers and sniffed type
+ */
+ protected function fetch_data(&$cache)
+ {
+ // If it's enabled, use the cache
+ if ($cache)
+ {
+ // Load the Cache
+ $this->data = $cache->load();
+ if (!empty($this->data))
+ {
+ // If the cache is for an outdated build of SimplePie
+ if (!isset($this->data['build']) || $this->data['build'] !== SIMPLEPIE_BUILD)
+ {
+ $cache->unlink();
+ $this->data = array();
+ }
+ // If we've hit a collision just rerun it with caching disabled
+ elseif (isset($this->data['url']) && $this->data['url'] !== $this->feed_url)
+ {
+ $cache = false;
+ $this->data = array();
+ }
+ // If we've got a non feed_url stored (if the page isn't actually a feed, or is a redirect) use that URL.
+ elseif (isset($this->data['feed_url']))
+ {
+ // If the autodiscovery cache is still valid use it.
+ if ($cache->mtime() + $this->autodiscovery_cache_duration > time())
+ {
+ // Do not need to do feed autodiscovery yet.
+ if ($this->data['feed_url'] !== $this->data['url'])
+ {
+ $this->set_feed_url($this->data['feed_url']);
+ return $this->init();
+ }
+
+ $cache->unlink();
+ $this->data = array();
+ }
+ }
+ // Check if the cache has been updated
+ elseif ($cache->mtime() + $this->cache_duration < time())
+ {
+ // Want to know if we tried to send last-modified and/or etag headers
+ // when requesting this file. (Note that it's up to the file to
+ // support this, but we don't always send the headers either.)
+ $this->check_modified = true;
+ if (isset($this->data['headers']['last-modified']) || isset($this->data['headers']['etag']))
+ {
+ $headers = array(
+ 'Accept' => 'application/atom+xml, application/rss+xml, application/rdf+xml;q=0.9, application/xml;q=0.8, text/xml;q=0.8, text/html;q=0.7, unknown/unknown;q=0.1, application/unknown;q=0.1, */*;q=0.1',
+ );
+ if (isset($this->data['headers']['last-modified']))
+ {
+ $headers['if-modified-since'] = $this->data['headers']['last-modified'];
+ }
+ if (isset($this->data['headers']['etag']))
+ {
+ $headers['if-none-match'] = $this->data['headers']['etag'];
+ }
+
+ $file = $this->registry->create('File', array($this->feed_url, $this->timeout/10, 5, $headers, $this->useragent, $this->force_fsockopen, $this->curl_options));
+
+ if ($file->success)
+ {
+ if ($file->status_code === 304)
+ {
+ // Set raw_data to false here too, to signify that the cache
+ // is still valid.
+ $this->raw_data = false;
+ $cache->touch();
+ return true;
+ }
+ }
+ else
+ {
+ $this->check_modified = false;
+ if($this->force_cache_fallback)
+ {
+ $cache->touch();
+ return true;
+ }
+
+ unset($file);
+ }
+ }
+ }
+ // If the cache is still valid, just return true
+ else
+ {
+ $this->raw_data = false;
+ return true;
+ }
+ }
+ // If the cache is empty, delete it
+ else
+ {
+ $cache->unlink();
+ $this->data = array();
+ }
+ }
+ // If we don't already have the file (it'll only exist if we've opened it to check if the cache has been modified), open it.
+ if (!isset($file))
+ {
+ if ($this->file instanceof SimplePie_File && $this->file->url === $this->feed_url)
+ {
+ $file =& $this->file;
+ }
+ else
+ {
+ $headers = array(
+ 'Accept' => 'application/atom+xml, application/rss+xml, application/rdf+xml;q=0.9, application/xml;q=0.8, text/xml;q=0.8, text/html;q=0.7, unknown/unknown;q=0.1, application/unknown;q=0.1, */*;q=0.1',
+ );
+ $file = $this->registry->create('File', array($this->feed_url, $this->timeout, 5, $headers, $this->useragent, $this->force_fsockopen, $this->curl_options));
+ }
+ }
+ // If the file connection has an error, set SimplePie::error to that and quit
+ if (!$file->success && !($file->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($file->status_code === 200 || $file->status_code > 206 && $file->status_code < 300)))
+ {
+ $this->error = $file->error;
+ return !empty($this->data);
+ }
+
+ if (!$this->force_feed)
+ {
+ // Check if the supplied URL is a feed, if it isn't, look for it.
+ $locate = $this->registry->create('Locator', array(&$file, $this->timeout, $this->useragent, $this->max_checked_feeds));
+
+ if (!$locate->is_feed($file))
+ {
+ $copyStatusCode = $file->status_code;
+ $copyContentType = $file->headers['content-type'];
+ try
+ {
+ $microformats = false;
+ if (function_exists('Mf2\parse')) {
+ // Check for both h-feed and h-entry, as both a feed with no entries
+ // and a list of entries without an h-feed wrapper are both valid.
+ $position = 0;
+ while ($position = strpos($file->body, 'h-feed', $position))
+ {
+ $start = $position < 200 ? 0 : $position - 200;
+ $check = substr($file->body, $start, 400);
+ if ($microformats = preg_match('/class="[^"]*h-feed/', $check))
+ {
+ break;
+ }
+ $position += 7;
+ }
+ $position = 0;
+ while ($position = strpos($file->body, 'h-entry', $position))
+ {
+ $start = $position < 200 ? 0 : $position - 200;
+ $check = substr($file->body, $start, 400);
+ if ($microformats = preg_match('/class="[^"]*h-entry/', $check))
+ {
+ break;
+ }
+ $position += 7;
+ }
+ }
+ // Now also do feed discovery, but if an h-entry was found don't
+ // overwrite the current value of file.
+ $discovered = $locate->find($this->autodiscovery,
+ $this->all_discovered_feeds);
+ if ($microformats)
+ {
+ if ($hub = $locate->get_rel_link('hub'))
+ {
+ $self = $locate->get_rel_link('self');
+ $this->store_links($file, $hub, $self);
+ }
+ // Push the current file onto all_discovered feeds so the user can
+ // be shown this as one of the options.
+ if (isset($this->all_discovered_feeds)) {
+ $this->all_discovered_feeds[] = $file;
+ }
+ }
+ else
+ {
+ if ($discovered)
+ {
+ $file = $discovered;
+ }
+ else
+ {
+ // We need to unset this so that if SimplePie::set_file() has
+ // been called that object is untouched
+ unset($file);
+ $this->error = "A feed could not be found at `$this->feed_url`; the status code is `$copyStatusCode` and content-type is `$copyContentType`";
+ $this->registry->call('Misc', 'error', array($this->error, E_USER_NOTICE, __FILE__, __LINE__));
+ return false;
+ }
+ }
+ }
+ catch (SimplePie_Exception $e)
+ {
+ // We need to unset this so that if SimplePie::set_file() has been called that object is untouched
+ unset($file);
+ // This is usually because DOMDocument doesn't exist
+ $this->error = $e->getMessage();
+ $this->registry->call('Misc', 'error', array($this->error, E_USER_NOTICE, $e->getFile(), $e->getLine()));
+ return false;
+ }
+ if ($cache)
+ {
+ $this->data = array('url' => $this->feed_url, 'feed_url' => $file->url, 'build' => SIMPLEPIE_BUILD);
+ if (!$cache->save($this))
+ {
+ trigger_error("$this->cache_location is not writeable. Make sure you've set the correct relative or absolute path, and that the location is server-writable.", E_USER_WARNING);
+ }
+ $cache = $this->registry->call('Cache', 'get_handler', array($this->cache_location, call_user_func($this->cache_name_function, $file->url), 'spc'));
+ }
+ $this->feed_url = $file->url;
+ }
+ $locate = null;
+ }
+
+ $this->raw_data = $file->body;
+ $this->permanent_url = $file->permanent_url;
+ $headers = $file->headers;
+ $sniffer = $this->registry->create('Content_Type_Sniffer', array(&$file));
+ $sniffed = $sniffer->get_type();
+
+ return array($headers, $sniffed);
+ }
+
+ /**
+ * Get the error message for the occured error
+ *
+ * @return string|array Error message, or array of messages for multifeeds
+ */
+ public function error()
+ {
+ return $this->error;
+ }
+
+ /**
+ * Get the raw XML
+ *
+ * This is the same as the old `$feed->enable_xml_dump(true)`, but returns
+ * the data instead of printing it.
+ *
+ * @return string|boolean Raw XML data, false if the cache is used
+ */
+ public function get_raw_data()
+ {
+ return $this->raw_data;
+ }
+
+ /**
+ * Get the character encoding used for output
+ *
+ * @since Preview Release
+ * @return string
+ */
+ public function get_encoding()
+ {
+ return $this->sanitize->output_encoding;
+ }
+
+ /**
+ * Send the content-type header with correct encoding
+ *
+ * This method ensures that the SimplePie-enabled page is being served with
+ * the correct {@link http://www.iana.org/assignments/media-types/ mime-type}
+ * and character encoding HTTP headers (character encoding determined by the
+ * {@see set_output_encoding} config option).
+ *
+ * This won't work properly if any content or whitespace has already been
+ * sent to the browser, because it relies on PHP's
+ * {@link http://php.net/header header()} function, and these are the
+ * circumstances under which the function works.
+ *
+ * Because it's setting these settings for the entire page (as is the nature
+ * of HTTP headers), this should only be used once per page (again, at the
+ * top).
+ *
+ * @param string $mime MIME type to serve the page as
+ */
+ public function handle_content_type($mime = 'text/html')
+ {
+ if (!headers_sent())
+ {
+ $header = "Content-type: $mime;";
+ if ($this->get_encoding())
+ {
+ $header .= ' charset=' . $this->get_encoding();
+ }
+ else
+ {
+ $header .= ' charset=UTF-8';
+ }
+ header($header);
+ }
+ }
+
+ /**
+ * Get the type of the feed
+ *
+ * This returns a SIMPLEPIE_TYPE_* constant, which can be tested against
+ * using {@link http://php.net/language.operators.bitwise bitwise operators}
+ *
+ * @since 0.8 (usage changed to using constants in 1.0)
+ * @see SIMPLEPIE_TYPE_NONE Unknown.
+ * @see SIMPLEPIE_TYPE_RSS_090 RSS 0.90.
+ * @see SIMPLEPIE_TYPE_RSS_091_NETSCAPE RSS 0.91 (Netscape).
+ * @see SIMPLEPIE_TYPE_RSS_091_USERLAND RSS 0.91 (Userland).
+ * @see SIMPLEPIE_TYPE_RSS_091 RSS 0.91.
+ * @see SIMPLEPIE_TYPE_RSS_092 RSS 0.92.
+ * @see SIMPLEPIE_TYPE_RSS_093 RSS 0.93.
+ * @see SIMPLEPIE_TYPE_RSS_094 RSS 0.94.
+ * @see SIMPLEPIE_TYPE_RSS_10 RSS 1.0.
+ * @see SIMPLEPIE_TYPE_RSS_20 RSS 2.0.x.
+ * @see SIMPLEPIE_TYPE_RSS_RDF RDF-based RSS.
+ * @see SIMPLEPIE_TYPE_RSS_SYNDICATION Non-RDF-based RSS (truly intended as syndication format).
+ * @see SIMPLEPIE_TYPE_RSS_ALL Any version of RSS.
+ * @see SIMPLEPIE_TYPE_ATOM_03 Atom 0.3.
+ * @see SIMPLEPIE_TYPE_ATOM_10 Atom 1.0.
+ * @see SIMPLEPIE_TYPE_ATOM_ALL Any version of Atom.
+ * @see SIMPLEPIE_TYPE_ALL Any known/supported feed type.
+ * @return int SIMPLEPIE_TYPE_* constant
+ */
+ public function get_type()
+ {
+ if (!isset($this->data['type']))
+ {
+ $this->data['type'] = SIMPLEPIE_TYPE_ALL;
+ if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed']))
+ {
+ $this->data['type'] &= SIMPLEPIE_TYPE_ATOM_10;
+ }
+ elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed']))
+ {
+ $this->data['type'] &= SIMPLEPIE_TYPE_ATOM_03;
+ }
+ elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF']))
+ {
+ if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_10]['channel'])
+ || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_10]['image'])
+ || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_10]['item'])
+ || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_10]['textinput']))
+ {
+ $this->data['type'] &= SIMPLEPIE_TYPE_RSS_10;
+ }
+ if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_090]['channel'])
+ || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_090]['image'])
+ || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_090]['item'])
+ || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_090]['textinput']))
+ {
+ $this->data['type'] &= SIMPLEPIE_TYPE_RSS_090;
+ }
+ }
+ elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss']))
+ {
+ $this->data['type'] &= SIMPLEPIE_TYPE_RSS_ALL;
+ if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['attribs']['']['version']))
+ {
+ switch (trim($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['attribs']['']['version']))
+ {
+ case '0.91':
+ $this->data['type'] &= SIMPLEPIE_TYPE_RSS_091;
+ if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_20]['skiphours']['hour'][0]['data']))
+ {
+ switch (trim($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_20]['skiphours']['hour'][0]['data']))
+ {
+ case '0':
+ $this->data['type'] &= SIMPLEPIE_TYPE_RSS_091_NETSCAPE;
+ break;
+
+ case '24':
+ $this->data['type'] &= SIMPLEPIE_TYPE_RSS_091_USERLAND;
+ break;
+ }
+ }
+ break;
+
+ case '0.92':
+ $this->data['type'] &= SIMPLEPIE_TYPE_RSS_092;
+ break;
+
+ case '0.93':
+ $this->data['type'] &= SIMPLEPIE_TYPE_RSS_093;
+ break;
+
+ case '0.94':
+ $this->data['type'] &= SIMPLEPIE_TYPE_RSS_094;
+ break;
+
+ case '2.0':
+ $this->data['type'] &= SIMPLEPIE_TYPE_RSS_20;
+ break;
+ }
+ }
+ }
+ else
+ {
+ $this->data['type'] = SIMPLEPIE_TYPE_NONE;
+ }
+ }
+ return $this->data['type'];
+ }
+
+ /**
+ * Get the URL for the feed
+ *
+ * When the 'permanent' mode is enabled, returns the original feed URL,
+ * except in the case of an `HTTP 301 Moved Permanently` status response,
+ * in which case the location of the first redirection is returned.
+ *
+ * When the 'permanent' mode is disabled (default),
+ * may or may not be different from the URL passed to {@see set_feed_url()},
+ * depending on whether auto-discovery was used.
+ *
+ * @since Preview Release (previously called `get_feed_url()` since SimplePie 0.8.)
+ * @todo Support <itunes:new-feed-url>
+ * @todo Also, |atom:link|@rel=self
+ * @param bool $permanent Permanent mode to return only the original URL or the first redirection
+ * iff it is a 301 redirection
+ * @return string|null
+ */
+ public function subscribe_url($permanent = false)
+ {
+ if ($permanent)
+ {
+ if ($this->permanent_url !== null)
+ {
+ // sanitize encodes ampersands which are required when used in a url.
+ return str_replace('&amp;', '&',
+ $this->sanitize($this->permanent_url,
+ SIMPLEPIE_CONSTRUCT_IRI));
+ }
+ }
+ else
+ {
+ if ($this->feed_url !== null)
+ {
+ return str_replace('&amp;', '&',
+ $this->sanitize($this->feed_url,
+ SIMPLEPIE_CONSTRUCT_IRI));
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Get data for an feed-level element
+ *
+ * This method allows you to get access to ANY element/attribute that is a
+ * sub-element of the opening feed tag.
+ *
+ * The return value is an indexed array of elements matching the given
+ * namespace and tag name. Each element has `attribs`, `data` and `child`
+ * subkeys. For `attribs` and `child`, these contain namespace subkeys.
+ * `attribs` then has one level of associative name => value data (where
+ * `value` is a string) after the namespace. `child` has tag-indexed keys
+ * after the namespace, each member of which is an indexed array matching
+ * this same format.
+ *
+ * For example:
+ * <pre>
+ * // This is probably a bad example because we already support
+ * // <media:content> natively, but it shows you how to parse through
+ * // the nodes.
+ * $group = $item->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'group');
+ * $content = $group[0]['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content'];
+ * $file = $content[0]['attribs']['']['url'];
+ * echo $file;
+ * </pre>
+ *
+ * @since 1.0
+ * @see http://simplepie.org/wiki/faq/supported_xml_namespaces
+ * @param string $namespace The URL of the XML namespace of the elements you're trying to access
+ * @param string $tag Tag name
+ * @return array
+ */
+ public function get_feed_tags($namespace, $tag)
+ {
+ $type = $this->get_type();
+ if ($type & SIMPLEPIE_TYPE_ATOM_10)
+ {
+ if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]['child'][$namespace][$tag]))
+ {
+ return $this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]['child'][$namespace][$tag];
+ }
+ }
+ if ($type & SIMPLEPIE_TYPE_ATOM_03)
+ {
+ if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]['child'][$namespace][$tag]))
+ {
+ return $this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]['child'][$namespace][$tag];
+ }
+ }
+ if ($type & SIMPLEPIE_TYPE_RSS_RDF)
+ {
+ if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][$namespace][$tag]))
+ {
+ return $this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][$namespace][$tag];
+ }
+ }
+ if ($type & SIMPLEPIE_TYPE_RSS_SYNDICATION)
+ {
+ if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][$namespace][$tag]))
+ {
+ return $this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][$namespace][$tag];
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Get data for an channel-level element
+ *
+ * This method allows you to get access to ANY element/attribute in the
+ * channel/header section of the feed.
+ *
+ * See {@see SimplePie::get_feed_tags()} for a description of the return value
+ *
+ * @since 1.0
+ * @see http://simplepie.org/wiki/faq/supported_xml_namespaces
+ * @param string $namespace The URL of the XML namespace of the elements you're trying to access
+ * @param string $tag Tag name
+ * @return array
+ */
+ public function get_channel_tags($namespace, $tag)
+ {
+ $type = $this->get_type();
+ if ($type & SIMPLEPIE_TYPE_ATOM_ALL)
+ {
+ if ($return = $this->get_feed_tags($namespace, $tag))
+ {
+ return $return;
+ }
+ }
+ if ($type & SIMPLEPIE_TYPE_RSS_10)
+ {
+ if ($channel = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'channel'))
+ {
+ if (isset($channel[0]['child'][$namespace][$tag]))
+ {
+ return $channel[0]['child'][$namespace][$tag];
+ }
+ }
+ }
+ if ($type & SIMPLEPIE_TYPE_RSS_090)
+ {
+ if ($channel = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'channel'))
+ {
+ if (isset($channel[0]['child'][$namespace][$tag]))
+ {
+ return $channel[0]['child'][$namespace][$tag];
+ }
+ }
+ }
+ if ($type & SIMPLEPIE_TYPE_RSS_SYNDICATION)
+ {
+ if ($channel = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'channel'))
+ {
+ if (isset($channel[0]['child'][$namespace][$tag]))
+ {
+ return $channel[0]['child'][$namespace][$tag];
+ }
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Get data for an channel-level element
+ *
+ * This method allows you to get access to ANY element/attribute in the
+ * image/logo section of the feed.
+ *
+ * See {@see SimplePie::get_feed_tags()} for a description of the return value
+ *
+ * @since 1.0
+ * @see http://simplepie.org/wiki/faq/supported_xml_namespaces
+ * @param string $namespace The URL of the XML namespace of the elements you're trying to access
+ * @param string $tag Tag name
+ * @return array
+ */
+ public function get_image_tags($namespace, $tag)
+ {
+ $type = $this->get_type();
+ if ($type & SIMPLEPIE_TYPE_RSS_10)
+ {
+ if ($image = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'image'))
+ {
+ if (isset($image[0]['child'][$namespace][$tag]))
+ {
+ return $image[0]['child'][$namespace][$tag];
+ }
+ }
+ }
+ if ($type & SIMPLEPIE_TYPE_RSS_090)
+ {
+ if ($image = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'image'))
+ {
+ if (isset($image[0]['child'][$namespace][$tag]))
+ {
+ return $image[0]['child'][$namespace][$tag];
+ }
+ }
+ }
+ if ($type & SIMPLEPIE_TYPE_RSS_SYNDICATION)
+ {
+ if ($image = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'image'))
+ {
+ if (isset($image[0]['child'][$namespace][$tag]))
+ {
+ return $image[0]['child'][$namespace][$tag];
+ }
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Get the base URL value from the feed
+ *
+ * Uses `<xml:base>` if available, otherwise uses the first link in the
+ * feed, or failing that, the URL of the feed itself.
+ *
+ * @see get_link
+ * @see subscribe_url
+ *
+ * @param array $element
+ * @return string
+ */
+ public function get_base($element = array())
+ {
+ if (!($this->get_type() & SIMPLEPIE_TYPE_RSS_SYNDICATION) && !empty($element['xml_base_explicit']) && isset($element['xml_base']))
+ {
+ return $element['xml_base'];
+ }
+ elseif ($this->get_link() !== null)
+ {
+ return $this->get_link();
+ }
+ else
+ {
+ return $this->subscribe_url();
+ }
+ }
+
+ /**
+ * Sanitize feed data
+ *
+ * @access private
+ * @see SimplePie_Sanitize::sanitize()
+ * @param string $data Data to sanitize
+ * @param int $type One of the SIMPLEPIE_CONSTRUCT_* constants
+ * @param string $base Base URL to resolve URLs against
+ * @return string Sanitized data
+ */
+ public function sanitize($data, $type, $base = '')
+ {
+ try
+ {
+ return $this->sanitize->sanitize($data, $type, $base);
+ }
+ catch (SimplePie_Exception $e)
+ {
+ if (!$this->enable_exceptions)
+ {
+ $this->error = $e->getMessage();
+ $this->registry->call('Misc', 'error', array($this->error, E_USER_WARNING, $e->getFile(), $e->getLine()));
+ return '';
+ }
+
+ throw $e;
+ }
+ }
+
+ /**
+ * Get the title of the feed
+ *
+ * Uses `<atom:title>`, `<title>` or `<dc:title>`
+ *
+ * @since 1.0 (previously called `get_feed_title` since 0.8)
+ * @return string|null
+ */
+ public function get_title()
+ {
+ if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'title'))
+ {
+ return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'title'))
+ {
+ return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'title'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'title'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'title'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'title'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'title'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get a category for the feed
+ *
+ * @since Unknown
+ * @param int $key The category that you want to return. Remember that arrays begin with 0, not 1
+ * @return SimplePie_Category|null
+ */
+ public function get_category($key = 0)
+ {
+ $categories = $this->get_categories();
+ if (isset($categories[$key]))
+ {
+ return $categories[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get all categories for the feed
+ *
+ * Uses `<atom:category>`, `<category>` or `<dc:subject>`
+ *
+ * @since Unknown
+ * @return array|null List of {@see SimplePie_Category} objects
+ */
+ public function get_categories()
+ {
+ $categories = array();
+
+ foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'category') as $category)
+ {
+ $term = null;
+ $scheme = null;
+ $label = null;
+ if (isset($category['attribs']['']['term']))
+ {
+ $term = $this->sanitize($category['attribs']['']['term'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($category['attribs']['']['scheme']))
+ {
+ $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($category['attribs']['']['label']))
+ {
+ $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $categories[] = $this->registry->create('Category', array($term, $scheme, $label));
+ }
+ foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'category') as $category)
+ {
+ // This is really the label, but keep this as the term also for BC.
+ // Label will also work on retrieving because that falls back to term.
+ $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ if (isset($category['attribs']['']['domain']))
+ {
+ $scheme = $this->sanitize($category['attribs']['']['domain'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $scheme = null;
+ }
+ $categories[] = $this->registry->create('Category', array($term, $scheme, null));
+ }
+ foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'subject') as $category)
+ {
+ $categories[] = $this->registry->create('Category', array($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));
+ }
+ foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'subject') as $category)
+ {
+ $categories[] = $this->registry->create('Category', array($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));
+ }
+
+ if (!empty($categories))
+ {
+ return array_unique($categories);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get an author for the feed
+ *
+ * @since 1.1
+ * @param int $key The author that you want to return. Remember that arrays begin with 0, not 1
+ * @return SimplePie_Author|null
+ */
+ public function get_author($key = 0)
+ {
+ $authors = $this->get_authors();
+ if (isset($authors[$key]))
+ {
+ return $authors[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get all authors for the feed
+ *
+ * Uses `<atom:author>`, `<author>`, `<dc:creator>` or `<itunes:author>`
+ *
+ * @since 1.1
+ * @return array|null List of {@see SimplePie_Author} objects
+ */
+ public function get_authors()
+ {
+ $authors = array();
+ foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'author') as $author)
+ {
+ $name = null;
+ $uri = null;
+ $email = null;
+ if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data']))
+ {
+ $name = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data']))
+ {
+ $uri = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]));
+ }
+ if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data']))
+ {
+ $email = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if ($name !== null || $email !== null || $uri !== null)
+ {
+ $authors[] = $this->registry->create('Author', array($name, $uri, $email));
+ }
+ }
+ if ($author = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'author'))
+ {
+ $name = null;
+ $url = null;
+ $email = null;
+ if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data']))
+ {
+ $name = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data']))
+ {
+ $url = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]));
+ }
+ if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data']))
+ {
+ $email = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if ($name !== null || $email !== null || $url !== null)
+ {
+ $authors[] = $this->registry->create('Author', array($name, $url, $email));
+ }
+ }
+ foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'creator') as $author)
+ {
+ $authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));
+ }
+ foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'creator') as $author)
+ {
+ $authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));
+ }
+ foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'author') as $author)
+ {
+ $authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));
+ }
+
+ if (!empty($authors))
+ {
+ return array_unique($authors);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get a contributor for the feed
+ *
+ * @since 1.1
+ * @param int $key The contrbutor that you want to return. Remember that arrays begin with 0, not 1
+ * @return SimplePie_Author|null
+ */
+ public function get_contributor($key = 0)
+ {
+ $contributors = $this->get_contributors();
+ if (isset($contributors[$key]))
+ {
+ return $contributors[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get all contributors for the feed
+ *
+ * Uses `<atom:contributor>`
+ *
+ * @since 1.1
+ * @return array|null List of {@see SimplePie_Author} objects
+ */
+ public function get_contributors()
+ {
+ $contributors = array();
+ foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'contributor') as $contributor)
+ {
+ $name = null;
+ $uri = null;
+ $email = null;
+ if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data']))
+ {
+ $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data']))
+ {
+ $uri = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]));
+ }
+ if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data']))
+ {
+ $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if ($name !== null || $email !== null || $uri !== null)
+ {
+ $contributors[] = $this->registry->create('Author', array($name, $uri, $email));
+ }
+ }
+ foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'contributor') as $contributor)
+ {
+ $name = null;
+ $url = null;
+ $email = null;
+ if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data']))
+ {
+ $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data']))
+ {
+ $url = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]));
+ }
+ if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data']))
+ {
+ $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if ($name !== null || $email !== null || $url !== null)
+ {
+ $contributors[] = $this->registry->create('Author', array($name, $url, $email));
+ }
+ }
+
+ if (!empty($contributors))
+ {
+ return array_unique($contributors);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get a single link for the feed
+ *
+ * @since 1.0 (previously called `get_feed_link` since Preview Release, `get_feed_permalink()` since 0.8)
+ * @param int $key The link that you want to return. Remember that arrays begin with 0, not 1
+ * @param string $rel The relationship of the link to return
+ * @return string|null Link URL
+ */
+ public function get_link($key = 0, $rel = 'alternate')
+ {
+ $links = $this->get_links($rel);
+ if (isset($links[$key]))
+ {
+ return $links[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get the permalink for the item
+ *
+ * Returns the first link available with a relationship of "alternate".
+ * Identical to {@see get_link()} with key 0
+ *
+ * @see get_link
+ * @since 1.0 (previously called `get_feed_link` since Preview Release, `get_feed_permalink()` since 0.8)
+ * @internal Added for parity between the parent-level and the item/entry-level.
+ * @return string|null Link URL
+ */
+ public function get_permalink()
+ {
+ return $this->get_link(0);
+ }
+
+ /**
+ * Get all links for the feed
+ *
+ * Uses `<atom:link>` or `<link>`
+ *
+ * @since Beta 2
+ * @param string $rel The relationship of links to return
+ * @return array|null Links found for the feed (strings)
+ */
+ public function get_links($rel = 'alternate')
+ {
+ if (!isset($this->data['links']))
+ {
+ $this->data['links'] = array();
+ if ($links = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'link'))
+ {
+ foreach ($links as $link)
+ {
+ if (isset($link['attribs']['']['href']))
+ {
+ $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate';
+ $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));
+ }
+ }
+ }
+ if ($links = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'link'))
+ {
+ foreach ($links as $link)
+ {
+ if (isset($link['attribs']['']['href']))
+ {
+ $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate';
+ $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));
+
+ }
+ }
+ }
+ if ($links = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'link'))
+ {
+ $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
+ }
+ if ($links = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'link'))
+ {
+ $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
+ }
+ if ($links = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'link'))
+ {
+ $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
+ }
+
+ $keys = array_keys($this->data['links']);
+ foreach ($keys as $key)
+ {
+ if ($this->registry->call('Misc', 'is_isegment_nz_nc', array($key)))
+ {
+ if (isset($this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]))
+ {
+ $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] = array_merge($this->data['links'][$key], $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]);
+ $this->data['links'][$key] =& $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key];
+ }
+ else
+ {
+ $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] =& $this->data['links'][$key];
+ }
+ }
+ elseif (substr($key, 0, 41) === SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY)
+ {
+ $this->data['links'][substr($key, 41)] =& $this->data['links'][$key];
+ }
+ $this->data['links'][$key] = array_unique($this->data['links'][$key]);
+ }
+ }
+
+ if (isset($this->data['links'][$rel]))
+ {
+ return $this->data['links'][$rel];
+ }
+ else if (isset($this->data['headers']['link']) &&
+ preg_match('/<([^>]+)>; rel='.preg_quote($rel).'/',
+ $this->data['headers']['link'], $match))
+ {
+ return array($match[1]);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ public function get_all_discovered_feeds()
+ {
+ return $this->all_discovered_feeds;
+ }
+
+ /**
+ * Get the content for the item
+ *
+ * Uses `<atom:subtitle>`, `<atom:tagline>`, `<description>`,
+ * `<dc:description>`, `<itunes:summary>` or `<itunes:subtitle>`
+ *
+ * @since 1.0 (previously called `get_feed_description()` since 0.8)
+ * @return string|null
+ */
+ public function get_description()
+ {
+ if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'subtitle'))
+ {
+ return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'tagline'))
+ {
+ return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'description'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'description'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'description'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'description'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'description'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'summary'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'subtitle'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get the copyright info for the feed
+ *
+ * Uses `<atom:rights>`, `<atom:copyright>` or `<dc:rights>`
+ *
+ * @since 1.0 (previously called `get_feed_copyright()` since 0.8)
+ * @return string|null
+ */
+ public function get_copyright()
+ {
+ if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'rights'))
+ {
+ return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'copyright'))
+ {
+ return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'copyright'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'rights'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'rights'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get the language for the feed
+ *
+ * Uses `<language>`, `<dc:language>`, or @xml_lang
+ *
+ * @since 1.0 (previously called `get_feed_language()` since 0.8)
+ * @return string|null
+ */
+ public function get_language()
+ {
+ if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'language'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'language'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'language'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]['xml_lang']))
+ {
+ return $this->sanitize($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]['xml_lang'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]['xml_lang']))
+ {
+ return $this->sanitize($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]['xml_lang'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['xml_lang']))
+ {
+ return $this->sanitize($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['xml_lang'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif (isset($this->data['headers']['content-language']))
+ {
+ return $this->sanitize($this->data['headers']['content-language'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get the latitude coordinates for the item
+ *
+ * Compatible with the W3C WGS84 Basic Geo and GeoRSS specifications
+ *
+ * Uses `<geo:lat>` or `<georss:point>`
+ *
+ * @since 1.0
+ * @link http://www.w3.org/2003/01/geo/ W3C WGS84 Basic Geo
+ * @link http://www.georss.org/ GeoRSS
+ * @return string|null
+ */
+ public function get_latitude()
+ {
+
+ if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lat'))
+ {
+ return (float) $return[0]['data'];
+ }
+ elseif (($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match))
+ {
+ return (float) $match[1];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get the longitude coordinates for the feed
+ *
+ * Compatible with the W3C WGS84 Basic Geo and GeoRSS specifications
+ *
+ * Uses `<geo:long>`, `<geo:lon>` or `<georss:point>`
+ *
+ * @since 1.0
+ * @link http://www.w3.org/2003/01/geo/ W3C WGS84 Basic Geo
+ * @link http://www.georss.org/ GeoRSS
+ * @return string|null
+ */
+ public function get_longitude()
+ {
+ if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'long'))
+ {
+ return (float) $return[0]['data'];
+ }
+ elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lon'))
+ {
+ return (float) $return[0]['data'];
+ }
+ elseif (($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match))
+ {
+ return (float) $match[2];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get the feed logo's title
+ *
+ * RSS 0.9.0, 1.0 and 2.0 feeds are allowed to have a "feed logo" title.
+ *
+ * Uses `<image><title>` or `<image><dc:title>`
+ *
+ * @return string|null
+ */
+ public function get_image_title()
+ {
+ if ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'title'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'title'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'title'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_DC_11, 'title'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_DC_10, 'title'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get the feed logo's URL
+ *
+ * RSS 0.9.0, 2.0, Atom 1.0, and feeds with iTunes RSS tags are allowed to
+ * have a "feed logo" URL. This points directly to the image itself.
+ *
+ * Uses `<itunes:image>`, `<atom:logo>`, `<atom:icon>`,
+ * `<image><title>` or `<image><dc:title>`
+ *
+ * @return string|null
+ */
+ public function get_image_url()
+ {
+ if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'image'))
+ {
+ return $this->sanitize($return[0]['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI);
+ }
+ elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'logo'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'icon'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'url'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'url'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'url'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+
+ /**
+ * Get the feed logo's link
+ *
+ * RSS 0.9.0, 1.0 and 2.0 feeds are allowed to have a "feed logo" link. This
+ * points to a human-readable page that the image should link to.
+ *
+ * Uses `<itunes:image>`, `<atom:logo>`, `<atom:icon>`,
+ * `<image><title>` or `<image><dc:title>`
+ *
+ * @return string|null
+ */
+ public function get_image_link()
+ {
+ if ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'link'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'link'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'link'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get the feed logo's link
+ *
+ * RSS 2.0 feeds are allowed to have a "feed logo" width.
+ *
+ * Uses `<image><width>` or defaults to 88.0 if no width is specified and
+ * the feed is an RSS 2.0 feed.
+ *
+ * @return int|float|null
+ */
+ public function get_image_width()
+ {
+ if ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'width'))
+ {
+ return round($return[0]['data']);
+ }
+ elseif ($this->get_type() & SIMPLEPIE_TYPE_RSS_SYNDICATION && $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'url'))
+ {
+ return 88.0;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get the feed logo's height
+ *
+ * RSS 2.0 feeds are allowed to have a "feed logo" height.
+ *
+ * Uses `<image><height>` or defaults to 31.0 if no height is specified and
+ * the feed is an RSS 2.0 feed.
+ *
+ * @return int|float|null
+ */
+ public function get_image_height()
+ {
+ if ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'height'))
+ {
+ return round($return[0]['data']);
+ }
+ elseif ($this->get_type() & SIMPLEPIE_TYPE_RSS_SYNDICATION && $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'url'))
+ {
+ return 31.0;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get the number of items in the feed
+ *
+ * This is well-suited for {@link http://php.net/for for()} loops with
+ * {@see get_item()}
+ *
+ * @param int $max Maximum value to return. 0 for no limit
+ * @return int Number of items in the feed
+ */
+ public function get_item_quantity($max = 0)
+ {
+ $max = (int) $max;
+ $qty = count($this->get_items());
+ if ($max === 0)
+ {
+ return $qty;
+ }
+ else
+ {
+ return ($qty > $max) ? $max : $qty;
+ }
+ }
+
+ /**
+ * Get a single item from the feed
+ *
+ * This is better suited for {@link http://php.net/for for()} loops, whereas
+ * {@see get_items()} is better suited for
+ * {@link http://php.net/foreach foreach()} loops.
+ *
+ * @see get_item_quantity()
+ * @since Beta 2
+ * @param int $key The item that you want to return. Remember that arrays begin with 0, not 1
+ * @return SimplePie_Item|null
+ */
+ public function get_item($key = 0)
+ {
+ $items = $this->get_items();
+ if (isset($items[$key]))
+ {
+ return $items[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get all items from the feed
+ *
+ * This is better suited for {@link http://php.net/for for()} loops, whereas
+ * {@see get_items()} is better suited for
+ * {@link http://php.net/foreach foreach()} loops.
+ *
+ * @see get_item_quantity
+ * @since Beta 2
+ * @param int $start Index to start at
+ * @param int $end Number of items to return. 0 for all items after `$start`
+ * @return SimplePie_Item[]|null List of {@see SimplePie_Item} objects
+ */
+ public function get_items($start = 0, $end = 0)
+ {
+ if (!isset($this->data['items']))
+ {
+ if (!empty($this->multifeed_objects))
+ {
+ $this->data['items'] = SimplePie::merge_items($this->multifeed_objects, $start, $end, $this->item_limit);
+ if (empty($this->data['items']))
+ {
+ return array();
+ }
+ return $this->data['items'];
+ }
+ $this->data['items'] = array();
+ if ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'entry'))
+ {
+ $keys = array_keys($items);
+ foreach ($keys as $key)
+ {
+ $this->data['items'][] = $this->registry->create('Item', array($this, $items[$key]));
+ }
+ }
+ if ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'entry'))
+ {
+ $keys = array_keys($items);
+ foreach ($keys as $key)
+ {
+ $this->data['items'][] = $this->registry->create('Item', array($this, $items[$key]));
+ }
+ }
+ if ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'item'))
+ {
+ $keys = array_keys($items);
+ foreach ($keys as $key)
+ {
+ $this->data['items'][] = $this->registry->create('Item', array($this, $items[$key]));
+ }
+ }
+ if ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'item'))
+ {
+ $keys = array_keys($items);
+ foreach ($keys as $key)
+ {
+ $this->data['items'][] = $this->registry->create('Item', array($this, $items[$key]));
+ }
+ }
+ if ($items = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'item'))
+ {
+ $keys = array_keys($items);
+ foreach ($keys as $key)
+ {
+ $this->data['items'][] = $this->registry->create('Item', array($this, $items[$key]));
+ }
+ }
+ }
+
+ if (empty($this->data['items']))
+ {
+ return array();
+ }
+
+ if ($this->order_by_date)
+ {
+ if (!isset($this->data['ordered_items']))
+ {
+ $this->data['ordered_items'] = $this->data['items'];
+ usort($this->data['ordered_items'], array(get_class($this), 'sort_items'));
+ }
+ $items = $this->data['ordered_items'];
+ }
+ else
+ {
+ $items = $this->data['items'];
+ }
+ // Slice the data as desired
+ if ($end === 0)
+ {
+ return array_slice($items, $start);
+ }
+ else
+ {
+ return array_slice($items, $start, $end);
+ }
+ }
+
+ /**
+ * Set the favicon handler
+ *
+ * @deprecated Use your own favicon handling instead
+ */
+ public function set_favicon_handler($page = false, $qs = 'i')
+ {
+ $level = defined('E_USER_DEPRECATED') ? E_USER_DEPRECATED : E_USER_WARNING;
+ trigger_error('Favicon handling has been removed, please use your own handling', $level);
+ return false;
+ }
+
+ /**
+ * Get the favicon for the current feed
+ *
+ * @deprecated Use your own favicon handling instead
+ */
+ public function get_favicon()
+ {
+ $level = defined('E_USER_DEPRECATED') ? E_USER_DEPRECATED : E_USER_WARNING;
+ trigger_error('Favicon handling has been removed, please use your own handling', $level);
+
+ if (($url = $this->get_link()) !== null)
+ {
+ return 'http://g.etfv.co/' . urlencode($url);
+ }
+
+ return false;
+ }
+
+ /**
+ * Magic method handler
+ *
+ * @param string $method Method name
+ * @param array $args Arguments to the method
+ * @return mixed
+ */
+ public function __call($method, $args)
+ {
+ if (strpos($method, 'subscribe_') === 0)
+ {
+ $level = defined('E_USER_DEPRECATED') ? E_USER_DEPRECATED : E_USER_WARNING;
+ trigger_error('subscribe_*() has been deprecated, implement the callback yourself', $level);
+ return '';
+ }
+ if ($method === 'enable_xml_dump')
+ {
+ $level = defined('E_USER_DEPRECATED') ? E_USER_DEPRECATED : E_USER_WARNING;
+ trigger_error('enable_xml_dump() has been deprecated, use get_raw_data() instead', $level);
+ return false;
+ }
+
+ $class = get_class($this);
+ $trace = debug_backtrace();
+ $file = $trace[0]['file'];
+ $line = $trace[0]['line'];
+ trigger_error("Call to undefined method $class::$method() in $file on line $line", E_USER_ERROR);
+ }
+
+ /**
+ * Sorting callback for items
+ *
+ * @access private
+ * @param SimplePie $a
+ * @param SimplePie $b
+ * @return boolean
+ */
+ public static function sort_items($a, $b)
+ {
+ $a_date = $a->get_date('U');
+ $b_date = $b->get_date('U');
+ if ($a_date && $b_date) {
+ return $a_date > $b_date ? -1 : 1;
+ }
+ // Sort items without dates to the top.
+ if ($a_date) {
+ return 1;
+ }
+ if ($b_date) {
+ return -1;
+ }
+ return 0;
+ }
+
+ /**
+ * Merge items from several feeds into one
+ *
+ * If you're merging multiple feeds together, they need to all have dates
+ * for the items or else SimplePie will refuse to sort them.
+ *
+ * @link http://simplepie.org/wiki/tutorial/sort_multiple_feeds_by_time_and_date#if_feeds_require_separate_per-feed_settings
+ * @param array $urls List of SimplePie feed objects to merge
+ * @param int $start Starting item
+ * @param int $end Number of items to return
+ * @param int $limit Maximum number of items per feed
+ * @return array
+ */
+ public static function merge_items($urls, $start = 0, $end = 0, $limit = 0)
+ {
+ if (is_array($urls) && sizeof($urls) > 0)
+ {
+ $items = array();
+ foreach ($urls as $arg)
+ {
+ if ($arg instanceof SimplePie)
+ {
+ $items = array_merge($items, $arg->get_items(0, $limit));
+ }
+ else
+ {
+ trigger_error('Arguments must be SimplePie objects', E_USER_WARNING);
+ }
+ }
+
+ usort($items, array(get_class($urls[0]), 'sort_items'));
+
+ if ($end === 0)
+ {
+ return array_slice($items, $start);
+ }
+ else
+ {
+ return array_slice($items, $start, $end);
+ }
+ }
+ else
+ {
+ trigger_error('Cannot merge zero SimplePie objects', E_USER_WARNING);
+ return array();
+ }
+ }
+
+ /**
+ * Store PubSubHubbub links as headers
+ *
+ * There is no way to find PuSH links in the body of a microformats feed,
+ * so they are added to the headers when found, to be used later by get_links.
+ * @param SimplePie_File $file
+ * @param string $hub
+ * @param string $self
+ */
+ private function store_links(&$file, $hub, $self) {
+ if (isset($file->headers['link']['hub']) ||
+ (isset($file->headers['link']) &&
+ preg_match('/rel=hub/', $file->headers['link'])))
+ {
+ return;
+ }
+
+ if ($hub)
+ {
+ if (isset($file->headers['link']))
+ {
+ if ($file->headers['link'] !== '')
+ {
+ $file->headers['link'] = ', ';
+ }
+ }
+ else
+ {
+ $file->headers['link'] = '';
+ }
+ $file->headers['link'] .= '<'.$hub.'>; rel=hub';
+ if ($self)
+ {
+ $file->headers['link'] .= ', <'.$self.'>; rel=self';
+ }
+ }
+ }
+}
diff --git a/vendor/simplepie/simplepie/library/SimplePie/Author.php b/vendor/simplepie/simplepie/library/SimplePie/Author.php
new file mode 100644
index 000000000..e6768ff29
--- /dev/null
+++ b/vendor/simplepie/simplepie/library/SimplePie/Author.php
@@ -0,0 +1,156 @@
+<?php
+/**
+ * SimplePie
+ *
+ * A PHP-Based RSS and Atom Feed Framework.
+ * Takes the hard work out of managing a complete RSS/Atom solution.
+ *
+ * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * * Neither the name of the SimplePie Team nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
+ * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @package SimplePie
+ * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @author Ryan Parman
+ * @author Geoffrey Sneddon
+ * @author Ryan McCue
+ * @link http://simplepie.org/ SimplePie
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ */
+
+/**
+ * Manages all author-related data
+ *
+ * Used by {@see SimplePie_Item::get_author()} and {@see SimplePie::get_authors()}
+ *
+ * This class can be overloaded with {@see SimplePie::set_author_class()}
+ *
+ * @package SimplePie
+ * @subpackage API
+ */
+class SimplePie_Author
+{
+ /**
+ * Author's name
+ *
+ * @var string
+ * @see get_name()
+ */
+ var $name;
+
+ /**
+ * Author's link
+ *
+ * @var string
+ * @see get_link()
+ */
+ var $link;
+
+ /**
+ * Author's email address
+ *
+ * @var string
+ * @see get_email()
+ */
+ var $email;
+
+ /**
+ * Constructor, used to input the data
+ *
+ * @param string $name
+ * @param string $link
+ * @param string $email
+ */
+ public function __construct($name = null, $link = null, $email = null)
+ {
+ $this->name = $name;
+ $this->link = $link;
+ $this->email = $email;
+ }
+
+ /**
+ * String-ified version
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ // There is no $this->data here
+ return md5(serialize($this));
+ }
+
+ /**
+ * Author's name
+ *
+ * @return string|null
+ */
+ public function get_name()
+ {
+ if ($this->name !== null)
+ {
+ return $this->name;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Author's link
+ *
+ * @return string|null
+ */
+ public function get_link()
+ {
+ if ($this->link !== null)
+ {
+ return $this->link;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Author's email address
+ *
+ * @return string|null
+ */
+ public function get_email()
+ {
+ if ($this->email !== null)
+ {
+ return $this->email;
+ }
+ else
+ {
+ return null;
+ }
+ }
+}
+
diff --git a/vendor/simplepie/simplepie/library/SimplePie/Cache.php b/vendor/simplepie/simplepie/library/SimplePie/Cache.php
new file mode 100644
index 000000000..d98cc6511
--- /dev/null
+++ b/vendor/simplepie/simplepie/library/SimplePie/Cache.php
@@ -0,0 +1,134 @@
+<?php
+/**
+ * SimplePie
+ *
+ * A PHP-Based RSS and Atom Feed Framework.
+ * Takes the hard work out of managing a complete RSS/Atom solution.
+ *
+ * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * * Neither the name of the SimplePie Team nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
+ * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @package SimplePie
+ * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @author Ryan Parman
+ * @author Geoffrey Sneddon
+ * @author Ryan McCue
+ * @link http://simplepie.org/ SimplePie
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ */
+
+/**
+ * Used to create cache objects
+ *
+ * This class can be overloaded with {@see SimplePie::set_cache_class()},
+ * although the preferred way is to create your own handler
+ * via {@see register()}
+ *
+ * @package SimplePie
+ * @subpackage Caching
+ */
+class SimplePie_Cache
+{
+ /**
+ * Cache handler classes
+ *
+ * These receive 3 parameters to their constructor, as documented in
+ * {@see register()}
+ * @var array
+ */
+ protected static $handlers = array(
+ 'mysql' => 'SimplePie_Cache_MySQL',
+ 'memcache' => 'SimplePie_Cache_Memcache',
+ 'memcached' => 'SimplePie_Cache_Memcached',
+ 'redis' => 'SimplePie_Cache_Redis'
+ );
+
+ /**
+ * Don't call the constructor. Please.
+ */
+ private function __construct() { }
+
+ /**
+ * Create a new SimplePie_Cache object
+ *
+ * @param string $location URL location (scheme is used to determine handler)
+ * @param string $filename Unique identifier for cache object
+ * @param string $extension 'spi' or 'spc'
+ * @return SimplePie_Cache_Base Type of object depends on scheme of `$location`
+ */
+ public static function get_handler($location, $filename, $extension)
+ {
+ $type = explode(':', $location, 2);
+ $type = $type[0];
+ if (!empty(self::$handlers[$type]))
+ {
+ $class = self::$handlers[$type];
+ return new $class($location, $filename, $extension);
+ }
+
+ return new SimplePie_Cache_File($location, $filename, $extension);
+ }
+
+ /**
+ * Create a new SimplePie_Cache object
+ *
+ * @deprecated Use {@see get_handler} instead
+ */
+ public function create($location, $filename, $extension)
+ {
+ trigger_error('Cache::create() has been replaced with Cache::get_handler(). Switch to the registry system to use this.', E_USER_DEPRECATED);
+ return self::get_handler($location, $filename, $extension);
+ }
+
+ /**
+ * Register a handler
+ *
+ * @param string $type DSN type to register for
+ * @param string $class Name of handler class. Must implement SimplePie_Cache_Base
+ */
+ public static function register($type, $class)
+ {
+ self::$handlers[$type] = $class;
+ }
+
+ /**
+ * Parse a URL into an array
+ *
+ * @param string $url
+ * @return array
+ */
+ public static function parse_URL($url)
+ {
+ $params = parse_url($url);
+ $params['extras'] = array();
+ if (isset($params['query']))
+ {
+ parse_str($params['query'], $params['extras']);
+ }
+ return $params;
+ }
+}
diff --git a/vendor/simplepie/simplepie/library/SimplePie/Cache/Base.php b/vendor/simplepie/simplepie/library/SimplePie/Cache/Base.php
new file mode 100644
index 000000000..333fb05cf
--- /dev/null
+++ b/vendor/simplepie/simplepie/library/SimplePie/Cache/Base.php
@@ -0,0 +1,113 @@
+<?php
+/**
+ * SimplePie
+ *
+ * A PHP-Based RSS and Atom Feed Framework.
+ * Takes the hard work out of managing a complete RSS/Atom solution.
+ *
+ * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * * Neither the name of the SimplePie Team nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
+ * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @package SimplePie
+ * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @author Ryan Parman
+ * @author Geoffrey Sneddon
+ * @author Ryan McCue
+ * @link http://simplepie.org/ SimplePie
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ */
+
+/**
+ * Base for cache objects
+ *
+ * Classes to be used with {@see SimplePie_Cache::register()} are expected
+ * to implement this interface.
+ *
+ * @package SimplePie
+ * @subpackage Caching
+ */
+interface SimplePie_Cache_Base
+{
+ /**
+ * Feed cache type
+ *
+ * @var string
+ */
+ const TYPE_FEED = 'spc';
+
+ /**
+ * Image cache type
+ *
+ * @var string
+ */
+ const TYPE_IMAGE = 'spi';
+
+ /**
+ * Create a new cache object
+ *
+ * @param string $location Location string (from SimplePie::$cache_location)
+ * @param string $name Unique ID for the cache
+ * @param string $type Either TYPE_FEED for SimplePie data, or TYPE_IMAGE for image data
+ */
+ public function __construct($location, $name, $type);
+
+ /**
+ * Save data to the cache
+ *
+ * @param array|SimplePie $data Data to store in the cache. If passed a SimplePie object, only cache the $data property
+ * @return bool Successfulness
+ */
+ public function save($data);
+
+ /**
+ * Retrieve the data saved to the cache
+ *
+ * @return array Data for SimplePie::$data
+ */
+ public function load();
+
+ /**
+ * Retrieve the last modified time for the cache
+ *
+ * @return int Timestamp
+ */
+ public function mtime();
+
+ /**
+ * Set the last modified time to the current time
+ *
+ * @return bool Success status
+ */
+ public function touch();
+
+ /**
+ * Remove the cache
+ *
+ * @return bool Success status
+ */
+ public function unlink();
+}
diff --git a/vendor/simplepie/simplepie/library/SimplePie/Cache/DB.php b/vendor/simplepie/simplepie/library/SimplePie/Cache/DB.php
new file mode 100644
index 000000000..7e8f77532
--- /dev/null
+++ b/vendor/simplepie/simplepie/library/SimplePie/Cache/DB.php
@@ -0,0 +1,136 @@
+<?php
+/**
+ * SimplePie
+ *
+ * A PHP-Based RSS and Atom Feed Framework.
+ * Takes the hard work out of managing a complete RSS/Atom solution.
+ *
+ * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * * Neither the name of the SimplePie Team nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
+ * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @package SimplePie
+ * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @author Ryan Parman
+ * @author Geoffrey Sneddon
+ * @author Ryan McCue
+ * @link http://simplepie.org/ SimplePie
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ */
+
+/**
+ * Base class for database-based caches
+ *
+ * @package SimplePie
+ * @subpackage Caching
+ */
+abstract class SimplePie_Cache_DB implements SimplePie_Cache_Base
+{
+ /**
+ * Helper for database conversion
+ *
+ * Converts a given {@see SimplePie} object into data to be stored
+ *
+ * @param SimplePie $data
+ * @return array First item is the serialized data for storage, second item is the unique ID for this item
+ */
+ protected static function prepare_simplepie_object_for_cache($data)
+ {
+ $items = $data->get_items();
+ $items_by_id = array();
+
+ if (!empty($items))
+ {
+ foreach ($items as $item)
+ {
+ $items_by_id[$item->get_id()] = $item;
+ }
+
+ if (count($items_by_id) !== count($items))
+ {
+ $items_by_id = array();
+ foreach ($items as $item)
+ {
+ $items_by_id[$item->get_id(true)] = $item;
+ }
+ }
+
+ if (isset($data->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]))
+ {
+ $channel =& $data->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0];
+ }
+ elseif (isset($data->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]))
+ {
+ $channel =& $data->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0];
+ }
+ elseif (isset($data->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]))
+ {
+ $channel =& $data->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0];
+ }
+ elseif (isset($data->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_20]['channel'][0]))
+ {
+ $channel =& $data->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_20]['channel'][0];
+ }
+ else
+ {
+ $channel = null;
+ }
+
+ if ($channel !== null)
+ {
+ if (isset($channel['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['entry']))
+ {
+ unset($channel['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['entry']);
+ }
+ if (isset($channel['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['entry']))
+ {
+ unset($channel['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['entry']);
+ }
+ if (isset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_10]['item']))
+ {
+ unset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_10]['item']);
+ }
+ if (isset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_090]['item']))
+ {
+ unset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_090]['item']);
+ }
+ if (isset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_20]['item']))
+ {
+ unset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_20]['item']);
+ }
+ }
+ if (isset($data->data['items']))
+ {
+ unset($data->data['items']);
+ }
+ if (isset($data->data['ordered_items']))
+ {
+ unset($data->data['ordered_items']);
+ }
+ }
+ return array(serialize($data->data), $items_by_id);
+ }
+}
diff --git a/vendor/simplepie/simplepie/library/SimplePie/Cache/File.php b/vendor/simplepie/simplepie/library/SimplePie/Cache/File.php
new file mode 100644
index 000000000..6ba6c5f6e
--- /dev/null
+++ b/vendor/simplepie/simplepie/library/SimplePie/Cache/File.php
@@ -0,0 +1,164 @@
+<?php
+/**
+ * SimplePie
+ *
+ * A PHP-Based RSS and Atom Feed Framework.
+ * Takes the hard work out of managing a complete RSS/Atom solution.
+ *
+ * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * * Neither the name of the SimplePie Team nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
+ * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @package SimplePie
+ * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @author Ryan Parman
+ * @author Geoffrey Sneddon
+ * @author Ryan McCue
+ * @link http://simplepie.org/ SimplePie
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ */
+
+/**
+ * Caches data to the filesystem
+ *
+ * @package SimplePie
+ * @subpackage Caching
+ */
+class SimplePie_Cache_File implements SimplePie_Cache_Base
+{
+ /**
+ * Location string
+ *
+ * @see SimplePie::$cache_location
+ * @var string
+ */
+ protected $location;
+
+ /**
+ * Filename
+ *
+ * @var string
+ */
+ protected $filename;
+
+ /**
+ * File extension
+ *
+ * @var string
+ */
+ protected $extension;
+
+ /**
+ * File path
+ *
+ * @var string
+ */
+ protected $name;
+
+ /**
+ * Create a new cache object
+ *
+ * @param string $location Location string (from SimplePie::$cache_location)
+ * @param string $name Unique ID for the cache
+ * @param string $type Either TYPE_FEED for SimplePie data, or TYPE_IMAGE for image data
+ */
+ public function __construct($location, $name, $type)
+ {
+ $this->location = $location;
+ $this->filename = $name;
+ $this->extension = $type;
+ $this->name = "$this->location/$this->filename.$this->extension";
+ }
+
+ /**
+ * Save data to the cache
+ *
+ * @param array|SimplePie $data Data to store in the cache. If passed a SimplePie object, only cache the $data property
+ * @return bool Successfulness
+ */
+ public function save($data)
+ {
+ if (file_exists($this->name) && is_writeable($this->name) || file_exists($this->location) && is_writeable($this->location))
+ {
+ if ($data instanceof SimplePie)
+ {
+ $data = $data->data;
+ }
+
+ $data = serialize($data);
+ return (bool) file_put_contents($this->name, $data);
+ }
+ return false;
+ }
+
+ /**
+ * Retrieve the data saved to the cache
+ *
+ * @return array Data for SimplePie::$data
+ */
+ public function load()
+ {
+ if (file_exists($this->name) && is_readable($this->name))
+ {
+ return unserialize(file_get_contents($this->name));
+ }
+ return false;
+ }
+
+ /**
+ * Retrieve the last modified time for the cache
+ *
+ * @return int Timestamp
+ */
+ public function mtime()
+ {
+ return @filemtime($this->name);
+ }
+
+ /**
+ * Set the last modified time to the current time
+ *
+ * @return bool Success status
+ */
+ public function touch()
+ {
+ return @touch($this->name);
+ }
+
+ /**
+ * Remove the cache
+ *
+ * @return bool Success status
+ */
+ public function unlink()
+ {
+ if (file_exists($this->name))
+ {
+ return unlink($this->name);
+ }
+ return false;
+ }
+}
diff --git a/vendor/simplepie/simplepie/library/SimplePie/Cache/Memcache.php b/vendor/simplepie/simplepie/library/SimplePie/Cache/Memcache.php
new file mode 100644
index 000000000..5190eef93
--- /dev/null
+++ b/vendor/simplepie/simplepie/library/SimplePie/Cache/Memcache.php
@@ -0,0 +1,180 @@
+<?php
+/**
+ * SimplePie
+ *
+ * A PHP-Based RSS and Atom Feed Framework.
+ * Takes the hard work out of managing a complete RSS/Atom solution.
+ *
+ * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * * Neither the name of the SimplePie Team nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
+ * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @package SimplePie
+ * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @author Ryan Parman
+ * @author Geoffrey Sneddon
+ * @author Ryan McCue
+ * @link http://simplepie.org/ SimplePie
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ */
+
+/**
+ * Caches data to memcache
+ *
+ * Registered for URLs with the "memcache" protocol
+ *
+ * For example, `memcache://localhost:11211/?timeout=3600&prefix=sp_` will
+ * connect to memcache on `localhost` on port 11211. All tables will be
+ * prefixed with `sp_` and data will expire after 3600 seconds
+ *
+ * @package SimplePie
+ * @subpackage Caching
+ * @uses Memcache
+ */
+class SimplePie_Cache_Memcache implements SimplePie_Cache_Base
+{
+ /**
+ * Memcache instance
+ *
+ * @var Memcache
+ */
+ protected $cache;
+
+ /**
+ * Options
+ *
+ * @var array
+ */
+ protected $options;
+
+ /**
+ * Cache name
+ *
+ * @var string
+ */
+ protected $name;
+
+ /**
+ * Create a new cache object
+ *
+ * @param string $location Location string (from SimplePie::$cache_location)
+ * @param string $name Unique ID for the cache
+ * @param string $type Either TYPE_FEED for SimplePie data, or TYPE_IMAGE for image data
+ */
+ public function __construct($location, $name, $type)
+ {
+ $this->options = array(
+ 'host' => '127.0.0.1',
+ 'port' => 11211,
+ 'extras' => array(
+ 'timeout' => 3600, // one hour
+ 'prefix' => 'simplepie_',
+ ),
+ );
+ $this->options = SimplePie_Misc::array_merge_recursive($this->options, SimplePie_Cache::parse_URL($location));
+
+ $this->name = $this->options['extras']['prefix'] . md5("$name:$type");
+
+ $this->cache = new Memcache();
+ $this->cache->addServer($this->options['host'], (int) $this->options['port']);
+ }
+
+ /**
+ * Save data to the cache
+ *
+ * @param array|SimplePie $data Data to store in the cache. If passed a SimplePie object, only cache the $data property
+ * @return bool Successfulness
+ */
+ public function save($data)
+ {
+ if ($data instanceof SimplePie)
+ {
+ $data = $data->data;
+ }
+ return $this->cache->set($this->name, serialize($data), MEMCACHE_COMPRESSED, (int) $this->options['extras']['timeout']);
+ }
+
+ /**
+ * Retrieve the data saved to the cache
+ *
+ * @return array Data for SimplePie::$data
+ */
+ public function load()
+ {
+ $data = $this->cache->get($this->name);
+
+ if ($data !== false)
+ {
+ return unserialize($data);
+ }
+ return false;
+ }
+
+ /**
+ * Retrieve the last modified time for the cache
+ *
+ * @return int Timestamp
+ */
+ public function mtime()
+ {
+ $data = $this->cache->get($this->name);
+
+ if ($data !== false)
+ {
+ // essentially ignore the mtime because Memcache expires on its own
+ return time();
+ }
+
+ return false;
+ }
+
+ /**
+ * Set the last modified time to the current time
+ *
+ * @return bool Success status
+ */
+ public function touch()
+ {
+ $data = $this->cache->get($this->name);
+
+ if ($data !== false)
+ {
+ return $this->cache->set($this->name, $data, MEMCACHE_COMPRESSED, (int) $this->options['extras']['timeout']);
+ }
+
+ return false;
+ }
+
+ /**
+ * Remove the cache
+ *
+ * @return bool Success status
+ */
+ public function unlink()
+ {
+ return $this->cache->delete($this->name, 0);
+ }
+}
diff --git a/vendor/simplepie/simplepie/library/SimplePie/Cache/Memcached.php b/vendor/simplepie/simplepie/library/SimplePie/Cache/Memcached.php
new file mode 100755
index 000000000..1f73b3890
--- /dev/null
+++ b/vendor/simplepie/simplepie/library/SimplePie/Cache/Memcached.php
@@ -0,0 +1,166 @@
+<?php
+/**
+ * SimplePie
+ *
+ * A PHP-Based RSS and Atom Feed Framework.
+ * Takes the hard work out of managing a complete RSS/Atom solution.
+ *
+ * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * * Neither the name of the SimplePie Team nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
+ * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @package SimplePie
+ * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @author Ryan Parman
+ * @author Geoffrey Sneddon
+ * @author Ryan McCue
+ * @link http://simplepie.org/ SimplePie
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ */
+
+/**
+ * Caches data to memcached
+ *
+ * Registered for URLs with the "memcached" protocol
+ *
+ * For example, `memcached://localhost:11211/?timeout=3600&prefix=sp_` will
+ * connect to memcached on `localhost` on port 11211. All tables will be
+ * prefixed with `sp_` and data will expire after 3600 seconds
+ *
+ * @package SimplePie
+ * @subpackage Caching
+ * @author Paul L. McNeely
+ * @uses Memcached
+ */
+class SimplePie_Cache_Memcached implements SimplePie_Cache_Base
+{
+ /**
+ * Memcached instance
+ * @var Memcached
+ */
+ protected $cache;
+
+ /**
+ * Options
+ * @var array
+ */
+ protected $options;
+
+ /**
+ * Cache name
+ * @var string
+ */
+ protected $name;
+
+ /**
+ * Create a new cache object
+ * @param string $location Location string (from SimplePie::$cache_location)
+ * @param string $name Unique ID for the cache
+ * @param string $type Either TYPE_FEED for SimplePie data, or TYPE_IMAGE for image data
+ */
+ public function __construct($location, $name, $type) {
+ $this->options = array(
+ 'host' => '127.0.0.1',
+ 'port' => 11211,
+ 'extras' => array(
+ 'timeout' => 3600, // one hour
+ 'prefix' => 'simplepie_',
+ ),
+ );
+ $this->options = SimplePie_Misc::array_merge_recursive($this->options, SimplePie_Cache::parse_URL($location));
+
+ $this->name = $this->options['extras']['prefix'] . md5("$name:$type");
+
+ $this->cache = new Memcached();
+ $this->cache->addServer($this->options['host'], (int)$this->options['port']);
+ }
+
+ /**
+ * Save data to the cache
+ * @param array|SimplePie $data Data to store in the cache. If passed a SimplePie object, only cache the $data property
+ * @return bool Successfulness
+ */
+ public function save($data) {
+ if ($data instanceof SimplePie) {
+ $data = $data->data;
+ }
+
+ return $this->setData(serialize($data));
+ }
+
+ /**
+ * Retrieve the data saved to the cache
+ * @return array Data for SimplePie::$data
+ */
+ public function load() {
+ $data = $this->cache->get($this->name);
+
+ if ($data !== false) {
+ return unserialize($data);
+ }
+ return false;
+ }
+
+ /**
+ * Retrieve the last modified time for the cache
+ * @return int Timestamp
+ */
+ public function mtime() {
+ $data = $this->cache->get($this->name . '_mtime');
+ return (int) $data;
+ }
+
+ /**
+ * Set the last modified time to the current time
+ * @return bool Success status
+ */
+ public function touch() {
+ $data = $this->cache->get($this->name);
+ return $this->setData($data);
+ }
+
+ /**
+ * Remove the cache
+ * @return bool Success status
+ */
+ public function unlink() {
+ return $this->cache->delete($this->name, 0);
+ }
+
+ /**
+ * Set the last modified time and data to Memcached
+ * @return bool Success status
+ */
+ private function setData($data) {
+
+ if ($data !== false) {
+ $this->cache->set($this->name . '_mtime', time(), (int)$this->options['extras']['timeout']);
+ return $this->cache->set($this->name, $data, (int)$this->options['extras']['timeout']);
+ }
+
+ return false;
+ }
+}
diff --git a/vendor/simplepie/simplepie/library/SimplePie/Cache/MySQL.php b/vendor/simplepie/simplepie/library/SimplePie/Cache/MySQL.php
new file mode 100644
index 000000000..8686b6c67
--- /dev/null
+++ b/vendor/simplepie/simplepie/library/SimplePie/Cache/MySQL.php
@@ -0,0 +1,454 @@
+<?php
+/**
+ * SimplePie
+ *
+ * A PHP-Based RSS and Atom Feed Framework.
+ * Takes the hard work out of managing a complete RSS/Atom solution.
+ *
+ * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * * Neither the name of the SimplePie Team nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
+ * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @package SimplePie
+ * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @author Ryan Parman
+ * @author Geoffrey Sneddon
+ * @author Ryan McCue
+ * @link http://simplepie.org/ SimplePie
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ */
+
+/**
+ * Caches data to a MySQL database
+ *
+ * Registered for URLs with the "mysql" protocol
+ *
+ * For example, `mysql://root:password@localhost:3306/mydb?prefix=sp_` will
+ * connect to the `mydb` database on `localhost` on port 3306, with the user
+ * `root` and the password `password`. All tables will be prefixed with `sp_`
+ *
+ * @package SimplePie
+ * @subpackage Caching
+ */
+class SimplePie_Cache_MySQL extends SimplePie_Cache_DB
+{
+ /**
+ * PDO instance
+ *
+ * @var PDO
+ */
+ protected $mysql;
+
+ /**
+ * Options
+ *
+ * @var array
+ */
+ protected $options;
+
+ /**
+ * Cache ID
+ *
+ * @var string
+ */
+ protected $id;
+
+ /**
+ * Create a new cache object
+ *
+ * @param string $location Location string (from SimplePie::$cache_location)
+ * @param string $name Unique ID for the cache
+ * @param string $type Either TYPE_FEED for SimplePie data, or TYPE_IMAGE for image data
+ */
+ public function __construct($location, $name, $type)
+ {
+ $this->options = array(
+ 'user' => null,
+ 'pass' => null,
+ 'host' => '127.0.0.1',
+ 'port' => '3306',
+ 'path' => '',
+ 'extras' => array(
+ 'prefix' => '',
+ 'cache_purge_time' => 2592000
+ ),
+ );
+
+ $this->options = SimplePie_Misc::array_merge_recursive($this->options, SimplePie_Cache::parse_URL($location));
+
+ // Path is prefixed with a "/"
+ $this->options['dbname'] = substr($this->options['path'], 1);
+
+ try
+ {
+ $this->mysql = new PDO("mysql:dbname={$this->options['dbname']};host={$this->options['host']};port={$this->options['port']}", $this->options['user'], $this->options['pass'], array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));
+ }
+ catch (PDOException $e)
+ {
+ $this->mysql = null;
+ return;
+ }
+
+ $this->id = $name . $type;
+
+ if (!$query = $this->mysql->query('SHOW TABLES'))
+ {
+ $this->mysql = null;
+ return;
+ }
+
+ $db = array();
+ while ($row = $query->fetchColumn())
+ {
+ $db[] = $row;
+ }
+
+ if (!in_array($this->options['extras']['prefix'] . 'cache_data', $db))
+ {
+ $query = $this->mysql->exec('CREATE TABLE `' . $this->options['extras']['prefix'] . 'cache_data` (`id` TEXT CHARACTER SET utf8 NOT NULL, `items` SMALLINT NOT NULL DEFAULT 0, `data` BLOB NOT NULL, `mtime` INT UNSIGNED NOT NULL, UNIQUE (`id`(125)))');
+ if ($query === false)
+ {
+ trigger_error("Can't create " . $this->options['extras']['prefix'] . "cache_data table, check permissions", E_USER_WARNING);
+ $this->mysql = null;
+ return;
+ }
+ }
+
+ if (!in_array($this->options['extras']['prefix'] . 'items', $db))
+ {
+ $query = $this->mysql->exec('CREATE TABLE `' . $this->options['extras']['prefix'] . 'items` (`feed_id` TEXT CHARACTER SET utf8 NOT NULL, `id` TEXT CHARACTER SET utf8 NOT NULL, `data` MEDIUMBLOB NOT NULL, `posted` INT UNSIGNED NOT NULL, INDEX `feed_id` (`feed_id`(125)))');
+ if ($query === false)
+ {
+ trigger_error("Can't create " . $this->options['extras']['prefix'] . "items table, check permissions", E_USER_WARNING);
+ $this->mysql = null;
+ return;
+ }
+ }
+ }
+
+ /**
+ * Save data to the cache
+ *
+ * @param array|SimplePie $data Data to store in the cache. If passed a SimplePie object, only cache the $data property
+ * @return bool Successfulness
+ */
+ public function save($data)
+ {
+ if ($this->mysql === null)
+ {
+ return false;
+ }
+
+ $query = $this->mysql->prepare('DELETE i, cd FROM `' . $this->options['extras']['prefix'] . 'cache_data` cd, ' .
+ '`' . $this->options['extras']['prefix'] . 'items` i ' .
+ 'WHERE cd.id = i.feed_id ' .
+ 'AND cd.mtime < (unix_timestamp() - :purge_time)');
+ $query->bindValue(':purge_time', $this->options['extras']['cache_purge_time']);
+
+ if (!$query->execute())
+ {
+ return false;
+ }
+
+ if ($data instanceof SimplePie)
+ {
+ $data = clone $data;
+
+ $prepared = self::prepare_simplepie_object_for_cache($data);
+
+ $query = $this->mysql->prepare('SELECT COUNT(*) FROM `' . $this->options['extras']['prefix'] . 'cache_data` WHERE `id` = :feed');
+ $query->bindValue(':feed', $this->id);
+ if ($query->execute())
+ {
+ if ($query->fetchColumn() > 0)
+ {
+ $items = count($prepared[1]);
+ if ($items)
+ {
+ $sql = 'UPDATE `' . $this->options['extras']['prefix'] . 'cache_data` SET `items` = :items, `data` = :data, `mtime` = :time WHERE `id` = :feed';
+ $query = $this->mysql->prepare($sql);
+ $query->bindValue(':items', $items);
+ }
+ else
+ {
+ $sql = 'UPDATE `' . $this->options['extras']['prefix'] . 'cache_data` SET `data` = :data, `mtime` = :time WHERE `id` = :feed';
+ $query = $this->mysql->prepare($sql);
+ }
+
+ $query->bindValue(':data', $prepared[0]);
+ $query->bindValue(':time', time());
+ $query->bindValue(':feed', $this->id);
+ if (!$query->execute())
+ {
+ return false;
+ }
+ }
+ else
+ {
+ $query = $this->mysql->prepare('INSERT INTO `' . $this->options['extras']['prefix'] . 'cache_data` (`id`, `items`, `data`, `mtime`) VALUES(:feed, :count, :data, :time)');
+ $query->bindValue(':feed', $this->id);
+ $query->bindValue(':count', count($prepared[1]));
+ $query->bindValue(':data', $prepared[0]);
+ $query->bindValue(':time', time());
+ if (!$query->execute())
+ {
+ return false;
+ }
+ }
+
+ $ids = array_keys($prepared[1]);
+ if (!empty($ids))
+ {
+ foreach ($ids as $id)
+ {
+ $database_ids[] = $this->mysql->quote($id);
+ }
+
+ $query = $this->mysql->prepare('SELECT `id` FROM `' . $this->options['extras']['prefix'] . 'items` WHERE `id` = ' . implode(' OR `id` = ', $database_ids) . ' AND `feed_id` = :feed');
+ $query->bindValue(':feed', $this->id);
+
+ if ($query->execute())
+ {
+ $existing_ids = array();
+ while ($row = $query->fetchColumn())
+ {
+ $existing_ids[] = $row;
+ }
+
+ $new_ids = array_diff($ids, $existing_ids);
+
+ foreach ($new_ids as $new_id)
+ {
+ if (!($date = $prepared[1][$new_id]->get_date('U')))
+ {
+ $date = time();
+ }
+
+ $query = $this->mysql->prepare('INSERT INTO `' . $this->options['extras']['prefix'] . 'items` (`feed_id`, `id`, `data`, `posted`) VALUES(:feed, :id, :data, :date)');
+ $query->bindValue(':feed', $this->id);
+ $query->bindValue(':id', $new_id);
+ $query->bindValue(':data', serialize($prepared[1][$new_id]->data));
+ $query->bindValue(':date', $date);
+ if (!$query->execute())
+ {
+ return false;
+ }
+ }
+ return true;
+ }
+ }
+ else
+ {
+ return true;
+ }
+ }
+ }
+ else
+ {
+ $query = $this->mysql->prepare('SELECT `id` FROM `' . $this->options['extras']['prefix'] . 'cache_data` WHERE `id` = :feed');
+ $query->bindValue(':feed', $this->id);
+ if ($query->execute())
+ {
+ if ($query->rowCount() > 0)
+ {
+ $query = $this->mysql->prepare('UPDATE `' . $this->options['extras']['prefix'] . 'cache_data` SET `items` = 0, `data` = :data, `mtime` = :time WHERE `id` = :feed');
+ $query->bindValue(':data', serialize($data));
+ $query->bindValue(':time', time());
+ $query->bindValue(':feed', $this->id);
+ if ($this->execute())
+ {
+ return true;
+ }
+ }
+ else
+ {
+ $query = $this->mysql->prepare('INSERT INTO `' . $this->options['extras']['prefix'] . 'cache_data` (`id`, `items`, `data`, `mtime`) VALUES(:id, 0, :data, :time)');
+ $query->bindValue(':id', $this->id);
+ $query->bindValue(':data', serialize($data));
+ $query->bindValue(':time', time());
+ if ($query->execute())
+ {
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Retrieve the data saved to the cache
+ *
+ * @return array Data for SimplePie::$data
+ */
+ public function load()
+ {
+ if ($this->mysql === null)
+ {
+ return false;
+ }
+
+ $query = $this->mysql->prepare('SELECT `items`, `data` FROM `' . $this->options['extras']['prefix'] . 'cache_data` WHERE `id` = :id');
+ $query->bindValue(':id', $this->id);
+ if ($query->execute() && ($row = $query->fetch()))
+ {
+ $data = unserialize($row[1]);
+
+ if (isset($this->options['items'][0]))
+ {
+ $items = (int) $this->options['items'][0];
+ }
+ else
+ {
+ $items = (int) $row[0];
+ }
+
+ if ($items !== 0)
+ {
+ if (isset($data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]))
+ {
+ $feed =& $data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0];
+ }
+ elseif (isset($data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]))
+ {
+ $feed =& $data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0];
+ }
+ elseif (isset($data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]))
+ {
+ $feed =& $data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0];
+ }
+ elseif (isset($data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]))
+ {
+ $feed =& $data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0];
+ }
+ else
+ {
+ $feed = null;
+ }
+
+ if ($feed !== null)
+ {
+ $sql = 'SELECT `data` FROM `' . $this->options['extras']['prefix'] . 'items` WHERE `feed_id` = :feed ORDER BY `posted` DESC';
+ if ($items > 0)
+ {
+ $sql .= ' LIMIT ' . $items;
+ }
+
+ $query = $this->mysql->prepare($sql);
+ $query->bindValue(':feed', $this->id);
+ if ($query->execute())
+ {
+ while ($row = $query->fetchColumn())
+ {
+ $feed['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['entry'][] = unserialize($row);
+ }
+ }
+ else
+ {
+ return false;
+ }
+ }
+ }
+ return $data;
+ }
+ return false;
+ }
+
+ /**
+ * Retrieve the last modified time for the cache
+ *
+ * @return int Timestamp
+ */
+ public function mtime()
+ {
+ if ($this->mysql === null)
+ {
+ return false;
+ }
+
+ $query = $this->mysql->prepare('SELECT `mtime` FROM `' . $this->options['extras']['prefix'] . 'cache_data` WHERE `id` = :id');
+ $query->bindValue(':id', $this->id);
+ if ($query->execute() && ($time = $query->fetchColumn()))
+ {
+ return $time;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ /**
+ * Set the last modified time to the current time
+ *
+ * @return bool Success status
+ */
+ public function touch()
+ {
+ if ($this->mysql === null)
+ {
+ return false;
+ }
+
+ $query = $this->mysql->prepare('UPDATE `' . $this->options['extras']['prefix'] . 'cache_data` SET `mtime` = :time WHERE `id` = :id');
+ $query->bindValue(':time', time());
+ $query->bindValue(':id', $this->id);
+ if ($query->execute() && $query->rowCount() > 0)
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ /**
+ * Remove the cache
+ *
+ * @return bool Success status
+ */
+ public function unlink()
+ {
+ if ($this->mysql === null)
+ {
+ return false;
+ }
+
+ $query = $this->mysql->prepare('DELETE FROM `' . $this->options['extras']['prefix'] . 'cache_data` WHERE `id` = :id');
+ $query->bindValue(':id', $this->id);
+ $query2 = $this->mysql->prepare('DELETE FROM `' . $this->options['extras']['prefix'] . 'items` WHERE `feed_id` = :id');
+ $query2->bindValue(':id', $this->id);
+ if ($query->execute() && $query2->execute())
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+}
diff --git a/vendor/simplepie/simplepie/library/SimplePie/Cache/Redis.php b/vendor/simplepie/simplepie/library/SimplePie/Cache/Redis.php
new file mode 100644
index 000000000..04d72c79a
--- /dev/null
+++ b/vendor/simplepie/simplepie/library/SimplePie/Cache/Redis.php
@@ -0,0 +1,166 @@
+<?php
+
+/**
+ * SimplePie Redis Cache Extension
+ *
+ * @package SimplePie
+ * @author Jan Kozak <galvani78@gmail.com>
+ * @link http://galvani.cz/
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version 0.2.9
+ */
+
+
+/**
+ * Caches data to redis
+ *
+ * Registered for URLs with the "redis" protocol
+ *
+ * For example, `redis://localhost:6379/?timeout=3600&prefix=sp_&dbIndex=0` will
+ * connect to redis on `localhost` on port 6379. All tables will be
+ * prefixed with `simple_primary-` and data will expire after 3600 seconds
+ *
+ * @package SimplePie
+ * @subpackage Caching
+ * @uses Redis
+ */
+class SimplePie_Cache_Redis implements SimplePie_Cache_Base {
+ /**
+ * Redis instance
+ *
+ * @var \Redis
+ */
+ protected $cache;
+
+ /**
+ * Options
+ *
+ * @var array
+ */
+ protected $options;
+
+ /**
+ * Cache name
+ *
+ * @var string
+ */
+ protected $name;
+
+ /**
+ * Cache Data
+ *
+ * @var type
+ */
+ protected $data;
+
+ /**
+ * Create a new cache object
+ *
+ * @param string $location Location string (from SimplePie::$cache_location)
+ * @param string $name Unique ID for the cache
+ * @param string $type Either TYPE_FEED for SimplePie data, or TYPE_IMAGE for image data
+ */
+ public function __construct($location, $name, $options = null) {
+ //$this->cache = \flow\simple\cache\Redis::getRedisClientInstance();
+ $parsed = SimplePie_Cache::parse_URL($location);
+ $redis = new Redis();
+ $redis->connect($parsed['host'], $parsed['port']);
+ $this->cache = $redis;
+
+ if (!is_null($options) && is_array($options)) {
+ $this->options = $options;
+ } else {
+ $this->options = array (
+ 'prefix' => 'rss:simple_primary:',
+ 'expire' => 0,
+ );
+ }
+
+ $this->name = $this->options['prefix'] . $name;
+ }
+
+ /**
+ * @param \Redis $cache
+ */
+ public function setRedisClient(\Redis $cache) {
+ $this->cache = $cache;
+ }
+
+ /**
+ * Save data to the cache
+ *
+ * @param array|SimplePie $data Data to store in the cache. If passed a SimplePie object, only cache the $data property
+ * @return bool Successfulness
+ */
+ public function save($data) {
+ if ($data instanceof SimplePie) {
+ $data = $data->data;
+ }
+ $response = $this->cache->set($this->name, serialize($data));
+ if ($this->options['expire']) {
+ $this->cache->expire($this->name, $this->options['expire']);
+ }
+
+ return $response;
+ }
+
+ /**
+ * Retrieve the data saved to the cache
+ *
+ * @return array Data for SimplePie::$data
+ */
+ public function load() {
+ $data = $this->cache->get($this->name);
+
+ if ($data !== false) {
+ return unserialize($data);
+ }
+ return false;
+ }
+
+ /**
+ * Retrieve the last modified time for the cache
+ *
+ * @return int Timestamp
+ */
+ public function mtime() {
+
+ $data = $this->cache->get($this->name);
+
+ if ($data !== false) {
+ return time();
+ }
+
+ return false;
+ }
+
+ /**
+ * Set the last modified time to the current time
+ *
+ * @return bool Success status
+ */
+ public function touch() {
+
+ $data = $this->cache->get($this->name);
+
+ if ($data !== false) {
+ $return = $this->cache->set($this->name, $data);
+ if ($this->options['expire']) {
+ return $this->cache->expire($this->name, $this->ttl);
+ }
+ return $return;
+ }
+
+ return false;
+ }
+
+ /**
+ * Remove the cache
+ *
+ * @return bool Success status
+ */
+ public function unlink() {
+ return $this->cache->set($this->name, null);
+ }
+
+}
diff --git a/vendor/simplepie/simplepie/library/SimplePie/Caption.php b/vendor/simplepie/simplepie/library/SimplePie/Caption.php
new file mode 100644
index 000000000..abf07de1b
--- /dev/null
+++ b/vendor/simplepie/simplepie/library/SimplePie/Caption.php
@@ -0,0 +1,209 @@
+<?php
+/**
+ * SimplePie
+ *
+ * A PHP-Based RSS and Atom Feed Framework.
+ * Takes the hard work out of managing a complete RSS/Atom solution.
+ *
+ * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * * Neither the name of the SimplePie Team nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
+ * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @package SimplePie
+ * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @author Ryan Parman
+ * @author Geoffrey Sneddon
+ * @author Ryan McCue
+ * @link http://simplepie.org/ SimplePie
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ */
+
+
+/**
+ * Handles `<media:text>` captions as defined in Media RSS.
+ *
+ * Used by {@see SimplePie_Enclosure::get_caption()} and {@see SimplePie_Enclosure::get_captions()}
+ *
+ * This class can be overloaded with {@see SimplePie::set_caption_class()}
+ *
+ * @package SimplePie
+ * @subpackage API
+ */
+class SimplePie_Caption
+{
+ /**
+ * Content type
+ *
+ * @var string
+ * @see get_type()
+ */
+ var $type;
+
+ /**
+ * Language
+ *
+ * @var string
+ * @see get_language()
+ */
+ var $lang;
+
+ /**
+ * Start time
+ *
+ * @var string
+ * @see get_starttime()
+ */
+ var $startTime;
+
+ /**
+ * End time
+ *
+ * @var string
+ * @see get_endtime()
+ */
+ var $endTime;
+
+ /**
+ * Caption text
+ *
+ * @var string
+ * @see get_text()
+ */
+ var $text;
+
+ /**
+ * Constructor, used to input the data
+ *
+ * For documentation on all the parameters, see the corresponding
+ * properties and their accessors
+ */
+ public function __construct($type = null, $lang = null, $startTime = null, $endTime = null, $text = null)
+ {
+ $this->type = $type;
+ $this->lang = $lang;
+ $this->startTime = $startTime;
+ $this->endTime = $endTime;
+ $this->text = $text;
+ }
+
+ /**
+ * String-ified version
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ // There is no $this->data here
+ return md5(serialize($this));
+ }
+
+ /**
+ * Get the end time
+ *
+ * @return string|null Time in the format 'hh:mm:ss.SSS'
+ */
+ public function get_endtime()
+ {
+ if ($this->endTime !== null)
+ {
+ return $this->endTime;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get the language
+ *
+ * @link http://tools.ietf.org/html/rfc3066
+ * @return string|null Language code as per RFC 3066
+ */
+ public function get_language()
+ {
+ if ($this->lang !== null)
+ {
+ return $this->lang;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get the start time
+ *
+ * @return string|null Time in the format 'hh:mm:ss.SSS'
+ */
+ public function get_starttime()
+ {
+ if ($this->startTime !== null)
+ {
+ return $this->startTime;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get the text of the caption
+ *
+ * @return string|null
+ */
+ public function get_text()
+ {
+ if ($this->text !== null)
+ {
+ return $this->text;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get the content type (not MIME type)
+ *
+ * @return string|null Either 'text' or 'html'
+ */
+ public function get_type()
+ {
+ if ($this->type !== null)
+ {
+ return $this->type;
+ }
+ else
+ {
+ return null;
+ }
+ }
+}
+
diff --git a/vendor/simplepie/simplepie/library/SimplePie/Category.php b/vendor/simplepie/simplepie/library/SimplePie/Category.php
new file mode 100644
index 000000000..df0f13f9a
--- /dev/null
+++ b/vendor/simplepie/simplepie/library/SimplePie/Category.php
@@ -0,0 +1,163 @@
+<?php
+/**
+ * SimplePie
+ *
+ * A PHP-Based RSS and Atom Feed Framework.
+ * Takes the hard work out of managing a complete RSS/Atom solution.
+ *
+ * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * * Neither the name of the SimplePie Team nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
+ * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @package SimplePie
+ * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @author Ryan Parman
+ * @author Geoffrey Sneddon
+ * @author Ryan McCue
+ * @link http://simplepie.org/ SimplePie
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ */
+
+/**
+ * Manages all category-related data
+ *
+ * Used by {@see SimplePie_Item::get_category()} and {@see SimplePie_Item::get_categories()}
+ *
+ * This class can be overloaded with {@see SimplePie::set_category_class()}
+ *
+ * @package SimplePie
+ * @subpackage API
+ */
+class SimplePie_Category
+{
+ /**
+ * Category identifier
+ *
+ * @var string|null
+ * @see get_term
+ */
+ var $term;
+
+ /**
+ * Categorization scheme identifier
+ *
+ * @var string|null
+ * @see get_scheme()
+ */
+ var $scheme;
+
+ /**
+ * Human readable label
+ *
+ * @var string|null
+ * @see get_label()
+ */
+ var $label;
+
+ /**
+ * Category type
+ *
+ * category for <category>
+ * subject for <dc:subject>
+ *
+ * @var string|null
+ * @see get_type()
+ */
+ var $type;
+
+ /**
+ * Constructor, used to input the data
+ *
+ * @param string|null $term
+ * @param string|null $scheme
+ * @param string|null $label
+ * @param string|null $type
+ */
+ public function __construct($term = null, $scheme = null, $label = null, $type = null)
+ {
+ $this->term = $term;
+ $this->scheme = $scheme;
+ $this->label = $label;
+ $this->type = $type;
+ }
+
+ /**
+ * String-ified version
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ // There is no $this->data here
+ return md5(serialize($this));
+ }
+
+ /**
+ * Get the category identifier
+ *
+ * @return string|null
+ */
+ public function get_term()
+ {
+ return $this->term;
+ }
+
+ /**
+ * Get the categorization scheme identifier
+ *
+ * @return string|null
+ */
+ public function get_scheme()
+ {
+ return $this->scheme;
+ }
+
+ /**
+ * Get the human readable label
+ *
+ * @param bool $strict
+ * @return string|null
+ */
+ public function get_label($strict = false)
+ {
+ if ($this->label === null && $strict !== true)
+ {
+ return $this->get_term();
+ }
+ return $this->label;
+ }
+
+ /**
+ * Get the category type
+ *
+ * @return string|null
+ */
+ public function get_type()
+ {
+ return $this->type;
+ }
+}
+
diff --git a/vendor/simplepie/simplepie/library/SimplePie/Content/Type/Sniffer.php b/vendor/simplepie/simplepie/library/SimplePie/Content/Type/Sniffer.php
new file mode 100644
index 000000000..ff35de614
--- /dev/null
+++ b/vendor/simplepie/simplepie/library/SimplePie/Content/Type/Sniffer.php
@@ -0,0 +1,331 @@
+<?php
+/**
+ * SimplePie
+ *
+ * A PHP-Based RSS and Atom Feed Framework.
+ * Takes the hard work out of managing a complete RSS/Atom solution.
+ *
+ * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * * Neither the name of the SimplePie Team nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
+ * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @package SimplePie
+ * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @author Ryan Parman
+ * @author Geoffrey Sneddon
+ * @author Ryan McCue
+ * @link http://simplepie.org/ SimplePie
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ */
+
+
+/**
+ * Content-type sniffing
+ *
+ * Based on the rules in http://tools.ietf.org/html/draft-abarth-mime-sniff-06
+ *
+ * This is used since we can't always trust Content-Type headers, and is based
+ * upon the HTML5 parsing rules.
+ *
+ *
+ * This class can be overloaded with {@see SimplePie::set_content_type_sniffer_class()}
+ *
+ * @package SimplePie
+ * @subpackage HTTP
+ */
+class SimplePie_Content_Type_Sniffer
+{
+ /**
+ * File object
+ *
+ * @var SimplePie_File
+ */
+ var $file;
+
+ /**
+ * Create an instance of the class with the input file
+ *
+ * @param SimplePie_Content_Type_Sniffer $file Input file
+ */
+ public function __construct($file)
+ {
+ $this->file = $file;
+ }
+
+ /**
+ * Get the Content-Type of the specified file
+ *
+ * @return string Actual Content-Type
+ */
+ public function get_type()
+ {
+ if (isset($this->file->headers['content-type']))
+ {
+ if (!isset($this->file->headers['content-encoding'])
+ && ($this->file->headers['content-type'] === 'text/plain'
+ || $this->file->headers['content-type'] === 'text/plain; charset=ISO-8859-1'
+ || $this->file->headers['content-type'] === 'text/plain; charset=iso-8859-1'
+ || $this->file->headers['content-type'] === 'text/plain; charset=UTF-8'))
+ {
+ return $this->text_or_binary();
+ }
+
+ if (($pos = strpos($this->file->headers['content-type'], ';')) !== false)
+ {
+ $official = substr($this->file->headers['content-type'], 0, $pos);
+ }
+ else
+ {
+ $official = $this->file->headers['content-type'];
+ }
+ $official = trim(strtolower($official));
+
+ if ($official === 'unknown/unknown'
+ || $official === 'application/unknown')
+ {
+ return $this->unknown();
+ }
+ elseif (substr($official, -4) === '+xml'
+ || $official === 'text/xml'
+ || $official === 'application/xml')
+ {
+ return $official;
+ }
+ elseif (substr($official, 0, 6) === 'image/')
+ {
+ if ($return = $this->image())
+ {
+ return $return;
+ }
+ else
+ {
+ return $official;
+ }
+ }
+ elseif ($official === 'text/html')
+ {
+ return $this->feed_or_html();
+ }
+ else
+ {
+ return $official;
+ }
+ }
+ else
+ {
+ return $this->unknown();
+ }
+ }
+
+ /**
+ * Sniff text or binary
+ *
+ * @return string Actual Content-Type
+ */
+ public function text_or_binary()
+ {
+ if (substr($this->file->body, 0, 2) === "\xFE\xFF"
+ || substr($this->file->body, 0, 2) === "\xFF\xFE"
+ || substr($this->file->body, 0, 4) === "\x00\x00\xFE\xFF"
+ || substr($this->file->body, 0, 3) === "\xEF\xBB\xBF")
+ {
+ return 'text/plain';
+ }
+ elseif (preg_match('/[\x00-\x08\x0E-\x1A\x1C-\x1F]/', $this->file->body))
+ {
+ return 'application/octect-stream';
+ }
+ else
+ {
+ return 'text/plain';
+ }
+ }
+
+ /**
+ * Sniff unknown
+ *
+ * @return string Actual Content-Type
+ */
+ public function unknown()
+ {
+ $ws = strspn($this->file->body, "\x09\x0A\x0B\x0C\x0D\x20");
+ if (strtolower(substr($this->file->body, $ws, 14)) === '<!doctype html'
+ || strtolower(substr($this->file->body, $ws, 5)) === '<html'
+ || strtolower(substr($this->file->body, $ws, 7)) === '<script')
+ {
+ return 'text/html';
+ }
+ elseif (substr($this->file->body, 0, 5) === '%PDF-')
+ {
+ return 'application/pdf';
+ }
+ elseif (substr($this->file->body, 0, 11) === '%!PS-Adobe-')
+ {
+ return 'application/postscript';
+ }
+ elseif (substr($this->file->body, 0, 6) === 'GIF87a'
+ || substr($this->file->body, 0, 6) === 'GIF89a')
+ {
+ return 'image/gif';
+ }
+ elseif (substr($this->file->body, 0, 8) === "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A")
+ {
+ return 'image/png';
+ }
+ elseif (substr($this->file->body, 0, 3) === "\xFF\xD8\xFF")
+ {
+ return 'image/jpeg';
+ }
+ elseif (substr($this->file->body, 0, 2) === "\x42\x4D")
+ {
+ return 'image/bmp';
+ }
+ elseif (substr($this->file->body, 0, 4) === "\x00\x00\x01\x00")
+ {
+ return 'image/vnd.microsoft.icon';
+ }
+ else
+ {
+ return $this->text_or_binary();
+ }
+ }
+
+ /**
+ * Sniff images
+ *
+ * @return string Actual Content-Type
+ */
+ public function image()
+ {
+ if (substr($this->file->body, 0, 6) === 'GIF87a'
+ || substr($this->file->body, 0, 6) === 'GIF89a')
+ {
+ return 'image/gif';
+ }
+ elseif (substr($this->file->body, 0, 8) === "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A")
+ {
+ return 'image/png';
+ }
+ elseif (substr($this->file->body, 0, 3) === "\xFF\xD8\xFF")
+ {
+ return 'image/jpeg';
+ }
+ elseif (substr($this->file->body, 0, 2) === "\x42\x4D")
+ {
+ return 'image/bmp';
+ }
+ elseif (substr($this->file->body, 0, 4) === "\x00\x00\x01\x00")
+ {
+ return 'image/vnd.microsoft.icon';
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ /**
+ * Sniff HTML
+ *
+ * @return string Actual Content-Type
+ */
+ public function feed_or_html()
+ {
+ $len = strlen($this->file->body);
+ $pos = strspn($this->file->body, "\x09\x0A\x0D\x20\xEF\xBB\xBF");
+
+ while ($pos < $len)
+ {
+ switch ($this->file->body[$pos])
+ {
+ case "\x09":
+ case "\x0A":
+ case "\x0D":
+ case "\x20":
+ $pos += strspn($this->file->body, "\x09\x0A\x0D\x20", $pos);
+ continue 2;
+
+ case '<':
+ $pos++;
+ break;
+
+ default:
+ return 'text/html';
+ }
+
+ if (substr($this->file->body, $pos, 3) === '!--')
+ {
+ $pos += 3;
+ if ($pos < $len && ($pos = strpos($this->file->body, '-->', $pos)) !== false)
+ {
+ $pos += 3;
+ }
+ else
+ {
+ return 'text/html';
+ }
+ }
+ elseif (substr($this->file->body, $pos, 1) === '!')
+ {
+ if ($pos < $len && ($pos = strpos($this->file->body, '>', $pos)) !== false)
+ {
+ $pos++;
+ }
+ else
+ {
+ return 'text/html';
+ }
+ }
+ elseif (substr($this->file->body, $pos, 1) === '?')
+ {
+ if ($pos < $len && ($pos = strpos($this->file->body, '?>', $pos)) !== false)
+ {
+ $pos += 2;
+ }
+ else
+ {
+ return 'text/html';
+ }
+ }
+ elseif (substr($this->file->body, $pos, 3) === 'rss'
+ || substr($this->file->body, $pos, 7) === 'rdf:RDF')
+ {
+ return 'application/rss+xml';
+ }
+ elseif (substr($this->file->body, $pos, 4) === 'feed')
+ {
+ return 'application/atom+xml';
+ }
+ else
+ {
+ return 'text/html';
+ }
+ }
+
+ return 'text/html';
+ }
+}
+
diff --git a/vendor/simplepie/simplepie/library/SimplePie/Copyright.php b/vendor/simplepie/simplepie/library/SimplePie/Copyright.php
new file mode 100644
index 000000000..3f3d07d3b
--- /dev/null
+++ b/vendor/simplepie/simplepie/library/SimplePie/Copyright.php
@@ -0,0 +1,129 @@
+<?php
+/**
+ * SimplePie
+ *
+ * A PHP-Based RSS and Atom Feed Framework.
+ * Takes the hard work out of managing a complete RSS/Atom solution.
+ *
+ * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * * Neither the name of the SimplePie Team nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
+ * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @package SimplePie
+ * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @author Ryan Parman
+ * @author Geoffrey Sneddon
+ * @author Ryan McCue
+ * @link http://simplepie.org/ SimplePie
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ */
+
+/**
+ * Manages `<media:copyright>` copyright tags as defined in Media RSS
+ *
+ * Used by {@see SimplePie_Enclosure::get_copyright()}
+ *
+ * This class can be overloaded with {@see SimplePie::set_copyright_class()}
+ *
+ * @package SimplePie
+ * @subpackage API
+ */
+class SimplePie_Copyright
+{
+ /**
+ * Copyright URL
+ *
+ * @var string
+ * @see get_url()
+ */
+ var $url;
+
+ /**
+ * Attribution
+ *
+ * @var string
+ * @see get_attribution()
+ */
+ var $label;
+
+ /**
+ * Constructor, used to input the data
+ *
+ * For documentation on all the parameters, see the corresponding
+ * properties and their accessors
+ */
+ public function __construct($url = null, $label = null)
+ {
+ $this->url = $url;
+ $this->label = $label;
+ }
+
+ /**
+ * String-ified version
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ // There is no $this->data here
+ return md5(serialize($this));
+ }
+
+ /**
+ * Get the copyright URL
+ *
+ * @return string|null URL to copyright information
+ */
+ public function get_url()
+ {
+ if ($this->url !== null)
+ {
+ return $this->url;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get the attribution text
+ *
+ * @return string|null
+ */
+ public function get_attribution()
+ {
+ if ($this->label !== null)
+ {
+ return $this->label;
+ }
+ else
+ {
+ return null;
+ }
+ }
+}
+
diff --git a/vendor/simplepie/simplepie/library/SimplePie/Core.php b/vendor/simplepie/simplepie/library/SimplePie/Core.php
new file mode 100644
index 000000000..c856ba361
--- /dev/null
+++ b/vendor/simplepie/simplepie/library/SimplePie/Core.php
@@ -0,0 +1,56 @@
+<?php
+/**
+ * SimplePie
+ *
+ * A PHP-Based RSS and Atom Feed Framework.
+ * Takes the hard work out of managing a complete RSS/Atom solution.
+ *
+ * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * * Neither the name of the SimplePie Team nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
+ * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @package SimplePie
+ * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @author Ryan Parman
+ * @author Geoffrey Sneddon
+ * @author Ryan McCue
+ * @link http://simplepie.org/ SimplePie
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ */
+
+/**
+ * SimplePie class.
+ *
+ * Class for backward compatibility.
+ *
+ * @deprecated Use {@see SimplePie} directly
+ * @package SimplePie
+ * @subpackage API
+ */
+class SimplePie_Core extends SimplePie
+{
+
+} \ No newline at end of file
diff --git a/vendor/simplepie/simplepie/library/SimplePie/Credit.php b/vendor/simplepie/simplepie/library/SimplePie/Credit.php
new file mode 100644
index 000000000..9bad9ef34
--- /dev/null
+++ b/vendor/simplepie/simplepie/library/SimplePie/Credit.php
@@ -0,0 +1,155 @@
+<?php
+/**
+ * SimplePie
+ *
+ * A PHP-Based RSS and Atom Feed Framework.
+ * Takes the hard work out of managing a complete RSS/Atom solution.
+ *
+ * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * * Neither the name of the SimplePie Team nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
+ * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @package SimplePie
+ * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @author Ryan Parman
+ * @author Geoffrey Sneddon
+ * @author Ryan McCue
+ * @link http://simplepie.org/ SimplePie
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ */
+
+/**
+ * Handles `<media:credit>` as defined in Media RSS
+ *
+ * Used by {@see SimplePie_Enclosure::get_credit()} and {@see SimplePie_Enclosure::get_credits()}
+ *
+ * This class can be overloaded with {@see SimplePie::set_credit_class()}
+ *
+ * @package SimplePie
+ * @subpackage API
+ */
+class SimplePie_Credit
+{
+ /**
+ * Credited role
+ *
+ * @var string
+ * @see get_role()
+ */
+ var $role;
+
+ /**
+ * Organizational scheme
+ *
+ * @var string
+ * @see get_scheme()
+ */
+ var $scheme;
+
+ /**
+ * Credited name
+ *
+ * @var string
+ * @see get_name()
+ */
+ var $name;
+
+ /**
+ * Constructor, used to input the data
+ *
+ * For documentation on all the parameters, see the corresponding
+ * properties and their accessors
+ */
+ public function __construct($role = null, $scheme = null, $name = null)
+ {
+ $this->role = $role;
+ $this->scheme = $scheme;
+ $this->name = $name;
+ }
+
+ /**
+ * String-ified version
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ // There is no $this->data here
+ return md5(serialize($this));
+ }
+
+ /**
+ * Get the role of the person receiving credit
+ *
+ * @return string|null
+ */
+ public function get_role()
+ {
+ if ($this->role !== null)
+ {
+ return $this->role;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get the organizational scheme
+ *
+ * @return string|null
+ */
+ public function get_scheme()
+ {
+ if ($this->scheme !== null)
+ {
+ return $this->scheme;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get the credited person/entity's name
+ *
+ * @return string|null
+ */
+ public function get_name()
+ {
+ if ($this->name !== null)
+ {
+ return $this->name;
+ }
+ else
+ {
+ return null;
+ }
+ }
+}
+
diff --git a/vendor/simplepie/simplepie/library/SimplePie/Decode/HTML/Entities.php b/vendor/simplepie/simplepie/library/SimplePie/Decode/HTML/Entities.php
new file mode 100644
index 000000000..de3f2cb53
--- /dev/null
+++ b/vendor/simplepie/simplepie/library/SimplePie/Decode/HTML/Entities.php
@@ -0,0 +1,615 @@
+<?php
+/**
+ * SimplePie
+ *
+ * A PHP-Based RSS and Atom Feed Framework.
+ * Takes the hard work out of managing a complete RSS/Atom solution.
+ *
+ * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * * Neither the name of the SimplePie Team nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
+ * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @package SimplePie
+ * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @author Ryan Parman
+ * @author Geoffrey Sneddon
+ * @author Ryan McCue
+ * @link http://simplepie.org/ SimplePie
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ */
+
+
+/**
+ * Decode HTML Entities
+ *
+ * This implements HTML5 as of revision 967 (2007-06-28)
+ *
+ * @deprecated Use DOMDocument instead!
+ * @package SimplePie
+ */
+class SimplePie_Decode_HTML_Entities
+{
+ /**
+ * Data to be parsed
+ *
+ * @access private
+ * @var string
+ */
+ var $data = '';
+
+ /**
+ * Currently consumed bytes
+ *
+ * @access private
+ * @var string
+ */
+ var $consumed = '';
+
+ /**
+ * Position of the current byte being parsed
+ *
+ * @access private
+ * @var int
+ */
+ var $position = 0;
+
+ /**
+ * Create an instance of the class with the input data
+ *
+ * @access public
+ * @param string $data Input data
+ */
+ public function __construct($data)
+ {
+ $this->data = $data;
+ }
+
+ /**
+ * Parse the input data
+ *
+ * @access public
+ * @return string Output data
+ */
+ public function parse()
+ {
+ while (($this->position = strpos($this->data, '&', $this->position)) !== false)
+ {
+ $this->consume();
+ $this->entity();
+ $this->consumed = '';
+ }
+ return $this->data;
+ }
+
+ /**
+ * Consume the next byte
+ *
+ * @access private
+ * @return mixed The next byte, or false, if there is no more data
+ */
+ public function consume()
+ {
+ if (isset($this->data[$this->position]))
+ {
+ $this->consumed .= $this->data[$this->position];
+ return $this->data[$this->position++];
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ /**
+ * Consume a range of characters
+ *
+ * @access private
+ * @param string $chars Characters to consume
+ * @return mixed A series of characters that match the range, or false
+ */
+ public function consume_range($chars)
+ {
+ if ($len = strspn($this->data, $chars, $this->position))
+ {
+ $data = substr($this->data, $this->position, $len);
+ $this->consumed .= $data;
+ $this->position += $len;
+ return $data;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ /**
+ * Unconsume one byte
+ *
+ * @access private
+ */
+ public function unconsume()
+ {
+ $this->consumed = substr($this->consumed, 0, -1);
+ $this->position--;
+ }
+
+ /**
+ * Decode an entity
+ *
+ * @access private
+ */
+ public function entity()
+ {
+ switch ($this->consume())
+ {
+ case "\x09":
+ case "\x0A":
+ case "\x0B":
+ case "\x0C":
+ case "\x20":
+ case "\x3C":
+ case "\x26":
+ case false:
+ break;
+
+ case "\x23":
+ switch ($this->consume())
+ {
+ case "\x78":
+ case "\x58":
+ $range = '0123456789ABCDEFabcdef';
+ $hex = true;
+ break;
+
+ default:
+ $range = '0123456789';
+ $hex = false;
+ $this->unconsume();
+ break;
+ }
+
+ if ($codepoint = $this->consume_range($range))
+ {
+ static $windows_1252_specials = array(0x0D => "\x0A", 0x80 => "\xE2\x82\xAC", 0x81 => "\xEF\xBF\xBD", 0x82 => "\xE2\x80\x9A", 0x83 => "\xC6\x92", 0x84 => "\xE2\x80\x9E", 0x85 => "\xE2\x80\xA6", 0x86 => "\xE2\x80\xA0", 0x87 => "\xE2\x80\xA1", 0x88 => "\xCB\x86", 0x89 => "\xE2\x80\xB0", 0x8A => "\xC5\xA0", 0x8B => "\xE2\x80\xB9", 0x8C => "\xC5\x92", 0x8D => "\xEF\xBF\xBD", 0x8E => "\xC5\xBD", 0x8F => "\xEF\xBF\xBD", 0x90 => "\xEF\xBF\xBD", 0x91 => "\xE2\x80\x98", 0x92 => "\xE2\x80\x99", 0x93 => "\xE2\x80\x9C", 0x94 => "\xE2\x80\x9D", 0x95 => "\xE2\x80\xA2", 0x96 => "\xE2\x80\x93", 0x97 => "\xE2\x80\x94", 0x98 => "\xCB\x9C", 0x99 => "\xE2\x84\xA2", 0x9A => "\xC5\xA1", 0x9B => "\xE2\x80\xBA", 0x9C => "\xC5\x93", 0x9D => "\xEF\xBF\xBD", 0x9E => "\xC5\xBE", 0x9F => "\xC5\xB8");
+
+ if ($hex)
+ {
+ $codepoint = hexdec($codepoint);
+ }
+ else
+ {
+ $codepoint = intval($codepoint);
+ }
+
+ if (isset($windows_1252_specials[$codepoint]))
+ {
+ $replacement = $windows_1252_specials[$codepoint];
+ }
+ else
+ {
+ $replacement = SimplePie_Misc::codepoint_to_utf8($codepoint);
+ }
+
+ if (!in_array($this->consume(), array(';', false), true))
+ {
+ $this->unconsume();
+ }
+
+ $consumed_length = strlen($this->consumed);
+ $this->data = substr_replace($this->data, $replacement, $this->position - $consumed_length, $consumed_length);
+ $this->position += strlen($replacement) - $consumed_length;
+ }
+ break;
+
+ default:
+ static $entities = array(
+ 'Aacute' => "\xC3\x81",
+ 'aacute' => "\xC3\xA1",
+ 'Aacute;' => "\xC3\x81",
+ 'aacute;' => "\xC3\xA1",
+ 'Acirc' => "\xC3\x82",
+ 'acirc' => "\xC3\xA2",
+ 'Acirc;' => "\xC3\x82",
+ 'acirc;' => "\xC3\xA2",
+ 'acute' => "\xC2\xB4",
+ 'acute;' => "\xC2\xB4",
+ 'AElig' => "\xC3\x86",
+ 'aelig' => "\xC3\xA6",
+ 'AElig;' => "\xC3\x86",
+ 'aelig;' => "\xC3\xA6",
+ 'Agrave' => "\xC3\x80",
+ 'agrave' => "\xC3\xA0",
+ 'Agrave;' => "\xC3\x80",
+ 'agrave;' => "\xC3\xA0",
+ 'alefsym;' => "\xE2\x84\xB5",
+ 'Alpha;' => "\xCE\x91",
+ 'alpha;' => "\xCE\xB1",
+ 'AMP' => "\x26",
+ 'amp' => "\x26",
+ 'AMP;' => "\x26",
+ 'amp;' => "\x26",
+ 'and;' => "\xE2\x88\xA7",
+ 'ang;' => "\xE2\x88\xA0",
+ 'apos;' => "\x27",
+ 'Aring' => "\xC3\x85",
+ 'aring' => "\xC3\xA5",
+ 'Aring;' => "\xC3\x85",
+ 'aring;' => "\xC3\xA5",
+ 'asymp;' => "\xE2\x89\x88",
+ 'Atilde' => "\xC3\x83",
+ 'atilde' => "\xC3\xA3",
+ 'Atilde;' => "\xC3\x83",
+ 'atilde;' => "\xC3\xA3",
+ 'Auml' => "\xC3\x84",
+ 'auml' => "\xC3\xA4",
+ 'Auml;' => "\xC3\x84",
+ 'auml;' => "\xC3\xA4",
+ 'bdquo;' => "\xE2\x80\x9E",
+ 'Beta;' => "\xCE\x92",
+ 'beta;' => "\xCE\xB2",
+ 'brvbar' => "\xC2\xA6",
+ 'brvbar;' => "\xC2\xA6",
+ 'bull;' => "\xE2\x80\xA2",
+ 'cap;' => "\xE2\x88\xA9",
+ 'Ccedil' => "\xC3\x87",
+ 'ccedil' => "\xC3\xA7",
+ 'Ccedil;' => "\xC3\x87",
+ 'ccedil;' => "\xC3\xA7",
+ 'cedil' => "\xC2\xB8",
+ 'cedil;' => "\xC2\xB8",
+ 'cent' => "\xC2\xA2",
+ 'cent;' => "\xC2\xA2",
+ 'Chi;' => "\xCE\xA7",
+ 'chi;' => "\xCF\x87",
+ 'circ;' => "\xCB\x86",
+ 'clubs;' => "\xE2\x99\xA3",
+ 'cong;' => "\xE2\x89\x85",
+ 'COPY' => "\xC2\xA9",
+ 'copy' => "\xC2\xA9",
+ 'COPY;' => "\xC2\xA9",
+ 'copy;' => "\xC2\xA9",
+ 'crarr;' => "\xE2\x86\xB5",
+ 'cup;' => "\xE2\x88\xAA",
+ 'curren' => "\xC2\xA4",
+ 'curren;' => "\xC2\xA4",
+ 'Dagger;' => "\xE2\x80\xA1",
+ 'dagger;' => "\xE2\x80\xA0",
+ 'dArr;' => "\xE2\x87\x93",
+ 'darr;' => "\xE2\x86\x93",
+ 'deg' => "\xC2\xB0",
+ 'deg;' => "\xC2\xB0",
+ 'Delta;' => "\xCE\x94",
+ 'delta;' => "\xCE\xB4",
+ 'diams;' => "\xE2\x99\xA6",
+ 'divide' => "\xC3\xB7",
+ 'divide;' => "\xC3\xB7",
+ 'Eacute' => "\xC3\x89",
+ 'eacute' => "\xC3\xA9",
+ 'Eacute;' => "\xC3\x89",
+ 'eacute;' => "\xC3\xA9",
+ 'Ecirc' => "\xC3\x8A",
+ 'ecirc' => "\xC3\xAA",
+ 'Ecirc;' => "\xC3\x8A",
+ 'ecirc;' => "\xC3\xAA",
+ 'Egrave' => "\xC3\x88",
+ 'egrave' => "\xC3\xA8",
+ 'Egrave;' => "\xC3\x88",
+ 'egrave;' => "\xC3\xA8",
+ 'empty;' => "\xE2\x88\x85",
+ 'emsp;' => "\xE2\x80\x83",
+ 'ensp;' => "\xE2\x80\x82",
+ 'Epsilon;' => "\xCE\x95",
+ 'epsilon;' => "\xCE\xB5",
+ 'equiv;' => "\xE2\x89\xA1",
+ 'Eta;' => "\xCE\x97",
+ 'eta;' => "\xCE\xB7",
+ 'ETH' => "\xC3\x90",
+ 'eth' => "\xC3\xB0",
+ 'ETH;' => "\xC3\x90",
+ 'eth;' => "\xC3\xB0",
+ 'Euml' => "\xC3\x8B",
+ 'euml' => "\xC3\xAB",
+ 'Euml;' => "\xC3\x8B",
+ 'euml;' => "\xC3\xAB",
+ 'euro;' => "\xE2\x82\xAC",
+ 'exist;' => "\xE2\x88\x83",
+ 'fnof;' => "\xC6\x92",
+ 'forall;' => "\xE2\x88\x80",
+ 'frac12' => "\xC2\xBD",
+ 'frac12;' => "\xC2\xBD",
+ 'frac14' => "\xC2\xBC",
+ 'frac14;' => "\xC2\xBC",
+ 'frac34' => "\xC2\xBE",
+ 'frac34;' => "\xC2\xBE",
+ 'frasl;' => "\xE2\x81\x84",
+ 'Gamma;' => "\xCE\x93",
+ 'gamma;' => "\xCE\xB3",
+ 'ge;' => "\xE2\x89\xA5",
+ 'GT' => "\x3E",
+ 'gt' => "\x3E",
+ 'GT;' => "\x3E",
+ 'gt;' => "\x3E",
+ 'hArr;' => "\xE2\x87\x94",
+ 'harr;' => "\xE2\x86\x94",
+ 'hearts;' => "\xE2\x99\xA5",
+ 'hellip;' => "\xE2\x80\xA6",
+ 'Iacute' => "\xC3\x8D",
+ 'iacute' => "\xC3\xAD",
+ 'Iacute;' => "\xC3\x8D",
+ 'iacute;' => "\xC3\xAD",
+ 'Icirc' => "\xC3\x8E",
+ 'icirc' => "\xC3\xAE",
+ 'Icirc;' => "\xC3\x8E",
+ 'icirc;' => "\xC3\xAE",
+ 'iexcl' => "\xC2\xA1",
+ 'iexcl;' => "\xC2\xA1",
+ 'Igrave' => "\xC3\x8C",
+ 'igrave' => "\xC3\xAC",
+ 'Igrave;' => "\xC3\x8C",
+ 'igrave;' => "\xC3\xAC",
+ 'image;' => "\xE2\x84\x91",
+ 'infin;' => "\xE2\x88\x9E",
+ 'int;' => "\xE2\x88\xAB",
+ 'Iota;' => "\xCE\x99",
+ 'iota;' => "\xCE\xB9",
+ 'iquest' => "\xC2\xBF",
+ 'iquest;' => "\xC2\xBF",
+ 'isin;' => "\xE2\x88\x88",
+ 'Iuml' => "\xC3\x8F",
+ 'iuml' => "\xC3\xAF",
+ 'Iuml;' => "\xC3\x8F",
+ 'iuml;' => "\xC3\xAF",
+ 'Kappa;' => "\xCE\x9A",
+ 'kappa;' => "\xCE\xBA",
+ 'Lambda;' => "\xCE\x9B",
+ 'lambda;' => "\xCE\xBB",
+ 'lang;' => "\xE3\x80\x88",
+ 'laquo' => "\xC2\xAB",
+ 'laquo;' => "\xC2\xAB",
+ 'lArr;' => "\xE2\x87\x90",
+ 'larr;' => "\xE2\x86\x90",
+ 'lceil;' => "\xE2\x8C\x88",
+ 'ldquo;' => "\xE2\x80\x9C",
+ 'le;' => "\xE2\x89\xA4",
+ 'lfloor;' => "\xE2\x8C\x8A",
+ 'lowast;' => "\xE2\x88\x97",
+ 'loz;' => "\xE2\x97\x8A",
+ 'lrm;' => "\xE2\x80\x8E",
+ 'lsaquo;' => "\xE2\x80\xB9",
+ 'lsquo;' => "\xE2\x80\x98",
+ 'LT' => "\x3C",
+ 'lt' => "\x3C",
+ 'LT;' => "\x3C",
+ 'lt;' => "\x3C",
+ 'macr' => "\xC2\xAF",
+ 'macr;' => "\xC2\xAF",
+ 'mdash;' => "\xE2\x80\x94",
+ 'micro' => "\xC2\xB5",
+ 'micro;' => "\xC2\xB5",
+ 'middot' => "\xC2\xB7",
+ 'middot;' => "\xC2\xB7",
+ 'minus;' => "\xE2\x88\x92",
+ 'Mu;' => "\xCE\x9C",
+ 'mu;' => "\xCE\xBC",
+ 'nabla;' => "\xE2\x88\x87",
+ 'nbsp' => "\xC2\xA0",
+ 'nbsp;' => "\xC2\xA0",
+ 'ndash;' => "\xE2\x80\x93",
+ 'ne;' => "\xE2\x89\xA0",
+ 'ni;' => "\xE2\x88\x8B",
+ 'not' => "\xC2\xAC",
+ 'not;' => "\xC2\xAC",
+ 'notin;' => "\xE2\x88\x89",
+ 'nsub;' => "\xE2\x8A\x84",
+ 'Ntilde' => "\xC3\x91",
+ 'ntilde' => "\xC3\xB1",
+ 'Ntilde;' => "\xC3\x91",
+ 'ntilde;' => "\xC3\xB1",
+ 'Nu;' => "\xCE\x9D",
+ 'nu;' => "\xCE\xBD",
+ 'Oacute' => "\xC3\x93",
+ 'oacute' => "\xC3\xB3",
+ 'Oacute;' => "\xC3\x93",
+ 'oacute;' => "\xC3\xB3",
+ 'Ocirc' => "\xC3\x94",
+ 'ocirc' => "\xC3\xB4",
+ 'Ocirc;' => "\xC3\x94",
+ 'ocirc;' => "\xC3\xB4",
+ 'OElig;' => "\xC5\x92",
+ 'oelig;' => "\xC5\x93",
+ 'Ograve' => "\xC3\x92",
+ 'ograve' => "\xC3\xB2",
+ 'Ograve;' => "\xC3\x92",
+ 'ograve;' => "\xC3\xB2",
+ 'oline;' => "\xE2\x80\xBE",
+ 'Omega;' => "\xCE\xA9",
+ 'omega;' => "\xCF\x89",
+ 'Omicron;' => "\xCE\x9F",
+ 'omicron;' => "\xCE\xBF",
+ 'oplus;' => "\xE2\x8A\x95",
+ 'or;' => "\xE2\x88\xA8",
+ 'ordf' => "\xC2\xAA",
+ 'ordf;' => "\xC2\xAA",
+ 'ordm' => "\xC2\xBA",
+ 'ordm;' => "\xC2\xBA",
+ 'Oslash' => "\xC3\x98",
+ 'oslash' => "\xC3\xB8",
+ 'Oslash;' => "\xC3\x98",
+ 'oslash;' => "\xC3\xB8",
+ 'Otilde' => "\xC3\x95",
+ 'otilde' => "\xC3\xB5",
+ 'Otilde;' => "\xC3\x95",
+ 'otilde;' => "\xC3\xB5",
+ 'otimes;' => "\xE2\x8A\x97",
+ 'Ouml' => "\xC3\x96",
+ 'ouml' => "\xC3\xB6",
+ 'Ouml;' => "\xC3\x96",
+ 'ouml;' => "\xC3\xB6",
+ 'para' => "\xC2\xB6",
+ 'para;' => "\xC2\xB6",
+ 'part;' => "\xE2\x88\x82",
+ 'permil;' => "\xE2\x80\xB0",
+ 'perp;' => "\xE2\x8A\xA5",
+ 'Phi;' => "\xCE\xA6",
+ 'phi;' => "\xCF\x86",
+ 'Pi;' => "\xCE\xA0",
+ 'pi;' => "\xCF\x80",
+ 'piv;' => "\xCF\x96",
+ 'plusmn' => "\xC2\xB1",
+ 'plusmn;' => "\xC2\xB1",
+ 'pound' => "\xC2\xA3",
+ 'pound;' => "\xC2\xA3",
+ 'Prime;' => "\xE2\x80\xB3",
+ 'prime;' => "\xE2\x80\xB2",
+ 'prod;' => "\xE2\x88\x8F",
+ 'prop;' => "\xE2\x88\x9D",
+ 'Psi;' => "\xCE\xA8",
+ 'psi;' => "\xCF\x88",
+ 'QUOT' => "\x22",
+ 'quot' => "\x22",
+ 'QUOT;' => "\x22",
+ 'quot;' => "\x22",
+ 'radic;' => "\xE2\x88\x9A",
+ 'rang;' => "\xE3\x80\x89",
+ 'raquo' => "\xC2\xBB",
+ 'raquo;' => "\xC2\xBB",
+ 'rArr;' => "\xE2\x87\x92",
+ 'rarr;' => "\xE2\x86\x92",
+ 'rceil;' => "\xE2\x8C\x89",
+ 'rdquo;' => "\xE2\x80\x9D",
+ 'real;' => "\xE2\x84\x9C",
+ 'REG' => "\xC2\xAE",
+ 'reg' => "\xC2\xAE",
+ 'REG;' => "\xC2\xAE",
+ 'reg;' => "\xC2\xAE",
+ 'rfloor;' => "\xE2\x8C\x8B",
+ 'Rho;' => "\xCE\xA1",
+ 'rho;' => "\xCF\x81",
+ 'rlm;' => "\xE2\x80\x8F",
+ 'rsaquo;' => "\xE2\x80\xBA",
+ 'rsquo;' => "\xE2\x80\x99",
+ 'sbquo;' => "\xE2\x80\x9A",
+ 'Scaron;' => "\xC5\xA0",
+ 'scaron;' => "\xC5\xA1",
+ 'sdot;' => "\xE2\x8B\x85",
+ 'sect' => "\xC2\xA7",
+ 'sect;' => "\xC2\xA7",
+ 'shy' => "\xC2\xAD",
+ 'shy;' => "\xC2\xAD",
+ 'Sigma;' => "\xCE\xA3",
+ 'sigma;' => "\xCF\x83",
+ 'sigmaf;' => "\xCF\x82",
+ 'sim;' => "\xE2\x88\xBC",
+ 'spades;' => "\xE2\x99\xA0",
+ 'sub;' => "\xE2\x8A\x82",
+ 'sube;' => "\xE2\x8A\x86",
+ 'sum;' => "\xE2\x88\x91",
+ 'sup;' => "\xE2\x8A\x83",
+ 'sup1' => "\xC2\xB9",
+ 'sup1;' => "\xC2\xB9",
+ 'sup2' => "\xC2\xB2",
+ 'sup2;' => "\xC2\xB2",
+ 'sup3' => "\xC2\xB3",
+ 'sup3;' => "\xC2\xB3",
+ 'supe;' => "\xE2\x8A\x87",
+ 'szlig' => "\xC3\x9F",
+ 'szlig;' => "\xC3\x9F",
+ 'Tau;' => "\xCE\xA4",
+ 'tau;' => "\xCF\x84",
+ 'there4;' => "\xE2\x88\xB4",
+ 'Theta;' => "\xCE\x98",
+ 'theta;' => "\xCE\xB8",
+ 'thetasym;' => "\xCF\x91",
+ 'thinsp;' => "\xE2\x80\x89",
+ 'THORN' => "\xC3\x9E",
+ 'thorn' => "\xC3\xBE",
+ 'THORN;' => "\xC3\x9E",
+ 'thorn;' => "\xC3\xBE",
+ 'tilde;' => "\xCB\x9C",
+ 'times' => "\xC3\x97",
+ 'times;' => "\xC3\x97",
+ 'TRADE;' => "\xE2\x84\xA2",
+ 'trade;' => "\xE2\x84\xA2",
+ 'Uacute' => "\xC3\x9A",
+ 'uacute' => "\xC3\xBA",
+ 'Uacute;' => "\xC3\x9A",
+ 'uacute;' => "\xC3\xBA",
+ 'uArr;' => "\xE2\x87\x91",
+ 'uarr;' => "\xE2\x86\x91",
+ 'Ucirc' => "\xC3\x9B",
+ 'ucirc' => "\xC3\xBB",
+ 'Ucirc;' => "\xC3\x9B",
+ 'ucirc;' => "\xC3\xBB",
+ 'Ugrave' => "\xC3\x99",
+ 'ugrave' => "\xC3\xB9",
+ 'Ugrave;' => "\xC3\x99",
+ 'ugrave;' => "\xC3\xB9",
+ 'uml' => "\xC2\xA8",
+ 'uml;' => "\xC2\xA8",
+ 'upsih;' => "\xCF\x92",
+ 'Upsilon;' => "\xCE\xA5",
+ 'upsilon;' => "\xCF\x85",
+ 'Uuml' => "\xC3\x9C",
+ 'uuml' => "\xC3\xBC",
+ 'Uuml;' => "\xC3\x9C",
+ 'uuml;' => "\xC3\xBC",
+ 'weierp;' => "\xE2\x84\x98",
+ 'Xi;' => "\xCE\x9E",
+ 'xi;' => "\xCE\xBE",
+ 'Yacute' => "\xC3\x9D",
+ 'yacute' => "\xC3\xBD",
+ 'Yacute;' => "\xC3\x9D",
+ 'yacute;' => "\xC3\xBD",
+ 'yen' => "\xC2\xA5",
+ 'yen;' => "\xC2\xA5",
+ 'yuml' => "\xC3\xBF",
+ 'Yuml;' => "\xC5\xB8",
+ 'yuml;' => "\xC3\xBF",
+ 'Zeta;' => "\xCE\x96",
+ 'zeta;' => "\xCE\xB6",
+ 'zwj;' => "\xE2\x80\x8D",
+ 'zwnj;' => "\xE2\x80\x8C"
+ );
+
+ for ($i = 0, $match = null; $i < 9 && $this->consume() !== false; $i++)
+ {
+ $consumed = substr($this->consumed, 1);
+ if (isset($entities[$consumed]))
+ {
+ $match = $consumed;
+ }
+ }
+
+ if ($match !== null)
+ {
+ $this->data = substr_replace($this->data, $entities[$match], $this->position - strlen($consumed) - 1, strlen($match) + 1);
+ $this->position += strlen($entities[$match]) - strlen($consumed) - 1;
+ }
+ break;
+ }
+ }
+}
+
diff --git a/vendor/simplepie/simplepie/library/SimplePie/Enclosure.php b/vendor/simplepie/simplepie/library/SimplePie/Enclosure.php
new file mode 100644
index 000000000..15060e193
--- /dev/null
+++ b/vendor/simplepie/simplepie/library/SimplePie/Enclosure.php
@@ -0,0 +1,1379 @@
+<?php
+/**
+ * SimplePie
+ *
+ * A PHP-Based RSS and Atom Feed Framework.
+ * Takes the hard work out of managing a complete RSS/Atom solution.
+ *
+ * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * * Neither the name of the SimplePie Team nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
+ * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @package SimplePie
+ * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @author Ryan Parman
+ * @author Geoffrey Sneddon
+ * @author Ryan McCue
+ * @link http://simplepie.org/ SimplePie
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ */
+
+/**
+ * Handles everything related to enclosures (including Media RSS and iTunes RSS)
+ *
+ * Used by {@see SimplePie_Item::get_enclosure()} and {@see SimplePie_Item::get_enclosures()}
+ *
+ * This class can be overloaded with {@see SimplePie::set_enclosure_class()}
+ *
+ * @package SimplePie
+ * @subpackage API
+ */
+class SimplePie_Enclosure
+{
+ /**
+ * @var string
+ * @see get_bitrate()
+ */
+ var $bitrate;
+
+ /**
+ * @var array
+ * @see get_captions()
+ */
+ var $captions;
+
+ /**
+ * @var array
+ * @see get_categories()
+ */
+ var $categories;
+
+ /**
+ * @var int
+ * @see get_channels()
+ */
+ var $channels;
+
+ /**
+ * @var SimplePie_Copyright
+ * @see get_copyright()
+ */
+ var $copyright;
+
+ /**
+ * @var array
+ * @see get_credits()
+ */
+ var $credits;
+
+ /**
+ * @var string
+ * @see get_description()
+ */
+ var $description;
+
+ /**
+ * @var int
+ * @see get_duration()
+ */
+ var $duration;
+
+ /**
+ * @var string
+ * @see get_expression()
+ */
+ var $expression;
+
+ /**
+ * @var string
+ * @see get_framerate()
+ */
+ var $framerate;
+
+ /**
+ * @var string
+ * @see get_handler()
+ */
+ var $handler;
+
+ /**
+ * @var array
+ * @see get_hashes()
+ */
+ var $hashes;
+
+ /**
+ * @var string
+ * @see get_height()
+ */
+ var $height;
+
+ /**
+ * @deprecated
+ * @var null
+ */
+ var $javascript;
+
+ /**
+ * @var array
+ * @see get_keywords()
+ */
+ var $keywords;
+
+ /**
+ * @var string
+ * @see get_language()
+ */
+ var $lang;
+
+ /**
+ * @var string
+ * @see get_length()
+ */
+ var $length;
+
+ /**
+ * @var string
+ * @see get_link()
+ */
+ var $link;
+
+ /**
+ * @var string
+ * @see get_medium()
+ */
+ var $medium;
+
+ /**
+ * @var string
+ * @see get_player()
+ */
+ var $player;
+
+ /**
+ * @var array
+ * @see get_ratings()
+ */
+ var $ratings;
+
+ /**
+ * @var array
+ * @see get_restrictions()
+ */
+ var $restrictions;
+
+ /**
+ * @var string
+ * @see get_sampling_rate()
+ */
+ var $samplingrate;
+
+ /**
+ * @var array
+ * @see get_thumbnails()
+ */
+ var $thumbnails;
+
+ /**
+ * @var string
+ * @see get_title()
+ */
+ var $title;
+
+ /**
+ * @var string
+ * @see get_type()
+ */
+ var $type;
+
+ /**
+ * @var string
+ * @see get_width()
+ */
+ var $width;
+
+ /**
+ * Constructor, used to input the data
+ *
+ * For documentation on all the parameters, see the corresponding
+ * properties and their accessors
+ *
+ * @uses idna_convert If available, this will convert an IDN
+ */
+ public function __construct($link = null, $type = null, $length = null, $javascript = null, $bitrate = null, $captions = null, $categories = null, $channels = null, $copyright = null, $credits = null, $description = null, $duration = null, $expression = null, $framerate = null, $hashes = null, $height = null, $keywords = null, $lang = null, $medium = null, $player = null, $ratings = null, $restrictions = null, $samplingrate = null, $thumbnails = null, $title = null, $width = null)
+ {
+ $this->bitrate = $bitrate;
+ $this->captions = $captions;
+ $this->categories = $categories;
+ $this->channels = $channels;
+ $this->copyright = $copyright;
+ $this->credits = $credits;
+ $this->description = $description;
+ $this->duration = $duration;
+ $this->expression = $expression;
+ $this->framerate = $framerate;
+ $this->hashes = $hashes;
+ $this->height = $height;
+ $this->keywords = $keywords;
+ $this->lang = $lang;
+ $this->length = $length;
+ $this->link = $link;
+ $this->medium = $medium;
+ $this->player = $player;
+ $this->ratings = $ratings;
+ $this->restrictions = $restrictions;
+ $this->samplingrate = $samplingrate;
+ $this->thumbnails = $thumbnails;
+ $this->title = $title;
+ $this->type = $type;
+ $this->width = $width;
+
+ if (class_exists('idna_convert'))
+ {
+ $idn = new idna_convert();
+ $parsed = SimplePie_Misc::parse_url($link);
+ $this->link = SimplePie_Misc::compress_parse_url($parsed['scheme'], $idn->encode($parsed['authority']), $parsed['path'], $parsed['query'], $parsed['fragment']);
+ }
+ $this->handler = $this->get_handler(); // Needs to load last
+ }
+
+ /**
+ * String-ified version
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ // There is no $this->data here
+ return md5(serialize($this));
+ }
+
+ /**
+ * Get the bitrate
+ *
+ * @return string|null
+ */
+ public function get_bitrate()
+ {
+ if ($this->bitrate !== null)
+ {
+ return $this->bitrate;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get a single caption
+ *
+ * @param int $key
+ * @return SimplePie_Caption|null
+ */
+ public function get_caption($key = 0)
+ {
+ $captions = $this->get_captions();
+ if (isset($captions[$key]))
+ {
+ return $captions[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get all captions
+ *
+ * @return array|null Array of {@see SimplePie_Caption} objects
+ */
+ public function get_captions()
+ {
+ if ($this->captions !== null)
+ {
+ return $this->captions;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get a single category
+ *
+ * @param int $key
+ * @return SimplePie_Category|null
+ */
+ public function get_category($key = 0)
+ {
+ $categories = $this->get_categories();
+ if (isset($categories[$key]))
+ {
+ return $categories[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get all categories
+ *
+ * @return array|null Array of {@see SimplePie_Category} objects
+ */
+ public function get_categories()
+ {
+ if ($this->categories !== null)
+ {
+ return $this->categories;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get the number of audio channels
+ *
+ * @return int|null
+ */
+ public function get_channels()
+ {
+ if ($this->channels !== null)
+ {
+ return $this->channels;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get the copyright information
+ *
+ * @return SimplePie_Copyright|null
+ */
+ public function get_copyright()
+ {
+ if ($this->copyright !== null)
+ {
+ return $this->copyright;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get a single credit
+ *
+ * @param int $key
+ * @return SimplePie_Credit|null
+ */
+ public function get_credit($key = 0)
+ {
+ $credits = $this->get_credits();
+ if (isset($credits[$key]))
+ {
+ return $credits[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get all credits
+ *
+ * @return array|null Array of {@see SimplePie_Credit} objects
+ */
+ public function get_credits()
+ {
+ if ($this->credits !== null)
+ {
+ return $this->credits;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get the description of the enclosure
+ *
+ * @return string|null
+ */
+ public function get_description()
+ {
+ if ($this->description !== null)
+ {
+ return $this->description;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get the duration of the enclosure
+ *
+ * @param bool $convert Convert seconds into hh:mm:ss
+ * @return string|int|null 'hh:mm:ss' string if `$convert` was specified, otherwise integer (or null if none found)
+ */
+ public function get_duration($convert = false)
+ {
+ if ($this->duration !== null)
+ {
+ if ($convert)
+ {
+ $time = SimplePie_Misc::time_hms($this->duration);
+ return $time;
+ }
+ else
+ {
+ return $this->duration;
+ }
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get the expression
+ *
+ * @return string Probably one of 'sample', 'full', 'nonstop', 'clip'. Defaults to 'full'
+ */
+ public function get_expression()
+ {
+ if ($this->expression !== null)
+ {
+ return $this->expression;
+ }
+ else
+ {
+ return 'full';
+ }
+ }
+
+ /**
+ * Get the file extension
+ *
+ * @return string|null
+ */
+ public function get_extension()
+ {
+ if ($this->link !== null)
+ {
+ $url = SimplePie_Misc::parse_url($this->link);
+ if ($url['path'] !== '')
+ {
+ return pathinfo($url['path'], PATHINFO_EXTENSION);
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Get the framerate (in frames-per-second)
+ *
+ * @return string|null
+ */
+ public function get_framerate()
+ {
+ if ($this->framerate !== null)
+ {
+ return $this->framerate;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get the preferred handler
+ *
+ * @return string|null One of 'flash', 'fmedia', 'quicktime', 'wmedia', 'mp3'
+ */
+ public function get_handler()
+ {
+ return $this->get_real_type(true);
+ }
+
+ /**
+ * Get a single hash
+ *
+ * @link http://www.rssboard.org/media-rss#media-hash
+ * @param int $key
+ * @return string|null Hash as per `media:hash`, prefixed with "$algo:"
+ */
+ public function get_hash($key = 0)
+ {
+ $hashes = $this->get_hashes();
+ if (isset($hashes[$key]))
+ {
+ return $hashes[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get all credits
+ *
+ * @return array|null Array of strings, see {@see get_hash()}
+ */
+ public function get_hashes()
+ {
+ if ($this->hashes !== null)
+ {
+ return $this->hashes;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get the height
+ *
+ * @return string|null
+ */
+ public function get_height()
+ {
+ if ($this->height !== null)
+ {
+ return $this->height;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get the language
+ *
+ * @link http://tools.ietf.org/html/rfc3066
+ * @return string|null Language code as per RFC 3066
+ */
+ public function get_language()
+ {
+ if ($this->lang !== null)
+ {
+ return $this->lang;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get a single keyword
+ *
+ * @param int $key
+ * @return string|null
+ */
+ public function get_keyword($key = 0)
+ {
+ $keywords = $this->get_keywords();
+ if (isset($keywords[$key]))
+ {
+ return $keywords[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get all keywords
+ *
+ * @return array|null Array of strings
+ */
+ public function get_keywords()
+ {
+ if ($this->keywords !== null)
+ {
+ return $this->keywords;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get length
+ *
+ * @return float Length in bytes
+ */
+ public function get_length()
+ {
+ if ($this->length !== null)
+ {
+ return $this->length;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get the URL
+ *
+ * @return string|null
+ */
+ public function get_link()
+ {
+ if ($this->link !== null)
+ {
+ return urldecode($this->link);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get the medium
+ *
+ * @link http://www.rssboard.org/media-rss#media-content
+ * @return string|null Should be one of 'image', 'audio', 'video', 'document', 'executable'
+ */
+ public function get_medium()
+ {
+ if ($this->medium !== null)
+ {
+ return $this->medium;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get the player URL
+ *
+ * Typically the same as {@see get_permalink()}
+ * @return string|null Player URL
+ */
+ public function get_player()
+ {
+ if ($this->player !== null)
+ {
+ return $this->player;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get a single rating
+ *
+ * @param int $key
+ * @return SimplePie_Rating|null
+ */
+ public function get_rating($key = 0)
+ {
+ $ratings = $this->get_ratings();
+ if (isset($ratings[$key]))
+ {
+ return $ratings[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get all ratings
+ *
+ * @return array|null Array of {@see SimplePie_Rating} objects
+ */
+ public function get_ratings()
+ {
+ if ($this->ratings !== null)
+ {
+ return $this->ratings;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get a single restriction
+ *
+ * @param int $key
+ * @return SimplePie_Restriction|null
+ */
+ public function get_restriction($key = 0)
+ {
+ $restrictions = $this->get_restrictions();
+ if (isset($restrictions[$key]))
+ {
+ return $restrictions[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get all restrictions
+ *
+ * @return array|null Array of {@see SimplePie_Restriction} objects
+ */
+ public function get_restrictions()
+ {
+ if ($this->restrictions !== null)
+ {
+ return $this->restrictions;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get the sampling rate (in kHz)
+ *
+ * @return string|null
+ */
+ public function get_sampling_rate()
+ {
+ if ($this->samplingrate !== null)
+ {
+ return $this->samplingrate;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get the file size (in MiB)
+ *
+ * @return float|null File size in mebibytes (1048 bytes)
+ */
+ public function get_size()
+ {
+ $length = $this->get_length();
+ if ($length !== null)
+ {
+ return round($length/1048576, 2);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get a single thumbnail
+ *
+ * @param int $key
+ * @return string|null Thumbnail URL
+ */
+ public function get_thumbnail($key = 0)
+ {
+ $thumbnails = $this->get_thumbnails();
+ if (isset($thumbnails[$key]))
+ {
+ return $thumbnails[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get all thumbnails
+ *
+ * @return array|null Array of thumbnail URLs
+ */
+ public function get_thumbnails()
+ {
+ if ($this->thumbnails !== null)
+ {
+ return $this->thumbnails;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get the title
+ *
+ * @return string|null
+ */
+ public function get_title()
+ {
+ if ($this->title !== null)
+ {
+ return $this->title;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get mimetype of the enclosure
+ *
+ * @see get_real_type()
+ * @return string|null MIME type
+ */
+ public function get_type()
+ {
+ if ($this->type !== null)
+ {
+ return $this->type;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get the width
+ *
+ * @return string|null
+ */
+ public function get_width()
+ {
+ if ($this->width !== null)
+ {
+ return $this->width;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Embed the enclosure using `<embed>`
+ *
+ * @deprecated Use the second parameter to {@see embed} instead
+ *
+ * @param array|string $options See first paramter to {@see embed}
+ * @return string HTML string to output
+ */
+ public function native_embed($options='')
+ {
+ return $this->embed($options, true);
+ }
+
+ /**
+ * Embed the enclosure using Javascript
+ *
+ * `$options` is an array or comma-separated key:value string, with the
+ * following properties:
+ *
+ * - `alt` (string): Alternate content for when an end-user does not have
+ * the appropriate handler installed or when a file type is
+ * unsupported. Can be any text or HTML. Defaults to blank.
+ * - `altclass` (string): If a file type is unsupported, the end-user will
+ * see the alt text (above) linked directly to the content. That link
+ * will have this value as its class name. Defaults to blank.
+ * - `audio` (string): This is an image that should be used as a
+ * placeholder for audio files before they're loaded (QuickTime-only).
+ * Can be any relative or absolute URL. Defaults to blank.
+ * - `bgcolor` (string): The background color for the media, if not
+ * already transparent. Defaults to `#ffffff`.
+ * - `height` (integer): The height of the embedded media. Accepts any
+ * numeric pixel value (such as `360`) or `auto`. Defaults to `auto`,
+ * and it is recommended that you use this default.
+ * - `loop` (boolean): Do you want the media to loop when it's done?
+ * Defaults to `false`.
+ * - `mediaplayer` (string): The location of the included
+ * `mediaplayer.swf` file. This allows for the playback of Flash Video
+ * (`.flv`) files, and is the default handler for non-Odeo MP3's.
+ * Defaults to blank.
+ * - `video` (string): This is an image that should be used as a
+ * placeholder for video files before they're loaded (QuickTime-only).
+ * Can be any relative or absolute URL. Defaults to blank.
+ * - `width` (integer): The width of the embedded media. Accepts any
+ * numeric pixel value (such as `480`) or `auto`. Defaults to `auto`,
+ * and it is recommended that you use this default.
+ * - `widescreen` (boolean): Is the enclosure widescreen or standard?
+ * This applies only to video enclosures, and will automatically resize
+ * the content appropriately. Defaults to `false`, implying 4:3 mode.
+ *
+ * Note: Non-widescreen (4:3) mode with `width` and `height` set to `auto`
+ * will default to 480x360 video resolution. Widescreen (16:9) mode with
+ * `width` and `height` set to `auto` will default to 480x270 video resolution.
+ *
+ * @todo If the dimensions for media:content are defined, use them when width/height are set to 'auto'.
+ * @param array|string $options Comma-separated key:value list, or array
+ * @param bool $native Use `<embed>`
+ * @return string HTML string to output
+ */
+ public function embed($options = '', $native = false)
+ {
+ // Set up defaults
+ $audio = '';
+ $video = '';
+ $alt = '';
+ $altclass = '';
+ $loop = 'false';
+ $width = 'auto';
+ $height = 'auto';
+ $bgcolor = '#ffffff';
+ $mediaplayer = '';
+ $widescreen = false;
+ $handler = $this->get_handler();
+ $type = $this->get_real_type();
+
+ // Process options and reassign values as necessary
+ if (is_array($options))
+ {
+ extract($options);
+ }
+ else
+ {
+ $options = explode(',', $options);
+ foreach($options as $option)
+ {
+ $opt = explode(':', $option, 2);
+ if (isset($opt[0], $opt[1]))
+ {
+ $opt[0] = trim($opt[0]);
+ $opt[1] = trim($opt[1]);
+ switch ($opt[0])
+ {
+ case 'audio':
+ $audio = $opt[1];
+ break;
+
+ case 'video':
+ $video = $opt[1];
+ break;
+
+ case 'alt':
+ $alt = $opt[1];
+ break;
+
+ case 'altclass':
+ $altclass = $opt[1];
+ break;
+
+ case 'loop':
+ $loop = $opt[1];
+ break;
+
+ case 'width':
+ $width = $opt[1];
+ break;
+
+ case 'height':
+ $height = $opt[1];
+ break;
+
+ case 'bgcolor':
+ $bgcolor = $opt[1];
+ break;
+
+ case 'mediaplayer':
+ $mediaplayer = $opt[1];
+ break;
+
+ case 'widescreen':
+ $widescreen = $opt[1];
+ break;
+ }
+ }
+ }
+ }
+
+ $mime = explode('/', $type, 2);
+ $mime = $mime[0];
+
+ // Process values for 'auto'
+ if ($width === 'auto')
+ {
+ if ($mime === 'video')
+ {
+ if ($height === 'auto')
+ {
+ $width = 480;
+ }
+ elseif ($widescreen)
+ {
+ $width = round((intval($height)/9)*16);
+ }
+ else
+ {
+ $width = round((intval($height)/3)*4);
+ }
+ }
+ else
+ {
+ $width = '100%';
+ }
+ }
+
+ if ($height === 'auto')
+ {
+ if ($mime === 'audio')
+ {
+ $height = 0;
+ }
+ elseif ($mime === 'video')
+ {
+ if ($width === 'auto')
+ {
+ if ($widescreen)
+ {
+ $height = 270;
+ }
+ else
+ {
+ $height = 360;
+ }
+ }
+ elseif ($widescreen)
+ {
+ $height = round((intval($width)/16)*9);
+ }
+ else
+ {
+ $height = round((intval($width)/4)*3);
+ }
+ }
+ else
+ {
+ $height = 376;
+ }
+ }
+ elseif ($mime === 'audio')
+ {
+ $height = 0;
+ }
+
+ // Set proper placeholder value
+ if ($mime === 'audio')
+ {
+ $placeholder = $audio;
+ }
+ elseif ($mime === 'video')
+ {
+ $placeholder = $video;
+ }
+
+ $embed = '';
+
+ // Flash
+ if ($handler === 'flash')
+ {
+ if ($native)
+ {
+ $embed .= "<embed src=\"" . $this->get_link() . "\" pluginspage=\"http://adobe.com/go/getflashplayer\" type=\"$type\" quality=\"high\" width=\"$width\" height=\"$height\" bgcolor=\"$bgcolor\" loop=\"$loop\"></embed>";
+ }
+ else
+ {
+ $embed .= "<script type='text/javascript'>embed_flash('$bgcolor', '$width', '$height', '" . $this->get_link() . "', '$loop', '$type');</script>";
+ }
+ }
+
+ // Flash Media Player file types.
+ // Preferred handler for MP3 file types.
+ elseif ($handler === 'fmedia' || ($handler === 'mp3' && $mediaplayer !== ''))
+ {
+ $height += 20;
+ if ($native)
+ {
+ $embed .= "<embed src=\"$mediaplayer\" pluginspage=\"http://adobe.com/go/getflashplayer\" type=\"application/x-shockwave-flash\" quality=\"high\" width=\"$width\" height=\"$height\" wmode=\"transparent\" flashvars=\"file=" . rawurlencode($this->get_link().'?file_extension=.'.$this->get_extension()) . "&autostart=false&repeat=$loop&showdigits=true&showfsbutton=false\"></embed>";
+ }
+ else
+ {
+ $embed .= "<script type='text/javascript'>embed_flv('$width', '$height', '" . rawurlencode($this->get_link().'?file_extension=.'.$this->get_extension()) . "', '$placeholder', '$loop', '$mediaplayer');</script>";
+ }
+ }
+
+ // QuickTime 7 file types. Need to test with QuickTime 6.
+ // Only handle MP3's if the Flash Media Player is not present.
+ elseif ($handler === 'quicktime' || ($handler === 'mp3' && $mediaplayer === ''))
+ {
+ $height += 16;
+ if ($native)
+ {
+ if ($placeholder !== '')
+ {
+ $embed .= "<embed type=\"$type\" style=\"cursor:hand; cursor:pointer;\" href=\"" . $this->get_link() . "\" src=\"$placeholder\" width=\"$width\" height=\"$height\" autoplay=\"false\" target=\"myself\" controller=\"false\" loop=\"$loop\" scale=\"aspect\" bgcolor=\"$bgcolor\" pluginspage=\"http://apple.com/quicktime/download/\"></embed>";
+ }
+ else
+ {
+ $embed .= "<embed type=\"$type\" style=\"cursor:hand; cursor:pointer;\" src=\"" . $this->get_link() . "\" width=\"$width\" height=\"$height\" autoplay=\"false\" target=\"myself\" controller=\"true\" loop=\"$loop\" scale=\"aspect\" bgcolor=\"$bgcolor\" pluginspage=\"http://apple.com/quicktime/download/\"></embed>";
+ }
+ }
+ else
+ {
+ $embed .= "<script type='text/javascript'>embed_quicktime('$type', '$bgcolor', '$width', '$height', '" . $this->get_link() . "', '$placeholder', '$loop');</script>";
+ }
+ }
+
+ // Windows Media
+ elseif ($handler === 'wmedia')
+ {
+ $height += 45;
+ if ($native)
+ {
+ $embed .= "<embed type=\"application/x-mplayer2\" src=\"" . $this->get_link() . "\" autosize=\"1\" width=\"$width\" height=\"$height\" showcontrols=\"1\" showstatusbar=\"0\" showdisplay=\"0\" autostart=\"0\"></embed>";
+ }
+ else
+ {
+ $embed .= "<script type='text/javascript'>embed_wmedia('$width', '$height', '" . $this->get_link() . "');</script>";
+ }
+ }
+
+ // Everything else
+ else $embed .= '<a href="' . $this->get_link() . '" class="' . $altclass . '">' . $alt . '</a>';
+
+ return $embed;
+ }
+
+ /**
+ * Get the real media type
+ *
+ * Often, feeds lie to us, necessitating a bit of deeper inspection. This
+ * converts types to their canonical representations based on the file
+ * extension
+ *
+ * @see get_type()
+ * @param bool $find_handler Internal use only, use {@see get_handler()} instead
+ * @return string MIME type
+ */
+ public function get_real_type($find_handler = false)
+ {
+ // Mime-types by handler.
+ $types_flash = array('application/x-shockwave-flash', 'application/futuresplash'); // Flash
+ $types_fmedia = array('video/flv', 'video/x-flv','flv-application/octet-stream'); // Flash Media Player
+ $types_quicktime = array('audio/3gpp', 'audio/3gpp2', 'audio/aac', 'audio/x-aac', 'audio/aiff', 'audio/x-aiff', 'audio/mid', 'audio/midi', 'audio/x-midi', 'audio/mp4', 'audio/m4a', 'audio/x-m4a', 'audio/wav', 'audio/x-wav', 'video/3gpp', 'video/3gpp2', 'video/m4v', 'video/x-m4v', 'video/mp4', 'video/mpeg', 'video/x-mpeg', 'video/quicktime', 'video/sd-video'); // QuickTime
+ $types_wmedia = array('application/asx', 'application/x-mplayer2', 'audio/x-ms-wma', 'audio/x-ms-wax', 'video/x-ms-asf-plugin', 'video/x-ms-asf', 'video/x-ms-wm', 'video/x-ms-wmv', 'video/x-ms-wvx'); // Windows Media
+ $types_mp3 = array('audio/mp3', 'audio/x-mp3', 'audio/mpeg', 'audio/x-mpeg'); // MP3
+
+ if ($this->get_type() !== null)
+ {
+ $type = strtolower($this->type);
+ }
+ else
+ {
+ $type = null;
+ }
+
+ // If we encounter an unsupported mime-type, check the file extension and guess intelligently.
+ if (!in_array($type, array_merge($types_flash, $types_fmedia, $types_quicktime, $types_wmedia, $types_mp3)))
+ {
+ switch (strtolower($this->get_extension()))
+ {
+ // Audio mime-types
+ case 'aac':
+ case 'adts':
+ $type = 'audio/acc';
+ break;
+
+ case 'aif':
+ case 'aifc':
+ case 'aiff':
+ case 'cdda':
+ $type = 'audio/aiff';
+ break;
+
+ case 'bwf':
+ $type = 'audio/wav';
+ break;
+
+ case 'kar':
+ case 'mid':
+ case 'midi':
+ case 'smf':
+ $type = 'audio/midi';
+ break;
+
+ case 'm4a':
+ $type = 'audio/x-m4a';
+ break;
+
+ case 'mp3':
+ case 'swa':
+ $type = 'audio/mp3';
+ break;
+
+ case 'wav':
+ $type = 'audio/wav';
+ break;
+
+ case 'wax':
+ $type = 'audio/x-ms-wax';
+ break;
+
+ case 'wma':
+ $type = 'audio/x-ms-wma';
+ break;
+
+ // Video mime-types
+ case '3gp':
+ case '3gpp':
+ $type = 'video/3gpp';
+ break;
+
+ case '3g2':
+ case '3gp2':
+ $type = 'video/3gpp2';
+ break;
+
+ case 'asf':
+ $type = 'video/x-ms-asf';
+ break;
+
+ case 'flv':
+ $type = 'video/x-flv';
+ break;
+
+ case 'm1a':
+ case 'm1s':
+ case 'm1v':
+ case 'm15':
+ case 'm75':
+ case 'mp2':
+ case 'mpa':
+ case 'mpeg':
+ case 'mpg':
+ case 'mpm':
+ case 'mpv':
+ $type = 'video/mpeg';
+ break;
+
+ case 'm4v':
+ $type = 'video/x-m4v';
+ break;
+
+ case 'mov':
+ case 'qt':
+ $type = 'video/quicktime';
+ break;
+
+ case 'mp4':
+ case 'mpg4':
+ $type = 'video/mp4';
+ break;
+
+ case 'sdv':
+ $type = 'video/sd-video';
+ break;
+
+ case 'wm':
+ $type = 'video/x-ms-wm';
+ break;
+
+ case 'wmv':
+ $type = 'video/x-ms-wmv';
+ break;
+
+ case 'wvx':
+ $type = 'video/x-ms-wvx';
+ break;
+
+ // Flash mime-types
+ case 'spl':
+ $type = 'application/futuresplash';
+ break;
+
+ case 'swf':
+ $type = 'application/x-shockwave-flash';
+ break;
+ }
+ }
+
+ if ($find_handler)
+ {
+ if (in_array($type, $types_flash))
+ {
+ return 'flash';
+ }
+ elseif (in_array($type, $types_fmedia))
+ {
+ return 'fmedia';
+ }
+ elseif (in_array($type, $types_quicktime))
+ {
+ return 'quicktime';
+ }
+ elseif (in_array($type, $types_wmedia))
+ {
+ return 'wmedia';
+ }
+ elseif (in_array($type, $types_mp3))
+ {
+ return 'mp3';
+ }
+ else
+ {
+ return null;
+ }
+ }
+ else
+ {
+ return $type;
+ }
+ }
+}
+
diff --git a/vendor/simplepie/simplepie/library/SimplePie/Exception.php b/vendor/simplepie/simplepie/library/SimplePie/Exception.php
new file mode 100644
index 000000000..53c015e77
--- /dev/null
+++ b/vendor/simplepie/simplepie/library/SimplePie/Exception.php
@@ -0,0 +1,51 @@
+<?php
+/**
+ * SimplePie
+ *
+ * A PHP-Based RSS and Atom Feed Framework.
+ * Takes the hard work out of managing a complete RSS/Atom solution.
+ *
+ * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * * Neither the name of the SimplePie Team nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
+ * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @package SimplePie
+ * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @author Ryan Parman
+ * @author Geoffrey Sneddon
+ * @author Ryan McCue
+ * @link http://simplepie.org/ SimplePie
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ */
+
+/**
+ * General SimplePie exception class
+ *
+ * @package SimplePie
+ */
+class SimplePie_Exception extends Exception
+{
+} \ No newline at end of file
diff --git a/vendor/simplepie/simplepie/library/SimplePie/File.php b/vendor/simplepie/simplepie/library/SimplePie/File.php
new file mode 100644
index 000000000..e670e05a0
--- /dev/null
+++ b/vendor/simplepie/simplepie/library/SimplePie/File.php
@@ -0,0 +1,306 @@
+<?php
+/**
+ * SimplePie
+ *
+ * A PHP-Based RSS and Atom Feed Framework.
+ * Takes the hard work out of managing a complete RSS/Atom solution.
+ *
+ * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * * Neither the name of the SimplePie Team nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
+ * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @package SimplePie
+ * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @author Ryan Parman
+ * @author Geoffrey Sneddon
+ * @author Ryan McCue
+ * @link http://simplepie.org/ SimplePie
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ */
+
+/**
+ * Used for fetching remote files and reading local files
+ *
+ * Supports HTTP 1.0 via cURL or fsockopen, with spotty HTTP 1.1 support
+ *
+ * This class can be overloaded with {@see SimplePie::set_file_class()}
+ *
+ * @package SimplePie
+ * @subpackage HTTP
+ * @todo Move to properly supporting RFC2616 (HTTP/1.1)
+ */
+class SimplePie_File
+{
+ var $url;
+ var $useragent;
+ var $success = true;
+ var $headers = array();
+ var $body;
+ var $status_code;
+ var $redirects = 0;
+ var $error;
+ var $method = SIMPLEPIE_FILE_SOURCE_NONE;
+ var $permanent_url;
+
+ public function __construct($url, $timeout = 10, $redirects = 5, $headers = null, $useragent = null, $force_fsockopen = false, $curl_options = array())
+ {
+ if (class_exists('idna_convert'))
+ {
+ $idn = new idna_convert();
+ $parsed = SimplePie_Misc::parse_url($url);
+ $url = SimplePie_Misc::compress_parse_url($parsed['scheme'], $idn->encode($parsed['authority']), $parsed['path'], $parsed['query'], $parsed['fragment']);
+ }
+ $this->url = $url;
+ $this->permanent_url = $url;
+ $this->useragent = $useragent;
+ if (preg_match('/^http(s)?:\/\//i', $url))
+ {
+ if ($useragent === null)
+ {
+ $useragent = ini_get('user_agent');
+ $this->useragent = $useragent;
+ }
+ if (!is_array($headers))
+ {
+ $headers = array();
+ }
+ if (!$force_fsockopen && function_exists('curl_exec'))
+ {
+ $this->method = SIMPLEPIE_FILE_SOURCE_REMOTE | SIMPLEPIE_FILE_SOURCE_CURL;
+ $fp = curl_init();
+ $headers2 = array();
+ foreach ($headers as $key => $value)
+ {
+ $headers2[] = "$key: $value";
+ }
+ if (version_compare(SimplePie_Misc::get_curl_version(), '7.10.5', '>='))
+ {
+ curl_setopt($fp, CURLOPT_ENCODING, '');
+ }
+ curl_setopt($fp, CURLOPT_URL, $url);
+ curl_setopt($fp, CURLOPT_HEADER, 1);
+ curl_setopt($fp, CURLOPT_RETURNTRANSFER, 1);
+ curl_setopt($fp, CURLOPT_FAILONERROR, 1);
+ curl_setopt($fp, CURLOPT_TIMEOUT, $timeout);
+ curl_setopt($fp, CURLOPT_CONNECTTIMEOUT, $timeout);
+ curl_setopt($fp, CURLOPT_REFERER, $url);
+ curl_setopt($fp, CURLOPT_USERAGENT, $useragent);
+ curl_setopt($fp, CURLOPT_HTTPHEADER, $headers2);
+ if (!ini_get('open_basedir') && !ini_get('safe_mode') && version_compare(SimplePie_Misc::get_curl_version(), '7.15.2', '>='))
+ {
+ curl_setopt($fp, CURLOPT_FOLLOWLOCATION, 1);
+ curl_setopt($fp, CURLOPT_MAXREDIRS, $redirects);
+ }
+ foreach ($curl_options as $curl_param => $curl_value) {
+ curl_setopt($fp, $curl_param, $curl_value);
+ }
+
+ $this->headers = curl_exec($fp);
+ if (curl_errno($fp) === 23 || curl_errno($fp) === 61)
+ {
+ curl_setopt($fp, CURLOPT_ENCODING, 'none');
+ $this->headers = curl_exec($fp);
+ }
+ if (curl_errno($fp))
+ {
+ $this->error = 'cURL error ' . curl_errno($fp) . ': ' . curl_error($fp);
+ $this->success = false;
+ }
+ else
+ {
+ // Use the updated url provided by curl_getinfo after any redirects.
+ if ($info = curl_getinfo($fp)) {
+ $this->url = $info['url'];
+ }
+ curl_close($fp);
+ $this->headers = explode("\r\n\r\n", $this->headers, $info['redirect_count'] + 1);
+ $this->headers = array_pop($this->headers);
+ $parser = new SimplePie_HTTP_Parser($this->headers);
+ if ($parser->parse())
+ {
+ $this->headers = $parser->headers;
+ $this->body = trim($parser->body);
+ $this->status_code = $parser->status_code;
+ if ((in_array($this->status_code, array(300, 301, 302, 303, 307)) || $this->status_code > 307 && $this->status_code < 400) && isset($this->headers['location']) && $this->redirects < $redirects)
+ {
+ $this->redirects++;
+ $location = SimplePie_Misc::absolutize_url($this->headers['location'], $url);
+ $previousStatusCode = $this->status_code;
+ $this->__construct($location, $timeout, $redirects, $headers, $useragent, $force_fsockopen);
+ $this->permanent_url = ($previousStatusCode == 301) ? $location : $url;
+ return;
+ }
+ }
+ }
+ }
+ else
+ {
+ $this->method = SIMPLEPIE_FILE_SOURCE_REMOTE | SIMPLEPIE_FILE_SOURCE_FSOCKOPEN;
+ $url_parts = parse_url($url);
+ $socket_host = $url_parts['host'];
+ if (isset($url_parts['scheme']) && strtolower($url_parts['scheme']) === 'https')
+ {
+ $socket_host = "ssl://$url_parts[host]";
+ $url_parts['port'] = 443;
+ }
+ if (!isset($url_parts['port']))
+ {
+ $url_parts['port'] = 80;
+ }
+ $fp = @fsockopen($socket_host, $url_parts['port'], $errno, $errstr, $timeout);
+ if (!$fp)
+ {
+ $this->error = 'fsockopen error: ' . $errstr;
+ $this->success = false;
+ }
+ else
+ {
+ stream_set_timeout($fp, $timeout);
+ if (isset($url_parts['path']))
+ {
+ if (isset($url_parts['query']))
+ {
+ $get = "$url_parts[path]?$url_parts[query]";
+ }
+ else
+ {
+ $get = $url_parts['path'];
+ }
+ }
+ else
+ {
+ $get = '/';
+ }
+ $out = "GET $get HTTP/1.1\r\n";
+ $out .= "Host: $url_parts[host]\r\n";
+ $out .= "User-Agent: $useragent\r\n";
+ if (extension_loaded('zlib'))
+ {
+ $out .= "Accept-Encoding: x-gzip,gzip,deflate\r\n";
+ }
+
+ if (isset($url_parts['user']) && isset($url_parts['pass']))
+ {
+ $out .= "Authorization: Basic " . base64_encode("$url_parts[user]:$url_parts[pass]") . "\r\n";
+ }
+ foreach ($headers as $key => $value)
+ {
+ $out .= "$key: $value\r\n";
+ }
+ $out .= "Connection: Close\r\n\r\n";
+ fwrite($fp, $out);
+
+ $info = stream_get_meta_data($fp);
+
+ $this->headers = '';
+ while (!$info['eof'] && !$info['timed_out'])
+ {
+ $this->headers .= fread($fp, 1160);
+ $info = stream_get_meta_data($fp);
+ }
+ if (!$info['timed_out'])
+ {
+ $parser = new SimplePie_HTTP_Parser($this->headers);
+ if ($parser->parse())
+ {
+ $this->headers = $parser->headers;
+ $this->body = $parser->body;
+ $this->status_code = $parser->status_code;
+ if ((in_array($this->status_code, array(300, 301, 302, 303, 307)) || $this->status_code > 307 && $this->status_code < 400) && isset($this->headers['location']) && $this->redirects < $redirects)
+ {
+ $this->redirects++;
+ $location = SimplePie_Misc::absolutize_url($this->headers['location'], $url);
+ $previousStatusCode = $this->status_code;
+ $this->__construct($location, $timeout, $redirects, $headers, $useragent, $force_fsockopen);
+ $this->permanent_url = ($previousStatusCode == 301) ? $location : $url;
+ return;
+ }
+ if (isset($this->headers['content-encoding']))
+ {
+ // Hey, we act dumb elsewhere, so let's do that here too
+ switch (strtolower(trim($this->headers['content-encoding'], "\x09\x0A\x0D\x20")))
+ {
+ case 'gzip':
+ case 'x-gzip':
+ $decoder = new SimplePie_gzdecode($this->body);
+ if (!$decoder->parse())
+ {
+ $this->error = 'Unable to decode HTTP "gzip" stream';
+ $this->success = false;
+ }
+ else
+ {
+ $this->body = trim($decoder->data);
+ }
+ break;
+
+ case 'deflate':
+ if (($decompressed = gzinflate($this->body)) !== false)
+ {
+ $this->body = $decompressed;
+ }
+ else if (($decompressed = gzuncompress($this->body)) !== false)
+ {
+ $this->body = $decompressed;
+ }
+ else if (function_exists('gzdecode') && ($decompressed = gzdecode($this->body)) !== false)
+ {
+ $this->body = $decompressed;
+ }
+ else
+ {
+ $this->error = 'Unable to decode HTTP "deflate" stream';
+ $this->success = false;
+ }
+ break;
+
+ default:
+ $this->error = 'Unknown content coding';
+ $this->success = false;
+ }
+ }
+ }
+ }
+ else
+ {
+ $this->error = 'fsocket timed out';
+ $this->success = false;
+ }
+ fclose($fp);
+ }
+ }
+ }
+ else
+ {
+ $this->method = SIMPLEPIE_FILE_SOURCE_LOCAL | SIMPLEPIE_FILE_SOURCE_FILE_GET_CONTENTS;
+ if (empty($url) || !($this->body = trim(file_get_contents($url))))
+ {
+ $this->error = 'file_get_contents could not read the file';
+ $this->success = false;
+ }
+ }
+ }
+}
diff --git a/vendor/simplepie/simplepie/library/SimplePie/HTTP/Parser.php b/vendor/simplepie/simplepie/library/SimplePie/HTTP/Parser.php
new file mode 100644
index 000000000..63ae1e03d
--- /dev/null
+++ b/vendor/simplepie/simplepie/library/SimplePie/HTTP/Parser.php
@@ -0,0 +1,499 @@
+<?php
+/**
+ * SimplePie
+ *
+ * A PHP-Based RSS and Atom Feed Framework.
+ * Takes the hard work out of managing a complete RSS/Atom solution.
+ *
+ * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * * Neither the name of the SimplePie Team nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
+ * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @package SimplePie
+ * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @author Ryan Parman
+ * @author Geoffrey Sneddon
+ * @author Ryan McCue
+ * @link http://simplepie.org/ SimplePie
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ */
+
+
+/**
+ * HTTP Response Parser
+ *
+ * @package SimplePie
+ * @subpackage HTTP
+ */
+class SimplePie_HTTP_Parser
+{
+ /**
+ * HTTP Version
+ *
+ * @var float
+ */
+ public $http_version = 0.0;
+
+ /**
+ * Status code
+ *
+ * @var int
+ */
+ public $status_code = 0;
+
+ /**
+ * Reason phrase
+ *
+ * @var string
+ */
+ public $reason = '';
+
+ /**
+ * Key/value pairs of the headers
+ *
+ * @var array
+ */
+ public $headers = array();
+
+ /**
+ * Body of the response
+ *
+ * @var string
+ */
+ public $body = '';
+
+ /**
+ * Current state of the state machine
+ *
+ * @var string
+ */
+ protected $state = 'http_version';
+
+ /**
+ * Input data
+ *
+ * @var string
+ */
+ protected $data = '';
+
+ /**
+ * Input data length (to avoid calling strlen() everytime this is needed)
+ *
+ * @var int
+ */
+ protected $data_length = 0;
+
+ /**
+ * Current position of the pointer
+ *
+ * @var int
+ */
+ protected $position = 0;
+
+ /**
+ * Name of the hedaer currently being parsed
+ *
+ * @var string
+ */
+ protected $name = '';
+
+ /**
+ * Value of the hedaer currently being parsed
+ *
+ * @var string
+ */
+ protected $value = '';
+
+ /**
+ * Create an instance of the class with the input data
+ *
+ * @param string $data Input data
+ */
+ public function __construct($data)
+ {
+ $this->data = $data;
+ $this->data_length = strlen($this->data);
+ }
+
+ /**
+ * Parse the input data
+ *
+ * @return bool true on success, false on failure
+ */
+ public function parse()
+ {
+ while ($this->state && $this->state !== 'emit' && $this->has_data())
+ {
+ $state = $this->state;
+ $this->$state();
+ }
+ $this->data = '';
+ if ($this->state === 'emit' || $this->state === 'body')
+ {
+ return true;
+ }
+ else
+ {
+ $this->http_version = '';
+ $this->status_code = '';
+ $this->reason = '';
+ $this->headers = array();
+ $this->body = '';
+ return false;
+ }
+ }
+
+ /**
+ * Check whether there is data beyond the pointer
+ *
+ * @return bool true if there is further data, false if not
+ */
+ protected function has_data()
+ {
+ return (bool) ($this->position < $this->data_length);
+ }
+
+ /**
+ * See if the next character is LWS
+ *
+ * @return bool true if the next character is LWS, false if not
+ */
+ protected function is_linear_whitespace()
+ {
+ return (bool) ($this->data[$this->position] === "\x09"
+ || $this->data[$this->position] === "\x20"
+ || ($this->data[$this->position] === "\x0A"
+ && isset($this->data[$this->position + 1])
+ && ($this->data[$this->position + 1] === "\x09" || $this->data[$this->position + 1] === "\x20")));
+ }
+
+ /**
+ * Parse the HTTP version
+ */
+ protected function http_version()
+ {
+ if (strpos($this->data, "\x0A") !== false && strtoupper(substr($this->data, 0, 5)) === 'HTTP/')
+ {
+ $len = strspn($this->data, '0123456789.', 5);
+ $this->http_version = substr($this->data, 5, $len);
+ $this->position += 5 + $len;
+ if (substr_count($this->http_version, '.') <= 1)
+ {
+ $this->http_version = (float) $this->http_version;
+ $this->position += strspn($this->data, "\x09\x20", $this->position);
+ $this->state = 'status';
+ }
+ else
+ {
+ $this->state = false;
+ }
+ }
+ else
+ {
+ $this->state = false;
+ }
+ }
+
+ /**
+ * Parse the status code
+ */
+ protected function status()
+ {
+ if ($len = strspn($this->data, '0123456789', $this->position))
+ {
+ $this->status_code = (int) substr($this->data, $this->position, $len);
+ $this->position += $len;
+ $this->state = 'reason';
+ }
+ else
+ {
+ $this->state = false;
+ }
+ }
+
+ /**
+ * Parse the reason phrase
+ */
+ protected function reason()
+ {
+ $len = strcspn($this->data, "\x0A", $this->position);
+ $this->reason = trim(substr($this->data, $this->position, $len), "\x09\x0D\x20");
+ $this->position += $len + 1;
+ $this->state = 'new_line';
+ }
+
+ /**
+ * Deal with a new line, shifting data around as needed
+ */
+ protected function new_line()
+ {
+ $this->value = trim($this->value, "\x0D\x20");
+ if ($this->name !== '' && $this->value !== '')
+ {
+ $this->name = strtolower($this->name);
+ // We should only use the last Content-Type header. c.f. issue #1
+ if (isset($this->headers[$this->name]) && $this->name !== 'content-type')
+ {
+ $this->headers[$this->name] .= ', ' . $this->value;
+ }
+ else
+ {
+ $this->headers[$this->name] = $this->value;
+ }
+ }
+ $this->name = '';
+ $this->value = '';
+ if (substr($this->data[$this->position], 0, 2) === "\x0D\x0A")
+ {
+ $this->position += 2;
+ $this->state = 'body';
+ }
+ elseif ($this->data[$this->position] === "\x0A")
+ {
+ $this->position++;
+ $this->state = 'body';
+ }
+ else
+ {
+ $this->state = 'name';
+ }
+ }
+
+ /**
+ * Parse a header name
+ */
+ protected function name()
+ {
+ $len = strcspn($this->data, "\x0A:", $this->position);
+ if (isset($this->data[$this->position + $len]))
+ {
+ if ($this->data[$this->position + $len] === "\x0A")
+ {
+ $this->position += $len;
+ $this->state = 'new_line';
+ }
+ else
+ {
+ $this->name = substr($this->data, $this->position, $len);
+ $this->position += $len + 1;
+ $this->state = 'value';
+ }
+ }
+ else
+ {
+ $this->state = false;
+ }
+ }
+
+ /**
+ * Parse LWS, replacing consecutive LWS characters with a single space
+ */
+ protected function linear_whitespace()
+ {
+ do
+ {
+ if (substr($this->data, $this->position, 2) === "\x0D\x0A")
+ {
+ $this->position += 2;
+ }
+ elseif ($this->data[$this->position] === "\x0A")
+ {
+ $this->position++;
+ }
+ $this->position += strspn($this->data, "\x09\x20", $this->position);
+ } while ($this->has_data() && $this->is_linear_whitespace());
+ $this->value .= "\x20";
+ }
+
+ /**
+ * See what state to move to while within non-quoted header values
+ */
+ protected function value()
+ {
+ if ($this->is_linear_whitespace())
+ {
+ $this->linear_whitespace();
+ }
+ else
+ {
+ switch ($this->data[$this->position])
+ {
+ case '"':
+ // Workaround for ETags: we have to include the quotes as
+ // part of the tag.
+ if (strtolower($this->name) === 'etag')
+ {
+ $this->value .= '"';
+ $this->position++;
+ $this->state = 'value_char';
+ break;
+ }
+ $this->position++;
+ $this->state = 'quote';
+ break;
+
+ case "\x0A":
+ $this->position++;
+ $this->state = 'new_line';
+ break;
+
+ default:
+ $this->state = 'value_char';
+ break;
+ }
+ }
+ }
+
+ /**
+ * Parse a header value while outside quotes
+ */
+ protected function value_char()
+ {
+ $len = strcspn($this->data, "\x09\x20\x0A\"", $this->position);
+ $this->value .= substr($this->data, $this->position, $len);
+ $this->position += $len;
+ $this->state = 'value';
+ }
+
+ /**
+ * See what state to move to while within quoted header values
+ */
+ protected function quote()
+ {
+ if ($this->is_linear_whitespace())
+ {
+ $this->linear_whitespace();
+ }
+ else
+ {
+ switch ($this->data[$this->position])
+ {
+ case '"':
+ $this->position++;
+ $this->state = 'value';
+ break;
+
+ case "\x0A":
+ $this->position++;
+ $this->state = 'new_line';
+ break;
+
+ case '\\':
+ $this->position++;
+ $this->state = 'quote_escaped';
+ break;
+
+ default:
+ $this->state = 'quote_char';
+ break;
+ }
+ }
+ }
+
+ /**
+ * Parse a header value while within quotes
+ */
+ protected function quote_char()
+ {
+ $len = strcspn($this->data, "\x09\x20\x0A\"\\", $this->position);
+ $this->value .= substr($this->data, $this->position, $len);
+ $this->position += $len;
+ $this->state = 'value';
+ }
+
+ /**
+ * Parse an escaped character within quotes
+ */
+ protected function quote_escaped()
+ {
+ $this->value .= $this->data[$this->position];
+ $this->position++;
+ $this->state = 'quote';
+ }
+
+ /**
+ * Parse the body
+ */
+ protected function body()
+ {
+ $this->body = substr($this->data, $this->position);
+ if (!empty($this->headers['transfer-encoding']))
+ {
+ unset($this->headers['transfer-encoding']);
+ $this->state = 'chunked';
+ }
+ else
+ {
+ $this->state = 'emit';
+ }
+ }
+
+ /**
+ * Parsed a "Transfer-Encoding: chunked" body
+ */
+ protected function chunked()
+ {
+ if (!preg_match('/^([0-9a-f]+)[^\r\n]*\r\n/i', trim($this->body)))
+ {
+ $this->state = 'emit';
+ return;
+ }
+
+ $decoded = '';
+ $encoded = $this->body;
+
+ while (true)
+ {
+ $is_chunked = (bool) preg_match( '/^([0-9a-f]+)[^\r\n]*\r\n/i', $encoded, $matches );
+ if (!$is_chunked)
+ {
+ // Looks like it's not chunked after all
+ $this->state = 'emit';
+ return;
+ }
+
+ $length = hexdec(trim($matches[1]));
+ if ($length === 0)
+ {
+ // Ignore trailer headers
+ $this->state = 'emit';
+ $this->body = $decoded;
+ return;
+ }
+
+ $chunk_length = strlen($matches[0]);
+ $decoded .= $part = substr($encoded, $chunk_length, $length);
+ $encoded = substr($encoded, $chunk_length + $length + 2);
+
+ if (trim($encoded) === '0' || empty($encoded))
+ {
+ $this->state = 'emit';
+ $this->body = $decoded;
+ return;
+ }
+ }
+ }
+}
diff --git a/vendor/simplepie/simplepie/library/SimplePie/IRI.php b/vendor/simplepie/simplepie/library/SimplePie/IRI.php
new file mode 100644
index 000000000..2b3fbaf07
--- /dev/null
+++ b/vendor/simplepie/simplepie/library/SimplePie/IRI.php
@@ -0,0 +1,1257 @@
+<?php
+/**
+ * SimplePie
+ *
+ * A PHP-Based RSS and Atom Feed Framework.
+ * Takes the hard work out of managing a complete RSS/Atom solution.
+ *
+ * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * * Neither the name of the SimplePie Team nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
+ * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @package SimplePie
+ * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @author Ryan Parman
+ * @author Geoffrey Sneddon
+ * @author Ryan McCue
+ * @link http://simplepie.org/ SimplePie
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ */
+
+/**
+ * IRI parser/serialiser/normaliser
+ *
+ * @package SimplePie
+ * @subpackage HTTP
+ * @author Geoffrey Sneddon
+ * @author Steve Minutillo
+ * @author Ryan McCue
+ * @copyright 2007-2012 Geoffrey Sneddon, Steve Minutillo, Ryan McCue
+ * @license http://www.opensource.org/licenses/bsd-license.php
+ */
+class SimplePie_IRI
+{
+ /**
+ * Scheme
+ *
+ * @var string
+ */
+ protected $scheme = null;
+
+ /**
+ * User Information
+ *
+ * @var string
+ */
+ protected $iuserinfo = null;
+
+ /**
+ * ihost
+ *
+ * @var string
+ */
+ protected $ihost = null;
+
+ /**
+ * Port
+ *
+ * @var string
+ */
+ protected $port = null;
+
+ /**
+ * ipath
+ *
+ * @var string
+ */
+ protected $ipath = '';
+
+ /**
+ * iquery
+ *
+ * @var string
+ */
+ protected $iquery = null;
+
+ /**
+ * ifragment
+ *
+ * @var string
+ */
+ protected $ifragment = null;
+
+ /**
+ * Normalization database
+ *
+ * Each key is the scheme, each value is an array with each key as the IRI
+ * part and value as the default value for that part.
+ */
+ protected $normalization = array(
+ 'acap' => array(
+ 'port' => 674
+ ),
+ 'dict' => array(
+ 'port' => 2628
+ ),
+ 'file' => array(
+ 'ihost' => 'localhost'
+ ),
+ 'http' => array(
+ 'port' => 80,
+ 'ipath' => '/'
+ ),
+ 'https' => array(
+ 'port' => 443,
+ 'ipath' => '/'
+ ),
+ );
+
+ /**
+ * Return the entire IRI when you try and read the object as a string
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return $this->get_iri();
+ }
+
+ /**
+ * Overload __set() to provide access via properties
+ *
+ * @param string $name Property name
+ * @param mixed $value Property value
+ */
+ public function __set($name, $value)
+ {
+ if (method_exists($this, 'set_' . $name))
+ {
+ call_user_func(array($this, 'set_' . $name), $value);
+ }
+ elseif (
+ $name === 'iauthority'
+ || $name === 'iuserinfo'
+ || $name === 'ihost'
+ || $name === 'ipath'
+ || $name === 'iquery'
+ || $name === 'ifragment'
+ )
+ {
+ call_user_func(array($this, 'set_' . substr($name, 1)), $value);
+ }
+ }
+
+ /**
+ * Overload __get() to provide access via properties
+ *
+ * @param string $name Property name
+ * @return mixed
+ */
+ public function __get($name)
+ {
+ // isset() returns false for null, we don't want to do that
+ // Also why we use array_key_exists below instead of isset()
+ $props = get_object_vars($this);
+
+ if (
+ $name === 'iri' ||
+ $name === 'uri' ||
+ $name === 'iauthority' ||
+ $name === 'authority'
+ )
+ {
+ $return = $this->{"get_$name"}();
+ }
+ elseif (array_key_exists($name, $props))
+ {
+ $return = $this->$name;
+ }
+ // host -> ihost
+ elseif (($prop = 'i' . $name) && array_key_exists($prop, $props))
+ {
+ $name = $prop;
+ $return = $this->$prop;
+ }
+ // ischeme -> scheme
+ elseif (($prop = substr($name, 1)) && array_key_exists($prop, $props))
+ {
+ $name = $prop;
+ $return = $this->$prop;
+ }
+ else
+ {
+ trigger_error('Undefined property: ' . get_class($this) . '::' . $name, E_USER_NOTICE);
+ $return = null;
+ }
+
+ if ($return === null && isset($this->normalization[$this->scheme][$name]))
+ {
+ return $this->normalization[$this->scheme][$name];
+ }
+ else
+ {
+ return $return;
+ }
+ }
+
+ /**
+ * Overload __isset() to provide access via properties
+ *
+ * @param string $name Property name
+ * @return bool
+ */
+ public function __isset($name)
+ {
+ if (method_exists($this, 'get_' . $name) || isset($this->$name))
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ /**
+ * Overload __unset() to provide access via properties
+ *
+ * @param string $name Property name
+ */
+ public function __unset($name)
+ {
+ if (method_exists($this, 'set_' . $name))
+ {
+ call_user_func(array($this, 'set_' . $name), '');
+ }
+ }
+
+ /**
+ * Create a new IRI object, from a specified string
+ *
+ * @param string $iri
+ */
+ public function __construct($iri = null)
+ {
+ $this->set_iri($iri);
+ }
+
+ /**
+ * Clean up
+ */
+ public function __destruct() {
+ $this->set_iri(null, true);
+ $this->set_path(null, true);
+ $this->set_authority(null, true);
+ }
+
+ /**
+ * Create a new IRI object by resolving a relative IRI
+ *
+ * Returns false if $base is not absolute, otherwise an IRI.
+ *
+ * @param IRI|string $base (Absolute) Base IRI
+ * @param IRI|string $relative Relative IRI
+ * @return IRI|false
+ */
+ public static function absolutize($base, $relative)
+ {
+ if (!($relative instanceof SimplePie_IRI))
+ {
+ $relative = new SimplePie_IRI($relative);
+ }
+ if (!$relative->is_valid())
+ {
+ return false;
+ }
+ elseif ($relative->scheme !== null)
+ {
+ return clone $relative;
+ }
+ else
+ {
+ if (!($base instanceof SimplePie_IRI))
+ {
+ $base = new SimplePie_IRI($base);
+ }
+ if ($base->scheme !== null && $base->is_valid())
+ {
+ if ($relative->get_iri() !== '')
+ {
+ if ($relative->iuserinfo !== null || $relative->ihost !== null || $relative->port !== null)
+ {
+ $target = clone $relative;
+ $target->scheme = $base->scheme;
+ }
+ else
+ {
+ $target = new SimplePie_IRI;
+ $target->scheme = $base->scheme;
+ $target->iuserinfo = $base->iuserinfo;
+ $target->ihost = $base->ihost;
+ $target->port = $base->port;
+ if ($relative->ipath !== '')
+ {
+ if ($relative->ipath[0] === '/')
+ {
+ $target->ipath = $relative->ipath;
+ }
+ elseif (($base->iuserinfo !== null || $base->ihost !== null || $base->port !== null) && $base->ipath === '')
+ {
+ $target->ipath = '/' . $relative->ipath;
+ }
+ elseif (($last_segment = strrpos($base->ipath, '/')) !== false)
+ {
+ $target->ipath = substr($base->ipath, 0, $last_segment + 1) . $relative->ipath;
+ }
+ else
+ {
+ $target->ipath = $relative->ipath;
+ }
+ $target->ipath = $target->remove_dot_segments($target->ipath);
+ $target->iquery = $relative->iquery;
+ }
+ else
+ {
+ $target->ipath = $base->ipath;
+ if ($relative->iquery !== null)
+ {
+ $target->iquery = $relative->iquery;
+ }
+ elseif ($base->iquery !== null)
+ {
+ $target->iquery = $base->iquery;
+ }
+ }
+ $target->ifragment = $relative->ifragment;
+ }
+ }
+ else
+ {
+ $target = clone $base;
+ $target->ifragment = null;
+ }
+ $target->scheme_normalization();
+ return $target;
+ }
+ else
+ {
+ return false;
+ }
+ }
+ }
+
+ /**
+ * Parse an IRI into scheme/authority/path/query/fragment segments
+ *
+ * @param string $iri
+ * @return array
+ */
+ protected function parse_iri($iri)
+ {
+ $iri = trim($iri, "\x20\x09\x0A\x0C\x0D");
+ if (preg_match('/^((?P<scheme>[^:\/?#]+):)?(\/\/(?P<authority>[^\/?#]*))?(?P<path>[^?#]*)(\?(?P<query>[^#]*))?(#(?P<fragment>.*))?$/', $iri, $match))
+ {
+ if ($match[1] === '')
+ {
+ $match['scheme'] = null;
+ }
+ if (!isset($match[3]) || $match[3] === '')
+ {
+ $match['authority'] = null;
+ }
+ if (!isset($match[5]))
+ {
+ $match['path'] = '';
+ }
+ if (!isset($match[6]) || $match[6] === '')
+ {
+ $match['query'] = null;
+ }
+ if (!isset($match[8]) || $match[8] === '')
+ {
+ $match['fragment'] = null;
+ }
+ return $match;
+ }
+ else
+ {
+ // This can occur when a paragraph is accidentally parsed as a URI
+ return false;
+ }
+ }
+
+ /**
+ * Remove dot segments from a path
+ *
+ * @param string $input
+ * @return string
+ */
+ protected function remove_dot_segments($input)
+ {
+ $output = '';
+ while (strpos($input, './') !== false || strpos($input, '/.') !== false || $input === '.' || $input === '..')
+ {
+ // A: If the input buffer begins with a prefix of "../" or "./", then remove that prefix from the input buffer; otherwise,
+ if (strpos($input, '../') === 0)
+ {
+ $input = substr($input, 3);
+ }
+ elseif (strpos($input, './') === 0)
+ {
+ $input = substr($input, 2);
+ }
+ // B: if the input buffer begins with a prefix of "/./" or "/.", where "." is a complete path segment, then replace that prefix with "/" in the input buffer; otherwise,
+ elseif (strpos($input, '/./') === 0)
+ {
+ $input = substr($input, 2);
+ }
+ elseif ($input === '/.')
+ {
+ $input = '/';
+ }
+ // C: if the input buffer begins with a prefix of "/../" or "/..", where ".." is a complete path segment, then replace that prefix with "/" in the input buffer and remove the last segment and its preceding "/" (if any) from the output buffer; otherwise,
+ elseif (strpos($input, '/../') === 0)
+ {
+ $input = substr($input, 3);
+ $output = substr_replace($output, '', strrpos($output, '/'));
+ }
+ elseif ($input === '/..')
+ {
+ $input = '/';
+ $output = substr_replace($output, '', strrpos($output, '/'));
+ }
+ // D: if the input buffer consists only of "." or "..", then remove that from the input buffer; otherwise,
+ elseif ($input === '.' || $input === '..')
+ {
+ $input = '';
+ }
+ // E: move the first path segment in the input buffer to the end of the output buffer, including the initial "/" character (if any) and any subsequent characters up to, but not including, the next "/" character or the end of the input buffer
+ elseif (($pos = strpos($input, '/', 1)) !== false)
+ {
+ $output .= substr($input, 0, $pos);
+ $input = substr_replace($input, '', 0, $pos);
+ }
+ else
+ {
+ $output .= $input;
+ $input = '';
+ }
+ }
+ return $output . $input;
+ }
+
+ /**
+ * Replace invalid character with percent encoding
+ *
+ * @param string $string Input string
+ * @param string $extra_chars Valid characters not in iunreserved or
+ * iprivate (this is ASCII-only)
+ * @param bool $iprivate Allow iprivate
+ * @return string
+ */
+ protected function replace_invalid_with_pct_encoding($string, $extra_chars, $iprivate = false)
+ {
+ // Normalize as many pct-encoded sections as possible
+ $string = preg_replace_callback('/(?:%[A-Fa-f0-9]{2})+/', array($this, 'remove_iunreserved_percent_encoded'), $string);
+
+ // Replace invalid percent characters
+ $string = preg_replace('/%(?![A-Fa-f0-9]{2})/', '%25', $string);
+
+ // Add unreserved and % to $extra_chars (the latter is safe because all
+ // pct-encoded sections are now valid).
+ $extra_chars .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~%';
+
+ // Now replace any bytes that aren't allowed with their pct-encoded versions
+ $position = 0;
+ $strlen = strlen($string);
+ while (($position += strspn($string, $extra_chars, $position)) < $strlen)
+ {
+ $value = ord($string[$position]);
+
+ // Start position
+ $start = $position;
+
+ // By default we are valid
+ $valid = true;
+
+ // No one byte sequences are valid due to the while.
+ // Two byte sequence:
+ if (($value & 0xE0) === 0xC0)
+ {
+ $character = ($value & 0x1F) << 6;
+ $length = 2;
+ $remaining = 1;
+ }
+ // Three byte sequence:
+ elseif (($value & 0xF0) === 0xE0)
+ {
+ $character = ($value & 0x0F) << 12;
+ $length = 3;
+ $remaining = 2;
+ }
+ // Four byte sequence:
+ elseif (($value & 0xF8) === 0xF0)
+ {
+ $character = ($value & 0x07) << 18;
+ $length = 4;
+ $remaining = 3;
+ }
+ // Invalid byte:
+ else
+ {
+ $valid = false;
+ $length = 1;
+ $remaining = 0;
+ }
+
+ if ($remaining)
+ {
+ if ($position + $length <= $strlen)
+ {
+ for ($position++; $remaining; $position++)
+ {
+ $value = ord($string[$position]);
+
+ // Check that the byte is valid, then add it to the character:
+ if (($value & 0xC0) === 0x80)
+ {
+ $character |= ($value & 0x3F) << (--$remaining * 6);
+ }
+ // If it is invalid, count the sequence as invalid and reprocess the current byte:
+ else
+ {
+ $valid = false;
+ $position--;
+ break;
+ }
+ }
+ }
+ else
+ {
+ $position = $strlen - 1;
+ $valid = false;
+ }
+ }
+
+ // Percent encode anything invalid or not in ucschar
+ if (
+ // Invalid sequences
+ !$valid
+ // Non-shortest form sequences are invalid
+ || $length > 1 && $character <= 0x7F
+ || $length > 2 && $character <= 0x7FF
+ || $length > 3 && $character <= 0xFFFF
+ // Outside of range of ucschar codepoints
+ // Noncharacters
+ || ($character & 0xFFFE) === 0xFFFE
+ || $character >= 0xFDD0 && $character <= 0xFDEF
+ || (
+ // Everything else not in ucschar
+ $character > 0xD7FF && $character < 0xF900
+ || $character < 0xA0
+ || $character > 0xEFFFD
+ )
+ && (
+ // Everything not in iprivate, if it applies
+ !$iprivate
+ || $character < 0xE000
+ || $character > 0x10FFFD
+ )
+ )
+ {
+ // If we were a character, pretend we weren't, but rather an error.
+ if ($valid)
+ $position--;
+
+ for ($j = $start; $j <= $position; $j++)
+ {
+ $string = substr_replace($string, sprintf('%%%02X', ord($string[$j])), $j, 1);
+ $j += 2;
+ $position += 2;
+ $strlen += 2;
+ }
+ }
+ }
+
+ return $string;
+ }
+
+ /**
+ * Callback function for preg_replace_callback.
+ *
+ * Removes sequences of percent encoded bytes that represent UTF-8
+ * encoded characters in iunreserved
+ *
+ * @param array $match PCRE match
+ * @return string Replacement
+ */
+ protected function remove_iunreserved_percent_encoded($match)
+ {
+ // As we just have valid percent encoded sequences we can just explode
+ // and ignore the first member of the returned array (an empty string).
+ $bytes = explode('%', $match[0]);
+
+ // Initialize the new string (this is what will be returned) and that
+ // there are no bytes remaining in the current sequence (unsurprising
+ // at the first byte!).
+ $string = '';
+ $remaining = 0;
+
+ // Loop over each and every byte, and set $value to its value
+ for ($i = 1, $len = count($bytes); $i < $len; $i++)
+ {
+ $value = hexdec($bytes[$i]);
+
+ // If we're the first byte of sequence:
+ if (!$remaining)
+ {
+ // Start position
+ $start = $i;
+
+ // By default we are valid
+ $valid = true;
+
+ // One byte sequence:
+ if ($value <= 0x7F)
+ {
+ $character = $value;
+ $length = 1;
+ }
+ // Two byte sequence:
+ elseif (($value & 0xE0) === 0xC0)
+ {
+ $character = ($value & 0x1F) << 6;
+ $length = 2;
+ $remaining = 1;
+ }
+ // Three byte sequence:
+ elseif (($value & 0xF0) === 0xE0)
+ {
+ $character = ($value & 0x0F) << 12;
+ $length = 3;
+ $remaining = 2;
+ }
+ // Four byte sequence:
+ elseif (($value & 0xF8) === 0xF0)
+ {
+ $character = ($value & 0x07) << 18;
+ $length = 4;
+ $remaining = 3;
+ }
+ // Invalid byte:
+ else
+ {
+ $valid = false;
+ $remaining = 0;
+ }
+ }
+ // Continuation byte:
+ else
+ {
+ // Check that the byte is valid, then add it to the character:
+ if (($value & 0xC0) === 0x80)
+ {
+ $remaining--;
+ $character |= ($value & 0x3F) << ($remaining * 6);
+ }
+ // If it is invalid, count the sequence as invalid and reprocess the current byte as the start of a sequence:
+ else
+ {
+ $valid = false;
+ $remaining = 0;
+ $i--;
+ }
+ }
+
+ // If we've reached the end of the current byte sequence, append it to Unicode::$data
+ if (!$remaining)
+ {
+ // Percent encode anything invalid or not in iunreserved
+ if (
+ // Invalid sequences
+ !$valid
+ // Non-shortest form sequences are invalid
+ || $length > 1 && $character <= 0x7F
+ || $length > 2 && $character <= 0x7FF
+ || $length > 3 && $character <= 0xFFFF
+ // Outside of range of iunreserved codepoints
+ || $character < 0x2D
+ || $character > 0xEFFFD
+ // Noncharacters
+ || ($character & 0xFFFE) === 0xFFFE
+ || $character >= 0xFDD0 && $character <= 0xFDEF
+ // Everything else not in iunreserved (this is all BMP)
+ || $character === 0x2F
+ || $character > 0x39 && $character < 0x41
+ || $character > 0x5A && $character < 0x61
+ || $character > 0x7A && $character < 0x7E
+ || $character > 0x7E && $character < 0xA0
+ || $character > 0xD7FF && $character < 0xF900
+ )
+ {
+ for ($j = $start; $j <= $i; $j++)
+ {
+ $string .= '%' . strtoupper($bytes[$j]);
+ }
+ }
+ else
+ {
+ for ($j = $start; $j <= $i; $j++)
+ {
+ $string .= chr(hexdec($bytes[$j]));
+ }
+ }
+ }
+ }
+
+ // If we have any bytes left over they are invalid (i.e., we are
+ // mid-way through a multi-byte sequence)
+ if ($remaining)
+ {
+ for ($j = $start; $j < $len; $j++)
+ {
+ $string .= '%' . strtoupper($bytes[$j]);
+ }
+ }
+
+ return $string;
+ }
+
+ protected function scheme_normalization()
+ {
+ if (isset($this->normalization[$this->scheme]['iuserinfo']) && $this->iuserinfo === $this->normalization[$this->scheme]['iuserinfo'])
+ {
+ $this->iuserinfo = null;
+ }
+ if (isset($this->normalization[$this->scheme]['ihost']) && $this->ihost === $this->normalization[$this->scheme]['ihost'])
+ {
+ $this->ihost = null;
+ }
+ if (isset($this->normalization[$this->scheme]['port']) && $this->port === $this->normalization[$this->scheme]['port'])
+ {
+ $this->port = null;
+ }
+ if (isset($this->normalization[$this->scheme]['ipath']) && $this->ipath === $this->normalization[$this->scheme]['ipath'])
+ {
+ $this->ipath = '';
+ }
+ if (isset($this->normalization[$this->scheme]['iquery']) && $this->iquery === $this->normalization[$this->scheme]['iquery'])
+ {
+ $this->iquery = null;
+ }
+ if (isset($this->normalization[$this->scheme]['ifragment']) && $this->ifragment === $this->normalization[$this->scheme]['ifragment'])
+ {
+ $this->ifragment = null;
+ }
+ }
+
+ /**
+ * Check if the object represents a valid IRI. This needs to be done on each
+ * call as some things change depending on another part of the IRI.
+ *
+ * @return bool
+ */
+ public function is_valid()
+ {
+ if ($this->ipath === '') return true;
+
+ $isauthority = $this->iuserinfo !== null || $this->ihost !== null ||
+ $this->port !== null;
+ if ($isauthority && $this->ipath[0] === '/') return true;
+
+ if (!$isauthority && (substr($this->ipath, 0, 2) === '//')) return false;
+
+ // Relative urls cannot have a colon in the first path segment (and the
+ // slashes themselves are not included so skip the first character).
+ if (!$this->scheme && !$isauthority &&
+ strpos($this->ipath, ':') !== false &&
+ strpos($this->ipath, '/', 1) !== false &&
+ strpos($this->ipath, ':') < strpos($this->ipath, '/', 1)) return false;
+
+ return true;
+ }
+
+ /**
+ * Set the entire IRI. Returns true on success, false on failure (if there
+ * are any invalid characters).
+ *
+ * @param string $iri
+ * @return bool
+ */
+ public function set_iri($iri, $clear_cache = false)
+ {
+ static $cache;
+ if ($clear_cache)
+ {
+ $cache = null;
+ return;
+ }
+ if (!$cache)
+ {
+ $cache = array();
+ }
+
+ if ($iri === null)
+ {
+ return true;
+ }
+ elseif (isset($cache[$iri]))
+ {
+ list($this->scheme,
+ $this->iuserinfo,
+ $this->ihost,
+ $this->port,
+ $this->ipath,
+ $this->iquery,
+ $this->ifragment,
+ $return) = $cache[$iri];
+ return $return;
+ }
+ else
+ {
+ $parsed = $this->parse_iri((string) $iri);
+ if (!$parsed)
+ {
+ return false;
+ }
+
+ $return = $this->set_scheme($parsed['scheme'])
+ && $this->set_authority($parsed['authority'])
+ && $this->set_path($parsed['path'])
+ && $this->set_query($parsed['query'])
+ && $this->set_fragment($parsed['fragment']);
+
+ $cache[$iri] = array($this->scheme,
+ $this->iuserinfo,
+ $this->ihost,
+ $this->port,
+ $this->ipath,
+ $this->iquery,
+ $this->ifragment,
+ $return);
+ return $return;
+ }
+ }
+
+ /**
+ * Set the scheme. Returns true on success, false on failure (if there are
+ * any invalid characters).
+ *
+ * @param string $scheme
+ * @return bool
+ */
+ public function set_scheme($scheme)
+ {
+ if ($scheme === null)
+ {
+ $this->scheme = null;
+ }
+ elseif (!preg_match('/^[A-Za-z][0-9A-Za-z+\-.]*$/', $scheme))
+ {
+ $this->scheme = null;
+ return false;
+ }
+ else
+ {
+ $this->scheme = strtolower($scheme);
+ }
+ return true;
+ }
+
+ /**
+ * Set the authority. Returns true on success, false on failure (if there are
+ * any invalid characters).
+ *
+ * @param string $authority
+ * @return bool
+ */
+ public function set_authority($authority, $clear_cache = false)
+ {
+ static $cache;
+ if ($clear_cache)
+ {
+ $cache = null;
+ return;
+ }
+ if (!$cache)
+ $cache = array();
+
+ if ($authority === null)
+ {
+ $this->iuserinfo = null;
+ $this->ihost = null;
+ $this->port = null;
+ return true;
+ }
+ elseif (isset($cache[$authority]))
+ {
+ list($this->iuserinfo,
+ $this->ihost,
+ $this->port,
+ $return) = $cache[$authority];
+
+ return $return;
+ }
+ else
+ {
+ $remaining = $authority;
+ if (($iuserinfo_end = strrpos($remaining, '@')) !== false)
+ {
+ $iuserinfo = substr($remaining, 0, $iuserinfo_end);
+ $remaining = substr($remaining, $iuserinfo_end + 1);
+ }
+ else
+ {
+ $iuserinfo = null;
+ }
+ if (($port_start = strpos($remaining, ':', strpos($remaining, ']'))) !== false)
+ {
+ if (($port = substr($remaining, $port_start + 1)) === false)
+ {
+ $port = null;
+ }
+ $remaining = substr($remaining, 0, $port_start);
+ }
+ else
+ {
+ $port = null;
+ }
+
+ $return = $this->set_userinfo($iuserinfo) &&
+ $this->set_host($remaining) &&
+ $this->set_port($port);
+
+ $cache[$authority] = array($this->iuserinfo,
+ $this->ihost,
+ $this->port,
+ $return);
+
+ return $return;
+ }
+ }
+
+ /**
+ * Set the iuserinfo.
+ *
+ * @param string $iuserinfo
+ * @return bool
+ */
+ public function set_userinfo($iuserinfo)
+ {
+ if ($iuserinfo === null)
+ {
+ $this->iuserinfo = null;
+ }
+ else
+ {
+ $this->iuserinfo = $this->replace_invalid_with_pct_encoding($iuserinfo, '!$&\'()*+,;=:');
+ $this->scheme_normalization();
+ }
+
+ return true;
+ }
+
+ /**
+ * Set the ihost. Returns true on success, false on failure (if there are
+ * any invalid characters).
+ *
+ * @param string $ihost
+ * @return bool
+ */
+ public function set_host($ihost)
+ {
+ if ($ihost === null)
+ {
+ $this->ihost = null;
+ return true;
+ }
+ elseif (substr($ihost, 0, 1) === '[' && substr($ihost, -1) === ']')
+ {
+ if (SimplePie_Net_IPv6::check_ipv6(substr($ihost, 1, -1)))
+ {
+ $this->ihost = '[' . SimplePie_Net_IPv6::compress(substr($ihost, 1, -1)) . ']';
+ }
+ else
+ {
+ $this->ihost = null;
+ return false;
+ }
+ }
+ else
+ {
+ $ihost = $this->replace_invalid_with_pct_encoding($ihost, '!$&\'()*+,;=');
+
+ // Lowercase, but ignore pct-encoded sections (as they should
+ // remain uppercase). This must be done after the previous step
+ // as that can add unescaped characters.
+ $position = 0;
+ $strlen = strlen($ihost);
+ while (($position += strcspn($ihost, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ%', $position)) < $strlen)
+ {
+ if ($ihost[$position] === '%')
+ {
+ $position += 3;
+ }
+ else
+ {
+ $ihost[$position] = strtolower($ihost[$position]);
+ $position++;
+ }
+ }
+
+ $this->ihost = $ihost;
+ }
+
+ $this->scheme_normalization();
+
+ return true;
+ }
+
+ /**
+ * Set the port. Returns true on success, false on failure (if there are
+ * any invalid characters).
+ *
+ * @param string $port
+ * @return bool
+ */
+ public function set_port($port)
+ {
+ if ($port === null)
+ {
+ $this->port = null;
+ return true;
+ }
+ elseif (strspn($port, '0123456789') === strlen($port))
+ {
+ $this->port = (int) $port;
+ $this->scheme_normalization();
+ return true;
+ }
+ else
+ {
+ $this->port = null;
+ return false;
+ }
+ }
+
+ /**
+ * Set the ipath.
+ *
+ * @param string $ipath
+ * @return bool
+ */
+ public function set_path($ipath, $clear_cache = false)
+ {
+ static $cache;
+ if ($clear_cache)
+ {
+ $cache = null;
+ return;
+ }
+ if (!$cache)
+ {
+ $cache = array();
+ }
+
+ $ipath = (string) $ipath;
+
+ if (isset($cache[$ipath]))
+ {
+ $this->ipath = $cache[$ipath][(int) ($this->scheme !== null)];
+ }
+ else
+ {
+ $valid = $this->replace_invalid_with_pct_encoding($ipath, '!$&\'()*+,;=@:/');
+ $removed = $this->remove_dot_segments($valid);
+
+ $cache[$ipath] = array($valid, $removed);
+ $this->ipath = ($this->scheme !== null) ? $removed : $valid;
+ }
+
+ $this->scheme_normalization();
+ return true;
+ }
+
+ /**
+ * Set the iquery.
+ *
+ * @param string $iquery
+ * @return bool
+ */
+ public function set_query($iquery)
+ {
+ if ($iquery === null)
+ {
+ $this->iquery = null;
+ }
+ else
+ {
+ $this->iquery = $this->replace_invalid_with_pct_encoding($iquery, '!$&\'()*+,;=:@/?', true);
+ $this->scheme_normalization();
+ }
+ return true;
+ }
+
+ /**
+ * Set the ifragment.
+ *
+ * @param string $ifragment
+ * @return bool
+ */
+ public function set_fragment($ifragment)
+ {
+ if ($ifragment === null)
+ {
+ $this->ifragment = null;
+ }
+ else
+ {
+ $this->ifragment = $this->replace_invalid_with_pct_encoding($ifragment, '!$&\'()*+,;=:@/?');
+ $this->scheme_normalization();
+ }
+ return true;
+ }
+
+ /**
+ * Convert an IRI to a URI (or parts thereof)
+ *
+ * @return string
+ */
+ public function to_uri($string)
+ {
+ static $non_ascii;
+ if (!$non_ascii)
+ {
+ $non_ascii = implode('', range("\x80", "\xFF"));
+ }
+
+ $position = 0;
+ $strlen = strlen($string);
+ while (($position += strcspn($string, $non_ascii, $position)) < $strlen)
+ {
+ $string = substr_replace($string, sprintf('%%%02X', ord($string[$position])), $position, 1);
+ $position += 3;
+ $strlen += 2;
+ }
+
+ return $string;
+ }
+
+ /**
+ * Get the complete IRI
+ *
+ * @return string
+ */
+ public function get_iri()
+ {
+ if (!$this->is_valid())
+ {
+ return false;
+ }
+
+ $iri = '';
+ if ($this->scheme !== null)
+ {
+ $iri .= $this->scheme . ':';
+ }
+ if (($iauthority = $this->get_iauthority()) !== null)
+ {
+ $iri .= '//' . $iauthority;
+ }
+ if ($this->ipath !== '')
+ {
+ $iri .= $this->ipath;
+ }
+ elseif (!empty($this->normalization[$this->scheme]['ipath']) && $iauthority !== null && $iauthority !== '')
+ {
+ $iri .= $this->normalization[$this->scheme]['ipath'];
+ }
+ if ($this->iquery !== null)
+ {
+ $iri .= '?' . $this->iquery;
+ }
+ if ($this->ifragment !== null)
+ {
+ $iri .= '#' . $this->ifragment;
+ }
+
+ return $iri;
+ }
+
+ /**
+ * Get the complete URI
+ *
+ * @return string
+ */
+ public function get_uri()
+ {
+ return $this->to_uri($this->get_iri());
+ }
+
+ /**
+ * Get the complete iauthority
+ *
+ * @return string
+ */
+ protected function get_iauthority()
+ {
+ if ($this->iuserinfo !== null || $this->ihost !== null || $this->port !== null)
+ {
+ $iauthority = '';
+ if ($this->iuserinfo !== null)
+ {
+ $iauthority .= $this->iuserinfo . '@';
+ }
+ if ($this->ihost !== null)
+ {
+ $iauthority .= $this->ihost;
+ }
+ if ($this->port !== null)
+ {
+ $iauthority .= ':' . $this->port;
+ }
+ return $iauthority;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get the complete authority
+ *
+ * @return string
+ */
+ protected function get_authority()
+ {
+ $iauthority = $this->get_iauthority();
+ if (is_string($iauthority))
+ return $this->to_uri($iauthority);
+ else
+ return $iauthority;
+ }
+}
diff --git a/vendor/simplepie/simplepie/library/SimplePie/Item.php b/vendor/simplepie/simplepie/library/SimplePie/Item.php
new file mode 100644
index 000000000..00f4179bf
--- /dev/null
+++ b/vendor/simplepie/simplepie/library/SimplePie/Item.php
@@ -0,0 +1,3009 @@
+<?php
+/**
+ * SimplePie
+ *
+ * A PHP-Based RSS and Atom Feed Framework.
+ * Takes the hard work out of managing a complete RSS/Atom solution.
+ *
+ * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * * Neither the name of the SimplePie Team nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
+ * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @package SimplePie
+ * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @author Ryan Parman
+ * @author Geoffrey Sneddon
+ * @author Ryan McCue
+ * @link http://simplepie.org/ SimplePie
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ */
+
+
+/**
+ * Manages all item-related data
+ *
+ * Used by {@see SimplePie::get_item()} and {@see SimplePie::get_items()}
+ *
+ * This class can be overloaded with {@see SimplePie::set_item_class()}
+ *
+ * @package SimplePie
+ * @subpackage API
+ */
+class SimplePie_Item
+{
+ /**
+ * Parent feed
+ *
+ * @access private
+ * @var SimplePie
+ */
+ var $feed;
+
+ /**
+ * Raw data
+ *
+ * @access private
+ * @var array
+ */
+ var $data = array();
+
+ /**
+ * Registry object
+ *
+ * @see set_registry
+ * @var SimplePie_Registry
+ */
+ protected $registry;
+
+ /**
+ * Create a new item object
+ *
+ * This is usually used by {@see SimplePie::get_items} and
+ * {@see SimplePie::get_item}. Avoid creating this manually.
+ *
+ * @param SimplePie $feed Parent feed
+ * @param array $data Raw data
+ */
+ public function __construct($feed, $data)
+ {
+ $this->feed = $feed;
+ $this->data = $data;
+ }
+
+ /**
+ * Set the registry handler
+ *
+ * This is usually used by {@see SimplePie_Registry::create}
+ *
+ * @since 1.3
+ * @param SimplePie_Registry $registry
+ */
+ public function set_registry(SimplePie_Registry $registry)
+ {
+ $this->registry = $registry;
+ }
+
+ /**
+ * Get a string representation of the item
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return md5(serialize($this->data));
+ }
+
+ /**
+ * Remove items that link back to this before destroying this object
+ */
+ public function __destruct()
+ {
+ if ((version_compare(PHP_VERSION, '5.3', '<') || !gc_enabled()) && !ini_get('zend.ze1_compatibility_mode'))
+ {
+ unset($this->feed);
+ }
+ }
+
+ /**
+ * Get data for an item-level element
+ *
+ * This method allows you to get access to ANY element/attribute that is a
+ * sub-element of the item/entry tag.
+ *
+ * See {@see SimplePie::get_feed_tags()} for a description of the return value
+ *
+ * @since 1.0
+ * @see http://simplepie.org/wiki/faq/supported_xml_namespaces
+ * @param string $namespace The URL of the XML namespace of the elements you're trying to access
+ * @param string $tag Tag name
+ * @return array
+ */
+ public function get_item_tags($namespace, $tag)
+ {
+ if (isset($this->data['child'][$namespace][$tag]))
+ {
+ return $this->data['child'][$namespace][$tag];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get the base URL value from the parent feed
+ *
+ * Uses `<xml:base>`
+ *
+ * @param array $element
+ * @return string
+ */
+ public function get_base($element = array())
+ {
+ return $this->feed->get_base($element);
+ }
+
+ /**
+ * Sanitize feed data
+ *
+ * @access private
+ * @see SimplePie::sanitize()
+ * @param string $data Data to sanitize
+ * @param int $type One of the SIMPLEPIE_CONSTRUCT_* constants
+ * @param string $base Base URL to resolve URLs against
+ * @return string Sanitized data
+ */
+ public function sanitize($data, $type, $base = '')
+ {
+ return $this->feed->sanitize($data, $type, $base);
+ }
+
+ /**
+ * Get the parent feed
+ *
+ * Note: this may not work as you think for multifeeds!
+ *
+ * @link http://simplepie.org/faq/typical_multifeed_gotchas#missing_data_from_feed
+ * @since 1.0
+ * @return SimplePie
+ */
+ public function get_feed()
+ {
+ return $this->feed;
+ }
+
+ /**
+ * Get the unique identifier for the item
+ *
+ * This is usually used when writing code to check for new items in a feed.
+ *
+ * Uses `<atom:id>`, `<guid>`, `<dc:identifier>` or the `about` attribute
+ * for RDF. If none of these are supplied (or `$hash` is true), creates an
+ * MD5 hash based on the permalink, title and content.
+ *
+ * @since Beta 2
+ * @param boolean $hash Should we force using a hash instead of the supplied ID?
+ * @param string|false $fn User-supplied function to generate an hash
+ * @return string|null
+ */
+ public function get_id($hash = false, $fn = 'md5')
+ {
+ if (!$hash)
+ {
+ if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'id'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'id'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'guid'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'identifier'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'identifier'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif (isset($this->data['attribs'][SIMPLEPIE_NAMESPACE_RDF]['about']))
+ {
+ return $this->sanitize($this->data['attribs'][SIMPLEPIE_NAMESPACE_RDF]['about'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ }
+ if ($fn === false)
+ {
+ return null;
+ }
+ elseif (!is_callable($fn))
+ {
+ trigger_error('User-supplied function $fn must be callable', E_USER_WARNING);
+ $fn = 'md5';
+ }
+ return call_user_func($fn,
+ $this->get_permalink().$this->get_title().$this->get_content());
+ }
+
+ /**
+ * Get the title of the item
+ *
+ * Uses `<atom:title>`, `<title>` or `<dc:title>`
+ *
+ * @since Beta 2 (previously called `get_item_title` since 0.8)
+ * @return string|null
+ */
+ public function get_title()
+ {
+ if (!isset($this->data['title']))
+ {
+ if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'title'))
+ {
+ $this->data['title'] = $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'title'))
+ {
+ $this->data['title'] = $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'title'))
+ {
+ $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'title'))
+ {
+ $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'title'))
+ {
+ $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'title'))
+ {
+ $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'title'))
+ {
+ $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $this->data['title'] = null;
+ }
+ }
+ return $this->data['title'];
+ }
+
+ /**
+ * Get the content for the item
+ *
+ * Prefers summaries over full content , but will return full content if a
+ * summary does not exist.
+ *
+ * To prefer full content instead, use {@see get_content}
+ *
+ * Uses `<atom:summary>`, `<description>`, `<dc:description>` or
+ * `<itunes:subtitle>`
+ *
+ * @since 0.8
+ * @param boolean $description_only Should we avoid falling back to the content?
+ * @return string|null
+ */
+ public function get_description($description_only = false)
+ {
+ if (($tags = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'summary')) &&
+ ($return = $this->sanitize($tags[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($tags[0]['attribs'])), $this->get_base($tags[0]))))
+ {
+ return $return;
+ }
+ elseif (($tags = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'summary')) &&
+ ($return = $this->sanitize($tags[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($tags[0]['attribs'])), $this->get_base($tags[0]))))
+ {
+ return $return;
+ }
+ elseif (($tags = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'description')) &&
+ ($return = $this->sanitize($tags[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($tags[0]))))
+ {
+ return $return;
+ }
+ elseif (($tags = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'description')) &&
+ ($return = $this->sanitize($tags[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($tags[0]))))
+ {
+ return $return;
+ }
+ elseif (($tags = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'description')) &&
+ ($return = $this->sanitize($tags[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT)))
+ {
+ return $return;
+ }
+ elseif (($tags = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'description')) &&
+ ($return = $this->sanitize($tags[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT)))
+ {
+ return $return;
+ }
+ elseif (($tags = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'summary')) &&
+ ($return = $this->sanitize($tags[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($tags[0]))))
+ {
+ return $return;
+ }
+ elseif (($tags = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'subtitle')) &&
+ ($return = $this->sanitize($tags[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT)))
+ {
+ return $return;
+ }
+ elseif (($tags = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'description')) &&
+ ($return = $this->sanitize($tags[0]['data'], SIMPLEPIE_CONSTRUCT_HTML)))
+ {
+ return $return;
+ }
+
+ elseif (!$description_only)
+ {
+ return $this->get_content(true);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get the content for the item
+ *
+ * Prefers full content over summaries, but will return a summary if full
+ * content does not exist.
+ *
+ * To prefer summaries instead, use {@see get_description}
+ *
+ * Uses `<atom:content>` or `<content:encoded>` (RSS 1.0 Content Module)
+ *
+ * @since 1.0
+ * @param boolean $content_only Should we avoid falling back to the description?
+ * @return string|null
+ */
+ public function get_content($content_only = false)
+ {
+ if (($tags = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'content')) &&
+ ($return = $this->sanitize($tags[0]['data'], $this->registry->call('Misc', 'atom_10_content_construct_type', array($tags[0]['attribs'])), $this->get_base($tags[0]))))
+ {
+ return $return;
+ }
+ elseif (($tags = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'content')) &&
+ ($return = $this->sanitize($tags[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($tags[0]['attribs'])), $this->get_base($tags[0]))))
+ {
+ return $return;
+ }
+ elseif (($tags = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10_MODULES_CONTENT, 'encoded')) &&
+ ($return = $this->sanitize($tags[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($tags[0]))))
+ {
+ return $return;
+ }
+ elseif (!$content_only)
+ {
+ return $this->get_description(true);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get the media:thumbnail of the item
+ *
+ * Uses `<media:thumbnail>`
+ *
+ *
+ * @return array|null
+ */
+ public function get_thumbnail()
+ {
+ if (!isset($this->data['thumbnail']))
+ {
+ if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'thumbnail'))
+ {
+ $this->data['thumbnail'] = $return[0]['attribs'][''];
+ }
+ else
+ {
+ $this->data['thumbnail'] = null;
+ }
+ }
+ return $this->data['thumbnail'];
+ }
+
+ /**
+ * Get a category for the item
+ *
+ * @since Beta 3 (previously called `get_categories()` since Beta 2)
+ * @param int $key The category that you want to return. Remember that arrays begin with 0, not 1
+ * @return SimplePie_Category|null
+ */
+ public function get_category($key = 0)
+ {
+ $categories = $this->get_categories();
+ if (isset($categories[$key]))
+ {
+ return $categories[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get all categories for the item
+ *
+ * Uses `<atom:category>`, `<category>` or `<dc:subject>`
+ *
+ * @since Beta 3
+ * @return SimplePie_Category[]|null List of {@see SimplePie_Category} objects
+ */
+ public function get_categories()
+ {
+ $categories = array();
+
+ $type = 'category';
+ foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, $type) as $category)
+ {
+ $term = null;
+ $scheme = null;
+ $label = null;
+ if (isset($category['attribs']['']['term']))
+ {
+ $term = $this->sanitize($category['attribs']['']['term'], SIMPLEPIE_CONSTRUCT_HTML);
+ }
+ if (isset($category['attribs']['']['scheme']))
+ {
+ $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_HTML);
+ }
+ if (isset($category['attribs']['']['label']))
+ {
+ $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_HTML);
+ }
+ $categories[] = $this->registry->create('Category', array($term, $scheme, $label, $type));
+ }
+ foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, $type) as $category)
+ {
+ // This is really the label, but keep this as the term also for BC.
+ // Label will also work on retrieving because that falls back to term.
+ $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_HTML);
+ if (isset($category['attribs']['']['domain']))
+ {
+ $scheme = $this->sanitize($category['attribs']['']['domain'], SIMPLEPIE_CONSTRUCT_HTML);
+ }
+ else
+ {
+ $scheme = null;
+ }
+ $categories[] = $this->registry->create('Category', array($term, $scheme, null, $type));
+ }
+
+ $type = 'subject';
+ foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, $type) as $category)
+ {
+ $categories[] = $this->registry->create('Category', array($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_HTML), null, null, $type));
+ }
+ foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, $type) as $category)
+ {
+ $categories[] = $this->registry->create('Category', array($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_HTML), null, null, $type));
+ }
+
+ if (!empty($categories))
+ {
+ return array_unique($categories);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get an author for the item
+ *
+ * @since Beta 2
+ * @param int $key The author that you want to return. Remember that arrays begin with 0, not 1
+ * @return SimplePie_Author|null
+ */
+ public function get_author($key = 0)
+ {
+ $authors = $this->get_authors();
+ if (isset($authors[$key]))
+ {
+ return $authors[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get a contributor for the item
+ *
+ * @since 1.1
+ * @param int $key The contrbutor that you want to return. Remember that arrays begin with 0, not 1
+ * @return SimplePie_Author|null
+ */
+ public function get_contributor($key = 0)
+ {
+ $contributors = $this->get_contributors();
+ if (isset($contributors[$key]))
+ {
+ return $contributors[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get all contributors for the item
+ *
+ * Uses `<atom:contributor>`
+ *
+ * @since 1.1
+ * @return array|null List of {@see SimplePie_Author} objects
+ */
+ public function get_contributors()
+ {
+ $contributors = array();
+ foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'contributor') as $contributor)
+ {
+ $name = null;
+ $uri = null;
+ $email = null;
+ if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data']))
+ {
+ $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data']))
+ {
+ $uri = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]));
+ }
+ if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data']))
+ {
+ $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if ($name !== null || $email !== null || $uri !== null)
+ {
+ $contributors[] = $this->registry->create('Author', array($name, $uri, $email));
+ }
+ }
+ foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'contributor') as $contributor)
+ {
+ $name = null;
+ $url = null;
+ $email = null;
+ if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data']))
+ {
+ $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data']))
+ {
+ $url = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]));
+ }
+ if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data']))
+ {
+ $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if ($name !== null || $email !== null || $url !== null)
+ {
+ $contributors[] = $this->registry->create('Author', array($name, $url, $email));
+ }
+ }
+
+ if (!empty($contributors))
+ {
+ return array_unique($contributors);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get all authors for the item
+ *
+ * Uses `<atom:author>`, `<author>`, `<dc:creator>` or `<itunes:author>`
+ *
+ * @since Beta 2
+ * @return array|null List of {@see SimplePie_Author} objects
+ */
+ public function get_authors()
+ {
+ $authors = array();
+ foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'author') as $author)
+ {
+ $name = null;
+ $uri = null;
+ $email = null;
+ if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data']))
+ {
+ $name = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_HTML);
+ }
+ if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data']))
+ {
+ $uri = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]));
+ }
+ if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data']))
+ {
+ $email = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_HTML);
+ }
+ if ($name !== null || $email !== null || $uri !== null)
+ {
+ $authors[] = $this->registry->create('Author', array($name, $uri, $email));
+ }
+ }
+ if ($author = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'author'))
+ {
+ $name = null;
+ $url = null;
+ $email = null;
+ if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data']))
+ {
+ $name = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_HTML);
+ }
+ if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data']))
+ {
+ $url = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]));
+ }
+ if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data']))
+ {
+ $email = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_HTML);
+ }
+ if ($name !== null || $email !== null || $url !== null)
+ {
+ $authors[] = $this->registry->create('Author', array($name, $url, $email));
+ }
+ }
+ if ($author = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'author'))
+ {
+ $authors[] = $this->registry->create('Author', array(null, null, $this->sanitize($author[0]['data'], SIMPLEPIE_CONSTRUCT_HTML)));
+ }
+ foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'creator') as $author)
+ {
+ $authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_HTML), null, null));
+ }
+ foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'creator') as $author)
+ {
+ $authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_HTML), null, null));
+ }
+ foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'author') as $author)
+ {
+ $authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_HTML), null, null));
+ }
+
+ if (!empty($authors))
+ {
+ return array_unique($authors);
+ }
+ elseif (($source = $this->get_source()) && ($authors = $source->get_authors()))
+ {
+ return $authors;
+ }
+ elseif ($authors = $this->feed->get_authors())
+ {
+ return $authors;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get the copyright info for the item
+ *
+ * Uses `<atom:rights>` or `<dc:rights>`
+ *
+ * @since 1.1
+ * @return string
+ */
+ public function get_copyright()
+ {
+ if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'rights'))
+ {
+ return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'rights'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'rights'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get the posting date/time for the item
+ *
+ * Uses `<atom:published>`, `<atom:updated>`, `<atom:issued>`,
+ * `<atom:modified>`, `<pubDate>` or `<dc:date>`
+ *
+ * Note: obeys PHP's timezone setting. To get a UTC date/time, use
+ * {@see get_gmdate}
+ *
+ * @since Beta 2 (previously called `get_item_date` since 0.8)
+ *
+ * @param string $date_format Supports any PHP date format from {@see http://php.net/date} (empty for the raw data)
+ * @return int|string|null
+ */
+ public function get_date($date_format = 'j F Y, g:i a')
+ {
+ if (!isset($this->data['date']))
+ {
+ if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'published'))
+ {
+ $this->data['date']['raw'] = $return[0]['data'];
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'pubDate'))
+ {
+ $this->data['date']['raw'] = $return[0]['data'];
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'date'))
+ {
+ $this->data['date']['raw'] = $return[0]['data'];
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'date'))
+ {
+ $this->data['date']['raw'] = $return[0]['data'];
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'updated'))
+ {
+ $this->data['date']['raw'] = $return[0]['data'];
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'issued'))
+ {
+ $this->data['date']['raw'] = $return[0]['data'];
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'created'))
+ {
+ $this->data['date']['raw'] = $return[0]['data'];
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'modified'))
+ {
+ $this->data['date']['raw'] = $return[0]['data'];
+ }
+
+ if (!empty($this->data['date']['raw']))
+ {
+ $parser = $this->registry->call('Parse_Date', 'get');
+ $this->data['date']['parsed'] = $parser->parse($this->data['date']['raw']);
+ }
+ else
+ {
+ $this->data['date'] = null;
+ }
+ }
+ if ($this->data['date'])
+ {
+ $date_format = (string) $date_format;
+ switch ($date_format)
+ {
+ case '':
+ return $this->sanitize($this->data['date']['raw'], SIMPLEPIE_CONSTRUCT_TEXT);
+
+ case 'U':
+ return $this->data['date']['parsed'];
+
+ default:
+ return date($date_format, $this->data['date']['parsed']);
+ }
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get the update date/time for the item
+ *
+ * Uses `<atom:updated>`
+ *
+ * Note: obeys PHP's timezone setting. To get a UTC date/time, use
+ * {@see get_gmdate}
+ *
+ * @param string $date_format Supports any PHP date format from {@see http://php.net/date} (empty for the raw data)
+ * @return int|string|null
+ */
+ public function get_updated_date($date_format = 'j F Y, g:i a')
+ {
+ if (!isset($this->data['updated']))
+ {
+ if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'updated'))
+ {
+ $this->data['updated']['raw'] = $return[0]['data'];
+ }
+
+ if (!empty($this->data['updated']['raw']))
+ {
+ $parser = $this->registry->call('Parse_Date', 'get');
+ $this->data['updated']['parsed'] = $parser->parse($this->data['updated']['raw']);
+ }
+ else
+ {
+ $this->data['updated'] = null;
+ }
+ }
+ if ($this->data['updated'])
+ {
+ $date_format = (string) $date_format;
+ switch ($date_format)
+ {
+ case '':
+ return $this->sanitize($this->data['updated']['raw'], SIMPLEPIE_CONSTRUCT_TEXT);
+
+ case 'U':
+ return $this->data['updated']['parsed'];
+
+ default:
+ return date($date_format, $this->data['updated']['parsed']);
+ }
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get the localized posting date/time for the item
+ *
+ * Returns the date formatted in the localized language. To display in
+ * languages other than the server's default, you need to change the locale
+ * with {@link http://php.net/setlocale setlocale()}. The available
+ * localizations depend on which ones are installed on your web server.
+ *
+ * @since 1.0
+ *
+ * @param string $date_format Supports any PHP date format from {@see http://php.net/strftime} (empty for the raw data)
+ * @return int|string|null
+ */
+ public function get_local_date($date_format = '%c')
+ {
+ if (!$date_format)
+ {
+ return $this->sanitize($this->get_date(''), SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif (($date = $this->get_date('U')) !== null && $date !== false)
+ {
+ return strftime($date_format, $date);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get the posting date/time for the item (UTC time)
+ *
+ * @see get_date
+ * @param string $date_format Supports any PHP date format from {@see http://php.net/date}
+ * @return int|string|null
+ */
+ public function get_gmdate($date_format = 'j F Y, g:i a')
+ {
+ $date = $this->get_date('U');
+ if ($date === null)
+ {
+ return null;
+ }
+
+ return gmdate($date_format, $date);
+ }
+
+ /**
+ * Get the update date/time for the item (UTC time)
+ *
+ * @see get_updated_date
+ * @param string $date_format Supports any PHP date format from {@see http://php.net/date}
+ * @return int|string|null
+ */
+ public function get_updated_gmdate($date_format = 'j F Y, g:i a')
+ {
+ $date = $this->get_updated_date('U');
+ if ($date === null)
+ {
+ return null;
+ }
+
+ return gmdate($date_format, $date);
+ }
+
+ /**
+ * Get the permalink for the item
+ *
+ * Returns the first link available with a relationship of "alternate".
+ * Identical to {@see get_link()} with key 0
+ *
+ * @see get_link
+ * @since 0.8
+ * @return string|null Permalink URL
+ */
+ public function get_permalink()
+ {
+ $link = $this->get_link();
+ $enclosure = $this->get_enclosure(0);
+ if ($link !== null)
+ {
+ return $link;
+ }
+ elseif ($enclosure !== null)
+ {
+ return $enclosure->get_link();
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get a single link for the item
+ *
+ * @since Beta 3
+ * @param int $key The link that you want to return. Remember that arrays begin with 0, not 1
+ * @param string $rel The relationship of the link to return
+ * @return string|null Link URL
+ */
+ public function get_link($key = 0, $rel = 'alternate')
+ {
+ $links = $this->get_links($rel);
+ if ($links[$key] !== null)
+ {
+ return $links[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get all links for the item
+ *
+ * Uses `<atom:link>`, `<link>` or `<guid>`
+ *
+ * @since Beta 2
+ * @param string $rel The relationship of links to return
+ * @return array|null Links found for the item (strings)
+ */
+ public function get_links($rel = 'alternate')
+ {
+ if (!isset($this->data['links']))
+ {
+ $this->data['links'] = array();
+ foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'link') as $link)
+ {
+ if (isset($link['attribs']['']['href']))
+ {
+ $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate';
+ $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));
+
+ }
+ }
+ foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'link') as $link)
+ {
+ if (isset($link['attribs']['']['href']))
+ {
+ $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate';
+ $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));
+ }
+ }
+ if ($links = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'link'))
+ {
+ $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
+ }
+ if ($links = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'link'))
+ {
+ $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
+ }
+ if ($links = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'link'))
+ {
+ $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
+ }
+ if ($links = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'guid'))
+ {
+ if (!isset($links[0]['attribs']['']['isPermaLink']) || strtolower(trim($links[0]['attribs']['']['isPermaLink'])) === 'true')
+ {
+ $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
+ }
+ }
+
+ $keys = array_keys($this->data['links']);
+ foreach ($keys as $key)
+ {
+ if ($this->registry->call('Misc', 'is_isegment_nz_nc', array($key)))
+ {
+ if (isset($this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]))
+ {
+ $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] = array_merge($this->data['links'][$key], $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]);
+ $this->data['links'][$key] =& $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key];
+ }
+ else
+ {
+ $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] =& $this->data['links'][$key];
+ }
+ }
+ elseif (substr($key, 0, 41) === SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY)
+ {
+ $this->data['links'][substr($key, 41)] =& $this->data['links'][$key];
+ }
+ $this->data['links'][$key] = array_unique($this->data['links'][$key]);
+ }
+ }
+ if (isset($this->data['links'][$rel]))
+ {
+ return $this->data['links'][$rel];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get an enclosure from the item
+ *
+ * Supports the <enclosure> RSS tag, as well as Media RSS and iTunes RSS.
+ *
+ * @since Beta 2
+ * @todo Add ability to prefer one type of content over another (in a media group).
+ * @param int $key The enclosure that you want to return. Remember that arrays begin with 0, not 1
+ * @return SimplePie_Enclosure|null
+ */
+ public function get_enclosure($key = 0, $prefer = null)
+ {
+ $enclosures = $this->get_enclosures();
+ if (isset($enclosures[$key]))
+ {
+ return $enclosures[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get all available enclosures (podcasts, etc.)
+ *
+ * Supports the <enclosure> RSS tag, as well as Media RSS and iTunes RSS.
+ *
+ * At this point, we're pretty much assuming that all enclosures for an item
+ * are the same content. Anything else is too complicated to
+ * properly support.
+ *
+ * @since Beta 2
+ * @todo Add support for end-user defined sorting of enclosures by type/handler (so we can prefer the faster-loading FLV over MP4).
+ * @todo If an element exists at a level, but its value is empty, we should fall back to the value from the parent (if it exists).
+ * @return SimplePie_Enclosure[]|null List of SimplePie_Enclosure items
+ */
+ public function get_enclosures()
+ {
+ if (!isset($this->data['enclosures']))
+ {
+ $this->data['enclosures'] = array();
+
+ // Elements
+ $captions_parent = null;
+ $categories_parent = null;
+ $copyrights_parent = null;
+ $credits_parent = null;
+ $description_parent = null;
+ $duration_parent = null;
+ $hashes_parent = null;
+ $keywords_parent = null;
+ $player_parent = null;
+ $ratings_parent = null;
+ $restrictions_parent = null;
+ $thumbnails_parent = null;
+ $title_parent = null;
+
+ // Let's do the channel and item-level ones first, and just re-use them if we need to.
+ $parent = $this->get_feed();
+
+ // CAPTIONS
+ if ($captions = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'text'))
+ {
+ foreach ($captions as $caption)
+ {
+ $caption_type = null;
+ $caption_lang = null;
+ $caption_startTime = null;
+ $caption_endTime = null;
+ $caption_text = null;
+ if (isset($caption['attribs']['']['type']))
+ {
+ $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($caption['attribs']['']['lang']))
+ {
+ $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($caption['attribs']['']['start']))
+ {
+ $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($caption['attribs']['']['end']))
+ {
+ $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($caption['data']))
+ {
+ $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $captions_parent[] = $this->registry->create('Caption', array($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text));
+ }
+ }
+ elseif ($captions = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'text'))
+ {
+ foreach ($captions as $caption)
+ {
+ $caption_type = null;
+ $caption_lang = null;
+ $caption_startTime = null;
+ $caption_endTime = null;
+ $caption_text = null;
+ if (isset($caption['attribs']['']['type']))
+ {
+ $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($caption['attribs']['']['lang']))
+ {
+ $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($caption['attribs']['']['start']))
+ {
+ $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($caption['attribs']['']['end']))
+ {
+ $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($caption['data']))
+ {
+ $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $captions_parent[] = $this->registry->create('Caption', array($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text));
+ }
+ }
+ if (is_array($captions_parent))
+ {
+ $captions_parent = array_values(array_unique($captions_parent));
+ }
+
+ // CATEGORIES
+ foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'category') as $category)
+ {
+ $term = null;
+ $scheme = null;
+ $label = null;
+ if (isset($category['data']))
+ {
+ $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($category['attribs']['']['scheme']))
+ {
+ $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $scheme = 'http://search.yahoo.com/mrss/category_schema';
+ }
+ if (isset($category['attribs']['']['label']))
+ {
+ $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $categories_parent[] = $this->registry->create('Category', array($term, $scheme, $label));
+ }
+ foreach ((array) $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'category') as $category)
+ {
+ $term = null;
+ $scheme = null;
+ $label = null;
+ if (isset($category['data']))
+ {
+ $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($category['attribs']['']['scheme']))
+ {
+ $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $scheme = 'http://search.yahoo.com/mrss/category_schema';
+ }
+ if (isset($category['attribs']['']['label']))
+ {
+ $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $categories_parent[] = $this->registry->create('Category', array($term, $scheme, $label));
+ }
+ foreach ((array) $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'category') as $category)
+ {
+ $term = null;
+ $scheme = 'http://www.itunes.com/dtds/podcast-1.0.dtd';
+ $label = null;
+ if (isset($category['attribs']['']['text']))
+ {
+ $label = $this->sanitize($category['attribs']['']['text'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $categories_parent[] = $this->registry->create('Category', array($term, $scheme, $label));
+
+ if (isset($category['child'][SIMPLEPIE_NAMESPACE_ITUNES]['category']))
+ {
+ foreach ((array) $category['child'][SIMPLEPIE_NAMESPACE_ITUNES]['category'] as $subcategory)
+ {
+ if (isset($subcategory['attribs']['']['text']))
+ {
+ $label = $this->sanitize($subcategory['attribs']['']['text'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $categories_parent[] = $this->registry->create('Category', array($term, $scheme, $label));
+ }
+ }
+ }
+ if (is_array($categories_parent))
+ {
+ $categories_parent = array_values(array_unique($categories_parent));
+ }
+
+ // COPYRIGHT
+ if ($copyright = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'copyright'))
+ {
+ $copyright_url = null;
+ $copyright_label = null;
+ if (isset($copyright[0]['attribs']['']['url']))
+ {
+ $copyright_url = $this->sanitize($copyright[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($copyright[0]['data']))
+ {
+ $copyright_label = $this->sanitize($copyright[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $copyrights_parent = $this->registry->create('Copyright', array($copyright_url, $copyright_label));
+ }
+ elseif ($copyright = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'copyright'))
+ {
+ $copyright_url = null;
+ $copyright_label = null;
+ if (isset($copyright[0]['attribs']['']['url']))
+ {
+ $copyright_url = $this->sanitize($copyright[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($copyright[0]['data']))
+ {
+ $copyright_label = $this->sanitize($copyright[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $copyrights_parent = $this->registry->create('Copyright', array($copyright_url, $copyright_label));
+ }
+
+ // CREDITS
+ if ($credits = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'credit'))
+ {
+ foreach ($credits as $credit)
+ {
+ $credit_role = null;
+ $credit_scheme = null;
+ $credit_name = null;
+ if (isset($credit['attribs']['']['role']))
+ {
+ $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($credit['attribs']['']['scheme']))
+ {
+ $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $credit_scheme = 'urn:ebu';
+ }
+ if (isset($credit['data']))
+ {
+ $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $credits_parent[] = $this->registry->create('Credit', array($credit_role, $credit_scheme, $credit_name));
+ }
+ }
+ elseif ($credits = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'credit'))
+ {
+ foreach ($credits as $credit)
+ {
+ $credit_role = null;
+ $credit_scheme = null;
+ $credit_name = null;
+ if (isset($credit['attribs']['']['role']))
+ {
+ $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($credit['attribs']['']['scheme']))
+ {
+ $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $credit_scheme = 'urn:ebu';
+ }
+ if (isset($credit['data']))
+ {
+ $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $credits_parent[] = $this->registry->create('Credit', array($credit_role, $credit_scheme, $credit_name));
+ }
+ }
+ if (is_array($credits_parent))
+ {
+ $credits_parent = array_values(array_unique($credits_parent));
+ }
+
+ // DESCRIPTION
+ if ($description_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'description'))
+ {
+ if (isset($description_parent[0]['data']))
+ {
+ $description_parent = $this->sanitize($description_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ }
+ elseif ($description_parent = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'description'))
+ {
+ if (isset($description_parent[0]['data']))
+ {
+ $description_parent = $this->sanitize($description_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ }
+
+ // DURATION
+ if ($duration_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'duration'))
+ {
+ $seconds = null;
+ $minutes = null;
+ $hours = null;
+ if (isset($duration_parent[0]['data']))
+ {
+ $temp = explode(':', $this->sanitize($duration_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
+ if (sizeof($temp) > 0)
+ {
+ $seconds = (int) array_pop($temp);
+ }
+ if (sizeof($temp) > 0)
+ {
+ $minutes = (int) array_pop($temp);
+ $seconds += $minutes * 60;
+ }
+ if (sizeof($temp) > 0)
+ {
+ $hours = (int) array_pop($temp);
+ $seconds += $hours * 3600;
+ }
+ unset($temp);
+ $duration_parent = $seconds;
+ }
+ }
+
+ // HASHES
+ if ($hashes_iterator = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'hash'))
+ {
+ foreach ($hashes_iterator as $hash)
+ {
+ $value = null;
+ $algo = null;
+ if (isset($hash['data']))
+ {
+ $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($hash['attribs']['']['algo']))
+ {
+ $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $algo = 'md5';
+ }
+ $hashes_parent[] = $algo.':'.$value;
+ }
+ }
+ elseif ($hashes_iterator = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'hash'))
+ {
+ foreach ($hashes_iterator as $hash)
+ {
+ $value = null;
+ $algo = null;
+ if (isset($hash['data']))
+ {
+ $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($hash['attribs']['']['algo']))
+ {
+ $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $algo = 'md5';
+ }
+ $hashes_parent[] = $algo.':'.$value;
+ }
+ }
+ if (is_array($hashes_parent))
+ {
+ $hashes_parent = array_values(array_unique($hashes_parent));
+ }
+
+ // KEYWORDS
+ if ($keywords = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'keywords'))
+ {
+ if (isset($keywords[0]['data']))
+ {
+ $temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
+ foreach ($temp as $word)
+ {
+ $keywords_parent[] = trim($word);
+ }
+ }
+ unset($temp);
+ }
+ elseif ($keywords = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'keywords'))
+ {
+ if (isset($keywords[0]['data']))
+ {
+ $temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
+ foreach ($temp as $word)
+ {
+ $keywords_parent[] = trim($word);
+ }
+ }
+ unset($temp);
+ }
+ elseif ($keywords = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'keywords'))
+ {
+ if (isset($keywords[0]['data']))
+ {
+ $temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
+ foreach ($temp as $word)
+ {
+ $keywords_parent[] = trim($word);
+ }
+ }
+ unset($temp);
+ }
+ elseif ($keywords = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'keywords'))
+ {
+ if (isset($keywords[0]['data']))
+ {
+ $temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
+ foreach ($temp as $word)
+ {
+ $keywords_parent[] = trim($word);
+ }
+ }
+ unset($temp);
+ }
+ if (is_array($keywords_parent))
+ {
+ $keywords_parent = array_values(array_unique($keywords_parent));
+ }
+
+ // PLAYER
+ if ($player_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'player'))
+ {
+ if (isset($player_parent[0]['attribs']['']['url']))
+ {
+ $player_parent = $this->sanitize($player_parent[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
+ }
+ }
+ elseif ($player_parent = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'player'))
+ {
+ if (isset($player_parent[0]['attribs']['']['url']))
+ {
+ $player_parent = $this->sanitize($player_parent[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
+ }
+ }
+
+ // RATINGS
+ if ($ratings = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'rating'))
+ {
+ foreach ($ratings as $rating)
+ {
+ $rating_scheme = null;
+ $rating_value = null;
+ if (isset($rating['attribs']['']['scheme']))
+ {
+ $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $rating_scheme = 'urn:simple';
+ }
+ if (isset($rating['data']))
+ {
+ $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $ratings_parent[] = $this->registry->create('Rating', array($rating_scheme, $rating_value));
+ }
+ }
+ elseif ($ratings = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'explicit'))
+ {
+ foreach ($ratings as $rating)
+ {
+ $rating_scheme = 'urn:itunes';
+ $rating_value = null;
+ if (isset($rating['data']))
+ {
+ $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $ratings_parent[] = $this->registry->create('Rating', array($rating_scheme, $rating_value));
+ }
+ }
+ elseif ($ratings = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'rating'))
+ {
+ foreach ($ratings as $rating)
+ {
+ $rating_scheme = null;
+ $rating_value = null;
+ if (isset($rating['attribs']['']['scheme']))
+ {
+ $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $rating_scheme = 'urn:simple';
+ }
+ if (isset($rating['data']))
+ {
+ $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $ratings_parent[] = $this->registry->create('Rating', array($rating_scheme, $rating_value));
+ }
+ }
+ elseif ($ratings = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'explicit'))
+ {
+ foreach ($ratings as $rating)
+ {
+ $rating_scheme = 'urn:itunes';
+ $rating_value = null;
+ if (isset($rating['data']))
+ {
+ $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $ratings_parent[] = $this->registry->create('Rating', array($rating_scheme, $rating_value));
+ }
+ }
+ if (is_array($ratings_parent))
+ {
+ $ratings_parent = array_values(array_unique($ratings_parent));
+ }
+
+ // RESTRICTIONS
+ if ($restrictions = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'restriction'))
+ {
+ foreach ($restrictions as $restriction)
+ {
+ $restriction_relationship = null;
+ $restriction_type = null;
+ $restriction_value = null;
+ if (isset($restriction['attribs']['']['relationship']))
+ {
+ $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($restriction['attribs']['']['type']))
+ {
+ $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($restriction['data']))
+ {
+ $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $restrictions_parent[] = $this->registry->create('Restriction', array($restriction_relationship, $restriction_type, $restriction_value));
+ }
+ }
+ elseif ($restrictions = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'block'))
+ {
+ foreach ($restrictions as $restriction)
+ {
+ $restriction_relationship = 'allow';
+ $restriction_type = null;
+ $restriction_value = 'itunes';
+ if (isset($restriction['data']) && strtolower($restriction['data']) === 'yes')
+ {
+ $restriction_relationship = 'deny';
+ }
+ $restrictions_parent[] = $this->registry->create('Restriction', array($restriction_relationship, $restriction_type, $restriction_value));
+ }
+ }
+ elseif ($restrictions = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'restriction'))
+ {
+ foreach ($restrictions as $restriction)
+ {
+ $restriction_relationship = null;
+ $restriction_type = null;
+ $restriction_value = null;
+ if (isset($restriction['attribs']['']['relationship']))
+ {
+ $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($restriction['attribs']['']['type']))
+ {
+ $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($restriction['data']))
+ {
+ $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $restrictions_parent[] = $this->registry->create('Restriction', array($restriction_relationship, $restriction_type, $restriction_value));
+ }
+ }
+ elseif ($restrictions = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'block'))
+ {
+ foreach ($restrictions as $restriction)
+ {
+ $restriction_relationship = 'allow';
+ $restriction_type = null;
+ $restriction_value = 'itunes';
+ if (isset($restriction['data']) && strtolower($restriction['data']) === 'yes')
+ {
+ $restriction_relationship = 'deny';
+ }
+ $restrictions_parent[] = $this->registry->create('Restriction', array($restriction_relationship, $restriction_type, $restriction_value));
+ }
+ }
+ if (is_array($restrictions_parent))
+ {
+ $restrictions_parent = array_values(array_unique($restrictions_parent));
+ }
+ else
+ {
+ $restrictions_parent = array(new SimplePie_Restriction('allow', null, 'default'));
+ }
+
+ // THUMBNAILS
+ if ($thumbnails = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'thumbnail'))
+ {
+ foreach ($thumbnails as $thumbnail)
+ {
+ if (isset($thumbnail['attribs']['']['url']))
+ {
+ $thumbnails_parent[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
+ }
+ }
+ }
+ elseif ($thumbnails = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'thumbnail'))
+ {
+ foreach ($thumbnails as $thumbnail)
+ {
+ if (isset($thumbnail['attribs']['']['url']))
+ {
+ $thumbnails_parent[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
+ }
+ }
+ }
+
+ // TITLES
+ if ($title_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'title'))
+ {
+ if (isset($title_parent[0]['data']))
+ {
+ $title_parent = $this->sanitize($title_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ }
+ elseif ($title_parent = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'title'))
+ {
+ if (isset($title_parent[0]['data']))
+ {
+ $title_parent = $this->sanitize($title_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ }
+
+ // Clear the memory
+ unset($parent);
+
+ // Attributes
+ $bitrate = null;
+ $channels = null;
+ $duration = null;
+ $expression = null;
+ $framerate = null;
+ $height = null;
+ $javascript = null;
+ $lang = null;
+ $length = null;
+ $medium = null;
+ $samplingrate = null;
+ $type = null;
+ $url = null;
+ $width = null;
+
+ // Elements
+ $captions = null;
+ $categories = null;
+ $copyrights = null;
+ $credits = null;
+ $description = null;
+ $hashes = null;
+ $keywords = null;
+ $player = null;
+ $ratings = null;
+ $restrictions = null;
+ $thumbnails = null;
+ $title = null;
+
+ // If we have media:group tags, loop through them.
+ foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'group') as $group)
+ {
+ if(isset($group['child']) && isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content']))
+ {
+ // If we have media:content tags, loop through them.
+ foreach ((array) $group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content'] as $content)
+ {
+ if (isset($content['attribs']['']['url']))
+ {
+ // Attributes
+ $bitrate = null;
+ $channels = null;
+ $duration = null;
+ $expression = null;
+ $framerate = null;
+ $height = null;
+ $javascript = null;
+ $lang = null;
+ $length = null;
+ $medium = null;
+ $samplingrate = null;
+ $type = null;
+ $url = null;
+ $width = null;
+
+ // Elements
+ $captions = null;
+ $categories = null;
+ $copyrights = null;
+ $credits = null;
+ $description = null;
+ $hashes = null;
+ $keywords = null;
+ $player = null;
+ $ratings = null;
+ $restrictions = null;
+ $thumbnails = null;
+ $title = null;
+
+ // Start checking the attributes of media:content
+ if (isset($content['attribs']['']['bitrate']))
+ {
+ $bitrate = $this->sanitize($content['attribs']['']['bitrate'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($content['attribs']['']['channels']))
+ {
+ $channels = $this->sanitize($content['attribs']['']['channels'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($content['attribs']['']['duration']))
+ {
+ $duration = $this->sanitize($content['attribs']['']['duration'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $duration = $duration_parent;
+ }
+ if (isset($content['attribs']['']['expression']))
+ {
+ $expression = $this->sanitize($content['attribs']['']['expression'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($content['attribs']['']['framerate']))
+ {
+ $framerate = $this->sanitize($content['attribs']['']['framerate'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($content['attribs']['']['height']))
+ {
+ $height = $this->sanitize($content['attribs']['']['height'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($content['attribs']['']['lang']))
+ {
+ $lang = $this->sanitize($content['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($content['attribs']['']['fileSize']))
+ {
+ $length = ceil($content['attribs']['']['fileSize']);
+ }
+ if (isset($content['attribs']['']['medium']))
+ {
+ $medium = $this->sanitize($content['attribs']['']['medium'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($content['attribs']['']['samplingrate']))
+ {
+ $samplingrate = $this->sanitize($content['attribs']['']['samplingrate'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($content['attribs']['']['type']))
+ {
+ $type = $this->sanitize($content['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($content['attribs']['']['width']))
+ {
+ $width = $this->sanitize($content['attribs']['']['width'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $url = $this->sanitize($content['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
+
+ // Checking the other optional media: elements. Priority: media:content, media:group, item, channel
+
+ // CAPTIONS
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text']))
+ {
+ foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'] as $caption)
+ {
+ $caption_type = null;
+ $caption_lang = null;
+ $caption_startTime = null;
+ $caption_endTime = null;
+ $caption_text = null;
+ if (isset($caption['attribs']['']['type']))
+ {
+ $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($caption['attribs']['']['lang']))
+ {
+ $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($caption['attribs']['']['start']))
+ {
+ $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($caption['attribs']['']['end']))
+ {
+ $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($caption['data']))
+ {
+ $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $captions[] = $this->registry->create('Caption', array($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text));
+ }
+ if (is_array($captions))
+ {
+ $captions = array_values(array_unique($captions));
+ }
+ }
+ elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text']))
+ {
+ foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'] as $caption)
+ {
+ $caption_type = null;
+ $caption_lang = null;
+ $caption_startTime = null;
+ $caption_endTime = null;
+ $caption_text = null;
+ if (isset($caption['attribs']['']['type']))
+ {
+ $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($caption['attribs']['']['lang']))
+ {
+ $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($caption['attribs']['']['start']))
+ {
+ $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($caption['attribs']['']['end']))
+ {
+ $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($caption['data']))
+ {
+ $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $captions[] = $this->registry->create('Caption', array($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text));
+ }
+ if (is_array($captions))
+ {
+ $captions = array_values(array_unique($captions));
+ }
+ }
+ else
+ {
+ $captions = $captions_parent;
+ }
+
+ // CATEGORIES
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category']))
+ {
+ foreach ((array) $content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'] as $category)
+ {
+ $term = null;
+ $scheme = null;
+ $label = null;
+ if (isset($category['data']))
+ {
+ $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($category['attribs']['']['scheme']))
+ {
+ $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $scheme = 'http://search.yahoo.com/mrss/category_schema';
+ }
+ if (isset($category['attribs']['']['label']))
+ {
+ $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $categories[] = $this->registry->create('Category', array($term, $scheme, $label));
+ }
+ }
+ if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category']))
+ {
+ foreach ((array) $group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'] as $category)
+ {
+ $term = null;
+ $scheme = null;
+ $label = null;
+ if (isset($category['data']))
+ {
+ $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($category['attribs']['']['scheme']))
+ {
+ $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $scheme = 'http://search.yahoo.com/mrss/category_schema';
+ }
+ if (isset($category['attribs']['']['label']))
+ {
+ $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $categories[] = $this->registry->create('Category', array($term, $scheme, $label));
+ }
+ }
+ if (is_array($categories) && is_array($categories_parent))
+ {
+ $categories = array_values(array_unique(array_merge($categories, $categories_parent)));
+ }
+ elseif (is_array($categories))
+ {
+ $categories = array_values(array_unique($categories));
+ }
+ elseif (is_array($categories_parent))
+ {
+ $categories = array_values(array_unique($categories_parent));
+ }
+
+ // COPYRIGHTS
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright']))
+ {
+ $copyright_url = null;
+ $copyright_label = null;
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url']))
+ {
+ $copyright_url = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data']))
+ {
+ $copyright_label = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $copyrights = $this->registry->create('Copyright', array($copyright_url, $copyright_label));
+ }
+ elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright']))
+ {
+ $copyright_url = null;
+ $copyright_label = null;
+ if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url']))
+ {
+ $copyright_url = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data']))
+ {
+ $copyright_label = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $copyrights = $this->registry->create('Copyright', array($copyright_url, $copyright_label));
+ }
+ else
+ {
+ $copyrights = $copyrights_parent;
+ }
+
+ // CREDITS
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit']))
+ {
+ foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'] as $credit)
+ {
+ $credit_role = null;
+ $credit_scheme = null;
+ $credit_name = null;
+ if (isset($credit['attribs']['']['role']))
+ {
+ $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($credit['attribs']['']['scheme']))
+ {
+ $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $credit_scheme = 'urn:ebu';
+ }
+ if (isset($credit['data']))
+ {
+ $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $credits[] = $this->registry->create('Credit', array($credit_role, $credit_scheme, $credit_name));
+ }
+ if (is_array($credits))
+ {
+ $credits = array_values(array_unique($credits));
+ }
+ }
+ elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit']))
+ {
+ foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'] as $credit)
+ {
+ $credit_role = null;
+ $credit_scheme = null;
+ $credit_name = null;
+ if (isset($credit['attribs']['']['role']))
+ {
+ $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($credit['attribs']['']['scheme']))
+ {
+ $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $credit_scheme = 'urn:ebu';
+ }
+ if (isset($credit['data']))
+ {
+ $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $credits[] = $this->registry->create('Credit', array($credit_role, $credit_scheme, $credit_name));
+ }
+ if (is_array($credits))
+ {
+ $credits = array_values(array_unique($credits));
+ }
+ }
+ else
+ {
+ $credits = $credits_parent;
+ }
+
+ // DESCRIPTION
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description']))
+ {
+ $description = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description']))
+ {
+ $description = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $description = $description_parent;
+ }
+
+ // HASHES
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash']))
+ {
+ foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'] as $hash)
+ {
+ $value = null;
+ $algo = null;
+ if (isset($hash['data']))
+ {
+ $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($hash['attribs']['']['algo']))
+ {
+ $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $algo = 'md5';
+ }
+ $hashes[] = $algo.':'.$value;
+ }
+ if (is_array($hashes))
+ {
+ $hashes = array_values(array_unique($hashes));
+ }
+ }
+ elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash']))
+ {
+ foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'] as $hash)
+ {
+ $value = null;
+ $algo = null;
+ if (isset($hash['data']))
+ {
+ $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($hash['attribs']['']['algo']))
+ {
+ $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $algo = 'md5';
+ }
+ $hashes[] = $algo.':'.$value;
+ }
+ if (is_array($hashes))
+ {
+ $hashes = array_values(array_unique($hashes));
+ }
+ }
+ else
+ {
+ $hashes = $hashes_parent;
+ }
+
+ // KEYWORDS
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords']))
+ {
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data']))
+ {
+ $temp = explode(',', $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
+ foreach ($temp as $word)
+ {
+ $keywords[] = trim($word);
+ }
+ unset($temp);
+ }
+ if (is_array($keywords))
+ {
+ $keywords = array_values(array_unique($keywords));
+ }
+ }
+ elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords']))
+ {
+ if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data']))
+ {
+ $temp = explode(',', $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
+ foreach ($temp as $word)
+ {
+ $keywords[] = trim($word);
+ }
+ unset($temp);
+ }
+ if (is_array($keywords))
+ {
+ $keywords = array_values(array_unique($keywords));
+ }
+ }
+ else
+ {
+ $keywords = $keywords_parent;
+ }
+
+ // PLAYER
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player']))
+ {
+ $player = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
+ }
+ elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player']))
+ {
+ $player = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
+ }
+ else
+ {
+ $player = $player_parent;
+ }
+
+ // RATINGS
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating']))
+ {
+ foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'] as $rating)
+ {
+ $rating_scheme = null;
+ $rating_value = null;
+ if (isset($rating['attribs']['']['scheme']))
+ {
+ $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $rating_scheme = 'urn:simple';
+ }
+ if (isset($rating['data']))
+ {
+ $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $ratings[] = $this->registry->create('Rating', array($rating_scheme, $rating_value));
+ }
+ if (is_array($ratings))
+ {
+ $ratings = array_values(array_unique($ratings));
+ }
+ }
+ elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating']))
+ {
+ foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'] as $rating)
+ {
+ $rating_scheme = null;
+ $rating_value = null;
+ if (isset($rating['attribs']['']['scheme']))
+ {
+ $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $rating_scheme = 'urn:simple';
+ }
+ if (isset($rating['data']))
+ {
+ $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $ratings[] = $this->registry->create('Rating', array($rating_scheme, $rating_value));
+ }
+ if (is_array($ratings))
+ {
+ $ratings = array_values(array_unique($ratings));
+ }
+ }
+ else
+ {
+ $ratings = $ratings_parent;
+ }
+
+ // RESTRICTIONS
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction']))
+ {
+ foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'] as $restriction)
+ {
+ $restriction_relationship = null;
+ $restriction_type = null;
+ $restriction_value = null;
+ if (isset($restriction['attribs']['']['relationship']))
+ {
+ $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($restriction['attribs']['']['type']))
+ {
+ $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($restriction['data']))
+ {
+ $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $restrictions[] = $this->registry->create('Restriction', array($restriction_relationship, $restriction_type, $restriction_value));
+ }
+ if (is_array($restrictions))
+ {
+ $restrictions = array_values(array_unique($restrictions));
+ }
+ }
+ elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction']))
+ {
+ foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'] as $restriction)
+ {
+ $restriction_relationship = null;
+ $restriction_type = null;
+ $restriction_value = null;
+ if (isset($restriction['attribs']['']['relationship']))
+ {
+ $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($restriction['attribs']['']['type']))
+ {
+ $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($restriction['data']))
+ {
+ $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $restrictions[] = $this->registry->create('Restriction', array($restriction_relationship, $restriction_type, $restriction_value));
+ }
+ if (is_array($restrictions))
+ {
+ $restrictions = array_values(array_unique($restrictions));
+ }
+ }
+ else
+ {
+ $restrictions = $restrictions_parent;
+ }
+
+ // THUMBNAILS
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail']))
+ {
+ foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'] as $thumbnail)
+ {
+ $thumbnails[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
+ }
+ if (is_array($thumbnails))
+ {
+ $thumbnails = array_values(array_unique($thumbnails));
+ }
+ }
+ elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail']))
+ {
+ foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'] as $thumbnail)
+ {
+ $thumbnails[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
+ }
+ if (is_array($thumbnails))
+ {
+ $thumbnails = array_values(array_unique($thumbnails));
+ }
+ }
+ else
+ {
+ $thumbnails = $thumbnails_parent;
+ }
+
+ // TITLES
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title']))
+ {
+ $title = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title']))
+ {
+ $title = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $title = $title_parent;
+ }
+
+ $this->data['enclosures'][] = $this->registry->create('Enclosure', array($url, $type, $length, null, $bitrate, $captions, $categories, $channels, $copyrights, $credits, $description, $duration, $expression, $framerate, $hashes, $height, $keywords, $lang, $medium, $player, $ratings, $restrictions, $samplingrate, $thumbnails, $title, $width));
+ }
+ }
+ }
+ }
+
+ // If we have standalone media:content tags, loop through them.
+ if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content']))
+ {
+ foreach ((array) $this->data['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content'] as $content)
+ {
+ if (isset($content['attribs']['']['url']) || isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player']))
+ {
+ // Attributes
+ $bitrate = null;
+ $channels = null;
+ $duration = null;
+ $expression = null;
+ $framerate = null;
+ $height = null;
+ $javascript = null;
+ $lang = null;
+ $length = null;
+ $medium = null;
+ $samplingrate = null;
+ $type = null;
+ $url = null;
+ $width = null;
+
+ // Elements
+ $captions = null;
+ $categories = null;
+ $copyrights = null;
+ $credits = null;
+ $description = null;
+ $hashes = null;
+ $keywords = null;
+ $player = null;
+ $ratings = null;
+ $restrictions = null;
+ $thumbnails = null;
+ $title = null;
+
+ // Start checking the attributes of media:content
+ if (isset($content['attribs']['']['bitrate']))
+ {
+ $bitrate = $this->sanitize($content['attribs']['']['bitrate'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($content['attribs']['']['channels']))
+ {
+ $channels = $this->sanitize($content['attribs']['']['channels'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($content['attribs']['']['duration']))
+ {
+ $duration = $this->sanitize($content['attribs']['']['duration'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $duration = $duration_parent;
+ }
+ if (isset($content['attribs']['']['expression']))
+ {
+ $expression = $this->sanitize($content['attribs']['']['expression'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($content['attribs']['']['framerate']))
+ {
+ $framerate = $this->sanitize($content['attribs']['']['framerate'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($content['attribs']['']['height']))
+ {
+ $height = $this->sanitize($content['attribs']['']['height'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($content['attribs']['']['lang']))
+ {
+ $lang = $this->sanitize($content['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($content['attribs']['']['fileSize']))
+ {
+ $length = ceil($content['attribs']['']['fileSize']);
+ }
+ if (isset($content['attribs']['']['medium']))
+ {
+ $medium = $this->sanitize($content['attribs']['']['medium'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($content['attribs']['']['samplingrate']))
+ {
+ $samplingrate = $this->sanitize($content['attribs']['']['samplingrate'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($content['attribs']['']['type']))
+ {
+ $type = $this->sanitize($content['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($content['attribs']['']['width']))
+ {
+ $width = $this->sanitize($content['attribs']['']['width'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($content['attribs']['']['url']))
+ {
+ $url = $this->sanitize($content['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
+ }
+ // Checking the other optional media: elements. Priority: media:content, media:group, item, channel
+
+ // CAPTIONS
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text']))
+ {
+ foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'] as $caption)
+ {
+ $caption_type = null;
+ $caption_lang = null;
+ $caption_startTime = null;
+ $caption_endTime = null;
+ $caption_text = null;
+ if (isset($caption['attribs']['']['type']))
+ {
+ $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($caption['attribs']['']['lang']))
+ {
+ $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($caption['attribs']['']['start']))
+ {
+ $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($caption['attribs']['']['end']))
+ {
+ $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($caption['data']))
+ {
+ $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $captions[] = $this->registry->create('Caption', array($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text));
+ }
+ if (is_array($captions))
+ {
+ $captions = array_values(array_unique($captions));
+ }
+ }
+ else
+ {
+ $captions = $captions_parent;
+ }
+
+ // CATEGORIES
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category']))
+ {
+ foreach ((array) $content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'] as $category)
+ {
+ $term = null;
+ $scheme = null;
+ $label = null;
+ if (isset($category['data']))
+ {
+ $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($category['attribs']['']['scheme']))
+ {
+ $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $scheme = 'http://search.yahoo.com/mrss/category_schema';
+ }
+ if (isset($category['attribs']['']['label']))
+ {
+ $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $categories[] = $this->registry->create('Category', array($term, $scheme, $label));
+ }
+ }
+ if (is_array($categories) && is_array($categories_parent))
+ {
+ $categories = array_values(array_unique(array_merge($categories, $categories_parent)));
+ }
+ elseif (is_array($categories))
+ {
+ $categories = array_values(array_unique($categories));
+ }
+ elseif (is_array($categories_parent))
+ {
+ $categories = array_values(array_unique($categories_parent));
+ }
+ else
+ {
+ $categories = null;
+ }
+
+ // COPYRIGHTS
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright']))
+ {
+ $copyright_url = null;
+ $copyright_label = null;
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url']))
+ {
+ $copyright_url = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data']))
+ {
+ $copyright_label = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $copyrights = $this->registry->create('Copyright', array($copyright_url, $copyright_label));
+ }
+ else
+ {
+ $copyrights = $copyrights_parent;
+ }
+
+ // CREDITS
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit']))
+ {
+ foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'] as $credit)
+ {
+ $credit_role = null;
+ $credit_scheme = null;
+ $credit_name = null;
+ if (isset($credit['attribs']['']['role']))
+ {
+ $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($credit['attribs']['']['scheme']))
+ {
+ $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $credit_scheme = 'urn:ebu';
+ }
+ if (isset($credit['data']))
+ {
+ $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $credits[] = $this->registry->create('Credit', array($credit_role, $credit_scheme, $credit_name));
+ }
+ if (is_array($credits))
+ {
+ $credits = array_values(array_unique($credits));
+ }
+ }
+ else
+ {
+ $credits = $credits_parent;
+ }
+
+ // DESCRIPTION
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description']))
+ {
+ $description = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $description = $description_parent;
+ }
+
+ // HASHES
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash']))
+ {
+ foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'] as $hash)
+ {
+ $value = null;
+ $algo = null;
+ if (isset($hash['data']))
+ {
+ $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($hash['attribs']['']['algo']))
+ {
+ $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $algo = 'md5';
+ }
+ $hashes[] = $algo.':'.$value;
+ }
+ if (is_array($hashes))
+ {
+ $hashes = array_values(array_unique($hashes));
+ }
+ }
+ else
+ {
+ $hashes = $hashes_parent;
+ }
+
+ // KEYWORDS
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords']))
+ {
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data']))
+ {
+ $temp = explode(',', $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
+ foreach ($temp as $word)
+ {
+ $keywords[] = trim($word);
+ }
+ unset($temp);
+ }
+ if (is_array($keywords))
+ {
+ $keywords = array_values(array_unique($keywords));
+ }
+ }
+ else
+ {
+ $keywords = $keywords_parent;
+ }
+
+ // PLAYER
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player']))
+ {
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'])) {
+ $player = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
+ }
+ }
+ else
+ {
+ $player = $player_parent;
+ }
+
+ // RATINGS
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating']))
+ {
+ foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'] as $rating)
+ {
+ $rating_scheme = null;
+ $rating_value = null;
+ if (isset($rating['attribs']['']['scheme']))
+ {
+ $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $rating_scheme = 'urn:simple';
+ }
+ if (isset($rating['data']))
+ {
+ $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $ratings[] = $this->registry->create('Rating', array($rating_scheme, $rating_value));
+ }
+ if (is_array($ratings))
+ {
+ $ratings = array_values(array_unique($ratings));
+ }
+ }
+ else
+ {
+ $ratings = $ratings_parent;
+ }
+
+ // RESTRICTIONS
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction']))
+ {
+ foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'] as $restriction)
+ {
+ $restriction_relationship = null;
+ $restriction_type = null;
+ $restriction_value = null;
+ if (isset($restriction['attribs']['']['relationship']))
+ {
+ $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($restriction['attribs']['']['type']))
+ {
+ $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($restriction['data']))
+ {
+ $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $restrictions[] = $this->registry->create('Restriction', array($restriction_relationship, $restriction_type, $restriction_value));
+ }
+ if (is_array($restrictions))
+ {
+ $restrictions = array_values(array_unique($restrictions));
+ }
+ }
+ else
+ {
+ $restrictions = $restrictions_parent;
+ }
+
+ // THUMBNAILS
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail']))
+ {
+ foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'] as $thumbnail)
+ {
+ if (isset($thumbnail['attribs']['']['url'])) {
+ $thumbnails[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
+ }
+ }
+ if (is_array($thumbnails))
+ {
+ $thumbnails = array_values(array_unique($thumbnails));
+ }
+ }
+ else
+ {
+ $thumbnails = $thumbnails_parent;
+ }
+
+ // TITLES
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title']))
+ {
+ $title = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $title = $title_parent;
+ }
+
+ $this->data['enclosures'][] = $this->registry->create('Enclosure', array($url, $type, $length, null, $bitrate, $captions, $categories, $channels, $copyrights, $credits, $description, $duration, $expression, $framerate, $hashes, $height, $keywords, $lang, $medium, $player, $ratings, $restrictions, $samplingrate, $thumbnails, $title, $width));
+ }
+ }
+ }
+
+ foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'link') as $link)
+ {
+ if (isset($link['attribs']['']['href']) && !empty($link['attribs']['']['rel']) && $link['attribs']['']['rel'] === 'enclosure')
+ {
+ // Attributes
+ $bitrate = null;
+ $channels = null;
+ $duration = null;
+ $expression = null;
+ $framerate = null;
+ $height = null;
+ $javascript = null;
+ $lang = null;
+ $length = null;
+ $medium = null;
+ $samplingrate = null;
+ $type = null;
+ $url = null;
+ $width = null;
+
+ $url = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));
+ if (isset($link['attribs']['']['type']))
+ {
+ $type = $this->sanitize($link['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($link['attribs']['']['length']))
+ {
+ $length = ceil($link['attribs']['']['length']);
+ }
+ if (isset($link['attribs']['']['title']))
+ {
+ $title = $this->sanitize($link['attribs']['']['title'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $title = $title_parent;
+ }
+
+ // Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor
+ $this->data['enclosures'][] = $this->registry->create('Enclosure', array($url, $type, $length, null, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title, $width));
+ }
+ }
+
+ foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'link') as $link)
+ {
+ if (isset($link['attribs']['']['href']) && !empty($link['attribs']['']['rel']) && $link['attribs']['']['rel'] === 'enclosure')
+ {
+ // Attributes
+ $bitrate = null;
+ $channels = null;
+ $duration = null;
+ $expression = null;
+ $framerate = null;
+ $height = null;
+ $javascript = null;
+ $lang = null;
+ $length = null;
+ $medium = null;
+ $samplingrate = null;
+ $type = null;
+ $url = null;
+ $width = null;
+
+ $url = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));
+ if (isset($link['attribs']['']['type']))
+ {
+ $type = $this->sanitize($link['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($link['attribs']['']['length']))
+ {
+ $length = ceil($link['attribs']['']['length']);
+ }
+
+ // Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor
+ $this->data['enclosures'][] = $this->registry->create('Enclosure', array($url, $type, $length, null, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title_parent, $width));
+ }
+ }
+
+ if ($enclosure = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'enclosure'))
+ {
+ if (isset($enclosure[0]['attribs']['']['url']))
+ {
+ // Attributes
+ $bitrate = null;
+ $channels = null;
+ $duration = null;
+ $expression = null;
+ $framerate = null;
+ $height = null;
+ $javascript = null;
+ $lang = null;
+ $length = null;
+ $medium = null;
+ $samplingrate = null;
+ $type = null;
+ $url = null;
+ $width = null;
+
+ $url = $this->sanitize($enclosure[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($enclosure[0]));
+ if (isset($enclosure[0]['attribs']['']['type']))
+ {
+ $type = $this->sanitize($enclosure[0]['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($enclosure[0]['attribs']['']['length']))
+ {
+ $length = ceil($enclosure[0]['attribs']['']['length']);
+ }
+
+ // Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor
+ $this->data['enclosures'][] = $this->registry->create('Enclosure', array($url, $type, $length, null, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title_parent, $width));
+ }
+ }
+
+ if (sizeof($this->data['enclosures']) === 0 && ($url || $type || $length || $bitrate || $captions_parent || $categories_parent || $channels || $copyrights_parent || $credits_parent || $description_parent || $duration_parent || $expression || $framerate || $hashes_parent || $height || $keywords_parent || $lang || $medium || $player_parent || $ratings_parent || $restrictions_parent || $samplingrate || $thumbnails_parent || $title_parent || $width))
+ {
+ // Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor
+ $this->data['enclosures'][] = $this->registry->create('Enclosure', array($url, $type, $length, null, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title_parent, $width));
+ }
+
+ $this->data['enclosures'] = array_values(array_unique($this->data['enclosures']));
+ }
+ if (!empty($this->data['enclosures']))
+ {
+ return $this->data['enclosures'];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get the latitude coordinates for the item
+ *
+ * Compatible with the W3C WGS84 Basic Geo and GeoRSS specifications
+ *
+ * Uses `<geo:lat>` or `<georss:point>`
+ *
+ * @since 1.0
+ * @link http://www.w3.org/2003/01/geo/ W3C WGS84 Basic Geo
+ * @link http://www.georss.org/ GeoRSS
+ * @return string|null
+ */
+ public function get_latitude()
+ {
+ if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lat'))
+ {
+ return (float) $return[0]['data'];
+ }
+ elseif (($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match))
+ {
+ return (float) $match[1];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get the longitude coordinates for the item
+ *
+ * Compatible with the W3C WGS84 Basic Geo and GeoRSS specifications
+ *
+ * Uses `<geo:long>`, `<geo:lon>` or `<georss:point>`
+ *
+ * @since 1.0
+ * @link http://www.w3.org/2003/01/geo/ W3C WGS84 Basic Geo
+ * @link http://www.georss.org/ GeoRSS
+ * @return string|null
+ */
+ public function get_longitude()
+ {
+ if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'long'))
+ {
+ return (float) $return[0]['data'];
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lon'))
+ {
+ return (float) $return[0]['data'];
+ }
+ elseif (($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match))
+ {
+ return (float) $match[2];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get the `<atom:source>` for the item
+ *
+ * @since 1.1
+ * @return SimplePie_Source|null
+ */
+ public function get_source()
+ {
+ if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'source'))
+ {
+ return $this->registry->create('Source', array($this, $return[0]));
+ }
+ else
+ {
+ return null;
+ }
+ }
+}
+
diff --git a/vendor/simplepie/simplepie/library/SimplePie/Locator.php b/vendor/simplepie/simplepie/library/SimplePie/Locator.php
new file mode 100644
index 000000000..bc314c2cd
--- /dev/null
+++ b/vendor/simplepie/simplepie/library/SimplePie/Locator.php
@@ -0,0 +1,429 @@
+<?php
+/**
+ * SimplePie
+ *
+ * A PHP-Based RSS and Atom Feed Framework.
+ * Takes the hard work out of managing a complete RSS/Atom solution.
+ *
+ * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * * Neither the name of the SimplePie Team nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
+ * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @package SimplePie
+ * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @author Ryan Parman
+ * @author Geoffrey Sneddon
+ * @author Ryan McCue
+ * @link http://simplepie.org/ SimplePie
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ */
+
+/**
+ * Used for feed auto-discovery
+ *
+ *
+ * This class can be overloaded with {@see SimplePie::set_locator_class()}
+ *
+ * @package SimplePie
+ */
+class SimplePie_Locator
+{
+ var $useragent;
+ var $timeout;
+ var $file;
+ var $local = array();
+ var $elsewhere = array();
+ var $cached_entities = array();
+ var $http_base;
+ var $base;
+ var $base_location = 0;
+ var $checked_feeds = 0;
+ var $max_checked_feeds = 10;
+ protected $registry;
+
+ public function __construct(SimplePie_File $file, $timeout = 10, $useragent = null, $max_checked_feeds = 10)
+ {
+ $this->file = $file;
+ $this->useragent = $useragent;
+ $this->timeout = $timeout;
+ $this->max_checked_feeds = $max_checked_feeds;
+
+ if (class_exists('DOMDocument'))
+ {
+ $this->dom = new DOMDocument();
+
+ set_error_handler(array('SimplePie_Misc', 'silence_errors'));
+ $this->dom->loadHTML($this->file->body);
+ restore_error_handler();
+ }
+ else
+ {
+ $this->dom = null;
+ }
+ }
+
+ public function set_registry(SimplePie_Registry $registry)
+ {
+ $this->registry = $registry;
+ }
+
+ public function find($type = SIMPLEPIE_LOCATOR_ALL, &$working)
+ {
+ if ($this->is_feed($this->file))
+ {
+ return $this->file;
+ }
+
+ if ($this->file->method & SIMPLEPIE_FILE_SOURCE_REMOTE)
+ {
+ $sniffer = $this->registry->create('Content_Type_Sniffer', array($this->file));
+ if ($sniffer->get_type() !== 'text/html')
+ {
+ return null;
+ }
+ }
+
+ if ($type & ~SIMPLEPIE_LOCATOR_NONE)
+ {
+ $this->get_base();
+ }
+
+ if ($type & SIMPLEPIE_LOCATOR_AUTODISCOVERY && $working = $this->autodiscovery())
+ {
+ return $working[0];
+ }
+
+ if ($type & (SIMPLEPIE_LOCATOR_LOCAL_EXTENSION | SIMPLEPIE_LOCATOR_LOCAL_BODY | SIMPLEPIE_LOCATOR_REMOTE_EXTENSION | SIMPLEPIE_LOCATOR_REMOTE_BODY) && $this->get_links())
+ {
+ if ($type & SIMPLEPIE_LOCATOR_LOCAL_EXTENSION && $working = $this->extension($this->local))
+ {
+ return $working[0];
+ }
+
+ if ($type & SIMPLEPIE_LOCATOR_LOCAL_BODY && $working = $this->body($this->local))
+ {
+ return $working[0];
+ }
+
+ if ($type & SIMPLEPIE_LOCATOR_REMOTE_EXTENSION && $working = $this->extension($this->elsewhere))
+ {
+ return $working[0];
+ }
+
+ if ($type & SIMPLEPIE_LOCATOR_REMOTE_BODY && $working = $this->body($this->elsewhere))
+ {
+ return $working[0];
+ }
+ }
+ return null;
+ }
+
+ public function is_feed($file, $check_html = false)
+ {
+ if ($file->method & SIMPLEPIE_FILE_SOURCE_REMOTE)
+ {
+ $sniffer = $this->registry->create('Content_Type_Sniffer', array($file));
+ $sniffed = $sniffer->get_type();
+ $mime_types = array('application/rss+xml', 'application/rdf+xml',
+ 'text/rdf', 'application/atom+xml', 'text/xml',
+ 'application/xml', 'application/x-rss+xml');
+ if ($check_html)
+ {
+ $mime_types[] = 'text/html';
+ }
+ if (in_array($sniffed, $mime_types))
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+ elseif ($file->method & SIMPLEPIE_FILE_SOURCE_LOCAL)
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ public function get_base()
+ {
+ if ($this->dom === null)
+ {
+ throw new SimplePie_Exception('DOMDocument not found, unable to use locator');
+ }
+ $this->http_base = $this->file->url;
+ $this->base = $this->http_base;
+ $elements = $this->dom->getElementsByTagName('base');
+ foreach ($elements as $element)
+ {
+ if ($element->hasAttribute('href'))
+ {
+ $base = $this->registry->call('Misc', 'absolutize_url', array(trim($element->getAttribute('href')), $this->http_base));
+ if ($base === false)
+ {
+ continue;
+ }
+ $this->base = $base;
+ $this->base_location = method_exists($element, 'getLineNo') ? $element->getLineNo() : 0;
+ break;
+ }
+ }
+ }
+
+ public function autodiscovery()
+ {
+ $done = array();
+ $feeds = array();
+ $feeds = array_merge($feeds, $this->search_elements_by_tag('link', $done, $feeds));
+ $feeds = array_merge($feeds, $this->search_elements_by_tag('a', $done, $feeds));
+ $feeds = array_merge($feeds, $this->search_elements_by_tag('area', $done, $feeds));
+
+ if (!empty($feeds))
+ {
+ return array_values($feeds);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ protected function search_elements_by_tag($name, &$done, $feeds)
+ {
+ if ($this->dom === null)
+ {
+ throw new SimplePie_Exception('DOMDocument not found, unable to use locator');
+ }
+
+ $links = $this->dom->getElementsByTagName($name);
+ foreach ($links as $link)
+ {
+ if ($this->checked_feeds === $this->max_checked_feeds)
+ {
+ break;
+ }
+ if ($link->hasAttribute('href') && $link->hasAttribute('rel'))
+ {
+ $rel = array_unique($this->registry->call('Misc', 'space_separated_tokens', array(strtolower($link->getAttribute('rel')))));
+ $line = method_exists($link, 'getLineNo') ? $link->getLineNo() : 1;
+
+ if ($this->base_location < $line)
+ {
+ $href = $this->registry->call('Misc', 'absolutize_url', array(trim($link->getAttribute('href')), $this->base));
+ }
+ else
+ {
+ $href = $this->registry->call('Misc', 'absolutize_url', array(trim($link->getAttribute('href')), $this->http_base));
+ }
+ if ($href === false)
+ {
+ continue;
+ }
+
+ if (!in_array($href, $done) && in_array('feed', $rel) || (in_array('alternate', $rel) && !in_array('stylesheet', $rel) && $link->hasAttribute('type') && in_array(strtolower($this->registry->call('Misc', 'parse_mime', array($link->getAttribute('type')))), array('text/html', 'application/rss+xml', 'application/atom+xml'))) && !isset($feeds[$href]))
+ {
+ $this->checked_feeds++;
+ $headers = array(
+ 'Accept' => 'application/atom+xml, application/rss+xml, application/rdf+xml;q=0.9, application/xml;q=0.8, text/xml;q=0.8, text/html;q=0.7, unknown/unknown;q=0.1, application/unknown;q=0.1, */*;q=0.1',
+ );
+ $feed = $this->registry->create('File', array($href, $this->timeout, 5, $headers, $this->useragent));
+ if ($feed->success && ($feed->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($feed->status_code === 200 || $feed->status_code > 206 && $feed->status_code < 300)) && $this->is_feed($feed, true))
+ {
+ $feeds[$href] = $feed;
+ }
+ }
+ $done[] = $href;
+ }
+ }
+
+ return $feeds;
+ }
+
+ public function get_links()
+ {
+ if ($this->dom === null)
+ {
+ throw new SimplePie_Exception('DOMDocument not found, unable to use locator');
+ }
+
+ $links = $this->dom->getElementsByTagName('a');
+ foreach ($links as $link)
+ {
+ if ($link->hasAttribute('href'))
+ {
+ $href = trim($link->getAttribute('href'));
+ $parsed = $this->registry->call('Misc', 'parse_url', array($href));
+ if ($parsed['scheme'] === '' || preg_match('/^(https?|feed)?$/i', $parsed['scheme']))
+ {
+ if (method_exists($link, 'getLineNo') && $this->base_location < $link->getLineNo())
+ {
+ $href = $this->registry->call('Misc', 'absolutize_url', array(trim($link->getAttribute('href')), $this->base));
+ }
+ else
+ {
+ $href = $this->registry->call('Misc', 'absolutize_url', array(trim($link->getAttribute('href')), $this->http_base));
+ }
+ if ($href === false)
+ {
+ continue;
+ }
+
+ $current = $this->registry->call('Misc', 'parse_url', array($this->file->url));
+
+ if ($parsed['authority'] === '' || $parsed['authority'] === $current['authority'])
+ {
+ $this->local[] = $href;
+ }
+ else
+ {
+ $this->elsewhere[] = $href;
+ }
+ }
+ }
+ }
+ $this->local = array_unique($this->local);
+ $this->elsewhere = array_unique($this->elsewhere);
+ if (!empty($this->local) || !empty($this->elsewhere))
+ {
+ return true;
+ }
+ return null;
+ }
+
+ public function get_rel_link($rel)
+ {
+ if ($this->dom === null)
+ {
+ throw new SimplePie_Exception('DOMDocument not found, unable to use '.
+ 'locator');
+ }
+ if (!class_exists('DOMXpath'))
+ {
+ throw new SimplePie_Exception('DOMXpath not found, unable to use '.
+ 'get_rel_link');
+ }
+
+ $xpath = new DOMXpath($this->dom);
+ $query = '//a[@rel and @href] | //link[@rel and @href]';
+ foreach ($xpath->query($query) as $link)
+ {
+ $href = trim($link->getAttribute('href'));
+ $parsed = $this->registry->call('Misc', 'parse_url', array($href));
+ if ($parsed['scheme'] === '' ||
+ preg_match('/^https?$/i', $parsed['scheme']))
+ {
+ if (method_exists($link, 'getLineNo') &&
+ $this->base_location < $link->getLineNo())
+ {
+ $href =
+ $this->registry->call('Misc', 'absolutize_url',
+ array(trim($link->getAttribute('href')),
+ $this->base));
+ }
+ else
+ {
+ $href =
+ $this->registry->call('Misc', 'absolutize_url',
+ array(trim($link->getAttribute('href')),
+ $this->http_base));
+ }
+ if ($href === false)
+ {
+ return null;
+ }
+ $rel_values = explode(' ', strtolower($link->getAttribute('rel')));
+ if (in_array($rel, $rel_values))
+ {
+ return $href;
+ }
+ }
+ }
+ return null;
+ }
+
+ public function extension(&$array)
+ {
+ foreach ($array as $key => $value)
+ {
+ if ($this->checked_feeds === $this->max_checked_feeds)
+ {
+ break;
+ }
+ if (in_array(strtolower(strrchr($value, '.')), array('.rss', '.rdf', '.atom', '.xml')))
+ {
+ $this->checked_feeds++;
+
+ $headers = array(
+ 'Accept' => 'application/atom+xml, application/rss+xml, application/rdf+xml;q=0.9, application/xml;q=0.8, text/xml;q=0.8, text/html;q=0.7, unknown/unknown;q=0.1, application/unknown;q=0.1, */*;q=0.1',
+ );
+ $feed = $this->registry->create('File', array($value, $this->timeout, 5, $headers, $this->useragent));
+ if ($feed->success && ($feed->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($feed->status_code === 200 || $feed->status_code > 206 && $feed->status_code < 300)) && $this->is_feed($feed))
+ {
+ return array($feed);
+ }
+ else
+ {
+ unset($array[$key]);
+ }
+ }
+ }
+ return null;
+ }
+
+ public function body(&$array)
+ {
+ foreach ($array as $key => $value)
+ {
+ if ($this->checked_feeds === $this->max_checked_feeds)
+ {
+ break;
+ }
+ if (preg_match('/(rss|rdf|atom|xml)/i', $value))
+ {
+ $this->checked_feeds++;
+ $headers = array(
+ 'Accept' => 'application/atom+xml, application/rss+xml, application/rdf+xml;q=0.9, application/xml;q=0.8, text/xml;q=0.8, text/html;q=0.7, unknown/unknown;q=0.1, application/unknown;q=0.1, */*;q=0.1',
+ );
+ $feed = $this->registry->create('File', array($value, $this->timeout, 5, null, $this->useragent));
+ if ($feed->success && ($feed->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($feed->status_code === 200 || $feed->status_code > 206 && $feed->status_code < 300)) && $this->is_feed($feed))
+ {
+ return array($feed);
+ }
+ else
+ {
+ unset($array[$key]);
+ }
+ }
+ }
+ return null;
+ }
+}
+
diff --git a/vendor/simplepie/simplepie/library/SimplePie/Misc.php b/vendor/simplepie/simplepie/library/SimplePie/Misc.php
new file mode 100644
index 000000000..2e3107eb4
--- /dev/null
+++ b/vendor/simplepie/simplepie/library/SimplePie/Misc.php
@@ -0,0 +1,2279 @@
+<?php
+/**
+ * SimplePie
+ *
+ * A PHP-Based RSS and Atom Feed Framework.
+ * Takes the hard work out of managing a complete RSS/Atom solution.
+ *
+ * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * * Neither the name of the SimplePie Team nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
+ * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @package SimplePie
+ * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @author Ryan Parman
+ * @author Geoffrey Sneddon
+ * @author Ryan McCue
+ * @link http://simplepie.org/ SimplePie
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ */
+
+/**
+ * Miscellanous utilities
+ *
+ * @package SimplePie
+ */
+class SimplePie_Misc
+{
+ public static function time_hms($seconds)
+ {
+ $time = '';
+
+ $hours = floor($seconds / 3600);
+ $remainder = $seconds % 3600;
+ if ($hours > 0)
+ {
+ $time .= $hours.':';
+ }
+
+ $minutes = floor($remainder / 60);
+ $seconds = $remainder % 60;
+ if ($minutes < 10 && $hours > 0)
+ {
+ $minutes = '0' . $minutes;
+ }
+ if ($seconds < 10)
+ {
+ $seconds = '0' . $seconds;
+ }
+
+ $time .= $minutes.':';
+ $time .= $seconds;
+
+ return $time;
+ }
+
+ public static function absolutize_url($relative, $base)
+ {
+ $iri = SimplePie_IRI::absolutize(new SimplePie_IRI($base), $relative);
+ if ($iri === false)
+ {
+ return false;
+ }
+ return $iri->get_uri();
+ }
+
+ /**
+ * Get a HTML/XML element from a HTML string
+ *
+ * @deprecated Use DOMDocument instead (parsing HTML with regex is bad!)
+ * @param string $realname Element name (including namespace prefix if applicable)
+ * @param string $string HTML document
+ * @return array
+ */
+ public static function get_element($realname, $string)
+ {
+ $return = array();
+ $name = preg_quote($realname, '/');
+ if (preg_match_all("/<($name)" . SIMPLEPIE_PCRE_HTML_ATTRIBUTE . "(>(.*)<\/$name>|(\/)?>)/siU", $string, $matches, PREG_SET_ORDER | PREG_OFFSET_CAPTURE))
+ {
+ for ($i = 0, $total_matches = count($matches); $i < $total_matches; $i++)
+ {
+ $return[$i]['tag'] = $realname;
+ $return[$i]['full'] = $matches[$i][0][0];
+ $return[$i]['offset'] = $matches[$i][0][1];
+ if (strlen($matches[$i][3][0]) <= 2)
+ {
+ $return[$i]['self_closing'] = true;
+ }
+ else
+ {
+ $return[$i]['self_closing'] = false;
+ $return[$i]['content'] = $matches[$i][4][0];
+ }
+ $return[$i]['attribs'] = array();
+ if (isset($matches[$i][2][0]) && preg_match_all('/[\x09\x0A\x0B\x0C\x0D\x20]+([^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3E][^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3D\x3E]*)(?:[\x09\x0A\x0B\x0C\x0D\x20]*=[\x09\x0A\x0B\x0C\x0D\x20]*(?:"([^"]*)"|\'([^\']*)\'|([^\x09\x0A\x0B\x0C\x0D\x20\x22\x27\x3E][^\x09\x0A\x0B\x0C\x0D\x20\x3E]*)?))?/', ' ' . $matches[$i][2][0] . ' ', $attribs, PREG_SET_ORDER))
+ {
+ for ($j = 0, $total_attribs = count($attribs); $j < $total_attribs; $j++)
+ {
+ if (count($attribs[$j]) === 2)
+ {
+ $attribs[$j][2] = $attribs[$j][1];
+ }
+ $return[$i]['attribs'][strtolower($attribs[$j][1])]['data'] = SimplePie_Misc::entities_decode(end($attribs[$j]));
+ }
+ }
+ }
+ }
+ return $return;
+ }
+
+ public static function element_implode($element)
+ {
+ $full = "<$element[tag]";
+ foreach ($element['attribs'] as $key => $value)
+ {
+ $key = strtolower($key);
+ $full .= " $key=\"" . htmlspecialchars($value['data'], ENT_COMPAT, 'UTF-8') . '"';
+ }
+ if ($element['self_closing'])
+ {
+ $full .= ' />';
+ }
+ else
+ {
+ $full .= ">$element[content]</$element[tag]>";
+ }
+ return $full;
+ }
+
+ public static function error($message, $level, $file, $line)
+ {
+ if ((ini_get('error_reporting') & $level) > 0)
+ {
+ switch ($level)
+ {
+ case E_USER_ERROR:
+ $note = 'PHP Error';
+ break;
+ case E_USER_WARNING:
+ $note = 'PHP Warning';
+ break;
+ case E_USER_NOTICE:
+ $note = 'PHP Notice';
+ break;
+ default:
+ $note = 'Unknown Error';
+ break;
+ }
+
+ $log_error = true;
+ if (!function_exists('error_log'))
+ {
+ $log_error = false;
+ }
+
+ $log_file = @ini_get('error_log');
+ if (!empty($log_file) && ('syslog' !== $log_file) && !@is_writable($log_file))
+ {
+ $log_error = false;
+ }
+
+ if ($log_error)
+ {
+ @error_log("$note: $message in $file on line $line", 0);
+ }
+ }
+
+ return $message;
+ }
+
+ public static function fix_protocol($url, $http = 1)
+ {
+ $url = SimplePie_Misc::normalize_url($url);
+ $parsed = SimplePie_Misc::parse_url($url);
+ if ($parsed['scheme'] !== '' && $parsed['scheme'] !== 'http' && $parsed['scheme'] !== 'https')
+ {
+ return SimplePie_Misc::fix_protocol(SimplePie_Misc::compress_parse_url('http', $parsed['authority'], $parsed['path'], $parsed['query'], $parsed['fragment']), $http);
+ }
+
+ if ($parsed['scheme'] === '' && $parsed['authority'] === '' && !file_exists($url))
+ {
+ return SimplePie_Misc::fix_protocol(SimplePie_Misc::compress_parse_url('http', $parsed['path'], '', $parsed['query'], $parsed['fragment']), $http);
+ }
+
+ if ($http === 2 && $parsed['scheme'] !== '')
+ {
+ return "feed:$url";
+ }
+ elseif ($http === 3 && strtolower($parsed['scheme']) === 'http')
+ {
+ return substr_replace($url, 'podcast', 0, 4);
+ }
+ elseif ($http === 4 && strtolower($parsed['scheme']) === 'http')
+ {
+ return substr_replace($url, 'itpc', 0, 4);
+ }
+ else
+ {
+ return $url;
+ }
+ }
+
+ public static function array_merge_recursive($array1, $array2)
+ {
+ foreach ($array2 as $key => $value)
+ {
+ if (is_array($value))
+ {
+ $array1[$key] = SimplePie_Misc::array_merge_recursive($array1[$key], $value);
+ }
+ else
+ {
+ $array1[$key] = $value;
+ }
+ }
+
+ return $array1;
+ }
+
+ public static function parse_url($url)
+ {
+ $iri = new SimplePie_IRI($url);
+ return array(
+ 'scheme' => (string) $iri->scheme,
+ 'authority' => (string) $iri->authority,
+ 'path' => (string) $iri->path,
+ 'query' => (string) $iri->query,
+ 'fragment' => (string) $iri->fragment
+ );
+ }
+
+ public static function compress_parse_url($scheme = '', $authority = '', $path = '', $query = '', $fragment = '')
+ {
+ $iri = new SimplePie_IRI('');
+ $iri->scheme = $scheme;
+ $iri->authority = $authority;
+ $iri->path = $path;
+ $iri->query = $query;
+ $iri->fragment = $fragment;
+ return $iri->get_uri();
+ }
+
+ public static function normalize_url($url)
+ {
+ $iri = new SimplePie_IRI($url);
+ return $iri->get_uri();
+ }
+
+ public static function percent_encoding_normalization($match)
+ {
+ $integer = hexdec($match[1]);
+ if ($integer >= 0x41 && $integer <= 0x5A || $integer >= 0x61 && $integer <= 0x7A || $integer >= 0x30 && $integer <= 0x39 || $integer === 0x2D || $integer === 0x2E || $integer === 0x5F || $integer === 0x7E)
+ {
+ return chr($integer);
+ }
+ else
+ {
+ return strtoupper($match[0]);
+ }
+ }
+
+ /**
+ * Converts a Windows-1252 encoded string to a UTF-8 encoded string
+ *
+ * @static
+ * @param string $string Windows-1252 encoded string
+ * @return string UTF-8 encoded string
+ */
+ public static function windows_1252_to_utf8($string)
+ {
+ static $convert_table = array("\x80" => "\xE2\x82\xAC", "\x81" => "\xEF\xBF\xBD", "\x82" => "\xE2\x80\x9A", "\x83" => "\xC6\x92", "\x84" => "\xE2\x80\x9E", "\x85" => "\xE2\x80\xA6", "\x86" => "\xE2\x80\xA0", "\x87" => "\xE2\x80\xA1", "\x88" => "\xCB\x86", "\x89" => "\xE2\x80\xB0", "\x8A" => "\xC5\xA0", "\x8B" => "\xE2\x80\xB9", "\x8C" => "\xC5\x92", "\x8D" => "\xEF\xBF\xBD", "\x8E" => "\xC5\xBD", "\x8F" => "\xEF\xBF\xBD", "\x90" => "\xEF\xBF\xBD", "\x91" => "\xE2\x80\x98", "\x92" => "\xE2\x80\x99", "\x93" => "\xE2\x80\x9C", "\x94" => "\xE2\x80\x9D", "\x95" => "\xE2\x80\xA2", "\x96" => "\xE2\x80\x93", "\x97" => "\xE2\x80\x94", "\x98" => "\xCB\x9C", "\x99" => "\xE2\x84\xA2", "\x9A" => "\xC5\xA1", "\x9B" => "\xE2\x80\xBA", "\x9C" => "\xC5\x93", "\x9D" => "\xEF\xBF\xBD", "\x9E" => "\xC5\xBE", "\x9F" => "\xC5\xB8", "\xA0" => "\xC2\xA0", "\xA1" => "\xC2\xA1", "\xA2" => "\xC2\xA2", "\xA3" => "\xC2\xA3", "\xA4" => "\xC2\xA4", "\xA5" => "\xC2\xA5", "\xA6" => "\xC2\xA6", "\xA7" => "\xC2\xA7", "\xA8" => "\xC2\xA8", "\xA9" => "\xC2\xA9", "\xAA" => "\xC2\xAA", "\xAB" => "\xC2\xAB", "\xAC" => "\xC2\xAC", "\xAD" => "\xC2\xAD", "\xAE" => "\xC2\xAE", "\xAF" => "\xC2\xAF", "\xB0" => "\xC2\xB0", "\xB1" => "\xC2\xB1", "\xB2" => "\xC2\xB2", "\xB3" => "\xC2\xB3", "\xB4" => "\xC2\xB4", "\xB5" => "\xC2\xB5", "\xB6" => "\xC2\xB6", "\xB7" => "\xC2\xB7", "\xB8" => "\xC2\xB8", "\xB9" => "\xC2\xB9", "\xBA" => "\xC2\xBA", "\xBB" => "\xC2\xBB", "\xBC" => "\xC2\xBC", "\xBD" => "\xC2\xBD", "\xBE" => "\xC2\xBE", "\xBF" => "\xC2\xBF", "\xC0" => "\xC3\x80", "\xC1" => "\xC3\x81", "\xC2" => "\xC3\x82", "\xC3" => "\xC3\x83", "\xC4" => "\xC3\x84", "\xC5" => "\xC3\x85", "\xC6" => "\xC3\x86", "\xC7" => "\xC3\x87", "\xC8" => "\xC3\x88", "\xC9" => "\xC3\x89", "\xCA" => "\xC3\x8A", "\xCB" => "\xC3\x8B", "\xCC" => "\xC3\x8C", "\xCD" => "\xC3\x8D", "\xCE" => "\xC3\x8E", "\xCF" => "\xC3\x8F", "\xD0" => "\xC3\x90", "\xD1" => "\xC3\x91", "\xD2" => "\xC3\x92", "\xD3" => "\xC3\x93", "\xD4" => "\xC3\x94", "\xD5" => "\xC3\x95", "\xD6" => "\xC3\x96", "\xD7" => "\xC3\x97", "\xD8" => "\xC3\x98", "\xD9" => "\xC3\x99", "\xDA" => "\xC3\x9A", "\xDB" => "\xC3\x9B", "\xDC" => "\xC3\x9C", "\xDD" => "\xC3\x9D", "\xDE" => "\xC3\x9E", "\xDF" => "\xC3\x9F", "\xE0" => "\xC3\xA0", "\xE1" => "\xC3\xA1", "\xE2" => "\xC3\xA2", "\xE3" => "\xC3\xA3", "\xE4" => "\xC3\xA4", "\xE5" => "\xC3\xA5", "\xE6" => "\xC3\xA6", "\xE7" => "\xC3\xA7", "\xE8" => "\xC3\xA8", "\xE9" => "\xC3\xA9", "\xEA" => "\xC3\xAA", "\xEB" => "\xC3\xAB", "\xEC" => "\xC3\xAC", "\xED" => "\xC3\xAD", "\xEE" => "\xC3\xAE", "\xEF" => "\xC3\xAF", "\xF0" => "\xC3\xB0", "\xF1" => "\xC3\xB1", "\xF2" => "\xC3\xB2", "\xF3" => "\xC3\xB3", "\xF4" => "\xC3\xB4", "\xF5" => "\xC3\xB5", "\xF6" => "\xC3\xB6", "\xF7" => "\xC3\xB7", "\xF8" => "\xC3\xB8", "\xF9" => "\xC3\xB9", "\xFA" => "\xC3\xBA", "\xFB" => "\xC3\xBB", "\xFC" => "\xC3\xBC", "\xFD" => "\xC3\xBD", "\xFE" => "\xC3\xBE", "\xFF" => "\xC3\xBF");
+
+ return strtr($string, $convert_table);
+ }
+
+ /**
+ * Change a string from one encoding to another
+ *
+ * @param string $data Raw data in $input encoding
+ * @param string $input Encoding of $data
+ * @param string $output Encoding you want
+ * @return string|boolean False if we can't convert it
+ */
+ public static function change_encoding($data, $input, $output)
+ {
+ $input = SimplePie_Misc::encoding($input);
+ $output = SimplePie_Misc::encoding($output);
+
+ // We fail to fail on non US-ASCII bytes
+ if ($input === 'US-ASCII')
+ {
+ static $non_ascii_octects = '';
+ if (!$non_ascii_octects)
+ {
+ for ($i = 0x80; $i <= 0xFF; $i++)
+ {
+ $non_ascii_octects .= chr($i);
+ }
+ }
+ $data = substr($data, 0, strcspn($data, $non_ascii_octects));
+ }
+
+ // This is first, as behaviour of this is completely predictable
+ if ($input === 'windows-1252' && $output === 'UTF-8')
+ {
+ return SimplePie_Misc::windows_1252_to_utf8($data);
+ }
+ // This is second, as behaviour of this varies only with PHP version (the middle part of this expression checks the encoding is supported).
+ elseif (function_exists('mb_convert_encoding') && ($return = SimplePie_Misc::change_encoding_mbstring($data, $input, $output)))
+ {
+ return $return;
+ }
+ // This is third, as behaviour of this varies with OS userland and PHP version
+ elseif (function_exists('iconv') && ($return = SimplePie_Misc::change_encoding_iconv($data, $input, $output)))
+ {
+ return $return;
+ }
+ // This is last, as behaviour of this varies with OS userland and PHP version
+ elseif (class_exists('\UConverter') && ($return = SimplePie_Misc::change_encoding_uconverter($data, $input, $output)))
+ {
+ return $return;
+ }
+ // If we can't do anything, just fail
+ else
+ {
+ return false;
+ }
+ }
+
+ protected static function change_encoding_mbstring($data, $input, $output)
+ {
+ if ($input === 'windows-949')
+ {
+ $input = 'EUC-KR';
+ }
+ if ($output === 'windows-949')
+ {
+ $output = 'EUC-KR';
+ }
+ if ($input === 'Windows-31J')
+ {
+ $input = 'SJIS';
+ }
+ if ($output === 'Windows-31J')
+ {
+ $output = 'SJIS';
+ }
+
+ // Check that the encoding is supported
+ if (@mb_convert_encoding("\x80", 'UTF-16BE', $input) === "\x00\x80")
+ {
+ return false;
+ }
+ if (!in_array($input, mb_list_encodings()))
+ {
+ return false;
+ }
+
+ // Let's do some conversion
+ if ($return = @mb_convert_encoding($data, $output, $input))
+ {
+ return $return;
+ }
+
+ return false;
+ }
+
+ protected static function change_encoding_iconv($data, $input, $output)
+ {
+ return @iconv($input, $output, $data);
+ }
+
+ /**
+ * @param string $data
+ * @param string $input
+ * @param string $output
+ * @return string|false
+ */
+ protected static function change_encoding_uconverter($data, $input, $output)
+ {
+ return @\UConverter::transcode($data, $output, $input);
+ }
+
+ /**
+ * Normalize an encoding name
+ *
+ * This is automatically generated by create.php
+ *
+ * To generate it, run `php create.php` on the command line, and copy the
+ * output to replace this function.
+ *
+ * @param string $charset Character set to standardise
+ * @return string Standardised name
+ */
+ public static function encoding($charset)
+ {
+ // Normalization from UTS #22
+ switch (strtolower(preg_replace('/(?:[^a-zA-Z0-9]+|([^0-9])0+)/', '\1', $charset)))
+ {
+ case 'adobestandardencoding':
+ case 'csadobestandardencoding':
+ return 'Adobe-Standard-Encoding';
+
+ case 'adobesymbolencoding':
+ case 'cshppsmath':
+ return 'Adobe-Symbol-Encoding';
+
+ case 'ami1251':
+ case 'amiga1251':
+ return 'Amiga-1251';
+
+ case 'ansix31101983':
+ case 'csat5001983':
+ case 'csiso99naplps':
+ case 'isoir99':
+ case 'naplps':
+ return 'ANSI_X3.110-1983';
+
+ case 'arabic7':
+ case 'asmo449':
+ case 'csiso89asmo449':
+ case 'iso9036':
+ case 'isoir89':
+ return 'ASMO_449';
+
+ case 'big5':
+ case 'csbig5':
+ return 'Big5';
+
+ case 'big5hkscs':
+ return 'Big5-HKSCS';
+
+ case 'bocu1':
+ case 'csbocu1':
+ return 'BOCU-1';
+
+ case 'brf':
+ case 'csbrf':
+ return 'BRF';
+
+ case 'bs4730':
+ case 'csiso4unitedkingdom':
+ case 'gb':
+ case 'iso646gb':
+ case 'isoir4':
+ case 'uk':
+ return 'BS_4730';
+
+ case 'bsviewdata':
+ case 'csiso47bsviewdata':
+ case 'isoir47':
+ return 'BS_viewdata';
+
+ case 'cesu8':
+ case 'cscesu8':
+ return 'CESU-8';
+
+ case 'ca':
+ case 'csa71':
+ case 'csaz243419851':
+ case 'csiso121canadian1':
+ case 'iso646ca':
+ case 'isoir121':
+ return 'CSA_Z243.4-1985-1';
+
+ case 'csa72':
+ case 'csaz243419852':
+ case 'csiso122canadian2':
+ case 'iso646ca2':
+ case 'isoir122':
+ return 'CSA_Z243.4-1985-2';
+
+ case 'csaz24341985gr':
+ case 'csiso123csaz24341985gr':
+ case 'isoir123':
+ return 'CSA_Z243.4-1985-gr';
+
+ case 'csiso139csn369103':
+ case 'csn369103':
+ case 'isoir139':
+ return 'CSN_369103';
+
+ case 'csdecmcs':
+ case 'dec':
+ case 'decmcs':
+ return 'DEC-MCS';
+
+ case 'csiso21german':
+ case 'de':
+ case 'din66003':
+ case 'iso646de':
+ case 'isoir21':
+ return 'DIN_66003';
+
+ case 'csdkus':
+ case 'dkus':
+ return 'dk-us';
+
+ case 'csiso646danish':
+ case 'dk':
+ case 'ds2089':
+ case 'iso646dk':
+ return 'DS_2089';
+
+ case 'csibmebcdicatde':
+ case 'ebcdicatde':
+ return 'EBCDIC-AT-DE';
+
+ case 'csebcdicatdea':
+ case 'ebcdicatdea':
+ return 'EBCDIC-AT-DE-A';
+
+ case 'csebcdiccafr':
+ case 'ebcdiccafr':
+ return 'EBCDIC-CA-FR';
+
+ case 'csebcdicdkno':
+ case 'ebcdicdkno':
+ return 'EBCDIC-DK-NO';
+
+ case 'csebcdicdknoa':
+ case 'ebcdicdknoa':
+ return 'EBCDIC-DK-NO-A';
+
+ case 'csebcdices':
+ case 'ebcdices':
+ return 'EBCDIC-ES';
+
+ case 'csebcdicesa':
+ case 'ebcdicesa':
+ return 'EBCDIC-ES-A';
+
+ case 'csebcdicess':
+ case 'ebcdicess':
+ return 'EBCDIC-ES-S';
+
+ case 'csebcdicfise':
+ case 'ebcdicfise':
+ return 'EBCDIC-FI-SE';
+
+ case 'csebcdicfisea':
+ case 'ebcdicfisea':
+ return 'EBCDIC-FI-SE-A';
+
+ case 'csebcdicfr':
+ case 'ebcdicfr':
+ return 'EBCDIC-FR';
+
+ case 'csebcdicit':
+ case 'ebcdicit':
+ return 'EBCDIC-IT';
+
+ case 'csebcdicpt':
+ case 'ebcdicpt':
+ return 'EBCDIC-PT';
+
+ case 'csebcdicuk':
+ case 'ebcdicuk':
+ return 'EBCDIC-UK';
+
+ case 'csebcdicus':
+ case 'ebcdicus':
+ return 'EBCDIC-US';
+
+ case 'csiso111ecmacyrillic':
+ case 'ecmacyrillic':
+ case 'isoir111':
+ case 'koi8e':
+ return 'ECMA-cyrillic';
+
+ case 'csiso17spanish':
+ case 'es':
+ case 'iso646es':
+ case 'isoir17':
+ return 'ES';
+
+ case 'csiso85spanish2':
+ case 'es2':
+ case 'iso646es2':
+ case 'isoir85':
+ return 'ES2';
+
+ case 'cseucpkdfmtjapanese':
+ case 'eucjp':
+ case 'extendedunixcodepackedformatforjapanese':
+ return 'EUC-JP';
+
+ case 'cseucfixwidjapanese':
+ case 'extendedunixcodefixedwidthforjapanese':
+ return 'Extended_UNIX_Code_Fixed_Width_for_Japanese';
+
+ case 'gb18030':
+ return 'GB18030';
+
+ case 'chinese':
+ case 'cp936':
+ case 'csgb2312':
+ case 'csiso58gb231280':
+ case 'gb2312':
+ case 'gb231280':
+ case 'gbk':
+ case 'isoir58':
+ case 'ms936':
+ case 'windows936':
+ return 'GBK';
+
+ case 'cn':
+ case 'csiso57gb1988':
+ case 'gb198880':
+ case 'iso646cn':
+ case 'isoir57':
+ return 'GB_1988-80';
+
+ case 'csiso153gost1976874':
+ case 'gost1976874':
+ case 'isoir153':
+ case 'stsev35888':
+ return 'GOST_19768-74';
+
+ case 'csiso150':
+ case 'csiso150greekccitt':
+ case 'greekccitt':
+ case 'isoir150':
+ return 'greek-ccitt';
+
+ case 'csiso88greek7':
+ case 'greek7':
+ case 'isoir88':
+ return 'greek7';
+
+ case 'csiso18greek7old':
+ case 'greek7old':
+ case 'isoir18':
+ return 'greek7-old';
+
+ case 'cshpdesktop':
+ case 'hpdesktop':
+ return 'HP-DeskTop';
+
+ case 'cshplegal':
+ case 'hplegal':
+ return 'HP-Legal';
+
+ case 'cshpmath8':
+ case 'hpmath8':
+ return 'HP-Math8';
+
+ case 'cshppifont':
+ case 'hppifont':
+ return 'HP-Pi-font';
+
+ case 'cshproman8':
+ case 'hproman8':
+ case 'r8':
+ case 'roman8':
+ return 'hp-roman8';
+
+ case 'hzgb2312':
+ return 'HZ-GB-2312';
+
+ case 'csibmsymbols':
+ case 'ibmsymbols':
+ return 'IBM-Symbols';
+
+ case 'csibmthai':
+ case 'ibmthai':
+ return 'IBM-Thai';
+
+ case 'cp37':
+ case 'csibm37':
+ case 'ebcdiccpca':
+ case 'ebcdiccpnl':
+ case 'ebcdiccpus':
+ case 'ebcdiccpwt':
+ case 'ibm37':
+ return 'IBM037';
+
+ case 'cp38':
+ case 'csibm38':
+ case 'ebcdicint':
+ case 'ibm38':
+ return 'IBM038';
+
+ case 'cp273':
+ case 'csibm273':
+ case 'ibm273':
+ return 'IBM273';
+
+ case 'cp274':
+ case 'csibm274':
+ case 'ebcdicbe':
+ case 'ibm274':
+ return 'IBM274';
+
+ case 'cp275':
+ case 'csibm275':
+ case 'ebcdicbr':
+ case 'ibm275':
+ return 'IBM275';
+
+ case 'csibm277':
+ case 'ebcdiccpdk':
+ case 'ebcdiccpno':
+ case 'ibm277':
+ return 'IBM277';
+
+ case 'cp278':
+ case 'csibm278':
+ case 'ebcdiccpfi':
+ case 'ebcdiccpse':
+ case 'ibm278':
+ return 'IBM278';
+
+ case 'cp280':
+ case 'csibm280':
+ case 'ebcdiccpit':
+ case 'ibm280':
+ return 'IBM280';
+
+ case 'cp281':
+ case 'csibm281':
+ case 'ebcdicjpe':
+ case 'ibm281':
+ return 'IBM281';
+
+ case 'cp284':
+ case 'csibm284':
+ case 'ebcdiccpes':
+ case 'ibm284':
+ return 'IBM284';
+
+ case 'cp285':
+ case 'csibm285':
+ case 'ebcdiccpgb':
+ case 'ibm285':
+ return 'IBM285';
+
+ case 'cp290':
+ case 'csibm290':
+ case 'ebcdicjpkana':
+ case 'ibm290':
+ return 'IBM290';
+
+ case 'cp297':
+ case 'csibm297':
+ case 'ebcdiccpfr':
+ case 'ibm297':
+ return 'IBM297';
+
+ case 'cp420':
+ case 'csibm420':
+ case 'ebcdiccpar1':
+ case 'ibm420':
+ return 'IBM420';
+
+ case 'cp423':
+ case 'csibm423':
+ case 'ebcdiccpgr':
+ case 'ibm423':
+ return 'IBM423';
+
+ case 'cp424':
+ case 'csibm424':
+ case 'ebcdiccphe':
+ case 'ibm424':
+ return 'IBM424';
+
+ case '437':
+ case 'cp437':
+ case 'cspc8codepage437':
+ case 'ibm437':
+ return 'IBM437';
+
+ case 'cp500':
+ case 'csibm500':
+ case 'ebcdiccpbe':
+ case 'ebcdiccpch':
+ case 'ibm500':
+ return 'IBM500';
+
+ case 'cp775':
+ case 'cspc775baltic':
+ case 'ibm775':
+ return 'IBM775';
+
+ case '850':
+ case 'cp850':
+ case 'cspc850multilingual':
+ case 'ibm850':
+ return 'IBM850';
+
+ case '851':
+ case 'cp851':
+ case 'csibm851':
+ case 'ibm851':
+ return 'IBM851';
+
+ case '852':
+ case 'cp852':
+ case 'cspcp852':
+ case 'ibm852':
+ return 'IBM852';
+
+ case '855':
+ case 'cp855':
+ case 'csibm855':
+ case 'ibm855':
+ return 'IBM855';
+
+ case '857':
+ case 'cp857':
+ case 'csibm857':
+ case 'ibm857':
+ return 'IBM857';
+
+ case 'ccsid858':
+ case 'cp858':
+ case 'ibm858':
+ case 'pcmultilingual850euro':
+ return 'IBM00858';
+
+ case '860':
+ case 'cp860':
+ case 'csibm860':
+ case 'ibm860':
+ return 'IBM860';
+
+ case '861':
+ case 'cp861':
+ case 'cpis':
+ case 'csibm861':
+ case 'ibm861':
+ return 'IBM861';
+
+ case '862':
+ case 'cp862':
+ case 'cspc862latinhebrew':
+ case 'ibm862':
+ return 'IBM862';
+
+ case '863':
+ case 'cp863':
+ case 'csibm863':
+ case 'ibm863':
+ return 'IBM863';
+
+ case 'cp864':
+ case 'csibm864':
+ case 'ibm864':
+ return 'IBM864';
+
+ case '865':
+ case 'cp865':
+ case 'csibm865':
+ case 'ibm865':
+ return 'IBM865';
+
+ case '866':
+ case 'cp866':
+ case 'csibm866':
+ case 'ibm866':
+ return 'IBM866';
+
+ case 'cp868':
+ case 'cpar':
+ case 'csibm868':
+ case 'ibm868':
+ return 'IBM868';
+
+ case '869':
+ case 'cp869':
+ case 'cpgr':
+ case 'csibm869':
+ case 'ibm869':
+ return 'IBM869';
+
+ case 'cp870':
+ case 'csibm870':
+ case 'ebcdiccproece':
+ case 'ebcdiccpyu':
+ case 'ibm870':
+ return 'IBM870';
+
+ case 'cp871':
+ case 'csibm871':
+ case 'ebcdiccpis':
+ case 'ibm871':
+ return 'IBM871';
+
+ case 'cp880':
+ case 'csibm880':
+ case 'ebcdiccyrillic':
+ case 'ibm880':
+ return 'IBM880';
+
+ case 'cp891':
+ case 'csibm891':
+ case 'ibm891':
+ return 'IBM891';
+
+ case 'cp903':
+ case 'csibm903':
+ case 'ibm903':
+ return 'IBM903';
+
+ case '904':
+ case 'cp904':
+ case 'csibbm904':
+ case 'ibm904':
+ return 'IBM904';
+
+ case 'cp905':
+ case 'csibm905':
+ case 'ebcdiccptr':
+ case 'ibm905':
+ return 'IBM905';
+
+ case 'cp918':
+ case 'csibm918':
+ case 'ebcdiccpar2':
+ case 'ibm918':
+ return 'IBM918';
+
+ case 'ccsid924':
+ case 'cp924':
+ case 'ebcdiclatin9euro':
+ case 'ibm924':
+ return 'IBM00924';
+
+ case 'cp1026':
+ case 'csibm1026':
+ case 'ibm1026':
+ return 'IBM1026';
+
+ case 'ibm1047':
+ return 'IBM1047';
+
+ case 'ccsid1140':
+ case 'cp1140':
+ case 'ebcdicus37euro':
+ case 'ibm1140':
+ return 'IBM01140';
+
+ case 'ccsid1141':
+ case 'cp1141':
+ case 'ebcdicde273euro':
+ case 'ibm1141':
+ return 'IBM01141';
+
+ case 'ccsid1142':
+ case 'cp1142':
+ case 'ebcdicdk277euro':
+ case 'ebcdicno277euro':
+ case 'ibm1142':
+ return 'IBM01142';
+
+ case 'ccsid1143':
+ case 'cp1143':
+ case 'ebcdicfi278euro':
+ case 'ebcdicse278euro':
+ case 'ibm1143':
+ return 'IBM01143';
+
+ case 'ccsid1144':
+ case 'cp1144':
+ case 'ebcdicit280euro':
+ case 'ibm1144':
+ return 'IBM01144';
+
+ case 'ccsid1145':
+ case 'cp1145':
+ case 'ebcdices284euro':
+ case 'ibm1145':
+ return 'IBM01145';
+
+ case 'ccsid1146':
+ case 'cp1146':
+ case 'ebcdicgb285euro':
+ case 'ibm1146':
+ return 'IBM01146';
+
+ case 'ccsid1147':
+ case 'cp1147':
+ case 'ebcdicfr297euro':
+ case 'ibm1147':
+ return 'IBM01147';
+
+ case 'ccsid1148':
+ case 'cp1148':
+ case 'ebcdicinternational500euro':
+ case 'ibm1148':
+ return 'IBM01148';
+
+ case 'ccsid1149':
+ case 'cp1149':
+ case 'ebcdicis871euro':
+ case 'ibm1149':
+ return 'IBM01149';
+
+ case 'csiso143iecp271':
+ case 'iecp271':
+ case 'isoir143':
+ return 'IEC_P27-1';
+
+ case 'csiso49inis':
+ case 'inis':
+ case 'isoir49':
+ return 'INIS';
+
+ case 'csiso50inis8':
+ case 'inis8':
+ case 'isoir50':
+ return 'INIS-8';
+
+ case 'csiso51iniscyrillic':
+ case 'iniscyrillic':
+ case 'isoir51':
+ return 'INIS-cyrillic';
+
+ case 'csinvariant':
+ case 'invariant':
+ return 'INVARIANT';
+
+ case 'iso2022cn':
+ return 'ISO-2022-CN';
+
+ case 'iso2022cnext':
+ return 'ISO-2022-CN-EXT';
+
+ case 'csiso2022jp':
+ case 'iso2022jp':
+ return 'ISO-2022-JP';
+
+ case 'csiso2022jp2':
+ case 'iso2022jp2':
+ return 'ISO-2022-JP-2';
+
+ case 'csiso2022kr':
+ case 'iso2022kr':
+ return 'ISO-2022-KR';
+
+ case 'cswindows30latin1':
+ case 'iso88591windows30latin1':
+ return 'ISO-8859-1-Windows-3.0-Latin-1';
+
+ case 'cswindows31latin1':
+ case 'iso88591windows31latin1':
+ return 'ISO-8859-1-Windows-3.1-Latin-1';
+
+ case 'csisolatin2':
+ case 'iso88592':
+ case 'iso885921987':
+ case 'isoir101':
+ case 'l2':
+ case 'latin2':
+ return 'ISO-8859-2';
+
+ case 'cswindows31latin2':
+ case 'iso88592windowslatin2':
+ return 'ISO-8859-2-Windows-Latin-2';
+
+ case 'csisolatin3':
+ case 'iso88593':
+ case 'iso885931988':
+ case 'isoir109':
+ case 'l3':
+ case 'latin3':
+ return 'ISO-8859-3';
+
+ case 'csisolatin4':
+ case 'iso88594':
+ case 'iso885941988':
+ case 'isoir110':
+ case 'l4':
+ case 'latin4':
+ return 'ISO-8859-4';
+
+ case 'csisolatincyrillic':
+ case 'cyrillic':
+ case 'iso88595':
+ case 'iso885951988':
+ case 'isoir144':
+ return 'ISO-8859-5';
+
+ case 'arabic':
+ case 'asmo708':
+ case 'csisolatinarabic':
+ case 'ecma114':
+ case 'iso88596':
+ case 'iso885961987':
+ case 'isoir127':
+ return 'ISO-8859-6';
+
+ case 'csiso88596e':
+ case 'iso88596e':
+ return 'ISO-8859-6-E';
+
+ case 'csiso88596i':
+ case 'iso88596i':
+ return 'ISO-8859-6-I';
+
+ case 'csisolatingreek':
+ case 'ecma118':
+ case 'elot928':
+ case 'greek':
+ case 'greek8':
+ case 'iso88597':
+ case 'iso885971987':
+ case 'isoir126':
+ return 'ISO-8859-7';
+
+ case 'csisolatinhebrew':
+ case 'hebrew':
+ case 'iso88598':
+ case 'iso885981988':
+ case 'isoir138':
+ return 'ISO-8859-8';
+
+ case 'csiso88598e':
+ case 'iso88598e':
+ return 'ISO-8859-8-E';
+
+ case 'csiso88598i':
+ case 'iso88598i':
+ return 'ISO-8859-8-I';
+
+ case 'cswindows31latin5':
+ case 'iso88599windowslatin5':
+ return 'ISO-8859-9-Windows-Latin-5';
+
+ case 'csisolatin6':
+ case 'iso885910':
+ case 'iso8859101992':
+ case 'isoir157':
+ case 'l6':
+ case 'latin6':
+ return 'ISO-8859-10';
+
+ case 'iso885913':
+ return 'ISO-8859-13';
+
+ case 'iso885914':
+ case 'iso8859141998':
+ case 'isoceltic':
+ case 'isoir199':
+ case 'l8':
+ case 'latin8':
+ return 'ISO-8859-14';
+
+ case 'iso885915':
+ case 'latin9':
+ return 'ISO-8859-15';
+
+ case 'iso885916':
+ case 'iso8859162001':
+ case 'isoir226':
+ case 'l10':
+ case 'latin10':
+ return 'ISO-8859-16';
+
+ case 'iso10646j1':
+ return 'ISO-10646-J-1';
+
+ case 'csunicode':
+ case 'iso10646ucs2':
+ return 'ISO-10646-UCS-2';
+
+ case 'csucs4':
+ case 'iso10646ucs4':
+ return 'ISO-10646-UCS-4';
+
+ case 'csunicodeascii':
+ case 'iso10646ucsbasic':
+ return 'ISO-10646-UCS-Basic';
+
+ case 'csunicodelatin1':
+ case 'iso10646':
+ case 'iso10646unicodelatin1':
+ return 'ISO-10646-Unicode-Latin1';
+
+ case 'csiso10646utf1':
+ case 'iso10646utf1':
+ return 'ISO-10646-UTF-1';
+
+ case 'csiso115481':
+ case 'iso115481':
+ case 'isotr115481':
+ return 'ISO-11548-1';
+
+ case 'csiso90':
+ case 'isoir90':
+ return 'iso-ir-90';
+
+ case 'csunicodeibm1261':
+ case 'isounicodeibm1261':
+ return 'ISO-Unicode-IBM-1261';
+
+ case 'csunicodeibm1264':
+ case 'isounicodeibm1264':
+ return 'ISO-Unicode-IBM-1264';
+
+ case 'csunicodeibm1265':
+ case 'isounicodeibm1265':
+ return 'ISO-Unicode-IBM-1265';
+
+ case 'csunicodeibm1268':
+ case 'isounicodeibm1268':
+ return 'ISO-Unicode-IBM-1268';
+
+ case 'csunicodeibm1276':
+ case 'isounicodeibm1276':
+ return 'ISO-Unicode-IBM-1276';
+
+ case 'csiso646basic1983':
+ case 'iso646basic1983':
+ case 'ref':
+ return 'ISO_646.basic:1983';
+
+ case 'csiso2intlrefversion':
+ case 'irv':
+ case 'iso646irv1983':
+ case 'isoir2':
+ return 'ISO_646.irv:1983';
+
+ case 'csiso2033':
+ case 'e13b':
+ case 'iso20331983':
+ case 'isoir98':
+ return 'ISO_2033-1983';
+
+ case 'csiso5427cyrillic':
+ case 'iso5427':
+ case 'isoir37':
+ return 'ISO_5427';
+
+ case 'iso5427cyrillic1981':
+ case 'iso54271981':
+ case 'isoir54':
+ return 'ISO_5427:1981';
+
+ case 'csiso5428greek':
+ case 'iso54281980':
+ case 'isoir55':
+ return 'ISO_5428:1980';
+
+ case 'csiso6937add':
+ case 'iso6937225':
+ case 'isoir152':
+ return 'ISO_6937-2-25';
+
+ case 'csisotextcomm':
+ case 'iso69372add':
+ case 'isoir142':
+ return 'ISO_6937-2-add';
+
+ case 'csiso8859supp':
+ case 'iso8859supp':
+ case 'isoir154':
+ case 'latin125':
+ return 'ISO_8859-supp';
+
+ case 'csiso10367box':
+ case 'iso10367box':
+ case 'isoir155':
+ return 'ISO_10367-box';
+
+ case 'csiso15italian':
+ case 'iso646it':
+ case 'isoir15':
+ case 'it':
+ return 'IT';
+
+ case 'csiso13jisc6220jp':
+ case 'isoir13':
+ case 'jisc62201969':
+ case 'jisc62201969jp':
+ case 'katakana':
+ case 'x2017':
+ return 'JIS_C6220-1969-jp';
+
+ case 'csiso14jisc6220ro':
+ case 'iso646jp':
+ case 'isoir14':
+ case 'jisc62201969ro':
+ case 'jp':
+ return 'JIS_C6220-1969-ro';
+
+ case 'csiso42jisc62261978':
+ case 'isoir42':
+ case 'jisc62261978':
+ return 'JIS_C6226-1978';
+
+ case 'csiso87jisx208':
+ case 'isoir87':
+ case 'jisc62261983':
+ case 'jisx2081983':
+ case 'x208':
+ return 'JIS_C6226-1983';
+
+ case 'csiso91jisc62291984a':
+ case 'isoir91':
+ case 'jisc62291984a':
+ case 'jpocra':
+ return 'JIS_C6229-1984-a';
+
+ case 'csiso92jisc62991984b':
+ case 'iso646jpocrb':
+ case 'isoir92':
+ case 'jisc62291984b':
+ case 'jpocrb':
+ return 'JIS_C6229-1984-b';
+
+ case 'csiso93jis62291984badd':
+ case 'isoir93':
+ case 'jisc62291984badd':
+ case 'jpocrbadd':
+ return 'JIS_C6229-1984-b-add';
+
+ case 'csiso94jis62291984hand':
+ case 'isoir94':
+ case 'jisc62291984hand':
+ case 'jpocrhand':
+ return 'JIS_C6229-1984-hand';
+
+ case 'csiso95jis62291984handadd':
+ case 'isoir95':
+ case 'jisc62291984handadd':
+ case 'jpocrhandadd':
+ return 'JIS_C6229-1984-hand-add';
+
+ case 'csiso96jisc62291984kana':
+ case 'isoir96':
+ case 'jisc62291984kana':
+ return 'JIS_C6229-1984-kana';
+
+ case 'csjisencoding':
+ case 'jisencoding':
+ return 'JIS_Encoding';
+
+ case 'cshalfwidthkatakana':
+ case 'jisx201':
+ case 'x201':
+ return 'JIS_X0201';
+
+ case 'csiso159jisx2121990':
+ case 'isoir159':
+ case 'jisx2121990':
+ case 'x212':
+ return 'JIS_X0212-1990';
+
+ case 'csiso141jusib1002':
+ case 'iso646yu':
+ case 'isoir141':
+ case 'js':
+ case 'jusib1002':
+ case 'yu':
+ return 'JUS_I.B1.002';
+
+ case 'csiso147macedonian':
+ case 'isoir147':
+ case 'jusib1003mac':
+ case 'macedonian':
+ return 'JUS_I.B1.003-mac';
+
+ case 'csiso146serbian':
+ case 'isoir146':
+ case 'jusib1003serb':
+ case 'serbian':
+ return 'JUS_I.B1.003-serb';
+
+ case 'koi7switched':
+ return 'KOI7-switched';
+
+ case 'cskoi8r':
+ case 'koi8r':
+ return 'KOI8-R';
+
+ case 'koi8u':
+ return 'KOI8-U';
+
+ case 'csksc5636':
+ case 'iso646kr':
+ case 'ksc5636':
+ return 'KSC5636';
+
+ case 'cskz1048':
+ case 'kz1048':
+ case 'rk1048':
+ case 'strk10482002':
+ return 'KZ-1048';
+
+ case 'csiso19latingreek':
+ case 'isoir19':
+ case 'latingreek':
+ return 'latin-greek';
+
+ case 'csiso27latingreek1':
+ case 'isoir27':
+ case 'latingreek1':
+ return 'Latin-greek-1';
+
+ case 'csiso158lap':
+ case 'isoir158':
+ case 'lap':
+ case 'latinlap':
+ return 'latin-lap';
+
+ case 'csmacintosh':
+ case 'mac':
+ case 'macintosh':
+ return 'macintosh';
+
+ case 'csmicrosoftpublishing':
+ case 'microsoftpublishing':
+ return 'Microsoft-Publishing';
+
+ case 'csmnem':
+ case 'mnem':
+ return 'MNEM';
+
+ case 'csmnemonic':
+ case 'mnemonic':
+ return 'MNEMONIC';
+
+ case 'csiso86hungarian':
+ case 'hu':
+ case 'iso646hu':
+ case 'isoir86':
+ case 'msz77953':
+ return 'MSZ_7795.3';
+
+ case 'csnatsdano':
+ case 'isoir91':
+ case 'natsdano':
+ return 'NATS-DANO';
+
+ case 'csnatsdanoadd':
+ case 'isoir92':
+ case 'natsdanoadd':
+ return 'NATS-DANO-ADD';
+
+ case 'csnatssefi':
+ case 'isoir81':
+ case 'natssefi':
+ return 'NATS-SEFI';
+
+ case 'csnatssefiadd':
+ case 'isoir82':
+ case 'natssefiadd':
+ return 'NATS-SEFI-ADD';
+
+ case 'csiso151cuba':
+ case 'cuba':
+ case 'iso646cu':
+ case 'isoir151':
+ case 'ncnc1081':
+ return 'NC_NC00-10:81';
+
+ case 'csiso69french':
+ case 'fr':
+ case 'iso646fr':
+ case 'isoir69':
+ case 'nfz62010':
+ return 'NF_Z_62-010';
+
+ case 'csiso25french':
+ case 'iso646fr1':
+ case 'isoir25':
+ case 'nfz620101973':
+ return 'NF_Z_62-010_(1973)';
+
+ case 'csiso60danishnorwegian':
+ case 'csiso60norwegian1':
+ case 'iso646no':
+ case 'isoir60':
+ case 'no':
+ case 'ns45511':
+ return 'NS_4551-1';
+
+ case 'csiso61norwegian2':
+ case 'iso646no2':
+ case 'isoir61':
+ case 'no2':
+ case 'ns45512':
+ return 'NS_4551-2';
+
+ case 'osdebcdicdf3irv':
+ return 'OSD_EBCDIC_DF03_IRV';
+
+ case 'osdebcdicdf41':
+ return 'OSD_EBCDIC_DF04_1';
+
+ case 'osdebcdicdf415':
+ return 'OSD_EBCDIC_DF04_15';
+
+ case 'cspc8danishnorwegian':
+ case 'pc8danishnorwegian':
+ return 'PC8-Danish-Norwegian';
+
+ case 'cspc8turkish':
+ case 'pc8turkish':
+ return 'PC8-Turkish';
+
+ case 'csiso16portuguese':
+ case 'iso646pt':
+ case 'isoir16':
+ case 'pt':
+ return 'PT';
+
+ case 'csiso84portuguese2':
+ case 'iso646pt2':
+ case 'isoir84':
+ case 'pt2':
+ return 'PT2';
+
+ case 'cp154':
+ case 'csptcp154':
+ case 'cyrillicasian':
+ case 'pt154':
+ case 'ptcp154':
+ return 'PTCP154';
+
+ case 'scsu':
+ return 'SCSU';
+
+ case 'csiso10swedish':
+ case 'fi':
+ case 'iso646fi':
+ case 'iso646se':
+ case 'isoir10':
+ case 'se':
+ case 'sen850200b':
+ return 'SEN_850200_B';
+
+ case 'csiso11swedishfornames':
+ case 'iso646se2':
+ case 'isoir11':
+ case 'se2':
+ case 'sen850200c':
+ return 'SEN_850200_C';
+
+ case 'csiso102t617bit':
+ case 'isoir102':
+ case 't617bit':
+ return 'T.61-7bit';
+
+ case 'csiso103t618bit':
+ case 'isoir103':
+ case 't61':
+ case 't618bit':
+ return 'T.61-8bit';
+
+ case 'csiso128t101g2':
+ case 'isoir128':
+ case 't101g2':
+ return 'T.101-G2';
+
+ case 'cstscii':
+ case 'tscii':
+ return 'TSCII';
+
+ case 'csunicode11':
+ case 'unicode11':
+ return 'UNICODE-1-1';
+
+ case 'csunicode11utf7':
+ case 'unicode11utf7':
+ return 'UNICODE-1-1-UTF-7';
+
+ case 'csunknown8bit':
+ case 'unknown8bit':
+ return 'UNKNOWN-8BIT';
+
+ case 'ansix341968':
+ case 'ansix341986':
+ case 'ascii':
+ case 'cp367':
+ case 'csascii':
+ case 'ibm367':
+ case 'iso646irv1991':
+ case 'iso646us':
+ case 'isoir6':
+ case 'us':
+ case 'usascii':
+ return 'US-ASCII';
+
+ case 'csusdk':
+ case 'usdk':
+ return 'us-dk';
+
+ case 'utf7':
+ return 'UTF-7';
+
+ case 'utf8':
+ return 'UTF-8';
+
+ case 'utf16':
+ return 'UTF-16';
+
+ case 'utf16be':
+ return 'UTF-16BE';
+
+ case 'utf16le':
+ return 'UTF-16LE';
+
+ case 'utf32':
+ return 'UTF-32';
+
+ case 'utf32be':
+ return 'UTF-32BE';
+
+ case 'utf32le':
+ return 'UTF-32LE';
+
+ case 'csventurainternational':
+ case 'venturainternational':
+ return 'Ventura-International';
+
+ case 'csventuramath':
+ case 'venturamath':
+ return 'Ventura-Math';
+
+ case 'csventuraus':
+ case 'venturaus':
+ return 'Ventura-US';
+
+ case 'csiso70videotexsupp1':
+ case 'isoir70':
+ case 'videotexsuppl':
+ return 'videotex-suppl';
+
+ case 'csviqr':
+ case 'viqr':
+ return 'VIQR';
+
+ case 'csviscii':
+ case 'viscii':
+ return 'VISCII';
+
+ case 'csshiftjis':
+ case 'cswindows31j':
+ case 'mskanji':
+ case 'shiftjis':
+ case 'windows31j':
+ return 'Windows-31J';
+
+ case 'iso885911':
+ case 'tis620':
+ return 'windows-874';
+
+ case 'cseuckr':
+ case 'csksc56011987':
+ case 'euckr':
+ case 'isoir149':
+ case 'korean':
+ case 'ksc5601':
+ case 'ksc56011987':
+ case 'ksc56011989':
+ case 'windows949':
+ return 'windows-949';
+
+ case 'windows1250':
+ return 'windows-1250';
+
+ case 'windows1251':
+ return 'windows-1251';
+
+ case 'cp819':
+ case 'csisolatin1':
+ case 'ibm819':
+ case 'iso88591':
+ case 'iso885911987':
+ case 'isoir100':
+ case 'l1':
+ case 'latin1':
+ case 'windows1252':
+ return 'windows-1252';
+
+ case 'windows1253':
+ return 'windows-1253';
+
+ case 'csisolatin5':
+ case 'iso88599':
+ case 'iso885991989':
+ case 'isoir148':
+ case 'l5':
+ case 'latin5':
+ case 'windows1254':
+ return 'windows-1254';
+
+ case 'windows1255':
+ return 'windows-1255';
+
+ case 'windows1256':
+ return 'windows-1256';
+
+ case 'windows1257':
+ return 'windows-1257';
+
+ case 'windows1258':
+ return 'windows-1258';
+
+ default:
+ return $charset;
+ }
+ }
+
+ public static function get_curl_version()
+ {
+ if (is_array($curl = curl_version()))
+ {
+ $curl = $curl['version'];
+ }
+ elseif (substr($curl, 0, 5) === 'curl/')
+ {
+ $curl = substr($curl, 5, strcspn($curl, "\x09\x0A\x0B\x0C\x0D", 5));
+ }
+ elseif (substr($curl, 0, 8) === 'libcurl/')
+ {
+ $curl = substr($curl, 8, strcspn($curl, "\x09\x0A\x0B\x0C\x0D", 8));
+ }
+ else
+ {
+ $curl = 0;
+ }
+ return $curl;
+ }
+
+ /**
+ * Strip HTML comments
+ *
+ * @param string $data Data to strip comments from
+ * @return string Comment stripped string
+ */
+ public static function strip_comments($data)
+ {
+ $output = '';
+ while (($start = strpos($data, '<!--')) !== false)
+ {
+ $output .= substr($data, 0, $start);
+ if (($end = strpos($data, '-->', $start)) !== false)
+ {
+ $data = substr_replace($data, '', 0, $end + 3);
+ }
+ else
+ {
+ $data = '';
+ }
+ }
+ return $output . $data;
+ }
+
+ public static function parse_date($dt)
+ {
+ $parser = SimplePie_Parse_Date::get();
+ return $parser->parse($dt);
+ }
+
+ /**
+ * Decode HTML entities
+ *
+ * @deprecated Use DOMDocument instead
+ * @param string $data Input data
+ * @return string Output data
+ */
+ public static function entities_decode($data)
+ {
+ $decoder = new SimplePie_Decode_HTML_Entities($data);
+ return $decoder->parse();
+ }
+
+ /**
+ * Remove RFC822 comments
+ *
+ * @param string $data Data to strip comments from
+ * @return string Comment stripped string
+ */
+ public static function uncomment_rfc822($string)
+ {
+ $string = (string) $string;
+ $position = 0;
+ $length = strlen($string);
+ $depth = 0;
+
+ $output = '';
+
+ while ($position < $length && ($pos = strpos($string, '(', $position)) !== false)
+ {
+ $output .= substr($string, $position, $pos - $position);
+ $position = $pos + 1;
+ if ($string[$pos - 1] !== '\\')
+ {
+ $depth++;
+ while ($depth && $position < $length)
+ {
+ $position += strcspn($string, '()', $position);
+ if ($string[$position - 1] === '\\')
+ {
+ $position++;
+ continue;
+ }
+ elseif (isset($string[$position]))
+ {
+ switch ($string[$position])
+ {
+ case '(':
+ $depth++;
+ break;
+
+ case ')':
+ $depth--;
+ break;
+ }
+ $position++;
+ }
+ else
+ {
+ break;
+ }
+ }
+ }
+ else
+ {
+ $output .= '(';
+ }
+ }
+ $output .= substr($string, $position);
+
+ return $output;
+ }
+
+ public static function parse_mime($mime)
+ {
+ if (($pos = strpos($mime, ';')) === false)
+ {
+ return trim($mime);
+ }
+ else
+ {
+ return trim(substr($mime, 0, $pos));
+ }
+ }
+
+ public static function atom_03_construct_type($attribs)
+ {
+ if (isset($attribs['']['mode']) && strtolower(trim($attribs['']['mode']) === 'base64'))
+ {
+ $mode = SIMPLEPIE_CONSTRUCT_BASE64;
+ }
+ else
+ {
+ $mode = SIMPLEPIE_CONSTRUCT_NONE;
+ }
+ if (isset($attribs['']['type']))
+ {
+ switch (strtolower(trim($attribs['']['type'])))
+ {
+ case 'text':
+ case 'text/plain':
+ return SIMPLEPIE_CONSTRUCT_TEXT | $mode;
+
+ case 'html':
+ case 'text/html':
+ return SIMPLEPIE_CONSTRUCT_HTML | $mode;
+
+ case 'xhtml':
+ case 'application/xhtml+xml':
+ return SIMPLEPIE_CONSTRUCT_XHTML | $mode;
+
+ default:
+ return SIMPLEPIE_CONSTRUCT_NONE | $mode;
+ }
+ }
+ else
+ {
+ return SIMPLEPIE_CONSTRUCT_TEXT | $mode;
+ }
+ }
+
+ public static function atom_10_construct_type($attribs)
+ {
+ if (isset($attribs['']['type']))
+ {
+ switch (strtolower(trim($attribs['']['type'])))
+ {
+ case 'text':
+ return SIMPLEPIE_CONSTRUCT_TEXT;
+
+ case 'html':
+ return SIMPLEPIE_CONSTRUCT_HTML;
+
+ case 'xhtml':
+ return SIMPLEPIE_CONSTRUCT_XHTML;
+
+ default:
+ return SIMPLEPIE_CONSTRUCT_NONE;
+ }
+ }
+ return SIMPLEPIE_CONSTRUCT_TEXT;
+ }
+
+ public static function atom_10_content_construct_type($attribs)
+ {
+ if (isset($attribs['']['type']))
+ {
+ $type = strtolower(trim($attribs['']['type']));
+ switch ($type)
+ {
+ case 'text':
+ return SIMPLEPIE_CONSTRUCT_TEXT;
+
+ case 'html':
+ return SIMPLEPIE_CONSTRUCT_HTML;
+
+ case 'xhtml':
+ return SIMPLEPIE_CONSTRUCT_XHTML;
+ }
+ if (in_array(substr($type, -4), array('+xml', '/xml')) || substr($type, 0, 5) === 'text/')
+ {
+ return SIMPLEPIE_CONSTRUCT_NONE;
+ }
+ else
+ {
+ return SIMPLEPIE_CONSTRUCT_BASE64;
+ }
+ }
+ else
+ {
+ return SIMPLEPIE_CONSTRUCT_TEXT;
+ }
+ }
+
+ public static function is_isegment_nz_nc($string)
+ {
+ return (bool) preg_match('/^([A-Za-z0-9\-._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!$&\'()*+,;=@]|(%[0-9ABCDEF]{2}))+$/u', $string);
+ }
+
+ public static function space_separated_tokens($string)
+ {
+ $space_characters = "\x20\x09\x0A\x0B\x0C\x0D";
+ $string_length = strlen($string);
+
+ $position = strspn($string, $space_characters);
+ $tokens = array();
+
+ while ($position < $string_length)
+ {
+ $len = strcspn($string, $space_characters, $position);
+ $tokens[] = substr($string, $position, $len);
+ $position += $len;
+ $position += strspn($string, $space_characters, $position);
+ }
+
+ return $tokens;
+ }
+
+ /**
+ * Converts a unicode codepoint to a UTF-8 character
+ *
+ * @static
+ * @param int $codepoint Unicode codepoint
+ * @return string UTF-8 character
+ */
+ public static function codepoint_to_utf8($codepoint)
+ {
+ $codepoint = (int) $codepoint;
+ if ($codepoint < 0)
+ {
+ return false;
+ }
+ else if ($codepoint <= 0x7f)
+ {
+ return chr($codepoint);
+ }
+ else if ($codepoint <= 0x7ff)
+ {
+ return chr(0xc0 | ($codepoint >> 6)) . chr(0x80 | ($codepoint & 0x3f));
+ }
+ else if ($codepoint <= 0xffff)
+ {
+ return chr(0xe0 | ($codepoint >> 12)) . chr(0x80 | (($codepoint >> 6) & 0x3f)) . chr(0x80 | ($codepoint & 0x3f));
+ }
+ else if ($codepoint <= 0x10ffff)
+ {
+ return chr(0xf0 | ($codepoint >> 18)) . chr(0x80 | (($codepoint >> 12) & 0x3f)) . chr(0x80 | (($codepoint >> 6) & 0x3f)) . chr(0x80 | ($codepoint & 0x3f));
+ }
+ else
+ {
+ // U+FFFD REPLACEMENT CHARACTER
+ return "\xEF\xBF\xBD";
+ }
+ }
+
+ /**
+ * Similar to parse_str()
+ *
+ * Returns an associative array of name/value pairs, where the value is an
+ * array of values that have used the same name
+ *
+ * @static
+ * @param string $str The input string.
+ * @return array
+ */
+ public static function parse_str($str)
+ {
+ $return = array();
+ $str = explode('&', $str);
+
+ foreach ($str as $section)
+ {
+ if (strpos($section, '=') !== false)
+ {
+ list($name, $value) = explode('=', $section, 2);
+ $return[urldecode($name)][] = urldecode($value);
+ }
+ else
+ {
+ $return[urldecode($section)][] = null;
+ }
+ }
+
+ return $return;
+ }
+
+ /**
+ * Detect XML encoding, as per XML 1.0 Appendix F.1
+ *
+ * @todo Add support for EBCDIC
+ * @param string $data XML data
+ * @param SimplePie_Registry $registry Class registry
+ * @return array Possible encodings
+ */
+ public static function xml_encoding($data, $registry)
+ {
+ // UTF-32 Big Endian BOM
+ if (substr($data, 0, 4) === "\x00\x00\xFE\xFF")
+ {
+ $encoding[] = 'UTF-32BE';
+ }
+ // UTF-32 Little Endian BOM
+ elseif (substr($data, 0, 4) === "\xFF\xFE\x00\x00")
+ {
+ $encoding[] = 'UTF-32LE';
+ }
+ // UTF-16 Big Endian BOM
+ elseif (substr($data, 0, 2) === "\xFE\xFF")
+ {
+ $encoding[] = 'UTF-16BE';
+ }
+ // UTF-16 Little Endian BOM
+ elseif (substr($data, 0, 2) === "\xFF\xFE")
+ {
+ $encoding[] = 'UTF-16LE';
+ }
+ // UTF-8 BOM
+ elseif (substr($data, 0, 3) === "\xEF\xBB\xBF")
+ {
+ $encoding[] = 'UTF-8';
+ }
+ // UTF-32 Big Endian Without BOM
+ elseif (substr($data, 0, 20) === "\x00\x00\x00\x3C\x00\x00\x00\x3F\x00\x00\x00\x78\x00\x00\x00\x6D\x00\x00\x00\x6C")
+ {
+ if ($pos = strpos($data, "\x00\x00\x00\x3F\x00\x00\x00\x3E"))
+ {
+ $parser = $registry->create('XML_Declaration_Parser', array(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 20), 'UTF-32BE', 'UTF-8')));
+ if ($parser->parse())
+ {
+ $encoding[] = $parser->encoding;
+ }
+ }
+ $encoding[] = 'UTF-32BE';
+ }
+ // UTF-32 Little Endian Without BOM
+ elseif (substr($data, 0, 20) === "\x3C\x00\x00\x00\x3F\x00\x00\x00\x78\x00\x00\x00\x6D\x00\x00\x00\x6C\x00\x00\x00")
+ {
+ if ($pos = strpos($data, "\x3F\x00\x00\x00\x3E\x00\x00\x00"))
+ {
+ $parser = $registry->create('XML_Declaration_Parser', array(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 20), 'UTF-32LE', 'UTF-8')));
+ if ($parser->parse())
+ {
+ $encoding[] = $parser->encoding;
+ }
+ }
+ $encoding[] = 'UTF-32LE';
+ }
+ // UTF-16 Big Endian Without BOM
+ elseif (substr($data, 0, 10) === "\x00\x3C\x00\x3F\x00\x78\x00\x6D\x00\x6C")
+ {
+ if ($pos = strpos($data, "\x00\x3F\x00\x3E"))
+ {
+ $parser = $registry->create('XML_Declaration_Parser', array(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 10), 'UTF-16BE', 'UTF-8')));
+ if ($parser->parse())
+ {
+ $encoding[] = $parser->encoding;
+ }
+ }
+ $encoding[] = 'UTF-16BE';
+ }
+ // UTF-16 Little Endian Without BOM
+ elseif (substr($data, 0, 10) === "\x3C\x00\x3F\x00\x78\x00\x6D\x00\x6C\x00")
+ {
+ if ($pos = strpos($data, "\x3F\x00\x3E\x00"))
+ {
+ $parser = $registry->create('XML_Declaration_Parser', array(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 10), 'UTF-16LE', 'UTF-8')));
+ if ($parser->parse())
+ {
+ $encoding[] = $parser->encoding;
+ }
+ }
+ $encoding[] = 'UTF-16LE';
+ }
+ // US-ASCII (or superset)
+ elseif (substr($data, 0, 5) === "\x3C\x3F\x78\x6D\x6C")
+ {
+ if ($pos = strpos($data, "\x3F\x3E"))
+ {
+ $parser = $registry->create('XML_Declaration_Parser', array(substr($data, 5, $pos - 5)));
+ if ($parser->parse())
+ {
+ $encoding[] = $parser->encoding;
+ }
+ }
+ $encoding[] = 'UTF-8';
+ }
+ // Fallback to UTF-8
+ else
+ {
+ $encoding[] = 'UTF-8';
+ }
+ return $encoding;
+ }
+
+ public static function output_javascript()
+ {
+ if (function_exists('ob_gzhandler'))
+ {
+ ob_start('ob_gzhandler');
+ }
+ header('Content-type: text/javascript; charset: UTF-8');
+ header('Cache-Control: must-revalidate');
+ header('Expires: ' . gmdate('D, d M Y H:i:s', time() + 604800) . ' GMT'); // 7 days
+ ?>
+function embed_quicktime(type, bgcolor, width, height, link, placeholder, loop) {
+ if (placeholder != '') {
+ document.writeln('<embed type="'+type+'" style="cursor:hand; cursor:pointer;" href="'+link+'" src="'+placeholder+'" width="'+width+'" height="'+height+'" autoplay="false" target="myself" controller="false" loop="'+loop+'" scale="aspect" bgcolor="'+bgcolor+'" pluginspage="http://www.apple.com/quicktime/download/"></embed>');
+ }
+ else {
+ document.writeln('<embed type="'+type+'" style="cursor:hand; cursor:pointer;" src="'+link+'" width="'+width+'" height="'+height+'" autoplay="false" target="myself" controller="true" loop="'+loop+'" scale="aspect" bgcolor="'+bgcolor+'" pluginspage="http://www.apple.com/quicktime/download/"></embed>');
+ }
+}
+
+function embed_flash(bgcolor, width, height, link, loop, type) {
+ document.writeln('<embed src="'+link+'" pluginspage="http://www.macromedia.com/go/getflashplayer" type="'+type+'" quality="high" width="'+width+'" height="'+height+'" bgcolor="'+bgcolor+'" loop="'+loop+'"></embed>');
+}
+
+function embed_flv(width, height, link, placeholder, loop, player) {
+ document.writeln('<embed src="'+player+'" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" quality="high" width="'+width+'" height="'+height+'" wmode="transparent" flashvars="file='+link+'&autostart=false&repeat='+loop+'&showdigits=true&showfsbutton=false"></embed>');
+}
+
+function embed_wmedia(width, height, link) {
+ document.writeln('<embed type="application/x-mplayer2" src="'+link+'" autosize="1" width="'+width+'" height="'+height+'" showcontrols="1" showstatusbar="0" showdisplay="0" autostart="0"></embed>');
+}
+ <?php
+ }
+
+ /**
+ * Get the SimplePie build timestamp
+ *
+ * Uses the git index if it exists, otherwise uses the modification time
+ * of the newest file.
+ */
+ public static function get_build()
+ {
+ $root = dirname(dirname(__FILE__));
+ if (file_exists($root . '/.git/index'))
+ {
+ return filemtime($root . '/.git/index');
+ }
+ elseif (file_exists($root . '/SimplePie'))
+ {
+ $time = 0;
+ foreach (glob($root . '/SimplePie/*.php') as $file)
+ {
+ if (($mtime = filemtime($file)) > $time)
+ {
+ $time = $mtime;
+ }
+ }
+ return $time;
+ }
+ elseif (file_exists(dirname(__FILE__) . '/Core.php'))
+ {
+ return filemtime(dirname(__FILE__) . '/Core.php');
+ }
+ else
+ {
+ return filemtime(__FILE__);
+ }
+ }
+
+ /**
+ * Format debugging information
+ */
+ public static function debug(&$sp)
+ {
+ $info = 'SimplePie ' . SIMPLEPIE_VERSION . ' Build ' . SIMPLEPIE_BUILD . "\n";
+ $info .= 'PHP ' . PHP_VERSION . "\n";
+ if ($sp->error() !== null)
+ {
+ $info .= 'Error occurred: ' . $sp->error() . "\n";
+ }
+ else
+ {
+ $info .= "No error found.\n";
+ }
+ $info .= "Extensions:\n";
+ $extensions = array('pcre', 'curl', 'zlib', 'mbstring', 'iconv', 'xmlreader', 'xml');
+ foreach ($extensions as $ext)
+ {
+ if (extension_loaded($ext))
+ {
+ $info .= " $ext loaded\n";
+ switch ($ext)
+ {
+ case 'pcre':
+ $info .= ' Version ' . PCRE_VERSION . "\n";
+ break;
+ case 'curl':
+ $version = curl_version();
+ $info .= ' Version ' . $version['version'] . "\n";
+ break;
+ case 'mbstring':
+ $info .= ' Overloading: ' . mb_get_info('func_overload') . "\n";
+ break;
+ case 'iconv':
+ $info .= ' Version ' . ICONV_VERSION . "\n";
+ break;
+ case 'xml':
+ $info .= ' Version ' . LIBXML_DOTTED_VERSION . "\n";
+ break;
+ }
+ }
+ else
+ {
+ $info .= " $ext not loaded\n";
+ }
+ }
+ return $info;
+ }
+
+ public static function silence_errors($num, $str)
+ {
+ // No-op
+ }
+}
+
diff --git a/vendor/simplepie/simplepie/library/SimplePie/Net/IPv6.php b/vendor/simplepie/simplepie/library/SimplePie/Net/IPv6.php
new file mode 100644
index 000000000..47658aff2
--- /dev/null
+++ b/vendor/simplepie/simplepie/library/SimplePie/Net/IPv6.php
@@ -0,0 +1,275 @@
+<?php
+/**
+ * SimplePie
+ *
+ * A PHP-Based RSS and Atom Feed Framework.
+ * Takes the hard work out of managing a complete RSS/Atom solution.
+ *
+ * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * * Neither the name of the SimplePie Team nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
+ * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @package SimplePie
+ * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @author Ryan Parman
+ * @author Geoffrey Sneddon
+ * @author Ryan McCue
+ * @link http://simplepie.org/ SimplePie
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ */
+
+
+/**
+ * Class to validate and to work with IPv6 addresses.
+ *
+ * @package SimplePie
+ * @subpackage HTTP
+ * @copyright 2003-2005 The PHP Group
+ * @license http://www.opensource.org/licenses/bsd-license.php
+ * @link http://pear.php.net/package/Net_IPv6
+ * @author Alexander Merz <alexander.merz@web.de>
+ * @author elfrink at introweb dot nl
+ * @author Josh Peck <jmp at joshpeck dot org>
+ * @author Geoffrey Sneddon <geoffers@gmail.com>
+ */
+class SimplePie_Net_IPv6
+{
+ /**
+ * Uncompresses an IPv6 address
+ *
+ * RFC 4291 allows you to compress concecutive zero pieces in an address to
+ * '::'. This method expects a valid IPv6 address and expands the '::' to
+ * the required number of zero pieces.
+ *
+ * Example: FF01::101 -> FF01:0:0:0:0:0:0:101
+ * ::1 -> 0:0:0:0:0:0:0:1
+ *
+ * @author Alexander Merz <alexander.merz@web.de>
+ * @author elfrink at introweb dot nl
+ * @author Josh Peck <jmp at joshpeck dot org>
+ * @copyright 2003-2005 The PHP Group
+ * @license http://www.opensource.org/licenses/bsd-license.php
+ * @param string $ip An IPv6 address
+ * @return string The uncompressed IPv6 address
+ */
+ public static function uncompress($ip)
+ {
+ $c1 = -1;
+ $c2 = -1;
+ if (substr_count($ip, '::') === 1)
+ {
+ list($ip1, $ip2) = explode('::', $ip);
+ if ($ip1 === '')
+ {
+ $c1 = -1;
+ }
+ else
+ {
+ $c1 = substr_count($ip1, ':');
+ }
+ if ($ip2 === '')
+ {
+ $c2 = -1;
+ }
+ else
+ {
+ $c2 = substr_count($ip2, ':');
+ }
+ if (strpos($ip2, '.') !== false)
+ {
+ $c2++;
+ }
+ // ::
+ if ($c1 === -1 && $c2 === -1)
+ {
+ $ip = '0:0:0:0:0:0:0:0';
+ }
+ // ::xxx
+ else if ($c1 === -1)
+ {
+ $fill = str_repeat('0:', 7 - $c2);
+ $ip = str_replace('::', $fill, $ip);
+ }
+ // xxx::
+ else if ($c2 === -1)
+ {
+ $fill = str_repeat(':0', 7 - $c1);
+ $ip = str_replace('::', $fill, $ip);
+ }
+ // xxx::xxx
+ else
+ {
+ $fill = ':' . str_repeat('0:', 6 - $c2 - $c1);
+ $ip = str_replace('::', $fill, $ip);
+ }
+ }
+ return $ip;
+ }
+
+ /**
+ * Compresses an IPv6 address
+ *
+ * RFC 4291 allows you to compress concecutive zero pieces in an address to
+ * '::'. This method expects a valid IPv6 address and compresses consecutive
+ * zero pieces to '::'.
+ *
+ * Example: FF01:0:0:0:0:0:0:101 -> FF01::101
+ * 0:0:0:0:0:0:0:1 -> ::1
+ *
+ * @see uncompress()
+ * @param string $ip An IPv6 address
+ * @return string The compressed IPv6 address
+ */
+ public static function compress($ip)
+ {
+ // Prepare the IP to be compressed
+ $ip = self::uncompress($ip);
+ $ip_parts = self::split_v6_v4($ip);
+
+ // Replace all leading zeros
+ $ip_parts[0] = preg_replace('/(^|:)0+([0-9])/', '\1\2', $ip_parts[0]);
+
+ // Find bunches of zeros
+ if (preg_match_all('/(?:^|:)(?:0(?::|$))+/', $ip_parts[0], $matches, PREG_OFFSET_CAPTURE))
+ {
+ $max = 0;
+ $pos = null;
+ foreach ($matches[0] as $match)
+ {
+ if (strlen($match[0]) > $max)
+ {
+ $max = strlen($match[0]);
+ $pos = $match[1];
+ }
+ }
+
+ $ip_parts[0] = substr_replace($ip_parts[0], '::', $pos, $max);
+ }
+
+ if ($ip_parts[1] !== '')
+ {
+ return implode(':', $ip_parts);
+ }
+ else
+ {
+ return $ip_parts[0];
+ }
+ }
+
+ /**
+ * Splits an IPv6 address into the IPv6 and IPv4 representation parts
+ *
+ * RFC 4291 allows you to represent the last two parts of an IPv6 address
+ * using the standard IPv4 representation
+ *
+ * Example: 0:0:0:0:0:0:13.1.68.3
+ * 0:0:0:0:0:FFFF:129.144.52.38
+ *
+ * @param string $ip An IPv6 address
+ * @return array [0] contains the IPv6 represented part, and [1] the IPv4 represented part
+ */
+ private static function split_v6_v4($ip)
+ {
+ if (strpos($ip, '.') !== false)
+ {
+ $pos = strrpos($ip, ':');
+ $ipv6_part = substr($ip, 0, $pos);
+ $ipv4_part = substr($ip, $pos + 1);
+ return array($ipv6_part, $ipv4_part);
+ }
+ else
+ {
+ return array($ip, '');
+ }
+ }
+
+ /**
+ * Checks an IPv6 address
+ *
+ * Checks if the given IP is a valid IPv6 address
+ *
+ * @param string $ip An IPv6 address
+ * @return bool true if $ip is a valid IPv6 address
+ */
+ public static function check_ipv6($ip)
+ {
+ $ip = self::uncompress($ip);
+ list($ipv6, $ipv4) = self::split_v6_v4($ip);
+ $ipv6 = explode(':', $ipv6);
+ $ipv4 = explode('.', $ipv4);
+ if (count($ipv6) === 8 && count($ipv4) === 1 || count($ipv6) === 6 && count($ipv4) === 4)
+ {
+ foreach ($ipv6 as $ipv6_part)
+ {
+ // The section can't be empty
+ if ($ipv6_part === '')
+ return false;
+
+ // Nor can it be over four characters
+ if (strlen($ipv6_part) > 4)
+ return false;
+
+ // Remove leading zeros (this is safe because of the above)
+ $ipv6_part = ltrim($ipv6_part, '0');
+ if ($ipv6_part === '')
+ $ipv6_part = '0';
+
+ // Check the value is valid
+ $value = hexdec($ipv6_part);
+ if (dechex($value) !== strtolower($ipv6_part) || $value < 0 || $value > 0xFFFF)
+ return false;
+ }
+ if (count($ipv4) === 4)
+ {
+ foreach ($ipv4 as $ipv4_part)
+ {
+ $value = (int) $ipv4_part;
+ if ((string) $value !== $ipv4_part || $value < 0 || $value > 0xFF)
+ return false;
+ }
+ }
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ /**
+ * Checks if the given IP is a valid IPv6 address
+ *
+ * @codeCoverageIgnore
+ * @deprecated Use {@see SimplePie_Net_IPv6::check_ipv6()} instead
+ * @see check_ipv6
+ * @param string $ip An IPv6 address
+ * @return bool true if $ip is a valid IPv6 address
+ */
+ public static function checkIPv6($ip)
+ {
+ return self::check_ipv6($ip);
+ }
+}
diff --git a/vendor/simplepie/simplepie/library/SimplePie/Parse/Date.php b/vendor/simplepie/simplepie/library/SimplePie/Parse/Date.php
new file mode 100644
index 000000000..1f2156655
--- /dev/null
+++ b/vendor/simplepie/simplepie/library/SimplePie/Parse/Date.php
@@ -0,0 +1,983 @@
+<?php
+/**
+ * SimplePie
+ *
+ * A PHP-Based RSS and Atom Feed Framework.
+ * Takes the hard work out of managing a complete RSS/Atom solution.
+ *
+ * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * * Neither the name of the SimplePie Team nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
+ * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @package SimplePie
+ * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @author Ryan Parman
+ * @author Geoffrey Sneddon
+ * @author Ryan McCue
+ * @link http://simplepie.org/ SimplePie
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ */
+
+
+/**
+ * Date Parser
+ *
+ * @package SimplePie
+ * @subpackage Parsing
+ */
+class SimplePie_Parse_Date
+{
+ /**
+ * Input data
+ *
+ * @access protected
+ * @var string
+ */
+ var $date;
+
+ /**
+ * List of days, calendar day name => ordinal day number in the week
+ *
+ * @access protected
+ * @var array
+ */
+ var $day = array(
+ // English
+ 'mon' => 1,
+ 'monday' => 1,
+ 'tue' => 2,
+ 'tuesday' => 2,
+ 'wed' => 3,
+ 'wednesday' => 3,
+ 'thu' => 4,
+ 'thursday' => 4,
+ 'fri' => 5,
+ 'friday' => 5,
+ 'sat' => 6,
+ 'saturday' => 6,
+ 'sun' => 7,
+ 'sunday' => 7,
+ // Dutch
+ 'maandag' => 1,
+ 'dinsdag' => 2,
+ 'woensdag' => 3,
+ 'donderdag' => 4,
+ 'vrijdag' => 5,
+ 'zaterdag' => 6,
+ 'zondag' => 7,
+ // French
+ 'lundi' => 1,
+ 'mardi' => 2,
+ 'mercredi' => 3,
+ 'jeudi' => 4,
+ 'vendredi' => 5,
+ 'samedi' => 6,
+ 'dimanche' => 7,
+ // German
+ 'montag' => 1,
+ 'dienstag' => 2,
+ 'mittwoch' => 3,
+ 'donnerstag' => 4,
+ 'freitag' => 5,
+ 'samstag' => 6,
+ 'sonnabend' => 6,
+ 'sonntag' => 7,
+ // Italian
+ 'lunedì' => 1,
+ 'martedì' => 2,
+ 'mercoledì' => 3,
+ 'giovedì' => 4,
+ 'venerdì' => 5,
+ 'sabato' => 6,
+ 'domenica' => 7,
+ // Spanish
+ 'lunes' => 1,
+ 'martes' => 2,
+ 'miércoles' => 3,
+ 'jueves' => 4,
+ 'viernes' => 5,
+ 'sábado' => 6,
+ 'domingo' => 7,
+ // Finnish
+ 'maanantai' => 1,
+ 'tiistai' => 2,
+ 'keskiviikko' => 3,
+ 'torstai' => 4,
+ 'perjantai' => 5,
+ 'lauantai' => 6,
+ 'sunnuntai' => 7,
+ // Hungarian
+ 'hétfő' => 1,
+ 'kedd' => 2,
+ 'szerda' => 3,
+ 'csütörtok' => 4,
+ 'péntek' => 5,
+ 'szombat' => 6,
+ 'vasárnap' => 7,
+ // Greek
+ 'Δευ' => 1,
+ 'ΤÏι' => 2,
+ 'Τετ' => 3,
+ 'Πεμ' => 4,
+ 'ΠαÏ' => 5,
+ 'Σαβ' => 6,
+ 'ΚυÏ' => 7,
+ );
+
+ /**
+ * List of months, calendar month name => calendar month number
+ *
+ * @access protected
+ * @var array
+ */
+ var $month = array(
+ // English
+ 'jan' => 1,
+ 'january' => 1,
+ 'feb' => 2,
+ 'february' => 2,
+ 'mar' => 3,
+ 'march' => 3,
+ 'apr' => 4,
+ 'april' => 4,
+ 'may' => 5,
+ // No long form of May
+ 'jun' => 6,
+ 'june' => 6,
+ 'jul' => 7,
+ 'july' => 7,
+ 'aug' => 8,
+ 'august' => 8,
+ 'sep' => 9,
+ 'september' => 9,
+ 'oct' => 10,
+ 'october' => 10,
+ 'nov' => 11,
+ 'november' => 11,
+ 'dec' => 12,
+ 'december' => 12,
+ // Dutch
+ 'januari' => 1,
+ 'februari' => 2,
+ 'maart' => 3,
+ 'april' => 4,
+ 'mei' => 5,
+ 'juni' => 6,
+ 'juli' => 7,
+ 'augustus' => 8,
+ 'september' => 9,
+ 'oktober' => 10,
+ 'november' => 11,
+ 'december' => 12,
+ // French
+ 'janvier' => 1,
+ 'février' => 2,
+ 'mars' => 3,
+ 'avril' => 4,
+ 'mai' => 5,
+ 'juin' => 6,
+ 'juillet' => 7,
+ 'août' => 8,
+ 'septembre' => 9,
+ 'octobre' => 10,
+ 'novembre' => 11,
+ 'décembre' => 12,
+ // German
+ 'januar' => 1,
+ 'februar' => 2,
+ 'märz' => 3,
+ 'april' => 4,
+ 'mai' => 5,
+ 'juni' => 6,
+ 'juli' => 7,
+ 'august' => 8,
+ 'september' => 9,
+ 'oktober' => 10,
+ 'november' => 11,
+ 'dezember' => 12,
+ // Italian
+ 'gennaio' => 1,
+ 'febbraio' => 2,
+ 'marzo' => 3,
+ 'aprile' => 4,
+ 'maggio' => 5,
+ 'giugno' => 6,
+ 'luglio' => 7,
+ 'agosto' => 8,
+ 'settembre' => 9,
+ 'ottobre' => 10,
+ 'novembre' => 11,
+ 'dicembre' => 12,
+ // Spanish
+ 'enero' => 1,
+ 'febrero' => 2,
+ 'marzo' => 3,
+ 'abril' => 4,
+ 'mayo' => 5,
+ 'junio' => 6,
+ 'julio' => 7,
+ 'agosto' => 8,
+ 'septiembre' => 9,
+ 'setiembre' => 9,
+ 'octubre' => 10,
+ 'noviembre' => 11,
+ 'diciembre' => 12,
+ // Finnish
+ 'tammikuu' => 1,
+ 'helmikuu' => 2,
+ 'maaliskuu' => 3,
+ 'huhtikuu' => 4,
+ 'toukokuu' => 5,
+ 'kesäkuu' => 6,
+ 'heinäkuu' => 7,
+ 'elokuu' => 8,
+ 'suuskuu' => 9,
+ 'lokakuu' => 10,
+ 'marras' => 11,
+ 'joulukuu' => 12,
+ // Hungarian
+ 'január' => 1,
+ 'február' => 2,
+ 'március' => 3,
+ 'április' => 4,
+ 'május' => 5,
+ 'június' => 6,
+ 'július' => 7,
+ 'augusztus' => 8,
+ 'szeptember' => 9,
+ 'október' => 10,
+ 'november' => 11,
+ 'december' => 12,
+ // Greek
+ 'Ιαν' => 1,
+ 'Φεβ' => 2,
+ 'Μάώ' => 3,
+ 'Μαώ' => 3,
+ 'ΑπÏ' => 4,
+ 'Μάι' => 5,
+ 'Μαϊ' => 5,
+ 'Μαι' => 5,
+ 'ΙοÏν' => 6,
+ 'Ιον' => 6,
+ 'ΙοÏλ' => 7,
+ 'Ιολ' => 7,
+ 'ΑÏγ' => 8,
+ 'Αυγ' => 8,
+ 'Σεπ' => 9,
+ 'Οκτ' => 10,
+ 'Îοέ' => 11,
+ 'Δεκ' => 12,
+ );
+
+ /**
+ * List of timezones, abbreviation => offset from UTC
+ *
+ * @access protected
+ * @var array
+ */
+ var $timezone = array(
+ 'ACDT' => 37800,
+ 'ACIT' => 28800,
+ 'ACST' => 34200,
+ 'ACT' => -18000,
+ 'ACWDT' => 35100,
+ 'ACWST' => 31500,
+ 'AEDT' => 39600,
+ 'AEST' => 36000,
+ 'AFT' => 16200,
+ 'AKDT' => -28800,
+ 'AKST' => -32400,
+ 'AMDT' => 18000,
+ 'AMT' => -14400,
+ 'ANAST' => 46800,
+ 'ANAT' => 43200,
+ 'ART' => -10800,
+ 'AZOST' => -3600,
+ 'AZST' => 18000,
+ 'AZT' => 14400,
+ 'BIOT' => 21600,
+ 'BIT' => -43200,
+ 'BOT' => -14400,
+ 'BRST' => -7200,
+ 'BRT' => -10800,
+ 'BST' => 3600,
+ 'BTT' => 21600,
+ 'CAST' => 18000,
+ 'CAT' => 7200,
+ 'CCT' => 23400,
+ 'CDT' => -18000,
+ 'CEDT' => 7200,
+ 'CEST' => 7200,
+ 'CET' => 3600,
+ 'CGST' => -7200,
+ 'CGT' => -10800,
+ 'CHADT' => 49500,
+ 'CHAST' => 45900,
+ 'CIST' => -28800,
+ 'CKT' => -36000,
+ 'CLDT' => -10800,
+ 'CLST' => -14400,
+ 'COT' => -18000,
+ 'CST' => -21600,
+ 'CVT' => -3600,
+ 'CXT' => 25200,
+ 'DAVT' => 25200,
+ 'DTAT' => 36000,
+ 'EADT' => -18000,
+ 'EAST' => -21600,
+ 'EAT' => 10800,
+ 'ECT' => -18000,
+ 'EDT' => -14400,
+ 'EEST' => 10800,
+ 'EET' => 7200,
+ 'EGT' => -3600,
+ 'EKST' => 21600,
+ 'EST' => -18000,
+ 'FJT' => 43200,
+ 'FKDT' => -10800,
+ 'FKST' => -14400,
+ 'FNT' => -7200,
+ 'GALT' => -21600,
+ 'GEDT' => 14400,
+ 'GEST' => 10800,
+ 'GFT' => -10800,
+ 'GILT' => 43200,
+ 'GIT' => -32400,
+ 'GST' => 14400,
+ 'GST' => -7200,
+ 'GYT' => -14400,
+ 'HAA' => -10800,
+ 'HAC' => -18000,
+ 'HADT' => -32400,
+ 'HAE' => -14400,
+ 'HAP' => -25200,
+ 'HAR' => -21600,
+ 'HAST' => -36000,
+ 'HAT' => -9000,
+ 'HAY' => -28800,
+ 'HKST' => 28800,
+ 'HMT' => 18000,
+ 'HNA' => -14400,
+ 'HNC' => -21600,
+ 'HNE' => -18000,
+ 'HNP' => -28800,
+ 'HNR' => -25200,
+ 'HNT' => -12600,
+ 'HNY' => -32400,
+ 'IRDT' => 16200,
+ 'IRKST' => 32400,
+ 'IRKT' => 28800,
+ 'IRST' => 12600,
+ 'JFDT' => -10800,
+ 'JFST' => -14400,
+ 'JST' => 32400,
+ 'KGST' => 21600,
+ 'KGT' => 18000,
+ 'KOST' => 39600,
+ 'KOVST' => 28800,
+ 'KOVT' => 25200,
+ 'KRAST' => 28800,
+ 'KRAT' => 25200,
+ 'KST' => 32400,
+ 'LHDT' => 39600,
+ 'LHST' => 37800,
+ 'LINT' => 50400,
+ 'LKT' => 21600,
+ 'MAGST' => 43200,
+ 'MAGT' => 39600,
+ 'MAWT' => 21600,
+ 'MDT' => -21600,
+ 'MESZ' => 7200,
+ 'MEZ' => 3600,
+ 'MHT' => 43200,
+ 'MIT' => -34200,
+ 'MNST' => 32400,
+ 'MSDT' => 14400,
+ 'MSST' => 10800,
+ 'MST' => -25200,
+ 'MUT' => 14400,
+ 'MVT' => 18000,
+ 'MYT' => 28800,
+ 'NCT' => 39600,
+ 'NDT' => -9000,
+ 'NFT' => 41400,
+ 'NMIT' => 36000,
+ 'NOVST' => 25200,
+ 'NOVT' => 21600,
+ 'NPT' => 20700,
+ 'NRT' => 43200,
+ 'NST' => -12600,
+ 'NUT' => -39600,
+ 'NZDT' => 46800,
+ 'NZST' => 43200,
+ 'OMSST' => 25200,
+ 'OMST' => 21600,
+ 'PDT' => -25200,
+ 'PET' => -18000,
+ 'PETST' => 46800,
+ 'PETT' => 43200,
+ 'PGT' => 36000,
+ 'PHOT' => 46800,
+ 'PHT' => 28800,
+ 'PKT' => 18000,
+ 'PMDT' => -7200,
+ 'PMST' => -10800,
+ 'PONT' => 39600,
+ 'PST' => -28800,
+ 'PWT' => 32400,
+ 'PYST' => -10800,
+ 'PYT' => -14400,
+ 'RET' => 14400,
+ 'ROTT' => -10800,
+ 'SAMST' => 18000,
+ 'SAMT' => 14400,
+ 'SAST' => 7200,
+ 'SBT' => 39600,
+ 'SCDT' => 46800,
+ 'SCST' => 43200,
+ 'SCT' => 14400,
+ 'SEST' => 3600,
+ 'SGT' => 28800,
+ 'SIT' => 28800,
+ 'SRT' => -10800,
+ 'SST' => -39600,
+ 'SYST' => 10800,
+ 'SYT' => 7200,
+ 'TFT' => 18000,
+ 'THAT' => -36000,
+ 'TJT' => 18000,
+ 'TKT' => -36000,
+ 'TMT' => 18000,
+ 'TOT' => 46800,
+ 'TPT' => 32400,
+ 'TRUT' => 36000,
+ 'TVT' => 43200,
+ 'TWT' => 28800,
+ 'UYST' => -7200,
+ 'UYT' => -10800,
+ 'UZT' => 18000,
+ 'VET' => -14400,
+ 'VLAST' => 39600,
+ 'VLAT' => 36000,
+ 'VOST' => 21600,
+ 'VUT' => 39600,
+ 'WAST' => 7200,
+ 'WAT' => 3600,
+ 'WDT' => 32400,
+ 'WEST' => 3600,
+ 'WFT' => 43200,
+ 'WIB' => 25200,
+ 'WIT' => 32400,
+ 'WITA' => 28800,
+ 'WKST' => 18000,
+ 'WST' => 28800,
+ 'YAKST' => 36000,
+ 'YAKT' => 32400,
+ 'YAPT' => 36000,
+ 'YEKST' => 21600,
+ 'YEKT' => 18000,
+ );
+
+ /**
+ * Cached PCRE for SimplePie_Parse_Date::$day
+ *
+ * @access protected
+ * @var string
+ */
+ var $day_pcre;
+
+ /**
+ * Cached PCRE for SimplePie_Parse_Date::$month
+ *
+ * @access protected
+ * @var string
+ */
+ var $month_pcre;
+
+ /**
+ * Array of user-added callback methods
+ *
+ * @access private
+ * @var array
+ */
+ var $built_in = array();
+
+ /**
+ * Array of user-added callback methods
+ *
+ * @access private
+ * @var array
+ */
+ var $user = array();
+
+ /**
+ * Create new SimplePie_Parse_Date object, and set self::day_pcre,
+ * self::month_pcre, and self::built_in
+ *
+ * @access private
+ */
+ public function __construct()
+ {
+ $this->day_pcre = '(' . implode(array_keys($this->day), '|') . ')';
+ $this->month_pcre = '(' . implode(array_keys($this->month), '|') . ')';
+
+ static $cache;
+ if (!isset($cache[get_class($this)]))
+ {
+ $all_methods = get_class_methods($this);
+
+ foreach ($all_methods as $method)
+ {
+ if (strtolower(substr($method, 0, 5)) === 'date_')
+ {
+ $cache[get_class($this)][] = $method;
+ }
+ }
+ }
+
+ foreach ($cache[get_class($this)] as $method)
+ {
+ $this->built_in[] = $method;
+ }
+ }
+
+ /**
+ * Get the object
+ *
+ * @access public
+ */
+ public static function get()
+ {
+ static $object;
+ if (!$object)
+ {
+ $object = new SimplePie_Parse_Date;
+ }
+ return $object;
+ }
+
+ /**
+ * Parse a date
+ *
+ * @final
+ * @access public
+ * @param string $date Date to parse
+ * @return int Timestamp corresponding to date string, or false on failure
+ */
+ public function parse($date)
+ {
+ foreach ($this->user as $method)
+ {
+ if (($returned = call_user_func($method, $date)) !== false)
+ {
+ return $returned;
+ }
+ }
+
+ foreach ($this->built_in as $method)
+ {
+ if (($returned = call_user_func(array($this, $method), $date)) !== false)
+ {
+ return $returned;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Add a callback method to parse a date
+ *
+ * @final
+ * @access public
+ * @param callback $callback
+ */
+ public function add_callback($callback)
+ {
+ if (is_callable($callback))
+ {
+ $this->user[] = $callback;
+ }
+ else
+ {
+ trigger_error('User-supplied function must be a valid callback', E_USER_WARNING);
+ }
+ }
+
+ /**
+ * Parse a superset of W3C-DTF (allows hyphens and colons to be omitted, as
+ * well as allowing any of upper or lower case "T", horizontal tabs, or
+ * spaces to be used as the time separator (including more than one))
+ *
+ * @access protected
+ * @return int Timestamp
+ */
+ public function date_w3cdtf($date)
+ {
+ static $pcre;
+ if (!$pcre)
+ {
+ $year = '([0-9]{4})';
+ $month = $day = $hour = $minute = $second = '([0-9]{2})';
+ $decimal = '([0-9]*)';
+ $zone = '(?:(Z)|([+\-])([0-9]{1,2}):?([0-9]{1,2}))';
+ $pcre = '/^' . $year . '(?:-?' . $month . '(?:-?' . $day . '(?:[Tt\x09\x20]+' . $hour . '(?::?' . $minute . '(?::?' . $second . '(?:.' . $decimal . ')?)?)?' . $zone . ')?)?)?$/';
+ }
+ if (preg_match($pcre, $date, $match))
+ {
+ /*
+ Capturing subpatterns:
+ 1: Year
+ 2: Month
+ 3: Day
+ 4: Hour
+ 5: Minute
+ 6: Second
+ 7: Decimal fraction of a second
+ 8: Zulu
+ 9: Timezone ±
+ 10: Timezone hours
+ 11: Timezone minutes
+ */
+
+ // Fill in empty matches
+ for ($i = count($match); $i <= 3; $i++)
+ {
+ $match[$i] = '1';
+ }
+
+ for ($i = count($match); $i <= 7; $i++)
+ {
+ $match[$i] = '0';
+ }
+
+ // Numeric timezone
+ if (isset($match[9]) && $match[9] !== '')
+ {
+ $timezone = $match[10] * 3600;
+ $timezone += $match[11] * 60;
+ if ($match[9] === '-')
+ {
+ $timezone = 0 - $timezone;
+ }
+ }
+ else
+ {
+ $timezone = 0;
+ }
+
+ // Convert the number of seconds to an integer, taking decimals into account
+ $second = round((int)$match[6] + (int)$match[7] / pow(10, strlen($match[7])));
+
+ return gmmktime($match[4], $match[5], $second, $match[2], $match[3], $match[1]) - $timezone;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ /**
+ * Remove RFC822 comments
+ *
+ * @access protected
+ * @param string $data Data to strip comments from
+ * @return string Comment stripped string
+ */
+ public function remove_rfc2822_comments($string)
+ {
+ $string = (string) $string;
+ $position = 0;
+ $length = strlen($string);
+ $depth = 0;
+
+ $output = '';
+
+ while ($position < $length && ($pos = strpos($string, '(', $position)) !== false)
+ {
+ $output .= substr($string, $position, $pos - $position);
+ $position = $pos + 1;
+ if ($pos === 0 || $string[$pos - 1] !== '\\')
+ {
+ $depth++;
+ while ($depth && $position < $length)
+ {
+ $position += strcspn($string, '()', $position);
+ if ($string[$position - 1] === '\\')
+ {
+ $position++;
+ continue;
+ }
+ elseif (isset($string[$position]))
+ {
+ switch ($string[$position])
+ {
+ case '(':
+ $depth++;
+ break;
+
+ case ')':
+ $depth--;
+ break;
+ }
+ $position++;
+ }
+ else
+ {
+ break;
+ }
+ }
+ }
+ else
+ {
+ $output .= '(';
+ }
+ }
+ $output .= substr($string, $position);
+
+ return $output;
+ }
+
+ /**
+ * Parse RFC2822's date format
+ *
+ * @access protected
+ * @return int Timestamp
+ */
+ public function date_rfc2822($date)
+ {
+ static $pcre;
+ if (!$pcre)
+ {
+ $wsp = '[\x09\x20]';
+ $fws = '(?:' . $wsp . '+|' . $wsp . '*(?:\x0D\x0A' . $wsp . '+)+)';
+ $optional_fws = $fws . '?';
+ $day_name = $this->day_pcre;
+ $month = $this->month_pcre;
+ $day = '([0-9]{1,2})';
+ $hour = $minute = $second = '([0-9]{2})';
+ $year = '([0-9]{2,4})';
+ $num_zone = '([+\-])([0-9]{2})([0-9]{2})';
+ $character_zone = '([A-Z]{1,5})';
+ $zone = '(?:' . $num_zone . '|' . $character_zone . ')';
+ $pcre = '/(?:' . $optional_fws . $day_name . $optional_fws . ',)?' . $optional_fws . $day . $fws . $month . $fws . $year . $fws . $hour . $optional_fws . ':' . $optional_fws . $minute . '(?:' . $optional_fws . ':' . $optional_fws . $second . ')?' . $fws . $zone . '/i';
+ }
+ if (preg_match($pcre, $this->remove_rfc2822_comments($date), $match))
+ {
+ /*
+ Capturing subpatterns:
+ 1: Day name
+ 2: Day
+ 3: Month
+ 4: Year
+ 5: Hour
+ 6: Minute
+ 7: Second
+ 8: Timezone ±
+ 9: Timezone hours
+ 10: Timezone minutes
+ 11: Alphabetic timezone
+ */
+
+ // Find the month number
+ $month = $this->month[strtolower($match[3])];
+
+ // Numeric timezone
+ if ($match[8] !== '')
+ {
+ $timezone = $match[9] * 3600;
+ $timezone += $match[10] * 60;
+ if ($match[8] === '-')
+ {
+ $timezone = 0 - $timezone;
+ }
+ }
+ // Character timezone
+ elseif (isset($this->timezone[strtoupper($match[11])]))
+ {
+ $timezone = $this->timezone[strtoupper($match[11])];
+ }
+ // Assume everything else to be -0000
+ else
+ {
+ $timezone = 0;
+ }
+
+ // Deal with 2/3 digit years
+ if ($match[4] < 50)
+ {
+ $match[4] += 2000;
+ }
+ elseif ($match[4] < 1000)
+ {
+ $match[4] += 1900;
+ }
+
+ // Second is optional, if it is empty set it to zero
+ if ($match[7] !== '')
+ {
+ $second = $match[7];
+ }
+ else
+ {
+ $second = 0;
+ }
+
+ return gmmktime($match[5], $match[6], $second, $month, $match[2], $match[4]) - $timezone;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ /**
+ * Parse RFC850's date format
+ *
+ * @access protected
+ * @return int Timestamp
+ */
+ public function date_rfc850($date)
+ {
+ static $pcre;
+ if (!$pcre)
+ {
+ $space = '[\x09\x20]+';
+ $day_name = $this->day_pcre;
+ $month = $this->month_pcre;
+ $day = '([0-9]{1,2})';
+ $year = $hour = $minute = $second = '([0-9]{2})';
+ $zone = '([A-Z]{1,5})';
+ $pcre = '/^' . $day_name . ',' . $space . $day . '-' . $month . '-' . $year . $space . $hour . ':' . $minute . ':' . $second . $space . $zone . '$/i';
+ }
+ if (preg_match($pcre, $date, $match))
+ {
+ /*
+ Capturing subpatterns:
+ 1: Day name
+ 2: Day
+ 3: Month
+ 4: Year
+ 5: Hour
+ 6: Minute
+ 7: Second
+ 8: Timezone
+ */
+
+ // Month
+ $month = $this->month[strtolower($match[3])];
+
+ // Character timezone
+ if (isset($this->timezone[strtoupper($match[8])]))
+ {
+ $timezone = $this->timezone[strtoupper($match[8])];
+ }
+ // Assume everything else to be -0000
+ else
+ {
+ $timezone = 0;
+ }
+
+ // Deal with 2 digit year
+ if ($match[4] < 50)
+ {
+ $match[4] += 2000;
+ }
+ else
+ {
+ $match[4] += 1900;
+ }
+
+ return gmmktime($match[5], $match[6], $match[7], $month, $match[2], $match[4]) - $timezone;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ /**
+ * Parse C99's asctime()'s date format
+ *
+ * @access protected
+ * @return int Timestamp
+ */
+ public function date_asctime($date)
+ {
+ static $pcre;
+ if (!$pcre)
+ {
+ $space = '[\x09\x20]+';
+ $wday_name = $this->day_pcre;
+ $mon_name = $this->month_pcre;
+ $day = '([0-9]{1,2})';
+ $hour = $sec = $min = '([0-9]{2})';
+ $year = '([0-9]{4})';
+ $terminator = '\x0A?\x00?';
+ $pcre = '/^' . $wday_name . $space . $mon_name . $space . $day . $space . $hour . ':' . $min . ':' . $sec . $space . $year . $terminator . '$/i';
+ }
+ if (preg_match($pcre, $date, $match))
+ {
+ /*
+ Capturing subpatterns:
+ 1: Day name
+ 2: Month
+ 3: Day
+ 4: Hour
+ 5: Minute
+ 6: Second
+ 7: Year
+ */
+
+ $month = $this->month[strtolower($match[2])];
+ return gmmktime($match[4], $match[5], $match[6], $month, $match[3], $match[7]);
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ /**
+ * Parse dates using strtotime()
+ *
+ * @access protected
+ * @return int Timestamp
+ */
+ public function date_strtotime($date)
+ {
+ $strtotime = strtotime($date);
+ if ($strtotime === -1 || $strtotime === false)
+ {
+ return false;
+ }
+ else
+ {
+ return $strtotime;
+ }
+ }
+}
+
diff --git a/vendor/simplepie/simplepie/library/SimplePie/Parser.php b/vendor/simplepie/simplepie/library/SimplePie/Parser.php
new file mode 100644
index 000000000..17139abe9
--- /dev/null
+++ b/vendor/simplepie/simplepie/library/SimplePie/Parser.php
@@ -0,0 +1,656 @@
+<?php
+/**
+ * SimplePie
+ *
+ * A PHP-Based RSS and Atom Feed Framework.
+ * Takes the hard work out of managing a complete RSS/Atom solution.
+ *
+ * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * * Neither the name of the SimplePie Team nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
+ * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @package SimplePie
+ * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @author Ryan Parman
+ * @author Geoffrey Sneddon
+ * @author Ryan McCue
+ * @link http://simplepie.org/ SimplePie
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ */
+
+/**
+ * Parses XML into something sane
+ *
+ *
+ * This class can be overloaded with {@see SimplePie::set_parser_class()}
+ *
+ * @package SimplePie
+ * @subpackage Parsing
+ */
+class SimplePie_Parser
+{
+ var $error_code;
+ var $error_string;
+ var $current_line;
+ var $current_column;
+ var $current_byte;
+ var $separator = ' ';
+ var $namespace = array('');
+ var $element = array('');
+ var $xml_base = array('');
+ var $xml_base_explicit = array(false);
+ var $xml_lang = array('');
+ var $data = array();
+ var $datas = array(array());
+ var $current_xhtml_construct = -1;
+ var $encoding;
+ protected $registry;
+
+ public function set_registry(SimplePie_Registry $registry)
+ {
+ $this->registry = $registry;
+ }
+
+ public function parse(&$data, $encoding, $url = '')
+ {
+ if (function_exists('Mf2\parse')) {
+ // Check for both h-feed and h-entry, as both a feed with no entries
+ // and a list of entries without an h-feed wrapper are both valid.
+ $position = 0;
+ while ($position = strpos($data, 'h-feed', $position)) {
+ $start = $position < 200 ? 0 : $position - 200;
+ $check = substr($data, $start, 400);
+ if (preg_match('/class="[^"]*h-feed/', $check)) {
+ return $this->parse_microformats($data, $url);
+ }
+ $position += 7;
+ }
+ $position = 0;
+ while ($position = strpos($data, 'h-entry', $position)) {
+ $start = $position < 200 ? 0 : $position - 200;
+ $check = substr($data, $start, 400);
+ if (preg_match('/class="[^"]*h-entry/', $check)) {
+ return $this->parse_microformats($data, $url);
+ }
+ $position += 7;
+ }
+ }
+
+ // Use UTF-8 if we get passed US-ASCII, as every US-ASCII character is a UTF-8 character
+ if (strtoupper($encoding) === 'US-ASCII')
+ {
+ $this->encoding = 'UTF-8';
+ }
+ else
+ {
+ $this->encoding = $encoding;
+ }
+
+ // Strip BOM:
+ // UTF-32 Big Endian BOM
+ if (substr($data, 0, 4) === "\x00\x00\xFE\xFF")
+ {
+ $data = substr($data, 4);
+ }
+ // UTF-32 Little Endian BOM
+ elseif (substr($data, 0, 4) === "\xFF\xFE\x00\x00")
+ {
+ $data = substr($data, 4);
+ }
+ // UTF-16 Big Endian BOM
+ elseif (substr($data, 0, 2) === "\xFE\xFF")
+ {
+ $data = substr($data, 2);
+ }
+ // UTF-16 Little Endian BOM
+ elseif (substr($data, 0, 2) === "\xFF\xFE")
+ {
+ $data = substr($data, 2);
+ }
+ // UTF-8 BOM
+ elseif (substr($data, 0, 3) === "\xEF\xBB\xBF")
+ {
+ $data = substr($data, 3);
+ }
+
+ if (substr($data, 0, 5) === '<?xml' && strspn(substr($data, 5, 1), "\x09\x0A\x0D\x20") && ($pos = strpos($data, '?>')) !== false)
+ {
+ $declaration = $this->registry->create('XML_Declaration_Parser', array(substr($data, 5, $pos - 5)));
+ if ($declaration->parse())
+ {
+ $data = substr($data, $pos + 2);
+ $data = '<?xml version="' . $declaration->version . '" encoding="' . $encoding . '" standalone="' . (($declaration->standalone) ? 'yes' : 'no') . '"?>' ."\n". $this->declare_html_entities() . $data;
+ }
+ else
+ {
+ $this->error_string = 'SimplePie bug! Please report this!';
+ return false;
+ }
+ }
+
+ $return = true;
+
+ static $xml_is_sane = null;
+ if ($xml_is_sane === null)
+ {
+ $parser_check = xml_parser_create();
+ xml_parse_into_struct($parser_check, '<foo>&amp;</foo>', $values);
+ xml_parser_free($parser_check);
+ $xml_is_sane = isset($values[0]['value']);
+ }
+
+ // Create the parser
+ if ($xml_is_sane)
+ {
+ $xml = xml_parser_create_ns($this->encoding, $this->separator);
+ xml_parser_set_option($xml, XML_OPTION_SKIP_WHITE, 1);
+ xml_parser_set_option($xml, XML_OPTION_CASE_FOLDING, 0);
+ xml_set_object($xml, $this);
+ xml_set_character_data_handler($xml, 'cdata');
+ xml_set_element_handler($xml, 'tag_open', 'tag_close');
+
+ // Parse!
+ if (!xml_parse($xml, $data, true))
+ {
+ $this->error_code = xml_get_error_code($xml);
+ $this->error_string = xml_error_string($this->error_code);
+ $return = false;
+ }
+ $this->current_line = xml_get_current_line_number($xml);
+ $this->current_column = xml_get_current_column_number($xml);
+ $this->current_byte = xml_get_current_byte_index($xml);
+ xml_parser_free($xml);
+ return $return;
+ }
+ else
+ {
+ libxml_clear_errors();
+ $xml = new XMLReader();
+ $xml->xml($data);
+ while (@$xml->read())
+ {
+ switch ($xml->nodeType)
+ {
+
+ case constant('XMLReader::END_ELEMENT'):
+ if ($xml->namespaceURI !== '')
+ {
+ $tagName = $xml->namespaceURI . $this->separator . $xml->localName;
+ }
+ else
+ {
+ $tagName = $xml->localName;
+ }
+ $this->tag_close(null, $tagName);
+ break;
+ case constant('XMLReader::ELEMENT'):
+ $empty = $xml->isEmptyElement;
+ if ($xml->namespaceURI !== '')
+ {
+ $tagName = $xml->namespaceURI . $this->separator . $xml->localName;
+ }
+ else
+ {
+ $tagName = $xml->localName;
+ }
+ $attributes = array();
+ while ($xml->moveToNextAttribute())
+ {
+ if ($xml->namespaceURI !== '')
+ {
+ $attrName = $xml->namespaceURI . $this->separator . $xml->localName;
+ }
+ else
+ {
+ $attrName = $xml->localName;
+ }
+ $attributes[$attrName] = $xml->value;
+ }
+ $this->tag_open(null, $tagName, $attributes);
+ if ($empty)
+ {
+ $this->tag_close(null, $tagName);
+ }
+ break;
+ case constant('XMLReader::TEXT'):
+
+ case constant('XMLReader::CDATA'):
+ $this->cdata(null, $xml->value);
+ break;
+ }
+ }
+ if ($error = libxml_get_last_error())
+ {
+ $this->error_code = $error->code;
+ $this->error_string = $error->message;
+ $this->current_line = $error->line;
+ $this->current_column = $error->column;
+ return false;
+ }
+ else
+ {
+ return true;
+ }
+ }
+ }
+
+ public function get_error_code()
+ {
+ return $this->error_code;
+ }
+
+ public function get_error_string()
+ {
+ return $this->error_string;
+ }
+
+ public function get_current_line()
+ {
+ return $this->current_line;
+ }
+
+ public function get_current_column()
+ {
+ return $this->current_column;
+ }
+
+ public function get_current_byte()
+ {
+ return $this->current_byte;
+ }
+
+ public function get_data()
+ {
+ return $this->data;
+ }
+
+ public function tag_open($parser, $tag, $attributes)
+ {
+ list($this->namespace[], $this->element[]) = $this->split_ns($tag);
+
+ $attribs = array();
+ foreach ($attributes as $name => $value)
+ {
+ list($attrib_namespace, $attribute) = $this->split_ns($name);
+ $attribs[$attrib_namespace][$attribute] = $value;
+ }
+
+ if (isset($attribs[SIMPLEPIE_NAMESPACE_XML]['base']))
+ {
+ $base = $this->registry->call('Misc', 'absolutize_url', array($attribs[SIMPLEPIE_NAMESPACE_XML]['base'], end($this->xml_base)));
+ if ($base !== false)
+ {
+ $this->xml_base[] = $base;
+ $this->xml_base_explicit[] = true;
+ }
+ }
+ else
+ {
+ $this->xml_base[] = end($this->xml_base);
+ $this->xml_base_explicit[] = end($this->xml_base_explicit);
+ }
+
+ if (isset($attribs[SIMPLEPIE_NAMESPACE_XML]['lang']))
+ {
+ $this->xml_lang[] = $attribs[SIMPLEPIE_NAMESPACE_XML]['lang'];
+ }
+ else
+ {
+ $this->xml_lang[] = end($this->xml_lang);
+ }
+
+ if ($this->current_xhtml_construct >= 0)
+ {
+ $this->current_xhtml_construct++;
+ if (end($this->namespace) === SIMPLEPIE_NAMESPACE_XHTML)
+ {
+ $this->data['data'] .= '<' . end($this->element);
+ if (isset($attribs['']))
+ {
+ foreach ($attribs[''] as $name => $value)
+ {
+ $this->data['data'] .= ' ' . $name . '="' . htmlspecialchars($value, ENT_COMPAT, $this->encoding) . '"';
+ }
+ }
+ $this->data['data'] .= '>';
+ }
+ }
+ else
+ {
+ $this->datas[] =& $this->data;
+ $this->data =& $this->data['child'][end($this->namespace)][end($this->element)][];
+ $this->data = array('data' => '', 'attribs' => $attribs, 'xml_base' => end($this->xml_base), 'xml_base_explicit' => end($this->xml_base_explicit), 'xml_lang' => end($this->xml_lang));
+ if ((end($this->namespace) === SIMPLEPIE_NAMESPACE_ATOM_03 && in_array(end($this->element), array('title', 'tagline', 'copyright', 'info', 'summary', 'content')) && isset($attribs['']['mode']) && $attribs['']['mode'] === 'xml')
+ || (end($this->namespace) === SIMPLEPIE_NAMESPACE_ATOM_10 && in_array(end($this->element), array('rights', 'subtitle', 'summary', 'info', 'title', 'content')) && isset($attribs['']['type']) && $attribs['']['type'] === 'xhtml')
+ || (end($this->namespace) === SIMPLEPIE_NAMESPACE_RSS_20 && in_array(end($this->element), array('title')))
+ || (end($this->namespace) === SIMPLEPIE_NAMESPACE_RSS_090 && in_array(end($this->element), array('title')))
+ || (end($this->namespace) === SIMPLEPIE_NAMESPACE_RSS_10 && in_array(end($this->element), array('title'))))
+ {
+ $this->current_xhtml_construct = 0;
+ }
+ }
+ }
+
+ public function cdata($parser, $cdata)
+ {
+ if ($this->current_xhtml_construct >= 0)
+ {
+ $this->data['data'] .= htmlspecialchars($cdata, ENT_QUOTES, $this->encoding);
+ }
+ else
+ {
+ $this->data['data'] .= $cdata;
+ }
+ }
+
+ public function tag_close($parser, $tag)
+ {
+ if ($this->current_xhtml_construct >= 0)
+ {
+ $this->current_xhtml_construct--;
+ if (end($this->namespace) === SIMPLEPIE_NAMESPACE_XHTML && !in_array(end($this->element), array('area', 'base', 'basefont', 'br', 'col', 'frame', 'hr', 'img', 'input', 'isindex', 'link', 'meta', 'param')))
+ {
+ $this->data['data'] .= '</' . end($this->element) . '>';
+ }
+ }
+ if ($this->current_xhtml_construct === -1)
+ {
+ $this->data =& $this->datas[count($this->datas) - 1];
+ array_pop($this->datas);
+ }
+
+ array_pop($this->element);
+ array_pop($this->namespace);
+ array_pop($this->xml_base);
+ array_pop($this->xml_base_explicit);
+ array_pop($this->xml_lang);
+ }
+
+ public function split_ns($string)
+ {
+ static $cache = array();
+ if (!isset($cache[$string]))
+ {
+ if ($pos = strpos($string, $this->separator))
+ {
+ static $separator_length;
+ if (!$separator_length)
+ {
+ $separator_length = strlen($this->separator);
+ }
+ $namespace = substr($string, 0, $pos);
+ $local_name = substr($string, $pos + $separator_length);
+ if (strtolower($namespace) === SIMPLEPIE_NAMESPACE_ITUNES)
+ {
+ $namespace = SIMPLEPIE_NAMESPACE_ITUNES;
+ }
+
+ // Normalize the Media RSS namespaces
+ if ($namespace === SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG ||
+ $namespace === SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG2 ||
+ $namespace === SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG3 ||
+ $namespace === SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG4 ||
+ $namespace === SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG5 )
+ {
+ $namespace = SIMPLEPIE_NAMESPACE_MEDIARSS;
+ }
+ $cache[$string] = array($namespace, $local_name);
+ }
+ else
+ {
+ $cache[$string] = array('', $string);
+ }
+ }
+ return $cache[$string];
+ }
+
+ private function parse_hcard($data, $category = false) {
+ $name = '';
+ $link = '';
+ // Check if h-card is set and pass that information on in the link.
+ if (isset($data['type']) && in_array('h-card', $data['type'])) {
+ if (isset($data['properties']['name'][0])) {
+ $name = $data['properties']['name'][0];
+ }
+ if (isset($data['properties']['url'][0])) {
+ $link = $data['properties']['url'][0];
+ if ($name === '') {
+ $name = $link;
+ }
+ else {
+ // can't have commas in categories.
+ $name = str_replace(',', '', $name);
+ }
+ $person_tag = $category ? '<span class="person-tag"></span>' : '';
+ return '<a class="h-card" href="'.$link.'">'.$person_tag.$name.'</a>';
+ }
+ }
+ return isset($data['value']) ? $data['value'] : '';
+ }
+
+ private function parse_microformats(&$data, $url) {
+ $feed_title = '';
+ $feed_author = NULL;
+ $author_cache = array();
+ $items = array();
+ $entries = array();
+ $mf = Mf2\parse($data, $url);
+ // First look for an h-feed.
+ $h_feed = array();
+ foreach ($mf['items'] as $mf_item) {
+ if (in_array('h-feed', $mf_item['type'])) {
+ $h_feed = $mf_item;
+ break;
+ }
+ // Also look for an h-feed in the children of each top level item.
+ if (!isset($mf_item['children'][0]['type'])) continue;
+ if (in_array('h-feed', $mf_item['children'][0]['type'])) {
+ $h_feed = $mf_item['children'][0];
+ // In this case the parent of the h-feed may be an h-card, so use it as
+ // the feed_author.
+ if (in_array('h-card', $mf_item['type'])) $feed_author = $mf_item;
+ break;
+ }
+ }
+ if (isset($h_feed['children'])) {
+ $entries = $h_feed['children'];
+ // Also set the feed title and store author from the h-feed if available.
+ if (isset($mf['items'][0]['properties']['name'][0])) {
+ $feed_title = $mf['items'][0]['properties']['name'][0];
+ }
+ if (isset($mf['items'][0]['properties']['author'][0])) {
+ $feed_author = $mf['items'][0]['properties']['author'][0];
+ }
+ }
+ else {
+ $entries = $mf['items'];
+ }
+ for ($i = 0; $i < count($entries); $i++) {
+ $entry = $entries[$i];
+ if (in_array('h-entry', $entry['type'])) {
+ $item = array();
+ $title = '';
+ $description = '';
+ if (isset($entry['properties']['url'][0])) {
+ $link = $entry['properties']['url'][0];
+ if (isset($link['value'])) $link = $link['value'];
+ $item['link'] = array(array('data' => $link));
+ }
+ if (isset($entry['properties']['uid'][0])) {
+ $guid = $entry['properties']['uid'][0];
+ if (isset($guid['value'])) $guid = $guid['value'];
+ $item['guid'] = array(array('data' => $guid));
+ }
+ if (isset($entry['properties']['name'][0])) {
+ $title = $entry['properties']['name'][0];
+ if (isset($title['value'])) $title = $title['value'];
+ $item['title'] = array(array('data' => $title));
+ }
+ if (isset($entry['properties']['author'][0]) || isset($feed_author)) {
+ // author is a special case, it can be plain text or an h-card array.
+ // If it's plain text it can also be a url that should be followed to
+ // get the actual h-card.
+ $author = isset($entry['properties']['author'][0]) ?
+ $entry['properties']['author'][0] : $feed_author;
+ if (!is_string($author)) {
+ $author = $this->parse_hcard($author);
+ }
+ else if (strpos($author, 'http') === 0) {
+ if (isset($author_cache[$author])) {
+ $author = $author_cache[$author];
+ }
+ else {
+ $mf = Mf2\fetch($author);
+ foreach ($mf['items'] as $hcard) {
+ // Only interested in an h-card by itself in this case.
+ if (!in_array('h-card', $hcard['type'])) {
+ continue;
+ }
+ // It must have a url property matching what we fetched.
+ if (!isset($hcard['properties']['url']) ||
+ !(in_array($author, $hcard['properties']['url']))) {
+ continue;
+ }
+ // Save parse_hcard the trouble of finding the correct url.
+ $hcard['properties']['url'][0] = $author;
+ // Cache this h-card for the next h-entry to check.
+ $author_cache[$author] = $this->parse_hcard($hcard);
+ $author = $author_cache[$author];
+ break;
+ }
+ }
+ }
+ $item['author'] = array(array('data' => $author));
+ }
+ if (isset($entry['properties']['photo'][0])) {
+ // If a photo is also in content, don't need to add it again here.
+ $content = '';
+ if (isset($entry['properties']['content'][0]['html'])) {
+ $content = $entry['properties']['content'][0]['html'];
+ }
+ $photo_list = array();
+ for ($j = 0; $j < count($entry['properties']['photo']); $j++) {
+ $photo = $entry['properties']['photo'][$j];
+ if (strpos($content, $photo) === false) {
+ $photo_list[] = $photo;
+ }
+ }
+ // When there's more than one photo show the first and use a lightbox.
+ $count = count($photo_list);
+ if ($count > 1) {
+ $description = '<p>';
+ for ($j = 0; $j < $count; $j++) {
+ $hidden = $j === 0 ? '' : 'class="hidden" ';
+ $description .= '<a href="'.$photo_list[$j].'" '.$hidden.
+ 'data-lightbox="image-set-'.$i.'">'.
+ '<img src="'.$photo_list[$j].'"></a>';
+ }
+ $description .= '<br><b>'.$count.' photos</b></p>';
+ }
+ else if ($count == 1) {
+ $description = '<p><img src="'.$photo_list[0].'"></p>';
+ }
+ }
+ if (isset($entry['properties']['content'][0]['html'])) {
+ // e-content['value'] is the same as p-name when they are on the same
+ // element. Use this to replace title with a strip_tags version so
+ // that alt text from images is not included in the title.
+ if ($entry['properties']['content'][0]['value'] === $title) {
+ $title = strip_tags($entry['properties']['content'][0]['html']);
+ $item['title'] = array(array('data' => $title));
+ }
+ $description .= $entry['properties']['content'][0]['html'];
+ if (isset($entry['properties']['in-reply-to'][0]['value'])) {
+ $in_reply_to = $entry['properties']['in-reply-to'][0]['value'];
+ $description .= '<p><span class="in-reply-to"></span> '.
+ '<a href="'.$in_reply_to.'">'.$in_reply_to.'</a><p>';
+ }
+ $item['description'] = array(array('data' => $description));
+ }
+ if (isset($entry['properties']['category'])) {
+ $category_csv = '';
+ // Categories can also contain h-cards.
+ foreach ($entry['properties']['category'] as $category) {
+ if ($category_csv !== '') $category_csv .= ', ';
+ if (is_string($category)) {
+ // Can't have commas in categories.
+ $category_csv .= str_replace(',', '', $category);
+ }
+ else {
+ $category_csv .= $this->parse_hcard($category, true);
+ }
+ }
+ $item['category'] = array(array('data' => $category_csv));
+ }
+ if (isset($entry['properties']['published'][0])) {
+ $timestamp = strtotime($entry['properties']['published'][0]);
+ $pub_date = date('F j Y g:ia', $timestamp).' GMT';
+ $item['pubDate'] = array(array('data' => $pub_date));
+ }
+ // The title and description are set to the empty string to represent
+ // a deleted item (which also makes it an invalid rss item).
+ if (isset($entry['properties']['deleted'][0])) {
+ $item['title'] = array(array('data' => ''));
+ $item['description'] = array(array('data' => ''));
+ }
+ $items[] = array('child' => array('' => $item));
+ }
+ }
+ // Mimic RSS data format when storing microformats.
+ $link = array(array('data' => $url));
+ $image = '';
+ if (!is_string($feed_author) &&
+ isset($feed_author['properties']['photo'][0])) {
+ $image = array(array('child' => array('' => array('url' =>
+ array(array('data' => $feed_author['properties']['photo'][0]))))));
+ }
+ // Use the a name given for the h-feed, or get the title from the html.
+ if ($feed_title !== '') {
+ $feed_title = array(array('data' => htmlspecialchars($feed_title)));
+ }
+ else if ($position = strpos($data, '<title>')) {
+ $start = $position < 200 ? 0 : $position - 200;
+ $check = substr($data, $start, 400);
+ $matches = array();
+ if (preg_match('/<title>(.+)<\/title>/', $check, $matches)) {
+ $feed_title = array(array('data' => htmlspecialchars($matches[1])));
+ }
+ }
+ $channel = array('channel' => array(array('child' => array('' =>
+ array('link' => $link, 'image' => $image, 'title' => $feed_title,
+ 'item' => $items)))));
+ $rss = array(array('attribs' => array('' => array('version' => '2.0')),
+ 'child' => array('' => $channel)));
+ $this->data = array('child' => array('' => array('rss' => $rss)));
+ return true;
+ }
+
+ private function declare_html_entities() {
+ // This is required because the RSS specification says that entity-encoded
+ // html is allowed, but the xml specification says they must be declared.
+ return '<!DOCTYPE html [ <!ENTITY nbsp "&#x00A0;"> <!ENTITY iexcl "&#x00A1;"> <!ENTITY cent "&#x00A2;"> <!ENTITY pound "&#x00A3;"> <!ENTITY curren "&#x00A4;"> <!ENTITY yen "&#x00A5;"> <!ENTITY brvbar "&#x00A6;"> <!ENTITY sect "&#x00A7;"> <!ENTITY uml "&#x00A8;"> <!ENTITY copy "&#x00A9;"> <!ENTITY ordf "&#x00AA;"> <!ENTITY laquo "&#x00AB;"> <!ENTITY not "&#x00AC;"> <!ENTITY shy "&#x00AD;"> <!ENTITY reg "&#x00AE;"> <!ENTITY macr "&#x00AF;"> <!ENTITY deg "&#x00B0;"> <!ENTITY plusmn "&#x00B1;"> <!ENTITY sup2 "&#x00B2;"> <!ENTITY sup3 "&#x00B3;"> <!ENTITY acute "&#x00B4;"> <!ENTITY micro "&#x00B5;"> <!ENTITY para "&#x00B6;"> <!ENTITY middot "&#x00B7;"> <!ENTITY cedil "&#x00B8;"> <!ENTITY sup1 "&#x00B9;"> <!ENTITY ordm "&#x00BA;"> <!ENTITY raquo "&#x00BB;"> <!ENTITY frac14 "&#x00BC;"> <!ENTITY frac12 "&#x00BD;"> <!ENTITY frac34 "&#x00BE;"> <!ENTITY iquest "&#x00BF;"> <!ENTITY Agrave "&#x00C0;"> <!ENTITY Aacute "&#x00C1;"> <!ENTITY Acirc "&#x00C2;"> <!ENTITY Atilde "&#x00C3;"> <!ENTITY Auml "&#x00C4;"> <!ENTITY Aring "&#x00C5;"> <!ENTITY AElig "&#x00C6;"> <!ENTITY Ccedil "&#x00C7;"> <!ENTITY Egrave "&#x00C8;"> <!ENTITY Eacute "&#x00C9;"> <!ENTITY Ecirc "&#x00CA;"> <!ENTITY Euml "&#x00CB;"> <!ENTITY Igrave "&#x00CC;"> <!ENTITY Iacute "&#x00CD;"> <!ENTITY Icirc "&#x00CE;"> <!ENTITY Iuml "&#x00CF;"> <!ENTITY ETH "&#x00D0;"> <!ENTITY Ntilde "&#x00D1;"> <!ENTITY Ograve "&#x00D2;"> <!ENTITY Oacute "&#x00D3;"> <!ENTITY Ocirc "&#x00D4;"> <!ENTITY Otilde "&#x00D5;"> <!ENTITY Ouml "&#x00D6;"> <!ENTITY times "&#x00D7;"> <!ENTITY Oslash "&#x00D8;"> <!ENTITY Ugrave "&#x00D9;"> <!ENTITY Uacute "&#x00DA;"> <!ENTITY Ucirc "&#x00DB;"> <!ENTITY Uuml "&#x00DC;"> <!ENTITY Yacute "&#x00DD;"> <!ENTITY THORN "&#x00DE;"> <!ENTITY szlig "&#x00DF;"> <!ENTITY agrave "&#x00E0;"> <!ENTITY aacute "&#x00E1;"> <!ENTITY acirc "&#x00E2;"> <!ENTITY atilde "&#x00E3;"> <!ENTITY auml "&#x00E4;"> <!ENTITY aring "&#x00E5;"> <!ENTITY aelig "&#x00E6;"> <!ENTITY ccedil "&#x00E7;"> <!ENTITY egrave "&#x00E8;"> <!ENTITY eacute "&#x00E9;"> <!ENTITY ecirc "&#x00EA;"> <!ENTITY euml "&#x00EB;"> <!ENTITY igrave "&#x00EC;"> <!ENTITY iacute "&#x00ED;"> <!ENTITY icirc "&#x00EE;"> <!ENTITY iuml "&#x00EF;"> <!ENTITY eth "&#x00F0;"> <!ENTITY ntilde "&#x00F1;"> <!ENTITY ograve "&#x00F2;"> <!ENTITY oacute "&#x00F3;"> <!ENTITY ocirc "&#x00F4;"> <!ENTITY otilde "&#x00F5;"> <!ENTITY ouml "&#x00F6;"> <!ENTITY divide "&#x00F7;"> <!ENTITY oslash "&#x00F8;"> <!ENTITY ugrave "&#x00F9;"> <!ENTITY uacute "&#x00FA;"> <!ENTITY ucirc "&#x00FB;"> <!ENTITY uuml "&#x00FC;"> <!ENTITY yacute "&#x00FD;"> <!ENTITY thorn "&#x00FE;"> <!ENTITY yuml "&#x00FF;"> <!ENTITY OElig "&#x0152;"> <!ENTITY oelig "&#x0153;"> <!ENTITY Scaron "&#x0160;"> <!ENTITY scaron "&#x0161;"> <!ENTITY Yuml "&#x0178;"> <!ENTITY fnof "&#x0192;"> <!ENTITY circ "&#x02C6;"> <!ENTITY tilde "&#x02DC;"> <!ENTITY Alpha "&#x0391;"> <!ENTITY Beta "&#x0392;"> <!ENTITY Gamma "&#x0393;"> <!ENTITY Epsilon "&#x0395;"> <!ENTITY Zeta "&#x0396;"> <!ENTITY Eta "&#x0397;"> <!ENTITY Theta "&#x0398;"> <!ENTITY Iota "&#x0399;"> <!ENTITY Kappa "&#x039A;"> <!ENTITY Lambda "&#x039B;"> <!ENTITY Mu "&#x039C;"> <!ENTITY Nu "&#x039D;"> <!ENTITY Xi "&#x039E;"> <!ENTITY Omicron "&#x039F;"> <!ENTITY Pi "&#x03A0;"> <!ENTITY Rho "&#x03A1;"> <!ENTITY Sigma "&#x03A3;"> <!ENTITY Tau "&#x03A4;"> <!ENTITY Upsilon "&#x03A5;"> <!ENTITY Phi "&#x03A6;"> <!ENTITY Chi "&#x03A7;"> <!ENTITY Psi "&#x03A8;"> <!ENTITY Omega "&#x03A9;"> <!ENTITY alpha "&#x03B1;"> <!ENTITY beta "&#x03B2;"> <!ENTITY gamma "&#x03B3;"> <!ENTITY delta "&#x03B4;"> <!ENTITY epsilon "&#x03B5;"> <!ENTITY zeta "&#x03B6;"> <!ENTITY eta "&#x03B7;"> <!ENTITY theta "&#x03B8;"> <!ENTITY iota "&#x03B9;"> <!ENTITY kappa "&#x03BA;"> <!ENTITY lambda "&#x03BB;"> <!ENTITY mu "&#x03BC;"> <!ENTITY nu "&#x03BD;"> <!ENTITY xi "&#x03BE;"> <!ENTITY omicron "&#x03BF;"> <!ENTITY pi "&#x03C0;"> <!ENTITY rho "&#x03C1;"> <!ENTITY sigmaf "&#x03C2;"> <!ENTITY sigma "&#x03C3;"> <!ENTITY tau "&#x03C4;"> <!ENTITY upsilon "&#x03C5;"> <!ENTITY phi "&#x03C6;"> <!ENTITY chi "&#x03C7;"> <!ENTITY psi "&#x03C8;"> <!ENTITY omega "&#x03C9;"> <!ENTITY thetasym "&#x03D1;"> <!ENTITY upsih "&#x03D2;"> <!ENTITY piv "&#x03D6;"> <!ENTITY ensp "&#x2002;"> <!ENTITY emsp "&#x2003;"> <!ENTITY thinsp "&#x2009;"> <!ENTITY zwnj "&#x200C;"> <!ENTITY zwj "&#x200D;"> <!ENTITY lrm "&#x200E;"> <!ENTITY rlm "&#x200F;"> <!ENTITY ndash "&#x2013;"> <!ENTITY mdash "&#x2014;"> <!ENTITY lsquo "&#x2018;"> <!ENTITY rsquo "&#x2019;"> <!ENTITY sbquo "&#x201A;"> <!ENTITY ldquo "&#x201C;"> <!ENTITY rdquo "&#x201D;"> <!ENTITY bdquo "&#x201E;"> <!ENTITY dagger "&#x2020;"> <!ENTITY Dagger "&#x2021;"> <!ENTITY bull "&#x2022;"> <!ENTITY hellip "&#x2026;"> <!ENTITY permil "&#x2030;"> <!ENTITY prime "&#x2032;"> <!ENTITY Prime "&#x2033;"> <!ENTITY lsaquo "&#x2039;"> <!ENTITY rsaquo "&#x203A;"> <!ENTITY oline "&#x203E;"> <!ENTITY frasl "&#x2044;"> <!ENTITY euro "&#x20AC;"> <!ENTITY image "&#x2111;"> <!ENTITY weierp "&#x2118;"> <!ENTITY real "&#x211C;"> <!ENTITY trade "&#x2122;"> <!ENTITY alefsym "&#x2135;"> <!ENTITY larr "&#x2190;"> <!ENTITY uarr "&#x2191;"> <!ENTITY rarr "&#x2192;"> <!ENTITY darr "&#x2193;"> <!ENTITY harr "&#x2194;"> <!ENTITY crarr "&#x21B5;"> <!ENTITY lArr "&#x21D0;"> <!ENTITY uArr "&#x21D1;"> <!ENTITY rArr "&#x21D2;"> <!ENTITY dArr "&#x21D3;"> <!ENTITY hArr "&#x21D4;"> <!ENTITY forall "&#x2200;"> <!ENTITY part "&#x2202;"> <!ENTITY exist "&#x2203;"> <!ENTITY empty "&#x2205;"> <!ENTITY nabla "&#x2207;"> <!ENTITY isin "&#x2208;"> <!ENTITY notin "&#x2209;"> <!ENTITY ni "&#x220B;"> <!ENTITY prod "&#x220F;"> <!ENTITY sum "&#x2211;"> <!ENTITY minus "&#x2212;"> <!ENTITY lowast "&#x2217;"> <!ENTITY radic "&#x221A;"> <!ENTITY prop "&#x221D;"> <!ENTITY infin "&#x221E;"> <!ENTITY ang "&#x2220;"> <!ENTITY and "&#x2227;"> <!ENTITY or "&#x2228;"> <!ENTITY cap "&#x2229;"> <!ENTITY cup "&#x222A;"> <!ENTITY int "&#x222B;"> <!ENTITY there4 "&#x2234;"> <!ENTITY sim "&#x223C;"> <!ENTITY cong "&#x2245;"> <!ENTITY asymp "&#x2248;"> <!ENTITY ne "&#x2260;"> <!ENTITY equiv "&#x2261;"> <!ENTITY le "&#x2264;"> <!ENTITY ge "&#x2265;"> <!ENTITY sub "&#x2282;"> <!ENTITY sup "&#x2283;"> <!ENTITY nsub "&#x2284;"> <!ENTITY sube "&#x2286;"> <!ENTITY supe "&#x2287;"> <!ENTITY oplus "&#x2295;"> <!ENTITY otimes "&#x2297;"> <!ENTITY perp "&#x22A5;"> <!ENTITY sdot "&#x22C5;"> <!ENTITY lceil "&#x2308;"> <!ENTITY rceil "&#x2309;"> <!ENTITY lfloor "&#x230A;"> <!ENTITY rfloor "&#x230B;"> <!ENTITY lang "&#x2329;"> <!ENTITY rang "&#x232A;"> <!ENTITY loz "&#x25CA;"> <!ENTITY spades "&#x2660;"> <!ENTITY clubs "&#x2663;"> <!ENTITY hearts "&#x2665;"> <!ENTITY diams "&#x2666;"> ]>';
+ }
+} \ No newline at end of file
diff --git a/vendor/simplepie/simplepie/library/SimplePie/Rating.php b/vendor/simplepie/simplepie/library/SimplePie/Rating.php
new file mode 100644
index 000000000..eaf57080c
--- /dev/null
+++ b/vendor/simplepie/simplepie/library/SimplePie/Rating.php
@@ -0,0 +1,128 @@
+<?php
+/**
+ * SimplePie
+ *
+ * A PHP-Based RSS and Atom Feed Framework.
+ * Takes the hard work out of managing a complete RSS/Atom solution.
+ *
+ * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * * Neither the name of the SimplePie Team nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
+ * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @package SimplePie
+ * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @author Ryan Parman
+ * @author Geoffrey Sneddon
+ * @author Ryan McCue
+ * @link http://simplepie.org/ SimplePie
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ */
+
+/**
+ * Handles `<media:rating>` or `<itunes:explicit>` tags as defined in Media RSS and iTunes RSS respectively
+ *
+ * Used by {@see SimplePie_Enclosure::get_rating()} and {@see SimplePie_Enclosure::get_ratings()}
+ *
+ * This class can be overloaded with {@see SimplePie::set_rating_class()}
+ *
+ * @package SimplePie
+ * @subpackage API
+ */
+class SimplePie_Rating
+{
+ /**
+ * Rating scheme
+ *
+ * @var string
+ * @see get_scheme()
+ */
+ var $scheme;
+
+ /**
+ * Rating value
+ *
+ * @var string
+ * @see get_value()
+ */
+ var $value;
+
+ /**
+ * Constructor, used to input the data
+ *
+ * For documentation on all the parameters, see the corresponding
+ * properties and their accessors
+ */
+ public function __construct($scheme = null, $value = null)
+ {
+ $this->scheme = $scheme;
+ $this->value = $value;
+ }
+
+ /**
+ * String-ified version
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ // There is no $this->data here
+ return md5(serialize($this));
+ }
+
+ /**
+ * Get the organizational scheme for the rating
+ *
+ * @return string|null
+ */
+ public function get_scheme()
+ {
+ if ($this->scheme !== null)
+ {
+ return $this->scheme;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get the value of the rating
+ *
+ * @return string|null
+ */
+ public function get_value()
+ {
+ if ($this->value !== null)
+ {
+ return $this->value;
+ }
+ else
+ {
+ return null;
+ }
+ }
+}
diff --git a/vendor/simplepie/simplepie/library/SimplePie/Registry.php b/vendor/simplepie/simplepie/library/SimplePie/Registry.php
new file mode 100755
index 000000000..e0909bb74
--- /dev/null
+++ b/vendor/simplepie/simplepie/library/SimplePie/Registry.php
@@ -0,0 +1,224 @@
+<?php
+/**
+ * SimplePie
+ *
+ * A PHP-Based RSS and Atom Feed Framework.
+ * Takes the hard work out of managing a complete RSS/Atom solution.
+ *
+ * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * * Neither the name of the SimplePie Team nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
+ * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @package SimplePie
+ * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @author Ryan Parman
+ * @author Geoffrey Sneddon
+ * @author Ryan McCue
+ * @link http://simplepie.org/ SimplePie
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ */
+
+/**
+ * Handles creating objects and calling methods
+ *
+ * Access this via {@see SimplePie::get_registry()}
+ *
+ * @package SimplePie
+ */
+class SimplePie_Registry
+{
+ /**
+ * Default class mapping
+ *
+ * Overriding classes *must* subclass these.
+ *
+ * @var array
+ */
+ protected $default = array(
+ 'Cache' => 'SimplePie_Cache',
+ 'Locator' => 'SimplePie_Locator',
+ 'Parser' => 'SimplePie_Parser',
+ 'File' => 'SimplePie_File',
+ 'Sanitize' => 'SimplePie_Sanitize',
+ 'Item' => 'SimplePie_Item',
+ 'Author' => 'SimplePie_Author',
+ 'Category' => 'SimplePie_Category',
+ 'Enclosure' => 'SimplePie_Enclosure',
+ 'Caption' => 'SimplePie_Caption',
+ 'Copyright' => 'SimplePie_Copyright',
+ 'Credit' => 'SimplePie_Credit',
+ 'Rating' => 'SimplePie_Rating',
+ 'Restriction' => 'SimplePie_Restriction',
+ 'Content_Type_Sniffer' => 'SimplePie_Content_Type_Sniffer',
+ 'Source' => 'SimplePie_Source',
+ 'Misc' => 'SimplePie_Misc',
+ 'XML_Declaration_Parser' => 'SimplePie_XML_Declaration_Parser',
+ 'Parse_Date' => 'SimplePie_Parse_Date',
+ );
+
+ /**
+ * Class mapping
+ *
+ * @see register()
+ * @var array
+ */
+ protected $classes = array();
+
+ /**
+ * Legacy classes
+ *
+ * @see register()
+ * @var array
+ */
+ protected $legacy = array();
+
+ /**
+ * Constructor
+ *
+ * No-op
+ */
+ public function __construct() { }
+
+ /**
+ * Register a class
+ *
+ * @param string $type See {@see $default} for names
+ * @param string $class Class name, must subclass the corresponding default
+ * @param bool $legacy Whether to enable legacy support for this class
+ * @return bool Successfulness
+ */
+ public function register($type, $class, $legacy = false)
+ {
+ if (!@is_subclass_of($class, $this->default[$type]))
+ {
+ return false;
+ }
+
+ $this->classes[$type] = $class;
+
+ if ($legacy)
+ {
+ $this->legacy[] = $class;
+ }
+
+ return true;
+ }
+
+ /**
+ * Get the class registered for a type
+ *
+ * Where possible, use {@see create()} or {@see call()} instead
+ *
+ * @param string $type
+ * @return string|null
+ */
+ public function get_class($type)
+ {
+ if (!empty($this->classes[$type]))
+ {
+ return $this->classes[$type];
+ }
+ if (!empty($this->default[$type]))
+ {
+ return $this->default[$type];
+ }
+
+ return null;
+ }
+
+ /**
+ * Create a new instance of a given type
+ *
+ * @param string $type
+ * @param array $parameters Parameters to pass to the constructor
+ * @return object Instance of class
+ */
+ public function &create($type, $parameters = array())
+ {
+ $class = $this->get_class($type);
+
+ if (in_array($class, $this->legacy))
+ {
+ switch ($type)
+ {
+ case 'locator':
+ // Legacy: file, timeout, useragent, file_class, max_checked_feeds, content_type_sniffer_class
+ // Specified: file, timeout, useragent, max_checked_feeds
+ $replacement = array($this->get_class('file'), $parameters[3], $this->get_class('content_type_sniffer'));
+ array_splice($parameters, 3, 1, $replacement);
+ break;
+ }
+ }
+
+ if (!method_exists($class, '__construct'))
+ {
+ $instance = new $class;
+ }
+ else
+ {
+ $reflector = new ReflectionClass($class);
+ $instance = $reflector->newInstanceArgs($parameters);
+ }
+
+ if (method_exists($instance, 'set_registry'))
+ {
+ $instance->set_registry($this);
+ }
+ return $instance;
+ }
+
+ /**
+ * Call a static method for a type
+ *
+ * @param string $type
+ * @param string $method
+ * @param array $parameters
+ * @return mixed
+ */
+ public function &call($type, $method, $parameters = array())
+ {
+ $class = $this->get_class($type);
+
+ if (in_array($class, $this->legacy))
+ {
+ switch ($type)
+ {
+ case 'Cache':
+ // For backwards compatibility with old non-static
+ // Cache::create() methods
+ if ($method === 'get_handler')
+ {
+ $result = @call_user_func_array(array($class, 'create'), $parameters);
+ return $result;
+ }
+ break;
+ }
+ }
+
+ $result = call_user_func_array(array($class, $method), $parameters);
+ return $result;
+ }
+}
diff --git a/vendor/simplepie/simplepie/library/SimplePie/Restriction.php b/vendor/simplepie/simplepie/library/SimplePie/Restriction.php
new file mode 100644
index 000000000..001a5cd28
--- /dev/null
+++ b/vendor/simplepie/simplepie/library/SimplePie/Restriction.php
@@ -0,0 +1,154 @@
+<?php
+/**
+ * SimplePie
+ *
+ * A PHP-Based RSS and Atom Feed Framework.
+ * Takes the hard work out of managing a complete RSS/Atom solution.
+ *
+ * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * * Neither the name of the SimplePie Team nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
+ * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @package SimplePie
+ * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @author Ryan Parman
+ * @author Geoffrey Sneddon
+ * @author Ryan McCue
+ * @link http://simplepie.org/ SimplePie
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ */
+
+/**
+ * Handles `<media:restriction>` as defined in Media RSS
+ *
+ * Used by {@see SimplePie_Enclosure::get_restriction()} and {@see SimplePie_Enclosure::get_restrictions()}
+ *
+ * This class can be overloaded with {@see SimplePie::set_restriction_class()}
+ *
+ * @package SimplePie
+ * @subpackage API
+ */
+class SimplePie_Restriction
+{
+ /**
+ * Relationship ('allow'/'deny')
+ *
+ * @var string
+ * @see get_relationship()
+ */
+ var $relationship;
+
+ /**
+ * Type of restriction
+ *
+ * @var string
+ * @see get_type()
+ */
+ var $type;
+
+ /**
+ * Restricted values
+ *
+ * @var string
+ * @see get_value()
+ */
+ var $value;
+
+ /**
+ * Constructor, used to input the data
+ *
+ * For documentation on all the parameters, see the corresponding
+ * properties and their accessors
+ */
+ public function __construct($relationship = null, $type = null, $value = null)
+ {
+ $this->relationship = $relationship;
+ $this->type = $type;
+ $this->value = $value;
+ }
+
+ /**
+ * String-ified version
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ // There is no $this->data here
+ return md5(serialize($this));
+ }
+
+ /**
+ * Get the relationship
+ *
+ * @return string|null Either 'allow' or 'deny'
+ */
+ public function get_relationship()
+ {
+ if ($this->relationship !== null)
+ {
+ return $this->relationship;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get the type
+ *
+ * @return string|null
+ */
+ public function get_type()
+ {
+ if ($this->type !== null)
+ {
+ return $this->type;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Get the list of restricted things
+ *
+ * @return string|null
+ */
+ public function get_value()
+ {
+ if ($this->value !== null)
+ {
+ return $this->value;
+ }
+ else
+ {
+ return null;
+ }
+ }
+}
diff --git a/vendor/simplepie/simplepie/library/SimplePie/Sanitize.php b/vendor/simplepie/simplepie/library/SimplePie/Sanitize.php
new file mode 100644
index 000000000..5a11721df
--- /dev/null
+++ b/vendor/simplepie/simplepie/library/SimplePie/Sanitize.php
@@ -0,0 +1,591 @@
+<?php
+/**
+ * SimplePie
+ *
+ * A PHP-Based RSS and Atom Feed Framework.
+ * Takes the hard work out of managing a complete RSS/Atom solution.
+ *
+ * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * * Neither the name of the SimplePie Team nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
+ * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @package SimplePie
+ * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @author Ryan Parman
+ * @author Geoffrey Sneddon
+ * @author Ryan McCue
+ * @link http://simplepie.org/ SimplePie
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ */
+
+/**
+ * Used for data cleanup and post-processing
+ *
+ *
+ * This class can be overloaded with {@see SimplePie::set_sanitize_class()}
+ *
+ * @package SimplePie
+ * @todo Move to using an actual HTML parser (this will allow tags to be properly stripped, and to switch between HTML and XHTML), this will also make it easier to shorten a string while preserving HTML tags
+ */
+class SimplePie_Sanitize
+{
+ // Private vars
+ var $base;
+
+ // Options
+ var $remove_div = true;
+ var $image_handler = '';
+ var $strip_htmltags = array('base', 'blink', 'body', 'doctype', 'embed', 'font', 'form', 'frame', 'frameset', 'html', 'iframe', 'input', 'marquee', 'meta', 'noscript', 'object', 'param', 'script', 'style');
+ var $encode_instead_of_strip = false;
+ var $strip_attributes = array('bgsound', 'expr', 'id', 'style', 'onclick', 'onerror', 'onfinish', 'onmouseover', 'onmouseout', 'onfocus', 'onblur', 'lowsrc', 'dynsrc');
+ var $add_attributes = array('audio' => array('preload' => 'none'), 'iframe' => array('sandbox' => 'allow-scripts allow-same-origin'), 'video' => array('preload' => 'none'));
+ var $strip_comments = false;
+ var $output_encoding = 'UTF-8';
+ var $enable_cache = true;
+ var $cache_location = './cache';
+ var $cache_name_function = 'md5';
+ var $timeout = 10;
+ var $useragent = '';
+ var $force_fsockopen = false;
+ var $replace_url_attributes = null;
+
+ public function __construct()
+ {
+ // Set defaults
+ $this->set_url_replacements(null);
+ }
+
+ public function remove_div($enable = true)
+ {
+ $this->remove_div = (bool) $enable;
+ }
+
+ public function set_image_handler($page = false)
+ {
+ if ($page)
+ {
+ $this->image_handler = (string) $page;
+ }
+ else
+ {
+ $this->image_handler = false;
+ }
+ }
+
+ public function set_registry(SimplePie_Registry $registry)
+ {
+ $this->registry = $registry;
+ }
+
+ public function pass_cache_data($enable_cache = true, $cache_location = './cache', $cache_name_function = 'md5', $cache_class = 'SimplePie_Cache')
+ {
+ if (isset($enable_cache))
+ {
+ $this->enable_cache = (bool) $enable_cache;
+ }
+
+ if ($cache_location)
+ {
+ $this->cache_location = (string) $cache_location;
+ }
+
+ if ($cache_name_function)
+ {
+ $this->cache_name_function = (string) $cache_name_function;
+ }
+ }
+
+ public function pass_file_data($file_class = 'SimplePie_File', $timeout = 10, $useragent = '', $force_fsockopen = false)
+ {
+ if ($timeout)
+ {
+ $this->timeout = (string) $timeout;
+ }
+
+ if ($useragent)
+ {
+ $this->useragent = (string) $useragent;
+ }
+
+ if ($force_fsockopen)
+ {
+ $this->force_fsockopen = (string) $force_fsockopen;
+ }
+ }
+
+ public function strip_htmltags($tags = array('base', 'blink', 'body', 'doctype', 'embed', 'font', 'form', 'frame', 'frameset', 'html', 'iframe', 'input', 'marquee', 'meta', 'noscript', 'object', 'param', 'script', 'style'))
+ {
+ if ($tags)
+ {
+ if (is_array($tags))
+ {
+ $this->strip_htmltags = $tags;
+ }
+ else
+ {
+ $this->strip_htmltags = explode(',', $tags);
+ }
+ }
+ else
+ {
+ $this->strip_htmltags = false;
+ }
+ }
+
+ public function encode_instead_of_strip($encode = false)
+ {
+ $this->encode_instead_of_strip = (bool) $encode;
+ }
+
+ public function strip_attributes($attribs = array('bgsound', 'expr', 'id', 'style', 'onclick', 'onerror', 'onfinish', 'onmouseover', 'onmouseout', 'onfocus', 'onblur', 'lowsrc', 'dynsrc'))
+ {
+ if ($attribs)
+ {
+ if (is_array($attribs))
+ {
+ $this->strip_attributes = $attribs;
+ }
+ else
+ {
+ $this->strip_attributes = explode(',', $attribs);
+ }
+ }
+ else
+ {
+ $this->strip_attributes = false;
+ }
+ }
+
+ public function add_attributes($attribs = array('audio' => array('preload' => 'none'), 'iframe' => array('sandbox' => 'allow-scripts allow-same-origin'), 'video' => array('preload' => 'none')))
+ {
+ if ($attribs)
+ {
+ if (is_array($attribs))
+ {
+ $this->add_attributes = $attribs;
+ }
+ else
+ {
+ $this->add_attributes = explode(',', $attribs);
+ }
+ }
+ else
+ {
+ $this->add_attributes = false;
+ }
+ }
+
+ public function strip_comments($strip = false)
+ {
+ $this->strip_comments = (bool) $strip;
+ }
+
+ public function set_output_encoding($encoding = 'UTF-8')
+ {
+ $this->output_encoding = (string) $encoding;
+ }
+
+ /**
+ * Set element/attribute key/value pairs of HTML attributes
+ * containing URLs that need to be resolved relative to the feed
+ *
+ * Defaults to |a|@href, |area|@href, |blockquote|@cite, |del|@cite,
+ * |form|@action, |img|@longdesc, |img|@src, |input|@src, |ins|@cite,
+ * |q|@cite
+ *
+ * @since 1.0
+ * @param array|null $element_attribute Element/attribute key/value pairs, null for default
+ */
+ public function set_url_replacements($element_attribute = null)
+ {
+ if ($element_attribute === null)
+ {
+ $element_attribute = array(
+ 'a' => 'href',
+ 'area' => 'href',
+ 'blockquote' => 'cite',
+ 'del' => 'cite',
+ 'form' => 'action',
+ 'img' => array(
+ 'longdesc',
+ 'src'
+ ),
+ 'input' => 'src',
+ 'ins' => 'cite',
+ 'q' => 'cite'
+ );
+ }
+ $this->replace_url_attributes = (array) $element_attribute;
+ }
+
+ public function sanitize($data, $type, $base = '')
+ {
+ $data = trim($data);
+ if ($data !== '' || $type & SIMPLEPIE_CONSTRUCT_IRI)
+ {
+ if ($type & SIMPLEPIE_CONSTRUCT_MAYBE_HTML)
+ {
+ if (preg_match('/(&(#(x[0-9a-fA-F]+|[0-9]+)|[a-zA-Z0-9]+)|<\/[A-Za-z][^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3E]*' . SIMPLEPIE_PCRE_HTML_ATTRIBUTE . '>)/', $data))
+ {
+ $type |= SIMPLEPIE_CONSTRUCT_HTML;
+ }
+ else
+ {
+ $type |= SIMPLEPIE_CONSTRUCT_TEXT;
+ }
+ }
+
+ if ($type & SIMPLEPIE_CONSTRUCT_BASE64)
+ {
+ $data = base64_decode($data);
+ }
+
+ if ($type & (SIMPLEPIE_CONSTRUCT_HTML | SIMPLEPIE_CONSTRUCT_XHTML))
+ {
+
+ if (!class_exists('DOMDocument'))
+ {
+ throw new SimplePie_Exception('DOMDocument not found, unable to use sanitizer');
+ }
+ $document = new DOMDocument();
+ $document->encoding = 'UTF-8';
+
+ $data = $this->preprocess($data, $type);
+
+ set_error_handler(array('SimplePie_Misc', 'silence_errors'));
+ $document->loadHTML($data);
+ restore_error_handler();
+
+ $xpath = new DOMXPath($document);
+
+ // Strip comments
+ if ($this->strip_comments)
+ {
+ $comments = $xpath->query('//comment()');
+
+ foreach ($comments as $comment)
+ {
+ $comment->parentNode->removeChild($comment);
+ }
+ }
+
+ // Strip out HTML tags and attributes that might cause various security problems.
+ // Based on recommendations by Mark Pilgrim at:
+ // http://diveintomark.org/archives/2003/06/12/how_to_consume_rss_safely
+ if ($this->strip_htmltags)
+ {
+ foreach ($this->strip_htmltags as $tag)
+ {
+ $this->strip_tag($tag, $document, $xpath, $type);
+ }
+ }
+
+ if ($this->strip_attributes)
+ {
+ foreach ($this->strip_attributes as $attrib)
+ {
+ $this->strip_attr($attrib, $xpath);
+ }
+ }
+
+ if ($this->add_attributes)
+ {
+ foreach ($this->add_attributes as $tag => $valuePairs)
+ {
+ $this->add_attr($tag, $valuePairs, $document);
+ }
+ }
+
+ // Replace relative URLs
+ $this->base = $base;
+ foreach ($this->replace_url_attributes as $element => $attributes)
+ {
+ $this->replace_urls($document, $element, $attributes);
+ }
+
+ // If image handling (caching, etc.) is enabled, cache and rewrite all the image tags.
+ if (isset($this->image_handler) && ((string) $this->image_handler) !== '' && $this->enable_cache)
+ {
+ $images = $document->getElementsByTagName('img');
+ foreach ($images as $img)
+ {
+ if ($img->hasAttribute('src'))
+ {
+ $image_url = call_user_func($this->cache_name_function, $img->getAttribute('src'));
+ $cache = $this->registry->call('Cache', 'get_handler', array($this->cache_location, $image_url, 'spi'));
+
+ if ($cache->load())
+ {
+ $img->setAttribute('src', $this->image_handler . $image_url);
+ }
+ else
+ {
+ $file = $this->registry->create('File', array($img->getAttribute('src'), $this->timeout, 5, array('X-FORWARDED-FOR' => $_SERVER['REMOTE_ADDR']), $this->useragent, $this->force_fsockopen));
+ $headers = $file->headers;
+
+ if ($file->success && ($file->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($file->status_code === 200 || $file->status_code > 206 && $file->status_code < 300)))
+ {
+ if ($cache->save(array('headers' => $file->headers, 'body' => $file->body)))
+ {
+ $img->setAttribute('src', $this->image_handler . $image_url);
+ }
+ else
+ {
+ trigger_error("$this->cache_location is not writeable. Make sure you've set the correct relative or absolute path, and that the location is server-writable.", E_USER_WARNING);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ // Get content node
+ $div = $document->getElementsByTagName('body')->item(0)->firstChild;
+ // Finally, convert to a HTML string
+ if (version_compare(PHP_VERSION, '5.3.6', '>='))
+ {
+ $data = trim($document->saveHTML($div));
+ }
+ else
+ {
+ $data = trim($document->saveXML($div));
+ }
+
+ if ($this->remove_div)
+ {
+ $data = preg_replace('/^<div' . SIMPLEPIE_PCRE_XML_ATTRIBUTE . '>/', '', $data);
+ $data = preg_replace('/<\/div>$/', '', $data);
+ }
+ else
+ {
+ $data = preg_replace('/^<div' . SIMPLEPIE_PCRE_XML_ATTRIBUTE . '>/', '<div>', $data);
+ }
+ }
+
+ if ($type & SIMPLEPIE_CONSTRUCT_IRI)
+ {
+ $absolute = $this->registry->call('Misc', 'absolutize_url', array($data, $base));
+ if ($absolute !== false)
+ {
+ $data = $absolute;
+ }
+ }
+
+ if ($type & (SIMPLEPIE_CONSTRUCT_TEXT | SIMPLEPIE_CONSTRUCT_IRI))
+ {
+ $data = htmlspecialchars($data, ENT_COMPAT, 'UTF-8');
+ }
+
+ if ($this->output_encoding !== 'UTF-8')
+ {
+ $data = $this->registry->call('Misc', 'change_encoding', array($data, 'UTF-8', $this->output_encoding));
+ }
+ }
+ return $data;
+ }
+
+ protected function preprocess($html, $type)
+ {
+ $ret = '';
+ $html = preg_replace('%</?(?:html|body)[^>]*?'.'>%is', '', $html);
+ if ($type & ~SIMPLEPIE_CONSTRUCT_XHTML)
+ {
+ // Atom XHTML constructs are wrapped with a div by default
+ // Note: No protection if $html contains a stray </div>!
+ $html = '<div>' . $html . '</div>';
+ $ret .= '<!DOCTYPE html>';
+ $content_type = 'text/html';
+ }
+ else
+ {
+ $ret .= '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">';
+ $content_type = 'application/xhtml+xml';
+ }
+
+ $ret .= '<html><head>';
+ $ret .= '<meta http-equiv="Content-Type" content="' . $content_type . '; charset=utf-8" />';
+ $ret .= '</head><body>' . $html . '</body></html>';
+ return $ret;
+ }
+
+ public function replace_urls($document, $tag, $attributes)
+ {
+ if (!is_array($attributes))
+ {
+ $attributes = array($attributes);
+ }
+
+ if (!is_array($this->strip_htmltags) || !in_array($tag, $this->strip_htmltags))
+ {
+ $elements = $document->getElementsByTagName($tag);
+ foreach ($elements as $element)
+ {
+ foreach ($attributes as $attribute)
+ {
+ if ($element->hasAttribute($attribute))
+ {
+ $value = $this->registry->call('Misc', 'absolutize_url', array($element->getAttribute($attribute), $this->base));
+ if ($value !== false)
+ {
+ $element->setAttribute($attribute, $value);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ public function do_strip_htmltags($match)
+ {
+ if ($this->encode_instead_of_strip)
+ {
+ if (isset($match[4]) && !in_array(strtolower($match[1]), array('script', 'style')))
+ {
+ $match[1] = htmlspecialchars($match[1], ENT_COMPAT, 'UTF-8');
+ $match[2] = htmlspecialchars($match[2], ENT_COMPAT, 'UTF-8');
+ return "&lt;$match[1]$match[2]&gt;$match[3]&lt;/$match[1]&gt;";
+ }
+ else
+ {
+ return htmlspecialchars($match[0], ENT_COMPAT, 'UTF-8');
+ }
+ }
+ elseif (isset($match[4]) && !in_array(strtolower($match[1]), array('script', 'style')))
+ {
+ return $match[4];
+ }
+ else
+ {
+ return '';
+ }
+ }
+
+ protected function strip_tag($tag, $document, $xpath, $type)
+ {
+ $elements = $xpath->query('body//' . $tag);
+ if ($this->encode_instead_of_strip)
+ {
+ foreach ($elements as $element)
+ {
+ $fragment = $document->createDocumentFragment();
+
+ // For elements which aren't script or style, include the tag itself
+ if (!in_array($tag, array('script', 'style')))
+ {
+ $text = '<' . $tag;
+ if ($element->hasAttributes())
+ {
+ $attrs = array();
+ foreach ($element->attributes as $name => $attr)
+ {
+ $value = $attr->value;
+
+ // In XHTML, empty values should never exist, so we repeat the value
+ if (empty($value) && ($type & SIMPLEPIE_CONSTRUCT_XHTML))
+ {
+ $value = $name;
+ }
+ // For HTML, empty is fine
+ elseif (empty($value) && ($type & SIMPLEPIE_CONSTRUCT_HTML))
+ {
+ $attrs[] = $name;
+ continue;
+ }
+
+ // Standard attribute text
+ $attrs[] = $name . '="' . $attr->value . '"';
+ }
+ $text .= ' ' . implode(' ', $attrs);
+ }
+ $text .= '>';
+ $fragment->appendChild(new DOMText($text));
+ }
+
+ $number = $element->childNodes->length;
+ for ($i = $number; $i > 0; $i--)
+ {
+ $child = $element->childNodes->item(0);
+ $fragment->appendChild($child);
+ }
+
+ if (!in_array($tag, array('script', 'style')))
+ {
+ $fragment->appendChild(new DOMText('</' . $tag . '>'));
+ }
+
+ $element->parentNode->replaceChild($fragment, $element);
+ }
+
+ return;
+ }
+ elseif (in_array($tag, array('script', 'style')))
+ {
+ foreach ($elements as $element)
+ {
+ $element->parentNode->removeChild($element);
+ }
+
+ return;
+ }
+ else
+ {
+ foreach ($elements as $element)
+ {
+ $fragment = $document->createDocumentFragment();
+ $number = $element->childNodes->length;
+ for ($i = $number; $i > 0; $i--)
+ {
+ $child = $element->childNodes->item(0);
+ $fragment->appendChild($child);
+ }
+
+ $element->parentNode->replaceChild($fragment, $element);
+ }
+ }
+ }
+
+ protected function strip_attr($attrib, $xpath)
+ {
+ $elements = $xpath->query('//*[@' . $attrib . ']');
+
+ foreach ($elements as $element)
+ {
+ $element->removeAttribute($attrib);
+ }
+ }
+
+ protected function add_attr($tag, $valuePairs, $document)
+ {
+ $elements = $document->getElementsByTagName($tag);
+ foreach ($elements as $element)
+ {
+ foreach ($valuePairs as $attrib => $value)
+ {
+ $element->setAttribute($attrib, $value);
+ }
+ }
+ }
+}
diff --git a/vendor/simplepie/simplepie/library/SimplePie/Source.php b/vendor/simplepie/simplepie/library/SimplePie/Source.php
new file mode 100644
index 000000000..1a66a392d
--- /dev/null
+++ b/vendor/simplepie/simplepie/library/SimplePie/Source.php
@@ -0,0 +1,610 @@
+<?php
+/**
+ * SimplePie
+ *
+ * A PHP-Based RSS and Atom Feed Framework.
+ * Takes the hard work out of managing a complete RSS/Atom solution.
+ *
+ * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * * Neither the name of the SimplePie Team nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
+ * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @package SimplePie
+ * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @author Ryan Parman
+ * @author Geoffrey Sneddon
+ * @author Ryan McCue
+ * @link http://simplepie.org/ SimplePie
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ */
+
+/**
+ * Handles `<atom:source>`
+ *
+ * Used by {@see SimplePie_Item::get_source()}
+ *
+ * This class can be overloaded with {@see SimplePie::set_source_class()}
+ *
+ * @package SimplePie
+ * @subpackage API
+ */
+class SimplePie_Source
+{
+ var $item;
+ var $data = array();
+ protected $registry;
+
+ public function __construct($item, $data)
+ {
+ $this->item = $item;
+ $this->data = $data;
+ }
+
+ public function set_registry(SimplePie_Registry $registry)
+ {
+ $this->registry = $registry;
+ }
+
+ public function __toString()
+ {
+ return md5(serialize($this->data));
+ }
+
+ public function get_source_tags($namespace, $tag)
+ {
+ if (isset($this->data['child'][$namespace][$tag]))
+ {
+ return $this->data['child'][$namespace][$tag];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ public function get_base($element = array())
+ {
+ return $this->item->get_base($element);
+ }
+
+ public function sanitize($data, $type, $base = '')
+ {
+ return $this->item->sanitize($data, $type, $base);
+ }
+
+ public function get_item()
+ {
+ return $this->item;
+ }
+
+ public function get_title()
+ {
+ if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'title'))
+ {
+ return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'title'))
+ {
+ return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'title'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'title'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'title'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'title'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'title'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ public function get_category($key = 0)
+ {
+ $categories = $this->get_categories();
+ if (isset($categories[$key]))
+ {
+ return $categories[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ public function get_categories()
+ {
+ $categories = array();
+
+ foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'category') as $category)
+ {
+ $term = null;
+ $scheme = null;
+ $label = null;
+ if (isset($category['attribs']['']['term']))
+ {
+ $term = $this->sanitize($category['attribs']['']['term'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($category['attribs']['']['scheme']))
+ {
+ $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($category['attribs']['']['label']))
+ {
+ $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $categories[] = $this->registry->create('Category', array($term, $scheme, $label));
+ }
+ foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'category') as $category)
+ {
+ // This is really the label, but keep this as the term also for BC.
+ // Label will also work on retrieving because that falls back to term.
+ $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ if (isset($category['attribs']['']['domain']))
+ {
+ $scheme = $this->sanitize($category['attribs']['']['domain'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $scheme = null;
+ }
+ $categories[] = $this->registry->create('Category', array($term, $scheme, null));
+ }
+ foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'subject') as $category)
+ {
+ $categories[] = $this->registry->create('Category', array($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));
+ }
+ foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'subject') as $category)
+ {
+ $categories[] = $this->registry->create('Category', array($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));
+ }
+
+ if (!empty($categories))
+ {
+ return array_unique($categories);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ public function get_author($key = 0)
+ {
+ $authors = $this->get_authors();
+ if (isset($authors[$key]))
+ {
+ return $authors[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ public function get_authors()
+ {
+ $authors = array();
+ foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'author') as $author)
+ {
+ $name = null;
+ $uri = null;
+ $email = null;
+ if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data']))
+ {
+ $name = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data']))
+ {
+ $uri = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]));
+ }
+ if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data']))
+ {
+ $email = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if ($name !== null || $email !== null || $uri !== null)
+ {
+ $authors[] = $this->registry->create('Author', array($name, $uri, $email));
+ }
+ }
+ if ($author = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'author'))
+ {
+ $name = null;
+ $url = null;
+ $email = null;
+ if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data']))
+ {
+ $name = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data']))
+ {
+ $url = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]));
+ }
+ if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data']))
+ {
+ $email = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if ($name !== null || $email !== null || $url !== null)
+ {
+ $authors[] = $this->registry->create('Author', array($name, $url, $email));
+ }
+ }
+ foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'creator') as $author)
+ {
+ $authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));
+ }
+ foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'creator') as $author)
+ {
+ $authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));
+ }
+ foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'author') as $author)
+ {
+ $authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));
+ }
+
+ if (!empty($authors))
+ {
+ return array_unique($authors);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ public function get_contributor($key = 0)
+ {
+ $contributors = $this->get_contributors();
+ if (isset($contributors[$key]))
+ {
+ return $contributors[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ public function get_contributors()
+ {
+ $contributors = array();
+ foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'contributor') as $contributor)
+ {
+ $name = null;
+ $uri = null;
+ $email = null;
+ if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data']))
+ {
+ $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data']))
+ {
+ $uri = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]));
+ }
+ if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data']))
+ {
+ $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if ($name !== null || $email !== null || $uri !== null)
+ {
+ $contributors[] = $this->registry->create('Author', array($name, $uri, $email));
+ }
+ }
+ foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'contributor') as $contributor)
+ {
+ $name = null;
+ $url = null;
+ $email = null;
+ if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data']))
+ {
+ $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data']))
+ {
+ $url = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]));
+ }
+ if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data']))
+ {
+ $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if ($name !== null || $email !== null || $url !== null)
+ {
+ $contributors[] = $this->registry->create('Author', array($name, $url, $email));
+ }
+ }
+
+ if (!empty($contributors))
+ {
+ return array_unique($contributors);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ public function get_link($key = 0, $rel = 'alternate')
+ {
+ $links = $this->get_links($rel);
+ if (isset($links[$key]))
+ {
+ return $links[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Added for parity between the parent-level and the item/entry-level.
+ */
+ public function get_permalink()
+ {
+ return $this->get_link(0);
+ }
+
+ public function get_links($rel = 'alternate')
+ {
+ if (!isset($this->data['links']))
+ {
+ $this->data['links'] = array();
+ if ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'link'))
+ {
+ foreach ($links as $link)
+ {
+ if (isset($link['attribs']['']['href']))
+ {
+ $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate';
+ $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));
+ }
+ }
+ }
+ if ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'link'))
+ {
+ foreach ($links as $link)
+ {
+ if (isset($link['attribs']['']['href']))
+ {
+ $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate';
+ $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));
+
+ }
+ }
+ }
+ if ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'link'))
+ {
+ $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
+ }
+ if ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'link'))
+ {
+ $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
+ }
+ if ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'link'))
+ {
+ $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
+ }
+
+ $keys = array_keys($this->data['links']);
+ foreach ($keys as $key)
+ {
+ if ($this->registry->call('Misc', 'is_isegment_nz_nc', array($key)))
+ {
+ if (isset($this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]))
+ {
+ $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] = array_merge($this->data['links'][$key], $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]);
+ $this->data['links'][$key] =& $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key];
+ }
+ else
+ {
+ $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] =& $this->data['links'][$key];
+ }
+ }
+ elseif (substr($key, 0, 41) === SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY)
+ {
+ $this->data['links'][substr($key, 41)] =& $this->data['links'][$key];
+ }
+ $this->data['links'][$key] = array_unique($this->data['links'][$key]);
+ }
+ }
+
+ if (isset($this->data['links'][$rel]))
+ {
+ return $this->data['links'][$rel];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ public function get_description()
+ {
+ if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'subtitle'))
+ {
+ return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'tagline'))
+ {
+ return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'description'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'description'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'description'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'description'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'description'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'summary'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'subtitle'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ public function get_copyright()
+ {
+ if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'rights'))
+ {
+ return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'copyright'))
+ {
+ return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'copyright'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'rights'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'rights'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ public function get_language()
+ {
+ if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'language'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'language'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'language'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif (isset($this->data['xml_lang']))
+ {
+ return $this->sanitize($this->data['xml_lang'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ public function get_latitude()
+ {
+ if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lat'))
+ {
+ return (float) $return[0]['data'];
+ }
+ elseif (($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match))
+ {
+ return (float) $match[1];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ public function get_longitude()
+ {
+ if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'long'))
+ {
+ return (float) $return[0]['data'];
+ }
+ elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lon'))
+ {
+ return (float) $return[0]['data'];
+ }
+ elseif (($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match))
+ {
+ return (float) $match[2];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ public function get_image_url()
+ {
+ if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'image'))
+ {
+ return $this->sanitize($return[0]['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI);
+ }
+ elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'logo'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'icon'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
+ }
+ else
+ {
+ return null;
+ }
+ }
+}
+
diff --git a/vendor/simplepie/simplepie/library/SimplePie/XML/Declaration/Parser.php b/vendor/simplepie/simplepie/library/SimplePie/XML/Declaration/Parser.php
new file mode 100644
index 000000000..99e751672
--- /dev/null
+++ b/vendor/simplepie/simplepie/library/SimplePie/XML/Declaration/Parser.php
@@ -0,0 +1,361 @@
+<?php
+/**
+ * SimplePie
+ *
+ * A PHP-Based RSS and Atom Feed Framework.
+ * Takes the hard work out of managing a complete RSS/Atom solution.
+ *
+ * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * * Neither the name of the SimplePie Team nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
+ * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @package SimplePie
+ * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @author Ryan Parman
+ * @author Geoffrey Sneddon
+ * @author Ryan McCue
+ * @link http://simplepie.org/ SimplePie
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ */
+
+
+/**
+ * Parses the XML Declaration
+ *
+ * @package SimplePie
+ * @subpackage Parsing
+ */
+class SimplePie_XML_Declaration_Parser
+{
+ /**
+ * XML Version
+ *
+ * @access public
+ * @var string
+ */
+ var $version = '1.0';
+
+ /**
+ * Encoding
+ *
+ * @access public
+ * @var string
+ */
+ var $encoding = 'UTF-8';
+
+ /**
+ * Standalone
+ *
+ * @access public
+ * @var bool
+ */
+ var $standalone = false;
+
+ /**
+ * Current state of the state machine
+ *
+ * @access private
+ * @var string
+ */
+ var $state = 'before_version_name';
+
+ /**
+ * Input data
+ *
+ * @access private
+ * @var string
+ */
+ var $data = '';
+
+ /**
+ * Input data length (to avoid calling strlen() everytime this is needed)
+ *
+ * @access private
+ * @var int
+ */
+ var $data_length = 0;
+
+ /**
+ * Current position of the pointer
+ *
+ * @var int
+ * @access private
+ */
+ var $position = 0;
+
+ /**
+ * Create an instance of the class with the input data
+ *
+ * @access public
+ * @param string $data Input data
+ */
+ public function __construct($data)
+ {
+ $this->data = $data;
+ $this->data_length = strlen($this->data);
+ }
+
+ /**
+ * Parse the input data
+ *
+ * @access public
+ * @return bool true on success, false on failure
+ */
+ public function parse()
+ {
+ while ($this->state && $this->state !== 'emit' && $this->has_data())
+ {
+ $state = $this->state;
+ $this->$state();
+ }
+ $this->data = '';
+ if ($this->state === 'emit')
+ {
+ return true;
+ }
+ else
+ {
+ $this->version = '';
+ $this->encoding = '';
+ $this->standalone = '';
+ return false;
+ }
+ }
+
+ /**
+ * Check whether there is data beyond the pointer
+ *
+ * @access private
+ * @return bool true if there is further data, false if not
+ */
+ public function has_data()
+ {
+ return (bool) ($this->position < $this->data_length);
+ }
+
+ /**
+ * Advance past any whitespace
+ *
+ * @return int Number of whitespace characters passed
+ */
+ public function skip_whitespace()
+ {
+ $whitespace = strspn($this->data, "\x09\x0A\x0D\x20", $this->position);
+ $this->position += $whitespace;
+ return $whitespace;
+ }
+
+ /**
+ * Read value
+ */
+ public function get_value()
+ {
+ $quote = substr($this->data, $this->position, 1);
+ if ($quote === '"' || $quote === "'")
+ {
+ $this->position++;
+ $len = strcspn($this->data, $quote, $this->position);
+ if ($this->has_data())
+ {
+ $value = substr($this->data, $this->position, $len);
+ $this->position += $len + 1;
+ return $value;
+ }
+ }
+ return false;
+ }
+
+ public function before_version_name()
+ {
+ if ($this->skip_whitespace())
+ {
+ $this->state = 'version_name';
+ }
+ else
+ {
+ $this->state = false;
+ }
+ }
+
+ public function version_name()
+ {
+ if (substr($this->data, $this->position, 7) === 'version')
+ {
+ $this->position += 7;
+ $this->skip_whitespace();
+ $this->state = 'version_equals';
+ }
+ else
+ {
+ $this->state = false;
+ }
+ }
+
+ public function version_equals()
+ {
+ if (substr($this->data, $this->position, 1) === '=')
+ {
+ $this->position++;
+ $this->skip_whitespace();
+ $this->state = 'version_value';
+ }
+ else
+ {
+ $this->state = false;
+ }
+ }
+
+ public function version_value()
+ {
+ if ($this->version = $this->get_value())
+ {
+ $this->skip_whitespace();
+ if ($this->has_data())
+ {
+ $this->state = 'encoding_name';
+ }
+ else
+ {
+ $this->state = 'emit';
+ }
+ }
+ else
+ {
+ $this->state = false;
+ }
+ }
+
+ public function encoding_name()
+ {
+ if (substr($this->data, $this->position, 8) === 'encoding')
+ {
+ $this->position += 8;
+ $this->skip_whitespace();
+ $this->state = 'encoding_equals';
+ }
+ else
+ {
+ $this->state = 'standalone_name';
+ }
+ }
+
+ public function encoding_equals()
+ {
+ if (substr($this->data, $this->position, 1) === '=')
+ {
+ $this->position++;
+ $this->skip_whitespace();
+ $this->state = 'encoding_value';
+ }
+ else
+ {
+ $this->state = false;
+ }
+ }
+
+ public function encoding_value()
+ {
+ if ($this->encoding = $this->get_value())
+ {
+ $this->skip_whitespace();
+ if ($this->has_data())
+ {
+ $this->state = 'standalone_name';
+ }
+ else
+ {
+ $this->state = 'emit';
+ }
+ }
+ else
+ {
+ $this->state = false;
+ }
+ }
+
+ public function standalone_name()
+ {
+ if (substr($this->data, $this->position, 10) === 'standalone')
+ {
+ $this->position += 10;
+ $this->skip_whitespace();
+ $this->state = 'standalone_equals';
+ }
+ else
+ {
+ $this->state = false;
+ }
+ }
+
+ public function standalone_equals()
+ {
+ if (substr($this->data, $this->position, 1) === '=')
+ {
+ $this->position++;
+ $this->skip_whitespace();
+ $this->state = 'standalone_value';
+ }
+ else
+ {
+ $this->state = false;
+ }
+ }
+
+ public function standalone_value()
+ {
+ if ($standalone = $this->get_value())
+ {
+ switch ($standalone)
+ {
+ case 'yes':
+ $this->standalone = true;
+ break;
+
+ case 'no':
+ $this->standalone = false;
+ break;
+
+ default:
+ $this->state = false;
+ return;
+ }
+
+ $this->skip_whitespace();
+ if ($this->has_data())
+ {
+ $this->state = false;
+ }
+ else
+ {
+ $this->state = 'emit';
+ }
+ }
+ else
+ {
+ $this->state = false;
+ }
+ }
+}
diff --git a/vendor/simplepie/simplepie/library/SimplePie/gzdecode.php b/vendor/simplepie/simplepie/library/SimplePie/gzdecode.php
new file mode 100644
index 000000000..0e8bc8fc6
--- /dev/null
+++ b/vendor/simplepie/simplepie/library/SimplePie/gzdecode.php
@@ -0,0 +1,370 @@
+<?php
+/**
+ * SimplePie
+ *
+ * A PHP-Based RSS and Atom Feed Framework.
+ * Takes the hard work out of managing a complete RSS/Atom solution.
+ *
+ * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * * Neither the name of the SimplePie Team nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
+ * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @package SimplePie
+ * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @author Ryan Parman
+ * @author Geoffrey Sneddon
+ * @author Ryan McCue
+ * @link http://simplepie.org/ SimplePie
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ */
+
+
+/**
+ * Decode 'gzip' encoded HTTP data
+ *
+ * @package SimplePie
+ * @subpackage HTTP
+ * @link http://www.gzip.org/format.txt
+ */
+class SimplePie_gzdecode
+{
+ /**
+ * Compressed data
+ *
+ * @access private
+ * @var string
+ * @see gzdecode::$data
+ */
+ var $compressed_data;
+
+ /**
+ * Size of compressed data
+ *
+ * @access private
+ * @var int
+ */
+ var $compressed_size;
+
+ /**
+ * Minimum size of a valid gzip string
+ *
+ * @access private
+ * @var int
+ */
+ var $min_compressed_size = 18;
+
+ /**
+ * Current position of pointer
+ *
+ * @access private
+ * @var int
+ */
+ var $position = 0;
+
+ /**
+ * Flags (FLG)
+ *
+ * @access private
+ * @var int
+ */
+ var $flags;
+
+ /**
+ * Uncompressed data
+ *
+ * @access public
+ * @see gzdecode::$compressed_data
+ * @var string
+ */
+ var $data;
+
+ /**
+ * Modified time
+ *
+ * @access public
+ * @var int
+ */
+ var $MTIME;
+
+ /**
+ * Extra Flags
+ *
+ * @access public
+ * @var int
+ */
+ var $XFL;
+
+ /**
+ * Operating System
+ *
+ * @access public
+ * @var int
+ */
+ var $OS;
+
+ /**
+ * Subfield ID 1
+ *
+ * @access public
+ * @see gzdecode::$extra_field
+ * @see gzdecode::$SI2
+ * @var string
+ */
+ var $SI1;
+
+ /**
+ * Subfield ID 2
+ *
+ * @access public
+ * @see gzdecode::$extra_field
+ * @see gzdecode::$SI1
+ * @var string
+ */
+ var $SI2;
+
+ /**
+ * Extra field content
+ *
+ * @access public
+ * @see gzdecode::$SI1
+ * @see gzdecode::$SI2
+ * @var string
+ */
+ var $extra_field;
+
+ /**
+ * Original filename
+ *
+ * @access public
+ * @var string
+ */
+ var $filename;
+
+ /**
+ * Human readable comment
+ *
+ * @access public
+ * @var string
+ */
+ var $comment;
+
+ /**
+ * Don't allow anything to be set
+ *
+ * @param string $name
+ * @param mixed $value
+ */
+ public function __set($name, $value)
+ {
+ trigger_error("Cannot write property $name", E_USER_ERROR);
+ }
+
+ /**
+ * Set the compressed string and related properties
+ *
+ * @param string $data
+ */
+ public function __construct($data)
+ {
+ $this->compressed_data = $data;
+ $this->compressed_size = strlen($data);
+ }
+
+ /**
+ * Decode the GZIP stream
+ *
+ * @return bool Successfulness
+ */
+ public function parse()
+ {
+ if ($this->compressed_size >= $this->min_compressed_size)
+ {
+ // Check ID1, ID2, and CM
+ if (substr($this->compressed_data, 0, 3) !== "\x1F\x8B\x08")
+ {
+ return false;
+ }
+
+ // Get the FLG (FLaGs)
+ $this->flags = ord($this->compressed_data[3]);
+
+ // FLG bits above (1 << 4) are reserved
+ if ($this->flags > 0x1F)
+ {
+ return false;
+ }
+
+ // Advance the pointer after the above
+ $this->position += 4;
+
+ // MTIME
+ $mtime = substr($this->compressed_data, $this->position, 4);
+ // Reverse the string if we're on a big-endian arch because l is the only signed long and is machine endianness
+ if (current(unpack('S', "\x00\x01")) === 1)
+ {
+ $mtime = strrev($mtime);
+ }
+ $this->MTIME = current(unpack('l', $mtime));
+ $this->position += 4;
+
+ // Get the XFL (eXtra FLags)
+ $this->XFL = ord($this->compressed_data[$this->position++]);
+
+ // Get the OS (Operating System)
+ $this->OS = ord($this->compressed_data[$this->position++]);
+
+ // Parse the FEXTRA
+ if ($this->flags & 4)
+ {
+ // Read subfield IDs
+ $this->SI1 = $this->compressed_data[$this->position++];
+ $this->SI2 = $this->compressed_data[$this->position++];
+
+ // SI2 set to zero is reserved for future use
+ if ($this->SI2 === "\x00")
+ {
+ return false;
+ }
+
+ // Get the length of the extra field
+ $len = current(unpack('v', substr($this->compressed_data, $this->position, 2)));
+ $this->position += 2;
+
+ // Check the length of the string is still valid
+ $this->min_compressed_size += $len + 4;
+ if ($this->compressed_size >= $this->min_compressed_size)
+ {
+ // Set the extra field to the given data
+ $this->extra_field = substr($this->compressed_data, $this->position, $len);
+ $this->position += $len;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ // Parse the FNAME
+ if ($this->flags & 8)
+ {
+ // Get the length of the filename
+ $len = strcspn($this->compressed_data, "\x00", $this->position);
+
+ // Check the length of the string is still valid
+ $this->min_compressed_size += $len + 1;
+ if ($this->compressed_size >= $this->min_compressed_size)
+ {
+ // Set the original filename to the given string
+ $this->filename = substr($this->compressed_data, $this->position, $len);
+ $this->position += $len + 1;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ // Parse the FCOMMENT
+ if ($this->flags & 16)
+ {
+ // Get the length of the comment
+ $len = strcspn($this->compressed_data, "\x00", $this->position);
+
+ // Check the length of the string is still valid
+ $this->min_compressed_size += $len + 1;
+ if ($this->compressed_size >= $this->min_compressed_size)
+ {
+ // Set the original comment to the given string
+ $this->comment = substr($this->compressed_data, $this->position, $len);
+ $this->position += $len + 1;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ // Parse the FHCRC
+ if ($this->flags & 2)
+ {
+ // Check the length of the string is still valid
+ $this->min_compressed_size += $len + 2;
+ if ($this->compressed_size >= $this->min_compressed_size)
+ {
+ // Read the CRC
+ $crc = current(unpack('v', substr($this->compressed_data, $this->position, 2)));
+
+ // Check the CRC matches
+ if ((crc32(substr($this->compressed_data, 0, $this->position)) & 0xFFFF) === $crc)
+ {
+ $this->position += 2;
+ }
+ else
+ {
+ return false;
+ }
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ // Decompress the actual data
+ if (($this->data = gzinflate(substr($this->compressed_data, $this->position, -8))) === false)
+ {
+ return false;
+ }
+ else
+ {
+ $this->position = $this->compressed_size - 8;
+ }
+
+ // Check CRC of data
+ $crc = current(unpack('V', substr($this->compressed_data, $this->position, 4)));
+ $this->position += 4;
+ /*if (extension_loaded('hash') && sprintf('%u', current(unpack('V', hash('crc32b', $this->data)))) !== sprintf('%u', $crc))
+ {
+ return false;
+ }*/
+
+ // Check ISIZE of data
+ $isize = current(unpack('V', substr($this->compressed_data, $this->position, 4)));
+ $this->position += 4;
+ if (sprintf('%u', strlen($this->data) & 0xFFFFFFFF) !== sprintf('%u', $isize))
+ {
+ return false;
+ }
+
+ // Wow, against all odds, we've actually got a valid gzip string
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+}
diff --git a/view/css/bootstrap-red.css b/view/css/bootstrap-red.css
index f1ebb204e..1bb82f11c 100644
--- a/view/css/bootstrap-red.css
+++ b/view/css/bootstrap-red.css
@@ -4,66 +4,85 @@
nav .badge {
position: absolute;
- top: 1px;
- left: 1px;
- font-size: 10px;
- line-height: 20px;
- padding: 0px 5px;
- height: 20px;
- min-width: 20px;
- border-radius: 10px;
+ font-size: 0.75rem;
}
-#navbar-collapse-1 i,
-.navbar-header i {
- font-size: 14px;
+@media screen and (min-width: 767px) {
+ nav .badge {
+ top: 0px;
+ left: 0px;
+ }
}
-nav .navbar-header img {
- height: 49px;
- width: 49px;
- margin-top: 1px;
+@media screen and (max-width: 767px) {
+ .navbar {
+ padding: .5rem 7px;
+ }
+
+ nav .badge {
+ top: 0.5rem;
+ left: 1.5rem;
+ }
}
-/* nav overrides end */
+.widget .badge {
+ font-size: 100%;
+}
+.nav-item.nav-item-hack {
+ height: 2.3rem;
+}
+
+.navbar-toggler-right {
+ padding: 0.2rem 0;
+}
-aside .nav-pills > li > a,
-.response-list .nav-pills > li > a {
- padding: 6px 10px;
+#navbar-collapse-1 i {
+ font-size: 1rem;
}
nav .dropdown-menu {
- margin-top: 0px;
max-height: 70vh;
overflow: auto;
}
-nav .navbar-collapse.in .dropdown-menu {
- max-height: none;
- overflow: none;
+#navbar-collapse-2 {
+ flex-basis: 100%;
+ max-height: 70vh;
}
-.wall-item-tools .dropdown-menu {
- min-width: auto;
+#navbar-collapse-2.show {
+ overflow: auto;
}
-.nav-tabs.nav-justified > li {
- white-space: nowrap;
+
+#navbar-collapse-2.collapsing .dropdown-header,
+#navbar-collapse-2.show .dropdown-header {
+ padding: 0.5rem 0.1rem;
+}
+
+.navbar-inverse .navbar-toggler {
+ color: rgba(255,255,255,1);
+}
+/* nav overrides end */
+
+.btn-outline-secondary {
+ color: #aaa;
+}
+
+.wall-item-tools .dropdown-menu {
+ min-width: auto;
}
code {
white-space: normal;
}
-.form-control {
- font-size: unset;
+label {
+ font-weight: bold;
}
-.panel-group {
- margin-bottom: 0px;
+small,
+.small {
+ font-size: 0.75rem;
}
-
-/* Bootstrap assumes that checkboxes are on the left of labels, while it's usually the opposite in Red */
-.field.checkbox input[type="checkbox"] { margin-left: 0px; }
-.field.checkbox label { padding-left: 0px; font-weight: 700}
diff --git a/view/css/conversation.css b/view/css/conversation.css
index aec457302..08f23c4d0 100644
--- a/view/css/conversation.css
+++ b/view/css/conversation.css
@@ -3,7 +3,7 @@
.jothidden input[type="text"] {
border: 0px;
margin: 0px;
- height: 39px;
+ height: 2.5rem;
width: 100%;
}
@@ -23,15 +23,15 @@
#jot-title-wrap input,
#jot-pagetitle-wrap input {
- padding: 10px;
+ padding: 0.5rem;
}
#profile-jot-text {
resize: none;
border-width: 0px;
- height: 39px;
- line-height: 19px;
- padding: 10px;
+ height: 2.5rem;
+ line-height: 1.5rem;
+ padding: 0.5rem;
width: 100%;
display: inherit;
}
@@ -60,29 +60,11 @@
}
#profile-jot-text-loading {
- float: left;
padding: 30px 0px 0px 12px;
}
#profile-jot-submit-wrapper {
border-top: 1px solid #ccc;
- padding: 10px;
-}
-
-#profile-jot-perms-end {
- height: 30px;
-}
-
-#profile-jot-wrapper {
- margin-bottom: 30px;
-}
-
-#profile-jot-plugin-wrapper {
- margin-top: 10px;
-}
-
-#profile-rotator-wrapper {
- float: left;
}
#profile-rotator {
@@ -91,22 +73,11 @@
/* conversation */
-.thread-wrapper.toplevel_item {
- margin-bottom: 20px;
-}
/* conv_item */
-.wall-item-head {
- padding: 10px 10px 0.5em 10px;
-}
-
-.wall-item-content {
- padding: 0.5em 10px;
-}
-
-.wall-item-tools {
- padding: 0.5em 10px 10px 10px;
+.wall-item-head-new {
+ border-top: 0.2rem solid #0275d8;
}
.wall-item-info {
@@ -119,10 +90,6 @@
margin-left:10px;
}
-.lockview-panel {
- padding: 3px 20px;
-}
-
.wall-item-lock {
float: left;
}
@@ -137,6 +104,12 @@ a.wall-item-name-link {
text-overflow: ellipsis;
}
+.wall-item-ago,
+.wall-item-ago i {
+ font-size: 0.75rem;
+ line-height: 1;
+}
+
.wall-item-ago .fa-check {
cursor: pointer;
}
@@ -145,41 +118,24 @@ a.wall-item-name-link {
overflow: hidden;
}
-.wall-item-content h1,
-.wall-item-content h2 {
- font-size: 1.319em;
-}
-
-.wall-item-title h3,
-.wall-item-content h3,
-.wall-item-content h4 {
- font-size: 1.112em;
-}
-
.wall-item-content img {
max-width: 100%;
}
-.wall-item-title h3 {
+.wall-item-title.h3 {
font-weight: bold;
margin: 0px;
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
+ word-wrap: break-word;
}
-.wall-item-title-end {
- clear: both;
+.wall-item-title.bg-primary a {
+ color: #fff;
}
.wall-item-body {
word-wrap: break-word;
}
-.body-tags {
- margin-top: 5px;
-}
-
.item-tool {
cursor: pointer;
}
@@ -212,91 +168,59 @@ a.wall-item-name-link {
}
.ivoted {
- color: #337AB7;
+ color: #0275d8;
}
.item-highlight {
- border-left: 3px solid #337AB7;
+ border-left: 0.2rem solid #0275d8;
}
.item-highlight .wall-item-head,
.item-highlight .wall-item-content,
.item-highlight .wall-item-tools {
- padding-left: 7px;
+ padding-left: 0.3rem;
}
/* comment_item */
.comment-edit-text-empty,
.comment-edit-text-full {
+ padding: 0.5rem;
width: 100%;
display: inherit;
}
.comment-edit-text-empty {
- padding: 0px 8px;
- line-height: 28px;
- height: 30px;
+ height: 2rem;
+ line-height: 1;
overflow: hidden;
resize: none;
-
}
.comment-edit-text-full {
- padding: 8px;
- height: 150px;
+ height: 7rem;
+ line-height: 1.25;
overflow: auto;
resize: vertical;
}
-.qcomment {
- border: 1px solid #EEE;
- padding: 3px;
- margin-top: 15px;
- margin-left: 25px;
- width: 125px;
- overflow-y: auto;
-}
-
-.qcomment option {
- width: 125px;
- overflow-x: hidden;
-}
-
-.qcomment {
- opacity: 0.3;
- filter:alpha(opacity=30);
-}
-
-.qcomment:hover {
- opacity: 1.0;
- filter:alpha(opacity=100);
-}
-
-.comment-tools {
- display: none;
- margin-top: 7px;
-}
-
+.comment-tools,
.comment-edit-preview {
display: none;
- margin-top: 7px;
}
/* disable link handling for unknown entries */
-.dropdown-menu > li > a.disabled {
+.dropdown-menu a.disabled {
pointer-events: none;
cursor: default;
}
.item-verified {
color: darkgreen;
- font-size: 1em !important;
}
.item-forged {
color: #FF0000;
- font-size: 1em !important;
}
/* event item */
diff --git a/view/css/default.css b/view/css/default.css
index a51461201..fc6da54f9 100644
--- a/view/css/default.css
+++ b/view/css/default.css
@@ -18,7 +18,7 @@ aside {
position: relative;
display: table-cell;
vertical-align: top;
- padding: 71px 7px 0px 7px;
+ padding: 4.5rem 7px 0px 7px;
}
section {
@@ -26,5 +26,5 @@ section {
width: 100%;
display: table-cell;
vertical-align: top;
- padding: 71px 7px 200px 7px;
+ padding: 4.5rem 7px 200px 7px;
}
diff --git a/view/css/mod_apps.css b/view/css/mod_apps.css
index 0a231bc84..5e6000fb4 100644
--- a/view/css/mod_apps.css
+++ b/view/css/mod_apps.css
@@ -1,8 +1,7 @@
.app-container {
float: left;
- width: 150px;
- height: 180px;
- padding: 20px;
+ width: 148px;
+ margin: 20px;
}
.app-name {
diff --git a/view/css/mod_chat.css b/view/css/mod_chat.css
index 57aecd557..c56091102 100644
--- a/view/css/mod_chat.css
+++ b/view/css/mod_chat.css
@@ -16,6 +16,10 @@
text-align: right;
}
+#chatrooms-index td:nth-child(3){
+ white-space: nowrap;
+}
+
#chatrooms-index th:nth-child(4),
#chatrooms-index td:nth-child(4){
padding: 7px 10px 7px 7px;
diff --git a/view/css/mod_events.css b/view/css/mod_events.css
index f0b5c0166..6fccf3f44 100644
--- a/view/css/mod_events.css
+++ b/view/css/mod_events.css
@@ -21,11 +21,6 @@
border-color: #ccc !important;
}
-#events-spinner .spinner {
- margin-top: 9px;
- margin-bottom: -9px;
-}
-
.bootstrap-tagsinput {
width: 100%;
padding: 6px 12px;
diff --git a/view/css/mod_help.css b/view/css/mod_help.css
index f59a40894..c0b0bafa3 100644
--- a/view/css/mod_help.css
+++ b/view/css/mod_help.css
@@ -11,14 +11,6 @@
padding-bottom: 0.3em;
}
-#doco-content h4 {
- text-decoration: underline;
-}
-
-#doco-content h5 {
- text-decoration: underline;
-}
-
#region_1 .widget ul ul {
list-style-type: none;
}
diff --git a/view/css/mod_mail.css b/view/css/mod_mail.css
index c1874edac..8072b4668 100644
--- a/view/css/mod_mail.css
+++ b/view/css/mod_mail.css
@@ -1,34 +1,3 @@
-.mail-conv-sender {
- float: left;
- margin-right: 10px;
- margin-bottom: 10px;
-}
-
-.mail-conv-sender img{
- width: 32px;
- height: 32px;
-}
-
-.mail-conv-sender-name {
- font-weight: bold;
-}
-
-.mail-conv-body {
- margin-bottom: 10px;
-}
-
.mail-conv-body img {
max-width: 100%;
}
-
-#prvmail-rotator {
- margin: 15px;
-}
-
-#prvmail-text {
- height: 15.0em;
-}
-
-.mail-conv-outside-wrapper {
- margin-bottom: 20px;
-}
diff --git a/view/css/mod_setup.css b/view/css/mod_setup.css
index ee725d055..f0d91a0ae 100644
--- a/view/css/mod_setup.css
+++ b/view/css/mod_setup.css
@@ -32,3 +32,9 @@
margin-top: 18px;
margin-left: 20px;
}
+
+main {
+ max-width: 790px;
+ margin-left: auto;
+ margin-right: auto;
+}
diff --git a/view/css/mod_webpages.css b/view/css/mod_webpages.css
index 805d95dc2..f665800f1 100644
--- a/view/css/mod_webpages.css
+++ b/view/css/mod_webpages.css
@@ -6,27 +6,31 @@
width: 100%;
}
-#webpage-list-table th:nth-child(1){
+#webpage-list-table th:nth-child(1) {
padding: 7px 3px 7px 10px;
white-space: nowrap;
}
-#webpage-list-table td:nth-child(1){
+#webpage-list-table td:nth-child(1) {
padding: 7px 3px 7px 10px;
}
-#webpage-list-table th:nth-child(2){
+#webpage-list-table th:nth-child(2) {
+ white-space: nowrap;
+}
+
+#webpage-list-table td:nth-child(3) {
white-space: nowrap;
}
#webpage-list-table th:nth-child(7),
-#webpage-list-table td:nth-child(7){
+#webpage-list-table td:nth-child(7) {
padding: 7px 3px;
white-space: nowrap;
}
#webpage-list-table th:nth-child(8),
-#webpage-list-table td:nth-child(8){
+#webpage-list-table td:nth-child(8) {
padding: 7px 10px 7px 7px;
white-space: nowrap;
}
@@ -192,4 +196,4 @@
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";
filter: alpha(opacity=100);
opacity: 1;
-} \ No newline at end of file
+}
diff --git a/view/css/mod_wiki.css b/view/css/mod_wiki.css
index 49eb89ecc..b77645d4f 100644
--- a/view/css/mod_wiki.css
+++ b/view/css/mod_wiki.css
@@ -41,6 +41,7 @@
#wikis-index th:nth-child(4),
#wikis-index td:nth-child(4){
padding: 7px 10px 7px 7px;
+ white-space: nowrap;
}
#wikis-index th:nth-child(5),
diff --git a/view/css/widgets.css b/view/css/widgets.css
index 9b97d8bf7..6cd61ae6f 100644
--- a/view/css/widgets.css
+++ b/view/css/widgets.css
@@ -1,17 +1,15 @@
.widget {
- margin-bottom: 10px;
- padding: 10px;
+ margin-bottom: 1rem;
+ padding: 0.5rem;
}
.widget h3 {
margin-top: 0px;
}
-.widget-input {
- width: 100%;
- border-top-right-radius: 0px;
- border-bottom-right-radius: 0px;
- border-right: 0px;
+.widget .active .wall-item-ago,
+.widget .active .dropdown-sub-text {
+ color: #fff;
}
.tags {
@@ -20,34 +18,15 @@
.widget-nav-pills-icons {
opacity: 0;
- padding: 6px 10px;
float: right;
- position: relative;
- z-index:1;
}
-
.widget-nav-pills-checkbox {
- padding: 6px 10px;
+ padding: 0.6rem 1.4rem;
float: right;
- position: relative;
- z-index:1;
cursor: pointer;
}
-i.widget-nav-pills-icons,
-i.widget-nav-pills-checkbox {
- margin-top: 2px;
-}
-
-.widget-nav-pills-icons:hover + a {
- background-color: #eee;
-}
-
-.widget-nav-pills-checkbox:hover + a {
- background-color: #eee;
-}
-
li:hover .widget-nav-pills-icons {
opacity: 1;
}
@@ -150,16 +129,6 @@ li:hover .group-edit-icon {
width: 250px;
}
-/* events tools */
-
-#event-upload-form {
- margin-top: 10px;
-}
-
-#event-upload-choose {
- width: 100%;
-}
-
/* cover photo */
#cover-photo {
@@ -174,20 +143,22 @@ li:hover .group-edit-icon {
bottom: 0px;
left: 0px;
width: 100%;
- padding: 15px;
+ padding: 1rem;
+}
+
+#cover-photo-caption h1,
+#cover-photo-caption h3 {
color: #fff;
font-weight: bold;
- text-shadow: 1px 1px 3px rgba(0,0,0,.7);
+ text-shadow: 1px 1px 3px rgba(0,0,0,0.5);
}
-.cover-photo-title {
- font-size: 30px;
+a.wikilist {
+ z-index: 1;
}
-.cover-photo-subtitle {
- font-size: 20px;
-}
+/* mail list */
-a.wikilist {
- z-index: 1;
+.active .conv-participants {
+ color: #fff;
}
diff --git a/view/de/hmessages.po b/view/de/hmessages.po
index 62f7fe602..9c24dcbbd 100644
--- a/view/de/hmessages.po
+++ b/view/de/hmessages.po
@@ -18,16 +18,16 @@
# sasiflo <transiflex@sasiflo.de>, 2014
# Steff <steff@digitalesecho.de>, 2015-2016
# Tobias Diekershoff <tobias.diekershoff@gmx.net>, 2016
-# Tobias Diekershoff <tobias.diekershoff@gmx.net>, 2016
+# Tobias Diekershoff <tobias.diekershoff@gmx.net>, 2016-2017
# zottel <transifex@zottel.net>, 2015
# sasiflo <transiflex@sasiflo.de>, 2015
msgid ""
msgstr ""
"Project-Id-Version: Redmatrix\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-02-17 00:05-0800\n"
-"PO-Revision-Date: 2017-02-22 13:47+0000\n"
-"Last-Translator: Phellmes <forum@suschka.de>\n"
+"POT-Creation-Date: 2017-05-01 15:36+0200\n"
+"PO-Revision-Date: 2017-05-07 00:56+0000\n"
+"Last-Translator: Ettore Atalan <atalanttore@googlemail.com>\n"
"Language-Team: German (http://www.transifex.com/Friendica/red-matrix/language/de/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -35,94 +35,6 @@ msgstr ""
"Language: de\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: ../../Zotlabs/Access/PermissionRoles.php:248
-#: ../../include/permissions.php:945
-msgid "Social Networking"
-msgstr "Soziales Netzwerk"
-
-#: ../../Zotlabs/Access/PermissionRoles.php:249
-#: ../../include/permissions.php:945
-msgid "Social - Mostly Public"
-msgstr "Soziales Netzwerk - Weitgehend öffentlich"
-
-#: ../../Zotlabs/Access/PermissionRoles.php:250
-#: ../../include/permissions.php:945
-msgid "Social - Restricted"
-msgstr "Soziales Netzwerk - Beschränkt"
-
-#: ../../Zotlabs/Access/PermissionRoles.php:251
-#: ../../include/permissions.php:945
-msgid "Social - Private"
-msgstr "Soziales Netzwerk - Privat"
-
-#: ../../Zotlabs/Access/PermissionRoles.php:254
-#: ../../include/permissions.php:946
-msgid "Community Forum"
-msgstr "Forum"
-
-#: ../../Zotlabs/Access/PermissionRoles.php:255
-#: ../../include/permissions.php:946
-msgid "Forum - Mostly Public"
-msgstr "Forum - Weitgehend öffentlich"
-
-#: ../../Zotlabs/Access/PermissionRoles.php:256
-#: ../../include/permissions.php:946
-msgid "Forum - Restricted"
-msgstr "Forum - Beschränkt"
-
-#: ../../Zotlabs/Access/PermissionRoles.php:257
-#: ../../include/permissions.php:946
-msgid "Forum - Private"
-msgstr "Forum - Privat"
-
-#: ../../Zotlabs/Access/PermissionRoles.php:260
-#: ../../include/permissions.php:947
-msgid "Feed Republish"
-msgstr "Teilen von Feeds"
-
-#: ../../Zotlabs/Access/PermissionRoles.php:261
-#: ../../include/permissions.php:947
-msgid "Feed - Mostly Public"
-msgstr "Feeds - Weitgehend öffentlich"
-
-#: ../../Zotlabs/Access/PermissionRoles.php:262
-#: ../../include/permissions.php:947
-msgid "Feed - Restricted"
-msgstr "Feeds - Beschränkt"
-
-#: ../../Zotlabs/Access/PermissionRoles.php:265
-#: ../../include/permissions.php:948
-msgid "Special Purpose"
-msgstr "Für besondere Zwecke"
-
-#: ../../Zotlabs/Access/PermissionRoles.php:266
-#: ../../include/permissions.php:948
-msgid "Special - Celebrity/Soapbox"
-msgstr "Speziell - Mitteilungs-Kanal (keine Kommentare)"
-
-#: ../../Zotlabs/Access/PermissionRoles.php:267
-#: ../../include/permissions.php:948
-msgid "Special - Group Repository"
-msgstr "Speziell - Gruppenarchiv"
-
-#: ../../Zotlabs/Access/PermissionRoles.php:270
-#: ../../Zotlabs/Module/Register.php:213 ../../Zotlabs/Module/Connedit.php:879
-#: ../../Zotlabs/Module/New_channel.php:132
-#: ../../Zotlabs/Module/Settings/Channel.php:463
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1148
-#: ../../extend/addon/addon/cdav/cdav.php:277
-#: ../../extend/addon/addon/cdav/cdav.php:284 ../../include/selectors.php:49
-#: ../../include/selectors.php:66 ../../include/selectors.php:104
-#: ../../include/selectors.php:140 ../../include/connections.php:901
-#: ../../include/connections.php:908 ../../include/permissions.php:949
-msgid "Other"
-msgstr "Andere"
-
-#: ../../Zotlabs/Access/PermissionRoles.php:271
-#: ../../include/permissions.php:949
-msgid "Custom/Expert Mode"
-msgstr "Benutzerdefiniert/Expertenmodus"
-
#: ../../Zotlabs/Access/Permissions.php:46
msgid "Can view my channel stream and posts"
msgstr "Kann meinen Kanal-Stream und meine Beiträge sehen"
@@ -195,1863 +107,2051 @@ msgstr "Kann meine öffentlichen Beiträge als Quellen für Kanäle verwenden"
msgid "Can administer my channel"
msgstr "Kann meinen Kanal administrieren"
-#: ../../Zotlabs/Storage/Browser.php:106 ../../Zotlabs/Storage/Browser.php:237
-msgid "parent"
-msgstr "Ãœbergeordnetes Verzeichnis"
+#: ../../Zotlabs/Access/PermissionRoles.php:248
+#: ../../include/permissions.php:946
+msgid "Social Networking"
+msgstr "Soziales Netzwerk"
-#: ../../Zotlabs/Storage/Browser.php:130 ../../include/text.php:2695
-msgid "Collection"
-msgstr "Sammlung"
+#: ../../Zotlabs/Access/PermissionRoles.php:249
+#: ../../include/permissions.php:946
+msgid "Social - Mostly Public"
+msgstr "Soziales Netzwerk - Weitgehend öffentlich"
-#: ../../Zotlabs/Storage/Browser.php:133
-msgid "Principal"
-msgstr "Prinzipal"
+#: ../../Zotlabs/Access/PermissionRoles.php:250
+#: ../../include/permissions.php:946
+msgid "Social - Restricted"
+msgstr "Soziales Netzwerk - Beschränkt"
-#: ../../Zotlabs/Storage/Browser.php:136
-msgid "Addressbook"
-msgstr "Adressbuch"
+#: ../../Zotlabs/Access/PermissionRoles.php:251
+#: ../../include/permissions.php:946
+msgid "Social - Private"
+msgstr "Soziales Netzwerk - Privat"
-#: ../../Zotlabs/Storage/Browser.php:139
-msgid "Calendar"
-msgstr "Kalender"
+#: ../../Zotlabs/Access/PermissionRoles.php:254
+#: ../../include/permissions.php:947
+msgid "Community Forum"
+msgstr "Forum"
-#: ../../Zotlabs/Storage/Browser.php:142
-msgid "Schedule Inbox"
-msgstr "Posteingang für überwachte Kalender"
+#: ../../Zotlabs/Access/PermissionRoles.php:255
+#: ../../include/permissions.php:947
+msgid "Forum - Mostly Public"
+msgstr "Forum - Weitgehend öffentlich"
-#: ../../Zotlabs/Storage/Browser.php:145
-msgid "Schedule Outbox"
-msgstr "Postausgang für überwachte Kalender"
+#: ../../Zotlabs/Access/PermissionRoles.php:256
+#: ../../include/permissions.php:947
+msgid "Forum - Restricted"
+msgstr "Forum - Beschränkt"
-#: ../../Zotlabs/Storage/Browser.php:163 ../../Zotlabs/Module/Photos.php:784
-#: ../../Zotlabs/Module/Photos.php:1244
-#: ../../Zotlabs/Module/Embedphotos.php:145 ../../Zotlabs/Lib/Apps.php:559
-#: ../../Zotlabs/Lib/Apps.php:637
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:745
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:746
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:753
-#: ../../include/conversation.php:1177 ../../include/widgets.php:1714
-msgid "Unknown"
-msgstr "Unbekannt"
+#: ../../Zotlabs/Access/PermissionRoles.php:257
+#: ../../include/permissions.php:947
+msgid "Forum - Private"
+msgstr "Forum - Privat"
-#: ../../Zotlabs/Storage/Browser.php:224 ../../Zotlabs/Module/Fbrowser.php:85
-#: ../../Zotlabs/Lib/Apps.php:224 ../../include/conversation.php:1843
-msgid "Files"
-msgstr "Dateien"
+#: ../../Zotlabs/Access/PermissionRoles.php:260
+#: ../../include/permissions.php:948
+msgid "Feed Republish"
+msgstr "Teilen von Feeds"
-#: ../../Zotlabs/Storage/Browser.php:225
-msgid "Total"
-msgstr "Summe"
+#: ../../Zotlabs/Access/PermissionRoles.php:261
+#: ../../include/permissions.php:948
+msgid "Feed - Mostly Public"
+msgstr "Feeds - Weitgehend öffentlich"
-#: ../../Zotlabs/Storage/Browser.php:227
-msgid "Shared"
-msgstr "Geteilt"
+#: ../../Zotlabs/Access/PermissionRoles.php:262
+#: ../../include/permissions.php:948
+msgid "Feed - Restricted"
+msgstr "Feeds - Beschränkt"
-#: ../../Zotlabs/Storage/Browser.php:228 ../../Zotlabs/Storage/Browser.php:321
-#: ../../Zotlabs/Module/Menu.php:118 ../../Zotlabs/Module/Connedit.php:882
-#: ../../Zotlabs/Module/New_channel.php:147
-#: ../../Zotlabs/Module/Blocks.php:159 ../../Zotlabs/Module/Layouts.php:184
-#: ../../Zotlabs/Module/Webpages.php:243
-#: ../../extend/addon/addon/cdav/include/widgets.php:127
-#: ../../extend/addon/addon/cdav/include/widgets.php:164
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1151
-msgid "Create"
-msgstr "Erstelle"
+#: ../../Zotlabs/Access/PermissionRoles.php:265
+#: ../../include/permissions.php:949
+msgid "Special Purpose"
+msgstr "Für besondere Zwecke"
-#: ../../Zotlabs/Storage/Browser.php:229 ../../Zotlabs/Storage/Browser.php:323
-#: ../../Zotlabs/Module/Photos.php:811 ../../Zotlabs/Module/Photos.php:1368
-#: ../../Zotlabs/Module/Cover_photo.php:357
-#: ../../Zotlabs/Module/Profile_photo.php:412
-#: ../../Zotlabs/Module/Embedphotos.php:157
-#: ../../extend/addon/addon/cdav/include/widgets.php:132
-#: ../../extend/addon/addon/cdav/include/widgets.php:168
-#: ../../include/widgets.php:1727
-msgid "Upload"
-msgstr "Hochladen"
+#: ../../Zotlabs/Access/PermissionRoles.php:266
+#: ../../include/permissions.php:949
+msgid "Special - Celebrity/Soapbox"
+msgstr "Speziell - Mitteilungs-Kanal (keine Kommentare)"
-#: ../../Zotlabs/Storage/Browser.php:233
-#: ../../Zotlabs/Module/Admin/Channels.php:159
-#: ../../Zotlabs/Module/Connedit.php:867
-#: ../../Zotlabs/Module/Sharedwithme.php:99 ../../Zotlabs/Module/Wiki.php:170
-#: ../../Zotlabs/Module/Settings/Oauth.php:89
-#: ../../Zotlabs/Module/Settings/Oauth.php:115
-#: ../../Zotlabs/Module/Chat.php:250
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1136
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:172
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:156
-#: ../../include/widgets.php:990
-msgid "Name"
-msgstr "Name"
+#: ../../Zotlabs/Access/PermissionRoles.php:267
+#: ../../include/permissions.php:949
+msgid "Special - Group Repository"
+msgstr "Speziell - Gruppenarchiv"
-#: ../../Zotlabs/Storage/Browser.php:234 ../../Zotlabs/Module/Wiki.php:171
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:157
-msgid "Type"
-msgstr "Typ"
+#: ../../Zotlabs/Access/PermissionRoles.php:270
+#: ../../Zotlabs/Module/New_channel.php:132
+#: ../../Zotlabs/Module/Settings/Channel.php:463
+#: ../../Zotlabs/Module/Connedit.php:914 ../../Zotlabs/Module/Profiles.php:798
+#: ../../Zotlabs/Module/Register.php:213 ../../addon/cdav/Mod_Cdav.php:1148
+#: ../../addon/cdav/cdav.php:277 ../../addon/cdav/cdav.php:284
+#: ../../include/selectors.php:49 ../../include/selectors.php:66
+#: ../../include/selectors.php:104 ../../include/selectors.php:140
+#: ../../include/permissions.php:950 ../../include/connections.php:675
+#: ../../include/connections.php:682
+msgid "Other"
+msgstr "Andere"
-#: ../../Zotlabs/Storage/Browser.php:235
-#: ../../Zotlabs/Module/Sharedwithme.php:101 ../../include/text.php:1408
-msgid "Size"
-msgstr "Größe"
+#: ../../Zotlabs/Access/PermissionRoles.php:271
+#: ../../include/permissions.php:950
+msgid "Custom/Expert Mode"
+msgstr "Benutzerdefiniert/Expertenmodus"
-#: ../../Zotlabs/Storage/Browser.php:236
-#: ../../Zotlabs/Module/Sharedwithme.php:102
-msgid "Last Modified"
-msgstr "Zuletzt geändert"
+#: ../../Zotlabs/Module/Blocks.php:33 ../../Zotlabs/Module/Editlayout.php:31
+#: ../../Zotlabs/Module/Connect.php:17
+#: ../../Zotlabs/Module/Achievements.php:15 ../../Zotlabs/Module/Hcard.php:12
+#: ../../Zotlabs/Module/Editblock.php:31 ../../Zotlabs/Module/Profile.php:20
+#: ../../Zotlabs/Module/Layouts.php:31 ../../Zotlabs/Module/Editwebpage.php:32
+#: ../../Zotlabs/Module/Webpages.php:33
+#: ../../Zotlabs/Module/Filestorage.php:59 ../../include/channel.php:945
+msgid "Requested profile is not available."
+msgstr "Das angefragte Profil ist nicht verfügbar."
-#: ../../Zotlabs/Storage/Browser.php:238 ../../Zotlabs/Module/Editpost.php:85
-#: ../../Zotlabs/Module/Editblock.php:109
-#: ../../Zotlabs/Module/Connections.php:300
-#: ../../Zotlabs/Module/Connections.php:320
+#: ../../Zotlabs/Module/Blocks.php:73 ../../Zotlabs/Module/Blocks.php:80
+#: ../../Zotlabs/Module/Invite.php:17 ../../Zotlabs/Module/Invite.php:94
+#: ../../Zotlabs/Module/Editlayout.php:67
+#: ../../Zotlabs/Module/Editlayout.php:90 ../../Zotlabs/Module/Channel.php:115
+#: ../../Zotlabs/Module/Channel.php:245 ../../Zotlabs/Module/Channel.php:285
+#: ../../Zotlabs/Module/Settings.php:59 ../../Zotlabs/Module/Locs.php:87
+#: ../../Zotlabs/Module/Mitem.php:115 ../../Zotlabs/Module/Events.php:271
+#: ../../Zotlabs/Module/Appman.php:82 ../../Zotlabs/Module/Regmod.php:21
+#: ../../Zotlabs/Module/New_channel.php:77
+#: ../../Zotlabs/Module/New_channel.php:104
+#: ../../Zotlabs/Module/Sharedwithme.php:11 ../../Zotlabs/Module/Setup.php:212
+#: ../../Zotlabs/Module/Achievements.php:34 ../../Zotlabs/Module/Thing.php:274
+#: ../../Zotlabs/Module/Thing.php:294 ../../Zotlabs/Module/Thing.php:335
+#: ../../Zotlabs/Module/Api.php:24 ../../Zotlabs/Module/Editblock.php:67
+#: ../../Zotlabs/Module/Profile.php:83 ../../Zotlabs/Module/Profile.php:100
+#: ../../Zotlabs/Module/Mood.php:116 ../../Zotlabs/Module/Connections.php:29
+#: ../../Zotlabs/Module/Viewsrc.php:19 ../../Zotlabs/Module/Bookmarks.php:61
+#: ../../Zotlabs/Module/Photos.php:69 ../../Zotlabs/Module/Wiki.php:50
+#: ../../Zotlabs/Module/Wiki.php:216 ../../Zotlabs/Module/Wiki.php:315
+#: ../../Zotlabs/Module/Pdledit.php:29 ../../Zotlabs/Module/Poke.php:137
+#: ../../Zotlabs/Module/Profile_photo.php:280
+#: ../../Zotlabs/Module/Profile_photo.php:293
+#: ../../Zotlabs/Module/Authtest.php:16 ../../Zotlabs/Module/Item.php:221
+#: ../../Zotlabs/Module/Item.php:231 ../../Zotlabs/Module/Item.php:1038
+#: ../../Zotlabs/Module/Page.php:35 ../../Zotlabs/Module/Page.php:91
+#: ../../Zotlabs/Module/Connedit.php:385 ../../Zotlabs/Module/Chat.php:98
+#: ../../Zotlabs/Module/Chat.php:103 ../../Zotlabs/Module/Menu.php:78
+#: ../../Zotlabs/Module/Layouts.php:71 ../../Zotlabs/Module/Layouts.php:78
+#: ../../Zotlabs/Module/Layouts.php:89 ../../Zotlabs/Module/Group.php:13
+#: ../../Zotlabs/Module/Profiles.php:198 ../../Zotlabs/Module/Profiles.php:635
+#: ../../Zotlabs/Module/Editwebpage.php:68
+#: ../../Zotlabs/Module/Editwebpage.php:89
+#: ../../Zotlabs/Module/Editwebpage.php:107
+#: ../../Zotlabs/Module/Editwebpage.php:121 ../../Zotlabs/Module/Manage.php:10
+#: ../../Zotlabs/Module/Webpages.php:116 ../../Zotlabs/Module/Block.php:26
+#: ../../Zotlabs/Module/Block.php:76 ../../Zotlabs/Module/Editpost.php:17
+#: ../../Zotlabs/Module/Sources.php:74 ../../Zotlabs/Module/Like.php:181
+#: ../../Zotlabs/Module/Suggest.php:28 ../../Zotlabs/Module/Message.php:18
+#: ../../Zotlabs/Module/Mail.php:164 ../../Zotlabs/Module/Register.php:77
+#: ../../Zotlabs/Module/Cover_photo.php:281
+#: ../../Zotlabs/Module/Cover_photo.php:294
+#: ../../Zotlabs/Module/Network.php:15 ../../Zotlabs/Module/Filestorage.php:23
+#: ../../Zotlabs/Module/Filestorage.php:78
+#: ../../Zotlabs/Module/Filestorage.php:93
+#: ../../Zotlabs/Module/Filestorage.php:120 ../../Zotlabs/Module/Common.php:39
+#: ../../Zotlabs/Module/Viewconnections.php:28
+#: ../../Zotlabs/Module/Viewconnections.php:33
+#: ../../Zotlabs/Module/Service_limits.php:11
+#: ../../Zotlabs/Module/Rate.php:113 ../../Zotlabs/Module/Notifications.php:11
+#: ../../Zotlabs/Lib/Chatroom.php:137 ../../Zotlabs/Web/WebServer.php:131
+#: ../../addon/keepout/keepout.php:36 ../../addon/openid/Mod_Id.php:53
+#: ../../addon/gitwiki/Mod_Gitwiki.php:196
+#: ../../addon/gitwiki/Mod_Gitwiki.php:292
+#: ../../addon/diaspora_reconnect/diaspora_reconnect.php:58
+#: ../../addon/pumpio/pumpio.php:40 ../../include/attach.php:144
+#: ../../include/attach.php:191 ../../include/attach.php:255
+#: ../../include/attach.php:269 ../../include/attach.php:276
+#: ../../include/attach.php:344 ../../include/attach.php:358
+#: ../../include/attach.php:365 ../../include/attach.php:442
+#: ../../include/attach.php:909 ../../include/attach.php:983
+#: ../../include/attach.php:1148 ../../include/items.php:3470
+#: ../../include/photos.php:27
+msgid "Permission denied."
+msgstr "Berechtigung verweigert."
+
+#: ../../Zotlabs/Module/Blocks.php:97 ../../Zotlabs/Module/Blocks.php:155
+#: ../../Zotlabs/Module/Editblock.php:113
+msgid "Block Name"
+msgstr "Block-Name"
+
+#: ../../Zotlabs/Module/Blocks.php:154 ../../include/text.php:2267
+msgid "Blocks"
+msgstr "Blöcke"
+
+#: ../../Zotlabs/Module/Blocks.php:156
+msgid "Block Title"
+msgstr "Titel des Blocks"
+
+#: ../../Zotlabs/Module/Blocks.php:157 ../../Zotlabs/Module/Menu.php:114
+#: ../../Zotlabs/Module/Layouts.php:191 ../../Zotlabs/Module/Webpages.php:256
+#: ../../include/page_widgets.php:47
+msgid "Created"
+msgstr "Erstellt"
+
+#: ../../Zotlabs/Module/Blocks.php:158 ../../Zotlabs/Module/Menu.php:115
+#: ../../Zotlabs/Module/Layouts.php:192 ../../Zotlabs/Module/Webpages.php:257
+#: ../../include/page_widgets.php:48
+msgid "Edited"
+msgstr "Geändert"
+
+#: ../../Zotlabs/Module/Blocks.php:159
+#: ../../Zotlabs/Module/New_channel.php:147
+#: ../../Zotlabs/Module/Connedit.php:917 ../../Zotlabs/Module/Menu.php:118
+#: ../../Zotlabs/Module/Layouts.php:185 ../../Zotlabs/Module/Profiles.php:801
+#: ../../Zotlabs/Module/Webpages.php:244 ../../Zotlabs/Storage/Browser.php:228
+#: ../../Zotlabs/Storage/Browser.php:332 ../../addon/cdav/Mod_Cdav.php:1151
+#: ../../addon/cdav/include/widgets.php:127
+#: ../../addon/cdav/include/widgets.php:164
+msgid "Create"
+msgstr "Erstelle"
+
+#: ../../Zotlabs/Module/Blocks.php:160 ../../Zotlabs/Module/Editlayout.php:114
#: ../../Zotlabs/Module/Admin/Profs.php:154
-#: ../../Zotlabs/Module/Editlayout.php:114
-#: ../../Zotlabs/Module/Editwebpage.php:145 ../../Zotlabs/Module/Menu.php:112
-#: ../../Zotlabs/Module/Blocks.php:160 ../../Zotlabs/Module/Layouts.php:192
-#: ../../Zotlabs/Module/Webpages.php:244 ../../Zotlabs/Module/Wiki.php:163
-#: ../../Zotlabs/Module/Wiki.php:273
#: ../../Zotlabs/Module/Settings/Oauth.php:149
-#: ../../Zotlabs/Module/Thing.php:260 ../../Zotlabs/Lib/ThreadItem.php:106
-#: ../../Zotlabs/Lib/Apps.php:357
-#: ../../extend/addon/addon/cdav/include/widgets.php:125
-#: ../../extend/addon/addon/cdav/include/widgets.php:161
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:149
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:251
-#: ../../include/menu.php:113 ../../include/channel.php:1044
-#: ../../include/channel.php:1048 ../../include/page_widgets.php:9
-#: ../../include/page_widgets.php:39
+#: ../../Zotlabs/Module/Thing.php:260 ../../Zotlabs/Module/Editblock.php:114
+#: ../../Zotlabs/Module/Connections.php:296
+#: ../../Zotlabs/Module/Connections.php:316 ../../Zotlabs/Module/Wiki.php:165
+#: ../../Zotlabs/Module/Wiki.php:275 ../../Zotlabs/Module/Menu.php:112
+#: ../../Zotlabs/Module/Layouts.php:193
+#: ../../Zotlabs/Module/Editwebpage.php:142
+#: ../../Zotlabs/Module/Webpages.php:245 ../../Zotlabs/Module/Editpost.php:80
+#: ../../Zotlabs/Lib/Apps.php:367 ../../Zotlabs/Lib/ThreadItem.php:107
+#: ../../Zotlabs/Storage/Browser.php:238
+#: ../../addon/cdav/include/widgets.php:125
+#: ../../addon/cdav/include/widgets.php:161
+#: ../../addon/gitwiki/Mod_Gitwiki.php:151
+#: ../../addon/gitwiki/Mod_Gitwiki.php:252 ../../include/channel.php:1044
+#: ../../include/channel.php:1048 ../../include/menu.php:113
+#: ../../include/page_widgets.php:9 ../../include/page_widgets.php:39
msgid "Edit"
msgstr "Bearbeiten"
-#: ../../Zotlabs/Storage/Browser.php:239 ../../Zotlabs/Module/Photos.php:1174
-#: ../../Zotlabs/Module/Editblock.php:134
-#: ../../Zotlabs/Module/Connections.php:271
-#: ../../Zotlabs/Module/Admin/Profs.php:155
+#: ../../Zotlabs/Module/Blocks.php:161 ../../Zotlabs/Module/Photos.php:1042
+#: ../../Zotlabs/Module/Layouts.php:194 ../../Zotlabs/Module/Webpages.php:246
+#: ../../addon/cdav/include/widgets.php:123
+#: ../../include/conversation.php:1311
+msgid "Share"
+msgstr "Teilen"
+
+#: ../../Zotlabs/Module/Blocks.php:162 ../../Zotlabs/Module/Editlayout.php:138
#: ../../Zotlabs/Module/Admin/Accounts.php:173
#: ../../Zotlabs/Module/Admin/Channels.php:149
-#: ../../Zotlabs/Module/Editlayout.php:137
-#: ../../Zotlabs/Module/Editwebpage.php:170
-#: ../../Zotlabs/Module/Connedit.php:626 ../../Zotlabs/Module/Connedit.php:884
-#: ../../Zotlabs/Module/Group.php:177 ../../Zotlabs/Module/Blocks.php:162
-#: ../../Zotlabs/Module/Webpages.php:246
+#: ../../Zotlabs/Module/Admin/Profs.php:155
#: ../../Zotlabs/Module/Settings/Oauth.php:150
-#: ../../Zotlabs/Module/Thing.php:261 ../../Zotlabs/Lib/ThreadItem.php:126
-#: ../../Zotlabs/Lib/Apps.php:358
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:864
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1153
-#: ../../include/conversation.php:656
+#: ../../Zotlabs/Module/Thing.php:261 ../../Zotlabs/Module/Editblock.php:139
+#: ../../Zotlabs/Module/Connections.php:267
+#: ../../Zotlabs/Module/Photos.php:1143 ../../Zotlabs/Module/Connedit.php:650
+#: ../../Zotlabs/Module/Connedit.php:919 ../../Zotlabs/Module/Group.php:177
+#: ../../Zotlabs/Module/Profiles.php:803
+#: ../../Zotlabs/Module/Editwebpage.php:167
+#: ../../Zotlabs/Module/Webpages.php:247 ../../Zotlabs/Lib/Apps.php:368
+#: ../../Zotlabs/Lib/ThreadItem.php:127 ../../Zotlabs/Storage/Browser.php:239
+#: ../../addon/cdav/Mod_Cdav.php:864 ../../addon/cdav/Mod_Cdav.php:1153
+#: ../../include/conversation.php:654
msgid "Delete"
msgstr "Löschen"
-#: ../../Zotlabs/Storage/Browser.php:299
+#: ../../Zotlabs/Module/Blocks.php:166 ../../Zotlabs/Module/Events.php:694
+#: ../../Zotlabs/Module/Wiki.php:167 ../../Zotlabs/Module/Layouts.php:198
+#: ../../Zotlabs/Module/Webpages.php:251 ../../Zotlabs/Module/Pubsites.php:59
+#: ../../addon/gitwiki/Mod_Gitwiki.php:153 ../../include/page_widgets.php:42
+msgid "View"
+msgstr "Ansicht"
+
+#: ../../Zotlabs/Module/Invite.php:29
+msgid "Total invitation limit exceeded."
+msgstr "Einladungslimit überschritten."
+
+#: ../../Zotlabs/Module/Invite.php:53
#, php-format
-msgid "You are using %1$s of your available file storage."
-msgstr "Sie verwenden %1$s von Ihrem verfügbaren Dateispeicher."
+msgid "%s : Not a valid email address."
+msgstr "%s : Keine gültige Email Adresse."
-#: ../../Zotlabs/Storage/Browser.php:304
+#: ../../Zotlabs/Module/Invite.php:67
+msgid "Please join us on $Projectname"
+msgstr "Schließe Dich uns auf $Projectname an!"
+
+#: ../../Zotlabs/Module/Invite.php:77
+msgid "Invitation limit exceeded. Please contact your site administrator."
+msgstr "Einladungslimit überschritten. Bitte kontaktiere den Administrator Deines $Projectname-Servers."
+
+#: ../../Zotlabs/Module/Invite.php:82
#, php-format
-msgid "You are using %1$s of %2$s available file storage. (%3$s&#37;)"
-msgstr "Sie verwenden %1$s von %2$s verfügbarem Dateispeicher. (%3$s&#37;)"
+msgid "%s : Message delivery failed."
+msgstr "%s : Nachricht konnte nicht zugestellt werden."
-#: ../../Zotlabs/Storage/Browser.php:315
-msgid "WARNING:"
-msgstr "WARNUNG:"
+#: ../../Zotlabs/Module/Invite.php:86
+#, php-format
+msgid "%d message sent."
+msgid_plural "%d messages sent."
+msgstr[0] "%d Nachricht gesendet."
+msgstr[1] "%d Nachrichten gesendet."
-#: ../../Zotlabs/Storage/Browser.php:320
-msgid "Create new folder"
-msgstr "Neuen Ordner anlegen"
+#: ../../Zotlabs/Module/Invite.php:105
+msgid "You have no more invitations available"
+msgstr "Du hast keine weiteren verfügbare Einladungen"
-#: ../../Zotlabs/Storage/Browser.php:322
-msgid "Upload file"
-msgstr "Datei hochladen"
+#: ../../Zotlabs/Module/Invite.php:136
+msgid "Send invitations"
+msgstr "Einladungen senden"
-#: ../../Zotlabs/Storage/Browser.php:335
-msgid "Drop files here to immediately upload"
-msgstr "Dateien zum sofortigen Hochladen hier fallen lassen"
+#: ../../Zotlabs/Module/Invite.php:137
+msgid "Enter email addresses, one per line:"
+msgstr "Email-Adressen eintragen, eine pro Zeile:"
-#: ../../Zotlabs/Web/WebServer.php:127 ../../Zotlabs/Module/Like.php:283
-#: ../../Zotlabs/Module/Group.php:72 ../../Zotlabs/Module/Dreport.php:10
-#: ../../Zotlabs/Module/Dreport.php:68
-#: ../../Zotlabs/Module/Import_items.php:114
-#: ../../Zotlabs/Module/Profperm.php:28 ../../Zotlabs/Module/Subthread.php:62
-#: ../../extend/addon/addon/frphotos/frphotos.php:81
-#: ../../extend/addon/addon/redfiles/redfiles.php:109
-#: ../../extend/addon/addon/redphotos/redphotos.php:119
-#: ../../include/items.php:327
-msgid "Permission denied"
-msgstr "Keine Berechtigung"
+#: ../../Zotlabs/Module/Invite.php:138 ../../Zotlabs/Module/Mail.php:303
+msgid "Your message:"
+msgstr "Deine Nachricht:"
-#: ../../Zotlabs/Web/WebServer.php:128 ../../Zotlabs/Web/Router.php:67
-#: ../../Zotlabs/Module/Achievements.php:34
-#: ../../Zotlabs/Module/Register.php:77 ../../Zotlabs/Module/Photos.php:73
-#: ../../Zotlabs/Module/Editpost.php:17 ../../Zotlabs/Module/Authtest.php:16
-#: ../../Zotlabs/Module/Bookmarks.php:61 ../../Zotlabs/Module/Editblock.php:67
-#: ../../Zotlabs/Module/Page.php:35 ../../Zotlabs/Module/Page.php:91
-#: ../../Zotlabs/Module/Connections.php:33
-#: ../../Zotlabs/Module/Cover_photo.php:277
-#: ../../Zotlabs/Module/Cover_photo.php:290
-#: ../../Zotlabs/Module/Editlayout.php:67
-#: ../../Zotlabs/Module/Editlayout.php:90
-#: ../../Zotlabs/Module/Editwebpage.php:68
-#: ../../Zotlabs/Module/Editwebpage.php:89
-#: ../../Zotlabs/Module/Editwebpage.php:104
-#: ../../Zotlabs/Module/Editwebpage.php:126 ../../Zotlabs/Module/Like.php:181
-#: ../../Zotlabs/Module/Network.php:15 ../../Zotlabs/Module/Menu.php:78
-#: ../../Zotlabs/Module/Locs.php:87 ../../Zotlabs/Module/Connedit.php:388
-#: ../../Zotlabs/Module/Filestorage.php:23
-#: ../../Zotlabs/Module/Filestorage.php:78
-#: ../../Zotlabs/Module/Filestorage.php:93
-#: ../../Zotlabs/Module/Filestorage.php:120
-#: ../../Zotlabs/Module/Settings.php:59 ../../Zotlabs/Module/Group.php:13
-#: ../../Zotlabs/Module/Block.php:26 ../../Zotlabs/Module/Block.php:76
-#: ../../Zotlabs/Module/Manage.php:10 ../../Zotlabs/Module/Mitem.php:115
-#: ../../Zotlabs/Module/Appman.php:81 ../../Zotlabs/Module/Mood.php:116
-#: ../../Zotlabs/Module/Profiles.php:198 ../../Zotlabs/Module/Profiles.php:636
-#: ../../Zotlabs/Module/Api.php:24 ../../Zotlabs/Module/Invite.php:17
-#: ../../Zotlabs/Module/Invite.php:94 ../../Zotlabs/Module/New_channel.php:77
-#: ../../Zotlabs/Module/New_channel.php:104 ../../Zotlabs/Module/Setup.php:212
-#: ../../Zotlabs/Module/Notifications.php:11 ../../Zotlabs/Module/Poke.php:137
-#: ../../Zotlabs/Module/Item.php:220 ../../Zotlabs/Module/Item.php:230
-#: ../../Zotlabs/Module/Item.php:1067 ../../Zotlabs/Module/Profile.php:70
-#: ../../Zotlabs/Module/Profile.php:87 ../../Zotlabs/Module/Blocks.php:73
-#: ../../Zotlabs/Module/Blocks.php:80 ../../Zotlabs/Module/Layouts.php:71
-#: ../../Zotlabs/Module/Layouts.php:78 ../../Zotlabs/Module/Layouts.php:89
-#: ../../Zotlabs/Module/Rate.php:113
-#: ../../Zotlabs/Module/Profile_photo.php:274
-#: ../../Zotlabs/Module/Profile_photo.php:287
-#: ../../Zotlabs/Module/Events.php:271 ../../Zotlabs/Module/Common.php:39
-#: ../../Zotlabs/Module/Channel.php:107 ../../Zotlabs/Module/Channel.php:237
-#: ../../Zotlabs/Module/Channel.php:277 ../../Zotlabs/Module/Regmod.php:21
-#: ../../Zotlabs/Module/Pdledit.php:29 ../../Zotlabs/Module/Message.php:18
-#: ../../Zotlabs/Module/Service_limits.php:11
-#: ../../Zotlabs/Module/Webpages.php:116
-#: ../../Zotlabs/Module/Sharedwithme.php:11 ../../Zotlabs/Module/Wiki.php:49
-#: ../../Zotlabs/Module/Wiki.php:214 ../../Zotlabs/Module/Wiki.php:313
-#: ../../Zotlabs/Module/Wiki.php:318 ../../Zotlabs/Module/Sources.php:74
-#: ../../Zotlabs/Module/Suggest.php:30 ../../Zotlabs/Module/Thing.php:274
-#: ../../Zotlabs/Module/Thing.php:294 ../../Zotlabs/Module/Thing.php:335
-#: ../../Zotlabs/Module/Mail.php:164
-#: ../../Zotlabs/Module/Viewconnections.php:28
-#: ../../Zotlabs/Module/Viewconnections.php:33
-#: ../../Zotlabs/Module/Viewsrc.php:18 ../../Zotlabs/Module/Chat.php:100
-#: ../../Zotlabs/Module/Chat.php:105 ../../Zotlabs/Lib/Chatroom.php:137
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:55
-#: ../../extend/addon/addon/keepout/keepout.php:36
-#: ../../extend/addon/addon/pumpio/pumpio.php:40
-#: ../../extend/addon/addon/openid/Mod_Id.php:53
-#: ../../extend/addon/addon/diaspora_reconnect/diaspora_reconnect.php:58
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:194
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:291
-#: ../../include/attach.php:144 ../../include/attach.php:191
-#: ../../include/attach.php:255 ../../include/attach.php:269
-#: ../../include/attach.php:276 ../../include/attach.php:343
-#: ../../include/attach.php:357 ../../include/attach.php:364
-#: ../../include/attach.php:441 ../../include/attach.php:908
-#: ../../include/attach.php:979 ../../include/attach.php:1137
-#: ../../include/photos.php:27 ../../include/items.php:3445
-msgid "Permission denied."
-msgstr "Berechtigung verweigert."
+#: ../../Zotlabs/Module/Invite.php:139
+msgid "Please join my community on $Projectname."
+msgstr "Schließe Dich uns auf $Projectname an!"
-#: ../../Zotlabs/Web/Router.php:152 ../../Zotlabs/Module/Display.php:124
-#: ../../Zotlabs/Module/Page.php:94 ../../Zotlabs/Module/Block.php:79
-#: ../../Zotlabs/Lib/NativeWikiPage.php:502 ../../include/help.php:66
-msgid "Page not found."
-msgstr "Seite nicht gefunden."
+#: ../../Zotlabs/Module/Invite.php:141
+msgid "You will need to supply this invitation code:"
+msgstr "Bitte verwende bei der Registrierung den folgenden Einladungscode:"
-#: ../../Zotlabs/Zot/Auth.php:138
+#: ../../Zotlabs/Module/Invite.php:142
msgid ""
-"Remote authentication blocked. You are logged into this site locally. Please"
-" logout and retry."
-msgstr "Fern-Authentifizierung blockiert. Du bist lokal auf diesem Server angemeldet. Bitte melde Dich ab und versuche es erneut."
+"1. Register at any $Projectname location (they are all inter-connected)"
+msgstr "1. Registriere Dich auf einem beliebigen $Projectname-Hub (sie sind alle miteinander verbunden)"
-#: ../../Zotlabs/Zot/Auth.php:250
-#: ../../extend/addon/addon/openid/Mod_Openid.php:76
-#: ../../extend/addon/addon/openid/Mod_Openid.php:178
-#, php-format
-msgid "Welcome %s. Remote authentication successful."
-msgstr "Willkommen %s. Entfernte Authentifizierung erfolgreich."
+#: ../../Zotlabs/Module/Invite.php:144
+msgid "2. Enter my $Projectname network address into the site searchbar."
+msgstr "2. Gib meine $Projectname-Adresse im Suchfeld ein."
-#: ../../Zotlabs/Module/Achievements.php:15
-#: ../../Zotlabs/Module/Connect.php:17 ../../Zotlabs/Module/Editblock.php:31
-#: ../../Zotlabs/Module/Editlayout.php:31
-#: ../../Zotlabs/Module/Editwebpage.php:32
-#: ../../Zotlabs/Module/Filestorage.php:59 ../../Zotlabs/Module/Hcard.php:12
-#: ../../Zotlabs/Module/Profile.php:20 ../../Zotlabs/Module/Blocks.php:33
-#: ../../Zotlabs/Module/Layouts.php:31 ../../Zotlabs/Module/Webpages.php:33
-#: ../../include/channel.php:945
-msgid "Requested profile is not available."
-msgstr "Das angefragte Profil ist nicht verfügbar."
+#: ../../Zotlabs/Module/Invite.php:145
+msgid "or visit"
+msgstr "oder besuche"
-#: ../../Zotlabs/Module/Achievements.php:38
-msgid "Some blurb about what to do when you're new here"
-msgstr "Ein Hinweis, was man tun kann, wenn man neu hier ist"
+#: ../../Zotlabs/Module/Invite.php:147
+msgid "3. Click [Connect]"
+msgstr "3. Klicke auf [Verbinden]"
-#: ../../Zotlabs/Module/Display.php:17 ../../Zotlabs/Module/Photos.php:508
-#: ../../Zotlabs/Module/Search.php:17 ../../Zotlabs/Module/Ratings.php:83
-#: ../../Zotlabs/Module/Directory.php:64
-#: ../../Zotlabs/Module/Viewconnections.php:23
-#: ../../extend/addon/addon/friendica/dfrn_request.php:794
-msgid "Public access denied."
-msgstr "Öffentlichen Zugriff verweigert."
+#: ../../Zotlabs/Module/Invite.php:149 ../../Zotlabs/Module/Locs.php:121
+#: ../../Zotlabs/Module/Mitem.php:243 ../../Zotlabs/Module/Events.php:493
+#: ../../Zotlabs/Module/Appman.php:134
+#: ../../Zotlabs/Module/Import_items.php:129
+#: ../../Zotlabs/Module/Setup.php:309 ../../Zotlabs/Module/Setup.php:357
+#: ../../Zotlabs/Module/Connect.php:98
+#: ../../Zotlabs/Module/Admin/Features.php:66
+#: ../../Zotlabs/Module/Admin/Plugins.php:438
+#: ../../Zotlabs/Module/Admin/Accounts.php:166
+#: ../../Zotlabs/Module/Admin/Logs.php:84
+#: ../../Zotlabs/Module/Admin/Channels.php:147
+#: ../../Zotlabs/Module/Admin/Themes.php:158
+#: ../../Zotlabs/Module/Admin/Site.php:279
+#: ../../Zotlabs/Module/Admin/Profs.php:157
+#: ../../Zotlabs/Module/Admin/Account_edit.php:74
+#: ../../Zotlabs/Module/Admin/Security.php:104
+#: ../../Zotlabs/Module/Settings/Permcats.php:110
+#: ../../Zotlabs/Module/Settings/Channel.php:476
+#: ../../Zotlabs/Module/Settings/Features.php:47
+#: ../../Zotlabs/Module/Settings/Tokens.php:168
+#: ../../Zotlabs/Module/Settings/Account.php:118
+#: ../../Zotlabs/Module/Settings/Featured.php:50
+#: ../../Zotlabs/Module/Settings/Display.php:203
+#: ../../Zotlabs/Module/Settings/Oauth.php:87
+#: ../../Zotlabs/Module/Thing.php:320 ../../Zotlabs/Module/Thing.php:370
+#: ../../Zotlabs/Module/Import.php:514 ../../Zotlabs/Module/Cal.php:343
+#: ../../Zotlabs/Module/Mood.php:139 ../../Zotlabs/Module/Photos.php:657
+#: ../../Zotlabs/Module/Photos.php:1022 ../../Zotlabs/Module/Photos.php:1062
+#: ../../Zotlabs/Module/Photos.php:1180 ../../Zotlabs/Module/Wiki.php:169
+#: ../../Zotlabs/Module/Pdledit.php:74 ../../Zotlabs/Module/Poke.php:186
+#: ../../Zotlabs/Module/Connedit.php:882 ../../Zotlabs/Module/Chat.php:194
+#: ../../Zotlabs/Module/Chat.php:240 ../../Zotlabs/Module/Pconfig.php:107
+#: ../../Zotlabs/Module/Group.php:85 ../../Zotlabs/Module/Profiles.php:726
+#: ../../Zotlabs/Module/Sources.php:114 ../../Zotlabs/Module/Sources.php:149
+#: ../../Zotlabs/Module/Xchan.php:15 ../../Zotlabs/Module/Mail.php:449
+#: ../../Zotlabs/Module/Filestorage.php:165 ../../Zotlabs/Module/Rate.php:166
+#: ../../Zotlabs/Lib/ThreadItem.php:732
+#: ../../Zotlabs/Widget/Eventstools.php:16
+#: ../../view/theme/redbasic/php/config.php:84
+#: ../../addon/skeleton/skeleton.php:65 ../../addon/gnusoc/gnusoc.php:134
+#: ../../addon/cdav/cdav.php:246 ../../addon/planets/planets.php:157
+#: ../../addon/openclipatar/openclipatar.php:53
+#: ../../addon/wppost/wppost.php:113 ../../addon/nsfw/nsfw.php:92
+#: ../../addon/ijpost/ijpost.php:89 ../../addon/dwpost/dwpost.php:89
+#: ../../addon/mailhost/mailhost.php:40
+#: ../../addon/likebanner/likebanner.php:57
+#: ../../addon/redphotos/redphotos.php:136 ../../addon/irc/irc.php:53
+#: ../../addon/ljpost/ljpost.php:86 ../../addon/startpage/startpage.php:113
+#: ../../addon/diaspora/diaspora.php:712
+#: ../../addon/gitwiki/Mod_Gitwiki.php:155
+#: ../../addon/rainbowtag/rainbowtag.php:85 ../../addon/visage/visage.php:170
+#: ../../addon/nsabait/nsabait.php:161 ../../addon/mailtest/mailtest.php:100
+#: ../../addon/openstreetmap/openstreetmap.php:168
+#: ../../addon/rtof/rtof.php:101 ../../addon/jappixmini/jappixmini.php:371
+#: ../../addon/superblock/superblock.php:120 ../../addon/nofed/nofed.php:80
+#: ../../addon/redred/redred.php:119 ../../addon/logrot/logrot.php:35
+#: ../../addon/frphotos/frphotos.php:96 ../../addon/chords/Mod_Chords.php:60
+#: ../../addon/libertree/libertree.php:85
+#: ../../addon/flattrwidget/flattrwidget.php:124
+#: ../../addon/statusnet/statusnet.php:322
+#: ../../addon/statusnet/statusnet.php:380
+#: ../../addon/statusnet/statusnet.php:432
+#: ../../addon/statusnet/statusnet.php:899 ../../addon/twitter/twitter.php:217
+#: ../../addon/twitter/twitter.php:259
+#: ../../addon/smileybutton/smileybutton.php:281
+#: ../../addon/piwik/piwik.php:95 ../../addon/pageheader/pageheader.php:48
+#: ../../addon/xmpp/xmpp.php:69 ../../addon/pumpio/pumpio.php:237
+#: ../../addon/redfiles/redfiles.php:124 ../../addon/hubwall/hubwall.php:95
+#: ../../include/js_strings.php:22
+msgid "Submit"
+msgstr "Absenden"
-#: ../../Zotlabs/Module/Display.php:38 ../../Zotlabs/Module/Admin.php:60
-#: ../../Zotlabs/Module/Admin/Themes.php:69
-#: ../../Zotlabs/Module/Admin/Plugins.php:254
-#: ../../Zotlabs/Module/Filestorage.php:32 ../../Zotlabs/Module/Thing.php:89
-#: ../../Zotlabs/Module/Viewsrc.php:24 ../../include/items.php:3366
-msgid "Item not found."
-msgstr "Element nicht gefunden."
+#: ../../Zotlabs/Module/Editlayout.php:79
+#: ../../Zotlabs/Module/Editblock.php:79 ../../Zotlabs/Module/Editblock.php:95
+#: ../../Zotlabs/Module/Editwebpage.php:80
+#: ../../Zotlabs/Module/Editpost.php:24
+msgid "Item not found"
+msgstr "Element nicht gefunden"
-#: ../../Zotlabs/Module/Register.php:49
-msgid "Maximum daily site registrations exceeded. Please try again tomorrow."
-msgstr "Maximale Anzahl täglicher Neuanmeldungen erreicht. Bitte versuche es morgen noch einmal."
+#: ../../Zotlabs/Module/Editlayout.php:128
+#: ../../Zotlabs/Module/Layouts.php:129 ../../Zotlabs/Module/Layouts.php:189
+msgid "Layout Name"
+msgstr "Layout-Name"
-#: ../../Zotlabs/Module/Register.php:55
-msgid ""
-"Please indicate acceptance of the Terms of Service. Registration failed."
-msgstr "Bitte stimme den Nutzungsbedingungen zu. Registrierung fehlgeschlagen."
+#: ../../Zotlabs/Module/Editlayout.php:129
+#: ../../Zotlabs/Module/Layouts.php:132
+msgid "Layout Description (Optional)"
+msgstr "Layout-Beschreibung (optional)"
-#: ../../Zotlabs/Module/Register.php:89
-msgid "Passwords do not match."
-msgstr "Passwörter stimmen nicht überein."
+#: ../../Zotlabs/Module/Editlayout.php:137
+msgid "Edit Layout"
+msgstr "Layout bearbeiten"
-#: ../../Zotlabs/Module/Register.php:131
-msgid ""
-"Registration successful. Please check your email for validation "
-"instructions."
-msgstr "Registrierung erfolgreich. Eine E-Mail mit weiteren Anweisungen wurde an Dich gesendet."
+#: ../../Zotlabs/Module/Profperm.php:28 ../../Zotlabs/Module/Subthread.php:62
+#: ../../Zotlabs/Module/Import_items.php:120 ../../Zotlabs/Module/Group.php:72
+#: ../../Zotlabs/Module/Dreport.php:10 ../../Zotlabs/Module/Dreport.php:68
+#: ../../Zotlabs/Module/Like.php:283 ../../Zotlabs/Web/WebServer.php:130
+#: ../../addon/redphotos/redphotos.php:119
+#: ../../addon/frphotos/frphotos.php:81 ../../addon/redfiles/redfiles.php:109
+#: ../../include/items.php:327
+msgid "Permission denied"
+msgstr "Keine Berechtigung"
-#: ../../Zotlabs/Module/Register.php:137
-msgid "Your registration is pending approval by the site owner."
-msgstr "Deine Registrierung muss noch vom Betreiber der Seite freigegeben werden."
+#: ../../Zotlabs/Module/Profperm.php:34 ../../Zotlabs/Module/Profperm.php:63
+msgid "Invalid profile identifier."
+msgstr "Ungültiger Profil-Identifikator"
-#: ../../Zotlabs/Module/Register.php:140
-msgid "Your registration can not be processed."
-msgstr "Deine Registrierung konnte nicht verarbeitet werden."
+#: ../../Zotlabs/Module/Profperm.php:111
+msgid "Profile Visibility Editor"
+msgstr "Profil-Sichtbarkeits-Editor"
-#: ../../Zotlabs/Module/Register.php:184
-msgid "Registration on this hub is disabled."
-msgstr "Die Registrierung auf diesem Hub ist nicht möglich."
+#: ../../Zotlabs/Module/Profperm.php:113 ../../include/channel.php:1362
+msgid "Profile"
+msgstr "Profil"
-#: ../../Zotlabs/Module/Register.php:193
-msgid "Registration on this hub is by approval only."
-msgstr "Eine Registrierung auf diesem Hub erfordert die Zustimmung durch den Administrator."
+#: ../../Zotlabs/Module/Profperm.php:115
+msgid "Click on a contact to add or remove."
+msgstr "Klicke auf einen Kontakt, um ihn hinzuzufügen oder zu entfernen."
-#: ../../Zotlabs/Module/Register.php:194
-msgid "<a href=\"pubsites\">Register at another affiliated hub.</a>"
-msgstr "<a href=\"pubsites\">Registriere Dich auf einem der anderen verbundenen Hubs.</a>"
+#: ../../Zotlabs/Module/Profperm.php:124
+msgid "Visible To"
+msgstr "Sichtbar für"
-#: ../../Zotlabs/Module/Register.php:204
-msgid ""
-"This site has exceeded the number of allowed daily account registrations. "
-"Please try again tomorrow."
-msgstr "Die maximale Anzahl täglicher Registrierungen auf diesem Server wurde überschritten. Bitte versuche es morgen noch einmal."
+#: ../../Zotlabs/Module/Profperm.php:140
+#: ../../Zotlabs/Module/Connections.php:141
+msgid "All Connections"
+msgstr "Alle Verbindungen"
-#: ../../Zotlabs/Module/Register.php:221 ../../Zotlabs/Module/Siteinfo.php:27
-msgid "Terms of Service"
-msgstr "Nutzungsbedingungen"
+#: ../../Zotlabs/Module/Regdir.php:49 ../../Zotlabs/Module/Dirsearch.php:25
+msgid "This site is not a directory server"
+msgstr "Diese Webseite ist kein Verzeichnisserver"
-#: ../../Zotlabs/Module/Register.php:227
-#, php-format
-msgid "I accept the %s for this website"
-msgstr "Ich akzeptiere die %s für diese Webseite"
+#: ../../Zotlabs/Module/Channel.php:32 ../../Zotlabs/Module/Chat.php:25
+#: ../../addon/gitwiki/Mod_Gitwiki.php:28 ../../addon/chess/chess.php:403
+msgid "You must be logged in to see this page."
+msgstr "Du musst angemeldet sein, um diese Seite betrachten zu können."
-#: ../../Zotlabs/Module/Register.php:229
-#, php-format
-msgid "I am over 13 years of age and accept the %s for this website"
-msgstr "Ich bin älter als 13 Jahre und akzeptiere die %s dieser Webseite"
+#: ../../Zotlabs/Module/Channel.php:47 ../../Zotlabs/Module/Hcard.php:35
+#: ../../Zotlabs/Module/Profile.php:43
+msgid "Posts and comments"
+msgstr "Beiträge und Kommentare"
-#: ../../Zotlabs/Module/Register.php:233
-msgid "Your email address"
-msgstr "Ihre E-Mail Adresse"
+#: ../../Zotlabs/Module/Channel.php:54 ../../Zotlabs/Module/Hcard.php:42
+#: ../../Zotlabs/Module/Profile.php:50
+msgid "Only posts"
+msgstr "Nur Beiträge"
-#: ../../Zotlabs/Module/Register.php:234
-msgid "Choose a password"
-msgstr "Passwort"
+#: ../../Zotlabs/Module/Channel.php:112
+msgid "Insufficient permissions. Request redirected to profile page."
+msgstr "Unzureichende Zugriffsrechte. Die Anfrage wurde zur Profil-Seite umgeleitet."
-#: ../../Zotlabs/Module/Register.php:235
-msgid "Please re-enter your password"
-msgstr "Bitte gib Dein Passwort noch einmal ein"
+#: ../../Zotlabs/Module/Uexport.php:57 ../../Zotlabs/Module/Uexport.php:58
+msgid "Export Channel"
+msgstr "Kanal exportieren"
-#: ../../Zotlabs/Module/Register.php:236
-msgid "Please enter your invitation code"
-msgstr "Bitte trage Deinen Einladungs-Code ein"
+#: ../../Zotlabs/Module/Uexport.php:59
+msgid ""
+"Export your basic channel information to a file. This acts as a backup of "
+"your connections, permissions, profile and basic data, which can be used to "
+"import your data to a new server hub, but does not contain your content."
+msgstr "Exportiert die grundlegenden Kanal-Informationen in eine kleine Datei. Diese stellt eine Sicherung Deiner Verbindungen, Berechtigungen, Profile und Basisdaten bereit, die für den Import auf einem anderen Hub verwendet werden kann, aber nicht die Beiträge Deines Kanals enthält."
-#: ../../Zotlabs/Module/Register.php:237
-#: ../../Zotlabs/Module/New_channel.php:134
-msgid "Name or caption"
-msgstr "Name oder Titel"
+#: ../../Zotlabs/Module/Uexport.php:60
+msgid "Export Content"
+msgstr "Kanal und Inhalte exportieren"
-#: ../../Zotlabs/Module/Register.php:237
-#: ../../Zotlabs/Module/New_channel.php:134
-msgid "Examples: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \"Aviation Group\""
-msgstr "Beispiele: „Horst Weidinger“, „Lisa und ihr Meerschweinchen“, „Fußball“, „Segelflieger-Forum“ "
+#: ../../Zotlabs/Module/Uexport.php:61
+msgid ""
+"Export your channel information and recent content to a JSON backup that can"
+" be restored or imported to another server hub. This backs up all of your "
+"connections, permissions, profile data and several months of posts. This "
+"file may be VERY large. Please be patient - it may take several minutes for"
+" this download to begin."
+msgstr "Exportiert Deine Kanal-Informationen sowie alle zugehörigen Inhalte in eine JSON-Sicherungsdatei. Die sichert alle Verbindungen, Berechtigungen, Profildaten und Deine Beiträge aus mehreren Monaten. Diese Datei kann SEHR groß werden! Bitte habe ein wenig Geduld – es kann mehrere Minuten dauern, bis der Download startet."
-#: ../../Zotlabs/Module/Register.php:239
-#: ../../Zotlabs/Module/New_channel.php:136
-msgid "Choose a short nickname"
-msgstr "Wähle einen kurzen Spitznamen"
+#: ../../Zotlabs/Module/Uexport.php:63
+msgid "Export your posts from a given year."
+msgstr "Exportiert die Beiträge des angegebenen Jahres."
-#: ../../Zotlabs/Module/Register.php:239
-#: ../../Zotlabs/Module/New_channel.php:136
+#: ../../Zotlabs/Module/Uexport.php:65
+msgid ""
+"You may also export your posts and conversations for a particular year or "
+"month. Adjust the date in your browser location bar to select other dates. "
+"If the export fails (possibly due to memory exhaustion on your server hub), "
+"please try again selecting a more limited date range."
+msgstr "Du kannst auch die Beiträge und Konversationen eines bestimmten Jahres oder Monats exportieren. Ändere das Datum in der Adresszeile Deines Browsers, um andere Zeiträume zu wählen. Falls der Export fehlschlägt (vermutlich, weil auf diesem Hub nicht genügend Speicher zur Verfügung steht), versuche es noch einmal mit einer kleineren Zeitspanne."
+
+#: ../../Zotlabs/Module/Uexport.php:66
#, php-format
msgid ""
-"Your nickname will be used to create an easy to remember channel address "
-"e.g. nickname%s"
-msgstr "Dein Spitzname wird verwendet, um eine leicht zu merkende Kanal-Adresse (ähnlich einer E-Mail-Adresse) zu erzeugen, die Du mit anderen austauschen kannst, z.B. nickname%s"
+"To select all posts for a given year, such as this year, visit <a "
+"href=\"%1$s\">%2$s</a>"
+msgstr "Um alle Beiträge eines bestimmten Jahres, zum Beispiel dieses Jahres, auszuwählen, klicke <a href=\"%1$s\">%2$s</a>."
-#: ../../Zotlabs/Module/Register.php:240
-#: ../../Zotlabs/Module/New_channel.php:137
-msgid "Channel role and privacy"
-msgstr "Kanaltyp und Privatspäre-Einstellungen"
+#: ../../Zotlabs/Module/Uexport.php:67
+#, php-format
+msgid ""
+"To select all posts for a given month, such as January of this year, visit "
+"<a href=\"%1$s\">%2$s</a>"
+msgstr "Um alle Beiträge eines bestimmten Monats auszuwählen, zum Beispiel vom Januar diesen Jahres, klicke <a href=\"%1$s\">%2$s</a>."
-#: ../../Zotlabs/Module/Register.php:240
-#: ../../Zotlabs/Module/New_channel.php:137
-msgid "Select a channel role with your privacy requirements."
-msgstr "Wähle einen passenden Kanaltyp mit den zugehörigen Voreinstellungen zur Privatsphäre."
+#: ../../Zotlabs/Module/Uexport.php:68
+#, php-format
+msgid ""
+"These content files may be imported or restored by visiting <a "
+"href=\"%1$s\">%2$s</a> on any site containing your channel. For best results"
+" please import or restore these in date order (oldest first)."
+msgstr "Diese Inhalts-Sicherungen können wiederhergestellt werden, indem Du <a href=\"%1$s\">%2$s</a> auf jeglichem Hub besuchst, der diesen Kanal enthält. Das funktioniert am besten, wenn Du dabei die zeitliche Reihenfolge einhältst, also die Sicherungen für den ältesten Zeitraum zuerst importierst."
-#: ../../Zotlabs/Module/Register.php:240
-#: ../../Zotlabs/Module/New_channel.php:137
-msgid "Read more about roles"
-msgstr "Mehr Informationen über Rollen"
+#: ../../Zotlabs/Module/Search.php:17 ../../Zotlabs/Module/Photos.php:490
+#: ../../Zotlabs/Module/Ratings.php:83 ../../Zotlabs/Module/Directory.php:63
+#: ../../Zotlabs/Module/Display.php:22
+#: ../../Zotlabs/Module/Viewconnections.php:23
+msgid "Public access denied."
+msgstr "Öffentlichen Zugriff verweigert."
-#: ../../Zotlabs/Module/Register.php:241
-msgid "no"
-msgstr "nein"
+#: ../../Zotlabs/Module/Search.php:44 ../../Zotlabs/Module/Connections.php:312
+#: ../../Zotlabs/Lib/Apps.php:237 ../../Zotlabs/Widget/Sitesearch.php:31
+#: ../../include/text.php:1027 ../../include/text.php:1039
+#: ../../include/acl_selectors.php:213 ../../include/nav.php:164
+msgid "Search"
+msgstr "Suche"
-#: ../../Zotlabs/Module/Register.php:241
-msgid "yes"
-msgstr "ja"
+#: ../../Zotlabs/Module/Search.php:224
+#, php-format
+msgid "Items tagged with: %s"
+msgstr "Beiträge mit Schlagwort: %s"
-#: ../../Zotlabs/Module/Register.php:253
-#: ../../Zotlabs/Module/Admin/Site.php:261
-msgid "Registration"
-msgstr "Registrierung"
+#: ../../Zotlabs/Module/Search.php:226
+#, php-format
+msgid "Search results for: %s"
+msgstr "Suchergebnisse für: %s"
-#: ../../Zotlabs/Module/Register.php:258
-msgid "Membership on this site is by invitation only."
-msgstr "Mitgliedschaft auf dieser Seite ist nur nach vorheriger Einladung möglich."
+#: ../../Zotlabs/Module/Locs.php:25 ../../Zotlabs/Module/Locs.php:54
+msgid "Location not found."
+msgstr "Klon nicht gefunden."
-#: ../../Zotlabs/Module/Register.php:270 ../../include/nav.php:162
-#: ../../boot.php:1713
-msgid "Register"
-msgstr "Registrieren"
+#: ../../Zotlabs/Module/Locs.php:62
+msgid "Location lookup failed."
+msgstr "Nachschlagen des Kanal-Ortes fehlgeschlagen"
-#: ../../Zotlabs/Module/Register.php:271
+#: ../../Zotlabs/Module/Locs.php:66
msgid ""
-"This site may require email verification after submitting this form. If you "
-"are returned to a login page, please check your email for instructions."
-msgstr "Diese Seite verlangt möglicherweise eine Emailbestätigung nach dem Absenden des Formulars. Wenn Du auf eine Login-Seite zurückgeleitet wirst, prüfe bitte Deinen Posteingang auf neue Mails mit entsprechenden Hinweisen."
+"Please select another location to become primary before removing the primary"
+" location."
+msgstr "Bitte mache einen anderen Kanal-Ort zum primären Ort, bevor Du den primären Ort löschst."
-#: ../../Zotlabs/Module/Probe.php:28 ../../Zotlabs/Module/Probe.php:32
-#, php-format
-msgid "Fetching URL returns error: %1$s"
-msgstr "Abrufen der URL gab einen Fehler zurück: %1$s"
+#: ../../Zotlabs/Module/Locs.php:95
+msgid "Syncing locations"
+msgstr "Synchronisiere Klone"
-#: ../../Zotlabs/Module/Photos.php:82
-msgid "Page owner information could not be retrieved."
-msgstr "Informationen über den Besitzer der Seite konnten nicht gefunden werden."
+#: ../../Zotlabs/Module/Locs.php:105
+msgid "No locations found."
+msgstr "Keine Klon-Adressen gefunden."
-#: ../../Zotlabs/Module/Photos.php:97 ../../Zotlabs/Module/Photos.php:729
-#: ../../Zotlabs/Module/Profile_photo.php:115
-#: ../../Zotlabs/Module/Profile_photo.php:220
-#: ../../include/photo/photo_driver.php:730
-msgid "Profile Photos"
-msgstr "Profilfotos"
+#: ../../Zotlabs/Module/Locs.php:116
+msgid "Manage Channel Locations"
+msgstr "Klon-Adressen verwalten"
-#: ../../Zotlabs/Module/Photos.php:103 ../../Zotlabs/Module/Photos.php:129
-msgid "Album not found."
-msgstr "Album nicht gefunden."
+#: ../../Zotlabs/Module/Locs.php:117 ../../Zotlabs/Module/Events.php:475
+#: ../../Zotlabs/Module/Profiles.php:509 ../../Zotlabs/Module/Profiles.php:737
+#: ../../Zotlabs/Module/Pubsites.php:51 ../../addon/cdav/Mod_Cdav.php:839
+#: ../../include/js_strings.php:25
+msgid "Location"
+msgstr "Ort"
-#: ../../Zotlabs/Module/Photos.php:112
-msgid "Delete Album"
-msgstr "Album löschen"
+#: ../../Zotlabs/Module/Locs.php:118
+#: ../../Zotlabs/Module/Admin/Channels.php:160
+#: ../../Zotlabs/Module/Connedit.php:909 ../../Zotlabs/Module/Profiles.php:502
+#: ../../Zotlabs/Module/Profiles.php:793 ../../addon/cdav/Mod_Cdav.php:1143
+msgid "Address"
+msgstr "Adresse"
+
+#: ../../Zotlabs/Module/Locs.php:119
+msgid "Primary"
+msgstr "Primär"
+
+#: ../../Zotlabs/Module/Locs.php:120 ../../Zotlabs/Module/Menu.php:113
+msgid "Drop"
+msgstr "Löschen"
+
+#: ../../Zotlabs/Module/Locs.php:122
+msgid "Sync Now"
+msgstr "Jetzt synchronisieren"
+
+#: ../../Zotlabs/Module/Locs.php:123
+msgid "Please wait several minutes between consecutive operations."
+msgstr "Bitte warte mehrere Minuten zwischen dem Ausführen zweier Operationen!"
-#: ../../Zotlabs/Module/Photos.php:133
+#: ../../Zotlabs/Module/Locs.php:124
msgid ""
-"Multiple storage folders exist with this album name, but within different "
-"directories. Please remove the desired folder or folders using the Files "
-"manager"
-msgstr "Mehrere Speicherordner mit diesem Albumnamen sind bereits vorhanden, aber in verschiedenen Verzeichnissen. Bitte entfernen Sie den oder die gewünschten Ordner mit dem Dateimanager"
+"When possible, drop a location by logging into that website/hub and removing"
+" your channel."
+msgstr "Wenn möglich, lösche einen Klon, indem Du Dich auf dem jeweiligen Hub einloggst und den Kanal dort löschst."
-#: ../../Zotlabs/Module/Photos.php:190 ../../Zotlabs/Module/Photos.php:1054
-msgid "Delete Photo"
-msgstr "Foto löschen"
+#: ../../Zotlabs/Module/Locs.php:125
+msgid "Use this form to drop the location if the hub is no longer operating."
+msgstr "Benutze dieses Formular zum Löschen eines Klons, wenn es den Hub nicht mehr gibt."
-#: ../../Zotlabs/Module/Photos.php:519
-msgid "No photos selected"
-msgstr "Keine Fotos ausgewählt"
+#: ../../Zotlabs/Module/Mitem.php:28 ../../Zotlabs/Module/Menu.php:144
+msgid "Menu not found."
+msgstr "Menü nicht gefunden"
-#: ../../Zotlabs/Module/Photos.php:568
-msgid "Access to this item is restricted."
-msgstr "Der Zugriff auf dieses Foto ist eingeschränkt."
+#: ../../Zotlabs/Module/Mitem.php:52
+msgid "Unable to create element."
+msgstr "Element konnte nicht erstellt werden."
-#: ../../Zotlabs/Module/Photos.php:607
-#, php-format
-msgid "%1$.2f MB of %2$.2f MB photo storage used."
-msgstr "%1$.2f MB von %2$.2f MB Foto-Speicher belegt."
+#: ../../Zotlabs/Module/Mitem.php:76
+msgid "Unable to update menu element."
+msgstr "Kann Menü-Element nicht aktualisieren."
-#: ../../Zotlabs/Module/Photos.php:610
-#, php-format
-msgid "%1$.2f MB photo storage used."
-msgstr "%1$.2f MB Foto-Speicher belegt."
+#: ../../Zotlabs/Module/Mitem.php:92
+msgid "Unable to add menu element."
+msgstr "Kann Menü-Bestandteil nicht hinzufügen."
-#: ../../Zotlabs/Module/Photos.php:646
-msgid "Upload Photos"
-msgstr "Fotos hochladen"
+#: ../../Zotlabs/Module/Mitem.php:120 ../../Zotlabs/Module/Menu.php:166
+#: ../../Zotlabs/Module/Xchan.php:41
+msgid "Not found."
+msgstr "Nicht gefunden."
-#: ../../Zotlabs/Module/Photos.php:650
-msgid "Enter an album name"
-msgstr "Namen für ein neues Album eingeben"
+#: ../../Zotlabs/Module/Mitem.php:153 ../../Zotlabs/Module/Mitem.php:230
+msgid "Menu Item Permissions"
+msgstr "Zugriffsrechte des Menü-Elements"
-#: ../../Zotlabs/Module/Photos.php:651
-msgid "or select an existing album (doubleclick)"
-msgstr "oder ein bereits vorhandenes auswählen (Doppelklick)"
+#: ../../Zotlabs/Module/Mitem.php:154 ../../Zotlabs/Module/Mitem.php:231
+#: ../../Zotlabs/Module/Settings/Channel.php:510
+msgid "(click to open/close)"
+msgstr "(zum öffnen/schließen anklicken)"
-#: ../../Zotlabs/Module/Photos.php:652
-msgid "Create a status post for this upload"
-msgstr "Einen Statusbeitrag für diesen Upload erzeugen"
+#: ../../Zotlabs/Module/Mitem.php:160 ../../Zotlabs/Module/Mitem.php:176
+msgid "Link Name"
+msgstr "Name des Links"
-#: ../../Zotlabs/Module/Photos.php:652 ../../Zotlabs/Module/Admin/Site.php:218
-#: ../../Zotlabs/Module/Menu.php:100 ../../Zotlabs/Module/Menu.php:157
-#: ../../Zotlabs/Module/Connedit.php:402 ../../Zotlabs/Module/Connedit.php:740
-#: ../../Zotlabs/Module/Filestorage.php:160
-#: ../../Zotlabs/Module/Filestorage.php:168 ../../Zotlabs/Module/Mitem.php:162
-#: ../../Zotlabs/Module/Mitem.php:163 ../../Zotlabs/Module/Mitem.php:240
-#: ../../Zotlabs/Module/Mitem.php:241 ../../Zotlabs/Module/Profiles.php:682
-#: ../../Zotlabs/Module/Api.php:97 ../../Zotlabs/Module/Events.php:470
-#: ../../Zotlabs/Module/Events.php:471 ../../Zotlabs/Module/Removeme.php:63
-#: ../../Zotlabs/Module/Wiki.php:178
+#: ../../Zotlabs/Module/Mitem.php:161 ../../Zotlabs/Module/Mitem.php:239
+msgid "Link or Submenu Target"
+msgstr "Ziel des Links oder Untermenüs"
+
+#: ../../Zotlabs/Module/Mitem.php:161
+msgid "Enter URL of the link or select a menu name to create a submenu"
+msgstr "URL des Links eingeben oder Menünamen wählen, um ein Untermenü anzulegen."
+
+#: ../../Zotlabs/Module/Mitem.php:162 ../../Zotlabs/Module/Mitem.php:240
+msgid "Use magic-auth if available"
+msgstr "Magic-Auth verwenden, falls verfügbar"
+
+#: ../../Zotlabs/Module/Mitem.php:162 ../../Zotlabs/Module/Mitem.php:163
+#: ../../Zotlabs/Module/Mitem.php:240 ../../Zotlabs/Module/Mitem.php:241
+#: ../../Zotlabs/Module/Events.php:470 ../../Zotlabs/Module/Events.php:471
+#: ../../Zotlabs/Module/Removeme.php:63
+#: ../../Zotlabs/Module/Admin/Site.php:237
#: ../../Zotlabs/Module/Settings/Channel.php:294
#: ../../Zotlabs/Module/Settings/Display.php:103
-#: ../../extend/addon/addon/dwpost/dwpost.php:73
-#: ../../extend/addon/addon/dwpost/dwpost.php:85
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:120
-#: ../../extend/addon/addon/friendica/dfrn_request.php:865
-#: ../../extend/addon/addon/ijpost/ijpost.php:73
-#: ../../extend/addon/addon/ijpost/ijpost.php:85
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:309
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:313
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:343
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:351
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:355
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:359
-#: ../../extend/addon/addon/libertree/libertree.php:69
-#: ../../extend/addon/addon/libertree/libertree.php:81
-#: ../../extend/addon/addon/ljpost/ljpost.php:70
-#: ../../extend/addon/addon/ljpost/ljpost.php:82
-#: ../../extend/addon/addon/nofed/nofed.php:72
-#: ../../extend/addon/addon/nofed/nofed.php:76
-#: ../../extend/addon/addon/nsabait/nsabait.php:157
-#: ../../extend/addon/addon/nsfw/nsfw.php:84
-#: ../../extend/addon/addon/planets/planets.php:153
-#: ../../extend/addon/addon/pumpio/pumpio.php:219
-#: ../../extend/addon/addon/pumpio/pumpio.php:223
-#: ../../extend/addon/addon/pumpio/pumpio.php:227
-#: ../../extend/addon/addon/pumpio/pumpio.php:231
-#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:81
-#: ../../extend/addon/addon/redred/redred.php:95
-#: ../../extend/addon/addon/redred/redred.php:99
-#: ../../extend/addon/addon/rtof/rtof.php:81
-#: ../../extend/addon/addon/rtof/rtof.php:85
-#: ../../extend/addon/addon/smileybutton/smileybutton.php:273
-#: ../../extend/addon/addon/smileybutton/smileybutton.php:277
-#: ../../extend/addon/addon/statusnet/statusnet.php:389
-#: ../../extend/addon/addon/statusnet/statusnet.php:411
-#: ../../extend/addon/addon/statusnet/statusnet.php:415
-#: ../../extend/addon/addon/statusnet/statusnet.php:424
-#: ../../extend/addon/addon/twitter/twitter.php:242
-#: ../../extend/addon/addon/twitter/twitter.php:246
-#: ../../extend/addon/addon/twitter/twitter.php:255
-#: ../../extend/addon/addon/visage/visage.php:166
-#: ../../extend/addon/addon/wppost/wppost.php:82
-#: ../../extend/addon/addon/wppost/wppost.php:105
-#: ../../extend/addon/addon/wppost/wppost.php:109
-#: ../../extend/addon/addon/xmpp/xmpp.php:53
-#: ../../extend/addon/addon/cdav/cdav.php:234
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:164
+#: ../../Zotlabs/Module/Api.php:97 ../../Zotlabs/Module/Photos.php:642
+#: ../../Zotlabs/Module/Wiki.php:180 ../../Zotlabs/Module/Connedit.php:392
+#: ../../Zotlabs/Module/Connedit.php:775 ../../Zotlabs/Module/Menu.php:100
+#: ../../Zotlabs/Module/Menu.php:157 ../../Zotlabs/Module/Profiles.php:681
+#: ../../Zotlabs/Module/Filestorage.php:160
+#: ../../Zotlabs/Module/Filestorage.php:168 ../../boot.php:1633
+#: ../../view/theme/redbasic/php/config.php:89
+#: ../../view/theme/redbasic/php/config.php:104 ../../addon/cdav/cdav.php:234
+#: ../../addon/planets/planets.php:153 ../../addon/wppost/wppost.php:82
+#: ../../addon/wppost/wppost.php:105 ../../addon/wppost/wppost.php:109
+#: ../../addon/nsfw/nsfw.php:84 ../../addon/ijpost/ijpost.php:73
+#: ../../addon/ijpost/ijpost.php:85 ../../addon/dwpost/dwpost.php:73
+#: ../../addon/dwpost/dwpost.php:85 ../../addon/ljpost/ljpost.php:70
+#: ../../addon/ljpost/ljpost.php:82 ../../addon/gitwiki/Mod_Gitwiki.php:166
+#: ../../addon/rainbowtag/rainbowtag.php:81 ../../addon/visage/visage.php:166
+#: ../../addon/nsabait/nsabait.php:157 ../../addon/rtof/rtof.php:81
+#: ../../addon/rtof/rtof.php:85 ../../addon/jappixmini/jappixmini.php:309
+#: ../../addon/jappixmini/jappixmini.php:313
+#: ../../addon/jappixmini/jappixmini.php:343
+#: ../../addon/jappixmini/jappixmini.php:351
+#: ../../addon/jappixmini/jappixmini.php:355
+#: ../../addon/jappixmini/jappixmini.php:359 ../../addon/nofed/nofed.php:72
+#: ../../addon/nofed/nofed.php:76 ../../addon/redred/redred.php:95
+#: ../../addon/redred/redred.php:99 ../../addon/libertree/libertree.php:69
+#: ../../addon/libertree/libertree.php:81
+#: ../../addon/flattrwidget/flattrwidget.php:120
+#: ../../addon/statusnet/statusnet.php:389
+#: ../../addon/statusnet/statusnet.php:411
+#: ../../addon/statusnet/statusnet.php:415
+#: ../../addon/statusnet/statusnet.php:424 ../../addon/twitter/twitter.php:242
+#: ../../addon/twitter/twitter.php:246 ../../addon/twitter/twitter.php:255
+#: ../../addon/smileybutton/smileybutton.php:273
+#: ../../addon/smileybutton/smileybutton.php:277 ../../addon/xmpp/xmpp.php:53
+#: ../../addon/pumpio/pumpio.php:219 ../../addon/pumpio/pumpio.php:223
+#: ../../addon/pumpio/pumpio.php:227 ../../addon/pumpio/pumpio.php:231
#: ../../include/dir_fns.php:143 ../../include/dir_fns.php:144
-#: ../../include/dir_fns.php:145 ../../view/theme/redbasic/php/config.php:111
-#: ../../view/theme/redbasic/php/config.php:136 ../../boot.php:1736
+#: ../../include/dir_fns.php:145
msgid "No"
msgstr "Nein"
-#: ../../Zotlabs/Module/Photos.php:652 ../../Zotlabs/Module/Admin/Site.php:220
-#: ../../Zotlabs/Module/Menu.php:100 ../../Zotlabs/Module/Menu.php:157
-#: ../../Zotlabs/Module/Connedit.php:402
-#: ../../Zotlabs/Module/Filestorage.php:160
-#: ../../Zotlabs/Module/Filestorage.php:168 ../../Zotlabs/Module/Mitem.php:162
-#: ../../Zotlabs/Module/Mitem.php:163 ../../Zotlabs/Module/Mitem.php:240
-#: ../../Zotlabs/Module/Mitem.php:241 ../../Zotlabs/Module/Profiles.php:682
-#: ../../Zotlabs/Module/Api.php:96 ../../Zotlabs/Module/Events.php:470
-#: ../../Zotlabs/Module/Events.php:471 ../../Zotlabs/Module/Removeme.php:63
-#: ../../Zotlabs/Module/Wiki.php:178
+#: ../../Zotlabs/Module/Mitem.php:162 ../../Zotlabs/Module/Mitem.php:163
+#: ../../Zotlabs/Module/Mitem.php:240 ../../Zotlabs/Module/Mitem.php:241
+#: ../../Zotlabs/Module/Events.php:470 ../../Zotlabs/Module/Events.php:471
+#: ../../Zotlabs/Module/Removeme.php:63
+#: ../../Zotlabs/Module/Admin/Site.php:239
#: ../../Zotlabs/Module/Settings/Channel.php:294
#: ../../Zotlabs/Module/Settings/Display.php:103
-#: ../../extend/addon/addon/dwpost/dwpost.php:73
-#: ../../extend/addon/addon/dwpost/dwpost.php:85
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:120
-#: ../../extend/addon/addon/friendica/dfrn_request.php:865
-#: ../../extend/addon/addon/ijpost/ijpost.php:73
-#: ../../extend/addon/addon/ijpost/ijpost.php:85
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:309
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:313
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:343
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:351
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:355
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:359
-#: ../../extend/addon/addon/libertree/libertree.php:69
-#: ../../extend/addon/addon/libertree/libertree.php:81
-#: ../../extend/addon/addon/ljpost/ljpost.php:70
-#: ../../extend/addon/addon/ljpost/ljpost.php:82
-#: ../../extend/addon/addon/nofed/nofed.php:72
-#: ../../extend/addon/addon/nofed/nofed.php:76
-#: ../../extend/addon/addon/nsabait/nsabait.php:157
-#: ../../extend/addon/addon/nsfw/nsfw.php:84
-#: ../../extend/addon/addon/planets/planets.php:153
-#: ../../extend/addon/addon/pumpio/pumpio.php:219
-#: ../../extend/addon/addon/pumpio/pumpio.php:223
-#: ../../extend/addon/addon/pumpio/pumpio.php:227
-#: ../../extend/addon/addon/pumpio/pumpio.php:231
-#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:81
-#: ../../extend/addon/addon/redred/redred.php:95
-#: ../../extend/addon/addon/redred/redred.php:99
-#: ../../extend/addon/addon/rtof/rtof.php:81
-#: ../../extend/addon/addon/rtof/rtof.php:85
-#: ../../extend/addon/addon/smileybutton/smileybutton.php:273
-#: ../../extend/addon/addon/smileybutton/smileybutton.php:277
-#: ../../extend/addon/addon/statusnet/statusnet.php:389
-#: ../../extend/addon/addon/statusnet/statusnet.php:411
-#: ../../extend/addon/addon/statusnet/statusnet.php:415
-#: ../../extend/addon/addon/statusnet/statusnet.php:424
-#: ../../extend/addon/addon/twitter/twitter.php:242
-#: ../../extend/addon/addon/twitter/twitter.php:246
-#: ../../extend/addon/addon/twitter/twitter.php:255
-#: ../../extend/addon/addon/visage/visage.php:166
-#: ../../extend/addon/addon/wppost/wppost.php:82
-#: ../../extend/addon/addon/wppost/wppost.php:105
-#: ../../extend/addon/addon/wppost/wppost.php:109
-#: ../../extend/addon/addon/xmpp/xmpp.php:53
-#: ../../extend/addon/addon/cdav/cdav.php:234
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:164
+#: ../../Zotlabs/Module/Api.php:96 ../../Zotlabs/Module/Photos.php:642
+#: ../../Zotlabs/Module/Wiki.php:180 ../../Zotlabs/Module/Connedit.php:392
+#: ../../Zotlabs/Module/Menu.php:100 ../../Zotlabs/Module/Menu.php:157
+#: ../../Zotlabs/Module/Profiles.php:681
+#: ../../Zotlabs/Module/Filestorage.php:160
+#: ../../Zotlabs/Module/Filestorage.php:168 ../../boot.php:1633
+#: ../../view/theme/redbasic/php/config.php:89
+#: ../../view/theme/redbasic/php/config.php:104 ../../addon/cdav/cdav.php:234
+#: ../../addon/planets/planets.php:153 ../../addon/wppost/wppost.php:82
+#: ../../addon/wppost/wppost.php:105 ../../addon/wppost/wppost.php:109
+#: ../../addon/nsfw/nsfw.php:84 ../../addon/ijpost/ijpost.php:73
+#: ../../addon/ijpost/ijpost.php:85 ../../addon/dwpost/dwpost.php:73
+#: ../../addon/dwpost/dwpost.php:85 ../../addon/ljpost/ljpost.php:70
+#: ../../addon/ljpost/ljpost.php:82 ../../addon/gitwiki/Mod_Gitwiki.php:166
+#: ../../addon/rainbowtag/rainbowtag.php:81 ../../addon/visage/visage.php:166
+#: ../../addon/nsabait/nsabait.php:157 ../../addon/rtof/rtof.php:81
+#: ../../addon/rtof/rtof.php:85 ../../addon/jappixmini/jappixmini.php:309
+#: ../../addon/jappixmini/jappixmini.php:313
+#: ../../addon/jappixmini/jappixmini.php:343
+#: ../../addon/jappixmini/jappixmini.php:351
+#: ../../addon/jappixmini/jappixmini.php:355
+#: ../../addon/jappixmini/jappixmini.php:359 ../../addon/nofed/nofed.php:72
+#: ../../addon/nofed/nofed.php:76 ../../addon/redred/redred.php:95
+#: ../../addon/redred/redred.php:99 ../../addon/libertree/libertree.php:69
+#: ../../addon/libertree/libertree.php:81
+#: ../../addon/flattrwidget/flattrwidget.php:120
+#: ../../addon/statusnet/statusnet.php:389
+#: ../../addon/statusnet/statusnet.php:411
+#: ../../addon/statusnet/statusnet.php:415
+#: ../../addon/statusnet/statusnet.php:424 ../../addon/twitter/twitter.php:242
+#: ../../addon/twitter/twitter.php:246 ../../addon/twitter/twitter.php:255
+#: ../../addon/smileybutton/smileybutton.php:273
+#: ../../addon/smileybutton/smileybutton.php:277 ../../addon/xmpp/xmpp.php:53
+#: ../../addon/pumpio/pumpio.php:219 ../../addon/pumpio/pumpio.php:223
+#: ../../addon/pumpio/pumpio.php:227 ../../addon/pumpio/pumpio.php:231
#: ../../include/dir_fns.php:143 ../../include/dir_fns.php:144
-#: ../../include/dir_fns.php:145 ../../view/theme/redbasic/php/config.php:111
-#: ../../view/theme/redbasic/php/config.php:136 ../../boot.php:1736
+#: ../../include/dir_fns.php:145
msgid "Yes"
msgstr "Ja"
-#: ../../Zotlabs/Module/Photos.php:653
-msgid "Caption (optional):"
-msgstr "Beschriftung (optional):"
+#: ../../Zotlabs/Module/Mitem.php:163 ../../Zotlabs/Module/Mitem.php:241
+msgid "Open link in new window"
+msgstr "Öffne Link in neuem Fenster"
-#: ../../Zotlabs/Module/Photos.php:654
-msgid "Description (optional):"
-msgstr "Beschreibung (optional):"
+#: ../../Zotlabs/Module/Mitem.php:164 ../../Zotlabs/Module/Mitem.php:242
+msgid "Order in list"
+msgstr "Reihenfolge in der Liste"
-#: ../../Zotlabs/Module/Photos.php:657 ../../Zotlabs/Module/Photos.php:1042
-#: ../../Zotlabs/Module/Connedit.php:637
-#: ../../Zotlabs/Module/Filestorage.php:152 ../../Zotlabs/Module/Thing.php:313
-#: ../../Zotlabs/Module/Thing.php:363 ../../Zotlabs/Module/Chat.php:234
-#: ../../include/acl_selectors.php:218
-msgid "Permissions"
-msgstr "Berechtigungen"
+#: ../../Zotlabs/Module/Mitem.php:164 ../../Zotlabs/Module/Mitem.php:242
+msgid "Higher numbers will sink to bottom of listing"
+msgstr "Größere Nummern werden weiter unten in der Auflistung einsortiert"
-#: ../../Zotlabs/Module/Photos.php:667 ../../Zotlabs/Module/Photos.php:1053
-#: ../../Zotlabs/Module/Photos.php:1093 ../../Zotlabs/Module/Photos.php:1211
-#: ../../Zotlabs/Module/Connect.php:98
-#: ../../Zotlabs/Module/Admin/Features.php:66
-#: ../../Zotlabs/Module/Admin/Logs.php:84
-#: ../../Zotlabs/Module/Admin/Profs.php:157
-#: ../../Zotlabs/Module/Admin/Security.php:104
-#: ../../Zotlabs/Module/Admin/Themes.php:156
-#: ../../Zotlabs/Module/Admin/Account_edit.php:74
-#: ../../Zotlabs/Module/Admin/Accounts.php:166
-#: ../../Zotlabs/Module/Admin/Channels.php:147
-#: ../../Zotlabs/Module/Admin/Site.php:260
-#: ../../Zotlabs/Module/Admin/Plugins.php:433
-#: ../../Zotlabs/Module/Locs.php:121 ../../Zotlabs/Module/Connedit.php:847
-#: ../../Zotlabs/Module/Filestorage.php:165 ../../Zotlabs/Module/Cal.php:342
-#: ../../Zotlabs/Module/Group.php:85 ../../Zotlabs/Module/Import_items.php:122
-#: ../../Zotlabs/Module/Import.php:507 ../../Zotlabs/Module/Mitem.php:243
-#: ../../Zotlabs/Module/Appman.php:133 ../../Zotlabs/Module/Mood.php:139
-#: ../../Zotlabs/Module/Profiles.php:722 ../../Zotlabs/Module/Invite.php:149
-#: ../../Zotlabs/Module/Setup.php:309 ../../Zotlabs/Module/Setup.php:357
-#: ../../Zotlabs/Module/Poke.php:186 ../../Zotlabs/Module/Pconfig.php:107
-#: ../../Zotlabs/Module/Rate.php:166 ../../Zotlabs/Module/Events.php:493
-#: ../../Zotlabs/Module/Pdledit.php:74 ../../Zotlabs/Module/Wiki.php:167
-#: ../../Zotlabs/Module/Sources.php:114 ../../Zotlabs/Module/Sources.php:149
-#: ../../Zotlabs/Module/Settings/Features.php:47
-#: ../../Zotlabs/Module/Settings/Oauth.php:87
-#: ../../Zotlabs/Module/Settings/Account.php:118
-#: ../../Zotlabs/Module/Settings/Tokens.php:168
-#: ../../Zotlabs/Module/Settings/Featured.php:50
-#: ../../Zotlabs/Module/Settings/Channel.php:476
-#: ../../Zotlabs/Module/Settings/Display.php:196
-#: ../../Zotlabs/Module/Settings/Permcats.php:112
-#: ../../Zotlabs/Module/Thing.php:320 ../../Zotlabs/Module/Thing.php:370
-#: ../../Zotlabs/Module/Mail.php:413 ../../Zotlabs/Module/Chat.php:196
-#: ../../Zotlabs/Module/Chat.php:241 ../../Zotlabs/Module/Xchan.php:15
-#: ../../Zotlabs/Lib/ThreadItem.php:731
-#: ../../extend/addon/addon/chords/Mod_Chords.php:60
-#: ../../extend/addon/addon/diaspora/diaspora.php:714
-#: ../../extend/addon/addon/dwpost/dwpost.php:89
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:124
-#: ../../extend/addon/addon/friendica/friendica.php:128
-#: ../../extend/addon/addon/frphotos/frphotos.php:96
-#: ../../extend/addon/addon/hubwall/hubwall.php:95
-#: ../../extend/addon/addon/ijpost/ijpost.php:89
-#: ../../extend/addon/addon/irc/irc.php:53
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:371
-#: ../../extend/addon/addon/libertree/libertree.php:85
-#: ../../extend/addon/addon/ljpost/ljpost.php:86
-#: ../../extend/addon/addon/logrot/logrot.php:35
-#: ../../extend/addon/addon/mailhost/mailhost.php:40
-#: ../../extend/addon/addon/nofed/nofed.php:80
-#: ../../extend/addon/addon/nsabait/nsabait.php:161
-#: ../../extend/addon/addon/nsfw/nsfw.php:92
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:53
-#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:168
-#: ../../extend/addon/addon/pageheader/pageheader.php:48
-#: ../../extend/addon/addon/piwik/piwik.php:95
-#: ../../extend/addon/addon/planets/planets.php:157
-#: ../../extend/addon/addon/pumpio/pumpio.php:237
-#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:85
-#: ../../extend/addon/addon/redfiles/redfiles.php:124
-#: ../../extend/addon/addon/redphotos/redphotos.php:136
-#: ../../extend/addon/addon/redred/redred.php:119
-#: ../../extend/addon/addon/rtof/rtof.php:101
-#: ../../extend/addon/addon/skeleton/skeleton.php:65
-#: ../../extend/addon/addon/smileybutton/smileybutton.php:281
-#: ../../extend/addon/addon/startpage/startpage.php:113
-#: ../../extend/addon/addon/statusnet/statusnet.php:322
-#: ../../extend/addon/addon/statusnet/statusnet.php:380
-#: ../../extend/addon/addon/statusnet/statusnet.php:432
-#: ../../extend/addon/addon/statusnet/statusnet.php:899
-#: ../../extend/addon/addon/superblock/superblock.php:118
-#: ../../extend/addon/addon/twitter/twitter.php:217
-#: ../../extend/addon/addon/twitter/twitter.php:259
-#: ../../extend/addon/addon/visage/visage.php:170
-#: ../../extend/addon/addon/wppost/wppost.php:113
-#: ../../extend/addon/addon/xmpp/xmpp.php:69
-#: ../../extend/addon/addon/cdav/cdav.php:246
-#: ../../extend/addon/addon/likebanner/likebanner.php:57
-#: ../../extend/addon/addon/mailtest/mailtest.php:100
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:153
-#: ../../extend/addon/addon/gnusoc/gnusoc.php:133
-#: ../../include/widgets.php:815 ../../include/js_strings.php:22
-#: ../../view/theme/redbasic/php/config.php:106
-msgid "Submit"
-msgstr "Absenden"
+#: ../../Zotlabs/Module/Mitem.php:165
+msgid "Submit and finish"
+msgstr "Absenden und fertigstellen"
-#: ../../Zotlabs/Module/Photos.php:685
-msgid "Album name could not be decoded"
-msgstr "Albumname konnte nicht dekodiert werden"
+#: ../../Zotlabs/Module/Mitem.php:166
+msgid "Submit and continue"
+msgstr "Absenden und fortfahren"
-#: ../../Zotlabs/Module/Photos.php:729
-msgid "Contact Photos"
-msgstr "Kontakt-Bilder"
+#: ../../Zotlabs/Module/Mitem.php:174
+msgid "Menu:"
+msgstr "Menü:"
-#: ../../Zotlabs/Module/Photos.php:752
-msgid "Show Newest First"
-msgstr "Neueste zuerst anzeigen"
+#: ../../Zotlabs/Module/Mitem.php:177
+msgid "Link Target"
+msgstr "Ziel des Links"
-#: ../../Zotlabs/Module/Photos.php:754
-msgid "Show Oldest First"
-msgstr "Älteste zuerst anzeigen"
+#: ../../Zotlabs/Module/Mitem.php:180
+msgid "Edit menu"
+msgstr "Menü bearbeiten"
-#: ../../Zotlabs/Module/Photos.php:778 ../../Zotlabs/Module/Photos.php:1335
-#: ../../Zotlabs/Module/Embedphotos.php:139 ../../include/widgets.php:1708
-msgid "View Photo"
-msgstr "Foto ansehen"
+#: ../../Zotlabs/Module/Mitem.php:183
+msgid "Edit element"
+msgstr "Bestandteil bearbeiten"
-#: ../../Zotlabs/Module/Photos.php:809
-#: ../../Zotlabs/Module/Embedphotos.php:155 ../../include/widgets.php:1725
-msgid "Edit Album"
-msgstr "Album bearbeiten"
+#: ../../Zotlabs/Module/Mitem.php:184
+msgid "Drop element"
+msgstr "Bestandteil löschen"
-#: ../../Zotlabs/Module/Photos.php:856
-msgid "Permission denied. Access to this item may be restricted."
-msgstr "Berechtigung verweigert. Der Zugriff ist wahrscheinlich eingeschränkt worden."
+#: ../../Zotlabs/Module/Mitem.php:185
+msgid "New element"
+msgstr "Neues Bestandteil"
-#: ../../Zotlabs/Module/Photos.php:858
-msgid "Photo not available"
-msgstr "Foto nicht verfügbar"
+#: ../../Zotlabs/Module/Mitem.php:186
+msgid "Edit this menu container"
+msgstr "Diesen Menü-Container bearbeiten"
-#: ../../Zotlabs/Module/Photos.php:916
-msgid "Use as profile photo"
-msgstr "Als Profilfoto verwenden"
+#: ../../Zotlabs/Module/Mitem.php:187
+msgid "Add menu element"
+msgstr "Menüelement hinzufügen"
-#: ../../Zotlabs/Module/Photos.php:917
-msgid "Use as cover photo"
-msgstr "Als Titelbild verwenden"
+#: ../../Zotlabs/Module/Mitem.php:188
+msgid "Delete this menu item"
+msgstr "Lösche dieses Menü-Bestandteil"
-#: ../../Zotlabs/Module/Photos.php:924
-msgid "Private Photo"
-msgstr "Privates Foto"
+#: ../../Zotlabs/Module/Mitem.php:189
+msgid "Edit this menu item"
+msgstr "Bearbeite dieses Menü-Bestandteil"
-#: ../../Zotlabs/Module/Photos.php:935 ../../Zotlabs/Module/Cal.php:336
-#: ../../Zotlabs/Module/Cal.php:343 ../../Zotlabs/Module/Events.php:689
-#: ../../Zotlabs/Module/Events.php:698
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:846
-msgid "Previous"
-msgstr "Voriges"
+#: ../../Zotlabs/Module/Mitem.php:206
+msgid "Menu item not found."
+msgstr "Menü-Bestandteil nicht gefunden."
-#: ../../Zotlabs/Module/Photos.php:939
-msgid "View Full Size"
-msgstr "In voller Größe anzeigen"
+#: ../../Zotlabs/Module/Mitem.php:219
+msgid "Menu item deleted."
+msgstr "Menü-Bestandteil gelöscht."
-#: ../../Zotlabs/Module/Photos.php:944 ../../Zotlabs/Module/Cal.php:337
-#: ../../Zotlabs/Module/Cal.php:344 ../../Zotlabs/Module/Setup.php:264
-#: ../../Zotlabs/Module/Events.php:690 ../../Zotlabs/Module/Events.php:699
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:847
-msgid "Next"
-msgstr "Nächste"
+#: ../../Zotlabs/Module/Mitem.php:221
+msgid "Menu item could not be deleted."
+msgstr "Menü-Bestandteil kann nicht gelöscht werden."
-#: ../../Zotlabs/Module/Photos.php:984
-#: ../../Zotlabs/Module/Admin/Plugins.php:450
-#: ../../Zotlabs/Module/Tagrm.php:137
-#: ../../extend/addon/addon/superblock/superblock.php:114
-msgid "Remove"
-msgstr "Entfernen"
+#: ../../Zotlabs/Module/Mitem.php:228
+msgid "Edit Menu Element"
+msgstr "Bearbeite Menü-Bestandteil"
-#: ../../Zotlabs/Module/Photos.php:1028
-msgid "Edit photo"
-msgstr "Foto bearbeiten"
+#: ../../Zotlabs/Module/Mitem.php:238
+msgid "Link text"
+msgstr "Link Text"
-#: ../../Zotlabs/Module/Photos.php:1030
-msgid "Rotate CW (right)"
-msgstr "Drehen im UZS (rechts)"
+#: ../../Zotlabs/Module/Events.php:25
+msgid "Calendar entries imported."
+msgstr "Kalendereinträge wurden importiert."
-#: ../../Zotlabs/Module/Photos.php:1031
-msgid "Rotate CCW (left)"
-msgstr "Drehen gegen UZS (links)"
+#: ../../Zotlabs/Module/Events.php:27
+msgid "No calendar entries found."
+msgstr "Keine Kalendereinträge gefunden."
-#: ../../Zotlabs/Module/Photos.php:1034
-msgid "Move photo to album"
-msgstr "Foto in Album verschieben"
+#: ../../Zotlabs/Module/Events.php:110
+msgid "Event can not end before it has started."
+msgstr "Termin-Ende liegt vor dem Beginn."
-#: ../../Zotlabs/Module/Photos.php:1035
-msgid "Enter a new album name"
-msgstr "Gib einen Namen für ein neues Album ein"
+#: ../../Zotlabs/Module/Events.php:112 ../../Zotlabs/Module/Events.php:121
+#: ../../Zotlabs/Module/Events.php:143
+msgid "Unable to generate preview."
+msgstr "Vorschau konnte nicht erzeugt werden."
-#: ../../Zotlabs/Module/Photos.php:1036
-msgid "or select an existing one (doubleclick)"
-msgstr "oder wähle ein bereits vorhandenes aus (Doppelklick)"
+#: ../../Zotlabs/Module/Events.php:119
+msgid "Event title and start time are required."
+msgstr "Titel und Startzeit des Termins sind erforderlich."
-#: ../../Zotlabs/Module/Photos.php:1039
-msgid "Caption"
-msgstr "Bildunterschrift"
+#: ../../Zotlabs/Module/Events.php:141 ../../Zotlabs/Module/Events.php:265
+msgid "Event not found."
+msgstr "Termin nicht gefunden."
-#: ../../Zotlabs/Module/Photos.php:1041
-msgid "Add a Tag"
-msgstr "Schlagwort hinzufügen"
+#: ../../Zotlabs/Module/Events.php:260 ../../Zotlabs/Module/Tagger.php:51
+#: ../../Zotlabs/Module/Like.php:372 ../../include/conversation.php:119
+#: ../../include/text.php:1940 ../../include/event.php:1141
+msgid "event"
+msgstr "Termin"
-#: ../../Zotlabs/Module/Photos.php:1049
-msgid "Example: @bob, @Barbara_Jensen, @jim@example.com"
-msgstr "Beispiele: @ben, @Karl_Prester, @lieschen@example.com"
+#: ../../Zotlabs/Module/Events.php:460
+msgid "Edit event title"
+msgstr "Termintitel bearbeiten"
-#: ../../Zotlabs/Module/Photos.php:1052
-msgid "Flag as adult in album view"
-msgstr "In der Albumansicht als nicht jugendfrei markieren"
+#: ../../Zotlabs/Module/Events.php:460 ../../addon/cdav/Mod_Cdav.php:835
+msgid "Event title"
+msgstr "Termintitel"
-#: ../../Zotlabs/Module/Photos.php:1071 ../../Zotlabs/Lib/ThreadItem.php:268
-msgid "I like this (toggle)"
-msgstr "Mir gefällt das (Umschalter)"
+#: ../../Zotlabs/Module/Events.php:460 ../../Zotlabs/Module/Events.php:465
+#: ../../Zotlabs/Module/Appman.php:122 ../../Zotlabs/Module/Appman.php:123
+#: ../../Zotlabs/Module/Profiles.php:748 ../../Zotlabs/Module/Profiles.php:752
+#: ../../include/datetime.php:259
+msgid "Required"
+msgstr "Benötigt"
-#: ../../Zotlabs/Module/Photos.php:1072 ../../Zotlabs/Lib/ThreadItem.php:269
-msgid "I don't like this (toggle)"
-msgstr "Mir gefällt das nicht (Umschalter)"
+#: ../../Zotlabs/Module/Events.php:462
+msgid "Categories (comma-separated list)"
+msgstr "Kategorien (Kommagetrennte Liste)"
-#: ../../Zotlabs/Module/Photos.php:1073 ../../Zotlabs/Module/Blocks.php:161
-#: ../../Zotlabs/Module/Layouts.php:193 ../../Zotlabs/Module/Webpages.php:245
-#: ../../extend/addon/addon/cdav/include/widgets.php:123
-#: ../../include/conversation.php:1378
-msgid "Share"
-msgstr "Teilen"
+#: ../../Zotlabs/Module/Events.php:463
+msgid "Edit Category"
+msgstr "Kategorie bearbeiten"
-#: ../../Zotlabs/Module/Photos.php:1074 ../../Zotlabs/Lib/ThreadItem.php:411
-#: ../../include/conversation.php:738
-msgid "Please wait"
-msgstr "Bitte warten"
+#: ../../Zotlabs/Module/Events.php:463
+msgid "Category"
+msgstr "Kategorie"
-#: ../../Zotlabs/Module/Photos.php:1090 ../../Zotlabs/Module/Photos.php:1208
-#: ../../Zotlabs/Lib/ThreadItem.php:728
-msgid "This is you"
-msgstr "Das bist Du"
+#: ../../Zotlabs/Module/Events.php:466
+msgid "Edit start date and time"
+msgstr "Startdatum und -zeit bearbeiten"
-#: ../../Zotlabs/Module/Photos.php:1092 ../../Zotlabs/Module/Photos.php:1210
-#: ../../Zotlabs/Lib/ThreadItem.php:730 ../../include/js_strings.php:6
-msgid "Comment"
-msgstr "Kommentar"
+#: ../../Zotlabs/Module/Events.php:466 ../../addon/cdav/Mod_Cdav.php:836
+msgid "Start date and time"
+msgstr "Startdatum und -zeit"
-#: ../../Zotlabs/Module/Photos.php:1094 ../../Zotlabs/Module/Events.php:478
-#: ../../Zotlabs/Module/Webpages.php:251 ../../Zotlabs/Lib/ThreadItem.php:740
-#: ../../include/conversation.php:1347 ../../include/page_widgets.php:43
-msgid "Preview"
-msgstr "Vorschau"
+#: ../../Zotlabs/Module/Events.php:467 ../../Zotlabs/Module/Events.php:470
+msgid "Finish date and time are not known or not relevant"
+msgstr "Enddatum und -zeit sind unbekannt oder irrelevant"
-#: ../../Zotlabs/Module/Photos.php:1108 ../../include/conversation.php:577
-msgctxt "title"
-msgid "Likes"
-msgstr "Gefällt mir"
+#: ../../Zotlabs/Module/Events.php:469
+msgid "Edit finish date and time"
+msgstr "Enddatum und -zeit bearbeiten"
-#: ../../Zotlabs/Module/Photos.php:1108 ../../include/conversation.php:577
-msgctxt "title"
-msgid "Dislikes"
-msgstr "Gefällt mir nicht"
+#: ../../Zotlabs/Module/Events.php:469
+msgid "Finish date and time"
+msgstr "Enddatum und -zeit"
-#: ../../Zotlabs/Module/Photos.php:1109 ../../include/conversation.php:578
-msgctxt "title"
-msgid "Agree"
-msgstr "Zustimmungen"
+#: ../../Zotlabs/Module/Events.php:471 ../../Zotlabs/Module/Events.php:472
+msgid "Adjust for viewer timezone"
+msgstr "An die Zeitzone des Betrachters anpassen"
-#: ../../Zotlabs/Module/Photos.php:1109 ../../include/conversation.php:578
-msgctxt "title"
-msgid "Disagree"
-msgstr "Ablehnungen"
+#: ../../Zotlabs/Module/Events.php:471
+msgid ""
+"Important for events that happen in a particular place. Not practical for "
+"global holidays."
+msgstr "Wichtig für Veranstaltungen die an bestimmten Orten stattfinden. Nicht sinnvoll für globale Feiertage / Ferien."
-#: ../../Zotlabs/Module/Photos.php:1109 ../../include/conversation.php:578
-msgctxt "title"
-msgid "Abstain"
-msgstr "Enthaltungen"
+#: ../../Zotlabs/Module/Events.php:473
+msgid "Edit Description"
+msgstr "Beschreibung bearbeiten"
-#: ../../Zotlabs/Module/Photos.php:1110 ../../include/conversation.php:579
-msgctxt "title"
-msgid "Attending"
-msgstr "Zusagen"
+#: ../../Zotlabs/Module/Events.php:473 ../../Zotlabs/Module/Appman.php:124
+#: ../../Zotlabs/Module/Rbmark.php:101
+#: ../../addon/rendezvous/rendezvous.php:173 ../../addon/cdav/Mod_Cdav.php:838
+msgid "Description"
+msgstr "Beschreibung"
-#: ../../Zotlabs/Module/Photos.php:1110 ../../include/conversation.php:579
-msgctxt "title"
-msgid "Not attending"
-msgstr "Absagen"
+#: ../../Zotlabs/Module/Events.php:475
+msgid "Edit Location"
+msgstr "Ort bearbeiten"
-#: ../../Zotlabs/Module/Photos.php:1110 ../../include/conversation.php:579
-msgctxt "title"
-msgid "Might attend"
-msgstr "Vielleicht"
+#: ../../Zotlabs/Module/Events.php:478 ../../Zotlabs/Module/Photos.php:1063
+#: ../../Zotlabs/Module/Webpages.php:252 ../../Zotlabs/Lib/ThreadItem.php:741
+#: ../../include/conversation.php:1280 ../../include/page_widgets.php:43
+msgid "Preview"
+msgstr "Vorschau"
-#: ../../Zotlabs/Module/Photos.php:1127 ../../Zotlabs/Module/Photos.php:1139
-#: ../../Zotlabs/Lib/ThreadItem.php:186 ../../Zotlabs/Lib/ThreadItem.php:198
-#: ../../include/conversation.php:1928
-msgid "View all"
-msgstr "Alles anzeigen"
+#: ../../Zotlabs/Module/Events.php:479 ../../include/conversation.php:1343
+msgid "Permission settings"
+msgstr "Berechtigungs-Einstellungen"
-#: ../../Zotlabs/Module/Photos.php:1131 ../../Zotlabs/Lib/ThreadItem.php:190
-#: ../../include/taxonomy.php:403 ../../include/conversation.php:1952
-#: ../../include/channel.php:1273
-msgctxt "noun"
-msgid "Like"
-msgid_plural "Likes"
-msgstr[0] "Gefällt mir"
-msgstr[1] "Gefällt mir"
+#: ../../Zotlabs/Module/Events.php:489
+msgid "Timezone:"
+msgstr "Zeitzone:"
-#: ../../Zotlabs/Module/Photos.php:1136 ../../Zotlabs/Lib/ThreadItem.php:195
-#: ../../include/conversation.php:1955
-msgctxt "noun"
-msgid "Dislike"
-msgid_plural "Dislikes"
-msgstr[0] "Gefällt nicht"
-msgstr[1] "Gefällt nicht"
+#: ../../Zotlabs/Module/Events.php:494
+msgid "Advanced Options"
+msgstr "Weitere Optionen"
-#: ../../Zotlabs/Module/Photos.php:1236
-msgid "Photo Tools"
-msgstr "Fotowerkzeuge"
+#: ../../Zotlabs/Module/Events.php:605 ../../Zotlabs/Module/Cal.php:264
+msgid "l, F j"
+msgstr "l, j. F"
-#: ../../Zotlabs/Module/Photos.php:1245
-msgid "In This Photo:"
-msgstr "Auf diesem Foto:"
+#: ../../Zotlabs/Module/Events.php:633
+msgid "Edit event"
+msgstr "Termin bearbeiten"
-#: ../../Zotlabs/Module/Photos.php:1250
-msgid "Map"
-msgstr "Karte"
+#: ../../Zotlabs/Module/Events.php:635
+msgid "Delete event"
+msgstr "Termin löschen"
-#: ../../Zotlabs/Module/Photos.php:1258 ../../Zotlabs/Lib/ThreadItem.php:400
-msgctxt "noun"
-msgid "Likes"
-msgstr "Gefällt mir"
+#: ../../Zotlabs/Module/Events.php:660 ../../Zotlabs/Module/Cal.php:313
+#: ../../include/text.php:1759
+msgid "Link to Source"
+msgstr "Link zur Quelle"
-#: ../../Zotlabs/Module/Photos.php:1259 ../../Zotlabs/Lib/ThreadItem.php:401
-msgctxt "noun"
-msgid "Dislikes"
-msgstr "Gefällt nicht"
+#: ../../Zotlabs/Module/Events.php:669
+msgid "calendar"
+msgstr "Kalender"
-#: ../../Zotlabs/Module/Photos.php:1264 ../../Zotlabs/Lib/ThreadItem.php:406
-#: ../../include/acl_selectors.php:220
-msgid "Close"
-msgstr "Schließen"
+#: ../../Zotlabs/Module/Events.php:688 ../../Zotlabs/Module/Cal.php:336
+msgid "Edit Event"
+msgstr "Termin bearbeiten"
-#: ../../Zotlabs/Module/Photos.php:1341
-msgid "View Album"
-msgstr "Album ansehen"
+#: ../../Zotlabs/Module/Events.php:688 ../../Zotlabs/Module/Cal.php:336
+msgid "Create Event"
+msgstr "Termin anlegen"
-#: ../../Zotlabs/Module/Photos.php:1352 ../../Zotlabs/Module/Photos.php:1365
-#: ../../Zotlabs/Module/Photos.php:1366
-msgid "Recent Photos"
-msgstr "Neueste Fotos"
+#: ../../Zotlabs/Module/Events.php:689 ../../Zotlabs/Module/Events.php:698
+#: ../../Zotlabs/Module/Cal.php:337 ../../Zotlabs/Module/Cal.php:344
+#: ../../Zotlabs/Module/Photos.php:911 ../../addon/cdav/Mod_Cdav.php:846
+msgid "Previous"
+msgstr "Voriges"
-#: ../../Zotlabs/Module/Editpost.php:24 ../../Zotlabs/Module/Editblock.php:79
-#: ../../Zotlabs/Module/Editblock.php:95
-#: ../../Zotlabs/Module/Editlayout.php:79
-#: ../../Zotlabs/Module/Editwebpage.php:80
-msgid "Item not found"
-msgstr "Element nicht gefunden"
+#: ../../Zotlabs/Module/Events.php:690 ../../Zotlabs/Module/Events.php:699
+#: ../../Zotlabs/Module/Setup.php:264 ../../Zotlabs/Module/Cal.php:338
+#: ../../Zotlabs/Module/Cal.php:345 ../../Zotlabs/Module/Photos.php:920
+#: ../../addon/cdav/Mod_Cdav.php:847
+msgid "Next"
+msgstr "Nächste"
-#: ../../Zotlabs/Module/Editpost.php:35
-msgid "Item is not editable"
-msgstr "Element kann nicht bearbeitet werden."
+#: ../../Zotlabs/Module/Events.php:691 ../../Zotlabs/Module/Cal.php:339
+#: ../../include/channel.php:1365
+msgid "Export"
+msgstr "Exportieren"
-#: ../../Zotlabs/Module/Editpost.php:108 ../../Zotlabs/Module/Rpost.php:138
-msgid "Edit post"
-msgstr "Bearbeite Beitrag"
+#: ../../Zotlabs/Module/Events.php:695 ../../addon/cdav/Mod_Cdav.php:849
+msgid "Month"
+msgstr "Monat"
-#: ../../Zotlabs/Module/Acl.php:117 ../../Zotlabs/Module/Lockview.php:117
-#: ../../Zotlabs/Module/Lockview.php:153 ../../include/acl_selectors.php:183
-msgctxt "acl"
-msgid "Profile"
-msgstr "Profil"
+#: ../../Zotlabs/Module/Events.php:696 ../../addon/cdav/Mod_Cdav.php:850
+msgid "Week"
+msgstr "Woche"
-#: ../../Zotlabs/Module/Acl.php:344
-msgid "network"
-msgstr "Netzwerk"
+#: ../../Zotlabs/Module/Events.php:697 ../../addon/cdav/Mod_Cdav.php:851
+msgid "Day"
+msgstr "Tag"
-#: ../../Zotlabs/Module/Acl.php:354
-msgid "RSS"
-msgstr "RSS"
+#: ../../Zotlabs/Module/Events.php:700 ../../Zotlabs/Module/Cal.php:346
+#: ../../addon/cdav/Mod_Cdav.php:848
+msgid "Today"
+msgstr "Heute"
-#: ../../Zotlabs/Module/Help.php:23
-msgid "Documentation Search"
-msgstr "Suche in der Dokumentation"
+#: ../../Zotlabs/Module/Events.php:731
+msgid "Event removed"
+msgstr "Termin gelöscht"
-#: ../../Zotlabs/Module/Help.php:80 ../../include/conversation.php:1827
-msgid "About"
-msgstr "Ãœber"
+#: ../../Zotlabs/Module/Events.php:734
+msgid "Failed to remove event"
+msgstr "Termin konnte nicht gelöscht werden"
-#: ../../Zotlabs/Module/Help.php:81 ../../Zotlabs/Module/Group.php:197
-msgid "Members"
-msgstr "Mitglieder"
+#: ../../Zotlabs/Module/Appman.php:38 ../../Zotlabs/Module/Appman.php:55
+msgid "App installed."
+msgstr "App installiert."
-#: ../../Zotlabs/Module/Help.php:82
-msgid "Administrators"
-msgstr "Administratoren"
+#: ../../Zotlabs/Module/Appman.php:48
+msgid "Malformed app."
+msgstr "Fehlerhafte App."
-#: ../../Zotlabs/Module/Help.php:83
-msgid "Developers"
-msgstr "Entwickler"
+#: ../../Zotlabs/Module/Appman.php:111
+msgid "Embed code"
+msgstr "Code einbetten"
-#: ../../Zotlabs/Module/Help.php:84
-msgid "Tutorials"
-msgstr "Tutorials"
+#: ../../Zotlabs/Module/Appman.php:117
+msgid "Edit App"
+msgstr "App bearbeiten"
-#: ../../Zotlabs/Module/Help.php:93
-msgid "$Projectname Documentation"
-msgstr "$Projectname-Dokumentation"
+#: ../../Zotlabs/Module/Appman.php:117
+msgid "Create App"
+msgstr "App erstellen"
-#: ../../Zotlabs/Module/Help.php:94
-msgid "Contents"
-msgstr "Inhalt"
+#: ../../Zotlabs/Module/Appman.php:122
+msgid "Name of app"
+msgstr "Name der App"
-#: ../../Zotlabs/Module/Bookmarks.php:53
-msgid "Bookmark added"
-msgstr "Lesezeichen hinzugefügt"
+#: ../../Zotlabs/Module/Appman.php:123
+msgid "Location (URL) of app"
+msgstr "Ort (URL) der App"
-#: ../../Zotlabs/Module/Bookmarks.php:75
-msgid "My Bookmarks"
-msgstr "Meine Lesezeichen"
+#: ../../Zotlabs/Module/Appman.php:125
+msgid "Photo icon URL"
+msgstr "URL zum Icon"
-#: ../../Zotlabs/Module/Bookmarks.php:86
-msgid "My Connections Bookmarks"
-msgstr "Lesezeichen meiner Kontakte"
+#: ../../Zotlabs/Module/Appman.php:125
+msgid "80 x 80 pixels - optional"
+msgstr "80 x 80 Pixel – optional"
-#: ../../Zotlabs/Module/Connect.php:61 ../../Zotlabs/Module/Connect.php:109
-msgid "Continue"
-msgstr "Fortfahren"
+#: ../../Zotlabs/Module/Appman.php:126
+msgid "Categories (optional, comma separated list)"
+msgstr "Kategorien (optional, kommagetrennte Liste)"
-#: ../../Zotlabs/Module/Connect.php:90
-msgid "Premium Channel Setup"
-msgstr "Premium-Kanal-Einrichtung"
+#: ../../Zotlabs/Module/Appman.php:127
+msgid "Version ID"
+msgstr "Versions-ID"
-#: ../../Zotlabs/Module/Connect.php:92
-msgid "Enable premium channel connection restrictions"
-msgstr "Einschränkungen für einen Premium-Kanal aktivieren"
+#: ../../Zotlabs/Module/Appman.php:128
+msgid "Price of app"
+msgstr "Preis der App"
-#: ../../Zotlabs/Module/Connect.php:93
-msgid ""
-"Please enter your restrictions or conditions, such as paypal receipt, usage "
-"guidelines, etc."
-msgstr "Bitte gib Deine Nutzungsbedingungen ein, z.B. Paypal-Quittung, Richtlinien etc."
+#: ../../Zotlabs/Module/Appman.php:129
+msgid "Location (URL) to purchase app"
+msgstr "Ort (URL), um die App zu kaufen"
-#: ../../Zotlabs/Module/Connect.php:95 ../../Zotlabs/Module/Connect.php:115
-msgid ""
-"This channel may require additional steps or acknowledgement of the "
-"following conditions prior to connecting:"
-msgstr "Unter Umständen sind weitere Schritte oder die Bestätigung der folgenden Bedingungen vor dem Verbinden mit diesem Kanal nötig."
+#: ../../Zotlabs/Module/Regmod.php:15
+msgid "Please login."
+msgstr "Bitte melde dich an."
-#: ../../Zotlabs/Module/Connect.php:96
-msgid ""
-"Potential connections will then see the following text before proceeding:"
-msgstr "Potentielle Kontakte werden den folgenden Text sehen, bevor fortgefahren wird:"
+#: ../../Zotlabs/Module/Magic.php:71
+msgid "Hub not found."
+msgstr "Server nicht gefunden."
-#: ../../Zotlabs/Module/Connect.php:97 ../../Zotlabs/Module/Connect.php:118
-msgid ""
-"By continuing, I certify that I have complied with any instructions provided"
-" on this page."
-msgstr "Indem ich fortfahre, bestätige ich die Erfüllung aller Anweisungen auf dieser Seite."
+#: ../../Zotlabs/Module/Subthread.php:87 ../../Zotlabs/Module/Tagger.php:47
+#: ../../Zotlabs/Module/Like.php:370
+#: ../../addon/redphotos/redphotohelper.php:71
+#: ../../addon/diaspora/inbound.php:1783 ../../include/conversation.php:116
+#: ../../include/text.php:1937
+msgid "photo"
+msgstr "Foto"
-#: ../../Zotlabs/Module/Connect.php:106
-msgid "(No specific instructions have been provided by the channel owner.)"
-msgstr "(Der Kanal-Besitzer hat keine speziellen Anweisungen hinterlegt.)"
+#: ../../Zotlabs/Module/Subthread.php:87 ../../Zotlabs/Module/Like.php:370
+#: ../../addon/diaspora/inbound.php:1783 ../../include/conversation.php:144
+#: ../../include/text.php:1943
+msgid "status"
+msgstr "Status"
-#: ../../Zotlabs/Module/Connect.php:114
-msgid "Restricted or Premium Channel"
-msgstr "Eingeschränkter oder Premium-Kanal"
+#: ../../Zotlabs/Module/Subthread.php:118
+#, php-format
+msgid "%1$s is following %2$s's %3$s"
+msgstr "%1$s folgt nun %2$ss %3$s"
-#: ../../Zotlabs/Module/Admin.php:94
-msgid "# Accounts"
-msgstr "Anzahl der Konten"
+#: ../../Zotlabs/Module/Subthread.php:120
+#, php-format
+msgid "%1$s stopped following %2$s's %3$s"
+msgstr "%1$s folgt %2$ss %3$s nicht mehr"
-#: ../../Zotlabs/Module/Admin.php:95
-msgid "# blocked accounts"
-msgstr "Anzahl der blockierten Konten"
+#: ../../Zotlabs/Module/Import_items.php:48 ../../Zotlabs/Module/Import.php:64
+msgid "Nothing to import."
+msgstr "Nichts zu importieren."
-#: ../../Zotlabs/Module/Admin.php:96
-msgid "# expired accounts"
-msgstr "Anzahl der abgelaufenen Konten"
+#: ../../Zotlabs/Module/Import_items.php:72 ../../Zotlabs/Module/Import.php:79
+#: ../../Zotlabs/Module/Import.php:95
+msgid "Unable to download data from old server"
+msgstr "Daten können vom alten Server nicht heruntergeladen werden"
-#: ../../Zotlabs/Module/Admin.php:97
-msgid "# expiring accounts"
-msgstr "Anzahl der ablaufenden Konten"
+#: ../../Zotlabs/Module/Import_items.php:77
+#: ../../Zotlabs/Module/Import.php:102
+msgid "Imported file is empty."
+msgstr "Die importierte Datei ist leer."
-#: ../../Zotlabs/Module/Admin.php:108
-msgid "# Channels"
-msgstr "Anzahl der Kanäle"
+#: ../../Zotlabs/Module/Import_items.php:93
+#: ../../Zotlabs/Module/Import.php:121
+#, php-format
+msgid "Warning: Database versions differ by %1$d updates."
+msgstr "Achtung: Datenbankversionen unterscheiden sich um %1$d Aktualisierungen."
-#: ../../Zotlabs/Module/Admin.php:109
-msgid "# primary"
-msgstr "Anzahl der primären Kanäle"
+#: ../../Zotlabs/Module/Import_items.php:108
+msgid "Import completed"
+msgstr "Import abgeschlossen"
-#: ../../Zotlabs/Module/Admin.php:110
-msgid "# clones"
-msgstr "Anzahl der Klone"
+#: ../../Zotlabs/Module/Import_items.php:125
+msgid "Import Items"
+msgstr "Beiträge importieren"
-#: ../../Zotlabs/Module/Admin.php:116
-msgid "Message queues"
-msgstr "Nachrichten-Warteschlangen"
+#: ../../Zotlabs/Module/Import_items.php:126
+msgid ""
+"Use this form to import existing posts and content from an export file."
+msgstr "Mit diesem Formular kannst Du existierende Beiträge und Inhalte aus einer Sicherungsdatei importieren."
-#: ../../Zotlabs/Module/Admin.php:133
-msgid "Your software should be updated"
-msgstr "Die installierte Software sollte aktualisiert werden"
+#: ../../Zotlabs/Module/Import_items.php:127
+#: ../../Zotlabs/Module/Import.php:501
+msgid "File to Upload"
+msgstr "Hochzuladende Datei:"
-#: ../../Zotlabs/Module/Admin.php:137 ../../Zotlabs/Module/Admin/Logs.php:82
-#: ../../Zotlabs/Module/Admin/Security.php:86
-#: ../../Zotlabs/Module/Admin/Themes.php:120
-#: ../../Zotlabs/Module/Admin/Themes.php:154
-#: ../../Zotlabs/Module/Admin/Accounts.php:164
-#: ../../Zotlabs/Module/Admin/Channels.php:145
-#: ../../Zotlabs/Module/Admin/Site.php:258
-#: ../../Zotlabs/Module/Admin/Plugins.php:336
-#: ../../Zotlabs/Module/Admin/Plugins.php:431
-msgid "Administration"
-msgstr "Administration"
+#: ../../Zotlabs/Module/New_channel.php:121
+#: ../../Zotlabs/Module/Manage.php:136
+#, php-format
+msgid "You have created %1$.0f of %2$.0f allowed channels."
+msgstr "Du hast %1$.0f von maximal %2$.0f erlaubten Kanälen eingerichtet."
-#: ../../Zotlabs/Module/Admin.php:138
-msgid "Summary"
-msgstr "Zusammenfassung"
+#: ../../Zotlabs/Module/New_channel.php:134
+#: ../../Zotlabs/Module/Register.php:237
+msgid "Name or caption"
+msgstr "Name oder Titel"
-#: ../../Zotlabs/Module/Admin.php:141
-msgid "Registered accounts"
-msgstr "Registrierte Konten"
+#: ../../Zotlabs/Module/New_channel.php:134
+#: ../../Zotlabs/Module/Register.php:237
+msgid "Examples: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \"Aviation Group\""
+msgstr "Beispiele: „Horst Weidinger“, „Lisa und ihr Meerschweinchen“, „Fußball“, „Segelflieger-Forum“ "
-#: ../../Zotlabs/Module/Admin.php:142
-msgid "Pending registrations"
-msgstr "Ausstehende Registrierungen"
+#: ../../Zotlabs/Module/New_channel.php:136
+#: ../../Zotlabs/Module/Register.php:239
+msgid "Choose a short nickname"
+msgstr "Wähle einen kurzen Spitznamen"
-#: ../../Zotlabs/Module/Admin.php:143
-msgid "Registered channels"
-msgstr "Registrierte Kanäle"
+#: ../../Zotlabs/Module/New_channel.php:136
+#: ../../Zotlabs/Module/Register.php:239
+#, php-format
+msgid ""
+"Your nickname will be used to create an easy to remember channel address "
+"e.g. nickname%s"
+msgstr "Dein Spitzname wird verwendet, um eine leicht zu merkende Kanal-Adresse (ähnlich einer E-Mail-Adresse) zu erzeugen, die Du mit anderen austauschen kannst, z.B. nickname%s"
-#: ../../Zotlabs/Module/Admin.php:144
-msgid "Active plugins"
-msgstr "Aktive Plug-Ins"
+#: ../../Zotlabs/Module/New_channel.php:137
+#: ../../Zotlabs/Module/Register.php:240
+msgid "Channel role and privacy"
+msgstr "Kanaltyp und Privatspäre-Einstellungen"
-#: ../../Zotlabs/Module/Admin.php:145
-msgid "Version"
-msgstr "Version"
+#: ../../Zotlabs/Module/New_channel.php:137
+#: ../../Zotlabs/Module/Register.php:240
+msgid "Select a channel role with your privacy requirements."
+msgstr "Wähle einen passenden Kanaltyp mit den zugehörigen Voreinstellungen zur Privatsphäre."
-#: ../../Zotlabs/Module/Admin.php:146
-msgid "Repository version (master)"
-msgstr "Repository-Version (master)"
+#: ../../Zotlabs/Module/New_channel.php:137
+#: ../../Zotlabs/Module/Register.php:240
+msgid "Read more about roles"
+msgstr "Mehr Informationen über Rollen"
-#: ../../Zotlabs/Module/Admin.php:147
-msgid "Repository version (dev)"
-msgstr "Repository-Version (dev)"
+#: ../../Zotlabs/Module/New_channel.php:140
+msgid "Create Channel"
+msgstr "Einen neuen Kanal anlegen"
-#: ../../Zotlabs/Module/Editblock.php:108 ../../Zotlabs/Module/Blocks.php:97
-#: ../../Zotlabs/Module/Blocks.php:155
-msgid "Block Name"
-msgstr "Block-Name"
+#: ../../Zotlabs/Module/New_channel.php:141
+msgid ""
+"A channel is your identity on this network. It can represent a person, a "
+"blog, or a forum to name a few. Channels can make connections with other "
+"channels to share information with highly detailed permissions."
+msgstr "Ein Kanal ist Deine Identität in diesem Netzwerk. Er kann eine Person, ein Blog oder ein Forum repräsentieren, nur um ein paar Beispiele zu nennen. Kanäle können Verbindungen miteinander eingehen, um Informationen zu teilen, jeweils basierend auf sehr detaillierten Berechtigungseinstellungen."
-#: ../../Zotlabs/Module/Editblock.php:111
-#: ../../Zotlabs/Module/Editwebpage.php:146 ../../Zotlabs/Module/Mail.php:287
-#: ../../Zotlabs/Module/Mail.php:412 ../../Zotlabs/Module/Chat.php:207
-#: ../../include/conversation.php:1295
-msgid "Insert web link"
-msgstr "Link einfügen"
+#: ../../Zotlabs/Module/New_channel.php:142
+msgid ""
+"or <a href=\"import\">import an existing channel</a> from another location."
+msgstr "oder <a href=\"import\">importiere einen bestehenden Kanal</a> von einem anderen Server."
-#: ../../Zotlabs/Module/Editblock.php:124 ../../include/conversation.php:1406
-msgid "Title (optional)"
-msgstr "Titel (optional)"
+#: ../../Zotlabs/Module/Removeme.php:35
+msgid ""
+"Channel removals are not allowed within 48 hours of changing the account "
+"password."
+msgstr "Innerhalb von 48 Stunden nach einer Änderung des Passworts können keine Kanäle gelöscht werden."
-#: ../../Zotlabs/Module/Editblock.php:133
-msgid "Edit Block"
-msgstr "Block bearbeiten"
+#: ../../Zotlabs/Module/Removeme.php:60
+msgid "Remove This Channel"
+msgstr "Diesen Kanal löschen"
-#: ../../Zotlabs/Module/Page.php:40 ../../Zotlabs/Module/Block.php:31
-msgid "Invalid item."
-msgstr "Ungültiges Element."
+#: ../../Zotlabs/Module/Removeme.php:61
+#: ../../Zotlabs/Module/Removeaccount.php:58
+msgid "WARNING: "
+msgstr "WARNUNG: "
-#: ../../Zotlabs/Module/Page.php:56 ../../Zotlabs/Module/Cal.php:62
-#: ../../Zotlabs/Module/Block.php:43 ../../Zotlabs/Module/Chanview.php:96
-#: ../../Zotlabs/Module/Wall_upload.php:31
-msgid "Channel not found."
-msgstr "Kanal nicht gefunden."
+#: ../../Zotlabs/Module/Removeme.php:61
+msgid "This channel will be completely removed from the network. "
+msgstr "Dieser Kanal wird vollständig aus dem Netzwerk gelöscht."
-#: ../../Zotlabs/Module/Page.php:131
-msgid ""
-"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod "
-"tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,"
-" quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo "
-"consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse "
-"cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat "
-"non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
-msgstr "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
+#: ../../Zotlabs/Module/Removeme.php:61
+#: ../../Zotlabs/Module/Removeaccount.php:58
+msgid "This action is permanent and can not be undone!"
+msgstr "Dieser Schritt ist endgültig und kann nicht rückgängig gemacht werden!"
-#: ../../Zotlabs/Module/Filer.php:52
-msgid "Save to Folder:"
-msgstr "Speichern in Ordner:"
+#: ../../Zotlabs/Module/Removeme.php:62
+#: ../../Zotlabs/Module/Removeaccount.php:59
+msgid "Please enter your password for verification:"
+msgstr "Bitte gib zur Bestätigung Dein Passwort ein:"
-#: ../../Zotlabs/Module/Filer.php:52
-msgid "- select -"
-msgstr "– auswählen –"
+#: ../../Zotlabs/Module/Removeme.php:63
+msgid "Remove this channel and all its clones from the network"
+msgstr "Lösche diesen Kanal und all seine Klone aus dem Netzwerk"
-#: ../../Zotlabs/Module/Filer.php:53 ../../Zotlabs/Module/Admin/Profs.php:74
-#: ../../Zotlabs/Module/Admin/Profs.php:94 ../../Zotlabs/Module/Rbmark.php:32
-#: ../../Zotlabs/Module/Rbmark.php:104 ../../include/widgets.php:202
-#: ../../include/text.php:1005 ../../include/text.php:1017
-msgid "Save"
-msgstr "Speichern"
+#: ../../Zotlabs/Module/Removeme.php:63
+msgid ""
+"By default only the instance of the channel located on this hub will be "
+"removed from the network"
+msgstr "Standardmäßig wird der Kanal nur auf diesem Server gelöscht, seine Klone verbleiben im Netzwerk"
-#: ../../Zotlabs/Module/Ping.php:254
-msgid "sent you a private message"
-msgstr "hat Dir eine private Nachricht geschickt"
+#: ../../Zotlabs/Module/Removeme.php:64
+#: ../../Zotlabs/Module/Settings/Channel.php:575
+msgid "Remove Channel"
+msgstr "Kanal löschen"
-#: ../../Zotlabs/Module/Ping.php:302
-msgid "added your channel"
-msgstr "hat deinen Kanal hinzugefügt"
+#: ../../Zotlabs/Module/Sharedwithme.php:99
+msgid "Files: shared with me"
+msgstr "Dateien, die mit mir geteilt wurden"
-#: ../../Zotlabs/Module/Ping.php:312
-msgid "g A l F d"
-msgstr "l, d. F, G:i \\U\\h\\r"
+#: ../../Zotlabs/Module/Sharedwithme.php:100
+#: ../../Zotlabs/Module/Admin/Channels.php:159
+#: ../../Zotlabs/Module/Settings/Oauth.php:89
+#: ../../Zotlabs/Module/Settings/Oauth.php:115
+#: ../../Zotlabs/Module/Wiki.php:172 ../../Zotlabs/Module/Connedit.php:902
+#: ../../Zotlabs/Module/Chat.php:249 ../../Zotlabs/Lib/NativeWikiPage.php:539
+#: ../../Zotlabs/Storage/Browser.php:233
+#: ../../Zotlabs/Widget/Wiki_page_history.php:22
+#: ../../addon/rendezvous/rendezvous.php:172
+#: ../../addon/cdav/Mod_Cdav.php:1136 ../../addon/gitwiki/Mod_Gitwiki.php:158
+msgid "Name"
+msgstr "Name"
-#: ../../Zotlabs/Module/Ping.php:330
-msgid "[today]"
-msgstr "[Heute]"
+#: ../../Zotlabs/Module/Sharedwithme.php:101
+msgid "NEW"
+msgstr "NEU"
-#: ../../Zotlabs/Module/Ping.php:339
-msgid "posted an event"
-msgstr "hat einen Termin veröffentlicht"
+#: ../../Zotlabs/Module/Sharedwithme.php:102
+#: ../../Zotlabs/Storage/Browser.php:235 ../../include/text.php:1409
+msgid "Size"
+msgstr "Größe"
-#: ../../Zotlabs/Module/Connections.php:56
-#: ../../Zotlabs/Module/Connections.php:161
-#: ../../Zotlabs/Module/Connections.php:250
-msgid "Blocked"
-msgstr "Blockiert"
+#: ../../Zotlabs/Module/Sharedwithme.php:103
+#: ../../Zotlabs/Storage/Browser.php:236
+msgid "Last Modified"
+msgstr "Zuletzt geändert"
-#: ../../Zotlabs/Module/Connections.php:61
-#: ../../Zotlabs/Module/Connections.php:168
-#: ../../Zotlabs/Module/Connections.php:249
-msgid "Ignored"
-msgstr "Ignoriert"
+#: ../../Zotlabs/Module/Sharedwithme.php:104
+msgid "Remove all files"
+msgstr "Alle Dateien löschen"
-#: ../../Zotlabs/Module/Connections.php:66
-#: ../../Zotlabs/Module/Connections.php:182
-#: ../../Zotlabs/Module/Connections.php:248
-msgid "Hidden"
-msgstr "Versteckt"
+#: ../../Zotlabs/Module/Sharedwithme.php:105
+msgid "Remove this file"
+msgstr "Diese Datei löschen"
-#: ../../Zotlabs/Module/Connections.php:71
-#: ../../Zotlabs/Module/Connections.php:175
-#: ../../Zotlabs/Module/Connections.php:247
-msgid "Archived"
-msgstr "Archiviert"
+#: ../../Zotlabs/Module/Setup.php:176
+msgid "$Projectname Server - Setup"
+msgstr "$Projectname Server-Einrichtung"
-#: ../../Zotlabs/Module/Connections.php:76
-#: ../../Zotlabs/Module/Connections.php:86 ../../Zotlabs/Module/Menu.php:116
-#: ../../include/conversation.php:1724
-msgid "New"
-msgstr "Neu"
+#: ../../Zotlabs/Module/Setup.php:180
+msgid "Could not connect to database."
+msgstr "Kann nicht mit der Datenbank verbinden."
-#: ../../Zotlabs/Module/Connections.php:92
-#: ../../Zotlabs/Module/Connections.php:107
-#: ../../Zotlabs/Module/Connedit.php:674 ../../include/widgets.php:544
-msgid "All"
-msgstr "Alle"
+#: ../../Zotlabs/Module/Setup.php:184
+msgid ""
+"Could not connect to specified site URL. Possible SSL certificate or DNS "
+"issue."
+msgstr "Konnte die angegebene Webseiten-URL nicht erreichen. Möglicherweise ein Problem mit dem SSL-Zertifikat oder dem DNS."
-#: ../../Zotlabs/Module/Connections.php:138
-msgid "New Connections"
-msgstr "Neue Verbindungen"
+#: ../../Zotlabs/Module/Setup.php:191
+msgid "Could not create table."
+msgstr "Konnte Tabelle nicht erstellen."
-#: ../../Zotlabs/Module/Connections.php:141
-msgid "Show pending (new) connections"
-msgstr "Ausstehende (neue) Verbindungsanfragen anzeigen"
+#: ../../Zotlabs/Module/Setup.php:196
+msgid "Your site database has been installed."
+msgstr "Die Datenbank Deines Hubs wurde installiert."
-#: ../../Zotlabs/Module/Connections.php:145
-#: ../../Zotlabs/Module/Profperm.php:140
-msgid "All Connections"
-msgstr "Alle Verbindungen"
+#: ../../Zotlabs/Module/Setup.php:200
+msgid ""
+"You may need to import the file \"install/schema_xxx.sql\" manually using a "
+"database client."
+msgstr "Möglicherweise musst Du die Datei install/schema_xxx.sql manuell mit Hilfe eines Datenkbank-Clients importieren."
-#: ../../Zotlabs/Module/Connections.php:148
-msgid "Show all connections"
-msgstr "Alle Verbindungen anzeigen"
+#: ../../Zotlabs/Module/Setup.php:201 ../../Zotlabs/Module/Setup.php:263
+#: ../../Zotlabs/Module/Setup.php:748
+msgid "Please see the file \"install/INSTALL.txt\"."
+msgstr "Lies die Datei \"install/INSTALL.txt\"."
-#: ../../Zotlabs/Module/Connections.php:164
-msgid "Only show blocked connections"
-msgstr "Nur blockierte Verbindungen anzeigen"
+#: ../../Zotlabs/Module/Setup.php:260
+msgid "System check"
+msgstr "Systemprüfung"
-#: ../../Zotlabs/Module/Connections.php:171
-msgid "Only show ignored connections"
-msgstr "Nur ignorierte Verbindungen anzeigen"
+#: ../../Zotlabs/Module/Setup.php:265
+msgid "Check again"
+msgstr "Nochmal prüfen"
-#: ../../Zotlabs/Module/Connections.php:178
-msgid "Only show archived connections"
-msgstr "Nur archivierte Verbindungen anzeigen"
+#: ../../Zotlabs/Module/Setup.php:287
+msgid "Database connection"
+msgstr "Datenbankverbindung"
-#: ../../Zotlabs/Module/Connections.php:185
-msgid "Only show hidden connections"
-msgstr "Nur versteckte Verbindungen anzeigen"
+#: ../../Zotlabs/Module/Setup.php:288
+msgid ""
+"In order to install $Projectname we need to know how to connect to your "
+"database."
+msgstr "Um $Projectname zu installieren, müssen wir wissen, wie wir eine Verbindung zu Deiner Datenbank aufbauen können."
-#: ../../Zotlabs/Module/Connections.php:246
-msgid "Pending approval"
-msgstr "Wartet auf Genehmigung"
+#: ../../Zotlabs/Module/Setup.php:289
+msgid ""
+"Please contact your hosting provider or site administrator if you have "
+"questions about these settings."
+msgstr "Bitte kontaktiere Deinen Hosting-Provider oder Administrator, falls Du Fragen zu diesen Einstellungen hast."
-#: ../../Zotlabs/Module/Connections.php:262
-#, php-format
-msgid "%1$s [%2$s]"
-msgstr "%1$s [%2$s]"
+#: ../../Zotlabs/Module/Setup.php:290
+msgid ""
+"The database you specify below should already exist. If it does not, please "
+"create it before continuing."
+msgstr "Die Datenbank, die Du weiter unten angibst, sollte bereits existieren. Sollte das noch nicht der Fall sein, erzeuge sie bitte bevor Du fortfährst."
-#: ../../Zotlabs/Module/Connections.php:263
-msgid "Edit connection"
-msgstr "Verbindung bearbeiten"
+#: ../../Zotlabs/Module/Setup.php:294
+msgid "Database Server Name"
+msgstr "Datenbankservername"
-#: ../../Zotlabs/Module/Connections.php:264
-msgid "Delete connection"
-msgstr "Verbindung löschen"
+#: ../../Zotlabs/Module/Setup.php:294
+msgid "Default is 127.0.0.1"
+msgstr "Standard ist 127.0.0.1"
-#: ../../Zotlabs/Module/Connections.php:273
-msgid "Channel address"
-msgstr "Kanaladresse"
+#: ../../Zotlabs/Module/Setup.php:295
+msgid "Database Port"
+msgstr "Datenbankport"
-#: ../../Zotlabs/Module/Connections.php:275
-msgid "Network"
-msgstr "Netzwerk"
+#: ../../Zotlabs/Module/Setup.php:295
+msgid "Communication port number - use 0 for default"
+msgstr "Port-Nummer für die Kommunikation – verwende 0 für die Standardeinstellung"
-#: ../../Zotlabs/Module/Connections.php:278
-msgid "Call"
-msgstr "Anruf"
+#: ../../Zotlabs/Module/Setup.php:296
+msgid "Database Login Name"
+msgstr "Datenbank-Benutzername"
-#: ../../Zotlabs/Module/Connections.php:280
-msgid "Status"
-msgstr "Status"
+#: ../../Zotlabs/Module/Setup.php:297
+msgid "Database Login Password"
+msgstr "Datenbank-Passwort"
-#: ../../Zotlabs/Module/Connections.php:282
-msgid "Connected"
-msgstr "Verbunden"
+#: ../../Zotlabs/Module/Setup.php:298
+msgid "Database Name"
+msgstr "Datenbankname"
-#: ../../Zotlabs/Module/Connections.php:284
-msgid "Approve connection"
-msgstr "Verbindung genehmigen"
+#: ../../Zotlabs/Module/Setup.php:299
+msgid "Database Type"
+msgstr "Datenbanktyp"
-#: ../../Zotlabs/Module/Connections.php:285
-#: ../../Zotlabs/Module/Admin/Accounts.php:171
-msgid "Approve"
-msgstr "Genehmigen"
+#: ../../Zotlabs/Module/Setup.php:301 ../../Zotlabs/Module/Setup.php:347
+msgid "Site administrator email address"
+msgstr "E-Mail Adresse des Seiten-Administrators"
-#: ../../Zotlabs/Module/Connections.php:286
-msgid "Ignore connection"
-msgstr "Verbindung ignorieren"
+#: ../../Zotlabs/Module/Setup.php:301 ../../Zotlabs/Module/Setup.php:347
+msgid ""
+"Your account email address must match this in order to use the web admin "
+"panel."
+msgstr "Die E-Mail-Adresse Deines Accounts muss dieser Adresse entsprechen, damit Du Zugriff zur Administrations-Seite erhältst."
-#: ../../Zotlabs/Module/Connections.php:287
-#: ../../Zotlabs/Module/Connedit.php:602
-msgid "Ignore"
-msgstr "Ignorieren"
+#: ../../Zotlabs/Module/Setup.php:302 ../../Zotlabs/Module/Setup.php:349
+msgid "Website URL"
+msgstr "Webseiten-URL"
-#: ../../Zotlabs/Module/Connections.php:288
-msgid "Recent activity"
-msgstr "Kürzliche Aktivitäten"
+#: ../../Zotlabs/Module/Setup.php:302 ../../Zotlabs/Module/Setup.php:349
+msgid "Please use SSL (https) URL if available."
+msgstr "Nutze wenn möglich eine SSL-URL (https)."
-#: ../../Zotlabs/Module/Connections.php:312 ../../Zotlabs/Lib/Apps.php:216
-#: ../../include/text.php:934 ../../include/nav.php:203
-msgid "Connections"
-msgstr "Verbindungen"
+#: ../../Zotlabs/Module/Setup.php:303 ../../Zotlabs/Module/Setup.php:353
+msgid "Please select a default timezone for your website"
+msgstr "Standard-Zeitzone für Deinen Server"
-#: ../../Zotlabs/Module/Connections.php:316 ../../Zotlabs/Module/Search.php:44
-#: ../../Zotlabs/Lib/Apps.php:237 ../../include/acl_selectors.php:213
-#: ../../include/widgets.php:316 ../../include/text.php:1004
-#: ../../include/text.php:1016 ../../include/nav.php:180
-msgid "Search"
-msgstr "Suche"
+#: ../../Zotlabs/Module/Setup.php:328 ../../Zotlabs/Module/Admin/Site.php:258
+msgid "Basic/Minimal Social Networking"
+msgstr "Einfaches/minimales soziales Netzwerken"
-#: ../../Zotlabs/Module/Connections.php:317
-msgid "Search your connections"
-msgstr "Verbindungen durchsuchen"
+#: ../../Zotlabs/Module/Setup.php:329 ../../Zotlabs/Module/Admin/Site.php:259
+msgid "Standard Configuration (default)"
+msgstr "Standardkonfiguration (Standard)"
-#: ../../Zotlabs/Module/Connections.php:318
-msgid "Connections search"
-msgstr "Verbindung suchen"
+#: ../../Zotlabs/Module/Setup.php:330 ../../Zotlabs/Module/Admin/Site.php:260
+msgid "Professional"
+msgstr "Professionell"
-#: ../../Zotlabs/Module/Connections.php:319
-#: ../../Zotlabs/Module/Directory.php:392
-#: ../../Zotlabs/Module/Directory.php:397 ../../include/contact_widgets.php:23
-msgid "Find"
-msgstr "Finde"
+#: ../../Zotlabs/Module/Setup.php:336
+msgid "Site settings"
+msgstr "Seiteneinstellungen"
-#: ../../Zotlabs/Module/Cover_photo.php:58
-#: ../../Zotlabs/Module/Profile_photo.php:61
-msgid "Image uploaded but image cropping failed."
-msgstr "Bild hochgeladen, aber das Zurechtschneiden schlug fehl."
+#: ../../Zotlabs/Module/Setup.php:351 ../../Zotlabs/Module/Admin/Site.php:289
+msgid "Server Configuration/Role"
+msgstr "Serverkonfiguration/Rolle"
-#: ../../Zotlabs/Module/Cover_photo.php:134
-#: ../../Zotlabs/Module/Cover_photo.php:181
-msgid "Cover Photos"
-msgstr "Cover Foto"
+#: ../../Zotlabs/Module/Setup.php:392
+msgid "PHP version 5.5 or greater is required."
+msgstr "PHP-Version 5.5 oder höher ist erforderlich."
-#: ../../Zotlabs/Module/Cover_photo.php:154
-#: ../../Zotlabs/Module/Profile_photo.php:135
-msgid "Image resize failed."
-msgstr "Bild-Anpassung fehlgeschlagen."
+#: ../../Zotlabs/Module/Setup.php:393
+msgid "PHP version"
+msgstr "PHP-Version"
-#: ../../Zotlabs/Module/Cover_photo.php:168
-#: ../../Zotlabs/Module/Profile_photo.php:197 ../../include/photos.php:149
-msgid "Unable to process image"
-msgstr "Kann Bild nicht verarbeiten"
+#: ../../Zotlabs/Module/Setup.php:409
+msgid "Could not find a command line version of PHP in the web server PATH."
+msgstr "Konnte die Kommandozeilen-Version von PHP nicht im PATH des Web-Servers finden."
-#: ../../Zotlabs/Module/Cover_photo.php:192
-#: ../../Zotlabs/Module/Profile_photo.php:232
-msgid "Image upload failed."
-msgstr "Hochladen des Bilds fehlgeschlagen."
+#: ../../Zotlabs/Module/Setup.php:410
+msgid ""
+"If you don't have a command line version of PHP installed on server, you "
+"will not be able to run background polling via cron."
+msgstr "Ohne Kommandozeilen-Version von PHP auf dem Server wirst Du nicht in der Lage sein, Hintergrundprozesse via cron auszuführen."
-#: ../../Zotlabs/Module/Cover_photo.php:210
-#: ../../Zotlabs/Module/Profile_photo.php:251
-msgid "Unable to process image."
-msgstr "Kann Bild nicht verarbeiten."
+#: ../../Zotlabs/Module/Setup.php:414
+msgid "PHP executable path"
+msgstr "PHP-Pfad zu ausführbarer Datei"
-#: ../../Zotlabs/Module/Cover_photo.php:233 ../../include/items.php:4276
-msgid "female"
-msgstr "weiblich"
+#: ../../Zotlabs/Module/Setup.php:414
+msgid ""
+"Enter full path to php executable. You can leave this blank to continue the "
+"installation."
+msgstr "Gib den vollen Pfad zum PHP-Interpreter an. Du kannst dieses Feld frei lassen und mit der Installation fortfahren."
-#: ../../Zotlabs/Module/Cover_photo.php:234 ../../include/items.php:4277
-#, php-format
-msgid "%1$s updated her %2$s"
-msgstr "%1$s hat ihr %2$s aktualisiert"
+#: ../../Zotlabs/Module/Setup.php:419
+msgid "Command line PHP"
+msgstr "PHP-Befehlszeile"
-#: ../../Zotlabs/Module/Cover_photo.php:235 ../../include/items.php:4278
-msgid "male"
-msgstr "männlich"
+#: ../../Zotlabs/Module/Setup.php:429
+msgid ""
+"Unable to check command line PHP, as shell_exec() is disabled. This is "
+"required."
+msgstr "Prüfung auf Kommandozeilen-PHP fehlgeschlagen, da shell_exec() deaktiviert ist. Dies wird aber benötigt."
-#: ../../Zotlabs/Module/Cover_photo.php:236 ../../include/items.php:4279
-#, php-format
-msgid "%1$s updated his %2$s"
-msgstr "%1$s hat sein %2$s aktualisiert"
+#: ../../Zotlabs/Module/Setup.php:432
+msgid ""
+"The command line version of PHP on your system does not have "
+"\"register_argc_argv\" enabled."
+msgstr "Bei der Kommandozeilen-Version von PHP auf Deinem System ist \"register_argc_argv\" nicht aktiviert."
-#: ../../Zotlabs/Module/Cover_photo.php:238 ../../include/items.php:4281
-#, php-format
-msgid "%1$s updated their %2$s"
-msgstr "%1$s hat sein/ihr %2$s aktualisiert"
+#: ../../Zotlabs/Module/Setup.php:433
+msgid "This is required for message delivery to work."
+msgstr "Das wird benötigt, damit die Auslieferung von Nachrichten funktioniert."
-#: ../../Zotlabs/Module/Cover_photo.php:240 ../../include/channel.php:1764
-msgid "cover photo"
-msgstr "Cover Foto"
+#: ../../Zotlabs/Module/Setup.php:436
+msgid "PHP register_argc_argv"
+msgstr "PHP register_argc_argv"
-#: ../../Zotlabs/Module/Cover_photo.php:303
-#: ../../Zotlabs/Module/Cover_photo.php:318
-#: ../../Zotlabs/Module/Profile_photo.php:312
-#: ../../Zotlabs/Module/Profile_photo.php:354
-msgid "Photo not available."
-msgstr "Foto nicht verfügbar."
+#: ../../Zotlabs/Module/Setup.php:454
+#, php-format
+msgid ""
+"Your max allowed total upload size is set to %s. Maximum size of one file to"
+" upload is set to %s. You are allowed to upload up to %d files at once."
+msgstr "Die Maximalgröße für Uploads insgesamt liegt bei %s. Die Maximalgröße für eine Datei liegt bei %s. Es können maximal %d Dateien gleichzeitig hochgeladen werden."
-#: ../../Zotlabs/Module/Cover_photo.php:354
-#: ../../Zotlabs/Module/Profile_photo.php:409
-msgid "Upload File:"
-msgstr "Datei hochladen:"
+#: ../../Zotlabs/Module/Setup.php:459
+msgid "You can adjust these settings in the server php.ini file."
+msgstr "Du kannst diese Einstellungen in der php.ini - Datei des Servers anpassen."
-#: ../../Zotlabs/Module/Cover_photo.php:355
-#: ../../Zotlabs/Module/Profile_photo.php:410
-msgid "Select a profile:"
-msgstr "Wähle ein Profil:"
+#: ../../Zotlabs/Module/Setup.php:461
+msgid "PHP upload limits"
+msgstr "PHP-Hochladebeschränkungen"
-#: ../../Zotlabs/Module/Cover_photo.php:356
-msgid "Upload Cover Photo"
-msgstr "Cover Foto hochladen"
+#: ../../Zotlabs/Module/Setup.php:484
+msgid ""
+"Error: the \"openssl_pkey_new\" function on this system is not able to "
+"generate encryption keys"
+msgstr "Fehler: Die „openssl_pkey_new“-Funktion auf diesem System ist nicht in der Lage, Schlüssel für die Verschlüsselung zu erzeugen."
-#: ../../Zotlabs/Module/Cover_photo.php:361
-#: ../../Zotlabs/Module/Profile_photo.php:418
-#: ../../Zotlabs/Module/Settings/Channel.php:404
-msgid "or"
-msgstr "oder"
+#: ../../Zotlabs/Module/Setup.php:485
+msgid ""
+"If running under Windows, please see "
+"\"http://www.php.net/manual/en/openssl.installation.php\"."
+msgstr "Wenn Du Windows verwendest, findest Du unter http://www.php.net/manual/en/openssl.installation.php eine Installationsanleitung."
-#: ../../Zotlabs/Module/Cover_photo.php:361
-#: ../../Zotlabs/Module/Profile_photo.php:418
-msgid "skip this step"
-msgstr "diesen Schritt überspringen"
+#: ../../Zotlabs/Module/Setup.php:488
+msgid "Generate encryption keys"
+msgstr "Verschlüsselungsschlüssel erzeugen"
-#: ../../Zotlabs/Module/Cover_photo.php:361
-#: ../../Zotlabs/Module/Profile_photo.php:418
-msgid "select a photo from your photo albums"
-msgstr "ein Foto aus meinen Fotoalben"
+#: ../../Zotlabs/Module/Setup.php:505
+msgid "libCurl PHP module"
+msgstr "libCurl-PHP-Modul"
-#: ../../Zotlabs/Module/Cover_photo.php:377
-#: ../../Zotlabs/Module/Profile_photo.php:437
-msgid "Crop Image"
-msgstr "Bild zuschneiden"
+#: ../../Zotlabs/Module/Setup.php:506
+msgid "GD graphics PHP module"
+msgstr "GD-Grafik-PHP-Modul"
-#: ../../Zotlabs/Module/Cover_photo.php:378
-#: ../../Zotlabs/Module/Profile_photo.php:438
-msgid "Please adjust the image cropping for optimum viewing."
-msgstr "Bitte schneide das Bild für eine optimale Anzeige passend zu."
+#: ../../Zotlabs/Module/Setup.php:507
+msgid "OpenSSL PHP module"
+msgstr "OpenSSL-PHP-Modul"
-#: ../../Zotlabs/Module/Cover_photo.php:380
-#: ../../Zotlabs/Module/Profile_photo.php:440
-msgid "Done Editing"
-msgstr "Bearbeitung fertigstellen"
+#: ../../Zotlabs/Module/Setup.php:508
+msgid "PDO database PHP module"
+msgstr "PDO-Datenbank-PHP-Modul"
-#: ../../Zotlabs/Module/Admin/Features.php:55
-#: ../../Zotlabs/Module/Admin/Features.php:56
-#: ../../Zotlabs/Module/Settings/Features.php:38
-msgid "Off"
-msgstr "Aus"
+#: ../../Zotlabs/Module/Setup.php:509
+msgid "mb_string PHP module"
+msgstr "mb_string-PHP-Modul"
-#: ../../Zotlabs/Module/Admin/Features.php:55
-#: ../../Zotlabs/Module/Admin/Features.php:56
-#: ../../Zotlabs/Module/Settings/Features.php:38
-msgid "On"
-msgstr "An"
+#: ../../Zotlabs/Module/Setup.php:510
+msgid "xml PHP module"
+msgstr "xml-PHP-Modul"
-#: ../../Zotlabs/Module/Admin/Features.php:56
-#, php-format
-msgid "Lock feature %s"
-msgstr "Blockiere die Funktion %s"
+#: ../../Zotlabs/Module/Setup.php:514 ../../Zotlabs/Module/Setup.php:516
+msgid "Apache mod_rewrite module"
+msgstr "Apache-mod_rewrite-Modul"
-#: ../../Zotlabs/Module/Admin/Features.php:64
-msgid "Manage Additional Features"
-msgstr "Zusätzliche Funktionen verwalten"
+#: ../../Zotlabs/Module/Setup.php:514
+msgid ""
+"Error: Apache webserver mod-rewrite module is required but not installed."
+msgstr "Fehler: Das Apache-Modul mod-rewrite wird benötigt, ist aber nicht installiert."
-#: ../../Zotlabs/Module/Admin/Logs.php:28
-msgid "Log settings updated."
-msgstr "Protokoll-Einstellungen aktualisiert."
+#: ../../Zotlabs/Module/Setup.php:520 ../../Zotlabs/Module/Setup.php:523
+msgid "exec"
+msgstr "exec"
-#: ../../Zotlabs/Module/Admin/Logs.php:83 ../../include/widgets.php:1618
-#: ../../include/widgets.php:1628
-msgid "Logs"
-msgstr "Protokolle"
+#: ../../Zotlabs/Module/Setup.php:520
+msgid ""
+"Error: exec is required but is either not installed or has been disabled in "
+"php.ini"
+msgstr "Fehler: exec ist erforderlich, aber entweder nicht installiert oder wurde in der php.ini deaktiviert"
-#: ../../Zotlabs/Module/Admin/Logs.php:85
-msgid "Clear"
-msgstr "Leeren"
+#: ../../Zotlabs/Module/Setup.php:526 ../../Zotlabs/Module/Setup.php:529
+msgid "shell_exec"
+msgstr "shell_exec"
-#: ../../Zotlabs/Module/Admin/Logs.php:91
-msgid "Debugging"
-msgstr "Debugging"
+#: ../../Zotlabs/Module/Setup.php:526
+msgid ""
+"Error: shell_exec is required but is either not installed or has been "
+"disabled in php.ini"
+msgstr "Fehler: shell_exec ist erforderlich, aber entweder nicht installiert oder wurde in der php.ini deaktiviert"
-#: ../../Zotlabs/Module/Admin/Logs.php:92
-msgid "Log file"
-msgstr "Protokolldatei"
+#: ../../Zotlabs/Module/Setup.php:534
+msgid "Error: libCURL PHP module required but not installed."
+msgstr "Fehler: Das PHP-Modul libCURL wird benötigt, ist aber nicht installiert."
-#: ../../Zotlabs/Module/Admin/Logs.php:92
+#: ../../Zotlabs/Module/Setup.php:538
msgid ""
-"Must be writable by web server. Relative to your top-level webserver "
-"directory."
-msgstr "Muss für den Web-Server schreibbar sein. Relativ zum Hubzilla-Stammverzeichnis."
+"Error: GD graphics PHP module with JPEG support required but not installed."
+msgstr "Fehler: Das PHP-Modul GD-Grafik mit JPEG-Unterstützung wird benötigt, ist aber nicht installiert."
-#: ../../Zotlabs/Module/Admin/Logs.php:93
-msgid "Log level"
-msgstr "Protokollstufe"
+#: ../../Zotlabs/Module/Setup.php:542
+msgid "Error: openssl PHP module required but not installed."
+msgstr "Fehler: Das PHP-Modul openssl wird benötigt, ist aber nicht installiert."
-#: ../../Zotlabs/Module/Admin/Profs.php:69
-msgid "New Profile Field"
-msgstr "Neues Profilfeld"
+#: ../../Zotlabs/Module/Setup.php:546
+msgid "Error: PDO database PHP module required but not installed."
+msgstr "Fehler: PDO-Datenbank-PHP-Modul ist erforderlich, aber nicht installiert."
-#: ../../Zotlabs/Module/Admin/Profs.php:70
-#: ../../Zotlabs/Module/Admin/Profs.php:90
-msgid "Field nickname"
-msgstr "Kurzname für das Feld"
+#: ../../Zotlabs/Module/Setup.php:550
+msgid "Error: mb_string PHP module required but not installed."
+msgstr "Fehler: Das PHP-Modul mb_string wird benötigt, ist aber nicht installiert."
-#: ../../Zotlabs/Module/Admin/Profs.php:70
-#: ../../Zotlabs/Module/Admin/Profs.php:90
-msgid "System name of field"
-msgstr "Systemname des Feldes"
+#: ../../Zotlabs/Module/Setup.php:554
+msgid "Error: xml PHP module required for DAV but not installed."
+msgstr "Fehler: Das xml-PHP-Modul wird für DAV benötigt, ist aber nicht installiert."
-#: ../../Zotlabs/Module/Admin/Profs.php:71
-#: ../../Zotlabs/Module/Admin/Profs.php:91
-msgid "Input type"
-msgstr "Art des Inhalts"
+#: ../../Zotlabs/Module/Setup.php:572
+msgid ""
+"The web installer needs to be able to create a file called \".htconfig.php\""
+" in the top folder of your web server and it is unable to do so."
+msgstr "Der Installations-Assistent muss in der Lage sein, die Datei \".htconfig.php\" im Stammverzeichnis des Web-Servers anzulegen, ist er aber nicht."
-#: ../../Zotlabs/Module/Admin/Profs.php:72
-#: ../../Zotlabs/Module/Admin/Profs.php:92
-msgid "Field Name"
-msgstr "Feldname"
+#: ../../Zotlabs/Module/Setup.php:573
+msgid ""
+"This is most often a permission setting, as the web server may not be able "
+"to write files in your folder - even if you can."
+msgstr "Meist liegt das daran, dass der Nutzer, unter dem der Web-Server läuft, keine Schreibrechte in dem Verzeichnis hat – selbst wenn Du selbst das darfst."
-#: ../../Zotlabs/Module/Admin/Profs.php:72
-#: ../../Zotlabs/Module/Admin/Profs.php:92
-msgid "Label on profile pages"
-msgstr "Bezeichnung auf Profilseiten"
+#: ../../Zotlabs/Module/Setup.php:574
+msgid ""
+"At the end of this procedure, we will give you a text to save in a file "
+"named .htconfig.php in your Red top folder."
+msgstr "Am Schluss dieses Vorgangs wird ein Text generiert, den Du unter dem Dateinamen .htconfig.php im Stammverzeichnis Deiner Hubzilla-Installation speichern musst."
-#: ../../Zotlabs/Module/Admin/Profs.php:73
-#: ../../Zotlabs/Module/Admin/Profs.php:93
-msgid "Help text"
-msgstr "Hilfetext"
+#: ../../Zotlabs/Module/Setup.php:575
+msgid ""
+"You can alternatively skip this procedure and perform a manual installation."
+" Please see the file \"install/INSTALL.txt\" for instructions."
+msgstr "Alternativ kannst Du diesen Schritt überspringen und die Installation manuell vornehmen. Lies dazu die Datei install/INSTALL.txt."
-#: ../../Zotlabs/Module/Admin/Profs.php:73
-#: ../../Zotlabs/Module/Admin/Profs.php:93
-msgid "Additional info (optional)"
-msgstr "Zusätzliche Informationen (optional)"
+#: ../../Zotlabs/Module/Setup.php:578
+msgid ".htconfig.php is writable"
+msgstr ".htconfig.php ist beschreibbar"
-#: ../../Zotlabs/Module/Admin/Profs.php:83
-msgid "Field definition not found"
-msgstr "Feld-Definition nicht gefunden"
+#: ../../Zotlabs/Module/Setup.php:592
+msgid ""
+"This software uses the Smarty3 template engine to render its web views. "
+"Smarty3 compiles templates to PHP to speed up rendering."
+msgstr "Diese Software verwendet die Smarty3 Template Engine, um Vorlagen für die Webdarstellung zu verarbeiten. Smarty3 übersetzt diese Vorlagen nach PHP, um die Darstellung zu beschleunigen."
-#: ../../Zotlabs/Module/Admin/Profs.php:89
-msgid "Edit Profile Field"
-msgstr "Profilfeld bearbeiten"
+#: ../../Zotlabs/Module/Setup.php:593
+#, php-format
+msgid ""
+"In order to store these compiled templates, the web server needs to have "
+"write access to the directory %s under the top level web folder."
+msgstr "Um diese kompilierten Vorlagen speichern zu können, braucht der Web-Server Schreibzugriff auf das Verzeichnis %s unterhalb des Hubzilla-Stammverzeichnisses."
-#: ../../Zotlabs/Module/Admin/Profs.php:147 ../../include/widgets.php:1599
-msgid "Profile Fields"
-msgstr "Profil Felder"
+#: ../../Zotlabs/Module/Setup.php:594 ../../Zotlabs/Module/Setup.php:615
+msgid ""
+"Please ensure that the user that your web server runs as (e.g. www-data) has"
+" write access to this folder."
+msgstr "Bitte stelle sicher, dass der Nutzer, unter dem der Web-Server läuft (z.B. www-data), Schreibzugriff auf dieses Verzeichnis hat."
-#: ../../Zotlabs/Module/Admin/Profs.php:148
-msgid "Basic Profile Fields"
-msgstr "Notwendige Profil Felder"
+#: ../../Zotlabs/Module/Setup.php:595
+#, php-format
+msgid ""
+"Note: as a security measure, you should give the web server write access to "
+"%s only--not the template files (.tpl) that it contains."
+msgstr "Hinweis: Aus Sicherheitsgründen sollte der Web-Server nur auf %s Schreibrechte haben, nicht auf die Template-Dateien (.tpl), die das Verzeichnis enthält."
-#: ../../Zotlabs/Module/Admin/Profs.php:149
-msgid "Advanced Profile Fields"
-msgstr "Erweiterte Profil Felder"
+#: ../../Zotlabs/Module/Setup.php:598
+#, php-format
+msgid "%s is writable"
+msgstr "%s ist beschreibbar"
-#: ../../Zotlabs/Module/Admin/Profs.php:149
-msgid "(In addition to basic fields)"
-msgstr "(zusätzlich zu notwendige Felder)"
+#: ../../Zotlabs/Module/Setup.php:614
+msgid ""
+"This software uses the store directory to save uploaded files. The web "
+"server needs to have write access to the store directory under the top level"
+" web folder"
+msgstr "Diese Software benutzt das Verzeichnis store, um hochgeladene Dateien zu speichern. Der Webserver benötigt Schreibrechte für dieses Verzeichnis direkt unterhalb des Web-Stammverzeichnisses."
-#: ../../Zotlabs/Module/Admin/Profs.php:151
-msgid "All available fields"
-msgstr "Alle verfügbaren Felder"
+#: ../../Zotlabs/Module/Setup.php:618
+msgid "store is writable"
+msgstr "store ist schreibbar"
-#: ../../Zotlabs/Module/Admin/Profs.php:152
-msgid "Custom Fields"
-msgstr "Benutzerdefinierte Felder"
+#: ../../Zotlabs/Module/Setup.php:650
+msgid ""
+"SSL certificate cannot be validated. Fix certificate or disable https access"
+" to this site."
+msgstr "Das SSL-Zertifikat konnte nicht validiert werden. Korrigiere das Zertifikat oder deaktiviere den HTTPS-Zugriff auf diesen Server."
-#: ../../Zotlabs/Module/Admin/Profs.php:156
-msgid "Create Custom Field"
-msgstr "Erstelle benutzerdefiniertes Feld"
+#: ../../Zotlabs/Module/Setup.php:651
+msgid ""
+"If you have https access to your website or allow connections to TCP port "
+"443 (the https: port), you MUST use a browser-valid certificate. You MUST "
+"NOT use self-signed certificates!"
+msgstr "Wenn Du via HTTPS auf Deinen Server zugreifen möchtest, also Verbindungen über den Port 443 möglich sein sollen, ist ein SSL-Zertifikat einer Zertifizierungsstelle (CA) notwendig, das von den Browsern ohne Sicherheitsabfrage akzeptiert wird. Die Verwendung eines selbst signierten Zertifikates ist nicht möglich."
-#: ../../Zotlabs/Module/Admin/Security.php:77
+#: ../../Zotlabs/Module/Setup.php:652
msgid ""
-"By default, unfiltered HTML is allowed in embedded media. This is inherently"
-" insecure."
-msgstr "Standardmäßig wird ungefiltertes HTML in eingebetteten Inhalten zugelassen. Das ist prinzipiell unsicher."
+"This restriction is incorporated because public posts from you may for "
+"example contain references to images on your own hub."
+msgstr "Diese Einschränkung wurde eingebaut, weil Deine öffentlichen Beiträge zum Beispiel Verweise auf Bilder auf Deinem eigenen Hub enthalten können."
-#: ../../Zotlabs/Module/Admin/Security.php:80
+#: ../../Zotlabs/Module/Setup.php:653
msgid ""
-"The recommended setting is to only allow unfiltered HTML from the following "
-"sites:"
-msgstr "Die empfohlene Einstellung ist, ungefiltertes HTML nur von den nachfolgenden Webseiten zu erlauben:"
+"If your certificate is not recognized, members of other sites (who may "
+"themselves have valid certificates) will get a warning message on their own "
+"site complaining about security issues."
+msgstr "Wenn Dein Zertifikat nicht von jedem Browser akzeptiert wird, erhalten die Mitglieder anderer $Projectname-Hubs (die mit korrekten Zertifikaten ausgestattet sind) Sicherheits-Warnmeldungen, obwohl sie gar nicht direkt auf Deinem Server unterwegs sind (zum Beispiel, wenn ein Bild aus einem Deiner Beiträge angezeigt wird)."
-#: ../../Zotlabs/Module/Admin/Security.php:81
+#: ../../Zotlabs/Module/Setup.php:654
msgid ""
-"https://youtube.com/<br />https://www.youtube.com/<br />https://youtu.be/<br"
-" />https://vimeo.com/<br />https://soundcloud.com/<br />"
-msgstr "https://youtube.com/<br />https://www.youtube.com/<br />https://youtu.be/<br />https://vimeo.com/<br />https://soundcloud.com/<br />"
+"This can cause usability issues elsewhere (not just on your own site) so we "
+"must insist on this requirement."
+msgstr "Dies kann Probleme für andere Nutzer (nicht nur auf Deinem eigenen Server) verursachen, so dass wir auf dieser Forderung bestehen müssen."
-#: ../../Zotlabs/Module/Admin/Security.php:82
+#: ../../Zotlabs/Module/Setup.php:655
msgid ""
-"All other embedded content will be filtered, <strong>unless</strong> "
-"embedded content from that site is explicitly blocked."
-msgstr "Alle anderen eingebetteten Inhalte werden gefiltert, <strong>es sei denn</strong>, eingebettete Inhalte von einer bestimmten Seite sind explizit blockiert."
+"Providers are available that issue free certificates which are browser-"
+"valid."
+msgstr "Es gibt einige Zertifizierungsstellen (CAs), bei denen solche Zertifikate kostenlos zu haben sind."
-#: ../../Zotlabs/Module/Admin/Security.php:87 ../../include/widgets.php:1594
-msgid "Security"
-msgstr "Sicherheit"
+#: ../../Zotlabs/Module/Setup.php:657
+msgid ""
+"If you are confident that the certificate is valid and signed by a trusted "
+"authority, check to see if you have failed to install an intermediate cert. "
+"These are not normally required by browsers, but are required for server-to-"
+"server communications."
+msgstr "Wenn Du sicher bist, dass das Zertifikat gültig und von einer vertrauenswürdigen Zertifizierungsstelle signiert ist, prüfe auf ggf. noch zu installierende Zwischenzertifikate (intermediate). Diese werden nicht unbedingt von Browsern benötigt, aber sehr wohl für die Kommunikation zwischen Servern."
-#: ../../Zotlabs/Module/Admin/Security.php:89
-msgid "Block public"
-msgstr "Öffentlichen Zugriff blockieren"
+#: ../../Zotlabs/Module/Setup.php:659
+msgid "SSL certificate validation"
+msgstr "SSL Zertifikatverifizierung"
-#: ../../Zotlabs/Module/Admin/Security.php:89
+#: ../../Zotlabs/Module/Setup.php:665
msgid ""
-"Check to block public access to all otherwise public personal pages on this "
-"site unless you are currently authenticated."
-msgstr "Blockiere den öffentlichen Zugriff auf alle ansonsten öffentlichen persönlichen Seiten dieser Website, sofern ein Besucher nicht angemeldet ist."
+"Url rewrite in .htaccess is not working. Check your server "
+"configuration.Test: "
+msgstr "Das Umschreiben von URLs (rewrite) per .htaccess funktioniert nicht. Bitte prüfe die Server-Konfiguration. Test:"
-#: ../../Zotlabs/Module/Admin/Security.php:90
-msgid "Set \"Transport Security\" HTTP header"
-msgstr "Setze den \"Transport Security\" HTTP Header"
+#: ../../Zotlabs/Module/Setup.php:668
+msgid "Url rewrite is working"
+msgstr "Url rewrite funktioniert"
-#: ../../Zotlabs/Module/Admin/Security.php:91
-msgid "Set \"Content Security Policy\" HTTP header"
-msgstr "Setze den \"Content Security Policy\" HTTP Header"
+#: ../../Zotlabs/Module/Setup.php:682
+msgid ""
+"The database configuration file \".htconfig.php\" could not be written. "
+"Please use the enclosed text to create a configuration file in your web "
+"server root."
+msgstr "Die Datenbank-Konfigurationsdatei „.htconfig.php“ konnte nicht geschrieben werden. Bitte verwende den unten angegebenen Text, um die Konfigurationsdatei im Stammverzeichnis des Webservers anzulegen."
-#: ../../Zotlabs/Module/Admin/Security.php:92
-msgid "Allowed email domains"
-msgstr "Erlaubte Domains für E-Mails"
+#: ../../Zotlabs/Module/Setup.php:706
+#: ../../addon/rendezvous/rendezvous.php:401 ../../addon/cdav/cdav.php:41
+msgid "Errors encountered creating database tables."
+msgstr "Fehler beim Anlegen der Datenbank-Tabellen aufgetreten."
-#: ../../Zotlabs/Module/Admin/Security.php:92
+#: ../../Zotlabs/Module/Setup.php:746
+msgid "<h1>What next</h1>"
+msgstr "<h1>Was als Nächstes</h1>"
+
+#: ../../Zotlabs/Module/Setup.php:747
msgid ""
-"Comma separated list of domains which are allowed in email addresses for "
-"registrations to this site. Wildcards are accepted. Empty to allow any "
-"domains"
-msgstr "Liste der Domains, die für E-Mail-Adressen bei der Registrierung erlaubt sind, durch Kommas getrennt. Platzhalter werden akzeptiert. Leer lassen, um alle Domains zu erlauben."
+"IMPORTANT: You will need to [manually] setup a scheduled task for the "
+"poller."
+msgstr "WICHTIG: Du musst [manuell] einen Cronjob für den Poller einrichten."
-#: ../../Zotlabs/Module/Admin/Security.php:93
-msgid "Not allowed email domains"
-msgstr "Nicht erlaubte Domains für E-Mails"
+#: ../../Zotlabs/Module/Connect.php:61 ../../Zotlabs/Module/Connect.php:109
+msgid "Continue"
+msgstr "Fortfahren"
-#: ../../Zotlabs/Module/Admin/Security.php:93
-msgid ""
-"Comma separated list of domains which are not allowed in email addresses for"
-" registrations to this site. Wildcards are accepted. Empty to allow any "
-"domains, unless allowed domains have been defined."
-msgstr "Domains in E-Mail-Adressen, die keine Erlaubnis erhalten, sich auf Deinem Hub zu registrieren. Mehrere Domains können durch Kommas getrennt werden. Platzhalter (*/?) sind möglich. Keine Eingabe bedeutet keine Einschränkung, unabhängig davon, ob unter erlaubte Domains etwas eingegeben wurde."
+#: ../../Zotlabs/Module/Connect.php:90
+msgid "Premium Channel Setup"
+msgstr "Premium-Kanal-Einrichtung"
-#: ../../Zotlabs/Module/Admin/Security.php:94
-msgid "Allow communications only from these sites"
-msgstr "Kommunikation nur von diesen Servern/Domains erlauben"
+#: ../../Zotlabs/Module/Connect.php:92
+msgid "Enable premium channel connection restrictions"
+msgstr "Einschränkungen für einen Premium-Kanal aktivieren"
-#: ../../Zotlabs/Module/Admin/Security.php:94
+#: ../../Zotlabs/Module/Connect.php:93
msgid ""
-"One site per line. Leave empty to allow communication from anywhere by "
-"default"
-msgstr "Ein Eintrag pro Zeile. Lasse das Feld leer, um Kommunikation grundlegend von überall her zu erlauben."
+"Please enter your restrictions or conditions, such as paypal receipt, usage "
+"guidelines, etc."
+msgstr "Bitte gib Deine Nutzungsbedingungen ein, z.B. Paypal-Quittung, Richtlinien etc."
-#: ../../Zotlabs/Module/Admin/Security.php:95
-msgid "Block communications from these sites"
-msgstr "Kommunikation von diesen Servern/Domains blockieren"
+#: ../../Zotlabs/Module/Connect.php:95 ../../Zotlabs/Module/Connect.php:115
+msgid ""
+"This channel may require additional steps or acknowledgement of the "
+"following conditions prior to connecting:"
+msgstr "Unter Umständen sind weitere Schritte oder die Bestätigung der folgenden Bedingungen vor dem Verbinden mit diesem Kanal nötig."
-#: ../../Zotlabs/Module/Admin/Security.php:96
-msgid "Allow communications only from these channels"
-msgstr "Kommunikation nur von diesen Kanälen erlauben"
+#: ../../Zotlabs/Module/Connect.php:96
+msgid ""
+"Potential connections will then see the following text before proceeding:"
+msgstr "Potentielle Kontakte werden den folgenden Text sehen, bevor fortgefahren wird:"
-#: ../../Zotlabs/Module/Admin/Security.php:96
+#: ../../Zotlabs/Module/Connect.php:97 ../../Zotlabs/Module/Connect.php:118
msgid ""
-"One channel (hash) per line. Leave empty to allow from any channel by "
-"default"
-msgstr "Ein Kanal (hash) pro Zeile. Leerlassen um jeden Kanal zuzulassen. "
+"By continuing, I certify that I have complied with any instructions provided"
+" on this page."
+msgstr "Indem ich fortfahre, bestätige ich die Erfüllung aller Anweisungen auf dieser Seite."
-#: ../../Zotlabs/Module/Admin/Security.php:97
-msgid "Block communications from these channels"
-msgstr "Kommunikation von folgenden Kanälen blockieren"
+#: ../../Zotlabs/Module/Connect.php:106
+msgid "(No specific instructions have been provided by the channel owner.)"
+msgstr "(Der Kanal-Besitzer hat keine speziellen Anweisungen hinterlegt.)"
-#: ../../Zotlabs/Module/Admin/Security.php:98
-msgid "Only allow embeds from secure (SSL) websites and links."
-msgstr "Erlaube Einbettungen nur von sicheren (SSL) Webseiten und Links."
+#: ../../Zotlabs/Module/Connect.php:114
+msgid "Restricted or Premium Channel"
+msgstr "Eingeschränkter oder Premium-Kanal"
-#: ../../Zotlabs/Module/Admin/Security.php:99
-msgid "Allow unfiltered embedded HTML content only from these domains"
-msgstr "Erlaube Einbettung von Inhalten mit ungefiltertem HTML nur von diesen Domains"
+#: ../../Zotlabs/Module/Admin/Queue.php:35
+msgid "Queue Statistics"
+msgstr "Warteschlangenstatistiken"
-#: ../../Zotlabs/Module/Admin/Security.php:99
-msgid "One site per line. By default embedded content is filtered."
-msgstr "Eine Website/Domain pro Zeile. Standardmäßig wird eingebetteter Inhalt gefiltert."
+#: ../../Zotlabs/Module/Admin/Queue.php:36
+msgid "Total Entries"
+msgstr "Einträge insgesamt"
-#: ../../Zotlabs/Module/Admin/Security.php:100
-msgid "Block embedded HTML from these domains"
-msgstr "Eingebettete HTML Inhalte von diesen Servern/Domains blockieren"
+#: ../../Zotlabs/Module/Admin/Queue.php:37
+msgid "Priority"
+msgstr "Priorität"
-#: ../../Zotlabs/Module/Admin/Themes.php:18
-msgid "Theme settings updated."
-msgstr "Theme-Einstellungen aktualisiert."
+#: ../../Zotlabs/Module/Admin/Queue.php:38
+msgid "Destination URL"
+msgstr "Ziel-URL"
-#: ../../Zotlabs/Module/Admin/Themes.php:58
-msgid "No themes found."
-msgstr "Keine Theme gefunden."
+#: ../../Zotlabs/Module/Admin/Queue.php:39
+msgid "Mark hub permanently offline"
+msgstr "Hub als permanent offline markieren"
-#: ../../Zotlabs/Module/Admin/Themes.php:93
-#: ../../Zotlabs/Module/Admin/Plugins.php:305
+#: ../../Zotlabs/Module/Admin/Queue.php:40
+msgid "Empty queue for this hub"
+msgstr "Warteschlange für diesen Hub leeren"
+
+#: ../../Zotlabs/Module/Admin/Queue.php:41
+msgid "Last known contact"
+msgstr "Letzter Kontakt"
+
+#: ../../Zotlabs/Module/Admin/Features.php:55
+#: ../../Zotlabs/Module/Admin/Features.php:56
+#: ../../Zotlabs/Module/Settings/Features.php:38
+msgid "Off"
+msgstr "Aus"
+
+#: ../../Zotlabs/Module/Admin/Features.php:55
+#: ../../Zotlabs/Module/Admin/Features.php:56
+#: ../../Zotlabs/Module/Settings/Features.php:38
+msgid "On"
+msgstr "An"
+
+#: ../../Zotlabs/Module/Admin/Features.php:56
+#, php-format
+msgid "Lock feature %s"
+msgstr "Blockiere die Funktion %s"
+
+#: ../../Zotlabs/Module/Admin/Features.php:64
+msgid "Manage Additional Features"
+msgstr "Zusätzliche Funktionen verwalten"
+
+#: ../../Zotlabs/Module/Admin/Dbsync.php:19
+msgid "Update has been marked successful"
+msgstr "Update wurde als erfolgreich markiert"
+
+#: ../../Zotlabs/Module/Admin/Dbsync.php:29
+#, php-format
+msgid "Executing %s failed. Check system logs."
+msgstr "Ausführen von %s fehlgeschlagen. Überprüfe die Systemprotokolle."
+
+#: ../../Zotlabs/Module/Admin/Dbsync.php:32
+#, php-format
+msgid "Update %s was successfully applied."
+msgstr "Update %s wurde erfolgreich ausgeführt."
+
+#: ../../Zotlabs/Module/Admin/Dbsync.php:36
+#, php-format
+msgid "Update %s did not return a status. Unknown if it succeeded."
+msgstr "Update %s lieferte keinen Rückgabewert. Erfolg unbekannt."
+
+#: ../../Zotlabs/Module/Admin/Dbsync.php:39
+#, php-format
+msgid "Update function %s could not be found."
+msgstr "Update-Funktion %s konnte nicht gefunden werden."
+
+#: ../../Zotlabs/Module/Admin/Dbsync.php:55
+msgid "No failed updates."
+msgstr "Keine fehlgeschlagenen Aktualisierungen."
+
+#: ../../Zotlabs/Module/Admin/Dbsync.php:59
+msgid "Failed Updates"
+msgstr "Fehlgeschlagene Aktualisierungen"
+
+#: ../../Zotlabs/Module/Admin/Dbsync.php:61
+msgid "Mark success (if update was manually applied)"
+msgstr "Als erfolgreich markieren (wenn das Update manuell ausgeführt wurde)"
+
+#: ../../Zotlabs/Module/Admin/Dbsync.php:62
+msgid "Attempt to execute this update step automatically"
+msgstr "Versuche, diesen Updateschritt automatisch auszuführen"
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:259
+#: ../../Zotlabs/Module/Admin/Themes.php:72 ../../Zotlabs/Module/Thing.php:89
+#: ../../Zotlabs/Module/Viewsrc.php:25 ../../Zotlabs/Module/Display.php:35
+#: ../../Zotlabs/Module/Filestorage.php:32 ../../Zotlabs/Module/Admin.php:60
+#: ../../include/items.php:3391
+msgid "Item not found."
+msgstr "Element nicht gefunden."
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:289
+#, php-format
+msgid "Plugin %s disabled."
+msgstr "Plug-In %s deaktiviert."
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:294
+#, php-format
+msgid "Plugin %s enabled."
+msgstr "Plug-In %s aktiviert."
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:310
+#: ../../Zotlabs/Module/Admin/Themes.php:95
msgid "Disable"
msgstr "Deaktivieren"
-#: ../../Zotlabs/Module/Admin/Themes.php:95
-#: ../../Zotlabs/Module/Admin/Plugins.php:308
+#: ../../Zotlabs/Module/Admin/Plugins.php:313
+#: ../../Zotlabs/Module/Admin/Themes.php:97
msgid "Enable"
msgstr "Aktivieren"
-#: ../../Zotlabs/Module/Admin/Themes.php:114
-msgid "Screenshot"
-msgstr "Bildschirmfoto"
+#: ../../Zotlabs/Module/Admin/Plugins.php:341
+#: ../../Zotlabs/Module/Admin/Plugins.php:436
+#: ../../Zotlabs/Module/Admin/Accounts.php:164
+#: ../../Zotlabs/Module/Admin/Logs.php:82
+#: ../../Zotlabs/Module/Admin/Channels.php:145
+#: ../../Zotlabs/Module/Admin/Themes.php:122
+#: ../../Zotlabs/Module/Admin/Themes.php:156
+#: ../../Zotlabs/Module/Admin/Site.php:277
+#: ../../Zotlabs/Module/Admin/Security.php:86
+#: ../../Zotlabs/Module/Admin.php:137
+msgid "Administration"
+msgstr "Administration"
-#: ../../Zotlabs/Module/Admin/Themes.php:121
-#: ../../Zotlabs/Module/Admin/Themes.php:155 ../../include/widgets.php:1597
-msgid "Themes"
-msgstr "Themes"
+#: ../../Zotlabs/Module/Admin/Plugins.php:342
+#: ../../Zotlabs/Module/Admin/Plugins.php:437
+#: ../../Zotlabs/Widget/Admin.php:27
+msgid "Plugins"
+msgstr "Plug-Ins"
-#: ../../Zotlabs/Module/Admin/Themes.php:122
-#: ../../Zotlabs/Module/Admin/Plugins.php:338
+#: ../../Zotlabs/Module/Admin/Plugins.php:343
+#: ../../Zotlabs/Module/Admin/Themes.php:124
msgid "Toggle"
msgstr "Umschalten"
-#: ../../Zotlabs/Module/Admin/Themes.php:123
-#: ../../Zotlabs/Module/Admin/Plugins.php:339 ../../Zotlabs/Lib/Apps.php:223
-#: ../../include/widgets.php:699 ../../include/nav.php:225
+#: ../../Zotlabs/Module/Admin/Plugins.php:344
+#: ../../Zotlabs/Module/Admin/Themes.php:125 ../../Zotlabs/Lib/Apps.php:223
+#: ../../Zotlabs/Widget/Settings_menu.php:131 ../../include/nav.php:207
msgid "Settings"
msgstr "Einstellungen"
-#: ../../Zotlabs/Module/Admin/Themes.php:132
-#: ../../Zotlabs/Module/Admin/Plugins.php:346
+#: ../../Zotlabs/Module/Admin/Plugins.php:351
+#: ../../Zotlabs/Module/Admin/Themes.php:134
msgid "Author: "
msgstr "Autor: "
-#: ../../Zotlabs/Module/Admin/Themes.php:133
-#: ../../Zotlabs/Module/Admin/Plugins.php:347
+#: ../../Zotlabs/Module/Admin/Plugins.php:352
+#: ../../Zotlabs/Module/Admin/Themes.php:135
msgid "Maintainer: "
msgstr "Betreuer:"
-#: ../../Zotlabs/Module/Admin/Themes.php:160
-msgid "[Experimental]"
-msgstr "[Experimentell]"
+#: ../../Zotlabs/Module/Admin/Plugins.php:353
+msgid "Minimum project version: "
+msgstr "Minimale Version des Projekts:"
-#: ../../Zotlabs/Module/Admin/Themes.php:161
-msgid "[Unsupported]"
-msgstr "[Nicht unterstützt]"
+#: ../../Zotlabs/Module/Admin/Plugins.php:354
+msgid "Maximum project version: "
+msgstr "Maximale Version des Projekts:"
-#: ../../Zotlabs/Module/Admin/Account_edit.php:29
-#, php-format
-msgid "Password changed for account %d."
-msgstr "Passwort für Konto %d geändert."
+#: ../../Zotlabs/Module/Admin/Plugins.php:355
+msgid "Minimum PHP version: "
+msgstr "Minimale PHP Version:"
-#: ../../Zotlabs/Module/Admin/Account_edit.php:46
-msgid "Account settings updated."
-msgstr "Kontoeinstellungen aktualisiert."
+#: ../../Zotlabs/Module/Admin/Plugins.php:356
+msgid "Compatible Server Roles: "
+msgstr "Kompatible Serverrollen: "
-#: ../../Zotlabs/Module/Admin/Account_edit.php:61
-msgid "Account not found."
-msgstr "Konto nicht gefunden."
+#: ../../Zotlabs/Module/Admin/Plugins.php:357
+msgid "Requires: "
+msgstr "Benötigt:"
-#: ../../Zotlabs/Module/Admin/Account_edit.php:68
-msgid "Account Edit"
-msgstr "Kontobearbeitung"
+#: ../../Zotlabs/Module/Admin/Plugins.php:358
+#: ../../Zotlabs/Module/Admin/Plugins.php:442
+msgid "Disabled - version incompatibility"
+msgstr "Abgeschaltet - Versionsinkompatibilität"
-#: ../../Zotlabs/Module/Admin/Account_edit.php:69
-msgid "New Password"
-msgstr "Neues Passwort"
+#: ../../Zotlabs/Module/Admin/Plugins.php:411
+msgid "Enter the public git repository URL of the plugin repo."
+msgstr "Gib die öffentliche Git-Repository-URL des Plugin-Repository an."
-#: ../../Zotlabs/Module/Admin/Account_edit.php:70
-msgid "New Password again"
-msgstr "Neues Passwort wiederholen"
+#: ../../Zotlabs/Module/Admin/Plugins.php:412
+msgid "Plugin repo git URL"
+msgstr "Plugin-Repository Git URL"
-#: ../../Zotlabs/Module/Admin/Account_edit.php:71
-msgid "Technical skill level"
-msgstr "Technische Qualifikationsstufe"
+#: ../../Zotlabs/Module/Admin/Plugins.php:413
+msgid "Custom repo name"
+msgstr "Benutzerdefinierter Repository-Name"
-#: ../../Zotlabs/Module/Admin/Account_edit.php:72
-msgid "Account language (for emails)"
-msgstr "Kontosprache (für E-Mails)"
+#: ../../Zotlabs/Module/Admin/Plugins.php:413
+msgid "(optional)"
+msgstr "(optional)"
-#: ../../Zotlabs/Module/Admin/Account_edit.php:73
-msgid "Service class"
-msgstr "Dienstklasse"
+#: ../../Zotlabs/Module/Admin/Plugins.php:414
+msgid "Download Plugin Repo"
+msgstr "Plugin-Repository herunterladen"
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:421
+msgid "Install new repo"
+msgstr "Neues Repository installieren"
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:422 ../../Zotlabs/Lib/Apps.php:358
+msgid "Install"
+msgstr "Installieren"
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:423
+#: ../../Zotlabs/Module/Settings/Oauth.php:88
+#: ../../Zotlabs/Module/Settings/Oauth.php:114
+#: ../../Zotlabs/Module/Wiki.php:265 ../../Zotlabs/Module/Wiki.php:290
+#: ../../Zotlabs/Module/Connedit.php:920 ../../Zotlabs/Module/Fbrowser.php:66
+#: ../../Zotlabs/Module/Fbrowser.php:88 ../../Zotlabs/Module/Profiles.php:804
+#: ../../Zotlabs/Module/Filer.php:55 ../../Zotlabs/Module/Tagrm.php:15
+#: ../../Zotlabs/Module/Tagrm.php:138 ../../addon/cdav/Mod_Cdav.php:866
+#: ../../addon/cdav/Mod_Cdav.php:1154 ../../addon/js_upload/js_upload.php:46
+#: ../../addon/gitwiki/Mod_Gitwiki.php:244
+#: ../../addon/gitwiki/Mod_Gitwiki.php:267 ../../include/conversation.php:1327
+#: ../../include/conversation.php:1376
+msgid "Cancel"
+msgstr "Abbrechen"
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:445
+msgid "Manage Repos"
+msgstr "Repositorien verwalten"
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:446
+msgid "Installed Plugin Repositories"
+msgstr "Installierte Plugin-Repositorien"
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:447
+msgid "Install a New Plugin Repository"
+msgstr "Ein neues Plugin-Repository installieren"
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:453
+#: ../../Zotlabs/Module/Settings/Oauth.php:42
+#: ../../Zotlabs/Module/Settings/Oauth.php:113
+#: ../../Zotlabs/Module/Connedit.php:918 ../../Zotlabs/Module/Profiles.php:802
+#: ../../Zotlabs/Lib/Apps.php:358 ../../addon/cdav/Mod_Cdav.php:1152
+msgid "Update"
+msgstr "Aktualisieren"
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:454
+msgid "Switch branch"
+msgstr "Zweig/Branch wechseln"
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:455
+#: ../../Zotlabs/Module/Photos.php:960 ../../Zotlabs/Module/Tagrm.php:137
+#: ../../addon/superblock/superblock.php:116
+msgid "Remove"
+msgstr "Entfernen"
#: ../../Zotlabs/Module/Admin/Accounts.php:36
#, php-format
@@ -2087,7 +2187,8 @@ msgid "Account '%s' unblocked"
msgstr "Konto '%s' freigegeben"
#: ../../Zotlabs/Module/Admin/Accounts.php:165
-#: ../../Zotlabs/Module/Admin/Accounts.php:178 ../../include/widgets.php:1592
+#: ../../Zotlabs/Module/Admin/Accounts.php:178
+#: ../../Zotlabs/Widget/Admin.php:23
msgid "Accounts"
msgstr "Konten"
@@ -2106,13 +2207,10 @@ msgstr "Antragsdatum"
#: ../../Zotlabs/Module/Admin/Accounts.php:169
#: ../../Zotlabs/Module/Admin/Accounts.php:181
-#: ../../Zotlabs/Module/Connedit.php:871
-#: ../../extend/addon/addon/redred/redred.php:107
-#: ../../extend/addon/addon/rtof/rtof.php:93
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1140
-#: ../../extend/addon/addon/openid/MysqlProvider.php:56
-#: ../../extend/addon/addon/openid/MysqlProvider.php:57
-#: ../../include/network.php:2247
+#: ../../Zotlabs/Module/Connedit.php:906 ../../Zotlabs/Module/Profiles.php:790
+#: ../../addon/cdav/Mod_Cdav.php:1140 ../../addon/openid/MysqlProvider.php:56
+#: ../../addon/openid/MysqlProvider.php:57 ../../addon/rtof/rtof.php:93
+#: ../../addon/redred/redred.php:107 ../../include/network.php:2315
msgid "Email"
msgstr "E-Mail"
@@ -2120,17 +2218,22 @@ msgstr "E-Mail"
msgid "No registrations."
msgstr "Keine Registrierungen."
+#: ../../Zotlabs/Module/Admin/Accounts.php:171
+#: ../../Zotlabs/Module/Connections.php:281
+msgid "Approve"
+msgstr "Genehmigen"
+
#: ../../Zotlabs/Module/Admin/Accounts.php:172
msgid "Deny"
msgstr "Verweigern"
#: ../../Zotlabs/Module/Admin/Accounts.php:174
-#: ../../Zotlabs/Module/Connedit.php:594
+#: ../../Zotlabs/Module/Connedit.php:618
msgid "Block"
msgstr "Blockieren"
#: ../../Zotlabs/Module/Admin/Accounts.php:175
-#: ../../Zotlabs/Module/Connedit.php:594
+#: ../../Zotlabs/Module/Connedit.php:618
msgid "Unblock"
msgstr "Freigeben"
@@ -2170,6 +2273,37 @@ msgid ""
"this site will be permanently deleted!\\n\\nAre you sure?"
msgstr "Das Konto {0} wird gelöscht!\\n\\nAlles, was dieses Konto auf diesem Hub veröffentlicht hat, wird endgültig gelöscht werden!\\n\\nBist Du sicher?"
+#: ../../Zotlabs/Module/Admin/Logs.php:28
+msgid "Log settings updated."
+msgstr "Protokoll-Einstellungen aktualisiert."
+
+#: ../../Zotlabs/Module/Admin/Logs.php:83 ../../Zotlabs/Widget/Admin.php:48
+#: ../../Zotlabs/Widget/Admin.php:58
+msgid "Logs"
+msgstr "Protokolle"
+
+#: ../../Zotlabs/Module/Admin/Logs.php:85
+msgid "Clear"
+msgstr "Leeren"
+
+#: ../../Zotlabs/Module/Admin/Logs.php:91
+msgid "Debugging"
+msgstr "Debugging"
+
+#: ../../Zotlabs/Module/Admin/Logs.php:92
+msgid "Log file"
+msgstr "Protokolldatei"
+
+#: ../../Zotlabs/Module/Admin/Logs.php:92
+msgid ""
+"Must be writable by web server. Relative to your top-level webserver "
+"directory."
+msgstr "Muss für den Web-Server schreibbar sein. Relativ zum Hubzilla-Stammverzeichnis."
+
+#: ../../Zotlabs/Module/Admin/Logs.php:93
+msgid "Log level"
+msgstr "Protokollstufe"
+
#: ../../Zotlabs/Module/Admin/Channels.php:31
#, php-format
msgid "%s channel censored/uncensored"
@@ -2220,7 +2354,8 @@ msgstr "Code für Kanal '%s' freigegeben"
msgid "Channel '%s' code disallowed"
msgstr "Code für Kanal '%s' gesperrt"
-#: ../../Zotlabs/Module/Admin/Channels.php:146 ../../include/widgets.php:1593
+#: ../../Zotlabs/Module/Admin/Channels.php:146
+#: ../../Zotlabs/Widget/Admin.php:24
msgid "Channels"
msgstr "Kanäle"
@@ -2241,7 +2376,7 @@ msgid "Disallow Code"
msgstr "Code sperren"
#: ../../Zotlabs/Module/Admin/Channels.php:154
-#: ../../include/conversation.php:1815
+#: ../../include/conversation.php:1760 ../../include/nav.php:369
msgid "Channel"
msgstr "Kanal"
@@ -2249,13 +2384,6 @@ msgstr "Kanal"
msgid "UID"
msgstr "UID"
-#: ../../Zotlabs/Module/Admin/Channels.php:160
-#: ../../Zotlabs/Module/Locs.php:118 ../../Zotlabs/Module/Connedit.php:874
-#: ../../Zotlabs/Module/Profiles.php:503
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1143
-msgid "Address"
-msgstr "Adresse"
-
#: ../../Zotlabs/Module/Admin/Channels.php:162
msgid ""
"Selected channels will be deleted!\\n\\nEverything that was posted in these "
@@ -2268,1264 +2396,2837 @@ msgid ""
"channel on this site will be permanently deleted!\\n\\nAre you sure?"
msgstr "Der Kanal {0} wird gelöscht!\\n\\nAlles was von diesem Kanal auf diesem Server geschrieben wurde, wird gelöscht!\\n\\nBist Du sicher?"
-#: ../../Zotlabs/Module/Admin/Dbsync.php:19
-msgid "Update has been marked successful"
-msgstr "Update wurde als erfolgreich markiert"
-
-#: ../../Zotlabs/Module/Admin/Dbsync.php:29
-#, php-format
-msgid "Executing %s failed. Check system logs."
-msgstr "Ausführen von %s fehlgeschlagen. Überprüfe die Systemprotokolle."
-
-#: ../../Zotlabs/Module/Admin/Dbsync.php:32
-#, php-format
-msgid "Update %s was successfully applied."
-msgstr "Update %s wurde erfolgreich ausgeführt."
-
-#: ../../Zotlabs/Module/Admin/Dbsync.php:36
-#, php-format
-msgid "Update %s did not return a status. Unknown if it succeeded."
-msgstr "Update %s lieferte keinen Rückgabewert. Erfolg unbekannt."
+#: ../../Zotlabs/Module/Admin/Themes.php:26
+msgid "Theme settings updated."
+msgstr "Theme-Einstellungen aktualisiert."
-#: ../../Zotlabs/Module/Admin/Dbsync.php:39
-#, php-format
-msgid "Update function %s could not be found."
-msgstr "Update-Funktion %s konnte nicht gefunden werden."
+#: ../../Zotlabs/Module/Admin/Themes.php:61
+msgid "No themes found."
+msgstr "Keine Theme gefunden."
-#: ../../Zotlabs/Module/Admin/Dbsync.php:55
-msgid "No failed updates."
-msgstr "Keine fehlgeschlagenen Aktualisierungen."
+#: ../../Zotlabs/Module/Admin/Themes.php:116
+msgid "Screenshot"
+msgstr "Bildschirmfoto"
-#: ../../Zotlabs/Module/Admin/Dbsync.php:59
-msgid "Failed Updates"
-msgstr "Fehlgeschlagene Aktualisierungen"
+#: ../../Zotlabs/Module/Admin/Themes.php:123
+#: ../../Zotlabs/Module/Admin/Themes.php:157 ../../Zotlabs/Widget/Admin.php:28
+msgid "Themes"
+msgstr "Themes"
-#: ../../Zotlabs/Module/Admin/Dbsync.php:61
-msgid "Mark success (if update was manually applied)"
-msgstr "Als erfolgreich markieren (wenn das Update manuell ausgeführt wurde)"
+#: ../../Zotlabs/Module/Admin/Themes.php:162
+msgid "[Experimental]"
+msgstr "[Experimentell]"
-#: ../../Zotlabs/Module/Admin/Dbsync.php:62
-msgid "Attempt to execute this update step automatically"
-msgstr "Versuche, diesen Updateschritt automatisch auszuführen"
+#: ../../Zotlabs/Module/Admin/Themes.php:163
+msgid "[Unsupported]"
+msgstr "[Nicht unterstützt]"
-#: ../../Zotlabs/Module/Admin/Site.php:133
+#: ../../Zotlabs/Module/Admin/Site.php:144
msgid "Site settings updated."
msgstr "Site-Einstellungen aktualisiert."
-#: ../../Zotlabs/Module/Admin/Site.php:159 ../../include/text.php:2931
+#: ../../Zotlabs/Module/Admin/Site.php:170 ../../include/text.php:2915
msgid "Default"
msgstr "Standard"
-#: ../../Zotlabs/Module/Admin/Site.php:169
-#: ../../Zotlabs/Module/Settings/Display.php:143
+#: ../../Zotlabs/Module/Admin/Site.php:181
+#: ../../Zotlabs/Module/Settings/Display.php:137
+#, php-format
+msgid "%s - (Incompatible)"
+msgstr "%s - (Inkompatibel)"
+
+#: ../../Zotlabs/Module/Admin/Site.php:188
+#: ../../Zotlabs/Module/Settings/Display.php:151
msgid "mobile"
msgstr "mobil"
-#: ../../Zotlabs/Module/Admin/Site.php:171
+#: ../../Zotlabs/Module/Admin/Site.php:190
msgid "experimental"
msgstr "experimentell"
-#: ../../Zotlabs/Module/Admin/Site.php:173
+#: ../../Zotlabs/Module/Admin/Site.php:192
msgid "unsupported"
msgstr "nicht unterstützt"
-#: ../../Zotlabs/Module/Admin/Site.php:219
+#: ../../Zotlabs/Module/Admin/Site.php:238
msgid "Yes - with approval"
msgstr "Ja - mit Zustimmung"
-#: ../../Zotlabs/Module/Admin/Site.php:225
+#: ../../Zotlabs/Module/Admin/Site.php:244
msgid "My site is not a public server"
msgstr "Mein Server ist kein öffentlicher Server"
-#: ../../Zotlabs/Module/Admin/Site.php:226
+#: ../../Zotlabs/Module/Admin/Site.php:245
msgid "My site has paid access only"
msgstr "Meine Seite hat nur bezahlten Zugriff"
-#: ../../Zotlabs/Module/Admin/Site.php:227
+#: ../../Zotlabs/Module/Admin/Site.php:246
msgid "My site has free access only"
msgstr "Meine Seite hat nur freien Zugriff"
-#: ../../Zotlabs/Module/Admin/Site.php:228
+#: ../../Zotlabs/Module/Admin/Site.php:247
msgid "My site offers free accounts with optional paid upgrades"
msgstr "Mein Server bietet kostenlose Konten mit der Möglichkeit zu bezahlten Upgrades"
-#: ../../Zotlabs/Module/Admin/Site.php:239 ../../Zotlabs/Module/Setup.php:328
-msgid "Basic/Minimal Social Networking"
-msgstr "Einfaches/minimales soziales Netzwerken"
-
-#: ../../Zotlabs/Module/Admin/Site.php:240 ../../Zotlabs/Module/Setup.php:329
-msgid "Standard Configuration (default)"
-msgstr "Standardkonfiguration (Standard)"
-
-#: ../../Zotlabs/Module/Admin/Site.php:241 ../../Zotlabs/Module/Setup.php:330
-msgid "Professional"
-msgstr "Professionell"
-
-#: ../../Zotlabs/Module/Admin/Site.php:245 ../../Zotlabs/Lib/Techlevels.php:10
+#: ../../Zotlabs/Module/Admin/Site.php:264 ../../Zotlabs/Lib/Techlevels.php:10
msgid "Beginner/Basic"
msgstr "Anfänger/Basis"
-#: ../../Zotlabs/Module/Admin/Site.php:246 ../../Zotlabs/Lib/Techlevels.php:11
+#: ../../Zotlabs/Module/Admin/Site.php:265 ../../Zotlabs/Lib/Techlevels.php:11
msgid "Novice - not skilled but willing to learn"
msgstr "Anfänger - unerfahren, aber bereit zu lernen"
-#: ../../Zotlabs/Module/Admin/Site.php:247 ../../Zotlabs/Lib/Techlevels.php:12
+#: ../../Zotlabs/Module/Admin/Site.php:266 ../../Zotlabs/Lib/Techlevels.php:12
msgid "Intermediate - somewhat comfortable"
msgstr "Fortgeschritten - relativ komfortabel"
-#: ../../Zotlabs/Module/Admin/Site.php:248 ../../Zotlabs/Lib/Techlevels.php:13
+#: ../../Zotlabs/Module/Admin/Site.php:267 ../../Zotlabs/Lib/Techlevels.php:13
msgid "Advanced - very comfortable"
msgstr "Fortgeschritten - sehr komfortabel"
-#: ../../Zotlabs/Module/Admin/Site.php:249 ../../Zotlabs/Lib/Techlevels.php:14
+#: ../../Zotlabs/Module/Admin/Site.php:268 ../../Zotlabs/Lib/Techlevels.php:14
msgid "Expert - I can write computer code"
msgstr "Experte - Ich kann Computercode schreiben"
-#: ../../Zotlabs/Module/Admin/Site.php:250 ../../Zotlabs/Lib/Techlevels.php:15
+#: ../../Zotlabs/Module/Admin/Site.php:269 ../../Zotlabs/Lib/Techlevels.php:15
msgid "Wizard - I probably know more than you do"
msgstr "Zauberer - ich kann wahrscheinlich mehr als Du"
-#: ../../Zotlabs/Module/Admin/Site.php:259 ../../include/widgets.php:1591
+#: ../../Zotlabs/Module/Admin/Site.php:278 ../../Zotlabs/Widget/Admin.php:22
msgid "Site"
msgstr "Seite"
-#: ../../Zotlabs/Module/Admin/Site.php:262
+#: ../../Zotlabs/Module/Admin/Site.php:280
+#: ../../Zotlabs/Module/Register.php:253
+msgid "Registration"
+msgstr "Registrierung"
+
+#: ../../Zotlabs/Module/Admin/Site.php:281
msgid "File upload"
msgstr "Dateiupload"
-#: ../../Zotlabs/Module/Admin/Site.php:263
+#: ../../Zotlabs/Module/Admin/Site.php:282
msgid "Policies"
msgstr "Richtlinien"
-#: ../../Zotlabs/Module/Admin/Site.php:264
+#: ../../Zotlabs/Module/Admin/Site.php:283
#: ../../include/contact_widgets.php:16
msgid "Advanced"
msgstr "Fortgeschritten"
-#: ../../Zotlabs/Module/Admin/Site.php:268
-#: ../../extend/addon/addon/statusnet/statusnet.php:890
+#: ../../Zotlabs/Module/Admin/Site.php:287
+#: ../../addon/statusnet/statusnet.php:890
msgid "Site name"
msgstr "Seitenname"
-#: ../../Zotlabs/Module/Admin/Site.php:270 ../../Zotlabs/Module/Setup.php:351
-msgid "Server Configuration/Role"
-msgstr "Serverkonfiguration/Rolle"
-
-#: ../../Zotlabs/Module/Admin/Site.php:272
+#: ../../Zotlabs/Module/Admin/Site.php:291
msgid "Site default technical skill level"
msgstr "Standard-Qualifikationsstufe der Website"
-#: ../../Zotlabs/Module/Admin/Site.php:272
+#: ../../Zotlabs/Module/Admin/Site.php:291
msgid "Used to provide a member experience matched to technical comfort level"
msgstr "Dies wird verwendet, um eine Benutzererfahrung passend zur technischen Qualifikationsstufe zu bieten."
-#: ../../Zotlabs/Module/Admin/Site.php:274
+#: ../../Zotlabs/Module/Admin/Site.php:293
msgid "Lock the technical skill level setting"
msgstr "Sperre die technische Qualifikationsstufe"
-#: ../../Zotlabs/Module/Admin/Site.php:274
+#: ../../Zotlabs/Module/Admin/Site.php:293
msgid "Members can set their own technical comfort level by default"
msgstr "Benutzer können standardmäßig ihre eigene technische Qualifikationsstufe einstellen"
-#: ../../Zotlabs/Module/Admin/Site.php:276
+#: ../../Zotlabs/Module/Admin/Site.php:295
msgid "Banner/Logo"
msgstr "Banner/Logo"
-#: ../../Zotlabs/Module/Admin/Site.php:277
+#: ../../Zotlabs/Module/Admin/Site.php:296
msgid "Administrator Information"
msgstr "Administrator-Informationen"
-#: ../../Zotlabs/Module/Admin/Site.php:277
+#: ../../Zotlabs/Module/Admin/Site.php:296
msgid ""
"Contact information for site administrators. Displayed on siteinfo page. "
"BBCode can be used here"
msgstr "Kontaktinformationen für Administratoren des Servers. Wird auf der siteinfo-Seite angezeigt. BBCode kann verwendet werden."
-#: ../../Zotlabs/Module/Admin/Site.php:278
+#: ../../Zotlabs/Module/Admin/Site.php:297
#: ../../Zotlabs/Module/Siteinfo.php:23
msgid "Site Information"
msgstr "Seiteninformationen"
-#: ../../Zotlabs/Module/Admin/Site.php:278
+#: ../../Zotlabs/Module/Admin/Site.php:297
msgid ""
"Publicly visible description of this site. Displayed on siteinfo page. "
"BBCode can be used here"
msgstr "Öffentlich sichtbare Beschreibung dieses Servers. Wird auf der siteinfo-Seite angezeigt. BBCode kann hier verwendet werden."
-#: ../../Zotlabs/Module/Admin/Site.php:279
+#: ../../Zotlabs/Module/Admin/Site.php:298
msgid "System language"
msgstr "System-Sprache"
-#: ../../Zotlabs/Module/Admin/Site.php:280
+#: ../../Zotlabs/Module/Admin/Site.php:299
msgid "System theme"
msgstr "System-Theme"
-#: ../../Zotlabs/Module/Admin/Site.php:280
+#: ../../Zotlabs/Module/Admin/Site.php:299
msgid ""
"Default system theme - may be over-ridden by user profiles - <a href='#' "
"id='cnftheme'>change theme settings</a>"
msgstr "Standard-System-Theme – kann durch Nutzerprofile überschieben werden – <a href='#' id='cnftheme'>Theme-Einstellungen ändern</a>"
-#: ../../Zotlabs/Module/Admin/Site.php:281
+#: ../../Zotlabs/Module/Admin/Site.php:300
msgid "Mobile system theme"
msgstr "Mobile System-Theme:"
-#: ../../Zotlabs/Module/Admin/Site.php:281
+#: ../../Zotlabs/Module/Admin/Site.php:300
msgid "Theme for mobile devices"
msgstr "Theme für mobile Geräte"
-#: ../../Zotlabs/Module/Admin/Site.php:283
+#: ../../Zotlabs/Module/Admin/Site.php:302
msgid "Allow Feeds as Connections"
msgstr "Feeds als Verbindungen erlauben"
-#: ../../Zotlabs/Module/Admin/Site.php:283
+#: ../../Zotlabs/Module/Admin/Site.php:302
msgid "(Heavy system resource usage)"
msgstr "(führt zu hoher Systemlast)"
-#: ../../Zotlabs/Module/Admin/Site.php:284
+#: ../../Zotlabs/Module/Admin/Site.php:303
msgid "Maximum image size"
msgstr "Maximale Bildgröße"
-#: ../../Zotlabs/Module/Admin/Site.php:284
+#: ../../Zotlabs/Module/Admin/Site.php:303
msgid ""
"Maximum size in bytes of uploaded images. Default is 0, which means no "
"limits."
msgstr "Maximale Größe hochgeladener Bilder in Bytes. Standard ist 0 (keine Einschränkung)."
-#: ../../Zotlabs/Module/Admin/Site.php:285
+#: ../../Zotlabs/Module/Admin/Site.php:304
msgid "Does this site allow new member registration?"
msgstr "Erlaubt dieser Server die Registrierung neuer Nutzer?"
-#: ../../Zotlabs/Module/Admin/Site.php:286
+#: ../../Zotlabs/Module/Admin/Site.php:305
msgid "Invitation only"
msgstr "Nur mit Einladung"
-#: ../../Zotlabs/Module/Admin/Site.php:286
+#: ../../Zotlabs/Module/Admin/Site.php:305
msgid ""
"Only allow new member registrations with an invitation code. Above register "
"policy must be set to Yes."
msgstr "Erlaube die Neuregistrierung von Mitglieder nur mit einem Einladungscode. Die Registrierungs-Politik muss oben auf Ja gesetzt werden."
-#: ../../Zotlabs/Module/Admin/Site.php:287
+#: ../../Zotlabs/Module/Admin/Site.php:306
msgid "Which best describes the types of account offered by this hub?"
msgstr "Was ist die passendste Beschreibung der Konten auf diesem Hub?"
-#: ../../Zotlabs/Module/Admin/Site.php:288
+#: ../../Zotlabs/Module/Admin/Site.php:307
msgid "Register text"
msgstr "Registrierungstext"
-#: ../../Zotlabs/Module/Admin/Site.php:288
+#: ../../Zotlabs/Module/Admin/Site.php:307
msgid "Will be displayed prominently on the registration page."
msgstr "Wird gut sichtbar auf der Registrierungs-Seite angezeigt."
-#: ../../Zotlabs/Module/Admin/Site.php:289
+#: ../../Zotlabs/Module/Admin/Site.php:308
msgid "Site homepage to show visitors (default: login box)"
msgstr "Homepage des Hubs, die Besuchern angezeigt wird (Voreinstellung: Anmeldemaske)"
-#: ../../Zotlabs/Module/Admin/Site.php:289
+#: ../../Zotlabs/Module/Admin/Site.php:308
msgid ""
"example: 'public' to show public stream, 'page/sys/home' to show a system "
"webpage called 'home' or 'include:home.html' to include a file."
msgstr "Beispiele: 'public', um den Stream aller öffentlichen Beiträge anzuzeigen, 'page/sys/home', um eine System-Webseite namens 'home' anzuzeigen, 'include:home.html', um eine Datei einzufügen."
-#: ../../Zotlabs/Module/Admin/Site.php:290
+#: ../../Zotlabs/Module/Admin/Site.php:309
msgid "Preserve site homepage URL"
msgstr "Homepage-URL schützen"
-#: ../../Zotlabs/Module/Admin/Site.php:290
+#: ../../Zotlabs/Module/Admin/Site.php:309
msgid ""
"Present the site homepage in a frame at the original location instead of "
"redirecting"
msgstr "Zeigt die Homepage an der Original-URL in einem Frame an, statt auf die eigentliche Adresse der Seite umzuleiten."
-#: ../../Zotlabs/Module/Admin/Site.php:291
+#: ../../Zotlabs/Module/Admin/Site.php:310
msgid "Accounts abandoned after x days"
msgstr "Konten gelten nach X Tagen als unbenutzt"
-#: ../../Zotlabs/Module/Admin/Site.php:291
+#: ../../Zotlabs/Module/Admin/Site.php:310
msgid ""
"Will not waste system resources polling external sites for abandonded "
"accounts. Enter 0 for no time limit."
msgstr "Verschwende keine Systemressourcen auf das Pollen von externen Seiten, wenn das Konto nicht mehr benutzt wird. Trage hier 0 für kein zeitliches Limit."
-#: ../../Zotlabs/Module/Admin/Site.php:292
+#: ../../Zotlabs/Module/Admin/Site.php:311
msgid "Allowed friend domains"
msgstr "Erlaubte Domains für Kontakte"
-#: ../../Zotlabs/Module/Admin/Site.php:292
+#: ../../Zotlabs/Module/Admin/Site.php:311
msgid ""
"Comma separated list of domains which are allowed to establish friendships "
"with this site. Wildcards are accepted. Empty to allow any domains"
msgstr "Liste der Domains, die für Freundschaften erlaubt sind, durch Kommas getrennt. Platzhalter werden akzeptiert. Leer lassen, um alle Domains zu erlauben."
-#: ../../Zotlabs/Module/Admin/Site.php:293
+#: ../../Zotlabs/Module/Admin/Site.php:312
msgid "Verify Email Addresses"
msgstr "E-Mail-Adressen überprüfen"
-#: ../../Zotlabs/Module/Admin/Site.php:293
+#: ../../Zotlabs/Module/Admin/Site.php:312
msgid ""
"Check to verify email addresses used in account registration (recommended)."
msgstr "Aktivieren, um die Überprüfung von E-Mail-Adressen bei der Registrierung von Benutzerkonten zu aktivieren (empfohlen)."
-#: ../../Zotlabs/Module/Admin/Site.php:294
+#: ../../Zotlabs/Module/Admin/Site.php:313
msgid "Force publish"
msgstr "Veröffentlichung erzwingen"
-#: ../../Zotlabs/Module/Admin/Site.php:294
+#: ../../Zotlabs/Module/Admin/Site.php:313
msgid ""
"Check to force all profiles on this site to be listed in the site directory."
msgstr "Die Veröffentlichung aller Profile dieses Servers im Verzeichnis erzwingen."
-#: ../../Zotlabs/Module/Admin/Site.php:295
+#: ../../Zotlabs/Module/Admin/Site.php:314
msgid "Import Public Streams"
msgstr "Öffentliche Beiträge importieren"
-#: ../../Zotlabs/Module/Admin/Site.php:295
+#: ../../Zotlabs/Module/Admin/Site.php:314
msgid ""
"Import and allow access to public content pulled from other sites. Warning: "
"this content is unmoderated."
msgstr "Öffentliche Beiträge von anderen Servern importieren und zur Verfügung stellen. Warnung: Diese Inhalte sind nicht moderiert."
-#: ../../Zotlabs/Module/Admin/Site.php:296
+#: ../../Zotlabs/Module/Admin/Site.php:315
msgid "Login on Homepage"
msgstr "Log-in auf der Startseite"
-#: ../../Zotlabs/Module/Admin/Site.php:296
+#: ../../Zotlabs/Module/Admin/Site.php:315
msgid ""
"Present a login box to visitors on the home page if no other content has "
"been configured."
msgstr "Zeigt Besuchern der Homepage eine Anmeldemaske, falls keine anderen Inhalte konfiguriert wurden."
-#: ../../Zotlabs/Module/Admin/Site.php:297
+#: ../../Zotlabs/Module/Admin/Site.php:316
msgid "Enable context help"
msgstr "Kontext-Hilfe aktivieren"
-#: ../../Zotlabs/Module/Admin/Site.php:297
+#: ../../Zotlabs/Module/Admin/Site.php:316
msgid ""
"Display contextual help for the current page when the help button is "
"pressed."
msgstr "Zeigt Kontext-sensitive Hilfe für die aktuelle Seite an, wenn der Hilfe-Knopf geklickt wird."
-#: ../../Zotlabs/Module/Admin/Site.php:299
+#: ../../Zotlabs/Module/Admin/Site.php:318
+msgid "Reply-to email address for system generated email."
+msgstr "Antwortadresse (reply-to) für Emails, die vom System generiert wurden."
+
+#: ../../Zotlabs/Module/Admin/Site.php:319
+msgid "Sender (From) email address for system generated email."
+msgstr "Absenderadresse (from) für Emails, die vom System generiert wurden."
+
+#: ../../Zotlabs/Module/Admin/Site.php:320
+msgid "Name of email sender for system generated email."
+msgstr "Name des Versenders von Emails, die vom System generiert wurden."
+
+#: ../../Zotlabs/Module/Admin/Site.php:322
msgid "Directory Server URL"
msgstr "Verzeichnisserver-URL"
-#: ../../Zotlabs/Module/Admin/Site.php:299
+#: ../../Zotlabs/Module/Admin/Site.php:322
msgid "Default directory server"
msgstr "Standard-Verzeichnisserver"
-#: ../../Zotlabs/Module/Admin/Site.php:301
+#: ../../Zotlabs/Module/Admin/Site.php:324
msgid "Proxy user"
msgstr "Proxy Benutzer"
-#: ../../Zotlabs/Module/Admin/Site.php:302
+#: ../../Zotlabs/Module/Admin/Site.php:325
msgid "Proxy URL"
msgstr "Proxy URL"
-#: ../../Zotlabs/Module/Admin/Site.php:303
+#: ../../Zotlabs/Module/Admin/Site.php:326
msgid "Network timeout"
msgstr "Netzwerk-Timeout"
-#: ../../Zotlabs/Module/Admin/Site.php:303
+#: ../../Zotlabs/Module/Admin/Site.php:326
msgid "Value is in seconds. Set to 0 for unlimited (not recommended)."
msgstr "Wert in Sekunden. 0 für unbegrenzt (nicht empfohlen)."
-#: ../../Zotlabs/Module/Admin/Site.php:304
+#: ../../Zotlabs/Module/Admin/Site.php:327
msgid "Delivery interval"
msgstr "Auslieferung Intervall"
-#: ../../Zotlabs/Module/Admin/Site.php:304
+#: ../../Zotlabs/Module/Admin/Site.php:327
msgid ""
"Delay background delivery processes by this many seconds to reduce system "
"load. Recommend: 4-5 for shared hosts, 2-3 for virtual private servers. 0-1 "
"for large dedicated servers."
msgstr "Verzögere im Hintergrund laufende Auslieferungsprozesse um die angegebene Anzahl Sekunden, um die Systemlast zu verringern. Empfehlungen: 4-5 für Shared Hosts, 2-3 für VPS, 0-1 für große dedizierte Server."
-#: ../../Zotlabs/Module/Admin/Site.php:305
+#: ../../Zotlabs/Module/Admin/Site.php:328
msgid "Deliveries per process"
msgstr "Zustellungen pro Prozess"
-#: ../../Zotlabs/Module/Admin/Site.php:305
+#: ../../Zotlabs/Module/Admin/Site.php:328
msgid ""
"Number of deliveries to attempt in a single operating system process. Adjust"
" if necessary to tune system performance. Recommend: 1-5."
msgstr "Anzahl der Zustellungen, die innerhalb eines einzelnen Betriebssystemprozesses versucht werden. Anpassen, falls nötig, um die System-Performance zu verbessern. Empfehlung: 1-5."
-#: ../../Zotlabs/Module/Admin/Site.php:306
+#: ../../Zotlabs/Module/Admin/Site.php:329
msgid "Poll interval"
msgstr "Abfrageintervall"
-#: ../../Zotlabs/Module/Admin/Site.php:306
+#: ../../Zotlabs/Module/Admin/Site.php:329
msgid ""
"Delay background polling processes by this many seconds to reduce system "
"load. If 0, use delivery interval."
msgstr "Verzögere Hintergrundprozesse um diese Anzahl Sekunden, um die Systemlast zu reduzieren. Bei 0 wird das Auslieferungsintervall verwendet."
-#: ../../Zotlabs/Module/Admin/Site.php:307
+#: ../../Zotlabs/Module/Admin/Site.php:330
msgid "Maximum Load Average"
msgstr "Maximales Load Average"
-#: ../../Zotlabs/Module/Admin/Site.php:307
+#: ../../Zotlabs/Module/Admin/Site.php:330
msgid ""
"Maximum system load before delivery and poll processes are deferred - "
"default 50."
msgstr "Maximale Systemlast, bevor Verteil- und Empfangsprozesse verschoben werden – Standard 50"
-#: ../../Zotlabs/Module/Admin/Site.php:308
+#: ../../Zotlabs/Module/Admin/Site.php:331
msgid "Expiration period in days for imported (grid/network) content"
msgstr "Setze den Zeitraum (in Tagen), ab wann importierte (aus dem Netzwerk) Inhalte ablaufen sollen"
-#: ../../Zotlabs/Module/Admin/Site.php:308
+#: ../../Zotlabs/Module/Admin/Site.php:331
msgid "0 for no expiration of imported content"
msgstr "0 = keine Löschung importierter Inhalte"
-#: ../../Zotlabs/Module/Admin/Plugins.php:284
-#, php-format
-msgid "Plugin %s disabled."
-msgstr "Plug-In %s deaktiviert."
+#: ../../Zotlabs/Module/Admin/Profs.php:69
+msgid "New Profile Field"
+msgstr "Neues Profilfeld"
-#: ../../Zotlabs/Module/Admin/Plugins.php:289
+#: ../../Zotlabs/Module/Admin/Profs.php:70
+#: ../../Zotlabs/Module/Admin/Profs.php:90
+msgid "Field nickname"
+msgstr "Kurzname für das Feld"
+
+#: ../../Zotlabs/Module/Admin/Profs.php:70
+#: ../../Zotlabs/Module/Admin/Profs.php:90
+msgid "System name of field"
+msgstr "Systemname des Feldes"
+
+#: ../../Zotlabs/Module/Admin/Profs.php:71
+#: ../../Zotlabs/Module/Admin/Profs.php:91
+msgid "Input type"
+msgstr "Art des Inhalts"
+
+#: ../../Zotlabs/Module/Admin/Profs.php:72
+#: ../../Zotlabs/Module/Admin/Profs.php:92
+msgid "Field Name"
+msgstr "Feldname"
+
+#: ../../Zotlabs/Module/Admin/Profs.php:72
+#: ../../Zotlabs/Module/Admin/Profs.php:92
+msgid "Label on profile pages"
+msgstr "Bezeichnung auf Profilseiten"
+
+#: ../../Zotlabs/Module/Admin/Profs.php:73
+#: ../../Zotlabs/Module/Admin/Profs.php:93
+msgid "Help text"
+msgstr "Hilfetext"
+
+#: ../../Zotlabs/Module/Admin/Profs.php:73
+#: ../../Zotlabs/Module/Admin/Profs.php:93
+msgid "Additional info (optional)"
+msgstr "Zusätzliche Informationen (optional)"
+
+#: ../../Zotlabs/Module/Admin/Profs.php:74
+#: ../../Zotlabs/Module/Admin/Profs.php:94 ../../Zotlabs/Module/Rbmark.php:32
+#: ../../Zotlabs/Module/Rbmark.php:104 ../../Zotlabs/Module/Filer.php:53
+#: ../../Zotlabs/Widget/Notes.php:18 ../../include/text.php:1028
+#: ../../include/text.php:1040
+msgid "Save"
+msgstr "Speichern"
+
+#: ../../Zotlabs/Module/Admin/Profs.php:83
+msgid "Field definition not found"
+msgstr "Feld-Definition nicht gefunden"
+
+#: ../../Zotlabs/Module/Admin/Profs.php:89
+msgid "Edit Profile Field"
+msgstr "Profilfeld bearbeiten"
+
+#: ../../Zotlabs/Module/Admin/Profs.php:147 ../../Zotlabs/Widget/Admin.php:30
+msgid "Profile Fields"
+msgstr "Profil Felder"
+
+#: ../../Zotlabs/Module/Admin/Profs.php:148
+msgid "Basic Profile Fields"
+msgstr "Notwendige Profil Felder"
+
+#: ../../Zotlabs/Module/Admin/Profs.php:149
+msgid "Advanced Profile Fields"
+msgstr "Erweiterte Profil Felder"
+
+#: ../../Zotlabs/Module/Admin/Profs.php:149
+msgid "(In addition to basic fields)"
+msgstr "(zusätzlich zu notwendige Felder)"
+
+#: ../../Zotlabs/Module/Admin/Profs.php:151
+msgid "All available fields"
+msgstr "Alle verfügbaren Felder"
+
+#: ../../Zotlabs/Module/Admin/Profs.php:152
+msgid "Custom Fields"
+msgstr "Benutzerdefinierte Felder"
+
+#: ../../Zotlabs/Module/Admin/Profs.php:156
+msgid "Create Custom Field"
+msgstr "Erstelle benutzerdefiniertes Feld"
+
+#: ../../Zotlabs/Module/Admin/Account_edit.php:29
#, php-format
-msgid "Plugin %s enabled."
-msgstr "Plug-In %s aktiviert."
+msgid "Password changed for account %d."
+msgstr "Passwort für Konto %d geändert."
-#: ../../Zotlabs/Module/Admin/Plugins.php:337
-#: ../../Zotlabs/Module/Admin/Plugins.php:432 ../../include/widgets.php:1596
-msgid "Plugins"
-msgstr "Plug-Ins"
+#: ../../Zotlabs/Module/Admin/Account_edit.php:46
+msgid "Account settings updated."
+msgstr "Kontoeinstellungen aktualisiert."
-#: ../../Zotlabs/Module/Admin/Plugins.php:348
-msgid "Minimum project version: "
-msgstr "Minimale Version des Projekts:"
+#: ../../Zotlabs/Module/Admin/Account_edit.php:61
+msgid "Account not found."
+msgstr "Konto nicht gefunden."
-#: ../../Zotlabs/Module/Admin/Plugins.php:349
-msgid "Maximum project version: "
-msgstr "Maximale Version des Projekts:"
+#: ../../Zotlabs/Module/Admin/Account_edit.php:68
+msgid "Account Edit"
+msgstr "Kontobearbeitung"
-#: ../../Zotlabs/Module/Admin/Plugins.php:350
-msgid "Minimum PHP version: "
-msgstr "Minimale PHP Version:"
+#: ../../Zotlabs/Module/Admin/Account_edit.php:69
+msgid "New Password"
+msgstr "Neues Passwort"
-#: ../../Zotlabs/Module/Admin/Plugins.php:351
-msgid "Compatible Server Roles: "
-msgstr "Kompatible Serverrollen: "
+#: ../../Zotlabs/Module/Admin/Account_edit.php:70
+msgid "New Password again"
+msgstr "Neues Passwort wiederholen"
-#: ../../Zotlabs/Module/Admin/Plugins.php:352
-msgid "Requires: "
-msgstr "Benötigt:"
+#: ../../Zotlabs/Module/Admin/Account_edit.php:71
+msgid "Technical skill level"
+msgstr "Technische Qualifikationsstufe"
-#: ../../Zotlabs/Module/Admin/Plugins.php:353
-#: ../../Zotlabs/Module/Admin/Plugins.php:437
-msgid "Disabled - version incompatibility"
-msgstr "Abgeschaltet - Versionsinkompatibilität"
+#: ../../Zotlabs/Module/Admin/Account_edit.php:72
+msgid "Account language (for emails)"
+msgstr "Kontosprache (für E-Mails)"
-#: ../../Zotlabs/Module/Admin/Plugins.php:406
-msgid "Enter the public git repository URL of the plugin repo."
-msgstr "Gib die öffentliche Git-Repository-URL des Plugin-Repository an."
+#: ../../Zotlabs/Module/Admin/Account_edit.php:73
+msgid "Service class"
+msgstr "Dienstklasse"
-#: ../../Zotlabs/Module/Admin/Plugins.php:407
-msgid "Plugin repo git URL"
-msgstr "Plugin-Repository Git URL"
+#: ../../Zotlabs/Module/Admin/Security.php:77
+msgid ""
+"By default, unfiltered HTML is allowed in embedded media. This is inherently"
+" insecure."
+msgstr "Standardmäßig wird ungefiltertes HTML in eingebetteten Inhalten zugelassen. Das ist prinzipiell unsicher."
-#: ../../Zotlabs/Module/Admin/Plugins.php:408
-msgid "Custom repo name"
-msgstr "Benutzerdefinierter Repository-Name"
+#: ../../Zotlabs/Module/Admin/Security.php:80
+msgid ""
+"The recommended setting is to only allow unfiltered HTML from the following "
+"sites:"
+msgstr "Die empfohlene Einstellung ist, ungefiltertes HTML nur von den nachfolgenden Webseiten zu erlauben:"
-#: ../../Zotlabs/Module/Admin/Plugins.php:408
-msgid "(optional)"
-msgstr "(optional)"
+#: ../../Zotlabs/Module/Admin/Security.php:81
+msgid ""
+"https://youtube.com/<br />https://www.youtube.com/<br />https://youtu.be/<br"
+" />https://vimeo.com/<br />https://soundcloud.com/<br />"
+msgstr "https://youtube.com/<br />https://www.youtube.com/<br />https://youtu.be/<br />https://vimeo.com/<br />https://soundcloud.com/<br />"
-#: ../../Zotlabs/Module/Admin/Plugins.php:409
-msgid "Download Plugin Repo"
-msgstr "Plugin-Repository herunterladen"
+#: ../../Zotlabs/Module/Admin/Security.php:82
+msgid ""
+"All other embedded content will be filtered, <strong>unless</strong> "
+"embedded content from that site is explicitly blocked."
+msgstr "Alle anderen eingebetteten Inhalte werden gefiltert, <strong>es sei denn</strong>, eingebettete Inhalte von einer bestimmten Seite sind explizit blockiert."
-#: ../../Zotlabs/Module/Admin/Plugins.php:416
-msgid "Install new repo"
-msgstr "Neues Repository installieren"
+#: ../../Zotlabs/Module/Admin/Security.php:87
+#: ../../Zotlabs/Widget/Admin.php:25
+msgid "Security"
+msgstr "Sicherheit"
-#: ../../Zotlabs/Module/Admin/Plugins.php:417 ../../Zotlabs/Lib/Apps.php:348
-msgid "Install"
-msgstr "Installieren"
+#: ../../Zotlabs/Module/Admin/Security.php:89
+msgid "Block public"
+msgstr "Öffentlichen Zugriff blockieren"
-#: ../../Zotlabs/Module/Admin/Plugins.php:418
-#: ../../Zotlabs/Module/Connedit.php:885 ../../Zotlabs/Module/Fbrowser.php:66
-#: ../../Zotlabs/Module/Fbrowser.php:88 ../../Zotlabs/Module/Wiki.php:263
-#: ../../Zotlabs/Module/Wiki.php:288
-#: ../../Zotlabs/Module/Settings/Oauth.php:88
-#: ../../Zotlabs/Module/Settings/Oauth.php:114
-#: ../../Zotlabs/Module/Tagrm.php:15 ../../Zotlabs/Module/Tagrm.php:138
-#: ../../extend/addon/addon/friendica/dfrn_request.php:879
-#: ../../extend/addon/addon/js_upload/js_upload.php:46
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:866
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1154
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:243
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:266
-#: ../../include/conversation.php:1394 ../../include/conversation.php:1443
-msgid "Cancel"
-msgstr "Abbrechen"
+#: ../../Zotlabs/Module/Admin/Security.php:89
+msgid ""
+"Check to block public access to all otherwise public personal pages on this "
+"site unless you are currently authenticated."
+msgstr "Blockiere den öffentlichen Zugriff auf alle ansonsten öffentlichen persönlichen Seiten dieser Website, sofern ein Besucher nicht angemeldet ist."
-#: ../../Zotlabs/Module/Admin/Plugins.php:440
-msgid "Manage Repos"
-msgstr "Repositorien verwalten"
+#: ../../Zotlabs/Module/Admin/Security.php:90
+msgid "Set \"Transport Security\" HTTP header"
+msgstr "Setze den \"Transport Security\" HTTP Header"
-#: ../../Zotlabs/Module/Admin/Plugins.php:441
-msgid "Installed Plugin Repositories"
-msgstr "Installierte Plugin-Repositorien"
+#: ../../Zotlabs/Module/Admin/Security.php:91
+msgid "Set \"Content Security Policy\" HTTP header"
+msgstr "Setze den \"Content Security Policy\" HTTP Header"
-#: ../../Zotlabs/Module/Admin/Plugins.php:442
-msgid "Install a New Plugin Repository"
-msgstr "Ein neues Plugin-Repository installieren"
+#: ../../Zotlabs/Module/Admin/Security.php:92
+msgid "Allowed email domains"
+msgstr "Erlaubte Domains für E-Mails"
-#: ../../Zotlabs/Module/Admin/Plugins.php:448
-#: ../../Zotlabs/Module/Connedit.php:883
-#: ../../Zotlabs/Module/Settings/Oauth.php:42
-#: ../../Zotlabs/Module/Settings/Oauth.php:113 ../../Zotlabs/Lib/Apps.php:348
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1152
-msgid "Update"
-msgstr "Aktualisieren"
+#: ../../Zotlabs/Module/Admin/Security.php:92
+msgid ""
+"Comma separated list of domains which are allowed in email addresses for "
+"registrations to this site. Wildcards are accepted. Empty to allow any "
+"domains"
+msgstr "Liste der Domains, die für E-Mail-Adressen bei der Registrierung erlaubt sind, durch Kommas getrennt. Platzhalter werden akzeptiert. Leer lassen, um alle Domains zu erlauben."
-#: ../../Zotlabs/Module/Admin/Plugins.php:449
-msgid "Switch branch"
-msgstr "Zweig/Branch wechseln"
+#: ../../Zotlabs/Module/Admin/Security.php:93
+msgid "Not allowed email domains"
+msgstr "Nicht erlaubte Domains für E-Mails"
-#: ../../Zotlabs/Module/Admin/Queue.php:35
-msgid "Queue Statistics"
-msgstr "Warteschlangenstatistiken"
+#: ../../Zotlabs/Module/Admin/Security.php:93
+msgid ""
+"Comma separated list of domains which are not allowed in email addresses for"
+" registrations to this site. Wildcards are accepted. Empty to allow any "
+"domains, unless allowed domains have been defined."
+msgstr "Domains in E-Mail-Adressen, die keine Erlaubnis erhalten, sich auf Deinem Hub zu registrieren. Mehrere Domains können durch Kommas getrennt werden. Platzhalter (*/?) sind möglich. Keine Eingabe bedeutet keine Einschränkung, unabhängig davon, ob unter erlaubte Domains etwas eingegeben wurde."
-#: ../../Zotlabs/Module/Admin/Queue.php:36
-msgid "Total Entries"
-msgstr "Einträge insgesamt"
+#: ../../Zotlabs/Module/Admin/Security.php:94
+msgid "Allow communications only from these sites"
+msgstr "Kommunikation nur von diesen Servern/Domains erlauben"
-#: ../../Zotlabs/Module/Admin/Queue.php:37
-msgid "Priority"
-msgstr "Priorität"
+#: ../../Zotlabs/Module/Admin/Security.php:94
+msgid ""
+"One site per line. Leave empty to allow communication from anywhere by "
+"default"
+msgstr "Ein Eintrag pro Zeile. Lasse das Feld leer, um Kommunikation grundlegend von überall her zu erlauben."
-#: ../../Zotlabs/Module/Admin/Queue.php:38
-msgid "Destination URL"
-msgstr "Ziel-URL"
+#: ../../Zotlabs/Module/Admin/Security.php:95
+msgid "Block communications from these sites"
+msgstr "Kommunikation von diesen Servern/Domains blockieren"
-#: ../../Zotlabs/Module/Admin/Queue.php:39
-msgid "Mark hub permanently offline"
-msgstr "Hub als permanent offline markieren"
+#: ../../Zotlabs/Module/Admin/Security.php:96
+msgid "Allow communications only from these channels"
+msgstr "Kommunikation nur von diesen Kanälen erlauben"
-#: ../../Zotlabs/Module/Admin/Queue.php:40
-msgid "Empty queue for this hub"
-msgstr "Warteschlange für diesen Hub leeren"
+#: ../../Zotlabs/Module/Admin/Security.php:96
+msgid ""
+"One channel (hash) per line. Leave empty to allow from any channel by "
+"default"
+msgstr "Ein Kanal (hash) pro Zeile. Leerlassen um jeden Kanal zuzulassen. "
-#: ../../Zotlabs/Module/Admin/Queue.php:41
-msgid "Last known contact"
-msgstr "Letzter Kontakt"
+#: ../../Zotlabs/Module/Admin/Security.php:97
+msgid "Block communications from these channels"
+msgstr "Kommunikation von folgenden Kanälen blockieren"
-#: ../../Zotlabs/Module/Search.php:223
-#, php-format
-msgid "Items tagged with: %s"
-msgstr "Beiträge mit Schlagwort: %s"
+#: ../../Zotlabs/Module/Admin/Security.php:98
+msgid "Only allow embeds from secure (SSL) websites and links."
+msgstr "Erlaube Einbettungen nur von sicheren (SSL) Webseiten und Links."
+
+#: ../../Zotlabs/Module/Admin/Security.php:99
+msgid "Allow unfiltered embedded HTML content only from these domains"
+msgstr "Erlaube Einbettung von Inhalten mit ungefiltertem HTML nur von diesen Domains"
+
+#: ../../Zotlabs/Module/Admin/Security.php:99
+msgid "One site per line. By default embedded content is filtered."
+msgstr "Eine Website/Domain pro Zeile. Standardmäßig wird eingebetteter Inhalt gefiltert."
+
+#: ../../Zotlabs/Module/Admin/Security.php:100
+msgid "Block embedded HTML from these domains"
+msgstr "Eingebettete HTML Inhalte von diesen Servern/Domains blockieren"
+
+#: ../../Zotlabs/Module/Lockview.php:75
+msgid "Remote privacy information not available."
+msgstr "Privatsphäre-Einstellungen anderer Nutzer sind nicht verfügbar."
+
+#: ../../Zotlabs/Module/Lockview.php:96
+msgid "Visible to:"
+msgstr "Sichtbar für:"
+
+#: ../../Zotlabs/Module/Lockview.php:117 ../../Zotlabs/Module/Lockview.php:153
+#: ../../Zotlabs/Module/Acl.php:117 ../../include/acl_selectors.php:183
+msgctxt "acl"
+msgid "Profile"
+msgstr "Profil"
+
+#: ../../Zotlabs/Module/Settings/Permcats.php:37
+msgid "Permission category saved."
+msgstr "Berechtigungsrolle gespeichert."
+
+#: ../../Zotlabs/Module/Settings/Permcats.php:61
+msgid ""
+"Use this form to create permission rules for various classes of people or "
+"connections."
+msgstr "Verwende dieses Formular, um Berechtigungsrollen für verschiedene Gruppen von Personen oder Verbindungen zu erstellen."
+
+#: ../../Zotlabs/Module/Settings/Permcats.php:94
+msgid "Permission Categories"
+msgstr "Berechtigungsrollen"
+
+#: ../../Zotlabs/Module/Settings/Permcats.php:102
+msgid "Permission Name"
+msgstr "Name der Berechtigungsrolle"
+
+#: ../../Zotlabs/Module/Settings/Permcats.php:103
+#: ../../Zotlabs/Module/Settings/Tokens.php:161
+#: ../../Zotlabs/Module/Connedit.php:886
+msgid "My Settings"
+msgstr "Meine Einstellungen"
+
+#: ../../Zotlabs/Module/Settings/Permcats.php:105
+#: ../../Zotlabs/Module/Settings/Tokens.php:163
+#: ../../Zotlabs/Module/Connedit.php:881
+msgid "inherited"
+msgstr "geerbt"
+
+#: ../../Zotlabs/Module/Settings/Permcats.php:108
+#: ../../Zotlabs/Module/Settings/Tokens.php:166
+#: ../../Zotlabs/Module/Connedit.php:888
+msgid "Individual Permissions"
+msgstr "Individuelle Zugriffsrechte"
+
+#: ../../Zotlabs/Module/Settings/Permcats.php:109
+#: ../../Zotlabs/Module/Settings/Tokens.php:167
+#: ../../Zotlabs/Module/Connedit.php:889
+msgid ""
+"Some permissions may be inherited from your channel's <a "
+"href=\"settings\"><strong>privacy settings</strong></a>, which have higher "
+"priority than individual settings. You can <strong>not</strong> change those"
+" settings here."
+msgstr "Einige Berechtigungen werden möglicherweise von den globalen <a href=\"settings\">Sicherheits- und Privatsphäre-Einstellungen</a> dieses Kanals vererbt. Diese haben eine höhere Priorität als die Einstellungen an der Verbindung und können hier nicht verändert werden."
+
+#: ../../Zotlabs/Module/Settings/Channel.php:62
+#: ../../Zotlabs/Module/Settings/Channel.php:66
+#: ../../Zotlabs/Module/Settings/Channel.php:67
+#: ../../Zotlabs/Module/Settings/Channel.php:70
+#: ../../Zotlabs/Module/Settings/Channel.php:81
+#: ../../Zotlabs/Module/Connedit.php:707 ../../Zotlabs/Widget/Affinity.php:28
+#: ../../include/selectors.php:123 ../../include/channel.php:406
+#: ../../include/channel.php:407 ../../include/channel.php:414
+msgid "Friends"
+msgstr "Freunde"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:251
+#: ../../addon/rendezvous/rendezvous.php:82
+#: ../../addon/openstreetmap/openstreetmap.php:184
+#: ../../addon/msgfooter/msgfooter.php:54 ../../addon/logrot/logrot.php:54
+#: ../../addon/twitter/twitter.php:766 ../../addon/piwik/piwik.php:116
+#: ../../addon/xmpp/xmpp.php:102
+msgid "Settings updated."
+msgstr "Einstellungen aktualisiert."
+
+#: ../../Zotlabs/Module/Settings/Channel.php:312
+msgid "Nobody except yourself"
+msgstr "Niemand außer Dir selbst"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:313
+msgid "Only those you specifically allow"
+msgstr "Nur die, denen Du es explizit erlaubst"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:314
+msgid "Approved connections"
+msgstr "Angenommene Verbindungen"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:315
+msgid "Any connections"
+msgstr "Beliebige Verbindungen"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:316
+msgid "Anybody on this website"
+msgstr "Jeder auf dieser Website"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:317
+msgid "Anybody in this network"
+msgstr "Alle $Projectname-Mitglieder"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:318
+msgid "Anybody authenticated"
+msgstr "Jeder authentifizierte"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:319
+msgid "Anybody on the internet"
+msgstr "Jeder im Internet"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:395
+msgid "Publish your default profile in the network directory"
+msgstr "Standard-Profil im Netzwerk-Verzeichnis veröffentlichen"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:400
+msgid "Allow us to suggest you as a potential friend to new members?"
+msgstr "Dürfen wir Dich neuen Mitgliedern als potentiellen Kontakt vorschlagen?"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:404
+#: ../../Zotlabs/Module/Profile_photo.php:429
+#: ../../Zotlabs/Module/Cover_photo.php:365
+msgid "or"
+msgstr "oder"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:409
+msgid "Your channel address is"
+msgstr "Deine Kanal-Adresse lautet"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:412
+msgid "Your files/photos are accessible via WebDAV at"
+msgstr "Deine Dateien/Fotos sind via WebDAV verfügbar auf"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:474
+msgid "Channel Settings"
+msgstr "Kanal-Einstellungen"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:481
+msgid "Basic Settings"
+msgstr "Grundeinstellungen"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:482
+#: ../../include/channel.php:1250
+msgid "Full Name:"
+msgstr "Voller Name:"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:483
+#: ../../Zotlabs/Module/Settings/Account.php:119
+msgid "Email Address:"
+msgstr "Email Adresse:"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:484
+msgid "Your Timezone:"
+msgstr "Ihre Zeitzone:"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:485
+msgid "Default Post Location:"
+msgstr "Standardstandort:"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:485
+msgid "Geographical location to display on your posts"
+msgstr "Geografischer Ort, der bei Deinen Beiträgen angezeigt werden soll"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:486
+msgid "Use Browser Location:"
+msgstr "Standort des Browsers verwenden:"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:488
+msgid "Adult Content"
+msgstr "Nicht jugendfreie Inhalte"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:488
+msgid ""
+"This channel frequently or regularly publishes adult content. (Please tag "
+"any adult material and/or nudity with #NSFW)"
+msgstr "Dieser Kanal veröffentlicht regelmäßig Inhalte, die für Minderjährige ungeeignet sind. (Bitte markiere solche Inhalte mit dem Schlagwort #NSFW)"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:490
+msgid "Security and Privacy Settings"
+msgstr "Sicherheits- und Datenschutz-Einstellungen"
-#: ../../Zotlabs/Module/Search.php:225
+#: ../../Zotlabs/Module/Settings/Channel.php:493
+msgid "Your permissions are already configured. Click to view/adjust"
+msgstr "Deine Zugriffsrechte sind schon konfiguriert. Klicke hier, um sie zu betrachten oder zu ändern"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:495
+msgid "Hide my online presence"
+msgstr "Meine Online-Präsenz verbergen"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:495
+msgid "Prevents displaying in your profile that you are online"
+msgstr "Verhindert die Anzeige Deines Online-Status in deinem Profil"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:497
+msgid "Simple Privacy Settings:"
+msgstr "Einfache Privatsphäre-Einstellungen"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:498
+msgid ""
+"Very Public - <em>extremely permissive (should be used with caution)</em>"
+msgstr "Komplett offen – <em>extrem ungeschützt (mit großer Vorsicht verwenden!)</em>"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:499
+msgid ""
+"Typical - <em>default public, privacy when desired (similar to social "
+"network permissions but with improved privacy)</em>"
+msgstr "Typisch – <em>Standard öffentlich, Privatsphäre, wo sie erwünscht ist (ähnlich den Einstellungen in sozialen Netzwerken, aber mit besser geschützter Privatsphäre)</em>"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:500
+msgid "Private - <em>default private, never open or public</em>"
+msgstr "Privat – <em>Standard privat, nie offen oder öffentlich</em>"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:501
+msgid "Blocked - <em>default blocked to/from everybody</em>"
+msgstr "Blockiert – <em>Alle standardmäßig blockiert</em>"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:503
+msgid "Allow others to tag your posts"
+msgstr "Erlaube anderen, Deine Beiträge zu verschlagworten"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:503
+msgid ""
+"Often used by the community to retro-actively flag inappropriate content"
+msgstr "Wird oft von der Community genutzt um rückwirkend anstößigen Inhalt zu markieren"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:505
+msgid "Channel Permission Limits"
+msgstr "Kanal-Berechtigungslimits"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:507
+msgid "Expire other channel content after this many days"
+msgstr "Den Inhalt anderer Kanäle nach dieser Anzahl Tage verfallen lassen"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:507
+msgid "0 or blank to use the website limit."
+msgstr "0 oder leer lassen, um den voreingestellten Wert der Webseite zu verwenden."
+
+#: ../../Zotlabs/Module/Settings/Channel.php:507
#, php-format
-msgid "Search results for: %s"
-msgstr "Suchergebnisse für: %s"
+msgid "This website expires after %d days."
+msgstr "Diese Webseite läuft nach %d Tagen ab."
-#: ../../Zotlabs/Module/Editlayout.php:127
-#: ../../Zotlabs/Module/Layouts.php:128 ../../Zotlabs/Module/Layouts.php:188
-msgid "Layout Name"
-msgstr "Layout-Name"
+#: ../../Zotlabs/Module/Settings/Channel.php:507
+msgid "This website does not expire imported content."
+msgstr "Diese Webseite lässt importierte Inhalte nicht verfallen."
-#: ../../Zotlabs/Module/Editlayout.php:128
-#: ../../Zotlabs/Module/Layouts.php:131
-msgid "Layout Description (Optional)"
-msgstr "Layout-Beschreibung (optional)"
+#: ../../Zotlabs/Module/Settings/Channel.php:507
+msgid "The website limit takes precedence if lower than your limit."
+msgstr "Das Verfallslimit der Webseite hat Vorrang, wenn es niedriger als Deines hier ist."
-#: ../../Zotlabs/Module/Editlayout.php:136
-msgid "Edit Layout"
-msgstr "Layout bearbeiten"
+#: ../../Zotlabs/Module/Settings/Channel.php:508
+msgid "Maximum Friend Requests/Day:"
+msgstr "Maximale Kontaktanfragen pro Tag:"
-#: ../../Zotlabs/Module/Editwebpage.php:142
-msgid "Page link"
-msgstr "Seiten-Link"
+#: ../../Zotlabs/Module/Settings/Channel.php:508
+msgid "May reduce spam activity"
+msgstr "Kann die Spam-Aktivität verringern"
-#: ../../Zotlabs/Module/Editwebpage.php:169
-msgid "Edit Webpage"
-msgstr "Webseite bearbeiten"
+#: ../../Zotlabs/Module/Settings/Channel.php:509
+msgid "Default Access Control List (ACL)"
+msgstr "Standard-Zugriffsberechtigungsliste (ACL)"
-#: ../../Zotlabs/Module/Like.php:19
-msgid "Like/Dislike"
-msgstr "Mögen/Nicht mögen"
+#: ../../Zotlabs/Module/Settings/Channel.php:511
+msgid "Use my default audience setting for the type of object published"
+msgstr "Verwende Deine eingestellte Standard-Zielgruppe des jeweiligen Inhaltstyps"
-#: ../../Zotlabs/Module/Like.php:24
-msgid "This action is restricted to members."
-msgstr "Diese Aktion kann nur von Mitgliedern ausgeführt werden."
+#: ../../Zotlabs/Module/Settings/Channel.php:518
+msgid "Channel permissions category:"
+msgstr "Zugriffsrechte-Kategorie des Kanals:"
-#: ../../Zotlabs/Module/Like.php:25
+#: ../../Zotlabs/Module/Settings/Channel.php:519
+msgid "Default Permissions Group"
+msgstr "Standard-Berechtigungsgruppe"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:525
+msgid "Maximum private messages per day from unknown people:"
+msgstr "Maximale Anzahl privater Nachrichten pro Tag von unbekannten Leuten:"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:525
+msgid "Useful to reduce spamming"
+msgstr "Nützlich, um Spam zu verringern"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:528
+msgid "Notification Settings"
+msgstr "Benachrichtigungs-Einstellungen"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:529
+msgid "By default post a status message when:"
+msgstr "Sende standardmäßig Status-Nachrichten, wenn:"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:530
+msgid "accepting a friend request"
+msgstr "Du eine Verbindungsanfrage annimmst"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:531
+msgid "joining a forum/community"
+msgstr "Du einem Forum beitrittst"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:532
+msgid "making an <em>interesting</em> profile change"
+msgstr "Du eine <em>interessante</em> Änderung an Deinem Profil vornimmst"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:533
+msgid "Send a notification email when:"
+msgstr "Eine E-Mail-Benachrichtigung senden, wenn:"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:534
+msgid "You receive a connection request"
+msgstr "Du eine Verbindungsanfrage erhältst"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:535
+msgid "Your connections are confirmed"
+msgstr "Eine Verbindung bestätigt wurde"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:536
+msgid "Someone writes on your profile wall"
+msgstr "Jemand auf Deine Pinnwand schreibt"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:537
+msgid "Someone writes a followup comment"
+msgstr "Jemand einen Beitrag kommentiert"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:538
+msgid "You receive a private message"
+msgstr "Du eine private Nachricht erhältst"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:539
+msgid "You receive a friend suggestion"
+msgstr "Du einen Kontaktvorschlag erhältst"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:540
+msgid "You are tagged in a post"
+msgstr "Du in einem Beitrag erwähnt wurdest"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:541
+msgid "You are poked/prodded/etc. in a post"
+msgstr "Du in einem Beitrag angestupst/geknufft/o.ä. wurdest"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:543
+msgid "Someone likes your post/comment"
+msgstr "Jemand mag Ihren Beitrag/Kommentar"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:546
+msgid "Show visual notifications including:"
+msgstr "Visuelle Benachrichtigungen anzeigen für:"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:548
+msgid "Unseen grid activity"
+msgstr "Ungesehene Netzwerk-Aktivität"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:549
+msgid "Unseen channel activity"
+msgstr "Ungesehene Kanal-Aktivität"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:550
+msgid "Unseen private messages"
+msgstr "Ungelesene persönliche Nachrichten"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:550
+#: ../../Zotlabs/Module/Settings/Channel.php:555
+#: ../../Zotlabs/Module/Settings/Channel.php:556
+#: ../../Zotlabs/Module/Settings/Channel.php:557
+#: ../../addon/jappixmini/jappixmini.php:343
+msgid "Recommended"
+msgstr "Empfohlen"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:551
+msgid "Upcoming events"
+msgstr "Baldige Termine"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:552
+msgid "Events today"
+msgstr "Heutige Termine"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:553
+msgid "Upcoming birthdays"
+msgstr "Baldige Geburtstage"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:553
+msgid "Not available in all themes"
+msgstr "Nicht in allen Themes verfügbar"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:554
+msgid "System (personal) notifications"
+msgstr "System – (persönliche) Benachrichtigungen"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:555
+msgid "System info messages"
+msgstr "System – Info-Nachrichten"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:556
+msgid "System critical alerts"
+msgstr "System – kritische Warnungen"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:557
+msgid "New connections"
+msgstr "Neue Verbindungen"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:558
+msgid "System Registrations"
+msgstr "System – Registrierungen"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:559
msgid ""
-"Please <a href=\"rmagic\">login with your $Projectname ID</a> or <a "
-"href=\"register\">register as a new $Projectname member</a> to continue."
-msgstr "Um fortzufahren <a href=\"rmagic\">melde Dich bitte mit Deiner $Projectname-ID an</a> oder <a href=\"register\">registriere Dich als neues $Projectname-Mitglied</a>."
+"Also show new wall posts, private messages and connections under Notices"
+msgstr "Neue Pinnwand-Nachrichten, private Nachrichten und Verbindungen unter Benachrichtigungen anzeigen"
-#: ../../Zotlabs/Module/Like.php:105 ../../Zotlabs/Module/Like.php:131
-#: ../../Zotlabs/Module/Like.php:169
-msgid "Invalid request."
-msgstr "Ungültige Anfrage."
+#: ../../Zotlabs/Module/Settings/Channel.php:561
+msgid "Notify me of events this many days in advance"
+msgstr "Benachrichtige mich zu Terminen so viele Tage im Voraus"
-#: ../../Zotlabs/Module/Like.php:117 ../../include/conversation.php:126
-msgid "channel"
-msgstr "Kanal"
+#: ../../Zotlabs/Module/Settings/Channel.php:561
+msgid "Must be greater than 0"
+msgstr "Muss größer als 0 sein"
-#: ../../Zotlabs/Module/Like.php:146
-msgid "thing"
-msgstr "Sache"
+#: ../../Zotlabs/Module/Settings/Channel.php:567
+msgid "Advanced Account/Page Type Settings"
+msgstr "Erweiterte Account- und Seitenart-Einstellungen"
-#: ../../Zotlabs/Module/Like.php:192
-msgid "Channel unavailable."
-msgstr "Kanal nicht vorhanden."
+#: ../../Zotlabs/Module/Settings/Channel.php:568
+msgid "Change the behaviour of this account for special situations"
+msgstr "Ändere das Verhalten dieses Accounts unter speziellen Umständen"
-#: ../../Zotlabs/Module/Like.php:240
-msgid "Previous action reversed."
-msgstr "Die vorherige Aktion wurde rückgängig gemacht."
+#: ../../Zotlabs/Module/Settings/Channel.php:570
+msgid "Miscellaneous Settings"
+msgstr "Sonstige Einstellungen"
-#: ../../Zotlabs/Module/Like.php:370 ../../Zotlabs/Module/Subthread.php:87
-#: ../../Zotlabs/Module/Tagger.php:47
-#: ../../extend/addon/addon/diaspora/inbound.php:1794
-#: ../../extend/addon/addon/redphotos/redphotohelper.php:74
-#: ../../include/conversation.php:120 ../../include/text.php:1953
-msgid "photo"
-msgstr "Foto"
+#: ../../Zotlabs/Module/Settings/Channel.php:571
+msgid "Default photo upload folder"
+msgstr "Voreingestellter Ordner für hochgeladene Fotos"
-#: ../../Zotlabs/Module/Like.php:370 ../../Zotlabs/Module/Subthread.php:87
-#: ../../extend/addon/addon/diaspora/inbound.php:1794
-#: ../../include/conversation.php:148 ../../include/text.php:1959
-msgid "status"
-msgstr "Status"
+#: ../../Zotlabs/Module/Settings/Channel.php:571
+#: ../../Zotlabs/Module/Settings/Channel.php:572
+msgid "%Y - current year, %m - current month"
+msgstr "%Y - aktuelles Jahr, %m - aktueller Monat"
-#: ../../Zotlabs/Module/Like.php:372 ../../Zotlabs/Module/Events.php:260
-#: ../../Zotlabs/Module/Tagger.php:51 ../../include/conversation.php:123
-#: ../../include/text.php:1956 ../../include/event.php:1000
-msgid "event"
-msgstr "Termin"
+#: ../../Zotlabs/Module/Settings/Channel.php:572
+msgid "Default file upload folder"
+msgstr "Voreingestellter Ordner für hochgeladene Dateien"
-#: ../../Zotlabs/Module/Like.php:419
-#: ../../extend/addon/addon/diaspora/inbound.php:1823
-#: ../../include/conversation.php:164
+#: ../../Zotlabs/Module/Settings/Channel.php:574
+msgid "Personal menu to display in your channel pages"
+msgstr "Eigenes Menü zur Anzeige auf den Seiten deines Kanals"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:576
+msgid "Remove this channel."
+msgstr "Diesen Kanal löschen"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:577
+msgid "Firefox Share $Projectname provider"
+msgstr "$Projectname-Provider für Firefox Share"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:578
+msgid "Start calendar week on Monday"
+msgstr "Beginne die kalendarische Woche am Montag"
+
+#: ../../Zotlabs/Module/Settings/Features.php:45
+msgid "Additional Features"
+msgstr "Zusätzliche Funktionen"
+
+#: ../../Zotlabs/Module/Settings/Tokens.php:31
#, php-format
-msgid "%1$s likes %2$s's %3$s"
-msgstr "%1$s gefällt %2$ss %3$s"
+msgid "This channel is limited to %d tokens"
+msgstr "Dieser Kanal ist auf %d Token begrenzt"
+
+#: ../../Zotlabs/Module/Settings/Tokens.php:37
+msgid "Name and Password are required."
+msgstr "Name und Passwort sind erforderlich."
+
+#: ../../Zotlabs/Module/Settings/Tokens.php:77
+msgid "Token saved."
+msgstr "Token gespeichert."
-#: ../../Zotlabs/Module/Like.php:421 ../../include/conversation.php:167
+#: ../../Zotlabs/Module/Settings/Tokens.php:113
+msgid ""
+"Use this form to create temporary access identifiers to share things with "
+"non-members. These identities may be used in Access Control Lists and "
+"visitors may login using these credentials to access private content."
+msgstr "Mit diesem Formular kannst Du temporäre Zugangs-IDs anlegen, um Inhalte mit Nicht-Mitgliedern zu teilen. Die IDs können in Berechtigungslisten (ACLs) verwendet werden, und Besucher können sich damit einloggen, um auf private Inhalte zuzugreifen."
+
+#: ../../Zotlabs/Module/Settings/Tokens.php:115
+msgid ""
+"You may also provide <em>dropbox</em> style access links to friends and "
+"associates by adding the Login Password to any specific site URL as shown. "
+"Examples:"
+msgstr "Du kannst auch <em>Dropbox</em>-ähnliche Zugriffslinks an Andere weitergeben, indem du das Login-Passwort an eine entsprechende URL anhängst wie nachfolgend gezeigt. Beispiele:"
+
+#: ../../Zotlabs/Module/Settings/Tokens.php:150
+#: ../../Zotlabs/Widget/Settings_menu.php:90
+msgid "Guest Access Tokens"
+msgstr "Gastzugangstoken"
+
+#: ../../Zotlabs/Module/Settings/Tokens.php:157
+msgid "Login Name"
+msgstr "Anmeldename"
+
+#: ../../Zotlabs/Module/Settings/Tokens.php:158
+msgid "Login Password"
+msgstr "Anmeldepasswort"
+
+#: ../../Zotlabs/Module/Settings/Tokens.php:159
+msgid "Expires (yyyy-mm-dd)"
+msgstr "Läuft ab (jjjj-mm-tt)"
+
+#: ../../Zotlabs/Module/Settings/Tokens.php:160
+#: ../../Zotlabs/Module/Connedit.php:885
+msgid "Their Settings"
+msgstr "Deren Einstellungen"
+
+#: ../../Zotlabs/Module/Settings/Account.php:20
+msgid "Not valid email."
+msgstr "Keine gültige E-Mail Adresse."
+
+#: ../../Zotlabs/Module/Settings/Account.php:23
+msgid "Protected email address. Cannot change to that email."
+msgstr "Geschützte E-Mail Adresse. Diese kann nicht verändert werden."
+
+#: ../../Zotlabs/Module/Settings/Account.php:32
+msgid "System failure storing new email. Please try again."
+msgstr "Systemfehler während des Speicherns der neuen Mail. Bitte versuche es noch einmal."
+
+#: ../../Zotlabs/Module/Settings/Account.php:40
+msgid "Technical skill level updated"
+msgstr "Technische Qualifikationsstufe aktualisiert"
+
+#: ../../Zotlabs/Module/Settings/Account.php:56
+msgid "Password verification failed."
+msgstr "Passwortüberprüfung fehlgeschlagen."
+
+#: ../../Zotlabs/Module/Settings/Account.php:63
+msgid "Passwords do not match. Password unchanged."
+msgstr "Kennwörter stimmen nicht überein. Kennwort nicht verändert."
+
+#: ../../Zotlabs/Module/Settings/Account.php:67
+msgid "Empty passwords are not allowed. Password unchanged."
+msgstr "Leere Kennwörter sind nicht erlaubt. Kennwort nicht verändert."
+
+#: ../../Zotlabs/Module/Settings/Account.php:81
+msgid "Password changed."
+msgstr "Kennwort geändert."
+
+#: ../../Zotlabs/Module/Settings/Account.php:83
+msgid "Password update failed. Please try again."
+msgstr "Kennwortänderung fehlgeschlagen. Bitte versuche es noch einmal."
+
+#: ../../Zotlabs/Module/Settings/Account.php:112
+msgid "Account Settings"
+msgstr "Konto-Einstellungen"
+
+#: ../../Zotlabs/Module/Settings/Account.php:113
+msgid "Current Password"
+msgstr "Aktuelles Passwort"
+
+#: ../../Zotlabs/Module/Settings/Account.php:114
+msgid "Enter New Password"
+msgstr "Gib ein neues Passwort ein"
+
+#: ../../Zotlabs/Module/Settings/Account.php:115
+msgid "Confirm New Password"
+msgstr "Bestätige das neue Passwort"
+
+#: ../../Zotlabs/Module/Settings/Account.php:115
+msgid "Leave password fields blank unless changing"
+msgstr "Lasse die Passwort-Felder leer, außer Du möchtest das Passwort ändern"
+
+#: ../../Zotlabs/Module/Settings/Account.php:116
+msgid "Your technical skill level"
+msgstr "Deine technische Qualifikationsstufe"
+
+#: ../../Zotlabs/Module/Settings/Account.php:116
+msgid "Used to provide a member experience matched to your comfort level"
+msgstr "Dies wird verwendet, um Dir eine Benutzererfahrung passend zu Deiner technischen Qualifikationsstufe zu bieten."
+
+#: ../../Zotlabs/Module/Settings/Account.php:120
+#: ../../Zotlabs/Module/Removeaccount.php:61
+msgid "Remove Account"
+msgstr "Konto entfernen"
+
+#: ../../Zotlabs/Module/Settings/Account.php:121
+msgid "Remove this account including all its channels"
+msgstr "Dieses Konto inklusive all seiner Kanäle löschen"
+
+#: ../../Zotlabs/Module/Settings/Featured.php:20
+msgid "Affinity Slider settings updated."
+msgstr "Die Beziehungsgrad-Schieberegler-Einstellungen wurden aktualisiert."
+
+#: ../../Zotlabs/Module/Settings/Featured.php:34
+msgid "No feature settings configured"
+msgstr "Keine Funktions-Einstellungen konfiguriert"
+
+#: ../../Zotlabs/Module/Settings/Featured.php:41
+msgid "Default maximum affinity level"
+msgstr "Voreinstellung für maximalen Beziehungsgrad"
+
+#: ../../Zotlabs/Module/Settings/Featured.php:46
+msgid "Default minimum affinity level"
+msgstr "Voreinstellung für minimalen Beziehungsgrad"
+
+#: ../../Zotlabs/Module/Settings/Featured.php:50
+msgid "Affinity Slider Settings"
+msgstr "Beziehungsgrad-Schieberegler-Einstellungen"
+
+#: ../../Zotlabs/Module/Settings/Featured.php:60
+msgid "Feature/Addon Settings"
+msgstr "Funktions-/Addon-Einstellungen"
+
+#: ../../Zotlabs/Module/Settings/Display.php:145
+msgid "No special theme for mobile devices"
+msgstr "Keine spezielle Theme für mobile Geräte"
+
+#: ../../Zotlabs/Module/Settings/Display.php:148
#, php-format
-msgid "%1$s doesn't like %2$s's %3$s"
-msgstr "%1$s gefällt %2$ss %3$s nicht"
+msgid "%s - (Experimental)"
+msgstr "%s – (experimentell)"
-#: ../../Zotlabs/Module/Like.php:423
+#: ../../Zotlabs/Module/Settings/Display.php:198
+msgid "Display Settings"
+msgstr "Anzeige-Einstellungen"
+
+#: ../../Zotlabs/Module/Settings/Display.php:199
+msgid "Theme Settings"
+msgstr "Theme-Einstellungen"
+
+#: ../../Zotlabs/Module/Settings/Display.php:200
+msgid "Custom Theme Settings"
+msgstr "Benutzerdefinierte Theme-Einstellungen"
+
+#: ../../Zotlabs/Module/Settings/Display.php:201
+msgid "Content Settings"
+msgstr "Inhaltseinstellungen"
+
+#: ../../Zotlabs/Module/Settings/Display.php:207
+msgid "Display Theme:"
+msgstr "Anzeige-Theme:"
+
+#: ../../Zotlabs/Module/Settings/Display.php:208
+msgid "Select scheme"
+msgstr "Schema wählen"
+
+#: ../../Zotlabs/Module/Settings/Display.php:210
+msgid "Mobile Theme:"
+msgstr "Mobile Theme:"
+
+#: ../../Zotlabs/Module/Settings/Display.php:211
+msgid "Preload images before rendering the page"
+msgstr "Bilder im voraus laden, bevor die Seite angezeigt wird"
+
+#: ../../Zotlabs/Module/Settings/Display.php:211
+msgid ""
+"The subjective page load time will be longer but the page will be ready when"
+" displayed"
+msgstr "Die empfundene Ladezeit wird sich erhöhen, aber dafür ist das Layout stabil, sobald eine Seite angezeigt wird"
+
+#: ../../Zotlabs/Module/Settings/Display.php:212
+msgid "Enable user zoom on mobile devices"
+msgstr "Zoom auf Mobilgeräten aktivieren"
+
+#: ../../Zotlabs/Module/Settings/Display.php:213
+msgid "Update browser every xx seconds"
+msgstr "Browser alle xx Sekunden aktualisieren"
+
+#: ../../Zotlabs/Module/Settings/Display.php:213
+msgid "Minimum of 10 seconds, no maximum"
+msgstr "Minimum 10 Sekunden, kein Maximum"
+
+#: ../../Zotlabs/Module/Settings/Display.php:214
+msgid "Maximum number of conversations to load at any time:"
+msgstr "Maximale Anzahl von Unterhaltungen, die auf einmal geladen werden sollen:"
+
+#: ../../Zotlabs/Module/Settings/Display.php:214
+msgid "Maximum of 100 items"
+msgstr "Maximum: 100 Beiträge"
+
+#: ../../Zotlabs/Module/Settings/Display.php:215
+msgid "Show emoticons (smilies) as images"
+msgstr "Emoticons (Smilies) als Bilder anzeigen"
+
+#: ../../Zotlabs/Module/Settings/Display.php:216
+msgid "Manual conversation updates"
+msgstr "Manuelle Konversationsaktualisierung"
+
+#: ../../Zotlabs/Module/Settings/Display.php:216
+msgid "Default is on, turning this off may increase screen jumping"
+msgstr "Voreinstellung ist An, dies abzuschalten kann das unerwartete Springen der Seitenanzeige erhöhen."
+
+#: ../../Zotlabs/Module/Settings/Display.php:217
+msgid "Link post titles to source"
+msgstr "Beitragstitel zum Originalbeitrag verlinken"
+
+#: ../../Zotlabs/Module/Settings/Display.php:218
+msgid "System Page Layout Editor - (advanced)"
+msgstr "System-Seitenlayout-Editor (für Experten)"
+
+#: ../../Zotlabs/Module/Settings/Display.php:221
+msgid "Use blog/list mode on channel page"
+msgstr "Blog-/Listenmodus auf der Kanalseite verwenden"
+
+#: ../../Zotlabs/Module/Settings/Display.php:221
+#: ../../Zotlabs/Module/Settings/Display.php:222
+msgid "(comments displayed separately)"
+msgstr "(Kommentare werden separat angezeigt)"
+
+#: ../../Zotlabs/Module/Settings/Display.php:222
+msgid "Use blog/list mode on grid page"
+msgstr "Blog-/Listenmodus auf der Netzwerkseite verwenden"
+
+#: ../../Zotlabs/Module/Settings/Display.php:223
+msgid "Channel page max height of content (in pixels)"
+msgstr "Maximale Höhe von Beitragsblöcken auf der Kanalseite (in Pixeln)"
+
+#: ../../Zotlabs/Module/Settings/Display.php:223
+#: ../../Zotlabs/Module/Settings/Display.php:224
+msgid "click to expand content exceeding this height"
+msgstr "Blöcke, deren Inhalt diese Höhe überschreitet, können per Klick vergrößert werden."
+
+#: ../../Zotlabs/Module/Settings/Display.php:224
+msgid "Grid page max height of content (in pixels)"
+msgstr "Maximale Höhe (in Pixel) des Inhalts der Netzwerkseite"
+
+#: ../../Zotlabs/Module/Settings/Oauth.php:34
+msgid "Name is required"
+msgstr "Name ist erforderlich"
+
+#: ../../Zotlabs/Module/Settings/Oauth.php:38
+msgid "Key and Secret are required"
+msgstr "Schlüssel und Geheimnis werden benötigt"
+
+#: ../../Zotlabs/Module/Settings/Oauth.php:86
+#: ../../Zotlabs/Module/Settings/Oauth.php:112
+#: ../../Zotlabs/Module/Settings/Oauth.php:148
+msgid "Add application"
+msgstr "Anwendung hinzufügen"
+
+#: ../../Zotlabs/Module/Settings/Oauth.php:89
+msgid "Name of application"
+msgstr "Name der Anwendung"
+
+#: ../../Zotlabs/Module/Settings/Oauth.php:90
+#: ../../Zotlabs/Module/Settings/Oauth.php:116
+#: ../../addon/statusnet/statusnet.php:893 ../../addon/twitter/twitter.php:775
+msgid "Consumer Key"
+msgstr "Consumer Key"
+
+#: ../../Zotlabs/Module/Settings/Oauth.php:90
+#: ../../Zotlabs/Module/Settings/Oauth.php:91
+msgid "Automatically generated - change if desired. Max length 20"
+msgstr "Automatisch erzeugt – ändern, falls erwünscht. Maximale Länge 20"
+
+#: ../../Zotlabs/Module/Settings/Oauth.php:91
+#: ../../Zotlabs/Module/Settings/Oauth.php:117
+#: ../../addon/statusnet/statusnet.php:892 ../../addon/twitter/twitter.php:776
+msgid "Consumer Secret"
+msgstr "Consumer Secret"
+
+#: ../../Zotlabs/Module/Settings/Oauth.php:92
+#: ../../Zotlabs/Module/Settings/Oauth.php:118
+msgid "Redirect"
+msgstr "Umleitung"
+
+#: ../../Zotlabs/Module/Settings/Oauth.php:92
+msgid ""
+"Redirect URI - leave blank unless your application specifically requires "
+"this"
+msgstr "Umleitungs-URl – lasse das leer, solange Deine Anwendung es nicht explizit erfordert"
+
+#: ../../Zotlabs/Module/Settings/Oauth.php:93
+#: ../../Zotlabs/Module/Settings/Oauth.php:119
+msgid "Icon url"
+msgstr "Symbol-URL"
+
+#: ../../Zotlabs/Module/Settings/Oauth.php:93
+#: ../../Zotlabs/Module/Sources.php:112 ../../Zotlabs/Module/Sources.php:147
+msgid "Optional"
+msgstr "Optional"
+
+#: ../../Zotlabs/Module/Settings/Oauth.php:104
+msgid "Application not found."
+msgstr "Die Anwendung wurde nicht gefunden."
+
+#: ../../Zotlabs/Module/Settings/Oauth.php:147
+msgid "Connected Apps"
+msgstr "Verbundene Apps"
+
+#: ../../Zotlabs/Module/Settings/Oauth.php:151
+msgid "Client key starts with"
+msgstr "Client Key beginnt mit"
+
+#: ../../Zotlabs/Module/Settings/Oauth.php:152
+msgid "No name"
+msgstr "Kein Name"
+
+#: ../../Zotlabs/Module/Settings/Oauth.php:153
+msgid "Remove authorization"
+msgstr "Authorisierung aufheben"
+
+#: ../../Zotlabs/Module/Embedphotos.php:140
+#: ../../Zotlabs/Module/Photos.php:751 ../../Zotlabs/Module/Photos.php:1290
+#: ../../Zotlabs/Widget/Album.php:78
+msgid "View Photo"
+msgstr "Foto ansehen"
+
+#: ../../Zotlabs/Module/Embedphotos.php:146
+#: ../../Zotlabs/Module/Photos.php:757 ../../Zotlabs/Module/Photos.php:1213
+#: ../../Zotlabs/Lib/Apps.php:571 ../../Zotlabs/Lib/Apps.php:649
+#: ../../Zotlabs/Storage/Browser.php:163 ../../Zotlabs/Widget/Album.php:84
+#: ../../addon/cdav/Mod_Cdav.php:745 ../../addon/cdav/Mod_Cdav.php:746
+#: ../../addon/cdav/Mod_Cdav.php:753 ../../include/conversation.php:1110
+msgid "Unknown"
+msgstr "Unbekannt"
+
+#: ../../Zotlabs/Module/Embedphotos.php:156
+#: ../../Zotlabs/Module/Photos.php:782 ../../Zotlabs/Widget/Album.php:95
+msgid "Edit Album"
+msgstr "Album bearbeiten"
+
+#: ../../Zotlabs/Module/Embedphotos.php:158
+#: ../../Zotlabs/Module/Photos.php:784 ../../Zotlabs/Module/Photos.php:1321
+#: ../../Zotlabs/Module/Profile_photo.php:423
+#: ../../Zotlabs/Module/Cover_photo.php:361
+#: ../../Zotlabs/Storage/Browser.php:229 ../../Zotlabs/Storage/Browser.php:334
+#: ../../Zotlabs/Widget/Album.php:97 ../../addon/cdav/include/widgets.php:132
+#: ../../addon/cdav/include/widgets.php:168
+msgid "Upload"
+msgstr "Hochladen"
+
+#: ../../Zotlabs/Module/Achievements.php:38
+msgid "Some blurb about what to do when you're new here"
+msgstr "Ein Hinweis, was man tun kann, wenn man neu hier ist"
+
+#: ../../Zotlabs/Module/Thing.php:114
+msgid "Thing updated"
+msgstr "Sache aktualisiert"
+
+#: ../../Zotlabs/Module/Thing.php:166
+msgid "Object store: failed"
+msgstr "Speichern des Objekts fehlgeschlagen"
+
+#: ../../Zotlabs/Module/Thing.php:170
+msgid "Thing added"
+msgstr "Sache hinzugefügt"
+
+#: ../../Zotlabs/Module/Thing.php:196
#, php-format
-msgid "%1$s agrees with %2$s's %3$s"
-msgstr "%1$s stimmt %2$ss %3$s zu"
+msgid "OBJ: %1$s %2$s %3$s"
+msgstr "OBJ: %1$s %2$s %3$s"
-#: ../../Zotlabs/Module/Like.php:425
+#: ../../Zotlabs/Module/Thing.php:259
+msgid "Show Thing"
+msgstr "Sache anzeigen"
+
+#: ../../Zotlabs/Module/Thing.php:266
+msgid "item not found."
+msgstr "Eintrag nicht gefunden"
+
+#: ../../Zotlabs/Module/Thing.php:299
+msgid "Edit Thing"
+msgstr "Sache bearbeiten"
+
+#: ../../Zotlabs/Module/Thing.php:301 ../../Zotlabs/Module/Thing.php:355
+msgid "Select a profile"
+msgstr "Wähle ein Profil"
+
+#: ../../Zotlabs/Module/Thing.php:305 ../../Zotlabs/Module/Thing.php:358
+msgid "Post an activity"
+msgstr "Aktivitätsnachricht senden"
+
+#: ../../Zotlabs/Module/Thing.php:305 ../../Zotlabs/Module/Thing.php:358
+msgid "Only sends to viewers of the applicable profile"
+msgstr "Nur an Betrachter des ausgewählten Profils senden"
+
+#: ../../Zotlabs/Module/Thing.php:307 ../../Zotlabs/Module/Thing.php:360
+msgid "Name of thing e.g. something"
+msgstr "Name der Sache, z. B. irgendwas"
+
+#: ../../Zotlabs/Module/Thing.php:309 ../../Zotlabs/Module/Thing.php:361
+msgid "URL of thing (optional)"
+msgstr "URL der Sache (optional)"
+
+#: ../../Zotlabs/Module/Thing.php:311 ../../Zotlabs/Module/Thing.php:362
+msgid "URL for photo of thing (optional)"
+msgstr "URL eines Fotos der Sache (optional)"
+
+#: ../../Zotlabs/Module/Thing.php:313 ../../Zotlabs/Module/Thing.php:363
+#: ../../Zotlabs/Module/Photos.php:647 ../../Zotlabs/Module/Photos.php:1011
+#: ../../Zotlabs/Module/Connedit.php:672 ../../Zotlabs/Module/Chat.php:233
+#: ../../Zotlabs/Module/Filestorage.php:152
+#: ../../include/acl_selectors.php:218
+msgid "Permissions"
+msgstr "Berechtigungen"
+
+#: ../../Zotlabs/Module/Thing.php:353
+msgid "Add Thing to your Profile"
+msgstr "Die Sache Deinem Profil hinzufügen"
+
+#: ../../Zotlabs/Module/Notify.php:57
+#: ../../Zotlabs/Module/Notifications.php:38
+msgid "No more system notifications."
+msgstr "Keine System-Benachrichtigungen mehr."
+
+#: ../../Zotlabs/Module/Notify.php:61
+#: ../../Zotlabs/Module/Notifications.php:42
+msgid "System Notifications"
+msgstr "System-Benachrichtigungen"
+
+#: ../../Zotlabs/Module/Follow.php:31
+msgid "Channel added."
+msgstr "Kanal hinzugefügt."
+
+#: ../../Zotlabs/Module/Import.php:144
#, php-format
-msgid "%1$s doesn't agree with %2$s's %3$s"
-msgstr "%1$s lehnt %2$ss %3$s ab"
+msgid "Your service plan only allows %d channels."
+msgstr "Dein Vertrag erlaubt nur %d Kanäle."
-#: ../../Zotlabs/Module/Like.php:427
+#: ../../Zotlabs/Module/Import.php:158
+msgid "No channel. Import failed."
+msgstr "Kein Kanal. Import fehlgeschlagen."
+
+#: ../../Zotlabs/Module/Import.php:466
+#: ../../addon/diaspora/import_diaspora.php:142
+msgid "Import completed."
+msgstr "Import abgeschlossen."
+
+#: ../../Zotlabs/Module/Import.php:494
+msgid "You must be logged in to use this feature."
+msgstr "Du musst angemeldet sein um diese Funktion zu nutzen."
+
+#: ../../Zotlabs/Module/Import.php:499
+msgid "Import Channel"
+msgstr "Kanal importieren"
+
+#: ../../Zotlabs/Module/Import.php:500
+msgid ""
+"Use this form to import an existing channel from a different server/hub. You"
+" may retrieve the channel identity from the old server/hub via the network "
+"or provide an export file."
+msgstr "Verwende dieses Formular, um einen existierenden Kanal von einem anderen Hub zu importieren. Du kannst den Kanal direkt vom bisherigen Hub über das Netzwerk oder aus einer exportierten Sicherheitskopie importieren."
+
+#: ../../Zotlabs/Module/Import.php:502
+msgid "Or provide the old server/hub details"
+msgstr "Oder gib die Details Deines bisherigen $Projectname-Hubs ein"
+
+#: ../../Zotlabs/Module/Import.php:503
+msgid "Your old identity address (xyz@example.com)"
+msgstr "Bisherige Kanal-Adresse (xyz@example.com)"
+
+#: ../../Zotlabs/Module/Import.php:504
+msgid "Your old login email address"
+msgstr "Deine alte Login-E-Mail-Adresse"
+
+#: ../../Zotlabs/Module/Import.php:505
+msgid "Your old login password"
+msgstr "Dein altes Passwort"
+
+#: ../../Zotlabs/Module/Import.php:506
+msgid ""
+"For either option, please choose whether to make this hub your new primary "
+"address, or whether your old location should continue this role. You will be"
+" able to post from either location, but only one can be marked as the "
+"primary location for files, photos, and media."
+msgstr "Egal, welche Option Du wählst – bitte lege fest, ob dieser Server die neue primäre Adresse dieses Kanals sein soll, oder ob der bisherige $Projectname-Hub diese Rolle weiterhin wahrnimmt. Du kannst von beiden Servern aus posten, aber nur einer kann der primäre Ort Deiner Dateien, Fotos und Medien sein."
+
+#: ../../Zotlabs/Module/Import.php:507
+msgid "Make this hub my primary location"
+msgstr "Dieser $Pojectname-Hub ist mein primärer Hub."
+
+#: ../../Zotlabs/Module/Import.php:508
+msgid "Move this channel (disable all previous locations)"
+msgstr "Verschiebe diesen Kanal (deaktiviere alle vorherigen Adressen/Klone)"
+
+#: ../../Zotlabs/Module/Import.php:509
+msgid "Import a few months of posts if possible (limited by available memory"
+msgstr "Importiere die Beiträge einiger Monate, sofern möglich (beschränkt durch verfügbaren Speicher)"
+
+#: ../../Zotlabs/Module/Import.php:510
+msgid ""
+"This process may take several minutes to complete. Please submit the form "
+"only once and leave this page open until finished."
+msgstr "Dieser Vorgang kann einige Minuten dauern. Bitte sende das Formular nur einmal ab und lasse diese Seite bis zur Fertigstellung offen."
+
+#: ../../Zotlabs/Module/Rmagic.php:35
+msgid "Authentication failed."
+msgstr "Authentifizierung fehlgeschlagen."
+
+#: ../../Zotlabs/Module/Rmagic.php:75 ../../include/channel.php:1984
+msgid "Remote Authentication"
+msgstr "Entfernte Authentifizierung"
+
+#: ../../Zotlabs/Module/Rmagic.php:76 ../../include/channel.php:1985
+msgid "Enter your channel address (e.g. channel@example.com)"
+msgstr "Deine Kanal-Adresse (z. B. channel@example.com)"
+
+#: ../../Zotlabs/Module/Rmagic.php:77 ../../include/channel.php:1986
+msgid "Authenticate"
+msgstr "Authentifizieren"
+
+#: ../../Zotlabs/Module/Cal.php:62 ../../Zotlabs/Module/Chanview.php:96
+#: ../../Zotlabs/Module/Page.php:56 ../../Zotlabs/Module/Wall_upload.php:31
+#: ../../Zotlabs/Module/Block.php:43
+msgid "Channel not found."
+msgstr "Kanal nicht gefunden."
+
+#: ../../Zotlabs/Module/Cal.php:69
+msgid "Permissions denied."
+msgstr "Berechtigung verweigert."
+
+#: ../../Zotlabs/Module/Cal.php:342 ../../include/text.php:2291
+msgid "Import"
+msgstr "Import"
+
+#: ../../Zotlabs/Module/Api.php:72 ../../Zotlabs/Module/Api.php:93
+msgid "Authorize application connection"
+msgstr "Zugriff für die Anwendung autorisieren"
+
+#: ../../Zotlabs/Module/Api.php:73
+msgid "Return to your app and insert this Security Code:"
+msgstr "Gehen Sie zu Ihrer App zurück und tragen Sie diesen Sicherheitscode ein:"
+
+#: ../../Zotlabs/Module/Api.php:83
+msgid "Please login to continue."
+msgstr "Zum Weitermachen, bitte einloggen."
+
+#: ../../Zotlabs/Module/Api.php:95
+msgid ""
+"Do you want to authorize this application to access your posts and contacts,"
+" and/or create new posts for you?"
+msgstr "Möchtest Du dieser Anwendung erlauben, Deine Nachrichten und Kontakte abzurufen und/oder neue Nachrichten für Dich zu erstellen?"
+
+#: ../../Zotlabs/Module/Attach.php:13
+msgid "Item not available."
+msgstr "Element nicht verfügbar."
+
+#: ../../Zotlabs/Module/Editblock.php:116 ../../Zotlabs/Module/Chat.php:205
+#: ../../Zotlabs/Module/Editwebpage.php:143 ../../Zotlabs/Module/Mail.php:306
+#: ../../Zotlabs/Module/Mail.php:448 ../../include/conversation.php:1228
+msgid "Insert web link"
+msgstr "Link einfügen"
+
+#: ../../Zotlabs/Module/Editblock.php:129 ../../include/conversation.php:1339
+msgid "Title (optional)"
+msgstr "Titel (optional)"
+
+#: ../../Zotlabs/Module/Editblock.php:138
+msgid "Edit Block"
+msgstr "Block bearbeiten"
+
+#: ../../Zotlabs/Module/Profile.php:91
+msgid "vcard"
+msgstr "VCard"
+
+#: ../../Zotlabs/Module/Apps.php:45
+msgid "Apps"
+msgstr "Apps"
+
+#: ../../Zotlabs/Module/Apps.php:48
+msgid "Manage apps"
+msgstr "Apps verwalten"
+
+#: ../../Zotlabs/Module/Apps.php:49
+msgid "Create new app"
+msgstr "Neue App erstellen"
+
+#: ../../Zotlabs/Module/Mood.php:67 ../../include/conversation.php:256
#, php-format
-msgid "%1$s abstains from a decision on %2$s's %3$s"
-msgstr "%1$s enthält sich zu %2$ss %3$s"
+msgctxt "mood"
+msgid "%1$s is %2$s"
+msgstr "%1$s ist %2$s"
-#: ../../Zotlabs/Module/Like.php:429
+#: ../../Zotlabs/Module/Mood.php:135 ../../Zotlabs/Lib/Apps.php:234
+msgid "Mood"
+msgstr "Laune"
+
+#: ../../Zotlabs/Module/Mood.php:136
+msgid "Set your current mood and tell your friends"
+msgstr "Wähle Deine aktuelle Stimmung und teile sie mit Deinen Freunden"
+
+#: ../../Zotlabs/Module/Connections.php:52
+#: ../../Zotlabs/Module/Connections.php:157
+#: ../../Zotlabs/Module/Connections.php:246
+msgid "Blocked"
+msgstr "Blockiert"
+
+#: ../../Zotlabs/Module/Connections.php:57
+#: ../../Zotlabs/Module/Connections.php:164
+#: ../../Zotlabs/Module/Connections.php:245
+msgid "Ignored"
+msgstr "Ignoriert"
+
+#: ../../Zotlabs/Module/Connections.php:62
+#: ../../Zotlabs/Module/Connections.php:178
+#: ../../Zotlabs/Module/Connections.php:244
+msgid "Hidden"
+msgstr "Versteckt"
+
+#: ../../Zotlabs/Module/Connections.php:67
+#: ../../Zotlabs/Module/Connections.php:171
+#: ../../Zotlabs/Module/Connections.php:243
+msgid "Archived"
+msgstr "Archiviert"
+
+#: ../../Zotlabs/Module/Connections.php:72
+#: ../../Zotlabs/Module/Connections.php:82 ../../Zotlabs/Module/Menu.php:116
+#: ../../include/conversation.php:1666
+msgid "New"
+msgstr "Neu"
+
+#: ../../Zotlabs/Module/Connections.php:88
+#: ../../Zotlabs/Module/Connections.php:103
+#: ../../Zotlabs/Module/Connedit.php:709 ../../Zotlabs/Widget/Affinity.php:30
+msgid "All"
+msgstr "Alle"
+
+#: ../../Zotlabs/Module/Connections.php:134
+msgid "New Connections"
+msgstr "Neue Verbindungen"
+
+#: ../../Zotlabs/Module/Connections.php:137
+msgid "Show pending (new) connections"
+msgstr "Ausstehende (neue) Verbindungsanfragen anzeigen"
+
+#: ../../Zotlabs/Module/Connections.php:144
+msgid "Show all connections"
+msgstr "Alle Verbindungen anzeigen"
+
+#: ../../Zotlabs/Module/Connections.php:160
+msgid "Only show blocked connections"
+msgstr "Nur blockierte Verbindungen anzeigen"
+
+#: ../../Zotlabs/Module/Connections.php:167
+msgid "Only show ignored connections"
+msgstr "Nur ignorierte Verbindungen anzeigen"
+
+#: ../../Zotlabs/Module/Connections.php:174
+msgid "Only show archived connections"
+msgstr "Nur archivierte Verbindungen anzeigen"
+
+#: ../../Zotlabs/Module/Connections.php:181
+msgid "Only show hidden connections"
+msgstr "Nur versteckte Verbindungen anzeigen"
+
+#: ../../Zotlabs/Module/Connections.php:242
+msgid "Pending approval"
+msgstr "Wartet auf Genehmigung"
+
+#: ../../Zotlabs/Module/Connections.php:258
#, php-format
-msgid "%1$s is attending %2$s's %3$s"
-msgstr "%1$s nimmt an %2$ss %3$s teil"
+msgid "%1$s [%2$s]"
+msgstr "%1$s [%2$s]"
-#: ../../Zotlabs/Module/Like.php:431
+#: ../../Zotlabs/Module/Connections.php:259
+msgid "Edit connection"
+msgstr "Verbindung bearbeiten"
+
+#: ../../Zotlabs/Module/Connections.php:260
+msgid "Delete connection"
+msgstr "Verbindung löschen"
+
+#: ../../Zotlabs/Module/Connections.php:269
+msgid "Channel address"
+msgstr "Kanaladresse"
+
+#: ../../Zotlabs/Module/Connections.php:271
+msgid "Network"
+msgstr "Netzwerk"
+
+#: ../../Zotlabs/Module/Connections.php:274
+msgid "Call"
+msgstr "Anruf"
+
+#: ../../Zotlabs/Module/Connections.php:276
+msgid "Status"
+msgstr "Status"
+
+#: ../../Zotlabs/Module/Connections.php:278
+msgid "Connected"
+msgstr "Verbunden"
+
+#: ../../Zotlabs/Module/Connections.php:280
+msgid "Approve connection"
+msgstr "Verbindung genehmigen"
+
+#: ../../Zotlabs/Module/Connections.php:282
+msgid "Ignore connection"
+msgstr "Verbindung ignorieren"
+
+#: ../../Zotlabs/Module/Connections.php:283
+#: ../../Zotlabs/Module/Connedit.php:626
+msgid "Ignore"
+msgstr "Ignorieren"
+
+#: ../../Zotlabs/Module/Connections.php:284
+msgid "Recent activity"
+msgstr "Kürzliche Aktivitäten"
+
+#: ../../Zotlabs/Module/Connections.php:308 ../../Zotlabs/Lib/Apps.php:216
+#: ../../include/text.php:957 ../../include/nav.php:185
+msgid "Connections"
+msgstr "Verbindungen"
+
+#: ../../Zotlabs/Module/Connections.php:313
+msgid "Search your connections"
+msgstr "Verbindungen durchsuchen"
+
+#: ../../Zotlabs/Module/Connections.php:314
+msgid "Connections search"
+msgstr "Verbindung suchen"
+
+#: ../../Zotlabs/Module/Connections.php:315
+#: ../../Zotlabs/Module/Directory.php:391
+#: ../../Zotlabs/Module/Directory.php:396 ../../include/contact_widgets.php:23
+msgid "Find"
+msgstr "Finde"
+
+#: ../../Zotlabs/Module/Viewsrc.php:43
+msgid "item"
+msgstr ""
+
+#: ../../Zotlabs/Module/Viewsrc.php:55
+msgid "Source of Item"
+msgstr "Quelle des Elements"
+
+#: ../../Zotlabs/Module/Bookmarks.php:53
+msgid "Bookmark added"
+msgstr "Lesezeichen hinzugefügt"
+
+#: ../../Zotlabs/Module/Bookmarks.php:76
+msgid "My Bookmarks"
+msgstr "Meine Lesezeichen"
+
+#: ../../Zotlabs/Module/Bookmarks.php:87
+msgid "My Connections Bookmarks"
+msgstr "Lesezeichen meiner Kontakte"
+
+#: ../../Zotlabs/Module/Removeaccount.php:35
+msgid ""
+"Account removals are not allowed within 48 hours of changing the account "
+"password."
+msgstr "Das Löschen von Konten innerhalb 48 Stunden nachdem deren Passwort geändert wurde ist nicht erlaubt."
+
+#: ../../Zotlabs/Module/Removeaccount.php:57
+msgid "Remove This Account"
+msgstr "Dieses Konto löschen"
+
+#: ../../Zotlabs/Module/Removeaccount.php:58
+msgid ""
+"This account and all its channels will be completely removed from the "
+"network. "
+msgstr "Dieses Konto mit all seinen Kanälen wird vollständig aus dem Netzwerk gelöscht."
+
+#: ../../Zotlabs/Module/Removeaccount.php:60
+msgid ""
+"Remove this account, all its channels and all its channel clones from the "
+"network"
+msgstr "Dieses Konto, all seine Kanäle sowie alle Kanal-Klone aus dem Netzwerk löschen"
+
+#: ../../Zotlabs/Module/Removeaccount.php:60
+msgid ""
+"By default only the instances of the channels located on this hub will be "
+"removed from the network"
+msgstr "Standardmäßig werden nur die Kanalklone auf diesem $Projectname-Hub aus dem Netzwerk entfernt"
+
+#: ../../Zotlabs/Module/Photos.php:78
+msgid "Page owner information could not be retrieved."
+msgstr "Informationen über den Besitzer der Seite konnten nicht gefunden werden."
+
+#: ../../Zotlabs/Module/Photos.php:94 ../../Zotlabs/Module/Photos.php:120
+msgid "Album not found."
+msgstr "Album nicht gefunden."
+
+#: ../../Zotlabs/Module/Photos.php:103
+msgid "Delete Album"
+msgstr "Album löschen"
+
+#: ../../Zotlabs/Module/Photos.php:174 ../../Zotlabs/Module/Photos.php:1023
+msgid "Delete Photo"
+msgstr "Foto löschen"
+
+#: ../../Zotlabs/Module/Photos.php:501
+msgid "No photos selected"
+msgstr "Keine Fotos ausgewählt"
+
+#: ../../Zotlabs/Module/Photos.php:550
+msgid "Access to this item is restricted."
+msgstr "Der Zugriff auf dieses Foto ist eingeschränkt."
+
+#: ../../Zotlabs/Module/Photos.php:591
#, php-format
-msgid "%1$s is not attending %2$s's %3$s"
-msgstr "%1$s nimmt an %2$ss %3$s nicht teil"
+msgid "%1$.2f MB of %2$.2f MB photo storage used."
+msgstr "%1$.2f MB von %2$.2f MB Foto-Speicher belegt."
-#: ../../Zotlabs/Module/Like.php:433
+#: ../../Zotlabs/Module/Photos.php:594
#, php-format
-msgid "%1$s may attend %2$s's %3$s"
-msgstr "%1$s nimmt vielleicht an %2$ss %3$s teil"
+msgid "%1$.2f MB photo storage used."
+msgstr "%1$.2f MB Foto-Speicher belegt."
-#: ../../Zotlabs/Module/Like.php:538
-msgid "Action completed."
-msgstr "Aktion durchgeführt."
+#: ../../Zotlabs/Module/Photos.php:636
+msgid "Upload Photos"
+msgstr "Fotos hochladen"
-#: ../../Zotlabs/Module/Like.php:539
-msgid "Thank you."
-msgstr "Vielen Dank."
+#: ../../Zotlabs/Module/Photos.php:640
+msgid "Enter an album name"
+msgstr "Namen für ein neues Album eingeben"
-#: ../../Zotlabs/Module/Dirsearch.php:25 ../../Zotlabs/Module/Regdir.php:49
-msgid "This site is not a directory server"
-msgstr "Diese Webseite ist kein Verzeichnisserver"
+#: ../../Zotlabs/Module/Photos.php:641
+msgid "or select an existing album (doubleclick)"
+msgstr "oder ein bereits vorhandenes auswählen (Doppelklick)"
-#: ../../Zotlabs/Module/Dirsearch.php:33
-msgid "This directory server requires an access token"
-msgstr "Dieser Verzeichnisserver benötigt einen Zugriffstoken"
+#: ../../Zotlabs/Module/Photos.php:642
+msgid "Create a status post for this upload"
+msgstr "Einen Statusbeitrag für diesen Upload erzeugen"
-#: ../../Zotlabs/Module/Network.php:96
-msgid "No such group"
-msgstr "Gruppe nicht gefunden"
+#: ../../Zotlabs/Module/Photos.php:643
+msgid "Caption (optional):"
+msgstr "Beschriftung (optional):"
-#: ../../Zotlabs/Module/Network.php:136
-msgid "No such channel"
-msgstr "Kanal nicht gefunden"
+#: ../../Zotlabs/Module/Photos.php:644
+msgid "Description (optional):"
+msgstr "Beschreibung (optional):"
-#: ../../Zotlabs/Module/Network.php:141
-msgid "forum"
-msgstr "Forum"
+#: ../../Zotlabs/Module/Photos.php:725
+msgid "Show Newest First"
+msgstr "Neueste zuerst anzeigen"
-#: ../../Zotlabs/Module/Network.php:153
-msgid "Search Results For:"
-msgstr "Suchergebnisse für:"
+#: ../../Zotlabs/Module/Photos.php:727
+msgid "Show Oldest First"
+msgstr "Älteste zuerst anzeigen"
-#: ../../Zotlabs/Module/Network.php:221
-msgid "Privacy group is empty"
-msgstr "Gruppe ist leer"
+#: ../../Zotlabs/Module/Photos.php:832
+msgid "Permission denied. Access to this item may be restricted."
+msgstr "Berechtigung verweigert. Der Zugriff ist wahrscheinlich eingeschränkt worden."
-#: ../../Zotlabs/Module/Network.php:230
-msgid "Privacy group: "
-msgstr "Gruppe:"
+#: ../../Zotlabs/Module/Photos.php:834
+msgid "Photo not available"
+msgstr "Foto nicht verfügbar"
-#: ../../Zotlabs/Module/Network.php:256
-msgid "Invalid connection."
-msgstr "Ungültige Verbindung."
+#: ../../Zotlabs/Module/Photos.php:892
+msgid "Use as profile photo"
+msgstr "Als Profilfoto verwenden"
-#: ../../Zotlabs/Module/Menu.php:49
-msgid "Unable to update menu."
-msgstr "Kann Menü nicht aktualisieren."
+#: ../../Zotlabs/Module/Photos.php:893
+msgid "Use as cover photo"
+msgstr "Als Titelbild verwenden"
-#: ../../Zotlabs/Module/Menu.php:60
-msgid "Unable to create menu."
-msgstr "Kann Menü nicht erstellen."
+#: ../../Zotlabs/Module/Photos.php:900
+msgid "Private Photo"
+msgstr "Privates Foto"
-#: ../../Zotlabs/Module/Menu.php:98 ../../Zotlabs/Module/Menu.php:110
-msgid "Menu Name"
-msgstr "Name des Menüs"
+#: ../../Zotlabs/Module/Photos.php:915
+msgid "View Full Size"
+msgstr "In voller Größe anzeigen"
-#: ../../Zotlabs/Module/Menu.php:98
-msgid "Unique name (not visible on webpage) - required"
-msgstr "Eindeutiger Name (nicht sichtbar auf der Webseite) – erforderlich"
+#: ../../Zotlabs/Module/Photos.php:997
+msgid "Edit photo"
+msgstr "Foto bearbeiten"
-#: ../../Zotlabs/Module/Menu.php:99 ../../Zotlabs/Module/Menu.php:111
-msgid "Menu Title"
-msgstr "Menütitel"
+#: ../../Zotlabs/Module/Photos.php:999
+msgid "Rotate CW (right)"
+msgstr "Drehen im UZS (rechts)"
-#: ../../Zotlabs/Module/Menu.php:99
-msgid "Visible on webpage - leave empty for no title"
-msgstr "Sichtbar auf der Webseite – für keinen Titel leer lassen"
+#: ../../Zotlabs/Module/Photos.php:1000
+msgid "Rotate CCW (left)"
+msgstr "Drehen gegen UZS (links)"
-#: ../../Zotlabs/Module/Menu.php:100
-msgid "Allow Bookmarks"
-msgstr "Lesezeichen erlauben"
+#: ../../Zotlabs/Module/Photos.php:1003
+msgid "Move photo to album"
+msgstr "Foto in Album verschieben"
-#: ../../Zotlabs/Module/Menu.php:100 ../../Zotlabs/Module/Menu.php:157
-msgid "Menu may be used to store saved bookmarks"
-msgstr "Im Menü können gespeicherte Lesezeichen abgelegt werden"
+#: ../../Zotlabs/Module/Photos.php:1004
+msgid "Enter a new album name"
+msgstr "Gib einen Namen für ein neues Album ein"
-#: ../../Zotlabs/Module/Menu.php:101 ../../Zotlabs/Module/Menu.php:159
-msgid "Submit and proceed"
-msgstr "Absenden und fortfahren"
+#: ../../Zotlabs/Module/Photos.php:1005
+msgid "or select an existing one (doubleclick)"
+msgstr "oder wähle ein bereits vorhandenes aus (Doppelklick)"
-#: ../../Zotlabs/Module/Menu.php:107 ../../include/text.php:2284
-msgid "Menus"
-msgstr "Menüs"
+#: ../../Zotlabs/Module/Photos.php:1008
+msgid "Caption"
+msgstr "Bildunterschrift"
-#: ../../Zotlabs/Module/Menu.php:113 ../../Zotlabs/Module/Locs.php:120
-msgid "Drop"
-msgstr "Löschen"
+#: ../../Zotlabs/Module/Photos.php:1010
+msgid "Add a Tag"
+msgstr "Schlagwort hinzufügen"
-#: ../../Zotlabs/Module/Menu.php:114 ../../Zotlabs/Module/Blocks.php:157
-#: ../../Zotlabs/Module/Layouts.php:190 ../../Zotlabs/Module/Webpages.php:255
-#: ../../include/page_widgets.php:47
-msgid "Created"
-msgstr "Erstellt"
+#: ../../Zotlabs/Module/Photos.php:1018
+msgid "Example: @bob, @Barbara_Jensen, @jim@example.com"
+msgstr "Beispiele: @ben, @Karl_Prester, @lieschen@example.com"
-#: ../../Zotlabs/Module/Menu.php:115 ../../Zotlabs/Module/Blocks.php:158
-#: ../../Zotlabs/Module/Layouts.php:191 ../../Zotlabs/Module/Webpages.php:256
-#: ../../include/page_widgets.php:48
-msgid "Edited"
-msgstr "Geändert"
+#: ../../Zotlabs/Module/Photos.php:1021
+msgid "Flag as adult in album view"
+msgstr "In der Albumansicht als nicht jugendfrei markieren"
-#: ../../Zotlabs/Module/Menu.php:117
-msgid "Bookmarks allowed"
-msgstr "Lesezeichen erlaubt"
+#: ../../Zotlabs/Module/Photos.php:1040 ../../Zotlabs/Lib/ThreadItem.php:269
+msgid "I like this (toggle)"
+msgstr "Mir gefällt das (Umschalter)"
-#: ../../Zotlabs/Module/Menu.php:119
-msgid "Delete this menu"
-msgstr "Lösche dieses Menü"
+#: ../../Zotlabs/Module/Photos.php:1041 ../../Zotlabs/Lib/ThreadItem.php:270
+msgid "I don't like this (toggle)"
+msgstr "Mir gefällt das nicht (Umschalter)"
-#: ../../Zotlabs/Module/Menu.php:120 ../../Zotlabs/Module/Menu.php:154
-msgid "Edit menu contents"
-msgstr "Bearbeite Menü Inhalte"
+#: ../../Zotlabs/Module/Photos.php:1043 ../../Zotlabs/Lib/ThreadItem.php:412
+#: ../../include/conversation.php:739
+msgid "Please wait"
+msgstr "Bitte warten"
-#: ../../Zotlabs/Module/Menu.php:121
-msgid "Edit this menu"
-msgstr "Dieses Menü bearbeiten"
+#: ../../Zotlabs/Module/Photos.php:1059 ../../Zotlabs/Module/Photos.php:1177
+#: ../../Zotlabs/Lib/ThreadItem.php:729
+msgid "This is you"
+msgstr "Das bist Du"
-#: ../../Zotlabs/Module/Menu.php:136
-msgid "Menu could not be deleted."
-msgstr "Menü konnte nicht gelöscht werden."
+#: ../../Zotlabs/Module/Photos.php:1061 ../../Zotlabs/Module/Photos.php:1179
+#: ../../Zotlabs/Lib/ThreadItem.php:731 ../../include/js_strings.php:6
+msgid "Comment"
+msgstr "Kommentar"
-#: ../../Zotlabs/Module/Menu.php:144 ../../Zotlabs/Module/Mitem.php:28
-msgid "Menu not found."
-msgstr "Menü nicht gefunden"
+#: ../../Zotlabs/Module/Photos.php:1077 ../../include/conversation.php:574
+msgctxt "title"
+msgid "Likes"
+msgstr "Gefällt mir"
-#: ../../Zotlabs/Module/Menu.php:149
-msgid "Edit Menu"
-msgstr "Menü bearbeiten"
+#: ../../Zotlabs/Module/Photos.php:1077 ../../include/conversation.php:574
+msgctxt "title"
+msgid "Dislikes"
+msgstr "Gefällt mir nicht"
-#: ../../Zotlabs/Module/Menu.php:153
-msgid "Add or remove entries to this menu"
-msgstr "Einträge zu diesem Menü hinzufügen oder entfernen"
+#: ../../Zotlabs/Module/Photos.php:1078 ../../include/conversation.php:575
+msgctxt "title"
+msgid "Agree"
+msgstr "Zustimmungen"
-#: ../../Zotlabs/Module/Menu.php:155
-msgid "Menu name"
-msgstr "Menü Name"
+#: ../../Zotlabs/Module/Photos.php:1078 ../../include/conversation.php:575
+msgctxt "title"
+msgid "Disagree"
+msgstr "Ablehnungen"
-#: ../../Zotlabs/Module/Menu.php:155
-msgid "Must be unique, only seen by you"
-msgstr "Muss eindeutig sein, ist aber nur für Dich sichtbar"
+#: ../../Zotlabs/Module/Photos.php:1078 ../../include/conversation.php:575
+msgctxt "title"
+msgid "Abstain"
+msgstr "Enthaltungen"
-#: ../../Zotlabs/Module/Menu.php:156
-msgid "Menu title"
-msgstr "Menü Titel"
+#: ../../Zotlabs/Module/Photos.php:1079 ../../include/conversation.php:576
+msgctxt "title"
+msgid "Attending"
+msgstr "Zusagen"
-#: ../../Zotlabs/Module/Menu.php:156
-msgid "Menu title as seen by others"
-msgstr "Menü Titel wie er von anderen gesehen wird"
+#: ../../Zotlabs/Module/Photos.php:1079 ../../include/conversation.php:576
+msgctxt "title"
+msgid "Not attending"
+msgstr "Absagen"
-#: ../../Zotlabs/Module/Menu.php:157
-msgid "Allow bookmarks"
-msgstr "Erlaube Lesezeichen"
+#: ../../Zotlabs/Module/Photos.php:1079 ../../include/conversation.php:576
+msgctxt "title"
+msgid "Might attend"
+msgstr "Vielleicht"
-#: ../../Zotlabs/Module/Menu.php:166 ../../Zotlabs/Module/Mitem.php:120
-#: ../../Zotlabs/Module/Xchan.php:41
-msgid "Not found."
-msgstr "Nicht gefunden."
+#: ../../Zotlabs/Module/Photos.php:1096 ../../Zotlabs/Module/Photos.php:1108
+#: ../../Zotlabs/Lib/ThreadItem.php:187 ../../Zotlabs/Lib/ThreadItem.php:199
+msgid "View all"
+msgstr "Alles anzeigen"
-#: ../../Zotlabs/Module/Locs.php:25 ../../Zotlabs/Module/Locs.php:54
-msgid "Location not found."
-msgstr "Klon nicht gefunden."
+#: ../../Zotlabs/Module/Photos.php:1100 ../../Zotlabs/Lib/ThreadItem.php:191
+#: ../../include/conversation.php:1907 ../../include/channel.php:1268
+#: ../../include/taxonomy.php:403
+msgctxt "noun"
+msgid "Like"
+msgid_plural "Likes"
+msgstr[0] "Gefällt mir"
+msgstr[1] "Gefällt mir"
-#: ../../Zotlabs/Module/Locs.php:62
-msgid "Location lookup failed."
-msgstr "Nachschlagen des Kanal-Ortes fehlgeschlagen"
+#: ../../Zotlabs/Module/Photos.php:1105 ../../Zotlabs/Lib/ThreadItem.php:196
+#: ../../include/conversation.php:1910
+msgctxt "noun"
+msgid "Dislike"
+msgid_plural "Dislikes"
+msgstr[0] "Gefällt nicht"
+msgstr[1] "Gefällt nicht"
-#: ../../Zotlabs/Module/Locs.php:66
-msgid ""
-"Please select another location to become primary before removing the primary"
-" location."
-msgstr "Bitte mache einen anderen Kanal-Ort zum primären Ort, bevor Du den primären Ort löschst."
+#: ../../Zotlabs/Module/Photos.php:1205
+msgid "Photo Tools"
+msgstr "Fotowerkzeuge"
-#: ../../Zotlabs/Module/Locs.php:95
-msgid "Syncing locations"
-msgstr "Synchronisiere Klone"
+#: ../../Zotlabs/Module/Photos.php:1214
+msgid "In This Photo:"
+msgstr "Auf diesem Foto:"
-#: ../../Zotlabs/Module/Locs.php:105
-msgid "No locations found."
-msgstr "Keine Klon-Adressen gefunden."
+#: ../../Zotlabs/Module/Photos.php:1219
+msgid "Map"
+msgstr "Karte"
-#: ../../Zotlabs/Module/Locs.php:116
-msgid "Manage Channel Locations"
-msgstr "Klon-Adressen verwalten"
+#: ../../Zotlabs/Module/Photos.php:1227 ../../Zotlabs/Lib/ThreadItem.php:401
+msgctxt "noun"
+msgid "Likes"
+msgstr "Gefällt mir"
-#: ../../Zotlabs/Module/Locs.php:117 ../../Zotlabs/Module/Pubsites.php:51
-#: ../../Zotlabs/Module/Profiles.php:510 ../../Zotlabs/Module/Profiles.php:733
-#: ../../Zotlabs/Module/Events.php:475
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:839
-#: ../../include/js_strings.php:25
-msgid "Location"
-msgstr "Ort"
+#: ../../Zotlabs/Module/Photos.php:1228 ../../Zotlabs/Lib/ThreadItem.php:402
+msgctxt "noun"
+msgid "Dislikes"
+msgstr "Gefällt nicht"
-#: ../../Zotlabs/Module/Locs.php:119
-msgid "Primary"
-msgstr "Primär"
+#: ../../Zotlabs/Module/Photos.php:1233 ../../Zotlabs/Lib/ThreadItem.php:407
+#: ../../include/acl_selectors.php:220
+msgid "Close"
+msgstr "Schließen"
-#: ../../Zotlabs/Module/Locs.php:122
-msgid "Sync Now"
-msgstr "Jetzt synchronisieren"
+#: ../../Zotlabs/Module/Photos.php:1305 ../../Zotlabs/Module/Photos.php:1318
+#: ../../Zotlabs/Module/Photos.php:1319 ../../include/photos.php:529
+msgid "Recent Photos"
+msgstr "Neueste Fotos"
-#: ../../Zotlabs/Module/Locs.php:123
-msgid "Please wait several minutes between consecutive operations."
-msgstr "Bitte warte mehrere Minuten zwischen dem Ausführen zweier Operationen!"
+#: ../../Zotlabs/Module/Wiki.php:30
+msgid "Profile Unavailable."
+msgstr "Profil nicht verfügbar."
-#: ../../Zotlabs/Module/Locs.php:124
-msgid ""
-"When possible, drop a location by logging into that website/hub and removing"
-" your channel."
-msgstr "Wenn möglich, lösche einen Klon, indem Du Dich auf dem jeweiligen Hub einloggst und den Kanal dort löschst."
+#: ../../Zotlabs/Module/Wiki.php:44 ../../addon/gitwiki/Mod_Gitwiki.php:42
+msgid "Not found"
+msgstr "Nicht gefunden"
-#: ../../Zotlabs/Module/Locs.php:125
-msgid "Use this form to drop the location if the hub is no longer operating."
-msgstr "Benutze dieses Formular zum Löschen eines Klons, wenn es den Hub nicht mehr gibt."
+#: ../../Zotlabs/Module/Wiki.php:68 ../../addon/gitwiki/Mod_Gitwiki.php:62
+msgid "Invalid channel"
+msgstr "Ungültiger Kanal"
-#: ../../Zotlabs/Module/Pubsites.php:24 ../../include/widgets.php:1415
-msgid "Public Hubs"
-msgstr "Öffentliche Hubs"
+#: ../../Zotlabs/Module/Wiki.php:160 ../../addon/gitwiki/Mod_Gitwiki.php:146
+#: ../../include/conversation.php:1854 ../../include/nav.php:462
+msgid "Wikis"
+msgstr "Wikis"
-#: ../../Zotlabs/Module/Pubsites.php:27
+#: ../../Zotlabs/Module/Wiki.php:166 ../../addon/gitwiki/Mod_Gitwiki.php:152
+msgid "Download"
+msgstr "Herunterladen"
+
+#: ../../Zotlabs/Module/Wiki.php:168 ../../Zotlabs/Module/Chat.php:254
+#: ../../Zotlabs/Module/Profiles.php:834 ../../Zotlabs/Module/Manage.php:143
+#: ../../addon/gitwiki/Mod_Gitwiki.php:154
+msgid "Create New"
+msgstr "Neu anlegen"
+
+#: ../../Zotlabs/Module/Wiki.php:170 ../../addon/gitwiki/Mod_Gitwiki.php:156
+msgid "Wiki name"
+msgstr "Name des Wiki"
+
+#: ../../Zotlabs/Module/Wiki.php:171 ../../addon/gitwiki/Mod_Gitwiki.php:157
+msgid "Content type"
+msgstr "Inhaltstyp"
+
+#: ../../Zotlabs/Module/Wiki.php:173 ../../Zotlabs/Storage/Browser.php:234
+#: ../../addon/gitwiki/Mod_Gitwiki.php:159
+msgid "Type"
+msgstr "Typ"
+
+#: ../../Zotlabs/Module/Wiki.php:180 ../../addon/gitwiki/Mod_Gitwiki.php:166
+msgid "Create a status post for this wiki"
+msgstr "Erzeuge einen Statusbeitrag für dieses Wiki"
+
+#: ../../Zotlabs/Module/Wiki.php:205 ../../addon/gitwiki/Mod_Gitwiki.php:185
+msgid "Wiki not found"
+msgstr "Wiki nicht gefunden"
+
+#: ../../Zotlabs/Module/Wiki.php:229 ../../addon/gitwiki/Mod_Gitwiki.php:210
+msgid "Rename page"
+msgstr "Seite umbenennen"
+
+#: ../../Zotlabs/Module/Wiki.php:233 ../../addon/gitwiki/Mod_Gitwiki.php:214
+msgid "Error retrieving page content"
+msgstr "Fehler beim Abrufen des Seiteninhalts"
+
+#: ../../Zotlabs/Module/Wiki.php:239
+msgid "New page"
+msgstr "Neue Seite"
+
+#: ../../Zotlabs/Module/Wiki.php:263 ../../addon/gitwiki/Mod_Gitwiki.php:242
+msgid "Revision Comparison"
+msgstr "Revisionsvergleich"
+
+#: ../../Zotlabs/Module/Wiki.php:264 ../../addon/gitwiki/Mod_Gitwiki.php:243
+msgid "Revert"
+msgstr "Rückgängig machen"
+
+#: ../../Zotlabs/Module/Wiki.php:268
+msgid "Short description of your changes (optional)"
+msgstr "Kurze Beschreibung Ihrer Änderungen (optional)"
+
+#: ../../Zotlabs/Module/Wiki.php:275 ../../addon/gitwiki/Mod_Gitwiki.php:252
+msgid "Source"
+msgstr "Quelle"
+
+#: ../../Zotlabs/Module/Wiki.php:283 ../../addon/gitwiki/Mod_Gitwiki.php:260
+msgid "New page name"
+msgstr "Neuer Seitenname"
+
+#: ../../Zotlabs/Module/Wiki.php:288 ../../addon/gitwiki/Mod_Gitwiki.php:265
+#: ../../include/conversation.php:1232
+msgid "Embed image from photo albums"
+msgstr "Bild aus Fotoalben einbetten"
+
+#: ../../Zotlabs/Module/Wiki.php:289 ../../addon/gitwiki/Mod_Gitwiki.php:266
+#: ../../include/conversation.php:1326
+msgid "Embed an image from your albums"
+msgstr "Betten Sie ein Bild aus Ihren Alben ein"
+
+#: ../../Zotlabs/Module/Wiki.php:291 ../../addon/gitwiki/Mod_Gitwiki.php:268
+#: ../../include/conversation.php:1328 ../../include/conversation.php:1375
+msgid "OK"
+msgstr "Ok"
+
+#: ../../Zotlabs/Module/Wiki.php:292 ../../addon/gitwiki/Mod_Gitwiki.php:269
+#: ../../include/conversation.php:1268
+msgid "Choose images to embed"
+msgstr "Wählen Sie Bilder zum Einbetten aus"
+
+#: ../../Zotlabs/Module/Wiki.php:293 ../../addon/gitwiki/Mod_Gitwiki.php:270
+#: ../../include/conversation.php:1269
+msgid "Choose an album"
+msgstr "Wählen Sie ein Album aus"
+
+#: ../../Zotlabs/Module/Wiki.php:294 ../../addon/gitwiki/Mod_Gitwiki.php:271
+msgid "Choose a different album"
+msgstr "Wählen Sie ein anderes Album aus"
+
+#: ../../Zotlabs/Module/Wiki.php:295 ../../addon/gitwiki/Mod_Gitwiki.php:272
+#: ../../include/conversation.php:1271
+msgid "Error getting album list"
+msgstr "Fehler beim Holen der Albenliste"
+
+#: ../../Zotlabs/Module/Wiki.php:296 ../../addon/gitwiki/Mod_Gitwiki.php:273
+#: ../../include/conversation.php:1272
+msgid "Error getting photo link"
+msgstr "Fehler beim Holen des Fotolinks"
+
+#: ../../Zotlabs/Module/Wiki.php:297 ../../addon/gitwiki/Mod_Gitwiki.php:274
+#: ../../include/conversation.php:1273
+msgid "Error getting album"
+msgstr "Fehler beim Holen des Albums"
+
+#: ../../Zotlabs/Module/Wiki.php:364 ../../addon/gitwiki/Mod_Gitwiki.php:337
+msgid "Error creating wiki. Invalid name."
+msgstr "Fehler beim Erstellen des Wiki. Ungültiger Name."
+
+#: ../../Zotlabs/Module/Wiki.php:371
+msgid "A wiki with this name already exists."
+msgstr "Es existiert bereits ein Wiki mit diesem Namen."
+
+#: ../../Zotlabs/Module/Wiki.php:384 ../../addon/gitwiki/Mod_Gitwiki.php:348
+msgid "Wiki created, but error creating Home page."
+msgstr "Das Wiki wurde erzeugt, aber es gab einen Fehler bei der Erstellung der Startseite"
+
+#: ../../Zotlabs/Module/Wiki.php:391 ../../addon/gitwiki/Mod_Gitwiki.php:353
+msgid "Error creating wiki"
+msgstr "Fehler beim Erstellen des Wiki"
+
+#: ../../Zotlabs/Module/Wiki.php:403
+msgid "Wiki delete permission denied."
+msgstr "Wiki-Löschberechtigung verweigert."
+
+#: ../../Zotlabs/Module/Wiki.php:413
+msgid "Error deleting wiki"
+msgstr "Fehler beim Löschen des Wiki"
+
+#: ../../Zotlabs/Module/Wiki.php:439 ../../addon/gitwiki/Mod_Gitwiki.php:400
+msgid "New page created"
+msgstr "Neue Seite erstellt"
+
+#: ../../Zotlabs/Module/Wiki.php:558
+msgid "Cannot delete Home"
+msgstr "Kann die Startseite nicht löschen"
+
+#: ../../Zotlabs/Module/Wiki.php:622
+msgid "Current Revision"
+msgstr "Aktuelle Revision"
+
+#: ../../Zotlabs/Module/Wiki.php:622
+msgid "Selected Revision"
+msgstr "Ausgewählte Revision"
+
+#: ../../Zotlabs/Module/Wiki.php:672
+msgid "You must be authenticated."
+msgstr "Sie müssen authenzifiziert sein."
+
+#: ../../Zotlabs/Module/Chanview.php:134
+msgid "toggle full screen mode"
+msgstr "auf Vollbildmodus umschalten"
+
+#: ../../Zotlabs/Module/Pdledit.php:21
+msgid "Layout updated."
+msgstr "Layout aktualisiert."
+
+#: ../../Zotlabs/Module/Pdledit.php:34 ../../Zotlabs/Module/Chat.php:217
+msgid "Feature disabled."
+msgstr "Funktion deaktiviert."
+
+#: ../../Zotlabs/Module/Pdledit.php:42 ../../Zotlabs/Module/Pdledit.php:69
+msgid "Edit System Page Description"
+msgstr "Systemseitenbeschreibung bearbeiten"
+
+#: ../../Zotlabs/Module/Pdledit.php:64
+msgid "Layout not found."
+msgstr "Layout nicht gefunden."
+
+#: ../../Zotlabs/Module/Pdledit.php:70
+msgid "Module Name:"
+msgstr "Modulname:"
+
+#: ../../Zotlabs/Module/Pdledit.php:71
+msgid "Layout Help"
+msgstr "Layout-Hilfe"
+
+#: ../../Zotlabs/Module/Poke.php:168 ../../Zotlabs/Lib/Apps.php:235
+#: ../../include/conversation.php:1042
+msgid "Poke"
+msgstr "Anstupsen"
+
+#: ../../Zotlabs/Module/Poke.php:169
+msgid "Poke somebody"
+msgstr "Jemanden anstupsen"
+
+#: ../../Zotlabs/Module/Poke.php:172
+msgid "Poke/Prod"
+msgstr "Anstupsen/Knuffen"
+
+#: ../../Zotlabs/Module/Poke.php:173
+msgid "Poke, prod or do other things to somebody"
+msgstr "Jemanden anstupsen, knuffen oder sonstiges"
+
+#: ../../Zotlabs/Module/Poke.php:180
+msgid "Recipient"
+msgstr "Empfänger"
+
+#: ../../Zotlabs/Module/Poke.php:181
+msgid "Choose what you wish to do to recipient"
+msgstr "Wähle, was Du mit dem/r Empfänger/in tun willst"
+
+#: ../../Zotlabs/Module/Poke.php:184 ../../Zotlabs/Module/Poke.php:185
+msgid "Make this post private"
+msgstr "Diesen Beitrag privat machen"
+
+#: ../../Zotlabs/Module/Profile_photo.php:61
+#: ../../Zotlabs/Module/Cover_photo.php:56
+msgid "Image uploaded but image cropping failed."
+msgstr "Bild hochgeladen, aber das Zurechtschneiden schlug fehl."
+
+#: ../../Zotlabs/Module/Profile_photo.php:115
+#: ../../Zotlabs/Module/Profile_photo.php:226
+#: ../../include/photo/photo_driver.php:647
+msgid "Profile Photos"
+msgstr "Profilfotos"
+
+#: ../../Zotlabs/Module/Profile_photo.php:137
+#: ../../Zotlabs/Module/Cover_photo.php:159
+msgid "Image resize failed."
+msgstr "Bild-Anpassung fehlgeschlagen."
+
+#: ../../Zotlabs/Module/Profile_photo.php:196
+#: ../../addon/openclipatar/openclipatar.php:298
msgid ""
-"The listed hubs allow public registration for the $Projectname network. All "
-"hubs in the network are interlinked so membership on any of them conveys "
-"membership in the network as a whole. Some hubs may require subscription or "
-"provide tiered service plans. The hub itself <strong>may</strong> provide "
-"additional details."
-msgstr "Die hier aufgeführten Hubs sind öffentlich und erlauben die Registrierung im $Projectname Netzwerk. Alle Hubs dieses Netzwerks sind miteinander verbunden, so dass die Mitgliedschaft auf einem Hub die Verbindung zu beliebigen Seiten und Kanälen auf anderen Hubs ermöglicht. Es könnte sein, dass einige dieser Hubs kostenpflichtig sind oder abgestufte, je nach Umfang kostenpflichtige Mitgliedschaften anbieten. Auf den Seiten der einzelnen Hubs <strong>könnten</strong> jeweils nähere Informationen dazu stehen."
+"Shift-reload the page or clear browser cache if the new photo does not "
+"display immediately."
+msgstr "Leere den Browser Cache oder nutze Umschalten-Neu Laden, falls das neue Foto nicht sofort angezeigt wird."
-#: ../../Zotlabs/Module/Pubsites.php:33
-msgid "Hub URL"
-msgstr "Hub-URL"
+#: ../../Zotlabs/Module/Profile_photo.php:203
+#: ../../Zotlabs/Module/Cover_photo.php:173 ../../include/photos.php:149
+msgid "Unable to process image"
+msgstr "Kann Bild nicht verarbeiten"
-#: ../../Zotlabs/Module/Pubsites.php:33
-msgid "Access Type"
-msgstr "Zugriffstyp"
+#: ../../Zotlabs/Module/Profile_photo.php:238
+#: ../../Zotlabs/Module/Cover_photo.php:197
+msgid "Image upload failed."
+msgstr "Hochladen des Bilds fehlgeschlagen."
-#: ../../Zotlabs/Module/Pubsites.php:33
-msgid "Registration Policy"
-msgstr "Registrierungsrichtlinien"
+#: ../../Zotlabs/Module/Profile_photo.php:257
+#: ../../Zotlabs/Module/Cover_photo.php:214
+msgid "Unable to process image."
+msgstr "Kann Bild nicht verarbeiten."
-#: ../../Zotlabs/Module/Pubsites.php:33
-msgid "Stats"
-msgstr "Statistiken"
+#: ../../Zotlabs/Module/Profile_photo.php:318
+#: ../../Zotlabs/Module/Profile_photo.php:365
+#: ../../Zotlabs/Module/Cover_photo.php:307
+#: ../../Zotlabs/Module/Cover_photo.php:322
+msgid "Photo not available."
+msgstr "Foto nicht verfügbar."
-#: ../../Zotlabs/Module/Pubsites.php:33
-msgid "Software"
-msgstr "Software"
+#: ../../Zotlabs/Module/Profile_photo.php:420
+#: ../../Zotlabs/Module/Cover_photo.php:358
+msgid "Upload File:"
+msgstr "Datei hochladen:"
-#: ../../Zotlabs/Module/Pubsites.php:35 ../../Zotlabs/Module/Ratings.php:97
-#: ../../include/conversation.php:941 ../../include/conversation.php:1099
-msgid "Ratings"
-msgstr "Bewertungen"
+#: ../../Zotlabs/Module/Profile_photo.php:421
+#: ../../Zotlabs/Module/Cover_photo.php:359
+msgid "Select a profile:"
+msgstr "Wähle ein Profil:"
-#: ../../Zotlabs/Module/Pubsites.php:48
-msgid "Rate"
-msgstr "Bewerten"
+#: ../../Zotlabs/Module/Profile_photo.php:422
+msgid "Use Photo for Profile"
+msgstr "Foto für Profil verwenden"
-#: ../../Zotlabs/Module/Pubsites.php:59 ../../Zotlabs/Module/Blocks.php:166
-#: ../../Zotlabs/Module/Layouts.php:197 ../../Zotlabs/Module/Events.php:694
-#: ../../Zotlabs/Module/Webpages.php:250 ../../Zotlabs/Module/Wiki.php:165
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:151
-#: ../../include/page_widgets.php:42
-msgid "View"
-msgstr "Ansicht"
+#: ../../Zotlabs/Module/Profile_photo.php:422
+msgid "Upload Profile Photo"
+msgstr "Lade neues Profilfoto hoch"
+
+#: ../../Zotlabs/Module/Profile_photo.php:423
+#: ../../addon/openclipatar/openclipatar.php:182
+#: ../../addon/openclipatar/openclipatar.php:194
+msgid "Use"
+msgstr "Verwenden"
+
+#: ../../Zotlabs/Module/Profile_photo.php:429
+#: ../../Zotlabs/Module/Cover_photo.php:365
+msgid "skip this step"
+msgstr "diesen Schritt überspringen"
+
+#: ../../Zotlabs/Module/Profile_photo.php:429
+#: ../../Zotlabs/Module/Cover_photo.php:365
+msgid "select a photo from your photo albums"
+msgstr "ein Foto aus meinen Fotoalben"
+
+#: ../../Zotlabs/Module/Profile_photo.php:448
+#: ../../Zotlabs/Module/Cover_photo.php:381
+msgid "Crop Image"
+msgstr "Bild zuschneiden"
+
+#: ../../Zotlabs/Module/Profile_photo.php:449
+#: ../../Zotlabs/Module/Cover_photo.php:382
+msgid "Please adjust the image cropping for optimum viewing."
+msgstr "Bitte schneide das Bild für eine optimale Anzeige passend zu."
+
+#: ../../Zotlabs/Module/Profile_photo.php:451
+#: ../../Zotlabs/Module/Cover_photo.php:384
+msgid "Done Editing"
+msgstr "Bearbeitung fertigstellen"
+
+#: ../../Zotlabs/Module/Chatsvc.php:131
+msgid "Away"
+msgstr "Abwesend"
+
+#: ../../Zotlabs/Module/Chatsvc.php:136
+msgid "Online"
+msgstr "Online"
+
+#: ../../Zotlabs/Module/Item.php:185
+msgid "Unable to locate original post."
+msgstr "Originalbeitrag nicht gefunden."
+
+#: ../../Zotlabs/Module/Item.php:451
+msgid "Empty post discarded."
+msgstr "Leeren Beitrag verworfen."
+
+#: ../../Zotlabs/Module/Item.php:825
+msgid "Duplicate post suppressed."
+msgstr "Doppelter Beitrag unterdrückt."
+
+#: ../../Zotlabs/Module/Item.php:955
+msgid "System error. Post not saved."
+msgstr "Systemfehler. Beitrag nicht gespeichert."
+
+#: ../../Zotlabs/Module/Item.php:1085
+msgid "Unable to obtain post information from database."
+msgstr "Beitragsinformationen können nicht aus der Datenbank abgerufen werden."
+
+#: ../../Zotlabs/Module/Item.php:1092
+#, php-format
+msgid "You have reached your limit of %1$.0f top level posts."
+msgstr "Du hast die maximale Anzahl von %1$.0f Beiträgen erreicht."
+
+#: ../../Zotlabs/Module/Item.php:1099
+#, php-format
+msgid "You have reached your limit of %1$.0f webpages."
+msgstr "Du hast die maximale Anzahl von %1$.0f Webseiten erreicht."
+
+#: ../../Zotlabs/Module/Ping.php:254
+msgid "sent you a private message"
+msgstr "hat Dir eine private Nachricht geschickt"
+
+#: ../../Zotlabs/Module/Ping.php:302
+msgid "added your channel"
+msgstr "hat deinen Kanal hinzugefügt"
+
+#: ../../Zotlabs/Module/Ping.php:312
+msgid "g A l F d"
+msgstr "l, d. F, G:i \\U\\h\\r"
+
+#: ../../Zotlabs/Module/Ping.php:330
+msgid "[today]"
+msgstr "[Heute]"
+
+#: ../../Zotlabs/Module/Ping.php:339
+msgid "posted an event"
+msgstr "hat einen Termin veröffentlicht"
+
+#: ../../Zotlabs/Module/Page.php:40 ../../Zotlabs/Module/Block.php:31
+msgid "Invalid item."
+msgstr "Ungültiges Element."
+
+#: ../../Zotlabs/Module/Page.php:94 ../../Zotlabs/Module/Block.php:79
+#: ../../Zotlabs/Module/Display.php:122
+#: ../../Zotlabs/Lib/NativeWikiPage.php:500 ../../Zotlabs/Web/Router.php:146
+#: ../../include/help.php:68
+msgid "Page not found."
+msgstr "Seite nicht gefunden."
+
+#: ../../Zotlabs/Module/Page.php:131
+msgid ""
+"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod "
+"tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,"
+" quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo "
+"consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse "
+"cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat "
+"non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
+msgstr "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
-#: ../../Zotlabs/Module/Connedit.php:82
+#: ../../Zotlabs/Module/Connedit.php:79
msgid "Could not access contact record."
msgstr "Konnte nicht auf den Kontakteintrag zugreifen."
-#: ../../Zotlabs/Module/Connedit.php:112
+#: ../../Zotlabs/Module/Connedit.php:109
msgid "Could not locate selected profile."
msgstr "Gewähltes Profil nicht gefunden."
-#: ../../Zotlabs/Module/Connedit.php:249
+#: ../../Zotlabs/Module/Connedit.php:246
msgid "Connection updated."
msgstr "Verbindung aktualisiert."
-#: ../../Zotlabs/Module/Connedit.php:251
+#: ../../Zotlabs/Module/Connedit.php:248
msgid "Failed to update connection record."
msgstr "Konnte den Verbindungseintrag nicht aktualisieren."
-#: ../../Zotlabs/Module/Connedit.php:301
+#: ../../Zotlabs/Module/Connedit.php:298
msgid "is now connected to"
msgstr "ist jetzt verbunden mit"
-#: ../../Zotlabs/Module/Connedit.php:434
+#: ../../Zotlabs/Module/Connedit.php:423
msgid "Could not access address book record."
msgstr "Konnte nicht auf den Adressbuch-Eintrag zugreifen."
-#: ../../Zotlabs/Module/Connedit.php:454
+#: ../../Zotlabs/Module/Connedit.php:471
msgid "Refresh failed - channel is currently unavailable."
msgstr "Aktualisierung fehlgeschlagen – der Kanal ist im Moment nicht erreichbar."
-#: ../../Zotlabs/Module/Connedit.php:469 ../../Zotlabs/Module/Connedit.php:478
-#: ../../Zotlabs/Module/Connedit.php:487 ../../Zotlabs/Module/Connedit.php:496
-#: ../../Zotlabs/Module/Connedit.php:509
+#: ../../Zotlabs/Module/Connedit.php:486 ../../Zotlabs/Module/Connedit.php:495
+#: ../../Zotlabs/Module/Connedit.php:504 ../../Zotlabs/Module/Connedit.php:513
+#: ../../Zotlabs/Module/Connedit.php:526
msgid "Unable to set address book parameters."
msgstr "Konnte die Adressbuch-Parameter nicht setzen."
-#: ../../Zotlabs/Module/Connedit.php:533
+#: ../../Zotlabs/Module/Connedit.php:550
msgid "Connection has been removed."
msgstr "Verbindung wurde gelöscht."
-#: ../../Zotlabs/Module/Connedit.php:573 ../../Zotlabs/Lib/Apps.php:228
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:57
-#: ../../include/conversation.php:936 ../../include/conversation.php:1049
-#: ../../include/nav.php:103
+#: ../../Zotlabs/Module/Connedit.php:590 ../../Zotlabs/Lib/Apps.php:228
+#: ../../addon/openclipatar/openclipatar.php:57
+#: ../../include/conversation.php:982 ../../include/nav.php:106
msgid "View Profile"
msgstr "Profil ansehen"
-#: ../../Zotlabs/Module/Connedit.php:576
+#: ../../Zotlabs/Module/Connedit.php:593
#, php-format
msgid "View %s's profile"
msgstr "%ss Profil ansehen"
-#: ../../Zotlabs/Module/Connedit.php:580
+#: ../../Zotlabs/Module/Connedit.php:597
msgid "Refresh Permissions"
msgstr "Zugriffsrechte neu laden"
-#: ../../Zotlabs/Module/Connedit.php:583
+#: ../../Zotlabs/Module/Connedit.php:600
msgid "Fetch updated permissions"
-msgstr "Aktualisierte Zugriffsrechte abfragen"
+msgstr "Aktualisierte Zugriffsrechte abrufen"
+
+#: ../../Zotlabs/Module/Connedit.php:604
+msgid "Refresh Photo"
+msgstr "Foto aktualisieren"
+
+#: ../../Zotlabs/Module/Connedit.php:607
+msgid "Fetch updated photo"
+msgstr "Aktualisiertes Profilfoto abrufen"
-#: ../../Zotlabs/Module/Connedit.php:587
+#: ../../Zotlabs/Module/Connedit.php:611
msgid "Recent Activity"
msgstr "Kürzliche Aktivitäten"
-#: ../../Zotlabs/Module/Connedit.php:590
+#: ../../Zotlabs/Module/Connedit.php:614
msgid "View recent posts and comments"
msgstr "Betrachte die neuesten Beiträge und Kommentare"
-#: ../../Zotlabs/Module/Connedit.php:597
+#: ../../Zotlabs/Module/Connedit.php:621
msgid "Block (or Unblock) all communications with this connection"
msgstr "Jegliche Kommunikation mit dieser Verbindung blockieren/zulassen"
-#: ../../Zotlabs/Module/Connedit.php:598
+#: ../../Zotlabs/Module/Connedit.php:622
msgid "This connection is blocked!"
msgstr "Die Verbindung ist geblockt!"
-#: ../../Zotlabs/Module/Connedit.php:602
+#: ../../Zotlabs/Module/Connedit.php:626
msgid "Unignore"
msgstr "Nicht ignorieren"
-#: ../../Zotlabs/Module/Connedit.php:605
+#: ../../Zotlabs/Module/Connedit.php:629
msgid "Ignore (or Unignore) all inbound communications from this connection"
msgstr "Jegliche eingehende Kommunikation von dieser Verbindung ignorieren/zulassen"
-#: ../../Zotlabs/Module/Connedit.php:606
+#: ../../Zotlabs/Module/Connedit.php:630
msgid "This connection is ignored!"
msgstr "Die Verbindung wird ignoriert!"
-#: ../../Zotlabs/Module/Connedit.php:610
+#: ../../Zotlabs/Module/Connedit.php:634
msgid "Unarchive"
msgstr "Aus Archiv zurückholen"
-#: ../../Zotlabs/Module/Connedit.php:610
+#: ../../Zotlabs/Module/Connedit.php:634
msgid "Archive"
msgstr "Archivieren"
-#: ../../Zotlabs/Module/Connedit.php:613
+#: ../../Zotlabs/Module/Connedit.php:637
msgid ""
"Archive (or Unarchive) this connection - mark channel dead but keep content"
msgstr "Verbindung archivieren/aus dem Archiv zurückholen (Archiv = Kanal als erloschen markieren, aber die Beiträge behalten)"
-#: ../../Zotlabs/Module/Connedit.php:614
+#: ../../Zotlabs/Module/Connedit.php:638
msgid "This connection is archived!"
msgstr "Die Verbindung ist archiviert!"
-#: ../../Zotlabs/Module/Connedit.php:618
+#: ../../Zotlabs/Module/Connedit.php:642
msgid "Unhide"
msgstr "Wieder sichtbar machen"
-#: ../../Zotlabs/Module/Connedit.php:618
+#: ../../Zotlabs/Module/Connedit.php:642
msgid "Hide"
msgstr "Verstecken"
-#: ../../Zotlabs/Module/Connedit.php:621
+#: ../../Zotlabs/Module/Connedit.php:645
msgid "Hide or Unhide this connection from your other connections"
msgstr "Diese Verbindung vor anderen Verbindungen verstecken/zeigen"
-#: ../../Zotlabs/Module/Connedit.php:622
+#: ../../Zotlabs/Module/Connedit.php:646
msgid "This connection is hidden!"
msgstr "Die Verbindung ist versteckt!"
-#: ../../Zotlabs/Module/Connedit.php:629
+#: ../../Zotlabs/Module/Connedit.php:653
msgid "Delete this connection"
msgstr "Verbindung löschen"
-#: ../../Zotlabs/Module/Connedit.php:640
+#: ../../Zotlabs/Module/Connedit.php:661
+msgid "Fetch Vcard"
+msgstr "Vcard abrufen"
+
+#: ../../Zotlabs/Module/Connedit.php:664
+msgid "Fetch electronic calling card for this connection"
+msgstr "Rufe eine digitale Visitenkarte für diese Verbindung ab"
+
+#: ../../Zotlabs/Module/Connedit.php:675
msgid "Open Individual Permissions section by default"
msgstr "Öffne standardmäßig den Bereich für individuelle Berechtigungen"
-#: ../../Zotlabs/Module/Connedit.php:663
+#: ../../Zotlabs/Module/Connedit.php:698
msgid "Affinity"
msgstr "Beziehung"
-#: ../../Zotlabs/Module/Connedit.php:666
+#: ../../Zotlabs/Module/Connedit.php:701
msgid "Open Set Affinity section by default"
msgstr "Öffne standardmäßig den Bereich für Beziehungsgrad-Einstellungen"
-#: ../../Zotlabs/Module/Connedit.php:670 ../../include/widgets.php:540
+#: ../../Zotlabs/Module/Connedit.php:705 ../../Zotlabs/Widget/Affinity.php:26
msgid "Me"
msgstr "Ich"
-#: ../../Zotlabs/Module/Connedit.php:671 ../../include/widgets.php:541
+#: ../../Zotlabs/Module/Connedit.php:706 ../../Zotlabs/Widget/Affinity.php:27
msgid "Family"
msgstr "Familie"
-#: ../../Zotlabs/Module/Connedit.php:672
-#: ../../Zotlabs/Module/Settings/Channel.php:62
-#: ../../Zotlabs/Module/Settings/Channel.php:66
-#: ../../Zotlabs/Module/Settings/Channel.php:67
-#: ../../Zotlabs/Module/Settings/Channel.php:70
-#: ../../Zotlabs/Module/Settings/Channel.php:81
-#: ../../include/selectors.php:123 ../../include/widgets.php:542
-#: ../../include/channel.php:408 ../../include/channel.php:409
-#: ../../include/channel.php:416
-msgid "Friends"
-msgstr "Freunde"
-
-#: ../../Zotlabs/Module/Connedit.php:673 ../../include/widgets.php:543
+#: ../../Zotlabs/Module/Connedit.php:708 ../../Zotlabs/Widget/Affinity.php:29
msgid "Acquaintances"
msgstr "Bekannte"
-#: ../../Zotlabs/Module/Connedit.php:700
+#: ../../Zotlabs/Module/Connedit.php:735
msgid "Filter"
msgstr "Filter"
-#: ../../Zotlabs/Module/Connedit.php:703
+#: ../../Zotlabs/Module/Connedit.php:738
msgid "Open Custom Filter section by default"
msgstr "Öffne standardmäßig den Bereich für benutzerdefinierte Filter"
-#: ../../Zotlabs/Module/Connedit.php:740
+#: ../../Zotlabs/Module/Connedit.php:775
msgid "Approve this connection"
msgstr "Verbindung genehmigen"
-#: ../../Zotlabs/Module/Connedit.php:740
+#: ../../Zotlabs/Module/Connedit.php:775
msgid "Accept connection to allow communication"
msgstr "Akzeptiere die Verbindung, um Kommunikation zu ermöglichen"
-#: ../../Zotlabs/Module/Connedit.php:745
+#: ../../Zotlabs/Module/Connedit.php:780
msgid "Set Affinity"
msgstr "Beziehung festlegen"
-#: ../../Zotlabs/Module/Connedit.php:748
+#: ../../Zotlabs/Module/Connedit.php:783
msgid "Set Profile"
msgstr "Profil festlegen"
-#: ../../Zotlabs/Module/Connedit.php:751
+#: ../../Zotlabs/Module/Connedit.php:786
msgid "Set Affinity & Profile"
msgstr "Beziehung und Profile festlegen"
-#: ../../Zotlabs/Module/Connedit.php:809
+#: ../../Zotlabs/Module/Connedit.php:844
msgid "none"
msgstr "Keine"
-#: ../../Zotlabs/Module/Connedit.php:812 ../../include/widgets.php:675
+#: ../../Zotlabs/Module/Connedit.php:847
+#: ../../Zotlabs/Widget/Settings_menu.php:107
msgid "Connection Default Permissions"
msgstr "Standardzugriffsrechte für neue Verbindungen:"
-#: ../../Zotlabs/Module/Connedit.php:812 ../../include/items.php:3932
+#: ../../Zotlabs/Module/Connedit.php:847 ../../include/items.php:3955
#, php-format
msgid "Connection: %s"
msgstr "Verbindung: %s"
-#: ../../Zotlabs/Module/Connedit.php:813
+#: ../../Zotlabs/Module/Connedit.php:848
msgid "Apply these permissions automatically"
msgstr "Diese Berechtigungen automatisch anwenden"
-#: ../../Zotlabs/Module/Connedit.php:813
+#: ../../Zotlabs/Module/Connedit.php:848
msgid "Connection requests will be approved without your interaction"
msgstr "Verbindungsanfragen werden sofort bestätigt, ohne dass Deine aktive Zustimmung erforderlich ist."
-#: ../../Zotlabs/Module/Connedit.php:814
+#: ../../Zotlabs/Module/Connedit.php:849
msgid "Permission role"
msgstr "Berechtigungsrolle"
-#: ../../Zotlabs/Module/Connedit.php:815
+#: ../../Zotlabs/Module/Connedit.php:850
msgid "Add permission role"
msgstr "Berechtigungsrolle hinzufügen"
-#: ../../Zotlabs/Module/Connedit.php:821
+#: ../../Zotlabs/Module/Connedit.php:856
msgid "This connection's primary address is"
msgstr "Die Hauptadresse der Verbindung ist"
-#: ../../Zotlabs/Module/Connedit.php:822
+#: ../../Zotlabs/Module/Connedit.php:857
msgid "Available locations:"
msgstr "Verfügbare Klone:"
-#: ../../Zotlabs/Module/Connedit.php:826
+#: ../../Zotlabs/Module/Connedit.php:861
msgid ""
"The permissions indicated on this page will be applied to all new "
"connections."
msgstr "Die auf dieser Seite angegebenen Berechtigungen werden auf alle neuen Verbindungen angewendet."
-#: ../../Zotlabs/Module/Connedit.php:827
+#: ../../Zotlabs/Module/Connedit.php:862
msgid "Connection Tools"
msgstr "Verbindungswerkzeuge"
-#: ../../Zotlabs/Module/Connedit.php:829
+#: ../../Zotlabs/Module/Connedit.php:864
msgid "Slide to adjust your degree of friendship"
msgstr "Verschieben, um den Grad der Freundschaft zu einzustellen"
-#: ../../Zotlabs/Module/Connedit.php:830 ../../Zotlabs/Module/Rate.php:155
+#: ../../Zotlabs/Module/Connedit.php:865 ../../Zotlabs/Module/Rate.php:155
#: ../../include/js_strings.php:20
msgid "Rating"
msgstr "Bewertung"
-#: ../../Zotlabs/Module/Connedit.php:831
+#: ../../Zotlabs/Module/Connedit.php:866
msgid "Slide to adjust your rating"
msgstr "Verschieben, um Deine Bewertung einzustellen"
-#: ../../Zotlabs/Module/Connedit.php:832 ../../Zotlabs/Module/Connedit.php:837
+#: ../../Zotlabs/Module/Connedit.php:867 ../../Zotlabs/Module/Connedit.php:872
msgid "Optionally explain your rating"
msgstr "Optional kannst Du Deine Bewertung begründen"
-#: ../../Zotlabs/Module/Connedit.php:834
+#: ../../Zotlabs/Module/Connedit.php:869
msgid "Custom Filter"
msgstr "Benutzerdefinierter Filter"
-#: ../../Zotlabs/Module/Connedit.php:835
+#: ../../Zotlabs/Module/Connedit.php:870
msgid "Only import posts with this text"
msgstr "Nur Beiträge mit diesem Text importieren"
-#: ../../Zotlabs/Module/Connedit.php:835 ../../Zotlabs/Module/Connedit.php:836
+#: ../../Zotlabs/Module/Connedit.php:870 ../../Zotlabs/Module/Connedit.php:871
msgid ""
"words one per line or #tags or /patterns/ or lang=xx, leave blank to import "
"all posts"
msgstr "Einzelne Wörter pro Zeile, #Tags oder /Reguläre Ausdrücke/. lang=xx (z.B. lang=de) ermöglicht Filterung nach Sprache. Leer lassen, um alle Beiträge zu importieren."
-#: ../../Zotlabs/Module/Connedit.php:836
+#: ../../Zotlabs/Module/Connedit.php:871
msgid "Do not import posts with this text"
msgstr "Beiträge mit diesem Text nicht importieren"
-#: ../../Zotlabs/Module/Connedit.php:838
+#: ../../Zotlabs/Module/Connedit.php:873
msgid "This information is public!"
msgstr "Diese Information ist öffentlich!"
-#: ../../Zotlabs/Module/Connedit.php:843
+#: ../../Zotlabs/Module/Connedit.php:878
msgid "Connection Pending Approval"
msgstr "Verbindung wartet auf Bestätigung"
-#: ../../Zotlabs/Module/Connedit.php:846
-#: ../../Zotlabs/Module/Settings/Tokens.php:163
-#: ../../Zotlabs/Module/Settings/Permcats.php:107
-msgid "inherited"
-msgstr "geerbt"
-
-#: ../../Zotlabs/Module/Connedit.php:848
+#: ../../Zotlabs/Module/Connedit.php:883
#, php-format
msgid ""
"Please choose the profile you would like to display to %s when viewing your "
"profile securely."
msgstr "Bitte wähle ein Profil, das wir %s zeigen sollen, wenn Deine Profilseite über eine verifizierte Verbindung aufgerufen wird."
-#: ../../Zotlabs/Module/Connedit.php:850
-#: ../../Zotlabs/Module/Settings/Tokens.php:160
-msgid "Their Settings"
-msgstr "Deren Einstellungen"
-
-#: ../../Zotlabs/Module/Connedit.php:851
-#: ../../Zotlabs/Module/Settings/Tokens.php:161
-#: ../../Zotlabs/Module/Settings/Permcats.php:105
-msgid "My Settings"
-msgstr "Meine Einstellungen"
-
-#: ../../Zotlabs/Module/Connedit.php:853
-#: ../../Zotlabs/Module/Settings/Tokens.php:166
-#: ../../Zotlabs/Module/Settings/Permcats.php:110
-msgid "Individual Permissions"
-msgstr "Individuelle Zugriffsrechte"
-
-#: ../../Zotlabs/Module/Connedit.php:854
-#: ../../Zotlabs/Module/Settings/Tokens.php:167
-#: ../../Zotlabs/Module/Settings/Permcats.php:111
-msgid ""
-"Some permissions may be inherited from your channel's <a "
-"href=\"settings\"><strong>privacy settings</strong></a>, which have higher "
-"priority than individual settings. You can <strong>not</strong> change those"
-" settings here."
-msgstr "Einige Berechtigungen werden möglicherweise von den globalen <a href=\"settings\">Sicherheits- und Privatsphäre-Einstellungen</a> dieses Kanals vererbt. Diese haben eine höhere Priorität als die Einstellungen an der Verbindung und können hier nicht verändert werden."
-
-#: ../../Zotlabs/Module/Connedit.php:855
+#: ../../Zotlabs/Module/Connedit.php:890
msgid ""
"Some permissions may be inherited from your channel's <a "
"href=\"settings\"><strong>privacy settings</strong></a>, which have higher "
@@ -3533,210 +5234,314 @@ msgid ""
"they wont have any impact unless the inherited setting changes."
msgstr "Einige Berechtigungen werden möglicherweise von den globalen <a href=\"settings\">Sicherheits- und Privatsphäre-Einstellungen</a> dieses Kanals geerbt. Diese haben eine höhere Priorität als die Einstellungen an der Verbindung. Werden geerbte Einstellungen hier geändert, hat dies keine Auswirkungen."
-#: ../../Zotlabs/Module/Connedit.php:856
+#: ../../Zotlabs/Module/Connedit.php:891
msgid "Last update:"
msgstr "Letzte Aktualisierung:"
-#: ../../Zotlabs/Module/Connedit.php:865
+#: ../../Zotlabs/Module/Connedit.php:900
msgid "Details"
msgstr "Details"
-#: ../../Zotlabs/Module/Connedit.php:868
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1137
+#: ../../Zotlabs/Module/Connedit.php:903 ../../addon/cdav/Mod_Cdav.php:1137
msgid "Organisation"
msgstr "Organisation"
-#: ../../Zotlabs/Module/Connedit.php:869
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1138
+#: ../../Zotlabs/Module/Connedit.php:904 ../../addon/cdav/Mod_Cdav.php:1138
#: ../../include/page_widgets.php:46
msgid "Title"
msgstr "Titel"
-#: ../../Zotlabs/Module/Connedit.php:870
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1139
+#: ../../Zotlabs/Module/Connedit.php:905 ../../Zotlabs/Module/Profiles.php:789
+#: ../../addon/cdav/Mod_Cdav.php:1139
msgid "Phone"
msgstr "Telefon"
-#: ../../Zotlabs/Module/Connedit.php:872
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1141
+#: ../../Zotlabs/Module/Connedit.php:907 ../../Zotlabs/Module/Profiles.php:791
+#: ../../addon/cdav/Mod_Cdav.php:1141
msgid "Instant messenger"
msgstr "Sofortnachrichtendienst"
-#: ../../Zotlabs/Module/Connedit.php:873
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1142
+#: ../../Zotlabs/Module/Connedit.php:908 ../../Zotlabs/Module/Profiles.php:792
+#: ../../addon/cdav/Mod_Cdav.php:1142
msgid "Website"
msgstr "Webseite"
-#: ../../Zotlabs/Module/Connedit.php:875
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1144
+#: ../../Zotlabs/Module/Connedit.php:910 ../../Zotlabs/Module/Profiles.php:794
+#: ../../addon/cdav/Mod_Cdav.php:1144
msgid "Note"
msgstr "Hinweis"
-#: ../../Zotlabs/Module/Connedit.php:876
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1145
-#: ../../extend/addon/addon/cdav/cdav.php:270
-#: ../../include/connections.php:894
+#: ../../Zotlabs/Module/Connedit.php:911 ../../Zotlabs/Module/Profiles.php:795
+#: ../../addon/cdav/Mod_Cdav.php:1145 ../../addon/cdav/cdav.php:270
+#: ../../include/connections.php:668
msgid "Mobile"
msgstr "Mobil"
-#: ../../Zotlabs/Module/Connedit.php:877
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1146
-#: ../../extend/addon/addon/cdav/cdav.php:271
-#: ../../include/connections.php:895
+#: ../../Zotlabs/Module/Connedit.php:912 ../../Zotlabs/Module/Profiles.php:796
+#: ../../addon/cdav/Mod_Cdav.php:1146 ../../addon/cdav/cdav.php:271
+#: ../../include/connections.php:669
msgid "Home"
msgstr "Home"
-#: ../../Zotlabs/Module/Connedit.php:878
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1147
-#: ../../extend/addon/addon/cdav/cdav.php:274
-#: ../../include/connections.php:898
+#: ../../Zotlabs/Module/Connedit.php:913 ../../Zotlabs/Module/Profiles.php:797
+#: ../../addon/cdav/Mod_Cdav.php:1147 ../../addon/cdav/cdav.php:274
+#: ../../include/connections.php:672
msgid "Work"
msgstr "Arbeit"
-#: ../../Zotlabs/Module/Connedit.php:880
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:368
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1149
+#: ../../Zotlabs/Module/Connedit.php:915 ../../Zotlabs/Module/Profiles.php:799
+#: ../../addon/cdav/Mod_Cdav.php:1149
+#: ../../addon/jappixmini/jappixmini.php:368
msgid "Add Contact"
msgstr "Kontakt hinzufügen"
-#: ../../Zotlabs/Module/Connedit.php:881
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1150
+#: ../../Zotlabs/Module/Connedit.php:916 ../../Zotlabs/Module/Profiles.php:800
+#: ../../addon/cdav/Mod_Cdav.php:1150
msgid "Add Field"
msgstr "Feld hinzufügen"
-#: ../../Zotlabs/Module/Connedit.php:886
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1155
+#: ../../Zotlabs/Module/Connedit.php:921 ../../addon/cdav/Mod_Cdav.php:1155
msgid "P.O. Box"
msgstr "Postfach"
-#: ../../Zotlabs/Module/Connedit.php:887
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1156
+#: ../../Zotlabs/Module/Connedit.php:922 ../../addon/cdav/Mod_Cdav.php:1156
msgid "Additional"
msgstr "Zusätzlich"
-#: ../../Zotlabs/Module/Connedit.php:888
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1157
+#: ../../Zotlabs/Module/Connedit.php:923 ../../addon/cdav/Mod_Cdav.php:1157
msgid "Street"
msgstr "Straße"
-#: ../../Zotlabs/Module/Connedit.php:889
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1158
+#: ../../Zotlabs/Module/Connedit.php:924 ../../addon/cdav/Mod_Cdav.php:1158
msgid "Locality"
msgstr "Ortschaft"
-#: ../../Zotlabs/Module/Connedit.php:890
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1159
+#: ../../Zotlabs/Module/Connedit.php:925 ../../addon/cdav/Mod_Cdav.php:1159
msgid "Region"
msgstr "Region"
-#: ../../Zotlabs/Module/Connedit.php:891
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1160
+#: ../../Zotlabs/Module/Connedit.php:926 ../../addon/cdav/Mod_Cdav.php:1160
msgid "ZIP Code"
msgstr "Postleitzahl"
-#: ../../Zotlabs/Module/Connedit.php:892 ../../Zotlabs/Module/Profiles.php:756
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1161
+#: ../../Zotlabs/Module/Connedit.php:927 ../../Zotlabs/Module/Profiles.php:760
+#: ../../addon/cdav/Mod_Cdav.php:1161
msgid "Country"
msgstr "Land"
-#: ../../Zotlabs/Module/Home.php:74 ../../Zotlabs/Module/Home.php:82
-#: ../../extend/addon/addon/opensearch/opensearch.php:42
-msgid "$Projectname"
-msgstr "$Projectname"
+#: ../../Zotlabs/Module/Chat.php:179
+msgid "Room not found"
+msgstr "Chatraum nicht gefunden"
-#: ../../Zotlabs/Module/Home.php:92
-#, php-format
-msgid "Welcome to %s"
-msgstr "Willkommen auf %s"
+#: ../../Zotlabs/Module/Chat.php:195
+msgid "Leave Room"
+msgstr "Raum verlassen"
-#: ../../Zotlabs/Module/Filestorage.php:87
-msgid "Permission Denied."
-msgstr "Zugriff verweigert."
+#: ../../Zotlabs/Module/Chat.php:196
+msgid "Delete Room"
+msgstr "Raum löschen"
-#: ../../Zotlabs/Module/Filestorage.php:103
-msgid "File not found."
-msgstr "Datei nicht gefunden."
+#: ../../Zotlabs/Module/Chat.php:197
+msgid "I am away right now"
+msgstr "Ich bin gerade nicht da"
-#: ../../Zotlabs/Module/Filestorage.php:146
-msgid "Edit file permissions"
-msgstr "Dateiberechtigungen bearbeiten"
+#: ../../Zotlabs/Module/Chat.php:198
+msgid "I am online"
+msgstr "Ich bin online"
-#: ../../Zotlabs/Module/Filestorage.php:159
-msgid "Set/edit permissions"
-msgstr "Berechtigungen setzen/ändern"
+#: ../../Zotlabs/Module/Chat.php:200
+msgid "Bookmark this room"
+msgstr "Lesezeichen für diesen Raum setzen"
-#: ../../Zotlabs/Module/Filestorage.php:160
-msgid "Include all files and sub folders"
-msgstr "Alle Dateien und Unterverzeichnisse einbinden"
+#: ../../Zotlabs/Module/Chat.php:203 ../../Zotlabs/Module/Mail.php:259
+#: ../../Zotlabs/Module/Mail.php:380 ../../include/conversation.php:1263
+msgid "Please enter a link URL:"
+msgstr "Gib eine URL ein:"
-#: ../../Zotlabs/Module/Filestorage.php:161
-msgid "Return to file list"
-msgstr "Zurück zur Dateiliste"
+#: ../../Zotlabs/Module/Chat.php:204 ../../Zotlabs/Module/Mail.php:312
+#: ../../Zotlabs/Module/Mail.php:454 ../../Zotlabs/Lib/ThreadItem.php:744
+#: ../../include/conversation.php:1373
+msgid "Encrypt text"
+msgstr "Text verschlüsseln"
-#: ../../Zotlabs/Module/Filestorage.php:163
-msgid "Copy/paste this code to attach file to a post"
-msgstr "Diesen Code kopieren und einfügen, um die Datei an einen Beitrag anzuhängen"
+#: ../../Zotlabs/Module/Chat.php:230
+msgid "New Chatroom"
+msgstr "Neuer Chatraum"
-#: ../../Zotlabs/Module/Filestorage.php:164
-msgid "Copy/paste this URL to link file from a web page"
-msgstr "Diese URL verwenden, um von einer Webseite aus auf die Datei zu verlinken"
+#: ../../Zotlabs/Module/Chat.php:231
+msgid "Chatroom name"
+msgstr "Chatraumname"
-#: ../../Zotlabs/Module/Filestorage.php:166
-msgid "Share this file"
-msgstr "Diese Datei freigeben"
+#: ../../Zotlabs/Module/Chat.php:232
+msgid "Expiration of chats (minutes)"
+msgstr "Verfall von Chats (Minuten)"
-#: ../../Zotlabs/Module/Filestorage.php:167
-msgid "Show URL to this file"
-msgstr "URL zu dieser Datei anzeigen"
+#: ../../Zotlabs/Module/Chat.php:248
+#, php-format
+msgid "%1$s's Chatrooms"
+msgstr "%1$ss Chaträume"
-#: ../../Zotlabs/Module/Filestorage.php:168
-msgid "Notify your contacts about this file"
-msgstr "Meine Kontakte über diese Datei benachrichtigen"
+#: ../../Zotlabs/Module/Chat.php:253
+msgid "No chatrooms available"
+msgstr "Keine Chaträume verfügbar"
+
+#: ../../Zotlabs/Module/Chat.php:257
+msgid "Expiration"
+msgstr "Verfall"
+
+#: ../../Zotlabs/Module/Chat.php:258
+msgid "min"
+msgstr "min"
#: ../../Zotlabs/Module/Fbrowser.php:29 ../../Zotlabs/Lib/Apps.php:229
-#: ../../include/conversation.php:1836
+#: ../../include/conversation.php:1783 ../../include/nav.php:392
msgid "Photos"
msgstr "Fotos"
-#: ../../Zotlabs/Module/Apps.php:45 ../../include/widgets.php:102
-#: ../../include/nav.php:178
-msgid "Apps"
-msgstr "Apps"
+#: ../../Zotlabs/Module/Fbrowser.php:85 ../../Zotlabs/Lib/Apps.php:224
+#: ../../Zotlabs/Storage/Browser.php:224 ../../include/conversation.php:1791
+#: ../../include/nav.php:400
+msgid "Files"
+msgstr "Dateien"
-#: ../../Zotlabs/Module/Cal.php:69
-msgid "Permissions denied."
-msgstr "Berechtigung verweigert."
+#: ../../Zotlabs/Module/Menu.php:49
+msgid "Unable to update menu."
+msgstr "Kann Menü nicht aktualisieren."
-#: ../../Zotlabs/Module/Cal.php:263 ../../Zotlabs/Module/Events.php:605
-msgid "l, F j"
-msgstr "l, j. F"
+#: ../../Zotlabs/Module/Menu.php:60
+msgid "Unable to create menu."
+msgstr "Kann Menü nicht erstellen."
-#: ../../Zotlabs/Module/Cal.php:312 ../../Zotlabs/Module/Events.php:660
-#: ../../include/text.php:1761
-msgid "Link to Source"
-msgstr "Link zur Quelle"
+#: ../../Zotlabs/Module/Menu.php:98 ../../Zotlabs/Module/Menu.php:110
+msgid "Menu Name"
+msgstr "Name des Menüs"
-#: ../../Zotlabs/Module/Cal.php:335 ../../Zotlabs/Module/Events.php:688
-msgid "Edit Event"
-msgstr "Termin bearbeiten"
+#: ../../Zotlabs/Module/Menu.php:98
+msgid "Unique name (not visible on webpage) - required"
+msgstr "Eindeutiger Name (nicht sichtbar auf der Webseite) – erforderlich"
-#: ../../Zotlabs/Module/Cal.php:335 ../../Zotlabs/Module/Events.php:688
-msgid "Create Event"
-msgstr "Termin anlegen"
+#: ../../Zotlabs/Module/Menu.php:99 ../../Zotlabs/Module/Menu.php:111
+msgid "Menu Title"
+msgstr "Menütitel"
-#: ../../Zotlabs/Module/Cal.php:338 ../../Zotlabs/Module/Events.php:691
-#: ../../include/channel.php:1370
-msgid "Export"
-msgstr "Exportieren"
+#: ../../Zotlabs/Module/Menu.php:99
+msgid "Visible on webpage - leave empty for no title"
+msgstr "Sichtbar auf der Webseite – für keinen Titel leer lassen"
-#: ../../Zotlabs/Module/Cal.php:341 ../../include/text.php:2307
-msgid "Import"
-msgstr "Import"
+#: ../../Zotlabs/Module/Menu.php:100
+msgid "Allow Bookmarks"
+msgstr "Lesezeichen erlauben"
-#: ../../Zotlabs/Module/Cal.php:345 ../../Zotlabs/Module/Events.php:700
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:848
-msgid "Today"
-msgstr "Heute"
+#: ../../Zotlabs/Module/Menu.php:100 ../../Zotlabs/Module/Menu.php:157
+msgid "Menu may be used to store saved bookmarks"
+msgstr "Im Menü können gespeicherte Lesezeichen abgelegt werden"
+
+#: ../../Zotlabs/Module/Menu.php:101 ../../Zotlabs/Module/Menu.php:159
+msgid "Submit and proceed"
+msgstr "Absenden und fortfahren"
+
+#: ../../Zotlabs/Module/Menu.php:107 ../../include/text.php:2268
+msgid "Menus"
+msgstr "Menüs"
+
+#: ../../Zotlabs/Module/Menu.php:117
+msgid "Bookmarks allowed"
+msgstr "Lesezeichen erlaubt"
+
+#: ../../Zotlabs/Module/Menu.php:119
+msgid "Delete this menu"
+msgstr "Lösche dieses Menü"
+
+#: ../../Zotlabs/Module/Menu.php:120 ../../Zotlabs/Module/Menu.php:154
+msgid "Edit menu contents"
+msgstr "Bearbeite Menü Inhalte"
+
+#: ../../Zotlabs/Module/Menu.php:121
+msgid "Edit this menu"
+msgstr "Dieses Menü bearbeiten"
+
+#: ../../Zotlabs/Module/Menu.php:136
+msgid "Menu could not be deleted."
+msgstr "Menü konnte nicht gelöscht werden."
+
+#: ../../Zotlabs/Module/Menu.php:149
+msgid "Edit Menu"
+msgstr "Menü bearbeiten"
+
+#: ../../Zotlabs/Module/Menu.php:153
+msgid "Add or remove entries to this menu"
+msgstr "Einträge zu diesem Menü hinzufügen oder entfernen"
+
+#: ../../Zotlabs/Module/Menu.php:155
+msgid "Menu name"
+msgstr "Menü Name"
+
+#: ../../Zotlabs/Module/Menu.php:155
+msgid "Must be unique, only seen by you"
+msgstr "Muss eindeutig sein, ist aber nur für Dich sichtbar"
+
+#: ../../Zotlabs/Module/Menu.php:156
+msgid "Menu title"
+msgstr "Menü Titel"
+
+#: ../../Zotlabs/Module/Menu.php:156
+msgid "Menu title as seen by others"
+msgstr "Menü Titel wie er von anderen gesehen wird"
+
+#: ../../Zotlabs/Module/Menu.php:157
+msgid "Allow bookmarks"
+msgstr "Erlaube Lesezeichen"
+
+#: ../../Zotlabs/Module/Layouts.php:184 ../../include/text.php:2269
+msgid "Layouts"
+msgstr "Layouts"
+
+#: ../../Zotlabs/Module/Layouts.php:186 ../../Zotlabs/Lib/Apps.php:232
+#: ../../include/nav.php:161 ../../include/nav.php:268
+#: ../../include/help.php:55 ../../include/help.php:61
+msgid "Help"
+msgstr "Hilfe"
+
+#: ../../Zotlabs/Module/Layouts.php:186
+msgid "Comanche page description language help"
+msgstr "Hilfe zur Comanche-Seitenbeschreibungssprache"
+
+#: ../../Zotlabs/Module/Layouts.php:190
+msgid "Layout Description"
+msgstr "Layout-Beschreibung"
+
+#: ../../Zotlabs/Module/Layouts.php:195
+msgid "Download PDL file"
+msgstr "PDL-Datei herunterladen"
+
+#: ../../Zotlabs/Module/Tagger.php:55 ../../include/bbcode.php:274
+msgid "post"
+msgstr "Beitrag"
+
+#: ../../Zotlabs/Module/Tagger.php:57 ../../include/conversation.php:146
+#: ../../include/text.php:1945
+msgid "comment"
+msgstr "Kommentar"
+
+#: ../../Zotlabs/Module/Tagger.php:95
+#, php-format
+msgid "%1$s tagged %2$s's %3$s with %4$s"
+msgstr "%1$s hat %2$ss %3$s mit %4$s verschlagwortet"
+
+#: ../../Zotlabs/Module/Pconfig.php:26 ../../Zotlabs/Module/Pconfig.php:59
+msgid "This setting requires special processing and editing has been blocked."
+msgstr "Diese Einstellung erfordert eine besondere Verarbeitung und ist blockiert."
+
+#: ../../Zotlabs/Module/Pconfig.php:48
+msgid "Configuration Editor"
+msgstr "Konfigurationseditor"
+
+#: ../../Zotlabs/Module/Pconfig.php:49
+msgid ""
+"Warning: Changing some settings could render your channel inoperable. Please"
+" leave this page unless you are comfortable with and knowledgeable about how"
+" to correctly use this feature."
+msgstr "Warnung: Einige Einstellungen können Deinen Kanal funktionsunfähig machen. Bitte verlasse diese Seite, es sei denn Du bist vertraut damit, wie dieses Feature korrekt verwendet wird."
#: ../../Zotlabs/Module/Group.php:24
msgid "Privacy group created."
@@ -3747,7 +5552,7 @@ msgid "Could not create privacy group."
msgstr "Gruppe konnte nicht erstellt werden."
#: ../../Zotlabs/Module/Group.php:42 ../../Zotlabs/Module/Group.php:141
-#: ../../include/items.php:3899
+#: ../../include/items.php:3922
msgid "Privacy group not found."
msgstr "Gruppe nicht gefunden."
@@ -3779,6 +5584,10 @@ msgstr "Gruppe konnte nicht entfernt werden."
msgid "Privacy group editor"
msgstr "Gruppeneditor"
+#: ../../Zotlabs/Module/Group.php:197 ../../Zotlabs/Module/Help.php:81
+msgid "Members"
+msgstr "Mitglieder"
+
#: ../../Zotlabs/Module/Group.php:199
msgid "All Connected Channels"
msgstr "Alle verbundenen Kanäle"
@@ -3787,498 +5596,8 @@ msgstr "Alle verbundenen Kanäle"
msgid "Click on a channel to add or remove."
msgstr "Wähle einen Kanal zum hinzufügen oder entfernen aus."
-#: ../../Zotlabs/Module/Dreport.php:45
-msgid "Invalid message"
-msgstr "Ungültige Beitrags-ID (mid)"
-
-#: ../../Zotlabs/Module/Dreport.php:78
-msgid "no results"
-msgstr "keine Ergebnisse"
-
-#: ../../Zotlabs/Module/Dreport.php:93
-msgid "channel sync processed"
-msgstr "Kanal-Sync verarbeitet"
-
-#: ../../Zotlabs/Module/Dreport.php:97
-msgid "queued"
-msgstr "zur Warteschlange hinzugefügt"
-
-#: ../../Zotlabs/Module/Dreport.php:101
-msgid "posted"
-msgstr "zugestellt"
-
-#: ../../Zotlabs/Module/Dreport.php:105
-msgid "accepted for delivery"
-msgstr "für Zustellung akzeptiert"
-
-#: ../../Zotlabs/Module/Dreport.php:109
-msgid "updated"
-msgstr "aktualisiert"
-
-#: ../../Zotlabs/Module/Dreport.php:112
-msgid "update ignored"
-msgstr "Aktualisierung ignoriert"
-
-#: ../../Zotlabs/Module/Dreport.php:115
-msgid "permission denied"
-msgstr "Zugriff verweigert"
-
-#: ../../Zotlabs/Module/Dreport.php:119
-msgid "recipient not found"
-msgstr "Empfänger nicht gefunden."
-
-#: ../../Zotlabs/Module/Dreport.php:122
-msgid "mail recalled"
-msgstr "Mail widerrufen"
-
-#: ../../Zotlabs/Module/Dreport.php:125
-msgid "duplicate mail received"
-msgstr "Doppelte Mail erhalten"
-
-#: ../../Zotlabs/Module/Dreport.php:128
-msgid "mail delivered"
-msgstr "Mail zugestellt"
-
-#: ../../Zotlabs/Module/Dreport.php:148
-#, php-format
-msgid "Delivery report for %1$s"
-msgstr "Zustellungsbericht für %1$s"
-
-#: ../../Zotlabs/Module/Dreport.php:151
-msgid "Options"
-msgstr "Optionen"
-
-#: ../../Zotlabs/Module/Dreport.php:152
-msgid "Redeliver"
-msgstr "Erneut zustellen"
-
-#: ../../Zotlabs/Module/Impel.php:41 ../../include/bbcode.php:203
-msgid "webpage"
-msgstr "Webseite"
-
-#: ../../Zotlabs/Module/Impel.php:46 ../../include/bbcode.php:209
-msgid "block"
-msgstr "Block"
-
-#: ../../Zotlabs/Module/Impel.php:51 ../../include/bbcode.php:206
-msgid "layout"
-msgstr "Layout"
-
-#: ../../Zotlabs/Module/Impel.php:58 ../../include/bbcode.php:212
-msgid "menu"
-msgstr "Menü"
-
-#: ../../Zotlabs/Module/Impel.php:191
-#, php-format
-msgid "%s element installed"
-msgstr "Element für %s installiert"
-
-#: ../../Zotlabs/Module/Impel.php:194
-#, php-format
-msgid "%s element installation failed"
-msgstr "Installation des Elements %s fehlgeschlagen"
-
-#: ../../Zotlabs/Module/Import_items.php:42 ../../Zotlabs/Module/Import.php:57
-msgid "Nothing to import."
-msgstr "Nichts zu importieren."
-
-#: ../../Zotlabs/Module/Import_items.php:66 ../../Zotlabs/Module/Import.php:69
-#: ../../Zotlabs/Module/Import.php:84
-msgid "Unable to download data from old server"
-msgstr "Daten können vom alten Server nicht heruntergeladen werden"
-
-#: ../../Zotlabs/Module/Import_items.php:72 ../../Zotlabs/Module/Import.php:91
-msgid "Imported file is empty."
-msgstr "Die importierte Datei ist leer."
-
-#: ../../Zotlabs/Module/Import_items.php:88
-#: ../../Zotlabs/Module/Import.php:111
-#, php-format
-msgid "Warning: Database versions differ by %1$d updates."
-msgstr "Achtung: Datenbankversionen unterscheiden sich um %1$d Aktualisierungen."
-
-#: ../../Zotlabs/Module/Import_items.php:104
-msgid "Import completed"
-msgstr "Import abgeschlossen"
-
-#: ../../Zotlabs/Module/Import_items.php:119
-msgid "Import Items"
-msgstr "Beiträge importieren"
-
-#: ../../Zotlabs/Module/Import_items.php:120
-msgid ""
-"Use this form to import existing posts and content from an export file."
-msgstr "Mit diesem Formular kannst Du existierende Beiträge und Inhalte aus einer Sicherungsdatei importieren."
-
-#: ../../Zotlabs/Module/Import_items.php:121
-#: ../../Zotlabs/Module/Import.php:495
-msgid "File to Upload"
-msgstr "Hochzuladende Datei:"
-
-#: ../../Zotlabs/Module/Manage.php:136
-#: ../../Zotlabs/Module/New_channel.php:121
-#, php-format
-msgid "You have created %1$.0f of %2$.0f allowed channels."
-msgstr "Du hast %1$.0f von maximal %2$.0f erlaubten Kanälen eingerichtet."
-
-#: ../../Zotlabs/Module/Manage.php:143
-msgid "Create a new channel"
-msgstr "Neuen Kanal anlegen"
-
-#: ../../Zotlabs/Module/Manage.php:143 ../../Zotlabs/Module/Profiles.php:813
-#: ../../Zotlabs/Module/Wiki.php:166 ../../Zotlabs/Module/Chat.php:255
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:152
-msgid "Create New"
-msgstr "Neu anlegen"
-
-#: ../../Zotlabs/Module/Manage.php:164 ../../Zotlabs/Lib/Apps.php:221
-#: ../../include/nav.php:223
-msgid "Channel Manager"
-msgstr "Kanal-Manager"
-
-#: ../../Zotlabs/Module/Manage.php:165
-msgid "Current Channel"
-msgstr "Aktueller Kanal"
-
-#: ../../Zotlabs/Module/Manage.php:167
-msgid "Switch to one of your channels by selecting it."
-msgstr "Wechsle zu einem Deiner Kanäle, indem Du auf ihn klickst."
-
-#: ../../Zotlabs/Module/Manage.php:168
-msgid "Default Channel"
-msgstr "Standard Kanal"
-
-#: ../../Zotlabs/Module/Manage.php:169
-msgid "Make Default"
-msgstr "Zum Standard machen"
-
-#: ../../Zotlabs/Module/Manage.php:172
-#, php-format
-msgid "%d new messages"
-msgstr "%d neue Nachrichten"
-
-#: ../../Zotlabs/Module/Manage.php:173
-#, php-format
-msgid "%d new introductions"
-msgstr "%d neue Vorstellungen"
-
-#: ../../Zotlabs/Module/Manage.php:175
-msgid "Delegated Channel"
-msgstr "Delegierte Kanäle"
-
-#: ../../Zotlabs/Module/Import.php:134
-#, php-format
-msgid "Your service plan only allows %d channels."
-msgstr "Dein Vertrag erlaubt nur %d Kanäle."
-
-#: ../../Zotlabs/Module/Import.php:149
-msgid "No channel. Import failed."
-msgstr "Kein Kanal. Import fehlgeschlagen."
-
-#: ../../Zotlabs/Module/Import.php:467
-#: ../../extend/addon/addon/diaspora/import_diaspora.php:142
-msgid "Import completed."
-msgstr "Import abgeschlossen."
-
-#: ../../Zotlabs/Module/Import.php:488
-msgid "You must be logged in to use this feature."
-msgstr "Du musst angemeldet sein um diese Funktion zu nutzen."
-
-#: ../../Zotlabs/Module/Import.php:493
-msgid "Import Channel"
-msgstr "Kanal importieren"
-
-#: ../../Zotlabs/Module/Import.php:494
-msgid ""
-"Use this form to import an existing channel from a different server/hub. You"
-" may retrieve the channel identity from the old server/hub via the network "
-"or provide an export file."
-msgstr "Verwende dieses Formular, um einen existierenden Kanal von einem anderen Hub zu importieren. Du kannst den Kanal direkt vom bisherigen Hub über das Netzwerk oder aus einer exportierten Sicherheitskopie importieren."
-
-#: ../../Zotlabs/Module/Import.php:496
-msgid "Or provide the old server/hub details"
-msgstr "Oder gib die Details Deines bisherigen $Projectname-Hubs ein"
-
-#: ../../Zotlabs/Module/Import.php:497
-msgid "Your old identity address (xyz@example.com)"
-msgstr "Bisherige Kanal-Adresse (xyz@example.com)"
-
-#: ../../Zotlabs/Module/Import.php:498
-msgid "Your old login email address"
-msgstr "Deine alte Login-E-Mail-Adresse"
-
-#: ../../Zotlabs/Module/Import.php:499
-msgid "Your old login password"
-msgstr "Dein altes Passwort"
-
-#: ../../Zotlabs/Module/Import.php:500
-msgid ""
-"For either option, please choose whether to make this hub your new primary "
-"address, or whether your old location should continue this role. You will be"
-" able to post from either location, but only one can be marked as the "
-"primary location for files, photos, and media."
-msgstr "Egal, welche Option Du wählst – bitte lege fest, ob dieser Server die neue primäre Adresse dieses Kanals sein soll, oder ob der bisherige $Projectname-Hub diese Rolle weiterhin wahrnimmt. Du kannst von beiden Servern aus posten, aber nur einer kann der primäre Ort Deiner Dateien, Fotos und Medien sein."
-
-#: ../../Zotlabs/Module/Import.php:501
-msgid "Make this hub my primary location"
-msgstr "Dieser $Pojectname-Hub ist mein primärer Hub."
-
-#: ../../Zotlabs/Module/Import.php:502
-msgid "Move this channel (disable all previous locations)"
-msgstr "Verschiebe diesen Kanal (deaktiviere alle vorherigen Adressen/Klone)"
-
-#: ../../Zotlabs/Module/Import.php:503
-msgid "Import a few months of posts if possible (limited by available memory"
-msgstr "Importiere die Beiträge einiger Monate, sofern möglich (beschränkt durch verfügbaren Speicher)"
-
-#: ../../Zotlabs/Module/Import.php:504
-msgid ""
-"This process may take several minutes to complete. Please submit the form "
-"only once and leave this page open until finished."
-msgstr "Dieser Vorgang kann einige Minuten dauern. Bitte sende das Formular nur einmal ab und lasse diese Seite bis zur Fertigstellung offen."
-
-#: ../../Zotlabs/Module/Lockview.php:75
-msgid "Remote privacy information not available."
-msgstr "Privatsphäre-Einstellungen anderer Nutzer sind nicht verfügbar."
-
-#: ../../Zotlabs/Module/Lockview.php:96
-msgid "Visible to:"
-msgstr "Sichtbar für:"
-
-#: ../../Zotlabs/Module/Magic.php:71
-msgid "Hub not found."
-msgstr "Server nicht gefunden."
-
-#: ../../Zotlabs/Module/Mitem.php:52
-msgid "Unable to create element."
-msgstr "Element konnte nicht erstellt werden."
-
-#: ../../Zotlabs/Module/Mitem.php:76
-msgid "Unable to update menu element."
-msgstr "Kann Menü-Element nicht aktualisieren."
-
-#: ../../Zotlabs/Module/Mitem.php:92
-msgid "Unable to add menu element."
-msgstr "Kann Menü-Bestandteil nicht hinzufügen."
-
-#: ../../Zotlabs/Module/Mitem.php:153 ../../Zotlabs/Module/Mitem.php:230
-msgid "Menu Item Permissions"
-msgstr "Zugriffsrechte des Menü-Elements"
-
-#: ../../Zotlabs/Module/Mitem.php:154 ../../Zotlabs/Module/Mitem.php:231
-#: ../../Zotlabs/Module/Settings/Channel.php:510
-msgid "(click to open/close)"
-msgstr "(zum öffnen/schließen anklicken)"
-
-#: ../../Zotlabs/Module/Mitem.php:160 ../../Zotlabs/Module/Mitem.php:176
-msgid "Link Name"
-msgstr "Name des Links"
-
-#: ../../Zotlabs/Module/Mitem.php:161 ../../Zotlabs/Module/Mitem.php:239
-msgid "Link or Submenu Target"
-msgstr "Ziel des Links oder Untermenüs"
-
-#: ../../Zotlabs/Module/Mitem.php:161
-msgid "Enter URL of the link or select a menu name to create a submenu"
-msgstr "URL des Links eingeben oder Menünamen wählen, um ein Untermenü anzulegen."
-
-#: ../../Zotlabs/Module/Mitem.php:162 ../../Zotlabs/Module/Mitem.php:240
-msgid "Use magic-auth if available"
-msgstr "Magic-Auth verwenden, falls verfügbar"
-
-#: ../../Zotlabs/Module/Mitem.php:163 ../../Zotlabs/Module/Mitem.php:241
-msgid "Open link in new window"
-msgstr "Öffne Link in neuem Fenster"
-
-#: ../../Zotlabs/Module/Mitem.php:164 ../../Zotlabs/Module/Mitem.php:242
-msgid "Order in list"
-msgstr "Reihenfolge in der Liste"
-
-#: ../../Zotlabs/Module/Mitem.php:164 ../../Zotlabs/Module/Mitem.php:242
-msgid "Higher numbers will sink to bottom of listing"
-msgstr "Größere Nummern werden weiter unten in der Auflistung einsortiert"
-
-#: ../../Zotlabs/Module/Mitem.php:165
-msgid "Submit and finish"
-msgstr "Absenden und fertigstellen"
-
-#: ../../Zotlabs/Module/Mitem.php:166
-msgid "Submit and continue"
-msgstr "Absenden und fortfahren"
-
-#: ../../Zotlabs/Module/Mitem.php:174
-msgid "Menu:"
-msgstr "Menü:"
-
-#: ../../Zotlabs/Module/Mitem.php:177
-msgid "Link Target"
-msgstr "Ziel des Links"
-
-#: ../../Zotlabs/Module/Mitem.php:180
-msgid "Edit menu"
-msgstr "Menü bearbeiten"
-
-#: ../../Zotlabs/Module/Mitem.php:183
-msgid "Edit element"
-msgstr "Bestandteil bearbeiten"
-
-#: ../../Zotlabs/Module/Mitem.php:184
-msgid "Drop element"
-msgstr "Bestandteil löschen"
-
-#: ../../Zotlabs/Module/Mitem.php:185
-msgid "New element"
-msgstr "Neues Bestandteil"
-
-#: ../../Zotlabs/Module/Mitem.php:186
-msgid "Edit this menu container"
-msgstr "Diesen Menü-Container bearbeiten"
-
-#: ../../Zotlabs/Module/Mitem.php:187
-msgid "Add menu element"
-msgstr "Menüelement hinzufügen"
-
-#: ../../Zotlabs/Module/Mitem.php:188
-msgid "Delete this menu item"
-msgstr "Lösche dieses Menü-Bestandteil"
-
-#: ../../Zotlabs/Module/Mitem.php:189
-msgid "Edit this menu item"
-msgstr "Bearbeite dieses Menü-Bestandteil"
-
-#: ../../Zotlabs/Module/Mitem.php:206
-msgid "Menu item not found."
-msgstr "Menü-Bestandteil nicht gefunden."
-
-#: ../../Zotlabs/Module/Mitem.php:219
-msgid "Menu item deleted."
-msgstr "Menü-Bestandteil gelöscht."
-
-#: ../../Zotlabs/Module/Mitem.php:221
-msgid "Menu item could not be deleted."
-msgstr "Menü-Bestandteil kann nicht gelöscht werden."
-
-#: ../../Zotlabs/Module/Mitem.php:228
-msgid "Edit Menu Element"
-msgstr "Bearbeite Menü-Bestandteil"
-
-#: ../../Zotlabs/Module/Mitem.php:238
-msgid "Link text"
-msgstr "Link Text"
-
-#: ../../Zotlabs/Module/Appman.php:38 ../../Zotlabs/Module/Appman.php:54
-msgid "App installed."
-msgstr "App installiert."
-
-#: ../../Zotlabs/Module/Appman.php:47
-msgid "Malformed app."
-msgstr "Fehlerhafte App."
-
-#: ../../Zotlabs/Module/Appman.php:110
-msgid "Embed code"
-msgstr "Code einbetten"
-
-#: ../../Zotlabs/Module/Appman.php:116
-msgid "Edit App"
-msgstr "App bearbeiten"
-
-#: ../../Zotlabs/Module/Appman.php:116
-msgid "Create App"
-msgstr "App erstellen"
-
-#: ../../Zotlabs/Module/Appman.php:121
-msgid "Name of app"
-msgstr "Name der App"
-
-#: ../../Zotlabs/Module/Appman.php:121 ../../Zotlabs/Module/Appman.php:122
-#: ../../Zotlabs/Module/Profiles.php:744 ../../Zotlabs/Module/Profiles.php:748
-#: ../../Zotlabs/Module/Events.php:460 ../../Zotlabs/Module/Events.php:465
-#: ../../include/datetime.php:259
-msgid "Required"
-msgstr "Benötigt"
-
-#: ../../Zotlabs/Module/Appman.php:122
-msgid "Location (URL) of app"
-msgstr "Ort (URL) der App"
-
-#: ../../Zotlabs/Module/Appman.php:123 ../../Zotlabs/Module/Events.php:473
-#: ../../Zotlabs/Module/Rbmark.php:101
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:838
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:173
-msgid "Description"
-msgstr "Beschreibung"
-
-#: ../../Zotlabs/Module/Appman.php:124
-msgid "Photo icon URL"
-msgstr "URL zum Icon"
-
-#: ../../Zotlabs/Module/Appman.php:124
-msgid "80 x 80 pixels - optional"
-msgstr "80 x 80 Pixel – optional"
-
-#: ../../Zotlabs/Module/Appman.php:125
-msgid "Categories (optional, comma separated list)"
-msgstr "Kategorien (optional, kommagetrennte Liste)"
-
-#: ../../Zotlabs/Module/Appman.php:126
-msgid "Version ID"
-msgstr "Versions-ID"
-
-#: ../../Zotlabs/Module/Appman.php:127
-msgid "Price of app"
-msgstr "Preis der App"
-
-#: ../../Zotlabs/Module/Appman.php:128
-msgid "Location (URL) to purchase app"
-msgstr "Ort (URL), um die App zu kaufen"
-
-#: ../../Zotlabs/Module/Ratings.php:70
-msgid "No ratings"
-msgstr "Keine Bewertungen"
-
-#: ../../Zotlabs/Module/Ratings.php:98
-msgid "Rating: "
-msgstr "Bewertung: "
-
-#: ../../Zotlabs/Module/Ratings.php:99
-msgid "Website: "
-msgstr "Webseite: "
-
-#: ../../Zotlabs/Module/Ratings.php:101
-msgid "Description: "
-msgstr "Beschreibung: "
-
-#: ../../Zotlabs/Module/Attach.php:13
-msgid "Item not available."
-msgstr "Element nicht verfügbar."
-
-#: ../../Zotlabs/Module/Mood.php:67 ../../include/conversation.php:260
-#, php-format
-msgctxt "mood"
-msgid "%1$s is %2$s"
-msgstr "%1$s ist %2$s"
-
-#: ../../Zotlabs/Module/Mood.php:135 ../../Zotlabs/Lib/Apps.php:234
-msgid "Mood"
-msgstr "Laune"
-
-#: ../../Zotlabs/Module/Mood.php:136
-msgid "Set your current mood and tell your friends"
-msgstr "Wähle Deine aktuelle Stimmung und teile sie mit Deinen Freunden"
-
-#: ../../Zotlabs/Module/Notify.php:57
-#: ../../Zotlabs/Module/Notifications.php:38
-msgid "No more system notifications."
-msgstr "Keine System-Benachrichtigungen mehr."
-
-#: ../../Zotlabs/Module/Notify.php:61
-#: ../../Zotlabs/Module/Notifications.php:42
-msgid "System Notifications"
-msgstr "System-Benachrichtigungen"
-
#: ../../Zotlabs/Module/Profiles.php:24 ../../Zotlabs/Module/Profiles.php:184
-#: ../../Zotlabs/Module/Profiles.php:241 ../../Zotlabs/Module/Profiles.php:660
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:62
+#: ../../Zotlabs/Module/Profiles.php:241 ../../Zotlabs/Module/Profiles.php:659
msgid "Profile not found."
msgstr "Profil nicht gefunden."
@@ -4306,338 +5625,304 @@ msgstr "Dieses Profil kann nicht exportiert werden."
msgid "Profile Name is required."
msgstr "Profil-Name erforderlich."
-#: ../../Zotlabs/Module/Profiles.php:460
+#: ../../Zotlabs/Module/Profiles.php:459
msgid "Marital Status"
msgstr "Familienstand"
-#: ../../Zotlabs/Module/Profiles.php:464
+#: ../../Zotlabs/Module/Profiles.php:463
msgid "Romantic Partner"
msgstr "Romantische Partner"
-#: ../../Zotlabs/Module/Profiles.php:468 ../../Zotlabs/Module/Profiles.php:771
+#: ../../Zotlabs/Module/Profiles.php:467 ../../Zotlabs/Module/Profiles.php:775
msgid "Likes"
msgstr "Gefällt"
-#: ../../Zotlabs/Module/Profiles.php:472 ../../Zotlabs/Module/Profiles.php:772
+#: ../../Zotlabs/Module/Profiles.php:471 ../../Zotlabs/Module/Profiles.php:776
msgid "Dislikes"
msgstr "Gefällt nicht"
-#: ../../Zotlabs/Module/Profiles.php:476 ../../Zotlabs/Module/Profiles.php:779
+#: ../../Zotlabs/Module/Profiles.php:475 ../../Zotlabs/Module/Profiles.php:783
msgid "Work/Employment"
msgstr "Arbeit/Anstellung"
-#: ../../Zotlabs/Module/Profiles.php:479
+#: ../../Zotlabs/Module/Profiles.php:478
msgid "Religion"
msgstr "Religion"
-#: ../../Zotlabs/Module/Profiles.php:483
+#: ../../Zotlabs/Module/Profiles.php:482
msgid "Political Views"
msgstr "Politische Ansichten"
-#: ../../Zotlabs/Module/Profiles.php:487
-#: ../../extend/addon/addon/openid/MysqlProvider.php:74
+#: ../../Zotlabs/Module/Profiles.php:486
+#: ../../addon/openid/MysqlProvider.php:74
msgid "Gender"
msgstr "Geschlecht"
-#: ../../Zotlabs/Module/Profiles.php:491
+#: ../../Zotlabs/Module/Profiles.php:490
msgid "Sexual Preference"
msgstr "Sexuelle Orientierung"
-#: ../../Zotlabs/Module/Profiles.php:495
+#: ../../Zotlabs/Module/Profiles.php:494
msgid "Homepage"
msgstr "Webseite"
-#: ../../Zotlabs/Module/Profiles.php:499
+#: ../../Zotlabs/Module/Profiles.php:498
msgid "Interests"
msgstr "Hobbys/Interessen"
-#: ../../Zotlabs/Module/Profiles.php:595
+#: ../../Zotlabs/Module/Profiles.php:594
msgid "Profile updated."
msgstr "Profil aktualisiert."
-#: ../../Zotlabs/Module/Profiles.php:679
+#: ../../Zotlabs/Module/Profiles.php:678
msgid "Hide your connections list from viewers of this profile"
msgstr "Deine Verbindungen vor Betrachtern dieses Profils verbergen"
-#: ../../Zotlabs/Module/Profiles.php:721
+#: ../../Zotlabs/Module/Profiles.php:725
msgid "Edit Profile Details"
msgstr "Bearbeite Profil-Details"
-#: ../../Zotlabs/Module/Profiles.php:723
+#: ../../Zotlabs/Module/Profiles.php:727
msgid "View this profile"
msgstr "Dieses Profil ansehen"
-#: ../../Zotlabs/Module/Profiles.php:724 ../../Zotlabs/Module/Profiles.php:806
+#: ../../Zotlabs/Module/Profiles.php:728 ../../Zotlabs/Module/Profiles.php:827
#: ../../include/channel.php:1066
msgid "Edit visibility"
msgstr "Sichtbarkeit bearbeiten"
-#: ../../Zotlabs/Module/Profiles.php:725
+#: ../../Zotlabs/Module/Profiles.php:729
msgid "Profile Tools"
msgstr "Profilwerkzeuge"
-#: ../../Zotlabs/Module/Profiles.php:726
+#: ../../Zotlabs/Module/Profiles.php:730
msgid "Change cover photo"
msgstr "Titelbild ändern"
-#: ../../Zotlabs/Module/Profiles.php:727 ../../include/channel.php:1037
+#: ../../Zotlabs/Module/Profiles.php:731 ../../include/channel.php:1037
msgid "Change profile photo"
msgstr "Profilfoto ändern"
-#: ../../Zotlabs/Module/Profiles.php:728
+#: ../../Zotlabs/Module/Profiles.php:732
msgid "Create a new profile using these settings"
msgstr "Neues Profil anlegen und diese Einstellungen übernehmen"
-#: ../../Zotlabs/Module/Profiles.php:729
+#: ../../Zotlabs/Module/Profiles.php:733
msgid "Clone this profile"
msgstr "Dieses Profil klonen"
-#: ../../Zotlabs/Module/Profiles.php:730
+#: ../../Zotlabs/Module/Profiles.php:734
msgid "Delete this profile"
msgstr "Dieses Profil löschen"
-#: ../../Zotlabs/Module/Profiles.php:731
+#: ../../Zotlabs/Module/Profiles.php:735
msgid "Add profile things"
msgstr "Sachen zum Profil hinzufügen"
-#: ../../Zotlabs/Module/Profiles.php:732 ../../include/conversation.php:1715
-#: ../../include/widgets.php:105
+#: ../../Zotlabs/Module/Profiles.php:736 ../../include/conversation.php:1657
msgid "Personal"
msgstr "Persönlich"
-#: ../../Zotlabs/Module/Profiles.php:734
+#: ../../Zotlabs/Module/Profiles.php:738
msgid "Relation"
msgstr "Beziehung"
-#: ../../Zotlabs/Module/Profiles.php:735 ../../include/datetime.php:55
+#: ../../Zotlabs/Module/Profiles.php:739 ../../include/datetime.php:55
msgid "Miscellaneous"
msgstr "Verschiedenes"
-#: ../../Zotlabs/Module/Profiles.php:737
+#: ../../Zotlabs/Module/Profiles.php:741
msgid "Import profile from file"
msgstr "Profil aus einer Datei importieren"
-#: ../../Zotlabs/Module/Profiles.php:738
+#: ../../Zotlabs/Module/Profiles.php:742
msgid "Export profile to file"
msgstr "Profil in eine Datei exportieren"
-#: ../../Zotlabs/Module/Profiles.php:739
+#: ../../Zotlabs/Module/Profiles.php:743
msgid "Your gender"
msgstr "Dein Geschlecht"
-#: ../../Zotlabs/Module/Profiles.php:740
+#: ../../Zotlabs/Module/Profiles.php:744
msgid "Marital status"
msgstr "Familienstand"
-#: ../../Zotlabs/Module/Profiles.php:741
+#: ../../Zotlabs/Module/Profiles.php:745
msgid "Sexual preference"
msgstr "Sexuelle Orientierung"
-#: ../../Zotlabs/Module/Profiles.php:744
+#: ../../Zotlabs/Module/Profiles.php:748
msgid "Profile name"
msgstr "Profilname"
-#: ../../Zotlabs/Module/Profiles.php:746
+#: ../../Zotlabs/Module/Profiles.php:750
msgid "This is your default profile."
msgstr "Das ist Dein Standardprofil."
-#: ../../Zotlabs/Module/Profiles.php:748
+#: ../../Zotlabs/Module/Profiles.php:752
msgid "Your full name"
msgstr "Dein voller Name"
-#: ../../Zotlabs/Module/Profiles.php:749
+#: ../../Zotlabs/Module/Profiles.php:753
msgid "Title/Description"
msgstr "Titel/Beschreibung"
-#: ../../Zotlabs/Module/Profiles.php:752
+#: ../../Zotlabs/Module/Profiles.php:756
msgid "Street address"
msgstr "Straße und Hausnummer"
-#: ../../Zotlabs/Module/Profiles.php:753
+#: ../../Zotlabs/Module/Profiles.php:757
msgid "Locality/City"
msgstr "Wohnort"
-#: ../../Zotlabs/Module/Profiles.php:754
+#: ../../Zotlabs/Module/Profiles.php:758
msgid "Region/State"
msgstr "Region/Bundesstaat"
-#: ../../Zotlabs/Module/Profiles.php:755
+#: ../../Zotlabs/Module/Profiles.php:759
msgid "Postal/Zip code"
msgstr "Postleitzahl"
-#: ../../Zotlabs/Module/Profiles.php:761
+#: ../../Zotlabs/Module/Profiles.php:765
msgid "Who (if applicable)"
msgstr "Wer (falls anwendbar)"
-#: ../../Zotlabs/Module/Profiles.php:761
+#: ../../Zotlabs/Module/Profiles.php:765
msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
msgstr "Beispiele: cathy123, Cathy Williams, cathy@example.com"
-#: ../../Zotlabs/Module/Profiles.php:762
+#: ../../Zotlabs/Module/Profiles.php:766
msgid "Since (date)"
msgstr "Seit (Datum)"
-#: ../../Zotlabs/Module/Profiles.php:765
+#: ../../Zotlabs/Module/Profiles.php:769
msgid "Tell us about yourself"
msgstr "Erzähle uns ein wenig von Dir"
-#: ../../Zotlabs/Module/Profiles.php:766
-#: ../../extend/addon/addon/openid/MysqlProvider.php:68
+#: ../../Zotlabs/Module/Profiles.php:770
+#: ../../addon/openid/MysqlProvider.php:68
msgid "Homepage URL"
msgstr "Homepage-URL"
-#: ../../Zotlabs/Module/Profiles.php:767
+#: ../../Zotlabs/Module/Profiles.php:771
msgid "Hometown"
msgstr "Heimatort"
-#: ../../Zotlabs/Module/Profiles.php:768
+#: ../../Zotlabs/Module/Profiles.php:772
msgid "Political views"
msgstr "Politische Ansichten"
-#: ../../Zotlabs/Module/Profiles.php:769
+#: ../../Zotlabs/Module/Profiles.php:773
msgid "Religious views"
msgstr "Religiöse Ansichten"
-#: ../../Zotlabs/Module/Profiles.php:770
+#: ../../Zotlabs/Module/Profiles.php:774
msgid "Keywords used in directory listings"
msgstr "Schlüsselwörter, die in Verzeichnis-Auflistungen verwendet werden"
-#: ../../Zotlabs/Module/Profiles.php:770
+#: ../../Zotlabs/Module/Profiles.php:774
msgid "Example: fishing photography software"
msgstr "Beispiel: Angeln Fotografie Software"
-#: ../../Zotlabs/Module/Profiles.php:773
+#: ../../Zotlabs/Module/Profiles.php:777
msgid "Musical interests"
msgstr "Musikalische Interessen"
-#: ../../Zotlabs/Module/Profiles.php:774
+#: ../../Zotlabs/Module/Profiles.php:778
msgid "Books, literature"
msgstr "Bücher, Literatur"
-#: ../../Zotlabs/Module/Profiles.php:775
+#: ../../Zotlabs/Module/Profiles.php:779
msgid "Television"
msgstr "Fernsehen"
-#: ../../Zotlabs/Module/Profiles.php:776
+#: ../../Zotlabs/Module/Profiles.php:780
msgid "Film/Dance/Culture/Entertainment"
msgstr "Film/Tanz/Kultur/Unterhaltung"
-#: ../../Zotlabs/Module/Profiles.php:777
+#: ../../Zotlabs/Module/Profiles.php:781
msgid "Hobbies/Interests"
msgstr "Hobbys/Interessen"
-#: ../../Zotlabs/Module/Profiles.php:778
+#: ../../Zotlabs/Module/Profiles.php:782
msgid "Love/Romance"
msgstr "Liebe/Romantik"
-#: ../../Zotlabs/Module/Profiles.php:780
+#: ../../Zotlabs/Module/Profiles.php:784
msgid "School/Education"
msgstr "Schule/Ausbildung"
-#: ../../Zotlabs/Module/Profiles.php:781
+#: ../../Zotlabs/Module/Profiles.php:785
msgid "Contact information and social networks"
msgstr "Kontaktinformation und soziale Netzwerke"
-#: ../../Zotlabs/Module/Profiles.php:782
+#: ../../Zotlabs/Module/Profiles.php:786
msgid "My other channels"
msgstr "Meine anderen Kanäle"
-#: ../../Zotlabs/Module/Profiles.php:802 ../../include/channel.php:1062
+#: ../../Zotlabs/Module/Profiles.php:788
+msgid "Communications"
+msgstr "Kommunikation"
+
+#: ../../Zotlabs/Module/Profiles.php:823 ../../include/channel.php:1062
msgid "Profile Image"
msgstr "Profilfoto:"
-#: ../../Zotlabs/Module/Profiles.php:812 ../../include/channel.php:1044
-#: ../../include/nav.php:105
+#: ../../Zotlabs/Module/Profiles.php:833 ../../include/channel.php:1044
+#: ../../include/nav.php:109
msgid "Edit Profiles"
msgstr "Profile bearbeiten"
-#: ../../Zotlabs/Module/Api.php:72 ../../Zotlabs/Module/Api.php:93
-msgid "Authorize application connection"
-msgstr "Zugriff für die Anwendung autorisieren"
+#: ../../Zotlabs/Module/Editwebpage.php:139
+msgid "Page link"
+msgstr "Seiten-Link"
-#: ../../Zotlabs/Module/Api.php:73
-msgid "Return to your app and insert this Security Code:"
-msgstr "Gehen Sie zu Ihrer App zurück und tragen Sie diesen Sicherheitscode ein:"
+#: ../../Zotlabs/Module/Editwebpage.php:166
+msgid "Edit Webpage"
+msgstr "Webseite bearbeiten"
-#: ../../Zotlabs/Module/Api.php:83
-msgid "Please login to continue."
-msgstr "Zum Weitermachen, bitte einloggen."
+#: ../../Zotlabs/Module/Manage.php:143
+msgid "Create a new channel"
+msgstr "Neuen Kanal anlegen"
-#: ../../Zotlabs/Module/Api.php:95
-msgid ""
-"Do you want to authorize this application to access your posts and contacts,"
-" and/or create new posts for you?"
-msgstr "Möchtest Du dieser Anwendung erlauben, Deine Nachrichten und Kontakte abzurufen und/oder neue Nachrichten für Dich zu erstellen?"
+#: ../../Zotlabs/Module/Manage.php:168 ../../Zotlabs/Lib/Apps.php:221
+#: ../../include/nav.php:205
+msgid "Channel Manager"
+msgstr "Kanal-Manager"
-#: ../../Zotlabs/Module/Invite.php:29
-msgid "Total invitation limit exceeded."
-msgstr "Einladungslimit überschritten."
+#: ../../Zotlabs/Module/Manage.php:169
+msgid "Current Channel"
+msgstr "Aktueller Kanal"
-#: ../../Zotlabs/Module/Invite.php:53
-#, php-format
-msgid "%s : Not a valid email address."
-msgstr "%s : Keine gültige Email Adresse."
+#: ../../Zotlabs/Module/Manage.php:171
+msgid "Switch to one of your channels by selecting it."
+msgstr "Wechsle zu einem Deiner Kanäle, indem Du auf ihn klickst."
-#: ../../Zotlabs/Module/Invite.php:67
-msgid "Please join us on $Projectname"
-msgstr "Schließe Dich uns auf $Projectname an!"
+#: ../../Zotlabs/Module/Manage.php:172
+msgid "Default Channel"
+msgstr "Standard Kanal"
-#: ../../Zotlabs/Module/Invite.php:77
-msgid "Invitation limit exceeded. Please contact your site administrator."
-msgstr "Einladungslimit überschritten. Bitte kontaktiere den Administrator Deines $Projectname-Servers."
+#: ../../Zotlabs/Module/Manage.php:173
+msgid "Make Default"
+msgstr "Zum Standard machen"
-#: ../../Zotlabs/Module/Invite.php:82
+#: ../../Zotlabs/Module/Manage.php:176
#, php-format
-msgid "%s : Message delivery failed."
-msgstr "%s : Nachricht konnte nicht zugestellt werden."
+msgid "%d new messages"
+msgstr "%d neue Nachrichten"
-#: ../../Zotlabs/Module/Invite.php:86
+#: ../../Zotlabs/Module/Manage.php:177
#, php-format
-msgid "%d message sent."
-msgid_plural "%d messages sent."
-msgstr[0] "%d Nachricht gesendet."
-msgstr[1] "%d Nachrichten gesendet."
-
-#: ../../Zotlabs/Module/Invite.php:105
-msgid "You have no more invitations available"
-msgstr "Du hast keine weiteren verfügbare Einladungen"
-
-#: ../../Zotlabs/Module/Invite.php:136
-msgid "Send invitations"
-msgstr "Einladungen senden"
-
-#: ../../Zotlabs/Module/Invite.php:137
-msgid "Enter email addresses, one per line:"
-msgstr "Email-Adressen eintragen, eine pro Zeile:"
-
-#: ../../Zotlabs/Module/Invite.php:138 ../../Zotlabs/Module/Mail.php:284
-msgid "Your message:"
-msgstr "Deine Nachricht:"
-
-#: ../../Zotlabs/Module/Invite.php:139
-msgid "Please join my community on $Projectname."
-msgstr "Schließe Dich uns auf $Projectname an!"
-
-#: ../../Zotlabs/Module/Invite.php:141
-msgid "You will need to supply this invitation code:"
-msgstr "Bitte verwende bei der Registrierung den folgenden Einladungscode:"
-
-#: ../../Zotlabs/Module/Invite.php:142
-msgid ""
-"1. Register at any $Projectname location (they are all inter-connected)"
-msgstr "1. Registriere Dich auf einem beliebigen $Projectname-Hub (sie sind alle miteinander verbunden)"
-
-#: ../../Zotlabs/Module/Invite.php:144
-msgid "2. Enter my $Projectname network address into the site searchbar."
-msgstr "2. Gib meine $Projectname-Adresse im Suchfeld ein."
+msgid "%d new introductions"
+msgstr "%d neue Vorstellungen"
-#: ../../Zotlabs/Module/Invite.php:145
-msgid "or visit"
-msgstr "oder besuche"
+#: ../../Zotlabs/Module/Manage.php:179
+msgid "Delegated Channel"
+msgstr "Delegierte Kanäle"
-#: ../../Zotlabs/Module/Invite.php:147
-msgid "3. Click [Connect]"
-msgstr "3. Klicke auf [Verbinden]"
+#: ../../Zotlabs/Module/Dirsearch.php:33
+msgid "This directory server requires an access token"
+msgstr "Dieser Verzeichnisserver benötigt einen Zugriffstoken"
#: ../../Zotlabs/Module/Siteinfo.php:20
msgid "About this site"
@@ -4647,10 +5932,14 @@ msgstr "Ãœber diese Seite"
msgid "Site Name"
msgstr "Seitenname"
-#: ../../Zotlabs/Module/Siteinfo.php:25 ../../include/network.php:1972
+#: ../../Zotlabs/Module/Siteinfo.php:25 ../../include/network.php:2025
msgid "Administrator"
msgstr "Administrator"
+#: ../../Zotlabs/Module/Siteinfo.php:27 ../../Zotlabs/Module/Register.php:221
+msgid "Terms of Service"
+msgstr "Nutzungsbedingungen"
+
#: ../../Zotlabs/Module/Siteinfo.php:28
msgid "Software and Project information"
msgstr "Software und Projektinformationen"
@@ -4677,2538 +5966,1367 @@ msgstr "Projekt-Website"
msgid "Developer homepage"
msgstr "Entwickler-Website"
-#: ../../Zotlabs/Module/New_channel.php:140
-msgid "Create Channel"
-msgstr "Einen neuen Kanal anlegen"
-
-#: ../../Zotlabs/Module/New_channel.php:141
-msgid ""
-"A channel is your identity on this network. It can represent a person, a "
-"blog, or a forum to name a few. Channels can make connections with other "
-"channels to share information with highly detailed permissions."
-msgstr "Ein Kanal ist Deine Identität in diesem Netzwerk. Er kann eine Person, ein Blog oder ein Forum repräsentieren, nur um ein paar Beispiele zu nennen. Kanäle können Verbindungen miteinander eingehen, um Informationen zu teilen, jeweils basierend auf sehr detaillierten Berechtigungseinstellungen."
-
-#: ../../Zotlabs/Module/New_channel.php:142
-msgid ""
-"or <a href=\"import\">import an existing channel</a> from another location."
-msgstr "oder <a href=\"import\">importiere einen bestehenden Kanal</a> von einem anderen Server."
-
-#: ../../Zotlabs/Module/Setup.php:176
-msgid "$Projectname Server - Setup"
-msgstr "$Projectname Server-Einrichtung"
-
-#: ../../Zotlabs/Module/Setup.php:180
-msgid "Could not connect to database."
-msgstr "Kann nicht mit der Datenbank verbinden."
-
-#: ../../Zotlabs/Module/Setup.php:184
-msgid ""
-"Could not connect to specified site URL. Possible SSL certificate or DNS "
-"issue."
-msgstr "Konnte die angegebene Webseiten-URL nicht erreichen. Möglicherweise ein Problem mit dem SSL-Zertifikat oder dem DNS."
-
-#: ../../Zotlabs/Module/Setup.php:191
-msgid "Could not create table."
-msgstr "Konnte Tabelle nicht erstellen."
-
-#: ../../Zotlabs/Module/Setup.php:196
-msgid "Your site database has been installed."
-msgstr "Die Datenbank Deines Hubs wurde installiert."
-
-#: ../../Zotlabs/Module/Setup.php:200
-msgid ""
-"You may need to import the file \"install/schema_xxx.sql\" manually using a "
-"database client."
-msgstr "Möglicherweise musst Du die Datei install/schema_xxx.sql manuell mit Hilfe eines Datenkbank-Clients importieren."
+#: ../../Zotlabs/Module/Ratings.php:70
+msgid "No ratings"
+msgstr "Keine Bewertungen"
-#: ../../Zotlabs/Module/Setup.php:201 ../../Zotlabs/Module/Setup.php:263
-#: ../../Zotlabs/Module/Setup.php:750
-msgid "Please see the file \"install/INSTALL.txt\"."
-msgstr "Lies die Datei \"install/INSTALL.txt\"."
+#: ../../Zotlabs/Module/Ratings.php:97 ../../Zotlabs/Module/Pubsites.php:35
+#: ../../include/conversation.php:1032
+msgid "Ratings"
+msgstr "Bewertungen"
-#: ../../Zotlabs/Module/Setup.php:260
-msgid "System check"
-msgstr "Systemprüfung"
+#: ../../Zotlabs/Module/Ratings.php:98
+msgid "Rating: "
+msgstr "Bewertung: "
-#: ../../Zotlabs/Module/Setup.php:265
-msgid "Check again"
-msgstr "Nochmal prüfen"
+#: ../../Zotlabs/Module/Ratings.php:99
+msgid "Website: "
+msgstr "Webseite: "
-#: ../../Zotlabs/Module/Setup.php:287
-msgid "Database connection"
-msgstr "Datenbankverbindung"
+#: ../../Zotlabs/Module/Ratings.php:101
+msgid "Description: "
+msgstr "Beschreibung: "
-#: ../../Zotlabs/Module/Setup.php:288
-msgid ""
-"In order to install $Projectname we need to know how to connect to your "
-"database."
-msgstr "Um $Projectname zu installieren, müssen wir wissen, wie wir eine Verbindung zu Deiner Datenbank aufbauen können."
+#: ../../Zotlabs/Module/Webpages.php:52
+msgid "Import Webpage Elements"
+msgstr "Webseitenelemente importieren"
-#: ../../Zotlabs/Module/Setup.php:289
-msgid ""
-"Please contact your hosting provider or site administrator if you have "
-"questions about these settings."
-msgstr "Bitte kontaktiere Deinen Hosting-Provider oder Administrator, falls Du Fragen zu diesen Einstellungen hast."
+#: ../../Zotlabs/Module/Webpages.php:53
+msgid "Import selected"
+msgstr "Import ausgewählt"
-#: ../../Zotlabs/Module/Setup.php:290
-msgid ""
-"The database you specify below should already exist. If it does not, please "
-"create it before continuing."
-msgstr "Die Datenbank, die Du weiter unten angibst, sollte bereits existieren. Sollte das noch nicht der Fall sein, erzeuge sie bitte bevor Du fortfährst."
+#: ../../Zotlabs/Module/Webpages.php:76
+msgid "Export Webpage Elements"
+msgstr "Webseitenelemente exportieren"
-#: ../../Zotlabs/Module/Setup.php:294
-msgid "Database Server Name"
-msgstr "Datenbankservername"
+#: ../../Zotlabs/Module/Webpages.php:77
+msgid "Export selected"
+msgstr "Exportieren ausgewählt"
-#: ../../Zotlabs/Module/Setup.php:294
-msgid "Default is 127.0.0.1"
-msgstr "Standard ist 127.0.0.1"
+#: ../../Zotlabs/Module/Webpages.php:242 ../../Zotlabs/Lib/Apps.php:225
+#: ../../include/conversation.php:1841 ../../include/nav.php:449
+msgid "Webpages"
+msgstr "Webseiten"
-#: ../../Zotlabs/Module/Setup.php:295
-msgid "Database Port"
-msgstr "Datenbankport"
+#: ../../Zotlabs/Module/Webpages.php:253 ../../include/page_widgets.php:44
+msgid "Actions"
+msgstr "Aktionen"
-#: ../../Zotlabs/Module/Setup.php:295
-msgid "Communication port number - use 0 for default"
-msgstr "Port-Nummer für die Kommunikation – verwende 0 für die Standardeinstellung"
+#: ../../Zotlabs/Module/Webpages.php:254 ../../include/page_widgets.php:45
+msgid "Page Link"
+msgstr "Seiten-Link"
-#: ../../Zotlabs/Module/Setup.php:296
-msgid "Database Login Name"
-msgstr "Datenbank-Benutzername"
+#: ../../Zotlabs/Module/Webpages.php:255
+msgid "Page Title"
+msgstr "Seitentitel"
-#: ../../Zotlabs/Module/Setup.php:297
-msgid "Database Login Password"
-msgstr "Datenbank-Passwort"
+#: ../../Zotlabs/Module/Webpages.php:285
+msgid "Invalid file type."
+msgstr "Ungültiger Dateityp."
-#: ../../Zotlabs/Module/Setup.php:298
-msgid "Database Name"
-msgstr "Datenbankname"
+#: ../../Zotlabs/Module/Webpages.php:297
+msgid "Error opening zip file"
+msgstr "Fehler beim Öffnen der ZIP-Datei"
-#: ../../Zotlabs/Module/Setup.php:299
-msgid "Database Type"
-msgstr "Datenbanktyp"
+#: ../../Zotlabs/Module/Webpages.php:308
+msgid "Invalid folder path."
+msgstr "Ungültiger Ordnerpfad."
-#: ../../Zotlabs/Module/Setup.php:301 ../../Zotlabs/Module/Setup.php:347
-msgid "Site administrator email address"
-msgstr "E-Mail Adresse des Seiten-Administrators"
+#: ../../Zotlabs/Module/Webpages.php:335
+msgid "No webpage elements detected."
+msgstr "Keine Webseitenelemente erkannt."
-#: ../../Zotlabs/Module/Setup.php:301 ../../Zotlabs/Module/Setup.php:347
-msgid ""
-"Your account email address must match this in order to use the web admin "
-"panel."
-msgstr "Die E-Mail-Adresse Deines Accounts muss dieser Adresse entsprechen, damit Du Zugriff zur Administrations-Seite erhältst."
+#: ../../Zotlabs/Module/Webpages.php:410
+msgid "Import complete."
+msgstr "Import abgeschlossen."
-#: ../../Zotlabs/Module/Setup.php:302 ../../Zotlabs/Module/Setup.php:349
-msgid "Website URL"
-msgstr "Webseiten-URL"
+#: ../../Zotlabs/Module/Editpost.php:38
+msgid "Item is not editable"
+msgstr "Element kann nicht bearbeitet werden."
-#: ../../Zotlabs/Module/Setup.php:302 ../../Zotlabs/Module/Setup.php:349
-msgid "Please use SSL (https) URL if available."
-msgstr "Nutze wenn möglich eine SSL-URL (https)."
+#: ../../Zotlabs/Module/Editpost.php:103 ../../Zotlabs/Module/Rpost.php:138
+msgid "Edit post"
+msgstr "Bearbeite Beitrag"
-#: ../../Zotlabs/Module/Setup.php:303 ../../Zotlabs/Module/Setup.php:353
-msgid "Please select a default timezone for your website"
-msgstr "Standard-Zeitzone für Deinen Server"
+#: ../../Zotlabs/Module/Dreport.php:45
+msgid "Invalid message"
+msgstr "Ungültige Beitrags-ID (mid)"
-#: ../../Zotlabs/Module/Setup.php:336
-msgid "Site settings"
-msgstr "Seiteneinstellungen"
+#: ../../Zotlabs/Module/Dreport.php:78
+msgid "no results"
+msgstr "keine Ergebnisse"
-#: ../../Zotlabs/Module/Setup.php:392
-msgid "PHP version 5.5 or greater is required."
-msgstr "PHP-Version 5.5 oder höher ist erforderlich."
+#: ../../Zotlabs/Module/Dreport.php:93
+msgid "channel sync processed"
+msgstr "Kanal-Sync verarbeitet"
-#: ../../Zotlabs/Module/Setup.php:393
-msgid "PHP version"
-msgstr "PHP-Version"
+#: ../../Zotlabs/Module/Dreport.php:97
+msgid "queued"
+msgstr "zur Warteschlange hinzugefügt"
-#: ../../Zotlabs/Module/Setup.php:409
-msgid "Could not find a command line version of PHP in the web server PATH."
-msgstr "Konnte die Kommandozeilen-Version von PHP nicht im PATH des Web-Servers finden."
+#: ../../Zotlabs/Module/Dreport.php:101
+msgid "posted"
+msgstr "zugestellt"
-#: ../../Zotlabs/Module/Setup.php:410
-msgid ""
-"If you don't have a command line version of PHP installed on server, you "
-"will not be able to run background polling via cron."
-msgstr "Ohne Kommandozeilen-Version von PHP auf dem Server wirst Du nicht in der Lage sein, Hintergrundprozesse via cron auszuführen."
+#: ../../Zotlabs/Module/Dreport.php:105
+msgid "accepted for delivery"
+msgstr "für Zustellung akzeptiert"
-#: ../../Zotlabs/Module/Setup.php:414
-msgid "PHP executable path"
-msgstr "PHP-Pfad zu ausführbarer Datei"
+#: ../../Zotlabs/Module/Dreport.php:109
+msgid "updated"
+msgstr "aktualisiert"
-#: ../../Zotlabs/Module/Setup.php:414
-msgid ""
-"Enter full path to php executable. You can leave this blank to continue the "
-"installation."
-msgstr "Gib den vollen Pfad zum PHP-Interpreter an. Du kannst dieses Feld frei lassen und mit der Installation fortfahren."
+#: ../../Zotlabs/Module/Dreport.php:112
+msgid "update ignored"
+msgstr "Aktualisierung ignoriert"
-#: ../../Zotlabs/Module/Setup.php:419
-msgid "Command line PHP"
-msgstr "PHP-Befehlszeile"
+#: ../../Zotlabs/Module/Dreport.php:115
+msgid "permission denied"
+msgstr "Zugriff verweigert"
-#: ../../Zotlabs/Module/Setup.php:429
-msgid ""
-"Unable to check command line PHP, as shell_exec() is disabled. This is "
-"required."
-msgstr "Prüfung auf Kommandozeilen-PHP fehlgeschlagen, da shell_exec() deaktiviert ist. Dies wird aber benötigt."
+#: ../../Zotlabs/Module/Dreport.php:119
+msgid "recipient not found"
+msgstr "Empfänger nicht gefunden."
-#: ../../Zotlabs/Module/Setup.php:432
-msgid ""
-"The command line version of PHP on your system does not have "
-"\"register_argc_argv\" enabled."
-msgstr "Bei der Kommandozeilen-Version von PHP auf Deinem System ist \"register_argc_argv\" nicht aktiviert."
+#: ../../Zotlabs/Module/Dreport.php:122
+msgid "mail recalled"
+msgstr "Mail widerrufen"
-#: ../../Zotlabs/Module/Setup.php:433
-msgid "This is required for message delivery to work."
-msgstr "Das wird benötigt, damit die Auslieferung von Nachrichten funktioniert."
+#: ../../Zotlabs/Module/Dreport.php:125
+msgid "duplicate mail received"
+msgstr "Doppelte Mail erhalten"
-#: ../../Zotlabs/Module/Setup.php:436
-msgid "PHP register_argc_argv"
-msgstr "PHP register_argc_argv"
+#: ../../Zotlabs/Module/Dreport.php:128
+msgid "mail delivered"
+msgstr "Mail zugestellt"
-#: ../../Zotlabs/Module/Setup.php:454
+#: ../../Zotlabs/Module/Dreport.php:148
#, php-format
-msgid ""
-"Your max allowed total upload size is set to %s. Maximum size of one file to"
-" upload is set to %s. You are allowed to upload up to %d files at once."
-msgstr "Die Maximalgröße für Uploads insgesamt liegt bei %s. Die Maximalgröße für eine Datei liegt bei %s. Es können maximal %d Dateien gleichzeitig hochgeladen werden."
-
-#: ../../Zotlabs/Module/Setup.php:459
-msgid "You can adjust these settings in the server php.ini file."
-msgstr "Du kannst diese Einstellungen in der php.ini - Datei des Servers anpassen."
-
-#: ../../Zotlabs/Module/Setup.php:461
-msgid "PHP upload limits"
-msgstr "PHP-Hochladebeschränkungen"
-
-#: ../../Zotlabs/Module/Setup.php:484
-msgid ""
-"Error: the \"openssl_pkey_new\" function on this system is not able to "
-"generate encryption keys"
-msgstr "Fehler: Die „openssl_pkey_new“-Funktion auf diesem System ist nicht in der Lage, Schlüssel für die Verschlüsselung zu erzeugen."
-
-#: ../../Zotlabs/Module/Setup.php:485
-msgid ""
-"If running under Windows, please see "
-"\"http://www.php.net/manual/en/openssl.installation.php\"."
-msgstr "Wenn Du Windows verwendest, findest Du unter http://www.php.net/manual/en/openssl.installation.php eine Installationsanleitung."
-
-#: ../../Zotlabs/Module/Setup.php:488
-msgid "Generate encryption keys"
-msgstr "Verschlüsselungsschlüssel erzeugen"
+msgid "Delivery report for %1$s"
+msgstr "Zustellungsbericht für %1$s"
-#: ../../Zotlabs/Module/Setup.php:505
-msgid "libCurl PHP module"
-msgstr "libCurl-PHP-Modul"
+#: ../../Zotlabs/Module/Dreport.php:151
+msgid "Options"
+msgstr "Optionen"
-#: ../../Zotlabs/Module/Setup.php:506
-msgid "GD graphics PHP module"
-msgstr "GD-Grafik-PHP-Modul"
+#: ../../Zotlabs/Module/Dreport.php:152
+msgid "Redeliver"
+msgstr "Erneut zustellen"
-#: ../../Zotlabs/Module/Setup.php:507
-msgid "OpenSSL PHP module"
-msgstr "OpenSSL-PHP-Modul"
+#: ../../Zotlabs/Module/Sources.php:37
+msgid "Failed to create source. No channel selected."
+msgstr "Konnte die Quelle nicht anlegen. Kein Kanal ausgewählt."
-#: ../../Zotlabs/Module/Setup.php:508
-msgid "PDO database PHP module"
-msgstr "PDO-Datenbank-PHP-Modul"
+#: ../../Zotlabs/Module/Sources.php:51
+msgid "Source created."
+msgstr "Quelle erstellt."
-#: ../../Zotlabs/Module/Setup.php:509
-msgid "mb_string PHP module"
-msgstr "mb_string-PHP-Modul"
+#: ../../Zotlabs/Module/Sources.php:64
+msgid "Source updated."
+msgstr "Quelle aktualisiert."
-#: ../../Zotlabs/Module/Setup.php:510
-msgid "xml PHP module"
-msgstr "xml-PHP-Modul"
+#: ../../Zotlabs/Module/Sources.php:90
+msgid "*"
+msgstr "*"
-#: ../../Zotlabs/Module/Setup.php:514 ../../Zotlabs/Module/Setup.php:516
-msgid "Apache mod_rewrite module"
-msgstr "Apache-mod_rewrite-Modul"
+#: ../../Zotlabs/Module/Sources.php:96
+#: ../../Zotlabs/Widget/Settings_menu.php:123 ../../include/features.php:213
+msgid "Channel Sources"
+msgstr "Kanal-Quellen"
-#: ../../Zotlabs/Module/Setup.php:514
-msgid ""
-"Error: Apache webserver mod-rewrite module is required but not installed."
-msgstr "Fehler: Das Apache-Modul mod-rewrite wird benötigt, ist aber nicht installiert."
+#: ../../Zotlabs/Module/Sources.php:97
+msgid "Manage remote sources of content for your channel."
+msgstr "Externe Inhaltsquellen für Deinen Kanal verwalten."
-#: ../../Zotlabs/Module/Setup.php:520 ../../Zotlabs/Module/Setup.php:523
-msgid "exec"
-msgstr "exec"
+#: ../../Zotlabs/Module/Sources.php:98 ../../Zotlabs/Module/Sources.php:108
+msgid "New Source"
+msgstr "Neue Quelle"
-#: ../../Zotlabs/Module/Setup.php:520
+#: ../../Zotlabs/Module/Sources.php:109 ../../Zotlabs/Module/Sources.php:143
msgid ""
-"Error: exec is required but is either not installed or has been disabled in "
-"php.ini"
-msgstr "Fehler: exec ist erforderlich, aber entweder nicht installiert oder wurde in der php.ini deaktiviert"
+"Import all or selected content from the following channel into this channel "
+"and distribute it according to your channel settings."
+msgstr "Importiere alle oder ausgewählte Inhalte des folgenden Kanals in diesen Kanal und verteile sie gemäß der Einstellungen dieses Kanals."
-#: ../../Zotlabs/Module/Setup.php:526 ../../Zotlabs/Module/Setup.php:529
-msgid "shell_exec"
-msgstr "shell_exec"
+#: ../../Zotlabs/Module/Sources.php:110 ../../Zotlabs/Module/Sources.php:144
+msgid "Only import content with these words (one per line)"
+msgstr "Importiere nur Beiträge, die folgende Wörter (eines pro Zeile) enthalten"
-#: ../../Zotlabs/Module/Setup.php:526
-msgid ""
-"Error: shell_exec is required but is either not installed or has been "
-"disabled in php.ini"
-msgstr "Fehler: shell_exec ist erforderlich, aber entweder nicht installiert oder wurde in der php.ini deaktiviert"
+#: ../../Zotlabs/Module/Sources.php:110 ../../Zotlabs/Module/Sources.php:144
+msgid "Leave blank to import all public content"
+msgstr "Leer lassen, um alle öffentlichen Beiträge zu importieren"
-#: ../../Zotlabs/Module/Setup.php:534
-msgid "Error: libCURL PHP module required but not installed."
-msgstr "Fehler: Das PHP-Modul libCURL wird benötigt, ist aber nicht installiert."
+#: ../../Zotlabs/Module/Sources.php:111 ../../Zotlabs/Module/Sources.php:148
+msgid "Channel Name"
+msgstr "Name des Kanals"
-#: ../../Zotlabs/Module/Setup.php:538
+#: ../../Zotlabs/Module/Sources.php:112 ../../Zotlabs/Module/Sources.php:147
msgid ""
-"Error: GD graphics PHP module with JPEG support required but not installed."
-msgstr "Fehler: Das PHP-Modul GD-Grafik mit JPEG-Unterstützung wird benötigt, ist aber nicht installiert."
+"Add the following categories to posts imported from this source (comma "
+"separated)"
+msgstr "Füge die folgenden Kategorien zu Beiträgen, die aus dieser Quelle importiert werden, hinzu (kommagetrennt)"
-#: ../../Zotlabs/Module/Setup.php:542
-msgid "Error: openssl PHP module required but not installed."
-msgstr "Fehler: Das PHP-Modul openssl wird benötigt, ist aber nicht installiert."
+#: ../../Zotlabs/Module/Sources.php:133 ../../Zotlabs/Module/Sources.php:161
+msgid "Source not found."
+msgstr "Quelle nicht gefunden."
-#: ../../Zotlabs/Module/Setup.php:546
-msgid "Error: PDO database PHP module required but not installed."
-msgstr "Fehler: PDO-Datenbank-PHP-Modul ist erforderlich, aber nicht installiert."
+#: ../../Zotlabs/Module/Sources.php:140
+msgid "Edit Source"
+msgstr "Quelle bearbeiten"
-#: ../../Zotlabs/Module/Setup.php:550
-msgid "Error: mb_string PHP module required but not installed."
-msgstr "Fehler: Das PHP-Modul mb_string wird benötigt, ist aber nicht installiert."
+#: ../../Zotlabs/Module/Sources.php:141
+msgid "Delete Source"
+msgstr "Quelle löschen"
-#: ../../Zotlabs/Module/Setup.php:554
-msgid "Error: xml PHP module required for DAV but not installed."
-msgstr "Fehler: Das xml-PHP-Modul wird für DAV benötigt, ist aber nicht installiert."
+#: ../../Zotlabs/Module/Sources.php:169
+msgid "Source removed"
+msgstr "Quelle gelöscht"
-#: ../../Zotlabs/Module/Setup.php:572
-msgid ""
-"The web installer needs to be able to create a file called \".htconfig.php\""
-" in the top folder of your web server and it is unable to do so."
-msgstr "Der Installations-Assistent muss in der Lage sein, die Datei \".htconfig.php\" im Stammverzeichnis des Web-Servers anzulegen, ist er aber nicht."
+#: ../../Zotlabs/Module/Sources.php:171
+msgid "Unable to remove source."
+msgstr "Konnte die Quelle nicht löschen."
-#: ../../Zotlabs/Module/Setup.php:573
-msgid ""
-"This is most often a permission setting, as the web server may not be able "
-"to write files in your folder - even if you can."
-msgstr "Meist liegt das daran, dass der Nutzer, unter dem der Web-Server läuft, keine Schreibrechte in dem Verzeichnis hat – selbst wenn Du selbst das darfst."
+#: ../../Zotlabs/Module/Like.php:19
+msgid "Like/Dislike"
+msgstr "Mögen/Nicht mögen"
-#: ../../Zotlabs/Module/Setup.php:574
-msgid ""
-"At the end of this procedure, we will give you a text to save in a file "
-"named .htconfig.php in your Red top folder."
-msgstr "Am Schluss dieses Vorgangs wird ein Text generiert, den Du unter dem Dateinamen .htconfig.php im Stammverzeichnis Deiner Hubzilla-Installation speichern musst."
+#: ../../Zotlabs/Module/Like.php:24
+msgid "This action is restricted to members."
+msgstr "Diese Aktion kann nur von Mitgliedern ausgeführt werden."
-#: ../../Zotlabs/Module/Setup.php:575
+#: ../../Zotlabs/Module/Like.php:25
msgid ""
-"You can alternatively skip this procedure and perform a manual installation."
-" Please see the file \"install/INSTALL.txt\" for instructions."
-msgstr "Alternativ kannst Du diesen Schritt überspringen und die Installation manuell vornehmen. Lies dazu die Datei install/INSTALL.txt."
+"Please <a href=\"rmagic\">login with your $Projectname ID</a> or <a "
+"href=\"register\">register as a new $Projectname member</a> to continue."
+msgstr "Um fortzufahren <a href=\"rmagic\">melde Dich bitte mit Deiner $Projectname-ID an</a> oder <a href=\"register\">registriere Dich als neues $Projectname-Mitglied</a>."
-#: ../../Zotlabs/Module/Setup.php:578
-msgid ".htconfig.php is writable"
-msgstr ".htconfig.php ist beschreibbar"
+#: ../../Zotlabs/Module/Like.php:105 ../../Zotlabs/Module/Like.php:131
+#: ../../Zotlabs/Module/Like.php:169
+msgid "Invalid request."
+msgstr "Ungültige Anfrage."
-#: ../../Zotlabs/Module/Setup.php:592
-msgid ""
-"This software uses the Smarty3 template engine to render its web views. "
-"Smarty3 compiles templates to PHP to speed up rendering."
-msgstr "Diese Software verwendet die Smarty3 Template Engine, um Vorlagen für die Webdarstellung zu verarbeiten. Smarty3 übersetzt diese Vorlagen nach PHP, um die Darstellung zu beschleunigen."
+#: ../../Zotlabs/Module/Like.php:117 ../../include/conversation.php:122
+msgid "channel"
+msgstr "Kanal"
-#: ../../Zotlabs/Module/Setup.php:593
-#, php-format
-msgid ""
-"In order to store these compiled templates, the web server needs to have "
-"write access to the directory %s under the top level web folder."
-msgstr "Um diese kompilierten Vorlagen speichern zu können, braucht der Web-Server Schreibzugriff auf das Verzeichnis %s unterhalb des Hubzilla-Stammverzeichnisses."
+#: ../../Zotlabs/Module/Like.php:146
+msgid "thing"
+msgstr "Sache"
-#: ../../Zotlabs/Module/Setup.php:594 ../../Zotlabs/Module/Setup.php:615
-msgid ""
-"Please ensure that the user that your web server runs as (e.g. www-data) has"
-" write access to this folder."
-msgstr "Bitte stelle sicher, dass der Nutzer, unter dem der Web-Server läuft (z.B. www-data), Schreibzugriff auf dieses Verzeichnis hat."
+#: ../../Zotlabs/Module/Like.php:192
+msgid "Channel unavailable."
+msgstr "Kanal nicht vorhanden."
-#: ../../Zotlabs/Module/Setup.php:595
-#, php-format
-msgid ""
-"Note: as a security measure, you should give the web server write access to "
-"%s only--not the template files (.tpl) that it contains."
-msgstr "Hinweis: Aus Sicherheitsgründen sollte der Web-Server nur auf %s Schreibrechte haben, nicht auf die Template-Dateien (.tpl), die das Verzeichnis enthält."
+#: ../../Zotlabs/Module/Like.php:240
+msgid "Previous action reversed."
+msgstr "Die vorherige Aktion wurde rückgängig gemacht."
-#: ../../Zotlabs/Module/Setup.php:598
+#: ../../Zotlabs/Module/Like.php:419 ../../addon/diaspora/inbound.php:1812
+#: ../../include/conversation.php:160
#, php-format
-msgid "%s is writable"
-msgstr "%s ist beschreibbar"
-
-#: ../../Zotlabs/Module/Setup.php:614
-msgid ""
-"This software uses the store directory to save uploaded files. The web "
-"server needs to have write access to the store directory under the top level"
-" web folder"
-msgstr "Diese Software benutzt das Verzeichnis store, um hochgeladene Dateien zu speichern. Der Webserver benötigt Schreibrechte für dieses Verzeichnis direkt unterhalb des Web-Stammverzeichnisses."
-
-#: ../../Zotlabs/Module/Setup.php:618
-msgid "store is writable"
-msgstr "store ist schreibbar"
-
-#: ../../Zotlabs/Module/Setup.php:651
-msgid ""
-"SSL certificate cannot be validated. Fix certificate or disable https access"
-" to this site."
-msgstr "Das SSL-Zertifikat konnte nicht validiert werden. Korrigiere das Zertifikat oder deaktiviere den HTTPS-Zugriff auf diesen Server."
-
-#: ../../Zotlabs/Module/Setup.php:652
-msgid ""
-"If you have https access to your website or allow connections to TCP port "
-"443 (the https: port), you MUST use a browser-valid certificate. You MUST "
-"NOT use self-signed certificates!"
-msgstr "Wenn Du via HTTPS auf Deinen Server zugreifen möchtest, also Verbindungen über den Port 443 möglich sein sollen, ist ein SSL-Zertifikat einer Zertifizierungsstelle (CA) notwendig, das von den Browsern ohne Sicherheitsabfrage akzeptiert wird. Die Verwendung eines selbst signierten Zertifikates ist nicht möglich."
-
-#: ../../Zotlabs/Module/Setup.php:653
-msgid ""
-"This restriction is incorporated because public posts from you may for "
-"example contain references to images on your own hub."
-msgstr "Diese Einschränkung wurde eingebaut, weil Deine öffentlichen Beiträge zum Beispiel Verweise auf Bilder auf Deinem eigenen Hub enthalten können."
-
-#: ../../Zotlabs/Module/Setup.php:654
-msgid ""
-"If your certificate is not recognized, members of other sites (who may "
-"themselves have valid certificates) will get a warning message on their own "
-"site complaining about security issues."
-msgstr "Wenn Dein Zertifikat nicht von jedem Browser akzeptiert wird, erhalten die Mitglieder anderer $Projectname-Hubs (die mit korrekten Zertifikaten ausgestattet sind) Sicherheits-Warnmeldungen, obwohl sie gar nicht direkt auf Deinem Server unterwegs sind (zum Beispiel, wenn ein Bild aus einem Deiner Beiträge angezeigt wird)."
-
-#: ../../Zotlabs/Module/Setup.php:655
-msgid ""
-"This can cause usability issues elsewhere (not just on your own site) so we "
-"must insist on this requirement."
-msgstr "Dies kann Probleme für andere Nutzer (nicht nur auf Deinem eigenen Server) verursachen, so dass wir auf dieser Forderung bestehen müssen."
-
-#: ../../Zotlabs/Module/Setup.php:656
-msgid ""
-"Providers are available that issue free certificates which are browser-"
-"valid."
-msgstr "Es gibt einige Zertifizierungsstellen (CAs), bei denen solche Zertifikate kostenlos zu haben sind."
-
-#: ../../Zotlabs/Module/Setup.php:658
-msgid ""
-"If you are confident that the certificate is valid and signed by a trusted "
-"authority, check to see if you have failed to install an intermediate cert. "
-"These are not normally required by browsers, but are required for server-to-"
-"server communications."
-msgstr "Wenn Du sicher bist, dass das Zertifikat gültig und von einer vertrauenswürdigen Zertifizierungsstelle signiert ist, prüfe auf ggf. noch zu installierende Zwischenzertifikate (intermediate). Diese werden nicht unbedingt von Browsern benötigt, aber sehr wohl für die Kommunikation zwischen Servern."
-
-#: ../../Zotlabs/Module/Setup.php:660
-msgid "SSL certificate validation"
-msgstr "SSL Zertifikatverifizierung"
-
-#: ../../Zotlabs/Module/Setup.php:666
-msgid ""
-"Url rewrite in .htaccess is not working. Check your server "
-"configuration.Test: "
-msgstr "Das Umschreiben von URLs (rewrite) per .htaccess funktioniert nicht. Bitte prüfe die Server-Konfiguration. Test:"
-
-#: ../../Zotlabs/Module/Setup.php:669
-msgid "Url rewrite is working"
-msgstr "Url rewrite funktioniert"
-
-#: ../../Zotlabs/Module/Setup.php:683
-msgid ""
-"The database configuration file \".htconfig.php\" could not be written. "
-"Please use the enclosed text to create a configuration file in your web "
-"server root."
-msgstr "Die Datenbank-Konfigurationsdatei „.htconfig.php“ konnte nicht geschrieben werden. Bitte verwende den unten angegebenen Text, um die Konfigurationsdatei im Stammverzeichnis des Webservers anzulegen."
-
-#: ../../Zotlabs/Module/Setup.php:707
-#: ../../extend/addon/addon/cdav/cdav.php:41
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:401
-msgid "Errors encountered creating database tables."
-msgstr "Fehler beim Anlegen der Datenbank-Tabellen aufgetreten."
-
-#: ../../Zotlabs/Module/Setup.php:748
-msgid "<h1>What next</h1>"
-msgstr "<h1>Was als Nächstes</h1>"
-
-#: ../../Zotlabs/Module/Setup.php:749
-msgid ""
-"IMPORTANT: You will need to [manually] setup a scheduled task for the "
-"poller."
-msgstr "WICHTIG: Du musst [manuell] einen Cronjob für den Poller einrichten."
-
-#: ../../Zotlabs/Module/Notifications.php:43 ../../include/nav.php:208
-msgid "Mark all system notifications seen"
-msgstr "Markiere alle System-Benachrichtigungen als gesehen"
-
-#: ../../Zotlabs/Module/Poke.php:168 ../../Zotlabs/Lib/Apps.php:235
-#: ../../include/conversation.php:942 ../../include/conversation.php:1109
-msgid "Poke"
-msgstr "Anstupsen"
-
-#: ../../Zotlabs/Module/Poke.php:169
-msgid "Poke somebody"
-msgstr "Jemanden anstupsen"
-
-#: ../../Zotlabs/Module/Poke.php:172
-msgid "Poke/Prod"
-msgstr "Anstupsen/Knuffen"
-
-#: ../../Zotlabs/Module/Poke.php:173
-msgid "Poke, prod or do other things to somebody"
-msgstr "Jemanden anstupsen, knuffen oder sonstiges"
-
-#: ../../Zotlabs/Module/Poke.php:180
-msgid "Recipient"
-msgstr "Empfänger"
-
-#: ../../Zotlabs/Module/Poke.php:181
-msgid "Choose what you wish to do to recipient"
-msgstr "Wähle, was Du mit dem/r Empfänger/in tun willst"
-
-#: ../../Zotlabs/Module/Poke.php:184 ../../Zotlabs/Module/Poke.php:185
-msgid "Make this post private"
-msgstr "Diesen Beitrag privat machen"
-
-#: ../../Zotlabs/Module/Oexchange.php:27
-msgid "Unable to find your hub."
-msgstr "Konnte Deinen Server nicht finden."
-
-#: ../../Zotlabs/Module/Oexchange.php:41
-msgid "Post successful."
-msgstr "Veröffentlichung erfolgreich."
-
-#: ../../Zotlabs/Module/Item.php:184
-msgid "Unable to locate original post."
-msgstr "Originalbeitrag nicht gefunden."
-
-#: ../../Zotlabs/Module/Item.php:450
-msgid "Empty post discarded."
-msgstr "Leeren Beitrag verworfen."
-
-#: ../../Zotlabs/Module/Item.php:492
-msgid "Executable content type not permitted to this channel."
-msgstr "Ausführbarer Content-Typ ist für diesen Kanal nicht freigegeben."
-
-#: ../../Zotlabs/Module/Item.php:842
-msgid "Duplicate post suppressed."
-msgstr "Doppelter Beitrag unterdrückt."
-
-#: ../../Zotlabs/Module/Item.php:984
-msgid "System error. Post not saved."
-msgstr "Systemfehler. Beitrag nicht gespeichert."
-
-#: ../../Zotlabs/Module/Item.php:1114
-msgid "Unable to obtain post information from database."
-msgstr "Beitragsinformationen können nicht aus der Datenbank abgerufen werden."
+msgid "%1$s likes %2$s's %3$s"
+msgstr "%1$s gefällt %2$ss %3$s"
-#: ../../Zotlabs/Module/Item.php:1121
+#: ../../Zotlabs/Module/Like.php:421 ../../include/conversation.php:163
#, php-format
-msgid "You have reached your limit of %1$.0f top level posts."
-msgstr "Du hast die maximale Anzahl von %1$.0f Beiträgen erreicht."
+msgid "%1$s doesn't like %2$s's %3$s"
+msgstr "%1$s gefällt %2$ss %3$s nicht"
-#: ../../Zotlabs/Module/Item.php:1128
+#: ../../Zotlabs/Module/Like.php:423
#, php-format
-msgid "You have reached your limit of %1$.0f webpages."
-msgstr "Du hast die maximale Anzahl von %1$.0f Webseiten erreicht."
-
-#: ../../Zotlabs/Module/Pconfig.php:26 ../../Zotlabs/Module/Pconfig.php:59
-msgid "This setting requires special processing and editing has been blocked."
-msgstr "Diese Einstellung erfordert eine besondere Verarbeitung und ist blockiert."
-
-#: ../../Zotlabs/Module/Pconfig.php:48
-msgid "Configuration Editor"
-msgstr "Konfigurationseditor"
-
-#: ../../Zotlabs/Module/Pconfig.php:49
-msgid ""
-"Warning: Changing some settings could render your channel inoperable. Please"
-" leave this page unless you are comfortable with and knowledgeable about how"
-" to correctly use this feature."
-msgstr "Warnung: Einige Einstellungen können Deinen Kanal funktionsunfähig machen. Bitte verlasse diese Seite, es sei denn Du bist vertraut damit, wie dieses Feature korrekt verwendet wird."
-
-#: ../../Zotlabs/Module/Profile.php:78
-msgid "vcard"
-msgstr "VCard"
-
-#: ../../Zotlabs/Module/Blocks.php:154 ../../include/text.php:2283
-msgid "Blocks"
-msgstr "Blöcke"
-
-#: ../../Zotlabs/Module/Blocks.php:156
-msgid "Block Title"
-msgstr "Titel des Blocks"
-
-#: ../../Zotlabs/Module/Layouts.php:183 ../../include/text.php:2285
-msgid "Layouts"
-msgstr "Layouts"
-
-#: ../../Zotlabs/Module/Layouts.php:185 ../../Zotlabs/Lib/Apps.php:232
-#: ../../include/nav.php:174 ../../include/help.php:53
-#: ../../include/help.php:59
-msgid "Help"
-msgstr "Hilfe"
-
-#: ../../Zotlabs/Module/Layouts.php:185
-msgid "Comanche page description language help"
-msgstr "Hilfe zur Comanche-Seitenbeschreibungssprache"
-
-#: ../../Zotlabs/Module/Layouts.php:189
-msgid "Layout Description"
-msgstr "Layout-Beschreibung"
-
-#: ../../Zotlabs/Module/Layouts.php:194
-msgid "Download PDL file"
-msgstr "PDL-Datei herunterladen"
-
-#: ../../Zotlabs/Module/Rate.php:156
-msgid "Website:"
-msgstr "Webseite:"
+msgid "%1$s agrees with %2$s's %3$s"
+msgstr "%1$s stimmt %2$ss %3$s zu"
-#: ../../Zotlabs/Module/Rate.php:159
+#: ../../Zotlabs/Module/Like.php:425
#, php-format
-msgid "Remote Channel [%s] (not yet known on this site)"
-msgstr "Kanal [%s] (auf diesem Server noch unbekannt)"
-
-#: ../../Zotlabs/Module/Rate.php:160
-msgid "Rating (this information is public)"
-msgstr "Bewertung (öffentlich sichtbar)"
-
-#: ../../Zotlabs/Module/Rate.php:161
-msgid "Optionally explain your rating (this information is public)"
-msgstr "Optional kannst du deine Bewertung erklären (öffentlich sichtbar)"
-
-#: ../../Zotlabs/Module/Profile_photo.php:190
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:295
-msgid ""
-"Shift-reload the page or clear browser cache if the new photo does not "
-"display immediately."
-msgstr "Leere den Browser Cache oder nutze Umschalten-Neu Laden, falls das neue Foto nicht sofort angezeigt wird."
-
-#: ../../Zotlabs/Module/Profile_photo.php:411
-msgid "Use Photo for Profile"
-msgstr "Foto für Profil verwenden"
-
-#: ../../Zotlabs/Module/Profile_photo.php:411
-msgid "Upload Profile Photo"
-msgstr "Lade neues Profilfoto hoch"
-
-#: ../../Zotlabs/Module/Profile_photo.php:412
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:182
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:194
-msgid "Use"
-msgstr "Verwenden"
-
-#: ../../Zotlabs/Module/Events.php:25
-msgid "Calendar entries imported."
-msgstr "Kalendereinträge wurden importiert."
-
-#: ../../Zotlabs/Module/Events.php:27
-msgid "No calendar entries found."
-msgstr "Keine Kalendereinträge gefunden."
-
-#: ../../Zotlabs/Module/Events.php:110
-msgid "Event can not end before it has started."
-msgstr "Termin-Ende liegt vor dem Beginn."
-
-#: ../../Zotlabs/Module/Events.php:112 ../../Zotlabs/Module/Events.php:121
-#: ../../Zotlabs/Module/Events.php:143
-msgid "Unable to generate preview."
-msgstr "Vorschau konnte nicht erzeugt werden."
-
-#: ../../Zotlabs/Module/Events.php:119
-msgid "Event title and start time are required."
-msgstr "Titel und Startzeit des Termins sind erforderlich."
-
-#: ../../Zotlabs/Module/Events.php:141 ../../Zotlabs/Module/Events.php:265
-msgid "Event not found."
-msgstr "Termin nicht gefunden."
-
-#: ../../Zotlabs/Module/Events.php:460
-msgid "Edit event title"
-msgstr "Termintitel bearbeiten"
-
-#: ../../Zotlabs/Module/Events.php:460
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:835
-msgid "Event title"
-msgstr "Termintitel"
-
-#: ../../Zotlabs/Module/Events.php:462
-msgid "Categories (comma-separated list)"
-msgstr "Kategorien (Kommagetrennte Liste)"
-
-#: ../../Zotlabs/Module/Events.php:463
-msgid "Edit Category"
-msgstr "Kategorie bearbeiten"
-
-#: ../../Zotlabs/Module/Events.php:463
-msgid "Category"
-msgstr "Kategorie"
-
-#: ../../Zotlabs/Module/Events.php:466
-msgid "Edit start date and time"
-msgstr "Startdatum und -zeit bearbeiten"
-
-#: ../../Zotlabs/Module/Events.php:466
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:836
-msgid "Start date and time"
-msgstr "Startdatum und -zeit"
-
-#: ../../Zotlabs/Module/Events.php:467 ../../Zotlabs/Module/Events.php:470
-msgid "Finish date and time are not known or not relevant"
-msgstr "Enddatum und -zeit sind unbekannt oder irrelevant"
-
-#: ../../Zotlabs/Module/Events.php:469
-msgid "Edit finish date and time"
-msgstr "Enddatum und -zeit bearbeiten"
-
-#: ../../Zotlabs/Module/Events.php:469
-msgid "Finish date and time"
-msgstr "Enddatum und -zeit"
-
-#: ../../Zotlabs/Module/Events.php:471 ../../Zotlabs/Module/Events.php:472
-msgid "Adjust for viewer timezone"
-msgstr "An die Zeitzone des Betrachters anpassen"
-
-#: ../../Zotlabs/Module/Events.php:471
-msgid ""
-"Important for events that happen in a particular place. Not practical for "
-"global holidays."
-msgstr "Wichtig für Veranstaltungen die an bestimmten Orten stattfinden. Nicht sinnvoll für globale Feiertage / Ferien."
-
-#: ../../Zotlabs/Module/Events.php:473
-msgid "Edit Description"
-msgstr "Beschreibung bearbeiten"
-
-#: ../../Zotlabs/Module/Events.php:475
-msgid "Edit Location"
-msgstr "Ort bearbeiten"
-
-#: ../../Zotlabs/Module/Events.php:479 ../../include/conversation.php:1410
-msgid "Permission settings"
-msgstr "Berechtigungs-Einstellungen"
-
-#: ../../Zotlabs/Module/Events.php:489
-msgid "Timezone:"
-msgstr "Zeitzone:"
-
-#: ../../Zotlabs/Module/Events.php:494
-msgid "Advanced Options"
-msgstr "Weitere Optionen"
-
-#: ../../Zotlabs/Module/Events.php:633
-msgid "Edit event"
-msgstr "Termin bearbeiten"
-
-#: ../../Zotlabs/Module/Events.php:635
-msgid "Delete event"
-msgstr "Termin löschen"
-
-#: ../../Zotlabs/Module/Events.php:669
-msgid "calendar"
-msgstr "Kalender"
-
-#: ../../Zotlabs/Module/Events.php:695
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:849
-msgid "Month"
-msgstr "Monat"
-
-#: ../../Zotlabs/Module/Events.php:696
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:850
-msgid "Week"
-msgstr "Woche"
-
-#: ../../Zotlabs/Module/Events.php:697
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:851
-msgid "Day"
-msgstr "Tag"
-
-#: ../../Zotlabs/Module/Events.php:731
-msgid "Event removed"
-msgstr "Termin gelöscht"
-
-#: ../../Zotlabs/Module/Events.php:734
-msgid "Failed to remove event"
-msgstr "Termin konnte nicht gelöscht werden"
-
-#: ../../Zotlabs/Module/Common.php:14
-msgid "No channel."
-msgstr "Kein Kanal."
-
-#: ../../Zotlabs/Module/Common.php:43
-msgid "Common connections"
-msgstr "Gemeinsame Verbindungen"
-
-#: ../../Zotlabs/Module/Common.php:48
-msgid "No connections in common."
-msgstr "Keine gemeinsamen Verbindungen."
-
-#: ../../Zotlabs/Module/Chanview.php:134
-msgid "toggle full screen mode"
-msgstr "auf Vollbildmodus umschalten"
-
-#: ../../Zotlabs/Module/Profperm.php:34 ../../Zotlabs/Module/Profperm.php:63
-msgid "Invalid profile identifier."
-msgstr "Ungültiger Profil-Identifikator"
-
-#: ../../Zotlabs/Module/Profperm.php:111
-msgid "Profile Visibility Editor"
-msgstr "Profil-Sichtbarkeits-Editor"
-
-#: ../../Zotlabs/Module/Profperm.php:113 ../../include/channel.php:1367
-msgid "Profile"
-msgstr "Profil"
-
-#: ../../Zotlabs/Module/Profperm.php:115
-msgid "Click on a contact to add or remove."
-msgstr "Klicke auf einen Kontakt, um ihn hinzuzufügen oder zu entfernen."
-
-#: ../../Zotlabs/Module/Profperm.php:124
-msgid "Visible To"
-msgstr "Sichtbar für"
-
-#: ../../Zotlabs/Module/Channel.php:32 ../../Zotlabs/Module/Chat.php:25
-#: ../../extend/addon/addon/chess/chess.php:400
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:26
-msgid "You must be logged in to see this page."
-msgstr "Du musst angemeldet sein, um diese Seite betrachten zu können."
-
-#: ../../Zotlabs/Module/Channel.php:44
-msgid "Posts and comments"
-msgstr "Beiträge und Kommentare"
-
-#: ../../Zotlabs/Module/Channel.php:45
-msgid "Only posts"
-msgstr "Nur Beiträge"
-
-#: ../../Zotlabs/Module/Channel.php:104
-msgid "Insufficient permissions. Request redirected to profile page."
-msgstr "Unzureichende Zugriffsrechte. Die Anfrage wurde zur Profil-Seite umgeleitet."
-
-#: ../../Zotlabs/Module/Lostpass.php:19
-msgid "No valid account found."
-msgstr "Kein gültiges Konto gefunden."
-
-#: ../../Zotlabs/Module/Lostpass.php:33
-msgid "Password reset request issued. Check your email."
-msgstr "Zurücksetzen des Passworts eingeleitet. Schau in Deine E-Mails."
+msgid "%1$s doesn't agree with %2$s's %3$s"
+msgstr "%1$s lehnt %2$ss %3$s ab"
-#: ../../Zotlabs/Module/Lostpass.php:39 ../../Zotlabs/Module/Lostpass.php:108
+#: ../../Zotlabs/Module/Like.php:427
#, php-format
-msgid "Site Member (%s)"
-msgstr "Nutzer (%s)"
+msgid "%1$s abstains from a decision on %2$s's %3$s"
+msgstr "%1$s enthält sich zu %2$ss %3$s"
-#: ../../Zotlabs/Module/Lostpass.php:44 ../../Zotlabs/Module/Lostpass.php:49
+#: ../../Zotlabs/Module/Like.php:429
#, php-format
-msgid "Password reset requested at %s"
-msgstr "Passwort-Rücksetzung auf %s angefordert"
-
-#: ../../Zotlabs/Module/Lostpass.php:68
-msgid ""
-"Request could not be verified. (You may have previously submitted it.) "
-"Password reset failed."
-msgstr "Die Anfrage konnte nicht verifiziert werden. (Vielleicht hast Du schon einmal auf den Link in der E-Mail geklickt?) Passwort-Rücksetzung fehlgeschlagen."
-
-#: ../../Zotlabs/Module/Lostpass.php:91 ../../boot.php:1740
-msgid "Password Reset"
-msgstr "Zurücksetzen des Kennworts"
-
-#: ../../Zotlabs/Module/Lostpass.php:92
-msgid "Your password has been reset as requested."
-msgstr "Dein Passwort wurde wie angefordert neu erstellt."
-
-#: ../../Zotlabs/Module/Lostpass.php:93
-msgid "Your new password is"
-msgstr "Dein neues Passwort lautet"
-
-#: ../../Zotlabs/Module/Lostpass.php:94
-msgid "Save or copy your new password - and then"
-msgstr "Speichere oder kopiere Dein neues Passwort – und dann"
-
-#: ../../Zotlabs/Module/Lostpass.php:95
-msgid "click here to login"
-msgstr "Klicke hier, um dich anzumelden"
-
-#: ../../Zotlabs/Module/Lostpass.php:96
-msgid ""
-"Your password may be changed from the <em>Settings</em> page after "
-"successful login."
-msgstr "Dein Passwort kann unter <em>Einstellungen</em> nach einer erfolgreichen Anmeldung geändert werden."
+msgid "%1$s is attending %2$s's %3$s"
+msgstr "%1$s nimmt an %2$ss %3$s teil"
-#: ../../Zotlabs/Module/Lostpass.php:117
+#: ../../Zotlabs/Module/Like.php:431
#, php-format
-msgid "Your password has changed at %s"
-msgstr "Auf %s wurde Dein Passwort geändert"
-
-#: ../../Zotlabs/Module/Lostpass.php:130
-msgid "Forgot your Password?"
-msgstr "Kennwort vergessen?"
-
-#: ../../Zotlabs/Module/Lostpass.php:131
-msgid ""
-"Enter your email address and submit to have your password reset. Then check "
-"your email for further instructions."
-msgstr "Gib Deine E-Mail-Adresse ein, um Dein Passwort zurücksetzen zu lassen. Du erhältst dann weitere Anweisungen per E-Mail."
-
-#: ../../Zotlabs/Module/Lostpass.php:132
-msgid "Email Address"
-msgstr "E-Mail Adresse"
-
-#: ../../Zotlabs/Module/Lostpass.php:133
-msgid "Reset"
-msgstr "Zurücksetzen"
-
-#: ../../Zotlabs/Module/Rbmark.php:94
-msgid "Select a bookmark folder"
-msgstr "Lesezeichenordner wählen"
-
-#: ../../Zotlabs/Module/Rbmark.php:99
-msgid "Save Bookmark"
-msgstr "Lesezeichen speichern"
-
-#: ../../Zotlabs/Module/Rbmark.php:100
-msgid "URL of bookmark"
-msgstr "URL des Lesezeichens"
-
-#: ../../Zotlabs/Module/Rbmark.php:105
-msgid "Or enter new bookmark folder name"
-msgstr "Oder gib einen neuen Namen für den Lesezeichenordner ein"
-
-#: ../../Zotlabs/Module/Follow.php:31
-msgid "Channel added."
-msgstr "Kanal hinzugefügt."
-
-#: ../../Zotlabs/Module/Rmagic.php:35
-msgid "Authentication failed."
-msgstr "Authentifizierung fehlgeschlagen."
-
-#: ../../Zotlabs/Module/Rmagic.php:75 ../../include/channel.php:1991
-msgid "Remote Authentication"
-msgstr "Entfernte Authentifizierung"
-
-#: ../../Zotlabs/Module/Rmagic.php:76 ../../include/channel.php:1992
-msgid "Enter your channel address (e.g. channel@example.com)"
-msgstr "Deine Kanal-Adresse (z. B. channel@example.com)"
-
-#: ../../Zotlabs/Module/Rmagic.php:77 ../../include/channel.php:1993
-msgid "Authenticate"
-msgstr "Authentifizieren"
-
-#: ../../Zotlabs/Module/Regmod.php:15
-msgid "Please login."
-msgstr "Bitte melde dich an."
-
-#: ../../Zotlabs/Module/Removeaccount.php:35
-msgid ""
-"Account removals are not allowed within 48 hours of changing the account "
-"password."
-msgstr "Das Löschen von Konten innerhalb 48 Stunden nachdem deren Passwort geändert wurde ist nicht erlaubt."
-
-#: ../../Zotlabs/Module/Removeaccount.php:57
-msgid "Remove This Account"
-msgstr "Dieses Konto löschen"
-
-#: ../../Zotlabs/Module/Removeaccount.php:58
-#: ../../Zotlabs/Module/Removeme.php:61
-msgid "WARNING: "
-msgstr "WARNUNG: "
-
-#: ../../Zotlabs/Module/Removeaccount.php:58
-msgid ""
-"This account and all its channels will be completely removed from the "
-"network. "
-msgstr "Dieses Konto mit all seinen Kanälen wird vollständig aus dem Netzwerk gelöscht."
-
-#: ../../Zotlabs/Module/Removeaccount.php:58
-#: ../../Zotlabs/Module/Removeme.php:61
-msgid "This action is permanent and can not be undone!"
-msgstr "Dieser Schritt ist endgültig und kann nicht rückgängig gemacht werden!"
-
-#: ../../Zotlabs/Module/Removeaccount.php:59
-#: ../../Zotlabs/Module/Removeme.php:62
-msgid "Please enter your password for verification:"
-msgstr "Bitte gib zur Bestätigung Dein Passwort ein:"
-
-#: ../../Zotlabs/Module/Removeaccount.php:60
-msgid ""
-"Remove this account, all its channels and all its channel clones from the "
-"network"
-msgstr "Dieses Konto, all seine Kanäle sowie alle Kanal-Klone aus dem Netzwerk löschen"
-
-#: ../../Zotlabs/Module/Removeaccount.php:60
-msgid ""
-"By default only the instances of the channels located on this hub will be "
-"removed from the network"
-msgstr "Standardmäßig werden nur die Kanalklone auf diesem $Projectname-Hub aus dem Netzwerk entfernt"
-
-#: ../../Zotlabs/Module/Removeaccount.php:61
-#: ../../Zotlabs/Module/Settings/Account.php:120
-msgid "Remove Account"
-msgstr "Konto entfernen"
-
-#: ../../Zotlabs/Module/Pdledit.php:21
-msgid "Layout updated."
-msgstr "Layout aktualisiert."
-
-#: ../../Zotlabs/Module/Pdledit.php:34 ../../Zotlabs/Module/Chat.php:218
-msgid "Feature disabled."
-msgstr "Funktion deaktiviert."
-
-#: ../../Zotlabs/Module/Pdledit.php:42 ../../Zotlabs/Module/Pdledit.php:69
-msgid "Edit System Page Description"
-msgstr "Systemseitenbeschreibung bearbeiten"
-
-#: ../../Zotlabs/Module/Pdledit.php:64
-msgid "Layout not found."
-msgstr "Layout nicht gefunden."
-
-#: ../../Zotlabs/Module/Pdledit.php:70
-msgid "Module Name:"
-msgstr "Modulname:"
-
-#: ../../Zotlabs/Module/Pdledit.php:71
-msgid "Layout Help"
-msgstr "Layout-Hilfe"
-
-#: ../../Zotlabs/Module/Uexport.php:57 ../../Zotlabs/Module/Uexport.php:58
-msgid "Export Channel"
-msgstr "Kanal exportieren"
-
-#: ../../Zotlabs/Module/Uexport.php:59
-msgid ""
-"Export your basic channel information to a file. This acts as a backup of "
-"your connections, permissions, profile and basic data, which can be used to "
-"import your data to a new server hub, but does not contain your content."
-msgstr "Exportiert die grundlegenden Kanal-Informationen in eine kleine Datei. Diese stellt eine Sicherung Deiner Verbindungen, Berechtigungen, Profile und Basisdaten bereit, die für den Import auf einem anderen Hub verwendet werden kann, aber nicht die Beiträge Deines Kanals enthält."
-
-#: ../../Zotlabs/Module/Uexport.php:60
-msgid "Export Content"
-msgstr "Kanal und Inhalte exportieren"
-
-#: ../../Zotlabs/Module/Uexport.php:61
-msgid ""
-"Export your channel information and recent content to a JSON backup that can"
-" be restored or imported to another server hub. This backs up all of your "
-"connections, permissions, profile data and several months of posts. This "
-"file may be VERY large. Please be patient - it may take several minutes for"
-" this download to begin."
-msgstr "Exportiert Deine Kanal-Informationen sowie alle zugehörigen Inhalte in eine JSON-Sicherungsdatei. Die sichert alle Verbindungen, Berechtigungen, Profildaten und Deine Beiträge aus mehreren Monaten. Diese Datei kann SEHR groß werden! Bitte habe ein wenig Geduld – es kann mehrere Minuten dauern, bis der Download startet."
-
-#: ../../Zotlabs/Module/Uexport.php:63
-msgid "Export your posts from a given year."
-msgstr "Exportiert die Beiträge des angegebenen Jahres."
-
-#: ../../Zotlabs/Module/Uexport.php:65
-msgid ""
-"You may also export your posts and conversations for a particular year or "
-"month. Adjust the date in your browser location bar to select other dates. "
-"If the export fails (possibly due to memory exhaustion on your server hub), "
-"please try again selecting a more limited date range."
-msgstr "Du kannst auch die Beiträge und Konversationen eines bestimmten Jahres oder Monats exportieren. Ändere das Datum in der Adresszeile Deines Browsers, um andere Zeiträume zu wählen. Falls der Export fehlschlägt (vermutlich, weil auf diesem Hub nicht genügend Speicher zur Verfügung steht), versuche es noch einmal mit einer kleineren Zeitspanne."
+msgid "%1$s is not attending %2$s's %3$s"
+msgstr "%1$s nimmt an %2$ss %3$s nicht teil"
-#: ../../Zotlabs/Module/Uexport.php:66
+#: ../../Zotlabs/Module/Like.php:433
#, php-format
-msgid ""
-"To select all posts for a given year, such as this year, visit <a "
-"href=\"%1$s\">%2$s</a>"
-msgstr "Um alle Beiträge eines bestimmten Jahres, zum Beispiel dieses Jahres, auszuwählen, klicke <a href=\"%1$s\">%2$s</a>."
+msgid "%1$s may attend %2$s's %3$s"
+msgstr "%1$s nimmt vielleicht an %2$ss %3$s teil"
-#: ../../Zotlabs/Module/Uexport.php:67
-#, php-format
-msgid ""
-"To select all posts for a given month, such as January of this year, visit "
-"<a href=\"%1$s\">%2$s</a>"
-msgstr "Um alle Beiträge eines bestimmten Monats auszuwählen, zum Beispiel vom Januar diesen Jahres, klicke <a href=\"%1$s\">%2$s</a>."
+#: ../../Zotlabs/Module/Like.php:538
+msgid "Action completed."
+msgstr "Aktion durchgeführt."
-#: ../../Zotlabs/Module/Uexport.php:68
-#, php-format
-msgid ""
-"These content files may be imported or restored by visiting <a "
-"href=\"%1$s\">%2$s</a> on any site containing your channel. For best results"
-" please import or restore these in date order (oldest first)."
-msgstr "Diese Inhalts-Sicherungen können wiederhergestellt werden, indem Du <a href=\"%1$s\">%2$s</a> auf jeglichem Hub besuchst, der diesen Kanal enthält. Das funktioniert am besten, wenn Du dabei die zeitliche Reihenfolge einhältst, also die Sicherungen für den ältesten Zeitraum zuerst importierst."
+#: ../../Zotlabs/Module/Like.php:539
+msgid "Thank you."
+msgstr "Vielen Dank."
-#: ../../Zotlabs/Module/Directory.php:246
+#: ../../Zotlabs/Module/Directory.php:245
#, php-format
msgid "%d rating"
msgid_plural "%d ratings"
msgstr[0] "%d Bewertung"
msgstr[1] "%d Bewertungen"
-#: ../../Zotlabs/Module/Directory.php:257
+#: ../../Zotlabs/Module/Directory.php:256
msgid "Gender: "
msgstr "Geschlecht:"
-#: ../../Zotlabs/Module/Directory.php:259
+#: ../../Zotlabs/Module/Directory.php:258
msgid "Status: "
msgstr "Status:"
-#: ../../Zotlabs/Module/Directory.php:261
+#: ../../Zotlabs/Module/Directory.php:260
msgid "Homepage: "
msgstr "Webseite:"
-#: ../../Zotlabs/Module/Directory.php:310 ../../include/channel.php:1298
+#: ../../Zotlabs/Module/Directory.php:309 ../../include/channel.php:1293
msgid "Age:"
msgstr "Alter:"
-#: ../../Zotlabs/Module/Directory.php:315 ../../include/markdown.php:561
+#: ../../Zotlabs/Module/Directory.php:314 ../../include/markdown.php:560
#: ../../include/channel.php:1134 ../../include/event.php:52
#: ../../include/event.php:84
msgid "Location:"
msgstr "Ort:"
-#: ../../Zotlabs/Module/Directory.php:321
+#: ../../Zotlabs/Module/Directory.php:320
msgid "Description:"
msgstr "Beschreibung:"
-#: ../../Zotlabs/Module/Directory.php:326 ../../include/channel.php:1314
+#: ../../Zotlabs/Module/Directory.php:325 ../../include/channel.php:1309
msgid "Hometown:"
msgstr "Heimatstadt:"
-#: ../../Zotlabs/Module/Directory.php:328 ../../include/channel.php:1322
+#: ../../Zotlabs/Module/Directory.php:327 ../../include/channel.php:1317
msgid "About:"
msgstr "Ãœber:"
-#: ../../Zotlabs/Module/Directory.php:329 ../../Zotlabs/Module/Suggest.php:56
-#: ../../include/connections.php:110 ../../include/conversation.php:938
-#: ../../include/conversation.php:1069 ../../include/widgets.php:148
-#: ../../include/widgets.php:185 ../../include/channel.php:1119
+#: ../../Zotlabs/Module/Directory.php:328 ../../Zotlabs/Module/Suggest.php:54
+#: ../../Zotlabs/Widget/Follow.php:32 ../../Zotlabs/Widget/Suggestions.php:44
+#: ../../include/conversation.php:1002 ../../include/channel.php:1119
+#: ../../include/connections.php:110
msgid "Connect"
msgstr "Verbinden"
-#: ../../Zotlabs/Module/Directory.php:330
+#: ../../Zotlabs/Module/Directory.php:329
msgid "Public Forum:"
msgstr "Öffentliches Forum:"
-#: ../../Zotlabs/Module/Directory.php:333
+#: ../../Zotlabs/Module/Directory.php:332
msgid "Keywords: "
msgstr "Schlüsselwörter:"
-#: ../../Zotlabs/Module/Directory.php:336
+#: ../../Zotlabs/Module/Directory.php:335
msgid "Don't suggest"
msgstr "Nicht vorschlagen"
-#: ../../Zotlabs/Module/Directory.php:338
+#: ../../Zotlabs/Module/Directory.php:337
msgid "Common connections:"
msgstr "Gemeinsame Verbindungen:"
-#: ../../Zotlabs/Module/Directory.php:387
+#: ../../Zotlabs/Module/Directory.php:386
msgid "Global Directory"
msgstr "Globales Verzeichnis"
-#: ../../Zotlabs/Module/Directory.php:387
+#: ../../Zotlabs/Module/Directory.php:386
msgid "Local Directory"
msgstr "Lokales Verzeichnis"
-#: ../../Zotlabs/Module/Directory.php:393
+#: ../../Zotlabs/Module/Directory.php:392
msgid "Finding:"
msgstr "Ergebnisse:"
-#: ../../Zotlabs/Module/Directory.php:396 ../../Zotlabs/Module/Suggest.php:64
+#: ../../Zotlabs/Module/Directory.php:395 ../../Zotlabs/Module/Suggest.php:62
#: ../../include/contact_widgets.php:24
msgid "Channel Suggestions"
msgstr "Kanal-Vorschläge"
-#: ../../Zotlabs/Module/Directory.php:398
+#: ../../Zotlabs/Module/Directory.php:397
msgid "next page"
msgstr "nächste Seite"
-#: ../../Zotlabs/Module/Directory.php:398
+#: ../../Zotlabs/Module/Directory.php:397
msgid "previous page"
msgstr "vorherige Seite"
-#: ../../Zotlabs/Module/Directory.php:399
+#: ../../Zotlabs/Module/Directory.php:398
msgid "Sort options"
msgstr "Sortieroptionen"
-#: ../../Zotlabs/Module/Directory.php:400
+#: ../../Zotlabs/Module/Directory.php:399
msgid "Alphabetic"
msgstr "alphabetisch"
-#: ../../Zotlabs/Module/Directory.php:401
+#: ../../Zotlabs/Module/Directory.php:400
msgid "Reverse Alphabetic"
msgstr "Entgegengesetzt alphabetisch"
-#: ../../Zotlabs/Module/Directory.php:402
+#: ../../Zotlabs/Module/Directory.php:401
msgid "Newest to Oldest"
msgstr "Neueste zuerst"
-#: ../../Zotlabs/Module/Directory.php:403
+#: ../../Zotlabs/Module/Directory.php:402
msgid "Oldest to Newest"
msgstr "Älteste zuerst"
-#: ../../Zotlabs/Module/Directory.php:420
+#: ../../Zotlabs/Module/Directory.php:419
msgid "No entries (some entries may be hidden)."
msgstr "Keine Einträge gefunden (einige könnten versteckt sein)."
-#: ../../Zotlabs/Module/Chatsvc.php:131
-msgid "Away"
-msgstr "Abwesend"
-
-#: ../../Zotlabs/Module/Chatsvc.php:136
-msgid "Online"
-msgstr "Online"
-
-#: ../../Zotlabs/Module/Service_limits.php:23
-msgid "No service class restrictions found."
-msgstr "Keine Dienstklassenbeschränkungen gefunden."
-
-#: ../../Zotlabs/Module/Webpages.php:52
-msgid "Import Webpage Elements"
-msgstr "Webseitenelemente importieren"
-
-#: ../../Zotlabs/Module/Webpages.php:53
-msgid "Import selected"
-msgstr "Import ausgewählt"
-
-#: ../../Zotlabs/Module/Webpages.php:76
-msgid "Export Webpage Elements"
-msgstr "Webseitenelemente exportieren"
-
-#: ../../Zotlabs/Module/Webpages.php:77
-msgid "Export selected"
-msgstr "Exportieren ausgewählt"
-
-#: ../../Zotlabs/Module/Webpages.php:241 ../../Zotlabs/Lib/Apps.php:225
-#: ../../include/conversation.php:1889
-msgid "Webpages"
-msgstr "Webseiten"
-
-#: ../../Zotlabs/Module/Webpages.php:252 ../../include/page_widgets.php:44
-msgid "Actions"
-msgstr "Aktionen"
-
-#: ../../Zotlabs/Module/Webpages.php:253 ../../include/page_widgets.php:45
-msgid "Page Link"
-msgstr "Seiten-Link"
-
-#: ../../Zotlabs/Module/Webpages.php:254
-msgid "Page Title"
-msgstr "Seitentitel"
-
-#: ../../Zotlabs/Module/Webpages.php:284
-msgid "Invalid file type."
-msgstr "Ungültiger Dateityp."
-
-#: ../../Zotlabs/Module/Webpages.php:296
-msgid "Error opening zip file"
-msgstr "Fehler beim Öffnen der ZIP-Datei"
-
-#: ../../Zotlabs/Module/Webpages.php:307
-msgid "Invalid folder path."
-msgstr "Ungültiger Ordnerpfad."
-
-#: ../../Zotlabs/Module/Webpages.php:334
-msgid "No webpage elements detected."
-msgstr "Keine Webseitenelemente erkannt."
-
-#: ../../Zotlabs/Module/Webpages.php:409
-msgid "Import complete."
-msgstr "Import abgeschlossen."
-
-#: ../../Zotlabs/Module/Removeme.php:35
-msgid ""
-"Channel removals are not allowed within 48 hours of changing the account "
-"password."
-msgstr "Innerhalb von 48 Stunden nach einer Änderung des Passworts können keine Kanäle gelöscht werden."
-
-#: ../../Zotlabs/Module/Removeme.php:60
-msgid "Remove This Channel"
-msgstr "Diesen Kanal löschen"
-
-#: ../../Zotlabs/Module/Removeme.php:61
-msgid "This channel will be completely removed from the network. "
-msgstr "Dieser Kanal wird vollständig aus dem Netzwerk gelöscht."
-
-#: ../../Zotlabs/Module/Removeme.php:63
-msgid "Remove this channel and all its clones from the network"
-msgstr "Lösche diesen Kanal und all seine Klone aus dem Netzwerk"
-
-#: ../../Zotlabs/Module/Removeme.php:63
-msgid ""
-"By default only the instance of the channel located on this hub will be "
-"removed from the network"
-msgstr "Standardmäßig wird der Kanal nur auf diesem Server gelöscht, seine Klone verbleiben im Netzwerk"
-
-#: ../../Zotlabs/Module/Removeme.php:64
-#: ../../Zotlabs/Module/Settings/Channel.php:575
-msgid "Remove Channel"
-msgstr "Kanal löschen"
-
-#: ../../Zotlabs/Module/Sharedwithme.php:98
-msgid "Files: shared with me"
-msgstr "Dateien, die mit mir geteilt wurden"
-
-#: ../../Zotlabs/Module/Sharedwithme.php:100
-msgid "NEW"
-msgstr "NEU"
-
-#: ../../Zotlabs/Module/Sharedwithme.php:103
-msgid "Remove all files"
-msgstr "Alle Dateien löschen"
-
-#: ../../Zotlabs/Module/Sharedwithme.php:104
-msgid "Remove this file"
-msgstr "Diese Datei löschen"
-
-#: ../../Zotlabs/Module/Wiki.php:29
-msgid "Profile Unavailable."
-msgstr "Profil nicht verfügbar."
-
-#: ../../Zotlabs/Module/Wiki.php:43
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:40
-msgid "Not found"
-msgstr "Nicht gefunden"
-
-#: ../../Zotlabs/Module/Wiki.php:67
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:60
-msgid "Invalid channel"
-msgstr "Ungültiger Kanal"
-
-#: ../../Zotlabs/Module/Wiki.php:158
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:144
-#: ../../include/conversation.php:1900
-msgid "Wikis"
-msgstr "Wikis"
-
-#: ../../Zotlabs/Module/Wiki.php:164
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:150
-msgid "Download"
-msgstr "Herunterladen"
-
-#: ../../Zotlabs/Module/Wiki.php:168
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:154
-msgid "Wiki name"
-msgstr "Name des Wiki"
-
-#: ../../Zotlabs/Module/Wiki.php:169
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:155
-msgid "Content type"
-msgstr "Inhaltstyp"
-
-#: ../../Zotlabs/Module/Wiki.php:178
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:164
-msgid "Create a status post for this wiki"
-msgstr "Erzeuge einen Statusbeitrag für dieses Wiki"
-
-#: ../../Zotlabs/Module/Wiki.php:203
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:183
-msgid "Wiki not found"
-msgstr "Wiki nicht gefunden"
-
-#: ../../Zotlabs/Module/Wiki.php:227
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:208
-msgid "Rename page"
-msgstr "Seite umbenennen"
-
-#: ../../Zotlabs/Module/Wiki.php:231
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:212
-msgid "Error retrieving page content"
-msgstr "Fehler beim Abrufen des Seiteninhalts"
-
-#: ../../Zotlabs/Module/Wiki.php:261
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:241
-msgid "Revision Comparison"
-msgstr "Revisionsvergleich"
-
-#: ../../Zotlabs/Module/Wiki.php:262
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:242
-msgid "Revert"
-msgstr "Rückgängig machen"
-
-#: ../../Zotlabs/Module/Wiki.php:266
-msgid "Short description of your changes (optional)"
-msgstr "Kurze Beschreibung Ihrer Änderungen (optional)"
-
-#: ../../Zotlabs/Module/Wiki.php:273
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:251
-msgid "Source"
-msgstr "Quelle"
-
-#: ../../Zotlabs/Module/Wiki.php:281
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:259
-msgid "New page name"
-msgstr "Neuer Seitenname"
-
-#: ../../Zotlabs/Module/Wiki.php:286
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:264
-#: ../../include/conversation.php:1299
-msgid "Embed image from photo albums"
-msgstr "Bild aus Fotoalben einbetten"
-
-#: ../../Zotlabs/Module/Wiki.php:287
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:265
-#: ../../include/conversation.php:1393
-msgid "Embed an image from your albums"
-msgstr "Betten Sie ein Bild aus Ihren Alben ein"
-
-#: ../../Zotlabs/Module/Wiki.php:289
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:267
-#: ../../include/conversation.php:1395 ../../include/conversation.php:1442
-msgid "OK"
-msgstr "Ok"
-
-#: ../../Zotlabs/Module/Wiki.php:290
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:268
-#: ../../include/conversation.php:1335
-msgid "Choose images to embed"
-msgstr "Wählen Sie Bilder zum Einbetten aus"
-
-#: ../../Zotlabs/Module/Wiki.php:291
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:269
-#: ../../include/conversation.php:1336
-msgid "Choose an album"
-msgstr "Wählen Sie ein Album aus"
-
-#: ../../Zotlabs/Module/Wiki.php:292
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:270
-msgid "Choose a different album"
-msgstr "Wählen Sie ein anderes Album aus"
-
-#: ../../Zotlabs/Module/Wiki.php:293
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:271
-#: ../../include/conversation.php:1338
-msgid "Error getting album list"
-msgstr "Fehler beim Holen der Albenliste"
-
-#: ../../Zotlabs/Module/Wiki.php:294
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:272
-#: ../../include/conversation.php:1339
-msgid "Error getting photo link"
-msgstr "Fehler beim Holen des Fotolinks"
-
-#: ../../Zotlabs/Module/Wiki.php:295
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:273
-#: ../../include/conversation.php:1340
-msgid "Error getting album"
-msgstr "Fehler beim Holen des Albums"
-
-#: ../../Zotlabs/Module/Wiki.php:364
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:337
-msgid "Error creating wiki. Invalid name."
-msgstr "Fehler beim Erstellen des Wiki. Ungültiger Name."
-
-#: ../../Zotlabs/Module/Wiki.php:376
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:348
-msgid "Wiki created, but error creating Home page."
-msgstr "Das Wiki wurde erzeugt, aber es gab einen Fehler bei der Erstellung der Startseite"
-
-#: ../../Zotlabs/Module/Wiki.php:383
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:353
-msgid "Error creating wiki"
-msgstr "Fehler beim Erstellen des Wiki"
-
-#: ../../Zotlabs/Module/Wiki.php:395
-msgid "Wiki delete permission denied."
-msgstr "Wiki-Löschberechtigung verweigert."
-
-#: ../../Zotlabs/Module/Wiki.php:405
-msgid "Error deleting wiki"
-msgstr "Fehler beim Löschen des Wiki"
-
-#: ../../Zotlabs/Module/Wiki.php:431
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:400
-msgid "New page created"
-msgstr "Neue Seite erstellt"
-
-#: ../../Zotlabs/Module/Wiki.php:546
-msgid "Cannot delete Home"
-msgstr "Kann die Startseite nicht löschen"
-
-#: ../../Zotlabs/Module/Wiki.php:610
-msgid "Current Revision"
-msgstr "Aktuelle Revision"
-
-#: ../../Zotlabs/Module/Wiki.php:610
-msgid "Selected Revision"
-msgstr "Ausgewählte Revision"
-
-#: ../../Zotlabs/Module/Wiki.php:660
-msgid "You must be authenticated."
-msgstr "Sie müssen authenzifiziert sein."
-
-#: ../../Zotlabs/Module/Sources.php:37
-msgid "Failed to create source. No channel selected."
-msgstr "Konnte die Quelle nicht anlegen. Kein Kanal ausgewählt."
-
-#: ../../Zotlabs/Module/Sources.php:51
-msgid "Source created."
-msgstr "Quelle erstellt."
-
-#: ../../Zotlabs/Module/Sources.php:64
-msgid "Source updated."
-msgstr "Quelle aktualisiert."
-
-#: ../../Zotlabs/Module/Sources.php:90
-msgid "*"
-msgstr "*"
-
-#: ../../Zotlabs/Module/Sources.php:96 ../../include/widgets.php:691
-#: ../../include/features.php:213
-msgid "Channel Sources"
-msgstr "Kanal-Quellen"
-
-#: ../../Zotlabs/Module/Sources.php:97
-msgid "Manage remote sources of content for your channel."
-msgstr "Externe Inhaltsquellen für Deinen Kanal verwalten."
-
-#: ../../Zotlabs/Module/Sources.php:98 ../../Zotlabs/Module/Sources.php:108
-msgid "New Source"
-msgstr "Neue Quelle"
-
-#: ../../Zotlabs/Module/Sources.php:109 ../../Zotlabs/Module/Sources.php:143
-msgid ""
-"Import all or selected content from the following channel into this channel "
-"and distribute it according to your channel settings."
-msgstr "Importiere alle oder ausgewählte Inhalte des folgenden Kanals in diesen Kanal und verteile sie gemäß der Einstellungen dieses Kanals."
-
-#: ../../Zotlabs/Module/Sources.php:110 ../../Zotlabs/Module/Sources.php:144
-msgid "Only import content with these words (one per line)"
-msgstr "Importiere nur Beiträge, die folgende Wörter (eines pro Zeile) enthalten"
-
-#: ../../Zotlabs/Module/Sources.php:110 ../../Zotlabs/Module/Sources.php:144
-msgid "Leave blank to import all public content"
-msgstr "Leer lassen, um alle öffentlichen Beiträge zu importieren"
-
-#: ../../Zotlabs/Module/Sources.php:111 ../../Zotlabs/Module/Sources.php:148
-msgid "Channel Name"
-msgstr "Name des Kanals"
-
-#: ../../Zotlabs/Module/Sources.php:112 ../../Zotlabs/Module/Sources.php:147
-msgid ""
-"Add the following categories to posts imported from this source (comma "
-"separated)"
-msgstr "Füge die folgenden Kategorien zu Beiträgen, die aus dieser Quelle importiert werden, hinzu (kommagetrennt)"
-
-#: ../../Zotlabs/Module/Sources.php:112 ../../Zotlabs/Module/Sources.php:147
-#: ../../Zotlabs/Module/Settings/Oauth.php:93
-msgid "Optional"
-msgstr "Optional"
-
-#: ../../Zotlabs/Module/Sources.php:133 ../../Zotlabs/Module/Sources.php:161
-msgid "Source not found."
-msgstr "Quelle nicht gefunden."
-
-#: ../../Zotlabs/Module/Sources.php:140
-msgid "Edit Source"
-msgstr "Quelle bearbeiten"
-
-#: ../../Zotlabs/Module/Sources.php:141
-msgid "Delete Source"
-msgstr "Quelle löschen"
-
-#: ../../Zotlabs/Module/Sources.php:169
-msgid "Source removed"
-msgstr "Quelle gelöscht"
-
-#: ../../Zotlabs/Module/Sources.php:171
-msgid "Unable to remove source."
-msgstr "Konnte die Quelle nicht löschen."
-
-#: ../../Zotlabs/Module/Subthread.php:118
-#, php-format
-msgid "%1$s is following %2$s's %3$s"
-msgstr "%1$s folgt nun %2$ss %3$s"
+#: ../../Zotlabs/Module/Xchan.php:10
+msgid "Xchan Lookup"
+msgstr "Xchan-Suche"
-#: ../../Zotlabs/Module/Subthread.php:120
-#, php-format
-msgid "%1$s stopped following %2$s's %3$s"
-msgstr "%1$s folgt %2$ss %3$s nicht mehr"
+#: ../../Zotlabs/Module/Xchan.php:13
+msgid "Lookup xchan beginning with (or webbie): "
+msgstr "Nach xchans oder Webbies (Kanal-Adressen) suchen, die wie folgt beginnen:"
-#: ../../Zotlabs/Module/Suggest.php:39
+#: ../../Zotlabs/Module/Suggest.php:37
msgid ""
"No suggestions available. If this is a new site, please try again in 24 "
"hours."
msgstr "Keine Vorschläge vorhanden. Wenn das ein neuer Server ist, versuche es in 24 Stunden noch einmal."
-#: ../../Zotlabs/Module/Suggest.php:58 ../../include/widgets.php:150
+#: ../../Zotlabs/Module/Suggest.php:56 ../../Zotlabs/Widget/Suggestions.php:46
msgid "Ignore/Hide"
msgstr "Ignorieren/Verstecken"
-#: ../../Zotlabs/Module/Tagger.php:55 ../../include/bbcode.php:274
-msgid "post"
-msgstr "Beitrag"
-
-#: ../../Zotlabs/Module/Tagger.php:57 ../../include/conversation.php:150
-#: ../../include/text.php:1961
-msgid "comment"
-msgstr "Kommentar"
-
-#: ../../Zotlabs/Module/Tagger.php:95
-#, php-format
-msgid "%1$s tagged %2$s's %3$s with %4$s"
-msgstr "%1$s hat %2$ss %3$s mit %4$s verschlagwortet"
-
-#: ../../Zotlabs/Module/Settings/Features.php:45
-msgid "Additional Features"
-msgstr "Zusätzliche Funktionen"
-
-#: ../../Zotlabs/Module/Settings/Oauth.php:34
-msgid "Name is required"
-msgstr "Name ist erforderlich"
-
-#: ../../Zotlabs/Module/Settings/Oauth.php:38
-msgid "Key and Secret are required"
-msgstr "Schlüssel und Geheimnis werden benötigt"
-
-#: ../../Zotlabs/Module/Settings/Oauth.php:86
-#: ../../Zotlabs/Module/Settings/Oauth.php:112
-#: ../../Zotlabs/Module/Settings/Oauth.php:148
-msgid "Add application"
-msgstr "Anwendung hinzufügen"
-
-#: ../../Zotlabs/Module/Settings/Oauth.php:89
-msgid "Name of application"
-msgstr "Name der Anwendung"
-
-#: ../../Zotlabs/Module/Settings/Oauth.php:90
-#: ../../Zotlabs/Module/Settings/Oauth.php:116
-#: ../../extend/addon/addon/statusnet/statusnet.php:893
-#: ../../extend/addon/addon/twitter/twitter.php:775
-msgid "Consumer Key"
-msgstr "Consumer Key"
-
-#: ../../Zotlabs/Module/Settings/Oauth.php:90
-#: ../../Zotlabs/Module/Settings/Oauth.php:91
-msgid "Automatically generated - change if desired. Max length 20"
-msgstr "Automatisch erzeugt – ändern, falls erwünscht. Maximale Länge 20"
-
-#: ../../Zotlabs/Module/Settings/Oauth.php:91
-#: ../../Zotlabs/Module/Settings/Oauth.php:117
-#: ../../extend/addon/addon/statusnet/statusnet.php:892
-#: ../../extend/addon/addon/twitter/twitter.php:776
-msgid "Consumer Secret"
-msgstr "Consumer Secret"
-
-#: ../../Zotlabs/Module/Settings/Oauth.php:92
-#: ../../Zotlabs/Module/Settings/Oauth.php:118
-msgid "Redirect"
-msgstr "Umleitung"
-
-#: ../../Zotlabs/Module/Settings/Oauth.php:92
-msgid ""
-"Redirect URI - leave blank unless your application specifically requires "
-"this"
-msgstr "Umleitungs-URl – lasse das leer, solange Deine Anwendung es nicht explizit erfordert"
+#: ../../Zotlabs/Module/Oexchange.php:27
+msgid "Unable to find your hub."
+msgstr "Konnte Deinen Server nicht finden."
-#: ../../Zotlabs/Module/Settings/Oauth.php:93
-#: ../../Zotlabs/Module/Settings/Oauth.php:119
-msgid "Icon url"
-msgstr "Symbol-URL"
+#: ../../Zotlabs/Module/Oexchange.php:41
+msgid "Post successful."
+msgstr "Veröffentlichung erfolgreich."
-#: ../../Zotlabs/Module/Settings/Oauth.php:104
-msgid "Application not found."
-msgstr "Die Anwendung wurde nicht gefunden."
+#: ../../Zotlabs/Module/Mail.php:65
+msgid "Unable to lookup recipient."
+msgstr "Konnte den Empfänger nicht finden."
-#: ../../Zotlabs/Module/Settings/Oauth.php:147
-msgid "Connected Apps"
-msgstr "Verbundene Apps"
+#: ../../Zotlabs/Module/Mail.php:72
+msgid "Unable to communicate with requested channel."
+msgstr "Die Kommunikation mit dem ausgewählten Kanal ist fehlgeschlagen."
-#: ../../Zotlabs/Module/Settings/Oauth.php:151
-msgid "Client key starts with"
-msgstr "Client Key beginnt mit"
+#: ../../Zotlabs/Module/Mail.php:79
+msgid "Cannot verify requested channel."
+msgstr "Verifizierung des angeforderten Kanals fehlgeschlagen."
-#: ../../Zotlabs/Module/Settings/Oauth.php:152
-msgid "No name"
-msgstr "Kein Name"
+#: ../../Zotlabs/Module/Mail.php:97
+msgid "Selected channel has private message restrictions. Send failed."
+msgstr "Der ausgewählte Kanal hat Einschränkungen bzgl. privater Nachrichten. Senden fehlgeschlagen."
-#: ../../Zotlabs/Module/Settings/Oauth.php:153
-msgid "Remove authorization"
-msgstr "Authorisierung aufheben"
+#: ../../Zotlabs/Module/Mail.php:178
+msgid "Messages"
+msgstr "Nachrichten"
-#: ../../Zotlabs/Module/Settings/Account.php:20
-msgid "Not valid email."
-msgstr "Keine gültige E-Mail Adresse."
+#: ../../Zotlabs/Module/Mail.php:191
+msgid "message"
+msgstr "Nachricht"
-#: ../../Zotlabs/Module/Settings/Account.php:23
-msgid "Protected email address. Cannot change to that email."
-msgstr "Geschützte E-Mail Adresse. Diese kann nicht verändert werden."
+#: ../../Zotlabs/Module/Mail.php:232
+msgid "Message recalled."
+msgstr "Nachricht widerrufen."
-#: ../../Zotlabs/Module/Settings/Account.php:32
-msgid "System failure storing new email. Please try again."
-msgstr "Systemfehler während des Speicherns der neuen Mail. Bitte versuche es noch einmal."
+#: ../../Zotlabs/Module/Mail.php:245
+msgid "Conversation removed."
+msgstr "Unterhaltung gelöscht."
-#: ../../Zotlabs/Module/Settings/Account.php:40
-msgid "Technical skill level updated"
-msgstr "Technische Qualifikationsstufe aktualisiert"
+#: ../../Zotlabs/Module/Mail.php:260 ../../Zotlabs/Module/Mail.php:381
+msgid "Expires YYYY-MM-DD HH:MM"
+msgstr "Verfällt YYYY-MM-DD HH;MM"
-#: ../../Zotlabs/Module/Settings/Account.php:56
-msgid "Password verification failed."
-msgstr "Passwortüberprüfung fehlgeschlagen."
+#: ../../Zotlabs/Module/Mail.php:288
+msgid "Requested channel is not in this network"
+msgstr "Angeforderter Kanal ist nicht in diesem Netzwerk."
-#: ../../Zotlabs/Module/Settings/Account.php:63
-msgid "Passwords do not match. Password unchanged."
-msgstr "Kennwörter stimmen nicht überein. Kennwort nicht verändert."
+#: ../../Zotlabs/Module/Mail.php:296
+msgid "Send Private Message"
+msgstr "Private Nachricht senden"
-#: ../../Zotlabs/Module/Settings/Account.php:67
-msgid "Empty passwords are not allowed. Password unchanged."
-msgstr "Leere Kennwörter sind nicht erlaubt. Kennwort nicht verändert."
+#: ../../Zotlabs/Module/Mail.php:297 ../../Zotlabs/Module/Mail.php:439
+msgid "To:"
+msgstr "An:"
-#: ../../Zotlabs/Module/Settings/Account.php:81
-msgid "Password changed."
-msgstr "Kennwort geändert."
+#: ../../Zotlabs/Module/Mail.php:300 ../../Zotlabs/Module/Mail.php:441
+msgid "Subject:"
+msgstr "Betreff:"
-#: ../../Zotlabs/Module/Settings/Account.php:83
-msgid "Password update failed. Please try again."
-msgstr "Kennwortänderung fehlgeschlagen. Bitte versuche es noch einmal."
+#: ../../Zotlabs/Module/Mail.php:305 ../../Zotlabs/Module/Mail.php:447
+#: ../../include/conversation.php:1323
+msgid "Attach file"
+msgstr "Datei anhängen"
-#: ../../Zotlabs/Module/Settings/Account.php:112
-msgid "Account Settings"
-msgstr "Konto-Einstellungen"
+#: ../../Zotlabs/Module/Mail.php:307
+msgid "Send"
+msgstr "Absenden"
-#: ../../Zotlabs/Module/Settings/Account.php:113
-msgid "Current Password"
-msgstr "Aktuelles Passwort"
+#: ../../Zotlabs/Module/Mail.php:310 ../../Zotlabs/Module/Mail.php:452
+#: ../../include/conversation.php:1368
+msgid "Set expiration date"
+msgstr "Verfallsdatum"
-#: ../../Zotlabs/Module/Settings/Account.php:114
-msgid "Enter New Password"
-msgstr "Gib ein neues Passwort ein"
+#: ../../Zotlabs/Module/Mail.php:411
+msgid "Delete message"
+msgstr "Nachricht löschen"
-#: ../../Zotlabs/Module/Settings/Account.php:115
-msgid "Confirm New Password"
-msgstr "Bestätige das neue Passwort"
+#: ../../Zotlabs/Module/Mail.php:412
+msgid "Delivery report"
+msgstr "Zustellungsbericht"
-#: ../../Zotlabs/Module/Settings/Account.php:115
-msgid "Leave password fields blank unless changing"
-msgstr "Lasse die Passwort-Felder leer, außer Du möchtest das Passwort ändern"
+#: ../../Zotlabs/Module/Mail.php:413
+msgid "Recall message"
+msgstr "Nachricht widerrufen"
-#: ../../Zotlabs/Module/Settings/Account.php:116
-msgid "Your technical skill level"
-msgstr "Deine technische Qualifikationsstufe"
+#: ../../Zotlabs/Module/Mail.php:415
+msgid "Message has been recalled."
+msgstr "Die Nachricht wurde widerrufen."
-#: ../../Zotlabs/Module/Settings/Account.php:116
-msgid "Used to provide a member experience matched to your comfort level"
-msgstr "Dies wird verwendet, um Dir eine Benutzererfahrung passend zu Deiner technischen Qualifikationsstufe zu bieten."
+#: ../../Zotlabs/Module/Mail.php:432
+msgid "Delete Conversation"
+msgstr "Unterhaltung löschen"
-#: ../../Zotlabs/Module/Settings/Account.php:119
-#: ../../Zotlabs/Module/Settings/Channel.php:483
-msgid "Email Address:"
-msgstr "Email Adresse:"
+#: ../../Zotlabs/Module/Mail.php:434
+msgid ""
+"No secure communications available. You <strong>may</strong> be able to "
+"respond from the sender's profile page."
+msgstr "Keine sichere Kommunikation verfügbar. <strong>Eventuell</strong> kannst Du auf der Profilseite des Absenders antworten."
-#: ../../Zotlabs/Module/Settings/Account.php:121
-msgid "Remove this account including all its channels"
-msgstr "Dieses Konto inklusive all seiner Kanäle löschen"
+#: ../../Zotlabs/Module/Mail.php:438
+msgid "Send Reply"
+msgstr "Antwort senden"
-#: ../../Zotlabs/Module/Settings/Tokens.php:31
+#: ../../Zotlabs/Module/Mail.php:443
#, php-format
-msgid "This channel is limited to %d tokens"
-msgstr "Dieser Kanal ist auf %d Token begrenzt"
-
-#: ../../Zotlabs/Module/Settings/Tokens.php:37
-msgid "Name and Password are required."
-msgstr "Name und Passwort sind erforderlich."
-
-#: ../../Zotlabs/Module/Settings/Tokens.php:77
-msgid "Token saved."
-msgstr "Token gespeichert."
+msgid "Your message for %s (%s):"
+msgstr "Deine Nachricht für %s (%s):"
-#: ../../Zotlabs/Module/Settings/Tokens.php:113
-msgid ""
-"Use this form to create temporary access identifiers to share things with "
-"non-members. These identities may be used in Access Control Lists and "
-"visitors may login using these credentials to access private content."
-msgstr "Mit diesem Formular kannst Du temporäre Zugangs-IDs anlegen, um Inhalte mit Nicht-Mitgliedern zu teilen. Die IDs können in Berechtigungslisten (ACLs) verwendet werden, und Besucher können sich damit einloggen, um auf private Inhalte zuzugreifen."
+#: ../../Zotlabs/Module/Pubsites.php:24 ../../Zotlabs/Widget/Pubsites.php:12
+msgid "Public Hubs"
+msgstr "Öffentliche Hubs"
-#: ../../Zotlabs/Module/Settings/Tokens.php:115
+#: ../../Zotlabs/Module/Pubsites.php:27
msgid ""
-"You may also provide <em>dropbox</em> style access links to friends and "
-"associates by adding the Login Password to any specific site URL as shown. "
-"Examples:"
-msgstr "Du kannst auch <em>Dropbox</em>-ähnliche Zugriffslinks an Andere weitergeben, indem du das Login-Passwort an eine entsprechende URL anhängst wie nachfolgend gezeigt. Beispiele:"
-
-#: ../../Zotlabs/Module/Settings/Tokens.php:150 ../../include/widgets.php:658
-msgid "Guest Access Tokens"
-msgstr "Gastzugangstoken"
-
-#: ../../Zotlabs/Module/Settings/Tokens.php:157
-msgid "Login Name"
-msgstr "Anmeldename"
+"The listed hubs allow public registration for the $Projectname network. All "
+"hubs in the network are interlinked so membership on any of them conveys "
+"membership in the network as a whole. Some hubs may require subscription or "
+"provide tiered service plans. The hub itself <strong>may</strong> provide "
+"additional details."
+msgstr "Die hier aufgeführten Hubs sind öffentlich und erlauben die Registrierung im $Projectname Netzwerk. Alle Hubs dieses Netzwerks sind miteinander verbunden, so dass die Mitgliedschaft auf einem Hub die Verbindung zu beliebigen Seiten und Kanälen auf anderen Hubs ermöglicht. Es könnte sein, dass einige dieser Hubs kostenpflichtig sind oder abgestufte, je nach Umfang kostenpflichtige Mitgliedschaften anbieten. Auf den Seiten der einzelnen Hubs <strong>könnten</strong> jeweils nähere Informationen dazu stehen."
-#: ../../Zotlabs/Module/Settings/Tokens.php:158
-msgid "Login Password"
-msgstr "Anmeldepasswort"
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Hub URL"
+msgstr "Hub-URL"
-#: ../../Zotlabs/Module/Settings/Tokens.php:159
-msgid "Expires (yyyy-mm-dd)"
-msgstr "Läuft ab (jjjj-mm-tt)"
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Access Type"
+msgstr "Zugriffstyp"
-#: ../../Zotlabs/Module/Settings/Featured.php:20
-msgid "Affinity Slider settings updated."
-msgstr "Die Beziehungsgrad-Schieberegler-Einstellungen wurden aktualisiert."
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Registration Policy"
+msgstr "Registrierungsrichtlinien"
-#: ../../Zotlabs/Module/Settings/Featured.php:34
-msgid "No feature settings configured"
-msgstr "Keine Funktions-Einstellungen konfiguriert"
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Stats"
+msgstr "Statistiken"
-#: ../../Zotlabs/Module/Settings/Featured.php:41
-msgid "Default maximum affinity level"
-msgstr "Voreinstellung für maximalen Beziehungsgrad"
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Software"
+msgstr "Software"
-#: ../../Zotlabs/Module/Settings/Featured.php:46
-msgid "Default minimum affinity level"
-msgstr "Voreinstellung für minimalen Beziehungsgrad"
+#: ../../Zotlabs/Module/Pubsites.php:48
+msgid "Rate"
+msgstr "Bewerten"
-#: ../../Zotlabs/Module/Settings/Featured.php:50
-msgid "Affinity Slider Settings"
-msgstr "Beziehungsgrad-Schieberegler-Einstellungen"
+#: ../../Zotlabs/Module/Impel.php:41 ../../include/bbcode.php:203
+msgid "webpage"
+msgstr "Webseite"
-#: ../../Zotlabs/Module/Settings/Featured.php:60
-msgid "Feature/Addon Settings"
-msgstr "Funktions-/Addon-Einstellungen"
+#: ../../Zotlabs/Module/Impel.php:46 ../../include/bbcode.php:209
+msgid "block"
+msgstr "Block"
-#: ../../Zotlabs/Module/Settings/Channel.php:251
-#: ../../extend/addon/addon/logrot/logrot.php:54
-#: ../../extend/addon/addon/msgfooter/msgfooter.php:54
-#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:184
-#: ../../extend/addon/addon/piwik/piwik.php:116
-#: ../../extend/addon/addon/twitter/twitter.php:766
-#: ../../extend/addon/addon/xmpp/xmpp.php:102
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:82
-msgid "Settings updated."
-msgstr "Einstellungen aktualisiert."
+#: ../../Zotlabs/Module/Impel.php:51 ../../include/bbcode.php:206
+msgid "layout"
+msgstr "Layout"
-#: ../../Zotlabs/Module/Settings/Channel.php:312
-msgid "Nobody except yourself"
-msgstr "Niemand außer Dir selbst"
+#: ../../Zotlabs/Module/Impel.php:58 ../../include/bbcode.php:212
+msgid "menu"
+msgstr "Menü"
-#: ../../Zotlabs/Module/Settings/Channel.php:313
-msgid "Only those you specifically allow"
-msgstr "Nur die, denen Du es explizit erlaubst"
+#: ../../Zotlabs/Module/Impel.php:181
+#, php-format
+msgid "%s element installed"
+msgstr "Element für %s installiert"
-#: ../../Zotlabs/Module/Settings/Channel.php:314
-msgid "Approved connections"
-msgstr "Angenommene Verbindungen"
+#: ../../Zotlabs/Module/Impel.php:184
+#, php-format
+msgid "%s element installation failed"
+msgstr "Installation des Elements %s fehlgeschlagen"
-#: ../../Zotlabs/Module/Settings/Channel.php:315
-msgid "Any connections"
-msgstr "Beliebige Verbindungen"
+#: ../../Zotlabs/Module/Rbmark.php:94
+msgid "Select a bookmark folder"
+msgstr "Lesezeichenordner wählen"
-#: ../../Zotlabs/Module/Settings/Channel.php:316
-msgid "Anybody on this website"
-msgstr "Jeder auf dieser Website"
+#: ../../Zotlabs/Module/Rbmark.php:99
+msgid "Save Bookmark"
+msgstr "Lesezeichen speichern"
-#: ../../Zotlabs/Module/Settings/Channel.php:317
-msgid "Anybody in this network"
-msgstr "Alle $Projectname-Mitglieder"
+#: ../../Zotlabs/Module/Rbmark.php:100
+msgid "URL of bookmark"
+msgstr "URL des Lesezeichens"
-#: ../../Zotlabs/Module/Settings/Channel.php:318
-msgid "Anybody authenticated"
-msgstr "Jeder authentifizierte"
+#: ../../Zotlabs/Module/Rbmark.php:105
+msgid "Or enter new bookmark folder name"
+msgstr "Oder gib einen neuen Namen für den Lesezeichenordner ein"
-#: ../../Zotlabs/Module/Settings/Channel.php:319
-msgid "Anybody on the internet"
-msgstr "Jeder im Internet"
+#: ../../Zotlabs/Module/Filer.php:52
+msgid "Enter a folder name"
+msgstr "Gib einen Ordnernamen ein"
-#: ../../Zotlabs/Module/Settings/Channel.php:395
-msgid "Publish your default profile in the network directory"
-msgstr "Standard-Profil im Netzwerk-Verzeichnis veröffentlichen"
+#: ../../Zotlabs/Module/Filer.php:52
+msgid "or select an existing folder (doubleclick)"
+msgstr "oder wähle einen vorhanden Ordner aus (Doppelklick)"
-#: ../../Zotlabs/Module/Settings/Channel.php:400
-msgid "Allow us to suggest you as a potential friend to new members?"
-msgstr "Dürfen wir Dich neuen Mitgliedern als potentiellen Kontakt vorschlagen?"
+#: ../../Zotlabs/Module/Filer.php:54 ../../Zotlabs/Lib/ThreadItem.php:137
+msgid "Save to Folder"
+msgstr "In Ordner speichern"
-#: ../../Zotlabs/Module/Settings/Channel.php:409
-msgid "Your channel address is"
-msgstr "Deine Kanal-Adresse lautet"
+#: ../../Zotlabs/Module/Probe.php:28 ../../Zotlabs/Module/Probe.php:32
+#, php-format
+msgid "Fetching URL returns error: %1$s"
+msgstr "Abrufen der URL gab einen Fehler zurück: %1$s"
-#: ../../Zotlabs/Module/Settings/Channel.php:412
-msgid "Your files/photos are accessible via WebDAV at"
-msgstr "Deine Dateien/Fotos sind via WebDAV verfügbar auf"
+#: ../../Zotlabs/Module/Register.php:49
+msgid "Maximum daily site registrations exceeded. Please try again tomorrow."
+msgstr "Maximale Anzahl täglicher Neuanmeldungen erreicht. Bitte versuche es morgen noch einmal."
-#: ../../Zotlabs/Module/Settings/Channel.php:474
-msgid "Channel Settings"
-msgstr "Kanal-Einstellungen"
+#: ../../Zotlabs/Module/Register.php:55
+msgid ""
+"Please indicate acceptance of the Terms of Service. Registration failed."
+msgstr "Bitte stimme den Nutzungsbedingungen zu. Registrierung fehlgeschlagen."
-#: ../../Zotlabs/Module/Settings/Channel.php:481
-msgid "Basic Settings"
-msgstr "Grundeinstellungen"
+#: ../../Zotlabs/Module/Register.php:89
+msgid "Passwords do not match."
+msgstr "Passwörter stimmen nicht überein."
-#: ../../Zotlabs/Module/Settings/Channel.php:482
-#: ../../include/channel.php:1255
-msgid "Full Name:"
-msgstr "Voller Name:"
+#: ../../Zotlabs/Module/Register.php:131
+msgid ""
+"Registration successful. Please check your email for validation "
+"instructions."
+msgstr "Registrierung erfolgreich. Eine E-Mail mit weiteren Anweisungen wurde an Dich gesendet."
-#: ../../Zotlabs/Module/Settings/Channel.php:484
-msgid "Your Timezone:"
-msgstr "Ihre Zeitzone:"
+#: ../../Zotlabs/Module/Register.php:137
+msgid "Your registration is pending approval by the site owner."
+msgstr "Deine Registrierung muss noch vom Betreiber der Seite freigegeben werden."
-#: ../../Zotlabs/Module/Settings/Channel.php:485
-msgid "Default Post Location:"
-msgstr "Standardstandort:"
+#: ../../Zotlabs/Module/Register.php:140
+msgid "Your registration can not be processed."
+msgstr "Deine Registrierung konnte nicht verarbeitet werden."
-#: ../../Zotlabs/Module/Settings/Channel.php:485
-msgid "Geographical location to display on your posts"
-msgstr "Geografischer Ort, der bei Deinen Beiträgen angezeigt werden soll"
+#: ../../Zotlabs/Module/Register.php:184
+msgid "Registration on this hub is disabled."
+msgstr "Die Registrierung auf diesem Hub ist nicht möglich."
-#: ../../Zotlabs/Module/Settings/Channel.php:486
-msgid "Use Browser Location:"
-msgstr "Standort des Browsers verwenden:"
+#: ../../Zotlabs/Module/Register.php:193
+msgid "Registration on this hub is by approval only."
+msgstr "Eine Registrierung auf diesem Hub erfordert die Zustimmung durch den Administrator."
-#: ../../Zotlabs/Module/Settings/Channel.php:488
-msgid "Adult Content"
-msgstr "Nicht jugendfreie Inhalte"
+#: ../../Zotlabs/Module/Register.php:194
+msgid "<a href=\"pubsites\">Register at another affiliated hub.</a>"
+msgstr "<a href=\"pubsites\">Registriere Dich auf einem der anderen verbundenen Hubs.</a>"
-#: ../../Zotlabs/Module/Settings/Channel.php:488
+#: ../../Zotlabs/Module/Register.php:204
msgid ""
-"This channel frequently or regularly publishes adult content. (Please tag "
-"any adult material and/or nudity with #NSFW)"
-msgstr "Dieser Kanal veröffentlicht regelmäßig Inhalte, die für Minderjährige ungeeignet sind. (Bitte markiere solche Inhalte mit dem Schlagwort #NSFW)"
+"This site has exceeded the number of allowed daily account registrations. "
+"Please try again tomorrow."
+msgstr "Die maximale Anzahl täglicher Registrierungen auf diesem Server wurde überschritten. Bitte versuche es morgen noch einmal."
-#: ../../Zotlabs/Module/Settings/Channel.php:490
-msgid "Security and Privacy Settings"
-msgstr "Sicherheits- und Datenschutz-Einstellungen"
+#: ../../Zotlabs/Module/Register.php:227
+#, php-format
+msgid "I accept the %s for this website"
+msgstr "Ich akzeptiere die %s für diese Webseite"
-#: ../../Zotlabs/Module/Settings/Channel.php:493
-msgid "Your permissions are already configured. Click to view/adjust"
-msgstr "Deine Zugriffsrechte sind schon konfiguriert. Klicke hier, um sie zu betrachten oder zu ändern"
+#: ../../Zotlabs/Module/Register.php:229
+#, php-format
+msgid "I am over 13 years of age and accept the %s for this website"
+msgstr "Ich bin älter als 13 Jahre und akzeptiere die %s dieser Webseite"
-#: ../../Zotlabs/Module/Settings/Channel.php:495
-msgid "Hide my online presence"
-msgstr "Meine Online-Präsenz verbergen"
+#: ../../Zotlabs/Module/Register.php:233
+msgid "Your email address"
+msgstr "Ihre E-Mail Adresse"
-#: ../../Zotlabs/Module/Settings/Channel.php:495
-msgid "Prevents displaying in your profile that you are online"
-msgstr "Verhindert die Anzeige Deines Online-Status in deinem Profil"
+#: ../../Zotlabs/Module/Register.php:234
+msgid "Choose a password"
+msgstr "Passwort"
-#: ../../Zotlabs/Module/Settings/Channel.php:497
-msgid "Simple Privacy Settings:"
-msgstr "Einfache Privatsphäre-Einstellungen"
+#: ../../Zotlabs/Module/Register.php:235
+msgid "Please re-enter your password"
+msgstr "Bitte gib Dein Passwort noch einmal ein"
-#: ../../Zotlabs/Module/Settings/Channel.php:498
-msgid ""
-"Very Public - <em>extremely permissive (should be used with caution)</em>"
-msgstr "Komplett offen – <em>extrem ungeschützt (mit großer Vorsicht verwenden!)</em>"
+#: ../../Zotlabs/Module/Register.php:236
+msgid "Please enter your invitation code"
+msgstr "Bitte trage Deinen Einladungs-Code ein"
-#: ../../Zotlabs/Module/Settings/Channel.php:499
-msgid ""
-"Typical - <em>default public, privacy when desired (similar to social "
-"network permissions but with improved privacy)</em>"
-msgstr "Typisch – <em>Standard öffentlich, Privatsphäre, wo sie erwünscht ist (ähnlich den Einstellungen in sozialen Netzwerken, aber mit besser geschützter Privatsphäre)</em>"
+#: ../../Zotlabs/Module/Register.php:241
+msgid "no"
+msgstr "nein"
-#: ../../Zotlabs/Module/Settings/Channel.php:500
-msgid "Private - <em>default private, never open or public</em>"
-msgstr "Privat – <em>Standard privat, nie offen oder öffentlich</em>"
+#: ../../Zotlabs/Module/Register.php:241
+msgid "yes"
+msgstr "ja"
-#: ../../Zotlabs/Module/Settings/Channel.php:501
-msgid "Blocked - <em>default blocked to/from everybody</em>"
-msgstr "Blockiert – <em>Alle standardmäßig blockiert</em>"
+#: ../../Zotlabs/Module/Register.php:258
+msgid "Membership on this site is by invitation only."
+msgstr "Mitgliedschaft auf dieser Seite ist nur nach vorheriger Einladung möglich."
-#: ../../Zotlabs/Module/Settings/Channel.php:503
-msgid "Allow others to tag your posts"
-msgstr "Erlaube anderen, Deine Beiträge zu verschlagworten"
+#: ../../Zotlabs/Module/Register.php:270 ../../boot.php:1610
+#: ../../include/nav.php:149
+msgid "Register"
+msgstr "Registrieren"
-#: ../../Zotlabs/Module/Settings/Channel.php:503
+#: ../../Zotlabs/Module/Register.php:271
msgid ""
-"Often used by the community to retro-actively flag inappropriate content"
-msgstr "Wird oft von der Community genutzt um rückwirkend anstößigen Inhalt zu markieren"
-
-#: ../../Zotlabs/Module/Settings/Channel.php:505
-msgid "Channel Permission Limits"
-msgstr "Kanal-Berechtigungslimits"
+"This site may require email verification after submitting this form. If you "
+"are returned to a login page, please check your email for instructions."
+msgstr "Diese Seite verlangt möglicherweise eine Emailbestätigung nach dem Absenden des Formulars. Wenn Du auf eine Login-Seite zurückgeleitet wirst, prüfe bitte Deinen Posteingang auf neue Mails mit entsprechenden Hinweisen."
-#: ../../Zotlabs/Module/Settings/Channel.php:507
-msgid "Expire other channel content after this many days"
-msgstr "Den Inhalt anderer Kanäle nach dieser Anzahl Tage verfallen lassen"
+#: ../../Zotlabs/Module/Cover_photo.php:136
+#: ../../Zotlabs/Module/Cover_photo.php:186
+msgid "Cover Photos"
+msgstr "Cover Foto"
-#: ../../Zotlabs/Module/Settings/Channel.php:507
-msgid "0 or blank to use the website limit."
-msgstr "0 oder leer lassen, um den voreingestellten Wert der Webseite zu verwenden."
+#: ../../Zotlabs/Module/Cover_photo.php:237 ../../include/items.php:4303
+msgid "female"
+msgstr "weiblich"
-#: ../../Zotlabs/Module/Settings/Channel.php:507
+#: ../../Zotlabs/Module/Cover_photo.php:238 ../../include/items.php:4304
#, php-format
-msgid "This website expires after %d days."
-msgstr "Diese Webseite läuft nach %d Tagen ab."
-
-#: ../../Zotlabs/Module/Settings/Channel.php:507
-msgid "This website does not expire imported content."
-msgstr "Diese Webseite lässt importierte Inhalte nicht verfallen."
+msgid "%1$s updated her %2$s"
+msgstr "%1$s hat ihr %2$s aktualisiert"
-#: ../../Zotlabs/Module/Settings/Channel.php:507
-msgid "The website limit takes precedence if lower than your limit."
-msgstr "Das Verfallslimit der Webseite hat Vorrang, wenn es niedriger als Deines hier ist."
+#: ../../Zotlabs/Module/Cover_photo.php:239 ../../include/items.php:4305
+msgid "male"
+msgstr "männlich"
-#: ../../Zotlabs/Module/Settings/Channel.php:508
-msgid "Maximum Friend Requests/Day:"
-msgstr "Maximale Kontaktanfragen pro Tag:"
+#: ../../Zotlabs/Module/Cover_photo.php:240 ../../include/items.php:4306
+#, php-format
+msgid "%1$s updated his %2$s"
+msgstr "%1$s hat sein %2$s aktualisiert"
-#: ../../Zotlabs/Module/Settings/Channel.php:508
-msgid "May reduce spam activity"
-msgstr "Kann die Spam-Aktivität verringern"
+#: ../../Zotlabs/Module/Cover_photo.php:242 ../../include/items.php:4308
+#, php-format
+msgid "%1$s updated their %2$s"
+msgstr "%1$s hat sein/ihr %2$s aktualisiert"
-#: ../../Zotlabs/Module/Settings/Channel.php:509
-msgid "Default Access Control List (ACL)"
-msgstr "Standard-Zugriffsberechtigungsliste (ACL)"
+#: ../../Zotlabs/Module/Cover_photo.php:244 ../../include/channel.php:1759
+msgid "cover photo"
+msgstr "Cover Foto"
-#: ../../Zotlabs/Module/Settings/Channel.php:511
-msgid "Use my default audience setting for the type of object published"
-msgstr "Verwende Deine eingestellte Standard-Zielgruppe des jeweiligen Inhaltstyps"
+#: ../../Zotlabs/Module/Cover_photo.php:360
+msgid "Upload Cover Photo"
+msgstr "Cover Foto hochladen"
-#: ../../Zotlabs/Module/Settings/Channel.php:518
-msgid "Channel permissions category:"
-msgstr "Zugriffsrechte-Kategorie des Kanals:"
+#: ../../Zotlabs/Module/Help.php:23
+msgid "Documentation Search"
+msgstr "Suche in der Dokumentation"
-#: ../../Zotlabs/Module/Settings/Channel.php:519
-msgid "Default Permissions Group"
-msgstr "Standard-Berechtigungsgruppe"
+#: ../../Zotlabs/Module/Help.php:80 ../../include/conversation.php:1773
+#: ../../include/nav.php:382
+msgid "About"
+msgstr "Ãœber"
-#: ../../Zotlabs/Module/Settings/Channel.php:525
-msgid "Maximum private messages per day from unknown people:"
-msgstr "Maximale Anzahl privater Nachrichten pro Tag von unbekannten Leuten:"
+#: ../../Zotlabs/Module/Help.php:82
+msgid "Administrators"
+msgstr "Administratoren"
-#: ../../Zotlabs/Module/Settings/Channel.php:525
-msgid "Useful to reduce spamming"
-msgstr "Nützlich, um Spam zu verringern"
+#: ../../Zotlabs/Module/Help.php:83
+msgid "Developers"
+msgstr "Entwickler"
-#: ../../Zotlabs/Module/Settings/Channel.php:528
-msgid "Notification Settings"
-msgstr "Benachrichtigungs-Einstellungen"
+#: ../../Zotlabs/Module/Help.php:84
+msgid "Tutorials"
+msgstr "Tutorials"
-#: ../../Zotlabs/Module/Settings/Channel.php:529
-msgid "By default post a status message when:"
-msgstr "Sende standardmäßig Status-Nachrichten, wenn:"
+#: ../../Zotlabs/Module/Help.php:93
+msgid "$Projectname Documentation"
+msgstr "$Projectname-Dokumentation"
-#: ../../Zotlabs/Module/Settings/Channel.php:530
-msgid "accepting a friend request"
-msgstr "Du eine Verbindungsanfrage annimmst"
+#: ../../Zotlabs/Module/Help.php:94
+msgid "Contents"
+msgstr "Inhalt"
-#: ../../Zotlabs/Module/Settings/Channel.php:531
-msgid "joining a forum/community"
-msgstr "Du einem Forum beitrittst"
+#: ../../Zotlabs/Module/Tagrm.php:48 ../../Zotlabs/Module/Tagrm.php:98
+msgid "Tag removed"
+msgstr "Schlagwort entfernt"
-#: ../../Zotlabs/Module/Settings/Channel.php:532
-msgid "making an <em>interesting</em> profile change"
-msgstr "Du eine <em>interessante</em> Änderung an Deinem Profil vornimmst"
+#: ../../Zotlabs/Module/Tagrm.php:123
+msgid "Remove Item Tag"
+msgstr "Schlagwort entfernen"
-#: ../../Zotlabs/Module/Settings/Channel.php:533
-msgid "Send a notification email when:"
-msgstr "Eine E-Mail-Benachrichtigung senden, wenn:"
+#: ../../Zotlabs/Module/Tagrm.php:125
+msgid "Select a tag to remove: "
+msgstr "Schlagwort zum Entfernen auswählen:"
-#: ../../Zotlabs/Module/Settings/Channel.php:534
-msgid "You receive a connection request"
-msgstr "Du eine Verbindungsanfrage erhältst"
+#: ../../Zotlabs/Module/Network.php:96
+msgid "No such group"
+msgstr "Gruppe nicht gefunden"
-#: ../../Zotlabs/Module/Settings/Channel.php:535
-msgid "Your connections are confirmed"
-msgstr "Eine Verbindung bestätigt wurde"
+#: ../../Zotlabs/Module/Network.php:136
+msgid "No such channel"
+msgstr "Kanal nicht gefunden"
-#: ../../Zotlabs/Module/Settings/Channel.php:536
-msgid "Someone writes on your profile wall"
-msgstr "Jemand auf Deine Pinnwand schreibt"
+#: ../../Zotlabs/Module/Network.php:141
+msgid "forum"
+msgstr "Forum"
-#: ../../Zotlabs/Module/Settings/Channel.php:537
-msgid "Someone writes a followup comment"
-msgstr "Jemand einen Beitrag kommentiert"
+#: ../../Zotlabs/Module/Network.php:153
+msgid "Search Results For:"
+msgstr "Suchergebnisse für:"
-#: ../../Zotlabs/Module/Settings/Channel.php:538
-msgid "You receive a private message"
-msgstr "Du eine private Nachricht erhältst"
+#: ../../Zotlabs/Module/Network.php:221
+msgid "Privacy group is empty"
+msgstr "Gruppe ist leer"
-#: ../../Zotlabs/Module/Settings/Channel.php:539
-msgid "You receive a friend suggestion"
-msgstr "Du einen Kontaktvorschlag erhältst"
+#: ../../Zotlabs/Module/Network.php:230
+msgid "Privacy group: "
+msgstr "Gruppe:"
-#: ../../Zotlabs/Module/Settings/Channel.php:540
-msgid "You are tagged in a post"
-msgstr "Du in einem Beitrag erwähnt wurdest"
+#: ../../Zotlabs/Module/Network.php:256
+msgid "Invalid connection."
+msgstr "Ungültige Verbindung."
-#: ../../Zotlabs/Module/Settings/Channel.php:541
-msgid "You are poked/prodded/etc. in a post"
-msgstr "Du in einem Beitrag angestupst/geknufft/o.ä. wurdest"
+#: ../../Zotlabs/Module/Network.php:275 ../../addon/redred/redred.php:65
+msgid "Invalid channel."
+msgstr "Ungültiger Kanal."
-#: ../../Zotlabs/Module/Settings/Channel.php:543
-msgid "Someone likes your post/comment"
-msgstr "Jemand mag Ihren Beitrag/Kommentar"
+#: ../../Zotlabs/Module/Acl.php:344
+msgid "network"
+msgstr "Netzwerk"
-#: ../../Zotlabs/Module/Settings/Channel.php:546
-msgid "Show visual notifications including:"
-msgstr "Visuelle Benachrichtigungen anzeigen für:"
+#: ../../Zotlabs/Module/Acl.php:354
+msgid "RSS"
+msgstr "RSS"
-#: ../../Zotlabs/Module/Settings/Channel.php:548
-msgid "Unseen grid activity"
-msgstr "Ungesehene Netzwerk-Aktivität"
+#: ../../Zotlabs/Module/Home.php:74 ../../Zotlabs/Module/Home.php:82
+#: ../../addon/opensearch/opensearch.php:42
+msgid "$Projectname"
+msgstr "$Projectname"
-#: ../../Zotlabs/Module/Settings/Channel.php:549
-msgid "Unseen channel activity"
-msgstr "Ungesehene Kanal-Aktivität"
+#: ../../Zotlabs/Module/Home.php:92
+#, php-format
+msgid "Welcome to %s"
+msgstr "Willkommen auf %s"
-#: ../../Zotlabs/Module/Settings/Channel.php:550
-msgid "Unseen private messages"
-msgstr "Ungelesene persönliche Nachrichten"
+#: ../../Zotlabs/Module/Filestorage.php:87
+msgid "Permission Denied."
+msgstr "Zugriff verweigert."
-#: ../../Zotlabs/Module/Settings/Channel.php:550
-#: ../../Zotlabs/Module/Settings/Channel.php:555
-#: ../../Zotlabs/Module/Settings/Channel.php:556
-#: ../../Zotlabs/Module/Settings/Channel.php:557
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:343
-msgid "Recommended"
-msgstr "Empfohlen"
+#: ../../Zotlabs/Module/Filestorage.php:103
+msgid "File not found."
+msgstr "Datei nicht gefunden."
-#: ../../Zotlabs/Module/Settings/Channel.php:551
-msgid "Upcoming events"
-msgstr "Baldige Termine"
+#: ../../Zotlabs/Module/Filestorage.php:146
+msgid "Edit file permissions"
+msgstr "Dateiberechtigungen bearbeiten"
-#: ../../Zotlabs/Module/Settings/Channel.php:552
-msgid "Events today"
-msgstr "Heutige Termine"
+#: ../../Zotlabs/Module/Filestorage.php:159
+msgid "Set/edit permissions"
+msgstr "Berechtigungen setzen/ändern"
-#: ../../Zotlabs/Module/Settings/Channel.php:553
-msgid "Upcoming birthdays"
-msgstr "Baldige Geburtstage"
+#: ../../Zotlabs/Module/Filestorage.php:160
+msgid "Include all files and sub folders"
+msgstr "Alle Dateien und Unterverzeichnisse einbinden"
-#: ../../Zotlabs/Module/Settings/Channel.php:553
-msgid "Not available in all themes"
-msgstr "Nicht in allen Themes verfügbar"
+#: ../../Zotlabs/Module/Filestorage.php:161
+msgid "Return to file list"
+msgstr "Zurück zur Dateiliste"
-#: ../../Zotlabs/Module/Settings/Channel.php:554
-msgid "System (personal) notifications"
-msgstr "System – (persönliche) Benachrichtigungen"
+#: ../../Zotlabs/Module/Filestorage.php:163
+msgid "Copy/paste this code to attach file to a post"
+msgstr "Diesen Code kopieren und einfügen, um die Datei an einen Beitrag anzuhängen"
-#: ../../Zotlabs/Module/Settings/Channel.php:555
-msgid "System info messages"
-msgstr "System – Info-Nachrichten"
+#: ../../Zotlabs/Module/Filestorage.php:164
+msgid "Copy/paste this URL to link file from a web page"
+msgstr "Diese URL verwenden, um von einer Webseite aus auf die Datei zu verlinken"
-#: ../../Zotlabs/Module/Settings/Channel.php:556
-msgid "System critical alerts"
-msgstr "System – kritische Warnungen"
+#: ../../Zotlabs/Module/Filestorage.php:166
+msgid "Share this file"
+msgstr "Diese Datei freigeben"
-#: ../../Zotlabs/Module/Settings/Channel.php:557
-msgid "New connections"
-msgstr "Neue Verbindungen"
+#: ../../Zotlabs/Module/Filestorage.php:167
+msgid "Show URL to this file"
+msgstr "URL zu dieser Datei anzeigen"
-#: ../../Zotlabs/Module/Settings/Channel.php:558
-msgid "System Registrations"
-msgstr "System – Registrierungen"
+#: ../../Zotlabs/Module/Filestorage.php:168
+msgid "Notify your contacts about this file"
+msgstr "Meine Kontakte über diese Datei benachrichtigen"
-#: ../../Zotlabs/Module/Settings/Channel.php:559
-msgid ""
-"Also show new wall posts, private messages and connections under Notices"
-msgstr "Neue Pinnwand-Nachrichten, private Nachrichten und Verbindungen unter Benachrichtigungen anzeigen"
+#: ../../Zotlabs/Module/Common.php:14
+msgid "No channel."
+msgstr "Kein Kanal."
-#: ../../Zotlabs/Module/Settings/Channel.php:561
-msgid "Notify me of events this many days in advance"
-msgstr "Benachrichtige mich zu Terminen so viele Tage im Voraus"
+#: ../../Zotlabs/Module/Common.php:43
+msgid "Common connections"
+msgstr "Gemeinsame Verbindungen"
-#: ../../Zotlabs/Module/Settings/Channel.php:561
-msgid "Must be greater than 0"
-msgstr "Muss größer als 0 sein"
+#: ../../Zotlabs/Module/Common.php:48
+msgid "No connections in common."
+msgstr "Keine gemeinsamen Verbindungen."
-#: ../../Zotlabs/Module/Settings/Channel.php:567
-msgid "Advanced Account/Page Type Settings"
-msgstr "Erweiterte Account- und Seitenart-Einstellungen"
+#: ../../Zotlabs/Module/Viewconnections.php:65
+msgid "No connections."
+msgstr "Keine Verbindungen."
-#: ../../Zotlabs/Module/Settings/Channel.php:568
-msgid "Change the behaviour of this account for special situations"
-msgstr "Ändere das Verhalten dieses Accounts unter speziellen Umständen"
+#: ../../Zotlabs/Module/Viewconnections.php:78
+#, php-format
+msgid "Visit %s's profile [%s]"
+msgstr "%ss Profil [%s] besuchen"
-#: ../../Zotlabs/Module/Settings/Channel.php:570
-msgid "Miscellaneous Settings"
-msgstr "Sonstige Einstellungen"
+#: ../../Zotlabs/Module/Viewconnections.php:107
+msgid "View Connections"
+msgstr "Verbindungen anzeigen"
-#: ../../Zotlabs/Module/Settings/Channel.php:571
-msgid "Default photo upload folder"
-msgstr "Voreingestellter Ordner für hochgeladene Fotos"
+#: ../../Zotlabs/Module/Admin.php:94
+msgid "# Accounts"
+msgstr "Anzahl der Konten"
-#: ../../Zotlabs/Module/Settings/Channel.php:571
-#: ../../Zotlabs/Module/Settings/Channel.php:572
-msgid "%Y - current year, %m - current month"
-msgstr "%Y - aktuelles Jahr, %m - aktueller Monat"
+#: ../../Zotlabs/Module/Admin.php:95
+msgid "# blocked accounts"
+msgstr "Anzahl der blockierten Konten"
-#: ../../Zotlabs/Module/Settings/Channel.php:572
-msgid "Default file upload folder"
-msgstr "Voreingestellter Ordner für hochgeladene Dateien"
+#: ../../Zotlabs/Module/Admin.php:96
+msgid "# expired accounts"
+msgstr "Anzahl der abgelaufenen Konten"
-#: ../../Zotlabs/Module/Settings/Channel.php:574
-msgid "Personal menu to display in your channel pages"
-msgstr "Eigenes Menü zur Anzeige auf den Seiten deines Kanals"
+#: ../../Zotlabs/Module/Admin.php:97
+msgid "# expiring accounts"
+msgstr "Anzahl der ablaufenden Konten"
-#: ../../Zotlabs/Module/Settings/Channel.php:576
-msgid "Remove this channel."
-msgstr "Diesen Kanal löschen"
+#: ../../Zotlabs/Module/Admin.php:108
+msgid "# Channels"
+msgstr "Anzahl der Kanäle"
-#: ../../Zotlabs/Module/Settings/Channel.php:577
-msgid "Firefox Share $Projectname provider"
-msgstr "$Projectname-Provider für Firefox Share"
+#: ../../Zotlabs/Module/Admin.php:109
+msgid "# primary"
+msgstr "Anzahl der primären Kanäle"
-#: ../../Zotlabs/Module/Settings/Channel.php:578
-msgid "Start calendar week on monday"
-msgstr "Montag als erster Tag der Kalenderwoche"
+#: ../../Zotlabs/Module/Admin.php:110
+msgid "# clones"
+msgstr "Anzahl der Klone"
-#: ../../Zotlabs/Module/Settings/Display.php:137
-msgid "No special theme for mobile devices"
-msgstr "Keine spezielle Theme für mobile Geräte"
+#: ../../Zotlabs/Module/Admin.php:116
+msgid "Message queues"
+msgstr "Nachrichten-Warteschlangen"
-#: ../../Zotlabs/Module/Settings/Display.php:140
-#, php-format
-msgid "%s - (Experimental)"
-msgstr "%s – (experimentell)"
+#: ../../Zotlabs/Module/Admin.php:133
+msgid "Your software should be updated"
+msgstr "Die installierte Software sollte aktualisiert werden"
-#: ../../Zotlabs/Module/Settings/Display.php:191
-msgid "Display Settings"
-msgstr "Anzeige-Einstellungen"
+#: ../../Zotlabs/Module/Admin.php:138
+msgid "Summary"
+msgstr "Zusammenfassung"
-#: ../../Zotlabs/Module/Settings/Display.php:192
-msgid "Theme Settings"
-msgstr "Theme-Einstellungen"
+#: ../../Zotlabs/Module/Admin.php:141
+msgid "Registered accounts"
+msgstr "Registrierte Konten"
-#: ../../Zotlabs/Module/Settings/Display.php:193
-msgid "Custom Theme Settings"
-msgstr "Benutzerdefinierte Theme-Einstellungen"
+#: ../../Zotlabs/Module/Admin.php:142
+msgid "Pending registrations"
+msgstr "Ausstehende Registrierungen"
-#: ../../Zotlabs/Module/Settings/Display.php:194
-msgid "Content Settings"
-msgstr "Inhaltseinstellungen"
+#: ../../Zotlabs/Module/Admin.php:143
+msgid "Registered channels"
+msgstr "Registrierte Kanäle"
-#: ../../Zotlabs/Module/Settings/Display.php:200
-msgid "Display Theme:"
-msgstr "Anzeige-Theme:"
+#: ../../Zotlabs/Module/Admin.php:144
+msgid "Active plugins"
+msgstr "Aktive Plug-Ins"
-#: ../../Zotlabs/Module/Settings/Display.php:201
-msgid "Select scheme"
-msgstr "Schema wählen"
+#: ../../Zotlabs/Module/Admin.php:145
+msgid "Version"
+msgstr "Version"
-#: ../../Zotlabs/Module/Settings/Display.php:203
-msgid "Mobile Theme:"
-msgstr "Mobile Theme:"
+#: ../../Zotlabs/Module/Admin.php:146
+msgid "Repository version (master)"
+msgstr "Repository-Version (master)"
-#: ../../Zotlabs/Module/Settings/Display.php:204
-msgid "Preload images before rendering the page"
-msgstr "Bilder im voraus laden, bevor die Seite angezeigt wird"
+#: ../../Zotlabs/Module/Admin.php:147
+msgid "Repository version (dev)"
+msgstr "Repository-Version (dev)"
-#: ../../Zotlabs/Module/Settings/Display.php:204
-msgid ""
-"The subjective page load time will be longer but the page will be ready when"
-" displayed"
-msgstr "Die empfundene Ladezeit wird sich erhöhen, aber dafür ist das Layout stabil, sobald eine Seite angezeigt wird"
+#: ../../Zotlabs/Module/Service_limits.php:23
+msgid "No service class restrictions found."
+msgstr "Keine Dienstklassenbeschränkungen gefunden."
-#: ../../Zotlabs/Module/Settings/Display.php:205
-msgid "Enable user zoom on mobile devices"
-msgstr "Zoom auf Mobilgeräten aktivieren"
+#: ../../Zotlabs/Module/Rate.php:156
+msgid "Website:"
+msgstr "Webseite:"
-#: ../../Zotlabs/Module/Settings/Display.php:206
-msgid "Update browser every xx seconds"
-msgstr "Browser alle xx Sekunden aktualisieren"
+#: ../../Zotlabs/Module/Rate.php:159
+#, php-format
+msgid "Remote Channel [%s] (not yet known on this site)"
+msgstr "Kanal [%s] (auf diesem Server noch unbekannt)"
-#: ../../Zotlabs/Module/Settings/Display.php:206
-msgid "Minimum of 10 seconds, no maximum"
-msgstr "Minimum 10 Sekunden, kein Maximum"
+#: ../../Zotlabs/Module/Rate.php:160
+msgid "Rating (this information is public)"
+msgstr "Bewertung (öffentlich sichtbar)"
-#: ../../Zotlabs/Module/Settings/Display.php:207
-msgid "Maximum number of conversations to load at any time:"
-msgstr "Maximale Anzahl von Unterhaltungen, die auf einmal geladen werden sollen:"
+#: ../../Zotlabs/Module/Rate.php:161
+msgid "Optionally explain your rating (this information is public)"
+msgstr "Optional kannst du deine Bewertung erklären (öffentlich sichtbar)"
-#: ../../Zotlabs/Module/Settings/Display.php:207
-msgid "Maximum of 100 items"
-msgstr "Maximum: 100 Beiträge"
+#: ../../Zotlabs/Module/Lostpass.php:19
+msgid "No valid account found."
+msgstr "Kein gültiges Konto gefunden."
-#: ../../Zotlabs/Module/Settings/Display.php:208
-msgid "Show emoticons (smilies) as images"
-msgstr "Emoticons (Smilies) als Bilder anzeigen"
+#: ../../Zotlabs/Module/Lostpass.php:33
+msgid "Password reset request issued. Check your email."
+msgstr "Zurücksetzen des Passworts eingeleitet. Schau in Deine E-Mails."
-#: ../../Zotlabs/Module/Settings/Display.php:209
-msgid "Manual conversation updates"
-msgstr "Manuelle Konversationsaktualisierung"
+#: ../../Zotlabs/Module/Lostpass.php:39 ../../Zotlabs/Module/Lostpass.php:108
+#, php-format
+msgid "Site Member (%s)"
+msgstr "Nutzer (%s)"
-#: ../../Zotlabs/Module/Settings/Display.php:209
-msgid "Default is on, turning this off may increase screen jumping"
-msgstr "Voreinstellung ist An, dies abzuschalten kann das unerwartete Springen der Seitenanzeige erhöhen."
+#: ../../Zotlabs/Module/Lostpass.php:44 ../../Zotlabs/Module/Lostpass.php:49
+#, php-format
+msgid "Password reset requested at %s"
+msgstr "Passwort-Rücksetzung auf %s angefordert"
-#: ../../Zotlabs/Module/Settings/Display.php:210
-msgid "Link post titles to source"
-msgstr "Beitragstitel zum Originalbeitrag verlinken"
+#: ../../Zotlabs/Module/Lostpass.php:68
+msgid ""
+"Request could not be verified. (You may have previously submitted it.) "
+"Password reset failed."
+msgstr "Die Anfrage konnte nicht verifiziert werden. (Vielleicht hast Du schon einmal auf den Link in der E-Mail geklickt?) Passwort-Rücksetzung fehlgeschlagen."
-#: ../../Zotlabs/Module/Settings/Display.php:211
-msgid "System Page Layout Editor - (advanced)"
-msgstr "System-Seitenlayout-Editor (für Experten)"
+#: ../../Zotlabs/Module/Lostpass.php:91 ../../boot.php:1637
+msgid "Password Reset"
+msgstr "Zurücksetzen des Kennworts"
-#: ../../Zotlabs/Module/Settings/Display.php:214
-msgid "Use blog/list mode on channel page"
-msgstr "Blog-/Listenmodus auf der Kanalseite verwenden"
+#: ../../Zotlabs/Module/Lostpass.php:92
+msgid "Your password has been reset as requested."
+msgstr "Dein Passwort wurde wie angefordert neu erstellt."
-#: ../../Zotlabs/Module/Settings/Display.php:214
-#: ../../Zotlabs/Module/Settings/Display.php:215
-msgid "(comments displayed separately)"
-msgstr "(Kommentare werden separat angezeigt)"
+#: ../../Zotlabs/Module/Lostpass.php:93
+msgid "Your new password is"
+msgstr "Dein neues Passwort lautet"
-#: ../../Zotlabs/Module/Settings/Display.php:215
-msgid "Use blog/list mode on grid page"
-msgstr "Blog-/Listenmodus auf der Netzwerkseite verwenden"
+#: ../../Zotlabs/Module/Lostpass.php:94
+msgid "Save or copy your new password - and then"
+msgstr "Speichere oder kopiere Dein neues Passwort – und dann"
-#: ../../Zotlabs/Module/Settings/Display.php:216
-msgid "Channel page max height of content (in pixels)"
-msgstr "Maximale Höhe von Beitragsblöcken auf der Kanalseite (in Pixeln)"
+#: ../../Zotlabs/Module/Lostpass.php:95
+msgid "click here to login"
+msgstr "Klicke hier, um dich anzumelden"
-#: ../../Zotlabs/Module/Settings/Display.php:216
-#: ../../Zotlabs/Module/Settings/Display.php:217
-msgid "click to expand content exceeding this height"
-msgstr "Blöcke, deren Inhalt diese Höhe überschreitet, können per Klick vergrößert werden."
+#: ../../Zotlabs/Module/Lostpass.php:96
+msgid ""
+"Your password may be changed from the <em>Settings</em> page after "
+"successful login."
+msgstr "Dein Passwort kann unter <em>Einstellungen</em> nach einer erfolgreichen Anmeldung geändert werden."
-#: ../../Zotlabs/Module/Settings/Display.php:217
-msgid "Grid page max height of content (in pixels)"
-msgstr "Maximale Höhe (in Pixel) des Inhalts der Netzwerkseite"
+#: ../../Zotlabs/Module/Lostpass.php:117
+#, php-format
+msgid "Your password has changed at %s"
+msgstr "Auf %s wurde Dein Passwort geändert"
-#: ../../Zotlabs/Module/Settings/Permcats.php:37
-msgid "Permission category saved."
-msgstr "Berechtigungsrolle gespeichert."
+#: ../../Zotlabs/Module/Lostpass.php:130
+msgid "Forgot your Password?"
+msgstr "Kennwort vergessen?"
-#: ../../Zotlabs/Module/Settings/Permcats.php:63
+#: ../../Zotlabs/Module/Lostpass.php:131
msgid ""
-"Use this form to create permission rules for various classes of people or "
-"connections."
-msgstr "Verwende dieses Formular, um Berechtigungsrollen für verschiedene Gruppen von Personen oder Verbindungen zu erstellen."
+"Enter your email address and submit to have your password reset. Then check "
+"your email for further instructions."
+msgstr "Gib Deine E-Mail-Adresse ein, um Dein Passwort zurücksetzen zu lassen. Du erhältst dann weitere Anweisungen per E-Mail."
-#: ../../Zotlabs/Module/Settings/Permcats.php:96
-msgid "Permission Categories"
-msgstr "Berechtigungsrollen"
+#: ../../Zotlabs/Module/Lostpass.php:132
+msgid "Email Address"
+msgstr "E-Mail Adresse"
-#: ../../Zotlabs/Module/Settings/Permcats.php:104
-msgid "Permission Name"
-msgstr "Name der Berechtigungsrolle"
+#: ../../Zotlabs/Module/Lostpass.php:133
+msgid "Reset"
+msgstr "Zurücksetzen"
-#: ../../Zotlabs/Module/Tagrm.php:48 ../../Zotlabs/Module/Tagrm.php:98
-msgid "Tag removed"
-msgstr "Schlagwort entfernt"
+#: ../../Zotlabs/Module/Notifications.php:43 ../../include/nav.php:190
+msgid "Mark all system notifications seen"
+msgstr "Markiere alle System-Benachrichtigungen als gesehen"
-#: ../../Zotlabs/Module/Tagrm.php:123
-msgid "Remove Item Tag"
-msgstr "Schlagwort entfernen"
+#: ../../Zotlabs/Lib/Apps.php:212
+msgid "Site Admin"
+msgstr "Hub-Administration"
-#: ../../Zotlabs/Module/Tagrm.php:125
-msgid "Select a tag to remove: "
-msgstr "Schlagwort zum Entfernen auswählen:"
+#: ../../Zotlabs/Lib/Apps.php:213 ../../addon/buglink/buglink.php:16
+msgid "Report Bug"
+msgstr "Fehler melden"
-#: ../../Zotlabs/Module/Thing.php:114
-msgid "Thing updated"
-msgstr "Sache aktualisiert"
+#: ../../Zotlabs/Lib/Apps.php:214
+msgid "View Bookmarks"
+msgstr "Lesezeichen ansehen"
-#: ../../Zotlabs/Module/Thing.php:166
-msgid "Object store: failed"
-msgstr "Speichern des Objekts fehlgeschlagen"
+#: ../../Zotlabs/Lib/Apps.php:215
+msgid "My Chatrooms"
+msgstr "Meine Chaträume"
-#: ../../Zotlabs/Module/Thing.php:170
-msgid "Thing added"
-msgstr "Sache hinzugefügt"
+#: ../../Zotlabs/Lib/Apps.php:217
+msgid "Firefox Share"
+msgstr "Teilen-Knopf für Firefox"
-#: ../../Zotlabs/Module/Thing.php:196
-#, php-format
-msgid "OBJ: %1$s %2$s %3$s"
-msgstr "OBJ: %1$s %2$s %3$s"
+#: ../../Zotlabs/Lib/Apps.php:218
+msgid "Remote Diagnostics"
+msgstr "Ferndiagnose"
-#: ../../Zotlabs/Module/Thing.php:259
-msgid "Show Thing"
-msgstr "Sache anzeigen"
+#: ../../Zotlabs/Lib/Apps.php:219 ../../include/features.php:337
+msgid "Suggest Channels"
+msgstr "Kanäle vorschlagen"
-#: ../../Zotlabs/Module/Thing.php:266
-msgid "item not found."
-msgstr "Eintrag nicht gefunden"
+#: ../../Zotlabs/Lib/Apps.php:220 ../../boot.php:1629
+#: ../../include/nav.php:117
+msgid "Login"
+msgstr "Anmelden"
-#: ../../Zotlabs/Module/Thing.php:299
-msgid "Edit Thing"
-msgstr "Sache bearbeiten"
+#: ../../Zotlabs/Lib/Apps.php:222
+msgid "Activity"
+msgstr "Aktivität"
-#: ../../Zotlabs/Module/Thing.php:301 ../../Zotlabs/Module/Thing.php:355
-msgid "Select a profile"
-msgstr "Wähle ein Profil"
+#: ../../Zotlabs/Lib/Apps.php:226 ../../include/conversation.php:1857
+#: ../../include/features.php:99 ../../include/nav.php:465
+msgid "Wiki"
+msgstr "Wiki"
-#: ../../Zotlabs/Module/Thing.php:305 ../../Zotlabs/Module/Thing.php:358
-msgid "Post an activity"
-msgstr "Aktivitätsnachricht senden"
+#: ../../Zotlabs/Lib/Apps.php:227 ../../include/nav.php:180
+msgid "Channel Home"
+msgstr "Mein Kanal"
-#: ../../Zotlabs/Module/Thing.php:305 ../../Zotlabs/Module/Thing.php:358
-msgid "Only sends to viewers of the applicable profile"
-msgstr "Nur an Betrachter des ausgewählten Profils senden"
+#: ../../Zotlabs/Lib/Apps.php:230 ../../include/conversation.php:1802
+#: ../../include/conversation.php:1805 ../../include/nav.php:200
+#: ../../include/nav.php:411 ../../include/nav.php:414
+msgid "Events"
+msgstr "Termine"
-#: ../../Zotlabs/Module/Thing.php:307 ../../Zotlabs/Module/Thing.php:360
-msgid "Name of thing e.g. something"
-msgstr "Name der Sache, z. B. irgendwas"
+#: ../../Zotlabs/Lib/Apps.php:231
+msgid "Directory"
+msgstr "Verzeichnis"
-#: ../../Zotlabs/Module/Thing.php:309 ../../Zotlabs/Module/Thing.php:361
-msgid "URL of thing (optional)"
-msgstr "URL der Sache (optional)"
+#: ../../Zotlabs/Lib/Apps.php:233 ../../include/nav.php:192
+msgid "Mail"
+msgstr "Mail"
-#: ../../Zotlabs/Module/Thing.php:311 ../../Zotlabs/Module/Thing.php:362
-msgid "URL for photo of thing (optional)"
-msgstr "URL eines Fotos der Sache (optional)"
+#: ../../Zotlabs/Lib/Apps.php:236
+msgid "Chat"
+msgstr "Chat"
-#: ../../Zotlabs/Module/Thing.php:353
-msgid "Add Thing to your Profile"
-msgstr "Die Sache Deinem Profil hinzufügen"
+#: ../../Zotlabs/Lib/Apps.php:238
+msgid "Probe"
+msgstr "Testen"
-#: ../../Zotlabs/Module/Mail.php:65
-msgid "Unable to lookup recipient."
-msgstr "Konnte den Empfänger nicht finden."
+#: ../../Zotlabs/Lib/Apps.php:239
+msgid "Suggest"
+msgstr "Empfehlen"
-#: ../../Zotlabs/Module/Mail.php:72
-msgid "Unable to communicate with requested channel."
-msgstr "Die Kommunikation mit dem ausgewählten Kanal ist fehlgeschlagen."
+#: ../../Zotlabs/Lib/Apps.php:240
+msgid "Random Channel"
+msgstr "Zufälliger Kanal"
-#: ../../Zotlabs/Module/Mail.php:79
-msgid "Cannot verify requested channel."
-msgstr "Verifizierung des angeforderten Kanals fehlgeschlagen."
+#: ../../Zotlabs/Lib/Apps.php:241
+msgid "Invite"
+msgstr "Einladen"
-#: ../../Zotlabs/Module/Mail.php:97
-msgid "Selected channel has private message restrictions. Send failed."
-msgstr "Der ausgewählte Kanal hat Einschränkungen bzgl. privater Nachrichten. Senden fehlgeschlagen."
+#: ../../Zotlabs/Lib/Apps.php:242 ../../Zotlabs/Widget/Admin.php:26
+msgid "Features"
+msgstr "Funktionen"
-#: ../../Zotlabs/Module/Mail.php:178
-msgid "Messages"
-msgstr "Nachrichten"
+#: ../../Zotlabs/Lib/Apps.php:243 ../../addon/openid/MysqlProvider.php:69
+msgid "Language"
+msgstr "Sprache"
-#: ../../Zotlabs/Module/Mail.php:213
-msgid "Message recalled."
-msgstr "Nachricht widerrufen."
+#: ../../Zotlabs/Lib/Apps.php:244
+msgid "Post"
+msgstr "Beitrag schreiben"
-#: ../../Zotlabs/Module/Mail.php:226
-msgid "Conversation removed."
-msgstr "Unterhaltung gelöscht."
+#: ../../Zotlabs/Lib/Apps.php:245 ../../addon/openid/MysqlProvider.php:58
+#: ../../addon/openid/MysqlProvider.php:59
+#: ../../addon/openid/MysqlProvider.php:60
+msgid "Profile Photo"
+msgstr "Profilfoto"
-#: ../../Zotlabs/Module/Mail.php:240 ../../Zotlabs/Module/Mail.php:349
-#: ../../Zotlabs/Module/Chat.php:205 ../../include/conversation.php:1330
-msgid "Please enter a link URL:"
-msgstr "Gib eine URL ein:"
+#: ../../Zotlabs/Lib/Apps.php:365
+msgid "Purchase"
+msgstr "Kaufen"
-#: ../../Zotlabs/Module/Mail.php:241 ../../Zotlabs/Module/Mail.php:350
-msgid "Expires YYYY-MM-DD HH:MM"
-msgstr "Verfällt YYYY-MM-DD HH;MM"
+#: ../../Zotlabs/Lib/Apps.php:369
+msgid "Undelete"
+msgstr "Wieder hergestellt"
-#: ../../Zotlabs/Module/Mail.php:269
-msgid "Requested channel is not in this network"
-msgstr "Angeforderter Kanal ist nicht in diesem Netzwerk."
+#: ../../Zotlabs/Lib/Apps.php:374
+msgid "Add to app-tray"
+msgstr "Zum App-Menü hinzufügen"
-#: ../../Zotlabs/Module/Mail.php:277
-msgid "Send Private Message"
-msgstr "Private Nachricht senden"
+#: ../../Zotlabs/Lib/Apps.php:375
+msgid "Remove from app-tray"
+msgstr "Aus dem App-Menü entfernen"
-#: ../../Zotlabs/Module/Mail.php:278 ../../Zotlabs/Module/Mail.php:403
-msgid "To:"
-msgstr "An:"
+#: ../../Zotlabs/Lib/Permcat.php:58
+msgctxt "permcat"
+msgid "default"
+msgstr "Standard"
-#: ../../Zotlabs/Module/Mail.php:281 ../../Zotlabs/Module/Mail.php:405
-msgid "Subject:"
-msgstr "Betreff:"
+#: ../../Zotlabs/Lib/Permcat.php:96
+msgctxt "permcat"
+msgid "follower"
+msgstr "Abonnent"
-#: ../../Zotlabs/Module/Mail.php:286 ../../Zotlabs/Module/Mail.php:411
-#: ../../include/conversation.php:1390
-msgid "Attach file"
-msgstr "Datei anhängen"
+#: ../../Zotlabs/Lib/Permcat.php:100
+msgctxt "permcat"
+msgid "contributor"
+msgstr "Beitragender"
-#: ../../Zotlabs/Module/Mail.php:288
-msgid "Send"
-msgstr "Absenden"
+#: ../../Zotlabs/Lib/Permcat.php:104
+msgctxt "permcat"
+msgid "publisher"
+msgstr "Autor"
-#: ../../Zotlabs/Module/Mail.php:291 ../../Zotlabs/Module/Mail.php:416
-#: ../../include/conversation.php:1435
-msgid "Set expiration date"
-msgstr "Verfallsdatum"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:42
+#: ../../Zotlabs/Lib/NativeWikiPage.php:83
+msgid "(No Title)"
+msgstr "(Kein Titel)"
-#: ../../Zotlabs/Module/Mail.php:293 ../../Zotlabs/Module/Mail.php:418
-#: ../../Zotlabs/Module/Chat.php:206 ../../Zotlabs/Lib/ThreadItem.php:743
-#: ../../include/conversation.php:1440
-msgid "Encrypt text"
-msgstr "Text verschlüsseln"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:97
+msgid "Wiki page create failed."
+msgstr "Anlegen der Wiki-Seite fehlgeschlagen."
-#: ../../Zotlabs/Module/Mail.php:375
-msgid "Delete message"
-msgstr "Nachricht löschen"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:110
+msgid "Wiki not found."
+msgstr "Wiki nicht gefunden."
-#: ../../Zotlabs/Module/Mail.php:376
-msgid "Delivery report"
-msgstr "Zustellungsbericht"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:121
+msgid "Destination name already exists"
+msgstr "Zielname bereits vorhanden"
-#: ../../Zotlabs/Module/Mail.php:377
-msgid "Recall message"
-msgstr "Nachricht widerrufen"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:147
+#: ../../Zotlabs/Lib/NativeWikiPage.php:342
+msgid "Page not found"
+msgstr "Seite nicht gefunden"
-#: ../../Zotlabs/Module/Mail.php:379
-msgid "Message has been recalled."
-msgstr "Die Nachricht wurde widerrufen."
+#: ../../Zotlabs/Lib/NativeWikiPage.php:177
+msgid "Error reading page content"
+msgstr "Fehler beim Lesen des Seiteninhalts"
-#: ../../Zotlabs/Module/Mail.php:396
-msgid "Delete Conversation"
-msgstr "Unterhaltung löschen"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:333
+#: ../../Zotlabs/Lib/NativeWikiPage.php:381
+#: ../../Zotlabs/Lib/NativeWikiPage.php:448
+#: ../../Zotlabs/Lib/NativeWikiPage.php:489
+msgid "Error reading wiki"
+msgstr "Fehler beim Lesen des Wiki"
-#: ../../Zotlabs/Module/Mail.php:398
-msgid ""
-"No secure communications available. You <strong>may</strong> be able to "
-"respond from the sender's profile page."
-msgstr "Keine sichere Kommunikation verfügbar. <strong>Eventuell</strong> kannst Du auf der Profilseite des Absenders antworten."
+#: ../../Zotlabs/Lib/NativeWikiPage.php:369
+msgid "Page update failed."
+msgstr "Seitenaktualisierung fehlgeschlagen."
-#: ../../Zotlabs/Module/Mail.php:402
-msgid "Send Reply"
-msgstr "Antwort senden"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:403
+msgid "Nothing deleted"
+msgstr "Nichts gelöscht"
-#: ../../Zotlabs/Module/Mail.php:407
-#, php-format
-msgid "Your message for %s (%s):"
-msgstr "Deine Nachricht für %s (%s):"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:469
+msgid "Compare: object not found."
+msgstr "Vergleichen: Objekt nicht gefunden."
-#: ../../Zotlabs/Module/Viewconnections.php:65
-msgid "No connections."
-msgstr "Keine Verbindungen."
+#: ../../Zotlabs/Lib/NativeWikiPage.php:475
+msgid "Page updated"
+msgstr "Seite aktualisiert"
-#: ../../Zotlabs/Module/Viewconnections.php:78
-#, php-format
-msgid "Visit %s's profile [%s]"
-msgstr "%ss Profil [%s] besuchen"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:478
+msgid "Untitled"
+msgstr "Ohne Titel"
-#: ../../Zotlabs/Module/Viewconnections.php:107
-msgid "View Connections"
-msgstr "Verbindungen anzeigen"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:484
+msgid "Wiki resource_id required for git commit"
+msgstr "Die resource_id des Wiki wird benötigt für den git commit."
-#: ../../Zotlabs/Module/Viewsrc.php:44
-msgid "Source of Item"
-msgstr "Quelle des Elements"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:540
+#: ../../Zotlabs/Widget/Wiki_page_history.php:23
+msgctxt "wiki_history"
+msgid "Message"
+msgstr "Nachricht"
-#: ../../Zotlabs/Module/Chat.php:181
-msgid "Room not found"
-msgstr "Chatraum nicht gefunden"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:578
+#: ../../addon/gitwiki/gitwiki_backend.php:579 ../../include/bbcode.php:610
+#: ../../include/bbcode.php:756
+msgid "Different viewers will see this text differently"
+msgstr "Verschiedene Betrachter werden diesen Text unterschiedlich sehen"
-#: ../../Zotlabs/Module/Chat.php:197
-msgid "Leave Room"
-msgstr "Raum verlassen"
+#: ../../Zotlabs/Lib/PermissionDescription.php:34
+#: ../../include/acl_selectors.php:128
+msgid "Visible to your default audience"
+msgstr "Standard-Sichtbarkeit gemäß Kanaleinstellungen"
-#: ../../Zotlabs/Module/Chat.php:198
-msgid "Delete Room"
-msgstr "Raum löschen"
+#: ../../Zotlabs/Lib/PermissionDescription.php:107
+#: ../../include/acl_selectors.php:201
+msgid "Only me"
+msgstr "Nur ich"
-#: ../../Zotlabs/Module/Chat.php:199
-msgid "I am away right now"
-msgstr "Ich bin gerade nicht da"
+#: ../../Zotlabs/Lib/PermissionDescription.php:108
+msgid "Public"
+msgstr "Öffentlich"
-#: ../../Zotlabs/Module/Chat.php:200
-msgid "I am online"
-msgstr "Ich bin online"
+#: ../../Zotlabs/Lib/PermissionDescription.php:109
+msgid "Anybody in the $Projectname network"
+msgstr "Jeder innerhalb des $Projectname Netzwerks"
-#: ../../Zotlabs/Module/Chat.php:202
-msgid "Bookmark this room"
-msgstr "Lesezeichen für diesen Raum setzen"
+#: ../../Zotlabs/Lib/PermissionDescription.php:110
+#, php-format
+msgid "Any account on %s"
+msgstr "Jedes Nutzerkonto auf %s"
-#: ../../Zotlabs/Module/Chat.php:231
-msgid "New Chatroom"
-msgstr "Neuer Chatraum"
+#: ../../Zotlabs/Lib/PermissionDescription.php:111
+msgid "Any of my connections"
+msgstr "Alle meine Verbindungen"
-#: ../../Zotlabs/Module/Chat.php:232
-msgid "Chatroom name"
-msgstr "Chatraumname"
+#: ../../Zotlabs/Lib/PermissionDescription.php:112
+msgid "Only connections I specifically allow"
+msgstr "Nur Verbindungen, denen ich es explizit erlaube"
-#: ../../Zotlabs/Module/Chat.php:233
-msgid "Expiration of chats (minutes)"
-msgstr "Verfall von Chats (Minuten)"
+#: ../../Zotlabs/Lib/PermissionDescription.php:113
+msgid "Anybody authenticated (could include visitors from other networks)"
+msgstr "Jeder, der angemeldet ist (kann Besucher anderer Netzwerke beinhalten)"
-#: ../../Zotlabs/Module/Chat.php:249
-#, php-format
-msgid "%1$s's Chatrooms"
-msgstr "%1$ss Chaträume"
+#: ../../Zotlabs/Lib/PermissionDescription.php:114
+msgid "Any connections including those who haven't yet been approved"
+msgstr "Alle Verbindungen einschließlich der noch nicht bestätigten"
-#: ../../Zotlabs/Module/Chat.php:254
-msgid "No chatrooms available"
-msgstr "Keine Chaträume verfügbar"
+#: ../../Zotlabs/Lib/PermissionDescription.php:150
+msgid ""
+"This is your default setting for the audience of your normal stream, and "
+"posts."
+msgstr "Dies ist Deine Voreinstellung für die Sichtbarkeit Deiner normalen Beiträge (Stream)."
-#: ../../Zotlabs/Module/Chat.php:258
-msgid "Expiration"
-msgstr "Verfall"
+#: ../../Zotlabs/Lib/PermissionDescription.php:151
+msgid ""
+"This is your default setting for who can view your default channel profile"
+msgstr "Dies ist Deine Voreinstellung für die Sichtbarkeit Deines Standard-Kanalprofils."
-#: ../../Zotlabs/Module/Chat.php:259
-msgid "min"
-msgstr "min"
+#: ../../Zotlabs/Lib/PermissionDescription.php:152
+msgid "This is your default setting for who can view your connections"
+msgstr "Dies ist Deine Voreinstellung für die Sichtbarkeit Deiner Verbindungen."
-#: ../../Zotlabs/Module/Xchan.php:10
-msgid "Xchan Lookup"
-msgstr "Xchan-Suche"
+#: ../../Zotlabs/Lib/PermissionDescription.php:153
+msgid ""
+"This is your default setting for who can view your file storage and photos"
+msgstr "Dies ist Deine Voreinstellung für die Sichtbarkeit Deiner Dateien und Fotos."
-#: ../../Zotlabs/Module/Xchan.php:13
-msgid "Lookup xchan beginning with (or webbie): "
-msgstr "Nach xchans oder Webbies (Kanal-Adressen) suchen, die wie folgt beginnen:"
+#: ../../Zotlabs/Lib/PermissionDescription.php:154
+msgid "This is your default setting for the audience of your webpages"
+msgstr "Dies ist Deine Voreinstellung für die Sichtbarkeit Deiner Webseiten."
#: ../../Zotlabs/Lib/Chatroom.php:27
msgid "Missing room name"
@@ -7230,22 +7348,21 @@ msgstr "Chatraum konnte nicht gefunden werden."
msgid "Room is full"
msgstr "Der Chatraum ist voll"
-#: ../../Zotlabs/Lib/Enotify.php:60 ../../include/network.php:1924
+#: ../../Zotlabs/Lib/Enotify.php:60 ../../include/network.php:1977
msgid "$Projectname Notification"
msgstr "$Projectname-Benachrichtigung"
-#: ../../Zotlabs/Lib/Enotify.php:61 ../../extend/addon/addon/diaspora/p.php:46
-#: ../../extend/addon/addon/diaspora/util.php:218
-#: ../../extend/addon/addon/diaspora/util.php:231
-#: ../../include/network.php:1925
+#: ../../Zotlabs/Lib/Enotify.php:61 ../../addon/diaspora/util.php:218
+#: ../../addon/diaspora/util.php:231 ../../addon/diaspora/p.php:46
+#: ../../include/network.php:1978
msgid "$projectname"
msgstr "$projectname"
-#: ../../Zotlabs/Lib/Enotify.php:63 ../../include/network.php:1927
+#: ../../Zotlabs/Lib/Enotify.php:63 ../../include/network.php:1980
msgid "Thank You,"
msgstr "Danke."
-#: ../../Zotlabs/Lib/Enotify.php:65 ../../include/network.php:1929
+#: ../../Zotlabs/Lib/Enotify.php:65 ../../include/network.php:1982
#, php-format
msgid "%s Administrator"
msgstr "der Administrator von %s"
@@ -7314,7 +7431,7 @@ msgstr "Bitte besuche %s, um die Unterhaltung anzusehen und/oder zu kommentieren
#: ../../Zotlabs/Lib/Enotify.php:273
#, php-format
msgid "%1$s, %2$s liked [zrl=%3$s]your %4$s[/zrl]"
-msgstr ""
+msgstr "%1$s, %2$s gefällt [zrl=%3$s]dein %4$s[/zrl]"
#: ../../Zotlabs/Lib/Enotify.php:288
#, php-format
@@ -7440,205 +7557,152 @@ msgstr "Foto:"
msgid "Please visit %s to approve or reject the suggestion."
msgstr "Bitte besuche %s um den Vorschlag zu akzeptieren oder abzulehnen."
-#: ../../Zotlabs/Lib/Enotify.php:619
+#: ../../Zotlabs/Lib/Enotify.php:620
msgid "[$Projectname:Notify]"
msgstr "[$Projectname:Benachrichtigung]"
-#: ../../Zotlabs/Lib/Enotify.php:779
+#: ../../Zotlabs/Lib/Enotify.php:780
msgid "created a new post"
msgstr "Neuer Beitrag wurde erzeugt"
-#: ../../Zotlabs/Lib/Enotify.php:780
+#: ../../Zotlabs/Lib/Enotify.php:781
#, php-format
msgid "commented on %s's post"
msgstr "hat %s's Beitrag kommentiert"
-#: ../../Zotlabs/Lib/PermissionDescription.php:34
-#: ../../include/acl_selectors.php:128
-msgid "Visible to your default audience"
-msgstr "Standard-Sichtbarkeit gemäß Kanaleinstellungen"
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:107
-#: ../../include/acl_selectors.php:201
-msgid "Only me"
-msgstr "Nur ich"
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:108
-msgid "Public"
-msgstr "Öffentlich"
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:109
-msgid "Anybody in the $Projectname network"
-msgstr "Jeder innerhalb des $Projectname Netzwerks"
+#: ../../Zotlabs/Lib/NativeWiki.php:128
+msgid "Wiki files deleted successfully"
+msgstr "Wiki-Dateien erfolgreich gelöscht"
-#: ../../Zotlabs/Lib/PermissionDescription.php:110
+#: ../../Zotlabs/Lib/DB_Upgrade.php:93
#, php-format
-msgid "Any account on %s"
-msgstr "Jedes Nutzerkonto auf %s"
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:111
-msgid "Any of my connections"
-msgstr "Alle meine Verbindungen"
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:112
-msgid "Only connections I specifically allow"
-msgstr "Nur Verbindungen, denen ich es explizit erlaube"
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:113
-msgid "Anybody authenticated (could include visitors from other networks)"
-msgstr "Jeder, der angemeldet ist (kann Besucher anderer Netzwerke beinhalten)"
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:114
-msgid "Any connections including those who haven't yet been approved"
-msgstr "Alle Verbindungen einschließlich der noch nicht bestätigten"
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:150
-msgid ""
-"This is your default setting for the audience of your normal stream, and "
-"posts."
-msgstr "Dies ist Deine Voreinstellung für die Sichtbarkeit Deiner normalen Beiträge (Stream)."
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:151
-msgid ""
-"This is your default setting for who can view your default channel profile"
-msgstr "Dies ist Deine Voreinstellung für die Sichtbarkeit Deines Standard-Kanalprofils."
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:152
-msgid "This is your default setting for who can view your connections"
-msgstr "Dies ist Deine Voreinstellung für die Sichtbarkeit Deiner Verbindungen."
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:153
-msgid ""
-"This is your default setting for who can view your file storage and photos"
-msgstr "Dies ist Deine Voreinstellung für die Sichtbarkeit Deiner Dateien und Fotos."
+msgid "Update Error at %s"
+msgstr "Aktualisierungsfehler auf %s"
-#: ../../Zotlabs/Lib/PermissionDescription.php:154
-msgid "This is your default setting for the audience of your webpages"
-msgstr "Dies ist Deine Voreinstellung für die Sichtbarkeit Deiner Webseiten."
+#: ../../Zotlabs/Lib/DB_Upgrade.php:99
+#, php-format
+msgid "Update %s failed. See error logs."
+msgstr "Aktualisierung %s fehlgeschlagen. Details in den Fehlerprotokollen."
-#: ../../Zotlabs/Lib/ThreadItem.php:95 ../../include/conversation.php:663
+#: ../../Zotlabs/Lib/ThreadItem.php:96 ../../include/conversation.php:661
msgid "Private Message"
msgstr "Private Nachricht"
-#: ../../Zotlabs/Lib/ThreadItem.php:132 ../../include/conversation.php:655
+#: ../../Zotlabs/Lib/ThreadItem.php:133 ../../include/conversation.php:653
msgid "Select"
msgstr "Auswählen"
-#: ../../Zotlabs/Lib/ThreadItem.php:136
-msgid "Save to Folder"
-msgstr "In Ordner speichern"
-
-#: ../../Zotlabs/Lib/ThreadItem.php:157
+#: ../../Zotlabs/Lib/ThreadItem.php:158
msgid "I will attend"
msgstr "Ich werde teilnehmen"
-#: ../../Zotlabs/Lib/ThreadItem.php:157
+#: ../../Zotlabs/Lib/ThreadItem.php:158
msgid "I will not attend"
msgstr "Ich werde nicht teilnehmen"
-#: ../../Zotlabs/Lib/ThreadItem.php:157
+#: ../../Zotlabs/Lib/ThreadItem.php:158
msgid "I might attend"
msgstr "Ich werde vielleicht teilnehmen"
-#: ../../Zotlabs/Lib/ThreadItem.php:167
+#: ../../Zotlabs/Lib/ThreadItem.php:168
msgid "I agree"
msgstr "Ich stimme zu"
-#: ../../Zotlabs/Lib/ThreadItem.php:167
+#: ../../Zotlabs/Lib/ThreadItem.php:168
msgid "I disagree"
msgstr "Ich lehne ab"
-#: ../../Zotlabs/Lib/ThreadItem.php:167
+#: ../../Zotlabs/Lib/ThreadItem.php:168
msgid "I abstain"
msgstr "Ich enthalte mich"
-#: ../../Zotlabs/Lib/ThreadItem.php:223
+#: ../../Zotlabs/Lib/ThreadItem.php:224
msgid "Add Star"
msgstr "Stern hinzufügen"
-#: ../../Zotlabs/Lib/ThreadItem.php:224
+#: ../../Zotlabs/Lib/ThreadItem.php:225
msgid "Remove Star"
msgstr "Stern entfernen"
-#: ../../Zotlabs/Lib/ThreadItem.php:225
+#: ../../Zotlabs/Lib/ThreadItem.php:226
msgid "Toggle Star Status"
msgstr "Markierungsstatus (Stern) umschalten"
-#: ../../Zotlabs/Lib/ThreadItem.php:229
+#: ../../Zotlabs/Lib/ThreadItem.php:230
msgid "starred"
msgstr "markiert"
-#: ../../Zotlabs/Lib/ThreadItem.php:239 ../../include/conversation.php:670
+#: ../../Zotlabs/Lib/ThreadItem.php:240 ../../include/conversation.php:668
msgid "Message signature validated"
msgstr "Signatur überprüft"
-#: ../../Zotlabs/Lib/ThreadItem.php:240 ../../include/conversation.php:671
+#: ../../Zotlabs/Lib/ThreadItem.php:241 ../../include/conversation.php:669
msgid "Message signature incorrect"
msgstr "Signatur nicht korrekt"
-#: ../../Zotlabs/Lib/ThreadItem.php:248
+#: ../../Zotlabs/Lib/ThreadItem.php:249
msgid "Add Tag"
msgstr "Tag hinzufügen"
-#: ../../Zotlabs/Lib/ThreadItem.php:268 ../../include/taxonomy.php:316
+#: ../../Zotlabs/Lib/ThreadItem.php:269 ../../include/taxonomy.php:316
msgid "like"
msgstr "mag"
-#: ../../Zotlabs/Lib/ThreadItem.php:269 ../../include/taxonomy.php:317
+#: ../../Zotlabs/Lib/ThreadItem.php:270 ../../include/taxonomy.php:317
msgid "dislike"
msgstr "verurteile"
-#: ../../Zotlabs/Lib/ThreadItem.php:273
+#: ../../Zotlabs/Lib/ThreadItem.php:274
msgid "Share This"
msgstr "Teilen"
-#: ../../Zotlabs/Lib/ThreadItem.php:273
+#: ../../Zotlabs/Lib/ThreadItem.php:274
msgid "share"
msgstr "Teilen"
-#: ../../Zotlabs/Lib/ThreadItem.php:282
+#: ../../Zotlabs/Lib/ThreadItem.php:283
msgid "Delivery Report"
msgstr "Zustellungsbericht"
-#: ../../Zotlabs/Lib/ThreadItem.php:300
+#: ../../Zotlabs/Lib/ThreadItem.php:301
#, php-format
msgid "%d comment"
msgid_plural "%d comments"
msgstr[0] "%d Kommentar"
msgstr[1] "%d Kommentare"
-#: ../../Zotlabs/Lib/ThreadItem.php:329 ../../Zotlabs/Lib/ThreadItem.php:330
+#: ../../Zotlabs/Lib/ThreadItem.php:330 ../../Zotlabs/Lib/ThreadItem.php:331
#, php-format
msgid "View %s's profile - %s"
msgstr "Schaue Dir %ss Profil an – %s"
-#: ../../Zotlabs/Lib/ThreadItem.php:333
+#: ../../Zotlabs/Lib/ThreadItem.php:334
msgid "to"
msgstr "an"
-#: ../../Zotlabs/Lib/ThreadItem.php:334
+#: ../../Zotlabs/Lib/ThreadItem.php:335
msgid "via"
msgstr "via"
-#: ../../Zotlabs/Lib/ThreadItem.php:335
+#: ../../Zotlabs/Lib/ThreadItem.php:336
msgid "Wall-to-Wall"
msgstr "Wall-to-Wall"
-#: ../../Zotlabs/Lib/ThreadItem.php:336
+#: ../../Zotlabs/Lib/ThreadItem.php:337
msgid "via Wall-To-Wall:"
msgstr "via Wall-To-Wall:"
-#: ../../Zotlabs/Lib/ThreadItem.php:350 ../../include/conversation.php:717
+#: ../../Zotlabs/Lib/ThreadItem.php:350 ../../include/conversation.php:718
#, php-format
msgid "from %s"
msgstr "via %s"
-#: ../../Zotlabs/Lib/ThreadItem.php:353 ../../include/conversation.php:720
+#: ../../Zotlabs/Lib/ThreadItem.php:353 ../../include/conversation.php:721
#, php-format
msgid "last edited: %s"
msgstr "zuletzt bearbeitet: %s"
-#: ../../Zotlabs/Lib/ThreadItem.php:354 ../../include/conversation.php:721
+#: ../../Zotlabs/Lib/ThreadItem.php:354 ../../include/conversation.php:722
#, php-format
msgid "Expires: %s"
msgstr "Verfällt: %s"
@@ -7659,2021 +7723,2333 @@ msgstr "Abstimmen"
msgid "Voting Options"
msgstr "Abstimmungsoptionen"
-#: ../../Zotlabs/Lib/ThreadItem.php:383
-#: ../../extend/addon/addon/bookmarker/bookmarker.php:38
+#: ../../Zotlabs/Lib/ThreadItem.php:384
+#: ../../addon/bookmarker/bookmarker.php:38
msgid "Save Bookmarks"
msgstr "Favoriten speichern"
-#: ../../Zotlabs/Lib/ThreadItem.php:384
+#: ../../Zotlabs/Lib/ThreadItem.php:385
msgid "Add to Calendar"
msgstr "Zum Kalender hinzufügen"
-#: ../../Zotlabs/Lib/ThreadItem.php:393
+#: ../../Zotlabs/Lib/ThreadItem.php:394
msgid "Mark all seen"
msgstr "Alle als gelesen markieren"
-#: ../../Zotlabs/Lib/ThreadItem.php:442 ../../include/js_strings.php:7
+#: ../../Zotlabs/Lib/ThreadItem.php:443 ../../include/js_strings.php:7
#, php-format
msgid "%s show all"
msgstr "%s mehr anzeigen"
-#: ../../Zotlabs/Lib/ThreadItem.php:732 ../../include/conversation.php:1385
+#: ../../Zotlabs/Lib/ThreadItem.php:733 ../../include/conversation.php:1318
msgid "Bold"
msgstr "Fett"
-#: ../../Zotlabs/Lib/ThreadItem.php:733 ../../include/conversation.php:1386
+#: ../../Zotlabs/Lib/ThreadItem.php:734 ../../include/conversation.php:1319
msgid "Italic"
msgstr "Kursiv"
-#: ../../Zotlabs/Lib/ThreadItem.php:734 ../../include/conversation.php:1387
+#: ../../Zotlabs/Lib/ThreadItem.php:735 ../../include/conversation.php:1320
msgid "Underline"
msgstr "Unterstrichen"
-#: ../../Zotlabs/Lib/ThreadItem.php:735 ../../include/conversation.php:1388
+#: ../../Zotlabs/Lib/ThreadItem.php:736 ../../include/conversation.php:1321
msgid "Quote"
msgstr "Zitat"
-#: ../../Zotlabs/Lib/ThreadItem.php:736 ../../include/conversation.php:1389
+#: ../../Zotlabs/Lib/ThreadItem.php:737 ../../include/conversation.php:1322
msgid "Code"
msgstr "Code"
-#: ../../Zotlabs/Lib/ThreadItem.php:737
+#: ../../Zotlabs/Lib/ThreadItem.php:738
msgid "Image"
msgstr "Bild"
-#: ../../Zotlabs/Lib/ThreadItem.php:738
+#: ../../Zotlabs/Lib/ThreadItem.php:739
msgid "Insert Link"
msgstr "Link einfügen"
-#: ../../Zotlabs/Lib/ThreadItem.php:739
+#: ../../Zotlabs/Lib/ThreadItem.php:740
msgid "Video"
msgstr "Video"
-#: ../../Zotlabs/Lib/Apps.php:212
-msgid "Site Admin"
-msgstr "Hub-Administration"
+#: ../../Zotlabs/Zot/Auth.php:138
+msgid ""
+"Remote authentication blocked. You are logged into this site locally. Please"
+" logout and retry."
+msgstr "Fern-Authentifizierung blockiert. Du bist lokal auf diesem Server angemeldet. Bitte melde Dich ab und versuche es erneut."
-#: ../../Zotlabs/Lib/Apps.php:213
-#: ../../extend/addon/addon/buglink/buglink.php:16
-msgid "Report Bug"
-msgstr "Fehler melden"
+#: ../../Zotlabs/Zot/Auth.php:250 ../../addon/openid/Mod_Openid.php:76
+#: ../../addon/openid/Mod_Openid.php:178
+#, php-format
+msgid "Welcome %s. Remote authentication successful."
+msgstr "Willkommen %s. Entfernte Authentifizierung erfolgreich."
-#: ../../Zotlabs/Lib/Apps.php:214
-msgid "View Bookmarks"
-msgstr "Lesezeichen ansehen"
+#: ../../Zotlabs/Storage/Browser.php:106 ../../Zotlabs/Storage/Browser.php:237
+msgid "parent"
+msgstr "Ãœbergeordnetes Verzeichnis"
-#: ../../Zotlabs/Lib/Apps.php:215
-msgid "My Chatrooms"
-msgstr "Meine Chaträume"
+#: ../../Zotlabs/Storage/Browser.php:130 ../../include/text.php:2679
+msgid "Collection"
+msgstr "Sammlung"
-#: ../../Zotlabs/Lib/Apps.php:217
-msgid "Firefox Share"
-msgstr "Teilen-Knopf für Firefox"
+#: ../../Zotlabs/Storage/Browser.php:133
+msgid "Principal"
+msgstr "Prinzipal"
-#: ../../Zotlabs/Lib/Apps.php:218
-msgid "Remote Diagnostics"
-msgstr "Ferndiagnose"
+#: ../../Zotlabs/Storage/Browser.php:136
+msgid "Addressbook"
+msgstr "Adressbuch"
-#: ../../Zotlabs/Lib/Apps.php:219 ../../include/features.php:337
-msgid "Suggest Channels"
-msgstr "Kanäle vorschlagen"
+#: ../../Zotlabs/Storage/Browser.php:139
+msgid "Calendar"
+msgstr "Kalender"
-#: ../../Zotlabs/Lib/Apps.php:220 ../../include/nav.php:130
-#: ../../boot.php:1732
-msgid "Login"
-msgstr "Anmelden"
+#: ../../Zotlabs/Storage/Browser.php:142
+msgid "Schedule Inbox"
+msgstr "Posteingang für überwachte Kalender"
-#: ../../Zotlabs/Lib/Apps.php:222 ../../include/nav.php:194
-msgid "Grid"
-msgstr "Grid"
+#: ../../Zotlabs/Storage/Browser.php:145
+msgid "Schedule Outbox"
+msgstr "Postausgang für überwachte Kalender"
-#: ../../Zotlabs/Lib/Apps.php:226 ../../include/conversation.php:1903
-#: ../../include/features.php:99
-msgid "Wiki"
-msgstr "Wiki"
+#: ../../Zotlabs/Storage/Browser.php:225
+msgid "Total"
+msgstr "Summe"
-#: ../../Zotlabs/Lib/Apps.php:227 ../../include/nav.php:198
-msgid "Channel Home"
-msgstr "Mein Kanal"
+#: ../../Zotlabs/Storage/Browser.php:227
+msgid "Shared"
+msgstr "Geteilt"
-#: ../../Zotlabs/Lib/Apps.php:230 ../../include/conversation.php:1853
-#: ../../include/conversation.php:1856 ../../include/nav.php:218
-msgid "Events"
-msgstr "Termine"
+#: ../../Zotlabs/Storage/Browser.php:301
+#, php-format
+msgid "You are using %1$s of your available file storage."
+msgstr "Sie verwenden %1$s von Ihrem verfügbaren Dateispeicher."
-#: ../../Zotlabs/Lib/Apps.php:231 ../../include/nav.php:182
-msgid "Directory"
-msgstr "Verzeichnis"
+#: ../../Zotlabs/Storage/Browser.php:306
+#, php-format
+msgid "You are using %1$s of %2$s available file storage. (%3$s&#37;)"
+msgstr "Sie verwenden %1$s von %2$s verfügbarem Dateispeicher. (%3$s&#37;)"
-#: ../../Zotlabs/Lib/Apps.php:233 ../../include/nav.php:210
-msgid "Mail"
-msgstr "Mail"
+#: ../../Zotlabs/Storage/Browser.php:317
+msgid "WARNING:"
+msgstr "WARNUNG:"
-#: ../../Zotlabs/Lib/Apps.php:236
-msgid "Chat"
-msgstr "Chat"
+#: ../../Zotlabs/Storage/Browser.php:327
+msgid ""
+"Please use DAV to upload large (video, audio) files.<br>See <a class=\"zrl\""
+" href=\"help/member/member_guide#Cloud_Desktop_Clients\">Cloud Desktop "
+"Clients</a>"
+msgstr "Bitte verwende DAV, um große Dateien (Audio, Video) hochzuladen.<br>Für weitere Informationen siehe <a class=\"zrl\" href=\"help/member/member_guide#Cloud_Desktop_Clients\">Cloud Desktop Clients</a>"
-#: ../../Zotlabs/Lib/Apps.php:238
-msgid "Probe"
-msgstr "Testen"
+#: ../../Zotlabs/Storage/Browser.php:331
+msgid "Create new folder"
+msgstr "Neuen Ordner anlegen"
-#: ../../Zotlabs/Lib/Apps.php:239
-msgid "Suggest"
-msgstr "Empfehlen"
+#: ../../Zotlabs/Storage/Browser.php:333
+msgid "Upload file"
+msgstr "Datei hochladen"
-#: ../../Zotlabs/Lib/Apps.php:240
-msgid "Random Channel"
-msgstr "Zufälliger Kanal"
+#: ../../Zotlabs/Storage/Browser.php:347
+msgid "Drop files here to immediately upload"
+msgstr "Dateien zum sofortigen Hochladen hier fallen lassen"
-#: ../../Zotlabs/Lib/Apps.php:241
-msgid "Invite"
-msgstr "Einladen"
+#: ../../Zotlabs/Widget/Forums.php:85
+msgid "Forums"
+msgstr "Foren"
-#: ../../Zotlabs/Lib/Apps.php:242 ../../include/widgets.php:1595
-msgid "Features"
-msgstr "Funktionen"
+#: ../../Zotlabs/Widget/Appcategories.php:39
+#: ../../Zotlabs/Widget/Tagcloud.php:25 ../../include/contact_widgets.php:91
+#: ../../include/taxonomy.php:188 ../../include/taxonomy.php:270
+msgid "Categories"
+msgstr "Kategorien"
-#: ../../Zotlabs/Lib/Apps.php:243
-#: ../../extend/addon/addon/openid/MysqlProvider.php:69
-msgid "Language"
-msgstr "Sprache"
+#: ../../Zotlabs/Widget/Appcategories.php:42 ../../Zotlabs/Widget/Filer.php:31
+#: ../../include/contact_widgets.php:56 ../../include/contact_widgets.php:94
+msgid "Everything"
+msgstr "Alles"
-#: ../../Zotlabs/Lib/Apps.php:244
-msgid "Post"
-msgstr "Beitrag schreiben"
+#: ../../Zotlabs/Widget/Eventstools.php:13
+msgid "Events Tools"
+msgstr "Kalenderwerkzeuge"
-#: ../../Zotlabs/Lib/Apps.php:245
-#: ../../extend/addon/addon/openid/MysqlProvider.php:58
-#: ../../extend/addon/addon/openid/MysqlProvider.php:59
-#: ../../extend/addon/addon/openid/MysqlProvider.php:60
-msgid "Profile Photo"
-msgstr "Profilfoto"
+#: ../../Zotlabs/Widget/Eventstools.php:14
+msgid "Export Calendar"
+msgstr "Kalender exportieren"
-#: ../../Zotlabs/Lib/Apps.php:355
-msgid "Purchase"
-msgstr "Kaufen"
+#: ../../Zotlabs/Widget/Eventstools.php:15
+msgid "Import Calendar"
+msgstr "Kalender importieren"
-#: ../../Zotlabs/Lib/Apps.php:359
-msgid "Undelete"
-msgstr "Wieder hergestellt"
+#: ../../Zotlabs/Widget/Suggestedchats.php:32
+msgid "Suggested Chatrooms"
+msgstr "Chatraum-Vorschläge"
-#: ../../Zotlabs/Lib/NativeWiki.php:126
-msgid "Wiki files deleted successfully"
-msgstr "Wiki-Dateien erfolgreich gelöscht"
+#: ../../Zotlabs/Widget/Mailmenu.php:13
+msgid "Private Mail Menu"
+msgstr "Private Nachrichten"
-#: ../../Zotlabs/Lib/Permcat.php:58
-msgctxt "permcat"
-msgid "default"
-msgstr "Standard"
+#: ../../Zotlabs/Widget/Mailmenu.php:15
+msgid "Combined View"
+msgstr "Kombinierte Anzeige"
-#: ../../Zotlabs/Lib/Permcat.php:96
-msgctxt "permcat"
-msgid "follower"
-msgstr "Abonnent"
+#: ../../Zotlabs/Widget/Mailmenu.php:20 ../../include/nav.php:195
+msgid "Inbox"
+msgstr "Eingang"
-#: ../../Zotlabs/Lib/Permcat.php:100
-msgctxt "permcat"
-msgid "contributor"
-msgstr "Beitragender"
+#: ../../Zotlabs/Widget/Mailmenu.php:25 ../../include/nav.php:196
+msgid "Outbox"
+msgstr "Ausgang"
-#: ../../Zotlabs/Lib/Permcat.php:104
-msgctxt "permcat"
-msgid "publisher"
-msgstr "Autor"
+#: ../../Zotlabs/Widget/Mailmenu.php:30 ../../include/nav.php:197
+msgid "New Message"
+msgstr "Neue Nachricht"
-#: ../../Zotlabs/Lib/NativeWikiPage.php:31
-#: ../../Zotlabs/Lib/NativeWikiPage.php:62
-msgid "(No Title)"
-msgstr "(Kein Titel)"
+#: ../../Zotlabs/Widget/Chatroom_list.php:16
+#: ../../include/conversation.php:1816 ../../include/conversation.php:1819
+#: ../../include/nav.php:425 ../../include/nav.php:428
+msgid "Chatrooms"
+msgstr "Chaträume"
-#: ../../Zotlabs/Lib/NativeWikiPage.php:76
-msgid "Wiki page create failed."
-msgstr "Anlegen der Wiki-Seite fehlgeschlagen."
+#: ../../Zotlabs/Widget/Chatroom_list.php:20
+msgid "Overview"
+msgstr "Ãœbersicht"
-#: ../../Zotlabs/Lib/NativeWikiPage.php:89
-msgid "Wiki not found."
-msgstr "Wiki nicht gefunden."
+#: ../../Zotlabs/Widget/Rating.php:51
+msgid "Rating Tools"
+msgstr "Bewertungswerkzeuge"
-#: ../../Zotlabs/Lib/NativeWikiPage.php:100
-msgid "Destination name already exists"
-msgstr "Zielname bereits vorhanden"
+#: ../../Zotlabs/Widget/Rating.php:55 ../../Zotlabs/Widget/Rating.php:57
+msgid "Rate Me"
+msgstr "Bewerte mich"
-#: ../../Zotlabs/Lib/NativeWikiPage.php:126
-#: ../../Zotlabs/Lib/NativeWikiPage.php:345
-msgid "Page not found"
-msgstr "Seite nicht gefunden"
+#: ../../Zotlabs/Widget/Rating.php:60
+msgid "View Ratings"
+msgstr "Bewertungen ansehen"
-#: ../../Zotlabs/Lib/NativeWikiPage.php:156
-msgid "Error reading page content"
-msgstr "Fehler beim Lesen des Seiteninhalts"
+#: ../../Zotlabs/Widget/Activity.php:50
+msgctxt "widget"
+msgid "Activity"
+msgstr "Aktivität"
-#: ../../Zotlabs/Lib/NativeWikiPage.php:338
-#: ../../Zotlabs/Lib/NativeWikiPage.php:383
-#: ../../Zotlabs/Lib/NativeWikiPage.php:450
-#: ../../Zotlabs/Lib/NativeWikiPage.php:491
-msgid "Error reading wiki"
-msgstr "Fehler beim Lesen des Wiki"
+#: ../../Zotlabs/Widget/Follow.php:22
+#, php-format
+msgid "You have %1$.0f of %2$.0f allowed connections."
+msgstr "Du bist %1$.0f von maximal %2$.0f erlaubten Verbindungen eingegangen."
-#: ../../Zotlabs/Lib/NativeWikiPage.php:371
-msgid "Page update failed."
-msgstr "Seitenaktualisierung fehlgeschlagen."
+#: ../../Zotlabs/Widget/Follow.php:29
+msgid "Add New Connection"
+msgstr "Neue Verbindung hinzufügen"
-#: ../../Zotlabs/Lib/NativeWikiPage.php:405
-msgid "Nothing deleted"
-msgstr "Nichts gelöscht"
+#: ../../Zotlabs/Widget/Follow.php:30
+msgid "Enter channel address"
+msgstr "Adresse des Kanals eingeben"
-#: ../../Zotlabs/Lib/NativeWikiPage.php:471
-msgid "Compare: object not found."
-msgstr "Vergleichen: Objekt nicht gefunden."
+#: ../../Zotlabs/Widget/Follow.php:31
+msgid "Examples: bob@example.com, https://example.com/barbara"
+msgstr "Beispiele: bob@beispiel.com, http://beispiel.com/barbara"
-#: ../../Zotlabs/Lib/NativeWikiPage.php:477
-msgid "Page updated"
-msgstr "Seite aktualisiert"
+#: ../../Zotlabs/Widget/Wiki_list.php:15 ../../addon/gitwiki/gitwiki.php:95
+msgid "Wiki List"
+msgstr "Wikiliste"
-#: ../../Zotlabs/Lib/NativeWikiPage.php:480
-msgid "Untitled"
-msgstr "Ohne Titel"
+#: ../../Zotlabs/Widget/Archive.php:43
+msgid "Archives"
+msgstr "Archive"
-#: ../../Zotlabs/Lib/NativeWikiPage.php:486
-msgid "Wiki resource_id required for git commit"
-msgstr ""
+#: ../../Zotlabs/Widget/Conversations.php:17
+#: ../../Zotlabs/Widget/Conversations.php:29
+msgid "Conversations"
+msgstr "Konversationen"
-#: ../../Zotlabs/Lib/NativeWikiPage.php:557
-#: ../../extend/addon/addon/gitwiki/gitwiki_backend.php:579
-#: ../../include/bbcode.php:610 ../../include/bbcode.php:756
-msgid "Different viewers will see this text differently"
-msgstr "Verschiedene Betrachter werden diesen Text unterschiedlich sehen"
+#: ../../Zotlabs/Widget/Conversations.php:21
+msgid "Received Messages"
+msgstr "Erhaltene Nachrichten"
-#: ../../extend/addon/addon/adultphotoflag/adultphotoflag.php:24
-msgid "Flag Adult Photos"
-msgstr "Nicht jugendfreie Fotos markieren"
+#: ../../Zotlabs/Widget/Conversations.php:25
+msgid "Sent Messages"
+msgstr "Gesendete Nachrichten"
-#: ../../extend/addon/addon/adultphotoflag/adultphotoflag.php:25
-msgid ""
-"Provide photo edit option to hide inappropriate photos from default album "
-"view"
-msgstr "Stellt eine Option zum Verstecken von Fotos mit unangemessenen Inhalten in der Standard-Albumansicht bereit"
+#: ../../Zotlabs/Widget/Conversations.php:39
+msgid "No messages."
+msgstr "Keine Nachrichten."
-#: ../../extend/addon/addon/chords/Mod_Chords.php:44
-msgid ""
-"This is a fairly comprehensive and complete guitar chord dictionary which "
-"will list most of the available ways to play a certain chord, starting from "
-"the base of the fingerboard up to a few frets beyond the twelfth fret "
-"(beyond which everything repeats). A couple of non-standard tunings are "
-"provided for the benefit of slide players, etc."
-msgstr ""
+#: ../../Zotlabs/Widget/Conversations.php:57
+msgid "Delete conversation"
+msgstr "Unterhaltung löschen"
-#: ../../extend/addon/addon/chords/Mod_Chords.php:46
-msgid ""
-"Chord names start with a root note (A-G) and may include sharps (#) and "
-"flats (b). This software will parse most of the standard naming conventions "
-"such as maj, min, dim, sus(2 or 4), aug, with optional repeating elements."
-msgstr ""
+#: ../../Zotlabs/Widget/Chatroom_members.php:11
+msgid "Chat Members"
+msgstr "Chatmitglieder"
-#: ../../extend/addon/addon/chords/Mod_Chords.php:48
-msgid ""
-"Valid examples include A, A7, Am7, Amaj7, Amaj9, Ammaj7, Aadd4, Asus2Add4, "
-"E7b13b11 ..."
-msgstr "Einige gültige Beispiele: A, A7, Am7, Amaj7, Amaj9, Ammaj7, Aadd4, Asus2Add4, E7b13b11 ..."
+#: ../../Zotlabs/Widget/Photo.php:48 ../../Zotlabs/Widget/Photo_rand.php:58
+msgid "photo/image"
+msgstr "Foto/Bild"
-#: ../../extend/addon/addon/chords/Mod_Chords.php:51
-msgid "Guitar Chords"
-msgstr "Gitarrenakkorde"
+#: ../../Zotlabs/Widget/Savedsearch.php:75
+msgid "Remove term"
+msgstr "Eintrag löschen"
-#: ../../extend/addon/addon/chords/Mod_Chords.php:52
-msgid "The complete online chord dictionary"
-msgstr "Das komplette online Akkord-Verzeichnis"
+#: ../../Zotlabs/Widget/Savedsearch.php:83 ../../include/features.php:301
+msgid "Saved Searches"
+msgstr "Gespeicherte Suchanfragen"
-#: ../../extend/addon/addon/chords/Mod_Chords.php:57
-msgid "Tuning"
-msgstr "Stimmen"
+#: ../../Zotlabs/Widget/Savedsearch.php:84 ../../include/group.php:336
+msgid "add"
+msgstr "hinzufügen"
-#: ../../extend/addon/addon/chords/Mod_Chords.php:58
-msgid "Chord name: example: Em7"
-msgstr "Beispiel Akkord Name: Em7"
+#: ../../Zotlabs/Widget/Notes.php:16
+msgid "Notes"
+msgstr "Notizen"
-#: ../../extend/addon/addon/chords/Mod_Chords.php:59
-msgid "Show for left handed stringing"
-msgstr "Linkshänder-Besaitung anzeigen"
+#: ../../Zotlabs/Widget/Wiki_pages.php:54 ../../addon/gitwiki/gitwiki.php:76
+msgid "Wiki Pages"
+msgstr "Wikiseiten"
-#: ../../extend/addon/addon/chords/chords.php:33
-msgid "Quick Reference"
-msgstr "Schnellreferenz"
+#: ../../Zotlabs/Widget/Wiki_pages.php:60 ../../addon/gitwiki/gitwiki.php:81
+msgid "Add new page"
+msgstr "Neue Seite hinzufügen"
-#: ../../extend/addon/addon/diaspora/import_diaspora.php:16
-msgid "No username found in import file."
-msgstr "Kein Benutzername in der Importdatei gefunden."
+#: ../../Zotlabs/Widget/Wiki_pages.php:61 ../../addon/gitwiki/gitwiki.php:82
+msgid "Page name"
+msgstr "Seitenname"
-#: ../../extend/addon/addon/diaspora/import_diaspora.php:41
-#: ../../include/import.php:51
-msgid "Unable to create a unique channel address. Import failed."
-msgstr "Es war nicht möglich, eine eindeutige Kanal-Adresse zu erzeugen. Der Import ist fehlgeschlagen."
+#: ../../Zotlabs/Widget/Affinity.php:49
+msgid "Refresh"
+msgstr "Aktualisieren"
-#: ../../extend/addon/addon/diaspora/diaspora.php:677
-msgid "Diaspora Protocol Settings updated."
-msgstr "Diaspora-Protokolleinstellungen aktualisiert."
+#: ../../Zotlabs/Widget/Tasklist.php:23
+msgid "Tasks"
+msgstr "Aufgaben"
-#: ../../extend/addon/addon/diaspora/diaspora.php:696
-msgid "Enable the Diaspora protocol for this channel"
-msgstr "Diaspora-Protokoll für diesen Kanal aktivieren"
+#: ../../Zotlabs/Widget/Suggestions.php:51
+msgid "Suggestions"
+msgstr "Vorschläge"
-#: ../../extend/addon/addon/diaspora/diaspora.php:700
-msgid "Allow any Diaspora member to comment on your public posts"
-msgstr "Jedem Diaspora-Mitglied erlauben, Deine öffentlichen Beiträge zu kommentieren"
+#: ../../Zotlabs/Widget/Suggestions.php:52
+msgid "See more..."
+msgstr "Mehr anzeigen …"
-#: ../../extend/addon/addon/diaspora/diaspora.php:704
-msgid "Prevent your hashtags from being redirected to other sites"
-msgstr "Verhindern, dass Deine hashtags zu anderen Seiten umgeleitet werden"
+#: ../../Zotlabs/Widget/Filer.php:28 ../../include/contact_widgets.php:53
+#: ../../include/features.php:390
+msgid "Saved Folders"
+msgstr "Gespeicherte Ordner"
-#: ../../extend/addon/addon/diaspora/diaspora.php:709
-msgid "Followed hashtags (comma separated, do not include the #)"
-msgstr "Verfolgte Hashtags (Komma separierte Liste, ohne die #)"
+#: ../../Zotlabs/Widget/Cover_photo.php:54
+msgid "Click to show more"
+msgstr "Klick, um mehr anzuzeigen"
-#: ../../extend/addon/addon/diaspora/diaspora.php:714
-msgid "Diaspora Protocol Settings"
-msgstr "Diaspora-Protokolleinstellungen"
+#: ../../Zotlabs/Widget/Admin.php:23 ../../Zotlabs/Widget/Admin.php:60
+msgid "Member registrations waiting for confirmation"
+msgstr "Nutzer-Anmeldungen, die auf Bestätigung warten"
-#: ../../extend/addon/addon/dirstats/dirstats.php:94
-msgid "Hubzilla Directory Stats"
-msgstr "Hubzilla-Verzeichnisstatistiken"
+#: ../../Zotlabs/Widget/Admin.php:29
+msgid "Inspect queue"
+msgstr "Warteschlange kontrollieren"
-#: ../../extend/addon/addon/dirstats/dirstats.php:95
-msgid "Total Hubs"
-msgstr "Hubs insgesamt"
+#: ../../Zotlabs/Widget/Admin.php:31
+msgid "DB updates"
+msgstr "DB-Aktualisierungen"
-#: ../../extend/addon/addon/dirstats/dirstats.php:97
-msgid "Hubzilla Hubs"
-msgstr "Hubzilla Hubs"
+#: ../../Zotlabs/Widget/Admin.php:55 ../../include/nav.php:215
+msgid "Admin"
+msgstr "Administration"
-#: ../../extend/addon/addon/dirstats/dirstats.php:99
-msgid "Friendica Hubs"
-msgstr "Friendica Hubs"
+#: ../../Zotlabs/Widget/Admin.php:56
+msgid "Plugin Features"
+msgstr "Plug-In Funktionen"
-#: ../../extend/addon/addon/dirstats/dirstats.php:101
-msgid "Diaspora Pods"
-msgstr "Diaspora Pods"
+#: ../../Zotlabs/Widget/Settings_menu.php:35
+msgid "Account settings"
+msgstr "Konto-Einstellungen"
-#: ../../extend/addon/addon/dirstats/dirstats.php:103
-msgid "Hubzilla Channels"
-msgstr "Hubzilla-Kanäle"
+#: ../../Zotlabs/Widget/Settings_menu.php:41
+msgid "Channel settings"
+msgstr "Kanal-Einstellungen"
-#: ../../extend/addon/addon/dirstats/dirstats.php:105
-msgid "Friendica Channels"
-msgstr "Friendica-Kanäle"
+#: ../../Zotlabs/Widget/Settings_menu.php:50
+msgid "Additional features"
+msgstr "Zusätzliche Funktionen"
-#: ../../extend/addon/addon/dirstats/dirstats.php:107
-msgid "Diaspora Channels"
-msgstr "Diaspora-Kanäle"
+#: ../../Zotlabs/Widget/Settings_menu.php:57
+msgid "Feature/Addon settings"
+msgstr "Plugin-Einstellungen"
-#: ../../extend/addon/addon/dirstats/dirstats.php:109
-msgid "Aged 35 and above"
-msgstr "35 und älter"
+#: ../../Zotlabs/Widget/Settings_menu.php:63
+msgid "Display settings"
+msgstr "Anzeige-Einstellungen"
-#: ../../extend/addon/addon/dirstats/dirstats.php:111
-msgid "Aged 34 and under"
-msgstr "34 und jünger"
+#: ../../Zotlabs/Widget/Settings_menu.php:70
+msgid "Manage locations"
+msgstr "Klon-Adressen verwalten"
-#: ../../extend/addon/addon/dirstats/dirstats.php:113
-msgid "Average Age"
-msgstr "Durchschnittsalter"
+#: ../../Zotlabs/Widget/Settings_menu.php:77
+msgid "Export channel"
+msgstr "Kanal exportieren"
-#: ../../extend/addon/addon/dirstats/dirstats.php:115
-msgid "Known Chatrooms"
-msgstr "Bekannte Chaträume"
+#: ../../Zotlabs/Widget/Settings_menu.php:83
+msgid "Connected apps"
+msgstr "Verbundene Apps"
-#: ../../extend/addon/addon/dirstats/dirstats.php:117
-msgid "Known Tags"
-msgstr "Bekannte Schlagwörter"
+#: ../../Zotlabs/Widget/Settings_menu.php:98 ../../include/features.php:153
+msgid "Permission Groups"
+msgstr "Berechtigungsrollen"
-#: ../../extend/addon/addon/dirstats/dirstats.php:119
-msgid ""
-"Please note Diaspora and Friendica statistics are merely those **this "
-"directory** is aware of, and not all those known in the network. This also "
-"applies to chatrooms,"
-msgstr "Bitte berücksichtige, dass Diaspora und Friendica Statistiken nur solche einschließen, die **diesem Verzeichnis** bekannt sind, nicht alle im Netzwerk bekannten. Das gilt auch für Chaträume."
+#: ../../Zotlabs/Widget/Settings_menu.php:115
+msgid "Premium Channel Settings"
+msgstr "Premium-Kanal-Einstellungen"
-#: ../../extend/addon/addon/donate/donate.php:21
-msgid "Project Servers and Resources"
-msgstr "Projektserver und -ressourcen"
+#: ../../Zotlabs/Widget/Bookmarkedchats.php:24
+msgid "Bookmarked Chatrooms"
+msgstr "Gespeicherte Chatrooms"
-#: ../../extend/addon/addon/donate/donate.php:22
-msgid "Project Creator and Tech Lead"
-msgstr "Projektersteller und Technischer Leiter"
+#: ../../util/nconfig.php:34
+msgid "Source channel not found."
+msgstr "Quellkanal nicht gefunden."
-#: ../../extend/addon/addon/donate/donate.php:23
-msgid "Admin, developer, directorymin, support bloke"
-msgstr "Administrator, Entwickler, Verzeichnis Betreibender, Supportleistende"
+#: ../../boot.php:1162 ../../addon/opensearch/opensearch.php:26
+#, php-format
+msgctxt "opensearch"
+msgid "Search %1$s (%2$s)"
+msgstr "Suche %1$s (%2$s)"
-#: ../../extend/addon/addon/donate/donate.php:50
-msgid ""
-"And the hundreds of other people and organisations who helped make the "
-"Hubzilla possible."
-msgstr "Und die hunderte anderen Menschen und Organisationen, die geholfen haben Hubzilla möglich zu machen."
+#: ../../boot.php:1162 ../../addon/opensearch/opensearch.php:28
+msgctxt "opensearch"
+msgid "$Projectname"
+msgstr "$Projectname"
+
+#: ../../boot.php:1609
+msgid "Create an account to access services and applications"
+msgstr "Erstelle ein Konto, um auf Dienste und Anwendungen zugreifen zu können."
+
+#: ../../boot.php:1628 ../../include/nav.php:103 ../../include/nav.php:127
+msgid "Logout"
+msgstr "Abmelden"
+
+#: ../../boot.php:1631
+msgid "Login/Email"
+msgstr "Anmelden/E-Mail"
+
+#: ../../boot.php:1632
+msgid "Password"
+msgstr "Kennwort"
+
+#: ../../boot.php:1633
+msgid "Remember me"
+msgstr "Angaben speichern"
+
+#: ../../boot.php:1636
+msgid "Forgot your password?"
+msgstr "Passwort vergessen?"
+
+#: ../../boot.php:2174
+msgid "toggle mobile"
+msgstr "auf/von mobile Ansicht wechseln"
+
+#: ../../boot.php:2327
+#, php-format
+msgid "[$Projectname] Website SSL error for %s"
+msgstr "[$Projectname] Webseiten-SSL-Fehler für %s"
+
+#: ../../boot.php:2332
+msgid "Website SSL certificate is not valid. Please correct."
+msgstr "Das SSL-Zertifikat der Website ist nicht gültig. Bitte beheben."
+
+#: ../../boot.php:2450
+#, php-format
+msgid "[$Projectname] Cron tasks not running on %s"
+msgstr "[$Projectname] Cron-Jobs laufen nicht auf %s"
+
+#: ../../boot.php:2455
+msgid "Cron/Scheduled tasks not running."
+msgstr "Cron-Aufgaben laufen nicht."
+
+#: ../../boot.php:2456 ../../include/datetime.php:286
+msgid "never"
+msgstr "Nie"
+
+#: ../../view/theme/redbasic/php/config.php:9
+msgid "Focus (Hubzilla default)"
+msgstr "Focus (Voreinstellung für Hubzilla)"
+
+#: ../../view/theme/redbasic/php/config.php:88
+msgid "Theme settings"
+msgstr "Theme-Einstellungen"
+
+#: ../../view/theme/redbasic/php/config.php:89
+msgid "Narrow navbar"
+msgstr "Schmale Navigationsleiste"
+
+#: ../../view/theme/redbasic/php/config.php:90
+msgid "Navigation bar background color"
+msgstr "Hintergrundfarbe der Navigationsleiste"
+
+#: ../../view/theme/redbasic/php/config.php:91
+msgid "Navigation bar icon color "
+msgstr "Farbe für die Icons der Navigationsleiste"
+
+#: ../../view/theme/redbasic/php/config.php:92
+msgid "Navigation bar active icon color "
+msgstr "Farbe für aktive Icons der Navigationsleiste"
+
+#: ../../view/theme/redbasic/php/config.php:93
+msgid "Link color"
+msgstr "Linkfarbe"
+
+#: ../../view/theme/redbasic/php/config.php:94
+msgid "Set font-color for banner"
+msgstr "Farbe der Schrift des Banners"
+
+#: ../../view/theme/redbasic/php/config.php:95
+msgid "Set the background color"
+msgstr "Hintergrundfarbe"
+
+#: ../../view/theme/redbasic/php/config.php:96
+msgid "Set the background image"
+msgstr "Hintergrundbild"
+
+#: ../../view/theme/redbasic/php/config.php:97
+msgid "Set the background color of items"
+msgstr "Hintergrundfarbe für Beiträge"
+
+#: ../../view/theme/redbasic/php/config.php:98
+msgid "Set the background color of comments"
+msgstr "Hintergrundfarbe für Kommentare"
+
+#: ../../view/theme/redbasic/php/config.php:99
+msgid "Set font-size for the entire application"
+msgstr "Schriftgröße für die gesamte Anwendung"
+
+#: ../../view/theme/redbasic/php/config.php:99
+msgid "Examples: 1rem, 100%, 16px"
+msgstr "Beispiele: 1rem, 100%, 16px"
+
+#: ../../view/theme/redbasic/php/config.php:100
+msgid "Set font-color for posts and comments"
+msgstr "Schriftfarbe für Beiträge und Kommentare"
+
+#: ../../view/theme/redbasic/php/config.php:101
+msgid "Set radius of corners"
+msgstr "Ecken-Radius"
+
+#: ../../view/theme/redbasic/php/config.php:101
+msgid "Example: 4px"
+msgstr "Beispiel: 4px"
+
+#: ../../view/theme/redbasic/php/config.php:102
+msgid "Set shadow depth of photos"
+msgstr "Schattentiefe von Fotos"
+
+#: ../../view/theme/redbasic/php/config.php:103
+msgid "Set maximum width of content region in pixel"
+msgstr "Maximalbreite des Inhaltsbereichs in Pixel festlegen"
+
+#: ../../view/theme/redbasic/php/config.php:103
+msgid "Leave empty for default width"
+msgstr "Leer lassen für Standardbreite"
+
+#: ../../view/theme/redbasic/php/config.php:104
+msgid "Left align page content"
+msgstr "Seiteninhalt linksbündig anzeigen"
+
+#: ../../view/theme/redbasic/php/config.php:105
+msgid "Set size of conversation author photo"
+msgstr "Größe der Avatare von Themenstartern"
-#: ../../extend/addon/addon/donate/donate.php:53
+#: ../../view/theme/redbasic/php/config.php:106
+msgid "Set size of followup author photos"
+msgstr "Größe der Avatare von Kommentatoren"
+
+#: ../../addon/rendezvous/rendezvous.php:57
+msgid "Errors encountered deleting database table "
+msgstr "Beim Löschen der Datenbanktabelle sind Fehler aufgetreten."
+
+#: ../../addon/rendezvous/rendezvous.php:95
+#: ../../addon/twitter/twitter.php:773
+msgid "Submit Settings"
+msgstr "Einstellungen absenden"
+
+#: ../../addon/rendezvous/rendezvous.php:96
+msgid "Drop tables when uninstalling?"
+msgstr "Lösche Tabellen beim Deinstallieren?"
+
+#: ../../addon/rendezvous/rendezvous.php:96
msgid ""
-"The Redmatrix/Hubzilla projects are provided primarily by volunteers giving "
-"their time and expertise - and often paying out of pocket for services they "
-"share with others."
-msgstr "Die Redmatrix/Hubzilla Projekte werden hauptsächlich von Freiwilligen bereitgestellt, die ihre Zeit und Expertise zur Verfügung stellen - und oft aus eigener Tasche für die Dienste zahlen, die sie mit anderen teilen."
+"If checked, the Rendezvous database tables will be deleted when the plugin "
+"is uninstalled."
+msgstr "Wenn ausgewählt, werden die Rendezvous-Tabellen in der Datenbank gelöscht, sobald das Plugin deinstalliert wird."
+
+#: ../../addon/rendezvous/rendezvous.php:97
+msgid "Mapbox Access Token"
+msgstr "Mapbox Zugangs-Token"
-#: ../../extend/addon/addon/donate/donate.php:54
+#: ../../addon/rendezvous/rendezvous.php:97
msgid ""
-"There is no corporate funding and no ads, and we do not collect and sell "
-"your personal information. (We don't control your personal information - "
-"<strong>you do</strong>.)"
-msgstr "Es gibt keine Finanzierung durch Firmen, keine Werbung und wir verkaufen Deine persönlichen Daten nicht. (Wir kontrollieren Deine persönlichen Daten nicht - <strong>das machst Du</strong>.)"
+"If you enter a Mapbox access token, it will be used to retrieve map tiles "
+"from Mapbox instead of the default OpenStreetMap tile server."
+msgstr "Wenn Du ein Mapbox Zugangs-Token eingibst, werden die Kartendaten (Kacheln) damit von Mapbox geladen, anstatt von OpenStreetMap, welches die Voreinstellung ist."
-#: ../../extend/addon/addon/donate/donate.php:55
+#: ../../addon/rendezvous/rendezvous.php:162
+msgid "Rendezvous"
+msgstr "Rendezvous"
+
+#: ../../addon/rendezvous/rendezvous.php:167
msgid ""
-"Help support our ground-breaking work in decentralisation, web identity, and"
-" privacy."
-msgstr "Hilf uns bei unserer wegweisenden Arbeit im Bereich der Dezantralisation, von Web-Identitäten und Privatsphäre."
+"This identity has been deleted by another member due to inactivity. Please "
+"press the \"New identity\" button or refresh the page to register a new "
+"identity. You may use the same name."
+msgstr "Diese Identität wurde von einem anderen Mitglied aufgrund von Inaktivität gelöscht. Bitte klicke auf \"Neue Identität\" oder aktualisiere die Website im Browser, um eine neue Identität zu registrieren. Du kannst dabei den selben Namen verwenden."
+
+#: ../../addon/rendezvous/rendezvous.php:168
+msgid "Welcome to Rendezvous!"
+msgstr "Willkommen bei Rendezvous!"
-#: ../../extend/addon/addon/donate/donate.php:57
+#: ../../addon/rendezvous/rendezvous.php:169
msgid ""
-"Your donations keep servers and services running and also helps us to "
-"provide innovative new features and continued development."
-msgstr "Die Spenden werden dafür verwendet Server und Dienste am laufen zu halten und helfen desweiteren innovative Neuerungen zu schaffen und die Entwicklung voran zu treiben."
+"Enter your name to join this rendezvous. To begin sharing your location with"
+" the other members, tap the GPS control. When your location is discovered, a"
+" red dot will appear and others will be able to see you on the map."
+msgstr "Gib Deinen Namen ein, um diesem Rendezvous beizutreten. Um Deinen Standort mit anderen Mitgliedern zu teilen, klicke auf das GPS Symbol. Sobald Dein Standort ermittelt ist, erscheint ein roter Punkt, und die Anderen werden Dich auf der Karte sehen können."
-#: ../../extend/addon/addon/donate/donate.php:60
-msgid "Donate"
-msgstr "Spenden"
+#: ../../addon/rendezvous/rendezvous.php:171
+msgid "Let's meet here"
+msgstr "Lasst uns hier treffen"
-#: ../../extend/addon/addon/donate/donate.php:62
+#: ../../addon/rendezvous/rendezvous.php:174
+msgid "New marker"
+msgstr "Neue Markierung"
+
+#: ../../addon/rendezvous/rendezvous.php:175
+msgid "Edit marker"
+msgstr "Markierung bearbeiten"
+
+#: ../../addon/rendezvous/rendezvous.php:176
+msgid "New identity"
+msgstr "Neue Identität"
+
+#: ../../addon/rendezvous/rendezvous.php:177
+msgid "Delete marker"
+msgstr "Markierung löschen"
+
+#: ../../addon/rendezvous/rendezvous.php:178
+msgid "Delete member"
+msgstr "Mitglied löschen"
+
+#: ../../addon/rendezvous/rendezvous.php:179
+msgid "Edit proximity alert"
+msgstr "Annäherungsalarm bearbeiten"
+
+#: ../../addon/rendezvous/rendezvous.php:180
msgid ""
-"Choose a project, developer, or public hub to support with a one-time "
-"donation"
-msgstr "Wähle ein Projekt, einen Entwickler oder einen öffentlichen Hub den du mit einer einmaligen Spende unterstützen willst."
+"A proximity alert will be issued when this member is within a certain radius"
+" of you.<br><br>Enter a radius in meters (0 to disable):"
+msgstr "Ein Annäherungsalarm wird ausgelöst werden, sobald sich dieses Mitglied innerhalb eines bestimmten Radius von Dir aufhält.<br><br>Gib einen Radius in Metern ein (0 zum Abschalten der Funktion):"
-#: ../../extend/addon/addon/donate/donate.php:63
-msgid "Donate Now"
-msgstr "Jetzt spenden"
+#: ../../addon/rendezvous/rendezvous.php:180
+#: ../../addon/rendezvous/rendezvous.php:185
+msgid "distance"
+msgstr "Entfernung"
+
+#: ../../addon/rendezvous/rendezvous.php:181
+msgid "Proximity alert distance (meters)"
+msgstr "Entfernung für Annäherungsalarm (in Metern)"
-#: ../../extend/addon/addon/donate/donate.php:64
+#: ../../addon/rendezvous/rendezvous.php:182
+#: ../../addon/rendezvous/rendezvous.php:184
msgid ""
-"<strong><em>Or</em></strong> become a project sponsor (Hubzilla Project "
-"only)"
-msgstr "<strong><em>Oder</em></strong> werde ein Unterstützer des Projekts (ausschließlich Hubzilla)"
+"A proximity alert will be issued when you are within a certain radius of the"
+" marker location.<br><br>Enter a radius in meters (0 to disable):"
+msgstr "Ein Annäherungsalarm wird ausgelöst werden, sobald Du Dich innerhalb eines bestimmten Radius der Markierung aufhält.<br><br>Gib einen Radius in Metern ein (0 zum Abschalten der Funktion):"
+
+#: ../../addon/rendezvous/rendezvous.php:183
+msgid "Marker proximity alert"
+msgstr "Annäherungsalarm für Markierung"
+
+#: ../../addon/rendezvous/rendezvous.php:186
+msgid "Reminder note"
+msgstr "Erinnerungshinweis"
-#: ../../extend/addon/addon/donate/donate.php:65
+#: ../../addon/rendezvous/rendezvous.php:187
msgid ""
-"Please indicate if you would like your first name or full name (or nothing) "
-"to appear in our sponsor listing"
-msgstr "Bitte teile uns mit ob dein kompletter Name oder dein Vorname (oder gar nichts) auf unserer Sponsoren-Seite veröffentlicht werden soll."
+"Enter a note to be displayed when you are within the specified proximity..."
+msgstr "Gib eine Nachricht ein, die angezeigt werden soll, wenn Du Dich in der festgelegten Nähe befindest..."
-#: ../../extend/addon/addon/donate/donate.php:66
-msgid "Sponsor"
-msgstr "Sponsor"
+#: ../../addon/rendezvous/rendezvous.php:199
+msgid "Add new rendezvous"
+msgstr "Neues Rendezvous hinzufügen"
-#: ../../extend/addon/addon/donate/donate.php:69
-msgid "Special thanks to: "
-msgstr "Besonderer Dank an: "
+#: ../../addon/rendezvous/rendezvous.php:200
+msgid ""
+"Create a new rendezvous and share the access link with those you wish to "
+"invite to the group. Those who open the link become members of the "
+"rendezvous. They can view other member locations, add markers to the map, or"
+" share their own locations with the group."
+msgstr "Erstelle ein neues Rendezvous und teile den Zugriffslink mit allen, die Du in die Gruppe einladen möchtest. Die, die den Link öffnen, werden Mitglieder des Rendezvous. Sie können die Standorte der anderen Mitglieder sehen, Marker zur Karte hinzufügen oder ihre eigenen Standorte mit der Gruppe teilen."
-#: ../../extend/addon/addon/dwpost/dwpost.php:42
-msgid "Post to Dreamwidth"
-msgstr "Bei Dreamwidth veröffentlichen"
+#: ../../addon/skeleton/skeleton.php:59
+msgid "Some setting"
+msgstr "Einige Einstellungen"
-#: ../../extend/addon/addon/dwpost/dwpost.php:73
-msgid "Enable Dreamwidth Post Plugin"
-msgstr "Aktiviere das Dreamwidth-Plugin"
+#: ../../addon/skeleton/skeleton.php:61
+msgid "A setting"
+msgstr "Eine Einstellung"
-#: ../../extend/addon/addon/dwpost/dwpost.php:77
-msgid "Dreamwidth username"
-msgstr "Dreamwidth-Benutzername"
+#: ../../addon/skeleton/skeleton.php:64
+msgid "Skeleton Settings"
+msgstr "Skeleton Einstellungen"
-#: ../../extend/addon/addon/dwpost/dwpost.php:81
-msgid "Dreamwidth password"
-msgstr "Dreamwidth-Passwort"
+#: ../../addon/gnusoc/gnusoc.php:119
+msgid "GNU-Social Protocol Settings updated."
+msgstr "GNU social Protokoll Einstellungen aktualisiert"
-#: ../../extend/addon/addon/dwpost/dwpost.php:85
-msgid "Post to Dreamwidth by default"
-msgstr "Standardmäßig auf auf Dreamwidth posten"
+#: ../../addon/gnusoc/gnusoc.php:130
+msgid "Enable the GNU-Social protocol for this channel"
+msgstr "Aktiviere das GNU social Protokoll für diesen Kanal"
-#: ../../extend/addon/addon/dwpost/dwpost.php:89
-msgid "Dreamwidth Post Settings"
-msgstr "Dreamwidth-Beitragseinstellungen"
+#: ../../addon/gnusoc/gnusoc.php:134
+msgid "GNU-Social Protocol Settings"
+msgstr "GNU social Protokoll Einstellungen"
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:45
-msgid "Flattr this!"
-msgstr "Flattr this!"
+#: ../../addon/gnusoc/gnusoc.php:324
+msgid "Follow"
+msgstr "Folgen"
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:83
-msgid "Flattr widget settings updated."
-msgstr "Flattr Widget Einstellungen aktualisiert"
+#: ../../addon/gnusoc/gnusoc.php:327
+#, php-format
+msgid "%1$s is now following %2$s"
+msgstr "%1$s folgt nun %2$s"
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:100
-msgid "Flattr user"
-msgstr "Flattr Nutzer"
+#: ../../addon/cdav/Mod_Cdav.php:744
+msgid "INVALID EVENT DISMISSED!"
+msgstr "UNGÃœLTIGEN TERMIN ABGELEHNT!"
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:104
-msgid "URL of the Thing to flattr"
-msgstr "URL des Dings zum flattrn"
+#: ../../addon/cdav/Mod_Cdav.php:745
+msgid "Summary: "
+msgstr "Zusammenfassung:"
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:104
-msgid "If empty channel URL is used"
-msgstr "Falls leer wird die Channel URL verwendet"
+#: ../../addon/cdav/Mod_Cdav.php:746
+msgid "Date: "
+msgstr "Datum:"
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:108
-msgid "Title of the Thing to flattr"
-msgstr "Titel des Dings zum flattrn"
+#: ../../addon/cdav/Mod_Cdav.php:747 ../../addon/cdav/Mod_Cdav.php:754
+msgid "Reason: "
+msgstr "Grund:"
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:108
-msgid "If empty \"channel name on The Hubzilla\" will be used"
-msgstr "Falls leer wird \"Kanalname auf The Hubzilla\" verwendet"
+#: ../../addon/cdav/Mod_Cdav.php:752
+msgid "INVALID CARD DISMISSED!"
+msgstr "UNGÃœLTIGE KARTE ABGELEHNT!"
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:112
-msgid "Static or dynamic flattr button"
-msgstr "Statischer oder dynamischer Flattr Button"
+#: ../../addon/cdav/Mod_Cdav.php:753
+msgid "Name: "
+msgstr "Name: "
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:112
-msgid "static"
-msgstr "statisch"
+#: ../../addon/cdav/Mod_Cdav.php:770
+msgid ""
+"You have to enable this plugin in Feature/Addon Settings > CalDAV/CardDAV "
+"Settings before you can use it."
+msgstr "Du musst dieses Plugin zunächst in Einstellungen > Plugin-Einstellungen > CalDAV/CardDAV-Einstellungen aktivieren, bevor Du es verwenden kannst."
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:112
-msgid "dynamic"
-msgstr "dynamisch"
+#: ../../addon/cdav/Mod_Cdav.php:836 ../../addon/cdav/Mod_Cdav.php:837
+msgid "Example: YYYY-MM-DD HH:mm"
+msgstr "Beispiel: JJJJ-MM-TT HH:mm"
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:116
-msgid "Alignment of the widget"
-msgstr "Ausrichtung des Widgets"
+#: ../../addon/cdav/Mod_Cdav.php:837
+msgid "End date and time"
+msgstr "Enddatum und -zeit"
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:116
-msgid "left"
-msgstr "links"
+#: ../../addon/cdav/Mod_Cdav.php:852
+msgid "List month"
+msgstr "Liste Monat"
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:116
-msgid "right"
-msgstr "rechts"
+#: ../../addon/cdav/Mod_Cdav.php:853
+msgid "List week"
+msgstr "Liste Woche"
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:120
-msgid "Enable Flattr widget"
-msgstr "Flattr Widget verwenden"
+#: ../../addon/cdav/Mod_Cdav.php:854
+msgid "List day"
+msgstr "Liste Tag"
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:124
-msgid "Flattr Widget Settings"
-msgstr "Flattr Widget Einstellungen"
+#: ../../addon/cdav/Mod_Cdav.php:861
+msgid "More"
+msgstr "Mehr"
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:118
-msgid "Contact not found."
-msgstr "Kontakt nicht gefunden."
+#: ../../addon/cdav/Mod_Cdav.php:862
+msgid "Less"
+msgstr "Weniger"
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:119
-msgid ""
-"This may occasionally happen if contact was requested by both persons and it"
-" has already been approved."
-msgstr "Dies kann unter Umständen passieren, wenn der Kontakt von beiden Seiten aus angefragt wurde und er bereits akzeptiert wurde.."
+#: ../../addon/cdav/Mod_Cdav.php:863
+msgid "Select calendar"
+msgstr "Kalender auswählen"
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:238
-msgid "Response from remote site was not understood."
-msgstr "Antwort des entfernten Seite war unverständlich."
+#: ../../addon/cdav/Mod_Cdav.php:865
+msgid "Delete all"
+msgstr "Alles löschen"
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:247
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:252
-msgid "Unexpected response from remote site: "
-msgstr "Unerwartete Antwort der entfernten Seite"
+#: ../../addon/cdav/Mod_Cdav.php:867
+msgid "Sorry! Editing of recurrent events is not yet implemented."
+msgstr "Entschuldigung, aber das Bearbeiten von wiederkehrenden Veranstaltungen ist leider noch nicht implementiert."
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:261
-msgid "Confirmation completed successfully."
-msgstr "Bestätigung erfolgreich abgeschlossen."
+#: ../../addon/cdav/cdav.php:36
+msgid "Errors encountered creating database table: "
+msgstr "Fehler beim Anlegen der Datenbank-Tabellen aufgetreten."
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:263
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:277
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:284
-msgid "Remote site reported: "
-msgstr "Meldung der entfernten Seite"
+#: ../../addon/cdav/cdav.php:197
+msgid "Default Calendar"
+msgstr "Standardkalender"
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:275
-msgid "Temporary failure. Please wait and try again."
-msgstr "Vorübergehende Störung. Bitte warte einen Moment und versuche es später erneut."
+#: ../../addon/cdav/cdav.php:206
+msgid "Default Addressbook"
+msgstr "Standardadressbuch"
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:282
-msgid "Introduction failed or was revoked."
-msgstr "Vorstellung fehlgeschlagen oder wurde zurück gezogen."
+#: ../../addon/cdav/cdav.php:215
+msgid "CalDAV/CardDAV Settings saved."
+msgstr "CalDAV/CardDAV-Einstellungen gespeichert."
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:428
-msgid "Unable to set contact photo."
-msgstr "Konnte das Kontakt-Photo nicht setzen."
+#: ../../addon/cdav/cdav.php:234
+msgid "Enable CalDAV/CardDAV Server for this channel"
+msgstr "Aktiviere den CalDAV/CardDAV Server für diesen Kanal"
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:485
+#: ../../addon/cdav/cdav.php:237
#, php-format
-msgid "%1$s is now friends with %2$s"
-msgstr "%1$s ist nun mit %2$s befreundet"
+msgid "Your CalDAV resources are located at %s "
+msgstr "Deine CalDAV Resourcen sind unter %s verfügbar"
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:570
+#: ../../addon/cdav/cdav.php:240
#, php-format
-msgid "No user record found for '%s' "
-msgstr "Kein Benutzereintrag für '%s' gefunden"
+msgid "Your CardDAV resources are located at %s "
+msgstr "Deine CardDAV Ressourcen sind unter %s verfügbar"
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:580
-msgid "Our site encryption key is apparently messed up."
-msgstr "Der Verschlüsselungsschlüssel unserer Seite ist anscheinend kaputt."
+#: ../../addon/cdav/cdav.php:246
+msgid "CalDAV/CardDAV Settings"
+msgstr "CalDAV/CardDAV-Einstellungen"
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:591
-msgid "Empty site URL was provided or URL could not be decrypted by us."
-msgstr "Eine leere Seiten URL wurde angegeben, oder die URL konnte von uns nicht entziffert werden."
+#: ../../addon/cdav/cdav.php:272 ../../include/connections.php:670
+msgid "Home, Voice"
+msgstr "Zuhause, Sprache"
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:612
-msgid "Contact record was not found for you on our site."
-msgstr "Für dich wurden keinerlei Kontaktdaten auf unserer Seite gefunden."
+#: ../../addon/cdav/cdav.php:273 ../../include/connections.php:671
+msgid "Home, Fax"
+msgstr "Zuhause, Fax"
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:626
-#, php-format
-msgid "Site public key not available in contact record for URL %s."
-msgstr "Der öffentliche Schlüssel dieser Seite ist für die Kontaktdaten mit der URL %s nocht verfügbar."
+#: ../../addon/cdav/cdav.php:275 ../../include/connections.php:673
+msgid "Work, Voice"
+msgstr "Arbeit, Sprache"
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:646
-msgid ""
-"The ID provided by your system is a duplicate on our system. It should work "
-"if you try again."
-msgstr "Die ID, die Durch Dein System angegeben wurde ist ein Duplikat auf unserem. Es sollte funktionieren, wenn Du es noch einmal versuchst."
+#: ../../addon/cdav/cdav.php:276 ../../include/connections.php:674
+msgid "Work, Fax"
+msgstr "Arbeit, Fax"
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:657
-msgid "Unable to set your contact credentials on our system."
-msgstr ""
+#: ../../addon/cdav/include/widgets.php:37
+msgid "Select Channel"
+msgstr "Kanal auswählen"
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:724
-msgid "Unable to update your contact profile details on our system"
-msgstr "Konnte die Details deines Profils auf unserem System nicht aktualisieren."
+#: ../../addon/cdav/include/widgets.php:42
+msgid "Read-write"
+msgstr "Lesen-schreiben"
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:751
-#: ../../extend/addon/addon/friendica/dfrn_request.php:749
-msgid "[Name Withheld]"
-msgstr "[Name zurück gehalten]"
+#: ../../addon/cdav/include/widgets.php:43
+msgid "Read-only"
+msgstr "Nur Lesen"
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:796
-#, php-format
-msgid "%1$s has joined %2$s"
-msgstr "%1$s ist %2$s beigetreten"
+#: ../../addon/cdav/include/widgets.php:116
+msgid "My Calendars"
+msgstr "Meine Kalender"
-#: ../../extend/addon/addon/friendica/dfrn_poll.php:103
-#: ../../extend/addon/addon/friendica/dfrn_poll.php:536
-#, php-format
-msgid "%1$s welcomes %2$s"
-msgstr "%1$s heißt %2$s willkommen"
+#: ../../addon/cdav/include/widgets.php:118
+msgid "Shared Calendars"
+msgstr "Geteilte Kalender"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:102
-msgid "This introduction has already been accepted."
-msgstr "Die Vorstellung wurde bereits akzeptiert."
+#: ../../addon/cdav/include/widgets.php:122
+msgid "Share this calendar"
+msgstr "Diesen Kalender teilen"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:123
-#: ../../extend/addon/addon/friendica/dfrn_request.php:528
-msgid "Profile location is not valid or does not contain profile information."
-msgstr "Die angegebenen Profil Lokalität ist nicht gültig oder enthält keine Profil-Informationen."
+#: ../../addon/cdav/include/widgets.php:124
+msgid "Calendar name and color"
+msgstr "Kalendername und -farbe"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:128
-#: ../../extend/addon/addon/friendica/dfrn_request.php:533
-msgid "Warning: profile location has no identifiable owner name."
-msgstr ""
+#: ../../addon/cdav/include/widgets.php:126
+msgid "Create new calendar"
+msgstr "Neuen Kalender erstellen"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:130
-#: ../../extend/addon/addon/friendica/dfrn_request.php:535
-msgid "Warning: profile location has no profile photo."
-msgstr "Warnung: Beim angegebenen Profil liegt kein Profil-Bild bei."
+#: ../../addon/cdav/include/widgets.php:128
+msgid "Calendar Name"
+msgstr "Kalendername"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:133
-#: ../../extend/addon/addon/friendica/dfrn_request.php:538
-#, php-format
-msgid "%d required parameter was not found at the given location"
-msgid_plural "%d required parameters were not found at the given location"
-msgstr[0] "Konnte %d benötigten Parameter an der angegebenen Stelle nicht finden."
-msgstr[1] "Konnte %d benötigte Parameter an der angegebenen Stelle nicht finden."
+#: ../../addon/cdav/include/widgets.php:129
+msgid "Calendar Tools"
+msgstr "Kalenderwerkzeuge"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:180
-msgid "Introduction complete."
-msgstr "Einführung abgeschlossen."
+#: ../../addon/cdav/include/widgets.php:130
+msgid "Import calendar"
+msgstr "Kalender importieren"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:224
-msgid "Unrecoverable protocol error."
-msgstr "Nicht behebbarer Protokollfehler."
+#: ../../addon/cdav/include/widgets.php:131
+msgid "Select a calendar to import to"
+msgstr "Kalender zum Hineinimportieren auswählen"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:252
-msgid "Profile unavailable."
-msgstr "Profil nicht verfügbar."
+#: ../../addon/cdav/include/widgets.php:158
+msgid "Addressbooks"
+msgstr "Adressbücher"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:277
-#, php-format
-msgid "%s has received too many connection requests today."
-msgstr "%s hat heute bereits zu viele Kontaktanfragen erhalten."
+#: ../../addon/cdav/include/widgets.php:160
+msgid "Addressbook name"
+msgstr "Adressbuchname"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:278
-msgid "Spam protection measures have been invoked."
-msgstr "Maßnahmen zum Spam-Schutz wurden aktiviert."
+#: ../../addon/cdav/include/widgets.php:162
+msgid "Create new addressbook"
+msgstr "Neues Adressbuch erstellen"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:279
-msgid "Friends are advised to please try again in 24 hours."
-msgstr "Freunde sollten es bitte in 24 Stunden erneut versuchen."
+#: ../../addon/cdav/include/widgets.php:163
+msgid "Addressbook Name"
+msgstr "Adressbuchname"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:341
-msgid "Invalid locator"
-msgstr ""
+#: ../../addon/cdav/include/widgets.php:165
+msgid "Addressbook Tools"
+msgstr "Adressbuchwerkzeuge"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:350
-msgid "Invalid email address."
-msgstr "Ungültige E-Mail-Adresse."
+#: ../../addon/cdav/include/widgets.php:166
+msgid "Import addressbook"
+msgstr "Adressbuch importieren"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:377
-msgid "This account has not been configured for email. Request failed."
-msgstr "Dieser Account wurde nicht für E-Mail konfiguriert. Anfrage gescheitert."
+#: ../../addon/cdav/include/widgets.php:167
+msgid "Select an addressbook to import to"
+msgstr "Adressbuch zum Hineinimportieren auswählen"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:473
-msgid "Unable to resolve your name at the provided location."
-msgstr "Konnte deinen Namen nicht bei der angegebenen Stelle ermitteln."
+#: ../../addon/planets/planets.php:121
+msgid "Planets Settings updated."
+msgstr "Planeten Einstellungen aktualisiert"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:486
-msgid "You have already introduced yourself here."
-msgstr "Du hast dich hier bereits vorgestellt."
+#: ../../addon/planets/planets.php:153
+msgid "Enable Planets Plugin"
+msgstr "Aktiviere Planeten Plugin"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:490
-#, php-format
-msgid "Apparently you are already friends with %s."
-msgstr "Anscheinend bist du bereits mit %s in Kontakt."
+#: ../../addon/planets/planets.php:157
+msgid "Planets Settings"
+msgstr "Planeten Einstellungen"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:511
-msgid "Invalid profile URL."
-msgstr "Ungültige Profil-URL."
+#: ../../addon/openclipatar/openclipatar.php:50
+#: ../../addon/openclipatar/openclipatar.php:128
+msgid "System defaults:"
+msgstr "Systemstandardeinstellungen:"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:517
-msgid "Disallowed profile URL."
-msgstr "Nicht erlaubte Profil-URL."
+#: ../../addon/openclipatar/openclipatar.php:54
+msgid "Preferred Clipart IDs"
+msgstr "Bevorzugte Clipart-IDs"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:587
-msgid "Failed to update contact record."
-msgstr "Konnte den Verbindungseintrag nicht aktualisieren."
+#: ../../addon/openclipatar/openclipatar.php:54
+msgid "List of preferred clipart ids. These will be shown first."
+msgstr "Liste bevorzugter Clipart-IDs. Diese werden zuerst angezeigt."
-#: ../../extend/addon/addon/friendica/dfrn_request.php:608
-msgid "Your introduction has been sent."
-msgstr "Deine Vorstellung wurde gesendet."
+#: ../../addon/openclipatar/openclipatar.php:55
+msgid "Default Search Term"
+msgstr "Standard-Suchbegriff"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:662
-msgid "Please login to confirm introduction."
-msgstr "Bitte melde dich an um die Vorstellung zu bestätigen."
+#: ../../addon/openclipatar/openclipatar.php:55
+msgid "The default search term. These will be shown second."
+msgstr "Der Standard-Suchbegriff. Dieser wird an zweiter Stelle angezeigt."
-#: ../../extend/addon/addon/friendica/dfrn_request.php:676
-msgid ""
-"Incorrect identity currently logged in. Please login to "
-"<strong>this</strong> profile."
-msgstr ""
+#: ../../addon/openclipatar/openclipatar.php:56
+msgid "Return After"
+msgstr "Zurückkehren nach"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:690
-#: ../../extend/addon/addon/friendica/dfrn_request.php:707
-msgid "Confirm"
-msgstr "Bestätigen"
+#: ../../addon/openclipatar/openclipatar.php:56
+msgid "Page to load after image selection."
+msgstr "Die Seite, die nach Auswahl eines Bildes geladen werden soll."
-#: ../../extend/addon/addon/friendica/dfrn_request.php:702
-msgid "Hide this contact"
-msgstr "Diesen Kontakt verbergen"
+#: ../../addon/openclipatar/openclipatar.php:58 ../../include/channel.php:1048
+#: ../../include/nav.php:111
+msgid "Edit Profile"
+msgstr "Profil bearbeiten"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:705
-#, php-format
-msgid "Welcome home %s."
-msgstr "Willkommen daheim %s"
+#: ../../addon/openclipatar/openclipatar.php:59
+msgid "Profile List"
+msgstr "Profilliste"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:706
-#, php-format
-msgid "Please confirm your introduction/connection request to %s."
-msgstr "Bitte bestätige deine Vorstellung/Kontaktanfrage bei %s."
+#: ../../addon/openclipatar/openclipatar.php:61
+msgid "Order of Preferred"
+msgstr "Reihenfolge der Bevorzugten"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:836
-msgid ""
-"Please enter your 'Identity Address' from one of the following supported "
-"communications networks:"
-msgstr "Bitte gib deine \"Identitäts Adresse\" von einem der folgenden unterstützten Kommunikations Netzwerke an."
+#: ../../addon/openclipatar/openclipatar.php:61
+msgid "Sort order of preferred clipart ids."
+msgstr "Sortierreihenfolge der bevorzugten Clipart-IDs."
-#: ../../extend/addon/addon/friendica/dfrn_request.php:857
-#, php-format
-msgid ""
-"If you are not yet a member of the free social web, <a "
-"href=\"%s/siteinfo\">follow this link to find a public Friendica site and "
-"join us today</a>."
-msgstr ""
+#: ../../addon/openclipatar/openclipatar.php:62
+#: ../../addon/openclipatar/openclipatar.php:68
+msgid "Newest first"
+msgstr "Neueste zuerst"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:862
-msgid "Friend/Connection Request"
-msgstr "Freundschafts-/Verbindungsanfrage"
+#: ../../addon/openclipatar/openclipatar.php:65
+msgid "As entered"
+msgstr "Wie eingegeben"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:863
-msgid ""
-"Examples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, "
-"testuser@identi.ca"
-msgstr "Beispiele: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, testuser@identi.ca"
+#: ../../addon/openclipatar/openclipatar.php:67
+msgid "Order of other"
+msgstr "Sortierung aller anderen"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:864
-msgid "Please answer the following:"
-msgstr "Bitte beantworten Sie folgendes:"
+#: ../../addon/openclipatar/openclipatar.php:67
+msgid "Sort order of other clipart ids."
+msgstr "Sortierreihenfolge der übrigen Clipart-IDs."
-#: ../../extend/addon/addon/friendica/dfrn_request.php:865
-#, php-format
-msgid "Does %s know you?"
-msgstr "Kennt %s Sie?"
+#: ../../addon/openclipatar/openclipatar.php:69
+msgid "Most downloaded first"
+msgstr "Meist heruntergeladene zuerst"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:869
-msgid "Add a personal note:"
-msgstr "Eine persönliche Nachricht hinterlassen:"
+#: ../../addon/openclipatar/openclipatar.php:70
+msgid "Most liked first"
+msgstr "Beliebteste zuerst"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:871
-#: ../../include/network.php:2242 ../../include/network.php:2243
-msgid "Friendica"
-msgstr "Friendica"
+#: ../../addon/openclipatar/openclipatar.php:72
+msgid "Preferred IDs Message"
+msgstr "Nachricht für bevorzugte IDs"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:872
-msgid "StatusNet/Federated Social Web"
-msgstr "StatusNet/Föderierte Soziale Netzwerke"
+#: ../../addon/openclipatar/openclipatar.php:72
+msgid "Message to display above preferred results."
+msgstr "Nachricht, die über den Ergebnissen mit den bevorzugten IDs angezeigt werden soll."
-#: ../../extend/addon/addon/friendica/dfrn_request.php:873
-#: ../../include/network.php:2248
-msgid "Diaspora"
-msgstr "Diaspora"
+#: ../../addon/openclipatar/openclipatar.php:78
+msgid "Uploaded by: "
+msgstr "Hochgeladen von: "
-#: ../../extend/addon/addon/friendica/dfrn_request.php:874
-#, php-format
+#: ../../addon/openclipatar/openclipatar.php:78
+msgid "Drawn by: "
+msgstr "Gezeichnet von: "
+
+#: ../../addon/openclipatar/openclipatar.php:192
+msgid "Or select from a free OpenClipart.org image:"
+msgstr "Oder wähle ein freies Bild von OpenClipart.org:"
+
+#: ../../addon/openclipatar/openclipatar.php:195
+msgid "Search Term"
+msgstr "Suchbegriff"
+
+#: ../../addon/openclipatar/openclipatar.php:232
+msgid "Unknown error. Please try again later."
+msgstr "Unbekannter Fehler. Bitte versuchen Sie es später erneut."
+
+#: ../../addon/openclipatar/openclipatar.php:308
+msgid "Profile photo updated successfully."
+msgstr "Profilfoto erfolgreich aktualisiert."
+
+#: ../../addon/adultphotoflag/adultphotoflag.php:24
+msgid "Flag Adult Photos"
+msgstr "Nicht jugendfreie Fotos markieren"
+
+#: ../../addon/adultphotoflag/adultphotoflag.php:25
msgid ""
-" - please do not use this form. Instead, enter %s into your Diaspora search"
-" bar."
-msgstr "- bitte verwende nicht dieses Formular sondern gib %s in die Suchleiste deiner Diaspora Seite ein."
+"Provide photo edit option to hide inappropriate photos from default album "
+"view"
+msgstr "Stellt eine Option zum Verstecken von Fotos mit unangemessenen Inhalten in der Standard-Albumansicht bereit"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:875
-msgid "Your Identity Address:"
-msgstr "Ihre Identitätsadresse:"
+#: ../../addon/wppost/wppost.php:45
+msgid "Post to WordPress"
+msgstr "Auf WordPress posten"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:878
-msgid "Submit Request"
-msgstr "Anfrage absenden"
+#: ../../addon/wppost/wppost.php:82
+msgid "Enable WordPress Post Plugin"
+msgstr "Aktiviere das WordPress-Plugin"
-#: ../../extend/addon/addon/friendica/friendica.php:113
-#: ../../extend/addon/addon/gnusoc/gnusoc.php:118
-msgid "GNU-Social Protocol Settings updated."
-msgstr "GNU Social Protokoll Einstellungen aktualisiert"
+#: ../../addon/wppost/wppost.php:86
+msgid "WordPress username"
+msgstr "WordPress-Benutzername"
-#: ../../extend/addon/addon/friendica/friendica.php:124
-msgid "Enable the (experimental) GNU-Social protocol for this channel"
-msgstr "GNU Social Protokoll (experimentell) für diesen Kanal aktualisieren"
+#: ../../addon/wppost/wppost.php:90
+msgid "WordPress password"
+msgstr "WordPress-Passwort"
-#: ../../extend/addon/addon/friendica/friendica.php:128
-#: ../../extend/addon/addon/gnusoc/gnusoc.php:133
-msgid "GNU-Social Protocol Settings"
-msgstr "GNU Social Protokoll Einstellungen"
+#: ../../addon/wppost/wppost.php:94
+msgid "WordPress API URL"
+msgstr "WordPress-API-URL"
-#: ../../extend/addon/addon/friendica/friendica.php:185
-#: ../../extend/addon/addon/gnusoc/gnusoc.php:323
-msgid "Follow"
-msgstr "Folgen"
+#: ../../addon/wppost/wppost.php:95
+msgid "Typically https://your-blog.tld/xmlrpc.php"
+msgstr "Normalerweise https://your-blog.tld/xmlrpc.php"
-#: ../../extend/addon/addon/friendica/friendica.php:188
-#: ../../extend/addon/addon/gnusoc/gnusoc.php:326
-#, php-format
-msgid "%1$s is now following %2$s"
-msgstr "%1$s folgt nun %2$s"
+#: ../../addon/wppost/wppost.php:98
+msgid "WordPress blogid"
+msgstr "WordPress blogid"
-#: ../../extend/addon/addon/frphotos/frphotos.php:91
-msgid "Friendica Photo Album Import"
-msgstr "Friendica-Fotoalbumimport"
+#: ../../addon/wppost/wppost.php:99
+msgid "For multi-user sites such as wordpress.com, otherwise leave blank"
+msgstr "Nötig für Mehrbenutzer Seiten wie wordpress.com, andernfalls frei lassen"
-#: ../../extend/addon/addon/frphotos/frphotos.php:92
-msgid "This will import all your Friendica photo albums to this Red channel."
-msgstr "Hiermit werden all deine Fotoalben von Friendica in diesen Hubzilla Kanal importiert."
+#: ../../addon/wppost/wppost.php:105
+msgid "Post to WordPress by default"
+msgstr "Standardmäßig auf auf WordPress posten"
-#: ../../extend/addon/addon/frphotos/frphotos.php:93
-msgid "Friendica Server base URL"
-msgstr "BasisURL des Friendica Servers"
+#: ../../addon/wppost/wppost.php:109
+msgid "Forward comments (requires hubzilla_wp plugin)"
+msgstr "Kommentare weiterleiten (benötigt hubzilla_wp Plugin)"
-#: ../../extend/addon/addon/frphotos/frphotos.php:94
-msgid "Friendica Login Username"
-msgstr "Friendica-Anmeldebenutzername"
+#: ../../addon/wppost/wppost.php:113
+msgid "WordPress Post Settings"
+msgstr "WordPress-Beitragseinstellungen"
-#: ../../extend/addon/addon/frphotos/frphotos.php:95
-msgid "Friendica Login Password"
-msgstr "Friendica-Anmeldepasswort"
+#: ../../addon/wppost/wppost.php:129
+msgid "Wordpress Settings saved."
+msgstr "Wordpress-Einstellungen gespeichert."
-#: ../../extend/addon/addon/hubwall/hubwall.php:19
-msgid "Send email to all members"
-msgstr "E-Mail an alle Mitglieder senden"
+#: ../../addon/nsfw/nsfw.php:80
+msgid ""
+"This plugin looks in posts for the words/text you specify below, and "
+"collapses any content containing those keywords so it is not displayed at "
+"inappropriate times, such as sexual innuendo that may be improper in a work "
+"setting. It is polite and recommended to tag any content containing nudity "
+"with #NSFW. This filter can also match any other word/text you specify, and"
+" can thereby be used as a general purpose content filter."
+msgstr ""
-#: ../../extend/addon/addon/hubwall/hubwall.php:33
-#, php-format
-msgid "$1%s Administrator"
-msgstr "$1%s Administrator"
+#: ../../addon/nsfw/nsfw.php:84
+msgid "Enable Content filter"
+msgstr "Inhaltsfilter aktivieren"
-#: ../../extend/addon/addon/hubwall/hubwall.php:50
-#: ../../extend/addon/addon/mailtest/mailtest.php:50
-msgid "No recipients found."
-msgstr "Keine Empfänger gefunden."
+#: ../../addon/nsfw/nsfw.php:88
+msgid "Comma separated list of keywords to hide"
+msgstr "Kommaseparierte Liste von Schlüsselworten die verborgen werden sollen."
-#: ../../extend/addon/addon/hubwall/hubwall.php:73
-#, php-format
-msgid "%1$d of %2$d messages sent."
-msgstr "%1$d von %2$d Nachrichten gesendet."
+#: ../../addon/nsfw/nsfw.php:88
+msgid "Word, /regular-expression/, lang=xx, lang!=xx"
+msgstr ""
-#: ../../extend/addon/addon/hubwall/hubwall.php:81
-msgid "Send email to all hub members."
-msgstr "Eine E-Mail an alle Mitglieder dieses Hubs senden."
+#: ../../addon/nsfw/nsfw.php:92
+msgid "Not Safe For Work Settings"
+msgstr "Not Safe For Work Einstellungen"
-#: ../../extend/addon/addon/hubwall/hubwall.php:92
-#: ../../extend/addon/addon/mailtest/mailtest.php:96
-msgid "Message subject"
-msgstr "Betreff der Nachricht"
+#: ../../addon/nsfw/nsfw.php:92
+msgid "General Purpose Content Filter"
+msgstr "Allzweck-Inhaltsfilter"
-#: ../../extend/addon/addon/hubwall/hubwall.php:93
-msgid "Sender Email address"
-msgstr "E-Mail Adresse des Absenders"
+#: ../../addon/nsfw/nsfw.php:110
+msgid "NSFW Settings saved."
+msgstr "NSFW-Einstellungen gespeichert."
-#: ../../extend/addon/addon/hubwall/hubwall.php:94
-msgid "Test mode (only send to hub administrator)"
-msgstr "Test Modus (nur an Hub Administratoren senden)"
+#: ../../addon/nsfw/nsfw.php:207
+msgid "Possible adult content"
+msgstr "Möglicherweise nicht jugendfreie Inhalte"
-#: ../../extend/addon/addon/ijpost/ijpost.php:42
+#: ../../addon/nsfw/nsfw.php:211
+#, php-format
+msgid "%s - view"
+msgstr "%s - ansehen"
+
+#: ../../addon/ijpost/ijpost.php:42
msgid "Post to Insanejournal"
msgstr "Bei InsaneJournal veröffentlichen"
-#: ../../extend/addon/addon/ijpost/ijpost.php:73
+#: ../../addon/ijpost/ijpost.php:73
msgid "Enable InsaneJournal Post Plugin"
msgstr "Aktiviere das InsaneJournal Plugin"
-#: ../../extend/addon/addon/ijpost/ijpost.php:77
+#: ../../addon/ijpost/ijpost.php:77
msgid "InsaneJournal username"
msgstr "InsaneJournal-Benutzername"
-#: ../../extend/addon/addon/ijpost/ijpost.php:81
+#: ../../addon/ijpost/ijpost.php:81
msgid "InsaneJournal password"
msgstr "InsaneJournal-Passwort"
-#: ../../extend/addon/addon/ijpost/ijpost.php:85
+#: ../../addon/ijpost/ijpost.php:85
msgid "Post to InsaneJournal by default"
msgstr "Standardmäßig bei InsaneJournal veröffentlichen"
-#: ../../extend/addon/addon/ijpost/ijpost.php:89
+#: ../../addon/ijpost/ijpost.php:89
msgid "InsaneJournal Post Settings"
msgstr "InsaneJournal-Beitragseinstellungen"
-#: ../../extend/addon/addon/ijpost/ijpost.php:104
+#: ../../addon/ijpost/ijpost.php:104
msgid "Insane Journal Settings saved."
msgstr "InsaneJournal-Einstellungen gespeichert."
-#: ../../extend/addon/addon/irc/irc.php:45
-msgid "Channels to auto connect"
-msgstr "Kanäle zur automatischen Verbindung"
+#: ../../addon/js_upload/js_upload.php:44
+msgid "Upload a file"
+msgstr "Datei hochladen"
-#: ../../extend/addon/addon/irc/irc.php:45
-#: ../../extend/addon/addon/irc/irc.php:49
-msgid "Comma separated list"
-msgstr "Kommagetrennte Liste"
+#: ../../addon/js_upload/js_upload.php:45
+msgid "Drop files here to upload"
+msgstr "Dateien zum Hochladen hier fallen lassen"
-#: ../../extend/addon/addon/irc/irc.php:49
-#: ../../extend/addon/addon/irc/irc.php:96
-msgid "Popular Channels"
-msgstr "Beliebte Kanäle"
+#: ../../addon/js_upload/js_upload.php:47
+msgid "Failed"
+msgstr "Fehlgeschlagen"
-#: ../../extend/addon/addon/irc/irc.php:53
-msgid "IRC Settings"
-msgstr "IRC-Einstellungen"
+#: ../../addon/js_upload/js_upload.php:315
+msgid "No files were uploaded."
+msgstr "Es wurden keine Dateien hochgeladen."
-#: ../../extend/addon/addon/irc/irc.php:69
-msgid "IRC settings saved."
-msgstr "IRC-Einstellungen gespeichert."
+#: ../../addon/js_upload/js_upload.php:322
+msgid "Uploaded file is empty"
+msgstr "Hochgeladene Datei ist leer"
-#: ../../extend/addon/addon/irc/irc.php:74
-msgid "IRC Chatroom"
-msgstr "IRC-Chatraum"
+#: ../../addon/js_upload/js_upload.php:335
+msgid "Image exceeds size limit of "
+msgstr "Bild überschreitet Größenbeschränkung von "
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:305
-#: ../../include/channel.php:1139 ../../include/channel.php:1301
-msgid "Status:"
-msgstr "Status:"
+#: ../../addon/js_upload/js_upload.php:347
+msgid "File has an invalid extension, it should be one of "
+msgstr "Die Datei hat eine ungültige Endung. Erlaubt sind folgende:"
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:309
-msgid "Activate addon"
-msgstr "Addon aktiviren"
+#: ../../addon/js_upload/js_upload.php:359
+msgid "Upload was cancelled, or server error encountered"
+msgstr "Das Hochladen wurde abgebrochen oder es ist ein Serverfehler aufgetreten."
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:313
-msgid "Hide Jappixmini Chat-Widget from the webinterface"
-msgstr "Jappix Mini Chat-Widget von der Weboberfläche verbergen"
+#: ../../addon/dwpost/dwpost.php:42
+msgid "Post to Dreamwidth"
+msgstr "Bei Dreamwidth veröffentlichen"
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:318
-msgid "Jabber username"
-msgstr "Jabber-Benutzername"
+#: ../../addon/dwpost/dwpost.php:73
+msgid "Enable Dreamwidth Post Plugin"
+msgstr "Aktiviere das Dreamwidth-Plugin"
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:324
-msgid "Jabber server"
-msgstr "Jabber-Server"
+#: ../../addon/dwpost/dwpost.php:77
+msgid "Dreamwidth username"
+msgstr "Dreamwidth-Benutzername"
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:330
-msgid "Jabber BOSH host URL"
-msgstr "Jabber BOSH Host URL"
+#: ../../addon/dwpost/dwpost.php:81
+msgid "Dreamwidth password"
+msgstr "Dreamwidth-Passwort"
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:337
-msgid "Jabber password"
-msgstr "Jabber-Passwort"
+#: ../../addon/dwpost/dwpost.php:85
+msgid "Post to Dreamwidth by default"
+msgstr "Standardmäßig auf auf Dreamwidth posten"
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:343
-msgid "Encrypt Jabber password with Hubzilla password"
-msgstr "Jabber-Passwort mit Hubzilla-Passwort verschlüsseln"
+#: ../../addon/dwpost/dwpost.php:89
+msgid "Dreamwidth Post Settings"
+msgstr "Dreamwidth-Beitragseinstellungen"
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:347
-#: ../../extend/addon/addon/redred/redred.php:115
-msgid "Hubzilla password"
-msgstr "Hubzilla-Passwort"
+#: ../../addon/firefox/firefox.php:23
+msgid "Install Firefox Sharing Tools"
+msgstr ""
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:351
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:355
-msgid "Approve subscription requests from Hubzilla contacts automatically"
+#: ../../addon/firefox/firefox.php:34
+msgid "Share content from Firefox to $Projectname"
+msgstr "Inhalte von Firefox nach $Projectname teilen"
+
+#: ../../addon/firefox/firefox.php:37
+msgid "Install Firefox Sharing Tools to this web browser"
msgstr ""
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:359
-msgid "Purge internal list of jabber addresses of contacts"
-msgstr "Interne Liste der Jabber Adressen von Kontakten löschen"
+#: ../../addon/dirstats/dirstats.php:94
+msgid "Hubzilla Directory Stats"
+msgstr "Hubzilla-Verzeichnisstatistiken"
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:364
-msgid "Configuration Help"
-msgstr "Konfigurationshilfe"
+#: ../../addon/dirstats/dirstats.php:95
+msgid "Total Hubs"
+msgstr "Hubs insgesamt"
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:371
-msgid "Jappix Mini Settings"
-msgstr "Jappix Mini Einstellungen"
+#: ../../addon/dirstats/dirstats.php:97
+msgid "Hubzilla Hubs"
+msgstr "Hubzilla Hubs"
-#: ../../extend/addon/addon/js_upload/js_upload.php:44
-msgid "Upload a file"
-msgstr "Datei hochladen"
+#: ../../addon/dirstats/dirstats.php:99
+msgid "Friendica Hubs"
+msgstr "Friendica Hubs"
-#: ../../extend/addon/addon/js_upload/js_upload.php:45
-msgid "Drop files here to upload"
-msgstr "Dateien zum Hochladen hier fallen lassen"
+#: ../../addon/dirstats/dirstats.php:101
+msgid "Diaspora Pods"
+msgstr "Diaspora Pods"
-#: ../../extend/addon/addon/js_upload/js_upload.php:47
-msgid "Failed"
-msgstr "Fehlgeschlagen"
+#: ../../addon/dirstats/dirstats.php:103
+msgid "Hubzilla Channels"
+msgstr "Hubzilla-Kanäle"
-#: ../../extend/addon/addon/js_upload/js_upload.php:315
-msgid "No files were uploaded."
-msgstr "Es wurden keine Dateien hochgeladen."
+#: ../../addon/dirstats/dirstats.php:105
+msgid "Friendica Channels"
+msgstr "Friendica-Kanäle"
-#: ../../extend/addon/addon/js_upload/js_upload.php:322
-msgid "Uploaded file is empty"
-msgstr "Hochgeladene Datei ist leer"
+#: ../../addon/dirstats/dirstats.php:107
+msgid "Diaspora Channels"
+msgstr "Diaspora-Kanäle"
-#: ../../extend/addon/addon/js_upload/js_upload.php:335
-msgid "Image exceeds size limit of "
-msgstr "Bild überschreitet Größenbeschränkung von "
+#: ../../addon/dirstats/dirstats.php:109
+msgid "Aged 35 and above"
+msgstr "35 und älter"
-#: ../../extend/addon/addon/js_upload/js_upload.php:347
-msgid "File has an invalid extension, it should be one of "
-msgstr "Die Datei hat eine ungültige Endung. Erlaubt sind folgende:"
+#: ../../addon/dirstats/dirstats.php:111
+msgid "Aged 34 and under"
+msgstr "34 und jünger"
-#: ../../extend/addon/addon/js_upload/js_upload.php:359
-msgid "Upload was cancelled, or server error encountered"
-msgstr "Das Hochladen wurde abgebrochen oder es ist ein Serverfehler aufgetreten."
+#: ../../addon/dirstats/dirstats.php:113
+msgid "Average Age"
+msgstr "Durchschnittsalter"
-#: ../../extend/addon/addon/ldapauth/ldapauth.php:61
-msgid "An account has been created for you."
-msgstr "Ein Konto wurde für Sie erstellt."
+#: ../../addon/dirstats/dirstats.php:115
+msgid "Known Chatrooms"
+msgstr "Bekannte Chaträume"
-#: ../../extend/addon/addon/ldapauth/ldapauth.php:68
-msgid "Authentication successful but rejected: account creation is disabled."
-msgstr "Authentifizierung war erfolgreich wurde aber abgewiesen! Das Anlegen von Accounts wurde deaktiviert."
+#: ../../addon/dirstats/dirstats.php:117
+msgid "Known Tags"
+msgstr "Bekannte Schlagwörter"
-#: ../../extend/addon/addon/libertree/libertree.php:38
-msgid "Post to Libertree"
-msgstr "Bei Libertree veröffentlichen"
+#: ../../addon/dirstats/dirstats.php:119
+msgid ""
+"Please note Diaspora and Friendica statistics are merely those **this "
+"directory** is aware of, and not all those known in the network. This also "
+"applies to chatrooms,"
+msgstr "Bitte berücksichtige, dass Diaspora und Friendica Statistiken nur solche einschließen, die **diesem Verzeichnis** bekannt sind, nicht alle im Netzwerk bekannten. Das gilt auch für Chaträume."
-#: ../../extend/addon/addon/libertree/libertree.php:69
-msgid "Enable Libertree Post Plugin"
-msgstr "Aktivire das Libertree-Plugin"
+#: ../../addon/mailhost/mailhost.php:36
+msgid "Email notification hub"
+msgstr "Hub für E-Mail-Benachrichtigungen"
-#: ../../extend/addon/addon/libertree/libertree.php:73
-msgid "Libertree API token"
-msgstr "Libertree API Token"
+#: ../../addon/mailhost/mailhost.php:36
+msgid "Hostname"
+msgstr "Servername"
-#: ../../extend/addon/addon/libertree/libertree.php:77
-msgid "Libertree site URL"
-msgstr "URL der Libertree Seite"
+#: ../../addon/mailhost/mailhost.php:40
+msgid "Mailhost Settings"
+msgstr "Mailhost-Einstellungen"
-#: ../../extend/addon/addon/libertree/libertree.php:81
-msgid "Post to Libertree by default"
-msgstr "Standardmäßig bei Libertree veröffentlichen"
+#: ../../addon/mailhost/mailhost.php:54
+msgid "MAILHOST Settings saved."
+msgstr "MAILHOST-Einstellungen gespeichert."
-#: ../../extend/addon/addon/libertree/libertree.php:85
-msgid "Libertree Post Settings"
-msgstr "Libertree-Beitragseinstellungen"
+#: ../../addon/likebanner/likebanner.php:51
+msgid "Your Webbie:"
+msgstr "Dein Webbie"
-#: ../../extend/addon/addon/libertree/libertree.php:99
-msgid "Libertree Settings saved."
-msgstr "Libertree-Einstellungen gespeichert."
+#: ../../addon/likebanner/likebanner.php:54
+msgid "Fontsize (px):"
+msgstr "Schriftgröße (px):"
+
+#: ../../addon/likebanner/likebanner.php:68
+msgid "Link:"
+msgstr "Link:"
+
+#: ../../addon/likebanner/likebanner.php:70
+msgid "Like us on Hubzilla"
+msgstr "Like us on Hubzilla"
+
+#: ../../addon/likebanner/likebanner.php:72
+msgid "Embed:"
+msgstr "Einbetten"
+
+#: ../../addon/redphotos/redphotos.php:106
+msgid "Photos imported"
+msgstr "Fotos importiert"
+
+#: ../../addon/redphotos/redphotos.php:129
+msgid "Redmatrix Photo Album Import"
+msgstr "Redmatrix-Fotoalbumimport"
+
+#: ../../addon/redphotos/redphotos.php:130
+msgid "This will import all your Redmatrix photo albums to this channel."
+msgstr "Hiermit werden all deine Fotoalben von Redmatrix in diesen Kanal importiert."
+
+#: ../../addon/redphotos/redphotos.php:131
+#: ../../addon/redfiles/redfiles.php:121
+msgid "Redmatrix Server base URL"
+msgstr "Basis-URL des Redmatrix Servers"
+
+#: ../../addon/redphotos/redphotos.php:132
+#: ../../addon/redfiles/redfiles.php:122
+msgid "Redmatrix Login Username"
+msgstr "Redmatrix-Anmeldebenutzername"
+
+#: ../../addon/redphotos/redphotos.php:133
+#: ../../addon/redfiles/redfiles.php:123
+msgid "Redmatrix Login Password"
+msgstr "Redmatrix-Anmeldepasswort"
+
+#: ../../addon/redphotos/redphotos.php:134
+msgid "Import just this album"
+msgstr "Nur dieses Album importieren"
+
+#: ../../addon/redphotos/redphotos.php:134
+msgid "Leave blank to import all albums"
+msgstr "Leer lassen um alle Alben zu importieren"
+
+#: ../../addon/redphotos/redphotos.php:135
+msgid "Maximum count to import"
+msgstr "Maximal zu importierende Anzahl"
+
+#: ../../addon/redphotos/redphotos.php:135
+msgid "0 or blank to import all available"
+msgstr "0 oder leer lassen um alles zu importieren"
+
+#: ../../addon/irc/irc.php:45
+msgid "Channels to auto connect"
+msgstr "Kanäle zur automatischen Verbindung"
-#: ../../extend/addon/addon/ljpost/ljpost.php:42
+#: ../../addon/irc/irc.php:45 ../../addon/irc/irc.php:49
+msgid "Comma separated list"
+msgstr "Kommagetrennte Liste"
+
+#: ../../addon/irc/irc.php:49 ../../addon/irc/irc.php:96
+msgid "Popular Channels"
+msgstr "Beliebte Kanäle"
+
+#: ../../addon/irc/irc.php:53
+msgid "IRC Settings"
+msgstr "IRC-Einstellungen"
+
+#: ../../addon/irc/irc.php:69
+msgid "IRC settings saved."
+msgstr "IRC-Einstellungen gespeichert."
+
+#: ../../addon/irc/irc.php:74
+msgid "IRC Chatroom"
+msgstr "IRC-Chatraum"
+
+#: ../../addon/ljpost/ljpost.php:42
msgid "Post to LiveJournal"
msgstr "Bei LiveJurnal veröffentlichen"
-#: ../../extend/addon/addon/ljpost/ljpost.php:70
+#: ../../addon/ljpost/ljpost.php:70
msgid "Enable LiveJournal Post Plugin"
msgstr "Aktiviere das LiveJurnal Plugin"
-#: ../../extend/addon/addon/ljpost/ljpost.php:74
+#: ../../addon/ljpost/ljpost.php:74
msgid "LiveJournal username"
msgstr "LiveJournal-Benutzername"
-#: ../../extend/addon/addon/ljpost/ljpost.php:78
+#: ../../addon/ljpost/ljpost.php:78
msgid "LiveJournal password"
msgstr "LiveJournal-Passwort"
-#: ../../extend/addon/addon/ljpost/ljpost.php:82
+#: ../../addon/ljpost/ljpost.php:82
msgid "Post to LiveJournal by default"
msgstr "Standardmäßig bei LiveJurnal veröffentlichen"
-#: ../../extend/addon/addon/ljpost/ljpost.php:86
+#: ../../addon/ljpost/ljpost.php:86
msgid "LiveJournal Post Settings"
msgstr "LiveJournal-Beitragseinstellungen"
-#: ../../extend/addon/addon/ljpost/ljpost.php:101
+#: ../../addon/ljpost/ljpost.php:101
msgid "LiveJournal Settings saved."
msgstr "LiveJournal-Einstellungen gespeichert."
-#: ../../extend/addon/addon/logrot/logrot.php:36
-msgid "Logfile archive directory"
-msgstr "Verzeichnis der Logdatei"
-
-#: ../../extend/addon/addon/logrot/logrot.php:36
-msgid "Directory to store rotated logs"
-msgstr "Verzeichnis, in dem rotierte Logs gespeichert werden sollen"
-
-#: ../../extend/addon/addon/logrot/logrot.php:37
-msgid "Logfile size in bytes before rotating"
-msgstr "zu erreichende Logdateigröße in Bytes, bevor rotiert wird"
+#: ../../addon/openid/openid.php:49
+msgid ""
+"We encountered a problem while logging in with the OpenID you provided. "
+"Please check the correct spelling of the ID."
+msgstr "Wir haben ein Problem mit der OpenID festgestellt, mit der Du Dich anmelden wolltest. Bitte überprüfe sie noch einmal."
-#: ../../extend/addon/addon/logrot/logrot.php:38
-msgid "Number of logfiles to retain"
-msgstr "Anzahl aufzubewahrender rotierter Logdateien"
+#: ../../addon/openid/openid.php:49
+msgid "The error message was:"
+msgstr "Die Fehlermeldung war:"
-#: ../../extend/addon/addon/mailhost/mailhost.php:36
-msgid "Email notification hub"
-msgstr "Hub für E-Mail-Benachrichtigungen"
+#: ../../addon/openid/MysqlProvider.php:52
+msgid "First Name"
+msgstr "Vorname"
-#: ../../extend/addon/addon/mailhost/mailhost.php:36
-msgid "Hostname"
-msgstr "Servername"
+#: ../../addon/openid/MysqlProvider.php:53
+msgid "Last Name"
+msgstr "Nachname"
-#: ../../extend/addon/addon/mailhost/mailhost.php:40
-msgid "Mailhost Settings"
-msgstr "Mailhost-Einstellungen"
+#: ../../addon/openid/MysqlProvider.php:54 ../../addon/redred/redred.php:111
+msgid "Nickname"
+msgstr "Spitzname"
-#: ../../extend/addon/addon/mailhost/mailhost.php:54
-msgid "MAILHOST Settings saved."
-msgstr "MAILHOST-Einstellungen gespeichert."
+#: ../../addon/openid/MysqlProvider.php:55
+msgid "Full Name"
+msgstr "Voller Name"
-#: ../../extend/addon/addon/moremoods/moremoods.php:19
-msgid "lonely"
-msgstr "einsam"
+#: ../../addon/openid/MysqlProvider.php:61
+msgid "Profile Photo 16px"
+msgstr "Profilfoto 16 px"
-#: ../../extend/addon/addon/moremoods/moremoods.php:20
-msgid "drunk"
-msgstr "betrunken"
+#: ../../addon/openid/MysqlProvider.php:62
+msgid "Profile Photo 32px"
+msgstr "Profilfoto 32 px"
-#: ../../extend/addon/addon/moremoods/moremoods.php:21
-msgid "horny"
-msgstr "geil"
+#: ../../addon/openid/MysqlProvider.php:63
+msgid "Profile Photo 48px"
+msgstr "Profilfoto 48 px"
-#: ../../extend/addon/addon/moremoods/moremoods.php:22
-msgid "stoned"
-msgstr "bekifft"
+#: ../../addon/openid/MysqlProvider.php:64
+msgid "Profile Photo 64px"
+msgstr "Profilfoto 64 px"
-#: ../../extend/addon/addon/moremoods/moremoods.php:23
-msgid "fucked up"
-msgstr "beschissen"
+#: ../../addon/openid/MysqlProvider.php:65
+msgid "Profile Photo 80px"
+msgstr "Profilfoto 80 px"
-#: ../../extend/addon/addon/moremoods/moremoods.php:24
-msgid "clusterfucked"
-msgstr "clusterfucked"
+#: ../../addon/openid/MysqlProvider.php:66
+msgid "Profile Photo 128px"
+msgstr "Profilfoto 128 px"
-#: ../../extend/addon/addon/moremoods/moremoods.php:25
-msgid "crazy"
-msgstr "verrückt"
+#: ../../addon/openid/MysqlProvider.php:67
+msgid "Timezone"
+msgstr "Zeitzone"
-#: ../../extend/addon/addon/moremoods/moremoods.php:26
-msgid "hurt"
-msgstr "verletzt"
+#: ../../addon/openid/MysqlProvider.php:70
+msgid "Birth Year"
+msgstr "Geburtsjahr"
-#: ../../extend/addon/addon/moremoods/moremoods.php:27
-msgid "sleepy"
-msgstr "müde"
+#: ../../addon/openid/MysqlProvider.php:71
+msgid "Birth Month"
+msgstr "Geburtsmonat"
-#: ../../extend/addon/addon/moremoods/moremoods.php:28
-msgid "grumpy"
-msgstr "mürrisch"
+#: ../../addon/openid/MysqlProvider.php:72
+msgid "Birth Day"
+msgstr "Geburtstag"
-#: ../../extend/addon/addon/moremoods/moremoods.php:29
-msgid "high"
-msgstr "hoch"
+#: ../../addon/openid/MysqlProvider.php:73
+msgid "Birthdate"
+msgstr "Geburtsdatum"
-#: ../../extend/addon/addon/moremoods/moremoods.php:30
-msgid "semi-conscious"
-msgstr "halb bewusstlos"
+#: ../../addon/openid/Mod_Openid.php:30
+msgid "OpenID protocol error. No ID returned."
+msgstr "OpenID-Protokollfehler. Keine Kennung zurückgegeben."
-#: ../../extend/addon/addon/moremoods/moremoods.php:31
-msgid "in love"
-msgstr "verliebt"
+#: ../../addon/openid/Mod_Openid.php:188 ../../include/auth.php:286
+msgid "Login failed."
+msgstr "Login fehlgeschlagen."
-#: ../../extend/addon/addon/moremoods/moremoods.php:32
-msgid "in lust"
-msgstr ""
+#: ../../addon/openid/Mod_Id.php:85 ../../include/selectors.php:49
+#: ../../include/selectors.php:66
+msgid "Male"
+msgstr "Männlich"
-#: ../../extend/addon/addon/moremoods/moremoods.php:33
-msgid "naked"
-msgstr "nackt"
+#: ../../addon/openid/Mod_Id.php:87 ../../include/selectors.php:49
+#: ../../include/selectors.php:66
+msgid "Female"
+msgstr "Weiblich"
-#: ../../extend/addon/addon/moremoods/moremoods.php:34
-msgid "stinky"
-msgstr "stinkend"
+#: ../../addon/randpost/randpost.php:97
+msgid "You're welcome."
+msgstr "Gern geschehen."
-#: ../../extend/addon/addon/moremoods/moremoods.php:35
-msgid "sweaty"
-msgstr "verschwitzt"
+#: ../../addon/randpost/randpost.php:98
+msgid "Ah shucks..."
+msgstr ""
-#: ../../extend/addon/addon/moremoods/moremoods.php:36
-msgid "bleeding out"
-msgstr "blutend"
+#: ../../addon/randpost/randpost.php:99
+msgid "Don't mention it."
+msgstr "Keine Ursache."
-#: ../../extend/addon/addon/moremoods/moremoods.php:37
-msgid "victorious"
-msgstr "siegreich"
+#: ../../addon/randpost/randpost.php:100
+msgid "&lt;blush&gt;"
+msgstr ""
-#: ../../extend/addon/addon/moremoods/moremoods.php:38
-msgid "defeated"
-msgstr "besiegt"
+#: ../../addon/startpage/startpage.php:109
+msgid "Page to load after login"
+msgstr "Seite, die nach dem Login geladen werden soll"
-#: ../../extend/addon/addon/moremoods/moremoods.php:39
-msgid "envious"
-msgstr "neidisch"
+#: ../../addon/startpage/startpage.php:109
+msgid ""
+"Examples: &quot;apps&quot;, &quot;network?f=&gid=37&quot; (privacy "
+"collection), &quot;channel&quot; or &quot;notifications/system&quot; (leave "
+"blank for default network page (grid)."
+msgstr "Beispiele: &quot;apps&quot;, &quot;network?f=&gid=37&quot; (Gruppen-gefilterte Beiträge), &quot;channel&quot; oder &quot;notifications/system&quot; (freilassen für die Standard-Netzwerkseite (grid)."
-#: ../../extend/addon/addon/moremoods/moremoods.php:40
-msgid "jealous"
-msgstr "eifersüchtig"
+#: ../../addon/startpage/startpage.php:113
+msgid "Startpage Settings"
+msgstr "Startseiteneinstellungen"
-#: ../../extend/addon/addon/morepokes/morepokes.php:19
+#: ../../addon/morepokes/morepokes.php:19
msgid "bitchslap"
msgstr "Ohrfeige"
-#: ../../extend/addon/addon/morepokes/morepokes.php:19
+#: ../../addon/morepokes/morepokes.php:19
msgid "bitchslapped"
msgstr "geohrfeigt"
-#: ../../extend/addon/addon/morepokes/morepokes.php:20
+#: ../../addon/morepokes/morepokes.php:20
msgid "shag"
msgstr "bumsen"
-#: ../../extend/addon/addon/morepokes/morepokes.php:20
+#: ../../addon/morepokes/morepokes.php:20
msgid "shagged"
msgstr "gebumst"
-#: ../../extend/addon/addon/morepokes/morepokes.php:21
+#: ../../addon/morepokes/morepokes.php:21
msgid "patent"
msgstr "Patent"
-#: ../../extend/addon/addon/morepokes/morepokes.php:21
+#: ../../addon/morepokes/morepokes.php:21
msgid "patented"
msgstr "patentiert"
-#: ../../extend/addon/addon/morepokes/morepokes.php:22
+#: ../../addon/morepokes/morepokes.php:22
msgid "hug"
msgstr "umarmen"
-#: ../../extend/addon/addon/morepokes/morepokes.php:22
+#: ../../addon/morepokes/morepokes.php:22
msgid "hugged"
msgstr "umarmt"
-#: ../../extend/addon/addon/morepokes/morepokes.php:23
+#: ../../addon/morepokes/morepokes.php:23
msgid "murder"
msgstr "ermorden"
-#: ../../extend/addon/addon/morepokes/morepokes.php:23
+#: ../../addon/morepokes/morepokes.php:23
msgid "murdered"
msgstr "ermordet"
-#: ../../extend/addon/addon/morepokes/morepokes.php:24
+#: ../../addon/morepokes/morepokes.php:24
msgid "worship"
msgstr "Anbetung"
-#: ../../extend/addon/addon/morepokes/morepokes.php:24
+#: ../../addon/morepokes/morepokes.php:24
msgid "worshipped"
msgstr "angebetet"
-#: ../../extend/addon/addon/morepokes/morepokes.php:25
+#: ../../addon/morepokes/morepokes.php:25
msgid "kiss"
msgstr "küssen"
-#: ../../extend/addon/addon/morepokes/morepokes.php:25
+#: ../../addon/morepokes/morepokes.php:25
msgid "kissed"
msgstr "geküsst"
-#: ../../extend/addon/addon/morepokes/morepokes.php:26
+#: ../../addon/morepokes/morepokes.php:26
msgid "tempt"
msgstr "verlocken"
-#: ../../extend/addon/addon/morepokes/morepokes.php:26
+#: ../../addon/morepokes/morepokes.php:26
msgid "tempted"
msgstr "verlockt"
-#: ../../extend/addon/addon/morepokes/morepokes.php:27
+#: ../../addon/morepokes/morepokes.php:27
msgid "raise eyebrows at"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:27
+#: ../../addon/morepokes/morepokes.php:27
msgid "raised their eyebrows at"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:28
+#: ../../addon/morepokes/morepokes.php:28
msgid "insult"
msgstr "beleidigen"
-#: ../../extend/addon/addon/morepokes/morepokes.php:28
+#: ../../addon/morepokes/morepokes.php:28
msgid "insulted"
msgstr "beleidigt"
-#: ../../extend/addon/addon/morepokes/morepokes.php:29
+#: ../../addon/morepokes/morepokes.php:29
msgid "praise"
msgstr "loben"
-#: ../../extend/addon/addon/morepokes/morepokes.php:29
+#: ../../addon/morepokes/morepokes.php:29
msgid "praised"
msgstr "gelobt"
-#: ../../extend/addon/addon/morepokes/morepokes.php:30
+#: ../../addon/morepokes/morepokes.php:30
msgid "be dubious of"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:30
+#: ../../addon/morepokes/morepokes.php:30
msgid "was dubious of"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:31
+#: ../../addon/morepokes/morepokes.php:31
msgid "eat"
msgstr "essen"
-#: ../../extend/addon/addon/morepokes/morepokes.php:31
+#: ../../addon/morepokes/morepokes.php:31
msgid "ate"
msgstr "aß"
-#: ../../extend/addon/addon/morepokes/morepokes.php:32
+#: ../../addon/morepokes/morepokes.php:32
msgid "giggle and fawn at"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:32
+#: ../../addon/morepokes/morepokes.php:32
msgid "giggled and fawned at"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:33
+#: ../../addon/morepokes/morepokes.php:33
msgid "doubt"
msgstr "anzweifeln"
-#: ../../extend/addon/addon/morepokes/morepokes.php:33
+#: ../../addon/morepokes/morepokes.php:33
msgid "doubted"
msgstr "angezweifelt"
-#: ../../extend/addon/addon/morepokes/morepokes.php:34
+#: ../../addon/morepokes/morepokes.php:34
msgid "glare"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:34
+#: ../../addon/morepokes/morepokes.php:34
msgid "glared at"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:35
+#: ../../addon/morepokes/morepokes.php:35
msgid "fuck"
msgstr "ficken"
-#: ../../extend/addon/addon/morepokes/morepokes.php:35
+#: ../../addon/morepokes/morepokes.php:35
msgid "fucked"
msgstr "gefickt"
-#: ../../extend/addon/addon/morepokes/morepokes.php:36
+#: ../../addon/morepokes/morepokes.php:36
msgid "bonk"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:36
+#: ../../addon/morepokes/morepokes.php:36
msgid "bonked"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:37
+#: ../../addon/morepokes/morepokes.php:37
msgid "declare undying love for"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:37
+#: ../../addon/morepokes/morepokes.php:37
msgid "declared undying love for"
msgstr ""
-#: ../../extend/addon/addon/msgfooter/msgfooter.php:46
-#: ../../extend/addon/addon/xmpp/xmpp.php:91
-msgid "Save Settings"
-msgstr "Einstellungen speichern"
+#: ../../addon/diaspora/diaspora.php:675
+msgid "Diaspora Protocol Settings updated."
+msgstr ""
-#: ../../extend/addon/addon/msgfooter/msgfooter.php:47
-msgid "text to include in all outgoing posts from this site"
-msgstr "Test der in alle Beiträge angefügt werden soll, die von dieser Seite ausgehen"
+#: ../../addon/diaspora/diaspora.php:694
+msgid "Enable the Diaspora protocol for this channel"
+msgstr ""
-#: ../../extend/addon/addon/nofed/nofed.php:42
-msgid "Federate"
+#: ../../addon/diaspora/diaspora.php:698
+msgid "Allow any Diaspora member to comment on your public posts"
msgstr ""
-#: ../../extend/addon/addon/nofed/nofed.php:56
-msgid "nofed Settings saved."
-msgstr "nofed Einstellungen gespeichert"
+#: ../../addon/diaspora/diaspora.php:702
+msgid "Prevent your hashtags from being redirected to other sites"
+msgstr ""
-#: ../../extend/addon/addon/nofed/nofed.php:72
-msgid "Allow Federation Toggle"
+#: ../../addon/diaspora/diaspora.php:707
+msgid "Followed hashtags (comma separated, do not include the #)"
msgstr ""
-#: ../../extend/addon/addon/nofed/nofed.php:76
-msgid "Federate posts by default"
+#: ../../addon/diaspora/diaspora.php:712
+msgid "Diaspora Protocol Settings"
msgstr ""
-#: ../../extend/addon/addon/nofed/nofed.php:80
-msgid "NoFed Settings"
-msgstr "NoFed-Einstellungen"
+#: ../../addon/diaspora/import_diaspora.php:16
+msgid "No username found in import file."
+msgstr ""
-#: ../../extend/addon/addon/nsabait/nsabait.php:125
-msgid "Nsabait Settings updated."
-msgstr "Nsabait-Einstellungen aktualisiert."
+#: ../../addon/diaspora/import_diaspora.php:41 ../../include/import.php:62
+msgid "Unable to create a unique channel address. Import failed."
+msgstr "Es war nicht möglich, eine eindeutige Kanal-Adresse zu erzeugen. Der Import ist fehlgeschlagen."
-#: ../../extend/addon/addon/nsabait/nsabait.php:157
-msgid "Enable NSAbait Plugin"
-msgstr "Aktiviere das NSAbait Plugin"
+#: ../../addon/gitwiki/Mod_Gitwiki.php:107
+msgid "Error retrieving wiki"
+msgstr "Fehler beim Abrufen des Wiki"
-#: ../../extend/addon/addon/nsabait/nsabait.php:161
-msgid "NSAbait Settings"
-msgstr "NSAbait-Einstellungen"
+#: ../../addon/gitwiki/Mod_Gitwiki.php:114
+msgid "Error creating zip file export folder"
+msgstr "Fehler bei der Erzeugung des Zip-Datei Export-Verzeichnisses "
-#: ../../extend/addon/addon/nsfw/nsfw.php:80
-msgid ""
-"This plugin looks in posts for the words/text you specify below, and "
-"collapses any content containing those keywords so it is not displayed at "
-"inappropriate times, such as sexual innuendo that may be improper in a work "
-"setting. It is polite and recommended to tag any content containing nudity "
-"with #NSFW. This filter can also match any other word/text you specify, and"
-" can thereby be used as a general purpose content filter."
-msgstr ""
+#: ../../addon/gitwiki/Mod_Gitwiki.php:132
+msgid "Error downloading wiki: "
+msgstr "Fehler beim Herunterladen des Wiki:"
-#: ../../extend/addon/addon/nsfw/nsfw.php:84
-msgid "Enable Content filter"
-msgstr "Inhaltsfilter aktivieren"
+#: ../../addon/testdrive/testdrive.php:104
+#, php-format
+msgid "Your account on %s will expire in a few days."
+msgstr "Dein Account auf %s wird in ein paar Tagen ablaufen."
-#: ../../extend/addon/addon/nsfw/nsfw.php:88
-msgid "Comma separated list of keywords to hide"
-msgstr "Kommaseparierte Liste von Schlüsselworten die verborgen werden sollen."
+#: ../../addon/testdrive/testdrive.php:105
+msgid "Your $Productname test account is about to expire."
+msgstr "Dein $Productname Test-Account wird bald auslaufen."
-#: ../../extend/addon/addon/nsfw/nsfw.php:88
-msgid "Word, /regular-expression/, lang=xx, lang!=xx"
-msgstr ""
+#: ../../addon/rainbowtag/rainbowtag.php:81
+msgid "Enable Rainbowtag"
+msgstr "Rainbowtag aktivieren"
-#: ../../extend/addon/addon/nsfw/nsfw.php:92
-msgid "Not Safe For Work Settings"
-msgstr "Not Safe For Work Einstellungen"
+#: ../../addon/rainbowtag/rainbowtag.php:85
+msgid "Rainbowtag Settings"
+msgstr "Rainbowtag-Einstellungen"
-#: ../../extend/addon/addon/nsfw/nsfw.php:92
-msgid "General Purpose Content Filter"
-msgstr "Allzweck-Inhaltsfilter"
+#: ../../addon/rainbowtag/rainbowtag.php:101
+msgid "Rainbowtag Settings saved."
+msgstr "Rainbowtag-Einstellungen gespeichert."
-#: ../../extend/addon/addon/nsfw/nsfw.php:110
-msgid "NSFW Settings saved."
-msgstr "NSFW-Einstellungen gespeichert."
+#: ../../addon/upload_limits/upload_limits.php:25
+msgid "Show Upload Limits"
+msgstr "Hochladebeschränkungen anzeigen"
-#: ../../extend/addon/addon/nsfw/nsfw.php:207
-msgid "Possible adult content"
-msgstr "Möglicherweise nicht jugendfreie Inhalte"
+#: ../../addon/upload_limits/upload_limits.php:27
+msgid "Hubzilla configured maximum size: "
+msgstr "Die in Hubzilla eingestellte maximale Größe:"
-#: ../../extend/addon/addon/nsfw/nsfw.php:211
-#, php-format
-msgid "%s - view"
-msgstr ""
+#: ../../addon/upload_limits/upload_limits.php:28
+msgid "PHP upload_max_filesize: "
+msgstr "PHP upload_max_filesize:"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:50
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:128
-msgid "System defaults:"
-msgstr "Systemstandardeinstellungen:"
+#: ../../addon/upload_limits/upload_limits.php:29
+msgid "PHP post_max_size (must be larger than upload_max_filesize): "
+msgstr "PHP post_max_size (muss größer sein als upload_max_filesize):"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:54
-msgid "Preferred Clipart IDs"
-msgstr ""
+#: ../../addon/visage/visage.php:93
+msgid "Recent Channel/Profile Viewers"
+msgstr "Kürzliche Kanal/Profil Besucher"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:54
-msgid "List of preferred clipart ids. These will be shown first."
-msgstr ""
+#: ../../addon/visage/visage.php:98
+msgid "This plugin/addon has not been configured."
+msgstr "Dieses Plugin/Addon wurde noch nicht konfiguriert."
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:55
-msgid "Default Search Term"
-msgstr "Standard-Suchbegriff"
+#: ../../addon/visage/visage.php:99
+#, php-format
+msgid "Please visit the Visage settings on %s"
+msgstr "Bitte rufe die Visage Einstellungen auf %s auf"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:55
-msgid "The default search term. These will be shown second."
-msgstr ""
+#: ../../addon/visage/visage.php:99
+msgid "your feature settings page"
+msgstr "Die Funktions-Einstellungsseite"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:56
-msgid "Return After"
-msgstr ""
+#: ../../addon/visage/visage.php:112
+msgid "No entries."
+msgstr "Keine Einträge."
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:56
-msgid "Page to load after image selection."
-msgstr ""
+#: ../../addon/visage/visage.php:166
+msgid "Enable Visage Visitor Logging"
+msgstr "Aktiviere das Visage-Besucher Logging"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:58
-#: ../../include/channel.php:1048 ../../include/nav.php:107
-msgid "Edit Profile"
-msgstr "Profile bearbeiten"
+#: ../../addon/visage/visage.php:170
+msgid "Visage Settings"
+msgstr "Visage-Einstellungen"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:59
-msgid "Profile List"
-msgstr "Profilliste"
+#: ../../addon/nsabait/nsabait.php:125
+msgid "Nsabait Settings updated."
+msgstr "Nsabait-Einstellungen aktualisiert."
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:61
-msgid "Order of Preferred"
-msgstr "Bevorzugte Reihenfolge"
+#: ../../addon/nsabait/nsabait.php:157
+msgid "Enable NSAbait Plugin"
+msgstr "Aktiviere das NSAbait Plugin"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:61
-msgid "Sort order of preferred clipart ids."
-msgstr ""
+#: ../../addon/nsabait/nsabait.php:161
+msgid "NSAbait Settings"
+msgstr "NSAbait-Einstellungen"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:62
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:68
-msgid "Newest first"
-msgstr "Neueste zuerst"
+#: ../../addon/mailtest/mailtest.php:19
+msgid "Send test email"
+msgstr "Test-E-Mail senden"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:65
-msgid "As entered"
-msgstr "Wie eingegeben"
+#: ../../addon/mailtest/mailtest.php:50 ../../addon/hubwall/hubwall.php:50
+msgid "No recipients found."
+msgstr "Keine Empfänger gefunden."
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:67
-msgid "Order of other"
-msgstr ""
+#: ../../addon/mailtest/mailtest.php:66
+msgid "Mail sent."
+msgstr "Mail gesendet."
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:67
-msgid "Sort order of other clipart ids."
-msgstr ""
+#: ../../addon/mailtest/mailtest.php:68
+msgid "Sending of mail failed."
+msgstr "Senden der E-Mail fehlgeschlagen."
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:69
-msgid "Most downloaded first"
-msgstr "Meist heruntergeladene zuerst"
+#: ../../addon/mailtest/mailtest.php:77
+msgid "Mail Test"
+msgstr "Mail Test"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:70
-msgid "Most liked first"
-msgstr "Beliebteste zuerst"
+#: ../../addon/mailtest/mailtest.php:96 ../../addon/hubwall/hubwall.php:92
+msgid "Message subject"
+msgstr "Betreff der Nachricht"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:72
-msgid "Preferred IDs Message"
+#: ../../addon/diaspora_reconnect/diaspora_reconnect.php:44
+#, php-format
+msgid "Reconnecting %d connections"
msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:72
-msgid "Message to display above preferred results."
+#: ../../addon/diaspora_reconnect/diaspora_reconnect.php:63
+msgid "Diaspora Reconnect"
msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:78
-msgid "Uploaded by: "
-msgstr "Hochgeladen von: "
-
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:78
-msgid "Drawn by: "
-msgstr "Gezeichnet von: "
-
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:192
-msgid "Or select from a free OpenClipart.org image:"
-msgstr "Oder wähle ein freies Bild von OpenClipart.org:"
-
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:195
-msgid "Search Term"
-msgstr "Suchbegriff"
-
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:232
-msgid "Unknown error. Please try again later."
-msgstr "Unbekannter Fehler. Bitte versuchen Sie es später erneut."
+#: ../../addon/diaspora_reconnect/diaspora_reconnect.php:65
+msgid ""
+"Use this form to re-establish Diaspora connections which were initially made"
+" from a different hub."
+msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:305
-msgid "Profile photo updated successfully."
-msgstr "Profilfoto erfolgreich aktualisiert."
+#: ../../addon/diaspora_reconnect/diaspora_reconnect.php:70
+msgid "Reconnect"
+msgstr ""
-#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:146
+#: ../../addon/openstreetmap/openstreetmap.php:146
msgid "View Larger"
msgstr "Größer anzeigen"
-#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:169
+#: ../../addon/openstreetmap/openstreetmap.php:169
msgid "Tile Server URL"
msgstr "Kachelserver-URL"
-#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:169
+#: ../../addon/openstreetmap/openstreetmap.php:169
msgid ""
"A list of <a href=\"http://wiki.openstreetmap.org/wiki/TMS\" "
"target=\"_blank\">public tile servers</a>"
msgstr "Eine Liste <a href=\"http://wiki.openstreetmap.org/wiki/TMS\" target=\"_blank\">öffentlicher Kachelserver</a>"
-#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:170
+#: ../../addon/openstreetmap/openstreetmap.php:170
msgid "Nominatim (reverse geocoding) Server URL"
msgstr "Nominatim (reverse Geokodierung) Server URL"
-#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:170
+#: ../../addon/openstreetmap/openstreetmap.php:170
msgid ""
"A list of <a href=\"http://wiki.openstreetmap.org/wiki/Nominatim\" "
"target=\"_blank\">Nominatim servers</a>"
msgstr "Eine Liste der <a href=\"http://wiki.openstreetmap.org/wiki/Nominatim\" target=\"_blank\">Nominatim Server</a>"
-#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:171
+#: ../../addon/openstreetmap/openstreetmap.php:171
msgid "Default zoom"
msgstr "Standardzoom"
-#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:171
+#: ../../addon/openstreetmap/openstreetmap.php:171
msgid ""
"The default zoom level. (1:world, 18:highest, also depends on tile server)"
msgstr "Die Standard-Vergrößerungsstufe (1:Welt, 18:höchste, hängt außerdem vom Kachelserver ab)."
-#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:172
+#: ../../addon/openstreetmap/openstreetmap.php:172
msgid "Include marker on map"
msgstr "Markierung auf der Karte einschließen"
-#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:172
+#: ../../addon/openstreetmap/openstreetmap.php:172
msgid "Include a marker on the map."
msgstr "Binde eine Markierung auf der Karte ein."
-#: ../../extend/addon/addon/pageheader/pageheader.php:43
-msgid "Message to display on every page on this server"
-msgstr "Nachricht, die auf jeder Seite dieses Servers angezeigt werden soll"
+#: ../../addon/msgfooter/msgfooter.php:46 ../../addon/xmpp/xmpp.php:91
+msgid "Save Settings"
+msgstr "Einstellungen speichern"
-#: ../../extend/addon/addon/pageheader/pageheader.php:48
-msgid "Pageheader Settings"
-msgstr "Nachrichtenkopf-Einstellungen"
+#: ../../addon/msgfooter/msgfooter.php:47
+msgid "text to include in all outgoing posts from this site"
+msgstr "Test der in alle Beiträge angefügt werden soll, die von dieser Seite ausgehen"
-#: ../../extend/addon/addon/pageheader/pageheader.php:64
-msgid "pageheader Settings saved."
-msgstr "Nachrichtenkopf-Einstellungen gespeichert."
+#: ../../addon/rtof/rtof.php:45
+msgid "Post to Friendica"
+msgstr "Bei Friendica veröffentlichen"
-#: ../../extend/addon/addon/piwik/piwik.php:85
-msgid ""
-"This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> "
-"analytics tool."
-msgstr "Diese Website verwendet <a href='http://www.piwik.org'>Piwik</a>, um die Besucherzugriffe auszuwerten."
+#: ../../addon/rtof/rtof.php:62
+msgid "rtof Settings saved."
+msgstr "rtof-Einstellungen gespeichert."
-#: ../../extend/addon/addon/piwik/piwik.php:88
-#, php-format
-msgid ""
-"If you do not want that your visits are logged this way you <a href='%s'>can"
-" set a cookie to prevent Piwik from tracking further visits of the site</a> "
-"(opt-out)."
-msgstr "Wenn Du nicht möchtest, dass Deine Besuche zu diesem Zweck gespeichert werden, kannst Du <a href='%s'>ein Cookie setzen, welches Piwik davon abhält, Deine weiteren Besuche auf dieser Website zu verfolgen</a> (Opt-out)."
+#: ../../addon/rtof/rtof.php:81
+msgid "Allow posting to Friendica"
+msgstr "Erlaube die Veröffentlichung bei Friendica"
-#: ../../extend/addon/addon/piwik/piwik.php:96
-msgid "Piwik Base URL"
-msgstr "Piwik Basis-URL"
+#: ../../addon/rtof/rtof.php:85
+msgid "Send public postings to Friendica by default"
+msgstr "Standardmäßig öffentliche Beiträge bei Friendica veröffentlichen"
-#: ../../extend/addon/addon/piwik/piwik.php:96
-msgid ""
-"Absolute path to your Piwik installation. (without protocol (http/s), with "
-"trailing slash)"
-msgstr "Der absolute Pfad zu Deiner Piwik-Installation (ohne Protokoll (http/s), aber mit abschließendem Schrägstrich / )."
+#: ../../addon/rtof/rtof.php:89
+msgid "Friendica API Path"
+msgstr "Friendica-API-Pfad"
-#: ../../extend/addon/addon/piwik/piwik.php:97
-msgid "Site ID"
-msgstr "Seitenkennung"
+#: ../../addon/rtof/rtof.php:89 ../../addon/redred/redred.php:103
+msgid "https://{sitename}/api"
+msgstr "https://{sitename}/api"
-#: ../../extend/addon/addon/piwik/piwik.php:98
-msgid "Show opt-out cookie link?"
-msgstr "Den Opt-out Cookie-Link anzeigen?"
+#: ../../addon/rtof/rtof.php:93
+msgid "Friendica login name"
+msgstr "Friendica-Anmeldename"
-#: ../../extend/addon/addon/piwik/piwik.php:99
-msgid "Asynchronous tracking"
-msgstr "Asynchrones Tracking"
+#: ../../addon/rtof/rtof.php:97
+msgid "Friendica password"
+msgstr "Friendica-Passwort"
-#: ../../extend/addon/addon/piwik/piwik.php:100
-msgid "Enable frontend JavaScript error tracking"
-msgstr "Ermögliche Frontend-JavaScript-Fehlertracking"
+#: ../../addon/rtof/rtof.php:101
+msgid "Hubzilla to Friendica Post Settings"
+msgstr ""
-#: ../../extend/addon/addon/piwik/piwik.php:100
-msgid "This feature requires Piwik >= 2.2.0"
-msgstr "Diese Funktion erfordert Piwik >= 2.2.0"
+#: ../../addon/jappixmini/jappixmini.php:305 ../../include/channel.php:1139
+#: ../../include/channel.php:1296
+msgid "Status:"
+msgstr "Status:"
-#: ../../extend/addon/addon/planets/planets.php:121
-msgid "Planets Settings updated."
-msgstr "Planeten Einstellungen aktualisiert"
+#: ../../addon/jappixmini/jappixmini.php:309
+msgid "Activate addon"
+msgstr "Addon aktiviren"
-#: ../../extend/addon/addon/planets/planets.php:153
-msgid "Enable Planets Plugin"
-msgstr "Aktiviere Planeten Plugin"
+#: ../../addon/jappixmini/jappixmini.php:313
+msgid "Hide Jappixmini Chat-Widget from the webinterface"
+msgstr "Jappix Mini Chat-Widget von der Weboberfläche verbergen"
-#: ../../extend/addon/addon/planets/planets.php:157
-msgid "Planets Settings"
-msgstr "Planeten Einstellungen"
+#: ../../addon/jappixmini/jappixmini.php:318
+msgid "Jabber username"
+msgstr "Jabber-Benutzername"
-#: ../../extend/addon/addon/pumpio/pumpio.php:148
-msgid "You are now authenticated to pumpio."
-msgstr "Du bist nun bei pumpio authenzifiziert."
+#: ../../addon/jappixmini/jappixmini.php:324
+msgid "Jabber server"
+msgstr "Jabber-Server"
-#: ../../extend/addon/addon/pumpio/pumpio.php:149
-msgid "return to the featured settings page"
-msgstr ""
+#: ../../addon/jappixmini/jappixmini.php:330
+msgid "Jabber BOSH host URL"
+msgstr "Jabber BOSH Host URL"
-#: ../../extend/addon/addon/pumpio/pumpio.php:163
-msgid "Post to Pump.io"
-msgstr "Bei pumpio veröffentlichen"
+#: ../../addon/jappixmini/jappixmini.php:337
+msgid "Jabber password"
+msgstr "Jabber-Passwort"
-#: ../../extend/addon/addon/pumpio/pumpio.php:198
-msgid "Pump.io servername"
-msgstr "Pump.io-Servername"
+#: ../../addon/jappixmini/jappixmini.php:343
+msgid "Encrypt Jabber password with Hubzilla password"
+msgstr "Jabber-Passwort mit Hubzilla-Passwort verschlüsseln"
-#: ../../extend/addon/addon/pumpio/pumpio.php:198
-msgid "Without \"http://\" or \"https://\""
-msgstr "Ohne \"http://\" oder \"https://\""
+#: ../../addon/jappixmini/jappixmini.php:347 ../../addon/redred/redred.php:115
+msgid "Hubzilla password"
+msgstr "Hubzilla-Passwort"
-#: ../../extend/addon/addon/pumpio/pumpio.php:202
-msgid "Pump.io username"
-msgstr "Pump.io-Benutzername"
+#: ../../addon/jappixmini/jappixmini.php:351
+#: ../../addon/jappixmini/jappixmini.php:355
+msgid "Approve subscription requests from Hubzilla contacts automatically"
+msgstr ""
-#: ../../extend/addon/addon/pumpio/pumpio.php:202
-msgid "Without the servername"
-msgstr "Ohne dem Servernamen"
+#: ../../addon/jappixmini/jappixmini.php:359
+msgid "Purge internal list of jabber addresses of contacts"
+msgstr "Interne Liste der Jabber Adressen von Kontakten löschen"
-#: ../../extend/addon/addon/pumpio/pumpio.php:213
-msgid "You are not authenticated to pumpio"
-msgstr "Du bist nicht bei pumpio authentifiziert."
+#: ../../addon/jappixmini/jappixmini.php:364
+msgid "Configuration Help"
+msgstr "Konfigurationshilfe"
-#: ../../extend/addon/addon/pumpio/pumpio.php:215
-msgid "(Re-)Authenticate your pump.io connection"
-msgstr "Deine pumpio Verbindung (erneut) authentifizieren"
+#: ../../addon/jappixmini/jappixmini.php:371
+msgid "Jappix Mini Settings"
+msgstr "Jappix Mini Einstellungen"
-#: ../../extend/addon/addon/pumpio/pumpio.php:219
-msgid "Enable pump.io Post Plugin"
-msgstr "Aktiviere das pumpio-Plugin"
+#: ../../addon/superblock/superblock.php:112
+msgid "Currently blocked"
+msgstr "Derzeit blockiert"
-#: ../../extend/addon/addon/pumpio/pumpio.php:223
-msgid "Post to pump.io by default"
-msgstr "Standardmäßig bei pumpio veröffentlichen"
+#: ../../addon/superblock/superblock.php:114
+msgid "No channels currently blocked"
+msgstr "Momentan sind keine Kanäle blockiert"
-#: ../../extend/addon/addon/pumpio/pumpio.php:227
-msgid "Should posts be public"
-msgstr "Sollen die Beiträge öffentlich sein"
+#: ../../addon/superblock/superblock.php:120
+msgid "\"Superblock\" Settings"
+msgstr "\"Superblock\"-Einstellungen"
-#: ../../extend/addon/addon/pumpio/pumpio.php:231
-msgid "Mirror all public posts"
-msgstr "Öffentliche Beiträge spiegeln"
+#: ../../addon/superblock/superblock.php:345
+msgid "Block Completely"
+msgstr "Vollständig blockieren"
-#: ../../extend/addon/addon/pumpio/pumpio.php:237
-msgid "Pump.io Post Settings"
-msgstr "Pump.io-Beitragseinstellungen"
+#: ../../addon/superblock/superblock.php:394
+msgid "superblock settings updated"
+msgstr "Superblock Einstellungen aktualisiert"
-#: ../../extend/addon/addon/pumpio/pumpio.php:266
-msgid "PumpIO Settings saved."
-msgstr "PumpIO-Einstellungen gespeichert."
+#: ../../addon/nofed/nofed.php:42
+msgid "Federate"
+msgstr ""
-#: ../../extend/addon/addon/qrator/qrator.php:48
-msgid "QR code"
-msgstr "QR-Code"
+#: ../../addon/nofed/nofed.php:56
+msgid "nofed Settings saved."
+msgstr "nofed Einstellungen gespeichert"
-#: ../../extend/addon/addon/qrator/qrator.php:63
-msgid "QR Generator"
-msgstr "QR-Generator"
+#: ../../addon/nofed/nofed.php:72
+msgid "Allow Federation Toggle"
+msgstr ""
-#: ../../extend/addon/addon/qrator/qrator.php:64
-msgid "Enter some text"
-msgstr "Etwas Text eingeben"
+#: ../../addon/nofed/nofed.php:76
+msgid "Federate posts by default"
+msgstr ""
-#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:81
-msgid "Enable Rainbowtag"
-msgstr "Rainbowtag aktivieren"
+#: ../../addon/nofed/nofed.php:80
+msgid "NoFed Settings"
+msgstr "NoFed-Einstellungen"
-#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:85
-msgid "Rainbowtag Settings"
-msgstr "Rainbowtag-Einstellungen"
+#: ../../addon/redred/redred.php:45
+msgid "Post to Red"
+msgstr ""
-#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:101
-msgid "Rainbowtag Settings saved."
-msgstr "Rainbowtag-Einstellungen gespeichert."
+#: ../../addon/redred/redred.php:60
+msgid "Channel is required."
+msgstr "Kanal ist erforderlich."
-#: ../../extend/addon/addon/randpost/randpost.php:97
-msgid "You're welcome."
-msgstr "Gern geschehen."
+#: ../../addon/redred/redred.php:76
+msgid "redred Settings saved."
+msgstr "redred-Einstellungen gespeichert."
-#: ../../extend/addon/addon/randpost/randpost.php:98
-msgid "Ah shucks..."
+#: ../../addon/redred/redred.php:95
+msgid "Allow posting to another Hubzilla Channel"
+msgstr "Erlaube die Veröffentlichung in anderen Hubzilla Kanälen"
+
+#: ../../addon/redred/redred.php:99
+msgid "Send public postings to Hubzilla channel by default"
msgstr ""
-#: ../../extend/addon/addon/randpost/randpost.php:99
-msgid "Don't mention it."
-msgstr "Keine Ursache."
+#: ../../addon/redred/redred.php:103
+msgid "Hubzilla API Path"
+msgstr "Hubzilla-API-Pfad"
-#: ../../extend/addon/addon/randpost/randpost.php:100
-msgid "&lt;blush&gt;"
-msgstr ""
+#: ../../addon/redred/redred.php:107
+msgid "Hubzilla login name"
+msgstr "Hubzilla-Anmeldename"
-#: ../../extend/addon/addon/redfiles/redfiles.php:119
-msgid "Redmatrix File Storage Import"
+#: ../../addon/redred/redred.php:111
+msgid "Hubzilla channel name"
+msgstr "Hubzilla-Kanalname"
+
+#: ../../addon/redred/redred.php:119
+msgid "Hubzilla Crosspost Settings"
msgstr ""
-#: ../../extend/addon/addon/redfiles/redfiles.php:120
-msgid "This will import all your Redmatrix cloud files to this channel."
-msgstr "Hiermit werden alle deine Daten aus der Redmatrix Cloud in diesen Kanal importiert."
+#: ../../addon/logrot/logrot.php:36
+msgid "Logfile archive directory"
+msgstr "Verzeichnis der Logdatei"
-#: ../../extend/addon/addon/redfiles/redfiles.php:121
-#: ../../extend/addon/addon/redphotos/redphotos.php:131
-msgid "Redmatrix Server base URL"
-msgstr "Basis-URL des Redmatrix Servers"
+#: ../../addon/logrot/logrot.php:36
+msgid "Directory to store rotated logs"
+msgstr "Verzeichnis, in dem rotierte Logs gespeichert werden sollen"
-#: ../../extend/addon/addon/redfiles/redfiles.php:122
-#: ../../extend/addon/addon/redphotos/redphotos.php:132
-msgid "Redmatrix Login Username"
-msgstr "Redmatrix-Anmeldebenutzername"
+#: ../../addon/logrot/logrot.php:37
+msgid "Logfile size in bytes before rotating"
+msgstr "zu erreichende Logdateigröße in Bytes, bevor rotiert wird"
-#: ../../extend/addon/addon/redfiles/redfiles.php:123
-#: ../../extend/addon/addon/redphotos/redphotos.php:133
-msgid "Redmatrix Login Password"
-msgstr "Redmatrix-Anmeldepasswort"
+#: ../../addon/logrot/logrot.php:38
+msgid "Number of logfiles to retain"
+msgstr "Anzahl aufzubewahrender rotierter Logdateien"
-#: ../../extend/addon/addon/redfiles/redfilehelper.php:67
-msgid "file"
-msgstr "Datei"
+#: ../../addon/frphotos/frphotos.php:91
+msgid "Friendica Photo Album Import"
+msgstr "Friendica-Fotoalbumimport"
-#: ../../extend/addon/addon/redphotos/redphotos.php:106
-msgid "Photos imported"
-msgstr "Fotos importiert"
+#: ../../addon/frphotos/frphotos.php:92
+msgid "This will import all your Friendica photo albums to this Red channel."
+msgstr "Hiermit werden all deine Fotoalben von Friendica in diesen Hubzilla Kanal importiert."
-#: ../../extend/addon/addon/redphotos/redphotos.php:129
-msgid "Redmatrix Photo Album Import"
-msgstr "Redmatrix-Fotoalbumimport"
+#: ../../addon/frphotos/frphotos.php:93
+msgid "Friendica Server base URL"
+msgstr "BasisURL des Friendica Servers"
-#: ../../extend/addon/addon/redphotos/redphotos.php:130
-msgid "This will import all your Redmatrix photo albums to this channel."
-msgstr "Hiermit werden all deine Fotoalben von Redmatrix in diesen Kanal importiert."
+#: ../../addon/frphotos/frphotos.php:94
+msgid "Friendica Login Username"
+msgstr "Friendica-Anmeldebenutzername"
-#: ../../extend/addon/addon/redphotos/redphotos.php:134
-msgid "Import just this album"
-msgstr "Nur dieses Album importieren"
+#: ../../addon/frphotos/frphotos.php:95
+msgid "Friendica Login Password"
+msgstr "Friendica-Anmeldepasswort"
-#: ../../extend/addon/addon/redphotos/redphotos.php:134
-msgid "Leave blank to import all albums"
-msgstr "Leer lassen um alle Alben zu importieren"
+#: ../../addon/donate/donate.php:21
+msgid "Project Servers and Resources"
+msgstr "Projektserver und -ressourcen"
-#: ../../extend/addon/addon/redphotos/redphotos.php:135
-msgid "Maximum count to import"
-msgstr "Maximal zu importierende Anzahl"
+#: ../../addon/donate/donate.php:22
+msgid "Project Creator and Tech Lead"
+msgstr "Projektersteller und Technischer Leiter"
-#: ../../extend/addon/addon/redphotos/redphotos.php:135
-msgid "0 or blank to import all available"
-msgstr "0 oder leer lassen um alles zu importieren"
+#: ../../addon/donate/donate.php:23
+msgid "Admin, developer, directorymin, support bloke"
+msgstr "Administrator, Entwickler, Verzeichnis Betreibender, Supportleistende"
-#: ../../extend/addon/addon/redred/redred.php:45
-msgid "Post to Red"
-msgstr ""
+#: ../../addon/donate/donate.php:50
+msgid ""
+"And the hundreds of other people and organisations who helped make the "
+"Hubzilla possible."
+msgstr "Und die hunderte anderen Menschen und Organisationen, die geholfen haben Hubzilla möglich zu machen."
-#: ../../extend/addon/addon/redred/redred.php:60
-msgid "Channel is required."
-msgstr "Kanal ist erforderlich."
+#: ../../addon/donate/donate.php:53
+msgid ""
+"The Redmatrix/Hubzilla projects are provided primarily by volunteers giving "
+"their time and expertise - and often paying out of pocket for services they "
+"share with others."
+msgstr "Die Redmatrix/Hubzilla Projekte werden hauptsächlich von Freiwilligen bereitgestellt, die ihre Zeit und Expertise zur Verfügung stellen - und oft aus eigener Tasche für die Dienste zahlen, die sie mit anderen teilen."
-#: ../../extend/addon/addon/redred/redred.php:65
-msgid "Invalid channel."
-msgstr "Ungültiger Kanal."
+#: ../../addon/donate/donate.php:54
+msgid ""
+"There is no corporate funding and no ads, and we do not collect and sell "
+"your personal information. (We don't control your personal information - "
+"<strong>you do</strong>.)"
+msgstr "Es gibt keine Finanzierung durch Firmen, keine Werbung und wir verkaufen Deine persönlichen Daten nicht. (Wir kontrollieren Deine persönlichen Daten nicht - <strong>das machst Du</strong>.)"
-#: ../../extend/addon/addon/redred/redred.php:76
-msgid "redred Settings saved."
-msgstr "redred-Einstellungen gespeichert."
+#: ../../addon/donate/donate.php:55
+msgid ""
+"Help support our ground-breaking work in decentralisation, web identity, and"
+" privacy."
+msgstr "Hilf uns bei unserer wegweisenden Arbeit im Bereich der Dezantralisation, von Web-Identitäten und Privatsphäre."
-#: ../../extend/addon/addon/redred/redred.php:95
-msgid "Allow posting to another Hubzilla Channel"
-msgstr "Erlaube die Veröffentlichung in anderen Hubzilla Kanälen"
+#: ../../addon/donate/donate.php:57
+msgid ""
+"Your donations keep servers and services running and also helps us to "
+"provide innovative new features and continued development."
+msgstr "Die Spenden werden dafür verwendet Server und Dienste am laufen zu halten und helfen desweiteren innovative Neuerungen zu schaffen und die Entwicklung voran zu treiben."
-#: ../../extend/addon/addon/redred/redred.php:99
-msgid "Send public postings to Hubzilla channel by default"
-msgstr ""
+#: ../../addon/donate/donate.php:60
+msgid "Donate"
+msgstr "Spenden"
-#: ../../extend/addon/addon/redred/redred.php:103
-msgid "Hubzilla API Path"
-msgstr "Hubzilla-API-Pfad"
+#: ../../addon/donate/donate.php:62
+msgid ""
+"Choose a project, developer, or public hub to support with a one-time "
+"donation"
+msgstr "Wähle ein Projekt, einen Entwickler oder einen öffentlichen Hub den du mit einer einmaligen Spende unterstützen willst."
-#: ../../extend/addon/addon/redred/redred.php:103
-#: ../../extend/addon/addon/rtof/rtof.php:89
-msgid "https://{sitename}/api"
-msgstr "https://{sitename}/api"
+#: ../../addon/donate/donate.php:63
+msgid "Donate Now"
+msgstr "Jetzt spenden"
-#: ../../extend/addon/addon/redred/redred.php:107
-msgid "Hubzilla login name"
-msgstr "Hubzilla-Anmeldename"
+#: ../../addon/donate/donate.php:64
+msgid ""
+"<strong><em>Or</em></strong> become a project sponsor (Hubzilla Project "
+"only)"
+msgstr "<strong><em>Oder</em></strong> werde ein Unterstützer des Projekts (ausschließlich Hubzilla)"
-#: ../../extend/addon/addon/redred/redred.php:111
-msgid "Hubzilla channel name"
-msgstr "Hubzilla-Kanalname"
+#: ../../addon/donate/donate.php:65
+msgid ""
+"Please indicate if you would like your first name or full name (or nothing) "
+"to appear in our sponsor listing"
+msgstr "Bitte teile uns mit ob dein kompletter Name oder dein Vorname (oder gar nichts) auf unserer Sponsoren-Seite veröffentlicht werden soll."
-#: ../../extend/addon/addon/redred/redred.php:111
-#: ../../extend/addon/addon/openid/MysqlProvider.php:54
-msgid "Nickname"
-msgstr "Spitzname"
+#: ../../addon/donate/donate.php:66
+msgid "Sponsor"
+msgstr "Sponsor"
-#: ../../extend/addon/addon/redred/redred.php:119
-msgid "Hubzilla Crosspost Settings"
+#: ../../addon/donate/donate.php:69
+msgid "Special thanks to: "
+msgstr "Besonderer Dank an: "
+
+#: ../../addon/chords/Mod_Chords.php:44
+msgid ""
+"This is a fairly comprehensive and complete guitar chord dictionary which "
+"will list most of the available ways to play a certain chord, starting from "
+"the base of the fingerboard up to a few frets beyond the twelfth fret "
+"(beyond which everything repeats). A couple of non-standard tunings are "
+"provided for the benefit of slide players, etc."
msgstr ""
-#: ../../extend/addon/addon/rtof/rtof.php:45
-msgid "Post to Friendica"
-msgstr "Bei Friendica veröffentlichen"
+#: ../../addon/chords/Mod_Chords.php:46
+msgid ""
+"Chord names start with a root note (A-G) and may include sharps (#) and "
+"flats (b). This software will parse most of the standard naming conventions "
+"such as maj, min, dim, sus(2 or 4), aug, with optional repeating elements."
+msgstr ""
-#: ../../extend/addon/addon/rtof/rtof.php:62
-msgid "rtof Settings saved."
-msgstr "rtof-Einstellungen gespeichert."
+#: ../../addon/chords/Mod_Chords.php:48
+msgid ""
+"Valid examples include A, A7, Am7, Amaj7, Amaj9, Ammaj7, Aadd4, Asus2Add4, "
+"E7b13b11 ..."
+msgstr "Einige gültige Beispiele: A, A7, Am7, Amaj7, Amaj9, Ammaj7, Aadd4, Asus2Add4, E7b13b11 ..."
-#: ../../extend/addon/addon/rtof/rtof.php:81
-msgid "Allow posting to Friendica"
-msgstr "Erlaube die Veröffentlichung bei Friendica"
+#: ../../addon/chords/Mod_Chords.php:51
+msgid "Guitar Chords"
+msgstr "Gitarrenakkorde"
-#: ../../extend/addon/addon/rtof/rtof.php:85
-msgid "Send public postings to Friendica by default"
-msgstr "Standardmäßig öffentliche Beiträge bei Friendica veröffentlichen"
+#: ../../addon/chords/Mod_Chords.php:52
+msgid "The complete online chord dictionary"
+msgstr "Das komplette online Akkord-Verzeichnis"
-#: ../../extend/addon/addon/rtof/rtof.php:89
-msgid "Friendica API Path"
-msgstr "Friendica-API-Pfad"
+#: ../../addon/chords/Mod_Chords.php:57
+msgid "Tuning"
+msgstr "Stimmen"
-#: ../../extend/addon/addon/rtof/rtof.php:93
-msgid "Friendica login name"
-msgstr "Friendica-Anmeldename"
+#: ../../addon/chords/Mod_Chords.php:58
+msgid "Chord name: example: Em7"
+msgstr "Beispiel Akkord Name: Em7"
-#: ../../extend/addon/addon/rtof/rtof.php:97
-msgid "Friendica password"
-msgstr "Friendica-Passwort"
+#: ../../addon/chords/Mod_Chords.php:59
+msgid "Show for left handed stringing"
+msgstr "Linkshänder-Besaitung anzeigen"
-#: ../../extend/addon/addon/rtof/rtof.php:101
-msgid "Hubzilla to Friendica Post Settings"
-msgstr ""
+#: ../../addon/chords/chords.php:33
+msgid "Quick Reference"
+msgstr "Schnellreferenz"
-#: ../../extend/addon/addon/sendzid/sendzid.php:25
-msgid "Extended Identity Sharing"
-msgstr "Erweitertes Teilen von Identitäten"
+#: ../../addon/libertree/libertree.php:38
+msgid "Post to Libertree"
+msgstr "Bei Libertree veröffentlichen"
-#: ../../extend/addon/addon/sendzid/sendzid.php:26
-msgid ""
-"Share your identity with all websites on the internet. When disabled, "
-"identity is only shared with sites in the matrix."
-msgstr ""
+#: ../../addon/libertree/libertree.php:69
+msgid "Enable Libertree Post Plugin"
+msgstr "Aktivire das Libertree-Plugin"
-#: ../../extend/addon/addon/skeleton/skeleton.php:59
-msgid "Some setting"
-msgstr "Einige Einstellungen"
+#: ../../addon/libertree/libertree.php:73
+msgid "Libertree API token"
+msgstr "Libertree API Token"
-#: ../../extend/addon/addon/skeleton/skeleton.php:61
-msgid "A setting"
-msgstr "Eine Einstellung"
+#: ../../addon/libertree/libertree.php:77
+msgid "Libertree site URL"
+msgstr "URL der Libertree Seite"
-#: ../../extend/addon/addon/skeleton/skeleton.php:64
-msgid "Skeleton Settings"
-msgstr ""
+#: ../../addon/libertree/libertree.php:81
+msgid "Post to Libertree by default"
+msgstr "Standardmäßig bei Libertree veröffentlichen"
-#: ../../extend/addon/addon/smileybutton/smileybutton.php:273
-msgid "Deactivate the feature"
-msgstr "Diese Funktion abschalten"
+#: ../../addon/libertree/libertree.php:85
+msgid "Libertree Post Settings"
+msgstr "Libertree-Beitragseinstellungen"
-#: ../../extend/addon/addon/smileybutton/smileybutton.php:277
-msgid "Hide the button and show the smilies directly."
-msgstr "Verstecke die Schaltfläche und zeige die Smilies direkt an."
+#: ../../addon/libertree/libertree.php:99
+msgid "Libertree Settings saved."
+msgstr "Libertree-Einstellungen gespeichert."
-#: ../../extend/addon/addon/smileybutton/smileybutton.php:281
-msgid "Smileybutton Settings"
-msgstr "Smileyknopf-Einstellungen"
+#: ../../addon/flattrwidget/flattrwidget.php:45
+msgid "Flattr this!"
+msgstr "Flattr this!"
-#: ../../extend/addon/addon/startpage/startpage.php:109
-msgid "Page to load after login"
-msgstr "Seite, die nach dem Login geladen werden soll"
+#: ../../addon/flattrwidget/flattrwidget.php:83
+msgid "Flattr widget settings updated."
+msgstr "Flattr Widget Einstellungen aktualisiert"
-#: ../../extend/addon/addon/startpage/startpage.php:109
-msgid ""
-"Examples: &quot;apps&quot;, &quot;network?f=&gid=37&quot; (privacy "
-"collection), &quot;channel&quot; or &quot;notifications/system&quot; (leave "
-"blank for default network page (grid)."
-msgstr "Beispiele: &quot;apps&quot;, &quot;network?f=&gid=37&quot; (Gruppen-gefilterte Beiträge), &quot;channel&quot; oder &quot;notifications/system&quot; (freilassen für die Standard-Netzwerkseite (grid)."
+#: ../../addon/flattrwidget/flattrwidget.php:100
+msgid "Flattr user"
+msgstr "Flattr Nutzer"
-#: ../../extend/addon/addon/startpage/startpage.php:113
-msgid "Startpage Settings"
-msgstr "Startseiteneinstellungen"
+#: ../../addon/flattrwidget/flattrwidget.php:104
+msgid "URL of the Thing to flattr"
+msgstr "URL des Dings zum flattrn"
+
+#: ../../addon/flattrwidget/flattrwidget.php:104
+msgid "If empty channel URL is used"
+msgstr "Falls leer wird die Channel URL verwendet"
+
+#: ../../addon/flattrwidget/flattrwidget.php:108
+msgid "Title of the Thing to flattr"
+msgstr "Titel des Dings zum flattrn"
-#: ../../extend/addon/addon/statusnet/statusnet.php:143
+#: ../../addon/flattrwidget/flattrwidget.php:108
+msgid "If empty \"channel name on The Hubzilla\" will be used"
+msgstr "Falls leer wird \"Kanalname auf The Hubzilla\" verwendet"
+
+#: ../../addon/flattrwidget/flattrwidget.php:112
+msgid "Static or dynamic flattr button"
+msgstr "Statischer oder dynamischer Flattr Button"
+
+#: ../../addon/flattrwidget/flattrwidget.php:112
+msgid "static"
+msgstr "statisch"
+
+#: ../../addon/flattrwidget/flattrwidget.php:112
+msgid "dynamic"
+msgstr "dynamisch"
+
+#: ../../addon/flattrwidget/flattrwidget.php:116
+msgid "Alignment of the widget"
+msgstr "Ausrichtung des Widgets"
+
+#: ../../addon/flattrwidget/flattrwidget.php:116
+msgid "left"
+msgstr "links"
+
+#: ../../addon/flattrwidget/flattrwidget.php:116
+msgid "right"
+msgstr "rechts"
+
+#: ../../addon/flattrwidget/flattrwidget.php:120
+msgid "Enable Flattr widget"
+msgstr "Flattr Widget verwenden"
+
+#: ../../addon/flattrwidget/flattrwidget.php:124
+msgid "Flattr Widget Settings"
+msgstr "Flattr Widget Einstellungen"
+
+#: ../../addon/statusnet/statusnet.php:143
msgid "Post to GNU social"
msgstr "Bei GNU social veröffentlichen"
-#: ../../extend/addon/addon/statusnet/statusnet.php:195
+#: ../../addon/statusnet/statusnet.php:195
msgid ""
"Please contact your site administrator.<br />The provided API URL is not "
"valid."
msgstr "Bitte kontaktiere den Administrator deines Hubs.<br />Die angegebene API URL ist nicht korrekt."
-#: ../../extend/addon/addon/statusnet/statusnet.php:232
+#: ../../addon/statusnet/statusnet.php:232
msgid "We could not contact the GNU social API with the Path you entered."
msgstr "Mit dem angegebenen Pfad war es uns nicht möglich, die GNU social API zu erreichen."
-#: ../../extend/addon/addon/statusnet/statusnet.php:266
+#: ../../addon/statusnet/statusnet.php:266
msgid "GNU social settings updated."
msgstr "GNU social Einstellungen aktualisiert."
-#: ../../extend/addon/addon/statusnet/statusnet.php:310
+#: ../../addon/statusnet/statusnet.php:310
msgid "Globally Available GNU social OAuthKeys"
msgstr "Global verfügbare GNU social OAuthKeys"
-#: ../../extend/addon/addon/statusnet/statusnet.php:312
+#: ../../addon/statusnet/statusnet.php:312
msgid ""
"There are preconfigured OAuth key pairs for some GNU social servers "
"available. If you are using one of them, please use these credentials.<br "
"/>If not feel free to connect to any other GNU social instance (see below)."
msgstr ""
-#: ../../extend/addon/addon/statusnet/statusnet.php:327
+#: ../../addon/statusnet/statusnet.php:327
msgid "Provide your own OAuth Credentials"
msgstr ""
-#: ../../extend/addon/addon/statusnet/statusnet.php:329
+#: ../../addon/statusnet/statusnet.php:329
msgid ""
"No consumer key pair for GNU social found. Register your Hubzilla Account as"
" an desktop client on your GNU social account, copy the consumer key pair "
@@ -9682,27 +10058,27 @@ msgid ""
"Hubzilla installation at your favourite GNU social installation."
msgstr ""
-#: ../../extend/addon/addon/statusnet/statusnet.php:333
+#: ../../addon/statusnet/statusnet.php:333
msgid "OAuth Consumer Key"
msgstr "OAuth Consumer Key"
-#: ../../extend/addon/addon/statusnet/statusnet.php:337
+#: ../../addon/statusnet/statusnet.php:337
msgid "OAuth Consumer Secret"
msgstr "OAuth Consumer Secret"
-#: ../../extend/addon/addon/statusnet/statusnet.php:341
+#: ../../addon/statusnet/statusnet.php:341
msgid "Base API Path"
msgstr "Basis Pfad der API"
-#: ../../extend/addon/addon/statusnet/statusnet.php:341
+#: ../../addon/statusnet/statusnet.php:341
msgid "Remember the trailing /"
msgstr "Denke an das abschließende /"
-#: ../../extend/addon/addon/statusnet/statusnet.php:345
+#: ../../addon/statusnet/statusnet.php:345
msgid "GNU social application name"
msgstr "GNU social Anwendungsname"
-#: ../../extend/addon/addon/statusnet/statusnet.php:368
+#: ../../addon/statusnet/statusnet.php:368
msgid ""
"To connect to your GNU social account click the button below to get a "
"security code from GNU social which you have to copy into the input box "
@@ -9710,32 +10086,31 @@ msgid ""
"posted to GNU social."
msgstr ""
-#: ../../extend/addon/addon/statusnet/statusnet.php:370
+#: ../../addon/statusnet/statusnet.php:370
msgid "Log in with GNU social"
msgstr "Mit GNU social anmelden"
-#: ../../extend/addon/addon/statusnet/statusnet.php:373
+#: ../../addon/statusnet/statusnet.php:373
msgid "Copy the security code from GNU social here"
msgstr "Kopiere den Sicherheitscode von GNU social hier her"
-#: ../../extend/addon/addon/statusnet/statusnet.php:383
+#: ../../addon/statusnet/statusnet.php:383
msgid "Cancel Connection Process"
msgstr "Verbindungsprozes abbrechen"
-#: ../../extend/addon/addon/statusnet/statusnet.php:385
+#: ../../addon/statusnet/statusnet.php:385
msgid "Current GNU social API is"
msgstr "Aktuelle GNU social API ist"
-#: ../../extend/addon/addon/statusnet/statusnet.php:389
+#: ../../addon/statusnet/statusnet.php:389
msgid "Cancel GNU social Connection"
msgstr "GNU social Verbindung trennen"
-#: ../../extend/addon/addon/statusnet/statusnet.php:401
-#: ../../extend/addon/addon/twitter/twitter.php:232
+#: ../../addon/statusnet/statusnet.php:401 ../../addon/twitter/twitter.php:232
msgid "Currently connected to: "
msgstr "Momentan verbunden mit:"
-#: ../../extend/addon/addon/statusnet/statusnet.php:406
+#: ../../addon/statusnet/statusnet.php:406
msgid ""
"<strong>Note</strong>: Due your privacy settings (<em>Hide your profile "
"details from unknown viewers?</em>) the link potentially included in public "
@@ -9743,277 +10118,363 @@ msgid ""
"informing the visitor that the access to your profile has been restricted."
msgstr ""
-#: ../../extend/addon/addon/statusnet/statusnet.php:411
+#: ../../addon/statusnet/statusnet.php:411
msgid "Allow posting to GNU social"
msgstr "Erlaube die Veröffentlichung bei GNU social"
-#: ../../extend/addon/addon/statusnet/statusnet.php:411
+#: ../../addon/statusnet/statusnet.php:411
msgid ""
"If enabled your public postings can be posted to the associated GNU-social "
"account"
msgstr "Wenn aktiv können deine öffentlichen Beiträge bei dem verbundenen GNU social Account veröffentlicht werden."
-#: ../../extend/addon/addon/statusnet/statusnet.php:415
+#: ../../addon/statusnet/statusnet.php:415
msgid "Post to GNU social by default"
msgstr "Standardmäßig bei GNU social veröffentlichen"
-#: ../../extend/addon/addon/statusnet/statusnet.php:415
+#: ../../addon/statusnet/statusnet.php:415
msgid ""
"If enabled your public postings will be posted to the associated GNU-social "
"account by default"
msgstr "Wenn aktiv werden all deine öffentlichen Beiträge standardmäßig bei dem verbundenen GNU social Account veröffentlicht."
-#: ../../extend/addon/addon/statusnet/statusnet.php:424
-#: ../../extend/addon/addon/twitter/twitter.php:255
+#: ../../addon/statusnet/statusnet.php:424 ../../addon/twitter/twitter.php:255
msgid "Clear OAuth configuration"
msgstr "OAuth Konfiguration löschen"
-#: ../../extend/addon/addon/statusnet/statusnet.php:432
+#: ../../addon/statusnet/statusnet.php:432
msgid "GNU social Post Settings"
msgstr "GNU social Einstellungen"
-#: ../../extend/addon/addon/statusnet/statusnet.php:891
+#: ../../addon/statusnet/statusnet.php:891
msgid "API URL"
msgstr "API-URL"
-#: ../../extend/addon/addon/statusnet/statusnet.php:894
+#: ../../addon/statusnet/statusnet.php:894
msgid "Application name"
msgstr "Anwendungsname"
-#: ../../extend/addon/addon/superblock/superblock.php:110
-msgid "Currently blocked"
-msgstr "Derzeit blockiert"
+#: ../../addon/qrator/qrator.php:48
+msgid "QR code"
+msgstr "QR-Code"
-#: ../../extend/addon/addon/superblock/superblock.php:112
-msgid "No channels currently blocked"
-msgstr "Momentan sind keine Kanäle blockiert"
+#: ../../addon/qrator/qrator.php:63
+msgid "QR Generator"
+msgstr "QR-Generator"
-#: ../../extend/addon/addon/superblock/superblock.php:118
-msgid "\"Superblock\" Settings"
-msgstr "\"Superblock\"-Einstellungen"
+#: ../../addon/qrator/qrator.php:64
+msgid "Enter some text"
+msgstr "Etwas Text eingeben"
-#: ../../extend/addon/addon/superblock/superblock.php:322
-msgid "Block Completely"
-msgstr "Vollständig blockieren"
+#: ../../addon/chess/chess.php:276 ../../addon/chess/chess.php:433
+msgid "Invalid game."
+msgstr "Ungültiges Spiel."
-#: ../../extend/addon/addon/superblock/superblock.php:371
-msgid "superblock settings updated"
-msgstr "Superblock Einstellungen aktualisiert"
+#: ../../addon/chess/chess.php:282 ../../addon/chess/chess.php:439
+msgid "You are not a player in this game."
+msgstr "Sie sind kein Spieler in diesem Spiel."
-#: ../../extend/addon/addon/testdrive/testdrive.php:104
-#, php-format
-msgid "Your account on %s will expire in a few days."
-msgstr "Dein Account auf %s wird in ein paar Tagen ablaufen."
+#: ../../addon/chess/chess.php:315
+msgid "You must be a local channel to create a game."
+msgstr "Um ein Spiel zu eröffnen, musst du ein lokaler Kanal sein"
-#: ../../extend/addon/addon/testdrive/testdrive.php:105
-msgid "Your $Productname test account is about to expire."
-msgstr "Dein $Productname Test-Account wird bald auslaufen."
+#: ../../addon/chess/chess.php:333
+msgid "You must select one opponent that is not yourself."
+msgstr "Du musst einen Gegner wählen, der nicht du selbst ist"
-#: ../../extend/addon/addon/tictac/tictac.php:21
-msgid "Three Dimensional Tic-Tac-Toe"
-msgstr "Dreidimensionales Tic-Tac-Toe"
+#: ../../addon/chess/chess.php:336
+msgid "Creating new game..."
+msgstr "Neues Spiel wird erstellt..."
-#: ../../extend/addon/addon/tictac/tictac.php:54
-msgid "3D Tic-Tac-Toe"
-msgstr "3D Tic-Tac-Toe"
+#: ../../addon/chess/chess.php:342
+msgid "You must select white or black."
+msgstr "Sie müssen weiß oder schwarz auswählen."
-#: ../../extend/addon/addon/tictac/tictac.php:59
-msgid "New game"
-msgstr "Neues Spiel"
+#: ../../addon/chess/chess.php:349
+msgid "Error creating new game."
+msgstr "Fehler beim Erstellen eines neuen Spiels."
-#: ../../extend/addon/addon/tictac/tictac.php:60
-msgid "New game with handicap"
-msgstr "Neues Handicaü-Spiel"
+#: ../../addon/chess/chess.php:381 ../../include/channel.php:899
+msgid "Requested channel is not available."
+msgstr "Angeforderte Kanal nicht verfügbar."
+
+#: ../../addon/chess/chess.php:395
+msgid "You must select a local channel /chess/channelname"
+msgstr "Du musst einen lokalen Kanal/Schach(Kanalnamen aufwählen"
-#: ../../extend/addon/addon/tictac/tictac.php:61
+#: ../../addon/chess/chess.php:923
+msgid "Enable notifications"
+msgstr "Benachrichtigungen aktivieren"
+
+#: ../../addon/twitter/twitter.php:99
+msgid "Post to Twitter"
+msgstr "Bei Twitter veröffentlichen"
+
+#: ../../addon/twitter/twitter.php:154
+msgid "Twitter settings updated."
+msgstr "Twitter-Einstellungen aktualisiert."
+
+#: ../../addon/twitter/twitter.php:183
msgid ""
-"Three dimensional tic-tac-toe is just like the traditional game except that "
-"it is played on multiple levels simultaneously. "
-msgstr "3D Tic-Tac-Toe funktioniert wie das ursprüngliche Spiel, nur dass es auf mehreren Ebenen gleichzeitig gespielt wird."
+"No consumer key pair for Twitter found. Please contact your site "
+"administrator."
+msgstr "Es wurde kein Consumer-Schlüsselpaar für Twitter gefunden. Bitte kontaktiere deinen Seiten-Administrator."
-#: ../../extend/addon/addon/tictac/tictac.php:62
+#: ../../addon/twitter/twitter.php:205
msgid ""
-"In this case there are three levels. You win by getting three in a row on "
-"any level, as well as up, down, and diagonally across the different levels."
-msgstr "In diesem Fall sind es drei Ebenen. Du gewinnst, wenn es dir gelingt drei in einer Reihe auf einer beliebigen Ebene oder diagonal über die verschiedenen Ebenen hinweg zu erreichen."
+"At this Hubzilla instance the Twitter plugin was enabled but you have not "
+"yet connected your account to your Twitter account. To do so click the "
+"button below to get a PIN from Twitter which you have to copy into the input"
+" box below and submit the form. Only your <strong>public</strong> posts will"
+" be posted to Twitter."
+msgstr ""
-#: ../../extend/addon/addon/tictac/tictac.php:64
+#: ../../addon/twitter/twitter.php:207
+msgid "Log in with Twitter"
+msgstr "Mit Twitter anmelden"
+
+#: ../../addon/twitter/twitter.php:210
+msgid "Copy the PIN from Twitter here"
+msgstr "PIN von Twitter hier her kopieren"
+
+#: ../../addon/twitter/twitter.php:237
msgid ""
-"The handicap game disables the center position on the middle level because "
-"the player claiming this square often has an unfair advantage."
-msgstr "Bei einem Handicap-Spiel wird die Position im Zentrum der mittleren Ebene gesperrt, da der Spieler der dieses Feld für sich beansprucht meist einen unfairen Vorteil hat."
+"<strong>Note:</strong> Due your privacy settings (<em>Hide your profile "
+"details from unknown viewers?</em>) the link potentially included in public "
+"postings relayed to Twitter will lead the visitor to a blank page informing "
+"the visitor that the access to your profile has been restricted."
+msgstr ""
-#: ../../extend/addon/addon/tictac/tictac.php:183
-msgid "You go first..."
-msgstr "Du darfst anfangen..."
+#: ../../addon/twitter/twitter.php:242
+msgid "Allow posting to Twitter"
+msgstr "Erlaube die Veröffentlichung bei Twitter"
-#: ../../extend/addon/addon/tictac/tictac.php:188
-msgid "I'm going first this time..."
-msgstr "Diesmal werde ich anfangen..."
+#: ../../addon/twitter/twitter.php:242
+msgid ""
+"If enabled your public postings can be posted to the associated Twitter "
+"account"
+msgstr "Wenn aktiv können deine öffentlichen Beiträge bei dem verbundenen Twitter Account veröffentlicht werden."
-#: ../../extend/addon/addon/tictac/tictac.php:194
-msgid "You won!"
-msgstr "Sie haben gewonnen!"
+#: ../../addon/twitter/twitter.php:246
+msgid "Send public postings to Twitter by default"
+msgstr "Standardmäßig öffentliche Beiträge bei Twitter veröffentlichen"
-#: ../../extend/addon/addon/tictac/tictac.php:200
-#: ../../extend/addon/addon/tictac/tictac.php:225
-msgid "\"Cat\" game!"
-msgstr "\"Katzen\"-Spiel!"
+#: ../../addon/twitter/twitter.php:246
+msgid ""
+"If enabled your public postings will be posted to the associated Twitter "
+"account by default"
+msgstr "Wenn aktiv können deine öffentlichen Beiträge bei dem verbundenen Twitter Account veröffentlicht werden."
-#: ../../extend/addon/addon/tictac/tictac.php:223
-msgid "I won!"
-msgstr "Ich habe gewonnen!"
+#: ../../addon/twitter/twitter.php:264
+msgid "Twitter Post Settings"
+msgstr "Twitter-Beitragseinstellungen"
-#: ../../extend/addon/addon/tour/tour.php:75
+#: ../../addon/smileybutton/smileybutton.php:273
+msgid "Deactivate the feature"
+msgstr "Diese Funktion abschalten"
+
+#: ../../addon/smileybutton/smileybutton.php:277
+msgid "Hide the button and show the smilies directly."
+msgstr "Verstecke die Schaltfläche und zeige die Smilies direkt an."
+
+#: ../../addon/smileybutton/smileybutton.php:281
+msgid "Smileybutton Settings"
+msgstr "Smileyknopf-Einstellungen"
+
+#: ../../addon/piwik/piwik.php:85
+msgid ""
+"This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> "
+"analytics tool."
+msgstr "Diese Website verwendet <a href='http://www.piwik.org'>Piwik</a>, um die Besucherzugriffe auszuwerten."
+
+#: ../../addon/piwik/piwik.php:88
+#, php-format
+msgid ""
+"If you do not want that your visits are logged this way you <a href='%s'>can"
+" set a cookie to prevent Piwik from tracking further visits of the site</a> "
+"(opt-out)."
+msgstr "Wenn Du nicht möchtest, dass Deine Besuche zu diesem Zweck gespeichert werden, kannst Du <a href='%s'>ein Cookie setzen, welches Piwik davon abhält, Deine weiteren Besuche auf dieser Website zu verfolgen</a> (Opt-out)."
+
+#: ../../addon/piwik/piwik.php:96
+msgid "Piwik Base URL"
+msgstr "Piwik Basis-URL"
+
+#: ../../addon/piwik/piwik.php:96
+msgid ""
+"Absolute path to your Piwik installation. (without protocol (http/s), with "
+"trailing slash)"
+msgstr "Der absolute Pfad zu Deiner Piwik-Installation (ohne Protokoll (http/s), aber mit abschließendem Schrägstrich / )."
+
+#: ../../addon/piwik/piwik.php:97
+msgid "Site ID"
+msgstr "Seitenkennung"
+
+#: ../../addon/piwik/piwik.php:98
+msgid "Show opt-out cookie link?"
+msgstr "Den Opt-out Cookie-Link anzeigen?"
+
+#: ../../addon/piwik/piwik.php:99
+msgid "Asynchronous tracking"
+msgstr "Asynchrones Tracking"
+
+#: ../../addon/piwik/piwik.php:100
+msgid "Enable frontend JavaScript error tracking"
+msgstr "Ermögliche Frontend-JavaScript-Fehlertracking"
+
+#: ../../addon/piwik/piwik.php:100
+msgid "This feature requires Piwik >= 2.2.0"
+msgstr "Diese Funktion erfordert Piwik >= 2.2.0"
+
+#: ../../addon/tour/tour.php:75
msgid "Edit your profile and change settings."
msgstr "Bearbeite dein Profil und ändere die Einstellungen."
-#: ../../extend/addon/addon/tour/tour.php:76
+#: ../../addon/tour/tour.php:76
msgid "Click here to see activity from your connections."
msgstr "Klicke hier, um die Aktivitäten Deiner Verbindungen zu sehen."
-#: ../../extend/addon/addon/tour/tour.php:77
+#: ../../addon/tour/tour.php:77
msgid "Click here to see your channel home."
msgstr "Klicke hier, um Deine Kanal-Hauptseite zu sehen."
-#: ../../extend/addon/addon/tour/tour.php:78
+#: ../../addon/tour/tour.php:78
msgid "You can access your private messages from here."
msgstr "Hierüber kannst Du auf Deine privaten Nachrichten zugreifen."
-#: ../../extend/addon/addon/tour/tour.php:79
+#: ../../addon/tour/tour.php:79
msgid "Create new events here."
msgstr "Neue Termine hier erstellen"
-#: ../../extend/addon/addon/tour/tour.php:80
+#: ../../addon/tour/tour.php:80
msgid ""
"You can accept new connections and change permissions for existing ones "
"here. You can also e.g. create groups of contacts."
msgstr "Du kannst hier neue Verbindungen akzeptieren sowie die Einstellungen bereits vorhandener Vebindungen bearbeiten. Außerdem kannst Du Verbindungen in Gruppen zusammenfassen."
-#: ../../extend/addon/addon/tour/tour.php:81
+#: ../../addon/tour/tour.php:81
msgid "System notifications will arrive here"
msgstr "Systembenachrichtigungen werden hier eintreffen"
-#: ../../extend/addon/addon/tour/tour.php:82
+#: ../../addon/tour/tour.php:82
msgid "Search for content and users"
msgstr "Nach Inhalt von Benutzern suchen"
-#: ../../extend/addon/addon/tour/tour.php:83
+#: ../../addon/tour/tour.php:83
msgid "Browse for new contacts"
msgstr "Schaue nach möglichen neuen Verbindungen."
-#: ../../extend/addon/addon/tour/tour.php:84
+#: ../../addon/tour/tour.php:84
msgid "Launch installed apps"
msgstr "Installierte Apps starten"
-#: ../../extend/addon/addon/tour/tour.php:85
+#: ../../addon/tour/tour.php:85
msgid "Looking for help? Click here."
msgstr "Du benötigst Hilfe? Klicke hier."
-#: ../../extend/addon/addon/tour/tour.php:86
+#: ../../addon/tour/tour.php:86
msgid ""
"New events have occurred in your network. Click here to see what has "
"happened!"
msgstr "In Deinem Netzwerk gibt es neue Ereignisse. Klicke hier, um zu sehen, was passiert ist!"
-#: ../../extend/addon/addon/tour/tour.php:87
+#: ../../addon/tour/tour.php:87
msgid "You have received a new private message. Click here to see from who!"
msgstr "Du hast eine neue private Nachricht erhalten. Klicke hier, um zu sehen, von wem!"
-#: ../../extend/addon/addon/tour/tour.php:88
+#: ../../addon/tour/tour.php:88
msgid "There are events this week. Click here too see which!"
msgstr "Es gibt neue Termine diese Woche. Klicke hier, um zu sehen, welche!"
-#: ../../extend/addon/addon/tour/tour.php:89
+#: ../../addon/tour/tour.php:89
msgid "You have received a new introduction. Click here to see who!"
msgstr "Du hast eine neue Verbindungsanfrage erhalten. Klicke hier, um zu sehen, wer es ist!"
-#: ../../extend/addon/addon/tour/tour.php:90
+#: ../../addon/tour/tour.php:90
msgid ""
"There is a new system notification. Click here to see what has happened!"
msgstr "Es gibt eine neue Systembenachrichtigung. Klicke hier, um zu sehen, was passiert ist!"
-#: ../../extend/addon/addon/tour/tour.php:93
+#: ../../addon/tour/tour.php:93
msgid "Click here to share text, images, videos and sound."
msgstr "Klicke hier, um Texte, Bilder, Videos und Klänge zu teilen."
-#: ../../extend/addon/addon/tour/tour.php:94
+#: ../../addon/tour/tour.php:94
msgid "You can write an optional title for your update (good for long posts)."
msgstr "Du kannst Deinem Beitrag einen optionalen Titel geben (gut für lange Beiträge)."
-#: ../../extend/addon/addon/tour/tour.php:95
+#: ../../addon/tour/tour.php:95
msgid "Entering some categories here makes it easier to find your post later."
msgstr "Ein paar Kategorien hier einzugeben, macht es leichter, Deinen Beitrag später wiederzufinden."
-#: ../../extend/addon/addon/tour/tour.php:96
+#: ../../addon/tour/tour.php:96
msgid "Share photos, links, location, etc."
msgstr "Teile Photos, Links, Standort, usw."
-#: ../../extend/addon/addon/tour/tour.php:97
+#: ../../addon/tour/tour.php:97
msgid ""
"Only want to share content for a while? Make it expire at a certain date."
msgstr "Du möchtest diesen Inhalt nur für eine Weile teilen? Dann lass ihn zu einem bestimmten Datum ablaufen."
-#: ../../extend/addon/addon/tour/tour.php:98
+#: ../../addon/tour/tour.php:98
msgid "You can password protect content."
msgstr "Du kannst Inhalte mit einem Passwort schützen."
-#: ../../extend/addon/addon/tour/tour.php:99
+#: ../../addon/tour/tour.php:99
msgid "Choose who you share with."
msgstr "Wähle aus, mit wem Du teilen möchtest."
-#: ../../extend/addon/addon/tour/tour.php:101
+#: ../../addon/tour/tour.php:101
msgid "Click here when you are done."
msgstr "Klicke hier, wenn Du fertig bist."
-#: ../../extend/addon/addon/tour/tour.php:104
+#: ../../addon/tour/tour.php:104
msgid "Adjust from which channels posts should be displayed."
msgstr "Lege fest, von welchen Kanälen Beiträge angezeigt werden sollen."
-#: ../../extend/addon/addon/tour/tour.php:105
+#: ../../addon/tour/tour.php:105
msgid "Only show posts from channels in the specified privacy group."
msgstr "Zeige nur Beträge von Kanälen, die in einer bestimmten Gruppe sind."
-#: ../../extend/addon/addon/tour/tour.php:109
+#: ../../addon/tour/tour.php:109
msgid "Easily find posts containing tags (keywords preceded by the \"#\" symbol)."
msgstr "Finde Beiträge, die bestimmte Tags enthalten (Stichworte, die mit dem \"#\"-Symbol beginnen)."
-#: ../../extend/addon/addon/tour/tour.php:110
+#: ../../addon/tour/tour.php:110
msgid "Easily find posts in given category."
msgstr "Finde Beiträge in bestimmten Kategorien."
-#: ../../extend/addon/addon/tour/tour.php:111
+#: ../../addon/tour/tour.php:111
msgid "Easily find posts by date."
msgstr "Finde Beiträge anhand des Datums."
-#: ../../extend/addon/addon/tour/tour.php:112
+#: ../../addon/tour/tour.php:112
msgid ""
"Suggested users who have volounteered to be shown as suggestions, and who we"
" think you might find interesting."
msgstr "Vorgeschlagene Kanäle, die in ihren Einstellungen zugestimmt haben, als Vorschläge angezeigt zu werden, und die Du eventuell interessant finden könntest."
-#: ../../extend/addon/addon/tour/tour.php:113
+#: ../../addon/tour/tour.php:113
msgid "Here you see channels you have connected to."
msgstr "Hier siehst du die Kanäle, mit denen Du verbunden bist."
-#: ../../extend/addon/addon/tour/tour.php:114
+#: ../../addon/tour/tour.php:114
msgid "Save your search so you can repeat it at a later date."
msgstr "Speichere Deine Suche, so dass Du sie später leicht erneut durchführen kannst."
-#: ../../extend/addon/addon/tour/tour.php:117
+#: ../../addon/tour/tour.php:117
msgid ""
"If you see this icon you can be sure that the sender is who it say it is. It"
" is normal that it is not always possible to verify the sender, so the icon "
"will be missing sometimes. There is usually no need to worry about that."
msgstr "Wenn Du dieses Symbol siehst, kannst Du weitgehend sicher sein, dass der Ansender dem angegebenen entspricht. Nicht immer ist es möglich, den Absender zu verifizieren, daher fehlt das Symbol mitunter. Das ist aber in der Regel kein Grund zur Sorge."
-#: ../../extend/addon/addon/tour/tour.php:118
+#: ../../addon/tour/tour.php:118
msgid ""
"Danger! It seems someone tried to forge a message! This message is not "
"necessarily from who it says it is from!"
msgstr "Vorsicht! Es kann sein, dass jemand versucht, eine Nachricht zu fälschen! Diese Nachricht muss nicht unbedingt vom angegebenen Absender stammen!"
-#: ../../extend/addon/addon/tour/tour.php:125
+#: ../../addon/tour/tour.php:125
msgid ""
"Welcome to Hubzilla! Would you like to see a tour of the UI?</p> <p>You can "
"pause it at any time and continue where you left off by reloading the page, "
@@ -10021,1029 +10482,318 @@ msgid ""
"return key"
msgstr "Willkommen zu Hubzilla! Möchtest Du eine Tour der Benutzeroberfläche angezeigt bekommen?</p><p>Du kannst zu jeder Zeit pausieren und fortsetzen, wo Du aufgehört hast, indem Du die Seite neu lädtst, oder zu einer anderen Seite springst.</p><p>Du kannst auc durch das Drücken der Enter-Taste weitergehen."
-#: ../../extend/addon/addon/twitter/twitter.php:99
-msgid "Post to Twitter"
-msgstr "Bei Twitter veröffentlichen"
-
-#: ../../extend/addon/addon/twitter/twitter.php:154
-msgid "Twitter settings updated."
-msgstr "Twitter-Einstellungen aktualisiert."
-
-#: ../../extend/addon/addon/twitter/twitter.php:183
-msgid ""
-"No consumer key pair for Twitter found. Please contact your site "
-"administrator."
-msgstr "Es wurde kein Consumer-Schlüsselpaar für Twitter gefunden. Bitte kontaktiere deinen Seiten-Administrator."
+#: ../../addon/sendzid/sendzid.php:25
+msgid "Extended Identity Sharing"
+msgstr "Erweitertes Teilen von Identitäten"
-#: ../../extend/addon/addon/twitter/twitter.php:205
+#: ../../addon/sendzid/sendzid.php:26
msgid ""
-"At this Hubzilla instance the Twitter plugin was enabled but you have not "
-"yet connected your account to your Twitter account. To do so click the "
-"button below to get a PIN from Twitter which you have to copy into the input"
-" box below and submit the form. Only your <strong>public</strong> posts will"
-" be posted to Twitter."
+"Share your identity with all websites on the internet. When disabled, "
+"identity is only shared with sites in the matrix."
msgstr ""
-#: ../../extend/addon/addon/twitter/twitter.php:207
-msgid "Log in with Twitter"
-msgstr "Mit Twitter anmelden"
+#: ../../addon/tictac/tictac.php:21
+msgid "Three Dimensional Tic-Tac-Toe"
+msgstr "Dreidimensionales Tic-Tac-Toe"
-#: ../../extend/addon/addon/twitter/twitter.php:210
-msgid "Copy the PIN from Twitter here"
-msgstr "PIN von Twitter hier her kopieren"
+#: ../../addon/tictac/tictac.php:54
+msgid "3D Tic-Tac-Toe"
+msgstr "3D Tic-Tac-Toe"
-#: ../../extend/addon/addon/twitter/twitter.php:237
-msgid ""
-"<strong>Note:</strong> Due your privacy settings (<em>Hide your profile "
-"details from unknown viewers?</em>) the link potentially included in public "
-"postings relayed to Twitter will lead the visitor to a blank page informing "
-"the visitor that the access to your profile has been restricted."
-msgstr ""
+#: ../../addon/tictac/tictac.php:59
+msgid "New game"
+msgstr "Neues Spiel"
-#: ../../extend/addon/addon/twitter/twitter.php:242
-msgid "Allow posting to Twitter"
-msgstr "Erlaube die Veröffentlichung bei Twitter"
+#: ../../addon/tictac/tictac.php:60
+msgid "New game with handicap"
+msgstr "Neues Handicaü-Spiel"
-#: ../../extend/addon/addon/twitter/twitter.php:242
+#: ../../addon/tictac/tictac.php:61
msgid ""
-"If enabled your public postings can be posted to the associated Twitter "
-"account"
-msgstr "Wenn aktiv können deine öffentlichen Beiträge bei dem verbundenen Twitter Account veröffentlicht werden."
+"Three dimensional tic-tac-toe is just like the traditional game except that "
+"it is played on multiple levels simultaneously. "
+msgstr "3D Tic-Tac-Toe funktioniert wie das ursprüngliche Spiel, nur dass es auf mehreren Ebenen gleichzeitig gespielt wird."
-#: ../../extend/addon/addon/twitter/twitter.php:246
-msgid "Send public postings to Twitter by default"
-msgstr "Standardmäßig öffentliche Beiträge bei Twitter veröffentlichen"
+#: ../../addon/tictac/tictac.php:62
+msgid ""
+"In this case there are three levels. You win by getting three in a row on "
+"any level, as well as up, down, and diagonally across the different levels."
+msgstr "In diesem Fall sind es drei Ebenen. Du gewinnst, wenn es dir gelingt drei in einer Reihe auf einer beliebigen Ebene oder diagonal über die verschiedenen Ebenen hinweg zu erreichen."
-#: ../../extend/addon/addon/twitter/twitter.php:246
+#: ../../addon/tictac/tictac.php:64
msgid ""
-"If enabled your public postings will be posted to the associated Twitter "
-"account by default"
-msgstr "Wenn aktiv können deine öffentlichen Beiträge bei dem verbundenen Twitter Account veröffentlicht werden."
+"The handicap game disables the center position on the middle level because "
+"the player claiming this square often has an unfair advantage."
+msgstr "Bei einem Handicap-Spiel wird die Position im Zentrum der mittleren Ebene gesperrt, da der Spieler der dieses Feld für sich beansprucht meist einen unfairen Vorteil hat."
-#: ../../extend/addon/addon/twitter/twitter.php:264
-msgid "Twitter Post Settings"
-msgstr "Twitter-Beitragseinstellungen"
+#: ../../addon/tictac/tictac.php:183
+msgid "You go first..."
+msgstr "Du darfst anfangen..."
-#: ../../extend/addon/addon/twitter/twitter.php:773
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:95
-msgid "Submit Settings"
-msgstr "Einstellungen absenden"
+#: ../../addon/tictac/tictac.php:188
+msgid "I'm going first this time..."
+msgstr "Diesmal werde ich anfangen..."
-#: ../../extend/addon/addon/upload_limits/upload_limits.php:25
-msgid "Show Upload Limits"
-msgstr "Hochladebeschränkungen anzeigen"
+#: ../../addon/tictac/tictac.php:194
+msgid "You won!"
+msgstr "Sie haben gewonnen!"
-#: ../../extend/addon/addon/upload_limits/upload_limits.php:27
-msgid "Hubzilla configured maximum size: "
-msgstr "Die in Hubzilla eingestellte maximale Größe:"
+#: ../../addon/tictac/tictac.php:200 ../../addon/tictac/tictac.php:225
+msgid "\"Cat\" game!"
+msgstr "\"Katzen\"-Spiel!"
-#: ../../extend/addon/addon/upload_limits/upload_limits.php:28
-msgid "PHP upload_max_filesize: "
-msgstr "PHP upload_max_filesize:"
+#: ../../addon/tictac/tictac.php:223
+msgid "I won!"
+msgstr "Ich habe gewonnen!"
-#: ../../extend/addon/addon/upload_limits/upload_limits.php:29
-msgid "PHP post_max_size (must be larger than upload_max_filesize): "
-msgstr "PHP post_max_size (muss größer sein als upload_max_filesize):"
+#: ../../addon/pageheader/pageheader.php:43
+msgid "Message to display on every page on this server"
+msgstr "Nachricht, die auf jeder Seite dieses Servers angezeigt werden soll"
-#: ../../extend/addon/addon/visage/visage.php:93
-msgid "Recent Channel/Profile Viewers"
-msgstr "Kürzliche Kanal/Profil Besucher"
+#: ../../addon/pageheader/pageheader.php:48
+msgid "Pageheader Settings"
+msgstr "Nachrichtenkopf-Einstellungen"
-#: ../../extend/addon/addon/visage/visage.php:98
-msgid "This plugin/addon has not been configured."
-msgstr "Dieses Plugin/Addon wurde noch nicht konfiguriert."
+#: ../../addon/pageheader/pageheader.php:64
+msgid "pageheader Settings saved."
+msgstr "Nachrichtenkopf-Einstellungen gespeichert."
-#: ../../extend/addon/addon/visage/visage.php:99
-#, php-format
-msgid "Please visit the Visage settings on %s"
-msgstr "Bitte rufe die Visage Einstellungen auf %s auf"
+#: ../../addon/moremoods/moremoods.php:19
+msgid "lonely"
+msgstr "einsam"
-#: ../../extend/addon/addon/visage/visage.php:99
-msgid "your feature settings page"
-msgstr "Die Funktions-Einstellungsseite"
+#: ../../addon/moremoods/moremoods.php:20
+msgid "drunk"
+msgstr "betrunken"
-#: ../../extend/addon/addon/visage/visage.php:112
-msgid "No entries."
-msgstr "Keine Einträge."
+#: ../../addon/moremoods/moremoods.php:21
+msgid "horny"
+msgstr "geil"
-#: ../../extend/addon/addon/visage/visage.php:166
-msgid "Enable Visage Visitor Logging"
-msgstr "Aktiviere das Visage-Besucher Logging"
+#: ../../addon/moremoods/moremoods.php:22
+msgid "stoned"
+msgstr "bekifft"
-#: ../../extend/addon/addon/visage/visage.php:170
-msgid "Visage Settings"
-msgstr "Visage-Einstellungen"
+#: ../../addon/moremoods/moremoods.php:23
+msgid "fucked up"
+msgstr "beschissen"
-#: ../../extend/addon/addon/wholikesme/wholikesme.php:29
-msgid "Who likes me?"
-msgstr "Wer mag mich?"
+#: ../../addon/moremoods/moremoods.php:24
+msgid "clusterfucked"
+msgstr "clusterfucked"
-#: ../../extend/addon/addon/wppost/wppost.php:45
-msgid "Post to WordPress"
-msgstr "Auf WordPress posten"
+#: ../../addon/moremoods/moremoods.php:25
+msgid "crazy"
+msgstr "verrückt"
-#: ../../extend/addon/addon/wppost/wppost.php:82
-msgid "Enable WordPress Post Plugin"
-msgstr "Aktiviere das WordPress-Plugin"
+#: ../../addon/moremoods/moremoods.php:26
+msgid "hurt"
+msgstr "verletzt"
-#: ../../extend/addon/addon/wppost/wppost.php:86
-msgid "WordPress username"
-msgstr "WordPress-Benutzername"
+#: ../../addon/moremoods/moremoods.php:27
+msgid "sleepy"
+msgstr "müde"
-#: ../../extend/addon/addon/wppost/wppost.php:90
-msgid "WordPress password"
-msgstr "WordPress-Passwort"
+#: ../../addon/moremoods/moremoods.php:28
+msgid "grumpy"
+msgstr "mürrisch"
-#: ../../extend/addon/addon/wppost/wppost.php:94
-msgid "WordPress API URL"
-msgstr "WordPress-API-URL"
+#: ../../addon/moremoods/moremoods.php:29
+msgid "high"
+msgstr "hoch"
-#: ../../extend/addon/addon/wppost/wppost.php:95
-msgid "Typically https://your-blog.tld/xmlrpc.php"
-msgstr "Normalerweise https://your-blog.tld/xmlrpc.php"
+#: ../../addon/moremoods/moremoods.php:30
+msgid "semi-conscious"
+msgstr "halb bewusstlos"
-#: ../../extend/addon/addon/wppost/wppost.php:98
-msgid "WordPress blogid"
-msgstr "WordPress blogid"
+#: ../../addon/moremoods/moremoods.php:31
+msgid "in love"
+msgstr "verliebt"
-#: ../../extend/addon/addon/wppost/wppost.php:99
-msgid "For multi-user sites such as wordpress.com, otherwise leave blank"
-msgstr "Nötig für Mehrbenutzer Seiten wie wordpress.com, andernfalls frei lassen"
+#: ../../addon/moremoods/moremoods.php:32
+msgid "in lust"
+msgstr ""
-#: ../../extend/addon/addon/wppost/wppost.php:105
-msgid "Post to WordPress by default"
-msgstr "Standardmäßig auf auf WordPress posten"
+#: ../../addon/moremoods/moremoods.php:33
+msgid "naked"
+msgstr "nackt"
-#: ../../extend/addon/addon/wppost/wppost.php:109
-msgid "Forward comments (requires hubzilla_wp plugin)"
-msgstr "Kommentare weiterleiten (benötigt hubzilla_wp Plugin)"
+#: ../../addon/moremoods/moremoods.php:34
+msgid "stinky"
+msgstr "stinkend"
-#: ../../extend/addon/addon/wppost/wppost.php:113
-msgid "WordPress Post Settings"
-msgstr "WordPress-Beitragseinstellungen"
+#: ../../addon/moremoods/moremoods.php:35
+msgid "sweaty"
+msgstr "verschwitzt"
-#: ../../extend/addon/addon/wppost/wppost.php:129
-msgid "Wordpress Settings saved."
-msgstr "Wordpress-Einstellungen gespeichert."
+#: ../../addon/moremoods/moremoods.php:36
+msgid "bleeding out"
+msgstr "blutend"
+
+#: ../../addon/moremoods/moremoods.php:37
+msgid "victorious"
+msgstr "siegreich"
+
+#: ../../addon/moremoods/moremoods.php:38
+msgid "defeated"
+msgstr "besiegt"
-#: ../../extend/addon/addon/xmpp/xmpp.php:31
+#: ../../addon/moremoods/moremoods.php:39
+msgid "envious"
+msgstr "neidisch"
+
+#: ../../addon/moremoods/moremoods.php:40
+msgid "jealous"
+msgstr "eifersüchtig"
+
+#: ../../addon/xmpp/xmpp.php:31
msgid "XMPP settings updated."
msgstr "XMPP-Einstellungen aktualisiert."
-#: ../../extend/addon/addon/xmpp/xmpp.php:53
+#: ../../addon/xmpp/xmpp.php:53
msgid "Enable Chat"
msgstr "Chat aktivieren"
-#: ../../extend/addon/addon/xmpp/xmpp.php:58
+#: ../../addon/xmpp/xmpp.php:58
msgid "Individual credentials"
msgstr "Individuelle Anmeldedaten"
-#: ../../extend/addon/addon/xmpp/xmpp.php:64
+#: ../../addon/xmpp/xmpp.php:64
msgid "Jabber BOSH server"
msgstr "Jabber BOSH Server"
-#: ../../extend/addon/addon/xmpp/xmpp.php:69
+#: ../../addon/xmpp/xmpp.php:69
msgid "XMPP Settings"
msgstr "XMPP-Einstellungen"
-#: ../../extend/addon/addon/xmpp/xmpp.php:92
+#: ../../addon/xmpp/xmpp.php:92
msgid "Jabber BOSH host"
msgstr "Jabber BOSH Host"
-#: ../../extend/addon/addon/xmpp/xmpp.php:93
+#: ../../addon/xmpp/xmpp.php:93
msgid "Use central userbase"
msgstr "Zentrale Benutzerbasis verwenden"
-#: ../../extend/addon/addon/xmpp/xmpp.php:93
+#: ../../addon/xmpp/xmpp.php:93
msgid ""
"If enabled, members will automatically login to an ejabberd server that has "
"to be installed on this machine with synchronized credentials via the "
"\"auth_ejabberd.php\" script."
msgstr ""
-#: ../../extend/addon/addon/cdav/include/widgets.php:37
-msgid "Select Channel"
-msgstr "Kanal auswählen"
-
-#: ../../extend/addon/addon/cdav/include/widgets.php:42
-msgid "Read-write"
-msgstr "Lesen-schreiben"
-
-#: ../../extend/addon/addon/cdav/include/widgets.php:43
-msgid "Read-only"
-msgstr "Nur Lesen"
-
-#: ../../extend/addon/addon/cdav/include/widgets.php:116
-msgid "My Calendars"
-msgstr "Meine Kalender"
-
-#: ../../extend/addon/addon/cdav/include/widgets.php:118
-msgid "Shared Calendars"
-msgstr "Geteilte Kalender"
-
-#: ../../extend/addon/addon/cdav/include/widgets.php:122
-msgid "Share this calendar"
-msgstr "Diesen Kalender teilen"
-
-#: ../../extend/addon/addon/cdav/include/widgets.php:124
-msgid "Calendar name and color"
-msgstr "Kalendername und -farbe"
-
-#: ../../extend/addon/addon/cdav/include/widgets.php:126
-msgid "Create new calendar"
-msgstr "Neuen Kalender erstellen"
-
-#: ../../extend/addon/addon/cdav/include/widgets.php:128
-msgid "Calendar Name"
-msgstr "Kalendername"
-
-#: ../../extend/addon/addon/cdav/include/widgets.php:129
-msgid "Calendar Tools"
-msgstr "Kalenderwerkzeuge"
-
-#: ../../extend/addon/addon/cdav/include/widgets.php:130
-msgid "Import calendar"
-msgstr "Kalender importieren"
-
-#: ../../extend/addon/addon/cdav/include/widgets.php:131
-msgid "Select a calendar to import to"
-msgstr "Kalender zum Hineinimportieren auswählen"
-
-#: ../../extend/addon/addon/cdav/include/widgets.php:158
-msgid "Addressbooks"
-msgstr "Adressbücher"
-
-#: ../../extend/addon/addon/cdav/include/widgets.php:160
-msgid "Addressbook name"
-msgstr "Adressbuchname"
-
-#: ../../extend/addon/addon/cdav/include/widgets.php:162
-msgid "Create new addressbook"
-msgstr "Neues Adressbuch erstellen"
-
-#: ../../extend/addon/addon/cdav/include/widgets.php:163
-msgid "Addressbook Name"
-msgstr "Adressbuchname"
-
-#: ../../extend/addon/addon/cdav/include/widgets.php:165
-msgid "Addressbook Tools"
-msgstr "Adressbuchwerkzeuge"
-
-#: ../../extend/addon/addon/cdav/include/widgets.php:166
-msgid "Import addressbook"
-msgstr "Adressbuch importieren"
-
-#: ../../extend/addon/addon/cdav/include/widgets.php:167
-msgid "Select an addressbook to import to"
-msgstr "Adressbuch zum Hineinimportieren auswählen"
-
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:744
-msgid "INVALID EVENT DISMISSED!"
-msgstr "UNGÃœLTIGEN TERMIN ABGELEHNT!"
-
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:745
-msgid "Summary: "
-msgstr "Zusammenfassung:"
-
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:746
-msgid "Date: "
-msgstr "Datum:"
-
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:747
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:754
-msgid "Reason: "
-msgstr "Grund:"
-
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:752
-msgid "INVALID CARD DISMISSED!"
-msgstr "UNGÃœLTIGE KARTE ABGELEHNT!"
-
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:753
-msgid "Name: "
-msgstr "Name: "
-
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:770
-msgid ""
-"You have to enable this plugin in Feature/Addon Settings > CalDAV/CardDAV "
-"Settings before you can use it."
-msgstr ""
-
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:836
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:837
-msgid "Example: YYYY-MM-DD HH:mm"
-msgstr "Beispiel: JJJJ-MM-TT HH:mm"
-
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:837
-msgid "End date and time"
-msgstr "Enddatum und -zeit"
-
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:852
-msgid "List month"
-msgstr ""
-
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:853
-msgid "List week"
-msgstr ""
-
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:854
-msgid "List day"
-msgstr ""
-
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:861
-msgid "More"
-msgstr "Mehr"
-
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:862
-msgid "Less"
-msgstr "Weniger"
-
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:863
-msgid "Select calendar"
-msgstr "Kalender auswählen"
-
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:865
-msgid "Delete all"
-msgstr "Alles löschen"
-
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:867
-msgid "Sorry! Editing of recurrent events is not yet implemented."
-msgstr "Entschuldigung, aber das Bearbeiten von wiederkehrenden Veranstaltungen ist leider noch nicht implementiert."
-
-#: ../../extend/addon/addon/cdav/cdav.php:36
-msgid "Errors encountered creating database table: "
-msgstr "Fehler beim Anlegen der Datenbank-Tabellen aufgetreten."
-
-#: ../../extend/addon/addon/cdav/cdav.php:197
-msgid "Default Calendar"
-msgstr "Standardkalender"
-
-#: ../../extend/addon/addon/cdav/cdav.php:206
-msgid "Default Addressbook"
-msgstr "Standardadressbuch"
-
-#: ../../extend/addon/addon/cdav/cdav.php:215
-msgid "CalDAV/CardDAV Settings saved."
-msgstr "CalDAV/CardDAV-Einstellungen gespeichert."
-
-#: ../../extend/addon/addon/cdav/cdav.php:234
-msgid "Enable CalDAV/CardDAV Server for this channel"
-msgstr "Aktiviere den CalDAV/CardDAV Server für diesen Kanal"
-
-#: ../../extend/addon/addon/cdav/cdav.php:237
-#, php-format
-msgid "Your CalDAV resources are located at %s "
-msgstr "Deine CalDAV Resourcen sind unter %s verfügbar"
-
-#: ../../extend/addon/addon/cdav/cdav.php:240
-#, php-format
-msgid "Your CardDAV resources are located at %s "
-msgstr "Deine CardDAV Ressourcen sind unter %s verfügbar"
-
-#: ../../extend/addon/addon/cdav/cdav.php:246
-msgid "CalDAV/CardDAV Settings"
-msgstr "CalDAV/CardDAV-Einstellungen"
-
-#: ../../extend/addon/addon/cdav/cdav.php:272
-#: ../../include/connections.php:896
-msgid "Home, Voice"
-msgstr "Zuhause, Sprache"
-
-#: ../../extend/addon/addon/cdav/cdav.php:273
-#: ../../include/connections.php:897
-msgid "Home, Fax"
-msgstr "Zuhause, Fax"
-
-#: ../../extend/addon/addon/cdav/cdav.php:275
-#: ../../include/connections.php:899
-msgid "Work, Voice"
-msgstr "Arbeit, Sprache"
-
-#: ../../extend/addon/addon/cdav/cdav.php:276
-#: ../../include/connections.php:900
-msgid "Work, Fax"
-msgstr "Arbeit, Fax"
-
-#: ../../extend/addon/addon/chess/chess.php:276
-#: ../../extend/addon/addon/chess/chess.php:430
-msgid "Invalid game."
-msgstr "Ungültiges Spiel."
-
-#: ../../extend/addon/addon/chess/chess.php:282
-#: ../../extend/addon/addon/chess/chess.php:436
-msgid "You are not a player in this game."
-msgstr "Sie sind kein Spieler in diesem Spiel."
-
-#: ../../extend/addon/addon/chess/chess.php:315
-msgid "You must be a local channel to create a game."
-msgstr "Um ein Spiel zu eröffnen, musst du ein lokaler Kanal sein"
-
-#: ../../extend/addon/addon/chess/chess.php:333
-msgid "You must select one opponent that is not yourself."
-msgstr "Du musst einen Gegner wählen, der nicht du selbst ist"
-
-#: ../../extend/addon/addon/chess/chess.php:336
-msgid "Creating new game..."
-msgstr "Neues Spiel wird erstellt..."
-
-#: ../../extend/addon/addon/chess/chess.php:342
-msgid "You must select white or black."
-msgstr "Sie müssen weiß oder schwarz auswählen."
-
-#: ../../extend/addon/addon/chess/chess.php:349
-msgid "Error creating new game."
-msgstr "Fehler beim Erstellen eines neuen Spiels."
-
-#: ../../extend/addon/addon/chess/chess.php:379 ../../include/channel.php:899
-msgid "Requested channel is not available."
-msgstr "Angeforderte Kanal nicht verfügbar."
-
-#: ../../extend/addon/addon/chess/chess.php:392
-msgid "You must select a local channel /chess/channelname"
-msgstr "Du musst einen lokalen Kanal/Schach(Kanalnamen aufwählen"
-
-#: ../../extend/addon/addon/chess/chess.php:920
-msgid "Enable notifications"
-msgstr "Benachrichtigungen aktivieren"
-
-#: ../../extend/addon/addon/likebanner/likebanner.php:51
-msgid "Your Webbie:"
-msgstr "Dein Webbie"
-
-#: ../../extend/addon/addon/likebanner/likebanner.php:54
-msgid "Fontsize (px):"
-msgstr "Schriftgröße (px):"
-
-#: ../../extend/addon/addon/likebanner/likebanner.php:68
-msgid "Link:"
-msgstr "Link:"
-
-#: ../../extend/addon/addon/likebanner/likebanner.php:70
-msgid "Like us on Hubzilla"
-msgstr "Like us on Hubzilla"
-
-#: ../../extend/addon/addon/likebanner/likebanner.php:72
-msgid "Embed:"
-msgstr "Einbetten"
-
-#: ../../extend/addon/addon/openid/Mod_Id.php:85
-#: ../../include/selectors.php:49 ../../include/selectors.php:66
-msgid "Male"
-msgstr "Männlich"
-
-#: ../../extend/addon/addon/openid/Mod_Id.php:87
-#: ../../include/selectors.php:49 ../../include/selectors.php:66
-msgid "Female"
-msgstr "Weiblich"
-
-#: ../../extend/addon/addon/openid/MysqlProvider.php:52
-msgid "First Name"
-msgstr "Vorname"
-
-#: ../../extend/addon/addon/openid/MysqlProvider.php:53
-msgid "Last Name"
-msgstr "Nachname"
-
-#: ../../extend/addon/addon/openid/MysqlProvider.php:55
-msgid "Full Name"
-msgstr "Voller Name"
-
-#: ../../extend/addon/addon/openid/MysqlProvider.php:61
-msgid "Profile Photo 16px"
-msgstr "Profilfoto 16 px"
-
-#: ../../extend/addon/addon/openid/MysqlProvider.php:62
-msgid "Profile Photo 32px"
-msgstr "Profilfoto 32 px"
-
-#: ../../extend/addon/addon/openid/MysqlProvider.php:63
-msgid "Profile Photo 48px"
-msgstr "Profilfoto 48 px"
-
-#: ../../extend/addon/addon/openid/MysqlProvider.php:64
-msgid "Profile Photo 64px"
-msgstr "Profilfoto 64 px"
-
-#: ../../extend/addon/addon/openid/MysqlProvider.php:65
-msgid "Profile Photo 80px"
-msgstr "Profilfoto 80 px"
-
-#: ../../extend/addon/addon/openid/MysqlProvider.php:66
-msgid "Profile Photo 128px"
-msgstr "Profilfoto 128 px"
-
-#: ../../extend/addon/addon/openid/MysqlProvider.php:67
-msgid "Timezone"
-msgstr "Zeitzone"
-
-#: ../../extend/addon/addon/openid/MysqlProvider.php:70
-msgid "Birth Year"
-msgstr "Geburtsjahr"
-
-#: ../../extend/addon/addon/openid/MysqlProvider.php:71
-msgid "Birth Month"
-msgstr "Geburtsmonat"
-
-#: ../../extend/addon/addon/openid/MysqlProvider.php:72
-msgid "Birth Day"
-msgstr "Geburtstag"
-
-#: ../../extend/addon/addon/openid/MysqlProvider.php:73
-msgid "Birthdate"
-msgstr "Geburtsdatum"
-
-#: ../../extend/addon/addon/openid/openid.php:49
-msgid ""
-"We encountered a problem while logging in with the OpenID you provided. "
-"Please check the correct spelling of the ID."
-msgstr "Wir haben ein Problem mit der OpenID festgestellt, mit der Du Dich anmelden wolltest. Bitte überprüfe sie noch einmal."
-
-#: ../../extend/addon/addon/openid/openid.php:49
-msgid "The error message was:"
-msgstr "Die Fehlermeldung war:"
-
-#: ../../extend/addon/addon/openid/Mod_Openid.php:30
-msgid "OpenID protocol error. No ID returned."
-msgstr "OpenID-Protokollfehler. Keine Kennung zurückgegeben."
-
-#: ../../extend/addon/addon/openid/Mod_Openid.php:188
-#: ../../include/auth.php:286
-msgid "Login failed."
-msgstr "Login fehlgeschlagen."
-
-#: ../../extend/addon/addon/diaspora_reconnect/diaspora_reconnect.php:44
-#, php-format
-msgid "Reconnecting %d connections"
-msgstr "Erneuere %d Verbindungen"
-
-#: ../../extend/addon/addon/diaspora_reconnect/diaspora_reconnect.php:63
-msgid "Diaspora Reconnect"
-msgstr ""
-
-#: ../../extend/addon/addon/diaspora_reconnect/diaspora_reconnect.php:65
-msgid ""
-"Use this form to re-establish Diaspora connections which were initially made"
-" from a different hub."
-msgstr ""
-
-#: ../../extend/addon/addon/diaspora_reconnect/diaspora_reconnect.php:70
-msgid "Reconnect"
-msgstr "Erneut verbinden"
-
-#: ../../extend/addon/addon/mailtest/mailtest.php:19
-msgid "Send test email"
-msgstr "Test-E-Mail senden"
-
-#: ../../extend/addon/addon/mailtest/mailtest.php:66
-msgid "Mail sent."
-msgstr "Mail gesendet."
-
-#: ../../extend/addon/addon/mailtest/mailtest.php:68
-msgid "Sending of mail failed."
-msgstr "Senden der E-Mail fehlgeschlagen."
-
-#: ../../extend/addon/addon/mailtest/mailtest.php:77
-msgid "Mail Test"
-msgstr "Mail Test"
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:57
-msgid "Errors encountered deleting database table "
-msgstr "Beim Löschen der Datenbanktabelle sind Fehler aufgetreten."
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:96
-msgid "Drop tables when uninstalling?"
-msgstr "Lösche Tabellen beim Deinstallieren?"
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:96
-msgid ""
-"If checked, the Rendezvous database tables will be deleted when the plugin "
-"is uninstalled."
-msgstr "Wenn ausgewählt, werden die Rendezvous-Tabellen in der Datenbank gelöscht, sobald das Plugin deinstalliert wird."
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:97
-msgid "Mapbox Access Token"
-msgstr "Mapbox Zugangs-Token"
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:97
-msgid ""
-"If you enter a Mapbox access token, it will be used to retrieve map tiles "
-"from Mapbox instead of the default OpenStreetMap tile server."
-msgstr "Wenn Du ein Mapbox Zugangs-Token eingibst, werden die Kartendaten (Kacheln) damit von Mapbox geladen, anstatt von OpenStreetMap, welches die Voreinstellung ist."
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:162
-msgid "Rendezvous"
-msgstr "Rendezvous"
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:167
-msgid ""
-"This identity has been deleted by another member due to inactivity. Please "
-"press the \"New identity\" button or refresh the page to register a new "
-"identity. You may use the same name."
-msgstr "Diese Identität wurde von einem anderen Mitglied aufgrund von Inaktivität gelöscht. Bitte klicke auf \"Neue Identität\" oder aktualisiere die Website im Browser, um eine neue Identität zu registrieren. Du kannst dabei den selben Namen verwenden."
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:168
-msgid "Welcome to Rendezvous!"
-msgstr "Willkommen bei Rendezvous!"
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:169
-msgid ""
-"Enter your name to join this rendezvous. To begin sharing your location with"
-" the other members, tap the GPS control. When your location is discovered, a"
-" red dot will appear and others will be able to see you on the map."
-msgstr "Gib Deinen Namen ein, um diesem Rendezvous beizutreten. Um Deinen Standort mit anderen Mitgliedern zu teilen, klicke auf das GPS Symbol. Sobald Dein Standort ermittelt ist, erscheint ein roter Punkt, und die Anderen werden Dich auf der Karte sehen können."
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:171
-msgid "Let's meet here"
-msgstr "Lasst uns hier treffen"
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:174
-msgid "New marker"
-msgstr "Neue Markierung"
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:175
-msgid "Edit marker"
-msgstr "Markierung bearbeiten"
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:176
-msgid "New identity"
-msgstr "Neue Identität"
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:177
-msgid "Delete marker"
-msgstr "Markierung löschen"
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:178
-msgid "Delete member"
-msgstr "Mitglied löschen"
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:179
-msgid "Edit proximity alert"
-msgstr "Annäherungsalarm bearbeiten"
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:180
-msgid ""
-"A proximity alert will be issued when this member is within a certain radius"
-" of you.<br><br>Enter a radius in meters (0 to disable):"
-msgstr "Ein Annäherungsalarm wird ausgelöst werden, sobald sich dieses Mitglied innerhalb eines bestimmten Radius von Dir aufhält.<br><br>Gib einen Radius in Metern ein (0 zum Abschalten der Funktion):"
+#: ../../addon/wholikesme/wholikesme.php:29
+msgid "Who likes me?"
+msgstr "Wer mag mich?"
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:180
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:185
-msgid "distance"
-msgstr "Entfernung"
+#: ../../addon/pumpio/pumpio.php:148
+msgid "You are now authenticated to pumpio."
+msgstr "Du bist nun bei pumpio authenzifiziert."
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:181
-msgid "Proximity alert distance (meters)"
+#: ../../addon/pumpio/pumpio.php:149
+msgid "return to the featured settings page"
msgstr ""
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:182
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:184
-msgid ""
-"A proximity alert will be issued when you are within a certain radius of the"
-" marker location.<br><br>Enter a radius in meters (0 to disable):"
-msgstr "Ein Annäherungsalarm wird ausgelöst werden, sobald Du Dich innerhalb eines bestimmten Radius der Markierung aufhält.<br><br>Gib einen Radius in Metern ein (0 zum Abschalten der Funktion):"
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:183
-msgid "Marker proximity alert"
-msgstr "Annäherungsalarm für Markierung"
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:186
-msgid "Reminder note"
-msgstr "Erinnerungshinweis"
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:187
-msgid ""
-"Enter a note to be displayed when you are within the specified proximity..."
-msgstr "Gib eine Nachricht ein, die angezeigt werden soll, wenn Du Dich in der festgelegten Nähe befindest..."
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:199
-msgid "Add new rendezvous"
-msgstr "Neues Rendezvous hinzufügen"
+#: ../../addon/pumpio/pumpio.php:163
+msgid "Post to Pump.io"
+msgstr "Bei pumpio veröffentlichen"
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:200
-msgid ""
-"Create a new rendezvous and share the access link with those you wish to "
-"invite to the group. Those who open the link become members of the "
-"rendezvous. They can view other member locations, add markers to the map, or"
-" share their own locations with the group."
-msgstr "Erstelle ein neues Rendezvous und teile den Zugriffslink mit allen, die Du in die Gruppe einladen möchtest. Die, die den Link öffnen, werden Mitglieder des Rendezvous. Sie können die Standorte der anderen Mitglieder sehen, Marker zur Karte hinzufügen oder ihre eigenen Standorte mit der Gruppe teilen."
+#: ../../addon/pumpio/pumpio.php:198
+msgid "Pump.io servername"
+msgstr "Pump.io-Servername"
-#: ../../extend/addon/addon/firefox/firefox.php:23
-msgid "Install Firefox Sharing Tools"
-msgstr ""
+#: ../../addon/pumpio/pumpio.php:198
+msgid "Without \"http://\" or \"https://\""
+msgstr "Ohne \"http://\" oder \"https://\""
-#: ../../extend/addon/addon/firefox/firefox.php:34
-msgid "Share content from Firefox to $Projectname"
-msgstr "Inhalte von Firefox nach $Projectname teilen"
+#: ../../addon/pumpio/pumpio.php:202
+msgid "Pump.io username"
+msgstr "Pump.io-Benutzername"
-#: ../../extend/addon/addon/firefox/firefox.php:37
-msgid "Install Firefox Sharing Tools to this web browser"
-msgstr ""
+#: ../../addon/pumpio/pumpio.php:202
+msgid "Without the servername"
+msgstr "Ohne dem Servernamen"
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:105
-msgid "Error retrieving wiki"
-msgstr "Fehler beim Abrufen des Wiki"
+#: ../../addon/pumpio/pumpio.php:213
+msgid "You are not authenticated to pumpio"
+msgstr "Du bist nicht bei pumpio authentifiziert."
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:112
-msgid "Error creating zip file export folder"
-msgstr "Fehler bei der Erzeugung des Zip-Datei Export-Verzeichnisses "
+#: ../../addon/pumpio/pumpio.php:215
+msgid "(Re-)Authenticate your pump.io connection"
+msgstr "Deine pumpio Verbindung (erneut) authentifizieren"
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:130
-msgid "Error downloading wiki: "
-msgstr "Fehler beim Herunterladen des Wiki:"
+#: ../../addon/pumpio/pumpio.php:219
+msgid "Enable pump.io Post Plugin"
+msgstr "Aktiviere das pumpio-Plugin"
-#: ../../extend/addon/addon/gitwiki/gitwiki.php:76
-#: ../../include/widgets.php:970
-msgid "Wiki Pages"
-msgstr "Wikiseiten"
+#: ../../addon/pumpio/pumpio.php:223
+msgid "Post to pump.io by default"
+msgstr "Standardmäßig bei pumpio veröffentlichen"
-#: ../../extend/addon/addon/gitwiki/gitwiki.php:81
-#: ../../include/widgets.php:976
-msgid "Add new page"
-msgstr "Neue Seite hinzufügen"
+#: ../../addon/pumpio/pumpio.php:227
+msgid "Should posts be public"
+msgstr "Sollen die Beiträge öffentlich sein"
-#: ../../extend/addon/addon/gitwiki/gitwiki.php:82
-#: ../../include/widgets.php:977
-msgid "Page name"
-msgstr "Seitenname"
+#: ../../addon/pumpio/pumpio.php:231
+msgid "Mirror all public posts"
+msgstr "Öffentliche Beiträge spiegeln"
-#: ../../extend/addon/addon/gitwiki/gitwiki.php:95
-#: ../../include/widgets.php:927
-msgid "Wiki List"
-msgstr "Wikiliste"
+#: ../../addon/pumpio/pumpio.php:237
+msgid "Pump.io Post Settings"
+msgstr "Pump.io-Beitragseinstellungen"
-#: ../../extend/addon/addon/gnusoc/gnusoc.php:129
-msgid "Enable the GNU-Social protocol for this channel"
-msgstr "GNU Social Protokoll für diesen Kanal aktualisieren"
+#: ../../addon/pumpio/pumpio.php:266
+msgid "PumpIO Settings saved."
+msgstr "PumpIO-Einstellungen gespeichert."
-#: ../../extend/addon/addon/opensearch/opensearch.php:26 ../../boot.php:1187
-#, php-format
-msgctxt "opensearch"
-msgid "Search %1$s (%2$s)"
-msgstr "Suche %1$s (%2$s)"
+#: ../../addon/ldapauth/ldapauth.php:61
+msgid "An account has been created for you."
+msgstr "Ein Konto wurde für Sie erstellt."
-#: ../../extend/addon/addon/opensearch/opensearch.php:28 ../../boot.php:1187
-msgctxt "opensearch"
-msgid "$Projectname"
-msgstr "$Projectname"
+#: ../../addon/ldapauth/ldapauth.php:68
+msgid "Authentication successful but rejected: account creation is disabled."
+msgstr "Authentifizierung war erfolgreich wurde aber abgewiesen! Das Anlegen von Accounts wurde deaktiviert."
-#: ../../extend/addon/addon/opensearch/opensearch.php:43
+#: ../../addon/opensearch/opensearch.php:43
msgid "Search $Projectname"
-msgstr ""
-
-#: ../../include/dba/dba_driver.php:187
-#, php-format
-msgid "Cannot locate DNS info for database server '%s'"
-msgstr "Kann die DNS-Informationen für den Datenbank-Server '%s' nicht finden"
-
-#: ../../include/language.php:367 ../../include/text.php:1783
-msgid "default"
-msgstr "Standard"
+msgstr "$Projectname suchen"
-#: ../../include/language.php:380
-msgid "Select an alternate language"
-msgstr "Wähle eine alternative Sprache"
-
-#: ../../include/account.php:35
-msgid "Not a valid email address"
-msgstr "Ungültige E-Mail-Adresse"
-
-#: ../../include/account.php:37
-msgid "Your email domain is not among those allowed on this site"
-msgstr "Deine E-Mail-Adresse ist auf dieser Seite nicht erlaubt"
-
-#: ../../include/account.php:43
-msgid "Your email address is already registered at this site."
-msgstr "Deine E-Mail-Adresse ist auf dieser Seite bereits registriert."
-
-#: ../../include/account.php:75
-msgid "An invitation is required."
-msgstr "Eine Einladung wird benötigt."
-
-#: ../../include/account.php:79
-msgid "Invitation could not be verified."
-msgstr "Die Einladung konnte nicht bestätigt werden."
-
-#: ../../include/account.php:130
-msgid "Please enter the required information."
-msgstr "Bitte gib die benötigten Informationen ein."
-
-#: ../../include/account.php:198
-msgid "Failed to store account information."
-msgstr "Speichern der Nutzerkontodaten fehlgeschlagen."
-
-#: ../../include/account.php:263
-#, php-format
-msgid "Registration confirmation for %s"
-msgstr "Registrierungsbestätigung für %s"
-
-#: ../../include/account.php:330
-#, php-format
-msgid "Registration request at %s"
-msgstr "Registrierungsanfrage auf %s"
-
-#: ../../include/account.php:352
-msgid "your registration password"
-msgstr "Dein Registrierungspasswort"
-
-#: ../../include/account.php:358 ../../include/account.php:420
-#, php-format
-msgid "Registration details for %s"
-msgstr "Registrierungsdetails für %s"
-
-#: ../../include/account.php:431
-msgid "Account approved."
-msgstr "Nutzerkonto bestätigt."
-
-#: ../../include/account.php:471
-#, php-format
-msgid "Registration revoked for %s"
-msgstr "Registrierung für %s wurde widerrufen"
-
-#: ../../include/account.php:756 ../../include/account.php:758
-msgid "Click here to upgrade."
-msgstr "Klicke hier, um das Upgrade durchzuführen."
-
-#: ../../include/account.php:764
-msgid "This action exceeds the limits set by your subscription plan."
-msgstr "Diese Aktion überschreitet die Grenzen Ihres Abonnements."
-
-#: ../../include/account.php:769
-msgid "This action is not available under your subscription plan."
-msgstr "Diese Aktion ist in Ihrem Abonnement nicht verfügbar."
-
-#: ../../include/acl_selectors.php:208
-msgid "Who can see this?"
-msgstr "Wer kann das sehen?"
-
-#: ../../include/acl_selectors.php:209
-msgid "Custom selection"
-msgstr "Benutzerdefinierte Auswahl"
+#: ../../addon/redfiles/redfiles.php:119
+msgid "Redmatrix File Storage Import"
+msgstr ""
-#: ../../include/acl_selectors.php:210
-msgid ""
-"Select \"Show\" to allow viewing. \"Don't show\" lets you override and limit"
-" the scope of \"Show\"."
-msgstr "Wähle \"Anzeigen\", um Betrachtung zuzulassen. \"Nicht anzeigen\" überstimmt und limitiert den Aktionsradius von \"Anzeigen\" für Ausnahmen."
+#: ../../addon/redfiles/redfiles.php:120
+msgid "This will import all your Redmatrix cloud files to this channel."
+msgstr "Hiermit werden alle deine Daten aus der Redmatrix Cloud in diesen Kanal importiert."
-#: ../../include/acl_selectors.php:211
-msgid "Show"
-msgstr "Anzeigen"
+#: ../../addon/redfiles/redfilehelper.php:64
+msgid "file"
+msgstr "Datei"
-#: ../../include/acl_selectors.php:212
-msgid "Don't show"
-msgstr "Nicht anzeigen"
+#: ../../addon/hubwall/hubwall.php:19
+msgid "Send email to all members"
+msgstr "E-Mail an alle Mitglieder senden"
-#: ../../include/acl_selectors.php:245
+#: ../../addon/hubwall/hubwall.php:33
#, php-format
-msgid ""
-"Post permissions %s cannot be changed %s after a post is shared.</br />These"
-" permissions set who is allowed to view the post."
-msgstr "Beitragsberechtigungen %s können nicht geändert werden %s, nachdem der Beitrag gesendet wurde.<br />Diese Berechtigungen bestimmen, wer den Beitrag sehen kann."
-
-#: ../../include/taxonomy.php:188 ../../include/taxonomy.php:270
-#: ../../include/widgets.php:46 ../../include/widgets.php:469
-#: ../../include/contact_widgets.php:91
-msgid "Categories"
-msgstr "Kategorien"
-
-#: ../../include/taxonomy.php:228 ../../include/taxonomy.php:249
-msgid "Tags"
-msgstr "Schlagwörter"
-
-#: ../../include/taxonomy.php:293
-msgid "Keywords"
-msgstr "Schlüsselwörter"
-
-#: ../../include/taxonomy.php:314
-msgid "have"
-msgstr "habe"
-
-#: ../../include/taxonomy.php:314
-msgid "has"
-msgstr "hat"
-
-#: ../../include/taxonomy.php:315
-msgid "want"
-msgstr "will"
-
-#: ../../include/taxonomy.php:315
-msgid "wants"
-msgstr "will"
-
-#: ../../include/taxonomy.php:316
-msgid "likes"
-msgstr "gefällt"
-
-#: ../../include/taxonomy.php:317
-msgid "dislikes"
-msgstr "missfällt"
-
-#: ../../include/markdown.php:444
-msgid "Attachments:"
-msgstr "Anhänge:"
-
-#: ../../include/markdown.php:539 ../../include/event.php:22
-#: ../../include/event.php:69
-msgid "l F d, Y \\@ g:i A"
-msgstr "l, d. F Y, H:i"
-
-#: ../../include/markdown.php:541
-msgid "$Projectname event notification:"
-msgstr "$Projectname-Terminbenachrichtigung:"
-
-#: ../../include/markdown.php:545 ../../include/event.php:30
-#: ../../include/event.php:73
-msgid "Starts:"
-msgstr "Beginnt:"
-
-#: ../../include/markdown.php:553 ../../include/event.php:40
-#: ../../include/event.php:77
-msgid "Finishes:"
-msgstr "Endet:"
-
-#: ../../include/datetime.php:147
-msgid "Birthday"
-msgstr "Geburtstag"
-
-#: ../../include/datetime.php:149
-msgid "Age: "
-msgstr "Alter:"
-
-#: ../../include/datetime.php:151
-msgid "YYYY-MM-DD or MM-DD"
-msgstr "JJJJ-MM-TT oder MM-TT"
-
-#: ../../include/datetime.php:286 ../../boot.php:2578
-msgid "never"
-msgstr "Nie"
-
-#: ../../include/datetime.php:292
-msgid "less than a second ago"
-msgstr "Vor weniger als einer Sekunde"
+msgid "$1%s Administrator"
+msgstr "$1%s Administrator"
-#: ../../include/datetime.php:310
+#: ../../addon/hubwall/hubwall.php:73
#, php-format
-msgctxt "e.g. 22 hours ago, 1 minute ago"
-msgid "%1$d %2$s ago"
-msgstr "vor %1$d %2$s"
-
-#: ../../include/datetime.php:321
-msgctxt "relative_date"
-msgid "year"
-msgid_plural "years"
-msgstr[0] "Jahr"
-msgstr[1] "Jahre"
-
-#: ../../include/datetime.php:324
-msgctxt "relative_date"
-msgid "month"
-msgid_plural "months"
-msgstr[0] "Monat"
-msgstr[1] "Monate"
-
-#: ../../include/datetime.php:327
-msgctxt "relative_date"
-msgid "week"
-msgid_plural "weeks"
-msgstr[0] "Woche"
-msgstr[1] "Wochen"
-
-#: ../../include/datetime.php:330
-msgctxt "relative_date"
-msgid "day"
-msgid_plural "days"
-msgstr[0] "Tag"
-msgstr[1] "Tage"
-
-#: ../../include/datetime.php:333
-msgctxt "relative_date"
-msgid "hour"
-msgid_plural "hours"
-msgstr[0] "Stunde"
-msgstr[1] "Stunden"
-
-#: ../../include/datetime.php:336
-msgctxt "relative_date"
-msgid "minute"
-msgid_plural "minutes"
-msgstr[0] "Minute"
-msgstr[1] "Minuten"
+msgid "%1$d of %2$d messages sent."
+msgstr "%1$d von %2$d Nachrichten gesendet."
-#: ../../include/datetime.php:339
-msgctxt "relative_date"
-msgid "second"
-msgid_plural "seconds"
-msgstr[0] "Sekunde"
-msgstr[1] "Sekunden"
+#: ../../addon/hubwall/hubwall.php:81
+msgid "Send email to all hub members."
+msgstr "Eine E-Mail an alle Mitglieder dieses Hubs senden."
-#: ../../include/datetime.php:576
-#, php-format
-msgid "%1$s's birthday"
-msgstr "%1$ss Geburtstag"
+#: ../../addon/hubwall/hubwall.php:93
+msgid "Sender Email address"
+msgstr "E-Mail Adresse des Absenders"
-#: ../../include/datetime.php:577
-#, php-format
-msgid "Happy Birthday %1$s"
-msgstr "Alles Gute zum Geburtstag, %1$s"
+#: ../../addon/hubwall/hubwall.php:94
+msgid "Test mode (only send to hub administrator)"
+msgstr "Test Modus (nur an Hub Administratoren senden)"
#: ../../include/selectors.php:30
msgid "Frequently"
@@ -11285,739 +11035,721 @@ msgstr "Interessiert mich nicht"
msgid "Ask me"
msgstr "Frag mich mal"
-#: ../../include/connections.php:127
-msgid "New window"
-msgstr "Neues Fenster"
-
-#: ../../include/connections.php:128
-msgid "Open the selected location in a different window or browser tab"
-msgstr "Öffne die markierte Adresse in einem neuen Browserfenster oder Tab"
-
-#: ../../include/connections.php:246
-#, php-format
-msgid "User '%s' deleted"
-msgstr "Benutzer '%s' gelöscht"
-
-#: ../../include/conversation.php:204
+#: ../../include/conversation.php:200
#, php-format
msgid "%1$s is now connected with %2$s"
msgstr "%1$s ist jetzt mit %2$s verbunden"
-#: ../../include/conversation.php:239
+#: ../../include/conversation.php:235
#, php-format
msgid "%1$s poked %2$s"
msgstr "%1$s stupste %2$s an"
-#: ../../include/conversation.php:243 ../../include/text.php:1092
-#: ../../include/text.php:1097
+#: ../../include/conversation.php:239 ../../include/text.php:1115
+#: ../../include/text.php:1120
msgid "poked"
msgstr "stupste"
-#: ../../include/conversation.php:690
+#: ../../include/conversation.php:691
#, php-format
msgid "View %s's profile @ %s"
msgstr "%ss Profil auf %s ansehen"
-#: ../../include/conversation.php:710
+#: ../../include/conversation.php:711
msgid "Categories:"
msgstr "Kategorien:"
-#: ../../include/conversation.php:711
+#: ../../include/conversation.php:712
msgid "Filed under:"
msgstr "Gespeichert unter:"
-#: ../../include/conversation.php:736
+#: ../../include/conversation.php:737
msgid "View in context"
msgstr "Im Zusammenhang anschauen"
-#: ../../include/conversation.php:832
+#: ../../include/conversation.php:834
msgid "remove"
msgstr "lösche"
-#: ../../include/conversation.php:836 ../../include/nav.php:292
+#: ../../include/conversation.php:838 ../../include/nav.php:272
msgid "Loading..."
msgstr "Lädt ..."
-#: ../../include/conversation.php:837
+#: ../../include/conversation.php:839
msgid "Delete Selected Items"
msgstr "Lösche die ausgewählten Elemente"
-#: ../../include/conversation.php:930 ../../include/conversation.php:972
+#: ../../include/conversation.php:882
msgid "View Source"
msgstr "Quelle anzeigen"
-#: ../../include/conversation.php:931 ../../include/conversation.php:982
+#: ../../include/conversation.php:892
msgid "Follow Thread"
msgstr "Unterhaltung folgen"
-#: ../../include/conversation.php:932 ../../include/conversation.php:991
+#: ../../include/conversation.php:901
msgid "Unfollow Thread"
msgstr "Unterhaltung nicht mehr folgen"
-#: ../../include/conversation.php:937 ../../include/conversation.php:1059
+#: ../../include/conversation.php:992
msgid "Activity/Posts"
msgstr "Aktivitäten/Beiträge"
-#: ../../include/conversation.php:939 ../../include/conversation.php:1079
+#: ../../include/conversation.php:1012
msgid "Edit Connection"
msgstr "Verbindung bearbeiten"
-#: ../../include/conversation.php:940 ../../include/conversation.php:1089
+#: ../../include/conversation.php:1022
msgid "Message"
msgstr "Nachricht"
-#: ../../include/conversation.php:1223
+#: ../../include/conversation.php:1156
#, php-format
msgid "%s likes this."
msgstr "%s gefällt das."
-#: ../../include/conversation.php:1223
+#: ../../include/conversation.php:1156
#, php-format
msgid "%s doesn't like this."
msgstr "%s gefällt das nicht."
-#: ../../include/conversation.php:1227
+#: ../../include/conversation.php:1160
#, php-format
msgid "<span %1$s>%2$d people</span> like this."
msgid_plural "<span %1$s>%2$d people</span> like this."
msgstr[0] "<span %1$s>%2$d Person</span> gefällt das."
msgstr[1] "<span %1$s>%2$d Leuten</span> gefällt das."
-#: ../../include/conversation.php:1229
+#: ../../include/conversation.php:1162
#, php-format
msgid "<span %1$s>%2$d people</span> don't like this."
msgid_plural "<span %1$s>%2$d people</span> don't like this."
msgstr[0] "<span %1$s>%2$d Person</span> gefällt das nicht."
msgstr[1] "<span %1$s>%2$d Leuten</span> gefällt das nicht."
-#: ../../include/conversation.php:1235
+#: ../../include/conversation.php:1168
msgid "and"
msgstr "und"
-#: ../../include/conversation.php:1238
+#: ../../include/conversation.php:1171
#, php-format
msgid ", and %d other people"
msgid_plural ", and %d other people"
msgstr[0] ""
msgstr[1] ", und %d andere"
-#: ../../include/conversation.php:1239
+#: ../../include/conversation.php:1172
#, php-format
msgid "%s like this."
msgstr "%s gefällt das."
-#: ../../include/conversation.php:1239
+#: ../../include/conversation.php:1172
#, php-format
msgid "%s don't like this."
msgstr "%s gefällt das nicht."
-#: ../../include/conversation.php:1282
+#: ../../include/conversation.php:1215
msgid "Set your location"
msgstr "Standort"
-#: ../../include/conversation.php:1283
+#: ../../include/conversation.php:1216
msgid "Clear browser location"
msgstr "Browser-Standort löschen"
-#: ../../include/conversation.php:1331
+#: ../../include/conversation.php:1264
msgid "Tag term:"
msgstr "Schlagwort:"
-#: ../../include/conversation.php:1332
+#: ../../include/conversation.php:1265
msgid "Where are you right now?"
msgstr "Wo bist Du jetzt grade?"
-#: ../../include/conversation.php:1337
+#: ../../include/conversation.php:1270
msgid "Choose a different album..."
msgstr "Wählen Sie ein anderes Album aus..."
-#: ../../include/conversation.php:1341
+#: ../../include/conversation.php:1274
msgid "Comments enabled"
msgstr "Kommentare aktiviert"
-#: ../../include/conversation.php:1342
+#: ../../include/conversation.php:1275
msgid "Comments disabled"
msgstr "Kommentare deaktiviert"
-#: ../../include/conversation.php:1380
+#: ../../include/conversation.php:1313
msgid "Page link name"
msgstr "Link zur Seite"
-#: ../../include/conversation.php:1383
+#: ../../include/conversation.php:1316
msgid "Post as"
msgstr "Veröffentlichen als"
-#: ../../include/conversation.php:1397
+#: ../../include/conversation.php:1330
msgid "Toggle voting"
msgstr "Umfragewerkzeug aktivieren"
-#: ../../include/conversation.php:1400
+#: ../../include/conversation.php:1333
msgid "Disable comments"
msgstr "Kommentare deaktivieren"
-#: ../../include/conversation.php:1401
+#: ../../include/conversation.php:1334
msgid "Toggle comments"
msgstr "Kommentare umschalten"
-#: ../../include/conversation.php:1409
+#: ../../include/conversation.php:1342
msgid "Categories (optional, comma-separated list)"
msgstr "Kategorien (optional, kommagetrennte Liste)"
-#: ../../include/conversation.php:1432
+#: ../../include/conversation.php:1365
msgid "Other networks and post services"
msgstr "Andere Netzwerke und Platformen"
-#: ../../include/conversation.php:1438
+#: ../../include/conversation.php:1371
msgid "Set publish date"
msgstr "Veröffentlichungsdatum festlegen"
-#: ../../include/conversation.php:1692
+#: ../../include/conversation.php:1634
msgid "Discover"
msgstr "Entdecken"
-#: ../../include/conversation.php:1695
+#: ../../include/conversation.php:1637
msgid "Imported public streams"
msgstr "Importierte öffentliche Beiträge"
-#: ../../include/conversation.php:1700
+#: ../../include/conversation.php:1642
msgid "Commented Order"
msgstr "Neueste Kommentare"
-#: ../../include/conversation.php:1703
+#: ../../include/conversation.php:1645
msgid "Sort by Comment Date"
msgstr "Nach Kommentardatum sortiert"
-#: ../../include/conversation.php:1707
+#: ../../include/conversation.php:1649
msgid "Posted Order"
msgstr "Neueste Beiträge"
-#: ../../include/conversation.php:1710
+#: ../../include/conversation.php:1652
msgid "Sort by Post Date"
msgstr "Nach Beitragsdatum sortiert"
-#: ../../include/conversation.php:1718
+#: ../../include/conversation.php:1660
msgid "Posts that mention or involve you"
msgstr "Beiträge mit Beteiligung Deinerseits"
-#: ../../include/conversation.php:1727
+#: ../../include/conversation.php:1669
msgid "Activity Stream - by date"
msgstr "Activity Stream – nach Datum sortiert"
-#: ../../include/conversation.php:1733
+#: ../../include/conversation.php:1675
msgid "Starred"
msgstr "Markiert"
-#: ../../include/conversation.php:1736
+#: ../../include/conversation.php:1678
msgid "Favourite Posts"
msgstr "Markierte Beiträge"
-#: ../../include/conversation.php:1743
+#: ../../include/conversation.php:1685
msgid "Spam"
msgstr "Spam"
-#: ../../include/conversation.php:1746
+#: ../../include/conversation.php:1688
msgid "Posts flagged as SPAM"
msgstr "Nachrichten, die als SPAM markiert wurden"
-#: ../../include/conversation.php:1818
+#: ../../include/conversation.php:1763 ../../include/nav.php:372
msgid "Status Messages and Posts"
msgstr "Statusnachrichten und Beiträge"
-#: ../../include/conversation.php:1830
+#: ../../include/conversation.php:1776 ../../include/nav.php:385
msgid "Profile Details"
msgstr "Profil-Details"
-#: ../../include/conversation.php:1839 ../../include/photos.php:515
+#: ../../include/conversation.php:1786 ../../include/nav.php:395
+#: ../../include/photos.php:528
msgid "Photo Albums"
msgstr "Fotoalben"
-#: ../../include/conversation.php:1846
+#: ../../include/conversation.php:1794 ../../include/nav.php:403
msgid "Files and Storage"
msgstr "Dateien und Speicher"
-#: ../../include/conversation.php:1866 ../../include/conversation.php:1869
-#: ../../include/widgets.php:902
-msgid "Chatrooms"
-msgstr "Chaträume"
-
-#: ../../include/conversation.php:1879
+#: ../../include/conversation.php:1830 ../../include/nav.php:438
msgid "Bookmarks"
msgstr "Lesezeichen"
-#: ../../include/conversation.php:1882
+#: ../../include/conversation.php:1833 ../../include/nav.php:441
msgid "Saved Bookmarks"
msgstr "Gespeicherte Lesezeichen"
-#: ../../include/conversation.php:1892
+#: ../../include/conversation.php:1844 ../../include/nav.php:452
msgid "View Webpages"
msgstr "Webseiten anzeigen"
-#: ../../include/conversation.php:1958
+#: ../../include/conversation.php:1913
msgctxt "noun"
msgid "Attending"
msgid_plural "Attending"
msgstr[0] "Zusage"
msgstr[1] "Zusagen"
-#: ../../include/conversation.php:1961
+#: ../../include/conversation.php:1916
msgctxt "noun"
msgid "Not Attending"
msgid_plural "Not Attending"
msgstr[0] "Absage"
msgstr[1] "Absagen"
-#: ../../include/conversation.php:1964
+#: ../../include/conversation.php:1919
msgctxt "noun"
msgid "Undecided"
msgid_plural "Undecided"
msgstr[0] " Unentschlossen"
msgstr[1] "Unentschlossene"
-#: ../../include/conversation.php:1967
+#: ../../include/conversation.php:1922
msgctxt "noun"
msgid "Agree"
msgid_plural "Agrees"
msgstr[0] "Zustimmung"
msgstr[1] "Zustimmungen"
-#: ../../include/conversation.php:1970
+#: ../../include/conversation.php:1925
msgctxt "noun"
msgid "Disagree"
msgid_plural "Disagrees"
msgstr[0] "Ablehnung"
msgstr[1] "Ablehnungen"
-#: ../../include/conversation.php:1973
+#: ../../include/conversation.php:1928
msgctxt "noun"
msgid "Abstain"
msgid_plural "Abstains"
msgstr[0] "Enthaltung"
msgstr[1] "Enthaltungen"
-#: ../../include/message.php:32
-msgid "Unable to determine sender."
-msgstr "Kann Absender nicht bestimmen."
+#: ../../include/permissions.php:35
+msgid "Can view my normal stream and posts"
+msgstr "Kann meine normalen Beiträge sehen"
-#: ../../include/message.php:69
-msgid "No recipient provided."
-msgstr "Kein Empfänger angegeben"
+#: ../../include/permissions.php:39
+msgid "Can view my webpages"
+msgstr "Kann meine Webseiten sehen"
-#: ../../include/message.php:74
-msgid "[no subject]"
-msgstr "[no subject]"
+#: ../../include/permissions.php:43
+msgid "Can post on my channel page (\"wall\")"
+msgstr "Kann auf meiner Kanal-Seite (\"wall\") Beiträge veröffentlichen"
-#: ../../include/message.php:225
-msgid "Stored post could not be verified."
-msgstr "Gespeicherter Beitrag konnten nicht überprüft werden."
+#: ../../include/permissions.php:46
+msgid "Can like/dislike stuff"
+msgstr "Kann andere Elemente mögen/nicht mögen"
-#: ../../include/security.php:117
-msgid "guest:"
-msgstr "Gast:"
+#: ../../include/permissions.php:46
+msgid "Profiles and things other than posts/comments"
+msgstr "Profile und alles außer Beiträge und Kommentare"
-#: ../../include/security.php:532
-msgid ""
-"The form security token was not correct. This probably happened because the "
-"form has been opened for too long (>3 hours) before submitting it."
-msgstr "Das Security-Token des Formulars war nicht korrekt. Das ist wahrscheinlich passiert, weil das Formular zu lange (>3 Stunden) offen war, bevor es abgeschickt wurde."
+#: ../../include/permissions.php:48
+msgid "Can forward to all my channel contacts via post @mentions"
+msgstr "Kann an alle meine Kontakte via @-Erwähnung Nachrichten weiterleiten"
-#: ../../include/widgets.php:103
-msgid "System"
-msgstr "System"
+#: ../../include/permissions.php:48
+msgid "Advanced - useful for creating group forum channels"
+msgstr "Fortgeschritten - sinnvoll, um Gruppen-Kanäle/-Foren zu erstellen"
-#: ../../include/widgets.php:106
-msgid "New App"
-msgstr "Neue App"
+#: ../../include/permissions.php:49
+msgid "Can chat with me (when available)"
+msgstr "Kann mit mir chatten (wenn verfügbar)"
-#: ../../include/widgets.php:107
-msgid "Edit Apps"
-msgstr "Apps bearbeiten"
+#: ../../include/permissions.php:50
+msgid "Can write to my file storage and photos"
+msgstr "Kann in meine Datei- und Bilderordner schreiben"
-#: ../../include/widgets.php:155
-msgid "Suggestions"
-msgstr "Vorschläge"
+#: ../../include/permissions.php:51
+msgid "Can edit my webpages"
+msgstr "Kann meine Webseiten bearbeiten"
-#: ../../include/widgets.php:156
-msgid "See more..."
-msgstr "Mehr anzeigen …"
+#: ../../include/permissions.php:53
+msgid "Somewhat advanced - very useful in open communities"
+msgstr "Etwas fortgeschritten – sehr nützlich in offenen Gemeinschaften"
-#: ../../include/widgets.php:176
-#, php-format
-msgid "You have %1$.0f of %2$.0f allowed connections."
-msgstr "Du bist %1$.0f von maximal %2$.0f erlaubten Verbindungen eingegangen."
+#: ../../include/permissions.php:55
+msgid "Can administer my channel resources"
+msgstr "Kann meine Kanäle administrieren"
-#: ../../include/widgets.php:182
-msgid "Add New Connection"
-msgstr "Neue Verbindung hinzufügen"
+#: ../../include/permissions.php:55
+msgid ""
+"Extremely advanced. Leave this alone unless you know what you are doing"
+msgstr "Sehr fortgeschritten. Bearbeite das nur, wenn Du genau weißt, was Du tust"
-#: ../../include/widgets.php:183
-msgid "Enter channel address"
-msgstr "Adresse des Kanals eingeben"
+#: ../../include/dir_fns.php:141
+msgid "Directory Options"
+msgstr "Verzeichnisoptionen"
-#: ../../include/widgets.php:184
-msgid "Examples: bob@example.com, https://example.com/barbara"
-msgstr "Beispiele: bob@beispiel.com, http://beispiel.com/barbara"
+#: ../../include/dir_fns.php:143
+msgid "Safe Mode"
+msgstr "Sicherer Modus"
-#: ../../include/widgets.php:200
-msgid "Notes"
-msgstr "Notizen"
+#: ../../include/dir_fns.php:144
+msgid "Public Forums Only"
+msgstr "Nur öffentliche Foren"
-#: ../../include/widgets.php:276
-msgid "Remove term"
-msgstr "Eintrag löschen"
+#: ../../include/dir_fns.php:145
+msgid "This Website Only"
+msgstr "Nur dieser Hub"
-#: ../../include/widgets.php:284 ../../include/features.php:301
-msgid "Saved Searches"
-msgstr "Gespeicherte Suchanfragen"
+#: ../../include/bookmarks.php:34
+#, php-format
+msgid "%1$s's bookmarks"
+msgstr "%1$ss Lesezeichen"
-#: ../../include/widgets.php:285 ../../include/group.php:336
-msgid "add"
-msgstr "hinzufügen"
+#: ../../include/import.php:41
+msgid ""
+"Cannot create a duplicate channel identifier on this system. Import failed."
+msgstr "Kann keinen doppelten Kanal-Identifikator auf diesem System erzeugen (Spitzname oder Hash schon belegt). Import fehlgeschlagen."
-#: ../../include/widgets.php:347 ../../include/contact_widgets.php:53
-#: ../../include/features.php:390
-msgid "Saved Folders"
-msgstr "Gespeicherte Ordner"
+#: ../../include/import.php:105
+msgid "Cloned channel not found. Import failed."
+msgstr "Geklonter Kanal nicht gefunden. Import fehlgeschlagen."
-#: ../../include/widgets.php:350 ../../include/widgets.php:472
-#: ../../include/contact_widgets.php:56 ../../include/contact_widgets.php:94
-msgid "Everything"
-msgstr "Alles"
+#: ../../include/text.php:478
+msgid "prev"
+msgstr "vorherige"
-#: ../../include/widgets.php:391
-msgid "Archives"
-msgstr "Archive"
+#: ../../include/text.php:480
+msgid "first"
+msgstr "erste"
-#: ../../include/widgets.php:563
-msgid "Refresh"
-msgstr "Aktualisieren"
+#: ../../include/text.php:509
+msgid "last"
+msgstr "letzte"
-#: ../../include/widgets.php:603
-msgid "Account settings"
-msgstr "Konto-Einstellungen"
+#: ../../include/text.php:512
+msgid "next"
+msgstr "nächste"
-#: ../../include/widgets.php:609
-msgid "Channel settings"
-msgstr "Kanal-Einstellungen"
+#: ../../include/text.php:523
+msgid "older"
+msgstr "älter"
-#: ../../include/widgets.php:618
-msgid "Additional features"
-msgstr "Zusätzliche Funktionen"
+#: ../../include/text.php:525
+msgid "newer"
+msgstr "neuer"
-#: ../../include/widgets.php:625
-msgid "Feature/Addon settings"
-msgstr "Plugin-Einstellungen"
+#: ../../include/text.php:945
+msgid "No connections"
+msgstr "Keine Verbindungen"
-#: ../../include/widgets.php:631
-msgid "Display settings"
-msgstr "Anzeige-Einstellungen"
+#: ../../include/text.php:970
+#, php-format
+msgid "View all %s connections"
+msgstr "Alle Verbindungen von %s anzeigen"
-#: ../../include/widgets.php:638
-msgid "Manage locations"
-msgstr "Klon-Adressen verwalten"
+#: ../../include/text.php:1115 ../../include/text.php:1120
+msgid "poke"
+msgstr "anstupsen"
-#: ../../include/widgets.php:645
-msgid "Export channel"
-msgstr "Kanal exportieren"
+#: ../../include/text.php:1121
+msgid "ping"
+msgstr "anpingen"
-#: ../../include/widgets.php:651
-msgid "Connected apps"
-msgstr "Verbundene Apps"
+#: ../../include/text.php:1121
+msgid "pinged"
+msgstr "pingte"
-#: ../../include/widgets.php:666 ../../include/features.php:153
-msgid "Permission Groups"
-msgstr "Berechtigungsrollen"
+#: ../../include/text.php:1122
+msgid "prod"
+msgstr "knuffen"
-#: ../../include/widgets.php:683
-msgid "Premium Channel Settings"
-msgstr "Premium-Kanal-Einstellungen"
+#: ../../include/text.php:1122
+msgid "prodded"
+msgstr "knuffte"
-#: ../../include/widgets.php:712
-msgid "Private Mail Menu"
-msgstr "Private Nachrichten"
+#: ../../include/text.php:1123
+msgid "slap"
+msgstr "ohrfeigen"
-#: ../../include/widgets.php:714
-msgid "Combined View"
-msgstr "Kombinierte Anzeige"
+#: ../../include/text.php:1123
+msgid "slapped"
+msgstr "ohrfeigte"
-#: ../../include/widgets.php:719 ../../include/nav.php:213
-msgid "Inbox"
-msgstr "Eingang"
+#: ../../include/text.php:1124
+msgid "finger"
+msgstr "befummeln"
-#: ../../include/widgets.php:724 ../../include/nav.php:214
-msgid "Outbox"
-msgstr "Ausgang"
+#: ../../include/text.php:1124
+msgid "fingered"
+msgstr "befummelte"
-#: ../../include/widgets.php:729 ../../include/nav.php:215
-msgid "New Message"
-msgstr "Neue Nachricht"
+#: ../../include/text.php:1125
+msgid "rebuff"
+msgstr "eine Abfuhr erteilen"
-#: ../../include/widgets.php:746 ../../include/widgets.php:758
-msgid "Conversations"
-msgstr "Konversationen"
+#: ../../include/text.php:1125
+msgid "rebuffed"
+msgstr "zurückgewiesen"
-#: ../../include/widgets.php:750
-msgid "Received Messages"
-msgstr "Erhaltene Nachrichten"
+#: ../../include/text.php:1137
+msgid "happy"
+msgstr "glücklich"
-#: ../../include/widgets.php:754
-msgid "Sent Messages"
-msgstr "Gesendete Nachrichten"
+#: ../../include/text.php:1138
+msgid "sad"
+msgstr "traurig"
-#: ../../include/widgets.php:768
-msgid "No messages."
-msgstr "Keine Nachrichten."
+#: ../../include/text.php:1139
+msgid "mellow"
+msgstr "sanft"
-#: ../../include/widgets.php:786
-msgid "Delete conversation"
-msgstr "Unterhaltung löschen"
+#: ../../include/text.php:1140
+msgid "tired"
+msgstr "müde"
-#: ../../include/widgets.php:812
-msgid "Events Tools"
-msgstr "Kalenderwerkzeuge"
+#: ../../include/text.php:1141
+msgid "perky"
+msgstr "frech"
-#: ../../include/widgets.php:813
-msgid "Export Calendar"
-msgstr "Kalender exportieren"
+#: ../../include/text.php:1142
+msgid "angry"
+msgstr "sauer"
-#: ../../include/widgets.php:814
-msgid "Import Calendar"
-msgstr "Kalender importieren"
+#: ../../include/text.php:1143
+msgid "stupefied"
+msgstr "verblüfft"
-#: ../../include/widgets.php:906
-msgid "Overview"
-msgstr "Ãœbersicht"
+#: ../../include/text.php:1144
+msgid "puzzled"
+msgstr "verwirrt"
-#: ../../include/widgets.php:913
-msgid "Chat Members"
-msgstr "Chatmitglieder"
+#: ../../include/text.php:1145
+msgid "interested"
+msgstr "interessiert"
-#: ../../include/widgets.php:991
-msgctxt "wiki_history"
-msgid "Message"
-msgstr "Nachricht"
+#: ../../include/text.php:1146
+msgid "bitter"
+msgstr "verbittert"
-#: ../../include/widgets.php:1013
-msgid "Bookmarked Chatrooms"
-msgstr "Gespeicherte Chatrooms"
+#: ../../include/text.php:1147
+msgid "cheerful"
+msgstr "fröhlich"
-#: ../../include/widgets.php:1044
-msgid "Suggested Chatrooms"
-msgstr "Chatraum-Vorschläge"
+#: ../../include/text.php:1148
+msgid "alive"
+msgstr "lebendig"
-#: ../../include/widgets.php:1189 ../../include/widgets.php:1301
-msgid "photo/image"
-msgstr "Foto/Bild"
+#: ../../include/text.php:1149
+msgid "annoyed"
+msgstr "verärgert"
-#: ../../include/widgets.php:1244
-msgid "Click to show more"
-msgstr "Klick, um mehr anzuzeigen"
+#: ../../include/text.php:1150
+msgid "anxious"
+msgstr "unruhig"
-#: ../../include/widgets.php:1395
-msgid "Rating Tools"
-msgstr "Bewertungswerkzeuge"
+#: ../../include/text.php:1151
+msgid "cranky"
+msgstr "schrullig"
-#: ../../include/widgets.php:1399 ../../include/widgets.php:1401
-msgid "Rate Me"
-msgstr "Bewerte mich"
+#: ../../include/text.php:1152
+msgid "disturbed"
+msgstr "verstört"
-#: ../../include/widgets.php:1404
-msgid "View Ratings"
-msgstr "Bewertungen ansehen"
+#: ../../include/text.php:1153
+msgid "frustrated"
+msgstr "frustriert"
-#: ../../include/widgets.php:1497
-msgid "Forums"
-msgstr "Foren"
+#: ../../include/text.php:1154
+msgid "depressed"
+msgstr "deprimiert"
-#: ../../include/widgets.php:1526
-msgid "Tasks"
-msgstr "Aufgaben"
+#: ../../include/text.php:1155
+msgid "motivated"
+msgstr "motiviert"
-#: ../../include/widgets.php:1592 ../../include/widgets.php:1630
-msgid "Member registrations waiting for confirmation"
-msgstr "Nutzer-Anmeldungen, die auf Bestätigung warten"
+#: ../../include/text.php:1156
+msgid "relaxed"
+msgstr "entspannt"
-#: ../../include/widgets.php:1598
-msgid "Inspect queue"
-msgstr "Warteschlange kontrollieren"
+#: ../../include/text.php:1157
+msgid "surprised"
+msgstr "überrascht"
-#: ../../include/widgets.php:1600
-msgid "DB updates"
-msgstr "DB-Aktualisierungen"
+#: ../../include/text.php:1335 ../../include/js_strings.php:70
+msgid "Monday"
+msgstr "Montag"
-#: ../../include/widgets.php:1625 ../../include/nav.php:233
-msgid "Admin"
-msgstr "Administration"
+#: ../../include/text.php:1335 ../../include/js_strings.php:71
+msgid "Tuesday"
+msgstr "Dienstag"
-#: ../../include/widgets.php:1626
-msgid "Plugin Features"
-msgstr "Plug-In Funktionen"
+#: ../../include/text.php:1335 ../../include/js_strings.php:72
+msgid "Wednesday"
+msgstr "Mittwoch"
-#: ../../include/zot.php:652
-msgid "Invalid data packet"
-msgstr "Ungültiges Datenpaket"
+#: ../../include/text.php:1335 ../../include/js_strings.php:73
+msgid "Thursday"
+msgstr "Donnerstag"
-#: ../../include/zot.php:668
-msgid "Unable to verify channel signature"
-msgstr "Konnte die Signatur des Kanals nicht verifizieren"
+#: ../../include/text.php:1335 ../../include/js_strings.php:74
+msgid "Friday"
+msgstr "Freitag"
-#: ../../include/zot.php:2319
-#, php-format
-msgid "Unable to verify site signature for %s"
-msgstr "Kann die Signatur der Seite von %s nicht verifizieren"
+#: ../../include/text.php:1335 ../../include/js_strings.php:75
+msgid "Saturday"
+msgstr "Samstag"
-#: ../../include/zot.php:3725
-msgid "invalid target signature"
-msgstr "Ungültige Signatur des Ziels"
+#: ../../include/text.php:1335 ../../include/js_strings.php:69
+msgid "Sunday"
+msgstr "Sonntag"
-#: ../../include/channel.php:33
-msgid "Unable to obtain identity information from database"
-msgstr "Kann keine Identitäts-Informationen aus Datenbank beziehen"
+#: ../../include/text.php:1339 ../../include/js_strings.php:45
+msgid "January"
+msgstr "Januar"
-#: ../../include/channel.php:67
-msgid "Empty name"
-msgstr "Namensfeld leer"
+#: ../../include/text.php:1339 ../../include/js_strings.php:46
+msgid "February"
+msgstr "Februar"
-#: ../../include/channel.php:70
-msgid "Name too long"
-msgstr "Name ist zu lang"
+#: ../../include/text.php:1339 ../../include/js_strings.php:47
+msgid "March"
+msgstr "März"
-#: ../../include/channel.php:181
-msgid "No account identifier"
-msgstr "Keine Account-Kennung"
+#: ../../include/text.php:1339 ../../include/js_strings.php:48
+msgid "April"
+msgstr "April"
-#: ../../include/channel.php:193
-msgid "Nickname is required."
-msgstr "Spitzname ist erforderlich."
+#: ../../include/text.php:1339
+msgid "May"
+msgstr "Mai"
-#: ../../include/channel.php:207
-msgid "Reserved nickname. Please choose another."
-msgstr "Reservierter Kurzname. Bitte wähle einen anderen."
+#: ../../include/text.php:1339 ../../include/js_strings.php:50
+msgid "June"
+msgstr "Juni"
-#: ../../include/channel.php:212
-msgid ""
-"Nickname has unsupported characters or is already being used on this site."
-msgstr "Der Spitzname enthält nicht-unterstütze Zeichen oder wird bereits auf dieser Seite genutzt."
+#: ../../include/text.php:1339 ../../include/js_strings.php:51
+msgid "July"
+msgstr "Juli"
-#: ../../include/channel.php:272
-msgid "Unable to retrieve created identity"
-msgstr "Kann die erstellte Identität nicht empfangen"
+#: ../../include/text.php:1339 ../../include/js_strings.php:52
+msgid "August"
+msgstr "August"
-#: ../../include/channel.php:344
-msgid "Default Profile"
-msgstr "Standard-Profil"
+#: ../../include/text.php:1339 ../../include/js_strings.php:53
+msgid "September"
+msgstr "September"
-#: ../../include/channel.php:1045
-msgid "Create New Profile"
-msgstr "Neues Profil erstellen"
+#: ../../include/text.php:1339 ../../include/js_strings.php:54
+msgid "October"
+msgstr "Oktober"
-#: ../../include/channel.php:1065
-msgid "Visible to everybody"
-msgstr "Für jeden sichtbar"
+#: ../../include/text.php:1339 ../../include/js_strings.php:55
+msgid "November"
+msgstr "November"
-#: ../../include/channel.php:1138 ../../include/channel.php:1257
-msgid "Gender:"
-msgstr "Geschlecht:"
+#: ../../include/text.php:1339 ../../include/js_strings.php:56
+msgid "December"
+msgstr "Dezember"
-#: ../../include/channel.php:1140 ../../include/channel.php:1312
-msgid "Homepage:"
-msgstr "Homepage:"
+#: ../../include/text.php:1403 ../../include/text.php:1407
+msgid "Unknown Attachment"
+msgstr "Unbekannter Anhang"
-#: ../../include/channel.php:1141
-msgid "Online Now"
-msgstr "gerade online"
+#: ../../include/text.php:1409
+msgid "unknown"
+msgstr "unbekannt"
-#: ../../include/channel.php:1262
-msgid "Like this channel"
-msgstr "Dieser Kanal gefällt mir"
+#: ../../include/text.php:1445
+msgid "remove category"
+msgstr "Kategorie entfernen"
-#: ../../include/channel.php:1286
-msgid "j F, Y"
-msgstr "j. F Y"
+#: ../../include/text.php:1519
+msgid "remove from file"
+msgstr "aus der Datei entfernen"
-#: ../../include/channel.php:1287
-msgid "j F"
-msgstr "j. F"
+#: ../../include/text.php:1781 ../../include/language.php:367
+msgid "default"
+msgstr "Standard"
-#: ../../include/channel.php:1294
-msgid "Birthday:"
-msgstr "Geburtstag:"
+#: ../../include/text.php:1789
+msgid "Page layout"
+msgstr "Seiten-Layout"
-#: ../../include/channel.php:1307
-#, php-format
-msgid "for %1$d %2$s"
-msgstr "seit %1$d %2$s"
+#: ../../include/text.php:1789
+msgid "You can create your own with the layouts tool"
+msgstr "Mit dem Gestaltungswerkzeug kannst Du Deine eigenen Layouts erstellen"
-#: ../../include/channel.php:1310
-msgid "Sexual Preference:"
-msgstr "Sexuelle Orientierung:"
+#: ../../include/text.php:1817
+msgid "Page content type"
+msgstr "Art des Seiteninhalts"
-#: ../../include/channel.php:1316
-msgid "Tags:"
-msgstr "Schlagworte:"
+#: ../../include/text.php:1950
+msgid "activity"
+msgstr "Aktivität"
-#: ../../include/channel.php:1318
-msgid "Political Views:"
-msgstr "Politische Ansichten:"
+#: ../../include/text.php:2264
+msgid "Design Tools"
+msgstr "Gestaltungswerkzeuge"
-#: ../../include/channel.php:1320
-msgid "Religion:"
-msgstr "Religion:"
+#: ../../include/text.php:2270
+msgid "Pages"
+msgstr "Seiten"
-#: ../../include/channel.php:1324
-msgid "Hobbies/Interests:"
-msgstr "Hobbys/Interessen:"
+#: ../../include/text.php:2292
+msgid "Import website..."
+msgstr "Webseite importieren..."
-#: ../../include/channel.php:1326
-msgid "Likes:"
-msgstr "Gefällt:"
+#: ../../include/text.php:2293
+msgid "Select folder to import"
+msgstr "Ordner zum Importieren auswählen"
-#: ../../include/channel.php:1328
-msgid "Dislikes:"
-msgstr "Gefällt nicht:"
+#: ../../include/text.php:2294
+msgid "Import from a zipped folder:"
+msgstr "Aus einem gezippten Ordner importieren:"
-#: ../../include/channel.php:1330
-msgid "Contact information and Social Networks:"
-msgstr "Kontaktinformation und soziale Netzwerke:"
+#: ../../include/text.php:2295
+msgid "Import from cloud files:"
+msgstr "Aus Cloud-Dateien importieren:"
-#: ../../include/channel.php:1332
-msgid "My other channels:"
-msgstr "Meine anderen Kanäle:"
+#: ../../include/text.php:2296
+msgid "/cloud/channel/path/to/folder"
+msgstr "/Cloud/Kanal/Pfad/zum/Ordner"
-#: ../../include/channel.php:1334
-msgid "Musical interests:"
-msgstr "Musikalische Interessen:"
+#: ../../include/text.php:2297
+msgid "Enter path to website files"
+msgstr "Pfad zu Webseitendateien eingeben"
-#: ../../include/channel.php:1336
-msgid "Books, literature:"
-msgstr "Bücher, Literatur:"
+#: ../../include/text.php:2298
+msgid "Select folder"
+msgstr "Ordner auswählen"
-#: ../../include/channel.php:1338
-msgid "Television:"
-msgstr "Fernsehen:"
+#: ../../include/text.php:2299
+msgid "Export website..."
+msgstr "Webseite exportieren..."
-#: ../../include/channel.php:1340
-msgid "Film/dance/culture/entertainment:"
-msgstr "Film/Tanz/Kultur/Unterhaltung:"
+#: ../../include/text.php:2300
+msgid "Export to a zip file"
+msgstr "In eine ZIP-Datei exportieren"
-#: ../../include/channel.php:1342
-msgid "Love/Romance:"
-msgstr "Liebe/Romantik:"
+#: ../../include/text.php:2301
+msgid "website.zip"
+msgstr "website.zip"
-#: ../../include/channel.php:1344
-msgid "Work/employment:"
-msgstr "Arbeit/Anstellung:"
+#: ../../include/text.php:2302
+msgid "Enter a name for the zip file."
+msgstr "Geben Sie einen für die ZIP-Datei ein."
-#: ../../include/channel.php:1346
-msgid "School/education:"
-msgstr "Schule/Ausbildung:"
+#: ../../include/text.php:2303
+msgid "Export to cloud files"
+msgstr "In Cloud-Dateien exportieren"
-#: ../../include/channel.php:1369
-msgid "Like this thing"
-msgstr "Gefällt mir"
+#: ../../include/text.php:2304
+msgid "/path/to/export/folder"
+msgstr "/Pfad/zum/exportierenden/Ordner"
-#: ../../include/page_widgets.php:7
-msgid "New Page"
-msgstr "Neue Seite"
+#: ../../include/text.php:2305
+msgid "Enter a path to a cloud files destination."
+msgstr "Gib den Pfad zu einem Datei-Speicherort in der Cloud ein."
+
+#: ../../include/text.php:2306
+msgid "Specify folder"
+msgstr "Ordner angeben"
#: ../../include/contact_widgets.php:11
#, php-format
@@ -12065,6 +11797,57 @@ msgstr[1] "%d gemeinsame Verbindungen"
msgid "show more"
msgstr "mehr zeigen"
+#: ../../include/markdown.php:444
+msgid "Attachments:"
+msgstr "Anhänge:"
+
+#: ../../include/markdown.php:538 ../../include/event.php:22
+#: ../../include/event.php:69
+msgid "l F d, Y \\@ g:i A"
+msgstr "l, d. F Y, H:i"
+
+#: ../../include/markdown.php:540
+msgid "$Projectname event notification:"
+msgstr ""
+
+#: ../../include/markdown.php:544 ../../include/event.php:30
+#: ../../include/event.php:73
+msgid "Starts:"
+msgstr "Beginnt:"
+
+#: ../../include/markdown.php:552 ../../include/event.php:40
+#: ../../include/event.php:77
+msgid "Finishes:"
+msgstr "Endet:"
+
+#: ../../include/follow.php:26
+msgid "Channel is blocked on this site."
+msgstr "Der Kanal ist auf dieser Seite blockiert "
+
+#: ../../include/follow.php:31
+msgid "Channel location missing."
+msgstr "Adresse des Kanals fehlt."
+
+#: ../../include/follow.php:73
+msgid "Response from remote channel was incomplete."
+msgstr "Antwort des entfernten Kanals war unvollständig."
+
+#: ../../include/follow.php:90
+msgid "Channel was deleted and no longer exists."
+msgstr "Kanal wurde gelöscht und existiert nicht mehr."
+
+#: ../../include/follow.php:140 ../../include/follow.php:175
+msgid "Protocol disabled."
+msgstr "Protokoll deaktiviert."
+
+#: ../../include/follow.php:163
+msgid "Channel discovery failed."
+msgstr "Kanalsuche fehlgeschlagen"
+
+#: ../../include/follow.php:202
+msgid "Cannot connect to yourself."
+msgstr "Du kannst Dich nicht mit Dir selbst verbinden."
+
#: ../../include/js_strings.php:5
msgid "Delete this item?"
msgstr "Dieses Element löschen?"
@@ -12205,55 +11988,11 @@ msgstr " "
msgid "timeago.numbers"
msgstr "timeago.numbers"
-#: ../../include/js_strings.php:45 ../../include/text.php:1325
-msgid "January"
-msgstr "Januar"
-
-#: ../../include/js_strings.php:46 ../../include/text.php:1325
-msgid "February"
-msgstr "Februar"
-
-#: ../../include/js_strings.php:47 ../../include/text.php:1325
-msgid "March"
-msgstr "März"
-
-#: ../../include/js_strings.php:48 ../../include/text.php:1325
-msgid "April"
-msgstr "April"
-
#: ../../include/js_strings.php:49
msgctxt "long"
msgid "May"
msgstr "Mai"
-#: ../../include/js_strings.php:50 ../../include/text.php:1325
-msgid "June"
-msgstr "Juni"
-
-#: ../../include/js_strings.php:51 ../../include/text.php:1325
-msgid "July"
-msgstr "Juli"
-
-#: ../../include/js_strings.php:52 ../../include/text.php:1325
-msgid "August"
-msgstr "August"
-
-#: ../../include/js_strings.php:53 ../../include/text.php:1325
-msgid "September"
-msgstr "September"
-
-#: ../../include/js_strings.php:54 ../../include/text.php:1325
-msgid "October"
-msgstr "Oktober"
-
-#: ../../include/js_strings.php:55 ../../include/text.php:1325
-msgid "November"
-msgstr "November"
-
-#: ../../include/js_strings.php:56 ../../include/text.php:1325
-msgid "December"
-msgstr "Dezember"
-
#: ../../include/js_strings.php:57
msgid "Jan"
msgstr "Jan"
@@ -12303,34 +12042,6 @@ msgstr "Nov"
msgid "Dec"
msgstr "Dez"
-#: ../../include/js_strings.php:69 ../../include/text.php:1321
-msgid "Sunday"
-msgstr "Sonntag"
-
-#: ../../include/js_strings.php:70 ../../include/text.php:1321
-msgid "Monday"
-msgstr "Montag"
-
-#: ../../include/js_strings.php:71 ../../include/text.php:1321
-msgid "Tuesday"
-msgstr "Dienstag"
-
-#: ../../include/js_strings.php:72 ../../include/text.php:1321
-msgid "Wednesday"
-msgstr "Mittwoch"
-
-#: ../../include/js_strings.php:73 ../../include/text.php:1321
-msgid "Thursday"
-msgstr "Donnerstag"
-
-#: ../../include/js_strings.php:74 ../../include/text.php:1321
-msgid "Friday"
-msgstr "Freitag"
-
-#: ../../include/js_strings.php:75 ../../include/text.php:1321
-msgid "Saturday"
-msgstr "Samstag"
-
#: ../../include/js_strings.php:76
msgid "Sun"
msgstr "So"
@@ -12384,651 +12095,450 @@ msgctxt "calendar"
msgid "All day"
msgstr "Ganztägig"
-#: ../../include/dir_fns.php:141
-msgid "Directory Options"
-msgstr "Verzeichnisoptionen"
+#: ../../include/message.php:30
+msgid "Unable to determine sender."
+msgstr "Kann Absender nicht bestimmen."
-#: ../../include/dir_fns.php:143
-msgid "Safe Mode"
-msgstr "Sicherer Modus"
+#: ../../include/message.php:69
+msgid "No recipient provided."
+msgstr "Kein Empfänger angegeben"
-#: ../../include/dir_fns.php:144
-msgid "Public Forums Only"
-msgstr "Nur öffentliche Foren"
+#: ../../include/message.php:74
+msgid "[no subject]"
+msgstr "[no subject]"
-#: ../../include/dir_fns.php:145
-msgid "This Website Only"
-msgstr "Nur dieser Hub"
+#: ../../include/message.php:227
+msgid "Stored post could not be verified."
+msgstr "Gespeicherter Beitrag konnten nicht überprüft werden."
+
+#: ../../include/activities.php:41
+msgid " and "
+msgstr "und"
+
+#: ../../include/activities.php:49
+msgid "public profile"
+msgstr "öffentliches Profil"
+
+#: ../../include/activities.php:58
+#, php-format
+msgid "%1$s changed %2$s to &ldquo;%3$s&rdquo;"
+msgstr "%1$s hat %2$s auf &ldquo;%3$s&rdquo; geändert"
-#: ../../include/attach.php:250 ../../include/attach.php:338
+#: ../../include/activities.php:59
+#, php-format
+msgid "Visit %1$s's %2$s"
+msgstr "Besuche %1$s's %2$s"
+
+#: ../../include/activities.php:62
+#, php-format
+msgid "%1$s has an updated %2$s, changing %3$s."
+msgstr "%1$s hat ein aktualisiertes %2$s, %3$s wurde verändert."
+
+#: ../../include/attach.php:250 ../../include/attach.php:339
msgid "Item was not found."
msgstr "Beitrag wurde nicht gefunden."
-#: ../../include/attach.php:499
+#: ../../include/attach.php:500
msgid "No source file."
msgstr "Keine Quelldatei."
-#: ../../include/attach.php:521
+#: ../../include/attach.php:522
msgid "Cannot locate file to replace"
msgstr "Kann Datei zum Ersetzen nicht finden"
-#: ../../include/attach.php:539
+#: ../../include/attach.php:540
msgid "Cannot locate file to revise/update"
msgstr "Kann Datei zum Prüfen/Aktualisieren nicht finden"
-#: ../../include/attach.php:670
+#: ../../include/attach.php:671
#, php-format
msgid "File exceeds size limit of %d"
msgstr "Datei überschreitet das Größen-Limit von %d"
-#: ../../include/attach.php:684
+#: ../../include/attach.php:685
#, php-format
msgid "You have reached your limit of %1$.0f Mbytes attachment storage."
msgstr "Die Größe Deiner Datei-Anhänge hat das Maximum von %1$.0f MByte erreicht."
-#: ../../include/attach.php:854
+#: ../../include/attach.php:855
msgid "File upload failed. Possible system limit or action terminated."
msgstr "Datei-Upload fehlgeschlagen. Mögliche Systembegrenzung oder abgebrochener Prozess."
-#: ../../include/attach.php:867
+#: ../../include/attach.php:868
msgid "Stored file could not be verified. Upload failed."
msgstr "Gespeichert Datei konnte nicht verifiziert werden. Upload abgebrochen."
-#: ../../include/attach.php:922 ../../include/attach.php:938
+#: ../../include/attach.php:923 ../../include/attach.php:939
msgid "Path not available."
msgstr "Pfad nicht verfügbar."
-#: ../../include/attach.php:984 ../../include/attach.php:1142
+#: ../../include/attach.php:988 ../../include/attach.php:1153
msgid "Empty pathname"
msgstr "Leere Pfadangabe"
-#: ../../include/attach.php:1010
+#: ../../include/attach.php:1014
msgid "duplicate filename or path"
msgstr "doppelter Dateiname oder Pfad"
-#: ../../include/attach.php:1032
+#: ../../include/attach.php:1039
msgid "Path not found."
msgstr "Pfad nicht gefunden."
-#: ../../include/attach.php:1096
+#: ../../include/attach.php:1107
msgid "mkdir failed."
msgstr "mkdir fehlgeschlagen."
-#: ../../include/attach.php:1100
+#: ../../include/attach.php:1111
msgid "database storage failed."
msgstr "Speichern in der Datenbank fehlgeschlagen."
-#: ../../include/attach.php:1148
+#: ../../include/attach.php:1159
msgid "Empty path"
msgstr "Leere Pfadangabe"
-#: ../../include/network.php:733
-msgid "view full size"
-msgstr "In Vollbildansicht anschauen"
-
-#: ../../include/network.php:1988
-msgid "No Subject"
-msgstr "Kein Betreff"
-
-#: ../../include/network.php:2244
-msgid "OStatus"
-msgstr "OStatus"
-
-#: ../../include/network.php:2245
-msgid "GNU-Social"
-msgstr "GNU-Social"
-
-#: ../../include/network.php:2246
-msgid "RSS/Atom"
-msgstr "RSS/Atom"
-
-#: ../../include/network.php:2249
-msgid "Facebook"
-msgstr "Facebook"
-
-#: ../../include/network.php:2250
-msgid "Zot"
-msgstr "Zot!"
-
-#: ../../include/network.php:2251
-msgid "LinkedIn"
-msgstr "LinkedIn"
-
-#: ../../include/network.php:2252
-msgid "XMPP/IM"
-msgstr "XMPP/IM"
-
-#: ../../include/network.php:2253
-msgid "MySpace"
-msgstr "MySpace"
-
-#: ../../include/oembed.php:308
-msgid " by "
-msgstr "von"
-
-#: ../../include/oembed.php:309
-msgid " on "
-msgstr "am"
+#: ../../include/security.php:117
+msgid "guest:"
+msgstr "Gast:"
-#: ../../include/oembed.php:338
-msgid "Embedded content"
-msgstr "Eingebetteter Inhalt"
+#: ../../include/security.php:532
+msgid ""
+"The form security token was not correct. This probably happened because the "
+"form has been opened for too long (>3 hours) before submitting it."
+msgstr "Das Security-Token des Formulars war nicht korrekt. Das ist wahrscheinlich passiert, weil das Formular zu lange (>3 Stunden) offen war, bevor es abgeschickt wurde."
-#: ../../include/oembed.php:347
-msgid "Embedding disabled"
-msgstr "Einbetten deaktiviert"
+#: ../../include/items.php:869 ../../include/items.php:916
+msgid "(Unknown)"
+msgstr "(Unbekannt)"
-#: ../../include/photos.php:115
-#, php-format
-msgid "Image exceeds website size limit of %lu bytes"
-msgstr "Bild überschreitet das Webseitenlimit von %lu Bytes"
+#: ../../include/items.php:1110
+msgid "Visible to anybody on the internet."
+msgstr "Für jeden im Internet sichtbar."
-#: ../../include/photos.php:122
-msgid "Image file is empty."
-msgstr "Bilddatei ist leer."
+#: ../../include/items.php:1112
+msgid "Visible to you only."
+msgstr "Nur für Dich sichtbar."
-#: ../../include/photos.php:260
-msgid "Photo storage failed."
-msgstr "Fotospeicherung fehlgeschlagen."
+#: ../../include/items.php:1114
+msgid "Visible to anybody in this network."
+msgstr "Für jedes $Projectname-Mitglied sichtbar."
-#: ../../include/photos.php:300
-msgid "a new photo"
-msgstr "ein neues Foto"
+#: ../../include/items.php:1116
+msgid "Visible to anybody authenticated."
+msgstr "Für jeden sichtbar, der angemeldet ist."
-#: ../../include/photos.php:304
+#: ../../include/items.php:1118
#, php-format
-msgctxt "photo_upload"
-msgid "%1$s posted %2$s to %3$s"
-msgstr "%1$s hat %2$s auf %3$s veröffentlicht"
-
-#: ../../include/photos.php:519
-msgid "Upload New Photos"
-msgstr "Neue Fotos hochladen"
-
-#: ../../include/text.php:460
-msgid "prev"
-msgstr "vorherige"
-
-#: ../../include/text.php:462
-msgid "first"
-msgstr "erste"
-
-#: ../../include/text.php:491
-msgid "last"
-msgstr "letzte"
+msgid "Visible to anybody on %s."
+msgstr "Für jeden auf %s sichtbar."
-#: ../../include/text.php:494
-msgid "next"
-msgstr "nächste"
+#: ../../include/items.php:1120
+msgid "Visible to all connections."
+msgstr "Für alle Verbindungen sichtbar."
-#: ../../include/text.php:505
-msgid "older"
-msgstr "älter"
+#: ../../include/items.php:1122
+msgid "Visible to approved connections."
+msgstr "Nur für akzeptierte Verbindungen sichtbar."
-#: ../../include/text.php:507
-msgid "newer"
-msgstr "neuer"
+#: ../../include/items.php:1124
+msgid "Visible to specific connections."
+msgstr "Sichtbar für bestimmte Verbindungen."
-#: ../../include/text.php:922
-msgid "No connections"
-msgstr "Keine Verbindungen"
+#: ../../include/items.php:3938
+msgid "Privacy group is empty."
+msgstr "Gruppe ist leer."
-#: ../../include/text.php:947
+#: ../../include/items.php:3945
#, php-format
-msgid "View all %s connections"
-msgstr "Alle Verbindungen von %s anzeigen"
-
-#: ../../include/text.php:1092 ../../include/text.php:1097
-msgid "poke"
-msgstr "anstupsen"
-
-#: ../../include/text.php:1098
-msgid "ping"
-msgstr "anpingen"
-
-#: ../../include/text.php:1098
-msgid "pinged"
-msgstr "pingte"
-
-#: ../../include/text.php:1099
-msgid "prod"
-msgstr "knuffen"
-
-#: ../../include/text.php:1099
-msgid "prodded"
-msgstr "knuffte"
-
-#: ../../include/text.php:1100
-msgid "slap"
-msgstr "ohrfeigen"
-
-#: ../../include/text.php:1100
-msgid "slapped"
-msgstr "ohrfeigte"
-
-#: ../../include/text.php:1101
-msgid "finger"
-msgstr "befummeln"
-
-#: ../../include/text.php:1101
-msgid "fingered"
-msgstr "befummelte"
-
-#: ../../include/text.php:1102
-msgid "rebuff"
-msgstr "eine Abfuhr erteilen"
-
-#: ../../include/text.php:1102
-msgid "rebuffed"
-msgstr "zurückgewiesen"
-
-#: ../../include/text.php:1114
-msgid "happy"
-msgstr "glücklich"
-
-#: ../../include/text.php:1115
-msgid "sad"
-msgstr "traurig"
-
-#: ../../include/text.php:1116
-msgid "mellow"
-msgstr "sanft"
-
-#: ../../include/text.php:1117
-msgid "tired"
-msgstr "müde"
-
-#: ../../include/text.php:1118
-msgid "perky"
-msgstr "frech"
-
-#: ../../include/text.php:1119
-msgid "angry"
-msgstr "sauer"
-
-#: ../../include/text.php:1120
-msgid "stupefied"
-msgstr "verblüfft"
-
-#: ../../include/text.php:1121
-msgid "puzzled"
-msgstr "verwirrt"
-
-#: ../../include/text.php:1122
-msgid "interested"
-msgstr "interessiert"
-
-#: ../../include/text.php:1123
-msgid "bitter"
-msgstr "verbittert"
-
-#: ../../include/text.php:1124
-msgid "cheerful"
-msgstr "fröhlich"
-
-#: ../../include/text.php:1125
-msgid "alive"
-msgstr "lebendig"
-
-#: ../../include/text.php:1126
-msgid "annoyed"
-msgstr "verärgert"
-
-#: ../../include/text.php:1127
-msgid "anxious"
-msgstr "unruhig"
-
-#: ../../include/text.php:1128
-msgid "cranky"
-msgstr "schrullig"
-
-#: ../../include/text.php:1129
-msgid "disturbed"
-msgstr "verstört"
-
-#: ../../include/text.php:1130
-msgid "frustrated"
-msgstr "frustriert"
-
-#: ../../include/text.php:1131
-msgid "depressed"
-msgstr "deprimiert"
-
-#: ../../include/text.php:1132
-msgid "motivated"
-msgstr "motiviert"
+msgid "Privacy group: %s"
+msgstr "Gruppe: %s"
-#: ../../include/text.php:1133
-msgid "relaxed"
-msgstr "entspannt"
+#: ../../include/items.php:3957
+msgid "Connection not found."
+msgstr "Die Verbindung wurde nicht gefunden."
-#: ../../include/text.php:1134
-msgid "surprised"
-msgstr "überrascht"
+#: ../../include/items.php:4310
+msgid "profile photo"
+msgstr "Profilfoto"
-#: ../../include/text.php:1325
-msgid "May"
-msgstr "Mai"
+#: ../../include/items.php:4506
+#, php-format
+msgid "[Edited %s]"
+msgstr "[%s wurde bearbeitet]"
-#: ../../include/text.php:1402 ../../include/text.php:1406
-msgid "Unknown Attachment"
-msgstr "Unbekannter Anhang"
+#: ../../include/items.php:4506
+msgctxt "edit_activity"
+msgid "Post"
+msgstr "Beitrag"
-#: ../../include/text.php:1408
-msgid "unknown"
-msgstr "unbekannt"
+#: ../../include/items.php:4506
+msgctxt "edit_activity"
+msgid "Comment"
+msgstr "Kommentar"
-#: ../../include/text.php:1444
-msgid "remove category"
-msgstr "Kategorie entfernen"
+#: ../../include/channel.php:33
+msgid "Unable to obtain identity information from database"
+msgstr "Kann keine Identitäts-Informationen aus Datenbank beziehen"
-#: ../../include/text.php:1521
-msgid "remove from file"
-msgstr "aus der Datei entfernen"
+#: ../../include/channel.php:67
+msgid "Empty name"
+msgstr "Namensfeld leer"
-#: ../../include/text.php:1791
-msgid "Page layout"
-msgstr "Seiten-Layout"
+#: ../../include/channel.php:70
+msgid "Name too long"
+msgstr "Name ist zu lang"
-#: ../../include/text.php:1791
-msgid "You can create your own with the layouts tool"
-msgstr "Mit dem Gestaltungswerkzeug kannst Du Deine eigenen Layouts erstellen"
+#: ../../include/channel.php:181
+msgid "No account identifier"
+msgstr "Keine Account-Kennung"
-#: ../../include/text.php:1833
-msgid "Page content type"
-msgstr "Art des Seiteninhalts"
+#: ../../include/channel.php:193
+msgid "Nickname is required."
+msgstr "Spitzname ist erforderlich."
-#: ../../include/text.php:1966
-msgid "activity"
-msgstr "Aktivität"
+#: ../../include/channel.php:207
+msgid "Reserved nickname. Please choose another."
+msgstr "Reservierter Kurzname. Bitte wähle einen anderen."
-#: ../../include/text.php:2280
-msgid "Design Tools"
-msgstr "Gestaltungswerkzeuge"
+#: ../../include/channel.php:212
+msgid ""
+"Nickname has unsupported characters or is already being used on this site."
+msgstr "Der Spitzname enthält nicht-unterstütze Zeichen oder wird bereits auf dieser Seite genutzt."
-#: ../../include/text.php:2286
-msgid "Pages"
-msgstr "Seiten"
+#: ../../include/channel.php:270
+msgid "Unable to retrieve created identity"
+msgstr "Kann die erstellte Identität nicht empfangen"
-#: ../../include/text.php:2308
-msgid "Import website..."
-msgstr "Webseite importieren..."
+#: ../../include/channel.php:342
+msgid "Default Profile"
+msgstr "Standard-Profil"
-#: ../../include/text.php:2309
-msgid "Select folder to import"
-msgstr "Ordner zum Importieren auswählen"
+#: ../../include/channel.php:1045
+msgid "Create New Profile"
+msgstr "Neues Profil erstellen"
-#: ../../include/text.php:2310
-msgid "Import from a zipped folder:"
-msgstr "Aus einem gezippten Ordner importieren:"
+#: ../../include/channel.php:1065
+msgid "Visible to everybody"
+msgstr "Für jeden sichtbar"
-#: ../../include/text.php:2311
-msgid "Import from cloud files:"
-msgstr "Aus Cloud-Dateien importieren:"
+#: ../../include/channel.php:1138 ../../include/channel.php:1252
+msgid "Gender:"
+msgstr "Geschlecht:"
-#: ../../include/text.php:2312
-msgid "/cloud/channel/path/to/folder"
-msgstr "/Cloud/Kanal/Pfad/zum/Ordner"
+#: ../../include/channel.php:1140 ../../include/channel.php:1307
+msgid "Homepage:"
+msgstr "Homepage:"
-#: ../../include/text.php:2313
-msgid "Enter path to website files"
-msgstr "Pfad zu Webseitendateien eingeben"
+#: ../../include/channel.php:1141
+msgid "Online Now"
+msgstr "gerade online"
-#: ../../include/text.php:2314
-msgid "Select folder"
-msgstr "Ordner auswählen"
+#: ../../include/channel.php:1257
+msgid "Like this channel"
+msgstr "Dieser Kanal gefällt mir"
-#: ../../include/text.php:2315
-msgid "Export website..."
-msgstr "Webseite exportieren..."
+#: ../../include/channel.php:1281
+msgid "j F, Y"
+msgstr "j. F Y"
-#: ../../include/text.php:2316
-msgid "Export to a zip file"
-msgstr "In eine ZIP-Datei exportieren"
+#: ../../include/channel.php:1282
+msgid "j F"
+msgstr "j. F"
-#: ../../include/text.php:2317
-msgid "website.zip"
-msgstr "website.zip"
+#: ../../include/channel.php:1289
+msgid "Birthday:"
+msgstr "Geburtstag:"
-#: ../../include/text.php:2318
-msgid "Enter a name for the zip file."
-msgstr "Geben Sie einen für die ZIP-Datei ein."
+#: ../../include/channel.php:1302
+#, php-format
+msgid "for %1$d %2$s"
+msgstr "seit %1$d %2$s"
-#: ../../include/text.php:2319
-msgid "Export to cloud files"
-msgstr "In Cloud-Dateien exportieren"
+#: ../../include/channel.php:1305
+msgid "Sexual Preference:"
+msgstr "Sexuelle Orientierung:"
-#: ../../include/text.php:2320
-msgid "/path/to/export/folder"
-msgstr "/Pfad/zum/exportierenden/Ordner"
+#: ../../include/channel.php:1311
+msgid "Tags:"
+msgstr "Schlagworte:"
-#: ../../include/text.php:2321
-msgid "Enter a path to a cloud files destination."
-msgstr "Gib den Pfad zu einem Datei-Speicherort in der Cloud ein."
+#: ../../include/channel.php:1313
+msgid "Political Views:"
+msgstr "Politische Ansichten:"
-#: ../../include/text.php:2322
-msgid "Specify folder"
-msgstr "Ordner angeben"
+#: ../../include/channel.php:1315
+msgid "Religion:"
+msgstr "Religion:"
-#: ../../include/nav.php:88
-msgid "Remote authentication"
-msgstr "Ãœber Konto auf anderem Server einloggen"
+#: ../../include/channel.php:1319
+msgid "Hobbies/Interests:"
+msgstr "Hobbys/Interessen:"
-#: ../../include/nav.php:88
-msgid "Click to authenticate to your home hub"
-msgstr "Klicke, um Dich über Deinen Heimat-Server zu authentifizieren"
+#: ../../include/channel.php:1321
+msgid "Likes:"
+msgstr "Gefällt:"
-#: ../../include/nav.php:99 ../../include/nav.php:140 ../../boot.php:1731
-msgid "Logout"
-msgstr "Abmelden"
+#: ../../include/channel.php:1323
+msgid "Dislikes:"
+msgstr "Gefällt nicht:"
-#: ../../include/nav.php:99 ../../include/nav.php:140
-msgid "End this session"
-msgstr "Beende diese Sitzung"
+#: ../../include/channel.php:1325
+msgid "Contact information and Social Networks:"
+msgstr "Kontaktinformation und soziale Netzwerke:"
-#: ../../include/nav.php:103
-msgid "Your profile page"
-msgstr "Deine Profilseite"
+#: ../../include/channel.php:1327
+msgid "My other channels:"
+msgstr "Meine anderen Kanäle:"
-#: ../../include/nav.php:105
-msgid "Manage/Edit profiles"
-msgstr "Profile verwalten"
+#: ../../include/channel.php:1329
+msgid "Musical interests:"
+msgstr "Musikalische Interessen:"
-#: ../../include/nav.php:107
-msgid "Edit your profile"
-msgstr "Profil bearbeiten"
+#: ../../include/channel.php:1331
+msgid "Books, literature:"
+msgstr "Bücher, Literatur:"
-#: ../../include/nav.php:130
-msgid "Sign in"
-msgstr "Anmelden"
+#: ../../include/channel.php:1333
+msgid "Television:"
+msgstr "Fernsehen:"
-#: ../../include/nav.php:155
-msgid "Get me home"
-msgstr "Bringe mich nach Hause (eigener Kanal)"
+#: ../../include/channel.php:1335
+msgid "Film/dance/culture/entertainment:"
+msgstr "Film/Tanz/Kultur/Unterhaltung:"
-#: ../../include/nav.php:157
-msgid "Log me out of this site"
-msgstr "Logge mich von dieser Seite aus"
+#: ../../include/channel.php:1337
+msgid "Love/Romance:"
+msgstr "Liebe/Romantik:"
-#: ../../include/nav.php:162
-msgid "Create an account"
-msgstr "Erzeuge ein Konto"
+#: ../../include/channel.php:1339
+msgid "Work/employment:"
+msgstr "Arbeit/Anstellung:"
-#: ../../include/nav.php:174
-msgid "Help and documentation"
-msgstr "Hilfe und Dokumentation"
+#: ../../include/channel.php:1341
+msgid "School/education:"
+msgstr "Schule/Ausbildung:"
-#: ../../include/nav.php:178
-msgid "Applications, utilities, links, games"
-msgstr "Anwendungen (Apps), Zubehör, Links, Spiele"
+#: ../../include/channel.php:1364
+msgid "Like this thing"
+msgstr "Gefällt mir"
-#: ../../include/nav.php:180
-msgid "Search site @name, #tag, ?docs, content"
-msgstr "Hub durchsuchen: @Name. #Schlagwort, ?Dokumentation, Inhalt"
+#: ../../include/channel.php:2139
+#, php-format
+msgid "User '%s' deleted"
+msgstr "Benutzer '%s' gelöscht"
-#: ../../include/nav.php:182
-msgid "Channel Directory"
-msgstr "Kanal-Verzeichnis"
+#: ../../include/event.php:1004
+msgid "This event has been added to your calendar."
+msgstr "Dieser Termin wurde zu Deinem Kalender hinzugefügt"
-#: ../../include/nav.php:194
-msgid "Your grid"
-msgstr "Dein Grid"
+#: ../../include/event.php:1204
+msgid "Not specified"
+msgstr "Keine Angabe"
-#: ../../include/nav.php:195
-msgid "View your network/grid"
-msgstr "Zeige Dein Netzwerk/Grid an"
+#: ../../include/event.php:1205
+msgid "Needs Action"
+msgstr "Aktion erforderlich"
-#: ../../include/nav.php:196
-msgid "Mark all grid notifications seen"
-msgstr "Alle Grid-Benachrichtigungen als angesehen markieren"
+#: ../../include/event.php:1206
+msgid "Completed"
+msgstr "Abgeschlossen"
-#: ../../include/nav.php:198
-msgid "Channel home"
-msgstr "Mein Kanal"
+#: ../../include/event.php:1207
+msgid "In Process"
+msgstr "In Bearbeitung"
-#: ../../include/nav.php:199
-msgid "View your channel home"
-msgstr "Zeige Deine Kanalseite an"
+#: ../../include/event.php:1208
+msgid "Cancelled"
+msgstr "gestrichen"
-#: ../../include/nav.php:200
-msgid "Mark all channel notifications seen"
-msgstr "Markiere alle Kanal-Benachrichtigungen als angesehen"
+#: ../../include/network.php:776
+msgid "view full size"
+msgstr "In Vollbildansicht anschauen"
-#: ../../include/nav.php:206
-msgid "Notices"
-msgstr "Benachrichtigungen"
+#: ../../include/network.php:2042
+msgid "No Subject"
+msgstr "Kein Betreff"
-#: ../../include/nav.php:206
-msgid "Notifications"
-msgstr "Benachrichtigungen"
+#: ../../include/network.php:2310 ../../include/network.php:2311
+msgid "Friendica"
+msgstr "Friendica"
-#: ../../include/nav.php:207
-msgid "View all notifications"
-msgstr "Alle Benachrichtigungen ansehen"
+#: ../../include/network.php:2312
+msgid "OStatus"
+msgstr "OStatus"
-#: ../../include/nav.php:210
-msgid "Private mail"
-msgstr "Persönliche Mail"
+#: ../../include/network.php:2313
+msgid "GNU-Social"
+msgstr "GNU-Social"
-#: ../../include/nav.php:211
-msgid "View your private messages"
-msgstr "Zeige Deine persönlichen Nachrichten an"
+#: ../../include/network.php:2314
+msgid "RSS/Atom"
+msgstr "RSS/Atom"
-#: ../../include/nav.php:212
-msgid "Mark all private messages seen"
-msgstr "Markiere alle persönlichen Nachrichten als gesehen"
+#: ../../include/network.php:2316
+msgid "Diaspora"
+msgstr "Diaspora"
-#: ../../include/nav.php:218
-msgid "Event Calendar"
-msgstr "Terminkalender"
+#: ../../include/network.php:2317
+msgid "Facebook"
+msgstr "Facebook"
-#: ../../include/nav.php:219
-msgid "View events"
-msgstr "Termine ansehen"
+#: ../../include/network.php:2318
+msgid "Zot"
+msgstr "Zot!"
-#: ../../include/nav.php:220
-msgid "Mark all events seen"
-msgstr "Markiere alle Termine als gesehen"
+#: ../../include/network.php:2319
+msgid "LinkedIn"
+msgstr "LinkedIn"
-#: ../../include/nav.php:223
-msgid "Manage Your Channels"
-msgstr "Verwalte Deine Kanäle"
+#: ../../include/network.php:2320
+msgid "XMPP/IM"
+msgstr "XMPP/IM"
-#: ../../include/nav.php:225
-msgid "Account/Channel Settings"
-msgstr "Konto-/Kanal-Einstellungen"
+#: ../../include/network.php:2321
+msgid "MySpace"
+msgstr "MySpace"
-#: ../../include/nav.php:233
-msgid "Site Setup and Configuration"
-msgstr "Seiten-Einrichtung und -Konfiguration"
+#: ../../include/page_widgets.php:7
+msgid "New Page"
+msgstr "Neue Seite"
-#: ../../include/nav.php:288
-msgid "Documentation"
-msgstr "Dokumentation"
+#: ../../include/language.php:380
+msgid "Select an alternate language"
+msgstr "Wähle eine alternative Sprache"
-#: ../../include/nav.php:297
-msgid "@name, #tag, ?doc, content"
-msgstr "@Name, #Schlagwort, ?Dokumentation, Inhalt"
+#: ../../include/acl_selectors.php:208
+msgid "Who can see this?"
+msgstr "Wer kann das sehen?"
-#: ../../include/nav.php:298
-msgid "Please wait..."
-msgstr "Bitte warten..."
+#: ../../include/acl_selectors.php:209
+msgid "Custom selection"
+msgstr "Benutzerdefinierte Auswahl"
-#: ../../include/import.php:30
+#: ../../include/acl_selectors.php:210
msgid ""
-"Cannot create a duplicate channel identifier on this system. Import failed."
-msgstr "Kann keinen doppelten Kanal-Identifikator auf diesem System erzeugen (Spitzname oder Hash schon belegt). Import fehlgeschlagen."
-
-#: ../../include/import.php:90
-msgid "Channel clone failed. Import failed."
-msgstr "Klonen des Kanals fehlgeschlagen. Import fehlgeschlagen."
-
-#: ../../include/import.php:100
-msgid "Cloned channel not found. Import failed."
-msgstr "Geklonter Kanal nicht gefunden. Import fehlgeschlagen."
-
-#: ../../include/import.php:1373
-msgid "Unable to import element \""
-msgstr "Element konnte nicht importiert werden."
-
-#: ../../include/auth.php:148
-msgid "Logged out."
-msgstr "Ausgeloggt."
-
-#: ../../include/auth.php:275
-msgid "Failed authentication"
-msgstr "Authentifizierung fehlgeschlagen"
-
-#: ../../include/follow.php:26
-msgid "Channel is blocked on this site."
-msgstr "Der Kanal ist auf dieser Seite blockiert "
-
-#: ../../include/follow.php:31
-msgid "Channel location missing."
-msgstr "Adresse des Kanals fehlt."
-
-#: ../../include/follow.php:73
-msgid "Response from remote channel was incomplete."
-msgstr "Antwort des entfernten Kanals war unvollständig."
-
-#: ../../include/follow.php:90
-msgid "Channel was deleted and no longer exists."
-msgstr "Kanal wurde gelöscht und existiert nicht mehr."
-
-#: ../../include/follow.php:140 ../../include/follow.php:175
-msgid "Protocol disabled."
-msgstr "Protokoll deaktiviert."
-
-#: ../../include/follow.php:163
-msgid "Channel discovery failed."
-msgstr "Kanalsuche fehlgeschlagen"
-
-#: ../../include/follow.php:202
-msgid "Cannot connect to yourself."
-msgstr "Du kannst Dich nicht mit Dir selbst verbinden."
-
-#: ../../include/activities.php:41
-msgid " and "
-msgstr "und"
+"Select \"Show\" to allow viewing. \"Don't show\" lets you override and limit"
+" the scope of \"Show\"."
+msgstr "Wähle \"Anzeigen\", um Betrachtung zuzulassen. \"Nicht anzeigen\" überstimmt und limitiert den Aktionsradius von \"Anzeigen\" für Ausnahmen."
-#: ../../include/activities.php:49
-msgid "public profile"
-msgstr "öffentliches Profil"
+#: ../../include/acl_selectors.php:211
+msgid "Show"
+msgstr "Anzeigen"
-#: ../../include/activities.php:58
-#, php-format
-msgid "%1$s changed %2$s to &ldquo;%3$s&rdquo;"
-msgstr "%1$s hat %2$s auf &ldquo;%3$s&rdquo; geändert"
+#: ../../include/acl_selectors.php:212
+msgid "Don't show"
+msgstr "Nicht anzeigen"
-#: ../../include/activities.php:59
+#: ../../include/acl_selectors.php:245
#, php-format
-msgid "Visit %1$s's %2$s"
-msgstr "Besuche %1$s's %2$s"
+msgid ""
+"Post permissions %s cannot be changed %s after a post is shared.</br />These"
+" permissions set who is allowed to view the post."
+msgstr "Beitragsberechtigungen %s können nicht geändert werden %s, nachdem der Beitrag gesendet wurde.<br />Diese Berechtigungen bestimmen, wer den Beitrag sehen kann."
-#: ../../include/activities.php:62
+#: ../../include/dba/dba_driver.php:189
#, php-format
-msgid "%1$s has an updated %2$s, changing %3$s."
-msgstr "%1$s hat ein aktualisiertes %2$s, %3$s wurde verändert."
+msgid "Cannot locate DNS info for database server '%s'"
+msgstr "Kann die DNS-Informationen für den Datenbank-Server '%s' nicht finden"
#: ../../include/bbcode.php:134 ../../include/bbcode.php:1040
#: ../../include/bbcode.php:1043 ../../include/bbcode.php:1048
@@ -13073,187 +12583,21 @@ msgstr "Spoiler"
msgid "$1 wrote:"
msgstr "$1 schrieb:"
-#: ../../include/bookmarks.php:34
-#, php-format
-msgid "%1$s's bookmarks"
-msgstr "%1$ss Lesezeichen"
-
-#: ../../include/group.php:26
-msgid ""
-"A deleted group with this name was revived. Existing item permissions "
-"<strong>may</strong> apply to this group and any future members. If this is "
-"not what you intended, please create another group with a different name."
-msgstr "Es hat früher schon einmal eine Gruppe mit diesem Namen existiert, die gelöscht wurde. Es <strong>könnten</strong> von damals noch Elemente (Beiträge, Dateien etc.) vorhanden sein, die allen jetzigen und zukünftigen Mitgliedern dieser Gruppe den Zugriff erlauben. Wenn das nicht Deine Absicht ist, erstelle bitte eine neue Gruppe mit einem anderen Namen."
-
-#: ../../include/group.php:268
-msgid "Add new connections to this privacy group"
-msgstr "Neue Verbindung zu dieser Gruppe hinzufügen"
-
-#: ../../include/group.php:309
-msgid "edit"
-msgstr "Bearbeiten"
-
-#: ../../include/group.php:331 ../../include/features.php:292
-msgid "Privacy Groups"
-msgstr "Gruppen"
-
-#: ../../include/group.php:332
-msgid "Edit group"
-msgstr "Gruppe ändern"
-
-#: ../../include/group.php:333
-msgid "Add privacy group"
-msgstr "Gruppe hinzufügen"
-
-#: ../../include/group.php:334
-msgid "Channels not in any privacy group"
-msgstr "Kanäle, die in keiner Gruppe sind"
-
-#: ../../include/event.php:863
-msgid "This event has been added to your calendar."
-msgstr "Dieser Termin wurde zu Deinem Kalender hinzugefügt"
-
-#: ../../include/event.php:1063
-msgid "Not specified"
-msgstr "Keine Angabe"
-
-#: ../../include/event.php:1064
-msgid "Needs Action"
-msgstr "Aktion erforderlich"
-
-#: ../../include/event.php:1065
-msgid "Completed"
-msgstr "Abgeschlossen"
-
-#: ../../include/event.php:1066
-msgid "In Process"
-msgstr "In Bearbeitung"
-
-#: ../../include/event.php:1067
-msgid "Cancelled"
-msgstr "gestrichen"
-
-#: ../../include/items.php:841 ../../include/items.php:888
-msgid "(Unknown)"
-msgstr "(Unbekannt)"
-
-#: ../../include/items.php:1089
-msgid "Visible to anybody on the internet."
-msgstr "Für jeden im Internet sichtbar."
-
-#: ../../include/items.php:1091
-msgid "Visible to you only."
-msgstr "Nur für Dich sichtbar."
-
-#: ../../include/items.php:1093
-msgid "Visible to anybody in this network."
-msgstr "Für jedes $Projectname-Mitglied sichtbar."
-
-#: ../../include/items.php:1095
-msgid "Visible to anybody authenticated."
-msgstr "Für jeden sichtbar, der angemeldet ist."
-
-#: ../../include/items.php:1097
-#, php-format
-msgid "Visible to anybody on %s."
-msgstr "Für jeden auf %s sichtbar."
-
-#: ../../include/items.php:1099
-msgid "Visible to all connections."
-msgstr "Für alle Verbindungen sichtbar."
-
-#: ../../include/items.php:1101
-msgid "Visible to approved connections."
-msgstr "Nur für akzeptierte Verbindungen sichtbar."
-
-#: ../../include/items.php:1103
-msgid "Visible to specific connections."
-msgstr "Sichtbar für bestimmte Verbindungen."
-
-#: ../../include/items.php:3915
-msgid "Privacy group is empty."
-msgstr "Gruppe ist leer."
-
-#: ../../include/items.php:3922
-#, php-format
-msgid "Privacy group: %s"
-msgstr "Gruppe: %s"
-
-#: ../../include/items.php:3934
-msgid "Connection not found."
-msgstr "Die Verbindung wurde nicht gefunden."
-
-#: ../../include/items.php:4283
-msgid "profile photo"
-msgstr "Profilfoto"
-
-#: ../../include/items.php:4479
-#, php-format
-msgid "[Edited %s]"
-msgstr "[%s wurde bearbeitet]"
-
-#: ../../include/items.php:4479
-msgctxt "edit_activity"
-msgid "Post"
-msgstr "Beitrag"
-
-#: ../../include/items.php:4479
-msgctxt "edit_activity"
-msgid "Comment"
-msgstr "Kommentar"
-
-#: ../../include/permissions.php:35
-msgid "Can view my normal stream and posts"
-msgstr "Kann meine normalen Beiträge sehen"
-
-#: ../../include/permissions.php:39
-msgid "Can view my webpages"
-msgstr "Kann meine Webseiten sehen"
-
-#: ../../include/permissions.php:43
-msgid "Can post on my channel page (\"wall\")"
-msgstr "Kann auf meiner Kanal-Seite (\"wall\") Beiträge veröffentlichen"
-
-#: ../../include/permissions.php:46
-msgid "Can like/dislike stuff"
-msgstr "Kann andere Elemente mögen/nicht mögen"
-
-#: ../../include/permissions.php:46
-msgid "Profiles and things other than posts/comments"
-msgstr "Profile und alles außer Beiträge und Kommentare"
-
-#: ../../include/permissions.php:48
-msgid "Can forward to all my channel contacts via post @mentions"
-msgstr "Kann an alle meine Kontakte via @-Erwähnung Nachrichten weiterleiten"
-
-#: ../../include/permissions.php:48
-msgid "Advanced - useful for creating group forum channels"
-msgstr "Fortgeschritten - sinnvoll, um Gruppen-Kanäle/-Foren zu erstellen"
-
-#: ../../include/permissions.php:49
-msgid "Can chat with me (when available)"
-msgstr "Kann mit mir chatten (wenn verfügbar)"
-
-#: ../../include/permissions.php:50
-msgid "Can write to my file storage and photos"
-msgstr "Kann in meine Datei- und Bilderordner schreiben"
-
-#: ../../include/permissions.php:51
-msgid "Can edit my webpages"
-msgstr "Kann meine Webseiten bearbeiten"
+#: ../../include/oembed.php:315
+msgid " by "
+msgstr "von"
-#: ../../include/permissions.php:53
-msgid "Somewhat advanced - very useful in open communities"
-msgstr "Etwas fortgeschritten – sehr nützlich in offenen Gemeinschaften"
+#: ../../include/oembed.php:316
+msgid " on "
+msgstr "am"
-#: ../../include/permissions.php:55
-msgid "Can administer my channel resources"
-msgstr "Kann meine Kanäle administrieren"
+#: ../../include/oembed.php:345
+msgid "Embedded content"
+msgstr "Eingebetteter Inhalt"
-#: ../../include/permissions.php:55
-msgid ""
-"Extremely advanced. Leave this alone unless you know what you are doing"
-msgstr "Sehr fortgeschritten. Bearbeite das nur, wenn Du genau weißt, was Du tust"
+#: ../../include/oembed.php:354
+msgid "Embedding disabled"
+msgstr "Einbetten deaktiviert"
#: ../../include/features.php:58
msgid "General Features"
@@ -13347,7 +12691,7 @@ msgstr "Termin-Zeitzonenauswahl"
#: ../../include/features.php:172
msgid "Allow event creation in timezones other than your own."
-msgstr ""
+msgstr "Ermögliche das Erstellen von Terminen in anderen Zeitzonen als Deiner eigenen."
#: ../../include/features.php:180
msgid "Advanced Directory Search"
@@ -13446,6 +12790,10 @@ msgstr "Suche nach Datum"
msgid "Ability to select posts by date ranges"
msgstr "Möglichkeit, Beiträge nach Zeiträumen auszuwählen"
+#: ../../include/features.php:292 ../../include/group.php:331
+msgid "Privacy Groups"
+msgstr "Gruppen"
+
#: ../../include/features.php:293
msgid "Enable management and selection of privacy groups"
msgstr "Auswahl und Verwaltung von Gruppen für Kanäle aktivieren"
@@ -13556,198 +12904,414 @@ msgid ""
"channel"
msgstr "Ermöglicht es, Einschränkungen und Bedingungen für Verbindungen dieses Kanals festzulegen"
-#: ../../include/help.php:31
-msgid "Help:"
-msgstr "Hilfe:"
+#: ../../include/taxonomy.php:228 ../../include/taxonomy.php:249
+msgid "Tags"
+msgstr "Schlagwörter"
-#: ../../include/help.php:63
-msgid "Not Found"
-msgstr "Nicht gefunden"
+#: ../../include/taxonomy.php:293
+msgid "Keywords"
+msgstr "Schlüsselwörter"
-#: ../../util/nconfig.php:34
-msgid "Source channel not found."
-msgstr "Quellkanal nicht gefunden."
+#: ../../include/taxonomy.php:314
+msgid "have"
+msgstr "habe"
-#: ../../view/theme/redbasic/php/config.php:9
-msgid "Focus (Hubzilla default)"
-msgstr "Focus (Voreinstellung für Hubzilla)"
+#: ../../include/taxonomy.php:314
+msgid "has"
+msgstr "hat"
-#: ../../view/theme/redbasic/php/config.php:110
-msgid "Theme settings"
-msgstr "Theme-Einstellungen"
+#: ../../include/taxonomy.php:315
+msgid "want"
+msgstr "will"
-#: ../../view/theme/redbasic/php/config.php:111
-msgid "Narrow navbar"
-msgstr "Schmale Navigationsleiste"
+#: ../../include/taxonomy.php:315
+msgid "wants"
+msgstr "will"
-#: ../../view/theme/redbasic/php/config.php:112
-msgid "Navigation bar background color"
-msgstr "Hintergrundfarbe der Navigationsleiste"
+#: ../../include/taxonomy.php:316
+msgid "likes"
+msgstr "gefällt"
-#: ../../view/theme/redbasic/php/config.php:113
-msgid "Navigation bar gradient top color"
-msgstr "Farbverlauf der Navigationsleiste: Farbe oben"
+#: ../../include/taxonomy.php:317
+msgid "dislikes"
+msgstr "missfällt"
-#: ../../view/theme/redbasic/php/config.php:114
-msgid "Navigation bar gradient bottom color"
-msgstr "Farbverlauf der Navigationsleiste: Farbe unten"
+#: ../../include/account.php:35
+msgid "Not a valid email address"
+msgstr "Ungültige E-Mail-Adresse"
-#: ../../view/theme/redbasic/php/config.php:115
-msgid "Navigation active button gradient top color"
-msgstr "Navigations-Button aktiv: Farbe für Farbverlauf oben"
+#: ../../include/account.php:37
+msgid "Your email domain is not among those allowed on this site"
+msgstr "Deine E-Mail-Adresse ist auf dieser Seite nicht erlaubt"
-#: ../../view/theme/redbasic/php/config.php:116
-msgid "Navigation active button gradient bottom color"
-msgstr "Navigations-Button aktiv: Farbe für Farbverlauf unten"
+#: ../../include/account.php:43
+msgid "Your email address is already registered at this site."
+msgstr "Deine E-Mail-Adresse ist auf dieser Seite bereits registriert."
-#: ../../view/theme/redbasic/php/config.php:117
-msgid "Navigation bar border color "
-msgstr "Farbe für den Rand der Navigationsleiste"
+#: ../../include/account.php:75
+msgid "An invitation is required."
+msgstr "Eine Einladung wird benötigt."
-#: ../../view/theme/redbasic/php/config.php:118
-msgid "Navigation bar icon color "
-msgstr "Farbe für die Icons der Navigationsleiste"
+#: ../../include/account.php:79
+msgid "Invitation could not be verified."
+msgstr "Die Einladung konnte nicht bestätigt werden."
-#: ../../view/theme/redbasic/php/config.php:119
-msgid "Navigation bar active icon color "
-msgstr "Farbe für aktive Icons der Navigationsleiste"
+#: ../../include/account.php:130
+msgid "Please enter the required information."
+msgstr "Bitte gib die benötigten Informationen ein."
-#: ../../view/theme/redbasic/php/config.php:120
-msgid "link color"
-msgstr "Farbe für Links"
+#: ../../include/account.php:198
+msgid "Failed to store account information."
+msgstr "Speichern der Nutzerkontodaten fehlgeschlagen."
-#: ../../view/theme/redbasic/php/config.php:121
-msgid "Set font-color for banner"
-msgstr "Farbe der Schrift des Banners"
+#: ../../include/account.php:263
+#, php-format
+msgid "Registration confirmation for %s"
+msgstr "Registrierungsbestätigung für %s"
-#: ../../view/theme/redbasic/php/config.php:122
-msgid "Set the background color"
-msgstr "Hintergrundfarbe"
+#: ../../include/account.php:330
+#, php-format
+msgid "Registration request at %s"
+msgstr "Registrierungsanfrage auf %s"
-#: ../../view/theme/redbasic/php/config.php:123
-msgid "Set the background image"
-msgstr "Hintergrundbild"
+#: ../../include/account.php:352
+msgid "your registration password"
+msgstr "Dein Registrierungspasswort"
-#: ../../view/theme/redbasic/php/config.php:124
-msgid "Set the background color of items"
-msgstr "Hintergrundfarbe für Beiträge"
+#: ../../include/account.php:358 ../../include/account.php:420
+#, php-format
+msgid "Registration details for %s"
+msgstr "Registrierungsdetails für %s"
-#: ../../view/theme/redbasic/php/config.php:125
-msgid "Set the background color of comments"
-msgstr "Hintergrundfarbe für Kommentare"
+#: ../../include/account.php:431
+msgid "Account approved."
+msgstr "Nutzerkonto bestätigt."
-#: ../../view/theme/redbasic/php/config.php:126
-msgid "Set the border color of comments"
-msgstr "Farbe des Randes von Kommentaren"
+#: ../../include/account.php:471
+#, php-format
+msgid "Registration revoked for %s"
+msgstr "Registrierung für %s wurde widerrufen"
-#: ../../view/theme/redbasic/php/config.php:127
-msgid "Set the indent for comments"
-msgstr "Einzugsbreite für Kommentare"
+#: ../../include/account.php:756 ../../include/account.php:758
+msgid "Click here to upgrade."
+msgstr "Klicke hier, um das Upgrade durchzuführen."
-#: ../../view/theme/redbasic/php/config.php:128
-msgid "Set the basic color for item icons"
-msgstr "Grundfarbe für Beitrags-Icons"
+#: ../../include/account.php:764
+msgid "This action exceeds the limits set by your subscription plan."
+msgstr "Diese Aktion überschreitet die Grenzen Ihres Abonnements."
-#: ../../view/theme/redbasic/php/config.php:129
-msgid "Set the hover color for item icons"
-msgstr "Farbe für Beitrags-Icons unter dem Mauszeiger"
+#: ../../include/account.php:769
+msgid "This action is not available under your subscription plan."
+msgstr "Diese Aktion ist in Ihrem Abonnement nicht verfügbar."
-#: ../../view/theme/redbasic/php/config.php:130
-msgid "Set font-size for the entire application"
-msgstr "Schriftgröße für die gesamte Anwendung"
+#: ../../include/datetime.php:147
+msgid "Birthday"
+msgstr "Geburtstag"
-#: ../../view/theme/redbasic/php/config.php:130
-msgid "Example: 14px"
-msgstr "Beispiel: 14px"
+#: ../../include/datetime.php:149
+msgid "Age: "
+msgstr "Alter:"
-#: ../../view/theme/redbasic/php/config.php:131
-msgid "Set font-size for posts and comments"
-msgstr "Schriftgröße für Beiträge und Kommentare"
+#: ../../include/datetime.php:151
+msgid "YYYY-MM-DD or MM-DD"
+msgstr "JJJJ-MM-TT oder MM-TT"
-#: ../../view/theme/redbasic/php/config.php:132
-msgid "Set font-color for posts and comments"
-msgstr "Schriftfarbe für Beiträge und Kommentare"
+#: ../../include/datetime.php:292
+msgid "less than a second ago"
+msgstr "Vor weniger als einer Sekunde"
-#: ../../view/theme/redbasic/php/config.php:133
-msgid "Set radius of corners"
-msgstr "Ecken-Radius"
+#: ../../include/datetime.php:310
+#, php-format
+msgctxt "e.g. 22 hours ago, 1 minute ago"
+msgid "%1$d %2$s ago"
+msgstr "vor %1$d %2$s"
-#: ../../view/theme/redbasic/php/config.php:134
-msgid "Set shadow depth of photos"
-msgstr "Schattentiefe von Fotos"
+#: ../../include/datetime.php:321
+msgctxt "relative_date"
+msgid "year"
+msgid_plural "years"
+msgstr[0] "Jahr"
+msgstr[1] "Jahre"
-#: ../../view/theme/redbasic/php/config.php:135
-msgid "Set maximum width of content region in pixel"
-msgstr "Maximalbreite des Inhaltsbereichs in Pixel festlegen"
+#: ../../include/datetime.php:324
+msgctxt "relative_date"
+msgid "month"
+msgid_plural "months"
+msgstr[0] "Monat"
+msgstr[1] "Monate"
-#: ../../view/theme/redbasic/php/config.php:135
-msgid "Leave empty for default width"
-msgstr "Leer lassen für Standardbreite"
+#: ../../include/datetime.php:327
+msgctxt "relative_date"
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "Woche"
+msgstr[1] "Wochen"
-#: ../../view/theme/redbasic/php/config.php:136
-msgid "Left align page content"
-msgstr "Seiteninhalt linksbündig anzeigen"
+#: ../../include/datetime.php:330
+msgctxt "relative_date"
+msgid "day"
+msgid_plural "days"
+msgstr[0] "Tag"
+msgstr[1] "Tage"
-#: ../../view/theme/redbasic/php/config.php:137
-msgid "Set minimum opacity of nav bar - to hide it"
-msgstr "Mindest-Deckkraft der Navigationsleiste ( - versteckt sie)"
+#: ../../include/datetime.php:333
+msgctxt "relative_date"
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "Stunde"
+msgstr[1] "Stunden"
-#: ../../view/theme/redbasic/php/config.php:138
-msgid "Set size of conversation author photo"
-msgstr "Größe der Avatare von Themenstartern"
+#: ../../include/datetime.php:336
+msgctxt "relative_date"
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "Minute"
+msgstr[1] "Minuten"
-#: ../../view/theme/redbasic/php/config.php:139
-msgid "Set size of followup author photos"
-msgstr "Größe der Avatare von Kommentatoren"
+#: ../../include/datetime.php:339
+msgctxt "relative_date"
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] "Sekunde"
+msgstr[1] "Sekunden"
-#: ../../boot.php:1505
+#: ../../include/datetime.php:576
#, php-format
-msgid "Update %s failed. See error logs."
-msgstr "Aktualisierung %s fehlgeschlagen. Details in den Fehlerprotokollen."
+msgid "%1$s's birthday"
+msgstr "%1$ss Geburtstag"
-#: ../../boot.php:1508
+#: ../../include/datetime.php:577
#, php-format
-msgid "Update Error at %s"
-msgstr "Aktualisierungsfehler auf %s"
+msgid "Happy Birthday %1$s"
+msgstr "Alles Gute zum Geburtstag, %1$s"
-#: ../../boot.php:1712
-msgid "Create an account to access services and applications"
-msgstr "Erstelle ein Konto, um auf Dienste und Anwendungen zugreifen zu können."
+#: ../../include/nav.php:92
+msgid "Remote authentication"
+msgstr "Ãœber Konto auf anderem Server einloggen"
-#: ../../boot.php:1734
-msgid "Login/Email"
-msgstr "Anmelden/E-Mail"
+#: ../../include/nav.php:92
+msgid "Click to authenticate to your home hub"
+msgstr "Klicke, um Dich über Deinen Heimat-Server zu authentifizieren"
-#: ../../boot.php:1735
-msgid "Password"
-msgstr "Kennwort"
+#: ../../include/nav.php:103 ../../include/nav.php:127
+msgid "End this session"
+msgstr "Beende diese Sitzung"
-#: ../../boot.php:1736
-msgid "Remember me"
-msgstr "Angaben speichern"
+#: ../../include/nav.php:106
+msgid "Your profile page"
+msgstr "Deine Profilseite"
-#: ../../boot.php:1739
-msgid "Forgot your password?"
-msgstr "Passwort vergessen?"
+#: ../../include/nav.php:109
+msgid "Manage/Edit profiles"
+msgstr "Profile verwalten"
-#: ../../boot.php:2300
-msgid "toggle mobile"
-msgstr "auf/von mobile Ansicht wechseln"
+#: ../../include/nav.php:111
+msgid "Edit your profile"
+msgstr "Profil bearbeiten"
-#: ../../boot.php:2455
-msgid "Website SSL certificate is not valid. Please correct."
-msgstr "Das SSL-Zertifikat der Website ist nicht gültig. Bitte beheben."
+#: ../../include/nav.php:117
+msgid "Sign in"
+msgstr "Anmelden"
+
+#: ../../include/nav.php:142
+msgid "Take me home"
+msgstr "Bringe mich nach Hause (eigener Kanal)"
+
+#: ../../include/nav.php:144
+msgid "Log me out of this site"
+msgstr "Logge mich von dieser Seite aus"
+
+#: ../../include/nav.php:149
+msgid "Create an account"
+msgstr "Erzeuge ein Konto"
+
+#: ../../include/nav.php:161
+msgid "Help and documentation"
+msgstr "Hilfe und Dokumentation"
+
+#: ../../include/nav.php:164
+msgid "Search site @name, #tag, ?docs, content"
+msgstr "Hub durchsuchen: @Name. #Schlagwort, ?Dokumentation, Inhalt"
+
+#: ../../include/nav.php:176
+msgid "Grid"
+msgstr "Grid"
+
+#: ../../include/nav.php:176
+msgid "Your grid"
+msgstr "Dein Grid"
+
+#: ../../include/nav.php:177
+msgid "View your network/grid"
+msgstr "Zeige Dein Netzwerk/Grid an"
+
+#: ../../include/nav.php:178
+msgid "Mark all grid notifications seen"
+msgstr "Alle Grid-Benachrichtigungen als angesehen markieren"
+
+#: ../../include/nav.php:180
+msgid "Channel home"
+msgstr "Mein Kanal"
+
+#: ../../include/nav.php:181
+msgid "View your channel home"
+msgstr "Zeige Deine Kanalseite an"
+
+#: ../../include/nav.php:182
+msgid "Mark all channel notifications seen"
+msgstr "Markiere alle Kanal-Benachrichtigungen als angesehen"
+
+#: ../../include/nav.php:188
+msgid "Notices"
+msgstr "Benachrichtigungen"
+
+#: ../../include/nav.php:188
+msgid "Notifications"
+msgstr "Benachrichtigungen"
+
+#: ../../include/nav.php:189
+msgid "View all notifications"
+msgstr "Alle Benachrichtigungen ansehen"
+
+#: ../../include/nav.php:192
+msgid "Private mail"
+msgstr "Persönliche Mail"
+
+#: ../../include/nav.php:193
+msgid "View your private messages"
+msgstr "Zeige Deine persönlichen Nachrichten an"
+
+#: ../../include/nav.php:194
+msgid "Mark all private messages seen"
+msgstr "Markiere alle persönlichen Nachrichten als gesehen"
+
+#: ../../include/nav.php:200
+msgid "Event Calendar"
+msgstr "Terminkalender"
+
+#: ../../include/nav.php:201
+msgid "View events"
+msgstr "Termine ansehen"
+
+#: ../../include/nav.php:202
+msgid "Mark all events seen"
+msgstr "Markiere alle Termine als gesehen"
-#: ../../boot.php:2458
+#: ../../include/nav.php:205
+msgid "Manage Your Channels"
+msgstr "Verwalte Deine Kanäle"
+
+#: ../../include/nav.php:207
+msgid "Account/Channel Settings"
+msgstr "Konto-/Kanal-Einstellungen"
+
+#: ../../include/nav.php:215
+msgid "Site Setup and Configuration"
+msgstr "Seiten-Einrichtung und -Konfiguration"
+
+#: ../../include/nav.php:277
+msgid "@name, #tag, ?doc, content"
+msgstr "@Name, #Schlagwort, ?Dokumentation, Inhalt"
+
+#: ../../include/nav.php:278
+msgid "Please wait..."
+msgstr "Bitte warten..."
+
+#: ../../include/nav.php:280
+msgid "Add Apps"
+msgstr "Apps hinzufügen"
+
+#: ../../include/photos.php:115
#, php-format
-msgid "[hubzilla] Website SSL error for %s"
-msgstr "[hubzilla] Website-SSL-Fehler für %s"
+msgid "Image exceeds website size limit of %lu bytes"
+msgstr "Bild überschreitet das Webseitenlimit von %lu Bytes"
-#: ../../boot.php:2577
-msgid "Cron/Scheduled tasks not running."
-msgstr "Cron-Aufgaben laufen nicht."
+#: ../../include/photos.php:122
+msgid "Image file is empty."
+msgstr "Bilddatei ist leer."
-#: ../../boot.php:2581
+#: ../../include/photos.php:261
+msgid "Photo storage failed."
+msgstr "Fotospeicherung fehlgeschlagen."
+
+#: ../../include/photos.php:301
+msgid "a new photo"
+msgstr "ein neues Foto"
+
+#: ../../include/photos.php:305
#, php-format
-msgid "[hubzilla] Cron tasks not running on %s"
-msgstr "[hubzilla] Cron-Aufgaben für %s laufen nicht"
+msgctxt "photo_upload"
+msgid "%1$s posted %2$s to %3$s"
+msgstr "%1$s hat %2$s auf %3$s veröffentlicht"
+
+#: ../../include/photos.php:533
+msgid "Upload New Photos"
+msgstr "Neue Fotos hochladen"
+
+#: ../../include/zot.php:646
+msgid "Invalid data packet"
+msgstr "Ungültiges Datenpaket"
+
+#: ../../include/zot.php:662
+msgid "Unable to verify channel signature"
+msgstr "Konnte die Signatur des Kanals nicht verifizieren"
+
+#: ../../include/zot.php:2313
+#, php-format
+msgid "Unable to verify site signature for %s"
+msgstr "Kann die Signatur der Seite von %s nicht verifizieren"
+
+#: ../../include/zot.php:3764
+msgid "invalid target signature"
+msgstr "Ungültige Signatur des Ziels"
+
+#: ../../include/group.php:26
+msgid ""
+"A deleted group with this name was revived. Existing item permissions "
+"<strong>may</strong> apply to this group and any future members. If this is "
+"not what you intended, please create another group with a different name."
+msgstr "Es hat früher schon einmal eine Gruppe mit diesem Namen existiert, die gelöscht wurde. Es <strong>könnten</strong> von damals noch Elemente (Beiträge, Dateien etc.) vorhanden sein, die allen jetzigen und zukünftigen Mitgliedern dieser Gruppe den Zugriff erlauben. Wenn das nicht Deine Absicht ist, erstelle bitte eine neue Gruppe mit einem anderen Namen."
+
+#: ../../include/group.php:268
+msgid "Add new connections to this privacy group"
+msgstr "Neue Verbindung zu dieser Gruppe hinzufügen"
+
+#: ../../include/group.php:309
+msgid "edit"
+msgstr "Bearbeiten"
+
+#: ../../include/group.php:332
+msgid "Edit group"
+msgstr "Gruppe ändern"
+
+#: ../../include/group.php:333
+msgid "Add privacy group"
+msgstr "Gruppe hinzufügen"
+
+#: ../../include/group.php:334
+msgid "Channels not in any privacy group"
+msgstr "Kanäle, die in keiner Gruppe sind"
+
+#: ../../include/connections.php:127
+msgid "New window"
+msgstr "Neues Fenster"
+
+#: ../../include/connections.php:128
+msgid "Open the selected location in a different window or browser tab"
+msgstr "Öffne die markierte Adresse in einem neuen Browserfenster oder Tab"
+
+#: ../../include/auth.php:148
+msgid "Logged out."
+msgstr "Ausgeloggt."
+
+#: ../../include/auth.php:275
+msgid "Failed authentication"
+msgstr "Authentifizierung fehlgeschlagen"
+
+#: ../../include/help.php:33
+msgid "Help:"
+msgstr "Hilfe:"
+
+#: ../../include/help.php:65
+msgid "Not Found"
+msgstr "Nicht gefunden"
diff --git a/view/de/hstrings.php b/view/de/hstrings.php
index c01d28f13..adeceacb9 100644
--- a/view/de/hstrings.php
+++ b/view/de/hstrings.php
@@ -5,22 +5,6 @@ function string_plural_select_de($n){
return ($n != 1);;
}}
App::$rtl = 0;
-App::$strings["Social Networking"] = "Soziales Netzwerk";
-App::$strings["Social - Mostly Public"] = "Soziales Netzwerk - Weitgehend öffentlich";
-App::$strings["Social - Restricted"] = "Soziales Netzwerk - Beschränkt";
-App::$strings["Social - Private"] = "Soziales Netzwerk - Privat";
-App::$strings["Community Forum"] = "Forum";
-App::$strings["Forum - Mostly Public"] = "Forum - Weitgehend öffentlich";
-App::$strings["Forum - Restricted"] = "Forum - Beschränkt";
-App::$strings["Forum - Private"] = "Forum - Privat";
-App::$strings["Feed Republish"] = "Teilen von Feeds";
-App::$strings["Feed - Mostly Public"] = "Feeds - Weitgehend öffentlich";
-App::$strings["Feed - Restricted"] = "Feeds - Beschränkt";
-App::$strings["Special Purpose"] = "Für besondere Zwecke";
-App::$strings["Special - Celebrity/Soapbox"] = "Speziell - Mitteilungs-Kanal (keine Kommentare)";
-App::$strings["Special - Group Repository"] = "Speziell - Gruppenarchiv";
-App::$strings["Other"] = "Andere";
-App::$strings["Custom/Expert Mode"] = "Benutzerdefiniert/Expertenmodus";
App::$strings["Can view my channel stream and posts"] = "Kann meinen Kanal-Stream und meine Beiträge sehen";
App::$strings["Can send me their channel stream and posts"] = "Kann mir die Beiträge aus seinem/ihrem Kanal schicken";
App::$strings["Can view my default channel profile"] = "Kann mein Standardprofil sehen";
@@ -39,57 +23,201 @@ App::$strings["Can forward to all my channel connections via @+ mentions in post
App::$strings["Can chat with me"] = "Kann mit mir chatten";
App::$strings["Can source my public posts in derived channels"] = "Kann meine öffentlichen Beiträge als Quellen für Kanäle verwenden";
App::$strings["Can administer my channel"] = "Kann meinen Kanal administrieren";
-App::$strings["parent"] = "Ãœbergeordnetes Verzeichnis";
-App::$strings["Collection"] = "Sammlung";
-App::$strings["Principal"] = "Prinzipal";
-App::$strings["Addressbook"] = "Adressbuch";
-App::$strings["Calendar"] = "Kalender";
-App::$strings["Schedule Inbox"] = "Posteingang für überwachte Kalender";
-App::$strings["Schedule Outbox"] = "Postausgang für überwachte Kalender";
-App::$strings["Unknown"] = "Unbekannt";
-App::$strings["Files"] = "Dateien";
-App::$strings["Total"] = "Summe";
-App::$strings["Shared"] = "Geteilt";
+App::$strings["Social Networking"] = "Soziales Netzwerk";
+App::$strings["Social - Mostly Public"] = "Soziales Netzwerk - Weitgehend öffentlich";
+App::$strings["Social - Restricted"] = "Soziales Netzwerk - Beschränkt";
+App::$strings["Social - Private"] = "Soziales Netzwerk - Privat";
+App::$strings["Community Forum"] = "Forum";
+App::$strings["Forum - Mostly Public"] = "Forum - Weitgehend öffentlich";
+App::$strings["Forum - Restricted"] = "Forum - Beschränkt";
+App::$strings["Forum - Private"] = "Forum - Privat";
+App::$strings["Feed Republish"] = "Teilen von Feeds";
+App::$strings["Feed - Mostly Public"] = "Feeds - Weitgehend öffentlich";
+App::$strings["Feed - Restricted"] = "Feeds - Beschränkt";
+App::$strings["Special Purpose"] = "Für besondere Zwecke";
+App::$strings["Special - Celebrity/Soapbox"] = "Speziell - Mitteilungs-Kanal (keine Kommentare)";
+App::$strings["Special - Group Repository"] = "Speziell - Gruppenarchiv";
+App::$strings["Other"] = "Andere";
+App::$strings["Custom/Expert Mode"] = "Benutzerdefiniert/Expertenmodus";
+App::$strings["Requested profile is not available."] = "Das angefragte Profil ist nicht verfügbar.";
+App::$strings["Permission denied."] = "Berechtigung verweigert.";
+App::$strings["Block Name"] = "Block-Name";
+App::$strings["Blocks"] = "Blöcke";
+App::$strings["Block Title"] = "Titel des Blocks";
+App::$strings["Created"] = "Erstellt";
+App::$strings["Edited"] = "Geändert";
App::$strings["Create"] = "Erstelle";
-App::$strings["Upload"] = "Hochladen";
-App::$strings["Name"] = "Name";
-App::$strings["Type"] = "Typ";
-App::$strings["Size"] = "Größe";
-App::$strings["Last Modified"] = "Zuletzt geändert";
App::$strings["Edit"] = "Bearbeiten";
+App::$strings["Share"] = "Teilen";
App::$strings["Delete"] = "Löschen";
-App::$strings["You are using %1\$s of your available file storage."] = "Sie verwenden %1\$s von Ihrem verfügbaren Dateispeicher.";
-App::$strings["You are using %1\$s of %2\$s available file storage. (%3\$s&#37;)"] = "Sie verwenden %1\$s von %2\$s verfügbarem Dateispeicher. (%3\$s&#37;)";
-App::$strings["WARNING:"] = "WARNUNG:";
-App::$strings["Create new folder"] = "Neuen Ordner anlegen";
-App::$strings["Upload file"] = "Datei hochladen";
-App::$strings["Drop files here to immediately upload"] = "Dateien zum sofortigen Hochladen hier fallen lassen";
+App::$strings["View"] = "Ansicht";
+App::$strings["Total invitation limit exceeded."] = "Einladungslimit überschritten.";
+App::$strings["%s : Not a valid email address."] = "%s : Keine gültige Email Adresse.";
+App::$strings["Please join us on \$Projectname"] = "Schließe Dich uns auf \$Projectname an!";
+App::$strings["Invitation limit exceeded. Please contact your site administrator."] = "Einladungslimit überschritten. Bitte kontaktiere den Administrator Deines \$Projectname-Servers.";
+App::$strings["%s : Message delivery failed."] = "%s : Nachricht konnte nicht zugestellt werden.";
+App::$strings["%d message sent."] = array(
+ 0 => "%d Nachricht gesendet.",
+ 1 => "%d Nachrichten gesendet.",
+);
+App::$strings["You have no more invitations available"] = "Du hast keine weiteren verfügbare Einladungen";
+App::$strings["Send invitations"] = "Einladungen senden";
+App::$strings["Enter email addresses, one per line:"] = "Email-Adressen eintragen, eine pro Zeile:";
+App::$strings["Your message:"] = "Deine Nachricht:";
+App::$strings["Please join my community on \$Projectname."] = "Schließe Dich uns auf \$Projectname an!";
+App::$strings["You will need to supply this invitation code:"] = "Bitte verwende bei der Registrierung den folgenden Einladungscode:";
+App::$strings["1. Register at any \$Projectname location (they are all inter-connected)"] = "1. Registriere Dich auf einem beliebigen \$Projectname-Hub (sie sind alle miteinander verbunden)";
+App::$strings["2. Enter my \$Projectname network address into the site searchbar."] = "2. Gib meine \$Projectname-Adresse im Suchfeld ein.";
+App::$strings["or visit"] = "oder besuche";
+App::$strings["3. Click [Connect]"] = "3. Klicke auf [Verbinden]";
+App::$strings["Submit"] = "Absenden";
+App::$strings["Item not found"] = "Element nicht gefunden";
+App::$strings["Layout Name"] = "Layout-Name";
+App::$strings["Layout Description (Optional)"] = "Layout-Beschreibung (optional)";
+App::$strings["Edit Layout"] = "Layout bearbeiten";
App::$strings["Permission denied"] = "Keine Berechtigung";
-App::$strings["Permission denied."] = "Berechtigung verweigert.";
-App::$strings["Page not found."] = "Seite nicht gefunden.";
-App::$strings["Remote authentication blocked. You are logged into this site locally. Please logout and retry."] = "Fern-Authentifizierung blockiert. Du bist lokal auf diesem Server angemeldet. Bitte melde Dich ab und versuche es erneut.";
-App::$strings["Welcome %s. Remote authentication successful."] = "Willkommen %s. Entfernte Authentifizierung erfolgreich.";
-App::$strings["Requested profile is not available."] = "Das angefragte Profil ist nicht verfügbar.";
-App::$strings["Some blurb about what to do when you're new here"] = "Ein Hinweis, was man tun kann, wenn man neu hier ist";
+App::$strings["Invalid profile identifier."] = "Ungültiger Profil-Identifikator";
+App::$strings["Profile Visibility Editor"] = "Profil-Sichtbarkeits-Editor";
+App::$strings["Profile"] = "Profil";
+App::$strings["Click on a contact to add or remove."] = "Klicke auf einen Kontakt, um ihn hinzuzufügen oder zu entfernen.";
+App::$strings["Visible To"] = "Sichtbar für";
+App::$strings["All Connections"] = "Alle Verbindungen";
+App::$strings["This site is not a directory server"] = "Diese Webseite ist kein Verzeichnisserver";
+App::$strings["You must be logged in to see this page."] = "Du musst angemeldet sein, um diese Seite betrachten zu können.";
+App::$strings["Posts and comments"] = "Beiträge und Kommentare";
+App::$strings["Only posts"] = "Nur Beiträge";
+App::$strings["Insufficient permissions. Request redirected to profile page."] = "Unzureichende Zugriffsrechte. Die Anfrage wurde zur Profil-Seite umgeleitet.";
+App::$strings["Export Channel"] = "Kanal exportieren";
+App::$strings["Export your basic channel information to a file. This acts as a backup of your connections, permissions, profile and basic data, which can be used to import your data to a new server hub, but does not contain your content."] = "Exportiert die grundlegenden Kanal-Informationen in eine kleine Datei. Diese stellt eine Sicherung Deiner Verbindungen, Berechtigungen, Profile und Basisdaten bereit, die für den Import auf einem anderen Hub verwendet werden kann, aber nicht die Beiträge Deines Kanals enthält.";
+App::$strings["Export Content"] = "Kanal und Inhalte exportieren";
+App::$strings["Export your channel information and recent content to a JSON backup that can be restored or imported to another server hub. This backs up all of your connections, permissions, profile data and several months of posts. This file may be VERY large. Please be patient - it may take several minutes for this download to begin."] = "Exportiert Deine Kanal-Informationen sowie alle zugehörigen Inhalte in eine JSON-Sicherungsdatei. Die sichert alle Verbindungen, Berechtigungen, Profildaten und Deine Beiträge aus mehreren Monaten. Diese Datei kann SEHR groß werden! Bitte habe ein wenig Geduld – es kann mehrere Minuten dauern, bis der Download startet.";
+App::$strings["Export your posts from a given year."] = "Exportiert die Beiträge des angegebenen Jahres.";
+App::$strings["You may also export your posts and conversations for a particular year or month. Adjust the date in your browser location bar to select other dates. If the export fails (possibly due to memory exhaustion on your server hub), please try again selecting a more limited date range."] = "Du kannst auch die Beiträge und Konversationen eines bestimmten Jahres oder Monats exportieren. Ändere das Datum in der Adresszeile Deines Browsers, um andere Zeiträume zu wählen. Falls der Export fehlschlägt (vermutlich, weil auf diesem Hub nicht genügend Speicher zur Verfügung steht), versuche es noch einmal mit einer kleineren Zeitspanne.";
+App::$strings["To select all posts for a given year, such as this year, visit <a href=\"%1\$s\">%2\$s</a>"] = "Um alle Beiträge eines bestimmten Jahres, zum Beispiel dieses Jahres, auszuwählen, klicke <a href=\"%1\$s\">%2\$s</a>.";
+App::$strings["To select all posts for a given month, such as January of this year, visit <a href=\"%1\$s\">%2\$s</a>"] = "Um alle Beiträge eines bestimmten Monats auszuwählen, zum Beispiel vom Januar diesen Jahres, klicke <a href=\"%1\$s\">%2\$s</a>.";
+App::$strings["These content files may be imported or restored by visiting <a href=\"%1\$s\">%2\$s</a> on any site containing your channel. For best results please import or restore these in date order (oldest first)."] = "Diese Inhalts-Sicherungen können wiederhergestellt werden, indem Du <a href=\"%1\$s\">%2\$s</a> auf jeglichem Hub besuchst, der diesen Kanal enthält. Das funktioniert am besten, wenn Du dabei die zeitliche Reihenfolge einhältst, also die Sicherungen für den ältesten Zeitraum zuerst importierst.";
App::$strings["Public access denied."] = "Öffentlichen Zugriff verweigert.";
-App::$strings["Item not found."] = "Element nicht gefunden.";
-App::$strings["Maximum daily site registrations exceeded. Please try again tomorrow."] = "Maximale Anzahl täglicher Neuanmeldungen erreicht. Bitte versuche es morgen noch einmal.";
-App::$strings["Please indicate acceptance of the Terms of Service. Registration failed."] = "Bitte stimme den Nutzungsbedingungen zu. Registrierung fehlgeschlagen.";
-App::$strings["Passwords do not match."] = "Passwörter stimmen nicht überein.";
-App::$strings["Registration successful. Please check your email for validation instructions."] = "Registrierung erfolgreich. Eine E-Mail mit weiteren Anweisungen wurde an Dich gesendet.";
-App::$strings["Your registration is pending approval by the site owner."] = "Deine Registrierung muss noch vom Betreiber der Seite freigegeben werden.";
-App::$strings["Your registration can not be processed."] = "Deine Registrierung konnte nicht verarbeitet werden.";
-App::$strings["Registration on this hub is disabled."] = "Die Registrierung auf diesem Hub ist nicht möglich.";
-App::$strings["Registration on this hub is by approval only."] = "Eine Registrierung auf diesem Hub erfordert die Zustimmung durch den Administrator.";
-App::$strings["<a href=\"pubsites\">Register at another affiliated hub.</a>"] = "<a href=\"pubsites\">Registriere Dich auf einem der anderen verbundenen Hubs.</a>";
-App::$strings["This site has exceeded the number of allowed daily account registrations. Please try again tomorrow."] = "Die maximale Anzahl täglicher Registrierungen auf diesem Server wurde überschritten. Bitte versuche es morgen noch einmal.";
-App::$strings["Terms of Service"] = "Nutzungsbedingungen";
-App::$strings["I accept the %s for this website"] = "Ich akzeptiere die %s für diese Webseite";
-App::$strings["I am over 13 years of age and accept the %s for this website"] = "Ich bin älter als 13 Jahre und akzeptiere die %s dieser Webseite";
-App::$strings["Your email address"] = "Ihre E-Mail Adresse";
-App::$strings["Choose a password"] = "Passwort";
-App::$strings["Please re-enter your password"] = "Bitte gib Dein Passwort noch einmal ein";
-App::$strings["Please enter your invitation code"] = "Bitte trage Deinen Einladungs-Code ein";
+App::$strings["Search"] = "Suche";
+App::$strings["Items tagged with: %s"] = "Beiträge mit Schlagwort: %s";
+App::$strings["Search results for: %s"] = "Suchergebnisse für: %s";
+App::$strings["Location not found."] = "Klon nicht gefunden.";
+App::$strings["Location lookup failed."] = "Nachschlagen des Kanal-Ortes fehlgeschlagen";
+App::$strings["Please select another location to become primary before removing the primary location."] = "Bitte mache einen anderen Kanal-Ort zum primären Ort, bevor Du den primären Ort löschst.";
+App::$strings["Syncing locations"] = "Synchronisiere Klone";
+App::$strings["No locations found."] = "Keine Klon-Adressen gefunden.";
+App::$strings["Manage Channel Locations"] = "Klon-Adressen verwalten";
+App::$strings["Location"] = "Ort";
+App::$strings["Address"] = "Adresse";
+App::$strings["Primary"] = "Primär";
+App::$strings["Drop"] = "Löschen";
+App::$strings["Sync Now"] = "Jetzt synchronisieren";
+App::$strings["Please wait several minutes between consecutive operations."] = "Bitte warte mehrere Minuten zwischen dem Ausführen zweier Operationen!";
+App::$strings["When possible, drop a location by logging into that website/hub and removing your channel."] = "Wenn möglich, lösche einen Klon, indem Du Dich auf dem jeweiligen Hub einloggst und den Kanal dort löschst.";
+App::$strings["Use this form to drop the location if the hub is no longer operating."] = "Benutze dieses Formular zum Löschen eines Klons, wenn es den Hub nicht mehr gibt.";
+App::$strings["Menu not found."] = "Menü nicht gefunden";
+App::$strings["Unable to create element."] = "Element konnte nicht erstellt werden.";
+App::$strings["Unable to update menu element."] = "Kann Menü-Element nicht aktualisieren.";
+App::$strings["Unable to add menu element."] = "Kann Menü-Bestandteil nicht hinzufügen.";
+App::$strings["Not found."] = "Nicht gefunden.";
+App::$strings["Menu Item Permissions"] = "Zugriffsrechte des Menü-Elements";
+App::$strings["(click to open/close)"] = "(zum öffnen/schließen anklicken)";
+App::$strings["Link Name"] = "Name des Links";
+App::$strings["Link or Submenu Target"] = "Ziel des Links oder Untermenüs";
+App::$strings["Enter URL of the link or select a menu name to create a submenu"] = "URL des Links eingeben oder Menünamen wählen, um ein Untermenü anzulegen.";
+App::$strings["Use magic-auth if available"] = "Magic-Auth verwenden, falls verfügbar";
+App::$strings["No"] = "Nein";
+App::$strings["Yes"] = "Ja";
+App::$strings["Open link in new window"] = "Öffne Link in neuem Fenster";
+App::$strings["Order in list"] = "Reihenfolge in der Liste";
+App::$strings["Higher numbers will sink to bottom of listing"] = "Größere Nummern werden weiter unten in der Auflistung einsortiert";
+App::$strings["Submit and finish"] = "Absenden und fertigstellen";
+App::$strings["Submit and continue"] = "Absenden und fortfahren";
+App::$strings["Menu:"] = "Menü:";
+App::$strings["Link Target"] = "Ziel des Links";
+App::$strings["Edit menu"] = "Menü bearbeiten";
+App::$strings["Edit element"] = "Bestandteil bearbeiten";
+App::$strings["Drop element"] = "Bestandteil löschen";
+App::$strings["New element"] = "Neues Bestandteil";
+App::$strings["Edit this menu container"] = "Diesen Menü-Container bearbeiten";
+App::$strings["Add menu element"] = "Menüelement hinzufügen";
+App::$strings["Delete this menu item"] = "Lösche dieses Menü-Bestandteil";
+App::$strings["Edit this menu item"] = "Bearbeite dieses Menü-Bestandteil";
+App::$strings["Menu item not found."] = "Menü-Bestandteil nicht gefunden.";
+App::$strings["Menu item deleted."] = "Menü-Bestandteil gelöscht.";
+App::$strings["Menu item could not be deleted."] = "Menü-Bestandteil kann nicht gelöscht werden.";
+App::$strings["Edit Menu Element"] = "Bearbeite Menü-Bestandteil";
+App::$strings["Link text"] = "Link Text";
+App::$strings["Calendar entries imported."] = "Kalendereinträge wurden importiert.";
+App::$strings["No calendar entries found."] = "Keine Kalendereinträge gefunden.";
+App::$strings["Event can not end before it has started."] = "Termin-Ende liegt vor dem Beginn.";
+App::$strings["Unable to generate preview."] = "Vorschau konnte nicht erzeugt werden.";
+App::$strings["Event title and start time are required."] = "Titel und Startzeit des Termins sind erforderlich.";
+App::$strings["Event not found."] = "Termin nicht gefunden.";
+App::$strings["event"] = "Termin";
+App::$strings["Edit event title"] = "Termintitel bearbeiten";
+App::$strings["Event title"] = "Termintitel";
+App::$strings["Required"] = "Benötigt";
+App::$strings["Categories (comma-separated list)"] = "Kategorien (Kommagetrennte Liste)";
+App::$strings["Edit Category"] = "Kategorie bearbeiten";
+App::$strings["Category"] = "Kategorie";
+App::$strings["Edit start date and time"] = "Startdatum und -zeit bearbeiten";
+App::$strings["Start date and time"] = "Startdatum und -zeit";
+App::$strings["Finish date and time are not known or not relevant"] = "Enddatum und -zeit sind unbekannt oder irrelevant";
+App::$strings["Edit finish date and time"] = "Enddatum und -zeit bearbeiten";
+App::$strings["Finish date and time"] = "Enddatum und -zeit";
+App::$strings["Adjust for viewer timezone"] = "An die Zeitzone des Betrachters anpassen";
+App::$strings["Important for events that happen in a particular place. Not practical for global holidays."] = "Wichtig für Veranstaltungen die an bestimmten Orten stattfinden. Nicht sinnvoll für globale Feiertage / Ferien.";
+App::$strings["Edit Description"] = "Beschreibung bearbeiten";
+App::$strings["Description"] = "Beschreibung";
+App::$strings["Edit Location"] = "Ort bearbeiten";
+App::$strings["Preview"] = "Vorschau";
+App::$strings["Permission settings"] = "Berechtigungs-Einstellungen";
+App::$strings["Timezone:"] = "Zeitzone:";
+App::$strings["Advanced Options"] = "Weitere Optionen";
+App::$strings["l, F j"] = "l, j. F";
+App::$strings["Edit event"] = "Termin bearbeiten";
+App::$strings["Delete event"] = "Termin löschen";
+App::$strings["Link to Source"] = "Link zur Quelle";
+App::$strings["calendar"] = "Kalender";
+App::$strings["Edit Event"] = "Termin bearbeiten";
+App::$strings["Create Event"] = "Termin anlegen";
+App::$strings["Previous"] = "Voriges";
+App::$strings["Next"] = "Nächste";
+App::$strings["Export"] = "Exportieren";
+App::$strings["Month"] = "Monat";
+App::$strings["Week"] = "Woche";
+App::$strings["Day"] = "Tag";
+App::$strings["Today"] = "Heute";
+App::$strings["Event removed"] = "Termin gelöscht";
+App::$strings["Failed to remove event"] = "Termin konnte nicht gelöscht werden";
+App::$strings["App installed."] = "App installiert.";
+App::$strings["Malformed app."] = "Fehlerhafte App.";
+App::$strings["Embed code"] = "Code einbetten";
+App::$strings["Edit App"] = "App bearbeiten";
+App::$strings["Create App"] = "App erstellen";
+App::$strings["Name of app"] = "Name der App";
+App::$strings["Location (URL) of app"] = "Ort (URL) der App";
+App::$strings["Photo icon URL"] = "URL zum Icon";
+App::$strings["80 x 80 pixels - optional"] = "80 x 80 Pixel – optional";
+App::$strings["Categories (optional, comma separated list)"] = "Kategorien (optional, kommagetrennte Liste)";
+App::$strings["Version ID"] = "Versions-ID";
+App::$strings["Price of app"] = "Preis der App";
+App::$strings["Location (URL) to purchase app"] = "Ort (URL), um die App zu kaufen";
+App::$strings["Please login."] = "Bitte melde dich an.";
+App::$strings["Hub not found."] = "Server nicht gefunden.";
+App::$strings["photo"] = "Foto";
+App::$strings["status"] = "Status";
+App::$strings["%1\$s is following %2\$s's %3\$s"] = "%1\$s folgt nun %2\$ss %3\$s";
+App::$strings["%1\$s stopped following %2\$s's %3\$s"] = "%1\$s folgt %2\$ss %3\$s nicht mehr";
+App::$strings["Nothing to import."] = "Nichts zu importieren.";
+App::$strings["Unable to download data from old server"] = "Daten können vom alten Server nicht heruntergeladen werden";
+App::$strings["Imported file is empty."] = "Die importierte Datei ist leer.";
+App::$strings["Warning: Database versions differ by %1\$d updates."] = "Achtung: Datenbankversionen unterscheiden sich um %1\$d Aktualisierungen.";
+App::$strings["Import completed"] = "Import abgeschlossen";
+App::$strings["Import Items"] = "Beiträge importieren";
+App::$strings["Use this form to import existing posts and content from an export file."] = "Mit diesem Formular kannst Du existierende Beiträge und Inhalte aus einer Sicherungsdatei importieren.";
+App::$strings["File to Upload"] = "Hochzuladende Datei:";
+App::$strings["You have created %1$.0f of %2$.0f allowed channels."] = "Du hast %1$.0f von maximal %2$.0f erlaubten Kanälen eingerichtet.";
App::$strings["Name or caption"] = "Name oder Titel";
App::$strings["Examples: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \"Aviation Group\""] = "Beispiele: „Horst Weidinger“, „Lisa und ihr Meerschweinchen“, „Fußball“, „Segelflieger-Forum“ ";
App::$strings["Choose a short nickname"] = "Wähle einen kurzen Spitznamen";
@@ -97,107 +225,117 @@ App::$strings["Your nickname will be used to create an easy to remember channel
App::$strings["Channel role and privacy"] = "Kanaltyp und Privatspäre-Einstellungen";
App::$strings["Select a channel role with your privacy requirements."] = "Wähle einen passenden Kanaltyp mit den zugehörigen Voreinstellungen zur Privatsphäre.";
App::$strings["Read more about roles"] = "Mehr Informationen über Rollen";
-App::$strings["no"] = "nein";
-App::$strings["yes"] = "ja";
-App::$strings["Registration"] = "Registrierung";
-App::$strings["Membership on this site is by invitation only."] = "Mitgliedschaft auf dieser Seite ist nur nach vorheriger Einladung möglich.";
-App::$strings["Register"] = "Registrieren";
-App::$strings["This site may require email verification after submitting this form. If you are returned to a login page, please check your email for instructions."] = "Diese Seite verlangt möglicherweise eine Emailbestätigung nach dem Absenden des Formulars. Wenn Du auf eine Login-Seite zurückgeleitet wirst, prüfe bitte Deinen Posteingang auf neue Mails mit entsprechenden Hinweisen.";
-App::$strings["Fetching URL returns error: %1\$s"] = "Abrufen der URL gab einen Fehler zurück: %1\$s";
-App::$strings["Page owner information could not be retrieved."] = "Informationen über den Besitzer der Seite konnten nicht gefunden werden.";
-App::$strings["Profile Photos"] = "Profilfotos";
-App::$strings["Album not found."] = "Album nicht gefunden.";
-App::$strings["Delete Album"] = "Album löschen";
-App::$strings["Multiple storage folders exist with this album name, but within different directories. Please remove the desired folder or folders using the Files manager"] = "Mehrere Speicherordner mit diesem Albumnamen sind bereits vorhanden, aber in verschiedenen Verzeichnissen. Bitte entfernen Sie den oder die gewünschten Ordner mit dem Dateimanager";
-App::$strings["Delete Photo"] = "Foto löschen";
-App::$strings["No photos selected"] = "Keine Fotos ausgewählt";
-App::$strings["Access to this item is restricted."] = "Der Zugriff auf dieses Foto ist eingeschränkt.";
-App::$strings["%1$.2f MB of %2$.2f MB photo storage used."] = "%1$.2f MB von %2$.2f MB Foto-Speicher belegt.";
-App::$strings["%1$.2f MB photo storage used."] = "%1$.2f MB Foto-Speicher belegt.";
-App::$strings["Upload Photos"] = "Fotos hochladen";
-App::$strings["Enter an album name"] = "Namen für ein neues Album eingeben";
-App::$strings["or select an existing album (doubleclick)"] = "oder ein bereits vorhandenes auswählen (Doppelklick)";
-App::$strings["Create a status post for this upload"] = "Einen Statusbeitrag für diesen Upload erzeugen";
-App::$strings["No"] = "Nein";
-App::$strings["Yes"] = "Ja";
-App::$strings["Caption (optional):"] = "Beschriftung (optional):";
-App::$strings["Description (optional):"] = "Beschreibung (optional):";
-App::$strings["Permissions"] = "Berechtigungen";
-App::$strings["Submit"] = "Absenden";
-App::$strings["Album name could not be decoded"] = "Albumname konnte nicht dekodiert werden";
-App::$strings["Contact Photos"] = "Kontakt-Bilder";
-App::$strings["Show Newest First"] = "Neueste zuerst anzeigen";
-App::$strings["Show Oldest First"] = "Älteste zuerst anzeigen";
-App::$strings["View Photo"] = "Foto ansehen";
-App::$strings["Edit Album"] = "Album bearbeiten";
-App::$strings["Permission denied. Access to this item may be restricted."] = "Berechtigung verweigert. Der Zugriff ist wahrscheinlich eingeschränkt worden.";
-App::$strings["Photo not available"] = "Foto nicht verfügbar";
-App::$strings["Use as profile photo"] = "Als Profilfoto verwenden";
-App::$strings["Use as cover photo"] = "Als Titelbild verwenden";
-App::$strings["Private Photo"] = "Privates Foto";
-App::$strings["Previous"] = "Voriges";
-App::$strings["View Full Size"] = "In voller Größe anzeigen";
-App::$strings["Next"] = "Nächste";
-App::$strings["Remove"] = "Entfernen";
-App::$strings["Edit photo"] = "Foto bearbeiten";
-App::$strings["Rotate CW (right)"] = "Drehen im UZS (rechts)";
-App::$strings["Rotate CCW (left)"] = "Drehen gegen UZS (links)";
-App::$strings["Move photo to album"] = "Foto in Album verschieben";
-App::$strings["Enter a new album name"] = "Gib einen Namen für ein neues Album ein";
-App::$strings["or select an existing one (doubleclick)"] = "oder wähle ein bereits vorhandenes aus (Doppelklick)";
-App::$strings["Caption"] = "Bildunterschrift";
-App::$strings["Add a Tag"] = "Schlagwort hinzufügen";
-App::$strings["Example: @bob, @Barbara_Jensen, @jim@example.com"] = "Beispiele: @ben, @Karl_Prester, @lieschen@example.com";
-App::$strings["Flag as adult in album view"] = "In der Albumansicht als nicht jugendfrei markieren";
-App::$strings["I like this (toggle)"] = "Mir gefällt das (Umschalter)";
-App::$strings["I don't like this (toggle)"] = "Mir gefällt das nicht (Umschalter)";
-App::$strings["Share"] = "Teilen";
-App::$strings["Please wait"] = "Bitte warten";
-App::$strings["This is you"] = "Das bist Du";
-App::$strings["Comment"] = "Kommentar";
-App::$strings["Preview"] = "Vorschau";
-App::$strings["__ctx:title__ Likes"] = "Gefällt mir";
-App::$strings["__ctx:title__ Dislikes"] = "Gefällt mir nicht";
-App::$strings["__ctx:title__ Agree"] = "Zustimmungen";
-App::$strings["__ctx:title__ Disagree"] = "Ablehnungen";
-App::$strings["__ctx:title__ Abstain"] = "Enthaltungen";
-App::$strings["__ctx:title__ Attending"] = "Zusagen";
-App::$strings["__ctx:title__ Not attending"] = "Absagen";
-App::$strings["__ctx:title__ Might attend"] = "Vielleicht";
-App::$strings["View all"] = "Alles anzeigen";
-App::$strings["__ctx:noun__ Like"] = array(
- 0 => "Gefällt mir",
- 1 => "Gefällt mir",
-);
-App::$strings["__ctx:noun__ Dislike"] = array(
- 0 => "Gefällt nicht",
- 1 => "Gefällt nicht",
-);
-App::$strings["Photo Tools"] = "Fotowerkzeuge";
-App::$strings["In This Photo:"] = "Auf diesem Foto:";
-App::$strings["Map"] = "Karte";
-App::$strings["__ctx:noun__ Likes"] = "Gefällt mir";
-App::$strings["__ctx:noun__ Dislikes"] = "Gefällt nicht";
-App::$strings["Close"] = "Schließen";
-App::$strings["View Album"] = "Album ansehen";
-App::$strings["Recent Photos"] = "Neueste Fotos";
-App::$strings["Item not found"] = "Element nicht gefunden";
-App::$strings["Item is not editable"] = "Element kann nicht bearbeitet werden.";
-App::$strings["Edit post"] = "Bearbeite Beitrag";
-App::$strings["__ctx:acl__ Profile"] = "Profil";
-App::$strings["network"] = "Netzwerk";
-App::$strings["RSS"] = "RSS";
-App::$strings["Documentation Search"] = "Suche in der Dokumentation";
-App::$strings["About"] = "Ãœber";
-App::$strings["Members"] = "Mitglieder";
-App::$strings["Administrators"] = "Administratoren";
-App::$strings["Developers"] = "Entwickler";
-App::$strings["Tutorials"] = "Tutorials";
-App::$strings["\$Projectname Documentation"] = "\$Projectname-Dokumentation";
-App::$strings["Contents"] = "Inhalt";
-App::$strings["Bookmark added"] = "Lesezeichen hinzugefügt";
-App::$strings["My Bookmarks"] = "Meine Lesezeichen";
-App::$strings["My Connections Bookmarks"] = "Lesezeichen meiner Kontakte";
+App::$strings["Create Channel"] = "Einen neuen Kanal anlegen";
+App::$strings["A channel is your identity on this network. It can represent a person, a blog, or a forum to name a few. Channels can make connections with other channels to share information with highly detailed permissions."] = "Ein Kanal ist Deine Identität in diesem Netzwerk. Er kann eine Person, ein Blog oder ein Forum repräsentieren, nur um ein paar Beispiele zu nennen. Kanäle können Verbindungen miteinander eingehen, um Informationen zu teilen, jeweils basierend auf sehr detaillierten Berechtigungseinstellungen.";
+App::$strings["or <a href=\"import\">import an existing channel</a> from another location."] = "oder <a href=\"import\">importiere einen bestehenden Kanal</a> von einem anderen Server.";
+App::$strings["Channel removals are not allowed within 48 hours of changing the account password."] = "Innerhalb von 48 Stunden nach einer Änderung des Passworts können keine Kanäle gelöscht werden.";
+App::$strings["Remove This Channel"] = "Diesen Kanal löschen";
+App::$strings["WARNING: "] = "WARNUNG: ";
+App::$strings["This channel will be completely removed from the network. "] = "Dieser Kanal wird vollständig aus dem Netzwerk gelöscht.";
+App::$strings["This action is permanent and can not be undone!"] = "Dieser Schritt ist endgültig und kann nicht rückgängig gemacht werden!";
+App::$strings["Please enter your password for verification:"] = "Bitte gib zur Bestätigung Dein Passwort ein:";
+App::$strings["Remove this channel and all its clones from the network"] = "Lösche diesen Kanal und all seine Klone aus dem Netzwerk";
+App::$strings["By default only the instance of the channel located on this hub will be removed from the network"] = "Standardmäßig wird der Kanal nur auf diesem Server gelöscht, seine Klone verbleiben im Netzwerk";
+App::$strings["Remove Channel"] = "Kanal löschen";
+App::$strings["Files: shared with me"] = "Dateien, die mit mir geteilt wurden";
+App::$strings["Name"] = "Name";
+App::$strings["NEW"] = "NEU";
+App::$strings["Size"] = "Größe";
+App::$strings["Last Modified"] = "Zuletzt geändert";
+App::$strings["Remove all files"] = "Alle Dateien löschen";
+App::$strings["Remove this file"] = "Diese Datei löschen";
+App::$strings["\$Projectname Server - Setup"] = "\$Projectname Server-Einrichtung";
+App::$strings["Could not connect to database."] = "Kann nicht mit der Datenbank verbinden.";
+App::$strings["Could not connect to specified site URL. Possible SSL certificate or DNS issue."] = "Konnte die angegebene Webseiten-URL nicht erreichen. Möglicherweise ein Problem mit dem SSL-Zertifikat oder dem DNS.";
+App::$strings["Could not create table."] = "Konnte Tabelle nicht erstellen.";
+App::$strings["Your site database has been installed."] = "Die Datenbank Deines Hubs wurde installiert.";
+App::$strings["You may need to import the file \"install/schema_xxx.sql\" manually using a database client."] = "Möglicherweise musst Du die Datei install/schema_xxx.sql manuell mit Hilfe eines Datenkbank-Clients importieren.";
+App::$strings["Please see the file \"install/INSTALL.txt\"."] = "Lies die Datei \"install/INSTALL.txt\".";
+App::$strings["System check"] = "Systemprüfung";
+App::$strings["Check again"] = "Nochmal prüfen";
+App::$strings["Database connection"] = "Datenbankverbindung";
+App::$strings["In order to install \$Projectname we need to know how to connect to your database."] = "Um \$Projectname zu installieren, müssen wir wissen, wie wir eine Verbindung zu Deiner Datenbank aufbauen können.";
+App::$strings["Please contact your hosting provider or site administrator if you have questions about these settings."] = "Bitte kontaktiere Deinen Hosting-Provider oder Administrator, falls Du Fragen zu diesen Einstellungen hast.";
+App::$strings["The database you specify below should already exist. If it does not, please create it before continuing."] = "Die Datenbank, die Du weiter unten angibst, sollte bereits existieren. Sollte das noch nicht der Fall sein, erzeuge sie bitte bevor Du fortfährst.";
+App::$strings["Database Server Name"] = "Datenbankservername";
+App::$strings["Default is 127.0.0.1"] = "Standard ist 127.0.0.1";
+App::$strings["Database Port"] = "Datenbankport";
+App::$strings["Communication port number - use 0 for default"] = "Port-Nummer für die Kommunikation – verwende 0 für die Standardeinstellung";
+App::$strings["Database Login Name"] = "Datenbank-Benutzername";
+App::$strings["Database Login Password"] = "Datenbank-Passwort";
+App::$strings["Database Name"] = "Datenbankname";
+App::$strings["Database Type"] = "Datenbanktyp";
+App::$strings["Site administrator email address"] = "E-Mail Adresse des Seiten-Administrators";
+App::$strings["Your account email address must match this in order to use the web admin panel."] = "Die E-Mail-Adresse Deines Accounts muss dieser Adresse entsprechen, damit Du Zugriff zur Administrations-Seite erhältst.";
+App::$strings["Website URL"] = "Webseiten-URL";
+App::$strings["Please use SSL (https) URL if available."] = "Nutze wenn möglich eine SSL-URL (https).";
+App::$strings["Please select a default timezone for your website"] = "Standard-Zeitzone für Deinen Server";
+App::$strings["Basic/Minimal Social Networking"] = "Einfaches/minimales soziales Netzwerken";
+App::$strings["Standard Configuration (default)"] = "Standardkonfiguration (Standard)";
+App::$strings["Professional"] = "Professionell";
+App::$strings["Site settings"] = "Seiteneinstellungen";
+App::$strings["Server Configuration/Role"] = "Serverkonfiguration/Rolle";
+App::$strings["PHP version 5.5 or greater is required."] = "PHP-Version 5.5 oder höher ist erforderlich.";
+App::$strings["PHP version"] = "PHP-Version";
+App::$strings["Could not find a command line version of PHP in the web server PATH."] = "Konnte die Kommandozeilen-Version von PHP nicht im PATH des Web-Servers finden.";
+App::$strings["If you don't have a command line version of PHP installed on server, you will not be able to run background polling via cron."] = "Ohne Kommandozeilen-Version von PHP auf dem Server wirst Du nicht in der Lage sein, Hintergrundprozesse via cron auszuführen.";
+App::$strings["PHP executable path"] = "PHP-Pfad zu ausführbarer Datei";
+App::$strings["Enter full path to php executable. You can leave this blank to continue the installation."] = "Gib den vollen Pfad zum PHP-Interpreter an. Du kannst dieses Feld frei lassen und mit der Installation fortfahren.";
+App::$strings["Command line PHP"] = "PHP-Befehlszeile";
+App::$strings["Unable to check command line PHP, as shell_exec() is disabled. This is required."] = "Prüfung auf Kommandozeilen-PHP fehlgeschlagen, da shell_exec() deaktiviert ist. Dies wird aber benötigt.";
+App::$strings["The command line version of PHP on your system does not have \"register_argc_argv\" enabled."] = "Bei der Kommandozeilen-Version von PHP auf Deinem System ist \"register_argc_argv\" nicht aktiviert.";
+App::$strings["This is required for message delivery to work."] = "Das wird benötigt, damit die Auslieferung von Nachrichten funktioniert.";
+App::$strings["PHP register_argc_argv"] = "PHP register_argc_argv";
+App::$strings["Your max allowed total upload size is set to %s. Maximum size of one file to upload is set to %s. You are allowed to upload up to %d files at once."] = "Die Maximalgröße für Uploads insgesamt liegt bei %s. Die Maximalgröße für eine Datei liegt bei %s. Es können maximal %d Dateien gleichzeitig hochgeladen werden.";
+App::$strings["You can adjust these settings in the server php.ini file."] = "Du kannst diese Einstellungen in der php.ini - Datei des Servers anpassen.";
+App::$strings["PHP upload limits"] = "PHP-Hochladebeschränkungen";
+App::$strings["Error: the \"openssl_pkey_new\" function on this system is not able to generate encryption keys"] = "Fehler: Die „openssl_pkey_new“-Funktion auf diesem System ist nicht in der Lage, Schlüssel für die Verschlüsselung zu erzeugen.";
+App::$strings["If running under Windows, please see \"http://www.php.net/manual/en/openssl.installation.php\"."] = "Wenn Du Windows verwendest, findest Du unter http://www.php.net/manual/en/openssl.installation.php eine Installationsanleitung.";
+App::$strings["Generate encryption keys"] = "Verschlüsselungsschlüssel erzeugen";
+App::$strings["libCurl PHP module"] = "libCurl-PHP-Modul";
+App::$strings["GD graphics PHP module"] = "GD-Grafik-PHP-Modul";
+App::$strings["OpenSSL PHP module"] = "OpenSSL-PHP-Modul";
+App::$strings["PDO database PHP module"] = "PDO-Datenbank-PHP-Modul";
+App::$strings["mb_string PHP module"] = "mb_string-PHP-Modul";
+App::$strings["xml PHP module"] = "xml-PHP-Modul";
+App::$strings["Apache mod_rewrite module"] = "Apache-mod_rewrite-Modul";
+App::$strings["Error: Apache webserver mod-rewrite module is required but not installed."] = "Fehler: Das Apache-Modul mod-rewrite wird benötigt, ist aber nicht installiert.";
+App::$strings["exec"] = "exec";
+App::$strings["Error: exec is required but is either not installed or has been disabled in php.ini"] = "Fehler: exec ist erforderlich, aber entweder nicht installiert oder wurde in der php.ini deaktiviert";
+App::$strings["shell_exec"] = "shell_exec";
+App::$strings["Error: shell_exec is required but is either not installed or has been disabled in php.ini"] = "Fehler: shell_exec ist erforderlich, aber entweder nicht installiert oder wurde in der php.ini deaktiviert";
+App::$strings["Error: libCURL PHP module required but not installed."] = "Fehler: Das PHP-Modul libCURL wird benötigt, ist aber nicht installiert.";
+App::$strings["Error: GD graphics PHP module with JPEG support required but not installed."] = "Fehler: Das PHP-Modul GD-Grafik mit JPEG-Unterstützung wird benötigt, ist aber nicht installiert.";
+App::$strings["Error: openssl PHP module required but not installed."] = "Fehler: Das PHP-Modul openssl wird benötigt, ist aber nicht installiert.";
+App::$strings["Error: PDO database PHP module required but not installed."] = "Fehler: PDO-Datenbank-PHP-Modul ist erforderlich, aber nicht installiert.";
+App::$strings["Error: mb_string PHP module required but not installed."] = "Fehler: Das PHP-Modul mb_string wird benötigt, ist aber nicht installiert.";
+App::$strings["Error: xml PHP module required for DAV but not installed."] = "Fehler: Das xml-PHP-Modul wird für DAV benötigt, ist aber nicht installiert.";
+App::$strings["The web installer needs to be able to create a file called \".htconfig.php\" in the top folder of your web server and it is unable to do so."] = "Der Installations-Assistent muss in der Lage sein, die Datei \".htconfig.php\" im Stammverzeichnis des Web-Servers anzulegen, ist er aber nicht.";
+App::$strings["This is most often a permission setting, as the web server may not be able to write files in your folder - even if you can."] = "Meist liegt das daran, dass der Nutzer, unter dem der Web-Server läuft, keine Schreibrechte in dem Verzeichnis hat – selbst wenn Du selbst das darfst.";
+App::$strings["At the end of this procedure, we will give you a text to save in a file named .htconfig.php in your Red top folder."] = "Am Schluss dieses Vorgangs wird ein Text generiert, den Du unter dem Dateinamen .htconfig.php im Stammverzeichnis Deiner Hubzilla-Installation speichern musst.";
+App::$strings["You can alternatively skip this procedure and perform a manual installation. Please see the file \"install/INSTALL.txt\" for instructions."] = "Alternativ kannst Du diesen Schritt überspringen und die Installation manuell vornehmen. Lies dazu die Datei install/INSTALL.txt.";
+App::$strings[".htconfig.php is writable"] = ".htconfig.php ist beschreibbar";
+App::$strings["This software uses the Smarty3 template engine to render its web views. Smarty3 compiles templates to PHP to speed up rendering."] = "Diese Software verwendet die Smarty3 Template Engine, um Vorlagen für die Webdarstellung zu verarbeiten. Smarty3 übersetzt diese Vorlagen nach PHP, um die Darstellung zu beschleunigen.";
+App::$strings["In order to store these compiled templates, the web server needs to have write access to the directory %s under the top level web folder."] = "Um diese kompilierten Vorlagen speichern zu können, braucht der Web-Server Schreibzugriff auf das Verzeichnis %s unterhalb des Hubzilla-Stammverzeichnisses.";
+App::$strings["Please ensure that the user that your web server runs as (e.g. www-data) has write access to this folder."] = "Bitte stelle sicher, dass der Nutzer, unter dem der Web-Server läuft (z.B. www-data), Schreibzugriff auf dieses Verzeichnis hat.";
+App::$strings["Note: as a security measure, you should give the web server write access to %s only--not the template files (.tpl) that it contains."] = "Hinweis: Aus Sicherheitsgründen sollte der Web-Server nur auf %s Schreibrechte haben, nicht auf die Template-Dateien (.tpl), die das Verzeichnis enthält.";
+App::$strings["%s is writable"] = "%s ist beschreibbar";
+App::$strings["This software uses the store directory to save uploaded files. The web server needs to have write access to the store directory under the top level web folder"] = "Diese Software benutzt das Verzeichnis store, um hochgeladene Dateien zu speichern. Der Webserver benötigt Schreibrechte für dieses Verzeichnis direkt unterhalb des Web-Stammverzeichnisses.";
+App::$strings["store is writable"] = "store ist schreibbar";
+App::$strings["SSL certificate cannot be validated. Fix certificate or disable https access to this site."] = "Das SSL-Zertifikat konnte nicht validiert werden. Korrigiere das Zertifikat oder deaktiviere den HTTPS-Zugriff auf diesen Server.";
+App::$strings["If you have https access to your website or allow connections to TCP port 443 (the https: port), you MUST use a browser-valid certificate. You MUST NOT use self-signed certificates!"] = "Wenn Du via HTTPS auf Deinen Server zugreifen möchtest, also Verbindungen über den Port 443 möglich sein sollen, ist ein SSL-Zertifikat einer Zertifizierungsstelle (CA) notwendig, das von den Browsern ohne Sicherheitsabfrage akzeptiert wird. Die Verwendung eines selbst signierten Zertifikates ist nicht möglich.";
+App::$strings["This restriction is incorporated because public posts from you may for example contain references to images on your own hub."] = "Diese Einschränkung wurde eingebaut, weil Deine öffentlichen Beiträge zum Beispiel Verweise auf Bilder auf Deinem eigenen Hub enthalten können.";
+App::$strings["If your certificate is not recognized, members of other sites (who may themselves have valid certificates) will get a warning message on their own site complaining about security issues."] = "Wenn Dein Zertifikat nicht von jedem Browser akzeptiert wird, erhalten die Mitglieder anderer \$Projectname-Hubs (die mit korrekten Zertifikaten ausgestattet sind) Sicherheits-Warnmeldungen, obwohl sie gar nicht direkt auf Deinem Server unterwegs sind (zum Beispiel, wenn ein Bild aus einem Deiner Beiträge angezeigt wird).";
+App::$strings["This can cause usability issues elsewhere (not just on your own site) so we must insist on this requirement."] = "Dies kann Probleme für andere Nutzer (nicht nur auf Deinem eigenen Server) verursachen, so dass wir auf dieser Forderung bestehen müssen.";
+App::$strings["Providers are available that issue free certificates which are browser-valid."] = "Es gibt einige Zertifizierungsstellen (CAs), bei denen solche Zertifikate kostenlos zu haben sind.";
+App::$strings["If you are confident that the certificate is valid and signed by a trusted authority, check to see if you have failed to install an intermediate cert. These are not normally required by browsers, but are required for server-to-server communications."] = "Wenn Du sicher bist, dass das Zertifikat gültig und von einer vertrauenswürdigen Zertifizierungsstelle signiert ist, prüfe auf ggf. noch zu installierende Zwischenzertifikate (intermediate). Diese werden nicht unbedingt von Browsern benötigt, aber sehr wohl für die Kommunikation zwischen Servern.";
+App::$strings["SSL certificate validation"] = "SSL Zertifikatverifizierung";
+App::$strings["Url rewrite in .htaccess is not working. Check your server configuration.Test: "] = "Das Umschreiben von URLs (rewrite) per .htaccess funktioniert nicht. Bitte prüfe die Server-Konfiguration. Test:";
+App::$strings["Url rewrite is working"] = "Url rewrite funktioniert";
+App::$strings["The database configuration file \".htconfig.php\" could not be written. Please use the enclosed text to create a configuration file in your web server root."] = "Die Datenbank-Konfigurationsdatei „.htconfig.php“ konnte nicht geschrieben werden. Bitte verwende den unten angegebenen Text, um die Konfigurationsdatei im Stammverzeichnis des Webservers anzulegen.";
+App::$strings["Errors encountered creating database tables."] = "Fehler beim Anlegen der Datenbank-Tabellen aufgetreten.";
+App::$strings["<h1>What next</h1>"] = "<h1>Was als Nächstes</h1>";
+App::$strings["IMPORTANT: You will need to [manually] setup a scheduled task for the poller."] = "WICHTIG: Du musst [manuell] einen Cronjob für den Poller einrichten.";
App::$strings["Continue"] = "Fortfahren";
App::$strings["Premium Channel Setup"] = "Premium-Kanal-Einrichtung";
App::$strings["Enable premium channel connection restrictions"] = "Einschränkungen für einen Premium-Kanal aktivieren";
@@ -207,166 +345,57 @@ App::$strings["Potential connections will then see the following text before pro
App::$strings["By continuing, I certify that I have complied with any instructions provided on this page."] = "Indem ich fortfahre, bestätige ich die Erfüllung aller Anweisungen auf dieser Seite.";
App::$strings["(No specific instructions have been provided by the channel owner.)"] = "(Der Kanal-Besitzer hat keine speziellen Anweisungen hinterlegt.)";
App::$strings["Restricted or Premium Channel"] = "Eingeschränkter oder Premium-Kanal";
-App::$strings["# Accounts"] = "Anzahl der Konten";
-App::$strings["# blocked accounts"] = "Anzahl der blockierten Konten";
-App::$strings["# expired accounts"] = "Anzahl der abgelaufenen Konten";
-App::$strings["# expiring accounts"] = "Anzahl der ablaufenden Konten";
-App::$strings["# Channels"] = "Anzahl der Kanäle";
-App::$strings["# primary"] = "Anzahl der primären Kanäle";
-App::$strings["# clones"] = "Anzahl der Klone";
-App::$strings["Message queues"] = "Nachrichten-Warteschlangen";
-App::$strings["Your software should be updated"] = "Die installierte Software sollte aktualisiert werden";
-App::$strings["Administration"] = "Administration";
-App::$strings["Summary"] = "Zusammenfassung";
-App::$strings["Registered accounts"] = "Registrierte Konten";
-App::$strings["Pending registrations"] = "Ausstehende Registrierungen";
-App::$strings["Registered channels"] = "Registrierte Kanäle";
-App::$strings["Active plugins"] = "Aktive Plug-Ins";
-App::$strings["Version"] = "Version";
-App::$strings["Repository version (master)"] = "Repository-Version (master)";
-App::$strings["Repository version (dev)"] = "Repository-Version (dev)";
-App::$strings["Block Name"] = "Block-Name";
-App::$strings["Insert web link"] = "Link einfügen";
-App::$strings["Title (optional)"] = "Titel (optional)";
-App::$strings["Edit Block"] = "Block bearbeiten";
-App::$strings["Invalid item."] = "Ungültiges Element.";
-App::$strings["Channel not found."] = "Kanal nicht gefunden.";
-App::$strings["Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."] = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";
-App::$strings["Save to Folder:"] = "Speichern in Ordner:";
-App::$strings["- select -"] = "– auswählen –";
-App::$strings["Save"] = "Speichern";
-App::$strings["sent you a private message"] = "hat Dir eine private Nachricht geschickt";
-App::$strings["added your channel"] = "hat deinen Kanal hinzugefügt";
-App::$strings["g A l F d"] = "l, d. F, G:i \\U\\h\\r";
-App::$strings["[today]"] = "[Heute]";
-App::$strings["posted an event"] = "hat einen Termin veröffentlicht";
-App::$strings["Blocked"] = "Blockiert";
-App::$strings["Ignored"] = "Ignoriert";
-App::$strings["Hidden"] = "Versteckt";
-App::$strings["Archived"] = "Archiviert";
-App::$strings["New"] = "Neu";
-App::$strings["All"] = "Alle";
-App::$strings["New Connections"] = "Neue Verbindungen";
-App::$strings["Show pending (new) connections"] = "Ausstehende (neue) Verbindungsanfragen anzeigen";
-App::$strings["All Connections"] = "Alle Verbindungen";
-App::$strings["Show all connections"] = "Alle Verbindungen anzeigen";
-App::$strings["Only show blocked connections"] = "Nur blockierte Verbindungen anzeigen";
-App::$strings["Only show ignored connections"] = "Nur ignorierte Verbindungen anzeigen";
-App::$strings["Only show archived connections"] = "Nur archivierte Verbindungen anzeigen";
-App::$strings["Only show hidden connections"] = "Nur versteckte Verbindungen anzeigen";
-App::$strings["Pending approval"] = "Wartet auf Genehmigung";
-App::$strings["%1\$s [%2\$s]"] = "%1\$s [%2\$s]";
-App::$strings["Edit connection"] = "Verbindung bearbeiten";
-App::$strings["Delete connection"] = "Verbindung löschen";
-App::$strings["Channel address"] = "Kanaladresse";
-App::$strings["Network"] = "Netzwerk";
-App::$strings["Call"] = "Anruf";
-App::$strings["Status"] = "Status";
-App::$strings["Connected"] = "Verbunden";
-App::$strings["Approve connection"] = "Verbindung genehmigen";
-App::$strings["Approve"] = "Genehmigen";
-App::$strings["Ignore connection"] = "Verbindung ignorieren";
-App::$strings["Ignore"] = "Ignorieren";
-App::$strings["Recent activity"] = "Kürzliche Aktivitäten";
-App::$strings["Connections"] = "Verbindungen";
-App::$strings["Search"] = "Suche";
-App::$strings["Search your connections"] = "Verbindungen durchsuchen";
-App::$strings["Connections search"] = "Verbindung suchen";
-App::$strings["Find"] = "Finde";
-App::$strings["Image uploaded but image cropping failed."] = "Bild hochgeladen, aber das Zurechtschneiden schlug fehl.";
-App::$strings["Cover Photos"] = "Cover Foto";
-App::$strings["Image resize failed."] = "Bild-Anpassung fehlgeschlagen.";
-App::$strings["Unable to process image"] = "Kann Bild nicht verarbeiten";
-App::$strings["Image upload failed."] = "Hochladen des Bilds fehlgeschlagen.";
-App::$strings["Unable to process image."] = "Kann Bild nicht verarbeiten.";
-App::$strings["female"] = "weiblich";
-App::$strings["%1\$s updated her %2\$s"] = "%1\$s hat ihr %2\$s aktualisiert";
-App::$strings["male"] = "männlich";
-App::$strings["%1\$s updated his %2\$s"] = "%1\$s hat sein %2\$s aktualisiert";
-App::$strings["%1\$s updated their %2\$s"] = "%1\$s hat sein/ihr %2\$s aktualisiert";
-App::$strings["cover photo"] = "Cover Foto";
-App::$strings["Photo not available."] = "Foto nicht verfügbar.";
-App::$strings["Upload File:"] = "Datei hochladen:";
-App::$strings["Select a profile:"] = "Wähle ein Profil:";
-App::$strings["Upload Cover Photo"] = "Cover Foto hochladen";
-App::$strings["or"] = "oder";
-App::$strings["skip this step"] = "diesen Schritt überspringen";
-App::$strings["select a photo from your photo albums"] = "ein Foto aus meinen Fotoalben";
-App::$strings["Crop Image"] = "Bild zuschneiden";
-App::$strings["Please adjust the image cropping for optimum viewing."] = "Bitte schneide das Bild für eine optimale Anzeige passend zu.";
-App::$strings["Done Editing"] = "Bearbeitung fertigstellen";
+App::$strings["Queue Statistics"] = "Warteschlangenstatistiken";
+App::$strings["Total Entries"] = "Einträge insgesamt";
+App::$strings["Priority"] = "Priorität";
+App::$strings["Destination URL"] = "Ziel-URL";
+App::$strings["Mark hub permanently offline"] = "Hub als permanent offline markieren";
+App::$strings["Empty queue for this hub"] = "Warteschlange für diesen Hub leeren";
+App::$strings["Last known contact"] = "Letzter Kontakt";
App::$strings["Off"] = "Aus";
App::$strings["On"] = "An";
App::$strings["Lock feature %s"] = "Blockiere die Funktion %s";
App::$strings["Manage Additional Features"] = "Zusätzliche Funktionen verwalten";
-App::$strings["Log settings updated."] = "Protokoll-Einstellungen aktualisiert.";
-App::$strings["Logs"] = "Protokolle";
-App::$strings["Clear"] = "Leeren";
-App::$strings["Debugging"] = "Debugging";
-App::$strings["Log file"] = "Protokolldatei";
-App::$strings["Must be writable by web server. Relative to your top-level webserver directory."] = "Muss für den Web-Server schreibbar sein. Relativ zum Hubzilla-Stammverzeichnis.";
-App::$strings["Log level"] = "Protokollstufe";
-App::$strings["New Profile Field"] = "Neues Profilfeld";
-App::$strings["Field nickname"] = "Kurzname für das Feld";
-App::$strings["System name of field"] = "Systemname des Feldes";
-App::$strings["Input type"] = "Art des Inhalts";
-App::$strings["Field Name"] = "Feldname";
-App::$strings["Label on profile pages"] = "Bezeichnung auf Profilseiten";
-App::$strings["Help text"] = "Hilfetext";
-App::$strings["Additional info (optional)"] = "Zusätzliche Informationen (optional)";
-App::$strings["Field definition not found"] = "Feld-Definition nicht gefunden";
-App::$strings["Edit Profile Field"] = "Profilfeld bearbeiten";
-App::$strings["Profile Fields"] = "Profil Felder";
-App::$strings["Basic Profile Fields"] = "Notwendige Profil Felder";
-App::$strings["Advanced Profile Fields"] = "Erweiterte Profil Felder";
-App::$strings["(In addition to basic fields)"] = "(zusätzlich zu notwendige Felder)";
-App::$strings["All available fields"] = "Alle verfügbaren Felder";
-App::$strings["Custom Fields"] = "Benutzerdefinierte Felder";
-App::$strings["Create Custom Field"] = "Erstelle benutzerdefiniertes Feld";
-App::$strings["By default, unfiltered HTML is allowed in embedded media. This is inherently insecure."] = "Standardmäßig wird ungefiltertes HTML in eingebetteten Inhalten zugelassen. Das ist prinzipiell unsicher.";
-App::$strings["The recommended setting is to only allow unfiltered HTML from the following sites:"] = "Die empfohlene Einstellung ist, ungefiltertes HTML nur von den nachfolgenden Webseiten zu erlauben:";
-App::$strings["https://youtube.com/<br />https://www.youtube.com/<br />https://youtu.be/<br />https://vimeo.com/<br />https://soundcloud.com/<br />"] = "https://youtube.com/<br />https://www.youtube.com/<br />https://youtu.be/<br />https://vimeo.com/<br />https://soundcloud.com/<br />";
-App::$strings["All other embedded content will be filtered, <strong>unless</strong> embedded content from that site is explicitly blocked."] = "Alle anderen eingebetteten Inhalte werden gefiltert, <strong>es sei denn</strong>, eingebettete Inhalte von einer bestimmten Seite sind explizit blockiert.";
-App::$strings["Security"] = "Sicherheit";
-App::$strings["Block public"] = "Öffentlichen Zugriff blockieren";
-App::$strings["Check to block public access to all otherwise public personal pages on this site unless you are currently authenticated."] = "Blockiere den öffentlichen Zugriff auf alle ansonsten öffentlichen persönlichen Seiten dieser Website, sofern ein Besucher nicht angemeldet ist.";
-App::$strings["Set \"Transport Security\" HTTP header"] = "Setze den \"Transport Security\" HTTP Header";
-App::$strings["Set \"Content Security Policy\" HTTP header"] = "Setze den \"Content Security Policy\" HTTP Header";
-App::$strings["Allowed email domains"] = "Erlaubte Domains für E-Mails";
-App::$strings["Comma separated list of domains which are allowed in email addresses for registrations to this site. Wildcards are accepted. Empty to allow any domains"] = "Liste der Domains, die für E-Mail-Adressen bei der Registrierung erlaubt sind, durch Kommas getrennt. Platzhalter werden akzeptiert. Leer lassen, um alle Domains zu erlauben.";
-App::$strings["Not allowed email domains"] = "Nicht erlaubte Domains für E-Mails";
-App::$strings["Comma separated list of domains which are not allowed in email addresses for registrations to this site. Wildcards are accepted. Empty to allow any domains, unless allowed domains have been defined."] = "Domains in E-Mail-Adressen, die keine Erlaubnis erhalten, sich auf Deinem Hub zu registrieren. Mehrere Domains können durch Kommas getrennt werden. Platzhalter (*/?) sind möglich. Keine Eingabe bedeutet keine Einschränkung, unabhängig davon, ob unter erlaubte Domains etwas eingegeben wurde.";
-App::$strings["Allow communications only from these sites"] = "Kommunikation nur von diesen Servern/Domains erlauben";
-App::$strings["One site per line. Leave empty to allow communication from anywhere by default"] = "Ein Eintrag pro Zeile. Lasse das Feld leer, um Kommunikation grundlegend von überall her zu erlauben.";
-App::$strings["Block communications from these sites"] = "Kommunikation von diesen Servern/Domains blockieren";
-App::$strings["Allow communications only from these channels"] = "Kommunikation nur von diesen Kanälen erlauben";
-App::$strings["One channel (hash) per line. Leave empty to allow from any channel by default"] = "Ein Kanal (hash) pro Zeile. Leerlassen um jeden Kanal zuzulassen. ";
-App::$strings["Block communications from these channels"] = "Kommunikation von folgenden Kanälen blockieren";
-App::$strings["Only allow embeds from secure (SSL) websites and links."] = "Erlaube Einbettungen nur von sicheren (SSL) Webseiten und Links.";
-App::$strings["Allow unfiltered embedded HTML content only from these domains"] = "Erlaube Einbettung von Inhalten mit ungefiltertem HTML nur von diesen Domains";
-App::$strings["One site per line. By default embedded content is filtered."] = "Eine Website/Domain pro Zeile. Standardmäßig wird eingebetteter Inhalt gefiltert.";
-App::$strings["Block embedded HTML from these domains"] = "Eingebettete HTML Inhalte von diesen Servern/Domains blockieren";
-App::$strings["Theme settings updated."] = "Theme-Einstellungen aktualisiert.";
-App::$strings["No themes found."] = "Keine Theme gefunden.";
+App::$strings["Update has been marked successful"] = "Update wurde als erfolgreich markiert";
+App::$strings["Executing %s failed. Check system logs."] = "Ausführen von %s fehlgeschlagen. Überprüfe die Systemprotokolle.";
+App::$strings["Update %s was successfully applied."] = "Update %s wurde erfolgreich ausgeführt.";
+App::$strings["Update %s did not return a status. Unknown if it succeeded."] = "Update %s lieferte keinen Rückgabewert. Erfolg unbekannt.";
+App::$strings["Update function %s could not be found."] = "Update-Funktion %s konnte nicht gefunden werden.";
+App::$strings["No failed updates."] = "Keine fehlgeschlagenen Aktualisierungen.";
+App::$strings["Failed Updates"] = "Fehlgeschlagene Aktualisierungen";
+App::$strings["Mark success (if update was manually applied)"] = "Als erfolgreich markieren (wenn das Update manuell ausgeführt wurde)";
+App::$strings["Attempt to execute this update step automatically"] = "Versuche, diesen Updateschritt automatisch auszuführen";
+App::$strings["Item not found."] = "Element nicht gefunden.";
+App::$strings["Plugin %s disabled."] = "Plug-In %s deaktiviert.";
+App::$strings["Plugin %s enabled."] = "Plug-In %s aktiviert.";
App::$strings["Disable"] = "Deaktivieren";
App::$strings["Enable"] = "Aktivieren";
-App::$strings["Screenshot"] = "Bildschirmfoto";
-App::$strings["Themes"] = "Themes";
+App::$strings["Administration"] = "Administration";
+App::$strings["Plugins"] = "Plug-Ins";
App::$strings["Toggle"] = "Umschalten";
App::$strings["Settings"] = "Einstellungen";
App::$strings["Author: "] = "Autor: ";
App::$strings["Maintainer: "] = "Betreuer:";
-App::$strings["[Experimental]"] = "[Experimentell]";
-App::$strings["[Unsupported]"] = "[Nicht unterstützt]";
-App::$strings["Password changed for account %d."] = "Passwort für Konto %d geändert.";
-App::$strings["Account settings updated."] = "Kontoeinstellungen aktualisiert.";
-App::$strings["Account not found."] = "Konto nicht gefunden.";
-App::$strings["Account Edit"] = "Kontobearbeitung";
-App::$strings["New Password"] = "Neues Passwort";
-App::$strings["New Password again"] = "Neues Passwort wiederholen";
-App::$strings["Technical skill level"] = "Technische Qualifikationsstufe";
-App::$strings["Account language (for emails)"] = "Kontosprache (für E-Mails)";
-App::$strings["Service class"] = "Dienstklasse";
+App::$strings["Minimum project version: "] = "Minimale Version des Projekts:";
+App::$strings["Maximum project version: "] = "Maximale Version des Projekts:";
+App::$strings["Minimum PHP version: "] = "Minimale PHP Version:";
+App::$strings["Compatible Server Roles: "] = "Kompatible Serverrollen: ";
+App::$strings["Requires: "] = "Benötigt:";
+App::$strings["Disabled - version incompatibility"] = "Abgeschaltet - Versionsinkompatibilität";
+App::$strings["Enter the public git repository URL of the plugin repo."] = "Gib die öffentliche Git-Repository-URL des Plugin-Repository an.";
+App::$strings["Plugin repo git URL"] = "Plugin-Repository Git URL";
+App::$strings["Custom repo name"] = "Benutzerdefinierter Repository-Name";
+App::$strings["(optional)"] = "(optional)";
+App::$strings["Download Plugin Repo"] = "Plugin-Repository herunterladen";
+App::$strings["Install new repo"] = "Neues Repository installieren";
+App::$strings["Install"] = "Installieren";
+App::$strings["Cancel"] = "Abbrechen";
+App::$strings["Manage Repos"] = "Repositorien verwalten";
+App::$strings["Installed Plugin Repositories"] = "Installierte Plugin-Repositorien";
+App::$strings["Install a New Plugin Repository"] = "Ein neues Plugin-Repository installieren";
+App::$strings["Update"] = "Aktualisieren";
+App::$strings["Switch branch"] = "Zweig/Branch wechseln";
+App::$strings["Remove"] = "Entfernen";
App::$strings["%s account blocked/unblocked"] = array(
0 => "%s Konto blockiert/freigegeben",
1 => "%s Konten blockiert/freigegeben",
@@ -385,6 +414,7 @@ App::$strings["Registrations waiting for confirm"] = "Registrierungen warten auf
App::$strings["Request date"] = "Antragsdatum";
App::$strings["Email"] = "E-Mail";
App::$strings["No registrations."] = "Keine Registrierungen.";
+App::$strings["Approve"] = "Genehmigen";
App::$strings["Deny"] = "Verweigern";
App::$strings["Block"] = "Blockieren";
App::$strings["Unblock"] = "Freigeben";
@@ -396,6 +426,13 @@ App::$strings["Expires"] = "Verfällt";
App::$strings["Service Class"] = "Service-Klasse";
App::$strings["Selected accounts will be deleted!\\n\\nEverything these accounts had posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "Die ausgewählten Konten werden gelöscht!\\n\\nAlles, was diese Konten auf diesem Hub veröffentlicht haben, wird endgültig gelöscht werden!\\n\\nBist du dir sicher?";
App::$strings["The account {0} will be deleted!\\n\\nEverything this account has posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "Das Konto {0} wird gelöscht!\\n\\nAlles, was dieses Konto auf diesem Hub veröffentlicht hat, wird endgültig gelöscht werden!\\n\\nBist Du sicher?";
+App::$strings["Log settings updated."] = "Protokoll-Einstellungen aktualisiert.";
+App::$strings["Logs"] = "Protokolle";
+App::$strings["Clear"] = "Leeren";
+App::$strings["Debugging"] = "Debugging";
+App::$strings["Log file"] = "Protokolldatei";
+App::$strings["Must be writable by web server. Relative to your top-level webserver directory."] = "Muss für den Web-Server schreibbar sein. Relativ zum Hubzilla-Stammverzeichnis.";
+App::$strings["Log level"] = "Protokollstufe";
App::$strings["%s channel censored/uncensored"] = array(
0 => "%s Kanal gesperrt/freigegeben",
1 => "%s Kanäle gesperrt/freigegeben",
@@ -421,20 +458,17 @@ App::$strings["Allow Code"] = "Code erlauben";
App::$strings["Disallow Code"] = "Code sperren";
App::$strings["Channel"] = "Kanal";
App::$strings["UID"] = "UID";
-App::$strings["Address"] = "Adresse";
App::$strings["Selected channels will be deleted!\\n\\nEverything that was posted in these channels on this site will be permanently deleted!\\n\\nAre you sure?"] = "Alle ausgewählten Kanäle werden gelöscht!\\n\\nAlles was von diesen Kanälen auf diesem Server geschrieben wurde, wird dauerhaft gelöscht!\\n\\nBist Du sicher?";
App::$strings["The channel {0} will be deleted!\\n\\nEverything that was posted in this channel on this site will be permanently deleted!\\n\\nAre you sure?"] = "Der Kanal {0} wird gelöscht!\\n\\nAlles was von diesem Kanal auf diesem Server geschrieben wurde, wird gelöscht!\\n\\nBist Du sicher?";
-App::$strings["Update has been marked successful"] = "Update wurde als erfolgreich markiert";
-App::$strings["Executing %s failed. Check system logs."] = "Ausführen von %s fehlgeschlagen. Überprüfe die Systemprotokolle.";
-App::$strings["Update %s was successfully applied."] = "Update %s wurde erfolgreich ausgeführt.";
-App::$strings["Update %s did not return a status. Unknown if it succeeded."] = "Update %s lieferte keinen Rückgabewert. Erfolg unbekannt.";
-App::$strings["Update function %s could not be found."] = "Update-Funktion %s konnte nicht gefunden werden.";
-App::$strings["No failed updates."] = "Keine fehlgeschlagenen Aktualisierungen.";
-App::$strings["Failed Updates"] = "Fehlgeschlagene Aktualisierungen";
-App::$strings["Mark success (if update was manually applied)"] = "Als erfolgreich markieren (wenn das Update manuell ausgeführt wurde)";
-App::$strings["Attempt to execute this update step automatically"] = "Versuche, diesen Updateschritt automatisch auszuführen";
+App::$strings["Theme settings updated."] = "Theme-Einstellungen aktualisiert.";
+App::$strings["No themes found."] = "Keine Theme gefunden.";
+App::$strings["Screenshot"] = "Bildschirmfoto";
+App::$strings["Themes"] = "Themes";
+App::$strings["[Experimental]"] = "[Experimentell]";
+App::$strings["[Unsupported]"] = "[Nicht unterstützt]";
App::$strings["Site settings updated."] = "Site-Einstellungen aktualisiert.";
App::$strings["Default"] = "Standard";
+App::$strings["%s - (Incompatible)"] = "%s - (Inkompatibel)";
App::$strings["mobile"] = "mobil";
App::$strings["experimental"] = "experimentell";
App::$strings["unsupported"] = "nicht unterstützt";
@@ -443,9 +477,6 @@ App::$strings["My site is not a public server"] = "Mein Server ist kein öffentl
App::$strings["My site has paid access only"] = "Meine Seite hat nur bezahlten Zugriff";
App::$strings["My site has free access only"] = "Meine Seite hat nur freien Zugriff";
App::$strings["My site offers free accounts with optional paid upgrades"] = "Mein Server bietet kostenlose Konten mit der Möglichkeit zu bezahlten Upgrades";
-App::$strings["Basic/Minimal Social Networking"] = "Einfaches/minimales soziales Netzwerken";
-App::$strings["Standard Configuration (default)"] = "Standardkonfiguration (Standard)";
-App::$strings["Professional"] = "Professionell";
App::$strings["Beginner/Basic"] = "Anfänger/Basis";
App::$strings["Novice - not skilled but willing to learn"] = "Anfänger - unerfahren, aber bereit zu lernen";
App::$strings["Intermediate - somewhat comfortable"] = "Fortgeschritten - relativ komfortabel";
@@ -453,11 +484,11 @@ App::$strings["Advanced - very comfortable"] = "Fortgeschritten - sehr komfortab
App::$strings["Expert - I can write computer code"] = "Experte - Ich kann Computercode schreiben";
App::$strings["Wizard - I probably know more than you do"] = "Zauberer - ich kann wahrscheinlich mehr als Du";
App::$strings["Site"] = "Seite";
+App::$strings["Registration"] = "Registrierung";
App::$strings["File upload"] = "Dateiupload";
App::$strings["Policies"] = "Richtlinien";
App::$strings["Advanced"] = "Fortgeschritten";
App::$strings["Site name"] = "Seitenname";
-App::$strings["Server Configuration/Role"] = "Serverkonfiguration/Rolle";
App::$strings["Site default technical skill level"] = "Standard-Qualifikationsstufe der Website";
App::$strings["Used to provide a member experience matched to technical comfort level"] = "Dies wird verwendet, um eine Benutzererfahrung passend zur technischen Qualifikationsstufe zu bieten.";
App::$strings["Lock the technical skill level setting"] = "Sperre die technische Qualifikationsstufe";
@@ -500,6 +531,9 @@ App::$strings["Login on Homepage"] = "Log-in auf der Startseite";
App::$strings["Present a login box to visitors on the home page if no other content has been configured."] = "Zeigt Besuchern der Homepage eine Anmeldemaske, falls keine anderen Inhalte konfiguriert wurden.";
App::$strings["Enable context help"] = "Kontext-Hilfe aktivieren";
App::$strings["Display contextual help for the current page when the help button is pressed."] = "Zeigt Kontext-sensitive Hilfe für die aktuelle Seite an, wenn der Hilfe-Knopf geklickt wird.";
+App::$strings["Reply-to email address for system generated email."] = "Antwortadresse (reply-to) für Emails, die vom System generiert wurden.";
+App::$strings["Sender (From) email address for system generated email."] = "Absenderadresse (from) für Emails, die vom System generiert wurden.";
+App::$strings["Name of email sender for system generated email."] = "Name des Versenders von Emails, die vom System generiert wurden.";
App::$strings["Directory Server URL"] = "Verzeichnisserver-URL";
App::$strings["Default directory server"] = "Standard-Verzeichnisserver";
App::$strings["Proxy user"] = "Proxy Benutzer";
@@ -516,121 +550,486 @@ App::$strings["Maximum Load Average"] = "Maximales Load Average";
App::$strings["Maximum system load before delivery and poll processes are deferred - default 50."] = "Maximale Systemlast, bevor Verteil- und Empfangsprozesse verschoben werden – Standard 50";
App::$strings["Expiration period in days for imported (grid/network) content"] = "Setze den Zeitraum (in Tagen), ab wann importierte (aus dem Netzwerk) Inhalte ablaufen sollen";
App::$strings["0 for no expiration of imported content"] = "0 = keine Löschung importierter Inhalte";
-App::$strings["Plugin %s disabled."] = "Plug-In %s deaktiviert.";
-App::$strings["Plugin %s enabled."] = "Plug-In %s aktiviert.";
-App::$strings["Plugins"] = "Plug-Ins";
-App::$strings["Minimum project version: "] = "Minimale Version des Projekts:";
-App::$strings["Maximum project version: "] = "Maximale Version des Projekts:";
-App::$strings["Minimum PHP version: "] = "Minimale PHP Version:";
-App::$strings["Compatible Server Roles: "] = "Kompatible Serverrollen: ";
-App::$strings["Requires: "] = "Benötigt:";
-App::$strings["Disabled - version incompatibility"] = "Abgeschaltet - Versionsinkompatibilität";
-App::$strings["Enter the public git repository URL of the plugin repo."] = "Gib die öffentliche Git-Repository-URL des Plugin-Repository an.";
-App::$strings["Plugin repo git URL"] = "Plugin-Repository Git URL";
-App::$strings["Custom repo name"] = "Benutzerdefinierter Repository-Name";
-App::$strings["(optional)"] = "(optional)";
-App::$strings["Download Plugin Repo"] = "Plugin-Repository herunterladen";
-App::$strings["Install new repo"] = "Neues Repository installieren";
-App::$strings["Install"] = "Installieren";
-App::$strings["Cancel"] = "Abbrechen";
-App::$strings["Manage Repos"] = "Repositorien verwalten";
-App::$strings["Installed Plugin Repositories"] = "Installierte Plugin-Repositorien";
-App::$strings["Install a New Plugin Repository"] = "Ein neues Plugin-Repository installieren";
-App::$strings["Update"] = "Aktualisieren";
-App::$strings["Switch branch"] = "Zweig/Branch wechseln";
-App::$strings["Queue Statistics"] = "Warteschlangenstatistiken";
-App::$strings["Total Entries"] = "Einträge insgesamt";
-App::$strings["Priority"] = "Priorität";
-App::$strings["Destination URL"] = "Ziel-URL";
-App::$strings["Mark hub permanently offline"] = "Hub als permanent offline markieren";
-App::$strings["Empty queue for this hub"] = "Warteschlange für diesen Hub leeren";
-App::$strings["Last known contact"] = "Letzter Kontakt";
-App::$strings["Items tagged with: %s"] = "Beiträge mit Schlagwort: %s";
-App::$strings["Search results for: %s"] = "Suchergebnisse für: %s";
-App::$strings["Layout Name"] = "Layout-Name";
-App::$strings["Layout Description (Optional)"] = "Layout-Beschreibung (optional)";
-App::$strings["Edit Layout"] = "Layout bearbeiten";
-App::$strings["Page link"] = "Seiten-Link";
-App::$strings["Edit Webpage"] = "Webseite bearbeiten";
-App::$strings["Like/Dislike"] = "Mögen/Nicht mögen";
-App::$strings["This action is restricted to members."] = "Diese Aktion kann nur von Mitgliedern ausgeführt werden.";
-App::$strings["Please <a href=\"rmagic\">login with your \$Projectname ID</a> or <a href=\"register\">register as a new \$Projectname member</a> to continue."] = "Um fortzufahren <a href=\"rmagic\">melde Dich bitte mit Deiner \$Projectname-ID an</a> oder <a href=\"register\">registriere Dich als neues \$Projectname-Mitglied</a>.";
-App::$strings["Invalid request."] = "Ungültige Anfrage.";
-App::$strings["channel"] = "Kanal";
-App::$strings["thing"] = "Sache";
-App::$strings["Channel unavailable."] = "Kanal nicht vorhanden.";
-App::$strings["Previous action reversed."] = "Die vorherige Aktion wurde rückgängig gemacht.";
-App::$strings["photo"] = "Foto";
-App::$strings["status"] = "Status";
-App::$strings["event"] = "Termin";
-App::$strings["%1\$s likes %2\$s's %3\$s"] = "%1\$s gefällt %2\$ss %3\$s";
-App::$strings["%1\$s doesn't like %2\$s's %3\$s"] = "%1\$s gefällt %2\$ss %3\$s nicht";
-App::$strings["%1\$s agrees with %2\$s's %3\$s"] = "%1\$s stimmt %2\$ss %3\$s zu";
-App::$strings["%1\$s doesn't agree with %2\$s's %3\$s"] = "%1\$s lehnt %2\$ss %3\$s ab";
-App::$strings["%1\$s abstains from a decision on %2\$s's %3\$s"] = "%1\$s enthält sich zu %2\$ss %3\$s";
-App::$strings["%1\$s is attending %2\$s's %3\$s"] = "%1\$s nimmt an %2\$ss %3\$s teil";
-App::$strings["%1\$s is not attending %2\$s's %3\$s"] = "%1\$s nimmt an %2\$ss %3\$s nicht teil";
-App::$strings["%1\$s may attend %2\$s's %3\$s"] = "%1\$s nimmt vielleicht an %2\$ss %3\$s teil";
-App::$strings["Action completed."] = "Aktion durchgeführt.";
-App::$strings["Thank you."] = "Vielen Dank.";
-App::$strings["This site is not a directory server"] = "Diese Webseite ist kein Verzeichnisserver";
-App::$strings["This directory server requires an access token"] = "Dieser Verzeichnisserver benötigt einen Zugriffstoken";
-App::$strings["No such group"] = "Gruppe nicht gefunden";
-App::$strings["No such channel"] = "Kanal nicht gefunden";
-App::$strings["forum"] = "Forum";
-App::$strings["Search Results For:"] = "Suchergebnisse für:";
-App::$strings["Privacy group is empty"] = "Gruppe ist leer";
-App::$strings["Privacy group: "] = "Gruppe:";
-App::$strings["Invalid connection."] = "Ungültige Verbindung.";
-App::$strings["Unable to update menu."] = "Kann Menü nicht aktualisieren.";
-App::$strings["Unable to create menu."] = "Kann Menü nicht erstellen.";
-App::$strings["Menu Name"] = "Name des Menüs";
-App::$strings["Unique name (not visible on webpage) - required"] = "Eindeutiger Name (nicht sichtbar auf der Webseite) – erforderlich";
-App::$strings["Menu Title"] = "Menütitel";
-App::$strings["Visible on webpage - leave empty for no title"] = "Sichtbar auf der Webseite – für keinen Titel leer lassen";
-App::$strings["Allow Bookmarks"] = "Lesezeichen erlauben";
-App::$strings["Menu may be used to store saved bookmarks"] = "Im Menü können gespeicherte Lesezeichen abgelegt werden";
-App::$strings["Submit and proceed"] = "Absenden und fortfahren";
-App::$strings["Menus"] = "Menüs";
-App::$strings["Drop"] = "Löschen";
-App::$strings["Created"] = "Erstellt";
-App::$strings["Edited"] = "Geändert";
-App::$strings["Bookmarks allowed"] = "Lesezeichen erlaubt";
-App::$strings["Delete this menu"] = "Lösche dieses Menü";
-App::$strings["Edit menu contents"] = "Bearbeite Menü Inhalte";
-App::$strings["Edit this menu"] = "Dieses Menü bearbeiten";
-App::$strings["Menu could not be deleted."] = "Menü konnte nicht gelöscht werden.";
-App::$strings["Menu not found."] = "Menü nicht gefunden";
-App::$strings["Edit Menu"] = "Menü bearbeiten";
-App::$strings["Add or remove entries to this menu"] = "Einträge zu diesem Menü hinzufügen oder entfernen";
-App::$strings["Menu name"] = "Menü Name";
-App::$strings["Must be unique, only seen by you"] = "Muss eindeutig sein, ist aber nur für Dich sichtbar";
-App::$strings["Menu title"] = "Menü Titel";
-App::$strings["Menu title as seen by others"] = "Menü Titel wie er von anderen gesehen wird";
-App::$strings["Allow bookmarks"] = "Erlaube Lesezeichen";
-App::$strings["Not found."] = "Nicht gefunden.";
-App::$strings["Location not found."] = "Klon nicht gefunden.";
-App::$strings["Location lookup failed."] = "Nachschlagen des Kanal-Ortes fehlgeschlagen";
-App::$strings["Please select another location to become primary before removing the primary location."] = "Bitte mache einen anderen Kanal-Ort zum primären Ort, bevor Du den primären Ort löschst.";
-App::$strings["Syncing locations"] = "Synchronisiere Klone";
-App::$strings["No locations found."] = "Keine Klon-Adressen gefunden.";
-App::$strings["Manage Channel Locations"] = "Klon-Adressen verwalten";
-App::$strings["Location"] = "Ort";
-App::$strings["Primary"] = "Primär";
-App::$strings["Sync Now"] = "Jetzt synchronisieren";
-App::$strings["Please wait several minutes between consecutive operations."] = "Bitte warte mehrere Minuten zwischen dem Ausführen zweier Operationen!";
-App::$strings["When possible, drop a location by logging into that website/hub and removing your channel."] = "Wenn möglich, lösche einen Klon, indem Du Dich auf dem jeweiligen Hub einloggst und den Kanal dort löschst.";
-App::$strings["Use this form to drop the location if the hub is no longer operating."] = "Benutze dieses Formular zum Löschen eines Klons, wenn es den Hub nicht mehr gibt.";
-App::$strings["Public Hubs"] = "Öffentliche Hubs";
-App::$strings["The listed hubs allow public registration for the \$Projectname network. All hubs in the network are interlinked so membership on any of them conveys membership in the network as a whole. Some hubs may require subscription or provide tiered service plans. The hub itself <strong>may</strong> provide additional details."] = "Die hier aufgeführten Hubs sind öffentlich und erlauben die Registrierung im \$Projectname Netzwerk. Alle Hubs dieses Netzwerks sind miteinander verbunden, so dass die Mitgliedschaft auf einem Hub die Verbindung zu beliebigen Seiten und Kanälen auf anderen Hubs ermöglicht. Es könnte sein, dass einige dieser Hubs kostenpflichtig sind oder abgestufte, je nach Umfang kostenpflichtige Mitgliedschaften anbieten. Auf den Seiten der einzelnen Hubs <strong>könnten</strong> jeweils nähere Informationen dazu stehen.";
-App::$strings["Hub URL"] = "Hub-URL";
-App::$strings["Access Type"] = "Zugriffstyp";
-App::$strings["Registration Policy"] = "Registrierungsrichtlinien";
-App::$strings["Stats"] = "Statistiken";
-App::$strings["Software"] = "Software";
-App::$strings["Ratings"] = "Bewertungen";
-App::$strings["Rate"] = "Bewerten";
-App::$strings["View"] = "Ansicht";
+App::$strings["New Profile Field"] = "Neues Profilfeld";
+App::$strings["Field nickname"] = "Kurzname für das Feld";
+App::$strings["System name of field"] = "Systemname des Feldes";
+App::$strings["Input type"] = "Art des Inhalts";
+App::$strings["Field Name"] = "Feldname";
+App::$strings["Label on profile pages"] = "Bezeichnung auf Profilseiten";
+App::$strings["Help text"] = "Hilfetext";
+App::$strings["Additional info (optional)"] = "Zusätzliche Informationen (optional)";
+App::$strings["Save"] = "Speichern";
+App::$strings["Field definition not found"] = "Feld-Definition nicht gefunden";
+App::$strings["Edit Profile Field"] = "Profilfeld bearbeiten";
+App::$strings["Profile Fields"] = "Profil Felder";
+App::$strings["Basic Profile Fields"] = "Notwendige Profil Felder";
+App::$strings["Advanced Profile Fields"] = "Erweiterte Profil Felder";
+App::$strings["(In addition to basic fields)"] = "(zusätzlich zu notwendige Felder)";
+App::$strings["All available fields"] = "Alle verfügbaren Felder";
+App::$strings["Custom Fields"] = "Benutzerdefinierte Felder";
+App::$strings["Create Custom Field"] = "Erstelle benutzerdefiniertes Feld";
+App::$strings["Password changed for account %d."] = "Passwort für Konto %d geändert.";
+App::$strings["Account settings updated."] = "Kontoeinstellungen aktualisiert.";
+App::$strings["Account not found."] = "Konto nicht gefunden.";
+App::$strings["Account Edit"] = "Kontobearbeitung";
+App::$strings["New Password"] = "Neues Passwort";
+App::$strings["New Password again"] = "Neues Passwort wiederholen";
+App::$strings["Technical skill level"] = "Technische Qualifikationsstufe";
+App::$strings["Account language (for emails)"] = "Kontosprache (für E-Mails)";
+App::$strings["Service class"] = "Dienstklasse";
+App::$strings["By default, unfiltered HTML is allowed in embedded media. This is inherently insecure."] = "Standardmäßig wird ungefiltertes HTML in eingebetteten Inhalten zugelassen. Das ist prinzipiell unsicher.";
+App::$strings["The recommended setting is to only allow unfiltered HTML from the following sites:"] = "Die empfohlene Einstellung ist, ungefiltertes HTML nur von den nachfolgenden Webseiten zu erlauben:";
+App::$strings["https://youtube.com/<br />https://www.youtube.com/<br />https://youtu.be/<br />https://vimeo.com/<br />https://soundcloud.com/<br />"] = "https://youtube.com/<br />https://www.youtube.com/<br />https://youtu.be/<br />https://vimeo.com/<br />https://soundcloud.com/<br />";
+App::$strings["All other embedded content will be filtered, <strong>unless</strong> embedded content from that site is explicitly blocked."] = "Alle anderen eingebetteten Inhalte werden gefiltert, <strong>es sei denn</strong>, eingebettete Inhalte von einer bestimmten Seite sind explizit blockiert.";
+App::$strings["Security"] = "Sicherheit";
+App::$strings["Block public"] = "Öffentlichen Zugriff blockieren";
+App::$strings["Check to block public access to all otherwise public personal pages on this site unless you are currently authenticated."] = "Blockiere den öffentlichen Zugriff auf alle ansonsten öffentlichen persönlichen Seiten dieser Website, sofern ein Besucher nicht angemeldet ist.";
+App::$strings["Set \"Transport Security\" HTTP header"] = "Setze den \"Transport Security\" HTTP Header";
+App::$strings["Set \"Content Security Policy\" HTTP header"] = "Setze den \"Content Security Policy\" HTTP Header";
+App::$strings["Allowed email domains"] = "Erlaubte Domains für E-Mails";
+App::$strings["Comma separated list of domains which are allowed in email addresses for registrations to this site. Wildcards are accepted. Empty to allow any domains"] = "Liste der Domains, die für E-Mail-Adressen bei der Registrierung erlaubt sind, durch Kommas getrennt. Platzhalter werden akzeptiert. Leer lassen, um alle Domains zu erlauben.";
+App::$strings["Not allowed email domains"] = "Nicht erlaubte Domains für E-Mails";
+App::$strings["Comma separated list of domains which are not allowed in email addresses for registrations to this site. Wildcards are accepted. Empty to allow any domains, unless allowed domains have been defined."] = "Domains in E-Mail-Adressen, die keine Erlaubnis erhalten, sich auf Deinem Hub zu registrieren. Mehrere Domains können durch Kommas getrennt werden. Platzhalter (*/?) sind möglich. Keine Eingabe bedeutet keine Einschränkung, unabhängig davon, ob unter erlaubte Domains etwas eingegeben wurde.";
+App::$strings["Allow communications only from these sites"] = "Kommunikation nur von diesen Servern/Domains erlauben";
+App::$strings["One site per line. Leave empty to allow communication from anywhere by default"] = "Ein Eintrag pro Zeile. Lasse das Feld leer, um Kommunikation grundlegend von überall her zu erlauben.";
+App::$strings["Block communications from these sites"] = "Kommunikation von diesen Servern/Domains blockieren";
+App::$strings["Allow communications only from these channels"] = "Kommunikation nur von diesen Kanälen erlauben";
+App::$strings["One channel (hash) per line. Leave empty to allow from any channel by default"] = "Ein Kanal (hash) pro Zeile. Leerlassen um jeden Kanal zuzulassen. ";
+App::$strings["Block communications from these channels"] = "Kommunikation von folgenden Kanälen blockieren";
+App::$strings["Only allow embeds from secure (SSL) websites and links."] = "Erlaube Einbettungen nur von sicheren (SSL) Webseiten und Links.";
+App::$strings["Allow unfiltered embedded HTML content only from these domains"] = "Erlaube Einbettung von Inhalten mit ungefiltertem HTML nur von diesen Domains";
+App::$strings["One site per line. By default embedded content is filtered."] = "Eine Website/Domain pro Zeile. Standardmäßig wird eingebetteter Inhalt gefiltert.";
+App::$strings["Block embedded HTML from these domains"] = "Eingebettete HTML Inhalte von diesen Servern/Domains blockieren";
+App::$strings["Remote privacy information not available."] = "Privatsphäre-Einstellungen anderer Nutzer sind nicht verfügbar.";
+App::$strings["Visible to:"] = "Sichtbar für:";
+App::$strings["__ctx:acl__ Profile"] = "Profil";
+App::$strings["Permission category saved."] = "Berechtigungsrolle gespeichert.";
+App::$strings["Use this form to create permission rules for various classes of people or connections."] = "Verwende dieses Formular, um Berechtigungsrollen für verschiedene Gruppen von Personen oder Verbindungen zu erstellen.";
+App::$strings["Permission Categories"] = "Berechtigungsrollen";
+App::$strings["Permission Name"] = "Name der Berechtigungsrolle";
+App::$strings["My Settings"] = "Meine Einstellungen";
+App::$strings["inherited"] = "geerbt";
+App::$strings["Individual Permissions"] = "Individuelle Zugriffsrechte";
+App::$strings["Some permissions may be inherited from your channel's <a href=\"settings\"><strong>privacy settings</strong></a>, which have higher priority than individual settings. You can <strong>not</strong> change those settings here."] = "Einige Berechtigungen werden möglicherweise von den globalen <a href=\"settings\">Sicherheits- und Privatsphäre-Einstellungen</a> dieses Kanals vererbt. Diese haben eine höhere Priorität als die Einstellungen an der Verbindung und können hier nicht verändert werden.";
+App::$strings["Friends"] = "Freunde";
+App::$strings["Settings updated."] = "Einstellungen aktualisiert.";
+App::$strings["Nobody except yourself"] = "Niemand außer Dir selbst";
+App::$strings["Only those you specifically allow"] = "Nur die, denen Du es explizit erlaubst";
+App::$strings["Approved connections"] = "Angenommene Verbindungen";
+App::$strings["Any connections"] = "Beliebige Verbindungen";
+App::$strings["Anybody on this website"] = "Jeder auf dieser Website";
+App::$strings["Anybody in this network"] = "Alle \$Projectname-Mitglieder";
+App::$strings["Anybody authenticated"] = "Jeder authentifizierte";
+App::$strings["Anybody on the internet"] = "Jeder im Internet";
+App::$strings["Publish your default profile in the network directory"] = "Standard-Profil im Netzwerk-Verzeichnis veröffentlichen";
+App::$strings["Allow us to suggest you as a potential friend to new members?"] = "Dürfen wir Dich neuen Mitgliedern als potentiellen Kontakt vorschlagen?";
+App::$strings["or"] = "oder";
+App::$strings["Your channel address is"] = "Deine Kanal-Adresse lautet";
+App::$strings["Your files/photos are accessible via WebDAV at"] = "Deine Dateien/Fotos sind via WebDAV verfügbar auf";
+App::$strings["Channel Settings"] = "Kanal-Einstellungen";
+App::$strings["Basic Settings"] = "Grundeinstellungen";
+App::$strings["Full Name:"] = "Voller Name:";
+App::$strings["Email Address:"] = "Email Adresse:";
+App::$strings["Your Timezone:"] = "Ihre Zeitzone:";
+App::$strings["Default Post Location:"] = "Standardstandort:";
+App::$strings["Geographical location to display on your posts"] = "Geografischer Ort, der bei Deinen Beiträgen angezeigt werden soll";
+App::$strings["Use Browser Location:"] = "Standort des Browsers verwenden:";
+App::$strings["Adult Content"] = "Nicht jugendfreie Inhalte";
+App::$strings["This channel frequently or regularly publishes adult content. (Please tag any adult material and/or nudity with #NSFW)"] = "Dieser Kanal veröffentlicht regelmäßig Inhalte, die für Minderjährige ungeeignet sind. (Bitte markiere solche Inhalte mit dem Schlagwort #NSFW)";
+App::$strings["Security and Privacy Settings"] = "Sicherheits- und Datenschutz-Einstellungen";
+App::$strings["Your permissions are already configured. Click to view/adjust"] = "Deine Zugriffsrechte sind schon konfiguriert. Klicke hier, um sie zu betrachten oder zu ändern";
+App::$strings["Hide my online presence"] = "Meine Online-Präsenz verbergen";
+App::$strings["Prevents displaying in your profile that you are online"] = "Verhindert die Anzeige Deines Online-Status in deinem Profil";
+App::$strings["Simple Privacy Settings:"] = "Einfache Privatsphäre-Einstellungen";
+App::$strings["Very Public - <em>extremely permissive (should be used with caution)</em>"] = "Komplett offen – <em>extrem ungeschützt (mit großer Vorsicht verwenden!)</em>";
+App::$strings["Typical - <em>default public, privacy when desired (similar to social network permissions but with improved privacy)</em>"] = "Typisch – <em>Standard öffentlich, Privatsphäre, wo sie erwünscht ist (ähnlich den Einstellungen in sozialen Netzwerken, aber mit besser geschützter Privatsphäre)</em>";
+App::$strings["Private - <em>default private, never open or public</em>"] = "Privat – <em>Standard privat, nie offen oder öffentlich</em>";
+App::$strings["Blocked - <em>default blocked to/from everybody</em>"] = "Blockiert – <em>Alle standardmäßig blockiert</em>";
+App::$strings["Allow others to tag your posts"] = "Erlaube anderen, Deine Beiträge zu verschlagworten";
+App::$strings["Often used by the community to retro-actively flag inappropriate content"] = "Wird oft von der Community genutzt um rückwirkend anstößigen Inhalt zu markieren";
+App::$strings["Channel Permission Limits"] = "Kanal-Berechtigungslimits";
+App::$strings["Expire other channel content after this many days"] = "Den Inhalt anderer Kanäle nach dieser Anzahl Tage verfallen lassen";
+App::$strings["0 or blank to use the website limit."] = "0 oder leer lassen, um den voreingestellten Wert der Webseite zu verwenden.";
+App::$strings["This website expires after %d days."] = "Diese Webseite läuft nach %d Tagen ab.";
+App::$strings["This website does not expire imported content."] = "Diese Webseite lässt importierte Inhalte nicht verfallen.";
+App::$strings["The website limit takes precedence if lower than your limit."] = "Das Verfallslimit der Webseite hat Vorrang, wenn es niedriger als Deines hier ist.";
+App::$strings["Maximum Friend Requests/Day:"] = "Maximale Kontaktanfragen pro Tag:";
+App::$strings["May reduce spam activity"] = "Kann die Spam-Aktivität verringern";
+App::$strings["Default Access Control List (ACL)"] = "Standard-Zugriffsberechtigungsliste (ACL)";
+App::$strings["Use my default audience setting for the type of object published"] = "Verwende Deine eingestellte Standard-Zielgruppe des jeweiligen Inhaltstyps";
+App::$strings["Channel permissions category:"] = "Zugriffsrechte-Kategorie des Kanals:";
+App::$strings["Default Permissions Group"] = "Standard-Berechtigungsgruppe";
+App::$strings["Maximum private messages per day from unknown people:"] = "Maximale Anzahl privater Nachrichten pro Tag von unbekannten Leuten:";
+App::$strings["Useful to reduce spamming"] = "Nützlich, um Spam zu verringern";
+App::$strings["Notification Settings"] = "Benachrichtigungs-Einstellungen";
+App::$strings["By default post a status message when:"] = "Sende standardmäßig Status-Nachrichten, wenn:";
+App::$strings["accepting a friend request"] = "Du eine Verbindungsanfrage annimmst";
+App::$strings["joining a forum/community"] = "Du einem Forum beitrittst";
+App::$strings["making an <em>interesting</em> profile change"] = "Du eine <em>interessante</em> Änderung an Deinem Profil vornimmst";
+App::$strings["Send a notification email when:"] = "Eine E-Mail-Benachrichtigung senden, wenn:";
+App::$strings["You receive a connection request"] = "Du eine Verbindungsanfrage erhältst";
+App::$strings["Your connections are confirmed"] = "Eine Verbindung bestätigt wurde";
+App::$strings["Someone writes on your profile wall"] = "Jemand auf Deine Pinnwand schreibt";
+App::$strings["Someone writes a followup comment"] = "Jemand einen Beitrag kommentiert";
+App::$strings["You receive a private message"] = "Du eine private Nachricht erhältst";
+App::$strings["You receive a friend suggestion"] = "Du einen Kontaktvorschlag erhältst";
+App::$strings["You are tagged in a post"] = "Du in einem Beitrag erwähnt wurdest";
+App::$strings["You are poked/prodded/etc. in a post"] = "Du in einem Beitrag angestupst/geknufft/o.ä. wurdest";
+App::$strings["Someone likes your post/comment"] = "Jemand mag Ihren Beitrag/Kommentar";
+App::$strings["Show visual notifications including:"] = "Visuelle Benachrichtigungen anzeigen für:";
+App::$strings["Unseen grid activity"] = "Ungesehene Netzwerk-Aktivität";
+App::$strings["Unseen channel activity"] = "Ungesehene Kanal-Aktivität";
+App::$strings["Unseen private messages"] = "Ungelesene persönliche Nachrichten";
+App::$strings["Recommended"] = "Empfohlen";
+App::$strings["Upcoming events"] = "Baldige Termine";
+App::$strings["Events today"] = "Heutige Termine";
+App::$strings["Upcoming birthdays"] = "Baldige Geburtstage";
+App::$strings["Not available in all themes"] = "Nicht in allen Themes verfügbar";
+App::$strings["System (personal) notifications"] = "System – (persönliche) Benachrichtigungen";
+App::$strings["System info messages"] = "System – Info-Nachrichten";
+App::$strings["System critical alerts"] = "System – kritische Warnungen";
+App::$strings["New connections"] = "Neue Verbindungen";
+App::$strings["System Registrations"] = "System – Registrierungen";
+App::$strings["Also show new wall posts, private messages and connections under Notices"] = "Neue Pinnwand-Nachrichten, private Nachrichten und Verbindungen unter Benachrichtigungen anzeigen";
+App::$strings["Notify me of events this many days in advance"] = "Benachrichtige mich zu Terminen so viele Tage im Voraus";
+App::$strings["Must be greater than 0"] = "Muss größer als 0 sein";
+App::$strings["Advanced Account/Page Type Settings"] = "Erweiterte Account- und Seitenart-Einstellungen";
+App::$strings["Change the behaviour of this account for special situations"] = "Ändere das Verhalten dieses Accounts unter speziellen Umständen";
+App::$strings["Miscellaneous Settings"] = "Sonstige Einstellungen";
+App::$strings["Default photo upload folder"] = "Voreingestellter Ordner für hochgeladene Fotos";
+App::$strings["%Y - current year, %m - current month"] = "%Y - aktuelles Jahr, %m - aktueller Monat";
+App::$strings["Default file upload folder"] = "Voreingestellter Ordner für hochgeladene Dateien";
+App::$strings["Personal menu to display in your channel pages"] = "Eigenes Menü zur Anzeige auf den Seiten deines Kanals";
+App::$strings["Remove this channel."] = "Diesen Kanal löschen";
+App::$strings["Firefox Share \$Projectname provider"] = "\$Projectname-Provider für Firefox Share";
+App::$strings["Start calendar week on Monday"] = "Beginne die kalendarische Woche am Montag";
+App::$strings["Additional Features"] = "Zusätzliche Funktionen";
+App::$strings["This channel is limited to %d tokens"] = "Dieser Kanal ist auf %d Token begrenzt";
+App::$strings["Name and Password are required."] = "Name und Passwort sind erforderlich.";
+App::$strings["Token saved."] = "Token gespeichert.";
+App::$strings["Use this form to create temporary access identifiers to share things with non-members. These identities may be used in Access Control Lists and visitors may login using these credentials to access private content."] = "Mit diesem Formular kannst Du temporäre Zugangs-IDs anlegen, um Inhalte mit Nicht-Mitgliedern zu teilen. Die IDs können in Berechtigungslisten (ACLs) verwendet werden, und Besucher können sich damit einloggen, um auf private Inhalte zuzugreifen.";
+App::$strings["You may also provide <em>dropbox</em> style access links to friends and associates by adding the Login Password to any specific site URL as shown. Examples:"] = "Du kannst auch <em>Dropbox</em>-ähnliche Zugriffslinks an Andere weitergeben, indem du das Login-Passwort an eine entsprechende URL anhängst wie nachfolgend gezeigt. Beispiele:";
+App::$strings["Guest Access Tokens"] = "Gastzugangstoken";
+App::$strings["Login Name"] = "Anmeldename";
+App::$strings["Login Password"] = "Anmeldepasswort";
+App::$strings["Expires (yyyy-mm-dd)"] = "Läuft ab (jjjj-mm-tt)";
+App::$strings["Their Settings"] = "Deren Einstellungen";
+App::$strings["Not valid email."] = "Keine gültige E-Mail Adresse.";
+App::$strings["Protected email address. Cannot change to that email."] = "Geschützte E-Mail Adresse. Diese kann nicht verändert werden.";
+App::$strings["System failure storing new email. Please try again."] = "Systemfehler während des Speicherns der neuen Mail. Bitte versuche es noch einmal.";
+App::$strings["Technical skill level updated"] = "Technische Qualifikationsstufe aktualisiert";
+App::$strings["Password verification failed."] = "Passwortüberprüfung fehlgeschlagen.";
+App::$strings["Passwords do not match. Password unchanged."] = "Kennwörter stimmen nicht überein. Kennwort nicht verändert.";
+App::$strings["Empty passwords are not allowed. Password unchanged."] = "Leere Kennwörter sind nicht erlaubt. Kennwort nicht verändert.";
+App::$strings["Password changed."] = "Kennwort geändert.";
+App::$strings["Password update failed. Please try again."] = "Kennwortänderung fehlgeschlagen. Bitte versuche es noch einmal.";
+App::$strings["Account Settings"] = "Konto-Einstellungen";
+App::$strings["Current Password"] = "Aktuelles Passwort";
+App::$strings["Enter New Password"] = "Gib ein neues Passwort ein";
+App::$strings["Confirm New Password"] = "Bestätige das neue Passwort";
+App::$strings["Leave password fields blank unless changing"] = "Lasse die Passwort-Felder leer, außer Du möchtest das Passwort ändern";
+App::$strings["Your technical skill level"] = "Deine technische Qualifikationsstufe";
+App::$strings["Used to provide a member experience matched to your comfort level"] = "Dies wird verwendet, um Dir eine Benutzererfahrung passend zu Deiner technischen Qualifikationsstufe zu bieten.";
+App::$strings["Remove Account"] = "Konto entfernen";
+App::$strings["Remove this account including all its channels"] = "Dieses Konto inklusive all seiner Kanäle löschen";
+App::$strings["Affinity Slider settings updated."] = "Die Beziehungsgrad-Schieberegler-Einstellungen wurden aktualisiert.";
+App::$strings["No feature settings configured"] = "Keine Funktions-Einstellungen konfiguriert";
+App::$strings["Default maximum affinity level"] = "Voreinstellung für maximalen Beziehungsgrad";
+App::$strings["Default minimum affinity level"] = "Voreinstellung für minimalen Beziehungsgrad";
+App::$strings["Affinity Slider Settings"] = "Beziehungsgrad-Schieberegler-Einstellungen";
+App::$strings["Feature/Addon Settings"] = "Funktions-/Addon-Einstellungen";
+App::$strings["No special theme for mobile devices"] = "Keine spezielle Theme für mobile Geräte";
+App::$strings["%s - (Experimental)"] = "%s – (experimentell)";
+App::$strings["Display Settings"] = "Anzeige-Einstellungen";
+App::$strings["Theme Settings"] = "Theme-Einstellungen";
+App::$strings["Custom Theme Settings"] = "Benutzerdefinierte Theme-Einstellungen";
+App::$strings["Content Settings"] = "Inhaltseinstellungen";
+App::$strings["Display Theme:"] = "Anzeige-Theme:";
+App::$strings["Select scheme"] = "Schema wählen";
+App::$strings["Mobile Theme:"] = "Mobile Theme:";
+App::$strings["Preload images before rendering the page"] = "Bilder im voraus laden, bevor die Seite angezeigt wird";
+App::$strings["The subjective page load time will be longer but the page will be ready when displayed"] = "Die empfundene Ladezeit wird sich erhöhen, aber dafür ist das Layout stabil, sobald eine Seite angezeigt wird";
+App::$strings["Enable user zoom on mobile devices"] = "Zoom auf Mobilgeräten aktivieren";
+App::$strings["Update browser every xx seconds"] = "Browser alle xx Sekunden aktualisieren";
+App::$strings["Minimum of 10 seconds, no maximum"] = "Minimum 10 Sekunden, kein Maximum";
+App::$strings["Maximum number of conversations to load at any time:"] = "Maximale Anzahl von Unterhaltungen, die auf einmal geladen werden sollen:";
+App::$strings["Maximum of 100 items"] = "Maximum: 100 Beiträge";
+App::$strings["Show emoticons (smilies) as images"] = "Emoticons (Smilies) als Bilder anzeigen";
+App::$strings["Manual conversation updates"] = "Manuelle Konversationsaktualisierung";
+App::$strings["Default is on, turning this off may increase screen jumping"] = "Voreinstellung ist An, dies abzuschalten kann das unerwartete Springen der Seitenanzeige erhöhen.";
+App::$strings["Link post titles to source"] = "Beitragstitel zum Originalbeitrag verlinken";
+App::$strings["System Page Layout Editor - (advanced)"] = "System-Seitenlayout-Editor (für Experten)";
+App::$strings["Use blog/list mode on channel page"] = "Blog-/Listenmodus auf der Kanalseite verwenden";
+App::$strings["(comments displayed separately)"] = "(Kommentare werden separat angezeigt)";
+App::$strings["Use blog/list mode on grid page"] = "Blog-/Listenmodus auf der Netzwerkseite verwenden";
+App::$strings["Channel page max height of content (in pixels)"] = "Maximale Höhe von Beitragsblöcken auf der Kanalseite (in Pixeln)";
+App::$strings["click to expand content exceeding this height"] = "Blöcke, deren Inhalt diese Höhe überschreitet, können per Klick vergrößert werden.";
+App::$strings["Grid page max height of content (in pixels)"] = "Maximale Höhe (in Pixel) des Inhalts der Netzwerkseite";
+App::$strings["Name is required"] = "Name ist erforderlich";
+App::$strings["Key and Secret are required"] = "Schlüssel und Geheimnis werden benötigt";
+App::$strings["Add application"] = "Anwendung hinzufügen";
+App::$strings["Name of application"] = "Name der Anwendung";
+App::$strings["Consumer Key"] = "Consumer Key";
+App::$strings["Automatically generated - change if desired. Max length 20"] = "Automatisch erzeugt – ändern, falls erwünscht. Maximale Länge 20";
+App::$strings["Consumer Secret"] = "Consumer Secret";
+App::$strings["Redirect"] = "Umleitung";
+App::$strings["Redirect URI - leave blank unless your application specifically requires this"] = "Umleitungs-URl – lasse das leer, solange Deine Anwendung es nicht explizit erfordert";
+App::$strings["Icon url"] = "Symbol-URL";
+App::$strings["Optional"] = "Optional";
+App::$strings["Application not found."] = "Die Anwendung wurde nicht gefunden.";
+App::$strings["Connected Apps"] = "Verbundene Apps";
+App::$strings["Client key starts with"] = "Client Key beginnt mit";
+App::$strings["No name"] = "Kein Name";
+App::$strings["Remove authorization"] = "Authorisierung aufheben";
+App::$strings["View Photo"] = "Foto ansehen";
+App::$strings["Unknown"] = "Unbekannt";
+App::$strings["Edit Album"] = "Album bearbeiten";
+App::$strings["Upload"] = "Hochladen";
+App::$strings["Some blurb about what to do when you're new here"] = "Ein Hinweis, was man tun kann, wenn man neu hier ist";
+App::$strings["Thing updated"] = "Sache aktualisiert";
+App::$strings["Object store: failed"] = "Speichern des Objekts fehlgeschlagen";
+App::$strings["Thing added"] = "Sache hinzugefügt";
+App::$strings["OBJ: %1\$s %2\$s %3\$s"] = "OBJ: %1\$s %2\$s %3\$s";
+App::$strings["Show Thing"] = "Sache anzeigen";
+App::$strings["item not found."] = "Eintrag nicht gefunden";
+App::$strings["Edit Thing"] = "Sache bearbeiten";
+App::$strings["Select a profile"] = "Wähle ein Profil";
+App::$strings["Post an activity"] = "Aktivitätsnachricht senden";
+App::$strings["Only sends to viewers of the applicable profile"] = "Nur an Betrachter des ausgewählten Profils senden";
+App::$strings["Name of thing e.g. something"] = "Name der Sache, z. B. irgendwas";
+App::$strings["URL of thing (optional)"] = "URL der Sache (optional)";
+App::$strings["URL for photo of thing (optional)"] = "URL eines Fotos der Sache (optional)";
+App::$strings["Permissions"] = "Berechtigungen";
+App::$strings["Add Thing to your Profile"] = "Die Sache Deinem Profil hinzufügen";
+App::$strings["No more system notifications."] = "Keine System-Benachrichtigungen mehr.";
+App::$strings["System Notifications"] = "System-Benachrichtigungen";
+App::$strings["Channel added."] = "Kanal hinzugefügt.";
+App::$strings["Your service plan only allows %d channels."] = "Dein Vertrag erlaubt nur %d Kanäle.";
+App::$strings["No channel. Import failed."] = "Kein Kanal. Import fehlgeschlagen.";
+App::$strings["Import completed."] = "Import abgeschlossen.";
+App::$strings["You must be logged in to use this feature."] = "Du musst angemeldet sein um diese Funktion zu nutzen.";
+App::$strings["Import Channel"] = "Kanal importieren";
+App::$strings["Use this form to import an existing channel from a different server/hub. You may retrieve the channel identity from the old server/hub via the network or provide an export file."] = "Verwende dieses Formular, um einen existierenden Kanal von einem anderen Hub zu importieren. Du kannst den Kanal direkt vom bisherigen Hub über das Netzwerk oder aus einer exportierten Sicherheitskopie importieren.";
+App::$strings["Or provide the old server/hub details"] = "Oder gib die Details Deines bisherigen \$Projectname-Hubs ein";
+App::$strings["Your old identity address (xyz@example.com)"] = "Bisherige Kanal-Adresse (xyz@example.com)";
+App::$strings["Your old login email address"] = "Deine alte Login-E-Mail-Adresse";
+App::$strings["Your old login password"] = "Dein altes Passwort";
+App::$strings["For either option, please choose whether to make this hub your new primary address, or whether your old location should continue this role. You will be able to post from either location, but only one can be marked as the primary location for files, photos, and media."] = "Egal, welche Option Du wählst – bitte lege fest, ob dieser Server die neue primäre Adresse dieses Kanals sein soll, oder ob der bisherige \$Projectname-Hub diese Rolle weiterhin wahrnimmt. Du kannst von beiden Servern aus posten, aber nur einer kann der primäre Ort Deiner Dateien, Fotos und Medien sein.";
+App::$strings["Make this hub my primary location"] = "Dieser $Pojectname-Hub ist mein primärer Hub.";
+App::$strings["Move this channel (disable all previous locations)"] = "Verschiebe diesen Kanal (deaktiviere alle vorherigen Adressen/Klone)";
+App::$strings["Import a few months of posts if possible (limited by available memory"] = "Importiere die Beiträge einiger Monate, sofern möglich (beschränkt durch verfügbaren Speicher)";
+App::$strings["This process may take several minutes to complete. Please submit the form only once and leave this page open until finished."] = "Dieser Vorgang kann einige Minuten dauern. Bitte sende das Formular nur einmal ab und lasse diese Seite bis zur Fertigstellung offen.";
+App::$strings["Authentication failed."] = "Authentifizierung fehlgeschlagen.";
+App::$strings["Remote Authentication"] = "Entfernte Authentifizierung";
+App::$strings["Enter your channel address (e.g. channel@example.com)"] = "Deine Kanal-Adresse (z. B. channel@example.com)";
+App::$strings["Authenticate"] = "Authentifizieren";
+App::$strings["Channel not found."] = "Kanal nicht gefunden.";
+App::$strings["Permissions denied."] = "Berechtigung verweigert.";
+App::$strings["Import"] = "Import";
+App::$strings["Authorize application connection"] = "Zugriff für die Anwendung autorisieren";
+App::$strings["Return to your app and insert this Security Code:"] = "Gehen Sie zu Ihrer App zurück und tragen Sie diesen Sicherheitscode ein:";
+App::$strings["Please login to continue."] = "Zum Weitermachen, bitte einloggen.";
+App::$strings["Do you want to authorize this application to access your posts and contacts, and/or create new posts for you?"] = "Möchtest Du dieser Anwendung erlauben, Deine Nachrichten und Kontakte abzurufen und/oder neue Nachrichten für Dich zu erstellen?";
+App::$strings["Item not available."] = "Element nicht verfügbar.";
+App::$strings["Insert web link"] = "Link einfügen";
+App::$strings["Title (optional)"] = "Titel (optional)";
+App::$strings["Edit Block"] = "Block bearbeiten";
+App::$strings["vcard"] = "VCard";
+App::$strings["Apps"] = "Apps";
+App::$strings["Manage apps"] = "Apps verwalten";
+App::$strings["Create new app"] = "Neue App erstellen";
+App::$strings["__ctx:mood__ %1\$s is %2\$s"] = "%1\$s ist %2\$s";
+App::$strings["Mood"] = "Laune";
+App::$strings["Set your current mood and tell your friends"] = "Wähle Deine aktuelle Stimmung und teile sie mit Deinen Freunden";
+App::$strings["Blocked"] = "Blockiert";
+App::$strings["Ignored"] = "Ignoriert";
+App::$strings["Hidden"] = "Versteckt";
+App::$strings["Archived"] = "Archiviert";
+App::$strings["New"] = "Neu";
+App::$strings["All"] = "Alle";
+App::$strings["New Connections"] = "Neue Verbindungen";
+App::$strings["Show pending (new) connections"] = "Ausstehende (neue) Verbindungsanfragen anzeigen";
+App::$strings["Show all connections"] = "Alle Verbindungen anzeigen";
+App::$strings["Only show blocked connections"] = "Nur blockierte Verbindungen anzeigen";
+App::$strings["Only show ignored connections"] = "Nur ignorierte Verbindungen anzeigen";
+App::$strings["Only show archived connections"] = "Nur archivierte Verbindungen anzeigen";
+App::$strings["Only show hidden connections"] = "Nur versteckte Verbindungen anzeigen";
+App::$strings["Pending approval"] = "Wartet auf Genehmigung";
+App::$strings["%1\$s [%2\$s]"] = "%1\$s [%2\$s]";
+App::$strings["Edit connection"] = "Verbindung bearbeiten";
+App::$strings["Delete connection"] = "Verbindung löschen";
+App::$strings["Channel address"] = "Kanaladresse";
+App::$strings["Network"] = "Netzwerk";
+App::$strings["Call"] = "Anruf";
+App::$strings["Status"] = "Status";
+App::$strings["Connected"] = "Verbunden";
+App::$strings["Approve connection"] = "Verbindung genehmigen";
+App::$strings["Ignore connection"] = "Verbindung ignorieren";
+App::$strings["Ignore"] = "Ignorieren";
+App::$strings["Recent activity"] = "Kürzliche Aktivitäten";
+App::$strings["Connections"] = "Verbindungen";
+App::$strings["Search your connections"] = "Verbindungen durchsuchen";
+App::$strings["Connections search"] = "Verbindung suchen";
+App::$strings["Find"] = "Finde";
+App::$strings["item"] = "";
+App::$strings["Source of Item"] = "Quelle des Elements";
+App::$strings["Bookmark added"] = "Lesezeichen hinzugefügt";
+App::$strings["My Bookmarks"] = "Meine Lesezeichen";
+App::$strings["My Connections Bookmarks"] = "Lesezeichen meiner Kontakte";
+App::$strings["Account removals are not allowed within 48 hours of changing the account password."] = "Das Löschen von Konten innerhalb 48 Stunden nachdem deren Passwort geändert wurde ist nicht erlaubt.";
+App::$strings["Remove This Account"] = "Dieses Konto löschen";
+App::$strings["This account and all its channels will be completely removed from the network. "] = "Dieses Konto mit all seinen Kanälen wird vollständig aus dem Netzwerk gelöscht.";
+App::$strings["Remove this account, all its channels and all its channel clones from the network"] = "Dieses Konto, all seine Kanäle sowie alle Kanal-Klone aus dem Netzwerk löschen";
+App::$strings["By default only the instances of the channels located on this hub will be removed from the network"] = "Standardmäßig werden nur die Kanalklone auf diesem \$Projectname-Hub aus dem Netzwerk entfernt";
+App::$strings["Page owner information could not be retrieved."] = "Informationen über den Besitzer der Seite konnten nicht gefunden werden.";
+App::$strings["Album not found."] = "Album nicht gefunden.";
+App::$strings["Delete Album"] = "Album löschen";
+App::$strings["Delete Photo"] = "Foto löschen";
+App::$strings["No photos selected"] = "Keine Fotos ausgewählt";
+App::$strings["Access to this item is restricted."] = "Der Zugriff auf dieses Foto ist eingeschränkt.";
+App::$strings["%1$.2f MB of %2$.2f MB photo storage used."] = "%1$.2f MB von %2$.2f MB Foto-Speicher belegt.";
+App::$strings["%1$.2f MB photo storage used."] = "%1$.2f MB Foto-Speicher belegt.";
+App::$strings["Upload Photos"] = "Fotos hochladen";
+App::$strings["Enter an album name"] = "Namen für ein neues Album eingeben";
+App::$strings["or select an existing album (doubleclick)"] = "oder ein bereits vorhandenes auswählen (Doppelklick)";
+App::$strings["Create a status post for this upload"] = "Einen Statusbeitrag für diesen Upload erzeugen";
+App::$strings["Caption (optional):"] = "Beschriftung (optional):";
+App::$strings["Description (optional):"] = "Beschreibung (optional):";
+App::$strings["Show Newest First"] = "Neueste zuerst anzeigen";
+App::$strings["Show Oldest First"] = "Älteste zuerst anzeigen";
+App::$strings["Permission denied. Access to this item may be restricted."] = "Berechtigung verweigert. Der Zugriff ist wahrscheinlich eingeschränkt worden.";
+App::$strings["Photo not available"] = "Foto nicht verfügbar";
+App::$strings["Use as profile photo"] = "Als Profilfoto verwenden";
+App::$strings["Use as cover photo"] = "Als Titelbild verwenden";
+App::$strings["Private Photo"] = "Privates Foto";
+App::$strings["View Full Size"] = "In voller Größe anzeigen";
+App::$strings["Edit photo"] = "Foto bearbeiten";
+App::$strings["Rotate CW (right)"] = "Drehen im UZS (rechts)";
+App::$strings["Rotate CCW (left)"] = "Drehen gegen UZS (links)";
+App::$strings["Move photo to album"] = "Foto in Album verschieben";
+App::$strings["Enter a new album name"] = "Gib einen Namen für ein neues Album ein";
+App::$strings["or select an existing one (doubleclick)"] = "oder wähle ein bereits vorhandenes aus (Doppelklick)";
+App::$strings["Caption"] = "Bildunterschrift";
+App::$strings["Add a Tag"] = "Schlagwort hinzufügen";
+App::$strings["Example: @bob, @Barbara_Jensen, @jim@example.com"] = "Beispiele: @ben, @Karl_Prester, @lieschen@example.com";
+App::$strings["Flag as adult in album view"] = "In der Albumansicht als nicht jugendfrei markieren";
+App::$strings["I like this (toggle)"] = "Mir gefällt das (Umschalter)";
+App::$strings["I don't like this (toggle)"] = "Mir gefällt das nicht (Umschalter)";
+App::$strings["Please wait"] = "Bitte warten";
+App::$strings["This is you"] = "Das bist Du";
+App::$strings["Comment"] = "Kommentar";
+App::$strings["__ctx:title__ Likes"] = "Gefällt mir";
+App::$strings["__ctx:title__ Dislikes"] = "Gefällt mir nicht";
+App::$strings["__ctx:title__ Agree"] = "Zustimmungen";
+App::$strings["__ctx:title__ Disagree"] = "Ablehnungen";
+App::$strings["__ctx:title__ Abstain"] = "Enthaltungen";
+App::$strings["__ctx:title__ Attending"] = "Zusagen";
+App::$strings["__ctx:title__ Not attending"] = "Absagen";
+App::$strings["__ctx:title__ Might attend"] = "Vielleicht";
+App::$strings["View all"] = "Alles anzeigen";
+App::$strings["__ctx:noun__ Like"] = array(
+ 0 => "Gefällt mir",
+ 1 => "Gefällt mir",
+);
+App::$strings["__ctx:noun__ Dislike"] = array(
+ 0 => "Gefällt nicht",
+ 1 => "Gefällt nicht",
+);
+App::$strings["Photo Tools"] = "Fotowerkzeuge";
+App::$strings["In This Photo:"] = "Auf diesem Foto:";
+App::$strings["Map"] = "Karte";
+App::$strings["__ctx:noun__ Likes"] = "Gefällt mir";
+App::$strings["__ctx:noun__ Dislikes"] = "Gefällt nicht";
+App::$strings["Close"] = "Schließen";
+App::$strings["Recent Photos"] = "Neueste Fotos";
+App::$strings["Profile Unavailable."] = "Profil nicht verfügbar.";
+App::$strings["Not found"] = "Nicht gefunden";
+App::$strings["Invalid channel"] = "Ungültiger Kanal";
+App::$strings["Wikis"] = "Wikis";
+App::$strings["Download"] = "Herunterladen";
+App::$strings["Create New"] = "Neu anlegen";
+App::$strings["Wiki name"] = "Name des Wiki";
+App::$strings["Content type"] = "Inhaltstyp";
+App::$strings["Type"] = "Typ";
+App::$strings["Create a status post for this wiki"] = "Erzeuge einen Statusbeitrag für dieses Wiki";
+App::$strings["Wiki not found"] = "Wiki nicht gefunden";
+App::$strings["Rename page"] = "Seite umbenennen";
+App::$strings["Error retrieving page content"] = "Fehler beim Abrufen des Seiteninhalts";
+App::$strings["New page"] = "Neue Seite";
+App::$strings["Revision Comparison"] = "Revisionsvergleich";
+App::$strings["Revert"] = "Rückgängig machen";
+App::$strings["Short description of your changes (optional)"] = "Kurze Beschreibung Ihrer Änderungen (optional)";
+App::$strings["Source"] = "Quelle";
+App::$strings["New page name"] = "Neuer Seitenname";
+App::$strings["Embed image from photo albums"] = "Bild aus Fotoalben einbetten";
+App::$strings["Embed an image from your albums"] = "Betten Sie ein Bild aus Ihren Alben ein";
+App::$strings["OK"] = "Ok";
+App::$strings["Choose images to embed"] = "Wählen Sie Bilder zum Einbetten aus";
+App::$strings["Choose an album"] = "Wählen Sie ein Album aus";
+App::$strings["Choose a different album"] = "Wählen Sie ein anderes Album aus";
+App::$strings["Error getting album list"] = "Fehler beim Holen der Albenliste";
+App::$strings["Error getting photo link"] = "Fehler beim Holen des Fotolinks";
+App::$strings["Error getting album"] = "Fehler beim Holen des Albums";
+App::$strings["Error creating wiki. Invalid name."] = "Fehler beim Erstellen des Wiki. Ungültiger Name.";
+App::$strings["A wiki with this name already exists."] = "Es existiert bereits ein Wiki mit diesem Namen.";
+App::$strings["Wiki created, but error creating Home page."] = "Das Wiki wurde erzeugt, aber es gab einen Fehler bei der Erstellung der Startseite";
+App::$strings["Error creating wiki"] = "Fehler beim Erstellen des Wiki";
+App::$strings["Wiki delete permission denied."] = "Wiki-Löschberechtigung verweigert.";
+App::$strings["Error deleting wiki"] = "Fehler beim Löschen des Wiki";
+App::$strings["New page created"] = "Neue Seite erstellt";
+App::$strings["Cannot delete Home"] = "Kann die Startseite nicht löschen";
+App::$strings["Current Revision"] = "Aktuelle Revision";
+App::$strings["Selected Revision"] = "Ausgewählte Revision";
+App::$strings["You must be authenticated."] = "Sie müssen authenzifiziert sein.";
+App::$strings["toggle full screen mode"] = "auf Vollbildmodus umschalten";
+App::$strings["Layout updated."] = "Layout aktualisiert.";
+App::$strings["Feature disabled."] = "Funktion deaktiviert.";
+App::$strings["Edit System Page Description"] = "Systemseitenbeschreibung bearbeiten";
+App::$strings["Layout not found."] = "Layout nicht gefunden.";
+App::$strings["Module Name:"] = "Modulname:";
+App::$strings["Layout Help"] = "Layout-Hilfe";
+App::$strings["Poke"] = "Anstupsen";
+App::$strings["Poke somebody"] = "Jemanden anstupsen";
+App::$strings["Poke/Prod"] = "Anstupsen/Knuffen";
+App::$strings["Poke, prod or do other things to somebody"] = "Jemanden anstupsen, knuffen oder sonstiges";
+App::$strings["Recipient"] = "Empfänger";
+App::$strings["Choose what you wish to do to recipient"] = "Wähle, was Du mit dem/r Empfänger/in tun willst";
+App::$strings["Make this post private"] = "Diesen Beitrag privat machen";
+App::$strings["Image uploaded but image cropping failed."] = "Bild hochgeladen, aber das Zurechtschneiden schlug fehl.";
+App::$strings["Profile Photos"] = "Profilfotos";
+App::$strings["Image resize failed."] = "Bild-Anpassung fehlgeschlagen.";
+App::$strings["Shift-reload the page or clear browser cache if the new photo does not display immediately."] = "Leere den Browser Cache oder nutze Umschalten-Neu Laden, falls das neue Foto nicht sofort angezeigt wird.";
+App::$strings["Unable to process image"] = "Kann Bild nicht verarbeiten";
+App::$strings["Image upload failed."] = "Hochladen des Bilds fehlgeschlagen.";
+App::$strings["Unable to process image."] = "Kann Bild nicht verarbeiten.";
+App::$strings["Photo not available."] = "Foto nicht verfügbar.";
+App::$strings["Upload File:"] = "Datei hochladen:";
+App::$strings["Select a profile:"] = "Wähle ein Profil:";
+App::$strings["Use Photo for Profile"] = "Foto für Profil verwenden";
+App::$strings["Upload Profile Photo"] = "Lade neues Profilfoto hoch";
+App::$strings["Use"] = "Verwenden";
+App::$strings["skip this step"] = "diesen Schritt überspringen";
+App::$strings["select a photo from your photo albums"] = "ein Foto aus meinen Fotoalben";
+App::$strings["Crop Image"] = "Bild zuschneiden";
+App::$strings["Please adjust the image cropping for optimum viewing."] = "Bitte schneide das Bild für eine optimale Anzeige passend zu.";
+App::$strings["Done Editing"] = "Bearbeitung fertigstellen";
+App::$strings["Away"] = "Abwesend";
+App::$strings["Online"] = "Online";
+App::$strings["Unable to locate original post."] = "Originalbeitrag nicht gefunden.";
+App::$strings["Empty post discarded."] = "Leeren Beitrag verworfen.";
+App::$strings["Duplicate post suppressed."] = "Doppelter Beitrag unterdrückt.";
+App::$strings["System error. Post not saved."] = "Systemfehler. Beitrag nicht gespeichert.";
+App::$strings["Unable to obtain post information from database."] = "Beitragsinformationen können nicht aus der Datenbank abgerufen werden.";
+App::$strings["You have reached your limit of %1$.0f top level posts."] = "Du hast die maximale Anzahl von %1$.0f Beiträgen erreicht.";
+App::$strings["You have reached your limit of %1$.0f webpages."] = "Du hast die maximale Anzahl von %1$.0f Webseiten erreicht.";
+App::$strings["sent you a private message"] = "hat Dir eine private Nachricht geschickt";
+App::$strings["added your channel"] = "hat deinen Kanal hinzugefügt";
+App::$strings["g A l F d"] = "l, d. F, G:i \\U\\h\\r";
+App::$strings["[today]"] = "[Heute]";
+App::$strings["posted an event"] = "hat einen Termin veröffentlicht";
+App::$strings["Invalid item."] = "Ungültiges Element.";
+App::$strings["Page not found."] = "Seite nicht gefunden.";
+App::$strings["Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."] = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";
App::$strings["Could not access contact record."] = "Konnte nicht auf den Kontakteintrag zugreifen.";
App::$strings["Could not locate selected profile."] = "Gewähltes Profil nicht gefunden.";
App::$strings["Connection updated."] = "Verbindung aktualisiert.";
@@ -643,7 +1042,9 @@ App::$strings["Connection has been removed."] = "Verbindung wurde gelöscht.";
App::$strings["View Profile"] = "Profil ansehen";
App::$strings["View %s's profile"] = "%ss Profil ansehen";
App::$strings["Refresh Permissions"] = "Zugriffsrechte neu laden";
-App::$strings["Fetch updated permissions"] = "Aktualisierte Zugriffsrechte abfragen";
+App::$strings["Fetch updated permissions"] = "Aktualisierte Zugriffsrechte abrufen";
+App::$strings["Refresh Photo"] = "Foto aktualisieren";
+App::$strings["Fetch updated photo"] = "Aktualisiertes Profilfoto abrufen";
App::$strings["Recent Activity"] = "Kürzliche Aktivitäten";
App::$strings["View recent posts and comments"] = "Betrachte die neuesten Beiträge und Kommentare";
App::$strings["Block (or Unblock) all communications with this connection"] = "Jegliche Kommunikation mit dieser Verbindung blockieren/zulassen";
@@ -660,12 +1061,13 @@ App::$strings["Hide"] = "Verstecken";
App::$strings["Hide or Unhide this connection from your other connections"] = "Diese Verbindung vor anderen Verbindungen verstecken/zeigen";
App::$strings["This connection is hidden!"] = "Die Verbindung ist versteckt!";
App::$strings["Delete this connection"] = "Verbindung löschen";
+App::$strings["Fetch Vcard"] = "Vcard abrufen";
+App::$strings["Fetch electronic calling card for this connection"] = "Rufe eine digitale Visitenkarte für diese Verbindung ab";
App::$strings["Open Individual Permissions section by default"] = "Öffne standardmäßig den Bereich für individuelle Berechtigungen";
App::$strings["Affinity"] = "Beziehung";
App::$strings["Open Set Affinity section by default"] = "Öffne standardmäßig den Bereich für Beziehungsgrad-Einstellungen";
App::$strings["Me"] = "Ich";
App::$strings["Family"] = "Familie";
-App::$strings["Friends"] = "Freunde";
App::$strings["Acquaintances"] = "Bekannte";
App::$strings["Filter"] = "Filter";
App::$strings["Open Custom Filter section by default"] = "Öffne standardmäßig den Bereich für benutzerdefinierte Filter";
@@ -695,12 +1097,7 @@ App::$strings["words one per line or #tags or /patterns/ or lang=xx, leave blank
App::$strings["Do not import posts with this text"] = "Beiträge mit diesem Text nicht importieren";
App::$strings["This information is public!"] = "Diese Information ist öffentlich!";
App::$strings["Connection Pending Approval"] = "Verbindung wartet auf Bestätigung";
-App::$strings["inherited"] = "geerbt";
App::$strings["Please choose the profile you would like to display to %s when viewing your profile securely."] = "Bitte wähle ein Profil, das wir %s zeigen sollen, wenn Deine Profilseite über eine verifizierte Verbindung aufgerufen wird.";
-App::$strings["Their Settings"] = "Deren Einstellungen";
-App::$strings["My Settings"] = "Meine Einstellungen";
-App::$strings["Individual Permissions"] = "Individuelle Zugriffsrechte";
-App::$strings["Some permissions may be inherited from your channel's <a href=\"settings\"><strong>privacy settings</strong></a>, which have higher priority than individual settings. You can <strong>not</strong> change those settings here."] = "Einige Berechtigungen werden möglicherweise von den globalen <a href=\"settings\">Sicherheits- und Privatsphäre-Einstellungen</a> dieses Kanals vererbt. Diese haben eine höhere Priorität als die Einstellungen an der Verbindung und können hier nicht verändert werden.";
App::$strings["Some permissions may be inherited from your channel's <a href=\"settings\"><strong>privacy settings</strong></a>, which have higher priority than individual settings. You can change those settings here but they wont have any impact unless the inherited setting changes."] = "Einige Berechtigungen werden möglicherweise von den globalen <a href=\"settings\">Sicherheits- und Privatsphäre-Einstellungen</a> dieses Kanals geerbt. Diese haben eine höhere Priorität als die Einstellungen an der Verbindung. Werden geerbte Einstellungen hier geändert, hat dies keine Auswirkungen.";
App::$strings["Last update:"] = "Letzte Aktualisierung:";
App::$strings["Details"] = "Details";
@@ -722,29 +1119,56 @@ App::$strings["Locality"] = "Ortschaft";
App::$strings["Region"] = "Region";
App::$strings["ZIP Code"] = "Postleitzahl";
App::$strings["Country"] = "Land";
-App::$strings["\$Projectname"] = "\$Projectname";
-App::$strings["Welcome to %s"] = "Willkommen auf %s";
-App::$strings["Permission Denied."] = "Zugriff verweigert.";
-App::$strings["File not found."] = "Datei nicht gefunden.";
-App::$strings["Edit file permissions"] = "Dateiberechtigungen bearbeiten";
-App::$strings["Set/edit permissions"] = "Berechtigungen setzen/ändern";
-App::$strings["Include all files and sub folders"] = "Alle Dateien und Unterverzeichnisse einbinden";
-App::$strings["Return to file list"] = "Zurück zur Dateiliste";
-App::$strings["Copy/paste this code to attach file to a post"] = "Diesen Code kopieren und einfügen, um die Datei an einen Beitrag anzuhängen";
-App::$strings["Copy/paste this URL to link file from a web page"] = "Diese URL verwenden, um von einer Webseite aus auf die Datei zu verlinken";
-App::$strings["Share this file"] = "Diese Datei freigeben";
-App::$strings["Show URL to this file"] = "URL zu dieser Datei anzeigen";
-App::$strings["Notify your contacts about this file"] = "Meine Kontakte über diese Datei benachrichtigen";
+App::$strings["Room not found"] = "Chatraum nicht gefunden";
+App::$strings["Leave Room"] = "Raum verlassen";
+App::$strings["Delete Room"] = "Raum löschen";
+App::$strings["I am away right now"] = "Ich bin gerade nicht da";
+App::$strings["I am online"] = "Ich bin online";
+App::$strings["Bookmark this room"] = "Lesezeichen für diesen Raum setzen";
+App::$strings["Please enter a link URL:"] = "Gib eine URL ein:";
+App::$strings["Encrypt text"] = "Text verschlüsseln";
+App::$strings["New Chatroom"] = "Neuer Chatraum";
+App::$strings["Chatroom name"] = "Chatraumname";
+App::$strings["Expiration of chats (minutes)"] = "Verfall von Chats (Minuten)";
+App::$strings["%1\$s's Chatrooms"] = "%1\$ss Chaträume";
+App::$strings["No chatrooms available"] = "Keine Chaträume verfügbar";
+App::$strings["Expiration"] = "Verfall";
+App::$strings["min"] = "min";
App::$strings["Photos"] = "Fotos";
-App::$strings["Apps"] = "Apps";
-App::$strings["Permissions denied."] = "Berechtigung verweigert.";
-App::$strings["l, F j"] = "l, j. F";
-App::$strings["Link to Source"] = "Link zur Quelle";
-App::$strings["Edit Event"] = "Termin bearbeiten";
-App::$strings["Create Event"] = "Termin anlegen";
-App::$strings["Export"] = "Exportieren";
-App::$strings["Import"] = "Import";
-App::$strings["Today"] = "Heute";
+App::$strings["Files"] = "Dateien";
+App::$strings["Unable to update menu."] = "Kann Menü nicht aktualisieren.";
+App::$strings["Unable to create menu."] = "Kann Menü nicht erstellen.";
+App::$strings["Menu Name"] = "Name des Menüs";
+App::$strings["Unique name (not visible on webpage) - required"] = "Eindeutiger Name (nicht sichtbar auf der Webseite) – erforderlich";
+App::$strings["Menu Title"] = "Menütitel";
+App::$strings["Visible on webpage - leave empty for no title"] = "Sichtbar auf der Webseite – für keinen Titel leer lassen";
+App::$strings["Allow Bookmarks"] = "Lesezeichen erlauben";
+App::$strings["Menu may be used to store saved bookmarks"] = "Im Menü können gespeicherte Lesezeichen abgelegt werden";
+App::$strings["Submit and proceed"] = "Absenden und fortfahren";
+App::$strings["Menus"] = "Menüs";
+App::$strings["Bookmarks allowed"] = "Lesezeichen erlaubt";
+App::$strings["Delete this menu"] = "Lösche dieses Menü";
+App::$strings["Edit menu contents"] = "Bearbeite Menü Inhalte";
+App::$strings["Edit this menu"] = "Dieses Menü bearbeiten";
+App::$strings["Menu could not be deleted."] = "Menü konnte nicht gelöscht werden.";
+App::$strings["Edit Menu"] = "Menü bearbeiten";
+App::$strings["Add or remove entries to this menu"] = "Einträge zu diesem Menü hinzufügen oder entfernen";
+App::$strings["Menu name"] = "Menü Name";
+App::$strings["Must be unique, only seen by you"] = "Muss eindeutig sein, ist aber nur für Dich sichtbar";
+App::$strings["Menu title"] = "Menü Titel";
+App::$strings["Menu title as seen by others"] = "Menü Titel wie er von anderen gesehen wird";
+App::$strings["Allow bookmarks"] = "Erlaube Lesezeichen";
+App::$strings["Layouts"] = "Layouts";
+App::$strings["Help"] = "Hilfe";
+App::$strings["Comanche page description language help"] = "Hilfe zur Comanche-Seitenbeschreibungssprache";
+App::$strings["Layout Description"] = "Layout-Beschreibung";
+App::$strings["Download PDL file"] = "PDL-Datei herunterladen";
+App::$strings["post"] = "Beitrag";
+App::$strings["comment"] = "Kommentar";
+App::$strings["%1\$s tagged %2\$s's %3\$s with %4\$s"] = "%1\$s hat %2\$ss %3\$s mit %4\$s verschlagwortet";
+App::$strings["This setting requires special processing and editing has been blocked."] = "Diese Einstellung erfordert eine besondere Verarbeitung und ist blockiert.";
+App::$strings["Configuration Editor"] = "Konfigurationseditor";
+App::$strings["Warning: Changing some settings could render your channel inoperable. Please leave this page unless you are comfortable with and knowledgeable about how to correctly use this feature."] = "Warnung: Einige Einstellungen können Deinen Kanal funktionsunfähig machen. Bitte verlasse diese Seite, es sei denn Du bist vertraut damit, wie dieses Feature korrekt verwendet wird.";
App::$strings["Privacy group created."] = "Gruppe wurde erstellt.";
App::$strings["Could not create privacy group."] = "Gruppe konnte nicht erstellt werden.";
App::$strings["Privacy group not found."] = "Gruppe nicht gefunden.";
@@ -755,121 +1179,9 @@ App::$strings["Members are visible to other channels"] = "Mitglieder sind sichtb
App::$strings["Privacy group removed."] = "Gruppe wurde entfernt.";
App::$strings["Unable to remove privacy group."] = "Gruppe konnte nicht entfernt werden.";
App::$strings["Privacy group editor"] = "Gruppeneditor";
+App::$strings["Members"] = "Mitglieder";
App::$strings["All Connected Channels"] = "Alle verbundenen Kanäle";
App::$strings["Click on a channel to add or remove."] = "Wähle einen Kanal zum hinzufügen oder entfernen aus.";
-App::$strings["Invalid message"] = "Ungültige Beitrags-ID (mid)";
-App::$strings["no results"] = "keine Ergebnisse";
-App::$strings["channel sync processed"] = "Kanal-Sync verarbeitet";
-App::$strings["queued"] = "zur Warteschlange hinzugefügt";
-App::$strings["posted"] = "zugestellt";
-App::$strings["accepted for delivery"] = "für Zustellung akzeptiert";
-App::$strings["updated"] = "aktualisiert";
-App::$strings["update ignored"] = "Aktualisierung ignoriert";
-App::$strings["permission denied"] = "Zugriff verweigert";
-App::$strings["recipient not found"] = "Empfänger nicht gefunden.";
-App::$strings["mail recalled"] = "Mail widerrufen";
-App::$strings["duplicate mail received"] = "Doppelte Mail erhalten";
-App::$strings["mail delivered"] = "Mail zugestellt";
-App::$strings["Delivery report for %1\$s"] = "Zustellungsbericht für %1\$s";
-App::$strings["Options"] = "Optionen";
-App::$strings["Redeliver"] = "Erneut zustellen";
-App::$strings["webpage"] = "Webseite";
-App::$strings["block"] = "Block";
-App::$strings["layout"] = "Layout";
-App::$strings["menu"] = "Menü";
-App::$strings["%s element installed"] = "Element für %s installiert";
-App::$strings["%s element installation failed"] = "Installation des Elements %s fehlgeschlagen";
-App::$strings["Nothing to import."] = "Nichts zu importieren.";
-App::$strings["Unable to download data from old server"] = "Daten können vom alten Server nicht heruntergeladen werden";
-App::$strings["Imported file is empty."] = "Die importierte Datei ist leer.";
-App::$strings["Warning: Database versions differ by %1\$d updates."] = "Achtung: Datenbankversionen unterscheiden sich um %1\$d Aktualisierungen.";
-App::$strings["Import completed"] = "Import abgeschlossen";
-App::$strings["Import Items"] = "Beiträge importieren";
-App::$strings["Use this form to import existing posts and content from an export file."] = "Mit diesem Formular kannst Du existierende Beiträge und Inhalte aus einer Sicherungsdatei importieren.";
-App::$strings["File to Upload"] = "Hochzuladende Datei:";
-App::$strings["You have created %1$.0f of %2$.0f allowed channels."] = "Du hast %1$.0f von maximal %2$.0f erlaubten Kanälen eingerichtet.";
-App::$strings["Create a new channel"] = "Neuen Kanal anlegen";
-App::$strings["Create New"] = "Neu anlegen";
-App::$strings["Channel Manager"] = "Kanal-Manager";
-App::$strings["Current Channel"] = "Aktueller Kanal";
-App::$strings["Switch to one of your channels by selecting it."] = "Wechsle zu einem Deiner Kanäle, indem Du auf ihn klickst.";
-App::$strings["Default Channel"] = "Standard Kanal";
-App::$strings["Make Default"] = "Zum Standard machen";
-App::$strings["%d new messages"] = "%d neue Nachrichten";
-App::$strings["%d new introductions"] = "%d neue Vorstellungen";
-App::$strings["Delegated Channel"] = "Delegierte Kanäle";
-App::$strings["Your service plan only allows %d channels."] = "Dein Vertrag erlaubt nur %d Kanäle.";
-App::$strings["No channel. Import failed."] = "Kein Kanal. Import fehlgeschlagen.";
-App::$strings["Import completed."] = "Import abgeschlossen.";
-App::$strings["You must be logged in to use this feature."] = "Du musst angemeldet sein um diese Funktion zu nutzen.";
-App::$strings["Import Channel"] = "Kanal importieren";
-App::$strings["Use this form to import an existing channel from a different server/hub. You may retrieve the channel identity from the old server/hub via the network or provide an export file."] = "Verwende dieses Formular, um einen existierenden Kanal von einem anderen Hub zu importieren. Du kannst den Kanal direkt vom bisherigen Hub über das Netzwerk oder aus einer exportierten Sicherheitskopie importieren.";
-App::$strings["Or provide the old server/hub details"] = "Oder gib die Details Deines bisherigen \$Projectname-Hubs ein";
-App::$strings["Your old identity address (xyz@example.com)"] = "Bisherige Kanal-Adresse (xyz@example.com)";
-App::$strings["Your old login email address"] = "Deine alte Login-E-Mail-Adresse";
-App::$strings["Your old login password"] = "Dein altes Passwort";
-App::$strings["For either option, please choose whether to make this hub your new primary address, or whether your old location should continue this role. You will be able to post from either location, but only one can be marked as the primary location for files, photos, and media."] = "Egal, welche Option Du wählst – bitte lege fest, ob dieser Server die neue primäre Adresse dieses Kanals sein soll, oder ob der bisherige \$Projectname-Hub diese Rolle weiterhin wahrnimmt. Du kannst von beiden Servern aus posten, aber nur einer kann der primäre Ort Deiner Dateien, Fotos und Medien sein.";
-App::$strings["Make this hub my primary location"] = "Dieser $Pojectname-Hub ist mein primärer Hub.";
-App::$strings["Move this channel (disable all previous locations)"] = "Verschiebe diesen Kanal (deaktiviere alle vorherigen Adressen/Klone)";
-App::$strings["Import a few months of posts if possible (limited by available memory"] = "Importiere die Beiträge einiger Monate, sofern möglich (beschränkt durch verfügbaren Speicher)";
-App::$strings["This process may take several minutes to complete. Please submit the form only once and leave this page open until finished."] = "Dieser Vorgang kann einige Minuten dauern. Bitte sende das Formular nur einmal ab und lasse diese Seite bis zur Fertigstellung offen.";
-App::$strings["Remote privacy information not available."] = "Privatsphäre-Einstellungen anderer Nutzer sind nicht verfügbar.";
-App::$strings["Visible to:"] = "Sichtbar für:";
-App::$strings["Hub not found."] = "Server nicht gefunden.";
-App::$strings["Unable to create element."] = "Element konnte nicht erstellt werden.";
-App::$strings["Unable to update menu element."] = "Kann Menü-Element nicht aktualisieren.";
-App::$strings["Unable to add menu element."] = "Kann Menü-Bestandteil nicht hinzufügen.";
-App::$strings["Menu Item Permissions"] = "Zugriffsrechte des Menü-Elements";
-App::$strings["(click to open/close)"] = "(zum öffnen/schließen anklicken)";
-App::$strings["Link Name"] = "Name des Links";
-App::$strings["Link or Submenu Target"] = "Ziel des Links oder Untermenüs";
-App::$strings["Enter URL of the link or select a menu name to create a submenu"] = "URL des Links eingeben oder Menünamen wählen, um ein Untermenü anzulegen.";
-App::$strings["Use magic-auth if available"] = "Magic-Auth verwenden, falls verfügbar";
-App::$strings["Open link in new window"] = "Öffne Link in neuem Fenster";
-App::$strings["Order in list"] = "Reihenfolge in der Liste";
-App::$strings["Higher numbers will sink to bottom of listing"] = "Größere Nummern werden weiter unten in der Auflistung einsortiert";
-App::$strings["Submit and finish"] = "Absenden und fertigstellen";
-App::$strings["Submit and continue"] = "Absenden und fortfahren";
-App::$strings["Menu:"] = "Menü:";
-App::$strings["Link Target"] = "Ziel des Links";
-App::$strings["Edit menu"] = "Menü bearbeiten";
-App::$strings["Edit element"] = "Bestandteil bearbeiten";
-App::$strings["Drop element"] = "Bestandteil löschen";
-App::$strings["New element"] = "Neues Bestandteil";
-App::$strings["Edit this menu container"] = "Diesen Menü-Container bearbeiten";
-App::$strings["Add menu element"] = "Menüelement hinzufügen";
-App::$strings["Delete this menu item"] = "Lösche dieses Menü-Bestandteil";
-App::$strings["Edit this menu item"] = "Bearbeite dieses Menü-Bestandteil";
-App::$strings["Menu item not found."] = "Menü-Bestandteil nicht gefunden.";
-App::$strings["Menu item deleted."] = "Menü-Bestandteil gelöscht.";
-App::$strings["Menu item could not be deleted."] = "Menü-Bestandteil kann nicht gelöscht werden.";
-App::$strings["Edit Menu Element"] = "Bearbeite Menü-Bestandteil";
-App::$strings["Link text"] = "Link Text";
-App::$strings["App installed."] = "App installiert.";
-App::$strings["Malformed app."] = "Fehlerhafte App.";
-App::$strings["Embed code"] = "Code einbetten";
-App::$strings["Edit App"] = "App bearbeiten";
-App::$strings["Create App"] = "App erstellen";
-App::$strings["Name of app"] = "Name der App";
-App::$strings["Required"] = "Benötigt";
-App::$strings["Location (URL) of app"] = "Ort (URL) der App";
-App::$strings["Description"] = "Beschreibung";
-App::$strings["Photo icon URL"] = "URL zum Icon";
-App::$strings["80 x 80 pixels - optional"] = "80 x 80 Pixel – optional";
-App::$strings["Categories (optional, comma separated list)"] = "Kategorien (optional, kommagetrennte Liste)";
-App::$strings["Version ID"] = "Versions-ID";
-App::$strings["Price of app"] = "Preis der App";
-App::$strings["Location (URL) to purchase app"] = "Ort (URL), um die App zu kaufen";
-App::$strings["No ratings"] = "Keine Bewertungen";
-App::$strings["Rating: "] = "Bewertung: ";
-App::$strings["Website: "] = "Webseite: ";
-App::$strings["Description: "] = "Beschreibung: ";
-App::$strings["Item not available."] = "Element nicht verfügbar.";
-App::$strings["__ctx:mood__ %1\$s is %2\$s"] = "%1\$s ist %2\$s";
-App::$strings["Mood"] = "Laune";
-App::$strings["Set your current mood and tell your friends"] = "Wähle Deine aktuelle Stimmung und teile sie mit Deinen Freunden";
-App::$strings["No more system notifications."] = "Keine System-Benachrichtigungen mehr.";
-App::$strings["System Notifications"] = "System-Benachrichtigungen";
App::$strings["Profile not found."] = "Profil nicht gefunden.";
App::$strings["Profile deleted."] = "Profil gelöscht.";
App::$strings["Profile-"] = "Profil-";
@@ -935,294 +1247,36 @@ App::$strings["Love/Romance"] = "Liebe/Romantik";
App::$strings["School/Education"] = "Schule/Ausbildung";
App::$strings["Contact information and social networks"] = "Kontaktinformation und soziale Netzwerke";
App::$strings["My other channels"] = "Meine anderen Kanäle";
+App::$strings["Communications"] = "Kommunikation";
App::$strings["Profile Image"] = "Profilfoto:";
App::$strings["Edit Profiles"] = "Profile bearbeiten";
-App::$strings["Authorize application connection"] = "Zugriff für die Anwendung autorisieren";
-App::$strings["Return to your app and insert this Security Code:"] = "Gehen Sie zu Ihrer App zurück und tragen Sie diesen Sicherheitscode ein:";
-App::$strings["Please login to continue."] = "Zum Weitermachen, bitte einloggen.";
-App::$strings["Do you want to authorize this application to access your posts and contacts, and/or create new posts for you?"] = "Möchtest Du dieser Anwendung erlauben, Deine Nachrichten und Kontakte abzurufen und/oder neue Nachrichten für Dich zu erstellen?";
-App::$strings["Total invitation limit exceeded."] = "Einladungslimit überschritten.";
-App::$strings["%s : Not a valid email address."] = "%s : Keine gültige Email Adresse.";
-App::$strings["Please join us on \$Projectname"] = "Schließe Dich uns auf \$Projectname an!";
-App::$strings["Invitation limit exceeded. Please contact your site administrator."] = "Einladungslimit überschritten. Bitte kontaktiere den Administrator Deines \$Projectname-Servers.";
-App::$strings["%s : Message delivery failed."] = "%s : Nachricht konnte nicht zugestellt werden.";
-App::$strings["%d message sent."] = array(
- 0 => "%d Nachricht gesendet.",
- 1 => "%d Nachrichten gesendet.",
-);
-App::$strings["You have no more invitations available"] = "Du hast keine weiteren verfügbare Einladungen";
-App::$strings["Send invitations"] = "Einladungen senden";
-App::$strings["Enter email addresses, one per line:"] = "Email-Adressen eintragen, eine pro Zeile:";
-App::$strings["Your message:"] = "Deine Nachricht:";
-App::$strings["Please join my community on \$Projectname."] = "Schließe Dich uns auf \$Projectname an!";
-App::$strings["You will need to supply this invitation code:"] = "Bitte verwende bei der Registrierung den folgenden Einladungscode:";
-App::$strings["1. Register at any \$Projectname location (they are all inter-connected)"] = "1. Registriere Dich auf einem beliebigen \$Projectname-Hub (sie sind alle miteinander verbunden)";
-App::$strings["2. Enter my \$Projectname network address into the site searchbar."] = "2. Gib meine \$Projectname-Adresse im Suchfeld ein.";
-App::$strings["or visit"] = "oder besuche";
-App::$strings["3. Click [Connect]"] = "3. Klicke auf [Verbinden]";
+App::$strings["Page link"] = "Seiten-Link";
+App::$strings["Edit Webpage"] = "Webseite bearbeiten";
+App::$strings["Create a new channel"] = "Neuen Kanal anlegen";
+App::$strings["Channel Manager"] = "Kanal-Manager";
+App::$strings["Current Channel"] = "Aktueller Kanal";
+App::$strings["Switch to one of your channels by selecting it."] = "Wechsle zu einem Deiner Kanäle, indem Du auf ihn klickst.";
+App::$strings["Default Channel"] = "Standard Kanal";
+App::$strings["Make Default"] = "Zum Standard machen";
+App::$strings["%d new messages"] = "%d neue Nachrichten";
+App::$strings["%d new introductions"] = "%d neue Vorstellungen";
+App::$strings["Delegated Channel"] = "Delegierte Kanäle";
+App::$strings["This directory server requires an access token"] = "Dieser Verzeichnisserver benötigt einen Zugriffstoken";
App::$strings["About this site"] = "Ãœber diese Seite";
App::$strings["Site Name"] = "Seitenname";
App::$strings["Administrator"] = "Administrator";
+App::$strings["Terms of Service"] = "Nutzungsbedingungen";
App::$strings["Software and Project information"] = "Software und Projektinformationen";
App::$strings["This site is powered by \$Projectname"] = "Diese Website wird bereitgestellt durch \$Projectname";
App::$strings["Federated and decentralised networking and identity services provided by Zot"] = "Verbundene, dezentrale Netzwerk- und Identitätsdienste, ermöglicht mittels Zot";
App::$strings["Version %s"] = "Version %s";
App::$strings["Project homepage"] = "Projekt-Website";
App::$strings["Developer homepage"] = "Entwickler-Website";
-App::$strings["Create Channel"] = "Einen neuen Kanal anlegen";
-App::$strings["A channel is your identity on this network. It can represent a person, a blog, or a forum to name a few. Channels can make connections with other channels to share information with highly detailed permissions."] = "Ein Kanal ist Deine Identität in diesem Netzwerk. Er kann eine Person, ein Blog oder ein Forum repräsentieren, nur um ein paar Beispiele zu nennen. Kanäle können Verbindungen miteinander eingehen, um Informationen zu teilen, jeweils basierend auf sehr detaillierten Berechtigungseinstellungen.";
-App::$strings["or <a href=\"import\">import an existing channel</a> from another location."] = "oder <a href=\"import\">importiere einen bestehenden Kanal</a> von einem anderen Server.";
-App::$strings["\$Projectname Server - Setup"] = "\$Projectname Server-Einrichtung";
-App::$strings["Could not connect to database."] = "Kann nicht mit der Datenbank verbinden.";
-App::$strings["Could not connect to specified site URL. Possible SSL certificate or DNS issue."] = "Konnte die angegebene Webseiten-URL nicht erreichen. Möglicherweise ein Problem mit dem SSL-Zertifikat oder dem DNS.";
-App::$strings["Could not create table."] = "Konnte Tabelle nicht erstellen.";
-App::$strings["Your site database has been installed."] = "Die Datenbank Deines Hubs wurde installiert.";
-App::$strings["You may need to import the file \"install/schema_xxx.sql\" manually using a database client."] = "Möglicherweise musst Du die Datei install/schema_xxx.sql manuell mit Hilfe eines Datenkbank-Clients importieren.";
-App::$strings["Please see the file \"install/INSTALL.txt\"."] = "Lies die Datei \"install/INSTALL.txt\".";
-App::$strings["System check"] = "Systemprüfung";
-App::$strings["Check again"] = "Nochmal prüfen";
-App::$strings["Database connection"] = "Datenbankverbindung";
-App::$strings["In order to install \$Projectname we need to know how to connect to your database."] = "Um \$Projectname zu installieren, müssen wir wissen, wie wir eine Verbindung zu Deiner Datenbank aufbauen können.";
-App::$strings["Please contact your hosting provider or site administrator if you have questions about these settings."] = "Bitte kontaktiere Deinen Hosting-Provider oder Administrator, falls Du Fragen zu diesen Einstellungen hast.";
-App::$strings["The database you specify below should already exist. If it does not, please create it before continuing."] = "Die Datenbank, die Du weiter unten angibst, sollte bereits existieren. Sollte das noch nicht der Fall sein, erzeuge sie bitte bevor Du fortfährst.";
-App::$strings["Database Server Name"] = "Datenbankservername";
-App::$strings["Default is 127.0.0.1"] = "Standard ist 127.0.0.1";
-App::$strings["Database Port"] = "Datenbankport";
-App::$strings["Communication port number - use 0 for default"] = "Port-Nummer für die Kommunikation – verwende 0 für die Standardeinstellung";
-App::$strings["Database Login Name"] = "Datenbank-Benutzername";
-App::$strings["Database Login Password"] = "Datenbank-Passwort";
-App::$strings["Database Name"] = "Datenbankname";
-App::$strings["Database Type"] = "Datenbanktyp";
-App::$strings["Site administrator email address"] = "E-Mail Adresse des Seiten-Administrators";
-App::$strings["Your account email address must match this in order to use the web admin panel."] = "Die E-Mail-Adresse Deines Accounts muss dieser Adresse entsprechen, damit Du Zugriff zur Administrations-Seite erhältst.";
-App::$strings["Website URL"] = "Webseiten-URL";
-App::$strings["Please use SSL (https) URL if available."] = "Nutze wenn möglich eine SSL-URL (https).";
-App::$strings["Please select a default timezone for your website"] = "Standard-Zeitzone für Deinen Server";
-App::$strings["Site settings"] = "Seiteneinstellungen";
-App::$strings["PHP version 5.5 or greater is required."] = "PHP-Version 5.5 oder höher ist erforderlich.";
-App::$strings["PHP version"] = "PHP-Version";
-App::$strings["Could not find a command line version of PHP in the web server PATH."] = "Konnte die Kommandozeilen-Version von PHP nicht im PATH des Web-Servers finden.";
-App::$strings["If you don't have a command line version of PHP installed on server, you will not be able to run background polling via cron."] = "Ohne Kommandozeilen-Version von PHP auf dem Server wirst Du nicht in der Lage sein, Hintergrundprozesse via cron auszuführen.";
-App::$strings["PHP executable path"] = "PHP-Pfad zu ausführbarer Datei";
-App::$strings["Enter full path to php executable. You can leave this blank to continue the installation."] = "Gib den vollen Pfad zum PHP-Interpreter an. Du kannst dieses Feld frei lassen und mit der Installation fortfahren.";
-App::$strings["Command line PHP"] = "PHP-Befehlszeile";
-App::$strings["Unable to check command line PHP, as shell_exec() is disabled. This is required."] = "Prüfung auf Kommandozeilen-PHP fehlgeschlagen, da shell_exec() deaktiviert ist. Dies wird aber benötigt.";
-App::$strings["The command line version of PHP on your system does not have \"register_argc_argv\" enabled."] = "Bei der Kommandozeilen-Version von PHP auf Deinem System ist \"register_argc_argv\" nicht aktiviert.";
-App::$strings["This is required for message delivery to work."] = "Das wird benötigt, damit die Auslieferung von Nachrichten funktioniert.";
-App::$strings["PHP register_argc_argv"] = "PHP register_argc_argv";
-App::$strings["Your max allowed total upload size is set to %s. Maximum size of one file to upload is set to %s. You are allowed to upload up to %d files at once."] = "Die Maximalgröße für Uploads insgesamt liegt bei %s. Die Maximalgröße für eine Datei liegt bei %s. Es können maximal %d Dateien gleichzeitig hochgeladen werden.";
-App::$strings["You can adjust these settings in the server php.ini file."] = "Du kannst diese Einstellungen in der php.ini - Datei des Servers anpassen.";
-App::$strings["PHP upload limits"] = "PHP-Hochladebeschränkungen";
-App::$strings["Error: the \"openssl_pkey_new\" function on this system is not able to generate encryption keys"] = "Fehler: Die „openssl_pkey_new“-Funktion auf diesem System ist nicht in der Lage, Schlüssel für die Verschlüsselung zu erzeugen.";
-App::$strings["If running under Windows, please see \"http://www.php.net/manual/en/openssl.installation.php\"."] = "Wenn Du Windows verwendest, findest Du unter http://www.php.net/manual/en/openssl.installation.php eine Installationsanleitung.";
-App::$strings["Generate encryption keys"] = "Verschlüsselungsschlüssel erzeugen";
-App::$strings["libCurl PHP module"] = "libCurl-PHP-Modul";
-App::$strings["GD graphics PHP module"] = "GD-Grafik-PHP-Modul";
-App::$strings["OpenSSL PHP module"] = "OpenSSL-PHP-Modul";
-App::$strings["PDO database PHP module"] = "PDO-Datenbank-PHP-Modul";
-App::$strings["mb_string PHP module"] = "mb_string-PHP-Modul";
-App::$strings["xml PHP module"] = "xml-PHP-Modul";
-App::$strings["Apache mod_rewrite module"] = "Apache-mod_rewrite-Modul";
-App::$strings["Error: Apache webserver mod-rewrite module is required but not installed."] = "Fehler: Das Apache-Modul mod-rewrite wird benötigt, ist aber nicht installiert.";
-App::$strings["exec"] = "exec";
-App::$strings["Error: exec is required but is either not installed or has been disabled in php.ini"] = "Fehler: exec ist erforderlich, aber entweder nicht installiert oder wurde in der php.ini deaktiviert";
-App::$strings["shell_exec"] = "shell_exec";
-App::$strings["Error: shell_exec is required but is either not installed or has been disabled in php.ini"] = "Fehler: shell_exec ist erforderlich, aber entweder nicht installiert oder wurde in der php.ini deaktiviert";
-App::$strings["Error: libCURL PHP module required but not installed."] = "Fehler: Das PHP-Modul libCURL wird benötigt, ist aber nicht installiert.";
-App::$strings["Error: GD graphics PHP module with JPEG support required but not installed."] = "Fehler: Das PHP-Modul GD-Grafik mit JPEG-Unterstützung wird benötigt, ist aber nicht installiert.";
-App::$strings["Error: openssl PHP module required but not installed."] = "Fehler: Das PHP-Modul openssl wird benötigt, ist aber nicht installiert.";
-App::$strings["Error: PDO database PHP module required but not installed."] = "Fehler: PDO-Datenbank-PHP-Modul ist erforderlich, aber nicht installiert.";
-App::$strings["Error: mb_string PHP module required but not installed."] = "Fehler: Das PHP-Modul mb_string wird benötigt, ist aber nicht installiert.";
-App::$strings["Error: xml PHP module required for DAV but not installed."] = "Fehler: Das xml-PHP-Modul wird für DAV benötigt, ist aber nicht installiert.";
-App::$strings["The web installer needs to be able to create a file called \".htconfig.php\" in the top folder of your web server and it is unable to do so."] = "Der Installations-Assistent muss in der Lage sein, die Datei \".htconfig.php\" im Stammverzeichnis des Web-Servers anzulegen, ist er aber nicht.";
-App::$strings["This is most often a permission setting, as the web server may not be able to write files in your folder - even if you can."] = "Meist liegt das daran, dass der Nutzer, unter dem der Web-Server läuft, keine Schreibrechte in dem Verzeichnis hat – selbst wenn Du selbst das darfst.";
-App::$strings["At the end of this procedure, we will give you a text to save in a file named .htconfig.php in your Red top folder."] = "Am Schluss dieses Vorgangs wird ein Text generiert, den Du unter dem Dateinamen .htconfig.php im Stammverzeichnis Deiner Hubzilla-Installation speichern musst.";
-App::$strings["You can alternatively skip this procedure and perform a manual installation. Please see the file \"install/INSTALL.txt\" for instructions."] = "Alternativ kannst Du diesen Schritt überspringen und die Installation manuell vornehmen. Lies dazu die Datei install/INSTALL.txt.";
-App::$strings[".htconfig.php is writable"] = ".htconfig.php ist beschreibbar";
-App::$strings["This software uses the Smarty3 template engine to render its web views. Smarty3 compiles templates to PHP to speed up rendering."] = "Diese Software verwendet die Smarty3 Template Engine, um Vorlagen für die Webdarstellung zu verarbeiten. Smarty3 übersetzt diese Vorlagen nach PHP, um die Darstellung zu beschleunigen.";
-App::$strings["In order to store these compiled templates, the web server needs to have write access to the directory %s under the top level web folder."] = "Um diese kompilierten Vorlagen speichern zu können, braucht der Web-Server Schreibzugriff auf das Verzeichnis %s unterhalb des Hubzilla-Stammverzeichnisses.";
-App::$strings["Please ensure that the user that your web server runs as (e.g. www-data) has write access to this folder."] = "Bitte stelle sicher, dass der Nutzer, unter dem der Web-Server läuft (z.B. www-data), Schreibzugriff auf dieses Verzeichnis hat.";
-App::$strings["Note: as a security measure, you should give the web server write access to %s only--not the template files (.tpl) that it contains."] = "Hinweis: Aus Sicherheitsgründen sollte der Web-Server nur auf %s Schreibrechte haben, nicht auf die Template-Dateien (.tpl), die das Verzeichnis enthält.";
-App::$strings["%s is writable"] = "%s ist beschreibbar";
-App::$strings["This software uses the store directory to save uploaded files. The web server needs to have write access to the store directory under the top level web folder"] = "Diese Software benutzt das Verzeichnis store, um hochgeladene Dateien zu speichern. Der Webserver benötigt Schreibrechte für dieses Verzeichnis direkt unterhalb des Web-Stammverzeichnisses.";
-App::$strings["store is writable"] = "store ist schreibbar";
-App::$strings["SSL certificate cannot be validated. Fix certificate or disable https access to this site."] = "Das SSL-Zertifikat konnte nicht validiert werden. Korrigiere das Zertifikat oder deaktiviere den HTTPS-Zugriff auf diesen Server.";
-App::$strings["If you have https access to your website or allow connections to TCP port 443 (the https: port), you MUST use a browser-valid certificate. You MUST NOT use self-signed certificates!"] = "Wenn Du via HTTPS auf Deinen Server zugreifen möchtest, also Verbindungen über den Port 443 möglich sein sollen, ist ein SSL-Zertifikat einer Zertifizierungsstelle (CA) notwendig, das von den Browsern ohne Sicherheitsabfrage akzeptiert wird. Die Verwendung eines selbst signierten Zertifikates ist nicht möglich.";
-App::$strings["This restriction is incorporated because public posts from you may for example contain references to images on your own hub."] = "Diese Einschränkung wurde eingebaut, weil Deine öffentlichen Beiträge zum Beispiel Verweise auf Bilder auf Deinem eigenen Hub enthalten können.";
-App::$strings["If your certificate is not recognized, members of other sites (who may themselves have valid certificates) will get a warning message on their own site complaining about security issues."] = "Wenn Dein Zertifikat nicht von jedem Browser akzeptiert wird, erhalten die Mitglieder anderer \$Projectname-Hubs (die mit korrekten Zertifikaten ausgestattet sind) Sicherheits-Warnmeldungen, obwohl sie gar nicht direkt auf Deinem Server unterwegs sind (zum Beispiel, wenn ein Bild aus einem Deiner Beiträge angezeigt wird).";
-App::$strings["This can cause usability issues elsewhere (not just on your own site) so we must insist on this requirement."] = "Dies kann Probleme für andere Nutzer (nicht nur auf Deinem eigenen Server) verursachen, so dass wir auf dieser Forderung bestehen müssen.";
-App::$strings["Providers are available that issue free certificates which are browser-valid."] = "Es gibt einige Zertifizierungsstellen (CAs), bei denen solche Zertifikate kostenlos zu haben sind.";
-App::$strings["If you are confident that the certificate is valid and signed by a trusted authority, check to see if you have failed to install an intermediate cert. These are not normally required by browsers, but are required for server-to-server communications."] = "Wenn Du sicher bist, dass das Zertifikat gültig und von einer vertrauenswürdigen Zertifizierungsstelle signiert ist, prüfe auf ggf. noch zu installierende Zwischenzertifikate (intermediate). Diese werden nicht unbedingt von Browsern benötigt, aber sehr wohl für die Kommunikation zwischen Servern.";
-App::$strings["SSL certificate validation"] = "SSL Zertifikatverifizierung";
-App::$strings["Url rewrite in .htaccess is not working. Check your server configuration.Test: "] = "Das Umschreiben von URLs (rewrite) per .htaccess funktioniert nicht. Bitte prüfe die Server-Konfiguration. Test:";
-App::$strings["Url rewrite is working"] = "Url rewrite funktioniert";
-App::$strings["The database configuration file \".htconfig.php\" could not be written. Please use the enclosed text to create a configuration file in your web server root."] = "Die Datenbank-Konfigurationsdatei „.htconfig.php“ konnte nicht geschrieben werden. Bitte verwende den unten angegebenen Text, um die Konfigurationsdatei im Stammverzeichnis des Webservers anzulegen.";
-App::$strings["Errors encountered creating database tables."] = "Fehler beim Anlegen der Datenbank-Tabellen aufgetreten.";
-App::$strings["<h1>What next</h1>"] = "<h1>Was als Nächstes</h1>";
-App::$strings["IMPORTANT: You will need to [manually] setup a scheduled task for the poller."] = "WICHTIG: Du musst [manuell] einen Cronjob für den Poller einrichten.";
-App::$strings["Mark all system notifications seen"] = "Markiere alle System-Benachrichtigungen als gesehen";
-App::$strings["Poke"] = "Anstupsen";
-App::$strings["Poke somebody"] = "Jemanden anstupsen";
-App::$strings["Poke/Prod"] = "Anstupsen/Knuffen";
-App::$strings["Poke, prod or do other things to somebody"] = "Jemanden anstupsen, knuffen oder sonstiges";
-App::$strings["Recipient"] = "Empfänger";
-App::$strings["Choose what you wish to do to recipient"] = "Wähle, was Du mit dem/r Empfänger/in tun willst";
-App::$strings["Make this post private"] = "Diesen Beitrag privat machen";
-App::$strings["Unable to find your hub."] = "Konnte Deinen Server nicht finden.";
-App::$strings["Post successful."] = "Veröffentlichung erfolgreich.";
-App::$strings["Unable to locate original post."] = "Originalbeitrag nicht gefunden.";
-App::$strings["Empty post discarded."] = "Leeren Beitrag verworfen.";
-App::$strings["Executable content type not permitted to this channel."] = "Ausführbarer Content-Typ ist für diesen Kanal nicht freigegeben.";
-App::$strings["Duplicate post suppressed."] = "Doppelter Beitrag unterdrückt.";
-App::$strings["System error. Post not saved."] = "Systemfehler. Beitrag nicht gespeichert.";
-App::$strings["Unable to obtain post information from database."] = "Beitragsinformationen können nicht aus der Datenbank abgerufen werden.";
-App::$strings["You have reached your limit of %1$.0f top level posts."] = "Du hast die maximale Anzahl von %1$.0f Beiträgen erreicht.";
-App::$strings["You have reached your limit of %1$.0f webpages."] = "Du hast die maximale Anzahl von %1$.0f Webseiten erreicht.";
-App::$strings["This setting requires special processing and editing has been blocked."] = "Diese Einstellung erfordert eine besondere Verarbeitung und ist blockiert.";
-App::$strings["Configuration Editor"] = "Konfigurationseditor";
-App::$strings["Warning: Changing some settings could render your channel inoperable. Please leave this page unless you are comfortable with and knowledgeable about how to correctly use this feature."] = "Warnung: Einige Einstellungen können Deinen Kanal funktionsunfähig machen. Bitte verlasse diese Seite, es sei denn Du bist vertraut damit, wie dieses Feature korrekt verwendet wird.";
-App::$strings["vcard"] = "VCard";
-App::$strings["Blocks"] = "Blöcke";
-App::$strings["Block Title"] = "Titel des Blocks";
-App::$strings["Layouts"] = "Layouts";
-App::$strings["Help"] = "Hilfe";
-App::$strings["Comanche page description language help"] = "Hilfe zur Comanche-Seitenbeschreibungssprache";
-App::$strings["Layout Description"] = "Layout-Beschreibung";
-App::$strings["Download PDL file"] = "PDL-Datei herunterladen";
-App::$strings["Website:"] = "Webseite:";
-App::$strings["Remote Channel [%s] (not yet known on this site)"] = "Kanal [%s] (auf diesem Server noch unbekannt)";
-App::$strings["Rating (this information is public)"] = "Bewertung (öffentlich sichtbar)";
-App::$strings["Optionally explain your rating (this information is public)"] = "Optional kannst du deine Bewertung erklären (öffentlich sichtbar)";
-App::$strings["Shift-reload the page or clear browser cache if the new photo does not display immediately."] = "Leere den Browser Cache oder nutze Umschalten-Neu Laden, falls das neue Foto nicht sofort angezeigt wird.";
-App::$strings["Use Photo for Profile"] = "Foto für Profil verwenden";
-App::$strings["Upload Profile Photo"] = "Lade neues Profilfoto hoch";
-App::$strings["Use"] = "Verwenden";
-App::$strings["Calendar entries imported."] = "Kalendereinträge wurden importiert.";
-App::$strings["No calendar entries found."] = "Keine Kalendereinträge gefunden.";
-App::$strings["Event can not end before it has started."] = "Termin-Ende liegt vor dem Beginn.";
-App::$strings["Unable to generate preview."] = "Vorschau konnte nicht erzeugt werden.";
-App::$strings["Event title and start time are required."] = "Titel und Startzeit des Termins sind erforderlich.";
-App::$strings["Event not found."] = "Termin nicht gefunden.";
-App::$strings["Edit event title"] = "Termintitel bearbeiten";
-App::$strings["Event title"] = "Termintitel";
-App::$strings["Categories (comma-separated list)"] = "Kategorien (Kommagetrennte Liste)";
-App::$strings["Edit Category"] = "Kategorie bearbeiten";
-App::$strings["Category"] = "Kategorie";
-App::$strings["Edit start date and time"] = "Startdatum und -zeit bearbeiten";
-App::$strings["Start date and time"] = "Startdatum und -zeit";
-App::$strings["Finish date and time are not known or not relevant"] = "Enddatum und -zeit sind unbekannt oder irrelevant";
-App::$strings["Edit finish date and time"] = "Enddatum und -zeit bearbeiten";
-App::$strings["Finish date and time"] = "Enddatum und -zeit";
-App::$strings["Adjust for viewer timezone"] = "An die Zeitzone des Betrachters anpassen";
-App::$strings["Important for events that happen in a particular place. Not practical for global holidays."] = "Wichtig für Veranstaltungen die an bestimmten Orten stattfinden. Nicht sinnvoll für globale Feiertage / Ferien.";
-App::$strings["Edit Description"] = "Beschreibung bearbeiten";
-App::$strings["Edit Location"] = "Ort bearbeiten";
-App::$strings["Permission settings"] = "Berechtigungs-Einstellungen";
-App::$strings["Timezone:"] = "Zeitzone:";
-App::$strings["Advanced Options"] = "Weitere Optionen";
-App::$strings["Edit event"] = "Termin bearbeiten";
-App::$strings["Delete event"] = "Termin löschen";
-App::$strings["calendar"] = "Kalender";
-App::$strings["Month"] = "Monat";
-App::$strings["Week"] = "Woche";
-App::$strings["Day"] = "Tag";
-App::$strings["Event removed"] = "Termin gelöscht";
-App::$strings["Failed to remove event"] = "Termin konnte nicht gelöscht werden";
-App::$strings["No channel."] = "Kein Kanal.";
-App::$strings["Common connections"] = "Gemeinsame Verbindungen";
-App::$strings["No connections in common."] = "Keine gemeinsamen Verbindungen.";
-App::$strings["toggle full screen mode"] = "auf Vollbildmodus umschalten";
-App::$strings["Invalid profile identifier."] = "Ungültiger Profil-Identifikator";
-App::$strings["Profile Visibility Editor"] = "Profil-Sichtbarkeits-Editor";
-App::$strings["Profile"] = "Profil";
-App::$strings["Click on a contact to add or remove."] = "Klicke auf einen Kontakt, um ihn hinzuzufügen oder zu entfernen.";
-App::$strings["Visible To"] = "Sichtbar für";
-App::$strings["You must be logged in to see this page."] = "Du musst angemeldet sein, um diese Seite betrachten zu können.";
-App::$strings["Posts and comments"] = "Beiträge und Kommentare";
-App::$strings["Only posts"] = "Nur Beiträge";
-App::$strings["Insufficient permissions. Request redirected to profile page."] = "Unzureichende Zugriffsrechte. Die Anfrage wurde zur Profil-Seite umgeleitet.";
-App::$strings["No valid account found."] = "Kein gültiges Konto gefunden.";
-App::$strings["Password reset request issued. Check your email."] = "Zurücksetzen des Passworts eingeleitet. Schau in Deine E-Mails.";
-App::$strings["Site Member (%s)"] = "Nutzer (%s)";
-App::$strings["Password reset requested at %s"] = "Passwort-Rücksetzung auf %s angefordert";
-App::$strings["Request could not be verified. (You may have previously submitted it.) Password reset failed."] = "Die Anfrage konnte nicht verifiziert werden. (Vielleicht hast Du schon einmal auf den Link in der E-Mail geklickt?) Passwort-Rücksetzung fehlgeschlagen.";
-App::$strings["Password Reset"] = "Zurücksetzen des Kennworts";
-App::$strings["Your password has been reset as requested."] = "Dein Passwort wurde wie angefordert neu erstellt.";
-App::$strings["Your new password is"] = "Dein neues Passwort lautet";
-App::$strings["Save or copy your new password - and then"] = "Speichere oder kopiere Dein neues Passwort – und dann";
-App::$strings["click here to login"] = "Klicke hier, um dich anzumelden";
-App::$strings["Your password may be changed from the <em>Settings</em> page after successful login."] = "Dein Passwort kann unter <em>Einstellungen</em> nach einer erfolgreichen Anmeldung geändert werden.";
-App::$strings["Your password has changed at %s"] = "Auf %s wurde Dein Passwort geändert";
-App::$strings["Forgot your Password?"] = "Kennwort vergessen?";
-App::$strings["Enter your email address and submit to have your password reset. Then check your email for further instructions."] = "Gib Deine E-Mail-Adresse ein, um Dein Passwort zurücksetzen zu lassen. Du erhältst dann weitere Anweisungen per E-Mail.";
-App::$strings["Email Address"] = "E-Mail Adresse";
-App::$strings["Reset"] = "Zurücksetzen";
-App::$strings["Select a bookmark folder"] = "Lesezeichenordner wählen";
-App::$strings["Save Bookmark"] = "Lesezeichen speichern";
-App::$strings["URL of bookmark"] = "URL des Lesezeichens";
-App::$strings["Or enter new bookmark folder name"] = "Oder gib einen neuen Namen für den Lesezeichenordner ein";
-App::$strings["Channel added."] = "Kanal hinzugefügt.";
-App::$strings["Authentication failed."] = "Authentifizierung fehlgeschlagen.";
-App::$strings["Remote Authentication"] = "Entfernte Authentifizierung";
-App::$strings["Enter your channel address (e.g. channel@example.com)"] = "Deine Kanal-Adresse (z. B. channel@example.com)";
-App::$strings["Authenticate"] = "Authentifizieren";
-App::$strings["Please login."] = "Bitte melde dich an.";
-App::$strings["Account removals are not allowed within 48 hours of changing the account password."] = "Das Löschen von Konten innerhalb 48 Stunden nachdem deren Passwort geändert wurde ist nicht erlaubt.";
-App::$strings["Remove This Account"] = "Dieses Konto löschen";
-App::$strings["WARNING: "] = "WARNUNG: ";
-App::$strings["This account and all its channels will be completely removed from the network. "] = "Dieses Konto mit all seinen Kanälen wird vollständig aus dem Netzwerk gelöscht.";
-App::$strings["This action is permanent and can not be undone!"] = "Dieser Schritt ist endgültig und kann nicht rückgängig gemacht werden!";
-App::$strings["Please enter your password for verification:"] = "Bitte gib zur Bestätigung Dein Passwort ein:";
-App::$strings["Remove this account, all its channels and all its channel clones from the network"] = "Dieses Konto, all seine Kanäle sowie alle Kanal-Klone aus dem Netzwerk löschen";
-App::$strings["By default only the instances of the channels located on this hub will be removed from the network"] = "Standardmäßig werden nur die Kanalklone auf diesem \$Projectname-Hub aus dem Netzwerk entfernt";
-App::$strings["Remove Account"] = "Konto entfernen";
-App::$strings["Layout updated."] = "Layout aktualisiert.";
-App::$strings["Feature disabled."] = "Funktion deaktiviert.";
-App::$strings["Edit System Page Description"] = "Systemseitenbeschreibung bearbeiten";
-App::$strings["Layout not found."] = "Layout nicht gefunden.";
-App::$strings["Module Name:"] = "Modulname:";
-App::$strings["Layout Help"] = "Layout-Hilfe";
-App::$strings["Export Channel"] = "Kanal exportieren";
-App::$strings["Export your basic channel information to a file. This acts as a backup of your connections, permissions, profile and basic data, which can be used to import your data to a new server hub, but does not contain your content."] = "Exportiert die grundlegenden Kanal-Informationen in eine kleine Datei. Diese stellt eine Sicherung Deiner Verbindungen, Berechtigungen, Profile und Basisdaten bereit, die für den Import auf einem anderen Hub verwendet werden kann, aber nicht die Beiträge Deines Kanals enthält.";
-App::$strings["Export Content"] = "Kanal und Inhalte exportieren";
-App::$strings["Export your channel information and recent content to a JSON backup that can be restored or imported to another server hub. This backs up all of your connections, permissions, profile data and several months of posts. This file may be VERY large. Please be patient - it may take several minutes for this download to begin."] = "Exportiert Deine Kanal-Informationen sowie alle zugehörigen Inhalte in eine JSON-Sicherungsdatei. Die sichert alle Verbindungen, Berechtigungen, Profildaten und Deine Beiträge aus mehreren Monaten. Diese Datei kann SEHR groß werden! Bitte habe ein wenig Geduld – es kann mehrere Minuten dauern, bis der Download startet.";
-App::$strings["Export your posts from a given year."] = "Exportiert die Beiträge des angegebenen Jahres.";
-App::$strings["You may also export your posts and conversations for a particular year or month. Adjust the date in your browser location bar to select other dates. If the export fails (possibly due to memory exhaustion on your server hub), please try again selecting a more limited date range."] = "Du kannst auch die Beiträge und Konversationen eines bestimmten Jahres oder Monats exportieren. Ändere das Datum in der Adresszeile Deines Browsers, um andere Zeiträume zu wählen. Falls der Export fehlschlägt (vermutlich, weil auf diesem Hub nicht genügend Speicher zur Verfügung steht), versuche es noch einmal mit einer kleineren Zeitspanne.";
-App::$strings["To select all posts for a given year, such as this year, visit <a href=\"%1\$s\">%2\$s</a>"] = "Um alle Beiträge eines bestimmten Jahres, zum Beispiel dieses Jahres, auszuwählen, klicke <a href=\"%1\$s\">%2\$s</a>.";
-App::$strings["To select all posts for a given month, such as January of this year, visit <a href=\"%1\$s\">%2\$s</a>"] = "Um alle Beiträge eines bestimmten Monats auszuwählen, zum Beispiel vom Januar diesen Jahres, klicke <a href=\"%1\$s\">%2\$s</a>.";
-App::$strings["These content files may be imported or restored by visiting <a href=\"%1\$s\">%2\$s</a> on any site containing your channel. For best results please import or restore these in date order (oldest first)."] = "Diese Inhalts-Sicherungen können wiederhergestellt werden, indem Du <a href=\"%1\$s\">%2\$s</a> auf jeglichem Hub besuchst, der diesen Kanal enthält. Das funktioniert am besten, wenn Du dabei die zeitliche Reihenfolge einhältst, also die Sicherungen für den ältesten Zeitraum zuerst importierst.";
-App::$strings["%d rating"] = array(
- 0 => "%d Bewertung",
- 1 => "%d Bewertungen",
-);
-App::$strings["Gender: "] = "Geschlecht:";
-App::$strings["Status: "] = "Status:";
-App::$strings["Homepage: "] = "Webseite:";
-App::$strings["Age:"] = "Alter:";
-App::$strings["Location:"] = "Ort:";
-App::$strings["Description:"] = "Beschreibung:";
-App::$strings["Hometown:"] = "Heimatstadt:";
-App::$strings["About:"] = "Ãœber:";
-App::$strings["Connect"] = "Verbinden";
-App::$strings["Public Forum:"] = "Öffentliches Forum:";
-App::$strings["Keywords: "] = "Schlüsselwörter:";
-App::$strings["Don't suggest"] = "Nicht vorschlagen";
-App::$strings["Common connections:"] = "Gemeinsame Verbindungen:";
-App::$strings["Global Directory"] = "Globales Verzeichnis";
-App::$strings["Local Directory"] = "Lokales Verzeichnis";
-App::$strings["Finding:"] = "Ergebnisse:";
-App::$strings["Channel Suggestions"] = "Kanal-Vorschläge";
-App::$strings["next page"] = "nächste Seite";
-App::$strings["previous page"] = "vorherige Seite";
-App::$strings["Sort options"] = "Sortieroptionen";
-App::$strings["Alphabetic"] = "alphabetisch";
-App::$strings["Reverse Alphabetic"] = "Entgegengesetzt alphabetisch";
-App::$strings["Newest to Oldest"] = "Neueste zuerst";
-App::$strings["Oldest to Newest"] = "Älteste zuerst";
-App::$strings["No entries (some entries may be hidden)."] = "Keine Einträge gefunden (einige könnten versteckt sein).";
-App::$strings["Away"] = "Abwesend";
-App::$strings["Online"] = "Online";
-App::$strings["No service class restrictions found."] = "Keine Dienstklassenbeschränkungen gefunden.";
+App::$strings["No ratings"] = "Keine Bewertungen";
+App::$strings["Ratings"] = "Bewertungen";
+App::$strings["Rating: "] = "Bewertung: ";
+App::$strings["Website: "] = "Webseite: ";
+App::$strings["Description: "] = "Beschreibung: ";
App::$strings["Import Webpage Elements"] = "Webseitenelemente importieren";
App::$strings["Import selected"] = "Import ausgewählt";
App::$strings["Export Webpage Elements"] = "Webseitenelemente exportieren";
@@ -1236,51 +1290,24 @@ App::$strings["Error opening zip file"] = "Fehler beim Öffnen der ZIP-Datei";
App::$strings["Invalid folder path."] = "Ungültiger Ordnerpfad.";
App::$strings["No webpage elements detected."] = "Keine Webseitenelemente erkannt.";
App::$strings["Import complete."] = "Import abgeschlossen.";
-App::$strings["Channel removals are not allowed within 48 hours of changing the account password."] = "Innerhalb von 48 Stunden nach einer Änderung des Passworts können keine Kanäle gelöscht werden.";
-App::$strings["Remove This Channel"] = "Diesen Kanal löschen";
-App::$strings["This channel will be completely removed from the network. "] = "Dieser Kanal wird vollständig aus dem Netzwerk gelöscht.";
-App::$strings["Remove this channel and all its clones from the network"] = "Lösche diesen Kanal und all seine Klone aus dem Netzwerk";
-App::$strings["By default only the instance of the channel located on this hub will be removed from the network"] = "Standardmäßig wird der Kanal nur auf diesem Server gelöscht, seine Klone verbleiben im Netzwerk";
-App::$strings["Remove Channel"] = "Kanal löschen";
-App::$strings["Files: shared with me"] = "Dateien, die mit mir geteilt wurden";
-App::$strings["NEW"] = "NEU";
-App::$strings["Remove all files"] = "Alle Dateien löschen";
-App::$strings["Remove this file"] = "Diese Datei löschen";
-App::$strings["Profile Unavailable."] = "Profil nicht verfügbar.";
-App::$strings["Not found"] = "Nicht gefunden";
-App::$strings["Invalid channel"] = "Ungültiger Kanal";
-App::$strings["Wikis"] = "Wikis";
-App::$strings["Download"] = "Herunterladen";
-App::$strings["Wiki name"] = "Name des Wiki";
-App::$strings["Content type"] = "Inhaltstyp";
-App::$strings["Create a status post for this wiki"] = "Erzeuge einen Statusbeitrag für dieses Wiki";
-App::$strings["Wiki not found"] = "Wiki nicht gefunden";
-App::$strings["Rename page"] = "Seite umbenennen";
-App::$strings["Error retrieving page content"] = "Fehler beim Abrufen des Seiteninhalts";
-App::$strings["Revision Comparison"] = "Revisionsvergleich";
-App::$strings["Revert"] = "Rückgängig machen";
-App::$strings["Short description of your changes (optional)"] = "Kurze Beschreibung Ihrer Änderungen (optional)";
-App::$strings["Source"] = "Quelle";
-App::$strings["New page name"] = "Neuer Seitenname";
-App::$strings["Embed image from photo albums"] = "Bild aus Fotoalben einbetten";
-App::$strings["Embed an image from your albums"] = "Betten Sie ein Bild aus Ihren Alben ein";
-App::$strings["OK"] = "Ok";
-App::$strings["Choose images to embed"] = "Wählen Sie Bilder zum Einbetten aus";
-App::$strings["Choose an album"] = "Wählen Sie ein Album aus";
-App::$strings["Choose a different album"] = "Wählen Sie ein anderes Album aus";
-App::$strings["Error getting album list"] = "Fehler beim Holen der Albenliste";
-App::$strings["Error getting photo link"] = "Fehler beim Holen des Fotolinks";
-App::$strings["Error getting album"] = "Fehler beim Holen des Albums";
-App::$strings["Error creating wiki. Invalid name."] = "Fehler beim Erstellen des Wiki. Ungültiger Name.";
-App::$strings["Wiki created, but error creating Home page."] = "Das Wiki wurde erzeugt, aber es gab einen Fehler bei der Erstellung der Startseite";
-App::$strings["Error creating wiki"] = "Fehler beim Erstellen des Wiki";
-App::$strings["Wiki delete permission denied."] = "Wiki-Löschberechtigung verweigert.";
-App::$strings["Error deleting wiki"] = "Fehler beim Löschen des Wiki";
-App::$strings["New page created"] = "Neue Seite erstellt";
-App::$strings["Cannot delete Home"] = "Kann die Startseite nicht löschen";
-App::$strings["Current Revision"] = "Aktuelle Revision";
-App::$strings["Selected Revision"] = "Ausgewählte Revision";
-App::$strings["You must be authenticated."] = "Sie müssen authenzifiziert sein.";
+App::$strings["Item is not editable"] = "Element kann nicht bearbeitet werden.";
+App::$strings["Edit post"] = "Bearbeite Beitrag";
+App::$strings["Invalid message"] = "Ungültige Beitrags-ID (mid)";
+App::$strings["no results"] = "keine Ergebnisse";
+App::$strings["channel sync processed"] = "Kanal-Sync verarbeitet";
+App::$strings["queued"] = "zur Warteschlange hinzugefügt";
+App::$strings["posted"] = "zugestellt";
+App::$strings["accepted for delivery"] = "für Zustellung akzeptiert";
+App::$strings["updated"] = "aktualisiert";
+App::$strings["update ignored"] = "Aktualisierung ignoriert";
+App::$strings["permission denied"] = "Zugriff verweigert";
+App::$strings["recipient not found"] = "Empfänger nicht gefunden.";
+App::$strings["mail recalled"] = "Mail widerrufen";
+App::$strings["duplicate mail received"] = "Doppelte Mail erhalten";
+App::$strings["mail delivered"] = "Mail zugestellt";
+App::$strings["Delivery report for %1\$s"] = "Zustellungsbericht für %1\$s";
+App::$strings["Options"] = "Optionen";
+App::$strings["Redeliver"] = "Erneut zustellen";
App::$strings["Failed to create source. No channel selected."] = "Konnte die Quelle nicht anlegen. Kein Kanal ausgewählt.";
App::$strings["Source created."] = "Quelle erstellt.";
App::$strings["Source updated."] = "Quelle aktualisiert.";
@@ -1293,213 +1320,72 @@ App::$strings["Only import content with these words (one per line)"] = "Importie
App::$strings["Leave blank to import all public content"] = "Leer lassen, um alle öffentlichen Beiträge zu importieren";
App::$strings["Channel Name"] = "Name des Kanals";
App::$strings["Add the following categories to posts imported from this source (comma separated)"] = "Füge die folgenden Kategorien zu Beiträgen, die aus dieser Quelle importiert werden, hinzu (kommagetrennt)";
-App::$strings["Optional"] = "Optional";
App::$strings["Source not found."] = "Quelle nicht gefunden.";
App::$strings["Edit Source"] = "Quelle bearbeiten";
App::$strings["Delete Source"] = "Quelle löschen";
App::$strings["Source removed"] = "Quelle gelöscht";
App::$strings["Unable to remove source."] = "Konnte die Quelle nicht löschen.";
-App::$strings["%1\$s is following %2\$s's %3\$s"] = "%1\$s folgt nun %2\$ss %3\$s";
-App::$strings["%1\$s stopped following %2\$s's %3\$s"] = "%1\$s folgt %2\$ss %3\$s nicht mehr";
+App::$strings["Like/Dislike"] = "Mögen/Nicht mögen";
+App::$strings["This action is restricted to members."] = "Diese Aktion kann nur von Mitgliedern ausgeführt werden.";
+App::$strings["Please <a href=\"rmagic\">login with your \$Projectname ID</a> or <a href=\"register\">register as a new \$Projectname member</a> to continue."] = "Um fortzufahren <a href=\"rmagic\">melde Dich bitte mit Deiner \$Projectname-ID an</a> oder <a href=\"register\">registriere Dich als neues \$Projectname-Mitglied</a>.";
+App::$strings["Invalid request."] = "Ungültige Anfrage.";
+App::$strings["channel"] = "Kanal";
+App::$strings["thing"] = "Sache";
+App::$strings["Channel unavailable."] = "Kanal nicht vorhanden.";
+App::$strings["Previous action reversed."] = "Die vorherige Aktion wurde rückgängig gemacht.";
+App::$strings["%1\$s likes %2\$s's %3\$s"] = "%1\$s gefällt %2\$ss %3\$s";
+App::$strings["%1\$s doesn't like %2\$s's %3\$s"] = "%1\$s gefällt %2\$ss %3\$s nicht";
+App::$strings["%1\$s agrees with %2\$s's %3\$s"] = "%1\$s stimmt %2\$ss %3\$s zu";
+App::$strings["%1\$s doesn't agree with %2\$s's %3\$s"] = "%1\$s lehnt %2\$ss %3\$s ab";
+App::$strings["%1\$s abstains from a decision on %2\$s's %3\$s"] = "%1\$s enthält sich zu %2\$ss %3\$s";
+App::$strings["%1\$s is attending %2\$s's %3\$s"] = "%1\$s nimmt an %2\$ss %3\$s teil";
+App::$strings["%1\$s is not attending %2\$s's %3\$s"] = "%1\$s nimmt an %2\$ss %3\$s nicht teil";
+App::$strings["%1\$s may attend %2\$s's %3\$s"] = "%1\$s nimmt vielleicht an %2\$ss %3\$s teil";
+App::$strings["Action completed."] = "Aktion durchgeführt.";
+App::$strings["Thank you."] = "Vielen Dank.";
+App::$strings["%d rating"] = array(
+ 0 => "%d Bewertung",
+ 1 => "%d Bewertungen",
+);
+App::$strings["Gender: "] = "Geschlecht:";
+App::$strings["Status: "] = "Status:";
+App::$strings["Homepage: "] = "Webseite:";
+App::$strings["Age:"] = "Alter:";
+App::$strings["Location:"] = "Ort:";
+App::$strings["Description:"] = "Beschreibung:";
+App::$strings["Hometown:"] = "Heimatstadt:";
+App::$strings["About:"] = "Ãœber:";
+App::$strings["Connect"] = "Verbinden";
+App::$strings["Public Forum:"] = "Öffentliches Forum:";
+App::$strings["Keywords: "] = "Schlüsselwörter:";
+App::$strings["Don't suggest"] = "Nicht vorschlagen";
+App::$strings["Common connections:"] = "Gemeinsame Verbindungen:";
+App::$strings["Global Directory"] = "Globales Verzeichnis";
+App::$strings["Local Directory"] = "Lokales Verzeichnis";
+App::$strings["Finding:"] = "Ergebnisse:";
+App::$strings["Channel Suggestions"] = "Kanal-Vorschläge";
+App::$strings["next page"] = "nächste Seite";
+App::$strings["previous page"] = "vorherige Seite";
+App::$strings["Sort options"] = "Sortieroptionen";
+App::$strings["Alphabetic"] = "alphabetisch";
+App::$strings["Reverse Alphabetic"] = "Entgegengesetzt alphabetisch";
+App::$strings["Newest to Oldest"] = "Neueste zuerst";
+App::$strings["Oldest to Newest"] = "Älteste zuerst";
+App::$strings["No entries (some entries may be hidden)."] = "Keine Einträge gefunden (einige könnten versteckt sein).";
+App::$strings["Xchan Lookup"] = "Xchan-Suche";
+App::$strings["Lookup xchan beginning with (or webbie): "] = "Nach xchans oder Webbies (Kanal-Adressen) suchen, die wie folgt beginnen:";
App::$strings["No suggestions available. If this is a new site, please try again in 24 hours."] = "Keine Vorschläge vorhanden. Wenn das ein neuer Server ist, versuche es in 24 Stunden noch einmal.";
App::$strings["Ignore/Hide"] = "Ignorieren/Verstecken";
-App::$strings["post"] = "Beitrag";
-App::$strings["comment"] = "Kommentar";
-App::$strings["%1\$s tagged %2\$s's %3\$s with %4\$s"] = "%1\$s hat %2\$ss %3\$s mit %4\$s verschlagwortet";
-App::$strings["Additional Features"] = "Zusätzliche Funktionen";
-App::$strings["Name is required"] = "Name ist erforderlich";
-App::$strings["Key and Secret are required"] = "Schlüssel und Geheimnis werden benötigt";
-App::$strings["Add application"] = "Anwendung hinzufügen";
-App::$strings["Name of application"] = "Name der Anwendung";
-App::$strings["Consumer Key"] = "Consumer Key";
-App::$strings["Automatically generated - change if desired. Max length 20"] = "Automatisch erzeugt – ändern, falls erwünscht. Maximale Länge 20";
-App::$strings["Consumer Secret"] = "Consumer Secret";
-App::$strings["Redirect"] = "Umleitung";
-App::$strings["Redirect URI - leave blank unless your application specifically requires this"] = "Umleitungs-URl – lasse das leer, solange Deine Anwendung es nicht explizit erfordert";
-App::$strings["Icon url"] = "Symbol-URL";
-App::$strings["Application not found."] = "Die Anwendung wurde nicht gefunden.";
-App::$strings["Connected Apps"] = "Verbundene Apps";
-App::$strings["Client key starts with"] = "Client Key beginnt mit";
-App::$strings["No name"] = "Kein Name";
-App::$strings["Remove authorization"] = "Authorisierung aufheben";
-App::$strings["Not valid email."] = "Keine gültige E-Mail Adresse.";
-App::$strings["Protected email address. Cannot change to that email."] = "Geschützte E-Mail Adresse. Diese kann nicht verändert werden.";
-App::$strings["System failure storing new email. Please try again."] = "Systemfehler während des Speicherns der neuen Mail. Bitte versuche es noch einmal.";
-App::$strings["Technical skill level updated"] = "Technische Qualifikationsstufe aktualisiert";
-App::$strings["Password verification failed."] = "Passwortüberprüfung fehlgeschlagen.";
-App::$strings["Passwords do not match. Password unchanged."] = "Kennwörter stimmen nicht überein. Kennwort nicht verändert.";
-App::$strings["Empty passwords are not allowed. Password unchanged."] = "Leere Kennwörter sind nicht erlaubt. Kennwort nicht verändert.";
-App::$strings["Password changed."] = "Kennwort geändert.";
-App::$strings["Password update failed. Please try again."] = "Kennwortänderung fehlgeschlagen. Bitte versuche es noch einmal.";
-App::$strings["Account Settings"] = "Konto-Einstellungen";
-App::$strings["Current Password"] = "Aktuelles Passwort";
-App::$strings["Enter New Password"] = "Gib ein neues Passwort ein";
-App::$strings["Confirm New Password"] = "Bestätige das neue Passwort";
-App::$strings["Leave password fields blank unless changing"] = "Lasse die Passwort-Felder leer, außer Du möchtest das Passwort ändern";
-App::$strings["Your technical skill level"] = "Deine technische Qualifikationsstufe";
-App::$strings["Used to provide a member experience matched to your comfort level"] = "Dies wird verwendet, um Dir eine Benutzererfahrung passend zu Deiner technischen Qualifikationsstufe zu bieten.";
-App::$strings["Email Address:"] = "Email Adresse:";
-App::$strings["Remove this account including all its channels"] = "Dieses Konto inklusive all seiner Kanäle löschen";
-App::$strings["This channel is limited to %d tokens"] = "Dieser Kanal ist auf %d Token begrenzt";
-App::$strings["Name and Password are required."] = "Name und Passwort sind erforderlich.";
-App::$strings["Token saved."] = "Token gespeichert.";
-App::$strings["Use this form to create temporary access identifiers to share things with non-members. These identities may be used in Access Control Lists and visitors may login using these credentials to access private content."] = "Mit diesem Formular kannst Du temporäre Zugangs-IDs anlegen, um Inhalte mit Nicht-Mitgliedern zu teilen. Die IDs können in Berechtigungslisten (ACLs) verwendet werden, und Besucher können sich damit einloggen, um auf private Inhalte zuzugreifen.";
-App::$strings["You may also provide <em>dropbox</em> style access links to friends and associates by adding the Login Password to any specific site URL as shown. Examples:"] = "Du kannst auch <em>Dropbox</em>-ähnliche Zugriffslinks an Andere weitergeben, indem du das Login-Passwort an eine entsprechende URL anhängst wie nachfolgend gezeigt. Beispiele:";
-App::$strings["Guest Access Tokens"] = "Gastzugangstoken";
-App::$strings["Login Name"] = "Anmeldename";
-App::$strings["Login Password"] = "Anmeldepasswort";
-App::$strings["Expires (yyyy-mm-dd)"] = "Läuft ab (jjjj-mm-tt)";
-App::$strings["Affinity Slider settings updated."] = "Die Beziehungsgrad-Schieberegler-Einstellungen wurden aktualisiert.";
-App::$strings["No feature settings configured"] = "Keine Funktions-Einstellungen konfiguriert";
-App::$strings["Default maximum affinity level"] = "Voreinstellung für maximalen Beziehungsgrad";
-App::$strings["Default minimum affinity level"] = "Voreinstellung für minimalen Beziehungsgrad";
-App::$strings["Affinity Slider Settings"] = "Beziehungsgrad-Schieberegler-Einstellungen";
-App::$strings["Feature/Addon Settings"] = "Funktions-/Addon-Einstellungen";
-App::$strings["Settings updated."] = "Einstellungen aktualisiert.";
-App::$strings["Nobody except yourself"] = "Niemand außer Dir selbst";
-App::$strings["Only those you specifically allow"] = "Nur die, denen Du es explizit erlaubst";
-App::$strings["Approved connections"] = "Angenommene Verbindungen";
-App::$strings["Any connections"] = "Beliebige Verbindungen";
-App::$strings["Anybody on this website"] = "Jeder auf dieser Website";
-App::$strings["Anybody in this network"] = "Alle \$Projectname-Mitglieder";
-App::$strings["Anybody authenticated"] = "Jeder authentifizierte";
-App::$strings["Anybody on the internet"] = "Jeder im Internet";
-App::$strings["Publish your default profile in the network directory"] = "Standard-Profil im Netzwerk-Verzeichnis veröffentlichen";
-App::$strings["Allow us to suggest you as a potential friend to new members?"] = "Dürfen wir Dich neuen Mitgliedern als potentiellen Kontakt vorschlagen?";
-App::$strings["Your channel address is"] = "Deine Kanal-Adresse lautet";
-App::$strings["Your files/photos are accessible via WebDAV at"] = "Deine Dateien/Fotos sind via WebDAV verfügbar auf";
-App::$strings["Channel Settings"] = "Kanal-Einstellungen";
-App::$strings["Basic Settings"] = "Grundeinstellungen";
-App::$strings["Full Name:"] = "Voller Name:";
-App::$strings["Your Timezone:"] = "Ihre Zeitzone:";
-App::$strings["Default Post Location:"] = "Standardstandort:";
-App::$strings["Geographical location to display on your posts"] = "Geografischer Ort, der bei Deinen Beiträgen angezeigt werden soll";
-App::$strings["Use Browser Location:"] = "Standort des Browsers verwenden:";
-App::$strings["Adult Content"] = "Nicht jugendfreie Inhalte";
-App::$strings["This channel frequently or regularly publishes adult content. (Please tag any adult material and/or nudity with #NSFW)"] = "Dieser Kanal veröffentlicht regelmäßig Inhalte, die für Minderjährige ungeeignet sind. (Bitte markiere solche Inhalte mit dem Schlagwort #NSFW)";
-App::$strings["Security and Privacy Settings"] = "Sicherheits- und Datenschutz-Einstellungen";
-App::$strings["Your permissions are already configured. Click to view/adjust"] = "Deine Zugriffsrechte sind schon konfiguriert. Klicke hier, um sie zu betrachten oder zu ändern";
-App::$strings["Hide my online presence"] = "Meine Online-Präsenz verbergen";
-App::$strings["Prevents displaying in your profile that you are online"] = "Verhindert die Anzeige Deines Online-Status in deinem Profil";
-App::$strings["Simple Privacy Settings:"] = "Einfache Privatsphäre-Einstellungen";
-App::$strings["Very Public - <em>extremely permissive (should be used with caution)</em>"] = "Komplett offen – <em>extrem ungeschützt (mit großer Vorsicht verwenden!)</em>";
-App::$strings["Typical - <em>default public, privacy when desired (similar to social network permissions but with improved privacy)</em>"] = "Typisch – <em>Standard öffentlich, Privatsphäre, wo sie erwünscht ist (ähnlich den Einstellungen in sozialen Netzwerken, aber mit besser geschützter Privatsphäre)</em>";
-App::$strings["Private - <em>default private, never open or public</em>"] = "Privat – <em>Standard privat, nie offen oder öffentlich</em>";
-App::$strings["Blocked - <em>default blocked to/from everybody</em>"] = "Blockiert – <em>Alle standardmäßig blockiert</em>";
-App::$strings["Allow others to tag your posts"] = "Erlaube anderen, Deine Beiträge zu verschlagworten";
-App::$strings["Often used by the community to retro-actively flag inappropriate content"] = "Wird oft von der Community genutzt um rückwirkend anstößigen Inhalt zu markieren";
-App::$strings["Channel Permission Limits"] = "Kanal-Berechtigungslimits";
-App::$strings["Expire other channel content after this many days"] = "Den Inhalt anderer Kanäle nach dieser Anzahl Tage verfallen lassen";
-App::$strings["0 or blank to use the website limit."] = "0 oder leer lassen, um den voreingestellten Wert der Webseite zu verwenden.";
-App::$strings["This website expires after %d days."] = "Diese Webseite läuft nach %d Tagen ab.";
-App::$strings["This website does not expire imported content."] = "Diese Webseite lässt importierte Inhalte nicht verfallen.";
-App::$strings["The website limit takes precedence if lower than your limit."] = "Das Verfallslimit der Webseite hat Vorrang, wenn es niedriger als Deines hier ist.";
-App::$strings["Maximum Friend Requests/Day:"] = "Maximale Kontaktanfragen pro Tag:";
-App::$strings["May reduce spam activity"] = "Kann die Spam-Aktivität verringern";
-App::$strings["Default Access Control List (ACL)"] = "Standard-Zugriffsberechtigungsliste (ACL)";
-App::$strings["Use my default audience setting for the type of object published"] = "Verwende Deine eingestellte Standard-Zielgruppe des jeweiligen Inhaltstyps";
-App::$strings["Channel permissions category:"] = "Zugriffsrechte-Kategorie des Kanals:";
-App::$strings["Default Permissions Group"] = "Standard-Berechtigungsgruppe";
-App::$strings["Maximum private messages per day from unknown people:"] = "Maximale Anzahl privater Nachrichten pro Tag von unbekannten Leuten:";
-App::$strings["Useful to reduce spamming"] = "Nützlich, um Spam zu verringern";
-App::$strings["Notification Settings"] = "Benachrichtigungs-Einstellungen";
-App::$strings["By default post a status message when:"] = "Sende standardmäßig Status-Nachrichten, wenn:";
-App::$strings["accepting a friend request"] = "Du eine Verbindungsanfrage annimmst";
-App::$strings["joining a forum/community"] = "Du einem Forum beitrittst";
-App::$strings["making an <em>interesting</em> profile change"] = "Du eine <em>interessante</em> Änderung an Deinem Profil vornimmst";
-App::$strings["Send a notification email when:"] = "Eine E-Mail-Benachrichtigung senden, wenn:";
-App::$strings["You receive a connection request"] = "Du eine Verbindungsanfrage erhältst";
-App::$strings["Your connections are confirmed"] = "Eine Verbindung bestätigt wurde";
-App::$strings["Someone writes on your profile wall"] = "Jemand auf Deine Pinnwand schreibt";
-App::$strings["Someone writes a followup comment"] = "Jemand einen Beitrag kommentiert";
-App::$strings["You receive a private message"] = "Du eine private Nachricht erhältst";
-App::$strings["You receive a friend suggestion"] = "Du einen Kontaktvorschlag erhältst";
-App::$strings["You are tagged in a post"] = "Du in einem Beitrag erwähnt wurdest";
-App::$strings["You are poked/prodded/etc. in a post"] = "Du in einem Beitrag angestupst/geknufft/o.ä. wurdest";
-App::$strings["Someone likes your post/comment"] = "Jemand mag Ihren Beitrag/Kommentar";
-App::$strings["Show visual notifications including:"] = "Visuelle Benachrichtigungen anzeigen für:";
-App::$strings["Unseen grid activity"] = "Ungesehene Netzwerk-Aktivität";
-App::$strings["Unseen channel activity"] = "Ungesehene Kanal-Aktivität";
-App::$strings["Unseen private messages"] = "Ungelesene persönliche Nachrichten";
-App::$strings["Recommended"] = "Empfohlen";
-App::$strings["Upcoming events"] = "Baldige Termine";
-App::$strings["Events today"] = "Heutige Termine";
-App::$strings["Upcoming birthdays"] = "Baldige Geburtstage";
-App::$strings["Not available in all themes"] = "Nicht in allen Themes verfügbar";
-App::$strings["System (personal) notifications"] = "System – (persönliche) Benachrichtigungen";
-App::$strings["System info messages"] = "System – Info-Nachrichten";
-App::$strings["System critical alerts"] = "System – kritische Warnungen";
-App::$strings["New connections"] = "Neue Verbindungen";
-App::$strings["System Registrations"] = "System – Registrierungen";
-App::$strings["Also show new wall posts, private messages and connections under Notices"] = "Neue Pinnwand-Nachrichten, private Nachrichten und Verbindungen unter Benachrichtigungen anzeigen";
-App::$strings["Notify me of events this many days in advance"] = "Benachrichtige mich zu Terminen so viele Tage im Voraus";
-App::$strings["Must be greater than 0"] = "Muss größer als 0 sein";
-App::$strings["Advanced Account/Page Type Settings"] = "Erweiterte Account- und Seitenart-Einstellungen";
-App::$strings["Change the behaviour of this account for special situations"] = "Ändere das Verhalten dieses Accounts unter speziellen Umständen";
-App::$strings["Miscellaneous Settings"] = "Sonstige Einstellungen";
-App::$strings["Default photo upload folder"] = "Voreingestellter Ordner für hochgeladene Fotos";
-App::$strings["%Y - current year, %m - current month"] = "%Y - aktuelles Jahr, %m - aktueller Monat";
-App::$strings["Default file upload folder"] = "Voreingestellter Ordner für hochgeladene Dateien";
-App::$strings["Personal menu to display in your channel pages"] = "Eigenes Menü zur Anzeige auf den Seiten deines Kanals";
-App::$strings["Remove this channel."] = "Diesen Kanal löschen";
-App::$strings["Firefox Share \$Projectname provider"] = "\$Projectname-Provider für Firefox Share";
-App::$strings["Start calendar week on monday"] = "Montag als erster Tag der Kalenderwoche";
-App::$strings["No special theme for mobile devices"] = "Keine spezielle Theme für mobile Geräte";
-App::$strings["%s - (Experimental)"] = "%s – (experimentell)";
-App::$strings["Display Settings"] = "Anzeige-Einstellungen";
-App::$strings["Theme Settings"] = "Theme-Einstellungen";
-App::$strings["Custom Theme Settings"] = "Benutzerdefinierte Theme-Einstellungen";
-App::$strings["Content Settings"] = "Inhaltseinstellungen";
-App::$strings["Display Theme:"] = "Anzeige-Theme:";
-App::$strings["Select scheme"] = "Schema wählen";
-App::$strings["Mobile Theme:"] = "Mobile Theme:";
-App::$strings["Preload images before rendering the page"] = "Bilder im voraus laden, bevor die Seite angezeigt wird";
-App::$strings["The subjective page load time will be longer but the page will be ready when displayed"] = "Die empfundene Ladezeit wird sich erhöhen, aber dafür ist das Layout stabil, sobald eine Seite angezeigt wird";
-App::$strings["Enable user zoom on mobile devices"] = "Zoom auf Mobilgeräten aktivieren";
-App::$strings["Update browser every xx seconds"] = "Browser alle xx Sekunden aktualisieren";
-App::$strings["Minimum of 10 seconds, no maximum"] = "Minimum 10 Sekunden, kein Maximum";
-App::$strings["Maximum number of conversations to load at any time:"] = "Maximale Anzahl von Unterhaltungen, die auf einmal geladen werden sollen:";
-App::$strings["Maximum of 100 items"] = "Maximum: 100 Beiträge";
-App::$strings["Show emoticons (smilies) as images"] = "Emoticons (Smilies) als Bilder anzeigen";
-App::$strings["Manual conversation updates"] = "Manuelle Konversationsaktualisierung";
-App::$strings["Default is on, turning this off may increase screen jumping"] = "Voreinstellung ist An, dies abzuschalten kann das unerwartete Springen der Seitenanzeige erhöhen.";
-App::$strings["Link post titles to source"] = "Beitragstitel zum Originalbeitrag verlinken";
-App::$strings["System Page Layout Editor - (advanced)"] = "System-Seitenlayout-Editor (für Experten)";
-App::$strings["Use blog/list mode on channel page"] = "Blog-/Listenmodus auf der Kanalseite verwenden";
-App::$strings["(comments displayed separately)"] = "(Kommentare werden separat angezeigt)";
-App::$strings["Use blog/list mode on grid page"] = "Blog-/Listenmodus auf der Netzwerkseite verwenden";
-App::$strings["Channel page max height of content (in pixels)"] = "Maximale Höhe von Beitragsblöcken auf der Kanalseite (in Pixeln)";
-App::$strings["click to expand content exceeding this height"] = "Blöcke, deren Inhalt diese Höhe überschreitet, können per Klick vergrößert werden.";
-App::$strings["Grid page max height of content (in pixels)"] = "Maximale Höhe (in Pixel) des Inhalts der Netzwerkseite";
-App::$strings["Permission category saved."] = "Berechtigungsrolle gespeichert.";
-App::$strings["Use this form to create permission rules for various classes of people or connections."] = "Verwende dieses Formular, um Berechtigungsrollen für verschiedene Gruppen von Personen oder Verbindungen zu erstellen.";
-App::$strings["Permission Categories"] = "Berechtigungsrollen";
-App::$strings["Permission Name"] = "Name der Berechtigungsrolle";
-App::$strings["Tag removed"] = "Schlagwort entfernt";
-App::$strings["Remove Item Tag"] = "Schlagwort entfernen";
-App::$strings["Select a tag to remove: "] = "Schlagwort zum Entfernen auswählen:";
-App::$strings["Thing updated"] = "Sache aktualisiert";
-App::$strings["Object store: failed"] = "Speichern des Objekts fehlgeschlagen";
-App::$strings["Thing added"] = "Sache hinzugefügt";
-App::$strings["OBJ: %1\$s %2\$s %3\$s"] = "OBJ: %1\$s %2\$s %3\$s";
-App::$strings["Show Thing"] = "Sache anzeigen";
-App::$strings["item not found."] = "Eintrag nicht gefunden";
-App::$strings["Edit Thing"] = "Sache bearbeiten";
-App::$strings["Select a profile"] = "Wähle ein Profil";
-App::$strings["Post an activity"] = "Aktivitätsnachricht senden";
-App::$strings["Only sends to viewers of the applicable profile"] = "Nur an Betrachter des ausgewählten Profils senden";
-App::$strings["Name of thing e.g. something"] = "Name der Sache, z. B. irgendwas";
-App::$strings["URL of thing (optional)"] = "URL der Sache (optional)";
-App::$strings["URL for photo of thing (optional)"] = "URL eines Fotos der Sache (optional)";
-App::$strings["Add Thing to your Profile"] = "Die Sache Deinem Profil hinzufügen";
+App::$strings["Unable to find your hub."] = "Konnte Deinen Server nicht finden.";
+App::$strings["Post successful."] = "Veröffentlichung erfolgreich.";
App::$strings["Unable to lookup recipient."] = "Konnte den Empfänger nicht finden.";
App::$strings["Unable to communicate with requested channel."] = "Die Kommunikation mit dem ausgewählten Kanal ist fehlgeschlagen.";
App::$strings["Cannot verify requested channel."] = "Verifizierung des angeforderten Kanals fehlgeschlagen.";
App::$strings["Selected channel has private message restrictions. Send failed."] = "Der ausgewählte Kanal hat Einschränkungen bzgl. privater Nachrichten. Senden fehlgeschlagen.";
App::$strings["Messages"] = "Nachrichten";
+App::$strings["message"] = "Nachricht";
App::$strings["Message recalled."] = "Nachricht widerrufen.";
App::$strings["Conversation removed."] = "Unterhaltung gelöscht.";
-App::$strings["Please enter a link URL:"] = "Gib eine URL ein:";
App::$strings["Expires YYYY-MM-DD HH:MM"] = "Verfällt YYYY-MM-DD HH;MM";
App::$strings["Requested channel is not in this network"] = "Angeforderter Kanal ist nicht in diesem Netzwerk.";
App::$strings["Send Private Message"] = "Private Nachricht senden";
@@ -1508,7 +1394,6 @@ App::$strings["Subject:"] = "Betreff:";
App::$strings["Attach file"] = "Datei anhängen";
App::$strings["Send"] = "Absenden";
App::$strings["Set expiration date"] = "Verfallsdatum";
-App::$strings["Encrypt text"] = "Text verschlüsseln";
App::$strings["Delete message"] = "Nachricht löschen";
App::$strings["Delivery report"] = "Zustellungsbericht";
App::$strings["Recall message"] = "Nachricht widerrufen";
@@ -1517,25 +1402,195 @@ App::$strings["Delete Conversation"] = "Unterhaltung löschen";
App::$strings["No secure communications available. You <strong>may</strong> be able to respond from the sender's profile page."] = "Keine sichere Kommunikation verfügbar. <strong>Eventuell</strong> kannst Du auf der Profilseite des Absenders antworten.";
App::$strings["Send Reply"] = "Antwort senden";
App::$strings["Your message for %s (%s):"] = "Deine Nachricht für %s (%s):";
+App::$strings["Public Hubs"] = "Öffentliche Hubs";
+App::$strings["The listed hubs allow public registration for the \$Projectname network. All hubs in the network are interlinked so membership on any of them conveys membership in the network as a whole. Some hubs may require subscription or provide tiered service plans. The hub itself <strong>may</strong> provide additional details."] = "Die hier aufgeführten Hubs sind öffentlich und erlauben die Registrierung im \$Projectname Netzwerk. Alle Hubs dieses Netzwerks sind miteinander verbunden, so dass die Mitgliedschaft auf einem Hub die Verbindung zu beliebigen Seiten und Kanälen auf anderen Hubs ermöglicht. Es könnte sein, dass einige dieser Hubs kostenpflichtig sind oder abgestufte, je nach Umfang kostenpflichtige Mitgliedschaften anbieten. Auf den Seiten der einzelnen Hubs <strong>könnten</strong> jeweils nähere Informationen dazu stehen.";
+App::$strings["Hub URL"] = "Hub-URL";
+App::$strings["Access Type"] = "Zugriffstyp";
+App::$strings["Registration Policy"] = "Registrierungsrichtlinien";
+App::$strings["Stats"] = "Statistiken";
+App::$strings["Software"] = "Software";
+App::$strings["Rate"] = "Bewerten";
+App::$strings["webpage"] = "Webseite";
+App::$strings["block"] = "Block";
+App::$strings["layout"] = "Layout";
+App::$strings["menu"] = "Menü";
+App::$strings["%s element installed"] = "Element für %s installiert";
+App::$strings["%s element installation failed"] = "Installation des Elements %s fehlgeschlagen";
+App::$strings["Select a bookmark folder"] = "Lesezeichenordner wählen";
+App::$strings["Save Bookmark"] = "Lesezeichen speichern";
+App::$strings["URL of bookmark"] = "URL des Lesezeichens";
+App::$strings["Or enter new bookmark folder name"] = "Oder gib einen neuen Namen für den Lesezeichenordner ein";
+App::$strings["Enter a folder name"] = "Gib einen Ordnernamen ein";
+App::$strings["or select an existing folder (doubleclick)"] = "oder wähle einen vorhanden Ordner aus (Doppelklick)";
+App::$strings["Save to Folder"] = "In Ordner speichern";
+App::$strings["Fetching URL returns error: %1\$s"] = "Abrufen der URL gab einen Fehler zurück: %1\$s";
+App::$strings["Maximum daily site registrations exceeded. Please try again tomorrow."] = "Maximale Anzahl täglicher Neuanmeldungen erreicht. Bitte versuche es morgen noch einmal.";
+App::$strings["Please indicate acceptance of the Terms of Service. Registration failed."] = "Bitte stimme den Nutzungsbedingungen zu. Registrierung fehlgeschlagen.";
+App::$strings["Passwords do not match."] = "Passwörter stimmen nicht überein.";
+App::$strings["Registration successful. Please check your email for validation instructions."] = "Registrierung erfolgreich. Eine E-Mail mit weiteren Anweisungen wurde an Dich gesendet.";
+App::$strings["Your registration is pending approval by the site owner."] = "Deine Registrierung muss noch vom Betreiber der Seite freigegeben werden.";
+App::$strings["Your registration can not be processed."] = "Deine Registrierung konnte nicht verarbeitet werden.";
+App::$strings["Registration on this hub is disabled."] = "Die Registrierung auf diesem Hub ist nicht möglich.";
+App::$strings["Registration on this hub is by approval only."] = "Eine Registrierung auf diesem Hub erfordert die Zustimmung durch den Administrator.";
+App::$strings["<a href=\"pubsites\">Register at another affiliated hub.</a>"] = "<a href=\"pubsites\">Registriere Dich auf einem der anderen verbundenen Hubs.</a>";
+App::$strings["This site has exceeded the number of allowed daily account registrations. Please try again tomorrow."] = "Die maximale Anzahl täglicher Registrierungen auf diesem Server wurde überschritten. Bitte versuche es morgen noch einmal.";
+App::$strings["I accept the %s for this website"] = "Ich akzeptiere die %s für diese Webseite";
+App::$strings["I am over 13 years of age and accept the %s for this website"] = "Ich bin älter als 13 Jahre und akzeptiere die %s dieser Webseite";
+App::$strings["Your email address"] = "Ihre E-Mail Adresse";
+App::$strings["Choose a password"] = "Passwort";
+App::$strings["Please re-enter your password"] = "Bitte gib Dein Passwort noch einmal ein";
+App::$strings["Please enter your invitation code"] = "Bitte trage Deinen Einladungs-Code ein";
+App::$strings["no"] = "nein";
+App::$strings["yes"] = "ja";
+App::$strings["Membership on this site is by invitation only."] = "Mitgliedschaft auf dieser Seite ist nur nach vorheriger Einladung möglich.";
+App::$strings["Register"] = "Registrieren";
+App::$strings["This site may require email verification after submitting this form. If you are returned to a login page, please check your email for instructions."] = "Diese Seite verlangt möglicherweise eine Emailbestätigung nach dem Absenden des Formulars. Wenn Du auf eine Login-Seite zurückgeleitet wirst, prüfe bitte Deinen Posteingang auf neue Mails mit entsprechenden Hinweisen.";
+App::$strings["Cover Photos"] = "Cover Foto";
+App::$strings["female"] = "weiblich";
+App::$strings["%1\$s updated her %2\$s"] = "%1\$s hat ihr %2\$s aktualisiert";
+App::$strings["male"] = "männlich";
+App::$strings["%1\$s updated his %2\$s"] = "%1\$s hat sein %2\$s aktualisiert";
+App::$strings["%1\$s updated their %2\$s"] = "%1\$s hat sein/ihr %2\$s aktualisiert";
+App::$strings["cover photo"] = "Cover Foto";
+App::$strings["Upload Cover Photo"] = "Cover Foto hochladen";
+App::$strings["Documentation Search"] = "Suche in der Dokumentation";
+App::$strings["About"] = "Ãœber";
+App::$strings["Administrators"] = "Administratoren";
+App::$strings["Developers"] = "Entwickler";
+App::$strings["Tutorials"] = "Tutorials";
+App::$strings["\$Projectname Documentation"] = "\$Projectname-Dokumentation";
+App::$strings["Contents"] = "Inhalt";
+App::$strings["Tag removed"] = "Schlagwort entfernt";
+App::$strings["Remove Item Tag"] = "Schlagwort entfernen";
+App::$strings["Select a tag to remove: "] = "Schlagwort zum Entfernen auswählen:";
+App::$strings["No such group"] = "Gruppe nicht gefunden";
+App::$strings["No such channel"] = "Kanal nicht gefunden";
+App::$strings["forum"] = "Forum";
+App::$strings["Search Results For:"] = "Suchergebnisse für:";
+App::$strings["Privacy group is empty"] = "Gruppe ist leer";
+App::$strings["Privacy group: "] = "Gruppe:";
+App::$strings["Invalid connection."] = "Ungültige Verbindung.";
+App::$strings["Invalid channel."] = "Ungültiger Kanal.";
+App::$strings["network"] = "Netzwerk";
+App::$strings["RSS"] = "RSS";
+App::$strings["\$Projectname"] = "\$Projectname";
+App::$strings["Welcome to %s"] = "Willkommen auf %s";
+App::$strings["Permission Denied."] = "Zugriff verweigert.";
+App::$strings["File not found."] = "Datei nicht gefunden.";
+App::$strings["Edit file permissions"] = "Dateiberechtigungen bearbeiten";
+App::$strings["Set/edit permissions"] = "Berechtigungen setzen/ändern";
+App::$strings["Include all files and sub folders"] = "Alle Dateien und Unterverzeichnisse einbinden";
+App::$strings["Return to file list"] = "Zurück zur Dateiliste";
+App::$strings["Copy/paste this code to attach file to a post"] = "Diesen Code kopieren und einfügen, um die Datei an einen Beitrag anzuhängen";
+App::$strings["Copy/paste this URL to link file from a web page"] = "Diese URL verwenden, um von einer Webseite aus auf die Datei zu verlinken";
+App::$strings["Share this file"] = "Diese Datei freigeben";
+App::$strings["Show URL to this file"] = "URL zu dieser Datei anzeigen";
+App::$strings["Notify your contacts about this file"] = "Meine Kontakte über diese Datei benachrichtigen";
+App::$strings["No channel."] = "Kein Kanal.";
+App::$strings["Common connections"] = "Gemeinsame Verbindungen";
+App::$strings["No connections in common."] = "Keine gemeinsamen Verbindungen.";
App::$strings["No connections."] = "Keine Verbindungen.";
App::$strings["Visit %s's profile [%s]"] = "%ss Profil [%s] besuchen";
App::$strings["View Connections"] = "Verbindungen anzeigen";
-App::$strings["Source of Item"] = "Quelle des Elements";
-App::$strings["Room not found"] = "Chatraum nicht gefunden";
-App::$strings["Leave Room"] = "Raum verlassen";
-App::$strings["Delete Room"] = "Raum löschen";
-App::$strings["I am away right now"] = "Ich bin gerade nicht da";
-App::$strings["I am online"] = "Ich bin online";
-App::$strings["Bookmark this room"] = "Lesezeichen für diesen Raum setzen";
-App::$strings["New Chatroom"] = "Neuer Chatraum";
-App::$strings["Chatroom name"] = "Chatraumname";
-App::$strings["Expiration of chats (minutes)"] = "Verfall von Chats (Minuten)";
-App::$strings["%1\$s's Chatrooms"] = "%1\$ss Chaträume";
-App::$strings["No chatrooms available"] = "Keine Chaträume verfügbar";
-App::$strings["Expiration"] = "Verfall";
-App::$strings["min"] = "min";
-App::$strings["Xchan Lookup"] = "Xchan-Suche";
-App::$strings["Lookup xchan beginning with (or webbie): "] = "Nach xchans oder Webbies (Kanal-Adressen) suchen, die wie folgt beginnen:";
+App::$strings["# Accounts"] = "Anzahl der Konten";
+App::$strings["# blocked accounts"] = "Anzahl der blockierten Konten";
+App::$strings["# expired accounts"] = "Anzahl der abgelaufenen Konten";
+App::$strings["# expiring accounts"] = "Anzahl der ablaufenden Konten";
+App::$strings["# Channels"] = "Anzahl der Kanäle";
+App::$strings["# primary"] = "Anzahl der primären Kanäle";
+App::$strings["# clones"] = "Anzahl der Klone";
+App::$strings["Message queues"] = "Nachrichten-Warteschlangen";
+App::$strings["Your software should be updated"] = "Die installierte Software sollte aktualisiert werden";
+App::$strings["Summary"] = "Zusammenfassung";
+App::$strings["Registered accounts"] = "Registrierte Konten";
+App::$strings["Pending registrations"] = "Ausstehende Registrierungen";
+App::$strings["Registered channels"] = "Registrierte Kanäle";
+App::$strings["Active plugins"] = "Aktive Plug-Ins";
+App::$strings["Version"] = "Version";
+App::$strings["Repository version (master)"] = "Repository-Version (master)";
+App::$strings["Repository version (dev)"] = "Repository-Version (dev)";
+App::$strings["No service class restrictions found."] = "Keine Dienstklassenbeschränkungen gefunden.";
+App::$strings["Website:"] = "Webseite:";
+App::$strings["Remote Channel [%s] (not yet known on this site)"] = "Kanal [%s] (auf diesem Server noch unbekannt)";
+App::$strings["Rating (this information is public)"] = "Bewertung (öffentlich sichtbar)";
+App::$strings["Optionally explain your rating (this information is public)"] = "Optional kannst du deine Bewertung erklären (öffentlich sichtbar)";
+App::$strings["No valid account found."] = "Kein gültiges Konto gefunden.";
+App::$strings["Password reset request issued. Check your email."] = "Zurücksetzen des Passworts eingeleitet. Schau in Deine E-Mails.";
+App::$strings["Site Member (%s)"] = "Nutzer (%s)";
+App::$strings["Password reset requested at %s"] = "Passwort-Rücksetzung auf %s angefordert";
+App::$strings["Request could not be verified. (You may have previously submitted it.) Password reset failed."] = "Die Anfrage konnte nicht verifiziert werden. (Vielleicht hast Du schon einmal auf den Link in der E-Mail geklickt?) Passwort-Rücksetzung fehlgeschlagen.";
+App::$strings["Password Reset"] = "Zurücksetzen des Kennworts";
+App::$strings["Your password has been reset as requested."] = "Dein Passwort wurde wie angefordert neu erstellt.";
+App::$strings["Your new password is"] = "Dein neues Passwort lautet";
+App::$strings["Save or copy your new password - and then"] = "Speichere oder kopiere Dein neues Passwort – und dann";
+App::$strings["click here to login"] = "Klicke hier, um dich anzumelden";
+App::$strings["Your password may be changed from the <em>Settings</em> page after successful login."] = "Dein Passwort kann unter <em>Einstellungen</em> nach einer erfolgreichen Anmeldung geändert werden.";
+App::$strings["Your password has changed at %s"] = "Auf %s wurde Dein Passwort geändert";
+App::$strings["Forgot your Password?"] = "Kennwort vergessen?";
+App::$strings["Enter your email address and submit to have your password reset. Then check your email for further instructions."] = "Gib Deine E-Mail-Adresse ein, um Dein Passwort zurücksetzen zu lassen. Du erhältst dann weitere Anweisungen per E-Mail.";
+App::$strings["Email Address"] = "E-Mail Adresse";
+App::$strings["Reset"] = "Zurücksetzen";
+App::$strings["Mark all system notifications seen"] = "Markiere alle System-Benachrichtigungen als gesehen";
+App::$strings["Site Admin"] = "Hub-Administration";
+App::$strings["Report Bug"] = "Fehler melden";
+App::$strings["View Bookmarks"] = "Lesezeichen ansehen";
+App::$strings["My Chatrooms"] = "Meine Chaträume";
+App::$strings["Firefox Share"] = "Teilen-Knopf für Firefox";
+App::$strings["Remote Diagnostics"] = "Ferndiagnose";
+App::$strings["Suggest Channels"] = "Kanäle vorschlagen";
+App::$strings["Login"] = "Anmelden";
+App::$strings["Activity"] = "Aktivität";
+App::$strings["Wiki"] = "Wiki";
+App::$strings["Channel Home"] = "Mein Kanal";
+App::$strings["Events"] = "Termine";
+App::$strings["Directory"] = "Verzeichnis";
+App::$strings["Mail"] = "Mail";
+App::$strings["Chat"] = "Chat";
+App::$strings["Probe"] = "Testen";
+App::$strings["Suggest"] = "Empfehlen";
+App::$strings["Random Channel"] = "Zufälliger Kanal";
+App::$strings["Invite"] = "Einladen";
+App::$strings["Features"] = "Funktionen";
+App::$strings["Language"] = "Sprache";
+App::$strings["Post"] = "Beitrag schreiben";
+App::$strings["Profile Photo"] = "Profilfoto";
+App::$strings["Purchase"] = "Kaufen";
+App::$strings["Undelete"] = "Wieder hergestellt";
+App::$strings["Add to app-tray"] = "Zum App-Menü hinzufügen";
+App::$strings["Remove from app-tray"] = "Aus dem App-Menü entfernen";
+App::$strings["__ctx:permcat__ default"] = "Standard";
+App::$strings["__ctx:permcat__ follower"] = "Abonnent";
+App::$strings["__ctx:permcat__ contributor"] = "Beitragender";
+App::$strings["__ctx:permcat__ publisher"] = "Autor";
+App::$strings["(No Title)"] = "(Kein Titel)";
+App::$strings["Wiki page create failed."] = "Anlegen der Wiki-Seite fehlgeschlagen.";
+App::$strings["Wiki not found."] = "Wiki nicht gefunden.";
+App::$strings["Destination name already exists"] = "Zielname bereits vorhanden";
+App::$strings["Page not found"] = "Seite nicht gefunden";
+App::$strings["Error reading page content"] = "Fehler beim Lesen des Seiteninhalts";
+App::$strings["Error reading wiki"] = "Fehler beim Lesen des Wiki";
+App::$strings["Page update failed."] = "Seitenaktualisierung fehlgeschlagen.";
+App::$strings["Nothing deleted"] = "Nichts gelöscht";
+App::$strings["Compare: object not found."] = "Vergleichen: Objekt nicht gefunden.";
+App::$strings["Page updated"] = "Seite aktualisiert";
+App::$strings["Untitled"] = "Ohne Titel";
+App::$strings["Wiki resource_id required for git commit"] = "Die resource_id des Wiki wird benötigt für den git commit.";
+App::$strings["__ctx:wiki_history__ Message"] = "Nachricht";
+App::$strings["Different viewers will see this text differently"] = "Verschiedene Betrachter werden diesen Text unterschiedlich sehen";
+App::$strings["Visible to your default audience"] = "Standard-Sichtbarkeit gemäß Kanaleinstellungen";
+App::$strings["Only me"] = "Nur ich";
+App::$strings["Public"] = "Öffentlich";
+App::$strings["Anybody in the \$Projectname network"] = "Jeder innerhalb des \$Projectname Netzwerks";
+App::$strings["Any account on %s"] = "Jedes Nutzerkonto auf %s";
+App::$strings["Any of my connections"] = "Alle meine Verbindungen";
+App::$strings["Only connections I specifically allow"] = "Nur Verbindungen, denen ich es explizit erlaube";
+App::$strings["Anybody authenticated (could include visitors from other networks)"] = "Jeder, der angemeldet ist (kann Besucher anderer Netzwerke beinhalten)";
+App::$strings["Any connections including those who haven't yet been approved"] = "Alle Verbindungen einschließlich der noch nicht bestätigten";
+App::$strings["This is your default setting for the audience of your normal stream, and posts."] = "Dies ist Deine Voreinstellung für die Sichtbarkeit Deiner normalen Beiträge (Stream).";
+App::$strings["This is your default setting for who can view your default channel profile"] = "Dies ist Deine Voreinstellung für die Sichtbarkeit Deines Standard-Kanalprofils.";
+App::$strings["This is your default setting for who can view your connections"] = "Dies ist Deine Voreinstellung für die Sichtbarkeit Deiner Verbindungen.";
+App::$strings["This is your default setting for who can view your file storage and photos"] = "Dies ist Deine Voreinstellung für die Sichtbarkeit Deiner Dateien und Fotos.";
+App::$strings["This is your default setting for the audience of your webpages"] = "Dies ist Deine Voreinstellung für die Sichtbarkeit Deiner Webseiten.";
App::$strings["Missing room name"] = "Der Chatraum hat keinen Namen";
App::$strings["Duplicate room name"] = "Name des Chatraums bereits vergeben";
App::$strings["Invalid room specifier."] = "Ungültiger Raumbezeichner.";
@@ -1557,7 +1612,7 @@ App::$strings["%1\$s, %2\$s commented on [zrl=%3\$s]your %4\$s[/zrl]"] = "%1\$s,
App::$strings["[\$Projectname:Notify] Comment to conversation #%1\$d by %2\$s"] = "[\$Projectname:Benachrichtigung] Kommentar in Unterhaltung #%1\$d von %2\$s";
App::$strings["%1\$s, %2\$s commented on an item/conversation you have been following."] = "%1\$s, %2\$s hat eine Unterhaltung kommentiert, der Du folgst.";
App::$strings["Please visit %s to view and/or reply to the conversation."] = "Bitte besuche %s, um die Unterhaltung anzusehen und/oder zu kommentieren.";
-App::$strings["%1\$s, %2\$s liked [zrl=%3\$s]your %4\$s[/zrl]"] = "";
+App::$strings["%1\$s, %2\$s liked [zrl=%3\$s]your %4\$s[/zrl]"] = "%1\$s, %2\$s gefällt [zrl=%3\$s]dein %4\$s[/zrl]";
App::$strings["[\$Projectname:Notify] Like received to conversation #%1\$d by %2\$s"] = "[\$Projectname:Benachrichtigung] Gefällt mir in Unterhaltung #%1\$d von %2\$s erhalten";
App::$strings["%1\$s, %2\$s liked an item/conversation you created."] = "%1\$s, %2\$s gefällt ein Beitrag oder eine Unterhaltung von Dir";
App::$strings["[\$Projectname:Notify] %s posted to your profile wall"] = "[\$Projectname:Benachrichtigung] %s schrieb auf Deine Pinnwand";
@@ -1586,23 +1641,11 @@ App::$strings["Please visit %s to approve or reject the suggestion."] = "Bitte b
App::$strings["[\$Projectname:Notify]"] = "[\$Projectname:Benachrichtigung]";
App::$strings["created a new post"] = "Neuer Beitrag wurde erzeugt";
App::$strings["commented on %s's post"] = "hat %s's Beitrag kommentiert";
-App::$strings["Visible to your default audience"] = "Standard-Sichtbarkeit gemäß Kanaleinstellungen";
-App::$strings["Only me"] = "Nur ich";
-App::$strings["Public"] = "Öffentlich";
-App::$strings["Anybody in the \$Projectname network"] = "Jeder innerhalb des \$Projectname Netzwerks";
-App::$strings["Any account on %s"] = "Jedes Nutzerkonto auf %s";
-App::$strings["Any of my connections"] = "Alle meine Verbindungen";
-App::$strings["Only connections I specifically allow"] = "Nur Verbindungen, denen ich es explizit erlaube";
-App::$strings["Anybody authenticated (could include visitors from other networks)"] = "Jeder, der angemeldet ist (kann Besucher anderer Netzwerke beinhalten)";
-App::$strings["Any connections including those who haven't yet been approved"] = "Alle Verbindungen einschließlich der noch nicht bestätigten";
-App::$strings["This is your default setting for the audience of your normal stream, and posts."] = "Dies ist Deine Voreinstellung für die Sichtbarkeit Deiner normalen Beiträge (Stream).";
-App::$strings["This is your default setting for who can view your default channel profile"] = "Dies ist Deine Voreinstellung für die Sichtbarkeit Deines Standard-Kanalprofils.";
-App::$strings["This is your default setting for who can view your connections"] = "Dies ist Deine Voreinstellung für die Sichtbarkeit Deiner Verbindungen.";
-App::$strings["This is your default setting for who can view your file storage and photos"] = "Dies ist Deine Voreinstellung für die Sichtbarkeit Deiner Dateien und Fotos.";
-App::$strings["This is your default setting for the audience of your webpages"] = "Dies ist Deine Voreinstellung für die Sichtbarkeit Deiner Webseiten.";
+App::$strings["Wiki files deleted successfully"] = "Wiki-Dateien erfolgreich gelöscht";
+App::$strings["Update Error at %s"] = "Aktualisierungsfehler auf %s";
+App::$strings["Update %s failed. See error logs."] = "Aktualisierung %s fehlgeschlagen. Details in den Fehlerprotokollen.";
App::$strings["Private Message"] = "Private Nachricht";
App::$strings["Select"] = "Auswählen";
-App::$strings["Save to Folder"] = "In Ordner speichern";
App::$strings["I will attend"] = "Ich werde teilnehmen";
App::$strings["I will not attend"] = "Ich werde nicht teilnehmen";
App::$strings["I might attend"] = "Ich werde vielleicht teilnehmen";
@@ -1649,69 +1692,279 @@ App::$strings["Code"] = "Code";
App::$strings["Image"] = "Bild";
App::$strings["Insert Link"] = "Link einfügen";
App::$strings["Video"] = "Video";
-App::$strings["Site Admin"] = "Hub-Administration";
-App::$strings["Report Bug"] = "Fehler melden";
-App::$strings["View Bookmarks"] = "Lesezeichen ansehen";
-App::$strings["My Chatrooms"] = "Meine Chaträume";
-App::$strings["Firefox Share"] = "Teilen-Knopf für Firefox";
-App::$strings["Remote Diagnostics"] = "Ferndiagnose";
-App::$strings["Suggest Channels"] = "Kanäle vorschlagen";
-App::$strings["Login"] = "Anmelden";
-App::$strings["Grid"] = "Grid";
-App::$strings["Wiki"] = "Wiki";
-App::$strings["Channel Home"] = "Mein Kanal";
-App::$strings["Events"] = "Termine";
-App::$strings["Directory"] = "Verzeichnis";
-App::$strings["Mail"] = "Mail";
-App::$strings["Chat"] = "Chat";
-App::$strings["Probe"] = "Testen";
-App::$strings["Suggest"] = "Empfehlen";
-App::$strings["Random Channel"] = "Zufälliger Kanal";
-App::$strings["Invite"] = "Einladen";
-App::$strings["Features"] = "Funktionen";
-App::$strings["Language"] = "Sprache";
-App::$strings["Post"] = "Beitrag schreiben";
-App::$strings["Profile Photo"] = "Profilfoto";
-App::$strings["Purchase"] = "Kaufen";
-App::$strings["Undelete"] = "Wieder hergestellt";
-App::$strings["Wiki files deleted successfully"] = "Wiki-Dateien erfolgreich gelöscht";
-App::$strings["__ctx:permcat__ default"] = "Standard";
-App::$strings["__ctx:permcat__ follower"] = "Abonnent";
-App::$strings["__ctx:permcat__ contributor"] = "Beitragender";
-App::$strings["__ctx:permcat__ publisher"] = "Autor";
-App::$strings["(No Title)"] = "(Kein Titel)";
-App::$strings["Wiki page create failed."] = "Anlegen der Wiki-Seite fehlgeschlagen.";
-App::$strings["Wiki not found."] = "Wiki nicht gefunden.";
-App::$strings["Destination name already exists"] = "Zielname bereits vorhanden";
-App::$strings["Page not found"] = "Seite nicht gefunden";
-App::$strings["Error reading page content"] = "Fehler beim Lesen des Seiteninhalts";
-App::$strings["Error reading wiki"] = "Fehler beim Lesen des Wiki";
-App::$strings["Page update failed."] = "Seitenaktualisierung fehlgeschlagen.";
-App::$strings["Nothing deleted"] = "Nichts gelöscht";
-App::$strings["Compare: object not found."] = "Vergleichen: Objekt nicht gefunden.";
-App::$strings["Page updated"] = "Seite aktualisiert";
-App::$strings["Untitled"] = "Ohne Titel";
-App::$strings["Wiki resource_id required for git commit"] = "";
-App::$strings["Different viewers will see this text differently"] = "Verschiedene Betrachter werden diesen Text unterschiedlich sehen";
+App::$strings["Remote authentication blocked. You are logged into this site locally. Please logout and retry."] = "Fern-Authentifizierung blockiert. Du bist lokal auf diesem Server angemeldet. Bitte melde Dich ab und versuche es erneut.";
+App::$strings["Welcome %s. Remote authentication successful."] = "Willkommen %s. Entfernte Authentifizierung erfolgreich.";
+App::$strings["parent"] = "Ãœbergeordnetes Verzeichnis";
+App::$strings["Collection"] = "Sammlung";
+App::$strings["Principal"] = "Prinzipal";
+App::$strings["Addressbook"] = "Adressbuch";
+App::$strings["Calendar"] = "Kalender";
+App::$strings["Schedule Inbox"] = "Posteingang für überwachte Kalender";
+App::$strings["Schedule Outbox"] = "Postausgang für überwachte Kalender";
+App::$strings["Total"] = "Summe";
+App::$strings["Shared"] = "Geteilt";
+App::$strings["You are using %1\$s of your available file storage."] = "Sie verwenden %1\$s von Ihrem verfügbaren Dateispeicher.";
+App::$strings["You are using %1\$s of %2\$s available file storage. (%3\$s&#37;)"] = "Sie verwenden %1\$s von %2\$s verfügbarem Dateispeicher. (%3\$s&#37;)";
+App::$strings["WARNING:"] = "WARNUNG:";
+App::$strings["Please use DAV to upload large (video, audio) files.<br>See <a class=\"zrl\" href=\"help/member/member_guide#Cloud_Desktop_Clients\">Cloud Desktop Clients</a>"] = "Bitte verwende DAV, um große Dateien (Audio, Video) hochzuladen.<br>Für weitere Informationen siehe <a class=\"zrl\" href=\"help/member/member_guide#Cloud_Desktop_Clients\">Cloud Desktop Clients</a>";
+App::$strings["Create new folder"] = "Neuen Ordner anlegen";
+App::$strings["Upload file"] = "Datei hochladen";
+App::$strings["Drop files here to immediately upload"] = "Dateien zum sofortigen Hochladen hier fallen lassen";
+App::$strings["Forums"] = "Foren";
+App::$strings["Categories"] = "Kategorien";
+App::$strings["Everything"] = "Alles";
+App::$strings["Events Tools"] = "Kalenderwerkzeuge";
+App::$strings["Export Calendar"] = "Kalender exportieren";
+App::$strings["Import Calendar"] = "Kalender importieren";
+App::$strings["Suggested Chatrooms"] = "Chatraum-Vorschläge";
+App::$strings["Private Mail Menu"] = "Private Nachrichten";
+App::$strings["Combined View"] = "Kombinierte Anzeige";
+App::$strings["Inbox"] = "Eingang";
+App::$strings["Outbox"] = "Ausgang";
+App::$strings["New Message"] = "Neue Nachricht";
+App::$strings["Chatrooms"] = "Chaträume";
+App::$strings["Overview"] = "Ãœbersicht";
+App::$strings["Rating Tools"] = "Bewertungswerkzeuge";
+App::$strings["Rate Me"] = "Bewerte mich";
+App::$strings["View Ratings"] = "Bewertungen ansehen";
+App::$strings["__ctx:widget__ Activity"] = "Aktivität";
+App::$strings["You have %1$.0f of %2$.0f allowed connections."] = "Du bist %1$.0f von maximal %2$.0f erlaubten Verbindungen eingegangen.";
+App::$strings["Add New Connection"] = "Neue Verbindung hinzufügen";
+App::$strings["Enter channel address"] = "Adresse des Kanals eingeben";
+App::$strings["Examples: bob@example.com, https://example.com/barbara"] = "Beispiele: bob@beispiel.com, http://beispiel.com/barbara";
+App::$strings["Wiki List"] = "Wikiliste";
+App::$strings["Archives"] = "Archive";
+App::$strings["Conversations"] = "Konversationen";
+App::$strings["Received Messages"] = "Erhaltene Nachrichten";
+App::$strings["Sent Messages"] = "Gesendete Nachrichten";
+App::$strings["No messages."] = "Keine Nachrichten.";
+App::$strings["Delete conversation"] = "Unterhaltung löschen";
+App::$strings["Chat Members"] = "Chatmitglieder";
+App::$strings["photo/image"] = "Foto/Bild";
+App::$strings["Remove term"] = "Eintrag löschen";
+App::$strings["Saved Searches"] = "Gespeicherte Suchanfragen";
+App::$strings["add"] = "hinzufügen";
+App::$strings["Notes"] = "Notizen";
+App::$strings["Wiki Pages"] = "Wikiseiten";
+App::$strings["Add new page"] = "Neue Seite hinzufügen";
+App::$strings["Page name"] = "Seitenname";
+App::$strings["Refresh"] = "Aktualisieren";
+App::$strings["Tasks"] = "Aufgaben";
+App::$strings["Suggestions"] = "Vorschläge";
+App::$strings["See more..."] = "Mehr anzeigen …";
+App::$strings["Saved Folders"] = "Gespeicherte Ordner";
+App::$strings["Click to show more"] = "Klick, um mehr anzuzeigen";
+App::$strings["Member registrations waiting for confirmation"] = "Nutzer-Anmeldungen, die auf Bestätigung warten";
+App::$strings["Inspect queue"] = "Warteschlange kontrollieren";
+App::$strings["DB updates"] = "DB-Aktualisierungen";
+App::$strings["Admin"] = "Administration";
+App::$strings["Plugin Features"] = "Plug-In Funktionen";
+App::$strings["Account settings"] = "Konto-Einstellungen";
+App::$strings["Channel settings"] = "Kanal-Einstellungen";
+App::$strings["Additional features"] = "Zusätzliche Funktionen";
+App::$strings["Feature/Addon settings"] = "Plugin-Einstellungen";
+App::$strings["Display settings"] = "Anzeige-Einstellungen";
+App::$strings["Manage locations"] = "Klon-Adressen verwalten";
+App::$strings["Export channel"] = "Kanal exportieren";
+App::$strings["Connected apps"] = "Verbundene Apps";
+App::$strings["Permission Groups"] = "Berechtigungsrollen";
+App::$strings["Premium Channel Settings"] = "Premium-Kanal-Einstellungen";
+App::$strings["Bookmarked Chatrooms"] = "Gespeicherte Chatrooms";
+App::$strings["Source channel not found."] = "Quellkanal nicht gefunden.";
+App::$strings["__ctx:opensearch__ Search %1\$s (%2\$s)"] = "Suche %1\$s (%2\$s)";
+App::$strings["__ctx:opensearch__ \$Projectname"] = "\$Projectname";
+App::$strings["Create an account to access services and applications"] = "Erstelle ein Konto, um auf Dienste und Anwendungen zugreifen zu können.";
+App::$strings["Logout"] = "Abmelden";
+App::$strings["Login/Email"] = "Anmelden/E-Mail";
+App::$strings["Password"] = "Kennwort";
+App::$strings["Remember me"] = "Angaben speichern";
+App::$strings["Forgot your password?"] = "Passwort vergessen?";
+App::$strings["toggle mobile"] = "auf/von mobile Ansicht wechseln";
+App::$strings["[\$Projectname] Website SSL error for %s"] = "[\$Projectname] Webseiten-SSL-Fehler für %s";
+App::$strings["Website SSL certificate is not valid. Please correct."] = "Das SSL-Zertifikat der Website ist nicht gültig. Bitte beheben.";
+App::$strings["[\$Projectname] Cron tasks not running on %s"] = "[\$Projectname] Cron-Jobs laufen nicht auf %s";
+App::$strings["Cron/Scheduled tasks not running."] = "Cron-Aufgaben laufen nicht.";
+App::$strings["never"] = "Nie";
+App::$strings["Focus (Hubzilla default)"] = "Focus (Voreinstellung für Hubzilla)";
+App::$strings["Theme settings"] = "Theme-Einstellungen";
+App::$strings["Narrow navbar"] = "Schmale Navigationsleiste";
+App::$strings["Navigation bar background color"] = "Hintergrundfarbe der Navigationsleiste";
+App::$strings["Navigation bar icon color "] = "Farbe für die Icons der Navigationsleiste";
+App::$strings["Navigation bar active icon color "] = "Farbe für aktive Icons der Navigationsleiste";
+App::$strings["Link color"] = "Linkfarbe";
+App::$strings["Set font-color for banner"] = "Farbe der Schrift des Banners";
+App::$strings["Set the background color"] = "Hintergrundfarbe";
+App::$strings["Set the background image"] = "Hintergrundbild";
+App::$strings["Set the background color of items"] = "Hintergrundfarbe für Beiträge";
+App::$strings["Set the background color of comments"] = "Hintergrundfarbe für Kommentare";
+App::$strings["Set font-size for the entire application"] = "Schriftgröße für die gesamte Anwendung";
+App::$strings["Examples: 1rem, 100%, 16px"] = "Beispiele: 1rem, 100%, 16px";
+App::$strings["Set font-color for posts and comments"] = "Schriftfarbe für Beiträge und Kommentare";
+App::$strings["Set radius of corners"] = "Ecken-Radius";
+App::$strings["Example: 4px"] = "Beispiel: 4px";
+App::$strings["Set shadow depth of photos"] = "Schattentiefe von Fotos";
+App::$strings["Set maximum width of content region in pixel"] = "Maximalbreite des Inhaltsbereichs in Pixel festlegen";
+App::$strings["Leave empty for default width"] = "Leer lassen für Standardbreite";
+App::$strings["Left align page content"] = "Seiteninhalt linksbündig anzeigen";
+App::$strings["Set size of conversation author photo"] = "Größe der Avatare von Themenstartern";
+App::$strings["Set size of followup author photos"] = "Größe der Avatare von Kommentatoren";
+App::$strings["Errors encountered deleting database table "] = "Beim Löschen der Datenbanktabelle sind Fehler aufgetreten.";
+App::$strings["Submit Settings"] = "Einstellungen absenden";
+App::$strings["Drop tables when uninstalling?"] = "Lösche Tabellen beim Deinstallieren?";
+App::$strings["If checked, the Rendezvous database tables will be deleted when the plugin is uninstalled."] = "Wenn ausgewählt, werden die Rendezvous-Tabellen in der Datenbank gelöscht, sobald das Plugin deinstalliert wird.";
+App::$strings["Mapbox Access Token"] = "Mapbox Zugangs-Token";
+App::$strings["If you enter a Mapbox access token, it will be used to retrieve map tiles from Mapbox instead of the default OpenStreetMap tile server."] = "Wenn Du ein Mapbox Zugangs-Token eingibst, werden die Kartendaten (Kacheln) damit von Mapbox geladen, anstatt von OpenStreetMap, welches die Voreinstellung ist.";
+App::$strings["Rendezvous"] = "Rendezvous";
+App::$strings["This identity has been deleted by another member due to inactivity. Please press the \"New identity\" button or refresh the page to register a new identity. You may use the same name."] = "Diese Identität wurde von einem anderen Mitglied aufgrund von Inaktivität gelöscht. Bitte klicke auf \"Neue Identität\" oder aktualisiere die Website im Browser, um eine neue Identität zu registrieren. Du kannst dabei den selben Namen verwenden.";
+App::$strings["Welcome to Rendezvous!"] = "Willkommen bei Rendezvous!";
+App::$strings["Enter your name to join this rendezvous. To begin sharing your location with the other members, tap the GPS control. When your location is discovered, a red dot will appear and others will be able to see you on the map."] = "Gib Deinen Namen ein, um diesem Rendezvous beizutreten. Um Deinen Standort mit anderen Mitgliedern zu teilen, klicke auf das GPS Symbol. Sobald Dein Standort ermittelt ist, erscheint ein roter Punkt, und die Anderen werden Dich auf der Karte sehen können.";
+App::$strings["Let's meet here"] = "Lasst uns hier treffen";
+App::$strings["New marker"] = "Neue Markierung";
+App::$strings["Edit marker"] = "Markierung bearbeiten";
+App::$strings["New identity"] = "Neue Identität";
+App::$strings["Delete marker"] = "Markierung löschen";
+App::$strings["Delete member"] = "Mitglied löschen";
+App::$strings["Edit proximity alert"] = "Annäherungsalarm bearbeiten";
+App::$strings["A proximity alert will be issued when this member is within a certain radius of you.<br><br>Enter a radius in meters (0 to disable):"] = "Ein Annäherungsalarm wird ausgelöst werden, sobald sich dieses Mitglied innerhalb eines bestimmten Radius von Dir aufhält.<br><br>Gib einen Radius in Metern ein (0 zum Abschalten der Funktion):";
+App::$strings["distance"] = "Entfernung";
+App::$strings["Proximity alert distance (meters)"] = "Entfernung für Annäherungsalarm (in Metern)";
+App::$strings["A proximity alert will be issued when you are within a certain radius of the marker location.<br><br>Enter a radius in meters (0 to disable):"] = "Ein Annäherungsalarm wird ausgelöst werden, sobald Du Dich innerhalb eines bestimmten Radius der Markierung aufhält.<br><br>Gib einen Radius in Metern ein (0 zum Abschalten der Funktion):";
+App::$strings["Marker proximity alert"] = "Annäherungsalarm für Markierung";
+App::$strings["Reminder note"] = "Erinnerungshinweis";
+App::$strings["Enter a note to be displayed when you are within the specified proximity..."] = "Gib eine Nachricht ein, die angezeigt werden soll, wenn Du Dich in der festgelegten Nähe befindest...";
+App::$strings["Add new rendezvous"] = "Neues Rendezvous hinzufügen";
+App::$strings["Create a new rendezvous and share the access link with those you wish to invite to the group. Those who open the link become members of the rendezvous. They can view other member locations, add markers to the map, or share their own locations with the group."] = "Erstelle ein neues Rendezvous und teile den Zugriffslink mit allen, die Du in die Gruppe einladen möchtest. Die, die den Link öffnen, werden Mitglieder des Rendezvous. Sie können die Standorte der anderen Mitglieder sehen, Marker zur Karte hinzufügen oder ihre eigenen Standorte mit der Gruppe teilen.";
+App::$strings["Some setting"] = "Einige Einstellungen";
+App::$strings["A setting"] = "Eine Einstellung";
+App::$strings["Skeleton Settings"] = "Skeleton Einstellungen";
+App::$strings["GNU-Social Protocol Settings updated."] = "GNU social Protokoll Einstellungen aktualisiert";
+App::$strings["Enable the GNU-Social protocol for this channel"] = "Aktiviere das GNU social Protokoll für diesen Kanal";
+App::$strings["GNU-Social Protocol Settings"] = "GNU social Protokoll Einstellungen";
+App::$strings["Follow"] = "Folgen";
+App::$strings["%1\$s is now following %2\$s"] = "%1\$s folgt nun %2\$s";
+App::$strings["INVALID EVENT DISMISSED!"] = "UNGÃœLTIGEN TERMIN ABGELEHNT!";
+App::$strings["Summary: "] = "Zusammenfassung:";
+App::$strings["Date: "] = "Datum:";
+App::$strings["Reason: "] = "Grund:";
+App::$strings["INVALID CARD DISMISSED!"] = "UNGÃœLTIGE KARTE ABGELEHNT!";
+App::$strings["Name: "] = "Name: ";
+App::$strings["You have to enable this plugin in Feature/Addon Settings > CalDAV/CardDAV Settings before you can use it."] = "Du musst dieses Plugin zunächst in Einstellungen > Plugin-Einstellungen > CalDAV/CardDAV-Einstellungen aktivieren, bevor Du es verwenden kannst.";
+App::$strings["Example: YYYY-MM-DD HH:mm"] = "Beispiel: JJJJ-MM-TT HH:mm";
+App::$strings["End date and time"] = "Enddatum und -zeit";
+App::$strings["List month"] = "Liste Monat";
+App::$strings["List week"] = "Liste Woche";
+App::$strings["List day"] = "Liste Tag";
+App::$strings["More"] = "Mehr";
+App::$strings["Less"] = "Weniger";
+App::$strings["Select calendar"] = "Kalender auswählen";
+App::$strings["Delete all"] = "Alles löschen";
+App::$strings["Sorry! Editing of recurrent events is not yet implemented."] = "Entschuldigung, aber das Bearbeiten von wiederkehrenden Veranstaltungen ist leider noch nicht implementiert.";
+App::$strings["Errors encountered creating database table: "] = "Fehler beim Anlegen der Datenbank-Tabellen aufgetreten.";
+App::$strings["Default Calendar"] = "Standardkalender";
+App::$strings["Default Addressbook"] = "Standardadressbuch";
+App::$strings["CalDAV/CardDAV Settings saved."] = "CalDAV/CardDAV-Einstellungen gespeichert.";
+App::$strings["Enable CalDAV/CardDAV Server for this channel"] = "Aktiviere den CalDAV/CardDAV Server für diesen Kanal";
+App::$strings["Your CalDAV resources are located at %s "] = "Deine CalDAV Resourcen sind unter %s verfügbar";
+App::$strings["Your CardDAV resources are located at %s "] = "Deine CardDAV Ressourcen sind unter %s verfügbar";
+App::$strings["CalDAV/CardDAV Settings"] = "CalDAV/CardDAV-Einstellungen";
+App::$strings["Home, Voice"] = "Zuhause, Sprache";
+App::$strings["Home, Fax"] = "Zuhause, Fax";
+App::$strings["Work, Voice"] = "Arbeit, Sprache";
+App::$strings["Work, Fax"] = "Arbeit, Fax";
+App::$strings["Select Channel"] = "Kanal auswählen";
+App::$strings["Read-write"] = "Lesen-schreiben";
+App::$strings["Read-only"] = "Nur Lesen";
+App::$strings["My Calendars"] = "Meine Kalender";
+App::$strings["Shared Calendars"] = "Geteilte Kalender";
+App::$strings["Share this calendar"] = "Diesen Kalender teilen";
+App::$strings["Calendar name and color"] = "Kalendername und -farbe";
+App::$strings["Create new calendar"] = "Neuen Kalender erstellen";
+App::$strings["Calendar Name"] = "Kalendername";
+App::$strings["Calendar Tools"] = "Kalenderwerkzeuge";
+App::$strings["Import calendar"] = "Kalender importieren";
+App::$strings["Select a calendar to import to"] = "Kalender zum Hineinimportieren auswählen";
+App::$strings["Addressbooks"] = "Adressbücher";
+App::$strings["Addressbook name"] = "Adressbuchname";
+App::$strings["Create new addressbook"] = "Neues Adressbuch erstellen";
+App::$strings["Addressbook Name"] = "Adressbuchname";
+App::$strings["Addressbook Tools"] = "Adressbuchwerkzeuge";
+App::$strings["Import addressbook"] = "Adressbuch importieren";
+App::$strings["Select an addressbook to import to"] = "Adressbuch zum Hineinimportieren auswählen";
+App::$strings["Planets Settings updated."] = "Planeten Einstellungen aktualisiert";
+App::$strings["Enable Planets Plugin"] = "Aktiviere Planeten Plugin";
+App::$strings["Planets Settings"] = "Planeten Einstellungen";
+App::$strings["System defaults:"] = "Systemstandardeinstellungen:";
+App::$strings["Preferred Clipart IDs"] = "Bevorzugte Clipart-IDs";
+App::$strings["List of preferred clipart ids. These will be shown first."] = "Liste bevorzugter Clipart-IDs. Diese werden zuerst angezeigt.";
+App::$strings["Default Search Term"] = "Standard-Suchbegriff";
+App::$strings["The default search term. These will be shown second."] = "Der Standard-Suchbegriff. Dieser wird an zweiter Stelle angezeigt.";
+App::$strings["Return After"] = "Zurückkehren nach";
+App::$strings["Page to load after image selection."] = "Die Seite, die nach Auswahl eines Bildes geladen werden soll.";
+App::$strings["Edit Profile"] = "Profil bearbeiten";
+App::$strings["Profile List"] = "Profilliste";
+App::$strings["Order of Preferred"] = "Reihenfolge der Bevorzugten";
+App::$strings["Sort order of preferred clipart ids."] = "Sortierreihenfolge der bevorzugten Clipart-IDs.";
+App::$strings["Newest first"] = "Neueste zuerst";
+App::$strings["As entered"] = "Wie eingegeben";
+App::$strings["Order of other"] = "Sortierung aller anderen";
+App::$strings["Sort order of other clipart ids."] = "Sortierreihenfolge der übrigen Clipart-IDs.";
+App::$strings["Most downloaded first"] = "Meist heruntergeladene zuerst";
+App::$strings["Most liked first"] = "Beliebteste zuerst";
+App::$strings["Preferred IDs Message"] = "Nachricht für bevorzugte IDs";
+App::$strings["Message to display above preferred results."] = "Nachricht, die über den Ergebnissen mit den bevorzugten IDs angezeigt werden soll.";
+App::$strings["Uploaded by: "] = "Hochgeladen von: ";
+App::$strings["Drawn by: "] = "Gezeichnet von: ";
+App::$strings["Or select from a free OpenClipart.org image:"] = "Oder wähle ein freies Bild von OpenClipart.org:";
+App::$strings["Search Term"] = "Suchbegriff";
+App::$strings["Unknown error. Please try again later."] = "Unbekannter Fehler. Bitte versuchen Sie es später erneut.";
+App::$strings["Profile photo updated successfully."] = "Profilfoto erfolgreich aktualisiert.";
App::$strings["Flag Adult Photos"] = "Nicht jugendfreie Fotos markieren";
App::$strings["Provide photo edit option to hide inappropriate photos from default album view"] = "Stellt eine Option zum Verstecken von Fotos mit unangemessenen Inhalten in der Standard-Albumansicht bereit";
-App::$strings["This is a fairly comprehensive and complete guitar chord dictionary which will list most of the available ways to play a certain chord, starting from the base of the fingerboard up to a few frets beyond the twelfth fret (beyond which everything repeats). A couple of non-standard tunings are provided for the benefit of slide players, etc."] = "";
-App::$strings["Chord names start with a root note (A-G) and may include sharps (#) and flats (b). This software will parse most of the standard naming conventions such as maj, min, dim, sus(2 or 4), aug, with optional repeating elements."] = "";
-App::$strings["Valid examples include A, A7, Am7, Amaj7, Amaj9, Ammaj7, Aadd4, Asus2Add4, E7b13b11 ..."] = "Einige gültige Beispiele: A, A7, Am7, Amaj7, Amaj9, Ammaj7, Aadd4, Asus2Add4, E7b13b11 ...";
-App::$strings["Guitar Chords"] = "Gitarrenakkorde";
-App::$strings["The complete online chord dictionary"] = "Das komplette online Akkord-Verzeichnis";
-App::$strings["Tuning"] = "Stimmen";
-App::$strings["Chord name: example: Em7"] = "Beispiel Akkord Name: Em7";
-App::$strings["Show for left handed stringing"] = "Linkshänder-Besaitung anzeigen";
-App::$strings["Quick Reference"] = "Schnellreferenz";
-App::$strings["No username found in import file."] = "Kein Benutzername in der Importdatei gefunden.";
-App::$strings["Unable to create a unique channel address. Import failed."] = "Es war nicht möglich, eine eindeutige Kanal-Adresse zu erzeugen. Der Import ist fehlgeschlagen.";
-App::$strings["Diaspora Protocol Settings updated."] = "Diaspora-Protokolleinstellungen aktualisiert.";
-App::$strings["Enable the Diaspora protocol for this channel"] = "Diaspora-Protokoll für diesen Kanal aktivieren";
-App::$strings["Allow any Diaspora member to comment on your public posts"] = "Jedem Diaspora-Mitglied erlauben, Deine öffentlichen Beiträge zu kommentieren";
-App::$strings["Prevent your hashtags from being redirected to other sites"] = "Verhindern, dass Deine hashtags zu anderen Seiten umgeleitet werden";
-App::$strings["Followed hashtags (comma separated, do not include the #)"] = "Verfolgte Hashtags (Komma separierte Liste, ohne die #)";
-App::$strings["Diaspora Protocol Settings"] = "Diaspora-Protokolleinstellungen";
+App::$strings["Post to WordPress"] = "Auf WordPress posten";
+App::$strings["Enable WordPress Post Plugin"] = "Aktiviere das WordPress-Plugin";
+App::$strings["WordPress username"] = "WordPress-Benutzername";
+App::$strings["WordPress password"] = "WordPress-Passwort";
+App::$strings["WordPress API URL"] = "WordPress-API-URL";
+App::$strings["Typically https://your-blog.tld/xmlrpc.php"] = "Normalerweise https://your-blog.tld/xmlrpc.php";
+App::$strings["WordPress blogid"] = "WordPress blogid";
+App::$strings["For multi-user sites such as wordpress.com, otherwise leave blank"] = "Nötig für Mehrbenutzer Seiten wie wordpress.com, andernfalls frei lassen";
+App::$strings["Post to WordPress by default"] = "Standardmäßig auf auf WordPress posten";
+App::$strings["Forward comments (requires hubzilla_wp plugin)"] = "Kommentare weiterleiten (benötigt hubzilla_wp Plugin)";
+App::$strings["WordPress Post Settings"] = "WordPress-Beitragseinstellungen";
+App::$strings["Wordpress Settings saved."] = "Wordpress-Einstellungen gespeichert.";
+App::$strings["This plugin looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW. This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "";
+App::$strings["Enable Content filter"] = "Inhaltsfilter aktivieren";
+App::$strings["Comma separated list of keywords to hide"] = "Kommaseparierte Liste von Schlüsselworten die verborgen werden sollen.";
+App::$strings["Word, /regular-expression/, lang=xx, lang!=xx"] = "";
+App::$strings["Not Safe For Work Settings"] = "Not Safe For Work Einstellungen";
+App::$strings["General Purpose Content Filter"] = "Allzweck-Inhaltsfilter";
+App::$strings["NSFW Settings saved."] = "NSFW-Einstellungen gespeichert.";
+App::$strings["Possible adult content"] = "Möglicherweise nicht jugendfreie Inhalte";
+App::$strings["%s - view"] = "%s - ansehen";
+App::$strings["Post to Insanejournal"] = "Bei InsaneJournal veröffentlichen";
+App::$strings["Enable InsaneJournal Post Plugin"] = "Aktiviere das InsaneJournal Plugin";
+App::$strings["InsaneJournal username"] = "InsaneJournal-Benutzername";
+App::$strings["InsaneJournal password"] = "InsaneJournal-Passwort";
+App::$strings["Post to InsaneJournal by default"] = "Standardmäßig bei InsaneJournal veröffentlichen";
+App::$strings["InsaneJournal Post Settings"] = "InsaneJournal-Beitragseinstellungen";
+App::$strings["Insane Journal Settings saved."] = "InsaneJournal-Einstellungen gespeichert.";
+App::$strings["Upload a file"] = "Datei hochladen";
+App::$strings["Drop files here to upload"] = "Dateien zum Hochladen hier fallen lassen";
+App::$strings["Failed"] = "Fehlgeschlagen";
+App::$strings["No files were uploaded."] = "Es wurden keine Dateien hochgeladen.";
+App::$strings["Uploaded file is empty"] = "Hochgeladene Datei ist leer";
+App::$strings["Image exceeds size limit of "] = "Bild überschreitet Größenbeschränkung von ";
+App::$strings["File has an invalid extension, it should be one of "] = "Die Datei hat eine ungültige Endung. Erlaubt sind folgende:";
+App::$strings["Upload was cancelled, or server error encountered"] = "Das Hochladen wurde abgebrochen oder es ist ein Serverfehler aufgetreten.";
+App::$strings["Post to Dreamwidth"] = "Bei Dreamwidth veröffentlichen";
+App::$strings["Enable Dreamwidth Post Plugin"] = "Aktiviere das Dreamwidth-Plugin";
+App::$strings["Dreamwidth username"] = "Dreamwidth-Benutzername";
+App::$strings["Dreamwidth password"] = "Dreamwidth-Passwort";
+App::$strings["Post to Dreamwidth by default"] = "Standardmäßig auf auf Dreamwidth posten";
+App::$strings["Dreamwidth Post Settings"] = "Dreamwidth-Beitragseinstellungen";
+App::$strings["Install Firefox Sharing Tools"] = "";
+App::$strings["Share content from Firefox to \$Projectname"] = "Inhalte von Firefox nach \$Projectname teilen";
+App::$strings["Install Firefox Sharing Tools to this web browser"] = "";
App::$strings["Hubzilla Directory Stats"] = "Hubzilla-Verzeichnisstatistiken";
App::$strings["Total Hubs"] = "Hubs insgesamt";
App::$strings["Hubzilla Hubs"] = "Hubzilla Hubs";
@@ -1726,167 +1979,31 @@ App::$strings["Average Age"] = "Durchschnittsalter";
App::$strings["Known Chatrooms"] = "Bekannte Chaträume";
App::$strings["Known Tags"] = "Bekannte Schlagwörter";
App::$strings["Please note Diaspora and Friendica statistics are merely those **this directory** is aware of, and not all those known in the network. This also applies to chatrooms,"] = "Bitte berücksichtige, dass Diaspora und Friendica Statistiken nur solche einschließen, die **diesem Verzeichnis** bekannt sind, nicht alle im Netzwerk bekannten. Das gilt auch für Chaträume.";
-App::$strings["Project Servers and Resources"] = "Projektserver und -ressourcen";
-App::$strings["Project Creator and Tech Lead"] = "Projektersteller und Technischer Leiter";
-App::$strings["Admin, developer, directorymin, support bloke"] = "Administrator, Entwickler, Verzeichnis Betreibender, Supportleistende";
-App::$strings["And the hundreds of other people and organisations who helped make the Hubzilla possible."] = "Und die hunderte anderen Menschen und Organisationen, die geholfen haben Hubzilla möglich zu machen.";
-App::$strings["The Redmatrix/Hubzilla projects are provided primarily by volunteers giving their time and expertise - and often paying out of pocket for services they share with others."] = "Die Redmatrix/Hubzilla Projekte werden hauptsächlich von Freiwilligen bereitgestellt, die ihre Zeit und Expertise zur Verfügung stellen - und oft aus eigener Tasche für die Dienste zahlen, die sie mit anderen teilen.";
-App::$strings["There is no corporate funding and no ads, and we do not collect and sell your personal information. (We don't control your personal information - <strong>you do</strong>.)"] = "Es gibt keine Finanzierung durch Firmen, keine Werbung und wir verkaufen Deine persönlichen Daten nicht. (Wir kontrollieren Deine persönlichen Daten nicht - <strong>das machst Du</strong>.)";
-App::$strings["Help support our ground-breaking work in decentralisation, web identity, and privacy."] = "Hilf uns bei unserer wegweisenden Arbeit im Bereich der Dezantralisation, von Web-Identitäten und Privatsphäre.";
-App::$strings["Your donations keep servers and services running and also helps us to provide innovative new features and continued development."] = "Die Spenden werden dafür verwendet Server und Dienste am laufen zu halten und helfen desweiteren innovative Neuerungen zu schaffen und die Entwicklung voran zu treiben.";
-App::$strings["Donate"] = "Spenden";
-App::$strings["Choose a project, developer, or public hub to support with a one-time donation"] = "Wähle ein Projekt, einen Entwickler oder einen öffentlichen Hub den du mit einer einmaligen Spende unterstützen willst.";
-App::$strings["Donate Now"] = "Jetzt spenden";
-App::$strings["<strong><em>Or</em></strong> become a project sponsor (Hubzilla Project only)"] = "<strong><em>Oder</em></strong> werde ein Unterstützer des Projekts (ausschließlich Hubzilla)";
-App::$strings["Please indicate if you would like your first name or full name (or nothing) to appear in our sponsor listing"] = "Bitte teile uns mit ob dein kompletter Name oder dein Vorname (oder gar nichts) auf unserer Sponsoren-Seite veröffentlicht werden soll.";
-App::$strings["Sponsor"] = "Sponsor";
-App::$strings["Special thanks to: "] = "Besonderer Dank an: ";
-App::$strings["Post to Dreamwidth"] = "Bei Dreamwidth veröffentlichen";
-App::$strings["Enable Dreamwidth Post Plugin"] = "Aktiviere das Dreamwidth-Plugin";
-App::$strings["Dreamwidth username"] = "Dreamwidth-Benutzername";
-App::$strings["Dreamwidth password"] = "Dreamwidth-Passwort";
-App::$strings["Post to Dreamwidth by default"] = "Standardmäßig auf auf Dreamwidth posten";
-App::$strings["Dreamwidth Post Settings"] = "Dreamwidth-Beitragseinstellungen";
-App::$strings["Flattr this!"] = "Flattr this!";
-App::$strings["Flattr widget settings updated."] = "Flattr Widget Einstellungen aktualisiert";
-App::$strings["Flattr user"] = "Flattr Nutzer";
-App::$strings["URL of the Thing to flattr"] = "URL des Dings zum flattrn";
-App::$strings["If empty channel URL is used"] = "Falls leer wird die Channel URL verwendet";
-App::$strings["Title of the Thing to flattr"] = "Titel des Dings zum flattrn";
-App::$strings["If empty \"channel name on The Hubzilla\" will be used"] = "Falls leer wird \"Kanalname auf The Hubzilla\" verwendet";
-App::$strings["Static or dynamic flattr button"] = "Statischer oder dynamischer Flattr Button";
-App::$strings["static"] = "statisch";
-App::$strings["dynamic"] = "dynamisch";
-App::$strings["Alignment of the widget"] = "Ausrichtung des Widgets";
-App::$strings["left"] = "links";
-App::$strings["right"] = "rechts";
-App::$strings["Enable Flattr widget"] = "Flattr Widget verwenden";
-App::$strings["Flattr Widget Settings"] = "Flattr Widget Einstellungen";
-App::$strings["Contact not found."] = "Kontakt nicht gefunden.";
-App::$strings["This may occasionally happen if contact was requested by both persons and it has already been approved."] = "Dies kann unter Umständen passieren, wenn der Kontakt von beiden Seiten aus angefragt wurde und er bereits akzeptiert wurde..";
-App::$strings["Response from remote site was not understood."] = "Antwort des entfernten Seite war unverständlich.";
-App::$strings["Unexpected response from remote site: "] = "Unerwartete Antwort der entfernten Seite";
-App::$strings["Confirmation completed successfully."] = "Bestätigung erfolgreich abgeschlossen.";
-App::$strings["Remote site reported: "] = "Meldung der entfernten Seite";
-App::$strings["Temporary failure. Please wait and try again."] = "Vorübergehende Störung. Bitte warte einen Moment und versuche es später erneut.";
-App::$strings["Introduction failed or was revoked."] = "Vorstellung fehlgeschlagen oder wurde zurück gezogen.";
-App::$strings["Unable to set contact photo."] = "Konnte das Kontakt-Photo nicht setzen.";
-App::$strings["%1\$s is now friends with %2\$s"] = "%1\$s ist nun mit %2\$s befreundet";
-App::$strings["No user record found for '%s' "] = "Kein Benutzereintrag für '%s' gefunden";
-App::$strings["Our site encryption key is apparently messed up."] = "Der Verschlüsselungsschlüssel unserer Seite ist anscheinend kaputt.";
-App::$strings["Empty site URL was provided or URL could not be decrypted by us."] = "Eine leere Seiten URL wurde angegeben, oder die URL konnte von uns nicht entziffert werden.";
-App::$strings["Contact record was not found for you on our site."] = "Für dich wurden keinerlei Kontaktdaten auf unserer Seite gefunden.";
-App::$strings["Site public key not available in contact record for URL %s."] = "Der öffentliche Schlüssel dieser Seite ist für die Kontaktdaten mit der URL %s nocht verfügbar.";
-App::$strings["The ID provided by your system is a duplicate on our system. It should work if you try again."] = "Die ID, die Durch Dein System angegeben wurde ist ein Duplikat auf unserem. Es sollte funktionieren, wenn Du es noch einmal versuchst.";
-App::$strings["Unable to set your contact credentials on our system."] = "";
-App::$strings["Unable to update your contact profile details on our system"] = "Konnte die Details deines Profils auf unserem System nicht aktualisieren.";
-App::$strings["[Name Withheld]"] = "[Name zurück gehalten]";
-App::$strings["%1\$s has joined %2\$s"] = "%1\$s ist %2\$s beigetreten";
-App::$strings["%1\$s welcomes %2\$s"] = "%1\$s heißt %2\$s willkommen";
-App::$strings["This introduction has already been accepted."] = "Die Vorstellung wurde bereits akzeptiert.";
-App::$strings["Profile location is not valid or does not contain profile information."] = "Die angegebenen Profil Lokalität ist nicht gültig oder enthält keine Profil-Informationen.";
-App::$strings["Warning: profile location has no identifiable owner name."] = "";
-App::$strings["Warning: profile location has no profile photo."] = "Warnung: Beim angegebenen Profil liegt kein Profil-Bild bei.";
-App::$strings["%d required parameter was not found at the given location"] = array(
- 0 => "Konnte %d benötigten Parameter an der angegebenen Stelle nicht finden.",
- 1 => "Konnte %d benötigte Parameter an der angegebenen Stelle nicht finden.",
-);
-App::$strings["Introduction complete."] = "Einführung abgeschlossen.";
-App::$strings["Unrecoverable protocol error."] = "Nicht behebbarer Protokollfehler.";
-App::$strings["Profile unavailable."] = "Profil nicht verfügbar.";
-App::$strings["%s has received too many connection requests today."] = "%s hat heute bereits zu viele Kontaktanfragen erhalten.";
-App::$strings["Spam protection measures have been invoked."] = "Maßnahmen zum Spam-Schutz wurden aktiviert.";
-App::$strings["Friends are advised to please try again in 24 hours."] = "Freunde sollten es bitte in 24 Stunden erneut versuchen.";
-App::$strings["Invalid locator"] = "";
-App::$strings["Invalid email address."] = "Ungültige E-Mail-Adresse.";
-App::$strings["This account has not been configured for email. Request failed."] = "Dieser Account wurde nicht für E-Mail konfiguriert. Anfrage gescheitert.";
-App::$strings["Unable to resolve your name at the provided location."] = "Konnte deinen Namen nicht bei der angegebenen Stelle ermitteln.";
-App::$strings["You have already introduced yourself here."] = "Du hast dich hier bereits vorgestellt.";
-App::$strings["Apparently you are already friends with %s."] = "Anscheinend bist du bereits mit %s in Kontakt.";
-App::$strings["Invalid profile URL."] = "Ungültige Profil-URL.";
-App::$strings["Disallowed profile URL."] = "Nicht erlaubte Profil-URL.";
-App::$strings["Failed to update contact record."] = "Konnte den Verbindungseintrag nicht aktualisieren.";
-App::$strings["Your introduction has been sent."] = "Deine Vorstellung wurde gesendet.";
-App::$strings["Please login to confirm introduction."] = "Bitte melde dich an um die Vorstellung zu bestätigen.";
-App::$strings["Incorrect identity currently logged in. Please login to <strong>this</strong> profile."] = "";
-App::$strings["Confirm"] = "Bestätigen";
-App::$strings["Hide this contact"] = "Diesen Kontakt verbergen";
-App::$strings["Welcome home %s."] = "Willkommen daheim %s";
-App::$strings["Please confirm your introduction/connection request to %s."] = "Bitte bestätige deine Vorstellung/Kontaktanfrage bei %s.";
-App::$strings["Please enter your 'Identity Address' from one of the following supported communications networks:"] = "Bitte gib deine \"Identitäts Adresse\" von einem der folgenden unterstützten Kommunikations Netzwerke an.";
-App::$strings["If you are not yet a member of the free social web, <a href=\"%s/siteinfo\">follow this link to find a public Friendica site and join us today</a>."] = "";
-App::$strings["Friend/Connection Request"] = "Freundschafts-/Verbindungsanfrage";
-App::$strings["Examples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, testuser@identi.ca"] = "Beispiele: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, testuser@identi.ca";
-App::$strings["Please answer the following:"] = "Bitte beantworten Sie folgendes:";
-App::$strings["Does %s know you?"] = "Kennt %s Sie?";
-App::$strings["Add a personal note:"] = "Eine persönliche Nachricht hinterlassen:";
-App::$strings["Friendica"] = "Friendica";
-App::$strings["StatusNet/Federated Social Web"] = "StatusNet/Föderierte Soziale Netzwerke";
-App::$strings["Diaspora"] = "Diaspora";
-App::$strings[" - please do not use this form. Instead, enter %s into your Diaspora search bar."] = "- bitte verwende nicht dieses Formular sondern gib %s in die Suchleiste deiner Diaspora Seite ein.";
-App::$strings["Your Identity Address:"] = "Ihre Identitätsadresse:";
-App::$strings["Submit Request"] = "Anfrage absenden";
-App::$strings["GNU-Social Protocol Settings updated."] = "GNU Social Protokoll Einstellungen aktualisiert";
-App::$strings["Enable the (experimental) GNU-Social protocol for this channel"] = "GNU Social Protokoll (experimentell) für diesen Kanal aktualisieren";
-App::$strings["GNU-Social Protocol Settings"] = "GNU Social Protokoll Einstellungen";
-App::$strings["Follow"] = "Folgen";
-App::$strings["%1\$s is now following %2\$s"] = "%1\$s folgt nun %2\$s";
-App::$strings["Friendica Photo Album Import"] = "Friendica-Fotoalbumimport";
-App::$strings["This will import all your Friendica photo albums to this Red channel."] = "Hiermit werden all deine Fotoalben von Friendica in diesen Hubzilla Kanal importiert.";
-App::$strings["Friendica Server base URL"] = "BasisURL des Friendica Servers";
-App::$strings["Friendica Login Username"] = "Friendica-Anmeldebenutzername";
-App::$strings["Friendica Login Password"] = "Friendica-Anmeldepasswort";
-App::$strings["Send email to all members"] = "E-Mail an alle Mitglieder senden";
-App::$strings["$1%s Administrator"] = "$1%s Administrator";
-App::$strings["No recipients found."] = "Keine Empfänger gefunden.";
-App::$strings["%1\$d of %2\$d messages sent."] = "%1\$d von %2\$d Nachrichten gesendet.";
-App::$strings["Send email to all hub members."] = "Eine E-Mail an alle Mitglieder dieses Hubs senden.";
-App::$strings["Message subject"] = "Betreff der Nachricht";
-App::$strings["Sender Email address"] = "E-Mail Adresse des Absenders";
-App::$strings["Test mode (only send to hub administrator)"] = "Test Modus (nur an Hub Administratoren senden)";
-App::$strings["Post to Insanejournal"] = "Bei InsaneJournal veröffentlichen";
-App::$strings["Enable InsaneJournal Post Plugin"] = "Aktiviere das InsaneJournal Plugin";
-App::$strings["InsaneJournal username"] = "InsaneJournal-Benutzername";
-App::$strings["InsaneJournal password"] = "InsaneJournal-Passwort";
-App::$strings["Post to InsaneJournal by default"] = "Standardmäßig bei InsaneJournal veröffentlichen";
-App::$strings["InsaneJournal Post Settings"] = "InsaneJournal-Beitragseinstellungen";
-App::$strings["Insane Journal Settings saved."] = "InsaneJournal-Einstellungen gespeichert.";
+App::$strings["Email notification hub"] = "Hub für E-Mail-Benachrichtigungen";
+App::$strings["Hostname"] = "Servername";
+App::$strings["Mailhost Settings"] = "Mailhost-Einstellungen";
+App::$strings["MAILHOST Settings saved."] = "MAILHOST-Einstellungen gespeichert.";
+App::$strings["Your Webbie:"] = "Dein Webbie";
+App::$strings["Fontsize (px):"] = "Schriftgröße (px):";
+App::$strings["Link:"] = "Link:";
+App::$strings["Like us on Hubzilla"] = "Like us on Hubzilla";
+App::$strings["Embed:"] = "Einbetten";
+App::$strings["Photos imported"] = "Fotos importiert";
+App::$strings["Redmatrix Photo Album Import"] = "Redmatrix-Fotoalbumimport";
+App::$strings["This will import all your Redmatrix photo albums to this channel."] = "Hiermit werden all deine Fotoalben von Redmatrix in diesen Kanal importiert.";
+App::$strings["Redmatrix Server base URL"] = "Basis-URL des Redmatrix Servers";
+App::$strings["Redmatrix Login Username"] = "Redmatrix-Anmeldebenutzername";
+App::$strings["Redmatrix Login Password"] = "Redmatrix-Anmeldepasswort";
+App::$strings["Import just this album"] = "Nur dieses Album importieren";
+App::$strings["Leave blank to import all albums"] = "Leer lassen um alle Alben zu importieren";
+App::$strings["Maximum count to import"] = "Maximal zu importierende Anzahl";
+App::$strings["0 or blank to import all available"] = "0 oder leer lassen um alles zu importieren";
App::$strings["Channels to auto connect"] = "Kanäle zur automatischen Verbindung";
App::$strings["Comma separated list"] = "Kommagetrennte Liste";
App::$strings["Popular Channels"] = "Beliebte Kanäle";
App::$strings["IRC Settings"] = "IRC-Einstellungen";
App::$strings["IRC settings saved."] = "IRC-Einstellungen gespeichert.";
App::$strings["IRC Chatroom"] = "IRC-Chatraum";
-App::$strings["Status:"] = "Status:";
-App::$strings["Activate addon"] = "Addon aktiviren";
-App::$strings["Hide Jappixmini Chat-Widget from the webinterface"] = "Jappix Mini Chat-Widget von der Weboberfläche verbergen";
-App::$strings["Jabber username"] = "Jabber-Benutzername";
-App::$strings["Jabber server"] = "Jabber-Server";
-App::$strings["Jabber BOSH host URL"] = "Jabber BOSH Host URL";
-App::$strings["Jabber password"] = "Jabber-Passwort";
-App::$strings["Encrypt Jabber password with Hubzilla password"] = "Jabber-Passwort mit Hubzilla-Passwort verschlüsseln";
-App::$strings["Hubzilla password"] = "Hubzilla-Passwort";
-App::$strings["Approve subscription requests from Hubzilla contacts automatically"] = "";
-App::$strings["Purge internal list of jabber addresses of contacts"] = "Interne Liste der Jabber Adressen von Kontakten löschen";
-App::$strings["Configuration Help"] = "Konfigurationshilfe";
-App::$strings["Jappix Mini Settings"] = "Jappix Mini Einstellungen";
-App::$strings["Upload a file"] = "Datei hochladen";
-App::$strings["Drop files here to upload"] = "Dateien zum Hochladen hier fallen lassen";
-App::$strings["Failed"] = "Fehlgeschlagen";
-App::$strings["No files were uploaded."] = "Es wurden keine Dateien hochgeladen.";
-App::$strings["Uploaded file is empty"] = "Hochgeladene Datei ist leer";
-App::$strings["Image exceeds size limit of "] = "Bild überschreitet Größenbeschränkung von ";
-App::$strings["File has an invalid extension, it should be one of "] = "Die Datei hat eine ungültige Endung. Erlaubt sind folgende:";
-App::$strings["Upload was cancelled, or server error encountered"] = "Das Hochladen wurde abgebrochen oder es ist ein Serverfehler aufgetreten.";
-App::$strings["An account has been created for you."] = "Ein Konto wurde für Sie erstellt.";
-App::$strings["Authentication successful but rejected: account creation is disabled."] = "Authentifizierung war erfolgreich wurde aber abgewiesen! Das Anlegen von Accounts wurde deaktiviert.";
-App::$strings["Post to Libertree"] = "Bei Libertree veröffentlichen";
-App::$strings["Enable Libertree Post Plugin"] = "Aktivire das Libertree-Plugin";
-App::$strings["Libertree API token"] = "Libertree API Token";
-App::$strings["Libertree site URL"] = "URL der Libertree Seite";
-App::$strings["Post to Libertree by default"] = "Standardmäßig bei Libertree veröffentlichen";
-App::$strings["Libertree Post Settings"] = "Libertree-Beitragseinstellungen";
-App::$strings["Libertree Settings saved."] = "Libertree-Einstellungen gespeichert.";
App::$strings["Post to LiveJournal"] = "Bei LiveJurnal veröffentlichen";
App::$strings["Enable LiveJournal Post Plugin"] = "Aktiviere das LiveJurnal Plugin";
App::$strings["LiveJournal username"] = "LiveJournal-Benutzername";
@@ -1894,36 +2011,34 @@ App::$strings["LiveJournal password"] = "LiveJournal-Passwort";
App::$strings["Post to LiveJournal by default"] = "Standardmäßig bei LiveJurnal veröffentlichen";
App::$strings["LiveJournal Post Settings"] = "LiveJournal-Beitragseinstellungen";
App::$strings["LiveJournal Settings saved."] = "LiveJournal-Einstellungen gespeichert.";
-App::$strings["Logfile archive directory"] = "Verzeichnis der Logdatei";
-App::$strings["Directory to store rotated logs"] = "Verzeichnis, in dem rotierte Logs gespeichert werden sollen";
-App::$strings["Logfile size in bytes before rotating"] = "zu erreichende Logdateigröße in Bytes, bevor rotiert wird";
-App::$strings["Number of logfiles to retain"] = "Anzahl aufzubewahrender rotierter Logdateien";
-App::$strings["Email notification hub"] = "Hub für E-Mail-Benachrichtigungen";
-App::$strings["Hostname"] = "Servername";
-App::$strings["Mailhost Settings"] = "Mailhost-Einstellungen";
-App::$strings["MAILHOST Settings saved."] = "MAILHOST-Einstellungen gespeichert.";
-App::$strings["lonely"] = "einsam";
-App::$strings["drunk"] = "betrunken";
-App::$strings["horny"] = "geil";
-App::$strings["stoned"] = "bekifft";
-App::$strings["fucked up"] = "beschissen";
-App::$strings["clusterfucked"] = "clusterfucked";
-App::$strings["crazy"] = "verrückt";
-App::$strings["hurt"] = "verletzt";
-App::$strings["sleepy"] = "müde";
-App::$strings["grumpy"] = "mürrisch";
-App::$strings["high"] = "hoch";
-App::$strings["semi-conscious"] = "halb bewusstlos";
-App::$strings["in love"] = "verliebt";
-App::$strings["in lust"] = "";
-App::$strings["naked"] = "nackt";
-App::$strings["stinky"] = "stinkend";
-App::$strings["sweaty"] = "verschwitzt";
-App::$strings["bleeding out"] = "blutend";
-App::$strings["victorious"] = "siegreich";
-App::$strings["defeated"] = "besiegt";
-App::$strings["envious"] = "neidisch";
-App::$strings["jealous"] = "eifersüchtig";
+App::$strings["We encountered a problem while logging in with the OpenID you provided. Please check the correct spelling of the ID."] = "Wir haben ein Problem mit der OpenID festgestellt, mit der Du Dich anmelden wolltest. Bitte überprüfe sie noch einmal.";
+App::$strings["The error message was:"] = "Die Fehlermeldung war:";
+App::$strings["First Name"] = "Vorname";
+App::$strings["Last Name"] = "Nachname";
+App::$strings["Nickname"] = "Spitzname";
+App::$strings["Full Name"] = "Voller Name";
+App::$strings["Profile Photo 16px"] = "Profilfoto 16 px";
+App::$strings["Profile Photo 32px"] = "Profilfoto 32 px";
+App::$strings["Profile Photo 48px"] = "Profilfoto 48 px";
+App::$strings["Profile Photo 64px"] = "Profilfoto 64 px";
+App::$strings["Profile Photo 80px"] = "Profilfoto 80 px";
+App::$strings["Profile Photo 128px"] = "Profilfoto 128 px";
+App::$strings["Timezone"] = "Zeitzone";
+App::$strings["Birth Year"] = "Geburtsjahr";
+App::$strings["Birth Month"] = "Geburtsmonat";
+App::$strings["Birth Day"] = "Geburtstag";
+App::$strings["Birthdate"] = "Geburtsdatum";
+App::$strings["OpenID protocol error. No ID returned."] = "OpenID-Protokollfehler. Keine Kennung zurückgegeben.";
+App::$strings["Login failed."] = "Login fehlgeschlagen.";
+App::$strings["Male"] = "Männlich";
+App::$strings["Female"] = "Weiblich";
+App::$strings["You're welcome."] = "Gern geschehen.";
+App::$strings["Ah shucks..."] = "";
+App::$strings["Don't mention it."] = "Keine Ursache.";
+App::$strings["&lt;blush&gt;"] = "";
+App::$strings["Page to load after login"] = "Seite, die nach dem Login geladen werden soll";
+App::$strings["Examples: &quot;apps&quot;, &quot;network?f=&gid=37&quot; (privacy collection), &quot;channel&quot; or &quot;notifications/system&quot; (leave blank for default network page (grid)."] = "Beispiele: &quot;apps&quot;, &quot;network?f=&gid=37&quot; (Gruppen-gefilterte Beiträge), &quot;channel&quot; oder &quot;notifications/system&quot; (freilassen für die Standard-Netzwerkseite (grid).";
+App::$strings["Startpage Settings"] = "Startseiteneinstellungen";
App::$strings["bitchslap"] = "Ohrfeige";
App::$strings["bitchslapped"] = "geohrfeigt";
App::$strings["shag"] = "bumsen";
@@ -1962,50 +2077,46 @@ App::$strings["bonk"] = "";
App::$strings["bonked"] = "";
App::$strings["declare undying love for"] = "";
App::$strings["declared undying love for"] = "";
-App::$strings["Save Settings"] = "Einstellungen speichern";
-App::$strings["text to include in all outgoing posts from this site"] = "Test der in alle Beiträge angefügt werden soll, die von dieser Seite ausgehen";
-App::$strings["Federate"] = "";
-App::$strings["nofed Settings saved."] = "nofed Einstellungen gespeichert";
-App::$strings["Allow Federation Toggle"] = "";
-App::$strings["Federate posts by default"] = "";
-App::$strings["NoFed Settings"] = "NoFed-Einstellungen";
+App::$strings["Diaspora Protocol Settings updated."] = "";
+App::$strings["Enable the Diaspora protocol for this channel"] = "";
+App::$strings["Allow any Diaspora member to comment on your public posts"] = "";
+App::$strings["Prevent your hashtags from being redirected to other sites"] = "";
+App::$strings["Followed hashtags (comma separated, do not include the #)"] = "";
+App::$strings["Diaspora Protocol Settings"] = "";
+App::$strings["No username found in import file."] = "";
+App::$strings["Unable to create a unique channel address. Import failed."] = "Es war nicht möglich, eine eindeutige Kanal-Adresse zu erzeugen. Der Import ist fehlgeschlagen.";
+App::$strings["Error retrieving wiki"] = "Fehler beim Abrufen des Wiki";
+App::$strings["Error creating zip file export folder"] = "Fehler bei der Erzeugung des Zip-Datei Export-Verzeichnisses ";
+App::$strings["Error downloading wiki: "] = "Fehler beim Herunterladen des Wiki:";
+App::$strings["Your account on %s will expire in a few days."] = "Dein Account auf %s wird in ein paar Tagen ablaufen.";
+App::$strings["Your $Productname test account is about to expire."] = "Dein $Productname Test-Account wird bald auslaufen.";
+App::$strings["Enable Rainbowtag"] = "Rainbowtag aktivieren";
+App::$strings["Rainbowtag Settings"] = "Rainbowtag-Einstellungen";
+App::$strings["Rainbowtag Settings saved."] = "Rainbowtag-Einstellungen gespeichert.";
+App::$strings["Show Upload Limits"] = "Hochladebeschränkungen anzeigen";
+App::$strings["Hubzilla configured maximum size: "] = "Die in Hubzilla eingestellte maximale Größe:";
+App::$strings["PHP upload_max_filesize: "] = "PHP upload_max_filesize:";
+App::$strings["PHP post_max_size (must be larger than upload_max_filesize): "] = "PHP post_max_size (muss größer sein als upload_max_filesize):";
+App::$strings["Recent Channel/Profile Viewers"] = "Kürzliche Kanal/Profil Besucher";
+App::$strings["This plugin/addon has not been configured."] = "Dieses Plugin/Addon wurde noch nicht konfiguriert.";
+App::$strings["Please visit the Visage settings on %s"] = "Bitte rufe die Visage Einstellungen auf %s auf";
+App::$strings["your feature settings page"] = "Die Funktions-Einstellungsseite";
+App::$strings["No entries."] = "Keine Einträge.";
+App::$strings["Enable Visage Visitor Logging"] = "Aktiviere das Visage-Besucher Logging";
+App::$strings["Visage Settings"] = "Visage-Einstellungen";
App::$strings["Nsabait Settings updated."] = "Nsabait-Einstellungen aktualisiert.";
App::$strings["Enable NSAbait Plugin"] = "Aktiviere das NSAbait Plugin";
App::$strings["NSAbait Settings"] = "NSAbait-Einstellungen";
-App::$strings["This plugin looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW. This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "";
-App::$strings["Enable Content filter"] = "Inhaltsfilter aktivieren";
-App::$strings["Comma separated list of keywords to hide"] = "Kommaseparierte Liste von Schlüsselworten die verborgen werden sollen.";
-App::$strings["Word, /regular-expression/, lang=xx, lang!=xx"] = "";
-App::$strings["Not Safe For Work Settings"] = "Not Safe For Work Einstellungen";
-App::$strings["General Purpose Content Filter"] = "Allzweck-Inhaltsfilter";
-App::$strings["NSFW Settings saved."] = "NSFW-Einstellungen gespeichert.";
-App::$strings["Possible adult content"] = "Möglicherweise nicht jugendfreie Inhalte";
-App::$strings["%s - view"] = "";
-App::$strings["System defaults:"] = "Systemstandardeinstellungen:";
-App::$strings["Preferred Clipart IDs"] = "";
-App::$strings["List of preferred clipart ids. These will be shown first."] = "";
-App::$strings["Default Search Term"] = "Standard-Suchbegriff";
-App::$strings["The default search term. These will be shown second."] = "";
-App::$strings["Return After"] = "";
-App::$strings["Page to load after image selection."] = "";
-App::$strings["Edit Profile"] = "Profile bearbeiten";
-App::$strings["Profile List"] = "Profilliste";
-App::$strings["Order of Preferred"] = "Bevorzugte Reihenfolge";
-App::$strings["Sort order of preferred clipart ids."] = "";
-App::$strings["Newest first"] = "Neueste zuerst";
-App::$strings["As entered"] = "Wie eingegeben";
-App::$strings["Order of other"] = "";
-App::$strings["Sort order of other clipart ids."] = "";
-App::$strings["Most downloaded first"] = "Meist heruntergeladene zuerst";
-App::$strings["Most liked first"] = "Beliebteste zuerst";
-App::$strings["Preferred IDs Message"] = "";
-App::$strings["Message to display above preferred results."] = "";
-App::$strings["Uploaded by: "] = "Hochgeladen von: ";
-App::$strings["Drawn by: "] = "Gezeichnet von: ";
-App::$strings["Or select from a free OpenClipart.org image:"] = "Oder wähle ein freies Bild von OpenClipart.org:";
-App::$strings["Search Term"] = "Suchbegriff";
-App::$strings["Unknown error. Please try again later."] = "Unbekannter Fehler. Bitte versuchen Sie es später erneut.";
-App::$strings["Profile photo updated successfully."] = "Profilfoto erfolgreich aktualisiert.";
+App::$strings["Send test email"] = "Test-E-Mail senden";
+App::$strings["No recipients found."] = "Keine Empfänger gefunden.";
+App::$strings["Mail sent."] = "Mail gesendet.";
+App::$strings["Sending of mail failed."] = "Senden der E-Mail fehlgeschlagen.";
+App::$strings["Mail Test"] = "Mail Test";
+App::$strings["Message subject"] = "Betreff der Nachricht";
+App::$strings["Reconnecting %d connections"] = "";
+App::$strings["Diaspora Reconnect"] = "";
+App::$strings["Use this form to re-establish Diaspora connections which were initially made from a different hub."] = "";
+App::$strings["Reconnect"] = "";
App::$strings["View Larger"] = "Größer anzeigen";
App::$strings["Tile Server URL"] = "Kachelserver-URL";
App::$strings["A list of <a href=\"http://wiki.openstreetmap.org/wiki/TMS\" target=\"_blank\">public tile servers</a>"] = "Eine Liste <a href=\"http://wiki.openstreetmap.org/wiki/TMS\" target=\"_blank\">öffentlicher Kachelserver</a>";
@@ -2015,90 +2126,104 @@ App::$strings["Default zoom"] = "Standardzoom";
App::$strings["The default zoom level. (1:world, 18:highest, also depends on tile server)"] = "Die Standard-Vergrößerungsstufe (1:Welt, 18:höchste, hängt außerdem vom Kachelserver ab).";
App::$strings["Include marker on map"] = "Markierung auf der Karte einschließen";
App::$strings["Include a marker on the map."] = "Binde eine Markierung auf der Karte ein.";
-App::$strings["Message to display on every page on this server"] = "Nachricht, die auf jeder Seite dieses Servers angezeigt werden soll";
-App::$strings["Pageheader Settings"] = "Nachrichtenkopf-Einstellungen";
-App::$strings["pageheader Settings saved."] = "Nachrichtenkopf-Einstellungen gespeichert.";
-App::$strings["This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> analytics tool."] = "Diese Website verwendet <a href='http://www.piwik.org'>Piwik</a>, um die Besucherzugriffe auszuwerten.";
-App::$strings["If you do not want that your visits are logged this way you <a href='%s'>can set a cookie to prevent Piwik from tracking further visits of the site</a> (opt-out)."] = "Wenn Du nicht möchtest, dass Deine Besuche zu diesem Zweck gespeichert werden, kannst Du <a href='%s'>ein Cookie setzen, welches Piwik davon abhält, Deine weiteren Besuche auf dieser Website zu verfolgen</a> (Opt-out).";
-App::$strings["Piwik Base URL"] = "Piwik Basis-URL";
-App::$strings["Absolute path to your Piwik installation. (without protocol (http/s), with trailing slash)"] = "Der absolute Pfad zu Deiner Piwik-Installation (ohne Protokoll (http/s), aber mit abschließendem Schrägstrich / ).";
-App::$strings["Site ID"] = "Seitenkennung";
-App::$strings["Show opt-out cookie link?"] = "Den Opt-out Cookie-Link anzeigen?";
-App::$strings["Asynchronous tracking"] = "Asynchrones Tracking";
-App::$strings["Enable frontend JavaScript error tracking"] = "Ermögliche Frontend-JavaScript-Fehlertracking";
-App::$strings["This feature requires Piwik >= 2.2.0"] = "Diese Funktion erfordert Piwik >= 2.2.0";
-App::$strings["Planets Settings updated."] = "Planeten Einstellungen aktualisiert";
-App::$strings["Enable Planets Plugin"] = "Aktiviere Planeten Plugin";
-App::$strings["Planets Settings"] = "Planeten Einstellungen";
-App::$strings["You are now authenticated to pumpio."] = "Du bist nun bei pumpio authenzifiziert.";
-App::$strings["return to the featured settings page"] = "";
-App::$strings["Post to Pump.io"] = "Bei pumpio veröffentlichen";
-App::$strings["Pump.io servername"] = "Pump.io-Servername";
-App::$strings["Without \"http://\" or \"https://\""] = "Ohne \"http://\" oder \"https://\"";
-App::$strings["Pump.io username"] = "Pump.io-Benutzername";
-App::$strings["Without the servername"] = "Ohne dem Servernamen";
-App::$strings["You are not authenticated to pumpio"] = "Du bist nicht bei pumpio authentifiziert.";
-App::$strings["(Re-)Authenticate your pump.io connection"] = "Deine pumpio Verbindung (erneut) authentifizieren";
-App::$strings["Enable pump.io Post Plugin"] = "Aktiviere das pumpio-Plugin";
-App::$strings["Post to pump.io by default"] = "Standardmäßig bei pumpio veröffentlichen";
-App::$strings["Should posts be public"] = "Sollen die Beiträge öffentlich sein";
-App::$strings["Mirror all public posts"] = "Öffentliche Beiträge spiegeln";
-App::$strings["Pump.io Post Settings"] = "Pump.io-Beitragseinstellungen";
-App::$strings["PumpIO Settings saved."] = "PumpIO-Einstellungen gespeichert.";
-App::$strings["QR code"] = "QR-Code";
-App::$strings["QR Generator"] = "QR-Generator";
-App::$strings["Enter some text"] = "Etwas Text eingeben";
-App::$strings["Enable Rainbowtag"] = "Rainbowtag aktivieren";
-App::$strings["Rainbowtag Settings"] = "Rainbowtag-Einstellungen";
-App::$strings["Rainbowtag Settings saved."] = "Rainbowtag-Einstellungen gespeichert.";
-App::$strings["You're welcome."] = "Gern geschehen.";
-App::$strings["Ah shucks..."] = "";
-App::$strings["Don't mention it."] = "Keine Ursache.";
-App::$strings["&lt;blush&gt;"] = "";
-App::$strings["Redmatrix File Storage Import"] = "";
-App::$strings["This will import all your Redmatrix cloud files to this channel."] = "Hiermit werden alle deine Daten aus der Redmatrix Cloud in diesen Kanal importiert.";
-App::$strings["Redmatrix Server base URL"] = "Basis-URL des Redmatrix Servers";
-App::$strings["Redmatrix Login Username"] = "Redmatrix-Anmeldebenutzername";
-App::$strings["Redmatrix Login Password"] = "Redmatrix-Anmeldepasswort";
-App::$strings["file"] = "Datei";
-App::$strings["Photos imported"] = "Fotos importiert";
-App::$strings["Redmatrix Photo Album Import"] = "Redmatrix-Fotoalbumimport";
-App::$strings["This will import all your Redmatrix photo albums to this channel."] = "Hiermit werden all deine Fotoalben von Redmatrix in diesen Kanal importiert.";
-App::$strings["Import just this album"] = "Nur dieses Album importieren";
-App::$strings["Leave blank to import all albums"] = "Leer lassen um alle Alben zu importieren";
-App::$strings["Maximum count to import"] = "Maximal zu importierende Anzahl";
-App::$strings["0 or blank to import all available"] = "0 oder leer lassen um alles zu importieren";
+App::$strings["Save Settings"] = "Einstellungen speichern";
+App::$strings["text to include in all outgoing posts from this site"] = "Test der in alle Beiträge angefügt werden soll, die von dieser Seite ausgehen";
+App::$strings["Post to Friendica"] = "Bei Friendica veröffentlichen";
+App::$strings["rtof Settings saved."] = "rtof-Einstellungen gespeichert.";
+App::$strings["Allow posting to Friendica"] = "Erlaube die Veröffentlichung bei Friendica";
+App::$strings["Send public postings to Friendica by default"] = "Standardmäßig öffentliche Beiträge bei Friendica veröffentlichen";
+App::$strings["Friendica API Path"] = "Friendica-API-Pfad";
+App::$strings["https://{sitename}/api"] = "https://{sitename}/api";
+App::$strings["Friendica login name"] = "Friendica-Anmeldename";
+App::$strings["Friendica password"] = "Friendica-Passwort";
+App::$strings["Hubzilla to Friendica Post Settings"] = "";
+App::$strings["Status:"] = "Status:";
+App::$strings["Activate addon"] = "Addon aktiviren";
+App::$strings["Hide Jappixmini Chat-Widget from the webinterface"] = "Jappix Mini Chat-Widget von der Weboberfläche verbergen";
+App::$strings["Jabber username"] = "Jabber-Benutzername";
+App::$strings["Jabber server"] = "Jabber-Server";
+App::$strings["Jabber BOSH host URL"] = "Jabber BOSH Host URL";
+App::$strings["Jabber password"] = "Jabber-Passwort";
+App::$strings["Encrypt Jabber password with Hubzilla password"] = "Jabber-Passwort mit Hubzilla-Passwort verschlüsseln";
+App::$strings["Hubzilla password"] = "Hubzilla-Passwort";
+App::$strings["Approve subscription requests from Hubzilla contacts automatically"] = "";
+App::$strings["Purge internal list of jabber addresses of contacts"] = "Interne Liste der Jabber Adressen von Kontakten löschen";
+App::$strings["Configuration Help"] = "Konfigurationshilfe";
+App::$strings["Jappix Mini Settings"] = "Jappix Mini Einstellungen";
+App::$strings["Currently blocked"] = "Derzeit blockiert";
+App::$strings["No channels currently blocked"] = "Momentan sind keine Kanäle blockiert";
+App::$strings["\"Superblock\" Settings"] = "\"Superblock\"-Einstellungen";
+App::$strings["Block Completely"] = "Vollständig blockieren";
+App::$strings["superblock settings updated"] = "Superblock Einstellungen aktualisiert";
+App::$strings["Federate"] = "";
+App::$strings["nofed Settings saved."] = "nofed Einstellungen gespeichert";
+App::$strings["Allow Federation Toggle"] = "";
+App::$strings["Federate posts by default"] = "";
+App::$strings["NoFed Settings"] = "NoFed-Einstellungen";
App::$strings["Post to Red"] = "";
App::$strings["Channel is required."] = "Kanal ist erforderlich.";
-App::$strings["Invalid channel."] = "Ungültiger Kanal.";
App::$strings["redred Settings saved."] = "redred-Einstellungen gespeichert.";
App::$strings["Allow posting to another Hubzilla Channel"] = "Erlaube die Veröffentlichung in anderen Hubzilla Kanälen";
App::$strings["Send public postings to Hubzilla channel by default"] = "";
App::$strings["Hubzilla API Path"] = "Hubzilla-API-Pfad";
-App::$strings["https://{sitename}/api"] = "https://{sitename}/api";
App::$strings["Hubzilla login name"] = "Hubzilla-Anmeldename";
App::$strings["Hubzilla channel name"] = "Hubzilla-Kanalname";
-App::$strings["Nickname"] = "Spitzname";
App::$strings["Hubzilla Crosspost Settings"] = "";
-App::$strings["Post to Friendica"] = "Bei Friendica veröffentlichen";
-App::$strings["rtof Settings saved."] = "rtof-Einstellungen gespeichert.";
-App::$strings["Allow posting to Friendica"] = "Erlaube die Veröffentlichung bei Friendica";
-App::$strings["Send public postings to Friendica by default"] = "Standardmäßig öffentliche Beiträge bei Friendica veröffentlichen";
-App::$strings["Friendica API Path"] = "Friendica-API-Pfad";
-App::$strings["Friendica login name"] = "Friendica-Anmeldename";
-App::$strings["Friendica password"] = "Friendica-Passwort";
-App::$strings["Hubzilla to Friendica Post Settings"] = "";
-App::$strings["Extended Identity Sharing"] = "Erweitertes Teilen von Identitäten";
-App::$strings["Share your identity with all websites on the internet. When disabled, identity is only shared with sites in the matrix."] = "";
-App::$strings["Some setting"] = "Einige Einstellungen";
-App::$strings["A setting"] = "Eine Einstellung";
-App::$strings["Skeleton Settings"] = "";
-App::$strings["Deactivate the feature"] = "Diese Funktion abschalten";
-App::$strings["Hide the button and show the smilies directly."] = "Verstecke die Schaltfläche und zeige die Smilies direkt an.";
-App::$strings["Smileybutton Settings"] = "Smileyknopf-Einstellungen";
-App::$strings["Page to load after login"] = "Seite, die nach dem Login geladen werden soll";
-App::$strings["Examples: &quot;apps&quot;, &quot;network?f=&gid=37&quot; (privacy collection), &quot;channel&quot; or &quot;notifications/system&quot; (leave blank for default network page (grid)."] = "Beispiele: &quot;apps&quot;, &quot;network?f=&gid=37&quot; (Gruppen-gefilterte Beiträge), &quot;channel&quot; oder &quot;notifications/system&quot; (freilassen für die Standard-Netzwerkseite (grid).";
-App::$strings["Startpage Settings"] = "Startseiteneinstellungen";
+App::$strings["Logfile archive directory"] = "Verzeichnis der Logdatei";
+App::$strings["Directory to store rotated logs"] = "Verzeichnis, in dem rotierte Logs gespeichert werden sollen";
+App::$strings["Logfile size in bytes before rotating"] = "zu erreichende Logdateigröße in Bytes, bevor rotiert wird";
+App::$strings["Number of logfiles to retain"] = "Anzahl aufzubewahrender rotierter Logdateien";
+App::$strings["Friendica Photo Album Import"] = "Friendica-Fotoalbumimport";
+App::$strings["This will import all your Friendica photo albums to this Red channel."] = "Hiermit werden all deine Fotoalben von Friendica in diesen Hubzilla Kanal importiert.";
+App::$strings["Friendica Server base URL"] = "BasisURL des Friendica Servers";
+App::$strings["Friendica Login Username"] = "Friendica-Anmeldebenutzername";
+App::$strings["Friendica Login Password"] = "Friendica-Anmeldepasswort";
+App::$strings["Project Servers and Resources"] = "Projektserver und -ressourcen";
+App::$strings["Project Creator and Tech Lead"] = "Projektersteller und Technischer Leiter";
+App::$strings["Admin, developer, directorymin, support bloke"] = "Administrator, Entwickler, Verzeichnis Betreibender, Supportleistende";
+App::$strings["And the hundreds of other people and organisations who helped make the Hubzilla possible."] = "Und die hunderte anderen Menschen und Organisationen, die geholfen haben Hubzilla möglich zu machen.";
+App::$strings["The Redmatrix/Hubzilla projects are provided primarily by volunteers giving their time and expertise - and often paying out of pocket for services they share with others."] = "Die Redmatrix/Hubzilla Projekte werden hauptsächlich von Freiwilligen bereitgestellt, die ihre Zeit und Expertise zur Verfügung stellen - und oft aus eigener Tasche für die Dienste zahlen, die sie mit anderen teilen.";
+App::$strings["There is no corporate funding and no ads, and we do not collect and sell your personal information. (We don't control your personal information - <strong>you do</strong>.)"] = "Es gibt keine Finanzierung durch Firmen, keine Werbung und wir verkaufen Deine persönlichen Daten nicht. (Wir kontrollieren Deine persönlichen Daten nicht - <strong>das machst Du</strong>.)";
+App::$strings["Help support our ground-breaking work in decentralisation, web identity, and privacy."] = "Hilf uns bei unserer wegweisenden Arbeit im Bereich der Dezantralisation, von Web-Identitäten und Privatsphäre.";
+App::$strings["Your donations keep servers and services running and also helps us to provide innovative new features and continued development."] = "Die Spenden werden dafür verwendet Server und Dienste am laufen zu halten und helfen desweiteren innovative Neuerungen zu schaffen und die Entwicklung voran zu treiben.";
+App::$strings["Donate"] = "Spenden";
+App::$strings["Choose a project, developer, or public hub to support with a one-time donation"] = "Wähle ein Projekt, einen Entwickler oder einen öffentlichen Hub den du mit einer einmaligen Spende unterstützen willst.";
+App::$strings["Donate Now"] = "Jetzt spenden";
+App::$strings["<strong><em>Or</em></strong> become a project sponsor (Hubzilla Project only)"] = "<strong><em>Oder</em></strong> werde ein Unterstützer des Projekts (ausschließlich Hubzilla)";
+App::$strings["Please indicate if you would like your first name or full name (or nothing) to appear in our sponsor listing"] = "Bitte teile uns mit ob dein kompletter Name oder dein Vorname (oder gar nichts) auf unserer Sponsoren-Seite veröffentlicht werden soll.";
+App::$strings["Sponsor"] = "Sponsor";
+App::$strings["Special thanks to: "] = "Besonderer Dank an: ";
+App::$strings["This is a fairly comprehensive and complete guitar chord dictionary which will list most of the available ways to play a certain chord, starting from the base of the fingerboard up to a few frets beyond the twelfth fret (beyond which everything repeats). A couple of non-standard tunings are provided for the benefit of slide players, etc."] = "";
+App::$strings["Chord names start with a root note (A-G) and may include sharps (#) and flats (b). This software will parse most of the standard naming conventions such as maj, min, dim, sus(2 or 4), aug, with optional repeating elements."] = "";
+App::$strings["Valid examples include A, A7, Am7, Amaj7, Amaj9, Ammaj7, Aadd4, Asus2Add4, E7b13b11 ..."] = "Einige gültige Beispiele: A, A7, Am7, Amaj7, Amaj9, Ammaj7, Aadd4, Asus2Add4, E7b13b11 ...";
+App::$strings["Guitar Chords"] = "Gitarrenakkorde";
+App::$strings["The complete online chord dictionary"] = "Das komplette online Akkord-Verzeichnis";
+App::$strings["Tuning"] = "Stimmen";
+App::$strings["Chord name: example: Em7"] = "Beispiel Akkord Name: Em7";
+App::$strings["Show for left handed stringing"] = "Linkshänder-Besaitung anzeigen";
+App::$strings["Quick Reference"] = "Schnellreferenz";
+App::$strings["Post to Libertree"] = "Bei Libertree veröffentlichen";
+App::$strings["Enable Libertree Post Plugin"] = "Aktivire das Libertree-Plugin";
+App::$strings["Libertree API token"] = "Libertree API Token";
+App::$strings["Libertree site URL"] = "URL der Libertree Seite";
+App::$strings["Post to Libertree by default"] = "Standardmäßig bei Libertree veröffentlichen";
+App::$strings["Libertree Post Settings"] = "Libertree-Beitragseinstellungen";
+App::$strings["Libertree Settings saved."] = "Libertree-Einstellungen gespeichert.";
+App::$strings["Flattr this!"] = "Flattr this!";
+App::$strings["Flattr widget settings updated."] = "Flattr Widget Einstellungen aktualisiert";
+App::$strings["Flattr user"] = "Flattr Nutzer";
+App::$strings["URL of the Thing to flattr"] = "URL des Dings zum flattrn";
+App::$strings["If empty channel URL is used"] = "Falls leer wird die Channel URL verwendet";
+App::$strings["Title of the Thing to flattr"] = "Titel des Dings zum flattrn";
+App::$strings["If empty \"channel name on The Hubzilla\" will be used"] = "Falls leer wird \"Kanalname auf The Hubzilla\" verwendet";
+App::$strings["Static or dynamic flattr button"] = "Statischer oder dynamischer Flattr Button";
+App::$strings["static"] = "statisch";
+App::$strings["dynamic"] = "dynamisch";
+App::$strings["Alignment of the widget"] = "Ausrichtung des Widgets";
+App::$strings["left"] = "links";
+App::$strings["right"] = "rechts";
+App::$strings["Enable Flattr widget"] = "Flattr Widget verwenden";
+App::$strings["Flattr Widget Settings"] = "Flattr Widget Einstellungen";
App::$strings["Post to GNU social"] = "Bei GNU social veröffentlichen";
App::$strings["Please contact your site administrator.<br />The provided API URL is not valid."] = "Bitte kontaktiere den Administrator deines Hubs.<br />Die angegebene API URL ist nicht korrekt.";
App::$strings["We could not contact the GNU social API with the Path you entered."] = "Mit dem angegebenen Pfad war es uns nicht möglich, die GNU social API zu erreichen.";
@@ -2128,25 +2253,43 @@ App::$strings["Clear OAuth configuration"] = "OAuth Konfiguration löschen";
App::$strings["GNU social Post Settings"] = "GNU social Einstellungen";
App::$strings["API URL"] = "API-URL";
App::$strings["Application name"] = "Anwendungsname";
-App::$strings["Currently blocked"] = "Derzeit blockiert";
-App::$strings["No channels currently blocked"] = "Momentan sind keine Kanäle blockiert";
-App::$strings["\"Superblock\" Settings"] = "\"Superblock\"-Einstellungen";
-App::$strings["Block Completely"] = "Vollständig blockieren";
-App::$strings["superblock settings updated"] = "Superblock Einstellungen aktualisiert";
-App::$strings["Your account on %s will expire in a few days."] = "Dein Account auf %s wird in ein paar Tagen ablaufen.";
-App::$strings["Your $Productname test account is about to expire."] = "Dein $Productname Test-Account wird bald auslaufen.";
-App::$strings["Three Dimensional Tic-Tac-Toe"] = "Dreidimensionales Tic-Tac-Toe";
-App::$strings["3D Tic-Tac-Toe"] = "3D Tic-Tac-Toe";
-App::$strings["New game"] = "Neues Spiel";
-App::$strings["New game with handicap"] = "Neues Handicaü-Spiel";
-App::$strings["Three dimensional tic-tac-toe is just like the traditional game except that it is played on multiple levels simultaneously. "] = "3D Tic-Tac-Toe funktioniert wie das ursprüngliche Spiel, nur dass es auf mehreren Ebenen gleichzeitig gespielt wird.";
-App::$strings["In this case there are three levels. You win by getting three in a row on any level, as well as up, down, and diagonally across the different levels."] = "In diesem Fall sind es drei Ebenen. Du gewinnst, wenn es dir gelingt drei in einer Reihe auf einer beliebigen Ebene oder diagonal über die verschiedenen Ebenen hinweg zu erreichen.";
-App::$strings["The handicap game disables the center position on the middle level because the player claiming this square often has an unfair advantage."] = "Bei einem Handicap-Spiel wird die Position im Zentrum der mittleren Ebene gesperrt, da der Spieler der dieses Feld für sich beansprucht meist einen unfairen Vorteil hat.";
-App::$strings["You go first..."] = "Du darfst anfangen...";
-App::$strings["I'm going first this time..."] = "Diesmal werde ich anfangen...";
-App::$strings["You won!"] = "Sie haben gewonnen!";
-App::$strings["\"Cat\" game!"] = "\"Katzen\"-Spiel!";
-App::$strings["I won!"] = "Ich habe gewonnen!";
+App::$strings["QR code"] = "QR-Code";
+App::$strings["QR Generator"] = "QR-Generator";
+App::$strings["Enter some text"] = "Etwas Text eingeben";
+App::$strings["Invalid game."] = "Ungültiges Spiel.";
+App::$strings["You are not a player in this game."] = "Sie sind kein Spieler in diesem Spiel.";
+App::$strings["You must be a local channel to create a game."] = "Um ein Spiel zu eröffnen, musst du ein lokaler Kanal sein";
+App::$strings["You must select one opponent that is not yourself."] = "Du musst einen Gegner wählen, der nicht du selbst ist";
+App::$strings["Creating new game..."] = "Neues Spiel wird erstellt...";
+App::$strings["You must select white or black."] = "Sie müssen weiß oder schwarz auswählen.";
+App::$strings["Error creating new game."] = "Fehler beim Erstellen eines neuen Spiels.";
+App::$strings["Requested channel is not available."] = "Angeforderte Kanal nicht verfügbar.";
+App::$strings["You must select a local channel /chess/channelname"] = "Du musst einen lokalen Kanal/Schach(Kanalnamen aufwählen";
+App::$strings["Enable notifications"] = "Benachrichtigungen aktivieren";
+App::$strings["Post to Twitter"] = "Bei Twitter veröffentlichen";
+App::$strings["Twitter settings updated."] = "Twitter-Einstellungen aktualisiert.";
+App::$strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "Es wurde kein Consumer-Schlüsselpaar für Twitter gefunden. Bitte kontaktiere deinen Seiten-Administrator.";
+App::$strings["At this Hubzilla instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "";
+App::$strings["Log in with Twitter"] = "Mit Twitter anmelden";
+App::$strings["Copy the PIN from Twitter here"] = "PIN von Twitter hier her kopieren";
+App::$strings["<strong>Note:</strong> Due your privacy settings (<em>Hide your profile details from unknown viewers?</em>) the link potentially included in public postings relayed to Twitter will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted."] = "";
+App::$strings["Allow posting to Twitter"] = "Erlaube die Veröffentlichung bei Twitter";
+App::$strings["If enabled your public postings can be posted to the associated Twitter account"] = "Wenn aktiv können deine öffentlichen Beiträge bei dem verbundenen Twitter Account veröffentlicht werden.";
+App::$strings["Send public postings to Twitter by default"] = "Standardmäßig öffentliche Beiträge bei Twitter veröffentlichen";
+App::$strings["If enabled your public postings will be posted to the associated Twitter account by default"] = "Wenn aktiv können deine öffentlichen Beiträge bei dem verbundenen Twitter Account veröffentlicht werden.";
+App::$strings["Twitter Post Settings"] = "Twitter-Beitragseinstellungen";
+App::$strings["Deactivate the feature"] = "Diese Funktion abschalten";
+App::$strings["Hide the button and show the smilies directly."] = "Verstecke die Schaltfläche und zeige die Smilies direkt an.";
+App::$strings["Smileybutton Settings"] = "Smileyknopf-Einstellungen";
+App::$strings["This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> analytics tool."] = "Diese Website verwendet <a href='http://www.piwik.org'>Piwik</a>, um die Besucherzugriffe auszuwerten.";
+App::$strings["If you do not want that your visits are logged this way you <a href='%s'>can set a cookie to prevent Piwik from tracking further visits of the site</a> (opt-out)."] = "Wenn Du nicht möchtest, dass Deine Besuche zu diesem Zweck gespeichert werden, kannst Du <a href='%s'>ein Cookie setzen, welches Piwik davon abhält, Deine weiteren Besuche auf dieser Website zu verfolgen</a> (Opt-out).";
+App::$strings["Piwik Base URL"] = "Piwik Basis-URL";
+App::$strings["Absolute path to your Piwik installation. (without protocol (http/s), with trailing slash)"] = "Der absolute Pfad zu Deiner Piwik-Installation (ohne Protokoll (http/s), aber mit abschließendem Schrägstrich / ).";
+App::$strings["Site ID"] = "Seitenkennung";
+App::$strings["Show opt-out cookie link?"] = "Den Opt-out Cookie-Link anzeigen?";
+App::$strings["Asynchronous tracking"] = "Asynchrones Tracking";
+App::$strings["Enable frontend JavaScript error tracking"] = "Ermögliche Frontend-JavaScript-Fehlertracking";
+App::$strings["This feature requires Piwik >= 2.2.0"] = "Diese Funktion erfordert Piwik >= 2.2.0";
App::$strings["Edit your profile and change settings."] = "Bearbeite dein Profil und ändere die Einstellungen.";
App::$strings["Click here to see activity from your connections."] = "Klicke hier, um die Aktivitäten Deiner Verbindungen zu sehen.";
App::$strings["Click here to see your channel home."] = "Klicke hier, um Deine Kanal-Hauptseite zu sehen.";
@@ -2182,43 +2325,45 @@ App::$strings["Save your search so you can repeat it at a later date."] = "Speic
App::$strings["If you see this icon you can be sure that the sender is who it say it is. It is normal that it is not always possible to verify the sender, so the icon will be missing sometimes. There is usually no need to worry about that."] = "Wenn Du dieses Symbol siehst, kannst Du weitgehend sicher sein, dass der Ansender dem angegebenen entspricht. Nicht immer ist es möglich, den Absender zu verifizieren, daher fehlt das Symbol mitunter. Das ist aber in der Regel kein Grund zur Sorge.";
App::$strings["Danger! It seems someone tried to forge a message! This message is not necessarily from who it says it is from!"] = "Vorsicht! Es kann sein, dass jemand versucht, eine Nachricht zu fälschen! Diese Nachricht muss nicht unbedingt vom angegebenen Absender stammen!";
App::$strings["Welcome to Hubzilla! Would you like to see a tour of the UI?</p> <p>You can pause it at any time and continue where you left off by reloading the page, or navigting to another page.</p><p>You can also advance by pressing the return key"] = "Willkommen zu Hubzilla! Möchtest Du eine Tour der Benutzeroberfläche angezeigt bekommen?</p><p>Du kannst zu jeder Zeit pausieren und fortsetzen, wo Du aufgehört hast, indem Du die Seite neu lädtst, oder zu einer anderen Seite springst.</p><p>Du kannst auc durch das Drücken der Enter-Taste weitergehen.";
-App::$strings["Post to Twitter"] = "Bei Twitter veröffentlichen";
-App::$strings["Twitter settings updated."] = "Twitter-Einstellungen aktualisiert.";
-App::$strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "Es wurde kein Consumer-Schlüsselpaar für Twitter gefunden. Bitte kontaktiere deinen Seiten-Administrator.";
-App::$strings["At this Hubzilla instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "";
-App::$strings["Log in with Twitter"] = "Mit Twitter anmelden";
-App::$strings["Copy the PIN from Twitter here"] = "PIN von Twitter hier her kopieren";
-App::$strings["<strong>Note:</strong> Due your privacy settings (<em>Hide your profile details from unknown viewers?</em>) the link potentially included in public postings relayed to Twitter will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted."] = "";
-App::$strings["Allow posting to Twitter"] = "Erlaube die Veröffentlichung bei Twitter";
-App::$strings["If enabled your public postings can be posted to the associated Twitter account"] = "Wenn aktiv können deine öffentlichen Beiträge bei dem verbundenen Twitter Account veröffentlicht werden.";
-App::$strings["Send public postings to Twitter by default"] = "Standardmäßig öffentliche Beiträge bei Twitter veröffentlichen";
-App::$strings["If enabled your public postings will be posted to the associated Twitter account by default"] = "Wenn aktiv können deine öffentlichen Beiträge bei dem verbundenen Twitter Account veröffentlicht werden.";
-App::$strings["Twitter Post Settings"] = "Twitter-Beitragseinstellungen";
-App::$strings["Submit Settings"] = "Einstellungen absenden";
-App::$strings["Show Upload Limits"] = "Hochladebeschränkungen anzeigen";
-App::$strings["Hubzilla configured maximum size: "] = "Die in Hubzilla eingestellte maximale Größe:";
-App::$strings["PHP upload_max_filesize: "] = "PHP upload_max_filesize:";
-App::$strings["PHP post_max_size (must be larger than upload_max_filesize): "] = "PHP post_max_size (muss größer sein als upload_max_filesize):";
-App::$strings["Recent Channel/Profile Viewers"] = "Kürzliche Kanal/Profil Besucher";
-App::$strings["This plugin/addon has not been configured."] = "Dieses Plugin/Addon wurde noch nicht konfiguriert.";
-App::$strings["Please visit the Visage settings on %s"] = "Bitte rufe die Visage Einstellungen auf %s auf";
-App::$strings["your feature settings page"] = "Die Funktions-Einstellungsseite";
-App::$strings["No entries."] = "Keine Einträge.";
-App::$strings["Enable Visage Visitor Logging"] = "Aktiviere das Visage-Besucher Logging";
-App::$strings["Visage Settings"] = "Visage-Einstellungen";
-App::$strings["Who likes me?"] = "Wer mag mich?";
-App::$strings["Post to WordPress"] = "Auf WordPress posten";
-App::$strings["Enable WordPress Post Plugin"] = "Aktiviere das WordPress-Plugin";
-App::$strings["WordPress username"] = "WordPress-Benutzername";
-App::$strings["WordPress password"] = "WordPress-Passwort";
-App::$strings["WordPress API URL"] = "WordPress-API-URL";
-App::$strings["Typically https://your-blog.tld/xmlrpc.php"] = "Normalerweise https://your-blog.tld/xmlrpc.php";
-App::$strings["WordPress blogid"] = "WordPress blogid";
-App::$strings["For multi-user sites such as wordpress.com, otherwise leave blank"] = "Nötig für Mehrbenutzer Seiten wie wordpress.com, andernfalls frei lassen";
-App::$strings["Post to WordPress by default"] = "Standardmäßig auf auf WordPress posten";
-App::$strings["Forward comments (requires hubzilla_wp plugin)"] = "Kommentare weiterleiten (benötigt hubzilla_wp Plugin)";
-App::$strings["WordPress Post Settings"] = "WordPress-Beitragseinstellungen";
-App::$strings["Wordpress Settings saved."] = "Wordpress-Einstellungen gespeichert.";
+App::$strings["Extended Identity Sharing"] = "Erweitertes Teilen von Identitäten";
+App::$strings["Share your identity with all websites on the internet. When disabled, identity is only shared with sites in the matrix."] = "";
+App::$strings["Three Dimensional Tic-Tac-Toe"] = "Dreidimensionales Tic-Tac-Toe";
+App::$strings["3D Tic-Tac-Toe"] = "3D Tic-Tac-Toe";
+App::$strings["New game"] = "Neues Spiel";
+App::$strings["New game with handicap"] = "Neues Handicaü-Spiel";
+App::$strings["Three dimensional tic-tac-toe is just like the traditional game except that it is played on multiple levels simultaneously. "] = "3D Tic-Tac-Toe funktioniert wie das ursprüngliche Spiel, nur dass es auf mehreren Ebenen gleichzeitig gespielt wird.";
+App::$strings["In this case there are three levels. You win by getting three in a row on any level, as well as up, down, and diagonally across the different levels."] = "In diesem Fall sind es drei Ebenen. Du gewinnst, wenn es dir gelingt drei in einer Reihe auf einer beliebigen Ebene oder diagonal über die verschiedenen Ebenen hinweg zu erreichen.";
+App::$strings["The handicap game disables the center position on the middle level because the player claiming this square often has an unfair advantage."] = "Bei einem Handicap-Spiel wird die Position im Zentrum der mittleren Ebene gesperrt, da der Spieler der dieses Feld für sich beansprucht meist einen unfairen Vorteil hat.";
+App::$strings["You go first..."] = "Du darfst anfangen...";
+App::$strings["I'm going first this time..."] = "Diesmal werde ich anfangen...";
+App::$strings["You won!"] = "Sie haben gewonnen!";
+App::$strings["\"Cat\" game!"] = "\"Katzen\"-Spiel!";
+App::$strings["I won!"] = "Ich habe gewonnen!";
+App::$strings["Message to display on every page on this server"] = "Nachricht, die auf jeder Seite dieses Servers angezeigt werden soll";
+App::$strings["Pageheader Settings"] = "Nachrichtenkopf-Einstellungen";
+App::$strings["pageheader Settings saved."] = "Nachrichtenkopf-Einstellungen gespeichert.";
+App::$strings["lonely"] = "einsam";
+App::$strings["drunk"] = "betrunken";
+App::$strings["horny"] = "geil";
+App::$strings["stoned"] = "bekifft";
+App::$strings["fucked up"] = "beschissen";
+App::$strings["clusterfucked"] = "clusterfucked";
+App::$strings["crazy"] = "verrückt";
+App::$strings["hurt"] = "verletzt";
+App::$strings["sleepy"] = "müde";
+App::$strings["grumpy"] = "mürrisch";
+App::$strings["high"] = "hoch";
+App::$strings["semi-conscious"] = "halb bewusstlos";
+App::$strings["in love"] = "verliebt";
+App::$strings["in lust"] = "";
+App::$strings["naked"] = "nackt";
+App::$strings["stinky"] = "stinkend";
+App::$strings["sweaty"] = "verschwitzt";
+App::$strings["bleeding out"] = "blutend";
+App::$strings["victorious"] = "siegreich";
+App::$strings["defeated"] = "besiegt";
+App::$strings["envious"] = "neidisch";
+App::$strings["jealous"] = "eifersüchtig";
App::$strings["XMPP settings updated."] = "XMPP-Einstellungen aktualisiert.";
App::$strings["Enable Chat"] = "Chat aktivieren";
App::$strings["Individual credentials"] = "Individuelle Anmeldedaten";
@@ -2227,211 +2372,34 @@ App::$strings["XMPP Settings"] = "XMPP-Einstellungen";
App::$strings["Jabber BOSH host"] = "Jabber BOSH Host";
App::$strings["Use central userbase"] = "Zentrale Benutzerbasis verwenden";
App::$strings["If enabled, members will automatically login to an ejabberd server that has to be installed on this machine with synchronized credentials via the \"auth_ejabberd.php\" script."] = "";
-App::$strings["Select Channel"] = "Kanal auswählen";
-App::$strings["Read-write"] = "Lesen-schreiben";
-App::$strings["Read-only"] = "Nur Lesen";
-App::$strings["My Calendars"] = "Meine Kalender";
-App::$strings["Shared Calendars"] = "Geteilte Kalender";
-App::$strings["Share this calendar"] = "Diesen Kalender teilen";
-App::$strings["Calendar name and color"] = "Kalendername und -farbe";
-App::$strings["Create new calendar"] = "Neuen Kalender erstellen";
-App::$strings["Calendar Name"] = "Kalendername";
-App::$strings["Calendar Tools"] = "Kalenderwerkzeuge";
-App::$strings["Import calendar"] = "Kalender importieren";
-App::$strings["Select a calendar to import to"] = "Kalender zum Hineinimportieren auswählen";
-App::$strings["Addressbooks"] = "Adressbücher";
-App::$strings["Addressbook name"] = "Adressbuchname";
-App::$strings["Create new addressbook"] = "Neues Adressbuch erstellen";
-App::$strings["Addressbook Name"] = "Adressbuchname";
-App::$strings["Addressbook Tools"] = "Adressbuchwerkzeuge";
-App::$strings["Import addressbook"] = "Adressbuch importieren";
-App::$strings["Select an addressbook to import to"] = "Adressbuch zum Hineinimportieren auswählen";
-App::$strings["INVALID EVENT DISMISSED!"] = "UNGÃœLTIGEN TERMIN ABGELEHNT!";
-App::$strings["Summary: "] = "Zusammenfassung:";
-App::$strings["Date: "] = "Datum:";
-App::$strings["Reason: "] = "Grund:";
-App::$strings["INVALID CARD DISMISSED!"] = "UNGÃœLTIGE KARTE ABGELEHNT!";
-App::$strings["Name: "] = "Name: ";
-App::$strings["You have to enable this plugin in Feature/Addon Settings > CalDAV/CardDAV Settings before you can use it."] = "";
-App::$strings["Example: YYYY-MM-DD HH:mm"] = "Beispiel: JJJJ-MM-TT HH:mm";
-App::$strings["End date and time"] = "Enddatum und -zeit";
-App::$strings["List month"] = "";
-App::$strings["List week"] = "";
-App::$strings["List day"] = "";
-App::$strings["More"] = "Mehr";
-App::$strings["Less"] = "Weniger";
-App::$strings["Select calendar"] = "Kalender auswählen";
-App::$strings["Delete all"] = "Alles löschen";
-App::$strings["Sorry! Editing of recurrent events is not yet implemented."] = "Entschuldigung, aber das Bearbeiten von wiederkehrenden Veranstaltungen ist leider noch nicht implementiert.";
-App::$strings["Errors encountered creating database table: "] = "Fehler beim Anlegen der Datenbank-Tabellen aufgetreten.";
-App::$strings["Default Calendar"] = "Standardkalender";
-App::$strings["Default Addressbook"] = "Standardadressbuch";
-App::$strings["CalDAV/CardDAV Settings saved."] = "CalDAV/CardDAV-Einstellungen gespeichert.";
-App::$strings["Enable CalDAV/CardDAV Server for this channel"] = "Aktiviere den CalDAV/CardDAV Server für diesen Kanal";
-App::$strings["Your CalDAV resources are located at %s "] = "Deine CalDAV Resourcen sind unter %s verfügbar";
-App::$strings["Your CardDAV resources are located at %s "] = "Deine CardDAV Ressourcen sind unter %s verfügbar";
-App::$strings["CalDAV/CardDAV Settings"] = "CalDAV/CardDAV-Einstellungen";
-App::$strings["Home, Voice"] = "Zuhause, Sprache";
-App::$strings["Home, Fax"] = "Zuhause, Fax";
-App::$strings["Work, Voice"] = "Arbeit, Sprache";
-App::$strings["Work, Fax"] = "Arbeit, Fax";
-App::$strings["Invalid game."] = "Ungültiges Spiel.";
-App::$strings["You are not a player in this game."] = "Sie sind kein Spieler in diesem Spiel.";
-App::$strings["You must be a local channel to create a game."] = "Um ein Spiel zu eröffnen, musst du ein lokaler Kanal sein";
-App::$strings["You must select one opponent that is not yourself."] = "Du musst einen Gegner wählen, der nicht du selbst ist";
-App::$strings["Creating new game..."] = "Neues Spiel wird erstellt...";
-App::$strings["You must select white or black."] = "Sie müssen weiß oder schwarz auswählen.";
-App::$strings["Error creating new game."] = "Fehler beim Erstellen eines neuen Spiels.";
-App::$strings["Requested channel is not available."] = "Angeforderte Kanal nicht verfügbar.";
-App::$strings["You must select a local channel /chess/channelname"] = "Du musst einen lokalen Kanal/Schach(Kanalnamen aufwählen";
-App::$strings["Enable notifications"] = "Benachrichtigungen aktivieren";
-App::$strings["Your Webbie:"] = "Dein Webbie";
-App::$strings["Fontsize (px):"] = "Schriftgröße (px):";
-App::$strings["Link:"] = "Link:";
-App::$strings["Like us on Hubzilla"] = "Like us on Hubzilla";
-App::$strings["Embed:"] = "Einbetten";
-App::$strings["Male"] = "Männlich";
-App::$strings["Female"] = "Weiblich";
-App::$strings["First Name"] = "Vorname";
-App::$strings["Last Name"] = "Nachname";
-App::$strings["Full Name"] = "Voller Name";
-App::$strings["Profile Photo 16px"] = "Profilfoto 16 px";
-App::$strings["Profile Photo 32px"] = "Profilfoto 32 px";
-App::$strings["Profile Photo 48px"] = "Profilfoto 48 px";
-App::$strings["Profile Photo 64px"] = "Profilfoto 64 px";
-App::$strings["Profile Photo 80px"] = "Profilfoto 80 px";
-App::$strings["Profile Photo 128px"] = "Profilfoto 128 px";
-App::$strings["Timezone"] = "Zeitzone";
-App::$strings["Birth Year"] = "Geburtsjahr";
-App::$strings["Birth Month"] = "Geburtsmonat";
-App::$strings["Birth Day"] = "Geburtstag";
-App::$strings["Birthdate"] = "Geburtsdatum";
-App::$strings["We encountered a problem while logging in with the OpenID you provided. Please check the correct spelling of the ID."] = "Wir haben ein Problem mit der OpenID festgestellt, mit der Du Dich anmelden wolltest. Bitte überprüfe sie noch einmal.";
-App::$strings["The error message was:"] = "Die Fehlermeldung war:";
-App::$strings["OpenID protocol error. No ID returned."] = "OpenID-Protokollfehler. Keine Kennung zurückgegeben.";
-App::$strings["Login failed."] = "Login fehlgeschlagen.";
-App::$strings["Reconnecting %d connections"] = "Erneuere %d Verbindungen";
-App::$strings["Diaspora Reconnect"] = "";
-App::$strings["Use this form to re-establish Diaspora connections which were initially made from a different hub."] = "";
-App::$strings["Reconnect"] = "Erneut verbinden";
-App::$strings["Send test email"] = "Test-E-Mail senden";
-App::$strings["Mail sent."] = "Mail gesendet.";
-App::$strings["Sending of mail failed."] = "Senden der E-Mail fehlgeschlagen.";
-App::$strings["Mail Test"] = "Mail Test";
-App::$strings["Errors encountered deleting database table "] = "Beim Löschen der Datenbanktabelle sind Fehler aufgetreten.";
-App::$strings["Drop tables when uninstalling?"] = "Lösche Tabellen beim Deinstallieren?";
-App::$strings["If checked, the Rendezvous database tables will be deleted when the plugin is uninstalled."] = "Wenn ausgewählt, werden die Rendezvous-Tabellen in der Datenbank gelöscht, sobald das Plugin deinstalliert wird.";
-App::$strings["Mapbox Access Token"] = "Mapbox Zugangs-Token";
-App::$strings["If you enter a Mapbox access token, it will be used to retrieve map tiles from Mapbox instead of the default OpenStreetMap tile server."] = "Wenn Du ein Mapbox Zugangs-Token eingibst, werden die Kartendaten (Kacheln) damit von Mapbox geladen, anstatt von OpenStreetMap, welches die Voreinstellung ist.";
-App::$strings["Rendezvous"] = "Rendezvous";
-App::$strings["This identity has been deleted by another member due to inactivity. Please press the \"New identity\" button or refresh the page to register a new identity. You may use the same name."] = "Diese Identität wurde von einem anderen Mitglied aufgrund von Inaktivität gelöscht. Bitte klicke auf \"Neue Identität\" oder aktualisiere die Website im Browser, um eine neue Identität zu registrieren. Du kannst dabei den selben Namen verwenden.";
-App::$strings["Welcome to Rendezvous!"] = "Willkommen bei Rendezvous!";
-App::$strings["Enter your name to join this rendezvous. To begin sharing your location with the other members, tap the GPS control. When your location is discovered, a red dot will appear and others will be able to see you on the map."] = "Gib Deinen Namen ein, um diesem Rendezvous beizutreten. Um Deinen Standort mit anderen Mitgliedern zu teilen, klicke auf das GPS Symbol. Sobald Dein Standort ermittelt ist, erscheint ein roter Punkt, und die Anderen werden Dich auf der Karte sehen können.";
-App::$strings["Let's meet here"] = "Lasst uns hier treffen";
-App::$strings["New marker"] = "Neue Markierung";
-App::$strings["Edit marker"] = "Markierung bearbeiten";
-App::$strings["New identity"] = "Neue Identität";
-App::$strings["Delete marker"] = "Markierung löschen";
-App::$strings["Delete member"] = "Mitglied löschen";
-App::$strings["Edit proximity alert"] = "Annäherungsalarm bearbeiten";
-App::$strings["A proximity alert will be issued when this member is within a certain radius of you.<br><br>Enter a radius in meters (0 to disable):"] = "Ein Annäherungsalarm wird ausgelöst werden, sobald sich dieses Mitglied innerhalb eines bestimmten Radius von Dir aufhält.<br><br>Gib einen Radius in Metern ein (0 zum Abschalten der Funktion):";
-App::$strings["distance"] = "Entfernung";
-App::$strings["Proximity alert distance (meters)"] = "";
-App::$strings["A proximity alert will be issued when you are within a certain radius of the marker location.<br><br>Enter a radius in meters (0 to disable):"] = "Ein Annäherungsalarm wird ausgelöst werden, sobald Du Dich innerhalb eines bestimmten Radius der Markierung aufhält.<br><br>Gib einen Radius in Metern ein (0 zum Abschalten der Funktion):";
-App::$strings["Marker proximity alert"] = "Annäherungsalarm für Markierung";
-App::$strings["Reminder note"] = "Erinnerungshinweis";
-App::$strings["Enter a note to be displayed when you are within the specified proximity..."] = "Gib eine Nachricht ein, die angezeigt werden soll, wenn Du Dich in der festgelegten Nähe befindest...";
-App::$strings["Add new rendezvous"] = "Neues Rendezvous hinzufügen";
-App::$strings["Create a new rendezvous and share the access link with those you wish to invite to the group. Those who open the link become members of the rendezvous. They can view other member locations, add markers to the map, or share their own locations with the group."] = "Erstelle ein neues Rendezvous und teile den Zugriffslink mit allen, die Du in die Gruppe einladen möchtest. Die, die den Link öffnen, werden Mitglieder des Rendezvous. Sie können die Standorte der anderen Mitglieder sehen, Marker zur Karte hinzufügen oder ihre eigenen Standorte mit der Gruppe teilen.";
-App::$strings["Install Firefox Sharing Tools"] = "";
-App::$strings["Share content from Firefox to \$Projectname"] = "Inhalte von Firefox nach \$Projectname teilen";
-App::$strings["Install Firefox Sharing Tools to this web browser"] = "";
-App::$strings["Error retrieving wiki"] = "Fehler beim Abrufen des Wiki";
-App::$strings["Error creating zip file export folder"] = "Fehler bei der Erzeugung des Zip-Datei Export-Verzeichnisses ";
-App::$strings["Error downloading wiki: "] = "Fehler beim Herunterladen des Wiki:";
-App::$strings["Wiki Pages"] = "Wikiseiten";
-App::$strings["Add new page"] = "Neue Seite hinzufügen";
-App::$strings["Page name"] = "Seitenname";
-App::$strings["Wiki List"] = "Wikiliste";
-App::$strings["Enable the GNU-Social protocol for this channel"] = "GNU Social Protokoll für diesen Kanal aktualisieren";
-App::$strings["__ctx:opensearch__ Search %1\$s (%2\$s)"] = "Suche %1\$s (%2\$s)";
-App::$strings["__ctx:opensearch__ \$Projectname"] = "\$Projectname";
-App::$strings["Search \$Projectname"] = "";
-App::$strings["Cannot locate DNS info for database server '%s'"] = "Kann die DNS-Informationen für den Datenbank-Server '%s' nicht finden";
-App::$strings["default"] = "Standard";
-App::$strings["Select an alternate language"] = "Wähle eine alternative Sprache";
-App::$strings["Not a valid email address"] = "Ungültige E-Mail-Adresse";
-App::$strings["Your email domain is not among those allowed on this site"] = "Deine E-Mail-Adresse ist auf dieser Seite nicht erlaubt";
-App::$strings["Your email address is already registered at this site."] = "Deine E-Mail-Adresse ist auf dieser Seite bereits registriert.";
-App::$strings["An invitation is required."] = "Eine Einladung wird benötigt.";
-App::$strings["Invitation could not be verified."] = "Die Einladung konnte nicht bestätigt werden.";
-App::$strings["Please enter the required information."] = "Bitte gib die benötigten Informationen ein.";
-App::$strings["Failed to store account information."] = "Speichern der Nutzerkontodaten fehlgeschlagen.";
-App::$strings["Registration confirmation for %s"] = "Registrierungsbestätigung für %s";
-App::$strings["Registration request at %s"] = "Registrierungsanfrage auf %s";
-App::$strings["your registration password"] = "Dein Registrierungspasswort";
-App::$strings["Registration details for %s"] = "Registrierungsdetails für %s";
-App::$strings["Account approved."] = "Nutzerkonto bestätigt.";
-App::$strings["Registration revoked for %s"] = "Registrierung für %s wurde widerrufen";
-App::$strings["Click here to upgrade."] = "Klicke hier, um das Upgrade durchzuführen.";
-App::$strings["This action exceeds the limits set by your subscription plan."] = "Diese Aktion überschreitet die Grenzen Ihres Abonnements.";
-App::$strings["This action is not available under your subscription plan."] = "Diese Aktion ist in Ihrem Abonnement nicht verfügbar.";
-App::$strings["Who can see this?"] = "Wer kann das sehen?";
-App::$strings["Custom selection"] = "Benutzerdefinierte Auswahl";
-App::$strings["Select \"Show\" to allow viewing. \"Don't show\" lets you override and limit the scope of \"Show\"."] = "Wähle \"Anzeigen\", um Betrachtung zuzulassen. \"Nicht anzeigen\" überstimmt und limitiert den Aktionsradius von \"Anzeigen\" für Ausnahmen.";
-App::$strings["Show"] = "Anzeigen";
-App::$strings["Don't show"] = "Nicht anzeigen";
-App::$strings["Post permissions %s cannot be changed %s after a post is shared.</br />These permissions set who is allowed to view the post."] = "Beitragsberechtigungen %s können nicht geändert werden %s, nachdem der Beitrag gesendet wurde.<br />Diese Berechtigungen bestimmen, wer den Beitrag sehen kann.";
-App::$strings["Categories"] = "Kategorien";
-App::$strings["Tags"] = "Schlagwörter";
-App::$strings["Keywords"] = "Schlüsselwörter";
-App::$strings["have"] = "habe";
-App::$strings["has"] = "hat";
-App::$strings["want"] = "will";
-App::$strings["wants"] = "will";
-App::$strings["likes"] = "gefällt";
-App::$strings["dislikes"] = "missfällt";
-App::$strings["Attachments:"] = "Anhänge:";
-App::$strings["l F d, Y \\@ g:i A"] = "l, d. F Y, H:i";
-App::$strings["\$Projectname event notification:"] = "\$Projectname-Terminbenachrichtigung:";
-App::$strings["Starts:"] = "Beginnt:";
-App::$strings["Finishes:"] = "Endet:";
-App::$strings["Birthday"] = "Geburtstag";
-App::$strings["Age: "] = "Alter:";
-App::$strings["YYYY-MM-DD or MM-DD"] = "JJJJ-MM-TT oder MM-TT";
-App::$strings["never"] = "Nie";
-App::$strings["less than a second ago"] = "Vor weniger als einer Sekunde";
-App::$strings["__ctx:e.g. 22 hours ago, 1 minute ago__ %1\$d %2\$s ago"] = "vor %1\$d %2\$s";
-App::$strings["__ctx:relative_date__ year"] = array(
- 0 => "Jahr",
- 1 => "Jahre",
-);
-App::$strings["__ctx:relative_date__ month"] = array(
- 0 => "Monat",
- 1 => "Monate",
-);
-App::$strings["__ctx:relative_date__ week"] = array(
- 0 => "Woche",
- 1 => "Wochen",
-);
-App::$strings["__ctx:relative_date__ day"] = array(
- 0 => "Tag",
- 1 => "Tage",
-);
-App::$strings["__ctx:relative_date__ hour"] = array(
- 0 => "Stunde",
- 1 => "Stunden",
-);
-App::$strings["__ctx:relative_date__ minute"] = array(
- 0 => "Minute",
- 1 => "Minuten",
-);
-App::$strings["__ctx:relative_date__ second"] = array(
- 0 => "Sekunde",
- 1 => "Sekunden",
-);
-App::$strings["%1\$s's birthday"] = "%1\$ss Geburtstag";
-App::$strings["Happy Birthday %1\$s"] = "Alles Gute zum Geburtstag, %1\$s";
+App::$strings["Who likes me?"] = "Wer mag mich?";
+App::$strings["You are now authenticated to pumpio."] = "Du bist nun bei pumpio authenzifiziert.";
+App::$strings["return to the featured settings page"] = "";
+App::$strings["Post to Pump.io"] = "Bei pumpio veröffentlichen";
+App::$strings["Pump.io servername"] = "Pump.io-Servername";
+App::$strings["Without \"http://\" or \"https://\""] = "Ohne \"http://\" oder \"https://\"";
+App::$strings["Pump.io username"] = "Pump.io-Benutzername";
+App::$strings["Without the servername"] = "Ohne dem Servernamen";
+App::$strings["You are not authenticated to pumpio"] = "Du bist nicht bei pumpio authentifiziert.";
+App::$strings["(Re-)Authenticate your pump.io connection"] = "Deine pumpio Verbindung (erneut) authentifizieren";
+App::$strings["Enable pump.io Post Plugin"] = "Aktiviere das pumpio-Plugin";
+App::$strings["Post to pump.io by default"] = "Standardmäßig bei pumpio veröffentlichen";
+App::$strings["Should posts be public"] = "Sollen die Beiträge öffentlich sein";
+App::$strings["Mirror all public posts"] = "Öffentliche Beiträge spiegeln";
+App::$strings["Pump.io Post Settings"] = "Pump.io-Beitragseinstellungen";
+App::$strings["PumpIO Settings saved."] = "PumpIO-Einstellungen gespeichert.";
+App::$strings["An account has been created for you."] = "Ein Konto wurde für Sie erstellt.";
+App::$strings["Authentication successful but rejected: account creation is disabled."] = "Authentifizierung war erfolgreich wurde aber abgewiesen! Das Anlegen von Accounts wurde deaktiviert.";
+App::$strings["Search \$Projectname"] = "\$Projectname suchen";
+App::$strings["Redmatrix File Storage Import"] = "";
+App::$strings["This will import all your Redmatrix cloud files to this channel."] = "Hiermit werden alle deine Daten aus der Redmatrix Cloud in diesen Kanal importiert.";
+App::$strings["file"] = "Datei";
+App::$strings["Send email to all members"] = "E-Mail an alle Mitglieder senden";
+App::$strings["$1%s Administrator"] = "$1%s Administrator";
+App::$strings["%1\$d of %2\$d messages sent."] = "%1\$d von %2\$d Nachrichten gesendet.";
+App::$strings["Send email to all hub members."] = "Eine E-Mail an alle Mitglieder dieses Hubs senden.";
+App::$strings["Sender Email address"] = "E-Mail Adresse des Absenders";
+App::$strings["Test mode (only send to hub administrator)"] = "Test Modus (nur an Hub Administratoren senden)";
App::$strings["Frequently"] = "Häufig";
App::$strings["Hourly"] = "Stündlich";
App::$strings["Twice daily"] = "Zwei Mal am Tag";
@@ -2492,9 +2460,6 @@ App::$strings["Uncertain"] = "Ungewiss";
App::$strings["It's complicated"] = "Es ist kompliziert";
App::$strings["Don't care"] = "Interessiert mich nicht";
App::$strings["Ask me"] = "Frag mich mal";
-App::$strings["New window"] = "Neues Fenster";
-App::$strings["Open the selected location in a different window or browser tab"] = "Öffne die markierte Adresse in einem neuen Browserfenster oder Tab";
-App::$strings["User '%s' deleted"] = "Benutzer '%s' gelöscht";
App::$strings["%1\$s is now connected with %2\$s"] = "%1\$s ist jetzt mit %2\$s verbunden";
App::$strings["%1\$s poked %2\$s"] = "%1\$s stupste %2\$s an";
App::$strings["poked"] = "stupste";
@@ -2559,7 +2524,6 @@ App::$strings["Status Messages and Posts"] = "Statusnachrichten und Beiträge";
App::$strings["Profile Details"] = "Profil-Details";
App::$strings["Photo Albums"] = "Fotoalben";
App::$strings["Files and Storage"] = "Dateien und Speicher";
-App::$strings["Chatrooms"] = "Chaträume";
App::$strings["Bookmarks"] = "Lesezeichen";
App::$strings["Saved Bookmarks"] = "Gespeicherte Lesezeichen";
App::$strings["View Webpages"] = "Webseiten anzeigen";
@@ -2587,110 +2551,111 @@ App::$strings["__ctx:noun__ Abstain"] = array(
0 => "Enthaltung",
1 => "Enthaltungen",
);
-App::$strings["Unable to determine sender."] = "Kann Absender nicht bestimmen.";
-App::$strings["No recipient provided."] = "Kein Empfänger angegeben";
-App::$strings["[no subject]"] = "[no subject]";
-App::$strings["Stored post could not be verified."] = "Gespeicherter Beitrag konnten nicht überprüft werden.";
-App::$strings["guest:"] = "Gast:";
-App::$strings["The form security token was not correct. This probably happened because the form has been opened for too long (>3 hours) before submitting it."] = "Das Security-Token des Formulars war nicht korrekt. Das ist wahrscheinlich passiert, weil das Formular zu lange (>3 Stunden) offen war, bevor es abgeschickt wurde.";
-App::$strings["System"] = "System";
-App::$strings["New App"] = "Neue App";
-App::$strings["Edit Apps"] = "Apps bearbeiten";
-App::$strings["Suggestions"] = "Vorschläge";
-App::$strings["See more..."] = "Mehr anzeigen …";
-App::$strings["You have %1$.0f of %2$.0f allowed connections."] = "Du bist %1$.0f von maximal %2$.0f erlaubten Verbindungen eingegangen.";
-App::$strings["Add New Connection"] = "Neue Verbindung hinzufügen";
-App::$strings["Enter channel address"] = "Adresse des Kanals eingeben";
-App::$strings["Examples: bob@example.com, https://example.com/barbara"] = "Beispiele: bob@beispiel.com, http://beispiel.com/barbara";
-App::$strings["Notes"] = "Notizen";
-App::$strings["Remove term"] = "Eintrag löschen";
-App::$strings["Saved Searches"] = "Gespeicherte Suchanfragen";
-App::$strings["add"] = "hinzufügen";
-App::$strings["Saved Folders"] = "Gespeicherte Ordner";
-App::$strings["Everything"] = "Alles";
-App::$strings["Archives"] = "Archive";
-App::$strings["Refresh"] = "Aktualisieren";
-App::$strings["Account settings"] = "Konto-Einstellungen";
-App::$strings["Channel settings"] = "Kanal-Einstellungen";
-App::$strings["Additional features"] = "Zusätzliche Funktionen";
-App::$strings["Feature/Addon settings"] = "Plugin-Einstellungen";
-App::$strings["Display settings"] = "Anzeige-Einstellungen";
-App::$strings["Manage locations"] = "Klon-Adressen verwalten";
-App::$strings["Export channel"] = "Kanal exportieren";
-App::$strings["Connected apps"] = "Verbundene Apps";
-App::$strings["Permission Groups"] = "Berechtigungsrollen";
-App::$strings["Premium Channel Settings"] = "Premium-Kanal-Einstellungen";
-App::$strings["Private Mail Menu"] = "Private Nachrichten";
-App::$strings["Combined View"] = "Kombinierte Anzeige";
-App::$strings["Inbox"] = "Eingang";
-App::$strings["Outbox"] = "Ausgang";
-App::$strings["New Message"] = "Neue Nachricht";
-App::$strings["Conversations"] = "Konversationen";
-App::$strings["Received Messages"] = "Erhaltene Nachrichten";
-App::$strings["Sent Messages"] = "Gesendete Nachrichten";
-App::$strings["No messages."] = "Keine Nachrichten.";
-App::$strings["Delete conversation"] = "Unterhaltung löschen";
-App::$strings["Events Tools"] = "Kalenderwerkzeuge";
-App::$strings["Export Calendar"] = "Kalender exportieren";
-App::$strings["Import Calendar"] = "Kalender importieren";
-App::$strings["Overview"] = "Ãœbersicht";
-App::$strings["Chat Members"] = "Chatmitglieder";
-App::$strings["__ctx:wiki_history__ Message"] = "Nachricht";
-App::$strings["Bookmarked Chatrooms"] = "Gespeicherte Chatrooms";
-App::$strings["Suggested Chatrooms"] = "Chatraum-Vorschläge";
-App::$strings["photo/image"] = "Foto/Bild";
-App::$strings["Click to show more"] = "Klick, um mehr anzuzeigen";
-App::$strings["Rating Tools"] = "Bewertungswerkzeuge";
-App::$strings["Rate Me"] = "Bewerte mich";
-App::$strings["View Ratings"] = "Bewertungen ansehen";
-App::$strings["Forums"] = "Foren";
-App::$strings["Tasks"] = "Aufgaben";
-App::$strings["Member registrations waiting for confirmation"] = "Nutzer-Anmeldungen, die auf Bestätigung warten";
-App::$strings["Inspect queue"] = "Warteschlange kontrollieren";
-App::$strings["DB updates"] = "DB-Aktualisierungen";
-App::$strings["Admin"] = "Administration";
-App::$strings["Plugin Features"] = "Plug-In Funktionen";
-App::$strings["Invalid data packet"] = "Ungültiges Datenpaket";
-App::$strings["Unable to verify channel signature"] = "Konnte die Signatur des Kanals nicht verifizieren";
-App::$strings["Unable to verify site signature for %s"] = "Kann die Signatur der Seite von %s nicht verifizieren";
-App::$strings["invalid target signature"] = "Ungültige Signatur des Ziels";
-App::$strings["Unable to obtain identity information from database"] = "Kann keine Identitäts-Informationen aus Datenbank beziehen";
-App::$strings["Empty name"] = "Namensfeld leer";
-App::$strings["Name too long"] = "Name ist zu lang";
-App::$strings["No account identifier"] = "Keine Account-Kennung";
-App::$strings["Nickname is required."] = "Spitzname ist erforderlich.";
-App::$strings["Reserved nickname. Please choose another."] = "Reservierter Kurzname. Bitte wähle einen anderen.";
-App::$strings["Nickname has unsupported characters or is already being used on this site."] = "Der Spitzname enthält nicht-unterstütze Zeichen oder wird bereits auf dieser Seite genutzt.";
-App::$strings["Unable to retrieve created identity"] = "Kann die erstellte Identität nicht empfangen";
-App::$strings["Default Profile"] = "Standard-Profil";
-App::$strings["Create New Profile"] = "Neues Profil erstellen";
-App::$strings["Visible to everybody"] = "Für jeden sichtbar";
-App::$strings["Gender:"] = "Geschlecht:";
-App::$strings["Homepage:"] = "Homepage:";
-App::$strings["Online Now"] = "gerade online";
-App::$strings["Like this channel"] = "Dieser Kanal gefällt mir";
-App::$strings["j F, Y"] = "j. F Y";
-App::$strings["j F"] = "j. F";
-App::$strings["Birthday:"] = "Geburtstag:";
-App::$strings["for %1\$d %2\$s"] = "seit %1\$d %2\$s";
-App::$strings["Sexual Preference:"] = "Sexuelle Orientierung:";
-App::$strings["Tags:"] = "Schlagworte:";
-App::$strings["Political Views:"] = "Politische Ansichten:";
-App::$strings["Religion:"] = "Religion:";
-App::$strings["Hobbies/Interests:"] = "Hobbys/Interessen:";
-App::$strings["Likes:"] = "Gefällt:";
-App::$strings["Dislikes:"] = "Gefällt nicht:";
-App::$strings["Contact information and Social Networks:"] = "Kontaktinformation und soziale Netzwerke:";
-App::$strings["My other channels:"] = "Meine anderen Kanäle:";
-App::$strings["Musical interests:"] = "Musikalische Interessen:";
-App::$strings["Books, literature:"] = "Bücher, Literatur:";
-App::$strings["Television:"] = "Fernsehen:";
-App::$strings["Film/dance/culture/entertainment:"] = "Film/Tanz/Kultur/Unterhaltung:";
-App::$strings["Love/Romance:"] = "Liebe/Romantik:";
-App::$strings["Work/employment:"] = "Arbeit/Anstellung:";
-App::$strings["School/education:"] = "Schule/Ausbildung:";
-App::$strings["Like this thing"] = "Gefällt mir";
-App::$strings["New Page"] = "Neue Seite";
+App::$strings["Can view my normal stream and posts"] = "Kann meine normalen Beiträge sehen";
+App::$strings["Can view my webpages"] = "Kann meine Webseiten sehen";
+App::$strings["Can post on my channel page (\"wall\")"] = "Kann auf meiner Kanal-Seite (\"wall\") Beiträge veröffentlichen";
+App::$strings["Can like/dislike stuff"] = "Kann andere Elemente mögen/nicht mögen";
+App::$strings["Profiles and things other than posts/comments"] = "Profile und alles außer Beiträge und Kommentare";
+App::$strings["Can forward to all my channel contacts via post @mentions"] = "Kann an alle meine Kontakte via @-Erwähnung Nachrichten weiterleiten";
+App::$strings["Advanced - useful for creating group forum channels"] = "Fortgeschritten - sinnvoll, um Gruppen-Kanäle/-Foren zu erstellen";
+App::$strings["Can chat with me (when available)"] = "Kann mit mir chatten (wenn verfügbar)";
+App::$strings["Can write to my file storage and photos"] = "Kann in meine Datei- und Bilderordner schreiben";
+App::$strings["Can edit my webpages"] = "Kann meine Webseiten bearbeiten";
+App::$strings["Somewhat advanced - very useful in open communities"] = "Etwas fortgeschritten – sehr nützlich in offenen Gemeinschaften";
+App::$strings["Can administer my channel resources"] = "Kann meine Kanäle administrieren";
+App::$strings["Extremely advanced. Leave this alone unless you know what you are doing"] = "Sehr fortgeschritten. Bearbeite das nur, wenn Du genau weißt, was Du tust";
+App::$strings["Directory Options"] = "Verzeichnisoptionen";
+App::$strings["Safe Mode"] = "Sicherer Modus";
+App::$strings["Public Forums Only"] = "Nur öffentliche Foren";
+App::$strings["This Website Only"] = "Nur dieser Hub";
+App::$strings["%1\$s's bookmarks"] = "%1\$ss Lesezeichen";
+App::$strings["Cannot create a duplicate channel identifier on this system. Import failed."] = "Kann keinen doppelten Kanal-Identifikator auf diesem System erzeugen (Spitzname oder Hash schon belegt). Import fehlgeschlagen.";
+App::$strings["Cloned channel not found. Import failed."] = "Geklonter Kanal nicht gefunden. Import fehlgeschlagen.";
+App::$strings["prev"] = "vorherige";
+App::$strings["first"] = "erste";
+App::$strings["last"] = "letzte";
+App::$strings["next"] = "nächste";
+App::$strings["older"] = "älter";
+App::$strings["newer"] = "neuer";
+App::$strings["No connections"] = "Keine Verbindungen";
+App::$strings["View all %s connections"] = "Alle Verbindungen von %s anzeigen";
+App::$strings["poke"] = "anstupsen";
+App::$strings["ping"] = "anpingen";
+App::$strings["pinged"] = "pingte";
+App::$strings["prod"] = "knuffen";
+App::$strings["prodded"] = "knuffte";
+App::$strings["slap"] = "ohrfeigen";
+App::$strings["slapped"] = "ohrfeigte";
+App::$strings["finger"] = "befummeln";
+App::$strings["fingered"] = "befummelte";
+App::$strings["rebuff"] = "eine Abfuhr erteilen";
+App::$strings["rebuffed"] = "zurückgewiesen";
+App::$strings["happy"] = "glücklich";
+App::$strings["sad"] = "traurig";
+App::$strings["mellow"] = "sanft";
+App::$strings["tired"] = "müde";
+App::$strings["perky"] = "frech";
+App::$strings["angry"] = "sauer";
+App::$strings["stupefied"] = "verblüfft";
+App::$strings["puzzled"] = "verwirrt";
+App::$strings["interested"] = "interessiert";
+App::$strings["bitter"] = "verbittert";
+App::$strings["cheerful"] = "fröhlich";
+App::$strings["alive"] = "lebendig";
+App::$strings["annoyed"] = "verärgert";
+App::$strings["anxious"] = "unruhig";
+App::$strings["cranky"] = "schrullig";
+App::$strings["disturbed"] = "verstört";
+App::$strings["frustrated"] = "frustriert";
+App::$strings["depressed"] = "deprimiert";
+App::$strings["motivated"] = "motiviert";
+App::$strings["relaxed"] = "entspannt";
+App::$strings["surprised"] = "überrascht";
+App::$strings["Monday"] = "Montag";
+App::$strings["Tuesday"] = "Dienstag";
+App::$strings["Wednesday"] = "Mittwoch";
+App::$strings["Thursday"] = "Donnerstag";
+App::$strings["Friday"] = "Freitag";
+App::$strings["Saturday"] = "Samstag";
+App::$strings["Sunday"] = "Sonntag";
+App::$strings["January"] = "Januar";
+App::$strings["February"] = "Februar";
+App::$strings["March"] = "März";
+App::$strings["April"] = "April";
+App::$strings["May"] = "Mai";
+App::$strings["June"] = "Juni";
+App::$strings["July"] = "Juli";
+App::$strings["August"] = "August";
+App::$strings["September"] = "September";
+App::$strings["October"] = "Oktober";
+App::$strings["November"] = "November";
+App::$strings["December"] = "Dezember";
+App::$strings["Unknown Attachment"] = "Unbekannter Anhang";
+App::$strings["unknown"] = "unbekannt";
+App::$strings["remove category"] = "Kategorie entfernen";
+App::$strings["remove from file"] = "aus der Datei entfernen";
+App::$strings["default"] = "Standard";
+App::$strings["Page layout"] = "Seiten-Layout";
+App::$strings["You can create your own with the layouts tool"] = "Mit dem Gestaltungswerkzeug kannst Du Deine eigenen Layouts erstellen";
+App::$strings["Page content type"] = "Art des Seiteninhalts";
+App::$strings["activity"] = "Aktivität";
+App::$strings["Design Tools"] = "Gestaltungswerkzeuge";
+App::$strings["Pages"] = "Seiten";
+App::$strings["Import website..."] = "Webseite importieren...";
+App::$strings["Select folder to import"] = "Ordner zum Importieren auswählen";
+App::$strings["Import from a zipped folder:"] = "Aus einem gezippten Ordner importieren:";
+App::$strings["Import from cloud files:"] = "Aus Cloud-Dateien importieren:";
+App::$strings["/cloud/channel/path/to/folder"] = "/Cloud/Kanal/Pfad/zum/Ordner";
+App::$strings["Enter path to website files"] = "Pfad zu Webseitendateien eingeben";
+App::$strings["Select folder"] = "Ordner auswählen";
+App::$strings["Export website..."] = "Webseite exportieren...";
+App::$strings["Export to a zip file"] = "In eine ZIP-Datei exportieren";
+App::$strings["website.zip"] = "website.zip";
+App::$strings["Enter a name for the zip file."] = "Geben Sie einen für die ZIP-Datei ein.";
+App::$strings["Export to cloud files"] = "In Cloud-Dateien exportieren";
+App::$strings["/path/to/export/folder"] = "/Pfad/zum/exportierenden/Ordner";
+App::$strings["Enter a path to a cloud files destination."] = "Gib den Pfad zu einem Datei-Speicherort in der Cloud ein.";
+App::$strings["Specify folder"] = "Ordner angeben";
App::$strings["%d invitation available"] = array(
0 => "%d Einladung verfügbar",
1 => "%d Einladungen verfügbar",
@@ -2707,6 +2672,18 @@ App::$strings["%d connection in common"] = array(
1 => "%d gemeinsame Verbindungen",
);
App::$strings["show more"] = "mehr zeigen";
+App::$strings["Attachments:"] = "Anhänge:";
+App::$strings["l F d, Y \\@ g:i A"] = "l, d. F Y, H:i";
+App::$strings["\$Projectname event notification:"] = "";
+App::$strings["Starts:"] = "Beginnt:";
+App::$strings["Finishes:"] = "Endet:";
+App::$strings["Channel is blocked on this site."] = "Der Kanal ist auf dieser Seite blockiert ";
+App::$strings["Channel location missing."] = "Adresse des Kanals fehlt.";
+App::$strings["Response from remote channel was incomplete."] = "Antwort des entfernten Kanals war unvollständig.";
+App::$strings["Channel was deleted and no longer exists."] = "Kanal wurde gelöscht und existiert nicht mehr.";
+App::$strings["Protocol disabled."] = "Protokoll deaktiviert.";
+App::$strings["Channel discovery failed."] = "Kanalsuche fehlgeschlagen";
+App::$strings["Cannot connect to yourself."] = "Du kannst Dich nicht mit Dir selbst verbinden.";
App::$strings["Delete this item?"] = "Dieses Element löschen?";
App::$strings["%s show less"] = "%s weniger anzeigen";
App::$strings["%s expand"] = "%s aufklappen";
@@ -2740,18 +2717,7 @@ App::$strings["about a year"] = "ungefähr ein Jahr";
App::$strings["%d years"] = "%d Jahre";
App::$strings[" "] = " ";
App::$strings["timeago.numbers"] = "timeago.numbers";
-App::$strings["January"] = "Januar";
-App::$strings["February"] = "Februar";
-App::$strings["March"] = "März";
-App::$strings["April"] = "April";
App::$strings["__ctx:long__ May"] = "Mai";
-App::$strings["June"] = "Juni";
-App::$strings["July"] = "Juli";
-App::$strings["August"] = "August";
-App::$strings["September"] = "September";
-App::$strings["October"] = "Oktober";
-App::$strings["November"] = "November";
-App::$strings["December"] = "Dezember";
App::$strings["Jan"] = "Jan";
App::$strings["Feb"] = "Feb";
App::$strings["Mar"] = "Mär";
@@ -2764,13 +2730,6 @@ App::$strings["Sep"] = "Sep";
App::$strings["Oct"] = "Okt";
App::$strings["Nov"] = "Nov";
App::$strings["Dec"] = "Dez";
-App::$strings["Sunday"] = "Sonntag";
-App::$strings["Monday"] = "Montag";
-App::$strings["Tuesday"] = "Dienstag";
-App::$strings["Wednesday"] = "Mittwoch";
-App::$strings["Thursday"] = "Donnerstag";
-App::$strings["Friday"] = "Freitag";
-App::$strings["Saturday"] = "Samstag";
App::$strings["Sun"] = "So";
App::$strings["Mon"] = "Mo";
App::$strings["Tue"] = "Di";
@@ -2783,10 +2742,15 @@ App::$strings["__ctx:calendar__ month"] = "Monat";
App::$strings["__ctx:calendar__ week"] = "Woche";
App::$strings["__ctx:calendar__ day"] = "Tag";
App::$strings["__ctx:calendar__ All day"] = "Ganztägig";
-App::$strings["Directory Options"] = "Verzeichnisoptionen";
-App::$strings["Safe Mode"] = "Sicherer Modus";
-App::$strings["Public Forums Only"] = "Nur öffentliche Foren";
-App::$strings["This Website Only"] = "Nur dieser Hub";
+App::$strings["Unable to determine sender."] = "Kann Absender nicht bestimmen.";
+App::$strings["No recipient provided."] = "Kein Empfänger angegeben";
+App::$strings["[no subject]"] = "[no subject]";
+App::$strings["Stored post could not be verified."] = "Gespeicherter Beitrag konnten nicht überprüft werden.";
+App::$strings[" and "] = "und";
+App::$strings["public profile"] = "öffentliches Profil";
+App::$strings["%1\$s changed %2\$s to &ldquo;%3\$s&rdquo;"] = "%1\$s hat %2\$s auf &ldquo;%3\$s&rdquo; geändert";
+App::$strings["Visit %1\$s's %2\$s"] = "Besuche %1\$s's %2\$s";
+App::$strings["%1\$s has an updated %2\$s, changing %3\$s."] = "%1\$s hat ein aktualisiertes %2\$s, %3\$s wurde verändert.";
App::$strings["Item was not found."] = "Beitrag wurde nicht gefunden.";
App::$strings["No source file."] = "Keine Quelldatei.";
App::$strings["Cannot locate file to replace"] = "Kann Datei zum Ersetzen nicht finden";
@@ -2802,146 +2766,88 @@ App::$strings["Path not found."] = "Pfad nicht gefunden.";
App::$strings["mkdir failed."] = "mkdir fehlgeschlagen.";
App::$strings["database storage failed."] = "Speichern in der Datenbank fehlgeschlagen.";
App::$strings["Empty path"] = "Leere Pfadangabe";
+App::$strings["guest:"] = "Gast:";
+App::$strings["The form security token was not correct. This probably happened because the form has been opened for too long (>3 hours) before submitting it."] = "Das Security-Token des Formulars war nicht korrekt. Das ist wahrscheinlich passiert, weil das Formular zu lange (>3 Stunden) offen war, bevor es abgeschickt wurde.";
+App::$strings["(Unknown)"] = "(Unbekannt)";
+App::$strings["Visible to anybody on the internet."] = "Für jeden im Internet sichtbar.";
+App::$strings["Visible to you only."] = "Nur für Dich sichtbar.";
+App::$strings["Visible to anybody in this network."] = "Für jedes \$Projectname-Mitglied sichtbar.";
+App::$strings["Visible to anybody authenticated."] = "Für jeden sichtbar, der angemeldet ist.";
+App::$strings["Visible to anybody on %s."] = "Für jeden auf %s sichtbar.";
+App::$strings["Visible to all connections."] = "Für alle Verbindungen sichtbar.";
+App::$strings["Visible to approved connections."] = "Nur für akzeptierte Verbindungen sichtbar.";
+App::$strings["Visible to specific connections."] = "Sichtbar für bestimmte Verbindungen.";
+App::$strings["Privacy group is empty."] = "Gruppe ist leer.";
+App::$strings["Privacy group: %s"] = "Gruppe: %s";
+App::$strings["Connection not found."] = "Die Verbindung wurde nicht gefunden.";
+App::$strings["profile photo"] = "Profilfoto";
+App::$strings["[Edited %s]"] = "[%s wurde bearbeitet]";
+App::$strings["__ctx:edit_activity__ Post"] = "Beitrag";
+App::$strings["__ctx:edit_activity__ Comment"] = "Kommentar";
+App::$strings["Unable to obtain identity information from database"] = "Kann keine Identitäts-Informationen aus Datenbank beziehen";
+App::$strings["Empty name"] = "Namensfeld leer";
+App::$strings["Name too long"] = "Name ist zu lang";
+App::$strings["No account identifier"] = "Keine Account-Kennung";
+App::$strings["Nickname is required."] = "Spitzname ist erforderlich.";
+App::$strings["Reserved nickname. Please choose another."] = "Reservierter Kurzname. Bitte wähle einen anderen.";
+App::$strings["Nickname has unsupported characters or is already being used on this site."] = "Der Spitzname enthält nicht-unterstütze Zeichen oder wird bereits auf dieser Seite genutzt.";
+App::$strings["Unable to retrieve created identity"] = "Kann die erstellte Identität nicht empfangen";
+App::$strings["Default Profile"] = "Standard-Profil";
+App::$strings["Create New Profile"] = "Neues Profil erstellen";
+App::$strings["Visible to everybody"] = "Für jeden sichtbar";
+App::$strings["Gender:"] = "Geschlecht:";
+App::$strings["Homepage:"] = "Homepage:";
+App::$strings["Online Now"] = "gerade online";
+App::$strings["Like this channel"] = "Dieser Kanal gefällt mir";
+App::$strings["j F, Y"] = "j. F Y";
+App::$strings["j F"] = "j. F";
+App::$strings["Birthday:"] = "Geburtstag:";
+App::$strings["for %1\$d %2\$s"] = "seit %1\$d %2\$s";
+App::$strings["Sexual Preference:"] = "Sexuelle Orientierung:";
+App::$strings["Tags:"] = "Schlagworte:";
+App::$strings["Political Views:"] = "Politische Ansichten:";
+App::$strings["Religion:"] = "Religion:";
+App::$strings["Hobbies/Interests:"] = "Hobbys/Interessen:";
+App::$strings["Likes:"] = "Gefällt:";
+App::$strings["Dislikes:"] = "Gefällt nicht:";
+App::$strings["Contact information and Social Networks:"] = "Kontaktinformation und soziale Netzwerke:";
+App::$strings["My other channels:"] = "Meine anderen Kanäle:";
+App::$strings["Musical interests:"] = "Musikalische Interessen:";
+App::$strings["Books, literature:"] = "Bücher, Literatur:";
+App::$strings["Television:"] = "Fernsehen:";
+App::$strings["Film/dance/culture/entertainment:"] = "Film/Tanz/Kultur/Unterhaltung:";
+App::$strings["Love/Romance:"] = "Liebe/Romantik:";
+App::$strings["Work/employment:"] = "Arbeit/Anstellung:";
+App::$strings["School/education:"] = "Schule/Ausbildung:";
+App::$strings["Like this thing"] = "Gefällt mir";
+App::$strings["User '%s' deleted"] = "Benutzer '%s' gelöscht";
+App::$strings["This event has been added to your calendar."] = "Dieser Termin wurde zu Deinem Kalender hinzugefügt";
+App::$strings["Not specified"] = "Keine Angabe";
+App::$strings["Needs Action"] = "Aktion erforderlich";
+App::$strings["Completed"] = "Abgeschlossen";
+App::$strings["In Process"] = "In Bearbeitung";
+App::$strings["Cancelled"] = "gestrichen";
App::$strings["view full size"] = "In Vollbildansicht anschauen";
App::$strings["No Subject"] = "Kein Betreff";
+App::$strings["Friendica"] = "Friendica";
App::$strings["OStatus"] = "OStatus";
App::$strings["GNU-Social"] = "GNU-Social";
App::$strings["RSS/Atom"] = "RSS/Atom";
+App::$strings["Diaspora"] = "Diaspora";
App::$strings["Facebook"] = "Facebook";
App::$strings["Zot"] = "Zot!";
App::$strings["LinkedIn"] = "LinkedIn";
App::$strings["XMPP/IM"] = "XMPP/IM";
App::$strings["MySpace"] = "MySpace";
-App::$strings[" by "] = "von";
-App::$strings[" on "] = "am";
-App::$strings["Embedded content"] = "Eingebetteter Inhalt";
-App::$strings["Embedding disabled"] = "Einbetten deaktiviert";
-App::$strings["Image exceeds website size limit of %lu bytes"] = "Bild überschreitet das Webseitenlimit von %lu Bytes";
-App::$strings["Image file is empty."] = "Bilddatei ist leer.";
-App::$strings["Photo storage failed."] = "Fotospeicherung fehlgeschlagen.";
-App::$strings["a new photo"] = "ein neues Foto";
-App::$strings["__ctx:photo_upload__ %1\$s posted %2\$s to %3\$s"] = "%1\$s hat %2\$s auf %3\$s veröffentlicht";
-App::$strings["Upload New Photos"] = "Neue Fotos hochladen";
-App::$strings["prev"] = "vorherige";
-App::$strings["first"] = "erste";
-App::$strings["last"] = "letzte";
-App::$strings["next"] = "nächste";
-App::$strings["older"] = "älter";
-App::$strings["newer"] = "neuer";
-App::$strings["No connections"] = "Keine Verbindungen";
-App::$strings["View all %s connections"] = "Alle Verbindungen von %s anzeigen";
-App::$strings["poke"] = "anstupsen";
-App::$strings["ping"] = "anpingen";
-App::$strings["pinged"] = "pingte";
-App::$strings["prod"] = "knuffen";
-App::$strings["prodded"] = "knuffte";
-App::$strings["slap"] = "ohrfeigen";
-App::$strings["slapped"] = "ohrfeigte";
-App::$strings["finger"] = "befummeln";
-App::$strings["fingered"] = "befummelte";
-App::$strings["rebuff"] = "eine Abfuhr erteilen";
-App::$strings["rebuffed"] = "zurückgewiesen";
-App::$strings["happy"] = "glücklich";
-App::$strings["sad"] = "traurig";
-App::$strings["mellow"] = "sanft";
-App::$strings["tired"] = "müde";
-App::$strings["perky"] = "frech";
-App::$strings["angry"] = "sauer";
-App::$strings["stupefied"] = "verblüfft";
-App::$strings["puzzled"] = "verwirrt";
-App::$strings["interested"] = "interessiert";
-App::$strings["bitter"] = "verbittert";
-App::$strings["cheerful"] = "fröhlich";
-App::$strings["alive"] = "lebendig";
-App::$strings["annoyed"] = "verärgert";
-App::$strings["anxious"] = "unruhig";
-App::$strings["cranky"] = "schrullig";
-App::$strings["disturbed"] = "verstört";
-App::$strings["frustrated"] = "frustriert";
-App::$strings["depressed"] = "deprimiert";
-App::$strings["motivated"] = "motiviert";
-App::$strings["relaxed"] = "entspannt";
-App::$strings["surprised"] = "überrascht";
-App::$strings["May"] = "Mai";
-App::$strings["Unknown Attachment"] = "Unbekannter Anhang";
-App::$strings["unknown"] = "unbekannt";
-App::$strings["remove category"] = "Kategorie entfernen";
-App::$strings["remove from file"] = "aus der Datei entfernen";
-App::$strings["Page layout"] = "Seiten-Layout";
-App::$strings["You can create your own with the layouts tool"] = "Mit dem Gestaltungswerkzeug kannst Du Deine eigenen Layouts erstellen";
-App::$strings["Page content type"] = "Art des Seiteninhalts";
-App::$strings["activity"] = "Aktivität";
-App::$strings["Design Tools"] = "Gestaltungswerkzeuge";
-App::$strings["Pages"] = "Seiten";
-App::$strings["Import website..."] = "Webseite importieren...";
-App::$strings["Select folder to import"] = "Ordner zum Importieren auswählen";
-App::$strings["Import from a zipped folder:"] = "Aus einem gezippten Ordner importieren:";
-App::$strings["Import from cloud files:"] = "Aus Cloud-Dateien importieren:";
-App::$strings["/cloud/channel/path/to/folder"] = "/Cloud/Kanal/Pfad/zum/Ordner";
-App::$strings["Enter path to website files"] = "Pfad zu Webseitendateien eingeben";
-App::$strings["Select folder"] = "Ordner auswählen";
-App::$strings["Export website..."] = "Webseite exportieren...";
-App::$strings["Export to a zip file"] = "In eine ZIP-Datei exportieren";
-App::$strings["website.zip"] = "website.zip";
-App::$strings["Enter a name for the zip file."] = "Geben Sie einen für die ZIP-Datei ein.";
-App::$strings["Export to cloud files"] = "In Cloud-Dateien exportieren";
-App::$strings["/path/to/export/folder"] = "/Pfad/zum/exportierenden/Ordner";
-App::$strings["Enter a path to a cloud files destination."] = "Gib den Pfad zu einem Datei-Speicherort in der Cloud ein.";
-App::$strings["Specify folder"] = "Ordner angeben";
-App::$strings["Remote authentication"] = "Ãœber Konto auf anderem Server einloggen";
-App::$strings["Click to authenticate to your home hub"] = "Klicke, um Dich über Deinen Heimat-Server zu authentifizieren";
-App::$strings["Logout"] = "Abmelden";
-App::$strings["End this session"] = "Beende diese Sitzung";
-App::$strings["Your profile page"] = "Deine Profilseite";
-App::$strings["Manage/Edit profiles"] = "Profile verwalten";
-App::$strings["Edit your profile"] = "Profil bearbeiten";
-App::$strings["Sign in"] = "Anmelden";
-App::$strings["Get me home"] = "Bringe mich nach Hause (eigener Kanal)";
-App::$strings["Log me out of this site"] = "Logge mich von dieser Seite aus";
-App::$strings["Create an account"] = "Erzeuge ein Konto";
-App::$strings["Help and documentation"] = "Hilfe und Dokumentation";
-App::$strings["Applications, utilities, links, games"] = "Anwendungen (Apps), Zubehör, Links, Spiele";
-App::$strings["Search site @name, #tag, ?docs, content"] = "Hub durchsuchen: @Name. #Schlagwort, ?Dokumentation, Inhalt";
-App::$strings["Channel Directory"] = "Kanal-Verzeichnis";
-App::$strings["Your grid"] = "Dein Grid";
-App::$strings["View your network/grid"] = "Zeige Dein Netzwerk/Grid an";
-App::$strings["Mark all grid notifications seen"] = "Alle Grid-Benachrichtigungen als angesehen markieren";
-App::$strings["Channel home"] = "Mein Kanal";
-App::$strings["View your channel home"] = "Zeige Deine Kanalseite an";
-App::$strings["Mark all channel notifications seen"] = "Markiere alle Kanal-Benachrichtigungen als angesehen";
-App::$strings["Notices"] = "Benachrichtigungen";
-App::$strings["Notifications"] = "Benachrichtigungen";
-App::$strings["View all notifications"] = "Alle Benachrichtigungen ansehen";
-App::$strings["Private mail"] = "Persönliche Mail";
-App::$strings["View your private messages"] = "Zeige Deine persönlichen Nachrichten an";
-App::$strings["Mark all private messages seen"] = "Markiere alle persönlichen Nachrichten als gesehen";
-App::$strings["Event Calendar"] = "Terminkalender";
-App::$strings["View events"] = "Termine ansehen";
-App::$strings["Mark all events seen"] = "Markiere alle Termine als gesehen";
-App::$strings["Manage Your Channels"] = "Verwalte Deine Kanäle";
-App::$strings["Account/Channel Settings"] = "Konto-/Kanal-Einstellungen";
-App::$strings["Site Setup and Configuration"] = "Seiten-Einrichtung und -Konfiguration";
-App::$strings["Documentation"] = "Dokumentation";
-App::$strings["@name, #tag, ?doc, content"] = "@Name, #Schlagwort, ?Dokumentation, Inhalt";
-App::$strings["Please wait..."] = "Bitte warten...";
-App::$strings["Cannot create a duplicate channel identifier on this system. Import failed."] = "Kann keinen doppelten Kanal-Identifikator auf diesem System erzeugen (Spitzname oder Hash schon belegt). Import fehlgeschlagen.";
-App::$strings["Channel clone failed. Import failed."] = "Klonen des Kanals fehlgeschlagen. Import fehlgeschlagen.";
-App::$strings["Cloned channel not found. Import failed."] = "Geklonter Kanal nicht gefunden. Import fehlgeschlagen.";
-App::$strings["Unable to import element \""] = "Element konnte nicht importiert werden.";
-App::$strings["Logged out."] = "Ausgeloggt.";
-App::$strings["Failed authentication"] = "Authentifizierung fehlgeschlagen";
-App::$strings["Channel is blocked on this site."] = "Der Kanal ist auf dieser Seite blockiert ";
-App::$strings["Channel location missing."] = "Adresse des Kanals fehlt.";
-App::$strings["Response from remote channel was incomplete."] = "Antwort des entfernten Kanals war unvollständig.";
-App::$strings["Channel was deleted and no longer exists."] = "Kanal wurde gelöscht und existiert nicht mehr.";
-App::$strings["Protocol disabled."] = "Protokoll deaktiviert.";
-App::$strings["Channel discovery failed."] = "Kanalsuche fehlgeschlagen";
-App::$strings["Cannot connect to yourself."] = "Du kannst Dich nicht mit Dir selbst verbinden.";
-App::$strings[" and "] = "und";
-App::$strings["public profile"] = "öffentliches Profil";
-App::$strings["%1\$s changed %2\$s to &ldquo;%3\$s&rdquo;"] = "%1\$s hat %2\$s auf &ldquo;%3\$s&rdquo; geändert";
-App::$strings["Visit %1\$s's %2\$s"] = "Besuche %1\$s's %2\$s";
-App::$strings["%1\$s has an updated %2\$s, changing %3\$s."] = "%1\$s hat ein aktualisiertes %2\$s, %3\$s wurde verändert.";
+App::$strings["New Page"] = "Neue Seite";
+App::$strings["Select an alternate language"] = "Wähle eine alternative Sprache";
+App::$strings["Who can see this?"] = "Wer kann das sehen?";
+App::$strings["Custom selection"] = "Benutzerdefinierte Auswahl";
+App::$strings["Select \"Show\" to allow viewing. \"Don't show\" lets you override and limit the scope of \"Show\"."] = "Wähle \"Anzeigen\", um Betrachtung zuzulassen. \"Nicht anzeigen\" überstimmt und limitiert den Aktionsradius von \"Anzeigen\" für Ausnahmen.";
+App::$strings["Show"] = "Anzeigen";
+App::$strings["Don't show"] = "Nicht anzeigen";
+App::$strings["Post permissions %s cannot be changed %s after a post is shared.</br />These permissions set who is allowed to view the post."] = "Beitragsberechtigungen %s können nicht geändert werden %s, nachdem der Beitrag gesendet wurde.<br />Diese Berechtigungen bestimmen, wer den Beitrag sehen kann.";
+App::$strings["Cannot locate DNS info for database server '%s'"] = "Kann die DNS-Informationen für den Datenbank-Server '%s' nicht finden";
App::$strings["Image/photo"] = "Bild/Foto";
App::$strings["Encrypted content"] = "Verschlüsselter Inhalt";
App::$strings["Install %s element: "] = "Element %s installieren: ";
@@ -2950,49 +2856,10 @@ App::$strings["%1\$s wrote the following %2\$s %3\$s"] = "%1\$s schrieb den folg
App::$strings["Click to open/close"] = "Klicke zum Öffnen/Schließen";
App::$strings["spoiler"] = "Spoiler";
App::$strings["$1 wrote:"] = "$1 schrieb:";
-App::$strings["%1\$s's bookmarks"] = "%1\$ss Lesezeichen";
-App::$strings["A deleted group with this name was revived. Existing item permissions <strong>may</strong> apply to this group and any future members. If this is not what you intended, please create another group with a different name."] = "Es hat früher schon einmal eine Gruppe mit diesem Namen existiert, die gelöscht wurde. Es <strong>könnten</strong> von damals noch Elemente (Beiträge, Dateien etc.) vorhanden sein, die allen jetzigen und zukünftigen Mitgliedern dieser Gruppe den Zugriff erlauben. Wenn das nicht Deine Absicht ist, erstelle bitte eine neue Gruppe mit einem anderen Namen.";
-App::$strings["Add new connections to this privacy group"] = "Neue Verbindung zu dieser Gruppe hinzufügen";
-App::$strings["edit"] = "Bearbeiten";
-App::$strings["Privacy Groups"] = "Gruppen";
-App::$strings["Edit group"] = "Gruppe ändern";
-App::$strings["Add privacy group"] = "Gruppe hinzufügen";
-App::$strings["Channels not in any privacy group"] = "Kanäle, die in keiner Gruppe sind";
-App::$strings["This event has been added to your calendar."] = "Dieser Termin wurde zu Deinem Kalender hinzugefügt";
-App::$strings["Not specified"] = "Keine Angabe";
-App::$strings["Needs Action"] = "Aktion erforderlich";
-App::$strings["Completed"] = "Abgeschlossen";
-App::$strings["In Process"] = "In Bearbeitung";
-App::$strings["Cancelled"] = "gestrichen";
-App::$strings["(Unknown)"] = "(Unbekannt)";
-App::$strings["Visible to anybody on the internet."] = "Für jeden im Internet sichtbar.";
-App::$strings["Visible to you only."] = "Nur für Dich sichtbar.";
-App::$strings["Visible to anybody in this network."] = "Für jedes \$Projectname-Mitglied sichtbar.";
-App::$strings["Visible to anybody authenticated."] = "Für jeden sichtbar, der angemeldet ist.";
-App::$strings["Visible to anybody on %s."] = "Für jeden auf %s sichtbar.";
-App::$strings["Visible to all connections."] = "Für alle Verbindungen sichtbar.";
-App::$strings["Visible to approved connections."] = "Nur für akzeptierte Verbindungen sichtbar.";
-App::$strings["Visible to specific connections."] = "Sichtbar für bestimmte Verbindungen.";
-App::$strings["Privacy group is empty."] = "Gruppe ist leer.";
-App::$strings["Privacy group: %s"] = "Gruppe: %s";
-App::$strings["Connection not found."] = "Die Verbindung wurde nicht gefunden.";
-App::$strings["profile photo"] = "Profilfoto";
-App::$strings["[Edited %s]"] = "[%s wurde bearbeitet]";
-App::$strings["__ctx:edit_activity__ Post"] = "Beitrag";
-App::$strings["__ctx:edit_activity__ Comment"] = "Kommentar";
-App::$strings["Can view my normal stream and posts"] = "Kann meine normalen Beiträge sehen";
-App::$strings["Can view my webpages"] = "Kann meine Webseiten sehen";
-App::$strings["Can post on my channel page (\"wall\")"] = "Kann auf meiner Kanal-Seite (\"wall\") Beiträge veröffentlichen";
-App::$strings["Can like/dislike stuff"] = "Kann andere Elemente mögen/nicht mögen";
-App::$strings["Profiles and things other than posts/comments"] = "Profile und alles außer Beiträge und Kommentare";
-App::$strings["Can forward to all my channel contacts via post @mentions"] = "Kann an alle meine Kontakte via @-Erwähnung Nachrichten weiterleiten";
-App::$strings["Advanced - useful for creating group forum channels"] = "Fortgeschritten - sinnvoll, um Gruppen-Kanäle/-Foren zu erstellen";
-App::$strings["Can chat with me (when available)"] = "Kann mit mir chatten (wenn verfügbar)";
-App::$strings["Can write to my file storage and photos"] = "Kann in meine Datei- und Bilderordner schreiben";
-App::$strings["Can edit my webpages"] = "Kann meine Webseiten bearbeiten";
-App::$strings["Somewhat advanced - very useful in open communities"] = "Etwas fortgeschritten – sehr nützlich in offenen Gemeinschaften";
-App::$strings["Can administer my channel resources"] = "Kann meine Kanäle administrieren";
-App::$strings["Extremely advanced. Leave this alone unless you know what you are doing"] = "Sehr fortgeschritten. Bearbeite das nur, wenn Du genau weißt, was Du tust";
+App::$strings[" by "] = "von";
+App::$strings[" on "] = "am";
+App::$strings["Embedded content"] = "Eingebetteter Inhalt";
+App::$strings["Embedding disabled"] = "Einbetten deaktiviert";
App::$strings["General Features"] = "Allgemeine Funktionen";
App::$strings["Multiple Profiles"] = "Mehrfachprofile";
App::$strings["Ability to create multiple profiles"] = "Ermöglicht das Anlegen mehrerer Profile pro Kanal";
@@ -3015,7 +2882,7 @@ App::$strings["Provide alternate connection permission roles."] = "Stelle benutz
App::$strings["Smart Birthdays"] = "Smarte Geburtstage";
App::$strings["Make birthday events timezone aware in case your friends are scattered across the planet."] = "Stellt für Geburtstage einen Zeitzonenbezug her, falls deine Freunde über den ganzen Planeten verstreut sind.";
App::$strings["Event Timezone Selection"] = "Termin-Zeitzonenauswahl";
-App::$strings["Allow event creation in timezones other than your own."] = "";
+App::$strings["Allow event creation in timezones other than your own."] = "Ermögliche das Erstellen von Terminen in anderen Zeitzonen als Deiner eigenen.";
App::$strings["Advanced Directory Search"] = "Erweiterte Verzeichnissuche";
App::$strings["Allows creation of complex directory search queries"] = "Ermöglicht die Erstellung komplexer Verzeichnis-Suchabfragen";
App::$strings["Advanced Theme and Layout Settings"] = "Erweiterte Design- und Layout-Einstellungen";
@@ -3039,6 +2906,7 @@ App::$strings["Prevent posts with identical content to be published with less th
App::$strings["Network and Stream Filtering"] = "Netzwerk- und Stream-Filter";
App::$strings["Search by Date"] = "Suche nach Datum";
App::$strings["Ability to select posts by date ranges"] = "Möglichkeit, Beiträge nach Zeiträumen auszuwählen";
+App::$strings["Privacy Groups"] = "Gruppen";
App::$strings["Enable management and selection of privacy groups"] = "Auswahl und Verwaltung von Gruppen für Kanäle aktivieren";
App::$strings["Save search terms for re-use"] = "Ermöglicht das Abspeichern von Suchbegriffen zur Wiederverwendung";
App::$strings["Network Personal Tab"] = "Persönlicher Netzwerkreiter";
@@ -3066,51 +2934,118 @@ App::$strings["Tag Cloud"] = "Schlagwort-Wolke";
App::$strings["Provide a personal tag cloud on your channel page"] = "Aktiviert die Anzeige einer Schlagwort-Wolke (Tag Cloud) auf Deiner Kanal-Seite";
App::$strings["Premium Channel"] = "Premium-Kanal";
App::$strings["Allows you to set restrictions and terms on those that connect with your channel"] = "Ermöglicht es, Einschränkungen und Bedingungen für Verbindungen dieses Kanals festzulegen";
+App::$strings["Tags"] = "Schlagwörter";
+App::$strings["Keywords"] = "Schlüsselwörter";
+App::$strings["have"] = "habe";
+App::$strings["has"] = "hat";
+App::$strings["want"] = "will";
+App::$strings["wants"] = "will";
+App::$strings["likes"] = "gefällt";
+App::$strings["dislikes"] = "missfällt";
+App::$strings["Not a valid email address"] = "Ungültige E-Mail-Adresse";
+App::$strings["Your email domain is not among those allowed on this site"] = "Deine E-Mail-Adresse ist auf dieser Seite nicht erlaubt";
+App::$strings["Your email address is already registered at this site."] = "Deine E-Mail-Adresse ist auf dieser Seite bereits registriert.";
+App::$strings["An invitation is required."] = "Eine Einladung wird benötigt.";
+App::$strings["Invitation could not be verified."] = "Die Einladung konnte nicht bestätigt werden.";
+App::$strings["Please enter the required information."] = "Bitte gib die benötigten Informationen ein.";
+App::$strings["Failed to store account information."] = "Speichern der Nutzerkontodaten fehlgeschlagen.";
+App::$strings["Registration confirmation for %s"] = "Registrierungsbestätigung für %s";
+App::$strings["Registration request at %s"] = "Registrierungsanfrage auf %s";
+App::$strings["your registration password"] = "Dein Registrierungspasswort";
+App::$strings["Registration details for %s"] = "Registrierungsdetails für %s";
+App::$strings["Account approved."] = "Nutzerkonto bestätigt.";
+App::$strings["Registration revoked for %s"] = "Registrierung für %s wurde widerrufen";
+App::$strings["Click here to upgrade."] = "Klicke hier, um das Upgrade durchzuführen.";
+App::$strings["This action exceeds the limits set by your subscription plan."] = "Diese Aktion überschreitet die Grenzen Ihres Abonnements.";
+App::$strings["This action is not available under your subscription plan."] = "Diese Aktion ist in Ihrem Abonnement nicht verfügbar.";
+App::$strings["Birthday"] = "Geburtstag";
+App::$strings["Age: "] = "Alter:";
+App::$strings["YYYY-MM-DD or MM-DD"] = "JJJJ-MM-TT oder MM-TT";
+App::$strings["less than a second ago"] = "Vor weniger als einer Sekunde";
+App::$strings["__ctx:e.g. 22 hours ago, 1 minute ago__ %1\$d %2\$s ago"] = "vor %1\$d %2\$s";
+App::$strings["__ctx:relative_date__ year"] = array(
+ 0 => "Jahr",
+ 1 => "Jahre",
+);
+App::$strings["__ctx:relative_date__ month"] = array(
+ 0 => "Monat",
+ 1 => "Monate",
+);
+App::$strings["__ctx:relative_date__ week"] = array(
+ 0 => "Woche",
+ 1 => "Wochen",
+);
+App::$strings["__ctx:relative_date__ day"] = array(
+ 0 => "Tag",
+ 1 => "Tage",
+);
+App::$strings["__ctx:relative_date__ hour"] = array(
+ 0 => "Stunde",
+ 1 => "Stunden",
+);
+App::$strings["__ctx:relative_date__ minute"] = array(
+ 0 => "Minute",
+ 1 => "Minuten",
+);
+App::$strings["__ctx:relative_date__ second"] = array(
+ 0 => "Sekunde",
+ 1 => "Sekunden",
+);
+App::$strings["%1\$s's birthday"] = "%1\$ss Geburtstag";
+App::$strings["Happy Birthday %1\$s"] = "Alles Gute zum Geburtstag, %1\$s";
+App::$strings["Remote authentication"] = "Ãœber Konto auf anderem Server einloggen";
+App::$strings["Click to authenticate to your home hub"] = "Klicke, um Dich über Deinen Heimat-Server zu authentifizieren";
+App::$strings["End this session"] = "Beende diese Sitzung";
+App::$strings["Your profile page"] = "Deine Profilseite";
+App::$strings["Manage/Edit profiles"] = "Profile verwalten";
+App::$strings["Edit your profile"] = "Profil bearbeiten";
+App::$strings["Sign in"] = "Anmelden";
+App::$strings["Take me home"] = "Bringe mich nach Hause (eigener Kanal)";
+App::$strings["Log me out of this site"] = "Logge mich von dieser Seite aus";
+App::$strings["Create an account"] = "Erzeuge ein Konto";
+App::$strings["Help and documentation"] = "Hilfe und Dokumentation";
+App::$strings["Search site @name, #tag, ?docs, content"] = "Hub durchsuchen: @Name. #Schlagwort, ?Dokumentation, Inhalt";
+App::$strings["Grid"] = "Grid";
+App::$strings["Your grid"] = "Dein Grid";
+App::$strings["View your network/grid"] = "Zeige Dein Netzwerk/Grid an";
+App::$strings["Mark all grid notifications seen"] = "Alle Grid-Benachrichtigungen als angesehen markieren";
+App::$strings["Channel home"] = "Mein Kanal";
+App::$strings["View your channel home"] = "Zeige Deine Kanalseite an";
+App::$strings["Mark all channel notifications seen"] = "Markiere alle Kanal-Benachrichtigungen als angesehen";
+App::$strings["Notices"] = "Benachrichtigungen";
+App::$strings["Notifications"] = "Benachrichtigungen";
+App::$strings["View all notifications"] = "Alle Benachrichtigungen ansehen";
+App::$strings["Private mail"] = "Persönliche Mail";
+App::$strings["View your private messages"] = "Zeige Deine persönlichen Nachrichten an";
+App::$strings["Mark all private messages seen"] = "Markiere alle persönlichen Nachrichten als gesehen";
+App::$strings["Event Calendar"] = "Terminkalender";
+App::$strings["View events"] = "Termine ansehen";
+App::$strings["Mark all events seen"] = "Markiere alle Termine als gesehen";
+App::$strings["Manage Your Channels"] = "Verwalte Deine Kanäle";
+App::$strings["Account/Channel Settings"] = "Konto-/Kanal-Einstellungen";
+App::$strings["Site Setup and Configuration"] = "Seiten-Einrichtung und -Konfiguration";
+App::$strings["@name, #tag, ?doc, content"] = "@Name, #Schlagwort, ?Dokumentation, Inhalt";
+App::$strings["Please wait..."] = "Bitte warten...";
+App::$strings["Add Apps"] = "Apps hinzufügen";
+App::$strings["Image exceeds website size limit of %lu bytes"] = "Bild überschreitet das Webseitenlimit von %lu Bytes";
+App::$strings["Image file is empty."] = "Bilddatei ist leer.";
+App::$strings["Photo storage failed."] = "Fotospeicherung fehlgeschlagen.";
+App::$strings["a new photo"] = "ein neues Foto";
+App::$strings["__ctx:photo_upload__ %1\$s posted %2\$s to %3\$s"] = "%1\$s hat %2\$s auf %3\$s veröffentlicht";
+App::$strings["Upload New Photos"] = "Neue Fotos hochladen";
+App::$strings["Invalid data packet"] = "Ungültiges Datenpaket";
+App::$strings["Unable to verify channel signature"] = "Konnte die Signatur des Kanals nicht verifizieren";
+App::$strings["Unable to verify site signature for %s"] = "Kann die Signatur der Seite von %s nicht verifizieren";
+App::$strings["invalid target signature"] = "Ungültige Signatur des Ziels";
+App::$strings["A deleted group with this name was revived. Existing item permissions <strong>may</strong> apply to this group and any future members. If this is not what you intended, please create another group with a different name."] = "Es hat früher schon einmal eine Gruppe mit diesem Namen existiert, die gelöscht wurde. Es <strong>könnten</strong> von damals noch Elemente (Beiträge, Dateien etc.) vorhanden sein, die allen jetzigen und zukünftigen Mitgliedern dieser Gruppe den Zugriff erlauben. Wenn das nicht Deine Absicht ist, erstelle bitte eine neue Gruppe mit einem anderen Namen.";
+App::$strings["Add new connections to this privacy group"] = "Neue Verbindung zu dieser Gruppe hinzufügen";
+App::$strings["edit"] = "Bearbeiten";
+App::$strings["Edit group"] = "Gruppe ändern";
+App::$strings["Add privacy group"] = "Gruppe hinzufügen";
+App::$strings["Channels not in any privacy group"] = "Kanäle, die in keiner Gruppe sind";
+App::$strings["New window"] = "Neues Fenster";
+App::$strings["Open the selected location in a different window or browser tab"] = "Öffne die markierte Adresse in einem neuen Browserfenster oder Tab";
+App::$strings["Logged out."] = "Ausgeloggt.";
+App::$strings["Failed authentication"] = "Authentifizierung fehlgeschlagen";
App::$strings["Help:"] = "Hilfe:";
App::$strings["Not Found"] = "Nicht gefunden";
-App::$strings["Source channel not found."] = "Quellkanal nicht gefunden.";
-App::$strings["Focus (Hubzilla default)"] = "Focus (Voreinstellung für Hubzilla)";
-App::$strings["Theme settings"] = "Theme-Einstellungen";
-App::$strings["Narrow navbar"] = "Schmale Navigationsleiste";
-App::$strings["Navigation bar background color"] = "Hintergrundfarbe der Navigationsleiste";
-App::$strings["Navigation bar gradient top color"] = "Farbverlauf der Navigationsleiste: Farbe oben";
-App::$strings["Navigation bar gradient bottom color"] = "Farbverlauf der Navigationsleiste: Farbe unten";
-App::$strings["Navigation active button gradient top color"] = "Navigations-Button aktiv: Farbe für Farbverlauf oben";
-App::$strings["Navigation active button gradient bottom color"] = "Navigations-Button aktiv: Farbe für Farbverlauf unten";
-App::$strings["Navigation bar border color "] = "Farbe für den Rand der Navigationsleiste";
-App::$strings["Navigation bar icon color "] = "Farbe für die Icons der Navigationsleiste";
-App::$strings["Navigation bar active icon color "] = "Farbe für aktive Icons der Navigationsleiste";
-App::$strings["link color"] = "Farbe für Links";
-App::$strings["Set font-color for banner"] = "Farbe der Schrift des Banners";
-App::$strings["Set the background color"] = "Hintergrundfarbe";
-App::$strings["Set the background image"] = "Hintergrundbild";
-App::$strings["Set the background color of items"] = "Hintergrundfarbe für Beiträge";
-App::$strings["Set the background color of comments"] = "Hintergrundfarbe für Kommentare";
-App::$strings["Set the border color of comments"] = "Farbe des Randes von Kommentaren";
-App::$strings["Set the indent for comments"] = "Einzugsbreite für Kommentare";
-App::$strings["Set the basic color for item icons"] = "Grundfarbe für Beitrags-Icons";
-App::$strings["Set the hover color for item icons"] = "Farbe für Beitrags-Icons unter dem Mauszeiger";
-App::$strings["Set font-size for the entire application"] = "Schriftgröße für die gesamte Anwendung";
-App::$strings["Example: 14px"] = "Beispiel: 14px";
-App::$strings["Set font-size for posts and comments"] = "Schriftgröße für Beiträge und Kommentare";
-App::$strings["Set font-color for posts and comments"] = "Schriftfarbe für Beiträge und Kommentare";
-App::$strings["Set radius of corners"] = "Ecken-Radius";
-App::$strings["Set shadow depth of photos"] = "Schattentiefe von Fotos";
-App::$strings["Set maximum width of content region in pixel"] = "Maximalbreite des Inhaltsbereichs in Pixel festlegen";
-App::$strings["Leave empty for default width"] = "Leer lassen für Standardbreite";
-App::$strings["Left align page content"] = "Seiteninhalt linksbündig anzeigen";
-App::$strings["Set minimum opacity of nav bar - to hide it"] = "Mindest-Deckkraft der Navigationsleiste ( - versteckt sie)";
-App::$strings["Set size of conversation author photo"] = "Größe der Avatare von Themenstartern";
-App::$strings["Set size of followup author photos"] = "Größe der Avatare von Kommentatoren";
-App::$strings["Update %s failed. See error logs."] = "Aktualisierung %s fehlgeschlagen. Details in den Fehlerprotokollen.";
-App::$strings["Update Error at %s"] = "Aktualisierungsfehler auf %s";
-App::$strings["Create an account to access services and applications"] = "Erstelle ein Konto, um auf Dienste und Anwendungen zugreifen zu können.";
-App::$strings["Login/Email"] = "Anmelden/E-Mail";
-App::$strings["Password"] = "Kennwort";
-App::$strings["Remember me"] = "Angaben speichern";
-App::$strings["Forgot your password?"] = "Passwort vergessen?";
-App::$strings["toggle mobile"] = "auf/von mobile Ansicht wechseln";
-App::$strings["Website SSL certificate is not valid. Please correct."] = "Das SSL-Zertifikat der Website ist nicht gültig. Bitte beheben.";
-App::$strings["[hubzilla] Website SSL error for %s"] = "[hubzilla] Website-SSL-Fehler für %s";
-App::$strings["Cron/Scheduled tasks not running."] = "Cron-Aufgaben laufen nicht.";
-App::$strings["[hubzilla] Cron tasks not running on %s"] = "[hubzilla] Cron-Aufgaben für %s laufen nicht";
diff --git a/view/es-es/hmessages.po b/view/es-es/hmessages.po
index 94f14aad7..a2341b272 100644
--- a/view/es-es/hmessages.po
+++ b/view/es-es/hmessages.po
@@ -13,8 +13,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Redmatrix\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-03-03 00:05-0800\n"
-"PO-Revision-Date: 2017-03-08 13:51+0000\n"
+"POT-Creation-Date: 2017-05-01 15:36+0200\n"
+"PO-Revision-Date: 2017-05-04 10:22+0000\n"
"Last-Translator: Manuel Jiménez Friaza <mjfriaza@openmailbox.org>\n"
"Language-Team: Spanish (Spain) (http://www.transifex.com/Friendica/red-matrix/language/es_ES/)\n"
"MIME-Version: 1.0\n"
@@ -23,95 +23,6 @@ msgstr ""
"Language: es_ES\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: ../../Zotlabs/Access/PermissionRoles.php:248
-#: ../../include/permissions.php:945
-msgid "Social Networking"
-msgstr "Redes sociales"
-
-#: ../../Zotlabs/Access/PermissionRoles.php:249
-#: ../../include/permissions.php:945
-msgid "Social - Mostly Public"
-msgstr "Social - Público en su mayor parte"
-
-#: ../../Zotlabs/Access/PermissionRoles.php:250
-#: ../../include/permissions.php:945
-msgid "Social - Restricted"
-msgstr "Social - Restringido"
-
-#: ../../Zotlabs/Access/PermissionRoles.php:251
-#: ../../include/permissions.php:945
-msgid "Social - Private"
-msgstr "Social - Privado"
-
-#: ../../Zotlabs/Access/PermissionRoles.php:254
-#: ../../include/permissions.php:946
-msgid "Community Forum"
-msgstr "Foro de discusión"
-
-#: ../../Zotlabs/Access/PermissionRoles.php:255
-#: ../../include/permissions.php:946
-msgid "Forum - Mostly Public"
-msgstr "Foro - Público en su mayor parte"
-
-#: ../../Zotlabs/Access/PermissionRoles.php:256
-#: ../../include/permissions.php:946
-msgid "Forum - Restricted"
-msgstr "Foro - Restringido"
-
-#: ../../Zotlabs/Access/PermissionRoles.php:257
-#: ../../include/permissions.php:946
-msgid "Forum - Private"
-msgstr "Foro - Privado"
-
-#: ../../Zotlabs/Access/PermissionRoles.php:260
-#: ../../include/permissions.php:947
-msgid "Feed Republish"
-msgstr "Republicar un \"feed\""
-
-#: ../../Zotlabs/Access/PermissionRoles.php:261
-#: ../../include/permissions.php:947
-msgid "Feed - Mostly Public"
-msgstr "Feed - Público en su mayor parte"
-
-#: ../../Zotlabs/Access/PermissionRoles.php:262
-#: ../../include/permissions.php:947
-msgid "Feed - Restricted"
-msgstr "Feed - Restringido"
-
-#: ../../Zotlabs/Access/PermissionRoles.php:265
-#: ../../include/permissions.php:948
-msgid "Special Purpose"
-msgstr "Propósito especial"
-
-#: ../../Zotlabs/Access/PermissionRoles.php:266
-#: ../../include/permissions.php:948
-msgid "Special - Celebrity/Soapbox"
-msgstr "Especial - Celebridad / Tribuna improvisada"
-
-#: ../../Zotlabs/Access/PermissionRoles.php:267
-#: ../../include/permissions.php:948
-msgid "Special - Group Repository"
-msgstr "Especial - Repositorio de grupo"
-
-#: ../../Zotlabs/Access/PermissionRoles.php:270
-#: ../../Zotlabs/Module/Register.php:213 ../../Zotlabs/Module/Connedit.php:925
-#: ../../Zotlabs/Module/New_channel.php:132
-#: ../../Zotlabs/Module/Profiles.php:798
-#: ../../Zotlabs/Module/Settings/Channel.php:463
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1148
-#: ../../extend/addon/addon/cdav/cdav.php:277
-#: ../../extend/addon/addon/cdav/cdav.php:284 ../../include/selectors.php:49
-#: ../../include/selectors.php:66 ../../include/selectors.php:104
-#: ../../include/selectors.php:140 ../../include/connections.php:675
-#: ../../include/connections.php:682 ../../include/permissions.php:949
-msgid "Other"
-msgstr "Otro"
-
-#: ../../Zotlabs/Access/PermissionRoles.php:271
-#: ../../include/permissions.php:949
-msgid "Custom/Expert Mode"
-msgstr "Modo personalizado/experto"
-
#: ../../Zotlabs/Access/Permissions.php:46
msgid "Can view my channel stream and posts"
msgstr "Pueden verse la actividad y publicaciones de mi canal"
@@ -184,302 +95,1038 @@ msgstr "Pueden utilizarse mis entradas públicas como origen de contenidos en c
msgid "Can administer my channel"
msgstr "Se puede administrar mi canal"
-#: ../../Zotlabs/Storage/Browser.php:106 ../../Zotlabs/Storage/Browser.php:237
-msgid "parent"
-msgstr "padre"
+#: ../../Zotlabs/Access/PermissionRoles.php:248
+#: ../../include/permissions.php:946
+msgid "Social Networking"
+msgstr "Redes sociales"
-#: ../../Zotlabs/Storage/Browser.php:130 ../../include/text.php:2700
-msgid "Collection"
-msgstr "Colección"
+#: ../../Zotlabs/Access/PermissionRoles.php:249
+#: ../../include/permissions.php:946
+msgid "Social - Mostly Public"
+msgstr "Social - Público en su mayor parte"
-#: ../../Zotlabs/Storage/Browser.php:133
-msgid "Principal"
-msgstr "Principal"
+#: ../../Zotlabs/Access/PermissionRoles.php:250
+#: ../../include/permissions.php:946
+msgid "Social - Restricted"
+msgstr "Social - Restringido"
-#: ../../Zotlabs/Storage/Browser.php:136
-msgid "Addressbook"
-msgstr "Libreta de direcciones"
+#: ../../Zotlabs/Access/PermissionRoles.php:251
+#: ../../include/permissions.php:946
+msgid "Social - Private"
+msgstr "Social - Privado"
-#: ../../Zotlabs/Storage/Browser.php:139
-msgid "Calendar"
-msgstr "Calendario"
+#: ../../Zotlabs/Access/PermissionRoles.php:254
+#: ../../include/permissions.php:947
+msgid "Community Forum"
+msgstr "Foro de discusión"
-#: ../../Zotlabs/Storage/Browser.php:142
-msgid "Schedule Inbox"
-msgstr "Programar bandeja de entrada"
+#: ../../Zotlabs/Access/PermissionRoles.php:255
+#: ../../include/permissions.php:947
+msgid "Forum - Mostly Public"
+msgstr "Foro - Público en su mayor parte"
-#: ../../Zotlabs/Storage/Browser.php:145
-msgid "Schedule Outbox"
-msgstr "Programar bandeja de salida"
+#: ../../Zotlabs/Access/PermissionRoles.php:256
+#: ../../include/permissions.php:947
+msgid "Forum - Restricted"
+msgstr "Foro - Restringido"
-#: ../../Zotlabs/Storage/Browser.php:163 ../../Zotlabs/Module/Photos.php:784
-#: ../../Zotlabs/Module/Photos.php:1244
-#: ../../Zotlabs/Module/Embedphotos.php:145 ../../Zotlabs/Lib/Apps.php:561
-#: ../../Zotlabs/Lib/Apps.php:639
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:745
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:746
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:753
-#: ../../include/widgets.php:1757 ../../include/conversation.php:1177
-msgid "Unknown"
-msgstr "Desconocido"
+#: ../../Zotlabs/Access/PermissionRoles.php:257
+#: ../../include/permissions.php:947
+msgid "Forum - Private"
+msgstr "Foro - Privado"
-#: ../../Zotlabs/Storage/Browser.php:224 ../../Zotlabs/Module/Fbrowser.php:85
-#: ../../Zotlabs/Lib/Apps.php:224 ../../include/conversation.php:1843
-msgid "Files"
-msgstr "Ficheros"
+#: ../../Zotlabs/Access/PermissionRoles.php:260
+#: ../../include/permissions.php:948
+msgid "Feed Republish"
+msgstr "Republicar un \"feed\""
-#: ../../Zotlabs/Storage/Browser.php:225
-msgid "Total"
-msgstr "Total"
+#: ../../Zotlabs/Access/PermissionRoles.php:261
+#: ../../include/permissions.php:948
+msgid "Feed - Mostly Public"
+msgstr "Feed - Público en su mayor parte"
-#: ../../Zotlabs/Storage/Browser.php:227
-msgid "Shared"
-msgstr "Compartido"
+#: ../../Zotlabs/Access/PermissionRoles.php:262
+#: ../../include/permissions.php:948
+msgid "Feed - Restricted"
+msgstr "Feed - Restringido"
-#: ../../Zotlabs/Storage/Browser.php:228 ../../Zotlabs/Storage/Browser.php:330
-#: ../../Zotlabs/Module/Menu.php:118 ../../Zotlabs/Module/Connedit.php:928
-#: ../../Zotlabs/Module/New_channel.php:147
-#: ../../Zotlabs/Module/Webpages.php:243 ../../Zotlabs/Module/Blocks.php:159
-#: ../../Zotlabs/Module/Layouts.php:184 ../../Zotlabs/Module/Profiles.php:801
-#: ../../extend/addon/addon/cdav/include/widgets.php:127
-#: ../../extend/addon/addon/cdav/include/widgets.php:164
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1151
-msgid "Create"
-msgstr "Crear"
+#: ../../Zotlabs/Access/PermissionRoles.php:265
+#: ../../include/permissions.php:949
+msgid "Special Purpose"
+msgstr "Propósito especial"
-#: ../../Zotlabs/Storage/Browser.php:229 ../../Zotlabs/Storage/Browser.php:332
-#: ../../Zotlabs/Module/Cover_photo.php:357
-#: ../../Zotlabs/Module/Photos.php:811 ../../Zotlabs/Module/Photos.php:1368
-#: ../../Zotlabs/Module/Profile_photo.php:421
-#: ../../Zotlabs/Module/Embedphotos.php:157
-#: ../../extend/addon/addon/cdav/include/widgets.php:132
-#: ../../extend/addon/addon/cdav/include/widgets.php:168
-#: ../../include/widgets.php:1770
-msgid "Upload"
-msgstr "Subir"
+#: ../../Zotlabs/Access/PermissionRoles.php:266
+#: ../../include/permissions.php:949
+msgid "Special - Celebrity/Soapbox"
+msgstr "Especial - Celebridad / Tribuna improvisada"
-#: ../../Zotlabs/Storage/Browser.php:233
-#: ../../Zotlabs/Module/Admin/Channels.php:159
-#: ../../Zotlabs/Module/Connedit.php:913
-#: ../../Zotlabs/Module/Sharedwithme.php:99
-#: ../../Zotlabs/Module/Settings/Oauth.php:89
-#: ../../Zotlabs/Module/Settings/Oauth.php:115
-#: ../../Zotlabs/Module/Wiki.php:171 ../../Zotlabs/Module/Chat.php:248
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1136
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:172
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:156
-#: ../../include/widgets.php:976
-msgid "Name"
-msgstr "Nombre"
+#: ../../Zotlabs/Access/PermissionRoles.php:267
+#: ../../include/permissions.php:949
+msgid "Special - Group Repository"
+msgstr "Especial - Repositorio de grupo"
-#: ../../Zotlabs/Storage/Browser.php:234 ../../Zotlabs/Module/Wiki.php:172
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:157
-msgid "Type"
-msgstr "Tipo"
+#: ../../Zotlabs/Access/PermissionRoles.php:270
+#: ../../Zotlabs/Module/New_channel.php:132
+#: ../../Zotlabs/Module/Settings/Channel.php:463
+#: ../../Zotlabs/Module/Connedit.php:914 ../../Zotlabs/Module/Profiles.php:798
+#: ../../Zotlabs/Module/Register.php:213 ../../addon/cdav/Mod_Cdav.php:1148
+#: ../../addon/cdav/cdav.php:277 ../../addon/cdav/cdav.php:284
+#: ../../include/selectors.php:49 ../../include/selectors.php:66
+#: ../../include/selectors.php:104 ../../include/selectors.php:140
+#: ../../include/permissions.php:950 ../../include/connections.php:675
+#: ../../include/connections.php:682
+msgid "Other"
+msgstr "Otro"
-#: ../../Zotlabs/Storage/Browser.php:235
-#: ../../Zotlabs/Module/Sharedwithme.php:101 ../../include/text.php:1414
-msgid "Size"
-msgstr "Tamaño"
+#: ../../Zotlabs/Access/PermissionRoles.php:271
+#: ../../include/permissions.php:950
+msgid "Custom/Expert Mode"
+msgstr "Modo personalizado/experto"
-#: ../../Zotlabs/Storage/Browser.php:236
-#: ../../Zotlabs/Module/Sharedwithme.php:102
-msgid "Last Modified"
-msgstr "Última modificación"
+#: ../../Zotlabs/Module/Blocks.php:33 ../../Zotlabs/Module/Editlayout.php:31
+#: ../../Zotlabs/Module/Connect.php:17
+#: ../../Zotlabs/Module/Achievements.php:15 ../../Zotlabs/Module/Hcard.php:12
+#: ../../Zotlabs/Module/Editblock.php:31 ../../Zotlabs/Module/Profile.php:20
+#: ../../Zotlabs/Module/Layouts.php:31 ../../Zotlabs/Module/Editwebpage.php:32
+#: ../../Zotlabs/Module/Webpages.php:33
+#: ../../Zotlabs/Module/Filestorage.php:59 ../../include/channel.php:945
+msgid "Requested profile is not available."
+msgstr "El perfil solicitado no está disponible."
-#: ../../Zotlabs/Storage/Browser.php:238
-#: ../../Zotlabs/Module/Editblock.php:109
-#: ../../Zotlabs/Module/Connections.php:300
-#: ../../Zotlabs/Module/Connections.php:320
+#: ../../Zotlabs/Module/Blocks.php:73 ../../Zotlabs/Module/Blocks.php:80
+#: ../../Zotlabs/Module/Invite.php:17 ../../Zotlabs/Module/Invite.php:94
+#: ../../Zotlabs/Module/Editlayout.php:67
+#: ../../Zotlabs/Module/Editlayout.php:90 ../../Zotlabs/Module/Channel.php:115
+#: ../../Zotlabs/Module/Channel.php:245 ../../Zotlabs/Module/Channel.php:285
+#: ../../Zotlabs/Module/Settings.php:59 ../../Zotlabs/Module/Locs.php:87
+#: ../../Zotlabs/Module/Mitem.php:115 ../../Zotlabs/Module/Events.php:271
+#: ../../Zotlabs/Module/Appman.php:82 ../../Zotlabs/Module/Regmod.php:21
+#: ../../Zotlabs/Module/New_channel.php:77
+#: ../../Zotlabs/Module/New_channel.php:104
+#: ../../Zotlabs/Module/Sharedwithme.php:11 ../../Zotlabs/Module/Setup.php:212
+#: ../../Zotlabs/Module/Achievements.php:34 ../../Zotlabs/Module/Thing.php:274
+#: ../../Zotlabs/Module/Thing.php:294 ../../Zotlabs/Module/Thing.php:335
+#: ../../Zotlabs/Module/Api.php:24 ../../Zotlabs/Module/Editblock.php:67
+#: ../../Zotlabs/Module/Profile.php:83 ../../Zotlabs/Module/Profile.php:100
+#: ../../Zotlabs/Module/Mood.php:116 ../../Zotlabs/Module/Connections.php:29
+#: ../../Zotlabs/Module/Viewsrc.php:19 ../../Zotlabs/Module/Bookmarks.php:61
+#: ../../Zotlabs/Module/Photos.php:69 ../../Zotlabs/Module/Wiki.php:50
+#: ../../Zotlabs/Module/Wiki.php:216 ../../Zotlabs/Module/Wiki.php:315
+#: ../../Zotlabs/Module/Pdledit.php:29 ../../Zotlabs/Module/Poke.php:137
+#: ../../Zotlabs/Module/Profile_photo.php:280
+#: ../../Zotlabs/Module/Profile_photo.php:293
+#: ../../Zotlabs/Module/Authtest.php:16 ../../Zotlabs/Module/Item.php:221
+#: ../../Zotlabs/Module/Item.php:231 ../../Zotlabs/Module/Item.php:1038
+#: ../../Zotlabs/Module/Page.php:35 ../../Zotlabs/Module/Page.php:91
+#: ../../Zotlabs/Module/Connedit.php:385 ../../Zotlabs/Module/Chat.php:98
+#: ../../Zotlabs/Module/Chat.php:103 ../../Zotlabs/Module/Menu.php:78
+#: ../../Zotlabs/Module/Layouts.php:71 ../../Zotlabs/Module/Layouts.php:78
+#: ../../Zotlabs/Module/Layouts.php:89 ../../Zotlabs/Module/Group.php:13
+#: ../../Zotlabs/Module/Profiles.php:198 ../../Zotlabs/Module/Profiles.php:635
+#: ../../Zotlabs/Module/Editwebpage.php:68
+#: ../../Zotlabs/Module/Editwebpage.php:89
+#: ../../Zotlabs/Module/Editwebpage.php:107
+#: ../../Zotlabs/Module/Editwebpage.php:121 ../../Zotlabs/Module/Manage.php:10
+#: ../../Zotlabs/Module/Webpages.php:116 ../../Zotlabs/Module/Block.php:26
+#: ../../Zotlabs/Module/Block.php:76 ../../Zotlabs/Module/Editpost.php:17
+#: ../../Zotlabs/Module/Sources.php:74 ../../Zotlabs/Module/Like.php:181
+#: ../../Zotlabs/Module/Suggest.php:28 ../../Zotlabs/Module/Message.php:18
+#: ../../Zotlabs/Module/Mail.php:164 ../../Zotlabs/Module/Register.php:77
+#: ../../Zotlabs/Module/Cover_photo.php:281
+#: ../../Zotlabs/Module/Cover_photo.php:294
+#: ../../Zotlabs/Module/Network.php:15 ../../Zotlabs/Module/Filestorage.php:23
+#: ../../Zotlabs/Module/Filestorage.php:78
+#: ../../Zotlabs/Module/Filestorage.php:93
+#: ../../Zotlabs/Module/Filestorage.php:120 ../../Zotlabs/Module/Common.php:39
+#: ../../Zotlabs/Module/Viewconnections.php:28
+#: ../../Zotlabs/Module/Viewconnections.php:33
+#: ../../Zotlabs/Module/Service_limits.php:11
+#: ../../Zotlabs/Module/Rate.php:113 ../../Zotlabs/Module/Notifications.php:11
+#: ../../Zotlabs/Lib/Chatroom.php:137 ../../Zotlabs/Web/WebServer.php:131
+#: ../../addon/keepout/keepout.php:36 ../../addon/openid/Mod_Id.php:53
+#: ../../addon/gitwiki/Mod_Gitwiki.php:196
+#: ../../addon/gitwiki/Mod_Gitwiki.php:292
+#: ../../addon/diaspora_reconnect/diaspora_reconnect.php:58
+#: ../../addon/pumpio/pumpio.php:40 ../../include/attach.php:144
+#: ../../include/attach.php:191 ../../include/attach.php:255
+#: ../../include/attach.php:269 ../../include/attach.php:276
+#: ../../include/attach.php:344 ../../include/attach.php:358
+#: ../../include/attach.php:365 ../../include/attach.php:442
+#: ../../include/attach.php:909 ../../include/attach.php:983
+#: ../../include/attach.php:1148 ../../include/items.php:3470
+#: ../../include/photos.php:27
+msgid "Permission denied."
+msgstr "Acceso denegado."
+
+#: ../../Zotlabs/Module/Blocks.php:97 ../../Zotlabs/Module/Blocks.php:155
+#: ../../Zotlabs/Module/Editblock.php:113
+msgid "Block Name"
+msgstr "Nombre del bloque"
+
+#: ../../Zotlabs/Module/Blocks.php:154 ../../include/text.php:2267
+msgid "Blocks"
+msgstr "Bloques"
+
+#: ../../Zotlabs/Module/Blocks.php:156
+msgid "Block Title"
+msgstr "Título del bloque"
+
+#: ../../Zotlabs/Module/Blocks.php:157 ../../Zotlabs/Module/Menu.php:114
+#: ../../Zotlabs/Module/Layouts.php:191 ../../Zotlabs/Module/Webpages.php:256
+#: ../../include/page_widgets.php:47
+msgid "Created"
+msgstr "Creado"
+
+#: ../../Zotlabs/Module/Blocks.php:158 ../../Zotlabs/Module/Menu.php:115
+#: ../../Zotlabs/Module/Layouts.php:192 ../../Zotlabs/Module/Webpages.php:257
+#: ../../include/page_widgets.php:48
+msgid "Edited"
+msgstr "Editado"
+
+#: ../../Zotlabs/Module/Blocks.php:159
+#: ../../Zotlabs/Module/New_channel.php:147
+#: ../../Zotlabs/Module/Connedit.php:917 ../../Zotlabs/Module/Menu.php:118
+#: ../../Zotlabs/Module/Layouts.php:185 ../../Zotlabs/Module/Profiles.php:801
+#: ../../Zotlabs/Module/Webpages.php:244 ../../Zotlabs/Storage/Browser.php:228
+#: ../../Zotlabs/Storage/Browser.php:332 ../../addon/cdav/Mod_Cdav.php:1151
+#: ../../addon/cdav/include/widgets.php:127
+#: ../../addon/cdav/include/widgets.php:164
+msgid "Create"
+msgstr "Crear"
+
+#: ../../Zotlabs/Module/Blocks.php:160 ../../Zotlabs/Module/Editlayout.php:114
#: ../../Zotlabs/Module/Admin/Profs.php:154
-#: ../../Zotlabs/Module/Editlayout.php:114
-#: ../../Zotlabs/Module/Editwebpage.php:145 ../../Zotlabs/Module/Menu.php:112
-#: ../../Zotlabs/Module/Editpost.php:85 ../../Zotlabs/Module/Webpages.php:244
-#: ../../Zotlabs/Module/Blocks.php:160 ../../Zotlabs/Module/Layouts.php:192
#: ../../Zotlabs/Module/Settings/Oauth.php:149
-#: ../../Zotlabs/Module/Thing.php:260 ../../Zotlabs/Module/Wiki.php:164
-#: ../../Zotlabs/Module/Wiki.php:271 ../../Zotlabs/Lib/ThreadItem.php:106
-#: ../../Zotlabs/Lib/Apps.php:357
-#: ../../extend/addon/addon/cdav/include/widgets.php:125
-#: ../../extend/addon/addon/cdav/include/widgets.php:161
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:149
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:251
+#: ../../Zotlabs/Module/Thing.php:260 ../../Zotlabs/Module/Editblock.php:114
+#: ../../Zotlabs/Module/Connections.php:296
+#: ../../Zotlabs/Module/Connections.php:316 ../../Zotlabs/Module/Wiki.php:165
+#: ../../Zotlabs/Module/Wiki.php:275 ../../Zotlabs/Module/Menu.php:112
+#: ../../Zotlabs/Module/Layouts.php:193
+#: ../../Zotlabs/Module/Editwebpage.php:142
+#: ../../Zotlabs/Module/Webpages.php:245 ../../Zotlabs/Module/Editpost.php:80
+#: ../../Zotlabs/Lib/Apps.php:367 ../../Zotlabs/Lib/ThreadItem.php:107
+#: ../../Zotlabs/Storage/Browser.php:238
+#: ../../addon/cdav/include/widgets.php:125
+#: ../../addon/cdav/include/widgets.php:161
+#: ../../addon/gitwiki/Mod_Gitwiki.php:151
+#: ../../addon/gitwiki/Mod_Gitwiki.php:252 ../../include/channel.php:1044
+#: ../../include/channel.php:1048 ../../include/menu.php:113
#: ../../include/page_widgets.php:9 ../../include/page_widgets.php:39
-#: ../../include/menu.php:113 ../../include/channel.php:1044
-#: ../../include/channel.php:1048
msgid "Edit"
msgstr "Editar"
-#: ../../Zotlabs/Storage/Browser.php:239
-#: ../../Zotlabs/Module/Editblock.php:134
-#: ../../Zotlabs/Module/Connections.php:271
-#: ../../Zotlabs/Module/Admin/Profs.php:155
+#: ../../Zotlabs/Module/Blocks.php:161 ../../Zotlabs/Module/Photos.php:1042
+#: ../../Zotlabs/Module/Layouts.php:194 ../../Zotlabs/Module/Webpages.php:246
+#: ../../addon/cdav/include/widgets.php:123
+#: ../../include/conversation.php:1311
+msgid "Share"
+msgstr "Compartir"
+
+#: ../../Zotlabs/Module/Blocks.php:162 ../../Zotlabs/Module/Editlayout.php:138
#: ../../Zotlabs/Module/Admin/Accounts.php:173
#: ../../Zotlabs/Module/Admin/Channels.php:149
-#: ../../Zotlabs/Module/Editlayout.php:137
-#: ../../Zotlabs/Module/Editwebpage.php:170
-#: ../../Zotlabs/Module/Connedit.php:661 ../../Zotlabs/Module/Connedit.php:930
-#: ../../Zotlabs/Module/Photos.php:1174 ../../Zotlabs/Module/Group.php:177
-#: ../../Zotlabs/Module/Webpages.php:246 ../../Zotlabs/Module/Blocks.php:162
-#: ../../Zotlabs/Module/Profiles.php:803
+#: ../../Zotlabs/Module/Admin/Profs.php:155
#: ../../Zotlabs/Module/Settings/Oauth.php:150
-#: ../../Zotlabs/Module/Thing.php:261 ../../Zotlabs/Lib/ThreadItem.php:126
-#: ../../Zotlabs/Lib/Apps.php:358
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:864
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1153
-#: ../../include/conversation.php:656
+#: ../../Zotlabs/Module/Thing.php:261 ../../Zotlabs/Module/Editblock.php:139
+#: ../../Zotlabs/Module/Connections.php:267
+#: ../../Zotlabs/Module/Photos.php:1143 ../../Zotlabs/Module/Connedit.php:650
+#: ../../Zotlabs/Module/Connedit.php:919 ../../Zotlabs/Module/Group.php:177
+#: ../../Zotlabs/Module/Profiles.php:803
+#: ../../Zotlabs/Module/Editwebpage.php:167
+#: ../../Zotlabs/Module/Webpages.php:247 ../../Zotlabs/Lib/Apps.php:368
+#: ../../Zotlabs/Lib/ThreadItem.php:127 ../../Zotlabs/Storage/Browser.php:239
+#: ../../addon/cdav/Mod_Cdav.php:864 ../../addon/cdav/Mod_Cdav.php:1153
+#: ../../include/conversation.php:654
msgid "Delete"
msgstr "Eliminar"
-#: ../../Zotlabs/Storage/Browser.php:299
+#: ../../Zotlabs/Module/Blocks.php:166 ../../Zotlabs/Module/Events.php:694
+#: ../../Zotlabs/Module/Wiki.php:167 ../../Zotlabs/Module/Layouts.php:198
+#: ../../Zotlabs/Module/Webpages.php:251 ../../Zotlabs/Module/Pubsites.php:59
+#: ../../addon/gitwiki/Mod_Gitwiki.php:153 ../../include/page_widgets.php:42
+msgid "View"
+msgstr "Ver"
+
+#: ../../Zotlabs/Module/Invite.php:29
+msgid "Total invitation limit exceeded."
+msgstr "Se ha superado el límite máximo de invitaciones."
+
+#: ../../Zotlabs/Module/Invite.php:53
#, php-format
-msgid "You are using %1$s of your available file storage."
-msgstr "Está usando %1$s de su espacio disponible para ficheros."
+msgid "%s : Not a valid email address."
+msgstr "%s : No es una dirección de correo electrónico válida. "
-#: ../../Zotlabs/Storage/Browser.php:304
+#: ../../Zotlabs/Module/Invite.php:67
+msgid "Please join us on $Projectname"
+msgstr "Únase a nosotros en $Projectname"
+
+#: ../../Zotlabs/Module/Invite.php:77
+msgid "Invitation limit exceeded. Please contact your site administrator."
+msgstr "Excedido el límite de invitaciones. Por favor, contacte con el Administrador de su sitio."
+
+#: ../../Zotlabs/Module/Invite.php:82
#, php-format
-msgid "You are using %1$s of %2$s available file storage. (%3$s&#37;)"
-msgstr "Está usando %1$s de %2$s que tiene a su disposición para ficheros. (%3$s&#37;)"
+msgid "%s : Message delivery failed."
+msgstr "%s : Falló el envío del mensaje."
-#: ../../Zotlabs/Storage/Browser.php:315
-msgid "WARNING:"
-msgstr "ATENCIÓN: "
+#: ../../Zotlabs/Module/Invite.php:86
+#, php-format
+msgid "%d message sent."
+msgid_plural "%d messages sent."
+msgstr[0] "%d mensajes enviados."
+msgstr[1] "%d mensajes enviados."
+
+#: ../../Zotlabs/Module/Invite.php:105
+msgid "You have no more invitations available"
+msgstr "No tiene más invitaciones disponibles"
-#: ../../Zotlabs/Storage/Browser.php:325
+#: ../../Zotlabs/Module/Invite.php:136
+msgid "Send invitations"
+msgstr "Enviar invitaciones"
+
+#: ../../Zotlabs/Module/Invite.php:137
+msgid "Enter email addresses, one per line:"
+msgstr "Introduzca las direcciones de correo electrónico, una por línea:"
+
+#: ../../Zotlabs/Module/Invite.php:138 ../../Zotlabs/Module/Mail.php:303
+msgid "Your message:"
+msgstr "Su mensaje:"
+
+#: ../../Zotlabs/Module/Invite.php:139
+msgid "Please join my community on $Projectname."
+msgstr "Por favor, únase a mi comunidad en $Projectname."
+
+#: ../../Zotlabs/Module/Invite.php:141
+msgid "You will need to supply this invitation code:"
+msgstr "Tendrá que suministrar este código de invitación:"
+
+#: ../../Zotlabs/Module/Invite.php:142
msgid ""
-"Please use DAV to upload large (video, audio) files.<br>See <a class=\"zrl\""
-" href=\"help/member/member_guide#Cloud_Desktop_Clients\">Cloud Desktop "
-"Clients</a>"
-msgstr "Por favor, use DAV para subir ficheros de gran tamaño (vídeo, audio).<br>Mire en <a class=\"zrl\" href=\"help/member/member_guide#Cloud_Desktop_Clients\">Cloud Desktop Clients</a>"
+"1. Register at any $Projectname location (they are all inter-connected)"
+msgstr "1. Regístrese en cualquier sitio de $Projectname (están todos interconectados)"
-#: ../../Zotlabs/Storage/Browser.php:329
-msgid "Create new folder"
-msgstr "Crear nueva carpeta"
+#: ../../Zotlabs/Module/Invite.php:144
+msgid "2. Enter my $Projectname network address into the site searchbar."
+msgstr "2. Introduzca mi dirección $Projectname en la caja de búsqueda del sitio."
-#: ../../Zotlabs/Storage/Browser.php:331
-msgid "Upload file"
-msgstr "Subir fichero"
+#: ../../Zotlabs/Module/Invite.php:145
+msgid "or visit"
+msgstr "o visitar"
-#: ../../Zotlabs/Storage/Browser.php:345
-msgid "Drop files here to immediately upload"
-msgstr "Arrastre los ficheros aquí para subirlos de forma inmediata"
+#: ../../Zotlabs/Module/Invite.php:147
+msgid "3. Click [Connect]"
+msgstr "3. Pulse [conectar]"
+
+#: ../../Zotlabs/Module/Invite.php:149 ../../Zotlabs/Module/Locs.php:121
+#: ../../Zotlabs/Module/Mitem.php:243 ../../Zotlabs/Module/Events.php:493
+#: ../../Zotlabs/Module/Appman.php:134
+#: ../../Zotlabs/Module/Import_items.php:129
+#: ../../Zotlabs/Module/Setup.php:309 ../../Zotlabs/Module/Setup.php:357
+#: ../../Zotlabs/Module/Connect.php:98
+#: ../../Zotlabs/Module/Admin/Features.php:66
+#: ../../Zotlabs/Module/Admin/Plugins.php:438
+#: ../../Zotlabs/Module/Admin/Accounts.php:166
+#: ../../Zotlabs/Module/Admin/Logs.php:84
+#: ../../Zotlabs/Module/Admin/Channels.php:147
+#: ../../Zotlabs/Module/Admin/Themes.php:158
+#: ../../Zotlabs/Module/Admin/Site.php:279
+#: ../../Zotlabs/Module/Admin/Profs.php:157
+#: ../../Zotlabs/Module/Admin/Account_edit.php:74
+#: ../../Zotlabs/Module/Admin/Security.php:104
+#: ../../Zotlabs/Module/Settings/Permcats.php:110
+#: ../../Zotlabs/Module/Settings/Channel.php:476
+#: ../../Zotlabs/Module/Settings/Features.php:47
+#: ../../Zotlabs/Module/Settings/Tokens.php:168
+#: ../../Zotlabs/Module/Settings/Account.php:118
+#: ../../Zotlabs/Module/Settings/Featured.php:50
+#: ../../Zotlabs/Module/Settings/Display.php:203
+#: ../../Zotlabs/Module/Settings/Oauth.php:87
+#: ../../Zotlabs/Module/Thing.php:320 ../../Zotlabs/Module/Thing.php:370
+#: ../../Zotlabs/Module/Import.php:514 ../../Zotlabs/Module/Cal.php:343
+#: ../../Zotlabs/Module/Mood.php:139 ../../Zotlabs/Module/Photos.php:657
+#: ../../Zotlabs/Module/Photos.php:1022 ../../Zotlabs/Module/Photos.php:1062
+#: ../../Zotlabs/Module/Photos.php:1180 ../../Zotlabs/Module/Wiki.php:169
+#: ../../Zotlabs/Module/Pdledit.php:74 ../../Zotlabs/Module/Poke.php:186
+#: ../../Zotlabs/Module/Connedit.php:882 ../../Zotlabs/Module/Chat.php:194
+#: ../../Zotlabs/Module/Chat.php:240 ../../Zotlabs/Module/Pconfig.php:107
+#: ../../Zotlabs/Module/Group.php:85 ../../Zotlabs/Module/Profiles.php:726
+#: ../../Zotlabs/Module/Sources.php:114 ../../Zotlabs/Module/Sources.php:149
+#: ../../Zotlabs/Module/Xchan.php:15 ../../Zotlabs/Module/Mail.php:449
+#: ../../Zotlabs/Module/Filestorage.php:165 ../../Zotlabs/Module/Rate.php:166
+#: ../../Zotlabs/Lib/ThreadItem.php:732
+#: ../../Zotlabs/Widget/Eventstools.php:16
+#: ../../view/theme/redbasic/php/config.php:84
+#: ../../addon/skeleton/skeleton.php:65 ../../addon/gnusoc/gnusoc.php:134
+#: ../../addon/cdav/cdav.php:246 ../../addon/planets/planets.php:157
+#: ../../addon/openclipatar/openclipatar.php:53
+#: ../../addon/wppost/wppost.php:113 ../../addon/nsfw/nsfw.php:92
+#: ../../addon/ijpost/ijpost.php:89 ../../addon/dwpost/dwpost.php:89
+#: ../../addon/mailhost/mailhost.php:40
+#: ../../addon/likebanner/likebanner.php:57
+#: ../../addon/redphotos/redphotos.php:136 ../../addon/irc/irc.php:53
+#: ../../addon/ljpost/ljpost.php:86 ../../addon/startpage/startpage.php:113
+#: ../../addon/diaspora/diaspora.php:712
+#: ../../addon/gitwiki/Mod_Gitwiki.php:155
+#: ../../addon/rainbowtag/rainbowtag.php:85 ../../addon/visage/visage.php:170
+#: ../../addon/nsabait/nsabait.php:161 ../../addon/mailtest/mailtest.php:100
+#: ../../addon/openstreetmap/openstreetmap.php:168
+#: ../../addon/rtof/rtof.php:101 ../../addon/jappixmini/jappixmini.php:371
+#: ../../addon/superblock/superblock.php:120 ../../addon/nofed/nofed.php:80
+#: ../../addon/redred/redred.php:119 ../../addon/logrot/logrot.php:35
+#: ../../addon/frphotos/frphotos.php:96 ../../addon/chords/Mod_Chords.php:60
+#: ../../addon/libertree/libertree.php:85
+#: ../../addon/flattrwidget/flattrwidget.php:124
+#: ../../addon/statusnet/statusnet.php:322
+#: ../../addon/statusnet/statusnet.php:380
+#: ../../addon/statusnet/statusnet.php:432
+#: ../../addon/statusnet/statusnet.php:899 ../../addon/twitter/twitter.php:217
+#: ../../addon/twitter/twitter.php:259
+#: ../../addon/smileybutton/smileybutton.php:281
+#: ../../addon/piwik/piwik.php:95 ../../addon/pageheader/pageheader.php:48
+#: ../../addon/xmpp/xmpp.php:69 ../../addon/pumpio/pumpio.php:237
+#: ../../addon/redfiles/redfiles.php:124 ../../addon/hubwall/hubwall.php:95
+#: ../../include/js_strings.php:22
+msgid "Submit"
+msgstr "Enviar"
-#: ../../Zotlabs/Web/WebServer.php:127 ../../Zotlabs/Module/Group.php:72
+#: ../../Zotlabs/Module/Editlayout.php:79
+#: ../../Zotlabs/Module/Editblock.php:79 ../../Zotlabs/Module/Editblock.php:95
+#: ../../Zotlabs/Module/Editwebpage.php:80
+#: ../../Zotlabs/Module/Editpost.php:24
+msgid "Item not found"
+msgstr "Elemento no encontrado"
+
+#: ../../Zotlabs/Module/Editlayout.php:128
+#: ../../Zotlabs/Module/Layouts.php:129 ../../Zotlabs/Module/Layouts.php:189
+msgid "Layout Name"
+msgstr "Nombre de la plantilla"
+
+#: ../../Zotlabs/Module/Editlayout.php:129
+#: ../../Zotlabs/Module/Layouts.php:132
+msgid "Layout Description (Optional)"
+msgstr "Descripción de la plantilla (opcional)"
+
+#: ../../Zotlabs/Module/Editlayout.php:137
+msgid "Edit Layout"
+msgstr "Modificar la plantilla"
+
+#: ../../Zotlabs/Module/Profperm.php:28 ../../Zotlabs/Module/Subthread.php:62
+#: ../../Zotlabs/Module/Import_items.php:120 ../../Zotlabs/Module/Group.php:72
#: ../../Zotlabs/Module/Dreport.php:10 ../../Zotlabs/Module/Dreport.php:68
-#: ../../Zotlabs/Module/Import_items.php:114
-#: ../../Zotlabs/Module/Profperm.php:28 ../../Zotlabs/Module/Like.php:283
-#: ../../Zotlabs/Module/Subthread.php:62
-#: ../../extend/addon/addon/frphotos/frphotos.php:81
-#: ../../extend/addon/addon/redfiles/redfiles.php:109
-#: ../../extend/addon/addon/redphotos/redphotos.php:119
+#: ../../Zotlabs/Module/Like.php:283 ../../Zotlabs/Web/WebServer.php:130
+#: ../../addon/redphotos/redphotos.php:119
+#: ../../addon/frphotos/frphotos.php:81 ../../addon/redfiles/redfiles.php:109
#: ../../include/items.php:327
msgid "Permission denied"
msgstr "Permiso denegado"
-#: ../../Zotlabs/Web/WebServer.php:128
-#: ../../Zotlabs/Module/Achievements.php:34 ../../Zotlabs/Module/Appman.php:82
-#: ../../Zotlabs/Module/Register.php:77 ../../Zotlabs/Module/Authtest.php:16
-#: ../../Zotlabs/Module/Bookmarks.php:61 ../../Zotlabs/Module/Editblock.php:67
-#: ../../Zotlabs/Module/Page.php:35 ../../Zotlabs/Module/Page.php:91
-#: ../../Zotlabs/Module/Connections.php:33
-#: ../../Zotlabs/Module/Cover_photo.php:277
-#: ../../Zotlabs/Module/Cover_photo.php:290
-#: ../../Zotlabs/Module/Editlayout.php:67
-#: ../../Zotlabs/Module/Editlayout.php:90
-#: ../../Zotlabs/Module/Editwebpage.php:68
-#: ../../Zotlabs/Module/Editwebpage.php:89
-#: ../../Zotlabs/Module/Editwebpage.php:104
-#: ../../Zotlabs/Module/Editwebpage.php:126
-#: ../../Zotlabs/Module/Network.php:15 ../../Zotlabs/Module/Menu.php:78
-#: ../../Zotlabs/Module/Locs.php:87 ../../Zotlabs/Module/Connedit.php:388
-#: ../../Zotlabs/Module/Events.php:271 ../../Zotlabs/Module/Filestorage.php:23
-#: ../../Zotlabs/Module/Filestorage.php:78
-#: ../../Zotlabs/Module/Filestorage.php:93
-#: ../../Zotlabs/Module/Filestorage.php:120 ../../Zotlabs/Module/Photos.php:73
-#: ../../Zotlabs/Module/Settings.php:59 ../../Zotlabs/Module/Group.php:13
-#: ../../Zotlabs/Module/Mail.php:164 ../../Zotlabs/Module/Block.php:26
-#: ../../Zotlabs/Module/Block.php:76 ../../Zotlabs/Module/Manage.php:10
-#: ../../Zotlabs/Module/Message.php:18 ../../Zotlabs/Module/Mitem.php:115
-#: ../../Zotlabs/Module/Editpost.php:17 ../../Zotlabs/Module/Api.php:24
-#: ../../Zotlabs/Module/Invite.php:17 ../../Zotlabs/Module/Invite.php:94
-#: ../../Zotlabs/Module/New_channel.php:77
-#: ../../Zotlabs/Module/New_channel.php:104
-#: ../../Zotlabs/Module/Webpages.php:116
-#: ../../Zotlabs/Module/Notifications.php:11 ../../Zotlabs/Module/Poke.php:137
-#: ../../Zotlabs/Module/Item.php:220 ../../Zotlabs/Module/Item.php:230
-#: ../../Zotlabs/Module/Item.php:1067 ../../Zotlabs/Module/Blocks.php:73
-#: ../../Zotlabs/Module/Blocks.php:80 ../../Zotlabs/Module/Layouts.php:71
-#: ../../Zotlabs/Module/Layouts.php:78 ../../Zotlabs/Module/Layouts.php:89
-#: ../../Zotlabs/Module/Rate.php:113
-#: ../../Zotlabs/Module/Profile_photo.php:278
-#: ../../Zotlabs/Module/Profile_photo.php:291
-#: ../../Zotlabs/Module/Like.php:181 ../../Zotlabs/Module/Common.php:39
-#: ../../Zotlabs/Module/Channel.php:115 ../../Zotlabs/Module/Channel.php:245
-#: ../../Zotlabs/Module/Channel.php:285 ../../Zotlabs/Module/Mood.php:116
-#: ../../Zotlabs/Module/Regmod.php:21 ../../Zotlabs/Module/Pdledit.php:29
-#: ../../Zotlabs/Module/Profile.php:83 ../../Zotlabs/Module/Profile.php:100
-#: ../../Zotlabs/Module/Viewsrc.php:18
-#: ../../Zotlabs/Module/Service_limits.php:11
-#: ../../Zotlabs/Module/Sharedwithme.php:11
-#: ../../Zotlabs/Module/Sources.php:74 ../../Zotlabs/Module/Suggest.php:30
-#: ../../Zotlabs/Module/Profiles.php:198 ../../Zotlabs/Module/Profiles.php:635
-#: ../../Zotlabs/Module/Thing.php:274 ../../Zotlabs/Module/Thing.php:294
-#: ../../Zotlabs/Module/Thing.php:335 ../../Zotlabs/Module/Setup.php:212
-#: ../../Zotlabs/Module/Viewconnections.php:28
-#: ../../Zotlabs/Module/Viewconnections.php:33
-#: ../../Zotlabs/Module/Wiki.php:50 ../../Zotlabs/Module/Wiki.php:215
-#: ../../Zotlabs/Module/Wiki.php:311 ../../Zotlabs/Module/Chat.php:98
-#: ../../Zotlabs/Module/Chat.php:103 ../../Zotlabs/Lib/Chatroom.php:137
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:55
-#: ../../extend/addon/addon/keepout/keepout.php:36
-#: ../../extend/addon/addon/pumpio/pumpio.php:40
-#: ../../extend/addon/addon/openid/Mod_Id.php:53
-#: ../../extend/addon/addon/diaspora_reconnect/diaspora_reconnect.php:58
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:194
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:291
-#: ../../include/items.php:3447 ../../include/attach.php:144
-#: ../../include/attach.php:191 ../../include/attach.php:255
-#: ../../include/attach.php:269 ../../include/attach.php:276
-#: ../../include/attach.php:343 ../../include/attach.php:357
-#: ../../include/attach.php:364 ../../include/attach.php:441
-#: ../../include/attach.php:908 ../../include/attach.php:979
-#: ../../include/attach.php:1137 ../../include/photos.php:27
-msgid "Permission denied."
-msgstr "Acceso denegado."
+#: ../../Zotlabs/Module/Profperm.php:34 ../../Zotlabs/Module/Profperm.php:63
+msgid "Invalid profile identifier."
+msgstr "Identificador del perfil no válido"
-#: ../../Zotlabs/Web/Router.php:146 ../../Zotlabs/Module/Page.php:94
-#: ../../Zotlabs/Module/Display.php:122 ../../Zotlabs/Module/Block.php:79
-#: ../../Zotlabs/Lib/NativeWikiPage.php:518 ../../include/help.php:68
-msgid "Page not found."
-msgstr "Página no encontrada."
+#: ../../Zotlabs/Module/Profperm.php:111
+msgid "Profile Visibility Editor"
+msgstr "Editor de visibilidad del perfil"
-#: ../../Zotlabs/Zot/Auth.php:138
+#: ../../Zotlabs/Module/Profperm.php:113 ../../include/channel.php:1362
+msgid "Profile"
+msgstr "Perfil"
+
+#: ../../Zotlabs/Module/Profperm.php:115
+msgid "Click on a contact to add or remove."
+msgstr "Pulsar en un contacto para añadirlo o eliminarlo."
+
+#: ../../Zotlabs/Module/Profperm.php:124
+msgid "Visible To"
+msgstr "Visible para"
+
+#: ../../Zotlabs/Module/Profperm.php:140
+#: ../../Zotlabs/Module/Connections.php:141
+msgid "All Connections"
+msgstr "Todas las conexiones"
+
+#: ../../Zotlabs/Module/Regdir.php:49 ../../Zotlabs/Module/Dirsearch.php:25
+msgid "This site is not a directory server"
+msgstr "Este sitio no es un servidor de directorio"
+
+#: ../../Zotlabs/Module/Channel.php:32 ../../Zotlabs/Module/Chat.php:25
+#: ../../addon/gitwiki/Mod_Gitwiki.php:28 ../../addon/chess/chess.php:403
+msgid "You must be logged in to see this page."
+msgstr "Debe haber iniciado sesión para poder ver esta página."
+
+#: ../../Zotlabs/Module/Channel.php:47 ../../Zotlabs/Module/Hcard.php:35
+#: ../../Zotlabs/Module/Profile.php:43
+msgid "Posts and comments"
+msgstr "Publicaciones y comentarios"
+
+#: ../../Zotlabs/Module/Channel.php:54 ../../Zotlabs/Module/Hcard.php:42
+#: ../../Zotlabs/Module/Profile.php:50
+msgid "Only posts"
+msgstr "Solo publicaciones"
+
+#: ../../Zotlabs/Module/Channel.php:112
+msgid "Insufficient permissions. Request redirected to profile page."
+msgstr "Permisos insuficientes. Petición redirigida a la página del perfil."
+
+#: ../../Zotlabs/Module/Uexport.php:57 ../../Zotlabs/Module/Uexport.php:58
+msgid "Export Channel"
+msgstr "Exportar el canal"
+
+#: ../../Zotlabs/Module/Uexport.php:59
msgid ""
-"Remote authentication blocked. You are logged into this site locally. Please"
-" logout and retry."
-msgstr "La autenticación desde su servidor está bloqueada. Ha iniciado sesión localmente. Por favor, salga de la sesión y vuelva a intentarlo."
+"Export your basic channel information to a file. This acts as a backup of "
+"your connections, permissions, profile and basic data, which can be used to "
+"import your data to a new server hub, but does not contain your content."
+msgstr "Exportar la información básica del canal a un fichero. Este equivale a una copia de seguridad de sus conexiones, el perfil y datos fundamentales, que puede usarse para importar sus datos a un nuevo servidor, pero no incluye su contenido."
+
+#: ../../Zotlabs/Module/Uexport.php:60
+msgid "Export Content"
+msgstr "Exportar contenidos"
+
+#: ../../Zotlabs/Module/Uexport.php:61
+msgid ""
+"Export your channel information and recent content to a JSON backup that can"
+" be restored or imported to another server hub. This backs up all of your "
+"connections, permissions, profile data and several months of posts. This "
+"file may be VERY large. Please be patient - it may take several minutes for"
+" this download to begin."
+msgstr "Exportar la información sobre su canal y el contenido reciente a un fichero de respaldo JSON, que puede ser restaurado o importado a otro servidor. Este fichero incluye todas sus conexiones, permisos, datos del perfil y publicaciones de varios meses. Puede llegar a ser MUY grande. Por favor, sea paciente, la descarga puede tardar varios minutos en comenzar."
+
+#: ../../Zotlabs/Module/Uexport.php:63
+msgid "Export your posts from a given year."
+msgstr "Exporta sus publicaciones de un año dado."
-#: ../../Zotlabs/Zot/Auth.php:250
-#: ../../extend/addon/addon/openid/Mod_Openid.php:76
-#: ../../extend/addon/addon/openid/Mod_Openid.php:178
+#: ../../Zotlabs/Module/Uexport.php:65
+msgid ""
+"You may also export your posts and conversations for a particular year or "
+"month. Adjust the date in your browser location bar to select other dates. "
+"If the export fails (possibly due to memory exhaustion on your server hub), "
+"please try again selecting a more limited date range."
+msgstr "También puede exportar sus mensajes y conversaciones durante un año o mes en particular. Ajuste la fecha en la barra de direcciones del navegador para seleccionar otras fechas. Si la exportación falla (posiblemente debido al agotamiento de la memoria del servidor hub), por favor, intente de nuevo la selección de un rango de fechas más pequeño."
+
+#: ../../Zotlabs/Module/Uexport.php:66
#, php-format
-msgid "Welcome %s. Remote authentication successful."
-msgstr "Bienvenido %s. La identificación desde su servidor se ha llevado a cabo correctamente."
+msgid ""
+"To select all posts for a given year, such as this year, visit <a "
+"href=\"%1$s\">%2$s</a>"
+msgstr "Para seleccionar todos los mensajes de un año determinado, como este año, visite <a href=\"%1$s\">%2$s</a>"
-#: ../../Zotlabs/Module/Achievements.php:15
-#: ../../Zotlabs/Module/Connect.php:17 ../../Zotlabs/Module/Editblock.php:31
-#: ../../Zotlabs/Module/Editlayout.php:31
-#: ../../Zotlabs/Module/Editwebpage.php:32
-#: ../../Zotlabs/Module/Filestorage.php:59
-#: ../../Zotlabs/Module/Webpages.php:33 ../../Zotlabs/Module/Hcard.php:12
-#: ../../Zotlabs/Module/Blocks.php:33 ../../Zotlabs/Module/Layouts.php:31
-#: ../../Zotlabs/Module/Profile.php:20 ../../include/channel.php:945
-msgid "Requested profile is not available."
-msgstr "El perfil solicitado no está disponible."
+#: ../../Zotlabs/Module/Uexport.php:67
+#, php-format
+msgid ""
+"To select all posts for a given month, such as January of this year, visit "
+"<a href=\"%1$s\">%2$s</a>"
+msgstr "Para seleccionar todos los mensajes de un mes determinado, como el de enero de este año, visite <a href=\"%1$s\">%2$s</a>"
-#: ../../Zotlabs/Module/Achievements.php:38
-msgid "Some blurb about what to do when you're new here"
-msgstr "Algunas propuestas para el nuevo usuario sobre qué se puede hacer aquí"
+#: ../../Zotlabs/Module/Uexport.php:68
+#, php-format
+msgid ""
+"These content files may be imported or restored by visiting <a "
+"href=\"%1$s\">%2$s</a> on any site containing your channel. For best results"
+" please import or restore these in date order (oldest first)."
+msgstr "Estos ficheros pueden ser importados o restaurados visitando <a href=\"%1$s\">%2$s</a> o cualquier sitio que contenga su canal. Para obtener los mejores resultados, por favor, importar o restaurar estos ficheros en orden de fecha (la más antigua primero)."
+
+#: ../../Zotlabs/Module/Search.php:17 ../../Zotlabs/Module/Photos.php:490
+#: ../../Zotlabs/Module/Ratings.php:83 ../../Zotlabs/Module/Directory.php:63
+#: ../../Zotlabs/Module/Display.php:22
+#: ../../Zotlabs/Module/Viewconnections.php:23
+msgid "Public access denied."
+msgstr "Acceso público denegado."
+
+#: ../../Zotlabs/Module/Search.php:44 ../../Zotlabs/Module/Connections.php:312
+#: ../../Zotlabs/Lib/Apps.php:237 ../../Zotlabs/Widget/Sitesearch.php:31
+#: ../../include/text.php:1027 ../../include/text.php:1039
+#: ../../include/acl_selectors.php:213 ../../include/nav.php:164
+msgid "Search"
+msgstr "Buscar"
+
+#: ../../Zotlabs/Module/Search.php:224
+#, php-format
+msgid "Items tagged with: %s"
+msgstr "elementos etiquetados con: %s"
+
+#: ../../Zotlabs/Module/Search.php:226
+#, php-format
+msgid "Search results for: %s"
+msgstr "Resultados de la búsqueda para: %s"
+
+#: ../../Zotlabs/Module/Locs.php:25 ../../Zotlabs/Module/Locs.php:54
+msgid "Location not found."
+msgstr "Dirección no encontrada."
+
+#: ../../Zotlabs/Module/Locs.php:62
+msgid "Location lookup failed."
+msgstr "Ha fallado la búsqueda de la dirección."
+
+#: ../../Zotlabs/Module/Locs.php:66
+msgid ""
+"Please select another location to become primary before removing the primary"
+" location."
+msgstr "Por favor, seleccione una copia de su canal (un clon) para convertirlo en primario antes de eliminar su canal principal."
+
+#: ../../Zotlabs/Module/Locs.php:95
+msgid "Syncing locations"
+msgstr "Sincronizando ubicaciones"
+
+#: ../../Zotlabs/Module/Locs.php:105
+msgid "No locations found."
+msgstr "No encontrada ninguna dirección."
+
+#: ../../Zotlabs/Module/Locs.php:116
+msgid "Manage Channel Locations"
+msgstr "Gestionar las direcciones del canal"
+
+#: ../../Zotlabs/Module/Locs.php:117 ../../Zotlabs/Module/Events.php:475
+#: ../../Zotlabs/Module/Profiles.php:509 ../../Zotlabs/Module/Profiles.php:737
+#: ../../Zotlabs/Module/Pubsites.php:51 ../../addon/cdav/Mod_Cdav.php:839
+#: ../../include/js_strings.php:25
+msgid "Location"
+msgstr "Ubicación"
+
+#: ../../Zotlabs/Module/Locs.php:118
+#: ../../Zotlabs/Module/Admin/Channels.php:160
+#: ../../Zotlabs/Module/Connedit.php:909 ../../Zotlabs/Module/Profiles.php:502
+#: ../../Zotlabs/Module/Profiles.php:793 ../../addon/cdav/Mod_Cdav.php:1143
+msgid "Address"
+msgstr "Dirección"
+
+#: ../../Zotlabs/Module/Locs.php:119
+msgid "Primary"
+msgstr "Primario"
+
+#: ../../Zotlabs/Module/Locs.php:120 ../../Zotlabs/Module/Menu.php:113
+msgid "Drop"
+msgstr "Eliminar"
+
+#: ../../Zotlabs/Module/Locs.php:122
+msgid "Sync Now"
+msgstr "Sincronizar ahora"
+
+#: ../../Zotlabs/Module/Locs.php:123
+msgid "Please wait several minutes between consecutive operations."
+msgstr "Por favor, espere algunos minutos entre operaciones consecutivas."
+
+#: ../../Zotlabs/Module/Locs.php:124
+msgid ""
+"When possible, drop a location by logging into that website/hub and removing"
+" your channel."
+msgstr "Cuando sea posible, elimine una ubicación iniciando sesión en el sitio web o \"hub\" y borrando su canal."
+
+#: ../../Zotlabs/Module/Locs.php:125
+msgid "Use this form to drop the location if the hub is no longer operating."
+msgstr "Utilice este formulario para eliminar la dirección si el \"hub\" no está funcionando desde hace tiempo."
+
+#: ../../Zotlabs/Module/Mitem.php:28 ../../Zotlabs/Module/Menu.php:144
+msgid "Menu not found."
+msgstr "Menú no encontrado"
+
+#: ../../Zotlabs/Module/Mitem.php:52
+msgid "Unable to create element."
+msgstr "No se puede crear el elemento."
+
+#: ../../Zotlabs/Module/Mitem.php:76
+msgid "Unable to update menu element."
+msgstr "No es posible actualizar el elemento del menú."
+
+#: ../../Zotlabs/Module/Mitem.php:92
+msgid "Unable to add menu element."
+msgstr "No es posible añadir el elemento al menú"
+
+#: ../../Zotlabs/Module/Mitem.php:120 ../../Zotlabs/Module/Menu.php:166
+#: ../../Zotlabs/Module/Xchan.php:41
+msgid "Not found."
+msgstr "No encontrado."
+
+#: ../../Zotlabs/Module/Mitem.php:153 ../../Zotlabs/Module/Mitem.php:230
+msgid "Menu Item Permissions"
+msgstr "Permisos del elemento del menú"
+
+#: ../../Zotlabs/Module/Mitem.php:154 ../../Zotlabs/Module/Mitem.php:231
+#: ../../Zotlabs/Module/Settings/Channel.php:510
+msgid "(click to open/close)"
+msgstr "(pulsar para abrir o cerrar)"
+
+#: ../../Zotlabs/Module/Mitem.php:160 ../../Zotlabs/Module/Mitem.php:176
+msgid "Link Name"
+msgstr "Nombre del enlace"
+
+#: ../../Zotlabs/Module/Mitem.php:161 ../../Zotlabs/Module/Mitem.php:239
+msgid "Link or Submenu Target"
+msgstr "Destino del enlace o submenú"
+
+#: ../../Zotlabs/Module/Mitem.php:161
+msgid "Enter URL of the link or select a menu name to create a submenu"
+msgstr "Introducir la dirección del enlace o seleccionar el nombre de un submenú"
+
+#: ../../Zotlabs/Module/Mitem.php:162 ../../Zotlabs/Module/Mitem.php:240
+msgid "Use magic-auth if available"
+msgstr "Usar la autenticación mágica si está disponible"
+
+#: ../../Zotlabs/Module/Mitem.php:162 ../../Zotlabs/Module/Mitem.php:163
+#: ../../Zotlabs/Module/Mitem.php:240 ../../Zotlabs/Module/Mitem.php:241
+#: ../../Zotlabs/Module/Events.php:470 ../../Zotlabs/Module/Events.php:471
+#: ../../Zotlabs/Module/Removeme.php:63
+#: ../../Zotlabs/Module/Admin/Site.php:237
+#: ../../Zotlabs/Module/Settings/Channel.php:294
+#: ../../Zotlabs/Module/Settings/Display.php:103
+#: ../../Zotlabs/Module/Api.php:97 ../../Zotlabs/Module/Photos.php:642
+#: ../../Zotlabs/Module/Wiki.php:180 ../../Zotlabs/Module/Connedit.php:392
+#: ../../Zotlabs/Module/Connedit.php:775 ../../Zotlabs/Module/Menu.php:100
+#: ../../Zotlabs/Module/Menu.php:157 ../../Zotlabs/Module/Profiles.php:681
+#: ../../Zotlabs/Module/Filestorage.php:160
+#: ../../Zotlabs/Module/Filestorage.php:168 ../../boot.php:1633
+#: ../../view/theme/redbasic/php/config.php:89
+#: ../../view/theme/redbasic/php/config.php:104 ../../addon/cdav/cdav.php:234
+#: ../../addon/planets/planets.php:153 ../../addon/wppost/wppost.php:82
+#: ../../addon/wppost/wppost.php:105 ../../addon/wppost/wppost.php:109
+#: ../../addon/nsfw/nsfw.php:84 ../../addon/ijpost/ijpost.php:73
+#: ../../addon/ijpost/ijpost.php:85 ../../addon/dwpost/dwpost.php:73
+#: ../../addon/dwpost/dwpost.php:85 ../../addon/ljpost/ljpost.php:70
+#: ../../addon/ljpost/ljpost.php:82 ../../addon/gitwiki/Mod_Gitwiki.php:166
+#: ../../addon/rainbowtag/rainbowtag.php:81 ../../addon/visage/visage.php:166
+#: ../../addon/nsabait/nsabait.php:157 ../../addon/rtof/rtof.php:81
+#: ../../addon/rtof/rtof.php:85 ../../addon/jappixmini/jappixmini.php:309
+#: ../../addon/jappixmini/jappixmini.php:313
+#: ../../addon/jappixmini/jappixmini.php:343
+#: ../../addon/jappixmini/jappixmini.php:351
+#: ../../addon/jappixmini/jappixmini.php:355
+#: ../../addon/jappixmini/jappixmini.php:359 ../../addon/nofed/nofed.php:72
+#: ../../addon/nofed/nofed.php:76 ../../addon/redred/redred.php:95
+#: ../../addon/redred/redred.php:99 ../../addon/libertree/libertree.php:69
+#: ../../addon/libertree/libertree.php:81
+#: ../../addon/flattrwidget/flattrwidget.php:120
+#: ../../addon/statusnet/statusnet.php:389
+#: ../../addon/statusnet/statusnet.php:411
+#: ../../addon/statusnet/statusnet.php:415
+#: ../../addon/statusnet/statusnet.php:424 ../../addon/twitter/twitter.php:242
+#: ../../addon/twitter/twitter.php:246 ../../addon/twitter/twitter.php:255
+#: ../../addon/smileybutton/smileybutton.php:273
+#: ../../addon/smileybutton/smileybutton.php:277 ../../addon/xmpp/xmpp.php:53
+#: ../../addon/pumpio/pumpio.php:219 ../../addon/pumpio/pumpio.php:223
+#: ../../addon/pumpio/pumpio.php:227 ../../addon/pumpio/pumpio.php:231
+#: ../../include/dir_fns.php:143 ../../include/dir_fns.php:144
+#: ../../include/dir_fns.php:145
+msgid "No"
+msgstr "No"
+
+#: ../../Zotlabs/Module/Mitem.php:162 ../../Zotlabs/Module/Mitem.php:163
+#: ../../Zotlabs/Module/Mitem.php:240 ../../Zotlabs/Module/Mitem.php:241
+#: ../../Zotlabs/Module/Events.php:470 ../../Zotlabs/Module/Events.php:471
+#: ../../Zotlabs/Module/Removeme.php:63
+#: ../../Zotlabs/Module/Admin/Site.php:239
+#: ../../Zotlabs/Module/Settings/Channel.php:294
+#: ../../Zotlabs/Module/Settings/Display.php:103
+#: ../../Zotlabs/Module/Api.php:96 ../../Zotlabs/Module/Photos.php:642
+#: ../../Zotlabs/Module/Wiki.php:180 ../../Zotlabs/Module/Connedit.php:392
+#: ../../Zotlabs/Module/Menu.php:100 ../../Zotlabs/Module/Menu.php:157
+#: ../../Zotlabs/Module/Profiles.php:681
+#: ../../Zotlabs/Module/Filestorage.php:160
+#: ../../Zotlabs/Module/Filestorage.php:168 ../../boot.php:1633
+#: ../../view/theme/redbasic/php/config.php:89
+#: ../../view/theme/redbasic/php/config.php:104 ../../addon/cdav/cdav.php:234
+#: ../../addon/planets/planets.php:153 ../../addon/wppost/wppost.php:82
+#: ../../addon/wppost/wppost.php:105 ../../addon/wppost/wppost.php:109
+#: ../../addon/nsfw/nsfw.php:84 ../../addon/ijpost/ijpost.php:73
+#: ../../addon/ijpost/ijpost.php:85 ../../addon/dwpost/dwpost.php:73
+#: ../../addon/dwpost/dwpost.php:85 ../../addon/ljpost/ljpost.php:70
+#: ../../addon/ljpost/ljpost.php:82 ../../addon/gitwiki/Mod_Gitwiki.php:166
+#: ../../addon/rainbowtag/rainbowtag.php:81 ../../addon/visage/visage.php:166
+#: ../../addon/nsabait/nsabait.php:157 ../../addon/rtof/rtof.php:81
+#: ../../addon/rtof/rtof.php:85 ../../addon/jappixmini/jappixmini.php:309
+#: ../../addon/jappixmini/jappixmini.php:313
+#: ../../addon/jappixmini/jappixmini.php:343
+#: ../../addon/jappixmini/jappixmini.php:351
+#: ../../addon/jappixmini/jappixmini.php:355
+#: ../../addon/jappixmini/jappixmini.php:359 ../../addon/nofed/nofed.php:72
+#: ../../addon/nofed/nofed.php:76 ../../addon/redred/redred.php:95
+#: ../../addon/redred/redred.php:99 ../../addon/libertree/libertree.php:69
+#: ../../addon/libertree/libertree.php:81
+#: ../../addon/flattrwidget/flattrwidget.php:120
+#: ../../addon/statusnet/statusnet.php:389
+#: ../../addon/statusnet/statusnet.php:411
+#: ../../addon/statusnet/statusnet.php:415
+#: ../../addon/statusnet/statusnet.php:424 ../../addon/twitter/twitter.php:242
+#: ../../addon/twitter/twitter.php:246 ../../addon/twitter/twitter.php:255
+#: ../../addon/smileybutton/smileybutton.php:273
+#: ../../addon/smileybutton/smileybutton.php:277 ../../addon/xmpp/xmpp.php:53
+#: ../../addon/pumpio/pumpio.php:219 ../../addon/pumpio/pumpio.php:223
+#: ../../addon/pumpio/pumpio.php:227 ../../addon/pumpio/pumpio.php:231
+#: ../../include/dir_fns.php:143 ../../include/dir_fns.php:144
+#: ../../include/dir_fns.php:145
+msgid "Yes"
+msgstr "Sí"
+
+#: ../../Zotlabs/Module/Mitem.php:163 ../../Zotlabs/Module/Mitem.php:241
+msgid "Open link in new window"
+msgstr "Abrir el enlace en una nueva ventana"
+
+#: ../../Zotlabs/Module/Mitem.php:164 ../../Zotlabs/Module/Mitem.php:242
+msgid "Order in list"
+msgstr "Orden en la lista"
+
+#: ../../Zotlabs/Module/Mitem.php:164 ../../Zotlabs/Module/Mitem.php:242
+msgid "Higher numbers will sink to bottom of listing"
+msgstr "Los números más altos irán al final de la lista"
+
+#: ../../Zotlabs/Module/Mitem.php:165
+msgid "Submit and finish"
+msgstr "Enviar y terminar"
+
+#: ../../Zotlabs/Module/Mitem.php:166
+msgid "Submit and continue"
+msgstr "Enviar y continuar"
+
+#: ../../Zotlabs/Module/Mitem.php:174
+msgid "Menu:"
+msgstr "Menú:"
+
+#: ../../Zotlabs/Module/Mitem.php:177
+msgid "Link Target"
+msgstr "Destino del enlace"
+
+#: ../../Zotlabs/Module/Mitem.php:180
+msgid "Edit menu"
+msgstr "Editar menú"
+
+#: ../../Zotlabs/Module/Mitem.php:183
+msgid "Edit element"
+msgstr "Editar el elemento"
+
+#: ../../Zotlabs/Module/Mitem.php:184
+msgid "Drop element"
+msgstr "Eliminar el elemento"
+
+#: ../../Zotlabs/Module/Mitem.php:185
+msgid "New element"
+msgstr "Nuevo elemento"
+
+#: ../../Zotlabs/Module/Mitem.php:186
+msgid "Edit this menu container"
+msgstr "Modificar el contenedor del menú"
+
+#: ../../Zotlabs/Module/Mitem.php:187
+msgid "Add menu element"
+msgstr "Añadir un elemento al menú"
+
+#: ../../Zotlabs/Module/Mitem.php:188
+msgid "Delete this menu item"
+msgstr "Eliminar este elemento del menú"
+
+#: ../../Zotlabs/Module/Mitem.php:189
+msgid "Edit this menu item"
+msgstr "Modificar este elemento del menú"
+
+#: ../../Zotlabs/Module/Mitem.php:206
+msgid "Menu item not found."
+msgstr "Este elemento del menú no se ha encontrado"
+
+#: ../../Zotlabs/Module/Mitem.php:219
+msgid "Menu item deleted."
+msgstr "Este elemento del menú ha sido borrado"
+
+#: ../../Zotlabs/Module/Mitem.php:221
+msgid "Menu item could not be deleted."
+msgstr "Este elemento del menú no puede ser borrado."
+
+#: ../../Zotlabs/Module/Mitem.php:228
+msgid "Edit Menu Element"
+msgstr "Editar elemento del menú"
+
+#: ../../Zotlabs/Module/Mitem.php:238
+msgid "Link text"
+msgstr "Texto del enlace"
+
+#: ../../Zotlabs/Module/Events.php:25
+msgid "Calendar entries imported."
+msgstr "Entradas de calendario importadas."
+
+#: ../../Zotlabs/Module/Events.php:27
+msgid "No calendar entries found."
+msgstr "No se han encontrado entradas de calendario."
+
+#: ../../Zotlabs/Module/Events.php:110
+msgid "Event can not end before it has started."
+msgstr "Un evento no puede terminar antes de que haya comenzado."
+
+#: ../../Zotlabs/Module/Events.php:112 ../../Zotlabs/Module/Events.php:121
+#: ../../Zotlabs/Module/Events.php:143
+msgid "Unable to generate preview."
+msgstr "No se puede crear la vista previa."
+
+#: ../../Zotlabs/Module/Events.php:119
+msgid "Event title and start time are required."
+msgstr "Se requieren el título del evento y su hora de inicio."
+
+#: ../../Zotlabs/Module/Events.php:141 ../../Zotlabs/Module/Events.php:265
+msgid "Event not found."
+msgstr "Evento no encontrado."
+
+#: ../../Zotlabs/Module/Events.php:260 ../../Zotlabs/Module/Tagger.php:51
+#: ../../Zotlabs/Module/Like.php:372 ../../include/conversation.php:119
+#: ../../include/text.php:1940 ../../include/event.php:1141
+msgid "event"
+msgstr "evento"
+
+#: ../../Zotlabs/Module/Events.php:460
+msgid "Edit event title"
+msgstr "Editar el título del evento"
+
+#: ../../Zotlabs/Module/Events.php:460 ../../addon/cdav/Mod_Cdav.php:835
+msgid "Event title"
+msgstr "Título del evento"
+
+#: ../../Zotlabs/Module/Events.php:460 ../../Zotlabs/Module/Events.php:465
+#: ../../Zotlabs/Module/Appman.php:122 ../../Zotlabs/Module/Appman.php:123
+#: ../../Zotlabs/Module/Profiles.php:748 ../../Zotlabs/Module/Profiles.php:752
+#: ../../include/datetime.php:259
+msgid "Required"
+msgstr "Obligatorio"
+
+#: ../../Zotlabs/Module/Events.php:462
+msgid "Categories (comma-separated list)"
+msgstr "Temas (lista separada por comas)"
+
+#: ../../Zotlabs/Module/Events.php:463
+msgid "Edit Category"
+msgstr "Modificar el tema"
+
+#: ../../Zotlabs/Module/Events.php:463
+msgid "Category"
+msgstr "Tema"
+
+#: ../../Zotlabs/Module/Events.php:466
+msgid "Edit start date and time"
+msgstr "Modificar la fecha y hora de comienzo"
+
+#: ../../Zotlabs/Module/Events.php:466 ../../addon/cdav/Mod_Cdav.php:836
+msgid "Start date and time"
+msgstr "Fecha y hora de comienzo"
+
+#: ../../Zotlabs/Module/Events.php:467 ../../Zotlabs/Module/Events.php:470
+msgid "Finish date and time are not known or not relevant"
+msgstr "La fecha y hora de terminación no se conocen o no son relevantes"
+
+#: ../../Zotlabs/Module/Events.php:469
+msgid "Edit finish date and time"
+msgstr "Modificar la fecha y hora de terminación"
+
+#: ../../Zotlabs/Module/Events.php:469
+msgid "Finish date and time"
+msgstr "Fecha y hora de terminación"
+
+#: ../../Zotlabs/Module/Events.php:471 ../../Zotlabs/Module/Events.php:472
+msgid "Adjust for viewer timezone"
+msgstr "Ajustar para obtener el visor de los husos horarios"
+
+#: ../../Zotlabs/Module/Events.php:471
+msgid ""
+"Important for events that happen in a particular place. Not practical for "
+"global holidays."
+msgstr "Importante para los eventos que suceden en un lugar determinado. No es práctico para los globales."
+
+#: ../../Zotlabs/Module/Events.php:473
+msgid "Edit Description"
+msgstr "Editar la descripción"
+
+#: ../../Zotlabs/Module/Events.php:473 ../../Zotlabs/Module/Appman.php:124
+#: ../../Zotlabs/Module/Rbmark.php:101
+#: ../../addon/rendezvous/rendezvous.php:173 ../../addon/cdav/Mod_Cdav.php:838
+msgid "Description"
+msgstr "Descripción"
+
+#: ../../Zotlabs/Module/Events.php:475
+msgid "Edit Location"
+msgstr "Modificar la dirección"
+
+#: ../../Zotlabs/Module/Events.php:478 ../../Zotlabs/Module/Photos.php:1063
+#: ../../Zotlabs/Module/Webpages.php:252 ../../Zotlabs/Lib/ThreadItem.php:741
+#: ../../include/conversation.php:1280 ../../include/page_widgets.php:43
+msgid "Preview"
+msgstr "Previsualizar"
+
+#: ../../Zotlabs/Module/Events.php:479 ../../include/conversation.php:1343
+msgid "Permission settings"
+msgstr "Configuración de permisos"
+
+#: ../../Zotlabs/Module/Events.php:489
+msgid "Timezone:"
+msgstr "Zona horaria: "
+
+#: ../../Zotlabs/Module/Events.php:494
+msgid "Advanced Options"
+msgstr "Opciones avanzadas"
+
+#: ../../Zotlabs/Module/Events.php:605 ../../Zotlabs/Module/Cal.php:264
+msgid "l, F j"
+msgstr "l j F"
+
+#: ../../Zotlabs/Module/Events.php:633
+msgid "Edit event"
+msgstr "Editar evento"
+
+#: ../../Zotlabs/Module/Events.php:635
+msgid "Delete event"
+msgstr "Borrar evento"
+
+#: ../../Zotlabs/Module/Events.php:660 ../../Zotlabs/Module/Cal.php:313
+#: ../../include/text.php:1759
+msgid "Link to Source"
+msgstr "Enlazar con la entrada en su ubicación original"
+
+#: ../../Zotlabs/Module/Events.php:669
+msgid "calendar"
+msgstr "calendario"
+
+#: ../../Zotlabs/Module/Events.php:688 ../../Zotlabs/Module/Cal.php:336
+msgid "Edit Event"
+msgstr "Editar el evento"
+
+#: ../../Zotlabs/Module/Events.php:688 ../../Zotlabs/Module/Cal.php:336
+msgid "Create Event"
+msgstr "Crear un evento"
+
+#: ../../Zotlabs/Module/Events.php:689 ../../Zotlabs/Module/Events.php:698
+#: ../../Zotlabs/Module/Cal.php:337 ../../Zotlabs/Module/Cal.php:344
+#: ../../Zotlabs/Module/Photos.php:911 ../../addon/cdav/Mod_Cdav.php:846
+msgid "Previous"
+msgstr "Anterior"
+
+#: ../../Zotlabs/Module/Events.php:690 ../../Zotlabs/Module/Events.php:699
+#: ../../Zotlabs/Module/Setup.php:264 ../../Zotlabs/Module/Cal.php:338
+#: ../../Zotlabs/Module/Cal.php:345 ../../Zotlabs/Module/Photos.php:920
+#: ../../addon/cdav/Mod_Cdav.php:847
+msgid "Next"
+msgstr "Siguiente"
+
+#: ../../Zotlabs/Module/Events.php:691 ../../Zotlabs/Module/Cal.php:339
+#: ../../include/channel.php:1365
+msgid "Export"
+msgstr "Exportar"
+
+#: ../../Zotlabs/Module/Events.php:695 ../../addon/cdav/Mod_Cdav.php:849
+msgid "Month"
+msgstr "Mes"
+
+#: ../../Zotlabs/Module/Events.php:696 ../../addon/cdav/Mod_Cdav.php:850
+msgid "Week"
+msgstr "Semana"
+
+#: ../../Zotlabs/Module/Events.php:697 ../../addon/cdav/Mod_Cdav.php:851
+msgid "Day"
+msgstr "Día"
+
+#: ../../Zotlabs/Module/Events.php:700 ../../Zotlabs/Module/Cal.php:346
+#: ../../addon/cdav/Mod_Cdav.php:848
+msgid "Today"
+msgstr "Hoy"
+
+#: ../../Zotlabs/Module/Events.php:731
+msgid "Event removed"
+msgstr "Evento borrado"
+
+#: ../../Zotlabs/Module/Events.php:734
+msgid "Failed to remove event"
+msgstr "Error al eliminar el evento"
#: ../../Zotlabs/Module/Appman.php:38 ../../Zotlabs/Module/Appman.php:55
msgid "App installed."
@@ -505,24 +1152,10 @@ msgstr "Crear una aplicación"
msgid "Name of app"
msgstr "Nombre de la aplicación"
-#: ../../Zotlabs/Module/Appman.php:122 ../../Zotlabs/Module/Appman.php:123
-#: ../../Zotlabs/Module/Events.php:460 ../../Zotlabs/Module/Events.php:465
-#: ../../Zotlabs/Module/Profiles.php:748 ../../Zotlabs/Module/Profiles.php:752
-#: ../../include/datetime.php:259
-msgid "Required"
-msgstr "Obligatorio"
-
#: ../../Zotlabs/Module/Appman.php:123
msgid "Location (URL) of app"
msgstr "Dirección (URL) de la aplicación"
-#: ../../Zotlabs/Module/Appman.php:124 ../../Zotlabs/Module/Events.php:473
-#: ../../Zotlabs/Module/Rbmark.php:101
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:838
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:173
-msgid "Description"
-msgstr "Descripción"
-
#: ../../Zotlabs/Module/Appman.php:125
msgid "Photo icon URL"
msgstr "Dirección del icono"
@@ -547,879 +1180,739 @@ msgstr "Precio de la aplicación"
msgid "Location (URL) to purchase app"
msgstr "Dirección (URL) donde adquirir la aplicación"
-#: ../../Zotlabs/Module/Appman.php:134 ../../Zotlabs/Module/Import.php:507
-#: ../../Zotlabs/Module/Connect.php:98
-#: ../../Zotlabs/Module/Admin/Features.php:66
-#: ../../Zotlabs/Module/Admin/Logs.php:84
-#: ../../Zotlabs/Module/Admin/Profs.php:157
-#: ../../Zotlabs/Module/Admin/Security.php:104
-#: ../../Zotlabs/Module/Admin/Account_edit.php:74
-#: ../../Zotlabs/Module/Admin/Accounts.php:166
-#: ../../Zotlabs/Module/Admin/Channels.php:147
-#: ../../Zotlabs/Module/Admin/Site.php:268
-#: ../../Zotlabs/Module/Admin/Plugins.php:438
-#: ../../Zotlabs/Module/Admin/Themes.php:158 ../../Zotlabs/Module/Locs.php:121
-#: ../../Zotlabs/Module/Connedit.php:893 ../../Zotlabs/Module/Events.php:493
-#: ../../Zotlabs/Module/Filestorage.php:165
-#: ../../Zotlabs/Module/Photos.php:667 ../../Zotlabs/Module/Photos.php:1053
-#: ../../Zotlabs/Module/Photos.php:1093 ../../Zotlabs/Module/Photos.php:1211
-#: ../../Zotlabs/Module/Group.php:85 ../../Zotlabs/Module/Mail.php:413
-#: ../../Zotlabs/Module/Import_items.php:122
-#: ../../Zotlabs/Module/Mitem.php:243 ../../Zotlabs/Module/Cal.php:342
-#: ../../Zotlabs/Module/Invite.php:149 ../../Zotlabs/Module/Poke.php:186
-#: ../../Zotlabs/Module/Pconfig.php:107 ../../Zotlabs/Module/Rate.php:166
-#: ../../Zotlabs/Module/Mood.php:139 ../../Zotlabs/Module/Pdledit.php:74
-#: ../../Zotlabs/Module/Sources.php:114 ../../Zotlabs/Module/Sources.php:149
-#: ../../Zotlabs/Module/Profiles.php:726
-#: ../../Zotlabs/Module/Settings/Features.php:47
-#: ../../Zotlabs/Module/Settings/Oauth.php:87
-#: ../../Zotlabs/Module/Settings/Account.php:118
-#: ../../Zotlabs/Module/Settings/Channel.php:476
-#: ../../Zotlabs/Module/Settings/Featured.php:50
-#: ../../Zotlabs/Module/Settings/Permcats.php:112
-#: ../../Zotlabs/Module/Settings/Tokens.php:168
-#: ../../Zotlabs/Module/Settings/Display.php:203
-#: ../../Zotlabs/Module/Thing.php:320 ../../Zotlabs/Module/Thing.php:370
-#: ../../Zotlabs/Module/Setup.php:309 ../../Zotlabs/Module/Setup.php:357
-#: ../../Zotlabs/Module/Wiki.php:168 ../../Zotlabs/Module/Chat.php:194
-#: ../../Zotlabs/Module/Chat.php:239 ../../Zotlabs/Module/Xchan.php:15
-#: ../../Zotlabs/Lib/ThreadItem.php:731
-#: ../../extend/addon/addon/chords/Mod_Chords.php:60
-#: ../../extend/addon/addon/diaspora/diaspora.php:714
-#: ../../extend/addon/addon/dwpost/dwpost.php:89
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:124
-#: ../../extend/addon/addon/friendica/friendica.php:128
-#: ../../extend/addon/addon/frphotos/frphotos.php:96
-#: ../../extend/addon/addon/hubwall/hubwall.php:95
-#: ../../extend/addon/addon/ijpost/ijpost.php:89
-#: ../../extend/addon/addon/irc/irc.php:53
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:371
-#: ../../extend/addon/addon/libertree/libertree.php:85
-#: ../../extend/addon/addon/ljpost/ljpost.php:86
-#: ../../extend/addon/addon/logrot/logrot.php:35
-#: ../../extend/addon/addon/mailhost/mailhost.php:40
-#: ../../extend/addon/addon/nofed/nofed.php:80
-#: ../../extend/addon/addon/nsabait/nsabait.php:161
-#: ../../extend/addon/addon/nsfw/nsfw.php:92
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:53
-#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:168
-#: ../../extend/addon/addon/pageheader/pageheader.php:48
-#: ../../extend/addon/addon/piwik/piwik.php:95
-#: ../../extend/addon/addon/planets/planets.php:157
-#: ../../extend/addon/addon/pumpio/pumpio.php:237
-#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:85
-#: ../../extend/addon/addon/redfiles/redfiles.php:124
-#: ../../extend/addon/addon/redphotos/redphotos.php:136
-#: ../../extend/addon/addon/redred/redred.php:119
-#: ../../extend/addon/addon/rtof/rtof.php:101
-#: ../../extend/addon/addon/skeleton/skeleton.php:65
-#: ../../extend/addon/addon/smileybutton/smileybutton.php:281
-#: ../../extend/addon/addon/startpage/startpage.php:113
-#: ../../extend/addon/addon/statusnet/statusnet.php:322
-#: ../../extend/addon/addon/statusnet/statusnet.php:380
-#: ../../extend/addon/addon/statusnet/statusnet.php:432
-#: ../../extend/addon/addon/statusnet/statusnet.php:899
-#: ../../extend/addon/addon/superblock/superblock.php:120
-#: ../../extend/addon/addon/twitter/twitter.php:217
-#: ../../extend/addon/addon/twitter/twitter.php:259
-#: ../../extend/addon/addon/visage/visage.php:170
-#: ../../extend/addon/addon/wppost/wppost.php:113
-#: ../../extend/addon/addon/xmpp/xmpp.php:69
-#: ../../extend/addon/addon/cdav/cdav.php:246
-#: ../../extend/addon/addon/likebanner/likebanner.php:57
-#: ../../extend/addon/addon/mailtest/mailtest.php:100
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:153
-#: ../../extend/addon/addon/gnusoc/gnusoc.php:133
-#: ../../include/widgets.php:801 ../../include/js_strings.php:22
-#: ../../view/theme/redbasic/php/config.php:106
-msgid "Submit"
-msgstr "Enviar"
-
-#: ../../Zotlabs/Module/Register.php:49
-msgid "Maximum daily site registrations exceeded. Please try again tomorrow."
-msgstr "Se ha superado el límite máximo de inscripciones diarias de este sitio. Por favor, pruebe de nuevo mañana."
-
-#: ../../Zotlabs/Module/Register.php:55
-msgid ""
-"Please indicate acceptance of the Terms of Service. Registration failed."
-msgstr "Por favor, confirme que acepta los Términos del servicio. El registro ha fallado."
-
-#: ../../Zotlabs/Module/Register.php:89
-msgid "Passwords do not match."
-msgstr "Las contraseñas no coinciden."
+#: ../../Zotlabs/Module/Regmod.php:15
+msgid "Please login."
+msgstr "Por favor, inicie sesión."
-#: ../../Zotlabs/Module/Register.php:131
-msgid ""
-"Registration successful. Please check your email for validation "
-"instructions."
-msgstr "Registro realizado con éxito. Por favor, compruebe su correo electrónico para ver las instrucciones para validarlo."
+#: ../../Zotlabs/Module/Magic.php:71
+msgid "Hub not found."
+msgstr "Servidor no encontrado"
-#: ../../Zotlabs/Module/Register.php:137
-msgid "Your registration is pending approval by the site owner."
-msgstr "Su registro está pendiente de aprobación por el propietario del sitio."
+#: ../../Zotlabs/Module/Subthread.php:87 ../../Zotlabs/Module/Tagger.php:47
+#: ../../Zotlabs/Module/Like.php:370
+#: ../../addon/redphotos/redphotohelper.php:71
+#: ../../addon/diaspora/inbound.php:1783 ../../include/conversation.php:116
+#: ../../include/text.php:1937
+msgid "photo"
+msgstr "foto"
-#: ../../Zotlabs/Module/Register.php:140
-msgid "Your registration can not be processed."
-msgstr "Su registro no puede ser procesado."
+#: ../../Zotlabs/Module/Subthread.php:87 ../../Zotlabs/Module/Like.php:370
+#: ../../addon/diaspora/inbound.php:1783 ../../include/conversation.php:144
+#: ../../include/text.php:1943
+msgid "status"
+msgstr "el mensaje de estado"
-#: ../../Zotlabs/Module/Register.php:184
-msgid "Registration on this hub is disabled."
-msgstr "El registro está deshabilitado en este sitio."
+#: ../../Zotlabs/Module/Subthread.php:118
+#, php-format
+msgid "%1$s is following %2$s's %3$s"
+msgstr "%1$s está siguiendo %3$s de %2$s"
-#: ../../Zotlabs/Module/Register.php:193
-msgid "Registration on this hub is by approval only."
-msgstr "El registro en este hub está sometido a aprobación previa."
+#: ../../Zotlabs/Module/Subthread.php:120
+#, php-format
+msgid "%1$s stopped following %2$s's %3$s"
+msgstr "%1$s ha dejado de seguir %3$s de %2$s"
-#: ../../Zotlabs/Module/Register.php:194
-msgid "<a href=\"pubsites\">Register at another affiliated hub.</a>"
-msgstr "<a href=\"pubsites\">Registrarse en otro hub afiliado.</a>"
+#: ../../Zotlabs/Module/Import_items.php:48 ../../Zotlabs/Module/Import.php:64
+msgid "Nothing to import."
+msgstr "No hay nada para importar."
-#: ../../Zotlabs/Module/Register.php:204
-msgid ""
-"This site has exceeded the number of allowed daily account registrations. "
-"Please try again tomorrow."
-msgstr "Este sitio ha excedido el límite de inscripción diaria de cuentas. Por favor, inténtelo de nuevo mañana."
+#: ../../Zotlabs/Module/Import_items.php:72 ../../Zotlabs/Module/Import.php:79
+#: ../../Zotlabs/Module/Import.php:95
+msgid "Unable to download data from old server"
+msgstr "No se han podido descargar datos de su antiguo servidor"
-#: ../../Zotlabs/Module/Register.php:221 ../../Zotlabs/Module/Siteinfo.php:27
-msgid "Terms of Service"
-msgstr "Términos del servicio"
+#: ../../Zotlabs/Module/Import_items.php:77
+#: ../../Zotlabs/Module/Import.php:102
+msgid "Imported file is empty."
+msgstr "El fichero importado está vacío."
-#: ../../Zotlabs/Module/Register.php:227
+#: ../../Zotlabs/Module/Import_items.php:93
+#: ../../Zotlabs/Module/Import.php:121
#, php-format
-msgid "I accept the %s for this website"
-msgstr "Acepto los %s de este sitio"
+msgid "Warning: Database versions differ by %1$d updates."
+msgstr "Atención: Las versiones de la base de datos difieren en %1$d actualizaciones."
-#: ../../Zotlabs/Module/Register.php:229
-#, php-format
-msgid "I am over 13 years of age and accept the %s for this website"
-msgstr "Tengo más de 13 años de edad y acepto los %s de este sitio"
+#: ../../Zotlabs/Module/Import_items.php:108
+msgid "Import completed"
+msgstr "Importación completada"
-#: ../../Zotlabs/Module/Register.php:233
-msgid "Your email address"
-msgstr "Su dirección de correo electrónico"
+#: ../../Zotlabs/Module/Import_items.php:125
+msgid "Import Items"
+msgstr "Importar elementos"
-#: ../../Zotlabs/Module/Register.php:234
-msgid "Choose a password"
-msgstr "Elija una contraseña"
+#: ../../Zotlabs/Module/Import_items.php:126
+msgid ""
+"Use this form to import existing posts and content from an export file."
+msgstr "Utilice este formulario para importar entradas existentes y contenido desde un archivo de exportación."
-#: ../../Zotlabs/Module/Register.php:235
-msgid "Please re-enter your password"
-msgstr "Por favor, vuelva a escribir su contraseña"
+#: ../../Zotlabs/Module/Import_items.php:127
+#: ../../Zotlabs/Module/Import.php:501
+msgid "File to Upload"
+msgstr "Fichero para subir"
-#: ../../Zotlabs/Module/Register.php:236
-msgid "Please enter your invitation code"
-msgstr "Por favor, introduzca el código de su invitación"
+#: ../../Zotlabs/Module/New_channel.php:121
+#: ../../Zotlabs/Module/Manage.php:136
+#, php-format
+msgid "You have created %1$.0f of %2$.0f allowed channels."
+msgstr "Ha creado %1$.0f de %2$.0f canales permitidos."
-#: ../../Zotlabs/Module/Register.php:237
#: ../../Zotlabs/Module/New_channel.php:134
+#: ../../Zotlabs/Module/Register.php:237
msgid "Name or caption"
msgstr "Nombre o descripción"
-#: ../../Zotlabs/Module/Register.php:237
#: ../../Zotlabs/Module/New_channel.php:134
+#: ../../Zotlabs/Module/Register.php:237
msgid "Examples: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \"Aviation Group\""
msgstr "Ejemplos: \"Juan García\", \"Luisa y sus caballos\", \"Fútbol\", \"Grupo de aviación\""
-#: ../../Zotlabs/Module/Register.php:239
#: ../../Zotlabs/Module/New_channel.php:136
+#: ../../Zotlabs/Module/Register.php:239
msgid "Choose a short nickname"
msgstr "Elija un alias corto"
-#: ../../Zotlabs/Module/Register.php:239
#: ../../Zotlabs/Module/New_channel.php:136
+#: ../../Zotlabs/Module/Register.php:239
#, php-format
msgid ""
"Your nickname will be used to create an easy to remember channel address "
"e.g. nickname%s"
msgstr "Su alias se usará para crear una dirección de canal fácil de recordar, p. ej.: alias%s"
-#: ../../Zotlabs/Module/Register.php:240
#: ../../Zotlabs/Module/New_channel.php:137
+#: ../../Zotlabs/Module/Register.php:240
msgid "Channel role and privacy"
msgstr "Clase de canal y privacidad"
-#: ../../Zotlabs/Module/Register.php:240
#: ../../Zotlabs/Module/New_channel.php:137
+#: ../../Zotlabs/Module/Register.php:240
msgid "Select a channel role with your privacy requirements."
msgstr "Seleccione un tipo de canal con sus requisitos de privacidad"
-#: ../../Zotlabs/Module/Register.php:240
#: ../../Zotlabs/Module/New_channel.php:137
+#: ../../Zotlabs/Module/Register.php:240
msgid "Read more about roles"
msgstr "Leer más sobre los roles"
-#: ../../Zotlabs/Module/Register.php:241
-msgid "no"
-msgstr "no"
-
-#: ../../Zotlabs/Module/Register.php:241
-msgid "yes"
-msgstr "sí"
-
-#: ../../Zotlabs/Module/Register.php:253
-#: ../../Zotlabs/Module/Admin/Site.php:269
-msgid "Registration"
-msgstr "Registro"
-
-#: ../../Zotlabs/Module/Register.php:258
-msgid "Membership on this site is by invitation only."
-msgstr "Para registrarse en este sitio es necesaria una invitación."
-
-#: ../../Zotlabs/Module/Register.php:270 ../../include/nav.php:162
-#: ../../boot.php:1730
-msgid "Register"
-msgstr "Registrarse"
+#: ../../Zotlabs/Module/New_channel.php:140
+msgid "Create Channel"
+msgstr "Crear un canal"
-#: ../../Zotlabs/Module/Register.php:271
+#: ../../Zotlabs/Module/New_channel.php:141
msgid ""
-"This site may require email verification after submitting this form. If you "
-"are returned to a login page, please check your email for instructions."
-msgstr "Este sitio puede requerir una verificación de correo electrónico después de enviar este formulario. Si es devuelto a una página de inicio de sesión, compruebe su email para recibir y leer las instrucciones."
-
-#: ../../Zotlabs/Module/Probe.php:28 ../../Zotlabs/Module/Probe.php:32
-#, php-format
-msgid "Fetching URL returns error: %1$s"
-msgstr "Al intentar obtener la dirección, retorna el error: %1$s"
+"A channel is your identity on this network. It can represent a person, a "
+"blog, or a forum to name a few. Channels can make connections with other "
+"channels to share information with highly detailed permissions."
+msgstr "Un canal es su identidad en esta red. Puede representar a una persona, un blog o un foro, por nombrar unos pocos ejemplos. Los canales se pueden conectar con otros canales para compartir información con una gama de permisos extremadamente detallada."
-#: ../../Zotlabs/Module/Rmagic.php:35
-msgid "Authentication failed."
-msgstr "Falló la autenticación."
+#: ../../Zotlabs/Module/New_channel.php:142
+msgid ""
+"or <a href=\"import\">import an existing channel</a> from another location."
+msgstr "O <a href=\"import\">importar un canal existente</a> desde otro lugar."
-#: ../../Zotlabs/Module/Rmagic.php:75 ../../include/channel.php:1989
-msgid "Remote Authentication"
-msgstr "Acceso desde su servidor"
+#: ../../Zotlabs/Module/Removeme.php:35
+msgid ""
+"Channel removals are not allowed within 48 hours of changing the account "
+"password."
+msgstr "La eliminación de canales no está permitida hasta pasadas 48 horas desde el último cambio de contraseña."
-#: ../../Zotlabs/Module/Rmagic.php:76 ../../include/channel.php:1990
-msgid "Enter your channel address (e.g. channel@example.com)"
-msgstr "Introduzca la dirección del canal (p.ej. canal@ejemplo.com)"
+#: ../../Zotlabs/Module/Removeme.php:60
+msgid "Remove This Channel"
+msgstr "Eliminar este canal"
-#: ../../Zotlabs/Module/Rmagic.php:77 ../../include/channel.php:1991
-msgid "Authenticate"
-msgstr "Acceder"
+#: ../../Zotlabs/Module/Removeme.php:61
+#: ../../Zotlabs/Module/Removeaccount.php:58
+msgid "WARNING: "
+msgstr "ATENCIÓN:"
-#: ../../Zotlabs/Module/Import.php:57 ../../Zotlabs/Module/Import_items.php:42
-msgid "Nothing to import."
-msgstr "No hay nada para importar."
+#: ../../Zotlabs/Module/Removeme.php:61
+msgid "This channel will be completely removed from the network. "
+msgstr "Este canal va a ser completamente eliminado de la red. "
-#: ../../Zotlabs/Module/Import.php:69 ../../Zotlabs/Module/Import.php:84
-#: ../../Zotlabs/Module/Import_items.php:66
-msgid "Unable to download data from old server"
-msgstr "No se han podido descargar datos de su antiguo servidor"
+#: ../../Zotlabs/Module/Removeme.php:61
+#: ../../Zotlabs/Module/Removeaccount.php:58
+msgid "This action is permanent and can not be undone!"
+msgstr "¡Esta acción tiene carácter definitivo y no se puede deshacer!"
-#: ../../Zotlabs/Module/Import.php:91 ../../Zotlabs/Module/Import_items.php:72
-msgid "Imported file is empty."
-msgstr "El fichero importado está vacío."
+#: ../../Zotlabs/Module/Removeme.php:62
+#: ../../Zotlabs/Module/Removeaccount.php:59
+msgid "Please enter your password for verification:"
+msgstr "Por favor, introduzca su contraseña para su verificación:"
-#: ../../Zotlabs/Module/Import.php:111
-#: ../../Zotlabs/Module/Import_items.php:88
-#, php-format
-msgid "Warning: Database versions differ by %1$d updates."
-msgstr "Atención: Las versiones de la base de datos difieren en %1$d actualizaciones."
+#: ../../Zotlabs/Module/Removeme.php:63
+msgid "Remove this channel and all its clones from the network"
+msgstr "Eliminar este canal y todos sus clones de la red"
-#: ../../Zotlabs/Module/Import.php:134
-#, php-format
-msgid "Your service plan only allows %d channels."
-msgstr "Su paquete de servicios solo permite %d canales."
+#: ../../Zotlabs/Module/Removeme.php:63
+msgid ""
+"By default only the instance of the channel located on this hub will be "
+"removed from the network"
+msgstr "Por defecto, solo la instancia del canal alojado en este servidor será eliminado de la red"
-#: ../../Zotlabs/Module/Import.php:149
-msgid "No channel. Import failed."
-msgstr "No hay canal. La importación ha fallado"
+#: ../../Zotlabs/Module/Removeme.php:64
+#: ../../Zotlabs/Module/Settings/Channel.php:575
+msgid "Remove Channel"
+msgstr "Eliminar el canal"
-#: ../../Zotlabs/Module/Import.php:467
-#: ../../extend/addon/addon/diaspora/import_diaspora.php:142
-msgid "Import completed."
-msgstr "Importación completada."
+#: ../../Zotlabs/Module/Sharedwithme.php:99
+msgid "Files: shared with me"
+msgstr "Ficheros: compartidos conmigo"
-#: ../../Zotlabs/Module/Import.php:488
-msgid "You must be logged in to use this feature."
-msgstr "Debe estar registrado para poder usar esta funcionalidad."
+#: ../../Zotlabs/Module/Sharedwithme.php:100
+#: ../../Zotlabs/Module/Admin/Channels.php:159
+#: ../../Zotlabs/Module/Settings/Oauth.php:89
+#: ../../Zotlabs/Module/Settings/Oauth.php:115
+#: ../../Zotlabs/Module/Wiki.php:172 ../../Zotlabs/Module/Connedit.php:902
+#: ../../Zotlabs/Module/Chat.php:249 ../../Zotlabs/Lib/NativeWikiPage.php:539
+#: ../../Zotlabs/Storage/Browser.php:233
+#: ../../Zotlabs/Widget/Wiki_page_history.php:22
+#: ../../addon/rendezvous/rendezvous.php:172
+#: ../../addon/cdav/Mod_Cdav.php:1136 ../../addon/gitwiki/Mod_Gitwiki.php:158
+msgid "Name"
+msgstr "Nombre"
-#: ../../Zotlabs/Module/Import.php:493
-msgid "Import Channel"
-msgstr "Importar canal"
+#: ../../Zotlabs/Module/Sharedwithme.php:101
+msgid "NEW"
+msgstr "NUEVO"
-#: ../../Zotlabs/Module/Import.php:494
-msgid ""
-"Use this form to import an existing channel from a different server/hub. You"
-" may retrieve the channel identity from the old server/hub via the network "
-"or provide an export file."
-msgstr "Emplee este formulario para importar un canal desde un servidor/hub diferente. Puede recuperar el canal desde el antiguo servidor/hub a través de la red o proporcionando un fichero de exportación."
+#: ../../Zotlabs/Module/Sharedwithme.php:102
+#: ../../Zotlabs/Storage/Browser.php:235 ../../include/text.php:1409
+msgid "Size"
+msgstr "Tamaño"
-#: ../../Zotlabs/Module/Import.php:495
-#: ../../Zotlabs/Module/Import_items.php:121
-msgid "File to Upload"
-msgstr "Fichero para subir"
+#: ../../Zotlabs/Module/Sharedwithme.php:103
+#: ../../Zotlabs/Storage/Browser.php:236
+msgid "Last Modified"
+msgstr "Última modificación"
-#: ../../Zotlabs/Module/Import.php:496
-msgid "Or provide the old server/hub details"
-msgstr "O proporcione los detalles de su antiguo servidor/hub"
+#: ../../Zotlabs/Module/Sharedwithme.php:104
+msgid "Remove all files"
+msgstr "Eliminar todos los ficheros"
-#: ../../Zotlabs/Module/Import.php:497
-msgid "Your old identity address (xyz@example.com)"
-msgstr "Su identidad en el antiguo servidor (canal@ejemplo.com)"
+#: ../../Zotlabs/Module/Sharedwithme.php:105
+msgid "Remove this file"
+msgstr "Eliminar este fichero"
-#: ../../Zotlabs/Module/Import.php:498
-msgid "Your old login email address"
-msgstr "Su antigua dirección de correo electrónico"
+#: ../../Zotlabs/Module/Setup.php:176
+msgid "$Projectname Server - Setup"
+msgstr "Servidor $Projectname - Instalación"
-#: ../../Zotlabs/Module/Import.php:499
-msgid "Your old login password"
-msgstr "Su antigua contraseña"
+#: ../../Zotlabs/Module/Setup.php:180
+msgid "Could not connect to database."
+msgstr "No se ha podido conectar a la base de datos."
-#: ../../Zotlabs/Module/Import.php:500
+#: ../../Zotlabs/Module/Setup.php:184
msgid ""
-"For either option, please choose whether to make this hub your new primary "
-"address, or whether your old location should continue this role. You will be"
-" able to post from either location, but only one can be marked as the "
-"primary location for files, photos, and media."
-msgstr "Para cualquiera de las opciones, elija si hacer de este servidor su nueva dirección primaria, o si su antigua dirección debe continuar con este papel. Usted podrá publicar desde cualquier ubicación, pero sólo una puede estar marcada como la ubicación principal para los ficheros, fotos y otras imágenes o vídeos."
-
-#: ../../Zotlabs/Module/Import.php:501
-msgid "Make this hub my primary location"
-msgstr "Convertir este servidor en mi ubicación primaria"
+"Could not connect to specified site URL. Possible SSL certificate or DNS "
+"issue."
+msgstr "No se puede conectar con la dirección del sitio indicada. Podría tratarse de un problema de SSL o DNS."
-#: ../../Zotlabs/Module/Import.php:502
-msgid "Move this channel (disable all previous locations)"
-msgstr "Mover este canal (desactivar todas las ubicaciones anteriores)"
+#: ../../Zotlabs/Module/Setup.php:191
+msgid "Could not create table."
+msgstr "No se puede crear la tabla."
-#: ../../Zotlabs/Module/Import.php:503
-msgid "Import a few months of posts if possible (limited by available memory"
-msgstr "Importar unos meses de mensajes si es posible (limitado por la memoria disponible"
+#: ../../Zotlabs/Module/Setup.php:196
+msgid "Your site database has been installed."
+msgstr "La base de datos del sitio ha sido instalada."
-#: ../../Zotlabs/Module/Import.php:504
+#: ../../Zotlabs/Module/Setup.php:200
msgid ""
-"This process may take several minutes to complete. Please submit the form "
-"only once and leave this page open until finished."
-msgstr "Este proceso puede tardar varios minutos en completarse. Por favor envíe el formulario una sola vez y mantenga esta página abierta hasta que termine."
-
-#: ../../Zotlabs/Module/Chatsvc.php:131
-msgid "Away"
-msgstr "Ausente"
-
-#: ../../Zotlabs/Module/Chatsvc.php:136
-msgid "Online"
-msgstr "Conectado/a"
-
-#: ../../Zotlabs/Module/Help.php:23
-msgid "Documentation Search"
-msgstr "Búsqueda de Documentación"
-
-#: ../../Zotlabs/Module/Help.php:80 ../../include/conversation.php:1827
-msgid "About"
-msgstr "Mi perfil"
-
-#: ../../Zotlabs/Module/Help.php:81 ../../Zotlabs/Module/Group.php:197
-msgid "Members"
-msgstr "Miembros"
-
-#: ../../Zotlabs/Module/Help.php:82
-msgid "Administrators"
-msgstr "Administradores"
-
-#: ../../Zotlabs/Module/Help.php:83
-msgid "Developers"
-msgstr "Desarrolladores"
-
-#: ../../Zotlabs/Module/Help.php:84
-msgid "Tutorials"
-msgstr "Tutoriales"
-
-#: ../../Zotlabs/Module/Help.php:93
-msgid "$Projectname Documentation"
-msgstr "Documentación de $Projectname"
-
-#: ../../Zotlabs/Module/Help.php:94
-msgid "Contents"
-msgstr "Contenidos"
-
-#: ../../Zotlabs/Module/Bookmarks.php:53
-msgid "Bookmark added"
-msgstr "Marcador añadido"
-
-#: ../../Zotlabs/Module/Bookmarks.php:75
-msgid "My Bookmarks"
-msgstr "Mis marcadores"
+"You may need to import the file \"install/schema_xxx.sql\" manually using a "
+"database client."
+msgstr "Podría tener que importar manualmente el fichero \"install/schema_xxx.sql\" usando un cliente de base de datos."
-#: ../../Zotlabs/Module/Bookmarks.php:86
-msgid "My Connections Bookmarks"
-msgstr "Marcadores de mis conexiones"
+#: ../../Zotlabs/Module/Setup.php:201 ../../Zotlabs/Module/Setup.php:263
+#: ../../Zotlabs/Module/Setup.php:748
+msgid "Please see the file \"install/INSTALL.txt\"."
+msgstr "Por favor, lea el fichero \"install/INSTALL.txt\"."
-#: ../../Zotlabs/Module/Connect.php:61 ../../Zotlabs/Module/Connect.php:109
-msgid "Continue"
-msgstr "Continuar"
+#: ../../Zotlabs/Module/Setup.php:260
+msgid "System check"
+msgstr "Verificación del sistema"
-#: ../../Zotlabs/Module/Connect.php:90
-msgid "Premium Channel Setup"
-msgstr "Configuración del canal premium"
+#: ../../Zotlabs/Module/Setup.php:265
+msgid "Check again"
+msgstr "Verificar de nuevo"
-#: ../../Zotlabs/Module/Connect.php:92
-msgid "Enable premium channel connection restrictions"
-msgstr "Habilitar restricciones de conexión del canal premium"
+#: ../../Zotlabs/Module/Setup.php:287
+msgid "Database connection"
+msgstr "Conexión a la base de datos"
-#: ../../Zotlabs/Module/Connect.php:93
+#: ../../Zotlabs/Module/Setup.php:288
msgid ""
-"Please enter your restrictions or conditions, such as paypal receipt, usage "
-"guidelines, etc."
-msgstr "Por favor introduzca sus restricciones o condiciones, como recibo de paypal, normas de uso, etc."
+"In order to install $Projectname we need to know how to connect to your "
+"database."
+msgstr "Para instalar $Projectname es necesario saber cómo conectar con su base de datos."
-#: ../../Zotlabs/Module/Connect.php:95 ../../Zotlabs/Module/Connect.php:115
+#: ../../Zotlabs/Module/Setup.php:289
msgid ""
-"This channel may require additional steps or acknowledgement of the "
-"following conditions prior to connecting:"
-msgstr "Este canal puede requerir antes de conectar unos pasos adicionales o el conocimiento de las siguientes condiciones:"
+"Please contact your hosting provider or site administrator if you have "
+"questions about these settings."
+msgstr "Por favor, contacte con el proveedor de servicios o el administrador del sitio si tiene dudas sobre estos ajustes."
-#: ../../Zotlabs/Module/Connect.php:96
+#: ../../Zotlabs/Module/Setup.php:290
msgid ""
-"Potential connections will then see the following text before proceeding:"
-msgstr "Las posibles conexiones verán, por tanto, el siguiente texto antes de proceder:"
+"The database you specify below should already exist. If it does not, please "
+"create it before continuing."
+msgstr "La base de datos que especifique a continuación debe existir ya. Si no es así, por favor, créela antes de seguir."
-#: ../../Zotlabs/Module/Connect.php:97 ../../Zotlabs/Module/Connect.php:118
-msgid ""
-"By continuing, I certify that I have complied with any instructions provided"
-" on this page."
-msgstr "Al continuar, certifico que he cumplido con todas las instrucciones proporcionadas en esta página."
+#: ../../Zotlabs/Module/Setup.php:294
+msgid "Database Server Name"
+msgstr "Nombre del servidor de base de datos"
-#: ../../Zotlabs/Module/Connect.php:106
-msgid "(No specific instructions have been provided by the channel owner.)"
-msgstr "(No ha sido proporcionada ninguna instrucción específica por el propietario del canal.)"
+#: ../../Zotlabs/Module/Setup.php:294
+msgid "Default is 127.0.0.1"
+msgstr "De forma predeterminada es 127.0.0.1"
-#: ../../Zotlabs/Module/Connect.php:114
-msgid "Restricted or Premium Channel"
-msgstr "Canal premium o restringido"
+#: ../../Zotlabs/Module/Setup.php:295
+msgid "Database Port"
+msgstr "Puerto de la base de datos"
-#: ../../Zotlabs/Module/Admin.php:60
-#: ../../Zotlabs/Module/Admin/Plugins.php:259
-#: ../../Zotlabs/Module/Admin/Themes.php:72
-#: ../../Zotlabs/Module/Filestorage.php:32 ../../Zotlabs/Module/Display.php:35
-#: ../../Zotlabs/Module/Viewsrc.php:24 ../../Zotlabs/Module/Thing.php:89
-#: ../../include/items.php:3368
-msgid "Item not found."
-msgstr "Elemento no encontrado."
+#: ../../Zotlabs/Module/Setup.php:295
+msgid "Communication port number - use 0 for default"
+msgstr "Número del puerto de comunicaciones - use 0 como valor por defecto"
-#: ../../Zotlabs/Module/Admin.php:94
-msgid "# Accounts"
-msgstr "# Cuentas"
+#: ../../Zotlabs/Module/Setup.php:296
+msgid "Database Login Name"
+msgstr "Usuario de la base de datos"
-#: ../../Zotlabs/Module/Admin.php:95
-msgid "# blocked accounts"
-msgstr "# cuentas bloqueadas"
+#: ../../Zotlabs/Module/Setup.php:297
+msgid "Database Login Password"
+msgstr "Contraseña de acceso a la base de datos"
-#: ../../Zotlabs/Module/Admin.php:96
-msgid "# expired accounts"
-msgstr "# cuentas caducadas"
+#: ../../Zotlabs/Module/Setup.php:298
+msgid "Database Name"
+msgstr "Nombre de la base de datos"
-#: ../../Zotlabs/Module/Admin.php:97
-msgid "# expiring accounts"
-msgstr "# cuentas que caducan"
+#: ../../Zotlabs/Module/Setup.php:299
+msgid "Database Type"
+msgstr "Tipo de base de datos"
-#: ../../Zotlabs/Module/Admin.php:108
-msgid "# Channels"
-msgstr "# Canales"
+#: ../../Zotlabs/Module/Setup.php:301 ../../Zotlabs/Module/Setup.php:347
+msgid "Site administrator email address"
+msgstr "Dirección de correo electrónico del administrador del sitio"
-#: ../../Zotlabs/Module/Admin.php:109
-msgid "# primary"
-msgstr "# primario"
+#: ../../Zotlabs/Module/Setup.php:301 ../../Zotlabs/Module/Setup.php:347
+msgid ""
+"Your account email address must match this in order to use the web admin "
+"panel."
+msgstr "Su cuenta deberá usar la misma dirección de correo electrónico para poder utilizar el panel de administración web."
-#: ../../Zotlabs/Module/Admin.php:110
-msgid "# clones"
-msgstr "# clones"
+#: ../../Zotlabs/Module/Setup.php:302 ../../Zotlabs/Module/Setup.php:349
+msgid "Website URL"
+msgstr "Dirección del sitio web"
-#: ../../Zotlabs/Module/Admin.php:116
-msgid "Message queues"
-msgstr "Mensajes en cola"
+#: ../../Zotlabs/Module/Setup.php:302 ../../Zotlabs/Module/Setup.php:349
+msgid "Please use SSL (https) URL if available."
+msgstr "Por favor, use SSL (https) si está disponible."
-#: ../../Zotlabs/Module/Admin.php:133
-msgid "Your software should be updated"
-msgstr "Debe actualizar su software"
+#: ../../Zotlabs/Module/Setup.php:303 ../../Zotlabs/Module/Setup.php:353
+msgid "Please select a default timezone for your website"
+msgstr "Por favor, selecciones el huso horario por defecto de su sitio web"
-#: ../../Zotlabs/Module/Admin.php:137 ../../Zotlabs/Module/Admin/Logs.php:82
-#: ../../Zotlabs/Module/Admin/Security.php:86
-#: ../../Zotlabs/Module/Admin/Accounts.php:164
-#: ../../Zotlabs/Module/Admin/Channels.php:145
-#: ../../Zotlabs/Module/Admin/Site.php:266
-#: ../../Zotlabs/Module/Admin/Plugins.php:341
-#: ../../Zotlabs/Module/Admin/Plugins.php:436
-#: ../../Zotlabs/Module/Admin/Themes.php:122
-#: ../../Zotlabs/Module/Admin/Themes.php:156
-msgid "Administration"
-msgstr "Administración"
+#: ../../Zotlabs/Module/Setup.php:328 ../../Zotlabs/Module/Admin/Site.php:258
+msgid "Basic/Minimal Social Networking"
+msgstr "Red social básica o mínima"
-#: ../../Zotlabs/Module/Admin.php:138
-msgid "Summary"
-msgstr "Sumario"
+#: ../../Zotlabs/Module/Setup.php:329 ../../Zotlabs/Module/Admin/Site.php:259
+msgid "Standard Configuration (default)"
+msgstr "Configuración estándar (por defecto)"
-#: ../../Zotlabs/Module/Admin.php:141
-msgid "Registered accounts"
-msgstr "Cuentas registradas"
+#: ../../Zotlabs/Module/Setup.php:330 ../../Zotlabs/Module/Admin/Site.php:260
+msgid "Professional"
+msgstr "Profesional"
-#: ../../Zotlabs/Module/Admin.php:142
-msgid "Pending registrations"
-msgstr "Registros pendientes"
+#: ../../Zotlabs/Module/Setup.php:336
+msgid "Site settings"
+msgstr "Ajustes del sitio"
-#: ../../Zotlabs/Module/Admin.php:143
-msgid "Registered channels"
-msgstr "Canales registrados"
+#: ../../Zotlabs/Module/Setup.php:351 ../../Zotlabs/Module/Admin/Site.php:289
+msgid "Server Configuration/Role"
+msgstr "Configuración del servidor"
-#: ../../Zotlabs/Module/Admin.php:144
-msgid "Active plugins"
-msgstr "Extensiones (plugins) activas"
+#: ../../Zotlabs/Module/Setup.php:392
+msgid "PHP version 5.5 or greater is required."
+msgstr "Se requiere la versión 5.5, o superior, de PHP."
-#: ../../Zotlabs/Module/Admin.php:145
-msgid "Version"
-msgstr "Versión"
+#: ../../Zotlabs/Module/Setup.php:393
+msgid "PHP version"
+msgstr "Versión de PHP"
-#: ../../Zotlabs/Module/Admin.php:146
-msgid "Repository version (master)"
-msgstr "Versión del repositorio (master)"
+#: ../../Zotlabs/Module/Setup.php:409
+msgid "Could not find a command line version of PHP in the web server PATH."
+msgstr "No se puede encontrar una versión en línea de comandos de PHP en la ruta del servidor web."
-#: ../../Zotlabs/Module/Admin.php:147
-msgid "Repository version (dev)"
-msgstr "Versión del repositorio (dev)"
+#: ../../Zotlabs/Module/Setup.php:410
+msgid ""
+"If you don't have a command line version of PHP installed on server, you "
+"will not be able to run background polling via cron."
+msgstr "Si no tiene instalada la versión de línea de comandos de PHP en su servidor, no podrá realizar envíos en segundo plano mediante cron."
-#: ../../Zotlabs/Module/Editblock.php:79 ../../Zotlabs/Module/Editblock.php:95
-#: ../../Zotlabs/Module/Editlayout.php:79
-#: ../../Zotlabs/Module/Editwebpage.php:80
-#: ../../Zotlabs/Module/Editpost.php:24
-msgid "Item not found"
-msgstr "Elemento no encontrado"
+#: ../../Zotlabs/Module/Setup.php:414
+msgid "PHP executable path"
+msgstr "Ruta del ejecutable PHP"
-#: ../../Zotlabs/Module/Editblock.php:108 ../../Zotlabs/Module/Blocks.php:97
-#: ../../Zotlabs/Module/Blocks.php:155
-msgid "Block Name"
-msgstr "Nombre del bloque"
+#: ../../Zotlabs/Module/Setup.php:414
+msgid ""
+"Enter full path to php executable. You can leave this blank to continue the "
+"installation."
+msgstr "Introducir la ruta completa del ejecutable PHP. Puede dejar la línea en blanco para continuar la instalación."
-#: ../../Zotlabs/Module/Editblock.php:111
-#: ../../Zotlabs/Module/Editwebpage.php:146 ../../Zotlabs/Module/Mail.php:287
-#: ../../Zotlabs/Module/Mail.php:412 ../../Zotlabs/Module/Chat.php:205
-#: ../../include/conversation.php:1295
-msgid "Insert web link"
-msgstr "Insertar enlace web"
+#: ../../Zotlabs/Module/Setup.php:419
+msgid "Command line PHP"
+msgstr "PHP en línea de comandos"
-#: ../../Zotlabs/Module/Editblock.php:124 ../../include/conversation.php:1406
-msgid "Title (optional)"
-msgstr "Título (opcional)"
+#: ../../Zotlabs/Module/Setup.php:429
+msgid ""
+"Unable to check command line PHP, as shell_exec() is disabled. This is "
+"required."
+msgstr "No se puede comprobar la línea de comandos PHP, ya que shell_exec() está deshabilitado. Es necesario que esté activado."
-#: ../../Zotlabs/Module/Editblock.php:133
-msgid "Edit Block"
-msgstr "Modificar este bloque"
+#: ../../Zotlabs/Module/Setup.php:432
+msgid ""
+"The command line version of PHP on your system does not have "
+"\"register_argc_argv\" enabled."
+msgstr "La línea de comandos PHP de su sistema no tiene activado \"register_argc_argv\"."
-#: ../../Zotlabs/Module/Page.php:40 ../../Zotlabs/Module/Block.php:31
-msgid "Invalid item."
-msgstr "Elemento no válido."
+#: ../../Zotlabs/Module/Setup.php:433
+msgid "This is required for message delivery to work."
+msgstr "Esto es necesario para que funcione la transmisión de mensajes."
-#: ../../Zotlabs/Module/Page.php:56 ../../Zotlabs/Module/Block.php:43
-#: ../../Zotlabs/Module/Cal.php:62 ../../Zotlabs/Module/Chanview.php:96
-#: ../../Zotlabs/Module/Wall_upload.php:31
-msgid "Channel not found."
-msgstr "Canal no encontrado."
+#: ../../Zotlabs/Module/Setup.php:436
+msgid "PHP register_argc_argv"
+msgstr "PHP register_argc_argv"
-#: ../../Zotlabs/Module/Page.php:131
+#: ../../Zotlabs/Module/Setup.php:454
+#, php-format
msgid ""
-"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod "
-"tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,"
-" quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo "
-"consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse "
-"cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat "
-"non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
-msgstr "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
+"Your max allowed total upload size is set to %s. Maximum size of one file to"
+" upload is set to %s. You are allowed to upload up to %d files at once."
+msgstr "La carga máxima que se le permite subir está establecida en %s. El tamaño máximo de un fichero está establecido en %s. Está permitido subir hasta un máximo de %d ficheros de una sola vez."
-#: ../../Zotlabs/Module/Filer.php:52
-msgid "Save to Folder:"
-msgstr "Guardar en carpeta:"
+#: ../../Zotlabs/Module/Setup.php:459
+msgid "You can adjust these settings in the server php.ini file."
+msgstr "Puede ajustar estos valores en el fichero php.ini de su servidor."
-#: ../../Zotlabs/Module/Filer.php:52
-msgid "- select -"
-msgstr "- seleccionar -"
+#: ../../Zotlabs/Module/Setup.php:461
+msgid "PHP upload limits"
+msgstr "Límites PHP de subida"
-#: ../../Zotlabs/Module/Filer.php:53 ../../Zotlabs/Module/Admin/Profs.php:74
-#: ../../Zotlabs/Module/Admin/Profs.php:94 ../../Zotlabs/Module/Rbmark.php:32
-#: ../../Zotlabs/Module/Rbmark.php:104 ../../include/widgets.php:188
-#: ../../include/text.php:1011 ../../include/text.php:1023
-msgid "Save"
-msgstr "Guardar"
+#: ../../Zotlabs/Module/Setup.php:484
+msgid ""
+"Error: the \"openssl_pkey_new\" function on this system is not able to "
+"generate encryption keys"
+msgstr "Error: La función \"openssl_pkey_new\" en este sistema no es capaz de general claves de cifrado."
-#: ../../Zotlabs/Module/Ping.php:254
-msgid "sent you a private message"
-msgstr "le ha enviado un mensaje privado"
+#: ../../Zotlabs/Module/Setup.php:485
+msgid ""
+"If running under Windows, please see "
+"\"http://www.php.net/manual/en/openssl.installation.php\"."
+msgstr "Si está en un servidor Windows, por favor, lea \"http://www.php.net/manual/en/openssl.installation.php\"."
-#: ../../Zotlabs/Module/Ping.php:302
-msgid "added your channel"
-msgstr "añadió este canal a sus conexiones"
+#: ../../Zotlabs/Module/Setup.php:488
+msgid "Generate encryption keys"
+msgstr "Generar claves de cifrado"
-#: ../../Zotlabs/Module/Ping.php:312
-msgid "g A l F d"
-msgstr "g A l d F"
+#: ../../Zotlabs/Module/Setup.php:505
+msgid "libCurl PHP module"
+msgstr "módulo libCurl PHP"
-#: ../../Zotlabs/Module/Ping.php:330
-msgid "[today]"
-msgstr "[hoy]"
+#: ../../Zotlabs/Module/Setup.php:506
+msgid "GD graphics PHP module"
+msgstr "módulo PHP GD graphics"
-#: ../../Zotlabs/Module/Ping.php:339
-msgid "posted an event"
-msgstr "publicó un evento"
+#: ../../Zotlabs/Module/Setup.php:507
+msgid "OpenSSL PHP module"
+msgstr "módulo PHP OpenSSL"
-#: ../../Zotlabs/Module/Connections.php:56
-#: ../../Zotlabs/Module/Connections.php:161
-#: ../../Zotlabs/Module/Connections.php:250
-msgid "Blocked"
-msgstr "Bloqueadas"
+#: ../../Zotlabs/Module/Setup.php:508
+msgid "PDO database PHP module"
+msgstr "Módulo PHP de la base de datos PDO "
-#: ../../Zotlabs/Module/Connections.php:61
-#: ../../Zotlabs/Module/Connections.php:168
-#: ../../Zotlabs/Module/Connections.php:249
-msgid "Ignored"
-msgstr "Ignoradas"
+#: ../../Zotlabs/Module/Setup.php:509
+msgid "mb_string PHP module"
+msgstr "módulo PHP mb_string"
-#: ../../Zotlabs/Module/Connections.php:66
-#: ../../Zotlabs/Module/Connections.php:182
-#: ../../Zotlabs/Module/Connections.php:248
-msgid "Hidden"
-msgstr "Ocultas"
+#: ../../Zotlabs/Module/Setup.php:510
+msgid "xml PHP module"
+msgstr "módulo PHP xml"
-#: ../../Zotlabs/Module/Connections.php:71
-#: ../../Zotlabs/Module/Connections.php:175
-#: ../../Zotlabs/Module/Connections.php:247
-msgid "Archived"
-msgstr "Archivadas"
+#: ../../Zotlabs/Module/Setup.php:514 ../../Zotlabs/Module/Setup.php:516
+msgid "Apache mod_rewrite module"
+msgstr "módulo Apache mod_rewrite "
-#: ../../Zotlabs/Module/Connections.php:76
-#: ../../Zotlabs/Module/Connections.php:86 ../../Zotlabs/Module/Menu.php:116
-#: ../../include/conversation.php:1724
-msgid "New"
-msgstr "Nuevas"
+#: ../../Zotlabs/Module/Setup.php:514
+msgid ""
+"Error: Apache webserver mod-rewrite module is required but not installed."
+msgstr "Error: se necesita el módulo del servidor web Apache mod-rewrite pero no está instalado."
-#: ../../Zotlabs/Module/Connections.php:92
-#: ../../Zotlabs/Module/Connections.php:107
-#: ../../Zotlabs/Module/Connedit.php:720 ../../include/widgets.php:530
-msgid "All"
-msgstr "Todos/as"
+#: ../../Zotlabs/Module/Setup.php:520 ../../Zotlabs/Module/Setup.php:523
+msgid "exec"
+msgstr "ejecutable"
-#: ../../Zotlabs/Module/Connections.php:138
-msgid "New Connections"
-msgstr "Nuevas conexiones"
+#: ../../Zotlabs/Module/Setup.php:520
+msgid ""
+"Error: exec is required but is either not installed or has been disabled in "
+"php.ini"
+msgstr "Error: se necesita un ejecutable pero o no se instaló o está deshabilitado en php.ini"
-#: ../../Zotlabs/Module/Connections.php:141
-msgid "Show pending (new) connections"
-msgstr "Mostrar conexiones (nuevas) pendientes"
+#: ../../Zotlabs/Module/Setup.php:526 ../../Zotlabs/Module/Setup.php:529
+msgid "shell_exec"
+msgstr "shell_exec"
-#: ../../Zotlabs/Module/Connections.php:145
-#: ../../Zotlabs/Module/Profperm.php:140
-msgid "All Connections"
-msgstr "Todas las conexiones"
+#: ../../Zotlabs/Module/Setup.php:526
+msgid ""
+"Error: shell_exec is required but is either not installed or has been "
+"disabled in php.ini"
+msgstr "Error: se necesita shell_exec pero o no se instaló o está deshabilitado en php.ini"
-#: ../../Zotlabs/Module/Connections.php:148
-msgid "Show all connections"
-msgstr "Mostrar todas las conexiones"
+#: ../../Zotlabs/Module/Setup.php:534
+msgid "Error: libCURL PHP module required but not installed."
+msgstr "Error: se necesita el módulo PHP libCURL pero no está instalado."
-#: ../../Zotlabs/Module/Connections.php:164
-msgid "Only show blocked connections"
-msgstr "Mostrar solo las conexiones bloqueadas"
+#: ../../Zotlabs/Module/Setup.php:538
+msgid ""
+"Error: GD graphics PHP module with JPEG support required but not installed."
+msgstr "Error: el módulo PHP GD graphics es necesario, pero no está instalado."
-#: ../../Zotlabs/Module/Connections.php:171
-msgid "Only show ignored connections"
-msgstr "Mostrar solo conexiones ignoradas"
+#: ../../Zotlabs/Module/Setup.php:542
+msgid "Error: openssl PHP module required but not installed."
+msgstr "Error: el módulo PHP openssl es necesario, pero no está instalado."
-#: ../../Zotlabs/Module/Connections.php:178
-msgid "Only show archived connections"
-msgstr "Mostrar solo las conexiones archivadas"
+#: ../../Zotlabs/Module/Setup.php:546
+msgid "Error: PDO database PHP module required but not installed."
+msgstr "Error: se necesita el módulo PHP de la base de datos PDO, pero no está instalado."
-#: ../../Zotlabs/Module/Connections.php:185
-msgid "Only show hidden connections"
-msgstr "Mostrar solo las conexiones ocultas"
+#: ../../Zotlabs/Module/Setup.php:550
+msgid "Error: mb_string PHP module required but not installed."
+msgstr "Error: el módulo PHP mb_string es necesario, pero no está instalado."
-#: ../../Zotlabs/Module/Connections.php:246
-msgid "Pending approval"
-msgstr "Pendiente de aprobación"
+#: ../../Zotlabs/Module/Setup.php:554
+msgid "Error: xml PHP module required for DAV but not installed."
+msgstr "Error: el módulo PHP xml es necesario para DAV, pero no está instalado."
-#: ../../Zotlabs/Module/Connections.php:262
-#, php-format
-msgid "%1$s [%2$s]"
-msgstr "%1$s [%2$s]"
+#: ../../Zotlabs/Module/Setup.php:572
+msgid ""
+"The web installer needs to be able to create a file called \".htconfig.php\""
+" in the top folder of your web server and it is unable to do so."
+msgstr "El instalador web no ha podido crear un fichero llamado “.htconfig.php†en la carpeta base de su servidor."
-#: ../../Zotlabs/Module/Connections.php:263
-msgid "Edit connection"
-msgstr "Editar conexión"
+#: ../../Zotlabs/Module/Setup.php:573
+msgid ""
+"This is most often a permission setting, as the web server may not be able "
+"to write files in your folder - even if you can."
+msgstr "Esto está generalmente ligado a un problema de permisos, a causa del cual el servidor web tiene prohibido modificar ficheros en su carpeta - incluso si usted mismo tiene esos permisos."
-#: ../../Zotlabs/Module/Connections.php:264
-msgid "Delete connection"
-msgstr "Eliminar conexión"
+#: ../../Zotlabs/Module/Setup.php:574
+msgid ""
+"At the end of this procedure, we will give you a text to save in a file "
+"named .htconfig.php in your Red top folder."
+msgstr "Al término de este procedimiento, podemos crear un fichero de texto para guardar con el nombre .htconfig.php en el directorio raíz de su instalación de Hubzilla."
-#: ../../Zotlabs/Module/Connections.php:273
-msgid "Channel address"
-msgstr "Dirección del canal"
+#: ../../Zotlabs/Module/Setup.php:575
+msgid ""
+"You can alternatively skip this procedure and perform a manual installation."
+" Please see the file \"install/INSTALL.txt\" for instructions."
+msgstr "Como alternativa, puede dejar este procedimiento e intentar realizar una instalación manual. Lea, por favor, el fichero\"install/INSTALL.txt\" para las instrucciones."
-#: ../../Zotlabs/Module/Connections.php:275
-msgid "Network"
-msgstr "Red"
+#: ../../Zotlabs/Module/Setup.php:578
+msgid ".htconfig.php is writable"
+msgstr ".htconfig.php tiene permisos de escritura"
-#: ../../Zotlabs/Module/Connections.php:278
-msgid "Call"
-msgstr "Llamar"
+#: ../../Zotlabs/Module/Setup.php:592
+msgid ""
+"This software uses the Smarty3 template engine to render its web views. "
+"Smarty3 compiles templates to PHP to speed up rendering."
+msgstr "Este software hace uso del motor de plantillas Smarty3 para diseñar sus plantillas gráficas. Smarty3 compila las plantillas a PHP para acelerar la renderización."
-#: ../../Zotlabs/Module/Connections.php:280
-msgid "Status"
-msgstr "Estado"
+#: ../../Zotlabs/Module/Setup.php:593
+#, php-format
+msgid ""
+"In order to store these compiled templates, the web server needs to have "
+"write access to the directory %s under the top level web folder."
+msgstr "Para poder guardar las plantillas compiladas, el servidor web necesita permisos para acceder al directorio %s en la carpeta web principal."
-#: ../../Zotlabs/Module/Connections.php:282
-msgid "Connected"
-msgstr "Conectado/a"
+#: ../../Zotlabs/Module/Setup.php:594 ../../Zotlabs/Module/Setup.php:615
+msgid ""
+"Please ensure that the user that your web server runs as (e.g. www-data) has"
+" write access to this folder."
+msgstr "Por favor, asegúrese de que el servidor web está siendo ejecutado por un usuario que tenga permisos de escritura sobre esta carpeta (por ejemplo, www-data)."
-#: ../../Zotlabs/Module/Connections.php:284
-msgid "Approve connection"
-msgstr "Aprobar esta conexión"
+#: ../../Zotlabs/Module/Setup.php:595
+#, php-format
+msgid ""
+"Note: as a security measure, you should give the web server write access to "
+"%s only--not the template files (.tpl) that it contains."
+msgstr "Nota: como medida de seguridad, debe dar al servidor web permisos de escritura solo sobre %s - no sobre el fichero de plantilla (.tpl) que contiene."
-#: ../../Zotlabs/Module/Connections.php:285
-#: ../../Zotlabs/Module/Admin/Accounts.php:171
-msgid "Approve"
-msgstr "Aprobar"
+#: ../../Zotlabs/Module/Setup.php:598
+#, php-format
+msgid "%s is writable"
+msgstr "%s tiene permisos de escritura"
-#: ../../Zotlabs/Module/Connections.php:286
-msgid "Ignore connection"
-msgstr "Ignorar esta conexión"
+#: ../../Zotlabs/Module/Setup.php:614
+msgid ""
+"This software uses the store directory to save uploaded files. The web "
+"server needs to have write access to the store directory under the top level"
+" web folder"
+msgstr "Este software utiliza el directorio de almacenamiento para guardar los ficheros subidos. El servidor web debe tener acceso de escritura a este directorio en la carpeta de nivel superior"
-#: ../../Zotlabs/Module/Connections.php:287
-#: ../../Zotlabs/Module/Connedit.php:637
-msgid "Ignore"
-msgstr "Ignorar"
+#: ../../Zotlabs/Module/Setup.php:618
+msgid "store is writable"
+msgstr "\"store\" tiene permisos de escritura"
-#: ../../Zotlabs/Module/Connections.php:288
-msgid "Recent activity"
-msgstr "Actividad reciente"
+#: ../../Zotlabs/Module/Setup.php:650
+msgid ""
+"SSL certificate cannot be validated. Fix certificate or disable https access"
+" to this site."
+msgstr "El certificado SSL no ha podido ser validado. Corrija este problema o desactive el acceso https a este sitio."
-#: ../../Zotlabs/Module/Connections.php:312 ../../Zotlabs/Lib/Apps.php:216
-#: ../../include/nav.php:203 ../../include/text.php:940
-msgid "Connections"
-msgstr "Conexiones"
+#: ../../Zotlabs/Module/Setup.php:651
+msgid ""
+"If you have https access to your website or allow connections to TCP port "
+"443 (the https: port), you MUST use a browser-valid certificate. You MUST "
+"NOT use self-signed certificates!"
+msgstr "Si su servidor soporta conexiones cifradas SSL o si permite conexiones al puerto TCP 443 (el puerto usado por el protocolo https), debe utilizar un certificado válido. No debe usar un certificado firmado por usted mismo."
-#: ../../Zotlabs/Module/Connections.php:316 ../../Zotlabs/Module/Search.php:44
-#: ../../Zotlabs/Lib/Apps.php:237 ../../include/widgets.php:302
-#: ../../include/acl_selectors.php:213 ../../include/nav.php:180
-#: ../../include/text.php:1010 ../../include/text.php:1022
-msgid "Search"
-msgstr "Buscar"
+#: ../../Zotlabs/Module/Setup.php:652
+msgid ""
+"This restriction is incorporated because public posts from you may for "
+"example contain references to images on your own hub."
+msgstr "Se ha incorporado esta restricción para evitar que sus entradas públicas hagan referencia a imágenes en su propio servidor."
-#: ../../Zotlabs/Module/Connections.php:317
-msgid "Search your connections"
-msgstr "Buscar sus conexiones"
+#: ../../Zotlabs/Module/Setup.php:653
+msgid ""
+"If your certificate is not recognized, members of other sites (who may "
+"themselves have valid certificates) will get a warning message on their own "
+"site complaining about security issues."
+msgstr "Si su certificado no ha sido reconocido, los miembros de otros sitios (con certificados válidos) recibirán mensajes de aviso en sus propios sitios web."
-#: ../../Zotlabs/Module/Connections.php:318
-msgid "Connections search"
-msgstr "Buscar conexiones"
+#: ../../Zotlabs/Module/Setup.php:654
+msgid ""
+"This can cause usability issues elsewhere (not just on your own site) so we "
+"must insist on this requirement."
+msgstr "Por razones de compatibilidad (sobre el conjunto de la red, no solo sobre su propio sitio), debemos insistir en estos requisitos."
-#: ../../Zotlabs/Module/Connections.php:319
-#: ../../Zotlabs/Module/Directory.php:392
-#: ../../Zotlabs/Module/Directory.php:397 ../../include/contact_widgets.php:23
-msgid "Find"
-msgstr "Encontrar"
+#: ../../Zotlabs/Module/Setup.php:655
+msgid ""
+"Providers are available that issue free certificates which are browser-"
+"valid."
+msgstr "Existen varias Autoridades de Certificación que le pueden proporcionar certificados válidos."
-#: ../../Zotlabs/Module/Cover_photo.php:58
-#: ../../Zotlabs/Module/Profile_photo.php:61
-msgid "Image uploaded but image cropping failed."
-msgstr "Imagen actualizada, pero el recorte de la imagen ha fallado. "
+#: ../../Zotlabs/Module/Setup.php:657
+msgid ""
+"If you are confident that the certificate is valid and signed by a trusted "
+"authority, check to see if you have failed to install an intermediate cert. "
+"These are not normally required by browsers, but are required for server-to-"
+"server communications."
+msgstr "Si se tiene la certeza de que el certificado es válido y está firmado por una autoridad de confianza, comprobar para ver si hubo un error al instalar un certificado intermedio. Estos no son normalmente requeridos por los navegadores, pero son necesarios para las comunicaciones de servidor a servidor."
-#: ../../Zotlabs/Module/Cover_photo.php:134
-#: ../../Zotlabs/Module/Cover_photo.php:181
-msgid "Cover Photos"
-msgstr "Imágenes de portada del perfil"
+#: ../../Zotlabs/Module/Setup.php:659
+msgid "SSL certificate validation"
+msgstr "validación del certificado SSL"
-#: ../../Zotlabs/Module/Cover_photo.php:154
-#: ../../Zotlabs/Module/Profile_photo.php:135
-msgid "Image resize failed."
-msgstr "El ajuste del tamaño de la imagen ha fallado."
+#: ../../Zotlabs/Module/Setup.php:665
+msgid ""
+"Url rewrite in .htaccess is not working. Check your server "
+"configuration.Test: "
+msgstr "No se pueden reescribir las direcciones web en .htaccess. Compruebe la configuración de su servidor:"
-#: ../../Zotlabs/Module/Cover_photo.php:168
-#: ../../Zotlabs/Module/Profile_photo.php:201 ../../include/photos.php:149
-msgid "Unable to process image"
-msgstr "No ha sido posible procesar la imagen"
+#: ../../Zotlabs/Module/Setup.php:668
+msgid "Url rewrite is working"
+msgstr "La reescritura de las direcciones funciona correctamente"
-#: ../../Zotlabs/Module/Cover_photo.php:192
-#: ../../Zotlabs/Module/Profile_photo.php:236
-msgid "Image upload failed."
-msgstr "La carga de la imagen ha fallado."
+#: ../../Zotlabs/Module/Setup.php:682
+msgid ""
+"The database configuration file \".htconfig.php\" could not be written. "
+"Please use the enclosed text to create a configuration file in your web "
+"server root."
+msgstr "El fichero de configuración de la base de datos .htconfig.php no se ha podido modificar. Por favor, copie el texto generado en un fichero con ese nombre en el directorio raíz de su servidor."
-#: ../../Zotlabs/Module/Cover_photo.php:210
-#: ../../Zotlabs/Module/Profile_photo.php:255
-msgid "Unable to process image."
-msgstr "No ha sido posible procesar la imagen."
+#: ../../Zotlabs/Module/Setup.php:706
+#: ../../addon/rendezvous/rendezvous.php:401 ../../addon/cdav/cdav.php:41
+msgid "Errors encountered creating database tables."
+msgstr "Se han encontrado errores al crear las tablas de la base de datos."
-#: ../../Zotlabs/Module/Cover_photo.php:233 ../../include/items.php:4278
-msgid "female"
-msgstr "mujer"
+#: ../../Zotlabs/Module/Setup.php:746
+msgid "<h1>What next</h1>"
+msgstr "<h1>Siguiente paso</h1>"
-#: ../../Zotlabs/Module/Cover_photo.php:234 ../../include/items.php:4279
-#, php-format
-msgid "%1$s updated her %2$s"
-msgstr "%1$s ha actualizado su %2$s"
+#: ../../Zotlabs/Module/Setup.php:747
+msgid ""
+"IMPORTANT: You will need to [manually] setup a scheduled task for the "
+"poller."
+msgstr "IMPORTANTE: Debe crear [manualmente] una tarea programada para el \"poller\"."
-#: ../../Zotlabs/Module/Cover_photo.php:235 ../../include/items.php:4280
-msgid "male"
-msgstr "hombre"
+#: ../../Zotlabs/Module/Connect.php:61 ../../Zotlabs/Module/Connect.php:109
+msgid "Continue"
+msgstr "Continuar"
-#: ../../Zotlabs/Module/Cover_photo.php:236 ../../include/items.php:4281
-#, php-format
-msgid "%1$s updated his %2$s"
-msgstr "%1$s ha actualizado su %2$s"
+#: ../../Zotlabs/Module/Connect.php:90
+msgid "Premium Channel Setup"
+msgstr "Configuración del canal premium"
-#: ../../Zotlabs/Module/Cover_photo.php:238 ../../include/items.php:4283
-#, php-format
-msgid "%1$s updated their %2$s"
-msgstr "%1$s ha actualizado su %2$s"
+#: ../../Zotlabs/Module/Connect.php:92
+msgid "Enable premium channel connection restrictions"
+msgstr "Habilitar restricciones de conexión del canal premium"
-#: ../../Zotlabs/Module/Cover_photo.php:240 ../../include/channel.php:1764
-msgid "cover photo"
-msgstr "Imagen de portada del perfil"
+#: ../../Zotlabs/Module/Connect.php:93
+msgid ""
+"Please enter your restrictions or conditions, such as paypal receipt, usage "
+"guidelines, etc."
+msgstr "Por favor introduzca sus restricciones o condiciones, como recibo de paypal, normas de uso, etc."
-#: ../../Zotlabs/Module/Cover_photo.php:303
-#: ../../Zotlabs/Module/Cover_photo.php:318
-#: ../../Zotlabs/Module/Profile_photo.php:316
-#: ../../Zotlabs/Module/Profile_photo.php:363
-msgid "Photo not available."
-msgstr "Foto no disponible."
+#: ../../Zotlabs/Module/Connect.php:95 ../../Zotlabs/Module/Connect.php:115
+msgid ""
+"This channel may require additional steps or acknowledgement of the "
+"following conditions prior to connecting:"
+msgstr "Este canal puede requerir antes de conectar unos pasos adicionales o el conocimiento de las siguientes condiciones:"
-#: ../../Zotlabs/Module/Cover_photo.php:354
-#: ../../Zotlabs/Module/Profile_photo.php:418
-msgid "Upload File:"
-msgstr "Subir fichero:"
+#: ../../Zotlabs/Module/Connect.php:96
+msgid ""
+"Potential connections will then see the following text before proceeding:"
+msgstr "Las posibles conexiones verán, por tanto, el siguiente texto antes de proceder:"
-#: ../../Zotlabs/Module/Cover_photo.php:355
-#: ../../Zotlabs/Module/Profile_photo.php:419
-msgid "Select a profile:"
-msgstr "Seleccionar un perfil:"
+#: ../../Zotlabs/Module/Connect.php:97 ../../Zotlabs/Module/Connect.php:118
+msgid ""
+"By continuing, I certify that I have complied with any instructions provided"
+" on this page."
+msgstr "Al continuar, certifico que he cumplido con todas las instrucciones proporcionadas en esta página."
-#: ../../Zotlabs/Module/Cover_photo.php:356
-msgid "Upload Cover Photo"
-msgstr "Subir imagen de portada del perfil"
+#: ../../Zotlabs/Module/Connect.php:106
+msgid "(No specific instructions have been provided by the channel owner.)"
+msgstr "(No ha sido proporcionada ninguna instrucción específica por el propietario del canal.)"
-#: ../../Zotlabs/Module/Cover_photo.php:361
-#: ../../Zotlabs/Module/Profile_photo.php:427
-#: ../../Zotlabs/Module/Settings/Channel.php:404
-msgid "or"
-msgstr "o"
+#: ../../Zotlabs/Module/Connect.php:114
+msgid "Restricted or Premium Channel"
+msgstr "Canal premium o restringido"
-#: ../../Zotlabs/Module/Cover_photo.php:361
-#: ../../Zotlabs/Module/Profile_photo.php:427
-msgid "skip this step"
-msgstr "Omitir este paso"
+#: ../../Zotlabs/Module/Admin/Queue.php:35
+msgid "Queue Statistics"
+msgstr "Estadísticas de la cola"
-#: ../../Zotlabs/Module/Cover_photo.php:361
-#: ../../Zotlabs/Module/Profile_photo.php:427
-msgid "select a photo from your photo albums"
-msgstr "Seleccione una foto de sus álbumes de fotos"
+#: ../../Zotlabs/Module/Admin/Queue.php:36
+msgid "Total Entries"
+msgstr "Total de entradas"
-#: ../../Zotlabs/Module/Cover_photo.php:377
-#: ../../Zotlabs/Module/Profile_photo.php:446
-msgid "Crop Image"
-msgstr "Recortar imagen"
+#: ../../Zotlabs/Module/Admin/Queue.php:37
+msgid "Priority"
+msgstr "Prioridad"
-#: ../../Zotlabs/Module/Cover_photo.php:378
-#: ../../Zotlabs/Module/Profile_photo.php:447
-msgid "Please adjust the image cropping for optimum viewing."
-msgstr "Por favor ajuste el recorte de la imagen para una visión óptima."
+#: ../../Zotlabs/Module/Admin/Queue.php:38
+msgid "Destination URL"
+msgstr "Dirección de destino"
-#: ../../Zotlabs/Module/Cover_photo.php:380
-#: ../../Zotlabs/Module/Profile_photo.php:449
-msgid "Done Editing"
-msgstr "Edición completada"
+#: ../../Zotlabs/Module/Admin/Queue.php:39
+msgid "Mark hub permanently offline"
+msgstr "Marcar el servidor como permanentemente fuera de línea"
+
+#: ../../Zotlabs/Module/Admin/Queue.php:40
+msgid "Empty queue for this hub"
+msgstr "Vaciar la cola para este servidor"
+
+#: ../../Zotlabs/Module/Admin/Queue.php:41
+msgid "Last known contact"
+msgstr "Último contacto conocido"
#: ../../Zotlabs/Module/Admin/Features.php:55
#: ../../Zotlabs/Module/Admin/Features.php:56
@@ -1442,260 +1935,211 @@ msgstr "Bloquear la funcionalidad %s"
msgid "Manage Additional Features"
msgstr "Gestionar las funcionalidades"
-#: ../../Zotlabs/Module/Admin/Logs.php:28
-msgid "Log settings updated."
-msgstr "Actualizado el informe de configuraciones."
-
-#: ../../Zotlabs/Module/Admin/Logs.php:83 ../../include/widgets.php:1661
-#: ../../include/widgets.php:1671
-msgid "Logs"
-msgstr "Informes"
-
-#: ../../Zotlabs/Module/Admin/Logs.php:85
-msgid "Clear"
-msgstr "Vaciar"
-
-#: ../../Zotlabs/Module/Admin/Logs.php:91
-msgid "Debugging"
-msgstr "Depuración"
-
-#: ../../Zotlabs/Module/Admin/Logs.php:92
-msgid "Log file"
-msgstr "Fichero de informe"
-
-#: ../../Zotlabs/Module/Admin/Logs.php:92
-msgid ""
-"Must be writable by web server. Relative to your top-level webserver "
-"directory."
-msgstr "Debe tener permisos de escritura por el servidor web. La ruta es relativa al directorio web principal."
-
-#: ../../Zotlabs/Module/Admin/Logs.php:93
-msgid "Log level"
-msgstr "Nivel de depuración"
-
-#: ../../Zotlabs/Module/Admin/Profs.php:69
-msgid "New Profile Field"
-msgstr "Nuevo campo en el perfil"
-
-#: ../../Zotlabs/Module/Admin/Profs.php:70
-#: ../../Zotlabs/Module/Admin/Profs.php:90
-msgid "Field nickname"
-msgstr "Alias del campo"
-
-#: ../../Zotlabs/Module/Admin/Profs.php:70
-#: ../../Zotlabs/Module/Admin/Profs.php:90
-msgid "System name of field"
-msgstr "Nombre del campo en el sistema"
-
-#: ../../Zotlabs/Module/Admin/Profs.php:71
-#: ../../Zotlabs/Module/Admin/Profs.php:91
-msgid "Input type"
-msgstr "Tipo de entrada"
-
-#: ../../Zotlabs/Module/Admin/Profs.php:72
-#: ../../Zotlabs/Module/Admin/Profs.php:92
-msgid "Field Name"
-msgstr "Nombre del campo"
-
-#: ../../Zotlabs/Module/Admin/Profs.php:72
-#: ../../Zotlabs/Module/Admin/Profs.php:92
-msgid "Label on profile pages"
-msgstr "Etiqueta a mostrar en la página del perfil"
-
-#: ../../Zotlabs/Module/Admin/Profs.php:73
-#: ../../Zotlabs/Module/Admin/Profs.php:93
-msgid "Help text"
-msgstr "Texto de ayuda"
-
-#: ../../Zotlabs/Module/Admin/Profs.php:73
-#: ../../Zotlabs/Module/Admin/Profs.php:93
-msgid "Additional info (optional)"
-msgstr "Información adicional (opcional)"
-
-#: ../../Zotlabs/Module/Admin/Profs.php:83
-msgid "Field definition not found"
-msgstr "Definición del campo no encontrada"
-
-#: ../../Zotlabs/Module/Admin/Profs.php:89
-msgid "Edit Profile Field"
-msgstr "Modificar el campo del perfil"
+#: ../../Zotlabs/Module/Admin/Dbsync.php:19
+msgid "Update has been marked successful"
+msgstr "La actualización ha sido marcada como exitosa"
-#: ../../Zotlabs/Module/Admin/Profs.php:147 ../../include/widgets.php:1642
-msgid "Profile Fields"
-msgstr "Campos del perfil"
+#: ../../Zotlabs/Module/Admin/Dbsync.php:29
+#, php-format
+msgid "Executing %s failed. Check system logs."
+msgstr "La ejecución de %s ha fallado. Mirar en los informes del sistema."
-#: ../../Zotlabs/Module/Admin/Profs.php:148
-msgid "Basic Profile Fields"
-msgstr "Campos básicos del perfil"
+#: ../../Zotlabs/Module/Admin/Dbsync.php:32
+#, php-format
+msgid "Update %s was successfully applied."
+msgstr "La actualización de %s se ha realizado exitosamente."
-#: ../../Zotlabs/Module/Admin/Profs.php:149
-msgid "Advanced Profile Fields"
-msgstr "Campos avanzados del perfil"
+#: ../../Zotlabs/Module/Admin/Dbsync.php:36
+#, php-format
+msgid "Update %s did not return a status. Unknown if it succeeded."
+msgstr "La actualización de %s no ha devuelto ningún estado. No se sabe si ha tenido éxito."
-#: ../../Zotlabs/Module/Admin/Profs.php:149
-msgid "(In addition to basic fields)"
-msgstr "(Además de los campos básicos)"
+#: ../../Zotlabs/Module/Admin/Dbsync.php:39
+#, php-format
+msgid "Update function %s could not be found."
+msgstr "No se encuentra la función de actualización de %s."
-#: ../../Zotlabs/Module/Admin/Profs.php:151
-msgid "All available fields"
-msgstr "Todos los campos disponibles"
+#: ../../Zotlabs/Module/Admin/Dbsync.php:55
+msgid "No failed updates."
+msgstr "No ha fallado ninguna actualización."
-#: ../../Zotlabs/Module/Admin/Profs.php:152
-msgid "Custom Fields"
-msgstr "Campos personalizados"
+#: ../../Zotlabs/Module/Admin/Dbsync.php:59
+msgid "Failed Updates"
+msgstr "Han fallado las actualizaciones"
-#: ../../Zotlabs/Module/Admin/Profs.php:156
-msgid "Create Custom Field"
-msgstr "Crear un campo personalizado"
+#: ../../Zotlabs/Module/Admin/Dbsync.php:61
+msgid "Mark success (if update was manually applied)"
+msgstr "Marcar como exitosa (si la actualización se ha hecho manualmente)"
-#: ../../Zotlabs/Module/Admin/Security.php:77
-msgid ""
-"By default, unfiltered HTML is allowed in embedded media. This is inherently"
-" insecure."
-msgstr "De forma predeterminada, el HTML sin filtrar está permitido en el contenido multimedia incorporado en una publicación. Esto es siempre inseguro."
+#: ../../Zotlabs/Module/Admin/Dbsync.php:62
+msgid "Attempt to execute this update step automatically"
+msgstr "Intentar ejecutar este paso de actualización automáticamente"
-#: ../../Zotlabs/Module/Admin/Security.php:80
-msgid ""
-"The recommended setting is to only allow unfiltered HTML from the following "
-"sites:"
-msgstr "La configuración recomendada es que sólo se permita HTML sin filtrar desde los siguientes sitios: "
+#: ../../Zotlabs/Module/Admin/Plugins.php:259
+#: ../../Zotlabs/Module/Admin/Themes.php:72 ../../Zotlabs/Module/Thing.php:89
+#: ../../Zotlabs/Module/Viewsrc.php:25 ../../Zotlabs/Module/Display.php:35
+#: ../../Zotlabs/Module/Filestorage.php:32 ../../Zotlabs/Module/Admin.php:60
+#: ../../include/items.php:3391
+msgid "Item not found."
+msgstr "Elemento no encontrado."
-#: ../../Zotlabs/Module/Admin/Security.php:81
-msgid ""
-"https://youtube.com/<br />https://www.youtube.com/<br />https://youtu.be/<br"
-" />https://vimeo.com/<br />https://soundcloud.com/<br />"
-msgstr "https://youtube.com/<br />https://www.youtube.com/<br />https://youtu.be/<br />https://vimeo.com/<br />https://soundcloud.com/<br />"
+#: ../../Zotlabs/Module/Admin/Plugins.php:289
+#, php-format
+msgid "Plugin %s disabled."
+msgstr "Extensión %s desactivada."
-#: ../../Zotlabs/Module/Admin/Security.php:82
-msgid ""
-"All other embedded content will be filtered, <strong>unless</strong> "
-"embedded content from that site is explicitly blocked."
-msgstr "El resto del contenido incrustado se filtrará, <strong>excepto</ strong> si el contenido incorporado desde ese sitio está bloqueado de forma explícita."
+#: ../../Zotlabs/Module/Admin/Plugins.php:294
+#, php-format
+msgid "Plugin %s enabled."
+msgstr "Extensión %s activada."
-#: ../../Zotlabs/Module/Admin/Security.php:87 ../../include/widgets.php:1637
-msgid "Security"
-msgstr "Seguridad"
+#: ../../Zotlabs/Module/Admin/Plugins.php:310
+#: ../../Zotlabs/Module/Admin/Themes.php:95
+msgid "Disable"
+msgstr "Desactivar"
-#: ../../Zotlabs/Module/Admin/Security.php:89
-msgid "Block public"
-msgstr "Bloquear páginas públicas"
+#: ../../Zotlabs/Module/Admin/Plugins.php:313
+#: ../../Zotlabs/Module/Admin/Themes.php:97
+msgid "Enable"
+msgstr "Activar"
-#: ../../Zotlabs/Module/Admin/Security.php:89
-msgid ""
-"Check to block public access to all otherwise public personal pages on this "
-"site unless you are currently authenticated."
-msgstr "Habilitar para impedir ver las páginas personales de este sitio a quien no esté actualmente autenticado."
+#: ../../Zotlabs/Module/Admin/Plugins.php:341
+#: ../../Zotlabs/Module/Admin/Plugins.php:436
+#: ../../Zotlabs/Module/Admin/Accounts.php:164
+#: ../../Zotlabs/Module/Admin/Logs.php:82
+#: ../../Zotlabs/Module/Admin/Channels.php:145
+#: ../../Zotlabs/Module/Admin/Themes.php:122
+#: ../../Zotlabs/Module/Admin/Themes.php:156
+#: ../../Zotlabs/Module/Admin/Site.php:277
+#: ../../Zotlabs/Module/Admin/Security.php:86
+#: ../../Zotlabs/Module/Admin.php:137
+msgid "Administration"
+msgstr "Administración"
-#: ../../Zotlabs/Module/Admin/Security.php:90
-msgid "Set \"Transport Security\" HTTP header"
-msgstr "Habilitar \"Seguridad de transporte\" (\"Transport Security\") en la cabecera HTTP"
+#: ../../Zotlabs/Module/Admin/Plugins.php:342
+#: ../../Zotlabs/Module/Admin/Plugins.php:437
+#: ../../Zotlabs/Widget/Admin.php:27
+msgid "Plugins"
+msgstr "Extensiones (plugins)"
-#: ../../Zotlabs/Module/Admin/Security.php:91
-msgid "Set \"Content Security Policy\" HTTP header"
-msgstr "Habilitar la \"Política de seguridad del contenido\" (\"Content Security Policy\") en la cabecera HTTP"
+#: ../../Zotlabs/Module/Admin/Plugins.php:343
+#: ../../Zotlabs/Module/Admin/Themes.php:124
+msgid "Toggle"
+msgstr "Cambiar"
-#: ../../Zotlabs/Module/Admin/Security.php:92
-msgid "Allowed email domains"
-msgstr "Se aceptan dominios de correo electrónico"
+#: ../../Zotlabs/Module/Admin/Plugins.php:344
+#: ../../Zotlabs/Module/Admin/Themes.php:125 ../../Zotlabs/Lib/Apps.php:223
+#: ../../Zotlabs/Widget/Settings_menu.php:131 ../../include/nav.php:207
+msgid "Settings"
+msgstr "Ajustes"
-#: ../../Zotlabs/Module/Admin/Security.php:92
-msgid ""
-"Comma separated list of domains which are allowed in email addresses for "
-"registrations to this site. Wildcards are accepted. Empty to allow any "
-"domains"
-msgstr "Lista separada por comas de los dominios de los que se acepta una dirección de correo electrónico para registros en este sitio. Se permiten comodines. Dejar en claro para aceptar cualquier dominio. "
+#: ../../Zotlabs/Module/Admin/Plugins.php:351
+#: ../../Zotlabs/Module/Admin/Themes.php:134
+msgid "Author: "
+msgstr "Autor:"
-#: ../../Zotlabs/Module/Admin/Security.php:93
-msgid "Not allowed email domains"
-msgstr "No se permiten dominios de correo electrónico"
+#: ../../Zotlabs/Module/Admin/Plugins.php:352
+#: ../../Zotlabs/Module/Admin/Themes.php:135
+msgid "Maintainer: "
+msgstr "Mantenedor:"
-#: ../../Zotlabs/Module/Admin/Security.php:93
-msgid ""
-"Comma separated list of domains which are not allowed in email addresses for"
-" registrations to this site. Wildcards are accepted. Empty to allow any "
-"domains, unless allowed domains have been defined."
-msgstr "Lista separada por comas de los dominios de los que no se acepta una dirección de correo electrónico para registros en este sitio. Se permiten comodines. Dejar en claro para no aceptar cualquier dominio, excepto los que se hayan autorizado."
+#: ../../Zotlabs/Module/Admin/Plugins.php:353
+msgid "Minimum project version: "
+msgstr "Versión mínima del proyecto:"
-#: ../../Zotlabs/Module/Admin/Security.php:94
-msgid "Allow communications only from these sites"
-msgstr "Permitir la comunicación solo desde estos sitios"
+#: ../../Zotlabs/Module/Admin/Plugins.php:354
+msgid "Maximum project version: "
+msgstr "Versión máxima del proyecto:"
-#: ../../Zotlabs/Module/Admin/Security.php:94
-msgid ""
-"One site per line. Leave empty to allow communication from anywhere by "
-"default"
-msgstr "Un sitio por línea. Dejar en blanco para permitir por defecto la comunicación desde cualquiera"
+#: ../../Zotlabs/Module/Admin/Plugins.php:355
+msgid "Minimum PHP version: "
+msgstr "Versión mínima de PHP:"
-#: ../../Zotlabs/Module/Admin/Security.php:95
-msgid "Block communications from these sites"
-msgstr "Bloquear la comunicación desde estos sitios"
+#: ../../Zotlabs/Module/Admin/Plugins.php:356
+msgid "Compatible Server Roles: "
+msgstr "Configuraciones compatibles con este servidor:"
-#: ../../Zotlabs/Module/Admin/Security.php:96
-msgid "Allow communications only from these channels"
-msgstr "Permitir la comunicación solo desde estos canales"
+#: ../../Zotlabs/Module/Admin/Plugins.php:357
+msgid "Requires: "
+msgstr "Se requiere:"
-#: ../../Zotlabs/Module/Admin/Security.php:96
-msgid ""
-"One channel (hash) per line. Leave empty to allow from any channel by "
-"default"
-msgstr "Un canal (hash) por línea. Dejar en blanco para permitir por defecto la comunicación desde cualquiera"
+#: ../../Zotlabs/Module/Admin/Plugins.php:358
+#: ../../Zotlabs/Module/Admin/Plugins.php:442
+msgid "Disabled - version incompatibility"
+msgstr "Deshabilitado - versiones incompatibles"
-#: ../../Zotlabs/Module/Admin/Security.php:97
-msgid "Block communications from these channels"
-msgstr "Bloquear la comunicación desde estos canales"
+#: ../../Zotlabs/Module/Admin/Plugins.php:411
+msgid "Enter the public git repository URL of the plugin repo."
+msgstr "Escriba la URL pública del repositorio git del plugin."
-#: ../../Zotlabs/Module/Admin/Security.php:98
-msgid "Only allow embeds from secure (SSL) websites and links."
-msgstr "Sólo se permite contenido multimedia incorporado desde sitios y enlaces seguros (SSL)."
+#: ../../Zotlabs/Module/Admin/Plugins.php:412
+msgid "Plugin repo git URL"
+msgstr "URL del repositorio git del plugin"
-#: ../../Zotlabs/Module/Admin/Security.php:99
-msgid "Allow unfiltered embedded HTML content only from these domains"
-msgstr "Permitir contenido HTML sin filtrar sólo desde estos dominios "
+#: ../../Zotlabs/Module/Admin/Plugins.php:413
+msgid "Custom repo name"
+msgstr "Nombre personalizado del repositorio"
-#: ../../Zotlabs/Module/Admin/Security.php:99
-msgid "One site per line. By default embedded content is filtered."
-msgstr "Un sitio por línea. El contenido incorporado se filtra de forma predeterminada."
+#: ../../Zotlabs/Module/Admin/Plugins.php:413
+msgid "(optional)"
+msgstr "(opcional)"
-#: ../../Zotlabs/Module/Admin/Security.php:100
-msgid "Block embedded HTML from these domains"
-msgstr "Bloquear contenido con HTML incorporado desde estos dominios"
+#: ../../Zotlabs/Module/Admin/Plugins.php:414
+msgid "Download Plugin Repo"
+msgstr "Descargar el repositorio"
-#: ../../Zotlabs/Module/Admin/Account_edit.php:29
-#, php-format
-msgid "Password changed for account %d."
-msgstr "Ha cambiado la contraseña para la cuenta %d."
+#: ../../Zotlabs/Module/Admin/Plugins.php:421
+msgid "Install new repo"
+msgstr "Instalar un nuevo repositorio"
-#: ../../Zotlabs/Module/Admin/Account_edit.php:46
-msgid "Account settings updated."
-msgstr "Se han actualizado los ajustes de la cuenta."
+#: ../../Zotlabs/Module/Admin/Plugins.php:422 ../../Zotlabs/Lib/Apps.php:358
+msgid "Install"
+msgstr "Instalar"
-#: ../../Zotlabs/Module/Admin/Account_edit.php:61
-msgid "Account not found."
-msgstr "No se ha encontrado la cuenta."
+#: ../../Zotlabs/Module/Admin/Plugins.php:423
+#: ../../Zotlabs/Module/Settings/Oauth.php:88
+#: ../../Zotlabs/Module/Settings/Oauth.php:114
+#: ../../Zotlabs/Module/Wiki.php:265 ../../Zotlabs/Module/Wiki.php:290
+#: ../../Zotlabs/Module/Connedit.php:920 ../../Zotlabs/Module/Fbrowser.php:66
+#: ../../Zotlabs/Module/Fbrowser.php:88 ../../Zotlabs/Module/Profiles.php:804
+#: ../../Zotlabs/Module/Filer.php:55 ../../Zotlabs/Module/Tagrm.php:15
+#: ../../Zotlabs/Module/Tagrm.php:138 ../../addon/cdav/Mod_Cdav.php:866
+#: ../../addon/cdav/Mod_Cdav.php:1154 ../../addon/js_upload/js_upload.php:46
+#: ../../addon/gitwiki/Mod_Gitwiki.php:244
+#: ../../addon/gitwiki/Mod_Gitwiki.php:267 ../../include/conversation.php:1327
+#: ../../include/conversation.php:1376
+msgid "Cancel"
+msgstr "Cancelar"
-#: ../../Zotlabs/Module/Admin/Account_edit.php:68
-msgid "Account Edit"
-msgstr "Editar la cuenta"
+#: ../../Zotlabs/Module/Admin/Plugins.php:445
+msgid "Manage Repos"
+msgstr "Gestionar los repositorios"
-#: ../../Zotlabs/Module/Admin/Account_edit.php:69
-msgid "New Password"
-msgstr "Nueva contraseña"
+#: ../../Zotlabs/Module/Admin/Plugins.php:446
+msgid "Installed Plugin Repositories"
+msgstr "Repositorios de los plugins instalados"
-#: ../../Zotlabs/Module/Admin/Account_edit.php:70
-msgid "New Password again"
-msgstr "Nueva contraseña otra vez"
+#: ../../Zotlabs/Module/Admin/Plugins.php:447
+msgid "Install a New Plugin Repository"
+msgstr "Instalar un nuevo repositorio de plugins"
-#: ../../Zotlabs/Module/Admin/Account_edit.php:71
-msgid "Technical skill level"
-msgstr "Nivel de habilidad técnica"
+#: ../../Zotlabs/Module/Admin/Plugins.php:453
+#: ../../Zotlabs/Module/Settings/Oauth.php:42
+#: ../../Zotlabs/Module/Settings/Oauth.php:113
+#: ../../Zotlabs/Module/Connedit.php:918 ../../Zotlabs/Module/Profiles.php:802
+#: ../../Zotlabs/Lib/Apps.php:358 ../../addon/cdav/Mod_Cdav.php:1152
+msgid "Update"
+msgstr "Actualizar"
-#: ../../Zotlabs/Module/Admin/Account_edit.php:72
-msgid "Account language (for emails)"
-msgstr "Idioma de la cuenta (para los correos electrónicos)"
+#: ../../Zotlabs/Module/Admin/Plugins.php:454
+msgid "Switch branch"
+msgstr "Cambiar la rama"
-#: ../../Zotlabs/Module/Admin/Account_edit.php:73
-msgid "Service class"
-msgstr "Clase de servicio"
+#: ../../Zotlabs/Module/Admin/Plugins.php:455
+#: ../../Zotlabs/Module/Photos.php:960 ../../Zotlabs/Module/Tagrm.php:137
+#: ../../addon/superblock/superblock.php:116
+msgid "Remove"
+msgstr "Eliminar"
#: ../../Zotlabs/Module/Admin/Accounts.php:36
#, php-format
@@ -1731,7 +2175,8 @@ msgid "Account '%s' unblocked"
msgstr "La cuenta '%s' ha sido desbloqueada"
#: ../../Zotlabs/Module/Admin/Accounts.php:165
-#: ../../Zotlabs/Module/Admin/Accounts.php:178 ../../include/widgets.php:1635
+#: ../../Zotlabs/Module/Admin/Accounts.php:178
+#: ../../Zotlabs/Widget/Admin.php:23
msgid "Accounts"
msgstr "Cuentas"
@@ -1750,13 +2195,10 @@ msgstr "Fecha de solicitud"
#: ../../Zotlabs/Module/Admin/Accounts.php:169
#: ../../Zotlabs/Module/Admin/Accounts.php:181
-#: ../../Zotlabs/Module/Connedit.php:917 ../../Zotlabs/Module/Profiles.php:790
-#: ../../extend/addon/addon/redred/redred.php:107
-#: ../../extend/addon/addon/rtof/rtof.php:93
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1140
-#: ../../extend/addon/addon/openid/MysqlProvider.php:56
-#: ../../extend/addon/addon/openid/MysqlProvider.php:57
-#: ../../include/network.php:2270
+#: ../../Zotlabs/Module/Connedit.php:906 ../../Zotlabs/Module/Profiles.php:790
+#: ../../addon/cdav/Mod_Cdav.php:1140 ../../addon/openid/MysqlProvider.php:56
+#: ../../addon/openid/MysqlProvider.php:57 ../../addon/rtof/rtof.php:93
+#: ../../addon/redred/redred.php:107 ../../include/network.php:2315
msgid "Email"
msgstr "Correo electrónico"
@@ -1764,17 +2206,22 @@ msgstr "Correo electrónico"
msgid "No registrations."
msgstr "Sin registros."
+#: ../../Zotlabs/Module/Admin/Accounts.php:171
+#: ../../Zotlabs/Module/Connections.php:281
+msgid "Approve"
+msgstr "Aprobar"
+
#: ../../Zotlabs/Module/Admin/Accounts.php:172
msgid "Deny"
msgstr "Rechazar"
#: ../../Zotlabs/Module/Admin/Accounts.php:174
-#: ../../Zotlabs/Module/Connedit.php:629
+#: ../../Zotlabs/Module/Connedit.php:618
msgid "Block"
msgstr "Bloquear"
#: ../../Zotlabs/Module/Admin/Accounts.php:175
-#: ../../Zotlabs/Module/Connedit.php:629
+#: ../../Zotlabs/Module/Connedit.php:618
msgid "Unblock"
msgstr "Desbloquear"
@@ -1814,6 +2261,37 @@ msgid ""
"this site will be permanently deleted!\\n\\nAre you sure?"
msgstr "¡La cuenta {0} va a ser eliminada!\\n\\n¡Todo lo que esta cuenta ha publicado en este sitio será borrado de forma permanente!\\n\\n¿Está seguro de querer hacerlo?"
+#: ../../Zotlabs/Module/Admin/Logs.php:28
+msgid "Log settings updated."
+msgstr "Actualizado el informe de configuraciones."
+
+#: ../../Zotlabs/Module/Admin/Logs.php:83 ../../Zotlabs/Widget/Admin.php:48
+#: ../../Zotlabs/Widget/Admin.php:58
+msgid "Logs"
+msgstr "Informes"
+
+#: ../../Zotlabs/Module/Admin/Logs.php:85
+msgid "Clear"
+msgstr "Vaciar"
+
+#: ../../Zotlabs/Module/Admin/Logs.php:91
+msgid "Debugging"
+msgstr "Depuración"
+
+#: ../../Zotlabs/Module/Admin/Logs.php:92
+msgid "Log file"
+msgstr "Fichero de informe"
+
+#: ../../Zotlabs/Module/Admin/Logs.php:92
+msgid ""
+"Must be writable by web server. Relative to your top-level webserver "
+"directory."
+msgstr "Debe tener permisos de escritura por el servidor web. La ruta es relativa al directorio web principal."
+
+#: ../../Zotlabs/Module/Admin/Logs.php:93
+msgid "Log level"
+msgstr "Nivel de depuración"
+
#: ../../Zotlabs/Module/Admin/Channels.php:31
#, php-format
msgid "%s channel censored/uncensored"
@@ -1864,7 +2342,8 @@ msgstr "Código permitido al canal '%s'"
msgid "Channel '%s' code disallowed"
msgstr "Código no permitido al canal '%s'"
-#: ../../Zotlabs/Module/Admin/Channels.php:146 ../../include/widgets.php:1636
+#: ../../Zotlabs/Module/Admin/Channels.php:146
+#: ../../Zotlabs/Widget/Admin.php:24
msgid "Channels"
msgstr "Canales"
@@ -1885,7 +2364,7 @@ msgid "Disallow Code"
msgstr "No permitir código"
#: ../../Zotlabs/Module/Admin/Channels.php:154
-#: ../../include/conversation.php:1815
+#: ../../include/conversation.php:1760 ../../include/nav.php:369
msgid "Channel"
msgstr "Canal"
@@ -1893,13 +2372,6 @@ msgstr "Canal"
msgid "UID"
msgstr "UID"
-#: ../../Zotlabs/Module/Admin/Channels.php:160
-#: ../../Zotlabs/Module/Locs.php:118 ../../Zotlabs/Module/Connedit.php:920
-#: ../../Zotlabs/Module/Profiles.php:502 ../../Zotlabs/Module/Profiles.php:793
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1143
-msgid "Address"
-msgstr "Dirección"
-
#: ../../Zotlabs/Module/Admin/Channels.php:162
msgid ""
"Selected channels will be deleted!\\n\\nEverything that was posted in these "
@@ -1912,2780 +2384,2350 @@ msgid ""
"channel on this site will be permanently deleted!\\n\\nAre you sure?"
msgstr "El canal {0} va a ser eliminado!\\n\\nTodo lo publicado por el canal en este sitio se borrará definitivamente!\\n\\n¿Está seguro de querer hacerlo?"
-#: ../../Zotlabs/Module/Admin/Dbsync.php:19
-msgid "Update has been marked successful"
-msgstr "La actualización ha sido marcada como exitosa"
-
-#: ../../Zotlabs/Module/Admin/Dbsync.php:29
-#, php-format
-msgid "Executing %s failed. Check system logs."
-msgstr "La ejecución de %s ha fallado. Mirar en los informes del sistema."
-
-#: ../../Zotlabs/Module/Admin/Dbsync.php:32
-#, php-format
-msgid "Update %s was successfully applied."
-msgstr "La actualización de %s se ha realizado exitosamente."
-
-#: ../../Zotlabs/Module/Admin/Dbsync.php:36
-#, php-format
-msgid "Update %s did not return a status. Unknown if it succeeded."
-msgstr "La actualización de %s no ha devuelto ningún estado. No se sabe si ha tenido éxito."
-
-#: ../../Zotlabs/Module/Admin/Dbsync.php:39
-#, php-format
-msgid "Update function %s could not be found."
-msgstr "No se encuentra la función de actualización de %s."
-
-#: ../../Zotlabs/Module/Admin/Dbsync.php:55
-msgid "No failed updates."
-msgstr "No ha fallado ninguna actualización."
-
-#: ../../Zotlabs/Module/Admin/Dbsync.php:59
-msgid "Failed Updates"
-msgstr "Han fallado las actualizaciones"
-
-#: ../../Zotlabs/Module/Admin/Dbsync.php:61
-msgid "Mark success (if update was manually applied)"
-msgstr "Marcar como exitosa (si la actualización se ha hecho manualmente)"
-
-#: ../../Zotlabs/Module/Admin/Dbsync.php:62
-msgid "Attempt to execute this update step automatically"
-msgstr "Intentar ejecutar este paso de actualización automáticamente"
-
-#: ../../Zotlabs/Module/Admin/Queue.php:35
-msgid "Queue Statistics"
-msgstr "Estadísticas de la cola"
-
-#: ../../Zotlabs/Module/Admin/Queue.php:36
-msgid "Total Entries"
-msgstr "Total de entradas"
+#: ../../Zotlabs/Module/Admin/Themes.php:26
+msgid "Theme settings updated."
+msgstr "Ajustes del tema actualizados."
-#: ../../Zotlabs/Module/Admin/Queue.php:37
-msgid "Priority"
-msgstr "Prioridad"
+#: ../../Zotlabs/Module/Admin/Themes.php:61
+msgid "No themes found."
+msgstr "No se han encontrado temas."
-#: ../../Zotlabs/Module/Admin/Queue.php:38
-msgid "Destination URL"
-msgstr "Dirección de destino"
+#: ../../Zotlabs/Module/Admin/Themes.php:116
+msgid "Screenshot"
+msgstr "Instantánea de pantalla"
-#: ../../Zotlabs/Module/Admin/Queue.php:39
-msgid "Mark hub permanently offline"
-msgstr "Marcar el servidor como permanentemente fuera de línea"
+#: ../../Zotlabs/Module/Admin/Themes.php:123
+#: ../../Zotlabs/Module/Admin/Themes.php:157 ../../Zotlabs/Widget/Admin.php:28
+msgid "Themes"
+msgstr "Temas"
-#: ../../Zotlabs/Module/Admin/Queue.php:40
-msgid "Empty queue for this hub"
-msgstr "Vaciar la cola para este servidor"
+#: ../../Zotlabs/Module/Admin/Themes.php:162
+msgid "[Experimental]"
+msgstr "[Experimental]"
-#: ../../Zotlabs/Module/Admin/Queue.php:41
-msgid "Last known contact"
-msgstr "Último contacto conocido"
+#: ../../Zotlabs/Module/Admin/Themes.php:163
+msgid "[Unsupported]"
+msgstr "[No soportado]"
-#: ../../Zotlabs/Module/Admin/Site.php:133
+#: ../../Zotlabs/Module/Admin/Site.php:144
msgid "Site settings updated."
msgstr "Ajustes del sitio actualizados."
-#: ../../Zotlabs/Module/Admin/Site.php:159 ../../include/text.php:2936
+#: ../../Zotlabs/Module/Admin/Site.php:170 ../../include/text.php:2915
msgid "Default"
msgstr "Predeterminado"
-#: ../../Zotlabs/Module/Admin/Site.php:170
+#: ../../Zotlabs/Module/Admin/Site.php:181
#: ../../Zotlabs/Module/Settings/Display.php:137
#, php-format
msgid "%s - (Incompatible)"
msgstr "%s - (Incompatible)"
-#: ../../Zotlabs/Module/Admin/Site.php:177
+#: ../../Zotlabs/Module/Admin/Site.php:188
#: ../../Zotlabs/Module/Settings/Display.php:151
msgid "mobile"
msgstr "móvil"
-#: ../../Zotlabs/Module/Admin/Site.php:179
+#: ../../Zotlabs/Module/Admin/Site.php:190
msgid "experimental"
msgstr "experimental"
-#: ../../Zotlabs/Module/Admin/Site.php:181
+#: ../../Zotlabs/Module/Admin/Site.php:192
msgid "unsupported"
msgstr "no soportado"
-#: ../../Zotlabs/Module/Admin/Site.php:226 ../../Zotlabs/Module/Menu.php:100
-#: ../../Zotlabs/Module/Menu.php:157 ../../Zotlabs/Module/Connedit.php:402
-#: ../../Zotlabs/Module/Connedit.php:786 ../../Zotlabs/Module/Events.php:470
-#: ../../Zotlabs/Module/Events.php:471
-#: ../../Zotlabs/Module/Filestorage.php:160
-#: ../../Zotlabs/Module/Filestorage.php:168
-#: ../../Zotlabs/Module/Photos.php:652 ../../Zotlabs/Module/Mitem.php:162
-#: ../../Zotlabs/Module/Mitem.php:163 ../../Zotlabs/Module/Mitem.php:240
-#: ../../Zotlabs/Module/Mitem.php:241 ../../Zotlabs/Module/Api.php:97
-#: ../../Zotlabs/Module/Removeme.php:63 ../../Zotlabs/Module/Profiles.php:681
-#: ../../Zotlabs/Module/Settings/Channel.php:294
-#: ../../Zotlabs/Module/Settings/Display.php:103
-#: ../../Zotlabs/Module/Wiki.php:179
-#: ../../extend/addon/addon/dwpost/dwpost.php:73
-#: ../../extend/addon/addon/dwpost/dwpost.php:85
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:120
-#: ../../extend/addon/addon/friendica/dfrn_request.php:865
-#: ../../extend/addon/addon/ijpost/ijpost.php:73
-#: ../../extend/addon/addon/ijpost/ijpost.php:85
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:309
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:313
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:343
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:351
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:355
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:359
-#: ../../extend/addon/addon/libertree/libertree.php:69
-#: ../../extend/addon/addon/libertree/libertree.php:81
-#: ../../extend/addon/addon/ljpost/ljpost.php:70
-#: ../../extend/addon/addon/ljpost/ljpost.php:82
-#: ../../extend/addon/addon/nofed/nofed.php:72
-#: ../../extend/addon/addon/nofed/nofed.php:76
-#: ../../extend/addon/addon/nsabait/nsabait.php:157
-#: ../../extend/addon/addon/nsfw/nsfw.php:84
-#: ../../extend/addon/addon/planets/planets.php:153
-#: ../../extend/addon/addon/pumpio/pumpio.php:219
-#: ../../extend/addon/addon/pumpio/pumpio.php:223
-#: ../../extend/addon/addon/pumpio/pumpio.php:227
-#: ../../extend/addon/addon/pumpio/pumpio.php:231
-#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:81
-#: ../../extend/addon/addon/redred/redred.php:95
-#: ../../extend/addon/addon/redred/redred.php:99
-#: ../../extend/addon/addon/rtof/rtof.php:81
-#: ../../extend/addon/addon/rtof/rtof.php:85
-#: ../../extend/addon/addon/smileybutton/smileybutton.php:273
-#: ../../extend/addon/addon/smileybutton/smileybutton.php:277
-#: ../../extend/addon/addon/statusnet/statusnet.php:389
-#: ../../extend/addon/addon/statusnet/statusnet.php:411
-#: ../../extend/addon/addon/statusnet/statusnet.php:415
-#: ../../extend/addon/addon/statusnet/statusnet.php:424
-#: ../../extend/addon/addon/twitter/twitter.php:242
-#: ../../extend/addon/addon/twitter/twitter.php:246
-#: ../../extend/addon/addon/twitter/twitter.php:255
-#: ../../extend/addon/addon/visage/visage.php:166
-#: ../../extend/addon/addon/wppost/wppost.php:82
-#: ../../extend/addon/addon/wppost/wppost.php:105
-#: ../../extend/addon/addon/wppost/wppost.php:109
-#: ../../extend/addon/addon/xmpp/xmpp.php:53
-#: ../../extend/addon/addon/cdav/cdav.php:234
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:164
-#: ../../include/dir_fns.php:143 ../../include/dir_fns.php:144
-#: ../../include/dir_fns.php:145 ../../view/theme/redbasic/php/config.php:111
-#: ../../view/theme/redbasic/php/config.php:136 ../../boot.php:1753
-msgid "No"
-msgstr "No"
-
-#: ../../Zotlabs/Module/Admin/Site.php:227
+#: ../../Zotlabs/Module/Admin/Site.php:238
msgid "Yes - with approval"
msgstr "Sí - con aprobación"
-#: ../../Zotlabs/Module/Admin/Site.php:228 ../../Zotlabs/Module/Menu.php:100
-#: ../../Zotlabs/Module/Menu.php:157 ../../Zotlabs/Module/Connedit.php:402
-#: ../../Zotlabs/Module/Events.php:470 ../../Zotlabs/Module/Events.php:471
-#: ../../Zotlabs/Module/Filestorage.php:160
-#: ../../Zotlabs/Module/Filestorage.php:168
-#: ../../Zotlabs/Module/Photos.php:652 ../../Zotlabs/Module/Mitem.php:162
-#: ../../Zotlabs/Module/Mitem.php:163 ../../Zotlabs/Module/Mitem.php:240
-#: ../../Zotlabs/Module/Mitem.php:241 ../../Zotlabs/Module/Api.php:96
-#: ../../Zotlabs/Module/Removeme.php:63 ../../Zotlabs/Module/Profiles.php:681
-#: ../../Zotlabs/Module/Settings/Channel.php:294
-#: ../../Zotlabs/Module/Settings/Display.php:103
-#: ../../Zotlabs/Module/Wiki.php:179
-#: ../../extend/addon/addon/dwpost/dwpost.php:73
-#: ../../extend/addon/addon/dwpost/dwpost.php:85
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:120
-#: ../../extend/addon/addon/friendica/dfrn_request.php:865
-#: ../../extend/addon/addon/ijpost/ijpost.php:73
-#: ../../extend/addon/addon/ijpost/ijpost.php:85
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:309
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:313
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:343
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:351
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:355
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:359
-#: ../../extend/addon/addon/libertree/libertree.php:69
-#: ../../extend/addon/addon/libertree/libertree.php:81
-#: ../../extend/addon/addon/ljpost/ljpost.php:70
-#: ../../extend/addon/addon/ljpost/ljpost.php:82
-#: ../../extend/addon/addon/nofed/nofed.php:72
-#: ../../extend/addon/addon/nofed/nofed.php:76
-#: ../../extend/addon/addon/nsabait/nsabait.php:157
-#: ../../extend/addon/addon/nsfw/nsfw.php:84
-#: ../../extend/addon/addon/planets/planets.php:153
-#: ../../extend/addon/addon/pumpio/pumpio.php:219
-#: ../../extend/addon/addon/pumpio/pumpio.php:223
-#: ../../extend/addon/addon/pumpio/pumpio.php:227
-#: ../../extend/addon/addon/pumpio/pumpio.php:231
-#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:81
-#: ../../extend/addon/addon/redred/redred.php:95
-#: ../../extend/addon/addon/redred/redred.php:99
-#: ../../extend/addon/addon/rtof/rtof.php:81
-#: ../../extend/addon/addon/rtof/rtof.php:85
-#: ../../extend/addon/addon/smileybutton/smileybutton.php:273
-#: ../../extend/addon/addon/smileybutton/smileybutton.php:277
-#: ../../extend/addon/addon/statusnet/statusnet.php:389
-#: ../../extend/addon/addon/statusnet/statusnet.php:411
-#: ../../extend/addon/addon/statusnet/statusnet.php:415
-#: ../../extend/addon/addon/statusnet/statusnet.php:424
-#: ../../extend/addon/addon/twitter/twitter.php:242
-#: ../../extend/addon/addon/twitter/twitter.php:246
-#: ../../extend/addon/addon/twitter/twitter.php:255
-#: ../../extend/addon/addon/visage/visage.php:166
-#: ../../extend/addon/addon/wppost/wppost.php:82
-#: ../../extend/addon/addon/wppost/wppost.php:105
-#: ../../extend/addon/addon/wppost/wppost.php:109
-#: ../../extend/addon/addon/xmpp/xmpp.php:53
-#: ../../extend/addon/addon/cdav/cdav.php:234
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:164
-#: ../../include/dir_fns.php:143 ../../include/dir_fns.php:144
-#: ../../include/dir_fns.php:145 ../../view/theme/redbasic/php/config.php:111
-#: ../../view/theme/redbasic/php/config.php:136 ../../boot.php:1753
-msgid "Yes"
-msgstr "Sí"
-
-#: ../../Zotlabs/Module/Admin/Site.php:233
+#: ../../Zotlabs/Module/Admin/Site.php:244
msgid "My site is not a public server"
msgstr "Mi sitio no es un servidor público"
-#: ../../Zotlabs/Module/Admin/Site.php:234
+#: ../../Zotlabs/Module/Admin/Site.php:245
msgid "My site has paid access only"
msgstr "Mi sitio es un servicio de pago"
-#: ../../Zotlabs/Module/Admin/Site.php:235
+#: ../../Zotlabs/Module/Admin/Site.php:246
msgid "My site has free access only"
msgstr "Mi sitio es un servicio gratuito"
-#: ../../Zotlabs/Module/Admin/Site.php:236
+#: ../../Zotlabs/Module/Admin/Site.php:247
msgid "My site offers free accounts with optional paid upgrades"
msgstr "Mi sitio ofrece cuentas gratuitas con opciones extra de pago"
-#: ../../Zotlabs/Module/Admin/Site.php:247 ../../Zotlabs/Module/Setup.php:328
-msgid "Basic/Minimal Social Networking"
-msgstr "Red social básica o mínima"
-
-#: ../../Zotlabs/Module/Admin/Site.php:248 ../../Zotlabs/Module/Setup.php:329
-msgid "Standard Configuration (default)"
-msgstr "Configuración estándar (por defecto)"
-
-#: ../../Zotlabs/Module/Admin/Site.php:249 ../../Zotlabs/Module/Setup.php:330
-msgid "Professional"
-msgstr "Profesional"
-
-#: ../../Zotlabs/Module/Admin/Site.php:253 ../../Zotlabs/Lib/Techlevels.php:10
+#: ../../Zotlabs/Module/Admin/Site.php:264 ../../Zotlabs/Lib/Techlevels.php:10
msgid "Beginner/Basic"
msgstr "Principiante / Básico"
-#: ../../Zotlabs/Module/Admin/Site.php:254 ../../Zotlabs/Lib/Techlevels.php:11
+#: ../../Zotlabs/Module/Admin/Site.php:265 ../../Zotlabs/Lib/Techlevels.php:11
msgid "Novice - not skilled but willing to learn"
msgstr "Novato: no cualificado, pero dispuesto a aprender"
-#: ../../Zotlabs/Module/Admin/Site.php:255 ../../Zotlabs/Lib/Techlevels.php:12
+#: ../../Zotlabs/Module/Admin/Site.php:266 ../../Zotlabs/Lib/Techlevels.php:12
msgid "Intermediate - somewhat comfortable"
msgstr "Intermedio: bastante cómodo"
-#: ../../Zotlabs/Module/Admin/Site.php:256 ../../Zotlabs/Lib/Techlevels.php:13
+#: ../../Zotlabs/Module/Admin/Site.php:267 ../../Zotlabs/Lib/Techlevels.php:13
msgid "Advanced - very comfortable"
msgstr "Avanzado: muy cómodo"
-#: ../../Zotlabs/Module/Admin/Site.php:257 ../../Zotlabs/Lib/Techlevels.php:14
+#: ../../Zotlabs/Module/Admin/Site.php:268 ../../Zotlabs/Lib/Techlevels.php:14
msgid "Expert - I can write computer code"
msgstr "Experto: puedo escribir código informático"
-#: ../../Zotlabs/Module/Admin/Site.php:258 ../../Zotlabs/Lib/Techlevels.php:15
+#: ../../Zotlabs/Module/Admin/Site.php:269 ../../Zotlabs/Lib/Techlevels.php:15
msgid "Wizard - I probably know more than you do"
msgstr "Asistente: probablemente sé más que tú"
-#: ../../Zotlabs/Module/Admin/Site.php:267 ../../include/widgets.php:1634
+#: ../../Zotlabs/Module/Admin/Site.php:278 ../../Zotlabs/Widget/Admin.php:22
msgid "Site"
msgstr "Sitio"
-#: ../../Zotlabs/Module/Admin/Site.php:270
+#: ../../Zotlabs/Module/Admin/Site.php:280
+#: ../../Zotlabs/Module/Register.php:253
+msgid "Registration"
+msgstr "Registro"
+
+#: ../../Zotlabs/Module/Admin/Site.php:281
msgid "File upload"
msgstr "Subir fichero"
-#: ../../Zotlabs/Module/Admin/Site.php:271
+#: ../../Zotlabs/Module/Admin/Site.php:282
msgid "Policies"
msgstr "Políticas"
-#: ../../Zotlabs/Module/Admin/Site.php:272
+#: ../../Zotlabs/Module/Admin/Site.php:283
#: ../../include/contact_widgets.php:16
msgid "Advanced"
msgstr "Avanzado"
-#: ../../Zotlabs/Module/Admin/Site.php:276
-#: ../../extend/addon/addon/statusnet/statusnet.php:890
+#: ../../Zotlabs/Module/Admin/Site.php:287
+#: ../../addon/statusnet/statusnet.php:890
msgid "Site name"
msgstr "Nombre del sitio"
-#: ../../Zotlabs/Module/Admin/Site.php:278 ../../Zotlabs/Module/Setup.php:351
-msgid "Server Configuration/Role"
-msgstr "Configuración del servidor"
-
-#: ../../Zotlabs/Module/Admin/Site.php:280
+#: ../../Zotlabs/Module/Admin/Site.php:291
msgid "Site default technical skill level"
msgstr "Nivel de habilidad técnica predeterminado del sitio"
-#: ../../Zotlabs/Module/Admin/Site.php:280
+#: ../../Zotlabs/Module/Admin/Site.php:291
msgid "Used to provide a member experience matched to technical comfort level"
msgstr "Se utiliza para proporcionar una experiencia a los miembros adaptada a su nivel de comodidad técnica"
-#: ../../Zotlabs/Module/Admin/Site.php:282
+#: ../../Zotlabs/Module/Admin/Site.php:293
msgid "Lock the technical skill level setting"
msgstr "Bloquear el ajuste del nivel de habilidad técnica"
-#: ../../Zotlabs/Module/Admin/Site.php:282
+#: ../../Zotlabs/Module/Admin/Site.php:293
msgid "Members can set their own technical comfort level by default"
msgstr "Los miembros pueden configurar su nivel de comodidad técnica por defecto"
-#: ../../Zotlabs/Module/Admin/Site.php:284
+#: ../../Zotlabs/Module/Admin/Site.php:295
msgid "Banner/Logo"
msgstr "Banner/Logo"
-#: ../../Zotlabs/Module/Admin/Site.php:285
+#: ../../Zotlabs/Module/Admin/Site.php:296
msgid "Administrator Information"
msgstr "Información del Administrador"
-#: ../../Zotlabs/Module/Admin/Site.php:285
+#: ../../Zotlabs/Module/Admin/Site.php:296
msgid ""
"Contact information for site administrators. Displayed on siteinfo page. "
"BBCode can be used here"
msgstr "Información de contacto de los administradores del sitio. Visible en la página \"siteinfo\". Se puede usar BBCode"
-#: ../../Zotlabs/Module/Admin/Site.php:286
+#: ../../Zotlabs/Module/Admin/Site.php:297
#: ../../Zotlabs/Module/Siteinfo.php:23
msgid "Site Information"
msgstr "Información sobre el sitio"
-#: ../../Zotlabs/Module/Admin/Site.php:286
+#: ../../Zotlabs/Module/Admin/Site.php:297
msgid ""
"Publicly visible description of this site. Displayed on siteinfo page. "
"BBCode can be used here"
msgstr "Descripción pública de este sitio. Visible en la página \"siteinfo\". Se puede usar BBCode"
-#: ../../Zotlabs/Module/Admin/Site.php:287
+#: ../../Zotlabs/Module/Admin/Site.php:298
msgid "System language"
msgstr "Idioma del sistema"
-#: ../../Zotlabs/Module/Admin/Site.php:288
+#: ../../Zotlabs/Module/Admin/Site.php:299
msgid "System theme"
msgstr "Tema gráfico del sistema"
-#: ../../Zotlabs/Module/Admin/Site.php:288
+#: ../../Zotlabs/Module/Admin/Site.php:299
msgid ""
"Default system theme - may be over-ridden by user profiles - <a href='#' "
"id='cnftheme'>change theme settings</a>"
msgstr "Tema del sistema por defecto - se puede cambiar por cada perfil de usuario - <a href='#' id='cnftheme'>modificar los ajustes del tema</a>"
-#: ../../Zotlabs/Module/Admin/Site.php:289
+#: ../../Zotlabs/Module/Admin/Site.php:300
msgid "Mobile system theme"
msgstr "Tema del sistema para móviles"
-#: ../../Zotlabs/Module/Admin/Site.php:289
+#: ../../Zotlabs/Module/Admin/Site.php:300
msgid "Theme for mobile devices"
msgstr "Tema para dispositivos móviles"
-#: ../../Zotlabs/Module/Admin/Site.php:291
+#: ../../Zotlabs/Module/Admin/Site.php:302
msgid "Allow Feeds as Connections"
msgstr "Permitir contenidos RSS como conexiones"
-#: ../../Zotlabs/Module/Admin/Site.php:291
+#: ../../Zotlabs/Module/Admin/Site.php:302
msgid "(Heavy system resource usage)"
msgstr "(Uso intenso de los recursos del sistema)"
-#: ../../Zotlabs/Module/Admin/Site.php:292
+#: ../../Zotlabs/Module/Admin/Site.php:303
msgid "Maximum image size"
msgstr "Tamaño máximo de la imagen"
-#: ../../Zotlabs/Module/Admin/Site.php:292
+#: ../../Zotlabs/Module/Admin/Site.php:303
msgid ""
"Maximum size in bytes of uploaded images. Default is 0, which means no "
"limits."
msgstr "Tamaño máximo en bytes de la imagen subida. Por defecto, es 0, lo que significa que no hay límites."
-#: ../../Zotlabs/Module/Admin/Site.php:293
+#: ../../Zotlabs/Module/Admin/Site.php:304
msgid "Does this site allow new member registration?"
msgstr "¿Debe este sitio permitir el registro de nuevos miembros?"
-#: ../../Zotlabs/Module/Admin/Site.php:294
+#: ../../Zotlabs/Module/Admin/Site.php:305
msgid "Invitation only"
msgstr "Solo con una invitación"
-#: ../../Zotlabs/Module/Admin/Site.php:294
+#: ../../Zotlabs/Module/Admin/Site.php:305
msgid ""
"Only allow new member registrations with an invitation code. Above register "
"policy must be set to Yes."
msgstr "Solo se permiten inscripciones de nuevos miembros con un código de invitación. Además, deben aceptarse los términos del registro marcando \"Sí\"."
-#: ../../Zotlabs/Module/Admin/Site.php:295
+#: ../../Zotlabs/Module/Admin/Site.php:306
msgid "Which best describes the types of account offered by this hub?"
msgstr "¿Cómo describiría el tipo de servicio ofrecido por este servidor?"
-#: ../../Zotlabs/Module/Admin/Site.php:296
+#: ../../Zotlabs/Module/Admin/Site.php:307
msgid "Register text"
msgstr "Texto del registro"
-#: ../../Zotlabs/Module/Admin/Site.php:296
+#: ../../Zotlabs/Module/Admin/Site.php:307
msgid "Will be displayed prominently on the registration page."
msgstr "Se mostrará de forma destacada en la página de registro."
-#: ../../Zotlabs/Module/Admin/Site.php:297
+#: ../../Zotlabs/Module/Admin/Site.php:308
msgid "Site homepage to show visitors (default: login box)"
msgstr "Página personal que se mostrará a los visitantes (por defecto: la página de identificación)"
-#: ../../Zotlabs/Module/Admin/Site.php:297
+#: ../../Zotlabs/Module/Admin/Site.php:308
msgid ""
"example: 'public' to show public stream, 'page/sys/home' to show a system "
"webpage called 'home' or 'include:home.html' to include a file."
msgstr "ejemplo: 'public' para mostrar contenido público, 'page/sys/home' para mostrar la página web definida como \"home\" o 'include:home.html' para mostrar el contenido de un fichero."
-#: ../../Zotlabs/Module/Admin/Site.php:298
+#: ../../Zotlabs/Module/Admin/Site.php:309
msgid "Preserve site homepage URL"
msgstr "Preservar la dirección de la página personal"
-#: ../../Zotlabs/Module/Admin/Site.php:298
+#: ../../Zotlabs/Module/Admin/Site.php:309
msgid ""
"Present the site homepage in a frame at the original location instead of "
"redirecting"
msgstr "Presenta la página personal del sitio en un marco en la ubicación original, en vez de redirigirla."
-#: ../../Zotlabs/Module/Admin/Site.php:299
+#: ../../Zotlabs/Module/Admin/Site.php:310
msgid "Accounts abandoned after x days"
msgstr "Cuentas abandonadas después de x días"
-#: ../../Zotlabs/Module/Admin/Site.php:299
+#: ../../Zotlabs/Module/Admin/Site.php:310
msgid ""
"Will not waste system resources polling external sites for abandonded "
"accounts. Enter 0 for no time limit."
msgstr "Para evitar consumir recursos del sistema intentando poner al día las cuentas abandonadas. Introduzca 0 para no tener límite de tiempo."
-#: ../../Zotlabs/Module/Admin/Site.php:300
+#: ../../Zotlabs/Module/Admin/Site.php:311
msgid "Allowed friend domains"
msgstr "Dominios amigos permitidos"
-#: ../../Zotlabs/Module/Admin/Site.php:300
+#: ../../Zotlabs/Module/Admin/Site.php:311
msgid ""
"Comma separated list of domains which are allowed to establish friendships "
"with this site. Wildcards are accepted. Empty to allow any domains"
msgstr "Lista separada por comas de dominios a los que está permitido establecer relaciones de amistad con este sitio. Se permiten comodines. Dejar en claro para aceptar cualquier dominio."
-#: ../../Zotlabs/Module/Admin/Site.php:301
+#: ../../Zotlabs/Module/Admin/Site.php:312
msgid "Verify Email Addresses"
msgstr "Verificar las direcciones de correo electrónico"
-#: ../../Zotlabs/Module/Admin/Site.php:301
+#: ../../Zotlabs/Module/Admin/Site.php:312
msgid ""
"Check to verify email addresses used in account registration (recommended)."
msgstr "Activar para la verificación de la dirección de correo electrónico en el registro de una cuenta (recomendado)."
-#: ../../Zotlabs/Module/Admin/Site.php:302
+#: ../../Zotlabs/Module/Admin/Site.php:313
msgid "Force publish"
msgstr "Forzar la publicación"
-#: ../../Zotlabs/Module/Admin/Site.php:302
+#: ../../Zotlabs/Module/Admin/Site.php:313
msgid ""
"Check to force all profiles on this site to be listed in the site directory."
msgstr "Intentar forzar todos los perfiles para que sean listados en el directorio de este sitio."
-#: ../../Zotlabs/Module/Admin/Site.php:303
+#: ../../Zotlabs/Module/Admin/Site.php:314
msgid "Import Public Streams"
msgstr "Importar contenido público"
-#: ../../Zotlabs/Module/Admin/Site.php:303
+#: ../../Zotlabs/Module/Admin/Site.php:314
msgid ""
"Import and allow access to public content pulled from other sites. Warning: "
"this content is unmoderated."
msgstr "Importar y permitir acceso al contenido público sacado de otros sitios. Advertencia: este contenido no está moderado, por lo que podría encontrar cosas inapropiadas u ofensivas."
-#: ../../Zotlabs/Module/Admin/Site.php:304
+#: ../../Zotlabs/Module/Admin/Site.php:315
msgid "Login on Homepage"
msgstr "Iniciar sesión en la página personal"
-#: ../../Zotlabs/Module/Admin/Site.php:304
+#: ../../Zotlabs/Module/Admin/Site.php:315
msgid ""
"Present a login box to visitors on the home page if no other content has "
"been configured."
msgstr "Presentar a los visitantes una casilla de identificación en la página de inicio, si no se ha configurado otro tipo de contenido."
-#: ../../Zotlabs/Module/Admin/Site.php:305
+#: ../../Zotlabs/Module/Admin/Site.php:316
msgid "Enable context help"
msgstr "Habilitar la ayuda contextual"
-#: ../../Zotlabs/Module/Admin/Site.php:305
+#: ../../Zotlabs/Module/Admin/Site.php:316
msgid ""
"Display contextual help for the current page when the help button is "
"pressed."
msgstr "Ver la ayuda contextual para la página actual cuando se pulse el botón de Ayuda."
-#: ../../Zotlabs/Module/Admin/Site.php:307
+#: ../../Zotlabs/Module/Admin/Site.php:318
+msgid "Reply-to email address for system generated email."
+msgstr "Dirección de respuesta para el correo electrónico generado por el sistema."
+
+#: ../../Zotlabs/Module/Admin/Site.php:319
+msgid "Sender (From) email address for system generated email."
+msgstr "Dirección del remitente (From) para el correo electrónico generado por el sistema."
+
+#: ../../Zotlabs/Module/Admin/Site.php:320
+msgid "Name of email sender for system generated email."
+msgstr "Nombre del remitente del correo electrónico generado por el sistema."
+
+#: ../../Zotlabs/Module/Admin/Site.php:322
msgid "Directory Server URL"
msgstr "URL del servidor de directorio"
-#: ../../Zotlabs/Module/Admin/Site.php:307
+#: ../../Zotlabs/Module/Admin/Site.php:322
msgid "Default directory server"
msgstr "Servidor de directorio predeterminado"
-#: ../../Zotlabs/Module/Admin/Site.php:309
+#: ../../Zotlabs/Module/Admin/Site.php:324
msgid "Proxy user"
msgstr "Usuario del proxy"
-#: ../../Zotlabs/Module/Admin/Site.php:310
+#: ../../Zotlabs/Module/Admin/Site.php:325
msgid "Proxy URL"
msgstr "Dirección del proxy"
-#: ../../Zotlabs/Module/Admin/Site.php:311
+#: ../../Zotlabs/Module/Admin/Site.php:326
msgid "Network timeout"
msgstr "Tiempo de espera de la red"
-#: ../../Zotlabs/Module/Admin/Site.php:311
+#: ../../Zotlabs/Module/Admin/Site.php:326
msgid "Value is in seconds. Set to 0 for unlimited (not recommended)."
msgstr "Valor en segundos. Poner a 0 para que no haya tiempo límite (no recomendado)"
-#: ../../Zotlabs/Module/Admin/Site.php:312
+#: ../../Zotlabs/Module/Admin/Site.php:327
msgid "Delivery interval"
msgstr "Intervalo de entrega"
-#: ../../Zotlabs/Module/Admin/Site.php:312
+#: ../../Zotlabs/Module/Admin/Site.php:327
msgid ""
"Delay background delivery processes by this many seconds to reduce system "
"load. Recommend: 4-5 for shared hosts, 2-3 for virtual private servers. 0-1 "
"for large dedicated servers."
msgstr "Retrasar los procesos de transmisión en segundo plano por esta cantidad de segundos para reducir la carga del sistema. Recomendado: 4-5 para sitios compartidos, 2-3 para servidores virtuales privados, 0-1 para grandes servidores dedicados."
-#: ../../Zotlabs/Module/Admin/Site.php:313
+#: ../../Zotlabs/Module/Admin/Site.php:328
msgid "Deliveries per process"
msgstr "Intentos de envío por proceso"
-#: ../../Zotlabs/Module/Admin/Site.php:313
+#: ../../Zotlabs/Module/Admin/Site.php:328
msgid ""
"Number of deliveries to attempt in a single operating system process. Adjust"
" if necessary to tune system performance. Recommend: 1-5."
msgstr "Numero de envíos a intentar en un único proceso del sistema operativo. Ajustar si es necesario mejorar el rendimiento. Se recomienda: 1-5."
-#: ../../Zotlabs/Module/Admin/Site.php:314
+#: ../../Zotlabs/Module/Admin/Site.php:329
msgid "Poll interval"
msgstr "Intervalo máximo de tiempo entre dos mensajes sucesivos"
-#: ../../Zotlabs/Module/Admin/Site.php:314
+#: ../../Zotlabs/Module/Admin/Site.php:329
msgid ""
"Delay background polling processes by this many seconds to reduce system "
"load. If 0, use delivery interval."
msgstr "Retrasar el intervalo de envío en segundo plano, en esta cantidad de segundos, para reducir la carga del sistema. Si es 0, usar el intervalo de entrega."
-#: ../../Zotlabs/Module/Admin/Site.php:315
+#: ../../Zotlabs/Module/Admin/Site.php:330
msgid "Maximum Load Average"
msgstr "Carga media máxima"
-#: ../../Zotlabs/Module/Admin/Site.php:315
+#: ../../Zotlabs/Module/Admin/Site.php:330
msgid ""
"Maximum system load before delivery and poll processes are deferred - "
"default 50."
msgstr "Carga máxima del sistema antes de que los procesos de entrega y envío se hayan retardado - por defecto, 50."
-#: ../../Zotlabs/Module/Admin/Site.php:316
+#: ../../Zotlabs/Module/Admin/Site.php:331
msgid "Expiration period in days for imported (grid/network) content"
msgstr "Caducidad del contenido importado de otros sitios (en días)"
-#: ../../Zotlabs/Module/Admin/Site.php:316
+#: ../../Zotlabs/Module/Admin/Site.php:331
msgid "0 for no expiration of imported content"
msgstr "0 para que no caduque el contenido importado"
-#: ../../Zotlabs/Module/Admin/Plugins.php:289
-#, php-format
-msgid "Plugin %s disabled."
-msgstr "Extensión %s desactivada."
+#: ../../Zotlabs/Module/Admin/Profs.php:69
+msgid "New Profile Field"
+msgstr "Nuevo campo en el perfil"
-#: ../../Zotlabs/Module/Admin/Plugins.php:294
-#, php-format
-msgid "Plugin %s enabled."
-msgstr "Extensión %s activada."
+#: ../../Zotlabs/Module/Admin/Profs.php:70
+#: ../../Zotlabs/Module/Admin/Profs.php:90
+msgid "Field nickname"
+msgstr "Alias del campo"
-#: ../../Zotlabs/Module/Admin/Plugins.php:310
-#: ../../Zotlabs/Module/Admin/Themes.php:95
-msgid "Disable"
-msgstr "Desactivar"
+#: ../../Zotlabs/Module/Admin/Profs.php:70
+#: ../../Zotlabs/Module/Admin/Profs.php:90
+msgid "System name of field"
+msgstr "Nombre del campo en el sistema"
-#: ../../Zotlabs/Module/Admin/Plugins.php:313
-#: ../../Zotlabs/Module/Admin/Themes.php:97
-msgid "Enable"
-msgstr "Activar"
+#: ../../Zotlabs/Module/Admin/Profs.php:71
+#: ../../Zotlabs/Module/Admin/Profs.php:91
+msgid "Input type"
+msgstr "Tipo de entrada"
-#: ../../Zotlabs/Module/Admin/Plugins.php:342
-#: ../../Zotlabs/Module/Admin/Plugins.php:437 ../../include/widgets.php:1639
-msgid "Plugins"
-msgstr "Extensiones (plugins)"
+#: ../../Zotlabs/Module/Admin/Profs.php:72
+#: ../../Zotlabs/Module/Admin/Profs.php:92
+msgid "Field Name"
+msgstr "Nombre del campo"
-#: ../../Zotlabs/Module/Admin/Plugins.php:343
-#: ../../Zotlabs/Module/Admin/Themes.php:124
-msgid "Toggle"
-msgstr "Cambiar"
+#: ../../Zotlabs/Module/Admin/Profs.php:72
+#: ../../Zotlabs/Module/Admin/Profs.php:92
+msgid "Label on profile pages"
+msgstr "Etiqueta a mostrar en la página del perfil"
-#: ../../Zotlabs/Module/Admin/Plugins.php:344
-#: ../../Zotlabs/Module/Admin/Themes.php:125 ../../Zotlabs/Lib/Apps.php:223
-#: ../../include/widgets.php:685 ../../include/nav.php:225
-msgid "Settings"
-msgstr "Ajustes"
+#: ../../Zotlabs/Module/Admin/Profs.php:73
+#: ../../Zotlabs/Module/Admin/Profs.php:93
+msgid "Help text"
+msgstr "Texto de ayuda"
-#: ../../Zotlabs/Module/Admin/Plugins.php:351
-#: ../../Zotlabs/Module/Admin/Themes.php:134
-msgid "Author: "
-msgstr "Autor:"
+#: ../../Zotlabs/Module/Admin/Profs.php:73
+#: ../../Zotlabs/Module/Admin/Profs.php:93
+msgid "Additional info (optional)"
+msgstr "Información adicional (opcional)"
-#: ../../Zotlabs/Module/Admin/Plugins.php:352
-#: ../../Zotlabs/Module/Admin/Themes.php:135
-msgid "Maintainer: "
-msgstr "Mantenedor:"
+#: ../../Zotlabs/Module/Admin/Profs.php:74
+#: ../../Zotlabs/Module/Admin/Profs.php:94 ../../Zotlabs/Module/Rbmark.php:32
+#: ../../Zotlabs/Module/Rbmark.php:104 ../../Zotlabs/Module/Filer.php:53
+#: ../../Zotlabs/Widget/Notes.php:18 ../../include/text.php:1028
+#: ../../include/text.php:1040
+msgid "Save"
+msgstr "Guardar"
-#: ../../Zotlabs/Module/Admin/Plugins.php:353
-msgid "Minimum project version: "
-msgstr "Versión mínima del proyecto:"
+#: ../../Zotlabs/Module/Admin/Profs.php:83
+msgid "Field definition not found"
+msgstr "Definición del campo no encontrada"
-#: ../../Zotlabs/Module/Admin/Plugins.php:354
-msgid "Maximum project version: "
-msgstr "Versión máxima del proyecto:"
+#: ../../Zotlabs/Module/Admin/Profs.php:89
+msgid "Edit Profile Field"
+msgstr "Modificar el campo del perfil"
-#: ../../Zotlabs/Module/Admin/Plugins.php:355
-msgid "Minimum PHP version: "
-msgstr "Versión mínima de PHP:"
+#: ../../Zotlabs/Module/Admin/Profs.php:147 ../../Zotlabs/Widget/Admin.php:30
+msgid "Profile Fields"
+msgstr "Campos del perfil"
-#: ../../Zotlabs/Module/Admin/Plugins.php:356
-msgid "Compatible Server Roles: "
-msgstr "Configuraciones compatibles con este servidor:"
+#: ../../Zotlabs/Module/Admin/Profs.php:148
+msgid "Basic Profile Fields"
+msgstr "Campos básicos del perfil"
-#: ../../Zotlabs/Module/Admin/Plugins.php:357
-msgid "Requires: "
-msgstr "Se requiere:"
+#: ../../Zotlabs/Module/Admin/Profs.php:149
+msgid "Advanced Profile Fields"
+msgstr "Campos avanzados del perfil"
-#: ../../Zotlabs/Module/Admin/Plugins.php:358
-#: ../../Zotlabs/Module/Admin/Plugins.php:442
-msgid "Disabled - version incompatibility"
-msgstr "Deshabilitado - versiones incompatibles"
+#: ../../Zotlabs/Module/Admin/Profs.php:149
+msgid "(In addition to basic fields)"
+msgstr "(Además de los campos básicos)"
-#: ../../Zotlabs/Module/Admin/Plugins.php:411
-msgid "Enter the public git repository URL of the plugin repo."
-msgstr "Escriba la URL pública del repositorio git del plugin."
+#: ../../Zotlabs/Module/Admin/Profs.php:151
+msgid "All available fields"
+msgstr "Todos los campos disponibles"
-#: ../../Zotlabs/Module/Admin/Plugins.php:412
-msgid "Plugin repo git URL"
-msgstr "URL del repositorio git del plugin"
+#: ../../Zotlabs/Module/Admin/Profs.php:152
+msgid "Custom Fields"
+msgstr "Campos personalizados"
-#: ../../Zotlabs/Module/Admin/Plugins.php:413
-msgid "Custom repo name"
-msgstr "Nombre personalizado del repositorio"
+#: ../../Zotlabs/Module/Admin/Profs.php:156
+msgid "Create Custom Field"
+msgstr "Crear un campo personalizado"
-#: ../../Zotlabs/Module/Admin/Plugins.php:413
-msgid "(optional)"
-msgstr "(opcional)"
+#: ../../Zotlabs/Module/Admin/Account_edit.php:29
+#, php-format
+msgid "Password changed for account %d."
+msgstr "Ha cambiado la contraseña para la cuenta %d."
-#: ../../Zotlabs/Module/Admin/Plugins.php:414
-msgid "Download Plugin Repo"
-msgstr "Descargar el repositorio"
+#: ../../Zotlabs/Module/Admin/Account_edit.php:46
+msgid "Account settings updated."
+msgstr "Se han actualizado los ajustes de la cuenta."
-#: ../../Zotlabs/Module/Admin/Plugins.php:421
-msgid "Install new repo"
-msgstr "Instalar un nuevo repositorio"
+#: ../../Zotlabs/Module/Admin/Account_edit.php:61
+msgid "Account not found."
+msgstr "No se ha encontrado la cuenta."
-#: ../../Zotlabs/Module/Admin/Plugins.php:422 ../../Zotlabs/Lib/Apps.php:348
-msgid "Install"
-msgstr "Instalar"
+#: ../../Zotlabs/Module/Admin/Account_edit.php:68
+msgid "Account Edit"
+msgstr "Editar la cuenta"
-#: ../../Zotlabs/Module/Admin/Plugins.php:423
-#: ../../Zotlabs/Module/Connedit.php:931 ../../Zotlabs/Module/Fbrowser.php:66
-#: ../../Zotlabs/Module/Fbrowser.php:88 ../../Zotlabs/Module/Profiles.php:804
-#: ../../Zotlabs/Module/Settings/Oauth.php:88
-#: ../../Zotlabs/Module/Settings/Oauth.php:114
-#: ../../Zotlabs/Module/Tagrm.php:15 ../../Zotlabs/Module/Tagrm.php:138
-#: ../../Zotlabs/Module/Wiki.php:261 ../../Zotlabs/Module/Wiki.php:286
-#: ../../extend/addon/addon/friendica/dfrn_request.php:879
-#: ../../extend/addon/addon/js_upload/js_upload.php:46
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:866
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1154
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:243
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:266
-#: ../../include/conversation.php:1394 ../../include/conversation.php:1443
-msgid "Cancel"
-msgstr "Cancelar"
+#: ../../Zotlabs/Module/Admin/Account_edit.php:69
+msgid "New Password"
+msgstr "Nueva contraseña"
-#: ../../Zotlabs/Module/Admin/Plugins.php:445
-msgid "Manage Repos"
-msgstr "Gestionar los repositorios"
+#: ../../Zotlabs/Module/Admin/Account_edit.php:70
+msgid "New Password again"
+msgstr "Nueva contraseña otra vez"
-#: ../../Zotlabs/Module/Admin/Plugins.php:446
-msgid "Installed Plugin Repositories"
-msgstr "Repositorios de los plugins instalados"
+#: ../../Zotlabs/Module/Admin/Account_edit.php:71
+msgid "Technical skill level"
+msgstr "Nivel de habilidad técnica"
-#: ../../Zotlabs/Module/Admin/Plugins.php:447
-msgid "Install a New Plugin Repository"
-msgstr "Instalar un nuevo repositorio de plugins"
+#: ../../Zotlabs/Module/Admin/Account_edit.php:72
+msgid "Account language (for emails)"
+msgstr "Idioma de la cuenta (para los correos electrónicos)"
-#: ../../Zotlabs/Module/Admin/Plugins.php:453
-#: ../../Zotlabs/Module/Connedit.php:929 ../../Zotlabs/Module/Profiles.php:802
-#: ../../Zotlabs/Module/Settings/Oauth.php:42
-#: ../../Zotlabs/Module/Settings/Oauth.php:113 ../../Zotlabs/Lib/Apps.php:348
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1152
-msgid "Update"
-msgstr "Actualizar"
+#: ../../Zotlabs/Module/Admin/Account_edit.php:73
+msgid "Service class"
+msgstr "Clase de servicio"
-#: ../../Zotlabs/Module/Admin/Plugins.php:454
-msgid "Switch branch"
-msgstr "Cambiar la rama"
+#: ../../Zotlabs/Module/Admin/Security.php:77
+msgid ""
+"By default, unfiltered HTML is allowed in embedded media. This is inherently"
+" insecure."
+msgstr "De forma predeterminada, el HTML sin filtrar está permitido en el contenido multimedia incorporado en una publicación. Esto es siempre inseguro."
-#: ../../Zotlabs/Module/Admin/Plugins.php:455
-#: ../../Zotlabs/Module/Photos.php:984 ../../Zotlabs/Module/Tagrm.php:137
-#: ../../extend/addon/addon/superblock/superblock.php:116
-msgid "Remove"
-msgstr "Eliminar"
+#: ../../Zotlabs/Module/Admin/Security.php:80
+msgid ""
+"The recommended setting is to only allow unfiltered HTML from the following "
+"sites:"
+msgstr "La configuración recomendada es que sólo se permita HTML sin filtrar desde los siguientes sitios: "
-#: ../../Zotlabs/Module/Admin/Themes.php:26
-msgid "Theme settings updated."
-msgstr "Ajustes del tema actualizados."
+#: ../../Zotlabs/Module/Admin/Security.php:81
+msgid ""
+"https://youtube.com/<br />https://www.youtube.com/<br />https://youtu.be/<br"
+" />https://vimeo.com/<br />https://soundcloud.com/<br />"
+msgstr "https://youtube.com/<br />https://www.youtube.com/<br />https://youtu.be/<br />https://vimeo.com/<br />https://soundcloud.com/<br />"
-#: ../../Zotlabs/Module/Admin/Themes.php:61
-msgid "No themes found."
-msgstr "No se han encontrado temas."
+#: ../../Zotlabs/Module/Admin/Security.php:82
+msgid ""
+"All other embedded content will be filtered, <strong>unless</strong> "
+"embedded content from that site is explicitly blocked."
+msgstr "El resto del contenido incrustado se filtrará, <strong>excepto</ strong> si el contenido incorporado desde ese sitio está bloqueado de forma explícita."
-#: ../../Zotlabs/Module/Admin/Themes.php:116
-msgid "Screenshot"
-msgstr "Instantánea de pantalla"
+#: ../../Zotlabs/Module/Admin/Security.php:87
+#: ../../Zotlabs/Widget/Admin.php:25
+msgid "Security"
+msgstr "Seguridad"
-#: ../../Zotlabs/Module/Admin/Themes.php:123
-#: ../../Zotlabs/Module/Admin/Themes.php:157 ../../include/widgets.php:1640
-msgid "Themes"
-msgstr "Temas"
+#: ../../Zotlabs/Module/Admin/Security.php:89
+msgid "Block public"
+msgstr "Bloquear páginas públicas"
-#: ../../Zotlabs/Module/Admin/Themes.php:162
-msgid "[Experimental]"
-msgstr "[Experimental]"
+#: ../../Zotlabs/Module/Admin/Security.php:89
+msgid ""
+"Check to block public access to all otherwise public personal pages on this "
+"site unless you are currently authenticated."
+msgstr "Habilitar para impedir ver las páginas personales de este sitio a quien no esté actualmente autenticado."
-#: ../../Zotlabs/Module/Admin/Themes.php:163
-msgid "[Unsupported]"
-msgstr "[No soportado]"
+#: ../../Zotlabs/Module/Admin/Security.php:90
+msgid "Set \"Transport Security\" HTTP header"
+msgstr "Habilitar \"Seguridad de transporte\" (\"Transport Security\") en la cabecera HTTP"
-#: ../../Zotlabs/Module/Uexport.php:57 ../../Zotlabs/Module/Uexport.php:58
-msgid "Export Channel"
-msgstr "Exportar el canal"
+#: ../../Zotlabs/Module/Admin/Security.php:91
+msgid "Set \"Content Security Policy\" HTTP header"
+msgstr "Habilitar la \"Política de seguridad del contenido\" (\"Content Security Policy\") en la cabecera HTTP"
-#: ../../Zotlabs/Module/Uexport.php:59
+#: ../../Zotlabs/Module/Admin/Security.php:92
+msgid "Allowed email domains"
+msgstr "Se aceptan dominios de correo electrónico"
+
+#: ../../Zotlabs/Module/Admin/Security.php:92
msgid ""
-"Export your basic channel information to a file. This acts as a backup of "
-"your connections, permissions, profile and basic data, which can be used to "
-"import your data to a new server hub, but does not contain your content."
-msgstr "Exportar la información básica del canal a un fichero. Este equivale a una copia de seguridad de sus conexiones, el perfil y datos fundamentales, que puede usarse para importar sus datos a un nuevo servidor, pero no incluye su contenido."
+"Comma separated list of domains which are allowed in email addresses for "
+"registrations to this site. Wildcards are accepted. Empty to allow any "
+"domains"
+msgstr "Lista separada por comas de los dominios de los que se acepta una dirección de correo electrónico para registros en este sitio. Se permiten comodines. Dejar en claro para aceptar cualquier dominio. "
-#: ../../Zotlabs/Module/Uexport.php:60
-msgid "Export Content"
-msgstr "Exportar contenidos"
+#: ../../Zotlabs/Module/Admin/Security.php:93
+msgid "Not allowed email domains"
+msgstr "No se permiten dominios de correo electrónico"
-#: ../../Zotlabs/Module/Uexport.php:61
+#: ../../Zotlabs/Module/Admin/Security.php:93
msgid ""
-"Export your channel information and recent content to a JSON backup that can"
-" be restored or imported to another server hub. This backs up all of your "
-"connections, permissions, profile data and several months of posts. This "
-"file may be VERY large. Please be patient - it may take several minutes for"
-" this download to begin."
-msgstr "Exportar la información sobre su canal y el contenido reciente a un fichero de respaldo JSON, que puede ser restaurado o importado a otro servidor. Este fichero incluye todas sus conexiones, permisos, datos del perfil y publicaciones de varios meses. Puede llegar a ser MUY grande. Por favor, sea paciente, la descarga puede tardar varios minutos en comenzar."
+"Comma separated list of domains which are not allowed in email addresses for"
+" registrations to this site. Wildcards are accepted. Empty to allow any "
+"domains, unless allowed domains have been defined."
+msgstr "Lista separada por comas de los dominios de los que no se acepta una dirección de correo electrónico para registros en este sitio. Se permiten comodines. Dejar en claro para no aceptar cualquier dominio, excepto los que se hayan autorizado."
-#: ../../Zotlabs/Module/Uexport.php:63
-msgid "Export your posts from a given year."
-msgstr "Exporta sus publicaciones de un año dado."
+#: ../../Zotlabs/Module/Admin/Security.php:94
+msgid "Allow communications only from these sites"
+msgstr "Permitir la comunicación solo desde estos sitios"
-#: ../../Zotlabs/Module/Uexport.php:65
+#: ../../Zotlabs/Module/Admin/Security.php:94
msgid ""
-"You may also export your posts and conversations for a particular year or "
-"month. Adjust the date in your browser location bar to select other dates. "
-"If the export fails (possibly due to memory exhaustion on your server hub), "
-"please try again selecting a more limited date range."
-msgstr "También puede exportar sus mensajes y conversaciones durante un año o mes en particular. Ajuste la fecha en la barra de direcciones del navegador para seleccionar otras fechas. Si la exportación falla (posiblemente debido al agotamiento de la memoria del servidor hub), por favor, intente de nuevo la selección de un rango de fechas más pequeño."
+"One site per line. Leave empty to allow communication from anywhere by "
+"default"
+msgstr "Un sitio por línea. Dejar en blanco para permitir por defecto la comunicación desde cualquiera"
-#: ../../Zotlabs/Module/Uexport.php:66
-#, php-format
+#: ../../Zotlabs/Module/Admin/Security.php:95
+msgid "Block communications from these sites"
+msgstr "Bloquear la comunicación desde estos sitios"
+
+#: ../../Zotlabs/Module/Admin/Security.php:96
+msgid "Allow communications only from these channels"
+msgstr "Permitir la comunicación solo desde estos canales"
+
+#: ../../Zotlabs/Module/Admin/Security.php:96
msgid ""
-"To select all posts for a given year, such as this year, visit <a "
-"href=\"%1$s\">%2$s</a>"
-msgstr "Para seleccionar todos los mensajes de un año determinado, como este año, visite <a href=\"%1$s\">%2$s</a>"
+"One channel (hash) per line. Leave empty to allow from any channel by "
+"default"
+msgstr "Un canal (hash) por línea. Dejar en blanco para permitir por defecto la comunicación desde cualquiera"
-#: ../../Zotlabs/Module/Uexport.php:67
-#, php-format
+#: ../../Zotlabs/Module/Admin/Security.php:97
+msgid "Block communications from these channels"
+msgstr "Bloquear la comunicación desde estos canales"
+
+#: ../../Zotlabs/Module/Admin/Security.php:98
+msgid "Only allow embeds from secure (SSL) websites and links."
+msgstr "Sólo se permite contenido multimedia incorporado desde sitios y enlaces seguros (SSL)."
+
+#: ../../Zotlabs/Module/Admin/Security.php:99
+msgid "Allow unfiltered embedded HTML content only from these domains"
+msgstr "Permitir contenido HTML sin filtrar sólo desde estos dominios "
+
+#: ../../Zotlabs/Module/Admin/Security.php:99
+msgid "One site per line. By default embedded content is filtered."
+msgstr "Un sitio por línea. El contenido incorporado se filtra de forma predeterminada."
+
+#: ../../Zotlabs/Module/Admin/Security.php:100
+msgid "Block embedded HTML from these domains"
+msgstr "Bloquear contenido con HTML incorporado desde estos dominios"
+
+#: ../../Zotlabs/Module/Events.php:475
+msgid "Edit Location"
+msgstr "Modificar la dirección"
+
+#: ../../Zotlabs/Module/Events.php:478 ../../Zotlabs/Module/Photos.php:1094
+#: ../../Zotlabs/Module/Webpages.php:251 ../../Zotlabs/Lib/ThreadItem.php:740
+#: ../../include/page_widgets.php:43 ../../include/conversation.php:1347
+msgid "Preview"
+msgstr "Previsualizar"
+
+#: ../../Zotlabs/Module/Lockview.php:117 ../../Zotlabs/Module/Lockview.php:153
+#: ../../Zotlabs/Module/Acl.php:117 ../../include/acl_selectors.php:183
+msgctxt "acl"
+msgid "Profile"
+msgstr "Perfil"
+
+#: ../../Zotlabs/Module/Settings/Permcats.php:37
+msgid "Permission category saved."
+msgstr "Se ha guardado la categoría del permiso."
+
+#: ../../Zotlabs/Module/Settings/Permcats.php:61
msgid ""
-"To select all posts for a given month, such as January of this year, visit "
-"<a href=\"%1$s\">%2$s</a>"
-msgstr "Para seleccionar todos los mensajes de un mes determinado, como el de enero de este año, visite <a href=\"%1$s\">%2$s</a>"
+"Use this form to create permission rules for various classes of people or "
+"connections."
+msgstr "Utilice este formulario para crear reglas de permiso para varias clases de personas o conexiones."
-#: ../../Zotlabs/Module/Uexport.php:68
-#, php-format
+#: ../../Zotlabs/Module/Settings/Permcats.php:94
+msgid "Permission Categories"
+msgstr "Categorías de autorización"
+
+#: ../../Zotlabs/Module/Settings/Permcats.php:102
+msgid "Permission Name"
+msgstr "Nombre de la autorización"
+
+#: ../../Zotlabs/Module/Settings/Permcats.php:103
+#: ../../Zotlabs/Module/Settings/Tokens.php:161
+#: ../../Zotlabs/Module/Connedit.php:886
+msgid "My Settings"
+msgstr "Mis ajustes"
+
+#: ../../Zotlabs/Module/Settings/Permcats.php:105
+#: ../../Zotlabs/Module/Settings/Tokens.php:163
+#: ../../Zotlabs/Module/Connedit.php:881
+msgid "inherited"
+msgstr "heredado"
+
+#: ../../Zotlabs/Module/Settings/Permcats.php:108
+#: ../../Zotlabs/Module/Settings/Tokens.php:166
+#: ../../Zotlabs/Module/Connedit.php:888
+msgid "Individual Permissions"
+msgstr "Permisos individuales"
+
+#: ../../Zotlabs/Module/Settings/Permcats.php:109
+#: ../../Zotlabs/Module/Settings/Tokens.php:167
+#: ../../Zotlabs/Module/Connedit.php:889
msgid ""
-"These content files may be imported or restored by visiting <a "
-"href=\"%1$s\">%2$s</a> on any site containing your channel. For best results"
-" please import or restore these in date order (oldest first)."
-msgstr "Estos ficheros pueden ser importados o restaurados visitando <a href=\"%1$s\">%2$s</a> o cualquier sitio que contenga su canal. Para obtener los mejores resultados, por favor, importar o restaurar estos ficheros en orden de fecha (la más antigua primero)."
+"Some permissions may be inherited from your channel's <a "
+"href=\"settings\"><strong>privacy settings</strong></a>, which have higher "
+"priority than individual settings. You can <strong>not</strong> change those"
+" settings here."
+msgstr "Algunos permisos pueden ser heredados de los <a href=\"settings\"><strong>ajustes de privacidad</strong></a> de sus canales, los cuales tienen una prioridad más alta que los ajustes individuales. <strong>No</strong> puede cambiar estos ajustes aquí."
-#: ../../Zotlabs/Module/Editlayout.php:127
-#: ../../Zotlabs/Module/Layouts.php:128 ../../Zotlabs/Module/Layouts.php:188
-msgid "Layout Name"
-msgstr "Nombre de la plantilla"
+#: ../../Zotlabs/Module/Settings/Channel.php:62
+#: ../../Zotlabs/Module/Settings/Channel.php:66
+#: ../../Zotlabs/Module/Settings/Channel.php:67
+#: ../../Zotlabs/Module/Settings/Channel.php:70
+#: ../../Zotlabs/Module/Settings/Channel.php:81
+#: ../../Zotlabs/Module/Connedit.php:707 ../../Zotlabs/Widget/Affinity.php:28
+#: ../../include/selectors.php:123 ../../include/channel.php:406
+#: ../../include/channel.php:407 ../../include/channel.php:414
+msgid "Friends"
+msgstr "Amigos/as"
-#: ../../Zotlabs/Module/Editlayout.php:128
-#: ../../Zotlabs/Module/Layouts.php:131
-msgid "Layout Description (Optional)"
-msgstr "Descripción de la plantilla (opcional)"
+#: ../../Zotlabs/Module/Settings/Channel.php:251
+#: ../../addon/rendezvous/rendezvous.php:82
+#: ../../addon/openstreetmap/openstreetmap.php:184
+#: ../../addon/msgfooter/msgfooter.php:54 ../../addon/logrot/logrot.php:54
+#: ../../addon/twitter/twitter.php:766 ../../addon/piwik/piwik.php:116
+#: ../../addon/xmpp/xmpp.php:102
+msgid "Settings updated."
+msgstr "Ajustes actualizados."
-#: ../../Zotlabs/Module/Editlayout.php:136
-msgid "Edit Layout"
-msgstr "Modificar la plantilla"
+#: ../../Zotlabs/Module/Settings/Channel.php:312
+msgid "Nobody except yourself"
+msgstr "Nadie excepto usted"
-#: ../../Zotlabs/Module/Editwebpage.php:142
-msgid "Page link"
-msgstr "Enlace de la página"
+#: ../../Zotlabs/Module/Settings/Channel.php:313
+msgid "Only those you specifically allow"
+msgstr "Solo aquellos a los que usted permita explícitamente"
-#: ../../Zotlabs/Module/Editwebpage.php:169
-msgid "Edit Webpage"
-msgstr "Editar la página web"
+#: ../../Zotlabs/Module/Settings/Channel.php:314
+msgid "Approved connections"
+msgstr "Conexiones aprobadas"
-#: ../../Zotlabs/Module/Apps.php:45 ../../include/nav.php:178
-msgid "Apps"
-msgstr "Aplicaciones (apps)"
+#: ../../Zotlabs/Module/Settings/Channel.php:315
+msgid "Any connections"
+msgstr "Cualquier conexión"
-#: ../../Zotlabs/Module/Apps.php:48
-msgid "Manage apps"
-msgstr "Gestionar las aplicaciones"
+#: ../../Zotlabs/Module/Settings/Channel.php:316
+msgid "Anybody on this website"
+msgstr "Cualquiera en este sitio web"
-#: ../../Zotlabs/Module/Apps.php:49
-msgid "Create new app"
-msgstr "Crear una nueva aplicación"
+#: ../../Zotlabs/Module/Settings/Channel.php:317
+msgid "Anybody in this network"
+msgstr "Cualquiera en esta red"
-#: ../../Zotlabs/Module/Dirsearch.php:25 ../../Zotlabs/Module/Regdir.php:49
-msgid "This site is not a directory server"
-msgstr "Este sitio no es un servidor de directorio"
+#: ../../Zotlabs/Module/Settings/Channel.php:318
+msgid "Anybody authenticated"
+msgstr "Cualquiera que esté autenticado"
-#: ../../Zotlabs/Module/Dirsearch.php:33
-msgid "This directory server requires an access token"
-msgstr "El servidor de este directorio necesita un \"token\" de acceso"
+#: ../../Zotlabs/Module/Settings/Channel.php:319
+msgid "Anybody on the internet"
+msgstr "Cualquiera en internet"
-#: ../../Zotlabs/Module/Network.php:96
-msgid "No such group"
-msgstr "No se encuentra el grupo"
+#: ../../Zotlabs/Module/Settings/Channel.php:395
+msgid "Publish your default profile in the network directory"
+msgstr "Publicar su perfil principal en el directorio de la red"
-#: ../../Zotlabs/Module/Network.php:136
-msgid "No such channel"
-msgstr "No se encuentra el canal"
+#: ../../Zotlabs/Module/Settings/Channel.php:400
+msgid "Allow us to suggest you as a potential friend to new members?"
+msgstr "¿Nos permite sugerirle como amigo potencial a los nuevos miembros?"
-#: ../../Zotlabs/Module/Network.php:141
-msgid "forum"
-msgstr "foro"
+#: ../../Zotlabs/Module/Settings/Channel.php:404
+#: ../../Zotlabs/Module/Profile_photo.php:429
+#: ../../Zotlabs/Module/Cover_photo.php:365
+msgid "or"
+msgstr "o"
-#: ../../Zotlabs/Module/Network.php:153
-msgid "Search Results For:"
-msgstr "Buscar resultados para:"
+#: ../../Zotlabs/Module/Settings/Channel.php:409
+msgid "Your channel address is"
+msgstr "Su dirección de canal es"
-#: ../../Zotlabs/Module/Network.php:221
-msgid "Privacy group is empty"
-msgstr "El grupo de canales está vacío"
+#: ../../Zotlabs/Module/Settings/Channel.php:412
+msgid "Your files/photos are accessible via WebDAV at"
+msgstr "Sus archivos y fotos son accesibles a través de WebDAV en "
-#: ../../Zotlabs/Module/Network.php:230
-msgid "Privacy group: "
-msgstr "Grupo de canales: "
+#: ../../Zotlabs/Module/Settings/Channel.php:474
+msgid "Channel Settings"
+msgstr "Ajustes del canal"
-#: ../../Zotlabs/Module/Network.php:256
-msgid "Invalid connection."
-msgstr "Conexión no válida."
+#: ../../Zotlabs/Module/Settings/Channel.php:481
+msgid "Basic Settings"
+msgstr "Configuración básica"
-#: ../../Zotlabs/Module/Network.php:275
-#: ../../extend/addon/addon/redred/redred.php:65
-msgid "Invalid channel."
-msgstr "El canal no es válido."
+#: ../../Zotlabs/Module/Settings/Channel.php:482
+#: ../../include/channel.php:1250
+msgid "Full Name:"
+msgstr "Nombre completo:"
-#: ../../Zotlabs/Module/Menu.php:49
-msgid "Unable to update menu."
-msgstr "No se puede actualizar el menú."
+#: ../../Zotlabs/Module/Settings/Channel.php:483
+#: ../../Zotlabs/Module/Settings/Account.php:119
+msgid "Email Address:"
+msgstr "Dirección de correo electrónico:"
-#: ../../Zotlabs/Module/Menu.php:60
-msgid "Unable to create menu."
-msgstr "No se puede crear el menú."
+#: ../../Zotlabs/Module/Settings/Channel.php:484
+msgid "Your Timezone:"
+msgstr "Su huso horario:"
-#: ../../Zotlabs/Module/Menu.php:98 ../../Zotlabs/Module/Menu.php:110
-msgid "Menu Name"
-msgstr "Nombre del menú"
+#: ../../Zotlabs/Module/Settings/Channel.php:485
+msgid "Default Post Location:"
+msgstr "Localización geográfica predeterminada para sus publicaciones:"
-#: ../../Zotlabs/Module/Menu.php:98
-msgid "Unique name (not visible on webpage) - required"
-msgstr "Nombre único (no será visible en la página web) - requerido"
+#: ../../Zotlabs/Module/Settings/Channel.php:485
+msgid "Geographical location to display on your posts"
+msgstr "Localización geográfica que debe mostrarse en sus publicaciones"
-#: ../../Zotlabs/Module/Menu.php:99 ../../Zotlabs/Module/Menu.php:111
-msgid "Menu Title"
-msgstr "Título del menú"
+#: ../../Zotlabs/Module/Settings/Channel.php:486
+msgid "Use Browser Location:"
+msgstr "Usar la localización geográfica del navegador:"
-#: ../../Zotlabs/Module/Menu.php:99
-msgid "Visible on webpage - leave empty for no title"
-msgstr "Visible en la página web - no ponga nada si no desea un título"
+#: ../../Zotlabs/Module/Settings/Channel.php:488
+msgid "Adult Content"
+msgstr "Contenido solo para adultos"
-#: ../../Zotlabs/Module/Menu.php:100
-msgid "Allow Bookmarks"
-msgstr "Permitir marcadores"
+#: ../../Zotlabs/Module/Settings/Channel.php:488
+msgid ""
+"This channel frequently or regularly publishes adult content. (Please tag "
+"any adult material and/or nudity with #NSFW)"
+msgstr "Este canal publica contenido solo para adultos con frecuencia o regularmente. (Por favor etiquete cualquier material para adultos con la etiqueta #NSFW)"
-#: ../../Zotlabs/Module/Menu.php:100 ../../Zotlabs/Module/Menu.php:157
-msgid "Menu may be used to store saved bookmarks"
-msgstr "El menú se puede usar para guardar marcadores"
+#: ../../Zotlabs/Module/Settings/Channel.php:490
+msgid "Security and Privacy Settings"
+msgstr "Configuración de seguridad y privacidad"
-#: ../../Zotlabs/Module/Menu.php:101 ../../Zotlabs/Module/Menu.php:159
-msgid "Submit and proceed"
-msgstr "Enviar y proceder"
+#: ../../Zotlabs/Module/Settings/Channel.php:493
+msgid "Your permissions are already configured. Click to view/adjust"
+msgstr "Sus permisos ya están configurados. Pulse para ver/ajustar"
-#: ../../Zotlabs/Module/Menu.php:107 ../../include/text.php:2289
-msgid "Menus"
-msgstr "Menús"
+#: ../../Zotlabs/Module/Settings/Channel.php:495
+msgid "Hide my online presence"
+msgstr "Ocultar mi presencia en línea"
-#: ../../Zotlabs/Module/Menu.php:113 ../../Zotlabs/Module/Locs.php:120
-msgid "Drop"
-msgstr "Eliminar"
+#: ../../Zotlabs/Module/Settings/Channel.php:495
+msgid "Prevents displaying in your profile that you are online"
+msgstr "Evitar mostrar en su perfil que está en línea"
-#: ../../Zotlabs/Module/Menu.php:114 ../../Zotlabs/Module/Webpages.php:255
-#: ../../Zotlabs/Module/Blocks.php:157 ../../Zotlabs/Module/Layouts.php:190
-#: ../../include/page_widgets.php:47
-msgid "Created"
-msgstr "Creado"
+#: ../../Zotlabs/Module/Settings/Channel.php:497
+msgid "Simple Privacy Settings:"
+msgstr "Configuración de privacidad sencilla:"
-#: ../../Zotlabs/Module/Menu.php:115 ../../Zotlabs/Module/Webpages.php:256
-#: ../../Zotlabs/Module/Blocks.php:158 ../../Zotlabs/Module/Layouts.php:191
-#: ../../include/page_widgets.php:48
-msgid "Edited"
-msgstr "Editado"
+#: ../../Zotlabs/Module/Settings/Channel.php:498
+msgid ""
+"Very Public - <em>extremely permissive (should be used with caution)</em>"
+msgstr "Muy Público - <em>extremadamente permisivo (debería ser usado con precaución)</em>"
-#: ../../Zotlabs/Module/Menu.php:117
-msgid "Bookmarks allowed"
-msgstr "Marcadores permitidos"
+#: ../../Zotlabs/Module/Settings/Channel.php:499
+msgid ""
+"Typical - <em>default public, privacy when desired (similar to social "
+"network permissions but with improved privacy)</em>"
+msgstr "Típico - <em>por defecto público, privado cuando se desee (similar a los permisos de una red social pero con privacidad mejorada)</em>"
-#: ../../Zotlabs/Module/Menu.php:119
-msgid "Delete this menu"
-msgstr "Borrar este menú"
+#: ../../Zotlabs/Module/Settings/Channel.php:500
+msgid "Private - <em>default private, never open or public</em>"
+msgstr "Privado - <em>por defecto, privado, nunca abierto o público</em>"
-#: ../../Zotlabs/Module/Menu.php:120 ../../Zotlabs/Module/Menu.php:154
-msgid "Edit menu contents"
-msgstr "Editar los contenidos del menú"
+#: ../../Zotlabs/Module/Settings/Channel.php:501
+msgid "Blocked - <em>default blocked to/from everybody</em>"
+msgstr "Bloqueado - <em>por defecto, bloqueado/a para cualquiera</em>"
-#: ../../Zotlabs/Module/Menu.php:121
-msgid "Edit this menu"
-msgstr "Modificar este menú"
+#: ../../Zotlabs/Module/Settings/Channel.php:503
+msgid "Allow others to tag your posts"
+msgstr "Permitir a otros etiquetar sus publicaciones"
-#: ../../Zotlabs/Module/Menu.php:136
-msgid "Menu could not be deleted."
-msgstr "El menú no puede ser eliminado."
+#: ../../Zotlabs/Module/Settings/Channel.php:503
+msgid ""
+"Often used by the community to retro-actively flag inappropriate content"
+msgstr "A menudo usado por la comunidad para marcar contenido inapropiado de forma retroactiva."
-#: ../../Zotlabs/Module/Menu.php:144 ../../Zotlabs/Module/Mitem.php:28
-msgid "Menu not found."
-msgstr "Menú no encontrado"
+#: ../../Zotlabs/Module/Settings/Channel.php:505
+msgid "Channel Permission Limits"
+msgstr "Límites de los permisos del canal"
-#: ../../Zotlabs/Module/Menu.php:149
-msgid "Edit Menu"
-msgstr "Modificar el menú"
+#: ../../Zotlabs/Module/Settings/Channel.php:507
+msgid "Expire other channel content after this many days"
+msgstr "Caducar contenido de otros canales después de este número de días"
-#: ../../Zotlabs/Module/Menu.php:153
-msgid "Add or remove entries to this menu"
-msgstr "Añadir o quitar entradas en este menú"
+#: ../../Zotlabs/Module/Settings/Channel.php:507
+msgid "0 or blank to use the website limit."
+msgstr "0 o en blanco para usar el límite del sitio web."
-#: ../../Zotlabs/Module/Menu.php:155
-msgid "Menu name"
-msgstr "Nombre del menú"
+#: ../../Zotlabs/Module/Settings/Channel.php:507
+#, php-format
+msgid "This website expires after %d days."
+msgstr "Este sitio web caduca después de %d días."
-#: ../../Zotlabs/Module/Menu.php:155
-msgid "Must be unique, only seen by you"
-msgstr "Debe ser único, solo será visible para usted"
+#: ../../Zotlabs/Module/Settings/Channel.php:507
+msgid "This website does not expire imported content."
+msgstr "Este sitio web no caduca el contenido importado."
-#: ../../Zotlabs/Module/Menu.php:156
-msgid "Menu title"
-msgstr "Título del menú"
+#: ../../Zotlabs/Module/Settings/Channel.php:507
+msgid "The website limit takes precedence if lower than your limit."
+msgstr "El límite del sitio web tiene prioridad si es inferior a su propio límite."
-#: ../../Zotlabs/Module/Menu.php:156
-msgid "Menu title as seen by others"
-msgstr "El título del menú tal como será visto por los demás"
+#: ../../Zotlabs/Module/Settings/Channel.php:508
+msgid "Maximum Friend Requests/Day:"
+msgstr "Máximo de solicitudes de amistad por día:"
-#: ../../Zotlabs/Module/Menu.php:157
-msgid "Allow bookmarks"
-msgstr "Permitir marcadores"
+#: ../../Zotlabs/Module/Settings/Channel.php:508
+msgid "May reduce spam activity"
+msgstr "Podría reducir la actividad de spam"
-#: ../../Zotlabs/Module/Menu.php:166 ../../Zotlabs/Module/Mitem.php:120
-#: ../../Zotlabs/Module/Xchan.php:41
-msgid "Not found."
-msgstr "No encontrado."
+#: ../../Zotlabs/Module/Settings/Channel.php:509
+msgid "Default Access Control List (ACL)"
+msgstr "Lista de control de acceso (ACL) por defecto"
-#: ../../Zotlabs/Module/Rpost.php:138 ../../Zotlabs/Module/Editpost.php:108
-msgid "Edit post"
-msgstr "Editar la entrada"
+#: ../../Zotlabs/Module/Settings/Channel.php:511
+msgid "Use my default audience setting for the type of object published"
+msgstr "Usar los ajustes de mi audiencia predeterminada para el tipo de publicación"
-#: ../../Zotlabs/Module/Locs.php:25 ../../Zotlabs/Module/Locs.php:54
-msgid "Location not found."
-msgstr "Dirección no encontrada."
+#: ../../Zotlabs/Module/Settings/Channel.php:518
+msgid "Channel permissions category:"
+msgstr "Categoría de los permisos del canal:"
-#: ../../Zotlabs/Module/Locs.php:62
-msgid "Location lookup failed."
-msgstr "Ha fallado la búsqueda de la dirección."
+#: ../../Zotlabs/Module/Settings/Channel.php:519
+msgid "Default Permissions Group"
+msgstr "Grupo de permisos predeterminado"
-#: ../../Zotlabs/Module/Locs.php:66
-msgid ""
-"Please select another location to become primary before removing the primary"
-" location."
-msgstr "Por favor, seleccione una copia de su canal (un clon) para convertirlo en primario antes de eliminar su canal principal."
+#: ../../Zotlabs/Module/Settings/Channel.php:525
+msgid "Maximum private messages per day from unknown people:"
+msgstr "Máximo de mensajes privados por día de gente desconocida:"
-#: ../../Zotlabs/Module/Locs.php:95
-msgid "Syncing locations"
-msgstr "Sincronizando ubicaciones"
+#: ../../Zotlabs/Module/Settings/Channel.php:525
+msgid "Useful to reduce spamming"
+msgstr "Útil para reducir el envío de correo no deseado"
-#: ../../Zotlabs/Module/Locs.php:105
-msgid "No locations found."
-msgstr "No encontrada ninguna dirección."
+#: ../../Zotlabs/Module/Settings/Channel.php:528
+msgid "Notification Settings"
+msgstr "Configuración de las notificaciones"
-#: ../../Zotlabs/Module/Locs.php:116
-msgid "Manage Channel Locations"
-msgstr "Gestionar las direcciones del canal"
+#: ../../Zotlabs/Module/Settings/Channel.php:529
+msgid "By default post a status message when:"
+msgstr "Por defecto, enviar un mensaje de estado cuando:"
-#: ../../Zotlabs/Module/Locs.php:117 ../../Zotlabs/Module/Pubsites.php:51
-#: ../../Zotlabs/Module/Events.php:475 ../../Zotlabs/Module/Profiles.php:509
-#: ../../Zotlabs/Module/Profiles.php:737
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:839
-#: ../../include/js_strings.php:25
-msgid "Location"
-msgstr "Ubicación"
+#: ../../Zotlabs/Module/Settings/Channel.php:530
+msgid "accepting a friend request"
+msgstr "Acepte una solicitud de amistad"
-#: ../../Zotlabs/Module/Locs.php:119
-msgid "Primary"
-msgstr "Primario"
+#: ../../Zotlabs/Module/Settings/Channel.php:531
+msgid "joining a forum/community"
+msgstr "al unirse a un foro o comunidad"
-#: ../../Zotlabs/Module/Locs.php:122
-msgid "Sync Now"
-msgstr "Sincronizar ahora"
+#: ../../Zotlabs/Module/Settings/Channel.php:532
+msgid "making an <em>interesting</em> profile change"
+msgstr "Realice un cambio <em>interesante</em> en su perfil"
-#: ../../Zotlabs/Module/Locs.php:123
-msgid "Please wait several minutes between consecutive operations."
-msgstr "Por favor, espere algunos minutos entre operaciones consecutivas."
+#: ../../Zotlabs/Module/Settings/Channel.php:533
+msgid "Send a notification email when:"
+msgstr "Enviar una notificación por correo electrónico cuando:"
-#: ../../Zotlabs/Module/Locs.php:124
-msgid ""
-"When possible, drop a location by logging into that website/hub and removing"
-" your channel."
-msgstr "Cuando sea posible, elimine una ubicación iniciando sesión en el sitio web o \"hub\" y borrando su canal."
+#: ../../Zotlabs/Module/Settings/Channel.php:534
+msgid "You receive a connection request"
+msgstr "Reciba una solicitud de conexión"
-#: ../../Zotlabs/Module/Locs.php:125
-msgid "Use this form to drop the location if the hub is no longer operating."
-msgstr "Utilice este formulario para eliminar la dirección si el \"hub\" no está funcionando desde hace tiempo."
+#: ../../Zotlabs/Module/Settings/Channel.php:535
+msgid "Your connections are confirmed"
+msgstr "Sus conexiones hayan sido confirmadas"
-#: ../../Zotlabs/Module/Pubsites.php:24 ../../include/widgets.php:1401
-msgid "Public Hubs"
-msgstr "Servidores públicos"
+#: ../../Zotlabs/Module/Settings/Channel.php:536
+msgid "Someone writes on your profile wall"
+msgstr "Alguien escriba en la página de su perfil (\"muro\")"
-#: ../../Zotlabs/Module/Pubsites.php:27
-msgid ""
-"The listed hubs allow public registration for the $Projectname network. All "
-"hubs in the network are interlinked so membership on any of them conveys "
-"membership in the network as a whole. Some hubs may require subscription or "
-"provide tiered service plans. The hub itself <strong>may</strong> provide "
-"additional details."
-msgstr "Los sitios listados permiten el registro público en la red $Projectname. Todos los sitios de la red están vinculados entre sí, por lo que sus miembros, en ninguno de ellos, indican la pertenencia a la red en su conjunto. Algunos sitios pueden requerir suscripción o proporcionar planes de servicio por niveles. Los mismos hubs <strong>pueden</strong> proporcionar detalles adicionales."
+#: ../../Zotlabs/Module/Settings/Channel.php:537
+msgid "Someone writes a followup comment"
+msgstr "Alguien escriba un comentario sobre sus publicaciones"
-#: ../../Zotlabs/Module/Pubsites.php:33
-msgid "Hub URL"
-msgstr "Dirección del hub"
+#: ../../Zotlabs/Module/Settings/Channel.php:538
+msgid "You receive a private message"
+msgstr "Reciba un mensaje privado"
-#: ../../Zotlabs/Module/Pubsites.php:33
-msgid "Access Type"
-msgstr "Tipo de acceso"
+#: ../../Zotlabs/Module/Settings/Channel.php:539
+msgid "You receive a friend suggestion"
+msgstr "Reciba una sugerencia de amistad"
-#: ../../Zotlabs/Module/Pubsites.php:33
-msgid "Registration Policy"
-msgstr "Normas de registro"
+#: ../../Zotlabs/Module/Settings/Channel.php:540
+msgid "You are tagged in a post"
+msgstr "Usted sea etiquetado en una publicación"
-#: ../../Zotlabs/Module/Pubsites.php:33
-msgid "Stats"
-msgstr "Estadísticas"
+#: ../../Zotlabs/Module/Settings/Channel.php:541
+msgid "You are poked/prodded/etc. in a post"
+msgstr "Reciba un toque o incitación en una publicación"
-#: ../../Zotlabs/Module/Pubsites.php:33
-msgid "Software"
-msgstr "Software"
+#: ../../Zotlabs/Module/Settings/Channel.php:543
+msgid "Someone likes your post/comment"
+msgstr "Alguien muestre agrado por su entrada o comentario"
-#: ../../Zotlabs/Module/Pubsites.php:35 ../../Zotlabs/Module/Ratings.php:97
-#: ../../include/conversation.php:941 ../../include/conversation.php:1099
-msgid "Ratings"
-msgstr "Valoraciones"
+#: ../../Zotlabs/Module/Settings/Channel.php:546
+msgid "Show visual notifications including:"
+msgstr "Mostrar notificaciones visuales que incluyan:"
-#: ../../Zotlabs/Module/Pubsites.php:48
-msgid "Rate"
-msgstr "Valorar"
+#: ../../Zotlabs/Module/Settings/Channel.php:548
+msgid "Unseen grid activity"
+msgstr "Nueva actividad en la red"
-#: ../../Zotlabs/Module/Pubsites.php:59 ../../Zotlabs/Module/Events.php:694
-#: ../../Zotlabs/Module/Webpages.php:250 ../../Zotlabs/Module/Blocks.php:166
-#: ../../Zotlabs/Module/Layouts.php:197 ../../Zotlabs/Module/Wiki.php:166
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:151
-#: ../../include/page_widgets.php:42
-msgid "View"
-msgstr "Ver"
+#: ../../Zotlabs/Module/Settings/Channel.php:549
+msgid "Unseen channel activity"
+msgstr "Actividad no vista en el canal"
-#: ../../Zotlabs/Module/Connedit.php:82
-msgid "Could not access contact record."
-msgstr "No se ha podido acceder al registro de contacto."
+#: ../../Zotlabs/Module/Settings/Channel.php:550
+msgid "Unseen private messages"
+msgstr "Mensajes privados no leídos"
-#: ../../Zotlabs/Module/Connedit.php:112
-msgid "Could not locate selected profile."
-msgstr "No se ha podido localizar el perfil seleccionado."
+#: ../../Zotlabs/Module/Settings/Channel.php:550
+#: ../../Zotlabs/Module/Settings/Channel.php:555
+#: ../../Zotlabs/Module/Settings/Channel.php:556
+#: ../../Zotlabs/Module/Settings/Channel.php:557
+#: ../../addon/jappixmini/jappixmini.php:343
+msgid "Recommended"
+msgstr "Recomendado"
-#: ../../Zotlabs/Module/Connedit.php:249
-msgid "Connection updated."
-msgstr "Conexión actualizada."
+#: ../../Zotlabs/Module/Settings/Channel.php:551
+msgid "Upcoming events"
+msgstr "Próximos eventos"
-#: ../../Zotlabs/Module/Connedit.php:251
-msgid "Failed to update connection record."
-msgstr "Error al actualizar el registro de la conexión."
+#: ../../Zotlabs/Module/Settings/Channel.php:552
+msgid "Events today"
+msgstr "Eventos de hoy"
-#: ../../Zotlabs/Module/Connedit.php:301
-msgid "is now connected to"
-msgstr "ahora está conectado/a"
+#: ../../Zotlabs/Module/Settings/Channel.php:553
+msgid "Upcoming birthdays"
+msgstr "Próximos cumpleaños"
-#: ../../Zotlabs/Module/Connedit.php:434
-msgid "Could not access address book record."
-msgstr "No se pudo acceder al registro en su libreta de direcciones."
+#: ../../Zotlabs/Module/Settings/Channel.php:553
+msgid "Not available in all themes"
+msgstr "No disponible en todos los temas"
-#: ../../Zotlabs/Module/Connedit.php:482
-msgid "Refresh failed - channel is currently unavailable."
-msgstr "Recarga fallida - no se puede encontrar el canal en este momento."
+#: ../../Zotlabs/Module/Settings/Channel.php:554
+msgid "System (personal) notifications"
+msgstr "Notificaciones del sistema (personales)"
-#: ../../Zotlabs/Module/Connedit.php:497 ../../Zotlabs/Module/Connedit.php:506
-#: ../../Zotlabs/Module/Connedit.php:515 ../../Zotlabs/Module/Connedit.php:524
-#: ../../Zotlabs/Module/Connedit.php:537
-msgid "Unable to set address book parameters."
-msgstr "No ha sido posible establecer los parámetros de la libreta de direcciones."
+#: ../../Zotlabs/Module/Settings/Channel.php:555
+msgid "System info messages"
+msgstr "Mensajes de información del sistema"
-#: ../../Zotlabs/Module/Connedit.php:561
-msgid "Connection has been removed."
-msgstr "La conexión ha sido eliminada."
+#: ../../Zotlabs/Module/Settings/Channel.php:556
+msgid "System critical alerts"
+msgstr "Alertas críticas del sistema"
-#: ../../Zotlabs/Module/Connedit.php:601 ../../Zotlabs/Lib/Apps.php:228
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:57
-#: ../../include/conversation.php:936 ../../include/conversation.php:1049
-#: ../../include/nav.php:103
-msgid "View Profile"
-msgstr "Ver el perfil"
+#: ../../Zotlabs/Module/Settings/Channel.php:557
+msgid "New connections"
+msgstr "Nuevas conexiones"
-#: ../../Zotlabs/Module/Connedit.php:604
-#, php-format
-msgid "View %s's profile"
-msgstr "Ver el perfil de %s"
+#: ../../Zotlabs/Module/Settings/Channel.php:558
+msgid "System Registrations"
+msgstr "Registros del sistema"
-#: ../../Zotlabs/Module/Connedit.php:608
-msgid "Refresh Permissions"
-msgstr "Recargar los permisos"
+#: ../../Zotlabs/Module/Settings/Channel.php:559
+msgid ""
+"Also show new wall posts, private messages and connections under Notices"
+msgstr "Mostrar también en Avisos las nuevas publicaciones, los mensajes privados y las conexiones"
-#: ../../Zotlabs/Module/Connedit.php:611
-msgid "Fetch updated permissions"
-msgstr "Obtener los permisos actualizados"
+#: ../../Zotlabs/Module/Settings/Channel.php:561
+msgid "Notify me of events this many days in advance"
+msgstr "Avisarme de los eventos con algunos días de antelación"
-#: ../../Zotlabs/Module/Connedit.php:615
-msgid "Refresh Photo"
-msgstr "Actualizar la foto"
+#: ../../Zotlabs/Module/Settings/Channel.php:561
+msgid "Must be greater than 0"
+msgstr "Debe ser mayor que 0"
-#: ../../Zotlabs/Module/Connedit.php:618
-msgid "Fetch updated photo"
-msgstr "Obtener una foto actualizada"
+#: ../../Zotlabs/Module/Settings/Channel.php:567
+msgid "Advanced Account/Page Type Settings"
+msgstr "Ajustes avanzados de la cuenta y de los tipos de página"
-#: ../../Zotlabs/Module/Connedit.php:622
-msgid "Recent Activity"
-msgstr "Actividad reciente"
+#: ../../Zotlabs/Module/Settings/Channel.php:568
+msgid "Change the behaviour of this account for special situations"
+msgstr "Cambiar el comportamiento de esta cuenta en situaciones especiales"
-#: ../../Zotlabs/Module/Connedit.php:625
-msgid "View recent posts and comments"
-msgstr "Ver publicaciones y comentarios recientes"
+#: ../../Zotlabs/Module/Settings/Channel.php:570
+msgid "Miscellaneous Settings"
+msgstr "Ajustes diversos"
-#: ../../Zotlabs/Module/Connedit.php:632
-msgid "Block (or Unblock) all communications with this connection"
-msgstr "Bloquear (o desbloquear) todas las comunicaciones con esta conexión"
+#: ../../Zotlabs/Module/Settings/Channel.php:571
+msgid "Default photo upload folder"
+msgstr "Carpeta por defecto de las fotos subidas"
-#: ../../Zotlabs/Module/Connedit.php:633
-msgid "This connection is blocked!"
-msgstr "¡Esta conexión está bloqueada!"
+#: ../../Zotlabs/Module/Settings/Channel.php:571
+#: ../../Zotlabs/Module/Settings/Channel.php:572
+msgid "%Y - current year, %m - current month"
+msgstr "%Y - año en curso, %m - mes actual"
-#: ../../Zotlabs/Module/Connedit.php:637
-msgid "Unignore"
-msgstr "Dejar de ignorar"
+#: ../../Zotlabs/Module/Settings/Channel.php:572
+msgid "Default file upload folder"
+msgstr "Carpeta por defecto de los ficheros subidos"
-#: ../../Zotlabs/Module/Connedit.php:640
-msgid "Ignore (or Unignore) all inbound communications from this connection"
-msgstr "Ignorar (o dejar de ignorar) todas las comunicaciones entrantes de esta conexión"
+#: ../../Zotlabs/Module/Settings/Channel.php:574
+msgid "Personal menu to display in your channel pages"
+msgstr "Menú personal que debe mostrarse en las páginas de su canal"
-#: ../../Zotlabs/Module/Connedit.php:641
-msgid "This connection is ignored!"
-msgstr "¡Esta conexión es ignorada!"
+#: ../../Zotlabs/Module/Settings/Channel.php:576
+msgid "Remove this channel."
+msgstr "Eliminar este canal."
-#: ../../Zotlabs/Module/Connedit.php:645
-msgid "Unarchive"
-msgstr "Desarchivar"
+#: ../../Zotlabs/Module/Settings/Channel.php:577
+msgid "Firefox Share $Projectname provider"
+msgstr "Servicio de compartición de Firefox: proveedor $Projectname"
-#: ../../Zotlabs/Module/Connedit.php:645
-msgid "Archive"
-msgstr "Archivar"
+#: ../../Zotlabs/Module/Settings/Channel.php:578
+msgid "Start calendar week on Monday"
+msgstr "Comenzar el calendario semanal por el lunes"
+
+#: ../../Zotlabs/Module/Settings/Features.php:45
+msgid "Additional Features"
+msgstr "Funcionalidades"
+
+#: ../../Zotlabs/Module/Settings/Tokens.php:31
+#, php-format
+msgid "This channel is limited to %d tokens"
+msgstr "Este canal tiene un límite de %d tokens"
-#: ../../Zotlabs/Module/Connedit.php:648
+#: ../../Zotlabs/Module/Settings/Tokens.php:37
+msgid "Name and Password are required."
+msgstr "Se requiere el nombre y la contraseña."
+
+#: ../../Zotlabs/Module/Settings/Tokens.php:77
+msgid "Token saved."
+msgstr "Token salvado."
+
+#: ../../Zotlabs/Module/Settings/Tokens.php:113
msgid ""
-"Archive (or Unarchive) this connection - mark channel dead but keep content"
-msgstr "Archiva (o desarchiva) esta conexión - marca el canal como muerto aunque mantiene sus contenidos"
+"Use this form to create temporary access identifiers to share things with "
+"non-members. These identities may be used in Access Control Lists and "
+"visitors may login using these credentials to access private content."
+msgstr "Utilice este formulario para crear identificadores de acceso temporal para compartir cosas con los no miembros de Hubzilla. Estas identidades se pueden usar en las Listas de control de acceso (ACL) y así los visitantes pueden iniciar sesión, utilizando estas credenciales, para acceder a su contenido privado."
-#: ../../Zotlabs/Module/Connedit.php:649
-msgid "This connection is archived!"
-msgstr "¡Esta conexión esta archivada!"
+#: ../../Zotlabs/Module/Settings/Tokens.php:115
+msgid ""
+"You may also provide <em>dropbox</em> style access links to friends and "
+"associates by adding the Login Password to any specific site URL as shown. "
+"Examples:"
+msgstr "También puede proporcionar, con el estilo <em>dropbox</em>, enlaces de acceso a sus amigos y asociados añadiendo la contraseña de inicio de sesión a cualquier dirección URL, como se muestra. Ejemplos: "
-#: ../../Zotlabs/Module/Connedit.php:653
-msgid "Unhide"
-msgstr "Mostrar"
+#: ../../Zotlabs/Module/Settings/Tokens.php:150
+#: ../../Zotlabs/Widget/Settings_menu.php:90
+msgid "Guest Access Tokens"
+msgstr "Tokens de acceso para invitados"
-#: ../../Zotlabs/Module/Connedit.php:653
-msgid "Hide"
-msgstr "Ocultar"
+#: ../../Zotlabs/Module/Settings/Tokens.php:157
+msgid "Login Name"
+msgstr "Nombre de inicio de sesión"
-#: ../../Zotlabs/Module/Connedit.php:656
-msgid "Hide or Unhide this connection from your other connections"
-msgstr "Ocultar o mostrar esta conexión a sus otras conexiones"
+#: ../../Zotlabs/Module/Settings/Tokens.php:158
+msgid "Login Password"
+msgstr "Contraseña de inicio de sesión"
-#: ../../Zotlabs/Module/Connedit.php:657
-msgid "This connection is hidden!"
-msgstr "¡Esta conexión está oculta!"
+#: ../../Zotlabs/Module/Settings/Tokens.php:159
+msgid "Expires (yyyy-mm-dd)"
+msgstr "Expira (aaaa-mm-dd)"
-#: ../../Zotlabs/Module/Connedit.php:664
-msgid "Delete this connection"
-msgstr "Eliminar esta conexión"
+#: ../../Zotlabs/Module/Settings/Tokens.php:160
+#: ../../Zotlabs/Module/Connedit.php:885
+msgid "Their Settings"
+msgstr "Sus ajustes"
-#: ../../Zotlabs/Module/Connedit.php:672
-msgid "Fetch Vcard"
-msgstr "Obtener una vcard"
+#: ../../Zotlabs/Module/Settings/Account.php:20
+msgid "Not valid email."
+msgstr "Correo electrónico no válido."
-#: ../../Zotlabs/Module/Connedit.php:675
-msgid "Fetch electronic calling card for this connection"
-msgstr "Obtener una tarjeta de llamada electrónica para esta conexión"
+#: ../../Zotlabs/Module/Settings/Account.php:23
+msgid "Protected email address. Cannot change to that email."
+msgstr "Dirección de correo electrónico protegida. No se puede cambiar a ella."
-#: ../../Zotlabs/Module/Connedit.php:683
-#: ../../Zotlabs/Module/Filestorage.php:152
-#: ../../Zotlabs/Module/Photos.php:657 ../../Zotlabs/Module/Photos.php:1042
-#: ../../Zotlabs/Module/Thing.php:313 ../../Zotlabs/Module/Thing.php:363
-#: ../../Zotlabs/Module/Chat.php:232 ../../include/acl_selectors.php:218
-msgid "Permissions"
-msgstr "Permisos"
+#: ../../Zotlabs/Module/Settings/Account.php:32
+msgid "System failure storing new email. Please try again."
+msgstr "Fallo de sistema al guardar el nuevo correo electrónico. Por favor, inténtelo de nuevo."
-#: ../../Zotlabs/Module/Connedit.php:686
-msgid "Open Individual Permissions section by default"
-msgstr "Abrir la sección de permisos individuales por defecto"
+#: ../../Zotlabs/Module/Settings/Account.php:40
+msgid "Technical skill level updated"
+msgstr "Se ha actualizado el nivel de habilidad técnica"
-#: ../../Zotlabs/Module/Connedit.php:709
-msgid "Affinity"
-msgstr "Afinidad"
+#: ../../Zotlabs/Module/Settings/Account.php:56
+msgid "Password verification failed."
+msgstr "La comprobación de la contraseña ha fallado."
-#: ../../Zotlabs/Module/Connedit.php:712
-msgid "Open Set Affinity section by default"
-msgstr "Abrir por defecto la sección para definir la afinidad"
+#: ../../Zotlabs/Module/Settings/Account.php:63
+msgid "Passwords do not match. Password unchanged."
+msgstr "Las contraseñas no coinciden. La contraseña no se ha cambiado."
-#: ../../Zotlabs/Module/Connedit.php:716 ../../include/widgets.php:526
-msgid "Me"
-msgstr "Yo"
+#: ../../Zotlabs/Module/Settings/Account.php:67
+msgid "Empty passwords are not allowed. Password unchanged."
+msgstr "No se permiten contraseñas vacías. La contraseña no se ha cambiado."
-#: ../../Zotlabs/Module/Connedit.php:717 ../../include/widgets.php:527
-msgid "Family"
-msgstr "Familia"
+#: ../../Zotlabs/Module/Settings/Account.php:81
+msgid "Password changed."
+msgstr "Contraseña cambiada."
-#: ../../Zotlabs/Module/Connedit.php:718
-#: ../../Zotlabs/Module/Settings/Channel.php:62
-#: ../../Zotlabs/Module/Settings/Channel.php:66
-#: ../../Zotlabs/Module/Settings/Channel.php:67
-#: ../../Zotlabs/Module/Settings/Channel.php:70
-#: ../../Zotlabs/Module/Settings/Channel.php:81 ../../include/widgets.php:528
-#: ../../include/selectors.php:123 ../../include/channel.php:408
-#: ../../include/channel.php:409 ../../include/channel.php:416
-msgid "Friends"
-msgstr "Amigos/as"
+#: ../../Zotlabs/Module/Settings/Account.php:83
+msgid "Password update failed. Please try again."
+msgstr "La actualización de la contraseña ha fallado. Por favor, inténtalo de nuevo."
-#: ../../Zotlabs/Module/Connedit.php:719 ../../include/widgets.php:529
-msgid "Acquaintances"
-msgstr "Conocidos/as"
+#: ../../Zotlabs/Module/Settings/Account.php:112
+msgid "Account Settings"
+msgstr "Configuración de la cuenta"
-#: ../../Zotlabs/Module/Connedit.php:746
-msgid "Filter"
-msgstr "Filtrar"
+#: ../../Zotlabs/Module/Settings/Account.php:113
+msgid "Current Password"
+msgstr "Contraseña actual"
-#: ../../Zotlabs/Module/Connedit.php:749
-msgid "Open Custom Filter section by default"
-msgstr "Abrir por defecto la sección de personalización de filtros"
+#: ../../Zotlabs/Module/Settings/Account.php:114
+msgid "Enter New Password"
+msgstr "Escribir una nueva contraseña"
-#: ../../Zotlabs/Module/Connedit.php:786
-msgid "Approve this connection"
-msgstr "Aprobar esta conexión"
+#: ../../Zotlabs/Module/Settings/Account.php:115
+msgid "Confirm New Password"
+msgstr "Confirmar la nueva contraseña"
-#: ../../Zotlabs/Module/Connedit.php:786
-msgid "Accept connection to allow communication"
-msgstr "Aceptar la conexión para permitir la comunicación"
+#: ../../Zotlabs/Module/Settings/Account.php:115
+msgid "Leave password fields blank unless changing"
+msgstr "Dejar en blanco la contraseña a menos que desee cambiarla."
-#: ../../Zotlabs/Module/Connedit.php:791
-msgid "Set Affinity"
-msgstr "Ajustar la afinidad"
+#: ../../Zotlabs/Module/Settings/Account.php:116
+msgid "Your technical skill level"
+msgstr "Su nivel de habilidad técnica"
-#: ../../Zotlabs/Module/Connedit.php:794
-msgid "Set Profile"
-msgstr "Ajustar el perfil"
+#: ../../Zotlabs/Module/Settings/Account.php:116
+msgid "Used to provide a member experience matched to your comfort level"
+msgstr "Se utiliza para proporcionar la experiencia de los miembros adaptada a su nivel de comodidad"
-#: ../../Zotlabs/Module/Connedit.php:797
-msgid "Set Affinity & Profile"
-msgstr "Ajustar la afinidad y el perfil"
+#: ../../Zotlabs/Module/Settings/Account.php:120
+#: ../../Zotlabs/Module/Removeaccount.php:61
+msgid "Remove Account"
+msgstr "Eliminar cuenta"
-#: ../../Zotlabs/Module/Connedit.php:855
-msgid "none"
-msgstr "-"
+#: ../../Zotlabs/Module/Settings/Account.php:121
+msgid "Remove this account including all its channels"
+msgstr "Eliminar esta cuenta incluyendo todos sus canales"
-#: ../../Zotlabs/Module/Connedit.php:858 ../../include/widgets.php:661
-msgid "Connection Default Permissions"
-msgstr "Permisos predeterminados de conexión"
+#: ../../Zotlabs/Module/Settings/Featured.php:20
+msgid "Affinity Slider settings updated."
+msgstr "Se han actualizado los ajustes del controlador de afinidad."
+
+#: ../../Zotlabs/Module/Settings/Featured.php:34
+msgid "No feature settings configured"
+msgstr "No se ha establecido la configuración de los complementos"
+
+#: ../../Zotlabs/Module/Settings/Featured.php:41
+msgid "Default maximum affinity level"
+msgstr "Nivel máximo de afinidad por defecto"
+
+#: ../../Zotlabs/Module/Settings/Featured.php:46
+msgid "Default minimum affinity level"
+msgstr "Nivel mínimo de afinidad por defecto"
+
+#: ../../Zotlabs/Module/Settings/Featured.php:50
+msgid "Affinity Slider Settings"
+msgstr "Ajustes del controlador de afinidad"
+
+#: ../../Zotlabs/Module/Settings/Featured.php:60
+msgid "Feature/Addon Settings"
+msgstr "Ajustes de los complementos"
+
+#: ../../Zotlabs/Module/Settings/Display.php:145
+msgid "No special theme for mobile devices"
+msgstr "Sin tema especial para dispositivos móviles"
-#: ../../Zotlabs/Module/Connedit.php:858 ../../include/items.php:3934
+#: ../../Zotlabs/Module/Settings/Display.php:148
#, php-format
-msgid "Connection: %s"
-msgstr "Conexión: %s"
+msgid "%s - (Experimental)"
+msgstr "%s - (Experimental)"
-#: ../../Zotlabs/Module/Connedit.php:859
-msgid "Apply these permissions automatically"
-msgstr "Aplicar estos permisos automaticamente"
+#: ../../Zotlabs/Module/Settings/Display.php:198
+msgid "Display Settings"
+msgstr "Ajustes de visualización"
-#: ../../Zotlabs/Module/Connedit.php:859
-msgid "Connection requests will be approved without your interaction"
-msgstr "Las solicitudes de conexión serán aprobadas sin su intervención"
+#: ../../Zotlabs/Module/Settings/Display.php:199
+msgid "Theme Settings"
+msgstr "Ajustes del tema"
-#: ../../Zotlabs/Module/Connedit.php:860
-msgid "Permission role"
-msgstr "Rol de acceso"
+#: ../../Zotlabs/Module/Settings/Display.php:200
+msgid "Custom Theme Settings"
+msgstr "Ajustes personalizados del tema"
-#: ../../Zotlabs/Module/Connedit.php:861
-msgid "Add permission role"
-msgstr "Añadir un rol de acceso"
+#: ../../Zotlabs/Module/Settings/Display.php:201
+msgid "Content Settings"
+msgstr "Ajustes del contenido"
-#: ../../Zotlabs/Module/Connedit.php:867
-msgid "This connection's primary address is"
-msgstr "La dirección primaria de esta conexión es"
+#: ../../Zotlabs/Module/Settings/Display.php:207
+msgid "Display Theme:"
+msgstr "Tema gráfico del perfil:"
-#: ../../Zotlabs/Module/Connedit.php:868
-msgid "Available locations:"
-msgstr "Ubicaciones disponibles:"
+#: ../../Zotlabs/Module/Settings/Display.php:208
+msgid "Select scheme"
+msgstr "Elegir un esquema"
-#: ../../Zotlabs/Module/Connedit.php:872
+#: ../../Zotlabs/Module/Settings/Display.php:210
+msgid "Mobile Theme:"
+msgstr "Tema para el móvil:"
+
+#: ../../Zotlabs/Module/Settings/Display.php:211
+msgid "Preload images before rendering the page"
+msgstr "Carga previa de las imágenes antes de generar la página"
+
+#: ../../Zotlabs/Module/Settings/Display.php:211
msgid ""
-"The permissions indicated on this page will be applied to all new "
-"connections."
-msgstr "Los permisos indicados en esta página serán aplicados en todas las nuevas conexiones."
+"The subjective page load time will be longer but the page will be ready when"
+" displayed"
+msgstr "El tiempo subjetivo de carga de la página será más largo, pero la página estará lista cuando se muestre."
-#: ../../Zotlabs/Module/Connedit.php:873
-msgid "Connection Tools"
-msgstr "Gestión de las conexiones"
+#: ../../Zotlabs/Module/Settings/Display.php:212
+msgid "Enable user zoom on mobile devices"
+msgstr "Habilitar zoom de usuario en dispositivos móviles"
-#: ../../Zotlabs/Module/Connedit.php:875
-msgid "Slide to adjust your degree of friendship"
-msgstr "Deslizar para ajustar el grado de amistad"
+#: ../../Zotlabs/Module/Settings/Display.php:213
+msgid "Update browser every xx seconds"
+msgstr "Actualizar navegador cada xx segundos"
-#: ../../Zotlabs/Module/Connedit.php:876 ../../Zotlabs/Module/Rate.php:155
-#: ../../include/js_strings.php:20
-msgid "Rating"
-msgstr "Valoración"
+#: ../../Zotlabs/Module/Settings/Display.php:213
+msgid "Minimum of 10 seconds, no maximum"
+msgstr "Mínimo de 10 segundos, sin máximo"
-#: ../../Zotlabs/Module/Connedit.php:877
-msgid "Slide to adjust your rating"
-msgstr "Deslizar para ajustar su valoración"
+#: ../../Zotlabs/Module/Settings/Display.php:214
+msgid "Maximum number of conversations to load at any time:"
+msgstr "Máximo número de conversaciones a cargar en cualquier momento:"
-#: ../../Zotlabs/Module/Connedit.php:878 ../../Zotlabs/Module/Connedit.php:883
-msgid "Optionally explain your rating"
-msgstr "Opcionalmente, puede explicar su valoración"
+#: ../../Zotlabs/Module/Settings/Display.php:214
+msgid "Maximum of 100 items"
+msgstr "Máximo de 100 elementos"
-#: ../../Zotlabs/Module/Connedit.php:880
-msgid "Custom Filter"
-msgstr "Filtro personalizado"
+#: ../../Zotlabs/Module/Settings/Display.php:215
+msgid "Show emoticons (smilies) as images"
+msgstr "Mostrar emoticonos (smilies) como imágenes"
-#: ../../Zotlabs/Module/Connedit.php:881
-msgid "Only import posts with this text"
-msgstr "Importar solo entradas que contengan este texto"
+#: ../../Zotlabs/Module/Settings/Display.php:216
+msgid "Manual conversation updates"
+msgstr "Actualizaciones manuales de la conversación"
-#: ../../Zotlabs/Module/Connedit.php:881 ../../Zotlabs/Module/Connedit.php:882
-msgid ""
-"words one per line or #tags or /patterns/ or lang=xx, leave blank to import "
-"all posts"
-msgstr "Una sola opción por línea: palabras, #etiquetas, /patrones/ o lang=xx. Dejar en blanco para importarlo todo"
+#: ../../Zotlabs/Module/Settings/Display.php:216
+msgid "Default is on, turning this off may increase screen jumping"
+msgstr "El valor predeterminado está activado, al desactivarlo puede aumentar el salto de pantalla"
-#: ../../Zotlabs/Module/Connedit.php:882
-msgid "Do not import posts with this text"
-msgstr "No importar entradas que contengan este texto"
+#: ../../Zotlabs/Module/Settings/Display.php:217
+msgid "Link post titles to source"
+msgstr "Enlazar título de la publicación a la fuente original"
-#: ../../Zotlabs/Module/Connedit.php:884
-msgid "This information is public!"
-msgstr "¡Esta información es pública!"
+#: ../../Zotlabs/Module/Settings/Display.php:218
+msgid "System Page Layout Editor - (advanced)"
+msgstr "Editor de plantilla de página del sistema - (avanzado)"
-#: ../../Zotlabs/Module/Connedit.php:889
-msgid "Connection Pending Approval"
-msgstr "Conexión pendiente de aprobación"
+#: ../../Zotlabs/Module/Settings/Display.php:221
+msgid "Use blog/list mode on channel page"
+msgstr "Usar modo blog/lista en la página de inicio del canal"
-#: ../../Zotlabs/Module/Connedit.php:892
-#: ../../Zotlabs/Module/Settings/Permcats.php:107
-#: ../../Zotlabs/Module/Settings/Tokens.php:163
-msgid "inherited"
-msgstr "heredado"
+#: ../../Zotlabs/Module/Settings/Display.php:221
+#: ../../Zotlabs/Module/Settings/Display.php:222
+msgid "(comments displayed separately)"
+msgstr "(comentarios mostrados de forma separada)"
-#: ../../Zotlabs/Module/Connedit.php:894
-#, php-format
-msgid ""
-"Please choose the profile you would like to display to %s when viewing your "
-"profile securely."
-msgstr "Por favor, escoja el perfil que quiere mostrar a %s cuando esté viendo su perfil de forma segura."
+#: ../../Zotlabs/Module/Settings/Display.php:222
+msgid "Use blog/list mode on grid page"
+msgstr "Mostrar mi red en modo blog"
-#: ../../Zotlabs/Module/Connedit.php:896
-#: ../../Zotlabs/Module/Settings/Tokens.php:160
-msgid "Their Settings"
-msgstr "Sus ajustes"
+#: ../../Zotlabs/Module/Settings/Display.php:223
+msgid "Channel page max height of content (in pixels)"
+msgstr "Altura máxima del contenido de la página del canal (en píxeles)"
-#: ../../Zotlabs/Module/Connedit.php:897
-#: ../../Zotlabs/Module/Settings/Permcats.php:105
-#: ../../Zotlabs/Module/Settings/Tokens.php:161
-msgid "My Settings"
-msgstr "Mis ajustes"
+#: ../../Zotlabs/Module/Settings/Display.php:223
+#: ../../Zotlabs/Module/Settings/Display.php:224
+msgid "click to expand content exceeding this height"
+msgstr "Pulsar para expandir el contenido que exceda de esta altura"
-#: ../../Zotlabs/Module/Connedit.php:899
-#: ../../Zotlabs/Module/Settings/Permcats.php:110
-#: ../../Zotlabs/Module/Settings/Tokens.php:166
-msgid "Individual Permissions"
-msgstr "Permisos individuales"
+#: ../../Zotlabs/Module/Settings/Display.php:224
+msgid "Grid page max height of content (in pixels)"
+msgstr "Altura máxima del contenido de mi red (en píxeles)"
-#: ../../Zotlabs/Module/Connedit.php:900
-#: ../../Zotlabs/Module/Settings/Permcats.php:111
-#: ../../Zotlabs/Module/Settings/Tokens.php:167
-msgid ""
-"Some permissions may be inherited from your channel's <a "
-"href=\"settings\"><strong>privacy settings</strong></a>, which have higher "
-"priority than individual settings. You can <strong>not</strong> change those"
-" settings here."
-msgstr "Algunos permisos pueden ser heredados de los <a href=\"settings\"><strong>ajustes de privacidad</strong></a> de sus canales, los cuales tienen una prioridad más alta que los ajustes individuales. <strong>No</strong> puede cambiar estos ajustes aquí."
+#: ../../Zotlabs/Module/Settings/Oauth.php:34
+msgid "Name is required"
+msgstr "El nombre es obligatorio"
+
+#: ../../Zotlabs/Module/Settings/Oauth.php:38
+msgid "Key and Secret are required"
+msgstr "\"Key\" y \"Secret\" son obligatorios"
+
+#: ../../Zotlabs/Module/Settings/Oauth.php:86
+#: ../../Zotlabs/Module/Settings/Oauth.php:112
+#: ../../Zotlabs/Module/Settings/Oauth.php:148
+msgid "Add application"
+msgstr "Añadir aplicación"
+
+#: ../../Zotlabs/Module/Settings/Oauth.php:89
+msgid "Name of application"
+msgstr "Nombre de la aplicación"
+
+#: ../../Zotlabs/Module/Settings/Oauth.php:90
+#: ../../Zotlabs/Module/Settings/Oauth.php:116
+#: ../../addon/statusnet/statusnet.php:893 ../../addon/twitter/twitter.php:775
+msgid "Consumer Key"
+msgstr "Consumer Key"
+
+#: ../../Zotlabs/Module/Settings/Oauth.php:90
+#: ../../Zotlabs/Module/Settings/Oauth.php:91
+msgid "Automatically generated - change if desired. Max length 20"
+msgstr "Generado automáticamente - si lo desea, cámbielo. Longitud máxima: 20"
+
+#: ../../Zotlabs/Module/Settings/Oauth.php:91
+#: ../../Zotlabs/Module/Settings/Oauth.php:117
+#: ../../addon/statusnet/statusnet.php:892 ../../addon/twitter/twitter.php:776
+msgid "Consumer Secret"
+msgstr "Consumer Secret"
+
+#: ../../Zotlabs/Module/Settings/Oauth.php:92
+#: ../../Zotlabs/Module/Settings/Oauth.php:118
+msgid "Redirect"
+msgstr "Redirigir"
-#: ../../Zotlabs/Module/Connedit.php:901
+#: ../../Zotlabs/Module/Settings/Oauth.php:92
msgid ""
-"Some permissions may be inherited from your channel's <a "
-"href=\"settings\"><strong>privacy settings</strong></a>, which have higher "
-"priority than individual settings. You can change those settings here but "
-"they wont have any impact unless the inherited setting changes."
-msgstr "Algunos permisos pueden ser heredados de los <a href=\"settings\"><strong>ajustes de privacidad</strong></a> de sus canales, los cuales tienen una prioridad más alta que los ajustes individuales. Puede cambiar estos ajustes aquí, pero no tendrán ningún consecuencia hasta que cambie los ajustes heredados."
+"Redirect URI - leave blank unless your application specifically requires "
+"this"
+msgstr "URI de redirección - dejar en blanco a menos que su aplicación específicamente lo requiera"
-#: ../../Zotlabs/Module/Connedit.php:902
-msgid "Last update:"
-msgstr "Última actualización:"
+#: ../../Zotlabs/Module/Settings/Oauth.php:93
+#: ../../Zotlabs/Module/Settings/Oauth.php:119
+msgid "Icon url"
+msgstr "Dirección del icono"
-#: ../../Zotlabs/Module/Connedit.php:911
-msgid "Details"
-msgstr "Detalles"
+#: ../../Zotlabs/Module/Settings/Oauth.php:93
+#: ../../Zotlabs/Module/Sources.php:112 ../../Zotlabs/Module/Sources.php:147
+msgid "Optional"
+msgstr "Opcional"
-#: ../../Zotlabs/Module/Connedit.php:914
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1137
-msgid "Organisation"
-msgstr "Organización"
+#: ../../Zotlabs/Module/Settings/Oauth.php:104
+msgid "Application not found."
+msgstr "Aplicación no encontrada."
-#: ../../Zotlabs/Module/Connedit.php:915
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1138
-#: ../../include/page_widgets.php:46
-msgid "Title"
-msgstr "Título"
+#: ../../Zotlabs/Module/Settings/Oauth.php:147
+msgid "Connected Apps"
+msgstr "Aplicaciones (apps) conectadas"
-#: ../../Zotlabs/Module/Connedit.php:916 ../../Zotlabs/Module/Profiles.php:789
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1139
-msgid "Phone"
-msgstr "Teléfono"
+#: ../../Zotlabs/Module/Settings/Oauth.php:151
+msgid "Client key starts with"
+msgstr "La \"client key\" empieza por"
-#: ../../Zotlabs/Module/Connedit.php:918 ../../Zotlabs/Module/Profiles.php:791
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1141
-msgid "Instant messenger"
-msgstr "Mensajería instantánea"
+#: ../../Zotlabs/Module/Settings/Oauth.php:152
+msgid "No name"
+msgstr "Sin nombre"
-#: ../../Zotlabs/Module/Connedit.php:919 ../../Zotlabs/Module/Profiles.php:792
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1142
-msgid "Website"
-msgstr "Sitio web"
+#: ../../Zotlabs/Module/Settings/Oauth.php:153
+msgid "Remove authorization"
+msgstr "Eliminar autorización"
-#: ../../Zotlabs/Module/Connedit.php:921 ../../Zotlabs/Module/Profiles.php:794
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1144
-msgid "Note"
-msgstr "Nota"
+#: ../../Zotlabs/Module/Embedphotos.php:140
+#: ../../Zotlabs/Module/Photos.php:751 ../../Zotlabs/Module/Photos.php:1290
+#: ../../Zotlabs/Widget/Album.php:78
+msgid "View Photo"
+msgstr "Ver foto"
-#: ../../Zotlabs/Module/Connedit.php:922 ../../Zotlabs/Module/Profiles.php:795
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1145
-#: ../../extend/addon/addon/cdav/cdav.php:270
-#: ../../include/connections.php:668
-msgid "Mobile"
-msgstr "Móvil"
+#: ../../Zotlabs/Module/Embedphotos.php:146
+#: ../../Zotlabs/Module/Photos.php:757 ../../Zotlabs/Module/Photos.php:1213
+#: ../../Zotlabs/Lib/Apps.php:571 ../../Zotlabs/Lib/Apps.php:649
+#: ../../Zotlabs/Storage/Browser.php:163 ../../Zotlabs/Widget/Album.php:84
+#: ../../addon/cdav/Mod_Cdav.php:745 ../../addon/cdav/Mod_Cdav.php:746
+#: ../../addon/cdav/Mod_Cdav.php:753 ../../include/conversation.php:1110
+msgid "Unknown"
+msgstr "Desconocido"
-#: ../../Zotlabs/Module/Connedit.php:923 ../../Zotlabs/Module/Profiles.php:796
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1146
-#: ../../extend/addon/addon/cdav/cdav.php:271
-#: ../../include/connections.php:669
-msgid "Home"
-msgstr "Inicio"
+#: ../../Zotlabs/Module/Embedphotos.php:156
+#: ../../Zotlabs/Module/Photos.php:782 ../../Zotlabs/Widget/Album.php:95
+msgid "Edit Album"
+msgstr "Editar álbum"
-#: ../../Zotlabs/Module/Connedit.php:924 ../../Zotlabs/Module/Profiles.php:797
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1147
-#: ../../extend/addon/addon/cdav/cdav.php:274
-#: ../../include/connections.php:672
-msgid "Work"
-msgstr "Trabajo"
+#: ../../Zotlabs/Module/Embedphotos.php:158
+#: ../../Zotlabs/Module/Photos.php:784 ../../Zotlabs/Module/Photos.php:1321
+#: ../../Zotlabs/Module/Profile_photo.php:423
+#: ../../Zotlabs/Module/Cover_photo.php:361
+#: ../../Zotlabs/Storage/Browser.php:229 ../../Zotlabs/Storage/Browser.php:334
+#: ../../Zotlabs/Widget/Album.php:97 ../../addon/cdav/include/widgets.php:132
+#: ../../addon/cdav/include/widgets.php:168
+msgid "Upload"
+msgstr "Subir"
-#: ../../Zotlabs/Module/Connedit.php:926 ../../Zotlabs/Module/Profiles.php:799
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:368
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1149
-msgid "Add Contact"
-msgstr "Añadir un contacto"
+#: ../../Zotlabs/Module/Achievements.php:38
+msgid "Some blurb about what to do when you're new here"
+msgstr "Algunas propuestas para el nuevo usuario sobre qué se puede hacer aquí"
-#: ../../Zotlabs/Module/Connedit.php:927 ../../Zotlabs/Module/Profiles.php:800
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1150
-msgid "Add Field"
-msgstr "Añadir un campo"
+#: ../../Zotlabs/Module/Thing.php:114
+msgid "Thing updated"
+msgstr "Elemento actualizado."
-#: ../../Zotlabs/Module/Connedit.php:932
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1155
-msgid "P.O. Box"
-msgstr "Buzón de correos"
+#: ../../Zotlabs/Module/Thing.php:166
+msgid "Object store: failed"
+msgstr "Guardar objeto: ha fallado"
-#: ../../Zotlabs/Module/Connedit.php:933
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1156
-msgid "Additional"
-msgstr "Adicional"
+#: ../../Zotlabs/Module/Thing.php:170
+msgid "Thing added"
+msgstr "Elemento añadido"
-#: ../../Zotlabs/Module/Connedit.php:934
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1157
-msgid "Street"
-msgstr "Calle"
+#: ../../Zotlabs/Module/Thing.php:196
+#, php-format
+msgid "OBJ: %1$s %2$s %3$s"
+msgstr "OBJ: %1$s %2$s %3$s"
-#: ../../Zotlabs/Module/Connedit.php:935
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1158
-msgid "Locality"
-msgstr "Localidad"
+#: ../../Zotlabs/Module/Thing.php:259
+msgid "Show Thing"
+msgstr "Mostrar elemento"
-#: ../../Zotlabs/Module/Connedit.php:936
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1159
-msgid "Region"
-msgstr "Provincia, región o estado"
+#: ../../Zotlabs/Module/Thing.php:266
+msgid "item not found."
+msgstr "elemento no encontrado."
-#: ../../Zotlabs/Module/Connedit.php:937
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1160
-msgid "ZIP Code"
-msgstr "Código postal"
+#: ../../Zotlabs/Module/Thing.php:299
+msgid "Edit Thing"
+msgstr "Editar elemento"
-#: ../../Zotlabs/Module/Connedit.php:938 ../../Zotlabs/Module/Profiles.php:760
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1161
-msgid "Country"
-msgstr "País"
+#: ../../Zotlabs/Module/Thing.php:301 ../../Zotlabs/Module/Thing.php:355
+msgid "Select a profile"
+msgstr "Seleccionar un perfil"
-#: ../../Zotlabs/Module/Events.php:25
-msgid "Calendar entries imported."
-msgstr "Entradas de calendario importadas."
+#: ../../Zotlabs/Module/Thing.php:305 ../../Zotlabs/Module/Thing.php:358
+msgid "Post an activity"
+msgstr "Publicar una actividad"
-#: ../../Zotlabs/Module/Events.php:27
-msgid "No calendar entries found."
-msgstr "No se han encontrado entradas de calendario."
+#: ../../Zotlabs/Module/Thing.php:305 ../../Zotlabs/Module/Thing.php:358
+msgid "Only sends to viewers of the applicable profile"
+msgstr "Sólo enviar a espectadores del perfil pertinente."
-#: ../../Zotlabs/Module/Events.php:110
-msgid "Event can not end before it has started."
-msgstr "Un evento no puede terminar antes de que haya comenzado."
+#: ../../Zotlabs/Module/Thing.php:307 ../../Zotlabs/Module/Thing.php:360
+msgid "Name of thing e.g. something"
+msgstr "Nombre del elemento, p. ej.:. \"algo\""
-#: ../../Zotlabs/Module/Events.php:112 ../../Zotlabs/Module/Events.php:121
-#: ../../Zotlabs/Module/Events.php:143
-msgid "Unable to generate preview."
-msgstr "No se puede crear la vista previa."
+#: ../../Zotlabs/Module/Thing.php:309 ../../Zotlabs/Module/Thing.php:361
+msgid "URL of thing (optional)"
+msgstr "Dirección del elemento (opcional)"
-#: ../../Zotlabs/Module/Events.php:119
-msgid "Event title and start time are required."
-msgstr "Se requieren el título del evento y su hora de inicio."
+#: ../../Zotlabs/Module/Thing.php:311 ../../Zotlabs/Module/Thing.php:362
+msgid "URL for photo of thing (optional)"
+msgstr "Dirección para la foto o elemento (opcional)"
-#: ../../Zotlabs/Module/Events.php:141 ../../Zotlabs/Module/Events.php:265
-msgid "Event not found."
-msgstr "Evento no encontrado."
+#: ../../Zotlabs/Module/Thing.php:313 ../../Zotlabs/Module/Thing.php:363
+#: ../../Zotlabs/Module/Photos.php:647 ../../Zotlabs/Module/Photos.php:1011
+#: ../../Zotlabs/Module/Connedit.php:672 ../../Zotlabs/Module/Chat.php:233
+#: ../../Zotlabs/Module/Filestorage.php:152
+#: ../../include/acl_selectors.php:218
+msgid "Permissions"
+msgstr "Permisos"
-#: ../../Zotlabs/Module/Events.php:260 ../../Zotlabs/Module/Like.php:372
-#: ../../Zotlabs/Module/Tagger.php:51 ../../include/event.php:1141
-#: ../../include/conversation.php:123 ../../include/text.php:1961
-msgid "event"
-msgstr "evento"
+#: ../../Zotlabs/Module/Thing.php:353
+msgid "Add Thing to your Profile"
+msgstr "Añadir alguna cosa a su perfil"
-#: ../../Zotlabs/Module/Events.php:460
-msgid "Edit event title"
-msgstr "Editar el título del evento"
+#: ../../Zotlabs/Module/Notify.php:57
+#: ../../Zotlabs/Module/Notifications.php:38
+msgid "No more system notifications."
+msgstr "No hay más notificaciones del sistema"
-#: ../../Zotlabs/Module/Events.php:460
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:835
-msgid "Event title"
-msgstr "Título del evento"
+#: ../../Zotlabs/Module/Notify.php:61
+#: ../../Zotlabs/Module/Notifications.php:42
+msgid "System Notifications"
+msgstr "Notificaciones del sistema"
-#: ../../Zotlabs/Module/Events.php:462
-msgid "Categories (comma-separated list)"
-msgstr "Temas (lista separada por comas)"
+#: ../../Zotlabs/Module/Follow.php:31
+msgid "Channel added."
+msgstr "Canal añadido."
-#: ../../Zotlabs/Module/Events.php:463
-msgid "Edit Category"
-msgstr "Modificar el tema"
+#: ../../Zotlabs/Module/Import.php:144
+#, php-format
+msgid "Your service plan only allows %d channels."
+msgstr "Su paquete de servicios solo permite %d canales."
-#: ../../Zotlabs/Module/Events.php:463
-msgid "Category"
-msgstr "Tema"
+#: ../../Zotlabs/Module/Import.php:158
+msgid "No channel. Import failed."
+msgstr "No hay canal. La importación ha fallado"
-#: ../../Zotlabs/Module/Events.php:466
-msgid "Edit start date and time"
-msgstr "Modificar la fecha y hora de comienzo"
+#: ../../Zotlabs/Module/Import.php:466
+#: ../../addon/diaspora/import_diaspora.php:142
+msgid "Import completed."
+msgstr "Importación completada."
-#: ../../Zotlabs/Module/Events.php:466
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:836
-msgid "Start date and time"
-msgstr "Fecha y hora de comienzo"
+#: ../../Zotlabs/Module/Import.php:494
+msgid "You must be logged in to use this feature."
+msgstr "Debe estar registrado para poder usar esta funcionalidad."
-#: ../../Zotlabs/Module/Events.php:467 ../../Zotlabs/Module/Events.php:470
-msgid "Finish date and time are not known or not relevant"
-msgstr "La fecha y hora de terminación no se conocen o no son relevantes"
+#: ../../Zotlabs/Module/Import.php:499
+msgid "Import Channel"
+msgstr "Importar canal"
-#: ../../Zotlabs/Module/Events.php:469
-msgid "Edit finish date and time"
-msgstr "Modificar la fecha y hora de terminación"
+#: ../../Zotlabs/Module/Import.php:500
+msgid ""
+"Use this form to import an existing channel from a different server/hub. You"
+" may retrieve the channel identity from the old server/hub via the network "
+"or provide an export file."
+msgstr "Emplee este formulario para importar un canal desde un servidor/hub diferente. Puede recuperar el canal desde el antiguo servidor/hub a través de la red o proporcionando un fichero de exportación."
-#: ../../Zotlabs/Module/Events.php:469
-msgid "Finish date and time"
-msgstr "Fecha y hora de terminación"
+#: ../../Zotlabs/Module/Import.php:502
+msgid "Or provide the old server/hub details"
+msgstr "O proporcione los detalles de su antiguo servidor/hub"
-#: ../../Zotlabs/Module/Events.php:471 ../../Zotlabs/Module/Events.php:472
-msgid "Adjust for viewer timezone"
-msgstr "Ajustar para obtener el visor de los husos horarios"
+#: ../../Zotlabs/Module/Import.php:503
+msgid "Your old identity address (xyz@example.com)"
+msgstr "Su identidad en el antiguo servidor (canal@ejemplo.com)"
-#: ../../Zotlabs/Module/Events.php:471
+#: ../../Zotlabs/Module/Import.php:504
+msgid "Your old login email address"
+msgstr "Su antigua dirección de correo electrónico"
+
+#: ../../Zotlabs/Module/Import.php:505
+msgid "Your old login password"
+msgstr "Su antigua contraseña"
+
+#: ../../Zotlabs/Module/Import.php:506
msgid ""
-"Important for events that happen in a particular place. Not practical for "
-"global holidays."
-msgstr "Importante para los eventos que suceden en un lugar determinado. No es práctico para los globales."
+"For either option, please choose whether to make this hub your new primary "
+"address, or whether your old location should continue this role. You will be"
+" able to post from either location, but only one can be marked as the "
+"primary location for files, photos, and media."
+msgstr "Para cualquiera de las opciones, elija si hacer de este servidor su nueva dirección primaria, o si su antigua dirección debe continuar con este papel. Usted podrá publicar desde cualquier ubicación, pero sólo una puede estar marcada como la ubicación principal para los ficheros, fotos y otras imágenes o vídeos."
-#: ../../Zotlabs/Module/Events.php:473
-msgid "Edit Description"
-msgstr "Editar la descripción"
+#: ../../Zotlabs/Module/Import.php:507
+msgid "Make this hub my primary location"
+msgstr "Convertir este servidor en mi ubicación primaria"
-#: ../../Zotlabs/Module/Events.php:475
-msgid "Edit Location"
-msgstr "Modificar la dirección"
+#: ../../Zotlabs/Module/Import.php:508
+msgid "Move this channel (disable all previous locations)"
+msgstr "Mover este canal (desactivar todas las ubicaciones anteriores)"
-#: ../../Zotlabs/Module/Events.php:478 ../../Zotlabs/Module/Photos.php:1094
-#: ../../Zotlabs/Module/Webpages.php:251 ../../Zotlabs/Lib/ThreadItem.php:740
-#: ../../include/page_widgets.php:43 ../../include/conversation.php:1347
-msgid "Preview"
-msgstr "Previsualizar"
+#: ../../Zotlabs/Module/Import.php:509
+msgid "Import a few months of posts if possible (limited by available memory"
+msgstr "Importar unos meses de mensajes si es posible (limitado por la memoria disponible"
-#: ../../Zotlabs/Module/Events.php:479 ../../include/conversation.php:1410
-msgid "Permission settings"
-msgstr "Configuración de permisos"
+#: ../../Zotlabs/Module/Import.php:510
+msgid ""
+"This process may take several minutes to complete. Please submit the form "
+"only once and leave this page open until finished."
+msgstr "Este proceso puede tardar varios minutos en completarse. Por favor envíe el formulario una sola vez y mantenga esta página abierta hasta que termine."
-#: ../../Zotlabs/Module/Events.php:489
-msgid "Timezone:"
-msgstr "Zona horaria: "
+#: ../../Zotlabs/Module/Rmagic.php:35
+msgid "Authentication failed."
+msgstr "Falló la autenticación."
-#: ../../Zotlabs/Module/Events.php:494
-msgid "Advanced Options"
-msgstr "Opciones avanzadas"
+#: ../../Zotlabs/Module/Rmagic.php:75 ../../include/channel.php:1984
+msgid "Remote Authentication"
+msgstr "Acceso desde su servidor"
-#: ../../Zotlabs/Module/Events.php:605 ../../Zotlabs/Module/Cal.php:263
-msgid "l, F j"
-msgstr "l j F"
+#: ../../Zotlabs/Module/Rmagic.php:76 ../../include/channel.php:1985
+msgid "Enter your channel address (e.g. channel@example.com)"
+msgstr "Introduzca la dirección del canal (p.ej. canal@ejemplo.com)"
-#: ../../Zotlabs/Module/Events.php:633
-msgid "Edit event"
-msgstr "Editar evento"
+#: ../../Zotlabs/Module/Rmagic.php:77 ../../include/channel.php:1986
+msgid "Authenticate"
+msgstr "Acceder"
-#: ../../Zotlabs/Module/Events.php:635
-msgid "Delete event"
-msgstr "Borrar evento"
+#: ../../Zotlabs/Module/Cal.php:62 ../../Zotlabs/Module/Chanview.php:96
+#: ../../Zotlabs/Module/Page.php:56 ../../Zotlabs/Module/Wall_upload.php:31
+#: ../../Zotlabs/Module/Block.php:43
+msgid "Channel not found."
+msgstr "Canal no encontrado."
-#: ../../Zotlabs/Module/Events.php:660 ../../Zotlabs/Module/Cal.php:312
-#: ../../include/text.php:1766
-msgid "Link to Source"
-msgstr "Enlazar con la entrada en su ubicación original"
+#: ../../Zotlabs/Module/Cal.php:69
+msgid "Permissions denied."
+msgstr "Permisos denegados."
-#: ../../Zotlabs/Module/Events.php:669
-msgid "calendar"
-msgstr "calendario"
+#: ../../Zotlabs/Module/Cal.php:342 ../../include/text.php:2291
+msgid "Import"
+msgstr "Importar"
-#: ../../Zotlabs/Module/Events.php:688 ../../Zotlabs/Module/Cal.php:335
-msgid "Edit Event"
-msgstr "Editar el evento"
+#: ../../Zotlabs/Module/Api.php:72 ../../Zotlabs/Module/Api.php:93
+msgid "Authorize application connection"
+msgstr "Autorizar una conexión de aplicación"
-#: ../../Zotlabs/Module/Events.php:688 ../../Zotlabs/Module/Cal.php:335
-msgid "Create Event"
-msgstr "Crear un evento"
+#: ../../Zotlabs/Module/Api.php:73
+msgid "Return to your app and insert this Security Code:"
+msgstr "Vuelva a su aplicación e introduzca este código de seguridad: "
-#: ../../Zotlabs/Module/Events.php:689 ../../Zotlabs/Module/Events.php:698
-#: ../../Zotlabs/Module/Photos.php:935 ../../Zotlabs/Module/Cal.php:336
-#: ../../Zotlabs/Module/Cal.php:343
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:846
-msgid "Previous"
-msgstr "Anterior"
+#: ../../Zotlabs/Module/Api.php:83
+msgid "Please login to continue."
+msgstr "Por favor inicie sesión para continuar."
-#: ../../Zotlabs/Module/Events.php:690 ../../Zotlabs/Module/Events.php:699
-#: ../../Zotlabs/Module/Photos.php:944 ../../Zotlabs/Module/Cal.php:337
-#: ../../Zotlabs/Module/Cal.php:344 ../../Zotlabs/Module/Setup.php:264
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:847
-msgid "Next"
-msgstr "Siguiente"
+#: ../../Zotlabs/Module/Api.php:95
+msgid ""
+"Do you want to authorize this application to access your posts and contacts,"
+" and/or create new posts for you?"
+msgstr "¿Desea autorizar a esta aplicación a acceder a sus publicaciones y contactos, y/o crear nuevas publicaciones por usted?"
-#: ../../Zotlabs/Module/Events.php:691 ../../Zotlabs/Module/Cal.php:338
-#: ../../include/channel.php:1370
-msgid "Export"
-msgstr "Exportar"
+#: ../../Zotlabs/Module/Attach.php:13
+msgid "Item not available."
+msgstr "Elemento no disponible"
-#: ../../Zotlabs/Module/Events.php:695
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:849
-msgid "Month"
-msgstr "Mes"
+#: ../../Zotlabs/Module/Editblock.php:116 ../../Zotlabs/Module/Chat.php:205
+#: ../../Zotlabs/Module/Editwebpage.php:143 ../../Zotlabs/Module/Mail.php:306
+#: ../../Zotlabs/Module/Mail.php:448 ../../include/conversation.php:1228
+msgid "Insert web link"
+msgstr "Insertar enlace web"
-#: ../../Zotlabs/Module/Events.php:696
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:850
-msgid "Week"
-msgstr "Semana"
+#: ../../Zotlabs/Module/Editblock.php:129 ../../include/conversation.php:1339
+msgid "Title (optional)"
+msgstr "Título (opcional)"
-#: ../../Zotlabs/Module/Events.php:697
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:851
-msgid "Day"
-msgstr "Día"
+#: ../../Zotlabs/Module/Editblock.php:138
+msgid "Edit Block"
+msgstr "Modificar este bloque"
-#: ../../Zotlabs/Module/Events.php:700 ../../Zotlabs/Module/Cal.php:345
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:848
-msgid "Today"
-msgstr "Hoy"
+#: ../../Zotlabs/Module/Profile.php:91
+msgid "vcard"
+msgstr "vcard"
-#: ../../Zotlabs/Module/Events.php:731
-msgid "Event removed"
-msgstr "Evento borrado"
+#: ../../Zotlabs/Module/Apps.php:45
+msgid "Apps"
+msgstr "Aplicaciones (apps)"
-#: ../../Zotlabs/Module/Events.php:734
-msgid "Failed to remove event"
-msgstr "Error al eliminar el evento"
+#: ../../Zotlabs/Module/Apps.php:48
+msgid "Manage apps"
+msgstr "Gestionar las aplicaciones"
-#: ../../Zotlabs/Module/Home.php:74 ../../Zotlabs/Module/Home.php:82
-#: ../../extend/addon/addon/opensearch/opensearch.php:42
-msgid "$Projectname"
-msgstr "$Projectname"
+#: ../../Zotlabs/Module/Apps.php:49
+msgid "Create new app"
+msgstr "Crear una nueva aplicación"
-#: ../../Zotlabs/Module/Home.php:92
+#: ../../Zotlabs/Module/Mood.php:67 ../../include/conversation.php:256
#, php-format
-msgid "Welcome to %s"
-msgstr "Bienvenido a %s"
+msgctxt "mood"
+msgid "%1$s is %2$s"
+msgstr "%1$s está %2$s"
-#: ../../Zotlabs/Module/Filestorage.php:87
-msgid "Permission Denied."
-msgstr "Permiso denegado"
+#: ../../Zotlabs/Module/Mood.php:135 ../../Zotlabs/Lib/Apps.php:234
+msgid "Mood"
+msgstr "Estado de ánimo"
-#: ../../Zotlabs/Module/Filestorage.php:103
-msgid "File not found."
-msgstr "Fichero no encontrado."
+#: ../../Zotlabs/Module/Mood.php:136
+msgid "Set your current mood and tell your friends"
+msgstr "Describir su estado de ánimo para comunicárselo a sus amigos"
-#: ../../Zotlabs/Module/Filestorage.php:146
-msgid "Edit file permissions"
-msgstr "Modificar los permisos del fichero"
+#: ../../Zotlabs/Module/Connections.php:52
+#: ../../Zotlabs/Module/Connections.php:157
+#: ../../Zotlabs/Module/Connections.php:246
+msgid "Blocked"
+msgstr "Bloqueadas"
-#: ../../Zotlabs/Module/Filestorage.php:159
-msgid "Set/edit permissions"
-msgstr "Establecer/editar los permisos"
+#: ../../Zotlabs/Module/Connections.php:57
+#: ../../Zotlabs/Module/Connections.php:164
+#: ../../Zotlabs/Module/Connections.php:245
+msgid "Ignored"
+msgstr "Ignoradas"
-#: ../../Zotlabs/Module/Filestorage.php:160
-msgid "Include all files and sub folders"
-msgstr "Incluir todos los ficheros y subcarpetas"
+#: ../../Zotlabs/Module/Connections.php:62
+#: ../../Zotlabs/Module/Connections.php:178
+#: ../../Zotlabs/Module/Connections.php:244
+msgid "Hidden"
+msgstr "Ocultas"
-#: ../../Zotlabs/Module/Filestorage.php:161
-msgid "Return to file list"
-msgstr "Volver a la lista de ficheros"
+#: ../../Zotlabs/Module/Connections.php:67
+#: ../../Zotlabs/Module/Connections.php:171
+#: ../../Zotlabs/Module/Connections.php:243
+msgid "Archived"
+msgstr "Archivadas"
-#: ../../Zotlabs/Module/Filestorage.php:163
-msgid "Copy/paste this code to attach file to a post"
-msgstr "Copiar/pegar este código para adjuntar el fichero al envío"
+#: ../../Zotlabs/Module/Connections.php:72
+#: ../../Zotlabs/Module/Connections.php:82 ../../Zotlabs/Module/Menu.php:116
+#: ../../include/conversation.php:1666
+msgid "New"
+msgstr "Nuevas"
-#: ../../Zotlabs/Module/Filestorage.php:164
-msgid "Copy/paste this URL to link file from a web page"
-msgstr "Copiar/pegar esta dirección para enlazar el fichero desde una página web"
+#: ../../Zotlabs/Module/Connections.php:88
+#: ../../Zotlabs/Module/Connections.php:103
+#: ../../Zotlabs/Module/Connedit.php:709 ../../Zotlabs/Widget/Affinity.php:30
+msgid "All"
+msgstr "Todos/as"
-#: ../../Zotlabs/Module/Filestorage.php:166
-msgid "Share this file"
-msgstr "Compartir este fichero"
+#: ../../Zotlabs/Module/Connections.php:134
+msgid "New Connections"
+msgstr "Nuevas conexiones"
-#: ../../Zotlabs/Module/Filestorage.php:167
-msgid "Show URL to this file"
-msgstr "Mostrar la dirección de este fichero"
+#: ../../Zotlabs/Module/Connections.php:137
+msgid "Show pending (new) connections"
+msgstr "Mostrar conexiones (nuevas) pendientes"
-#: ../../Zotlabs/Module/Filestorage.php:168
-msgid "Notify your contacts about this file"
-msgstr "Avisar a sus contactos sobre este fichero"
+#: ../../Zotlabs/Module/Connections.php:144
+msgid "Show all connections"
+msgstr "Mostrar todas las conexiones"
-#: ../../Zotlabs/Module/Fbrowser.php:29 ../../Zotlabs/Lib/Apps.php:229
-#: ../../include/conversation.php:1836
-msgid "Photos"
-msgstr "Fotos"
+#: ../../Zotlabs/Module/Connections.php:160
+msgid "Only show blocked connections"
+msgstr "Mostrar solo las conexiones bloqueadas"
+
+#: ../../Zotlabs/Module/Connections.php:167
+msgid "Only show ignored connections"
+msgstr "Mostrar solo conexiones ignoradas"
+
+#: ../../Zotlabs/Module/Connections.php:174
+msgid "Only show archived connections"
+msgstr "Mostrar solo las conexiones archivadas"
+
+#: ../../Zotlabs/Module/Connections.php:181
+msgid "Only show hidden connections"
+msgstr "Mostrar solo las conexiones ocultas"
+
+#: ../../Zotlabs/Module/Connections.php:242
+msgid "Pending approval"
+msgstr "Pendiente de aprobación"
+
+#: ../../Zotlabs/Module/Connections.php:258
+#, php-format
+msgid "%1$s [%2$s]"
+msgstr "%1$s [%2$s]"
+
+#: ../../Zotlabs/Module/Connections.php:259
+msgid "Edit connection"
+msgstr "Editar conexión"
+
+#: ../../Zotlabs/Module/Connections.php:260
+msgid "Delete connection"
+msgstr "Eliminar conexión"
+
+#: ../../Zotlabs/Module/Connections.php:269
+msgid "Channel address"
+msgstr "Dirección del canal"
+
+#: ../../Zotlabs/Module/Connections.php:271
+msgid "Network"
+msgstr "Red"
+
+#: ../../Zotlabs/Module/Connections.php:274
+msgid "Call"
+msgstr "Llamar"
+
+#: ../../Zotlabs/Module/Connections.php:276
+msgid "Status"
+msgstr "Estado"
+
+#: ../../Zotlabs/Module/Connections.php:278
+msgid "Connected"
+msgstr "Conectado/a"
+
+#: ../../Zotlabs/Module/Connections.php:280
+msgid "Approve connection"
+msgstr "Aprobar esta conexión"
+
+#: ../../Zotlabs/Module/Connections.php:282
+msgid "Ignore connection"
+msgstr "Ignorar esta conexión"
+
+#: ../../Zotlabs/Module/Connections.php:283
+#: ../../Zotlabs/Module/Connedit.php:626
+msgid "Ignore"
+msgstr "Ignorar"
+
+#: ../../Zotlabs/Module/Connections.php:284
+msgid "Recent activity"
+msgstr "Actividad reciente"
+
+#: ../../Zotlabs/Module/Connections.php:308 ../../Zotlabs/Lib/Apps.php:216
+#: ../../include/text.php:957 ../../include/nav.php:185
+msgid "Connections"
+msgstr "Conexiones"
+
+#: ../../Zotlabs/Module/Connections.php:313
+msgid "Search your connections"
+msgstr "Buscar sus conexiones"
+
+#: ../../Zotlabs/Module/Connections.php:314
+msgid "Connections search"
+msgstr "Buscar conexiones"
+
+#: ../../Zotlabs/Module/Connections.php:315
+#: ../../Zotlabs/Module/Directory.php:391
+#: ../../Zotlabs/Module/Directory.php:396 ../../include/contact_widgets.php:23
+msgid "Find"
+msgstr "Encontrar"
+
+#: ../../Zotlabs/Module/Viewsrc.php:43
+msgid "item"
+msgstr "elemento"
+
+#: ../../Zotlabs/Module/Viewsrc.php:55
+msgid "Source of Item"
+msgstr "Origen del elemento"
+
+#: ../../Zotlabs/Module/Bookmarks.php:53
+msgid "Bookmark added"
+msgstr "Marcador añadido"
+
+#: ../../Zotlabs/Module/Bookmarks.php:76
+msgid "My Bookmarks"
+msgstr "Mis marcadores"
+
+#: ../../Zotlabs/Module/Bookmarks.php:87
+msgid "My Connections Bookmarks"
+msgstr "Marcadores de mis conexiones"
+
+#: ../../Zotlabs/Module/Removeaccount.php:35
+msgid ""
+"Account removals are not allowed within 48 hours of changing the account "
+"password."
+msgstr "La eliminación de cuentas no está permitida hasta después de que hayan transcurrido 48 horas desde el último cambio de contraseña."
+
+#: ../../Zotlabs/Module/Removeaccount.php:57
+msgid "Remove This Account"
+msgstr "Eliminar esta cuenta"
+
+#: ../../Zotlabs/Module/Removeaccount.php:58
+msgid ""
+"This account and all its channels will be completely removed from the "
+"network. "
+msgstr "Esta cuenta y todos sus canales van a ser eliminados de la red."
+
+#: ../../Zotlabs/Module/Removeaccount.php:60
+msgid ""
+"Remove this account, all its channels and all its channel clones from the "
+"network"
+msgstr "Remover esta cuenta, todos sus canales y clones de la red"
+
+#: ../../Zotlabs/Module/Removeaccount.php:60
+msgid ""
+"By default only the instances of the channels located on this hub will be "
+"removed from the network"
+msgstr "Por defecto, solo las instancias de los canales ubicados en este servidor serán eliminados de la red"
-#: ../../Zotlabs/Module/Photos.php:82
+#: ../../Zotlabs/Module/Photos.php:78
msgid "Page owner information could not be retrieved."
msgstr "La información del propietario de la página no pudo ser recuperada."
-#: ../../Zotlabs/Module/Photos.php:97 ../../Zotlabs/Module/Photos.php:729
-#: ../../Zotlabs/Module/Profile_photo.php:115
-#: ../../Zotlabs/Module/Profile_photo.php:224
-#: ../../include/photo/photo_driver.php:730
-msgid "Profile Photos"
-msgstr "Fotos del perfil"
-
-#: ../../Zotlabs/Module/Photos.php:103 ../../Zotlabs/Module/Photos.php:129
+#: ../../Zotlabs/Module/Photos.php:94 ../../Zotlabs/Module/Photos.php:120
msgid "Album not found."
msgstr "Ãlbum no encontrado."
-#: ../../Zotlabs/Module/Photos.php:112
+#: ../../Zotlabs/Module/Photos.php:103
msgid "Delete Album"
msgstr "Borrar álbum"
-#: ../../Zotlabs/Module/Photos.php:133
-msgid ""
-"Multiple storage folders exist with this album name, but within different "
-"directories. Please remove the desired folder or folders using the Files "
-"manager"
-msgstr "Hay varias carpetas con este nombre de álbum, pero dentro de diferentes directorios. Por favor, elimine la carpeta o carpetas que desee utilizando el administrador de ficheros"
-
-#: ../../Zotlabs/Module/Photos.php:190 ../../Zotlabs/Module/Photos.php:1054
+#: ../../Zotlabs/Module/Photos.php:174 ../../Zotlabs/Module/Photos.php:1023
msgid "Delete Photo"
msgstr "Borrar foto"
-#: ../../Zotlabs/Module/Photos.php:508 ../../Zotlabs/Module/Display.php:22
-#: ../../Zotlabs/Module/Ratings.php:83 ../../Zotlabs/Module/Search.php:17
-#: ../../Zotlabs/Module/Directory.php:64
-#: ../../Zotlabs/Module/Viewconnections.php:23
-#: ../../extend/addon/addon/friendica/dfrn_request.php:794
-msgid "Public access denied."
-msgstr "Acceso público denegado."
-
-#: ../../Zotlabs/Module/Photos.php:519
+#: ../../Zotlabs/Module/Photos.php:501
msgid "No photos selected"
msgstr "No hay fotos seleccionadas"
-#: ../../Zotlabs/Module/Photos.php:568
+#: ../../Zotlabs/Module/Photos.php:550
msgid "Access to this item is restricted."
msgstr "El acceso a este elemento está restringido."
-#: ../../Zotlabs/Module/Photos.php:607
+#: ../../Zotlabs/Module/Photos.php:591
#, php-format
msgid "%1$.2f MB of %2$.2f MB photo storage used."
msgstr "%1$.2f MB de %2$.2f MB de almacenamiento de fotos utilizado."
-#: ../../Zotlabs/Module/Photos.php:610
+#: ../../Zotlabs/Module/Photos.php:594
#, php-format
msgid "%1$.2f MB photo storage used."
msgstr "%1$.2f MB de almacenamiento de fotos utilizado."
-#: ../../Zotlabs/Module/Photos.php:646
+#: ../../Zotlabs/Module/Photos.php:636
msgid "Upload Photos"
msgstr "Subir fotos"
-#: ../../Zotlabs/Module/Photos.php:650
+#: ../../Zotlabs/Module/Photos.php:640
msgid "Enter an album name"
msgstr "Introducir un nombre de álbum"
-#: ../../Zotlabs/Module/Photos.php:651
+#: ../../Zotlabs/Module/Photos.php:641
msgid "or select an existing album (doubleclick)"
msgstr "o seleccionar uno existente (doble click)"
-#: ../../Zotlabs/Module/Photos.php:652
+#: ../../Zotlabs/Module/Photos.php:642
msgid "Create a status post for this upload"
msgstr "Crear un mensaje de estado para esta subida"
-#: ../../Zotlabs/Module/Photos.php:653
+#: ../../Zotlabs/Module/Photos.php:643
msgid "Caption (optional):"
msgstr "Título (opcional):"
-#: ../../Zotlabs/Module/Photos.php:654
+#: ../../Zotlabs/Module/Photos.php:644
msgid "Description (optional):"
msgstr "Descripción (opcional):"
-#: ../../Zotlabs/Module/Photos.php:685
-msgid "Album name could not be decoded"
-msgstr "El nombre del álbum no ha podido ser descifrado"
-
-#: ../../Zotlabs/Module/Photos.php:729
-msgid "Contact Photos"
-msgstr "Fotos de contacto"
-
-#: ../../Zotlabs/Module/Photos.php:752
+#: ../../Zotlabs/Module/Photos.php:725
msgid "Show Newest First"
msgstr "Mostrar lo más reciente primero"
-#: ../../Zotlabs/Module/Photos.php:754
+#: ../../Zotlabs/Module/Photos.php:727
msgid "Show Oldest First"
msgstr "Mostrar lo más antiguo primero"
-#: ../../Zotlabs/Module/Photos.php:778 ../../Zotlabs/Module/Photos.php:1335
-#: ../../Zotlabs/Module/Embedphotos.php:139 ../../include/widgets.php:1751
-msgid "View Photo"
-msgstr "Ver foto"
-
-#: ../../Zotlabs/Module/Photos.php:809
-#: ../../Zotlabs/Module/Embedphotos.php:155 ../../include/widgets.php:1768
-msgid "Edit Album"
-msgstr "Editar álbum"
-
-#: ../../Zotlabs/Module/Photos.php:856
+#: ../../Zotlabs/Module/Photos.php:832
msgid "Permission denied. Access to this item may be restricted."
msgstr "Permiso denegado. El acceso a este elemento puede estar restringido."
-#: ../../Zotlabs/Module/Photos.php:858
+#: ../../Zotlabs/Module/Photos.php:834
msgid "Photo not available"
msgstr "Foto no disponible"
-#: ../../Zotlabs/Module/Photos.php:916
+#: ../../Zotlabs/Module/Photos.php:892
msgid "Use as profile photo"
msgstr "Usar como foto del perfil"
-#: ../../Zotlabs/Module/Photos.php:917
+#: ../../Zotlabs/Module/Photos.php:893
msgid "Use as cover photo"
msgstr "Usar como imagen de portada del perfil"
-#: ../../Zotlabs/Module/Photos.php:924
+#: ../../Zotlabs/Module/Photos.php:900
msgid "Private Photo"
msgstr "Foto privada"
-#: ../../Zotlabs/Module/Photos.php:939
+#: ../../Zotlabs/Module/Photos.php:915
msgid "View Full Size"
msgstr "Ver tamaño completo"
-#: ../../Zotlabs/Module/Photos.php:1028
+#: ../../Zotlabs/Module/Photos.php:997
msgid "Edit photo"
msgstr "Editar foto"
-#: ../../Zotlabs/Module/Photos.php:1030
+#: ../../Zotlabs/Module/Photos.php:999
msgid "Rotate CW (right)"
msgstr "Girar CW (a la derecha)"
-#: ../../Zotlabs/Module/Photos.php:1031
+#: ../../Zotlabs/Module/Photos.php:1000
msgid "Rotate CCW (left)"
msgstr "Girar CCW (a la izquierda)"
-#: ../../Zotlabs/Module/Photos.php:1034
+#: ../../Zotlabs/Module/Photos.php:1003
msgid "Move photo to album"
msgstr "Mover la foto a un álbum"
-#: ../../Zotlabs/Module/Photos.php:1035
+#: ../../Zotlabs/Module/Photos.php:1004
msgid "Enter a new album name"
msgstr "Introducir un nuevo nombre de álbum"
-#: ../../Zotlabs/Module/Photos.php:1036
+#: ../../Zotlabs/Module/Photos.php:1005
msgid "or select an existing one (doubleclick)"
msgstr "o seleccionar uno (doble click) existente"
-#: ../../Zotlabs/Module/Photos.php:1039
+#: ../../Zotlabs/Module/Photos.php:1008
msgid "Caption"
msgstr "Título"
-#: ../../Zotlabs/Module/Photos.php:1041
+#: ../../Zotlabs/Module/Photos.php:1010
msgid "Add a Tag"
msgstr "Añadir una etiqueta"
-#: ../../Zotlabs/Module/Photos.php:1049
+#: ../../Zotlabs/Module/Photos.php:1018
msgid "Example: @bob, @Barbara_Jensen, @jim@example.com"
msgstr "Ejemplos: @eva, @Carmen_Osuna, @jaime@ejemplo.com"
-#: ../../Zotlabs/Module/Photos.php:1052
+#: ../../Zotlabs/Module/Photos.php:1021
msgid "Flag as adult in album view"
msgstr "Marcar como \"solo para adultos\" en el álbum"
-#: ../../Zotlabs/Module/Photos.php:1071 ../../Zotlabs/Lib/ThreadItem.php:268
+#: ../../Zotlabs/Module/Photos.php:1040 ../../Zotlabs/Lib/ThreadItem.php:269
msgid "I like this (toggle)"
msgstr "Me gusta (cambiar)"
-#: ../../Zotlabs/Module/Photos.php:1072 ../../Zotlabs/Lib/ThreadItem.php:269
+#: ../../Zotlabs/Module/Photos.php:1041 ../../Zotlabs/Lib/ThreadItem.php:270
msgid "I don't like this (toggle)"
msgstr "No me gusta esto (cambiar)"
-#: ../../Zotlabs/Module/Photos.php:1073 ../../Zotlabs/Module/Webpages.php:245
-#: ../../Zotlabs/Module/Blocks.php:161 ../../Zotlabs/Module/Layouts.php:193
-#: ../../extend/addon/addon/cdav/include/widgets.php:123
-#: ../../include/conversation.php:1378
-msgid "Share"
-msgstr "Compartir"
-
-#: ../../Zotlabs/Module/Photos.php:1074 ../../Zotlabs/Lib/ThreadItem.php:411
-#: ../../include/conversation.php:738
+#: ../../Zotlabs/Module/Photos.php:1043 ../../Zotlabs/Lib/ThreadItem.php:412
+#: ../../include/conversation.php:739
msgid "Please wait"
msgstr "Espere por favor"
-#: ../../Zotlabs/Module/Photos.php:1090 ../../Zotlabs/Module/Photos.php:1208
-#: ../../Zotlabs/Lib/ThreadItem.php:728
+#: ../../Zotlabs/Module/Photos.php:1059 ../../Zotlabs/Module/Photos.php:1177
+#: ../../Zotlabs/Lib/ThreadItem.php:729
msgid "This is you"
msgstr "Este es usted"
-#: ../../Zotlabs/Module/Photos.php:1092 ../../Zotlabs/Module/Photos.php:1210
-#: ../../Zotlabs/Lib/ThreadItem.php:730 ../../include/js_strings.php:6
+#: ../../Zotlabs/Module/Photos.php:1061 ../../Zotlabs/Module/Photos.php:1179
+#: ../../Zotlabs/Lib/ThreadItem.php:731 ../../include/js_strings.php:6
msgid "Comment"
msgstr "Comentar"
-#: ../../Zotlabs/Module/Photos.php:1108 ../../include/conversation.php:577
+#: ../../Zotlabs/Module/Photos.php:1077 ../../include/conversation.php:574
msgctxt "title"
msgid "Likes"
msgstr "Me gusta"
-#: ../../Zotlabs/Module/Photos.php:1108 ../../include/conversation.php:577
+#: ../../Zotlabs/Module/Photos.php:1077 ../../include/conversation.php:574
msgctxt "title"
msgid "Dislikes"
msgstr "No me gusta"
-#: ../../Zotlabs/Module/Photos.php:1109 ../../include/conversation.php:578
+#: ../../Zotlabs/Module/Photos.php:1078 ../../include/conversation.php:575
msgctxt "title"
msgid "Agree"
msgstr "De acuerdo"
-#: ../../Zotlabs/Module/Photos.php:1109 ../../include/conversation.php:578
+#: ../../Zotlabs/Module/Photos.php:1078 ../../include/conversation.php:575
msgctxt "title"
msgid "Disagree"
msgstr "En desacuerdo"
-#: ../../Zotlabs/Module/Photos.php:1109 ../../include/conversation.php:578
+#: ../../Zotlabs/Module/Photos.php:1078 ../../include/conversation.php:575
msgctxt "title"
msgid "Abstain"
msgstr "Abstención"
-#: ../../Zotlabs/Module/Photos.php:1110 ../../include/conversation.php:579
+#: ../../Zotlabs/Module/Photos.php:1079 ../../include/conversation.php:576
msgctxt "title"
msgid "Attending"
msgstr "Participaré"
-#: ../../Zotlabs/Module/Photos.php:1110 ../../include/conversation.php:579
+#: ../../Zotlabs/Module/Photos.php:1079 ../../include/conversation.php:576
msgctxt "title"
msgid "Not attending"
msgstr "No participaré"
-#: ../../Zotlabs/Module/Photos.php:1110 ../../include/conversation.php:579
+#: ../../Zotlabs/Module/Photos.php:1079 ../../include/conversation.php:576
msgctxt "title"
msgid "Might attend"
msgstr "Quizá participe"
-#: ../../Zotlabs/Module/Photos.php:1127 ../../Zotlabs/Module/Photos.php:1139
-#: ../../Zotlabs/Lib/ThreadItem.php:186 ../../Zotlabs/Lib/ThreadItem.php:198
-#: ../../include/conversation.php:1928
+#: ../../Zotlabs/Module/Photos.php:1096 ../../Zotlabs/Module/Photos.php:1108
+#: ../../Zotlabs/Lib/ThreadItem.php:187 ../../Zotlabs/Lib/ThreadItem.php:199
msgid "View all"
msgstr "Ver todo"
-#: ../../Zotlabs/Module/Photos.php:1131 ../../Zotlabs/Lib/ThreadItem.php:190
-#: ../../include/taxonomy.php:403 ../../include/conversation.php:1952
-#: ../../include/channel.php:1273
+#: ../../Zotlabs/Module/Photos.php:1100 ../../Zotlabs/Lib/ThreadItem.php:191
+#: ../../include/conversation.php:1907 ../../include/channel.php:1268
+#: ../../include/taxonomy.php:403
msgctxt "noun"
msgid "Like"
msgid_plural "Likes"
msgstr[0] "Me gusta"
msgstr[1] "Me gusta"
-#: ../../Zotlabs/Module/Photos.php:1136 ../../Zotlabs/Lib/ThreadItem.php:195
-#: ../../include/conversation.php:1955
+#: ../../Zotlabs/Module/Photos.php:1105 ../../Zotlabs/Lib/ThreadItem.php:196
+#: ../../include/conversation.php:1910
msgctxt "noun"
msgid "Dislike"
msgid_plural "Dislikes"
msgstr[0] "No me gusta"
msgstr[1] "No me gusta"
-#: ../../Zotlabs/Module/Photos.php:1236
+#: ../../Zotlabs/Module/Photos.php:1205
msgid "Photo Tools"
msgstr "Gestión de las fotos"
-#: ../../Zotlabs/Module/Photos.php:1245
+#: ../../Zotlabs/Module/Photos.php:1214
msgid "In This Photo:"
msgstr "En esta foto:"
-#: ../../Zotlabs/Module/Photos.php:1250
+#: ../../Zotlabs/Module/Photos.php:1219
msgid "Map"
msgstr "Mapa"
-#: ../../Zotlabs/Module/Photos.php:1258 ../../Zotlabs/Lib/ThreadItem.php:400
+#: ../../Zotlabs/Module/Photos.php:1227 ../../Zotlabs/Lib/ThreadItem.php:401
msgctxt "noun"
msgid "Likes"
msgstr "Me gusta"
-#: ../../Zotlabs/Module/Photos.php:1259 ../../Zotlabs/Lib/ThreadItem.php:401
+#: ../../Zotlabs/Module/Photos.php:1228 ../../Zotlabs/Lib/ThreadItem.php:402
msgctxt "noun"
msgid "Dislikes"
msgstr "No me gusta"
-#: ../../Zotlabs/Module/Photos.php:1264 ../../Zotlabs/Lib/ThreadItem.php:406
+#: ../../Zotlabs/Module/Photos.php:1233 ../../Zotlabs/Lib/ThreadItem.php:407
#: ../../include/acl_selectors.php:220
msgid "Close"
msgstr "Cerrar"
-#: ../../Zotlabs/Module/Photos.php:1341
-msgid "View Album"
-msgstr "Ver álbum"
-
-#: ../../Zotlabs/Module/Photos.php:1352 ../../Zotlabs/Module/Photos.php:1365
-#: ../../Zotlabs/Module/Photos.php:1366
+#: ../../Zotlabs/Module/Photos.php:1305 ../../Zotlabs/Module/Photos.php:1318
+#: ../../Zotlabs/Module/Photos.php:1319 ../../include/photos.php:529
msgid "Recent Photos"
msgstr "Fotos recientes"
-#: ../../Zotlabs/Module/Group.php:24
-msgid "Privacy group created."
-msgstr "El grupo de canales ha sido creado."
-
-#: ../../Zotlabs/Module/Group.php:30
-msgid "Could not create privacy group."
-msgstr "No se puede crear el grupo de canales"
-
-#: ../../Zotlabs/Module/Group.php:42 ../../Zotlabs/Module/Group.php:141
-#: ../../include/items.php:3901
-msgid "Privacy group not found."
-msgstr "Grupo de canales no encontrado."
-
-#: ../../Zotlabs/Module/Group.php:58
-msgid "Privacy group updated."
-msgstr "Grupo de canales actualizado."
-
-#: ../../Zotlabs/Module/Group.php:90
-msgid "Create a group of channels."
-msgstr "Crear un grupo de canales."
-
-#: ../../Zotlabs/Module/Group.php:91 ../../Zotlabs/Module/Group.php:184
-msgid "Privacy group name: "
-msgstr "Nombre del grupo de canales:"
-
-#: ../../Zotlabs/Module/Group.php:93 ../../Zotlabs/Module/Group.php:187
-msgid "Members are visible to other channels"
-msgstr "Los miembros son visibles para otros canales"
-
-#: ../../Zotlabs/Module/Group.php:111
-msgid "Privacy group removed."
-msgstr "Grupo de canales eliminado."
-
-#: ../../Zotlabs/Module/Group.php:113
-msgid "Unable to remove privacy group."
-msgstr "No se puede eliminar el grupo de canales."
-
-#: ../../Zotlabs/Module/Group.php:183
-msgid "Privacy group editor"
-msgstr "Editor de grupos de canales"
-
-#: ../../Zotlabs/Module/Group.php:199
-msgid "All Connected Channels"
-msgstr "Todos los canales conectados"
-
-#: ../../Zotlabs/Module/Group.php:231
-msgid "Click on a channel to add or remove."
-msgstr "Haga clic en un canal para agregarlo o quitarlo."
-
-#: ../../Zotlabs/Module/Dreport.php:45
-msgid "Invalid message"
-msgstr "Mensaje no válido"
-
-#: ../../Zotlabs/Module/Dreport.php:78
-msgid "no results"
-msgstr "sin resultados"
-
-#: ../../Zotlabs/Module/Dreport.php:93
-msgid "channel sync processed"
-msgstr "se ha realizado la sincronización del canal"
-
-#: ../../Zotlabs/Module/Dreport.php:97
-msgid "queued"
-msgstr "encolado"
-
-#: ../../Zotlabs/Module/Dreport.php:101
-msgid "posted"
-msgstr "enviado"
-
-#: ../../Zotlabs/Module/Dreport.php:105
-msgid "accepted for delivery"
-msgstr "aceptado para el envío"
-
-#: ../../Zotlabs/Module/Dreport.php:109
-msgid "updated"
-msgstr "actualizado"
-
-#: ../../Zotlabs/Module/Dreport.php:112
-msgid "update ignored"
-msgstr "actualización ignorada"
-
-#: ../../Zotlabs/Module/Dreport.php:115
-msgid "permission denied"
-msgstr "permiso denegado"
-
-#: ../../Zotlabs/Module/Dreport.php:119
-msgid "recipient not found"
-msgstr "destinatario no encontrado"
-
-#: ../../Zotlabs/Module/Dreport.php:122
-msgid "mail recalled"
-msgstr "mensaje de correo revocado"
-
-#: ../../Zotlabs/Module/Dreport.php:125
-msgid "duplicate mail received"
-msgstr "se ha recibido mensaje duplicado"
-
-#: ../../Zotlabs/Module/Dreport.php:128
-msgid "mail delivered"
-msgstr "correo enviado"
-
-#: ../../Zotlabs/Module/Dreport.php:148
-#, php-format
-msgid "Delivery report for %1$s"
-msgstr "Informe de entrega para %1$s"
-
-#: ../../Zotlabs/Module/Dreport.php:151
-msgid "Options"
-msgstr "Opciones"
-
-#: ../../Zotlabs/Module/Dreport.php:152
-msgid "Redeliver"
-msgstr "Volver a enviar"
-
-#: ../../Zotlabs/Module/Mail.php:65
-msgid "Unable to lookup recipient."
-msgstr "No se puede asociar a un destinatario."
-
-#: ../../Zotlabs/Module/Mail.php:72
-msgid "Unable to communicate with requested channel."
-msgstr "No se puede establecer la comunicación con el canal solicitado."
-
-#: ../../Zotlabs/Module/Mail.php:79
-msgid "Cannot verify requested channel."
-msgstr "No se puede verificar el canal solicitado."
-
-#: ../../Zotlabs/Module/Mail.php:97
-msgid "Selected channel has private message restrictions. Send failed."
-msgstr "El canal seleccionado tiene restricciones sobre los mensajes privados. El envío falló."
-
-#: ../../Zotlabs/Module/Mail.php:178
-msgid "Messages"
-msgstr "Mensajes"
-
-#: ../../Zotlabs/Module/Mail.php:213
-msgid "Message recalled."
-msgstr "Mensaje revocado."
-
-#: ../../Zotlabs/Module/Mail.php:226
-msgid "Conversation removed."
-msgstr "Conversación eliminada."
-
-#: ../../Zotlabs/Module/Mail.php:240 ../../Zotlabs/Module/Mail.php:349
-#: ../../Zotlabs/Module/Chat.php:203 ../../include/conversation.php:1330
-msgid "Please enter a link URL:"
-msgstr "Por favor, introduzca la dirección del enlace:"
-
-#: ../../Zotlabs/Module/Mail.php:241 ../../Zotlabs/Module/Mail.php:350
-msgid "Expires YYYY-MM-DD HH:MM"
-msgstr "Caduca YYYY-MM-DD HH:MM"
-
-#: ../../Zotlabs/Module/Mail.php:269
-msgid "Requested channel is not in this network"
-msgstr "El canal solicitado no existe en esta red"
-
-#: ../../Zotlabs/Module/Mail.php:277
-msgid "Send Private Message"
-msgstr "Enviar un mensaje privado"
-
-#: ../../Zotlabs/Module/Mail.php:278 ../../Zotlabs/Module/Mail.php:403
-msgid "To:"
-msgstr "Para:"
-
-#: ../../Zotlabs/Module/Mail.php:281 ../../Zotlabs/Module/Mail.php:405
-msgid "Subject:"
-msgstr "Asunto:"
-
-#: ../../Zotlabs/Module/Mail.php:284 ../../Zotlabs/Module/Invite.php:138
-msgid "Your message:"
-msgstr "Su mensaje:"
-
-#: ../../Zotlabs/Module/Mail.php:286 ../../Zotlabs/Module/Mail.php:411
-#: ../../include/conversation.php:1390
-msgid "Attach file"
-msgstr "Adjuntar fichero"
-
-#: ../../Zotlabs/Module/Mail.php:288
-msgid "Send"
-msgstr "Enviar"
-
-#: ../../Zotlabs/Module/Mail.php:291 ../../Zotlabs/Module/Mail.php:416
-#: ../../include/conversation.php:1435
-msgid "Set expiration date"
-msgstr "Configurar fecha de caducidad"
-
-#: ../../Zotlabs/Module/Mail.php:293 ../../Zotlabs/Module/Mail.php:418
-#: ../../Zotlabs/Module/Chat.php:204 ../../Zotlabs/Lib/ThreadItem.php:743
-#: ../../include/conversation.php:1440
-msgid "Encrypt text"
-msgstr "Cifrar texto"
-
-#: ../../Zotlabs/Module/Mail.php:375
-msgid "Delete message"
-msgstr "Borrar mensaje"
-
-#: ../../Zotlabs/Module/Mail.php:376
-msgid "Delivery report"
-msgstr "Informe de transmisión"
-
-#: ../../Zotlabs/Module/Mail.php:377
-msgid "Recall message"
-msgstr "Revocar el mensaje"
-
-#: ../../Zotlabs/Module/Mail.php:379
-msgid "Message has been recalled."
-msgstr "El mensaje ha sido revocado."
-
-#: ../../Zotlabs/Module/Mail.php:396
-msgid "Delete Conversation"
-msgstr "Eliminar conversación"
-
-#: ../../Zotlabs/Module/Mail.php:398
-msgid ""
-"No secure communications available. You <strong>may</strong> be able to "
-"respond from the sender's profile page."
-msgstr "Comunicación segura no disponible. Pero <strong>puede</strong> responder desde la página del perfil del remitente."
-
-#: ../../Zotlabs/Module/Mail.php:402
-msgid "Send Reply"
-msgstr "Responder"
-
-#: ../../Zotlabs/Module/Mail.php:407
-#, php-format
-msgid "Your message for %s (%s):"
-msgstr "Su mensaje para %s (%s):"
-
-#: ../../Zotlabs/Module/Impel.php:41 ../../include/bbcode.php:203
-msgid "webpage"
-msgstr "página web"
-
-#: ../../Zotlabs/Module/Impel.php:46 ../../include/bbcode.php:209
-msgid "block"
-msgstr "bloque"
-
-#: ../../Zotlabs/Module/Impel.php:51 ../../include/bbcode.php:206
-msgid "layout"
-msgstr "plantilla"
-
-#: ../../Zotlabs/Module/Impel.php:58 ../../include/bbcode.php:212
-msgid "menu"
-msgstr "menú"
-
-#: ../../Zotlabs/Module/Impel.php:191
-#, php-format
-msgid "%s element installed"
-msgstr "%s elemento instalado"
-
-#: ../../Zotlabs/Module/Impel.php:194
-#, php-format
-msgid "%s element installation failed"
-msgstr "Elemento con instalación fallida: %s"
-
-#: ../../Zotlabs/Module/Import_items.php:104
-msgid "Import completed"
-msgstr "Importación completada"
+#: ../../Zotlabs/Module/Wiki.php:30
+msgid "Profile Unavailable."
+msgstr "Perfil no disponible"
-#: ../../Zotlabs/Module/Import_items.php:119
-msgid "Import Items"
-msgstr "Importar elementos"
+#: ../../Zotlabs/Module/Wiki.php:44 ../../addon/gitwiki/Mod_Gitwiki.php:42
+msgid "Not found"
+msgstr "No encontrado"
-#: ../../Zotlabs/Module/Import_items.php:120
-msgid ""
-"Use this form to import existing posts and content from an export file."
-msgstr "Utilice este formulario para importar entradas existentes y contenido desde un archivo de exportación."
+#: ../../Zotlabs/Module/Wiki.php:68 ../../addon/gitwiki/Mod_Gitwiki.php:62
+msgid "Invalid channel"
+msgstr "Canal no válido"
-#: ../../Zotlabs/Module/Manage.php:136
-#: ../../Zotlabs/Module/New_channel.php:121
-#, php-format
-msgid "You have created %1$.0f of %2$.0f allowed channels."
-msgstr "Ha creado %1$.0f de %2$.0f canales permitidos."
+#: ../../Zotlabs/Module/Wiki.php:160 ../../addon/gitwiki/Mod_Gitwiki.php:146
+#: ../../include/conversation.php:1854 ../../include/nav.php:462
+msgid "Wikis"
+msgstr "Wikis"
-#: ../../Zotlabs/Module/Manage.php:143
-msgid "Create a new channel"
-msgstr "Crear un nuevo canal"
+#: ../../Zotlabs/Module/Wiki.php:166 ../../addon/gitwiki/Mod_Gitwiki.php:152
+msgid "Download"
+msgstr "Descargar"
-#: ../../Zotlabs/Module/Manage.php:143 ../../Zotlabs/Module/Profiles.php:834
-#: ../../Zotlabs/Module/Wiki.php:167 ../../Zotlabs/Module/Chat.php:253
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:152
+#: ../../Zotlabs/Module/Wiki.php:168 ../../Zotlabs/Module/Chat.php:254
+#: ../../Zotlabs/Module/Profiles.php:834 ../../Zotlabs/Module/Manage.php:143
+#: ../../addon/gitwiki/Mod_Gitwiki.php:154
msgid "Create New"
msgstr "Crear"
-#: ../../Zotlabs/Module/Manage.php:164 ../../Zotlabs/Lib/Apps.php:221
-#: ../../include/nav.php:223
-msgid "Channel Manager"
-msgstr "Administración de canales"
-
-#: ../../Zotlabs/Module/Manage.php:165
-msgid "Current Channel"
-msgstr "Canal actual"
-
-#: ../../Zotlabs/Module/Manage.php:167
-msgid "Switch to one of your channels by selecting it."
-msgstr "Cambiar a uno de sus canales seleccionándolo."
-
-#: ../../Zotlabs/Module/Manage.php:168
-msgid "Default Channel"
-msgstr "Canal principal"
-
-#: ../../Zotlabs/Module/Manage.php:169
-msgid "Make Default"
-msgstr "Convertir en predeterminado"
-
-#: ../../Zotlabs/Module/Manage.php:172
-#, php-format
-msgid "%d new messages"
-msgstr "%d mensajes nuevos"
-
-#: ../../Zotlabs/Module/Manage.php:173
-#, php-format
-msgid "%d new introductions"
-msgstr "%d nuevas solicitudes de conexión"
-
-#: ../../Zotlabs/Module/Manage.php:175
-msgid "Delegated Channel"
-msgstr "Canal delegado"
-
-#: ../../Zotlabs/Module/Magic.php:71
-msgid "Hub not found."
-msgstr "Servidor no encontrado"
-
-#: ../../Zotlabs/Module/Mitem.php:52
-msgid "Unable to create element."
-msgstr "No se puede crear el elemento."
-
-#: ../../Zotlabs/Module/Mitem.php:76
-msgid "Unable to update menu element."
-msgstr "No es posible actualizar el elemento del menú."
-
-#: ../../Zotlabs/Module/Mitem.php:92
-msgid "Unable to add menu element."
-msgstr "No es posible añadir el elemento al menú"
-
-#: ../../Zotlabs/Module/Mitem.php:153 ../../Zotlabs/Module/Mitem.php:230
-msgid "Menu Item Permissions"
-msgstr "Permisos del elemento del menú"
-
-#: ../../Zotlabs/Module/Mitem.php:154 ../../Zotlabs/Module/Mitem.php:231
-#: ../../Zotlabs/Module/Settings/Channel.php:510
-msgid "(click to open/close)"
-msgstr "(pulsar para abrir o cerrar)"
-
-#: ../../Zotlabs/Module/Mitem.php:160 ../../Zotlabs/Module/Mitem.php:176
-msgid "Link Name"
-msgstr "Nombre del enlace"
-
-#: ../../Zotlabs/Module/Mitem.php:161 ../../Zotlabs/Module/Mitem.php:239
-msgid "Link or Submenu Target"
-msgstr "Destino del enlace o submenú"
-
-#: ../../Zotlabs/Module/Mitem.php:161
-msgid "Enter URL of the link or select a menu name to create a submenu"
-msgstr "Introducir la dirección del enlace o seleccionar el nombre de un submenú"
-
-#: ../../Zotlabs/Module/Mitem.php:162 ../../Zotlabs/Module/Mitem.php:240
-msgid "Use magic-auth if available"
-msgstr "Usar la autenticación mágica si está disponible"
-
-#: ../../Zotlabs/Module/Mitem.php:163 ../../Zotlabs/Module/Mitem.php:241
-msgid "Open link in new window"
-msgstr "Abrir el enlace en una nueva ventana"
-
-#: ../../Zotlabs/Module/Mitem.php:164 ../../Zotlabs/Module/Mitem.php:242
-msgid "Order in list"
-msgstr "Orden en la lista"
-
-#: ../../Zotlabs/Module/Mitem.php:164 ../../Zotlabs/Module/Mitem.php:242
-msgid "Higher numbers will sink to bottom of listing"
-msgstr "Los números más altos irán al final de la lista"
-
-#: ../../Zotlabs/Module/Mitem.php:165
-msgid "Submit and finish"
-msgstr "Enviar y terminar"
-
-#: ../../Zotlabs/Module/Mitem.php:166
-msgid "Submit and continue"
-msgstr "Enviar y continuar"
-
-#: ../../Zotlabs/Module/Mitem.php:174
-msgid "Menu:"
-msgstr "Menú:"
-
-#: ../../Zotlabs/Module/Mitem.php:177
-msgid "Link Target"
-msgstr "Destino del enlace"
-
-#: ../../Zotlabs/Module/Mitem.php:180
-msgid "Edit menu"
-msgstr "Editar menú"
-
-#: ../../Zotlabs/Module/Mitem.php:183
-msgid "Edit element"
-msgstr "Editar el elemento"
-
-#: ../../Zotlabs/Module/Mitem.php:184
-msgid "Drop element"
-msgstr "Eliminar el elemento"
-
-#: ../../Zotlabs/Module/Mitem.php:185
-msgid "New element"
-msgstr "Nuevo elemento"
-
-#: ../../Zotlabs/Module/Mitem.php:186
-msgid "Edit this menu container"
-msgstr "Modificar el contenedor del menú"
-
-#: ../../Zotlabs/Module/Mitem.php:187
-msgid "Add menu element"
-msgstr "Añadir un elemento al menú"
-
-#: ../../Zotlabs/Module/Mitem.php:188
-msgid "Delete this menu item"
-msgstr "Eliminar este elemento del menú"
-
-#: ../../Zotlabs/Module/Mitem.php:189
-msgid "Edit this menu item"
-msgstr "Modificar este elemento del menú"
-
-#: ../../Zotlabs/Module/Mitem.php:206
-msgid "Menu item not found."
-msgstr "Este elemento del menú no se ha encontrado"
-
-#: ../../Zotlabs/Module/Mitem.php:219
-msgid "Menu item deleted."
-msgstr "Este elemento del menú ha sido borrado"
-
-#: ../../Zotlabs/Module/Mitem.php:221
-msgid "Menu item could not be deleted."
-msgstr "Este elemento del menú no puede ser borrado."
-
-#: ../../Zotlabs/Module/Mitem.php:228
-msgid "Edit Menu Element"
-msgstr "Editar elemento del menú"
-
-#: ../../Zotlabs/Module/Mitem.php:238
-msgid "Link text"
-msgstr "Texto del enlace"
-
-#: ../../Zotlabs/Module/Editpost.php:35
-msgid "Item is not editable"
-msgstr "El elemento no es editable"
-
-#: ../../Zotlabs/Module/Ratings.php:70
-msgid "No ratings"
-msgstr "Ninguna valoración"
-
-#: ../../Zotlabs/Module/Ratings.php:98
-msgid "Rating: "
-msgstr "Valoración:"
-
-#: ../../Zotlabs/Module/Ratings.php:99
-msgid "Website: "
-msgstr "Sitio web:"
-
-#: ../../Zotlabs/Module/Ratings.php:101
-msgid "Description: "
-msgstr "Descripción:"
-
-#: ../../Zotlabs/Module/Attach.php:13
-msgid "Item not available."
-msgstr "Elemento no disponible"
-
-#: ../../Zotlabs/Module/Cal.php:69
-msgid "Permissions denied."
-msgstr "Permisos denegados."
-
-#: ../../Zotlabs/Module/Cal.php:341 ../../include/text.php:2312
-msgid "Import"
-msgstr "Importar"
-
-#: ../../Zotlabs/Module/Notify.php:57
-#: ../../Zotlabs/Module/Notifications.php:38
-msgid "No more system notifications."
-msgstr "No hay más notificaciones del sistema"
-
-#: ../../Zotlabs/Module/Notify.php:61
-#: ../../Zotlabs/Module/Notifications.php:42
-msgid "System Notifications"
-msgstr "Notificaciones del sistema"
-
-#: ../../Zotlabs/Module/Api.php:72 ../../Zotlabs/Module/Api.php:93
-msgid "Authorize application connection"
-msgstr "Autorizar una conexión de aplicación"
-
-#: ../../Zotlabs/Module/Api.php:73
-msgid "Return to your app and insert this Security Code:"
-msgstr "Vuelva a su aplicación e introduzca este código de seguridad: "
-
-#: ../../Zotlabs/Module/Api.php:83
-msgid "Please login to continue."
-msgstr "Por favor inicie sesión para continuar."
-
-#: ../../Zotlabs/Module/Api.php:95
-msgid ""
-"Do you want to authorize this application to access your posts and contacts,"
-" and/or create new posts for you?"
-msgstr "¿Desea autorizar a esta aplicación a acceder a sus publicaciones y contactos, y/o crear nuevas publicaciones por usted?"
-
-#: ../../Zotlabs/Module/Invite.php:29
-msgid "Total invitation limit exceeded."
-msgstr "Se ha superado el límite máximo de invitaciones."
-
-#: ../../Zotlabs/Module/Invite.php:53
-#, php-format
-msgid "%s : Not a valid email address."
-msgstr "%s : No es una dirección de correo electrónico válida. "
+#: ../../Zotlabs/Module/Wiki.php:170 ../../addon/gitwiki/Mod_Gitwiki.php:156
+msgid "Wiki name"
+msgstr "Nombre del wiki"
-#: ../../Zotlabs/Module/Invite.php:67
-msgid "Please join us on $Projectname"
-msgstr "Únase a nosotros en $Projectname"
+#: ../../Zotlabs/Module/Wiki.php:171 ../../addon/gitwiki/Mod_Gitwiki.php:157
+msgid "Content type"
+msgstr "Tipo de contenido"
-#: ../../Zotlabs/Module/Invite.php:77
-msgid "Invitation limit exceeded. Please contact your site administrator."
-msgstr "Excedido el límite de invitaciones. Por favor, contacte con el Administrador de su sitio."
+#: ../../Zotlabs/Module/Wiki.php:173 ../../Zotlabs/Storage/Browser.php:234
+#: ../../addon/gitwiki/Mod_Gitwiki.php:159
+msgid "Type"
+msgstr "Tipo"
-#: ../../Zotlabs/Module/Invite.php:82
-#, php-format
-msgid "%s : Message delivery failed."
-msgstr "%s : Falló el envío del mensaje."
+#: ../../Zotlabs/Module/Wiki.php:180 ../../addon/gitwiki/Mod_Gitwiki.php:166
+msgid "Create a status post for this wiki"
+msgstr "Crear un mensaje de estado para este wiki"
-#: ../../Zotlabs/Module/Invite.php:86
-#, php-format
-msgid "%d message sent."
-msgid_plural "%d messages sent."
-msgstr[0] "%d mensajes enviados."
-msgstr[1] "%d mensajes enviados."
+#: ../../Zotlabs/Module/Wiki.php:205 ../../addon/gitwiki/Mod_Gitwiki.php:185
+msgid "Wiki not found"
+msgstr "Wiki no encontrado"
-#: ../../Zotlabs/Module/Invite.php:105
-msgid "You have no more invitations available"
-msgstr "No tiene más invitaciones disponibles"
+#: ../../Zotlabs/Module/Wiki.php:229 ../../addon/gitwiki/Mod_Gitwiki.php:210
+msgid "Rename page"
+msgstr "Renombrar la página"
-#: ../../Zotlabs/Module/Invite.php:136
-msgid "Send invitations"
-msgstr "Enviar invitaciones"
+#: ../../Zotlabs/Module/Wiki.php:233 ../../addon/gitwiki/Mod_Gitwiki.php:214
+msgid "Error retrieving page content"
+msgstr "Error al recuperar el contenido de la página"
-#: ../../Zotlabs/Module/Invite.php:137
-msgid "Enter email addresses, one per line:"
-msgstr "Introduzca las direcciones de correo electrónico, una por línea:"
+#: ../../Zotlabs/Module/Wiki.php:239
+msgid "New page"
+msgstr "Nueva página"
-#: ../../Zotlabs/Module/Invite.php:139
-msgid "Please join my community on $Projectname."
-msgstr "Por favor, únase a mi comunidad en $Projectname."
+#: ../../Zotlabs/Module/Wiki.php:263 ../../addon/gitwiki/Mod_Gitwiki.php:242
+msgid "Revision Comparison"
+msgstr "Comparación de revisiones"
-#: ../../Zotlabs/Module/Invite.php:141
-msgid "You will need to supply this invitation code:"
-msgstr "Tendrá que suministrar este código de invitación:"
+#: ../../Zotlabs/Module/Wiki.php:264 ../../addon/gitwiki/Mod_Gitwiki.php:243
+msgid "Revert"
+msgstr "Revertir"
-#: ../../Zotlabs/Module/Invite.php:142
-msgid ""
-"1. Register at any $Projectname location (they are all inter-connected)"
-msgstr "1. Regístrese en cualquier sitio de $Projectname (están todos interconectados)"
+#: ../../Zotlabs/Module/Wiki.php:268
+msgid "Short description of your changes (optional)"
+msgstr "Breve descripción de sus cambios (opcional)"
-#: ../../Zotlabs/Module/Invite.php:144
-msgid "2. Enter my $Projectname network address into the site searchbar."
-msgstr "2. Introduzca mi dirección $Projectname en la caja de búsqueda del sitio."
+#: ../../Zotlabs/Module/Wiki.php:275 ../../addon/gitwiki/Mod_Gitwiki.php:252
+msgid "Source"
+msgstr "Fuente"
-#: ../../Zotlabs/Module/Invite.php:145
-msgid "or visit"
-msgstr "o visitar"
+#: ../../Zotlabs/Module/Wiki.php:283 ../../addon/gitwiki/Mod_Gitwiki.php:260
+msgid "New page name"
+msgstr "Nombre de la nueva página"
-#: ../../Zotlabs/Module/Invite.php:147
-msgid "3. Click [Connect]"
-msgstr "3. Pulse [conectar]"
+#: ../../Zotlabs/Module/Wiki.php:288 ../../addon/gitwiki/Mod_Gitwiki.php:265
+#: ../../include/conversation.php:1232
+msgid "Embed image from photo albums"
+msgstr "Incluir una imagen de los álbumes de fotos"
-#: ../../Zotlabs/Module/Siteinfo.php:20
-msgid "About this site"
-msgstr "Acerca de este sitio"
+#: ../../Zotlabs/Module/Wiki.php:289 ../../addon/gitwiki/Mod_Gitwiki.php:266
+#: ../../include/conversation.php:1326
+msgid "Embed an image from your albums"
+msgstr "Incluir una imagen de sus álbumes"
-#: ../../Zotlabs/Module/Siteinfo.php:21
-msgid "Site Name"
-msgstr "Nombre del sitio"
+#: ../../Zotlabs/Module/Wiki.php:291 ../../addon/gitwiki/Mod_Gitwiki.php:268
+#: ../../include/conversation.php:1328 ../../include/conversation.php:1375
+msgid "OK"
+msgstr "OK"
-#: ../../Zotlabs/Module/Siteinfo.php:25 ../../include/network.php:1995
-msgid "Administrator"
-msgstr "Administrador"
+#: ../../Zotlabs/Module/Wiki.php:292 ../../addon/gitwiki/Mod_Gitwiki.php:269
+#: ../../include/conversation.php:1268
+msgid "Choose images to embed"
+msgstr "Elegir imágenes para incluir"
-#: ../../Zotlabs/Module/Siteinfo.php:28
-msgid "Software and Project information"
-msgstr "Información sobre el software y el proyecto"
+#: ../../Zotlabs/Module/Wiki.php:293 ../../addon/gitwiki/Mod_Gitwiki.php:270
+#: ../../include/conversation.php:1269
+msgid "Choose an album"
+msgstr "Elegir un álbum"
-#: ../../Zotlabs/Module/Siteinfo.php:29
-msgid "This site is powered by $Projectname"
-msgstr "Este sitio funciona con $Projectname"
+#: ../../Zotlabs/Module/Wiki.php:294 ../../addon/gitwiki/Mod_Gitwiki.php:271
+msgid "Choose a different album"
+msgstr "Elegir un álbum diferente..."
-#: ../../Zotlabs/Module/Siteinfo.php:30
-msgid ""
-"Federated and decentralised networking and identity services provided by Zot"
-msgstr "Servicios federados y descentralizados de identidad y redes proporcionados por Zot"
+#: ../../Zotlabs/Module/Wiki.php:295 ../../addon/gitwiki/Mod_Gitwiki.php:272
+#: ../../include/conversation.php:1271
+msgid "Error getting album list"
+msgstr "Error al obtener la lista de álbumes"
-#: ../../Zotlabs/Module/Siteinfo.php:32
-#, php-format
-msgid "Version %s"
-msgstr "Versión %s"
+#: ../../Zotlabs/Module/Wiki.php:296 ../../addon/gitwiki/Mod_Gitwiki.php:273
+#: ../../include/conversation.php:1272
+msgid "Error getting photo link"
+msgstr "Error al obtener el enlace de la foto"
-#: ../../Zotlabs/Module/Siteinfo.php:33
-msgid "Project homepage"
-msgstr "Página principal del proyecto"
+#: ../../Zotlabs/Module/Wiki.php:297 ../../addon/gitwiki/Mod_Gitwiki.php:274
+#: ../../include/conversation.php:1273
+msgid "Error getting album"
+msgstr "Error al obtener el álbum"
-#: ../../Zotlabs/Module/Siteinfo.php:34
-msgid "Developer homepage"
-msgstr "Página principal del desarrollador"
+#: ../../Zotlabs/Module/Wiki.php:364 ../../addon/gitwiki/Mod_Gitwiki.php:337
+msgid "Error creating wiki. Invalid name."
+msgstr "Error al crear el wiki: el nombre no es válido."
-#: ../../Zotlabs/Module/New_channel.php:140
-msgid "Create Channel"
-msgstr "Crear un canal"
+#: ../../Zotlabs/Module/Wiki.php:371
+msgid "A wiki with this name already exists."
+msgstr "Ya hay un wiki con este nombre."
-#: ../../Zotlabs/Module/New_channel.php:141
-msgid ""
-"A channel is your identity on this network. It can represent a person, a "
-"blog, or a forum to name a few. Channels can make connections with other "
-"channels to share information with highly detailed permissions."
-msgstr "Un canal es su identidad en esta red. Puede representar a una persona, un blog o un foro, por nombrar unos pocos ejemplos. Los canales se pueden conectar con otros canales para compartir información con una gama de permisos extremadamente detallada."
+#: ../../Zotlabs/Module/Wiki.php:384 ../../addon/gitwiki/Mod_Gitwiki.php:348
+msgid "Wiki created, but error creating Home page."
+msgstr "Se ha creado el wiki, pero se ha producido un error al crear la página de inicio."
-#: ../../Zotlabs/Module/New_channel.php:142
-msgid ""
-"or <a href=\"import\">import an existing channel</a> from another location."
-msgstr "O <a href=\"import\">importar un canal existente</a> desde otro lugar."
+#: ../../Zotlabs/Module/Wiki.php:391 ../../addon/gitwiki/Mod_Gitwiki.php:353
+msgid "Error creating wiki"
+msgstr "Error al crear el wiki"
-#: ../../Zotlabs/Module/Webpages.php:52
-msgid "Import Webpage Elements"
-msgstr "Importar elementos de una página web"
+#: ../../Zotlabs/Module/Wiki.php:403
+msgid "Wiki delete permission denied."
+msgstr "Se ha denegado el permiso para eliminar el wiki."
-#: ../../Zotlabs/Module/Webpages.php:53
-msgid "Import selected"
-msgstr "Importar elementos seleccionados"
+#: ../../Zotlabs/Module/Wiki.php:413
+msgid "Error deleting wiki"
+msgstr "Se ha producido un error al eliminar el wiki"
-#: ../../Zotlabs/Module/Webpages.php:76
-msgid "Export Webpage Elements"
-msgstr "Exportar elementos de una página web"
+#: ../../Zotlabs/Module/Wiki.php:439 ../../addon/gitwiki/Mod_Gitwiki.php:400
+msgid "New page created"
+msgstr "Se ha creado la nueva página"
-#: ../../Zotlabs/Module/Webpages.php:77
-msgid "Export selected"
-msgstr "Exportar los elementos seleccionados"
+#: ../../Zotlabs/Module/Wiki.php:558
+msgid "Cannot delete Home"
+msgstr "No se puede eliminar la página principal"
-#: ../../Zotlabs/Module/Webpages.php:241 ../../Zotlabs/Lib/Apps.php:225
-#: ../../include/conversation.php:1889
-msgid "Webpages"
-msgstr "Páginas web"
+#: ../../Zotlabs/Module/Wiki.php:622
+msgid "Current Revision"
+msgstr "Revisión actual"
-#: ../../Zotlabs/Module/Webpages.php:252 ../../include/page_widgets.php:44
-msgid "Actions"
-msgstr "Acciones"
+#: ../../Zotlabs/Module/Wiki.php:622
+msgid "Selected Revision"
+msgstr "Revisión seleccionada"
-#: ../../Zotlabs/Module/Webpages.php:253 ../../include/page_widgets.php:45
-msgid "Page Link"
-msgstr "Vínculo de la página"
+#: ../../Zotlabs/Module/Wiki.php:672
+msgid "You must be authenticated."
+msgstr "Debe estar autenticado."
-#: ../../Zotlabs/Module/Webpages.php:254
-msgid "Page Title"
-msgstr "Título de página"
+#: ../../Zotlabs/Module/Chanview.php:134
+msgid "toggle full screen mode"
+msgstr "cambiar al modo de pantalla completa"
-#: ../../Zotlabs/Module/Webpages.php:284
-msgid "Invalid file type."
-msgstr "Tipo de fichero no válido."
+#: ../../Zotlabs/Module/Pdledit.php:21
+msgid "Layout updated."
+msgstr "Plantilla actualizada."
-#: ../../Zotlabs/Module/Webpages.php:296
-msgid "Error opening zip file"
-msgstr "Error al abrir el fichero comprimido zip"
+#: ../../Zotlabs/Module/Pdledit.php:34 ../../Zotlabs/Module/Chat.php:217
+msgid "Feature disabled."
+msgstr "Funcionalidad deshabilitada."
-#: ../../Zotlabs/Module/Webpages.php:307
-msgid "Invalid folder path."
-msgstr "La ruta de la carpeta no es válida."
+#: ../../Zotlabs/Module/Pdledit.php:42 ../../Zotlabs/Module/Pdledit.php:69
+msgid "Edit System Page Description"
+msgstr "Editor del Sistema de Descripción de Páginas"
-#: ../../Zotlabs/Module/Webpages.php:334
-msgid "No webpage elements detected."
-msgstr "No se han detectado elementos de ninguna página web."
+#: ../../Zotlabs/Module/Pdledit.php:64
+msgid "Layout not found."
+msgstr "Plantilla no encontrada"
-#: ../../Zotlabs/Module/Webpages.php:409
-msgid "Import complete."
-msgstr "Importación completada."
+#: ../../Zotlabs/Module/Pdledit.php:70
+msgid "Module Name:"
+msgstr "Nombre del módulo:"
-#: ../../Zotlabs/Module/Notifications.php:43 ../../include/nav.php:208
-msgid "Mark all system notifications seen"
-msgstr "Marcar todas las notificaciones del sistema como leídas"
+#: ../../Zotlabs/Module/Pdledit.php:71
+msgid "Layout Help"
+msgstr "Ayuda para el diseño de plantillas de página"
#: ../../Zotlabs/Module/Poke.php:168 ../../Zotlabs/Lib/Apps.php:235
-#: ../../include/conversation.php:942 ../../include/conversation.php:1109
+#: ../../include/conversation.php:1042
msgid "Poke"
msgstr "Toques y otras cosas"
@@ -4713,687 +4755,769 @@ msgstr "Elegir qué desea enviar al destinatario"
msgid "Make this post private"
msgstr "Convertir en privado este envío"
-#: ../../Zotlabs/Module/Profperm.php:34 ../../Zotlabs/Module/Profperm.php:63
-msgid "Invalid profile identifier."
-msgstr "Identificador del perfil no válido"
+#: ../../Zotlabs/Module/Profile_photo.php:61
+#: ../../Zotlabs/Module/Cover_photo.php:56
+msgid "Image uploaded but image cropping failed."
+msgstr "Imagen actualizada, pero el recorte de la imagen ha fallado. "
-#: ../../Zotlabs/Module/Profperm.php:111
-msgid "Profile Visibility Editor"
-msgstr "Editor de visibilidad del perfil"
+#: ../../Zotlabs/Module/Profile_photo.php:115
+#: ../../Zotlabs/Module/Profile_photo.php:226
+#: ../../include/photo/photo_driver.php:647
+msgid "Profile Photos"
+msgstr "Fotos del perfil"
-#: ../../Zotlabs/Module/Profperm.php:113 ../../include/channel.php:1367
-msgid "Profile"
-msgstr "Perfil"
+#: ../../Zotlabs/Module/Profile_photo.php:137
+#: ../../Zotlabs/Module/Cover_photo.php:159
+msgid "Image resize failed."
+msgstr "El ajuste del tamaño de la imagen ha fallado."
-#: ../../Zotlabs/Module/Profperm.php:115
-msgid "Click on a contact to add or remove."
-msgstr "Pulsar en un contacto para añadirlo o eliminarlo."
+#: ../../Zotlabs/Module/Profile_photo.php:196
+#: ../../addon/openclipatar/openclipatar.php:298
+msgid ""
+"Shift-reload the page or clear browser cache if the new photo does not "
+"display immediately."
+msgstr "Recargue la página o limpie el caché del navegador si la nueva foto no se muestra inmediatamente."
-#: ../../Zotlabs/Module/Profperm.php:124
-msgid "Visible To"
-msgstr "Visible para"
+#: ../../Zotlabs/Module/Profile_photo.php:203
+#: ../../Zotlabs/Module/Cover_photo.php:173 ../../include/photos.php:149
+msgid "Unable to process image"
+msgstr "No ha sido posible procesar la imagen"
-#: ../../Zotlabs/Module/Hcard.php:35 ../../Zotlabs/Module/Channel.php:47
-#: ../../Zotlabs/Module/Profile.php:43
-msgid "Posts and comments"
-msgstr "Publicaciones y comentarios"
+#: ../../Zotlabs/Module/Profile_photo.php:238
+#: ../../Zotlabs/Module/Cover_photo.php:197
+msgid "Image upload failed."
+msgstr "La carga de la imagen ha fallado."
-#: ../../Zotlabs/Module/Hcard.php:42 ../../Zotlabs/Module/Channel.php:54
-#: ../../Zotlabs/Module/Profile.php:50
-msgid "Only posts"
-msgstr "Solo publicaciones"
+#: ../../Zotlabs/Module/Profile_photo.php:257
+#: ../../Zotlabs/Module/Cover_photo.php:214
+msgid "Unable to process image."
+msgstr "No ha sido posible procesar la imagen."
+
+#: ../../Zotlabs/Module/Profile_photo.php:318
+#: ../../Zotlabs/Module/Profile_photo.php:365
+#: ../../Zotlabs/Module/Cover_photo.php:307
+#: ../../Zotlabs/Module/Cover_photo.php:322
+msgid "Photo not available."
+msgstr "Foto no disponible."
+
+#: ../../Zotlabs/Module/Profile_photo.php:420
+#: ../../Zotlabs/Module/Cover_photo.php:358
+msgid "Upload File:"
+msgstr "Subir fichero:"
+
+#: ../../Zotlabs/Module/Profile_photo.php:421
+#: ../../Zotlabs/Module/Cover_photo.php:359
+msgid "Select a profile:"
+msgstr "Seleccionar un perfil:"
+
+#: ../../Zotlabs/Module/Profile_photo.php:422
+msgid "Use Photo for Profile"
+msgstr "Usar la fotografía para el perfil"
+
+#: ../../Zotlabs/Module/Profile_photo.php:422
+msgid "Upload Profile Photo"
+msgstr "Subir foto de perfil"
-#: ../../Zotlabs/Module/Item.php:184
+#: ../../Zotlabs/Module/Profile_photo.php:423
+#: ../../addon/openclipatar/openclipatar.php:182
+#: ../../addon/openclipatar/openclipatar.php:194
+msgid "Use"
+msgstr "Usar"
+
+#: ../../Zotlabs/Module/Profile_photo.php:429
+#: ../../Zotlabs/Module/Cover_photo.php:365
+msgid "skip this step"
+msgstr "Omitir este paso"
+
+#: ../../Zotlabs/Module/Profile_photo.php:429
+#: ../../Zotlabs/Module/Cover_photo.php:365
+msgid "select a photo from your photo albums"
+msgstr "Seleccione una foto de sus álbumes de fotos"
+
+#: ../../Zotlabs/Module/Profile_photo.php:448
+#: ../../Zotlabs/Module/Cover_photo.php:381
+msgid "Crop Image"
+msgstr "Recortar imagen"
+
+#: ../../Zotlabs/Module/Profile_photo.php:449
+#: ../../Zotlabs/Module/Cover_photo.php:382
+msgid "Please adjust the image cropping for optimum viewing."
+msgstr "Por favor ajuste el recorte de la imagen para una visión óptima."
+
+#: ../../Zotlabs/Module/Profile_photo.php:451
+#: ../../Zotlabs/Module/Cover_photo.php:384
+msgid "Done Editing"
+msgstr "Edición completada"
+
+#: ../../Zotlabs/Module/Profile.php:91
+msgid "vcard"
+msgstr "vcard"
+
+#: ../../Zotlabs/Module/Oexchange.php:27
+msgid "Unable to find your hub."
+msgstr "No se puede encontrar su servidor."
+
+#: ../../Zotlabs/Module/Oexchange.php:41
+msgid "Post successful."
+msgstr "Enviado con éxito."
+
+#: ../../Zotlabs/Module/Viewsrc.php:46
+msgid "Source of Item"
+msgstr "Origen del elemento"
+
+#: ../../Zotlabs/Module/Item.php:185
msgid "Unable to locate original post."
msgstr "No ha sido posible encontrar la entrada original."
-#: ../../Zotlabs/Module/Item.php:450
+#: ../../Zotlabs/Module/Item.php:451
msgid "Empty post discarded."
msgstr "La entrada vacía ha sido desechada."
-#: ../../Zotlabs/Module/Item.php:492
-msgid "Executable content type not permitted to this channel."
-msgstr "Contenido de tipo ejecutable no permitido en este canal."
-
-#: ../../Zotlabs/Module/Item.php:842
+#: ../../Zotlabs/Module/Item.php:825
msgid "Duplicate post suppressed."
msgstr "Se ha suprimido la entrada duplicada."
-#: ../../Zotlabs/Module/Item.php:984
+#: ../../Zotlabs/Module/Item.php:955
msgid "System error. Post not saved."
msgstr "Error del sistema. La entrada no se ha podido salvar."
-#: ../../Zotlabs/Module/Item.php:1114
+#: ../../Zotlabs/Module/Item.php:1085
msgid "Unable to obtain post information from database."
msgstr "No ha sido posible obtener información de la entrada en la base de datos."
-#: ../../Zotlabs/Module/Item.php:1121
+#: ../../Zotlabs/Module/Item.php:1092
#, php-format
msgid "You have reached your limit of %1$.0f top level posts."
msgstr "Ha alcanzado su límite de %1$.0f entradas en la página principal."
-#: ../../Zotlabs/Module/Item.php:1128
+#: ../../Zotlabs/Module/Item.php:1099
#, php-format
msgid "You have reached your limit of %1$.0f webpages."
msgstr "Ha alcanzado su límite de %1$.0f páginas web."
-#: ../../Zotlabs/Module/Pconfig.php:26 ../../Zotlabs/Module/Pconfig.php:59
-msgid "This setting requires special processing and editing has been blocked."
-msgstr "Este ajuste necesita de un proceso especial y la edición ha sido bloqueada."
+#: ../../Zotlabs/Module/Ping.php:254
+msgid "sent you a private message"
+msgstr "le ha enviado un mensaje privado"
-#: ../../Zotlabs/Module/Pconfig.php:48
-msgid "Configuration Editor"
-msgstr "Editor de configuración"
+#: ../../Zotlabs/Module/Ping.php:302
+msgid "added your channel"
+msgstr "añadió este canal a sus conexiones"
-#: ../../Zotlabs/Module/Pconfig.php:49
-msgid ""
-"Warning: Changing some settings could render your channel inoperable. Please"
-" leave this page unless you are comfortable with and knowledgeable about how"
-" to correctly use this feature."
-msgstr "Atención: El cambio de algunos ajustes puede volver inutilizable su canal. Por favor, abandone la página excepto que esté seguro y sepa cómo usar correctamente esta característica."
+#: ../../Zotlabs/Module/Ping.php:312
+msgid "g A l F d"
+msgstr "g A l d F"
-#: ../../Zotlabs/Module/Search.php:224
-#, php-format
-msgid "Items tagged with: %s"
-msgstr "elementos etiquetados con: %s"
+#: ../../Zotlabs/Module/Ping.php:330
+msgid "[today]"
+msgstr "[hoy]"
-#: ../../Zotlabs/Module/Search.php:226
-#, php-format
-msgid "Search results for: %s"
-msgstr "Resultados de la búsqueda para: %s"
+#: ../../Zotlabs/Module/Ping.php:339
+msgid "posted an event"
+msgstr "publicó un evento"
-#: ../../Zotlabs/Module/Lockview.php:75
-msgid "Remote privacy information not available."
-msgstr "La información privada remota no está disponible."
+#: ../../Zotlabs/Module/Page.php:40 ../../Zotlabs/Module/Block.php:31
+msgid "Invalid item."
+msgstr "Elemento no válido."
-#: ../../Zotlabs/Module/Lockview.php:96
-msgid "Visible to:"
-msgstr "Visible para:"
+#: ../../Zotlabs/Module/Page.php:94 ../../Zotlabs/Module/Block.php:79
+#: ../../Zotlabs/Module/Display.php:122
+#: ../../Zotlabs/Lib/NativeWikiPage.php:500 ../../Zotlabs/Web/Router.php:146
+#: ../../include/help.php:68
+msgid "Page not found."
+msgstr "Página no encontrada."
-#: ../../Zotlabs/Module/Lockview.php:117 ../../Zotlabs/Module/Lockview.php:153
-#: ../../Zotlabs/Module/Acl.php:117 ../../include/acl_selectors.php:183
-msgctxt "acl"
-msgid "Profile"
-msgstr "Perfil"
+#: ../../Zotlabs/Module/Page.php:131
+msgid ""
+"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod "
+"tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,"
+" quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo "
+"consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse "
+"cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat "
+"non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
+msgstr "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
-#: ../../Zotlabs/Module/Blocks.php:154 ../../include/text.php:2288
-msgid "Blocks"
-msgstr "Bloques"
+#: ../../Zotlabs/Module/Connedit.php:79
+msgid "Could not access contact record."
+msgstr "No se ha podido acceder al registro de contacto."
-#: ../../Zotlabs/Module/Blocks.php:156
-msgid "Block Title"
-msgstr "Título del bloque"
+#: ../../Zotlabs/Module/Connedit.php:109
+msgid "Could not locate selected profile."
+msgstr "No se ha podido localizar el perfil seleccionado."
-#: ../../Zotlabs/Module/Layouts.php:183 ../../include/text.php:2290
-msgid "Layouts"
-msgstr "Plantillas"
+#: ../../Zotlabs/Module/Connedit.php:246
+msgid "Connection updated."
+msgstr "Conexión actualizada."
-#: ../../Zotlabs/Module/Layouts.php:185 ../../Zotlabs/Lib/Apps.php:232
-#: ../../include/help.php:55 ../../include/help.php:61
-#: ../../include/nav.php:174 ../../include/nav.php:288
-msgid "Help"
-msgstr "Ayuda"
+#: ../../Zotlabs/Module/Connedit.php:248
+msgid "Failed to update connection record."
+msgstr "Error al actualizar el registro de la conexión."
-#: ../../Zotlabs/Module/Layouts.php:185
-msgid "Comanche page description language help"
-msgstr "Página de ayuda del lenguaje de descripción de páginas (PDL) Comanche"
+#: ../../Zotlabs/Module/Connedit.php:298
+msgid "is now connected to"
+msgstr "ahora está conectado/a"
-#: ../../Zotlabs/Module/Layouts.php:189
-msgid "Layout Description"
-msgstr "Descripción de la plantilla"
+#: ../../Zotlabs/Module/Connedit.php:423
+msgid "Could not access address book record."
+msgstr "No se pudo acceder al registro en su libreta de direcciones."
-#: ../../Zotlabs/Module/Layouts.php:194
-msgid "Download PDL file"
-msgstr "Descargar el fichero PDL"
+#: ../../Zotlabs/Module/Connedit.php:471
+msgid "Refresh failed - channel is currently unavailable."
+msgstr "Recarga fallida - no se puede encontrar el canal en este momento."
-#: ../../Zotlabs/Module/Rate.php:156
-msgid "Website:"
-msgstr "Sitio web:"
+#: ../../Zotlabs/Module/Connedit.php:486 ../../Zotlabs/Module/Connedit.php:495
+#: ../../Zotlabs/Module/Connedit.php:504 ../../Zotlabs/Module/Connedit.php:513
+#: ../../Zotlabs/Module/Connedit.php:526
+msgid "Unable to set address book parameters."
+msgstr "No ha sido posible establecer los parámetros de la libreta de direcciones."
-#: ../../Zotlabs/Module/Rate.php:159
+#: ../../Zotlabs/Module/Connedit.php:550
+msgid "Connection has been removed."
+msgstr "La conexión ha sido eliminada."
+
+#: ../../Zotlabs/Module/Connedit.php:590 ../../Zotlabs/Lib/Apps.php:228
+#: ../../addon/openclipatar/openclipatar.php:57
+#: ../../include/conversation.php:982 ../../include/nav.php:106
+msgid "View Profile"
+msgstr "Ver el perfil"
+
+#: ../../Zotlabs/Module/Connedit.php:593
#, php-format
-msgid "Remote Channel [%s] (not yet known on this site)"
-msgstr "Canal remoto [%s] (aún no es conocido en este sitio)"
+msgid "View %s's profile"
+msgstr "Ver el perfil de %s"
-#: ../../Zotlabs/Module/Rate.php:160
-msgid "Rating (this information is public)"
-msgstr "Valoración (esta información es pública)"
+#: ../../Zotlabs/Module/Connedit.php:597
+msgid "Refresh Permissions"
+msgstr "Recargar los permisos"
-#: ../../Zotlabs/Module/Rate.php:161
-msgid "Optionally explain your rating (this information is public)"
-msgstr "Opcionalmente puede explicar su valoración (esta información es pública)"
+#: ../../Zotlabs/Module/Connedit.php:600
+msgid "Fetch updated permissions"
+msgstr "Obtener los permisos actualizados"
-#: ../../Zotlabs/Module/Profile_photo.php:194
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:298
-msgid ""
-"Shift-reload the page or clear browser cache if the new photo does not "
-"display immediately."
-msgstr "Recargue la página o limpie el caché del navegador si la nueva foto no se muestra inmediatamente."
+#: ../../Zotlabs/Module/Connedit.php:604
+msgid "Refresh Photo"
+msgstr "Actualizar la foto"
-#: ../../Zotlabs/Module/Profile_photo.php:420
-msgid "Use Photo for Profile"
-msgstr "Usar la fotografía para el perfil"
+#: ../../Zotlabs/Module/Connedit.php:607
+msgid "Fetch updated photo"
+msgstr "Obtener una foto actualizada"
-#: ../../Zotlabs/Module/Profile_photo.php:420
-msgid "Upload Profile Photo"
-msgstr "Subir foto de perfil"
+#: ../../Zotlabs/Module/Connedit.php:611
+msgid "Recent Activity"
+msgstr "Actividad reciente"
-#: ../../Zotlabs/Module/Profile_photo.php:421
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:182
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:194
-msgid "Use"
-msgstr "Usar"
+#: ../../Zotlabs/Module/Connedit.php:614
+msgid "View recent posts and comments"
+msgstr "Ver publicaciones y comentarios recientes"
-#: ../../Zotlabs/Module/Like.php:19
-msgid "Like/Dislike"
-msgstr "Me gusta/No me gusta"
+#: ../../Zotlabs/Module/Connedit.php:621
+msgid "Block (or Unblock) all communications with this connection"
+msgstr "Bloquear (o desbloquear) todas las comunicaciones con esta conexión"
-#: ../../Zotlabs/Module/Like.php:24
-msgid "This action is restricted to members."
-msgstr "Esta acción está restringida solo para miembros."
+#: ../../Zotlabs/Module/Connedit.php:622
+msgid "This connection is blocked!"
+msgstr "¡Esta conexión está bloqueada!"
-#: ../../Zotlabs/Module/Like.php:25
-msgid ""
-"Please <a href=\"rmagic\">login with your $Projectname ID</a> or <a "
-"href=\"register\">register as a new $Projectname member</a> to continue."
-msgstr "Por favor, <a href=\"rmagic\">identifíquese con su $Projectname ID</a> o <a href=\"register\">rregístrese como un nuevo $Projectname member</a> para continuar."
+#: ../../Zotlabs/Module/Connedit.php:626
+msgid "Unignore"
+msgstr "Dejar de ignorar"
-#: ../../Zotlabs/Module/Like.php:105 ../../Zotlabs/Module/Like.php:131
-#: ../../Zotlabs/Module/Like.php:169
-msgid "Invalid request."
-msgstr "Solicitud incorrecta."
+#: ../../Zotlabs/Module/Connedit.php:629
+msgid "Ignore (or Unignore) all inbound communications from this connection"
+msgstr "Ignorar (o dejar de ignorar) todas las comunicaciones entrantes de esta conexión"
-#: ../../Zotlabs/Module/Like.php:117 ../../include/conversation.php:126
-msgid "channel"
-msgstr "el canal"
+#: ../../Zotlabs/Module/Connedit.php:630
+msgid "This connection is ignored!"
+msgstr "¡Esta conexión es ignorada!"
-#: ../../Zotlabs/Module/Like.php:146
-msgid "thing"
-msgstr "elemento"
+#: ../../Zotlabs/Module/Connedit.php:634
+msgid "Unarchive"
+msgstr "Desarchivar"
-#: ../../Zotlabs/Module/Like.php:192
-msgid "Channel unavailable."
-msgstr "Canal no disponible."
+#: ../../Zotlabs/Module/Connedit.php:634
+msgid "Archive"
+msgstr "Archivar"
-#: ../../Zotlabs/Module/Like.php:240
-msgid "Previous action reversed."
-msgstr "Acción anterior revocada."
+#: ../../Zotlabs/Module/Connedit.php:637
+msgid ""
+"Archive (or Unarchive) this connection - mark channel dead but keep content"
+msgstr "Archiva (o desarchiva) esta conexión - marca el canal como muerto aunque mantiene sus contenidos"
-#: ../../Zotlabs/Module/Like.php:370 ../../Zotlabs/Module/Subthread.php:87
-#: ../../Zotlabs/Module/Tagger.php:47
-#: ../../extend/addon/addon/diaspora/inbound.php:1794
-#: ../../extend/addon/addon/redphotos/redphotohelper.php:74
-#: ../../include/conversation.php:120 ../../include/text.php:1958
-msgid "photo"
-msgstr "foto"
+#: ../../Zotlabs/Module/Connedit.php:638
+msgid "This connection is archived!"
+msgstr "¡Esta conexión esta archivada!"
-#: ../../Zotlabs/Module/Like.php:370 ../../Zotlabs/Module/Subthread.php:87
-#: ../../extend/addon/addon/diaspora/inbound.php:1794
-#: ../../include/conversation.php:148 ../../include/text.php:1964
-msgid "status"
-msgstr "el mensaje de estado"
+#: ../../Zotlabs/Module/Connedit.php:642
+msgid "Unhide"
+msgstr "Mostrar"
-#: ../../Zotlabs/Module/Like.php:419
-#: ../../extend/addon/addon/diaspora/inbound.php:1823
-#: ../../include/conversation.php:164
-#, php-format
-msgid "%1$s likes %2$s's %3$s"
-msgstr "A %1$s le gusta %3$s de %2$s"
+#: ../../Zotlabs/Module/Connedit.php:642
+msgid "Hide"
+msgstr "Ocultar"
-#: ../../Zotlabs/Module/Like.php:421 ../../include/conversation.php:167
-#, php-format
-msgid "%1$s doesn't like %2$s's %3$s"
-msgstr "A %1$s no le gusta %3$s de %2$s"
+#: ../../Zotlabs/Module/Connedit.php:645
+msgid "Hide or Unhide this connection from your other connections"
+msgstr "Ocultar o mostrar esta conexión a sus otras conexiones"
-#: ../../Zotlabs/Module/Like.php:423
-#, php-format
-msgid "%1$s agrees with %2$s's %3$s"
-msgstr "%3$s de %2$s: %1$s está de acuerdo"
+#: ../../Zotlabs/Module/Connedit.php:646
+msgid "This connection is hidden!"
+msgstr "¡Esta conexión está oculta!"
-#: ../../Zotlabs/Module/Like.php:425
-#, php-format
-msgid "%1$s doesn't agree with %2$s's %3$s"
-msgstr "%3$s de %2$s: %1$s no está de acuerdo"
+#: ../../Zotlabs/Module/Connedit.php:653
+msgid "Delete this connection"
+msgstr "Eliminar esta conexión"
-#: ../../Zotlabs/Module/Like.php:427
-#, php-format
-msgid "%1$s abstains from a decision on %2$s's %3$s"
-msgstr "%3$s de %2$s: %1$s se abstiene"
+#: ../../Zotlabs/Module/Connedit.php:661
+msgid "Fetch Vcard"
+msgstr "Obtener una vcard"
-#: ../../Zotlabs/Module/Like.php:429
-#, php-format
-msgid "%1$s is attending %2$s's %3$s"
-msgstr "%3$s de %2$s: %1$s participa"
+#: ../../Zotlabs/Module/Connedit.php:664
+msgid "Fetch electronic calling card for this connection"
+msgstr "Obtener una tarjeta de llamada electrónica para esta conexión"
-#: ../../Zotlabs/Module/Like.php:431
-#, php-format
-msgid "%1$s is not attending %2$s's %3$s"
-msgstr "%3$s de %2$s: %1$s no participa"
+#: ../../Zotlabs/Module/Connedit.php:675
+msgid "Open Individual Permissions section by default"
+msgstr "Abrir la sección de permisos individuales por defecto"
-#: ../../Zotlabs/Module/Like.php:433
-#, php-format
-msgid "%1$s may attend %2$s's %3$s"
-msgstr "%3$s de %2$s: %1$s quizá participe"
+#: ../../Zotlabs/Module/Connedit.php:698
+msgid "Affinity"
+msgstr "Afinidad"
-#: ../../Zotlabs/Module/Like.php:538
-msgid "Action completed."
-msgstr "Acción completada."
+#: ../../Zotlabs/Module/Connedit.php:701
+msgid "Open Set Affinity section by default"
+msgstr "Abrir por defecto la sección para definir la afinidad"
-#: ../../Zotlabs/Module/Like.php:539
-msgid "Thank you."
-msgstr "Gracias."
+#: ../../Zotlabs/Module/Connedit.php:705 ../../Zotlabs/Widget/Affinity.php:26
+msgid "Me"
+msgstr "Yo"
-#: ../../Zotlabs/Module/Common.php:14
-msgid "No channel."
-msgstr "Ningún canal."
+#: ../../Zotlabs/Module/Connedit.php:706 ../../Zotlabs/Widget/Affinity.php:27
+msgid "Family"
+msgstr "Familia"
-#: ../../Zotlabs/Module/Common.php:43
-msgid "Common connections"
-msgstr "Conexiones comunes"
+#: ../../Zotlabs/Module/Connedit.php:708 ../../Zotlabs/Widget/Affinity.php:29
+msgid "Acquaintances"
+msgstr "Conocidos/as"
-#: ../../Zotlabs/Module/Common.php:48
-msgid "No connections in common."
-msgstr "Ninguna conexión en común."
+#: ../../Zotlabs/Module/Connedit.php:735
+msgid "Filter"
+msgstr "Filtrar"
-#: ../../Zotlabs/Module/Chanview.php:134
-msgid "toggle full screen mode"
-msgstr "cambiar al modo de pantalla completa"
+#: ../../Zotlabs/Module/Connedit.php:738
+msgid "Open Custom Filter section by default"
+msgstr "Abrir por defecto la sección de personalización de filtros"
-#: ../../Zotlabs/Module/Subthread.php:118
-#, php-format
-msgid "%1$s is following %2$s's %3$s"
-msgstr "%1$s está siguiendo %3$s de %2$s"
+#: ../../Zotlabs/Module/Connedit.php:775
+msgid "Approve this connection"
+msgstr "Aprobar esta conexión"
-#: ../../Zotlabs/Module/Subthread.php:120
-#, php-format
-msgid "%1$s stopped following %2$s's %3$s"
-msgstr "%1$s ha dejado de seguir %3$s de %2$s"
+#: ../../Zotlabs/Module/Connedit.php:775
+msgid "Accept connection to allow communication"
+msgstr "Aceptar la conexión para permitir la comunicación"
-#: ../../Zotlabs/Module/Channel.php:32 ../../Zotlabs/Module/Chat.php:25
-#: ../../extend/addon/addon/chess/chess.php:403
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:26
-msgid "You must be logged in to see this page."
-msgstr "Debe haber iniciado sesión para poder ver esta página."
+#: ../../Zotlabs/Module/Connedit.php:780
+msgid "Set Affinity"
+msgstr "Ajustar la afinidad"
-#: ../../Zotlabs/Module/Channel.php:112
-msgid "Insufficient permissions. Request redirected to profile page."
-msgstr "Permisos insuficientes. Petición redirigida a la página del perfil."
+#: ../../Zotlabs/Module/Connedit.php:783
+msgid "Set Profile"
+msgstr "Ajustar el perfil"
-#: ../../Zotlabs/Module/Lostpass.php:19
-msgid "No valid account found."
-msgstr "No se ha encontrado una cuenta válida."
+#: ../../Zotlabs/Module/Connedit.php:786
+msgid "Set Affinity & Profile"
+msgstr "Ajustar la afinidad y el perfil"
-#: ../../Zotlabs/Module/Lostpass.php:33
-msgid "Password reset request issued. Check your email."
-msgstr "Se ha recibido una solicitud de restablecimiento de contraseña. Consulte su correo electrónico."
+#: ../../Zotlabs/Module/Connedit.php:844
+msgid "none"
+msgstr "-"
-#: ../../Zotlabs/Module/Lostpass.php:39 ../../Zotlabs/Module/Lostpass.php:108
-#, php-format
-msgid "Site Member (%s)"
-msgstr "Usuario del sitio (%s)"
+#: ../../Zotlabs/Module/Connedit.php:847
+#: ../../Zotlabs/Widget/Settings_menu.php:107
+msgid "Connection Default Permissions"
+msgstr "Permisos predeterminados de conexión"
-#: ../../Zotlabs/Module/Lostpass.php:44 ../../Zotlabs/Module/Lostpass.php:49
+#: ../../Zotlabs/Module/Connedit.php:847 ../../include/items.php:3955
#, php-format
-msgid "Password reset requested at %s"
-msgstr "Se ha solicitado restablecer la contraseña en %s"
+msgid "Connection: %s"
+msgstr "Conexión: %s"
-#: ../../Zotlabs/Module/Lostpass.php:68
-msgid ""
-"Request could not be verified. (You may have previously submitted it.) "
-"Password reset failed."
-msgstr "La solicitud no ha podido ser verificada. (Puede que la haya enviado con anterioridad) El restablecimiento de la contraseña ha fallado."
+#: ../../Zotlabs/Module/Connedit.php:848
+msgid "Apply these permissions automatically"
+msgstr "Aplicar estos permisos automaticamente"
-#: ../../Zotlabs/Module/Lostpass.php:91 ../../boot.php:1757
-msgid "Password Reset"
-msgstr "Restablecer la contraseña"
+#: ../../Zotlabs/Module/Connedit.php:848
+msgid "Connection requests will be approved without your interaction"
+msgstr "Las solicitudes de conexión serán aprobadas sin su intervención"
-#: ../../Zotlabs/Module/Lostpass.php:92
-msgid "Your password has been reset as requested."
-msgstr "Su contraseña ha sido restablecida según lo solicitó."
+#: ../../Zotlabs/Module/Connedit.php:849
+msgid "Permission role"
+msgstr "Rol de acceso"
-#: ../../Zotlabs/Module/Lostpass.php:93
-msgid "Your new password is"
-msgstr "Su nueva contraseña es"
+#: ../../Zotlabs/Module/Connedit.php:850
+msgid "Add permission role"
+msgstr "Añadir un rol de acceso"
-#: ../../Zotlabs/Module/Lostpass.php:94
-msgid "Save or copy your new password - and then"
-msgstr "Guarde o copie su nueva contraseña - y después"
+#: ../../Zotlabs/Module/Connedit.php:856
+msgid "This connection's primary address is"
+msgstr "La dirección primaria de esta conexión es"
-#: ../../Zotlabs/Module/Lostpass.php:95
-msgid "click here to login"
-msgstr "pulse aquí para conectarse"
+#: ../../Zotlabs/Module/Connedit.php:857
+msgid "Available locations:"
+msgstr "Ubicaciones disponibles:"
-#: ../../Zotlabs/Module/Lostpass.php:96
+#: ../../Zotlabs/Module/Connedit.php:861
msgid ""
-"Your password may be changed from the <em>Settings</em> page after "
-"successful login."
-msgstr "Puede cambiar la contraseña en la página <em>Ajustes</em> una vez iniciada la sesión."
+"The permissions indicated on this page will be applied to all new "
+"connections."
+msgstr "Los permisos indicados en esta página serán aplicados en todas las nuevas conexiones."
-#: ../../Zotlabs/Module/Lostpass.php:117
-#, php-format
-msgid "Your password has changed at %s"
-msgstr "Su contraseña en %s ha sido cambiada"
+#: ../../Zotlabs/Module/Connedit.php:862
+msgid "Connection Tools"
+msgstr "Gestión de las conexiones"
-#: ../../Zotlabs/Module/Lostpass.php:130
-msgid "Forgot your Password?"
-msgstr "¿Ha olvidado su contraseña?"
+#: ../../Zotlabs/Module/Connedit.php:864
+msgid "Slide to adjust your degree of friendship"
+msgstr "Deslizar para ajustar el grado de amistad"
-#: ../../Zotlabs/Module/Lostpass.php:131
-msgid ""
-"Enter your email address and submit to have your password reset. Then check "
-"your email for further instructions."
-msgstr "Introduzca y envíe su dirección de correo electrónico para el restablecimiento de su contraseña. Luego revise su correo para obtener más instrucciones."
+#: ../../Zotlabs/Module/Connedit.php:865 ../../Zotlabs/Module/Rate.php:155
+#: ../../include/js_strings.php:20
+msgid "Rating"
+msgstr "Valoración"
-#: ../../Zotlabs/Module/Lostpass.php:132
-msgid "Email Address"
-msgstr "Dirección de correo electrónico"
+#: ../../Zotlabs/Module/Connedit.php:866
+msgid "Slide to adjust your rating"
+msgstr "Deslizar para ajustar su valoración"
-#: ../../Zotlabs/Module/Lostpass.php:133
-msgid "Reset"
-msgstr "Reiniciar"
+#: ../../Zotlabs/Module/Connedit.php:867 ../../Zotlabs/Module/Connedit.php:872
+msgid "Optionally explain your rating"
+msgstr "Opcionalmente, puede explicar su valoración"
-#: ../../Zotlabs/Module/Rbmark.php:94
-msgid "Select a bookmark folder"
-msgstr "Seleccionar una carpeta de marcadores"
+#: ../../Zotlabs/Module/Connedit.php:869
+msgid "Custom Filter"
+msgstr "Filtro personalizado"
-#: ../../Zotlabs/Module/Rbmark.php:99
-msgid "Save Bookmark"
-msgstr "Guardar marcador"
+#: ../../Zotlabs/Module/Connedit.php:870
+msgid "Only import posts with this text"
+msgstr "Importar solo entradas que contengan este texto"
-#: ../../Zotlabs/Module/Rbmark.php:100
-msgid "URL of bookmark"
-msgstr "Dirección del marcador"
+#: ../../Zotlabs/Module/Connedit.php:870 ../../Zotlabs/Module/Connedit.php:871
+msgid ""
+"words one per line or #tags or /patterns/ or lang=xx, leave blank to import "
+"all posts"
+msgstr "Una sola opción por línea: palabras, #etiquetas, /patrones/ o lang=xx. Dejar en blanco para importarlo todo"
-#: ../../Zotlabs/Module/Rbmark.php:105
-msgid "Or enter new bookmark folder name"
-msgstr "O introduzca un nuevo nombre para la carpeta de marcadores"
+#: ../../Zotlabs/Module/Connedit.php:871
+msgid "Do not import posts with this text"
+msgstr "No importar entradas que contengan este texto"
-#: ../../Zotlabs/Module/Follow.php:31
-msgid "Channel added."
-msgstr "Canal añadido."
+#: ../../Zotlabs/Module/Connedit.php:873
+msgid "This information is public!"
+msgstr "¡Esta información es pública!"
-#: ../../Zotlabs/Module/Mood.php:67 ../../include/conversation.php:260
+#: ../../Zotlabs/Module/Connedit.php:878
+msgid "Connection Pending Approval"
+msgstr "Conexión pendiente de aprobación"
+
+#: ../../Zotlabs/Module/Connedit.php:883
#, php-format
-msgctxt "mood"
-msgid "%1$s is %2$s"
-msgstr "%1$s está %2$s"
+msgid ""
+"Please choose the profile you would like to display to %s when viewing your "
+"profile securely."
+msgstr "Por favor, escoja el perfil que quiere mostrar a %s cuando esté viendo su perfil de forma segura."
-#: ../../Zotlabs/Module/Mood.php:135 ../../Zotlabs/Lib/Apps.php:234
-msgid "Mood"
-msgstr "Estado de ánimo"
+#: ../../Zotlabs/Module/Connedit.php:890
+msgid ""
+"Some permissions may be inherited from your channel's <a "
+"href=\"settings\"><strong>privacy settings</strong></a>, which have higher "
+"priority than individual settings. You can change those settings here but "
+"they wont have any impact unless the inherited setting changes."
+msgstr "Algunos permisos pueden ser heredados de los <a href=\"settings\"><strong>ajustes de privacidad</strong></a> de sus canales, los cuales tienen una prioridad más alta que los ajustes individuales. Puede cambiar estos ajustes aquí, pero no tendrán ningún consecuencia hasta que cambie los ajustes heredados."
-#: ../../Zotlabs/Module/Mood.php:136
-msgid "Set your current mood and tell your friends"
-msgstr "Describir su estado de ánimo para comunicárselo a sus amigos"
+#: ../../Zotlabs/Module/Connedit.php:891
+msgid "Last update:"
+msgstr "Última actualización:"
-#: ../../Zotlabs/Module/Regmod.php:15
-msgid "Please login."
-msgstr "Por favor, inicie sesión."
+#: ../../Zotlabs/Module/Connedit.php:900
+msgid "Details"
+msgstr "Detalles"
-#: ../../Zotlabs/Module/Removeaccount.php:35
-msgid ""
-"Account removals are not allowed within 48 hours of changing the account "
-"password."
-msgstr "La eliminación de cuentas no está permitida hasta después de que hayan transcurrido 48 horas desde el último cambio de contraseña."
+#: ../../Zotlabs/Module/Connedit.php:903 ../../addon/cdav/Mod_Cdav.php:1137
+msgid "Organisation"
+msgstr "Organización"
-#: ../../Zotlabs/Module/Removeaccount.php:57
-msgid "Remove This Account"
-msgstr "Eliminar esta cuenta"
+#: ../../Zotlabs/Module/Connedit.php:904 ../../addon/cdav/Mod_Cdav.php:1138
+#: ../../include/page_widgets.php:46
+msgid "Title"
+msgstr "Título"
-#: ../../Zotlabs/Module/Removeaccount.php:58
-#: ../../Zotlabs/Module/Removeme.php:61
-msgid "WARNING: "
-msgstr "ATENCIÓN:"
+#: ../../Zotlabs/Module/Connedit.php:905 ../../Zotlabs/Module/Profiles.php:789
+#: ../../addon/cdav/Mod_Cdav.php:1139
+msgid "Phone"
+msgstr "Teléfono"
-#: ../../Zotlabs/Module/Removeaccount.php:58
-msgid ""
-"This account and all its channels will be completely removed from the "
-"network. "
-msgstr "Esta cuenta y todos sus canales van a ser eliminados de la red."
+#: ../../Zotlabs/Module/Connedit.php:907 ../../Zotlabs/Module/Profiles.php:791
+#: ../../addon/cdav/Mod_Cdav.php:1141
+msgid "Instant messenger"
+msgstr "Mensajería instantánea"
-#: ../../Zotlabs/Module/Removeaccount.php:58
-#: ../../Zotlabs/Module/Removeme.php:61
-msgid "This action is permanent and can not be undone!"
-msgstr "¡Esta acción tiene carácter definitivo y no se puede deshacer!"
+#: ../../Zotlabs/Module/Connedit.php:908 ../../Zotlabs/Module/Profiles.php:792
+#: ../../addon/cdav/Mod_Cdav.php:1142
+msgid "Website"
+msgstr "Sitio web"
-#: ../../Zotlabs/Module/Removeaccount.php:59
-#: ../../Zotlabs/Module/Removeme.php:62
-msgid "Please enter your password for verification:"
-msgstr "Por favor, introduzca su contraseña para su verificación:"
+#: ../../Zotlabs/Module/Connedit.php:910 ../../Zotlabs/Module/Profiles.php:794
+#: ../../addon/cdav/Mod_Cdav.php:1144
+msgid "Note"
+msgstr "Nota"
-#: ../../Zotlabs/Module/Removeaccount.php:60
-msgid ""
-"Remove this account, all its channels and all its channel clones from the "
-"network"
-msgstr "Remover esta cuenta, todos sus canales y clones de la red"
+#: ../../Zotlabs/Module/Connedit.php:911 ../../Zotlabs/Module/Profiles.php:795
+#: ../../addon/cdav/Mod_Cdav.php:1145 ../../addon/cdav/cdav.php:270
+#: ../../include/connections.php:668
+msgid "Mobile"
+msgstr "Móvil"
-#: ../../Zotlabs/Module/Removeaccount.php:60
-msgid ""
-"By default only the instances of the channels located on this hub will be "
-"removed from the network"
-msgstr "Por defecto, solo las instancias de los canales ubicados en este servidor serán eliminados de la red"
+#: ../../Zotlabs/Module/Connedit.php:912 ../../Zotlabs/Module/Profiles.php:796
+#: ../../addon/cdav/Mod_Cdav.php:1146 ../../addon/cdav/cdav.php:271
+#: ../../include/connections.php:669
+msgid "Home"
+msgstr "Inicio"
-#: ../../Zotlabs/Module/Removeaccount.php:61
-#: ../../Zotlabs/Module/Settings/Account.php:120
-msgid "Remove Account"
-msgstr "Eliminar cuenta"
+#: ../../Zotlabs/Module/Connedit.php:913 ../../Zotlabs/Module/Profiles.php:797
+#: ../../addon/cdav/Mod_Cdav.php:1147 ../../addon/cdav/cdav.php:274
+#: ../../include/connections.php:672
+msgid "Work"
+msgstr "Trabajo"
-#: ../../Zotlabs/Module/Pdledit.php:21
-msgid "Layout updated."
-msgstr "Plantilla actualizada."
+#: ../../Zotlabs/Module/Connedit.php:915 ../../Zotlabs/Module/Profiles.php:799
+#: ../../addon/cdav/Mod_Cdav.php:1149
+#: ../../addon/jappixmini/jappixmini.php:368
+msgid "Add Contact"
+msgstr "Añadir un contacto"
-#: ../../Zotlabs/Module/Pdledit.php:34 ../../Zotlabs/Module/Chat.php:216
-msgid "Feature disabled."
-msgstr "Funcionalidad deshabilitada."
+#: ../../Zotlabs/Module/Connedit.php:916 ../../Zotlabs/Module/Profiles.php:800
+#: ../../addon/cdav/Mod_Cdav.php:1150
+msgid "Add Field"
+msgstr "Añadir un campo"
-#: ../../Zotlabs/Module/Pdledit.php:42 ../../Zotlabs/Module/Pdledit.php:69
-msgid "Edit System Page Description"
-msgstr "Editor del Sistema de Descripción de Páginas"
+#: ../../Zotlabs/Module/Connedit.php:921 ../../addon/cdav/Mod_Cdav.php:1155
+msgid "P.O. Box"
+msgstr "Buzón de correos"
-#: ../../Zotlabs/Module/Pdledit.php:64
-msgid "Layout not found."
-msgstr "Plantilla no encontrada"
+#: ../../Zotlabs/Module/Connedit.php:922 ../../addon/cdav/Mod_Cdav.php:1156
+msgid "Additional"
+msgstr "Adicional"
-#: ../../Zotlabs/Module/Pdledit.php:70
-msgid "Module Name:"
-msgstr "Nombre del módulo:"
+#: ../../Zotlabs/Module/Connedit.php:923 ../../addon/cdav/Mod_Cdav.php:1157
+msgid "Street"
+msgstr "Calle"
-#: ../../Zotlabs/Module/Pdledit.php:71
-msgid "Layout Help"
-msgstr "Ayuda para el diseño de plantillas de página"
+#: ../../Zotlabs/Module/Connedit.php:924 ../../addon/cdav/Mod_Cdav.php:1158
+msgid "Locality"
+msgstr "Localidad"
-#: ../../Zotlabs/Module/Directory.php:246
-#, php-format
-msgid "%d rating"
-msgid_plural "%d ratings"
-msgstr[0] "%d valoración"
-msgstr[1] "%d valoraciones"
+#: ../../Zotlabs/Module/Connedit.php:925 ../../addon/cdav/Mod_Cdav.php:1159
+msgid "Region"
+msgstr "Provincia, región o estado"
-#: ../../Zotlabs/Module/Directory.php:257
-msgid "Gender: "
-msgstr "Género:"
+#: ../../Zotlabs/Module/Connedit.php:926 ../../addon/cdav/Mod_Cdav.php:1160
+msgid "ZIP Code"
+msgstr "Código postal"
-#: ../../Zotlabs/Module/Directory.php:259
-msgid "Status: "
-msgstr "Estado:"
+#: ../../Zotlabs/Module/Connedit.php:927 ../../Zotlabs/Module/Profiles.php:760
+#: ../../addon/cdav/Mod_Cdav.php:1161
+msgid "Country"
+msgstr "País"
-#: ../../Zotlabs/Module/Directory.php:261
-msgid "Homepage: "
-msgstr "Página personal:"
+#: ../../Zotlabs/Module/Chat.php:179
+msgid "Room not found"
+msgstr "Sala no encontrada"
-#: ../../Zotlabs/Module/Directory.php:310 ../../include/channel.php:1298
-msgid "Age:"
-msgstr "Edad:"
+#: ../../Zotlabs/Module/Chat.php:195
+msgid "Leave Room"
+msgstr "Abandonar la sala"
-#: ../../Zotlabs/Module/Directory.php:315 ../../include/event.php:52
-#: ../../include/event.php:84 ../../include/markdown.php:562
-#: ../../include/channel.php:1134
-msgid "Location:"
-msgstr "Ubicación:"
+#: ../../Zotlabs/Module/Chat.php:196
+msgid "Delete Room"
+msgstr "Eliminar esta sala"
-#: ../../Zotlabs/Module/Directory.php:321
-msgid "Description:"
-msgstr "Descripción:"
+#: ../../Zotlabs/Module/Chat.php:197
+msgid "I am away right now"
+msgstr "Estoy ausente momentáneamente"
-#: ../../Zotlabs/Module/Directory.php:326 ../../include/channel.php:1314
-msgid "Hometown:"
-msgstr "Lugar de nacimiento:"
+#: ../../Zotlabs/Module/Chat.php:198
+msgid "I am online"
+msgstr "Estoy conectado/a"
-#: ../../Zotlabs/Module/Directory.php:328 ../../include/channel.php:1322
-msgid "About:"
-msgstr "Sobre mí:"
+#: ../../Zotlabs/Module/Chat.php:200
+msgid "Bookmark this room"
+msgstr "Añadir esta sala a Marcadores"
-#: ../../Zotlabs/Module/Directory.php:329 ../../Zotlabs/Module/Suggest.php:56
-#: ../../include/widgets.php:134 ../../include/widgets.php:171
-#: ../../include/connections.php:110 ../../include/conversation.php:938
-#: ../../include/conversation.php:1069 ../../include/channel.php:1119
-msgid "Connect"
-msgstr "Conectar"
+#: ../../Zotlabs/Module/Chat.php:203 ../../Zotlabs/Module/Mail.php:259
+#: ../../Zotlabs/Module/Mail.php:380 ../../include/conversation.php:1263
+msgid "Please enter a link URL:"
+msgstr "Por favor, introduzca la dirección del enlace:"
-#: ../../Zotlabs/Module/Directory.php:330
-msgid "Public Forum:"
-msgstr "Foro público:"
+#: ../../Zotlabs/Module/Chat.php:204 ../../Zotlabs/Module/Mail.php:312
+#: ../../Zotlabs/Module/Mail.php:454 ../../Zotlabs/Lib/ThreadItem.php:744
+#: ../../include/conversation.php:1373
+msgid "Encrypt text"
+msgstr "Cifrar texto"
-#: ../../Zotlabs/Module/Directory.php:333
-msgid "Keywords: "
-msgstr "Palabras clave:"
+#: ../../Zotlabs/Module/Chat.php:230
+msgid "New Chatroom"
+msgstr "Nueva sala de chat"
-#: ../../Zotlabs/Module/Directory.php:336
-msgid "Don't suggest"
-msgstr "No sugerir:"
+#: ../../Zotlabs/Module/Chat.php:231
+msgid "Chatroom name"
+msgstr "Nombre de la sala de chat"
-#: ../../Zotlabs/Module/Directory.php:338
-msgid "Common connections:"
-msgstr "Conexiones comunes:"
+#: ../../Zotlabs/Module/Chat.php:232
+msgid "Expiration of chats (minutes)"
+msgstr "Caducidad de los mensajes en los chats (en minutos)"
-#: ../../Zotlabs/Module/Directory.php:387
-msgid "Global Directory"
-msgstr "Directorio global:"
+#: ../../Zotlabs/Module/Chat.php:248
+#, php-format
+msgid "%1$s's Chatrooms"
+msgstr "Salas de chat de %1$s"
-#: ../../Zotlabs/Module/Directory.php:387
-msgid "Local Directory"
-msgstr "Directorio local:"
+#: ../../Zotlabs/Module/Chat.php:253
+msgid "No chatrooms available"
+msgstr "No hay salas de chat disponibles"
-#: ../../Zotlabs/Module/Directory.php:393
-msgid "Finding:"
-msgstr "Encontrar:"
+#: ../../Zotlabs/Module/Chat.php:257
+msgid "Expiration"
+msgstr "Caducidad"
-#: ../../Zotlabs/Module/Directory.php:396 ../../Zotlabs/Module/Suggest.php:64
-#: ../../include/contact_widgets.php:24
-msgid "Channel Suggestions"
-msgstr "Sugerencias de canales"
+#: ../../Zotlabs/Module/Chat.php:258
+msgid "min"
+msgstr "min"
-#: ../../Zotlabs/Module/Directory.php:398
-msgid "next page"
-msgstr "siguiente página"
+#: ../../Zotlabs/Module/Fbrowser.php:29 ../../Zotlabs/Lib/Apps.php:229
+#: ../../include/conversation.php:1783 ../../include/nav.php:392
+msgid "Photos"
+msgstr "Fotos"
-#: ../../Zotlabs/Module/Directory.php:398
-msgid "previous page"
-msgstr "página anterior"
+#: ../../Zotlabs/Module/Fbrowser.php:85 ../../Zotlabs/Lib/Apps.php:224
+#: ../../Zotlabs/Storage/Browser.php:224 ../../include/conversation.php:1791
+#: ../../include/nav.php:400
+msgid "Files"
+msgstr "Ficheros"
-#: ../../Zotlabs/Module/Directory.php:399
-msgid "Sort options"
-msgstr "Ordenar opciones"
+#: ../../Zotlabs/Module/Menu.php:49
+msgid "Unable to update menu."
+msgstr "No se puede actualizar el menú."
-#: ../../Zotlabs/Module/Directory.php:400
-msgid "Alphabetic"
-msgstr "Alfabético"
+#: ../../Zotlabs/Module/Menu.php:60
+msgid "Unable to create menu."
+msgstr "No se puede crear el menú."
-#: ../../Zotlabs/Module/Directory.php:401
-msgid "Reverse Alphabetic"
-msgstr "Alfabético inverso"
+#: ../../Zotlabs/Module/Menu.php:98 ../../Zotlabs/Module/Menu.php:110
+msgid "Menu Name"
+msgstr "Nombre del menú"
-#: ../../Zotlabs/Module/Directory.php:402
-msgid "Newest to Oldest"
-msgstr "De más nuevo a más antiguo"
+#: ../../Zotlabs/Module/Menu.php:98
+msgid "Unique name (not visible on webpage) - required"
+msgstr "Nombre único (no será visible en la página web) - requerido"
-#: ../../Zotlabs/Module/Directory.php:403
-msgid "Oldest to Newest"
-msgstr "De más antiguo a más nuevo"
+#: ../../Zotlabs/Module/Menu.php:99 ../../Zotlabs/Module/Menu.php:111
+msgid "Menu Title"
+msgstr "Título del menú"
-#: ../../Zotlabs/Module/Directory.php:420
-msgid "No entries (some entries may be hidden)."
-msgstr "Sin entradas (algunas entradas pueden estar ocultas)."
+#: ../../Zotlabs/Module/Menu.php:99
+msgid "Visible on webpage - leave empty for no title"
+msgstr "Visible en la página web - no ponga nada si no desea un título"
-#: ../../Zotlabs/Module/Profile.php:91
-msgid "vcard"
-msgstr "vcard"
+#: ../../Zotlabs/Module/Menu.php:100
+msgid "Allow Bookmarks"
+msgstr "Permitir marcadores"
-#: ../../Zotlabs/Module/Oexchange.php:27
-msgid "Unable to find your hub."
-msgstr "No se puede encontrar su servidor."
+#: ../../Zotlabs/Module/Menu.php:100 ../../Zotlabs/Module/Menu.php:157
+msgid "Menu may be used to store saved bookmarks"
+msgstr "El menú se puede usar para guardar marcadores"
-#: ../../Zotlabs/Module/Oexchange.php:41
-msgid "Post successful."
-msgstr "Enviado con éxito."
+#: ../../Zotlabs/Module/Menu.php:101 ../../Zotlabs/Module/Menu.php:159
+msgid "Submit and proceed"
+msgstr "Enviar y proceder"
-#: ../../Zotlabs/Module/Viewsrc.php:46
-msgid "Source of Item"
-msgstr "Origen del elemento"
+#: ../../Zotlabs/Module/Menu.php:107 ../../include/text.php:2268
+msgid "Menus"
+msgstr "Menús"
-#: ../../Zotlabs/Module/Service_limits.php:23
-msgid "No service class restrictions found."
-msgstr "No se han encontrado restricciones sobre esta clase de servicio."
+#: ../../Zotlabs/Module/Menu.php:117
+msgid "Bookmarks allowed"
+msgstr "Marcadores permitidos"
-#: ../../Zotlabs/Module/Acl.php:344
-msgid "network"
-msgstr "red"
+#: ../../Zotlabs/Module/Menu.php:119
+msgid "Delete this menu"
+msgstr "Borrar este menú"
-#: ../../Zotlabs/Module/Acl.php:354
-msgid "RSS"
-msgstr "RSS"
+#: ../../Zotlabs/Module/Menu.php:120 ../../Zotlabs/Module/Menu.php:154
+msgid "Edit menu contents"
+msgstr "Editar los contenidos del menú"
-#: ../../Zotlabs/Module/Removeme.php:35
-msgid ""
-"Channel removals are not allowed within 48 hours of changing the account "
-"password."
-msgstr "La eliminación de canales no está permitida hasta pasadas 48 horas desde el último cambio de contraseña."
+#: ../../Zotlabs/Module/Menu.php:121
+msgid "Edit this menu"
+msgstr "Modificar este menú"
-#: ../../Zotlabs/Module/Removeme.php:60
-msgid "Remove This Channel"
-msgstr "Eliminar este canal"
+#: ../../Zotlabs/Module/Menu.php:136
+msgid "Menu could not be deleted."
+msgstr "El menú no puede ser eliminado."
-#: ../../Zotlabs/Module/Removeme.php:61
-msgid "This channel will be completely removed from the network. "
-msgstr "Este canal va a ser completamente eliminado de la red. "
+#: ../../Zotlabs/Module/Menu.php:149
+msgid "Edit Menu"
+msgstr "Modificar el menú"
-#: ../../Zotlabs/Module/Removeme.php:63
-msgid "Remove this channel and all its clones from the network"
-msgstr "Eliminar este canal y todos sus clones de la red"
+#: ../../Zotlabs/Module/Menu.php:153
+msgid "Add or remove entries to this menu"
+msgstr "Añadir o quitar entradas en este menú"
-#: ../../Zotlabs/Module/Removeme.php:63
-msgid ""
-"By default only the instance of the channel located on this hub will be "
-"removed from the network"
-msgstr "Por defecto, solo la instancia del canal alojado en este servidor será eliminado de la red"
+#: ../../Zotlabs/Module/Menu.php:155
+msgid "Menu name"
+msgstr "Nombre del menú"
-#: ../../Zotlabs/Module/Removeme.php:64
-#: ../../Zotlabs/Module/Settings/Channel.php:575
-msgid "Remove Channel"
-msgstr "Eliminar el canal"
+#: ../../Zotlabs/Module/Menu.php:155
+msgid "Must be unique, only seen by you"
+msgstr "Debe ser único, solo será visible para usted"
-#: ../../Zotlabs/Module/Sharedwithme.php:98
-msgid "Files: shared with me"
-msgstr "Ficheros: compartidos conmigo"
+#: ../../Zotlabs/Module/Menu.php:156
+msgid "Menu title"
+msgstr "Título del menú"
-#: ../../Zotlabs/Module/Sharedwithme.php:100
-msgid "NEW"
-msgstr "NUEVO"
+#: ../../Zotlabs/Module/Menu.php:156
+msgid "Menu title as seen by others"
+msgstr "El título del menú tal como será visto por los demás"
-#: ../../Zotlabs/Module/Sharedwithme.php:103
-msgid "Remove all files"
-msgstr "Eliminar todos los ficheros"
+#: ../../Zotlabs/Module/Menu.php:157
+msgid "Allow bookmarks"
+msgstr "Permitir marcadores"
-#: ../../Zotlabs/Module/Sharedwithme.php:104
-msgid "Remove this file"
-msgstr "Eliminar este fichero"
+#: ../../Zotlabs/Module/Layouts.php:184 ../../include/text.php:2269
+msgid "Layouts"
+msgstr "Plantillas"
+
+#: ../../Zotlabs/Module/Layouts.php:186 ../../Zotlabs/Lib/Apps.php:232
+#: ../../include/nav.php:161 ../../include/nav.php:268
+#: ../../include/help.php:55 ../../include/help.php:61
+msgid "Help"
+msgstr "Ayuda"
+
+#: ../../Zotlabs/Module/Layouts.php:186
+msgid "Comanche page description language help"
+msgstr "Página de ayuda del lenguaje de descripción de páginas (PDL) Comanche"
+
+#: ../../Zotlabs/Module/Layouts.php:190
+msgid "Layout Description"
+msgstr "Descripción de la plantilla"
+
+#: ../../Zotlabs/Module/Layouts.php:195
+msgid "Download PDL file"
+msgstr "Descargar el fichero PDL"
#: ../../Zotlabs/Module/Tagger.php:55 ../../include/bbcode.php:274
msgid "post"
msgstr "la entrada"
-#: ../../Zotlabs/Module/Tagger.php:57 ../../include/conversation.php:150
-#: ../../include/text.php:1966
+#: ../../Zotlabs/Module/Tagger.php:57 ../../include/conversation.php:146
+#: ../../include/text.php:1945
msgid "comment"
msgstr "el comentario"
@@ -5402,97 +5526,76 @@ msgstr "el comentario"
msgid "%1$s tagged %2$s's %3$s with %4$s"
msgstr "%1$s ha etiquetado %3$s de %2$s con %4$s"
-#: ../../Zotlabs/Module/Sources.php:37
-msgid "Failed to create source. No channel selected."
-msgstr "No se ha podido crear el origen de los contenidos. No ha sido seleccionado ningún canal."
-
-#: ../../Zotlabs/Module/Sources.php:51
-msgid "Source created."
-msgstr "Fuente creada."
-
-#: ../../Zotlabs/Module/Sources.php:64
-msgid "Source updated."
-msgstr "Fuente actualizada."
-
-#: ../../Zotlabs/Module/Sources.php:90
-msgid "*"
-msgstr "*"
-
-#: ../../Zotlabs/Module/Sources.php:96 ../../include/widgets.php:677
-#: ../../include/features.php:213
-msgid "Channel Sources"
-msgstr "Orígenes de los contenidos del canal"
-
-#: ../../Zotlabs/Module/Sources.php:97
-msgid "Manage remote sources of content for your channel."
-msgstr "Gestionar contenido de origen remoto para su canal."
+#: ../../Zotlabs/Module/Pconfig.php:26 ../../Zotlabs/Module/Pconfig.php:59
+msgid "This setting requires special processing and editing has been blocked."
+msgstr "Este ajuste necesita de un proceso especial y la edición ha sido bloqueada."
-#: ../../Zotlabs/Module/Sources.php:98 ../../Zotlabs/Module/Sources.php:108
-msgid "New Source"
-msgstr "Nueva fuente"
+#: ../../Zotlabs/Module/Pconfig.php:48
+msgid "Configuration Editor"
+msgstr "Editor de configuración"
-#: ../../Zotlabs/Module/Sources.php:109 ../../Zotlabs/Module/Sources.php:143
+#: ../../Zotlabs/Module/Pconfig.php:49
msgid ""
-"Import all or selected content from the following channel into this channel "
-"and distribute it according to your channel settings."
-msgstr "Importar todo el contenido o una selección de los siguientes canales en este canal y distribuirlo de acuerdo con sus ajustes."
+"Warning: Changing some settings could render your channel inoperable. Please"
+" leave this page unless you are comfortable with and knowledgeable about how"
+" to correctly use this feature."
+msgstr "Atención: El cambio de algunos ajustes puede volver inutilizable su canal. Por favor, abandone la página excepto que esté seguro y sepa cómo usar correctamente esta característica."
-#: ../../Zotlabs/Module/Sources.php:110 ../../Zotlabs/Module/Sources.php:144
-msgid "Only import content with these words (one per line)"
-msgstr "Importar solo contenido que contenga estas palabras (una por línea)"
+#: ../../Zotlabs/Module/Group.php:24
+msgid "Privacy group created."
+msgstr "El grupo de canales ha sido creado."
-#: ../../Zotlabs/Module/Sources.php:110 ../../Zotlabs/Module/Sources.php:144
-msgid "Leave blank to import all public content"
-msgstr "Dejar en blanco para importar todo el contenido público"
+#: ../../Zotlabs/Module/Group.php:30
+msgid "Could not create privacy group."
+msgstr "No se puede crear el grupo de canales"
-#: ../../Zotlabs/Module/Sources.php:111 ../../Zotlabs/Module/Sources.php:148
-msgid "Channel Name"
-msgstr "Nombre del canal"
+#: ../../Zotlabs/Module/Group.php:42 ../../Zotlabs/Module/Group.php:141
+#: ../../include/items.php:3922
+msgid "Privacy group not found."
+msgstr "Grupo de canales no encontrado."
-#: ../../Zotlabs/Module/Sources.php:112 ../../Zotlabs/Module/Sources.php:147
-msgid ""
-"Add the following categories to posts imported from this source (comma "
-"separated)"
-msgstr "Añadir los temas siguientes a las entradas importadas de esta fuente (separadas por comas)"
+#: ../../Zotlabs/Module/Group.php:58
+msgid "Privacy group updated."
+msgstr "Grupo de canales actualizado."
-#: ../../Zotlabs/Module/Sources.php:112 ../../Zotlabs/Module/Sources.php:147
-#: ../../Zotlabs/Module/Settings/Oauth.php:93
-msgid "Optional"
-msgstr "Opcional"
+#: ../../Zotlabs/Module/Group.php:90
+msgid "Create a group of channels."
+msgstr "Crear un grupo de canales."
-#: ../../Zotlabs/Module/Sources.php:133 ../../Zotlabs/Module/Sources.php:161
-msgid "Source not found."
-msgstr "Fuente no encontrada"
+#: ../../Zotlabs/Module/Group.php:91 ../../Zotlabs/Module/Group.php:184
+msgid "Privacy group name: "
+msgstr "Nombre del grupo de canales:"
-#: ../../Zotlabs/Module/Sources.php:140
-msgid "Edit Source"
-msgstr "Editar fuente"
+#: ../../Zotlabs/Module/Group.php:93 ../../Zotlabs/Module/Group.php:187
+msgid "Members are visible to other channels"
+msgstr "Los miembros son visibles para otros canales"
-#: ../../Zotlabs/Module/Sources.php:141
-msgid "Delete Source"
-msgstr "Eliminar fuente"
+#: ../../Zotlabs/Module/Group.php:111
+msgid "Privacy group removed."
+msgstr "Grupo de canales eliminado."
-#: ../../Zotlabs/Module/Sources.php:169
-msgid "Source removed"
-msgstr "Fuente eliminada"
+#: ../../Zotlabs/Module/Group.php:113
+msgid "Unable to remove privacy group."
+msgstr "No se puede eliminar el grupo de canales."
-#: ../../Zotlabs/Module/Sources.php:171
-msgid "Unable to remove source."
-msgstr "No se puede eliminar la fuente."
+#: ../../Zotlabs/Module/Group.php:183
+msgid "Privacy group editor"
+msgstr "Editor de grupos de canales"
-#: ../../Zotlabs/Module/Suggest.php:39
-msgid ""
-"No suggestions available. If this is a new site, please try again in 24 "
-"hours."
-msgstr "No hay sugerencias disponibles. Si es un sitio nuevo, espere 24 horas y pruebe de nuevo."
+#: ../../Zotlabs/Module/Group.php:197 ../../Zotlabs/Module/Help.php:81
+msgid "Members"
+msgstr "Miembros"
-#: ../../Zotlabs/Module/Suggest.php:58 ../../include/widgets.php:136
-msgid "Ignore/Hide"
-msgstr "Ignorar/Ocultar"
+#: ../../Zotlabs/Module/Group.php:199
+msgid "All Connected Channels"
+msgstr "Todos los canales conectados"
+
+#: ../../Zotlabs/Module/Group.php:231
+msgid "Click on a channel to add or remove."
+msgstr "Haga clic en un canal para agregarlo o quitarlo."
#: ../../Zotlabs/Module/Profiles.php:24 ../../Zotlabs/Module/Profiles.php:184
#: ../../Zotlabs/Module/Profiles.php:241 ../../Zotlabs/Module/Profiles.php:659
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:62
msgid "Profile not found."
msgstr "Perfil no encontrado."
@@ -5549,7 +5652,7 @@ msgid "Political Views"
msgstr "Ideas políticas"
#: ../../Zotlabs/Module/Profiles.php:486
-#: ../../extend/addon/addon/openid/MysqlProvider.php:74
+#: ../../addon/openid/MysqlProvider.php:74
msgid "Gender"
msgstr "Género"
@@ -5614,7 +5717,7 @@ msgstr "Eliminar este perfil"
msgid "Add profile things"
msgstr "Añadir cosas al perfil"
-#: ../../Zotlabs/Module/Profiles.php:736 ../../include/conversation.php:1715
+#: ../../Zotlabs/Module/Profiles.php:736 ../../include/conversation.php:1657
msgid "Personal"
msgstr "Personales"
@@ -5695,7 +5798,7 @@ msgid "Tell us about yourself"
msgstr "Háblenos de usted"
#: ../../Zotlabs/Module/Profiles.php:770
-#: ../../extend/addon/addon/openid/MysqlProvider.php:68
+#: ../../addon/openid/MysqlProvider.php:68
msgid "Homepage URL"
msgstr "Dirección de la página personal"
@@ -5763,1489 +5866,1465 @@ msgstr "Comunicaciones"
msgid "Profile Image"
msgstr "Imagen del perfil"
-#: ../../Zotlabs/Module/Profiles.php:833 ../../include/nav.php:105
-#: ../../include/channel.php:1044
+#: ../../Zotlabs/Module/Profiles.php:833 ../../include/channel.php:1044
+#: ../../include/nav.php:109
msgid "Edit Profiles"
msgstr "Editar perfiles"
-#: ../../Zotlabs/Module/Settings/Features.php:45
-msgid "Additional Features"
-msgstr "Funcionalidades"
+#: ../../Zotlabs/Module/Editwebpage.php:139
+msgid "Page link"
+msgstr "Enlace de la página"
-#: ../../Zotlabs/Module/Settings/Oauth.php:34
-msgid "Name is required"
-msgstr "El nombre es obligatorio"
+#: ../../Zotlabs/Module/Editwebpage.php:166
+msgid "Edit Webpage"
+msgstr "Editar la página web"
-#: ../../Zotlabs/Module/Settings/Oauth.php:38
-msgid "Key and Secret are required"
-msgstr "\"Key\" y \"Secret\" son obligatorios"
+#: ../../Zotlabs/Module/Manage.php:143
+msgid "Create a new channel"
+msgstr "Crear un nuevo canal"
-#: ../../Zotlabs/Module/Settings/Oauth.php:86
-#: ../../Zotlabs/Module/Settings/Oauth.php:112
-#: ../../Zotlabs/Module/Settings/Oauth.php:148
-msgid "Add application"
-msgstr "Añadir aplicación"
+#: ../../Zotlabs/Module/Manage.php:168 ../../Zotlabs/Lib/Apps.php:221
+#: ../../include/nav.php:205
+msgid "Channel Manager"
+msgstr "Administración de canales"
-#: ../../Zotlabs/Module/Settings/Oauth.php:89
-msgid "Name of application"
-msgstr "Nombre de la aplicación"
+#: ../../Zotlabs/Module/Manage.php:169
+msgid "Current Channel"
+msgstr "Canal actual"
-#: ../../Zotlabs/Module/Settings/Oauth.php:90
-#: ../../Zotlabs/Module/Settings/Oauth.php:116
-#: ../../extend/addon/addon/statusnet/statusnet.php:893
-#: ../../extend/addon/addon/twitter/twitter.php:775
-msgid "Consumer Key"
-msgstr "Consumer Key"
+#: ../../Zotlabs/Module/Manage.php:171
+msgid "Switch to one of your channels by selecting it."
+msgstr "Cambiar a uno de sus canales seleccionándolo."
-#: ../../Zotlabs/Module/Settings/Oauth.php:90
-#: ../../Zotlabs/Module/Settings/Oauth.php:91
-msgid "Automatically generated - change if desired. Max length 20"
-msgstr "Generado automáticamente - si lo desea, cámbielo. Longitud máxima: 20"
+#: ../../Zotlabs/Module/Manage.php:172
+msgid "Default Channel"
+msgstr "Canal principal"
-#: ../../Zotlabs/Module/Settings/Oauth.php:91
-#: ../../Zotlabs/Module/Settings/Oauth.php:117
-#: ../../extend/addon/addon/statusnet/statusnet.php:892
-#: ../../extend/addon/addon/twitter/twitter.php:776
-msgid "Consumer Secret"
-msgstr "Consumer Secret"
+#: ../../Zotlabs/Module/Manage.php:173
+msgid "Make Default"
+msgstr "Convertir en predeterminado"
-#: ../../Zotlabs/Module/Settings/Oauth.php:92
-#: ../../Zotlabs/Module/Settings/Oauth.php:118
-msgid "Redirect"
-msgstr "Redirigir"
+#: ../../Zotlabs/Module/Manage.php:176
+#, php-format
+msgid "%d new messages"
+msgstr "%d mensajes nuevos"
-#: ../../Zotlabs/Module/Settings/Oauth.php:92
-msgid ""
-"Redirect URI - leave blank unless your application specifically requires "
-"this"
-msgstr "URI de redirección - dejar en blanco a menos que su aplicación específicamente lo requiera"
+#: ../../Zotlabs/Module/Manage.php:177
+#, php-format
+msgid "%d new introductions"
+msgstr "%d nuevas solicitudes de conexión"
-#: ../../Zotlabs/Module/Settings/Oauth.php:93
-#: ../../Zotlabs/Module/Settings/Oauth.php:119
-msgid "Icon url"
-msgstr "Dirección del icono"
+#: ../../Zotlabs/Module/Manage.php:179
+msgid "Delegated Channel"
+msgstr "Canal delegado"
-#: ../../Zotlabs/Module/Settings/Oauth.php:104
-msgid "Application not found."
-msgstr "Aplicación no encontrada."
+#: ../../Zotlabs/Module/Dirsearch.php:33
+msgid "This directory server requires an access token"
+msgstr "El servidor de este directorio necesita un \"token\" de acceso"
-#: ../../Zotlabs/Module/Settings/Oauth.php:147
-msgid "Connected Apps"
-msgstr "Aplicaciones (apps) conectadas"
+#: ../../Zotlabs/Module/Siteinfo.php:20
+msgid "About this site"
+msgstr "Acerca de este sitio"
-#: ../../Zotlabs/Module/Settings/Oauth.php:151
-msgid "Client key starts with"
-msgstr "La \"client key\" empieza por"
+#: ../../Zotlabs/Module/Siteinfo.php:21
+msgid "Site Name"
+msgstr "Nombre del sitio"
-#: ../../Zotlabs/Module/Settings/Oauth.php:152
-msgid "No name"
-msgstr "Sin nombre"
+#: ../../Zotlabs/Module/Siteinfo.php:25 ../../include/network.php:2025
+msgid "Administrator"
+msgstr "Administrador"
-#: ../../Zotlabs/Module/Settings/Oauth.php:153
-msgid "Remove authorization"
-msgstr "Eliminar autorización"
+#: ../../Zotlabs/Module/Siteinfo.php:27 ../../Zotlabs/Module/Register.php:221
+msgid "Terms of Service"
+msgstr "Términos del servicio"
-#: ../../Zotlabs/Module/Settings/Account.php:20
-msgid "Not valid email."
-msgstr "Correo electrónico no válido."
+#: ../../Zotlabs/Module/Siteinfo.php:28
+msgid "Software and Project information"
+msgstr "Información sobre el software y el proyecto"
-#: ../../Zotlabs/Module/Settings/Account.php:23
-msgid "Protected email address. Cannot change to that email."
-msgstr "Dirección de correo electrónico protegida. No se puede cambiar a ella."
+#: ../../Zotlabs/Module/Siteinfo.php:29
+msgid "This site is powered by $Projectname"
+msgstr "Este sitio funciona con $Projectname"
-#: ../../Zotlabs/Module/Settings/Account.php:32
-msgid "System failure storing new email. Please try again."
-msgstr "Fallo de sistema al guardar el nuevo correo electrónico. Por favor, inténtelo de nuevo."
+#: ../../Zotlabs/Module/Siteinfo.php:30
+msgid ""
+"Federated and decentralised networking and identity services provided by Zot"
+msgstr "Servicios federados y descentralizados de identidad y redes proporcionados por Zot"
-#: ../../Zotlabs/Module/Settings/Account.php:40
-msgid "Technical skill level updated"
-msgstr "Se ha actualizado el nivel de habilidad técnica"
+#: ../../Zotlabs/Module/Siteinfo.php:32
+#, php-format
+msgid "Version %s"
+msgstr "Versión %s"
-#: ../../Zotlabs/Module/Settings/Account.php:56
-msgid "Password verification failed."
-msgstr "La comprobación de la contraseña ha fallado."
+#: ../../Zotlabs/Module/Siteinfo.php:33
+msgid "Project homepage"
+msgstr "Página principal del proyecto"
-#: ../../Zotlabs/Module/Settings/Account.php:63
-msgid "Passwords do not match. Password unchanged."
-msgstr "Las contraseñas no coinciden. La contraseña no se ha cambiado."
+#: ../../Zotlabs/Module/Siteinfo.php:34
+msgid "Developer homepage"
+msgstr "Página principal del desarrollador"
-#: ../../Zotlabs/Module/Settings/Account.php:67
-msgid "Empty passwords are not allowed. Password unchanged."
-msgstr "No se permiten contraseñas vacías. La contraseña no se ha cambiado."
+#: ../../Zotlabs/Module/Ratings.php:70
+msgid "No ratings"
+msgstr "Ninguna valoración"
-#: ../../Zotlabs/Module/Settings/Account.php:81
-msgid "Password changed."
-msgstr "Contraseña cambiada."
+#: ../../Zotlabs/Module/Ratings.php:97 ../../Zotlabs/Module/Pubsites.php:35
+#: ../../include/conversation.php:1032
+msgid "Ratings"
+msgstr "Valoraciones"
-#: ../../Zotlabs/Module/Settings/Account.php:83
-msgid "Password update failed. Please try again."
-msgstr "La actualización de la contraseña ha fallado. Por favor, inténtalo de nuevo."
+#: ../../Zotlabs/Module/Ratings.php:98
+msgid "Rating: "
+msgstr "Valoración:"
-#: ../../Zotlabs/Module/Settings/Account.php:112
-msgid "Account Settings"
-msgstr "Configuración de la cuenta"
+#: ../../Zotlabs/Module/Ratings.php:99
+msgid "Website: "
+msgstr "Sitio web:"
-#: ../../Zotlabs/Module/Settings/Account.php:113
-msgid "Current Password"
-msgstr "Contraseña actual"
+#: ../../Zotlabs/Module/Ratings.php:101
+msgid "Description: "
+msgstr "Descripción:"
-#: ../../Zotlabs/Module/Settings/Account.php:114
-msgid "Enter New Password"
-msgstr "Escribir una nueva contraseña"
+#: ../../Zotlabs/Module/Webpages.php:52
+msgid "Import Webpage Elements"
+msgstr "Importar elementos de una página web"
-#: ../../Zotlabs/Module/Settings/Account.php:115
-msgid "Confirm New Password"
-msgstr "Confirmar la nueva contraseña"
+#: ../../Zotlabs/Module/Webpages.php:53
+msgid "Import selected"
+msgstr "Importar elementos seleccionados"
-#: ../../Zotlabs/Module/Settings/Account.php:115
-msgid "Leave password fields blank unless changing"
-msgstr "Dejar en blanco la contraseña a menos que desee cambiarla."
+#: ../../Zotlabs/Module/Webpages.php:76
+msgid "Export Webpage Elements"
+msgstr "Exportar elementos de una página web"
-#: ../../Zotlabs/Module/Settings/Account.php:116
-msgid "Your technical skill level"
-msgstr "Su nivel de habilidad técnica"
+#: ../../Zotlabs/Module/Webpages.php:77
+msgid "Export selected"
+msgstr "Exportar los elementos seleccionados"
-#: ../../Zotlabs/Module/Settings/Account.php:116
-msgid "Used to provide a member experience matched to your comfort level"
-msgstr "Se utiliza para proporcionar la experiencia de los miembros adaptada a su nivel de comodidad"
+#: ../../Zotlabs/Module/Webpages.php:242 ../../Zotlabs/Lib/Apps.php:225
+#: ../../include/conversation.php:1841 ../../include/nav.php:449
+msgid "Webpages"
+msgstr "Páginas web"
-#: ../../Zotlabs/Module/Settings/Account.php:119
-#: ../../Zotlabs/Module/Settings/Channel.php:483
-msgid "Email Address:"
-msgstr "Dirección de correo electrónico:"
+#: ../../Zotlabs/Module/Webpages.php:253 ../../include/page_widgets.php:44
+msgid "Actions"
+msgstr "Acciones"
-#: ../../Zotlabs/Module/Settings/Account.php:121
-msgid "Remove this account including all its channels"
-msgstr "Eliminar esta cuenta incluyendo todos sus canales"
+#: ../../Zotlabs/Module/Webpages.php:254 ../../include/page_widgets.php:45
+msgid "Page Link"
+msgstr "Vínculo de la página"
-#: ../../Zotlabs/Module/Settings/Channel.php:251
-#: ../../extend/addon/addon/logrot/logrot.php:54
-#: ../../extend/addon/addon/msgfooter/msgfooter.php:54
-#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:184
-#: ../../extend/addon/addon/piwik/piwik.php:116
-#: ../../extend/addon/addon/twitter/twitter.php:766
-#: ../../extend/addon/addon/xmpp/xmpp.php:102
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:82
-msgid "Settings updated."
-msgstr "Ajustes actualizados."
+#: ../../Zotlabs/Module/Webpages.php:255
+msgid "Page Title"
+msgstr "Título de página"
-#: ../../Zotlabs/Module/Settings/Channel.php:312
-msgid "Nobody except yourself"
-msgstr "Nadie excepto usted"
+#: ../../Zotlabs/Module/Webpages.php:285
+msgid "Invalid file type."
+msgstr "Tipo de fichero no válido."
-#: ../../Zotlabs/Module/Settings/Channel.php:313
-msgid "Only those you specifically allow"
-msgstr "Solo aquellos a los que usted permita explícitamente"
+#: ../../Zotlabs/Module/Webpages.php:297
+msgid "Error opening zip file"
+msgstr "Error al abrir el fichero comprimido zip"
-#: ../../Zotlabs/Module/Settings/Channel.php:314
-msgid "Approved connections"
-msgstr "Conexiones aprobadas"
+#: ../../Zotlabs/Module/Webpages.php:308
+msgid "Invalid folder path."
+msgstr "La ruta de la carpeta no es válida."
-#: ../../Zotlabs/Module/Settings/Channel.php:315
-msgid "Any connections"
-msgstr "Cualquier conexión"
+#: ../../Zotlabs/Module/Webpages.php:335
+msgid "No webpage elements detected."
+msgstr "No se han detectado elementos de ninguna página web."
-#: ../../Zotlabs/Module/Settings/Channel.php:316
-msgid "Anybody on this website"
-msgstr "Cualquiera en este sitio web"
+#: ../../Zotlabs/Module/Webpages.php:410
+msgid "Import complete."
+msgstr "Importación completada."
-#: ../../Zotlabs/Module/Settings/Channel.php:317
-msgid "Anybody in this network"
-msgstr "Cualquiera en esta red"
+#: ../../Zotlabs/Module/Editpost.php:38
+msgid "Item is not editable"
+msgstr "El elemento no es editable"
-#: ../../Zotlabs/Module/Settings/Channel.php:318
-msgid "Anybody authenticated"
-msgstr "Cualquiera que esté autenticado"
+#: ../../Zotlabs/Module/Editpost.php:103 ../../Zotlabs/Module/Rpost.php:138
+msgid "Edit post"
+msgstr "Editar la entrada"
-#: ../../Zotlabs/Module/Settings/Channel.php:319
-msgid "Anybody on the internet"
-msgstr "Cualquiera en internet"
+#: ../../Zotlabs/Module/Dreport.php:45
+msgid "Invalid message"
+msgstr "Mensaje no válido"
-#: ../../Zotlabs/Module/Settings/Channel.php:395
-msgid "Publish your default profile in the network directory"
-msgstr "Publicar su perfil principal en el directorio de la red"
+#: ../../Zotlabs/Module/Dreport.php:78
+msgid "no results"
+msgstr "sin resultados"
-#: ../../Zotlabs/Module/Settings/Channel.php:400
-msgid "Allow us to suggest you as a potential friend to new members?"
-msgstr "¿Nos permite sugerirle como amigo potencial a los nuevos miembros?"
+#: ../../Zotlabs/Module/Dreport.php:93
+msgid "channel sync processed"
+msgstr "se ha realizado la sincronización del canal"
-#: ../../Zotlabs/Module/Settings/Channel.php:409
-msgid "Your channel address is"
-msgstr "Su dirección de canal es"
+#: ../../Zotlabs/Module/Dreport.php:97
+msgid "queued"
+msgstr "encolado"
-#: ../../Zotlabs/Module/Settings/Channel.php:412
-msgid "Your files/photos are accessible via WebDAV at"
-msgstr "Sus archivos y fotos son accesibles a través de WebDAV en "
+#: ../../Zotlabs/Module/Dreport.php:101
+msgid "posted"
+msgstr "enviado"
-#: ../../Zotlabs/Module/Settings/Channel.php:474
-msgid "Channel Settings"
-msgstr "Ajustes del canal"
+#: ../../Zotlabs/Module/Dreport.php:105
+msgid "accepted for delivery"
+msgstr "aceptado para el envío"
-#: ../../Zotlabs/Module/Settings/Channel.php:481
-msgid "Basic Settings"
-msgstr "Configuración básica"
+#: ../../Zotlabs/Module/Dreport.php:109
+msgid "updated"
+msgstr "actualizado"
-#: ../../Zotlabs/Module/Settings/Channel.php:482
-#: ../../include/channel.php:1255
-msgid "Full Name:"
-msgstr "Nombre completo:"
+#: ../../Zotlabs/Module/Dreport.php:112
+msgid "update ignored"
+msgstr "actualización ignorada"
-#: ../../Zotlabs/Module/Settings/Channel.php:484
-msgid "Your Timezone:"
-msgstr "Su huso horario:"
+#: ../../Zotlabs/Module/Dreport.php:115
+msgid "permission denied"
+msgstr "permiso denegado"
-#: ../../Zotlabs/Module/Settings/Channel.php:485
-msgid "Default Post Location:"
-msgstr "Localización geográfica predeterminada para sus publicaciones:"
+#: ../../Zotlabs/Module/Dreport.php:119
+msgid "recipient not found"
+msgstr "destinatario no encontrado"
-#: ../../Zotlabs/Module/Settings/Channel.php:485
-msgid "Geographical location to display on your posts"
-msgstr "Localización geográfica que debe mostrarse en sus publicaciones"
+#: ../../Zotlabs/Module/Dreport.php:122
+msgid "mail recalled"
+msgstr "mensaje de correo revocado"
-#: ../../Zotlabs/Module/Settings/Channel.php:486
-msgid "Use Browser Location:"
-msgstr "Usar la localización geográfica del navegador:"
+#: ../../Zotlabs/Module/Dreport.php:125
+msgid "duplicate mail received"
+msgstr "se ha recibido mensaje duplicado"
-#: ../../Zotlabs/Module/Settings/Channel.php:488
-msgid "Adult Content"
-msgstr "Contenido solo para adultos"
+#: ../../Zotlabs/Module/Dreport.php:128
+msgid "mail delivered"
+msgstr "correo enviado"
-#: ../../Zotlabs/Module/Settings/Channel.php:488
-msgid ""
-"This channel frequently or regularly publishes adult content. (Please tag "
-"any adult material and/or nudity with #NSFW)"
-msgstr "Este canal publica contenido solo para adultos con frecuencia o regularmente. (Por favor etiquete cualquier material para adultos con la etiqueta #NSFW)"
+#: ../../Zotlabs/Module/Dreport.php:148
+#, php-format
+msgid "Delivery report for %1$s"
+msgstr "Informe de entrega para %1$s"
-#: ../../Zotlabs/Module/Settings/Channel.php:490
-msgid "Security and Privacy Settings"
-msgstr "Configuración de seguridad y privacidad"
+#: ../../Zotlabs/Module/Dreport.php:151
+msgid "Options"
+msgstr "Opciones"
-#: ../../Zotlabs/Module/Settings/Channel.php:493
-msgid "Your permissions are already configured. Click to view/adjust"
-msgstr "Sus permisos ya están configurados. Pulse para ver/ajustar"
+#: ../../Zotlabs/Module/Dreport.php:152
+msgid "Redeliver"
+msgstr "Volver a enviar"
-#: ../../Zotlabs/Module/Settings/Channel.php:495
-msgid "Hide my online presence"
-msgstr "Ocultar mi presencia en línea"
+#: ../../Zotlabs/Module/Sources.php:37
+msgid "Failed to create source. No channel selected."
+msgstr "No se ha podido crear el origen de los contenidos. No ha sido seleccionado ningún canal."
-#: ../../Zotlabs/Module/Settings/Channel.php:495
-msgid "Prevents displaying in your profile that you are online"
-msgstr "Evitar mostrar en su perfil que está en línea"
+#: ../../Zotlabs/Module/Sources.php:51
+msgid "Source created."
+msgstr "Fuente creada."
-#: ../../Zotlabs/Module/Settings/Channel.php:497
-msgid "Simple Privacy Settings:"
-msgstr "Configuración de privacidad sencilla:"
+#: ../../Zotlabs/Module/Sources.php:64
+msgid "Source updated."
+msgstr "Fuente actualizada."
-#: ../../Zotlabs/Module/Settings/Channel.php:498
-msgid ""
-"Very Public - <em>extremely permissive (should be used with caution)</em>"
-msgstr "Muy Público - <em>extremadamente permisivo (debería ser usado con precaución)</em>"
+#: ../../Zotlabs/Module/Sources.php:90
+msgid "*"
+msgstr "*"
-#: ../../Zotlabs/Module/Settings/Channel.php:499
+#: ../../Zotlabs/Module/Sources.php:96
+#: ../../Zotlabs/Widget/Settings_menu.php:123 ../../include/features.php:213
+msgid "Channel Sources"
+msgstr "Orígenes de los contenidos del canal"
+
+#: ../../Zotlabs/Module/Sources.php:97
+msgid "Manage remote sources of content for your channel."
+msgstr "Gestionar contenido de origen remoto para su canal."
+
+#: ../../Zotlabs/Module/Sources.php:98 ../../Zotlabs/Module/Sources.php:108
+msgid "New Source"
+msgstr "Nueva fuente"
+
+#: ../../Zotlabs/Module/Sources.php:109 ../../Zotlabs/Module/Sources.php:143
msgid ""
-"Typical - <em>default public, privacy when desired (similar to social "
-"network permissions but with improved privacy)</em>"
-msgstr "Típico - <em>por defecto público, privado cuando se desee (similar a los permisos de una red social pero con privacidad mejorada)</em>"
+"Import all or selected content from the following channel into this channel "
+"and distribute it according to your channel settings."
+msgstr "Importar todo el contenido o una selección de los siguientes canales en este canal y distribuirlo de acuerdo con sus ajustes."
-#: ../../Zotlabs/Module/Settings/Channel.php:500
-msgid "Private - <em>default private, never open or public</em>"
-msgstr "Privado - <em>por defecto, privado, nunca abierto o público</em>"
+#: ../../Zotlabs/Module/Sources.php:110 ../../Zotlabs/Module/Sources.php:144
+msgid "Only import content with these words (one per line)"
+msgstr "Importar solo contenido que contenga estas palabras (una por línea)"
-#: ../../Zotlabs/Module/Settings/Channel.php:501
-msgid "Blocked - <em>default blocked to/from everybody</em>"
-msgstr "Bloqueado - <em>por defecto, bloqueado/a para cualquiera</em>"
+#: ../../Zotlabs/Module/Sources.php:110 ../../Zotlabs/Module/Sources.php:144
+msgid "Leave blank to import all public content"
+msgstr "Dejar en blanco para importar todo el contenido público"
-#: ../../Zotlabs/Module/Settings/Channel.php:503
-msgid "Allow others to tag your posts"
-msgstr "Permitir a otros etiquetar sus publicaciones"
+#: ../../Zotlabs/Module/Sources.php:111 ../../Zotlabs/Module/Sources.php:148
+msgid "Channel Name"
+msgstr "Nombre del canal"
-#: ../../Zotlabs/Module/Settings/Channel.php:503
+#: ../../Zotlabs/Module/Sources.php:112 ../../Zotlabs/Module/Sources.php:147
msgid ""
-"Often used by the community to retro-actively flag inappropriate content"
-msgstr "A menudo usado por la comunidad para marcar contenido inapropiado de forma retroactiva."
+"Add the following categories to posts imported from this source (comma "
+"separated)"
+msgstr "Añadir los temas siguientes a las entradas importadas de esta fuente (separadas por comas)"
-#: ../../Zotlabs/Module/Settings/Channel.php:505
-msgid "Channel Permission Limits"
-msgstr "Límites de los permisos del canal"
+#: ../../Zotlabs/Module/Sources.php:133 ../../Zotlabs/Module/Sources.php:161
+msgid "Source not found."
+msgstr "Fuente no encontrada"
-#: ../../Zotlabs/Module/Settings/Channel.php:507
-msgid "Expire other channel content after this many days"
-msgstr "Caducar contenido de otros canales después de este número de días"
+#: ../../Zotlabs/Module/Sources.php:140
+msgid "Edit Source"
+msgstr "Editar fuente"
-#: ../../Zotlabs/Module/Settings/Channel.php:507
-msgid "0 or blank to use the website limit."
-msgstr "0 o en blanco para usar el límite del sitio web."
+#: ../../Zotlabs/Module/Sources.php:141
+msgid "Delete Source"
+msgstr "Eliminar fuente"
-#: ../../Zotlabs/Module/Settings/Channel.php:507
-#, php-format
-msgid "This website expires after %d days."
-msgstr "Este sitio web caduca después de %d días."
+#: ../../Zotlabs/Module/Sources.php:169
+msgid "Source removed"
+msgstr "Fuente eliminada"
-#: ../../Zotlabs/Module/Settings/Channel.php:507
-msgid "This website does not expire imported content."
-msgstr "Este sitio web no caduca el contenido importado."
+#: ../../Zotlabs/Module/Sources.php:171
+msgid "Unable to remove source."
+msgstr "No se puede eliminar la fuente."
-#: ../../Zotlabs/Module/Settings/Channel.php:507
-msgid "The website limit takes precedence if lower than your limit."
-msgstr "El límite del sitio web tiene prioridad si es inferior a su propio límite."
+#: ../../Zotlabs/Module/Like.php:19
+msgid "Like/Dislike"
+msgstr "Me gusta/No me gusta"
-#: ../../Zotlabs/Module/Settings/Channel.php:508
-msgid "Maximum Friend Requests/Day:"
-msgstr "Máximo de solicitudes de amistad por día:"
+#: ../../Zotlabs/Module/Like.php:24
+msgid "This action is restricted to members."
+msgstr "Esta acción está restringida solo para miembros."
-#: ../../Zotlabs/Module/Settings/Channel.php:508
-msgid "May reduce spam activity"
-msgstr "Podría reducir la actividad de spam"
+#: ../../Zotlabs/Module/Like.php:25
+msgid ""
+"Please <a href=\"rmagic\">login with your $Projectname ID</a> or <a "
+"href=\"register\">register as a new $Projectname member</a> to continue."
+msgstr "Por favor, <a href=\"rmagic\">identifíquese con su $Projectname ID</a> o <a href=\"register\">rregístrese como un nuevo $Projectname member</a> para continuar."
-#: ../../Zotlabs/Module/Settings/Channel.php:509
-msgid "Default Access Control List (ACL)"
-msgstr "Lista de control de acceso (ACL) por defecto"
+#: ../../Zotlabs/Module/Like.php:105 ../../Zotlabs/Module/Like.php:131
+#: ../../Zotlabs/Module/Like.php:169
+msgid "Invalid request."
+msgstr "Solicitud incorrecta."
-#: ../../Zotlabs/Module/Settings/Channel.php:511
-msgid "Use my default audience setting for the type of object published"
-msgstr "Usar los ajustes de mi audiencia predeterminada para el tipo de publicación"
+#: ../../Zotlabs/Module/Like.php:117 ../../include/conversation.php:122
+msgid "channel"
+msgstr "el canal"
-#: ../../Zotlabs/Module/Settings/Channel.php:518
-msgid "Channel permissions category:"
-msgstr "Categoría de los permisos del canal:"
+#: ../../Zotlabs/Module/Like.php:146
+msgid "thing"
+msgstr "elemento"
-#: ../../Zotlabs/Module/Settings/Channel.php:519
-msgid "Default Permissions Group"
-msgstr "Grupo de permisos predeterminado"
+#: ../../Zotlabs/Module/Like.php:192
+msgid "Channel unavailable."
+msgstr "Canal no disponible."
-#: ../../Zotlabs/Module/Settings/Channel.php:525
-msgid "Maximum private messages per day from unknown people:"
-msgstr "Máximo de mensajes privados por día de gente desconocida:"
+#: ../../Zotlabs/Module/Like.php:240
+msgid "Previous action reversed."
+msgstr "Acción anterior revocada."
-#: ../../Zotlabs/Module/Settings/Channel.php:525
-msgid "Useful to reduce spamming"
-msgstr "Útil para reducir el envío de correo no deseado"
+#: ../../Zotlabs/Module/Like.php:419 ../../addon/diaspora/inbound.php:1812
+#: ../../include/conversation.php:160
+#, php-format
+msgid "%1$s likes %2$s's %3$s"
+msgstr "A %1$s le gusta %3$s de %2$s"
-#: ../../Zotlabs/Module/Settings/Channel.php:528
-msgid "Notification Settings"
-msgstr "Configuración de las notificaciones"
+#: ../../Zotlabs/Module/Like.php:421 ../../include/conversation.php:163
+#, php-format
+msgid "%1$s doesn't like %2$s's %3$s"
+msgstr "A %1$s no le gusta %3$s de %2$s"
-#: ../../Zotlabs/Module/Settings/Channel.php:529
-msgid "By default post a status message when:"
-msgstr "Por defecto, enviar un mensaje de estado cuando:"
+#: ../../Zotlabs/Module/Like.php:423
+#, php-format
+msgid "%1$s agrees with %2$s's %3$s"
+msgstr "%3$s de %2$s: %1$s está de acuerdo"
-#: ../../Zotlabs/Module/Settings/Channel.php:530
-msgid "accepting a friend request"
-msgstr "Acepte una solicitud de amistad"
+#: ../../Zotlabs/Module/Like.php:425
+#, php-format
+msgid "%1$s doesn't agree with %2$s's %3$s"
+msgstr "%3$s de %2$s: %1$s no está de acuerdo"
-#: ../../Zotlabs/Module/Settings/Channel.php:531
-msgid "joining a forum/community"
-msgstr "al unirse a un foro o comunidad"
+#: ../../Zotlabs/Module/Like.php:427
+#, php-format
+msgid "%1$s abstains from a decision on %2$s's %3$s"
+msgstr "%3$s de %2$s: %1$s se abstiene"
-#: ../../Zotlabs/Module/Settings/Channel.php:532
-msgid "making an <em>interesting</em> profile change"
-msgstr "Realice un cambio <em>interesante</em> en su perfil"
+#: ../../Zotlabs/Module/Like.php:429
+#, php-format
+msgid "%1$s is attending %2$s's %3$s"
+msgstr "%3$s de %2$s: %1$s participa"
-#: ../../Zotlabs/Module/Settings/Channel.php:533
-msgid "Send a notification email when:"
-msgstr "Enviar una notificación por correo electrónico cuando:"
+#: ../../Zotlabs/Module/Like.php:431
+#, php-format
+msgid "%1$s is not attending %2$s's %3$s"
+msgstr "%3$s de %2$s: %1$s no participa"
-#: ../../Zotlabs/Module/Settings/Channel.php:534
-msgid "You receive a connection request"
-msgstr "Reciba una solicitud de conexión"
+#: ../../Zotlabs/Module/Like.php:433
+#, php-format
+msgid "%1$s may attend %2$s's %3$s"
+msgstr "%3$s de %2$s: %1$s quizá participe"
-#: ../../Zotlabs/Module/Settings/Channel.php:535
-msgid "Your connections are confirmed"
-msgstr "Sus conexiones hayan sido confirmadas"
+#: ../../Zotlabs/Module/Like.php:538
+msgid "Action completed."
+msgstr "Acción completada."
-#: ../../Zotlabs/Module/Settings/Channel.php:536
-msgid "Someone writes on your profile wall"
-msgstr "Alguien escriba en la página de su perfil (\"muro\")"
+#: ../../Zotlabs/Module/Like.php:539
+msgid "Thank you."
+msgstr "Gracias."
-#: ../../Zotlabs/Module/Settings/Channel.php:537
-msgid "Someone writes a followup comment"
-msgstr "Alguien escriba un comentario sobre sus publicaciones"
+#: ../../Zotlabs/Module/Directory.php:245
+#, php-format
+msgid "%d rating"
+msgid_plural "%d ratings"
+msgstr[0] "%d valoración"
+msgstr[1] "%d valoraciones"
-#: ../../Zotlabs/Module/Settings/Channel.php:538
-msgid "You receive a private message"
-msgstr "Reciba un mensaje privado"
+#: ../../Zotlabs/Module/Directory.php:256
+msgid "Gender: "
+msgstr "Género:"
-#: ../../Zotlabs/Module/Settings/Channel.php:539
-msgid "You receive a friend suggestion"
-msgstr "Reciba una sugerencia de amistad"
+#: ../../Zotlabs/Module/Directory.php:258
+msgid "Status: "
+msgstr "Estado:"
-#: ../../Zotlabs/Module/Settings/Channel.php:540
-msgid "You are tagged in a post"
-msgstr "Usted sea etiquetado en una publicación"
+#: ../../Zotlabs/Module/Directory.php:260
+msgid "Homepage: "
+msgstr "Página personal:"
-#: ../../Zotlabs/Module/Settings/Channel.php:541
-msgid "You are poked/prodded/etc. in a post"
-msgstr "Reciba un toque o incitación en una publicación"
+#: ../../Zotlabs/Module/Directory.php:309 ../../include/channel.php:1293
+msgid "Age:"
+msgstr "Edad:"
-#: ../../Zotlabs/Module/Settings/Channel.php:543
-msgid "Someone likes your post/comment"
-msgstr "Alguien muestre agrado por su entrada o comentario"
+#: ../../Zotlabs/Module/Directory.php:314 ../../include/markdown.php:560
+#: ../../include/channel.php:1134 ../../include/event.php:52
+#: ../../include/event.php:84
+msgid "Location:"
+msgstr "Ubicación:"
-#: ../../Zotlabs/Module/Settings/Channel.php:546
-msgid "Show visual notifications including:"
-msgstr "Mostrar notificaciones visuales que incluyan:"
+#: ../../Zotlabs/Module/Directory.php:320
+msgid "Description:"
+msgstr "Descripción:"
-#: ../../Zotlabs/Module/Settings/Channel.php:548
-msgid "Unseen grid activity"
-msgstr "Nueva actividad en la red"
+#: ../../Zotlabs/Module/Directory.php:325 ../../include/channel.php:1309
+msgid "Hometown:"
+msgstr "Lugar de nacimiento:"
-#: ../../Zotlabs/Module/Settings/Channel.php:549
-msgid "Unseen channel activity"
-msgstr "Actividad no vista en el canal"
+#: ../../Zotlabs/Module/Directory.php:327 ../../include/channel.php:1317
+msgid "About:"
+msgstr "Sobre mí:"
-#: ../../Zotlabs/Module/Settings/Channel.php:550
-msgid "Unseen private messages"
-msgstr "Mensajes privados no leídos"
+#: ../../Zotlabs/Module/Directory.php:328 ../../Zotlabs/Module/Suggest.php:54
+#: ../../Zotlabs/Widget/Follow.php:32 ../../Zotlabs/Widget/Suggestions.php:44
+#: ../../include/conversation.php:1002 ../../include/channel.php:1119
+#: ../../include/connections.php:110
+msgid "Connect"
+msgstr "Conectar"
-#: ../../Zotlabs/Module/Settings/Channel.php:550
-#: ../../Zotlabs/Module/Settings/Channel.php:555
-#: ../../Zotlabs/Module/Settings/Channel.php:556
-#: ../../Zotlabs/Module/Settings/Channel.php:557
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:343
-msgid "Recommended"
-msgstr "Recomendado"
+#: ../../Zotlabs/Module/Directory.php:329
+msgid "Public Forum:"
+msgstr "Foro público:"
-#: ../../Zotlabs/Module/Settings/Channel.php:551
-msgid "Upcoming events"
-msgstr "Próximos eventos"
+#: ../../Zotlabs/Module/Directory.php:332
+msgid "Keywords: "
+msgstr "Palabras clave:"
-#: ../../Zotlabs/Module/Settings/Channel.php:552
-msgid "Events today"
-msgstr "Eventos de hoy"
+#: ../../Zotlabs/Module/Directory.php:335
+msgid "Don't suggest"
+msgstr "No sugerir:"
-#: ../../Zotlabs/Module/Settings/Channel.php:553
-msgid "Upcoming birthdays"
-msgstr "Próximos cumpleaños"
+#: ../../Zotlabs/Module/Directory.php:337
+msgid "Common connections:"
+msgstr "Conexiones comunes:"
-#: ../../Zotlabs/Module/Settings/Channel.php:553
-msgid "Not available in all themes"
-msgstr "No disponible en todos los temas"
+#: ../../Zotlabs/Module/Directory.php:386
+msgid "Global Directory"
+msgstr "Directorio global:"
-#: ../../Zotlabs/Module/Settings/Channel.php:554
-msgid "System (personal) notifications"
-msgstr "Notificaciones del sistema (personales)"
+#: ../../Zotlabs/Module/Directory.php:386
+msgid "Local Directory"
+msgstr "Directorio local:"
-#: ../../Zotlabs/Module/Settings/Channel.php:555
-msgid "System info messages"
-msgstr "Mensajes de información del sistema"
+#: ../../Zotlabs/Module/Directory.php:392
+msgid "Finding:"
+msgstr "Encontrar:"
-#: ../../Zotlabs/Module/Settings/Channel.php:556
-msgid "System critical alerts"
-msgstr "Alertas críticas del sistema"
+#: ../../Zotlabs/Module/Directory.php:395 ../../Zotlabs/Module/Suggest.php:62
+#: ../../include/contact_widgets.php:24
+msgid "Channel Suggestions"
+msgstr "Sugerencias de canales"
-#: ../../Zotlabs/Module/Settings/Channel.php:557
-msgid "New connections"
-msgstr "Nuevas conexiones"
+#: ../../Zotlabs/Module/Directory.php:397
+msgid "next page"
+msgstr "siguiente página"
-#: ../../Zotlabs/Module/Settings/Channel.php:558
-msgid "System Registrations"
-msgstr "Registros del sistema"
+#: ../../Zotlabs/Module/Directory.php:397
+msgid "previous page"
+msgstr "página anterior"
-#: ../../Zotlabs/Module/Settings/Channel.php:559
-msgid ""
-"Also show new wall posts, private messages and connections under Notices"
-msgstr "Mostrar también en Avisos las nuevas publicaciones, los mensajes privados y las conexiones"
+#: ../../Zotlabs/Module/Directory.php:398
+msgid "Sort options"
+msgstr "Ordenar opciones"
-#: ../../Zotlabs/Module/Settings/Channel.php:561
-msgid "Notify me of events this many days in advance"
-msgstr "Avisarme de los eventos con algunos días de antelación"
+#: ../../Zotlabs/Module/Directory.php:399
+msgid "Alphabetic"
+msgstr "Alfabético"
-#: ../../Zotlabs/Module/Settings/Channel.php:561
-msgid "Must be greater than 0"
-msgstr "Debe ser mayor que 0"
+#: ../../Zotlabs/Module/Directory.php:400
+msgid "Reverse Alphabetic"
+msgstr "Alfabético inverso"
-#: ../../Zotlabs/Module/Settings/Channel.php:567
-msgid "Advanced Account/Page Type Settings"
-msgstr "Ajustes avanzados de la cuenta y de los tipos de página"
+#: ../../Zotlabs/Module/Directory.php:401
+msgid "Newest to Oldest"
+msgstr "De más nuevo a más antiguo"
-#: ../../Zotlabs/Module/Settings/Channel.php:568
-msgid "Change the behaviour of this account for special situations"
-msgstr "Cambiar el comportamiento de esta cuenta en situaciones especiales"
+#: ../../Zotlabs/Module/Directory.php:402
+msgid "Oldest to Newest"
+msgstr "De más antiguo a más nuevo"
-#: ../../Zotlabs/Module/Settings/Channel.php:570
-msgid "Miscellaneous Settings"
-msgstr "Ajustes diversos"
+#: ../../Zotlabs/Module/Directory.php:419
+msgid "No entries (some entries may be hidden)."
+msgstr "Sin entradas (algunas entradas pueden estar ocultas)."
-#: ../../Zotlabs/Module/Settings/Channel.php:571
-msgid "Default photo upload folder"
-msgstr "Carpeta por defecto de las fotos subidas"
+#: ../../Zotlabs/Module/Xchan.php:10
+msgid "Xchan Lookup"
+msgstr "Búsqueda de canales"
-#: ../../Zotlabs/Module/Settings/Channel.php:571
-#: ../../Zotlabs/Module/Settings/Channel.php:572
-msgid "%Y - current year, %m - current month"
-msgstr "%Y - año en curso, %m - mes actual"
+#: ../../Zotlabs/Module/Xchan.php:13
+msgid "Lookup xchan beginning with (or webbie): "
+msgstr "Buscar un canal (o un \"webbie\") que comience por:"
-#: ../../Zotlabs/Module/Settings/Channel.php:572
-msgid "Default file upload folder"
-msgstr "Carpeta por defecto de los ficheros subidos"
+#: ../../Zotlabs/Module/Suggest.php:37
+msgid ""
+"No suggestions available. If this is a new site, please try again in 24 "
+"hours."
+msgstr "No hay sugerencias disponibles. Si es un sitio nuevo, espere 24 horas y pruebe de nuevo."
-#: ../../Zotlabs/Module/Settings/Channel.php:574
-msgid "Personal menu to display in your channel pages"
-msgstr "Menú personal que debe mostrarse en las páginas de su canal"
+#: ../../Zotlabs/Module/Suggest.php:56 ../../Zotlabs/Widget/Suggestions.php:46
+msgid "Ignore/Hide"
+msgstr "Ignorar/Ocultar"
-#: ../../Zotlabs/Module/Settings/Channel.php:576
-msgid "Remove this channel."
-msgstr "Eliminar este canal."
+#: ../../Zotlabs/Module/Oexchange.php:27
+msgid "Unable to find your hub."
+msgstr "No se puede encontrar su servidor."
-#: ../../Zotlabs/Module/Settings/Channel.php:577
-msgid "Firefox Share $Projectname provider"
-msgstr "Servicio de compartición de Firefox: proveedor $Projectname"
+#: ../../Zotlabs/Module/Oexchange.php:41
+msgid "Post successful."
+msgstr "Enviado con éxito."
-#: ../../Zotlabs/Module/Settings/Channel.php:578
-msgid "Start calendar week on monday"
-msgstr "Comenzar el calendario semanal por el lunes"
+#: ../../Zotlabs/Module/Mail.php:65
+msgid "Unable to lookup recipient."
+msgstr "No se puede asociar a un destinatario."
-#: ../../Zotlabs/Module/Settings/Featured.php:20
-msgid "Affinity Slider settings updated."
-msgstr "Se han actualizado los ajustes del controlador de afinidad."
+#: ../../Zotlabs/Module/Mail.php:72
+msgid "Unable to communicate with requested channel."
+msgstr "No se puede establecer la comunicación con el canal solicitado."
-#: ../../Zotlabs/Module/Settings/Featured.php:34
-msgid "No feature settings configured"
-msgstr "No se ha establecido la configuración de los complementos"
+#: ../../Zotlabs/Module/Mail.php:79
+msgid "Cannot verify requested channel."
+msgstr "No se puede verificar el canal solicitado."
-#: ../../Zotlabs/Module/Settings/Featured.php:41
-msgid "Default maximum affinity level"
-msgstr "Nivel máximo de afinidad por defecto"
+#: ../../Zotlabs/Module/Mail.php:97
+msgid "Selected channel has private message restrictions. Send failed."
+msgstr "El canal seleccionado tiene restricciones sobre los mensajes privados. El envío falló."
-#: ../../Zotlabs/Module/Settings/Featured.php:46
-msgid "Default minimum affinity level"
-msgstr "Nivel mínimo de afinidad por defecto"
+#: ../../Zotlabs/Module/Mail.php:178
+msgid "Messages"
+msgstr "Mensajes"
-#: ../../Zotlabs/Module/Settings/Featured.php:50
-msgid "Affinity Slider Settings"
-msgstr "Ajustes del controlador de afinidad"
+#: ../../Zotlabs/Module/Mail.php:191
+msgid "message"
+msgstr "mensaje"
-#: ../../Zotlabs/Module/Settings/Featured.php:60
-msgid "Feature/Addon Settings"
-msgstr "Ajustes de los complementos"
+#: ../../Zotlabs/Module/Mail.php:232
+msgid "Message recalled."
+msgstr "Mensaje revocado."
-#: ../../Zotlabs/Module/Settings/Permcats.php:37
-msgid "Permission category saved."
-msgstr "Se ha guardado la categoría del permiso."
+#: ../../Zotlabs/Module/Mail.php:245
+msgid "Conversation removed."
+msgstr "Conversación eliminada."
-#: ../../Zotlabs/Module/Settings/Permcats.php:63
-msgid ""
-"Use this form to create permission rules for various classes of people or "
-"connections."
-msgstr "Utilice este formulario para crear reglas de permiso para varias clases de personas o conexiones."
+#: ../../Zotlabs/Module/Mail.php:260 ../../Zotlabs/Module/Mail.php:381
+msgid "Expires YYYY-MM-DD HH:MM"
+msgstr "Caduca YYYY-MM-DD HH:MM"
-#: ../../Zotlabs/Module/Settings/Permcats.php:96
-msgid "Permission Categories"
-msgstr "Categorías de autorización"
+#: ../../Zotlabs/Module/Mail.php:288
+msgid "Requested channel is not in this network"
+msgstr "El canal solicitado no existe en esta red"
-#: ../../Zotlabs/Module/Settings/Permcats.php:104
-msgid "Permission Name"
-msgstr "Nombre de la autorización"
+#: ../../Zotlabs/Module/Mail.php:296
+msgid "Send Private Message"
+msgstr "Enviar un mensaje privado"
-#: ../../Zotlabs/Module/Settings/Tokens.php:31
-#, php-format
-msgid "This channel is limited to %d tokens"
-msgstr "Este canal tiene un límite de %d tokens"
+#: ../../Zotlabs/Module/Mail.php:297 ../../Zotlabs/Module/Mail.php:439
+msgid "To:"
+msgstr "Para:"
-#: ../../Zotlabs/Module/Settings/Tokens.php:37
-msgid "Name and Password are required."
-msgstr "Se requiere el nombre y la contraseña."
+#: ../../Zotlabs/Module/Mail.php:300 ../../Zotlabs/Module/Mail.php:441
+msgid "Subject:"
+msgstr "Asunto:"
-#: ../../Zotlabs/Module/Settings/Tokens.php:77
-msgid "Token saved."
-msgstr "Token salvado."
+#: ../../Zotlabs/Module/Mail.php:305 ../../Zotlabs/Module/Mail.php:447
+#: ../../include/conversation.php:1323
+msgid "Attach file"
+msgstr "Adjuntar fichero"
-#: ../../Zotlabs/Module/Settings/Tokens.php:113
-msgid ""
-"Use this form to create temporary access identifiers to share things with "
-"non-members. These identities may be used in Access Control Lists and "
-"visitors may login using these credentials to access private content."
-msgstr "Utilice este formulario para crear identificadores de acceso temporal para compartir cosas con los no miembros de Hubzilla. Estas identidades se pueden usar en las Listas de control de acceso (ACL) y así los visitantes pueden iniciar sesión, utilizando estas credenciales, para acceder a su contenido privado."
+#: ../../Zotlabs/Module/Mail.php:307
+msgid "Send"
+msgstr "Enviar"
-#: ../../Zotlabs/Module/Settings/Tokens.php:115
-msgid ""
-"You may also provide <em>dropbox</em> style access links to friends and "
-"associates by adding the Login Password to any specific site URL as shown. "
-"Examples:"
-msgstr "También puede proporcionar, con el estilo <em>dropbox</em>, enlaces de acceso a sus amigos y asociados añadiendo la contraseña de inicio de sesión a cualquier dirección URL, como se muestra. Ejemplos: "
+#: ../../Zotlabs/Module/Mail.php:310 ../../Zotlabs/Module/Mail.php:452
+#: ../../include/conversation.php:1368
+msgid "Set expiration date"
+msgstr "Configurar fecha de caducidad"
-#: ../../Zotlabs/Module/Settings/Tokens.php:150 ../../include/widgets.php:644
-msgid "Guest Access Tokens"
-msgstr "Tokens de acceso para invitados"
+#: ../../Zotlabs/Module/Mail.php:411
+msgid "Delete message"
+msgstr "Borrar mensaje"
-#: ../../Zotlabs/Module/Settings/Tokens.php:157
-msgid "Login Name"
-msgstr "Nombre de inicio de sesión"
+#: ../../Zotlabs/Module/Mail.php:412
+msgid "Delivery report"
+msgstr "Informe de transmisión"
-#: ../../Zotlabs/Module/Settings/Tokens.php:158
-msgid "Login Password"
-msgstr "Contraseña de inicio de sesión"
+#: ../../Zotlabs/Module/Mail.php:413
+msgid "Recall message"
+msgstr "Revocar el mensaje"
-#: ../../Zotlabs/Module/Settings/Tokens.php:159
-msgid "Expires (yyyy-mm-dd)"
-msgstr "Expira (aaaa-mm-dd)"
+#: ../../Zotlabs/Module/Mail.php:415
+msgid "Message has been recalled."
+msgstr "El mensaje ha sido revocado."
-#: ../../Zotlabs/Module/Settings/Display.php:145
-msgid "No special theme for mobile devices"
-msgstr "Sin tema especial para dispositivos móviles"
+#: ../../Zotlabs/Module/Mail.php:432
+msgid "Delete Conversation"
+msgstr "Eliminar conversación"
-#: ../../Zotlabs/Module/Settings/Display.php:148
-#, php-format
-msgid "%s - (Experimental)"
-msgstr "%s - (Experimental)"
+#: ../../Zotlabs/Module/Mail.php:434
+msgid ""
+"No secure communications available. You <strong>may</strong> be able to "
+"respond from the sender's profile page."
+msgstr "Comunicación segura no disponible. Pero <strong>puede</strong> responder desde la página del perfil del remitente."
-#: ../../Zotlabs/Module/Settings/Display.php:198
-msgid "Display Settings"
-msgstr "Ajustes de visualización"
+#: ../../Zotlabs/Module/Mail.php:438
+msgid "Send Reply"
+msgstr "Responder"
-#: ../../Zotlabs/Module/Settings/Display.php:199
-msgid "Theme Settings"
-msgstr "Ajustes del tema"
+#: ../../Zotlabs/Module/Mail.php:443
+#, php-format
+msgid "Your message for %s (%s):"
+msgstr "Su mensaje para %s (%s):"
-#: ../../Zotlabs/Module/Settings/Display.php:200
-msgid "Custom Theme Settings"
-msgstr "Ajustes personalizados del tema"
+#: ../../Zotlabs/Module/Pubsites.php:24 ../../Zotlabs/Widget/Pubsites.php:12
+msgid "Public Hubs"
+msgstr "Servidores públicos"
-#: ../../Zotlabs/Module/Settings/Display.php:201
-msgid "Content Settings"
-msgstr "Ajustes del contenido"
+#: ../../Zotlabs/Module/Pubsites.php:27
+msgid ""
+"The listed hubs allow public registration for the $Projectname network. All "
+"hubs in the network are interlinked so membership on any of them conveys "
+"membership in the network as a whole. Some hubs may require subscription or "
+"provide tiered service plans. The hub itself <strong>may</strong> provide "
+"additional details."
+msgstr "Los sitios listados permiten el registro público en la red $Projectname. Todos los sitios de la red están vinculados entre sí, por lo que sus miembros, en ninguno de ellos, indican la pertenencia a la red en su conjunto. Algunos sitios pueden requerir suscripción o proporcionar planes de servicio por niveles. Los mismos hubs <strong>pueden</strong> proporcionar detalles adicionales."
-#: ../../Zotlabs/Module/Settings/Display.php:207
-msgid "Display Theme:"
-msgstr "Tema gráfico del perfil:"
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Hub URL"
+msgstr "Dirección del hub"
-#: ../../Zotlabs/Module/Settings/Display.php:208
-msgid "Select scheme"
-msgstr "Elegir un esquema"
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Access Type"
+msgstr "Tipo de acceso"
-#: ../../Zotlabs/Module/Settings/Display.php:210
-msgid "Mobile Theme:"
-msgstr "Tema para el móvil:"
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Registration Policy"
+msgstr "Normas de registro"
-#: ../../Zotlabs/Module/Settings/Display.php:211
-msgid "Preload images before rendering the page"
-msgstr "Carga previa de las imágenes antes de generar la página"
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Stats"
+msgstr "Estadísticas"
-#: ../../Zotlabs/Module/Settings/Display.php:211
-msgid ""
-"The subjective page load time will be longer but the page will be ready when"
-" displayed"
-msgstr "El tiempo subjetivo de carga de la página será más largo, pero la página estará lista cuando se muestre."
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Software"
+msgstr "Software"
-#: ../../Zotlabs/Module/Settings/Display.php:212
-msgid "Enable user zoom on mobile devices"
-msgstr "Habilitar zoom de usuario en dispositivos móviles"
+#: ../../Zotlabs/Module/Pubsites.php:48
+msgid "Rate"
+msgstr "Valorar"
-#: ../../Zotlabs/Module/Settings/Display.php:213
-msgid "Update browser every xx seconds"
-msgstr "Actualizar navegador cada xx segundos"
+#: ../../Zotlabs/Module/Impel.php:41 ../../include/bbcode.php:203
+msgid "webpage"
+msgstr "página web"
-#: ../../Zotlabs/Module/Settings/Display.php:213
-msgid "Minimum of 10 seconds, no maximum"
-msgstr "Mínimo de 10 segundos, sin máximo"
+#: ../../Zotlabs/Module/Impel.php:46 ../../include/bbcode.php:209
+msgid "block"
+msgstr "bloque"
-#: ../../Zotlabs/Module/Settings/Display.php:214
-msgid "Maximum number of conversations to load at any time:"
-msgstr "Máximo número de conversaciones a cargar en cualquier momento:"
+#: ../../Zotlabs/Module/Impel.php:51 ../../include/bbcode.php:206
+msgid "layout"
+msgstr "plantilla"
-#: ../../Zotlabs/Module/Settings/Display.php:214
-msgid "Maximum of 100 items"
-msgstr "Máximo de 100 elementos"
+#: ../../Zotlabs/Module/Impel.php:58 ../../include/bbcode.php:212
+msgid "menu"
+msgstr "menú"
-#: ../../Zotlabs/Module/Settings/Display.php:215
-msgid "Show emoticons (smilies) as images"
-msgstr "Mostrar emoticonos (smilies) como imágenes"
+#: ../../Zotlabs/Module/Impel.php:181
+#, php-format
+msgid "%s element installed"
+msgstr "%s elemento instalado"
-#: ../../Zotlabs/Module/Settings/Display.php:216
-msgid "Manual conversation updates"
-msgstr "Actualizaciones manuales de la conversación"
+#: ../../Zotlabs/Module/Impel.php:184
+#, php-format
+msgid "%s element installation failed"
+msgstr "Elemento con instalación fallida: %s"
-#: ../../Zotlabs/Module/Settings/Display.php:216
-msgid "Default is on, turning this off may increase screen jumping"
-msgstr "El valor predeterminado está activado, al desactivarlo puede aumentar el salto de pantalla"
+#: ../../Zotlabs/Module/Rbmark.php:94
+msgid "Select a bookmark folder"
+msgstr "Seleccionar una carpeta de marcadores"
-#: ../../Zotlabs/Module/Settings/Display.php:217
-msgid "Link post titles to source"
-msgstr "Enlazar título de la publicación a la fuente original"
+#: ../../Zotlabs/Module/Rbmark.php:99
+msgid "Save Bookmark"
+msgstr "Guardar marcador"
-#: ../../Zotlabs/Module/Settings/Display.php:218
-msgid "System Page Layout Editor - (advanced)"
-msgstr "Editor de plantilla de página del sistema - (avanzado)"
+#: ../../Zotlabs/Module/Rbmark.php:100
+msgid "URL of bookmark"
+msgstr "Dirección del marcador"
-#: ../../Zotlabs/Module/Settings/Display.php:221
-msgid "Use blog/list mode on channel page"
-msgstr "Usar modo blog/lista en la página de inicio del canal"
+#: ../../Zotlabs/Module/Rbmark.php:105
+msgid "Or enter new bookmark folder name"
+msgstr "O introduzca un nuevo nombre para la carpeta de marcadores"
-#: ../../Zotlabs/Module/Settings/Display.php:221
-#: ../../Zotlabs/Module/Settings/Display.php:222
-msgid "(comments displayed separately)"
-msgstr "(comentarios mostrados de forma separada)"
+#: ../../Zotlabs/Module/Filer.php:52
+msgid "Enter a folder name"
+msgstr "Escriba un nombre de carpeta"
-#: ../../Zotlabs/Module/Settings/Display.php:222
-msgid "Use blog/list mode on grid page"
-msgstr "Mostrar mi red en modo blog"
+#: ../../Zotlabs/Module/Filer.php:52
+msgid "or select an existing folder (doubleclick)"
+msgstr "o seleccione una (con un doble click)"
-#: ../../Zotlabs/Module/Settings/Display.php:223
-msgid "Channel page max height of content (in pixels)"
-msgstr "Altura máxima del contenido de la página del canal (en píxeles)"
+#: ../../Zotlabs/Module/Filer.php:54 ../../Zotlabs/Lib/ThreadItem.php:137
+msgid "Save to Folder"
+msgstr "Guardar en carpeta"
-#: ../../Zotlabs/Module/Settings/Display.php:223
-#: ../../Zotlabs/Module/Settings/Display.php:224
-msgid "click to expand content exceeding this height"
-msgstr "Pulsar para expandir el contenido que exceda de esta altura"
+#: ../../Zotlabs/Module/Probe.php:28 ../../Zotlabs/Module/Probe.php:32
+#, php-format
+msgid "Fetching URL returns error: %1$s"
+msgstr "Al intentar obtener la dirección, retorna el error: %1$s"
-#: ../../Zotlabs/Module/Settings/Display.php:224
-msgid "Grid page max height of content (in pixels)"
-msgstr "Altura máxima del contenido de mi red (en píxeles)"
+#: ../../Zotlabs/Module/Register.php:49
+msgid "Maximum daily site registrations exceeded. Please try again tomorrow."
+msgstr "Se ha superado el límite máximo de inscripciones diarias de este sitio. Por favor, pruebe de nuevo mañana."
-#: ../../Zotlabs/Module/Tagrm.php:48 ../../Zotlabs/Module/Tagrm.php:98
-msgid "Tag removed"
-msgstr "Etiqueta eliminada."
+#: ../../Zotlabs/Module/Register.php:55
+msgid ""
+"Please indicate acceptance of the Terms of Service. Registration failed."
+msgstr "Por favor, confirme que acepta los Términos del servicio. El registro ha fallado."
-#: ../../Zotlabs/Module/Tagrm.php:123
-msgid "Remove Item Tag"
-msgstr "Eliminar etiqueta del elemento."
+#: ../../Zotlabs/Module/Register.php:89
+msgid "Passwords do not match."
+msgstr "Las contraseñas no coinciden."
-#: ../../Zotlabs/Module/Tagrm.php:125
-msgid "Select a tag to remove: "
-msgstr "Seleccionar una etiqueta para eliminar:"
+#: ../../Zotlabs/Module/Register.php:131
+msgid ""
+"Registration successful. Please check your email for validation "
+"instructions."
+msgstr "Registro realizado con éxito. Por favor, compruebe su correo electrónico para ver las instrucciones para validarlo."
-#: ../../Zotlabs/Module/Thing.php:114
-msgid "Thing updated"
-msgstr "Elemento actualizado."
+#: ../../Zotlabs/Module/Register.php:137
+msgid "Your registration is pending approval by the site owner."
+msgstr "Su registro está pendiente de aprobación por el propietario del sitio."
-#: ../../Zotlabs/Module/Thing.php:166
-msgid "Object store: failed"
-msgstr "Guardar objeto: ha fallado"
+#: ../../Zotlabs/Module/Register.php:140
+msgid "Your registration can not be processed."
+msgstr "Su registro no puede ser procesado."
-#: ../../Zotlabs/Module/Thing.php:170
-msgid "Thing added"
-msgstr "Elemento añadido"
+#: ../../Zotlabs/Module/Register.php:184
+msgid "Registration on this hub is disabled."
+msgstr "El registro está deshabilitado en este sitio."
-#: ../../Zotlabs/Module/Thing.php:196
-#, php-format
-msgid "OBJ: %1$s %2$s %3$s"
-msgstr "OBJ: %1$s %2$s %3$s"
+#: ../../Zotlabs/Module/Register.php:193
+msgid "Registration on this hub is by approval only."
+msgstr "El registro en este hub está sometido a aprobación previa."
-#: ../../Zotlabs/Module/Thing.php:259
-msgid "Show Thing"
-msgstr "Mostrar elemento"
+#: ../../Zotlabs/Module/Register.php:194
+msgid "<a href=\"pubsites\">Register at another affiliated hub.</a>"
+msgstr "<a href=\"pubsites\">Registrarse en otro hub afiliado.</a>"
-#: ../../Zotlabs/Module/Thing.php:266
-msgid "item not found."
-msgstr "elemento no encontrado."
+#: ../../Zotlabs/Module/Register.php:204
+msgid ""
+"This site has exceeded the number of allowed daily account registrations. "
+"Please try again tomorrow."
+msgstr "Este sitio ha excedido el límite de inscripción diaria de cuentas. Por favor, inténtelo de nuevo mañana."
-#: ../../Zotlabs/Module/Thing.php:299
-msgid "Edit Thing"
-msgstr "Editar elemento"
+#: ../../Zotlabs/Module/Register.php:227
+#, php-format
+msgid "I accept the %s for this website"
+msgstr "Acepto los %s de este sitio"
-#: ../../Zotlabs/Module/Thing.php:301 ../../Zotlabs/Module/Thing.php:355
-msgid "Select a profile"
-msgstr "Seleccionar un perfil"
+#: ../../Zotlabs/Module/Register.php:229
+#, php-format
+msgid "I am over 13 years of age and accept the %s for this website"
+msgstr "Tengo más de 13 años de edad y acepto los %s de este sitio"
-#: ../../Zotlabs/Module/Thing.php:305 ../../Zotlabs/Module/Thing.php:358
-msgid "Post an activity"
-msgstr "Publicar una actividad"
+#: ../../Zotlabs/Module/Register.php:233
+msgid "Your email address"
+msgstr "Su dirección de correo electrónico"
-#: ../../Zotlabs/Module/Thing.php:305 ../../Zotlabs/Module/Thing.php:358
-msgid "Only sends to viewers of the applicable profile"
-msgstr "Sólo enviar a espectadores del perfil pertinente."
+#: ../../Zotlabs/Module/Register.php:234
+msgid "Choose a password"
+msgstr "Elija una contraseña"
-#: ../../Zotlabs/Module/Thing.php:307 ../../Zotlabs/Module/Thing.php:360
-msgid "Name of thing e.g. something"
-msgstr "Nombre del elemento, p. ej.:. \"algo\""
+#: ../../Zotlabs/Module/Register.php:235
+msgid "Please re-enter your password"
+msgstr "Por favor, vuelva a escribir su contraseña"
-#: ../../Zotlabs/Module/Thing.php:309 ../../Zotlabs/Module/Thing.php:361
-msgid "URL of thing (optional)"
-msgstr "Dirección del elemento (opcional)"
+#: ../../Zotlabs/Module/Register.php:236
+msgid "Please enter your invitation code"
+msgstr "Por favor, introduzca el código de su invitación"
-#: ../../Zotlabs/Module/Thing.php:311 ../../Zotlabs/Module/Thing.php:362
-msgid "URL for photo of thing (optional)"
-msgstr "Dirección para la foto o elemento (opcional)"
+#: ../../Zotlabs/Module/Register.php:241
+msgid "no"
+msgstr "no"
-#: ../../Zotlabs/Module/Thing.php:353
-msgid "Add Thing to your Profile"
-msgstr "Añadir alguna cosa a su perfil"
+#: ../../Zotlabs/Module/Register.php:241
+msgid "yes"
+msgstr "sí"
-#: ../../Zotlabs/Module/Setup.php:176
-msgid "$Projectname Server - Setup"
-msgstr "Servidor $Projectname - Instalación"
+#: ../../Zotlabs/Module/Register.php:258
+msgid "Membership on this site is by invitation only."
+msgstr "Para registrarse en este sitio es necesaria una invitación."
-#: ../../Zotlabs/Module/Setup.php:180
-msgid "Could not connect to database."
-msgstr "No se ha podido conectar a la base de datos."
+#: ../../Zotlabs/Module/Register.php:270 ../../boot.php:1610
+#: ../../include/nav.php:149
+msgid "Register"
+msgstr "Registrarse"
-#: ../../Zotlabs/Module/Setup.php:184
+#: ../../Zotlabs/Module/Register.php:271
msgid ""
-"Could not connect to specified site URL. Possible SSL certificate or DNS "
-"issue."
-msgstr "No se puede conectar con la dirección del sitio indicada. Podría tratarse de un problema de SSL o DNS."
+"This site may require email verification after submitting this form. If you "
+"are returned to a login page, please check your email for instructions."
+msgstr "Este sitio puede requerir una verificación de correo electrónico después de enviar este formulario. Si es devuelto a una página de inicio de sesión, compruebe su email para recibir y leer las instrucciones."
-#: ../../Zotlabs/Module/Setup.php:191
-msgid "Could not create table."
-msgstr "No se puede crear la tabla."
+#: ../../Zotlabs/Module/Cover_photo.php:136
+#: ../../Zotlabs/Module/Cover_photo.php:186
+msgid "Cover Photos"
+msgstr "Imágenes de portada del perfil"
-#: ../../Zotlabs/Module/Setup.php:196
-msgid "Your site database has been installed."
-msgstr "La base de datos del sitio ha sido instalada."
+#: ../../Zotlabs/Module/Cover_photo.php:237 ../../include/items.php:4303
+msgid "female"
+msgstr "mujer"
-#: ../../Zotlabs/Module/Setup.php:200
-msgid ""
-"You may need to import the file \"install/schema_xxx.sql\" manually using a "
-"database client."
-msgstr "Podría tener que importar manualmente el fichero \"install/schema_xxx.sql\" usando un cliente de base de datos."
+#: ../../Zotlabs/Module/Cover_photo.php:238 ../../include/items.php:4304
+#, php-format
+msgid "%1$s updated her %2$s"
+msgstr "%1$s ha actualizado su %2$s"
-#: ../../Zotlabs/Module/Setup.php:201 ../../Zotlabs/Module/Setup.php:263
-#: ../../Zotlabs/Module/Setup.php:750
-msgid "Please see the file \"install/INSTALL.txt\"."
-msgstr "Por favor, lea el fichero \"install/INSTALL.txt\"."
+#: ../../Zotlabs/Module/Cover_photo.php:239 ../../include/items.php:4305
+msgid "male"
+msgstr "hombre"
-#: ../../Zotlabs/Module/Setup.php:260
-msgid "System check"
-msgstr "Verificación del sistema"
+#: ../../Zotlabs/Module/Cover_photo.php:240 ../../include/items.php:4306
+#, php-format
+msgid "%1$s updated his %2$s"
+msgstr "%1$s ha actualizado su %2$s"
-#: ../../Zotlabs/Module/Setup.php:265
-msgid "Check again"
-msgstr "Verificar de nuevo"
+#: ../../Zotlabs/Module/Cover_photo.php:242 ../../include/items.php:4308
+#, php-format
+msgid "%1$s updated their %2$s"
+msgstr "%1$s ha actualizado su %2$s"
-#: ../../Zotlabs/Module/Setup.php:287
-msgid "Database connection"
-msgstr "Conexión a la base de datos"
+#: ../../Zotlabs/Module/Cover_photo.php:244 ../../include/channel.php:1759
+msgid "cover photo"
+msgstr "Imagen de portada del perfil"
-#: ../../Zotlabs/Module/Setup.php:288
-msgid ""
-"In order to install $Projectname we need to know how to connect to your "
-"database."
-msgstr "Para instalar $Projectname es necesario saber cómo conectar con su base de datos."
+#: ../../Zotlabs/Module/Cover_photo.php:360
+msgid "Upload Cover Photo"
+msgstr "Subir imagen de portada del perfil"
-#: ../../Zotlabs/Module/Setup.php:289
-msgid ""
-"Please contact your hosting provider or site administrator if you have "
-"questions about these settings."
-msgstr "Por favor, contacte con el proveedor de servicios o el administrador del sitio si tiene dudas sobre estos ajustes."
+#: ../../Zotlabs/Module/Help.php:23
+msgid "Documentation Search"
+msgstr "Búsqueda de Documentación"
-#: ../../Zotlabs/Module/Setup.php:290
-msgid ""
-"The database you specify below should already exist. If it does not, please "
-"create it before continuing."
-msgstr "La base de datos que especifique a continuación debe existir ya. Si no es así, por favor, créela antes de seguir."
+#: ../../Zotlabs/Module/Help.php:80 ../../include/conversation.php:1773
+#: ../../include/nav.php:382
+msgid "About"
+msgstr "Mi perfil"
-#: ../../Zotlabs/Module/Setup.php:294
-msgid "Database Server Name"
-msgstr "Nombre del servidor de base de datos"
+#: ../../Zotlabs/Module/Help.php:82
+msgid "Administrators"
+msgstr "Administradores"
-#: ../../Zotlabs/Module/Setup.php:294
-msgid "Default is 127.0.0.1"
-msgstr "De forma predeterminada es 127.0.0.1"
+#: ../../Zotlabs/Module/Help.php:83
+msgid "Developers"
+msgstr "Desarrolladores"
-#: ../../Zotlabs/Module/Setup.php:295
-msgid "Database Port"
-msgstr "Puerto de la base de datos"
+#: ../../Zotlabs/Module/Help.php:84
+msgid "Tutorials"
+msgstr "Tutoriales"
-#: ../../Zotlabs/Module/Setup.php:295
-msgid "Communication port number - use 0 for default"
-msgstr "Número del puerto de comunicaciones - use 0 como valor por defecto"
+#: ../../Zotlabs/Module/Help.php:93
+msgid "$Projectname Documentation"
+msgstr "Documentación de $Projectname"
-#: ../../Zotlabs/Module/Setup.php:296
-msgid "Database Login Name"
-msgstr "Usuario de la base de datos"
+#: ../../Zotlabs/Module/Help.php:94
+msgid "Contents"
+msgstr "Contenidos"
-#: ../../Zotlabs/Module/Setup.php:297
-msgid "Database Login Password"
-msgstr "Contraseña de acceso a la base de datos"
+#: ../../Zotlabs/Module/Tagrm.php:48 ../../Zotlabs/Module/Tagrm.php:98
+msgid "Tag removed"
+msgstr "Etiqueta eliminada."
-#: ../../Zotlabs/Module/Setup.php:298
-msgid "Database Name"
-msgstr "Nombre de la base de datos"
+#: ../../Zotlabs/Module/Tagrm.php:123
+msgid "Remove Item Tag"
+msgstr "Eliminar etiqueta del elemento."
-#: ../../Zotlabs/Module/Setup.php:299
-msgid "Database Type"
-msgstr "Tipo de base de datos"
+#: ../../Zotlabs/Module/Tagrm.php:125
+msgid "Select a tag to remove: "
+msgstr "Seleccionar una etiqueta para eliminar:"
-#: ../../Zotlabs/Module/Setup.php:301 ../../Zotlabs/Module/Setup.php:347
-msgid "Site administrator email address"
-msgstr "Dirección de correo electrónico del administrador del sitio"
+#: ../../Zotlabs/Module/Network.php:96
+msgid "No such group"
+msgstr "No se encuentra el grupo"
-#: ../../Zotlabs/Module/Setup.php:301 ../../Zotlabs/Module/Setup.php:347
-msgid ""
-"Your account email address must match this in order to use the web admin "
-"panel."
-msgstr "Su cuenta deberá usar la misma dirección de correo electrónico para poder utilizar el panel de administración web."
+#: ../../Zotlabs/Module/Network.php:136
+msgid "No such channel"
+msgstr "No se encuentra el canal"
-#: ../../Zotlabs/Module/Setup.php:302 ../../Zotlabs/Module/Setup.php:349
-msgid "Website URL"
-msgstr "Dirección del sitio web"
+#: ../../Zotlabs/Module/Network.php:141
+msgid "forum"
+msgstr "foro"
-#: ../../Zotlabs/Module/Setup.php:302 ../../Zotlabs/Module/Setup.php:349
-msgid "Please use SSL (https) URL if available."
-msgstr "Por favor, use SSL (https) si está disponible."
+#: ../../Zotlabs/Module/Network.php:153
+msgid "Search Results For:"
+msgstr "Buscar resultados para:"
-#: ../../Zotlabs/Module/Setup.php:303 ../../Zotlabs/Module/Setup.php:353
-msgid "Please select a default timezone for your website"
-msgstr "Por favor, selecciones el huso horario por defecto de su sitio web"
+#: ../../Zotlabs/Module/Network.php:221
+msgid "Privacy group is empty"
+msgstr "El grupo de canales está vacío"
-#: ../../Zotlabs/Module/Setup.php:336
-msgid "Site settings"
-msgstr "Ajustes del sitio"
+#: ../../Zotlabs/Module/Network.php:230
+msgid "Privacy group: "
+msgstr "Grupo de canales: "
-#: ../../Zotlabs/Module/Setup.php:392
-msgid "PHP version 5.5 or greater is required."
-msgstr "Se requiere la versión 5.5, o superior, de PHP."
+#: ../../Zotlabs/Module/Network.php:256
+msgid "Invalid connection."
+msgstr "Conexión no válida."
-#: ../../Zotlabs/Module/Setup.php:393
-msgid "PHP version"
-msgstr "Versión de PHP"
+#: ../../Zotlabs/Module/Network.php:275 ../../addon/redred/redred.php:65
+msgid "Invalid channel."
+msgstr "El canal no es válido."
-#: ../../Zotlabs/Module/Setup.php:409
-msgid "Could not find a command line version of PHP in the web server PATH."
-msgstr "No se puede encontrar una versión en línea de comandos de PHP en la ruta del servidor web."
+#: ../../Zotlabs/Module/Acl.php:344
+msgid "network"
+msgstr "red"
-#: ../../Zotlabs/Module/Setup.php:410
-msgid ""
-"If you don't have a command line version of PHP installed on server, you "
-"will not be able to run background polling via cron."
-msgstr "Si no tiene instalada la versión de línea de comandos de PHP en su servidor, no podrá realizar envíos en segundo plano mediante cron."
+#: ../../Zotlabs/Module/Acl.php:354
+msgid "RSS"
+msgstr "RSS"
-#: ../../Zotlabs/Module/Setup.php:414
-msgid "PHP executable path"
-msgstr "Ruta del ejecutable PHP"
+#: ../../Zotlabs/Module/Home.php:74 ../../Zotlabs/Module/Home.php:82
+#: ../../addon/opensearch/opensearch.php:42
+msgid "$Projectname"
+msgstr "$Projectname"
-#: ../../Zotlabs/Module/Setup.php:414
-msgid ""
-"Enter full path to php executable. You can leave this blank to continue the "
-"installation."
-msgstr "Introducir la ruta completa del ejecutable PHP. Puede dejar la línea en blanco para continuar la instalación."
+#: ../../Zotlabs/Module/Home.php:92
+#, php-format
+msgid "Welcome to %s"
+msgstr "Bienvenido a %s"
-#: ../../Zotlabs/Module/Setup.php:419
-msgid "Command line PHP"
-msgstr "PHP en línea de comandos"
+#: ../../Zotlabs/Module/Filestorage.php:87
+msgid "Permission Denied."
+msgstr "Permiso denegado"
-#: ../../Zotlabs/Module/Setup.php:429
-msgid ""
-"Unable to check command line PHP, as shell_exec() is disabled. This is "
-"required."
-msgstr "No se puede comprobar la línea de comandos PHP, ya que shell_exec() está deshabilitado. Es necesario que esté activado."
+#: ../../Zotlabs/Module/Filestorage.php:103
+msgid "File not found."
+msgstr "Fichero no encontrado."
-#: ../../Zotlabs/Module/Setup.php:432
-msgid ""
-"The command line version of PHP on your system does not have "
-"\"register_argc_argv\" enabled."
-msgstr "La línea de comandos PHP de su sistema no tiene activado \"register_argc_argv\"."
+#: ../../Zotlabs/Module/Filestorage.php:146
+msgid "Edit file permissions"
+msgstr "Modificar los permisos del fichero"
-#: ../../Zotlabs/Module/Setup.php:433
-msgid "This is required for message delivery to work."
-msgstr "Esto es necesario para que funcione la transmisión de mensajes."
+#: ../../Zotlabs/Module/Filestorage.php:159
+msgid "Set/edit permissions"
+msgstr "Establecer/editar los permisos"
-#: ../../Zotlabs/Module/Setup.php:436
-msgid "PHP register_argc_argv"
-msgstr "PHP register_argc_argv"
+#: ../../Zotlabs/Module/Filestorage.php:160
+msgid "Include all files and sub folders"
+msgstr "Incluir todos los ficheros y subcarpetas"
-#: ../../Zotlabs/Module/Setup.php:454
-#, php-format
-msgid ""
-"Your max allowed total upload size is set to %s. Maximum size of one file to"
-" upload is set to %s. You are allowed to upload up to %d files at once."
-msgstr "La carga máxima que se le permite subir está establecida en %s. El tamaño máximo de un fichero está establecido en %s. Está permitido subir hasta un máximo de %d ficheros de una sola vez."
+#: ../../Zotlabs/Module/Filestorage.php:161
+msgid "Return to file list"
+msgstr "Volver a la lista de ficheros"
-#: ../../Zotlabs/Module/Setup.php:459
-msgid "You can adjust these settings in the server php.ini file."
-msgstr "Puede ajustar estos valores en el fichero php.ini de su servidor."
+#: ../../Zotlabs/Module/Filestorage.php:163
+msgid "Copy/paste this code to attach file to a post"
+msgstr "Copiar/pegar este código para adjuntar el fichero al envío"
-#: ../../Zotlabs/Module/Setup.php:461
-msgid "PHP upload limits"
-msgstr "Límites PHP de subida"
+#: ../../Zotlabs/Module/Filestorage.php:164
+msgid "Copy/paste this URL to link file from a web page"
+msgstr "Copiar/pegar esta dirección para enlazar el fichero desde una página web"
-#: ../../Zotlabs/Module/Setup.php:484
-msgid ""
-"Error: the \"openssl_pkey_new\" function on this system is not able to "
-"generate encryption keys"
-msgstr "Error: La función \"openssl_pkey_new\" en este sistema no es capaz de general claves de cifrado."
+#: ../../Zotlabs/Module/Filestorage.php:166
+msgid "Share this file"
+msgstr "Compartir este fichero"
-#: ../../Zotlabs/Module/Setup.php:485
-msgid ""
-"If running under Windows, please see "
-"\"http://www.php.net/manual/en/openssl.installation.php\"."
-msgstr "Si está en un servidor Windows, por favor, lea \"http://www.php.net/manual/en/openssl.installation.php\"."
+#: ../../Zotlabs/Module/Filestorage.php:167
+msgid "Show URL to this file"
+msgstr "Mostrar la dirección de este fichero"
-#: ../../Zotlabs/Module/Setup.php:488
-msgid "Generate encryption keys"
-msgstr "Generar claves de cifrado"
+#: ../../Zotlabs/Module/Filestorage.php:168
+msgid "Notify your contacts about this file"
+msgstr "Avisar a sus contactos sobre este fichero"
-#: ../../Zotlabs/Module/Setup.php:505
-msgid "libCurl PHP module"
-msgstr "módulo libCurl PHP"
+#: ../../Zotlabs/Module/Common.php:14
+msgid "No channel."
+msgstr "Ningún canal."
-#: ../../Zotlabs/Module/Setup.php:506
-msgid "GD graphics PHP module"
-msgstr "módulo PHP GD graphics"
+#: ../../Zotlabs/Module/Common.php:43
+msgid "Common connections"
+msgstr "Conexiones comunes"
-#: ../../Zotlabs/Module/Setup.php:507
-msgid "OpenSSL PHP module"
-msgstr "módulo PHP OpenSSL"
+#: ../../Zotlabs/Module/Common.php:48
+msgid "No connections in common."
+msgstr "Ninguna conexión en común."
-#: ../../Zotlabs/Module/Setup.php:508
-msgid "PDO database PHP module"
-msgstr "Módulo PHP de la base de datos PDO "
+#: ../../Zotlabs/Module/Viewconnections.php:65
+msgid "No connections."
+msgstr "Sin conexiones."
-#: ../../Zotlabs/Module/Setup.php:509
-msgid "mb_string PHP module"
-msgstr "módulo PHP mb_string"
+#: ../../Zotlabs/Module/Viewconnections.php:78
+#, php-format
+msgid "Visit %s's profile [%s]"
+msgstr "Visitar el perfil de %s [%s]"
-#: ../../Zotlabs/Module/Setup.php:510
-msgid "xml PHP module"
-msgstr "módulo PHP xml"
+#: ../../Zotlabs/Module/Viewconnections.php:107
+msgid "View Connections"
+msgstr "Ver conexiones"
-#: ../../Zotlabs/Module/Setup.php:514 ../../Zotlabs/Module/Setup.php:516
-msgid "Apache mod_rewrite module"
-msgstr "módulo Apache mod_rewrite "
+#: ../../Zotlabs/Module/Admin.php:94
+msgid "# Accounts"
+msgstr "# Cuentas"
-#: ../../Zotlabs/Module/Setup.php:514
-msgid ""
-"Error: Apache webserver mod-rewrite module is required but not installed."
-msgstr "Error: se necesita el módulo del servidor web Apache mod-rewrite pero no está instalado."
+#: ../../Zotlabs/Module/Admin.php:95
+msgid "# blocked accounts"
+msgstr "# cuentas bloqueadas"
-#: ../../Zotlabs/Module/Setup.php:520 ../../Zotlabs/Module/Setup.php:523
-msgid "exec"
-msgstr "ejecutable"
+#: ../../Zotlabs/Module/Admin.php:96
+msgid "# expired accounts"
+msgstr "# cuentas caducadas"
-#: ../../Zotlabs/Module/Setup.php:520
-msgid ""
-"Error: exec is required but is either not installed or has been disabled in "
-"php.ini"
-msgstr "Error: se necesita un ejecutable pero o no se instaló o está deshabilitado en php.ini"
+#: ../../Zotlabs/Module/Admin.php:97
+msgid "# expiring accounts"
+msgstr "# cuentas que caducan"
-#: ../../Zotlabs/Module/Setup.php:526 ../../Zotlabs/Module/Setup.php:529
-msgid "shell_exec"
-msgstr "shell_exec"
+#: ../../Zotlabs/Module/Admin.php:108
+msgid "# Channels"
+msgstr "# Canales"
-#: ../../Zotlabs/Module/Setup.php:526
-msgid ""
-"Error: shell_exec is required but is either not installed or has been "
-"disabled in php.ini"
-msgstr "Error: se necesita shell_exec pero o no se instaló o está deshabilitado en php.ini"
+#: ../../Zotlabs/Module/Admin.php:109
+msgid "# primary"
+msgstr "# primario"
-#: ../../Zotlabs/Module/Setup.php:534
-msgid "Error: libCURL PHP module required but not installed."
-msgstr "Error: se necesita el módulo PHP libCURL pero no está instalado."
+#: ../../Zotlabs/Module/Admin.php:110
+msgid "# clones"
+msgstr "# clones"
-#: ../../Zotlabs/Module/Setup.php:538
-msgid ""
-"Error: GD graphics PHP module with JPEG support required but not installed."
-msgstr "Error: el módulo PHP GD graphics es necesario, pero no está instalado."
+#: ../../Zotlabs/Module/Admin.php:116
+msgid "Message queues"
+msgstr "Mensajes en cola"
-#: ../../Zotlabs/Module/Setup.php:542
-msgid "Error: openssl PHP module required but not installed."
-msgstr "Error: el módulo PHP openssl es necesario, pero no está instalado."
+#: ../../Zotlabs/Module/Admin.php:133
+msgid "Your software should be updated"
+msgstr "Debe actualizar su software"
-#: ../../Zotlabs/Module/Setup.php:546
-msgid "Error: PDO database PHP module required but not installed."
-msgstr "Error: se necesita el módulo PHP de la base de datos PDO, pero no está instalado."
+#: ../../Zotlabs/Module/Admin.php:138
+msgid "Summary"
+msgstr "Sumario"
-#: ../../Zotlabs/Module/Setup.php:550
-msgid "Error: mb_string PHP module required but not installed."
-msgstr "Error: el módulo PHP mb_string es necesario, pero no está instalado."
+#: ../../Zotlabs/Module/Admin.php:141
+msgid "Registered accounts"
+msgstr "Cuentas registradas"
-#: ../../Zotlabs/Module/Setup.php:554
-msgid "Error: xml PHP module required for DAV but not installed."
-msgstr "Error: el módulo PHP xml es necesario para DAV, pero no está instalado."
+#: ../../Zotlabs/Module/Admin.php:142
+msgid "Pending registrations"
+msgstr "Registros pendientes"
-#: ../../Zotlabs/Module/Setup.php:572
-msgid ""
-"The web installer needs to be able to create a file called \".htconfig.php\""
-" in the top folder of your web server and it is unable to do so."
-msgstr "El instalador web no ha podido crear un fichero llamado “.htconfig.php†en la carpeta base de su servidor."
+#: ../../Zotlabs/Module/Admin.php:143
+msgid "Registered channels"
+msgstr "Canales registrados"
-#: ../../Zotlabs/Module/Setup.php:573
-msgid ""
-"This is most often a permission setting, as the web server may not be able "
-"to write files in your folder - even if you can."
-msgstr "Esto está generalmente ligado a un problema de permisos, a causa del cual el servidor web tiene prohibido modificar ficheros en su carpeta - incluso si usted mismo tiene esos permisos."
+#: ../../Zotlabs/Module/Admin.php:144
+msgid "Active plugins"
+msgstr "Extensiones (plugins) activas"
-#: ../../Zotlabs/Module/Setup.php:574
-msgid ""
-"At the end of this procedure, we will give you a text to save in a file "
-"named .htconfig.php in your Red top folder."
-msgstr "Al término de este procedimiento, podemos crear un fichero de texto para guardar con el nombre .htconfig.php en el directorio raíz de su instalación de Hubzilla."
+#: ../../Zotlabs/Module/Admin.php:145
+msgid "Version"
+msgstr "Versión"
-#: ../../Zotlabs/Module/Setup.php:575
-msgid ""
-"You can alternatively skip this procedure and perform a manual installation."
-" Please see the file \"install/INSTALL.txt\" for instructions."
-msgstr "Como alternativa, puede dejar este procedimiento e intentar realizar una instalación manual. Lea, por favor, el fichero\"install/INSTALL.txt\" para las instrucciones."
+#: ../../Zotlabs/Module/Admin.php:146
+msgid "Repository version (master)"
+msgstr "Versión del repositorio (master)"
-#: ../../Zotlabs/Module/Setup.php:578
-msgid ".htconfig.php is writable"
-msgstr ".htconfig.php tiene permisos de escritura"
+#: ../../Zotlabs/Module/Admin.php:147
+msgid "Repository version (dev)"
+msgstr "Versión del repositorio (dev)"
-#: ../../Zotlabs/Module/Setup.php:592
-msgid ""
-"This software uses the Smarty3 template engine to render its web views. "
-"Smarty3 compiles templates to PHP to speed up rendering."
-msgstr "Este software hace uso del motor de plantillas Smarty3 para diseñar sus plantillas gráficas. Smarty3 compila las plantillas a PHP para acelerar la renderización."
+#: ../../Zotlabs/Module/Service_limits.php:23
+msgid "No service class restrictions found."
+msgstr "No se han encontrado restricciones sobre esta clase de servicio."
-#: ../../Zotlabs/Module/Setup.php:593
+#: ../../Zotlabs/Module/Rate.php:156
+msgid "Website:"
+msgstr "Sitio web:"
+
+#: ../../Zotlabs/Module/Rate.php:159
#, php-format
-msgid ""
-"In order to store these compiled templates, the web server needs to have "
-"write access to the directory %s under the top level web folder."
-msgstr "Para poder guardar las plantillas compiladas, el servidor web necesita permisos para acceder al directorio %s en la carpeta web principal."
+msgid "Remote Channel [%s] (not yet known on this site)"
+msgstr "Canal remoto [%s] (aún no es conocido en este sitio)"
-#: ../../Zotlabs/Module/Setup.php:594 ../../Zotlabs/Module/Setup.php:615
-msgid ""
-"Please ensure that the user that your web server runs as (e.g. www-data) has"
-" write access to this folder."
-msgstr "Por favor, asegúrese de que el servidor web está siendo ejecutado por un usuario que tenga permisos de escritura sobre esta carpeta (por ejemplo, www-data)."
+#: ../../Zotlabs/Module/Rate.php:160
+msgid "Rating (this information is public)"
+msgstr "Valoración (esta información es pública)"
-#: ../../Zotlabs/Module/Setup.php:595
+#: ../../Zotlabs/Module/Rate.php:161
+msgid "Optionally explain your rating (this information is public)"
+msgstr "Opcionalmente puede explicar su valoración (esta información es pública)"
+
+#: ../../Zotlabs/Module/Lostpass.php:19
+msgid "No valid account found."
+msgstr "No se ha encontrado una cuenta válida."
+
+#: ../../Zotlabs/Module/Lostpass.php:33
+msgid "Password reset request issued. Check your email."
+msgstr "Se ha recibido una solicitud de restablecimiento de contraseña. Consulte su correo electrónico."
+
+#: ../../Zotlabs/Module/Lostpass.php:39 ../../Zotlabs/Module/Lostpass.php:108
#, php-format
-msgid ""
-"Note: as a security measure, you should give the web server write access to "
-"%s only--not the template files (.tpl) that it contains."
-msgstr "Nota: como medida de seguridad, debe dar al servidor web permisos de escritura solo sobre %s - no sobre el fichero de plantilla (.tpl) que contiene."
+msgid "Site Member (%s)"
+msgstr "Usuario del sitio (%s)"
-#: ../../Zotlabs/Module/Setup.php:598
+#: ../../Zotlabs/Module/Lostpass.php:44 ../../Zotlabs/Module/Lostpass.php:49
#, php-format
-msgid "%s is writable"
-msgstr "%s tiene permisos de escritura"
+msgid "Password reset requested at %s"
+msgstr "Se ha solicitado restablecer la contraseña en %s"
-#: ../../Zotlabs/Module/Setup.php:614
+#: ../../Zotlabs/Module/Lostpass.php:68
msgid ""
-"This software uses the store directory to save uploaded files. The web "
-"server needs to have write access to the store directory under the top level"
-" web folder"
-msgstr "Este software utiliza el directorio de almacenamiento para guardar los ficheros subidos. El servidor web debe tener acceso de escritura a este directorio en la carpeta de nivel superior"
-
-#: ../../Zotlabs/Module/Setup.php:618
-msgid "store is writable"
-msgstr "\"store\" tiene permisos de escritura"
+"Request could not be verified. (You may have previously submitted it.) "
+"Password reset failed."
+msgstr "La solicitud no ha podido ser verificada. (Puede que la haya enviado con anterioridad) El restablecimiento de la contraseña ha fallado."
-#: ../../Zotlabs/Module/Setup.php:651
-msgid ""
-"SSL certificate cannot be validated. Fix certificate or disable https access"
-" to this site."
-msgstr "El certificado SSL no ha podido ser validado. Corrija este problema o desactive el acceso https a este sitio."
+#: ../../Zotlabs/Module/Lostpass.php:91 ../../boot.php:1637
+msgid "Password Reset"
+msgstr "Restablecer la contraseña"
-#: ../../Zotlabs/Module/Setup.php:652
-msgid ""
-"If you have https access to your website or allow connections to TCP port "
-"443 (the https: port), you MUST use a browser-valid certificate. You MUST "
-"NOT use self-signed certificates!"
-msgstr "Si su servidor soporta conexiones cifradas SSL o si permite conexiones al puerto TCP 443 (el puerto usado por el protocolo https), debe utilizar un certificado válido. No debe usar un certificado firmado por usted mismo."
+#: ../../Zotlabs/Module/Lostpass.php:92
+msgid "Your password has been reset as requested."
+msgstr "Su contraseña ha sido restablecida según lo solicitó."
-#: ../../Zotlabs/Module/Setup.php:653
-msgid ""
-"This restriction is incorporated because public posts from you may for "
-"example contain references to images on your own hub."
-msgstr "Se ha incorporado esta restricción para evitar que sus entradas públicas hagan referencia a imágenes en su propio servidor."
+#: ../../Zotlabs/Module/Lostpass.php:93
+msgid "Your new password is"
+msgstr "Su nueva contraseña es"
-#: ../../Zotlabs/Module/Setup.php:654
-msgid ""
-"If your certificate is not recognized, members of other sites (who may "
-"themselves have valid certificates) will get a warning message on their own "
-"site complaining about security issues."
-msgstr "Si su certificado no ha sido reconocido, los miembros de otros sitios (con certificados válidos) recibirán mensajes de aviso en sus propios sitios web."
+#: ../../Zotlabs/Module/Lostpass.php:94
+msgid "Save or copy your new password - and then"
+msgstr "Guarde o copie su nueva contraseña - y después"
-#: ../../Zotlabs/Module/Setup.php:655
-msgid ""
-"This can cause usability issues elsewhere (not just on your own site) so we "
-"must insist on this requirement."
-msgstr "Por razones de compatibilidad (sobre el conjunto de la red, no solo sobre su propio sitio), debemos insistir en estos requisitos."
+#: ../../Zotlabs/Module/Lostpass.php:95
+msgid "click here to login"
+msgstr "pulse aquí para conectarse"
-#: ../../Zotlabs/Module/Setup.php:656
+#: ../../Zotlabs/Module/Lostpass.php:96
msgid ""
-"Providers are available that issue free certificates which are browser-"
-"valid."
-msgstr "Existen varias Autoridades de Certificación que le pueden proporcionar certificados válidos."
+"Your password may be changed from the <em>Settings</em> page after "
+"successful login."
+msgstr "Puede cambiar la contraseña en la página <em>Ajustes</em> una vez iniciada la sesión."
-#: ../../Zotlabs/Module/Setup.php:658
-msgid ""
-"If you are confident that the certificate is valid and signed by a trusted "
-"authority, check to see if you have failed to install an intermediate cert. "
-"These are not normally required by browsers, but are required for server-to-"
-"server communications."
-msgstr "Si se tiene la certeza de que el certificado es válido y está firmado por una autoridad de confianza, comprobar para ver si hubo un error al instalar un certificado intermedio. Estos no son normalmente requeridos por los navegadores, pero son necesarios para las comunicaciones de servidor a servidor."
+#: ../../Zotlabs/Module/Lostpass.php:117
+#, php-format
+msgid "Your password has changed at %s"
+msgstr "Su contraseña en %s ha sido cambiada"
-#: ../../Zotlabs/Module/Setup.php:660
-msgid "SSL certificate validation"
-msgstr "validación del certificado SSL"
+#: ../../Zotlabs/Module/Lostpass.php:130
+msgid "Forgot your Password?"
+msgstr "¿Ha olvidado su contraseña?"
-#: ../../Zotlabs/Module/Setup.php:666
+#: ../../Zotlabs/Module/Lostpass.php:131
msgid ""
-"Url rewrite in .htaccess is not working. Check your server "
-"configuration.Test: "
-msgstr "No se pueden reescribir las direcciones web en .htaccess. Compruebe la configuración de su servidor:"
+"Enter your email address and submit to have your password reset. Then check "
+"your email for further instructions."
+msgstr "Introduzca y envíe su dirección de correo electrónico para el restablecimiento de su contraseña. Luego revise su correo para obtener más instrucciones."
-#: ../../Zotlabs/Module/Setup.php:669
-msgid "Url rewrite is working"
-msgstr "La reescritura de las direcciones funciona correctamente"
+#: ../../Zotlabs/Module/Lostpass.php:132
+msgid "Email Address"
+msgstr "Dirección de correo electrónico"
-#: ../../Zotlabs/Module/Setup.php:683
-msgid ""
-"The database configuration file \".htconfig.php\" could not be written. "
-"Please use the enclosed text to create a configuration file in your web "
-"server root."
-msgstr "El fichero de configuración de la base de datos .htconfig.php no se ha podido modificar. Por favor, copie el texto generado en un fichero con ese nombre en el directorio raíz de su servidor."
+#: ../../Zotlabs/Module/Lostpass.php:133
+msgid "Reset"
+msgstr "Reiniciar"
-#: ../../Zotlabs/Module/Setup.php:707
-#: ../../extend/addon/addon/cdav/cdav.php:41
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:401
-msgid "Errors encountered creating database tables."
-msgstr "Se han encontrado errores al crear las tablas de la base de datos."
+#: ../../Zotlabs/Module/Notifications.php:43 ../../include/nav.php:190
+msgid "Mark all system notifications seen"
+msgstr "Marcar todas las notificaciones del sistema como leídas"
-#: ../../Zotlabs/Module/Setup.php:748
-msgid "<h1>What next</h1>"
-msgstr "<h1>Siguiente paso</h1>"
+#: ../../Zotlabs/Lib/Apps.php:212
+msgid "Site Admin"
+msgstr "Administrador del sitio"
-#: ../../Zotlabs/Module/Setup.php:749
-msgid ""
-"IMPORTANT: You will need to [manually] setup a scheduled task for the "
-"poller."
-msgstr "IMPORTANTE: Debe crear [manualmente] una tarea programada para el \"poller\"."
+#: ../../Zotlabs/Lib/Apps.php:213 ../../addon/buglink/buglink.php:16
+msgid "Report Bug"
+msgstr "Informe de errores"
-#: ../../Zotlabs/Module/Viewconnections.php:65
-msgid "No connections."
-msgstr "Sin conexiones."
+#: ../../Zotlabs/Lib/Apps.php:214
+msgid "View Bookmarks"
+msgstr "Ver los marcadores"
-#: ../../Zotlabs/Module/Viewconnections.php:78
-#, php-format
-msgid "Visit %s's profile [%s]"
-msgstr "Visitar el perfil de %s [%s]"
+#: ../../Zotlabs/Lib/Apps.php:215
+msgid "My Chatrooms"
+msgstr "Mis salas de chat"
-#: ../../Zotlabs/Module/Viewconnections.php:107
-msgid "View Connections"
-msgstr "Ver conexiones"
+#: ../../Zotlabs/Lib/Apps.php:217
+msgid "Firefox Share"
+msgstr "Servicio de compartición de Firefox"
-#: ../../Zotlabs/Module/Wiki.php:30
-msgid "Profile Unavailable."
-msgstr "Perfil no disponible"
+#: ../../Zotlabs/Lib/Apps.php:218
+msgid "Remote Diagnostics"
+msgstr "Diagnóstico remoto"
-#: ../../Zotlabs/Module/Wiki.php:44
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:40
-msgid "Not found"
-msgstr "No encontrado"
+#: ../../Zotlabs/Lib/Apps.php:219 ../../include/features.php:337
+msgid "Suggest Channels"
+msgstr "Sugerir canales"
-#: ../../Zotlabs/Module/Wiki.php:68
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:60
-msgid "Invalid channel"
-msgstr "Canal no válido"
+#: ../../Zotlabs/Lib/Apps.php:220 ../../boot.php:1629
+#: ../../include/nav.php:117
+msgid "Login"
+msgstr "Iniciar sesión"
-#: ../../Zotlabs/Module/Wiki.php:159
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:144
-#: ../../include/conversation.php:1900
-msgid "Wikis"
-msgstr "Wikis"
+#: ../../Zotlabs/Lib/Apps.php:222
+msgid "Activity"
+msgstr "Actividad"
-#: ../../Zotlabs/Module/Wiki.php:165
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:150
-msgid "Download"
-msgstr "Descargar"
+#: ../../Zotlabs/Lib/Apps.php:226 ../../include/conversation.php:1857
+#: ../../include/features.php:99 ../../include/nav.php:465
+msgid "Wiki"
+msgstr "Wiki"
-#: ../../Zotlabs/Module/Wiki.php:169
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:154
-msgid "Wiki name"
-msgstr "Nombre del wiki"
+#: ../../Zotlabs/Lib/Apps.php:227 ../../include/nav.php:180
+msgid "Channel Home"
+msgstr "Mi canal"
-#: ../../Zotlabs/Module/Wiki.php:170
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:155
-msgid "Content type"
-msgstr "Tipo de contenido"
+#: ../../Zotlabs/Lib/Apps.php:230 ../../include/conversation.php:1802
+#: ../../include/conversation.php:1805 ../../include/nav.php:200
+#: ../../include/nav.php:411 ../../include/nav.php:414
+msgid "Events"
+msgstr "Eventos"
-#: ../../Zotlabs/Module/Wiki.php:179
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:164
-msgid "Create a status post for this wiki"
-msgstr "Crear un mensaje de estado para este wiki"
+#: ../../Zotlabs/Lib/Apps.php:231
+msgid "Directory"
+msgstr "Directorio"
-#: ../../Zotlabs/Module/Wiki.php:204
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:183
-msgid "Wiki not found"
-msgstr "Wiki no encontrado"
+#: ../../Zotlabs/Lib/Apps.php:233 ../../include/nav.php:192
+msgid "Mail"
+msgstr "Correo"
-#: ../../Zotlabs/Module/Wiki.php:228
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:208
-msgid "Rename page"
-msgstr "Renombrar la página"
+#: ../../Zotlabs/Lib/Apps.php:236
+msgid "Chat"
+msgstr "Chat"
-#: ../../Zotlabs/Module/Wiki.php:232
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:212
-msgid "Error retrieving page content"
-msgstr "Error al recuperar el contenido de la página"
+#: ../../Zotlabs/Lib/Apps.php:238
+msgid "Probe"
+msgstr "Probar"
-#: ../../Zotlabs/Module/Wiki.php:259
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:241
-msgid "Revision Comparison"
-msgstr "Comparación de revisiones"
+#: ../../Zotlabs/Lib/Apps.php:239
+msgid "Suggest"
+msgstr "Sugerir"
-#: ../../Zotlabs/Module/Wiki.php:260
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:242
-msgid "Revert"
-msgstr "Revertir"
+#: ../../Zotlabs/Lib/Apps.php:240
+msgid "Random Channel"
+msgstr "Canal aleatorio"
-#: ../../Zotlabs/Module/Wiki.php:264
-msgid "Short description of your changes (optional)"
-msgstr "Breve descripción de sus cambios (opcional)"
+#: ../../Zotlabs/Lib/Apps.php:241
+msgid "Invite"
+msgstr "Invitar"
-#: ../../Zotlabs/Module/Wiki.php:271
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:251
-msgid "Source"
-msgstr "Fuente"
+#: ../../Zotlabs/Lib/Apps.php:242 ../../Zotlabs/Widget/Admin.php:26
+msgid "Features"
+msgstr "Funcionalidades"
-#: ../../Zotlabs/Module/Wiki.php:279
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:259
-msgid "New page name"
-msgstr "Nombre de la nueva página"
+#: ../../Zotlabs/Lib/Apps.php:243 ../../addon/openid/MysqlProvider.php:69
+msgid "Language"
+msgstr "Idioma"
-#: ../../Zotlabs/Module/Wiki.php:284
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:264
-#: ../../include/conversation.php:1299
-msgid "Embed image from photo albums"
-msgstr "Incluir una imagen de los álbumes de fotos"
+#: ../../Zotlabs/Lib/Apps.php:244
+msgid "Post"
+msgstr "Publicación"
-#: ../../Zotlabs/Module/Wiki.php:285
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:265
-#: ../../include/conversation.php:1393
-msgid "Embed an image from your albums"
-msgstr "Incluir una imagen de sus álbumes"
+#: ../../Zotlabs/Lib/Apps.php:245 ../../addon/openid/MysqlProvider.php:58
+#: ../../addon/openid/MysqlProvider.php:59
+#: ../../addon/openid/MysqlProvider.php:60
+msgid "Profile Photo"
+msgstr "Foto del perfil"
-#: ../../Zotlabs/Module/Wiki.php:287
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:267
-#: ../../include/conversation.php:1395 ../../include/conversation.php:1442
-msgid "OK"
-msgstr "OK"
+#: ../../Zotlabs/Lib/Apps.php:365
+msgid "Purchase"
+msgstr "Comprar"
-#: ../../Zotlabs/Module/Wiki.php:288
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:268
-#: ../../include/conversation.php:1335
-msgid "Choose images to embed"
-msgstr "Elegir imágenes para incluir"
+#: ../../Zotlabs/Lib/Apps.php:369
+msgid "Undelete"
+msgstr "Recuperar"
-#: ../../Zotlabs/Module/Wiki.php:289
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:269
-#: ../../include/conversation.php:1336
-msgid "Choose an album"
-msgstr "Elegir un álbum"
+#: ../../Zotlabs/Lib/Apps.php:374
+msgid "Add to app-tray"
+msgstr "Añadir a la bandeja de aplicaciones"
-#: ../../Zotlabs/Module/Wiki.php:290
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:270
-msgid "Choose a different album"
-msgstr "Elegir un álbum diferente..."
+#: ../../Zotlabs/Lib/Apps.php:375
+msgid "Remove from app-tray"
+msgstr "Quitar de la bandeja de aplicaciones"
-#: ../../Zotlabs/Module/Wiki.php:291
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:271
-#: ../../include/conversation.php:1338
-msgid "Error getting album list"
-msgstr "Error al obtener la lista de álbumes"
+#: ../../Zotlabs/Lib/Permcat.php:58
+msgctxt "permcat"
+msgid "default"
+msgstr "por defecto"
-#: ../../Zotlabs/Module/Wiki.php:292
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:272
-#: ../../include/conversation.php:1339
-msgid "Error getting photo link"
-msgstr "Error al obtener el enlace de la foto"
+#: ../../Zotlabs/Lib/Permcat.php:96
+msgctxt "permcat"
+msgid "follower"
+msgstr "seguidor"
-#: ../../Zotlabs/Module/Wiki.php:293
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:273
-#: ../../include/conversation.php:1340
-msgid "Error getting album"
-msgstr "Error al obtener el álbum"
+#: ../../Zotlabs/Lib/Permcat.php:100
+msgctxt "permcat"
+msgid "contributor"
+msgstr "contribuidor"
-#: ../../Zotlabs/Module/Wiki.php:357
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:337
-msgid "Error creating wiki. Invalid name."
-msgstr "Error al crear el wiki: el nombre no es válido."
+#: ../../Zotlabs/Lib/Permcat.php:104
+msgctxt "permcat"
+msgid "publisher"
+msgstr "editor"
-#: ../../Zotlabs/Module/Wiki.php:369
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:348
-msgid "Wiki created, but error creating Home page."
-msgstr "Se ha creado el wiki, pero se ha producido un error al crear la página de inicio."
+#: ../../Zotlabs/Lib/NativeWikiPage.php:42
+#: ../../Zotlabs/Lib/NativeWikiPage.php:83
+msgid "(No Title)"
+msgstr "(Sin título)"
-#: ../../Zotlabs/Module/Wiki.php:376
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:353
-msgid "Error creating wiki"
-msgstr "Error al crear el wiki"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:97
+msgid "Wiki page create failed."
+msgstr "Se ha producido un error en la creación de la página wiki."
-#: ../../Zotlabs/Module/Wiki.php:388
-msgid "Wiki delete permission denied."
-msgstr "Se ha denegado el permiso para eliminar el wiki."
+#: ../../Zotlabs/Lib/NativeWikiPage.php:110
+msgid "Wiki not found."
+msgstr "No se ha encontrado el wiki."
-#: ../../Zotlabs/Module/Wiki.php:398
-msgid "Error deleting wiki"
-msgstr "Se ha producido un error al eliminar el wiki"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:121
+msgid "Destination name already exists"
+msgstr "El nombre de destino ya existe"
-#: ../../Zotlabs/Module/Wiki.php:424
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:400
-msgid "New page created"
-msgstr "Se ha creado la nueva página"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:147
+#: ../../Zotlabs/Lib/NativeWikiPage.php:342
+msgid "Page not found"
+msgstr "No se ha encontrado la página"
-#: ../../Zotlabs/Module/Wiki.php:539
-msgid "Cannot delete Home"
-msgstr "No se puede eliminar la página principal"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:177
+msgid "Error reading page content"
+msgstr "Se ha producido un error al leer el contenido de la página"
-#: ../../Zotlabs/Module/Wiki.php:603
-msgid "Current Revision"
-msgstr "Revisión actual"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:333
+#: ../../Zotlabs/Lib/NativeWikiPage.php:381
+#: ../../Zotlabs/Lib/NativeWikiPage.php:448
+#: ../../Zotlabs/Lib/NativeWikiPage.php:489
+msgid "Error reading wiki"
+msgstr "Se ha producido un error al leer el wiki"
-#: ../../Zotlabs/Module/Wiki.php:603
-msgid "Selected Revision"
-msgstr "Revisión seleccionada"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:369
+msgid "Page update failed."
+msgstr "Se ha producido un error al actualizar la página."
-#: ../../Zotlabs/Module/Wiki.php:653
-msgid "You must be authenticated."
-msgstr "Debe estar autenticado."
+#: ../../Zotlabs/Lib/NativeWikiPage.php:403
+msgid "Nothing deleted"
+msgstr "No se ha eliminado nada"
-#: ../../Zotlabs/Module/Chat.php:179
-msgid "Room not found"
-msgstr "Sala no encontrada"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:469
+msgid "Compare: object not found."
+msgstr "No se ha encontrado un objeto para comparar."
-#: ../../Zotlabs/Module/Chat.php:195
-msgid "Leave Room"
-msgstr "Abandonar la sala"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:475
+msgid "Page updated"
+msgstr "Se ha actualizado la página"
-#: ../../Zotlabs/Module/Chat.php:196
-msgid "Delete Room"
-msgstr "Eliminar esta sala"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:478
+msgid "Untitled"
+msgstr "Sin título"
-#: ../../Zotlabs/Module/Chat.php:197
-msgid "I am away right now"
-msgstr "Estoy ausente momentáneamente"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:484
+msgid "Wiki resource_id required for git commit"
+msgstr "Se necesita Wiki resource_id para el git commit"
-#: ../../Zotlabs/Module/Chat.php:198
-msgid "I am online"
-msgstr "Estoy conectado/a"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:540
+#: ../../Zotlabs/Widget/Wiki_page_history.php:23
+msgctxt "wiki_history"
+msgid "Message"
+msgstr "Mensaje"
-#: ../../Zotlabs/Module/Chat.php:200
-msgid "Bookmark this room"
-msgstr "Añadir esta sala a Marcadores"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:578
+#: ../../addon/gitwiki/gitwiki_backend.php:579 ../../include/bbcode.php:610
+#: ../../include/bbcode.php:756
+msgid "Different viewers will see this text differently"
+msgstr "Visitantes diferentes verán este texto de forma distinta"
-#: ../../Zotlabs/Module/Chat.php:229
-msgid "New Chatroom"
-msgstr "Nueva sala de chat"
+#: ../../Zotlabs/Lib/PermissionDescription.php:34
+#: ../../include/acl_selectors.php:128
+msgid "Visible to your default audience"
+msgstr "Visible para su público predeterminado."
-#: ../../Zotlabs/Module/Chat.php:230
-msgid "Chatroom name"
-msgstr "Nombre de la sala de chat"
+#: ../../Zotlabs/Lib/PermissionDescription.php:107
+#: ../../include/acl_selectors.php:201
+msgid "Only me"
+msgstr "Sólo yo"
-#: ../../Zotlabs/Module/Chat.php:231
-msgid "Expiration of chats (minutes)"
-msgstr "Caducidad de los mensajes en los chats (en minutos)"
+#: ../../Zotlabs/Lib/PermissionDescription.php:108
+msgid "Public"
+msgstr "Público"
-#: ../../Zotlabs/Module/Chat.php:247
+#: ../../Zotlabs/Lib/PermissionDescription.php:109
+msgid "Anybody in the $Projectname network"
+msgstr "Cualquiera en la red $Projectname"
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:110
#, php-format
-msgid "%1$s's Chatrooms"
-msgstr "Salas de chat de %1$s"
+msgid "Any account on %s"
+msgstr "Cualquier cuenta en %s"
-#: ../../Zotlabs/Module/Chat.php:252
-msgid "No chatrooms available"
-msgstr "No hay salas de chat disponibles"
+#: ../../Zotlabs/Lib/PermissionDescription.php:111
+msgid "Any of my connections"
+msgstr "Cualquiera de mis conexiones"
-#: ../../Zotlabs/Module/Chat.php:256
-msgid "Expiration"
-msgstr "Caducidad"
+#: ../../Zotlabs/Lib/PermissionDescription.php:112
+msgid "Only connections I specifically allow"
+msgstr "Sólo las conexiones que yo permita de forma explícita"
-#: ../../Zotlabs/Module/Chat.php:257
-msgid "min"
-msgstr "min"
+#: ../../Zotlabs/Lib/PermissionDescription.php:113
+msgid "Anybody authenticated (could include visitors from other networks)"
+msgstr "Cualquiera que esté autenticado (podría incluir a los visitantes de otras redes)"
-#: ../../Zotlabs/Module/Xchan.php:10
-msgid "Xchan Lookup"
-msgstr "Búsqueda de canales"
+#: ../../Zotlabs/Lib/PermissionDescription.php:114
+msgid "Any connections including those who haven't yet been approved"
+msgstr "Cualquier conexión incluyendo aquellas que aún no han sido aprobadas"
-#: ../../Zotlabs/Module/Xchan.php:13
-msgid "Lookup xchan beginning with (or webbie): "
-msgstr "Buscar un canal (o un \"webbie\") que comience por:"
+#: ../../Zotlabs/Lib/PermissionDescription.php:150
+msgid ""
+"This is your default setting for the audience of your normal stream, and "
+"posts."
+msgstr "Esta es la configuración predeterminada para su flujo (stream) habitual de publicaciones."
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:151
+msgid ""
+"This is your default setting for who can view your default channel profile"
+msgstr "Esta es su configuración por defecto para establecer quién puede ver su perfil del canal predeterminado"
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:152
+msgid "This is your default setting for who can view your connections"
+msgstr "Este es su ajuste predeterminado para establecer quién puede ver sus conexiones"
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:153
+msgid ""
+"This is your default setting for who can view your file storage and photos"
+msgstr "Este es su ajuste predeterminado para establecer quién puede ver su repositorio de ficheros y sus fotos"
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:154
+msgid "This is your default setting for the audience of your webpages"
+msgstr "Este es el ajuste predeterminado para establecer la audiencia de sus páginas web"
#: ../../Zotlabs/Lib/Chatroom.php:27
msgid "Missing room name"
@@ -7267,22 +7346,21 @@ msgstr "Sala no encontrada."
msgid "Room is full"
msgstr "La sala está llena."
-#: ../../Zotlabs/Lib/Enotify.php:60 ../../include/network.php:1947
+#: ../../Zotlabs/Lib/Enotify.php:60 ../../include/network.php:1977
msgid "$Projectname Notification"
msgstr "Notificación de $Projectname"
-#: ../../Zotlabs/Lib/Enotify.php:61 ../../extend/addon/addon/diaspora/p.php:46
-#: ../../extend/addon/addon/diaspora/util.php:218
-#: ../../extend/addon/addon/diaspora/util.php:231
-#: ../../include/network.php:1948
+#: ../../Zotlabs/Lib/Enotify.php:61 ../../addon/diaspora/util.php:218
+#: ../../addon/diaspora/util.php:231 ../../addon/diaspora/p.php:46
+#: ../../include/network.php:1978
msgid "$projectname"
msgstr "$projectname"
-#: ../../Zotlabs/Lib/Enotify.php:63 ../../include/network.php:1950
+#: ../../Zotlabs/Lib/Enotify.php:63 ../../include/network.php:1980
msgid "Thank You,"
msgstr "Gracias,"
-#: ../../Zotlabs/Lib/Enotify.php:65 ../../include/network.php:1952
+#: ../../Zotlabs/Lib/Enotify.php:65 ../../include/network.php:1982
#, php-format
msgid "%s Administrator"
msgstr "%s Administrador"
@@ -7477,288 +7555,152 @@ msgstr "Foto:"
msgid "Please visit %s to approve or reject the suggestion."
msgstr "Por favor, visite %s para aprobar o rechazar la sugerencia."
-#: ../../Zotlabs/Lib/Enotify.php:619
+#: ../../Zotlabs/Lib/Enotify.php:620
msgid "[$Projectname:Notify]"
msgstr "[$Projectname:Aviso]"
-#: ../../Zotlabs/Lib/Enotify.php:779
+#: ../../Zotlabs/Lib/Enotify.php:780
msgid "created a new post"
msgstr "ha creado una nueva entrada"
-#: ../../Zotlabs/Lib/Enotify.php:780
+#: ../../Zotlabs/Lib/Enotify.php:781
#, php-format
msgid "commented on %s's post"
msgstr "ha comentado la entrada de %s"
-#: ../../Zotlabs/Lib/PermissionDescription.php:34
-#: ../../include/acl_selectors.php:128
-msgid "Visible to your default audience"
-msgstr "Visible para su público predeterminado."
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:107
-#: ../../include/acl_selectors.php:201
-msgid "Only me"
-msgstr "Sólo yo"
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:108
-msgid "Public"
-msgstr "Público"
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:109
-msgid "Anybody in the $Projectname network"
-msgstr "Cualquiera en la red $Projectname"
+#: ../../Zotlabs/Lib/NativeWiki.php:128
+msgid "Wiki files deleted successfully"
+msgstr "Se han borrado con éxito los ficheros del wiki"
-#: ../../Zotlabs/Lib/PermissionDescription.php:110
+#: ../../Zotlabs/Lib/DB_Upgrade.php:93
#, php-format
-msgid "Any account on %s"
-msgstr "Cualquier cuenta en %s"
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:111
-msgid "Any of my connections"
-msgstr "Cualquiera de mis conexiones"
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:112
-msgid "Only connections I specifically allow"
-msgstr "Sólo las conexiones que yo permita de forma explícita"
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:113
-msgid "Anybody authenticated (could include visitors from other networks)"
-msgstr "Cualquiera que esté autenticado (podría incluir a los visitantes de otras redes)"
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:114
-msgid "Any connections including those who haven't yet been approved"
-msgstr "Cualquier conexión incluyendo aquellas que aún no han sido aprobadas"
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:150
-msgid ""
-"This is your default setting for the audience of your normal stream, and "
-"posts."
-msgstr "Esta es la configuración predeterminada para su flujo (stream) habitual de publicaciones."
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:151
-msgid ""
-"This is your default setting for who can view your default channel profile"
-msgstr "Esta es su configuración por defecto para establecer quién puede ver su perfil del canal predeterminado"
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:152
-msgid "This is your default setting for who can view your connections"
-msgstr "Este es su ajuste predeterminado para establecer quién puede ver sus conexiones"
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:153
-msgid ""
-"This is your default setting for who can view your file storage and photos"
-msgstr "Este es su ajuste predeterminado para establecer quién puede ver su repositorio de ficheros y sus fotos"
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:154
-msgid "This is your default setting for the audience of your webpages"
-msgstr "Este es el ajuste predeterminado para establecer la audiencia de sus páginas web"
-
-#: ../../Zotlabs/Lib/NativeWikiPage.php:31
-#: ../../Zotlabs/Lib/NativeWikiPage.php:70
-msgid "(No Title)"
-msgstr "(Sin título)"
-
-#: ../../Zotlabs/Lib/NativeWikiPage.php:84
-msgid "Wiki page create failed."
-msgstr "Se ha producido un error en la creación de la página wiki."
-
-#: ../../Zotlabs/Lib/NativeWikiPage.php:97
-msgid "Wiki not found."
-msgstr "No se ha encontrado el wiki."
-
-#: ../../Zotlabs/Lib/NativeWikiPage.php:108
-msgid "Destination name already exists"
-msgstr "El nombre de destino ya existe"
-
-#: ../../Zotlabs/Lib/NativeWikiPage.php:134
-#: ../../Zotlabs/Lib/NativeWikiPage.php:361
-msgid "Page not found"
-msgstr "No se ha encontrado la página"
-
-#: ../../Zotlabs/Lib/NativeWikiPage.php:164
-msgid "Error reading page content"
-msgstr "Se ha producido un error al leer el contenido de la página"
-
-#: ../../Zotlabs/Lib/NativeWikiPage.php:346
-#: ../../Zotlabs/Lib/NativeWikiPage.php:399
-#: ../../Zotlabs/Lib/NativeWikiPage.php:466
-#: ../../Zotlabs/Lib/NativeWikiPage.php:507
-msgid "Error reading wiki"
-msgstr "Se ha producido un error al leer el wiki"
-
-#: ../../Zotlabs/Lib/NativeWikiPage.php:387
-msgid "Page update failed."
-msgstr "Se ha producido un error al actualizar la página."
-
-#: ../../Zotlabs/Lib/NativeWikiPage.php:421
-msgid "Nothing deleted"
-msgstr "No se ha eliminado nada"
-
-#: ../../Zotlabs/Lib/NativeWikiPage.php:487
-msgid "Compare: object not found."
-msgstr "No se ha encontrado un objeto para comparar."
-
-#: ../../Zotlabs/Lib/NativeWikiPage.php:493
-msgid "Page updated"
-msgstr "Se ha actualizado la página"
-
-#: ../../Zotlabs/Lib/NativeWikiPage.php:496
-msgid "Untitled"
-msgstr "Sin título"
-
-#: ../../Zotlabs/Lib/NativeWikiPage.php:502
-msgid "Wiki resource_id required for git commit"
-msgstr "Se necesita Wiki resource_id para el git commit"
-
-#: ../../Zotlabs/Lib/NativeWikiPage.php:573
-#: ../../extend/addon/addon/gitwiki/gitwiki_backend.php:579
-#: ../../include/bbcode.php:610 ../../include/bbcode.php:756
-msgid "Different viewers will see this text differently"
-msgstr "Visitantes diferentes verán este texto de forma distinta"
-
-#: ../../Zotlabs/Lib/Permcat.php:58
-msgctxt "permcat"
-msgid "default"
-msgstr "por defecto"
-
-#: ../../Zotlabs/Lib/Permcat.php:96
-msgctxt "permcat"
-msgid "follower"
-msgstr "seguidor"
-
-#: ../../Zotlabs/Lib/Permcat.php:100
-msgctxt "permcat"
-msgid "contributor"
-msgstr "contribuidor"
+msgid "Update Error at %s"
+msgstr "Error de actualización en %s"
-#: ../../Zotlabs/Lib/Permcat.php:104
-msgctxt "permcat"
-msgid "publisher"
-msgstr "editor"
+#: ../../Zotlabs/Lib/DB_Upgrade.php:99
+#, php-format
+msgid "Update %s failed. See error logs."
+msgstr "La actualización %s ha fallado. Mire el informe de errores."
-#: ../../Zotlabs/Lib/ThreadItem.php:95 ../../include/conversation.php:663
+#: ../../Zotlabs/Lib/ThreadItem.php:96 ../../include/conversation.php:661
msgid "Private Message"
msgstr "Mensaje Privado"
-#: ../../Zotlabs/Lib/ThreadItem.php:132 ../../include/conversation.php:655
+#: ../../Zotlabs/Lib/ThreadItem.php:133 ../../include/conversation.php:653
msgid "Select"
msgstr "Seleccionar"
-#: ../../Zotlabs/Lib/ThreadItem.php:136
-msgid "Save to Folder"
-msgstr "Guardar en carpeta"
-
-#: ../../Zotlabs/Lib/ThreadItem.php:157
+#: ../../Zotlabs/Lib/ThreadItem.php:158
msgid "I will attend"
msgstr "Participaré"
-#: ../../Zotlabs/Lib/ThreadItem.php:157
+#: ../../Zotlabs/Lib/ThreadItem.php:158
msgid "I will not attend"
msgstr "No participaré"
-#: ../../Zotlabs/Lib/ThreadItem.php:157
+#: ../../Zotlabs/Lib/ThreadItem.php:158
msgid "I might attend"
msgstr "Quizá participe"
-#: ../../Zotlabs/Lib/ThreadItem.php:167
+#: ../../Zotlabs/Lib/ThreadItem.php:168
msgid "I agree"
msgstr "Estoy de acuerdo"
-#: ../../Zotlabs/Lib/ThreadItem.php:167
+#: ../../Zotlabs/Lib/ThreadItem.php:168
msgid "I disagree"
msgstr "No estoy de acuerdo"
-#: ../../Zotlabs/Lib/ThreadItem.php:167
+#: ../../Zotlabs/Lib/ThreadItem.php:168
msgid "I abstain"
msgstr "Me abstengo"
-#: ../../Zotlabs/Lib/ThreadItem.php:223
+#: ../../Zotlabs/Lib/ThreadItem.php:224
msgid "Add Star"
msgstr "Destacar añadiendo una estrella"
-#: ../../Zotlabs/Lib/ThreadItem.php:224
+#: ../../Zotlabs/Lib/ThreadItem.php:225
msgid "Remove Star"
msgstr "Eliminar estrella"
-#: ../../Zotlabs/Lib/ThreadItem.php:225
+#: ../../Zotlabs/Lib/ThreadItem.php:226
msgid "Toggle Star Status"
msgstr "Activar o desactivar el estado de entrada preferida"
-#: ../../Zotlabs/Lib/ThreadItem.php:229
+#: ../../Zotlabs/Lib/ThreadItem.php:230
msgid "starred"
msgstr "preferidas"
-#: ../../Zotlabs/Lib/ThreadItem.php:239 ../../include/conversation.php:670
+#: ../../Zotlabs/Lib/ThreadItem.php:240 ../../include/conversation.php:668
msgid "Message signature validated"
msgstr "Firma de mensaje validada"
-#: ../../Zotlabs/Lib/ThreadItem.php:240 ../../include/conversation.php:671
+#: ../../Zotlabs/Lib/ThreadItem.php:241 ../../include/conversation.php:669
msgid "Message signature incorrect"
msgstr "Firma de mensaje incorrecta"
-#: ../../Zotlabs/Lib/ThreadItem.php:248
+#: ../../Zotlabs/Lib/ThreadItem.php:249
msgid "Add Tag"
msgstr "Añadir etiqueta"
-#: ../../Zotlabs/Lib/ThreadItem.php:268 ../../include/taxonomy.php:316
+#: ../../Zotlabs/Lib/ThreadItem.php:269 ../../include/taxonomy.php:316
msgid "like"
msgstr "me gusta"
-#: ../../Zotlabs/Lib/ThreadItem.php:269 ../../include/taxonomy.php:317
+#: ../../Zotlabs/Lib/ThreadItem.php:270 ../../include/taxonomy.php:317
msgid "dislike"
msgstr "no me gusta"
-#: ../../Zotlabs/Lib/ThreadItem.php:273
+#: ../../Zotlabs/Lib/ThreadItem.php:274
msgid "Share This"
msgstr "Compartir esto"
-#: ../../Zotlabs/Lib/ThreadItem.php:273
+#: ../../Zotlabs/Lib/ThreadItem.php:274
msgid "share"
msgstr "compartir"
-#: ../../Zotlabs/Lib/ThreadItem.php:282
+#: ../../Zotlabs/Lib/ThreadItem.php:283
msgid "Delivery Report"
msgstr "Informe de transmisión"
-#: ../../Zotlabs/Lib/ThreadItem.php:300
+#: ../../Zotlabs/Lib/ThreadItem.php:301
#, php-format
msgid "%d comment"
msgid_plural "%d comments"
msgstr[0] "%d comentario"
msgstr[1] "%d comentarios"
-#: ../../Zotlabs/Lib/ThreadItem.php:329 ../../Zotlabs/Lib/ThreadItem.php:330
+#: ../../Zotlabs/Lib/ThreadItem.php:330 ../../Zotlabs/Lib/ThreadItem.php:331
#, php-format
msgid "View %s's profile - %s"
msgstr "Ver el perfil de %s - %s"
-#: ../../Zotlabs/Lib/ThreadItem.php:333
+#: ../../Zotlabs/Lib/ThreadItem.php:334
msgid "to"
msgstr "a"
-#: ../../Zotlabs/Lib/ThreadItem.php:334
+#: ../../Zotlabs/Lib/ThreadItem.php:335
msgid "via"
msgstr "mediante"
-#: ../../Zotlabs/Lib/ThreadItem.php:335
+#: ../../Zotlabs/Lib/ThreadItem.php:336
msgid "Wall-to-Wall"
msgstr "De página del perfil a página del perfil (de \"muro\" a \"muro\")"
-#: ../../Zotlabs/Lib/ThreadItem.php:336
+#: ../../Zotlabs/Lib/ThreadItem.php:337
msgid "via Wall-To-Wall:"
msgstr "Mediante el procedimiento página del perfil a página del perfil (de \"muro\" a \"muro\")"
-#: ../../Zotlabs/Lib/ThreadItem.php:350 ../../include/conversation.php:717
+#: ../../Zotlabs/Lib/ThreadItem.php:350 ../../include/conversation.php:718
#, php-format
msgid "from %s"
msgstr "desde %s"
-#: ../../Zotlabs/Lib/ThreadItem.php:353 ../../include/conversation.php:720
+#: ../../Zotlabs/Lib/ThreadItem.php:353 ../../include/conversation.php:721
#, php-format
msgid "last edited: %s"
msgstr "último cambio: %s"
-#: ../../Zotlabs/Lib/ThreadItem.php:354 ../../include/conversation.php:721
+#: ../../Zotlabs/Lib/ThreadItem.php:354 ../../include/conversation.php:722
#, php-format
msgid "Expires: %s"
msgstr "Caduca: %s"
@@ -7779,1942 +7721,2333 @@ msgstr "Votar"
msgid "Voting Options"
msgstr "Opciones de votación"
-#: ../../Zotlabs/Lib/ThreadItem.php:383
-#: ../../extend/addon/addon/bookmarker/bookmarker.php:38
+#: ../../Zotlabs/Lib/ThreadItem.php:384
+#: ../../addon/bookmarker/bookmarker.php:38
msgid "Save Bookmarks"
msgstr "Guardar en Marcadores"
-#: ../../Zotlabs/Lib/ThreadItem.php:384
+#: ../../Zotlabs/Lib/ThreadItem.php:385
msgid "Add to Calendar"
msgstr "Añadir al calendario"
-#: ../../Zotlabs/Lib/ThreadItem.php:393
+#: ../../Zotlabs/Lib/ThreadItem.php:394
msgid "Mark all seen"
msgstr "Marcar todo como visto"
-#: ../../Zotlabs/Lib/ThreadItem.php:442 ../../include/js_strings.php:7
+#: ../../Zotlabs/Lib/ThreadItem.php:443 ../../include/js_strings.php:7
#, php-format
msgid "%s show all"
msgstr "%s mostrar todo"
-#: ../../Zotlabs/Lib/ThreadItem.php:732 ../../include/conversation.php:1385
+#: ../../Zotlabs/Lib/ThreadItem.php:733 ../../include/conversation.php:1318
msgid "Bold"
msgstr "Negrita"
-#: ../../Zotlabs/Lib/ThreadItem.php:733 ../../include/conversation.php:1386
+#: ../../Zotlabs/Lib/ThreadItem.php:734 ../../include/conversation.php:1319
msgid "Italic"
msgstr "Itálico "
-#: ../../Zotlabs/Lib/ThreadItem.php:734 ../../include/conversation.php:1387
+#: ../../Zotlabs/Lib/ThreadItem.php:735 ../../include/conversation.php:1320
msgid "Underline"
msgstr "Subrayar"
-#: ../../Zotlabs/Lib/ThreadItem.php:735 ../../include/conversation.php:1388
+#: ../../Zotlabs/Lib/ThreadItem.php:736 ../../include/conversation.php:1321
msgid "Quote"
msgstr "Citar"
-#: ../../Zotlabs/Lib/ThreadItem.php:736 ../../include/conversation.php:1389
+#: ../../Zotlabs/Lib/ThreadItem.php:737 ../../include/conversation.php:1322
msgid "Code"
msgstr "Código"
-#: ../../Zotlabs/Lib/ThreadItem.php:737
+#: ../../Zotlabs/Lib/ThreadItem.php:738
msgid "Image"
msgstr "Imagen"
-#: ../../Zotlabs/Lib/ThreadItem.php:738
+#: ../../Zotlabs/Lib/ThreadItem.php:739
msgid "Insert Link"
msgstr "Insertar enlace"
-#: ../../Zotlabs/Lib/ThreadItem.php:739
+#: ../../Zotlabs/Lib/ThreadItem.php:740
msgid "Video"
msgstr "Vídeo"
-#: ../../Zotlabs/Lib/NativeWiki.php:126
-msgid "Wiki files deleted successfully"
-msgstr "Se han borrado con éxito los ficheros del wiki"
+#: ../../Zotlabs/Zot/Auth.php:138
+msgid ""
+"Remote authentication blocked. You are logged into this site locally. Please"
+" logout and retry."
+msgstr "La autenticación desde su servidor está bloqueada. Ha iniciado sesión localmente. Por favor, salga de la sesión y vuelva a intentarlo."
-#: ../../Zotlabs/Lib/Apps.php:212
-msgid "Site Admin"
-msgstr "Administrador del sitio"
+#: ../../Zotlabs/Zot/Auth.php:250 ../../addon/openid/Mod_Openid.php:76
+#: ../../addon/openid/Mod_Openid.php:178
+#, php-format
+msgid "Welcome %s. Remote authentication successful."
+msgstr "Bienvenido %s. La identificación desde su servidor se ha llevado a cabo correctamente."
-#: ../../Zotlabs/Lib/Apps.php:213
-#: ../../extend/addon/addon/buglink/buglink.php:16
-msgid "Report Bug"
-msgstr "Informe de errores"
+#: ../../Zotlabs/Storage/Browser.php:106 ../../Zotlabs/Storage/Browser.php:237
+msgid "parent"
+msgstr "padre"
-#: ../../Zotlabs/Lib/Apps.php:214
-msgid "View Bookmarks"
-msgstr "Ver los marcadores"
+#: ../../Zotlabs/Storage/Browser.php:130 ../../include/text.php:2679
+msgid "Collection"
+msgstr "Colección"
-#: ../../Zotlabs/Lib/Apps.php:215
-msgid "My Chatrooms"
-msgstr "Mis salas de chat"
+#: ../../Zotlabs/Storage/Browser.php:133
+msgid "Principal"
+msgstr "Principal"
-#: ../../Zotlabs/Lib/Apps.php:217
-msgid "Firefox Share"
-msgstr "Servicio de compartición de Firefox"
+#: ../../Zotlabs/Storage/Browser.php:136
+msgid "Addressbook"
+msgstr "Libreta de direcciones"
-#: ../../Zotlabs/Lib/Apps.php:218
-msgid "Remote Diagnostics"
-msgstr "Diagnóstico remoto"
+#: ../../Zotlabs/Storage/Browser.php:139
+msgid "Calendar"
+msgstr "Calendario"
-#: ../../Zotlabs/Lib/Apps.php:219 ../../include/features.php:337
-msgid "Suggest Channels"
-msgstr "Sugerir canales"
+#: ../../Zotlabs/Storage/Browser.php:142
+msgid "Schedule Inbox"
+msgstr "Programar bandeja de entrada"
-#: ../../Zotlabs/Lib/Apps.php:220 ../../include/nav.php:130
-#: ../../boot.php:1749
-msgid "Login"
-msgstr "Iniciar sesión"
+#: ../../Zotlabs/Storage/Browser.php:145
+msgid "Schedule Outbox"
+msgstr "Programar bandeja de salida"
-#: ../../Zotlabs/Lib/Apps.php:222 ../../include/nav.php:194
-msgid "Grid"
-msgstr "Red"
+#: ../../Zotlabs/Storage/Browser.php:225
+msgid "Total"
+msgstr "Total"
-#: ../../Zotlabs/Lib/Apps.php:226 ../../include/conversation.php:1903
-#: ../../include/features.php:99
-msgid "Wiki"
-msgstr "Wiki"
+#: ../../Zotlabs/Storage/Browser.php:227
+msgid "Shared"
+msgstr "Compartido"
-#: ../../Zotlabs/Lib/Apps.php:227 ../../include/nav.php:198
-msgid "Channel Home"
-msgstr "Mi canal"
+#: ../../Zotlabs/Storage/Browser.php:301
+#, php-format
+msgid "You are using %1$s of your available file storage."
+msgstr "Está usando %1$s de su espacio disponible para ficheros."
-#: ../../Zotlabs/Lib/Apps.php:230 ../../include/conversation.php:1853
-#: ../../include/conversation.php:1856 ../../include/nav.php:218
-msgid "Events"
-msgstr "Eventos"
+#: ../../Zotlabs/Storage/Browser.php:306
+#, php-format
+msgid "You are using %1$s of %2$s available file storage. (%3$s&#37;)"
+msgstr "Está usando %1$s de %2$s que tiene a su disposición para ficheros. (%3$s&#37;)"
-#: ../../Zotlabs/Lib/Apps.php:231 ../../include/nav.php:182
-msgid "Directory"
-msgstr "Directorio"
+#: ../../Zotlabs/Storage/Browser.php:317
+msgid "WARNING:"
+msgstr "ATENCIÓN: "
-#: ../../Zotlabs/Lib/Apps.php:233 ../../include/nav.php:210
-msgid "Mail"
-msgstr "Correo"
+#: ../../Zotlabs/Storage/Browser.php:327
+msgid ""
+"Please use DAV to upload large (video, audio) files.<br>See <a class=\"zrl\""
+" href=\"help/member/member_guide#Cloud_Desktop_Clients\">Cloud Desktop "
+"Clients</a>"
+msgstr "Por favor, use DAV para subir ficheros de gran tamaño (vídeo, audio).<br>Mire en <a class=\"zrl\" href=\"help/member/member_guide#Cloud_Desktop_Clients\">Cloud Desktop Clients</a>"
-#: ../../Zotlabs/Lib/Apps.php:236
-msgid "Chat"
-msgstr "Chat"
+#: ../../Zotlabs/Storage/Browser.php:331
+msgid "Create new folder"
+msgstr "Crear nueva carpeta"
-#: ../../Zotlabs/Lib/Apps.php:238
-msgid "Probe"
-msgstr "Probar"
+#: ../../Zotlabs/Storage/Browser.php:333
+msgid "Upload file"
+msgstr "Subir fichero"
-#: ../../Zotlabs/Lib/Apps.php:239
-msgid "Suggest"
-msgstr "Sugerir"
+#: ../../Zotlabs/Storage/Browser.php:347
+msgid "Drop files here to immediately upload"
+msgstr "Arrastre los ficheros aquí para subirlos de forma inmediata"
-#: ../../Zotlabs/Lib/Apps.php:240
-msgid "Random Channel"
-msgstr "Canal aleatorio"
+#: ../../Zotlabs/Widget/Forums.php:85
+msgid "Forums"
+msgstr "Foros"
-#: ../../Zotlabs/Lib/Apps.php:241
-msgid "Invite"
-msgstr "Invitar"
+#: ../../Zotlabs/Widget/Appcategories.php:39
+#: ../../Zotlabs/Widget/Tagcloud.php:25 ../../include/contact_widgets.php:91
+#: ../../include/taxonomy.php:188 ../../include/taxonomy.php:270
+msgid "Categories"
+msgstr "Temas"
-#: ../../Zotlabs/Lib/Apps.php:242 ../../include/widgets.php:1638
-msgid "Features"
+#: ../../Zotlabs/Widget/Appcategories.php:42 ../../Zotlabs/Widget/Filer.php:31
+#: ../../include/contact_widgets.php:56 ../../include/contact_widgets.php:94
+msgid "Everything"
+msgstr "Todo"
+
+#: ../../Zotlabs/Widget/Eventstools.php:13
+msgid "Events Tools"
+msgstr "Gestión de eventos"
+
+#: ../../Zotlabs/Widget/Eventstools.php:14
+msgid "Export Calendar"
+msgstr "Exportar el calendario"
+
+#: ../../Zotlabs/Widget/Eventstools.php:15
+msgid "Import Calendar"
+msgstr "Importar un calendario"
+
+#: ../../Zotlabs/Widget/Suggestedchats.php:32
+msgid "Suggested Chatrooms"
+msgstr "Salas de chat sugeridas"
+
+#: ../../Zotlabs/Widget/Mailmenu.php:13
+msgid "Private Mail Menu"
+msgstr "Menú de correo privado"
+
+#: ../../Zotlabs/Widget/Mailmenu.php:15
+msgid "Combined View"
+msgstr "Vista combinada"
+
+#: ../../Zotlabs/Widget/Mailmenu.php:20 ../../include/nav.php:195
+msgid "Inbox"
+msgstr "Bandeja de entrada"
+
+#: ../../Zotlabs/Widget/Mailmenu.php:25 ../../include/nav.php:196
+msgid "Outbox"
+msgstr "Bandeja de salida"
+
+#: ../../Zotlabs/Widget/Mailmenu.php:30 ../../include/nav.php:197
+msgid "New Message"
+msgstr "Nuevo mensaje"
+
+#: ../../Zotlabs/Widget/Chatroom_list.php:16
+#: ../../include/conversation.php:1816 ../../include/conversation.php:1819
+#: ../../include/nav.php:425 ../../include/nav.php:428
+msgid "Chatrooms"
+msgstr "Salas de chat"
+
+#: ../../Zotlabs/Widget/Chatroom_list.php:20
+msgid "Overview"
+msgstr "Resumen"
+
+#: ../../Zotlabs/Widget/Rating.php:51
+msgid "Rating Tools"
+msgstr "Valoraciones"
+
+#: ../../Zotlabs/Widget/Rating.php:55 ../../Zotlabs/Widget/Rating.php:57
+msgid "Rate Me"
+msgstr "Valorar este canal"
+
+#: ../../Zotlabs/Widget/Rating.php:60
+msgid "View Ratings"
+msgstr "Mostrar las valoraciones"
+
+#: ../../Zotlabs/Widget/Activity.php:50
+msgctxt "widget"
+msgid "Activity"
+msgstr "Actividad"
+
+#: ../../Zotlabs/Widget/Follow.php:22
+#, php-format
+msgid "You have %1$.0f of %2$.0f allowed connections."
+msgstr "Tiene %1$.0f de %2$.0f conexiones permitidas."
+
+#: ../../Zotlabs/Widget/Follow.php:29
+msgid "Add New Connection"
+msgstr "Añadir nueva conexión"
+
+#: ../../Zotlabs/Widget/Follow.php:30
+msgid "Enter channel address"
+msgstr "Dirección del canal"
+
+#: ../../Zotlabs/Widget/Follow.php:31
+msgid "Examples: bob@example.com, https://example.com/barbara"
+msgstr "Ejemplos: manuel@ejemplo.com, https://ejemplo.com/carmen"
+
+#: ../../Zotlabs/Widget/Wiki_list.php:15 ../../addon/gitwiki/gitwiki.php:95
+msgid "Wiki List"
+msgstr "Lista de wikis"
+
+#: ../../Zotlabs/Widget/Archive.php:43
+msgid "Archives"
+msgstr "Hemeroteca"
+
+#: ../../Zotlabs/Widget/Conversations.php:17
+#: ../../Zotlabs/Widget/Conversations.php:29
+msgid "Conversations"
+msgstr "Conversaciones"
+
+#: ../../Zotlabs/Widget/Conversations.php:21
+msgid "Received Messages"
+msgstr "Mensajes recibidos"
+
+#: ../../Zotlabs/Widget/Conversations.php:25
+msgid "Sent Messages"
+msgstr "Enviar mensajes"
+
+#: ../../Zotlabs/Widget/Conversations.php:39
+msgid "No messages."
+msgstr "Sin mensajes."
+
+#: ../../Zotlabs/Widget/Conversations.php:57
+msgid "Delete conversation"
+msgstr "Eliminar conversación"
+
+#: ../../Zotlabs/Widget/Chatroom_members.php:11
+msgid "Chat Members"
+msgstr "Miembros del chat"
+
+#: ../../Zotlabs/Widget/Photo.php:48 ../../Zotlabs/Widget/Photo_rand.php:58
+msgid "photo/image"
+msgstr "foto/imagen"
+
+#: ../../Zotlabs/Widget/Savedsearch.php:75
+msgid "Remove term"
+msgstr "Eliminar término"
+
+#: ../../Zotlabs/Widget/Savedsearch.php:83 ../../include/features.php:301
+msgid "Saved Searches"
+msgstr "Búsquedas guardadas"
+
+#: ../../Zotlabs/Widget/Savedsearch.php:84 ../../include/group.php:336
+msgid "add"
+msgstr "añadir"
+
+#: ../../Zotlabs/Widget/Notes.php:16
+msgid "Notes"
+msgstr "Notas"
+
+#: ../../Zotlabs/Widget/Wiki_pages.php:54 ../../addon/gitwiki/gitwiki.php:76
+msgid "Wiki Pages"
+msgstr "Páginas del wiki"
+
+#: ../../Zotlabs/Widget/Wiki_pages.php:60 ../../addon/gitwiki/gitwiki.php:81
+msgid "Add new page"
+msgstr "Añadir una nueva página"
+
+#: ../../Zotlabs/Widget/Wiki_pages.php:61 ../../addon/gitwiki/gitwiki.php:82
+msgid "Page name"
+msgstr "Nombre de la página"
+
+#: ../../Zotlabs/Widget/Affinity.php:49
+msgid "Refresh"
+msgstr "Recargar"
+
+#: ../../Zotlabs/Widget/Tasklist.php:23
+msgid "Tasks"
+msgstr "Tareas"
+
+#: ../../Zotlabs/Widget/Suggestions.php:51
+msgid "Suggestions"
+msgstr "Sugerencias"
+
+#: ../../Zotlabs/Widget/Suggestions.php:52
+msgid "See more..."
+msgstr "Ver más..."
+
+#: ../../Zotlabs/Widget/Filer.php:28 ../../include/contact_widgets.php:53
+#: ../../include/features.php:390
+msgid "Saved Folders"
+msgstr "Carpetas guardadas"
+
+#: ../../Zotlabs/Widget/Cover_photo.php:54
+msgid "Click to show more"
+msgstr "Hacer clic para ver más"
+
+#: ../../Zotlabs/Widget/Admin.php:23 ../../Zotlabs/Widget/Admin.php:60
+msgid "Member registrations waiting for confirmation"
+msgstr "Inscripciones de nuevos miembros pendientes de aprobación"
+
+#: ../../Zotlabs/Widget/Admin.php:29
+msgid "Inspect queue"
+msgstr "Examinar la cola"
+
+#: ../../Zotlabs/Widget/Admin.php:31
+msgid "DB updates"
+msgstr "Actualizaciones de la base de datos"
+
+#: ../../Zotlabs/Widget/Admin.php:55 ../../include/nav.php:215
+msgid "Admin"
+msgstr "Administrador"
+
+#: ../../Zotlabs/Widget/Admin.php:56
+msgid "Plugin Features"
+msgstr "Extensiones"
+
+#: ../../Zotlabs/Widget/Settings_menu.php:35
+msgid "Account settings"
+msgstr "Configuración de la cuenta"
+
+#: ../../Zotlabs/Widget/Settings_menu.php:41
+msgid "Channel settings"
+msgstr "Configuración del canal"
+
+#: ../../Zotlabs/Widget/Settings_menu.php:50
+msgid "Additional features"
msgstr "Funcionalidades"
-#: ../../Zotlabs/Lib/Apps.php:243
-#: ../../extend/addon/addon/openid/MysqlProvider.php:69
-msgid "Language"
-msgstr "Idioma"
+#: ../../Zotlabs/Widget/Settings_menu.php:57
+msgid "Feature/Addon settings"
+msgstr "Complementos"
-#: ../../Zotlabs/Lib/Apps.php:244
-msgid "Post"
-msgstr "Publicación"
+#: ../../Zotlabs/Widget/Settings_menu.php:63
+msgid "Display settings"
+msgstr "Ajustes de visualización"
-#: ../../Zotlabs/Lib/Apps.php:245
-#: ../../extend/addon/addon/openid/MysqlProvider.php:58
-#: ../../extend/addon/addon/openid/MysqlProvider.php:59
-#: ../../extend/addon/addon/openid/MysqlProvider.php:60
-msgid "Profile Photo"
-msgstr "Foto del perfil"
+#: ../../Zotlabs/Widget/Settings_menu.php:70
+msgid "Manage locations"
+msgstr "Gestión de ubicaciones (clones) del canal"
-#: ../../Zotlabs/Lib/Apps.php:355
-msgid "Purchase"
-msgstr "Comprar"
+#: ../../Zotlabs/Widget/Settings_menu.php:77
+msgid "Export channel"
+msgstr "Exportar canal"
-#: ../../Zotlabs/Lib/Apps.php:359
-msgid "Undelete"
-msgstr "Recuperar"
+#: ../../Zotlabs/Widget/Settings_menu.php:83
+msgid "Connected apps"
+msgstr "Aplicaciones (apps) conectadas"
-#: ../../Zotlabs/Lib/Apps.php:364
-msgid "Add to app-tray"
-msgstr "Añadir a la bandeja de aplicaciones"
+#: ../../Zotlabs/Widget/Settings_menu.php:98 ../../include/features.php:153
+msgid "Permission Groups"
+msgstr "Grupos de permisos"
-#: ../../Zotlabs/Lib/Apps.php:365
-msgid "Remove from app-tray"
-msgstr "Quitar de la bandeja de aplicaciones"
+#: ../../Zotlabs/Widget/Settings_menu.php:115
+msgid "Premium Channel Settings"
+msgstr "Configuración del canal premium"
-#: ../../extend/addon/addon/adultphotoflag/adultphotoflag.php:24
-msgid "Flag Adult Photos"
-msgstr "Indicador (\"flag\") de fotos de adultos"
+#: ../../Zotlabs/Widget/Bookmarkedchats.php:24
+msgid "Bookmarked Chatrooms"
+msgstr "Salas de chat preferidas"
-#: ../../extend/addon/addon/adultphotoflag/adultphotoflag.php:25
-msgid ""
-"Provide photo edit option to hide inappropriate photos from default album "
-"view"
-msgstr "Proporcionar una opción de edición de fotos para ocultar las fotos inapropiadas de la vista de álbum predeterminada"
+#: ../../util/nconfig.php:34
+msgid "Source channel not found."
+msgstr "No se ha encontrado el canal de origen."
-#: ../../extend/addon/addon/chords/Mod_Chords.php:44
-msgid ""
-"This is a fairly comprehensive and complete guitar chord dictionary which "
-"will list most of the available ways to play a certain chord, starting from "
-"the base of the fingerboard up to a few frets beyond the twelfth fret "
-"(beyond which everything repeats). A couple of non-standard tunings are "
-"provided for the benefit of slide players, etc."
-msgstr "Se trata de un diccionario bastante amplio y completo de acordes de guitarra que enumerará la mayor parte de las formas disponibles para tocar un acorde determinado, partiendo de la base del diapasón hasta unos pocos trastes más allá del traste doce (más allá del cual todo se repite). Se proporcionan un par de afinaciones no convencionales para provecho de los guitarristas con \"slides\" ( barras de acero), etc."
+#: ../../boot.php:1162 ../../addon/opensearch/opensearch.php:26
+#, php-format
+msgctxt "opensearch"
+msgid "Search %1$s (%2$s)"
+msgstr "Buscar %1$s (%2$s)"
-#: ../../extend/addon/addon/chords/Mod_Chords.php:46
-msgid ""
-"Chord names start with a root note (A-G) and may include sharps (#) and "
-"flats (b). This software will parse most of the standard naming conventions "
-"such as maj, min, dim, sus(2 or 4), aug, with optional repeating elements."
-msgstr "Los nombres de acordes comienzan con una nota fundamental (La-Sol) y pueden incluir sostenidos (#) y bemoles (b). Este software analizará la mayor parte de las convenciones de nomenclatura estándar como maj, min, tenue, SUS (2 ó 4), aug, con la repetición de elementos opcionales."
+#: ../../boot.php:1162 ../../addon/opensearch/opensearch.php:28
+msgctxt "opensearch"
+msgid "$Projectname"
+msgstr "$Projectname"
-#: ../../extend/addon/addon/chords/Mod_Chords.php:48
-msgid ""
-"Valid examples include A, A7, Am7, Amaj7, Amaj9, Ammaj7, Aadd4, Asus2Add4, "
-"E7b13b11 ..."
-msgstr "Ejemplos válidos son A, A7, Am7, Amaj7, Amaj9, Ammaj7, Aadd4, Asus2Add4, E7b13b11 ..."
+#: ../../boot.php:1609
+msgid "Create an account to access services and applications"
+msgstr "Crear una cuenta para acceder a los servicios y aplicaciones"
-#: ../../extend/addon/addon/chords/Mod_Chords.php:51
-msgid "Guitar Chords"
-msgstr "Acordes de guitarra"
+#: ../../boot.php:1628 ../../include/nav.php:103 ../../include/nav.php:127
+msgid "Logout"
+msgstr "Finalizar sesión"
-#: ../../extend/addon/addon/chords/Mod_Chords.php:52
-msgid "The complete online chord dictionary"
-msgstr "El diccionario completo de acordes en línea"
+#: ../../boot.php:1631
+msgid "Login/Email"
+msgstr "Inicio de sesión / Correo electrónico"
-#: ../../extend/addon/addon/chords/Mod_Chords.php:57
-msgid "Tuning"
-msgstr "Afinación"
+#: ../../boot.php:1632
+msgid "Password"
+msgstr "Contraseña"
-#: ../../extend/addon/addon/chords/Mod_Chords.php:58
-msgid "Chord name: example: Em7"
-msgstr "Nombre del acorde, por ejemplo: Em7"
+#: ../../boot.php:1633
+msgid "Remember me"
+msgstr "Recordarme"
-#: ../../extend/addon/addon/chords/Mod_Chords.php:59
-msgid "Show for left handed stringing"
-msgstr "Mostrar para tocadores zurdos"
+#: ../../boot.php:1636
+msgid "Forgot your password?"
+msgstr "¿Olvidó su contraseña?"
-#: ../../extend/addon/addon/chords/chords.php:33
-msgid "Quick Reference"
-msgstr "Referencia rápida"
+#: ../../boot.php:2174
+msgid "toggle mobile"
+msgstr "cambiar a modo móvil"
-#: ../../extend/addon/addon/diaspora/import_diaspora.php:16
-msgid "No username found in import file."
-msgstr "No se ha encontrado el nombre de usuario en el fichero importado."
+#: ../../boot.php:2327
+#, php-format
+msgid "[$Projectname] Website SSL error for %s"
+msgstr "[$Projectname] Error SSL del sitio web en %s"
-#: ../../extend/addon/addon/diaspora/import_diaspora.php:41
-#: ../../include/import.php:51
-msgid "Unable to create a unique channel address. Import failed."
-msgstr "No se ha podido crear una dirección de canal única. Ha fallado la importación."
+#: ../../boot.php:2332
+msgid "Website SSL certificate is not valid. Please correct."
+msgstr "El certificado SSL del sitio web no es válido. Por favor, solucione el problema."
-#: ../../extend/addon/addon/diaspora/diaspora.php:677
-msgid "Diaspora Protocol Settings updated."
-msgstr "Los ajustes del protocolo de Diaspora se han actualizado."
+#: ../../boot.php:2450
+#, php-format
+msgid "[$Projectname] Cron tasks not running on %s"
+msgstr "[$Projectname] Las tareas de Cron no están funcionando en %s"
-#: ../../extend/addon/addon/diaspora/diaspora.php:696
-msgid "Enable the Diaspora protocol for this channel"
-msgstr "Activar el protocolo de Diaspora para este canal"
+#: ../../boot.php:2455
+msgid "Cron/Scheduled tasks not running."
+msgstr "Las tareas del Planificador/Cron no están funcionando."
-#: ../../extend/addon/addon/diaspora/diaspora.php:700
-msgid "Allow any Diaspora member to comment on your public posts"
-msgstr "Permitir a cualquier miembro de Diaspora comentar sus entradas públicas"
+#: ../../boot.php:2456 ../../include/datetime.php:286
+msgid "never"
+msgstr "nunca"
-#: ../../extend/addon/addon/diaspora/diaspora.php:704
-msgid "Prevent your hashtags from being redirected to other sites"
-msgstr "Impedir que sus \"hashtags\" sean redirigidos a otros sitios "
+#: ../../view/theme/redbasic/php/config.php:9
+msgid "Focus (Hubzilla default)"
+msgstr "Focus (predefinido)"
-#: ../../extend/addon/addon/diaspora/diaspora.php:709
-msgid "Followed hashtags (comma separated, do not include the #)"
-msgstr "\"Hashtags\" seguidos (separados por comas, sin incluir #)"
+#: ../../view/theme/redbasic/php/config.php:88
+msgid "Theme settings"
+msgstr "Ajustes del tema"
-#: ../../extend/addon/addon/diaspora/diaspora.php:714
-msgid "Diaspora Protocol Settings"
-msgstr "Ajustes del protocolo de Diaspora"
+#: ../../view/theme/redbasic/php/config.php:89
+msgid "Narrow navbar"
+msgstr "Estrechar la barra de navegación"
-#: ../../extend/addon/addon/dirstats/dirstats.php:94
-msgid "Hubzilla Directory Stats"
-msgstr "Estadísticas de directorio de Hubzilla"
+#: ../../view/theme/redbasic/php/config.php:90
+msgid "Navigation bar background color"
+msgstr "Color de fondo de la barra de navegación"
-#: ../../extend/addon/addon/dirstats/dirstats.php:95
-msgid "Total Hubs"
-msgstr "Número total de servidores"
+#: ../../view/theme/redbasic/php/config.php:91
+msgid "Navigation bar icon color "
+msgstr "Color del icono de la barra de navegación"
-#: ../../extend/addon/addon/dirstats/dirstats.php:97
-msgid "Hubzilla Hubs"
-msgstr "Servidores (hubs) de Hubzilla"
+#: ../../view/theme/redbasic/php/config.php:92
+msgid "Navigation bar active icon color "
+msgstr "Color del icono activo de la barra de navegación"
-#: ../../extend/addon/addon/dirstats/dirstats.php:99
-msgid "Friendica Hubs"
-msgstr "Servidores (hubs) de Friendica"
+#: ../../view/theme/redbasic/php/config.php:93
+msgid "Link color"
+msgstr "Color del enlace"
-#: ../../extend/addon/addon/dirstats/dirstats.php:101
-msgid "Diaspora Pods"
-msgstr "Servidores (pods) de Diaspora"
+#: ../../view/theme/redbasic/php/config.php:94
+msgid "Set font-color for banner"
+msgstr "Ajustar el color del tipo de letra para el \"banner\""
-#: ../../extend/addon/addon/dirstats/dirstats.php:103
-msgid "Hubzilla Channels"
-msgstr "Canales de Hubzilla"
+#: ../../view/theme/redbasic/php/config.php:95
+msgid "Set the background color"
+msgstr "Ajustar el color de fondo"
-#: ../../extend/addon/addon/dirstats/dirstats.php:105
-msgid "Friendica Channels"
-msgstr "Canales de Friendica"
+#: ../../view/theme/redbasic/php/config.php:96
+msgid "Set the background image"
+msgstr "Ajustar la imagen de fondo"
-#: ../../extend/addon/addon/dirstats/dirstats.php:107
-msgid "Diaspora Channels"
-msgstr "Canales de Diaspora"
+#: ../../view/theme/redbasic/php/config.php:97
+msgid "Set the background color of items"
+msgstr "Ajustar el color de los elementos de fondo"
-#: ../../extend/addon/addon/dirstats/dirstats.php:109
-msgid "Aged 35 and above"
-msgstr "De 35 años de edad en adelante"
+#: ../../view/theme/redbasic/php/config.php:98
+msgid "Set the background color of comments"
+msgstr "Ajustar el color de fondo de los comentarios"
-#: ../../extend/addon/addon/dirstats/dirstats.php:111
-msgid "Aged 34 and under"
-msgstr "De 34 o menos años de edad"
+#: ../../view/theme/redbasic/php/config.php:99
+msgid "Set font-size for the entire application"
+msgstr "Ajustar el tamaño de letra para toda la aplicación"
-#: ../../extend/addon/addon/dirstats/dirstats.php:113
-msgid "Average Age"
-msgstr "Promedio de edad"
+#: ../../view/theme/redbasic/php/config.php:99
+msgid "Examples: 1rem, 100%, 16px"
+msgstr "Ejemplos: 1rem, 100%, 16px"
-#: ../../extend/addon/addon/dirstats/dirstats.php:115
-msgid "Known Chatrooms"
-msgstr "Salas de chat conocidas"
+#: ../../view/theme/redbasic/php/config.php:100
+msgid "Set font-color for posts and comments"
+msgstr "Establecer el color de la letra para publicaciones y comentarios"
-#: ../../extend/addon/addon/dirstats/dirstats.php:117
-msgid "Known Tags"
-msgstr "Etiquetas conocidas"
+#: ../../view/theme/redbasic/php/config.php:101
+msgid "Set radius of corners"
+msgstr "Establecer el radio de curvatura de las esquinas"
-#: ../../extend/addon/addon/dirstats/dirstats.php:119
-msgid ""
-"Please note Diaspora and Friendica statistics are merely those **this "
-"directory** is aware of, and not all those known in the network. This also "
-"applies to chatrooms,"
-msgstr "Tenga en cuenta que las estadísticas de Diaspora y Friendica se refieren únicamente a aquellas de las que **este directorio** es consciente, y no a todos los conocidos en la red. Esto también es aplicable a las salas de chat,"
+#: ../../view/theme/redbasic/php/config.php:101
+msgid "Example: 4px"
+msgstr "Ejemplo: 4px"
-#: ../../extend/addon/addon/donate/donate.php:21
-msgid "Project Servers and Resources"
-msgstr "Servidores y recursos del proyecto"
+#: ../../view/theme/redbasic/php/config.php:102
+msgid "Set shadow depth of photos"
+msgstr "Ajustar la profundidad de sombras de las fotos"
-#: ../../extend/addon/addon/donate/donate.php:22
-msgid "Project Creator and Tech Lead"
-msgstr "Creador del proyecto y director técnico"
+#: ../../view/theme/redbasic/php/config.php:103
+msgid "Set maximum width of content region in pixel"
+msgstr "Ajustar la anchura máxima de la región de contenido, en pixels"
-#: ../../extend/addon/addon/donate/donate.php:23
-msgid "Admin, developer, directorymin, support bloke"
-msgstr "Administrador, desarrollador, administrador del directorio, trabajador de apoyo"
+#: ../../view/theme/redbasic/php/config.php:103
+msgid "Leave empty for default width"
+msgstr "Dejar en blanco para la anchura predeterminada"
-#: ../../extend/addon/addon/donate/donate.php:50
-msgid ""
-"And the hundreds of other people and organisations who helped make the "
-"Hubzilla possible."
-msgstr "Y los cientos de personas y organizaciones más que ayudaron a hacer posible Hubzilla."
+#: ../../view/theme/redbasic/php/config.php:104
+msgid "Left align page content"
+msgstr "Alinear a la izquierda el contenido de la página"
+
+#: ../../view/theme/redbasic/php/config.php:105
+msgid "Set size of conversation author photo"
+msgstr "Ajustar el tamaño de la foto del autor de la conversación"
+
+#: ../../view/theme/redbasic/php/config.php:106
+msgid "Set size of followup author photos"
+msgstr "Ajustar el tamaño de foto de los seguidores del autor"
-#: ../../extend/addon/addon/donate/donate.php:53
+#: ../../addon/rendezvous/rendezvous.php:57
+msgid "Errors encountered deleting database table "
+msgstr "Errores encontrados al eliminar la tabla de la base de datos"
+
+#: ../../addon/rendezvous/rendezvous.php:95
+#: ../../addon/twitter/twitter.php:773
+msgid "Submit Settings"
+msgstr "Enviar los ajustes"
+
+#: ../../addon/rendezvous/rendezvous.php:96
+msgid "Drop tables when uninstalling?"
+msgstr "¿Eliminar tablas al desinstalar?"
+
+#: ../../addon/rendezvous/rendezvous.php:96
msgid ""
-"The Redmatrix/Hubzilla projects are provided primarily by volunteers giving "
-"their time and expertise - and often paying out of pocket for services they "
-"share with others."
-msgstr "Los proyectos Redmatrix / Hubzilla están proporcionados principalmente por voluntarios que les prestan su tiempo y experiencia, pagando a menudo de su bolsillo por los servicios que comparten con otros."
+"If checked, the Rendezvous database tables will be deleted when the plugin "
+"is uninstalled."
+msgstr "Si se selecciona, las tablas de la base de datos Rendezvous se eliminarán cuando se desinstale el plugin."
-#: ../../extend/addon/addon/donate/donate.php:54
+#: ../../addon/rendezvous/rendezvous.php:97
+msgid "Mapbox Access Token"
+msgstr "Token de acceso de Mapbox"
+
+#: ../../addon/rendezvous/rendezvous.php:97
msgid ""
-"There is no corporate funding and no ads, and we do not collect and sell "
-"your personal information. (We don't control your personal information - "
-"<strong>you do</strong>.)"
-msgstr "No hay financiación corporativa ni publicidad y no recogemos ni vendemos su información personal. (De hecho, no tenemos control sobre sus datos privados. <Strong>Usted lo tiene</strong>.)"
+"If you enter a Mapbox access token, it will be used to retrieve map tiles "
+"from Mapbox instead of the default OpenStreetMap tile server."
+msgstr "Si introduce un token de acceso a Mapbox, se utilizará para recuperar los mapas de mosaicos de imágenes de Mapbox en lugar del servidor de mosaico de imágenes OpenStreetMap predeterminado."
+
+#: ../../addon/rendezvous/rendezvous.php:162
+msgid "Rendezvous"
+msgstr "Rendezvous"
-#: ../../extend/addon/addon/donate/donate.php:55
+#: ../../addon/rendezvous/rendezvous.php:167
msgid ""
-"Help support our ground-breaking work in decentralisation, web identity, and"
-" privacy."
-msgstr "Ayude apoyando nuestro trabajo pionero en la descentralización, la identidad web, y la privacidad."
+"This identity has been deleted by another member due to inactivity. Please "
+"press the \"New identity\" button or refresh the page to register a new "
+"identity. You may use the same name."
+msgstr "Esta identidad ha sido eliminada por otro miembro debido a su inactividad. Pulse el botón \"Nueva identidad\" o actualice la página para registrar una nueva identidad. Puede usar el mismo nombre."
+
+#: ../../addon/rendezvous/rendezvous.php:168
+msgid "Welcome to Rendezvous!"
+msgstr "¡Bienvenido/a a Rendevous!"
-#: ../../extend/addon/addon/donate/donate.php:57
+#: ../../addon/rendezvous/rendezvous.php:169
msgid ""
-"Your donations keep servers and services running and also helps us to "
-"provide innovative new features and continued development."
-msgstr "Sus donaciones mantienen servidores y servicios en ejecución y también nos ayudan a proporcionar nuevas características innovadoras y a mantener el desarrollo de forma continuada."
+"Enter your name to join this rendezvous. To begin sharing your location with"
+" the other members, tap the GPS control. When your location is discovered, a"
+" red dot will appear and others will be able to see you on the map."
+msgstr "Introduzca tu nombre para unirse a esta cita. Para comenzar a compartir su ubicación con los demás miembros, pulse en el control GPS. Cuando se descubra su ubicación, aparecerá un punto rojo y otros podrán verlo en el mapa."
-#: ../../extend/addon/addon/donate/donate.php:60
-msgid "Donate"
-msgstr "Donar"
+#: ../../addon/rendezvous/rendezvous.php:171
+msgid "Let's meet here"
+msgstr "Reunámonos aquí"
+
+#: ../../addon/rendezvous/rendezvous.php:174
+msgid "New marker"
+msgstr "Nuevo marcador"
-#: ../../extend/addon/addon/donate/donate.php:62
+#: ../../addon/rendezvous/rendezvous.php:175
+msgid "Edit marker"
+msgstr "Editar un marcador"
+
+#: ../../addon/rendezvous/rendezvous.php:176
+msgid "New identity"
+msgstr "Nueva identidad"
+
+#: ../../addon/rendezvous/rendezvous.php:177
+msgid "Delete marker"
+msgstr "Eliminar un marcador"
+
+#: ../../addon/rendezvous/rendezvous.php:178
+msgid "Delete member"
+msgstr "Eliminar un miembro"
+
+#: ../../addon/rendezvous/rendezvous.php:179
+msgid "Edit proximity alert"
+msgstr "Editar alerta de proximidad"
+
+#: ../../addon/rendezvous/rendezvous.php:180
msgid ""
-"Choose a project, developer, or public hub to support with a one-time "
-"donation"
-msgstr "Elija un proyecto, desarrollador, o \"hub\" público para apoyar con una donación de una sola vez"
+"A proximity alert will be issued when this member is within a certain radius"
+" of you.<br><br>Enter a radius in meters (0 to disable):"
+msgstr "Se emitirá una alerta de proximidad cuando este miembro esté dentro de un radio determinado respecto a usted.<br><br> Ingrese el radio en metros (0 para deshabilitar):"
-#: ../../extend/addon/addon/donate/donate.php:63
-msgid "Donate Now"
-msgstr "Donar ahora"
+#: ../../addon/rendezvous/rendezvous.php:180
+#: ../../addon/rendezvous/rendezvous.php:185
+msgid "distance"
+msgstr "distancia"
-#: ../../extend/addon/addon/donate/donate.php:64
+#: ../../addon/rendezvous/rendezvous.php:181
+msgid "Proximity alert distance (meters)"
+msgstr "Distancia (en metros) para la alerta de proximidad"
+
+#: ../../addon/rendezvous/rendezvous.php:182
+#: ../../addon/rendezvous/rendezvous.php:184
msgid ""
-"<strong><em>Or</em></strong> become a project sponsor (Hubzilla Project "
-"only)"
-msgstr "<strong><em>O</em></strong> convertirse en un patrocinador del proyecto (sólo del proyecto Hubzilla)"
+"A proximity alert will be issued when you are within a certain radius of the"
+" marker location.<br><br>Enter a radius in meters (0 to disable):"
+msgstr "Se emitirá una alerta de proximidad cuando usted esté dentro de un radio determinado respecto al marcador de localización.<br><br> Ingrese el radio en metros (0 para deshabilitar):"
+
+#: ../../addon/rendezvous/rendezvous.php:183
+msgid "Marker proximity alert"
+msgstr "Marcador de alerta de proximidad"
-#: ../../extend/addon/addon/donate/donate.php:65
+#: ../../addon/rendezvous/rendezvous.php:186
+msgid "Reminder note"
+msgstr "Recordatorio"
+
+#: ../../addon/rendezvous/rendezvous.php:187
msgid ""
-"Please indicate if you would like your first name or full name (or nothing) "
-"to appear in our sponsor listing"
-msgstr "Por favor, indique si desea que su nombre de pila o el nombre completo (o nada) aparezca en nuestra lista de patrocinadores"
+"Enter a note to be displayed when you are within the specified proximity..."
+msgstr "Introduzca una nota que se mostrará cuando esté dentro de la proximidad especificada..."
-#: ../../extend/addon/addon/donate/donate.php:66
-msgid "Sponsor"
-msgstr "Patrocinador"
+#: ../../addon/rendezvous/rendezvous.php:199
+msgid "Add new rendezvous"
+msgstr "Añadir una nueva cita"
-#: ../../extend/addon/addon/donate/donate.php:69
-msgid "Special thanks to: "
-msgstr "Agradecimiento especial a: "
+#: ../../addon/rendezvous/rendezvous.php:200
+msgid ""
+"Create a new rendezvous and share the access link with those you wish to "
+"invite to the group. Those who open the link become members of the "
+"rendezvous. They can view other member locations, add markers to the map, or"
+" share their own locations with the group."
+msgstr "Cree una nueva cita y comparta los enlaces de acceso con los que desea invitar al grupo. Aquellos que abran el enlace se convertirán en miembros de la cita. Pueden ver otras ubicaciones de miembros, añadir marcadores al mapa o compartir sus propias ubicaciones con el grupo."
-#: ../../extend/addon/addon/dwpost/dwpost.php:42
-msgid "Post to Dreamwidth"
-msgstr "Publicar en Dreamwidth"
+#: ../../addon/skeleton/skeleton.php:59
+msgid "Some setting"
+msgstr "Algunos ajustes"
-#: ../../extend/addon/addon/dwpost/dwpost.php:73
-msgid "Enable Dreamwidth Post Plugin"
-msgstr "Activar el plugin de publicación en Dreamwidth"
+#: ../../addon/skeleton/skeleton.php:61
+msgid "A setting"
+msgstr "Un ajuste"
-#: ../../extend/addon/addon/dwpost/dwpost.php:77
-msgid "Dreamwidth username"
-msgstr "Nombre de usuario en Dreamwidth"
+#: ../../addon/skeleton/skeleton.php:64
+msgid "Skeleton Settings"
+msgstr "Ajustes de Skeleton"
-#: ../../extend/addon/addon/dwpost/dwpost.php:81
-msgid "Dreamwidth password"
-msgstr "Contraseña en Dreamwidth"
+#: ../../addon/gnusoc/gnusoc.php:119
+msgid "GNU-Social Protocol Settings updated."
+msgstr "Se han actualizado los ajustes del protocolo de GNU-Social."
-#: ../../extend/addon/addon/dwpost/dwpost.php:85
-msgid "Post to Dreamwidth by default"
-msgstr "Publicar en Dreamwidth de forma predeterminada"
+#: ../../addon/gnusoc/gnusoc.php:130
+msgid "Enable the GNU-Social protocol for this channel"
+msgstr "Activar el protocolo de GNU-Social para este canal"
-#: ../../extend/addon/addon/dwpost/dwpost.php:89
-msgid "Dreamwidth Post Settings"
-msgstr "Ajustes de publicación en Dreamwidth"
+#: ../../addon/gnusoc/gnusoc.php:134
+msgid "GNU-Social Protocol Settings"
+msgstr "Ajustes del protocolo de GNU-Social"
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:45
-msgid "Flattr this!"
-msgstr "¡Apoyar esto en Flattr!"
+#: ../../addon/gnusoc/gnusoc.php:324
+msgid "Follow"
+msgstr "Seguir"
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:83
-msgid "Flattr widget settings updated."
-msgstr "Los ajustes del widget Flattr han sido actualizados."
+#: ../../addon/gnusoc/gnusoc.php:327
+#, php-format
+msgid "%1$s is now following %2$s"
+msgstr "%1$s está siguiendo ahora a %2$s"
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:100
-msgid "Flattr user"
-msgstr "Usuario en Flattr"
+#: ../../addon/cdav/Mod_Cdav.php:744
+msgid "INVALID EVENT DISMISSED!"
+msgstr "¡EVENTO NO VÃLIDO RECHAZADO!"
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:104
-msgid "URL of the Thing to flattr"
-msgstr "URL de la Cosa para apoyar en flattr"
+#: ../../addon/cdav/Mod_Cdav.php:745
+msgid "Summary: "
+msgstr "Resumen: "
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:104
-msgid "If empty channel URL is used"
-msgstr "Si está vacío, se usa la URL del canal"
+#: ../../addon/cdav/Mod_Cdav.php:746
+msgid "Date: "
+msgstr "Fecha: "
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:108
-msgid "Title of the Thing to flattr"
-msgstr "Título de la Cosa para apoyar en flattr"
+#: ../../addon/cdav/Mod_Cdav.php:747 ../../addon/cdav/Mod_Cdav.php:754
+msgid "Reason: "
+msgstr "Razón: "
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:108
-msgid "If empty \"channel name on The Hubzilla\" will be used"
-msgstr "Si está vacío, se usará \"nombre del canal en Hubzilla\""
+#: ../../addon/cdav/Mod_Cdav.php:752
+msgid "INVALID CARD DISMISSED!"
+msgstr "¡TARJETA NO VÃLIDA RECHAZADA!"
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:112
-msgid "Static or dynamic flattr button"
-msgstr "Botón de flattr estático o dinámico"
+#: ../../addon/cdav/Mod_Cdav.php:753
+msgid "Name: "
+msgstr "Nombre: "
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:112
-msgid "static"
-msgstr "estático"
+#: ../../addon/cdav/Mod_Cdav.php:770
+msgid ""
+"You have to enable this plugin in Feature/Addon Settings > CalDAV/CardDAV "
+"Settings before you can use it."
+msgstr "Debe habilitar este complemento en Ajustes/Complementos>Configuración de CalDAV/CardDAV antes de poder utilizarlo."
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:112
-msgid "dynamic"
-msgstr "dinámico"
+#: ../../addon/cdav/Mod_Cdav.php:836 ../../addon/cdav/Mod_Cdav.php:837
+msgid "Example: YYYY-MM-DD HH:mm"
+msgstr "Ejemplo: YYYY-MM-DD HH:mm"
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:116
-msgid "Alignment of the widget"
-msgstr "Alineamiento del widget"
+#: ../../addon/cdav/Mod_Cdav.php:837
+msgid "End date and time"
+msgstr "Fecha y hora de finalización"
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:116
-msgid "left"
-msgstr "izquierda"
+#: ../../addon/cdav/Mod_Cdav.php:852
+msgid "List month"
+msgstr "Lista mensual"
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:116
-msgid "right"
-msgstr "derecha"
+#: ../../addon/cdav/Mod_Cdav.php:853
+msgid "List week"
+msgstr "Lista semanal"
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:120
-msgid "Enable Flattr widget"
-msgstr "Habilitar el widget Flattr"
+#: ../../addon/cdav/Mod_Cdav.php:854
+msgid "List day"
+msgstr "Lista diaria"
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:124
-msgid "Flattr Widget Settings"
-msgstr "Ajustes del widget Flattr"
+#: ../../addon/cdav/Mod_Cdav.php:861
+msgid "More"
+msgstr "Más"
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:118
-msgid "Contact not found."
-msgstr "No se ha encontrado el contacto."
+#: ../../addon/cdav/Mod_Cdav.php:862
+msgid "Less"
+msgstr "Menos"
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:119
-msgid ""
-"This may occasionally happen if contact was requested by both persons and it"
-" has already been approved."
-msgstr "Esto puede ocurrir de vez en cuando si el contacto fue solicitado por ambas personas y ya había sido aprobado."
+#: ../../addon/cdav/Mod_Cdav.php:863
+msgid "Select calendar"
+msgstr "Seleccionar un calendario"
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:238
-msgid "Response from remote site was not understood."
-msgstr "No se entendió la respuesta del sitio remoto."
+#: ../../addon/cdav/Mod_Cdav.php:865
+msgid "Delete all"
+msgstr "Eliminar todos"
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:247
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:252
-msgid "Unexpected response from remote site: "
-msgstr "Respuesta inesperada desde el sitio remoto: "
+#: ../../addon/cdav/Mod_Cdav.php:867
+msgid "Sorry! Editing of recurrent events is not yet implemented."
+msgstr "¡Disculpas! La edición de eventos recurrentes aún no se ha implementado."
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:261
-msgid "Confirmation completed successfully."
-msgstr "La confirmación se ha completado satisfactoriamente."
+#: ../../addon/cdav/cdav.php:36
+msgid "Errors encountered creating database table: "
+msgstr "Errores encontrados al crear la tabla de la base de datos: "
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:263
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:277
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:284
-msgid "Remote site reported: "
-msgstr "El sitio remoto informó: "
+#: ../../addon/cdav/cdav.php:197
+msgid "Default Calendar"
+msgstr "Calendario por defecto"
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:275
-msgid "Temporary failure. Please wait and try again."
-msgstr "Fallo temporal. Por favor, espere e inténtelo de nuevo."
+#: ../../addon/cdav/cdav.php:206
+msgid "Default Addressbook"
+msgstr "Agenda de direcciones por defecto"
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:282
-msgid "Introduction failed or was revoked."
-msgstr "La solicitud ha fallado o ha sido revocada."
+#: ../../addon/cdav/cdav.php:215
+msgid "CalDAV/CardDAV Settings saved."
+msgstr "Se ha guardado la configuración de CalDAV/CardDAV."
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:428
-msgid "Unable to set contact photo."
-msgstr "No se puede establecer la foto del contacto."
+#: ../../addon/cdav/cdav.php:234
+msgid "Enable CalDAV/CardDAV Server for this channel"
+msgstr "Habilitar el servidor CalDAV/CardDAV para este canal"
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:485
+#: ../../addon/cdav/cdav.php:237
#, php-format
-msgid "%1$s is now friends with %2$s"
-msgstr "%1$s es amigo ahora de %2$s"
+msgid "Your CalDAV resources are located at %s "
+msgstr "Los recursos de CalDAV se encuentran en %s"
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:570
+#: ../../addon/cdav/cdav.php:240
#, php-format
-msgid "No user record found for '%s' "
-msgstr "No se encuentra ningún registro de usuario para '%s' "
+msgid "Your CardDAV resources are located at %s "
+msgstr "Sus recursos de CalDAV están localizados en %s "
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:580
-msgid "Our site encryption key is apparently messed up."
-msgstr "La clave de cifrado de nuestro sitio está aparentemente en mal estado."
+#: ../../addon/cdav/cdav.php:246
+msgid "CalDAV/CardDAV Settings"
+msgstr "Configuración de CalDAV/CardDAV"
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:591
-msgid "Empty site URL was provided or URL could not be decrypted by us."
-msgstr "Se ha proporcionado la URL de un sitio inexistente o la URL no ha podido ser descifrada por nosotros."
+#: ../../addon/cdav/cdav.php:272 ../../include/connections.php:670
+msgid "Home, Voice"
+msgstr "Llamadas particulares"
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:612
-msgid "Contact record was not found for you on our site."
-msgstr "No se ha encontrado un registro de contacto para usted en nuestro sitio."
+#: ../../addon/cdav/cdav.php:273 ../../include/connections.php:671
+msgid "Home, Fax"
+msgstr "Fax particular"
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:626
-#, php-format
-msgid "Site public key not available in contact record for URL %s."
-msgstr "La clave del sitio público no está disponible en el registro de contacto para la URL %s."
+#: ../../addon/cdav/cdav.php:275 ../../include/connections.php:673
+msgid "Work, Voice"
+msgstr "Llamadas de trabajo"
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:646
-msgid ""
-"The ID provided by your system is a duplicate on our system. It should work "
-"if you try again."
-msgstr "La ID proporcionada por su sistema está duplicada en el nuestro. Debería funcionar si lo intenta de nuevo."
+#: ../../addon/cdav/cdav.php:276 ../../include/connections.php:674
+msgid "Work, Fax"
+msgstr "Fax de trabajo"
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:657
-msgid "Unable to set your contact credentials on our system."
-msgstr "No se pueden establecer sus credenciales de contacto en nuestro sistema."
+#: ../../addon/cdav/include/widgets.php:37
+msgid "Select Channel"
+msgstr "Seleccionar un canal"
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:724
-msgid "Unable to update your contact profile details on our system"
-msgstr "No se pueden actualizar los detalles del perfil de su contacto en nuestro sistema"
+#: ../../addon/cdav/include/widgets.php:42
+msgid "Read-write"
+msgstr "Lectura y escritura"
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:751
-#: ../../extend/addon/addon/friendica/dfrn_request.php:749
-msgid "[Name Withheld]"
-msgstr "[Nombre omitido]"
+#: ../../addon/cdav/include/widgets.php:43
+msgid "Read-only"
+msgstr "Sólo lectura"
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:796
-#, php-format
-msgid "%1$s has joined %2$s"
-msgstr "%1$s se ha unido a %2$s"
+#: ../../addon/cdav/include/widgets.php:116
+msgid "My Calendars"
+msgstr "Mis calendarios"
-#: ../../extend/addon/addon/friendica/dfrn_poll.php:103
-#: ../../extend/addon/addon/friendica/dfrn_poll.php:536
-#, php-format
-msgid "%1$s welcomes %2$s"
-msgstr "%1$s da la bienvenida a %2$s"
+#: ../../addon/cdav/include/widgets.php:118
+msgid "Shared Calendars"
+msgstr "Calendarios compartidos"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:102
-msgid "This introduction has already been accepted."
-msgstr "Esta solicitud ya ha sido aceptada."
+#: ../../addon/cdav/include/widgets.php:122
+msgid "Share this calendar"
+msgstr "Compartir este calendario"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:123
-#: ../../extend/addon/addon/friendica/dfrn_request.php:528
-msgid "Profile location is not valid or does not contain profile information."
-msgstr "La ubicación del perfil no es válida o no contiene información del perfil."
+#: ../../addon/cdav/include/widgets.php:124
+msgid "Calendar name and color"
+msgstr "Nombre y color del calendario"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:128
-#: ../../extend/addon/addon/friendica/dfrn_request.php:533
-msgid "Warning: profile location has no identifiable owner name."
-msgstr "Advertencia: el perfil de la ubicación no tiene un nombre de propietario identificable."
+#: ../../addon/cdav/include/widgets.php:126
+msgid "Create new calendar"
+msgstr "Crear un nuevo calendario"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:130
-#: ../../extend/addon/addon/friendica/dfrn_request.php:535
-msgid "Warning: profile location has no profile photo."
-msgstr "Advertencia: el perfil de la ubicación no tiene ninguna foto de perfil."
+#: ../../addon/cdav/include/widgets.php:128
+msgid "Calendar Name"
+msgstr "Nombre del calendario"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:133
-#: ../../extend/addon/addon/friendica/dfrn_request.php:538
-#, php-format
-msgid "%d required parameter was not found at the given location"
-msgid_plural "%d required parameters were not found at the given location"
-msgstr[0] "Los parámetros requeridos de %d no se han encontrado en la localización proporcionada"
-msgstr[1] "Los parámetros requeridos de %d no se han encontrado en la localización proporcionada"
+#: ../../addon/cdav/include/widgets.php:129
+msgid "Calendar Tools"
+msgstr "Gestión de calendarios"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:180
-msgid "Introduction complete."
-msgstr "Solicitud completa."
+#: ../../addon/cdav/include/widgets.php:130
+msgid "Import calendar"
+msgstr "Importar un calendario"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:224
-msgid "Unrecoverable protocol error."
-msgstr "Error irrecuperable de protocolo."
+#: ../../addon/cdav/include/widgets.php:131
+msgid "Select a calendar to import to"
+msgstr "Seleccionar un calendario para importarlo"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:252
-msgid "Profile unavailable."
-msgstr "Perfil no disponible."
+#: ../../addon/cdav/include/widgets.php:158
+msgid "Addressbooks"
+msgstr "Agenda de direcciones"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:277
-#, php-format
-msgid "%s has received too many connection requests today."
-msgstr "%s ha recibido demasiadas peticiones de conexión hoy."
+#: ../../addon/cdav/include/widgets.php:160
+msgid "Addressbook name"
+msgstr "Nombre de la agenda"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:278
-msgid "Spam protection measures have been invoked."
-msgstr "Se han activado las medidas de protección contra el spam."
+#: ../../addon/cdav/include/widgets.php:162
+msgid "Create new addressbook"
+msgstr "Crear una nueva agenda de direcciones"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:279
-msgid "Friends are advised to please try again in 24 hours."
-msgstr "Se aconseja a los amigos que por favor lo intenten de nuevo en 24 horas."
+#: ../../addon/cdav/include/widgets.php:163
+msgid "Addressbook Name"
+msgstr "Nombre de la agenda"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:341
-msgid "Invalid locator"
-msgstr "Localizador no válido"
+#: ../../addon/cdav/include/widgets.php:165
+msgid "Addressbook Tools"
+msgstr "Gestión de agendas de direcciones"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:350
-msgid "Invalid email address."
-msgstr "Dirección de correo no válida."
+#: ../../addon/cdav/include/widgets.php:166
+msgid "Import addressbook"
+msgstr "Importar una agenda de direcciones"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:377
-msgid "This account has not been configured for email. Request failed."
-msgstr "Esta cuenta no se ha configurado para el correo electrónico. La petición ha fallado."
+#: ../../addon/cdav/include/widgets.php:167
+msgid "Select an addressbook to import to"
+msgstr "Seleccionar una agenda para importarla"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:473
-msgid "Unable to resolve your name at the provided location."
-msgstr "No se puede resolver el nombre en la localización proporcionada."
+#: ../../addon/planets/planets.php:121
+msgid "Planets Settings updated."
+msgstr "Se han guardado los ajustes de Planets."
-#: ../../extend/addon/addon/friendica/dfrn_request.php:486
-msgid "You have already introduced yourself here."
-msgstr "Ya se ha inscrito usted mismo aquí."
+#: ../../addon/planets/planets.php:153
+msgid "Enable Planets Plugin"
+msgstr "Habilitar el plugin Planets"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:490
-#, php-format
-msgid "Apparently you are already friends with %s."
-msgstr "Al parecer ya es amigo de %s"
+#: ../../addon/planets/planets.php:157
+msgid "Planets Settings"
+msgstr "Ajustes de Planets"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:511
-msgid "Invalid profile URL."
-msgstr "URL del perfil no válida."
+#: ../../addon/openclipatar/openclipatar.php:50
+#: ../../addon/openclipatar/openclipatar.php:128
+msgid "System defaults:"
+msgstr "Valores predeterminados del sistema: "
-#: ../../extend/addon/addon/friendica/dfrn_request.php:517
-msgid "Disallowed profile URL."
-msgstr "No se ha permitido la URL del perfil."
+#: ../../addon/openclipatar/openclipatar.php:54
+msgid "Preferred Clipart IDs"
+msgstr "IDs de las imágenes clipart preferidas"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:587
-msgid "Failed to update contact record."
-msgstr "Se ha producido un error al actualizar el registro del contacto."
+#: ../../addon/openclipatar/openclipatar.php:54
+msgid "List of preferred clipart ids. These will be shown first."
+msgstr "Lista de ids de imágenes de clipart preferidas. Se verán en primer lugar."
-#: ../../extend/addon/addon/friendica/dfrn_request.php:608
-msgid "Your introduction has been sent."
-msgstr "Su solicitud ha sido enviada."
+#: ../../addon/openclipatar/openclipatar.php:55
+msgid "Default Search Term"
+msgstr "Términos de búsqueda predeterminados"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:662
-msgid "Please login to confirm introduction."
-msgstr "Por favor, inicie sesión para confirmar la solicitud."
+#: ../../addon/openclipatar/openclipatar.php:55
+msgid "The default search term. These will be shown second."
+msgstr "Los términos de búsqueda predeterminados. Estos se mostrarán en segundo lugar."
-#: ../../extend/addon/addon/friendica/dfrn_request.php:676
-msgid ""
-"Incorrect identity currently logged in. Please login to "
-"<strong>this</strong> profile."
-msgstr "Actualmente su identidad en el sistema es incorrecta. Por favor, inicie sesión en <strong>este</strong> perfil."
+#: ../../addon/openclipatar/openclipatar.php:56
+msgid "Return After"
+msgstr "Regresar después"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:690
-#: ../../extend/addon/addon/friendica/dfrn_request.php:707
-msgid "Confirm"
-msgstr "Confirmar"
+#: ../../addon/openclipatar/openclipatar.php:56
+msgid "Page to load after image selection."
+msgstr "Página para cargar después de la selección de imágenes."
-#: ../../extend/addon/addon/friendica/dfrn_request.php:702
-msgid "Hide this contact"
-msgstr "Ocultar este contacto"
+#: ../../addon/openclipatar/openclipatar.php:58 ../../include/channel.php:1048
+#: ../../include/nav.php:111
+msgid "Edit Profile"
+msgstr "Editar el perfil"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:705
-#, php-format
-msgid "Welcome home %s."
-msgstr "Bienvenido a la página principal %s."
+#: ../../addon/openclipatar/openclipatar.php:59
+msgid "Profile List"
+msgstr "Lista de perfiles"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:706
-#, php-format
-msgid "Please confirm your introduction/connection request to %s."
-msgstr "Por favor, confirme su solicitud de conexión a %s."
+#: ../../addon/openclipatar/openclipatar.php:61
+msgid "Order of Preferred"
+msgstr "Orden de preferencia"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:836
-msgid ""
-"Please enter your 'Identity Address' from one of the following supported "
-"communications networks:"
-msgstr "Por favor, elija su 'dirección identificativa' de entre las siguientes redes de comunicación soportadas: "
+#: ../../addon/openclipatar/openclipatar.php:61
+msgid "Sort order of preferred clipart ids."
+msgstr "Orden de clasificación de los identificadores de imágenes clipart preferidas."
-#: ../../extend/addon/addon/friendica/dfrn_request.php:857
-#, php-format
-msgid ""
-"If you are not yet a member of the free social web, <a "
-"href=\"%s/siteinfo\">follow this link to find a public Friendica site and "
-"join us today</a>."
-msgstr "Si aún no es miembro de las redes sociales libres, <a href=\"%s/siteinfo\">siga este enlace para encontrar un sitio público de Friendica y unirse a nosotros hoy</a>."
+#: ../../addon/openclipatar/openclipatar.php:62
+#: ../../addon/openclipatar/openclipatar.php:68
+msgid "Newest first"
+msgstr "Las más nuevas en primer lugar"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:862
-msgid "Friend/Connection Request"
-msgstr "Solicitud de conexión o amistad"
+#: ../../addon/openclipatar/openclipatar.php:65
+msgid "As entered"
+msgstr "Tal como se ingresaron"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:863
-msgid ""
-"Examples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, "
-"testuser@identi.ca"
-msgstr "Ejemplos: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, testuser@identi.ca"
+#: ../../addon/openclipatar/openclipatar.php:67
+msgid "Order of other"
+msgstr "Orden de los demás"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:864
-msgid "Please answer the following:"
-msgstr "Por favor, responda a lo siguiente: "
+#: ../../addon/openclipatar/openclipatar.php:67
+msgid "Sort order of other clipart ids."
+msgstr "Orden de clasificación de otros ids de imágenes clipart."
-#: ../../extend/addon/addon/friendica/dfrn_request.php:865
-#, php-format
-msgid "Does %s know you?"
-msgstr "¿%s le conoce?"
+#: ../../addon/openclipatar/openclipatar.php:69
+msgid "Most downloaded first"
+msgstr "Las más descargadas en primer lugar"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:869
-msgid "Add a personal note:"
-msgstr "Añadir un comentario personal: "
+#: ../../addon/openclipatar/openclipatar.php:70
+msgid "Most liked first"
+msgstr "Las más apreciadas en primer lugar"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:871
-#: ../../include/network.php:2265 ../../include/network.php:2266
-msgid "Friendica"
-msgstr "Friendica"
+#: ../../addon/openclipatar/openclipatar.php:72
+msgid "Preferred IDs Message"
+msgstr "Mensaje de IDs preferido"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:872
-msgid "StatusNet/Federated Social Web"
-msgstr "Red social federada StatusNet"
+#: ../../addon/openclipatar/openclipatar.php:72
+msgid "Message to display above preferred results."
+msgstr "Mensaje para mostrar sobre los resultados preferidos."
-#: ../../extend/addon/addon/friendica/dfrn_request.php:873
-#: ../../include/network.php:2271
-msgid "Diaspora"
-msgstr "Diaspora"
+#: ../../addon/openclipatar/openclipatar.php:78
+msgid "Uploaded by: "
+msgstr "Subida por: "
-#: ../../extend/addon/addon/friendica/dfrn_request.php:874
-#, php-format
+#: ../../addon/openclipatar/openclipatar.php:78
+msgid "Drawn by: "
+msgstr "Creada por: "
+
+#: ../../addon/openclipatar/openclipatar.php:192
+msgid "Or select from a free OpenClipart.org image:"
+msgstr "O seleccionar una imagen gratuita de OpenClipart.org: "
+
+#: ../../addon/openclipatar/openclipatar.php:195
+msgid "Search Term"
+msgstr "Término de búsqueda"
+
+#: ../../addon/openclipatar/openclipatar.php:232
+msgid "Unknown error. Please try again later."
+msgstr "Error desconocido. Por favor, inténtelo otra vez."
+
+#: ../../addon/openclipatar/openclipatar.php:308
+msgid "Profile photo updated successfully."
+msgstr "Se ha actualizado con éxito la foto de perfil."
+
+#: ../../addon/adultphotoflag/adultphotoflag.php:24
+msgid "Flag Adult Photos"
+msgstr "Indicador (\"flag\") de fotos de adultos"
+
+#: ../../addon/adultphotoflag/adultphotoflag.php:25
msgid ""
-" - please do not use this form. Instead, enter %s into your Diaspora search"
-" bar."
-msgstr "- Por favor, no use este formato. En su lugar, escriba %s en la barra de búsqueda de Diaspora."
+"Provide photo edit option to hide inappropriate photos from default album "
+"view"
+msgstr "Proporcionar una opción de edición de fotos para ocultar las fotos inapropiadas de la vista de álbum predeterminada"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:875
-msgid "Your Identity Address:"
-msgstr "Su dirección identificativa: "
+#: ../../addon/wppost/wppost.php:45
+msgid "Post to WordPress"
+msgstr "Publicar en WordPress"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:878
-msgid "Submit Request"
-msgstr "Enviar la solicitud"
+#: ../../addon/wppost/wppost.php:82
+msgid "Enable WordPress Post Plugin"
+msgstr "Habilitar el plugin de publicación en WordPress"
-#: ../../extend/addon/addon/friendica/friendica.php:113
-#: ../../extend/addon/addon/gnusoc/gnusoc.php:118
-msgid "GNU-Social Protocol Settings updated."
-msgstr "Se han actualizado los ajustes del protocolo de GNU-Social."
+#: ../../addon/wppost/wppost.php:86
+msgid "WordPress username"
+msgstr "Nombre de usuario de WordPress"
-#: ../../extend/addon/addon/friendica/friendica.php:124
-msgid "Enable the (experimental) GNU-Social protocol for this channel"
-msgstr "Activar el protocolo (experimental) de GNU-Social para este canal"
+#: ../../addon/wppost/wppost.php:90
+msgid "WordPress password"
+msgstr "Contraseña de WordPress"
-#: ../../extend/addon/addon/friendica/friendica.php:128
-#: ../../extend/addon/addon/gnusoc/gnusoc.php:133
-msgid "GNU-Social Protocol Settings"
-msgstr "Ajustes del protocolo de GNU-Social"
+#: ../../addon/wppost/wppost.php:94
+msgid "WordPress API URL"
+msgstr "URL de la API de WordPress"
-#: ../../extend/addon/addon/friendica/friendica.php:185
-#: ../../extend/addon/addon/gnusoc/gnusoc.php:323
-msgid "Follow"
-msgstr "Seguir"
+#: ../../addon/wppost/wppost.php:95
+msgid "Typically https://your-blog.tld/xmlrpc.php"
+msgstr "Habitualmente https://your-blog.tld/xmlrpc.php"
-#: ../../extend/addon/addon/friendica/friendica.php:188
-#: ../../extend/addon/addon/gnusoc/gnusoc.php:326
-#, php-format
-msgid "%1$s is now following %2$s"
-msgstr "%1$s está siguiendo ahora a %2$s"
+#: ../../addon/wppost/wppost.php:98
+msgid "WordPress blogid"
+msgstr "Blog de WordPress"
-#: ../../extend/addon/addon/frphotos/frphotos.php:91
-msgid "Friendica Photo Album Import"
-msgstr "Importar un álbum de fotos de Friendica"
+#: ../../addon/wppost/wppost.php:99
+msgid "For multi-user sites such as wordpress.com, otherwise leave blank"
+msgstr "Para sitios multiusuario como wordpress.com, de lo contrario, dejar en blanco"
-#: ../../extend/addon/addon/frphotos/frphotos.php:92
-msgid "This will import all your Friendica photo albums to this Red channel."
-msgstr "Esto importará todos sus álbumes de fotos de Friendica a este canal de Hubzilla."
+#: ../../addon/wppost/wppost.php:105
+msgid "Post to WordPress by default"
+msgstr "Publicar en WordPress por defecto"
-#: ../../extend/addon/addon/frphotos/frphotos.php:93
-msgid "Friendica Server base URL"
-msgstr "URL base del servidor de Friendica"
+#: ../../addon/wppost/wppost.php:109
+msgid "Forward comments (requires hubzilla_wp plugin)"
+msgstr "Reenviar comentarios (requerido por el plugin hubzilla_wp)"
-#: ../../extend/addon/addon/frphotos/frphotos.php:94
-msgid "Friendica Login Username"
-msgstr "Nombre de inicio de sesión en Friendica"
+#: ../../addon/wppost/wppost.php:113
+msgid "WordPress Post Settings"
+msgstr "Ajustes de publicación en WordPress"
-#: ../../extend/addon/addon/frphotos/frphotos.php:95
-msgid "Friendica Login Password"
-msgstr "Contraseña de inicio de sesión en Friendica"
+#: ../../addon/wppost/wppost.php:129
+msgid "Wordpress Settings saved."
+msgstr "Se han guardado los ajustes de WordPress."
-#: ../../extend/addon/addon/hubwall/hubwall.php:19
-msgid "Send email to all members"
-msgstr "Enviar un correo electrónico a todos los miembros"
+#: ../../addon/nsfw/nsfw.php:80
+msgid ""
+"This plugin looks in posts for the words/text you specify below, and "
+"collapses any content containing those keywords so it is not displayed at "
+"inappropriate times, such as sexual innuendo that may be improper in a work "
+"setting. It is polite and recommended to tag any content containing nudity "
+"with #NSFW. This filter can also match any other word/text you specify, and"
+" can thereby be used as a general purpose content filter."
+msgstr "Este complemento busca en los mensajes las palabras o texto que se especifican a continuación y contrae cualquier contenido que contenga esas palabras clave para que no se muestre en momentos inapropiados, como insinuaciones sexuales que pueden ser impropias en un entorno de trabajo. Es una muestra de educación y se recomienda marcar cualquier contenido que contenga desnudos con #NSFW. Este filtro también puede coincidir con cualquier otra palabra o texto que especifique y, por lo tanto, puede utilizarse como un filtro de contenido de propósito general."
-#: ../../extend/addon/addon/hubwall/hubwall.php:33
-#, php-format
-msgid "$1%s Administrator"
-msgstr "Administrador de $1%s "
+#: ../../addon/nsfw/nsfw.php:84
+msgid "Enable Content filter"
+msgstr "Habilitar filtro de contenido"
-#: ../../extend/addon/addon/hubwall/hubwall.php:50
-#: ../../extend/addon/addon/mailtest/mailtest.php:50
-msgid "No recipients found."
-msgstr "No se han encontrado destinatarios."
+#: ../../addon/nsfw/nsfw.php:88
+msgid "Comma separated list of keywords to hide"
+msgstr "Lista separada por comas de palabras clave para ocultar"
-#: ../../extend/addon/addon/hubwall/hubwall.php:73
-#, php-format
-msgid "%1$d of %2$d messages sent."
-msgstr "%1$d de %2$d mensajes enviados."
+#: ../../addon/nsfw/nsfw.php:88
+msgid "Word, /regular-expression/, lang=xx, lang!=xx"
+msgstr "Palabra, /expresión regular/, lang=xx, lang!=xx"
-#: ../../extend/addon/addon/hubwall/hubwall.php:81
-msgid "Send email to all hub members."
-msgstr "Enviar un correo electrónico a todos los miembros del hub."
+#: ../../addon/nsfw/nsfw.php:92
+msgid "Not Safe For Work Settings"
+msgstr "No es seguro para ajustes de trabajo"
-#: ../../extend/addon/addon/hubwall/hubwall.php:92
-#: ../../extend/addon/addon/mailtest/mailtest.php:96
-msgid "Message subject"
-msgstr "Asunto del mensaje"
+#: ../../addon/nsfw/nsfw.php:92
+msgid "General Purpose Content Filter"
+msgstr "Filtro de contenido de propósito general"
-#: ../../extend/addon/addon/hubwall/hubwall.php:93
-msgid "Sender Email address"
-msgstr "Dirección de correo electrónico del remitente"
+#: ../../addon/nsfw/nsfw.php:110
+msgid "NSFW Settings saved."
+msgstr "Se han guardado los ajustes de NSFW."
-#: ../../extend/addon/addon/hubwall/hubwall.php:94
-msgid "Test mode (only send to hub administrator)"
-msgstr "Modo de prueba (enviar sólo al administrador del hub)"
+#: ../../addon/nsfw/nsfw.php:207
+msgid "Possible adult content"
+msgstr "Posible contenido para adultos"
+
+#: ../../addon/nsfw/nsfw.php:211
+#, php-format
+msgid "%s - view"
+msgstr "ver - %s"
-#: ../../extend/addon/addon/ijpost/ijpost.php:42
+#: ../../addon/ijpost/ijpost.php:42
msgid "Post to Insanejournal"
msgstr "Publicar en Insanejournal"
-#: ../../extend/addon/addon/ijpost/ijpost.php:73
+#: ../../addon/ijpost/ijpost.php:73
msgid "Enable InsaneJournal Post Plugin"
msgstr "Habilitar el plugin de publicación en InsaneJournal"
-#: ../../extend/addon/addon/ijpost/ijpost.php:77
+#: ../../addon/ijpost/ijpost.php:77
msgid "InsaneJournal username"
msgstr "Nombre de usuario en InsaneJournal"
-#: ../../extend/addon/addon/ijpost/ijpost.php:81
+#: ../../addon/ijpost/ijpost.php:81
msgid "InsaneJournal password"
msgstr "Contraseña en InsaneJournal"
-#: ../../extend/addon/addon/ijpost/ijpost.php:85
+#: ../../addon/ijpost/ijpost.php:85
msgid "Post to InsaneJournal by default"
msgstr "Publicar por defecto en InsaneJournal"
-#: ../../extend/addon/addon/ijpost/ijpost.php:89
+#: ../../addon/ijpost/ijpost.php:89
msgid "InsaneJournal Post Settings"
msgstr "Ajustes de publicación en InsaneJournal"
-#: ../../extend/addon/addon/ijpost/ijpost.php:104
+#: ../../addon/ijpost/ijpost.php:104
msgid "Insane Journal Settings saved."
msgstr "Se han guardado los ajustes de InsaneJournal."
-#: ../../extend/addon/addon/irc/irc.php:45
-msgid "Channels to auto connect"
-msgstr "Canales para conexión automática"
+#: ../../addon/js_upload/js_upload.php:44
+msgid "Upload a file"
+msgstr "Subir un fichero"
-#: ../../extend/addon/addon/irc/irc.php:45
-#: ../../extend/addon/addon/irc/irc.php:49
-msgid "Comma separated list"
-msgstr "Lista separada por comas"
+#: ../../addon/js_upload/js_upload.php:45
+msgid "Drop files here to upload"
+msgstr "Arrastre los ficheros aquí para subirlos"
-#: ../../extend/addon/addon/irc/irc.php:49
-#: ../../extend/addon/addon/irc/irc.php:96
-msgid "Popular Channels"
-msgstr "Canales populares"
+#: ../../addon/js_upload/js_upload.php:47
+msgid "Failed"
+msgstr "Ha fallado"
-#: ../../extend/addon/addon/irc/irc.php:53
-msgid "IRC Settings"
-msgstr "Ajustes de IRC"
+#: ../../addon/js_upload/js_upload.php:315
+msgid "No files were uploaded."
+msgstr "No se han subido ficheros."
-#: ../../extend/addon/addon/irc/irc.php:69
-msgid "IRC settings saved."
-msgstr "Se han guardado los ajustes de IRC."
+#: ../../addon/js_upload/js_upload.php:322
+msgid "Uploaded file is empty"
+msgstr "El fichero subido está vacío"
-#: ../../extend/addon/addon/irc/irc.php:74
-msgid "IRC Chatroom"
-msgstr "Sala de chat IRC"
+#: ../../addon/js_upload/js_upload.php:335
+msgid "Image exceeds size limit of "
+msgstr "La imagen supera el límite de tamaño de "
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:305
-#: ../../include/channel.php:1139 ../../include/channel.php:1301
-msgid "Status:"
-msgstr "Estado:"
+#: ../../addon/js_upload/js_upload.php:347
+msgid "File has an invalid extension, it should be one of "
+msgstr "El fichero tiene una extensión no válida, debería ser una de estas: "
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:309
-msgid "Activate addon"
-msgstr "Habilitar complemento"
+#: ../../addon/js_upload/js_upload.php:359
+msgid "Upload was cancelled, or server error encountered"
+msgstr "Se canceló la carga o se encontró un error del servidor"
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:313
-msgid "Hide Jappixmini Chat-Widget from the webinterface"
-msgstr "Ocultar el widget de chat Jappixmini en la interfaz web"
+#: ../../addon/dwpost/dwpost.php:42
+msgid "Post to Dreamwidth"
+msgstr "Publicar en Dreamwidth"
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:318
-msgid "Jabber username"
-msgstr "Nombre de usuario en Jabber"
+#: ../../addon/dwpost/dwpost.php:73
+msgid "Enable Dreamwidth Post Plugin"
+msgstr "Activar el plugin de publicación en Dreamwidth"
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:324
-msgid "Jabber server"
-msgstr "Servidor de Jabber"
+#: ../../addon/dwpost/dwpost.php:77
+msgid "Dreamwidth username"
+msgstr "Nombre de usuario en Dreamwidth"
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:330
-msgid "Jabber BOSH host URL"
-msgstr "URL del host BOSH de Jabber"
+#: ../../addon/dwpost/dwpost.php:81
+msgid "Dreamwidth password"
+msgstr "Contraseña en Dreamwidth"
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:337
-msgid "Jabber password"
-msgstr "Contraseña en Jabber"
+#: ../../addon/dwpost/dwpost.php:85
+msgid "Post to Dreamwidth by default"
+msgstr "Publicar en Dreamwidth de forma predeterminada"
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:343
-msgid "Encrypt Jabber password with Hubzilla password"
-msgstr "Cifrar la contraseña de Jabber con la contraseña de Hubzilla"
+#: ../../addon/dwpost/dwpost.php:89
+msgid "Dreamwidth Post Settings"
+msgstr "Ajustes de publicación en Dreamwidth"
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:347
-#: ../../extend/addon/addon/redred/redred.php:115
-msgid "Hubzilla password"
-msgstr "Contraseña de Hubzilla"
+#: ../../addon/firefox/firefox.php:23
+msgid "Install Firefox Sharing Tools"
+msgstr "Instalar las herramientas de compartición de Firefox"
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:351
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:355
-msgid "Approve subscription requests from Hubzilla contacts automatically"
-msgstr "Aprobar automáticamente las solicitudes de suscripción de los contactos de Hubzilla"
+#: ../../addon/firefox/firefox.php:34
+msgid "Share content from Firefox to $Projectname"
+msgstr "Compartir contenido desde Firefox a $Projectname"
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:359
-msgid "Purge internal list of jabber addresses of contacts"
-msgstr "Purgar la lista interna de las direcciones de contactos de jabber"
+#: ../../addon/firefox/firefox.php:37
+msgid "Install Firefox Sharing Tools to this web browser"
+msgstr "Instalar las herramientas de compartición de Firefox en este navegador"
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:364
-msgid "Configuration Help"
-msgstr "Ayuda para los ajustes"
+#: ../../addon/dirstats/dirstats.php:94
+msgid "Hubzilla Directory Stats"
+msgstr "Estadísticas de directorio de Hubzilla"
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:371
-msgid "Jappix Mini Settings"
-msgstr "Ajustes de Jappix Mini"
+#: ../../addon/dirstats/dirstats.php:95
+msgid "Total Hubs"
+msgstr "Número total de servidores"
-#: ../../extend/addon/addon/js_upload/js_upload.php:44
-msgid "Upload a file"
-msgstr "Subir un fichero"
+#: ../../addon/dirstats/dirstats.php:97
+msgid "Hubzilla Hubs"
+msgstr "Servidores (hubs) de Hubzilla"
-#: ../../extend/addon/addon/js_upload/js_upload.php:45
-msgid "Drop files here to upload"
-msgstr "Arrastre los ficheros aquí para subirlos"
+#: ../../addon/dirstats/dirstats.php:99
+msgid "Friendica Hubs"
+msgstr "Servidores (hubs) de Friendica"
-#: ../../extend/addon/addon/js_upload/js_upload.php:47
-msgid "Failed"
-msgstr "Ha fallado"
+#: ../../addon/dirstats/dirstats.php:101
+msgid "Diaspora Pods"
+msgstr "Servidores (pods) de Diaspora"
-#: ../../extend/addon/addon/js_upload/js_upload.php:315
-msgid "No files were uploaded."
-msgstr "No se han subido ficheros."
+#: ../../addon/dirstats/dirstats.php:103
+msgid "Hubzilla Channels"
+msgstr "Canales de Hubzilla"
-#: ../../extend/addon/addon/js_upload/js_upload.php:322
-msgid "Uploaded file is empty"
-msgstr "El fichero subido está vacío"
+#: ../../addon/dirstats/dirstats.php:105
+msgid "Friendica Channels"
+msgstr "Canales de Friendica"
-#: ../../extend/addon/addon/js_upload/js_upload.php:335
-msgid "Image exceeds size limit of "
-msgstr "La imagen supera el límite de tamaño de "
+#: ../../addon/dirstats/dirstats.php:107
+msgid "Diaspora Channels"
+msgstr "Canales de Diaspora"
-#: ../../extend/addon/addon/js_upload/js_upload.php:347
-msgid "File has an invalid extension, it should be one of "
-msgstr "El fichero tiene una extensión no válida, debería ser una de estas: "
+#: ../../addon/dirstats/dirstats.php:109
+msgid "Aged 35 and above"
+msgstr "De 35 años de edad en adelante"
-#: ../../extend/addon/addon/js_upload/js_upload.php:359
-msgid "Upload was cancelled, or server error encountered"
-msgstr "Se canceló la carga o se encontró un error del servidor"
+#: ../../addon/dirstats/dirstats.php:111
+msgid "Aged 34 and under"
+msgstr "De 34 o menos años de edad"
-#: ../../extend/addon/addon/ldapauth/ldapauth.php:61
-msgid "An account has been created for you."
-msgstr "Se ha creado una cuenta para usted."
+#: ../../addon/dirstats/dirstats.php:113
+msgid "Average Age"
+msgstr "Promedio de edad"
-#: ../../extend/addon/addon/ldapauth/ldapauth.php:68
-msgid "Authentication successful but rejected: account creation is disabled."
-msgstr "Autenticación correcta pero rechazada: la creación de cuentas está deshabilitada."
+#: ../../addon/dirstats/dirstats.php:115
+msgid "Known Chatrooms"
+msgstr "Salas de chat conocidas"
-#: ../../extend/addon/addon/libertree/libertree.php:38
-msgid "Post to Libertree"
-msgstr "Publicar en Libertree"
+#: ../../addon/dirstats/dirstats.php:117
+msgid "Known Tags"
+msgstr "Etiquetas conocidas"
-#: ../../extend/addon/addon/libertree/libertree.php:69
-msgid "Enable Libertree Post Plugin"
-msgstr "Habilitar el plugin de publicación en Libertree"
+#: ../../addon/dirstats/dirstats.php:119
+msgid ""
+"Please note Diaspora and Friendica statistics are merely those **this "
+"directory** is aware of, and not all those known in the network. This also "
+"applies to chatrooms,"
+msgstr "Tenga en cuenta que las estadísticas de Diaspora y Friendica se refieren únicamente a aquellas de las que **este directorio** es consciente, y no a todos los conocidos en la red. Esto también es aplicable a las salas de chat,"
-#: ../../extend/addon/addon/libertree/libertree.php:73
-msgid "Libertree API token"
-msgstr "Token de la API de Libertree"
+#: ../../addon/mailhost/mailhost.php:36
+msgid "Email notification hub"
+msgstr "Notificación por correo electrónico del hub"
-#: ../../extend/addon/addon/libertree/libertree.php:77
-msgid "Libertree site URL"
-msgstr "URL del servidor de Libertree"
+#: ../../addon/mailhost/mailhost.php:36
+msgid "Hostname"
+msgstr "Nombre del host"
-#: ../../extend/addon/addon/libertree/libertree.php:81
-msgid "Post to Libertree by default"
-msgstr "Publicar en Libertree por defecto"
+#: ../../addon/mailhost/mailhost.php:40
+msgid "Mailhost Settings"
+msgstr "Ajustes de Mailhost"
-#: ../../extend/addon/addon/libertree/libertree.php:85
-msgid "Libertree Post Settings"
-msgstr "Ajustes de publicación en Libertree"
+#: ../../addon/mailhost/mailhost.php:54
+msgid "MAILHOST Settings saved."
+msgstr "Se han guardado los ajustes de MAILHOST."
-#: ../../extend/addon/addon/libertree/libertree.php:99
-msgid "Libertree Settings saved."
-msgstr "Se han guardado los ajustes de Libertree."
+#: ../../addon/likebanner/likebanner.php:51
+msgid "Your Webbie:"
+msgstr "Su webbie: "
+
+#: ../../addon/likebanner/likebanner.php:54
+msgid "Fontsize (px):"
+msgstr "Tamaño de fuente (px): "
+
+#: ../../addon/likebanner/likebanner.php:68
+msgid "Link:"
+msgstr "Enlace: "
+
+#: ../../addon/likebanner/likebanner.php:70
+msgid "Like us on Hubzilla"
+msgstr "Múestrenos su agrado en Hubzilla"
+
+#: ../../addon/likebanner/likebanner.php:72
+msgid "Embed:"
+msgstr "Incorporado: "
+
+#: ../../addon/redphotos/redphotos.php:106
+msgid "Photos imported"
+msgstr "Se han importado las fotos"
+
+#: ../../addon/redphotos/redphotos.php:129
+msgid "Redmatrix Photo Album Import"
+msgstr "Importar un álbum de fotos de Redmatrix"
+
+#: ../../addon/redphotos/redphotos.php:130
+msgid "This will import all your Redmatrix photo albums to this channel."
+msgstr "Esto importará todos sus álbumes de fotos de Redmatrix a este canal."
+
+#: ../../addon/redphotos/redphotos.php:131
+#: ../../addon/redfiles/redfiles.php:121
+msgid "Redmatrix Server base URL"
+msgstr "URL base del servidor Redmatrix"
+
+#: ../../addon/redphotos/redphotos.php:132
+#: ../../addon/redfiles/redfiles.php:122
+msgid "Redmatrix Login Username"
+msgstr "Nombre de inicio de sesión en Redmatrix"
+
+#: ../../addon/redphotos/redphotos.php:133
+#: ../../addon/redfiles/redfiles.php:123
+msgid "Redmatrix Login Password"
+msgstr "Contraseña de inicio de sesión en Redmatrix"
-#: ../../extend/addon/addon/ljpost/ljpost.php:42
+#: ../../addon/redphotos/redphotos.php:134
+msgid "Import just this album"
+msgstr "Importar solo este álbum"
+
+#: ../../addon/redphotos/redphotos.php:134
+msgid "Leave blank to import all albums"
+msgstr "Dejar en blanco para importar todos los álbumes"
+
+#: ../../addon/redphotos/redphotos.php:135
+msgid "Maximum count to import"
+msgstr "Límite máximo de importación"
+
+#: ../../addon/redphotos/redphotos.php:135
+msgid "0 or blank to import all available"
+msgstr "0 o en blanco para importar todos los disponibles"
+
+#: ../../addon/irc/irc.php:45
+msgid "Channels to auto connect"
+msgstr "Canales para conexión automática"
+
+#: ../../addon/irc/irc.php:45 ../../addon/irc/irc.php:49
+msgid "Comma separated list"
+msgstr "Lista separada por comas"
+
+#: ../../addon/irc/irc.php:49 ../../addon/irc/irc.php:96
+msgid "Popular Channels"
+msgstr "Canales populares"
+
+#: ../../addon/irc/irc.php:53
+msgid "IRC Settings"
+msgstr "Ajustes de IRC"
+
+#: ../../addon/irc/irc.php:69
+msgid "IRC settings saved."
+msgstr "Se han guardado los ajustes de IRC."
+
+#: ../../addon/irc/irc.php:74
+msgid "IRC Chatroom"
+msgstr "Sala de chat IRC"
+
+#: ../../addon/ljpost/ljpost.php:42
msgid "Post to LiveJournal"
msgstr "Publicar en LiveJournal"
-#: ../../extend/addon/addon/ljpost/ljpost.php:70
+#: ../../addon/ljpost/ljpost.php:70
msgid "Enable LiveJournal Post Plugin"
msgstr "Habilitar el plugin de publicación en LiveJournal"
-#: ../../extend/addon/addon/ljpost/ljpost.php:74
+#: ../../addon/ljpost/ljpost.php:74
msgid "LiveJournal username"
msgstr "Nombre de usuario en LiveJournal"
-#: ../../extend/addon/addon/ljpost/ljpost.php:78
+#: ../../addon/ljpost/ljpost.php:78
msgid "LiveJournal password"
msgstr "Contraseña en LiveJournal"
-#: ../../extend/addon/addon/ljpost/ljpost.php:82
+#: ../../addon/ljpost/ljpost.php:82
msgid "Post to LiveJournal by default"
msgstr "Publicar en LiveJournal por defecto"
-#: ../../extend/addon/addon/ljpost/ljpost.php:86
+#: ../../addon/ljpost/ljpost.php:86
msgid "LiveJournal Post Settings"
msgstr "Ajustes de publicación en LiveJournal"
-#: ../../extend/addon/addon/ljpost/ljpost.php:101
+#: ../../addon/ljpost/ljpost.php:101
msgid "LiveJournal Settings saved."
msgstr "Se han guardado los ajustes de LiveJournal."
-#: ../../extend/addon/addon/logrot/logrot.php:36
-msgid "Logfile archive directory"
-msgstr "Directorio de los ficheros de informe"
-
-#: ../../extend/addon/addon/logrot/logrot.php:36
-msgid "Directory to store rotated logs"
-msgstr "Directorio para almacenar los informes rotados"
-
-#: ../../extend/addon/addon/logrot/logrot.php:37
-msgid "Logfile size in bytes before rotating"
-msgstr "Tamaño del fichero de informe en bytes antes de rotarlo"
+#: ../../addon/openid/openid.php:49
+msgid ""
+"We encountered a problem while logging in with the OpenID you provided. "
+"Please check the correct spelling of the ID."
+msgstr "Encontramos un problema al iniciar sesión con el OpenID que proporcionó. Compruebe si el ID está correctamente escrito."
-#: ../../extend/addon/addon/logrot/logrot.php:38
-msgid "Number of logfiles to retain"
-msgstr "Número de ficheros de informe que se deben retener"
+#: ../../addon/openid/openid.php:49
+msgid "The error message was:"
+msgstr "El mensaje de error ha sido: "
-#: ../../extend/addon/addon/mailhost/mailhost.php:36
-msgid "Email notification hub"
-msgstr "Notificación por correo electrónico del hub"
+#: ../../addon/openid/MysqlProvider.php:52
+msgid "First Name"
+msgstr "Nombre"
-#: ../../extend/addon/addon/mailhost/mailhost.php:36
-msgid "Hostname"
-msgstr "Nombre del host"
+#: ../../addon/openid/MysqlProvider.php:53
+msgid "Last Name"
+msgstr "Apellido"
-#: ../../extend/addon/addon/mailhost/mailhost.php:40
-msgid "Mailhost Settings"
-msgstr "Ajustes de Mailhost"
+#: ../../addon/openid/MysqlProvider.php:54 ../../addon/redred/redred.php:111
+msgid "Nickname"
+msgstr "Alias"
-#: ../../extend/addon/addon/mailhost/mailhost.php:54
-msgid "MAILHOST Settings saved."
-msgstr "Se han guardado los ajustes de MAILHOST."
+#: ../../addon/openid/MysqlProvider.php:55
+msgid "Full Name"
+msgstr "Nombre completo"
-#: ../../extend/addon/addon/moremoods/moremoods.php:19
-msgid "lonely"
-msgstr "Solo/a"
+#: ../../addon/openid/MysqlProvider.php:61
+msgid "Profile Photo 16px"
+msgstr "Foto del perfil 16px"
-#: ../../extend/addon/addon/moremoods/moremoods.php:20
-msgid "drunk"
-msgstr "ebrio/a"
+#: ../../addon/openid/MysqlProvider.php:62
+msgid "Profile Photo 32px"
+msgstr "Foto del perfil 32px"
-#: ../../extend/addon/addon/moremoods/moremoods.php:21
-msgid "horny"
-msgstr "caliente"
+#: ../../addon/openid/MysqlProvider.php:63
+msgid "Profile Photo 48px"
+msgstr "Foto del perfil 48px"
-#: ../../extend/addon/addon/moremoods/moremoods.php:22
-msgid "stoned"
-msgstr "drogado/a"
+#: ../../addon/openid/MysqlProvider.php:64
+msgid "Profile Photo 64px"
+msgstr "Foto del perfil 64px"
-#: ../../extend/addon/addon/moremoods/moremoods.php:23
-msgid "fucked up"
-msgstr "jodido/a"
+#: ../../addon/openid/MysqlProvider.php:65
+msgid "Profile Photo 80px"
+msgstr "Foto del perfil 80px"
-#: ../../extend/addon/addon/moremoods/moremoods.php:24
-msgid "clusterfucked"
-msgstr "hecho/a polvo"
+#: ../../addon/openid/MysqlProvider.php:66
+msgid "Profile Photo 128px"
+msgstr "Foto del perfil 128px"
-#: ../../extend/addon/addon/moremoods/moremoods.php:25
-msgid "crazy"
-msgstr "loco/a"
+#: ../../addon/openid/MysqlProvider.php:67
+msgid "Timezone"
+msgstr "Zona horaria"
-#: ../../extend/addon/addon/moremoods/moremoods.php:26
-msgid "hurt"
-msgstr "ofendido/a"
+#: ../../addon/openid/MysqlProvider.php:70
+msgid "Birth Year"
+msgstr "Año de nacimiento"
-#: ../../extend/addon/addon/moremoods/moremoods.php:27
-msgid "sleepy"
-msgstr "soñoliento/a"
+#: ../../addon/openid/MysqlProvider.php:71
+msgid "Birth Month"
+msgstr "Mes de nacimiento"
-#: ../../extend/addon/addon/moremoods/moremoods.php:28
-msgid "grumpy"
-msgstr "gruñón/ona"
+#: ../../addon/openid/MysqlProvider.php:72
+msgid "Birth Day"
+msgstr "Día de nacimiento"
-#: ../../extend/addon/addon/moremoods/moremoods.php:29
-msgid "high"
-msgstr "superior"
+#: ../../addon/openid/MysqlProvider.php:73
+msgid "Birthdate"
+msgstr "Fecha de nacimiento"
-#: ../../extend/addon/addon/moremoods/moremoods.php:30
-msgid "semi-conscious"
-msgstr "semiconsciente"
+#: ../../addon/openid/Mod_Openid.php:30
+msgid "OpenID protocol error. No ID returned."
+msgstr "Error de protocolo OpenID. No se recuperó ninguna ID."
-#: ../../extend/addon/addon/moremoods/moremoods.php:31
-msgid "in love"
-msgstr "enamorado/a"
+#: ../../addon/openid/Mod_Openid.php:188 ../../include/auth.php:286
+msgid "Login failed."
+msgstr "El acceso ha fallado."
-#: ../../extend/addon/addon/moremoods/moremoods.php:32
-msgid "in lust"
-msgstr "lujurioso/a"
+#: ../../addon/openid/Mod_Id.php:85 ../../include/selectors.php:49
+#: ../../include/selectors.php:66
+msgid "Male"
+msgstr "Hombre"
-#: ../../extend/addon/addon/moremoods/moremoods.php:33
-msgid "naked"
-msgstr "desnudo/a"
+#: ../../addon/openid/Mod_Id.php:87 ../../include/selectors.php:49
+#: ../../include/selectors.php:66
+msgid "Female"
+msgstr "Mujer"
-#: ../../extend/addon/addon/moremoods/moremoods.php:34
-msgid "stinky"
-msgstr "apestoso/a"
+#: ../../addon/randpost/randpost.php:97
+msgid "You're welcome."
+msgstr "Bienvenido."
-#: ../../extend/addon/addon/moremoods/moremoods.php:35
-msgid "sweaty"
-msgstr "sudoroso/a"
+#: ../../addon/randpost/randpost.php:98
+msgid "Ah shucks..."
+msgstr "Ah, joder..."
-#: ../../extend/addon/addon/moremoods/moremoods.php:36
-msgid "bleeding out"
-msgstr "una maldición"
+#: ../../addon/randpost/randpost.php:99
+msgid "Don't mention it."
+msgstr "No lo menciones."
-#: ../../extend/addon/addon/moremoods/moremoods.php:37
-msgid "victorious"
-msgstr "victorioso/a"
+#: ../../addon/randpost/randpost.php:100
+msgid "&lt;blush&gt;"
+msgstr "&lt;sonrojo&gt;"
-#: ../../extend/addon/addon/moremoods/moremoods.php:38
-msgid "defeated"
-msgstr "derrotado/a"
+#: ../../addon/startpage/startpage.php:109
+msgid "Page to load after login"
+msgstr "Página para cargar tras el inicio de sesión"
-#: ../../extend/addon/addon/moremoods/moremoods.php:39
-msgid "envious"
-msgstr "envidioso/a"
+#: ../../addon/startpage/startpage.php:109
+msgid ""
+"Examples: &quot;apps&quot;, &quot;network?f=&gid=37&quot; (privacy "
+"collection), &quot;channel&quot; or &quot;notifications/system&quot; (leave "
+"blank for default network page (grid)."
+msgstr "Ejemplos: &quot;aplicaciones&quot;, &quot;mi red?f=&gid=37&quot; (grupo de canales), &quot;mi canal&quot; or &quot;notificaciones del sistema&quot; (dejar en blanco para la página de mi red por defecto (grid)."
-#: ../../extend/addon/addon/moremoods/moremoods.php:40
-msgid "jealous"
-msgstr "celoso/a"
+#: ../../addon/startpage/startpage.php:113
+msgid "Startpage Settings"
+msgstr "Ajustes de startpage"
-#: ../../extend/addon/addon/morepokes/morepokes.php:19
+#: ../../addon/morepokes/morepokes.php:19
msgid "bitchslap"
msgstr "una bofetada humillante"
-#: ../../extend/addon/addon/morepokes/morepokes.php:19
+#: ../../addon/morepokes/morepokes.php:19
msgid "bitchslapped"
msgstr "ha abofeteado de forma humillante a"
-#: ../../extend/addon/addon/morepokes/morepokes.php:20
+#: ../../addon/morepokes/morepokes.php:20
msgid "shag"
msgstr "un polvo"
-#: ../../extend/addon/addon/morepokes/morepokes.php:20
+#: ../../addon/morepokes/morepokes.php:20
msgid "shagged"
msgstr "ha dejado exhausto/a a"
-#: ../../extend/addon/addon/morepokes/morepokes.php:21
+#: ../../addon/morepokes/morepokes.php:21
msgid "patent"
msgstr "una patente"
-#: ../../extend/addon/addon/morepokes/morepokes.php:21
+#: ../../addon/morepokes/morepokes.php:21
msgid "patented"
msgstr "ha patentado a"
-#: ../../extend/addon/addon/morepokes/morepokes.php:22
+#: ../../addon/morepokes/morepokes.php:22
msgid "hug"
msgstr "un abrazo"
-#: ../../extend/addon/addon/morepokes/morepokes.php:22
+#: ../../addon/morepokes/morepokes.php:22
msgid "hugged"
msgstr "ha abrazado a"
-#: ../../extend/addon/addon/morepokes/morepokes.php:23
+#: ../../addon/morepokes/morepokes.php:23
msgid "murder"
msgstr "un asesinato"
-#: ../../extend/addon/addon/morepokes/morepokes.php:23
+#: ../../addon/morepokes/morepokes.php:23
msgid "murdered"
msgstr "ha asesinado a"
-#: ../../extend/addon/addon/morepokes/morepokes.php:24
+#: ../../addon/morepokes/morepokes.php:24
msgid "worship"
msgstr "una alabanza"
-#: ../../extend/addon/addon/morepokes/morepokes.php:24
+#: ../../addon/morepokes/morepokes.php:24
msgid "worshipped"
msgstr "ha elogiado a"
-#: ../../extend/addon/addon/morepokes/morepokes.php:25
+#: ../../addon/morepokes/morepokes.php:25
msgid "kiss"
msgstr "un beso"
-#: ../../extend/addon/addon/morepokes/morepokes.php:25
+#: ../../addon/morepokes/morepokes.php:25
msgid "kissed"
msgstr "ha besado a"
-#: ../../extend/addon/addon/morepokes/morepokes.php:26
+#: ../../addon/morepokes/morepokes.php:26
msgid "tempt"
msgstr "una tentación"
-#: ../../extend/addon/addon/morepokes/morepokes.php:26
+#: ../../addon/morepokes/morepokes.php:26
msgid "tempted"
msgstr "ha tentado a"
-#: ../../extend/addon/addon/morepokes/morepokes.php:27
+#: ../../addon/morepokes/morepokes.php:27
msgid "raise eyebrows at"
msgstr "un levantamiento de cejas"
-#: ../../extend/addon/addon/morepokes/morepokes.php:27
+#: ../../addon/morepokes/morepokes.php:27
msgid "raised their eyebrows at"
msgstr "ha levantado las cejas a"
-#: ../../extend/addon/addon/morepokes/morepokes.php:28
+#: ../../addon/morepokes/morepokes.php:28
msgid "insult"
msgstr "un insulto"
-#: ../../extend/addon/addon/morepokes/morepokes.php:28
+#: ../../addon/morepokes/morepokes.php:28
msgid "insulted"
msgstr "ha insultado a"
-#: ../../extend/addon/addon/morepokes/morepokes.php:29
+#: ../../addon/morepokes/morepokes.php:29
msgid "praise"
msgstr "un elogio"
-#: ../../extend/addon/addon/morepokes/morepokes.php:29
+#: ../../addon/morepokes/morepokes.php:29
msgid "praised"
msgstr "ha elogiado a"
-#: ../../extend/addon/addon/morepokes/morepokes.php:30
+#: ../../addon/morepokes/morepokes.php:30
msgid "be dubious of"
msgstr "una indecisión"
-#: ../../extend/addon/addon/morepokes/morepokes.php:30
+#: ../../addon/morepokes/morepokes.php:30
msgid "was dubious of"
msgstr "estaba dudoso de"
-#: ../../extend/addon/addon/morepokes/morepokes.php:31
+#: ../../addon/morepokes/morepokes.php:31
msgid "eat"
msgstr "una comida"
-#: ../../extend/addon/addon/morepokes/morepokes.php:31
+#: ../../addon/morepokes/morepokes.php:31
msgid "ate"
msgstr "ha comido"
-#: ../../extend/addon/addon/morepokes/morepokes.php:32
+#: ../../addon/morepokes/morepokes.php:32
msgid "giggle and fawn at"
msgstr "una sonrisa aduladora"
-#: ../../extend/addon/addon/morepokes/morepokes.php:32
+#: ../../addon/morepokes/morepokes.php:32
msgid "giggled and fawned at"
msgstr "ha sonreído y adulado a"
-#: ../../extend/addon/addon/morepokes/morepokes.php:33
+#: ../../addon/morepokes/morepokes.php:33
msgid "doubt"
msgstr "una duda"
-#: ../../extend/addon/addon/morepokes/morepokes.php:33
+#: ../../addon/morepokes/morepokes.php:33
msgid "doubted"
msgstr "ha dudado de"
-#: ../../extend/addon/addon/morepokes/morepokes.php:34
+#: ../../addon/morepokes/morepokes.php:34
msgid "glare"
msgstr "una mirada furiosa"
-#: ../../extend/addon/addon/morepokes/morepokes.php:34
+#: ../../addon/morepokes/morepokes.php:34
msgid "glared at"
msgstr "ha mirado con furia"
-#: ../../extend/addon/addon/morepokes/morepokes.php:35
+#: ../../addon/morepokes/morepokes.php:35
msgid "fuck"
msgstr "una mierda"
-#: ../../extend/addon/addon/morepokes/morepokes.php:35
+#: ../../addon/morepokes/morepokes.php:35
msgid "fucked"
msgstr "ha mandado a la mierda a"
-#: ../../extend/addon/addon/morepokes/morepokes.php:36
+#: ../../addon/morepokes/morepokes.php:36
msgid "bonk"
msgstr "un golpe"
-#: ../../extend/addon/addon/morepokes/morepokes.php:36
+#: ../../addon/morepokes/morepokes.php:36
msgid "bonked"
msgstr "ha golpeado a"
-#: ../../extend/addon/addon/morepokes/morepokes.php:37
+#: ../../addon/morepokes/morepokes.php:37
msgid "declare undying love for"
msgstr "una declaración de amor eterno"
-#: ../../extend/addon/addon/morepokes/morepokes.php:37
+#: ../../addon/morepokes/morepokes.php:37
msgid "declared undying love for"
msgstr "ha declarado amor eterno a"
-#: ../../extend/addon/addon/msgfooter/msgfooter.php:46
-#: ../../extend/addon/addon/xmpp/xmpp.php:91
-msgid "Save Settings"
-msgstr "Guardar ajustes"
-
-#: ../../extend/addon/addon/msgfooter/msgfooter.php:47
-msgid "text to include in all outgoing posts from this site"
-msgstr "texto a incluir en todos los mensajes salientes de este sitio"
-
-#: ../../extend/addon/addon/nofed/nofed.php:42
-msgid "Federate"
-msgstr "Federar"
-
-#: ../../extend/addon/addon/nofed/nofed.php:56
-msgid "nofed Settings saved."
-msgstr "Se han guardado los ajustes de nofed."
-
-#: ../../extend/addon/addon/nofed/nofed.php:72
-msgid "Allow Federation Toggle"
-msgstr "Permitir alternancia de federación"
+#: ../../addon/diaspora/diaspora.php:675
+msgid "Diaspora Protocol Settings updated."
+msgstr "Los ajustes del protocolo de Diaspora se han actualizado."
-#: ../../extend/addon/addon/nofed/nofed.php:76
-msgid "Federate posts by default"
-msgstr "Federar las publicaciones por defecto"
+#: ../../addon/diaspora/diaspora.php:694
+msgid "Enable the Diaspora protocol for this channel"
+msgstr "Activar el protocolo de Diaspora para este canal"
-#: ../../extend/addon/addon/nofed/nofed.php:80
-msgid "NoFed Settings"
-msgstr "Ajustes de NoFed"
+#: ../../addon/diaspora/diaspora.php:698
+msgid "Allow any Diaspora member to comment on your public posts"
+msgstr "Permitir a cualquier miembro de Diaspora comentar sus entradas públicas"
-#: ../../extend/addon/addon/nsabait/nsabait.php:125
-msgid "Nsabait Settings updated."
-msgstr "Se han actualizado los ajustes de Nsabait"
+#: ../../addon/diaspora/diaspora.php:702
+msgid "Prevent your hashtags from being redirected to other sites"
+msgstr "Impedir que sus \"hashtags\" sean redirigidos a otros sitios "
-#: ../../extend/addon/addon/nsabait/nsabait.php:157
-msgid "Enable NSAbait Plugin"
-msgstr "Habilitar el plugin NSAbait"
+#: ../../addon/diaspora/diaspora.php:707
+msgid "Followed hashtags (comma separated, do not include the #)"
+msgstr "\"Hashtags\" seguidos (separados por comas, sin incluir #)"
-#: ../../extend/addon/addon/nsabait/nsabait.php:161
-msgid "NSAbait Settings"
-msgstr "Ajustes de NSAbait"
+#: ../../addon/diaspora/diaspora.php:712
+msgid "Diaspora Protocol Settings"
+msgstr "Ajustes del protocolo de Diaspora"
-#: ../../extend/addon/addon/nsfw/nsfw.php:80
-msgid ""
-"This plugin looks in posts for the words/text you specify below, and "
-"collapses any content containing those keywords so it is not displayed at "
-"inappropriate times, such as sexual innuendo that may be improper in a work "
-"setting. It is polite and recommended to tag any content containing nudity "
-"with #NSFW. This filter can also match any other word/text you specify, and"
-" can thereby be used as a general purpose content filter."
-msgstr "Este complemento busca en los mensajes las palabras o texto que se especifican a continuación y contrae cualquier contenido que contenga esas palabras clave para que no se muestre en momentos inapropiados, como insinuaciones sexuales que pueden ser impropias en un entorno de trabajo. Es una muestra de educación y se recomienda marcar cualquier contenido que contenga desnudos con #NSFW. Este filtro también puede coincidir con cualquier otra palabra o texto que especifique y, por lo tanto, puede utilizarse como un filtro de contenido de propósito general."
+#: ../../addon/diaspora/import_diaspora.php:16
+msgid "No username found in import file."
+msgstr "No se ha encontrado el nombre de usuario en el fichero de importación."
-#: ../../extend/addon/addon/nsfw/nsfw.php:84
-msgid "Enable Content filter"
-msgstr "Habilitar filtro de contenido"
+#: ../../addon/diaspora/import_diaspora.php:41 ../../include/import.php:62
+msgid "Unable to create a unique channel address. Import failed."
+msgstr "No se ha podido crear una dirección de canal única. Ha fallado la importación."
-#: ../../extend/addon/addon/nsfw/nsfw.php:88
-msgid "Comma separated list of keywords to hide"
-msgstr "Lista separada por comas de palabras clave para ocultar"
+#: ../../addon/gitwiki/Mod_Gitwiki.php:107
+msgid "Error retrieving wiki"
+msgstr "Error al recuperar el wiki"
-#: ../../extend/addon/addon/nsfw/nsfw.php:88
-msgid "Word, /regular-expression/, lang=xx, lang!=xx"
-msgstr "Palabra, /expresión regular/, lang=xx, lang!=xx"
+#: ../../addon/gitwiki/Mod_Gitwiki.php:114
+msgid "Error creating zip file export folder"
+msgstr "Error al crear el fichero comprimido zip de la carpeta a exportar"
-#: ../../extend/addon/addon/nsfw/nsfw.php:92
-msgid "Not Safe For Work Settings"
-msgstr "No es seguro para ajustes de trabajo"
+#: ../../addon/gitwiki/Mod_Gitwiki.php:132
+msgid "Error downloading wiki: "
+msgstr "Error al descargar el wiki: "
-#: ../../extend/addon/addon/nsfw/nsfw.php:92
-msgid "General Purpose Content Filter"
-msgstr "Filtro de contenido de propósito general"
+#: ../../addon/testdrive/testdrive.php:104
+#, php-format
+msgid "Your account on %s will expire in a few days."
+msgstr "Su cuenta en %s caducará en unos pocos días."
-#: ../../extend/addon/addon/nsfw/nsfw.php:110
-msgid "NSFW Settings saved."
-msgstr "Se han guardado los ajustes de NSFW."
+#: ../../addon/testdrive/testdrive.php:105
+msgid "Your $Productname test account is about to expire."
+msgstr "Su cuenta de prueba de $Productname está a punto de caducar."
-#: ../../extend/addon/addon/nsfw/nsfw.php:207
-msgid "Possible adult content"
-msgstr "Posible contenido para adultos"
+#: ../../addon/rainbowtag/rainbowtag.php:81
+msgid "Enable Rainbowtag"
+msgstr "Habilitar Rainbowtag"
-#: ../../extend/addon/addon/nsfw/nsfw.php:211
-#, php-format
-msgid "%s - view"
-msgstr "ver - %s"
+#: ../../addon/rainbowtag/rainbowtag.php:85
+msgid "Rainbowtag Settings"
+msgstr "Ajustes de Rainbowtag"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:50
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:128
-msgid "System defaults:"
-msgstr "Valores predeterminados del sistema: "
+#: ../../addon/rainbowtag/rainbowtag.php:101
+msgid "Rainbowtag Settings saved."
+msgstr "Se han guardado los ajustes de Rainbowtag."
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:54
-msgid "Preferred Clipart IDs"
-msgstr "IDs de las imágenes clipart preferidas"
+#: ../../addon/upload_limits/upload_limits.php:25
+msgid "Show Upload Limits"
+msgstr "Mostrar los límites de subida"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:54
-msgid "List of preferred clipart ids. These will be shown first."
-msgstr "Lista de ids de imágenes de clipart preferidas. Se verán en primer lugar."
+#: ../../addon/upload_limits/upload_limits.php:27
+msgid "Hubzilla configured maximum size: "
+msgstr "Tamaño máximo configurado por Hubzilla: "
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:55
-msgid "Default Search Term"
-msgstr "Términos de búsqueda predeterminados"
+#: ../../addon/upload_limits/upload_limits.php:28
+msgid "PHP upload_max_filesize: "
+msgstr "PHP upload_max_filesize: "
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:55
-msgid "The default search term. These will be shown second."
-msgstr "Los términos de búsqueda predeterminados. Estos se mostrarán en segundo lugar."
+#: ../../addon/upload_limits/upload_limits.php:29
+msgid "PHP post_max_size (must be larger than upload_max_filesize): "
+msgstr "PHP post_max_size (debe ser mayor que upload_max_filesize): "
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:56
-msgid "Return After"
-msgstr "Regresar después"
+#: ../../addon/visage/visage.php:93
+msgid "Recent Channel/Profile Viewers"
+msgstr "Visitantes recientes del canal o perfil"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:56
-msgid "Page to load after image selection."
-msgstr "Página para cargar después de la selección de imágenes."
+#: ../../addon/visage/visage.php:98
+msgid "This plugin/addon has not been configured."
+msgstr "El plugin o complemento no se ha configurado."
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:58
-#: ../../include/nav.php:107 ../../include/channel.php:1048
-msgid "Edit Profile"
-msgstr "Editar el perfil"
+#: ../../addon/visage/visage.php:99
+#, php-format
+msgid "Please visit the Visage settings on %s"
+msgstr "Por favor, revise los ajustes de Visage en %s"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:59
-msgid "Profile List"
-msgstr "Lista de perfiles"
+#: ../../addon/visage/visage.php:99
+msgid "your feature settings page"
+msgstr "su página de ajustes de las funcionalidades"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:61
-msgid "Order of Preferred"
-msgstr "Orden de preferencia"
+#: ../../addon/visage/visage.php:112
+msgid "No entries."
+msgstr "No hay entradas."
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:61
-msgid "Sort order of preferred clipart ids."
-msgstr "Orden de clasificación de los identificadores de imágenes clipart preferidas."
+#: ../../addon/visage/visage.php:166
+msgid "Enable Visage Visitor Logging"
+msgstr "Habilitar el registro de visitantes de Visage"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:62
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:68
-msgid "Newest first"
-msgstr "Las más nuevas en primer lugar"
+#: ../../addon/visage/visage.php:170
+msgid "Visage Settings"
+msgstr "Ajustes de Visage"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:65
-msgid "As entered"
-msgstr "Tal como se ingresaron"
+#: ../../addon/nsabait/nsabait.php:125
+msgid "Nsabait Settings updated."
+msgstr "Se han actualizado los ajustes de Nsabait"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:67
-msgid "Order of other"
-msgstr "Orden de los demás"
+#: ../../addon/nsabait/nsabait.php:157
+msgid "Enable NSAbait Plugin"
+msgstr "Habilitar el plugin NSAbait"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:67
-msgid "Sort order of other clipart ids."
-msgstr "Orden de clasificación de otros ids de imágenes clipart."
+#: ../../addon/nsabait/nsabait.php:161
+msgid "NSAbait Settings"
+msgstr "Ajustes de NSAbait"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:69
-msgid "Most downloaded first"
-msgstr "Las más descargadas en primer lugar"
+#: ../../addon/mailtest/mailtest.php:19
+msgid "Send test email"
+msgstr "Enviar un correo electrónico de prueba"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:70
-msgid "Most liked first"
-msgstr "Las más apreciadas en primer lugar"
+#: ../../addon/mailtest/mailtest.php:50 ../../addon/hubwall/hubwall.php:50
+msgid "No recipients found."
+msgstr "No se han encontrado destinatarios."
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:72
-msgid "Preferred IDs Message"
-msgstr "Mensaje de IDs preferido"
+#: ../../addon/mailtest/mailtest.php:66
+msgid "Mail sent."
+msgstr "El correo electrónico ha sido enviado."
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:72
-msgid "Message to display above preferred results."
-msgstr "Mensaje para mostrar sobre los resultados preferidos."
+#: ../../addon/mailtest/mailtest.php:68
+msgid "Sending of mail failed."
+msgstr "No se pudo enviar el correo."
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:78
-msgid "Uploaded by: "
-msgstr "Subida por: "
+#: ../../addon/mailtest/mailtest.php:77
+msgid "Mail Test"
+msgstr "Prueba de correo"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:78
-msgid "Drawn by: "
-msgstr "Creada por: "
+#: ../../addon/mailtest/mailtest.php:96 ../../addon/hubwall/hubwall.php:92
+msgid "Message subject"
+msgstr "Asunto del mensaje"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:192
-msgid "Or select from a free OpenClipart.org image:"
-msgstr "O seleccionar una imagen gratuita de OpenClipart.org: "
+#: ../../addon/diaspora_reconnect/diaspora_reconnect.php:44
+#, php-format
+msgid "Reconnecting %d connections"
+msgstr "Reconectando %d conexiones"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:195
-msgid "Search Term"
-msgstr "Término de búsqueda"
+#: ../../addon/diaspora_reconnect/diaspora_reconnect.php:63
+msgid "Diaspora Reconnect"
+msgstr "Reconectar con Diaspora"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:232
-msgid "Unknown error. Please try again later."
-msgstr "Error desconocido. Por favor, inténtelo otra vez."
+#: ../../addon/diaspora_reconnect/diaspora_reconnect.php:65
+msgid ""
+"Use this form to re-establish Diaspora connections which were initially made"
+" from a different hub."
+msgstr "Utilice este formulario para restablecer las conexiones de diáspora que se hicieron inicialmente desde un hub diferente."
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:308
-msgid "Profile photo updated successfully."
-msgstr "Se ha actualizado con éxito la foto de perfil."
+#: ../../addon/diaspora_reconnect/diaspora_reconnect.php:70
+msgid "Reconnect"
+msgstr "Reconectar"
-#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:146
+#: ../../addon/openstreetmap/openstreetmap.php:146
msgid "View Larger"
msgstr "Ver más grande"
-#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:169
+#: ../../addon/openstreetmap/openstreetmap.php:169
msgid "Tile Server URL"
msgstr "URL del servidor de mosaicos de imágenes "
-#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:169
+#: ../../addon/openstreetmap/openstreetmap.php:169
msgid ""
"A list of <a href=\"http://wiki.openstreetmap.org/wiki/TMS\" "
"target=\"_blank\">public tile servers</a>"
msgstr "Una lista de <a href=\"http://wiki.openstreetmap.org/wiki/TMS\" target=\"_blank\">servidores públicos de mosaicos de imágenes</a>"
-#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:170
+#: ../../addon/openstreetmap/openstreetmap.php:170
msgid "Nominatim (reverse geocoding) Server URL"
msgstr "URL del servidor nominatim (geocodificación inversa)"
-#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:170
+#: ../../addon/openstreetmap/openstreetmap.php:170
msgid ""
"A list of <a href=\"http://wiki.openstreetmap.org/wiki/Nominatim\" "
"target=\"_blank\">Nominatim servers</a>"
msgstr "Una lista de <a href=\"http://wiki.openstreetmap.org/wiki/Nominatim\" target=\"_blank\">servidores nominatim</a>"
-#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:171
+#: ../../addon/openstreetmap/openstreetmap.php:171
msgid "Default zoom"
msgstr "Zoom predeterminado"
-#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:171
+#: ../../addon/openstreetmap/openstreetmap.php:171
msgid ""
"The default zoom level. (1:world, 18:highest, also depends on tile server)"
msgstr "El nivel de zoom predeterminado. (1: mundo, 18: el más alto, también depende del servidor del mosaico de imágenes)"
-#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:172
+#: ../../addon/openstreetmap/openstreetmap.php:172
msgid "Include marker on map"
msgstr "Incluir un marcador en el mapa"
-#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:172
+#: ../../addon/openstreetmap/openstreetmap.php:172
msgid "Include a marker on the map."
msgstr "Incluir un marcador en el mapa."
-#: ../../extend/addon/addon/pageheader/pageheader.php:43
-msgid "Message to display on every page on this server"
-msgstr "Mensaje para mostrar en todas las páginas de este servidor"
-
-#: ../../extend/addon/addon/pageheader/pageheader.php:48
-msgid "Pageheader Settings"
-msgstr "Ajustes del encabezado de página"
-
-#: ../../extend/addon/addon/pageheader/pageheader.php:64
-msgid "pageheader Settings saved."
-msgstr "Se han guardado los ajustes del encabezado de página."
-
-#: ../../extend/addon/addon/piwik/piwik.php:85
-msgid ""
-"This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> "
-"analytics tool."
-msgstr "Este sitio es rastreado mediante la herramienta analítica <a href='http://www.piwik.org'>Piwik</a>."
-
-#: ../../extend/addon/addon/piwik/piwik.php:88
-#, php-format
-msgid ""
-"If you do not want that your visits are logged this way you <a href='%s'>can"
-" set a cookie to prevent Piwik from tracking further visits of the site</a> "
-"(opt-out)."
-msgstr "Si usted no quiere que sus visitas se registren de esta manera <a href='%s'>puede establecer una cookie para evitar que Piwik rastree otras visitas del sitio</a> (opt-out)."
-
-#: ../../extend/addon/addon/piwik/piwik.php:96
-msgid "Piwik Base URL"
-msgstr "URL base de Piwik"
-
-#: ../../extend/addon/addon/piwik/piwik.php:96
-msgid ""
-"Absolute path to your Piwik installation. (without protocol (http/s), with "
-"trailing slash)"
-msgstr "Ruta absoluta a la instalación de Piwik. (Sin protocolo (http/s), con barra diagonal)"
-
-#: ../../extend/addon/addon/piwik/piwik.php:97
-msgid "Site ID"
-msgstr "ID del sitio"
-
-#: ../../extend/addon/addon/piwik/piwik.php:98
-msgid "Show opt-out cookie link?"
-msgstr "Mostrar el enlace de la cookie opt-out?"
-
-#: ../../extend/addon/addon/piwik/piwik.php:99
-msgid "Asynchronous tracking"
-msgstr "Rastreo asíncrono"
-
-#: ../../extend/addon/addon/piwik/piwik.php:100
-msgid "Enable frontend JavaScript error tracking"
-msgstr "Habilitar la interfaz JavaScript de seguimiento de errores"
-
-#: ../../extend/addon/addon/piwik/piwik.php:100
-msgid "This feature requires Piwik >= 2.2.0"
-msgstr "Esta funcionalidad requiere Piwik >= 2.2.0"
-
-#: ../../extend/addon/addon/planets/planets.php:121
-msgid "Planets Settings updated."
-msgstr "Se han guardado los ajustes de Planets."
-
-#: ../../extend/addon/addon/planets/planets.php:153
-msgid "Enable Planets Plugin"
-msgstr "Habilitar el plugin Planets"
-
-#: ../../extend/addon/addon/planets/planets.php:157
-msgid "Planets Settings"
-msgstr "Ajustes de Planets"
-
-#: ../../extend/addon/addon/pumpio/pumpio.php:148
-msgid "You are now authenticated to pumpio."
-msgstr "Ahora está autenticado en pump.io."
-
-#: ../../extend/addon/addon/pumpio/pumpio.php:149
-msgid "return to the featured settings page"
-msgstr "Volver a la página de configuración destacada"
-
-#: ../../extend/addon/addon/pumpio/pumpio.php:163
-msgid "Post to Pump.io"
-msgstr "Publicar en Pump.io"
-
-#: ../../extend/addon/addon/pumpio/pumpio.php:198
-msgid "Pump.io servername"
-msgstr "Nombre del servidor de Pump.io"
-
-#: ../../extend/addon/addon/pumpio/pumpio.php:198
-msgid "Without \"http://\" or \"https://\""
-msgstr "Sin \"http://\" or \"https://\""
+#: ../../addon/msgfooter/msgfooter.php:46 ../../addon/xmpp/xmpp.php:91
+msgid "Save Settings"
+msgstr "Guardar ajustes"
-#: ../../extend/addon/addon/pumpio/pumpio.php:202
-msgid "Pump.io username"
-msgstr "Nombre de usuario en Pump.io"
+#: ../../addon/msgfooter/msgfooter.php:47
+msgid "text to include in all outgoing posts from this site"
+msgstr "texto a incluir en todos los mensajes salientes de este sitio"
-#: ../../extend/addon/addon/pumpio/pumpio.php:202
-msgid "Without the servername"
-msgstr "Sin el nombre del servidor"
+#: ../../addon/rtof/rtof.php:45
+msgid "Post to Friendica"
+msgstr "Publicar en Friendica"
-#: ../../extend/addon/addon/pumpio/pumpio.php:213
-msgid "You are not authenticated to pumpio"
-msgstr "No está autenticado en pump.io"
+#: ../../addon/rtof/rtof.php:62
+msgid "rtof Settings saved."
+msgstr "Se han guardado los ajustes de rtof"
-#: ../../extend/addon/addon/pumpio/pumpio.php:215
-msgid "(Re-)Authenticate your pump.io connection"
-msgstr "(Re-)Autenticar su conexión en pump.io"
+#: ../../addon/rtof/rtof.php:81
+msgid "Allow posting to Friendica"
+msgstr "Permitir publicar en Friendica"
-#: ../../extend/addon/addon/pumpio/pumpio.php:219
-msgid "Enable pump.io Post Plugin"
-msgstr "Habilitar el plugin de publicación en pump.io"
+#: ../../addon/rtof/rtof.php:85
+msgid "Send public postings to Friendica by default"
+msgstr "Enviar entradas públicas a Friendica por defecto"
-#: ../../extend/addon/addon/pumpio/pumpio.php:223
-msgid "Post to pump.io by default"
-msgstr "Publicar por defecto en pump.io"
+#: ../../addon/rtof/rtof.php:89
+msgid "Friendica API Path"
+msgstr "Ruta a la API de Friendica"
-#: ../../extend/addon/addon/pumpio/pumpio.php:227
-msgid "Should posts be public"
-msgstr "¿Las entradas deben ser públicas?"
+#: ../../addon/rtof/rtof.php:89 ../../addon/redred/redred.php:103
+msgid "https://{sitename}/api"
+msgstr "https://{sitename}/api"
-#: ../../extend/addon/addon/pumpio/pumpio.php:231
-msgid "Mirror all public posts"
-msgstr "Reflejar todos los mensajes públicos"
+#: ../../addon/rtof/rtof.php:93
+msgid "Friendica login name"
+msgstr "Nombre de inicio de sesión en Friendica"
-#: ../../extend/addon/addon/pumpio/pumpio.php:237
-msgid "Pump.io Post Settings"
-msgstr "Ajustes de publicación en pump.io"
+#: ../../addon/rtof/rtof.php:97
+msgid "Friendica password"
+msgstr "Contraseña de Friendica"
-#: ../../extend/addon/addon/pumpio/pumpio.php:266
-msgid "PumpIO Settings saved."
-msgstr "Se han guardado los ajustes de PumpIO."
+#: ../../addon/rtof/rtof.php:101
+msgid "Hubzilla to Friendica Post Settings"
+msgstr "Ajustes de publicación de Hubzilla a Friendica"
-#: ../../extend/addon/addon/qrator/qrator.php:48
-msgid "QR code"
-msgstr "Código QR"
+#: ../../addon/jappixmini/jappixmini.php:305 ../../include/channel.php:1139
+#: ../../include/channel.php:1296
+msgid "Status:"
+msgstr "Estado:"
-#: ../../extend/addon/addon/qrator/qrator.php:63
-msgid "QR Generator"
-msgstr "Generador QR"
+#: ../../addon/jappixmini/jappixmini.php:309
+msgid "Activate addon"
+msgstr "Habilitar complemento"
-#: ../../extend/addon/addon/qrator/qrator.php:64
-msgid "Enter some text"
-msgstr "Escribir algún texto"
+#: ../../addon/jappixmini/jappixmini.php:313
+msgid "Hide Jappixmini Chat-Widget from the webinterface"
+msgstr "Ocultar el widget de chat Jappixmini en la interfaz web"
-#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:81
-msgid "Enable Rainbowtag"
-msgstr "Habilitar Rainbowtag"
+#: ../../addon/jappixmini/jappixmini.php:318
+msgid "Jabber username"
+msgstr "Nombre de usuario en Jabber"
-#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:85
-msgid "Rainbowtag Settings"
-msgstr "Ajustes de Rainbowtag"
+#: ../../addon/jappixmini/jappixmini.php:324
+msgid "Jabber server"
+msgstr "Servidor de Jabber"
-#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:101
-msgid "Rainbowtag Settings saved."
-msgstr "Se han guardado los ajustes de Rainbowtag."
+#: ../../addon/jappixmini/jappixmini.php:330
+msgid "Jabber BOSH host URL"
+msgstr "URL del host BOSH de Jabber"
-#: ../../extend/addon/addon/randpost/randpost.php:97
-msgid "You're welcome."
-msgstr "Bienvenido."
+#: ../../addon/jappixmini/jappixmini.php:337
+msgid "Jabber password"
+msgstr "Contraseña en Jabber"
-#: ../../extend/addon/addon/randpost/randpost.php:98
-msgid "Ah shucks..."
-msgstr "Ah, joder..."
+#: ../../addon/jappixmini/jappixmini.php:343
+msgid "Encrypt Jabber password with Hubzilla password"
+msgstr "Cifrar la contraseña de Jabber con la contraseña de Hubzilla"
-#: ../../extend/addon/addon/randpost/randpost.php:99
-msgid "Don't mention it."
-msgstr "No lo menciones."
+#: ../../addon/jappixmini/jappixmini.php:347 ../../addon/redred/redred.php:115
+msgid "Hubzilla password"
+msgstr "Contraseña de Hubzilla"
-#: ../../extend/addon/addon/randpost/randpost.php:100
-msgid "&lt;blush&gt;"
-msgstr "&lt;sonrojo&gt;"
+#: ../../addon/jappixmini/jappixmini.php:351
+#: ../../addon/jappixmini/jappixmini.php:355
+msgid "Approve subscription requests from Hubzilla contacts automatically"
+msgstr "Aprobar automáticamente las solicitudes de suscripción de los contactos de Hubzilla"
-#: ../../extend/addon/addon/redfiles/redfiles.php:119
-msgid "Redmatrix File Storage Import"
-msgstr "Importar repositorio de ficheros de Redmatrix"
+#: ../../addon/jappixmini/jappixmini.php:359
+msgid "Purge internal list of jabber addresses of contacts"
+msgstr "Purgar la lista interna de las direcciones de contactos de jabber"
-#: ../../extend/addon/addon/redfiles/redfiles.php:120
-msgid "This will import all your Redmatrix cloud files to this channel."
-msgstr "Esto importará todos sus ficheros de la nube de Redmatrix a este canal."
+#: ../../addon/jappixmini/jappixmini.php:364
+msgid "Configuration Help"
+msgstr "Ayuda para los ajustes"
-#: ../../extend/addon/addon/redfiles/redfiles.php:121
-#: ../../extend/addon/addon/redphotos/redphotos.php:131
-msgid "Redmatrix Server base URL"
-msgstr "URL base del servidor Redmatrix"
+#: ../../addon/jappixmini/jappixmini.php:371
+msgid "Jappix Mini Settings"
+msgstr "Ajustes de Jappix Mini"
-#: ../../extend/addon/addon/redfiles/redfiles.php:122
-#: ../../extend/addon/addon/redphotos/redphotos.php:132
-msgid "Redmatrix Login Username"
-msgstr "Nombre de inicio de sesión en Redmatrix"
+#: ../../addon/superblock/superblock.php:112
+msgid "Currently blocked"
+msgstr "Actualmente bloqueado"
-#: ../../extend/addon/addon/redfiles/redfiles.php:123
-#: ../../extend/addon/addon/redphotos/redphotos.php:133
-msgid "Redmatrix Login Password"
-msgstr "Contraseña de inicio de sesión en Redmatrix"
+#: ../../addon/superblock/superblock.php:114
+msgid "No channels currently blocked"
+msgstr "No hay canales bloqueados actualmente"
-#: ../../extend/addon/addon/redfiles/redfilehelper.php:67
-msgid "file"
-msgstr "fichero"
+#: ../../addon/superblock/superblock.php:120
+msgid "\"Superblock\" Settings"
+msgstr "Ajustes de \"Superblock\""
-#: ../../extend/addon/addon/redphotos/redphotos.php:106
-msgid "Photos imported"
-msgstr "Se han importado las fotos"
+#: ../../addon/superblock/superblock.php:345
+msgid "Block Completely"
+msgstr "Bloquear completamente"
-#: ../../extend/addon/addon/redphotos/redphotos.php:129
-msgid "Redmatrix Photo Album Import"
-msgstr "Importar un álbum de fotos de Redmatrix"
+#: ../../addon/superblock/superblock.php:394
+msgid "superblock settings updated"
+msgstr "se han actualizado los ajustes de superblock"
-#: ../../extend/addon/addon/redphotos/redphotos.php:130
-msgid "This will import all your Redmatrix photo albums to this channel."
-msgstr "Esto importará todos sus álbumes de fotos de Redmatrix a este canal."
+#: ../../addon/nofed/nofed.php:42
+msgid "Federate"
+msgstr "Federar"
-#: ../../extend/addon/addon/redphotos/redphotos.php:134
-msgid "Import just this album"
-msgstr "Importar solo este álbum"
+#: ../../addon/nofed/nofed.php:56
+msgid "nofed Settings saved."
+msgstr "Se han guardado los ajustes de nofed."
-#: ../../extend/addon/addon/redphotos/redphotos.php:134
-msgid "Leave blank to import all albums"
-msgstr "Dejar en blanco para importar todos los álbumes"
+#: ../../addon/nofed/nofed.php:72
+msgid "Allow Federation Toggle"
+msgstr "Permitir alternancia de federación"
-#: ../../extend/addon/addon/redphotos/redphotos.php:135
-msgid "Maximum count to import"
-msgstr "Límite máximo de importación"
+#: ../../addon/nofed/nofed.php:76
+msgid "Federate posts by default"
+msgstr "Federar las publicaciones por defecto"
-#: ../../extend/addon/addon/redphotos/redphotos.php:135
-msgid "0 or blank to import all available"
-msgstr "0 o en blanco para importar todos los disponibles"
+#: ../../addon/nofed/nofed.php:80
+msgid "NoFed Settings"
+msgstr "Ajustes de NoFed"
-#: ../../extend/addon/addon/redred/redred.php:45
+#: ../../addon/redred/redred.php:45
msgid "Post to Red"
msgstr "Enviar a Red"
-#: ../../extend/addon/addon/redred/redred.php:60
+#: ../../addon/redred/redred.php:60
msgid "Channel is required."
msgstr "Se requiere un canal."
-#: ../../extend/addon/addon/redred/redred.php:76
+#: ../../addon/redred/redred.php:76
msgid "redred Settings saved."
msgstr "Se han salvado los ajustes de redred."
-#: ../../extend/addon/addon/redred/redred.php:95
+#: ../../addon/redred/redred.php:95
msgid "Allow posting to another Hubzilla Channel"
msgstr "Permitir la publicación en otro canal de Hubzilla"
-#: ../../extend/addon/addon/redred/redred.php:99
+#: ../../addon/redred/redred.php:99
msgid "Send public postings to Hubzilla channel by default"
msgstr "Enviar entradas públicas al canal Hubzilla por defecto"
-#: ../../extend/addon/addon/redred/redred.php:103
+#: ../../addon/redred/redred.php:103
msgid "Hubzilla API Path"
msgstr "Ruta de la API de Hubzilla"
-#: ../../extend/addon/addon/redred/redred.php:103
-#: ../../extend/addon/addon/rtof/rtof.php:89
-msgid "https://{sitename}/api"
-msgstr "https://{sitename}/api"
-
-#: ../../extend/addon/addon/redred/redred.php:107
+#: ../../addon/redred/redred.php:107
msgid "Hubzilla login name"
msgstr "Nombre de inicio de sesión en Hubzilla"
-#: ../../extend/addon/addon/redred/redred.php:111
+#: ../../addon/redred/redred.php:111
msgid "Hubzilla channel name"
msgstr "Nombre del canal de Hubzilla"
-#: ../../extend/addon/addon/redred/redred.php:111
-#: ../../extend/addon/addon/openid/MysqlProvider.php:54
-msgid "Nickname"
-msgstr "Alias"
-
-#: ../../extend/addon/addon/redred/redred.php:119
+#: ../../addon/redred/redred.php:119
msgid "Hubzilla Crosspost Settings"
msgstr "Ajustes de Hubzilla Crosspost"
-#: ../../extend/addon/addon/rtof/rtof.php:45
-msgid "Post to Friendica"
-msgstr "Publicar en Friendica"
+#: ../../addon/logrot/logrot.php:36
+msgid "Logfile archive directory"
+msgstr "Directorio de los ficheros de informe"
-#: ../../extend/addon/addon/rtof/rtof.php:62
-msgid "rtof Settings saved."
-msgstr "Se han guardado los ajustes de rtof"
+#: ../../addon/logrot/logrot.php:36
+msgid "Directory to store rotated logs"
+msgstr "Directorio para almacenar los informes rotados"
-#: ../../extend/addon/addon/rtof/rtof.php:81
-msgid "Allow posting to Friendica"
-msgstr "Permitir publicar en Friendica"
+#: ../../addon/logrot/logrot.php:37
+msgid "Logfile size in bytes before rotating"
+msgstr "Tamaño del fichero de informe en bytes antes de rotarlo"
-#: ../../extend/addon/addon/rtof/rtof.php:85
-msgid "Send public postings to Friendica by default"
-msgstr "Enviar entradas públicas a Friendica por defecto"
+#: ../../addon/logrot/logrot.php:38
+msgid "Number of logfiles to retain"
+msgstr "Número de ficheros de informe que se deben retener"
-#: ../../extend/addon/addon/rtof/rtof.php:89
-msgid "Friendica API Path"
-msgstr "Ruta a la API de Friendica"
+#: ../../addon/frphotos/frphotos.php:91
+msgid "Friendica Photo Album Import"
+msgstr "Importar un álbum de fotos de Friendica"
-#: ../../extend/addon/addon/rtof/rtof.php:93
-msgid "Friendica login name"
+#: ../../addon/frphotos/frphotos.php:92
+msgid "This will import all your Friendica photo albums to this Red channel."
+msgstr "Esto importará todos sus álbumes de fotos de Friendica a este canal de Hubzilla."
+
+#: ../../addon/frphotos/frphotos.php:93
+msgid "Friendica Server base URL"
+msgstr "URL base del servidor de Friendica"
+
+#: ../../addon/frphotos/frphotos.php:94
+msgid "Friendica Login Username"
msgstr "Nombre de inicio de sesión en Friendica"
-#: ../../extend/addon/addon/rtof/rtof.php:97
-msgid "Friendica password"
-msgstr "Contraseña de Friendica"
+#: ../../addon/frphotos/frphotos.php:95
+msgid "Friendica Login Password"
+msgstr "Contraseña de inicio de sesión en Friendica"
-#: ../../extend/addon/addon/rtof/rtof.php:101
-msgid "Hubzilla to Friendica Post Settings"
-msgstr "Ajustes de publicación de Hubzilla a Friendica"
+#: ../../addon/donate/donate.php:21
+msgid "Project Servers and Resources"
+msgstr "Servidores y recursos del proyecto"
-#: ../../extend/addon/addon/sendzid/sendzid.php:25
-msgid "Extended Identity Sharing"
-msgstr "Compartir identidad extendida"
+#: ../../addon/donate/donate.php:22
+msgid "Project Creator and Tech Lead"
+msgstr "Creador del proyecto y director técnico"
-#: ../../extend/addon/addon/sendzid/sendzid.php:26
+#: ../../addon/donate/donate.php:23
+msgid "Admin, developer, directorymin, support bloke"
+msgstr "Administrador, desarrollador, administrador del directorio, trabajador de apoyo"
+
+#: ../../addon/donate/donate.php:50
msgid ""
-"Share your identity with all websites on the internet. When disabled, "
-"identity is only shared with sites in the matrix."
-msgstr "Compartir su identidad con todos los sitios web en Internet. Cuando se inhabilita, la identidad sólo se comparte con los sitios de la matriz."
+"And the hundreds of other people and organisations who helped make the "
+"Hubzilla possible."
+msgstr "Y los cientos de personas y organizaciones más que ayudaron a hacer posible Hubzilla."
-#: ../../extend/addon/addon/skeleton/skeleton.php:59
-msgid "Some setting"
-msgstr "Algunos ajustes"
+#: ../../addon/donate/donate.php:53
+msgid ""
+"The Redmatrix/Hubzilla projects are provided primarily by volunteers giving "
+"their time and expertise - and often paying out of pocket for services they "
+"share with others."
+msgstr "Los proyectos Redmatrix / Hubzilla están proporcionados principalmente por voluntarios que les prestan su tiempo y experiencia, pagando a menudo de su bolsillo por los servicios que comparten con otros."
-#: ../../extend/addon/addon/skeleton/skeleton.php:61
-msgid "A setting"
-msgstr "Un ajuste"
+#: ../../addon/donate/donate.php:54
+msgid ""
+"There is no corporate funding and no ads, and we do not collect and sell "
+"your personal information. (We don't control your personal information - "
+"<strong>you do</strong>.)"
+msgstr "No hay financiación corporativa ni publicidad y no recogemos ni vendemos su información personal. (De hecho, no tenemos control sobre sus datos privados. <Strong>Usted lo tiene</strong>.)"
-#: ../../extend/addon/addon/skeleton/skeleton.php:64
-msgid "Skeleton Settings"
-msgstr "Ajustes de Skeleton"
+#: ../../addon/donate/donate.php:55
+msgid ""
+"Help support our ground-breaking work in decentralisation, web identity, and"
+" privacy."
+msgstr "Ayude apoyando nuestro trabajo pionero en la descentralización, la identidad web, y la privacidad."
-#: ../../extend/addon/addon/smileybutton/smileybutton.php:273
-msgid "Deactivate the feature"
-msgstr "Desactivar la funcionalidad"
+#: ../../addon/donate/donate.php:57
+msgid ""
+"Your donations keep servers and services running and also helps us to "
+"provide innovative new features and continued development."
+msgstr "Sus donaciones mantienen servidores y servicios en ejecución y también nos ayudan a proporcionar nuevas características innovadoras y a mantener el desarrollo de forma continuada."
-#: ../../extend/addon/addon/smileybutton/smileybutton.php:277
-msgid "Hide the button and show the smilies directly."
-msgstr "Ocultar el botón y mostrar los smilies directamente."
+#: ../../addon/donate/donate.php:60
+msgid "Donate"
+msgstr "Donar"
-#: ../../extend/addon/addon/smileybutton/smileybutton.php:281
-msgid "Smileybutton Settings"
-msgstr "Ajustes de Smileybutton"
+#: ../../addon/donate/donate.php:62
+msgid ""
+"Choose a project, developer, or public hub to support with a one-time "
+"donation"
+msgstr "Elija un proyecto, desarrollador, o \"hub\" público para apoyar con una donación de una sola vez"
-#: ../../extend/addon/addon/startpage/startpage.php:109
-msgid "Page to load after login"
-msgstr "Página para cargar tras el inicio de sesión"
+#: ../../addon/donate/donate.php:63
+msgid "Donate Now"
+msgstr "Donar ahora"
-#: ../../extend/addon/addon/startpage/startpage.php:109
+#: ../../addon/donate/donate.php:64
msgid ""
-"Examples: &quot;apps&quot;, &quot;network?f=&gid=37&quot; (privacy "
-"collection), &quot;channel&quot; or &quot;notifications/system&quot; (leave "
-"blank for default network page (grid)."
-msgstr "Ejemplos: &quot;aplicaciones&quot;, &quot;mi red?f=&gid=37&quot; (grupo de canales), &quot;mi canal&quot; or &quot;notificaciones del sistema&quot; (dejar en blanco para la página de mi red por defecto (grid)."
+"<strong><em>Or</em></strong> become a project sponsor (Hubzilla Project "
+"only)"
+msgstr "<strong><em>O</em></strong> convertirse en un patrocinador del proyecto (sólo del proyecto Hubzilla)"
-#: ../../extend/addon/addon/startpage/startpage.php:113
-msgid "Startpage Settings"
-msgstr "Ajustes de startpage"
+#: ../../addon/donate/donate.php:65
+msgid ""
+"Please indicate if you would like your first name or full name (or nothing) "
+"to appear in our sponsor listing"
+msgstr "Por favor, indique si desea que su nombre de pila o el nombre completo (o nada) aparezca en nuestra lista de patrocinadores"
+
+#: ../../addon/donate/donate.php:66
+msgid "Sponsor"
+msgstr "Patrocinador"
+
+#: ../../addon/donate/donate.php:69
+msgid "Special thanks to: "
+msgstr "Agradecimiento especial a: "
+
+#: ../../addon/chords/Mod_Chords.php:44
+msgid ""
+"This is a fairly comprehensive and complete guitar chord dictionary which "
+"will list most of the available ways to play a certain chord, starting from "
+"the base of the fingerboard up to a few frets beyond the twelfth fret "
+"(beyond which everything repeats). A couple of non-standard tunings are "
+"provided for the benefit of slide players, etc."
+msgstr "Se trata de un diccionario bastante amplio y completo de acordes de guitarra que enumerará la mayor parte de las formas disponibles para tocar un acorde determinado, partiendo de la base del diapasón hasta unos pocos trastes más allá del traste doce (más allá del cual todo se repite). Se proporcionan un par de afinaciones no convencionales para provecho de los guitarristas con \"slides\" ( barras de acero), etc."
+
+#: ../../addon/chords/Mod_Chords.php:46
+msgid ""
+"Chord names start with a root note (A-G) and may include sharps (#) and "
+"flats (b). This software will parse most of the standard naming conventions "
+"such as maj, min, dim, sus(2 or 4), aug, with optional repeating elements."
+msgstr "Los nombres de acordes comienzan con una nota fundamental (La-Sol) y pueden incluir sostenidos (#) y bemoles (b). Este software analizará la mayor parte de las convenciones de nomenclatura estándar como maj, min, tenue, SUS (2 ó 4), aug, con la repetición de elementos opcionales."
+
+#: ../../addon/chords/Mod_Chords.php:48
+msgid ""
+"Valid examples include A, A7, Am7, Amaj7, Amaj9, Ammaj7, Aadd4, Asus2Add4, "
+"E7b13b11 ..."
+msgstr "Ejemplos válidos son A, A7, Am7, Amaj7, Amaj9, Ammaj7, Aadd4, Asus2Add4, E7b13b11 ..."
-#: ../../extend/addon/addon/statusnet/statusnet.php:143
+#: ../../addon/chords/Mod_Chords.php:51
+msgid "Guitar Chords"
+msgstr "Acordes de guitarra"
+
+#: ../../addon/chords/Mod_Chords.php:52
+msgid "The complete online chord dictionary"
+msgstr "El diccionario completo de acordes en línea"
+
+#: ../../addon/chords/Mod_Chords.php:57
+msgid "Tuning"
+msgstr "Afinación"
+
+#: ../../addon/chords/Mod_Chords.php:58
+msgid "Chord name: example: Em7"
+msgstr "Nombre del acorde, por ejemplo: Em7"
+
+#: ../../addon/chords/Mod_Chords.php:59
+msgid "Show for left handed stringing"
+msgstr "Mostrar para tocadores zurdos"
+
+#: ../../addon/chords/chords.php:33
+msgid "Quick Reference"
+msgstr "Referencia rápida"
+
+#: ../../addon/libertree/libertree.php:38
+msgid "Post to Libertree"
+msgstr "Publicar en Libertree"
+
+#: ../../addon/libertree/libertree.php:69
+msgid "Enable Libertree Post Plugin"
+msgstr "Habilitar el plugin de publicación en Libertree"
+
+#: ../../addon/libertree/libertree.php:73
+msgid "Libertree API token"
+msgstr "Token de la API de Libertree"
+
+#: ../../addon/libertree/libertree.php:77
+msgid "Libertree site URL"
+msgstr "URL del servidor de Libertree"
+
+#: ../../addon/libertree/libertree.php:81
+msgid "Post to Libertree by default"
+msgstr "Publicar en Libertree por defecto"
+
+#: ../../addon/libertree/libertree.php:85
+msgid "Libertree Post Settings"
+msgstr "Ajustes de publicación en Libertree"
+
+#: ../../addon/libertree/libertree.php:99
+msgid "Libertree Settings saved."
+msgstr "Se han guardado los ajustes de Libertree."
+
+#: ../../addon/flattrwidget/flattrwidget.php:45
+msgid "Flattr this!"
+msgstr "¡Apoyar esto en Flattr!"
+
+#: ../../addon/flattrwidget/flattrwidget.php:83
+msgid "Flattr widget settings updated."
+msgstr "Los ajustes del widget Flattr han sido actualizados."
+
+#: ../../addon/flattrwidget/flattrwidget.php:100
+msgid "Flattr user"
+msgstr "Usuario en Flattr"
+
+#: ../../addon/flattrwidget/flattrwidget.php:104
+msgid "URL of the Thing to flattr"
+msgstr "URL de la Cosa para apoyar en flattr"
+
+#: ../../addon/flattrwidget/flattrwidget.php:104
+msgid "If empty channel URL is used"
+msgstr "Si está vacío, se usa la URL del canal"
+
+#: ../../addon/flattrwidget/flattrwidget.php:108
+msgid "Title of the Thing to flattr"
+msgstr "Título de la Cosa para apoyar en flattr"
+
+#: ../../addon/flattrwidget/flattrwidget.php:108
+msgid "If empty \"channel name on The Hubzilla\" will be used"
+msgstr "Si está vacío, se usará \"nombre del canal en Hubzilla\""
+
+#: ../../addon/flattrwidget/flattrwidget.php:112
+msgid "Static or dynamic flattr button"
+msgstr "Botón de flattr estático o dinámico"
+
+#: ../../addon/flattrwidget/flattrwidget.php:112
+msgid "static"
+msgstr "estático"
+
+#: ../../addon/flattrwidget/flattrwidget.php:112
+msgid "dynamic"
+msgstr "dinámico"
+
+#: ../../addon/flattrwidget/flattrwidget.php:116
+msgid "Alignment of the widget"
+msgstr "Alineamiento del widget"
+
+#: ../../addon/flattrwidget/flattrwidget.php:116
+msgid "left"
+msgstr "izquierda"
+
+#: ../../addon/flattrwidget/flattrwidget.php:116
+msgid "right"
+msgstr "derecha"
+
+#: ../../addon/flattrwidget/flattrwidget.php:120
+msgid "Enable Flattr widget"
+msgstr "Habilitar el widget Flattr"
+
+#: ../../addon/flattrwidget/flattrwidget.php:124
+msgid "Flattr Widget Settings"
+msgstr "Ajustes del widget Flattr"
+
+#: ../../addon/statusnet/statusnet.php:143
msgid "Post to GNU social"
msgstr "Publicar en GNU social"
-#: ../../extend/addon/addon/statusnet/statusnet.php:195
+#: ../../addon/statusnet/statusnet.php:195
msgid ""
"Please contact your site administrator.<br />The provided API URL is not "
"valid."
msgstr "Por favor, contacte con el administrador de su sitio.<br />La URL de la API proporcionada no es válida."
-#: ../../extend/addon/addon/statusnet/statusnet.php:232
+#: ../../addon/statusnet/statusnet.php:232
msgid "We could not contact the GNU social API with the Path you entered."
msgstr "No podemos conectar con la API de GNU social con la ruta que ha proporcionado."
-#: ../../extend/addon/addon/statusnet/statusnet.php:266
+#: ../../addon/statusnet/statusnet.php:266
msgid "GNU social settings updated."
msgstr "Se han guardado los ajustes de GNU social."
-#: ../../extend/addon/addon/statusnet/statusnet.php:310
+#: ../../addon/statusnet/statusnet.php:310
msgid "Globally Available GNU social OAuthKeys"
msgstr "OAuthKeys globales de GNU social disponibles"
-#: ../../extend/addon/addon/statusnet/statusnet.php:312
+#: ../../addon/statusnet/statusnet.php:312
msgid ""
"There are preconfigured OAuth key pairs for some GNU social servers "
"available. If you are using one of them, please use these credentials.<br "
"/>If not feel free to connect to any other GNU social instance (see below)."
msgstr "Existen pares de claves OAuth preconfiguradas disponibles para algunos servidores libres de GNU social. Si está usando uno de ellos, utilice estas credenciales.<br />Si no se siente libre de conectarse a cualquier otra instancia de GNU social (vea a continuación)."
-#: ../../extend/addon/addon/statusnet/statusnet.php:327
+#: ../../addon/statusnet/statusnet.php:327
msgid "Provide your own OAuth Credentials"
msgstr "Proporcione sus propias credenciales de OAuth"
-#: ../../extend/addon/addon/statusnet/statusnet.php:329
+#: ../../addon/statusnet/statusnet.php:329
msgid ""
"No consumer key pair for GNU social found. Register your Hubzilla Account as"
" an desktop client on your GNU social account, copy the consumer key pair "
@@ -9723,27 +10056,27 @@ msgid ""
"Hubzilla installation at your favourite GNU social installation."
msgstr "No se ha encontrado un par de claves de consumidor para GNU social. Registre su cuenta de Hubzilla como un cliente de escritorio en su cuenta social GNU, copie el par de claves de consumidor aquí y escriba la dirección raíz de la API.<br />Antes de registrar su propio par de claves OAuth, pregunte al administrador si ya hay un par de claves para esta instalación de Hubzilla en su instalación GNU social favorita."
-#: ../../extend/addon/addon/statusnet/statusnet.php:333
+#: ../../addon/statusnet/statusnet.php:333
msgid "OAuth Consumer Key"
msgstr "OAuth Consumer Key"
-#: ../../extend/addon/addon/statusnet/statusnet.php:337
+#: ../../addon/statusnet/statusnet.php:337
msgid "OAuth Consumer Secret"
msgstr "OAuth Consumer Secret"
-#: ../../extend/addon/addon/statusnet/statusnet.php:341
+#: ../../addon/statusnet/statusnet.php:341
msgid "Base API Path"
msgstr "Ruta base de la API"
-#: ../../extend/addon/addon/statusnet/statusnet.php:341
+#: ../../addon/statusnet/statusnet.php:341
msgid "Remember the trailing /"
msgstr "Recuerde la barra /"
-#: ../../extend/addon/addon/statusnet/statusnet.php:345
+#: ../../addon/statusnet/statusnet.php:345
msgid "GNU social application name"
msgstr "Nombre de la aplicación de GNU social"
-#: ../../extend/addon/addon/statusnet/statusnet.php:368
+#: ../../addon/statusnet/statusnet.php:368
msgid ""
"To connect to your GNU social account click the button below to get a "
"security code from GNU social which you have to copy into the input box "
@@ -9751,32 +10084,31 @@ msgid ""
"posted to GNU social."
msgstr "Para conectarse a su cuenta de GNU social, haga clic en el botón de abajo para obtener un código de seguridad de GNU social que tiene que copiar en el cuadro de entrada a continuación y envíe el formulario. Solo sus <strong>entradas</strong> públicas aparecerán en GNU social."
-#: ../../extend/addon/addon/statusnet/statusnet.php:370
+#: ../../addon/statusnet/statusnet.php:370
msgid "Log in with GNU social"
msgstr "Inicio de sesión en GNU social"
-#: ../../extend/addon/addon/statusnet/statusnet.php:373
+#: ../../addon/statusnet/statusnet.php:373
msgid "Copy the security code from GNU social here"
msgstr "Copiar aquí el código de seguridad de GNU social"
-#: ../../extend/addon/addon/statusnet/statusnet.php:383
+#: ../../addon/statusnet/statusnet.php:383
msgid "Cancel Connection Process"
msgstr "Cancelar el proceso de conexión"
-#: ../../extend/addon/addon/statusnet/statusnet.php:385
+#: ../../addon/statusnet/statusnet.php:385
msgid "Current GNU social API is"
msgstr "La API actual de GNU social es "
-#: ../../extend/addon/addon/statusnet/statusnet.php:389
+#: ../../addon/statusnet/statusnet.php:389
msgid "Cancel GNU social Connection"
msgstr "Cancelar la conexión de GNU social"
-#: ../../extend/addon/addon/statusnet/statusnet.php:401
-#: ../../extend/addon/addon/twitter/twitter.php:232
+#: ../../addon/statusnet/statusnet.php:401 ../../addon/twitter/twitter.php:232
msgid "Currently connected to: "
msgstr "Actualmente está conectado a: "
-#: ../../extend/addon/addon/statusnet/statusnet.php:406
+#: ../../addon/statusnet/statusnet.php:406
msgid ""
"<strong>Note</strong>: Due your privacy settings (<em>Hide your profile "
"details from unknown viewers?</em>) the link potentially included in public "
@@ -9784,277 +10116,363 @@ msgid ""
"informing the visitor that the access to your profile has been restricted."
msgstr "<strong>Aviso</strong>: Debido a su configuración de privacidad (<em>Ocultar los detalles de su perfil a los visitantes desconocidos?</em>) el vínculo potencialmente incluido en las entradas públicas retransmitidas a GNU social llevará al visitante a una página en blanco que le informará de que el acceso a su perfil ha sido restringido."
-#: ../../extend/addon/addon/statusnet/statusnet.php:411
+#: ../../addon/statusnet/statusnet.php:411
msgid "Allow posting to GNU social"
msgstr "Habilitar la publicación en GNU social"
-#: ../../extend/addon/addon/statusnet/statusnet.php:411
+#: ../../addon/statusnet/statusnet.php:411
msgid ""
"If enabled your public postings can be posted to the associated GNU-social "
"account"
msgstr "Si está habilitado, sus entradas públicas se pueden publicar en la cuenta GNU-social asociada"
-#: ../../extend/addon/addon/statusnet/statusnet.php:415
+#: ../../addon/statusnet/statusnet.php:415
msgid "Post to GNU social by default"
msgstr "Publicar en GNU social por defecto"
-#: ../../extend/addon/addon/statusnet/statusnet.php:415
+#: ../../addon/statusnet/statusnet.php:415
msgid ""
"If enabled your public postings will be posted to the associated GNU-social "
"account by default"
msgstr "Si está activado, sus entradas públicas se publicarán en la cuenta GNU-social asociada de forma predeterminada"
-#: ../../extend/addon/addon/statusnet/statusnet.php:424
-#: ../../extend/addon/addon/twitter/twitter.php:255
+#: ../../addon/statusnet/statusnet.php:424 ../../addon/twitter/twitter.php:255
msgid "Clear OAuth configuration"
msgstr "Limpiar la configuración de OAuth"
-#: ../../extend/addon/addon/statusnet/statusnet.php:432
+#: ../../addon/statusnet/statusnet.php:432
msgid "GNU social Post Settings"
msgstr "Ajustes de publicación en GNU social"
-#: ../../extend/addon/addon/statusnet/statusnet.php:891
+#: ../../addon/statusnet/statusnet.php:891
msgid "API URL"
msgstr "URL de la API"
-#: ../../extend/addon/addon/statusnet/statusnet.php:894
+#: ../../addon/statusnet/statusnet.php:894
msgid "Application name"
msgstr "Nombre de la aplicación"
-#: ../../extend/addon/addon/superblock/superblock.php:112
-msgid "Currently blocked"
-msgstr "Actualmente bloqueado"
+#: ../../addon/qrator/qrator.php:48
+msgid "QR code"
+msgstr "Código QR"
-#: ../../extend/addon/addon/superblock/superblock.php:114
-msgid "No channels currently blocked"
-msgstr "No hay canales bloqueados actualmente"
+#: ../../addon/qrator/qrator.php:63
+msgid "QR Generator"
+msgstr "Generador QR"
-#: ../../extend/addon/addon/superblock/superblock.php:120
-msgid "\"Superblock\" Settings"
-msgstr "Ajustes de \"Superblock\""
+#: ../../addon/qrator/qrator.php:64
+msgid "Enter some text"
+msgstr "Escribir algún texto"
-#: ../../extend/addon/addon/superblock/superblock.php:345
-msgid "Block Completely"
-msgstr "Bloquear completamente"
+#: ../../addon/chess/chess.php:276 ../../addon/chess/chess.php:433
+msgid "Invalid game."
+msgstr "Juego no válido."
-#: ../../extend/addon/addon/superblock/superblock.php:394
-msgid "superblock settings updated"
-msgstr "se han actualizado los ajustes de superblock"
+#: ../../addon/chess/chess.php:282 ../../addon/chess/chess.php:439
+msgid "You are not a player in this game."
+msgstr "Usted no participa en este juego."
-#: ../../extend/addon/addon/testdrive/testdrive.php:104
-#, php-format
-msgid "Your account on %s will expire in a few days."
-msgstr "Su cuenta en %s caducará en unos pocos días."
+#: ../../addon/chess/chess.php:315
+msgid "You must be a local channel to create a game."
+msgstr "Debe ser un canal local para crear un juego"
-#: ../../extend/addon/addon/testdrive/testdrive.php:105
-msgid "Your $Productname test account is about to expire."
-msgstr "Su cuenta de prueba de $Productname está a punto de caducar."
+#: ../../addon/chess/chess.php:333
+msgid "You must select one opponent that is not yourself."
+msgstr "Debe seleccionar un oponente que no sea usted mismo."
-#: ../../extend/addon/addon/tictac/tictac.php:21
-msgid "Three Dimensional Tic-Tac-Toe"
-msgstr "Juego en 3D Tic-Tac-Toe"
+#: ../../addon/chess/chess.php:336
+msgid "Creating new game..."
+msgstr "Crear un nuevo juego..."
-#: ../../extend/addon/addon/tictac/tictac.php:54
-msgid "3D Tic-Tac-Toe"
-msgstr "3D Tic-Tac-Toe"
+#: ../../addon/chess/chess.php:342
+msgid "You must select white or black."
+msgstr "Debe elegir blancas o negras."
-#: ../../extend/addon/addon/tictac/tictac.php:59
-msgid "New game"
-msgstr "Nuevo juego"
+#: ../../addon/chess/chess.php:349
+msgid "Error creating new game."
+msgstr "Error al crear un nuevo juego."
-#: ../../extend/addon/addon/tictac/tictac.php:60
-msgid "New game with handicap"
-msgstr "Nuevo juego con hándicap"
+#: ../../addon/chess/chess.php:381 ../../include/channel.php:899
+msgid "Requested channel is not available."
+msgstr "El canal solicitado no está disponible."
-#: ../../extend/addon/addon/tictac/tictac.php:61
+#: ../../addon/chess/chess.php:395
+msgid "You must select a local channel /chess/channelname"
+msgstr "Debe seleccionar un canal local /chess/nombredelcanal"
+
+#: ../../addon/chess/chess.php:923
+msgid "Enable notifications"
+msgstr "Habilitar notificaciones"
+
+#: ../../addon/twitter/twitter.php:99
+msgid "Post to Twitter"
+msgstr "Publicar en Twitter"
+
+#: ../../addon/twitter/twitter.php:154
+msgid "Twitter settings updated."
+msgstr "Se han actualizado los ajustes de Twitter."
+
+#: ../../addon/twitter/twitter.php:183
msgid ""
-"Three dimensional tic-tac-toe is just like the traditional game except that "
-"it is played on multiple levels simultaneously. "
-msgstr "El juego en 3D tic-tac-toe es como el juego tradicional, excepto que se juega en varios niveles simultáneamente."
+"No consumer key pair for Twitter found. Please contact your site "
+"administrator."
+msgstr "No se encontró ningún par de \"consumer key\" para Twitter. Póngase en contacto con el administrador del sitio."
-#: ../../extend/addon/addon/tictac/tictac.php:62
+#: ../../addon/twitter/twitter.php:205
msgid ""
-"In this case there are three levels. You win by getting three in a row on "
-"any level, as well as up, down, and diagonally across the different levels."
-msgstr "En este caso hay tres niveles. Usted gana al conseguir tres en una fila en cualquier nivel, así como arriba, abajo, y en diagonal a través de los diferentes niveles."
+"At this Hubzilla instance the Twitter plugin was enabled but you have not "
+"yet connected your account to your Twitter account. To do so click the "
+"button below to get a PIN from Twitter which you have to copy into the input"
+" box below and submit the form. Only your <strong>public</strong> posts will"
+" be posted to Twitter."
+msgstr "En esta instancia de Hubzilla, el complemento de Twitter estaba habilitado pero aún no ha conectado su cuenta a la cuenta de Twitter. Para ello, haga clic en el botón de abajo, para obtener un PIN de Twitter que debe copiar en el cuadro de entrada a continuación y enviar el formulario. Solo sus entradas <strong>públicas</ strong> se publicarán en Twitter."
+
+#: ../../addon/twitter/twitter.php:207
+msgid "Log in with Twitter"
+msgstr "Iniciar sesión en Twitter"
+
+#: ../../addon/twitter/twitter.php:210
+msgid "Copy the PIN from Twitter here"
+msgstr "Copiar aquí el PIN de Twitter"
-#: ../../extend/addon/addon/tictac/tictac.php:64
+#: ../../addon/twitter/twitter.php:237
msgid ""
-"The handicap game disables the center position on the middle level because "
-"the player claiming this square often has an unfair advantage."
-msgstr "El juego con hándicap deshabilita la posición central en el nivel medio porque el jugador que reclama este cuadrado a menudo tiene una ventaja injusta."
+"<strong>Note:</strong> Due your privacy settings (<em>Hide your profile "
+"details from unknown viewers?</em>) the link potentially included in public "
+"postings relayed to Twitter will lead the visitor to a blank page informing "
+"the visitor that the access to your profile has been restricted."
+msgstr "<strong>Aviso:</strong> Debido a su configuración de privacidad (<em>Ocultar los detalles de su perfil a los visitantes desconocidos?</em>), el enlace potencialmente incluido en las entradas públicas retransmitidas a Twitter llevará al visitante a una página en blanco informándolo de que el acceso a su perfil ha sido restringido."
-#: ../../extend/addon/addon/tictac/tictac.php:183
-msgid "You go first..."
-msgstr "Usted va primero..."
+#: ../../addon/twitter/twitter.php:242
+msgid "Allow posting to Twitter"
+msgstr "Permitir la publicación en Twitter"
-#: ../../extend/addon/addon/tictac/tictac.php:188
-msgid "I'm going first this time..."
-msgstr "Yo voy primero esta vez..."
+#: ../../addon/twitter/twitter.php:242
+msgid ""
+"If enabled your public postings can be posted to the associated Twitter "
+"account"
+msgstr "Si está activado, sus entradas públicas se pueden publicar en la cuenta de Twitter asociada"
-#: ../../extend/addon/addon/tictac/tictac.php:194
-msgid "You won!"
-msgstr "¡Usted ha ganado!"
+#: ../../addon/twitter/twitter.php:246
+msgid "Send public postings to Twitter by default"
+msgstr "Enviar mensajes públicos a Twitter de forma predeterminada"
-#: ../../extend/addon/addon/tictac/tictac.php:200
-#: ../../extend/addon/addon/tictac/tictac.php:225
-msgid "\"Cat\" game!"
-msgstr "¡El juego del \"gato\"!"
+#: ../../addon/twitter/twitter.php:246
+msgid ""
+"If enabled your public postings will be posted to the associated Twitter "
+"account by default"
+msgstr "Si está activado, sus entradas públicas se publicarán en la cuenta de Twitter asociada de forma predeterminada."
-#: ../../extend/addon/addon/tictac/tictac.php:223
-msgid "I won!"
-msgstr "¡He ganado yo!"
+#: ../../addon/twitter/twitter.php:264
+msgid "Twitter Post Settings"
+msgstr "Ajustes de publicación en Twitter"
-#: ../../extend/addon/addon/tour/tour.php:75
+#: ../../addon/smileybutton/smileybutton.php:273
+msgid "Deactivate the feature"
+msgstr "Desactivar la funcionalidad"
+
+#: ../../addon/smileybutton/smileybutton.php:277
+msgid "Hide the button and show the smilies directly."
+msgstr "Ocultar el botón y mostrar los smilies directamente."
+
+#: ../../addon/smileybutton/smileybutton.php:281
+msgid "Smileybutton Settings"
+msgstr "Ajustes de Smileybutton"
+
+#: ../../addon/piwik/piwik.php:85
+msgid ""
+"This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> "
+"analytics tool."
+msgstr "Este sitio es rastreado mediante la herramienta analítica <a href='http://www.piwik.org'>Piwik</a>."
+
+#: ../../addon/piwik/piwik.php:88
+#, php-format
+msgid ""
+"If you do not want that your visits are logged this way you <a href='%s'>can"
+" set a cookie to prevent Piwik from tracking further visits of the site</a> "
+"(opt-out)."
+msgstr "Si usted no quiere que sus visitas se registren de esta manera <a href='%s'>puede establecer una cookie para evitar que Piwik rastree otras visitas del sitio</a> (opt-out)."
+
+#: ../../addon/piwik/piwik.php:96
+msgid "Piwik Base URL"
+msgstr "URL base de Piwik"
+
+#: ../../addon/piwik/piwik.php:96
+msgid ""
+"Absolute path to your Piwik installation. (without protocol (http/s), with "
+"trailing slash)"
+msgstr "Ruta absoluta a la instalación de Piwik. (Sin protocolo (http/s), con barra diagonal)"
+
+#: ../../addon/piwik/piwik.php:97
+msgid "Site ID"
+msgstr "ID del sitio"
+
+#: ../../addon/piwik/piwik.php:98
+msgid "Show opt-out cookie link?"
+msgstr "Mostrar el enlace de la cookie opt-out?"
+
+#: ../../addon/piwik/piwik.php:99
+msgid "Asynchronous tracking"
+msgstr "Rastreo asíncrono"
+
+#: ../../addon/piwik/piwik.php:100
+msgid "Enable frontend JavaScript error tracking"
+msgstr "Habilitar la interfaz JavaScript de seguimiento de errores"
+
+#: ../../addon/piwik/piwik.php:100
+msgid "This feature requires Piwik >= 2.2.0"
+msgstr "Esta funcionalidad requiere Piwik >= 2.2.0"
+
+#: ../../addon/tour/tour.php:75
msgid "Edit your profile and change settings."
msgstr "Editar su perfil y cambiar los ajustes."
-#: ../../extend/addon/addon/tour/tour.php:76
+#: ../../addon/tour/tour.php:76
msgid "Click here to see activity from your connections."
msgstr "Pulsar aquí para ver la actividad de sus conexiones."
-#: ../../extend/addon/addon/tour/tour.php:77
+#: ../../addon/tour/tour.php:77
msgid "Click here to see your channel home."
msgstr "Pulsar aquí para ver la página de inicio de su canal."
-#: ../../extend/addon/addon/tour/tour.php:78
+#: ../../addon/tour/tour.php:78
msgid "You can access your private messages from here."
msgstr "Puede acceder a sus mensajes privados desde aquí."
-#: ../../extend/addon/addon/tour/tour.php:79
+#: ../../addon/tour/tour.php:79
msgid "Create new events here."
msgstr "Crear nuevos eventos aquí."
-#: ../../extend/addon/addon/tour/tour.php:80
+#: ../../addon/tour/tour.php:80
msgid ""
"You can accept new connections and change permissions for existing ones "
"here. You can also e.g. create groups of contacts."
msgstr "Puede aceptar nuevas conexiones y cambiar permisos para las existentes aquí. También puede, por ejemplo, crear grupos de contactos."
-#: ../../extend/addon/addon/tour/tour.php:81
+#: ../../addon/tour/tour.php:81
msgid "System notifications will arrive here"
msgstr "Las notificaciones del sistema llegarán aquí"
-#: ../../extend/addon/addon/tour/tour.php:82
+#: ../../addon/tour/tour.php:82
msgid "Search for content and users"
msgstr "Buscar contenido y usuarios"
-#: ../../extend/addon/addon/tour/tour.php:83
+#: ../../addon/tour/tour.php:83
msgid "Browse for new contacts"
msgstr "Buscar nuevos contactos"
-#: ../../extend/addon/addon/tour/tour.php:84
+#: ../../addon/tour/tour.php:84
msgid "Launch installed apps"
msgstr "Iniciar aplicaciones instaladas"
-#: ../../extend/addon/addon/tour/tour.php:85
+#: ../../addon/tour/tour.php:85
msgid "Looking for help? Click here."
msgstr "¿Busca ayuda? Pulse aquí."
-#: ../../extend/addon/addon/tour/tour.php:86
+#: ../../addon/tour/tour.php:86
msgid ""
"New events have occurred in your network. Click here to see what has "
"happened!"
msgstr "Se han producido nuevos eventos en su red. ¡Haga clic aquí para ver lo que ha sucedido!"
-#: ../../extend/addon/addon/tour/tour.php:87
+#: ../../addon/tour/tour.php:87
msgid "You have received a new private message. Click here to see from who!"
msgstr "Ha recibido un nuevo mensaje privado. Haga clic aquí para ver de quién!"
-#: ../../extend/addon/addon/tour/tour.php:88
+#: ../../addon/tour/tour.php:88
msgid "There are events this week. Click here too see which!"
msgstr "Hay eventos esta semana. Haga clic aquí para ver cuáles!"
-#: ../../extend/addon/addon/tour/tour.php:89
+#: ../../addon/tour/tour.php:89
msgid "You have received a new introduction. Click here to see who!"
msgstr "Ha recibido una nueva solicitud de conexión. ¡Pulse aquí para ver de quién!"
-#: ../../extend/addon/addon/tour/tour.php:90
+#: ../../addon/tour/tour.php:90
msgid ""
"There is a new system notification. Click here to see what has happened!"
msgstr "Hay una nueva notificación del sistema. ¡Haga clic aquí para ver lo que ha sucedido!"
-#: ../../extend/addon/addon/tour/tour.php:93
+#: ../../addon/tour/tour.php:93
msgid "Click here to share text, images, videos and sound."
msgstr "Haga clic aquí para compartir texto, imágenes, vídeos y sonido."
-#: ../../extend/addon/addon/tour/tour.php:94
+#: ../../addon/tour/tour.php:94
msgid "You can write an optional title for your update (good for long posts)."
msgstr "Puede escribir un título opcional para su actualización (bueno para los mensajes largos)."
-#: ../../extend/addon/addon/tour/tour.php:95
+#: ../../addon/tour/tour.php:95
msgid "Entering some categories here makes it easier to find your post later."
msgstr "Al ingresar algunos temas aquí, es más fácil encontrar su publicación más tarde."
-#: ../../extend/addon/addon/tour/tour.php:96
+#: ../../addon/tour/tour.php:96
msgid "Share photos, links, location, etc."
msgstr "Compartir fotos, enlaces, ubicación, etc."
-#: ../../extend/addon/addon/tour/tour.php:97
+#: ../../addon/tour/tour.php:97
msgid ""
"Only want to share content for a while? Make it expire at a certain date."
msgstr "¿Solo quieres compartir contenido durante un tiempo? Haga que expire en una fecha determinada."
-#: ../../extend/addon/addon/tour/tour.php:98
+#: ../../addon/tour/tour.php:98
msgid "You can password protect content."
msgstr "Puede proteger contenido con una contraseña."
-#: ../../extend/addon/addon/tour/tour.php:99
+#: ../../addon/tour/tour.php:99
msgid "Choose who you share with."
msgstr "Elegir con quién compartir."
-#: ../../extend/addon/addon/tour/tour.php:101
+#: ../../addon/tour/tour.php:101
msgid "Click here when you are done."
msgstr "Haga clic aquí cuando haya terminado."
-#: ../../extend/addon/addon/tour/tour.php:104
+#: ../../addon/tour/tour.php:104
msgid "Adjust from which channels posts should be displayed."
msgstr "Ajustar de qué canales se deben mostrar las publicaciones."
-#: ../../extend/addon/addon/tour/tour.php:105
+#: ../../addon/tour/tour.php:105
msgid "Only show posts from channels in the specified privacy group."
msgstr "Mostrar solo las entradas de los canales de un grupo específico de canales."
-#: ../../extend/addon/addon/tour/tour.php:109
+#: ../../addon/tour/tour.php:109
msgid "Easily find posts containing tags (keywords preceded by the \"#\" symbol)."
msgstr "Encuentre fácilmente entradas que contengan etiquetas (palabras clave precedidas del símbolo \"#\")."
-#: ../../extend/addon/addon/tour/tour.php:110
+#: ../../addon/tour/tour.php:110
msgid "Easily find posts in given category."
msgstr "Encuentre fácilmente las publicaciones en una categoría dada."
-#: ../../extend/addon/addon/tour/tour.php:111
+#: ../../addon/tour/tour.php:111
msgid "Easily find posts by date."
msgstr "Encuentre fácilmente entradas por fechas."
-#: ../../extend/addon/addon/tour/tour.php:112
+#: ../../addon/tour/tour.php:112
msgid ""
"Suggested users who have volounteered to be shown as suggestions, and who we"
" think you might find interesting."
msgstr "Se sugiere a los usuarios que se han ofrecido voluntariamente que se muestren como sugerencias, y que creemos que podrían resultar interesantes."
-#: ../../extend/addon/addon/tour/tour.php:113
+#: ../../addon/tour/tour.php:113
msgid "Here you see channels you have connected to."
msgstr "Aquí puede ver los canales a los que está conectado."
-#: ../../extend/addon/addon/tour/tour.php:114
+#: ../../addon/tour/tour.php:114
msgid "Save your search so you can repeat it at a later date."
msgstr "Guarde su búsqueda para poder repetirla en una fecha posterior."
-#: ../../extend/addon/addon/tour/tour.php:117
+#: ../../addon/tour/tour.php:117
msgid ""
"If you see this icon you can be sure that the sender is who it say it is. It"
" is normal that it is not always possible to verify the sender, so the icon "
"will be missing sometimes. There is usually no need to worry about that."
msgstr "Si ve este icono puede estar seguro de que el remitente es quien dice ser. Es normal que no siempre sea posible verificar el remitente, por lo que el icono faltará en ocasiones. Por lo general, no hay necesidad de preocuparse por eso."
-#: ../../extend/addon/addon/tour/tour.php:118
+#: ../../addon/tour/tour.php:118
msgid ""
"Danger! It seems someone tried to forge a message! This message is not "
"necessarily from who it says it is from!"
msgstr "¡Peligro! ¡Parece que alguien intentó falsificar un mensaje! ¡Este mensaje no es necesariamente de quien dice que es!"
-#: ../../extend/addon/addon/tour/tour.php:125
+#: ../../addon/tour/tour.php:125
msgid ""
"Welcome to Hubzilla! Would you like to see a tour of the UI?</p> <p>You can "
"pause it at any time and continue where you left off by reloading the page, "
@@ -10062,1246 +10480,318 @@ msgid ""
"return key"
msgstr "¡Bienvenido/a a Hubzilla! ¿Quiere hacer un recorrido por la interfaz de usuario?</p> <p> Puede detenerlo en cualquier momento y continuar donde lo dejó recargando la página o navegando a otra.</p> <p> También puede avanzar pulsando la tecla de retorno"
-#: ../../extend/addon/addon/twitter/twitter.php:99
-msgid "Post to Twitter"
-msgstr "Publicar en Twitter"
-
-#: ../../extend/addon/addon/twitter/twitter.php:154
-msgid "Twitter settings updated."
-msgstr "Se han actualizado los ajustes de Twitter."
+#: ../../addon/sendzid/sendzid.php:25
+msgid "Extended Identity Sharing"
+msgstr "Compartir identidad extendida"
-#: ../../extend/addon/addon/twitter/twitter.php:183
+#: ../../addon/sendzid/sendzid.php:26
msgid ""
-"No consumer key pair for Twitter found. Please contact your site "
-"administrator."
-msgstr "No se encontró ningún par de \"consumer key\" para Twitter. Póngase en contacto con el administrador del sitio."
+"Share your identity with all websites on the internet. When disabled, "
+"identity is only shared with sites in the matrix."
+msgstr "Compartir su identidad con todos los sitios web en Internet. Cuando se inhabilita, la identidad sólo se comparte con los sitios de la matriz."
-#: ../../extend/addon/addon/twitter/twitter.php:205
-msgid ""
-"At this Hubzilla instance the Twitter plugin was enabled but you have not "
-"yet connected your account to your Twitter account. To do so click the "
-"button below to get a PIN from Twitter which you have to copy into the input"
-" box below and submit the form. Only your <strong>public</strong> posts will"
-" be posted to Twitter."
-msgstr "En esta instancia de Hubzilla, el complemento de Twitter estaba habilitado pero aún no ha conectado su cuenta a la cuenta de Twitter. Para ello, haga clic en el botón de abajo, para obtener un PIN de Twitter que debe copiar en el cuadro de entrada a continuación y enviar el formulario. Solo sus entradas <strong>públicas</ strong> se publicarán en Twitter."
+#: ../../addon/tictac/tictac.php:21
+msgid "Three Dimensional Tic-Tac-Toe"
+msgstr "Juego en 3D Tic-Tac-Toe"
-#: ../../extend/addon/addon/twitter/twitter.php:207
-msgid "Log in with Twitter"
-msgstr "Iniciar sesión en Twitter"
+#: ../../addon/tictac/tictac.php:54
+msgid "3D Tic-Tac-Toe"
+msgstr "3D Tic-Tac-Toe"
-#: ../../extend/addon/addon/twitter/twitter.php:210
-msgid "Copy the PIN from Twitter here"
-msgstr "Copiar aquí el PIN de Twitter"
+#: ../../addon/tictac/tictac.php:59
+msgid "New game"
+msgstr "Nuevo juego"
+
+#: ../../addon/tictac/tictac.php:60
+msgid "New game with handicap"
+msgstr "Nuevo juego con hándicap"
-#: ../../extend/addon/addon/twitter/twitter.php:237
+#: ../../addon/tictac/tictac.php:61
msgid ""
-"<strong>Note:</strong> Due your privacy settings (<em>Hide your profile "
-"details from unknown viewers?</em>) the link potentially included in public "
-"postings relayed to Twitter will lead the visitor to a blank page informing "
-"the visitor that the access to your profile has been restricted."
-msgstr "<strong>Aviso:</strong> Debido a su configuración de privacidad (<em>Ocultar los detalles de su perfil a los visitantes desconocidos?</em>), el enlace potencialmente incluido en las entradas públicas retransmitidas a Twitter llevará al visitante a una página en blanco informándolo de que el acceso a su perfil ha sido restringido."
+"Three dimensional tic-tac-toe is just like the traditional game except that "
+"it is played on multiple levels simultaneously. "
+msgstr "El juego en 3D tic-tac-toe es como el juego tradicional, excepto que se juega en varios niveles simultáneamente."
-#: ../../extend/addon/addon/twitter/twitter.php:242
-msgid "Allow posting to Twitter"
-msgstr "Permitir la publicación en Twitter"
+#: ../../addon/tictac/tictac.php:62
+msgid ""
+"In this case there are three levels. You win by getting three in a row on "
+"any level, as well as up, down, and diagonally across the different levels."
+msgstr "En este caso hay tres niveles. Usted gana al conseguir tres en una fila en cualquier nivel, así como arriba, abajo, y en diagonal a través de los diferentes niveles."
-#: ../../extend/addon/addon/twitter/twitter.php:242
+#: ../../addon/tictac/tictac.php:64
msgid ""
-"If enabled your public postings can be posted to the associated Twitter "
-"account"
-msgstr "Si está activado, sus entradas públicas se pueden publicar en la cuenta de Twitter asociada"
+"The handicap game disables the center position on the middle level because "
+"the player claiming this square often has an unfair advantage."
+msgstr "El juego con hándicap deshabilita la posición central en el nivel medio porque el jugador que reclama este cuadrado a menudo tiene una ventaja injusta."
-#: ../../extend/addon/addon/twitter/twitter.php:246
-msgid "Send public postings to Twitter by default"
-msgstr "Enviar mensajes públicos a Twitter de forma predeterminada"
+#: ../../addon/tictac/tictac.php:183
+msgid "You go first..."
+msgstr "Usted va primero..."
-#: ../../extend/addon/addon/twitter/twitter.php:246
-msgid ""
-"If enabled your public postings will be posted to the associated Twitter "
-"account by default"
-msgstr "Si está activado, sus entradas públicas se publicarán en la cuenta de Twitter asociada de forma predeterminada."
+#: ../../addon/tictac/tictac.php:188
+msgid "I'm going first this time..."
+msgstr "Yo voy primero esta vez..."
-#: ../../extend/addon/addon/twitter/twitter.php:264
-msgid "Twitter Post Settings"
-msgstr "Ajustes de publicación en Twitter"
+#: ../../addon/tictac/tictac.php:194
+msgid "You won!"
+msgstr "¡Usted ha ganado!"
-#: ../../extend/addon/addon/twitter/twitter.php:773
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:95
-msgid "Submit Settings"
-msgstr "Enviar los ajustes"
+#: ../../addon/tictac/tictac.php:200 ../../addon/tictac/tictac.php:225
+msgid "\"Cat\" game!"
+msgstr "¡El juego del \"gato\"!"
-#: ../../extend/addon/addon/upload_limits/upload_limits.php:25
-msgid "Show Upload Limits"
-msgstr "Mostrar los límites de subida"
+#: ../../addon/tictac/tictac.php:223
+msgid "I won!"
+msgstr "¡He ganado yo!"
-#: ../../extend/addon/addon/upload_limits/upload_limits.php:27
-msgid "Hubzilla configured maximum size: "
-msgstr "Tamaño máximo configurado por Hubzilla: "
+#: ../../addon/pageheader/pageheader.php:43
+msgid "Message to display on every page on this server"
+msgstr "Mensaje para mostrar en todas las páginas de este servidor"
-#: ../../extend/addon/addon/upload_limits/upload_limits.php:28
-msgid "PHP upload_max_filesize: "
-msgstr "PHP upload_max_filesize: "
+#: ../../addon/pageheader/pageheader.php:48
+msgid "Pageheader Settings"
+msgstr "Ajustes del encabezado de página"
-#: ../../extend/addon/addon/upload_limits/upload_limits.php:29
-msgid "PHP post_max_size (must be larger than upload_max_filesize): "
-msgstr "PHP post_max_size (debe ser mayor que upload_max_filesize): "
+#: ../../addon/pageheader/pageheader.php:64
+msgid "pageheader Settings saved."
+msgstr "Se han guardado los ajustes del encabezado de página."
-#: ../../extend/addon/addon/visage/visage.php:93
-msgid "Recent Channel/Profile Viewers"
-msgstr "Visitantes recientes del canal o perfil"
+#: ../../addon/moremoods/moremoods.php:19
+msgid "lonely"
+msgstr "Solo/a"
-#: ../../extend/addon/addon/visage/visage.php:98
-msgid "This plugin/addon has not been configured."
-msgstr "El plugin o complemento no se ha configurado."
+#: ../../addon/moremoods/moremoods.php:20
+msgid "drunk"
+msgstr "ebrio/a"
-#: ../../extend/addon/addon/visage/visage.php:99
-#, php-format
-msgid "Please visit the Visage settings on %s"
-msgstr "Por favor, revise los ajustes de Visage en %s"
+#: ../../addon/moremoods/moremoods.php:21
+msgid "horny"
+msgstr "caliente"
-#: ../../extend/addon/addon/visage/visage.php:99
-msgid "your feature settings page"
-msgstr "su página de ajustes de las funcionalidades"
+#: ../../addon/moremoods/moremoods.php:22
+msgid "stoned"
+msgstr "drogado/a"
-#: ../../extend/addon/addon/visage/visage.php:112
-msgid "No entries."
-msgstr "No hay entradas."
+#: ../../addon/moremoods/moremoods.php:23
+msgid "fucked up"
+msgstr "jodido/a"
-#: ../../extend/addon/addon/visage/visage.php:166
-msgid "Enable Visage Visitor Logging"
-msgstr "Habilitar el registro de visitantes de Visage"
+#: ../../addon/moremoods/moremoods.php:24
+msgid "clusterfucked"
+msgstr "hecho/a polvo"
-#: ../../extend/addon/addon/visage/visage.php:170
-msgid "Visage Settings"
-msgstr "Ajustes de Visage"
+#: ../../addon/moremoods/moremoods.php:25
+msgid "crazy"
+msgstr "loco/a"
-#: ../../extend/addon/addon/wholikesme/wholikesme.php:29
-msgid "Who likes me?"
-msgstr "¿Quién me ha puesto \"Me gusta\"?"
+#: ../../addon/moremoods/moremoods.php:26
+msgid "hurt"
+msgstr "ofendido/a"
-#: ../../extend/addon/addon/wppost/wppost.php:45
-msgid "Post to WordPress"
-msgstr "Publicar en WordPress"
+#: ../../addon/moremoods/moremoods.php:27
+msgid "sleepy"
+msgstr "soñoliento/a"
-#: ../../extend/addon/addon/wppost/wppost.php:82
-msgid "Enable WordPress Post Plugin"
-msgstr "Habilitar el plugin de publicación en WordPress"
+#: ../../addon/moremoods/moremoods.php:28
+msgid "grumpy"
+msgstr "gruñón/ona"
-#: ../../extend/addon/addon/wppost/wppost.php:86
-msgid "WordPress username"
-msgstr "Nombre de usuario de WordPress"
+#: ../../addon/moremoods/moremoods.php:29
+msgid "high"
+msgstr "superior"
-#: ../../extend/addon/addon/wppost/wppost.php:90
-msgid "WordPress password"
-msgstr "Contraseña de WordPress"
+#: ../../addon/moremoods/moremoods.php:30
+msgid "semi-conscious"
+msgstr "semiconsciente"
-#: ../../extend/addon/addon/wppost/wppost.php:94
-msgid "WordPress API URL"
-msgstr "URL de la API de WordPress"
+#: ../../addon/moremoods/moremoods.php:31
+msgid "in love"
+msgstr "enamorado/a"
-#: ../../extend/addon/addon/wppost/wppost.php:95
-msgid "Typically https://your-blog.tld/xmlrpc.php"
-msgstr "Habitualmente https://your-blog.tld/xmlrpc.php"
+#: ../../addon/moremoods/moremoods.php:32
+msgid "in lust"
+msgstr "lujurioso/a"
-#: ../../extend/addon/addon/wppost/wppost.php:98
-msgid "WordPress blogid"
-msgstr "Blog de WordPress"
+#: ../../addon/moremoods/moremoods.php:33
+msgid "naked"
+msgstr "desnudo/a"
-#: ../../extend/addon/addon/wppost/wppost.php:99
-msgid "For multi-user sites such as wordpress.com, otherwise leave blank"
-msgstr "Para sitios multiusuario como wordpress.com, de lo contrario, dejar en blanco"
+#: ../../addon/moremoods/moremoods.php:34
+msgid "stinky"
+msgstr "apestoso/a"
-#: ../../extend/addon/addon/wppost/wppost.php:105
-msgid "Post to WordPress by default"
-msgstr "Publicar en WordPress por defecto"
+#: ../../addon/moremoods/moremoods.php:35
+msgid "sweaty"
+msgstr "sudoroso/a"
-#: ../../extend/addon/addon/wppost/wppost.php:109
-msgid "Forward comments (requires hubzilla_wp plugin)"
-msgstr "Reenviar comentarios (requerido por el plugin hubzilla_wp)"
+#: ../../addon/moremoods/moremoods.php:36
+msgid "bleeding out"
+msgstr "una maldición"
-#: ../../extend/addon/addon/wppost/wppost.php:113
-msgid "WordPress Post Settings"
-msgstr "Ajustes de publicación en WordPress"
+#: ../../addon/moremoods/moremoods.php:37
+msgid "victorious"
+msgstr "victorioso/a"
-#: ../../extend/addon/addon/wppost/wppost.php:129
-msgid "Wordpress Settings saved."
-msgstr "Se han guardado los ajustes de WordPress."
+#: ../../addon/moremoods/moremoods.php:38
+msgid "defeated"
+msgstr "derrotado/a"
-#: ../../extend/addon/addon/xmpp/xmpp.php:31
+#: ../../addon/moremoods/moremoods.php:39
+msgid "envious"
+msgstr "envidioso/a"
+
+#: ../../addon/moremoods/moremoods.php:40
+msgid "jealous"
+msgstr "celoso/a"
+
+#: ../../addon/xmpp/xmpp.php:31
msgid "XMPP settings updated."
msgstr "Se han actualizado los ajustes de XMPP."
-#: ../../extend/addon/addon/xmpp/xmpp.php:53
+#: ../../addon/xmpp/xmpp.php:53
msgid "Enable Chat"
msgstr "Habilitar el chat"
-#: ../../extend/addon/addon/xmpp/xmpp.php:58
+#: ../../addon/xmpp/xmpp.php:58
msgid "Individual credentials"
msgstr "Credenciales individuales"
-#: ../../extend/addon/addon/xmpp/xmpp.php:64
+#: ../../addon/xmpp/xmpp.php:64
msgid "Jabber BOSH server"
msgstr "Servidor BOSH de Jabber"
-#: ../../extend/addon/addon/xmpp/xmpp.php:69
+#: ../../addon/xmpp/xmpp.php:69
msgid "XMPP Settings"
msgstr "Ajustes de XMPP"
-#: ../../extend/addon/addon/xmpp/xmpp.php:92
+#: ../../addon/xmpp/xmpp.php:92
msgid "Jabber BOSH host"
msgstr "BOSH de Jabber"
-#: ../../extend/addon/addon/xmpp/xmpp.php:93
+#: ../../addon/xmpp/xmpp.php:93
msgid "Use central userbase"
msgstr "Usar la base de usuarios central"
-#: ../../extend/addon/addon/xmpp/xmpp.php:93
+#: ../../addon/xmpp/xmpp.php:93
msgid ""
"If enabled, members will automatically login to an ejabberd server that has "
"to be installed on this machine with synchronized credentials via the "
"\"auth_ejabberd.php\" script."
msgstr "Si está habilitado, los miembros se conectarán automáticamente a un servidor ejabberd que debe instalarse en esta máquina con credenciales sincronizadas a través del script \"auth ejabberd.php\"."
-#: ../../extend/addon/addon/cdav/include/widgets.php:37
-msgid "Select Channel"
-msgstr "Seleccionar un canal"
-
-#: ../../extend/addon/addon/cdav/include/widgets.php:42
-msgid "Read-write"
-msgstr "Lectura y escritura"
-
-#: ../../extend/addon/addon/cdav/include/widgets.php:43
-msgid "Read-only"
-msgstr "Sólo lectura"
-
-#: ../../extend/addon/addon/cdav/include/widgets.php:116
-msgid "My Calendars"
-msgstr "Mis calendarios"
-
-#: ../../extend/addon/addon/cdav/include/widgets.php:118
-msgid "Shared Calendars"
-msgstr "Calendarios compartidos"
-
-#: ../../extend/addon/addon/cdav/include/widgets.php:122
-msgid "Share this calendar"
-msgstr "Compartir este calendario"
-
-#: ../../extend/addon/addon/cdav/include/widgets.php:124
-msgid "Calendar name and color"
-msgstr "Nombre y color del calendario"
-
-#: ../../extend/addon/addon/cdav/include/widgets.php:126
-msgid "Create new calendar"
-msgstr "Crear un nuevo calendario"
-
-#: ../../extend/addon/addon/cdav/include/widgets.php:128
-msgid "Calendar Name"
-msgstr "Nombre del calendario"
-
-#: ../../extend/addon/addon/cdav/include/widgets.php:129
-msgid "Calendar Tools"
-msgstr "Gestión de calendarios"
-
-#: ../../extend/addon/addon/cdav/include/widgets.php:130
-msgid "Import calendar"
-msgstr "Importar un calendario"
-
-#: ../../extend/addon/addon/cdav/include/widgets.php:131
-msgid "Select a calendar to import to"
-msgstr "Seleccionar un calendario para importarlo"
-
-#: ../../extend/addon/addon/cdav/include/widgets.php:158
-msgid "Addressbooks"
-msgstr "Agenda de direcciones"
-
-#: ../../extend/addon/addon/cdav/include/widgets.php:160
-msgid "Addressbook name"
-msgstr "Nombre de la agenda"
-
-#: ../../extend/addon/addon/cdav/include/widgets.php:162
-msgid "Create new addressbook"
-msgstr "Crear una nueva agenda de direcciones"
-
-#: ../../extend/addon/addon/cdav/include/widgets.php:163
-msgid "Addressbook Name"
-msgstr "Nombre de la agenda"
-
-#: ../../extend/addon/addon/cdav/include/widgets.php:165
-msgid "Addressbook Tools"
-msgstr "Gestión de agendas de direcciones"
-
-#: ../../extend/addon/addon/cdav/include/widgets.php:166
-msgid "Import addressbook"
-msgstr "Importar una agenda de direcciones"
-
-#: ../../extend/addon/addon/cdav/include/widgets.php:167
-msgid "Select an addressbook to import to"
-msgstr "Seleccionar una agenda para importarla"
-
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:744
-msgid "INVALID EVENT DISMISSED!"
-msgstr "¡EVENTO NO VÃLIDO RECHAZADO!"
-
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:745
-msgid "Summary: "
-msgstr "Resumen: "
-
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:746
-msgid "Date: "
-msgstr "Fecha: "
-
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:747
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:754
-msgid "Reason: "
-msgstr "Razón: "
-
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:752
-msgid "INVALID CARD DISMISSED!"
-msgstr "¡TARJETA NO VÃLIDA RECHAZADA!"
-
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:753
-msgid "Name: "
-msgstr "Nombre: "
-
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:770
-msgid ""
-"You have to enable this plugin in Feature/Addon Settings > CalDAV/CardDAV "
-"Settings before you can use it."
-msgstr "Debe habilitar este complemento en Ajustes/Complementos>Configuración de CalDAV/CardDAV antes de poder utilizarlo."
-
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:836
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:837
-msgid "Example: YYYY-MM-DD HH:mm"
-msgstr "Ejemplo: YYYY-MM-DD HH:mm"
-
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:837
-msgid "End date and time"
-msgstr "Fecha y hora de finalización"
-
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:852
-msgid "List month"
-msgstr "Lista mensual"
-
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:853
-msgid "List week"
-msgstr "Lista semanal"
-
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:854
-msgid "List day"
-msgstr "Lista diaria"
-
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:861
-msgid "More"
-msgstr "Más"
-
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:862
-msgid "Less"
-msgstr "Menos"
-
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:863
-msgid "Select calendar"
-msgstr "Seleccionar un calendario"
-
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:865
-msgid "Delete all"
-msgstr "Eliminar todos"
-
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:867
-msgid "Sorry! Editing of recurrent events is not yet implemented."
-msgstr "¡Disculpas! La edición de eventos recurrentes aún no se ha implementado."
-
-#: ../../extend/addon/addon/cdav/cdav.php:36
-msgid "Errors encountered creating database table: "
-msgstr "Errores encontrados al crear la tabla de la base de datos: "
-
-#: ../../extend/addon/addon/cdav/cdav.php:197
-msgid "Default Calendar"
-msgstr "Calendario por defecto"
-
-#: ../../extend/addon/addon/cdav/cdav.php:206
-msgid "Default Addressbook"
-msgstr "Agenda de direcciones por defecto"
-
-#: ../../extend/addon/addon/cdav/cdav.php:215
-msgid "CalDAV/CardDAV Settings saved."
-msgstr "Se ha guardado la configuración de CalDAV/CardDAV."
-
-#: ../../extend/addon/addon/cdav/cdav.php:234
-msgid "Enable CalDAV/CardDAV Server for this channel"
-msgstr "Habilitar el servidor CalDAV/CardDAV para este canal"
-
-#: ../../extend/addon/addon/cdav/cdav.php:237
-#, php-format
-msgid "Your CalDAV resources are located at %s "
-msgstr "Los recursos de CalDAV se encuentran en %s"
-
-#: ../../extend/addon/addon/cdav/cdav.php:240
-#, php-format
-msgid "Your CardDAV resources are located at %s "
-msgstr "Sus recursos de CalDAV están localizados en %s "
-
-#: ../../extend/addon/addon/cdav/cdav.php:246
-msgid "CalDAV/CardDAV Settings"
-msgstr "Configuración de CalDAV/CardDAV"
-
-#: ../../extend/addon/addon/cdav/cdav.php:272
-#: ../../include/connections.php:670
-msgid "Home, Voice"
-msgstr "Llamadas particulares"
-
-#: ../../extend/addon/addon/cdav/cdav.php:273
-#: ../../include/connections.php:671
-msgid "Home, Fax"
-msgstr "Fax particular"
-
-#: ../../extend/addon/addon/cdav/cdav.php:275
-#: ../../include/connections.php:673
-msgid "Work, Voice"
-msgstr "Llamadas de trabajo"
-
-#: ../../extend/addon/addon/cdav/cdav.php:276
-#: ../../include/connections.php:674
-msgid "Work, Fax"
-msgstr "Fax de trabajo"
-
-#: ../../extend/addon/addon/chess/chess.php:276
-#: ../../extend/addon/addon/chess/chess.php:433
-msgid "Invalid game."
-msgstr "Juego no válido."
-
-#: ../../extend/addon/addon/chess/chess.php:282
-#: ../../extend/addon/addon/chess/chess.php:439
-msgid "You are not a player in this game."
-msgstr "Usted no participa en este juego."
-
-#: ../../extend/addon/addon/chess/chess.php:315
-msgid "You must be a local channel to create a game."
-msgstr "Debe ser un canal local para crear un juego"
-
-#: ../../extend/addon/addon/chess/chess.php:333
-msgid "You must select one opponent that is not yourself."
-msgstr "Debe seleccionar un oponente que no sea usted mismo."
-
-#: ../../extend/addon/addon/chess/chess.php:336
-msgid "Creating new game..."
-msgstr "Crear un nuevo juego..."
-
-#: ../../extend/addon/addon/chess/chess.php:342
-msgid "You must select white or black."
-msgstr "Debe elegir blancas o negras."
-
-#: ../../extend/addon/addon/chess/chess.php:349
-msgid "Error creating new game."
-msgstr "Error al crear un nuevo juego."
-
-#: ../../extend/addon/addon/chess/chess.php:381 ../../include/channel.php:899
-msgid "Requested channel is not available."
-msgstr "El canal solicitado no está disponible."
-
-#: ../../extend/addon/addon/chess/chess.php:395
-msgid "You must select a local channel /chess/channelname"
-msgstr "Debe seleccionar un canal local /chess/nombredelcanal"
-
-#: ../../extend/addon/addon/chess/chess.php:923
-msgid "Enable notifications"
-msgstr "Habilitar notificaciones"
-
-#: ../../extend/addon/addon/likebanner/likebanner.php:51
-msgid "Your Webbie:"
-msgstr "Su webbie: "
-
-#: ../../extend/addon/addon/likebanner/likebanner.php:54
-msgid "Fontsize (px):"
-msgstr "Tamaño de fuente (px): "
-
-#: ../../extend/addon/addon/likebanner/likebanner.php:68
-msgid "Link:"
-msgstr "Enlace: "
-
-#: ../../extend/addon/addon/likebanner/likebanner.php:70
-msgid "Like us on Hubzilla"
-msgstr "Múestrenos su agrado en Hubzilla"
-
-#: ../../extend/addon/addon/likebanner/likebanner.php:72
-msgid "Embed:"
-msgstr "Incorporado: "
-
-#: ../../extend/addon/addon/openid/Mod_Id.php:85
-#: ../../include/selectors.php:49 ../../include/selectors.php:66
-msgid "Male"
-msgstr "Hombre"
-
-#: ../../extend/addon/addon/openid/Mod_Id.php:87
-#: ../../include/selectors.php:49 ../../include/selectors.php:66
-msgid "Female"
-msgstr "Mujer"
-
-#: ../../extend/addon/addon/openid/MysqlProvider.php:52
-msgid "First Name"
-msgstr "Nombre"
-
-#: ../../extend/addon/addon/openid/MysqlProvider.php:53
-msgid "Last Name"
-msgstr "Apellido"
-
-#: ../../extend/addon/addon/openid/MysqlProvider.php:55
-msgid "Full Name"
-msgstr "Nombre completo"
-
-#: ../../extend/addon/addon/openid/MysqlProvider.php:61
-msgid "Profile Photo 16px"
-msgstr "Foto del perfil 16px"
-
-#: ../../extend/addon/addon/openid/MysqlProvider.php:62
-msgid "Profile Photo 32px"
-msgstr "Foto del perfil 32px"
-
-#: ../../extend/addon/addon/openid/MysqlProvider.php:63
-msgid "Profile Photo 48px"
-msgstr "Foto del perfil 48px"
-
-#: ../../extend/addon/addon/openid/MysqlProvider.php:64
-msgid "Profile Photo 64px"
-msgstr "Foto del perfil 64px"
-
-#: ../../extend/addon/addon/openid/MysqlProvider.php:65
-msgid "Profile Photo 80px"
-msgstr "Foto del perfil 80px"
-
-#: ../../extend/addon/addon/openid/MysqlProvider.php:66
-msgid "Profile Photo 128px"
-msgstr "Foto del perfil 128px"
-
-#: ../../extend/addon/addon/openid/MysqlProvider.php:67
-msgid "Timezone"
-msgstr "Zona horaria"
-
-#: ../../extend/addon/addon/openid/MysqlProvider.php:70
-msgid "Birth Year"
-msgstr "Año de nacimiento"
-
-#: ../../extend/addon/addon/openid/MysqlProvider.php:71
-msgid "Birth Month"
-msgstr "Mes de nacimiento"
-
-#: ../../extend/addon/addon/openid/MysqlProvider.php:72
-msgid "Birth Day"
-msgstr "Día de nacimiento"
-
-#: ../../extend/addon/addon/openid/MysqlProvider.php:73
-msgid "Birthdate"
-msgstr "Fecha de nacimiento"
-
-#: ../../extend/addon/addon/openid/openid.php:49
-msgid ""
-"We encountered a problem while logging in with the OpenID you provided. "
-"Please check the correct spelling of the ID."
-msgstr "Encontramos un problema al iniciar sesión con el OpenID que proporcionó. Compruebe si el ID está correctamente escrito."
-
-#: ../../extend/addon/addon/openid/openid.php:49
-msgid "The error message was:"
-msgstr "El mensaje de error ha sido: "
-
-#: ../../extend/addon/addon/openid/Mod_Openid.php:30
-msgid "OpenID protocol error. No ID returned."
-msgstr "Error de protocolo OpenID. No se recuperó ninguna ID."
-
-#: ../../extend/addon/addon/openid/Mod_Openid.php:188
-#: ../../include/auth.php:286
-msgid "Login failed."
-msgstr "El acceso ha fallado."
-
-#: ../../extend/addon/addon/diaspora_reconnect/diaspora_reconnect.php:44
-#, php-format
-msgid "Reconnecting %d connections"
-msgstr "Reconectando %d conexiones"
-
-#: ../../extend/addon/addon/diaspora_reconnect/diaspora_reconnect.php:63
-msgid "Diaspora Reconnect"
-msgstr "Reconectar con Diaspora"
-
-#: ../../extend/addon/addon/diaspora_reconnect/diaspora_reconnect.php:65
-msgid ""
-"Use this form to re-establish Diaspora connections which were initially made"
-" from a different hub."
-msgstr "Utilice este formulario para restablecer las conexiones de diáspora que se hicieron inicialmente desde un hub diferente."
-
-#: ../../extend/addon/addon/diaspora_reconnect/diaspora_reconnect.php:70
-msgid "Reconnect"
-msgstr "Reconectar"
-
-#: ../../extend/addon/addon/mailtest/mailtest.php:19
-msgid "Send test email"
-msgstr "Enviar un correo electrónico de prueba"
-
-#: ../../extend/addon/addon/mailtest/mailtest.php:66
-msgid "Mail sent."
-msgstr "El correo electrónico ha sido enviado."
-
-#: ../../extend/addon/addon/mailtest/mailtest.php:68
-msgid "Sending of mail failed."
-msgstr "No se pudo enviar el correo."
-
-#: ../../extend/addon/addon/mailtest/mailtest.php:77
-msgid "Mail Test"
-msgstr "Prueba de correo"
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:57
-msgid "Errors encountered deleting database table "
-msgstr "Errores encontrados al eliminar la tabla de la base de datos"
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:96
-msgid "Drop tables when uninstalling?"
-msgstr "¿Eliminar tablas al desinstalar?"
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:96
-msgid ""
-"If checked, the Rendezvous database tables will be deleted when the plugin "
-"is uninstalled."
-msgstr "Si se selecciona, las tablas de la base de datos Rendezvous se eliminarán cuando se desinstale el plugin."
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:97
-msgid "Mapbox Access Token"
-msgstr "Token de acceso de Mapbox"
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:97
-msgid ""
-"If you enter a Mapbox access token, it will be used to retrieve map tiles "
-"from Mapbox instead of the default OpenStreetMap tile server."
-msgstr "Si introduce un token de acceso a Mapbox, se utilizará para recuperar los mapas de mosaicos de imágenes de Mapbox en lugar del servidor de mosaico de imágenes OpenStreetMap predeterminado."
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:162
-msgid "Rendezvous"
-msgstr "Rendezvous"
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:167
-msgid ""
-"This identity has been deleted by another member due to inactivity. Please "
-"press the \"New identity\" button or refresh the page to register a new "
-"identity. You may use the same name."
-msgstr "Esta identidad ha sido eliminada por otro miembro debido a su inactividad. Pulse el botón \"Nueva identidad\" o actualice la página para registrar una nueva identidad. Puede usar el mismo nombre."
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:168
-msgid "Welcome to Rendezvous!"
-msgstr "¡Bienvenido/a a Rendevous!"
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:169
-msgid ""
-"Enter your name to join this rendezvous. To begin sharing your location with"
-" the other members, tap the GPS control. When your location is discovered, a"
-" red dot will appear and others will be able to see you on the map."
-msgstr "Introduzca tu nombre para unirse a esta cita. Para comenzar a compartir su ubicación con los demás miembros, pulse en el control GPS. Cuando se descubra su ubicación, aparecerá un punto rojo y otros podrán verlo en el mapa."
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:171
-msgid "Let's meet here"
-msgstr "Reunámonos aquí"
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:174
-msgid "New marker"
-msgstr "Nuevo marcador"
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:175
-msgid "Edit marker"
-msgstr "Editar un marcador"
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:176
-msgid "New identity"
-msgstr "Nueva identidad"
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:177
-msgid "Delete marker"
-msgstr "Eliminar un marcador"
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:178
-msgid "Delete member"
-msgstr "Eliminar un miembro"
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:179
-msgid "Edit proximity alert"
-msgstr "Editar alerta de proximidad"
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:180
-msgid ""
-"A proximity alert will be issued when this member is within a certain radius"
-" of you.<br><br>Enter a radius in meters (0 to disable):"
-msgstr "Se emitirá una alerta de proximidad cuando este miembro esté dentro de un radio determinado respecto a usted.<br><br> Ingrese el radio en metros (0 para deshabilitar):"
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:180
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:185
-msgid "distance"
-msgstr "distancia"
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:181
-msgid "Proximity alert distance (meters)"
-msgstr "Distancia (en metros) para la alerta de proximidad"
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:182
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:184
-msgid ""
-"A proximity alert will be issued when you are within a certain radius of the"
-" marker location.<br><br>Enter a radius in meters (0 to disable):"
-msgstr "Se emitirá una alerta de proximidad cuando usted esté dentro de un radio determinado respecto al marcador de localización.<br><br> Ingrese el radio en metros (0 para deshabilitar):"
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:183
-msgid "Marker proximity alert"
-msgstr "Marcador de alerta de proximidad"
+#: ../../addon/wholikesme/wholikesme.php:29
+msgid "Who likes me?"
+msgstr "¿Quién me ha puesto \"Me gusta\"?"
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:186
-msgid "Reminder note"
-msgstr "Recordatorio"
+#: ../../addon/pumpio/pumpio.php:148
+msgid "You are now authenticated to pumpio."
+msgstr "Ahora está autenticado en pump.io."
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:187
-msgid ""
-"Enter a note to be displayed when you are within the specified proximity..."
-msgstr "Introduzca una nota que se mostrará cuando esté dentro de la proximidad especificada..."
+#: ../../addon/pumpio/pumpio.php:149
+msgid "return to the featured settings page"
+msgstr "Volver a la página de configuración destacada"
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:199
-msgid "Add new rendezvous"
-msgstr "Añadir una nueva cita"
+#: ../../addon/pumpio/pumpio.php:163
+msgid "Post to Pump.io"
+msgstr "Publicar en Pump.io"
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:200
-msgid ""
-"Create a new rendezvous and share the access link with those you wish to "
-"invite to the group. Those who open the link become members of the "
-"rendezvous. They can view other member locations, add markers to the map, or"
-" share their own locations with the group."
-msgstr "Cree una nueva cita y comparta los enlaces de acceso con los que desea invitar al grupo. Aquellos que abran el enlace se convertirán en miembros de la cita. Pueden ver otras ubicaciones de miembros, añadir marcadores al mapa o compartir sus propias ubicaciones con el grupo."
+#: ../../addon/pumpio/pumpio.php:198
+msgid "Pump.io servername"
+msgstr "Nombre del servidor de Pump.io"
-#: ../../extend/addon/addon/firefox/firefox.php:23
-msgid "Install Firefox Sharing Tools"
-msgstr "Instalar las herramientas de compartición de Firefox"
+#: ../../addon/pumpio/pumpio.php:198
+msgid "Without \"http://\" or \"https://\""
+msgstr "Sin \"http://\" or \"https://\""
-#: ../../extend/addon/addon/firefox/firefox.php:34
-msgid "Share content from Firefox to $Projectname"
-msgstr "Compartir contenido desde Firefox a $Projectname"
+#: ../../addon/pumpio/pumpio.php:202
+msgid "Pump.io username"
+msgstr "Nombre de usuario en Pump.io"
-#: ../../extend/addon/addon/firefox/firefox.php:37
-msgid "Install Firefox Sharing Tools to this web browser"
-msgstr "Instalar las herramientas de compartición de Firefox en este navegador"
+#: ../../addon/pumpio/pumpio.php:202
+msgid "Without the servername"
+msgstr "Sin el nombre del servidor"
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:105
-msgid "Error retrieving wiki"
-msgstr "Error al recuperar el wiki"
+#: ../../addon/pumpio/pumpio.php:213
+msgid "You are not authenticated to pumpio"
+msgstr "No está autenticado en pump.io"
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:112
-msgid "Error creating zip file export folder"
-msgstr "Error al crear el fichero comprimido zip de la carpeta a exportar"
+#: ../../addon/pumpio/pumpio.php:215
+msgid "(Re-)Authenticate your pump.io connection"
+msgstr "(Re-)Autenticar su conexión en pump.io"
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:130
-msgid "Error downloading wiki: "
-msgstr "Error al descargar el wiki: "
+#: ../../addon/pumpio/pumpio.php:219
+msgid "Enable pump.io Post Plugin"
+msgstr "Habilitar el plugin de publicación en pump.io"
-#: ../../extend/addon/addon/gitwiki/gitwiki.php:76
-#: ../../include/widgets.php:956
-msgid "Wiki Pages"
-msgstr "Páginas del wiki"
+#: ../../addon/pumpio/pumpio.php:223
+msgid "Post to pump.io by default"
+msgstr "Publicar por defecto en pump.io"
-#: ../../extend/addon/addon/gitwiki/gitwiki.php:81
-#: ../../include/widgets.php:962
-msgid "Add new page"
-msgstr "Añadir una nueva página"
+#: ../../addon/pumpio/pumpio.php:227
+msgid "Should posts be public"
+msgstr "¿Las entradas deben ser públicas?"
-#: ../../extend/addon/addon/gitwiki/gitwiki.php:82
-#: ../../include/widgets.php:963
-msgid "Page name"
-msgstr "Nombre de la página"
+#: ../../addon/pumpio/pumpio.php:231
+msgid "Mirror all public posts"
+msgstr "Reflejar todos los mensajes públicos"
-#: ../../extend/addon/addon/gitwiki/gitwiki.php:95
-#: ../../include/widgets.php:913
-msgid "Wiki List"
-msgstr "Lista de wikis"
+#: ../../addon/pumpio/pumpio.php:237
+msgid "Pump.io Post Settings"
+msgstr "Ajustes de publicación en pump.io"
-#: ../../extend/addon/addon/gnusoc/gnusoc.php:129
-msgid "Enable the GNU-Social protocol for this channel"
-msgstr "Activar el protocolo de GNU-Social para este canal"
+#: ../../addon/pumpio/pumpio.php:266
+msgid "PumpIO Settings saved."
+msgstr "Se han guardado los ajustes de PumpIO."
-#: ../../extend/addon/addon/opensearch/opensearch.php:26 ../../boot.php:1186
-#, php-format
-msgctxt "opensearch"
-msgid "Search %1$s (%2$s)"
-msgstr "Buscar %1$s (%2$s)"
+#: ../../addon/ldapauth/ldapauth.php:61
+msgid "An account has been created for you."
+msgstr "Se ha creado una cuenta para usted."
-#: ../../extend/addon/addon/opensearch/opensearch.php:28 ../../boot.php:1186
-msgctxt "opensearch"
-msgid "$Projectname"
-msgstr "$Projectname"
+#: ../../addon/ldapauth/ldapauth.php:68
+msgid "Authentication successful but rejected: account creation is disabled."
+msgstr "Autenticación correcta pero rechazada: la creación de cuentas está deshabilitada."
-#: ../../extend/addon/addon/opensearch/opensearch.php:43
+#: ../../addon/opensearch/opensearch.php:43
msgid "Search $Projectname"
msgstr "Buscar $Projectname"
-#: ../../include/dba/dba_driver.php:187
-#, php-format
-msgid "Cannot locate DNS info for database server '%s'"
-msgstr "No se ha podido localizar información de DNS para el servidor de base de datos “%sâ€"
-
-#: ../../include/language.php:367 ../../include/text.php:1788
-msgid "default"
-msgstr "por defecto"
-
-#: ../../include/language.php:380
-msgid "Select an alternate language"
-msgstr "Seleccionar un idioma alternativo"
-
-#: ../../include/account.php:35
-msgid "Not a valid email address"
-msgstr "Dirección de correo no válida"
-
-#: ../../include/account.php:37
-msgid "Your email domain is not among those allowed on this site"
-msgstr "Su dirección de correo no pertenece a ninguno de los dominios permitidos en este sitio."
-
-#: ../../include/account.php:43
-msgid "Your email address is already registered at this site."
-msgstr "Su dirección de correo está ya registrada en este sitio."
-
-#: ../../include/account.php:75
-msgid "An invitation is required."
-msgstr "Es obligatorio que le inviten."
-
-#: ../../include/account.php:79
-msgid "Invitation could not be verified."
-msgstr "No se ha podido verificar su invitación."
-
-#: ../../include/account.php:130
-msgid "Please enter the required information."
-msgstr "Por favor introduzca la información requerida."
-
-#: ../../include/account.php:198
-msgid "Failed to store account information."
-msgstr "La información de la cuenta no se ha podido guardar."
-
-#: ../../include/account.php:263
-#, php-format
-msgid "Registration confirmation for %s"
-msgstr "Confirmación de registro para %s"
-
-#: ../../include/account.php:330
-#, php-format
-msgid "Registration request at %s"
-msgstr "Solicitud de registro en %s"
-
-#: ../../include/account.php:352
-msgid "your registration password"
-msgstr "su contraseña de registro"
-
-#: ../../include/account.php:358 ../../include/account.php:420
-#, php-format
-msgid "Registration details for %s"
-msgstr "Detalles del registro de %s"
-
-#: ../../include/account.php:431
-msgid "Account approved."
-msgstr "Cuenta aprobada."
-
-#: ../../include/account.php:471
-#, php-format
-msgid "Registration revoked for %s"
-msgstr "Registro revocado para %s"
-
-#: ../../include/account.php:756 ../../include/account.php:758
-msgid "Click here to upgrade."
-msgstr "Pulse aquí para actualizar"
-
-#: ../../include/account.php:764
-msgid "This action exceeds the limits set by your subscription plan."
-msgstr "Esta acción supera los límites establecidos por su plan de suscripción "
-
-#: ../../include/account.php:769
-msgid "This action is not available under your subscription plan."
-msgstr "Esta acción no está disponible en su plan de suscripción."
+#: ../../addon/redfiles/redfiles.php:119
+msgid "Redmatrix File Storage Import"
+msgstr "Importar repositorio de ficheros de Redmatrix"
-#: ../../include/widgets.php:46 ../../include/widgets.php:455
-#: ../../include/taxonomy.php:188 ../../include/taxonomy.php:270
-#: ../../include/contact_widgets.php:91
-msgid "Categories"
-msgstr "Temas"
+#: ../../addon/redfiles/redfiles.php:120
+msgid "This will import all your Redmatrix cloud files to this channel."
+msgstr "Esto importará todos sus ficheros de la nube de Redmatrix a este canal."
-#: ../../include/widgets.php:141
-msgid "Suggestions"
-msgstr "Sugerencias"
+#: ../../addon/redfiles/redfilehelper.php:64
+msgid "file"
+msgstr "fichero"
-#: ../../include/widgets.php:142
-msgid "See more..."
-msgstr "Ver más..."
+#: ../../addon/hubwall/hubwall.php:19
+msgid "Send email to all members"
+msgstr "Enviar un correo electrónico a todos los miembros"
-#: ../../include/widgets.php:162
+#: ../../addon/hubwall/hubwall.php:33
#, php-format
-msgid "You have %1$.0f of %2$.0f allowed connections."
-msgstr "Tiene %1$.0f de %2$.0f conexiones permitidas."
-
-#: ../../include/widgets.php:168
-msgid "Add New Connection"
-msgstr "Añadir nueva conexión"
-
-#: ../../include/widgets.php:169
-msgid "Enter channel address"
-msgstr "Dirección del canal"
-
-#: ../../include/widgets.php:170
-msgid "Examples: bob@example.com, https://example.com/barbara"
-msgstr "Ejemplos: manuel@ejemplo.com, https://ejemplo.com/carmen"
-
-#: ../../include/widgets.php:186
-msgid "Notes"
-msgstr "Notas"
-
-#: ../../include/widgets.php:262
-msgid "Remove term"
-msgstr "Eliminar término"
-
-#: ../../include/widgets.php:270 ../../include/features.php:301
-msgid "Saved Searches"
-msgstr "Búsquedas guardadas"
-
-#: ../../include/widgets.php:271 ../../include/group.php:336
-msgid "add"
-msgstr "añadir"
-
-#: ../../include/widgets.php:333 ../../include/contact_widgets.php:53
-#: ../../include/features.php:390
-msgid "Saved Folders"
-msgstr "Carpetas guardadas"
-
-#: ../../include/widgets.php:336 ../../include/widgets.php:458
-#: ../../include/contact_widgets.php:56 ../../include/contact_widgets.php:94
-msgid "Everything"
-msgstr "Todo"
-
-#: ../../include/widgets.php:377
-msgid "Archives"
-msgstr "Hemeroteca"
-
-#: ../../include/widgets.php:549
-msgid "Refresh"
-msgstr "Recargar"
-
-#: ../../include/widgets.php:589
-msgid "Account settings"
-msgstr "Configuración de la cuenta"
-
-#: ../../include/widgets.php:595
-msgid "Channel settings"
-msgstr "Configuración del canal"
-
-#: ../../include/widgets.php:604
-msgid "Additional features"
-msgstr "Funcionalidades"
-
-#: ../../include/widgets.php:611
-msgid "Feature/Addon settings"
-msgstr "Complementos"
-
-#: ../../include/widgets.php:617
-msgid "Display settings"
-msgstr "Ajustes de visualización"
-
-#: ../../include/widgets.php:624
-msgid "Manage locations"
-msgstr "Gestión de ubicaciones (clones) del canal"
-
-#: ../../include/widgets.php:631
-msgid "Export channel"
-msgstr "Exportar canal"
-
-#: ../../include/widgets.php:637
-msgid "Connected apps"
-msgstr "Aplicaciones (apps) conectadas"
-
-#: ../../include/widgets.php:652 ../../include/features.php:153
-msgid "Permission Groups"
-msgstr "Grupos de permisos"
-
-#: ../../include/widgets.php:669
-msgid "Premium Channel Settings"
-msgstr "Configuración del canal premium"
-
-#: ../../include/widgets.php:698
-msgid "Private Mail Menu"
-msgstr "Menú de correo privado"
-
-#: ../../include/widgets.php:700
-msgid "Combined View"
-msgstr "Vista combinada"
-
-#: ../../include/widgets.php:705 ../../include/nav.php:213
-msgid "Inbox"
-msgstr "Bandeja de entrada"
-
-#: ../../include/widgets.php:710 ../../include/nav.php:214
-msgid "Outbox"
-msgstr "Bandeja de salida"
-
-#: ../../include/widgets.php:715 ../../include/nav.php:215
-msgid "New Message"
-msgstr "Nuevo mensaje"
-
-#: ../../include/widgets.php:732 ../../include/widgets.php:744
-msgid "Conversations"
-msgstr "Conversaciones"
-
-#: ../../include/widgets.php:736
-msgid "Received Messages"
-msgstr "Mensajes recibidos"
-
-#: ../../include/widgets.php:740
-msgid "Sent Messages"
-msgstr "Enviar mensajes"
-
-#: ../../include/widgets.php:754
-msgid "No messages."
-msgstr "Sin mensajes."
-
-#: ../../include/widgets.php:772
-msgid "Delete conversation"
-msgstr "Eliminar conversación"
-
-#: ../../include/widgets.php:798
-msgid "Events Tools"
-msgstr "Gestión de eventos"
-
-#: ../../include/widgets.php:799
-msgid "Export Calendar"
-msgstr "Exportar el calendario"
-
-#: ../../include/widgets.php:800
-msgid "Import Calendar"
-msgstr "Importar un calendario"
-
-#: ../../include/widgets.php:888 ../../include/conversation.php:1866
-#: ../../include/conversation.php:1869
-msgid "Chatrooms"
-msgstr "Salas de chat"
-
-#: ../../include/widgets.php:892
-msgid "Overview"
-msgstr "Resumen"
-
-#: ../../include/widgets.php:899
-msgid "Chat Members"
-msgstr "Miembros del chat"
-
-#: ../../include/widgets.php:977
-msgctxt "wiki_history"
-msgid "Message"
-msgstr "Mensaje"
-
-#: ../../include/widgets.php:999
-msgid "Bookmarked Chatrooms"
-msgstr "Salas de chat preferidas"
-
-#: ../../include/widgets.php:1030
-msgid "Suggested Chatrooms"
-msgstr "Salas de chat sugeridas"
-
-#: ../../include/widgets.php:1175 ../../include/widgets.php:1287
-msgid "photo/image"
-msgstr "foto/imagen"
-
-#: ../../include/widgets.php:1230
-msgid "Click to show more"
-msgstr "Hacer clic para ver más"
-
-#: ../../include/widgets.php:1381
-msgid "Rating Tools"
-msgstr "Valoraciones"
-
-#: ../../include/widgets.php:1385 ../../include/widgets.php:1387
-msgid "Rate Me"
-msgstr "Valorar este canal"
-
-#: ../../include/widgets.php:1390
-msgid "View Ratings"
-msgstr "Mostrar las valoraciones"
-
-#: ../../include/widgets.php:1483
-msgid "Forums"
-msgstr "Foros"
-
-#: ../../include/widgets.php:1540
-msgctxt "widget"
-msgid "Activity"
-msgstr "Actividad"
-
-#: ../../include/widgets.php:1569
-msgid "Tasks"
-msgstr "Tareas"
-
-#: ../../include/widgets.php:1635 ../../include/widgets.php:1673
-msgid "Member registrations waiting for confirmation"
-msgstr "Inscripciones de nuevos miembros pendientes de aprobación"
-
-#: ../../include/widgets.php:1641
-msgid "Inspect queue"
-msgstr "Examinar la cola"
-
-#: ../../include/widgets.php:1643
-msgid "DB updates"
-msgstr "Actualizaciones de la base de datos"
-
-#: ../../include/widgets.php:1668 ../../include/nav.php:233
-msgid "Admin"
-msgstr "Administrador"
-
-#: ../../include/widgets.php:1669
-msgid "Plugin Features"
-msgstr "Extensiones"
-
-#: ../../include/taxonomy.php:228 ../../include/taxonomy.php:249
-msgid "Tags"
-msgstr "Etiquetas"
-
-#: ../../include/taxonomy.php:293
-msgid "Keywords"
-msgstr "Palabras clave"
-
-#: ../../include/taxonomy.php:314
-msgid "have"
-msgstr "tener"
-
-#: ../../include/taxonomy.php:314
-msgid "has"
-msgstr "tiene"
-
-#: ../../include/taxonomy.php:315
-msgid "want"
-msgstr "quiero"
-
-#: ../../include/taxonomy.php:315
-msgid "wants"
-msgstr "quiere"
-
-#: ../../include/taxonomy.php:316
-msgid "likes"
-msgstr "gusta de"
-
-#: ../../include/taxonomy.php:317
-msgid "dislikes"
-msgstr "no gusta de"
-
-#: ../../include/event.php:22 ../../include/event.php:69
-#: ../../include/markdown.php:540
-msgid "l F d, Y \\@ g:i A"
-msgstr "l d de F, Y \\@ G:i"
-
-#: ../../include/event.php:30 ../../include/event.php:73
-#: ../../include/markdown.php:546
-msgid "Starts:"
-msgstr "Comienza:"
-
-#: ../../include/event.php:40 ../../include/event.php:77
-#: ../../include/markdown.php:554
-msgid "Finishes:"
-msgstr "Finaliza:"
-
-#: ../../include/event.php:1004
-msgid "This event has been added to your calendar."
-msgstr "Este evento ha sido añadido a su calendario."
-
-#: ../../include/event.php:1204
-msgid "Not specified"
-msgstr "Sin especificar"
-
-#: ../../include/event.php:1205
-msgid "Needs Action"
-msgstr "Necesita de una intervención"
-
-#: ../../include/event.php:1206
-msgid "Completed"
-msgstr "Completado/a"
-
-#: ../../include/event.php:1207
-msgid "In Process"
-msgstr "En proceso"
-
-#: ../../include/event.php:1208
-msgid "Cancelled"
-msgstr "Cancelado/a"
-
-#: ../../include/datetime.php:147
-msgid "Birthday"
-msgstr "Cumpleaños"
-
-#: ../../include/datetime.php:149
-msgid "Age: "
-msgstr "Edad:"
-
-#: ../../include/datetime.php:151
-msgid "YYYY-MM-DD or MM-DD"
-msgstr "AAAA-MM-DD o MM-DD"
-
-#: ../../include/datetime.php:286 ../../boot.php:2598
-msgid "never"
-msgstr "nunca"
-
-#: ../../include/datetime.php:292
-msgid "less than a second ago"
-msgstr "hace un instante"
+msgid "$1%s Administrator"
+msgstr "Administrador de $1%s "
-#: ../../include/datetime.php:310
+#: ../../addon/hubwall/hubwall.php:73
#, php-format
-msgctxt "e.g. 22 hours ago, 1 minute ago"
-msgid "%1$d %2$s ago"
-msgstr "hace %1$d %2$s"
-
-#: ../../include/datetime.php:321
-msgctxt "relative_date"
-msgid "year"
-msgid_plural "years"
-msgstr[0] "año"
-msgstr[1] "años"
-
-#: ../../include/datetime.php:324
-msgctxt "relative_date"
-msgid "month"
-msgid_plural "months"
-msgstr[0] "mes"
-msgstr[1] "meses"
-
-#: ../../include/datetime.php:327
-msgctxt "relative_date"
-msgid "week"
-msgid_plural "weeks"
-msgstr[0] "semana"
-msgstr[1] "semanas"
-
-#: ../../include/datetime.php:330
-msgctxt "relative_date"
-msgid "day"
-msgid_plural "days"
-msgstr[0] "día"
-msgstr[1] "días"
-
-#: ../../include/datetime.php:333
-msgctxt "relative_date"
-msgid "hour"
-msgid_plural "hours"
-msgstr[0] "hora"
-msgstr[1] "horas"
-
-#: ../../include/datetime.php:336
-msgctxt "relative_date"
-msgid "minute"
-msgid_plural "minutes"
-msgstr[0] "minuto"
-msgstr[1] "minutos"
+msgid "%1$d of %2$d messages sent."
+msgstr "%1$d de %2$d mensajes enviados."
-#: ../../include/datetime.php:339
-msgctxt "relative_date"
-msgid "second"
-msgid_plural "seconds"
-msgstr[0] "segundo"
-msgstr[1] "segundos"
+#: ../../addon/hubwall/hubwall.php:81
+msgid "Send email to all hub members."
+msgstr "Enviar un correo electrónico a todos los miembros del hub."
-#: ../../include/datetime.php:576
-#, php-format
-msgid "%1$s's birthday"
-msgstr "Cumpleaños de %1$s"
+#: ../../addon/hubwall/hubwall.php:93
+msgid "Sender Email address"
+msgstr "Dirección de correo electrónico del remitente"
-#: ../../include/datetime.php:577
-#, php-format
-msgid "Happy Birthday %1$s"
-msgstr "Feliz cumpleaños %1$s"
+#: ../../addon/hubwall/hubwall.php:94
+msgid "Test mode (only send to hub administrator)"
+msgstr "Modo de prueba (enviar sólo al administrador del hub)"
#: ../../include/selectors.php:30
msgid "Frequently"
@@ -11543,102 +11033,721 @@ msgstr "No me importa"
msgid "Ask me"
msgstr "Pregúnteme"
-#: ../../include/acl_selectors.php:208
-msgid "Who can see this?"
-msgstr "¿Quién puede ver esto?"
+#: ../../include/conversation.php:200
+#, php-format
+msgid "%1$s is now connected with %2$s"
+msgstr "%1$s ahora está conectado/a con %2$s"
-#: ../../include/acl_selectors.php:209
-msgid "Custom selection"
-msgstr "Selección personalizada"
+#: ../../include/conversation.php:235
+#, php-format
+msgid "%1$s poked %2$s"
+msgstr "%1$s ha dado un toque a %2$s"
-#: ../../include/acl_selectors.php:210
-msgid ""
-"Select \"Show\" to allow viewing. \"Don't show\" lets you override and limit"
-" the scope of \"Show\"."
-msgstr "Seleccione \"Mostrar\" para permitir la visualización. La opción \"No mostrar\" le permite anular y limitar el alcance de \"Mostrar\"."
+#: ../../include/conversation.php:239 ../../include/text.php:1115
+#: ../../include/text.php:1120
+msgid "poked"
+msgstr "ha dado un toque a"
-#: ../../include/acl_selectors.php:211
-msgid "Show"
-msgstr "Mostrar"
+#: ../../include/conversation.php:691
+#, php-format
+msgid "View %s's profile @ %s"
+msgstr "Ver el perfil @ %s de %s"
-#: ../../include/acl_selectors.php:212
-msgid "Don't show"
-msgstr "No mostrar"
+#: ../../include/conversation.php:711
+msgid "Categories:"
+msgstr "Temas:"
-#: ../../include/acl_selectors.php:245
+#: ../../include/conversation.php:712
+msgid "Filed under:"
+msgstr "Archivado bajo:"
+
+#: ../../include/conversation.php:737
+msgid "View in context"
+msgstr "Mostrar en su contexto"
+
+#: ../../include/conversation.php:834
+msgid "remove"
+msgstr "eliminar"
+
+#: ../../include/conversation.php:838 ../../include/nav.php:272
+msgid "Loading..."
+msgstr "Cargando..."
+
+#: ../../include/conversation.php:839
+msgid "Delete Selected Items"
+msgstr "Eliminar elementos seleccionados"
+
+#: ../../include/conversation.php:882
+msgid "View Source"
+msgstr "Ver el código fuente de la entrada"
+
+#: ../../include/conversation.php:892
+msgid "Follow Thread"
+msgstr "Seguir este hilo"
+
+#: ../../include/conversation.php:901
+msgid "Unfollow Thread"
+msgstr "Dejar de seguir este hilo"
+
+#: ../../include/conversation.php:992
+msgid "Activity/Posts"
+msgstr "Actividad y publicaciones"
+
+#: ../../include/conversation.php:1012
+msgid "Edit Connection"
+msgstr "Editar conexión"
+
+#: ../../include/conversation.php:1022
+msgid "Message"
+msgstr "Mensaje"
+
+#: ../../include/conversation.php:1156
#, php-format
-msgid ""
-"Post permissions %s cannot be changed %s after a post is shared.</br />These"
-" permissions set who is allowed to view the post."
-msgstr "Los permisos de la entrada %s no se pueden cambiar %s una vez que se ha compartido.</br /> Estos permisos establecen quién está autorizado para ver el mensaje."
+msgid "%s likes this."
+msgstr "A %s le gusta esto."
-#: ../../include/bbcode.php:134 ../../include/bbcode.php:1040
-#: ../../include/bbcode.php:1043 ../../include/bbcode.php:1048
-#: ../../include/bbcode.php:1051 ../../include/bbcode.php:1054
-#: ../../include/bbcode.php:1057 ../../include/bbcode.php:1062
-#: ../../include/bbcode.php:1065 ../../include/bbcode.php:1070
-#: ../../include/bbcode.php:1073 ../../include/bbcode.php:1076
-#: ../../include/bbcode.php:1079
-msgid "Image/photo"
-msgstr "Imagen/foto"
+#: ../../include/conversation.php:1156
+#, php-format
+msgid "%s doesn't like this."
+msgstr "A %s no le gusta esto."
-#: ../../include/bbcode.php:173 ../../include/bbcode.php:1090
-msgid "Encrypted content"
-msgstr "Contenido cifrado"
+#: ../../include/conversation.php:1160
+#, php-format
+msgid "<span %1$s>%2$d people</span> like this."
+msgid_plural "<span %1$s>%2$d people</span> like this."
+msgstr[0] "a <span %1$s>%2$d personas</span> le gusta esto."
+msgstr[1] "A <span %1$s>%2$d personas</span> les gusta esto."
-#: ../../include/bbcode.php:189
+#: ../../include/conversation.php:1162
#, php-format
-msgid "Install %s element: "
-msgstr "Instalar el elemento %s:"
+msgid "<span %1$s>%2$d people</span> don't like this."
+msgid_plural "<span %1$s>%2$d people</span> don't like this."
+msgstr[0] "a <span %1$s>%2$d personas</span> no les gusta esto."
+msgstr[1] "A <span %1$s>%2$d personas</span> no les gusta esto."
-#: ../../include/bbcode.php:193
+#: ../../include/conversation.php:1168
+msgid "and"
+msgstr "y"
+
+#: ../../include/conversation.php:1171
#, php-format
-msgid ""
-"This post contains an installable %s element, however you lack permissions "
-"to install it on this site."
-msgstr "Esta entrada contiene el elemento instalable %s, sin embargo le faltan permisos para instalarlo en este sitio."
+msgid ", and %d other people"
+msgid_plural ", and %d other people"
+msgstr[0] ", y %d persona más"
+msgstr[1] ", y %d personas más"
-#: ../../include/bbcode.php:272
+#: ../../include/conversation.php:1172
#, php-format
-msgid "%1$s wrote the following %2$s %3$s"
-msgstr "%1$s escribió %2$s siguiente %3$s"
+msgid "%s like this."
+msgstr "A %s le gusta esto."
-#: ../../include/bbcode.php:349 ../../include/bbcode.php:357
-msgid "Click to open/close"
-msgstr "Pulsar para abrir/cerrar"
+#: ../../include/conversation.php:1172
+#, php-format
+msgid "%s don't like this."
+msgstr "A %s no le gusta esto."
-#: ../../include/bbcode.php:357
-msgid "spoiler"
-msgstr "spoiler"
+#: ../../include/conversation.php:1215
+msgid "Set your location"
+msgstr "Establecer su ubicación"
-#: ../../include/bbcode.php:1028
-msgid "$1 wrote:"
-msgstr "$1 escribió:"
+#: ../../include/conversation.php:1216
+msgid "Clear browser location"
+msgstr "Eliminar los datos de localización geográfica del navegador"
+
+#: ../../include/conversation.php:1264
+msgid "Tag term:"
+msgstr "Término de la etiqueta:"
+
+#: ../../include/conversation.php:1265
+msgid "Where are you right now?"
+msgstr "¿Donde está ahora?"
+
+#: ../../include/conversation.php:1270
+msgid "Choose a different album..."
+msgstr "Elegir un álbum diferente..."
+
+#: ../../include/conversation.php:1274
+msgid "Comments enabled"
+msgstr "Comentarios habilitados"
+
+#: ../../include/conversation.php:1275
+msgid "Comments disabled"
+msgstr "Comentarios deshabilitados"
+
+#: ../../include/conversation.php:1313
+msgid "Page link name"
+msgstr "Nombre del enlace de la página"
+
+#: ../../include/conversation.php:1316
+msgid "Post as"
+msgstr "Publicar como"
+
+#: ../../include/conversation.php:1330
+msgid "Toggle voting"
+msgstr "Cambiar votación"
+
+#: ../../include/conversation.php:1333
+msgid "Disable comments"
+msgstr "Dehabilitar los comentarios"
+
+#: ../../include/conversation.php:1334
+msgid "Toggle comments"
+msgstr "Activar o desactivar los comentarios"
+
+#: ../../include/conversation.php:1342
+msgid "Categories (optional, comma-separated list)"
+msgstr "Temas (opcional, lista separada por comas)"
+
+#: ../../include/conversation.php:1365
+msgid "Other networks and post services"
+msgstr "Otras redes y servicios de publicación"
+
+#: ../../include/conversation.php:1371
+msgid "Set publish date"
+msgstr "Establecer la fecha de publicación"
+
+#: ../../include/conversation.php:1634
+msgid "Discover"
+msgstr "Descubrir"
+
+#: ../../include/conversation.php:1637
+msgid "Imported public streams"
+msgstr "Contenidos públicos importados"
+
+#: ../../include/conversation.php:1642
+msgid "Commented Order"
+msgstr "Comentarios recientes"
+
+#: ../../include/conversation.php:1645
+msgid "Sort by Comment Date"
+msgstr "Ordenar por fecha de comentario"
+
+#: ../../include/conversation.php:1649
+msgid "Posted Order"
+msgstr "Publicaciones recientes"
+
+#: ../../include/conversation.php:1652
+msgid "Sort by Post Date"
+msgstr "Ordenar por fecha de publicación"
+
+#: ../../include/conversation.php:1660
+msgid "Posts that mention or involve you"
+msgstr "Publicaciones que le mencionan o involucran"
+
+#: ../../include/conversation.php:1669
+msgid "Activity Stream - by date"
+msgstr "Contenido - por fecha"
+
+#: ../../include/conversation.php:1675
+msgid "Starred"
+msgstr "Preferidas"
+
+#: ../../include/conversation.php:1678
+msgid "Favourite Posts"
+msgstr "Publicaciones favoritas"
+
+#: ../../include/conversation.php:1685
+msgid "Spam"
+msgstr "Correo basura"
+
+#: ../../include/conversation.php:1688
+msgid "Posts flagged as SPAM"
+msgstr "Publicaciones marcadas como basura"
+
+#: ../../include/conversation.php:1763 ../../include/nav.php:372
+msgid "Status Messages and Posts"
+msgstr "Mensajes de estado y publicaciones"
+
+#: ../../include/conversation.php:1776 ../../include/nav.php:385
+msgid "Profile Details"
+msgstr "Detalles del perfil"
+
+#: ../../include/conversation.php:1786 ../../include/nav.php:395
+#: ../../include/photos.php:528
+msgid "Photo Albums"
+msgstr "Ãlbumes de fotos"
+
+#: ../../include/conversation.php:1794 ../../include/nav.php:403
+msgid "Files and Storage"
+msgstr "Ficheros y repositorio"
+
+#: ../../include/conversation.php:1830 ../../include/nav.php:438
+msgid "Bookmarks"
+msgstr "Marcadores"
+
+#: ../../include/conversation.php:1833 ../../include/nav.php:441
+msgid "Saved Bookmarks"
+msgstr "Marcadores guardados"
+
+#: ../../include/conversation.php:1844 ../../include/nav.php:452
+msgid "View Webpages"
+msgstr "Ver páginas web"
+
+#: ../../include/conversation.php:1913
+msgctxt "noun"
+msgid "Attending"
+msgid_plural "Attending"
+msgstr[0] "Participaré"
+msgstr[1] "Participaré"
+
+#: ../../include/conversation.php:1916
+msgctxt "noun"
+msgid "Not Attending"
+msgid_plural "Not Attending"
+msgstr[0] "No participaré"
+msgstr[1] "No participaré"
+
+#: ../../include/conversation.php:1919
+msgctxt "noun"
+msgid "Undecided"
+msgid_plural "Undecided"
+msgstr[0] "Indeciso/a"
+msgstr[1] "Indecisos/as"
+
+#: ../../include/conversation.php:1922
+msgctxt "noun"
+msgid "Agree"
+msgid_plural "Agrees"
+msgstr[0] "De acuerdo"
+msgstr[1] "De acuerdo"
+
+#: ../../include/conversation.php:1925
+msgctxt "noun"
+msgid "Disagree"
+msgid_plural "Disagrees"
+msgstr[0] "En desacuerdo"
+msgstr[1] "En desacuerdo"
+
+#: ../../include/conversation.php:1928
+msgctxt "noun"
+msgid "Abstain"
+msgid_plural "Abstains"
+msgstr[0] "se abstiene"
+msgstr[1] "Se abstienen"
+
+#: ../../include/permissions.php:35
+msgid "Can view my normal stream and posts"
+msgstr "Pueden verse mi actividad y publicaciones normales"
+
+#: ../../include/permissions.php:39
+msgid "Can view my webpages"
+msgstr "Pueden verse mis páginas web"
+
+#: ../../include/permissions.php:43
+msgid "Can post on my channel page (\"wall\")"
+msgstr "Pueden crearse entradas en mi página de inicio del canal (“muroâ€)"
+
+#: ../../include/permissions.php:46
+msgid "Can like/dislike stuff"
+msgstr "Puede marcarse contenido como me gusta/no me gusta"
+
+#: ../../include/permissions.php:46
+msgid "Profiles and things other than posts/comments"
+msgstr "Perfiles y otras cosas aparte de publicaciones/comentarios"
+
+#: ../../include/permissions.php:48
+msgid "Can forward to all my channel contacts via post @mentions"
+msgstr "Puede enviarse una entrada a todos mis contactos del canal mediante una @mención"
+
+#: ../../include/permissions.php:48
+msgid "Advanced - useful for creating group forum channels"
+msgstr "Avanzado - útil para crear canales de foros de discusión o grupos"
+
+#: ../../include/permissions.php:49
+msgid "Can chat with me (when available)"
+msgstr "Se puede charlar conmigo (cuando esté disponible)"
+
+#: ../../include/permissions.php:50
+msgid "Can write to my file storage and photos"
+msgstr "Puede escribirse en mi repositorio de ficheros y fotos"
+
+#: ../../include/permissions.php:51
+msgid "Can edit my webpages"
+msgstr "Pueden editarse mis páginas web"
+
+#: ../../include/permissions.php:53
+msgid "Somewhat advanced - very useful in open communities"
+msgstr "Algo avanzado - muy útil en comunidades abiertas"
+
+#: ../../include/permissions.php:55
+msgid "Can administer my channel resources"
+msgstr "Pueden administrarse mis recursos del canal"
+
+#: ../../include/permissions.php:55
+msgid ""
+"Extremely advanced. Leave this alone unless you know what you are doing"
+msgstr "Muy avanzado. Déjelo a no ser que sepa bien lo que está haciendo."
+
+#: ../../include/dir_fns.php:141
+msgid "Directory Options"
+msgstr "Opciones del directorio"
+
+#: ../../include/dir_fns.php:143
+msgid "Safe Mode"
+msgstr "Modo seguro"
+
+#: ../../include/dir_fns.php:144
+msgid "Public Forums Only"
+msgstr "Solo foros públicos"
+
+#: ../../include/dir_fns.php:145
+msgid "This Website Only"
+msgstr "Solo este sitio web"
#: ../../include/bookmarks.php:34
#, php-format
msgid "%1$s's bookmarks"
msgstr "Marcadores de %1$s"
-#: ../../include/connections.php:127
-msgid "New window"
-msgstr "Nueva ventana"
+#: ../../include/import.php:41
+msgid ""
+"Cannot create a duplicate channel identifier on this system. Import failed."
+msgstr "No se ha podido crear un canal con un identificador que ya existe en este sistema. La importación ha fallado."
-#: ../../include/connections.php:128
-msgid "Open the selected location in a different window or browser tab"
-msgstr "Abrir la dirección seleccionada en una ventana o pestaña aparte"
+#: ../../include/import.php:105
+msgid "Cloned channel not found. Import failed."
+msgstr "No se ha podido importar el canal porque el canal clonado no se ha encontrado."
-#: ../../include/help.php:33
-msgid "Help:"
-msgstr "Ayuda:"
+#: ../../include/text.php:478
+msgid "prev"
+msgstr "anterior"
-#: ../../include/help.php:65
-msgid "Not Found"
-msgstr "No encontrado"
+#: ../../include/text.php:480
+msgid "first"
+msgstr "primera"
-#: ../../include/page_widgets.php:7
-msgid "New Page"
-msgstr "Nueva página"
+#: ../../include/text.php:509
+msgid "last"
+msgstr "última"
+
+#: ../../include/text.php:512
+msgid "next"
+msgstr "próxima"
+
+#: ../../include/text.php:523
+msgid "older"
+msgstr "más antiguas"
+
+#: ../../include/text.php:525
+msgid "newer"
+msgstr "más recientes"
+
+#: ../../include/text.php:945
+msgid "No connections"
+msgstr "Sin conexiones"
+
+#: ../../include/text.php:970
+#, php-format
+msgid "View all %s connections"
+msgstr "Ver todas las %s conexiones"
+
+#: ../../include/text.php:1115 ../../include/text.php:1120
+msgid "poke"
+msgstr "un toque"
+
+#: ../../include/text.php:1121
+msgid "ping"
+msgstr "un \"ping\""
+
+#: ../../include/text.php:1121
+msgid "pinged"
+msgstr "ha enviado un \"ping\" a"
+
+#: ../../include/text.php:1122
+msgid "prod"
+msgstr "una incitación "
+
+#: ../../include/text.php:1122
+msgid "prodded"
+msgstr "ha incitado a "
+
+#: ../../include/text.php:1123
+msgid "slap"
+msgstr "una bofetada "
+
+#: ../../include/text.php:1123
+msgid "slapped"
+msgstr "ha abofeteado a "
+
+#: ../../include/text.php:1124
+msgid "finger"
+msgstr "un \"finger\" "
+
+#: ../../include/text.php:1124
+msgid "fingered"
+msgstr "envió un \"finger\" a"
+
+#: ../../include/text.php:1125
+msgid "rebuff"
+msgstr "un reproche"
+
+#: ../../include/text.php:1125
+msgid "rebuffed"
+msgstr "ha hecho un reproche a "
+
+#: ../../include/text.php:1137
+msgid "happy"
+msgstr "feliz "
+
+#: ../../include/text.php:1138
+msgid "sad"
+msgstr "triste "
+
+#: ../../include/text.php:1139
+msgid "mellow"
+msgstr "tranquilo/a"
+
+#: ../../include/text.php:1140
+msgid "tired"
+msgstr "cansado/a "
+
+#: ../../include/text.php:1141
+msgid "perky"
+msgstr "vivaz"
+
+#: ../../include/text.php:1142
+msgid "angry"
+msgstr "enfadado/a"
+
+#: ../../include/text.php:1143
+msgid "stupefied"
+msgstr "asombrado/a"
+
+#: ../../include/text.php:1144
+msgid "puzzled"
+msgstr "perplejo/a"
+
+#: ../../include/text.php:1145
+msgid "interested"
+msgstr "interesado/a"
+
+#: ../../include/text.php:1146
+msgid "bitter"
+msgstr "amargado/a"
+
+#: ../../include/text.php:1147
+msgid "cheerful"
+msgstr "alegre"
+
+#: ../../include/text.php:1148
+msgid "alive"
+msgstr "animado/a"
+
+#: ../../include/text.php:1149
+msgid "annoyed"
+msgstr "molesto/a"
+
+#: ../../include/text.php:1150
+msgid "anxious"
+msgstr "ansioso/a"
+
+#: ../../include/text.php:1151
+msgid "cranky"
+msgstr "de mal humor"
+
+#: ../../include/text.php:1152
+msgid "disturbed"
+msgstr "perturbado/a"
+
+#: ../../include/text.php:1153
+msgid "frustrated"
+msgstr "frustrado/a"
+
+#: ../../include/text.php:1154
+msgid "depressed"
+msgstr "deprimido/a"
+
+#: ../../include/text.php:1155
+msgid "motivated"
+msgstr "motivado/a"
+
+#: ../../include/text.php:1156
+msgid "relaxed"
+msgstr "relajado/a"
+
+#: ../../include/text.php:1157
+msgid "surprised"
+msgstr "sorprendido/a"
+
+#: ../../include/text.php:1335 ../../include/js_strings.php:70
+msgid "Monday"
+msgstr "lunes"
+
+#: ../../include/text.php:1335 ../../include/js_strings.php:71
+msgid "Tuesday"
+msgstr "martes"
+
+#: ../../include/text.php:1335 ../../include/js_strings.php:72
+msgid "Wednesday"
+msgstr "miércoles"
+
+#: ../../include/text.php:1335 ../../include/js_strings.php:73
+msgid "Thursday"
+msgstr "jueves"
+
+#: ../../include/text.php:1335 ../../include/js_strings.php:74
+msgid "Friday"
+msgstr "viernes"
+
+#: ../../include/text.php:1335 ../../include/js_strings.php:75
+msgid "Saturday"
+msgstr "sábado"
+
+#: ../../include/text.php:1335 ../../include/js_strings.php:69
+msgid "Sunday"
+msgstr "domingo"
+
+#: ../../include/text.php:1339 ../../include/js_strings.php:45
+msgid "January"
+msgstr "enero"
+
+#: ../../include/text.php:1339 ../../include/js_strings.php:46
+msgid "February"
+msgstr "febrero"
+
+#: ../../include/text.php:1339 ../../include/js_strings.php:47
+msgid "March"
+msgstr "marzo"
+
+#: ../../include/text.php:1339 ../../include/js_strings.php:48
+msgid "April"
+msgstr "abril"
+
+#: ../../include/text.php:1339
+msgid "May"
+msgstr "mayo"
+
+#: ../../include/text.php:1339 ../../include/js_strings.php:50
+msgid "June"
+msgstr "junio"
+
+#: ../../include/text.php:1339 ../../include/js_strings.php:51
+msgid "July"
+msgstr "julio"
+
+#: ../../include/text.php:1339 ../../include/js_strings.php:52
+msgid "August"
+msgstr "agosto"
+
+#: ../../include/text.php:1339 ../../include/js_strings.php:53
+msgid "September"
+msgstr "septiembre"
+
+#: ../../include/text.php:1339 ../../include/js_strings.php:54
+msgid "October"
+msgstr "octubre"
+
+#: ../../include/text.php:1339 ../../include/js_strings.php:55
+msgid "November"
+msgstr "noviembre"
+
+#: ../../include/text.php:1339 ../../include/js_strings.php:56
+msgid "December"
+msgstr "diciembre"
+
+#: ../../include/text.php:1403 ../../include/text.php:1407
+msgid "Unknown Attachment"
+msgstr "Adjunto no reconocido"
+
+#: ../../include/text.php:1409
+msgid "unknown"
+msgstr "desconocido"
+
+#: ../../include/text.php:1445
+msgid "remove category"
+msgstr "eliminar el tema"
+
+#: ../../include/group.php:334
+msgid "Channels not in any privacy group"
+msgstr "Sin canales en ningún grupo"
+
+#: ../../include/text.php:1781 ../../include/language.php:367
+msgid "default"
+msgstr "por defecto"
+
+#: ../../include/text.php:1789
+msgid "Page layout"
+msgstr "Plantilla de la página"
+
+#: ../../include/text.php:1789
+msgid "You can create your own with the layouts tool"
+msgstr "Puede crear su propia disposición gráfica con la herramienta de plantillas"
+
+#: ../../include/text.php:1817
+msgid "Page content type"
+msgstr "Tipo de contenido de la página"
+
+#: ../../include/text.php:1950
+msgid "activity"
+msgstr "la actividad"
+
+#: ../../include/text.php:2264
+msgid "Design Tools"
+msgstr "Herramientas de diseño web"
+
+#: ../../include/text.php:2270
+msgid "Pages"
+msgstr "Páginas"
+
+#: ../../include/text.php:2292
+msgid "Import website..."
+msgstr "Importar un sitio web..."
+
+#: ../../include/text.php:2293
+msgid "Select folder to import"
+msgstr "Seleccionar la carpeta que se va a importar"
+
+#: ../../include/text.php:2294
+msgid "Import from a zipped folder:"
+msgstr "Importar desde una carpeta comprimida: "
+
+#: ../../include/text.php:2295
+msgid "Import from cloud files:"
+msgstr "Importar desde los ficheros en la nube: "
+
+#: ../../include/text.php:2296
+msgid "/cloud/channel/path/to/folder"
+msgstr "/cloud/canal/ruta/a la/carpeta"
+
+#: ../../include/text.php:2297
+msgid "Enter path to website files"
+msgstr "Ruta a los ficheros del sitio web"
+
+#: ../../include/text.php:2298
+msgid "Select folder"
+msgstr "Seleccionar la carpeta"
+
+#: ../../include/text.php:2299
+msgid "Export website..."
+msgstr "Exportar un sitio web..."
+
+#: ../../include/text.php:2300
+msgid "Export to a zip file"
+msgstr "Exportar a un fichero comprimido .zip"
+
+#: ../../include/text.php:2301
+msgid "website.zip"
+msgstr "sitio_web.zip"
+
+#: ../../include/text.php:2302
+msgid "Enter a name for the zip file."
+msgstr "Escriba un nombre para el fichero zip."
+
+#: ../../include/text.php:2303
+msgid "Export to cloud files"
+msgstr "Exportar a la nube de ficheros"
+
+#: ../../include/text.php:2304
+msgid "/path/to/export/folder"
+msgstr "/ruta/para/exportar/carpeta"
+
+#: ../../include/text.php:2305
+msgid "Enter a path to a cloud files destination."
+msgstr "Escriba una ruta de destino a la nube de ficheros."
+
+#: ../../include/text.php:2306
+msgid "Specify folder"
+msgstr "Especificar una carpeta"
#: ../../include/contact_widgets.php:11
#, php-format
@@ -11686,6 +11795,57 @@ msgstr[1] "%d conexiones en común"
msgid "show more"
msgstr "mostrar más"
+#: ../../include/markdown.php:444
+msgid "Attachments:"
+msgstr "Ficheros adjuntos: "
+
+#: ../../include/markdown.php:538 ../../include/event.php:22
+#: ../../include/event.php:69
+msgid "l F d, Y \\@ g:i A"
+msgstr "l d de F, Y \\@ G:i"
+
+#: ../../include/markdown.php:540
+msgid "$Projectname event notification:"
+msgstr "Notificación de eventos de $Projectname: "
+
+#: ../../include/markdown.php:544 ../../include/event.php:30
+#: ../../include/event.php:73
+msgid "Starts:"
+msgstr "Comienza:"
+
+#: ../../include/markdown.php:552 ../../include/event.php:40
+#: ../../include/event.php:77
+msgid "Finishes:"
+msgstr "Finaliza:"
+
+#: ../../include/follow.php:26
+msgid "Channel is blocked on this site."
+msgstr "El canal está bloqueado en este sitio."
+
+#: ../../include/follow.php:31
+msgid "Channel location missing."
+msgstr "Falta la dirección del canal."
+
+#: ../../include/follow.php:73
+msgid "Response from remote channel was incomplete."
+msgstr "Respuesta incompleta del canal."
+
+#: ../../include/follow.php:90
+msgid "Channel was deleted and no longer exists."
+msgstr "El canal ha sido eliminado y ya no existe."
+
+#: ../../include/follow.php:140 ../../include/follow.php:175
+msgid "Protocol disabled."
+msgstr "Protocolo deshabilitado."
+
+#: ../../include/follow.php:163
+msgid "Channel discovery failed."
+msgstr "El intento de acceder al canal ha fallado."
+
+#: ../../include/follow.php:202
+msgid "Cannot connect to yourself."
+msgstr "No puede conectarse consigo mismo."
+
#: ../../include/js_strings.php:5
msgid "Delete this item?"
msgstr "¿Borrar este elemento?"
@@ -11826,55 +11986,11 @@ msgstr " "
msgid "timeago.numbers"
msgstr "timeago.numbers"
-#: ../../include/js_strings.php:45 ../../include/text.php:1331
-msgid "January"
-msgstr "enero"
-
-#: ../../include/js_strings.php:46 ../../include/text.php:1331
-msgid "February"
-msgstr "febrero"
-
-#: ../../include/js_strings.php:47 ../../include/text.php:1331
-msgid "March"
-msgstr "marzo"
-
-#: ../../include/js_strings.php:48 ../../include/text.php:1331
-msgid "April"
-msgstr "abril"
-
#: ../../include/js_strings.php:49
msgctxt "long"
msgid "May"
msgstr "mayo"
-#: ../../include/js_strings.php:50 ../../include/text.php:1331
-msgid "June"
-msgstr "junio"
-
-#: ../../include/js_strings.php:51 ../../include/text.php:1331
-msgid "July"
-msgstr "julio"
-
-#: ../../include/js_strings.php:52 ../../include/text.php:1331
-msgid "August"
-msgstr "agosto"
-
-#: ../../include/js_strings.php:53 ../../include/text.php:1331
-msgid "September"
-msgstr "septiembre"
-
-#: ../../include/js_strings.php:54 ../../include/text.php:1331
-msgid "October"
-msgstr "octubre"
-
-#: ../../include/js_strings.php:55 ../../include/text.php:1331
-msgid "November"
-msgstr "noviembre"
-
-#: ../../include/js_strings.php:56 ../../include/text.php:1331
-msgid "December"
-msgstr "diciembre"
-
#: ../../include/js_strings.php:57
msgid "Jan"
msgstr "ene"
@@ -11924,34 +12040,6 @@ msgstr "nov"
msgid "Dec"
msgstr "dic"
-#: ../../include/js_strings.php:69 ../../include/text.php:1327
-msgid "Sunday"
-msgstr "domingo"
-
-#: ../../include/js_strings.php:70 ../../include/text.php:1327
-msgid "Monday"
-msgstr "lunes"
-
-#: ../../include/js_strings.php:71 ../../include/text.php:1327
-msgid "Tuesday"
-msgstr "martes"
-
-#: ../../include/js_strings.php:72 ../../include/text.php:1327
-msgid "Wednesday"
-msgstr "miércoles"
-
-#: ../../include/js_strings.php:73 ../../include/text.php:1327
-msgid "Thursday"
-msgstr "jueves"
-
-#: ../../include/js_strings.php:74 ../../include/text.php:1327
-msgid "Friday"
-msgstr "viernes"
-
-#: ../../include/js_strings.php:75 ../../include/text.php:1327
-msgid "Saturday"
-msgstr "sábado"
-
#: ../../include/js_strings.php:76
msgid "Sun"
msgstr "dom"
@@ -12005,786 +12093,183 @@ msgctxt "calendar"
msgid "All day"
msgstr "Todos los días"
-#: ../../include/dir_fns.php:141
-msgid "Directory Options"
-msgstr "Opciones del directorio"
-
-#: ../../include/dir_fns.php:143
-msgid "Safe Mode"
-msgstr "Modo seguro"
-
-#: ../../include/dir_fns.php:144
-msgid "Public Forums Only"
-msgstr "Solo foros públicos"
-
-#: ../../include/dir_fns.php:145
-msgid "This Website Only"
-msgstr "Solo este sitio web"
-
-#: ../../include/network.php:756
-msgid "view full size"
-msgstr "Ver en el tamaño original"
-
-#: ../../include/network.php:2011
-msgid "No Subject"
-msgstr "Sin asunto"
-
-#: ../../include/network.php:2267
-msgid "OStatus"
-msgstr "OStatus"
-
-#: ../../include/network.php:2268
-msgid "GNU-Social"
-msgstr "GNU Social"
-
-#: ../../include/network.php:2269
-msgid "RSS/Atom"
-msgstr "RSS/Atom"
-
-#: ../../include/network.php:2272
-msgid "Facebook"
-msgstr "Facebook"
-
-#: ../../include/network.php:2273
-msgid "Zot"
-msgstr "Zot"
-
-#: ../../include/network.php:2274
-msgid "LinkedIn"
-msgstr "LinkedIn"
-
-#: ../../include/network.php:2275
-msgid "XMPP/IM"
-msgstr "XMPP/IM"
-
-#: ../../include/network.php:2276
-msgid "MySpace"
-msgstr "MySpace"
-
-#: ../../include/conversation.php:204
-#, php-format
-msgid "%1$s is now connected with %2$s"
-msgstr "%1$s ahora está conectado/a con %2$s"
-
-#: ../../include/conversation.php:239
-#, php-format
-msgid "%1$s poked %2$s"
-msgstr "%1$s ha dado un toque a %2$s"
-
-#: ../../include/conversation.php:243 ../../include/text.php:1098
-#: ../../include/text.php:1103
-msgid "poked"
-msgstr "ha dado un toque a"
-
-#: ../../include/conversation.php:690
-#, php-format
-msgid "View %s's profile @ %s"
-msgstr "Ver el perfil @ %s de %s"
-
-#: ../../include/conversation.php:710
-msgid "Categories:"
-msgstr "Temas:"
-
-#: ../../include/conversation.php:711
-msgid "Filed under:"
-msgstr "Archivado bajo:"
-
-#: ../../include/conversation.php:736
-msgid "View in context"
-msgstr "Mostrar en su contexto"
-
-#: ../../include/conversation.php:832
-msgid "remove"
-msgstr "eliminar"
-
-#: ../../include/conversation.php:836 ../../include/nav.php:292
-msgid "Loading..."
-msgstr "Cargando..."
-
-#: ../../include/conversation.php:837
-msgid "Delete Selected Items"
-msgstr "Eliminar elementos seleccionados"
+#: ../../include/message.php:30
+msgid "Unable to determine sender."
+msgstr "No ha sido posible determinar el remitente. "
-#: ../../include/conversation.php:930 ../../include/conversation.php:972
-msgid "View Source"
-msgstr "Ver el código fuente de la entrada"
+#: ../../include/message.php:69
+msgid "No recipient provided."
+msgstr "No se ha especificado ningún destinatario."
-#: ../../include/conversation.php:931 ../../include/conversation.php:982
-msgid "Follow Thread"
-msgstr "Seguir este hilo"
+#: ../../include/message.php:74
+msgid "[no subject]"
+msgstr "[sin asunto]"
-#: ../../include/conversation.php:932 ../../include/conversation.php:991
-msgid "Unfollow Thread"
-msgstr "Dejar de seguir este hilo"
+#: ../../include/message.php:227
+msgid "Stored post could not be verified."
+msgstr "No se han podido verificar las publicaciones guardadas."
-#: ../../include/conversation.php:937 ../../include/conversation.php:1059
-msgid "Activity/Posts"
-msgstr "Actividad y publicaciones"
+#: ../../include/text.php:1106
+msgid "slap"
+msgstr "una bofetada "
-#: ../../include/conversation.php:939 ../../include/conversation.php:1079
-msgid "Edit Connection"
-msgstr "Editar conexión"
+#: ../../include/text.php:1106
+msgid "slapped"
+msgstr "ha abofeteado a "
-#: ../../include/conversation.php:940 ../../include/conversation.php:1089
-msgid "Message"
-msgstr "Mensaje"
+#: ../../include/text.php:1107
+msgid "finger"
+msgstr "un \"finger\" "
-#: ../../include/conversation.php:1223
-#, php-format
-msgid "%s likes this."
-msgstr "A %s le gusta esto."
+#: ../../include/text.php:1107
+msgid "fingered"
+msgstr "envió un \"finger\" a"
-#: ../../include/conversation.php:1223
-#, php-format
-msgid "%s doesn't like this."
-msgstr "A %s no le gusta esto."
+#: ../../include/text.php:1108
+msgid "rebuff"
+msgstr "un reproche"
-#: ../../include/conversation.php:1227
-#, php-format
-msgid "<span %1$s>%2$d people</span> like this."
-msgid_plural "<span %1$s>%2$d people</span> like this."
-msgstr[0] "a <span %1$s>%2$d personas</span> le gusta esto."
-msgstr[1] "A <span %1$s>%2$d personas</span> les gusta esto."
+#: ../../include/attach.php:250 ../../include/attach.php:339
+msgid "Item was not found."
+msgstr "Elemento no encontrado."
-#: ../../include/conversation.php:1229
-#, php-format
-msgid "<span %1$s>%2$d people</span> don't like this."
-msgid_plural "<span %1$s>%2$d people</span> don't like this."
-msgstr[0] "a <span %1$s>%2$d personas</span> no les gusta esto."
-msgstr[1] "A <span %1$s>%2$d personas</span> no les gusta esto."
+#: ../../include/attach.php:500
+msgid "No source file."
+msgstr "Ningún fichero de origen"
-#: ../../include/conversation.php:1235
-msgid "and"
-msgstr "y"
+#: ../../include/attach.php:522
+msgid "Cannot locate file to replace"
+msgstr "No se puede localizar el fichero que va a ser sustituido."
-#: ../../include/conversation.php:1238
-#, php-format
-msgid ", and %d other people"
-msgid_plural ", and %d other people"
-msgstr[0] ", y %d persona más"
-msgstr[1] ", y %d personas más"
+#: ../../include/attach.php:540
+msgid "Cannot locate file to revise/update"
+msgstr "No se puede localizar el fichero para revisar/actualizar"
-#: ../../include/conversation.php:1239
+#: ../../include/attach.php:671
#, php-format
-msgid "%s like this."
-msgstr "A %s le gusta esto."
+msgid "File exceeds size limit of %d"
+msgstr "El fichero supera el limite de tamaño de %d"
-#: ../../include/conversation.php:1239
+#: ../../include/attach.php:685
#, php-format
-msgid "%s don't like this."
-msgstr "A %s no le gusta esto."
-
-#: ../../include/conversation.php:1282
-msgid "Set your location"
-msgstr "Establecer su ubicación"
-
-#: ../../include/conversation.php:1283
-msgid "Clear browser location"
-msgstr "Eliminar los datos de localización geográfica del navegador"
-
-#: ../../include/conversation.php:1331
-msgid "Tag term:"
-msgstr "Término de la etiqueta:"
-
-#: ../../include/conversation.php:1332
-msgid "Where are you right now?"
-msgstr "¿Donde está ahora?"
-
-#: ../../include/conversation.php:1337
-msgid "Choose a different album..."
-msgstr "Elegir un álbum diferente..."
-
-#: ../../include/conversation.php:1341
-msgid "Comments enabled"
-msgstr "Comentarios habilitados"
-
-#: ../../include/conversation.php:1342
-msgid "Comments disabled"
-msgstr "Comentarios deshabilitados"
-
-#: ../../include/conversation.php:1380
-msgid "Page link name"
-msgstr "Nombre del enlace de la página"
-
-#: ../../include/conversation.php:1383
-msgid "Post as"
-msgstr "Publicar como"
-
-#: ../../include/conversation.php:1397
-msgid "Toggle voting"
-msgstr "Cambiar votación"
-
-#: ../../include/conversation.php:1400
-msgid "Disable comments"
-msgstr "Dehabilitar los comentarios"
-
-#: ../../include/conversation.php:1401
-msgid "Toggle comments"
-msgstr "Activar o desactivar los comentarios"
-
-#: ../../include/conversation.php:1409
-msgid "Categories (optional, comma-separated list)"
-msgstr "Temas (opcional, lista separada por comas)"
-
-#: ../../include/conversation.php:1432
-msgid "Other networks and post services"
-msgstr "Otras redes y servicios de publicación"
-
-#: ../../include/conversation.php:1438
-msgid "Set publish date"
-msgstr "Establecer la fecha de publicación"
-
-#: ../../include/conversation.php:1692
-msgid "Discover"
-msgstr "Descubrir"
-
-#: ../../include/conversation.php:1695
-msgid "Imported public streams"
-msgstr "Contenidos públicos importados"
-
-#: ../../include/conversation.php:1700
-msgid "Commented Order"
-msgstr "Comentarios recientes"
-
-#: ../../include/conversation.php:1703
-msgid "Sort by Comment Date"
-msgstr "Ordenar por fecha de comentario"
-
-#: ../../include/conversation.php:1707
-msgid "Posted Order"
-msgstr "Publicaciones recientes"
-
-#: ../../include/conversation.php:1710
-msgid "Sort by Post Date"
-msgstr "Ordenar por fecha de publicación"
-
-#: ../../include/conversation.php:1718
-msgid "Posts that mention or involve you"
-msgstr "Publicaciones que le mencionan o involucran"
-
-#: ../../include/conversation.php:1727
-msgid "Activity Stream - by date"
-msgstr "Contenido - por fecha"
-
-#: ../../include/conversation.php:1733
-msgid "Starred"
-msgstr "Preferidas"
-
-#: ../../include/conversation.php:1736
-msgid "Favourite Posts"
-msgstr "Publicaciones favoritas"
-
-#: ../../include/conversation.php:1743
-msgid "Spam"
-msgstr "Correo basura"
-
-#: ../../include/conversation.php:1746
-msgid "Posts flagged as SPAM"
-msgstr "Publicaciones marcadas como basura"
-
-#: ../../include/conversation.php:1818
-msgid "Status Messages and Posts"
-msgstr "Mensajes de estado y publicaciones"
-
-#: ../../include/conversation.php:1830
-msgid "Profile Details"
-msgstr "Detalles del perfil"
-
-#: ../../include/conversation.php:1839 ../../include/photos.php:515
-msgid "Photo Albums"
-msgstr "Ãlbumes de fotos"
+msgid "You have reached your limit of %1$.0f Mbytes attachment storage."
+msgstr "Ha alcanzado su límite de %1$.0f Mbytes de almacenamiento de adjuntos."
-#: ../../include/conversation.php:1846
-msgid "Files and Storage"
-msgstr "Ficheros y repositorio"
+#: ../../include/attach.php:855
+msgid "File upload failed. Possible system limit or action terminated."
+msgstr "Error de carga, posiblemente por limite del sistema o porque la acción ha finalizado."
-#: ../../include/conversation.php:1879
-msgid "Bookmarks"
-msgstr "Marcadores"
+#: ../../include/attach.php:868
+msgid "Stored file could not be verified. Upload failed."
+msgstr "El fichero almacenado no ha podido ser verificado. El envío ha fallado."
-#: ../../include/conversation.php:1882
-msgid "Saved Bookmarks"
-msgstr "Marcadores guardados"
+#: ../../include/attach.php:923 ../../include/attach.php:939
+msgid "Path not available."
+msgstr "Ruta no disponible."
-#: ../../include/conversation.php:1892
-msgid "View Webpages"
-msgstr "Ver páginas web"
+#: ../../include/attach.php:988 ../../include/attach.php:1153
+msgid "Empty pathname"
+msgstr "Ruta vacía"
-#: ../../include/conversation.php:1958
-msgctxt "noun"
-msgid "Attending"
-msgid_plural "Attending"
-msgstr[0] "Participaré"
-msgstr[1] "Participaré"
+#: ../../include/attach.php:1014
+msgid "duplicate filename or path"
+msgstr "Nombre duplicado de ruta o fichero"
-#: ../../include/conversation.php:1961
-msgctxt "noun"
-msgid "Not Attending"
-msgid_plural "Not Attending"
-msgstr[0] "No participaré"
-msgstr[1] "No participaré"
+#: ../../include/attach.php:1039
+msgid "Path not found."
+msgstr "Ruta no encontrada"
-#: ../../include/conversation.php:1964
-msgctxt "noun"
-msgid "Undecided"
-msgid_plural "Undecided"
-msgstr[0] "Indeciso/a"
-msgstr[1] "Indecisos/as"
+#: ../../include/attach.php:1107
+msgid "mkdir failed."
+msgstr "mkdir ha fallado."
-#: ../../include/conversation.php:1967
-msgctxt "noun"
-msgid "Agree"
-msgid_plural "Agrees"
-msgstr[0] "De acuerdo"
-msgstr[1] "De acuerdo"
+#: ../../include/attach.php:1111
+msgid "database storage failed."
+msgstr "el almacenamiento en la base de datos ha fallado."
-#: ../../include/conversation.php:1970
-msgctxt "noun"
-msgid "Disagree"
-msgid_plural "Disagrees"
-msgstr[0] "En desacuerdo"
-msgstr[1] "En desacuerdo"
+#: ../../include/attach.php:1159
+msgid "Empty path"
+msgstr "Ruta vacía"
-#: ../../include/conversation.php:1973
-msgctxt "noun"
-msgid "Abstain"
-msgid_plural "Abstains"
-msgstr[0] "se abstiene"
-msgstr[1] "Se abstienen"
+#: ../../include/security.php:117
+msgid "guest:"
+msgstr "invitado: "
-#: ../../include/group.php:26
+#: ../../include/security.php:532
msgid ""
-"A deleted group with this name was revived. Existing item permissions "
-"<strong>may</strong> apply to this group and any future members. If this is "
-"not what you intended, please create another group with a different name."
-msgstr "Un grupo suprimido con este nombre ha sido restablecido. <strong>Es posible</strong> que los permisos existentes sean aplicados a este grupo y sus futuros miembros. Si no quiere esto, por favor cree otro grupo con un nombre diferente."
-
-#: ../../include/group.php:268
-msgid "Add new connections to this privacy group"
-msgstr "Añadir conexiones nuevas a este grupo de canales"
-
-#: ../../include/group.php:309
-msgid "edit"
-msgstr "editar"
-
-#: ../../include/group.php:331 ../../include/features.php:292
-msgid "Privacy Groups"
-msgstr "Grupos de canales"
-
-#: ../../include/group.php:332
-msgid "Edit group"
-msgstr "Editar grupo"
-
-#: ../../include/group.php:333
-msgid "Add privacy group"
-msgstr "Añadir un grupo de canales"
-
-#: ../../include/group.php:334
-msgid "Channels not in any privacy group"
-msgstr "Sin canales en ningún grupo"
+"The form security token was not correct. This probably happened because the "
+"form has been opened for too long (>3 hours) before submitting it."
+msgstr "El \"token\" de seguridad del formulario no es correcto. Esto ha ocurrido probablemente porque el formulario ha estado abierto demasiado tiempo (>3 horas) antes de ser enviado"
-#: ../../include/items.php:843 ../../include/items.php:890
+#: ../../include/items.php:869 ../../include/items.php:916
msgid "(Unknown)"
msgstr "(Desconocido)"
-#: ../../include/items.php:1091
+#: ../../include/items.php:1110
msgid "Visible to anybody on the internet."
msgstr "Visible para cualquiera en internet."
-#: ../../include/items.php:1093
+#: ../../include/items.php:1112
msgid "Visible to you only."
msgstr "Visible sólo para usted."
-#: ../../include/items.php:1095
+#: ../../include/items.php:1114
msgid "Visible to anybody in this network."
msgstr "Visible para cualquiera en esta red."
-#: ../../include/items.php:1097
+#: ../../include/items.php:1116
msgid "Visible to anybody authenticated."
msgstr "Visible para cualquiera que esté autenticado."
-#: ../../include/items.php:1099
+#: ../../include/items.php:1118
#, php-format
msgid "Visible to anybody on %s."
msgstr "Visible para cualquiera en %s."
-#: ../../include/items.php:1101
+#: ../../include/items.php:1120
msgid "Visible to all connections."
msgstr "Visible para todas las conexiones."
-#: ../../include/items.php:1103
+#: ../../include/items.php:1122
msgid "Visible to approved connections."
msgstr "Visible para las conexiones permitidas."
-#: ../../include/items.php:1105
+#: ../../include/items.php:1124
msgid "Visible to specific connections."
msgstr "Visible para conexiones específicas."
-#: ../../include/items.php:3917
+#: ../../include/items.php:3938
msgid "Privacy group is empty."
msgstr "El grupo de canales está vacío."
-#: ../../include/items.php:3924
+#: ../../include/items.php:3945
#, php-format
msgid "Privacy group: %s"
msgstr "Grupo de canales: %s"
-#: ../../include/items.php:3936
+#: ../../include/items.php:3957
msgid "Connection not found."
msgstr "Conexión no encontrada"
-#: ../../include/items.php:4285
+#: ../../include/items.php:4310
msgid "profile photo"
msgstr "foto del perfil"
-#: ../../include/items.php:4481
+#: ../../include/items.php:4506
#, php-format
msgid "[Edited %s]"
msgstr "[se ha editado %s]"
-#: ../../include/items.php:4481
+#: ../../include/items.php:4506
msgctxt "edit_activity"
msgid "Post"
msgstr "Publicar"
-#: ../../include/items.php:4481
+#: ../../include/items.php:4506
msgctxt "edit_activity"
msgid "Comment"
msgstr "Comentar"
-#: ../../include/markdown.php:445
-msgid "Attachments:"
-msgstr "Ficheros adjuntos:"
-
-#: ../../include/markdown.php:542
-msgid "$Projectname event notification:"
-msgstr "Notificación de eventos de $Projectname:"
-
-#: ../../include/security.php:117
-msgid "guest:"
-msgstr "invitado: "
-
-#: ../../include/security.php:532
-msgid ""
-"The form security token was not correct. This probably happened because the "
-"form has been opened for too long (>3 hours) before submitting it."
-msgstr "El \"token\" de seguridad del formulario no es correcto. Esto ha ocurrido probablemente porque el formulario ha estado abierto demasiado tiempo (>3 horas) antes de ser enviado"
-
-#: ../../include/nav.php:88
-msgid "Remote authentication"
-msgstr "Acceder desde su servidor"
-
-#: ../../include/nav.php:88
-msgid "Click to authenticate to your home hub"
-msgstr "Pulsar para identificarse en su servidor de inicio"
-
-#: ../../include/nav.php:99 ../../include/nav.php:140 ../../boot.php:1748
-msgid "Logout"
-msgstr "Finalizar sesión"
-
-#: ../../include/nav.php:99 ../../include/nav.php:140
-msgid "End this session"
-msgstr "Finalizar esta sesión"
-
-#: ../../include/nav.php:103
-msgid "Your profile page"
-msgstr "Su página del perfil"
-
-#: ../../include/nav.php:105
-msgid "Manage/Edit profiles"
-msgstr "Administrar/editar perfiles"
-
-#: ../../include/nav.php:107
-msgid "Edit your profile"
-msgstr "Editar su perfil"
-
-#: ../../include/nav.php:130
-msgid "Sign in"
-msgstr "Acceder"
-
-#: ../../include/nav.php:155
-msgid "Get me home"
-msgstr "Volver a la página principal"
-
-#: ../../include/nav.php:157
-msgid "Log me out of this site"
-msgstr "Salir de este sitio"
-
-#: ../../include/nav.php:162
-msgid "Create an account"
-msgstr "Crear una cuenta"
-
-#: ../../include/nav.php:174
-msgid "Help and documentation"
-msgstr "Ayuda y documentación"
-
-#: ../../include/nav.php:178
-msgid "Applications, utilities, links, games"
-msgstr "Aplicaciones, utilidades, enlaces, juegos"
-
-#: ../../include/nav.php:180
-msgid "Search site @name, #tag, ?docs, content"
-msgstr "Buscar en el sitio por @nombre, #etiqueta, ?ayuda o contenido"
-
-#: ../../include/nav.php:182
-msgid "Channel Directory"
-msgstr "Directorio de canales"
-
-#: ../../include/nav.php:194
-msgid "Your grid"
-msgstr "Mi red"
-
-#: ../../include/nav.php:195
-msgid "View your network/grid"
-msgstr "Ver su red"
-
-#: ../../include/nav.php:196
-msgid "Mark all grid notifications seen"
-msgstr "Marcar todas las notificaciones de la red como vistas"
-
-#: ../../include/nav.php:198
-msgid "Channel home"
-msgstr "Mi canal"
-
-#: ../../include/nav.php:199
-msgid "View your channel home"
-msgstr "Ver su página principal del canal"
-
-#: ../../include/nav.php:200
-msgid "Mark all channel notifications seen"
-msgstr "Marcar todas las notificaciones del canal como leídas"
-
-#: ../../include/nav.php:206
-msgid "Notices"
-msgstr "Avisos"
-
-#: ../../include/nav.php:206
-msgid "Notifications"
-msgstr "Notificaciones"
-
-#: ../../include/nav.php:207
-msgid "View all notifications"
-msgstr "Ver todas las notificaciones"
-
-#: ../../include/nav.php:210
-msgid "Private mail"
-msgstr "Correo privado"
-
-#: ../../include/nav.php:211
-msgid "View your private messages"
-msgstr "Ver sus mensajes privados"
-
-#: ../../include/nav.php:212
-msgid "Mark all private messages seen"
-msgstr "Marcar todos los mensajes privados como leídos"
-
-#: ../../include/nav.php:218
-msgid "Event Calendar"
-msgstr "Calendario de eventos"
-
-#: ../../include/nav.php:219
-msgid "View events"
-msgstr "Ver los eventos"
-
-#: ../../include/nav.php:220
-msgid "Mark all events seen"
-msgstr "Marcar todos los eventos como leidos"
-
-#: ../../include/nav.php:223
-msgid "Manage Your Channels"
-msgstr "Gestionar sus canales"
-
-#: ../../include/nav.php:225
-msgid "Account/Channel Settings"
-msgstr "Ajustes de cuenta/canales"
-
-#: ../../include/nav.php:233
-msgid "Site Setup and Configuration"
-msgstr "Ajustes y configuración del sitio"
-
-#: ../../include/nav.php:297
-msgid "@name, #tag, ?doc, content"
-msgstr "@nombre, #etiqueta, ?ayuda, contenido"
-
-#: ../../include/nav.php:298
-msgid "Please wait..."
-msgstr "Espere por favor…"
-
-#: ../../include/nav.php:300
-msgid "Add Apps"
-msgstr "Añadir aplicaciones"
-
-#: ../../include/attach.php:250 ../../include/attach.php:338
-msgid "Item was not found."
-msgstr "Elemento no encontrado."
-
-#: ../../include/attach.php:499
-msgid "No source file."
-msgstr "Ningún fichero de origen"
-
-#: ../../include/attach.php:521
-msgid "Cannot locate file to replace"
-msgstr "No se puede localizar el fichero que va a ser sustituido."
-
-#: ../../include/attach.php:539
-msgid "Cannot locate file to revise/update"
-msgstr "No se puede localizar el fichero para revisar/actualizar"
-
-#: ../../include/attach.php:670
-#, php-format
-msgid "File exceeds size limit of %d"
-msgstr "El fichero supera el limite de tamaño de %d"
-
-#: ../../include/attach.php:684
-#, php-format
-msgid "You have reached your limit of %1$.0f Mbytes attachment storage."
-msgstr "Ha alcanzado su límite de %1$.0f Mbytes de almacenamiento de adjuntos."
-
-#: ../../include/attach.php:854
-msgid "File upload failed. Possible system limit or action terminated."
-msgstr "Error de carga, posiblemente por limite del sistema o porque la acción ha finalizado."
-
-#: ../../include/attach.php:867
-msgid "Stored file could not be verified. Upload failed."
-msgstr "El fichero almacenado no ha podido ser verificado. El envío ha fallado."
-
-#: ../../include/attach.php:922 ../../include/attach.php:938
-msgid "Path not available."
-msgstr "Ruta no disponible."
-
-#: ../../include/attach.php:984 ../../include/attach.php:1142
-msgid "Empty pathname"
-msgstr "Ruta vacía"
-
-#: ../../include/attach.php:1010
-msgid "duplicate filename or path"
-msgstr "Nombre duplicado de ruta o fichero"
-
-#: ../../include/attach.php:1032
-msgid "Path not found."
-msgstr "Ruta no encontrada"
-
-#: ../../include/attach.php:1096
-msgid "mkdir failed."
-msgstr "mkdir ha fallado."
-
-#: ../../include/attach.php:1100
-msgid "database storage failed."
-msgstr "el almacenamiento en la base de datos ha fallado."
-
-#: ../../include/attach.php:1148
-msgid "Empty path"
-msgstr "Ruta vacía"
-
-#: ../../include/text.php:461
-msgid "prev"
-msgstr "anterior"
-
-#: ../../include/text.php:463
-msgid "first"
-msgstr "primera"
-
-#: ../../include/text.php:492
-msgid "last"
-msgstr "última"
-
-#: ../../include/text.php:495
-msgid "next"
-msgstr "próxima"
-
-#: ../../include/text.php:506
-msgid "older"
-msgstr "más antiguas"
-
-#: ../../include/text.php:508
-msgid "newer"
-msgstr "más recientes"
-
-#: ../../include/text.php:928
-msgid "No connections"
-msgstr "Sin conexiones"
-
-#: ../../include/text.php:953
-#, php-format
-msgid "View all %s connections"
-msgstr "Ver todas las %s conexiones"
-
-#: ../../include/text.php:1098 ../../include/text.php:1103
-msgid "poke"
-msgstr "un toque"
-
-#: ../../include/text.php:1104
-msgid "ping"
-msgstr "un \"ping\""
-
-#: ../../include/text.php:1104
-msgid "pinged"
-msgstr "ha enviado un \"ping\" a"
-
-#: ../../include/text.php:1105
-msgid "prod"
-msgstr "una incitación "
-
-#: ../../include/text.php:1105
-msgid "prodded"
-msgstr "ha incitado a "
-
-#: ../../include/text.php:1106
-msgid "slap"
-msgstr "una bofetada "
-
-#: ../../include/text.php:1106
-msgid "slapped"
-msgstr "ha abofeteado a "
-
-#: ../../include/text.php:1107
-msgid "finger"
-msgstr "un \"finger\" "
-
-#: ../../include/text.php:1107
-msgid "fingered"
-msgstr "envió un \"finger\" a"
-
-#: ../../include/text.php:1108
-msgid "rebuff"
-msgstr "un reproche"
-
-#: ../../include/text.php:1108
-msgid "rebuffed"
-msgstr "ha hecho un reproche a "
-
-#: ../../include/text.php:1120
-msgid "happy"
-msgstr "feliz "
-
-#: ../../include/text.php:1121
-msgid "sad"
-msgstr "triste "
-
-#: ../../include/text.php:1122
-msgid "mellow"
-msgstr "tranquilo/a"
-
-#: ../../include/text.php:1123
-msgid "tired"
-msgstr "cansado/a "
-
-#: ../../include/text.php:1124
-msgid "perky"
-msgstr "vivaz"
-
-#: ../../include/text.php:1125
-msgid "angry"
-msgstr "enfadado/a"
-
-#: ../../include/text.php:1126
-msgid "stupefied"
-msgstr "asombrado/a"
-
-#: ../../include/text.php:1127
-msgid "puzzled"
-msgstr "perplejo/a"
-
#: ../../include/text.php:1128
msgid "interested"
msgstr "interesado/a"
@@ -12813,33 +12298,33 @@ msgstr "ansioso/a"
msgid "cranky"
msgstr "de mal humor"
-#: ../../include/text.php:1135
-msgid "disturbed"
-msgstr "perturbado/a"
+#: ../../include/channel.php:270
+msgid "Unable to retrieve created identity"
+msgstr "No ha sido posible recuperar la identidad creada"
-#: ../../include/text.php:1136
-msgid "frustrated"
-msgstr "frustrado/a"
+#: ../../include/channel.php:342
+msgid "Default Profile"
+msgstr "Perfil principal"
-#: ../../include/text.php:1137
-msgid "depressed"
-msgstr "deprimido/a"
+#: ../../include/channel.php:1045
+msgid "Create New Profile"
+msgstr "Crear un nuevo perfil"
-#: ../../include/text.php:1138
-msgid "motivated"
-msgstr "motivado/a"
+#: ../../include/channel.php:1065
+msgid "Visible to everybody"
+msgstr "Visible para todos"
-#: ../../include/text.php:1139
-msgid "relaxed"
-msgstr "relajado/a"
+#: ../../include/channel.php:1138 ../../include/channel.php:1252
+msgid "Gender:"
+msgstr "Género:"
-#: ../../include/text.php:1140
-msgid "surprised"
-msgstr "sorprendido/a"
+#: ../../include/channel.php:1140 ../../include/channel.php:1307
+msgid "Homepage:"
+msgstr "Página personal:"
-#: ../../include/text.php:1331
-msgid "May"
-msgstr "mayo"
+#: ../../include/channel.php:1141
+msgid "Online Now"
+msgstr "Ahora en línea"
#: ../../include/text.php:1408 ../../include/text.php:1412
msgid "Unknown Attachment"
@@ -12929,195 +12414,183 @@ msgstr "Escriba un nombre para el fichero zip."
msgid "Export to cloud files"
msgstr "Exportar a la nube de ficheros"
-#: ../../include/text.php:2325
-msgid "/path/to/export/folder"
-msgstr "/ruta/para/exportar/carpeta"
+#: ../../include/channel.php:2139
+#, php-format
+msgid "User '%s' deleted"
+msgstr "El usuario '%s' ha sido eliminado"
-#: ../../include/text.php:2326
-msgid "Enter a path to a cloud files destination."
-msgstr "Escriba una ruta de destino a la nube de ficheros."
+#: ../../include/event.php:1004
+msgid "This event has been added to your calendar."
+msgstr "Este evento ha sido añadido a su calendario."
-#: ../../include/text.php:2327
-msgid "Specify folder"
-msgstr "Especificar una carpeta"
+#: ../../include/event.php:1204
+msgid "Not specified"
+msgstr "Sin especificar"
-#: ../../include/auth.php:148
-msgid "Logged out."
-msgstr "Desconectado/a."
+#: ../../include/event.php:1205
+msgid "Needs Action"
+msgstr "Necesita de una intervención"
-#: ../../include/auth.php:275
-msgid "Failed authentication"
-msgstr "Autenticación fallida."
+#: ../../include/event.php:1206
+msgid "Completed"
+msgstr "Completado/a"
-#: ../../include/follow.php:26
-msgid "Channel is blocked on this site."
-msgstr "El canal está bloqueado en este sitio."
+#: ../../include/event.php:1207
+msgid "In Process"
+msgstr "En proceso"
-#: ../../include/follow.php:31
-msgid "Channel location missing."
-msgstr "Falta la dirección del canal."
+#: ../../include/event.php:1208
+msgid "Cancelled"
+msgstr "Cancelado/a"
-#: ../../include/follow.php:73
-msgid "Response from remote channel was incomplete."
-msgstr "Respuesta incompleta del canal."
+#: ../../include/network.php:776
+msgid "view full size"
+msgstr "Ver en el tamaño original"
-#: ../../include/follow.php:90
-msgid "Channel was deleted and no longer exists."
-msgstr "El canal ha sido eliminado y ya no existe."
+#: ../../include/network.php:2042
+msgid "No Subject"
+msgstr "Sin asunto"
-#: ../../include/follow.php:140 ../../include/follow.php:175
-msgid "Protocol disabled."
-msgstr "Protocolo deshabilitado."
+#: ../../include/network.php:2310 ../../include/network.php:2311
+msgid "Friendica"
+msgstr "Friendica"
-#: ../../include/follow.php:163
-msgid "Channel discovery failed."
-msgstr "El intento de acceder al canal ha fallado."
+#: ../../include/network.php:2312
+msgid "OStatus"
+msgstr "OStatus"
-#: ../../include/follow.php:202
-msgid "Cannot connect to yourself."
-msgstr "No puede conectarse consigo mismo."
+#: ../../include/network.php:2313
+msgid "GNU-Social"
+msgstr "GNU Social"
-#: ../../include/import.php:30
-msgid ""
-"Cannot create a duplicate channel identifier on this system. Import failed."
-msgstr "No se ha podido crear un canal con un identificador que ya existe en este sistema. La importación ha fallado."
+#: ../../include/network.php:2314
+msgid "RSS/Atom"
+msgstr "RSS/Atom"
-#: ../../include/import.php:90
-msgid "Channel clone failed. Import failed."
-msgstr "La clonación del canal no ha salido bien. La importación ha fallado."
+#: ../../include/network.php:2316
+msgid "Diaspora"
+msgstr "Diaspora"
-#: ../../include/import.php:100
-msgid "Cloned channel not found. Import failed."
-msgstr "No se ha podido importar el canal porque el canal clonado no se ha encontrado."
+#: ../../include/network.php:2317
+msgid "Facebook"
+msgstr "Facebook"
-#: ../../include/import.php:1373
-msgid "Unable to import element \""
-msgstr "No se puede importar un elemento \""
+#: ../../include/network.php:2318
+msgid "Zot"
+msgstr "Zot"
-#: ../../include/message.php:32
-msgid "Unable to determine sender."
-msgstr "No ha sido posible determinar el remitente. "
+#: ../../include/network.php:2319
+msgid "LinkedIn"
+msgstr "LinkedIn"
-#: ../../include/message.php:69
-msgid "No recipient provided."
-msgstr "No se ha especificado ningún destinatario."
+#: ../../include/network.php:2320
+msgid "XMPP/IM"
+msgstr "XMPP/IM"
-#: ../../include/message.php:74
-msgid "[no subject]"
-msgstr "[sin asunto]"
+#: ../../include/network.php:2321
+msgid "MySpace"
+msgstr "MySpace"
-#: ../../include/message.php:225
-msgid "Stored post could not be verified."
-msgstr "No se han podido verificar las publicaciones guardadas."
+#: ../../include/page_widgets.php:7
+msgid "New Page"
+msgstr "Nueva página"
-#: ../../include/oembed.php:308
-msgid " by "
-msgstr "por"
+#: ../../include/language.php:380
+msgid "Select an alternate language"
+msgstr "Seleccionar un idioma alternativo"
-#: ../../include/oembed.php:309
-msgid " on "
-msgstr "en"
+#: ../../include/acl_selectors.php:208
+msgid "Who can see this?"
+msgstr "¿Quién puede ver esto?"
-#: ../../include/oembed.php:338
-msgid "Embedded content"
-msgstr "Contenido incorporado"
+#: ../../include/acl_selectors.php:209
+msgid "Custom selection"
+msgstr "Selección personalizada"
-#: ../../include/oembed.php:347
-msgid "Embedding disabled"
-msgstr "Incrustación deshabilitada"
+#: ../../include/acl_selectors.php:210
+msgid ""
+"Select \"Show\" to allow viewing. \"Don't show\" lets you override and limit"
+" the scope of \"Show\"."
+msgstr "Seleccione \"Mostrar\" para permitir la visualización. La opción \"No mostrar\" le permite anular y limitar el alcance de \"Mostrar\"."
-#: ../../include/zot.php:649
-msgid "Invalid data packet"
-msgstr "Paquete de datos no válido"
+#: ../../include/acl_selectors.php:211
+msgid "Show"
+msgstr "Mostrar"
-#: ../../include/zot.php:665
-msgid "Unable to verify channel signature"
-msgstr "No ha sido posible de verificar la firma del canal"
+#: ../../include/acl_selectors.php:212
+msgid "Don't show"
+msgstr "No mostrar"
-#: ../../include/zot.php:2316
+#: ../../include/acl_selectors.php:245
#, php-format
-msgid "Unable to verify site signature for %s"
-msgstr "No ha sido posible de verificar la firma del sitio para %s"
-
-#: ../../include/zot.php:3722
-msgid "invalid target signature"
-msgstr "La firma recibida no es válida"
-
-#: ../../include/permissions.php:35
-msgid "Can view my normal stream and posts"
-msgstr "Pueden verse mi actividad y publicaciones normales"
-
-#: ../../include/permissions.php:39
-msgid "Can view my webpages"
-msgstr "Pueden verse mis páginas web"
-
-#: ../../include/permissions.php:43
-msgid "Can post on my channel page (\"wall\")"
-msgstr "Pueden crearse entradas en mi página de inicio del canal (“muroâ€)"
-
-#: ../../include/permissions.php:46
-msgid "Can like/dislike stuff"
-msgstr "Puede marcarse contenido como me gusta/no me gusta"
-
-#: ../../include/permissions.php:46
-msgid "Profiles and things other than posts/comments"
-msgstr "Perfiles y otras cosas aparte de publicaciones/comentarios"
+msgid ""
+"Post permissions %s cannot be changed %s after a post is shared.</br />These"
+" permissions set who is allowed to view the post."
+msgstr "Los permisos de la entrada %s no se pueden cambiar %s una vez que se ha compartido.</br /> Estos permisos establecen quién está autorizado para ver el mensaje."
-#: ../../include/permissions.php:48
-msgid "Can forward to all my channel contacts via post @mentions"
-msgstr "Puede enviarse una entrada a todos mis contactos del canal mediante una @mención"
+#: ../../include/dba/dba_driver.php:189
+#, php-format
+msgid "Cannot locate DNS info for database server '%s'"
+msgstr "No se ha podido localizar información de DNS para el servidor de base de datos “%sâ€"
-#: ../../include/permissions.php:48
-msgid "Advanced - useful for creating group forum channels"
-msgstr "Avanzado - útil para crear canales de foros de discusión o grupos"
+#: ../../include/bbcode.php:134 ../../include/bbcode.php:1040
+#: ../../include/bbcode.php:1043 ../../include/bbcode.php:1048
+#: ../../include/bbcode.php:1051 ../../include/bbcode.php:1054
+#: ../../include/bbcode.php:1057 ../../include/bbcode.php:1062
+#: ../../include/bbcode.php:1065 ../../include/bbcode.php:1070
+#: ../../include/bbcode.php:1073 ../../include/bbcode.php:1076
+#: ../../include/bbcode.php:1079
+msgid "Image/photo"
+msgstr "Imagen/foto"
-#: ../../include/permissions.php:49
-msgid "Can chat with me (when available)"
-msgstr "Se puede charlar conmigo (cuando esté disponible)"
+#: ../../include/bbcode.php:173 ../../include/bbcode.php:1090
+msgid "Encrypted content"
+msgstr "Contenido cifrado"
-#: ../../include/permissions.php:50
-msgid "Can write to my file storage and photos"
-msgstr "Puede escribirse en mi repositorio de ficheros y fotos"
+#: ../../include/bbcode.php:189
+#, php-format
+msgid "Install %s element: "
+msgstr "Instalar el elemento %s:"
-#: ../../include/permissions.php:51
-msgid "Can edit my webpages"
-msgstr "Pueden editarse mis páginas web"
+#: ../../include/bbcode.php:193
+#, php-format
+msgid ""
+"This post contains an installable %s element, however you lack permissions "
+"to install it on this site."
+msgstr "Esta entrada contiene el elemento instalable %s, sin embargo le faltan permisos para instalarlo en este sitio."
-#: ../../include/permissions.php:53
-msgid "Somewhat advanced - very useful in open communities"
-msgstr "Algo avanzado - muy útil en comunidades abiertas"
+#: ../../include/bbcode.php:272
+#, php-format
+msgid "%1$s wrote the following %2$s %3$s"
+msgstr "%1$s escribió %2$s siguiente %3$s"
-#: ../../include/permissions.php:55
-msgid "Can administer my channel resources"
-msgstr "Pueden administrarse mis recursos del canal"
+#: ../../include/bbcode.php:349 ../../include/bbcode.php:357
+msgid "Click to open/close"
+msgstr "Pulsar para abrir/cerrar"
-#: ../../include/permissions.php:55
-msgid ""
-"Extremely advanced. Leave this alone unless you know what you are doing"
-msgstr "Muy avanzado. Déjelo a no ser que sepa bien lo que está haciendo."
+#: ../../include/bbcode.php:357
+msgid "spoiler"
+msgstr "spoiler"
-#: ../../include/activities.php:41
-msgid " and "
-msgstr " y "
+#: ../../include/bbcode.php:1028
+msgid "$1 wrote:"
+msgstr "$1 escribió:"
-#: ../../include/activities.php:49
-msgid "public profile"
-msgstr "el perfil público"
+#: ../../include/oembed.php:315
+msgid " by "
+msgstr "por"
-#: ../../include/activities.php:58
-#, php-format
-msgid "%1$s changed %2$s to &ldquo;%3$s&rdquo;"
-msgstr "%1$s ha cambiado %2$s a &ldquo;%3$s&rdquo;"
+#: ../../include/oembed.php:316
+msgid " on "
+msgstr "en"
-#: ../../include/activities.php:59
-#, php-format
-msgid "Visit %1$s's %2$s"
-msgstr "Visitar %2$s de %1$s"
+#: ../../include/oembed.php:345
+msgid "Embedded content"
+msgstr "Contenido incorporado"
-#: ../../include/activities.php:62
-#, php-format
-msgid "%1$s has an updated %2$s, changing %3$s."
-msgstr "%1$s ha actualizado %2$s, cambiando %3$s."
+#: ../../include/oembed.php:354
+msgid "Embedding disabled"
+msgstr "Incrustación deshabilitada"
#: ../../include/features.php:58
msgid "General Features"
@@ -13193,7 +12666,7 @@ msgstr "Proporcionar salas y servicios de chat moderados."
#: ../../include/features.php:154
msgid "Provide alternate connection permission roles."
-msgstr "Proporcionar roles de acceso alternativas para esta conexión."
+msgstr "Proporcionar roles de acceso alternativos para esta conexión."
#: ../../include/features.php:162
msgid "Smart Birthdays"
@@ -13310,6 +12783,10 @@ msgstr "Buscar por fecha"
msgid "Ability to select posts by date ranges"
msgstr "Capacidad de seleccionar entradas por rango de fechas"
+#: ../../include/features.php:292 ../../include/group.php:331
+msgid "Privacy Groups"
+msgstr "Grupos de canales"
+
#: ../../include/features.php:293
msgid "Enable management and selection of privacy groups"
msgstr "Activar la gestión y selección de grupos de canales"
@@ -13420,368 +12897,414 @@ msgid ""
"channel"
msgstr "Le permite configurar restricciones y normas de uso a aquellos que conectan con su canal"
-#: ../../include/photos.php:115
-#, php-format
-msgid "Image exceeds website size limit of %lu bytes"
-msgstr "La imagen excede el límite de %lu bytes del sitio"
-
-#: ../../include/photos.php:122
-msgid "Image file is empty."
-msgstr "El fichero de imagen está vacío. "
+#: ../../include/taxonomy.php:228 ../../include/taxonomy.php:249
+msgid "Tags"
+msgstr "Etiquetas"
-#: ../../include/photos.php:260
-msgid "Photo storage failed."
-msgstr "La foto no ha podido ser guardada."
+#: ../../include/taxonomy.php:293
+msgid "Keywords"
+msgstr "Palabras clave"
-#: ../../include/photos.php:300
-msgid "a new photo"
-msgstr "una nueva foto"
+#: ../../include/taxonomy.php:314
+msgid "have"
+msgstr "tener"
-#: ../../include/photos.php:304
-#, php-format
-msgctxt "photo_upload"
-msgid "%1$s posted %2$s to %3$s"
-msgstr "%1$s ha publicado %2$s en %3$s"
+#: ../../include/taxonomy.php:314
+msgid "has"
+msgstr "tiene"
-#: ../../include/photos.php:519
-msgid "Upload New Photos"
-msgstr "Subir nuevas fotos"
+#: ../../include/taxonomy.php:315
+msgid "want"
+msgstr "quiero"
-#: ../../include/channel.php:33
-msgid "Unable to obtain identity information from database"
-msgstr "No ha sido posible obtener información sobre la identidad desde la base de datos"
+#: ../../include/taxonomy.php:315
+msgid "wants"
+msgstr "quiere"
-#: ../../include/channel.php:67
-msgid "Empty name"
-msgstr "Nombre vacío"
+#: ../../include/taxonomy.php:316
+msgid "likes"
+msgstr "gusta de"
-#: ../../include/channel.php:70
-msgid "Name too long"
-msgstr "Nombre demasiado largo"
+#: ../../include/taxonomy.php:317
+msgid "dislikes"
+msgstr "no gusta de"
-#: ../../include/channel.php:181
-msgid "No account identifier"
-msgstr "Ningún identificador de la cuenta"
+#: ../../include/account.php:35
+msgid "Not a valid email address"
+msgstr "Dirección de correo no válida"
-#: ../../include/channel.php:193
-msgid "Nickname is required."
-msgstr "Se requiere un sobrenombre (alias)."
+#: ../../include/account.php:37
+msgid "Your email domain is not among those allowed on this site"
+msgstr "Su dirección de correo no pertenece a ninguno de los dominios permitidos en este sitio."
-#: ../../include/channel.php:207
-msgid "Reserved nickname. Please choose another."
-msgstr "Sobrenombre en uso. Por favor, elija otro."
+#: ../../include/account.php:43
+msgid "Your email address is already registered at this site."
+msgstr "Su dirección de correo está ya registrada en este sitio."
-#: ../../include/channel.php:212
-msgid ""
-"Nickname has unsupported characters or is already being used on this site."
-msgstr "El alias contiene caracteres no admitidos o está ya en uso por otros miembros de este sitio."
+#: ../../include/account.php:75
+msgid "An invitation is required."
+msgstr "Es obligatorio que le inviten."
-#: ../../include/channel.php:272
-msgid "Unable to retrieve created identity"
-msgstr "No ha sido posible recuperar la identidad creada"
+#: ../../include/account.php:79
+msgid "Invitation could not be verified."
+msgstr "No se ha podido verificar su invitación."
-#: ../../include/channel.php:344
-msgid "Default Profile"
-msgstr "Perfil principal"
+#: ../../include/account.php:130
+msgid "Please enter the required information."
+msgstr "Por favor introduzca la información requerida."
-#: ../../include/channel.php:1045
-msgid "Create New Profile"
-msgstr "Crear un nuevo perfil"
+#: ../../include/account.php:198
+msgid "Failed to store account information."
+msgstr "La información de la cuenta no se ha podido guardar."
-#: ../../include/channel.php:1065
-msgid "Visible to everybody"
-msgstr "Visible para todos"
+#: ../../include/account.php:263
+#, php-format
+msgid "Registration confirmation for %s"
+msgstr "Confirmación de registro para %s"
-#: ../../include/channel.php:1138 ../../include/channel.php:1257
-msgid "Gender:"
-msgstr "Género:"
+#: ../../include/account.php:330
+#, php-format
+msgid "Registration request at %s"
+msgstr "Solicitud de registro en %s"
-#: ../../include/channel.php:1140 ../../include/channel.php:1312
-msgid "Homepage:"
-msgstr "Página personal:"
+#: ../../include/account.php:352
+msgid "your registration password"
+msgstr "su contraseña de registro"
-#: ../../include/channel.php:1141
-msgid "Online Now"
-msgstr "Ahora en línea"
+#: ../../include/account.php:358 ../../include/account.php:420
+#, php-format
+msgid "Registration details for %s"
+msgstr "Detalles del registro de %s"
-#: ../../include/channel.php:1262
-msgid "Like this channel"
-msgstr "Me gusta este canal"
+#: ../../include/account.php:431
+msgid "Account approved."
+msgstr "Cuenta aprobada."
-#: ../../include/channel.php:1286
-msgid "j F, Y"
-msgstr "j F Y"
+#: ../../include/account.php:471
+#, php-format
+msgid "Registration revoked for %s"
+msgstr "Registro revocado para %s"
-#: ../../include/channel.php:1287
-msgid "j F"
-msgstr "j F"
+#: ../../include/account.php:756 ../../include/account.php:758
+msgid "Click here to upgrade."
+msgstr "Pulse aquí para actualizar"
-#: ../../include/channel.php:1294
-msgid "Birthday:"
-msgstr "Cumpleaños:"
+#: ../../include/account.php:764
+msgid "This action exceeds the limits set by your subscription plan."
+msgstr "Esta acción supera los límites establecidos por su plan de suscripción "
-#: ../../include/channel.php:1307
-#, php-format
-msgid "for %1$d %2$s"
-msgstr "por %1$d %2$s"
+#: ../../include/account.php:769
+msgid "This action is not available under your subscription plan."
+msgstr "Esta acción no está disponible en su plan de suscripción."
-#: ../../include/channel.php:1310
-msgid "Sexual Preference:"
-msgstr "Orientación sexual:"
+#: ../../include/datetime.php:147
+msgid "Birthday"
+msgstr "Cumpleaños"
-#: ../../include/channel.php:1316
-msgid "Tags:"
-msgstr "Etiquetas:"
+#: ../../include/datetime.php:149
+msgid "Age: "
+msgstr "Edad:"
-#: ../../include/channel.php:1318
-msgid "Political Views:"
-msgstr "Posición política:"
+#: ../../include/datetime.php:151
+msgid "YYYY-MM-DD or MM-DD"
+msgstr "AAAA-MM-DD o MM-DD"
-#: ../../include/channel.php:1320
-msgid "Religion:"
-msgstr "Religión:"
+#: ../../include/datetime.php:292
+msgid "less than a second ago"
+msgstr "hace un instante"
-#: ../../include/channel.php:1324
-msgid "Hobbies/Interests:"
-msgstr "Aficciones o intereses:"
+#: ../../include/datetime.php:310
+#, php-format
+msgctxt "e.g. 22 hours ago, 1 minute ago"
+msgid "%1$d %2$s ago"
+msgstr "hace %1$d %2$s"
-#: ../../include/channel.php:1326
-msgid "Likes:"
-msgstr "Me gusta:"
+#: ../../include/datetime.php:321
+msgctxt "relative_date"
+msgid "year"
+msgid_plural "years"
+msgstr[0] "año"
+msgstr[1] "años"
-#: ../../include/channel.php:1328
-msgid "Dislikes:"
-msgstr "No me gusta:"
+#: ../../include/datetime.php:324
+msgctxt "relative_date"
+msgid "month"
+msgid_plural "months"
+msgstr[0] "mes"
+msgstr[1] "meses"
-#: ../../include/channel.php:1330
-msgid "Contact information and Social Networks:"
-msgstr "Información de contacto y redes sociales:"
+#: ../../include/datetime.php:327
+msgctxt "relative_date"
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "semana"
+msgstr[1] "semanas"
-#: ../../include/channel.php:1332
-msgid "My other channels:"
-msgstr "Mis otros canales:"
+#: ../../include/datetime.php:330
+msgctxt "relative_date"
+msgid "day"
+msgid_plural "days"
+msgstr[0] "día"
+msgstr[1] "días"
-#: ../../include/channel.php:1334
-msgid "Musical interests:"
-msgstr "Preferencias musicales:"
+#: ../../include/datetime.php:333
+msgctxt "relative_date"
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "hora"
+msgstr[1] "horas"
-#: ../../include/channel.php:1336
-msgid "Books, literature:"
-msgstr "Libros, literatura:"
+#: ../../include/datetime.php:336
+msgctxt "relative_date"
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minuto"
+msgstr[1] "minutos"
-#: ../../include/channel.php:1338
-msgid "Television:"
-msgstr "Televisión:"
+#: ../../include/datetime.php:339
+msgctxt "relative_date"
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] "segundo"
+msgstr[1] "segundos"
-#: ../../include/channel.php:1340
-msgid "Film/dance/culture/entertainment:"
-msgstr "Cine, danza, cultura, entretenimiento:"
+#: ../../include/datetime.php:576
+#, php-format
+msgid "%1$s's birthday"
+msgstr "Cumpleaños de %1$s"
-#: ../../include/channel.php:1342
-msgid "Love/Romance:"
-msgstr "Vida sentimental o amorosa:"
+#: ../../include/datetime.php:577
+#, php-format
+msgid "Happy Birthday %1$s"
+msgstr "Feliz cumpleaños %1$s"
-#: ../../include/channel.php:1344
-msgid "Work/employment:"
-msgstr "Trabajo:"
+#: ../../include/nav.php:92
+msgid "Remote authentication"
+msgstr "Acceder desde su servidor"
-#: ../../include/channel.php:1346
-msgid "School/education:"
-msgstr "Estudios:"
+#: ../../include/nav.php:92
+msgid "Click to authenticate to your home hub"
+msgstr "Pulsar para identificarse en su servidor de inicio"
-#: ../../include/channel.php:1369
-msgid "Like this thing"
-msgstr "Me gusta esto"
+#: ../../include/nav.php:103 ../../include/nav.php:127
+msgid "End this session"
+msgstr "Finalizar esta sesión"
-#: ../../include/channel.php:2103
-#, php-format
-msgid "User '%s' deleted"
-msgstr "El usuario '%s' ha sido eliminado"
+#: ../../include/nav.php:106
+msgid "Your profile page"
+msgstr "Su página del perfil"
-#: ../../util/nconfig.php:34
-msgid "Source channel not found."
-msgstr "No se ha encontrado el canal de origen."
+#: ../../include/nav.php:109
+msgid "Manage/Edit profiles"
+msgstr "Administrar/editar perfiles"
-#: ../../view/theme/redbasic/php/config.php:9
-msgid "Focus (Hubzilla default)"
-msgstr "Focus (predefinido)"
+#: ../../include/nav.php:111
+msgid "Edit your profile"
+msgstr "Editar su perfil"
-#: ../../view/theme/redbasic/php/config.php:110
-msgid "Theme settings"
-msgstr "Ajustes del tema"
+#: ../../include/nav.php:117
+msgid "Sign in"
+msgstr "Acceder"
-#: ../../view/theme/redbasic/php/config.php:111
-msgid "Narrow navbar"
-msgstr "Estrechar la barra de navegación"
+#: ../../include/nav.php:142
+msgid "Take me home"
+msgstr "Volver a la página principal"
-#: ../../view/theme/redbasic/php/config.php:112
-msgid "Navigation bar background color"
-msgstr "Color de fondo de la barra de navegación"
+#: ../../include/nav.php:144
+msgid "Log me out of this site"
+msgstr "Salir de este sitio"
-#: ../../view/theme/redbasic/php/config.php:113
-msgid "Navigation bar gradient top color"
-msgstr "Color superior del gradiente de la barra de navegación"
+#: ../../include/nav.php:149
+msgid "Create an account"
+msgstr "Crear una cuenta"
-#: ../../view/theme/redbasic/php/config.php:114
-msgid "Navigation bar gradient bottom color"
-msgstr "Color inferior del gradiente de la barra de navegación"
+#: ../../include/nav.php:161
+msgid "Help and documentation"
+msgstr "Ayuda y documentación"
-#: ../../view/theme/redbasic/php/config.php:115
-msgid "Navigation active button gradient top color"
-msgstr "Color superior del gradiente del botón activo de navegación"
+#: ../../include/nav.php:164
+msgid "Search site @name, #tag, ?docs, content"
+msgstr "Buscar en el sitio por @nombre, #etiqueta, ?ayuda o contenido"
-#: ../../view/theme/redbasic/php/config.php:116
-msgid "Navigation active button gradient bottom color"
-msgstr "Color inferior del gradiente del botón activo de navegación"
+#: ../../include/nav.php:176
+msgid "Grid"
+msgstr "Red"
-#: ../../view/theme/redbasic/php/config.php:117
-msgid "Navigation bar border color "
-msgstr "Color del borde de la barra de navegación"
+#: ../../include/nav.php:176
+msgid "Your grid"
+msgstr "Mi red"
-#: ../../view/theme/redbasic/php/config.php:118
-msgid "Navigation bar icon color "
-msgstr "Color del icono de la barra de navegación"
+#: ../../include/nav.php:177
+msgid "View your network/grid"
+msgstr "Ver su red"
-#: ../../view/theme/redbasic/php/config.php:119
-msgid "Navigation bar active icon color "
-msgstr "Color del icono activo de la barra de navegación"
+#: ../../include/nav.php:178
+msgid "Mark all grid notifications seen"
+msgstr "Marcar todas las notificaciones de la red como vistas"
-#: ../../view/theme/redbasic/php/config.php:120
-msgid "link color"
-msgstr "Color del enlace"
+#: ../../include/nav.php:180
+msgid "Channel home"
+msgstr "Mi canal"
-#: ../../view/theme/redbasic/php/config.php:121
-msgid "Set font-color for banner"
-msgstr "Ajustar el color del tipo de letra para el \"banner\""
+#: ../../include/nav.php:181
+msgid "View your channel home"
+msgstr "Ver su página principal del canal"
-#: ../../view/theme/redbasic/php/config.php:122
-msgid "Set the background color"
-msgstr "Ajustar el color de fondo"
+#: ../../include/nav.php:182
+msgid "Mark all channel notifications seen"
+msgstr "Marcar todas las notificaciones del canal como leídas"
-#: ../../view/theme/redbasic/php/config.php:123
-msgid "Set the background image"
-msgstr "Ajustar la imagen de fondo"
+#: ../../include/nav.php:188
+msgid "Notices"
+msgstr "Avisos"
-#: ../../view/theme/redbasic/php/config.php:124
-msgid "Set the background color of items"
-msgstr "Ajustar el color de los elementos de fondo"
+#: ../../include/nav.php:188
+msgid "Notifications"
+msgstr "Notificaciones"
-#: ../../view/theme/redbasic/php/config.php:125
-msgid "Set the background color of comments"
-msgstr "Ajustar el color de fondo de los comentarios"
+#: ../../include/nav.php:189
+msgid "View all notifications"
+msgstr "Ver todas las notificaciones"
-#: ../../view/theme/redbasic/php/config.php:126
-msgid "Set the border color of comments"
-msgstr "Ajustar el color del borde de los comentarios"
+#: ../../include/nav.php:192
+msgid "Private mail"
+msgstr "Correo privado"
-#: ../../view/theme/redbasic/php/config.php:127
-msgid "Set the indent for comments"
-msgstr "Ajustar la indentación de los comentarios"
+#: ../../include/nav.php:193
+msgid "View your private messages"
+msgstr "Ver sus mensajes privados"
-#: ../../view/theme/redbasic/php/config.php:128
-msgid "Set the basic color for item icons"
-msgstr "Ajustar el color básico para los iconos de los elementos"
+#: ../../include/nav.php:194
+msgid "Mark all private messages seen"
+msgstr "Marcar todos los mensajes privados como leídos"
-#: ../../view/theme/redbasic/php/config.php:129
-msgid "Set the hover color for item icons"
-msgstr "Ajustar el color flotante para los iconos de los elementos"
+#: ../../include/nav.php:200
+msgid "Event Calendar"
+msgstr "Calendario de eventos"
-#: ../../view/theme/redbasic/php/config.php:130
-msgid "Set font-size for the entire application"
-msgstr "Ajustar el tamaño de letra para toda la aplicación"
+#: ../../include/nav.php:201
+msgid "View events"
+msgstr "Ver los eventos"
-#: ../../view/theme/redbasic/php/config.php:130
-msgid "Example: 14px"
-msgstr "Ejemplo: 14px"
+#: ../../include/nav.php:202
+msgid "Mark all events seen"
+msgstr "Marcar todos los eventos como leidos"
-#: ../../view/theme/redbasic/php/config.php:131
-msgid "Set font-size for posts and comments"
-msgstr "Ajustar el tamaño del tipo de letra para publicaciones y comentarios"
+#: ../../include/nav.php:205
+msgid "Manage Your Channels"
+msgstr "Gestionar sus canales"
-#: ../../view/theme/redbasic/php/config.php:132
-msgid "Set font-color for posts and comments"
-msgstr "Establecer el color de la letra para publicaciones y comentarios"
+#: ../../include/nav.php:207
+msgid "Account/Channel Settings"
+msgstr "Ajustes de cuenta/canales"
-#: ../../view/theme/redbasic/php/config.php:133
-msgid "Set radius of corners"
-msgstr "Establecer el radio de curvatura de las esquinas"
+#: ../../include/nav.php:215
+msgid "Site Setup and Configuration"
+msgstr "Ajustes y configuración del sitio"
-#: ../../view/theme/redbasic/php/config.php:134
-msgid "Set shadow depth of photos"
-msgstr "Ajustar la profundidad de sombras de las fotos"
+#: ../../include/nav.php:277
+msgid "@name, #tag, ?doc, content"
+msgstr "@nombre, #etiqueta, ?ayuda, contenido"
-#: ../../view/theme/redbasic/php/config.php:135
-msgid "Set maximum width of content region in pixel"
-msgstr "Ajustar la anchura máxima de la región de contenido, en pixels"
+#: ../../include/nav.php:278
+msgid "Please wait..."
+msgstr "Espere por favor…"
-#: ../../view/theme/redbasic/php/config.php:135
-msgid "Leave empty for default width"
-msgstr "Dejar en blanco para la anchura predeterminada"
+#: ../../include/nav.php:280
+msgid "Add Apps"
+msgstr "Añadir aplicaciones"
-#: ../../view/theme/redbasic/php/config.php:136
-msgid "Left align page content"
-msgstr "Alinear a la izquierda el contenido de la página"
+#: ../../include/photos.php:115
+#, php-format
+msgid "Image exceeds website size limit of %lu bytes"
+msgstr "La imagen excede el límite de %lu bytes del sitio"
-#: ../../view/theme/redbasic/php/config.php:137
-msgid "Set minimum opacity of nav bar - to hide it"
-msgstr "Ajustar la opacidad mínima de la barra de navegación - para ocultarla"
+#: ../../include/photos.php:122
+msgid "Image file is empty."
+msgstr "El fichero de imagen está vacío. "
-#: ../../view/theme/redbasic/php/config.php:138
-msgid "Set size of conversation author photo"
-msgstr "Ajustar el tamaño de la foto del autor de la conversación"
+#: ../../include/photos.php:261
+msgid "Photo storage failed."
+msgstr "La foto no ha podido ser guardada."
-#: ../../view/theme/redbasic/php/config.php:139
-msgid "Set size of followup author photos"
-msgstr "Ajustar el tamaño de foto de los seguidores del autor"
+#: ../../include/photos.php:301
+msgid "a new photo"
+msgstr "una nueva foto"
-#: ../../boot.php:1522
+#: ../../include/photos.php:305
#, php-format
-msgid "Update %s failed. See error logs."
-msgstr "La actualización %s ha fallado. Mire el informe de errores."
+msgctxt "photo_upload"
+msgid "%1$s posted %2$s to %3$s"
+msgstr "%1$s ha publicado %2$s en %3$s"
-#: ../../boot.php:1525
+#: ../../include/photos.php:533
+msgid "Upload New Photos"
+msgstr "Subir nuevas fotos"
+
+#: ../../include/zot.php:646
+msgid "Invalid data packet"
+msgstr "Paquete de datos no válido"
+
+#: ../../include/zot.php:662
+msgid "Unable to verify channel signature"
+msgstr "No ha sido posible de verificar la firma del canal"
+
+#: ../../include/zot.php:2313
#, php-format
-msgid "Update Error at %s"
-msgstr "Error de actualización en %s"
+msgid "Unable to verify site signature for %s"
+msgstr "No ha sido posible de verificar la firma del sitio para %s"
-#: ../../boot.php:1729
-msgid "Create an account to access services and applications"
-msgstr "Crear una cuenta para acceder a los servicios y aplicaciones"
+#: ../../include/zot.php:3764
+msgid "invalid target signature"
+msgstr "La firma recibida no es válida"
-#: ../../boot.php:1751
-msgid "Login/Email"
-msgstr "Inicio de sesión / Correo electrónico"
+#: ../../include/group.php:26
+msgid ""
+"A deleted group with this name was revived. Existing item permissions "
+"<strong>may</strong> apply to this group and any future members. If this is "
+"not what you intended, please create another group with a different name."
+msgstr "Un grupo suprimido con este nombre ha sido restablecido. <strong>Es posible</strong> que los permisos existentes sean aplicados a este grupo y sus futuros miembros. Si no quiere esto, por favor cree otro grupo con un nombre diferente."
-#: ../../boot.php:1752
-msgid "Password"
-msgstr "Contraseña"
+#: ../../include/group.php:268
+msgid "Add new connections to this privacy group"
+msgstr "Añadir conexiones nuevas a este grupo de canales"
-#: ../../boot.php:1753
-msgid "Remember me"
-msgstr "Recordarme"
+#: ../../include/group.php:309
+msgid "edit"
+msgstr "editar"
-#: ../../boot.php:1756
-msgid "Forgot your password?"
-msgstr "¿Olvidó su contraseña?"
+#: ../../include/group.php:332
+msgid "Edit group"
+msgstr "Editar grupo"
-#: ../../boot.php:2320
-msgid "toggle mobile"
-msgstr "cambiar a modo móvil"
+#: ../../include/group.php:333
+msgid "Add privacy group"
+msgstr "Añadir un grupo de canales"
-#: ../../boot.php:2475
-msgid "Website SSL certificate is not valid. Please correct."
-msgstr "El certificado SSL del sitio web no es válido. Por favor, solucione el problema."
+#: ../../include/group.php:334
+msgid "Channels not in any privacy group"
+msgstr "Sin canales en ningún grupo"
-#: ../../boot.php:2478
-#, php-format
-msgid "[hubzilla] Website SSL error for %s"
-msgstr "[hubzilla] Error SSL del sitio web en %s"
+#: ../../include/connections.php:127
+msgid "New window"
+msgstr "Nueva ventana"
-#: ../../boot.php:2597
-msgid "Cron/Scheduled tasks not running."
-msgstr "Las tareas del Planificador/Cron no están funcionando."
+#: ../../include/connections.php:128
+msgid "Open the selected location in a different window or browser tab"
+msgstr "Abrir la dirección seleccionada en una ventana o pestaña aparte"
-#: ../../boot.php:2601
-#, php-format
-msgid "[hubzilla] Cron tasks not running on %s"
-msgstr "[hubzilla] Las tareas de Cron no están funcionando en %s"
+#: ../../include/auth.php:148
+msgid "Logged out."
+msgstr "Desconectado/a."
+
+#: ../../include/auth.php:275
+msgid "Failed authentication"
+msgstr "Autenticación fallida."
+
+#: ../../include/help.php:33
+msgid "Help:"
+msgstr "Ayuda:"
+
+#: ../../include/help.php:65
+msgid "Not Found"
+msgstr "No encontrado"
diff --git a/view/es-es/hstrings.php b/view/es-es/hstrings.php
index 90e3b6a7e..59363f6ed 100644
--- a/view/es-es/hstrings.php
+++ b/view/es-es/hstrings.php
@@ -5,22 +5,6 @@ function string_plural_select_es_es($n){
return ($n != 1);;
}}
App::$rtl = 0;
-App::$strings["Social Networking"] = "Redes sociales";
-App::$strings["Social - Mostly Public"] = "Social - Público en su mayor parte";
-App::$strings["Social - Restricted"] = "Social - Restringido";
-App::$strings["Social - Private"] = "Social - Privado";
-App::$strings["Community Forum"] = "Foro de discusión";
-App::$strings["Forum - Mostly Public"] = "Foro - Público en su mayor parte";
-App::$strings["Forum - Restricted"] = "Foro - Restringido";
-App::$strings["Forum - Private"] = "Foro - Privado";
-App::$strings["Feed Republish"] = "Republicar un \"feed\"";
-App::$strings["Feed - Mostly Public"] = "Feed - Público en su mayor parte";
-App::$strings["Feed - Restricted"] = "Feed - Restringido";
-App::$strings["Special Purpose"] = "Propósito especial";
-App::$strings["Special - Celebrity/Soapbox"] = "Especial - Celebridad / Tribuna improvisada";
-App::$strings["Special - Group Repository"] = "Especial - Repositorio de grupo";
-App::$strings["Other"] = "Otro";
-App::$strings["Custom/Expert Mode"] = "Modo personalizado/experto";
App::$strings["Can view my channel stream and posts"] = "Pueden verse la actividad y publicaciones de mi canal";
App::$strings["Can send me their channel stream and posts"] = "Se me pueden enviar entradas y contenido de un canal";
App::$strings["Can view my default channel profile"] = "Puede verse mi perfil de canal predeterminado.";
@@ -39,72 +23,201 @@ App::$strings["Can forward to all my channel connections via @+ mentions in post
App::$strings["Can chat with me"] = "Se puede chatear conmigo";
App::$strings["Can source my public posts in derived channels"] = "Pueden utilizarse mis entradas públicas como origen de contenidos en canales derivados";
App::$strings["Can administer my channel"] = "Se puede administrar mi canal";
-App::$strings["parent"] = "padre";
-App::$strings["Collection"] = "Colección";
-App::$strings["Principal"] = "Principal";
-App::$strings["Addressbook"] = "Libreta de direcciones";
-App::$strings["Calendar"] = "Calendario";
-App::$strings["Schedule Inbox"] = "Programar bandeja de entrada";
-App::$strings["Schedule Outbox"] = "Programar bandeja de salida";
-App::$strings["Unknown"] = "Desconocido";
-App::$strings["Files"] = "Ficheros";
-App::$strings["Total"] = "Total";
-App::$strings["Shared"] = "Compartido";
+App::$strings["Social Networking"] = "Redes sociales";
+App::$strings["Social - Mostly Public"] = "Social - Público en su mayor parte";
+App::$strings["Social - Restricted"] = "Social - Restringido";
+App::$strings["Social - Private"] = "Social - Privado";
+App::$strings["Community Forum"] = "Foro de discusión";
+App::$strings["Forum - Mostly Public"] = "Foro - Público en su mayor parte";
+App::$strings["Forum - Restricted"] = "Foro - Restringido";
+App::$strings["Forum - Private"] = "Foro - Privado";
+App::$strings["Feed Republish"] = "Republicar un \"feed\"";
+App::$strings["Feed - Mostly Public"] = "Feed - Público en su mayor parte";
+App::$strings["Feed - Restricted"] = "Feed - Restringido";
+App::$strings["Special Purpose"] = "Propósito especial";
+App::$strings["Special - Celebrity/Soapbox"] = "Especial - Celebridad / Tribuna improvisada";
+App::$strings["Special - Group Repository"] = "Especial - Repositorio de grupo";
+App::$strings["Other"] = "Otro";
+App::$strings["Custom/Expert Mode"] = "Modo personalizado/experto";
+App::$strings["Requested profile is not available."] = "El perfil solicitado no está disponible.";
+App::$strings["Permission denied."] = "Acceso denegado.";
+App::$strings["Block Name"] = "Nombre del bloque";
+App::$strings["Blocks"] = "Bloques";
+App::$strings["Block Title"] = "Título del bloque";
+App::$strings["Created"] = "Creado";
+App::$strings["Edited"] = "Editado";
App::$strings["Create"] = "Crear";
-App::$strings["Upload"] = "Subir";
-App::$strings["Name"] = "Nombre";
-App::$strings["Type"] = "Tipo";
-App::$strings["Size"] = "Tamaño";
-App::$strings["Last Modified"] = "Última modificación";
App::$strings["Edit"] = "Editar";
+App::$strings["Share"] = "Compartir";
App::$strings["Delete"] = "Eliminar";
-App::$strings["You are using %1\$s of your available file storage."] = "Está usando %1\$s de su espacio disponible para ficheros.";
-App::$strings["You are using %1\$s of %2\$s available file storage. (%3\$s&#37;)"] = "Está usando %1\$s de %2\$s que tiene a su disposición para ficheros. (%3\$s&#37;)";
-App::$strings["WARNING:"] = "ATENCIÓN: ";
-App::$strings["Please use DAV to upload large (video, audio) files.<br>See <a class=\"zrl\" href=\"help/member/member_guide#Cloud_Desktop_Clients\">Cloud Desktop Clients</a>"] = "Por favor, use DAV para subir ficheros de gran tamaño (vídeo, audio).<br>Mire en <a class=\"zrl\" href=\"help/member/member_guide#Cloud_Desktop_Clients\">Cloud Desktop Clients</a>";
-App::$strings["Create new folder"] = "Crear nueva carpeta";
-App::$strings["Upload file"] = "Subir fichero";
-App::$strings["Drop files here to immediately upload"] = "Arrastre los ficheros aquí para subirlos de forma inmediata";
+App::$strings["View"] = "Ver";
+App::$strings["Total invitation limit exceeded."] = "Se ha superado el límite máximo de invitaciones.";
+App::$strings["%s : Not a valid email address."] = "%s : No es una dirección de correo electrónico válida. ";
+App::$strings["Please join us on \$Projectname"] = "Únase a nosotros en \$Projectname";
+App::$strings["Invitation limit exceeded. Please contact your site administrator."] = "Excedido el límite de invitaciones. Por favor, contacte con el Administrador de su sitio.";
+App::$strings["%s : Message delivery failed."] = "%s : Falló el envío del mensaje.";
+App::$strings["%d message sent."] = array(
+ 0 => "%d mensajes enviados.",
+ 1 => "%d mensajes enviados.",
+);
+App::$strings["You have no more invitations available"] = "No tiene más invitaciones disponibles";
+App::$strings["Send invitations"] = "Enviar invitaciones";
+App::$strings["Enter email addresses, one per line:"] = "Introduzca las direcciones de correo electrónico, una por línea:";
+App::$strings["Your message:"] = "Su mensaje:";
+App::$strings["Please join my community on \$Projectname."] = "Por favor, únase a mi comunidad en \$Projectname.";
+App::$strings["You will need to supply this invitation code:"] = "Tendrá que suministrar este código de invitación:";
+App::$strings["1. Register at any \$Projectname location (they are all inter-connected)"] = "1. Regístrese en cualquier sitio de \$Projectname (están todos interconectados)";
+App::$strings["2. Enter my \$Projectname network address into the site searchbar."] = "2. Introduzca mi dirección \$Projectname en la caja de búsqueda del sitio.";
+App::$strings["or visit"] = "o visitar";
+App::$strings["3. Click [Connect]"] = "3. Pulse [conectar]";
+App::$strings["Submit"] = "Enviar";
+App::$strings["Item not found"] = "Elemento no encontrado";
+App::$strings["Layout Name"] = "Nombre de la plantilla";
+App::$strings["Layout Description (Optional)"] = "Descripción de la plantilla (opcional)";
+App::$strings["Edit Layout"] = "Modificar la plantilla";
App::$strings["Permission denied"] = "Permiso denegado";
-App::$strings["Permission denied."] = "Acceso denegado.";
-App::$strings["Page not found."] = "Página no encontrada.";
-App::$strings["Remote authentication blocked. You are logged into this site locally. Please logout and retry."] = "La autenticación desde su servidor está bloqueada. Ha iniciado sesión localmente. Por favor, salga de la sesión y vuelva a intentarlo.";
-App::$strings["Welcome %s. Remote authentication successful."] = "Bienvenido %s. La identificación desde su servidor se ha llevado a cabo correctamente.";
-App::$strings["Requested profile is not available."] = "El perfil solicitado no está disponible.";
-App::$strings["Some blurb about what to do when you're new here"] = "Algunas propuestas para el nuevo usuario sobre qué se puede hacer aquí";
+App::$strings["Invalid profile identifier."] = "Identificador del perfil no válido";
+App::$strings["Profile Visibility Editor"] = "Editor de visibilidad del perfil";
+App::$strings["Profile"] = "Perfil";
+App::$strings["Click on a contact to add or remove."] = "Pulsar en un contacto para añadirlo o eliminarlo.";
+App::$strings["Visible To"] = "Visible para";
+App::$strings["All Connections"] = "Todas las conexiones";
+App::$strings["This site is not a directory server"] = "Este sitio no es un servidor de directorio";
+App::$strings["You must be logged in to see this page."] = "Debe haber iniciado sesión para poder ver esta página.";
+App::$strings["Posts and comments"] = "Publicaciones y comentarios";
+App::$strings["Only posts"] = "Solo publicaciones";
+App::$strings["Insufficient permissions. Request redirected to profile page."] = "Permisos insuficientes. Petición redirigida a la página del perfil.";
+App::$strings["Export Channel"] = "Exportar el canal";
+App::$strings["Export your basic channel information to a file. This acts as a backup of your connections, permissions, profile and basic data, which can be used to import your data to a new server hub, but does not contain your content."] = "Exportar la información básica del canal a un fichero. Este equivale a una copia de seguridad de sus conexiones, el perfil y datos fundamentales, que puede usarse para importar sus datos a un nuevo servidor, pero no incluye su contenido.";
+App::$strings["Export Content"] = "Exportar contenidos";
+App::$strings["Export your channel information and recent content to a JSON backup that can be restored or imported to another server hub. This backs up all of your connections, permissions, profile data and several months of posts. This file may be VERY large. Please be patient - it may take several minutes for this download to begin."] = "Exportar la información sobre su canal y el contenido reciente a un fichero de respaldo JSON, que puede ser restaurado o importado a otro servidor. Este fichero incluye todas sus conexiones, permisos, datos del perfil y publicaciones de varios meses. Puede llegar a ser MUY grande. Por favor, sea paciente, la descarga puede tardar varios minutos en comenzar.";
+App::$strings["Export your posts from a given year."] = "Exporta sus publicaciones de un año dado.";
+App::$strings["You may also export your posts and conversations for a particular year or month. Adjust the date in your browser location bar to select other dates. If the export fails (possibly due to memory exhaustion on your server hub), please try again selecting a more limited date range."] = "También puede exportar sus mensajes y conversaciones durante un año o mes en particular. Ajuste la fecha en la barra de direcciones del navegador para seleccionar otras fechas. Si la exportación falla (posiblemente debido al agotamiento de la memoria del servidor hub), por favor, intente de nuevo la selección de un rango de fechas más pequeño.";
+App::$strings["To select all posts for a given year, such as this year, visit <a href=\"%1\$s\">%2\$s</a>"] = "Para seleccionar todos los mensajes de un año determinado, como este año, visite <a href=\"%1\$s\">%2\$s</a>";
+App::$strings["To select all posts for a given month, such as January of this year, visit <a href=\"%1\$s\">%2\$s</a>"] = "Para seleccionar todos los mensajes de un mes determinado, como el de enero de este año, visite <a href=\"%1\$s\">%2\$s</a>";
+App::$strings["These content files may be imported or restored by visiting <a href=\"%1\$s\">%2\$s</a> on any site containing your channel. For best results please import or restore these in date order (oldest first)."] = "Estos ficheros pueden ser importados o restaurados visitando <a href=\"%1\$s\">%2\$s</a> o cualquier sitio que contenga su canal. Para obtener los mejores resultados, por favor, importar o restaurar estos ficheros en orden de fecha (la más antigua primero).";
+App::$strings["Public access denied."] = "Acceso público denegado.";
+App::$strings["Search"] = "Buscar";
+App::$strings["Items tagged with: %s"] = "elementos etiquetados con: %s";
+App::$strings["Search results for: %s"] = "Resultados de la búsqueda para: %s";
+App::$strings["Location not found."] = "Dirección no encontrada.";
+App::$strings["Location lookup failed."] = "Ha fallado la búsqueda de la dirección.";
+App::$strings["Please select another location to become primary before removing the primary location."] = "Por favor, seleccione una copia de su canal (un clon) para convertirlo en primario antes de eliminar su canal principal.";
+App::$strings["Syncing locations"] = "Sincronizando ubicaciones";
+App::$strings["No locations found."] = "No encontrada ninguna dirección.";
+App::$strings["Manage Channel Locations"] = "Gestionar las direcciones del canal";
+App::$strings["Location"] = "Ubicación";
+App::$strings["Address"] = "Dirección";
+App::$strings["Primary"] = "Primario";
+App::$strings["Drop"] = "Eliminar";
+App::$strings["Sync Now"] = "Sincronizar ahora";
+App::$strings["Please wait several minutes between consecutive operations."] = "Por favor, espere algunos minutos entre operaciones consecutivas.";
+App::$strings["When possible, drop a location by logging into that website/hub and removing your channel."] = "Cuando sea posible, elimine una ubicación iniciando sesión en el sitio web o \"hub\" y borrando su canal.";
+App::$strings["Use this form to drop the location if the hub is no longer operating."] = "Utilice este formulario para eliminar la dirección si el \"hub\" no está funcionando desde hace tiempo.";
+App::$strings["Menu not found."] = "Menú no encontrado";
+App::$strings["Unable to create element."] = "No se puede crear el elemento.";
+App::$strings["Unable to update menu element."] = "No es posible actualizar el elemento del menú.";
+App::$strings["Unable to add menu element."] = "No es posible añadir el elemento al menú";
+App::$strings["Not found."] = "No encontrado.";
+App::$strings["Menu Item Permissions"] = "Permisos del elemento del menú";
+App::$strings["(click to open/close)"] = "(pulsar para abrir o cerrar)";
+App::$strings["Link Name"] = "Nombre del enlace";
+App::$strings["Link or Submenu Target"] = "Destino del enlace o submenú";
+App::$strings["Enter URL of the link or select a menu name to create a submenu"] = "Introducir la dirección del enlace o seleccionar el nombre de un submenú";
+App::$strings["Use magic-auth if available"] = "Usar la autenticación mágica si está disponible";
+App::$strings["No"] = "No";
+App::$strings["Yes"] = "Sí";
+App::$strings["Open link in new window"] = "Abrir el enlace en una nueva ventana";
+App::$strings["Order in list"] = "Orden en la lista";
+App::$strings["Higher numbers will sink to bottom of listing"] = "Los números más altos irán al final de la lista";
+App::$strings["Submit and finish"] = "Enviar y terminar";
+App::$strings["Submit and continue"] = "Enviar y continuar";
+App::$strings["Menu:"] = "Menú:";
+App::$strings["Link Target"] = "Destino del enlace";
+App::$strings["Edit menu"] = "Editar menú";
+App::$strings["Edit element"] = "Editar el elemento";
+App::$strings["Drop element"] = "Eliminar el elemento";
+App::$strings["New element"] = "Nuevo elemento";
+App::$strings["Edit this menu container"] = "Modificar el contenedor del menú";
+App::$strings["Add menu element"] = "Añadir un elemento al menú";
+App::$strings["Delete this menu item"] = "Eliminar este elemento del menú";
+App::$strings["Edit this menu item"] = "Modificar este elemento del menú";
+App::$strings["Menu item not found."] = "Este elemento del menú no se ha encontrado";
+App::$strings["Menu item deleted."] = "Este elemento del menú ha sido borrado";
+App::$strings["Menu item could not be deleted."] = "Este elemento del menú no puede ser borrado.";
+App::$strings["Edit Menu Element"] = "Editar elemento del menú";
+App::$strings["Link text"] = "Texto del enlace";
+App::$strings["Calendar entries imported."] = "Entradas de calendario importadas.";
+App::$strings["No calendar entries found."] = "No se han encontrado entradas de calendario.";
+App::$strings["Event can not end before it has started."] = "Un evento no puede terminar antes de que haya comenzado.";
+App::$strings["Unable to generate preview."] = "No se puede crear la vista previa.";
+App::$strings["Event title and start time are required."] = "Se requieren el título del evento y su hora de inicio.";
+App::$strings["Event not found."] = "Evento no encontrado.";
+App::$strings["event"] = "evento";
+App::$strings["Edit event title"] = "Editar el título del evento";
+App::$strings["Event title"] = "Título del evento";
+App::$strings["Required"] = "Obligatorio";
+App::$strings["Categories (comma-separated list)"] = "Temas (lista separada por comas)";
+App::$strings["Edit Category"] = "Modificar el tema";
+App::$strings["Category"] = "Tema";
+App::$strings["Edit start date and time"] = "Modificar la fecha y hora de comienzo";
+App::$strings["Start date and time"] = "Fecha y hora de comienzo";
+App::$strings["Finish date and time are not known or not relevant"] = "La fecha y hora de terminación no se conocen o no son relevantes";
+App::$strings["Edit finish date and time"] = "Modificar la fecha y hora de terminación";
+App::$strings["Finish date and time"] = "Fecha y hora de terminación";
+App::$strings["Adjust for viewer timezone"] = "Ajustar para obtener el visor de los husos horarios";
+App::$strings["Important for events that happen in a particular place. Not practical for global holidays."] = "Importante para los eventos que suceden en un lugar determinado. No es práctico para los globales.";
+App::$strings["Edit Description"] = "Editar la descripción";
+App::$strings["Description"] = "Descripción";
+App::$strings["Edit Location"] = "Modificar la dirección";
+App::$strings["Preview"] = "Previsualizar";
+App::$strings["Permission settings"] = "Configuración de permisos";
+App::$strings["Timezone:"] = "Zona horaria: ";
+App::$strings["Advanced Options"] = "Opciones avanzadas";
+App::$strings["l, F j"] = "l j F";
+App::$strings["Edit event"] = "Editar evento";
+App::$strings["Delete event"] = "Borrar evento";
+App::$strings["Link to Source"] = "Enlazar con la entrada en su ubicación original";
+App::$strings["calendar"] = "calendario";
+App::$strings["Edit Event"] = "Editar el evento";
+App::$strings["Create Event"] = "Crear un evento";
+App::$strings["Previous"] = "Anterior";
+App::$strings["Next"] = "Siguiente";
+App::$strings["Export"] = "Exportar";
+App::$strings["Month"] = "Mes";
+App::$strings["Week"] = "Semana";
+App::$strings["Day"] = "Día";
+App::$strings["Today"] = "Hoy";
+App::$strings["Event removed"] = "Evento borrado";
+App::$strings["Failed to remove event"] = "Error al eliminar el evento";
App::$strings["App installed."] = "Aplicación instalada.";
App::$strings["Malformed app."] = "Aplicación con errores";
App::$strings["Embed code"] = "Código incorporado";
App::$strings["Edit App"] = "Modificar la aplicación";
App::$strings["Create App"] = "Crear una aplicación";
App::$strings["Name of app"] = "Nombre de la aplicación";
-App::$strings["Required"] = "Obligatorio";
App::$strings["Location (URL) of app"] = "Dirección (URL) de la aplicación";
-App::$strings["Description"] = "Descripción";
App::$strings["Photo icon URL"] = "Dirección del icono";
App::$strings["80 x 80 pixels - optional"] = "80 x 80 pixels - opcional";
App::$strings["Categories (optional, comma separated list)"] = "Temas (opcional, lista separada por comas)";
App::$strings["Version ID"] = "Versión";
App::$strings["Price of app"] = "Precio de la aplicación";
App::$strings["Location (URL) to purchase app"] = "Dirección (URL) donde adquirir la aplicación";
-App::$strings["Submit"] = "Enviar";
-App::$strings["Maximum daily site registrations exceeded. Please try again tomorrow."] = "Se ha superado el límite máximo de inscripciones diarias de este sitio. Por favor, pruebe de nuevo mañana.";
-App::$strings["Please indicate acceptance of the Terms of Service. Registration failed."] = "Por favor, confirme que acepta los Términos del servicio. El registro ha fallado.";
-App::$strings["Passwords do not match."] = "Las contraseñas no coinciden.";
-App::$strings["Registration successful. Please check your email for validation instructions."] = "Registro realizado con éxito. Por favor, compruebe su correo electrónico para ver las instrucciones para validarlo.";
-App::$strings["Your registration is pending approval by the site owner."] = "Su registro está pendiente de aprobación por el propietario del sitio.";
-App::$strings["Your registration can not be processed."] = "Su registro no puede ser procesado.";
-App::$strings["Registration on this hub is disabled."] = "El registro está deshabilitado en este sitio.";
-App::$strings["Registration on this hub is by approval only."] = "El registro en este hub está sometido a aprobación previa.";
-App::$strings["<a href=\"pubsites\">Register at another affiliated hub.</a>"] = "<a href=\"pubsites\">Registrarse en otro hub afiliado.</a>";
-App::$strings["This site has exceeded the number of allowed daily account registrations. Please try again tomorrow."] = "Este sitio ha excedido el límite de inscripción diaria de cuentas. Por favor, inténtelo de nuevo mañana.";
-App::$strings["Terms of Service"] = "Términos del servicio";
-App::$strings["I accept the %s for this website"] = "Acepto los %s de este sitio";
-App::$strings["I am over 13 years of age and accept the %s for this website"] = "Tengo más de 13 años de edad y acepto los %s de este sitio";
-App::$strings["Your email address"] = "Su dirección de correo electrónico";
-App::$strings["Choose a password"] = "Elija una contraseña";
-App::$strings["Please re-enter your password"] = "Por favor, vuelva a escribir su contraseña";
-App::$strings["Please enter your invitation code"] = "Por favor, introduzca el código de su invitación";
+App::$strings["Please login."] = "Por favor, inicie sesión.";
+App::$strings["Hub not found."] = "Servidor no encontrado";
+App::$strings["photo"] = "foto";
+App::$strings["status"] = "el mensaje de estado";
+App::$strings["%1\$s is following %2\$s's %3\$s"] = "%1\$s está siguiendo %3\$s de %2\$s";
+App::$strings["%1\$s stopped following %2\$s's %3\$s"] = "%1\$s ha dejado de seguir %3\$s de %2\$s";
+App::$strings["Nothing to import."] = "No hay nada para importar.";
+App::$strings["Unable to download data from old server"] = "No se han podido descargar datos de su antiguo servidor";
+App::$strings["Imported file is empty."] = "El fichero importado está vacío.";
+App::$strings["Warning: Database versions differ by %1\$d updates."] = "Atención: Las versiones de la base de datos difieren en %1\$d actualizaciones.";
+App::$strings["Import completed"] = "Importación completada";
+App::$strings["Import Items"] = "Importar elementos";
+App::$strings["Use this form to import existing posts and content from an export file."] = "Utilice este formulario para importar entradas existentes y contenido desde un archivo de exportación.";
+App::$strings["File to Upload"] = "Fichero para subir";
+App::$strings["You have created %1$.0f of %2$.0f allowed channels."] = "Ha creado %1$.0f de %2$.0f canales permitidos.";
App::$strings["Name or caption"] = "Nombre o descripción";
App::$strings["Examples: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \"Aviation Group\""] = "Ejemplos: \"Juan García\", \"Luisa y sus caballos\", \"Fútbol\", \"Grupo de aviación\"";
App::$strings["Choose a short nickname"] = "Elija un alias corto";
@@ -112,50 +225,117 @@ App::$strings["Your nickname will be used to create an easy to remember channel
App::$strings["Channel role and privacy"] = "Clase de canal y privacidad";
App::$strings["Select a channel role with your privacy requirements."] = "Seleccione un tipo de canal con sus requisitos de privacidad";
App::$strings["Read more about roles"] = "Leer más sobre los roles";
-App::$strings["no"] = "no";
-App::$strings["yes"] = "sí";
-App::$strings["Registration"] = "Registro";
-App::$strings["Membership on this site is by invitation only."] = "Para registrarse en este sitio es necesaria una invitación.";
-App::$strings["Register"] = "Registrarse";
-App::$strings["This site may require email verification after submitting this form. If you are returned to a login page, please check your email for instructions."] = "Este sitio puede requerir una verificación de correo electrónico después de enviar este formulario. Si es devuelto a una página de inicio de sesión, compruebe su email para recibir y leer las instrucciones.";
-App::$strings["Fetching URL returns error: %1\$s"] = "Al intentar obtener la dirección, retorna el error: %1\$s";
-App::$strings["Authentication failed."] = "Falló la autenticación.";
-App::$strings["Remote Authentication"] = "Acceso desde su servidor";
-App::$strings["Enter your channel address (e.g. channel@example.com)"] = "Introduzca la dirección del canal (p.ej. canal@ejemplo.com)";
-App::$strings["Authenticate"] = "Acceder";
-App::$strings["Nothing to import."] = "No hay nada para importar.";
-App::$strings["Unable to download data from old server"] = "No se han podido descargar datos de su antiguo servidor";
-App::$strings["Imported file is empty."] = "El fichero importado está vacío.";
-App::$strings["Warning: Database versions differ by %1\$d updates."] = "Atención: Las versiones de la base de datos difieren en %1\$d actualizaciones.";
-App::$strings["Your service plan only allows %d channels."] = "Su paquete de servicios solo permite %d canales.";
-App::$strings["No channel. Import failed."] = "No hay canal. La importación ha fallado";
-App::$strings["Import completed."] = "Importación completada.";
-App::$strings["You must be logged in to use this feature."] = "Debe estar registrado para poder usar esta funcionalidad.";
-App::$strings["Import Channel"] = "Importar canal";
-App::$strings["Use this form to import an existing channel from a different server/hub. You may retrieve the channel identity from the old server/hub via the network or provide an export file."] = "Emplee este formulario para importar un canal desde un servidor/hub diferente. Puede recuperar el canal desde el antiguo servidor/hub a través de la red o proporcionando un fichero de exportación.";
-App::$strings["File to Upload"] = "Fichero para subir";
-App::$strings["Or provide the old server/hub details"] = "O proporcione los detalles de su antiguo servidor/hub";
-App::$strings["Your old identity address (xyz@example.com)"] = "Su identidad en el antiguo servidor (canal@ejemplo.com)";
-App::$strings["Your old login email address"] = "Su antigua dirección de correo electrónico";
-App::$strings["Your old login password"] = "Su antigua contraseña";
-App::$strings["For either option, please choose whether to make this hub your new primary address, or whether your old location should continue this role. You will be able to post from either location, but only one can be marked as the primary location for files, photos, and media."] = "Para cualquiera de las opciones, elija si hacer de este servidor su nueva dirección primaria, o si su antigua dirección debe continuar con este papel. Usted podrá publicar desde cualquier ubicación, pero sólo una puede estar marcada como la ubicación principal para los ficheros, fotos y otras imágenes o vídeos.";
-App::$strings["Make this hub my primary location"] = "Convertir este servidor en mi ubicación primaria";
-App::$strings["Move this channel (disable all previous locations)"] = "Mover este canal (desactivar todas las ubicaciones anteriores)";
-App::$strings["Import a few months of posts if possible (limited by available memory"] = "Importar unos meses de mensajes si es posible (limitado por la memoria disponible";
-App::$strings["This process may take several minutes to complete. Please submit the form only once and leave this page open until finished."] = "Este proceso puede tardar varios minutos en completarse. Por favor envíe el formulario una sola vez y mantenga esta página abierta hasta que termine.";
-App::$strings["Away"] = "Ausente";
-App::$strings["Online"] = "Conectado/a";
-App::$strings["Documentation Search"] = "Búsqueda de Documentación";
-App::$strings["About"] = "Mi perfil";
-App::$strings["Members"] = "Miembros";
-App::$strings["Administrators"] = "Administradores";
-App::$strings["Developers"] = "Desarrolladores";
-App::$strings["Tutorials"] = "Tutoriales";
-App::$strings["\$Projectname Documentation"] = "Documentación de \$Projectname";
-App::$strings["Contents"] = "Contenidos";
-App::$strings["Bookmark added"] = "Marcador añadido";
-App::$strings["My Bookmarks"] = "Mis marcadores";
-App::$strings["My Connections Bookmarks"] = "Marcadores de mis conexiones";
+App::$strings["Create Channel"] = "Crear un canal";
+App::$strings["A channel is your identity on this network. It can represent a person, a blog, or a forum to name a few. Channels can make connections with other channels to share information with highly detailed permissions."] = "Un canal es su identidad en esta red. Puede representar a una persona, un blog o un foro, por nombrar unos pocos ejemplos. Los canales se pueden conectar con otros canales para compartir información con una gama de permisos extremadamente detallada.";
+App::$strings["or <a href=\"import\">import an existing channel</a> from another location."] = "O <a href=\"import\">importar un canal existente</a> desde otro lugar.";
+App::$strings["Channel removals are not allowed within 48 hours of changing the account password."] = "La eliminación de canales no está permitida hasta pasadas 48 horas desde el último cambio de contraseña.";
+App::$strings["Remove This Channel"] = "Eliminar este canal";
+App::$strings["WARNING: "] = "ATENCIÓN:";
+App::$strings["This channel will be completely removed from the network. "] = "Este canal va a ser completamente eliminado de la red. ";
+App::$strings["This action is permanent and can not be undone!"] = "¡Esta acción tiene carácter definitivo y no se puede deshacer!";
+App::$strings["Please enter your password for verification:"] = "Por favor, introduzca su contraseña para su verificación:";
+App::$strings["Remove this channel and all its clones from the network"] = "Eliminar este canal y todos sus clones de la red";
+App::$strings["By default only the instance of the channel located on this hub will be removed from the network"] = "Por defecto, solo la instancia del canal alojado en este servidor será eliminado de la red";
+App::$strings["Remove Channel"] = "Eliminar el canal";
+App::$strings["Files: shared with me"] = "Ficheros: compartidos conmigo";
+App::$strings["Name"] = "Nombre";
+App::$strings["NEW"] = "NUEVO";
+App::$strings["Size"] = "Tamaño";
+App::$strings["Last Modified"] = "Última modificación";
+App::$strings["Remove all files"] = "Eliminar todos los ficheros";
+App::$strings["Remove this file"] = "Eliminar este fichero";
+App::$strings["\$Projectname Server - Setup"] = "Servidor \$Projectname - Instalación";
+App::$strings["Could not connect to database."] = "No se ha podido conectar a la base de datos.";
+App::$strings["Could not connect to specified site URL. Possible SSL certificate or DNS issue."] = "No se puede conectar con la dirección del sitio indicada. Podría tratarse de un problema de SSL o DNS.";
+App::$strings["Could not create table."] = "No se puede crear la tabla.";
+App::$strings["Your site database has been installed."] = "La base de datos del sitio ha sido instalada.";
+App::$strings["You may need to import the file \"install/schema_xxx.sql\" manually using a database client."] = "Podría tener que importar manualmente el fichero \"install/schema_xxx.sql\" usando un cliente de base de datos.";
+App::$strings["Please see the file \"install/INSTALL.txt\"."] = "Por favor, lea el fichero \"install/INSTALL.txt\".";
+App::$strings["System check"] = "Verificación del sistema";
+App::$strings["Check again"] = "Verificar de nuevo";
+App::$strings["Database connection"] = "Conexión a la base de datos";
+App::$strings["In order to install \$Projectname we need to know how to connect to your database."] = "Para instalar \$Projectname es necesario saber cómo conectar con su base de datos.";
+App::$strings["Please contact your hosting provider or site administrator if you have questions about these settings."] = "Por favor, contacte con el proveedor de servicios o el administrador del sitio si tiene dudas sobre estos ajustes.";
+App::$strings["The database you specify below should already exist. If it does not, please create it before continuing."] = "La base de datos que especifique a continuación debe existir ya. Si no es así, por favor, créela antes de seguir.";
+App::$strings["Database Server Name"] = "Nombre del servidor de base de datos";
+App::$strings["Default is 127.0.0.1"] = "De forma predeterminada es 127.0.0.1";
+App::$strings["Database Port"] = "Puerto de la base de datos";
+App::$strings["Communication port number - use 0 for default"] = "Número del puerto de comunicaciones - use 0 como valor por defecto";
+App::$strings["Database Login Name"] = "Usuario de la base de datos";
+App::$strings["Database Login Password"] = "Contraseña de acceso a la base de datos";
+App::$strings["Database Name"] = "Nombre de la base de datos";
+App::$strings["Database Type"] = "Tipo de base de datos";
+App::$strings["Site administrator email address"] = "Dirección de correo electrónico del administrador del sitio";
+App::$strings["Your account email address must match this in order to use the web admin panel."] = "Su cuenta deberá usar la misma dirección de correo electrónico para poder utilizar el panel de administración web.";
+App::$strings["Website URL"] = "Dirección del sitio web";
+App::$strings["Please use SSL (https) URL if available."] = "Por favor, use SSL (https) si está disponible.";
+App::$strings["Please select a default timezone for your website"] = "Por favor, selecciones el huso horario por defecto de su sitio web";
+App::$strings["Basic/Minimal Social Networking"] = "Red social básica o mínima";
+App::$strings["Standard Configuration (default)"] = "Configuración estándar (por defecto)";
+App::$strings["Professional"] = "Profesional";
+App::$strings["Site settings"] = "Ajustes del sitio";
+App::$strings["Server Configuration/Role"] = "Configuración del servidor";
+App::$strings["PHP version 5.5 or greater is required."] = "Se requiere la versión 5.5, o superior, de PHP.";
+App::$strings["PHP version"] = "Versión de PHP";
+App::$strings["Could not find a command line version of PHP in the web server PATH."] = "No se puede encontrar una versión en línea de comandos de PHP en la ruta del servidor web.";
+App::$strings["If you don't have a command line version of PHP installed on server, you will not be able to run background polling via cron."] = "Si no tiene instalada la versión de línea de comandos de PHP en su servidor, no podrá realizar envíos en segundo plano mediante cron.";
+App::$strings["PHP executable path"] = "Ruta del ejecutable PHP";
+App::$strings["Enter full path to php executable. You can leave this blank to continue the installation."] = "Introducir la ruta completa del ejecutable PHP. Puede dejar la línea en blanco para continuar la instalación.";
+App::$strings["Command line PHP"] = "PHP en línea de comandos";
+App::$strings["Unable to check command line PHP, as shell_exec() is disabled. This is required."] = "No se puede comprobar la línea de comandos PHP, ya que shell_exec() está deshabilitado. Es necesario que esté activado.";
+App::$strings["The command line version of PHP on your system does not have \"register_argc_argv\" enabled."] = "La línea de comandos PHP de su sistema no tiene activado \"register_argc_argv\".";
+App::$strings["This is required for message delivery to work."] = "Esto es necesario para que funcione la transmisión de mensajes.";
+App::$strings["PHP register_argc_argv"] = "PHP register_argc_argv";
+App::$strings["Your max allowed total upload size is set to %s. Maximum size of one file to upload is set to %s. You are allowed to upload up to %d files at once."] = "La carga máxima que se le permite subir está establecida en %s. El tamaño máximo de un fichero está establecido en %s. Está permitido subir hasta un máximo de %d ficheros de una sola vez.";
+App::$strings["You can adjust these settings in the server php.ini file."] = "Puede ajustar estos valores en el fichero php.ini de su servidor.";
+App::$strings["PHP upload limits"] = "Límites PHP de subida";
+App::$strings["Error: the \"openssl_pkey_new\" function on this system is not able to generate encryption keys"] = "Error: La función \"openssl_pkey_new\" en este sistema no es capaz de general claves de cifrado.";
+App::$strings["If running under Windows, please see \"http://www.php.net/manual/en/openssl.installation.php\"."] = "Si está en un servidor Windows, por favor, lea \"http://www.php.net/manual/en/openssl.installation.php\".";
+App::$strings["Generate encryption keys"] = "Generar claves de cifrado";
+App::$strings["libCurl PHP module"] = "módulo libCurl PHP";
+App::$strings["GD graphics PHP module"] = "módulo PHP GD graphics";
+App::$strings["OpenSSL PHP module"] = "módulo PHP OpenSSL";
+App::$strings["PDO database PHP module"] = "Módulo PHP de la base de datos PDO ";
+App::$strings["mb_string PHP module"] = "módulo PHP mb_string";
+App::$strings["xml PHP module"] = "módulo PHP xml";
+App::$strings["Apache mod_rewrite module"] = "módulo Apache mod_rewrite ";
+App::$strings["Error: Apache webserver mod-rewrite module is required but not installed."] = "Error: se necesita el módulo del servidor web Apache mod-rewrite pero no está instalado.";
+App::$strings["exec"] = "ejecutable";
+App::$strings["Error: exec is required but is either not installed or has been disabled in php.ini"] = "Error: se necesita un ejecutable pero o no se instaló o está deshabilitado en php.ini";
+App::$strings["shell_exec"] = "shell_exec";
+App::$strings["Error: shell_exec is required but is either not installed or has been disabled in php.ini"] = "Error: se necesita shell_exec pero o no se instaló o está deshabilitado en php.ini";
+App::$strings["Error: libCURL PHP module required but not installed."] = "Error: se necesita el módulo PHP libCURL pero no está instalado.";
+App::$strings["Error: GD graphics PHP module with JPEG support required but not installed."] = "Error: el módulo PHP GD graphics es necesario, pero no está instalado.";
+App::$strings["Error: openssl PHP module required but not installed."] = "Error: el módulo PHP openssl es necesario, pero no está instalado.";
+App::$strings["Error: PDO database PHP module required but not installed."] = "Error: se necesita el módulo PHP de la base de datos PDO, pero no está instalado.";
+App::$strings["Error: mb_string PHP module required but not installed."] = "Error: el módulo PHP mb_string es necesario, pero no está instalado.";
+App::$strings["Error: xml PHP module required for DAV but not installed."] = "Error: el módulo PHP xml es necesario para DAV, pero no está instalado.";
+App::$strings["The web installer needs to be able to create a file called \".htconfig.php\" in the top folder of your web server and it is unable to do so."] = "El instalador web no ha podido crear un fichero llamado “.htconfig.php†en la carpeta base de su servidor.";
+App::$strings["This is most often a permission setting, as the web server may not be able to write files in your folder - even if you can."] = "Esto está generalmente ligado a un problema de permisos, a causa del cual el servidor web tiene prohibido modificar ficheros en su carpeta - incluso si usted mismo tiene esos permisos.";
+App::$strings["At the end of this procedure, we will give you a text to save in a file named .htconfig.php in your Red top folder."] = "Al término de este procedimiento, podemos crear un fichero de texto para guardar con el nombre .htconfig.php en el directorio raíz de su instalación de Hubzilla.";
+App::$strings["You can alternatively skip this procedure and perform a manual installation. Please see the file \"install/INSTALL.txt\" for instructions."] = "Como alternativa, puede dejar este procedimiento e intentar realizar una instalación manual. Lea, por favor, el fichero\"install/INSTALL.txt\" para las instrucciones.";
+App::$strings[".htconfig.php is writable"] = ".htconfig.php tiene permisos de escritura";
+App::$strings["This software uses the Smarty3 template engine to render its web views. Smarty3 compiles templates to PHP to speed up rendering."] = "Este software hace uso del motor de plantillas Smarty3 para diseñar sus plantillas gráficas. Smarty3 compila las plantillas a PHP para acelerar la renderización.";
+App::$strings["In order to store these compiled templates, the web server needs to have write access to the directory %s under the top level web folder."] = "Para poder guardar las plantillas compiladas, el servidor web necesita permisos para acceder al directorio %s en la carpeta web principal.";
+App::$strings["Please ensure that the user that your web server runs as (e.g. www-data) has write access to this folder."] = "Por favor, asegúrese de que el servidor web está siendo ejecutado por un usuario que tenga permisos de escritura sobre esta carpeta (por ejemplo, www-data).";
+App::$strings["Note: as a security measure, you should give the web server write access to %s only--not the template files (.tpl) that it contains."] = "Nota: como medida de seguridad, debe dar al servidor web permisos de escritura solo sobre %s - no sobre el fichero de plantilla (.tpl) que contiene.";
+App::$strings["%s is writable"] = "%s tiene permisos de escritura";
+App::$strings["This software uses the store directory to save uploaded files. The web server needs to have write access to the store directory under the top level web folder"] = "Este software utiliza el directorio de almacenamiento para guardar los ficheros subidos. El servidor web debe tener acceso de escritura a este directorio en la carpeta de nivel superior";
+App::$strings["store is writable"] = "\"store\" tiene permisos de escritura";
+App::$strings["SSL certificate cannot be validated. Fix certificate or disable https access to this site."] = "El certificado SSL no ha podido ser validado. Corrija este problema o desactive el acceso https a este sitio.";
+App::$strings["If you have https access to your website or allow connections to TCP port 443 (the https: port), you MUST use a browser-valid certificate. You MUST NOT use self-signed certificates!"] = "Si su servidor soporta conexiones cifradas SSL o si permite conexiones al puerto TCP 443 (el puerto usado por el protocolo https), debe utilizar un certificado válido. No debe usar un certificado firmado por usted mismo.";
+App::$strings["This restriction is incorporated because public posts from you may for example contain references to images on your own hub."] = "Se ha incorporado esta restricción para evitar que sus entradas públicas hagan referencia a imágenes en su propio servidor.";
+App::$strings["If your certificate is not recognized, members of other sites (who may themselves have valid certificates) will get a warning message on their own site complaining about security issues."] = "Si su certificado no ha sido reconocido, los miembros de otros sitios (con certificados válidos) recibirán mensajes de aviso en sus propios sitios web.";
+App::$strings["This can cause usability issues elsewhere (not just on your own site) so we must insist on this requirement."] = "Por razones de compatibilidad (sobre el conjunto de la red, no solo sobre su propio sitio), debemos insistir en estos requisitos.";
+App::$strings["Providers are available that issue free certificates which are browser-valid."] = "Existen varias Autoridades de Certificación que le pueden proporcionar certificados válidos.";
+App::$strings["If you are confident that the certificate is valid and signed by a trusted authority, check to see if you have failed to install an intermediate cert. These are not normally required by browsers, but are required for server-to-server communications."] = "Si se tiene la certeza de que el certificado es válido y está firmado por una autoridad de confianza, comprobar para ver si hubo un error al instalar un certificado intermedio. Estos no son normalmente requeridos por los navegadores, pero son necesarios para las comunicaciones de servidor a servidor.";
+App::$strings["SSL certificate validation"] = "validación del certificado SSL";
+App::$strings["Url rewrite in .htaccess is not working. Check your server configuration.Test: "] = "No se pueden reescribir las direcciones web en .htaccess. Compruebe la configuración de su servidor:";
+App::$strings["Url rewrite is working"] = "La reescritura de las direcciones funciona correctamente";
+App::$strings["The database configuration file \".htconfig.php\" could not be written. Please use the enclosed text to create a configuration file in your web server root."] = "El fichero de configuración de la base de datos .htconfig.php no se ha podido modificar. Por favor, copie el texto generado en un fichero con ese nombre en el directorio raíz de su servidor.";
+App::$strings["Errors encountered creating database tables."] = "Se han encontrado errores al crear las tablas de la base de datos.";
+App::$strings["<h1>What next</h1>"] = "<h1>Siguiente paso</h1>";
+App::$strings["IMPORTANT: You will need to [manually] setup a scheduled task for the poller."] = "IMPORTANTE: Debe crear [manualmente] una tarea programada para el \"poller\".";
App::$strings["Continue"] = "Continuar";
App::$strings["Premium Channel Setup"] = "Configuración del canal premium";
App::$strings["Enable premium channel connection restrictions"] = "Habilitar restricciones de conexión del canal premium";
@@ -165,156 +345,57 @@ App::$strings["Potential connections will then see the following text before pro
App::$strings["By continuing, I certify that I have complied with any instructions provided on this page."] = "Al continuar, certifico que he cumplido con todas las instrucciones proporcionadas en esta página.";
App::$strings["(No specific instructions have been provided by the channel owner.)"] = "(No ha sido proporcionada ninguna instrucción específica por el propietario del canal.)";
App::$strings["Restricted or Premium Channel"] = "Canal premium o restringido";
-App::$strings["Item not found."] = "Elemento no encontrado.";
-App::$strings["# Accounts"] = "# Cuentas";
-App::$strings["# blocked accounts"] = "# cuentas bloqueadas";
-App::$strings["# expired accounts"] = "# cuentas caducadas";
-App::$strings["# expiring accounts"] = "# cuentas que caducan";
-App::$strings["# Channels"] = "# Canales";
-App::$strings["# primary"] = "# primario";
-App::$strings["# clones"] = "# clones";
-App::$strings["Message queues"] = "Mensajes en cola";
-App::$strings["Your software should be updated"] = "Debe actualizar su software";
-App::$strings["Administration"] = "Administración";
-App::$strings["Summary"] = "Sumario";
-App::$strings["Registered accounts"] = "Cuentas registradas";
-App::$strings["Pending registrations"] = "Registros pendientes";
-App::$strings["Registered channels"] = "Canales registrados";
-App::$strings["Active plugins"] = "Extensiones (plugins) activas";
-App::$strings["Version"] = "Versión";
-App::$strings["Repository version (master)"] = "Versión del repositorio (master)";
-App::$strings["Repository version (dev)"] = "Versión del repositorio (dev)";
-App::$strings["Item not found"] = "Elemento no encontrado";
-App::$strings["Block Name"] = "Nombre del bloque";
-App::$strings["Insert web link"] = "Insertar enlace web";
-App::$strings["Title (optional)"] = "Título (opcional)";
-App::$strings["Edit Block"] = "Modificar este bloque";
-App::$strings["Invalid item."] = "Elemento no válido.";
-App::$strings["Channel not found."] = "Canal no encontrado.";
-App::$strings["Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."] = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";
-App::$strings["Save to Folder:"] = "Guardar en carpeta:";
-App::$strings["- select -"] = "- seleccionar -";
-App::$strings["Save"] = "Guardar";
-App::$strings["sent you a private message"] = "le ha enviado un mensaje privado";
-App::$strings["added your channel"] = "añadió este canal a sus conexiones";
-App::$strings["g A l F d"] = "g A l d F";
-App::$strings["[today]"] = "[hoy]";
-App::$strings["posted an event"] = "publicó un evento";
-App::$strings["Blocked"] = "Bloqueadas";
-App::$strings["Ignored"] = "Ignoradas";
-App::$strings["Hidden"] = "Ocultas";
-App::$strings["Archived"] = "Archivadas";
-App::$strings["New"] = "Nuevas";
-App::$strings["All"] = "Todos/as";
-App::$strings["New Connections"] = "Nuevas conexiones";
-App::$strings["Show pending (new) connections"] = "Mostrar conexiones (nuevas) pendientes";
-App::$strings["All Connections"] = "Todas las conexiones";
-App::$strings["Show all connections"] = "Mostrar todas las conexiones";
-App::$strings["Only show blocked connections"] = "Mostrar solo las conexiones bloqueadas";
-App::$strings["Only show ignored connections"] = "Mostrar solo conexiones ignoradas";
-App::$strings["Only show archived connections"] = "Mostrar solo las conexiones archivadas";
-App::$strings["Only show hidden connections"] = "Mostrar solo las conexiones ocultas";
-App::$strings["Pending approval"] = "Pendiente de aprobación";
-App::$strings["%1\$s [%2\$s]"] = "%1\$s [%2\$s]";
-App::$strings["Edit connection"] = "Editar conexión";
-App::$strings["Delete connection"] = "Eliminar conexión";
-App::$strings["Channel address"] = "Dirección del canal";
-App::$strings["Network"] = "Red";
-App::$strings["Call"] = "Llamar";
-App::$strings["Status"] = "Estado";
-App::$strings["Connected"] = "Conectado/a";
-App::$strings["Approve connection"] = "Aprobar esta conexión";
-App::$strings["Approve"] = "Aprobar";
-App::$strings["Ignore connection"] = "Ignorar esta conexión";
-App::$strings["Ignore"] = "Ignorar";
-App::$strings["Recent activity"] = "Actividad reciente";
-App::$strings["Connections"] = "Conexiones";
-App::$strings["Search"] = "Buscar";
-App::$strings["Search your connections"] = "Buscar sus conexiones";
-App::$strings["Connections search"] = "Buscar conexiones";
-App::$strings["Find"] = "Encontrar";
-App::$strings["Image uploaded but image cropping failed."] = "Imagen actualizada, pero el recorte de la imagen ha fallado. ";
-App::$strings["Cover Photos"] = "Imágenes de portada del perfil";
-App::$strings["Image resize failed."] = "El ajuste del tamaño de la imagen ha fallado.";
-App::$strings["Unable to process image"] = "No ha sido posible procesar la imagen";
-App::$strings["Image upload failed."] = "La carga de la imagen ha fallado.";
-App::$strings["Unable to process image."] = "No ha sido posible procesar la imagen.";
-App::$strings["female"] = "mujer";
-App::$strings["%1\$s updated her %2\$s"] = "%1\$s ha actualizado su %2\$s";
-App::$strings["male"] = "hombre";
-App::$strings["%1\$s updated his %2\$s"] = "%1\$s ha actualizado su %2\$s";
-App::$strings["%1\$s updated their %2\$s"] = "%1\$s ha actualizado su %2\$s";
-App::$strings["cover photo"] = "Imagen de portada del perfil";
-App::$strings["Photo not available."] = "Foto no disponible.";
-App::$strings["Upload File:"] = "Subir fichero:";
-App::$strings["Select a profile:"] = "Seleccionar un perfil:";
-App::$strings["Upload Cover Photo"] = "Subir imagen de portada del perfil";
-App::$strings["or"] = "o";
-App::$strings["skip this step"] = "Omitir este paso";
-App::$strings["select a photo from your photo albums"] = "Seleccione una foto de sus álbumes de fotos";
-App::$strings["Crop Image"] = "Recortar imagen";
-App::$strings["Please adjust the image cropping for optimum viewing."] = "Por favor ajuste el recorte de la imagen para una visión óptima.";
-App::$strings["Done Editing"] = "Edición completada";
+App::$strings["Queue Statistics"] = "Estadísticas de la cola";
+App::$strings["Total Entries"] = "Total de entradas";
+App::$strings["Priority"] = "Prioridad";
+App::$strings["Destination URL"] = "Dirección de destino";
+App::$strings["Mark hub permanently offline"] = "Marcar el servidor como permanentemente fuera de línea";
+App::$strings["Empty queue for this hub"] = "Vaciar la cola para este servidor";
+App::$strings["Last known contact"] = "Último contacto conocido";
App::$strings["Off"] = "Desactivado";
App::$strings["On"] = "Activado";
App::$strings["Lock feature %s"] = "Bloquear la funcionalidad %s";
App::$strings["Manage Additional Features"] = "Gestionar las funcionalidades";
-App::$strings["Log settings updated."] = "Actualizado el informe de configuraciones.";
-App::$strings["Logs"] = "Informes";
-App::$strings["Clear"] = "Vaciar";
-App::$strings["Debugging"] = "Depuración";
-App::$strings["Log file"] = "Fichero de informe";
-App::$strings["Must be writable by web server. Relative to your top-level webserver directory."] = "Debe tener permisos de escritura por el servidor web. La ruta es relativa al directorio web principal.";
-App::$strings["Log level"] = "Nivel de depuración";
-App::$strings["New Profile Field"] = "Nuevo campo en el perfil";
-App::$strings["Field nickname"] = "Alias del campo";
-App::$strings["System name of field"] = "Nombre del campo en el sistema";
-App::$strings["Input type"] = "Tipo de entrada";
-App::$strings["Field Name"] = "Nombre del campo";
-App::$strings["Label on profile pages"] = "Etiqueta a mostrar en la página del perfil";
-App::$strings["Help text"] = "Texto de ayuda";
-App::$strings["Additional info (optional)"] = "Información adicional (opcional)";
-App::$strings["Field definition not found"] = "Definición del campo no encontrada";
-App::$strings["Edit Profile Field"] = "Modificar el campo del perfil";
-App::$strings["Profile Fields"] = "Campos del perfil";
-App::$strings["Basic Profile Fields"] = "Campos básicos del perfil";
-App::$strings["Advanced Profile Fields"] = "Campos avanzados del perfil";
-App::$strings["(In addition to basic fields)"] = "(Además de los campos básicos)";
-App::$strings["All available fields"] = "Todos los campos disponibles";
-App::$strings["Custom Fields"] = "Campos personalizados";
-App::$strings["Create Custom Field"] = "Crear un campo personalizado";
-App::$strings["By default, unfiltered HTML is allowed in embedded media. This is inherently insecure."] = "De forma predeterminada, el HTML sin filtrar está permitido en el contenido multimedia incorporado en una publicación. Esto es siempre inseguro.";
-App::$strings["The recommended setting is to only allow unfiltered HTML from the following sites:"] = "La configuración recomendada es que sólo se permita HTML sin filtrar desde los siguientes sitios: ";
-App::$strings["https://youtube.com/<br />https://www.youtube.com/<br />https://youtu.be/<br />https://vimeo.com/<br />https://soundcloud.com/<br />"] = "https://youtube.com/<br />https://www.youtube.com/<br />https://youtu.be/<br />https://vimeo.com/<br />https://soundcloud.com/<br />";
-App::$strings["All other embedded content will be filtered, <strong>unless</strong> embedded content from that site is explicitly blocked."] = "El resto del contenido incrustado se filtrará, <strong>excepto</ strong> si el contenido incorporado desde ese sitio está bloqueado de forma explícita.";
-App::$strings["Security"] = "Seguridad";
-App::$strings["Block public"] = "Bloquear páginas públicas";
-App::$strings["Check to block public access to all otherwise public personal pages on this site unless you are currently authenticated."] = "Habilitar para impedir ver las páginas personales de este sitio a quien no esté actualmente autenticado.";
-App::$strings["Set \"Transport Security\" HTTP header"] = "Habilitar \"Seguridad de transporte\" (\"Transport Security\") en la cabecera HTTP";
-App::$strings["Set \"Content Security Policy\" HTTP header"] = "Habilitar la \"Política de seguridad del contenido\" (\"Content Security Policy\") en la cabecera HTTP";
-App::$strings["Allowed email domains"] = "Se aceptan dominios de correo electrónico";
-App::$strings["Comma separated list of domains which are allowed in email addresses for registrations to this site. Wildcards are accepted. Empty to allow any domains"] = "Lista separada por comas de los dominios de los que se acepta una dirección de correo electrónico para registros en este sitio. Se permiten comodines. Dejar en claro para aceptar cualquier dominio. ";
-App::$strings["Not allowed email domains"] = "No se permiten dominios de correo electrónico";
-App::$strings["Comma separated list of domains which are not allowed in email addresses for registrations to this site. Wildcards are accepted. Empty to allow any domains, unless allowed domains have been defined."] = "Lista separada por comas de los dominios de los que no se acepta una dirección de correo electrónico para registros en este sitio. Se permiten comodines. Dejar en claro para no aceptar cualquier dominio, excepto los que se hayan autorizado.";
-App::$strings["Allow communications only from these sites"] = "Permitir la comunicación solo desde estos sitios";
-App::$strings["One site per line. Leave empty to allow communication from anywhere by default"] = "Un sitio por línea. Dejar en blanco para permitir por defecto la comunicación desde cualquiera";
-App::$strings["Block communications from these sites"] = "Bloquear la comunicación desde estos sitios";
-App::$strings["Allow communications only from these channels"] = "Permitir la comunicación solo desde estos canales";
-App::$strings["One channel (hash) per line. Leave empty to allow from any channel by default"] = "Un canal (hash) por línea. Dejar en blanco para permitir por defecto la comunicación desde cualquiera";
-App::$strings["Block communications from these channels"] = "Bloquear la comunicación desde estos canales";
-App::$strings["Only allow embeds from secure (SSL) websites and links."] = "Sólo se permite contenido multimedia incorporado desde sitios y enlaces seguros (SSL).";
-App::$strings["Allow unfiltered embedded HTML content only from these domains"] = "Permitir contenido HTML sin filtrar sólo desde estos dominios ";
-App::$strings["One site per line. By default embedded content is filtered."] = "Un sitio por línea. El contenido incorporado se filtra de forma predeterminada.";
-App::$strings["Block embedded HTML from these domains"] = "Bloquear contenido con HTML incorporado desde estos dominios";
-App::$strings["Password changed for account %d."] = "Ha cambiado la contraseña para la cuenta %d.";
-App::$strings["Account settings updated."] = "Se han actualizado los ajustes de la cuenta.";
-App::$strings["Account not found."] = "No se ha encontrado la cuenta.";
-App::$strings["Account Edit"] = "Editar la cuenta";
-App::$strings["New Password"] = "Nueva contraseña";
-App::$strings["New Password again"] = "Nueva contraseña otra vez";
-App::$strings["Technical skill level"] = "Nivel de habilidad técnica";
-App::$strings["Account language (for emails)"] = "Idioma de la cuenta (para los correos electrónicos)";
-App::$strings["Service class"] = "Clase de servicio";
+App::$strings["Update has been marked successful"] = "La actualización ha sido marcada como exitosa";
+App::$strings["Executing %s failed. Check system logs."] = "La ejecución de %s ha fallado. Mirar en los informes del sistema.";
+App::$strings["Update %s was successfully applied."] = "La actualización de %s se ha realizado exitosamente.";
+App::$strings["Update %s did not return a status. Unknown if it succeeded."] = "La actualización de %s no ha devuelto ningún estado. No se sabe si ha tenido éxito.";
+App::$strings["Update function %s could not be found."] = "No se encuentra la función de actualización de %s.";
+App::$strings["No failed updates."] = "No ha fallado ninguna actualización.";
+App::$strings["Failed Updates"] = "Han fallado las actualizaciones";
+App::$strings["Mark success (if update was manually applied)"] = "Marcar como exitosa (si la actualización se ha hecho manualmente)";
+App::$strings["Attempt to execute this update step automatically"] = "Intentar ejecutar este paso de actualización automáticamente";
+App::$strings["Item not found."] = "Elemento no encontrado.";
+App::$strings["Plugin %s disabled."] = "Extensión %s desactivada.";
+App::$strings["Plugin %s enabled."] = "Extensión %s activada.";
+App::$strings["Disable"] = "Desactivar";
+App::$strings["Enable"] = "Activar";
+App::$strings["Administration"] = "Administración";
+App::$strings["Plugins"] = "Extensiones (plugins)";
+App::$strings["Toggle"] = "Cambiar";
+App::$strings["Settings"] = "Ajustes";
+App::$strings["Author: "] = "Autor:";
+App::$strings["Maintainer: "] = "Mantenedor:";
+App::$strings["Minimum project version: "] = "Versión mínima del proyecto:";
+App::$strings["Maximum project version: "] = "Versión máxima del proyecto:";
+App::$strings["Minimum PHP version: "] = "Versión mínima de PHP:";
+App::$strings["Compatible Server Roles: "] = "Configuraciones compatibles con este servidor:";
+App::$strings["Requires: "] = "Se requiere:";
+App::$strings["Disabled - version incompatibility"] = "Deshabilitado - versiones incompatibles";
+App::$strings["Enter the public git repository URL of the plugin repo."] = "Escriba la URL pública del repositorio git del plugin.";
+App::$strings["Plugin repo git URL"] = "URL del repositorio git del plugin";
+App::$strings["Custom repo name"] = "Nombre personalizado del repositorio";
+App::$strings["(optional)"] = "(opcional)";
+App::$strings["Download Plugin Repo"] = "Descargar el repositorio";
+App::$strings["Install new repo"] = "Instalar un nuevo repositorio";
+App::$strings["Install"] = "Instalar";
+App::$strings["Cancel"] = "Cancelar";
+App::$strings["Manage Repos"] = "Gestionar los repositorios";
+App::$strings["Installed Plugin Repositories"] = "Repositorios de los plugins instalados";
+App::$strings["Install a New Plugin Repository"] = "Instalar un nuevo repositorio de plugins";
+App::$strings["Update"] = "Actualizar";
+App::$strings["Switch branch"] = "Cambiar la rama";
+App::$strings["Remove"] = "Eliminar";
App::$strings["%s account blocked/unblocked"] = array(
0 => "%s cuenta bloqueada/desbloqueada",
1 => "%s cuenta bloqueada/desbloqueada",
@@ -333,6 +414,7 @@ App::$strings["Registrations waiting for confirm"] = "Inscripciones en espera de
App::$strings["Request date"] = "Fecha de solicitud";
App::$strings["Email"] = "Correo electrónico";
App::$strings["No registrations."] = "Sin registros.";
+App::$strings["Approve"] = "Aprobar";
App::$strings["Deny"] = "Rechazar";
App::$strings["Block"] = "Bloquear";
App::$strings["Unblock"] = "Desbloquear";
@@ -344,6 +426,13 @@ App::$strings["Expires"] = "Caduca";
App::$strings["Service Class"] = "Clase de servicio";
App::$strings["Selected accounts will be deleted!\\n\\nEverything these accounts had posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "¡Las cuentas seleccionadas van a ser eliminadas!\\n\\n¡Todo lo que estas cuentas han publicado en este sitio será borrado de forma permanente!\\n\\n¿Está seguro de querer hacerlo?";
App::$strings["The account {0} will be deleted!\\n\\nEverything this account has posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "¡La cuenta {0} va a ser eliminada!\\n\\n¡Todo lo que esta cuenta ha publicado en este sitio será borrado de forma permanente!\\n\\n¿Está seguro de querer hacerlo?";
+App::$strings["Log settings updated."] = "Actualizado el informe de configuraciones.";
+App::$strings["Logs"] = "Informes";
+App::$strings["Clear"] = "Vaciar";
+App::$strings["Debugging"] = "Depuración";
+App::$strings["Log file"] = "Fichero de informe";
+App::$strings["Must be writable by web server. Relative to your top-level webserver directory."] = "Debe tener permisos de escritura por el servidor web. La ruta es relativa al directorio web principal.";
+App::$strings["Log level"] = "Nivel de depuración";
App::$strings["%s channel censored/uncensored"] = array(
0 => "%s canales censurados/no censurados",
1 => "%s canales censurados/no censurados",
@@ -369,25 +458,14 @@ App::$strings["Allow Code"] = "Permitir código";
App::$strings["Disallow Code"] = "No permitir código";
App::$strings["Channel"] = "Canal";
App::$strings["UID"] = "UID";
-App::$strings["Address"] = "Dirección";
App::$strings["Selected channels will be deleted!\\n\\nEverything that was posted in these channels on this site will be permanently deleted!\\n\\nAre you sure?"] = "Los canales seleccionados se eliminarán!\\n\\nTodo lo publicado por estos canales en este sitio se borrarán definitivamente!\\n\\n¿Está seguro de querer hacerlo?";
App::$strings["The channel {0} will be deleted!\\n\\nEverything that was posted in this channel on this site will be permanently deleted!\\n\\nAre you sure?"] = "El canal {0} va a ser eliminado!\\n\\nTodo lo publicado por el canal en este sitio se borrará definitivamente!\\n\\n¿Está seguro de querer hacerlo?";
-App::$strings["Update has been marked successful"] = "La actualización ha sido marcada como exitosa";
-App::$strings["Executing %s failed. Check system logs."] = "La ejecución de %s ha fallado. Mirar en los informes del sistema.";
-App::$strings["Update %s was successfully applied."] = "La actualización de %s se ha realizado exitosamente.";
-App::$strings["Update %s did not return a status. Unknown if it succeeded."] = "La actualización de %s no ha devuelto ningún estado. No se sabe si ha tenido éxito.";
-App::$strings["Update function %s could not be found."] = "No se encuentra la función de actualización de %s.";
-App::$strings["No failed updates."] = "No ha fallado ninguna actualización.";
-App::$strings["Failed Updates"] = "Han fallado las actualizaciones";
-App::$strings["Mark success (if update was manually applied)"] = "Marcar como exitosa (si la actualización se ha hecho manualmente)";
-App::$strings["Attempt to execute this update step automatically"] = "Intentar ejecutar este paso de actualización automáticamente";
-App::$strings["Queue Statistics"] = "Estadísticas de la cola";
-App::$strings["Total Entries"] = "Total de entradas";
-App::$strings["Priority"] = "Prioridad";
-App::$strings["Destination URL"] = "Dirección de destino";
-App::$strings["Mark hub permanently offline"] = "Marcar el servidor como permanentemente fuera de línea";
-App::$strings["Empty queue for this hub"] = "Vaciar la cola para este servidor";
-App::$strings["Last known contact"] = "Último contacto conocido";
+App::$strings["Theme settings updated."] = "Ajustes del tema actualizados.";
+App::$strings["No themes found."] = "No se han encontrado temas.";
+App::$strings["Screenshot"] = "Instantánea de pantalla";
+App::$strings["Themes"] = "Temas";
+App::$strings["[Experimental]"] = "[Experimental]";
+App::$strings["[Unsupported]"] = "[No soportado]";
App::$strings["Site settings updated."] = "Ajustes del sitio actualizados.";
App::$strings["Default"] = "Predeterminado";
App::$strings["%s - (Incompatible)"] = "%s - (Incompatible)";
@@ -401,9 +479,6 @@ App::$strings["My site is not a public server"] = "Mi sitio no es un servidor pÃ
App::$strings["My site has paid access only"] = "Mi sitio es un servicio de pago";
App::$strings["My site has free access only"] = "Mi sitio es un servicio gratuito";
App::$strings["My site offers free accounts with optional paid upgrades"] = "Mi sitio ofrece cuentas gratuitas con opciones extra de pago";
-App::$strings["Basic/Minimal Social Networking"] = "Red social básica o mínima";
-App::$strings["Standard Configuration (default)"] = "Configuración estándar (por defecto)";
-App::$strings["Professional"] = "Profesional";
App::$strings["Beginner/Basic"] = "Principiante / Básico";
App::$strings["Novice - not skilled but willing to learn"] = "Novato: no cualificado, pero dispuesto a aprender";
App::$strings["Intermediate - somewhat comfortable"] = "Intermedio: bastante cómodo";
@@ -411,11 +486,11 @@ App::$strings["Advanced - very comfortable"] = "Avanzado: muy cómodo";
App::$strings["Expert - I can write computer code"] = "Experto: puedo escribir código informático";
App::$strings["Wizard - I probably know more than you do"] = "Asistente: probablemente sé más que tú";
App::$strings["Site"] = "Sitio";
+App::$strings["Registration"] = "Registro";
App::$strings["File upload"] = "Subir fichero";
App::$strings["Policies"] = "Políticas";
App::$strings["Advanced"] = "Avanzado";
App::$strings["Site name"] = "Nombre del sitio";
-App::$strings["Server Configuration/Role"] = "Configuración del servidor";
App::$strings["Site default technical skill level"] = "Nivel de habilidad técnica predeterminado del sitio";
App::$strings["Used to provide a member experience matched to technical comfort level"] = "Se utiliza para proporcionar una experiencia a los miembros adaptada a su nivel de comodidad técnica";
App::$strings["Lock the technical skill level setting"] = "Bloquear el ajuste del nivel de habilidad técnica";
@@ -458,6 +533,9 @@ App::$strings["Login on Homepage"] = "Iniciar sesión en la página personal";
App::$strings["Present a login box to visitors on the home page if no other content has been configured."] = "Presentar a los visitantes una casilla de identificación en la página de inicio, si no se ha configurado otro tipo de contenido.";
App::$strings["Enable context help"] = "Habilitar la ayuda contextual";
App::$strings["Display contextual help for the current page when the help button is pressed."] = "Ver la ayuda contextual para la página actual cuando se pulse el botón de Ayuda.";
+App::$strings["Reply-to email address for system generated email."] = "Dirección de respuesta para el correo electrónico generado por el sistema.";
+App::$strings["Sender (From) email address for system generated email."] = "Dirección del remitente (From) para el correo electrónico generado por el sistema.";
+App::$strings["Name of email sender for system generated email."] = "Nombre del remitente del correo electrónico generado por el sistema.";
App::$strings["Directory Server URL"] = "URL del servidor de directorio";
App::$strings["Default directory server"] = "Servidor de directorio predeterminado";
App::$strings["Proxy user"] = "Usuario del proxy";
@@ -474,785 +552,68 @@ App::$strings["Maximum Load Average"] = "Carga media máxima";
App::$strings["Maximum system load before delivery and poll processes are deferred - default 50."] = "Carga máxima del sistema antes de que los procesos de entrega y envío se hayan retardado - por defecto, 50.";
App::$strings["Expiration period in days for imported (grid/network) content"] = "Caducidad del contenido importado de otros sitios (en días)";
App::$strings["0 for no expiration of imported content"] = "0 para que no caduque el contenido importado";
-App::$strings["Plugin %s disabled."] = "Extensión %s desactivada.";
-App::$strings["Plugin %s enabled."] = "Extensión %s activada.";
-App::$strings["Disable"] = "Desactivar";
-App::$strings["Enable"] = "Activar";
-App::$strings["Plugins"] = "Extensiones (plugins)";
-App::$strings["Toggle"] = "Cambiar";
-App::$strings["Settings"] = "Ajustes";
-App::$strings["Author: "] = "Autor:";
-App::$strings["Maintainer: "] = "Mantenedor:";
-App::$strings["Minimum project version: "] = "Versión mínima del proyecto:";
-App::$strings["Maximum project version: "] = "Versión máxima del proyecto:";
-App::$strings["Minimum PHP version: "] = "Versión mínima de PHP:";
-App::$strings["Compatible Server Roles: "] = "Configuraciones compatibles con este servidor:";
-App::$strings["Requires: "] = "Se requiere:";
-App::$strings["Disabled - version incompatibility"] = "Deshabilitado - versiones incompatibles";
-App::$strings["Enter the public git repository URL of the plugin repo."] = "Escriba la URL pública del repositorio git del plugin.";
-App::$strings["Plugin repo git URL"] = "URL del repositorio git del plugin";
-App::$strings["Custom repo name"] = "Nombre personalizado del repositorio";
-App::$strings["(optional)"] = "(opcional)";
-App::$strings["Download Plugin Repo"] = "Descargar el repositorio";
-App::$strings["Install new repo"] = "Instalar un nuevo repositorio";
-App::$strings["Install"] = "Instalar";
-App::$strings["Cancel"] = "Cancelar";
-App::$strings["Manage Repos"] = "Gestionar los repositorios";
-App::$strings["Installed Plugin Repositories"] = "Repositorios de los plugins instalados";
-App::$strings["Install a New Plugin Repository"] = "Instalar un nuevo repositorio de plugins";
-App::$strings["Update"] = "Actualizar";
-App::$strings["Switch branch"] = "Cambiar la rama";
-App::$strings["Remove"] = "Eliminar";
-App::$strings["Theme settings updated."] = "Ajustes del tema actualizados.";
-App::$strings["No themes found."] = "No se han encontrado temas.";
-App::$strings["Screenshot"] = "Instantánea de pantalla";
-App::$strings["Themes"] = "Temas";
-App::$strings["[Experimental]"] = "[Experimental]";
-App::$strings["[Unsupported]"] = "[No soportado]";
-App::$strings["Export Channel"] = "Exportar el canal";
-App::$strings["Export your basic channel information to a file. This acts as a backup of your connections, permissions, profile and basic data, which can be used to import your data to a new server hub, but does not contain your content."] = "Exportar la información básica del canal a un fichero. Este equivale a una copia de seguridad de sus conexiones, el perfil y datos fundamentales, que puede usarse para importar sus datos a un nuevo servidor, pero no incluye su contenido.";
-App::$strings["Export Content"] = "Exportar contenidos";
-App::$strings["Export your channel information and recent content to a JSON backup that can be restored or imported to another server hub. This backs up all of your connections, permissions, profile data and several months of posts. This file may be VERY large. Please be patient - it may take several minutes for this download to begin."] = "Exportar la información sobre su canal y el contenido reciente a un fichero de respaldo JSON, que puede ser restaurado o importado a otro servidor. Este fichero incluye todas sus conexiones, permisos, datos del perfil y publicaciones de varios meses. Puede llegar a ser MUY grande. Por favor, sea paciente, la descarga puede tardar varios minutos en comenzar.";
-App::$strings["Export your posts from a given year."] = "Exporta sus publicaciones de un año dado.";
-App::$strings["You may also export your posts and conversations for a particular year or month. Adjust the date in your browser location bar to select other dates. If the export fails (possibly due to memory exhaustion on your server hub), please try again selecting a more limited date range."] = "También puede exportar sus mensajes y conversaciones durante un año o mes en particular. Ajuste la fecha en la barra de direcciones del navegador para seleccionar otras fechas. Si la exportación falla (posiblemente debido al agotamiento de la memoria del servidor hub), por favor, intente de nuevo la selección de un rango de fechas más pequeño.";
-App::$strings["To select all posts for a given year, such as this year, visit <a href=\"%1\$s\">%2\$s</a>"] = "Para seleccionar todos los mensajes de un año determinado, como este año, visite <a href=\"%1\$s\">%2\$s</a>";
-App::$strings["To select all posts for a given month, such as January of this year, visit <a href=\"%1\$s\">%2\$s</a>"] = "Para seleccionar todos los mensajes de un mes determinado, como el de enero de este año, visite <a href=\"%1\$s\">%2\$s</a>";
-App::$strings["These content files may be imported or restored by visiting <a href=\"%1\$s\">%2\$s</a> on any site containing your channel. For best results please import or restore these in date order (oldest first)."] = "Estos ficheros pueden ser importados o restaurados visitando <a href=\"%1\$s\">%2\$s</a> o cualquier sitio que contenga su canal. Para obtener los mejores resultados, por favor, importar o restaurar estos ficheros en orden de fecha (la más antigua primero).";
-App::$strings["Layout Name"] = "Nombre de la plantilla";
-App::$strings["Layout Description (Optional)"] = "Descripción de la plantilla (opcional)";
-App::$strings["Edit Layout"] = "Modificar la plantilla";
-App::$strings["Page link"] = "Enlace de la página";
-App::$strings["Edit Webpage"] = "Editar la página web";
-App::$strings["Apps"] = "Aplicaciones (apps)";
-App::$strings["Manage apps"] = "Gestionar las aplicaciones";
-App::$strings["Create new app"] = "Crear una nueva aplicación";
-App::$strings["This site is not a directory server"] = "Este sitio no es un servidor de directorio";
-App::$strings["This directory server requires an access token"] = "El servidor de este directorio necesita un \"token\" de acceso";
-App::$strings["No such group"] = "No se encuentra el grupo";
-App::$strings["No such channel"] = "No se encuentra el canal";
-App::$strings["forum"] = "foro";
-App::$strings["Search Results For:"] = "Buscar resultados para:";
-App::$strings["Privacy group is empty"] = "El grupo de canales está vacío";
-App::$strings["Privacy group: "] = "Grupo de canales: ";
-App::$strings["Invalid connection."] = "Conexión no válida.";
-App::$strings["Invalid channel."] = "El canal no es válido.";
-App::$strings["Unable to update menu."] = "No se puede actualizar el menú.";
-App::$strings["Unable to create menu."] = "No se puede crear el menú.";
-App::$strings["Menu Name"] = "Nombre del menú";
-App::$strings["Unique name (not visible on webpage) - required"] = "Nombre único (no será visible en la página web) - requerido";
-App::$strings["Menu Title"] = "Título del menú";
-App::$strings["Visible on webpage - leave empty for no title"] = "Visible en la página web - no ponga nada si no desea un título";
-App::$strings["Allow Bookmarks"] = "Permitir marcadores";
-App::$strings["Menu may be used to store saved bookmarks"] = "El menú se puede usar para guardar marcadores";
-App::$strings["Submit and proceed"] = "Enviar y proceder";
-App::$strings["Menus"] = "Menús";
-App::$strings["Drop"] = "Eliminar";
-App::$strings["Created"] = "Creado";
-App::$strings["Edited"] = "Editado";
-App::$strings["Bookmarks allowed"] = "Marcadores permitidos";
-App::$strings["Delete this menu"] = "Borrar este menú";
-App::$strings["Edit menu contents"] = "Editar los contenidos del menú";
-App::$strings["Edit this menu"] = "Modificar este menú";
-App::$strings["Menu could not be deleted."] = "El menú no puede ser eliminado.";
-App::$strings["Menu not found."] = "Menú no encontrado";
-App::$strings["Edit Menu"] = "Modificar el menú";
-App::$strings["Add or remove entries to this menu"] = "Añadir o quitar entradas en este menú";
-App::$strings["Menu name"] = "Nombre del menú";
-App::$strings["Must be unique, only seen by you"] = "Debe ser único, solo será visible para usted";
-App::$strings["Menu title"] = "Título del menú";
-App::$strings["Menu title as seen by others"] = "El título del menú tal como será visto por los demás";
-App::$strings["Allow bookmarks"] = "Permitir marcadores";
-App::$strings["Not found."] = "No encontrado.";
-App::$strings["Edit post"] = "Editar la entrada";
-App::$strings["Location not found."] = "Dirección no encontrada.";
-App::$strings["Location lookup failed."] = "Ha fallado la búsqueda de la dirección.";
-App::$strings["Please select another location to become primary before removing the primary location."] = "Por favor, seleccione una copia de su canal (un clon) para convertirlo en primario antes de eliminar su canal principal.";
-App::$strings["Syncing locations"] = "Sincronizando ubicaciones";
-App::$strings["No locations found."] = "No encontrada ninguna dirección.";
-App::$strings["Manage Channel Locations"] = "Gestionar las direcciones del canal";
-App::$strings["Location"] = "Ubicación";
-App::$strings["Primary"] = "Primario";
-App::$strings["Sync Now"] = "Sincronizar ahora";
-App::$strings["Please wait several minutes between consecutive operations."] = "Por favor, espere algunos minutos entre operaciones consecutivas.";
-App::$strings["When possible, drop a location by logging into that website/hub and removing your channel."] = "Cuando sea posible, elimine una ubicación iniciando sesión en el sitio web o \"hub\" y borrando su canal.";
-App::$strings["Use this form to drop the location if the hub is no longer operating."] = "Utilice este formulario para eliminar la dirección si el \"hub\" no está funcionando desde hace tiempo.";
-App::$strings["Public Hubs"] = "Servidores públicos";
-App::$strings["The listed hubs allow public registration for the \$Projectname network. All hubs in the network are interlinked so membership on any of them conveys membership in the network as a whole. Some hubs may require subscription or provide tiered service plans. The hub itself <strong>may</strong> provide additional details."] = "Los sitios listados permiten el registro público en la red \$Projectname. Todos los sitios de la red están vinculados entre sí, por lo que sus miembros, en ninguno de ellos, indican la pertenencia a la red en su conjunto. Algunos sitios pueden requerir suscripción o proporcionar planes de servicio por niveles. Los mismos hubs <strong>pueden</strong> proporcionar detalles adicionales.";
-App::$strings["Hub URL"] = "Dirección del hub";
-App::$strings["Access Type"] = "Tipo de acceso";
-App::$strings["Registration Policy"] = "Normas de registro";
-App::$strings["Stats"] = "Estadísticas";
-App::$strings["Software"] = "Software";
-App::$strings["Ratings"] = "Valoraciones";
-App::$strings["Rate"] = "Valorar";
-App::$strings["View"] = "Ver";
-App::$strings["Could not access contact record."] = "No se ha podido acceder al registro de contacto.";
-App::$strings["Could not locate selected profile."] = "No se ha podido localizar el perfil seleccionado.";
-App::$strings["Connection updated."] = "Conexión actualizada.";
-App::$strings["Failed to update connection record."] = "Error al actualizar el registro de la conexión.";
-App::$strings["is now connected to"] = "ahora está conectado/a";
-App::$strings["Could not access address book record."] = "No se pudo acceder al registro en su libreta de direcciones.";
-App::$strings["Refresh failed - channel is currently unavailable."] = "Recarga fallida - no se puede encontrar el canal en este momento.";
-App::$strings["Unable to set address book parameters."] = "No ha sido posible establecer los parámetros de la libreta de direcciones.";
-App::$strings["Connection has been removed."] = "La conexión ha sido eliminada.";
-App::$strings["View Profile"] = "Ver el perfil";
-App::$strings["View %s's profile"] = "Ver el perfil de %s";
-App::$strings["Refresh Permissions"] = "Recargar los permisos";
-App::$strings["Fetch updated permissions"] = "Obtener los permisos actualizados";
-App::$strings["Refresh Photo"] = "Actualizar la foto";
-App::$strings["Fetch updated photo"] = "Obtener una foto actualizada";
-App::$strings["Recent Activity"] = "Actividad reciente";
-App::$strings["View recent posts and comments"] = "Ver publicaciones y comentarios recientes";
-App::$strings["Block (or Unblock) all communications with this connection"] = "Bloquear (o desbloquear) todas las comunicaciones con esta conexión";
-App::$strings["This connection is blocked!"] = "¡Esta conexión está bloqueada!";
-App::$strings["Unignore"] = "Dejar de ignorar";
-App::$strings["Ignore (or Unignore) all inbound communications from this connection"] = "Ignorar (o dejar de ignorar) todas las comunicaciones entrantes de esta conexión";
-App::$strings["This connection is ignored!"] = "¡Esta conexión es ignorada!";
-App::$strings["Unarchive"] = "Desarchivar";
-App::$strings["Archive"] = "Archivar";
-App::$strings["Archive (or Unarchive) this connection - mark channel dead but keep content"] = "Archiva (o desarchiva) esta conexión - marca el canal como muerto aunque mantiene sus contenidos";
-App::$strings["This connection is archived!"] = "¡Esta conexión esta archivada!";
-App::$strings["Unhide"] = "Mostrar";
-App::$strings["Hide"] = "Ocultar";
-App::$strings["Hide or Unhide this connection from your other connections"] = "Ocultar o mostrar esta conexión a sus otras conexiones";
-App::$strings["This connection is hidden!"] = "¡Esta conexión está oculta!";
-App::$strings["Delete this connection"] = "Eliminar esta conexión";
-App::$strings["Fetch Vcard"] = "Obtener una vcard";
-App::$strings["Fetch electronic calling card for this connection"] = "Obtener una tarjeta de llamada electrónica para esta conexión";
-App::$strings["Permissions"] = "Permisos";
-App::$strings["Open Individual Permissions section by default"] = "Abrir la sección de permisos individuales por defecto";
-App::$strings["Affinity"] = "Afinidad";
-App::$strings["Open Set Affinity section by default"] = "Abrir por defecto la sección para definir la afinidad";
-App::$strings["Me"] = "Yo";
-App::$strings["Family"] = "Familia";
-App::$strings["Friends"] = "Amigos/as";
-App::$strings["Acquaintances"] = "Conocidos/as";
-App::$strings["Filter"] = "Filtrar";
-App::$strings["Open Custom Filter section by default"] = "Abrir por defecto la sección de personalización de filtros";
-App::$strings["Approve this connection"] = "Aprobar esta conexión";
-App::$strings["Accept connection to allow communication"] = "Aceptar la conexión para permitir la comunicación";
-App::$strings["Set Affinity"] = "Ajustar la afinidad";
-App::$strings["Set Profile"] = "Ajustar el perfil";
-App::$strings["Set Affinity & Profile"] = "Ajustar la afinidad y el perfil";
-App::$strings["none"] = "-";
-App::$strings["Connection Default Permissions"] = "Permisos predeterminados de conexión";
-App::$strings["Connection: %s"] = "Conexión: %s";
-App::$strings["Apply these permissions automatically"] = "Aplicar estos permisos automaticamente";
-App::$strings["Connection requests will be approved without your interaction"] = "Las solicitudes de conexión serán aprobadas sin su intervención";
-App::$strings["Permission role"] = "Rol de acceso";
-App::$strings["Add permission role"] = "Añadir un rol de acceso";
-App::$strings["This connection's primary address is"] = "La dirección primaria de esta conexión es";
-App::$strings["Available locations:"] = "Ubicaciones disponibles:";
-App::$strings["The permissions indicated on this page will be applied to all new connections."] = "Los permisos indicados en esta página serán aplicados en todas las nuevas conexiones.";
-App::$strings["Connection Tools"] = "Gestión de las conexiones";
-App::$strings["Slide to adjust your degree of friendship"] = "Deslizar para ajustar el grado de amistad";
-App::$strings["Rating"] = "Valoración";
-App::$strings["Slide to adjust your rating"] = "Deslizar para ajustar su valoración";
-App::$strings["Optionally explain your rating"] = "Opcionalmente, puede explicar su valoración";
-App::$strings["Custom Filter"] = "Filtro personalizado";
-App::$strings["Only import posts with this text"] = "Importar solo entradas que contengan este texto";
-App::$strings["words one per line or #tags or /patterns/ or lang=xx, leave blank to import all posts"] = "Una sola opción por línea: palabras, #etiquetas, /patrones/ o lang=xx. Dejar en blanco para importarlo todo";
-App::$strings["Do not import posts with this text"] = "No importar entradas que contengan este texto";
-App::$strings["This information is public!"] = "¡Esta información es pública!";
-App::$strings["Connection Pending Approval"] = "Conexión pendiente de aprobación";
-App::$strings["inherited"] = "heredado";
-App::$strings["Please choose the profile you would like to display to %s when viewing your profile securely."] = "Por favor, escoja el perfil que quiere mostrar a %s cuando esté viendo su perfil de forma segura.";
-App::$strings["Their Settings"] = "Sus ajustes";
-App::$strings["My Settings"] = "Mis ajustes";
-App::$strings["Individual Permissions"] = "Permisos individuales";
-App::$strings["Some permissions may be inherited from your channel's <a href=\"settings\"><strong>privacy settings</strong></a>, which have higher priority than individual settings. You can <strong>not</strong> change those settings here."] = "Algunos permisos pueden ser heredados de los <a href=\"settings\"><strong>ajustes de privacidad</strong></a> de sus canales, los cuales tienen una prioridad más alta que los ajustes individuales. <strong>No</strong> puede cambiar estos ajustes aquí.";
-App::$strings["Some permissions may be inherited from your channel's <a href=\"settings\"><strong>privacy settings</strong></a>, which have higher priority than individual settings. You can change those settings here but they wont have any impact unless the inherited setting changes."] = "Algunos permisos pueden ser heredados de los <a href=\"settings\"><strong>ajustes de privacidad</strong></a> de sus canales, los cuales tienen una prioridad más alta que los ajustes individuales. Puede cambiar estos ajustes aquí, pero no tendrán ningún consecuencia hasta que cambie los ajustes heredados.";
-App::$strings["Last update:"] = "Última actualización:";
-App::$strings["Details"] = "Detalles";
-App::$strings["Organisation"] = "Organización";
-App::$strings["Title"] = "Título";
-App::$strings["Phone"] = "Teléfono";
-App::$strings["Instant messenger"] = "Mensajería instantánea";
-App::$strings["Website"] = "Sitio web";
-App::$strings["Note"] = "Nota";
-App::$strings["Mobile"] = "Móvil";
-App::$strings["Home"] = "Inicio";
-App::$strings["Work"] = "Trabajo";
-App::$strings["Add Contact"] = "Añadir un contacto";
-App::$strings["Add Field"] = "Añadir un campo";
-App::$strings["P.O. Box"] = "Buzón de correos";
-App::$strings["Additional"] = "Adicional";
-App::$strings["Street"] = "Calle";
-App::$strings["Locality"] = "Localidad";
-App::$strings["Region"] = "Provincia, región o estado";
-App::$strings["ZIP Code"] = "Código postal";
-App::$strings["Country"] = "País";
-App::$strings["Calendar entries imported."] = "Entradas de calendario importadas.";
-App::$strings["No calendar entries found."] = "No se han encontrado entradas de calendario.";
-App::$strings["Event can not end before it has started."] = "Un evento no puede terminar antes de que haya comenzado.";
-App::$strings["Unable to generate preview."] = "No se puede crear la vista previa.";
-App::$strings["Event title and start time are required."] = "Se requieren el título del evento y su hora de inicio.";
-App::$strings["Event not found."] = "Evento no encontrado.";
-App::$strings["event"] = "evento";
-App::$strings["Edit event title"] = "Editar el título del evento";
-App::$strings["Event title"] = "Título del evento";
-App::$strings["Categories (comma-separated list)"] = "Temas (lista separada por comas)";
-App::$strings["Edit Category"] = "Modificar el tema";
-App::$strings["Category"] = "Tema";
-App::$strings["Edit start date and time"] = "Modificar la fecha y hora de comienzo";
-App::$strings["Start date and time"] = "Fecha y hora de comienzo";
-App::$strings["Finish date and time are not known or not relevant"] = "La fecha y hora de terminación no se conocen o no son relevantes";
-App::$strings["Edit finish date and time"] = "Modificar la fecha y hora de terminación";
-App::$strings["Finish date and time"] = "Fecha y hora de terminación";
-App::$strings["Adjust for viewer timezone"] = "Ajustar para obtener el visor de los husos horarios";
-App::$strings["Important for events that happen in a particular place. Not practical for global holidays."] = "Importante para los eventos que suceden en un lugar determinado. No es práctico para los globales.";
-App::$strings["Edit Description"] = "Editar la descripción";
-App::$strings["Edit Location"] = "Modificar la dirección";
-App::$strings["Preview"] = "Previsualizar";
-App::$strings["Permission settings"] = "Configuración de permisos";
-App::$strings["Timezone:"] = "Zona horaria: ";
-App::$strings["Advanced Options"] = "Opciones avanzadas";
-App::$strings["l, F j"] = "l j F";
-App::$strings["Edit event"] = "Editar evento";
-App::$strings["Delete event"] = "Borrar evento";
-App::$strings["Link to Source"] = "Enlazar con la entrada en su ubicación original";
-App::$strings["calendar"] = "calendario";
-App::$strings["Edit Event"] = "Editar el evento";
-App::$strings["Create Event"] = "Crear un evento";
-App::$strings["Previous"] = "Anterior";
-App::$strings["Next"] = "Siguiente";
-App::$strings["Export"] = "Exportar";
-App::$strings["Month"] = "Mes";
-App::$strings["Week"] = "Semana";
-App::$strings["Day"] = "Día";
-App::$strings["Today"] = "Hoy";
-App::$strings["Event removed"] = "Evento borrado";
-App::$strings["Failed to remove event"] = "Error al eliminar el evento";
-App::$strings["\$Projectname"] = "\$Projectname";
-App::$strings["Welcome to %s"] = "Bienvenido a %s";
-App::$strings["Permission Denied."] = "Permiso denegado";
-App::$strings["File not found."] = "Fichero no encontrado.";
-App::$strings["Edit file permissions"] = "Modificar los permisos del fichero";
-App::$strings["Set/edit permissions"] = "Establecer/editar los permisos";
-App::$strings["Include all files and sub folders"] = "Incluir todos los ficheros y subcarpetas";
-App::$strings["Return to file list"] = "Volver a la lista de ficheros";
-App::$strings["Copy/paste this code to attach file to a post"] = "Copiar/pegar este código para adjuntar el fichero al envío";
-App::$strings["Copy/paste this URL to link file from a web page"] = "Copiar/pegar esta dirección para enlazar el fichero desde una página web";
-App::$strings["Share this file"] = "Compartir este fichero";
-App::$strings["Show URL to this file"] = "Mostrar la dirección de este fichero";
-App::$strings["Notify your contacts about this file"] = "Avisar a sus contactos sobre este fichero";
-App::$strings["Photos"] = "Fotos";
-App::$strings["Page owner information could not be retrieved."] = "La información del propietario de la página no pudo ser recuperada.";
-App::$strings["Profile Photos"] = "Fotos del perfil";
-App::$strings["Album not found."] = "Ãlbum no encontrado.";
-App::$strings["Delete Album"] = "Borrar álbum";
-App::$strings["Multiple storage folders exist with this album name, but within different directories. Please remove the desired folder or folders using the Files manager"] = "Hay varias carpetas con este nombre de álbum, pero dentro de diferentes directorios. Por favor, elimine la carpeta o carpetas que desee utilizando el administrador de ficheros";
-App::$strings["Delete Photo"] = "Borrar foto";
-App::$strings["Public access denied."] = "Acceso público denegado.";
-App::$strings["No photos selected"] = "No hay fotos seleccionadas";
-App::$strings["Access to this item is restricted."] = "El acceso a este elemento está restringido.";
-App::$strings["%1$.2f MB of %2$.2f MB photo storage used."] = "%1$.2f MB de %2$.2f MB de almacenamiento de fotos utilizado.";
-App::$strings["%1$.2f MB photo storage used."] = "%1$.2f MB de almacenamiento de fotos utilizado.";
-App::$strings["Upload Photos"] = "Subir fotos";
-App::$strings["Enter an album name"] = "Introducir un nombre de álbum";
-App::$strings["or select an existing album (doubleclick)"] = "o seleccionar uno existente (doble click)";
-App::$strings["Create a status post for this upload"] = "Crear un mensaje de estado para esta subida";
-App::$strings["Caption (optional):"] = "Título (opcional):";
-App::$strings["Description (optional):"] = "Descripción (opcional):";
-App::$strings["Album name could not be decoded"] = "El nombre del álbum no ha podido ser descifrado";
-App::$strings["Contact Photos"] = "Fotos de contacto";
-App::$strings["Show Newest First"] = "Mostrar lo más reciente primero";
-App::$strings["Show Oldest First"] = "Mostrar lo más antiguo primero";
-App::$strings["View Photo"] = "Ver foto";
-App::$strings["Edit Album"] = "Editar álbum";
-App::$strings["Permission denied. Access to this item may be restricted."] = "Permiso denegado. El acceso a este elemento puede estar restringido.";
-App::$strings["Photo not available"] = "Foto no disponible";
-App::$strings["Use as profile photo"] = "Usar como foto del perfil";
-App::$strings["Use as cover photo"] = "Usar como imagen de portada del perfil";
-App::$strings["Private Photo"] = "Foto privada";
-App::$strings["View Full Size"] = "Ver tamaño completo";
-App::$strings["Edit photo"] = "Editar foto";
-App::$strings["Rotate CW (right)"] = "Girar CW (a la derecha)";
-App::$strings["Rotate CCW (left)"] = "Girar CCW (a la izquierda)";
-App::$strings["Move photo to album"] = "Mover la foto a un álbum";
-App::$strings["Enter a new album name"] = "Introducir un nuevo nombre de álbum";
-App::$strings["or select an existing one (doubleclick)"] = "o seleccionar uno (doble click) existente";
-App::$strings["Caption"] = "Título";
-App::$strings["Add a Tag"] = "Añadir una etiqueta";
-App::$strings["Example: @bob, @Barbara_Jensen, @jim@example.com"] = "Ejemplos: @eva, @Carmen_Osuna, @jaime@ejemplo.com";
-App::$strings["Flag as adult in album view"] = "Marcar como \"solo para adultos\" en el álbum";
-App::$strings["I like this (toggle)"] = "Me gusta (cambiar)";
-App::$strings["I don't like this (toggle)"] = "No me gusta esto (cambiar)";
-App::$strings["Share"] = "Compartir";
-App::$strings["Please wait"] = "Espere por favor";
-App::$strings["This is you"] = "Este es usted";
-App::$strings["Comment"] = "Comentar";
-App::$strings["__ctx:title__ Likes"] = "Me gusta";
-App::$strings["__ctx:title__ Dislikes"] = "No me gusta";
-App::$strings["__ctx:title__ Agree"] = "De acuerdo";
-App::$strings["__ctx:title__ Disagree"] = "En desacuerdo";
-App::$strings["__ctx:title__ Abstain"] = "Abstención";
-App::$strings["__ctx:title__ Attending"] = "Participaré";
-App::$strings["__ctx:title__ Not attending"] = "No participaré";
-App::$strings["__ctx:title__ Might attend"] = "Quizá participe";
-App::$strings["View all"] = "Ver todo";
-App::$strings["__ctx:noun__ Like"] = array(
- 0 => "Me gusta",
- 1 => "Me gusta",
-);
-App::$strings["__ctx:noun__ Dislike"] = array(
- 0 => "No me gusta",
- 1 => "No me gusta",
-);
-App::$strings["Photo Tools"] = "Gestión de las fotos";
-App::$strings["In This Photo:"] = "En esta foto:";
-App::$strings["Map"] = "Mapa";
-App::$strings["__ctx:noun__ Likes"] = "Me gusta";
-App::$strings["__ctx:noun__ Dislikes"] = "No me gusta";
-App::$strings["Close"] = "Cerrar";
-App::$strings["View Album"] = "Ver álbum";
-App::$strings["Recent Photos"] = "Fotos recientes";
-App::$strings["Privacy group created."] = "El grupo de canales ha sido creado.";
-App::$strings["Could not create privacy group."] = "No se puede crear el grupo de canales";
-App::$strings["Privacy group not found."] = "Grupo de canales no encontrado.";
-App::$strings["Privacy group updated."] = "Grupo de canales actualizado.";
-App::$strings["Create a group of channels."] = "Crear un grupo de canales.";
-App::$strings["Privacy group name: "] = "Nombre del grupo de canales:";
-App::$strings["Members are visible to other channels"] = "Los miembros son visibles para otros canales";
-App::$strings["Privacy group removed."] = "Grupo de canales eliminado.";
-App::$strings["Unable to remove privacy group."] = "No se puede eliminar el grupo de canales.";
-App::$strings["Privacy group editor"] = "Editor de grupos de canales";
-App::$strings["All Connected Channels"] = "Todos los canales conectados";
-App::$strings["Click on a channel to add or remove."] = "Haga clic en un canal para agregarlo o quitarlo.";
-App::$strings["Invalid message"] = "Mensaje no válido";
-App::$strings["no results"] = "sin resultados";
-App::$strings["channel sync processed"] = "se ha realizado la sincronización del canal";
-App::$strings["queued"] = "encolado";
-App::$strings["posted"] = "enviado";
-App::$strings["accepted for delivery"] = "aceptado para el envío";
-App::$strings["updated"] = "actualizado";
-App::$strings["update ignored"] = "actualización ignorada";
-App::$strings["permission denied"] = "permiso denegado";
-App::$strings["recipient not found"] = "destinatario no encontrado";
-App::$strings["mail recalled"] = "mensaje de correo revocado";
-App::$strings["duplicate mail received"] = "se ha recibido mensaje duplicado";
-App::$strings["mail delivered"] = "correo enviado";
-App::$strings["Delivery report for %1\$s"] = "Informe de entrega para %1\$s";
-App::$strings["Options"] = "Opciones";
-App::$strings["Redeliver"] = "Volver a enviar";
-App::$strings["Unable to lookup recipient."] = "No se puede asociar a un destinatario.";
-App::$strings["Unable to communicate with requested channel."] = "No se puede establecer la comunicación con el canal solicitado.";
-App::$strings["Cannot verify requested channel."] = "No se puede verificar el canal solicitado.";
-App::$strings["Selected channel has private message restrictions. Send failed."] = "El canal seleccionado tiene restricciones sobre los mensajes privados. El envío falló.";
-App::$strings["Messages"] = "Mensajes";
-App::$strings["Message recalled."] = "Mensaje revocado.";
-App::$strings["Conversation removed."] = "Conversación eliminada.";
-App::$strings["Please enter a link URL:"] = "Por favor, introduzca la dirección del enlace:";
-App::$strings["Expires YYYY-MM-DD HH:MM"] = "Caduca YYYY-MM-DD HH:MM";
-App::$strings["Requested channel is not in this network"] = "El canal solicitado no existe en esta red";
-App::$strings["Send Private Message"] = "Enviar un mensaje privado";
-App::$strings["To:"] = "Para:";
-App::$strings["Subject:"] = "Asunto:";
-App::$strings["Your message:"] = "Su mensaje:";
-App::$strings["Attach file"] = "Adjuntar fichero";
-App::$strings["Send"] = "Enviar";
-App::$strings["Set expiration date"] = "Configurar fecha de caducidad";
-App::$strings["Encrypt text"] = "Cifrar texto";
-App::$strings["Delete message"] = "Borrar mensaje";
-App::$strings["Delivery report"] = "Informe de transmisión";
-App::$strings["Recall message"] = "Revocar el mensaje";
-App::$strings["Message has been recalled."] = "El mensaje ha sido revocado.";
-App::$strings["Delete Conversation"] = "Eliminar conversación";
-App::$strings["No secure communications available. You <strong>may</strong> be able to respond from the sender's profile page."] = "Comunicación segura no disponible. Pero <strong>puede</strong> responder desde la página del perfil del remitente.";
-App::$strings["Send Reply"] = "Responder";
-App::$strings["Your message for %s (%s):"] = "Su mensaje para %s (%s):";
-App::$strings["webpage"] = "página web";
-App::$strings["block"] = "bloque";
-App::$strings["layout"] = "plantilla";
-App::$strings["menu"] = "menú";
-App::$strings["%s element installed"] = "%s elemento instalado";
-App::$strings["%s element installation failed"] = "Elemento con instalación fallida: %s";
-App::$strings["Import completed"] = "Importación completada";
-App::$strings["Import Items"] = "Importar elementos";
-App::$strings["Use this form to import existing posts and content from an export file."] = "Utilice este formulario para importar entradas existentes y contenido desde un archivo de exportación.";
-App::$strings["You have created %1$.0f of %2$.0f allowed channels."] = "Ha creado %1$.0f de %2$.0f canales permitidos.";
-App::$strings["Create a new channel"] = "Crear un nuevo canal";
-App::$strings["Create New"] = "Crear";
-App::$strings["Channel Manager"] = "Administración de canales";
-App::$strings["Current Channel"] = "Canal actual";
-App::$strings["Switch to one of your channels by selecting it."] = "Cambiar a uno de sus canales seleccionándolo.";
-App::$strings["Default Channel"] = "Canal principal";
-App::$strings["Make Default"] = "Convertir en predeterminado";
-App::$strings["%d new messages"] = "%d mensajes nuevos";
-App::$strings["%d new introductions"] = "%d nuevas solicitudes de conexión";
-App::$strings["Delegated Channel"] = "Canal delegado";
-App::$strings["Hub not found."] = "Servidor no encontrado";
-App::$strings["Unable to create element."] = "No se puede crear el elemento.";
-App::$strings["Unable to update menu element."] = "No es posible actualizar el elemento del menú.";
-App::$strings["Unable to add menu element."] = "No es posible añadir el elemento al menú";
-App::$strings["Menu Item Permissions"] = "Permisos del elemento del menú";
-App::$strings["(click to open/close)"] = "(pulsar para abrir o cerrar)";
-App::$strings["Link Name"] = "Nombre del enlace";
-App::$strings["Link or Submenu Target"] = "Destino del enlace o submenú";
-App::$strings["Enter URL of the link or select a menu name to create a submenu"] = "Introducir la dirección del enlace o seleccionar el nombre de un submenú";
-App::$strings["Use magic-auth if available"] = "Usar la autenticación mágica si está disponible";
-App::$strings["Open link in new window"] = "Abrir el enlace en una nueva ventana";
-App::$strings["Order in list"] = "Orden en la lista";
-App::$strings["Higher numbers will sink to bottom of listing"] = "Los números más altos irán al final de la lista";
-App::$strings["Submit and finish"] = "Enviar y terminar";
-App::$strings["Submit and continue"] = "Enviar y continuar";
-App::$strings["Menu:"] = "Menú:";
-App::$strings["Link Target"] = "Destino del enlace";
-App::$strings["Edit menu"] = "Editar menú";
-App::$strings["Edit element"] = "Editar el elemento";
-App::$strings["Drop element"] = "Eliminar el elemento";
-App::$strings["New element"] = "Nuevo elemento";
-App::$strings["Edit this menu container"] = "Modificar el contenedor del menú";
-App::$strings["Add menu element"] = "Añadir un elemento al menú";
-App::$strings["Delete this menu item"] = "Eliminar este elemento del menú";
-App::$strings["Edit this menu item"] = "Modificar este elemento del menú";
-App::$strings["Menu item not found."] = "Este elemento del menú no se ha encontrado";
-App::$strings["Menu item deleted."] = "Este elemento del menú ha sido borrado";
-App::$strings["Menu item could not be deleted."] = "Este elemento del menú no puede ser borrado.";
-App::$strings["Edit Menu Element"] = "Editar elemento del menú";
-App::$strings["Link text"] = "Texto del enlace";
-App::$strings["Item is not editable"] = "El elemento no es editable";
-App::$strings["No ratings"] = "Ninguna valoración";
-App::$strings["Rating: "] = "Valoración:";
-App::$strings["Website: "] = "Sitio web:";
-App::$strings["Description: "] = "Descripción:";
-App::$strings["Item not available."] = "Elemento no disponible";
-App::$strings["Permissions denied."] = "Permisos denegados.";
-App::$strings["Import"] = "Importar";
-App::$strings["No more system notifications."] = "No hay más notificaciones del sistema";
-App::$strings["System Notifications"] = "Notificaciones del sistema";
-App::$strings["Authorize application connection"] = "Autorizar una conexión de aplicación";
-App::$strings["Return to your app and insert this Security Code:"] = "Vuelva a su aplicación e introduzca este código de seguridad: ";
-App::$strings["Please login to continue."] = "Por favor inicie sesión para continuar.";
-App::$strings["Do you want to authorize this application to access your posts and contacts, and/or create new posts for you?"] = "¿Desea autorizar a esta aplicación a acceder a sus publicaciones y contactos, y/o crear nuevas publicaciones por usted?";
-App::$strings["Total invitation limit exceeded."] = "Se ha superado el límite máximo de invitaciones.";
-App::$strings["%s : Not a valid email address."] = "%s : No es una dirección de correo electrónico válida. ";
-App::$strings["Please join us on \$Projectname"] = "Únase a nosotros en \$Projectname";
-App::$strings["Invitation limit exceeded. Please contact your site administrator."] = "Excedido el límite de invitaciones. Por favor, contacte con el Administrador de su sitio.";
-App::$strings["%s : Message delivery failed."] = "%s : Falló el envío del mensaje.";
-App::$strings["%d message sent."] = array(
- 0 => "%d mensajes enviados.",
- 1 => "%d mensajes enviados.",
-);
-App::$strings["You have no more invitations available"] = "No tiene más invitaciones disponibles";
-App::$strings["Send invitations"] = "Enviar invitaciones";
-App::$strings["Enter email addresses, one per line:"] = "Introduzca las direcciones de correo electrónico, una por línea:";
-App::$strings["Please join my community on \$Projectname."] = "Por favor, únase a mi comunidad en \$Projectname.";
-App::$strings["You will need to supply this invitation code:"] = "Tendrá que suministrar este código de invitación:";
-App::$strings["1. Register at any \$Projectname location (they are all inter-connected)"] = "1. Regístrese en cualquier sitio de \$Projectname (están todos interconectados)";
-App::$strings["2. Enter my \$Projectname network address into the site searchbar."] = "2. Introduzca mi dirección \$Projectname en la caja de búsqueda del sitio.";
-App::$strings["or visit"] = "o visitar";
-App::$strings["3. Click [Connect]"] = "3. Pulse [conectar]";
-App::$strings["About this site"] = "Acerca de este sitio";
-App::$strings["Site Name"] = "Nombre del sitio";
-App::$strings["Administrator"] = "Administrador";
-App::$strings["Software and Project information"] = "Información sobre el software y el proyecto";
-App::$strings["This site is powered by \$Projectname"] = "Este sitio funciona con \$Projectname";
-App::$strings["Federated and decentralised networking and identity services provided by Zot"] = "Servicios federados y descentralizados de identidad y redes proporcionados por Zot";
-App::$strings["Version %s"] = "Versión %s";
-App::$strings["Project homepage"] = "Página principal del proyecto";
-App::$strings["Developer homepage"] = "Página principal del desarrollador";
-App::$strings["Create Channel"] = "Crear un canal";
-App::$strings["A channel is your identity on this network. It can represent a person, a blog, or a forum to name a few. Channels can make connections with other channels to share information with highly detailed permissions."] = "Un canal es su identidad en esta red. Puede representar a una persona, un blog o un foro, por nombrar unos pocos ejemplos. Los canales se pueden conectar con otros canales para compartir información con una gama de permisos extremadamente detallada.";
-App::$strings["or <a href=\"import\">import an existing channel</a> from another location."] = "O <a href=\"import\">importar un canal existente</a> desde otro lugar.";
-App::$strings["Import Webpage Elements"] = "Importar elementos de una página web";
-App::$strings["Import selected"] = "Importar elementos seleccionados";
-App::$strings["Export Webpage Elements"] = "Exportar elementos de una página web";
-App::$strings["Export selected"] = "Exportar los elementos seleccionados";
-App::$strings["Webpages"] = "Páginas web";
-App::$strings["Actions"] = "Acciones";
-App::$strings["Page Link"] = "Vínculo de la página";
-App::$strings["Page Title"] = "Título de página";
-App::$strings["Invalid file type."] = "Tipo de fichero no válido.";
-App::$strings["Error opening zip file"] = "Error al abrir el fichero comprimido zip";
-App::$strings["Invalid folder path."] = "La ruta de la carpeta no es válida.";
-App::$strings["No webpage elements detected."] = "No se han detectado elementos de ninguna página web.";
-App::$strings["Import complete."] = "Importación completada.";
-App::$strings["Mark all system notifications seen"] = "Marcar todas las notificaciones del sistema como leídas";
-App::$strings["Poke"] = "Toques y otras cosas";
-App::$strings["Poke somebody"] = "Dar un toque a alguien";
-App::$strings["Poke/Prod"] = "Toque/Incitación";
-App::$strings["Poke, prod or do other things to somebody"] = "Dar un toque, incitar o hacer otras cosas a alguien";
-App::$strings["Recipient"] = "Destinatario";
-App::$strings["Choose what you wish to do to recipient"] = "Elegir qué desea enviar al destinatario";
-App::$strings["Make this post private"] = "Convertir en privado este envío";
-App::$strings["Invalid profile identifier."] = "Identificador del perfil no válido";
-App::$strings["Profile Visibility Editor"] = "Editor de visibilidad del perfil";
-App::$strings["Profile"] = "Perfil";
-App::$strings["Click on a contact to add or remove."] = "Pulsar en un contacto para añadirlo o eliminarlo.";
-App::$strings["Visible To"] = "Visible para";
-App::$strings["Posts and comments"] = "Publicaciones y comentarios";
-App::$strings["Only posts"] = "Solo publicaciones";
-App::$strings["Unable to locate original post."] = "No ha sido posible encontrar la entrada original.";
-App::$strings["Empty post discarded."] = "La entrada vacía ha sido desechada.";
-App::$strings["Executable content type not permitted to this channel."] = "Contenido de tipo ejecutable no permitido en este canal.";
-App::$strings["Duplicate post suppressed."] = "Se ha suprimido la entrada duplicada.";
-App::$strings["System error. Post not saved."] = "Error del sistema. La entrada no se ha podido salvar.";
-App::$strings["Unable to obtain post information from database."] = "No ha sido posible obtener información de la entrada en la base de datos.";
-App::$strings["You have reached your limit of %1$.0f top level posts."] = "Ha alcanzado su límite de %1$.0f entradas en la página principal.";
-App::$strings["You have reached your limit of %1$.0f webpages."] = "Ha alcanzado su límite de %1$.0f páginas web.";
-App::$strings["This setting requires special processing and editing has been blocked."] = "Este ajuste necesita de un proceso especial y la edición ha sido bloqueada.";
-App::$strings["Configuration Editor"] = "Editor de configuración";
-App::$strings["Warning: Changing some settings could render your channel inoperable. Please leave this page unless you are comfortable with and knowledgeable about how to correctly use this feature."] = "Atención: El cambio de algunos ajustes puede volver inutilizable su canal. Por favor, abandone la página excepto que esté seguro y sepa cómo usar correctamente esta característica.";
-App::$strings["Items tagged with: %s"] = "elementos etiquetados con: %s";
-App::$strings["Search results for: %s"] = "Resultados de la búsqueda para: %s";
+App::$strings["New Profile Field"] = "Nuevo campo en el perfil";
+App::$strings["Field nickname"] = "Alias del campo";
+App::$strings["System name of field"] = "Nombre del campo en el sistema";
+App::$strings["Input type"] = "Tipo de entrada";
+App::$strings["Field Name"] = "Nombre del campo";
+App::$strings["Label on profile pages"] = "Etiqueta a mostrar en la página del perfil";
+App::$strings["Help text"] = "Texto de ayuda";
+App::$strings["Additional info (optional)"] = "Información adicional (opcional)";
+App::$strings["Save"] = "Guardar";
+App::$strings["Field definition not found"] = "Definición del campo no encontrada";
+App::$strings["Edit Profile Field"] = "Modificar el campo del perfil";
+App::$strings["Profile Fields"] = "Campos del perfil";
+App::$strings["Basic Profile Fields"] = "Campos básicos del perfil";
+App::$strings["Advanced Profile Fields"] = "Campos avanzados del perfil";
+App::$strings["(In addition to basic fields)"] = "(Además de los campos básicos)";
+App::$strings["All available fields"] = "Todos los campos disponibles";
+App::$strings["Custom Fields"] = "Campos personalizados";
+App::$strings["Create Custom Field"] = "Crear un campo personalizado";
+App::$strings["Password changed for account %d."] = "Ha cambiado la contraseña para la cuenta %d.";
+App::$strings["Account settings updated."] = "Se han actualizado los ajustes de la cuenta.";
+App::$strings["Account not found."] = "No se ha encontrado la cuenta.";
+App::$strings["Account Edit"] = "Editar la cuenta";
+App::$strings["New Password"] = "Nueva contraseña";
+App::$strings["New Password again"] = "Nueva contraseña otra vez";
+App::$strings["Technical skill level"] = "Nivel de habilidad técnica";
+App::$strings["Account language (for emails)"] = "Idioma de la cuenta (para los correos electrónicos)";
+App::$strings["Service class"] = "Clase de servicio";
+App::$strings["By default, unfiltered HTML is allowed in embedded media. This is inherently insecure."] = "De forma predeterminada, el HTML sin filtrar está permitido en el contenido multimedia incorporado en una publicación. Esto es siempre inseguro.";
+App::$strings["The recommended setting is to only allow unfiltered HTML from the following sites:"] = "La configuración recomendada es que sólo se permita HTML sin filtrar desde los siguientes sitios: ";
+App::$strings["https://youtube.com/<br />https://www.youtube.com/<br />https://youtu.be/<br />https://vimeo.com/<br />https://soundcloud.com/<br />"] = "https://youtube.com/<br />https://www.youtube.com/<br />https://youtu.be/<br />https://vimeo.com/<br />https://soundcloud.com/<br />";
+App::$strings["All other embedded content will be filtered, <strong>unless</strong> embedded content from that site is explicitly blocked."] = "El resto del contenido incrustado se filtrará, <strong>excepto</ strong> si el contenido incorporado desde ese sitio está bloqueado de forma explícita.";
+App::$strings["Security"] = "Seguridad";
+App::$strings["Block public"] = "Bloquear páginas públicas";
+App::$strings["Check to block public access to all otherwise public personal pages on this site unless you are currently authenticated."] = "Habilitar para impedir ver las páginas personales de este sitio a quien no esté actualmente autenticado.";
+App::$strings["Set \"Transport Security\" HTTP header"] = "Habilitar \"Seguridad de transporte\" (\"Transport Security\") en la cabecera HTTP";
+App::$strings["Set \"Content Security Policy\" HTTP header"] = "Habilitar la \"Política de seguridad del contenido\" (\"Content Security Policy\") en la cabecera HTTP";
+App::$strings["Allowed email domains"] = "Se aceptan dominios de correo electrónico";
+App::$strings["Comma separated list of domains which are allowed in email addresses for registrations to this site. Wildcards are accepted. Empty to allow any domains"] = "Lista separada por comas de los dominios de los que se acepta una dirección de correo electrónico para registros en este sitio. Se permiten comodines. Dejar en claro para aceptar cualquier dominio. ";
+App::$strings["Not allowed email domains"] = "No se permiten dominios de correo electrónico";
+App::$strings["Comma separated list of domains which are not allowed in email addresses for registrations to this site. Wildcards are accepted. Empty to allow any domains, unless allowed domains have been defined."] = "Lista separada por comas de los dominios de los que no se acepta una dirección de correo electrónico para registros en este sitio. Se permiten comodines. Dejar en claro para no aceptar cualquier dominio, excepto los que se hayan autorizado.";
+App::$strings["Allow communications only from these sites"] = "Permitir la comunicación solo desde estos sitios";
+App::$strings["One site per line. Leave empty to allow communication from anywhere by default"] = "Un sitio por línea. Dejar en blanco para permitir por defecto la comunicación desde cualquiera";
+App::$strings["Block communications from these sites"] = "Bloquear la comunicación desde estos sitios";
+App::$strings["Allow communications only from these channels"] = "Permitir la comunicación solo desde estos canales";
+App::$strings["One channel (hash) per line. Leave empty to allow from any channel by default"] = "Un canal (hash) por línea. Dejar en blanco para permitir por defecto la comunicación desde cualquiera";
+App::$strings["Block communications from these channels"] = "Bloquear la comunicación desde estos canales";
+App::$strings["Only allow embeds from secure (SSL) websites and links."] = "Sólo se permite contenido multimedia incorporado desde sitios y enlaces seguros (SSL).";
+App::$strings["Allow unfiltered embedded HTML content only from these domains"] = "Permitir contenido HTML sin filtrar sólo desde estos dominios ";
+App::$strings["One site per line. By default embedded content is filtered."] = "Un sitio por línea. El contenido incorporado se filtra de forma predeterminada.";
+App::$strings["Block embedded HTML from these domains"] = "Bloquear contenido con HTML incorporado desde estos dominios";
App::$strings["Remote privacy information not available."] = "La información privada remota no está disponible.";
App::$strings["Visible to:"] = "Visible para:";
App::$strings["__ctx:acl__ Profile"] = "Perfil";
-App::$strings["Blocks"] = "Bloques";
-App::$strings["Block Title"] = "Título del bloque";
-App::$strings["Layouts"] = "Plantillas";
-App::$strings["Help"] = "Ayuda";
-App::$strings["Comanche page description language help"] = "Página de ayuda del lenguaje de descripción de páginas (PDL) Comanche";
-App::$strings["Layout Description"] = "Descripción de la plantilla";
-App::$strings["Download PDL file"] = "Descargar el fichero PDL";
-App::$strings["Website:"] = "Sitio web:";
-App::$strings["Remote Channel [%s] (not yet known on this site)"] = "Canal remoto [%s] (aún no es conocido en este sitio)";
-App::$strings["Rating (this information is public)"] = "Valoración (esta información es pública)";
-App::$strings["Optionally explain your rating (this information is public)"] = "Opcionalmente puede explicar su valoración (esta información es pública)";
-App::$strings["Shift-reload the page or clear browser cache if the new photo does not display immediately."] = "Recargue la página o limpie el caché del navegador si la nueva foto no se muestra inmediatamente.";
-App::$strings["Use Photo for Profile"] = "Usar la fotografía para el perfil";
-App::$strings["Upload Profile Photo"] = "Subir foto de perfil";
-App::$strings["Use"] = "Usar";
-App::$strings["Like/Dislike"] = "Me gusta/No me gusta";
-App::$strings["This action is restricted to members."] = "Esta acción está restringida solo para miembros.";
-App::$strings["Please <a href=\"rmagic\">login with your \$Projectname ID</a> or <a href=\"register\">register as a new \$Projectname member</a> to continue."] = "Por favor, <a href=\"rmagic\">identifíquese con su \$Projectname ID</a> o <a href=\"register\">rregístrese como un nuevo \$Projectname member</a> para continuar.";
-App::$strings["Invalid request."] = "Solicitud incorrecta.";
-App::$strings["channel"] = "el canal";
-App::$strings["thing"] = "elemento";
-App::$strings["Channel unavailable."] = "Canal no disponible.";
-App::$strings["Previous action reversed."] = "Acción anterior revocada.";
-App::$strings["photo"] = "foto";
-App::$strings["status"] = "el mensaje de estado";
-App::$strings["%1\$s likes %2\$s's %3\$s"] = "A %1\$s le gusta %3\$s de %2\$s";
-App::$strings["%1\$s doesn't like %2\$s's %3\$s"] = "A %1\$s no le gusta %3\$s de %2\$s";
-App::$strings["%1\$s agrees with %2\$s's %3\$s"] = "%3\$s de %2\$s: %1\$s está de acuerdo";
-App::$strings["%1\$s doesn't agree with %2\$s's %3\$s"] = "%3\$s de %2\$s: %1\$s no está de acuerdo";
-App::$strings["%1\$s abstains from a decision on %2\$s's %3\$s"] = "%3\$s de %2\$s: %1\$s se abstiene";
-App::$strings["%1\$s is attending %2\$s's %3\$s"] = "%3\$s de %2\$s: %1\$s participa";
-App::$strings["%1\$s is not attending %2\$s's %3\$s"] = "%3\$s de %2\$s: %1\$s no participa";
-App::$strings["%1\$s may attend %2\$s's %3\$s"] = "%3\$s de %2\$s: %1\$s quizá participe";
-App::$strings["Action completed."] = "Acción completada.";
-App::$strings["Thank you."] = "Gracias.";
-App::$strings["No channel."] = "Ningún canal.";
-App::$strings["Common connections"] = "Conexiones comunes";
-App::$strings["No connections in common."] = "Ninguna conexión en común.";
-App::$strings["toggle full screen mode"] = "cambiar al modo de pantalla completa";
-App::$strings["%1\$s is following %2\$s's %3\$s"] = "%1\$s está siguiendo %3\$s de %2\$s";
-App::$strings["%1\$s stopped following %2\$s's %3\$s"] = "%1\$s ha dejado de seguir %3\$s de %2\$s";
-App::$strings["You must be logged in to see this page."] = "Debe haber iniciado sesión para poder ver esta página.";
-App::$strings["Insufficient permissions. Request redirected to profile page."] = "Permisos insuficientes. Petición redirigida a la página del perfil.";
-App::$strings["No valid account found."] = "No se ha encontrado una cuenta válida.";
-App::$strings["Password reset request issued. Check your email."] = "Se ha recibido una solicitud de restablecimiento de contraseña. Consulte su correo electrónico.";
-App::$strings["Site Member (%s)"] = "Usuario del sitio (%s)";
-App::$strings["Password reset requested at %s"] = "Se ha solicitado restablecer la contraseña en %s";
-App::$strings["Request could not be verified. (You may have previously submitted it.) Password reset failed."] = "La solicitud no ha podido ser verificada. (Puede que la haya enviado con anterioridad) El restablecimiento de la contraseña ha fallado.";
-App::$strings["Password Reset"] = "Restablecer la contraseña";
-App::$strings["Your password has been reset as requested."] = "Su contraseña ha sido restablecida según lo solicitó.";
-App::$strings["Your new password is"] = "Su nueva contraseña es";
-App::$strings["Save or copy your new password - and then"] = "Guarde o copie su nueva contraseña - y después";
-App::$strings["click here to login"] = "pulse aquí para conectarse";
-App::$strings["Your password may be changed from the <em>Settings</em> page after successful login."] = "Puede cambiar la contraseña en la página <em>Ajustes</em> una vez iniciada la sesión.";
-App::$strings["Your password has changed at %s"] = "Su contraseña en %s ha sido cambiada";
-App::$strings["Forgot your Password?"] = "¿Ha olvidado su contraseña?";
-App::$strings["Enter your email address and submit to have your password reset. Then check your email for further instructions."] = "Introduzca y envíe su dirección de correo electrónico para el restablecimiento de su contraseña. Luego revise su correo para obtener más instrucciones.";
-App::$strings["Email Address"] = "Dirección de correo electrónico";
-App::$strings["Reset"] = "Reiniciar";
-App::$strings["Select a bookmark folder"] = "Seleccionar una carpeta de marcadores";
-App::$strings["Save Bookmark"] = "Guardar marcador";
-App::$strings["URL of bookmark"] = "Dirección del marcador";
-App::$strings["Or enter new bookmark folder name"] = "O introduzca un nuevo nombre para la carpeta de marcadores";
-App::$strings["Channel added."] = "Canal añadido.";
-App::$strings["__ctx:mood__ %1\$s is %2\$s"] = "%1\$s está %2\$s";
-App::$strings["Mood"] = "Estado de ánimo";
-App::$strings["Set your current mood and tell your friends"] = "Describir su estado de ánimo para comunicárselo a sus amigos";
-App::$strings["Please login."] = "Por favor, inicie sesión.";
-App::$strings["Account removals are not allowed within 48 hours of changing the account password."] = "La eliminación de cuentas no está permitida hasta después de que hayan transcurrido 48 horas desde el último cambio de contraseña.";
-App::$strings["Remove This Account"] = "Eliminar esta cuenta";
-App::$strings["WARNING: "] = "ATENCIÓN:";
-App::$strings["This account and all its channels will be completely removed from the network. "] = "Esta cuenta y todos sus canales van a ser eliminados de la red.";
-App::$strings["This action is permanent and can not be undone!"] = "¡Esta acción tiene carácter definitivo y no se puede deshacer!";
-App::$strings["Please enter your password for verification:"] = "Por favor, introduzca su contraseña para su verificación:";
-App::$strings["Remove this account, all its channels and all its channel clones from the network"] = "Remover esta cuenta, todos sus canales y clones de la red";
-App::$strings["By default only the instances of the channels located on this hub will be removed from the network"] = "Por defecto, solo las instancias de los canales ubicados en este servidor serán eliminados de la red";
-App::$strings["Remove Account"] = "Eliminar cuenta";
-App::$strings["Layout updated."] = "Plantilla actualizada.";
-App::$strings["Feature disabled."] = "Funcionalidad deshabilitada.";
-App::$strings["Edit System Page Description"] = "Editor del Sistema de Descripción de Páginas";
-App::$strings["Layout not found."] = "Plantilla no encontrada";
-App::$strings["Module Name:"] = "Nombre del módulo:";
-App::$strings["Layout Help"] = "Ayuda para el diseño de plantillas de página";
-App::$strings["%d rating"] = array(
- 0 => "%d valoración",
- 1 => "%d valoraciones",
-);
-App::$strings["Gender: "] = "Género:";
-App::$strings["Status: "] = "Estado:";
-App::$strings["Homepage: "] = "Página personal:";
-App::$strings["Age:"] = "Edad:";
-App::$strings["Location:"] = "Ubicación:";
-App::$strings["Description:"] = "Descripción:";
-App::$strings["Hometown:"] = "Lugar de nacimiento:";
-App::$strings["About:"] = "Sobre mí:";
-App::$strings["Connect"] = "Conectar";
-App::$strings["Public Forum:"] = "Foro público:";
-App::$strings["Keywords: "] = "Palabras clave:";
-App::$strings["Don't suggest"] = "No sugerir:";
-App::$strings["Common connections:"] = "Conexiones comunes:";
-App::$strings["Global Directory"] = "Directorio global:";
-App::$strings["Local Directory"] = "Directorio local:";
-App::$strings["Finding:"] = "Encontrar:";
-App::$strings["Channel Suggestions"] = "Sugerencias de canales";
-App::$strings["next page"] = "siguiente página";
-App::$strings["previous page"] = "página anterior";
-App::$strings["Sort options"] = "Ordenar opciones";
-App::$strings["Alphabetic"] = "Alfabético";
-App::$strings["Reverse Alphabetic"] = "Alfabético inverso";
-App::$strings["Newest to Oldest"] = "De más nuevo a más antiguo";
-App::$strings["Oldest to Newest"] = "De más antiguo a más nuevo";
-App::$strings["No entries (some entries may be hidden)."] = "Sin entradas (algunas entradas pueden estar ocultas).";
-App::$strings["vcard"] = "vcard";
-App::$strings["Unable to find your hub."] = "No se puede encontrar su servidor.";
-App::$strings["Post successful."] = "Enviado con éxito.";
-App::$strings["Source of Item"] = "Origen del elemento";
-App::$strings["No service class restrictions found."] = "No se han encontrado restricciones sobre esta clase de servicio.";
-App::$strings["network"] = "red";
-App::$strings["RSS"] = "RSS";
-App::$strings["Channel removals are not allowed within 48 hours of changing the account password."] = "La eliminación de canales no está permitida hasta pasadas 48 horas desde el último cambio de contraseña.";
-App::$strings["Remove This Channel"] = "Eliminar este canal";
-App::$strings["This channel will be completely removed from the network. "] = "Este canal va a ser completamente eliminado de la red. ";
-App::$strings["Remove this channel and all its clones from the network"] = "Eliminar este canal y todos sus clones de la red";
-App::$strings["By default only the instance of the channel located on this hub will be removed from the network"] = "Por defecto, solo la instancia del canal alojado en este servidor será eliminado de la red";
-App::$strings["Remove Channel"] = "Eliminar el canal";
-App::$strings["Files: shared with me"] = "Ficheros: compartidos conmigo";
-App::$strings["NEW"] = "NUEVO";
-App::$strings["Remove all files"] = "Eliminar todos los ficheros";
-App::$strings["Remove this file"] = "Eliminar este fichero";
-App::$strings["post"] = "la entrada";
-App::$strings["comment"] = "el comentario";
-App::$strings["%1\$s tagged %2\$s's %3\$s with %4\$s"] = "%1\$s ha etiquetado %3\$s de %2\$s con %4\$s";
-App::$strings["Failed to create source. No channel selected."] = "No se ha podido crear el origen de los contenidos. No ha sido seleccionado ningún canal.";
-App::$strings["Source created."] = "Fuente creada.";
-App::$strings["Source updated."] = "Fuente actualizada.";
-App::$strings["*"] = "*";
-App::$strings["Channel Sources"] = "Orígenes de los contenidos del canal";
-App::$strings["Manage remote sources of content for your channel."] = "Gestionar contenido de origen remoto para su canal.";
-App::$strings["New Source"] = "Nueva fuente";
-App::$strings["Import all or selected content from the following channel into this channel and distribute it according to your channel settings."] = "Importar todo el contenido o una selección de los siguientes canales en este canal y distribuirlo de acuerdo con sus ajustes.";
-App::$strings["Only import content with these words (one per line)"] = "Importar solo contenido que contenga estas palabras (una por línea)";
-App::$strings["Leave blank to import all public content"] = "Dejar en blanco para importar todo el contenido público";
-App::$strings["Channel Name"] = "Nombre del canal";
-App::$strings["Add the following categories to posts imported from this source (comma separated)"] = "Añadir los temas siguientes a las entradas importadas de esta fuente (separadas por comas)";
-App::$strings["Optional"] = "Opcional";
-App::$strings["Source not found."] = "Fuente no encontrada";
-App::$strings["Edit Source"] = "Editar fuente";
-App::$strings["Delete Source"] = "Eliminar fuente";
-App::$strings["Source removed"] = "Fuente eliminada";
-App::$strings["Unable to remove source."] = "No se puede eliminar la fuente.";
-App::$strings["No suggestions available. If this is a new site, please try again in 24 hours."] = "No hay sugerencias disponibles. Si es un sitio nuevo, espere 24 horas y pruebe de nuevo.";
-App::$strings["Ignore/Hide"] = "Ignorar/Ocultar";
-App::$strings["Profile not found."] = "Perfil no encontrado.";
-App::$strings["Profile deleted."] = "Perfil eliminado.";
-App::$strings["Profile-"] = "Perfil-";
-App::$strings["New profile created."] = "El nuevo perfil ha sido creado.";
-App::$strings["Profile unavailable to clone."] = "Perfil no disponible para clonar.";
-App::$strings["Profile unavailable to export."] = "Perfil no disponible para exportar.";
-App::$strings["Profile Name is required."] = "Se necesita el nombre del perfil.";
-App::$strings["Marital Status"] = "Estado civil";
-App::$strings["Romantic Partner"] = "Pareja sentimental";
-App::$strings["Likes"] = "Me gusta";
-App::$strings["Dislikes"] = "No me gusta";
-App::$strings["Work/Employment"] = "Trabajo:";
-App::$strings["Religion"] = "Religión";
-App::$strings["Political Views"] = "Ideas políticas";
-App::$strings["Gender"] = "Género";
-App::$strings["Sexual Preference"] = "Preferencia sexual";
-App::$strings["Homepage"] = "Página personal";
-App::$strings["Interests"] = "Intereses";
-App::$strings["Profile updated."] = "Perfil actualizado.";
-App::$strings["Hide your connections list from viewers of this profile"] = "Ocultar la lista de conexiones a los visitantes del perfil";
-App::$strings["Edit Profile Details"] = "Modificar los detalles de este perfil";
-App::$strings["View this profile"] = "Ver este perfil";
-App::$strings["Edit visibility"] = "Editar visibilidad";
-App::$strings["Profile Tools"] = "Gestión del perfil";
-App::$strings["Change cover photo"] = "Cambiar la imagen de portada del perfil";
-App::$strings["Change profile photo"] = "Cambiar la foto del perfil";
-App::$strings["Create a new profile using these settings"] = "Crear un nuevo perfil usando estos ajustes";
-App::$strings["Clone this profile"] = "Clonar este perfil";
-App::$strings["Delete this profile"] = "Eliminar este perfil";
-App::$strings["Add profile things"] = "Añadir cosas al perfil";
-App::$strings["Personal"] = "Personales";
-App::$strings["Relation"] = "Relación";
-App::$strings["Miscellaneous"] = "Varios";
-App::$strings["Import profile from file"] = "Importar perfil desde un fichero";
-App::$strings["Export profile to file"] = "Exportar perfil a un fichero";
-App::$strings["Your gender"] = "Género";
-App::$strings["Marital status"] = "Estado civil";
-App::$strings["Sexual preference"] = "Preferencia sexual";
-App::$strings["Profile name"] = "Nombre del perfil";
-App::$strings["This is your default profile."] = "Este es su perfil principal.";
-App::$strings["Your full name"] = "Nombre completo";
-App::$strings["Title/Description"] = "Título o descripción";
-App::$strings["Street address"] = "Dirección";
-App::$strings["Locality/City"] = "Ciudad";
-App::$strings["Region/State"] = "Región o Estado";
-App::$strings["Postal/Zip code"] = "Código postal";
-App::$strings["Who (if applicable)"] = "Quién (si es pertinente)";
-App::$strings["Examples: cathy123, Cathy Williams, cathy@example.com"] = "Por ejemplo: ana123, María González, sara@ejemplo.com";
-App::$strings["Since (date)"] = "Desde (fecha)";
-App::$strings["Tell us about yourself"] = "Háblenos de usted";
-App::$strings["Homepage URL"] = "Dirección de la página personal";
-App::$strings["Hometown"] = "Lugar de nacimiento";
-App::$strings["Political views"] = "Ideas políticas";
-App::$strings["Religious views"] = "Creencias religiosas";
-App::$strings["Keywords used in directory listings"] = "Palabras clave utilizadas en los listados de directorios";
-App::$strings["Example: fishing photography software"] = "Por ejemplo: software de fotografía submarina";
-App::$strings["Musical interests"] = "Preferencias musicales";
-App::$strings["Books, literature"] = "Libros, literatura";
-App::$strings["Television"] = "Televisión";
-App::$strings["Film/Dance/Culture/Entertainment"] = "Cine, danza, cultura, entretenimiento";
-App::$strings["Hobbies/Interests"] = "Aficiones o intereses";
-App::$strings["Love/Romance"] = "Vida sentimental o amorosa";
-App::$strings["School/Education"] = "Estudios";
-App::$strings["Contact information and social networks"] = "Información de contacto y redes sociales";
-App::$strings["My other channels"] = "Mis otros canales";
-App::$strings["Communications"] = "Comunicaciones";
-App::$strings["Profile Image"] = "Imagen del perfil";
-App::$strings["Edit Profiles"] = "Editar perfiles";
-App::$strings["Additional Features"] = "Funcionalidades";
-App::$strings["Name is required"] = "El nombre es obligatorio";
-App::$strings["Key and Secret are required"] = "\"Key\" y \"Secret\" son obligatorios";
-App::$strings["Add application"] = "Añadir aplicación";
-App::$strings["Name of application"] = "Nombre de la aplicación";
-App::$strings["Consumer Key"] = "Consumer Key";
-App::$strings["Automatically generated - change if desired. Max length 20"] = "Generado automáticamente - si lo desea, cámbielo. Longitud máxima: 20";
-App::$strings["Consumer Secret"] = "Consumer Secret";
-App::$strings["Redirect"] = "Redirigir";
-App::$strings["Redirect URI - leave blank unless your application specifically requires this"] = "URI de redirección - dejar en blanco a menos que su aplicación específicamente lo requiera";
-App::$strings["Icon url"] = "Dirección del icono";
-App::$strings["Application not found."] = "Aplicación no encontrada.";
-App::$strings["Connected Apps"] = "Aplicaciones (apps) conectadas";
-App::$strings["Client key starts with"] = "La \"client key\" empieza por";
-App::$strings["No name"] = "Sin nombre";
-App::$strings["Remove authorization"] = "Eliminar autorización";
-App::$strings["Not valid email."] = "Correo electrónico no válido.";
-App::$strings["Protected email address. Cannot change to that email."] = "Dirección de correo electrónico protegida. No se puede cambiar a ella.";
-App::$strings["System failure storing new email. Please try again."] = "Fallo de sistema al guardar el nuevo correo electrónico. Por favor, inténtelo de nuevo.";
-App::$strings["Technical skill level updated"] = "Se ha actualizado el nivel de habilidad técnica";
-App::$strings["Password verification failed."] = "La comprobación de la contraseña ha fallado.";
-App::$strings["Passwords do not match. Password unchanged."] = "Las contraseñas no coinciden. La contraseña no se ha cambiado.";
-App::$strings["Empty passwords are not allowed. Password unchanged."] = "No se permiten contraseñas vacías. La contraseña no se ha cambiado.";
-App::$strings["Password changed."] = "Contraseña cambiada.";
-App::$strings["Password update failed. Please try again."] = "La actualización de la contraseña ha fallado. Por favor, inténtalo de nuevo.";
-App::$strings["Account Settings"] = "Configuración de la cuenta";
-App::$strings["Current Password"] = "Contraseña actual";
-App::$strings["Enter New Password"] = "Escribir una nueva contraseña";
-App::$strings["Confirm New Password"] = "Confirmar la nueva contraseña";
-App::$strings["Leave password fields blank unless changing"] = "Dejar en blanco la contraseña a menos que desee cambiarla.";
-App::$strings["Your technical skill level"] = "Su nivel de habilidad técnica";
-App::$strings["Used to provide a member experience matched to your comfort level"] = "Se utiliza para proporcionar la experiencia de los miembros adaptada a su nivel de comodidad";
-App::$strings["Email Address:"] = "Dirección de correo electrónico:";
-App::$strings["Remove this account including all its channels"] = "Eliminar esta cuenta incluyendo todos sus canales";
+App::$strings["Permission category saved."] = "Se ha guardado la categoría del permiso.";
+App::$strings["Use this form to create permission rules for various classes of people or connections."] = "Utilice este formulario para crear reglas de permiso para varias clases de personas o conexiones.";
+App::$strings["Permission Categories"] = "Categorías de autorización";
+App::$strings["Permission Name"] = "Nombre de la autorización";
+App::$strings["My Settings"] = "Mis ajustes";
+App::$strings["inherited"] = "heredado";
+App::$strings["Individual Permissions"] = "Permisos individuales";
+App::$strings["Some permissions may be inherited from your channel's <a href=\"settings\"><strong>privacy settings</strong></a>, which have higher priority than individual settings. You can <strong>not</strong> change those settings here."] = "Algunos permisos pueden ser heredados de los <a href=\"settings\"><strong>ajustes de privacidad</strong></a> de sus canales, los cuales tienen una prioridad más alta que los ajustes individuales. <strong>No</strong> puede cambiar estos ajustes aquí.";
+App::$strings["Friends"] = "Amigos/as";
App::$strings["Settings updated."] = "Ajustes actualizados.";
App::$strings["Nobody except yourself"] = "Nadie excepto usted";
App::$strings["Only those you specifically allow"] = "Solo aquellos a los que usted permita explícitamente";
@@ -1264,11 +625,13 @@ App::$strings["Anybody authenticated"] = "Cualquiera que esté autenticado";
App::$strings["Anybody on the internet"] = "Cualquiera en internet";
App::$strings["Publish your default profile in the network directory"] = "Publicar su perfil principal en el directorio de la red";
App::$strings["Allow us to suggest you as a potential friend to new members?"] = "¿Nos permite sugerirle como amigo potencial a los nuevos miembros?";
+App::$strings["or"] = "o";
App::$strings["Your channel address is"] = "Su dirección de canal es";
App::$strings["Your files/photos are accessible via WebDAV at"] = "Sus archivos y fotos son accesibles a través de WebDAV en ";
App::$strings["Channel Settings"] = "Ajustes del canal";
App::$strings["Basic Settings"] = "Configuración básica";
App::$strings["Full Name:"] = "Nombre completo:";
+App::$strings["Email Address:"] = "Dirección de correo electrónico:";
App::$strings["Your Timezone:"] = "Su huso horario:";
App::$strings["Default Post Location:"] = "Localización geográfica predeterminada para sus publicaciones:";
App::$strings["Geographical location to display on your posts"] = "Localización geográfica que debe mostrarse en sus publicaciones";
@@ -1341,17 +704,8 @@ App::$strings["Default file upload folder"] = "Carpeta por defecto de los ficher
App::$strings["Personal menu to display in your channel pages"] = "Menú personal que debe mostrarse en las páginas de su canal";
App::$strings["Remove this channel."] = "Eliminar este canal.";
App::$strings["Firefox Share \$Projectname provider"] = "Servicio de compartición de Firefox: proveedor \$Projectname";
-App::$strings["Start calendar week on monday"] = "Comenzar el calendario semanal por el lunes";
-App::$strings["Affinity Slider settings updated."] = "Se han actualizado los ajustes del controlador de afinidad.";
-App::$strings["No feature settings configured"] = "No se ha establecido la configuración de los complementos";
-App::$strings["Default maximum affinity level"] = "Nivel máximo de afinidad por defecto";
-App::$strings["Default minimum affinity level"] = "Nivel mínimo de afinidad por defecto";
-App::$strings["Affinity Slider Settings"] = "Ajustes del controlador de afinidad";
-App::$strings["Feature/Addon Settings"] = "Ajustes de los complementos";
-App::$strings["Permission category saved."] = "Se ha guardado la categoría del permiso.";
-App::$strings["Use this form to create permission rules for various classes of people or connections."] = "Utilice este formulario para crear reglas de permiso para varias clases de personas o conexiones.";
-App::$strings["Permission Categories"] = "Categorías de autorización";
-App::$strings["Permission Name"] = "Nombre de la autorización";
+App::$strings["Start calendar week on Monday"] = "Comenzar el calendario semanal por el lunes";
+App::$strings["Additional Features"] = "Funcionalidades";
App::$strings["This channel is limited to %d tokens"] = "Este canal tiene un límite de %d tokens";
App::$strings["Name and Password are required."] = "Se requiere el nombre y la contraseña.";
App::$strings["Token saved."] = "Token salvado.";
@@ -1361,6 +715,31 @@ App::$strings["Guest Access Tokens"] = "Tokens de acceso para invitados";
App::$strings["Login Name"] = "Nombre de inicio de sesión";
App::$strings["Login Password"] = "Contraseña de inicio de sesión";
App::$strings["Expires (yyyy-mm-dd)"] = "Expira (aaaa-mm-dd)";
+App::$strings["Their Settings"] = "Sus ajustes";
+App::$strings["Not valid email."] = "Correo electrónico no válido.";
+App::$strings["Protected email address. Cannot change to that email."] = "Dirección de correo electrónico protegida. No se puede cambiar a ella.";
+App::$strings["System failure storing new email. Please try again."] = "Fallo de sistema al guardar el nuevo correo electrónico. Por favor, inténtelo de nuevo.";
+App::$strings["Technical skill level updated"] = "Se ha actualizado el nivel de habilidad técnica";
+App::$strings["Password verification failed."] = "La comprobación de la contraseña ha fallado.";
+App::$strings["Passwords do not match. Password unchanged."] = "Las contraseñas no coinciden. La contraseña no se ha cambiado.";
+App::$strings["Empty passwords are not allowed. Password unchanged."] = "No se permiten contraseñas vacías. La contraseña no se ha cambiado.";
+App::$strings["Password changed."] = "Contraseña cambiada.";
+App::$strings["Password update failed. Please try again."] = "La actualización de la contraseña ha fallado. Por favor, inténtalo de nuevo.";
+App::$strings["Account Settings"] = "Configuración de la cuenta";
+App::$strings["Current Password"] = "Contraseña actual";
+App::$strings["Enter New Password"] = "Escribir una nueva contraseña";
+App::$strings["Confirm New Password"] = "Confirmar la nueva contraseña";
+App::$strings["Leave password fields blank unless changing"] = "Dejar en blanco la contraseña a menos que desee cambiarla.";
+App::$strings["Your technical skill level"] = "Su nivel de habilidad técnica";
+App::$strings["Used to provide a member experience matched to your comfort level"] = "Se utiliza para proporcionar la experiencia de los miembros adaptada a su nivel de comodidad";
+App::$strings["Remove Account"] = "Eliminar cuenta";
+App::$strings["Remove this account including all its channels"] = "Eliminar esta cuenta incluyendo todos sus canales";
+App::$strings["Affinity Slider settings updated."] = "Se han actualizado los ajustes del controlador de afinidad.";
+App::$strings["No feature settings configured"] = "No se ha establecido la configuración de los complementos";
+App::$strings["Default maximum affinity level"] = "Nivel máximo de afinidad por defecto";
+App::$strings["Default minimum affinity level"] = "Nivel mínimo de afinidad por defecto";
+App::$strings["Affinity Slider Settings"] = "Ajustes del controlador de afinidad";
+App::$strings["Feature/Addon Settings"] = "Ajustes de los complementos";
App::$strings["No special theme for mobile devices"] = "Sin tema especial para dispositivos móviles";
App::$strings["%s - (Experimental)"] = "%s - (Experimental)";
App::$strings["Display Settings"] = "Ajustes de visualización";
@@ -1388,9 +767,27 @@ App::$strings["Use blog/list mode on grid page"] = "Mostrar mi red en modo blog"
App::$strings["Channel page max height of content (in pixels)"] = "Altura máxima del contenido de la página del canal (en píxeles)";
App::$strings["click to expand content exceeding this height"] = "Pulsar para expandir el contenido que exceda de esta altura";
App::$strings["Grid page max height of content (in pixels)"] = "Altura máxima del contenido de mi red (en píxeles)";
-App::$strings["Tag removed"] = "Etiqueta eliminada.";
-App::$strings["Remove Item Tag"] = "Eliminar etiqueta del elemento.";
-App::$strings["Select a tag to remove: "] = "Seleccionar una etiqueta para eliminar:";
+App::$strings["Name is required"] = "El nombre es obligatorio";
+App::$strings["Key and Secret are required"] = "\"Key\" y \"Secret\" son obligatorios";
+App::$strings["Add application"] = "Añadir aplicación";
+App::$strings["Name of application"] = "Nombre de la aplicación";
+App::$strings["Consumer Key"] = "Consumer Key";
+App::$strings["Automatically generated - change if desired. Max length 20"] = "Generado automáticamente - si lo desea, cámbielo. Longitud máxima: 20";
+App::$strings["Consumer Secret"] = "Consumer Secret";
+App::$strings["Redirect"] = "Redirigir";
+App::$strings["Redirect URI - leave blank unless your application specifically requires this"] = "URI de redirección - dejar en blanco a menos que su aplicación específicamente lo requiera";
+App::$strings["Icon url"] = "Dirección del icono";
+App::$strings["Optional"] = "Opcional";
+App::$strings["Application not found."] = "Aplicación no encontrada.";
+App::$strings["Connected Apps"] = "Aplicaciones (apps) conectadas";
+App::$strings["Client key starts with"] = "La \"client key\" empieza por";
+App::$strings["No name"] = "Sin nombre";
+App::$strings["Remove authorization"] = "Eliminar autorización";
+App::$strings["View Photo"] = "Ver foto";
+App::$strings["Unknown"] = "Desconocido";
+App::$strings["Edit Album"] = "Editar álbum";
+App::$strings["Upload"] = "Subir";
+App::$strings["Some blurb about what to do when you're new here"] = "Algunas propuestas para el nuevo usuario sobre qué se puede hacer aquí";
App::$strings["Thing updated"] = "Elemento actualizado.";
App::$strings["Object store: failed"] = "Guardar objeto: ha fallado";
App::$strings["Thing added"] = "Elemento añadido";
@@ -1404,109 +801,163 @@ App::$strings["Only sends to viewers of the applicable profile"] = "Sólo enviar
App::$strings["Name of thing e.g. something"] = "Nombre del elemento, p. ej.:. \"algo\"";
App::$strings["URL of thing (optional)"] = "Dirección del elemento (opcional)";
App::$strings["URL for photo of thing (optional)"] = "Dirección para la foto o elemento (opcional)";
+App::$strings["Permissions"] = "Permisos";
App::$strings["Add Thing to your Profile"] = "Añadir alguna cosa a su perfil";
-App::$strings["\$Projectname Server - Setup"] = "Servidor \$Projectname - Instalación";
-App::$strings["Could not connect to database."] = "No se ha podido conectar a la base de datos.";
-App::$strings["Could not connect to specified site URL. Possible SSL certificate or DNS issue."] = "No se puede conectar con la dirección del sitio indicada. Podría tratarse de un problema de SSL o DNS.";
-App::$strings["Could not create table."] = "No se puede crear la tabla.";
-App::$strings["Your site database has been installed."] = "La base de datos del sitio ha sido instalada.";
-App::$strings["You may need to import the file \"install/schema_xxx.sql\" manually using a database client."] = "Podría tener que importar manualmente el fichero \"install/schema_xxx.sql\" usando un cliente de base de datos.";
-App::$strings["Please see the file \"install/INSTALL.txt\"."] = "Por favor, lea el fichero \"install/INSTALL.txt\".";
-App::$strings["System check"] = "Verificación del sistema";
-App::$strings["Check again"] = "Verificar de nuevo";
-App::$strings["Database connection"] = "Conexión a la base de datos";
-App::$strings["In order to install \$Projectname we need to know how to connect to your database."] = "Para instalar \$Projectname es necesario saber cómo conectar con su base de datos.";
-App::$strings["Please contact your hosting provider or site administrator if you have questions about these settings."] = "Por favor, contacte con el proveedor de servicios o el administrador del sitio si tiene dudas sobre estos ajustes.";
-App::$strings["The database you specify below should already exist. If it does not, please create it before continuing."] = "La base de datos que especifique a continuación debe existir ya. Si no es así, por favor, créela antes de seguir.";
-App::$strings["Database Server Name"] = "Nombre del servidor de base de datos";
-App::$strings["Default is 127.0.0.1"] = "De forma predeterminada es 127.0.0.1";
-App::$strings["Database Port"] = "Puerto de la base de datos";
-App::$strings["Communication port number - use 0 for default"] = "Número del puerto de comunicaciones - use 0 como valor por defecto";
-App::$strings["Database Login Name"] = "Usuario de la base de datos";
-App::$strings["Database Login Password"] = "Contraseña de acceso a la base de datos";
-App::$strings["Database Name"] = "Nombre de la base de datos";
-App::$strings["Database Type"] = "Tipo de base de datos";
-App::$strings["Site administrator email address"] = "Dirección de correo electrónico del administrador del sitio";
-App::$strings["Your account email address must match this in order to use the web admin panel."] = "Su cuenta deberá usar la misma dirección de correo electrónico para poder utilizar el panel de administración web.";
-App::$strings["Website URL"] = "Dirección del sitio web";
-App::$strings["Please use SSL (https) URL if available."] = "Por favor, use SSL (https) si está disponible.";
-App::$strings["Please select a default timezone for your website"] = "Por favor, selecciones el huso horario por defecto de su sitio web";
-App::$strings["Site settings"] = "Ajustes del sitio";
-App::$strings["PHP version 5.5 or greater is required."] = "Se requiere la versión 5.5, o superior, de PHP.";
-App::$strings["PHP version"] = "Versión de PHP";
-App::$strings["Could not find a command line version of PHP in the web server PATH."] = "No se puede encontrar una versión en línea de comandos de PHP en la ruta del servidor web.";
-App::$strings["If you don't have a command line version of PHP installed on server, you will not be able to run background polling via cron."] = "Si no tiene instalada la versión de línea de comandos de PHP en su servidor, no podrá realizar envíos en segundo plano mediante cron.";
-App::$strings["PHP executable path"] = "Ruta del ejecutable PHP";
-App::$strings["Enter full path to php executable. You can leave this blank to continue the installation."] = "Introducir la ruta completa del ejecutable PHP. Puede dejar la línea en blanco para continuar la instalación.";
-App::$strings["Command line PHP"] = "PHP en línea de comandos";
-App::$strings["Unable to check command line PHP, as shell_exec() is disabled. This is required."] = "No se puede comprobar la línea de comandos PHP, ya que shell_exec() está deshabilitado. Es necesario que esté activado.";
-App::$strings["The command line version of PHP on your system does not have \"register_argc_argv\" enabled."] = "La línea de comandos PHP de su sistema no tiene activado \"register_argc_argv\".";
-App::$strings["This is required for message delivery to work."] = "Esto es necesario para que funcione la transmisión de mensajes.";
-App::$strings["PHP register_argc_argv"] = "PHP register_argc_argv";
-App::$strings["Your max allowed total upload size is set to %s. Maximum size of one file to upload is set to %s. You are allowed to upload up to %d files at once."] = "La carga máxima que se le permite subir está establecida en %s. El tamaño máximo de un fichero está establecido en %s. Está permitido subir hasta un máximo de %d ficheros de una sola vez.";
-App::$strings["You can adjust these settings in the server php.ini file."] = "Puede ajustar estos valores en el fichero php.ini de su servidor.";
-App::$strings["PHP upload limits"] = "Límites PHP de subida";
-App::$strings["Error: the \"openssl_pkey_new\" function on this system is not able to generate encryption keys"] = "Error: La función \"openssl_pkey_new\" en este sistema no es capaz de general claves de cifrado.";
-App::$strings["If running under Windows, please see \"http://www.php.net/manual/en/openssl.installation.php\"."] = "Si está en un servidor Windows, por favor, lea \"http://www.php.net/manual/en/openssl.installation.php\".";
-App::$strings["Generate encryption keys"] = "Generar claves de cifrado";
-App::$strings["libCurl PHP module"] = "módulo libCurl PHP";
-App::$strings["GD graphics PHP module"] = "módulo PHP GD graphics";
-App::$strings["OpenSSL PHP module"] = "módulo PHP OpenSSL";
-App::$strings["PDO database PHP module"] = "Módulo PHP de la base de datos PDO ";
-App::$strings["mb_string PHP module"] = "módulo PHP mb_string";
-App::$strings["xml PHP module"] = "módulo PHP xml";
-App::$strings["Apache mod_rewrite module"] = "módulo Apache mod_rewrite ";
-App::$strings["Error: Apache webserver mod-rewrite module is required but not installed."] = "Error: se necesita el módulo del servidor web Apache mod-rewrite pero no está instalado.";
-App::$strings["exec"] = "ejecutable";
-App::$strings["Error: exec is required but is either not installed or has been disabled in php.ini"] = "Error: se necesita un ejecutable pero o no se instaló o está deshabilitado en php.ini";
-App::$strings["shell_exec"] = "shell_exec";
-App::$strings["Error: shell_exec is required but is either not installed or has been disabled in php.ini"] = "Error: se necesita shell_exec pero o no se instaló o está deshabilitado en php.ini";
-App::$strings["Error: libCURL PHP module required but not installed."] = "Error: se necesita el módulo PHP libCURL pero no está instalado.";
-App::$strings["Error: GD graphics PHP module with JPEG support required but not installed."] = "Error: el módulo PHP GD graphics es necesario, pero no está instalado.";
-App::$strings["Error: openssl PHP module required but not installed."] = "Error: el módulo PHP openssl es necesario, pero no está instalado.";
-App::$strings["Error: PDO database PHP module required but not installed."] = "Error: se necesita el módulo PHP de la base de datos PDO, pero no está instalado.";
-App::$strings["Error: mb_string PHP module required but not installed."] = "Error: el módulo PHP mb_string es necesario, pero no está instalado.";
-App::$strings["Error: xml PHP module required for DAV but not installed."] = "Error: el módulo PHP xml es necesario para DAV, pero no está instalado.";
-App::$strings["The web installer needs to be able to create a file called \".htconfig.php\" in the top folder of your web server and it is unable to do so."] = "El instalador web no ha podido crear un fichero llamado “.htconfig.php†en la carpeta base de su servidor.";
-App::$strings["This is most often a permission setting, as the web server may not be able to write files in your folder - even if you can."] = "Esto está generalmente ligado a un problema de permisos, a causa del cual el servidor web tiene prohibido modificar ficheros en su carpeta - incluso si usted mismo tiene esos permisos.";
-App::$strings["At the end of this procedure, we will give you a text to save in a file named .htconfig.php in your Red top folder."] = "Al término de este procedimiento, podemos crear un fichero de texto para guardar con el nombre .htconfig.php en el directorio raíz de su instalación de Hubzilla.";
-App::$strings["You can alternatively skip this procedure and perform a manual installation. Please see the file \"install/INSTALL.txt\" for instructions."] = "Como alternativa, puede dejar este procedimiento e intentar realizar una instalación manual. Lea, por favor, el fichero\"install/INSTALL.txt\" para las instrucciones.";
-App::$strings[".htconfig.php is writable"] = ".htconfig.php tiene permisos de escritura";
-App::$strings["This software uses the Smarty3 template engine to render its web views. Smarty3 compiles templates to PHP to speed up rendering."] = "Este software hace uso del motor de plantillas Smarty3 para diseñar sus plantillas gráficas. Smarty3 compila las plantillas a PHP para acelerar la renderización.";
-App::$strings["In order to store these compiled templates, the web server needs to have write access to the directory %s under the top level web folder."] = "Para poder guardar las plantillas compiladas, el servidor web necesita permisos para acceder al directorio %s en la carpeta web principal.";
-App::$strings["Please ensure that the user that your web server runs as (e.g. www-data) has write access to this folder."] = "Por favor, asegúrese de que el servidor web está siendo ejecutado por un usuario que tenga permisos de escritura sobre esta carpeta (por ejemplo, www-data).";
-App::$strings["Note: as a security measure, you should give the web server write access to %s only--not the template files (.tpl) that it contains."] = "Nota: como medida de seguridad, debe dar al servidor web permisos de escritura solo sobre %s - no sobre el fichero de plantilla (.tpl) que contiene.";
-App::$strings["%s is writable"] = "%s tiene permisos de escritura";
-App::$strings["This software uses the store directory to save uploaded files. The web server needs to have write access to the store directory under the top level web folder"] = "Este software utiliza el directorio de almacenamiento para guardar los ficheros subidos. El servidor web debe tener acceso de escritura a este directorio en la carpeta de nivel superior";
-App::$strings["store is writable"] = "\"store\" tiene permisos de escritura";
-App::$strings["SSL certificate cannot be validated. Fix certificate or disable https access to this site."] = "El certificado SSL no ha podido ser validado. Corrija este problema o desactive el acceso https a este sitio.";
-App::$strings["If you have https access to your website or allow connections to TCP port 443 (the https: port), you MUST use a browser-valid certificate. You MUST NOT use self-signed certificates!"] = "Si su servidor soporta conexiones cifradas SSL o si permite conexiones al puerto TCP 443 (el puerto usado por el protocolo https), debe utilizar un certificado válido. No debe usar un certificado firmado por usted mismo.";
-App::$strings["This restriction is incorporated because public posts from you may for example contain references to images on your own hub."] = "Se ha incorporado esta restricción para evitar que sus entradas públicas hagan referencia a imágenes en su propio servidor.";
-App::$strings["If your certificate is not recognized, members of other sites (who may themselves have valid certificates) will get a warning message on their own site complaining about security issues."] = "Si su certificado no ha sido reconocido, los miembros de otros sitios (con certificados válidos) recibirán mensajes de aviso en sus propios sitios web.";
-App::$strings["This can cause usability issues elsewhere (not just on your own site) so we must insist on this requirement."] = "Por razones de compatibilidad (sobre el conjunto de la red, no solo sobre su propio sitio), debemos insistir en estos requisitos.";
-App::$strings["Providers are available that issue free certificates which are browser-valid."] = "Existen varias Autoridades de Certificación que le pueden proporcionar certificados válidos.";
-App::$strings["If you are confident that the certificate is valid and signed by a trusted authority, check to see if you have failed to install an intermediate cert. These are not normally required by browsers, but are required for server-to-server communications."] = "Si se tiene la certeza de que el certificado es válido y está firmado por una autoridad de confianza, comprobar para ver si hubo un error al instalar un certificado intermedio. Estos no son normalmente requeridos por los navegadores, pero son necesarios para las comunicaciones de servidor a servidor.";
-App::$strings["SSL certificate validation"] = "validación del certificado SSL";
-App::$strings["Url rewrite in .htaccess is not working. Check your server configuration.Test: "] = "No se pueden reescribir las direcciones web en .htaccess. Compruebe la configuración de su servidor:";
-App::$strings["Url rewrite is working"] = "La reescritura de las direcciones funciona correctamente";
-App::$strings["The database configuration file \".htconfig.php\" could not be written. Please use the enclosed text to create a configuration file in your web server root."] = "El fichero de configuración de la base de datos .htconfig.php no se ha podido modificar. Por favor, copie el texto generado en un fichero con ese nombre en el directorio raíz de su servidor.";
-App::$strings["Errors encountered creating database tables."] = "Se han encontrado errores al crear las tablas de la base de datos.";
-App::$strings["<h1>What next</h1>"] = "<h1>Siguiente paso</h1>";
-App::$strings["IMPORTANT: You will need to [manually] setup a scheduled task for the poller."] = "IMPORTANTE: Debe crear [manualmente] una tarea programada para el \"poller\".";
-App::$strings["No connections."] = "Sin conexiones.";
-App::$strings["Visit %s's profile [%s]"] = "Visitar el perfil de %s [%s]";
-App::$strings["View Connections"] = "Ver conexiones";
+App::$strings["No more system notifications."] = "No hay más notificaciones del sistema";
+App::$strings["System Notifications"] = "Notificaciones del sistema";
+App::$strings["Channel added."] = "Canal añadido.";
+App::$strings["Your service plan only allows %d channels."] = "Su paquete de servicios solo permite %d canales.";
+App::$strings["No channel. Import failed."] = "No hay canal. La importación ha fallado";
+App::$strings["Import completed."] = "Importación completada.";
+App::$strings["You must be logged in to use this feature."] = "Debe estar registrado para poder usar esta funcionalidad.";
+App::$strings["Import Channel"] = "Importar canal";
+App::$strings["Use this form to import an existing channel from a different server/hub. You may retrieve the channel identity from the old server/hub via the network or provide an export file."] = "Emplee este formulario para importar un canal desde un servidor/hub diferente. Puede recuperar el canal desde el antiguo servidor/hub a través de la red o proporcionando un fichero de exportación.";
+App::$strings["Or provide the old server/hub details"] = "O proporcione los detalles de su antiguo servidor/hub";
+App::$strings["Your old identity address (xyz@example.com)"] = "Su identidad en el antiguo servidor (canal@ejemplo.com)";
+App::$strings["Your old login email address"] = "Su antigua dirección de correo electrónico";
+App::$strings["Your old login password"] = "Su antigua contraseña";
+App::$strings["For either option, please choose whether to make this hub your new primary address, or whether your old location should continue this role. You will be able to post from either location, but only one can be marked as the primary location for files, photos, and media."] = "Para cualquiera de las opciones, elija si hacer de este servidor su nueva dirección primaria, o si su antigua dirección debe continuar con este papel. Usted podrá publicar desde cualquier ubicación, pero sólo una puede estar marcada como la ubicación principal para los ficheros, fotos y otras imágenes o vídeos.";
+App::$strings["Make this hub my primary location"] = "Convertir este servidor en mi ubicación primaria";
+App::$strings["Move this channel (disable all previous locations)"] = "Mover este canal (desactivar todas las ubicaciones anteriores)";
+App::$strings["Import a few months of posts if possible (limited by available memory"] = "Importar unos meses de mensajes si es posible (limitado por la memoria disponible";
+App::$strings["This process may take several minutes to complete. Please submit the form only once and leave this page open until finished."] = "Este proceso puede tardar varios minutos en completarse. Por favor envíe el formulario una sola vez y mantenga esta página abierta hasta que termine.";
+App::$strings["Authentication failed."] = "Falló la autenticación.";
+App::$strings["Remote Authentication"] = "Acceso desde su servidor";
+App::$strings["Enter your channel address (e.g. channel@example.com)"] = "Introduzca la dirección del canal (p.ej. canal@ejemplo.com)";
+App::$strings["Authenticate"] = "Acceder";
+App::$strings["Channel not found."] = "Canal no encontrado.";
+App::$strings["Permissions denied."] = "Permisos denegados.";
+App::$strings["Import"] = "Importar";
+App::$strings["Authorize application connection"] = "Autorizar una conexión de aplicación";
+App::$strings["Return to your app and insert this Security Code:"] = "Vuelva a su aplicación e introduzca este código de seguridad: ";
+App::$strings["Please login to continue."] = "Por favor inicie sesión para continuar.";
+App::$strings["Do you want to authorize this application to access your posts and contacts, and/or create new posts for you?"] = "¿Desea autorizar a esta aplicación a acceder a sus publicaciones y contactos, y/o crear nuevas publicaciones por usted?";
+App::$strings["Item not available."] = "Elemento no disponible";
+App::$strings["Insert web link"] = "Insertar enlace web";
+App::$strings["Title (optional)"] = "Título (opcional)";
+App::$strings["Edit Block"] = "Modificar este bloque";
+App::$strings["vcard"] = "vcard";
+App::$strings["Apps"] = "Aplicaciones (apps)";
+App::$strings["Manage apps"] = "Gestionar las aplicaciones";
+App::$strings["Create new app"] = "Crear una nueva aplicación";
+App::$strings["__ctx:mood__ %1\$s is %2\$s"] = "%1\$s está %2\$s";
+App::$strings["Mood"] = "Estado de ánimo";
+App::$strings["Set your current mood and tell your friends"] = "Describir su estado de ánimo para comunicárselo a sus amigos";
+App::$strings["Blocked"] = "Bloqueadas";
+App::$strings["Ignored"] = "Ignoradas";
+App::$strings["Hidden"] = "Ocultas";
+App::$strings["Archived"] = "Archivadas";
+App::$strings["New"] = "Nuevas";
+App::$strings["All"] = "Todos/as";
+App::$strings["New Connections"] = "Nuevas conexiones";
+App::$strings["Show pending (new) connections"] = "Mostrar conexiones (nuevas) pendientes";
+App::$strings["Show all connections"] = "Mostrar todas las conexiones";
+App::$strings["Only show blocked connections"] = "Mostrar solo las conexiones bloqueadas";
+App::$strings["Only show ignored connections"] = "Mostrar solo conexiones ignoradas";
+App::$strings["Only show archived connections"] = "Mostrar solo las conexiones archivadas";
+App::$strings["Only show hidden connections"] = "Mostrar solo las conexiones ocultas";
+App::$strings["Pending approval"] = "Pendiente de aprobación";
+App::$strings["%1\$s [%2\$s]"] = "%1\$s [%2\$s]";
+App::$strings["Edit connection"] = "Editar conexión";
+App::$strings["Delete connection"] = "Eliminar conexión";
+App::$strings["Channel address"] = "Dirección del canal";
+App::$strings["Network"] = "Red";
+App::$strings["Call"] = "Llamar";
+App::$strings["Status"] = "Estado";
+App::$strings["Connected"] = "Conectado/a";
+App::$strings["Approve connection"] = "Aprobar esta conexión";
+App::$strings["Ignore connection"] = "Ignorar esta conexión";
+App::$strings["Ignore"] = "Ignorar";
+App::$strings["Recent activity"] = "Actividad reciente";
+App::$strings["Connections"] = "Conexiones";
+App::$strings["Search your connections"] = "Buscar sus conexiones";
+App::$strings["Connections search"] = "Buscar conexiones";
+App::$strings["Find"] = "Encontrar";
+App::$strings["item"] = "elemento";
+App::$strings["Source of Item"] = "Origen del elemento";
+App::$strings["Bookmark added"] = "Marcador añadido";
+App::$strings["My Bookmarks"] = "Mis marcadores";
+App::$strings["My Connections Bookmarks"] = "Marcadores de mis conexiones";
+App::$strings["Account removals are not allowed within 48 hours of changing the account password."] = "La eliminación de cuentas no está permitida hasta después de que hayan transcurrido 48 horas desde el último cambio de contraseña.";
+App::$strings["Remove This Account"] = "Eliminar esta cuenta";
+App::$strings["This account and all its channels will be completely removed from the network. "] = "Esta cuenta y todos sus canales van a ser eliminados de la red.";
+App::$strings["Remove this account, all its channels and all its channel clones from the network"] = "Remover esta cuenta, todos sus canales y clones de la red";
+App::$strings["By default only the instances of the channels located on this hub will be removed from the network"] = "Por defecto, solo las instancias de los canales ubicados en este servidor serán eliminados de la red";
+App::$strings["Page owner information could not be retrieved."] = "La información del propietario de la página no pudo ser recuperada.";
+App::$strings["Album not found."] = "Ãlbum no encontrado.";
+App::$strings["Delete Album"] = "Borrar álbum";
+App::$strings["Delete Photo"] = "Borrar foto";
+App::$strings["No photos selected"] = "No hay fotos seleccionadas";
+App::$strings["Access to this item is restricted."] = "El acceso a este elemento está restringido.";
+App::$strings["%1$.2f MB of %2$.2f MB photo storage used."] = "%1$.2f MB de %2$.2f MB de almacenamiento de fotos utilizado.";
+App::$strings["%1$.2f MB photo storage used."] = "%1$.2f MB de almacenamiento de fotos utilizado.";
+App::$strings["Upload Photos"] = "Subir fotos";
+App::$strings["Enter an album name"] = "Introducir un nombre de álbum";
+App::$strings["or select an existing album (doubleclick)"] = "o seleccionar uno existente (doble click)";
+App::$strings["Create a status post for this upload"] = "Crear un mensaje de estado para esta subida";
+App::$strings["Caption (optional):"] = "Título (opcional):";
+App::$strings["Description (optional):"] = "Descripción (opcional):";
+App::$strings["Show Newest First"] = "Mostrar lo más reciente primero";
+App::$strings["Show Oldest First"] = "Mostrar lo más antiguo primero";
+App::$strings["Permission denied. Access to this item may be restricted."] = "Permiso denegado. El acceso a este elemento puede estar restringido.";
+App::$strings["Photo not available"] = "Foto no disponible";
+App::$strings["Use as profile photo"] = "Usar como foto del perfil";
+App::$strings["Use as cover photo"] = "Usar como imagen de portada del perfil";
+App::$strings["Private Photo"] = "Foto privada";
+App::$strings["View Full Size"] = "Ver tamaño completo";
+App::$strings["Edit photo"] = "Editar foto";
+App::$strings["Rotate CW (right)"] = "Girar CW (a la derecha)";
+App::$strings["Rotate CCW (left)"] = "Girar CCW (a la izquierda)";
+App::$strings["Move photo to album"] = "Mover la foto a un álbum";
+App::$strings["Enter a new album name"] = "Introducir un nuevo nombre de álbum";
+App::$strings["or select an existing one (doubleclick)"] = "o seleccionar uno (doble click) existente";
+App::$strings["Caption"] = "Título";
+App::$strings["Add a Tag"] = "Añadir una etiqueta";
+App::$strings["Example: @bob, @Barbara_Jensen, @jim@example.com"] = "Ejemplos: @eva, @Carmen_Osuna, @jaime@ejemplo.com";
+App::$strings["Flag as adult in album view"] = "Marcar como \"solo para adultos\" en el álbum";
+App::$strings["I like this (toggle)"] = "Me gusta (cambiar)";
+App::$strings["I don't like this (toggle)"] = "No me gusta esto (cambiar)";
+App::$strings["Please wait"] = "Espere por favor";
+App::$strings["This is you"] = "Este es usted";
+App::$strings["Comment"] = "Comentar";
+App::$strings["__ctx:title__ Likes"] = "Me gusta";
+App::$strings["__ctx:title__ Dislikes"] = "No me gusta";
+App::$strings["__ctx:title__ Agree"] = "De acuerdo";
+App::$strings["__ctx:title__ Disagree"] = "En desacuerdo";
+App::$strings["__ctx:title__ Abstain"] = "Abstención";
+App::$strings["__ctx:title__ Attending"] = "Participaré";
+App::$strings["__ctx:title__ Not attending"] = "No participaré";
+App::$strings["__ctx:title__ Might attend"] = "Quizá participe";
+App::$strings["View all"] = "Ver todo";
+App::$strings["__ctx:noun__ Like"] = array(
+ 0 => "Me gusta",
+ 1 => "Me gusta",
+);
+App::$strings["__ctx:noun__ Dislike"] = array(
+ 0 => "No me gusta",
+ 1 => "No me gusta",
+);
+App::$strings["Photo Tools"] = "Gestión de las fotos";
+App::$strings["In This Photo:"] = "En esta foto:";
+App::$strings["Map"] = "Mapa";
+App::$strings["__ctx:noun__ Likes"] = "Me gusta";
+App::$strings["__ctx:noun__ Dislikes"] = "No me gusta";
+App::$strings["Close"] = "Cerrar";
+App::$strings["Recent Photos"] = "Fotos recientes";
App::$strings["Profile Unavailable."] = "Perfil no disponible";
App::$strings["Not found"] = "No encontrado";
App::$strings["Invalid channel"] = "Canal no válido";
App::$strings["Wikis"] = "Wikis";
App::$strings["Download"] = "Descargar";
+App::$strings["Create New"] = "Crear";
App::$strings["Wiki name"] = "Nombre del wiki";
App::$strings["Content type"] = "Tipo de contenido";
+App::$strings["Type"] = "Tipo";
App::$strings["Create a status post for this wiki"] = "Crear un mensaje de estado para este wiki";
App::$strings["Wiki not found"] = "Wiki no encontrado";
App::$strings["Rename page"] = "Renombrar la página";
App::$strings["Error retrieving page content"] = "Error al recuperar el contenido de la página";
+App::$strings["New page"] = "Nueva página";
App::$strings["Revision Comparison"] = "Comparación de revisiones";
App::$strings["Revert"] = "Revertir";
App::$strings["Short description of your changes (optional)"] = "Breve descripción de sus cambios (opcional)";
@@ -1522,6 +973,7 @@ App::$strings["Error getting album list"] = "Error al obtener la lista de álbum
App::$strings["Error getting photo link"] = "Error al obtener el enlace de la foto";
App::$strings["Error getting album"] = "Error al obtener el álbum";
App::$strings["Error creating wiki. Invalid name."] = "Error al crear el wiki: el nombre no es válido.";
+App::$strings["A wiki with this name already exists."] = "Ya hay un wiki con este nombre.";
App::$strings["Wiki created, but error creating Home page."] = "Se ha creado el wiki, pero se ha producido un error al crear la página de inicio.";
App::$strings["Error creating wiki"] = "Error al crear el wiki";
App::$strings["Wiki delete permission denied."] = "Se ha denegado el permiso para eliminar el wiki.";
@@ -1531,12 +983,152 @@ App::$strings["Cannot delete Home"] = "No se puede eliminar la página principal
App::$strings["Current Revision"] = "Revisión actual";
App::$strings["Selected Revision"] = "Revisión seleccionada";
App::$strings["You must be authenticated."] = "Debe estar autenticado.";
+App::$strings["toggle full screen mode"] = "cambiar al modo de pantalla completa";
+App::$strings["Layout updated."] = "Plantilla actualizada.";
+App::$strings["Feature disabled."] = "Funcionalidad deshabilitada.";
+App::$strings["Edit System Page Description"] = "Editor del Sistema de Descripción de Páginas";
+App::$strings["Layout not found."] = "Plantilla no encontrada";
+App::$strings["Module Name:"] = "Nombre del módulo:";
+App::$strings["Layout Help"] = "Ayuda para el diseño de plantillas de página";
+App::$strings["Poke"] = "Toques y otras cosas";
+App::$strings["Poke somebody"] = "Dar un toque a alguien";
+App::$strings["Poke/Prod"] = "Toque/Incitación";
+App::$strings["Poke, prod or do other things to somebody"] = "Dar un toque, incitar o hacer otras cosas a alguien";
+App::$strings["Recipient"] = "Destinatario";
+App::$strings["Choose what you wish to do to recipient"] = "Elegir qué desea enviar al destinatario";
+App::$strings["Make this post private"] = "Convertir en privado este envío";
+App::$strings["Image uploaded but image cropping failed."] = "Imagen actualizada, pero el recorte de la imagen ha fallado. ";
+App::$strings["Profile Photos"] = "Fotos del perfil";
+App::$strings["Image resize failed."] = "El ajuste del tamaño de la imagen ha fallado.";
+App::$strings["Shift-reload the page or clear browser cache if the new photo does not display immediately."] = "Recargue la página o limpie el caché del navegador si la nueva foto no se muestra inmediatamente.";
+App::$strings["Unable to process image"] = "No ha sido posible procesar la imagen";
+App::$strings["Image upload failed."] = "La carga de la imagen ha fallado.";
+App::$strings["Unable to process image."] = "No ha sido posible procesar la imagen.";
+App::$strings["Photo not available."] = "Foto no disponible.";
+App::$strings["Upload File:"] = "Subir fichero:";
+App::$strings["Select a profile:"] = "Seleccionar un perfil:";
+App::$strings["Use Photo for Profile"] = "Usar la fotografía para el perfil";
+App::$strings["Upload Profile Photo"] = "Subir foto de perfil";
+App::$strings["Use"] = "Usar";
+App::$strings["skip this step"] = "Omitir este paso";
+App::$strings["select a photo from your photo albums"] = "Seleccione una foto de sus álbumes de fotos";
+App::$strings["Crop Image"] = "Recortar imagen";
+App::$strings["Please adjust the image cropping for optimum viewing."] = "Por favor ajuste el recorte de la imagen para una visión óptima.";
+App::$strings["Done Editing"] = "Edición completada";
+App::$strings["Away"] = "Ausente";
+App::$strings["Online"] = "Conectado/a";
+App::$strings["Unable to locate original post."] = "No ha sido posible encontrar la entrada original.";
+App::$strings["Empty post discarded."] = "La entrada vacía ha sido desechada.";
+App::$strings["Duplicate post suppressed."] = "Se ha suprimido la entrada duplicada.";
+App::$strings["System error. Post not saved."] = "Error del sistema. La entrada no se ha podido salvar.";
+App::$strings["Unable to obtain post information from database."] = "No ha sido posible obtener información de la entrada en la base de datos.";
+App::$strings["You have reached your limit of %1$.0f top level posts."] = "Ha alcanzado su límite de %1$.0f entradas en la página principal.";
+App::$strings["You have reached your limit of %1$.0f webpages."] = "Ha alcanzado su límite de %1$.0f páginas web.";
+App::$strings["sent you a private message"] = "le ha enviado un mensaje privado";
+App::$strings["added your channel"] = "añadió este canal a sus conexiones";
+App::$strings["g A l F d"] = "g A l d F";
+App::$strings["[today]"] = "[hoy]";
+App::$strings["posted an event"] = "publicó un evento";
+App::$strings["Invalid item."] = "Elemento no válido.";
+App::$strings["Page not found."] = "Página no encontrada.";
+App::$strings["Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."] = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";
+App::$strings["Could not access contact record."] = "No se ha podido acceder al registro de contacto.";
+App::$strings["Could not locate selected profile."] = "No se ha podido localizar el perfil seleccionado.";
+App::$strings["Connection updated."] = "Conexión actualizada.";
+App::$strings["Failed to update connection record."] = "Error al actualizar el registro de la conexión.";
+App::$strings["is now connected to"] = "ahora está conectado/a";
+App::$strings["Could not access address book record."] = "No se pudo acceder al registro en su libreta de direcciones.";
+App::$strings["Refresh failed - channel is currently unavailable."] = "Recarga fallida - no se puede encontrar el canal en este momento.";
+App::$strings["Unable to set address book parameters."] = "No ha sido posible establecer los parámetros de la libreta de direcciones.";
+App::$strings["Connection has been removed."] = "La conexión ha sido eliminada.";
+App::$strings["View Profile"] = "Ver el perfil";
+App::$strings["View %s's profile"] = "Ver el perfil de %s";
+App::$strings["Refresh Permissions"] = "Recargar los permisos";
+App::$strings["Fetch updated permissions"] = "Obtener los permisos actualizados";
+App::$strings["Refresh Photo"] = "Actualizar la foto";
+App::$strings["Fetch updated photo"] = "Obtener una foto actualizada";
+App::$strings["Recent Activity"] = "Actividad reciente";
+App::$strings["View recent posts and comments"] = "Ver publicaciones y comentarios recientes";
+App::$strings["Block (or Unblock) all communications with this connection"] = "Bloquear (o desbloquear) todas las comunicaciones con esta conexión";
+App::$strings["This connection is blocked!"] = "¡Esta conexión está bloqueada!";
+App::$strings["Unignore"] = "Dejar de ignorar";
+App::$strings["Ignore (or Unignore) all inbound communications from this connection"] = "Ignorar (o dejar de ignorar) todas las comunicaciones entrantes de esta conexión";
+App::$strings["This connection is ignored!"] = "¡Esta conexión es ignorada!";
+App::$strings["Unarchive"] = "Desarchivar";
+App::$strings["Archive"] = "Archivar";
+App::$strings["Archive (or Unarchive) this connection - mark channel dead but keep content"] = "Archiva (o desarchiva) esta conexión - marca el canal como muerto aunque mantiene sus contenidos";
+App::$strings["This connection is archived!"] = "¡Esta conexión esta archivada!";
+App::$strings["Unhide"] = "Mostrar";
+App::$strings["Hide"] = "Ocultar";
+App::$strings["Hide or Unhide this connection from your other connections"] = "Ocultar o mostrar esta conexión a sus otras conexiones";
+App::$strings["This connection is hidden!"] = "¡Esta conexión está oculta!";
+App::$strings["Delete this connection"] = "Eliminar esta conexión";
+App::$strings["Fetch Vcard"] = "Obtener una vcard";
+App::$strings["Fetch electronic calling card for this connection"] = "Obtener una tarjeta de llamada electrónica para esta conexión";
+App::$strings["Open Individual Permissions section by default"] = "Abrir la sección de permisos individuales por defecto";
+App::$strings["Affinity"] = "Afinidad";
+App::$strings["Open Set Affinity section by default"] = "Abrir por defecto la sección para definir la afinidad";
+App::$strings["Me"] = "Yo";
+App::$strings["Family"] = "Familia";
+App::$strings["Acquaintances"] = "Conocidos/as";
+App::$strings["Filter"] = "Filtrar";
+App::$strings["Open Custom Filter section by default"] = "Abrir por defecto la sección de personalización de filtros";
+App::$strings["Approve this connection"] = "Aprobar esta conexión";
+App::$strings["Accept connection to allow communication"] = "Aceptar la conexión para permitir la comunicación";
+App::$strings["Set Affinity"] = "Ajustar la afinidad";
+App::$strings["Set Profile"] = "Ajustar el perfil";
+App::$strings["Set Affinity & Profile"] = "Ajustar la afinidad y el perfil";
+App::$strings["none"] = "-";
+App::$strings["Connection Default Permissions"] = "Permisos predeterminados de conexión";
+App::$strings["Connection: %s"] = "Conexión: %s";
+App::$strings["Apply these permissions automatically"] = "Aplicar estos permisos automaticamente";
+App::$strings["Connection requests will be approved without your interaction"] = "Las solicitudes de conexión serán aprobadas sin su intervención";
+App::$strings["Permission role"] = "Rol de acceso";
+App::$strings["Add permission role"] = "Añadir un rol de acceso";
+App::$strings["This connection's primary address is"] = "La dirección primaria de esta conexión es";
+App::$strings["Available locations:"] = "Ubicaciones disponibles:";
+App::$strings["The permissions indicated on this page will be applied to all new connections."] = "Los permisos indicados en esta página serán aplicados en todas las nuevas conexiones.";
+App::$strings["Connection Tools"] = "Gestión de las conexiones";
+App::$strings["Slide to adjust your degree of friendship"] = "Deslizar para ajustar el grado de amistad";
+App::$strings["Rating"] = "Valoración";
+App::$strings["Slide to adjust your rating"] = "Deslizar para ajustar su valoración";
+App::$strings["Optionally explain your rating"] = "Opcionalmente, puede explicar su valoración";
+App::$strings["Custom Filter"] = "Filtro personalizado";
+App::$strings["Only import posts with this text"] = "Importar solo entradas que contengan este texto";
+App::$strings["words one per line or #tags or /patterns/ or lang=xx, leave blank to import all posts"] = "Una sola opción por línea: palabras, #etiquetas, /patrones/ o lang=xx. Dejar en blanco para importarlo todo";
+App::$strings["Do not import posts with this text"] = "No importar entradas que contengan este texto";
+App::$strings["This information is public!"] = "¡Esta información es pública!";
+App::$strings["Connection Pending Approval"] = "Conexión pendiente de aprobación";
+App::$strings["Please choose the profile you would like to display to %s when viewing your profile securely."] = "Por favor, escoja el perfil que quiere mostrar a %s cuando esté viendo su perfil de forma segura.";
+App::$strings["Some permissions may be inherited from your channel's <a href=\"settings\"><strong>privacy settings</strong></a>, which have higher priority than individual settings. You can change those settings here but they wont have any impact unless the inherited setting changes."] = "Algunos permisos pueden ser heredados de los <a href=\"settings\"><strong>ajustes de privacidad</strong></a> de sus canales, los cuales tienen una prioridad más alta que los ajustes individuales. Puede cambiar estos ajustes aquí, pero no tendrán ningún consecuencia hasta que cambie los ajustes heredados.";
+App::$strings["Last update:"] = "Última actualización:";
+App::$strings["Details"] = "Detalles";
+App::$strings["Organisation"] = "Organización";
+App::$strings["Title"] = "Título";
+App::$strings["Phone"] = "Teléfono";
+App::$strings["Instant messenger"] = "Mensajería instantánea";
+App::$strings["Website"] = "Sitio web";
+App::$strings["Note"] = "Nota";
+App::$strings["Mobile"] = "Móvil";
+App::$strings["Home"] = "Inicio";
+App::$strings["Work"] = "Trabajo";
+App::$strings["Add Contact"] = "Añadir un contacto";
+App::$strings["Add Field"] = "Añadir un campo";
+App::$strings["P.O. Box"] = "Buzón de correos";
+App::$strings["Additional"] = "Adicional";
+App::$strings["Street"] = "Calle";
+App::$strings["Locality"] = "Localidad";
+App::$strings["Region"] = "Provincia, región o estado";
+App::$strings["ZIP Code"] = "Código postal";
+App::$strings["Country"] = "País";
App::$strings["Room not found"] = "Sala no encontrada";
App::$strings["Leave Room"] = "Abandonar la sala";
App::$strings["Delete Room"] = "Eliminar esta sala";
App::$strings["I am away right now"] = "Estoy ausente momentáneamente";
App::$strings["I am online"] = "Estoy conectado/a";
App::$strings["Bookmark this room"] = "Añadir esta sala a Marcadores";
+App::$strings["Please enter a link URL:"] = "Por favor, introduzca la dirección del enlace:";
+App::$strings["Encrypt text"] = "Cifrar texto";
App::$strings["New Chatroom"] = "Nueva sala de chat";
App::$strings["Chatroom name"] = "Nombre de la sala de chat";
App::$strings["Expiration of chats (minutes)"] = "Caducidad de los mensajes en los chats (en minutos)";
@@ -1544,8 +1136,463 @@ App::$strings["%1\$s's Chatrooms"] = "Salas de chat de %1\$s";
App::$strings["No chatrooms available"] = "No hay salas de chat disponibles";
App::$strings["Expiration"] = "Caducidad";
App::$strings["min"] = "min";
+App::$strings["Photos"] = "Fotos";
+App::$strings["Files"] = "Ficheros";
+App::$strings["Unable to update menu."] = "No se puede actualizar el menú.";
+App::$strings["Unable to create menu."] = "No se puede crear el menú.";
+App::$strings["Menu Name"] = "Nombre del menú";
+App::$strings["Unique name (not visible on webpage) - required"] = "Nombre único (no será visible en la página web) - requerido";
+App::$strings["Menu Title"] = "Título del menú";
+App::$strings["Visible on webpage - leave empty for no title"] = "Visible en la página web - no ponga nada si no desea un título";
+App::$strings["Allow Bookmarks"] = "Permitir marcadores";
+App::$strings["Menu may be used to store saved bookmarks"] = "El menú se puede usar para guardar marcadores";
+App::$strings["Submit and proceed"] = "Enviar y proceder";
+App::$strings["Menus"] = "Menús";
+App::$strings["Bookmarks allowed"] = "Marcadores permitidos";
+App::$strings["Delete this menu"] = "Borrar este menú";
+App::$strings["Edit menu contents"] = "Editar los contenidos del menú";
+App::$strings["Edit this menu"] = "Modificar este menú";
+App::$strings["Menu could not be deleted."] = "El menú no puede ser eliminado.";
+App::$strings["Edit Menu"] = "Modificar el menú";
+App::$strings["Add or remove entries to this menu"] = "Añadir o quitar entradas en este menú";
+App::$strings["Menu name"] = "Nombre del menú";
+App::$strings["Must be unique, only seen by you"] = "Debe ser único, solo será visible para usted";
+App::$strings["Menu title"] = "Título del menú";
+App::$strings["Menu title as seen by others"] = "El título del menú tal como será visto por los demás";
+App::$strings["Allow bookmarks"] = "Permitir marcadores";
+App::$strings["Layouts"] = "Plantillas";
+App::$strings["Help"] = "Ayuda";
+App::$strings["Comanche page description language help"] = "Página de ayuda del lenguaje de descripción de páginas (PDL) Comanche";
+App::$strings["Layout Description"] = "Descripción de la plantilla";
+App::$strings["Download PDL file"] = "Descargar el fichero PDL";
+App::$strings["post"] = "la entrada";
+App::$strings["comment"] = "el comentario";
+App::$strings["%1\$s tagged %2\$s's %3\$s with %4\$s"] = "%1\$s ha etiquetado %3\$s de %2\$s con %4\$s";
+App::$strings["This setting requires special processing and editing has been blocked."] = "Este ajuste necesita de un proceso especial y la edición ha sido bloqueada.";
+App::$strings["Configuration Editor"] = "Editor de configuración";
+App::$strings["Warning: Changing some settings could render your channel inoperable. Please leave this page unless you are comfortable with and knowledgeable about how to correctly use this feature."] = "Atención: El cambio de algunos ajustes puede volver inutilizable su canal. Por favor, abandone la página excepto que esté seguro y sepa cómo usar correctamente esta característica.";
+App::$strings["Privacy group created."] = "El grupo de canales ha sido creado.";
+App::$strings["Could not create privacy group."] = "No se puede crear el grupo de canales";
+App::$strings["Privacy group not found."] = "Grupo de canales no encontrado.";
+App::$strings["Privacy group updated."] = "Grupo de canales actualizado.";
+App::$strings["Create a group of channels."] = "Crear un grupo de canales.";
+App::$strings["Privacy group name: "] = "Nombre del grupo de canales:";
+App::$strings["Members are visible to other channels"] = "Los miembros son visibles para otros canales";
+App::$strings["Privacy group removed."] = "Grupo de canales eliminado.";
+App::$strings["Unable to remove privacy group."] = "No se puede eliminar el grupo de canales.";
+App::$strings["Privacy group editor"] = "Editor de grupos de canales";
+App::$strings["Members"] = "Miembros";
+App::$strings["All Connected Channels"] = "Todos los canales conectados";
+App::$strings["Click on a channel to add or remove."] = "Haga clic en un canal para agregarlo o quitarlo.";
+App::$strings["Profile not found."] = "Perfil no encontrado.";
+App::$strings["Profile deleted."] = "Perfil eliminado.";
+App::$strings["Profile-"] = "Perfil-";
+App::$strings["New profile created."] = "El nuevo perfil ha sido creado.";
+App::$strings["Profile unavailable to clone."] = "Perfil no disponible para clonar.";
+App::$strings["Profile unavailable to export."] = "Perfil no disponible para exportar.";
+App::$strings["Profile Name is required."] = "Se necesita el nombre del perfil.";
+App::$strings["Marital Status"] = "Estado civil";
+App::$strings["Romantic Partner"] = "Pareja sentimental";
+App::$strings["Likes"] = "Me gusta";
+App::$strings["Dislikes"] = "No me gusta";
+App::$strings["Work/Employment"] = "Trabajo:";
+App::$strings["Religion"] = "Religión";
+App::$strings["Political Views"] = "Ideas políticas";
+App::$strings["Gender"] = "Género";
+App::$strings["Sexual Preference"] = "Preferencia sexual";
+App::$strings["Homepage"] = "Página personal";
+App::$strings["Interests"] = "Intereses";
+App::$strings["Profile updated."] = "Perfil actualizado.";
+App::$strings["Hide your connections list from viewers of this profile"] = "Ocultar la lista de conexiones a los visitantes del perfil";
+App::$strings["Edit Profile Details"] = "Modificar los detalles de este perfil";
+App::$strings["View this profile"] = "Ver este perfil";
+App::$strings["Edit visibility"] = "Editar visibilidad";
+App::$strings["Profile Tools"] = "Gestión del perfil";
+App::$strings["Change cover photo"] = "Cambiar la imagen de portada del perfil";
+App::$strings["Change profile photo"] = "Cambiar la foto del perfil";
+App::$strings["Create a new profile using these settings"] = "Crear un nuevo perfil usando estos ajustes";
+App::$strings["Clone this profile"] = "Clonar este perfil";
+App::$strings["Delete this profile"] = "Eliminar este perfil";
+App::$strings["Add profile things"] = "Añadir cosas al perfil";
+App::$strings["Personal"] = "Personales";
+App::$strings["Relation"] = "Relación";
+App::$strings["Miscellaneous"] = "Varios";
+App::$strings["Import profile from file"] = "Importar perfil desde un fichero";
+App::$strings["Export profile to file"] = "Exportar perfil a un fichero";
+App::$strings["Your gender"] = "Género";
+App::$strings["Marital status"] = "Estado civil";
+App::$strings["Sexual preference"] = "Preferencia sexual";
+App::$strings["Profile name"] = "Nombre del perfil";
+App::$strings["This is your default profile."] = "Este es su perfil principal.";
+App::$strings["Your full name"] = "Nombre completo";
+App::$strings["Title/Description"] = "Título o descripción";
+App::$strings["Street address"] = "Dirección";
+App::$strings["Locality/City"] = "Ciudad";
+App::$strings["Region/State"] = "Región o Estado";
+App::$strings["Postal/Zip code"] = "Código postal";
+App::$strings["Who (if applicable)"] = "Quién (si es pertinente)";
+App::$strings["Examples: cathy123, Cathy Williams, cathy@example.com"] = "Por ejemplo: ana123, María González, sara@ejemplo.com";
+App::$strings["Since (date)"] = "Desde (fecha)";
+App::$strings["Tell us about yourself"] = "Háblenos de usted";
+App::$strings["Homepage URL"] = "Dirección de la página personal";
+App::$strings["Hometown"] = "Lugar de nacimiento";
+App::$strings["Political views"] = "Ideas políticas";
+App::$strings["Religious views"] = "Creencias religiosas";
+App::$strings["Keywords used in directory listings"] = "Palabras clave utilizadas en los listados de directorios";
+App::$strings["Example: fishing photography software"] = "Por ejemplo: software de fotografía submarina";
+App::$strings["Musical interests"] = "Preferencias musicales";
+App::$strings["Books, literature"] = "Libros, literatura";
+App::$strings["Television"] = "Televisión";
+App::$strings["Film/Dance/Culture/Entertainment"] = "Cine, danza, cultura, entretenimiento";
+App::$strings["Hobbies/Interests"] = "Aficiones o intereses";
+App::$strings["Love/Romance"] = "Vida sentimental o amorosa";
+App::$strings["School/Education"] = "Estudios";
+App::$strings["Contact information and social networks"] = "Información de contacto y redes sociales";
+App::$strings["My other channels"] = "Mis otros canales";
+App::$strings["Communications"] = "Comunicaciones";
+App::$strings["Profile Image"] = "Imagen del perfil";
+App::$strings["Edit Profiles"] = "Editar perfiles";
+App::$strings["Page link"] = "Enlace de la página";
+App::$strings["Edit Webpage"] = "Editar la página web";
+App::$strings["Create a new channel"] = "Crear un nuevo canal";
+App::$strings["Channel Manager"] = "Administración de canales";
+App::$strings["Current Channel"] = "Canal actual";
+App::$strings["Switch to one of your channels by selecting it."] = "Cambiar a uno de sus canales seleccionándolo.";
+App::$strings["Default Channel"] = "Canal principal";
+App::$strings["Make Default"] = "Convertir en predeterminado";
+App::$strings["%d new messages"] = "%d mensajes nuevos";
+App::$strings["%d new introductions"] = "%d nuevas solicitudes de conexión";
+App::$strings["Delegated Channel"] = "Canal delegado";
+App::$strings["This directory server requires an access token"] = "El servidor de este directorio necesita un \"token\" de acceso";
+App::$strings["About this site"] = "Acerca de este sitio";
+App::$strings["Site Name"] = "Nombre del sitio";
+App::$strings["Administrator"] = "Administrador";
+App::$strings["Terms of Service"] = "Términos del servicio";
+App::$strings["Software and Project information"] = "Información sobre el software y el proyecto";
+App::$strings["This site is powered by \$Projectname"] = "Este sitio funciona con \$Projectname";
+App::$strings["Federated and decentralised networking and identity services provided by Zot"] = "Servicios federados y descentralizados de identidad y redes proporcionados por Zot";
+App::$strings["Version %s"] = "Versión %s";
+App::$strings["Project homepage"] = "Página principal del proyecto";
+App::$strings["Developer homepage"] = "Página principal del desarrollador";
+App::$strings["No ratings"] = "Ninguna valoración";
+App::$strings["Ratings"] = "Valoraciones";
+App::$strings["Rating: "] = "Valoración:";
+App::$strings["Website: "] = "Sitio web:";
+App::$strings["Description: "] = "Descripción:";
+App::$strings["Import Webpage Elements"] = "Importar elementos de una página web";
+App::$strings["Import selected"] = "Importar elementos seleccionados";
+App::$strings["Export Webpage Elements"] = "Exportar elementos de una página web";
+App::$strings["Export selected"] = "Exportar los elementos seleccionados";
+App::$strings["Webpages"] = "Páginas web";
+App::$strings["Actions"] = "Acciones";
+App::$strings["Page Link"] = "Vínculo de la página";
+App::$strings["Page Title"] = "Título de página";
+App::$strings["Invalid file type."] = "Tipo de fichero no válido.";
+App::$strings["Error opening zip file"] = "Error al abrir el fichero comprimido zip";
+App::$strings["Invalid folder path."] = "La ruta de la carpeta no es válida.";
+App::$strings["No webpage elements detected."] = "No se han detectado elementos de ninguna página web.";
+App::$strings["Import complete."] = "Importación completada.";
+App::$strings["Item is not editable"] = "El elemento no es editable";
+App::$strings["Edit post"] = "Editar la entrada";
+App::$strings["Invalid message"] = "Mensaje no válido";
+App::$strings["no results"] = "sin resultados";
+App::$strings["channel sync processed"] = "se ha realizado la sincronización del canal";
+App::$strings["queued"] = "encolado";
+App::$strings["posted"] = "enviado";
+App::$strings["accepted for delivery"] = "aceptado para el envío";
+App::$strings["updated"] = "actualizado";
+App::$strings["update ignored"] = "actualización ignorada";
+App::$strings["permission denied"] = "permiso denegado";
+App::$strings["recipient not found"] = "destinatario no encontrado";
+App::$strings["mail recalled"] = "mensaje de correo revocado";
+App::$strings["duplicate mail received"] = "se ha recibido mensaje duplicado";
+App::$strings["mail delivered"] = "correo enviado";
+App::$strings["Delivery report for %1\$s"] = "Informe de entrega para %1\$s";
+App::$strings["Options"] = "Opciones";
+App::$strings["Redeliver"] = "Volver a enviar";
+App::$strings["Failed to create source. No channel selected."] = "No se ha podido crear el origen de los contenidos. No ha sido seleccionado ningún canal.";
+App::$strings["Source created."] = "Fuente creada.";
+App::$strings["Source updated."] = "Fuente actualizada.";
+App::$strings["*"] = "*";
+App::$strings["Channel Sources"] = "Orígenes de los contenidos del canal";
+App::$strings["Manage remote sources of content for your channel."] = "Gestionar contenido de origen remoto para su canal.";
+App::$strings["New Source"] = "Nueva fuente";
+App::$strings["Import all or selected content from the following channel into this channel and distribute it according to your channel settings."] = "Importar todo el contenido o una selección de los siguientes canales en este canal y distribuirlo de acuerdo con sus ajustes.";
+App::$strings["Only import content with these words (one per line)"] = "Importar solo contenido que contenga estas palabras (una por línea)";
+App::$strings["Leave blank to import all public content"] = "Dejar en blanco para importar todo el contenido público";
+App::$strings["Channel Name"] = "Nombre del canal";
+App::$strings["Add the following categories to posts imported from this source (comma separated)"] = "Añadir los temas siguientes a las entradas importadas de esta fuente (separadas por comas)";
+App::$strings["Source not found."] = "Fuente no encontrada";
+App::$strings["Edit Source"] = "Editar fuente";
+App::$strings["Delete Source"] = "Eliminar fuente";
+App::$strings["Source removed"] = "Fuente eliminada";
+App::$strings["Unable to remove source."] = "No se puede eliminar la fuente.";
+App::$strings["Like/Dislike"] = "Me gusta/No me gusta";
+App::$strings["This action is restricted to members."] = "Esta acción está restringida solo para miembros.";
+App::$strings["Please <a href=\"rmagic\">login with your \$Projectname ID</a> or <a href=\"register\">register as a new \$Projectname member</a> to continue."] = "Por favor, <a href=\"rmagic\">identifíquese con su \$Projectname ID</a> o <a href=\"register\">rregístrese como un nuevo \$Projectname member</a> para continuar.";
+App::$strings["Invalid request."] = "Solicitud incorrecta.";
+App::$strings["channel"] = "el canal";
+App::$strings["thing"] = "elemento";
+App::$strings["Channel unavailable."] = "Canal no disponible.";
+App::$strings["Previous action reversed."] = "Acción anterior revocada.";
+App::$strings["%1\$s likes %2\$s's %3\$s"] = "A %1\$s le gusta %3\$s de %2\$s";
+App::$strings["%1\$s doesn't like %2\$s's %3\$s"] = "A %1\$s no le gusta %3\$s de %2\$s";
+App::$strings["%1\$s agrees with %2\$s's %3\$s"] = "%3\$s de %2\$s: %1\$s está de acuerdo";
+App::$strings["%1\$s doesn't agree with %2\$s's %3\$s"] = "%3\$s de %2\$s: %1\$s no está de acuerdo";
+App::$strings["%1\$s abstains from a decision on %2\$s's %3\$s"] = "%3\$s de %2\$s: %1\$s se abstiene";
+App::$strings["%1\$s is attending %2\$s's %3\$s"] = "%3\$s de %2\$s: %1\$s participa";
+App::$strings["%1\$s is not attending %2\$s's %3\$s"] = "%3\$s de %2\$s: %1\$s no participa";
+App::$strings["%1\$s may attend %2\$s's %3\$s"] = "%3\$s de %2\$s: %1\$s quizá participe";
+App::$strings["Action completed."] = "Acción completada.";
+App::$strings["Thank you."] = "Gracias.";
+App::$strings["%d rating"] = array(
+ 0 => "%d valoración",
+ 1 => "%d valoraciones",
+);
+App::$strings["Gender: "] = "Género:";
+App::$strings["Status: "] = "Estado:";
+App::$strings["Homepage: "] = "Página personal:";
+App::$strings["Age:"] = "Edad:";
+App::$strings["Location:"] = "Ubicación:";
+App::$strings["Description:"] = "Descripción:";
+App::$strings["Hometown:"] = "Lugar de nacimiento:";
+App::$strings["About:"] = "Sobre mí:";
+App::$strings["Connect"] = "Conectar";
+App::$strings["Public Forum:"] = "Foro público:";
+App::$strings["Keywords: "] = "Palabras clave:";
+App::$strings["Don't suggest"] = "No sugerir:";
+App::$strings["Common connections:"] = "Conexiones comunes:";
+App::$strings["Global Directory"] = "Directorio global:";
+App::$strings["Local Directory"] = "Directorio local:";
+App::$strings["Finding:"] = "Encontrar:";
+App::$strings["Channel Suggestions"] = "Sugerencias de canales";
+App::$strings["next page"] = "siguiente página";
+App::$strings["previous page"] = "página anterior";
+App::$strings["Sort options"] = "Ordenar opciones";
+App::$strings["Alphabetic"] = "Alfabético";
+App::$strings["Reverse Alphabetic"] = "Alfabético inverso";
+App::$strings["Newest to Oldest"] = "De más nuevo a más antiguo";
+App::$strings["Oldest to Newest"] = "De más antiguo a más nuevo";
+App::$strings["No entries (some entries may be hidden)."] = "Sin entradas (algunas entradas pueden estar ocultas).";
App::$strings["Xchan Lookup"] = "Búsqueda de canales";
App::$strings["Lookup xchan beginning with (or webbie): "] = "Buscar un canal (o un \"webbie\") que comience por:";
+App::$strings["No suggestions available. If this is a new site, please try again in 24 hours."] = "No hay sugerencias disponibles. Si es un sitio nuevo, espere 24 horas y pruebe de nuevo.";
+App::$strings["Ignore/Hide"] = "Ignorar/Ocultar";
+App::$strings["Unable to find your hub."] = "No se puede encontrar su servidor.";
+App::$strings["Post successful."] = "Enviado con éxito.";
+App::$strings["Unable to lookup recipient."] = "No se puede asociar a un destinatario.";
+App::$strings["Unable to communicate with requested channel."] = "No se puede establecer la comunicación con el canal solicitado.";
+App::$strings["Cannot verify requested channel."] = "No se puede verificar el canal solicitado.";
+App::$strings["Selected channel has private message restrictions. Send failed."] = "El canal seleccionado tiene restricciones sobre los mensajes privados. El envío falló.";
+App::$strings["Messages"] = "Mensajes";
+App::$strings["message"] = "mensaje";
+App::$strings["Message recalled."] = "Mensaje revocado.";
+App::$strings["Conversation removed."] = "Conversación eliminada.";
+App::$strings["Expires YYYY-MM-DD HH:MM"] = "Caduca YYYY-MM-DD HH:MM";
+App::$strings["Requested channel is not in this network"] = "El canal solicitado no existe en esta red";
+App::$strings["Send Private Message"] = "Enviar un mensaje privado";
+App::$strings["To:"] = "Para:";
+App::$strings["Subject:"] = "Asunto:";
+App::$strings["Attach file"] = "Adjuntar fichero";
+App::$strings["Send"] = "Enviar";
+App::$strings["Set expiration date"] = "Configurar fecha de caducidad";
+App::$strings["Delete message"] = "Borrar mensaje";
+App::$strings["Delivery report"] = "Informe de transmisión";
+App::$strings["Recall message"] = "Revocar el mensaje";
+App::$strings["Message has been recalled."] = "El mensaje ha sido revocado.";
+App::$strings["Delete Conversation"] = "Eliminar conversación";
+App::$strings["No secure communications available. You <strong>may</strong> be able to respond from the sender's profile page."] = "Comunicación segura no disponible. Pero <strong>puede</strong> responder desde la página del perfil del remitente.";
+App::$strings["Send Reply"] = "Responder";
+App::$strings["Your message for %s (%s):"] = "Su mensaje para %s (%s):";
+App::$strings["Public Hubs"] = "Servidores públicos";
+App::$strings["The listed hubs allow public registration for the \$Projectname network. All hubs in the network are interlinked so membership on any of them conveys membership in the network as a whole. Some hubs may require subscription or provide tiered service plans. The hub itself <strong>may</strong> provide additional details."] = "Los sitios listados permiten el registro público en la red \$Projectname. Todos los sitios de la red están vinculados entre sí, por lo que sus miembros, en ninguno de ellos, indican la pertenencia a la red en su conjunto. Algunos sitios pueden requerir suscripción o proporcionar planes de servicio por niveles. Los mismos hubs <strong>pueden</strong> proporcionar detalles adicionales.";
+App::$strings["Hub URL"] = "Dirección del hub";
+App::$strings["Access Type"] = "Tipo de acceso";
+App::$strings["Registration Policy"] = "Normas de registro";
+App::$strings["Stats"] = "Estadísticas";
+App::$strings["Software"] = "Software";
+App::$strings["Rate"] = "Valorar";
+App::$strings["webpage"] = "página web";
+App::$strings["block"] = "bloque";
+App::$strings["layout"] = "plantilla";
+App::$strings["menu"] = "menú";
+App::$strings["%s element installed"] = "%s elemento instalado";
+App::$strings["%s element installation failed"] = "Elemento con instalación fallida: %s";
+App::$strings["Select a bookmark folder"] = "Seleccionar una carpeta de marcadores";
+App::$strings["Save Bookmark"] = "Guardar marcador";
+App::$strings["URL of bookmark"] = "Dirección del marcador";
+App::$strings["Or enter new bookmark folder name"] = "O introduzca un nuevo nombre para la carpeta de marcadores";
+App::$strings["Enter a folder name"] = "Escriba un nombre de carpeta";
+App::$strings["or select an existing folder (doubleclick)"] = "o seleccione una (con un doble click)";
+App::$strings["Save to Folder"] = "Guardar en carpeta";
+App::$strings["Fetching URL returns error: %1\$s"] = "Al intentar obtener la dirección, retorna el error: %1\$s";
+App::$strings["Maximum daily site registrations exceeded. Please try again tomorrow."] = "Se ha superado el límite máximo de inscripciones diarias de este sitio. Por favor, pruebe de nuevo mañana.";
+App::$strings["Please indicate acceptance of the Terms of Service. Registration failed."] = "Por favor, confirme que acepta los Términos del servicio. El registro ha fallado.";
+App::$strings["Passwords do not match."] = "Las contraseñas no coinciden.";
+App::$strings["Registration successful. Please check your email for validation instructions."] = "Registro realizado con éxito. Por favor, compruebe su correo electrónico para ver las instrucciones para validarlo.";
+App::$strings["Your registration is pending approval by the site owner."] = "Su registro está pendiente de aprobación por el propietario del sitio.";
+App::$strings["Your registration can not be processed."] = "Su registro no puede ser procesado.";
+App::$strings["Registration on this hub is disabled."] = "El registro está deshabilitado en este sitio.";
+App::$strings["Registration on this hub is by approval only."] = "El registro en este hub está sometido a aprobación previa.";
+App::$strings["<a href=\"pubsites\">Register at another affiliated hub.</a>"] = "<a href=\"pubsites\">Registrarse en otro hub afiliado.</a>";
+App::$strings["This site has exceeded the number of allowed daily account registrations. Please try again tomorrow."] = "Este sitio ha excedido el límite de inscripción diaria de cuentas. Por favor, inténtelo de nuevo mañana.";
+App::$strings["I accept the %s for this website"] = "Acepto los %s de este sitio";
+App::$strings["I am over 13 years of age and accept the %s for this website"] = "Tengo más de 13 años de edad y acepto los %s de este sitio";
+App::$strings["Your email address"] = "Su dirección de correo electrónico";
+App::$strings["Choose a password"] = "Elija una contraseña";
+App::$strings["Please re-enter your password"] = "Por favor, vuelva a escribir su contraseña";
+App::$strings["Please enter your invitation code"] = "Por favor, introduzca el código de su invitación";
+App::$strings["no"] = "no";
+App::$strings["yes"] = "sí";
+App::$strings["Membership on this site is by invitation only."] = "Para registrarse en este sitio es necesaria una invitación.";
+App::$strings["Register"] = "Registrarse";
+App::$strings["This site may require email verification after submitting this form. If you are returned to a login page, please check your email for instructions."] = "Este sitio puede requerir una verificación de correo electrónico después de enviar este formulario. Si es devuelto a una página de inicio de sesión, compruebe su email para recibir y leer las instrucciones.";
+App::$strings["Cover Photos"] = "Imágenes de portada del perfil";
+App::$strings["female"] = "mujer";
+App::$strings["%1\$s updated her %2\$s"] = "%1\$s ha actualizado su %2\$s";
+App::$strings["male"] = "hombre";
+App::$strings["%1\$s updated his %2\$s"] = "%1\$s ha actualizado su %2\$s";
+App::$strings["%1\$s updated their %2\$s"] = "%1\$s ha actualizado su %2\$s";
+App::$strings["cover photo"] = "Imagen de portada del perfil";
+App::$strings["Upload Cover Photo"] = "Subir imagen de portada del perfil";
+App::$strings["Documentation Search"] = "Búsqueda de Documentación";
+App::$strings["About"] = "Mi perfil";
+App::$strings["Administrators"] = "Administradores";
+App::$strings["Developers"] = "Desarrolladores";
+App::$strings["Tutorials"] = "Tutoriales";
+App::$strings["\$Projectname Documentation"] = "Documentación de \$Projectname";
+App::$strings["Contents"] = "Contenidos";
+App::$strings["Tag removed"] = "Etiqueta eliminada.";
+App::$strings["Remove Item Tag"] = "Eliminar etiqueta del elemento.";
+App::$strings["Select a tag to remove: "] = "Seleccionar una etiqueta para eliminar:";
+App::$strings["No such group"] = "No se encuentra el grupo";
+App::$strings["No such channel"] = "No se encuentra el canal";
+App::$strings["forum"] = "foro";
+App::$strings["Search Results For:"] = "Buscar resultados para:";
+App::$strings["Privacy group is empty"] = "El grupo de canales está vacío";
+App::$strings["Privacy group: "] = "Grupo de canales: ";
+App::$strings["Invalid connection."] = "Conexión no válida.";
+App::$strings["Invalid channel."] = "El canal no es válido.";
+App::$strings["network"] = "red";
+App::$strings["RSS"] = "RSS";
+App::$strings["\$Projectname"] = "\$Projectname";
+App::$strings["Welcome to %s"] = "Bienvenido a %s";
+App::$strings["Permission Denied."] = "Permiso denegado";
+App::$strings["File not found."] = "Fichero no encontrado.";
+App::$strings["Edit file permissions"] = "Modificar los permisos del fichero";
+App::$strings["Set/edit permissions"] = "Establecer/editar los permisos";
+App::$strings["Include all files and sub folders"] = "Incluir todos los ficheros y subcarpetas";
+App::$strings["Return to file list"] = "Volver a la lista de ficheros";
+App::$strings["Copy/paste this code to attach file to a post"] = "Copiar/pegar este código para adjuntar el fichero al envío";
+App::$strings["Copy/paste this URL to link file from a web page"] = "Copiar/pegar esta dirección para enlazar el fichero desde una página web";
+App::$strings["Share this file"] = "Compartir este fichero";
+App::$strings["Show URL to this file"] = "Mostrar la dirección de este fichero";
+App::$strings["Notify your contacts about this file"] = "Avisar a sus contactos sobre este fichero";
+App::$strings["No channel."] = "Ningún canal.";
+App::$strings["Common connections"] = "Conexiones comunes";
+App::$strings["No connections in common."] = "Ninguna conexión en común.";
+App::$strings["No connections."] = "Sin conexiones.";
+App::$strings["Visit %s's profile [%s]"] = "Visitar el perfil de %s [%s]";
+App::$strings["View Connections"] = "Ver conexiones";
+App::$strings["# Accounts"] = "# Cuentas";
+App::$strings["# blocked accounts"] = "# cuentas bloqueadas";
+App::$strings["# expired accounts"] = "# cuentas caducadas";
+App::$strings["# expiring accounts"] = "# cuentas que caducan";
+App::$strings["# Channels"] = "# Canales";
+App::$strings["# primary"] = "# primario";
+App::$strings["# clones"] = "# clones";
+App::$strings["Message queues"] = "Mensajes en cola";
+App::$strings["Your software should be updated"] = "Debe actualizar su software";
+App::$strings["Summary"] = "Sumario";
+App::$strings["Registered accounts"] = "Cuentas registradas";
+App::$strings["Pending registrations"] = "Registros pendientes";
+App::$strings["Registered channels"] = "Canales registrados";
+App::$strings["Active plugins"] = "Extensiones (plugins) activas";
+App::$strings["Version"] = "Versión";
+App::$strings["Repository version (master)"] = "Versión del repositorio (master)";
+App::$strings["Repository version (dev)"] = "Versión del repositorio (dev)";
+App::$strings["No service class restrictions found."] = "No se han encontrado restricciones sobre esta clase de servicio.";
+App::$strings["Website:"] = "Sitio web:";
+App::$strings["Remote Channel [%s] (not yet known on this site)"] = "Canal remoto [%s] (aún no es conocido en este sitio)";
+App::$strings["Rating (this information is public)"] = "Valoración (esta información es pública)";
+App::$strings["Optionally explain your rating (this information is public)"] = "Opcionalmente puede explicar su valoración (esta información es pública)";
+App::$strings["No valid account found."] = "No se ha encontrado una cuenta válida.";
+App::$strings["Password reset request issued. Check your email."] = "Se ha recibido una solicitud de restablecimiento de contraseña. Consulte su correo electrónico.";
+App::$strings["Site Member (%s)"] = "Usuario del sitio (%s)";
+App::$strings["Password reset requested at %s"] = "Se ha solicitado restablecer la contraseña en %s";
+App::$strings["Request could not be verified. (You may have previously submitted it.) Password reset failed."] = "La solicitud no ha podido ser verificada. (Puede que la haya enviado con anterioridad) El restablecimiento de la contraseña ha fallado.";
+App::$strings["Password Reset"] = "Restablecer la contraseña";
+App::$strings["Your password has been reset as requested."] = "Su contraseña ha sido restablecida según lo solicitó.";
+App::$strings["Your new password is"] = "Su nueva contraseña es";
+App::$strings["Save or copy your new password - and then"] = "Guarde o copie su nueva contraseña - y después";
+App::$strings["click here to login"] = "pulse aquí para conectarse";
+App::$strings["Your password may be changed from the <em>Settings</em> page after successful login."] = "Puede cambiar la contraseña en la página <em>Ajustes</em> una vez iniciada la sesión.";
+App::$strings["Your password has changed at %s"] = "Su contraseña en %s ha sido cambiada";
+App::$strings["Forgot your Password?"] = "¿Ha olvidado su contraseña?";
+App::$strings["Enter your email address and submit to have your password reset. Then check your email for further instructions."] = "Introduzca y envíe su dirección de correo electrónico para el restablecimiento de su contraseña. Luego revise su correo para obtener más instrucciones.";
+App::$strings["Email Address"] = "Dirección de correo electrónico";
+App::$strings["Reset"] = "Reiniciar";
+App::$strings["Mark all system notifications seen"] = "Marcar todas las notificaciones del sistema como leídas";
+App::$strings["Site Admin"] = "Administrador del sitio";
+App::$strings["Report Bug"] = "Informe de errores";
+App::$strings["View Bookmarks"] = "Ver los marcadores";
+App::$strings["My Chatrooms"] = "Mis salas de chat";
+App::$strings["Firefox Share"] = "Servicio de compartición de Firefox";
+App::$strings["Remote Diagnostics"] = "Diagnóstico remoto";
+App::$strings["Suggest Channels"] = "Sugerir canales";
+App::$strings["Login"] = "Iniciar sesión";
+App::$strings["Activity"] = "Actividad";
+App::$strings["Wiki"] = "Wiki";
+App::$strings["Channel Home"] = "Mi canal";
+App::$strings["Events"] = "Eventos";
+App::$strings["Directory"] = "Directorio";
+App::$strings["Mail"] = "Correo";
+App::$strings["Chat"] = "Chat";
+App::$strings["Probe"] = "Probar";
+App::$strings["Suggest"] = "Sugerir";
+App::$strings["Random Channel"] = "Canal aleatorio";
+App::$strings["Invite"] = "Invitar";
+App::$strings["Features"] = "Funcionalidades";
+App::$strings["Language"] = "Idioma";
+App::$strings["Post"] = "Publicación";
+App::$strings["Profile Photo"] = "Foto del perfil";
+App::$strings["Purchase"] = "Comprar";
+App::$strings["Undelete"] = "Recuperar";
+App::$strings["Add to app-tray"] = "Añadir a la bandeja de aplicaciones";
+App::$strings["Remove from app-tray"] = "Quitar de la bandeja de aplicaciones";
+App::$strings["__ctx:permcat__ default"] = "por defecto";
+App::$strings["__ctx:permcat__ follower"] = "seguidor";
+App::$strings["__ctx:permcat__ contributor"] = "contribuidor";
+App::$strings["__ctx:permcat__ publisher"] = "editor";
+App::$strings["(No Title)"] = "(Sin título)";
+App::$strings["Wiki page create failed."] = "Se ha producido un error en la creación de la página wiki.";
+App::$strings["Wiki not found."] = "No se ha encontrado el wiki.";
+App::$strings["Destination name already exists"] = "El nombre de destino ya existe";
+App::$strings["Page not found"] = "No se ha encontrado la página";
+App::$strings["Error reading page content"] = "Se ha producido un error al leer el contenido de la página";
+App::$strings["Error reading wiki"] = "Se ha producido un error al leer el wiki";
+App::$strings["Page update failed."] = "Se ha producido un error al actualizar la página.";
+App::$strings["Nothing deleted"] = "No se ha eliminado nada";
+App::$strings["Compare: object not found."] = "No se ha encontrado un objeto para comparar.";
+App::$strings["Page updated"] = "Se ha actualizado la página";
+App::$strings["Untitled"] = "Sin título";
+App::$strings["Wiki resource_id required for git commit"] = "Se necesita Wiki resource_id para el git commit";
+App::$strings["__ctx:wiki_history__ Message"] = "Mensaje";
+App::$strings["Different viewers will see this text differently"] = "Visitantes diferentes verán este texto de forma distinta";
+App::$strings["Visible to your default audience"] = "Visible para su público predeterminado.";
+App::$strings["Only me"] = "Sólo yo";
+App::$strings["Public"] = "Público";
+App::$strings["Anybody in the \$Projectname network"] = "Cualquiera en la red \$Projectname";
+App::$strings["Any account on %s"] = "Cualquier cuenta en %s";
+App::$strings["Any of my connections"] = "Cualquiera de mis conexiones";
+App::$strings["Only connections I specifically allow"] = "Sólo las conexiones que yo permita de forma explícita";
+App::$strings["Anybody authenticated (could include visitors from other networks)"] = "Cualquiera que esté autenticado (podría incluir a los visitantes de otras redes)";
+App::$strings["Any connections including those who haven't yet been approved"] = "Cualquier conexión incluyendo aquellas que aún no han sido aprobadas";
+App::$strings["This is your default setting for the audience of your normal stream, and posts."] = "Esta es la configuración predeterminada para su flujo (stream) habitual de publicaciones.";
+App::$strings["This is your default setting for who can view your default channel profile"] = "Esta es su configuración por defecto para establecer quién puede ver su perfil del canal predeterminado";
+App::$strings["This is your default setting for who can view your connections"] = "Este es su ajuste predeterminado para establecer quién puede ver sus conexiones";
+App::$strings["This is your default setting for who can view your file storage and photos"] = "Este es su ajuste predeterminado para establecer quién puede ver su repositorio de ficheros y sus fotos";
+App::$strings["This is your default setting for the audience of your webpages"] = "Este es el ajuste predeterminado para establecer la audiencia de sus páginas web";
App::$strings["Missing room name"] = "Sala de chat sin nombre";
App::$strings["Duplicate room name"] = "Nombre de sala duplicado.";
App::$strings["Invalid room specifier."] = "Especificador de sala no válido.";
@@ -1596,41 +1643,11 @@ App::$strings["Please visit %s to approve or reject the suggestion."] = "Por fav
App::$strings["[\$Projectname:Notify]"] = "[\$Projectname:Aviso]";
App::$strings["created a new post"] = "ha creado una nueva entrada";
App::$strings["commented on %s's post"] = "ha comentado la entrada de %s";
-App::$strings["Visible to your default audience"] = "Visible para su público predeterminado.";
-App::$strings["Only me"] = "Sólo yo";
-App::$strings["Public"] = "Público";
-App::$strings["Anybody in the \$Projectname network"] = "Cualquiera en la red \$Projectname";
-App::$strings["Any account on %s"] = "Cualquier cuenta en %s";
-App::$strings["Any of my connections"] = "Cualquiera de mis conexiones";
-App::$strings["Only connections I specifically allow"] = "Sólo las conexiones que yo permita de forma explícita";
-App::$strings["Anybody authenticated (could include visitors from other networks)"] = "Cualquiera que esté autenticado (podría incluir a los visitantes de otras redes)";
-App::$strings["Any connections including those who haven't yet been approved"] = "Cualquier conexión incluyendo aquellas que aún no han sido aprobadas";
-App::$strings["This is your default setting for the audience of your normal stream, and posts."] = "Esta es la configuración predeterminada para su flujo (stream) habitual de publicaciones.";
-App::$strings["This is your default setting for who can view your default channel profile"] = "Esta es su configuración por defecto para establecer quién puede ver su perfil del canal predeterminado";
-App::$strings["This is your default setting for who can view your connections"] = "Este es su ajuste predeterminado para establecer quién puede ver sus conexiones";
-App::$strings["This is your default setting for who can view your file storage and photos"] = "Este es su ajuste predeterminado para establecer quién puede ver su repositorio de ficheros y sus fotos";
-App::$strings["This is your default setting for the audience of your webpages"] = "Este es el ajuste predeterminado para establecer la audiencia de sus páginas web";
-App::$strings["(No Title)"] = "(Sin título)";
-App::$strings["Wiki page create failed."] = "Se ha producido un error en la creación de la página wiki.";
-App::$strings["Wiki not found."] = "No se ha encontrado el wiki.";
-App::$strings["Destination name already exists"] = "El nombre de destino ya existe";
-App::$strings["Page not found"] = "No se ha encontrado la página";
-App::$strings["Error reading page content"] = "Se ha producido un error al leer el contenido de la página";
-App::$strings["Error reading wiki"] = "Se ha producido un error al leer el wiki";
-App::$strings["Page update failed."] = "Se ha producido un error al actualizar la página.";
-App::$strings["Nothing deleted"] = "No se ha eliminado nada";
-App::$strings["Compare: object not found."] = "No se ha encontrado un objeto para comparar.";
-App::$strings["Page updated"] = "Se ha actualizado la página";
-App::$strings["Untitled"] = "Sin título";
-App::$strings["Wiki resource_id required for git commit"] = "Se necesita Wiki resource_id para el git commit";
-App::$strings["Different viewers will see this text differently"] = "Visitantes diferentes verán este texto de forma distinta";
-App::$strings["__ctx:permcat__ default"] = "por defecto";
-App::$strings["__ctx:permcat__ follower"] = "seguidor";
-App::$strings["__ctx:permcat__ contributor"] = "contribuidor";
-App::$strings["__ctx:permcat__ publisher"] = "editor";
+App::$strings["Wiki files deleted successfully"] = "Se han borrado con éxito los ficheros del wiki";
+App::$strings["Update Error at %s"] = "Error de actualización en %s";
+App::$strings["Update %s failed. See error logs."] = "La actualización %s ha fallado. Mire el informe de errores.";
App::$strings["Private Message"] = "Mensaje Privado";
App::$strings["Select"] = "Seleccionar";
-App::$strings["Save to Folder"] = "Guardar en carpeta";
App::$strings["I will attend"] = "Participaré";
App::$strings["I will not attend"] = "No participaré";
App::$strings["I might attend"] = "Quizá participe";
@@ -1677,53 +1694,279 @@ App::$strings["Code"] = "Código";
App::$strings["Image"] = "Imagen";
App::$strings["Insert Link"] = "Insertar enlace";
App::$strings["Video"] = "Vídeo";
-App::$strings["Wiki files deleted successfully"] = "Se han borrado con éxito los ficheros del wiki";
-App::$strings["Site Admin"] = "Administrador del sitio";
-App::$strings["Report Bug"] = "Informe de errores";
-App::$strings["View Bookmarks"] = "Ver los marcadores";
-App::$strings["My Chatrooms"] = "Mis salas de chat";
-App::$strings["Firefox Share"] = "Servicio de compartición de Firefox";
-App::$strings["Remote Diagnostics"] = "Diagnóstico remoto";
-App::$strings["Suggest Channels"] = "Sugerir canales";
-App::$strings["Login"] = "Iniciar sesión";
-App::$strings["Grid"] = "Red";
-App::$strings["Wiki"] = "Wiki";
-App::$strings["Channel Home"] = "Mi canal";
-App::$strings["Events"] = "Eventos";
-App::$strings["Directory"] = "Directorio";
-App::$strings["Mail"] = "Correo";
-App::$strings["Chat"] = "Chat";
-App::$strings["Probe"] = "Probar";
-App::$strings["Suggest"] = "Sugerir";
-App::$strings["Random Channel"] = "Canal aleatorio";
-App::$strings["Invite"] = "Invitar";
-App::$strings["Features"] = "Funcionalidades";
-App::$strings["Language"] = "Idioma";
-App::$strings["Post"] = "Publicación";
-App::$strings["Profile Photo"] = "Foto del perfil";
-App::$strings["Purchase"] = "Comprar";
-App::$strings["Undelete"] = "Recuperar";
-App::$strings["Add to app-tray"] = "Añadir a la bandeja de aplicaciones";
-App::$strings["Remove from app-tray"] = "Quitar de la bandeja de aplicaciones";
+App::$strings["Remote authentication blocked. You are logged into this site locally. Please logout and retry."] = "La autenticación desde su servidor está bloqueada. Ha iniciado sesión localmente. Por favor, salga de la sesión y vuelva a intentarlo.";
+App::$strings["Welcome %s. Remote authentication successful."] = "Bienvenido %s. La identificación desde su servidor se ha llevado a cabo correctamente.";
+App::$strings["parent"] = "padre";
+App::$strings["Collection"] = "Colección";
+App::$strings["Principal"] = "Principal";
+App::$strings["Addressbook"] = "Libreta de direcciones";
+App::$strings["Calendar"] = "Calendario";
+App::$strings["Schedule Inbox"] = "Programar bandeja de entrada";
+App::$strings["Schedule Outbox"] = "Programar bandeja de salida";
+App::$strings["Total"] = "Total";
+App::$strings["Shared"] = "Compartido";
+App::$strings["You are using %1\$s of your available file storage."] = "Está usando %1\$s de su espacio disponible para ficheros.";
+App::$strings["You are using %1\$s of %2\$s available file storage. (%3\$s&#37;)"] = "Está usando %1\$s de %2\$s que tiene a su disposición para ficheros. (%3\$s&#37;)";
+App::$strings["WARNING:"] = "ATENCIÓN: ";
+App::$strings["Please use DAV to upload large (video, audio) files.<br>See <a class=\"zrl\" href=\"help/member/member_guide#Cloud_Desktop_Clients\">Cloud Desktop Clients</a>"] = "Por favor, use DAV para subir ficheros de gran tamaño (vídeo, audio).<br>Mire en <a class=\"zrl\" href=\"help/member/member_guide#Cloud_Desktop_Clients\">Cloud Desktop Clients</a>";
+App::$strings["Create new folder"] = "Crear nueva carpeta";
+App::$strings["Upload file"] = "Subir fichero";
+App::$strings["Drop files here to immediately upload"] = "Arrastre los ficheros aquí para subirlos de forma inmediata";
+App::$strings["Forums"] = "Foros";
+App::$strings["Categories"] = "Temas";
+App::$strings["Everything"] = "Todo";
+App::$strings["Events Tools"] = "Gestión de eventos";
+App::$strings["Export Calendar"] = "Exportar el calendario";
+App::$strings["Import Calendar"] = "Importar un calendario";
+App::$strings["Suggested Chatrooms"] = "Salas de chat sugeridas";
+App::$strings["Private Mail Menu"] = "Menú de correo privado";
+App::$strings["Combined View"] = "Vista combinada";
+App::$strings["Inbox"] = "Bandeja de entrada";
+App::$strings["Outbox"] = "Bandeja de salida";
+App::$strings["New Message"] = "Nuevo mensaje";
+App::$strings["Chatrooms"] = "Salas de chat";
+App::$strings["Overview"] = "Resumen";
+App::$strings["Rating Tools"] = "Valoraciones";
+App::$strings["Rate Me"] = "Valorar este canal";
+App::$strings["View Ratings"] = "Mostrar las valoraciones";
+App::$strings["__ctx:widget__ Activity"] = "Actividad";
+App::$strings["You have %1$.0f of %2$.0f allowed connections."] = "Tiene %1$.0f de %2$.0f conexiones permitidas.";
+App::$strings["Add New Connection"] = "Añadir nueva conexión";
+App::$strings["Enter channel address"] = "Dirección del canal";
+App::$strings["Examples: bob@example.com, https://example.com/barbara"] = "Ejemplos: manuel@ejemplo.com, https://ejemplo.com/carmen";
+App::$strings["Wiki List"] = "Lista de wikis";
+App::$strings["Archives"] = "Hemeroteca";
+App::$strings["Conversations"] = "Conversaciones";
+App::$strings["Received Messages"] = "Mensajes recibidos";
+App::$strings["Sent Messages"] = "Enviar mensajes";
+App::$strings["No messages."] = "Sin mensajes.";
+App::$strings["Delete conversation"] = "Eliminar conversación";
+App::$strings["Chat Members"] = "Miembros del chat";
+App::$strings["photo/image"] = "foto/imagen";
+App::$strings["Remove term"] = "Eliminar término";
+App::$strings["Saved Searches"] = "Búsquedas guardadas";
+App::$strings["add"] = "añadir";
+App::$strings["Notes"] = "Notas";
+App::$strings["Wiki Pages"] = "Páginas del wiki";
+App::$strings["Add new page"] = "Añadir una nueva página";
+App::$strings["Page name"] = "Nombre de la página";
+App::$strings["Refresh"] = "Recargar";
+App::$strings["Tasks"] = "Tareas";
+App::$strings["Suggestions"] = "Sugerencias";
+App::$strings["See more..."] = "Ver más...";
+App::$strings["Saved Folders"] = "Carpetas guardadas";
+App::$strings["Click to show more"] = "Hacer clic para ver más";
+App::$strings["Member registrations waiting for confirmation"] = "Inscripciones de nuevos miembros pendientes de aprobación";
+App::$strings["Inspect queue"] = "Examinar la cola";
+App::$strings["DB updates"] = "Actualizaciones de la base de datos";
+App::$strings["Admin"] = "Administrador";
+App::$strings["Plugin Features"] = "Extensiones";
+App::$strings["Account settings"] = "Configuración de la cuenta";
+App::$strings["Channel settings"] = "Configuración del canal";
+App::$strings["Additional features"] = "Funcionalidades";
+App::$strings["Feature/Addon settings"] = "Complementos";
+App::$strings["Display settings"] = "Ajustes de visualización";
+App::$strings["Manage locations"] = "Gestión de ubicaciones (clones) del canal";
+App::$strings["Export channel"] = "Exportar canal";
+App::$strings["Connected apps"] = "Aplicaciones (apps) conectadas";
+App::$strings["Permission Groups"] = "Grupos de permisos";
+App::$strings["Premium Channel Settings"] = "Configuración del canal premium";
+App::$strings["Bookmarked Chatrooms"] = "Salas de chat preferidas";
+App::$strings["Source channel not found."] = "No se ha encontrado el canal de origen.";
+App::$strings["__ctx:opensearch__ Search %1\$s (%2\$s)"] = "Buscar %1\$s (%2\$s)";
+App::$strings["__ctx:opensearch__ \$Projectname"] = "\$Projectname";
+App::$strings["Create an account to access services and applications"] = "Crear una cuenta para acceder a los servicios y aplicaciones";
+App::$strings["Logout"] = "Finalizar sesión";
+App::$strings["Login/Email"] = "Inicio de sesión / Correo electrónico";
+App::$strings["Password"] = "Contraseña";
+App::$strings["Remember me"] = "Recordarme";
+App::$strings["Forgot your password?"] = "¿Olvidó su contraseña?";
+App::$strings["toggle mobile"] = "cambiar a modo móvil";
+App::$strings["[\$Projectname] Website SSL error for %s"] = "[\$Projectname] Error SSL del sitio web en %s";
+App::$strings["Website SSL certificate is not valid. Please correct."] = "El certificado SSL del sitio web no es válido. Por favor, solucione el problema.";
+App::$strings["[\$Projectname] Cron tasks not running on %s"] = "[\$Projectname] Las tareas de Cron no están funcionando en %s";
+App::$strings["Cron/Scheduled tasks not running."] = "Las tareas del Planificador/Cron no están funcionando.";
+App::$strings["never"] = "nunca";
+App::$strings["Focus (Hubzilla default)"] = "Focus (predefinido)";
+App::$strings["Theme settings"] = "Ajustes del tema";
+App::$strings["Narrow navbar"] = "Estrechar la barra de navegación";
+App::$strings["Navigation bar background color"] = "Color de fondo de la barra de navegación";
+App::$strings["Navigation bar icon color "] = "Color del icono de la barra de navegación";
+App::$strings["Navigation bar active icon color "] = "Color del icono activo de la barra de navegación";
+App::$strings["Link color"] = "Color del enlace";
+App::$strings["Set font-color for banner"] = "Ajustar el color del tipo de letra para el \"banner\"";
+App::$strings["Set the background color"] = "Ajustar el color de fondo";
+App::$strings["Set the background image"] = "Ajustar la imagen de fondo";
+App::$strings["Set the background color of items"] = "Ajustar el color de los elementos de fondo";
+App::$strings["Set the background color of comments"] = "Ajustar el color de fondo de los comentarios";
+App::$strings["Set font-size for the entire application"] = "Ajustar el tamaño de letra para toda la aplicación";
+App::$strings["Examples: 1rem, 100%, 16px"] = "Ejemplos: 1rem, 100%, 16px";
+App::$strings["Set font-color for posts and comments"] = "Establecer el color de la letra para publicaciones y comentarios";
+App::$strings["Set radius of corners"] = "Establecer el radio de curvatura de las esquinas";
+App::$strings["Example: 4px"] = "Ejemplo: 4px";
+App::$strings["Set shadow depth of photos"] = "Ajustar la profundidad de sombras de las fotos";
+App::$strings["Set maximum width of content region in pixel"] = "Ajustar la anchura máxima de la región de contenido, en pixels";
+App::$strings["Leave empty for default width"] = "Dejar en blanco para la anchura predeterminada";
+App::$strings["Left align page content"] = "Alinear a la izquierda el contenido de la página";
+App::$strings["Set size of conversation author photo"] = "Ajustar el tamaño de la foto del autor de la conversación";
+App::$strings["Set size of followup author photos"] = "Ajustar el tamaño de foto de los seguidores del autor";
+App::$strings["Errors encountered deleting database table "] = "Errores encontrados al eliminar la tabla de la base de datos";
+App::$strings["Submit Settings"] = "Enviar los ajustes";
+App::$strings["Drop tables when uninstalling?"] = "¿Eliminar tablas al desinstalar?";
+App::$strings["If checked, the Rendezvous database tables will be deleted when the plugin is uninstalled."] = "Si se selecciona, las tablas de la base de datos Rendezvous se eliminarán cuando se desinstale el plugin.";
+App::$strings["Mapbox Access Token"] = "Token de acceso de Mapbox";
+App::$strings["If you enter a Mapbox access token, it will be used to retrieve map tiles from Mapbox instead of the default OpenStreetMap tile server."] = "Si introduce un token de acceso a Mapbox, se utilizará para recuperar los mapas de mosaicos de imágenes de Mapbox en lugar del servidor de mosaico de imágenes OpenStreetMap predeterminado.";
+App::$strings["Rendezvous"] = "Rendezvous";
+App::$strings["This identity has been deleted by another member due to inactivity. Please press the \"New identity\" button or refresh the page to register a new identity. You may use the same name."] = "Esta identidad ha sido eliminada por otro miembro debido a su inactividad. Pulse el botón \"Nueva identidad\" o actualice la página para registrar una nueva identidad. Puede usar el mismo nombre.";
+App::$strings["Welcome to Rendezvous!"] = "¡Bienvenido/a a Rendevous!";
+App::$strings["Enter your name to join this rendezvous. To begin sharing your location with the other members, tap the GPS control. When your location is discovered, a red dot will appear and others will be able to see you on the map."] = "Introduzca tu nombre para unirse a esta cita. Para comenzar a compartir su ubicación con los demás miembros, pulse en el control GPS. Cuando se descubra su ubicación, aparecerá un punto rojo y otros podrán verlo en el mapa.";
+App::$strings["Let's meet here"] = "Reunámonos aquí";
+App::$strings["New marker"] = "Nuevo marcador";
+App::$strings["Edit marker"] = "Editar un marcador";
+App::$strings["New identity"] = "Nueva identidad";
+App::$strings["Delete marker"] = "Eliminar un marcador";
+App::$strings["Delete member"] = "Eliminar un miembro";
+App::$strings["Edit proximity alert"] = "Editar alerta de proximidad";
+App::$strings["A proximity alert will be issued when this member is within a certain radius of you.<br><br>Enter a radius in meters (0 to disable):"] = "Se emitirá una alerta de proximidad cuando este miembro esté dentro de un radio determinado respecto a usted.<br><br> Ingrese el radio en metros (0 para deshabilitar):";
+App::$strings["distance"] = "distancia";
+App::$strings["Proximity alert distance (meters)"] = "Distancia (en metros) para la alerta de proximidad";
+App::$strings["A proximity alert will be issued when you are within a certain radius of the marker location.<br><br>Enter a radius in meters (0 to disable):"] = "Se emitirá una alerta de proximidad cuando usted esté dentro de un radio determinado respecto al marcador de localización.<br><br> Ingrese el radio en metros (0 para deshabilitar):";
+App::$strings["Marker proximity alert"] = "Marcador de alerta de proximidad";
+App::$strings["Reminder note"] = "Recordatorio";
+App::$strings["Enter a note to be displayed when you are within the specified proximity..."] = "Introduzca una nota que se mostrará cuando esté dentro de la proximidad especificada...";
+App::$strings["Add new rendezvous"] = "Añadir una nueva cita";
+App::$strings["Create a new rendezvous and share the access link with those you wish to invite to the group. Those who open the link become members of the rendezvous. They can view other member locations, add markers to the map, or share their own locations with the group."] = "Cree una nueva cita y comparta los enlaces de acceso con los que desea invitar al grupo. Aquellos que abran el enlace se convertirán en miembros de la cita. Pueden ver otras ubicaciones de miembros, añadir marcadores al mapa o compartir sus propias ubicaciones con el grupo.";
+App::$strings["Some setting"] = "Algunos ajustes";
+App::$strings["A setting"] = "Un ajuste";
+App::$strings["Skeleton Settings"] = "Ajustes de Skeleton";
+App::$strings["GNU-Social Protocol Settings updated."] = "Se han actualizado los ajustes del protocolo de GNU-Social.";
+App::$strings["Enable the GNU-Social protocol for this channel"] = "Activar el protocolo de GNU-Social para este canal";
+App::$strings["GNU-Social Protocol Settings"] = "Ajustes del protocolo de GNU-Social";
+App::$strings["Follow"] = "Seguir";
+App::$strings["%1\$s is now following %2\$s"] = "%1\$s está siguiendo ahora a %2\$s";
+App::$strings["INVALID EVENT DISMISSED!"] = "¡EVENTO NO VÃLIDO RECHAZADO!";
+App::$strings["Summary: "] = "Resumen: ";
+App::$strings["Date: "] = "Fecha: ";
+App::$strings["Reason: "] = "Razón: ";
+App::$strings["INVALID CARD DISMISSED!"] = "¡TARJETA NO VÃLIDA RECHAZADA!";
+App::$strings["Name: "] = "Nombre: ";
+App::$strings["You have to enable this plugin in Feature/Addon Settings > CalDAV/CardDAV Settings before you can use it."] = "Debe habilitar este complemento en Ajustes/Complementos>Configuración de CalDAV/CardDAV antes de poder utilizarlo.";
+App::$strings["Example: YYYY-MM-DD HH:mm"] = "Ejemplo: YYYY-MM-DD HH:mm";
+App::$strings["End date and time"] = "Fecha y hora de finalización";
+App::$strings["List month"] = "Lista mensual";
+App::$strings["List week"] = "Lista semanal";
+App::$strings["List day"] = "Lista diaria";
+App::$strings["More"] = "Más";
+App::$strings["Less"] = "Menos";
+App::$strings["Select calendar"] = "Seleccionar un calendario";
+App::$strings["Delete all"] = "Eliminar todos";
+App::$strings["Sorry! Editing of recurrent events is not yet implemented."] = "¡Disculpas! La edición de eventos recurrentes aún no se ha implementado.";
+App::$strings["Errors encountered creating database table: "] = "Errores encontrados al crear la tabla de la base de datos: ";
+App::$strings["Default Calendar"] = "Calendario por defecto";
+App::$strings["Default Addressbook"] = "Agenda de direcciones por defecto";
+App::$strings["CalDAV/CardDAV Settings saved."] = "Se ha guardado la configuración de CalDAV/CardDAV.";
+App::$strings["Enable CalDAV/CardDAV Server for this channel"] = "Habilitar el servidor CalDAV/CardDAV para este canal";
+App::$strings["Your CalDAV resources are located at %s "] = "Los recursos de CalDAV se encuentran en %s";
+App::$strings["Your CardDAV resources are located at %s "] = "Sus recursos de CalDAV están localizados en %s ";
+App::$strings["CalDAV/CardDAV Settings"] = "Configuración de CalDAV/CardDAV";
+App::$strings["Home, Voice"] = "Llamadas particulares";
+App::$strings["Home, Fax"] = "Fax particular";
+App::$strings["Work, Voice"] = "Llamadas de trabajo";
+App::$strings["Work, Fax"] = "Fax de trabajo";
+App::$strings["Select Channel"] = "Seleccionar un canal";
+App::$strings["Read-write"] = "Lectura y escritura";
+App::$strings["Read-only"] = "Sólo lectura";
+App::$strings["My Calendars"] = "Mis calendarios";
+App::$strings["Shared Calendars"] = "Calendarios compartidos";
+App::$strings["Share this calendar"] = "Compartir este calendario";
+App::$strings["Calendar name and color"] = "Nombre y color del calendario";
+App::$strings["Create new calendar"] = "Crear un nuevo calendario";
+App::$strings["Calendar Name"] = "Nombre del calendario";
+App::$strings["Calendar Tools"] = "Gestión de calendarios";
+App::$strings["Import calendar"] = "Importar un calendario";
+App::$strings["Select a calendar to import to"] = "Seleccionar un calendario para importarlo";
+App::$strings["Addressbooks"] = "Agenda de direcciones";
+App::$strings["Addressbook name"] = "Nombre de la agenda";
+App::$strings["Create new addressbook"] = "Crear una nueva agenda de direcciones";
+App::$strings["Addressbook Name"] = "Nombre de la agenda";
+App::$strings["Addressbook Tools"] = "Gestión de agendas de direcciones";
+App::$strings["Import addressbook"] = "Importar una agenda de direcciones";
+App::$strings["Select an addressbook to import to"] = "Seleccionar una agenda para importarla";
+App::$strings["Planets Settings updated."] = "Se han guardado los ajustes de Planets.";
+App::$strings["Enable Planets Plugin"] = "Habilitar el plugin Planets";
+App::$strings["Planets Settings"] = "Ajustes de Planets";
+App::$strings["System defaults:"] = "Valores predeterminados del sistema: ";
+App::$strings["Preferred Clipart IDs"] = "IDs de las imágenes clipart preferidas";
+App::$strings["List of preferred clipart ids. These will be shown first."] = "Lista de ids de imágenes de clipart preferidas. Se verán en primer lugar.";
+App::$strings["Default Search Term"] = "Términos de búsqueda predeterminados";
+App::$strings["The default search term. These will be shown second."] = "Los términos de búsqueda predeterminados. Estos se mostrarán en segundo lugar.";
+App::$strings["Return After"] = "Regresar después";
+App::$strings["Page to load after image selection."] = "Página para cargar después de la selección de imágenes.";
+App::$strings["Edit Profile"] = "Editar el perfil";
+App::$strings["Profile List"] = "Lista de perfiles";
+App::$strings["Order of Preferred"] = "Orden de preferencia";
+App::$strings["Sort order of preferred clipart ids."] = "Orden de clasificación de los identificadores de imágenes clipart preferidas.";
+App::$strings["Newest first"] = "Las más nuevas en primer lugar";
+App::$strings["As entered"] = "Tal como se ingresaron";
+App::$strings["Order of other"] = "Orden de los demás";
+App::$strings["Sort order of other clipart ids."] = "Orden de clasificación de otros ids de imágenes clipart.";
+App::$strings["Most downloaded first"] = "Las más descargadas en primer lugar";
+App::$strings["Most liked first"] = "Las más apreciadas en primer lugar";
+App::$strings["Preferred IDs Message"] = "Mensaje de IDs preferido";
+App::$strings["Message to display above preferred results."] = "Mensaje para mostrar sobre los resultados preferidos.";
+App::$strings["Uploaded by: "] = "Subida por: ";
+App::$strings["Drawn by: "] = "Creada por: ";
+App::$strings["Or select from a free OpenClipart.org image:"] = "O seleccionar una imagen gratuita de OpenClipart.org: ";
+App::$strings["Search Term"] = "Término de búsqueda";
+App::$strings["Unknown error. Please try again later."] = "Error desconocido. Por favor, inténtelo otra vez.";
+App::$strings["Profile photo updated successfully."] = "Se ha actualizado con éxito la foto de perfil.";
App::$strings["Flag Adult Photos"] = "Indicador (\"flag\") de fotos de adultos";
App::$strings["Provide photo edit option to hide inappropriate photos from default album view"] = "Proporcionar una opción de edición de fotos para ocultar las fotos inapropiadas de la vista de álbum predeterminada";
-App::$strings["This is a fairly comprehensive and complete guitar chord dictionary which will list most of the available ways to play a certain chord, starting from the base of the fingerboard up to a few frets beyond the twelfth fret (beyond which everything repeats). A couple of non-standard tunings are provided for the benefit of slide players, etc."] = "Se trata de un diccionario bastante amplio y completo de acordes de guitarra que enumerará la mayor parte de las formas disponibles para tocar un acorde determinado, partiendo de la base del diapasón hasta unos pocos trastes más allá del traste doce (más allá del cual todo se repite). Se proporcionan un par de afinaciones no convencionales para provecho de los guitarristas con \"slides\" ( barras de acero), etc.";
-App::$strings["Chord names start with a root note (A-G) and may include sharps (#) and flats (b). This software will parse most of the standard naming conventions such as maj, min, dim, sus(2 or 4), aug, with optional repeating elements."] = "Los nombres de acordes comienzan con una nota fundamental (La-Sol) y pueden incluir sostenidos (#) y bemoles (b). Este software analizará la mayor parte de las convenciones de nomenclatura estándar como maj, min, tenue, SUS (2 ó 4), aug, con la repetición de elementos opcionales.";
-App::$strings["Valid examples include A, A7, Am7, Amaj7, Amaj9, Ammaj7, Aadd4, Asus2Add4, E7b13b11 ..."] = "Ejemplos válidos son A, A7, Am7, Amaj7, Amaj9, Ammaj7, Aadd4, Asus2Add4, E7b13b11 ...";
-App::$strings["Guitar Chords"] = "Acordes de guitarra";
-App::$strings["The complete online chord dictionary"] = "El diccionario completo de acordes en línea";
-App::$strings["Tuning"] = "Afinación";
-App::$strings["Chord name: example: Em7"] = "Nombre del acorde, por ejemplo: Em7";
-App::$strings["Show for left handed stringing"] = "Mostrar para tocadores zurdos";
-App::$strings["Quick Reference"] = "Referencia rápida";
-App::$strings["No username found in import file."] = "No se ha encontrado el nombre de usuario en el fichero importado.";
-App::$strings["Unable to create a unique channel address. Import failed."] = "No se ha podido crear una dirección de canal única. Ha fallado la importación.";
-App::$strings["Diaspora Protocol Settings updated."] = "Los ajustes del protocolo de Diaspora se han actualizado.";
-App::$strings["Enable the Diaspora protocol for this channel"] = "Activar el protocolo de Diaspora para este canal";
-App::$strings["Allow any Diaspora member to comment on your public posts"] = "Permitir a cualquier miembro de Diaspora comentar sus entradas públicas";
-App::$strings["Prevent your hashtags from being redirected to other sites"] = "Impedir que sus \"hashtags\" sean redirigidos a otros sitios ";
-App::$strings["Followed hashtags (comma separated, do not include the #)"] = "\"Hashtags\" seguidos (separados por comas, sin incluir #)";
-App::$strings["Diaspora Protocol Settings"] = "Ajustes del protocolo de Diaspora";
+App::$strings["Post to WordPress"] = "Publicar en WordPress";
+App::$strings["Enable WordPress Post Plugin"] = "Habilitar el plugin de publicación en WordPress";
+App::$strings["WordPress username"] = "Nombre de usuario de WordPress";
+App::$strings["WordPress password"] = "Contraseña de WordPress";
+App::$strings["WordPress API URL"] = "URL de la API de WordPress";
+App::$strings["Typically https://your-blog.tld/xmlrpc.php"] = "Habitualmente https://your-blog.tld/xmlrpc.php";
+App::$strings["WordPress blogid"] = "Blog de WordPress";
+App::$strings["For multi-user sites such as wordpress.com, otherwise leave blank"] = "Para sitios multiusuario como wordpress.com, de lo contrario, dejar en blanco";
+App::$strings["Post to WordPress by default"] = "Publicar en WordPress por defecto";
+App::$strings["Forward comments (requires hubzilla_wp plugin)"] = "Reenviar comentarios (requerido por el plugin hubzilla_wp)";
+App::$strings["WordPress Post Settings"] = "Ajustes de publicación en WordPress";
+App::$strings["Wordpress Settings saved."] = "Se han guardado los ajustes de WordPress.";
+App::$strings["This plugin looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW. This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "Este complemento busca en los mensajes las palabras o texto que se especifican a continuación y contrae cualquier contenido que contenga esas palabras clave para que no se muestre en momentos inapropiados, como insinuaciones sexuales que pueden ser impropias en un entorno de trabajo. Es una muestra de educación y se recomienda marcar cualquier contenido que contenga desnudos con #NSFW. Este filtro también puede coincidir con cualquier otra palabra o texto que especifique y, por lo tanto, puede utilizarse como un filtro de contenido de propósito general.";
+App::$strings["Enable Content filter"] = "Habilitar filtro de contenido";
+App::$strings["Comma separated list of keywords to hide"] = "Lista separada por comas de palabras clave para ocultar";
+App::$strings["Word, /regular-expression/, lang=xx, lang!=xx"] = "Palabra, /expresión regular/, lang=xx, lang!=xx";
+App::$strings["Not Safe For Work Settings"] = "No es seguro para ajustes de trabajo";
+App::$strings["General Purpose Content Filter"] = "Filtro de contenido de propósito general";
+App::$strings["NSFW Settings saved."] = "Se han guardado los ajustes de NSFW.";
+App::$strings["Possible adult content"] = "Posible contenido para adultos";
+App::$strings["%s - view"] = "ver - %s";
+App::$strings["Post to Insanejournal"] = "Publicar en Insanejournal";
+App::$strings["Enable InsaneJournal Post Plugin"] = "Habilitar el plugin de publicación en InsaneJournal";
+App::$strings["InsaneJournal username"] = "Nombre de usuario en InsaneJournal";
+App::$strings["InsaneJournal password"] = "Contraseña en InsaneJournal";
+App::$strings["Post to InsaneJournal by default"] = "Publicar por defecto en InsaneJournal";
+App::$strings["InsaneJournal Post Settings"] = "Ajustes de publicación en InsaneJournal";
+App::$strings["Insane Journal Settings saved."] = "Se han guardado los ajustes de InsaneJournal.";
+App::$strings["Upload a file"] = "Subir un fichero";
+App::$strings["Drop files here to upload"] = "Arrastre los ficheros aquí para subirlos";
+App::$strings["Failed"] = "Ha fallado";
+App::$strings["No files were uploaded."] = "No se han subido ficheros.";
+App::$strings["Uploaded file is empty"] = "El fichero subido está vacío";
+App::$strings["Image exceeds size limit of "] = "La imagen supera el límite de tamaño de ";
+App::$strings["File has an invalid extension, it should be one of "] = "El fichero tiene una extensión no válida, debería ser una de estas: ";
+App::$strings["Upload was cancelled, or server error encountered"] = "Se canceló la carga o se encontró un error del servidor";
+App::$strings["Post to Dreamwidth"] = "Publicar en Dreamwidth";
+App::$strings["Enable Dreamwidth Post Plugin"] = "Activar el plugin de publicación en Dreamwidth";
+App::$strings["Dreamwidth username"] = "Nombre de usuario en Dreamwidth";
+App::$strings["Dreamwidth password"] = "Contraseña en Dreamwidth";
+App::$strings["Post to Dreamwidth by default"] = "Publicar en Dreamwidth de forma predeterminada";
+App::$strings["Dreamwidth Post Settings"] = "Ajustes de publicación en Dreamwidth";
+App::$strings["Install Firefox Sharing Tools"] = "Instalar las herramientas de compartición de Firefox";
+App::$strings["Share content from Firefox to \$Projectname"] = "Compartir contenido desde Firefox a \$Projectname";
+App::$strings["Install Firefox Sharing Tools to this web browser"] = "Instalar las herramientas de compartición de Firefox en este navegador";
App::$strings["Hubzilla Directory Stats"] = "Estadísticas de directorio de Hubzilla";
App::$strings["Total Hubs"] = "Número total de servidores";
App::$strings["Hubzilla Hubs"] = "Servidores (hubs) de Hubzilla";
@@ -1738,167 +1981,31 @@ App::$strings["Average Age"] = "Promedio de edad";
App::$strings["Known Chatrooms"] = "Salas de chat conocidas";
App::$strings["Known Tags"] = "Etiquetas conocidas";
App::$strings["Please note Diaspora and Friendica statistics are merely those **this directory** is aware of, and not all those known in the network. This also applies to chatrooms,"] = "Tenga en cuenta que las estadísticas de Diaspora y Friendica se refieren únicamente a aquellas de las que **este directorio** es consciente, y no a todos los conocidos en la red. Esto también es aplicable a las salas de chat,";
-App::$strings["Project Servers and Resources"] = "Servidores y recursos del proyecto";
-App::$strings["Project Creator and Tech Lead"] = "Creador del proyecto y director técnico";
-App::$strings["Admin, developer, directorymin, support bloke"] = "Administrador, desarrollador, administrador del directorio, trabajador de apoyo";
-App::$strings["And the hundreds of other people and organisations who helped make the Hubzilla possible."] = "Y los cientos de personas y organizaciones más que ayudaron a hacer posible Hubzilla.";
-App::$strings["The Redmatrix/Hubzilla projects are provided primarily by volunteers giving their time and expertise - and often paying out of pocket for services they share with others."] = "Los proyectos Redmatrix / Hubzilla están proporcionados principalmente por voluntarios que les prestan su tiempo y experiencia, pagando a menudo de su bolsillo por los servicios que comparten con otros.";
-App::$strings["There is no corporate funding and no ads, and we do not collect and sell your personal information. (We don't control your personal information - <strong>you do</strong>.)"] = "No hay financiación corporativa ni publicidad y no recogemos ni vendemos su información personal. (De hecho, no tenemos control sobre sus datos privados. <Strong>Usted lo tiene</strong>.)";
-App::$strings["Help support our ground-breaking work in decentralisation, web identity, and privacy."] = "Ayude apoyando nuestro trabajo pionero en la descentralización, la identidad web, y la privacidad.";
-App::$strings["Your donations keep servers and services running and also helps us to provide innovative new features and continued development."] = "Sus donaciones mantienen servidores y servicios en ejecución y también nos ayudan a proporcionar nuevas características innovadoras y a mantener el desarrollo de forma continuada.";
-App::$strings["Donate"] = "Donar";
-App::$strings["Choose a project, developer, or public hub to support with a one-time donation"] = "Elija un proyecto, desarrollador, o \"hub\" público para apoyar con una donación de una sola vez";
-App::$strings["Donate Now"] = "Donar ahora";
-App::$strings["<strong><em>Or</em></strong> become a project sponsor (Hubzilla Project only)"] = "<strong><em>O</em></strong> convertirse en un patrocinador del proyecto (sólo del proyecto Hubzilla)";
-App::$strings["Please indicate if you would like your first name or full name (or nothing) to appear in our sponsor listing"] = "Por favor, indique si desea que su nombre de pila o el nombre completo (o nada) aparezca en nuestra lista de patrocinadores";
-App::$strings["Sponsor"] = "Patrocinador";
-App::$strings["Special thanks to: "] = "Agradecimiento especial a: ";
-App::$strings["Post to Dreamwidth"] = "Publicar en Dreamwidth";
-App::$strings["Enable Dreamwidth Post Plugin"] = "Activar el plugin de publicación en Dreamwidth";
-App::$strings["Dreamwidth username"] = "Nombre de usuario en Dreamwidth";
-App::$strings["Dreamwidth password"] = "Contraseña en Dreamwidth";
-App::$strings["Post to Dreamwidth by default"] = "Publicar en Dreamwidth de forma predeterminada";
-App::$strings["Dreamwidth Post Settings"] = "Ajustes de publicación en Dreamwidth";
-App::$strings["Flattr this!"] = "¡Apoyar esto en Flattr!";
-App::$strings["Flattr widget settings updated."] = "Los ajustes del widget Flattr han sido actualizados.";
-App::$strings["Flattr user"] = "Usuario en Flattr";
-App::$strings["URL of the Thing to flattr"] = "URL de la Cosa para apoyar en flattr";
-App::$strings["If empty channel URL is used"] = "Si está vacío, se usa la URL del canal";
-App::$strings["Title of the Thing to flattr"] = "Título de la Cosa para apoyar en flattr";
-App::$strings["If empty \"channel name on The Hubzilla\" will be used"] = "Si está vacío, se usará \"nombre del canal en Hubzilla\"";
-App::$strings["Static or dynamic flattr button"] = "Botón de flattr estático o dinámico";
-App::$strings["static"] = "estático";
-App::$strings["dynamic"] = "dinámico";
-App::$strings["Alignment of the widget"] = "Alineamiento del widget";
-App::$strings["left"] = "izquierda";
-App::$strings["right"] = "derecha";
-App::$strings["Enable Flattr widget"] = "Habilitar el widget Flattr";
-App::$strings["Flattr Widget Settings"] = "Ajustes del widget Flattr";
-App::$strings["Contact not found."] = "No se ha encontrado el contacto.";
-App::$strings["This may occasionally happen if contact was requested by both persons and it has already been approved."] = "Esto puede ocurrir de vez en cuando si el contacto fue solicitado por ambas personas y ya había sido aprobado.";
-App::$strings["Response from remote site was not understood."] = "No se entendió la respuesta del sitio remoto.";
-App::$strings["Unexpected response from remote site: "] = "Respuesta inesperada desde el sitio remoto: ";
-App::$strings["Confirmation completed successfully."] = "La confirmación se ha completado satisfactoriamente.";
-App::$strings["Remote site reported: "] = "El sitio remoto informó: ";
-App::$strings["Temporary failure. Please wait and try again."] = "Fallo temporal. Por favor, espere e inténtelo de nuevo.";
-App::$strings["Introduction failed or was revoked."] = "La solicitud ha fallado o ha sido revocada.";
-App::$strings["Unable to set contact photo."] = "No se puede establecer la foto del contacto.";
-App::$strings["%1\$s is now friends with %2\$s"] = "%1\$s es amigo ahora de %2\$s";
-App::$strings["No user record found for '%s' "] = "No se encuentra ningún registro de usuario para '%s' ";
-App::$strings["Our site encryption key is apparently messed up."] = "La clave de cifrado de nuestro sitio está aparentemente en mal estado.";
-App::$strings["Empty site URL was provided or URL could not be decrypted by us."] = "Se ha proporcionado la URL de un sitio inexistente o la URL no ha podido ser descifrada por nosotros.";
-App::$strings["Contact record was not found for you on our site."] = "No se ha encontrado un registro de contacto para usted en nuestro sitio.";
-App::$strings["Site public key not available in contact record for URL %s."] = "La clave del sitio público no está disponible en el registro de contacto para la URL %s.";
-App::$strings["The ID provided by your system is a duplicate on our system. It should work if you try again."] = "La ID proporcionada por su sistema está duplicada en el nuestro. Debería funcionar si lo intenta de nuevo.";
-App::$strings["Unable to set your contact credentials on our system."] = "No se pueden establecer sus credenciales de contacto en nuestro sistema.";
-App::$strings["Unable to update your contact profile details on our system"] = "No se pueden actualizar los detalles del perfil de su contacto en nuestro sistema";
-App::$strings["[Name Withheld]"] = "[Nombre omitido]";
-App::$strings["%1\$s has joined %2\$s"] = "%1\$s se ha unido a %2\$s";
-App::$strings["%1\$s welcomes %2\$s"] = "%1\$s da la bienvenida a %2\$s";
-App::$strings["This introduction has already been accepted."] = "Esta solicitud ya ha sido aceptada.";
-App::$strings["Profile location is not valid or does not contain profile information."] = "La ubicación del perfil no es válida o no contiene información del perfil.";
-App::$strings["Warning: profile location has no identifiable owner name."] = "Advertencia: el perfil de la ubicación no tiene un nombre de propietario identificable.";
-App::$strings["Warning: profile location has no profile photo."] = "Advertencia: el perfil de la ubicación no tiene ninguna foto de perfil.";
-App::$strings["%d required parameter was not found at the given location"] = array(
- 0 => "Los parámetros requeridos de %d no se han encontrado en la localización proporcionada",
- 1 => "Los parámetros requeridos de %d no se han encontrado en la localización proporcionada",
-);
-App::$strings["Introduction complete."] = "Solicitud completa.";
-App::$strings["Unrecoverable protocol error."] = "Error irrecuperable de protocolo.";
-App::$strings["Profile unavailable."] = "Perfil no disponible.";
-App::$strings["%s has received too many connection requests today."] = "%s ha recibido demasiadas peticiones de conexión hoy.";
-App::$strings["Spam protection measures have been invoked."] = "Se han activado las medidas de protección contra el spam.";
-App::$strings["Friends are advised to please try again in 24 hours."] = "Se aconseja a los amigos que por favor lo intenten de nuevo en 24 horas.";
-App::$strings["Invalid locator"] = "Localizador no válido";
-App::$strings["Invalid email address."] = "Dirección de correo no válida.";
-App::$strings["This account has not been configured for email. Request failed."] = "Esta cuenta no se ha configurado para el correo electrónico. La petición ha fallado.";
-App::$strings["Unable to resolve your name at the provided location."] = "No se puede resolver el nombre en la localización proporcionada.";
-App::$strings["You have already introduced yourself here."] = "Ya se ha inscrito usted mismo aquí.";
-App::$strings["Apparently you are already friends with %s."] = "Al parecer ya es amigo de %s";
-App::$strings["Invalid profile URL."] = "URL del perfil no válida.";
-App::$strings["Disallowed profile URL."] = "No se ha permitido la URL del perfil.";
-App::$strings["Failed to update contact record."] = "Se ha producido un error al actualizar el registro del contacto.";
-App::$strings["Your introduction has been sent."] = "Su solicitud ha sido enviada.";
-App::$strings["Please login to confirm introduction."] = "Por favor, inicie sesión para confirmar la solicitud.";
-App::$strings["Incorrect identity currently logged in. Please login to <strong>this</strong> profile."] = "Actualmente su identidad en el sistema es incorrecta. Por favor, inicie sesión en <strong>este</strong> perfil.";
-App::$strings["Confirm"] = "Confirmar";
-App::$strings["Hide this contact"] = "Ocultar este contacto";
-App::$strings["Welcome home %s."] = "Bienvenido a la página principal %s.";
-App::$strings["Please confirm your introduction/connection request to %s."] = "Por favor, confirme su solicitud de conexión a %s.";
-App::$strings["Please enter your 'Identity Address' from one of the following supported communications networks:"] = "Por favor, elija su 'dirección identificativa' de entre las siguientes redes de comunicación soportadas: ";
-App::$strings["If you are not yet a member of the free social web, <a href=\"%s/siteinfo\">follow this link to find a public Friendica site and join us today</a>."] = "Si aún no es miembro de las redes sociales libres, <a href=\"%s/siteinfo\">siga este enlace para encontrar un sitio público de Friendica y unirse a nosotros hoy</a>.";
-App::$strings["Friend/Connection Request"] = "Solicitud de conexión o amistad";
-App::$strings["Examples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, testuser@identi.ca"] = "Ejemplos: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, testuser@identi.ca";
-App::$strings["Please answer the following:"] = "Por favor, responda a lo siguiente: ";
-App::$strings["Does %s know you?"] = "¿%s le conoce?";
-App::$strings["Add a personal note:"] = "Añadir un comentario personal: ";
-App::$strings["Friendica"] = "Friendica";
-App::$strings["StatusNet/Federated Social Web"] = "Red social federada StatusNet";
-App::$strings["Diaspora"] = "Diaspora";
-App::$strings[" - please do not use this form. Instead, enter %s into your Diaspora search bar."] = "- Por favor, no use este formato. En su lugar, escriba %s en la barra de búsqueda de Diaspora.";
-App::$strings["Your Identity Address:"] = "Su dirección identificativa: ";
-App::$strings["Submit Request"] = "Enviar la solicitud";
-App::$strings["GNU-Social Protocol Settings updated."] = "Se han actualizado los ajustes del protocolo de GNU-Social.";
-App::$strings["Enable the (experimental) GNU-Social protocol for this channel"] = "Activar el protocolo (experimental) de GNU-Social para este canal";
-App::$strings["GNU-Social Protocol Settings"] = "Ajustes del protocolo de GNU-Social";
-App::$strings["Follow"] = "Seguir";
-App::$strings["%1\$s is now following %2\$s"] = "%1\$s está siguiendo ahora a %2\$s";
-App::$strings["Friendica Photo Album Import"] = "Importar un álbum de fotos de Friendica";
-App::$strings["This will import all your Friendica photo albums to this Red channel."] = "Esto importará todos sus álbumes de fotos de Friendica a este canal de Hubzilla.";
-App::$strings["Friendica Server base URL"] = "URL base del servidor de Friendica";
-App::$strings["Friendica Login Username"] = "Nombre de inicio de sesión en Friendica";
-App::$strings["Friendica Login Password"] = "Contraseña de inicio de sesión en Friendica";
-App::$strings["Send email to all members"] = "Enviar un correo electrónico a todos los miembros";
-App::$strings["$1%s Administrator"] = "Administrador de $1%s ";
-App::$strings["No recipients found."] = "No se han encontrado destinatarios.";
-App::$strings["%1\$d of %2\$d messages sent."] = "%1\$d de %2\$d mensajes enviados.";
-App::$strings["Send email to all hub members."] = "Enviar un correo electrónico a todos los miembros del hub.";
-App::$strings["Message subject"] = "Asunto del mensaje";
-App::$strings["Sender Email address"] = "Dirección de correo electrónico del remitente";
-App::$strings["Test mode (only send to hub administrator)"] = "Modo de prueba (enviar sólo al administrador del hub)";
-App::$strings["Post to Insanejournal"] = "Publicar en Insanejournal";
-App::$strings["Enable InsaneJournal Post Plugin"] = "Habilitar el plugin de publicación en InsaneJournal";
-App::$strings["InsaneJournal username"] = "Nombre de usuario en InsaneJournal";
-App::$strings["InsaneJournal password"] = "Contraseña en InsaneJournal";
-App::$strings["Post to InsaneJournal by default"] = "Publicar por defecto en InsaneJournal";
-App::$strings["InsaneJournal Post Settings"] = "Ajustes de publicación en InsaneJournal";
-App::$strings["Insane Journal Settings saved."] = "Se han guardado los ajustes de InsaneJournal.";
+App::$strings["Email notification hub"] = "Notificación por correo electrónico del hub";
+App::$strings["Hostname"] = "Nombre del host";
+App::$strings["Mailhost Settings"] = "Ajustes de Mailhost";
+App::$strings["MAILHOST Settings saved."] = "Se han guardado los ajustes de MAILHOST.";
+App::$strings["Your Webbie:"] = "Su webbie: ";
+App::$strings["Fontsize (px):"] = "Tamaño de fuente (px): ";
+App::$strings["Link:"] = "Enlace: ";
+App::$strings["Like us on Hubzilla"] = "Múestrenos su agrado en Hubzilla";
+App::$strings["Embed:"] = "Incorporado: ";
+App::$strings["Photos imported"] = "Se han importado las fotos";
+App::$strings["Redmatrix Photo Album Import"] = "Importar un álbum de fotos de Redmatrix";
+App::$strings["This will import all your Redmatrix photo albums to this channel."] = "Esto importará todos sus álbumes de fotos de Redmatrix a este canal.";
+App::$strings["Redmatrix Server base URL"] = "URL base del servidor Redmatrix";
+App::$strings["Redmatrix Login Username"] = "Nombre de inicio de sesión en Redmatrix";
+App::$strings["Redmatrix Login Password"] = "Contraseña de inicio de sesión en Redmatrix";
+App::$strings["Import just this album"] = "Importar solo este álbum";
+App::$strings["Leave blank to import all albums"] = "Dejar en blanco para importar todos los álbumes";
+App::$strings["Maximum count to import"] = "Límite máximo de importación";
+App::$strings["0 or blank to import all available"] = "0 o en blanco para importar todos los disponibles";
App::$strings["Channels to auto connect"] = "Canales para conexión automática";
App::$strings["Comma separated list"] = "Lista separada por comas";
App::$strings["Popular Channels"] = "Canales populares";
App::$strings["IRC Settings"] = "Ajustes de IRC";
App::$strings["IRC settings saved."] = "Se han guardado los ajustes de IRC.";
App::$strings["IRC Chatroom"] = "Sala de chat IRC";
-App::$strings["Status:"] = "Estado:";
-App::$strings["Activate addon"] = "Habilitar complemento";
-App::$strings["Hide Jappixmini Chat-Widget from the webinterface"] = "Ocultar el widget de chat Jappixmini en la interfaz web";
-App::$strings["Jabber username"] = "Nombre de usuario en Jabber";
-App::$strings["Jabber server"] = "Servidor de Jabber";
-App::$strings["Jabber BOSH host URL"] = "URL del host BOSH de Jabber";
-App::$strings["Jabber password"] = "Contraseña en Jabber";
-App::$strings["Encrypt Jabber password with Hubzilla password"] = "Cifrar la contraseña de Jabber con la contraseña de Hubzilla";
-App::$strings["Hubzilla password"] = "Contraseña de Hubzilla";
-App::$strings["Approve subscription requests from Hubzilla contacts automatically"] = "Aprobar automáticamente las solicitudes de suscripción de los contactos de Hubzilla";
-App::$strings["Purge internal list of jabber addresses of contacts"] = "Purgar la lista interna de las direcciones de contactos de jabber";
-App::$strings["Configuration Help"] = "Ayuda para los ajustes";
-App::$strings["Jappix Mini Settings"] = "Ajustes de Jappix Mini";
-App::$strings["Upload a file"] = "Subir un fichero";
-App::$strings["Drop files here to upload"] = "Arrastre los ficheros aquí para subirlos";
-App::$strings["Failed"] = "Ha fallado";
-App::$strings["No files were uploaded."] = "No se han subido ficheros.";
-App::$strings["Uploaded file is empty"] = "El fichero subido está vacío";
-App::$strings["Image exceeds size limit of "] = "La imagen supera el límite de tamaño de ";
-App::$strings["File has an invalid extension, it should be one of "] = "El fichero tiene una extensión no válida, debería ser una de estas: ";
-App::$strings["Upload was cancelled, or server error encountered"] = "Se canceló la carga o se encontró un error del servidor";
-App::$strings["An account has been created for you."] = "Se ha creado una cuenta para usted.";
-App::$strings["Authentication successful but rejected: account creation is disabled."] = "Autenticación correcta pero rechazada: la creación de cuentas está deshabilitada.";
-App::$strings["Post to Libertree"] = "Publicar en Libertree";
-App::$strings["Enable Libertree Post Plugin"] = "Habilitar el plugin de publicación en Libertree";
-App::$strings["Libertree API token"] = "Token de la API de Libertree";
-App::$strings["Libertree site URL"] = "URL del servidor de Libertree";
-App::$strings["Post to Libertree by default"] = "Publicar en Libertree por defecto";
-App::$strings["Libertree Post Settings"] = "Ajustes de publicación en Libertree";
-App::$strings["Libertree Settings saved."] = "Se han guardado los ajustes de Libertree.";
App::$strings["Post to LiveJournal"] = "Publicar en LiveJournal";
App::$strings["Enable LiveJournal Post Plugin"] = "Habilitar el plugin de publicación en LiveJournal";
App::$strings["LiveJournal username"] = "Nombre de usuario en LiveJournal";
@@ -1906,36 +2013,34 @@ App::$strings["LiveJournal password"] = "Contraseña en LiveJournal";
App::$strings["Post to LiveJournal by default"] = "Publicar en LiveJournal por defecto";
App::$strings["LiveJournal Post Settings"] = "Ajustes de publicación en LiveJournal";
App::$strings["LiveJournal Settings saved."] = "Se han guardado los ajustes de LiveJournal.";
-App::$strings["Logfile archive directory"] = "Directorio de los ficheros de informe";
-App::$strings["Directory to store rotated logs"] = "Directorio para almacenar los informes rotados";
-App::$strings["Logfile size in bytes before rotating"] = "Tamaño del fichero de informe en bytes antes de rotarlo";
-App::$strings["Number of logfiles to retain"] = "Número de ficheros de informe que se deben retener";
-App::$strings["Email notification hub"] = "Notificación por correo electrónico del hub";
-App::$strings["Hostname"] = "Nombre del host";
-App::$strings["Mailhost Settings"] = "Ajustes de Mailhost";
-App::$strings["MAILHOST Settings saved."] = "Se han guardado los ajustes de MAILHOST.";
-App::$strings["lonely"] = "Solo/a";
-App::$strings["drunk"] = "ebrio/a";
-App::$strings["horny"] = "caliente";
-App::$strings["stoned"] = "drogado/a";
-App::$strings["fucked up"] = "jodido/a";
-App::$strings["clusterfucked"] = "hecho/a polvo";
-App::$strings["crazy"] = "loco/a";
-App::$strings["hurt"] = "ofendido/a";
-App::$strings["sleepy"] = "soñoliento/a";
-App::$strings["grumpy"] = "gruñón/ona";
-App::$strings["high"] = "superior";
-App::$strings["semi-conscious"] = "semiconsciente";
-App::$strings["in love"] = "enamorado/a";
-App::$strings["in lust"] = "lujurioso/a";
-App::$strings["naked"] = "desnudo/a";
-App::$strings["stinky"] = "apestoso/a";
-App::$strings["sweaty"] = "sudoroso/a";
-App::$strings["bleeding out"] = "una maldición";
-App::$strings["victorious"] = "victorioso/a";
-App::$strings["defeated"] = "derrotado/a";
-App::$strings["envious"] = "envidioso/a";
-App::$strings["jealous"] = "celoso/a";
+App::$strings["We encountered a problem while logging in with the OpenID you provided. Please check the correct spelling of the ID."] = "Encontramos un problema al iniciar sesión con el OpenID que proporcionó. Compruebe si el ID está correctamente escrito.";
+App::$strings["The error message was:"] = "El mensaje de error ha sido: ";
+App::$strings["First Name"] = "Nombre";
+App::$strings["Last Name"] = "Apellido";
+App::$strings["Nickname"] = "Alias";
+App::$strings["Full Name"] = "Nombre completo";
+App::$strings["Profile Photo 16px"] = "Foto del perfil 16px";
+App::$strings["Profile Photo 32px"] = "Foto del perfil 32px";
+App::$strings["Profile Photo 48px"] = "Foto del perfil 48px";
+App::$strings["Profile Photo 64px"] = "Foto del perfil 64px";
+App::$strings["Profile Photo 80px"] = "Foto del perfil 80px";
+App::$strings["Profile Photo 128px"] = "Foto del perfil 128px";
+App::$strings["Timezone"] = "Zona horaria";
+App::$strings["Birth Year"] = "Año de nacimiento";
+App::$strings["Birth Month"] = "Mes de nacimiento";
+App::$strings["Birth Day"] = "Día de nacimiento";
+App::$strings["Birthdate"] = "Fecha de nacimiento";
+App::$strings["OpenID protocol error. No ID returned."] = "Error de protocolo OpenID. No se recuperó ninguna ID.";
+App::$strings["Login failed."] = "El acceso ha fallado.";
+App::$strings["Male"] = "Hombre";
+App::$strings["Female"] = "Mujer";
+App::$strings["You're welcome."] = "Bienvenido.";
+App::$strings["Ah shucks..."] = "Ah, joder...";
+App::$strings["Don't mention it."] = "No lo menciones.";
+App::$strings["&lt;blush&gt;"] = "&lt;sonrojo&gt;";
+App::$strings["Page to load after login"] = "Página para cargar tras el inicio de sesión";
+App::$strings["Examples: &quot;apps&quot;, &quot;network?f=&gid=37&quot; (privacy collection), &quot;channel&quot; or &quot;notifications/system&quot; (leave blank for default network page (grid)."] = "Ejemplos: &quot;aplicaciones&quot;, &quot;mi red?f=&gid=37&quot; (grupo de canales), &quot;mi canal&quot; or &quot;notificaciones del sistema&quot; (dejar en blanco para la página de mi red por defecto (grid).";
+App::$strings["Startpage Settings"] = "Ajustes de startpage";
App::$strings["bitchslap"] = "una bofetada humillante";
App::$strings["bitchslapped"] = "ha abofeteado de forma humillante a";
App::$strings["shag"] = "un polvo";
@@ -1974,50 +2079,46 @@ App::$strings["bonk"] = "un golpe";
App::$strings["bonked"] = "ha golpeado a";
App::$strings["declare undying love for"] = "una declaración de amor eterno";
App::$strings["declared undying love for"] = "ha declarado amor eterno a";
-App::$strings["Save Settings"] = "Guardar ajustes";
-App::$strings["text to include in all outgoing posts from this site"] = "texto a incluir en todos los mensajes salientes de este sitio";
-App::$strings["Federate"] = "Federar";
-App::$strings["nofed Settings saved."] = "Se han guardado los ajustes de nofed.";
-App::$strings["Allow Federation Toggle"] = "Permitir alternancia de federación";
-App::$strings["Federate posts by default"] = "Federar las publicaciones por defecto";
-App::$strings["NoFed Settings"] = "Ajustes de NoFed";
+App::$strings["Diaspora Protocol Settings updated."] = "Los ajustes del protocolo de Diaspora se han actualizado.";
+App::$strings["Enable the Diaspora protocol for this channel"] = "Activar el protocolo de Diaspora para este canal";
+App::$strings["Allow any Diaspora member to comment on your public posts"] = "Permitir a cualquier miembro de Diaspora comentar sus entradas públicas";
+App::$strings["Prevent your hashtags from being redirected to other sites"] = "Impedir que sus \"hashtags\" sean redirigidos a otros sitios ";
+App::$strings["Followed hashtags (comma separated, do not include the #)"] = "\"Hashtags\" seguidos (separados por comas, sin incluir #)";
+App::$strings["Diaspora Protocol Settings"] = "Ajustes del protocolo de Diaspora";
+App::$strings["No username found in import file."] = "No se ha encontrado el nombre de usuario en el fichero de importación.";
+App::$strings["Unable to create a unique channel address. Import failed."] = "No se ha podido crear una dirección de canal única. Ha fallado la importación.";
+App::$strings["Error retrieving wiki"] = "Error al recuperar el wiki";
+App::$strings["Error creating zip file export folder"] = "Error al crear el fichero comprimido zip de la carpeta a exportar";
+App::$strings["Error downloading wiki: "] = "Error al descargar el wiki: ";
+App::$strings["Your account on %s will expire in a few days."] = "Su cuenta en %s caducará en unos pocos días.";
+App::$strings["Your $Productname test account is about to expire."] = "Su cuenta de prueba de $Productname está a punto de caducar.";
+App::$strings["Enable Rainbowtag"] = "Habilitar Rainbowtag";
+App::$strings["Rainbowtag Settings"] = "Ajustes de Rainbowtag";
+App::$strings["Rainbowtag Settings saved."] = "Se han guardado los ajustes de Rainbowtag.";
+App::$strings["Show Upload Limits"] = "Mostrar los límites de subida";
+App::$strings["Hubzilla configured maximum size: "] = "Tamaño máximo configurado por Hubzilla: ";
+App::$strings["PHP upload_max_filesize: "] = "PHP upload_max_filesize: ";
+App::$strings["PHP post_max_size (must be larger than upload_max_filesize): "] = "PHP post_max_size (debe ser mayor que upload_max_filesize): ";
+App::$strings["Recent Channel/Profile Viewers"] = "Visitantes recientes del canal o perfil";
+App::$strings["This plugin/addon has not been configured."] = "El plugin o complemento no se ha configurado.";
+App::$strings["Please visit the Visage settings on %s"] = "Por favor, revise los ajustes de Visage en %s";
+App::$strings["your feature settings page"] = "su página de ajustes de las funcionalidades";
+App::$strings["No entries."] = "No hay entradas.";
+App::$strings["Enable Visage Visitor Logging"] = "Habilitar el registro de visitantes de Visage";
+App::$strings["Visage Settings"] = "Ajustes de Visage";
App::$strings["Nsabait Settings updated."] = "Se han actualizado los ajustes de Nsabait";
App::$strings["Enable NSAbait Plugin"] = "Habilitar el plugin NSAbait";
App::$strings["NSAbait Settings"] = "Ajustes de NSAbait";
-App::$strings["This plugin looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW. This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "Este complemento busca en los mensajes las palabras o texto que se especifican a continuación y contrae cualquier contenido que contenga esas palabras clave para que no se muestre en momentos inapropiados, como insinuaciones sexuales que pueden ser impropias en un entorno de trabajo. Es una muestra de educación y se recomienda marcar cualquier contenido que contenga desnudos con #NSFW. Este filtro también puede coincidir con cualquier otra palabra o texto que especifique y, por lo tanto, puede utilizarse como un filtro de contenido de propósito general.";
-App::$strings["Enable Content filter"] = "Habilitar filtro de contenido";
-App::$strings["Comma separated list of keywords to hide"] = "Lista separada por comas de palabras clave para ocultar";
-App::$strings["Word, /regular-expression/, lang=xx, lang!=xx"] = "Palabra, /expresión regular/, lang=xx, lang!=xx";
-App::$strings["Not Safe For Work Settings"] = "No es seguro para ajustes de trabajo";
-App::$strings["General Purpose Content Filter"] = "Filtro de contenido de propósito general";
-App::$strings["NSFW Settings saved."] = "Se han guardado los ajustes de NSFW.";
-App::$strings["Possible adult content"] = "Posible contenido para adultos";
-App::$strings["%s - view"] = "ver - %s";
-App::$strings["System defaults:"] = "Valores predeterminados del sistema: ";
-App::$strings["Preferred Clipart IDs"] = "IDs de las imágenes clipart preferidas";
-App::$strings["List of preferred clipart ids. These will be shown first."] = "Lista de ids de imágenes de clipart preferidas. Se verán en primer lugar.";
-App::$strings["Default Search Term"] = "Términos de búsqueda predeterminados";
-App::$strings["The default search term. These will be shown second."] = "Los términos de búsqueda predeterminados. Estos se mostrarán en segundo lugar.";
-App::$strings["Return After"] = "Regresar después";
-App::$strings["Page to load after image selection."] = "Página para cargar después de la selección de imágenes.";
-App::$strings["Edit Profile"] = "Editar el perfil";
-App::$strings["Profile List"] = "Lista de perfiles";
-App::$strings["Order of Preferred"] = "Orden de preferencia";
-App::$strings["Sort order of preferred clipart ids."] = "Orden de clasificación de los identificadores de imágenes clipart preferidas.";
-App::$strings["Newest first"] = "Las más nuevas en primer lugar";
-App::$strings["As entered"] = "Tal como se ingresaron";
-App::$strings["Order of other"] = "Orden de los demás";
-App::$strings["Sort order of other clipart ids."] = "Orden de clasificación de otros ids de imágenes clipart.";
-App::$strings["Most downloaded first"] = "Las más descargadas en primer lugar";
-App::$strings["Most liked first"] = "Las más apreciadas en primer lugar";
-App::$strings["Preferred IDs Message"] = "Mensaje de IDs preferido";
-App::$strings["Message to display above preferred results."] = "Mensaje para mostrar sobre los resultados preferidos.";
-App::$strings["Uploaded by: "] = "Subida por: ";
-App::$strings["Drawn by: "] = "Creada por: ";
-App::$strings["Or select from a free OpenClipart.org image:"] = "O seleccionar una imagen gratuita de OpenClipart.org: ";
-App::$strings["Search Term"] = "Término de búsqueda";
-App::$strings["Unknown error. Please try again later."] = "Error desconocido. Por favor, inténtelo otra vez.";
-App::$strings["Profile photo updated successfully."] = "Se ha actualizado con éxito la foto de perfil.";
+App::$strings["Send test email"] = "Enviar un correo electrónico de prueba";
+App::$strings["No recipients found."] = "No se han encontrado destinatarios.";
+App::$strings["Mail sent."] = "El correo electrónico ha sido enviado.";
+App::$strings["Sending of mail failed."] = "No se pudo enviar el correo.";
+App::$strings["Mail Test"] = "Prueba de correo";
+App::$strings["Message subject"] = "Asunto del mensaje";
+App::$strings["Reconnecting %d connections"] = "Reconectando %d conexiones";
+App::$strings["Diaspora Reconnect"] = "Reconectar con Diaspora";
+App::$strings["Use this form to re-establish Diaspora connections which were initially made from a different hub."] = "Utilice este formulario para restablecer las conexiones de diáspora que se hicieron inicialmente desde un hub diferente.";
+App::$strings["Reconnect"] = "Reconectar";
App::$strings["View Larger"] = "Ver más grande";
App::$strings["Tile Server URL"] = "URL del servidor de mosaicos de imágenes ";
App::$strings["A list of <a href=\"http://wiki.openstreetmap.org/wiki/TMS\" target=\"_blank\">public tile servers</a>"] = "Una lista de <a href=\"http://wiki.openstreetmap.org/wiki/TMS\" target=\"_blank\">servidores públicos de mosaicos de imágenes</a>";
@@ -2027,89 +2128,104 @@ App::$strings["Default zoom"] = "Zoom predeterminado";
App::$strings["The default zoom level. (1:world, 18:highest, also depends on tile server)"] = "El nivel de zoom predeterminado. (1: mundo, 18: el más alto, también depende del servidor del mosaico de imágenes)";
App::$strings["Include marker on map"] = "Incluir un marcador en el mapa";
App::$strings["Include a marker on the map."] = "Incluir un marcador en el mapa.";
-App::$strings["Message to display on every page on this server"] = "Mensaje para mostrar en todas las páginas de este servidor";
-App::$strings["Pageheader Settings"] = "Ajustes del encabezado de página";
-App::$strings["pageheader Settings saved."] = "Se han guardado los ajustes del encabezado de página.";
-App::$strings["This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> analytics tool."] = "Este sitio es rastreado mediante la herramienta analítica <a href='http://www.piwik.org'>Piwik</a>.";
-App::$strings["If you do not want that your visits are logged this way you <a href='%s'>can set a cookie to prevent Piwik from tracking further visits of the site</a> (opt-out)."] = "Si usted no quiere que sus visitas se registren de esta manera <a href='%s'>puede establecer una cookie para evitar que Piwik rastree otras visitas del sitio</a> (opt-out).";
-App::$strings["Piwik Base URL"] = "URL base de Piwik";
-App::$strings["Absolute path to your Piwik installation. (without protocol (http/s), with trailing slash)"] = "Ruta absoluta a la instalación de Piwik. (Sin protocolo (http/s), con barra diagonal)";
-App::$strings["Site ID"] = "ID del sitio";
-App::$strings["Show opt-out cookie link?"] = "Mostrar el enlace de la cookie opt-out?";
-App::$strings["Asynchronous tracking"] = "Rastreo asíncrono";
-App::$strings["Enable frontend JavaScript error tracking"] = "Habilitar la interfaz JavaScript de seguimiento de errores";
-App::$strings["This feature requires Piwik >= 2.2.0"] = "Esta funcionalidad requiere Piwik >= 2.2.0";
-App::$strings["Planets Settings updated."] = "Se han guardado los ajustes de Planets.";
-App::$strings["Enable Planets Plugin"] = "Habilitar el plugin Planets";
-App::$strings["Planets Settings"] = "Ajustes de Planets";
-App::$strings["You are now authenticated to pumpio."] = "Ahora está autenticado en pump.io.";
-App::$strings["return to the featured settings page"] = "Volver a la página de configuración destacada";
-App::$strings["Post to Pump.io"] = "Publicar en Pump.io";
-App::$strings["Pump.io servername"] = "Nombre del servidor de Pump.io";
-App::$strings["Without \"http://\" or \"https://\""] = "Sin \"http://\" or \"https://\"";
-App::$strings["Pump.io username"] = "Nombre de usuario en Pump.io";
-App::$strings["Without the servername"] = "Sin el nombre del servidor";
-App::$strings["You are not authenticated to pumpio"] = "No está autenticado en pump.io";
-App::$strings["(Re-)Authenticate your pump.io connection"] = "(Re-)Autenticar su conexión en pump.io";
-App::$strings["Enable pump.io Post Plugin"] = "Habilitar el plugin de publicación en pump.io";
-App::$strings["Post to pump.io by default"] = "Publicar por defecto en pump.io";
-App::$strings["Should posts be public"] = "¿Las entradas deben ser públicas?";
-App::$strings["Mirror all public posts"] = "Reflejar todos los mensajes públicos";
-App::$strings["Pump.io Post Settings"] = "Ajustes de publicación en pump.io";
-App::$strings["PumpIO Settings saved."] = "Se han guardado los ajustes de PumpIO.";
-App::$strings["QR code"] = "Código QR";
-App::$strings["QR Generator"] = "Generador QR";
-App::$strings["Enter some text"] = "Escribir algún texto";
-App::$strings["Enable Rainbowtag"] = "Habilitar Rainbowtag";
-App::$strings["Rainbowtag Settings"] = "Ajustes de Rainbowtag";
-App::$strings["Rainbowtag Settings saved."] = "Se han guardado los ajustes de Rainbowtag.";
-App::$strings["You're welcome."] = "Bienvenido.";
-App::$strings["Ah shucks..."] = "Ah, joder...";
-App::$strings["Don't mention it."] = "No lo menciones.";
-App::$strings["&lt;blush&gt;"] = "&lt;sonrojo&gt;";
-App::$strings["Redmatrix File Storage Import"] = "Importar repositorio de ficheros de Redmatrix";
-App::$strings["This will import all your Redmatrix cloud files to this channel."] = "Esto importará todos sus ficheros de la nube de Redmatrix a este canal.";
-App::$strings["Redmatrix Server base URL"] = "URL base del servidor Redmatrix";
-App::$strings["Redmatrix Login Username"] = "Nombre de inicio de sesión en Redmatrix";
-App::$strings["Redmatrix Login Password"] = "Contraseña de inicio de sesión en Redmatrix";
-App::$strings["file"] = "fichero";
-App::$strings["Photos imported"] = "Se han importado las fotos";
-App::$strings["Redmatrix Photo Album Import"] = "Importar un álbum de fotos de Redmatrix";
-App::$strings["This will import all your Redmatrix photo albums to this channel."] = "Esto importará todos sus álbumes de fotos de Redmatrix a este canal.";
-App::$strings["Import just this album"] = "Importar solo este álbum";
-App::$strings["Leave blank to import all albums"] = "Dejar en blanco para importar todos los álbumes";
-App::$strings["Maximum count to import"] = "Límite máximo de importación";
-App::$strings["0 or blank to import all available"] = "0 o en blanco para importar todos los disponibles";
+App::$strings["Save Settings"] = "Guardar ajustes";
+App::$strings["text to include in all outgoing posts from this site"] = "texto a incluir en todos los mensajes salientes de este sitio";
+App::$strings["Post to Friendica"] = "Publicar en Friendica";
+App::$strings["rtof Settings saved."] = "Se han guardado los ajustes de rtof";
+App::$strings["Allow posting to Friendica"] = "Permitir publicar en Friendica";
+App::$strings["Send public postings to Friendica by default"] = "Enviar entradas públicas a Friendica por defecto";
+App::$strings["Friendica API Path"] = "Ruta a la API de Friendica";
+App::$strings["https://{sitename}/api"] = "https://{sitename}/api";
+App::$strings["Friendica login name"] = "Nombre de inicio de sesión en Friendica";
+App::$strings["Friendica password"] = "Contraseña de Friendica";
+App::$strings["Hubzilla to Friendica Post Settings"] = "Ajustes de publicación de Hubzilla a Friendica";
+App::$strings["Status:"] = "Estado:";
+App::$strings["Activate addon"] = "Habilitar complemento";
+App::$strings["Hide Jappixmini Chat-Widget from the webinterface"] = "Ocultar el widget de chat Jappixmini en la interfaz web";
+App::$strings["Jabber username"] = "Nombre de usuario en Jabber";
+App::$strings["Jabber server"] = "Servidor de Jabber";
+App::$strings["Jabber BOSH host URL"] = "URL del host BOSH de Jabber";
+App::$strings["Jabber password"] = "Contraseña en Jabber";
+App::$strings["Encrypt Jabber password with Hubzilla password"] = "Cifrar la contraseña de Jabber con la contraseña de Hubzilla";
+App::$strings["Hubzilla password"] = "Contraseña de Hubzilla";
+App::$strings["Approve subscription requests from Hubzilla contacts automatically"] = "Aprobar automáticamente las solicitudes de suscripción de los contactos de Hubzilla";
+App::$strings["Purge internal list of jabber addresses of contacts"] = "Purgar la lista interna de las direcciones de contactos de jabber";
+App::$strings["Configuration Help"] = "Ayuda para los ajustes";
+App::$strings["Jappix Mini Settings"] = "Ajustes de Jappix Mini";
+App::$strings["Currently blocked"] = "Actualmente bloqueado";
+App::$strings["No channels currently blocked"] = "No hay canales bloqueados actualmente";
+App::$strings["\"Superblock\" Settings"] = "Ajustes de \"Superblock\"";
+App::$strings["Block Completely"] = "Bloquear completamente";
+App::$strings["superblock settings updated"] = "se han actualizado los ajustes de superblock";
+App::$strings["Federate"] = "Federar";
+App::$strings["nofed Settings saved."] = "Se han guardado los ajustes de nofed.";
+App::$strings["Allow Federation Toggle"] = "Permitir alternancia de federación";
+App::$strings["Federate posts by default"] = "Federar las publicaciones por defecto";
+App::$strings["NoFed Settings"] = "Ajustes de NoFed";
App::$strings["Post to Red"] = "Enviar a Red";
App::$strings["Channel is required."] = "Se requiere un canal.";
App::$strings["redred Settings saved."] = "Se han salvado los ajustes de redred.";
App::$strings["Allow posting to another Hubzilla Channel"] = "Permitir la publicación en otro canal de Hubzilla";
App::$strings["Send public postings to Hubzilla channel by default"] = "Enviar entradas públicas al canal Hubzilla por defecto";
App::$strings["Hubzilla API Path"] = "Ruta de la API de Hubzilla";
-App::$strings["https://{sitename}/api"] = "https://{sitename}/api";
App::$strings["Hubzilla login name"] = "Nombre de inicio de sesión en Hubzilla";
App::$strings["Hubzilla channel name"] = "Nombre del canal de Hubzilla";
-App::$strings["Nickname"] = "Alias";
App::$strings["Hubzilla Crosspost Settings"] = "Ajustes de Hubzilla Crosspost";
-App::$strings["Post to Friendica"] = "Publicar en Friendica";
-App::$strings["rtof Settings saved."] = "Se han guardado los ajustes de rtof";
-App::$strings["Allow posting to Friendica"] = "Permitir publicar en Friendica";
-App::$strings["Send public postings to Friendica by default"] = "Enviar entradas públicas a Friendica por defecto";
-App::$strings["Friendica API Path"] = "Ruta a la API de Friendica";
-App::$strings["Friendica login name"] = "Nombre de inicio de sesión en Friendica";
-App::$strings["Friendica password"] = "Contraseña de Friendica";
-App::$strings["Hubzilla to Friendica Post Settings"] = "Ajustes de publicación de Hubzilla a Friendica";
-App::$strings["Extended Identity Sharing"] = "Compartir identidad extendida";
-App::$strings["Share your identity with all websites on the internet. When disabled, identity is only shared with sites in the matrix."] = "Compartir su identidad con todos los sitios web en Internet. Cuando se inhabilita, la identidad sólo se comparte con los sitios de la matriz.";
-App::$strings["Some setting"] = "Algunos ajustes";
-App::$strings["A setting"] = "Un ajuste";
-App::$strings["Skeleton Settings"] = "Ajustes de Skeleton";
-App::$strings["Deactivate the feature"] = "Desactivar la funcionalidad";
-App::$strings["Hide the button and show the smilies directly."] = "Ocultar el botón y mostrar los smilies directamente.";
-App::$strings["Smileybutton Settings"] = "Ajustes de Smileybutton";
-App::$strings["Page to load after login"] = "Página para cargar tras el inicio de sesión";
-App::$strings["Examples: &quot;apps&quot;, &quot;network?f=&gid=37&quot; (privacy collection), &quot;channel&quot; or &quot;notifications/system&quot; (leave blank for default network page (grid)."] = "Ejemplos: &quot;aplicaciones&quot;, &quot;mi red?f=&gid=37&quot; (grupo de canales), &quot;mi canal&quot; or &quot;notificaciones del sistema&quot; (dejar en blanco para la página de mi red por defecto (grid).";
-App::$strings["Startpage Settings"] = "Ajustes de startpage";
+App::$strings["Logfile archive directory"] = "Directorio de los ficheros de informe";
+App::$strings["Directory to store rotated logs"] = "Directorio para almacenar los informes rotados";
+App::$strings["Logfile size in bytes before rotating"] = "Tamaño del fichero de informe en bytes antes de rotarlo";
+App::$strings["Number of logfiles to retain"] = "Número de ficheros de informe que se deben retener";
+App::$strings["Friendica Photo Album Import"] = "Importar un álbum de fotos de Friendica";
+App::$strings["This will import all your Friendica photo albums to this Red channel."] = "Esto importará todos sus álbumes de fotos de Friendica a este canal de Hubzilla.";
+App::$strings["Friendica Server base URL"] = "URL base del servidor de Friendica";
+App::$strings["Friendica Login Username"] = "Nombre de inicio de sesión en Friendica";
+App::$strings["Friendica Login Password"] = "Contraseña de inicio de sesión en Friendica";
+App::$strings["Project Servers and Resources"] = "Servidores y recursos del proyecto";
+App::$strings["Project Creator and Tech Lead"] = "Creador del proyecto y director técnico";
+App::$strings["Admin, developer, directorymin, support bloke"] = "Administrador, desarrollador, administrador del directorio, trabajador de apoyo";
+App::$strings["And the hundreds of other people and organisations who helped make the Hubzilla possible."] = "Y los cientos de personas y organizaciones más que ayudaron a hacer posible Hubzilla.";
+App::$strings["The Redmatrix/Hubzilla projects are provided primarily by volunteers giving their time and expertise - and often paying out of pocket for services they share with others."] = "Los proyectos Redmatrix / Hubzilla están proporcionados principalmente por voluntarios que les prestan su tiempo y experiencia, pagando a menudo de su bolsillo por los servicios que comparten con otros.";
+App::$strings["There is no corporate funding and no ads, and we do not collect and sell your personal information. (We don't control your personal information - <strong>you do</strong>.)"] = "No hay financiación corporativa ni publicidad y no recogemos ni vendemos su información personal. (De hecho, no tenemos control sobre sus datos privados. <Strong>Usted lo tiene</strong>.)";
+App::$strings["Help support our ground-breaking work in decentralisation, web identity, and privacy."] = "Ayude apoyando nuestro trabajo pionero en la descentralización, la identidad web, y la privacidad.";
+App::$strings["Your donations keep servers and services running and also helps us to provide innovative new features and continued development."] = "Sus donaciones mantienen servidores y servicios en ejecución y también nos ayudan a proporcionar nuevas características innovadoras y a mantener el desarrollo de forma continuada.";
+App::$strings["Donate"] = "Donar";
+App::$strings["Choose a project, developer, or public hub to support with a one-time donation"] = "Elija un proyecto, desarrollador, o \"hub\" público para apoyar con una donación de una sola vez";
+App::$strings["Donate Now"] = "Donar ahora";
+App::$strings["<strong><em>Or</em></strong> become a project sponsor (Hubzilla Project only)"] = "<strong><em>O</em></strong> convertirse en un patrocinador del proyecto (sólo del proyecto Hubzilla)";
+App::$strings["Please indicate if you would like your first name or full name (or nothing) to appear in our sponsor listing"] = "Por favor, indique si desea que su nombre de pila o el nombre completo (o nada) aparezca en nuestra lista de patrocinadores";
+App::$strings["Sponsor"] = "Patrocinador";
+App::$strings["Special thanks to: "] = "Agradecimiento especial a: ";
+App::$strings["This is a fairly comprehensive and complete guitar chord dictionary which will list most of the available ways to play a certain chord, starting from the base of the fingerboard up to a few frets beyond the twelfth fret (beyond which everything repeats). A couple of non-standard tunings are provided for the benefit of slide players, etc."] = "Se trata de un diccionario bastante amplio y completo de acordes de guitarra que enumerará la mayor parte de las formas disponibles para tocar un acorde determinado, partiendo de la base del diapasón hasta unos pocos trastes más allá del traste doce (más allá del cual todo se repite). Se proporcionan un par de afinaciones no convencionales para provecho de los guitarristas con \"slides\" ( barras de acero), etc.";
+App::$strings["Chord names start with a root note (A-G) and may include sharps (#) and flats (b). This software will parse most of the standard naming conventions such as maj, min, dim, sus(2 or 4), aug, with optional repeating elements."] = "Los nombres de acordes comienzan con una nota fundamental (La-Sol) y pueden incluir sostenidos (#) y bemoles (b). Este software analizará la mayor parte de las convenciones de nomenclatura estándar como maj, min, tenue, SUS (2 ó 4), aug, con la repetición de elementos opcionales.";
+App::$strings["Valid examples include A, A7, Am7, Amaj7, Amaj9, Ammaj7, Aadd4, Asus2Add4, E7b13b11 ..."] = "Ejemplos válidos son A, A7, Am7, Amaj7, Amaj9, Ammaj7, Aadd4, Asus2Add4, E7b13b11 ...";
+App::$strings["Guitar Chords"] = "Acordes de guitarra";
+App::$strings["The complete online chord dictionary"] = "El diccionario completo de acordes en línea";
+App::$strings["Tuning"] = "Afinación";
+App::$strings["Chord name: example: Em7"] = "Nombre del acorde, por ejemplo: Em7";
+App::$strings["Show for left handed stringing"] = "Mostrar para tocadores zurdos";
+App::$strings["Quick Reference"] = "Referencia rápida";
+App::$strings["Post to Libertree"] = "Publicar en Libertree";
+App::$strings["Enable Libertree Post Plugin"] = "Habilitar el plugin de publicación en Libertree";
+App::$strings["Libertree API token"] = "Token de la API de Libertree";
+App::$strings["Libertree site URL"] = "URL del servidor de Libertree";
+App::$strings["Post to Libertree by default"] = "Publicar en Libertree por defecto";
+App::$strings["Libertree Post Settings"] = "Ajustes de publicación en Libertree";
+App::$strings["Libertree Settings saved."] = "Se han guardado los ajustes de Libertree.";
+App::$strings["Flattr this!"] = "¡Apoyar esto en Flattr!";
+App::$strings["Flattr widget settings updated."] = "Los ajustes del widget Flattr han sido actualizados.";
+App::$strings["Flattr user"] = "Usuario en Flattr";
+App::$strings["URL of the Thing to flattr"] = "URL de la Cosa para apoyar en flattr";
+App::$strings["If empty channel URL is used"] = "Si está vacío, se usa la URL del canal";
+App::$strings["Title of the Thing to flattr"] = "Título de la Cosa para apoyar en flattr";
+App::$strings["If empty \"channel name on The Hubzilla\" will be used"] = "Si está vacío, se usará \"nombre del canal en Hubzilla\"";
+App::$strings["Static or dynamic flattr button"] = "Botón de flattr estático o dinámico";
+App::$strings["static"] = "estático";
+App::$strings["dynamic"] = "dinámico";
+App::$strings["Alignment of the widget"] = "Alineamiento del widget";
+App::$strings["left"] = "izquierda";
+App::$strings["right"] = "derecha";
+App::$strings["Enable Flattr widget"] = "Habilitar el widget Flattr";
+App::$strings["Flattr Widget Settings"] = "Ajustes del widget Flattr";
App::$strings["Post to GNU social"] = "Publicar en GNU social";
App::$strings["Please contact your site administrator.<br />The provided API URL is not valid."] = "Por favor, contacte con el administrador de su sitio.<br />La URL de la API proporcionada no es válida.";
App::$strings["We could not contact the GNU social API with the Path you entered."] = "No podemos conectar con la API de GNU social con la ruta que ha proporcionado.";
@@ -2139,25 +2255,43 @@ App::$strings["Clear OAuth configuration"] = "Limpiar la configuración de OAut
App::$strings["GNU social Post Settings"] = "Ajustes de publicación en GNU social";
App::$strings["API URL"] = "URL de la API";
App::$strings["Application name"] = "Nombre de la aplicación";
-App::$strings["Currently blocked"] = "Actualmente bloqueado";
-App::$strings["No channels currently blocked"] = "No hay canales bloqueados actualmente";
-App::$strings["\"Superblock\" Settings"] = "Ajustes de \"Superblock\"";
-App::$strings["Block Completely"] = "Bloquear completamente";
-App::$strings["superblock settings updated"] = "se han actualizado los ajustes de superblock";
-App::$strings["Your account on %s will expire in a few days."] = "Su cuenta en %s caducará en unos pocos días.";
-App::$strings["Your $Productname test account is about to expire."] = "Su cuenta de prueba de $Productname está a punto de caducar.";
-App::$strings["Three Dimensional Tic-Tac-Toe"] = "Juego en 3D Tic-Tac-Toe";
-App::$strings["3D Tic-Tac-Toe"] = "3D Tic-Tac-Toe";
-App::$strings["New game"] = "Nuevo juego";
-App::$strings["New game with handicap"] = "Nuevo juego con hándicap";
-App::$strings["Three dimensional tic-tac-toe is just like the traditional game except that it is played on multiple levels simultaneously. "] = "El juego en 3D tic-tac-toe es como el juego tradicional, excepto que se juega en varios niveles simultáneamente.";
-App::$strings["In this case there are three levels. You win by getting three in a row on any level, as well as up, down, and diagonally across the different levels."] = "En este caso hay tres niveles. Usted gana al conseguir tres en una fila en cualquier nivel, así como arriba, abajo, y en diagonal a través de los diferentes niveles.";
-App::$strings["The handicap game disables the center position on the middle level because the player claiming this square often has an unfair advantage."] = "El juego con hándicap deshabilita la posición central en el nivel medio porque el jugador que reclama este cuadrado a menudo tiene una ventaja injusta.";
-App::$strings["You go first..."] = "Usted va primero...";
-App::$strings["I'm going first this time..."] = "Yo voy primero esta vez...";
-App::$strings["You won!"] = "¡Usted ha ganado!";
-App::$strings["\"Cat\" game!"] = "¡El juego del \"gato\"!";
-App::$strings["I won!"] = "¡He ganado yo!";
+App::$strings["QR code"] = "Código QR";
+App::$strings["QR Generator"] = "Generador QR";
+App::$strings["Enter some text"] = "Escribir algún texto";
+App::$strings["Invalid game."] = "Juego no válido.";
+App::$strings["You are not a player in this game."] = "Usted no participa en este juego.";
+App::$strings["You must be a local channel to create a game."] = "Debe ser un canal local para crear un juego";
+App::$strings["You must select one opponent that is not yourself."] = "Debe seleccionar un oponente que no sea usted mismo.";
+App::$strings["Creating new game..."] = "Crear un nuevo juego...";
+App::$strings["You must select white or black."] = "Debe elegir blancas o negras.";
+App::$strings["Error creating new game."] = "Error al crear un nuevo juego.";
+App::$strings["Requested channel is not available."] = "El canal solicitado no está disponible.";
+App::$strings["You must select a local channel /chess/channelname"] = "Debe seleccionar un canal local /chess/nombredelcanal";
+App::$strings["Enable notifications"] = "Habilitar notificaciones";
+App::$strings["Post to Twitter"] = "Publicar en Twitter";
+App::$strings["Twitter settings updated."] = "Se han actualizado los ajustes de Twitter.";
+App::$strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "No se encontró ningún par de \"consumer key\" para Twitter. Póngase en contacto con el administrador del sitio.";
+App::$strings["At this Hubzilla instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "En esta instancia de Hubzilla, el complemento de Twitter estaba habilitado pero aún no ha conectado su cuenta a la cuenta de Twitter. Para ello, haga clic en el botón de abajo, para obtener un PIN de Twitter que debe copiar en el cuadro de entrada a continuación y enviar el formulario. Solo sus entradas <strong>públicas</ strong> se publicarán en Twitter.";
+App::$strings["Log in with Twitter"] = "Iniciar sesión en Twitter";
+App::$strings["Copy the PIN from Twitter here"] = "Copiar aquí el PIN de Twitter";
+App::$strings["<strong>Note:</strong> Due your privacy settings (<em>Hide your profile details from unknown viewers?</em>) the link potentially included in public postings relayed to Twitter will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted."] = "<strong>Aviso:</strong> Debido a su configuración de privacidad (<em>Ocultar los detalles de su perfil a los visitantes desconocidos?</em>), el enlace potencialmente incluido en las entradas públicas retransmitidas a Twitter llevará al visitante a una página en blanco informándolo de que el acceso a su perfil ha sido restringido.";
+App::$strings["Allow posting to Twitter"] = "Permitir la publicación en Twitter";
+App::$strings["If enabled your public postings can be posted to the associated Twitter account"] = "Si está activado, sus entradas públicas se pueden publicar en la cuenta de Twitter asociada";
+App::$strings["Send public postings to Twitter by default"] = "Enviar mensajes públicos a Twitter de forma predeterminada";
+App::$strings["If enabled your public postings will be posted to the associated Twitter account by default"] = "Si está activado, sus entradas públicas se publicarán en la cuenta de Twitter asociada de forma predeterminada.";
+App::$strings["Twitter Post Settings"] = "Ajustes de publicación en Twitter";
+App::$strings["Deactivate the feature"] = "Desactivar la funcionalidad";
+App::$strings["Hide the button and show the smilies directly."] = "Ocultar el botón y mostrar los smilies directamente.";
+App::$strings["Smileybutton Settings"] = "Ajustes de Smileybutton";
+App::$strings["This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> analytics tool."] = "Este sitio es rastreado mediante la herramienta analítica <a href='http://www.piwik.org'>Piwik</a>.";
+App::$strings["If you do not want that your visits are logged this way you <a href='%s'>can set a cookie to prevent Piwik from tracking further visits of the site</a> (opt-out)."] = "Si usted no quiere que sus visitas se registren de esta manera <a href='%s'>puede establecer una cookie para evitar que Piwik rastree otras visitas del sitio</a> (opt-out).";
+App::$strings["Piwik Base URL"] = "URL base de Piwik";
+App::$strings["Absolute path to your Piwik installation. (without protocol (http/s), with trailing slash)"] = "Ruta absoluta a la instalación de Piwik. (Sin protocolo (http/s), con barra diagonal)";
+App::$strings["Site ID"] = "ID del sitio";
+App::$strings["Show opt-out cookie link?"] = "Mostrar el enlace de la cookie opt-out?";
+App::$strings["Asynchronous tracking"] = "Rastreo asíncrono";
+App::$strings["Enable frontend JavaScript error tracking"] = "Habilitar la interfaz JavaScript de seguimiento de errores";
+App::$strings["This feature requires Piwik >= 2.2.0"] = "Esta funcionalidad requiere Piwik >= 2.2.0";
App::$strings["Edit your profile and change settings."] = "Editar su perfil y cambiar los ajustes.";
App::$strings["Click here to see activity from your connections."] = "Pulsar aquí para ver la actividad de sus conexiones.";
App::$strings["Click here to see your channel home."] = "Pulsar aquí para ver la página de inicio de su canal.";
@@ -2193,43 +2327,45 @@ App::$strings["Save your search so you can repeat it at a later date."] = "Guard
App::$strings["If you see this icon you can be sure that the sender is who it say it is. It is normal that it is not always possible to verify the sender, so the icon will be missing sometimes. There is usually no need to worry about that."] = "Si ve este icono puede estar seguro de que el remitente es quien dice ser. Es normal que no siempre sea posible verificar el remitente, por lo que el icono faltará en ocasiones. Por lo general, no hay necesidad de preocuparse por eso.";
App::$strings["Danger! It seems someone tried to forge a message! This message is not necessarily from who it says it is from!"] = "¡Peligro! ¡Parece que alguien intentó falsificar un mensaje! ¡Este mensaje no es necesariamente de quien dice que es!";
App::$strings["Welcome to Hubzilla! Would you like to see a tour of the UI?</p> <p>You can pause it at any time and continue where you left off by reloading the page, or navigting to another page.</p><p>You can also advance by pressing the return key"] = "¡Bienvenido/a a Hubzilla! ¿Quiere hacer un recorrido por la interfaz de usuario?</p> <p> Puede detenerlo en cualquier momento y continuar donde lo dejó recargando la página o navegando a otra.</p> <p> También puede avanzar pulsando la tecla de retorno";
-App::$strings["Post to Twitter"] = "Publicar en Twitter";
-App::$strings["Twitter settings updated."] = "Se han actualizado los ajustes de Twitter.";
-App::$strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "No se encontró ningún par de \"consumer key\" para Twitter. Póngase en contacto con el administrador del sitio.";
-App::$strings["At this Hubzilla instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "En esta instancia de Hubzilla, el complemento de Twitter estaba habilitado pero aún no ha conectado su cuenta a la cuenta de Twitter. Para ello, haga clic en el botón de abajo, para obtener un PIN de Twitter que debe copiar en el cuadro de entrada a continuación y enviar el formulario. Solo sus entradas <strong>públicas</ strong> se publicarán en Twitter.";
-App::$strings["Log in with Twitter"] = "Iniciar sesión en Twitter";
-App::$strings["Copy the PIN from Twitter here"] = "Copiar aquí el PIN de Twitter";
-App::$strings["<strong>Note:</strong> Due your privacy settings (<em>Hide your profile details from unknown viewers?</em>) the link potentially included in public postings relayed to Twitter will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted."] = "<strong>Aviso:</strong> Debido a su configuración de privacidad (<em>Ocultar los detalles de su perfil a los visitantes desconocidos?</em>), el enlace potencialmente incluido en las entradas públicas retransmitidas a Twitter llevará al visitante a una página en blanco informándolo de que el acceso a su perfil ha sido restringido.";
-App::$strings["Allow posting to Twitter"] = "Permitir la publicación en Twitter";
-App::$strings["If enabled your public postings can be posted to the associated Twitter account"] = "Si está activado, sus entradas públicas se pueden publicar en la cuenta de Twitter asociada";
-App::$strings["Send public postings to Twitter by default"] = "Enviar mensajes públicos a Twitter de forma predeterminada";
-App::$strings["If enabled your public postings will be posted to the associated Twitter account by default"] = "Si está activado, sus entradas públicas se publicarán en la cuenta de Twitter asociada de forma predeterminada.";
-App::$strings["Twitter Post Settings"] = "Ajustes de publicación en Twitter";
-App::$strings["Submit Settings"] = "Enviar los ajustes";
-App::$strings["Show Upload Limits"] = "Mostrar los límites de subida";
-App::$strings["Hubzilla configured maximum size: "] = "Tamaño máximo configurado por Hubzilla: ";
-App::$strings["PHP upload_max_filesize: "] = "PHP upload_max_filesize: ";
-App::$strings["PHP post_max_size (must be larger than upload_max_filesize): "] = "PHP post_max_size (debe ser mayor que upload_max_filesize): ";
-App::$strings["Recent Channel/Profile Viewers"] = "Visitantes recientes del canal o perfil";
-App::$strings["This plugin/addon has not been configured."] = "El plugin o complemento no se ha configurado.";
-App::$strings["Please visit the Visage settings on %s"] = "Por favor, revise los ajustes de Visage en %s";
-App::$strings["your feature settings page"] = "su página de ajustes de las funcionalidades";
-App::$strings["No entries."] = "No hay entradas.";
-App::$strings["Enable Visage Visitor Logging"] = "Habilitar el registro de visitantes de Visage";
-App::$strings["Visage Settings"] = "Ajustes de Visage";
-App::$strings["Who likes me?"] = "¿Quién me ha puesto \"Me gusta\"?";
-App::$strings["Post to WordPress"] = "Publicar en WordPress";
-App::$strings["Enable WordPress Post Plugin"] = "Habilitar el plugin de publicación en WordPress";
-App::$strings["WordPress username"] = "Nombre de usuario de WordPress";
-App::$strings["WordPress password"] = "Contraseña de WordPress";
-App::$strings["WordPress API URL"] = "URL de la API de WordPress";
-App::$strings["Typically https://your-blog.tld/xmlrpc.php"] = "Habitualmente https://your-blog.tld/xmlrpc.php";
-App::$strings["WordPress blogid"] = "Blog de WordPress";
-App::$strings["For multi-user sites such as wordpress.com, otherwise leave blank"] = "Para sitios multiusuario como wordpress.com, de lo contrario, dejar en blanco";
-App::$strings["Post to WordPress by default"] = "Publicar en WordPress por defecto";
-App::$strings["Forward comments (requires hubzilla_wp plugin)"] = "Reenviar comentarios (requerido por el plugin hubzilla_wp)";
-App::$strings["WordPress Post Settings"] = "Ajustes de publicación en WordPress";
-App::$strings["Wordpress Settings saved."] = "Se han guardado los ajustes de WordPress.";
+App::$strings["Extended Identity Sharing"] = "Compartir identidad extendida";
+App::$strings["Share your identity with all websites on the internet. When disabled, identity is only shared with sites in the matrix."] = "Compartir su identidad con todos los sitios web en Internet. Cuando se inhabilita, la identidad sólo se comparte con los sitios de la matriz.";
+App::$strings["Three Dimensional Tic-Tac-Toe"] = "Juego en 3D Tic-Tac-Toe";
+App::$strings["3D Tic-Tac-Toe"] = "3D Tic-Tac-Toe";
+App::$strings["New game"] = "Nuevo juego";
+App::$strings["New game with handicap"] = "Nuevo juego con hándicap";
+App::$strings["Three dimensional tic-tac-toe is just like the traditional game except that it is played on multiple levels simultaneously. "] = "El juego en 3D tic-tac-toe es como el juego tradicional, excepto que se juega en varios niveles simultáneamente.";
+App::$strings["In this case there are three levels. You win by getting three in a row on any level, as well as up, down, and diagonally across the different levels."] = "En este caso hay tres niveles. Usted gana al conseguir tres en una fila en cualquier nivel, así como arriba, abajo, y en diagonal a través de los diferentes niveles.";
+App::$strings["The handicap game disables the center position on the middle level because the player claiming this square often has an unfair advantage."] = "El juego con hándicap deshabilita la posición central en el nivel medio porque el jugador que reclama este cuadrado a menudo tiene una ventaja injusta.";
+App::$strings["You go first..."] = "Usted va primero...";
+App::$strings["I'm going first this time..."] = "Yo voy primero esta vez...";
+App::$strings["You won!"] = "¡Usted ha ganado!";
+App::$strings["\"Cat\" game!"] = "¡El juego del \"gato\"!";
+App::$strings["I won!"] = "¡He ganado yo!";
+App::$strings["Message to display on every page on this server"] = "Mensaje para mostrar en todas las páginas de este servidor";
+App::$strings["Pageheader Settings"] = "Ajustes del encabezado de página";
+App::$strings["pageheader Settings saved."] = "Se han guardado los ajustes del encabezado de página.";
+App::$strings["lonely"] = "Solo/a";
+App::$strings["drunk"] = "ebrio/a";
+App::$strings["horny"] = "caliente";
+App::$strings["stoned"] = "drogado/a";
+App::$strings["fucked up"] = "jodido/a";
+App::$strings["clusterfucked"] = "hecho/a polvo";
+App::$strings["crazy"] = "loco/a";
+App::$strings["hurt"] = "ofendido/a";
+App::$strings["sleepy"] = "soñoliento/a";
+App::$strings["grumpy"] = "gruñón/ona";
+App::$strings["high"] = "superior";
+App::$strings["semi-conscious"] = "semiconsciente";
+App::$strings["in love"] = "enamorado/a";
+App::$strings["in lust"] = "lujurioso/a";
+App::$strings["naked"] = "desnudo/a";
+App::$strings["stinky"] = "apestoso/a";
+App::$strings["sweaty"] = "sudoroso/a";
+App::$strings["bleeding out"] = "una maldición";
+App::$strings["victorious"] = "victorioso/a";
+App::$strings["defeated"] = "derrotado/a";
+App::$strings["envious"] = "envidioso/a";
+App::$strings["jealous"] = "celoso/a";
App::$strings["XMPP settings updated."] = "Se han actualizado los ajustes de XMPP.";
App::$strings["Enable Chat"] = "Habilitar el chat";
App::$strings["Individual credentials"] = "Credenciales individuales";
@@ -2238,265 +2374,34 @@ App::$strings["XMPP Settings"] = "Ajustes de XMPP";
App::$strings["Jabber BOSH host"] = "BOSH de Jabber";
App::$strings["Use central userbase"] = "Usar la base de usuarios central";
App::$strings["If enabled, members will automatically login to an ejabberd server that has to be installed on this machine with synchronized credentials via the \"auth_ejabberd.php\" script."] = "Si está habilitado, los miembros se conectarán automáticamente a un servidor ejabberd que debe instalarse en esta máquina con credenciales sincronizadas a través del script \"auth ejabberd.php\".";
-App::$strings["Select Channel"] = "Seleccionar un canal";
-App::$strings["Read-write"] = "Lectura y escritura";
-App::$strings["Read-only"] = "Sólo lectura";
-App::$strings["My Calendars"] = "Mis calendarios";
-App::$strings["Shared Calendars"] = "Calendarios compartidos";
-App::$strings["Share this calendar"] = "Compartir este calendario";
-App::$strings["Calendar name and color"] = "Nombre y color del calendario";
-App::$strings["Create new calendar"] = "Crear un nuevo calendario";
-App::$strings["Calendar Name"] = "Nombre del calendario";
-App::$strings["Calendar Tools"] = "Gestión de calendarios";
-App::$strings["Import calendar"] = "Importar un calendario";
-App::$strings["Select a calendar to import to"] = "Seleccionar un calendario para importarlo";
-App::$strings["Addressbooks"] = "Agenda de direcciones";
-App::$strings["Addressbook name"] = "Nombre de la agenda";
-App::$strings["Create new addressbook"] = "Crear una nueva agenda de direcciones";
-App::$strings["Addressbook Name"] = "Nombre de la agenda";
-App::$strings["Addressbook Tools"] = "Gestión de agendas de direcciones";
-App::$strings["Import addressbook"] = "Importar una agenda de direcciones";
-App::$strings["Select an addressbook to import to"] = "Seleccionar una agenda para importarla";
-App::$strings["INVALID EVENT DISMISSED!"] = "¡EVENTO NO VÃLIDO RECHAZADO!";
-App::$strings["Summary: "] = "Resumen: ";
-App::$strings["Date: "] = "Fecha: ";
-App::$strings["Reason: "] = "Razón: ";
-App::$strings["INVALID CARD DISMISSED!"] = "¡TARJETA NO VÃLIDA RECHAZADA!";
-App::$strings["Name: "] = "Nombre: ";
-App::$strings["You have to enable this plugin in Feature/Addon Settings > CalDAV/CardDAV Settings before you can use it."] = "Debe habilitar este complemento en Ajustes/Complementos>Configuración de CalDAV/CardDAV antes de poder utilizarlo.";
-App::$strings["Example: YYYY-MM-DD HH:mm"] = "Ejemplo: YYYY-MM-DD HH:mm";
-App::$strings["End date and time"] = "Fecha y hora de finalización";
-App::$strings["List month"] = "Lista mensual";
-App::$strings["List week"] = "Lista semanal";
-App::$strings["List day"] = "Lista diaria";
-App::$strings["More"] = "Más";
-App::$strings["Less"] = "Menos";
-App::$strings["Select calendar"] = "Seleccionar un calendario";
-App::$strings["Delete all"] = "Eliminar todos";
-App::$strings["Sorry! Editing of recurrent events is not yet implemented."] = "¡Disculpas! La edición de eventos recurrentes aún no se ha implementado.";
-App::$strings["Errors encountered creating database table: "] = "Errores encontrados al crear la tabla de la base de datos: ";
-App::$strings["Default Calendar"] = "Calendario por defecto";
-App::$strings["Default Addressbook"] = "Agenda de direcciones por defecto";
-App::$strings["CalDAV/CardDAV Settings saved."] = "Se ha guardado la configuración de CalDAV/CardDAV.";
-App::$strings["Enable CalDAV/CardDAV Server for this channel"] = "Habilitar el servidor CalDAV/CardDAV para este canal";
-App::$strings["Your CalDAV resources are located at %s "] = "Los recursos de CalDAV se encuentran en %s";
-App::$strings["Your CardDAV resources are located at %s "] = "Sus recursos de CalDAV están localizados en %s ";
-App::$strings["CalDAV/CardDAV Settings"] = "Configuración de CalDAV/CardDAV";
-App::$strings["Home, Voice"] = "Llamadas particulares";
-App::$strings["Home, Fax"] = "Fax particular";
-App::$strings["Work, Voice"] = "Llamadas de trabajo";
-App::$strings["Work, Fax"] = "Fax de trabajo";
-App::$strings["Invalid game."] = "Juego no válido.";
-App::$strings["You are not a player in this game."] = "Usted no participa en este juego.";
-App::$strings["You must be a local channel to create a game."] = "Debe ser un canal local para crear un juego";
-App::$strings["You must select one opponent that is not yourself."] = "Debe seleccionar un oponente que no sea usted mismo.";
-App::$strings["Creating new game..."] = "Crear un nuevo juego...";
-App::$strings["You must select white or black."] = "Debe elegir blancas o negras.";
-App::$strings["Error creating new game."] = "Error al crear un nuevo juego.";
-App::$strings["Requested channel is not available."] = "El canal solicitado no está disponible.";
-App::$strings["You must select a local channel /chess/channelname"] = "Debe seleccionar un canal local /chess/nombredelcanal";
-App::$strings["Enable notifications"] = "Habilitar notificaciones";
-App::$strings["Your Webbie:"] = "Su webbie: ";
-App::$strings["Fontsize (px):"] = "Tamaño de fuente (px): ";
-App::$strings["Link:"] = "Enlace: ";
-App::$strings["Like us on Hubzilla"] = "Múestrenos su agrado en Hubzilla";
-App::$strings["Embed:"] = "Incorporado: ";
-App::$strings["Male"] = "Hombre";
-App::$strings["Female"] = "Mujer";
-App::$strings["First Name"] = "Nombre";
-App::$strings["Last Name"] = "Apellido";
-App::$strings["Full Name"] = "Nombre completo";
-App::$strings["Profile Photo 16px"] = "Foto del perfil 16px";
-App::$strings["Profile Photo 32px"] = "Foto del perfil 32px";
-App::$strings["Profile Photo 48px"] = "Foto del perfil 48px";
-App::$strings["Profile Photo 64px"] = "Foto del perfil 64px";
-App::$strings["Profile Photo 80px"] = "Foto del perfil 80px";
-App::$strings["Profile Photo 128px"] = "Foto del perfil 128px";
-App::$strings["Timezone"] = "Zona horaria";
-App::$strings["Birth Year"] = "Año de nacimiento";
-App::$strings["Birth Month"] = "Mes de nacimiento";
-App::$strings["Birth Day"] = "Día de nacimiento";
-App::$strings["Birthdate"] = "Fecha de nacimiento";
-App::$strings["We encountered a problem while logging in with the OpenID you provided. Please check the correct spelling of the ID."] = "Encontramos un problema al iniciar sesión con el OpenID que proporcionó. Compruebe si el ID está correctamente escrito.";
-App::$strings["The error message was:"] = "El mensaje de error ha sido: ";
-App::$strings["OpenID protocol error. No ID returned."] = "Error de protocolo OpenID. No se recuperó ninguna ID.";
-App::$strings["Login failed."] = "El acceso ha fallado.";
-App::$strings["Reconnecting %d connections"] = "Reconectando %d conexiones";
-App::$strings["Diaspora Reconnect"] = "Reconectar con Diaspora";
-App::$strings["Use this form to re-establish Diaspora connections which were initially made from a different hub."] = "Utilice este formulario para restablecer las conexiones de diáspora que se hicieron inicialmente desde un hub diferente.";
-App::$strings["Reconnect"] = "Reconectar";
-App::$strings["Send test email"] = "Enviar un correo electrónico de prueba";
-App::$strings["Mail sent."] = "El correo electrónico ha sido enviado.";
-App::$strings["Sending of mail failed."] = "No se pudo enviar el correo.";
-App::$strings["Mail Test"] = "Prueba de correo";
-App::$strings["Errors encountered deleting database table "] = "Errores encontrados al eliminar la tabla de la base de datos";
-App::$strings["Drop tables when uninstalling?"] = "¿Eliminar tablas al desinstalar?";
-App::$strings["If checked, the Rendezvous database tables will be deleted when the plugin is uninstalled."] = "Si se selecciona, las tablas de la base de datos Rendezvous se eliminarán cuando se desinstale el plugin.";
-App::$strings["Mapbox Access Token"] = "Token de acceso de Mapbox";
-App::$strings["If you enter a Mapbox access token, it will be used to retrieve map tiles from Mapbox instead of the default OpenStreetMap tile server."] = "Si introduce un token de acceso a Mapbox, se utilizará para recuperar los mapas de mosaicos de imágenes de Mapbox en lugar del servidor de mosaico de imágenes OpenStreetMap predeterminado.";
-App::$strings["Rendezvous"] = "Rendezvous";
-App::$strings["This identity has been deleted by another member due to inactivity. Please press the \"New identity\" button or refresh the page to register a new identity. You may use the same name."] = "Esta identidad ha sido eliminada por otro miembro debido a su inactividad. Pulse el botón \"Nueva identidad\" o actualice la página para registrar una nueva identidad. Puede usar el mismo nombre.";
-App::$strings["Welcome to Rendezvous!"] = "¡Bienvenido/a a Rendevous!";
-App::$strings["Enter your name to join this rendezvous. To begin sharing your location with the other members, tap the GPS control. When your location is discovered, a red dot will appear and others will be able to see you on the map."] = "Introduzca tu nombre para unirse a esta cita. Para comenzar a compartir su ubicación con los demás miembros, pulse en el control GPS. Cuando se descubra su ubicación, aparecerá un punto rojo y otros podrán verlo en el mapa.";
-App::$strings["Let's meet here"] = "Reunámonos aquí";
-App::$strings["New marker"] = "Nuevo marcador";
-App::$strings["Edit marker"] = "Editar un marcador";
-App::$strings["New identity"] = "Nueva identidad";
-App::$strings["Delete marker"] = "Eliminar un marcador";
-App::$strings["Delete member"] = "Eliminar un miembro";
-App::$strings["Edit proximity alert"] = "Editar alerta de proximidad";
-App::$strings["A proximity alert will be issued when this member is within a certain radius of you.<br><br>Enter a radius in meters (0 to disable):"] = "Se emitirá una alerta de proximidad cuando este miembro esté dentro de un radio determinado respecto a usted.<br><br> Ingrese el radio en metros (0 para deshabilitar):";
-App::$strings["distance"] = "distancia";
-App::$strings["Proximity alert distance (meters)"] = "Distancia (en metros) para la alerta de proximidad";
-App::$strings["A proximity alert will be issued when you are within a certain radius of the marker location.<br><br>Enter a radius in meters (0 to disable):"] = "Se emitirá una alerta de proximidad cuando usted esté dentro de un radio determinado respecto al marcador de localización.<br><br> Ingrese el radio en metros (0 para deshabilitar):";
-App::$strings["Marker proximity alert"] = "Marcador de alerta de proximidad";
-App::$strings["Reminder note"] = "Recordatorio";
-App::$strings["Enter a note to be displayed when you are within the specified proximity..."] = "Introduzca una nota que se mostrará cuando esté dentro de la proximidad especificada...";
-App::$strings["Add new rendezvous"] = "Añadir una nueva cita";
-App::$strings["Create a new rendezvous and share the access link with those you wish to invite to the group. Those who open the link become members of the rendezvous. They can view other member locations, add markers to the map, or share their own locations with the group."] = "Cree una nueva cita y comparta los enlaces de acceso con los que desea invitar al grupo. Aquellos que abran el enlace se convertirán en miembros de la cita. Pueden ver otras ubicaciones de miembros, añadir marcadores al mapa o compartir sus propias ubicaciones con el grupo.";
-App::$strings["Install Firefox Sharing Tools"] = "Instalar las herramientas de compartición de Firefox";
-App::$strings["Share content from Firefox to \$Projectname"] = "Compartir contenido desde Firefox a \$Projectname";
-App::$strings["Install Firefox Sharing Tools to this web browser"] = "Instalar las herramientas de compartición de Firefox en este navegador";
-App::$strings["Error retrieving wiki"] = "Error al recuperar el wiki";
-App::$strings["Error creating zip file export folder"] = "Error al crear el fichero comprimido zip de la carpeta a exportar";
-App::$strings["Error downloading wiki: "] = "Error al descargar el wiki: ";
-App::$strings["Wiki Pages"] = "Páginas del wiki";
-App::$strings["Add new page"] = "Añadir una nueva página";
-App::$strings["Page name"] = "Nombre de la página";
-App::$strings["Wiki List"] = "Lista de wikis";
-App::$strings["Enable the GNU-Social protocol for this channel"] = "Activar el protocolo de GNU-Social para este canal";
-App::$strings["__ctx:opensearch__ Search %1\$s (%2\$s)"] = "Buscar %1\$s (%2\$s)";
-App::$strings["__ctx:opensearch__ \$Projectname"] = "\$Projectname";
+App::$strings["Who likes me?"] = "¿Quién me ha puesto \"Me gusta\"?";
+App::$strings["You are now authenticated to pumpio."] = "Ahora está autenticado en pump.io.";
+App::$strings["return to the featured settings page"] = "Volver a la página de configuración destacada";
+App::$strings["Post to Pump.io"] = "Publicar en Pump.io";
+App::$strings["Pump.io servername"] = "Nombre del servidor de Pump.io";
+App::$strings["Without \"http://\" or \"https://\""] = "Sin \"http://\" or \"https://\"";
+App::$strings["Pump.io username"] = "Nombre de usuario en Pump.io";
+App::$strings["Without the servername"] = "Sin el nombre del servidor";
+App::$strings["You are not authenticated to pumpio"] = "No está autenticado en pump.io";
+App::$strings["(Re-)Authenticate your pump.io connection"] = "(Re-)Autenticar su conexión en pump.io";
+App::$strings["Enable pump.io Post Plugin"] = "Habilitar el plugin de publicación en pump.io";
+App::$strings["Post to pump.io by default"] = "Publicar por defecto en pump.io";
+App::$strings["Should posts be public"] = "¿Las entradas deben ser públicas?";
+App::$strings["Mirror all public posts"] = "Reflejar todos los mensajes públicos";
+App::$strings["Pump.io Post Settings"] = "Ajustes de publicación en pump.io";
+App::$strings["PumpIO Settings saved."] = "Se han guardado los ajustes de PumpIO.";
+App::$strings["An account has been created for you."] = "Se ha creado una cuenta para usted.";
+App::$strings["Authentication successful but rejected: account creation is disabled."] = "Autenticación correcta pero rechazada: la creación de cuentas está deshabilitada.";
App::$strings["Search \$Projectname"] = "Buscar \$Projectname";
-App::$strings["Cannot locate DNS info for database server '%s'"] = "No se ha podido localizar información de DNS para el servidor de base de datos “%sâ€";
-App::$strings["default"] = "por defecto";
-App::$strings["Select an alternate language"] = "Seleccionar un idioma alternativo";
-App::$strings["Not a valid email address"] = "Dirección de correo no válida";
-App::$strings["Your email domain is not among those allowed on this site"] = "Su dirección de correo no pertenece a ninguno de los dominios permitidos en este sitio.";
-App::$strings["Your email address is already registered at this site."] = "Su dirección de correo está ya registrada en este sitio.";
-App::$strings["An invitation is required."] = "Es obligatorio que le inviten.";
-App::$strings["Invitation could not be verified."] = "No se ha podido verificar su invitación.";
-App::$strings["Please enter the required information."] = "Por favor introduzca la información requerida.";
-App::$strings["Failed to store account information."] = "La información de la cuenta no se ha podido guardar.";
-App::$strings["Registration confirmation for %s"] = "Confirmación de registro para %s";
-App::$strings["Registration request at %s"] = "Solicitud de registro en %s";
-App::$strings["your registration password"] = "su contraseña de registro";
-App::$strings["Registration details for %s"] = "Detalles del registro de %s";
-App::$strings["Account approved."] = "Cuenta aprobada.";
-App::$strings["Registration revoked for %s"] = "Registro revocado para %s";
-App::$strings["Click here to upgrade."] = "Pulse aquí para actualizar";
-App::$strings["This action exceeds the limits set by your subscription plan."] = "Esta acción supera los límites establecidos por su plan de suscripción ";
-App::$strings["This action is not available under your subscription plan."] = "Esta acción no está disponible en su plan de suscripción.";
-App::$strings["Categories"] = "Temas";
-App::$strings["Suggestions"] = "Sugerencias";
-App::$strings["See more..."] = "Ver más...";
-App::$strings["You have %1$.0f of %2$.0f allowed connections."] = "Tiene %1$.0f de %2$.0f conexiones permitidas.";
-App::$strings["Add New Connection"] = "Añadir nueva conexión";
-App::$strings["Enter channel address"] = "Dirección del canal";
-App::$strings["Examples: bob@example.com, https://example.com/barbara"] = "Ejemplos: manuel@ejemplo.com, https://ejemplo.com/carmen";
-App::$strings["Notes"] = "Notas";
-App::$strings["Remove term"] = "Eliminar término";
-App::$strings["Saved Searches"] = "Búsquedas guardadas";
-App::$strings["add"] = "añadir";
-App::$strings["Saved Folders"] = "Carpetas guardadas";
-App::$strings["Everything"] = "Todo";
-App::$strings["Archives"] = "Hemeroteca";
-App::$strings["Refresh"] = "Recargar";
-App::$strings["Account settings"] = "Configuración de la cuenta";
-App::$strings["Channel settings"] = "Configuración del canal";
-App::$strings["Additional features"] = "Funcionalidades";
-App::$strings["Feature/Addon settings"] = "Complementos";
-App::$strings["Display settings"] = "Ajustes de visualización";
-App::$strings["Manage locations"] = "Gestión de ubicaciones (clones) del canal";
-App::$strings["Export channel"] = "Exportar canal";
-App::$strings["Connected apps"] = "Aplicaciones (apps) conectadas";
-App::$strings["Permission Groups"] = "Grupos de permisos";
-App::$strings["Premium Channel Settings"] = "Configuración del canal premium";
-App::$strings["Private Mail Menu"] = "Menú de correo privado";
-App::$strings["Combined View"] = "Vista combinada";
-App::$strings["Inbox"] = "Bandeja de entrada";
-App::$strings["Outbox"] = "Bandeja de salida";
-App::$strings["New Message"] = "Nuevo mensaje";
-App::$strings["Conversations"] = "Conversaciones";
-App::$strings["Received Messages"] = "Mensajes recibidos";
-App::$strings["Sent Messages"] = "Enviar mensajes";
-App::$strings["No messages."] = "Sin mensajes.";
-App::$strings["Delete conversation"] = "Eliminar conversación";
-App::$strings["Events Tools"] = "Gestión de eventos";
-App::$strings["Export Calendar"] = "Exportar el calendario";
-App::$strings["Import Calendar"] = "Importar un calendario";
-App::$strings["Chatrooms"] = "Salas de chat";
-App::$strings["Overview"] = "Resumen";
-App::$strings["Chat Members"] = "Miembros del chat";
-App::$strings["__ctx:wiki_history__ Message"] = "Mensaje";
-App::$strings["Bookmarked Chatrooms"] = "Salas de chat preferidas";
-App::$strings["Suggested Chatrooms"] = "Salas de chat sugeridas";
-App::$strings["photo/image"] = "foto/imagen";
-App::$strings["Click to show more"] = "Hacer clic para ver más";
-App::$strings["Rating Tools"] = "Valoraciones";
-App::$strings["Rate Me"] = "Valorar este canal";
-App::$strings["View Ratings"] = "Mostrar las valoraciones";
-App::$strings["Forums"] = "Foros";
-App::$strings["__ctx:widget__ Activity"] = "Actividad";
-App::$strings["Tasks"] = "Tareas";
-App::$strings["Member registrations waiting for confirmation"] = "Inscripciones de nuevos miembros pendientes de aprobación";
-App::$strings["Inspect queue"] = "Examinar la cola";
-App::$strings["DB updates"] = "Actualizaciones de la base de datos";
-App::$strings["Admin"] = "Administrador";
-App::$strings["Plugin Features"] = "Extensiones";
-App::$strings["Tags"] = "Etiquetas";
-App::$strings["Keywords"] = "Palabras clave";
-App::$strings["have"] = "tener";
-App::$strings["has"] = "tiene";
-App::$strings["want"] = "quiero";
-App::$strings["wants"] = "quiere";
-App::$strings["likes"] = "gusta de";
-App::$strings["dislikes"] = "no gusta de";
-App::$strings["l F d, Y \\@ g:i A"] = "l d de F, Y \\@ G:i";
-App::$strings["Starts:"] = "Comienza:";
-App::$strings["Finishes:"] = "Finaliza:";
-App::$strings["This event has been added to your calendar."] = "Este evento ha sido añadido a su calendario.";
-App::$strings["Not specified"] = "Sin especificar";
-App::$strings["Needs Action"] = "Necesita de una intervención";
-App::$strings["Completed"] = "Completado/a";
-App::$strings["In Process"] = "En proceso";
-App::$strings["Cancelled"] = "Cancelado/a";
-App::$strings["Birthday"] = "Cumpleaños";
-App::$strings["Age: "] = "Edad:";
-App::$strings["YYYY-MM-DD or MM-DD"] = "AAAA-MM-DD o MM-DD";
-App::$strings["never"] = "nunca";
-App::$strings["less than a second ago"] = "hace un instante";
-App::$strings["__ctx:e.g. 22 hours ago, 1 minute ago__ %1\$d %2\$s ago"] = "hace %1\$d %2\$s";
-App::$strings["__ctx:relative_date__ year"] = array(
- 0 => "año",
- 1 => "años",
-);
-App::$strings["__ctx:relative_date__ month"] = array(
- 0 => "mes",
- 1 => "meses",
-);
-App::$strings["__ctx:relative_date__ week"] = array(
- 0 => "semana",
- 1 => "semanas",
-);
-App::$strings["__ctx:relative_date__ day"] = array(
- 0 => "día",
- 1 => "días",
-);
-App::$strings["__ctx:relative_date__ hour"] = array(
- 0 => "hora",
- 1 => "horas",
-);
-App::$strings["__ctx:relative_date__ minute"] = array(
- 0 => "minuto",
- 1 => "minutos",
-);
-App::$strings["__ctx:relative_date__ second"] = array(
- 0 => "segundo",
- 1 => "segundos",
-);
-App::$strings["%1\$s's birthday"] = "Cumpleaños de %1\$s";
-App::$strings["Happy Birthday %1\$s"] = "Feliz cumpleaños %1\$s";
+App::$strings["Redmatrix File Storage Import"] = "Importar repositorio de ficheros de Redmatrix";
+App::$strings["This will import all your Redmatrix cloud files to this channel."] = "Esto importará todos sus ficheros de la nube de Redmatrix a este canal.";
+App::$strings["file"] = "fichero";
+App::$strings["Send email to all members"] = "Enviar un correo electrónico a todos los miembros";
+App::$strings["$1%s Administrator"] = "Administrador de $1%s ";
+App::$strings["%1\$d of %2\$d messages sent."] = "%1\$d de %2\$d mensajes enviados.";
+App::$strings["Send email to all hub members."] = "Enviar un correo electrónico a todos los miembros del hub.";
+App::$strings["Sender Email address"] = "Dirección de correo electrónico del remitente";
+App::$strings["Test mode (only send to hub administrator)"] = "Modo de prueba (enviar sólo al administrador del hub)";
App::$strings["Frequently"] = "Frecuentemente";
App::$strings["Hourly"] = "Cada hora";
App::$strings["Twice daily"] = "Dos veces al día";
@@ -2557,132 +2462,6 @@ App::$strings["Uncertain"] = "Indeterminado";
App::$strings["It's complicated"] = "Es complicado";
App::$strings["Don't care"] = "No me importa";
App::$strings["Ask me"] = "Pregúnteme";
-App::$strings["Who can see this?"] = "¿Quién puede ver esto?";
-App::$strings["Custom selection"] = "Selección personalizada";
-App::$strings["Select \"Show\" to allow viewing. \"Don't show\" lets you override and limit the scope of \"Show\"."] = "Seleccione \"Mostrar\" para permitir la visualización. La opción \"No mostrar\" le permite anular y limitar el alcance de \"Mostrar\".";
-App::$strings["Show"] = "Mostrar";
-App::$strings["Don't show"] = "No mostrar";
-App::$strings["Post permissions %s cannot be changed %s after a post is shared.</br />These permissions set who is allowed to view the post."] = "Los permisos de la entrada %s no se pueden cambiar %s una vez que se ha compartido.</br /> Estos permisos establecen quién está autorizado para ver el mensaje.";
-App::$strings["Image/photo"] = "Imagen/foto";
-App::$strings["Encrypted content"] = "Contenido cifrado";
-App::$strings["Install %s element: "] = "Instalar el elemento %s:";
-App::$strings["This post contains an installable %s element, however you lack permissions to install it on this site."] = "Esta entrada contiene el elemento instalable %s, sin embargo le faltan permisos para instalarlo en este sitio.";
-App::$strings["%1\$s wrote the following %2\$s %3\$s"] = "%1\$s escribió %2\$s siguiente %3\$s";
-App::$strings["Click to open/close"] = "Pulsar para abrir/cerrar";
-App::$strings["spoiler"] = "spoiler";
-App::$strings["$1 wrote:"] = "$1 escribió:";
-App::$strings["%1\$s's bookmarks"] = "Marcadores de %1\$s";
-App::$strings["New window"] = "Nueva ventana";
-App::$strings["Open the selected location in a different window or browser tab"] = "Abrir la dirección seleccionada en una ventana o pestaña aparte";
-App::$strings["Help:"] = "Ayuda:";
-App::$strings["Not Found"] = "No encontrado";
-App::$strings["New Page"] = "Nueva página";
-App::$strings["%d invitation available"] = array(
- 0 => "%d invitación pendiente",
- 1 => "%d invitaciones disponibles",
-);
-App::$strings["Find Channels"] = "Encontrar canales";
-App::$strings["Enter name or interest"] = "Introducir nombre o interés";
-App::$strings["Connect/Follow"] = "Conectar/Seguir";
-App::$strings["Examples: Robert Morgenstein, Fishing"] = "Ejemplos: José Fernández, Pesca";
-App::$strings["Random Profile"] = "Perfil aleatorio";
-App::$strings["Invite Friends"] = "Invitar a amigos";
-App::$strings["Advanced example: name=fred and country=iceland"] = "Ejemplo avanzado: nombre=juan y país=españa";
-App::$strings["%d connection in common"] = array(
- 0 => "%d conexión en común",
- 1 => "%d conexiones en común",
-);
-App::$strings["show more"] = "mostrar más";
-App::$strings["Delete this item?"] = "¿Borrar este elemento?";
-App::$strings["%s show less"] = "%s mostrar menos";
-App::$strings["%s expand"] = "%s expandir";
-App::$strings["%s collapse"] = "%s contraer";
-App::$strings["Password too short"] = "Contraseña demasiado corta";
-App::$strings["Passwords do not match"] = "Las contraseñas no coinciden";
-App::$strings["everybody"] = "cualquiera";
-App::$strings["Secret Passphrase"] = "Contraseña secreta";
-App::$strings["Passphrase hint"] = "Pista de contraseña";
-App::$strings["Notice: Permissions have changed but have not yet been submitted."] = "Aviso: los permisos han cambiado pero aún no han sido enviados.";
-App::$strings["close all"] = "cerrar todo";
-App::$strings["Nothing new here"] = "Nada nuevo por aquí";
-App::$strings["Rate This Channel (this is public)"] = "Valorar este canal (esto es público)";
-App::$strings["Describe (optional)"] = "Describir (opcional)";
-App::$strings["Please enter a link URL"] = "Por favor, introduzca una dirección de enlace";
-App::$strings["Unsaved changes. Are you sure you wish to leave this page?"] = "Cambios no guardados. ¿Está seguro de que desea abandonar la página?";
-App::$strings["timeago.prefixAgo"] = "timeago.prefixAgo";
-App::$strings["timeago.prefixFromNow"] = "timeago.prefixFromNow";
-App::$strings["ago"] = "antes";
-App::$strings["from now"] = "desde ahora";
-App::$strings["less than a minute"] = "menos de un minuto";
-App::$strings["about a minute"] = "alrededor de un minuto";
-App::$strings["%d minutes"] = "%d minutos";
-App::$strings["about an hour"] = "alrededor de una hora";
-App::$strings["about %d hours"] = "alrededor de %d horas";
-App::$strings["a day"] = "un día";
-App::$strings["%d days"] = "%d días";
-App::$strings["about a month"] = "alrededor de un mes";
-App::$strings["%d months"] = "%d meses";
-App::$strings["about a year"] = "alrededor de un año";
-App::$strings["%d years"] = "%d años";
-App::$strings[" "] = " ";
-App::$strings["timeago.numbers"] = "timeago.numbers";
-App::$strings["January"] = "enero";
-App::$strings["February"] = "febrero";
-App::$strings["March"] = "marzo";
-App::$strings["April"] = "abril";
-App::$strings["__ctx:long__ May"] = "mayo";
-App::$strings["June"] = "junio";
-App::$strings["July"] = "julio";
-App::$strings["August"] = "agosto";
-App::$strings["September"] = "septiembre";
-App::$strings["October"] = "octubre";
-App::$strings["November"] = "noviembre";
-App::$strings["December"] = "diciembre";
-App::$strings["Jan"] = "ene";
-App::$strings["Feb"] = "feb";
-App::$strings["Mar"] = "mar";
-App::$strings["Apr"] = "abr";
-App::$strings["__ctx:short__ May"] = "may";
-App::$strings["Jun"] = "jun";
-App::$strings["Jul"] = "jul";
-App::$strings["Aug"] = "ago";
-App::$strings["Sep"] = "sep";
-App::$strings["Oct"] = "oct";
-App::$strings["Nov"] = "nov";
-App::$strings["Dec"] = "dic";
-App::$strings["Sunday"] = "domingo";
-App::$strings["Monday"] = "lunes";
-App::$strings["Tuesday"] = "martes";
-App::$strings["Wednesday"] = "miércoles";
-App::$strings["Thursday"] = "jueves";
-App::$strings["Friday"] = "viernes";
-App::$strings["Saturday"] = "sábado";
-App::$strings["Sun"] = "dom";
-App::$strings["Mon"] = "lun";
-App::$strings["Tue"] = "mar";
-App::$strings["Wed"] = "mié";
-App::$strings["Thu"] = "jue";
-App::$strings["Fri"] = "vie";
-App::$strings["Sat"] = "sáb";
-App::$strings["__ctx:calendar__ today"] = "hoy";
-App::$strings["__ctx:calendar__ month"] = "mes";
-App::$strings["__ctx:calendar__ week"] = "semana";
-App::$strings["__ctx:calendar__ day"] = "día";
-App::$strings["__ctx:calendar__ All day"] = "Todos los días";
-App::$strings["Directory Options"] = "Opciones del directorio";
-App::$strings["Safe Mode"] = "Modo seguro";
-App::$strings["Public Forums Only"] = "Solo foros públicos";
-App::$strings["This Website Only"] = "Solo este sitio web";
-App::$strings["view full size"] = "Ver en el tamaño original";
-App::$strings["No Subject"] = "Sin asunto";
-App::$strings["OStatus"] = "OStatus";
-App::$strings["GNU-Social"] = "GNU Social";
-App::$strings["RSS/Atom"] = "RSS/Atom";
-App::$strings["Facebook"] = "Facebook";
-App::$strings["Zot"] = "Zot";
-App::$strings["LinkedIn"] = "LinkedIn";
-App::$strings["XMPP/IM"] = "XMPP/IM";
-App::$strings["MySpace"] = "MySpace";
App::$strings["%1\$s is now connected with %2\$s"] = "%1\$s ahora está conectado/a con %2\$s";
App::$strings["%1\$s poked %2\$s"] = "%1\$s ha dado un toque a %2\$s";
App::$strings["poked"] = "ha dado un toque a";
@@ -2774,84 +2553,26 @@ App::$strings["__ctx:noun__ Abstain"] = array(
0 => "se abstiene",
1 => "Se abstienen",
);
-App::$strings["A deleted group with this name was revived. Existing item permissions <strong>may</strong> apply to this group and any future members. If this is not what you intended, please create another group with a different name."] = "Un grupo suprimido con este nombre ha sido restablecido. <strong>Es posible</strong> que los permisos existentes sean aplicados a este grupo y sus futuros miembros. Si no quiere esto, por favor cree otro grupo con un nombre diferente.";
-App::$strings["Add new connections to this privacy group"] = "Añadir conexiones nuevas a este grupo de canales";
-App::$strings["edit"] = "editar";
-App::$strings["Privacy Groups"] = "Grupos de canales";
-App::$strings["Edit group"] = "Editar grupo";
-App::$strings["Add privacy group"] = "Añadir un grupo de canales";
-App::$strings["Channels not in any privacy group"] = "Sin canales en ningún grupo";
-App::$strings["(Unknown)"] = "(Desconocido)";
-App::$strings["Visible to anybody on the internet."] = "Visible para cualquiera en internet.";
-App::$strings["Visible to you only."] = "Visible sólo para usted.";
-App::$strings["Visible to anybody in this network."] = "Visible para cualquiera en esta red.";
-App::$strings["Visible to anybody authenticated."] = "Visible para cualquiera que esté autenticado.";
-App::$strings["Visible to anybody on %s."] = "Visible para cualquiera en %s.";
-App::$strings["Visible to all connections."] = "Visible para todas las conexiones.";
-App::$strings["Visible to approved connections."] = "Visible para las conexiones permitidas.";
-App::$strings["Visible to specific connections."] = "Visible para conexiones específicas.";
-App::$strings["Privacy group is empty."] = "El grupo de canales está vacío.";
-App::$strings["Privacy group: %s"] = "Grupo de canales: %s";
-App::$strings["Connection not found."] = "Conexión no encontrada";
-App::$strings["profile photo"] = "foto del perfil";
-App::$strings["[Edited %s]"] = "[se ha editado %s]";
-App::$strings["__ctx:edit_activity__ Post"] = "Publicar";
-App::$strings["__ctx:edit_activity__ Comment"] = "Comentar";
-App::$strings["Attachments:"] = "Ficheros adjuntos:";
-App::$strings["\$Projectname event notification:"] = "Notificación de eventos de \$Projectname:";
-App::$strings["guest:"] = "invitado: ";
-App::$strings["The form security token was not correct. This probably happened because the form has been opened for too long (>3 hours) before submitting it."] = "El \"token\" de seguridad del formulario no es correcto. Esto ha ocurrido probablemente porque el formulario ha estado abierto demasiado tiempo (>3 horas) antes de ser enviado";
-App::$strings["Remote authentication"] = "Acceder desde su servidor";
-App::$strings["Click to authenticate to your home hub"] = "Pulsar para identificarse en su servidor de inicio";
-App::$strings["Logout"] = "Finalizar sesión";
-App::$strings["End this session"] = "Finalizar esta sesión";
-App::$strings["Your profile page"] = "Su página del perfil";
-App::$strings["Manage/Edit profiles"] = "Administrar/editar perfiles";
-App::$strings["Edit your profile"] = "Editar su perfil";
-App::$strings["Sign in"] = "Acceder";
-App::$strings["Get me home"] = "Volver a la página principal";
-App::$strings["Log me out of this site"] = "Salir de este sitio";
-App::$strings["Create an account"] = "Crear una cuenta";
-App::$strings["Help and documentation"] = "Ayuda y documentación";
-App::$strings["Applications, utilities, links, games"] = "Aplicaciones, utilidades, enlaces, juegos";
-App::$strings["Search site @name, #tag, ?docs, content"] = "Buscar en el sitio por @nombre, #etiqueta, ?ayuda o contenido";
-App::$strings["Channel Directory"] = "Directorio de canales";
-App::$strings["Your grid"] = "Mi red";
-App::$strings["View your network/grid"] = "Ver su red";
-App::$strings["Mark all grid notifications seen"] = "Marcar todas las notificaciones de la red como vistas";
-App::$strings["Channel home"] = "Mi canal";
-App::$strings["View your channel home"] = "Ver su página principal del canal";
-App::$strings["Mark all channel notifications seen"] = "Marcar todas las notificaciones del canal como leídas";
-App::$strings["Notices"] = "Avisos";
-App::$strings["Notifications"] = "Notificaciones";
-App::$strings["View all notifications"] = "Ver todas las notificaciones";
-App::$strings["Private mail"] = "Correo privado";
-App::$strings["View your private messages"] = "Ver sus mensajes privados";
-App::$strings["Mark all private messages seen"] = "Marcar todos los mensajes privados como leídos";
-App::$strings["Event Calendar"] = "Calendario de eventos";
-App::$strings["View events"] = "Ver los eventos";
-App::$strings["Mark all events seen"] = "Marcar todos los eventos como leidos";
-App::$strings["Manage Your Channels"] = "Gestionar sus canales";
-App::$strings["Account/Channel Settings"] = "Ajustes de cuenta/canales";
-App::$strings["Site Setup and Configuration"] = "Ajustes y configuración del sitio";
-App::$strings["@name, #tag, ?doc, content"] = "@nombre, #etiqueta, ?ayuda, contenido";
-App::$strings["Please wait..."] = "Espere por favor…";
-App::$strings["Add Apps"] = "Añadir aplicaciones";
-App::$strings["Item was not found."] = "Elemento no encontrado.";
-App::$strings["No source file."] = "Ningún fichero de origen";
-App::$strings["Cannot locate file to replace"] = "No se puede localizar el fichero que va a ser sustituido.";
-App::$strings["Cannot locate file to revise/update"] = "No se puede localizar el fichero para revisar/actualizar";
-App::$strings["File exceeds size limit of %d"] = "El fichero supera el limite de tamaño de %d";
-App::$strings["You have reached your limit of %1$.0f Mbytes attachment storage."] = "Ha alcanzado su límite de %1$.0f Mbytes de almacenamiento de adjuntos.";
-App::$strings["File upload failed. Possible system limit or action terminated."] = "Error de carga, posiblemente por limite del sistema o porque la acción ha finalizado.";
-App::$strings["Stored file could not be verified. Upload failed."] = "El fichero almacenado no ha podido ser verificado. El envío ha fallado.";
-App::$strings["Path not available."] = "Ruta no disponible.";
-App::$strings["Empty pathname"] = "Ruta vacía";
-App::$strings["duplicate filename or path"] = "Nombre duplicado de ruta o fichero";
-App::$strings["Path not found."] = "Ruta no encontrada";
-App::$strings["mkdir failed."] = "mkdir ha fallado.";
-App::$strings["database storage failed."] = "el almacenamiento en la base de datos ha fallado.";
-App::$strings["Empty path"] = "Ruta vacía";
+App::$strings["Can view my normal stream and posts"] = "Pueden verse mi actividad y publicaciones normales";
+App::$strings["Can view my webpages"] = "Pueden verse mis páginas web";
+App::$strings["Can post on my channel page (\"wall\")"] = "Pueden crearse entradas en mi página de inicio del canal (“muroâ€)";
+App::$strings["Can like/dislike stuff"] = "Puede marcarse contenido como me gusta/no me gusta";
+App::$strings["Profiles and things other than posts/comments"] = "Perfiles y otras cosas aparte de publicaciones/comentarios";
+App::$strings["Can forward to all my channel contacts via post @mentions"] = "Puede enviarse una entrada a todos mis contactos del canal mediante una @mención";
+App::$strings["Advanced - useful for creating group forum channels"] = "Avanzado - útil para crear canales de foros de discusión o grupos";
+App::$strings["Can chat with me (when available)"] = "Se puede charlar conmigo (cuando esté disponible)";
+App::$strings["Can write to my file storage and photos"] = "Puede escribirse en mi repositorio de ficheros y fotos";
+App::$strings["Can edit my webpages"] = "Pueden editarse mis páginas web";
+App::$strings["Somewhat advanced - very useful in open communities"] = "Algo avanzado - muy útil en comunidades abiertas";
+App::$strings["Can administer my channel resources"] = "Pueden administrarse mis recursos del canal";
+App::$strings["Extremely advanced. Leave this alone unless you know what you are doing"] = "Muy avanzado. Déjelo a no ser que sepa bien lo que está haciendo.";
+App::$strings["Directory Options"] = "Opciones del directorio";
+App::$strings["Safe Mode"] = "Modo seguro";
+App::$strings["Public Forums Only"] = "Solo foros públicos";
+App::$strings["This Website Only"] = "Solo este sitio web";
+App::$strings["%1\$s's bookmarks"] = "Marcadores de %1\$s";
+App::$strings["Cannot create a duplicate channel identifier on this system. Import failed."] = "No se ha podido crear un canal con un identificador que ya existe en este sistema. La importación ha fallado.";
+App::$strings["Cloned channel not found. Import failed."] = "No se ha podido importar el canal porque el canal clonado no se ha encontrado.";
App::$strings["prev"] = "anterior";
App::$strings["first"] = "primera";
App::$strings["last"] = "última";
@@ -2892,11 +2613,30 @@ App::$strings["depressed"] = "deprimido/a";
App::$strings["motivated"] = "motivado/a";
App::$strings["relaxed"] = "relajado/a";
App::$strings["surprised"] = "sorprendido/a";
+App::$strings["Monday"] = "lunes";
+App::$strings["Tuesday"] = "martes";
+App::$strings["Wednesday"] = "miércoles";
+App::$strings["Thursday"] = "jueves";
+App::$strings["Friday"] = "viernes";
+App::$strings["Saturday"] = "sábado";
+App::$strings["Sunday"] = "domingo";
+App::$strings["January"] = "enero";
+App::$strings["February"] = "febrero";
+App::$strings["March"] = "marzo";
+App::$strings["April"] = "abril";
App::$strings["May"] = "mayo";
+App::$strings["June"] = "junio";
+App::$strings["July"] = "julio";
+App::$strings["August"] = "agosto";
+App::$strings["September"] = "septiembre";
+App::$strings["October"] = "octubre";
+App::$strings["November"] = "noviembre";
+App::$strings["December"] = "diciembre";
App::$strings["Unknown Attachment"] = "Adjunto no reconocido";
App::$strings["unknown"] = "desconocido";
App::$strings["remove category"] = "eliminar el tema";
App::$strings["remove from file"] = "eliminar del fichero";
+App::$strings["default"] = "por defecto";
App::$strings["Page layout"] = "Plantilla de la página";
App::$strings["You can create your own with the layouts tool"] = "Puede crear su propia disposición gráfica con la herramienta de plantillas";
App::$strings["Page content type"] = "Tipo de contenido de la página";
@@ -2918,8 +2658,27 @@ App::$strings["Export to cloud files"] = "Exportar a la nube de ficheros";
App::$strings["/path/to/export/folder"] = "/ruta/para/exportar/carpeta";
App::$strings["Enter a path to a cloud files destination."] = "Escriba una ruta de destino a la nube de ficheros.";
App::$strings["Specify folder"] = "Especificar una carpeta";
-App::$strings["Logged out."] = "Desconectado/a.";
-App::$strings["Failed authentication"] = "Autenticación fallida.";
+App::$strings["%d invitation available"] = array(
+ 0 => "%d invitación pendiente",
+ 1 => "%d invitaciones disponibles",
+);
+App::$strings["Find Channels"] = "Encontrar canales";
+App::$strings["Enter name or interest"] = "Introducir nombre o interés";
+App::$strings["Connect/Follow"] = "Conectar/Seguir";
+App::$strings["Examples: Robert Morgenstein, Fishing"] = "Ejemplos: José Fernández, Pesca";
+App::$strings["Random Profile"] = "Perfil aleatorio";
+App::$strings["Invite Friends"] = "Invitar a amigos";
+App::$strings["Advanced example: name=fred and country=iceland"] = "Ejemplo avanzado: nombre=juan y país=españa";
+App::$strings["%d connection in common"] = array(
+ 0 => "%d conexión en común",
+ 1 => "%d conexiones en común",
+);
+App::$strings["show more"] = "mostrar más";
+App::$strings["Attachments:"] = "Ficheros adjuntos: ";
+App::$strings["l F d, Y \\@ g:i A"] = "l d de F, Y \\@ G:i";
+App::$strings["\$Projectname event notification:"] = "Notificación de eventos de \$Projectname: ";
+App::$strings["Starts:"] = "Comienza:";
+App::$strings["Finishes:"] = "Finaliza:";
App::$strings["Channel is blocked on this site."] = "El canal está bloqueado en este sitio.";
App::$strings["Channel location missing."] = "Falta la dirección del canal.";
App::$strings["Response from remote channel was incomplete."] = "Respuesta incompleta del canal.";
@@ -2927,40 +2686,182 @@ App::$strings["Channel was deleted and no longer exists."] = "El canal ha sido e
App::$strings["Protocol disabled."] = "Protocolo deshabilitado.";
App::$strings["Channel discovery failed."] = "El intento de acceder al canal ha fallado.";
App::$strings["Cannot connect to yourself."] = "No puede conectarse consigo mismo.";
-App::$strings["Cannot create a duplicate channel identifier on this system. Import failed."] = "No se ha podido crear un canal con un identificador que ya existe en este sistema. La importación ha fallado.";
-App::$strings["Channel clone failed. Import failed."] = "La clonación del canal no ha salido bien. La importación ha fallado.";
-App::$strings["Cloned channel not found. Import failed."] = "No se ha podido importar el canal porque el canal clonado no se ha encontrado.";
-App::$strings["Unable to import element \""] = "No se puede importar un elemento \"";
+App::$strings["Delete this item?"] = "¿Borrar este elemento?";
+App::$strings["%s show less"] = "%s mostrar menos";
+App::$strings["%s expand"] = "%s expandir";
+App::$strings["%s collapse"] = "%s contraer";
+App::$strings["Password too short"] = "Contraseña demasiado corta";
+App::$strings["Passwords do not match"] = "Las contraseñas no coinciden";
+App::$strings["everybody"] = "cualquiera";
+App::$strings["Secret Passphrase"] = "Contraseña secreta";
+App::$strings["Passphrase hint"] = "Pista de contraseña";
+App::$strings["Notice: Permissions have changed but have not yet been submitted."] = "Aviso: los permisos han cambiado pero aún no han sido enviados.";
+App::$strings["close all"] = "cerrar todo";
+App::$strings["Nothing new here"] = "Nada nuevo por aquí";
+App::$strings["Rate This Channel (this is public)"] = "Valorar este canal (esto es público)";
+App::$strings["Describe (optional)"] = "Describir (opcional)";
+App::$strings["Please enter a link URL"] = "Por favor, introduzca una dirección de enlace";
+App::$strings["Unsaved changes. Are you sure you wish to leave this page?"] = "Cambios no guardados. ¿Está seguro de que desea abandonar la página?";
+App::$strings["timeago.prefixAgo"] = "timeago.prefixAgo";
+App::$strings["timeago.prefixFromNow"] = "timeago.prefixFromNow";
+App::$strings["ago"] = "antes";
+App::$strings["from now"] = "desde ahora";
+App::$strings["less than a minute"] = "menos de un minuto";
+App::$strings["about a minute"] = "alrededor de un minuto";
+App::$strings["%d minutes"] = "%d minutos";
+App::$strings["about an hour"] = "alrededor de una hora";
+App::$strings["about %d hours"] = "alrededor de %d horas";
+App::$strings["a day"] = "un día";
+App::$strings["%d days"] = "%d días";
+App::$strings["about a month"] = "alrededor de un mes";
+App::$strings["%d months"] = "%d meses";
+App::$strings["about a year"] = "alrededor de un año";
+App::$strings["%d years"] = "%d años";
+App::$strings[" "] = " ";
+App::$strings["timeago.numbers"] = "timeago.numbers";
+App::$strings["__ctx:long__ May"] = "mayo";
+App::$strings["Jan"] = "ene";
+App::$strings["Feb"] = "feb";
+App::$strings["Mar"] = "mar";
+App::$strings["Apr"] = "abr";
+App::$strings["__ctx:short__ May"] = "may";
+App::$strings["Jun"] = "jun";
+App::$strings["Jul"] = "jul";
+App::$strings["Aug"] = "ago";
+App::$strings["Sep"] = "sep";
+App::$strings["Oct"] = "oct";
+App::$strings["Nov"] = "nov";
+App::$strings["Dec"] = "dic";
+App::$strings["Sun"] = "dom";
+App::$strings["Mon"] = "lun";
+App::$strings["Tue"] = "mar";
+App::$strings["Wed"] = "mié";
+App::$strings["Thu"] = "jue";
+App::$strings["Fri"] = "vie";
+App::$strings["Sat"] = "sáb";
+App::$strings["__ctx:calendar__ today"] = "hoy";
+App::$strings["__ctx:calendar__ month"] = "mes";
+App::$strings["__ctx:calendar__ week"] = "semana";
+App::$strings["__ctx:calendar__ day"] = "día";
+App::$strings["__ctx:calendar__ All day"] = "Todos los días";
App::$strings["Unable to determine sender."] = "No ha sido posible determinar el remitente. ";
App::$strings["No recipient provided."] = "No se ha especificado ningún destinatario.";
App::$strings["[no subject]"] = "[sin asunto]";
App::$strings["Stored post could not be verified."] = "No se han podido verificar las publicaciones guardadas.";
-App::$strings[" by "] = "por";
-App::$strings[" on "] = "en";
-App::$strings["Embedded content"] = "Contenido incorporado";
-App::$strings["Embedding disabled"] = "Incrustación deshabilitada";
-App::$strings["Invalid data packet"] = "Paquete de datos no válido";
-App::$strings["Unable to verify channel signature"] = "No ha sido posible de verificar la firma del canal";
-App::$strings["Unable to verify site signature for %s"] = "No ha sido posible de verificar la firma del sitio para %s";
-App::$strings["invalid target signature"] = "La firma recibida no es válida";
-App::$strings["Can view my normal stream and posts"] = "Pueden verse mi actividad y publicaciones normales";
-App::$strings["Can view my webpages"] = "Pueden verse mis páginas web";
-App::$strings["Can post on my channel page (\"wall\")"] = "Pueden crearse entradas en mi página de inicio del canal (“muroâ€)";
-App::$strings["Can like/dislike stuff"] = "Puede marcarse contenido como me gusta/no me gusta";
-App::$strings["Profiles and things other than posts/comments"] = "Perfiles y otras cosas aparte de publicaciones/comentarios";
-App::$strings["Can forward to all my channel contacts via post @mentions"] = "Puede enviarse una entrada a todos mis contactos del canal mediante una @mención";
-App::$strings["Advanced - useful for creating group forum channels"] = "Avanzado - útil para crear canales de foros de discusión o grupos";
-App::$strings["Can chat with me (when available)"] = "Se puede charlar conmigo (cuando esté disponible)";
-App::$strings["Can write to my file storage and photos"] = "Puede escribirse en mi repositorio de ficheros y fotos";
-App::$strings["Can edit my webpages"] = "Pueden editarse mis páginas web";
-App::$strings["Somewhat advanced - very useful in open communities"] = "Algo avanzado - muy útil en comunidades abiertas";
-App::$strings["Can administer my channel resources"] = "Pueden administrarse mis recursos del canal";
-App::$strings["Extremely advanced. Leave this alone unless you know what you are doing"] = "Muy avanzado. Déjelo a no ser que sepa bien lo que está haciendo.";
App::$strings[" and "] = " y ";
App::$strings["public profile"] = "el perfil público";
App::$strings["%1\$s changed %2\$s to &ldquo;%3\$s&rdquo;"] = "%1\$s ha cambiado %2\$s a &ldquo;%3\$s&rdquo;";
App::$strings["Visit %1\$s's %2\$s"] = "Visitar %2\$s de %1\$s";
App::$strings["%1\$s has an updated %2\$s, changing %3\$s."] = "%1\$s ha actualizado %2\$s, cambiando %3\$s.";
+App::$strings["Item was not found."] = "Elemento no encontrado.";
+App::$strings["No source file."] = "Ningún fichero de origen";
+App::$strings["Cannot locate file to replace"] = "No se puede localizar el fichero que va a ser sustituido.";
+App::$strings["Cannot locate file to revise/update"] = "No se puede localizar el fichero para revisar/actualizar";
+App::$strings["File exceeds size limit of %d"] = "El fichero supera el limite de tamaño de %d";
+App::$strings["You have reached your limit of %1$.0f Mbytes attachment storage."] = "Ha alcanzado su límite de %1$.0f Mbytes de almacenamiento de adjuntos.";
+App::$strings["File upload failed. Possible system limit or action terminated."] = "Error de carga, posiblemente por limite del sistema o porque la acción ha finalizado.";
+App::$strings["Stored file could not be verified. Upload failed."] = "El fichero almacenado no ha podido ser verificado. El envío ha fallado.";
+App::$strings["Path not available."] = "Ruta no disponible.";
+App::$strings["Empty pathname"] = "Ruta vacía";
+App::$strings["duplicate filename or path"] = "Nombre duplicado de ruta o fichero";
+App::$strings["Path not found."] = "Ruta no encontrada";
+App::$strings["mkdir failed."] = "mkdir ha fallado.";
+App::$strings["database storage failed."] = "el almacenamiento en la base de datos ha fallado.";
+App::$strings["Empty path"] = "Ruta vacía";
+App::$strings["guest:"] = "invitado: ";
+App::$strings["The form security token was not correct. This probably happened because the form has been opened for too long (>3 hours) before submitting it."] = "El \"token\" de seguridad del formulario no es correcto. Esto ha ocurrido probablemente porque el formulario ha estado abierto demasiado tiempo (>3 horas) antes de ser enviado";
+App::$strings["(Unknown)"] = "(Desconocido)";
+App::$strings["Visible to anybody on the internet."] = "Visible para cualquiera en internet.";
+App::$strings["Visible to you only."] = "Visible sólo para usted.";
+App::$strings["Visible to anybody in this network."] = "Visible para cualquiera en esta red.";
+App::$strings["Visible to anybody authenticated."] = "Visible para cualquiera que esté autenticado.";
+App::$strings["Visible to anybody on %s."] = "Visible para cualquiera en %s.";
+App::$strings["Visible to all connections."] = "Visible para todas las conexiones.";
+App::$strings["Visible to approved connections."] = "Visible para las conexiones permitidas.";
+App::$strings["Visible to specific connections."] = "Visible para conexiones específicas.";
+App::$strings["Privacy group is empty."] = "El grupo de canales está vacío.";
+App::$strings["Privacy group: %s"] = "Grupo de canales: %s";
+App::$strings["Connection not found."] = "Conexión no encontrada";
+App::$strings["profile photo"] = "foto del perfil";
+App::$strings["[Edited %s]"] = "[se ha editado %s]";
+App::$strings["__ctx:edit_activity__ Post"] = "Publicar";
+App::$strings["__ctx:edit_activity__ Comment"] = "Comentar";
+App::$strings["Unable to obtain identity information from database"] = "No ha sido posible obtener información sobre la identidad desde la base de datos";
+App::$strings["Empty name"] = "Nombre vacío";
+App::$strings["Name too long"] = "Nombre demasiado largo";
+App::$strings["No account identifier"] = "Ningún identificador de la cuenta";
+App::$strings["Nickname is required."] = "Se requiere un sobrenombre (alias).";
+App::$strings["Reserved nickname. Please choose another."] = "Sobrenombre en uso. Por favor, elija otro.";
+App::$strings["Nickname has unsupported characters or is already being used on this site."] = "El alias contiene caracteres no admitidos o está ya en uso por otros miembros de este sitio.";
+App::$strings["Unable to retrieve created identity"] = "No ha sido posible recuperar la identidad creada";
+App::$strings["Default Profile"] = "Perfil principal";
+App::$strings["Create New Profile"] = "Crear un nuevo perfil";
+App::$strings["Visible to everybody"] = "Visible para todos";
+App::$strings["Gender:"] = "Género:";
+App::$strings["Homepage:"] = "Página personal:";
+App::$strings["Online Now"] = "Ahora en línea";
+App::$strings["Like this channel"] = "Me gusta este canal";
+App::$strings["j F, Y"] = "j F Y";
+App::$strings["j F"] = "j F";
+App::$strings["Birthday:"] = "Cumpleaños:";
+App::$strings["for %1\$d %2\$s"] = "por %1\$d %2\$s";
+App::$strings["Sexual Preference:"] = "Orientación sexual:";
+App::$strings["Tags:"] = "Etiquetas:";
+App::$strings["Political Views:"] = "Posición política:";
+App::$strings["Religion:"] = "Religión:";
+App::$strings["Hobbies/Interests:"] = "Aficciones o intereses:";
+App::$strings["Likes:"] = "Me gusta:";
+App::$strings["Dislikes:"] = "No me gusta:";
+App::$strings["Contact information and Social Networks:"] = "Información de contacto y redes sociales:";
+App::$strings["My other channels:"] = "Mis otros canales:";
+App::$strings["Musical interests:"] = "Preferencias musicales:";
+App::$strings["Books, literature:"] = "Libros, literatura:";
+App::$strings["Television:"] = "Televisión:";
+App::$strings["Film/dance/culture/entertainment:"] = "Cine, danza, cultura, entretenimiento:";
+App::$strings["Love/Romance:"] = "Vida sentimental o amorosa:";
+App::$strings["Work/employment:"] = "Trabajo:";
+App::$strings["School/education:"] = "Estudios:";
+App::$strings["Like this thing"] = "Me gusta esto";
+App::$strings["User '%s' deleted"] = "El usuario '%s' ha sido eliminado";
+App::$strings["This event has been added to your calendar."] = "Este evento ha sido añadido a su calendario.";
+App::$strings["Not specified"] = "Sin especificar";
+App::$strings["Needs Action"] = "Necesita de una intervención";
+App::$strings["Completed"] = "Completado/a";
+App::$strings["In Process"] = "En proceso";
+App::$strings["Cancelled"] = "Cancelado/a";
+App::$strings["view full size"] = "Ver en el tamaño original";
+App::$strings["No Subject"] = "Sin asunto";
+App::$strings["Friendica"] = "Friendica";
+App::$strings["OStatus"] = "OStatus";
+App::$strings["GNU-Social"] = "GNU Social";
+App::$strings["RSS/Atom"] = "RSS/Atom";
+App::$strings["Diaspora"] = "Diaspora";
+App::$strings["Facebook"] = "Facebook";
+App::$strings["Zot"] = "Zot";
+App::$strings["LinkedIn"] = "LinkedIn";
+App::$strings["XMPP/IM"] = "XMPP/IM";
+App::$strings["MySpace"] = "MySpace";
+App::$strings["New Page"] = "Nueva página";
+App::$strings["Select an alternate language"] = "Seleccionar un idioma alternativo";
+App::$strings["Who can see this?"] = "¿Quién puede ver esto?";
+App::$strings["Custom selection"] = "Selección personalizada";
+App::$strings["Select \"Show\" to allow viewing. \"Don't show\" lets you override and limit the scope of \"Show\"."] = "Seleccione \"Mostrar\" para permitir la visualización. La opción \"No mostrar\" le permite anular y limitar el alcance de \"Mostrar\".";
+App::$strings["Show"] = "Mostrar";
+App::$strings["Don't show"] = "No mostrar";
+App::$strings["Post permissions %s cannot be changed %s after a post is shared.</br />These permissions set who is allowed to view the post."] = "Los permisos de la entrada %s no se pueden cambiar %s una vez que se ha compartido.</br /> Estos permisos establecen quién está autorizado para ver el mensaje.";
+App::$strings["Cannot locate DNS info for database server '%s'"] = "No se ha podido localizar información de DNS para el servidor de base de datos “%sâ€";
+App::$strings["Image/photo"] = "Imagen/foto";
+App::$strings["Encrypted content"] = "Contenido cifrado";
+App::$strings["Install %s element: "] = "Instalar el elemento %s:";
+App::$strings["This post contains an installable %s element, however you lack permissions to install it on this site."] = "Esta entrada contiene el elemento instalable %s, sin embargo le faltan permisos para instalarlo en este sitio.";
+App::$strings["%1\$s wrote the following %2\$s %3\$s"] = "%1\$s escribió %2\$s siguiente %3\$s";
+App::$strings["Click to open/close"] = "Pulsar para abrir/cerrar";
+App::$strings["spoiler"] = "spoiler";
+App::$strings["$1 wrote:"] = "$1 escribió:";
+App::$strings[" by "] = "por";
+App::$strings[" on "] = "en";
+App::$strings["Embedded content"] = "Contenido incorporado";
+App::$strings["Embedding disabled"] = "Incrustación deshabilitada";
App::$strings["General Features"] = "Funcionalidades básicas";
App::$strings["Multiple Profiles"] = "Múltiples perfiles";
App::$strings["Ability to create multiple profiles"] = "Capacidad de crear múltiples perfiles";
@@ -2979,7 +2880,7 @@ App::$strings["Photo Location"] = "Ubicación de las fotos";
App::$strings["If location data is available on uploaded photos, link this to a map."] = "Si los datos de ubicación están disponibles en las fotos subidas, enlazar estas a un mapa.";
App::$strings["Access Controlled Chatrooms"] = "Salas de chat moderadas";
App::$strings["Provide chatrooms and chat services with access control."] = "Proporcionar salas y servicios de chat moderados.";
-App::$strings["Provide alternate connection permission roles."] = "Proporcionar roles de acceso alternativas para esta conexión.";
+App::$strings["Provide alternate connection permission roles."] = "Proporcionar roles de acceso alternativos para esta conexión.";
App::$strings["Smart Birthdays"] = "Cumpleaños inteligentes";
App::$strings["Make birthday events timezone aware in case your friends are scattered across the planet."] = "Enlazar los eventos de cumpleaños con el huso horario en el caso de que sus amigos estén dispersos por el mundo.";
App::$strings["Event Timezone Selection"] = "Selección del huso horario del evento";
@@ -3007,6 +2908,7 @@ App::$strings["Prevent posts with identical content to be published with less th
App::$strings["Network and Stream Filtering"] = "Filtrado del contenido";
App::$strings["Search by Date"] = "Buscar por fecha";
App::$strings["Ability to select posts by date ranges"] = "Capacidad de seleccionar entradas por rango de fechas";
+App::$strings["Privacy Groups"] = "Grupos de canales";
App::$strings["Enable management and selection of privacy groups"] = "Activar la gestión y selección de grupos de canales";
App::$strings["Save search terms for re-use"] = "Guardar términos de búsqueda para su reutilización";
App::$strings["Network Personal Tab"] = "Actividad personal";
@@ -3034,92 +2936,118 @@ App::$strings["Tag Cloud"] = "Nube de etiquetas";
App::$strings["Provide a personal tag cloud on your channel page"] = "Proveer nube de etiquetas personal en su página de canal";
App::$strings["Premium Channel"] = "Canal premium";
App::$strings["Allows you to set restrictions and terms on those that connect with your channel"] = "Le permite configurar restricciones y normas de uso a aquellos que conectan con su canal";
+App::$strings["Tags"] = "Etiquetas";
+App::$strings["Keywords"] = "Palabras clave";
+App::$strings["have"] = "tener";
+App::$strings["has"] = "tiene";
+App::$strings["want"] = "quiero";
+App::$strings["wants"] = "quiere";
+App::$strings["likes"] = "gusta de";
+App::$strings["dislikes"] = "no gusta de";
+App::$strings["Not a valid email address"] = "Dirección de correo no válida";
+App::$strings["Your email domain is not among those allowed on this site"] = "Su dirección de correo no pertenece a ninguno de los dominios permitidos en este sitio.";
+App::$strings["Your email address is already registered at this site."] = "Su dirección de correo está ya registrada en este sitio.";
+App::$strings["An invitation is required."] = "Es obligatorio que le inviten.";
+App::$strings["Invitation could not be verified."] = "No se ha podido verificar su invitación.";
+App::$strings["Please enter the required information."] = "Por favor introduzca la información requerida.";
+App::$strings["Failed to store account information."] = "La información de la cuenta no se ha podido guardar.";
+App::$strings["Registration confirmation for %s"] = "Confirmación de registro para %s";
+App::$strings["Registration request at %s"] = "Solicitud de registro en %s";
+App::$strings["your registration password"] = "su contraseña de registro";
+App::$strings["Registration details for %s"] = "Detalles del registro de %s";
+App::$strings["Account approved."] = "Cuenta aprobada.";
+App::$strings["Registration revoked for %s"] = "Registro revocado para %s";
+App::$strings["Click here to upgrade."] = "Pulse aquí para actualizar";
+App::$strings["This action exceeds the limits set by your subscription plan."] = "Esta acción supera los límites establecidos por su plan de suscripción ";
+App::$strings["This action is not available under your subscription plan."] = "Esta acción no está disponible en su plan de suscripción.";
+App::$strings["Birthday"] = "Cumpleaños";
+App::$strings["Age: "] = "Edad:";
+App::$strings["YYYY-MM-DD or MM-DD"] = "AAAA-MM-DD o MM-DD";
+App::$strings["less than a second ago"] = "hace un instante";
+App::$strings["__ctx:e.g. 22 hours ago, 1 minute ago__ %1\$d %2\$s ago"] = "hace %1\$d %2\$s";
+App::$strings["__ctx:relative_date__ year"] = array(
+ 0 => "año",
+ 1 => "años",
+);
+App::$strings["__ctx:relative_date__ month"] = array(
+ 0 => "mes",
+ 1 => "meses",
+);
+App::$strings["__ctx:relative_date__ week"] = array(
+ 0 => "semana",
+ 1 => "semanas",
+);
+App::$strings["__ctx:relative_date__ day"] = array(
+ 0 => "día",
+ 1 => "días",
+);
+App::$strings["__ctx:relative_date__ hour"] = array(
+ 0 => "hora",
+ 1 => "horas",
+);
+App::$strings["__ctx:relative_date__ minute"] = array(
+ 0 => "minuto",
+ 1 => "minutos",
+);
+App::$strings["__ctx:relative_date__ second"] = array(
+ 0 => "segundo",
+ 1 => "segundos",
+);
+App::$strings["%1\$s's birthday"] = "Cumpleaños de %1\$s";
+App::$strings["Happy Birthday %1\$s"] = "Feliz cumpleaños %1\$s";
+App::$strings["Remote authentication"] = "Acceder desde su servidor";
+App::$strings["Click to authenticate to your home hub"] = "Pulsar para identificarse en su servidor de inicio";
+App::$strings["End this session"] = "Finalizar esta sesión";
+App::$strings["Your profile page"] = "Su página del perfil";
+App::$strings["Manage/Edit profiles"] = "Administrar/editar perfiles";
+App::$strings["Edit your profile"] = "Editar su perfil";
+App::$strings["Sign in"] = "Acceder";
+App::$strings["Take me home"] = "Volver a la página principal";
+App::$strings["Log me out of this site"] = "Salir de este sitio";
+App::$strings["Create an account"] = "Crear una cuenta";
+App::$strings["Help and documentation"] = "Ayuda y documentación";
+App::$strings["Search site @name, #tag, ?docs, content"] = "Buscar en el sitio por @nombre, #etiqueta, ?ayuda o contenido";
+App::$strings["Grid"] = "Red";
+App::$strings["Your grid"] = "Mi red";
+App::$strings["View your network/grid"] = "Ver su red";
+App::$strings["Mark all grid notifications seen"] = "Marcar todas las notificaciones de la red como vistas";
+App::$strings["Channel home"] = "Mi canal";
+App::$strings["View your channel home"] = "Ver su página principal del canal";
+App::$strings["Mark all channel notifications seen"] = "Marcar todas las notificaciones del canal como leídas";
+App::$strings["Notices"] = "Avisos";
+App::$strings["Notifications"] = "Notificaciones";
+App::$strings["View all notifications"] = "Ver todas las notificaciones";
+App::$strings["Private mail"] = "Correo privado";
+App::$strings["View your private messages"] = "Ver sus mensajes privados";
+App::$strings["Mark all private messages seen"] = "Marcar todos los mensajes privados como leídos";
+App::$strings["Event Calendar"] = "Calendario de eventos";
+App::$strings["View events"] = "Ver los eventos";
+App::$strings["Mark all events seen"] = "Marcar todos los eventos como leidos";
+App::$strings["Manage Your Channels"] = "Gestionar sus canales";
+App::$strings["Account/Channel Settings"] = "Ajustes de cuenta/canales";
+App::$strings["Site Setup and Configuration"] = "Ajustes y configuración del sitio";
+App::$strings["@name, #tag, ?doc, content"] = "@nombre, #etiqueta, ?ayuda, contenido";
+App::$strings["Please wait..."] = "Espere por favor…";
+App::$strings["Add Apps"] = "Añadir aplicaciones";
App::$strings["Image exceeds website size limit of %lu bytes"] = "La imagen excede el límite de %lu bytes del sitio";
App::$strings["Image file is empty."] = "El fichero de imagen está vacío. ";
App::$strings["Photo storage failed."] = "La foto no ha podido ser guardada.";
App::$strings["a new photo"] = "una nueva foto";
App::$strings["__ctx:photo_upload__ %1\$s posted %2\$s to %3\$s"] = "%1\$s ha publicado %2\$s en %3\$s";
App::$strings["Upload New Photos"] = "Subir nuevas fotos";
-App::$strings["Unable to obtain identity information from database"] = "No ha sido posible obtener información sobre la identidad desde la base de datos";
-App::$strings["Empty name"] = "Nombre vacío";
-App::$strings["Name too long"] = "Nombre demasiado largo";
-App::$strings["No account identifier"] = "Ningún identificador de la cuenta";
-App::$strings["Nickname is required."] = "Se requiere un sobrenombre (alias).";
-App::$strings["Reserved nickname. Please choose another."] = "Sobrenombre en uso. Por favor, elija otro.";
-App::$strings["Nickname has unsupported characters or is already being used on this site."] = "El alias contiene caracteres no admitidos o está ya en uso por otros miembros de este sitio.";
-App::$strings["Unable to retrieve created identity"] = "No ha sido posible recuperar la identidad creada";
-App::$strings["Default Profile"] = "Perfil principal";
-App::$strings["Create New Profile"] = "Crear un nuevo perfil";
-App::$strings["Visible to everybody"] = "Visible para todos";
-App::$strings["Gender:"] = "Género:";
-App::$strings["Homepage:"] = "Página personal:";
-App::$strings["Online Now"] = "Ahora en línea";
-App::$strings["Like this channel"] = "Me gusta este canal";
-App::$strings["j F, Y"] = "j F Y";
-App::$strings["j F"] = "j F";
-App::$strings["Birthday:"] = "Cumpleaños:";
-App::$strings["for %1\$d %2\$s"] = "por %1\$d %2\$s";
-App::$strings["Sexual Preference:"] = "Orientación sexual:";
-App::$strings["Tags:"] = "Etiquetas:";
-App::$strings["Political Views:"] = "Posición política:";
-App::$strings["Religion:"] = "Religión:";
-App::$strings["Hobbies/Interests:"] = "Aficciones o intereses:";
-App::$strings["Likes:"] = "Me gusta:";
-App::$strings["Dislikes:"] = "No me gusta:";
-App::$strings["Contact information and Social Networks:"] = "Información de contacto y redes sociales:";
-App::$strings["My other channels:"] = "Mis otros canales:";
-App::$strings["Musical interests:"] = "Preferencias musicales:";
-App::$strings["Books, literature:"] = "Libros, literatura:";
-App::$strings["Television:"] = "Televisión:";
-App::$strings["Film/dance/culture/entertainment:"] = "Cine, danza, cultura, entretenimiento:";
-App::$strings["Love/Romance:"] = "Vida sentimental o amorosa:";
-App::$strings["Work/employment:"] = "Trabajo:";
-App::$strings["School/education:"] = "Estudios:";
-App::$strings["Like this thing"] = "Me gusta esto";
-App::$strings["User '%s' deleted"] = "El usuario '%s' ha sido eliminado";
-App::$strings["Source channel not found."] = "No se ha encontrado el canal de origen.";
-App::$strings["Focus (Hubzilla default)"] = "Focus (predefinido)";
-App::$strings["Theme settings"] = "Ajustes del tema";
-App::$strings["Narrow navbar"] = "Estrechar la barra de navegación";
-App::$strings["Navigation bar background color"] = "Color de fondo de la barra de navegación";
-App::$strings["Navigation bar gradient top color"] = "Color superior del gradiente de la barra de navegación";
-App::$strings["Navigation bar gradient bottom color"] = "Color inferior del gradiente de la barra de navegación";
-App::$strings["Navigation active button gradient top color"] = "Color superior del gradiente del botón activo de navegación";
-App::$strings["Navigation active button gradient bottom color"] = "Color inferior del gradiente del botón activo de navegación";
-App::$strings["Navigation bar border color "] = "Color del borde de la barra de navegación";
-App::$strings["Navigation bar icon color "] = "Color del icono de la barra de navegación";
-App::$strings["Navigation bar active icon color "] = "Color del icono activo de la barra de navegación";
-App::$strings["link color"] = "Color del enlace";
-App::$strings["Set font-color for banner"] = "Ajustar el color del tipo de letra para el \"banner\"";
-App::$strings["Set the background color"] = "Ajustar el color de fondo";
-App::$strings["Set the background image"] = "Ajustar la imagen de fondo";
-App::$strings["Set the background color of items"] = "Ajustar el color de los elementos de fondo";
-App::$strings["Set the background color of comments"] = "Ajustar el color de fondo de los comentarios";
-App::$strings["Set the border color of comments"] = "Ajustar el color del borde de los comentarios";
-App::$strings["Set the indent for comments"] = "Ajustar la indentación de los comentarios";
-App::$strings["Set the basic color for item icons"] = "Ajustar el color básico para los iconos de los elementos";
-App::$strings["Set the hover color for item icons"] = "Ajustar el color flotante para los iconos de los elementos";
-App::$strings["Set font-size for the entire application"] = "Ajustar el tamaño de letra para toda la aplicación";
-App::$strings["Example: 14px"] = "Ejemplo: 14px";
-App::$strings["Set font-size for posts and comments"] = "Ajustar el tamaño del tipo de letra para publicaciones y comentarios";
-App::$strings["Set font-color for posts and comments"] = "Establecer el color de la letra para publicaciones y comentarios";
-App::$strings["Set radius of corners"] = "Establecer el radio de curvatura de las esquinas";
-App::$strings["Set shadow depth of photos"] = "Ajustar la profundidad de sombras de las fotos";
-App::$strings["Set maximum width of content region in pixel"] = "Ajustar la anchura máxima de la región de contenido, en pixels";
-App::$strings["Leave empty for default width"] = "Dejar en blanco para la anchura predeterminada";
-App::$strings["Left align page content"] = "Alinear a la izquierda el contenido de la página";
-App::$strings["Set minimum opacity of nav bar - to hide it"] = "Ajustar la opacidad mínima de la barra de navegación - para ocultarla";
-App::$strings["Set size of conversation author photo"] = "Ajustar el tamaño de la foto del autor de la conversación";
-App::$strings["Set size of followup author photos"] = "Ajustar el tamaño de foto de los seguidores del autor";
-App::$strings["Update %s failed. See error logs."] = "La actualización %s ha fallado. Mire el informe de errores.";
-App::$strings["Update Error at %s"] = "Error de actualización en %s";
-App::$strings["Create an account to access services and applications"] = "Crear una cuenta para acceder a los servicios y aplicaciones";
-App::$strings["Login/Email"] = "Inicio de sesión / Correo electrónico";
-App::$strings["Password"] = "Contraseña";
-App::$strings["Remember me"] = "Recordarme";
-App::$strings["Forgot your password?"] = "¿Olvidó su contraseña?";
-App::$strings["toggle mobile"] = "cambiar a modo móvil";
-App::$strings["Website SSL certificate is not valid. Please correct."] = "El certificado SSL del sitio web no es válido. Por favor, solucione el problema.";
-App::$strings["[hubzilla] Website SSL error for %s"] = "[hubzilla] Error SSL del sitio web en %s";
-App::$strings["Cron/Scheduled tasks not running."] = "Las tareas del Planificador/Cron no están funcionando.";
-App::$strings["[hubzilla] Cron tasks not running on %s"] = "[hubzilla] Las tareas de Cron no están funcionando en %s";
+App::$strings["Invalid data packet"] = "Paquete de datos no válido";
+App::$strings["Unable to verify channel signature"] = "No ha sido posible de verificar la firma del canal";
+App::$strings["Unable to verify site signature for %s"] = "No ha sido posible de verificar la firma del sitio para %s";
+App::$strings["invalid target signature"] = "La firma recibida no es válida";
+App::$strings["A deleted group with this name was revived. Existing item permissions <strong>may</strong> apply to this group and any future members. If this is not what you intended, please create another group with a different name."] = "Un grupo suprimido con este nombre ha sido restablecido. <strong>Es posible</strong> que los permisos existentes sean aplicados a este grupo y sus futuros miembros. Si no quiere esto, por favor cree otro grupo con un nombre diferente.";
+App::$strings["Add new connections to this privacy group"] = "Añadir conexiones nuevas a este grupo de canales";
+App::$strings["edit"] = "editar";
+App::$strings["Edit group"] = "Editar grupo";
+App::$strings["Add privacy group"] = "Añadir un grupo de canales";
+App::$strings["Channels not in any privacy group"] = "Sin canales en ningún grupo";
+App::$strings["New window"] = "Nueva ventana";
+App::$strings["Open the selected location in a different window or browser tab"] = "Abrir la dirección seleccionada en una ventana o pestaña aparte";
+App::$strings["Logged out."] = "Desconectado/a.";
+App::$strings["Failed authentication"] = "Autenticación fallida.";
+App::$strings["Help:"] = "Ayuda:";
+App::$strings["Not Found"] = "No encontrado";
diff --git a/view/fr/hmessages.po b/view/fr/hmessages.po
index e972636dd..6f0453f9d 100644
--- a/view/fr/hmessages.po
+++ b/view/fr/hmessages.po
@@ -11,8 +11,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Redmatrix\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-02-17 00:05-0800\n"
-"PO-Revision-Date: 2017-02-18 09:27+0000\n"
+"POT-Creation-Date: 2017-03-31 10:53+0200\n"
+"PO-Revision-Date: 2017-04-01 09:31+0000\n"
"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
"Language-Team: French (http://www.transifex.com/Friendica/red-matrix/language/fr/)\n"
"MIME-Version: 1.0\n"
@@ -21,6 +21,78 @@ msgstr ""
"Language: fr\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+#: ../../Zotlabs/Access/Permissions.php:46
+msgid "Can view my channel stream and posts"
+msgstr "Peut voir mon canal et mes publicatiosn"
+
+#: ../../Zotlabs/Access/Permissions.php:47 ../../include/permissions.php:42
+msgid "Can send me their channel stream and posts"
+msgstr "Peuvent m'envoyer leur flux et les publications de leur canal"
+
+#: ../../Zotlabs/Access/Permissions.php:48 ../../include/permissions.php:36
+msgid "Can view my default channel profile"
+msgstr "Peut voir le profil par défaut du canal."
+
+#: ../../Zotlabs/Access/Permissions.php:49 ../../include/permissions.php:37
+msgid "Can view my connections"
+msgstr "Peut voir mes contacts"
+
+#: ../../Zotlabs/Access/Permissions.php:50 ../../include/permissions.php:38
+msgid "Can view my file storage and photos"
+msgstr "Peut voir mes fichiers et photos"
+
+#: ../../Zotlabs/Access/Permissions.php:51
+msgid "Can upload/modify my file storage and photos"
+msgstr "Peut télécharger/modifier mes fichiers et mes photos"
+
+#: ../../Zotlabs/Access/Permissions.php:52
+msgid "Can view my channel webpages"
+msgstr "Peut voir les pages web de mon canal"
+
+#: ../../Zotlabs/Access/Permissions.php:53
+msgid "Can view my wiki pages"
+msgstr "Peut voir les pages de mon wiki"
+
+#: ../../Zotlabs/Access/Permissions.php:54
+msgid "Can create/edit my channel webpages"
+msgstr "Peut créer ou modifier les pages web de mon canal"
+
+#: ../../Zotlabs/Access/Permissions.php:55
+msgid "Can write to my wiki pages"
+msgstr "Peut écrire sur mon wiki"
+
+#: ../../Zotlabs/Access/Permissions.php:56
+msgid "Can post on my channel (wall) page"
+msgstr "Peut écrire sur le mur de mon canal (mur)"
+
+#: ../../Zotlabs/Access/Permissions.php:57 ../../include/permissions.php:44
+msgid "Can comment on or like my posts"
+msgstr "Peuvent commenter et/ou aimer mes publications"
+
+#: ../../Zotlabs/Access/Permissions.php:58 ../../include/permissions.php:45
+msgid "Can send me private mail messages"
+msgstr "Peuvent m'envoyer des messages privés"
+
+#: ../../Zotlabs/Access/Permissions.php:59
+msgid "Can like/dislike profiles and profile things"
+msgstr "Peut aimer ou détester des profiles"
+
+#: ../../Zotlabs/Access/Permissions.php:60
+msgid "Can forward to all my channel connections via @+ mentions in posts"
+msgstr "Peut faire suivre à tous mes contacts avec la mention @+ dans une publication"
+
+#: ../../Zotlabs/Access/Permissions.php:61
+msgid "Can chat with me"
+msgstr "Peut discuter avec moi"
+
+#: ../../Zotlabs/Access/Permissions.php:62 ../../include/permissions.php:53
+msgid "Can source my public posts in derived channels"
+msgstr "Peut rediriger mes publications publiques vers des canaux dérivés"
+
+#: ../../Zotlabs/Access/Permissions.php:63
+msgid "Can administer my channel"
+msgstr "Peut administrer mon canal"
+
#: ../../Zotlabs/Access/PermissionRoles.php:248
#: ../../include/permissions.php:945
msgid "Social Networking"
@@ -92,15 +164,15 @@ msgid "Special - Group Repository"
msgstr "Spécial - dépôt partagé"
#: ../../Zotlabs/Access/PermissionRoles.php:270
-#: ../../Zotlabs/Module/Register.php:213 ../../Zotlabs/Module/Connedit.php:879
#: ../../Zotlabs/Module/New_channel.php:132
#: ../../Zotlabs/Module/Settings/Channel.php:463
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1148
-#: ../../extend/addon/addon/cdav/cdav.php:277
-#: ../../extend/addon/addon/cdav/cdav.php:284 ../../include/selectors.php:49
-#: ../../include/selectors.php:66 ../../include/selectors.php:104
-#: ../../include/selectors.php:140 ../../include/connections.php:901
-#: ../../include/connections.php:908 ../../include/permissions.php:949
+#: ../../Zotlabs/Module/Connedit.php:922 ../../Zotlabs/Module/Profiles.php:798
+#: ../../Zotlabs/Module/Register.php:213 ../../addon/cdav/Mod_Cdav.php:1148
+#: ../../addon/cdav/cdav.php:277 ../../addon/cdav/cdav.php:284
+#: ../../include/selectors.php:49 ../../include/selectors.php:66
+#: ../../include/selectors.php:104 ../../include/selectors.php:140
+#: ../../include/permissions.php:949 ../../include/connections.php:675
+#: ../../include/connections.php:682
msgid "Other"
msgstr "Autre"
@@ -109,1935 +181,1963 @@ msgstr "Autre"
msgid "Custom/Expert Mode"
msgstr "Mode expert/spécifique"
-#: ../../Zotlabs/Access/Permissions.php:46
-msgid "Can view my channel stream and posts"
-msgstr "Peut voir mon canal et mes publicatiosn"
-
-#: ../../Zotlabs/Access/Permissions.php:47 ../../include/permissions.php:42
-msgid "Can send me their channel stream and posts"
-msgstr "Peuvent m'envoyer leur flux et les publications de leur canal"
-
-#: ../../Zotlabs/Access/Permissions.php:48 ../../include/permissions.php:36
-msgid "Can view my default channel profile"
-msgstr "Peut voir le profil par défaut du canal."
+#: ../../Zotlabs/Module/Blocks.php:33 ../../Zotlabs/Module/Editlayout.php:31
+#: ../../Zotlabs/Module/Connect.php:17
+#: ../../Zotlabs/Module/Achievements.php:15 ../../Zotlabs/Module/Hcard.php:12
+#: ../../Zotlabs/Module/Editblock.php:31 ../../Zotlabs/Module/Profile.php:20
+#: ../../Zotlabs/Module/Layouts.php:31 ../../Zotlabs/Module/Editwebpage.php:32
+#: ../../Zotlabs/Module/Webpages.php:33
+#: ../../Zotlabs/Module/Filestorage.php:59 ../../include/channel.php:943
+msgid "Requested profile is not available."
+msgstr "Profil demandé non disponible."
-#: ../../Zotlabs/Access/Permissions.php:49 ../../include/permissions.php:37
-msgid "Can view my connections"
-msgstr "Peut voir mes contacts"
+#: ../../Zotlabs/Module/Blocks.php:73 ../../Zotlabs/Module/Blocks.php:80
+#: ../../Zotlabs/Module/Invite.php:17 ../../Zotlabs/Module/Invite.php:94
+#: ../../Zotlabs/Module/Editlayout.php:67
+#: ../../Zotlabs/Module/Editlayout.php:90 ../../Zotlabs/Module/Channel.php:115
+#: ../../Zotlabs/Module/Channel.php:245 ../../Zotlabs/Module/Channel.php:285
+#: ../../Zotlabs/Module/Settings.php:59 ../../Zotlabs/Module/Locs.php:87
+#: ../../Zotlabs/Module/Mitem.php:115 ../../Zotlabs/Module/Events.php:271
+#: ../../Zotlabs/Module/Appman.php:82 ../../Zotlabs/Module/Regmod.php:21
+#: ../../Zotlabs/Module/New_channel.php:77
+#: ../../Zotlabs/Module/New_channel.php:104
+#: ../../Zotlabs/Module/Sharedwithme.php:11 ../../Zotlabs/Module/Setup.php:212
+#: ../../Zotlabs/Module/Achievements.php:34 ../../Zotlabs/Module/Thing.php:274
+#: ../../Zotlabs/Module/Thing.php:294 ../../Zotlabs/Module/Thing.php:335
+#: ../../Zotlabs/Module/Api.php:24 ../../Zotlabs/Module/Editblock.php:67
+#: ../../Zotlabs/Module/Profile.php:83 ../../Zotlabs/Module/Profile.php:100
+#: ../../Zotlabs/Module/Mood.php:116 ../../Zotlabs/Module/Connections.php:29
+#: ../../Zotlabs/Module/Viewsrc.php:18 ../../Zotlabs/Module/Bookmarks.php:61
+#: ../../Zotlabs/Module/Photos.php:69 ../../Zotlabs/Module/Wiki.php:50
+#: ../../Zotlabs/Module/Wiki.php:216 ../../Zotlabs/Module/Wiki.php:315
+#: ../../Zotlabs/Module/Pdledit.php:29 ../../Zotlabs/Module/Poke.php:137
+#: ../../Zotlabs/Module/Profile_photo.php:280
+#: ../../Zotlabs/Module/Profile_photo.php:293
+#: ../../Zotlabs/Module/Authtest.php:16 ../../Zotlabs/Module/Item.php:220
+#: ../../Zotlabs/Module/Item.php:230 ../../Zotlabs/Module/Item.php:1037
+#: ../../Zotlabs/Module/Page.php:35 ../../Zotlabs/Module/Page.php:91
+#: ../../Zotlabs/Module/Connedit.php:385 ../../Zotlabs/Module/Chat.php:98
+#: ../../Zotlabs/Module/Chat.php:103 ../../Zotlabs/Module/Menu.php:78
+#: ../../Zotlabs/Module/Layouts.php:71 ../../Zotlabs/Module/Layouts.php:78
+#: ../../Zotlabs/Module/Layouts.php:89 ../../Zotlabs/Module/Group.php:13
+#: ../../Zotlabs/Module/Profiles.php:198 ../../Zotlabs/Module/Profiles.php:635
+#: ../../Zotlabs/Module/Editwebpage.php:68
+#: ../../Zotlabs/Module/Editwebpage.php:89
+#: ../../Zotlabs/Module/Editwebpage.php:104
+#: ../../Zotlabs/Module/Editwebpage.php:126 ../../Zotlabs/Module/Manage.php:10
+#: ../../Zotlabs/Module/Webpages.php:116 ../../Zotlabs/Module/Block.php:26
+#: ../../Zotlabs/Module/Block.php:76 ../../Zotlabs/Module/Editpost.php:17
+#: ../../Zotlabs/Module/Sources.php:74 ../../Zotlabs/Module/Like.php:181
+#: ../../Zotlabs/Module/Suggest.php:28 ../../Zotlabs/Module/Message.php:18
+#: ../../Zotlabs/Module/Mail.php:164 ../../Zotlabs/Module/Register.php:77
+#: ../../Zotlabs/Module/Cover_photo.php:281
+#: ../../Zotlabs/Module/Cover_photo.php:294
+#: ../../Zotlabs/Module/Network.php:15 ../../Zotlabs/Module/Filestorage.php:23
+#: ../../Zotlabs/Module/Filestorage.php:78
+#: ../../Zotlabs/Module/Filestorage.php:93
+#: ../../Zotlabs/Module/Filestorage.php:120 ../../Zotlabs/Module/Common.php:39
+#: ../../Zotlabs/Module/Viewconnections.php:28
+#: ../../Zotlabs/Module/Viewconnections.php:33
+#: ../../Zotlabs/Module/Service_limits.php:11
+#: ../../Zotlabs/Module/Rate.php:113 ../../Zotlabs/Module/Notifications.php:11
+#: ../../Zotlabs/Lib/Chatroom.php:137 ../../Zotlabs/Web/WebServer.php:131
+#: ../../addon/keepout/keepout.php:36 ../../addon/openid/Mod_Id.php:53
+#: ../../addon/gitwiki/Mod_Gitwiki.php:196
+#: ../../addon/gitwiki/Mod_Gitwiki.php:292
+#: ../../addon/diaspora_reconnect/diaspora_reconnect.php:58
+#: ../../addon/pumpio/pumpio.php:40 ../../include/attach.php:144
+#: ../../include/attach.php:191 ../../include/attach.php:255
+#: ../../include/attach.php:269 ../../include/attach.php:276
+#: ../../include/attach.php:344 ../../include/attach.php:358
+#: ../../include/attach.php:365 ../../include/attach.php:442
+#: ../../include/attach.php:909 ../../include/attach.php:983
+#: ../../include/attach.php:1148 ../../include/items.php:3457
+#: ../../include/photos.php:27
+msgid "Permission denied."
+msgstr "Permission refusée."
-#: ../../Zotlabs/Access/Permissions.php:50 ../../include/permissions.php:38
-msgid "Can view my file storage and photos"
-msgstr "Peut voir mes fichiers et photos"
+#: ../../Zotlabs/Module/Blocks.php:97 ../../Zotlabs/Module/Blocks.php:155
+#: ../../Zotlabs/Module/Editblock.php:113
+msgid "Block Name"
+msgstr "Nom du Bloc"
-#: ../../Zotlabs/Access/Permissions.php:51
-msgid "Can upload/modify my file storage and photos"
-msgstr "Peut télécharger/modifier mes fichiers et mes photos"
+#: ../../Zotlabs/Module/Blocks.php:154 ../../include/text.php:2275
+msgid "Blocks"
+msgstr "Blocs"
-#: ../../Zotlabs/Access/Permissions.php:52
-msgid "Can view my channel webpages"
-msgstr "Peut voir les pages web de mon canal"
+#: ../../Zotlabs/Module/Blocks.php:156
+msgid "Block Title"
+msgstr "Titre du bloc"
-#: ../../Zotlabs/Access/Permissions.php:53
-msgid "Can view my wiki pages"
-msgstr "Peut voir les pages de mon wiki"
+#: ../../Zotlabs/Module/Blocks.php:157 ../../Zotlabs/Module/Menu.php:114
+#: ../../Zotlabs/Module/Layouts.php:191 ../../Zotlabs/Module/Webpages.php:256
+#: ../../include/page_widgets.php:47
+msgid "Created"
+msgstr "Créé(e)"
-#: ../../Zotlabs/Access/Permissions.php:54
-msgid "Can create/edit my channel webpages"
-msgstr "Peut créer ou modifier les pages web de mon canal"
+#: ../../Zotlabs/Module/Blocks.php:158 ../../Zotlabs/Module/Menu.php:115
+#: ../../Zotlabs/Module/Layouts.php:192 ../../Zotlabs/Module/Webpages.php:257
+#: ../../include/page_widgets.php:48
+msgid "Edited"
+msgstr "Modifié(e)"
-#: ../../Zotlabs/Access/Permissions.php:55
-msgid "Can write to my wiki pages"
-msgstr "Peut écrire sur mon wiki"
+#: ../../Zotlabs/Module/Blocks.php:159
+#: ../../Zotlabs/Module/New_channel.php:147
+#: ../../Zotlabs/Module/Connedit.php:925 ../../Zotlabs/Module/Menu.php:118
+#: ../../Zotlabs/Module/Layouts.php:185 ../../Zotlabs/Module/Profiles.php:801
+#: ../../Zotlabs/Module/Webpages.php:244 ../../Zotlabs/Storage/Browser.php:228
+#: ../../Zotlabs/Storage/Browser.php:332 ../../addon/cdav/Mod_Cdav.php:1151
+#: ../../addon/cdav/include/widgets.php:127
+#: ../../addon/cdav/include/widgets.php:164
+msgid "Create"
+msgstr "Créer"
-#: ../../Zotlabs/Access/Permissions.php:56
-msgid "Can post on my channel (wall) page"
-msgstr "Peut écrire sur le mur de mon canal (mur)"
+#: ../../Zotlabs/Module/Blocks.php:160 ../../Zotlabs/Module/Editlayout.php:114
+#: ../../Zotlabs/Module/Admin/Profs.php:154
+#: ../../Zotlabs/Module/Settings/Oauth.php:149
+#: ../../Zotlabs/Module/Thing.php:260 ../../Zotlabs/Module/Editblock.php:114
+#: ../../Zotlabs/Module/Connections.php:296
+#: ../../Zotlabs/Module/Connections.php:316 ../../Zotlabs/Module/Wiki.php:165
+#: ../../Zotlabs/Module/Wiki.php:275 ../../Zotlabs/Module/Menu.php:112
+#: ../../Zotlabs/Module/Layouts.php:193
+#: ../../Zotlabs/Module/Editwebpage.php:147
+#: ../../Zotlabs/Module/Webpages.php:245 ../../Zotlabs/Module/Editpost.php:85
+#: ../../Zotlabs/Lib/Apps.php:357 ../../Zotlabs/Lib/ThreadItem.php:107
+#: ../../Zotlabs/Storage/Browser.php:238
+#: ../../addon/cdav/include/widgets.php:125
+#: ../../addon/cdav/include/widgets.php:161
+#: ../../addon/gitwiki/Mod_Gitwiki.php:151
+#: ../../addon/gitwiki/Mod_Gitwiki.php:252 ../../include/channel.php:1042
+#: ../../include/channel.php:1046 ../../include/menu.php:113
+#: ../../include/page_widgets.php:9 ../../include/page_widgets.php:39
+msgid "Edit"
+msgstr "Modifier"
-#: ../../Zotlabs/Access/Permissions.php:57 ../../include/permissions.php:44
-msgid "Can comment on or like my posts"
-msgstr "Peuvent commenter et/ou aimer mes publications"
+#: ../../Zotlabs/Module/Blocks.php:161 ../../Zotlabs/Module/Photos.php:1042
+#: ../../Zotlabs/Module/Layouts.php:194 ../../Zotlabs/Module/Webpages.php:246
+#: ../../addon/cdav/include/widgets.php:123
+#: ../../include/conversation.php:1311
+msgid "Share"
+msgstr "Partager"
-#: ../../Zotlabs/Access/Permissions.php:58 ../../include/permissions.php:45
-msgid "Can send me private mail messages"
-msgstr "Peuvent m'envoyer des messages privés"
+#: ../../Zotlabs/Module/Blocks.php:162 ../../Zotlabs/Module/Editlayout.php:138
+#: ../../Zotlabs/Module/Admin/Accounts.php:173
+#: ../../Zotlabs/Module/Admin/Channels.php:149
+#: ../../Zotlabs/Module/Admin/Profs.php:155
+#: ../../Zotlabs/Module/Settings/Oauth.php:150
+#: ../../Zotlabs/Module/Thing.php:261 ../../Zotlabs/Module/Editblock.php:139
+#: ../../Zotlabs/Module/Connections.php:267
+#: ../../Zotlabs/Module/Photos.php:1143 ../../Zotlabs/Module/Connedit.php:658
+#: ../../Zotlabs/Module/Connedit.php:927 ../../Zotlabs/Module/Group.php:177
+#: ../../Zotlabs/Module/Profiles.php:803
+#: ../../Zotlabs/Module/Editwebpage.php:172
+#: ../../Zotlabs/Module/Webpages.php:247 ../../Zotlabs/Lib/Apps.php:358
+#: ../../Zotlabs/Lib/ThreadItem.php:127 ../../Zotlabs/Storage/Browser.php:239
+#: ../../addon/cdav/Mod_Cdav.php:864 ../../addon/cdav/Mod_Cdav.php:1153
+#: ../../include/conversation.php:654
+msgid "Delete"
+msgstr "Supprimer"
-#: ../../Zotlabs/Access/Permissions.php:59
-msgid "Can like/dislike profiles and profile things"
-msgstr "Peut aimer ou détester des profiles"
+#: ../../Zotlabs/Module/Blocks.php:166 ../../Zotlabs/Module/Events.php:694
+#: ../../Zotlabs/Module/Wiki.php:167 ../../Zotlabs/Module/Layouts.php:198
+#: ../../Zotlabs/Module/Webpages.php:251 ../../Zotlabs/Module/Pubsites.php:59
+#: ../../addon/gitwiki/Mod_Gitwiki.php:153 ../../include/page_widgets.php:42
+msgid "View"
+msgstr "Voir"
-#: ../../Zotlabs/Access/Permissions.php:60
-msgid "Can forward to all my channel connections via @+ mentions in posts"
-msgstr "Peut faire suivre à tous mes contacts avec la mention @+ dans une publication"
+#: ../../Zotlabs/Module/Invite.php:29
+msgid "Total invitation limit exceeded."
+msgstr "Limite du nombre total d'invitation dépassée."
-#: ../../Zotlabs/Access/Permissions.php:61
-msgid "Can chat with me"
-msgstr "Peut discuter avec moi"
+#: ../../Zotlabs/Module/Invite.php:53
+#, php-format
+msgid "%s : Not a valid email address."
+msgstr "%s&nbsp;: adresse courriel invalide."
-#: ../../Zotlabs/Access/Permissions.php:62 ../../include/permissions.php:53
-msgid "Can source my public posts in derived channels"
-msgstr "Peut rediriger mes publications publiques vers des canaux dérivés"
+#: ../../Zotlabs/Module/Invite.php:67
+msgid "Please join us on $Projectname"
+msgstr "Rejoignez-nous sur $Projectname"
-#: ../../Zotlabs/Access/Permissions.php:63
-msgid "Can administer my channel"
-msgstr "Peut administrer mon canal"
+#: ../../Zotlabs/Module/Invite.php:77
+msgid "Invitation limit exceeded. Please contact your site administrator."
+msgstr "Limite d'invitations dépassée. Merci de contacter l'administration de votre site."
-#: ../../Zotlabs/Storage/Browser.php:106 ../../Zotlabs/Storage/Browser.php:237
-msgid "parent"
-msgstr "retour"
+#: ../../Zotlabs/Module/Invite.php:82
+#, php-format
+msgid "%s : Message delivery failed."
+msgstr "%s&nbsp;: Échec de distribution du message."
-#: ../../Zotlabs/Storage/Browser.php:130 ../../include/text.php:2695
-msgid "Collection"
-msgstr "Groupe de contacts"
+#: ../../Zotlabs/Module/Invite.php:86
+#, php-format
+msgid "%d message sent."
+msgid_plural "%d messages sent."
+msgstr[0] "%d message envoyé."
+msgstr[1] "%d messages envoyés."
-#: ../../Zotlabs/Storage/Browser.php:133
-msgid "Principal"
-msgstr "Principal"
+#: ../../Zotlabs/Module/Invite.php:105
+msgid "You have no more invitations available"
+msgstr "Vous ne disposez plus d'aucune invitation"
-#: ../../Zotlabs/Storage/Browser.php:136
-msgid "Addressbook"
-msgstr "Carnet d'adresse"
+#: ../../Zotlabs/Module/Invite.php:136
+msgid "Send invitations"
+msgstr "Envoyer des invitations"
-#: ../../Zotlabs/Storage/Browser.php:139
-msgid "Calendar"
-msgstr "Calendrier"
+#: ../../Zotlabs/Module/Invite.php:137
+msgid "Enter email addresses, one per line:"
+msgstr "Entrez les adresses de courriel, une par ligne&nbsp;:"
-#: ../../Zotlabs/Storage/Browser.php:142
-msgid "Schedule Inbox"
-msgstr "Calendrier - Messages entrants"
+#: ../../Zotlabs/Module/Invite.php:138 ../../Zotlabs/Module/Mail.php:284
+msgid "Your message:"
+msgstr "Votre message&nbsp;:"
-#: ../../Zotlabs/Storage/Browser.php:145
-msgid "Schedule Outbox"
-msgstr "Calendrier - Messages sortants"
+#: ../../Zotlabs/Module/Invite.php:139
+msgid "Please join my community on $Projectname."
+msgstr "Rejoignez ma communauté sur $Projectname."
-#: ../../Zotlabs/Storage/Browser.php:163 ../../Zotlabs/Module/Photos.php:784
-#: ../../Zotlabs/Module/Photos.php:1244
-#: ../../Zotlabs/Module/Embedphotos.php:145 ../../Zotlabs/Lib/Apps.php:559
-#: ../../Zotlabs/Lib/Apps.php:637
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:745
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:746
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:753
-#: ../../include/conversation.php:1177 ../../include/widgets.php:1714
-msgid "Unknown"
-msgstr "Inconnu"
+#: ../../Zotlabs/Module/Invite.php:141
+msgid "You will need to supply this invitation code:"
+msgstr "Vous devrez fournir le code suivant&nbsp;:"
-#: ../../Zotlabs/Storage/Browser.php:224 ../../Zotlabs/Module/Fbrowser.php:85
-#: ../../Zotlabs/Lib/Apps.php:224 ../../include/conversation.php:1843
-msgid "Files"
-msgstr "Fichiers"
+#: ../../Zotlabs/Module/Invite.php:142
+msgid ""
+"1. Register at any $Projectname location (they are all inter-connected)"
+msgstr "1. Enregistrez-vous sur n'importe quel serveur $Projectname (ils sont tous inter-connectés)"
-#: ../../Zotlabs/Storage/Browser.php:225
-msgid "Total"
-msgstr "Total"
+#: ../../Zotlabs/Module/Invite.php:144
+msgid "2. Enter my $Projectname network address into the site searchbar."
+msgstr "2. Saisissez l'adresse de mon canal $Projectname dans la barre de recherche du site."
-#: ../../Zotlabs/Storage/Browser.php:227
-msgid "Shared"
-msgstr "Partagé"
+#: ../../Zotlabs/Module/Invite.php:145
+msgid "or visit"
+msgstr "ou rendez-vous sur"
-#: ../../Zotlabs/Storage/Browser.php:228 ../../Zotlabs/Storage/Browser.php:321
-#: ../../Zotlabs/Module/Menu.php:118 ../../Zotlabs/Module/Connedit.php:882
-#: ../../Zotlabs/Module/New_channel.php:147
-#: ../../Zotlabs/Module/Blocks.php:159 ../../Zotlabs/Module/Layouts.php:184
-#: ../../Zotlabs/Module/Webpages.php:243
-#: ../../extend/addon/addon/cdav/include/widgets.php:127
-#: ../../extend/addon/addon/cdav/include/widgets.php:164
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1151
-msgid "Create"
-msgstr "Créer"
+#: ../../Zotlabs/Module/Invite.php:147
+msgid "3. Click [Connect]"
+msgstr "3. Cliquez sur [Ajouter]"
-#: ../../Zotlabs/Storage/Browser.php:229 ../../Zotlabs/Storage/Browser.php:323
-#: ../../Zotlabs/Module/Photos.php:811 ../../Zotlabs/Module/Photos.php:1368
-#: ../../Zotlabs/Module/Cover_photo.php:357
-#: ../../Zotlabs/Module/Profile_photo.php:412
-#: ../../Zotlabs/Module/Embedphotos.php:157
-#: ../../extend/addon/addon/cdav/include/widgets.php:132
-#: ../../extend/addon/addon/cdav/include/widgets.php:168
-#: ../../include/widgets.php:1727
-msgid "Upload"
+#: ../../Zotlabs/Module/Invite.php:149 ../../Zotlabs/Module/Locs.php:121
+#: ../../Zotlabs/Module/Mitem.php:243 ../../Zotlabs/Module/Events.php:493
+#: ../../Zotlabs/Module/Appman.php:134
+#: ../../Zotlabs/Module/Import_items.php:126
+#: ../../Zotlabs/Module/Setup.php:309 ../../Zotlabs/Module/Setup.php:357
+#: ../../Zotlabs/Module/Connect.php:98
+#: ../../Zotlabs/Module/Admin/Features.php:66
+#: ../../Zotlabs/Module/Admin/Plugins.php:438
+#: ../../Zotlabs/Module/Admin/Accounts.php:166
+#: ../../Zotlabs/Module/Admin/Logs.php:84
+#: ../../Zotlabs/Module/Admin/Channels.php:147
+#: ../../Zotlabs/Module/Admin/Themes.php:158
+#: ../../Zotlabs/Module/Admin/Site.php:279
+#: ../../Zotlabs/Module/Admin/Profs.php:157
+#: ../../Zotlabs/Module/Admin/Account_edit.php:74
+#: ../../Zotlabs/Module/Admin/Security.php:104
+#: ../../Zotlabs/Module/Settings/Permcats.php:110
+#: ../../Zotlabs/Module/Settings/Channel.php:476
+#: ../../Zotlabs/Module/Settings/Features.php:47
+#: ../../Zotlabs/Module/Settings/Tokens.php:168
+#: ../../Zotlabs/Module/Settings/Account.php:118
+#: ../../Zotlabs/Module/Settings/Featured.php:50
+#: ../../Zotlabs/Module/Settings/Display.php:203
+#: ../../Zotlabs/Module/Settings/Oauth.php:87
+#: ../../Zotlabs/Module/Thing.php:320 ../../Zotlabs/Module/Thing.php:370
+#: ../../Zotlabs/Module/Import.php:511 ../../Zotlabs/Module/Cal.php:343
+#: ../../Zotlabs/Module/Mood.php:139 ../../Zotlabs/Module/Photos.php:657
+#: ../../Zotlabs/Module/Photos.php:1022 ../../Zotlabs/Module/Photos.php:1062
+#: ../../Zotlabs/Module/Photos.php:1180 ../../Zotlabs/Module/Wiki.php:169
+#: ../../Zotlabs/Module/Pdledit.php:74 ../../Zotlabs/Module/Poke.php:186
+#: ../../Zotlabs/Module/Connedit.php:890 ../../Zotlabs/Module/Chat.php:194
+#: ../../Zotlabs/Module/Chat.php:240 ../../Zotlabs/Module/Pconfig.php:107
+#: ../../Zotlabs/Module/Group.php:85 ../../Zotlabs/Module/Profiles.php:726
+#: ../../Zotlabs/Module/Sources.php:114 ../../Zotlabs/Module/Sources.php:149
+#: ../../Zotlabs/Module/Xchan.php:15 ../../Zotlabs/Module/Mail.php:425
+#: ../../Zotlabs/Module/Filestorage.php:165 ../../Zotlabs/Module/Rate.php:166
+#: ../../Zotlabs/Lib/ThreadItem.php:732
+#: ../../Zotlabs/Widget/Eventstools.php:16
+#: ../../view/theme/redbasic/php/config.php:84
+#: ../../addon/skeleton/skeleton.php:65 ../../addon/gnusoc/gnusoc.php:133
+#: ../../addon/cdav/cdav.php:246 ../../addon/planets/planets.php:157
+#: ../../addon/openclipatar/openclipatar.php:53
+#: ../../addon/wppost/wppost.php:113 ../../addon/nsfw/nsfw.php:92
+#: ../../addon/ijpost/ijpost.php:89 ../../addon/dwpost/dwpost.php:89
+#: ../../addon/mailhost/mailhost.php:40
+#: ../../addon/likebanner/likebanner.php:57
+#: ../../addon/redphotos/redphotos.php:136 ../../addon/irc/irc.php:53
+#: ../../addon/ljpost/ljpost.php:86 ../../addon/startpage/startpage.php:113
+#: ../../addon/diaspora/diaspora.php:714
+#: ../../addon/gitwiki/Mod_Gitwiki.php:155
+#: ../../addon/rainbowtag/rainbowtag.php:85 ../../addon/visage/visage.php:170
+#: ../../addon/nsabait/nsabait.php:161 ../../addon/mailtest/mailtest.php:100
+#: ../../addon/openstreetmap/openstreetmap.php:168
+#: ../../addon/rtof/rtof.php:101 ../../addon/jappixmini/jappixmini.php:371
+#: ../../addon/superblock/superblock.php:120 ../../addon/nofed/nofed.php:80
+#: ../../addon/redred/redred.php:119 ../../addon/logrot/logrot.php:35
+#: ../../addon/frphotos/frphotos.php:96 ../../addon/chords/Mod_Chords.php:60
+#: ../../addon/libertree/libertree.php:85
+#: ../../addon/flattrwidget/flattrwidget.php:124
+#: ../../addon/statusnet/statusnet.php:322
+#: ../../addon/statusnet/statusnet.php:380
+#: ../../addon/statusnet/statusnet.php:432
+#: ../../addon/statusnet/statusnet.php:899 ../../addon/twitter/twitter.php:217
+#: ../../addon/twitter/twitter.php:259
+#: ../../addon/smileybutton/smileybutton.php:281
+#: ../../addon/piwik/piwik.php:95 ../../addon/pageheader/pageheader.php:48
+#: ../../addon/xmpp/xmpp.php:69 ../../addon/pumpio/pumpio.php:237
+#: ../../addon/redfiles/redfiles.php:124 ../../addon/hubwall/hubwall.php:95
+#: ../../include/js_strings.php:22
+msgid "Submit"
msgstr "Envoyer"
-#: ../../Zotlabs/Storage/Browser.php:233
-#: ../../Zotlabs/Module/Admin/Channels.php:159
-#: ../../Zotlabs/Module/Connedit.php:867
-#: ../../Zotlabs/Module/Sharedwithme.php:99 ../../Zotlabs/Module/Wiki.php:170
-#: ../../Zotlabs/Module/Settings/Oauth.php:89
-#: ../../Zotlabs/Module/Settings/Oauth.php:115
-#: ../../Zotlabs/Module/Chat.php:250
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1136
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:172
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:156
-#: ../../include/widgets.php:990
-msgid "Name"
-msgstr "Nom"
-
-#: ../../Zotlabs/Storage/Browser.php:234 ../../Zotlabs/Module/Wiki.php:171
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:157
-msgid "Type"
-msgstr "Type"
-
-#: ../../Zotlabs/Storage/Browser.php:235
-#: ../../Zotlabs/Module/Sharedwithme.php:101 ../../include/text.php:1408
-msgid "Size"
-msgstr "Taille"
+#: ../../Zotlabs/Module/Editlayout.php:79
+#: ../../Zotlabs/Module/Editblock.php:79 ../../Zotlabs/Module/Editblock.php:95
+#: ../../Zotlabs/Module/Editwebpage.php:80
+#: ../../Zotlabs/Module/Editpost.php:24
+msgid "Item not found"
+msgstr "Élément introuvable"
-#: ../../Zotlabs/Storage/Browser.php:236
-#: ../../Zotlabs/Module/Sharedwithme.php:102
-msgid "Last Modified"
-msgstr "Modifié le"
+#: ../../Zotlabs/Module/Editlayout.php:128
+#: ../../Zotlabs/Module/Layouts.php:129 ../../Zotlabs/Module/Layouts.php:189
+msgid "Layout Name"
+msgstr "Nom de la mise en page"
-#: ../../Zotlabs/Storage/Browser.php:238 ../../Zotlabs/Module/Editpost.php:85
-#: ../../Zotlabs/Module/Editblock.php:109
-#: ../../Zotlabs/Module/Connections.php:300
-#: ../../Zotlabs/Module/Connections.php:320
-#: ../../Zotlabs/Module/Admin/Profs.php:154
-#: ../../Zotlabs/Module/Editlayout.php:114
-#: ../../Zotlabs/Module/Editwebpage.php:145 ../../Zotlabs/Module/Menu.php:112
-#: ../../Zotlabs/Module/Blocks.php:160 ../../Zotlabs/Module/Layouts.php:192
-#: ../../Zotlabs/Module/Webpages.php:244 ../../Zotlabs/Module/Wiki.php:163
-#: ../../Zotlabs/Module/Wiki.php:273
-#: ../../Zotlabs/Module/Settings/Oauth.php:149
-#: ../../Zotlabs/Module/Thing.php:260 ../../Zotlabs/Lib/ThreadItem.php:106
-#: ../../Zotlabs/Lib/Apps.php:357
-#: ../../extend/addon/addon/cdav/include/widgets.php:125
-#: ../../extend/addon/addon/cdav/include/widgets.php:161
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:149
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:251
-#: ../../include/menu.php:113 ../../include/channel.php:1044
-#: ../../include/channel.php:1048 ../../include/page_widgets.php:9
-#: ../../include/page_widgets.php:39
-msgid "Edit"
-msgstr "Modifier"
+#: ../../Zotlabs/Module/Editlayout.php:129
+#: ../../Zotlabs/Module/Layouts.php:132
+msgid "Layout Description (Optional)"
+msgstr "Description de la mise en page (facultatif)"
-#: ../../Zotlabs/Storage/Browser.php:239 ../../Zotlabs/Module/Photos.php:1174
-#: ../../Zotlabs/Module/Editblock.php:134
-#: ../../Zotlabs/Module/Connections.php:271
-#: ../../Zotlabs/Module/Admin/Profs.php:155
-#: ../../Zotlabs/Module/Admin/Accounts.php:173
-#: ../../Zotlabs/Module/Admin/Channels.php:149
#: ../../Zotlabs/Module/Editlayout.php:137
-#: ../../Zotlabs/Module/Editwebpage.php:170
-#: ../../Zotlabs/Module/Connedit.php:626 ../../Zotlabs/Module/Connedit.php:884
-#: ../../Zotlabs/Module/Group.php:177 ../../Zotlabs/Module/Blocks.php:162
-#: ../../Zotlabs/Module/Webpages.php:246
-#: ../../Zotlabs/Module/Settings/Oauth.php:150
-#: ../../Zotlabs/Module/Thing.php:261 ../../Zotlabs/Lib/ThreadItem.php:126
-#: ../../Zotlabs/Lib/Apps.php:358
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:864
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1153
-#: ../../include/conversation.php:656
-msgid "Delete"
-msgstr "Supprimer"
-
-#: ../../Zotlabs/Storage/Browser.php:299
-#, php-format
-msgid "You are using %1$s of your available file storage."
-msgstr "Vous utilisez %1$s de votre espace de stockage."
-
-#: ../../Zotlabs/Storage/Browser.php:304
-#, php-format
-msgid "You are using %1$s of %2$s available file storage. (%3$s&#37;)"
-msgstr "Vous utilisez %1$s sur %2$s d'espace disponible. (%3$s&#37;)"
-
-#: ../../Zotlabs/Storage/Browser.php:315
-msgid "WARNING:"
-msgstr "AVERTISSEMENT&nbsp;:"
-
-#: ../../Zotlabs/Storage/Browser.php:320
-msgid "Create new folder"
-msgstr "Nouveau dossier"
-
-#: ../../Zotlabs/Storage/Browser.php:322
-msgid "Upload file"
-msgstr "Téléverser un fichier"
-
-#: ../../Zotlabs/Storage/Browser.php:335
-msgid "Drop files here to immediately upload"
-msgstr "Mettez un fichier ici pour le télécharger immédiatement"
+msgid "Edit Layout"
+msgstr "Modifier la mise en page"
-#: ../../Zotlabs/Web/WebServer.php:127 ../../Zotlabs/Module/Like.php:283
-#: ../../Zotlabs/Module/Group.php:72 ../../Zotlabs/Module/Dreport.php:10
-#: ../../Zotlabs/Module/Dreport.php:68
-#: ../../Zotlabs/Module/Import_items.php:114
#: ../../Zotlabs/Module/Profperm.php:28 ../../Zotlabs/Module/Subthread.php:62
-#: ../../extend/addon/addon/frphotos/frphotos.php:81
-#: ../../extend/addon/addon/redfiles/redfiles.php:109
-#: ../../extend/addon/addon/redphotos/redphotos.php:119
+#: ../../Zotlabs/Module/Import_items.php:118 ../../Zotlabs/Module/Group.php:72
+#: ../../Zotlabs/Module/Dreport.php:10 ../../Zotlabs/Module/Dreport.php:68
+#: ../../Zotlabs/Module/Like.php:283 ../../Zotlabs/Web/WebServer.php:130
+#: ../../addon/redphotos/redphotos.php:119
+#: ../../addon/frphotos/frphotos.php:81 ../../addon/redfiles/redfiles.php:109
#: ../../include/items.php:327
msgid "Permission denied"
msgstr "Accès refusé"
-#: ../../Zotlabs/Web/WebServer.php:128 ../../Zotlabs/Web/Router.php:67
-#: ../../Zotlabs/Module/Achievements.php:34
-#: ../../Zotlabs/Module/Register.php:77 ../../Zotlabs/Module/Photos.php:73
-#: ../../Zotlabs/Module/Editpost.php:17 ../../Zotlabs/Module/Authtest.php:16
-#: ../../Zotlabs/Module/Bookmarks.php:61 ../../Zotlabs/Module/Editblock.php:67
-#: ../../Zotlabs/Module/Page.php:35 ../../Zotlabs/Module/Page.php:91
-#: ../../Zotlabs/Module/Connections.php:33
-#: ../../Zotlabs/Module/Cover_photo.php:277
-#: ../../Zotlabs/Module/Cover_photo.php:290
-#: ../../Zotlabs/Module/Editlayout.php:67
-#: ../../Zotlabs/Module/Editlayout.php:90
-#: ../../Zotlabs/Module/Editwebpage.php:68
-#: ../../Zotlabs/Module/Editwebpage.php:89
-#: ../../Zotlabs/Module/Editwebpage.php:104
-#: ../../Zotlabs/Module/Editwebpage.php:126 ../../Zotlabs/Module/Like.php:181
-#: ../../Zotlabs/Module/Network.php:15 ../../Zotlabs/Module/Menu.php:78
-#: ../../Zotlabs/Module/Locs.php:87 ../../Zotlabs/Module/Connedit.php:388
-#: ../../Zotlabs/Module/Filestorage.php:23
-#: ../../Zotlabs/Module/Filestorage.php:78
-#: ../../Zotlabs/Module/Filestorage.php:93
-#: ../../Zotlabs/Module/Filestorage.php:120
-#: ../../Zotlabs/Module/Settings.php:59 ../../Zotlabs/Module/Group.php:13
-#: ../../Zotlabs/Module/Block.php:26 ../../Zotlabs/Module/Block.php:76
-#: ../../Zotlabs/Module/Manage.php:10 ../../Zotlabs/Module/Mitem.php:115
-#: ../../Zotlabs/Module/Appman.php:81 ../../Zotlabs/Module/Mood.php:116
-#: ../../Zotlabs/Module/Profiles.php:198 ../../Zotlabs/Module/Profiles.php:636
-#: ../../Zotlabs/Module/Api.php:24 ../../Zotlabs/Module/Invite.php:17
-#: ../../Zotlabs/Module/Invite.php:94 ../../Zotlabs/Module/New_channel.php:77
-#: ../../Zotlabs/Module/New_channel.php:104 ../../Zotlabs/Module/Setup.php:212
-#: ../../Zotlabs/Module/Notifications.php:11 ../../Zotlabs/Module/Poke.php:137
-#: ../../Zotlabs/Module/Item.php:220 ../../Zotlabs/Module/Item.php:230
-#: ../../Zotlabs/Module/Item.php:1067 ../../Zotlabs/Module/Profile.php:70
-#: ../../Zotlabs/Module/Profile.php:87 ../../Zotlabs/Module/Blocks.php:73
-#: ../../Zotlabs/Module/Blocks.php:80 ../../Zotlabs/Module/Layouts.php:71
-#: ../../Zotlabs/Module/Layouts.php:78 ../../Zotlabs/Module/Layouts.php:89
-#: ../../Zotlabs/Module/Rate.php:113
-#: ../../Zotlabs/Module/Profile_photo.php:274
-#: ../../Zotlabs/Module/Profile_photo.php:287
-#: ../../Zotlabs/Module/Events.php:271 ../../Zotlabs/Module/Common.php:39
-#: ../../Zotlabs/Module/Channel.php:107 ../../Zotlabs/Module/Channel.php:237
-#: ../../Zotlabs/Module/Channel.php:277 ../../Zotlabs/Module/Regmod.php:21
-#: ../../Zotlabs/Module/Pdledit.php:29 ../../Zotlabs/Module/Message.php:18
-#: ../../Zotlabs/Module/Service_limits.php:11
-#: ../../Zotlabs/Module/Webpages.php:116
-#: ../../Zotlabs/Module/Sharedwithme.php:11 ../../Zotlabs/Module/Wiki.php:49
-#: ../../Zotlabs/Module/Wiki.php:214 ../../Zotlabs/Module/Wiki.php:313
-#: ../../Zotlabs/Module/Wiki.php:318 ../../Zotlabs/Module/Sources.php:74
-#: ../../Zotlabs/Module/Suggest.php:30 ../../Zotlabs/Module/Thing.php:274
-#: ../../Zotlabs/Module/Thing.php:294 ../../Zotlabs/Module/Thing.php:335
-#: ../../Zotlabs/Module/Mail.php:164
-#: ../../Zotlabs/Module/Viewconnections.php:28
-#: ../../Zotlabs/Module/Viewconnections.php:33
-#: ../../Zotlabs/Module/Viewsrc.php:18 ../../Zotlabs/Module/Chat.php:100
-#: ../../Zotlabs/Module/Chat.php:105 ../../Zotlabs/Lib/Chatroom.php:137
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:55
-#: ../../extend/addon/addon/keepout/keepout.php:36
-#: ../../extend/addon/addon/pumpio/pumpio.php:40
-#: ../../extend/addon/addon/openid/Mod_Id.php:53
-#: ../../extend/addon/addon/diaspora_reconnect/diaspora_reconnect.php:58
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:194
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:291
-#: ../../include/attach.php:144 ../../include/attach.php:191
-#: ../../include/attach.php:255 ../../include/attach.php:269
-#: ../../include/attach.php:276 ../../include/attach.php:343
-#: ../../include/attach.php:357 ../../include/attach.php:364
-#: ../../include/attach.php:441 ../../include/attach.php:908
-#: ../../include/attach.php:979 ../../include/attach.php:1137
-#: ../../include/photos.php:27 ../../include/items.php:3445
-msgid "Permission denied."
-msgstr "Permission refusée."
-
-#: ../../Zotlabs/Web/Router.php:152 ../../Zotlabs/Module/Display.php:124
-#: ../../Zotlabs/Module/Page.php:94 ../../Zotlabs/Module/Block.php:79
-#: ../../Zotlabs/Lib/NativeWikiPage.php:502 ../../include/help.php:66
-msgid "Page not found."
-msgstr "Page introuvable."
+#: ../../Zotlabs/Module/Profperm.php:34 ../../Zotlabs/Module/Profperm.php:63
+msgid "Invalid profile identifier."
+msgstr "Identifiant de profil invalide."
-#: ../../Zotlabs/Zot/Auth.php:138
-msgid ""
-"Remote authentication blocked. You are logged into this site locally. Please"
-" logout and retry."
-msgstr "Authentification distante bloquée. Vous êtes connecté(e) sur ce site localement. Merci de vous déconnecter et réessayer."
+#: ../../Zotlabs/Module/Profperm.php:111
+msgid "Profile Visibility Editor"
+msgstr "Éditeur de visibilité de profil"
-#: ../../Zotlabs/Zot/Auth.php:250
-#: ../../extend/addon/addon/openid/Mod_Openid.php:76
-#: ../../extend/addon/addon/openid/Mod_Openid.php:178
-#, php-format
-msgid "Welcome %s. Remote authentication successful."
-msgstr "Bienvenue %s. L'authentification distante a fonctionné."
+#: ../../Zotlabs/Module/Profperm.php:113 ../../include/channel.php:1360
+msgid "Profile"
+msgstr "Profil"
-#: ../../Zotlabs/Module/Achievements.php:15
-#: ../../Zotlabs/Module/Connect.php:17 ../../Zotlabs/Module/Editblock.php:31
-#: ../../Zotlabs/Module/Editlayout.php:31
-#: ../../Zotlabs/Module/Editwebpage.php:32
-#: ../../Zotlabs/Module/Filestorage.php:59 ../../Zotlabs/Module/Hcard.php:12
-#: ../../Zotlabs/Module/Profile.php:20 ../../Zotlabs/Module/Blocks.php:33
-#: ../../Zotlabs/Module/Layouts.php:31 ../../Zotlabs/Module/Webpages.php:33
-#: ../../include/channel.php:945
-msgid "Requested profile is not available."
-msgstr "Profil demandé non disponible."
+#: ../../Zotlabs/Module/Profperm.php:115
+msgid "Click on a contact to add or remove."
+msgstr "Cliquer sur un contact pour l'ajouter ou le retirer."
-#: ../../Zotlabs/Module/Achievements.php:38
-msgid "Some blurb about what to do when you're new here"
-msgstr "Quelques mots sur quoi faire quand on est nouveau ici"
+#: ../../Zotlabs/Module/Profperm.php:124
+msgid "Visible To"
+msgstr "Visible par"
-#: ../../Zotlabs/Module/Display.php:17 ../../Zotlabs/Module/Photos.php:508
-#: ../../Zotlabs/Module/Search.php:17 ../../Zotlabs/Module/Ratings.php:83
-#: ../../Zotlabs/Module/Directory.php:64
-#: ../../Zotlabs/Module/Viewconnections.php:23
-#: ../../extend/addon/addon/friendica/dfrn_request.php:794
-msgid "Public access denied."
-msgstr "Accès public refusé."
+#: ../../Zotlabs/Module/Profperm.php:140
+#: ../../Zotlabs/Module/Connections.php:141
+msgid "All Connections"
+msgstr "Tous les contacts"
-#: ../../Zotlabs/Module/Display.php:38 ../../Zotlabs/Module/Admin.php:60
-#: ../../Zotlabs/Module/Admin/Themes.php:69
-#: ../../Zotlabs/Module/Admin/Plugins.php:254
-#: ../../Zotlabs/Module/Filestorage.php:32 ../../Zotlabs/Module/Thing.php:89
-#: ../../Zotlabs/Module/Viewsrc.php:24 ../../include/items.php:3366
-msgid "Item not found."
-msgstr "Élément introuvable"
+#: ../../Zotlabs/Module/Regdir.php:49 ../../Zotlabs/Module/Dirsearch.php:25
+msgid "This site is not a directory server"
+msgstr "Ce site n'est pas un serveur d'annuaire"
-#: ../../Zotlabs/Module/Register.php:49
-msgid "Maximum daily site registrations exceeded. Please try again tomorrow."
-msgstr "Nombre d'inscriptions quotidiennes dépassé. Merci d'essayer à nouveau demain."
+#: ../../Zotlabs/Module/Channel.php:32 ../../Zotlabs/Module/Chat.php:25
+#: ../../addon/gitwiki/Mod_Gitwiki.php:28 ../../addon/chess/chess.php:403
+msgid "You must be logged in to see this page."
+msgstr "Vous devez vous connecter pour voir cette page."
-#: ../../Zotlabs/Module/Register.php:55
-msgid ""
-"Please indicate acceptance of the Terms of Service. Registration failed."
-msgstr "Merci d'indiquer votre adhésion aux conditions de service. L'inscription a échoué."
+#: ../../Zotlabs/Module/Channel.php:47 ../../Zotlabs/Module/Hcard.php:35
+#: ../../Zotlabs/Module/Profile.php:43
+msgid "Posts and comments"
+msgstr "Publications et commentaires"
-#: ../../Zotlabs/Module/Register.php:89
-msgid "Passwords do not match."
-msgstr "Les mots de passe ne concordent pas."
+#: ../../Zotlabs/Module/Channel.php:54 ../../Zotlabs/Module/Hcard.php:42
+#: ../../Zotlabs/Module/Profile.php:50
+msgid "Only posts"
+msgstr "Seulement les publications"
-#: ../../Zotlabs/Module/Register.php:131
-msgid ""
-"Registration successful. Please check your email for validation "
-"instructions."
-msgstr "Inscription réussie. Merci de vérifier vos courriels pour valider votre compte."
+#: ../../Zotlabs/Module/Channel.php:112
+msgid "Insufficient permissions. Request redirected to profile page."
+msgstr "Permissions insuffisantes. Demande redirigée vers la page du profil."
-#: ../../Zotlabs/Module/Register.php:137
-msgid "Your registration is pending approval by the site owner."
-msgstr "Votre inscription est en attente d'approbation par l'administrateur."
+#: ../../Zotlabs/Module/Uexport.php:57 ../../Zotlabs/Module/Uexport.php:58
+msgid "Export Channel"
+msgstr "Exporter le canal"
-#: ../../Zotlabs/Module/Register.php:140
-msgid "Your registration can not be processed."
-msgstr "Votre inscription ne peut être traîtée."
+#: ../../Zotlabs/Module/Uexport.php:59
+msgid ""
+"Export your basic channel information to a file. This acts as a backup of "
+"your connections, permissions, profile and basic data, which can be used to "
+"import your data to a new server hub, but does not contain your content."
+msgstr "Exportez les principales informations de votre canal dans un fichier. Celui-ci pourra servir de sauvegarde de vos contacts, permissions, profils et données de base. Il pourra être importé sur un nouveau hub/serveur, mais n'embarquera pas vos contenus."
-#: ../../Zotlabs/Module/Register.php:184
-msgid "Registration on this hub is disabled."
-msgstr "La création de nouveaux comptes est désactivée pour ce site."
+#: ../../Zotlabs/Module/Uexport.php:60
+msgid "Export Content"
+msgstr "Exporter le contenu"
-#: ../../Zotlabs/Module/Register.php:193
-msgid "Registration on this hub is by approval only."
-msgstr "La création de compte sur ce site est soumise à approbation."
+#: ../../Zotlabs/Module/Uexport.php:61
+msgid ""
+"Export your channel information and recent content to a JSON backup that can"
+" be restored or imported to another server hub. This backs up all of your "
+"connections, permissions, profile data and several months of posts. This "
+"file may be VERY large. Please be patient - it may take several minutes for"
+" this download to begin."
+msgstr "Exportez les informations du canal et les contenus récents dans un fichier JSON. Celui-ci contiendra toutes vos relations, permissions, profils, et plusieurs mois de publications. Ce fichier peut être TRÈS gros. Armez-vous de patience - plusieurs minutes peuvent s'écouler avant que le téléchargement ne commence."
-#: ../../Zotlabs/Module/Register.php:194
-msgid "<a href=\"pubsites\">Register at another affiliated hub.</a>"
-msgstr "<a href=\"pubsites\">S'enregistrer sur un autre site du réseau.</a>"
+#: ../../Zotlabs/Module/Uexport.php:63
+msgid "Export your posts from a given year."
+msgstr "Exporter vos publications d'une année en particulier"
-#: ../../Zotlabs/Module/Register.php:204
+#: ../../Zotlabs/Module/Uexport.php:65
msgid ""
-"This site has exceeded the number of allowed daily account registrations. "
-"Please try again tomorrow."
-msgstr "Ce site a dépassé le nombre de création de comptes autorisé chaque jour. Merci d'essayer à nouveau demain."
-
-#: ../../Zotlabs/Module/Register.php:221 ../../Zotlabs/Module/Siteinfo.php:27
-msgid "Terms of Service"
-msgstr "Conditions de service"
+"You may also export your posts and conversations for a particular year or "
+"month. Adjust the date in your browser location bar to select other dates. "
+"If the export fails (possibly due to memory exhaustion on your server hub), "
+"please try again selecting a more limited date range."
+msgstr "Vous pouvez également exporter vos publications et conversations pour une année ou un mois particulier. Ajustez la date dans la barre de votre navigateur pour sélectionner d'autres dates. Si l'export échoue (possible en cas de pénurie de mémoire sur le serveur de votre hub), essayez à nouveau en sélectionnant un intervalle de dates plus petit."
-#: ../../Zotlabs/Module/Register.php:227
+#: ../../Zotlabs/Module/Uexport.php:66
#, php-format
-msgid "I accept the %s for this website"
-msgstr "J'accepte les %s de ce site"
+msgid ""
+"To select all posts for a given year, such as this year, visit <a "
+"href=\"%1$s\">%2$s</a>"
+msgstr "Pour sélectionner toutes les publications pour une année donnée, telle que cette année, visitez <a href=\"%1$s\">%2$s</a>"
-#: ../../Zotlabs/Module/Register.php:229
+#: ../../Zotlabs/Module/Uexport.php:67
#, php-format
-msgid "I am over 13 years of age and accept the %s for this website"
-msgstr "J'ai plus de 13 ans et j'accepte les %s de ce site"
+msgid ""
+"To select all posts for a given month, such as January of this year, visit "
+"<a href=\"%1$s\">%2$s</a>"
+msgstr "Pour sélectionner toutes les publications pour un mois donné, par exemple janvier, visitez <a href=\"%1$s\">%2$s</a>"
-#: ../../Zotlabs/Module/Register.php:233
-msgid "Your email address"
-msgstr "Votre adresse de courriel"
+#: ../../Zotlabs/Module/Uexport.php:68
+#, php-format
+msgid ""
+"These content files may be imported or restored by visiting <a "
+"href=\"%1$s\">%2$s</a> on any site containing your channel. For best results"
+" please import or restore these in date order (oldest first)."
+msgstr "Ces fichiers de contenu peuvent être importés ou restaurés en visitant <a href=\"%1$s\">%2$s</a> sur n'importe quel site hébergeant votre canal. Pour de meilleurs résultats merci de les importer par ordre chronologique (les plus anciens d'abord)."
-#: ../../Zotlabs/Module/Register.php:234
-msgid "Choose a password"
-msgstr "Choisissez un mot de passe"
+#: ../../Zotlabs/Module/Search.php:17 ../../Zotlabs/Module/Photos.php:490
+#: ../../Zotlabs/Module/Ratings.php:83 ../../Zotlabs/Module/Directory.php:63
+#: ../../Zotlabs/Module/Display.php:22
+#: ../../Zotlabs/Module/Viewconnections.php:23
+msgid "Public access denied."
+msgstr "Accès public refusé."
-#: ../../Zotlabs/Module/Register.php:235
-msgid "Please re-enter your password"
-msgstr "Merci de saisir à nouveau votre mot de passe"
+#: ../../Zotlabs/Module/Search.php:44 ../../Zotlabs/Module/Connections.php:312
+#: ../../Zotlabs/Lib/Apps.php:237 ../../Zotlabs/Widget/Sitesearch.php:31
+#: ../../include/text.php:1027 ../../include/text.php:1039
+#: ../../include/acl_selectors.php:213 ../../include/nav.php:160
+msgid "Search"
+msgstr "Recherche"
-#: ../../Zotlabs/Module/Register.php:236
-msgid "Please enter your invitation code"
-msgstr "Merci de saisir votre code d'invitation"
+#: ../../Zotlabs/Module/Search.php:224
+#, php-format
+msgid "Items tagged with: %s"
+msgstr "Eléments étiquetés avec&nbsp;: %s"
-#: ../../Zotlabs/Module/Register.php:237
-#: ../../Zotlabs/Module/New_channel.php:134
-msgid "Name or caption"
-msgstr "Nom ou libellé"
+#: ../../Zotlabs/Module/Search.php:226
+#, php-format
+msgid "Search results for: %s"
+msgstr "Résultats de recherche pour&nbsp;: %s"
-#: ../../Zotlabs/Module/Register.php:237
-#: ../../Zotlabs/Module/New_channel.php:134
-msgid "Examples: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \"Aviation Group\""
-msgstr "Exemples&nbsp;: \"Jérôme Dutilleul\", \"Louise et ses chevaux\", \"Football\", \"Club d'aéromodélisme\""
+#: ../../Zotlabs/Module/Locs.php:25 ../../Zotlabs/Module/Locs.php:54
+msgid "Location not found."
+msgstr "Emplacement introuvable."
-#: ../../Zotlabs/Module/Register.php:239
-#: ../../Zotlabs/Module/New_channel.php:136
-msgid "Choose a short nickname"
-msgstr "Choisissez un alias"
+#: ../../Zotlabs/Module/Locs.php:62
+msgid "Location lookup failed."
+msgstr "Echec de la recherche de l'emplacement."
-#: ../../Zotlabs/Module/Register.php:239
-#: ../../Zotlabs/Module/New_channel.php:136
-#, php-format
+#: ../../Zotlabs/Module/Locs.php:66
msgid ""
-"Your nickname will be used to create an easy to remember channel address "
-"e.g. nickname%s"
-msgstr "Votre pseudo sera utilisé pour créer une adresse de canal facile à mémoriser, par ex. pseudo%s"
-
-#: ../../Zotlabs/Module/Register.php:240
-#: ../../Zotlabs/Module/New_channel.php:137
-msgid "Channel role and privacy"
-msgstr "Rôle et confidentialité du canal"
-
-#: ../../Zotlabs/Module/Register.php:240
-#: ../../Zotlabs/Module/New_channel.php:137
-msgid "Select a channel role with your privacy requirements."
-msgstr "Sélectionner un rôle de canal adapté à vos besoins de confidentialité."
+"Please select another location to become primary before removing the primary"
+" location."
+msgstr "Merci de sélectionner un autre emplacement comme nouvel emplacement primaire avant de supprimer l'emplacement primaire actuel."
-#: ../../Zotlabs/Module/Register.php:240
-#: ../../Zotlabs/Module/New_channel.php:137
-msgid "Read more about roles"
-msgstr "En savoir plus sur les rôles"
+#: ../../Zotlabs/Module/Locs.php:95
+msgid "Syncing locations"
+msgstr "Synchronisation des emplacements"
-#: ../../Zotlabs/Module/Register.php:241
-msgid "no"
-msgstr "non"
+#: ../../Zotlabs/Module/Locs.php:105
+msgid "No locations found."
+msgstr "Emplacement(s) introuvable."
-#: ../../Zotlabs/Module/Register.php:241
-msgid "yes"
-msgstr "oui"
+#: ../../Zotlabs/Module/Locs.php:116
+msgid "Manage Channel Locations"
+msgstr "Gérer les emplacements des canaux"
-#: ../../Zotlabs/Module/Register.php:253
-#: ../../Zotlabs/Module/Admin/Site.php:261
-msgid "Registration"
-msgstr "Inscription"
+#: ../../Zotlabs/Module/Locs.php:117 ../../Zotlabs/Module/Events.php:475
+#: ../../Zotlabs/Module/Profiles.php:509 ../../Zotlabs/Module/Profiles.php:737
+#: ../../Zotlabs/Module/Pubsites.php:51 ../../addon/cdav/Mod_Cdav.php:839
+#: ../../include/js_strings.php:25
+msgid "Location"
+msgstr "Emplacement"
-#: ../../Zotlabs/Module/Register.php:258
-msgid "Membership on this site is by invitation only."
-msgstr "L'inscription à ce site se fait uniquement sur invitation."
+#: ../../Zotlabs/Module/Locs.php:118
+#: ../../Zotlabs/Module/Admin/Channels.php:160
+#: ../../Zotlabs/Module/Connedit.php:917 ../../Zotlabs/Module/Profiles.php:502
+#: ../../Zotlabs/Module/Profiles.php:793 ../../addon/cdav/Mod_Cdav.php:1143
+msgid "Address"
+msgstr "Adresse"
-#: ../../Zotlabs/Module/Register.php:270 ../../include/nav.php:162
-#: ../../boot.php:1713
-msgid "Register"
-msgstr "S'inscrire"
+#: ../../Zotlabs/Module/Locs.php:119
+msgid "Primary"
+msgstr "Primaire"
-#: ../../Zotlabs/Module/Register.php:271
-msgid ""
-"This site may require email verification after submitting this form. If you "
-"are returned to a login page, please check your email for instructions."
-msgstr "Ce site peut demander une validation de votre email. Si vous revenez sur le formulaire de connexion, vérifiez vos emails et suivez les instructions. Regardez aussi les spams."
+#: ../../Zotlabs/Module/Locs.php:120 ../../Zotlabs/Module/Menu.php:113
+msgid "Drop"
+msgstr "Supprimer"
-#: ../../Zotlabs/Module/Probe.php:28 ../../Zotlabs/Module/Probe.php:32
-#, php-format
-msgid "Fetching URL returns error: %1$s"
-msgstr "Récupération d'URL échouée&nbsp;: %1$s"
+#: ../../Zotlabs/Module/Locs.php:122
+msgid "Sync Now"
+msgstr "Synchronisez maintenant"
-#: ../../Zotlabs/Module/Photos.php:82
-msgid "Page owner information could not be retrieved."
-msgstr "Impossible d'obtenir des informations sur le propriétaire de la page."
+#: ../../Zotlabs/Module/Locs.php:123
+msgid "Please wait several minutes between consecutive operations."
+msgstr "Merci d'attendre plusieurs minutes entre opérations successives."
-#: ../../Zotlabs/Module/Photos.php:97 ../../Zotlabs/Module/Photos.php:729
-#: ../../Zotlabs/Module/Profile_photo.php:115
-#: ../../Zotlabs/Module/Profile_photo.php:220
-#: ../../include/photo/photo_driver.php:730
-msgid "Profile Photos"
-msgstr "Photos du profil"
+#: ../../Zotlabs/Module/Locs.php:124
+msgid ""
+"When possible, drop a location by logging into that website/hub and removing"
+" your channel."
+msgstr "Quand c'est possible, abandonnez un emplacement en vous connectant sur le site/hub et en supprimant votre canal."
-#: ../../Zotlabs/Module/Photos.php:103 ../../Zotlabs/Module/Photos.php:129
-msgid "Album not found."
-msgstr "Album introuvable."
+#: ../../Zotlabs/Module/Locs.php:125
+msgid "Use this form to drop the location if the hub is no longer operating."
+msgstr "Utilisez ce formulaire pour abandonner l'emplacement si le hub n'est plus actif."
-#: ../../Zotlabs/Module/Photos.php:112
-msgid "Delete Album"
-msgstr "Supprimer l'album"
+#: ../../Zotlabs/Module/Mitem.php:28 ../../Zotlabs/Module/Menu.php:144
+msgid "Menu not found."
+msgstr "Menu introuvable."
-#: ../../Zotlabs/Module/Photos.php:133
-msgid ""
-"Multiple storage folders exist with this album name, but within different "
-"directories. Please remove the desired folder or folders using the Files "
-"manager"
-msgstr "Plusieurs dossiers de stockage existent avec ce nom d'album, mais dans différents répertoires. Veuillez supprimer le ou les dossier(s) désiré(s) à l'aide du Gestionnaire de fichiers."
+#: ../../Zotlabs/Module/Mitem.php:52
+msgid "Unable to create element."
+msgstr "Impossible de créer l'entrée."
-#: ../../Zotlabs/Module/Photos.php:190 ../../Zotlabs/Module/Photos.php:1054
-msgid "Delete Photo"
-msgstr "Supprimer la photo"
+#: ../../Zotlabs/Module/Mitem.php:76
+msgid "Unable to update menu element."
+msgstr "Impossible de mettre à jour l'entrée de menu."
-#: ../../Zotlabs/Module/Photos.php:519
-msgid "No photos selected"
-msgstr "Aucune photo selectionnée"
+#: ../../Zotlabs/Module/Mitem.php:92
+msgid "Unable to add menu element."
+msgstr "Impossible d'ajouter l'entrée de menu."
-#: ../../Zotlabs/Module/Photos.php:568
-msgid "Access to this item is restricted."
-msgstr "L'accès à l'élément est restreint."
+#: ../../Zotlabs/Module/Mitem.php:120 ../../Zotlabs/Module/Menu.php:166
+#: ../../Zotlabs/Module/Xchan.php:41
+msgid "Not found."
+msgstr "Introuvable."
-#: ../../Zotlabs/Module/Photos.php:607
-#, php-format
-msgid "%1$.2f MB of %2$.2f MB photo storage used."
-msgstr "Vous avez utilisé %1$.2f mégaoctets sur les %2$.2f autorisés pour le stockage des photos."
+#: ../../Zotlabs/Module/Mitem.php:153 ../../Zotlabs/Module/Mitem.php:230
+msgid "Menu Item Permissions"
+msgstr "Permissions de l'entrée de menu"
-#: ../../Zotlabs/Module/Photos.php:610
-#, php-format
-msgid "%1$.2f MB photo storage used."
-msgstr "%1$.2f méga-octets utilisés pour le stockage des photos."
+#: ../../Zotlabs/Module/Mitem.php:154 ../../Zotlabs/Module/Mitem.php:231
+#: ../../Zotlabs/Module/Settings/Channel.php:510
+msgid "(click to open/close)"
+msgstr "(cliquer pour ouvrir/fermer)"
-#: ../../Zotlabs/Module/Photos.php:646
-msgid "Upload Photos"
-msgstr "Téléverser des photos"
+#: ../../Zotlabs/Module/Mitem.php:160 ../../Zotlabs/Module/Mitem.php:176
+msgid "Link Name"
+msgstr "Nom du lien"
-#: ../../Zotlabs/Module/Photos.php:650
-msgid "Enter an album name"
-msgstr "Entrer un nom d'album"
+#: ../../Zotlabs/Module/Mitem.php:161 ../../Zotlabs/Module/Mitem.php:239
+msgid "Link or Submenu Target"
+msgstr "Lien ou sous-menu cible"
-#: ../../Zotlabs/Module/Photos.php:651
-msgid "or select an existing album (doubleclick)"
-msgstr "ou sélectionner un album existant (double-clic)"
+#: ../../Zotlabs/Module/Mitem.php:161
+msgid "Enter URL of the link or select a menu name to create a submenu"
+msgstr "Entrez l'URL du lien ou sélectionnez un nom de menu pour créer un sous-menu"
-#: ../../Zotlabs/Module/Photos.php:652
-msgid "Create a status post for this upload"
-msgstr "Créer une publication de statut pour cet envoi"
+#: ../../Zotlabs/Module/Mitem.php:162 ../../Zotlabs/Module/Mitem.php:240
+msgid "Use magic-auth if available"
+msgstr "Utiliser l'authentification distante, quand disponible"
-#: ../../Zotlabs/Module/Photos.php:652 ../../Zotlabs/Module/Admin/Site.php:218
-#: ../../Zotlabs/Module/Menu.php:100 ../../Zotlabs/Module/Menu.php:157
-#: ../../Zotlabs/Module/Connedit.php:402 ../../Zotlabs/Module/Connedit.php:740
-#: ../../Zotlabs/Module/Filestorage.php:160
-#: ../../Zotlabs/Module/Filestorage.php:168 ../../Zotlabs/Module/Mitem.php:162
-#: ../../Zotlabs/Module/Mitem.php:163 ../../Zotlabs/Module/Mitem.php:240
-#: ../../Zotlabs/Module/Mitem.php:241 ../../Zotlabs/Module/Profiles.php:682
-#: ../../Zotlabs/Module/Api.php:97 ../../Zotlabs/Module/Events.php:470
-#: ../../Zotlabs/Module/Events.php:471 ../../Zotlabs/Module/Removeme.php:63
-#: ../../Zotlabs/Module/Wiki.php:178
+#: ../../Zotlabs/Module/Mitem.php:162 ../../Zotlabs/Module/Mitem.php:163
+#: ../../Zotlabs/Module/Mitem.php:240 ../../Zotlabs/Module/Mitem.php:241
+#: ../../Zotlabs/Module/Events.php:470 ../../Zotlabs/Module/Events.php:471
+#: ../../Zotlabs/Module/Removeme.php:63
+#: ../../Zotlabs/Module/Admin/Site.php:237
#: ../../Zotlabs/Module/Settings/Channel.php:294
#: ../../Zotlabs/Module/Settings/Display.php:103
-#: ../../extend/addon/addon/dwpost/dwpost.php:73
-#: ../../extend/addon/addon/dwpost/dwpost.php:85
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:120
-#: ../../extend/addon/addon/friendica/dfrn_request.php:865
-#: ../../extend/addon/addon/ijpost/ijpost.php:73
-#: ../../extend/addon/addon/ijpost/ijpost.php:85
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:309
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:313
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:343
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:351
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:355
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:359
-#: ../../extend/addon/addon/libertree/libertree.php:69
-#: ../../extend/addon/addon/libertree/libertree.php:81
-#: ../../extend/addon/addon/ljpost/ljpost.php:70
-#: ../../extend/addon/addon/ljpost/ljpost.php:82
-#: ../../extend/addon/addon/nofed/nofed.php:72
-#: ../../extend/addon/addon/nofed/nofed.php:76
-#: ../../extend/addon/addon/nsabait/nsabait.php:157
-#: ../../extend/addon/addon/nsfw/nsfw.php:84
-#: ../../extend/addon/addon/planets/planets.php:153
-#: ../../extend/addon/addon/pumpio/pumpio.php:219
-#: ../../extend/addon/addon/pumpio/pumpio.php:223
-#: ../../extend/addon/addon/pumpio/pumpio.php:227
-#: ../../extend/addon/addon/pumpio/pumpio.php:231
-#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:81
-#: ../../extend/addon/addon/redred/redred.php:95
-#: ../../extend/addon/addon/redred/redred.php:99
-#: ../../extend/addon/addon/rtof/rtof.php:81
-#: ../../extend/addon/addon/rtof/rtof.php:85
-#: ../../extend/addon/addon/smileybutton/smileybutton.php:273
-#: ../../extend/addon/addon/smileybutton/smileybutton.php:277
-#: ../../extend/addon/addon/statusnet/statusnet.php:389
-#: ../../extend/addon/addon/statusnet/statusnet.php:411
-#: ../../extend/addon/addon/statusnet/statusnet.php:415
-#: ../../extend/addon/addon/statusnet/statusnet.php:424
-#: ../../extend/addon/addon/twitter/twitter.php:242
-#: ../../extend/addon/addon/twitter/twitter.php:246
-#: ../../extend/addon/addon/twitter/twitter.php:255
-#: ../../extend/addon/addon/visage/visage.php:166
-#: ../../extend/addon/addon/wppost/wppost.php:82
-#: ../../extend/addon/addon/wppost/wppost.php:105
-#: ../../extend/addon/addon/wppost/wppost.php:109
-#: ../../extend/addon/addon/xmpp/xmpp.php:53
-#: ../../extend/addon/addon/cdav/cdav.php:234
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:164
+#: ../../Zotlabs/Module/Api.php:97 ../../Zotlabs/Module/Photos.php:642
+#: ../../Zotlabs/Module/Wiki.php:180 ../../Zotlabs/Module/Connedit.php:399
+#: ../../Zotlabs/Module/Connedit.php:783 ../../Zotlabs/Module/Menu.php:100
+#: ../../Zotlabs/Module/Menu.php:157 ../../Zotlabs/Module/Profiles.php:681
+#: ../../Zotlabs/Module/Filestorage.php:160
+#: ../../Zotlabs/Module/Filestorage.php:168 ../../boot.php:1635
+#: ../../view/theme/redbasic/php/config.php:89
+#: ../../view/theme/redbasic/php/config.php:104 ../../addon/cdav/cdav.php:234
+#: ../../addon/planets/planets.php:153 ../../addon/wppost/wppost.php:82
+#: ../../addon/wppost/wppost.php:105 ../../addon/wppost/wppost.php:109
+#: ../../addon/nsfw/nsfw.php:84 ../../addon/ijpost/ijpost.php:73
+#: ../../addon/ijpost/ijpost.php:85 ../../addon/dwpost/dwpost.php:73
+#: ../../addon/dwpost/dwpost.php:85 ../../addon/ljpost/ljpost.php:70
+#: ../../addon/ljpost/ljpost.php:82 ../../addon/gitwiki/Mod_Gitwiki.php:166
+#: ../../addon/rainbowtag/rainbowtag.php:81 ../../addon/visage/visage.php:166
+#: ../../addon/nsabait/nsabait.php:157 ../../addon/rtof/rtof.php:81
+#: ../../addon/rtof/rtof.php:85 ../../addon/jappixmini/jappixmini.php:309
+#: ../../addon/jappixmini/jappixmini.php:313
+#: ../../addon/jappixmini/jappixmini.php:343
+#: ../../addon/jappixmini/jappixmini.php:351
+#: ../../addon/jappixmini/jappixmini.php:355
+#: ../../addon/jappixmini/jappixmini.php:359 ../../addon/nofed/nofed.php:72
+#: ../../addon/nofed/nofed.php:76 ../../addon/redred/redred.php:95
+#: ../../addon/redred/redred.php:99 ../../addon/libertree/libertree.php:69
+#: ../../addon/libertree/libertree.php:81
+#: ../../addon/flattrwidget/flattrwidget.php:120
+#: ../../addon/statusnet/statusnet.php:389
+#: ../../addon/statusnet/statusnet.php:411
+#: ../../addon/statusnet/statusnet.php:415
+#: ../../addon/statusnet/statusnet.php:424 ../../addon/twitter/twitter.php:242
+#: ../../addon/twitter/twitter.php:246 ../../addon/twitter/twitter.php:255
+#: ../../addon/smileybutton/smileybutton.php:273
+#: ../../addon/smileybutton/smileybutton.php:277 ../../addon/xmpp/xmpp.php:53
+#: ../../addon/pumpio/pumpio.php:219 ../../addon/pumpio/pumpio.php:223
+#: ../../addon/pumpio/pumpio.php:227 ../../addon/pumpio/pumpio.php:231
#: ../../include/dir_fns.php:143 ../../include/dir_fns.php:144
-#: ../../include/dir_fns.php:145 ../../view/theme/redbasic/php/config.php:111
-#: ../../view/theme/redbasic/php/config.php:136 ../../boot.php:1736
+#: ../../include/dir_fns.php:145
msgid "No"
msgstr "Non"
-#: ../../Zotlabs/Module/Photos.php:652 ../../Zotlabs/Module/Admin/Site.php:220
-#: ../../Zotlabs/Module/Menu.php:100 ../../Zotlabs/Module/Menu.php:157
-#: ../../Zotlabs/Module/Connedit.php:402
-#: ../../Zotlabs/Module/Filestorage.php:160
-#: ../../Zotlabs/Module/Filestorage.php:168 ../../Zotlabs/Module/Mitem.php:162
-#: ../../Zotlabs/Module/Mitem.php:163 ../../Zotlabs/Module/Mitem.php:240
-#: ../../Zotlabs/Module/Mitem.php:241 ../../Zotlabs/Module/Profiles.php:682
-#: ../../Zotlabs/Module/Api.php:96 ../../Zotlabs/Module/Events.php:470
-#: ../../Zotlabs/Module/Events.php:471 ../../Zotlabs/Module/Removeme.php:63
-#: ../../Zotlabs/Module/Wiki.php:178
+#: ../../Zotlabs/Module/Mitem.php:162 ../../Zotlabs/Module/Mitem.php:163
+#: ../../Zotlabs/Module/Mitem.php:240 ../../Zotlabs/Module/Mitem.php:241
+#: ../../Zotlabs/Module/Events.php:470 ../../Zotlabs/Module/Events.php:471
+#: ../../Zotlabs/Module/Removeme.php:63
+#: ../../Zotlabs/Module/Admin/Site.php:239
#: ../../Zotlabs/Module/Settings/Channel.php:294
#: ../../Zotlabs/Module/Settings/Display.php:103
-#: ../../extend/addon/addon/dwpost/dwpost.php:73
-#: ../../extend/addon/addon/dwpost/dwpost.php:85
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:120
-#: ../../extend/addon/addon/friendica/dfrn_request.php:865
-#: ../../extend/addon/addon/ijpost/ijpost.php:73
-#: ../../extend/addon/addon/ijpost/ijpost.php:85
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:309
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:313
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:343
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:351
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:355
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:359
-#: ../../extend/addon/addon/libertree/libertree.php:69
-#: ../../extend/addon/addon/libertree/libertree.php:81
-#: ../../extend/addon/addon/ljpost/ljpost.php:70
-#: ../../extend/addon/addon/ljpost/ljpost.php:82
-#: ../../extend/addon/addon/nofed/nofed.php:72
-#: ../../extend/addon/addon/nofed/nofed.php:76
-#: ../../extend/addon/addon/nsabait/nsabait.php:157
-#: ../../extend/addon/addon/nsfw/nsfw.php:84
-#: ../../extend/addon/addon/planets/planets.php:153
-#: ../../extend/addon/addon/pumpio/pumpio.php:219
-#: ../../extend/addon/addon/pumpio/pumpio.php:223
-#: ../../extend/addon/addon/pumpio/pumpio.php:227
-#: ../../extend/addon/addon/pumpio/pumpio.php:231
-#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:81
-#: ../../extend/addon/addon/redred/redred.php:95
-#: ../../extend/addon/addon/redred/redred.php:99
-#: ../../extend/addon/addon/rtof/rtof.php:81
-#: ../../extend/addon/addon/rtof/rtof.php:85
-#: ../../extend/addon/addon/smileybutton/smileybutton.php:273
-#: ../../extend/addon/addon/smileybutton/smileybutton.php:277
-#: ../../extend/addon/addon/statusnet/statusnet.php:389
-#: ../../extend/addon/addon/statusnet/statusnet.php:411
-#: ../../extend/addon/addon/statusnet/statusnet.php:415
-#: ../../extend/addon/addon/statusnet/statusnet.php:424
-#: ../../extend/addon/addon/twitter/twitter.php:242
-#: ../../extend/addon/addon/twitter/twitter.php:246
-#: ../../extend/addon/addon/twitter/twitter.php:255
-#: ../../extend/addon/addon/visage/visage.php:166
-#: ../../extend/addon/addon/wppost/wppost.php:82
-#: ../../extend/addon/addon/wppost/wppost.php:105
-#: ../../extend/addon/addon/wppost/wppost.php:109
-#: ../../extend/addon/addon/xmpp/xmpp.php:53
-#: ../../extend/addon/addon/cdav/cdav.php:234
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:164
+#: ../../Zotlabs/Module/Api.php:96 ../../Zotlabs/Module/Photos.php:642
+#: ../../Zotlabs/Module/Wiki.php:180 ../../Zotlabs/Module/Connedit.php:399
+#: ../../Zotlabs/Module/Menu.php:100 ../../Zotlabs/Module/Menu.php:157
+#: ../../Zotlabs/Module/Profiles.php:681
+#: ../../Zotlabs/Module/Filestorage.php:160
+#: ../../Zotlabs/Module/Filestorage.php:168 ../../boot.php:1635
+#: ../../view/theme/redbasic/php/config.php:89
+#: ../../view/theme/redbasic/php/config.php:104 ../../addon/cdav/cdav.php:234
+#: ../../addon/planets/planets.php:153 ../../addon/wppost/wppost.php:82
+#: ../../addon/wppost/wppost.php:105 ../../addon/wppost/wppost.php:109
+#: ../../addon/nsfw/nsfw.php:84 ../../addon/ijpost/ijpost.php:73
+#: ../../addon/ijpost/ijpost.php:85 ../../addon/dwpost/dwpost.php:73
+#: ../../addon/dwpost/dwpost.php:85 ../../addon/ljpost/ljpost.php:70
+#: ../../addon/ljpost/ljpost.php:82 ../../addon/gitwiki/Mod_Gitwiki.php:166
+#: ../../addon/rainbowtag/rainbowtag.php:81 ../../addon/visage/visage.php:166
+#: ../../addon/nsabait/nsabait.php:157 ../../addon/rtof/rtof.php:81
+#: ../../addon/rtof/rtof.php:85 ../../addon/jappixmini/jappixmini.php:309
+#: ../../addon/jappixmini/jappixmini.php:313
+#: ../../addon/jappixmini/jappixmini.php:343
+#: ../../addon/jappixmini/jappixmini.php:351
+#: ../../addon/jappixmini/jappixmini.php:355
+#: ../../addon/jappixmini/jappixmini.php:359 ../../addon/nofed/nofed.php:72
+#: ../../addon/nofed/nofed.php:76 ../../addon/redred/redred.php:95
+#: ../../addon/redred/redred.php:99 ../../addon/libertree/libertree.php:69
+#: ../../addon/libertree/libertree.php:81
+#: ../../addon/flattrwidget/flattrwidget.php:120
+#: ../../addon/statusnet/statusnet.php:389
+#: ../../addon/statusnet/statusnet.php:411
+#: ../../addon/statusnet/statusnet.php:415
+#: ../../addon/statusnet/statusnet.php:424 ../../addon/twitter/twitter.php:242
+#: ../../addon/twitter/twitter.php:246 ../../addon/twitter/twitter.php:255
+#: ../../addon/smileybutton/smileybutton.php:273
+#: ../../addon/smileybutton/smileybutton.php:277 ../../addon/xmpp/xmpp.php:53
+#: ../../addon/pumpio/pumpio.php:219 ../../addon/pumpio/pumpio.php:223
+#: ../../addon/pumpio/pumpio.php:227 ../../addon/pumpio/pumpio.php:231
#: ../../include/dir_fns.php:143 ../../include/dir_fns.php:144
-#: ../../include/dir_fns.php:145 ../../view/theme/redbasic/php/config.php:111
-#: ../../view/theme/redbasic/php/config.php:136 ../../boot.php:1736
+#: ../../include/dir_fns.php:145
msgid "Yes"
msgstr "Oui"
-#: ../../Zotlabs/Module/Photos.php:653
-msgid "Caption (optional):"
-msgstr "Légende (facultative)"
+#: ../../Zotlabs/Module/Mitem.php:163 ../../Zotlabs/Module/Mitem.php:241
+msgid "Open link in new window"
+msgstr "Ouvrir le lien dans une nouvelle fenêtre"
-#: ../../Zotlabs/Module/Photos.php:654
-msgid "Description (optional):"
-msgstr "Description (facultative)"
+#: ../../Zotlabs/Module/Mitem.php:164 ../../Zotlabs/Module/Mitem.php:242
+msgid "Order in list"
+msgstr "Ordre dans la liste"
-#: ../../Zotlabs/Module/Photos.php:657 ../../Zotlabs/Module/Photos.php:1042
-#: ../../Zotlabs/Module/Connedit.php:637
-#: ../../Zotlabs/Module/Filestorage.php:152 ../../Zotlabs/Module/Thing.php:313
-#: ../../Zotlabs/Module/Thing.php:363 ../../Zotlabs/Module/Chat.php:234
-#: ../../include/acl_selectors.php:218
-msgid "Permissions"
-msgstr "Autorisations"
+#: ../../Zotlabs/Module/Mitem.php:164 ../../Zotlabs/Module/Mitem.php:242
+msgid "Higher numbers will sink to bottom of listing"
+msgstr "Les nombres les plus élevés seront au bas de la liste"
-#: ../../Zotlabs/Module/Photos.php:667 ../../Zotlabs/Module/Photos.php:1053
-#: ../../Zotlabs/Module/Photos.php:1093 ../../Zotlabs/Module/Photos.php:1211
-#: ../../Zotlabs/Module/Connect.php:98
-#: ../../Zotlabs/Module/Admin/Features.php:66
-#: ../../Zotlabs/Module/Admin/Logs.php:84
-#: ../../Zotlabs/Module/Admin/Profs.php:157
-#: ../../Zotlabs/Module/Admin/Security.php:104
-#: ../../Zotlabs/Module/Admin/Themes.php:156
-#: ../../Zotlabs/Module/Admin/Account_edit.php:74
-#: ../../Zotlabs/Module/Admin/Accounts.php:166
-#: ../../Zotlabs/Module/Admin/Channels.php:147
-#: ../../Zotlabs/Module/Admin/Site.php:260
-#: ../../Zotlabs/Module/Admin/Plugins.php:433
-#: ../../Zotlabs/Module/Locs.php:121 ../../Zotlabs/Module/Connedit.php:847
-#: ../../Zotlabs/Module/Filestorage.php:165 ../../Zotlabs/Module/Cal.php:342
-#: ../../Zotlabs/Module/Group.php:85 ../../Zotlabs/Module/Import_items.php:122
-#: ../../Zotlabs/Module/Import.php:507 ../../Zotlabs/Module/Mitem.php:243
-#: ../../Zotlabs/Module/Appman.php:133 ../../Zotlabs/Module/Mood.php:139
-#: ../../Zotlabs/Module/Profiles.php:722 ../../Zotlabs/Module/Invite.php:149
-#: ../../Zotlabs/Module/Setup.php:309 ../../Zotlabs/Module/Setup.php:357
-#: ../../Zotlabs/Module/Poke.php:186 ../../Zotlabs/Module/Pconfig.php:107
-#: ../../Zotlabs/Module/Rate.php:166 ../../Zotlabs/Module/Events.php:493
-#: ../../Zotlabs/Module/Pdledit.php:74 ../../Zotlabs/Module/Wiki.php:167
-#: ../../Zotlabs/Module/Sources.php:114 ../../Zotlabs/Module/Sources.php:149
-#: ../../Zotlabs/Module/Settings/Features.php:47
-#: ../../Zotlabs/Module/Settings/Oauth.php:87
-#: ../../Zotlabs/Module/Settings/Account.php:118
-#: ../../Zotlabs/Module/Settings/Tokens.php:168
-#: ../../Zotlabs/Module/Settings/Featured.php:50
-#: ../../Zotlabs/Module/Settings/Channel.php:476
-#: ../../Zotlabs/Module/Settings/Display.php:196
-#: ../../Zotlabs/Module/Settings/Permcats.php:112
-#: ../../Zotlabs/Module/Thing.php:320 ../../Zotlabs/Module/Thing.php:370
-#: ../../Zotlabs/Module/Mail.php:413 ../../Zotlabs/Module/Chat.php:196
-#: ../../Zotlabs/Module/Chat.php:241 ../../Zotlabs/Module/Xchan.php:15
-#: ../../Zotlabs/Lib/ThreadItem.php:731
-#: ../../extend/addon/addon/chords/Mod_Chords.php:60
-#: ../../extend/addon/addon/diaspora/diaspora.php:714
-#: ../../extend/addon/addon/dwpost/dwpost.php:89
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:124
-#: ../../extend/addon/addon/friendica/friendica.php:128
-#: ../../extend/addon/addon/frphotos/frphotos.php:96
-#: ../../extend/addon/addon/hubwall/hubwall.php:95
-#: ../../extend/addon/addon/ijpost/ijpost.php:89
-#: ../../extend/addon/addon/irc/irc.php:53
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:371
-#: ../../extend/addon/addon/libertree/libertree.php:85
-#: ../../extend/addon/addon/ljpost/ljpost.php:86
-#: ../../extend/addon/addon/logrot/logrot.php:35
-#: ../../extend/addon/addon/mailhost/mailhost.php:40
-#: ../../extend/addon/addon/nofed/nofed.php:80
-#: ../../extend/addon/addon/nsabait/nsabait.php:161
-#: ../../extend/addon/addon/nsfw/nsfw.php:92
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:53
-#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:168
-#: ../../extend/addon/addon/pageheader/pageheader.php:48
-#: ../../extend/addon/addon/piwik/piwik.php:95
-#: ../../extend/addon/addon/planets/planets.php:157
-#: ../../extend/addon/addon/pumpio/pumpio.php:237
-#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:85
-#: ../../extend/addon/addon/redfiles/redfiles.php:124
-#: ../../extend/addon/addon/redphotos/redphotos.php:136
-#: ../../extend/addon/addon/redred/redred.php:119
-#: ../../extend/addon/addon/rtof/rtof.php:101
-#: ../../extend/addon/addon/skeleton/skeleton.php:65
-#: ../../extend/addon/addon/smileybutton/smileybutton.php:281
-#: ../../extend/addon/addon/startpage/startpage.php:113
-#: ../../extend/addon/addon/statusnet/statusnet.php:322
-#: ../../extend/addon/addon/statusnet/statusnet.php:380
-#: ../../extend/addon/addon/statusnet/statusnet.php:432
-#: ../../extend/addon/addon/statusnet/statusnet.php:899
-#: ../../extend/addon/addon/superblock/superblock.php:118
-#: ../../extend/addon/addon/twitter/twitter.php:217
-#: ../../extend/addon/addon/twitter/twitter.php:259
-#: ../../extend/addon/addon/visage/visage.php:170
-#: ../../extend/addon/addon/wppost/wppost.php:113
-#: ../../extend/addon/addon/xmpp/xmpp.php:69
-#: ../../extend/addon/addon/cdav/cdav.php:246
-#: ../../extend/addon/addon/likebanner/likebanner.php:57
-#: ../../extend/addon/addon/mailtest/mailtest.php:100
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:153
-#: ../../extend/addon/addon/gnusoc/gnusoc.php:133
-#: ../../include/widgets.php:815 ../../include/js_strings.php:22
-#: ../../view/theme/redbasic/php/config.php:106
-msgid "Submit"
-msgstr "Envoyer"
+#: ../../Zotlabs/Module/Mitem.php:165
+msgid "Submit and finish"
+msgstr "Vadiler et terminer"
-#: ../../Zotlabs/Module/Photos.php:685
-msgid "Album name could not be decoded"
-msgstr "Le nom de l'Album n'a pu être décodé"
+#: ../../Zotlabs/Module/Mitem.php:166
+msgid "Submit and continue"
+msgstr "Valider et continuer"
-#: ../../Zotlabs/Module/Photos.php:729
-msgid "Contact Photos"
-msgstr "Photos de contact"
+#: ../../Zotlabs/Module/Mitem.php:174
+msgid "Menu:"
+msgstr "Menu&nbsp;:"
-#: ../../Zotlabs/Module/Photos.php:752
-msgid "Show Newest First"
-msgstr "Les plus récent(e)s en premier"
+#: ../../Zotlabs/Module/Mitem.php:177
+msgid "Link Target"
+msgstr "Cible du lien"
-#: ../../Zotlabs/Module/Photos.php:754
-msgid "Show Oldest First"
-msgstr "Les moins récent(e)s en premier"
+#: ../../Zotlabs/Module/Mitem.php:180
+msgid "Edit menu"
+msgstr "Modifier le menu"
-#: ../../Zotlabs/Module/Photos.php:778 ../../Zotlabs/Module/Photos.php:1335
-#: ../../Zotlabs/Module/Embedphotos.php:139 ../../include/widgets.php:1708
-msgid "View Photo"
-msgstr "Voir la photo"
+#: ../../Zotlabs/Module/Mitem.php:183
+msgid "Edit element"
+msgstr "Modifier l'entrée"
-#: ../../Zotlabs/Module/Photos.php:809
-#: ../../Zotlabs/Module/Embedphotos.php:155 ../../include/widgets.php:1725
-msgid "Edit Album"
-msgstr "Modifier l'album"
+#: ../../Zotlabs/Module/Mitem.php:184
+msgid "Drop element"
+msgstr "Supprimer l'entrée"
-#: ../../Zotlabs/Module/Photos.php:856
-msgid "Permission denied. Access to this item may be restricted."
-msgstr "Permission refusée. L'accès à cet élément peut avoir été restreint."
+#: ../../Zotlabs/Module/Mitem.php:185
+msgid "New element"
+msgstr "Nouvelle entrée"
-#: ../../Zotlabs/Module/Photos.php:858
-msgid "Photo not available"
-msgstr "Photo non disponible"
+#: ../../Zotlabs/Module/Mitem.php:186
+msgid "Edit this menu container"
+msgstr "Éditer ce bloc de menu"
-#: ../../Zotlabs/Module/Photos.php:916
-msgid "Use as profile photo"
-msgstr "Utiliser comme photo du profil"
+#: ../../Zotlabs/Module/Mitem.php:187
+msgid "Add menu element"
+msgstr "Ajouter une entrée au menu"
-#: ../../Zotlabs/Module/Photos.php:917
-msgid "Use as cover photo"
-msgstr "Utilisez comme bannière"
+#: ../../Zotlabs/Module/Mitem.php:188
+msgid "Delete this menu item"
+msgstr "Supprimer cette entrée du menu"
-#: ../../Zotlabs/Module/Photos.php:924
-msgid "Private Photo"
-msgstr "Photo privée"
+#: ../../Zotlabs/Module/Mitem.php:189
+msgid "Edit this menu item"
+msgstr "Modifier cette entrée du menu"
-#: ../../Zotlabs/Module/Photos.php:935 ../../Zotlabs/Module/Cal.php:336
-#: ../../Zotlabs/Module/Cal.php:343 ../../Zotlabs/Module/Events.php:689
-#: ../../Zotlabs/Module/Events.php:698
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:846
-msgid "Previous"
-msgstr "Précédent"
+#: ../../Zotlabs/Module/Mitem.php:206
+msgid "Menu item not found."
+msgstr "Entrée de menu introuvable."
-#: ../../Zotlabs/Module/Photos.php:939
-msgid "View Full Size"
-msgstr "Voir en taille réelle"
+#: ../../Zotlabs/Module/Mitem.php:219
+msgid "Menu item deleted."
+msgstr "Entrée de menu supprimée."
-#: ../../Zotlabs/Module/Photos.php:944 ../../Zotlabs/Module/Cal.php:337
-#: ../../Zotlabs/Module/Cal.php:344 ../../Zotlabs/Module/Setup.php:264
-#: ../../Zotlabs/Module/Events.php:690 ../../Zotlabs/Module/Events.php:699
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:847
-msgid "Next"
-msgstr "Suivant"
+#: ../../Zotlabs/Module/Mitem.php:221
+msgid "Menu item could not be deleted."
+msgstr "Impossible de supprimer l'entrée de menu."
-#: ../../Zotlabs/Module/Photos.php:984
-#: ../../Zotlabs/Module/Admin/Plugins.php:450
-#: ../../Zotlabs/Module/Tagrm.php:137
-#: ../../extend/addon/addon/superblock/superblock.php:114
-msgid "Remove"
-msgstr "Retirer"
+#: ../../Zotlabs/Module/Mitem.php:228
+msgid "Edit Menu Element"
+msgstr "Modifier l'entrée de menu"
-#: ../../Zotlabs/Module/Photos.php:1028
-msgid "Edit photo"
-msgstr "Modifier la photo"
+#: ../../Zotlabs/Module/Mitem.php:238
+msgid "Link text"
+msgstr "Texte du lien"
-#: ../../Zotlabs/Module/Photos.php:1030
-msgid "Rotate CW (right)"
-msgstr "Rotation horaire (droite)"
+#: ../../Zotlabs/Module/Events.php:25
+msgid "Calendar entries imported."
+msgstr "Entrées du calendrier importées."
-#: ../../Zotlabs/Module/Photos.php:1031
-msgid "Rotate CCW (left)"
-msgstr "Rotation anti-horaire (gauche)"
+#: ../../Zotlabs/Module/Events.php:27
+msgid "No calendar entries found."
+msgstr "Aucune entrée du calendrier trouvée."
-#: ../../Zotlabs/Module/Photos.php:1034
-msgid "Move photo to album"
-msgstr "Déplacer la photo dans l'album"
+#: ../../Zotlabs/Module/Events.php:110
+msgid "Event can not end before it has started."
+msgstr "La fin de l'événement ne peut être antérieure à son début."
-#: ../../Zotlabs/Module/Photos.php:1035
-msgid "Enter a new album name"
-msgstr "Entrer un nouveau nom d'album"
+#: ../../Zotlabs/Module/Events.php:112 ../../Zotlabs/Module/Events.php:121
+#: ../../Zotlabs/Module/Events.php:143
+msgid "Unable to generate preview."
+msgstr "Impossible de générer l'aperçu."
-#: ../../Zotlabs/Module/Photos.php:1036
-msgid "or select an existing one (doubleclick)"
-msgstr "ou en sélectionner un existant (double-clic)"
+#: ../../Zotlabs/Module/Events.php:119
+msgid "Event title and start time are required."
+msgstr "Un titre et une date de début sont requises pour l'événement."
-#: ../../Zotlabs/Module/Photos.php:1039
-msgid "Caption"
-msgstr "Titre/légende"
+#: ../../Zotlabs/Module/Events.php:141 ../../Zotlabs/Module/Events.php:265
+msgid "Event not found."
+msgstr "Événement introuvable."
-#: ../../Zotlabs/Module/Photos.php:1041
-msgid "Add a Tag"
-msgstr "Ajouter une étiquette"
+#: ../../Zotlabs/Module/Events.php:260 ../../Zotlabs/Module/Tagger.php:51
+#: ../../Zotlabs/Module/Like.php:372 ../../include/conversation.php:119
+#: ../../include/text.php:1948 ../../include/event.php:1141
+msgid "event"
+msgstr "événement"
-#: ../../Zotlabs/Module/Photos.php:1049
-msgid "Example: @bob, @Barbara_Jensen, @jim@example.com"
-msgstr "Exemple&nbsp;: @marc, @Barbara_Jensen, @charles@exemple.com, #Ile_de_France, #marathon"
+#: ../../Zotlabs/Module/Events.php:460
+msgid "Edit event title"
+msgstr "Modifier le titre de l'événement"
-#: ../../Zotlabs/Module/Photos.php:1052
-msgid "Flag as adult in album view"
-msgstr "Marquer comme \"adulte\" dans l'affichage de l'album"
+#: ../../Zotlabs/Module/Events.php:460 ../../addon/cdav/Mod_Cdav.php:835
+msgid "Event title"
+msgstr "Titre de l'événement"
-#: ../../Zotlabs/Module/Photos.php:1071 ../../Zotlabs/Lib/ThreadItem.php:268
-msgid "I like this (toggle)"
-msgstr "J'aime (oui/non)"
+#: ../../Zotlabs/Module/Events.php:460 ../../Zotlabs/Module/Events.php:465
+#: ../../Zotlabs/Module/Appman.php:122 ../../Zotlabs/Module/Appman.php:123
+#: ../../Zotlabs/Module/Profiles.php:748 ../../Zotlabs/Module/Profiles.php:752
+#: ../../include/datetime.php:259
+msgid "Required"
+msgstr "Requis"
-#: ../../Zotlabs/Module/Photos.php:1072 ../../Zotlabs/Lib/ThreadItem.php:269
-msgid "I don't like this (toggle)"
-msgstr "Je n'aime pas (oui/non)"
+#: ../../Zotlabs/Module/Events.php:462
+msgid "Categories (comma-separated list)"
+msgstr "Catégories (séparées par des virgules)"
-#: ../../Zotlabs/Module/Photos.php:1073 ../../Zotlabs/Module/Blocks.php:161
-#: ../../Zotlabs/Module/Layouts.php:193 ../../Zotlabs/Module/Webpages.php:245
-#: ../../extend/addon/addon/cdav/include/widgets.php:123
-#: ../../include/conversation.php:1378
-msgid "Share"
-msgstr "Partager"
+#: ../../Zotlabs/Module/Events.php:463
+msgid "Edit Category"
+msgstr "Modifier la catégorie"
-#: ../../Zotlabs/Module/Photos.php:1074 ../../Zotlabs/Lib/ThreadItem.php:411
-#: ../../include/conversation.php:738
-msgid "Please wait"
-msgstr "Merci de patienter"
+#: ../../Zotlabs/Module/Events.php:463
+msgid "Category"
+msgstr "Catégorie"
-#: ../../Zotlabs/Module/Photos.php:1090 ../../Zotlabs/Module/Photos.php:1208
-#: ../../Zotlabs/Lib/ThreadItem.php:728
-msgid "This is you"
-msgstr "C'est vous"
+#: ../../Zotlabs/Module/Events.php:466
+msgid "Edit start date and time"
+msgstr "Modifier la date et l'heure de début"
-#: ../../Zotlabs/Module/Photos.php:1092 ../../Zotlabs/Module/Photos.php:1210
-#: ../../Zotlabs/Lib/ThreadItem.php:730 ../../include/js_strings.php:6
-msgid "Comment"
-msgstr "Commenter"
+#: ../../Zotlabs/Module/Events.php:466 ../../addon/cdav/Mod_Cdav.php:836
+msgid "Start date and time"
+msgstr "Date et heure de début"
-#: ../../Zotlabs/Module/Photos.php:1094 ../../Zotlabs/Module/Events.php:478
-#: ../../Zotlabs/Module/Webpages.php:251 ../../Zotlabs/Lib/ThreadItem.php:740
-#: ../../include/conversation.php:1347 ../../include/page_widgets.php:43
-msgid "Preview"
-msgstr "Aperçu"
+#: ../../Zotlabs/Module/Events.php:467 ../../Zotlabs/Module/Events.php:470
+msgid "Finish date and time are not known or not relevant"
+msgstr "Date et heure de fin inconnues ou sans objet"
-#: ../../Zotlabs/Module/Photos.php:1108 ../../include/conversation.php:577
-msgctxt "title"
-msgid "Likes"
-msgstr "Aime"
+#: ../../Zotlabs/Module/Events.php:469
+msgid "Edit finish date and time"
+msgstr "Modifier la date et l'heure de fin"
-#: ../../Zotlabs/Module/Photos.php:1108 ../../include/conversation.php:577
-msgctxt "title"
-msgid "Dislikes"
-msgstr "N'aime pas"
+#: ../../Zotlabs/Module/Events.php:469
+msgid "Finish date and time"
+msgstr "Date et heure de fin"
-#: ../../Zotlabs/Module/Photos.php:1109 ../../include/conversation.php:578
-msgctxt "title"
-msgid "Agree"
-msgstr "D'accord"
+#: ../../Zotlabs/Module/Events.php:471 ../../Zotlabs/Module/Events.php:472
+msgid "Adjust for viewer timezone"
+msgstr "Ajuster au fuseau horaire du visiteur"
-#: ../../Zotlabs/Module/Photos.php:1109 ../../include/conversation.php:578
-msgctxt "title"
-msgid "Disagree"
-msgstr "Pas d'accord"
+#: ../../Zotlabs/Module/Events.php:471
+msgid ""
+"Important for events that happen in a particular place. Not practical for "
+"global holidays."
+msgstr "Important pour les événements se tenant en un lieu particulier. Pas pratique pour les vacances communes à de nombreux pays dans le monde."
-#: ../../Zotlabs/Module/Photos.php:1109 ../../include/conversation.php:578
-msgctxt "title"
-msgid "Abstain"
-msgstr "Abstention"
+#: ../../Zotlabs/Module/Events.php:473
+msgid "Edit Description"
+msgstr "Modifier la description"
-#: ../../Zotlabs/Module/Photos.php:1110 ../../include/conversation.php:579
-msgctxt "title"
-msgid "Attending"
-msgstr "Participations"
+#: ../../Zotlabs/Module/Events.php:473 ../../Zotlabs/Module/Appman.php:124
+#: ../../Zotlabs/Module/Rbmark.php:101
+#: ../../addon/rendezvous/rendezvous.php:173 ../../addon/cdav/Mod_Cdav.php:838
+msgid "Description"
+msgstr "Description"
-#: ../../Zotlabs/Module/Photos.php:1110 ../../include/conversation.php:579
-msgctxt "title"
-msgid "Not attending"
-msgstr "Non-participations"
+#: ../../Zotlabs/Module/Events.php:475
+msgid "Edit Location"
+msgstr "Modifier l'emplacement"
-#: ../../Zotlabs/Module/Photos.php:1110 ../../include/conversation.php:579
-msgctxt "title"
-msgid "Might attend"
-msgstr "Participation possible"
+#: ../../Zotlabs/Module/Events.php:478 ../../Zotlabs/Module/Photos.php:1063
+#: ../../Zotlabs/Module/Webpages.php:252 ../../Zotlabs/Lib/ThreadItem.php:741
+#: ../../include/conversation.php:1280 ../../include/page_widgets.php:43
+msgid "Preview"
+msgstr "Aperçu"
-#: ../../Zotlabs/Module/Photos.php:1127 ../../Zotlabs/Module/Photos.php:1139
-#: ../../Zotlabs/Lib/ThreadItem.php:186 ../../Zotlabs/Lib/ThreadItem.php:198
-#: ../../include/conversation.php:1928
-msgid "View all"
-msgstr "Voir tout"
+#: ../../Zotlabs/Module/Events.php:479 ../../include/conversation.php:1343
+msgid "Permission settings"
+msgstr "Gérer les autorisations"
-#: ../../Zotlabs/Module/Photos.php:1131 ../../Zotlabs/Lib/ThreadItem.php:190
-#: ../../include/taxonomy.php:403 ../../include/conversation.php:1952
-#: ../../include/channel.php:1273
-msgctxt "noun"
-msgid "Like"
-msgid_plural "Likes"
-msgstr[0] "Aime"
-msgstr[1] "Aime"
+#: ../../Zotlabs/Module/Events.php:489
+msgid "Timezone:"
+msgstr "Fuseau horaire&nbsp;:"
-#: ../../Zotlabs/Module/Photos.php:1136 ../../Zotlabs/Lib/ThreadItem.php:195
-#: ../../include/conversation.php:1955
-msgctxt "noun"
-msgid "Dislike"
-msgid_plural "Dislikes"
-msgstr[0] "N'aime pas"
-msgstr[1] "N'aime pas"
+#: ../../Zotlabs/Module/Events.php:494
+msgid "Advanced Options"
+msgstr "Options avancées"
-#: ../../Zotlabs/Module/Photos.php:1236
-msgid "Photo Tools"
-msgstr "Ouitls pour photos"
+#: ../../Zotlabs/Module/Events.php:605 ../../Zotlabs/Module/Cal.php:264
+msgid "l, F j"
+msgstr "l, F j"
-#: ../../Zotlabs/Module/Photos.php:1245
-msgid "In This Photo:"
-msgstr "Dans cette photo&nbsp;:"
+#: ../../Zotlabs/Module/Events.php:633
+msgid "Edit event"
+msgstr "Modifier l'événement"
-#: ../../Zotlabs/Module/Photos.php:1250
-msgid "Map"
-msgstr "Carte"
+#: ../../Zotlabs/Module/Events.php:635
+msgid "Delete event"
+msgstr "Supprimer l'événement"
-#: ../../Zotlabs/Module/Photos.php:1258 ../../Zotlabs/Lib/ThreadItem.php:400
-msgctxt "noun"
-msgid "Likes"
-msgstr "Aime"
+#: ../../Zotlabs/Module/Events.php:660 ../../Zotlabs/Module/Cal.php:313
+#: ../../include/text.php:1767
+msgid "Link to Source"
+msgstr "Lien vers la Source"
-#: ../../Zotlabs/Module/Photos.php:1259 ../../Zotlabs/Lib/ThreadItem.php:401
-msgctxt "noun"
-msgid "Dislikes"
-msgstr "N'aime pas"
+#: ../../Zotlabs/Module/Events.php:669
+msgid "calendar"
+msgstr "calendrier"
-#: ../../Zotlabs/Module/Photos.php:1264 ../../Zotlabs/Lib/ThreadItem.php:406
-#: ../../include/acl_selectors.php:220
-msgid "Close"
-msgstr "Fermer"
+#: ../../Zotlabs/Module/Events.php:688 ../../Zotlabs/Module/Cal.php:336
+msgid "Edit Event"
+msgstr "Modifier l'événement"
-#: ../../Zotlabs/Module/Photos.php:1341
-msgid "View Album"
-msgstr "Voir l'album"
+#: ../../Zotlabs/Module/Events.php:688 ../../Zotlabs/Module/Cal.php:336
+msgid "Create Event"
+msgstr "Créer un événement"
-#: ../../Zotlabs/Module/Photos.php:1352 ../../Zotlabs/Module/Photos.php:1365
-#: ../../Zotlabs/Module/Photos.php:1366
-msgid "Recent Photos"
-msgstr "Photos récentes"
+#: ../../Zotlabs/Module/Events.php:689 ../../Zotlabs/Module/Events.php:698
+#: ../../Zotlabs/Module/Cal.php:337 ../../Zotlabs/Module/Cal.php:344
+#: ../../Zotlabs/Module/Photos.php:911 ../../addon/cdav/Mod_Cdav.php:846
+msgid "Previous"
+msgstr "Précédent"
-#: ../../Zotlabs/Module/Editpost.php:24 ../../Zotlabs/Module/Editblock.php:79
-#: ../../Zotlabs/Module/Editblock.php:95
-#: ../../Zotlabs/Module/Editlayout.php:79
-#: ../../Zotlabs/Module/Editwebpage.php:80
-msgid "Item not found"
-msgstr "Élément introuvable"
+#: ../../Zotlabs/Module/Events.php:690 ../../Zotlabs/Module/Events.php:699
+#: ../../Zotlabs/Module/Setup.php:264 ../../Zotlabs/Module/Cal.php:338
+#: ../../Zotlabs/Module/Cal.php:345 ../../Zotlabs/Module/Photos.php:920
+#: ../../addon/cdav/Mod_Cdav.php:847
+msgid "Next"
+msgstr "Suivant"
-#: ../../Zotlabs/Module/Editpost.php:35
-msgid "Item is not editable"
-msgstr "Elément non modifiable"
+#: ../../Zotlabs/Module/Events.php:691 ../../Zotlabs/Module/Cal.php:339
+#: ../../include/channel.php:1363
+msgid "Export"
+msgstr "Export"
-#: ../../Zotlabs/Module/Editpost.php:108 ../../Zotlabs/Module/Rpost.php:138
-msgid "Edit post"
-msgstr "Modifier la publication"
+#: ../../Zotlabs/Module/Events.php:695 ../../addon/cdav/Mod_Cdav.php:849
+msgid "Month"
+msgstr "Mois"
-#: ../../Zotlabs/Module/Acl.php:117 ../../Zotlabs/Module/Lockview.php:117
-#: ../../Zotlabs/Module/Lockview.php:153 ../../include/acl_selectors.php:183
-msgctxt "acl"
-msgid "Profile"
-msgstr ""
+#: ../../Zotlabs/Module/Events.php:696 ../../addon/cdav/Mod_Cdav.php:850
+msgid "Week"
+msgstr "Semaine"
-#: ../../Zotlabs/Module/Acl.php:344
-msgid "network"
-msgstr "réseau"
+#: ../../Zotlabs/Module/Events.php:697 ../../addon/cdav/Mod_Cdav.php:851
+msgid "Day"
+msgstr "Jour"
-#: ../../Zotlabs/Module/Acl.php:354
-msgid "RSS"
-msgstr "RSS"
+#: ../../Zotlabs/Module/Events.php:700 ../../Zotlabs/Module/Cal.php:346
+#: ../../addon/cdav/Mod_Cdav.php:848
+msgid "Today"
+msgstr "Aujourd'hui"
-#: ../../Zotlabs/Module/Help.php:23
-msgid "Documentation Search"
-msgstr "Chercher dans la documentation"
+#: ../../Zotlabs/Module/Events.php:731
+msgid "Event removed"
+msgstr "Événement supprimé"
-#: ../../Zotlabs/Module/Help.php:80 ../../include/conversation.php:1827
-msgid "About"
-msgstr "À propos"
+#: ../../Zotlabs/Module/Events.php:734
+msgid "Failed to remove event"
+msgstr "Impossible de supprimer l'événement"
-#: ../../Zotlabs/Module/Help.php:81 ../../Zotlabs/Module/Group.php:197
-msgid "Members"
-msgstr "Membres"
+#: ../../Zotlabs/Module/Appman.php:38 ../../Zotlabs/Module/Appman.php:55
+msgid "App installed."
+msgstr "Application installée."
-#: ../../Zotlabs/Module/Help.php:82
-msgid "Administrators"
-msgstr "Administrateurs"
+#: ../../Zotlabs/Module/Appman.php:48
+msgid "Malformed app."
+msgstr "Erreur de l'application - Malformée."
-#: ../../Zotlabs/Module/Help.php:83
-msgid "Developers"
-msgstr "Développeurs"
+#: ../../Zotlabs/Module/Appman.php:111
+msgid "Embed code"
+msgstr "Imbriquer le code"
-#: ../../Zotlabs/Module/Help.php:84
-msgid "Tutorials"
-msgstr "Tutoriels"
+#: ../../Zotlabs/Module/Appman.php:117
+msgid "Edit App"
+msgstr "Modifier l'application"
-#: ../../Zotlabs/Module/Help.php:93
-msgid "$Projectname Documentation"
-msgstr "Documentation $Projectname"
+#: ../../Zotlabs/Module/Appman.php:117
+msgid "Create App"
+msgstr "Créer une application"
-#: ../../Zotlabs/Module/Help.php:94
-msgid "Contents"
-msgstr "Contenus"
+#: ../../Zotlabs/Module/Appman.php:122
+msgid "Name of app"
+msgstr "Nom de l'application"
-#: ../../Zotlabs/Module/Bookmarks.php:53
-msgid "Bookmark added"
-msgstr "Favori ajouté"
+#: ../../Zotlabs/Module/Appman.php:123
+msgid "Location (URL) of app"
+msgstr "Emplacement (URL) de l'application"
-#: ../../Zotlabs/Module/Bookmarks.php:75
-msgid "My Bookmarks"
-msgstr "Mes Favoris"
+#: ../../Zotlabs/Module/Appman.php:125
+msgid "Photo icon URL"
+msgstr "URL de l'icône à utiliser pour cette photo"
-#: ../../Zotlabs/Module/Bookmarks.php:86
-msgid "My Connections Bookmarks"
-msgstr "Favoris de mes contacts"
+#: ../../Zotlabs/Module/Appman.php:125
+msgid "80 x 80 pixels - optional"
+msgstr "80 x 80 pixels - facultatif"
-#: ../../Zotlabs/Module/Connect.php:61 ../../Zotlabs/Module/Connect.php:109
-msgid "Continue"
-msgstr "Continuer"
+#: ../../Zotlabs/Module/Appman.php:126
+msgid "Categories (optional, comma separated list)"
+msgstr "Catégories (séparées par des virgules)"
-#: ../../Zotlabs/Module/Connect.php:90
-msgid "Premium Channel Setup"
-msgstr "Configuration du canal VIP"
+#: ../../Zotlabs/Module/Appman.php:127
+msgid "Version ID"
+msgstr "Identifiant de version"
-#: ../../Zotlabs/Module/Connect.php:92
-msgid "Enable premium channel connection restrictions"
-msgstr "Activer les restrictions liées au canal VIP"
+#: ../../Zotlabs/Module/Appman.php:128
+msgid "Price of app"
+msgstr "Prix de l'application"
-#: ../../Zotlabs/Module/Connect.php:93
-msgid ""
-"Please enter your restrictions or conditions, such as paypal receipt, usage "
-"guidelines, etc."
-msgstr "Merci de saisir les restrictions et/ou conditions - reçu Paypal, transaction Bitcoin, ligne de conduite, ..."
+#: ../../Zotlabs/Module/Appman.php:129
+msgid "Location (URL) to purchase app"
+msgstr "Emplacement (URL) pour l'achat de l'application"
-#: ../../Zotlabs/Module/Connect.php:95 ../../Zotlabs/Module/Connect.php:115
-msgid ""
-"This channel may require additional steps or acknowledgement of the "
-"following conditions prior to connecting:"
-msgstr "Avant d'autoriser la mise en relation, ce canal attire votre attention sur les conditions suivantes&nbsp;:"
+#: ../../Zotlabs/Module/Regmod.php:15
+msgid "Please login."
+msgstr "Merci de vous connecter."
-#: ../../Zotlabs/Module/Connect.php:96
-msgid ""
-"Potential connections will then see the following text before proceeding:"
-msgstr "Les contacts potentiels verront ce qui suit avant de pouvoir continuer&nbsp;:"
+#: ../../Zotlabs/Module/Magic.php:71
+msgid "Hub not found."
+msgstr "Hub introuvable."
-#: ../../Zotlabs/Module/Connect.php:97 ../../Zotlabs/Module/Connect.php:118
-msgid ""
-"By continuing, I certify that I have complied with any instructions provided"
-" on this page."
-msgstr "En continuant, je certifie que je me suis conformé à toutes les instructions indiquées sur cette page."
+#: ../../Zotlabs/Module/Subthread.php:87 ../../Zotlabs/Module/Tagger.php:47
+#: ../../Zotlabs/Module/Like.php:370
+#: ../../addon/redphotos/redphotohelper.php:74
+#: ../../addon/diaspora/inbound.php:1794 ../../include/conversation.php:116
+#: ../../include/text.php:1945
+msgid "photo"
+msgstr "photo"
-#: ../../Zotlabs/Module/Connect.php:106
-msgid "(No specific instructions have been provided by the channel owner.)"
-msgstr "(Aucune instruction spécifique n'a été fournie par le propriétaire du canal.)"
+#: ../../Zotlabs/Module/Subthread.php:87 ../../Zotlabs/Module/Like.php:370
+#: ../../addon/diaspora/inbound.php:1794 ../../include/conversation.php:144
+#: ../../include/text.php:1951
+msgid "status"
+msgstr "état"
-#: ../../Zotlabs/Module/Connect.php:114
-msgid "Restricted or Premium Channel"
-msgstr "Canal VIP ou restreint"
+#: ../../Zotlabs/Module/Subthread.php:118
+#, php-format
+msgid "%1$s is following %2$s's %3$s"
+msgstr "%1$s suit %3$s de %2$s"
-#: ../../Zotlabs/Module/Admin.php:94
-msgid "# Accounts"
-msgstr "# Comptes"
+#: ../../Zotlabs/Module/Subthread.php:120
+#, php-format
+msgid "%1$s stopped following %2$s's %3$s"
+msgstr "%1$s ne suit plus %3$s de %2$s"
-#: ../../Zotlabs/Module/Admin.php:95
-msgid "# blocked accounts"
-msgstr "# comptes bloqués"
+#: ../../Zotlabs/Module/Import_items.php:46 ../../Zotlabs/Module/Import.php:64
+msgid "Nothing to import."
+msgstr "Rien à importer."
-#: ../../Zotlabs/Module/Admin.php:96
-msgid "# expired accounts"
-msgstr "# comptes expirés"
+#: ../../Zotlabs/Module/Import_items.php:70 ../../Zotlabs/Module/Import.php:79
+#: ../../Zotlabs/Module/Import.php:95
+msgid "Unable to download data from old server"
+msgstr "Impossible de récupérer les données de l'ancien serveur"
-#: ../../Zotlabs/Module/Admin.php:97
-msgid "# expiring accounts"
-msgstr "# comptes expirant"
+#: ../../Zotlabs/Module/Import_items.php:75
+#: ../../Zotlabs/Module/Import.php:102
+msgid "Imported file is empty."
+msgstr "Le fichier importé est vide."
-#: ../../Zotlabs/Module/Admin.php:108
-msgid "# Channels"
-msgstr "# Canaux"
+#: ../../Zotlabs/Module/Import_items.php:91
+#: ../../Zotlabs/Module/Import.php:121
+#, php-format
+msgid "Warning: Database versions differ by %1$d updates."
+msgstr "Attention&nbsp;: les versions de bases de données diffèrent de %1$d mises à jour."
-#: ../../Zotlabs/Module/Admin.php:109
-msgid "# primary"
-msgstr "# primaire"
+#: ../../Zotlabs/Module/Import_items.php:106
+msgid "Import completed"
+msgstr "L'import est terminé."
-#: ../../Zotlabs/Module/Admin.php:110
-msgid "# clones"
-msgstr "# clones"
+#: ../../Zotlabs/Module/Import_items.php:123
+msgid "Import Items"
+msgstr "Importer"
-#: ../../Zotlabs/Module/Admin.php:116
-msgid "Message queues"
-msgstr "File des messages"
+#: ../../Zotlabs/Module/Import_items.php:124
+msgid ""
+"Use this form to import existing posts and content from an export file."
+msgstr "Utiliser ce formulaire pour importer des publications et du contenu existant d'un fichier d'export."
-#: ../../Zotlabs/Module/Admin.php:133
-msgid "Your software should be updated"
-msgstr "Votre logiciel doit d'être mis à jour"
+#: ../../Zotlabs/Module/Import_items.php:125
+#: ../../Zotlabs/Module/Import.php:499
+msgid "File to Upload"
+msgstr "Fichier à envoyer"
-#: ../../Zotlabs/Module/Admin.php:137 ../../Zotlabs/Module/Admin/Logs.php:82
-#: ../../Zotlabs/Module/Admin/Security.php:86
-#: ../../Zotlabs/Module/Admin/Themes.php:120
-#: ../../Zotlabs/Module/Admin/Themes.php:154
-#: ../../Zotlabs/Module/Admin/Accounts.php:164
-#: ../../Zotlabs/Module/Admin/Channels.php:145
-#: ../../Zotlabs/Module/Admin/Site.php:258
-#: ../../Zotlabs/Module/Admin/Plugins.php:336
-#: ../../Zotlabs/Module/Admin/Plugins.php:431
-msgid "Administration"
-msgstr "Administration"
+#: ../../Zotlabs/Module/New_channel.php:121
+#: ../../Zotlabs/Module/Manage.php:136
+#, php-format
+msgid "You have created %1$.0f of %2$.0f allowed channels."
+msgstr "Vous avez créé %1$.0f des %2$.0f canaux autorisés."
-#: ../../Zotlabs/Module/Admin.php:138
-msgid "Summary"
-msgstr "Résumé"
+#: ../../Zotlabs/Module/New_channel.php:134
+#: ../../Zotlabs/Module/Register.php:237
+msgid "Name or caption"
+msgstr "Nom ou libellé"
-#: ../../Zotlabs/Module/Admin.php:141
-msgid "Registered accounts"
-msgstr "Comptes enregistrés"
+#: ../../Zotlabs/Module/New_channel.php:134
+#: ../../Zotlabs/Module/Register.php:237
+msgid "Examples: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \"Aviation Group\""
+msgstr "Exemples&nbsp;: \"Jérôme Dutilleul\", \"Louise et ses chevaux\", \"Football\", \"Club d'aéromodélisme\""
-#: ../../Zotlabs/Module/Admin.php:142
-msgid "Pending registrations"
-msgstr "Inscriptions en attente"
+#: ../../Zotlabs/Module/New_channel.php:136
+#: ../../Zotlabs/Module/Register.php:239
+msgid "Choose a short nickname"
+msgstr "Choisissez un alias"
-#: ../../Zotlabs/Module/Admin.php:143
-msgid "Registered channels"
-msgstr "Canaux enregistrés"
+#: ../../Zotlabs/Module/New_channel.php:136
+#: ../../Zotlabs/Module/Register.php:239
+#, php-format
+msgid ""
+"Your nickname will be used to create an easy to remember channel address "
+"e.g. nickname%s"
+msgstr "Votre pseudo sera utilisé pour créer une adresse de canal facile à mémoriser, par ex. pseudo%s"
-#: ../../Zotlabs/Module/Admin.php:144
-msgid "Active plugins"
-msgstr "Greffons actifs"
+#: ../../Zotlabs/Module/New_channel.php:137
+#: ../../Zotlabs/Module/Register.php:240
+msgid "Channel role and privacy"
+msgstr "Rôle et confidentialité du canal"
-#: ../../Zotlabs/Module/Admin.php:145
-msgid "Version"
-msgstr "Version"
+#: ../../Zotlabs/Module/New_channel.php:137
+#: ../../Zotlabs/Module/Register.php:240
+msgid "Select a channel role with your privacy requirements."
+msgstr "Sélectionner un rôle de canal adapté à vos besoins de confidentialité."
-#: ../../Zotlabs/Module/Admin.php:146
-msgid "Repository version (master)"
-msgstr "Version du dépôt (maître)"
+#: ../../Zotlabs/Module/New_channel.php:137
+#: ../../Zotlabs/Module/Register.php:240
+msgid "Read more about roles"
+msgstr "En savoir plus sur les rôles"
-#: ../../Zotlabs/Module/Admin.php:147
-msgid "Repository version (dev)"
-msgstr "Version du dépôt (développeur)"
+#: ../../Zotlabs/Module/New_channel.php:140
+msgid "Create Channel"
+msgstr "Créer le canal"
-#: ../../Zotlabs/Module/Editblock.php:108 ../../Zotlabs/Module/Blocks.php:97
-#: ../../Zotlabs/Module/Blocks.php:155
-msgid "Block Name"
-msgstr "Nom du Bloc"
+#: ../../Zotlabs/Module/New_channel.php:141
+msgid ""
+"A channel is your identity on this network. It can represent a person, a "
+"blog, or a forum to name a few. Channels can make connections with other "
+"channels to share information with highly detailed permissions."
+msgstr "Un canal est votre identité sur ce réseau. Il peut représenter une personne, un blog, ou un forum par exemple. Les canaux peuvent entrer en contact les uns avec les autres pour partager des informations avec des permissions d'accès très fines."
-#: ../../Zotlabs/Module/Editblock.php:111
-#: ../../Zotlabs/Module/Editwebpage.php:146 ../../Zotlabs/Module/Mail.php:287
-#: ../../Zotlabs/Module/Mail.php:412 ../../Zotlabs/Module/Chat.php:207
-#: ../../include/conversation.php:1295
-msgid "Insert web link"
-msgstr "Insérer lien web"
+#: ../../Zotlabs/Module/New_channel.php:142
+msgid ""
+"or <a href=\"import\">import an existing channel</a> from another location."
+msgstr "ou <a href=\"import\">importer un canal existant</a> d'un autre serveur."
-#: ../../Zotlabs/Module/Editblock.php:124 ../../include/conversation.php:1406
-msgid "Title (optional)"
-msgstr "Titre (facultatif)"
+#: ../../Zotlabs/Module/Removeme.php:35
+msgid ""
+"Channel removals are not allowed within 48 hours of changing the account "
+"password."
+msgstr "Il est impossible de supprimer un canal moins de 48 heures après avoir changé le mot de passe d'un compte."
-#: ../../Zotlabs/Module/Editblock.php:133
-msgid "Edit Block"
-msgstr "Modifier le bloc"
+#: ../../Zotlabs/Module/Removeme.php:60
+msgid "Remove This Channel"
+msgstr "Supprimer ce canal"
-#: ../../Zotlabs/Module/Page.php:40 ../../Zotlabs/Module/Block.php:31
-msgid "Invalid item."
-msgstr "Élément invalide."
+#: ../../Zotlabs/Module/Removeme.php:61
+#: ../../Zotlabs/Module/Removeaccount.php:58
+msgid "WARNING: "
+msgstr "AVERTISSEMENT&nbsp;:"
-#: ../../Zotlabs/Module/Page.php:56 ../../Zotlabs/Module/Cal.php:62
-#: ../../Zotlabs/Module/Block.php:43 ../../Zotlabs/Module/Chanview.php:96
-#: ../../Zotlabs/Module/Wall_upload.php:31
-msgid "Channel not found."
-msgstr "Canal introuvable."
+#: ../../Zotlabs/Module/Removeme.php:61
+msgid "This channel will be completely removed from the network. "
+msgstr "Ce canal sera complètement supprimé du réseau."
-#: ../../Zotlabs/Module/Page.php:131
-msgid ""
-"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod "
-"tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,"
-" quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo "
-"consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse "
-"cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat "
-"non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
-msgstr "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
+#: ../../Zotlabs/Module/Removeme.php:61
+#: ../../Zotlabs/Module/Removeaccount.php:58
+msgid "This action is permanent and can not be undone!"
+msgstr "Cette action est permanente et irréversible&nbsp;!"
-#: ../../Zotlabs/Module/Filer.php:52
-msgid "Save to Folder:"
-msgstr "Classer dans le dossier&nbsp;:"
+#: ../../Zotlabs/Module/Removeme.php:62
+#: ../../Zotlabs/Module/Removeaccount.php:59
+msgid "Please enter your password for verification:"
+msgstr "Merci de saisir votre mot de passe pour vérification&nbsp;:"
-#: ../../Zotlabs/Module/Filer.php:52
-msgid "- select -"
-msgstr "- choisir -"
+#: ../../Zotlabs/Module/Removeme.php:63
+msgid "Remove this channel and all its clones from the network"
+msgstr "Supprimer ce canal ainsi que tous ses clones sur le réseau"
-#: ../../Zotlabs/Module/Filer.php:53 ../../Zotlabs/Module/Admin/Profs.php:74
-#: ../../Zotlabs/Module/Admin/Profs.php:94 ../../Zotlabs/Module/Rbmark.php:32
-#: ../../Zotlabs/Module/Rbmark.php:104 ../../include/widgets.php:202
-#: ../../include/text.php:1005 ../../include/text.php:1017
-msgid "Save"
-msgstr "Enregistrer"
+#: ../../Zotlabs/Module/Removeme.php:63
+msgid ""
+"By default only the instance of the channel located on this hub will be "
+"removed from the network"
+msgstr "Par défaut, seule l'instance du canal présente sur ce hub sera supprimée du réseau"
-#: ../../Zotlabs/Module/Ping.php:254
-msgid "sent you a private message"
-msgstr "vous a envoyé un message privé"
+#: ../../Zotlabs/Module/Removeme.php:64
+#: ../../Zotlabs/Module/Settings/Channel.php:575
+msgid "Remove Channel"
+msgstr "Supprimer le canal"
-#: ../../Zotlabs/Module/Ping.php:302
-msgid "added your channel"
-msgstr "a ajouté votre canal"
+#: ../../Zotlabs/Module/Sharedwithme.php:99
+msgid "Files: shared with me"
+msgstr "Fichiers&nbsp;: partagés avec moi"
-#: ../../Zotlabs/Module/Ping.php:312
-msgid "g A l F d"
-msgstr "g A l F d"
+#: ../../Zotlabs/Module/Sharedwithme.php:100
+#: ../../Zotlabs/Module/Admin/Channels.php:159
+#: ../../Zotlabs/Module/Settings/Oauth.php:89
+#: ../../Zotlabs/Module/Settings/Oauth.php:115
+#: ../../Zotlabs/Module/Wiki.php:172 ../../Zotlabs/Module/Connedit.php:910
+#: ../../Zotlabs/Module/Chat.php:249 ../../Zotlabs/Lib/NativeWikiPage.php:528
+#: ../../Zotlabs/Storage/Browser.php:233
+#: ../../Zotlabs/Widget/Wiki_page_history.php:22
+#: ../../addon/rendezvous/rendezvous.php:172
+#: ../../addon/cdav/Mod_Cdav.php:1136 ../../addon/gitwiki/Mod_Gitwiki.php:158
+msgid "Name"
+msgstr "Nom"
-#: ../../Zotlabs/Module/Ping.php:330
-msgid "[today]"
-msgstr "[aujourd'hui]"
+#: ../../Zotlabs/Module/Sharedwithme.php:101
+msgid "NEW"
+msgstr "NOUVEAU"
-#: ../../Zotlabs/Module/Ping.php:339
-msgid "posted an event"
-msgstr "a publié un événement"
+#: ../../Zotlabs/Module/Sharedwithme.php:102
+#: ../../Zotlabs/Storage/Browser.php:235 ../../include/text.php:1417
+msgid "Size"
+msgstr "Taille"
-#: ../../Zotlabs/Module/Connections.php:56
-#: ../../Zotlabs/Module/Connections.php:161
-#: ../../Zotlabs/Module/Connections.php:250
-msgid "Blocked"
-msgstr "Bloqué(e)"
+#: ../../Zotlabs/Module/Sharedwithme.php:103
+#: ../../Zotlabs/Storage/Browser.php:236
+msgid "Last Modified"
+msgstr "Modifié le"
-#: ../../Zotlabs/Module/Connections.php:61
-#: ../../Zotlabs/Module/Connections.php:168
-#: ../../Zotlabs/Module/Connections.php:249
-msgid "Ignored"
-msgstr "Ignoré(e)"
+#: ../../Zotlabs/Module/Sharedwithme.php:104
+msgid "Remove all files"
+msgstr "Supprimer tous les fichiers"
-#: ../../Zotlabs/Module/Connections.php:66
-#: ../../Zotlabs/Module/Connections.php:182
-#: ../../Zotlabs/Module/Connections.php:248
-msgid "Hidden"
-msgstr "Caché"
+#: ../../Zotlabs/Module/Sharedwithme.php:105
+msgid "Remove this file"
+msgstr "Supprimer ce fichier"
-#: ../../Zotlabs/Module/Connections.php:71
-#: ../../Zotlabs/Module/Connections.php:175
-#: ../../Zotlabs/Module/Connections.php:247
-msgid "Archived"
-msgstr "Archivé"
+#: ../../Zotlabs/Module/Setup.php:176
+msgid "$Projectname Server - Setup"
+msgstr "Serveur $Projectname - configuration"
-#: ../../Zotlabs/Module/Connections.php:76
-#: ../../Zotlabs/Module/Connections.php:86 ../../Zotlabs/Module/Menu.php:116
-#: ../../include/conversation.php:1724
-msgid "New"
-msgstr "Nouveautés"
+#: ../../Zotlabs/Module/Setup.php:180
+msgid "Could not connect to database."
+msgstr "Impossible de se connecter à la base de données."
-#: ../../Zotlabs/Module/Connections.php:92
-#: ../../Zotlabs/Module/Connections.php:107
-#: ../../Zotlabs/Module/Connedit.php:674 ../../include/widgets.php:544
-msgid "All"
-msgstr "Tous"
+#: ../../Zotlabs/Module/Setup.php:184
+msgid ""
+"Could not connect to specified site URL. Possible SSL certificate or DNS "
+"issue."
+msgstr "Impossible de se connecter à l'URL indiquée. Problème potentiel de certificat SSL/TLS ou de DNS."
-#: ../../Zotlabs/Module/Connections.php:138
-msgid "New Connections"
-msgstr "Nouveaux contacts"
+#: ../../Zotlabs/Module/Setup.php:191
+msgid "Could not create table."
+msgstr "Impossible de créer la table."
-#: ../../Zotlabs/Module/Connections.php:141
-msgid "Show pending (new) connections"
-msgstr "Voir les (nouveaux) contacts en attente"
+#: ../../Zotlabs/Module/Setup.php:196
+msgid "Your site database has been installed."
+msgstr "La base de données de votre site a été installée."
-#: ../../Zotlabs/Module/Connections.php:145
-#: ../../Zotlabs/Module/Profperm.php:140
-msgid "All Connections"
-msgstr "Tous les contacts"
+#: ../../Zotlabs/Module/Setup.php:200
+msgid ""
+"You may need to import the file \"install/schema_xxx.sql\" manually using a "
+"database client."
+msgstr "Vous pourriez avoir besoin d'importer le fichier \"install/schema_xxx.sql\" manuellement via un client de base de données (ex: phpmyadmin)."
-#: ../../Zotlabs/Module/Connections.php:148
-msgid "Show all connections"
-msgstr "Voir tous les contacts"
+#: ../../Zotlabs/Module/Setup.php:201 ../../Zotlabs/Module/Setup.php:263
+#: ../../Zotlabs/Module/Setup.php:748
+msgid "Please see the file \"install/INSTALL.txt\"."
+msgstr "Merci de consulter le fichier \"install/INSTALL.txt\"."
-#: ../../Zotlabs/Module/Connections.php:164
-msgid "Only show blocked connections"
-msgstr "Ne montrer que les contacts bloqués"
+#: ../../Zotlabs/Module/Setup.php:260
+msgid "System check"
+msgstr "Vérification du système"
-#: ../../Zotlabs/Module/Connections.php:171
-msgid "Only show ignored connections"
-msgstr "Ne montrer que les contacts ignorés"
+#: ../../Zotlabs/Module/Setup.php:265
+msgid "Check again"
+msgstr "Re-vérifier"
-#: ../../Zotlabs/Module/Connections.php:178
-msgid "Only show archived connections"
-msgstr "Ne montrer que les contacts archivés"
+#: ../../Zotlabs/Module/Setup.php:287
+msgid "Database connection"
+msgstr "Connexion à la base de données"
-#: ../../Zotlabs/Module/Connections.php:185
-msgid "Only show hidden connections"
-msgstr "Ne montrer que les contacts cachés"
+#: ../../Zotlabs/Module/Setup.php:288
+msgid ""
+"In order to install $Projectname we need to know how to connect to your "
+"database."
+msgstr "Pour installer $Projectname, nous avons besoin de savoir comment se connecter à votre base de données."
-#: ../../Zotlabs/Module/Connections.php:246
-msgid "Pending approval"
-msgstr "En attente de validation"
+#: ../../Zotlabs/Module/Setup.php:289
+msgid ""
+"Please contact your hosting provider or site administrator if you have "
+"questions about these settings."
+msgstr "Merci de contacter votre prestataire d'hébergement ou votre administrateur de site si vous avez des questions à propos de ces paramètres."
-#: ../../Zotlabs/Module/Connections.php:262
-#, php-format
-msgid "%1$s [%2$s]"
-msgstr "%1$s [%2$s]"
+#: ../../Zotlabs/Module/Setup.php:290
+msgid ""
+"The database you specify below should already exist. If it does not, please "
+"create it before continuing."
+msgstr "La base de données que vous allez spécifier doit exister. Si ce n'est pas déjà le cas, merci de la créer avant de continuer."
-#: ../../Zotlabs/Module/Connections.php:263
-msgid "Edit connection"
-msgstr "Modifier le contact"
+#: ../../Zotlabs/Module/Setup.php:294
+msgid "Database Server Name"
+msgstr "Nom du serveur de base de données"
-#: ../../Zotlabs/Module/Connections.php:264
-msgid "Delete connection"
-msgstr "Supprimer le contact"
+#: ../../Zotlabs/Module/Setup.php:294
+msgid "Default is 127.0.0.1"
+msgstr "Par défaut 127.0.0.1"
-#: ../../Zotlabs/Module/Connections.php:273
-msgid "Channel address"
-msgstr "Adresse du canal"
+#: ../../Zotlabs/Module/Setup.php:295
+msgid "Database Port"
+msgstr "Port de la base de données"
-#: ../../Zotlabs/Module/Connections.php:275
-msgid "Network"
-msgstr "Réseau"
+#: ../../Zotlabs/Module/Setup.php:295
+msgid "Communication port number - use 0 for default"
+msgstr "Numéro TCP du port - utilisez 0 pour la valeur par défaut"
-#: ../../Zotlabs/Module/Connections.php:278
-msgid "Call"
-msgstr "Appeler"
+#: ../../Zotlabs/Module/Setup.php:296
+msgid "Database Login Name"
+msgstr "Identifiant de connexion à la Base de Données"
-#: ../../Zotlabs/Module/Connections.php:280
-msgid "Status"
-msgstr "État"
+#: ../../Zotlabs/Module/Setup.php:297
+msgid "Database Login Password"
+msgstr "Mot de passe de connexion à la Base de Données"
-#: ../../Zotlabs/Module/Connections.php:282
-msgid "Connected"
-msgstr "Connecté"
+#: ../../Zotlabs/Module/Setup.php:298
+msgid "Database Name"
+msgstr "Nom de la Base de Données"
-#: ../../Zotlabs/Module/Connections.php:284
-msgid "Approve connection"
-msgstr "Valider le contact"
+#: ../../Zotlabs/Module/Setup.php:299
+msgid "Database Type"
+msgstr "Type de base de données"
-#: ../../Zotlabs/Module/Connections.php:285
-#: ../../Zotlabs/Module/Admin/Accounts.php:171
-msgid "Approve"
-msgstr "Approuver"
+#: ../../Zotlabs/Module/Setup.php:301 ../../Zotlabs/Module/Setup.php:347
+msgid "Site administrator email address"
+msgstr "Adresse de courriel de l'administrateur du site"
-#: ../../Zotlabs/Module/Connections.php:286
-msgid "Ignore connection"
-msgstr "Ignorer le contact"
+#: ../../Zotlabs/Module/Setup.php:301 ../../Zotlabs/Module/Setup.php:347
+msgid ""
+"Your account email address must match this in order to use the web admin "
+"panel."
+msgstr "Votre compte devra utiliser la même adresse de courriel pour pouvoir utiliser l'administration web."
-#: ../../Zotlabs/Module/Connections.php:287
-#: ../../Zotlabs/Module/Connedit.php:602
-msgid "Ignore"
-msgstr "Ignorer"
+#: ../../Zotlabs/Module/Setup.php:302 ../../Zotlabs/Module/Setup.php:349
+msgid "Website URL"
+msgstr "URL du site web"
-#: ../../Zotlabs/Module/Connections.php:288
-msgid "Recent activity"
-msgstr "Activité récente"
+#: ../../Zotlabs/Module/Setup.php:302 ../../Zotlabs/Module/Setup.php:349
+msgid "Please use SSL (https) URL if available."
+msgstr "Veuillez utiliser SSL/TLS (https) si disponible."
-#: ../../Zotlabs/Module/Connections.php:312 ../../Zotlabs/Lib/Apps.php:216
-#: ../../include/text.php:934 ../../include/nav.php:203
-msgid "Connections"
-msgstr "Contacts"
+#: ../../Zotlabs/Module/Setup.php:303 ../../Zotlabs/Module/Setup.php:353
+msgid "Please select a default timezone for your website"
+msgstr "Veuillez choisir un fuseau horaire par défaut pour votre site"
-#: ../../Zotlabs/Module/Connections.php:316 ../../Zotlabs/Module/Search.php:44
-#: ../../Zotlabs/Lib/Apps.php:237 ../../include/acl_selectors.php:213
-#: ../../include/widgets.php:316 ../../include/text.php:1004
-#: ../../include/text.php:1016 ../../include/nav.php:180
-msgid "Search"
-msgstr "Recherche"
+#: ../../Zotlabs/Module/Setup.php:328 ../../Zotlabs/Module/Admin/Site.php:258
+msgid "Basic/Minimal Social Networking"
+msgstr "Réseau social de base"
-#: ../../Zotlabs/Module/Connections.php:317
-msgid "Search your connections"
-msgstr "Chercher parmi vos contacts"
+#: ../../Zotlabs/Module/Setup.php:329 ../../Zotlabs/Module/Admin/Site.php:259
+msgid "Standard Configuration (default)"
+msgstr "Configuration standard par défaut"
-#: ../../Zotlabs/Module/Connections.php:318
-msgid "Connections search"
-msgstr "Chercher des contacts"
+#: ../../Zotlabs/Module/Setup.php:330 ../../Zotlabs/Module/Admin/Site.php:260
+msgid "Professional"
+msgstr "Professionel"
-#: ../../Zotlabs/Module/Connections.php:319
-#: ../../Zotlabs/Module/Directory.php:392
-#: ../../Zotlabs/Module/Directory.php:397 ../../include/contact_widgets.php:23
-msgid "Find"
-msgstr "Trouver"
+#: ../../Zotlabs/Module/Setup.php:336
+msgid "Site settings"
+msgstr "Paramètres du site"
-#: ../../Zotlabs/Module/Cover_photo.php:58
-#: ../../Zotlabs/Module/Profile_photo.php:61
-msgid "Image uploaded but image cropping failed."
-msgstr "L'image a été téléversée, mais le recadrage a échoué."
+#: ../../Zotlabs/Module/Setup.php:351 ../../Zotlabs/Module/Admin/Site.php:289
+msgid "Server Configuration/Role"
+msgstr "Configuration du site."
-#: ../../Zotlabs/Module/Cover_photo.php:134
-#: ../../Zotlabs/Module/Cover_photo.php:181
-msgid "Cover Photos"
-msgstr "Photos de couverture"
+#: ../../Zotlabs/Module/Setup.php:392
+msgid "PHP version 5.5 or greater is required."
+msgstr "PHP version 5.5 ou supérieur est requis"
-#: ../../Zotlabs/Module/Cover_photo.php:154
-#: ../../Zotlabs/Module/Profile_photo.php:135
-msgid "Image resize failed."
-msgstr "Le redimensionnement de l'image a échoué."
+#: ../../Zotlabs/Module/Setup.php:393
+msgid "PHP version"
+msgstr "Version de PHP"
-#: ../../Zotlabs/Module/Cover_photo.php:168
-#: ../../Zotlabs/Module/Profile_photo.php:197 ../../include/photos.php:149
-msgid "Unable to process image"
-msgstr "Impossible de traiter l'image"
+#: ../../Zotlabs/Module/Setup.php:409
+msgid "Could not find a command line version of PHP in the web server PATH."
+msgstr "Impossible de trouver une version CLI de PHP dans le PATH du serveur web."
-#: ../../Zotlabs/Module/Cover_photo.php:192
-#: ../../Zotlabs/Module/Profile_photo.php:232
-msgid "Image upload failed."
-msgstr "Le téléversement de l'image a échoué."
+#: ../../Zotlabs/Module/Setup.php:410
+msgid ""
+"If you don't have a command line version of PHP installed on server, you "
+"will not be able to run background polling via cron."
+msgstr "En l'absence de version CLI de PHP sur votre serveur, vous ne pourrez pas utiliser la synchronisation en arrière-plan via cron."
-#: ../../Zotlabs/Module/Cover_photo.php:210
-#: ../../Zotlabs/Module/Profile_photo.php:251
-msgid "Unable to process image."
-msgstr "Impossible de traîter l'image."
+#: ../../Zotlabs/Module/Setup.php:414
+msgid "PHP executable path"
+msgstr "Chemin vers l'éxecutable PHP"
-#: ../../Zotlabs/Module/Cover_photo.php:233 ../../include/items.php:4276
-msgid "female"
-msgstr "femme"
+#: ../../Zotlabs/Module/Setup.php:414
+msgid ""
+"Enter full path to php executable. You can leave this blank to continue the "
+"installation."
+msgstr "Entrez le chemin complet vers l'exécutable php. Vous pouvez continuer l'installation sans."
-#: ../../Zotlabs/Module/Cover_photo.php:234 ../../include/items.php:4277
-#, php-format
-msgid "%1$s updated her %2$s"
-msgstr "%1$s a mis à jour son %2$s"
+#: ../../Zotlabs/Module/Setup.php:419
+msgid "Command line PHP"
+msgstr "PHP en ligne de commande (CLI)"
-#: ../../Zotlabs/Module/Cover_photo.php:235 ../../include/items.php:4278
-msgid "male"
-msgstr "homme"
+#: ../../Zotlabs/Module/Setup.php:429
+msgid ""
+"Unable to check command line PHP, as shell_exec() is disabled. This is "
+"required."
+msgstr "Impossible de vérifier la ligne de commande PHP, car shell_exec () est désactivé. Ceci est nécessaire."
-#: ../../Zotlabs/Module/Cover_photo.php:236 ../../include/items.php:4279
-#, php-format
-msgid "%1$s updated his %2$s"
-msgstr "%1$s a mis à jour son %2$s"
+#: ../../Zotlabs/Module/Setup.php:432
+msgid ""
+"The command line version of PHP on your system does not have "
+"\"register_argc_argv\" enabled."
+msgstr "La version CLI de PHP sur votre système n'a pas l'option \"register_argc_argv\" activée."
-#: ../../Zotlabs/Module/Cover_photo.php:238 ../../include/items.php:4281
-#, php-format
-msgid "%1$s updated their %2$s"
-msgstr "%1$s a mis a jour sa %2$s"
+#: ../../Zotlabs/Module/Setup.php:433
+msgid "This is required for message delivery to work."
+msgstr "Elle est nécessaire pour la distribution des messages."
-#: ../../Zotlabs/Module/Cover_photo.php:240 ../../include/channel.php:1764
-msgid "cover photo"
-msgstr "Photo principale"
+#: ../../Zotlabs/Module/Setup.php:436
+msgid "PHP register_argc_argv"
+msgstr "PHP register_argc_argv"
-#: ../../Zotlabs/Module/Cover_photo.php:303
-#: ../../Zotlabs/Module/Cover_photo.php:318
-#: ../../Zotlabs/Module/Profile_photo.php:312
-#: ../../Zotlabs/Module/Profile_photo.php:354
-msgid "Photo not available."
-msgstr "Photo inaccessible."
+#: ../../Zotlabs/Module/Setup.php:454
+#, php-format
+msgid ""
+"Your max allowed total upload size is set to %s. Maximum size of one file to"
+" upload is set to %s. You are allowed to upload up to %d files at once."
+msgstr "Votre taille de téléversement maximale totale autorisée est fixée à %s. La taille maximale d'un seul fichier à téléverser est fixée à %s. Vous pouvez téléverser jusqu'à %d fichier(s) à la fois."
-#: ../../Zotlabs/Module/Cover_photo.php:354
-#: ../../Zotlabs/Module/Profile_photo.php:409
-msgid "Upload File:"
-msgstr "Téléverser fichier&nbsp;:"
+#: ../../Zotlabs/Module/Setup.php:459
+msgid "You can adjust these settings in the server php.ini file."
+msgstr "Vous pouvez ajuster ces paramètres dans le fichier php.ini du serveur."
-#: ../../Zotlabs/Module/Cover_photo.php:355
-#: ../../Zotlabs/Module/Profile_photo.php:410
-msgid "Select a profile:"
-msgstr "Choisir un profil&nbsp;:"
+#: ../../Zotlabs/Module/Setup.php:461
+msgid "PHP upload limits"
+msgstr "Limites de téléversement de PHP"
-#: ../../Zotlabs/Module/Cover_photo.php:356
-msgid "Upload Cover Photo"
-msgstr "Téléverser une photo de couverture"
+#: ../../Zotlabs/Module/Setup.php:484
+msgid ""
+"Error: the \"openssl_pkey_new\" function on this system is not able to "
+"generate encryption keys"
+msgstr "Erreur&nbsp;: la fonction \"openssl_pkey_new\" de ce système n'est pas capable de générer des clefs de chiffrement"
-#: ../../Zotlabs/Module/Cover_photo.php:361
-#: ../../Zotlabs/Module/Profile_photo.php:418
-#: ../../Zotlabs/Module/Settings/Channel.php:404
-msgid "or"
-msgstr "ou"
+#: ../../Zotlabs/Module/Setup.php:485
+msgid ""
+"If running under Windows, please see "
+"\"http://www.php.net/manual/en/openssl.installation.php\"."
+msgstr "Si vous êtes sur un serveur Windows, merci de consulter \"http://www.php.net/manual/fr/openssl.installation.php\"."
-#: ../../Zotlabs/Module/Cover_photo.php:361
-#: ../../Zotlabs/Module/Profile_photo.php:418
-msgid "skip this step"
-msgstr "passer cette étape"
+#: ../../Zotlabs/Module/Setup.php:488
+msgid "Generate encryption keys"
+msgstr "Générer les clefs de chiffrement"
-#: ../../Zotlabs/Module/Cover_photo.php:361
-#: ../../Zotlabs/Module/Profile_photo.php:418
-msgid "select a photo from your photo albums"
-msgstr "choisir une photo dans vos albums"
+#: ../../Zotlabs/Module/Setup.php:505
+msgid "libCurl PHP module"
+msgstr "module PHP libCurl"
-#: ../../Zotlabs/Module/Cover_photo.php:377
-#: ../../Zotlabs/Module/Profile_photo.php:437
-msgid "Crop Image"
-msgstr "Recadrer l'image"
+#: ../../Zotlabs/Module/Setup.php:506
+msgid "GD graphics PHP module"
+msgstr "module PHP GD graphics"
-#: ../../Zotlabs/Module/Cover_photo.php:378
-#: ../../Zotlabs/Module/Profile_photo.php:438
-msgid "Please adjust the image cropping for optimum viewing."
-msgstr "Merci d'ajuster le cadre pour une visualisation optimale."
+#: ../../Zotlabs/Module/Setup.php:507
+msgid "OpenSSL PHP module"
+msgstr "module PHP OpenSSL"
-#: ../../Zotlabs/Module/Cover_photo.php:380
-#: ../../Zotlabs/Module/Profile_photo.php:440
-msgid "Done Editing"
-msgstr "J'ai terminé"
+#: ../../Zotlabs/Module/Setup.php:508
+msgid "PDO database PHP module"
+msgstr "module PDO de la base de données PHP"
-#: ../../Zotlabs/Module/Admin/Features.php:55
-#: ../../Zotlabs/Module/Admin/Features.php:56
-#: ../../Zotlabs/Module/Settings/Features.php:38
-msgid "Off"
-msgstr "Inactif"
+#: ../../Zotlabs/Module/Setup.php:509
+msgid "mb_string PHP module"
+msgstr "module PHP mb_string"
-#: ../../Zotlabs/Module/Admin/Features.php:55
-#: ../../Zotlabs/Module/Admin/Features.php:56
-#: ../../Zotlabs/Module/Settings/Features.php:38
-msgid "On"
-msgstr "Actif"
+#: ../../Zotlabs/Module/Setup.php:510
+msgid "xml PHP module"
+msgstr "module PHP xml"
-#: ../../Zotlabs/Module/Admin/Features.php:56
-#, php-format
-msgid "Lock feature %s"
-msgstr "Verrouiller fonctionnalité %s"
+#: ../../Zotlabs/Module/Setup.php:514 ../../Zotlabs/Module/Setup.php:516
+msgid "Apache mod_rewrite module"
+msgstr "module Apache mod_rewrite"
-#: ../../Zotlabs/Module/Admin/Features.php:64
-msgid "Manage Additional Features"
-msgstr "Gérer les fonctionnalités additionnelles"
+#: ../../Zotlabs/Module/Setup.php:514
+msgid ""
+"Error: Apache webserver mod-rewrite module is required but not installed."
+msgstr "Erreur&nbsp;: le module mod-rewrite du serveur web Apache est requis, mais pas installé."
-#: ../../Zotlabs/Module/Admin/Logs.php:28
-msgid "Log settings updated."
-msgstr "Paramètres du journal mis à jour."
+#: ../../Zotlabs/Module/Setup.php:520 ../../Zotlabs/Module/Setup.php:523
+msgid "exec"
+msgstr "exécuter"
-#: ../../Zotlabs/Module/Admin/Logs.php:83 ../../include/widgets.php:1618
-#: ../../include/widgets.php:1628
-msgid "Logs"
-msgstr "Journaux"
+#: ../../Zotlabs/Module/Setup.php:520
+msgid ""
+"Error: exec is required but is either not installed or has been disabled in "
+"php.ini"
+msgstr "Erreur: exec est requis mais soit il n'est pas installé, soit il a été désactivé dans php.ini"
-#: ../../Zotlabs/Module/Admin/Logs.php:85
-msgid "Clear"
-msgstr "Vider"
+#: ../../Zotlabs/Module/Setup.php:526 ../../Zotlabs/Module/Setup.php:529
+msgid "shell_exec"
+msgstr "shell_exec"
-#: ../../Zotlabs/Module/Admin/Logs.php:91
-msgid "Debugging"
-msgstr "Débogage"
+#: ../../Zotlabs/Module/Setup.php:526
+msgid ""
+"Error: shell_exec is required but is either not installed or has been "
+"disabled in php.ini"
+msgstr "Erreur: shell_exec est requis mais soit il n'est pas installé, soit il a été désactivé dans php.ini"
-#: ../../Zotlabs/Module/Admin/Logs.php:92
-msgid "Log file"
-msgstr "Fichier du journal"
+#: ../../Zotlabs/Module/Setup.php:534
+msgid "Error: libCURL PHP module required but not installed."
+msgstr "Erreur&nbsp;: le module libCURL de PHP est requis, mais pas installé."
-#: ../../Zotlabs/Module/Admin/Logs.php:92
+#: ../../Zotlabs/Module/Setup.php:538
msgid ""
-"Must be writable by web server. Relative to your top-level webserver "
-"directory."
-msgstr "Doit être permettre d'écrire par le serveur web. En relation avec le répertoire de votre site."
+"Error: GD graphics PHP module with JPEG support required but not installed."
+msgstr "Erreur&nbsp;: le module GD de PHP avec support JPEG est requis, mais pas installé."
-#: ../../Zotlabs/Module/Admin/Logs.php:93
-msgid "Log level"
-msgstr "Niveau de journalisation"
+#: ../../Zotlabs/Module/Setup.php:542
+msgid "Error: openssl PHP module required but not installed."
+msgstr "Erreur&nbsp;: le module openssl de PHP est requis, mais pas installé."
-#: ../../Zotlabs/Module/Admin/Profs.php:69
-msgid "New Profile Field"
-msgstr "Nouveau champ de profil"
+#: ../../Zotlabs/Module/Setup.php:546
+msgid "Error: PDO database PHP module required but not installed."
+msgstr "Erreur: le module PDO de base de données PHP est requis mais n'est pas installé."
-#: ../../Zotlabs/Module/Admin/Profs.php:70
-#: ../../Zotlabs/Module/Admin/Profs.php:90
-msgid "Field nickname"
-msgstr "Nom court du champ"
+#: ../../Zotlabs/Module/Setup.php:550
+msgid "Error: mb_string PHP module required but not installed."
+msgstr "Erreur&nbsp;: le module mb_string de PHP est requis, mais pas installé."
-#: ../../Zotlabs/Module/Admin/Profs.php:70
-#: ../../Zotlabs/Module/Admin/Profs.php:90
-msgid "System name of field"
-msgstr "Nom système du champ"
+#: ../../Zotlabs/Module/Setup.php:554
+msgid "Error: xml PHP module required for DAV but not installed."
+msgstr "Erreur&nbsp;: le module xml de PHP est requis pour le DAV, mais pas installé."
-#: ../../Zotlabs/Module/Admin/Profs.php:71
-#: ../../Zotlabs/Module/Admin/Profs.php:91
-msgid "Input type"
-msgstr "Type de champ"
+#: ../../Zotlabs/Module/Setup.php:572
+msgid ""
+"The web installer needs to be able to create a file called \".htconfig.php\""
+" in the top folder of your web server and it is unable to do so."
+msgstr "L'installeur web a besoin de créer un fichier \".htconfig.php\" à la racine de votre serveur web, mais en est incapable."
-#: ../../Zotlabs/Module/Admin/Profs.php:72
-#: ../../Zotlabs/Module/Admin/Profs.php:92
-msgid "Field Name"
-msgstr "Nom du champ"
+#: ../../Zotlabs/Module/Setup.php:573
+msgid ""
+"This is most often a permission setting, as the web server may not be able "
+"to write files in your folder - even if you can."
+msgstr "C'est généralement lié à un problème de droits, à cause duquel le serveur web est interdit d'écriture dans le répertoire concerné - alors que votre propre utilisateur a le droit."
-#: ../../Zotlabs/Module/Admin/Profs.php:72
-#: ../../Zotlabs/Module/Admin/Profs.php:92
-msgid "Label on profile pages"
-msgstr "Étiquette sur les pages de profil"
+#: ../../Zotlabs/Module/Setup.php:574
+msgid ""
+"At the end of this procedure, we will give you a text to save in a file "
+"named .htconfig.php in your Red top folder."
+msgstr "Au terme de cette procédure, nous vous transmettrons un texte à sauvegarder dans un fichier nommé .htconfig.php, à la racine de votre installation de $Projectname."
-#: ../../Zotlabs/Module/Admin/Profs.php:73
-#: ../../Zotlabs/Module/Admin/Profs.php:93
-msgid "Help text"
-msgstr "Aide à la saisie"
+#: ../../Zotlabs/Module/Setup.php:575
+msgid ""
+"You can alternatively skip this procedure and perform a manual installation."
+" Please see the file \"install/INSTALL.txt\" for instructions."
+msgstr "Autrement, vous pouvez contourner toute cette procédure et réaliser l'installation manuellement. Merci de consulter le fichier \"install/INSTALL.txt\" pour les instructions détaillées."
-#: ../../Zotlabs/Module/Admin/Profs.php:73
-#: ../../Zotlabs/Module/Admin/Profs.php:93
-msgid "Additional info (optional)"
-msgstr "Informations additionnelles (facultatif)"
+#: ../../Zotlabs/Module/Setup.php:578
+msgid ".htconfig.php is writable"
+msgstr "Le fichier .htconfig.php est accessible en écriture"
-#: ../../Zotlabs/Module/Admin/Profs.php:83
-msgid "Field definition not found"
-msgstr "Définition du champ introuvable"
+#: ../../Zotlabs/Module/Setup.php:592
+msgid ""
+"This software uses the Smarty3 template engine to render its web views. "
+"Smarty3 compiles templates to PHP to speed up rendering."
+msgstr "Ce logiciel utilise Smarty3 comme moteur de modèles pour afficher ses vues Web. Smarty3 compile ses modèles en PHP pour accélérer le rendu."
-#: ../../Zotlabs/Module/Admin/Profs.php:89
-msgid "Edit Profile Field"
-msgstr "Modifier le champ de profil"
+#: ../../Zotlabs/Module/Setup.php:593
+#, php-format
+msgid ""
+"In order to store these compiled templates, the web server needs to have "
+"write access to the directory %s under the top level web folder."
+msgstr "Afin de stocker ces modèles compilés, le serveur Web doit disposer d'un accès en écriture au répertoire %s selon le dossier Web racine."
-#: ../../Zotlabs/Module/Admin/Profs.php:147 ../../include/widgets.php:1599
-msgid "Profile Fields"
-msgstr "Champs de profil"
+#: ../../Zotlabs/Module/Setup.php:594 ../../Zotlabs/Module/Setup.php:615
+msgid ""
+"Please ensure that the user that your web server runs as (e.g. www-data) has"
+" write access to this folder."
+msgstr "Merci de vous assurer que l'utilisateur sous lequel le serveur web tourne (le plus souvent, www-data) a bien l'autorisation d'écrire dans ce répertoire."
-#: ../../Zotlabs/Module/Admin/Profs.php:148
-msgid "Basic Profile Fields"
-msgstr "Champs de profil de base"
+#: ../../Zotlabs/Module/Setup.php:595
+#, php-format
+msgid ""
+"Note: as a security measure, you should give the web server write access to "
+"%s only--not the template files (.tpl) that it contains."
+msgstr "Note: Comme mesure de sécurité, assurez vous de donner les droits d'écriture au serveur web sur %s uniquement, pas sur les fichiers individuels (.tpl) qu'il contient."
-#: ../../Zotlabs/Module/Admin/Profs.php:149
-msgid "Advanced Profile Fields"
-msgstr "Champs de profil avancés"
+#: ../../Zotlabs/Module/Setup.php:598
+#, php-format
+msgid "%s is writable"
+msgstr "Permission d'écriture sur %s activée"
-#: ../../Zotlabs/Module/Admin/Profs.php:149
-msgid "(In addition to basic fields)"
-msgstr "(en plus des champs de base)"
+#: ../../Zotlabs/Module/Setup.php:614
+msgid ""
+"This software uses the store directory to save uploaded files. The web "
+"server needs to have write access to the store directory under the top level"
+" web folder"
+msgstr "Ce logiciel utilise le répertoire de stockage pour enregistrer les fichiers téléversés. Le serveur Web doit disposer d'un accès en écriture au répertoire de stockage selon le dossier web racine."
-#: ../../Zotlabs/Module/Admin/Profs.php:151
-msgid "All available fields"
-msgstr "Tous les champs disponibles"
+#: ../../Zotlabs/Module/Setup.php:618
+msgid "store is writable"
+msgstr "'store' est accessible en écriture"
-#: ../../Zotlabs/Module/Admin/Profs.php:152
-msgid "Custom Fields"
-msgstr "Champs personnalisés"
+#: ../../Zotlabs/Module/Setup.php:650
+msgid ""
+"SSL certificate cannot be validated. Fix certificate or disable https access"
+" to this site."
+msgstr "Le certificat SSL/TLS n'a pas pu être validé. Merci de le corriger, ou de désactiver l'accès https à ce site (non recommandé)."
-#: ../../Zotlabs/Module/Admin/Profs.php:156
-msgid "Create Custom Field"
-msgstr "Créer un champ personnalisé"
+#: ../../Zotlabs/Module/Setup.php:651
+msgid ""
+"If you have https access to your website or allow connections to TCP port "
+"443 (the https: port), you MUST use a browser-valid certificate. You MUST "
+"NOT use self-signed certificates!"
+msgstr "Si votre serveur accepte les connexions https ou s'il permet les connexions sur le port TCP 443 (le port utilisé par le protocole https), vous DEVEZ utiliser un certificat valide. Vous ne DEVEZ PAS utiliser un certificat que vous avez vous-mêmes signé&nbsp;!"
-#: ../../Zotlabs/Module/Admin/Security.php:77
+#: ../../Zotlabs/Module/Setup.php:652
msgid ""
-"By default, unfiltered HTML is allowed in embedded media. This is inherently"
-" insecure."
-msgstr "Par défaut le code HTML est autorisé pour les média par exemple les vidéos embarquées. Cependant cela peut poser un faille de sécurité."
+"This restriction is incorporated because public posts from you may for "
+"example contain references to images on your own hub."
+msgstr "Nous avons ajouté cette contrainte pour éviter que vos publications publiques ne fassent référence par exemple à des images sur votre propre hub."
-#: ../../Zotlabs/Module/Admin/Security.php:80
+#: ../../Zotlabs/Module/Setup.php:653
msgid ""
-"The recommended setting is to only allow unfiltered HTML from the following "
-"sites:"
-msgstr "Ce paramétrage autorisant le HTML pour les sites suivants."
+"If your certificate is not recognized, members of other sites (who may "
+"themselves have valid certificates) will get a warning message on their own "
+"site complaining about security issues."
+msgstr "Si votre certificat n'est pas reconnu, les membres des autres sites (qui eux peuvent avoir des certificats valides) recevront des messages d'avertissement sur leur propre site se plaignant de problèmes de sécurité."
-#: ../../Zotlabs/Module/Admin/Security.php:81
+#: ../../Zotlabs/Module/Setup.php:654
msgid ""
-"https://youtube.com/<br />https://www.youtube.com/<br />https://youtu.be/<br"
-" />https://vimeo.com/<br />https://soundcloud.com/<br />"
-msgstr "https://youtube.com/<br />https://www.youtube.com/<br />https://youtu.be/<br />https://vimeo.com/<br />https://soundcloud.com/<br />"
+"This can cause usability issues elsewhere (not just on your own site) so we "
+"must insist on this requirement."
+msgstr "Ceci peut causer des problèmes d'ergonomie ailleurs (pas seulement sur votre site), nous devons donc insister sur ce prérequis."
-#: ../../Zotlabs/Module/Admin/Security.php:82
+#: ../../Zotlabs/Module/Setup.php:655
msgid ""
-"All other embedded content will be filtered, <strong>unless</strong> "
-"embedded content from that site is explicitly blocked."
-msgstr "Les contenus html seront filtrés <strong>sauf</strong> ceux des sites explicitement bloqués."
+"Providers are available that issue free certificates which are browser-"
+"valid."
+msgstr "Il existe des autorités de certification qui vous fourniront gratuitement un certificat valide."
-#: ../../Zotlabs/Module/Admin/Security.php:87 ../../include/widgets.php:1594
-msgid "Security"
-msgstr "Sécurité"
+#: ../../Zotlabs/Module/Setup.php:657
+msgid ""
+"If you are confident that the certificate is valid and signed by a trusted "
+"authority, check to see if you have failed to install an intermediate cert. "
+"These are not normally required by browsers, but are required for server-to-"
+"server communications."
+msgstr "Si vous êtes certain que le certificat est valide et signé par une autorité de confiance, vérifiez si l'installation d'un certificat intermédiaire aurait échoué. Ceux-ci ne sont normalement pas requis par les navigateurs, mais ils sont requis pour les communications entre serveurs."
-#: ../../Zotlabs/Module/Admin/Security.php:89
-msgid "Block public"
-msgstr "Bloquer \"public\""
+#: ../../Zotlabs/Module/Setup.php:659
+msgid "SSL certificate validation"
+msgstr "Validation du certificat SSL/TLS"
-#: ../../Zotlabs/Module/Admin/Security.php:89
+#: ../../Zotlabs/Module/Setup.php:665
msgid ""
-"Check to block public access to all otherwise public personal pages on this "
-"site unless you are currently authenticated."
-msgstr "Sélectionner pour ne permettre l'accès aux pages personnelles \"publiques\" du site qu'aux personnes authentifiées, pas aux personnes anonymes du web."
+"Url rewrite in .htaccess is not working. Check your server "
+"configuration.Test: "
+msgstr "La réécriture d'URL définie dans le .htaccess ne fonctionne pas. Vérifiez votre configuration serveur. Test&nbsp;:"
-#: ../../Zotlabs/Module/Admin/Security.php:90
-msgid "Set \"Transport Security\" HTTP header"
-msgstr "Paramétrer \"Transport Security\" pour l'entête HTTP"
+#: ../../Zotlabs/Module/Setup.php:668
+msgid "Url rewrite is working"
+msgstr "La réécriture d'URL fonctionne"
-#: ../../Zotlabs/Module/Admin/Security.php:91
-msgid "Set \"Content Security Policy\" HTTP header"
-msgstr "Paramétrer \"Content Security Policy\" pour l'entête HTTP"
+#: ../../Zotlabs/Module/Setup.php:682
+msgid ""
+"The database configuration file \".htconfig.php\" could not be written. "
+"Please use the enclosed text to create a configuration file in your web "
+"server root."
+msgstr "Le fichier de configuration de la base de données - \".htconfig.php\" - ne peut être écrit. Merci de copier le texte généré dans un fichier à ce nom, à la racine de votre serveur web."
-#: ../../Zotlabs/Module/Admin/Security.php:92
-msgid "Allowed email domains"
-msgstr "Domaines de courriels autorisés"
+#: ../../Zotlabs/Module/Setup.php:706
+#: ../../addon/rendezvous/rendezvous.php:401 ../../addon/cdav/cdav.php:41
+msgid "Errors encountered creating database tables."
+msgstr "Erreurs rencontrées pendant la création de tables de BDD."
-#: ../../Zotlabs/Module/Admin/Security.php:92
+#: ../../Zotlabs/Module/Setup.php:746
+msgid "<h1>What next</h1>"
+msgstr "<h1>Et maintenant</h1>"
+
+#: ../../Zotlabs/Module/Setup.php:747
msgid ""
-"Comma separated list of domains which are allowed in email addresses for "
-"registrations to this site. Wildcards are accepted. Empty to allow any "
-"domains"
-msgstr "Liste de noms de domaines séparés par des virgules dont les adresses de courriel seront autorisées lors de l'inscription à ce site. Les caractères génériques (*) sont acceptés. Laissez vide pour accepter tous les domaines."
+"IMPORTANT: You will need to [manually] setup a scheduled task for the "
+"poller."
+msgstr "IMPORTANT&nbsp;: Vous devez créer [manuellement] une tâche planifiée pour les mises à jour du réseau."
-#: ../../Zotlabs/Module/Admin/Security.php:93
-msgid "Not allowed email domains"
-msgstr "Domaines de courriel non autorisés"
+#: ../../Zotlabs/Module/Connect.php:61 ../../Zotlabs/Module/Connect.php:109
+msgid "Continue"
+msgstr "Continuer"
-#: ../../Zotlabs/Module/Admin/Security.php:93
-msgid ""
-"Comma separated list of domains which are not allowed in email addresses for"
-" registrations to this site. Wildcards are accepted. Empty to allow any "
-"domains, unless allowed domains have been defined."
-msgstr "Liste de noms de domaines - séparés par des virgules - dont les adresses de courriel ne seront pas autorisées lors de l'inscription à ce site. Les caractères génériques (*) sont acceptés. Laissez vide pour accepter tous les domaines, sauf si des domaines autorisés ont été définis."
+#: ../../Zotlabs/Module/Connect.php:90
+msgid "Premium Channel Setup"
+msgstr "Configuration du canal VIP"
-#: ../../Zotlabs/Module/Admin/Security.php:94
-msgid "Allow communications only from these sites"
-msgstr "N'autorisez que les communications venant de ces sites"
+#: ../../Zotlabs/Module/Connect.php:92
+msgid "Enable premium channel connection restrictions"
+msgstr "Activer les restrictions liées au canal VIP"
-#: ../../Zotlabs/Module/Admin/Security.php:94
+#: ../../Zotlabs/Module/Connect.php:93
msgid ""
-"One site per line. Leave empty to allow communication from anywhere by "
-"default"
-msgstr "Un site par ligne. Laisser vide pour autoriser les communications de tous les sites, par défaut."
+"Please enter your restrictions or conditions, such as paypal receipt, usage "
+"guidelines, etc."
+msgstr "Merci de saisir les restrictions et/ou conditions - reçu Paypal, transaction Bitcoin, ligne de conduite, ..."
-#: ../../Zotlabs/Module/Admin/Security.php:95
-msgid "Block communications from these sites"
-msgstr "Bloquer les communications de ces sites"
+#: ../../Zotlabs/Module/Connect.php:95 ../../Zotlabs/Module/Connect.php:115
+msgid ""
+"This channel may require additional steps or acknowledgement of the "
+"following conditions prior to connecting:"
+msgstr "Avant d'autoriser la mise en relation, ce canal attire votre attention sur les conditions suivantes&nbsp;:"
-#: ../../Zotlabs/Module/Admin/Security.php:96
-msgid "Allow communications only from these channels"
-msgstr "N'autoriser que les communications de ces canaux"
+#: ../../Zotlabs/Module/Connect.php:96
+msgid ""
+"Potential connections will then see the following text before proceeding:"
+msgstr "Les contacts potentiels verront ce qui suit avant de pouvoir continuer&nbsp;:"
-#: ../../Zotlabs/Module/Admin/Security.php:96
+#: ../../Zotlabs/Module/Connect.php:97 ../../Zotlabs/Module/Connect.php:118
msgid ""
-"One channel (hash) per line. Leave empty to allow from any channel by "
-"default"
-msgstr "Un canal (adresse) par ligne. Laisser vide pour autoriser les communications de tous les canaux, par défaut"
+"By continuing, I certify that I have complied with any instructions provided"
+" on this page."
+msgstr "En continuant, je certifie que je me suis conformé à toutes les instructions indiquées sur cette page."
-#: ../../Zotlabs/Module/Admin/Security.php:97
-msgid "Block communications from these channels"
-msgstr "Bloquer les communications de ces canaux"
+#: ../../Zotlabs/Module/Connect.php:106
+msgid "(No specific instructions have been provided by the channel owner.)"
+msgstr "(Aucune instruction spécifique n'a été fournie par le propriétaire du canal.)"
-#: ../../Zotlabs/Module/Admin/Security.php:98
-msgid "Only allow embeds from secure (SSL) websites and links."
-msgstr "Seuls les sites et liens sécurisés sont autorisé pour intégrer du code HTML"
+#: ../../Zotlabs/Module/Connect.php:114
+msgid "Restricted or Premium Channel"
+msgstr "Canal VIP ou restreint"
-#: ../../Zotlabs/Module/Admin/Security.php:99
-msgid "Allow unfiltered embedded HTML content only from these domains"
-msgstr "Autoriser le contenu HTML embarqué uniquement à partir de ces domaines"
+#: ../../Zotlabs/Module/Admin/Queue.php:35
+msgid "Queue Statistics"
+msgstr "Statistiques de file d'attente"
-#: ../../Zotlabs/Module/Admin/Security.php:99
-msgid "One site per line. By default embedded content is filtered."
-msgstr "Un site par ligne. Par défaut le contenu embarqué est filtré."
+#: ../../Zotlabs/Module/Admin/Queue.php:36
+msgid "Total Entries"
+msgstr "Nombre d'entrées total"
-#: ../../Zotlabs/Module/Admin/Security.php:100
-msgid "Block embedded HTML from these domains"
-msgstr "Bloquer le HTML embarqué à partir de ces domaines"
+#: ../../Zotlabs/Module/Admin/Queue.php:37
+msgid "Priority"
+msgstr "Priorité"
-#: ../../Zotlabs/Module/Admin/Themes.php:18
-msgid "Theme settings updated."
-msgstr "Paramètres du thème mis à jour."
+#: ../../Zotlabs/Module/Admin/Queue.php:38
+msgid "Destination URL"
+msgstr "URL de destination"
-#: ../../Zotlabs/Module/Admin/Themes.php:58
-msgid "No themes found."
-msgstr "Aucun thème trouvé."
+#: ../../Zotlabs/Module/Admin/Queue.php:39
+msgid "Mark hub permanently offline"
+msgstr "Marquer le hub comme étant hors ligne de manière permanente"
+
+#: ../../Zotlabs/Module/Admin/Queue.php:40
+msgid "Empty queue for this hub"
+msgstr "Vider la file d'attente pour ce hub"
+
+#: ../../Zotlabs/Module/Admin/Queue.php:41
+msgid "Last known contact"
+msgstr "Dernier contact connu"
+
+#: ../../Zotlabs/Module/Admin/Features.php:55
+#: ../../Zotlabs/Module/Admin/Features.php:56
+#: ../../Zotlabs/Module/Settings/Features.php:38
+msgid "Off"
+msgstr "Inactif"
+
+#: ../../Zotlabs/Module/Admin/Features.php:55
+#: ../../Zotlabs/Module/Admin/Features.php:56
+#: ../../Zotlabs/Module/Settings/Features.php:38
+msgid "On"
+msgstr "Actif"
+
+#: ../../Zotlabs/Module/Admin/Features.php:56
+#, php-format
+msgid "Lock feature %s"
+msgstr "Verrouiller fonctionnalité %s"
+
+#: ../../Zotlabs/Module/Admin/Features.php:64
+msgid "Manage Additional Features"
+msgstr "Gérer les fonctionnalités additionnelles"
+
+#: ../../Zotlabs/Module/Admin/Dbsync.php:19
+msgid "Update has been marked successful"
+msgstr "La mise à jour a été marquée comme réussie"
+
+#: ../../Zotlabs/Module/Admin/Dbsync.php:29
+#, php-format
+msgid "Executing %s failed. Check system logs."
+msgstr "L'éxecution de %s a échoué. Merci de vérifier les journaux du système."
+
+#: ../../Zotlabs/Module/Admin/Dbsync.php:32
+#, php-format
+msgid "Update %s was successfully applied."
+msgstr "La mise à jour %s a été appliquée avec succès."
+
+#: ../../Zotlabs/Module/Admin/Dbsync.php:36
+#, php-format
+msgid "Update %s did not return a status. Unknown if it succeeded."
+msgstr "La mise à jour %s n'a pas retourné d'information. Impossible de savoir si elle a réussi ou non."
+
+#: ../../Zotlabs/Module/Admin/Dbsync.php:39
+#, php-format
+msgid "Update function %s could not be found."
+msgstr "La fonction de mise à jour %s est introuvable."
+
+#: ../../Zotlabs/Module/Admin/Dbsync.php:55
+msgid "No failed updates."
+msgstr "Aucune mise à jour défaillante."
+
+#: ../../Zotlabs/Module/Admin/Dbsync.php:59
+msgid "Failed Updates"
+msgstr "Mises à jour défaillantes"
+
+#: ../../Zotlabs/Module/Admin/Dbsync.php:61
+msgid "Mark success (if update was manually applied)"
+msgstr "Marquer comme réussie (si la mise à jour a été réalisée manuellement)"
+
+#: ../../Zotlabs/Module/Admin/Dbsync.php:62
+msgid "Attempt to execute this update step automatically"
+msgstr "Tenter de réaliser cette étape de mise à jour automatiquement"
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:259
+#: ../../Zotlabs/Module/Admin/Themes.php:72 ../../Zotlabs/Module/Thing.php:89
+#: ../../Zotlabs/Module/Viewsrc.php:24 ../../Zotlabs/Module/Display.php:35
+#: ../../Zotlabs/Module/Filestorage.php:32 ../../Zotlabs/Module/Admin.php:60
+#: ../../include/items.php:3378
+msgid "Item not found."
+msgstr "Élément introuvable"
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:289
+#, php-format
+msgid "Plugin %s disabled."
+msgstr "Greffon %s désactivé."
-#: ../../Zotlabs/Module/Admin/Themes.php:93
-#: ../../Zotlabs/Module/Admin/Plugins.php:305
+#: ../../Zotlabs/Module/Admin/Plugins.php:294
+#, php-format
+msgid "Plugin %s enabled."
+msgstr "Greffon %s activé."
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:310
+#: ../../Zotlabs/Module/Admin/Themes.php:95
msgid "Disable"
msgstr "Désactiver"
-#: ../../Zotlabs/Module/Admin/Themes.php:95
-#: ../../Zotlabs/Module/Admin/Plugins.php:308
+#: ../../Zotlabs/Module/Admin/Plugins.php:313
+#: ../../Zotlabs/Module/Admin/Themes.php:97
msgid "Enable"
msgstr "Activer"
-#: ../../Zotlabs/Module/Admin/Themes.php:114
-msgid "Screenshot"
-msgstr "Capture d'écran"
+#: ../../Zotlabs/Module/Admin/Plugins.php:341
+#: ../../Zotlabs/Module/Admin/Plugins.php:436
+#: ../../Zotlabs/Module/Admin/Accounts.php:164
+#: ../../Zotlabs/Module/Admin/Logs.php:82
+#: ../../Zotlabs/Module/Admin/Channels.php:145
+#: ../../Zotlabs/Module/Admin/Themes.php:122
+#: ../../Zotlabs/Module/Admin/Themes.php:156
+#: ../../Zotlabs/Module/Admin/Site.php:277
+#: ../../Zotlabs/Module/Admin/Security.php:86
+#: ../../Zotlabs/Module/Admin.php:137
+msgid "Administration"
+msgstr "Administration"
-#: ../../Zotlabs/Module/Admin/Themes.php:121
-#: ../../Zotlabs/Module/Admin/Themes.php:155 ../../include/widgets.php:1597
-msgid "Themes"
-msgstr "Thèmes"
+#: ../../Zotlabs/Module/Admin/Plugins.php:342
+#: ../../Zotlabs/Module/Admin/Plugins.php:437
+#: ../../Zotlabs/Widget/Admin.php:27
+msgid "Plugins"
+msgstr "Greffons"
-#: ../../Zotlabs/Module/Admin/Themes.php:122
-#: ../../Zotlabs/Module/Admin/Plugins.php:338
+#: ../../Zotlabs/Module/Admin/Plugins.php:343
+#: ../../Zotlabs/Module/Admin/Themes.php:124
msgid "Toggle"
msgstr "(Dés)activer"
-#: ../../Zotlabs/Module/Admin/Themes.php:123
-#: ../../Zotlabs/Module/Admin/Plugins.php:339 ../../Zotlabs/Lib/Apps.php:223
-#: ../../include/widgets.php:699 ../../include/nav.php:225
+#: ../../Zotlabs/Module/Admin/Plugins.php:344
+#: ../../Zotlabs/Module/Admin/Themes.php:125 ../../Zotlabs/Lib/Apps.php:223
+#: ../../Zotlabs/Widget/Settings_menu.php:131 ../../include/nav.php:203
msgid "Settings"
msgstr "Paramètres"
-#: ../../Zotlabs/Module/Admin/Themes.php:132
-#: ../../Zotlabs/Module/Admin/Plugins.php:346
+#: ../../Zotlabs/Module/Admin/Plugins.php:351
+#: ../../Zotlabs/Module/Admin/Themes.php:134
msgid "Author: "
msgstr "Auteur&nbsp;:"
-#: ../../Zotlabs/Module/Admin/Themes.php:133
-#: ../../Zotlabs/Module/Admin/Plugins.php:347
+#: ../../Zotlabs/Module/Admin/Plugins.php:352
+#: ../../Zotlabs/Module/Admin/Themes.php:135
msgid "Maintainer: "
msgstr "Maintenu par&nbsp;:"
-#: ../../Zotlabs/Module/Admin/Themes.php:160
-msgid "[Experimental]"
-msgstr "[Expérimental]"
+#: ../../Zotlabs/Module/Admin/Plugins.php:353
+msgid "Minimum project version: "
+msgstr "Version minimum du projet&nbsp;:"
-#: ../../Zotlabs/Module/Admin/Themes.php:161
-msgid "[Unsupported]"
-msgstr "[Non maintenu]"
+#: ../../Zotlabs/Module/Admin/Plugins.php:354
+msgid "Maximum project version: "
+msgstr "Version maximum du projet&nbsp;:"
-#: ../../Zotlabs/Module/Admin/Account_edit.php:29
-#, php-format
-msgid "Password changed for account %d."
-msgstr "Le mot de passe a été modifié pour le compte %d."
+#: ../../Zotlabs/Module/Admin/Plugins.php:355
+msgid "Minimum PHP version: "
+msgstr "Version minimum de PHP&nbsp;:"
-#: ../../Zotlabs/Module/Admin/Account_edit.php:46
-msgid "Account settings updated."
-msgstr "Paramétrage du compte mis à jour"
+#: ../../Zotlabs/Module/Admin/Plugins.php:356
+msgid "Compatible Server Roles: "
+msgstr "Rôles du serveur "
-#: ../../Zotlabs/Module/Admin/Account_edit.php:61
-msgid "Account not found."
-msgstr "Compte introuvable"
+#: ../../Zotlabs/Module/Admin/Plugins.php:357
+msgid "Requires: "
+msgstr "Requiert&nbsp;:"
-#: ../../Zotlabs/Module/Admin/Account_edit.php:68
-msgid "Account Edit"
-msgstr "Modifier votre compte"
+#: ../../Zotlabs/Module/Admin/Plugins.php:358
+#: ../../Zotlabs/Module/Admin/Plugins.php:442
+msgid "Disabled - version incompatibility"
+msgstr "Désactivé - version incompatible"
-#: ../../Zotlabs/Module/Admin/Account_edit.php:69
-msgid "New Password"
-msgstr "Nouveau mot de passe"
+#: ../../Zotlabs/Module/Admin/Plugins.php:411
+msgid "Enter the public git repository URL of the plugin repo."
+msgstr "Entrer l'URL du dépôt git public pour les greffons"
-#: ../../Zotlabs/Module/Admin/Account_edit.php:70
-msgid "New Password again"
-msgstr "Nouveau mot de passe (encore)"
+#: ../../Zotlabs/Module/Admin/Plugins.php:412
+msgid "Plugin repo git URL"
+msgstr "URL du git pour les plugin"
-#: ../../Zotlabs/Module/Admin/Account_edit.php:71
-msgid "Technical skill level"
-msgstr "Niveau technique"
+#: ../../Zotlabs/Module/Admin/Plugins.php:413
+msgid "Custom repo name"
+msgstr "Nom du dépôt"
-#: ../../Zotlabs/Module/Admin/Account_edit.php:72
-msgid "Account language (for emails)"
-msgstr "Langue de votre compte (pour email)"
+#: ../../Zotlabs/Module/Admin/Plugins.php:413
+msgid "(optional)"
+msgstr "(en option)"
-#: ../../Zotlabs/Module/Admin/Account_edit.php:73
-msgid "Service class"
-msgstr "Classe de service"
+#: ../../Zotlabs/Module/Admin/Plugins.php:414
+msgid "Download Plugin Repo"
+msgstr "Télécharger l'extension"
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:421
+msgid "Install new repo"
+msgstr "Installer un nouveau dépôt"
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:422 ../../Zotlabs/Lib/Apps.php:348
+msgid "Install"
+msgstr "Installer"
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:423
+#: ../../Zotlabs/Module/Settings/Oauth.php:88
+#: ../../Zotlabs/Module/Settings/Oauth.php:114
+#: ../../Zotlabs/Module/Wiki.php:265 ../../Zotlabs/Module/Wiki.php:290
+#: ../../Zotlabs/Module/Connedit.php:928 ../../Zotlabs/Module/Fbrowser.php:66
+#: ../../Zotlabs/Module/Fbrowser.php:88 ../../Zotlabs/Module/Profiles.php:804
+#: ../../Zotlabs/Module/Filer.php:55 ../../Zotlabs/Module/Tagrm.php:15
+#: ../../Zotlabs/Module/Tagrm.php:138 ../../addon/cdav/Mod_Cdav.php:866
+#: ../../addon/cdav/Mod_Cdav.php:1154 ../../addon/js_upload/js_upload.php:46
+#: ../../addon/gitwiki/Mod_Gitwiki.php:244
+#: ../../addon/gitwiki/Mod_Gitwiki.php:267 ../../include/conversation.php:1327
+#: ../../include/conversation.php:1376
+msgid "Cancel"
+msgstr "Annuler"
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:445
+msgid "Manage Repos"
+msgstr "Gérer les dépôts"
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:446
+msgid "Installed Plugin Repositories"
+msgstr "Dépôt des extensions installées"
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:447
+msgid "Install a New Plugin Repository"
+msgstr "Installer un nouveau dépôt pour extensions"
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:453
+#: ../../Zotlabs/Module/Settings/Oauth.php:42
+#: ../../Zotlabs/Module/Settings/Oauth.php:113
+#: ../../Zotlabs/Module/Connedit.php:926 ../../Zotlabs/Module/Profiles.php:802
+#: ../../Zotlabs/Lib/Apps.php:348 ../../addon/cdav/Mod_Cdav.php:1152
+msgid "Update"
+msgstr "Mise à jour"
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:454
+msgid "Switch branch"
+msgstr "Changer de branche"
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:455
+#: ../../Zotlabs/Module/Photos.php:960 ../../Zotlabs/Module/Tagrm.php:137
+#: ../../addon/superblock/superblock.php:116
+msgid "Remove"
+msgstr "Retirer"
#: ../../Zotlabs/Module/Admin/Accounts.php:36
#, php-format
@@ -2073,7 +2173,8 @@ msgid "Account '%s' unblocked"
msgstr "Compte '%s' débloqué"
#: ../../Zotlabs/Module/Admin/Accounts.php:165
-#: ../../Zotlabs/Module/Admin/Accounts.php:178 ../../include/widgets.php:1592
+#: ../../Zotlabs/Module/Admin/Accounts.php:178
+#: ../../Zotlabs/Widget/Admin.php:23
msgid "Accounts"
msgstr "Comptes"
@@ -2092,13 +2193,10 @@ msgstr "Date de la demande"
#: ../../Zotlabs/Module/Admin/Accounts.php:169
#: ../../Zotlabs/Module/Admin/Accounts.php:181
-#: ../../Zotlabs/Module/Connedit.php:871
-#: ../../extend/addon/addon/redred/redred.php:107
-#: ../../extend/addon/addon/rtof/rtof.php:93
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1140
-#: ../../extend/addon/addon/openid/MysqlProvider.php:56
-#: ../../extend/addon/addon/openid/MysqlProvider.php:57
-#: ../../include/network.php:2247
+#: ../../Zotlabs/Module/Connedit.php:914 ../../Zotlabs/Module/Profiles.php:790
+#: ../../addon/cdav/Mod_Cdav.php:1140 ../../addon/openid/MysqlProvider.php:56
+#: ../../addon/openid/MysqlProvider.php:57 ../../addon/rtof/rtof.php:93
+#: ../../addon/redred/redred.php:107 ../../include/network.php:2270
msgid "Email"
msgstr "Courriel"
@@ -2106,17 +2204,22 @@ msgstr "Courriel"
msgid "No registrations."
msgstr "Pas d'inscriptions."
+#: ../../Zotlabs/Module/Admin/Accounts.php:171
+#: ../../Zotlabs/Module/Connections.php:281
+msgid "Approve"
+msgstr "Approuver"
+
#: ../../Zotlabs/Module/Admin/Accounts.php:172
msgid "Deny"
msgstr "Refuser"
#: ../../Zotlabs/Module/Admin/Accounts.php:174
-#: ../../Zotlabs/Module/Connedit.php:594
+#: ../../Zotlabs/Module/Connedit.php:626
msgid "Block"
msgstr "Bloquer"
#: ../../Zotlabs/Module/Admin/Accounts.php:175
-#: ../../Zotlabs/Module/Connedit.php:594
+#: ../../Zotlabs/Module/Connedit.php:626
msgid "Unblock"
msgstr "Débloquer"
@@ -2156,6 +2259,37 @@ msgid ""
"this site will be permanently deleted!\\n\\nAre you sure?"
msgstr "Le compte {0} sera supprimé&nbsp;!\\n\\nTout ce que cet utilisateur a publié sur ce site sera détruit de manière définitive&nbsp;!\\n\\nÊtes-vous sûr&nbsp;?"
+#: ../../Zotlabs/Module/Admin/Logs.php:28
+msgid "Log settings updated."
+msgstr "Paramètres du journal mis à jour."
+
+#: ../../Zotlabs/Module/Admin/Logs.php:83 ../../Zotlabs/Widget/Admin.php:48
+#: ../../Zotlabs/Widget/Admin.php:58
+msgid "Logs"
+msgstr "Journaux"
+
+#: ../../Zotlabs/Module/Admin/Logs.php:85
+msgid "Clear"
+msgstr "Vider"
+
+#: ../../Zotlabs/Module/Admin/Logs.php:91
+msgid "Debugging"
+msgstr "Débogage"
+
+#: ../../Zotlabs/Module/Admin/Logs.php:92
+msgid "Log file"
+msgstr "Fichier du journal"
+
+#: ../../Zotlabs/Module/Admin/Logs.php:92
+msgid ""
+"Must be writable by web server. Relative to your top-level webserver "
+"directory."
+msgstr "Doit être permettre d'écrire par le serveur web. En relation avec le répertoire de votre site."
+
+#: ../../Zotlabs/Module/Admin/Logs.php:93
+msgid "Log level"
+msgstr "Niveau de journalisation"
+
#: ../../Zotlabs/Module/Admin/Channels.php:31
#, php-format
msgid "%s channel censored/uncensored"
@@ -2206,7 +2340,8 @@ msgstr "Code autorisé pour le canal '%s'"
msgid "Channel '%s' code disallowed"
msgstr "Code interdit pour le canal '%s'"
-#: ../../Zotlabs/Module/Admin/Channels.php:146 ../../include/widgets.php:1593
+#: ../../Zotlabs/Module/Admin/Channels.php:146
+#: ../../Zotlabs/Widget/Admin.php:24
msgid "Channels"
msgstr "Canaux"
@@ -2227,7 +2362,7 @@ msgid "Disallow Code"
msgstr "Interdire le code"
#: ../../Zotlabs/Module/Admin/Channels.php:154
-#: ../../include/conversation.php:1815
+#: ../../include/conversation.php:1751
msgid "Channel"
msgstr "Canal"
@@ -2235,13 +2370,6 @@ msgstr "Canal"
msgid "UID"
msgstr "UID"
-#: ../../Zotlabs/Module/Admin/Channels.php:160
-#: ../../Zotlabs/Module/Locs.php:118 ../../Zotlabs/Module/Connedit.php:874
-#: ../../Zotlabs/Module/Profiles.php:503
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1143
-msgid "Address"
-msgstr "Adresse"
-
#: ../../Zotlabs/Module/Admin/Channels.php:162
msgid ""
"Selected channels will be deleted!\\n\\nEverything that was posted in these "
@@ -2254,1264 +2382,2833 @@ msgid ""
"channel on this site will be permanently deleted!\\n\\nAre you sure?"
msgstr "Le canal {0} sera supprimé&nbsp;!\\n\\nTout ce qui a été publié sur ce canal sera définitivement supprimé&nbsp;!\\n\\nÊtes-vous sûr(e)&nbsp;?"
-#: ../../Zotlabs/Module/Admin/Dbsync.php:19
-msgid "Update has been marked successful"
-msgstr "La mise à jour a été marquée comme réussie"
-
-#: ../../Zotlabs/Module/Admin/Dbsync.php:29
-#, php-format
-msgid "Executing %s failed. Check system logs."
-msgstr "L'éxecution de %s a échoué. Merci de vérifier les journaux du système."
-
-#: ../../Zotlabs/Module/Admin/Dbsync.php:32
-#, php-format
-msgid "Update %s was successfully applied."
-msgstr "La mise à jour %s a été appliquée avec succès."
-
-#: ../../Zotlabs/Module/Admin/Dbsync.php:36
-#, php-format
-msgid "Update %s did not return a status. Unknown if it succeeded."
-msgstr "La mise à jour %s n'a pas retourné d'information. Impossible de savoir si elle a réussi ou non."
+#: ../../Zotlabs/Module/Admin/Themes.php:26
+msgid "Theme settings updated."
+msgstr "Paramètres du thème mis à jour."
-#: ../../Zotlabs/Module/Admin/Dbsync.php:39
-#, php-format
-msgid "Update function %s could not be found."
-msgstr "La fonction de mise à jour %s est introuvable."
+#: ../../Zotlabs/Module/Admin/Themes.php:61
+msgid "No themes found."
+msgstr "Aucun thème trouvé."
-#: ../../Zotlabs/Module/Admin/Dbsync.php:55
-msgid "No failed updates."
-msgstr "Aucune mise à jour défaillante."
+#: ../../Zotlabs/Module/Admin/Themes.php:116
+msgid "Screenshot"
+msgstr "Capture d'écran"
-#: ../../Zotlabs/Module/Admin/Dbsync.php:59
-msgid "Failed Updates"
-msgstr "Mises à jour défaillantes"
+#: ../../Zotlabs/Module/Admin/Themes.php:123
+#: ../../Zotlabs/Module/Admin/Themes.php:157 ../../Zotlabs/Widget/Admin.php:28
+msgid "Themes"
+msgstr "Thèmes"
-#: ../../Zotlabs/Module/Admin/Dbsync.php:61
-msgid "Mark success (if update was manually applied)"
-msgstr "Marquer comme réussie (si la mise à jour a été réalisée manuellement)"
+#: ../../Zotlabs/Module/Admin/Themes.php:162
+msgid "[Experimental]"
+msgstr "[Expérimental]"
-#: ../../Zotlabs/Module/Admin/Dbsync.php:62
-msgid "Attempt to execute this update step automatically"
-msgstr "Tenter de réaliser cette étape de mise à jour automatiquement"
+#: ../../Zotlabs/Module/Admin/Themes.php:163
+msgid "[Unsupported]"
+msgstr "[Non maintenu]"
-#: ../../Zotlabs/Module/Admin/Site.php:133
+#: ../../Zotlabs/Module/Admin/Site.php:144
msgid "Site settings updated."
msgstr "Paramètres du site sauvegardés."
-#: ../../Zotlabs/Module/Admin/Site.php:159 ../../include/text.php:2931
+#: ../../Zotlabs/Module/Admin/Site.php:170 ../../include/text.php:2923
msgid "Default"
msgstr "Défaut"
-#: ../../Zotlabs/Module/Admin/Site.php:169
-#: ../../Zotlabs/Module/Settings/Display.php:143
+#: ../../Zotlabs/Module/Admin/Site.php:181
+#: ../../Zotlabs/Module/Settings/Display.php:137
+#, php-format
+msgid "%s - (Incompatible)"
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Site.php:188
+#: ../../Zotlabs/Module/Settings/Display.php:151
msgid "mobile"
msgstr "mobile"
-#: ../../Zotlabs/Module/Admin/Site.php:171
+#: ../../Zotlabs/Module/Admin/Site.php:190
msgid "experimental"
msgstr "expérimental"
-#: ../../Zotlabs/Module/Admin/Site.php:173
+#: ../../Zotlabs/Module/Admin/Site.php:192
msgid "unsupported"
msgstr "non maintenu"
-#: ../../Zotlabs/Module/Admin/Site.php:219
+#: ../../Zotlabs/Module/Admin/Site.php:238
msgid "Yes - with approval"
msgstr "Oui - avec approbation"
-#: ../../Zotlabs/Module/Admin/Site.php:225
+#: ../../Zotlabs/Module/Admin/Site.php:244
msgid "My site is not a public server"
msgstr "Mon site n'est pas un serveur public"
-#: ../../Zotlabs/Module/Admin/Site.php:226
+#: ../../Zotlabs/Module/Admin/Site.php:245
msgid "My site has paid access only"
msgstr "Mon site est à accès payant uniquement"
-#: ../../Zotlabs/Module/Admin/Site.php:227
+#: ../../Zotlabs/Module/Admin/Site.php:246
msgid "My site has free access only"
msgstr "Mon site est gratuit uniquement"
-#: ../../Zotlabs/Module/Admin/Site.php:228
+#: ../../Zotlabs/Module/Admin/Site.php:247
msgid "My site offers free accounts with optional paid upgrades"
msgstr "Mon site offre des comptes gratuits avec des améliorations payantes facultatives"
-#: ../../Zotlabs/Module/Admin/Site.php:239 ../../Zotlabs/Module/Setup.php:328
-msgid "Basic/Minimal Social Networking"
-msgstr "Réseau social de base"
-
-#: ../../Zotlabs/Module/Admin/Site.php:240 ../../Zotlabs/Module/Setup.php:329
-msgid "Standard Configuration (default)"
-msgstr "Configuration standard par défaut"
-
-#: ../../Zotlabs/Module/Admin/Site.php:241 ../../Zotlabs/Module/Setup.php:330
-msgid "Professional"
-msgstr "Professionel"
-
-#: ../../Zotlabs/Module/Admin/Site.php:245 ../../Zotlabs/Lib/Techlevels.php:10
+#: ../../Zotlabs/Module/Admin/Site.php:264 ../../Zotlabs/Lib/Techlevels.php:10
msgid "Beginner/Basic"
msgstr "Pour débutant/ de base"
-#: ../../Zotlabs/Module/Admin/Site.php:246 ../../Zotlabs/Lib/Techlevels.php:11
+#: ../../Zotlabs/Module/Admin/Site.php:265 ../../Zotlabs/Lib/Techlevels.php:11
msgid "Novice - not skilled but willing to learn"
msgstr "Novice - pas qualifiés, mais prêt à apprendre"
-#: ../../Zotlabs/Module/Admin/Site.php:247 ../../Zotlabs/Lib/Techlevels.php:12
+#: ../../Zotlabs/Module/Admin/Site.php:266 ../../Zotlabs/Lib/Techlevels.php:12
msgid "Intermediate - somewhat comfortable"
msgstr "Intermédiaire - assez confortable"
-#: ../../Zotlabs/Module/Admin/Site.php:248 ../../Zotlabs/Lib/Techlevels.php:13
+#: ../../Zotlabs/Module/Admin/Site.php:267 ../../Zotlabs/Lib/Techlevels.php:13
msgid "Advanced - very comfortable"
msgstr "Niveau avancé - trés confortable"
-#: ../../Zotlabs/Module/Admin/Site.php:249 ../../Zotlabs/Lib/Techlevels.php:14
+#: ../../Zotlabs/Module/Admin/Site.php:268 ../../Zotlabs/Lib/Techlevels.php:14
msgid "Expert - I can write computer code"
msgstr "Niveau expert - Je peux programmer"
-#: ../../Zotlabs/Module/Admin/Site.php:250 ../../Zotlabs/Lib/Techlevels.php:15
+#: ../../Zotlabs/Module/Admin/Site.php:269 ../../Zotlabs/Lib/Techlevels.php:15
msgid "Wizard - I probably know more than you do"
msgstr "Crack - J'en sais probablement plus que beaucoup"
-#: ../../Zotlabs/Module/Admin/Site.php:259 ../../include/widgets.php:1591
+#: ../../Zotlabs/Module/Admin/Site.php:278 ../../Zotlabs/Widget/Admin.php:22
msgid "Site"
msgstr "Site"
-#: ../../Zotlabs/Module/Admin/Site.php:262
+#: ../../Zotlabs/Module/Admin/Site.php:280
+#: ../../Zotlabs/Module/Register.php:253
+msgid "Registration"
+msgstr "Inscription"
+
+#: ../../Zotlabs/Module/Admin/Site.php:281
msgid "File upload"
msgstr "Envoi de fichier"
-#: ../../Zotlabs/Module/Admin/Site.php:263
+#: ../../Zotlabs/Module/Admin/Site.php:282
msgid "Policies"
msgstr "Stratégies"
-#: ../../Zotlabs/Module/Admin/Site.php:264
+#: ../../Zotlabs/Module/Admin/Site.php:283
#: ../../include/contact_widgets.php:16
msgid "Advanced"
msgstr "Avancé"
-#: ../../Zotlabs/Module/Admin/Site.php:268
-#: ../../extend/addon/addon/statusnet/statusnet.php:890
+#: ../../Zotlabs/Module/Admin/Site.php:287
+#: ../../addon/statusnet/statusnet.php:890
msgid "Site name"
msgstr "Nom du site"
-#: ../../Zotlabs/Module/Admin/Site.php:270 ../../Zotlabs/Module/Setup.php:351
-msgid "Server Configuration/Role"
-msgstr "Configuration du site."
-
-#: ../../Zotlabs/Module/Admin/Site.php:272
+#: ../../Zotlabs/Module/Admin/Site.php:291
msgid "Site default technical skill level"
msgstr "Niveau technique par défaut pour le site"
-#: ../../Zotlabs/Module/Admin/Site.php:272
+#: ../../Zotlabs/Module/Admin/Site.php:291
msgid "Used to provide a member experience matched to technical comfort level"
msgstr "Utilisé pour fournir une expérience utilisateur correspondant au niveau de confort technique"
-#: ../../Zotlabs/Module/Admin/Site.php:274
+#: ../../Zotlabs/Module/Admin/Site.php:293
msgid "Lock the technical skill level setting"
msgstr "Bloque le niveau technique du paramétrage"
-#: ../../Zotlabs/Module/Admin/Site.php:274
+#: ../../Zotlabs/Module/Admin/Site.php:293
msgid "Members can set their own technical comfort level by default"
msgstr "Les utilisateurs peuvent paramétrer leur propre niveau technique."
-#: ../../Zotlabs/Module/Admin/Site.php:276
+#: ../../Zotlabs/Module/Admin/Site.php:295
msgid "Banner/Logo"
msgstr "Bannière/logo"
-#: ../../Zotlabs/Module/Admin/Site.php:277
+#: ../../Zotlabs/Module/Admin/Site.php:296
msgid "Administrator Information"
msgstr "Informations de l'administrateur"
-#: ../../Zotlabs/Module/Admin/Site.php:277
+#: ../../Zotlabs/Module/Admin/Site.php:296
msgid ""
"Contact information for site administrators. Displayed on siteinfo page. "
"BBCode can be used here"
msgstr "Coordonnées de l'administrateur du site. Affichées sur la page 'siteinfo'. Vous pouvez utiliser du BBCode ici"
-#: ../../Zotlabs/Module/Admin/Site.php:278
+#: ../../Zotlabs/Module/Admin/Site.php:297
#: ../../Zotlabs/Module/Siteinfo.php:23
msgid "Site Information"
msgstr "Site information"
-#: ../../Zotlabs/Module/Admin/Site.php:278
+#: ../../Zotlabs/Module/Admin/Site.php:297
msgid ""
"Publicly visible description of this site. Displayed on siteinfo page. "
"BBCode can be used here"
msgstr "Description du site visible publiquement. Affiché sur la page d'information du site. BBCode peut être utilisé ici."
-#: ../../Zotlabs/Module/Admin/Site.php:279
+#: ../../Zotlabs/Module/Admin/Site.php:298
msgid "System language"
msgstr "Langue du système"
-#: ../../Zotlabs/Module/Admin/Site.php:280
+#: ../../Zotlabs/Module/Admin/Site.php:299
msgid "System theme"
msgstr "Thème du système"
-#: ../../Zotlabs/Module/Admin/Site.php:280
+#: ../../Zotlabs/Module/Admin/Site.php:299
msgid ""
"Default system theme - may be over-ridden by user profiles - <a href='#' "
"id='cnftheme'>change theme settings</a>"
msgstr "Thème par défaut - il peut être changé pour chaque profil utilisateur - <a href='#' id='cnftheme'>modifier le thème</a>"
-#: ../../Zotlabs/Module/Admin/Site.php:281
+#: ../../Zotlabs/Module/Admin/Site.php:300
msgid "Mobile system theme"
msgstr "Thème par défaut pour les mobiles"
-#: ../../Zotlabs/Module/Admin/Site.php:281
+#: ../../Zotlabs/Module/Admin/Site.php:300
msgid "Theme for mobile devices"
msgstr "Thème pour les mobiles"
-#: ../../Zotlabs/Module/Admin/Site.php:283
+#: ../../Zotlabs/Module/Admin/Site.php:302
msgid "Allow Feeds as Connections"
msgstr "Autoriser les Flux (RSS) comme contacts"
-#: ../../Zotlabs/Module/Admin/Site.php:283
+#: ../../Zotlabs/Module/Admin/Site.php:302
msgid "(Heavy system resource usage)"
msgstr "(Impact important sur les ressources)"
-#: ../../Zotlabs/Module/Admin/Site.php:284
+#: ../../Zotlabs/Module/Admin/Site.php:303
msgid "Maximum image size"
msgstr "Taille maximale des images"
-#: ../../Zotlabs/Module/Admin/Site.php:284
+#: ../../Zotlabs/Module/Admin/Site.php:303
msgid ""
"Maximum size in bytes of uploaded images. Default is 0, which means no "
"limits."
msgstr "Taille maximum, en octets, des images envoyées. Par défaut 0, soit sans limite."
-#: ../../Zotlabs/Module/Admin/Site.php:285
+#: ../../Zotlabs/Module/Admin/Site.php:304
msgid "Does this site allow new member registration?"
msgstr "Est-ce que l'enregistrement de nouveaux membres est autorisé sur ce site&nbsp;?"
-#: ../../Zotlabs/Module/Admin/Site.php:286
+#: ../../Zotlabs/Module/Admin/Site.php:305
msgid "Invitation only"
msgstr "Sur invitation seulement"
-#: ../../Zotlabs/Module/Admin/Site.php:286
+#: ../../Zotlabs/Module/Admin/Site.php:305
msgid ""
"Only allow new member registrations with an invitation code. Above register "
"policy must be set to Yes."
msgstr "N'autoriser que les nouvelles inscriptions avec code d'invitation. La stratégie d'inscription ci-dessus doit être mise sur \"Oui\"."
-#: ../../Zotlabs/Module/Admin/Site.php:287
+#: ../../Zotlabs/Module/Admin/Site.php:306
msgid "Which best describes the types of account offered by this hub?"
msgstr "Quelle est la meilleure description des types de comptes proposés sur ce hub&nbsp;?"
-#: ../../Zotlabs/Module/Admin/Site.php:288
+#: ../../Zotlabs/Module/Admin/Site.php:307
msgid "Register text"
msgstr "Texte d'inscription"
-#: ../../Zotlabs/Module/Admin/Site.php:288
+#: ../../Zotlabs/Module/Admin/Site.php:307
msgid "Will be displayed prominently on the registration page."
msgstr "Sera affiché de manière bien visible sur le formulaire d'inscription."
-#: ../../Zotlabs/Module/Admin/Site.php:289
+#: ../../Zotlabs/Module/Admin/Site.php:308
msgid "Site homepage to show visitors (default: login box)"
msgstr "Page d'accueil du site à montrer aux visiteurs (par défaut&nbsp;: boîte de dialogue de connexion)"
-#: ../../Zotlabs/Module/Admin/Site.php:289
+#: ../../Zotlabs/Module/Admin/Site.php:308
msgid ""
"example: 'public' to show public stream, 'page/sys/home' to show a system "
"webpage called 'home' or 'include:home.html' to include a file."
msgstr "exemple&nbsp;:'public' pour montrer le flux public, 'page/sys/home' pour montrer une page système appelée 'home' ou 'include:home.html' pour inclure un fichier."
-#: ../../Zotlabs/Module/Admin/Site.php:290
+#: ../../Zotlabs/Module/Admin/Site.php:309
msgid "Preserve site homepage URL"
msgstr "Préserver l'adresse d'accueil du site"
-#: ../../Zotlabs/Module/Admin/Site.php:290
+#: ../../Zotlabs/Module/Admin/Site.php:309
msgid ""
"Present the site homepage in a frame at the original location instead of "
"redirecting"
msgstr "Présenter la page d'accueil du site dans un cadre à l'adresse d'origine, plutôt que de rediriger"
-#: ../../Zotlabs/Module/Admin/Site.php:291
+#: ../../Zotlabs/Module/Admin/Site.php:310
msgid "Accounts abandoned after x days"
msgstr "Les comptes sont abandonnés après x jours"
-#: ../../Zotlabs/Module/Admin/Site.php:291
+#: ../../Zotlabs/Module/Admin/Site.php:310
msgid ""
"Will not waste system resources polling external sites for abandonded "
"accounts. Enter 0 for no time limit."
msgstr "Eviter de gaspiller les ressources du système en interrogeant des hubs distants pour des canaux abandonnés. Mettez 0 pour ne pas avoir de limite de temps."
-#: ../../Zotlabs/Module/Admin/Site.php:292
+#: ../../Zotlabs/Module/Admin/Site.php:311
msgid "Allowed friend domains"
msgstr "Domaines amicaux autorisés"
-#: ../../Zotlabs/Module/Admin/Site.php:292
+#: ../../Zotlabs/Module/Admin/Site.php:311
msgid ""
"Comma separated list of domains which are allowed to establish friendships "
"with this site. Wildcards are accepted. Empty to allow any domains"
msgstr "Liste de noms de domaines séparés par des virgules pour lesquels ce site acceptera les demandes d'amitié. Les caractères génériques (*) sont acceptés. Laissez vide pour accepter tous les domaines."
-#: ../../Zotlabs/Module/Admin/Site.php:293
+#: ../../Zotlabs/Module/Admin/Site.php:312
msgid "Verify Email Addresses"
msgstr "Demander vérification des adresses de courriel"
-#: ../../Zotlabs/Module/Admin/Site.php:293
+#: ../../Zotlabs/Module/Admin/Site.php:312
msgid ""
"Check to verify email addresses used in account registration (recommended)."
msgstr "Cocher pour que les adresses utilisées à l'inscription soient vérifiées (recommandé)."
-#: ../../Zotlabs/Module/Admin/Site.php:294
+#: ../../Zotlabs/Module/Admin/Site.php:313
msgid "Force publish"
msgstr "Publicité forcée"
-#: ../../Zotlabs/Module/Admin/Site.php:294
+#: ../../Zotlabs/Module/Admin/Site.php:313
msgid ""
"Check to force all profiles on this site to be listed in the site directory."
msgstr "Cocher pour forcer la publication de tous les profils du site dans l'annuaire."
-#: ../../Zotlabs/Module/Admin/Site.php:295
+#: ../../Zotlabs/Module/Admin/Site.php:314
msgid "Import Public Streams"
msgstr "Flux publics importés"
-#: ../../Zotlabs/Module/Admin/Site.php:295
+#: ../../Zotlabs/Module/Admin/Site.php:314
msgid ""
"Import and allow access to public content pulled from other sites. Warning: "
"this content is unmoderated."
msgstr "Importer du contenu public à partir d'autres sites et autoriser l'accès à ce contenu. Attention&nbsp;: ce contenu n'est pas modéré."
-#: ../../Zotlabs/Module/Admin/Site.php:296
+#: ../../Zotlabs/Module/Admin/Site.php:315
msgid "Login on Homepage"
msgstr "Connexion sur la page d'accueil"
-#: ../../Zotlabs/Module/Admin/Site.php:296
+#: ../../Zotlabs/Module/Admin/Site.php:315
msgid ""
"Present a login box to visitors on the home page if no other content has "
"been configured."
msgstr "Présenter une boîte de dialogue de connexion aux visiteurs sur la page d'accueil si aucun autre contenu n'a été configuré."
-#: ../../Zotlabs/Module/Admin/Site.php:297
+#: ../../Zotlabs/Module/Admin/Site.php:316
msgid "Enable context help"
msgstr "Permettre l'aide contextuelle"
-#: ../../Zotlabs/Module/Admin/Site.php:297
+#: ../../Zotlabs/Module/Admin/Site.php:316
msgid ""
"Display contextual help for the current page when the help button is "
"pressed."
msgstr "Afficher l'aide contextuel en cliquant sur le bouton aide."
-#: ../../Zotlabs/Module/Admin/Site.php:299
+#: ../../Zotlabs/Module/Admin/Site.php:318
+msgid "Reply-to email address for system generated email."
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Site.php:319
+msgid "Sender (From) email address for system generated email."
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Site.php:320
+msgid "Name of email sender for system generated email."
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Site.php:322
msgid "Directory Server URL"
msgstr "URL du serveur d'annuaire"
-#: ../../Zotlabs/Module/Admin/Site.php:299
+#: ../../Zotlabs/Module/Admin/Site.php:322
msgid "Default directory server"
msgstr "Serveur d'annuaire par défaut"
-#: ../../Zotlabs/Module/Admin/Site.php:301
+#: ../../Zotlabs/Module/Admin/Site.php:324
msgid "Proxy user"
msgstr "Utilisateur du proxy"
-#: ../../Zotlabs/Module/Admin/Site.php:302
+#: ../../Zotlabs/Module/Admin/Site.php:325
msgid "Proxy URL"
msgstr "URL du proxy"
-#: ../../Zotlabs/Module/Admin/Site.php:303
+#: ../../Zotlabs/Module/Admin/Site.php:326
msgid "Network timeout"
msgstr "Délai maximal du réseau"
-#: ../../Zotlabs/Module/Admin/Site.php:303
+#: ../../Zotlabs/Module/Admin/Site.php:326
msgid "Value is in seconds. Set to 0 for unlimited (not recommended)."
msgstr "En secondes. Mettre à 0 pour ne pas avoir de délai maximal (non recommandé)."
-#: ../../Zotlabs/Module/Admin/Site.php:304
+#: ../../Zotlabs/Module/Admin/Site.php:327
msgid "Delivery interval"
msgstr "Intervalle de distribution"
-#: ../../Zotlabs/Module/Admin/Site.php:304
+#: ../../Zotlabs/Module/Admin/Site.php:327
msgid ""
"Delay background delivery processes by this many seconds to reduce system "
"load. Recommend: 4-5 for shared hosts, 2-3 for virtual private servers. 0-1 "
"for large dedicated servers."
msgstr "Temporise le processus de distribution de tant de secondes pour réduire la charge sur le système. Valeurs recommandées&nbsp;: 4-5 pour les serveurs mutualisés, 2-3 pour les VPS. 0-1 pour les gros serveurs dédiés."
-#: ../../Zotlabs/Module/Admin/Site.php:305
+#: ../../Zotlabs/Module/Admin/Site.php:328
msgid "Deliveries per process"
msgstr "Distributions par processus"
-#: ../../Zotlabs/Module/Admin/Site.php:305
+#: ../../Zotlabs/Module/Admin/Site.php:328
msgid ""
"Number of deliveries to attempt in a single operating system process. Adjust"
" if necessary to tune system performance. Recommend: 1-5."
msgstr "Nombre de distributions à tenter au sein d'un seul processus système. Ajuster si nécessaire pour affiner la performance du système. Recommandé&nbsp;:1-5."
-#: ../../Zotlabs/Module/Admin/Site.php:306
+#: ../../Zotlabs/Module/Admin/Site.php:329
msgid "Poll interval"
msgstr "Intervalle de scrutation"
-#: ../../Zotlabs/Module/Admin/Site.php:306
+#: ../../Zotlabs/Module/Admin/Site.php:329
msgid ""
"Delay background polling processes by this many seconds to reduce system "
"load. If 0, use delivery interval."
msgstr "Temporise le processus de scrutation en tâche de fond de tant de secondes, pour réduire la charge. Si 0, utilise l'intervalle de distribution."
-#: ../../Zotlabs/Module/Admin/Site.php:307
+#: ../../Zotlabs/Module/Admin/Site.php:330
msgid "Maximum Load Average"
msgstr "Charge maximale moyenne"
-#: ../../Zotlabs/Module/Admin/Site.php:307
+#: ../../Zotlabs/Module/Admin/Site.php:330
msgid ""
"Maximum system load before delivery and poll processes are deferred - "
"default 50."
msgstr "Charge système maximale au-delà de laquelle distribution et scrutation sont reportées - par défaut 50."
-#: ../../Zotlabs/Module/Admin/Site.php:308
+#: ../../Zotlabs/Module/Admin/Site.php:331
msgid "Expiration period in days for imported (grid/network) content"
msgstr "Délai d'expiration pour le contenu importé (réseau)"
-#: ../../Zotlabs/Module/Admin/Site.php:308
+#: ../../Zotlabs/Module/Admin/Site.php:331
msgid "0 for no expiration of imported content"
msgstr "0 pour ne pas expirer le contenu importé"
-#: ../../Zotlabs/Module/Admin/Plugins.php:284
-#, php-format
-msgid "Plugin %s disabled."
-msgstr "Greffon %s désactivé."
+#: ../../Zotlabs/Module/Admin/Profs.php:69
+msgid "New Profile Field"
+msgstr "Nouveau champ de profil"
-#: ../../Zotlabs/Module/Admin/Plugins.php:289
+#: ../../Zotlabs/Module/Admin/Profs.php:70
+#: ../../Zotlabs/Module/Admin/Profs.php:90
+msgid "Field nickname"
+msgstr "Nom court du champ"
+
+#: ../../Zotlabs/Module/Admin/Profs.php:70
+#: ../../Zotlabs/Module/Admin/Profs.php:90
+msgid "System name of field"
+msgstr "Nom système du champ"
+
+#: ../../Zotlabs/Module/Admin/Profs.php:71
+#: ../../Zotlabs/Module/Admin/Profs.php:91
+msgid "Input type"
+msgstr "Type de champ"
+
+#: ../../Zotlabs/Module/Admin/Profs.php:72
+#: ../../Zotlabs/Module/Admin/Profs.php:92
+msgid "Field Name"
+msgstr "Nom du champ"
+
+#: ../../Zotlabs/Module/Admin/Profs.php:72
+#: ../../Zotlabs/Module/Admin/Profs.php:92
+msgid "Label on profile pages"
+msgstr "Étiquette sur les pages de profil"
+
+#: ../../Zotlabs/Module/Admin/Profs.php:73
+#: ../../Zotlabs/Module/Admin/Profs.php:93
+msgid "Help text"
+msgstr "Aide à la saisie"
+
+#: ../../Zotlabs/Module/Admin/Profs.php:73
+#: ../../Zotlabs/Module/Admin/Profs.php:93
+msgid "Additional info (optional)"
+msgstr "Informations additionnelles (facultatif)"
+
+#: ../../Zotlabs/Module/Admin/Profs.php:74
+#: ../../Zotlabs/Module/Admin/Profs.php:94 ../../Zotlabs/Module/Rbmark.php:32
+#: ../../Zotlabs/Module/Rbmark.php:104 ../../Zotlabs/Module/Filer.php:53
+#: ../../Zotlabs/Widget/Notes.php:18 ../../include/text.php:1028
+#: ../../include/text.php:1040
+msgid "Save"
+msgstr "Enregistrer"
+
+#: ../../Zotlabs/Module/Admin/Profs.php:83
+msgid "Field definition not found"
+msgstr "Définition du champ introuvable"
+
+#: ../../Zotlabs/Module/Admin/Profs.php:89
+msgid "Edit Profile Field"
+msgstr "Modifier le champ de profil"
+
+#: ../../Zotlabs/Module/Admin/Profs.php:147 ../../Zotlabs/Widget/Admin.php:30
+msgid "Profile Fields"
+msgstr "Champs de profil"
+
+#: ../../Zotlabs/Module/Admin/Profs.php:148
+msgid "Basic Profile Fields"
+msgstr "Champs de profil de base"
+
+#: ../../Zotlabs/Module/Admin/Profs.php:149
+msgid "Advanced Profile Fields"
+msgstr "Champs de profil avancés"
+
+#: ../../Zotlabs/Module/Admin/Profs.php:149
+msgid "(In addition to basic fields)"
+msgstr "(en plus des champs de base)"
+
+#: ../../Zotlabs/Module/Admin/Profs.php:151
+msgid "All available fields"
+msgstr "Tous les champs disponibles"
+
+#: ../../Zotlabs/Module/Admin/Profs.php:152
+msgid "Custom Fields"
+msgstr "Champs personnalisés"
+
+#: ../../Zotlabs/Module/Admin/Profs.php:156
+msgid "Create Custom Field"
+msgstr "Créer un champ personnalisé"
+
+#: ../../Zotlabs/Module/Admin/Account_edit.php:29
#, php-format
-msgid "Plugin %s enabled."
-msgstr "Greffon %s activé."
+msgid "Password changed for account %d."
+msgstr "Le mot de passe a été modifié pour le compte %d."
-#: ../../Zotlabs/Module/Admin/Plugins.php:337
-#: ../../Zotlabs/Module/Admin/Plugins.php:432 ../../include/widgets.php:1596
-msgid "Plugins"
-msgstr "Greffons"
+#: ../../Zotlabs/Module/Admin/Account_edit.php:46
+msgid "Account settings updated."
+msgstr "Paramétrage du compte mis à jour"
-#: ../../Zotlabs/Module/Admin/Plugins.php:348
-msgid "Minimum project version: "
-msgstr "Version minimum du projet&nbsp;:"
+#: ../../Zotlabs/Module/Admin/Account_edit.php:61
+msgid "Account not found."
+msgstr "Compte introuvable"
-#: ../../Zotlabs/Module/Admin/Plugins.php:349
-msgid "Maximum project version: "
-msgstr "Version maximum du projet&nbsp;:"
+#: ../../Zotlabs/Module/Admin/Account_edit.php:68
+msgid "Account Edit"
+msgstr "Modifier votre compte"
-#: ../../Zotlabs/Module/Admin/Plugins.php:350
-msgid "Minimum PHP version: "
-msgstr "Version minimum de PHP&nbsp;:"
+#: ../../Zotlabs/Module/Admin/Account_edit.php:69
+msgid "New Password"
+msgstr "Nouveau mot de passe"
-#: ../../Zotlabs/Module/Admin/Plugins.php:351
-msgid "Compatible Server Roles: "
-msgstr "Rôles du serveur "
+#: ../../Zotlabs/Module/Admin/Account_edit.php:70
+msgid "New Password again"
+msgstr "Nouveau mot de passe (encore)"
-#: ../../Zotlabs/Module/Admin/Plugins.php:352
-msgid "Requires: "
-msgstr "Requiert&nbsp;:"
+#: ../../Zotlabs/Module/Admin/Account_edit.php:71
+msgid "Technical skill level"
+msgstr "Niveau technique"
-#: ../../Zotlabs/Module/Admin/Plugins.php:353
-#: ../../Zotlabs/Module/Admin/Plugins.php:437
-msgid "Disabled - version incompatibility"
-msgstr "Désactivé - version incompatible"
+#: ../../Zotlabs/Module/Admin/Account_edit.php:72
+msgid "Account language (for emails)"
+msgstr "Langue de votre compte (pour email)"
-#: ../../Zotlabs/Module/Admin/Plugins.php:406
-msgid "Enter the public git repository URL of the plugin repo."
-msgstr "Entrer l'URL du dépôt git public pour les greffons"
+#: ../../Zotlabs/Module/Admin/Account_edit.php:73
+msgid "Service class"
+msgstr "Classe de service"
-#: ../../Zotlabs/Module/Admin/Plugins.php:407
-msgid "Plugin repo git URL"
-msgstr "URL du git pour les plugin"
+#: ../../Zotlabs/Module/Admin/Security.php:77
+msgid ""
+"By default, unfiltered HTML is allowed in embedded media. This is inherently"
+" insecure."
+msgstr "Par défaut le code HTML est autorisé pour les média par exemple les vidéos embarquées. Cependant cela peut poser un faille de sécurité."
-#: ../../Zotlabs/Module/Admin/Plugins.php:408
-msgid "Custom repo name"
-msgstr "Nom du dépôt"
+#: ../../Zotlabs/Module/Admin/Security.php:80
+msgid ""
+"The recommended setting is to only allow unfiltered HTML from the following "
+"sites:"
+msgstr "Ce paramétrage autorisant le HTML pour les sites suivants."
-#: ../../Zotlabs/Module/Admin/Plugins.php:408
-msgid "(optional)"
-msgstr "(en option)"
+#: ../../Zotlabs/Module/Admin/Security.php:81
+msgid ""
+"https://youtube.com/<br />https://www.youtube.com/<br />https://youtu.be/<br"
+" />https://vimeo.com/<br />https://soundcloud.com/<br />"
+msgstr "https://youtube.com/<br />https://www.youtube.com/<br />https://youtu.be/<br />https://vimeo.com/<br />https://soundcloud.com/<br />"
-#: ../../Zotlabs/Module/Admin/Plugins.php:409
-msgid "Download Plugin Repo"
-msgstr "Télécharger l'extension"
+#: ../../Zotlabs/Module/Admin/Security.php:82
+msgid ""
+"All other embedded content will be filtered, <strong>unless</strong> "
+"embedded content from that site is explicitly blocked."
+msgstr "Les contenus html seront filtrés <strong>sauf</strong> ceux des sites explicitement bloqués."
-#: ../../Zotlabs/Module/Admin/Plugins.php:416
-msgid "Install new repo"
-msgstr "Installer un nouveau dépôt"
+#: ../../Zotlabs/Module/Admin/Security.php:87
+#: ../../Zotlabs/Widget/Admin.php:25
+msgid "Security"
+msgstr "Sécurité"
-#: ../../Zotlabs/Module/Admin/Plugins.php:417 ../../Zotlabs/Lib/Apps.php:348
-msgid "Install"
-msgstr "Installer"
+#: ../../Zotlabs/Module/Admin/Security.php:89
+msgid "Block public"
+msgstr "Bloquer \"public\""
-#: ../../Zotlabs/Module/Admin/Plugins.php:418
-#: ../../Zotlabs/Module/Connedit.php:885 ../../Zotlabs/Module/Fbrowser.php:66
-#: ../../Zotlabs/Module/Fbrowser.php:88 ../../Zotlabs/Module/Wiki.php:263
-#: ../../Zotlabs/Module/Wiki.php:288
-#: ../../Zotlabs/Module/Settings/Oauth.php:88
-#: ../../Zotlabs/Module/Settings/Oauth.php:114
-#: ../../Zotlabs/Module/Tagrm.php:15 ../../Zotlabs/Module/Tagrm.php:138
-#: ../../extend/addon/addon/friendica/dfrn_request.php:879
-#: ../../extend/addon/addon/js_upload/js_upload.php:46
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:866
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1154
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:243
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:266
-#: ../../include/conversation.php:1394 ../../include/conversation.php:1443
-msgid "Cancel"
-msgstr "Annuler"
+#: ../../Zotlabs/Module/Admin/Security.php:89
+msgid ""
+"Check to block public access to all otherwise public personal pages on this "
+"site unless you are currently authenticated."
+msgstr "Sélectionner pour ne permettre l'accès aux pages personnelles \"publiques\" du site qu'aux personnes authentifiées, pas aux personnes anonymes du web."
-#: ../../Zotlabs/Module/Admin/Plugins.php:440
-msgid "Manage Repos"
-msgstr "Gérer les dépôts"
+#: ../../Zotlabs/Module/Admin/Security.php:90
+msgid "Set \"Transport Security\" HTTP header"
+msgstr "Paramétrer \"Transport Security\" pour l'entête HTTP"
-#: ../../Zotlabs/Module/Admin/Plugins.php:441
-msgid "Installed Plugin Repositories"
-msgstr "Dépôt des extensions installées"
+#: ../../Zotlabs/Module/Admin/Security.php:91
+msgid "Set \"Content Security Policy\" HTTP header"
+msgstr "Paramétrer \"Content Security Policy\" pour l'entête HTTP"
-#: ../../Zotlabs/Module/Admin/Plugins.php:442
-msgid "Install a New Plugin Repository"
-msgstr "Installer un nouveau dépôt pour extensions"
+#: ../../Zotlabs/Module/Admin/Security.php:92
+msgid "Allowed email domains"
+msgstr "Domaines de courriels autorisés"
-#: ../../Zotlabs/Module/Admin/Plugins.php:448
-#: ../../Zotlabs/Module/Connedit.php:883
-#: ../../Zotlabs/Module/Settings/Oauth.php:42
-#: ../../Zotlabs/Module/Settings/Oauth.php:113 ../../Zotlabs/Lib/Apps.php:348
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1152
-msgid "Update"
-msgstr "Mise à jour"
+#: ../../Zotlabs/Module/Admin/Security.php:92
+msgid ""
+"Comma separated list of domains which are allowed in email addresses for "
+"registrations to this site. Wildcards are accepted. Empty to allow any "
+"domains"
+msgstr "Liste de noms de domaines séparés par des virgules dont les adresses de courriel seront autorisées lors de l'inscription à ce site. Les caractères génériques (*) sont acceptés. Laissez vide pour accepter tous les domaines."
-#: ../../Zotlabs/Module/Admin/Plugins.php:449
-msgid "Switch branch"
-msgstr "Changer de branche"
+#: ../../Zotlabs/Module/Admin/Security.php:93
+msgid "Not allowed email domains"
+msgstr "Domaines de courriel non autorisés"
-#: ../../Zotlabs/Module/Admin/Queue.php:35
-msgid "Queue Statistics"
-msgstr "Statistiques de file d'attente"
+#: ../../Zotlabs/Module/Admin/Security.php:93
+msgid ""
+"Comma separated list of domains which are not allowed in email addresses for"
+" registrations to this site. Wildcards are accepted. Empty to allow any "
+"domains, unless allowed domains have been defined."
+msgstr "Liste de noms de domaines - séparés par des virgules - dont les adresses de courriel ne seront pas autorisées lors de l'inscription à ce site. Les caractères génériques (*) sont acceptés. Laissez vide pour accepter tous les domaines, sauf si des domaines autorisés ont été définis."
-#: ../../Zotlabs/Module/Admin/Queue.php:36
-msgid "Total Entries"
-msgstr "Nombre d'entrées total"
+#: ../../Zotlabs/Module/Admin/Security.php:94
+msgid "Allow communications only from these sites"
+msgstr "N'autorisez que les communications venant de ces sites"
-#: ../../Zotlabs/Module/Admin/Queue.php:37
-msgid "Priority"
-msgstr "Priorité"
+#: ../../Zotlabs/Module/Admin/Security.php:94
+msgid ""
+"One site per line. Leave empty to allow communication from anywhere by "
+"default"
+msgstr "Un site par ligne. Laisser vide pour autoriser les communications de tous les sites, par défaut."
-#: ../../Zotlabs/Module/Admin/Queue.php:38
-msgid "Destination URL"
-msgstr "URL de destination"
+#: ../../Zotlabs/Module/Admin/Security.php:95
+msgid "Block communications from these sites"
+msgstr "Bloquer les communications de ces sites"
-#: ../../Zotlabs/Module/Admin/Queue.php:39
-msgid "Mark hub permanently offline"
-msgstr "Marquer le hub comme étant hors ligne de manière permanente"
+#: ../../Zotlabs/Module/Admin/Security.php:96
+msgid "Allow communications only from these channels"
+msgstr "N'autoriser que les communications de ces canaux"
-#: ../../Zotlabs/Module/Admin/Queue.php:40
-msgid "Empty queue for this hub"
-msgstr "Vider la file d'attente pour ce hub"
+#: ../../Zotlabs/Module/Admin/Security.php:96
+msgid ""
+"One channel (hash) per line. Leave empty to allow from any channel by "
+"default"
+msgstr "Un canal (adresse) par ligne. Laisser vide pour autoriser les communications de tous les canaux, par défaut"
-#: ../../Zotlabs/Module/Admin/Queue.php:41
-msgid "Last known contact"
-msgstr "Dernier contact connu"
+#: ../../Zotlabs/Module/Admin/Security.php:97
+msgid "Block communications from these channels"
+msgstr "Bloquer les communications de ces canaux"
-#: ../../Zotlabs/Module/Search.php:223
-#, php-format
-msgid "Items tagged with: %s"
-msgstr "Eléments étiquetés avec&nbsp;: %s"
+#: ../../Zotlabs/Module/Admin/Security.php:98
+msgid "Only allow embeds from secure (SSL) websites and links."
+msgstr "Seuls les sites et liens sécurisés sont autorisé pour intégrer du code HTML"
+
+#: ../../Zotlabs/Module/Admin/Security.php:99
+msgid "Allow unfiltered embedded HTML content only from these domains"
+msgstr "Autoriser le contenu HTML embarqué uniquement à partir de ces domaines"
+
+#: ../../Zotlabs/Module/Admin/Security.php:99
+msgid "One site per line. By default embedded content is filtered."
+msgstr "Un site par ligne. Par défaut le contenu embarqué est filtré."
+
+#: ../../Zotlabs/Module/Admin/Security.php:100
+msgid "Block embedded HTML from these domains"
+msgstr "Bloquer le HTML embarqué à partir de ces domaines"
+
+#: ../../Zotlabs/Module/Lockview.php:75
+msgid "Remote privacy information not available."
+msgstr "Les informations distantes de confidentialité ne sont pas disponibles."
+
+#: ../../Zotlabs/Module/Lockview.php:96
+msgid "Visible to:"
+msgstr "Visible par&nbsp;:"
+
+#: ../../Zotlabs/Module/Lockview.php:117 ../../Zotlabs/Module/Lockview.php:153
+#: ../../Zotlabs/Module/Acl.php:117 ../../include/acl_selectors.php:183
+msgctxt "acl"
+msgid "Profile"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Permcats.php:37
+msgid "Permission category saved."
+msgstr "Catégorie d'autorisation enregistrée."
+
+#: ../../Zotlabs/Module/Settings/Permcats.php:61
+msgid ""
+"Use this form to create permission rules for various classes of people or "
+"connections."
+msgstr "Utilisez ce formulaire pour créer des règles d'accès pour différentes catégories de personnes ou de contacts."
+
+#: ../../Zotlabs/Module/Settings/Permcats.php:94
+msgid "Permission Categories"
+msgstr "Catégories d'autorisation"
+
+#: ../../Zotlabs/Module/Settings/Permcats.php:102
+msgid "Permission Name"
+msgstr "Nom de l'autorisation"
+
+#: ../../Zotlabs/Module/Settings/Permcats.php:103
+#: ../../Zotlabs/Module/Settings/Tokens.php:161
+#: ../../Zotlabs/Module/Connedit.php:894
+msgid "My Settings"
+msgstr "Mes paramètres"
+
+#: ../../Zotlabs/Module/Settings/Permcats.php:105
+#: ../../Zotlabs/Module/Settings/Tokens.php:163
+#: ../../Zotlabs/Module/Connedit.php:889
+msgid "inherited"
+msgstr "héritée"
+
+#: ../../Zotlabs/Module/Settings/Permcats.php:108
+#: ../../Zotlabs/Module/Settings/Tokens.php:166
+#: ../../Zotlabs/Module/Connedit.php:896
+msgid "Individual Permissions"
+msgstr "Permissions individuelles"
+
+#: ../../Zotlabs/Module/Settings/Permcats.php:109
+#: ../../Zotlabs/Module/Settings/Tokens.php:167
+#: ../../Zotlabs/Module/Connedit.php:897
+msgid ""
+"Some permissions may be inherited from your channel's <a "
+"href=\"settings\"><strong>privacy settings</strong></a>, which have higher "
+"priority than individual settings. You can <strong>not</strong> change those"
+" settings here."
+msgstr "Certaines permissions peuvent être héritées de vos <a href=\"settings\">paramètres de confidentialité</a> de canal, lesquels sont prioritaires sur les réglages individuels. Vous pouvez modifier ces permissions ici mais cela n'aura aucun effet à moins de changer les paramètres hérités."
+
+#: ../../Zotlabs/Module/Settings/Channel.php:62
+#: ../../Zotlabs/Module/Settings/Channel.php:66
+#: ../../Zotlabs/Module/Settings/Channel.php:67
+#: ../../Zotlabs/Module/Settings/Channel.php:70
+#: ../../Zotlabs/Module/Settings/Channel.php:81
+#: ../../Zotlabs/Module/Connedit.php:715 ../../Zotlabs/Widget/Affinity.php:28
+#: ../../include/selectors.php:123 ../../include/channel.php:406
+#: ../../include/channel.php:407 ../../include/channel.php:414
+msgid "Friends"
+msgstr "Amis"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:251
+#: ../../addon/rendezvous/rendezvous.php:82
+#: ../../addon/openstreetmap/openstreetmap.php:184
+#: ../../addon/msgfooter/msgfooter.php:54 ../../addon/logrot/logrot.php:54
+#: ../../addon/twitter/twitter.php:766 ../../addon/piwik/piwik.php:116
+#: ../../addon/xmpp/xmpp.php:102
+msgid "Settings updated."
+msgstr "Paramètres mis à jour."
+
+#: ../../Zotlabs/Module/Settings/Channel.php:312
+msgid "Nobody except yourself"
+msgstr "Personne sauf vous"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:313
+msgid "Only those you specifically allow"
+msgstr "Seulement ceux que vous autorisez spécifiquement"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:314
+msgid "Approved connections"
+msgstr "Contacts approuvés"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:315
+msgid "Any connections"
+msgstr "Tous les contacts"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:316
+msgid "Anybody on this website"
+msgstr "Tous les utilisateurs du hub"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:317
+msgid "Anybody in this network"
+msgstr "Tous les utilisateurs sur ce réseau"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:318
+msgid "Anybody authenticated"
+msgstr "Tous les utilisateurs authentifiés"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:319
+msgid "Anybody on the internet"
+msgstr "Tous les utilisateurs d'Internet"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:395
+msgid "Publish your default profile in the network directory"
+msgstr "Publier votre profil par défaut dans l'annuaire du réseau"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:400
+msgid "Allow us to suggest you as a potential friend to new members?"
+msgstr "Nous autoriser à vous suggérer comme ami(e) potentiel(le) aux nouveaux membres?"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:404
+#: ../../Zotlabs/Module/Profile_photo.php:429
+#: ../../Zotlabs/Module/Cover_photo.php:365
+msgid "or"
+msgstr "ou"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:409
+msgid "Your channel address is"
+msgstr "L'adresse de votre canal est"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:412
+msgid "Your files/photos are accessible via WebDAV at"
+msgstr "Vos fichiers/photos sont accessibles via WebDAV à"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:474
+msgid "Channel Settings"
+msgstr "Paramètres du canal"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:481
+msgid "Basic Settings"
+msgstr "Paramètres standard"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:482
+#: ../../include/channel.php:1248
+msgid "Full Name:"
+msgstr "Nom complet&nbsp;:"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:483
+#: ../../Zotlabs/Module/Settings/Account.php:119
+msgid "Email Address:"
+msgstr "Adresse de courriel&nbsp;:"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:484
+msgid "Your Timezone:"
+msgstr "Votre fureau horaire&nbsp;:"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:485
+msgid "Default Post Location:"
+msgstr "Emplacement de publication par défaut&nbsp;:"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:485
+msgid "Geographical location to display on your posts"
+msgstr "Emplacement géographique à afficher sur vos publications"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:486
+msgid "Use Browser Location:"
+msgstr "Utiliser la géolocalisation du navigateur&nbsp;:"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:488
+msgid "Adult Content"
+msgstr "Contenu \"adulte\""
+
+#: ../../Zotlabs/Module/Settings/Channel.php:488
+msgid ""
+"This channel frequently or regularly publishes adult content. (Please tag "
+"any adult material and/or nudity with #NSFW)"
+msgstr "Ce canal publie plus ou moins fréquemment du contenu pour adultes. (Merci d'indiquer tout contenu pour adulte ou potentiellement choquant avec l'étiquette <em>#NSFW</em> - Not Safe For Work)"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:490
+msgid "Security and Privacy Settings"
+msgstr "Paramètres de sécurité et de confidentialité"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:493
+msgid "Your permissions are already configured. Click to view/adjust"
+msgstr "Vous permissions sont déjà paramétrées. Cliquer pour voir/ajuster"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:495
+msgid "Hide my online presence"
+msgstr "Cacher ma présence en ligne"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:495
+msgid "Prevents displaying in your profile that you are online"
+msgstr "Cacher votre statut (en ligne/hors ligne) sur votre profil"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:497
+msgid "Simple Privacy Settings:"
+msgstr "Paramètres de confidentialité simplifiés&nbsp;:"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:498
+msgid ""
+"Very Public - <em>extremely permissive (should be used with caution)</em>"
+msgstr "Très public - <em>extrèmement permissif (à n'utiliser qu'en connaissance de cause)</em>"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:499
+msgid ""
+"Typical - <em>default public, privacy when desired (similar to social "
+"network permissions but with improved privacy)</em>"
+msgstr "Classique - <em>public par défaut, privé en cas de besoin (comparable aux permissions type réseau social, avec une confidentialité améliorée)</em>"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:500
+msgid "Private - <em>default private, never open or public</em>"
+msgstr "Privé - <em>privé par défaut, jamais ouvert ni public</em>"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:501
+msgid "Blocked - <em>default blocked to/from everybody</em>"
+msgstr "Bloqué - <em>par défaut, bloqué de/vers tout le monde</em>"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:503
+msgid "Allow others to tag your posts"
+msgstr "Autoriser les autres à \"étiqueter\" vos publications"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:503
+msgid ""
+"Often used by the community to retro-actively flag inappropriate content"
+msgstr "Souvent utilisé par la communauté pour identifier un contenu inapproprié a posteriori "
+
+#: ../../Zotlabs/Module/Settings/Channel.php:505
+msgid "Channel Permission Limits"
+msgstr "Limites des permissions du canal"
-#: ../../Zotlabs/Module/Search.php:225
+#: ../../Zotlabs/Module/Settings/Channel.php:507
+msgid "Expire other channel content after this many days"
+msgstr "Faire expirer le contenu des autres canaux après n jours"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:507
+msgid "0 or blank to use the website limit."
+msgstr "0 ou vide pour utiliser la limite du site web"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:507
#, php-format
-msgid "Search results for: %s"
-msgstr "Résultats de recherche pour&nbsp;: %s"
+msgid "This website expires after %d days."
+msgstr "Ce site web expirera après %d jours."
-#: ../../Zotlabs/Module/Editlayout.php:127
-#: ../../Zotlabs/Module/Layouts.php:128 ../../Zotlabs/Module/Layouts.php:188
-msgid "Layout Name"
-msgstr "Nom de la mise en page"
+#: ../../Zotlabs/Module/Settings/Channel.php:507
+msgid "This website does not expire imported content."
+msgstr "Ce site web ne périme pas le contenu importé."
-#: ../../Zotlabs/Module/Editlayout.php:128
-#: ../../Zotlabs/Module/Layouts.php:131
-msgid "Layout Description (Optional)"
-msgstr "Description de la mise en page (facultatif)"
+#: ../../Zotlabs/Module/Settings/Channel.php:507
+msgid "The website limit takes precedence if lower than your limit."
+msgstr "La limite du site Web a priorité si elle est inférieure à votre limite."
-#: ../../Zotlabs/Module/Editlayout.php:136
-msgid "Edit Layout"
-msgstr "Modifier la mise en page"
+#: ../../Zotlabs/Module/Settings/Channel.php:508
+msgid "Maximum Friend Requests/Day:"
+msgstr "Nombre maximum de demandes de contact par jour&nbsp;:"
-#: ../../Zotlabs/Module/Editwebpage.php:142
-msgid "Page link"
-msgstr "Lien"
+#: ../../Zotlabs/Module/Settings/Channel.php:508
+msgid "May reduce spam activity"
+msgstr "Contribue à réduire l'impact des indésirables"
-#: ../../Zotlabs/Module/Editwebpage.php:169
-msgid "Edit Webpage"
-msgstr "Modifier la page web"
+#: ../../Zotlabs/Module/Settings/Channel.php:509
+msgid "Default Access Control List (ACL)"
+msgstr "Default Access Control List (ACL)"
-#: ../../Zotlabs/Module/Like.php:19
-msgid "Like/Dislike"
-msgstr "Aime/n'aime pas"
+#: ../../Zotlabs/Module/Settings/Channel.php:511
+msgid "Use my default audience setting for the type of object published"
+msgstr "Utiliser mon paramètre de publication par défaut pour le type d'objet publié"
-#: ../../Zotlabs/Module/Like.php:24
-msgid "This action is restricted to members."
-msgstr "Cette action est réservée aux membres."
+#: ../../Zotlabs/Module/Settings/Channel.php:518
+msgid "Channel permissions category:"
+msgstr "Catégorie de permissions du canal&nbsp;:"
-#: ../../Zotlabs/Module/Like.php:25
+#: ../../Zotlabs/Module/Settings/Channel.php:519
+msgid "Default Permissions Group"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Channel.php:525
+msgid "Maximum private messages per day from unknown people:"
+msgstr "Nombre maximum de messages privés émanant d'inconnus, par jour&nbsp;:"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:525
+msgid "Useful to reduce spamming"
+msgstr "Utile pour réduire les indésirables"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:528
+msgid "Notification Settings"
+msgstr "Paramètres de notification"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:529
+msgid "By default post a status message when:"
+msgstr "Par défaut, publier un statut quand&nbsp;:"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:530
+msgid "accepting a friend request"
+msgstr "vous acceptez une demande de contact"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:531
+msgid "joining a forum/community"
+msgstr "vous rejoignez un forum ou une communauté"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:532
+msgid "making an <em>interesting</em> profile change"
+msgstr "vous faîtes une modification <em>intéressante</em> de votre profil"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:533
+msgid "Send a notification email when:"
+msgstr "Envoyer un courriel de notification quand&nbsp;:"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:534
+msgid "You receive a connection request"
+msgstr "Vous recevez une demande de contact"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:535
+msgid "Your connections are confirmed"
+msgstr "Vos contacts sont confirmés"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:536
+msgid "Someone writes on your profile wall"
+msgstr "Quelqu'un a écrit sur votre mur"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:537
+msgid "Someone writes a followup comment"
+msgstr "Quelqu'un a commenté vos publications"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:538
+msgid "You receive a private message"
+msgstr "Vous recevez un message privé"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:539
+msgid "You receive a friend suggestion"
+msgstr "Vous recevez une suggestion d'amitié/contact"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:540
+msgid "You are tagged in a post"
+msgstr "Vous êtes étiqueté dans une publication"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:541
+msgid "You are poked/prodded/etc. in a post"
+msgstr "Vous êtes tapoté/encouragé/etc. dans une publication"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:543
+msgid "Someone likes your post/comment"
+msgstr "Quelqu'un aime votre publication/commentaire"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:546
+msgid "Show visual notifications including:"
+msgstr "Afficher des notifications visuelles y compris&nbsp;:"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:548
+msgid "Unseen grid activity"
+msgstr "Activité du réseau pas encore consultée"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:549
+msgid "Unseen channel activity"
+msgstr "Activité non vue sur le canal"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:550
+msgid "Unseen private messages"
+msgstr "Messages privés non lus"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:550
+#: ../../Zotlabs/Module/Settings/Channel.php:555
+#: ../../Zotlabs/Module/Settings/Channel.php:556
+#: ../../Zotlabs/Module/Settings/Channel.php:557
+#: ../../addon/jappixmini/jappixmini.php:343
+msgid "Recommended"
+msgstr "Recommandé"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:551
+msgid "Upcoming events"
+msgstr "Événements à venir"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:552
+msgid "Events today"
+msgstr "Événements aujourd'hui"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:553
+msgid "Upcoming birthdays"
+msgstr "Anniversaires à venir"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:553
+msgid "Not available in all themes"
+msgstr "Pas disponible dans tous les thèmes"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:554
+msgid "System (personal) notifications"
+msgstr "Notifications système (personnelles)"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:555
+msgid "System info messages"
+msgstr "Messages d'info système"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:556
+msgid "System critical alerts"
+msgstr "Alertes critiques système"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:557
+msgid "New connections"
+msgstr "Nouveaux contacts"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:558
+msgid "System Registrations"
+msgstr "Inscriptions système"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:559
msgid ""
-"Please <a href=\"rmagic\">login with your $Projectname ID</a> or <a "
-"href=\"register\">register as a new $Projectname member</a> to continue."
-msgstr "S'il vous plait, <a href=\"rmagic\">identifiez vous avec votre identifant de $Projectname </a> ou <a href=\"register\">inscrivez vous comme nouveau membre de $Projectname </a> pour continuer."
+"Also show new wall posts, private messages and connections under Notices"
+msgstr "Afficher également les nouvelles publications sur le mur, les messages privés et les contacts dans Notifications"
-#: ../../Zotlabs/Module/Like.php:105 ../../Zotlabs/Module/Like.php:131
-#: ../../Zotlabs/Module/Like.php:169
-msgid "Invalid request."
-msgstr "Requête invalide."
+#: ../../Zotlabs/Module/Settings/Channel.php:561
+msgid "Notify me of events this many days in advance"
+msgstr "Me prévenir d’événements à venir tant de jours en avance"
-#: ../../Zotlabs/Module/Like.php:117 ../../include/conversation.php:126
-msgid "channel"
-msgstr "canal"
+#: ../../Zotlabs/Module/Settings/Channel.php:561
+msgid "Must be greater than 0"
+msgstr "Doit être supérieur à 0"
-#: ../../Zotlabs/Module/Like.php:146
-msgid "thing"
-msgstr "chose"
+#: ../../Zotlabs/Module/Settings/Channel.php:567
+msgid "Advanced Account/Page Type Settings"
+msgstr "Paramètres avancés de compte/type de page"
-#: ../../Zotlabs/Module/Like.php:192
-msgid "Channel unavailable."
-msgstr "Canal indisponible."
+#: ../../Zotlabs/Module/Settings/Channel.php:568
+msgid "Change the behaviour of this account for special situations"
+msgstr "Modifie le comportement de ce compte pour des situations particulières"
-#: ../../Zotlabs/Module/Like.php:240
-msgid "Previous action reversed."
-msgstr "Action précédente annulée."
+#: ../../Zotlabs/Module/Settings/Channel.php:570
+msgid "Miscellaneous Settings"
+msgstr "Paramètres divers"
-#: ../../Zotlabs/Module/Like.php:370 ../../Zotlabs/Module/Subthread.php:87
-#: ../../Zotlabs/Module/Tagger.php:47
-#: ../../extend/addon/addon/diaspora/inbound.php:1794
-#: ../../extend/addon/addon/redphotos/redphotohelper.php:74
-#: ../../include/conversation.php:120 ../../include/text.php:1953
-msgid "photo"
-msgstr "photo"
+#: ../../Zotlabs/Module/Settings/Channel.php:571
+msgid "Default photo upload folder"
+msgstr "Répertoire par défaut pour les photos téléversées"
-#: ../../Zotlabs/Module/Like.php:370 ../../Zotlabs/Module/Subthread.php:87
-#: ../../extend/addon/addon/diaspora/inbound.php:1794
-#: ../../include/conversation.php:148 ../../include/text.php:1959
-msgid "status"
-msgstr "état"
+#: ../../Zotlabs/Module/Settings/Channel.php:571
+#: ../../Zotlabs/Module/Settings/Channel.php:572
+msgid "%Y - current year, %m - current month"
+msgstr "%Y - année en cours, %m - mois en cours"
-#: ../../Zotlabs/Module/Like.php:372 ../../Zotlabs/Module/Events.php:260
-#: ../../Zotlabs/Module/Tagger.php:51 ../../include/conversation.php:123
-#: ../../include/text.php:1956 ../../include/event.php:1000
-msgid "event"
-msgstr "événement"
+#: ../../Zotlabs/Module/Settings/Channel.php:572
+msgid "Default file upload folder"
+msgstr "Répertoire par défaut pour les fichiers téléversés"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:574
+msgid "Personal menu to display in your channel pages"
+msgstr "Menu personnel à afficher sur les pages de votre canal"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:576
+msgid "Remove this channel."
+msgstr "Supprimer ce canal"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:577
+msgid "Firefox Share $Projectname provider"
+msgstr "Connecteur $Projectname pour Firefox Share"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:578
+msgid "Start calendar week on Monday"
+msgstr ""
-#: ../../Zotlabs/Module/Like.php:419
-#: ../../extend/addon/addon/diaspora/inbound.php:1823
-#: ../../include/conversation.php:164
+#: ../../Zotlabs/Module/Settings/Features.php:45
+msgid "Additional Features"
+msgstr "Fonctionnalités additionnelles"
+
+#: ../../Zotlabs/Module/Settings/Tokens.php:31
#, php-format
-msgid "%1$s likes %2$s's %3$s"
-msgstr "%1$s aime %3$s de %2$s"
+msgid "This channel is limited to %d tokens"
+msgstr "Ce canal est limité à %d jetons"
+
+#: ../../Zotlabs/Module/Settings/Tokens.php:37
+msgid "Name and Password are required."
+msgstr "Le nom et le mot de passe sont requis"
+
+#: ../../Zotlabs/Module/Settings/Tokens.php:77
+msgid "Token saved."
+msgstr "Jeton sauvegardé"
+
+#: ../../Zotlabs/Module/Settings/Tokens.php:113
+msgid ""
+"Use this form to create temporary access identifiers to share things with "
+"non-members. These identities may be used in Access Control Lists and "
+"visitors may login using these credentials to access private content."
+msgstr "Utilisez ce formulaire pour créer des identifiants d'accès temporaires pour partager des informations avec des non-membres. Ces identités peuvent être utilisées dans les listes de contrôle d'accès et les visiteurs peuvent se connecter en utilisant ces certificats d'identification pour accéder au contenu privé."
-#: ../../Zotlabs/Module/Like.php:421 ../../include/conversation.php:167
+#: ../../Zotlabs/Module/Settings/Tokens.php:115
+msgid ""
+"You may also provide <em>dropbox</em> style access links to friends and "
+"associates by adding the Login Password to any specific site URL as shown. "
+"Examples:"
+msgstr "Vous pouvez également fournir des liens d'accès, style <em>dropbox</em>, aux amis et aux associés en ajoutant le mot de passe de connexion à l'URL d'un site spécifique, comme indiqué. Exemples:"
+
+#: ../../Zotlabs/Module/Settings/Tokens.php:150
+#: ../../Zotlabs/Widget/Settings_menu.php:90
+msgid "Guest Access Tokens"
+msgstr "Jeton d'accès pour un invité"
+
+#: ../../Zotlabs/Module/Settings/Tokens.php:157
+msgid "Login Name"
+msgstr "Nom d'utilisateur"
+
+#: ../../Zotlabs/Module/Settings/Tokens.php:158
+msgid "Login Password"
+msgstr "Mot de passe"
+
+#: ../../Zotlabs/Module/Settings/Tokens.php:159
+msgid "Expires (yyyy-mm-dd)"
+msgstr "Date d'expiration sous la forme année mois jour (AAAA-MM-JJ)"
+
+#: ../../Zotlabs/Module/Settings/Tokens.php:160
+#: ../../Zotlabs/Module/Connedit.php:893
+msgid "Their Settings"
+msgstr "Leurs paramètres"
+
+#: ../../Zotlabs/Module/Settings/Account.php:20
+msgid "Not valid email."
+msgstr "Adresse de courriel non valide."
+
+#: ../../Zotlabs/Module/Settings/Account.php:23
+msgid "Protected email address. Cannot change to that email."
+msgstr "Adresse de courriel protégée. Impossible de l'utiliser."
+
+#: ../../Zotlabs/Module/Settings/Account.php:32
+msgid "System failure storing new email. Please try again."
+msgstr "Défaillance système lors du stockage de la nouvelle adresse de courriel. Merci d'essayer à nouveau."
+
+#: ../../Zotlabs/Module/Settings/Account.php:40
+msgid "Technical skill level updated"
+msgstr "Niveau technique mis à jour"
+
+#: ../../Zotlabs/Module/Settings/Account.php:56
+msgid "Password verification failed."
+msgstr "La vérification du mot de passe a échoué."
+
+#: ../../Zotlabs/Module/Settings/Account.php:63
+msgid "Passwords do not match. Password unchanged."
+msgstr "Les deux saisies du mot de passe ne correspondent pas. Il n'a donc pas été changé."
+
+#: ../../Zotlabs/Module/Settings/Account.php:67
+msgid "Empty passwords are not allowed. Password unchanged."
+msgstr "Le mot de passe ne peut pas être vide. Il n'a donc pas été changé."
+
+#: ../../Zotlabs/Module/Settings/Account.php:81
+msgid "Password changed."
+msgstr "Le mot de passe a été changé."
+
+#: ../../Zotlabs/Module/Settings/Account.php:83
+msgid "Password update failed. Please try again."
+msgstr "La mise à jour du mot de passe a échoué. Merci d'essayer à nouveau."
+
+#: ../../Zotlabs/Module/Settings/Account.php:112
+msgid "Account Settings"
+msgstr "Paramètres du compte"
+
+#: ../../Zotlabs/Module/Settings/Account.php:113
+msgid "Current Password"
+msgstr "Mot de passe actuel"
+
+#: ../../Zotlabs/Module/Settings/Account.php:114
+msgid "Enter New Password"
+msgstr "Entrez votre nouveau mot de passe"
+
+#: ../../Zotlabs/Module/Settings/Account.php:115
+msgid "Confirm New Password"
+msgstr "Confirmez le nouveau mot de passe"
+
+#: ../../Zotlabs/Module/Settings/Account.php:115
+msgid "Leave password fields blank unless changing"
+msgstr "Laissez les mots de passe vides si vous ne voulez pas les modifier"
+
+#: ../../Zotlabs/Module/Settings/Account.php:116
+msgid "Your technical skill level"
+msgstr "Votre niveau technique"
+
+#: ../../Zotlabs/Module/Settings/Account.php:116
+msgid "Used to provide a member experience matched to your comfort level"
+msgstr "Utilisé pour fournir une expérience utilisateur correspondant à votre niveau de confort"
+
+#: ../../Zotlabs/Module/Settings/Account.php:120
+#: ../../Zotlabs/Module/Removeaccount.php:61
+msgid "Remove Account"
+msgstr "Supprimer le compte"
+
+#: ../../Zotlabs/Module/Settings/Account.php:121
+msgid "Remove this account including all its channels"
+msgstr "Supprimer ce compte et tous ses canaux"
+
+#: ../../Zotlabs/Module/Settings/Featured.php:20
+msgid "Affinity Slider settings updated."
+msgstr "Paramètres de la réglette d'affinité mis à jour."
+
+#: ../../Zotlabs/Module/Settings/Featured.php:34
+msgid "No feature settings configured"
+msgstr "Aucun paramètre de fonctionnalité configuré"
+
+#: ../../Zotlabs/Module/Settings/Featured.php:41
+msgid "Default maximum affinity level"
+msgstr "Niveau d'affinité maximum par défaut"
+
+#: ../../Zotlabs/Module/Settings/Featured.php:46
+msgid "Default minimum affinity level"
+msgstr "Niveau d'affinité minimum par défaut"
+
+#: ../../Zotlabs/Module/Settings/Featured.php:50
+msgid "Affinity Slider Settings"
+msgstr "Paramètres de la réglette d'affinité"
+
+#: ../../Zotlabs/Module/Settings/Featured.php:60
+msgid "Feature/Addon Settings"
+msgstr "Paramètres des extensions/greffons"
+
+#: ../../Zotlabs/Module/Settings/Display.php:145
+msgid "No special theme for mobile devices"
+msgstr "Pas de thème spécifique aux mobiles"
+
+#: ../../Zotlabs/Module/Settings/Display.php:148
#, php-format
-msgid "%1$s doesn't like %2$s's %3$s"
-msgstr "%1$s n'aime pas %3$s de %2$s"
+msgid "%s - (Experimental)"
+msgstr "%s - (Expérimental)"
-#: ../../Zotlabs/Module/Like.php:423
+#: ../../Zotlabs/Module/Settings/Display.php:198
+msgid "Display Settings"
+msgstr "Afficher les paramètres"
+
+#: ../../Zotlabs/Module/Settings/Display.php:199
+msgid "Theme Settings"
+msgstr "Paramètres du thème"
+
+#: ../../Zotlabs/Module/Settings/Display.php:200
+msgid "Custom Theme Settings"
+msgstr "Paramètres personnels du thème"
+
+#: ../../Zotlabs/Module/Settings/Display.php:201
+msgid "Content Settings"
+msgstr "Paramètres liés au contenu"
+
+#: ../../Zotlabs/Module/Settings/Display.php:207
+msgid "Display Theme:"
+msgstr "Afficher le thème&nbsp;:"
+
+#: ../../Zotlabs/Module/Settings/Display.php:208
+msgid "Select scheme"
+msgstr "Définir la palette de couleurs"
+
+#: ../../Zotlabs/Module/Settings/Display.php:210
+msgid "Mobile Theme:"
+msgstr "Thème mobile&nbsp;:"
+
+#: ../../Zotlabs/Module/Settings/Display.php:211
+msgid "Preload images before rendering the page"
+msgstr "Pré-charger les images avant d'afficher la page"
+
+#: ../../Zotlabs/Module/Settings/Display.php:211
+msgid ""
+"The subjective page load time will be longer but the page will be ready when"
+" displayed"
+msgstr "Le temps de charge perçu de la page sera plus long mais la page sera complète quand elle s'affichera"
+
+#: ../../Zotlabs/Module/Settings/Display.php:212
+msgid "Enable user zoom on mobile devices"
+msgstr "Permettre à l'utilisateur d'un mobile d'agrandir le contenu"
+
+#: ../../Zotlabs/Module/Settings/Display.php:213
+msgid "Update browser every xx seconds"
+msgstr "Mettre à jour le navigateur toutes les xx secondes"
+
+#: ../../Zotlabs/Module/Settings/Display.php:213
+msgid "Minimum of 10 seconds, no maximum"
+msgstr "Minimum 10 secondes, pas de maximum"
+
+#: ../../Zotlabs/Module/Settings/Display.php:214
+msgid "Maximum number of conversations to load at any time:"
+msgstr "Nombre maximal de conversations pouvant être chargées en même temps&nbsp;:"
+
+#: ../../Zotlabs/Module/Settings/Display.php:214
+msgid "Maximum of 100 items"
+msgstr "100 éléments au maximum"
+
+#: ../../Zotlabs/Module/Settings/Display.php:215
+msgid "Show emoticons (smilies) as images"
+msgstr "Remplacer les émoticônes (smileys) par des images"
+
+#: ../../Zotlabs/Module/Settings/Display.php:216
+msgid "Manual conversation updates"
+msgstr "Manuel de mises à jour des conversations"
+
+#: ../../Zotlabs/Module/Settings/Display.php:216
+msgid "Default is on, turning this off may increase screen jumping"
+msgstr "Activé par défaut, le désactiver peut accroître les sauts d'écran"
+
+#: ../../Zotlabs/Module/Settings/Display.php:217
+msgid "Link post titles to source"
+msgstr "Lier les titres des publications à leur source"
+
+#: ../../Zotlabs/Module/Settings/Display.php:218
+msgid "System Page Layout Editor - (advanced)"
+msgstr "Editeur de mise en page des pages systèmes - (avancé)"
+
+#: ../../Zotlabs/Module/Settings/Display.php:221
+msgid "Use blog/list mode on channel page"
+msgstr "Utiliser le mode blog/liste sur la page du canal"
+
+#: ../../Zotlabs/Module/Settings/Display.php:221
+#: ../../Zotlabs/Module/Settings/Display.php:222
+msgid "(comments displayed separately)"
+msgstr "(commentaires affichés séparément)"
+
+#: ../../Zotlabs/Module/Settings/Display.php:222
+msgid "Use blog/list mode on grid page"
+msgstr "Utiliser le mode blog/liste sur la page du réseau"
+
+#: ../../Zotlabs/Module/Settings/Display.php:223
+msgid "Channel page max height of content (in pixels)"
+msgstr "Hauteur maximale du contenu pour la page du canal (en pixels)"
+
+#: ../../Zotlabs/Module/Settings/Display.php:223
+#: ../../Zotlabs/Module/Settings/Display.php:224
+msgid "click to expand content exceeding this height"
+msgstr "cliquer pour dérouler le contenu dépassant cette limite"
+
+#: ../../Zotlabs/Module/Settings/Display.php:224
+msgid "Grid page max height of content (in pixels)"
+msgstr "Hauteur maximale du contenu sur la page du réseau (en pixels)"
+
+#: ../../Zotlabs/Module/Settings/Oauth.php:34
+msgid "Name is required"
+msgstr "Le nom est requis"
+
+#: ../../Zotlabs/Module/Settings/Oauth.php:38
+msgid "Key and Secret are required"
+msgstr "Clef et secret sont requis"
+
+#: ../../Zotlabs/Module/Settings/Oauth.php:86
+#: ../../Zotlabs/Module/Settings/Oauth.php:112
+#: ../../Zotlabs/Module/Settings/Oauth.php:148
+msgid "Add application"
+msgstr "Ajouter une application"
+
+#: ../../Zotlabs/Module/Settings/Oauth.php:89
+msgid "Name of application"
+msgstr "Nom de l'application"
+
+#: ../../Zotlabs/Module/Settings/Oauth.php:90
+#: ../../Zotlabs/Module/Settings/Oauth.php:116
+#: ../../addon/statusnet/statusnet.php:893 ../../addon/twitter/twitter.php:775
+msgid "Consumer Key"
+msgstr "Clef client"
+
+#: ../../Zotlabs/Module/Settings/Oauth.php:90
+#: ../../Zotlabs/Module/Settings/Oauth.php:91
+msgid "Automatically generated - change if desired. Max length 20"
+msgstr "Généré automatiquement - à changer si besoin. Longueur maximale 20 caractères."
+
+#: ../../Zotlabs/Module/Settings/Oauth.php:91
+#: ../../Zotlabs/Module/Settings/Oauth.php:117
+#: ../../addon/statusnet/statusnet.php:892 ../../addon/twitter/twitter.php:776
+msgid "Consumer Secret"
+msgstr "Secret client"
+
+#: ../../Zotlabs/Module/Settings/Oauth.php:92
+#: ../../Zotlabs/Module/Settings/Oauth.php:118
+msgid "Redirect"
+msgstr "Redirection"
+
+#: ../../Zotlabs/Module/Settings/Oauth.php:92
+msgid ""
+"Redirect URI - leave blank unless your application specifically requires "
+"this"
+msgstr "URI de redirection - laissez vide, sauf si votre application le requiert spécifiquement"
+
+#: ../../Zotlabs/Module/Settings/Oauth.php:93
+#: ../../Zotlabs/Module/Settings/Oauth.php:119
+msgid "Icon url"
+msgstr "URL de l'icône"
+
+#: ../../Zotlabs/Module/Settings/Oauth.php:93
+#: ../../Zotlabs/Module/Sources.php:112 ../../Zotlabs/Module/Sources.php:147
+msgid "Optional"
+msgstr "Facultatif"
+
+#: ../../Zotlabs/Module/Settings/Oauth.php:104
+msgid "Application not found."
+msgstr "Application introuvable."
+
+#: ../../Zotlabs/Module/Settings/Oauth.php:147
+msgid "Connected Apps"
+msgstr "Applications connectées"
+
+#: ../../Zotlabs/Module/Settings/Oauth.php:151
+msgid "Client key starts with"
+msgstr "La clef partagée commence par"
+
+#: ../../Zotlabs/Module/Settings/Oauth.php:152
+msgid "No name"
+msgstr "Sans nom"
+
+#: ../../Zotlabs/Module/Settings/Oauth.php:153
+msgid "Remove authorization"
+msgstr "Révoquer l'autorisation"
+
+#: ../../Zotlabs/Module/Embedphotos.php:139
+#: ../../Zotlabs/Module/Photos.php:751 ../../Zotlabs/Module/Photos.php:1290
+#: ../../Zotlabs/Widget/Album.php:78
+msgid "View Photo"
+msgstr "Voir la photo"
+
+#: ../../Zotlabs/Module/Embedphotos.php:145
+#: ../../Zotlabs/Module/Photos.php:757 ../../Zotlabs/Module/Photos.php:1213
+#: ../../Zotlabs/Lib/Apps.php:561 ../../Zotlabs/Lib/Apps.php:639
+#: ../../Zotlabs/Storage/Browser.php:163 ../../Zotlabs/Widget/Album.php:84
+#: ../../addon/cdav/Mod_Cdav.php:745 ../../addon/cdav/Mod_Cdav.php:746
+#: ../../addon/cdav/Mod_Cdav.php:753 ../../include/conversation.php:1110
+msgid "Unknown"
+msgstr "Inconnu"
+
+#: ../../Zotlabs/Module/Embedphotos.php:155
+#: ../../Zotlabs/Module/Photos.php:782 ../../Zotlabs/Widget/Album.php:95
+msgid "Edit Album"
+msgstr "Modifier l'album"
+
+#: ../../Zotlabs/Module/Embedphotos.php:157
+#: ../../Zotlabs/Module/Photos.php:784 ../../Zotlabs/Module/Photos.php:1321
+#: ../../Zotlabs/Module/Profile_photo.php:423
+#: ../../Zotlabs/Module/Cover_photo.php:361
+#: ../../Zotlabs/Storage/Browser.php:229 ../../Zotlabs/Storage/Browser.php:334
+#: ../../Zotlabs/Widget/Album.php:97 ../../addon/cdav/include/widgets.php:132
+#: ../../addon/cdav/include/widgets.php:168
+msgid "Upload"
+msgstr "Envoyer"
+
+#: ../../Zotlabs/Module/Achievements.php:38
+msgid "Some blurb about what to do when you're new here"
+msgstr "Quelques mots sur quoi faire quand on est nouveau ici"
+
+#: ../../Zotlabs/Module/Thing.php:114
+msgid "Thing updated"
+msgstr "Elément mis à jour"
+
+#: ../../Zotlabs/Module/Thing.php:166
+msgid "Object store: failed"
+msgstr "Stockage de l'objet&nbsp;: échec"
+
+#: ../../Zotlabs/Module/Thing.php:170
+msgid "Thing added"
+msgstr "Elément ajouté"
+
+#: ../../Zotlabs/Module/Thing.php:196
#, php-format
-msgid "%1$s agrees with %2$s's %3$s"
-msgstr "%1$s approuve %3$s de %2$s"
+msgid "OBJ: %1$s %2$s %3$s"
+msgstr "OBJ: %1$s %2$s %3$s"
-#: ../../Zotlabs/Module/Like.php:425
+#: ../../Zotlabs/Module/Thing.php:259
+msgid "Show Thing"
+msgstr "Montrer élément"
+
+#: ../../Zotlabs/Module/Thing.php:266
+msgid "item not found."
+msgstr "élément introuvable."
+
+#: ../../Zotlabs/Module/Thing.php:299
+msgid "Edit Thing"
+msgstr "Modifier élément"
+
+#: ../../Zotlabs/Module/Thing.php:301 ../../Zotlabs/Module/Thing.php:355
+msgid "Select a profile"
+msgstr "Choisissez un profil"
+
+#: ../../Zotlabs/Module/Thing.php:305 ../../Zotlabs/Module/Thing.php:358
+msgid "Post an activity"
+msgstr "Publier une activité"
+
+#: ../../Zotlabs/Module/Thing.php:305 ../../Zotlabs/Module/Thing.php:358
+msgid "Only sends to viewers of the applicable profile"
+msgstr "Envoie exclusivement aux visiteurs du profil concerné"
+
+#: ../../Zotlabs/Module/Thing.php:307 ../../Zotlabs/Module/Thing.php:360
+msgid "Name of thing e.g. something"
+msgstr "Nom de l'élément, p.ex. quelque-chose"
+
+#: ../../Zotlabs/Module/Thing.php:309 ../../Zotlabs/Module/Thing.php:361
+msgid "URL of thing (optional)"
+msgstr "URL de l'élément (facultatif)"
+
+#: ../../Zotlabs/Module/Thing.php:311 ../../Zotlabs/Module/Thing.php:362
+msgid "URL for photo of thing (optional)"
+msgstr "URL d'une photo de l'élément (facultatif)"
+
+#: ../../Zotlabs/Module/Thing.php:313 ../../Zotlabs/Module/Thing.php:363
+#: ../../Zotlabs/Module/Photos.php:647 ../../Zotlabs/Module/Photos.php:1011
+#: ../../Zotlabs/Module/Connedit.php:680 ../../Zotlabs/Module/Chat.php:233
+#: ../../Zotlabs/Module/Filestorage.php:152
+#: ../../include/acl_selectors.php:218
+msgid "Permissions"
+msgstr "Autorisations"
+
+#: ../../Zotlabs/Module/Thing.php:353
+msgid "Add Thing to your Profile"
+msgstr "Ajouter l'élément à votre profil"
+
+#: ../../Zotlabs/Module/Notify.php:57
+#: ../../Zotlabs/Module/Notifications.php:38
+msgid "No more system notifications."
+msgstr "Pas d'autre notification du système."
+
+#: ../../Zotlabs/Module/Notify.php:61
+#: ../../Zotlabs/Module/Notifications.php:42
+msgid "System Notifications"
+msgstr "Notifications du système"
+
+#: ../../Zotlabs/Module/Follow.php:31
+msgid "Channel added."
+msgstr "Canal ajouté."
+
+#: ../../Zotlabs/Module/Import.php:144
#, php-format
-msgid "%1$s doesn't agree with %2$s's %3$s"
-msgstr "%1$s n'est pas d'accord avec %3$s de %2$s"
+msgid "Your service plan only allows %d channels."
+msgstr "Votre forfait n'autorise que %d canaux."
-#: ../../Zotlabs/Module/Like.php:427
+#: ../../Zotlabs/Module/Import.php:158
+msgid "No channel. Import failed."
+msgstr "Pas de canal. Echec de l'import."
+
+#: ../../Zotlabs/Module/Import.php:466
+#: ../../addon/diaspora/import_diaspora.php:142
+msgid "Import completed."
+msgstr "L'import est terminé."
+
+#: ../../Zotlabs/Module/Import.php:492
+msgid "You must be logged in to use this feature."
+msgstr "Vous devez vous connecter pour utiliser cette fonctionnalité."
+
+#: ../../Zotlabs/Module/Import.php:497
+msgid "Import Channel"
+msgstr "Importation de canal"
+
+#: ../../Zotlabs/Module/Import.php:498
+msgid ""
+"Use this form to import an existing channel from a different server/hub. You"
+" may retrieve the channel identity from the old server/hub via the network "
+"or provide an export file."
+msgstr "Utilisez ce formulaire pour importer un canal existant sur un autre serveur. Vous pouvez récupérer l'identité du canal sur l'ancien serveur directement par le réseau, ou bien fournir un fichier d'export/import."
+
+#: ../../Zotlabs/Module/Import.php:500
+msgid "Or provide the old server/hub details"
+msgstr "Ou fournissez les détails de l'ancien serveur/hub"
+
+#: ../../Zotlabs/Module/Import.php:501
+msgid "Your old identity address (xyz@example.com)"
+msgstr "Votre ancienne identité (zyx@exemple.com)"
+
+#: ../../Zotlabs/Module/Import.php:502
+msgid "Your old login email address"
+msgstr "Votre ancienne adresse de courriel"
+
+#: ../../Zotlabs/Module/Import.php:503
+msgid "Your old login password"
+msgstr "Votre ancien mot de passe"
+
+#: ../../Zotlabs/Module/Import.php:504
+msgid ""
+"For either option, please choose whether to make this hub your new primary "
+"address, or whether your old location should continue this role. You will be"
+" able to post from either location, but only one can be marked as the "
+"primary location for files, photos, and media."
+msgstr "Quelle que soit l'option choisie, merci de décider si ce hub sera votre nouvelle adresse primaire, ou si votre ancien hub continuera à jouer ce rôle. Vous pourrez publier depuis l'emplacement de votre choix, mais une seule peut être déclarée comme stockage primaire de vos fichiers/photos/media."
+
+#: ../../Zotlabs/Module/Import.php:505
+msgid "Make this hub my primary location"
+msgstr "Faire de ce hub mon emplacement primaire"
+
+#: ../../Zotlabs/Module/Import.php:506
+msgid "Move this channel (disable all previous locations)"
+msgstr "Déplacer ce canal (désactiver tous les emplacements précédents)"
+
+#: ../../Zotlabs/Module/Import.php:507
+msgid "Import a few months of posts if possible (limited by available memory"
+msgstr "Importer plusieurs mois de messages si possible (limité par la mémoire disponible)"
+
+#: ../../Zotlabs/Module/Import.php:508
+msgid ""
+"This process may take several minutes to complete. Please submit the form "
+"only once and leave this page open until finished."
+msgstr "Ce processus peut prendre plusieurs minutes. Merci de ne valider le formulaire qu'une seule fois et de laisser cette page ouverte jusqu'à la fin."
+
+#: ../../Zotlabs/Module/Rmagic.php:35
+msgid "Authentication failed."
+msgstr "Échec de l'authentification."
+
+#: ../../Zotlabs/Module/Rmagic.php:75 ../../include/channel.php:1982
+msgid "Remote Authentication"
+msgstr "Authentification distante"
+
+#: ../../Zotlabs/Module/Rmagic.php:76 ../../include/channel.php:1983
+msgid "Enter your channel address (e.g. channel@example.com)"
+msgstr "Entrez l'adresse de votre canal (par ex. moncanal@monsite.com)"
+
+#: ../../Zotlabs/Module/Rmagic.php:77 ../../include/channel.php:1984
+msgid "Authenticate"
+msgstr "Authentifier"
+
+#: ../../Zotlabs/Module/Cal.php:62 ../../Zotlabs/Module/Chanview.php:96
+#: ../../Zotlabs/Module/Page.php:56 ../../Zotlabs/Module/Wall_upload.php:31
+#: ../../Zotlabs/Module/Block.php:43
+msgid "Channel not found."
+msgstr "Canal introuvable."
+
+#: ../../Zotlabs/Module/Cal.php:69
+msgid "Permissions denied."
+msgstr "Permissions refusées."
+
+#: ../../Zotlabs/Module/Cal.php:342 ../../include/text.php:2299
+msgid "Import"
+msgstr "Import"
+
+#: ../../Zotlabs/Module/Api.php:72 ../../Zotlabs/Module/Api.php:93
+msgid "Authorize application connection"
+msgstr "Autoriser l'application à se connecter"
+
+#: ../../Zotlabs/Module/Api.php:73
+msgid "Return to your app and insert this Security Code:"
+msgstr "Revenez dans votre application et mettez le code de sécurité"
+
+#: ../../Zotlabs/Module/Api.php:83
+msgid "Please login to continue."
+msgstr "Merci de vous identifier pour continuer."
+
+#: ../../Zotlabs/Module/Api.php:95
+msgid ""
+"Do you want to authorize this application to access your posts and contacts,"
+" and/or create new posts for you?"
+msgstr "Voulez-vous autoriser cette application à accéder à vos publications et contacts, et/ou à publier en votre nom?"
+
+#: ../../Zotlabs/Module/Attach.php:13
+msgid "Item not available."
+msgstr "Élément indisponible."
+
+#: ../../Zotlabs/Module/Editblock.php:116 ../../Zotlabs/Module/Chat.php:205
+#: ../../Zotlabs/Module/Editwebpage.php:148 ../../Zotlabs/Module/Mail.php:287
+#: ../../Zotlabs/Module/Mail.php:424 ../../include/conversation.php:1228
+msgid "Insert web link"
+msgstr "Insérer lien web"
+
+#: ../../Zotlabs/Module/Editblock.php:129 ../../include/conversation.php:1339
+msgid "Title (optional)"
+msgstr "Titre (facultatif)"
+
+#: ../../Zotlabs/Module/Editblock.php:138
+msgid "Edit Block"
+msgstr "Modifier le bloc"
+
+#: ../../Zotlabs/Module/Profile.php:91
+msgid "vcard"
+msgstr "vcard"
+
+#: ../../Zotlabs/Module/Apps.php:45
+msgid "Apps"
+msgstr "Applications"
+
+#: ../../Zotlabs/Module/Apps.php:48
+msgid "Manage apps"
+msgstr ""
+
+#: ../../Zotlabs/Module/Apps.php:49
+msgid "Create new app"
+msgstr ""
+
+#: ../../Zotlabs/Module/Mood.php:67 ../../include/conversation.php:256
#, php-format
-msgid "%1$s abstains from a decision on %2$s's %3$s"
-msgstr "%1$s s'abstient de toute décision sur le %3$s de %2$s"
+msgctxt "mood"
+msgid "%1$s is %2$s"
+msgstr "%1$s est %2$s"
-#: ../../Zotlabs/Module/Like.php:429
+#: ../../Zotlabs/Module/Mood.php:135 ../../Zotlabs/Lib/Apps.php:234
+msgid "Mood"
+msgstr "Humeur"
+
+#: ../../Zotlabs/Module/Mood.php:136
+msgid "Set your current mood and tell your friends"
+msgstr "Indiquez votre humeur du moment à vos amis"
+
+#: ../../Zotlabs/Module/Connections.php:52
+#: ../../Zotlabs/Module/Connections.php:157
+#: ../../Zotlabs/Module/Connections.php:246
+msgid "Blocked"
+msgstr "Bloqué(e)"
+
+#: ../../Zotlabs/Module/Connections.php:57
+#: ../../Zotlabs/Module/Connections.php:164
+#: ../../Zotlabs/Module/Connections.php:245
+msgid "Ignored"
+msgstr "Ignoré(e)"
+
+#: ../../Zotlabs/Module/Connections.php:62
+#: ../../Zotlabs/Module/Connections.php:178
+#: ../../Zotlabs/Module/Connections.php:244
+msgid "Hidden"
+msgstr "Caché"
+
+#: ../../Zotlabs/Module/Connections.php:67
+#: ../../Zotlabs/Module/Connections.php:171
+#: ../../Zotlabs/Module/Connections.php:243
+msgid "Archived"
+msgstr "Archivé"
+
+#: ../../Zotlabs/Module/Connections.php:72
+#: ../../Zotlabs/Module/Connections.php:82 ../../Zotlabs/Module/Menu.php:116
+#: ../../include/conversation.php:1657
+msgid "New"
+msgstr "Nouveautés"
+
+#: ../../Zotlabs/Module/Connections.php:88
+#: ../../Zotlabs/Module/Connections.php:103
+#: ../../Zotlabs/Module/Connedit.php:717 ../../Zotlabs/Widget/Affinity.php:30
+msgid "All"
+msgstr "Tous"
+
+#: ../../Zotlabs/Module/Connections.php:134
+msgid "New Connections"
+msgstr "Nouveaux contacts"
+
+#: ../../Zotlabs/Module/Connections.php:137
+msgid "Show pending (new) connections"
+msgstr "Voir les (nouveaux) contacts en attente"
+
+#: ../../Zotlabs/Module/Connections.php:144
+msgid "Show all connections"
+msgstr "Voir tous les contacts"
+
+#: ../../Zotlabs/Module/Connections.php:160
+msgid "Only show blocked connections"
+msgstr "Ne montrer que les contacts bloqués"
+
+#: ../../Zotlabs/Module/Connections.php:167
+msgid "Only show ignored connections"
+msgstr "Ne montrer que les contacts ignorés"
+
+#: ../../Zotlabs/Module/Connections.php:174
+msgid "Only show archived connections"
+msgstr "Ne montrer que les contacts archivés"
+
+#: ../../Zotlabs/Module/Connections.php:181
+msgid "Only show hidden connections"
+msgstr "Ne montrer que les contacts cachés"
+
+#: ../../Zotlabs/Module/Connections.php:242
+msgid "Pending approval"
+msgstr "En attente de validation"
+
+#: ../../Zotlabs/Module/Connections.php:258
#, php-format
-msgid "%1$s is attending %2$s's %3$s"
-msgstr "%1$s participe à %3$s de %2$s"
+msgid "%1$s [%2$s]"
+msgstr "%1$s [%2$s]"
-#: ../../Zotlabs/Module/Like.php:431
+#: ../../Zotlabs/Module/Connections.php:259
+msgid "Edit connection"
+msgstr "Modifier le contact"
+
+#: ../../Zotlabs/Module/Connections.php:260
+msgid "Delete connection"
+msgstr "Supprimer le contact"
+
+#: ../../Zotlabs/Module/Connections.php:269
+msgid "Channel address"
+msgstr "Adresse du canal"
+
+#: ../../Zotlabs/Module/Connections.php:271
+msgid "Network"
+msgstr "Réseau"
+
+#: ../../Zotlabs/Module/Connections.php:274
+msgid "Call"
+msgstr "Appeler"
+
+#: ../../Zotlabs/Module/Connections.php:276
+msgid "Status"
+msgstr "État"
+
+#: ../../Zotlabs/Module/Connections.php:278
+msgid "Connected"
+msgstr "Ami depuis"
+
+#: ../../Zotlabs/Module/Connections.php:280
+msgid "Approve connection"
+msgstr "Valider le contact"
+
+#: ../../Zotlabs/Module/Connections.php:282
+msgid "Ignore connection"
+msgstr "Ignorer le contact"
+
+#: ../../Zotlabs/Module/Connections.php:283
+#: ../../Zotlabs/Module/Connedit.php:634
+msgid "Ignore"
+msgstr "Ignorer"
+
+#: ../../Zotlabs/Module/Connections.php:284
+msgid "Recent activity"
+msgstr "Activité récente"
+
+#: ../../Zotlabs/Module/Connections.php:308 ../../Zotlabs/Lib/Apps.php:216
+#: ../../include/text.php:957 ../../include/nav.php:181
+msgid "Connections"
+msgstr "Contacts"
+
+#: ../../Zotlabs/Module/Connections.php:313
+msgid "Search your connections"
+msgstr "Chercher parmi vos contacts"
+
+#: ../../Zotlabs/Module/Connections.php:314
+msgid "Connections search"
+msgstr "Chercher des contacts"
+
+#: ../../Zotlabs/Module/Connections.php:315
+#: ../../Zotlabs/Module/Directory.php:391
+#: ../../Zotlabs/Module/Directory.php:396 ../../include/contact_widgets.php:23
+msgid "Find"
+msgstr "Trouver"
+
+#: ../../Zotlabs/Module/Viewsrc.php:46
+msgid "Source of Item"
+msgstr "Source de l'élément"
+
+#: ../../Zotlabs/Module/Bookmarks.php:53
+msgid "Bookmark added"
+msgstr "Favori ajouté"
+
+#: ../../Zotlabs/Module/Bookmarks.php:76
+msgid "My Bookmarks"
+msgstr "Mes Favoris"
+
+#: ../../Zotlabs/Module/Bookmarks.php:87
+msgid "My Connections Bookmarks"
+msgstr "Favoris de mes contacts"
+
+#: ../../Zotlabs/Module/Removeaccount.php:35
+msgid ""
+"Account removals are not allowed within 48 hours of changing the account "
+"password."
+msgstr "Il est impossible de supprimer un compte dans les 48 heures après avoir changé le mot de passe du compte."
+
+#: ../../Zotlabs/Module/Removeaccount.php:57
+msgid "Remove This Account"
+msgstr "Supprimer ce compte"
+
+#: ../../Zotlabs/Module/Removeaccount.php:58
+msgid ""
+"This account and all its channels will be completely removed from the "
+"network. "
+msgstr "Ce compte et tous ses canaux seront entièrement supprimés du réseau."
+
+#: ../../Zotlabs/Module/Removeaccount.php:60
+msgid ""
+"Remove this account, all its channels and all its channel clones from the "
+"network"
+msgstr "Supprimer du réseau ce compte, tous ses canaux et tous les clones de ses canaux."
+
+#: ../../Zotlabs/Module/Removeaccount.php:60
+msgid ""
+"By default only the instances of the channels located on this hub will be "
+"removed from the network"
+msgstr "Par défaut, seules les instances des canaux situés sur ce hub seront supprimées du réseau"
+
+#: ../../Zotlabs/Module/Photos.php:78
+msgid "Page owner information could not be retrieved."
+msgstr "Impossible d'obtenir des informations sur le propriétaire de la page."
+
+#: ../../Zotlabs/Module/Photos.php:94 ../../Zotlabs/Module/Photos.php:120
+msgid "Album not found."
+msgstr "Album introuvable."
+
+#: ../../Zotlabs/Module/Photos.php:103
+msgid "Delete Album"
+msgstr "Supprimer l'album"
+
+#: ../../Zotlabs/Module/Photos.php:174 ../../Zotlabs/Module/Photos.php:1023
+msgid "Delete Photo"
+msgstr "Supprimer la photo"
+
+#: ../../Zotlabs/Module/Photos.php:501
+msgid "No photos selected"
+msgstr "Aucune photo selectionnée"
+
+#: ../../Zotlabs/Module/Photos.php:550
+msgid "Access to this item is restricted."
+msgstr "L'accès à l'élément est restreint."
+
+#: ../../Zotlabs/Module/Photos.php:591
#, php-format
-msgid "%1$s is not attending %2$s's %3$s"
-msgstr "%1$s ne participe pas à %3$s de %2$s"
+msgid "%1$.2f MB of %2$.2f MB photo storage used."
+msgstr "Vous avez utilisé %1$.2f mégaoctets sur les %2$.2f autorisés pour le stockage des photos."
-#: ../../Zotlabs/Module/Like.php:433
+#: ../../Zotlabs/Module/Photos.php:594
#, php-format
-msgid "%1$s may attend %2$s's %3$s"
-msgstr "%1$s participe peut-être à %3$s de %2$s"
+msgid "%1$.2f MB photo storage used."
+msgstr "%1$.2f méga-octets utilisés pour le stockage des photos."
-#: ../../Zotlabs/Module/Like.php:538
-msgid "Action completed."
-msgstr "Action terminée."
+#: ../../Zotlabs/Module/Photos.php:636
+msgid "Upload Photos"
+msgstr "Téléverser des photos"
-#: ../../Zotlabs/Module/Like.php:539
-msgid "Thank you."
-msgstr "Merci."
+#: ../../Zotlabs/Module/Photos.php:640
+msgid "Enter an album name"
+msgstr "Entrer un nom d'album"
-#: ../../Zotlabs/Module/Dirsearch.php:25 ../../Zotlabs/Module/Regdir.php:49
-msgid "This site is not a directory server"
-msgstr "Ce site n'est pas un serveur d'annuaire"
+#: ../../Zotlabs/Module/Photos.php:641
+msgid "or select an existing album (doubleclick)"
+msgstr "ou sélectionner un album existant (double-clic)"
-#: ../../Zotlabs/Module/Dirsearch.php:33
-msgid "This directory server requires an access token"
-msgstr "Ce serveur d'annuaire requiert un jeton d'accès"
+#: ../../Zotlabs/Module/Photos.php:642
+msgid "Create a status post for this upload"
+msgstr "Créer une publication de statut pour cet envoi"
-#: ../../Zotlabs/Module/Network.php:96
-msgid "No such group"
-msgstr "Groupe introuvable"
+#: ../../Zotlabs/Module/Photos.php:643
+msgid "Caption (optional):"
+msgstr "Légende (facultative)"
-#: ../../Zotlabs/Module/Network.php:136
-msgid "No such channel"
-msgstr "Canal introuvable"
+#: ../../Zotlabs/Module/Photos.php:644
+msgid "Description (optional):"
+msgstr "Description (facultative)"
-#: ../../Zotlabs/Module/Network.php:141
-msgid "forum"
-msgstr "forum"
+#: ../../Zotlabs/Module/Photos.php:725
+msgid "Show Newest First"
+msgstr "Les plus récent(e)s en premier"
-#: ../../Zotlabs/Module/Network.php:153
-msgid "Search Results For:"
-msgstr "Résultats de recherche pour&nbsp;:"
+#: ../../Zotlabs/Module/Photos.php:727
+msgid "Show Oldest First"
+msgstr "Les moins récent(e)s en premier"
-#: ../../Zotlabs/Module/Network.php:221
-msgid "Privacy group is empty"
-msgstr "Groupe d'accès vide"
+#: ../../Zotlabs/Module/Photos.php:832
+msgid "Permission denied. Access to this item may be restricted."
+msgstr "Permission refusée. L'accès à cet élément peut avoir été restreint."
-#: ../../Zotlabs/Module/Network.php:230
-msgid "Privacy group: "
-msgstr "Groupe d'accès&nbsp;:"
+#: ../../Zotlabs/Module/Photos.php:834
+msgid "Photo not available"
+msgstr "Photo non disponible"
-#: ../../Zotlabs/Module/Network.php:256
-msgid "Invalid connection."
-msgstr "Contact non valide."
+#: ../../Zotlabs/Module/Photos.php:892
+msgid "Use as profile photo"
+msgstr "Utiliser comme photo du profil"
-#: ../../Zotlabs/Module/Menu.php:49
-msgid "Unable to update menu."
-msgstr "Impossible de mettre le menu à jour."
+#: ../../Zotlabs/Module/Photos.php:893
+msgid "Use as cover photo"
+msgstr "Utilisez comme bannière"
-#: ../../Zotlabs/Module/Menu.php:60
-msgid "Unable to create menu."
-msgstr "Impossible de créer le menu."
+#: ../../Zotlabs/Module/Photos.php:900
+msgid "Private Photo"
+msgstr "Photo privée"
-#: ../../Zotlabs/Module/Menu.php:98 ../../Zotlabs/Module/Menu.php:110
-msgid "Menu Name"
-msgstr "Nom du menu"
+#: ../../Zotlabs/Module/Photos.php:915
+msgid "View Full Size"
+msgstr "Voir en taille réelle"
-#: ../../Zotlabs/Module/Menu.php:98
-msgid "Unique name (not visible on webpage) - required"
-msgstr "Nom unique (non visible sur la page web) - requis"
+#: ../../Zotlabs/Module/Photos.php:997
+msgid "Edit photo"
+msgstr "Modifier la photo"
-#: ../../Zotlabs/Module/Menu.php:99 ../../Zotlabs/Module/Menu.php:111
-msgid "Menu Title"
-msgstr "Titre du menu"
+#: ../../Zotlabs/Module/Photos.php:999
+msgid "Rotate CW (right)"
+msgstr "Rotation horaire (droite)"
-#: ../../Zotlabs/Module/Menu.php:99
-msgid "Visible on webpage - leave empty for no title"
-msgstr "Visible pour la page web - laisser vide pour qu'il n'y ait pas de titre"
+#: ../../Zotlabs/Module/Photos.php:1000
+msgid "Rotate CCW (left)"
+msgstr "Rotation anti-horaire (gauche)"
-#: ../../Zotlabs/Module/Menu.php:100
-msgid "Allow Bookmarks"
-msgstr "Autoriser l'usage de favoris"
+#: ../../Zotlabs/Module/Photos.php:1003
+msgid "Move photo to album"
+msgstr "Déplacer la photo dans l'album"
-#: ../../Zotlabs/Module/Menu.php:100 ../../Zotlabs/Module/Menu.php:157
-msgid "Menu may be used to store saved bookmarks"
-msgstr "Le menu pourra être utilisé pour stocker des favoris"
+#: ../../Zotlabs/Module/Photos.php:1004
+msgid "Enter a new album name"
+msgstr "Entrer un nouveau nom d'album"
-#: ../../Zotlabs/Module/Menu.php:101 ../../Zotlabs/Module/Menu.php:159
-msgid "Submit and proceed"
-msgstr "Valider et continuer"
+#: ../../Zotlabs/Module/Photos.php:1005
+msgid "or select an existing one (doubleclick)"
+msgstr "ou en sélectionner un existant (double-clic)"
-#: ../../Zotlabs/Module/Menu.php:107 ../../include/text.php:2284
-msgid "Menus"
-msgstr "Menus"
+#: ../../Zotlabs/Module/Photos.php:1008
+msgid "Caption"
+msgstr "Titre/légende"
-#: ../../Zotlabs/Module/Menu.php:113 ../../Zotlabs/Module/Locs.php:120
-msgid "Drop"
-msgstr "Supprimer"
+#: ../../Zotlabs/Module/Photos.php:1010
+msgid "Add a Tag"
+msgstr "Ajouter une étiquette"
-#: ../../Zotlabs/Module/Menu.php:114 ../../Zotlabs/Module/Blocks.php:157
-#: ../../Zotlabs/Module/Layouts.php:190 ../../Zotlabs/Module/Webpages.php:255
-#: ../../include/page_widgets.php:47
-msgid "Created"
-msgstr "Créé(e)"
+#: ../../Zotlabs/Module/Photos.php:1018
+msgid "Example: @bob, @Barbara_Jensen, @jim@example.com"
+msgstr "Exemple&nbsp;: @marc, @Barbara_Jensen, @charles@exemple.com, #Ile_de_France, #marathon"
-#: ../../Zotlabs/Module/Menu.php:115 ../../Zotlabs/Module/Blocks.php:158
-#: ../../Zotlabs/Module/Layouts.php:191 ../../Zotlabs/Module/Webpages.php:256
-#: ../../include/page_widgets.php:48
-msgid "Edited"
-msgstr "Modifié(e)"
+#: ../../Zotlabs/Module/Photos.php:1021
+msgid "Flag as adult in album view"
+msgstr "Marquer comme \"adulte\" dans l'affichage de l'album"
-#: ../../Zotlabs/Module/Menu.php:117
-msgid "Bookmarks allowed"
-msgstr "Favoris autorisés"
+#: ../../Zotlabs/Module/Photos.php:1040 ../../Zotlabs/Lib/ThreadItem.php:269
+msgid "I like this (toggle)"
+msgstr "J'aime (oui/non)"
-#: ../../Zotlabs/Module/Menu.php:119
-msgid "Delete this menu"
-msgstr "Supprimer ce menu"
+#: ../../Zotlabs/Module/Photos.php:1041 ../../Zotlabs/Lib/ThreadItem.php:270
+msgid "I don't like this (toggle)"
+msgstr "Je n'aime pas (oui/non)"
-#: ../../Zotlabs/Module/Menu.php:120 ../../Zotlabs/Module/Menu.php:154
-msgid "Edit menu contents"
-msgstr "Modifier le contenu du menu"
+#: ../../Zotlabs/Module/Photos.php:1043 ../../Zotlabs/Lib/ThreadItem.php:412
+#: ../../include/conversation.php:739
+msgid "Please wait"
+msgstr "Merci de patienter"
-#: ../../Zotlabs/Module/Menu.php:121
-msgid "Edit this menu"
-msgstr "Modifier ce menu"
+#: ../../Zotlabs/Module/Photos.php:1059 ../../Zotlabs/Module/Photos.php:1177
+#: ../../Zotlabs/Lib/ThreadItem.php:729
+msgid "This is you"
+msgstr "C'est vous"
-#: ../../Zotlabs/Module/Menu.php:136
-msgid "Menu could not be deleted."
-msgstr "Impossible de supprimer le menu."
+#: ../../Zotlabs/Module/Photos.php:1061 ../../Zotlabs/Module/Photos.php:1179
+#: ../../Zotlabs/Lib/ThreadItem.php:731 ../../include/js_strings.php:6
+msgid "Comment"
+msgstr "Commenter"
-#: ../../Zotlabs/Module/Menu.php:144 ../../Zotlabs/Module/Mitem.php:28
-msgid "Menu not found."
-msgstr "Menu introuvable."
+#: ../../Zotlabs/Module/Photos.php:1077 ../../include/conversation.php:574
+msgctxt "title"
+msgid "Likes"
+msgstr "Aime"
-#: ../../Zotlabs/Module/Menu.php:149
-msgid "Edit Menu"
-msgstr "Modifier le menu"
+#: ../../Zotlabs/Module/Photos.php:1077 ../../include/conversation.php:574
+msgctxt "title"
+msgid "Dislikes"
+msgstr "N'aime pas"
-#: ../../Zotlabs/Module/Menu.php:153
-msgid "Add or remove entries to this menu"
-msgstr "Ajouter/supprimer des entrées à ce menu"
+#: ../../Zotlabs/Module/Photos.php:1078 ../../include/conversation.php:575
+msgctxt "title"
+msgid "Agree"
+msgstr "D'accord"
-#: ../../Zotlabs/Module/Menu.php:155
-msgid "Menu name"
-msgstr "Nom du menu"
+#: ../../Zotlabs/Module/Photos.php:1078 ../../include/conversation.php:575
+msgctxt "title"
+msgid "Disagree"
+msgstr "Pas d'accord"
-#: ../../Zotlabs/Module/Menu.php:155
-msgid "Must be unique, only seen by you"
-msgstr "Doit être unique, ne sera vu que par vous"
+#: ../../Zotlabs/Module/Photos.php:1078 ../../include/conversation.php:575
+msgctxt "title"
+msgid "Abstain"
+msgstr "Abstention"
-#: ../../Zotlabs/Module/Menu.php:156
-msgid "Menu title"
-msgstr "Titre du menu"
+#: ../../Zotlabs/Module/Photos.php:1079 ../../include/conversation.php:576
+msgctxt "title"
+msgid "Attending"
+msgstr "Participations"
-#: ../../Zotlabs/Module/Menu.php:156
-msgid "Menu title as seen by others"
-msgstr "Titre du menu tel que vu par les visiteurs"
+#: ../../Zotlabs/Module/Photos.php:1079 ../../include/conversation.php:576
+msgctxt "title"
+msgid "Not attending"
+msgstr "Non-participations"
-#: ../../Zotlabs/Module/Menu.php:157
-msgid "Allow bookmarks"
-msgstr "Autoriser l'usage de favoris"
+#: ../../Zotlabs/Module/Photos.php:1079 ../../include/conversation.php:576
+msgctxt "title"
+msgid "Might attend"
+msgstr "Participation possible"
-#: ../../Zotlabs/Module/Menu.php:166 ../../Zotlabs/Module/Mitem.php:120
-#: ../../Zotlabs/Module/Xchan.php:41
-msgid "Not found."
-msgstr "Introuvable."
+#: ../../Zotlabs/Module/Photos.php:1096 ../../Zotlabs/Module/Photos.php:1108
+#: ../../Zotlabs/Lib/ThreadItem.php:187 ../../Zotlabs/Lib/ThreadItem.php:199
+msgid "View all"
+msgstr "Voir tout"
-#: ../../Zotlabs/Module/Locs.php:25 ../../Zotlabs/Module/Locs.php:54
-msgid "Location not found."
-msgstr "Emplacement introuvable."
+#: ../../Zotlabs/Module/Photos.php:1100 ../../Zotlabs/Lib/ThreadItem.php:191
+#: ../../include/conversation.php:1898 ../../include/channel.php:1266
+#: ../../include/taxonomy.php:403
+msgctxt "noun"
+msgid "Like"
+msgid_plural "Likes"
+msgstr[0] "Aime"
+msgstr[1] "Aime"
-#: ../../Zotlabs/Module/Locs.php:62
-msgid "Location lookup failed."
-msgstr "Echec de la recherche de l'emplacement."
+#: ../../Zotlabs/Module/Photos.php:1105 ../../Zotlabs/Lib/ThreadItem.php:196
+#: ../../include/conversation.php:1901
+msgctxt "noun"
+msgid "Dislike"
+msgid_plural "Dislikes"
+msgstr[0] "N'aime pas"
+msgstr[1] "N'aime pas"
-#: ../../Zotlabs/Module/Locs.php:66
-msgid ""
-"Please select another location to become primary before removing the primary"
-" location."
-msgstr "Merci de sélectionner un autre emplacement comme nouvel emplacement primaire avant de supprimer l'emplacement primaire actuel."
+#: ../../Zotlabs/Module/Photos.php:1205
+msgid "Photo Tools"
+msgstr "Ouitls pour photos"
-#: ../../Zotlabs/Module/Locs.php:95
-msgid "Syncing locations"
-msgstr "Synchronisation des emplacements"
+#: ../../Zotlabs/Module/Photos.php:1214
+msgid "In This Photo:"
+msgstr "Dans cette photo&nbsp;:"
-#: ../../Zotlabs/Module/Locs.php:105
-msgid "No locations found."
-msgstr "Emplacement(s) introuvable."
+#: ../../Zotlabs/Module/Photos.php:1219
+msgid "Map"
+msgstr "Carte"
-#: ../../Zotlabs/Module/Locs.php:116
-msgid "Manage Channel Locations"
-msgstr "Gérer les emplacements des canaux"
+#: ../../Zotlabs/Module/Photos.php:1227 ../../Zotlabs/Lib/ThreadItem.php:401
+msgctxt "noun"
+msgid "Likes"
+msgstr "Aime"
-#: ../../Zotlabs/Module/Locs.php:117 ../../Zotlabs/Module/Pubsites.php:51
-#: ../../Zotlabs/Module/Profiles.php:510 ../../Zotlabs/Module/Profiles.php:733
-#: ../../Zotlabs/Module/Events.php:475
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:839
-#: ../../include/js_strings.php:25
-msgid "Location"
-msgstr "Emplacement"
+#: ../../Zotlabs/Module/Photos.php:1228 ../../Zotlabs/Lib/ThreadItem.php:402
+msgctxt "noun"
+msgid "Dislikes"
+msgstr "N'aime pas"
-#: ../../Zotlabs/Module/Locs.php:119
-msgid "Primary"
-msgstr "Primaire"
+#: ../../Zotlabs/Module/Photos.php:1233 ../../Zotlabs/Lib/ThreadItem.php:407
+#: ../../include/acl_selectors.php:220
+msgid "Close"
+msgstr "Fermer"
-#: ../../Zotlabs/Module/Locs.php:122
-msgid "Sync Now"
-msgstr "Synchronisez maintenant"
+#: ../../Zotlabs/Module/Photos.php:1305 ../../Zotlabs/Module/Photos.php:1318
+#: ../../Zotlabs/Module/Photos.php:1319 ../../include/photos.php:528
+msgid "Recent Photos"
+msgstr "Photos récentes"
-#: ../../Zotlabs/Module/Locs.php:123
-msgid "Please wait several minutes between consecutive operations."
-msgstr "Merci d'attendre plusieurs minutes entre opérations successives."
+#: ../../Zotlabs/Module/Wiki.php:30
+msgid "Profile Unavailable."
+msgstr "Profil non disponible."
-#: ../../Zotlabs/Module/Locs.php:124
-msgid ""
-"When possible, drop a location by logging into that website/hub and removing"
-" your channel."
-msgstr "Quand c'est possible, abandonnez un emplacement en vous connectant sur le site/hub et en supprimant votre canal."
+#: ../../Zotlabs/Module/Wiki.php:44 ../../addon/gitwiki/Mod_Gitwiki.php:42
+msgid "Not found"
+msgstr "Non trouvé"
-#: ../../Zotlabs/Module/Locs.php:125
-msgid "Use this form to drop the location if the hub is no longer operating."
-msgstr "Utilisez ce formulaire pour abandonner l'emplacement si le hub n'est plus actif."
+#: ../../Zotlabs/Module/Wiki.php:68 ../../addon/gitwiki/Mod_Gitwiki.php:62
+msgid "Invalid channel"
+msgstr "Canal invalide."
-#: ../../Zotlabs/Module/Pubsites.php:24 ../../include/widgets.php:1415
-msgid "Public Hubs"
-msgstr "Instances publiques"
+#: ../../Zotlabs/Module/Wiki.php:160 ../../addon/gitwiki/Mod_Gitwiki.php:146
+#: ../../include/conversation.php:1845
+msgid "Wikis"
+msgstr "Wikis"
-#: ../../Zotlabs/Module/Pubsites.php:27
+#: ../../Zotlabs/Module/Wiki.php:166 ../../addon/gitwiki/Mod_Gitwiki.php:152
+msgid "Download"
+msgstr "Téléchargement"
+
+#: ../../Zotlabs/Module/Wiki.php:168 ../../Zotlabs/Module/Chat.php:254
+#: ../../Zotlabs/Module/Profiles.php:834 ../../Zotlabs/Module/Manage.php:143
+#: ../../addon/gitwiki/Mod_Gitwiki.php:154
+msgid "Create New"
+msgstr "Nouveau"
+
+#: ../../Zotlabs/Module/Wiki.php:170 ../../addon/gitwiki/Mod_Gitwiki.php:156
+msgid "Wiki name"
+msgstr "Nom du wiki"
+
+#: ../../Zotlabs/Module/Wiki.php:171 ../../addon/gitwiki/Mod_Gitwiki.php:157
+msgid "Content type"
+msgstr "Type de contenu"
+
+#: ../../Zotlabs/Module/Wiki.php:173 ../../Zotlabs/Storage/Browser.php:234
+#: ../../addon/gitwiki/Mod_Gitwiki.php:159
+msgid "Type"
+msgstr "Type"
+
+#: ../../Zotlabs/Module/Wiki.php:180 ../../addon/gitwiki/Mod_Gitwiki.php:166
+msgid "Create a status post for this wiki"
+msgstr "Créer un statut de publication pour ce wiki"
+
+#: ../../Zotlabs/Module/Wiki.php:205 ../../addon/gitwiki/Mod_Gitwiki.php:185
+msgid "Wiki not found"
+msgstr "Wiki introuvable"
+
+#: ../../Zotlabs/Module/Wiki.php:229 ../../addon/gitwiki/Mod_Gitwiki.php:210
+msgid "Rename page"
+msgstr "Renommer la page"
+
+#: ../../Zotlabs/Module/Wiki.php:233 ../../addon/gitwiki/Mod_Gitwiki.php:214
+msgid "Error retrieving page content"
+msgstr "Erreur lors de la récupération du contenu de la page"
+
+#: ../../Zotlabs/Module/Wiki.php:239
+msgid "New page"
+msgstr ""
+
+#: ../../Zotlabs/Module/Wiki.php:263 ../../addon/gitwiki/Mod_Gitwiki.php:242
+msgid "Revision Comparison"
+msgstr "Comparaison des révisions"
+
+#: ../../Zotlabs/Module/Wiki.php:264 ../../addon/gitwiki/Mod_Gitwiki.php:243
+msgid "Revert"
+msgstr "Revenir"
+
+#: ../../Zotlabs/Module/Wiki.php:268
+msgid "Short description of your changes (optional)"
+msgstr "Description courte de vos modifications (optionnel)"
+
+#: ../../Zotlabs/Module/Wiki.php:275 ../../addon/gitwiki/Mod_Gitwiki.php:252
+msgid "Source"
+msgstr "Source"
+
+#: ../../Zotlabs/Module/Wiki.php:283 ../../addon/gitwiki/Mod_Gitwiki.php:260
+msgid "New page name"
+msgstr "Nouveau nom de la page"
+
+#: ../../Zotlabs/Module/Wiki.php:288 ../../addon/gitwiki/Mod_Gitwiki.php:265
+#: ../../include/conversation.php:1232
+msgid "Embed image from photo albums"
+msgstr "Intégrer une image d'un album photo"
+
+#: ../../Zotlabs/Module/Wiki.php:289 ../../addon/gitwiki/Mod_Gitwiki.php:266
+#: ../../include/conversation.php:1326
+msgid "Embed an image from your albums"
+msgstr "Intégrer une image de votre album photo"
+
+#: ../../Zotlabs/Module/Wiki.php:291 ../../addon/gitwiki/Mod_Gitwiki.php:268
+#: ../../include/conversation.php:1328 ../../include/conversation.php:1375
+msgid "OK"
+msgstr "OK"
+
+#: ../../Zotlabs/Module/Wiki.php:292 ../../addon/gitwiki/Mod_Gitwiki.php:269
+#: ../../include/conversation.php:1268
+msgid "Choose images to embed"
+msgstr "Choisissez des images à intégrer"
+
+#: ../../Zotlabs/Module/Wiki.php:293 ../../addon/gitwiki/Mod_Gitwiki.php:270
+#: ../../include/conversation.php:1269
+msgid "Choose an album"
+msgstr "Choisir un album"
+
+#: ../../Zotlabs/Module/Wiki.php:294 ../../addon/gitwiki/Mod_Gitwiki.php:271
+msgid "Choose a different album"
+msgstr "Choisissez un autre album"
+
+#: ../../Zotlabs/Module/Wiki.php:295 ../../addon/gitwiki/Mod_Gitwiki.php:272
+#: ../../include/conversation.php:1271
+msgid "Error getting album list"
+msgstr "Erreur venant de la liste de l'album"
+
+#: ../../Zotlabs/Module/Wiki.php:296 ../../addon/gitwiki/Mod_Gitwiki.php:273
+#: ../../include/conversation.php:1272
+msgid "Error getting photo link"
+msgstr "Erreur provenant du lien de la photo"
+
+#: ../../Zotlabs/Module/Wiki.php:297 ../../addon/gitwiki/Mod_Gitwiki.php:274
+#: ../../include/conversation.php:1273
+msgid "Error getting album"
+msgstr "Erreur venant de l'album"
+
+#: ../../Zotlabs/Module/Wiki.php:364 ../../addon/gitwiki/Mod_Gitwiki.php:337
+msgid "Error creating wiki. Invalid name."
+msgstr "Erreur lors de la création du wiki. Nom invalide."
+
+#: ../../Zotlabs/Module/Wiki.php:371
+msgid "A wiki with this name already exists."
+msgstr ""
+
+#: ../../Zotlabs/Module/Wiki.php:384 ../../addon/gitwiki/Mod_Gitwiki.php:348
+msgid "Wiki created, but error creating Home page."
+msgstr "Le wiki a été créé, mais une erreur est survenue lors de la création de sa page d'accueil."
+
+#: ../../Zotlabs/Module/Wiki.php:391 ../../addon/gitwiki/Mod_Gitwiki.php:353
+msgid "Error creating wiki"
+msgstr "Erreur lors de la création du wiki."
+
+#: ../../Zotlabs/Module/Wiki.php:403
+msgid "Wiki delete permission denied."
+msgstr "Permission de supprimer le wiki refusée."
+
+#: ../../Zotlabs/Module/Wiki.php:413
+msgid "Error deleting wiki"
+msgstr "Erreur durant la suppression du wiki"
+
+#: ../../Zotlabs/Module/Wiki.php:439 ../../addon/gitwiki/Mod_Gitwiki.php:400
+msgid "New page created"
+msgstr "Nouvelle page créée"
+
+#: ../../Zotlabs/Module/Wiki.php:558
+msgid "Cannot delete Home"
+msgstr "Impossible de supprimer la racine"
+
+#: ../../Zotlabs/Module/Wiki.php:622
+msgid "Current Revision"
+msgstr "Version actuelle"
+
+#: ../../Zotlabs/Module/Wiki.php:622
+msgid "Selected Revision"
+msgstr "Version sélectionnée"
+
+#: ../../Zotlabs/Module/Wiki.php:672
+msgid "You must be authenticated."
+msgstr "Vous devez être connecté."
+
+#: ../../Zotlabs/Module/Chanview.php:134
+msgid "toggle full screen mode"
+msgstr "Basculer en mode plein écran."
+
+#: ../../Zotlabs/Module/Pdledit.php:21
+msgid "Layout updated."
+msgstr "Mise en page mise à jour."
+
+#: ../../Zotlabs/Module/Pdledit.php:34 ../../Zotlabs/Module/Chat.php:217
+msgid "Feature disabled."
+msgstr "Fonctionnalité désactivée"
+
+#: ../../Zotlabs/Module/Pdledit.php:42 ../../Zotlabs/Module/Pdledit.php:69
+msgid "Edit System Page Description"
+msgstr "Modifier la description de la page du système"
+
+#: ../../Zotlabs/Module/Pdledit.php:64
+msgid "Layout not found."
+msgstr "Mise en page introuvable."
+
+#: ../../Zotlabs/Module/Pdledit.php:70
+msgid "Module Name:"
+msgstr "Nom du module&nbsp;:"
+
+#: ../../Zotlabs/Module/Pdledit.php:71
+msgid "Layout Help"
+msgstr "Aide à la mise en page"
+
+#: ../../Zotlabs/Module/Poke.php:168 ../../Zotlabs/Lib/Apps.php:235
+#: ../../include/conversation.php:1042
+msgid "Poke"
+msgstr "Tapoter"
+
+#: ../../Zotlabs/Module/Poke.php:169
+msgid "Poke somebody"
+msgstr "Taquiner quelqu'un"
+
+#: ../../Zotlabs/Module/Poke.php:172
+msgid "Poke/Prod"
+msgstr "Tapoter/Encourager"
+
+#: ../../Zotlabs/Module/Poke.php:173
+msgid "Poke, prod or do other things to somebody"
+msgstr "Taquiner, pousser ou faire autre chose à quelqu'un"
+
+#: ../../Zotlabs/Module/Poke.php:180
+msgid "Recipient"
+msgstr "Destinataire"
+
+#: ../../Zotlabs/Module/Poke.php:181
+msgid "Choose what you wish to do to recipient"
+msgstr "Choisir ce que vous voulez faire au destinataire"
+
+#: ../../Zotlabs/Module/Poke.php:184 ../../Zotlabs/Module/Poke.php:185
+msgid "Make this post private"
+msgstr "Rendre cette publication privée"
+
+#: ../../Zotlabs/Module/Profile_photo.php:61
+#: ../../Zotlabs/Module/Cover_photo.php:56
+msgid "Image uploaded but image cropping failed."
+msgstr "L'image a été téléversée, mais le recadrage a échoué."
+
+#: ../../Zotlabs/Module/Profile_photo.php:115
+#: ../../Zotlabs/Module/Profile_photo.php:226
+#: ../../include/photo/photo_driver.php:646
+msgid "Profile Photos"
+msgstr "Photos du profil"
+
+#: ../../Zotlabs/Module/Profile_photo.php:137
+#: ../../Zotlabs/Module/Cover_photo.php:159
+msgid "Image resize failed."
+msgstr "Le redimensionnement de l'image a échoué."
+
+#: ../../Zotlabs/Module/Profile_photo.php:196
+#: ../../addon/openclipatar/openclipatar.php:298
msgid ""
-"The listed hubs allow public registration for the $Projectname network. All "
-"hubs in the network are interlinked so membership on any of them conveys "
-"membership in the network as a whole. Some hubs may require subscription or "
-"provide tiered service plans. The hub itself <strong>may</strong> provide "
-"additional details."
-msgstr "Les sites listés permettent l'enregistrement public de comptes pour le réseau $Projectname. Tous les sites du réseau sont reliés entre eux, être membre d'un site revient à être membre de tous. Certains sites peuvent demander une souscription ou proposer différents niveaux de service. Chaque site <strong>peut</strong> fournir des détails supplémentaires."
+"Shift-reload the page or clear browser cache if the new photo does not "
+"display immediately."
+msgstr "Shift-rechargez votre page, ou videz le cache du navigateur si la photo ne s'affiche pas immédiatement."
-#: ../../Zotlabs/Module/Pubsites.php:33
-msgid "Hub URL"
-msgstr "URL du site"
+#: ../../Zotlabs/Module/Profile_photo.php:203
+#: ../../Zotlabs/Module/Cover_photo.php:173 ../../include/photos.php:149
+msgid "Unable to process image"
+msgstr "Impossible de traiter l'image"
-#: ../../Zotlabs/Module/Pubsites.php:33
-msgid "Access Type"
-msgstr "Type d'accès"
+#: ../../Zotlabs/Module/Profile_photo.php:238
+#: ../../Zotlabs/Module/Cover_photo.php:197
+msgid "Image upload failed."
+msgstr "Le téléversement de l'image a échoué."
-#: ../../Zotlabs/Module/Pubsites.php:33
-msgid "Registration Policy"
-msgstr "Politique d'inscription"
+#: ../../Zotlabs/Module/Profile_photo.php:257
+#: ../../Zotlabs/Module/Cover_photo.php:214
+msgid "Unable to process image."
+msgstr "Impossible de traîter l'image."
-#: ../../Zotlabs/Module/Pubsites.php:33
-msgid "Stats"
-msgstr "Statistiques"
+#: ../../Zotlabs/Module/Profile_photo.php:318
+#: ../../Zotlabs/Module/Profile_photo.php:365
+#: ../../Zotlabs/Module/Cover_photo.php:307
+#: ../../Zotlabs/Module/Cover_photo.php:322
+msgid "Photo not available."
+msgstr "Photo inaccessible."
-#: ../../Zotlabs/Module/Pubsites.php:33
-msgid "Software"
-msgstr "Logiciel"
+#: ../../Zotlabs/Module/Profile_photo.php:420
+#: ../../Zotlabs/Module/Cover_photo.php:358
+msgid "Upload File:"
+msgstr "Téléverser fichier&nbsp;:"
-#: ../../Zotlabs/Module/Pubsites.php:35 ../../Zotlabs/Module/Ratings.php:97
-#: ../../include/conversation.php:941 ../../include/conversation.php:1099
-msgid "Ratings"
-msgstr "Evaluations"
+#: ../../Zotlabs/Module/Profile_photo.php:421
+#: ../../Zotlabs/Module/Cover_photo.php:359
+msgid "Select a profile:"
+msgstr "Choisir un profil&nbsp;:"
-#: ../../Zotlabs/Module/Pubsites.php:48
-msgid "Rate"
-msgstr "Evaluer"
+#: ../../Zotlabs/Module/Profile_photo.php:422
+msgid "Use Photo for Profile"
+msgstr "Utiliser la photo pour le profil"
-#: ../../Zotlabs/Module/Pubsites.php:59 ../../Zotlabs/Module/Blocks.php:166
-#: ../../Zotlabs/Module/Layouts.php:197 ../../Zotlabs/Module/Events.php:694
-#: ../../Zotlabs/Module/Webpages.php:250 ../../Zotlabs/Module/Wiki.php:165
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:151
-#: ../../include/page_widgets.php:42
-msgid "View"
-msgstr "Voir"
+#: ../../Zotlabs/Module/Profile_photo.php:422
+msgid "Upload Profile Photo"
+msgstr "Téléverser une photo de profil"
+
+#: ../../Zotlabs/Module/Profile_photo.php:423
+#: ../../addon/openclipatar/openclipatar.php:182
+#: ../../addon/openclipatar/openclipatar.php:194
+msgid "Use"
+msgstr "Utiliser"
+
+#: ../../Zotlabs/Module/Profile_photo.php:429
+#: ../../Zotlabs/Module/Cover_photo.php:365
+msgid "skip this step"
+msgstr "passer cette étape"
+
+#: ../../Zotlabs/Module/Profile_photo.php:429
+#: ../../Zotlabs/Module/Cover_photo.php:365
+msgid "select a photo from your photo albums"
+msgstr "choisir une photo dans vos albums"
+
+#: ../../Zotlabs/Module/Profile_photo.php:448
+#: ../../Zotlabs/Module/Cover_photo.php:381
+msgid "Crop Image"
+msgstr "Recadrer l'image"
+
+#: ../../Zotlabs/Module/Profile_photo.php:449
+#: ../../Zotlabs/Module/Cover_photo.php:382
+msgid "Please adjust the image cropping for optimum viewing."
+msgstr "Merci d'ajuster le cadre pour une visualisation optimale."
+
+#: ../../Zotlabs/Module/Profile_photo.php:451
+#: ../../Zotlabs/Module/Cover_photo.php:384
+msgid "Done Editing"
+msgstr "J'ai terminé"
+
+#: ../../Zotlabs/Module/Chatsvc.php:131
+msgid "Away"
+msgstr "Absent"
+
+#: ../../Zotlabs/Module/Chatsvc.php:136
+msgid "Online"
+msgstr "En ligne"
+
+#: ../../Zotlabs/Module/Item.php:184
+msgid "Unable to locate original post."
+msgstr "Impossible de localiser la publication initiale."
+
+#: ../../Zotlabs/Module/Item.php:450
+msgid "Empty post discarded."
+msgstr "Publication vide annulée."
+
+#: ../../Zotlabs/Module/Item.php:824
+msgid "Duplicate post suppressed."
+msgstr "Publication en doublon supprimée."
+
+#: ../../Zotlabs/Module/Item.php:954
+msgid "System error. Post not saved."
+msgstr "Erreur système. Publication non sauvegardée."
+
+#: ../../Zotlabs/Module/Item.php:1084
+msgid "Unable to obtain post information from database."
+msgstr "Impossible d'obtenir les informations de publication depuis la base de données."
+
+#: ../../Zotlabs/Module/Item.php:1091
+#, php-format
+msgid "You have reached your limit of %1$.0f top level posts."
+msgstr "Vous avez atteint votre limite de %1$.0f contributions \"racines\"."
+
+#: ../../Zotlabs/Module/Item.php:1098
+#, php-format
+msgid "You have reached your limit of %1$.0f webpages."
+msgstr "Vous avez atteint votre limite de %1$.0f pages web."
+
+#: ../../Zotlabs/Module/Ping.php:254
+msgid "sent you a private message"
+msgstr "vous a envoyé un message privé"
+
+#: ../../Zotlabs/Module/Ping.php:302
+msgid "added your channel"
+msgstr "a ajouté votre canal"
+
+#: ../../Zotlabs/Module/Ping.php:312
+msgid "g A l F d"
+msgstr "g A l F d"
+
+#: ../../Zotlabs/Module/Ping.php:330
+msgid "[today]"
+msgstr "[aujourd'hui]"
+
+#: ../../Zotlabs/Module/Ping.php:339
+msgid "posted an event"
+msgstr "a publié un événement"
+
+#: ../../Zotlabs/Module/Page.php:40 ../../Zotlabs/Module/Block.php:31
+msgid "Invalid item."
+msgstr "Élément invalide."
+
+#: ../../Zotlabs/Module/Page.php:94 ../../Zotlabs/Module/Block.php:79
+#: ../../Zotlabs/Module/Display.php:122
+#: ../../Zotlabs/Lib/NativeWikiPage.php:489 ../../Zotlabs/Web/Router.php:146
+#: ../../include/help.php:68
+msgid "Page not found."
+msgstr "Page introuvable."
+
+#: ../../Zotlabs/Module/Page.php:131
+msgid ""
+"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod "
+"tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,"
+" quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo "
+"consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse "
+"cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat "
+"non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
+msgstr "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
-#: ../../Zotlabs/Module/Connedit.php:82
+#: ../../Zotlabs/Module/Connedit.php:79
msgid "Could not access contact record."
msgstr "Impossible d'accéder aux détails du contact."
-#: ../../Zotlabs/Module/Connedit.php:112
+#: ../../Zotlabs/Module/Connedit.php:109
msgid "Could not locate selected profile."
msgstr "Impossible de localiser le profil sélectionné."
-#: ../../Zotlabs/Module/Connedit.php:249
+#: ../../Zotlabs/Module/Connedit.php:246
msgid "Connection updated."
msgstr "Contact mis à jour."
-#: ../../Zotlabs/Module/Connedit.php:251
+#: ../../Zotlabs/Module/Connedit.php:248
msgid "Failed to update connection record."
msgstr "Impossible de mettre à jour les détails du contact."
-#: ../../Zotlabs/Module/Connedit.php:301
+#: ../../Zotlabs/Module/Connedit.php:298
msgid "is now connected to"
msgstr "est maintenant connecté avec"
-#: ../../Zotlabs/Module/Connedit.php:434
+#: ../../Zotlabs/Module/Connedit.php:431
msgid "Could not access address book record."
msgstr "Impossible d'accéder aux détails du carnet d'adresses."
-#: ../../Zotlabs/Module/Connedit.php:454
+#: ../../Zotlabs/Module/Connedit.php:479
msgid "Refresh failed - channel is currently unavailable."
msgstr "Actualisation impossible - le canal est indisponible."
-#: ../../Zotlabs/Module/Connedit.php:469 ../../Zotlabs/Module/Connedit.php:478
-#: ../../Zotlabs/Module/Connedit.php:487 ../../Zotlabs/Module/Connedit.php:496
-#: ../../Zotlabs/Module/Connedit.php:509
+#: ../../Zotlabs/Module/Connedit.php:494 ../../Zotlabs/Module/Connedit.php:503
+#: ../../Zotlabs/Module/Connedit.php:512 ../../Zotlabs/Module/Connedit.php:521
+#: ../../Zotlabs/Module/Connedit.php:534
msgid "Unable to set address book parameters."
msgstr "Impossible de régler les paramètres du carnet d'adresses."
-#: ../../Zotlabs/Module/Connedit.php:533
+#: ../../Zotlabs/Module/Connedit.php:558
msgid "Connection has been removed."
msgstr "Le contact a été supprimé."
-#: ../../Zotlabs/Module/Connedit.php:573 ../../Zotlabs/Lib/Apps.php:228
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:57
-#: ../../include/conversation.php:936 ../../include/conversation.php:1049
-#: ../../include/nav.php:103
+#: ../../Zotlabs/Module/Connedit.php:598 ../../Zotlabs/Lib/Apps.php:228
+#: ../../addon/openclipatar/openclipatar.php:57
+#: ../../include/conversation.php:982 ../../include/nav.php:102
msgid "View Profile"
msgstr "Voir mon profil"
-#: ../../Zotlabs/Module/Connedit.php:576
+#: ../../Zotlabs/Module/Connedit.php:601
#, php-format
msgid "View %s's profile"
msgstr "Voir le profil de %s"
-#: ../../Zotlabs/Module/Connedit.php:580
+#: ../../Zotlabs/Module/Connedit.php:605
msgid "Refresh Permissions"
msgstr "Actualiser les autorisations"
-#: ../../Zotlabs/Module/Connedit.php:583
+#: ../../Zotlabs/Module/Connedit.php:608
msgid "Fetch updated permissions"
msgstr "Récupérer les autorisations les plus récentes"
-#: ../../Zotlabs/Module/Connedit.php:587
+#: ../../Zotlabs/Module/Connedit.php:612
+msgid "Refresh Photo"
+msgstr ""
+
+#: ../../Zotlabs/Module/Connedit.php:615
+msgid "Fetch updated photo"
+msgstr ""
+
+#: ../../Zotlabs/Module/Connedit.php:619
msgid "Recent Activity"
msgstr "Activité récente"
-#: ../../Zotlabs/Module/Connedit.php:590
+#: ../../Zotlabs/Module/Connedit.php:622
msgid "View recent posts and comments"
msgstr "Voir les publications et commentaires récents"
-#: ../../Zotlabs/Module/Connedit.php:597
+#: ../../Zotlabs/Module/Connedit.php:629
msgid "Block (or Unblock) all communications with this connection"
msgstr "Bloquer ou débloquer toute communication avec ce contact"
-#: ../../Zotlabs/Module/Connedit.php:598
+#: ../../Zotlabs/Module/Connedit.php:630
msgid "This connection is blocked!"
msgstr "Ce contact est bloqué&nbsp;!"
-#: ../../Zotlabs/Module/Connedit.php:602
+#: ../../Zotlabs/Module/Connedit.php:634
msgid "Unignore"
msgstr "Ne plus ignorer"
-#: ../../Zotlabs/Module/Connedit.php:605
+#: ../../Zotlabs/Module/Connedit.php:637
msgid "Ignore (or Unignore) all inbound communications from this connection"
msgstr "Ignorer ou ne plus ignorer toute communication venant de ce contact"
-#: ../../Zotlabs/Module/Connedit.php:606
+#: ../../Zotlabs/Module/Connedit.php:638
msgid "This connection is ignored!"
msgstr "Ce contact est ignoré&nbsp;!"
-#: ../../Zotlabs/Module/Connedit.php:610
+#: ../../Zotlabs/Module/Connedit.php:642
msgid "Unarchive"
msgstr "Désarchiver"
-#: ../../Zotlabs/Module/Connedit.php:610
+#: ../../Zotlabs/Module/Connedit.php:642
msgid "Archive"
msgstr "Archiver"
-#: ../../Zotlabs/Module/Connedit.php:613
+#: ../../Zotlabs/Module/Connedit.php:645
msgid ""
"Archive (or Unarchive) this connection - mark channel dead but keep content"
msgstr "Archiver ou désarchiver ce contact - le marquer comme inactif mais conserver le contenu"
-#: ../../Zotlabs/Module/Connedit.php:614
+#: ../../Zotlabs/Module/Connedit.php:646
msgid "This connection is archived!"
msgstr "Ce contact est archivé&nbsp;!"
-#: ../../Zotlabs/Module/Connedit.php:618
+#: ../../Zotlabs/Module/Connedit.php:650
msgid "Unhide"
msgstr "Ne plus cacher"
-#: ../../Zotlabs/Module/Connedit.php:618
+#: ../../Zotlabs/Module/Connedit.php:650
msgid "Hide"
msgstr "Cacher"
-#: ../../Zotlabs/Module/Connedit.php:621
+#: ../../Zotlabs/Module/Connedit.php:653
msgid "Hide or Unhide this connection from your other connections"
msgstr "Cacher ou ne plus cacher ce contact vis-à-vis de vos autres contacts"
-#: ../../Zotlabs/Module/Connedit.php:622
+#: ../../Zotlabs/Module/Connedit.php:654
msgid "This connection is hidden!"
msgstr "Ce contact est caché&nbsp;!"
-#: ../../Zotlabs/Module/Connedit.php:629
+#: ../../Zotlabs/Module/Connedit.php:661
msgid "Delete this connection"
msgstr "Supprimer ce contact"
-#: ../../Zotlabs/Module/Connedit.php:640
+#: ../../Zotlabs/Module/Connedit.php:669
+msgid "Fetch Vcard"
+msgstr ""
+
+#: ../../Zotlabs/Module/Connedit.php:672
+msgid "Fetch electronic calling card for this connection"
+msgstr ""
+
+#: ../../Zotlabs/Module/Connedit.php:683
msgid "Open Individual Permissions section by default"
msgstr "Ouvrir par défaut la section des autorisations individuelles"
-#: ../../Zotlabs/Module/Connedit.php:663
+#: ../../Zotlabs/Module/Connedit.php:706
msgid "Affinity"
msgstr "Affinité"
-#: ../../Zotlabs/Module/Connedit.php:666
+#: ../../Zotlabs/Module/Connedit.php:709
msgid "Open Set Affinity section by default"
msgstr "Ouvrir par défaut la section Définir le degré d'affinité"
-#: ../../Zotlabs/Module/Connedit.php:670 ../../include/widgets.php:540
+#: ../../Zotlabs/Module/Connedit.php:713 ../../Zotlabs/Widget/Affinity.php:26
msgid "Me"
msgstr "Moi"
-#: ../../Zotlabs/Module/Connedit.php:671 ../../include/widgets.php:541
+#: ../../Zotlabs/Module/Connedit.php:714 ../../Zotlabs/Widget/Affinity.php:27
msgid "Family"
msgstr "Famille"
-#: ../../Zotlabs/Module/Connedit.php:672
-#: ../../Zotlabs/Module/Settings/Channel.php:62
-#: ../../Zotlabs/Module/Settings/Channel.php:66
-#: ../../Zotlabs/Module/Settings/Channel.php:67
-#: ../../Zotlabs/Module/Settings/Channel.php:70
-#: ../../Zotlabs/Module/Settings/Channel.php:81
-#: ../../include/selectors.php:123 ../../include/widgets.php:542
-#: ../../include/channel.php:408 ../../include/channel.php:409
-#: ../../include/channel.php:416
-msgid "Friends"
-msgstr "Amis"
-
-#: ../../Zotlabs/Module/Connedit.php:673 ../../include/widgets.php:543
+#: ../../Zotlabs/Module/Connedit.php:716 ../../Zotlabs/Widget/Affinity.php:29
msgid "Acquaintances"
msgstr "Connaissances"
-#: ../../Zotlabs/Module/Connedit.php:700
+#: ../../Zotlabs/Module/Connedit.php:743
msgid "Filter"
msgstr "Filtrer"
-#: ../../Zotlabs/Module/Connedit.php:703
+#: ../../Zotlabs/Module/Connedit.php:746
msgid "Open Custom Filter section by default"
msgstr "Ouvrir par défaut la section Filtre personnalisé"
-#: ../../Zotlabs/Module/Connedit.php:740
+#: ../../Zotlabs/Module/Connedit.php:783
msgid "Approve this connection"
msgstr "Autoriser ce contact"
-#: ../../Zotlabs/Module/Connedit.php:740
+#: ../../Zotlabs/Module/Connedit.php:783
msgid "Accept connection to allow communication"
msgstr "Accepter le contact pour permettre la communication"
-#: ../../Zotlabs/Module/Connedit.php:745
+#: ../../Zotlabs/Module/Connedit.php:788
msgid "Set Affinity"
msgstr "Définir le degré d'affinité"
-#: ../../Zotlabs/Module/Connedit.php:748
+#: ../../Zotlabs/Module/Connedit.php:791
msgid "Set Profile"
msgstr "Définir le profil"
-#: ../../Zotlabs/Module/Connedit.php:751
+#: ../../Zotlabs/Module/Connedit.php:794
msgid "Set Affinity & Profile"
msgstr "Définir le degré d'affinité et le profil"
-#: ../../Zotlabs/Module/Connedit.php:809
+#: ../../Zotlabs/Module/Connedit.php:852
msgid "none"
msgstr "Aucun"
-#: ../../Zotlabs/Module/Connedit.php:812 ../../include/widgets.php:675
+#: ../../Zotlabs/Module/Connedit.php:855
+#: ../../Zotlabs/Widget/Settings_menu.php:107
msgid "Connection Default Permissions"
msgstr "Autorisations par défaut des contacts"
-#: ../../Zotlabs/Module/Connedit.php:812 ../../include/items.php:3932
+#: ../../Zotlabs/Module/Connedit.php:855 ../../include/items.php:3942
#, php-format
msgid "Connection: %s"
msgstr "Contact&nbsp;: %s"
-#: ../../Zotlabs/Module/Connedit.php:813
+#: ../../Zotlabs/Module/Connedit.php:856
msgid "Apply these permissions automatically"
msgstr "Appliquer ces permissions automatiquement"
-#: ../../Zotlabs/Module/Connedit.php:813
+#: ../../Zotlabs/Module/Connedit.php:856
msgid "Connection requests will be approved without your interaction"
msgstr "Les demandes de contact seront approuvées automatiquement"
-#: ../../Zotlabs/Module/Connedit.php:814
+#: ../../Zotlabs/Module/Connedit.php:857
msgid "Permission role"
msgstr "Rôle d'accès"
-#: ../../Zotlabs/Module/Connedit.php:815
+#: ../../Zotlabs/Module/Connedit.php:858
msgid "Add permission role"
msgstr "Ajouter un rôle d'accès"
-#: ../../Zotlabs/Module/Connedit.php:821
+#: ../../Zotlabs/Module/Connedit.php:864
msgid "This connection's primary address is"
msgstr "L'adresse principale de ce contact est"
-#: ../../Zotlabs/Module/Connedit.php:822
+#: ../../Zotlabs/Module/Connedit.php:865
msgid "Available locations:"
msgstr "Emplacements disponibles&nbsp;:"
-#: ../../Zotlabs/Module/Connedit.php:826
+#: ../../Zotlabs/Module/Connedit.php:869
msgid ""
"The permissions indicated on this page will be applied to all new "
"connections."
msgstr "Les permissions indiquées sur cette page seront appliquées à tous vos nouveaux contacts."
-#: ../../Zotlabs/Module/Connedit.php:827
+#: ../../Zotlabs/Module/Connedit.php:870
msgid "Connection Tools"
-msgstr "Outils de connexion"
+msgstr "Actions du contact"
-#: ../../Zotlabs/Module/Connedit.php:829
+#: ../../Zotlabs/Module/Connedit.php:872
msgid "Slide to adjust your degree of friendship"
msgstr "Faites glisser pour ajuster votre proximité avec le contact"
-#: ../../Zotlabs/Module/Connedit.php:830 ../../Zotlabs/Module/Rate.php:155
+#: ../../Zotlabs/Module/Connedit.php:873 ../../Zotlabs/Module/Rate.php:155
#: ../../include/js_strings.php:20
msgid "Rating"
msgstr "Evaluation"
-#: ../../Zotlabs/Module/Connedit.php:831
+#: ../../Zotlabs/Module/Connedit.php:874
msgid "Slide to adjust your rating"
msgstr "Faîtes glisser pour ajuster votre note"
-#: ../../Zotlabs/Module/Connedit.php:832 ../../Zotlabs/Module/Connedit.php:837
+#: ../../Zotlabs/Module/Connedit.php:875 ../../Zotlabs/Module/Connedit.php:880
msgid "Optionally explain your rating"
msgstr "Explication facultative de votre évaluation"
-#: ../../Zotlabs/Module/Connedit.php:834
+#: ../../Zotlabs/Module/Connedit.php:877
msgid "Custom Filter"
msgstr "Filtre personnalisé"
-#: ../../Zotlabs/Module/Connedit.php:835
+#: ../../Zotlabs/Module/Connedit.php:878
msgid "Only import posts with this text"
msgstr "N'importer que les publications comprenant ce texte"
-#: ../../Zotlabs/Module/Connedit.php:835 ../../Zotlabs/Module/Connedit.php:836
+#: ../../Zotlabs/Module/Connedit.php:878 ../../Zotlabs/Module/Connedit.php:879
msgid ""
"words one per line or #tags or /patterns/ or lang=xx, leave blank to import "
"all posts"
msgstr "un mot par ligne ou #étiquettes ou /motif/ ou lang=xx, laisser vide pour importer toutes les publications"
-#: ../../Zotlabs/Module/Connedit.php:836
+#: ../../Zotlabs/Module/Connedit.php:879
msgid "Do not import posts with this text"
msgstr "Ne pas importer les publications comprenant ce texte"
-#: ../../Zotlabs/Module/Connedit.php:838
+#: ../../Zotlabs/Module/Connedit.php:881
msgid "This information is public!"
msgstr "Cette information est publique&nbsp;!"
-#: ../../Zotlabs/Module/Connedit.php:843
+#: ../../Zotlabs/Module/Connedit.php:886
msgid "Connection Pending Approval"
msgstr "Contact en attente d'approbation"
-#: ../../Zotlabs/Module/Connedit.php:846
-#: ../../Zotlabs/Module/Settings/Tokens.php:163
-#: ../../Zotlabs/Module/Settings/Permcats.php:107
-msgid "inherited"
-msgstr "héritée"
-
-#: ../../Zotlabs/Module/Connedit.php:848
+#: ../../Zotlabs/Module/Connedit.php:891
#, php-format
msgid ""
"Please choose the profile you would like to display to %s when viewing your "
"profile securely."
msgstr "Merci de choisir le profil que vous souhaitez montrer quand %s visite votre profil de manière authentifiée."
-#: ../../Zotlabs/Module/Connedit.php:850
-#: ../../Zotlabs/Module/Settings/Tokens.php:160
-msgid "Their Settings"
-msgstr "Leurs paramètres"
-
-#: ../../Zotlabs/Module/Connedit.php:851
-#: ../../Zotlabs/Module/Settings/Tokens.php:161
-#: ../../Zotlabs/Module/Settings/Permcats.php:105
-msgid "My Settings"
-msgstr "Mes paramètres"
-
-#: ../../Zotlabs/Module/Connedit.php:853
-#: ../../Zotlabs/Module/Settings/Tokens.php:166
-#: ../../Zotlabs/Module/Settings/Permcats.php:110
-msgid "Individual Permissions"
-msgstr "Permissions individuelles"
-
-#: ../../Zotlabs/Module/Connedit.php:854
-#: ../../Zotlabs/Module/Settings/Tokens.php:167
-#: ../../Zotlabs/Module/Settings/Permcats.php:111
-msgid ""
-"Some permissions may be inherited from your channel's <a "
-"href=\"settings\"><strong>privacy settings</strong></a>, which have higher "
-"priority than individual settings. You can <strong>not</strong> change those"
-" settings here."
-msgstr "Certaines permissions peuvent être héritées de vos <a href=\"settings\">paramètres de confidentialité</a> de canal, lesquels sont prioritaires sur les réglages individuels. Vous pouvez modifier ces permissions ici mais cela n'aura aucun effet à moins de changer les paramètres hérités."
-
-#: ../../Zotlabs/Module/Connedit.php:855
+#: ../../Zotlabs/Module/Connedit.php:898
msgid ""
"Some permissions may be inherited from your channel's <a "
"href=\"settings\"><strong>privacy settings</strong></a>, which have higher "
@@ -3519,752 +5216,369 @@ msgid ""
"they wont have any impact unless the inherited setting changes."
msgstr "Certaines permissions peuvent être héritées de vos <a href=\"settings\">paramètres de confidentialité</a> de canal, lesquels sont prioritaires sur les réglages individuels. Vous pouvez modifier ces permissions ici mais cela n'aura aucun effet à moins de changer les paramètres hérités."
-#: ../../Zotlabs/Module/Connedit.php:856
+#: ../../Zotlabs/Module/Connedit.php:899
msgid "Last update:"
msgstr "Dernière mise à jour&nbsp;:"
-#: ../../Zotlabs/Module/Connedit.php:865
+#: ../../Zotlabs/Module/Connedit.php:908
msgid "Details"
msgstr "Détails"
-#: ../../Zotlabs/Module/Connedit.php:868
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1137
+#: ../../Zotlabs/Module/Connedit.php:911 ../../addon/cdav/Mod_Cdav.php:1137
msgid "Organisation"
msgstr "Organisation"
-#: ../../Zotlabs/Module/Connedit.php:869
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1138
+#: ../../Zotlabs/Module/Connedit.php:912 ../../addon/cdav/Mod_Cdav.php:1138
#: ../../include/page_widgets.php:46
msgid "Title"
msgstr "Titre"
-#: ../../Zotlabs/Module/Connedit.php:870
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1139
+#: ../../Zotlabs/Module/Connedit.php:913 ../../Zotlabs/Module/Profiles.php:789
+#: ../../addon/cdav/Mod_Cdav.php:1139
msgid "Phone"
msgstr "Téléphone"
-#: ../../Zotlabs/Module/Connedit.php:872
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1141
+#: ../../Zotlabs/Module/Connedit.php:915 ../../Zotlabs/Module/Profiles.php:791
+#: ../../addon/cdav/Mod_Cdav.php:1141
msgid "Instant messenger"
msgstr "Instant messenger"
-#: ../../Zotlabs/Module/Connedit.php:873
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1142
+#: ../../Zotlabs/Module/Connedit.php:916 ../../Zotlabs/Module/Profiles.php:792
+#: ../../addon/cdav/Mod_Cdav.php:1142
msgid "Website"
msgstr "Site web"
-#: ../../Zotlabs/Module/Connedit.php:875
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1144
+#: ../../Zotlabs/Module/Connedit.php:918 ../../Zotlabs/Module/Profiles.php:794
+#: ../../addon/cdav/Mod_Cdav.php:1144
msgid "Note"
msgstr "Note"
-#: ../../Zotlabs/Module/Connedit.php:876
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1145
-#: ../../extend/addon/addon/cdav/cdav.php:270
-#: ../../include/connections.php:894
+#: ../../Zotlabs/Module/Connedit.php:919 ../../Zotlabs/Module/Profiles.php:795
+#: ../../addon/cdav/Mod_Cdav.php:1145 ../../addon/cdav/cdav.php:270
+#: ../../include/connections.php:668
msgid "Mobile"
msgstr "Mobile"
-#: ../../Zotlabs/Module/Connedit.php:877
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1146
-#: ../../extend/addon/addon/cdav/cdav.php:271
-#: ../../include/connections.php:895
+#: ../../Zotlabs/Module/Connedit.php:920 ../../Zotlabs/Module/Profiles.php:796
+#: ../../addon/cdav/Mod_Cdav.php:1146 ../../addon/cdav/cdav.php:271
+#: ../../include/connections.php:669
msgid "Home"
msgstr "Mon canal"
-#: ../../Zotlabs/Module/Connedit.php:878
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1147
-#: ../../extend/addon/addon/cdav/cdav.php:274
-#: ../../include/connections.php:898
+#: ../../Zotlabs/Module/Connedit.php:921 ../../Zotlabs/Module/Profiles.php:797
+#: ../../addon/cdav/Mod_Cdav.php:1147 ../../addon/cdav/cdav.php:274
+#: ../../include/connections.php:672
msgid "Work"
msgstr "Travail"
-#: ../../Zotlabs/Module/Connedit.php:880
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:368
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1149
+#: ../../Zotlabs/Module/Connedit.php:923 ../../Zotlabs/Module/Profiles.php:799
+#: ../../addon/cdav/Mod_Cdav.php:1149
+#: ../../addon/jappixmini/jappixmini.php:368
msgid "Add Contact"
msgstr "Ajouter un contact"
-#: ../../Zotlabs/Module/Connedit.php:881
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1150
+#: ../../Zotlabs/Module/Connedit.php:924 ../../Zotlabs/Module/Profiles.php:800
+#: ../../addon/cdav/Mod_Cdav.php:1150
msgid "Add Field"
msgstr "Ajouter un champ"
-#: ../../Zotlabs/Module/Connedit.php:886
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1155
+#: ../../Zotlabs/Module/Connedit.php:929 ../../addon/cdav/Mod_Cdav.php:1155
msgid "P.O. Box"
msgstr "P.O. Box"
-#: ../../Zotlabs/Module/Connedit.php:887
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1156
+#: ../../Zotlabs/Module/Connedit.php:930 ../../addon/cdav/Mod_Cdav.php:1156
msgid "Additional"
msgstr "Information complémentaires"
-#: ../../Zotlabs/Module/Connedit.php:888
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1157
+#: ../../Zotlabs/Module/Connedit.php:931 ../../addon/cdav/Mod_Cdav.php:1157
msgid "Street"
msgstr "Rue"
-#: ../../Zotlabs/Module/Connedit.php:889
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1158
+#: ../../Zotlabs/Module/Connedit.php:932 ../../addon/cdav/Mod_Cdav.php:1158
msgid "Locality"
msgstr "Localité"
-#: ../../Zotlabs/Module/Connedit.php:890
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1159
+#: ../../Zotlabs/Module/Connedit.php:933 ../../addon/cdav/Mod_Cdav.php:1159
msgid "Region"
msgstr "Région"
-#: ../../Zotlabs/Module/Connedit.php:891
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1160
+#: ../../Zotlabs/Module/Connedit.php:934 ../../addon/cdav/Mod_Cdav.php:1160
msgid "ZIP Code"
msgstr "ZIP code"
-#: ../../Zotlabs/Module/Connedit.php:892 ../../Zotlabs/Module/Profiles.php:756
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1161
+#: ../../Zotlabs/Module/Connedit.php:935 ../../Zotlabs/Module/Profiles.php:760
+#: ../../addon/cdav/Mod_Cdav.php:1161
msgid "Country"
msgstr "Pays"
-#: ../../Zotlabs/Module/Home.php:74 ../../Zotlabs/Module/Home.php:82
-#: ../../extend/addon/addon/opensearch/opensearch.php:42
-msgid "$Projectname"
-msgstr "$Projectname"
+#: ../../Zotlabs/Module/Chat.php:179
+msgid "Room not found"
+msgstr "Salon introuvable"
-#: ../../Zotlabs/Module/Home.php:92
-#, php-format
-msgid "Welcome to %s"
-msgstr "Bienvenue sur %s"
+#: ../../Zotlabs/Module/Chat.php:195
+msgid "Leave Room"
+msgstr "Quitter le salon"
-#: ../../Zotlabs/Module/Filestorage.php:87
-msgid "Permission Denied."
-msgstr "Permission refusée."
+#: ../../Zotlabs/Module/Chat.php:196
+msgid "Delete Room"
+msgstr "Supprimer le salon"
-#: ../../Zotlabs/Module/Filestorage.php:103
-msgid "File not found."
-msgstr "Fichier introuvable."
+#: ../../Zotlabs/Module/Chat.php:197
+msgid "I am away right now"
+msgstr "Je suis absent en ce moment"
-#: ../../Zotlabs/Module/Filestorage.php:146
-msgid "Edit file permissions"
-msgstr "Modifier les autorisations d'accès au fichier"
+#: ../../Zotlabs/Module/Chat.php:198
+msgid "I am online"
+msgstr "Je suis en ligne"
-#: ../../Zotlabs/Module/Filestorage.php:159
-msgid "Set/edit permissions"
-msgstr "Définir/modifier les autorisations"
+#: ../../Zotlabs/Module/Chat.php:200
+msgid "Bookmark this room"
+msgstr "Marquer ce salon comme favori"
-#: ../../Zotlabs/Module/Filestorage.php:160
-msgid "Include all files and sub folders"
-msgstr "Inclure tous fichiers et sous-répertoires"
+#: ../../Zotlabs/Module/Chat.php:203 ../../Zotlabs/Module/Mail.php:240
+#: ../../Zotlabs/Module/Mail.php:361 ../../include/conversation.php:1263
+msgid "Please enter a link URL:"
+msgstr "Merci d'entrer l'URL d'un lien&nbsp;:"
-#: ../../Zotlabs/Module/Filestorage.php:161
-msgid "Return to file list"
-msgstr "Retourner à la liste des fichiers"
+#: ../../Zotlabs/Module/Chat.php:204 ../../Zotlabs/Module/Mail.php:293
+#: ../../Zotlabs/Module/Mail.php:430 ../../Zotlabs/Lib/ThreadItem.php:744
+#: ../../include/conversation.php:1373
+msgid "Encrypt text"
+msgstr "Chiffrer le texte"
-#: ../../Zotlabs/Module/Filestorage.php:163
-msgid "Copy/paste this code to attach file to a post"
-msgstr "Copiez/collez ce code pour joindre le fichier à une publication"
+#: ../../Zotlabs/Module/Chat.php:230
+msgid "New Chatroom"
+msgstr "Nouveau salon de discussion"
-#: ../../Zotlabs/Module/Filestorage.php:164
-msgid "Copy/paste this URL to link file from a web page"
-msgstr "Copiez/collez cette URL pour pointer vers ce fichier depuis une page web"
+#: ../../Zotlabs/Module/Chat.php:231
+msgid "Chatroom name"
+msgstr "Nom du salon de conversation"
-#: ../../Zotlabs/Module/Filestorage.php:166
-msgid "Share this file"
-msgstr "Partager ce fichier"
+#: ../../Zotlabs/Module/Chat.php:232
+msgid "Expiration of chats (minutes)"
+msgstr "Expiration des discussions (en minutes)"
-#: ../../Zotlabs/Module/Filestorage.php:167
-msgid "Show URL to this file"
-msgstr "Montrer l'URL de ce fichier"
+#: ../../Zotlabs/Module/Chat.php:248
+#, php-format
+msgid "%1$s's Chatrooms"
+msgstr "Salons de %1$s"
-#: ../../Zotlabs/Module/Filestorage.php:168
-msgid "Notify your contacts about this file"
-msgstr "Notifier vos contacts à propos de ce fichier"
+#: ../../Zotlabs/Module/Chat.php:253
+msgid "No chatrooms available"
+msgstr "Aucun salon de conversation disponible"
+
+#: ../../Zotlabs/Module/Chat.php:257
+msgid "Expiration"
+msgstr "Expiration"
+
+#: ../../Zotlabs/Module/Chat.php:258
+msgid "min"
+msgstr "min"
#: ../../Zotlabs/Module/Fbrowser.php:29 ../../Zotlabs/Lib/Apps.php:229
-#: ../../include/conversation.php:1836
+#: ../../include/conversation.php:1774
msgid "Photos"
msgstr "Photos"
-#: ../../Zotlabs/Module/Apps.php:45 ../../include/widgets.php:102
-#: ../../include/nav.php:178
-msgid "Apps"
-msgstr "Applications"
-
-#: ../../Zotlabs/Module/Cal.php:69
-msgid "Permissions denied."
-msgstr "Permissions refusées."
-
-#: ../../Zotlabs/Module/Cal.php:263 ../../Zotlabs/Module/Events.php:605
-msgid "l, F j"
-msgstr "l, F j"
-
-#: ../../Zotlabs/Module/Cal.php:312 ../../Zotlabs/Module/Events.php:660
-#: ../../include/text.php:1761
-msgid "Link to Source"
-msgstr "Lien vers la Source"
-
-#: ../../Zotlabs/Module/Cal.php:335 ../../Zotlabs/Module/Events.php:688
-msgid "Edit Event"
-msgstr "Modifier l'événement"
-
-#: ../../Zotlabs/Module/Cal.php:335 ../../Zotlabs/Module/Events.php:688
-msgid "Create Event"
-msgstr "Créer un événement"
-
-#: ../../Zotlabs/Module/Cal.php:338 ../../Zotlabs/Module/Events.php:691
-#: ../../include/channel.php:1370
-msgid "Export"
-msgstr "Export"
-
-#: ../../Zotlabs/Module/Cal.php:341 ../../include/text.php:2307
-msgid "Import"
-msgstr "Import"
-
-#: ../../Zotlabs/Module/Cal.php:345 ../../Zotlabs/Module/Events.php:700
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:848
-msgid "Today"
-msgstr "Aujourd'hui"
-
-#: ../../Zotlabs/Module/Group.php:24
-msgid "Privacy group created."
-msgstr "Groupe d'accès créé."
-
-#: ../../Zotlabs/Module/Group.php:30
-msgid "Could not create privacy group."
-msgstr "Impossible de créer le groupe d'accès."
-
-#: ../../Zotlabs/Module/Group.php:42 ../../Zotlabs/Module/Group.php:141
-#: ../../include/items.php:3899
-msgid "Privacy group not found."
-msgstr "Groupe d'accès introuvable."
-
-#: ../../Zotlabs/Module/Group.php:58
-msgid "Privacy group updated."
-msgstr "Groupe d'accès mis à jour."
-
-#: ../../Zotlabs/Module/Group.php:90
-msgid "Create a group of channels."
-msgstr "Créer un groupe de canaux."
-
-#: ../../Zotlabs/Module/Group.php:91 ../../Zotlabs/Module/Group.php:184
-msgid "Privacy group name: "
-msgstr "Nom du groupe d'accès&nbsp;:"
-
-#: ../../Zotlabs/Module/Group.php:93 ../../Zotlabs/Module/Group.php:187
-msgid "Members are visible to other channels"
-msgstr "Les membres sont visibles par les autres canaux"
-
-#: ../../Zotlabs/Module/Group.php:111
-msgid "Privacy group removed."
-msgstr "Groupe d'accès supprimé."
-
-#: ../../Zotlabs/Module/Group.php:113
-msgid "Unable to remove privacy group."
-msgstr "Impossible de supprimer le groupe d'accès."
-
-#: ../../Zotlabs/Module/Group.php:183
-msgid "Privacy group editor"
-msgstr "Editeur de groupe d'accès."
-
-#: ../../Zotlabs/Module/Group.php:199
-msgid "All Connected Channels"
-msgstr "Tous les canaux connectés"
-
-#: ../../Zotlabs/Module/Group.php:231
-msgid "Click on a channel to add or remove."
-msgstr "Cliquer sur un canal pour l'ajouter ou le supprimer"
-
-#: ../../Zotlabs/Module/Dreport.php:45
-msgid "Invalid message"
-msgstr "Message non valide"
-
-#: ../../Zotlabs/Module/Dreport.php:78
-msgid "no results"
-msgstr "aucun résultat"
-
-#: ../../Zotlabs/Module/Dreport.php:93
-msgid "channel sync processed"
-msgstr "Synchro de canal effectuée"
-
-#: ../../Zotlabs/Module/Dreport.php:97
-msgid "queued"
-msgstr "mis dans la file d'attente"
-
-#: ../../Zotlabs/Module/Dreport.php:101
-msgid "posted"
-msgstr "publié"
-
-#: ../../Zotlabs/Module/Dreport.php:105
-msgid "accepted for delivery"
-msgstr "accepté pour la distribution"
-
-#: ../../Zotlabs/Module/Dreport.php:109
-msgid "updated"
-msgstr "mis à jour"
-
-#: ../../Zotlabs/Module/Dreport.php:112
-msgid "update ignored"
-msgstr "mise à jour ignorée"
-
-#: ../../Zotlabs/Module/Dreport.php:115
-msgid "permission denied"
-msgstr "permission refusée"
-
-#: ../../Zotlabs/Module/Dreport.php:119
-msgid "recipient not found"
-msgstr "destinataire introuvable"
-
-#: ../../Zotlabs/Module/Dreport.php:122
-msgid "mail recalled"
-msgstr "courriel rappelé"
-
-#: ../../Zotlabs/Module/Dreport.php:125
-msgid "duplicate mail received"
-msgstr "courriel reçu en double"
+#: ../../Zotlabs/Module/Fbrowser.php:85 ../../Zotlabs/Lib/Apps.php:224
+#: ../../Zotlabs/Storage/Browser.php:224 ../../include/conversation.php:1782
+msgid "Files"
+msgstr "Fichiers"
-#: ../../Zotlabs/Module/Dreport.php:128
-msgid "mail delivered"
-msgstr "courriel distribué"
+#: ../../Zotlabs/Module/Menu.php:49
+msgid "Unable to update menu."
+msgstr "Impossible de mettre le menu à jour."
-#: ../../Zotlabs/Module/Dreport.php:148
-#, php-format
-msgid "Delivery report for %1$s"
-msgstr "Rapport de distribution pour %1$s"
+#: ../../Zotlabs/Module/Menu.php:60
+msgid "Unable to create menu."
+msgstr "Impossible de créer le menu."
-#: ../../Zotlabs/Module/Dreport.php:151
-msgid "Options"
-msgstr "Options"
+#: ../../Zotlabs/Module/Menu.php:98 ../../Zotlabs/Module/Menu.php:110
+msgid "Menu Name"
+msgstr "Nom du menu"
-#: ../../Zotlabs/Module/Dreport.php:152
-msgid "Redeliver"
-msgstr "Transférer à nouveau"
+#: ../../Zotlabs/Module/Menu.php:98
+msgid "Unique name (not visible on webpage) - required"
+msgstr "Nom unique (non visible sur la page web) - requis"
-#: ../../Zotlabs/Module/Impel.php:41 ../../include/bbcode.php:203
-msgid "webpage"
-msgstr "pages web"
+#: ../../Zotlabs/Module/Menu.php:99 ../../Zotlabs/Module/Menu.php:111
+msgid "Menu Title"
+msgstr "Titre du menu"
-#: ../../Zotlabs/Module/Impel.php:46 ../../include/bbcode.php:209
-msgid "block"
-msgstr "bloquer"
+#: ../../Zotlabs/Module/Menu.php:99
+msgid "Visible on webpage - leave empty for no title"
+msgstr "Visible pour la page web - laisser vide pour qu'il n'y ait pas de titre"
-#: ../../Zotlabs/Module/Impel.php:51 ../../include/bbcode.php:206
-msgid "layout"
-msgstr "mise en page"
+#: ../../Zotlabs/Module/Menu.php:100
+msgid "Allow Bookmarks"
+msgstr "Autoriser l'usage de favoris"
-#: ../../Zotlabs/Module/Impel.php:58 ../../include/bbcode.php:212
-msgid "menu"
-msgstr "menu"
+#: ../../Zotlabs/Module/Menu.php:100 ../../Zotlabs/Module/Menu.php:157
+msgid "Menu may be used to store saved bookmarks"
+msgstr "Le menu pourra être utilisé pour stocker des favoris"
-#: ../../Zotlabs/Module/Impel.php:191
-#, php-format
-msgid "%s element installed"
-msgstr "Elément %s installé"
+#: ../../Zotlabs/Module/Menu.php:101 ../../Zotlabs/Module/Menu.php:159
+msgid "Submit and proceed"
+msgstr "Valider et continuer"
-#: ../../Zotlabs/Module/Impel.php:194
-#, php-format
-msgid "%s element installation failed"
-msgstr "L'installation de l'élément %s a échoué"
+#: ../../Zotlabs/Module/Menu.php:107 ../../include/text.php:2276
+msgid "Menus"
+msgstr "Menus"
-#: ../../Zotlabs/Module/Import_items.php:42 ../../Zotlabs/Module/Import.php:57
-msgid "Nothing to import."
-msgstr "Rien à importer."
+#: ../../Zotlabs/Module/Menu.php:117
+msgid "Bookmarks allowed"
+msgstr "Favoris autorisés"
-#: ../../Zotlabs/Module/Import_items.php:66 ../../Zotlabs/Module/Import.php:69
-#: ../../Zotlabs/Module/Import.php:84
-msgid "Unable to download data from old server"
-msgstr "Impossible de récupérer les données de l'ancien serveur"
+#: ../../Zotlabs/Module/Menu.php:119
+msgid "Delete this menu"
+msgstr "Supprimer ce menu"
-#: ../../Zotlabs/Module/Import_items.php:72 ../../Zotlabs/Module/Import.php:91
-msgid "Imported file is empty."
-msgstr "Le fichier importé est vide."
+#: ../../Zotlabs/Module/Menu.php:120 ../../Zotlabs/Module/Menu.php:154
+msgid "Edit menu contents"
+msgstr "Modifier le contenu du menu"
-#: ../../Zotlabs/Module/Import_items.php:88
-#: ../../Zotlabs/Module/Import.php:111
-#, php-format
-msgid "Warning: Database versions differ by %1$d updates."
-msgstr "Attention&nbsp;: les versions de bases de données diffèrent de %1$d mises à jour."
+#: ../../Zotlabs/Module/Menu.php:121
+msgid "Edit this menu"
+msgstr "Modifier ce menu"
-#: ../../Zotlabs/Module/Import_items.php:104
-msgid "Import completed"
-msgstr "L'import est terminé."
+#: ../../Zotlabs/Module/Menu.php:136
+msgid "Menu could not be deleted."
+msgstr "Impossible de supprimer le menu."
-#: ../../Zotlabs/Module/Import_items.php:119
-msgid "Import Items"
-msgstr "Importer"
+#: ../../Zotlabs/Module/Menu.php:149
+msgid "Edit Menu"
+msgstr "Modifier le menu"
-#: ../../Zotlabs/Module/Import_items.php:120
-msgid ""
-"Use this form to import existing posts and content from an export file."
-msgstr "Utiliser ce formulaire pour importer des publications et du contenu existant d'un fichier d'export."
+#: ../../Zotlabs/Module/Menu.php:153
+msgid "Add or remove entries to this menu"
+msgstr "Ajouter/supprimer des entrées à ce menu"
-#: ../../Zotlabs/Module/Import_items.php:121
-#: ../../Zotlabs/Module/Import.php:495
-msgid "File to Upload"
-msgstr "Fichier à envoyer"
+#: ../../Zotlabs/Module/Menu.php:155
+msgid "Menu name"
+msgstr "Nom du menu"
-#: ../../Zotlabs/Module/Manage.php:136
-#: ../../Zotlabs/Module/New_channel.php:121
-#, php-format
-msgid "You have created %1$.0f of %2$.0f allowed channels."
-msgstr "Vous avez créé %1$.0f des %2$.0f canaux autorisés."
+#: ../../Zotlabs/Module/Menu.php:155
+msgid "Must be unique, only seen by you"
+msgstr "Doit être unique, ne sera vu que par vous"
-#: ../../Zotlabs/Module/Manage.php:143
-msgid "Create a new channel"
-msgstr "Créer un nouveau canal"
+#: ../../Zotlabs/Module/Menu.php:156
+msgid "Menu title"
+msgstr "Titre du menu"
-#: ../../Zotlabs/Module/Manage.php:143 ../../Zotlabs/Module/Profiles.php:813
-#: ../../Zotlabs/Module/Wiki.php:166 ../../Zotlabs/Module/Chat.php:255
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:152
-msgid "Create New"
-msgstr "Nouveau"
+#: ../../Zotlabs/Module/Menu.php:156
+msgid "Menu title as seen by others"
+msgstr "Titre du menu tel que vu par les visiteurs"
-#: ../../Zotlabs/Module/Manage.php:164 ../../Zotlabs/Lib/Apps.php:221
-#: ../../include/nav.php:223
-msgid "Channel Manager"
-msgstr "Gérer mes canaux"
+#: ../../Zotlabs/Module/Menu.php:157
+msgid "Allow bookmarks"
+msgstr "Autoriser l'usage de favoris"
-#: ../../Zotlabs/Module/Manage.php:165
-msgid "Current Channel"
-msgstr "Canal actif"
+#: ../../Zotlabs/Module/Layouts.php:184 ../../include/text.php:2277
+msgid "Layouts"
+msgstr "Mises-en-page"
-#: ../../Zotlabs/Module/Manage.php:167
-msgid "Switch to one of your channels by selecting it."
-msgstr "Pour changer de canal, sélectionnez-en un"
+#: ../../Zotlabs/Module/Layouts.php:186 ../../Zotlabs/Lib/Apps.php:232
+#: ../../include/nav.php:157 ../../include/nav.php:264
+#: ../../include/help.php:55 ../../include/help.php:61
+msgid "Help"
+msgstr "Aide"
-#: ../../Zotlabs/Module/Manage.php:168
-msgid "Default Channel"
-msgstr "Canal par défaut"
+#: ../../Zotlabs/Module/Layouts.php:186
+msgid "Comanche page description language help"
+msgstr "Aide sur le langage de description de page Comanche"
-#: ../../Zotlabs/Module/Manage.php:169
-msgid "Make Default"
-msgstr "Définir comme défaut"
+#: ../../Zotlabs/Module/Layouts.php:190
+msgid "Layout Description"
+msgstr "Description de la mise en page"
-#: ../../Zotlabs/Module/Manage.php:172
-#, php-format
-msgid "%d new messages"
-msgstr "%d nouveaux messages"
+#: ../../Zotlabs/Module/Layouts.php:195
+msgid "Download PDL file"
+msgstr "Télécharger le fichier PDL"
-#: ../../Zotlabs/Module/Manage.php:173
-#, php-format
-msgid "%d new introductions"
-msgstr "%d nouvelles relations"
+#: ../../Zotlabs/Module/Tagger.php:55 ../../include/bbcode.php:274
+msgid "post"
+msgstr "publication"
-#: ../../Zotlabs/Module/Manage.php:175
-msgid "Delegated Channel"
-msgstr "Canaux délégués"
+#: ../../Zotlabs/Module/Tagger.php:57 ../../include/conversation.php:146
+#: ../../include/text.php:1953
+msgid "comment"
+msgstr "commentaire"
-#: ../../Zotlabs/Module/Import.php:134
+#: ../../Zotlabs/Module/Tagger.php:95
#, php-format
-msgid "Your service plan only allows %d channels."
-msgstr "Votre forfait n'autorise que %d canaux."
-
-#: ../../Zotlabs/Module/Import.php:149
-msgid "No channel. Import failed."
-msgstr "Pas de canal. Echec de l'import."
-
-#: ../../Zotlabs/Module/Import.php:467
-#: ../../extend/addon/addon/diaspora/import_diaspora.php:142
-msgid "Import completed."
-msgstr "L'import est terminé."
-
-#: ../../Zotlabs/Module/Import.php:488
-msgid "You must be logged in to use this feature."
-msgstr "Vous devez vous connecter pour utiliser cette fonctionnalité."
-
-#: ../../Zotlabs/Module/Import.php:493
-msgid "Import Channel"
-msgstr "Importation de canal"
-
-#: ../../Zotlabs/Module/Import.php:494
-msgid ""
-"Use this form to import an existing channel from a different server/hub. You"
-" may retrieve the channel identity from the old server/hub via the network "
-"or provide an export file."
-msgstr "Utilisez ce formulaire pour importer un canal existant sur un autre serveur. Vous pouvez récupérer l'identité du canal sur l'ancien serveur directement par le réseau, ou bien fournir un fichier d'export/import."
-
-#: ../../Zotlabs/Module/Import.php:496
-msgid "Or provide the old server/hub details"
-msgstr "Ou fournissez les détails de l'ancien serveur/hub"
-
-#: ../../Zotlabs/Module/Import.php:497
-msgid "Your old identity address (xyz@example.com)"
-msgstr "Votre ancienne identité (zyx@exemple.com)"
-
-#: ../../Zotlabs/Module/Import.php:498
-msgid "Your old login email address"
-msgstr "Votre ancienne adresse de courriel"
-
-#: ../../Zotlabs/Module/Import.php:499
-msgid "Your old login password"
-msgstr "Votre ancien mot de passe"
-
-#: ../../Zotlabs/Module/Import.php:500
-msgid ""
-"For either option, please choose whether to make this hub your new primary "
-"address, or whether your old location should continue this role. You will be"
-" able to post from either location, but only one can be marked as the "
-"primary location for files, photos, and media."
-msgstr "Quelle que soit l'option choisie, merci de décider si ce hub sera votre nouvelle adresse primaire, ou si votre ancien hub continuera à jouer ce rôle. Vous pourrez publier depuis l'emplacement de votre choix, mais une seule peut être déclarée comme stockage primaire de vos fichiers/photos/media."
-
-#: ../../Zotlabs/Module/Import.php:501
-msgid "Make this hub my primary location"
-msgstr "Faire de ce hub mon emplacement primaire"
+msgid "%1$s tagged %2$s's %3$s with %4$s"
+msgstr "%1$s a étiqueté le %3$s de %2$s avec %4$s"
-#: ../../Zotlabs/Module/Import.php:502
-msgid "Move this channel (disable all previous locations)"
-msgstr "Déplacer ce canal (désactiver tous les emplacements précédents)"
+#: ../../Zotlabs/Module/Pconfig.php:26 ../../Zotlabs/Module/Pconfig.php:59
+msgid "This setting requires special processing and editing has been blocked."
+msgstr "Ce paramètre nécessité un traitement spécial, les modifications ont été bloquées."
-#: ../../Zotlabs/Module/Import.php:503
-msgid "Import a few months of posts if possible (limited by available memory"
-msgstr "Importer plusieurs mois de messages si possible (limité par la mémoire disponible)"
+#: ../../Zotlabs/Module/Pconfig.php:48
+msgid "Configuration Editor"
+msgstr "Editeur de configuration"
-#: ../../Zotlabs/Module/Import.php:504
+#: ../../Zotlabs/Module/Pconfig.php:49
msgid ""
-"This process may take several minutes to complete. Please submit the form "
-"only once and leave this page open until finished."
-msgstr "Ce processus peut prendre plusieurs minutes. Merci de ne valider le formulaire qu'une seule fois et de laisser cette page ouverte jusqu'à la fin."
-
-#: ../../Zotlabs/Module/Lockview.php:75
-msgid "Remote privacy information not available."
-msgstr "Les informations distantes de confidentialité ne sont pas disponibles."
-
-#: ../../Zotlabs/Module/Lockview.php:96
-msgid "Visible to:"
-msgstr "Visible par&nbsp;:"
-
-#: ../../Zotlabs/Module/Magic.php:71
-msgid "Hub not found."
-msgstr "Hub introuvable."
-
-#: ../../Zotlabs/Module/Mitem.php:52
-msgid "Unable to create element."
-msgstr "Impossible de créer l'entrée."
-
-#: ../../Zotlabs/Module/Mitem.php:76
-msgid "Unable to update menu element."
-msgstr "Impossible de mettre à jour l'entrée de menu."
-
-#: ../../Zotlabs/Module/Mitem.php:92
-msgid "Unable to add menu element."
-msgstr "Impossible d'ajouter l'entrée de menu."
-
-#: ../../Zotlabs/Module/Mitem.php:153 ../../Zotlabs/Module/Mitem.php:230
-msgid "Menu Item Permissions"
-msgstr "Permissions de l'entrée de menu"
-
-#: ../../Zotlabs/Module/Mitem.php:154 ../../Zotlabs/Module/Mitem.php:231
-#: ../../Zotlabs/Module/Settings/Channel.php:510
-msgid "(click to open/close)"
-msgstr "(cliquer pour ouvrir/fermer)"
-
-#: ../../Zotlabs/Module/Mitem.php:160 ../../Zotlabs/Module/Mitem.php:176
-msgid "Link Name"
-msgstr "Nom du lien"
-
-#: ../../Zotlabs/Module/Mitem.php:161 ../../Zotlabs/Module/Mitem.php:239
-msgid "Link or Submenu Target"
-msgstr "Lien ou sous-menu cible"
-
-#: ../../Zotlabs/Module/Mitem.php:161
-msgid "Enter URL of the link or select a menu name to create a submenu"
-msgstr "Entrez l'URL du lien ou sélectionnez un nom de menu pour créer un sous-menu"
-
-#: ../../Zotlabs/Module/Mitem.php:162 ../../Zotlabs/Module/Mitem.php:240
-msgid "Use magic-auth if available"
-msgstr "Utiliser l'authentification distante, quand disponible"
-
-#: ../../Zotlabs/Module/Mitem.php:163 ../../Zotlabs/Module/Mitem.php:241
-msgid "Open link in new window"
-msgstr "Ouvrir le lien dans une nouvelle fenêtre"
-
-#: ../../Zotlabs/Module/Mitem.php:164 ../../Zotlabs/Module/Mitem.php:242
-msgid "Order in list"
-msgstr "Ordre dans la liste"
-
-#: ../../Zotlabs/Module/Mitem.php:164 ../../Zotlabs/Module/Mitem.php:242
-msgid "Higher numbers will sink to bottom of listing"
-msgstr "Les nombres les plus élevés seront au bas de la liste"
-
-#: ../../Zotlabs/Module/Mitem.php:165
-msgid "Submit and finish"
-msgstr "Vadiler et terminer"
-
-#: ../../Zotlabs/Module/Mitem.php:166
-msgid "Submit and continue"
-msgstr "Valider et continuer"
-
-#: ../../Zotlabs/Module/Mitem.php:174
-msgid "Menu:"
-msgstr "Menu&nbsp;:"
-
-#: ../../Zotlabs/Module/Mitem.php:177
-msgid "Link Target"
-msgstr "Cible du lien"
-
-#: ../../Zotlabs/Module/Mitem.php:180
-msgid "Edit menu"
-msgstr "Modifier le menu"
-
-#: ../../Zotlabs/Module/Mitem.php:183
-msgid "Edit element"
-msgstr "Modifier l'entrée"
-
-#: ../../Zotlabs/Module/Mitem.php:184
-msgid "Drop element"
-msgstr "Supprimer l'entrée"
-
-#: ../../Zotlabs/Module/Mitem.php:185
-msgid "New element"
-msgstr "Nouvelle entrée"
-
-#: ../../Zotlabs/Module/Mitem.php:186
-msgid "Edit this menu container"
-msgstr "Éditer ce bloc de menu"
-
-#: ../../Zotlabs/Module/Mitem.php:187
-msgid "Add menu element"
-msgstr "Ajouter une entrée au menu"
-
-#: ../../Zotlabs/Module/Mitem.php:188
-msgid "Delete this menu item"
-msgstr "Supprimer cette entrée du menu"
-
-#: ../../Zotlabs/Module/Mitem.php:189
-msgid "Edit this menu item"
-msgstr "Modifier cette entrée du menu"
-
-#: ../../Zotlabs/Module/Mitem.php:206
-msgid "Menu item not found."
-msgstr "Entrée de menu introuvable."
-
-#: ../../Zotlabs/Module/Mitem.php:219
-msgid "Menu item deleted."
-msgstr "Entrée de menu supprimée."
-
-#: ../../Zotlabs/Module/Mitem.php:221
-msgid "Menu item could not be deleted."
-msgstr "Impossible de supprimer l'entrée de menu."
-
-#: ../../Zotlabs/Module/Mitem.php:228
-msgid "Edit Menu Element"
-msgstr "Modifier l'entrée de menu"
-
-#: ../../Zotlabs/Module/Mitem.php:238
-msgid "Link text"
-msgstr "Texte du lien"
-
-#: ../../Zotlabs/Module/Appman.php:38 ../../Zotlabs/Module/Appman.php:54
-msgid "App installed."
-msgstr "Application installée."
-
-#: ../../Zotlabs/Module/Appman.php:47
-msgid "Malformed app."
-msgstr "Erreur de l'application - Malformée."
-
-#: ../../Zotlabs/Module/Appman.php:110
-msgid "Embed code"
-msgstr "Imbriquer le code"
-
-#: ../../Zotlabs/Module/Appman.php:116
-msgid "Edit App"
-msgstr "Modifier l'application"
-
-#: ../../Zotlabs/Module/Appman.php:116
-msgid "Create App"
-msgstr "Créer une application"
-
-#: ../../Zotlabs/Module/Appman.php:121
-msgid "Name of app"
-msgstr "Nom de l'application"
-
-#: ../../Zotlabs/Module/Appman.php:121 ../../Zotlabs/Module/Appman.php:122
-#: ../../Zotlabs/Module/Profiles.php:744 ../../Zotlabs/Module/Profiles.php:748
-#: ../../Zotlabs/Module/Events.php:460 ../../Zotlabs/Module/Events.php:465
-#: ../../include/datetime.php:259
-msgid "Required"
-msgstr "Requis"
-
-#: ../../Zotlabs/Module/Appman.php:122
-msgid "Location (URL) of app"
-msgstr "Emplacement (URL) de l'application"
-
-#: ../../Zotlabs/Module/Appman.php:123 ../../Zotlabs/Module/Events.php:473
-#: ../../Zotlabs/Module/Rbmark.php:101
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:838
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:173
-msgid "Description"
-msgstr "Description"
-
-#: ../../Zotlabs/Module/Appman.php:124
-msgid "Photo icon URL"
-msgstr "URL de l'icône à utiliser pour cette photo"
-
-#: ../../Zotlabs/Module/Appman.php:124
-msgid "80 x 80 pixels - optional"
-msgstr "80 x 80 pixels - facultatif"
-
-#: ../../Zotlabs/Module/Appman.php:125
-msgid "Categories (optional, comma separated list)"
-msgstr "Catégories (séparées par des virgules)"
+"Warning: Changing some settings could render your channel inoperable. Please"
+" leave this page unless you are comfortable with and knowledgeable about how"
+" to correctly use this feature."
+msgstr "Attention&nbsp;:modifier certains paramètres peut rendre votre canal inutilisable. Merci d'ignorer cette page à moins d'être suffisamment à l'aise de savoir comment utiliser correctement cette fonctionnalité."
-#: ../../Zotlabs/Module/Appman.php:126
-msgid "Version ID"
-msgstr "Identifiant de version"
+#: ../../Zotlabs/Module/Group.php:24
+msgid "Privacy group created."
+msgstr "Groupe de contacts créé."
-#: ../../Zotlabs/Module/Appman.php:127
-msgid "Price of app"
-msgstr "Prix de l'application"
+#: ../../Zotlabs/Module/Group.php:30
+msgid "Could not create privacy group."
+msgstr "Impossible de créer le groupe de contacts."
-#: ../../Zotlabs/Module/Appman.php:128
-msgid "Location (URL) to purchase app"
-msgstr "Emplacement (URL) pour l'achat de l'application"
+#: ../../Zotlabs/Module/Group.php:42 ../../Zotlabs/Module/Group.php:141
+#: ../../include/items.php:3909
+msgid "Privacy group not found."
+msgstr "Groupe de contacts introuvable."
-#: ../../Zotlabs/Module/Ratings.php:70
-msgid "No ratings"
-msgstr "Pas de note"
+#: ../../Zotlabs/Module/Group.php:58
+msgid "Privacy group updated."
+msgstr "Groupe de contacts mis à jour."
-#: ../../Zotlabs/Module/Ratings.php:98
-msgid "Rating: "
-msgstr "Evaluation&nbsp:"
+#: ../../Zotlabs/Module/Group.php:90
+msgid "Create a group of channels."
+msgstr "Créer un groupe de contacts."
-#: ../../Zotlabs/Module/Ratings.php:99
-msgid "Website: "
-msgstr "Site web&nbsp;:"
+#: ../../Zotlabs/Module/Group.php:91 ../../Zotlabs/Module/Group.php:184
+msgid "Privacy group name: "
+msgstr "Nom du groupe de contacts&nbsp;:"
-#: ../../Zotlabs/Module/Ratings.php:101
-msgid "Description: "
-msgstr "Description&nbsp;:"
+#: ../../Zotlabs/Module/Group.php:93 ../../Zotlabs/Module/Group.php:187
+msgid "Members are visible to other channels"
+msgstr "Les membres sont visibles par les autres canaux"
-#: ../../Zotlabs/Module/Attach.php:13
-msgid "Item not available."
-msgstr "Élément indisponible."
+#: ../../Zotlabs/Module/Group.php:111
+msgid "Privacy group removed."
+msgstr "Groupe de contacts supprimé."
-#: ../../Zotlabs/Module/Mood.php:67 ../../include/conversation.php:260
-#, php-format
-msgctxt "mood"
-msgid "%1$s is %2$s"
-msgstr "%1$s est %2$s"
+#: ../../Zotlabs/Module/Group.php:113
+msgid "Unable to remove privacy group."
+msgstr "Impossible de supprimer le groupe de canaux."
-#: ../../Zotlabs/Module/Mood.php:135 ../../Zotlabs/Lib/Apps.php:234
-msgid "Mood"
-msgstr "Humeur"
+#: ../../Zotlabs/Module/Group.php:183
+msgid "Privacy group editor"
+msgstr "Editeur de groupe de contacts."
-#: ../../Zotlabs/Module/Mood.php:136
-msgid "Set your current mood and tell your friends"
-msgstr "Indiquez votre humeur du moment à vos amis"
+#: ../../Zotlabs/Module/Group.php:197 ../../Zotlabs/Module/Help.php:81
+msgid "Members"
+msgstr "Membres"
-#: ../../Zotlabs/Module/Notify.php:57
-#: ../../Zotlabs/Module/Notifications.php:38
-msgid "No more system notifications."
-msgstr "Pas d'autre notification du système."
+#: ../../Zotlabs/Module/Group.php:199
+msgid "All Connected Channels"
+msgstr "Tous les canaux connectés"
-#: ../../Zotlabs/Module/Notify.php:61
-#: ../../Zotlabs/Module/Notifications.php:42
-msgid "System Notifications"
-msgstr "Notifications du système"
+#: ../../Zotlabs/Module/Group.php:231
+msgid "Click on a channel to add or remove."
+msgstr "Cliquer sur un canal pour l'ajouter ou le supprimer"
#: ../../Zotlabs/Module/Profiles.php:24 ../../Zotlabs/Module/Profiles.php:184
-#: ../../Zotlabs/Module/Profiles.php:241 ../../Zotlabs/Module/Profiles.php:660
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:62
+#: ../../Zotlabs/Module/Profiles.php:241 ../../Zotlabs/Module/Profiles.php:659
msgid "Profile not found."
msgstr "Profil introuvable."
@@ -4292,338 +5606,304 @@ msgstr "Impossible d'exporter le profil."
msgid "Profile Name is required."
msgstr "Le nom du profil est obligatoire."
-#: ../../Zotlabs/Module/Profiles.php:460
+#: ../../Zotlabs/Module/Profiles.php:459
msgid "Marital Status"
msgstr "Statut marital"
-#: ../../Zotlabs/Module/Profiles.php:464
+#: ../../Zotlabs/Module/Profiles.php:463
msgid "Romantic Partner"
msgstr "Partenaire amoureux"
-#: ../../Zotlabs/Module/Profiles.php:468 ../../Zotlabs/Module/Profiles.php:771
+#: ../../Zotlabs/Module/Profiles.php:467 ../../Zotlabs/Module/Profiles.php:775
msgid "Likes"
msgstr "Aime"
-#: ../../Zotlabs/Module/Profiles.php:472 ../../Zotlabs/Module/Profiles.php:772
+#: ../../Zotlabs/Module/Profiles.php:471 ../../Zotlabs/Module/Profiles.php:776
msgid "Dislikes"
msgstr "N'aime pas"
-#: ../../Zotlabs/Module/Profiles.php:476 ../../Zotlabs/Module/Profiles.php:779
+#: ../../Zotlabs/Module/Profiles.php:475 ../../Zotlabs/Module/Profiles.php:783
msgid "Work/Employment"
msgstr "Travail/Occupation"
-#: ../../Zotlabs/Module/Profiles.php:479
+#: ../../Zotlabs/Module/Profiles.php:478
msgid "Religion"
msgstr "Religion/Croyance"
-#: ../../Zotlabs/Module/Profiles.php:483
+#: ../../Zotlabs/Module/Profiles.php:482
msgid "Political Views"
msgstr "Opinions politiques"
-#: ../../Zotlabs/Module/Profiles.php:487
-#: ../../extend/addon/addon/openid/MysqlProvider.php:74
+#: ../../Zotlabs/Module/Profiles.php:486
+#: ../../addon/openid/MysqlProvider.php:74
msgid "Gender"
msgstr "Sexe"
-#: ../../Zotlabs/Module/Profiles.php:491
+#: ../../Zotlabs/Module/Profiles.php:490
msgid "Sexual Preference"
msgstr "Préférences sexuelle"
-#: ../../Zotlabs/Module/Profiles.php:495
+#: ../../Zotlabs/Module/Profiles.php:494
msgid "Homepage"
msgstr "Site Internet"
-#: ../../Zotlabs/Module/Profiles.php:499
+#: ../../Zotlabs/Module/Profiles.php:498
msgid "Interests"
msgstr "Centres d'intérêt"
-#: ../../Zotlabs/Module/Profiles.php:595
+#: ../../Zotlabs/Module/Profiles.php:594
msgid "Profile updated."
msgstr "Profil mis à jour."
-#: ../../Zotlabs/Module/Profiles.php:679
+#: ../../Zotlabs/Module/Profiles.php:678
msgid "Hide your connections list from viewers of this profile"
msgstr "Cacher la liste des relations pour les visiteurs de votre profile"
-#: ../../Zotlabs/Module/Profiles.php:721
+#: ../../Zotlabs/Module/Profiles.php:725
msgid "Edit Profile Details"
msgstr "Modifier les détails du profil"
-#: ../../Zotlabs/Module/Profiles.php:723
+#: ../../Zotlabs/Module/Profiles.php:727
msgid "View this profile"
msgstr "Voir ce profil"
-#: ../../Zotlabs/Module/Profiles.php:724 ../../Zotlabs/Module/Profiles.php:806
-#: ../../include/channel.php:1066
+#: ../../Zotlabs/Module/Profiles.php:728 ../../Zotlabs/Module/Profiles.php:827
+#: ../../include/channel.php:1064
msgid "Edit visibility"
msgstr "Changer la visibilité"
-#: ../../Zotlabs/Module/Profiles.php:725
+#: ../../Zotlabs/Module/Profiles.php:729
msgid "Profile Tools"
msgstr "Ouitls pour votre profile"
-#: ../../Zotlabs/Module/Profiles.php:726
+#: ../../Zotlabs/Module/Profiles.php:730
msgid "Change cover photo"
msgstr "Modifier votre bannière"
-#: ../../Zotlabs/Module/Profiles.php:727 ../../include/channel.php:1037
+#: ../../Zotlabs/Module/Profiles.php:731 ../../include/channel.php:1035
msgid "Change profile photo"
msgstr "Changer la photo du profil"
-#: ../../Zotlabs/Module/Profiles.php:728
+#: ../../Zotlabs/Module/Profiles.php:732
msgid "Create a new profile using these settings"
msgstr "Créer un nouveau profil avec ces paramètres"
-#: ../../Zotlabs/Module/Profiles.php:729
+#: ../../Zotlabs/Module/Profiles.php:733
msgid "Clone this profile"
msgstr "Cloner ce profil"
-#: ../../Zotlabs/Module/Profiles.php:730
+#: ../../Zotlabs/Module/Profiles.php:734
msgid "Delete this profile"
msgstr "Supprimer ce profil"
-#: ../../Zotlabs/Module/Profiles.php:731
+#: ../../Zotlabs/Module/Profiles.php:735
msgid "Add profile things"
msgstr "Ajouter des éléments de profil"
-#: ../../Zotlabs/Module/Profiles.php:732 ../../include/conversation.php:1715
-#: ../../include/widgets.php:105
+#: ../../Zotlabs/Module/Profiles.php:736 ../../include/conversation.php:1648
msgid "Personal"
msgstr "Me concernant"
-#: ../../Zotlabs/Module/Profiles.php:734
+#: ../../Zotlabs/Module/Profiles.php:738
msgid "Relation"
msgstr "Contacts"
-#: ../../Zotlabs/Module/Profiles.php:735 ../../include/datetime.php:55
+#: ../../Zotlabs/Module/Profiles.php:739 ../../include/datetime.php:55
msgid "Miscellaneous"
msgstr "Divers"
-#: ../../Zotlabs/Module/Profiles.php:737
+#: ../../Zotlabs/Module/Profiles.php:741
msgid "Import profile from file"
msgstr "Importer le profil à partir d'un fichier"
-#: ../../Zotlabs/Module/Profiles.php:738
+#: ../../Zotlabs/Module/Profiles.php:742
msgid "Export profile to file"
msgstr "Exporter le profil vers un fichier."
-#: ../../Zotlabs/Module/Profiles.php:739
+#: ../../Zotlabs/Module/Profiles.php:743
msgid "Your gender"
msgstr "Votre genre"
-#: ../../Zotlabs/Module/Profiles.php:740
+#: ../../Zotlabs/Module/Profiles.php:744
msgid "Marital status"
msgstr "Etat civil"
-#: ../../Zotlabs/Module/Profiles.php:741
+#: ../../Zotlabs/Module/Profiles.php:745
msgid "Sexual preference"
msgstr "préférence sexuelle"
-#: ../../Zotlabs/Module/Profiles.php:744
+#: ../../Zotlabs/Module/Profiles.php:748
msgid "Profile name"
msgstr "Nom du profile"
-#: ../../Zotlabs/Module/Profiles.php:746
+#: ../../Zotlabs/Module/Profiles.php:750
msgid "This is your default profile."
msgstr "Ceci est votre profil par défaut."
-#: ../../Zotlabs/Module/Profiles.php:748
+#: ../../Zotlabs/Module/Profiles.php:752
msgid "Your full name"
msgstr "Votre nom complet"
-#: ../../Zotlabs/Module/Profiles.php:749
+#: ../../Zotlabs/Module/Profiles.php:753
msgid "Title/Description"
msgstr "Titre/description"
-#: ../../Zotlabs/Module/Profiles.php:752
+#: ../../Zotlabs/Module/Profiles.php:756
msgid "Street address"
msgstr "Rue"
-#: ../../Zotlabs/Module/Profiles.php:753
+#: ../../Zotlabs/Module/Profiles.php:757
msgid "Locality/City"
msgstr "Ville"
-#: ../../Zotlabs/Module/Profiles.php:754
+#: ../../Zotlabs/Module/Profiles.php:758
msgid "Region/State"
msgstr "Région"
-#: ../../Zotlabs/Module/Profiles.php:755
+#: ../../Zotlabs/Module/Profiles.php:759
msgid "Postal/Zip code"
msgstr "Code postal"
-#: ../../Zotlabs/Module/Profiles.php:761
+#: ../../Zotlabs/Module/Profiles.php:765
msgid "Who (if applicable)"
msgstr "Qui (si applicable)"
-#: ../../Zotlabs/Module/Profiles.php:761
+#: ../../Zotlabs/Module/Profiles.php:765
msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
msgstr "Exemples&nbsp;: marie123, Marie Deschamps, marie@exemple.com"
-#: ../../Zotlabs/Module/Profiles.php:762
+#: ../../Zotlabs/Module/Profiles.php:766
msgid "Since (date)"
msgstr "Depuis (date)"
-#: ../../Zotlabs/Module/Profiles.php:765
+#: ../../Zotlabs/Module/Profiles.php:769
msgid "Tell us about yourself"
msgstr "Parlez nous de vous..."
-#: ../../Zotlabs/Module/Profiles.php:766
-#: ../../extend/addon/addon/openid/MysqlProvider.php:68
+#: ../../Zotlabs/Module/Profiles.php:770
+#: ../../addon/openid/MysqlProvider.php:68
msgid "Homepage URL"
msgstr "URL de mon site Internet&nbsp;:"
-#: ../../Zotlabs/Module/Profiles.php:767
+#: ../../Zotlabs/Module/Profiles.php:771
msgid "Hometown"
msgstr "Ville de naissance"
-#: ../../Zotlabs/Module/Profiles.php:768
+#: ../../Zotlabs/Module/Profiles.php:772
msgid "Political views"
msgstr "Opinions politiques"
-#: ../../Zotlabs/Module/Profiles.php:769
+#: ../../Zotlabs/Module/Profiles.php:773
msgid "Religious views"
msgstr "Convictions religieuses"
-#: ../../Zotlabs/Module/Profiles.php:770
+#: ../../Zotlabs/Module/Profiles.php:774
msgid "Keywords used in directory listings"
msgstr "Mots clés pour l'annuaire"
-#: ../../Zotlabs/Module/Profiles.php:770
+#: ../../Zotlabs/Module/Profiles.php:774
msgid "Example: fishing photography software"
msgstr "Exemple&nbsp;: escrime photographie modélisme"
-#: ../../Zotlabs/Module/Profiles.php:773
+#: ../../Zotlabs/Module/Profiles.php:777
msgid "Musical interests"
msgstr "Goûts musicaux"
-#: ../../Zotlabs/Module/Profiles.php:774
+#: ../../Zotlabs/Module/Profiles.php:778
msgid "Books, literature"
msgstr "Livres, littérature"
-#: ../../Zotlabs/Module/Profiles.php:775
+#: ../../Zotlabs/Module/Profiles.php:779
msgid "Television"
msgstr "Télévision"
-#: ../../Zotlabs/Module/Profiles.php:776
+#: ../../Zotlabs/Module/Profiles.php:780
msgid "Film/Dance/Culture/Entertainment"
msgstr "Cinéma/Danse/Culture/Divertissement"
-#: ../../Zotlabs/Module/Profiles.php:777
+#: ../../Zotlabs/Module/Profiles.php:781
msgid "Hobbies/Interests"
msgstr "Loisirs/Centres d'intêret"
-#: ../../Zotlabs/Module/Profiles.php:778
+#: ../../Zotlabs/Module/Profiles.php:782
msgid "Love/Romance"
msgstr "Amour/Relation amoureuse"
-#: ../../Zotlabs/Module/Profiles.php:780
+#: ../../Zotlabs/Module/Profiles.php:784
msgid "School/Education"
msgstr "Niveau d'étude"
-#: ../../Zotlabs/Module/Profiles.php:781
+#: ../../Zotlabs/Module/Profiles.php:785
msgid "Contact information and social networks"
msgstr "Coordonnées et autres réseaux sociaux"
-#: ../../Zotlabs/Module/Profiles.php:782
+#: ../../Zotlabs/Module/Profiles.php:786
msgid "My other channels"
msgstr "Mes autres canaux"
-#: ../../Zotlabs/Module/Profiles.php:802 ../../include/channel.php:1062
+#: ../../Zotlabs/Module/Profiles.php:788
+msgid "Communications"
+msgstr ""
+
+#: ../../Zotlabs/Module/Profiles.php:823 ../../include/channel.php:1060
msgid "Profile Image"
msgstr "Image du profil"
-#: ../../Zotlabs/Module/Profiles.php:812 ../../include/channel.php:1044
+#: ../../Zotlabs/Module/Profiles.php:833 ../../include/channel.php:1042
#: ../../include/nav.php:105
msgid "Edit Profiles"
msgstr "Modifier mes profils"
-#: ../../Zotlabs/Module/Api.php:72 ../../Zotlabs/Module/Api.php:93
-msgid "Authorize application connection"
-msgstr "Autoriser l'application à se connecter"
+#: ../../Zotlabs/Module/Editwebpage.php:144
+msgid "Page link"
+msgstr "Lien"
-#: ../../Zotlabs/Module/Api.php:73
-msgid "Return to your app and insert this Security Code:"
-msgstr "Revenez dans votre application et mettez le code de sécurité"
+#: ../../Zotlabs/Module/Editwebpage.php:171
+msgid "Edit Webpage"
+msgstr "Modifier la page web"
-#: ../../Zotlabs/Module/Api.php:83
-msgid "Please login to continue."
-msgstr "Merci de vous identifier pour continuer."
+#: ../../Zotlabs/Module/Manage.php:143
+msgid "Create a new channel"
+msgstr "Créer un nouveau canal"
-#: ../../Zotlabs/Module/Api.php:95
-msgid ""
-"Do you want to authorize this application to access your posts and contacts,"
-" and/or create new posts for you?"
-msgstr "Voulez-vous autoriser cette application à accéder à vos publications et contacts, et/ou à publier en votre nom?"
+#: ../../Zotlabs/Module/Manage.php:164 ../../Zotlabs/Lib/Apps.php:221
+#: ../../include/nav.php:201
+msgid "Channel Manager"
+msgstr "Gérer mes canaux"
-#: ../../Zotlabs/Module/Invite.php:29
-msgid "Total invitation limit exceeded."
-msgstr "Limite du nombre total d'invitation dépassée."
+#: ../../Zotlabs/Module/Manage.php:165
+msgid "Current Channel"
+msgstr "Canal actif"
-#: ../../Zotlabs/Module/Invite.php:53
-#, php-format
-msgid "%s : Not a valid email address."
-msgstr "%s&nbsp;: adresse courriel invalide."
+#: ../../Zotlabs/Module/Manage.php:167
+msgid "Switch to one of your channels by selecting it."
+msgstr "Pour changer de canal, sélectionnez-en un"
-#: ../../Zotlabs/Module/Invite.php:67
-msgid "Please join us on $Projectname"
-msgstr "Rejoignez-nous sur $Projectname"
+#: ../../Zotlabs/Module/Manage.php:168
+msgid "Default Channel"
+msgstr "Canal par défaut"
-#: ../../Zotlabs/Module/Invite.php:77
-msgid "Invitation limit exceeded. Please contact your site administrator."
-msgstr "Limite d'invitations dépassée. Merci de contacter l'administration de votre site."
+#: ../../Zotlabs/Module/Manage.php:169
+msgid "Make Default"
+msgstr "Définir comme défaut"
-#: ../../Zotlabs/Module/Invite.php:82
+#: ../../Zotlabs/Module/Manage.php:172
#, php-format
-msgid "%s : Message delivery failed."
-msgstr "%s&nbsp;: Échec de distribution du message."
+msgid "%d new messages"
+msgstr "%d nouveaux messages"
-#: ../../Zotlabs/Module/Invite.php:86
+#: ../../Zotlabs/Module/Manage.php:173
#, php-format
-msgid "%d message sent."
-msgid_plural "%d messages sent."
-msgstr[0] "%d message envoyé."
-msgstr[1] "%d messages envoyés."
-
-#: ../../Zotlabs/Module/Invite.php:105
-msgid "You have no more invitations available"
-msgstr "Vous ne disposez plus d'aucune invitation"
-
-#: ../../Zotlabs/Module/Invite.php:136
-msgid "Send invitations"
-msgstr "Envoyer des invitations"
-
-#: ../../Zotlabs/Module/Invite.php:137
-msgid "Enter email addresses, one per line:"
-msgstr "Entrez les adresses de courriel, une par ligne&nbsp;:"
-
-#: ../../Zotlabs/Module/Invite.php:138 ../../Zotlabs/Module/Mail.php:284
-msgid "Your message:"
-msgstr "Votre message&nbsp;:"
-
-#: ../../Zotlabs/Module/Invite.php:139
-msgid "Please join my community on $Projectname."
-msgstr "Rejoignez ma communauté sur $Projectname."
-
-#: ../../Zotlabs/Module/Invite.php:141
-msgid "You will need to supply this invitation code:"
-msgstr "Vous devrez fournir le code suivant&nbsp;:"
-
-#: ../../Zotlabs/Module/Invite.php:142
-msgid ""
-"1. Register at any $Projectname location (they are all inter-connected)"
-msgstr "1. Enregistrez-vous sur n'importe quel serveur $Projectname (ils sont tous inter-connectés)"
-
-#: ../../Zotlabs/Module/Invite.php:144
-msgid "2. Enter my $Projectname network address into the site searchbar."
-msgstr "2. Saisissez l'adresse de mon canal $Projectname dans la barre de recherche du site."
+msgid "%d new introductions"
+msgstr "%d nouvelles relations"
-#: ../../Zotlabs/Module/Invite.php:145
-msgid "or visit"
-msgstr "ou rendez-vous sur"
+#: ../../Zotlabs/Module/Manage.php:175
+msgid "Delegated Channel"
+msgstr "Canaux délégués"
-#: ../../Zotlabs/Module/Invite.php:147
-msgid "3. Click [Connect]"
-msgstr "3. Cliquez sur [Ajouter]"
+#: ../../Zotlabs/Module/Dirsearch.php:33
+msgid "This directory server requires an access token"
+msgstr "Ce serveur d'annuaire requiert un jeton d'accès"
#: ../../Zotlabs/Module/Siteinfo.php:20
msgid "About this site"
@@ -4633,10 +5913,14 @@ msgstr "À propos de ce site"
msgid "Site Name"
msgstr "Nom du site"
-#: ../../Zotlabs/Module/Siteinfo.php:25 ../../include/network.php:1972
+#: ../../Zotlabs/Module/Siteinfo.php:25 ../../include/network.php:1995
msgid "Administrator"
msgstr "Administrateur"
+#: ../../Zotlabs/Module/Siteinfo.php:27 ../../Zotlabs/Module/Register.php:221
+msgid "Terms of Service"
+msgstr "Conditions de service"
+
#: ../../Zotlabs/Module/Siteinfo.php:28
msgid "Software and Project information"
msgstr "Informations sur le logiciel et le projet"
@@ -4663,2538 +5947,1361 @@ msgstr "Page d'accueil du projet"
msgid "Developer homepage"
msgstr "Page d'accueil des développeurs"
-#: ../../Zotlabs/Module/New_channel.php:140
-msgid "Create Channel"
-msgstr "Créer le canal"
-
-#: ../../Zotlabs/Module/New_channel.php:141
-msgid ""
-"A channel is your identity on this network. It can represent a person, a "
-"blog, or a forum to name a few. Channels can make connections with other "
-"channels to share information with highly detailed permissions."
-msgstr "Un canal est votre identité sur ce réseau. Il peut représenter une personne, un blog, ou un forum par exemple. Les canaux peuvent entrer en contact les uns avec les autres pour partager des informations avec des permissions d'accès très fines."
-
-#: ../../Zotlabs/Module/New_channel.php:142
-msgid ""
-"or <a href=\"import\">import an existing channel</a> from another location."
-msgstr "ou <a href=\"import\">importer un canal existant</a> d'un autre serveur."
-
-#: ../../Zotlabs/Module/Setup.php:176
-msgid "$Projectname Server - Setup"
-msgstr "Serveur $Projectname - configuration"
-
-#: ../../Zotlabs/Module/Setup.php:180
-msgid "Could not connect to database."
-msgstr "Impossible de se connecter à la base de données."
-
-#: ../../Zotlabs/Module/Setup.php:184
-msgid ""
-"Could not connect to specified site URL. Possible SSL certificate or DNS "
-"issue."
-msgstr "Impossible de se connecter à l'URL indiquée. Problème potentiel de certificat SSL/TLS ou de DNS."
-
-#: ../../Zotlabs/Module/Setup.php:191
-msgid "Could not create table."
-msgstr "Impossible de créer la table."
-
-#: ../../Zotlabs/Module/Setup.php:196
-msgid "Your site database has been installed."
-msgstr "La base de données de votre site a été installée."
-
-#: ../../Zotlabs/Module/Setup.php:200
-msgid ""
-"You may need to import the file \"install/schema_xxx.sql\" manually using a "
-"database client."
-msgstr "Vous pourriez avoir besoin d'importer le fichier \"install/schema_xxx.sql\" manuellement via un client de base de données (ex: phpmyadmin)."
+#: ../../Zotlabs/Module/Ratings.php:70
+msgid "No ratings"
+msgstr "Pas de note"
-#: ../../Zotlabs/Module/Setup.php:201 ../../Zotlabs/Module/Setup.php:263
-#: ../../Zotlabs/Module/Setup.php:750
-msgid "Please see the file \"install/INSTALL.txt\"."
-msgstr "Merci de consulter le fichier \"install/INSTALL.txt\"."
+#: ../../Zotlabs/Module/Ratings.php:97 ../../Zotlabs/Module/Pubsites.php:35
+#: ../../include/conversation.php:1032
+msgid "Ratings"
+msgstr "Evaluations"
-#: ../../Zotlabs/Module/Setup.php:260
-msgid "System check"
-msgstr "Vérification du système"
+#: ../../Zotlabs/Module/Ratings.php:98
+msgid "Rating: "
+msgstr "Evaluation&nbsp:"
-#: ../../Zotlabs/Module/Setup.php:265
-msgid "Check again"
-msgstr "Re-vérifier"
+#: ../../Zotlabs/Module/Ratings.php:99
+msgid "Website: "
+msgstr "Site web&nbsp;:"
-#: ../../Zotlabs/Module/Setup.php:287
-msgid "Database connection"
-msgstr "Connexion à la base de données"
+#: ../../Zotlabs/Module/Ratings.php:101
+msgid "Description: "
+msgstr "Description&nbsp;:"
-#: ../../Zotlabs/Module/Setup.php:288
-msgid ""
-"In order to install $Projectname we need to know how to connect to your "
-"database."
-msgstr "Pour installer $Projectname, nous avons besoin de savoir comment se connecter à votre base de données."
+#: ../../Zotlabs/Module/Webpages.php:52
+msgid "Import Webpage Elements"
+msgstr "Importer éléments de page web"
-#: ../../Zotlabs/Module/Setup.php:289
-msgid ""
-"Please contact your hosting provider or site administrator if you have "
-"questions about these settings."
-msgstr "Merci de contacter votre prestataire d'hébergement ou votre administrateur de site si vous avez des questions à propos de ces paramètres."
+#: ../../Zotlabs/Module/Webpages.php:53
+msgid "Import selected"
+msgstr "Importation sélectionnée"
-#: ../../Zotlabs/Module/Setup.php:290
-msgid ""
-"The database you specify below should already exist. If it does not, please "
-"create it before continuing."
-msgstr "La base de données que vous allez spécifier doit exister. Si ce n'est pas déjà le cas, merci de la créer avant de continuer."
+#: ../../Zotlabs/Module/Webpages.php:76
+msgid "Export Webpage Elements"
+msgstr "Exporter éléments de pages web"
-#: ../../Zotlabs/Module/Setup.php:294
-msgid "Database Server Name"
-msgstr "Nom du serveur de base de données"
+#: ../../Zotlabs/Module/Webpages.php:77
+msgid "Export selected"
+msgstr "Export sélectionné"
-#: ../../Zotlabs/Module/Setup.php:294
-msgid "Default is 127.0.0.1"
-msgstr "Par défaut 127.0.0.1"
+#: ../../Zotlabs/Module/Webpages.php:242 ../../Zotlabs/Lib/Apps.php:225
+#: ../../include/conversation.php:1832
+msgid "Webpages"
+msgstr "Pages web"
-#: ../../Zotlabs/Module/Setup.php:295
-msgid "Database Port"
-msgstr "Port de la base de données"
+#: ../../Zotlabs/Module/Webpages.php:253 ../../include/page_widgets.php:44
+msgid "Actions"
+msgstr "Actions"
-#: ../../Zotlabs/Module/Setup.php:295
-msgid "Communication port number - use 0 for default"
-msgstr "Numéro TCP du port - utilisez 0 pour la valeur par défaut"
+#: ../../Zotlabs/Module/Webpages.php:254 ../../include/page_widgets.php:45
+msgid "Page Link"
+msgstr "Lien vers la page"
-#: ../../Zotlabs/Module/Setup.php:296
-msgid "Database Login Name"
-msgstr "Identifiant de connexion à la Base de Données"
+#: ../../Zotlabs/Module/Webpages.php:255
+msgid "Page Title"
+msgstr "Titre de la page"
-#: ../../Zotlabs/Module/Setup.php:297
-msgid "Database Login Password"
-msgstr "Mot de passe de connexion à la Base de Données"
+#: ../../Zotlabs/Module/Webpages.php:285
+msgid "Invalid file type."
+msgstr "Type de fichier invalide"
-#: ../../Zotlabs/Module/Setup.php:298
-msgid "Database Name"
-msgstr "Nom de la Base de Données"
+#: ../../Zotlabs/Module/Webpages.php:297
+msgid "Error opening zip file"
+msgstr "Erreur lors de l'ouverture du fichier zip"
-#: ../../Zotlabs/Module/Setup.php:299
-msgid "Database Type"
-msgstr "Type de base de données"
+#: ../../Zotlabs/Module/Webpages.php:308
+msgid "Invalid folder path."
+msgstr "Chemin du dossier invalide"
-#: ../../Zotlabs/Module/Setup.php:301 ../../Zotlabs/Module/Setup.php:347
-msgid "Site administrator email address"
-msgstr "Adresse de courriel de l'administrateur du site"
+#: ../../Zotlabs/Module/Webpages.php:335
+msgid "No webpage elements detected."
+msgstr "Aucun élément de page Web détecté."
-#: ../../Zotlabs/Module/Setup.php:301 ../../Zotlabs/Module/Setup.php:347
-msgid ""
-"Your account email address must match this in order to use the web admin "
-"panel."
-msgstr "Votre compte devra utiliser la même adresse de courriel pour pouvoir utiliser l'administration web."
+#: ../../Zotlabs/Module/Webpages.php:410
+msgid "Import complete."
+msgstr "Importation terminée"
-#: ../../Zotlabs/Module/Setup.php:302 ../../Zotlabs/Module/Setup.php:349
-msgid "Website URL"
-msgstr "URL du site web"
+#: ../../Zotlabs/Module/Editpost.php:35
+msgid "Item is not editable"
+msgstr "Elément non modifiable"
-#: ../../Zotlabs/Module/Setup.php:302 ../../Zotlabs/Module/Setup.php:349
-msgid "Please use SSL (https) URL if available."
-msgstr "Veuillez utiliser SSL/TLS (https) si disponible."
+#: ../../Zotlabs/Module/Editpost.php:108 ../../Zotlabs/Module/Rpost.php:138
+msgid "Edit post"
+msgstr "Modifier la publication"
-#: ../../Zotlabs/Module/Setup.php:303 ../../Zotlabs/Module/Setup.php:353
-msgid "Please select a default timezone for your website"
-msgstr "Veuillez choisir un fuseau horaire par défaut pour votre site"
+#: ../../Zotlabs/Module/Dreport.php:45
+msgid "Invalid message"
+msgstr "Message non valide"
-#: ../../Zotlabs/Module/Setup.php:336
-msgid "Site settings"
-msgstr "Paramètres du site"
+#: ../../Zotlabs/Module/Dreport.php:78
+msgid "no results"
+msgstr "aucun résultat"
-#: ../../Zotlabs/Module/Setup.php:392
-msgid "PHP version 5.5 or greater is required."
-msgstr "PHP version 5.5 ou supérieur est requis"
+#: ../../Zotlabs/Module/Dreport.php:93
+msgid "channel sync processed"
+msgstr "Synchro de canal effectuée"
-#: ../../Zotlabs/Module/Setup.php:393
-msgid "PHP version"
-msgstr "Version de PHP"
+#: ../../Zotlabs/Module/Dreport.php:97
+msgid "queued"
+msgstr "mis dans la file d'attente"
-#: ../../Zotlabs/Module/Setup.php:409
-msgid "Could not find a command line version of PHP in the web server PATH."
-msgstr "Impossible de trouver une version CLI de PHP dans le PATH du serveur web."
+#: ../../Zotlabs/Module/Dreport.php:101
+msgid "posted"
+msgstr "publié"
-#: ../../Zotlabs/Module/Setup.php:410
-msgid ""
-"If you don't have a command line version of PHP installed on server, you "
-"will not be able to run background polling via cron."
-msgstr "En l'absence de version CLI de PHP sur votre serveur, vous ne pourrez pas utiliser la synchronisation en arrière-plan via cron."
+#: ../../Zotlabs/Module/Dreport.php:105
+msgid "accepted for delivery"
+msgstr "accepté pour la distribution"
-#: ../../Zotlabs/Module/Setup.php:414
-msgid "PHP executable path"
-msgstr "Chemin vers l'éxecutable PHP"
+#: ../../Zotlabs/Module/Dreport.php:109
+msgid "updated"
+msgstr "mis à jour"
-#: ../../Zotlabs/Module/Setup.php:414
-msgid ""
-"Enter full path to php executable. You can leave this blank to continue the "
-"installation."
-msgstr "Entrez le chemin complet vers l'exécutable php. Vous pouvez continuer l'installation sans."
+#: ../../Zotlabs/Module/Dreport.php:112
+msgid "update ignored"
+msgstr "mise à jour ignorée"
-#: ../../Zotlabs/Module/Setup.php:419
-msgid "Command line PHP"
-msgstr "PHP en ligne de commande (CLI)"
+#: ../../Zotlabs/Module/Dreport.php:115
+msgid "permission denied"
+msgstr "permission refusée"
-#: ../../Zotlabs/Module/Setup.php:429
-msgid ""
-"Unable to check command line PHP, as shell_exec() is disabled. This is "
-"required."
-msgstr "Impossible de vérifier la ligne de commande PHP, car shell_exec () est désactivé. Ceci est nécessaire."
+#: ../../Zotlabs/Module/Dreport.php:119
+msgid "recipient not found"
+msgstr "destinataire introuvable"
-#: ../../Zotlabs/Module/Setup.php:432
-msgid ""
-"The command line version of PHP on your system does not have "
-"\"register_argc_argv\" enabled."
-msgstr "La version CLI de PHP sur votre système n'a pas l'option \"register_argc_argv\" activée."
+#: ../../Zotlabs/Module/Dreport.php:122
+msgid "mail recalled"
+msgstr "courriel rappelé"
-#: ../../Zotlabs/Module/Setup.php:433
-msgid "This is required for message delivery to work."
-msgstr "Elle est nécessaire pour la distribution des messages."
+#: ../../Zotlabs/Module/Dreport.php:125
+msgid "duplicate mail received"
+msgstr "courriel reçu en double"
-#: ../../Zotlabs/Module/Setup.php:436
-msgid "PHP register_argc_argv"
-msgstr "PHP register_argc_argv"
+#: ../../Zotlabs/Module/Dreport.php:128
+msgid "mail delivered"
+msgstr "courriel distribué"
-#: ../../Zotlabs/Module/Setup.php:454
+#: ../../Zotlabs/Module/Dreport.php:148
#, php-format
-msgid ""
-"Your max allowed total upload size is set to %s. Maximum size of one file to"
-" upload is set to %s. You are allowed to upload up to %d files at once."
-msgstr "Votre taille de téléversement maximale totale autorisée est fixée à %s. La taille maximale d'un seul fichier à téléverser est fixée à %s. Vous pouvez téléverser jusqu'à %d fichier(s) à la fois."
-
-#: ../../Zotlabs/Module/Setup.php:459
-msgid "You can adjust these settings in the server php.ini file."
-msgstr "Vous pouvez ajuster ces paramètres dans le fichier php.ini du serveur."
-
-#: ../../Zotlabs/Module/Setup.php:461
-msgid "PHP upload limits"
-msgstr "Limites de téléversement de PHP"
-
-#: ../../Zotlabs/Module/Setup.php:484
-msgid ""
-"Error: the \"openssl_pkey_new\" function on this system is not able to "
-"generate encryption keys"
-msgstr "Erreur&nbsp;: la fonction \"openssl_pkey_new\" de ce système n'est pas capable de générer des clefs de chiffrement"
-
-#: ../../Zotlabs/Module/Setup.php:485
-msgid ""
-"If running under Windows, please see "
-"\"http://www.php.net/manual/en/openssl.installation.php\"."
-msgstr "Si vous êtes sur un serveur Windows, merci de consulter \"http://www.php.net/manual/fr/openssl.installation.php\"."
-
-#: ../../Zotlabs/Module/Setup.php:488
-msgid "Generate encryption keys"
-msgstr "Générer les clefs de chiffrement"
+msgid "Delivery report for %1$s"
+msgstr "Rapport de distribution pour %1$s"
-#: ../../Zotlabs/Module/Setup.php:505
-msgid "libCurl PHP module"
-msgstr "module PHP libCurl"
+#: ../../Zotlabs/Module/Dreport.php:151
+msgid "Options"
+msgstr "Options"
-#: ../../Zotlabs/Module/Setup.php:506
-msgid "GD graphics PHP module"
-msgstr "module PHP GD graphics"
+#: ../../Zotlabs/Module/Dreport.php:152
+msgid "Redeliver"
+msgstr "Transférer à nouveau"
-#: ../../Zotlabs/Module/Setup.php:507
-msgid "OpenSSL PHP module"
-msgstr "module PHP OpenSSL"
+#: ../../Zotlabs/Module/Sources.php:37
+msgid "Failed to create source. No channel selected."
+msgstr "Impossible de créer la source. Aucun canal selectionné."
-#: ../../Zotlabs/Module/Setup.php:508
-msgid "PDO database PHP module"
-msgstr "module PDO de la base de données PHP"
+#: ../../Zotlabs/Module/Sources.php:51
+msgid "Source created."
+msgstr "Source créée."
-#: ../../Zotlabs/Module/Setup.php:509
-msgid "mb_string PHP module"
-msgstr "module PHP mb_string"
+#: ../../Zotlabs/Module/Sources.php:64
+msgid "Source updated."
+msgstr "Source mise à jour."
-#: ../../Zotlabs/Module/Setup.php:510
-msgid "xml PHP module"
-msgstr "module PHP xml"
+#: ../../Zotlabs/Module/Sources.php:90
+msgid "*"
+msgstr "*"
-#: ../../Zotlabs/Module/Setup.php:514 ../../Zotlabs/Module/Setup.php:516
-msgid "Apache mod_rewrite module"
-msgstr "module Apache mod_rewrite"
+#: ../../Zotlabs/Module/Sources.php:96
+#: ../../Zotlabs/Widget/Settings_menu.php:123 ../../include/features.php:213
+msgid "Channel Sources"
+msgstr "Sources du canal"
-#: ../../Zotlabs/Module/Setup.php:514
-msgid ""
-"Error: Apache webserver mod-rewrite module is required but not installed."
-msgstr "Erreur&nbsp;: le module mod-rewrite du serveur web Apache est requis, mais pas installé."
+#: ../../Zotlabs/Module/Sources.php:97
+msgid "Manage remote sources of content for your channel."
+msgstr "Gérer les sources distantes de contenu pour votre canal."
-#: ../../Zotlabs/Module/Setup.php:520 ../../Zotlabs/Module/Setup.php:523
-msgid "exec"
-msgstr "exécuter"
+#: ../../Zotlabs/Module/Sources.php:98 ../../Zotlabs/Module/Sources.php:108
+msgid "New Source"
+msgstr "Nouvelle source"
-#: ../../Zotlabs/Module/Setup.php:520
+#: ../../Zotlabs/Module/Sources.php:109 ../../Zotlabs/Module/Sources.php:143
msgid ""
-"Error: exec is required but is either not installed or has been disabled in "
-"php.ini"
-msgstr "Erreur: exec est requis mais soit il n'est pas installé, soit il a été désactivé dans php.ini"
+"Import all or selected content from the following channel into this channel "
+"and distribute it according to your channel settings."
+msgstr "Importer le contenu sélectionné ou tout le contenu du canal suivant vers ce canal et le distribuer selon vos paramètres de canal."
-#: ../../Zotlabs/Module/Setup.php:526 ../../Zotlabs/Module/Setup.php:529
-msgid "shell_exec"
-msgstr "shell_exec"
+#: ../../Zotlabs/Module/Sources.php:110 ../../Zotlabs/Module/Sources.php:144
+msgid "Only import content with these words (one per line)"
+msgstr "N'importer le contenu que s'il contient ces mots (un par ligne)"
-#: ../../Zotlabs/Module/Setup.php:526
-msgid ""
-"Error: shell_exec is required but is either not installed or has been "
-"disabled in php.ini"
-msgstr "Erreur: shell_exec est requis mais soit il n'est pas installé, soit il a été désactivé dans php.ini"
+#: ../../Zotlabs/Module/Sources.php:110 ../../Zotlabs/Module/Sources.php:144
+msgid "Leave blank to import all public content"
+msgstr "Laissez vide pour importer tout le contenu public"
-#: ../../Zotlabs/Module/Setup.php:534
-msgid "Error: libCURL PHP module required but not installed."
-msgstr "Erreur&nbsp;: le module libCURL de PHP est requis, mais pas installé."
+#: ../../Zotlabs/Module/Sources.php:111 ../../Zotlabs/Module/Sources.php:148
+msgid "Channel Name"
+msgstr "Nom du canal"
-#: ../../Zotlabs/Module/Setup.php:538
+#: ../../Zotlabs/Module/Sources.php:112 ../../Zotlabs/Module/Sources.php:147
msgid ""
-"Error: GD graphics PHP module with JPEG support required but not installed."
-msgstr "Erreur&nbsp;: le module GD de PHP avec support JPEG est requis, mais pas installé."
+"Add the following categories to posts imported from this source (comma "
+"separated)"
+msgstr "Ajouter les catégories suivantes aux publications importées à partir de cette source (séparer par des virgules)"
-#: ../../Zotlabs/Module/Setup.php:542
-msgid "Error: openssl PHP module required but not installed."
-msgstr "Erreur&nbsp;: le module openssl de PHP est requis, mais pas installé."
+#: ../../Zotlabs/Module/Sources.php:133 ../../Zotlabs/Module/Sources.php:161
+msgid "Source not found."
+msgstr "Source introuvable."
-#: ../../Zotlabs/Module/Setup.php:546
-msgid "Error: PDO database PHP module required but not installed."
-msgstr "Erreur: le module PDO de base de données PHP est requis mais n'est pas installé."
+#: ../../Zotlabs/Module/Sources.php:140
+msgid "Edit Source"
+msgstr "Modifier la source"
-#: ../../Zotlabs/Module/Setup.php:550
-msgid "Error: mb_string PHP module required but not installed."
-msgstr "Erreur&nbsp;: le module mb_string de PHP est requis, mais pas installé."
+#: ../../Zotlabs/Module/Sources.php:141
+msgid "Delete Source"
+msgstr "Supprimer la source"
-#: ../../Zotlabs/Module/Setup.php:554
-msgid "Error: xml PHP module required for DAV but not installed."
-msgstr "Erreur&nbsp;: le module xml de PHP est requis pour le DAV, mais pas installé."
+#: ../../Zotlabs/Module/Sources.php:169
+msgid "Source removed"
+msgstr "Source supprimée"
-#: ../../Zotlabs/Module/Setup.php:572
-msgid ""
-"The web installer needs to be able to create a file called \".htconfig.php\""
-" in the top folder of your web server and it is unable to do so."
-msgstr "L'installeur web a besoin de créer un fichier \".htconfig.php\" à la racine de votre serveur web, mais en est incapable."
+#: ../../Zotlabs/Module/Sources.php:171
+msgid "Unable to remove source."
+msgstr "Impossible de supprimer la source."
-#: ../../Zotlabs/Module/Setup.php:573
-msgid ""
-"This is most often a permission setting, as the web server may not be able "
-"to write files in your folder - even if you can."
-msgstr "C'est généralement lié à un problème de droits, à cause duquel le serveur web est interdit d'écriture dans le répertoire concerné - alors que votre propre utilisateur a le droit."
+#: ../../Zotlabs/Module/Like.php:19
+msgid "Like/Dislike"
+msgstr "Aime/n'aime pas"
-#: ../../Zotlabs/Module/Setup.php:574
-msgid ""
-"At the end of this procedure, we will give you a text to save in a file "
-"named .htconfig.php in your Red top folder."
-msgstr "Au terme de cette procédure, nous vous transmettrons un texte à sauvegarder dans un fichier nommé .htconfig.php, à la racine de votre installation de $Projectname."
+#: ../../Zotlabs/Module/Like.php:24
+msgid "This action is restricted to members."
+msgstr "Cette action est réservée aux membres."
-#: ../../Zotlabs/Module/Setup.php:575
+#: ../../Zotlabs/Module/Like.php:25
msgid ""
-"You can alternatively skip this procedure and perform a manual installation."
-" Please see the file \"install/INSTALL.txt\" for instructions."
-msgstr "Autrement, vous pouvez contourner toute cette procédure et réaliser l'installation manuellement. Merci de consulter le fichier \"install/INSTALL.txt\" pour les instructions détaillées."
+"Please <a href=\"rmagic\">login with your $Projectname ID</a> or <a "
+"href=\"register\">register as a new $Projectname member</a> to continue."
+msgstr "S'il vous plait, <a href=\"rmagic\">identifiez vous avec votre identifant de $Projectname </a> ou <a href=\"register\">inscrivez vous comme nouveau membre de $Projectname </a> pour continuer."
-#: ../../Zotlabs/Module/Setup.php:578
-msgid ".htconfig.php is writable"
-msgstr "Le fichier .htconfig.php est accessible en écriture"
+#: ../../Zotlabs/Module/Like.php:105 ../../Zotlabs/Module/Like.php:131
+#: ../../Zotlabs/Module/Like.php:169
+msgid "Invalid request."
+msgstr "Requête invalide."
-#: ../../Zotlabs/Module/Setup.php:592
-msgid ""
-"This software uses the Smarty3 template engine to render its web views. "
-"Smarty3 compiles templates to PHP to speed up rendering."
-msgstr "Ce logiciel utilise Smarty3 comme moteur de modèles pour afficher ses vues Web. Smarty3 compile ses modèles en PHP pour accélérer le rendu."
+#: ../../Zotlabs/Module/Like.php:117 ../../include/conversation.php:122
+msgid "channel"
+msgstr "canal"
-#: ../../Zotlabs/Module/Setup.php:593
-#, php-format
-msgid ""
-"In order to store these compiled templates, the web server needs to have "
-"write access to the directory %s under the top level web folder."
-msgstr "Afin de stocker ces modèles compilés, le serveur Web doit disposer d'un accès en écriture au répertoire %s selon le dossier Web racine."
+#: ../../Zotlabs/Module/Like.php:146
+msgid "thing"
+msgstr "chose"
-#: ../../Zotlabs/Module/Setup.php:594 ../../Zotlabs/Module/Setup.php:615
-msgid ""
-"Please ensure that the user that your web server runs as (e.g. www-data) has"
-" write access to this folder."
-msgstr "Merci de vous assurer que l'utilisateur sous lequel le serveur web tourne (le plus souvent, www-data) a bien l'autorisation d'écrire dans ce répertoire."
+#: ../../Zotlabs/Module/Like.php:192
+msgid "Channel unavailable."
+msgstr "Canal indisponible."
-#: ../../Zotlabs/Module/Setup.php:595
-#, php-format
-msgid ""
-"Note: as a security measure, you should give the web server write access to "
-"%s only--not the template files (.tpl) that it contains."
-msgstr "Note: Comme mesure de sécurité, assurez vous de donner les droits d'écriture au serveur web sur %s uniquement, pas sur les fichiers individuels (.tpl) qu'il contient."
+#: ../../Zotlabs/Module/Like.php:240
+msgid "Previous action reversed."
+msgstr "Action précédente annulée."
-#: ../../Zotlabs/Module/Setup.php:598
+#: ../../Zotlabs/Module/Like.php:419 ../../addon/diaspora/inbound.php:1823
+#: ../../include/conversation.php:160
#, php-format
-msgid "%s is writable"
-msgstr "Permission d'écriture sur %s activée"
-
-#: ../../Zotlabs/Module/Setup.php:614
-msgid ""
-"This software uses the store directory to save uploaded files. The web "
-"server needs to have write access to the store directory under the top level"
-" web folder"
-msgstr "Ce logiciel utilise le répertoire de stockage pour enregistrer les fichiers téléversés. Le serveur Web doit disposer d'un accès en écriture au répertoire de stockage selon le dossier web racine."
-
-#: ../../Zotlabs/Module/Setup.php:618
-msgid "store is writable"
-msgstr "'store' est accessible en écriture"
-
-#: ../../Zotlabs/Module/Setup.php:651
-msgid ""
-"SSL certificate cannot be validated. Fix certificate or disable https access"
-" to this site."
-msgstr "Le certificat SSL/TLS n'a pas pu être validé. Merci de le corriger, ou de désactiver l'accès https à ce site (non recommandé)."
-
-#: ../../Zotlabs/Module/Setup.php:652
-msgid ""
-"If you have https access to your website or allow connections to TCP port "
-"443 (the https: port), you MUST use a browser-valid certificate. You MUST "
-"NOT use self-signed certificates!"
-msgstr "Si votre serveur accepte les connexions https ou s'il permet les connexions sur le port TCP 443 (le port utilisé par le protocole https), vous DEVEZ utiliser un certificat valide. Vous ne DEVEZ PAS utiliser un certificat que vous avez vous-mêmes signé&nbsp;!"
-
-#: ../../Zotlabs/Module/Setup.php:653
-msgid ""
-"This restriction is incorporated because public posts from you may for "
-"example contain references to images on your own hub."
-msgstr "Nous avons ajouté cette contrainte pour éviter que vos publications publiques ne fassent référence par exemple à des images sur votre propre hub."
-
-#: ../../Zotlabs/Module/Setup.php:654
-msgid ""
-"If your certificate is not recognized, members of other sites (who may "
-"themselves have valid certificates) will get a warning message on their own "
-"site complaining about security issues."
-msgstr "Si votre certificat n'est pas reconnu, les membres des autres sites (qui eux peuvent avoir des certificats valides) recevront des messages d'avertissement sur leur propre site se plaignant de problèmes de sécurité."
-
-#: ../../Zotlabs/Module/Setup.php:655
-msgid ""
-"This can cause usability issues elsewhere (not just on your own site) so we "
-"must insist on this requirement."
-msgstr "Ceci peut causer des problèmes d'ergonomie ailleurs (pas seulement sur votre site), nous devons donc insister sur ce prérequis."
-
-#: ../../Zotlabs/Module/Setup.php:656
-msgid ""
-"Providers are available that issue free certificates which are browser-"
-"valid."
-msgstr "Il existe des autorités de certification qui vous fourniront gratuitement un certificat valide."
-
-#: ../../Zotlabs/Module/Setup.php:658
-msgid ""
-"If you are confident that the certificate is valid and signed by a trusted "
-"authority, check to see if you have failed to install an intermediate cert. "
-"These are not normally required by browsers, but are required for server-to-"
-"server communications."
-msgstr "Si vous êtes certain que le certificat est valide et signé par une autorité de confiance, vérifiez si l'installation d'un certificat intermédiaire aurait échoué. Ceux-ci ne sont normalement pas requis par les navigateurs, mais ils sont requis pour les communications entre serveurs."
-
-#: ../../Zotlabs/Module/Setup.php:660
-msgid "SSL certificate validation"
-msgstr "Validation du certificat SSL/TLS"
-
-#: ../../Zotlabs/Module/Setup.php:666
-msgid ""
-"Url rewrite in .htaccess is not working. Check your server "
-"configuration.Test: "
-msgstr "La réécriture d'URL définie dans le .htaccess ne fonctionne pas. Vérifiez votre configuration serveur. Test&nbsp;:"
-
-#: ../../Zotlabs/Module/Setup.php:669
-msgid "Url rewrite is working"
-msgstr "La réécriture d'URL fonctionne"
-
-#: ../../Zotlabs/Module/Setup.php:683
-msgid ""
-"The database configuration file \".htconfig.php\" could not be written. "
-"Please use the enclosed text to create a configuration file in your web "
-"server root."
-msgstr "Le fichier de configuration de la base de données - \".htconfig.php\" - ne peut être écrit. Merci de copier le texte généré dans un fichier à ce nom, à la racine de votre serveur web."
-
-#: ../../Zotlabs/Module/Setup.php:707
-#: ../../extend/addon/addon/cdav/cdav.php:41
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:401
-msgid "Errors encountered creating database tables."
-msgstr "Erreurs rencontrées pendant la création de tables de BDD."
-
-#: ../../Zotlabs/Module/Setup.php:748
-msgid "<h1>What next</h1>"
-msgstr "<h1>Et maintenant</h1>"
-
-#: ../../Zotlabs/Module/Setup.php:749
-msgid ""
-"IMPORTANT: You will need to [manually] setup a scheduled task for the "
-"poller."
-msgstr "IMPORTANT&nbsp;: Vous devez créer [manuellement] une tâche planifiée pour les mises à jour du réseau."
-
-#: ../../Zotlabs/Module/Notifications.php:43 ../../include/nav.php:208
-msgid "Mark all system notifications seen"
-msgstr "Marquer toutes les notifications système comme vues"
-
-#: ../../Zotlabs/Module/Poke.php:168 ../../Zotlabs/Lib/Apps.php:235
-#: ../../include/conversation.php:942 ../../include/conversation.php:1109
-msgid "Poke"
-msgstr "Tapoter"
-
-#: ../../Zotlabs/Module/Poke.php:169
-msgid "Poke somebody"
-msgstr "Taquiner quelqu'un"
-
-#: ../../Zotlabs/Module/Poke.php:172
-msgid "Poke/Prod"
-msgstr "Tapoter/Encourager"
-
-#: ../../Zotlabs/Module/Poke.php:173
-msgid "Poke, prod or do other things to somebody"
-msgstr "Taquiner, pousser ou faire autre chose à quelqu'un"
-
-#: ../../Zotlabs/Module/Poke.php:180
-msgid "Recipient"
-msgstr "Destinataire"
-
-#: ../../Zotlabs/Module/Poke.php:181
-msgid "Choose what you wish to do to recipient"
-msgstr "Choisir ce que vous voulez faire au destinataire"
-
-#: ../../Zotlabs/Module/Poke.php:184 ../../Zotlabs/Module/Poke.php:185
-msgid "Make this post private"
-msgstr "Rendre cette publication privée"
-
-#: ../../Zotlabs/Module/Oexchange.php:27
-msgid "Unable to find your hub."
-msgstr "Impossible de trouver votre hub."
-
-#: ../../Zotlabs/Module/Oexchange.php:41
-msgid "Post successful."
-msgstr "Publication réussie."
-
-#: ../../Zotlabs/Module/Item.php:184
-msgid "Unable to locate original post."
-msgstr "Impossible de localiser la publication initiale."
-
-#: ../../Zotlabs/Module/Item.php:450
-msgid "Empty post discarded."
-msgstr "Publication vide annulée."
-
-#: ../../Zotlabs/Module/Item.php:492
-msgid "Executable content type not permitted to this channel."
-msgstr "Les contenus de type 'exécutable' ne sont pas autorisés sur ce canal."
-
-#: ../../Zotlabs/Module/Item.php:842
-msgid "Duplicate post suppressed."
-msgstr "Publication en doublon supprimée."
-
-#: ../../Zotlabs/Module/Item.php:984
-msgid "System error. Post not saved."
-msgstr "Erreur système. Publication non sauvegardée."
-
-#: ../../Zotlabs/Module/Item.php:1114
-msgid "Unable to obtain post information from database."
-msgstr "Impossible d'obtenir les informations de publication depuis la base de données."
+msgid "%1$s likes %2$s's %3$s"
+msgstr "%1$s aime %3$s de %2$s"
-#: ../../Zotlabs/Module/Item.php:1121
+#: ../../Zotlabs/Module/Like.php:421 ../../include/conversation.php:163
#, php-format
-msgid "You have reached your limit of %1$.0f top level posts."
-msgstr "Vous avez atteint votre limite de %1$.0f contributions \"racines\"."
+msgid "%1$s doesn't like %2$s's %3$s"
+msgstr "%1$s n'aime pas %3$s de %2$s"
-#: ../../Zotlabs/Module/Item.php:1128
+#: ../../Zotlabs/Module/Like.php:423
#, php-format
-msgid "You have reached your limit of %1$.0f webpages."
-msgstr "Vous avez atteint votre limite de %1$.0f pages web."
-
-#: ../../Zotlabs/Module/Pconfig.php:26 ../../Zotlabs/Module/Pconfig.php:59
-msgid "This setting requires special processing and editing has been blocked."
-msgstr "Ce paramètre nécessité un traitement spécial, les modifications ont été bloquées."
-
-#: ../../Zotlabs/Module/Pconfig.php:48
-msgid "Configuration Editor"
-msgstr "Editeur de configuration"
-
-#: ../../Zotlabs/Module/Pconfig.php:49
-msgid ""
-"Warning: Changing some settings could render your channel inoperable. Please"
-" leave this page unless you are comfortable with and knowledgeable about how"
-" to correctly use this feature."
-msgstr "Attention&nbsp;:modifier certains paramètres peut rendre votre canal inutilisable. Merci d'ignorer cette page à moins d'être suffisamment à l'aise de savoir comment utiliser correctement cette fonctionnalité."
-
-#: ../../Zotlabs/Module/Profile.php:78
-msgid "vcard"
-msgstr "vcard"
-
-#: ../../Zotlabs/Module/Blocks.php:154 ../../include/text.php:2283
-msgid "Blocks"
-msgstr "Blocs"
-
-#: ../../Zotlabs/Module/Blocks.php:156
-msgid "Block Title"
-msgstr "Titre du bloc"
-
-#: ../../Zotlabs/Module/Layouts.php:183 ../../include/text.php:2285
-msgid "Layouts"
-msgstr "Mises-en-page"
-
-#: ../../Zotlabs/Module/Layouts.php:185 ../../Zotlabs/Lib/Apps.php:232
-#: ../../include/nav.php:174 ../../include/help.php:53
-#: ../../include/help.php:59
-msgid "Help"
-msgstr "Aide"
-
-#: ../../Zotlabs/Module/Layouts.php:185
-msgid "Comanche page description language help"
-msgstr "Aide sur le langage de description de page Comanche"
-
-#: ../../Zotlabs/Module/Layouts.php:189
-msgid "Layout Description"
-msgstr "Description de la mise en page"
-
-#: ../../Zotlabs/Module/Layouts.php:194
-msgid "Download PDL file"
-msgstr "Télécharger le fichier PDL"
-
-#: ../../Zotlabs/Module/Rate.php:156
-msgid "Website:"
-msgstr "Site web&nbsp;:"
+msgid "%1$s agrees with %2$s's %3$s"
+msgstr "%1$s approuve %3$s de %2$s"
-#: ../../Zotlabs/Module/Rate.php:159
+#: ../../Zotlabs/Module/Like.php:425
#, php-format
-msgid "Remote Channel [%s] (not yet known on this site)"
-msgstr "Canal distant [%s] (encore inconnu sur ce site)"
-
-#: ../../Zotlabs/Module/Rate.php:160
-msgid "Rating (this information is public)"
-msgstr "Evaluation (cette information est publique)"
-
-#: ../../Zotlabs/Module/Rate.php:161
-msgid "Optionally explain your rating (this information is public)"
-msgstr "Explication facultative de votre évaluation (cette information est publique)"
-
-#: ../../Zotlabs/Module/Profile_photo.php:190
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:295
-msgid ""
-"Shift-reload the page or clear browser cache if the new photo does not "
-"display immediately."
-msgstr "Shift-rechargez votre page, ou videz le cache du navigateur si la photo ne s'affiche pas immédiatement."
-
-#: ../../Zotlabs/Module/Profile_photo.php:411
-msgid "Use Photo for Profile"
-msgstr "Utiliser la photo pour le profil"
-
-#: ../../Zotlabs/Module/Profile_photo.php:411
-msgid "Upload Profile Photo"
-msgstr "Téléverser une photo de profil"
-
-#: ../../Zotlabs/Module/Profile_photo.php:412
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:182
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:194
-msgid "Use"
-msgstr "Utiliser"
-
-#: ../../Zotlabs/Module/Events.php:25
-msgid "Calendar entries imported."
-msgstr "Entrées du calendrier importées."
-
-#: ../../Zotlabs/Module/Events.php:27
-msgid "No calendar entries found."
-msgstr "Aucune entrée du calendrier trouvée."
-
-#: ../../Zotlabs/Module/Events.php:110
-msgid "Event can not end before it has started."
-msgstr "La fin de l'événement ne peut être antérieure à son début."
-
-#: ../../Zotlabs/Module/Events.php:112 ../../Zotlabs/Module/Events.php:121
-#: ../../Zotlabs/Module/Events.php:143
-msgid "Unable to generate preview."
-msgstr "Impossible de générer l'aperçu."
-
-#: ../../Zotlabs/Module/Events.php:119
-msgid "Event title and start time are required."
-msgstr "Un titre et une date de début sont requises pour l'événement."
-
-#: ../../Zotlabs/Module/Events.php:141 ../../Zotlabs/Module/Events.php:265
-msgid "Event not found."
-msgstr "Événement introuvable."
-
-#: ../../Zotlabs/Module/Events.php:460
-msgid "Edit event title"
-msgstr "Modifier le titre de l'événement"
-
-#: ../../Zotlabs/Module/Events.php:460
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:835
-msgid "Event title"
-msgstr "Titre de l'événement"
-
-#: ../../Zotlabs/Module/Events.php:462
-msgid "Categories (comma-separated list)"
-msgstr "Catégories (séparées par des virgules)"
-
-#: ../../Zotlabs/Module/Events.php:463
-msgid "Edit Category"
-msgstr "Modifier la catégorie"
-
-#: ../../Zotlabs/Module/Events.php:463
-msgid "Category"
-msgstr "Catégorie"
-
-#: ../../Zotlabs/Module/Events.php:466
-msgid "Edit start date and time"
-msgstr "Modifier la date et l'heure de début"
-
-#: ../../Zotlabs/Module/Events.php:466
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:836
-msgid "Start date and time"
-msgstr "Date et heure de début"
-
-#: ../../Zotlabs/Module/Events.php:467 ../../Zotlabs/Module/Events.php:470
-msgid "Finish date and time are not known or not relevant"
-msgstr "Date et heure de fin inconnues ou sans objet"
-
-#: ../../Zotlabs/Module/Events.php:469
-msgid "Edit finish date and time"
-msgstr "Modifier la date et l'heure de fin"
-
-#: ../../Zotlabs/Module/Events.php:469
-msgid "Finish date and time"
-msgstr "Date et heure de fin"
-
-#: ../../Zotlabs/Module/Events.php:471 ../../Zotlabs/Module/Events.php:472
-msgid "Adjust for viewer timezone"
-msgstr "Ajuster au fuseau horaire du visiteur"
-
-#: ../../Zotlabs/Module/Events.php:471
-msgid ""
-"Important for events that happen in a particular place. Not practical for "
-"global holidays."
-msgstr "Important pour les événements se tenant en un lieu particulier. Pas pratique pour les vacances communes à de nombreux pays dans le monde."
-
-#: ../../Zotlabs/Module/Events.php:473
-msgid "Edit Description"
-msgstr "Modifier la description"
-
-#: ../../Zotlabs/Module/Events.php:475
-msgid "Edit Location"
-msgstr "Modifier l'emplacement"
-
-#: ../../Zotlabs/Module/Events.php:479 ../../include/conversation.php:1410
-msgid "Permission settings"
-msgstr "Gérer les autorisations"
-
-#: ../../Zotlabs/Module/Events.php:489
-msgid "Timezone:"
-msgstr "Fuseau horaire&nbsp;:"
-
-#: ../../Zotlabs/Module/Events.php:494
-msgid "Advanced Options"
-msgstr "Options avancées"
-
-#: ../../Zotlabs/Module/Events.php:633
-msgid "Edit event"
-msgstr "Modifier l'événement"
-
-#: ../../Zotlabs/Module/Events.php:635
-msgid "Delete event"
-msgstr "Supprimer l'événement"
-
-#: ../../Zotlabs/Module/Events.php:669
-msgid "calendar"
-msgstr "calendrier"
-
-#: ../../Zotlabs/Module/Events.php:695
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:849
-msgid "Month"
-msgstr "Mois"
-
-#: ../../Zotlabs/Module/Events.php:696
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:850
-msgid "Week"
-msgstr "Semaine"
-
-#: ../../Zotlabs/Module/Events.php:697
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:851
-msgid "Day"
-msgstr "Jour"
-
-#: ../../Zotlabs/Module/Events.php:731
-msgid "Event removed"
-msgstr "Événement supprimé"
-
-#: ../../Zotlabs/Module/Events.php:734
-msgid "Failed to remove event"
-msgstr "Impossible de supprimer l'événement"
-
-#: ../../Zotlabs/Module/Common.php:14
-msgid "No channel."
-msgstr "Pas de canal."
-
-#: ../../Zotlabs/Module/Common.php:43
-msgid "Common connections"
-msgstr "Contacts en commun"
-
-#: ../../Zotlabs/Module/Common.php:48
-msgid "No connections in common."
-msgstr "Pas de contacts en commun."
-
-#: ../../Zotlabs/Module/Chanview.php:134
-msgid "toggle full screen mode"
-msgstr "Basculer en mode plein écran."
-
-#: ../../Zotlabs/Module/Profperm.php:34 ../../Zotlabs/Module/Profperm.php:63
-msgid "Invalid profile identifier."
-msgstr "Identifiant de profil invalide."
-
-#: ../../Zotlabs/Module/Profperm.php:111
-msgid "Profile Visibility Editor"
-msgstr "Éditeur de visibilité de profil"
-
-#: ../../Zotlabs/Module/Profperm.php:113 ../../include/channel.php:1367
-msgid "Profile"
-msgstr "Profil"
-
-#: ../../Zotlabs/Module/Profperm.php:115
-msgid "Click on a contact to add or remove."
-msgstr "Cliquer sur un contact pour l'ajouter ou le retirer."
-
-#: ../../Zotlabs/Module/Profperm.php:124
-msgid "Visible To"
-msgstr "Visible par"
-
-#: ../../Zotlabs/Module/Channel.php:32 ../../Zotlabs/Module/Chat.php:25
-#: ../../extend/addon/addon/chess/chess.php:400
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:26
-msgid "You must be logged in to see this page."
-msgstr "Vous devez vous connecter pour voir cette page."
-
-#: ../../Zotlabs/Module/Channel.php:44
-msgid "Posts and comments"
-msgstr "Publications et commentaires"
-
-#: ../../Zotlabs/Module/Channel.php:45
-msgid "Only posts"
-msgstr "Seulement les publications"
-
-#: ../../Zotlabs/Module/Channel.php:104
-msgid "Insufficient permissions. Request redirected to profile page."
-msgstr "Permissions insuffisantes. Demande redirigée vers la page du profil."
-
-#: ../../Zotlabs/Module/Lostpass.php:19
-msgid "No valid account found."
-msgstr "Aucun compte valide trouvé."
-
-#: ../../Zotlabs/Module/Lostpass.php:33
-msgid "Password reset request issued. Check your email."
-msgstr "Demande de réinitialisation du mot de passe envoyée. Vérifiez vos courriels."
+msgid "%1$s doesn't agree with %2$s's %3$s"
+msgstr "%1$s n'est pas d'accord avec %3$s de %2$s"
-#: ../../Zotlabs/Module/Lostpass.php:39 ../../Zotlabs/Module/Lostpass.php:108
+#: ../../Zotlabs/Module/Like.php:427
#, php-format
-msgid "Site Member (%s)"
-msgstr "Membre du site (%s)"
+msgid "%1$s abstains from a decision on %2$s's %3$s"
+msgstr "%1$s s'abstient de toute décision sur le %3$s de %2$s"
-#: ../../Zotlabs/Module/Lostpass.php:44 ../../Zotlabs/Module/Lostpass.php:49
+#: ../../Zotlabs/Module/Like.php:429
#, php-format
-msgid "Password reset requested at %s"
-msgstr "Demande de réinitialisation du mot de passe sur %s"
-
-#: ../../Zotlabs/Module/Lostpass.php:68
-msgid ""
-"Request could not be verified. (You may have previously submitted it.) "
-"Password reset failed."
-msgstr "La demande n'a pas pu être vérifiée. (Peut-être l'avez vous déjà utilisée.) La réinitialisation a échoué."
-
-#: ../../Zotlabs/Module/Lostpass.php:91 ../../boot.php:1740
-msgid "Password Reset"
-msgstr "Réinitialiser le mot de passe"
-
-#: ../../Zotlabs/Module/Lostpass.php:92
-msgid "Your password has been reset as requested."
-msgstr "Votre mot de passe a bien été réinitialisé."
-
-#: ../../Zotlabs/Module/Lostpass.php:93
-msgid "Your new password is"
-msgstr "Votre nouveau mot de passe est"
-
-#: ../../Zotlabs/Module/Lostpass.php:94
-msgid "Save or copy your new password - and then"
-msgstr "Enregistrez ou copiez votre nouveau mot de passe, puis"
-
-#: ../../Zotlabs/Module/Lostpass.php:95
-msgid "click here to login"
-msgstr "cliquez ici pour vous connecter"
-
-#: ../../Zotlabs/Module/Lostpass.php:96
-msgid ""
-"Your password may be changed from the <em>Settings</em> page after "
-"successful login."
-msgstr "Votre mot de passe peut être changé depuis la page des <em>Paramètres</em> une fois connecté."
+msgid "%1$s is attending %2$s's %3$s"
+msgstr "%1$s participe à %3$s de %2$s"
-#: ../../Zotlabs/Module/Lostpass.php:117
+#: ../../Zotlabs/Module/Like.php:431
#, php-format
-msgid "Your password has changed at %s"
-msgstr "Votre mot de passe de %s a été changé"
-
-#: ../../Zotlabs/Module/Lostpass.php:130
-msgid "Forgot your Password?"
-msgstr "Mot de passe oublié&nbsp;?"
-
-#: ../../Zotlabs/Module/Lostpass.php:131
-msgid ""
-"Enter your email address and submit to have your password reset. Then check "
-"your email for further instructions."
-msgstr "Saisissez votre adresse de courriel, et validez, pour réinitialiser votre mot de passe. Vérifiez ensuite votre boîte aux lettres pour la suite des instructions."
-
-#: ../../Zotlabs/Module/Lostpass.php:132
-msgid "Email Address"
-msgstr "Adresse de courriel"
-
-#: ../../Zotlabs/Module/Lostpass.php:133
-msgid "Reset"
-msgstr "Réinitialiser"
-
-#: ../../Zotlabs/Module/Rbmark.php:94
-msgid "Select a bookmark folder"
-msgstr "Choisir un dossier de favoris"
-
-#: ../../Zotlabs/Module/Rbmark.php:99
-msgid "Save Bookmark"
-msgstr "Enregistrer le favori"
-
-#: ../../Zotlabs/Module/Rbmark.php:100
-msgid "URL of bookmark"
-msgstr "URL du favori"
-
-#: ../../Zotlabs/Module/Rbmark.php:105
-msgid "Or enter new bookmark folder name"
-msgstr "Ou entrez un nouveau nom de dossier de favoris"
-
-#: ../../Zotlabs/Module/Follow.php:31
-msgid "Channel added."
-msgstr "Canal ajouté."
-
-#: ../../Zotlabs/Module/Rmagic.php:35
-msgid "Authentication failed."
-msgstr "Échec de l'authentification."
-
-#: ../../Zotlabs/Module/Rmagic.php:75 ../../include/channel.php:1991
-msgid "Remote Authentication"
-msgstr "Authentification distante"
-
-#: ../../Zotlabs/Module/Rmagic.php:76 ../../include/channel.php:1992
-msgid "Enter your channel address (e.g. channel@example.com)"
-msgstr "Entrez l'adresse de votre canal (par ex. moncanal@monsite.com)"
-
-#: ../../Zotlabs/Module/Rmagic.php:77 ../../include/channel.php:1993
-msgid "Authenticate"
-msgstr "Authentifier"
-
-#: ../../Zotlabs/Module/Regmod.php:15
-msgid "Please login."
-msgstr "Merci de vous connecter."
-
-#: ../../Zotlabs/Module/Removeaccount.php:35
-msgid ""
-"Account removals are not allowed within 48 hours of changing the account "
-"password."
-msgstr "Il est impossible de supprimer un compte dans les 48 heures après avoir changé le mot de passe du compte."
-
-#: ../../Zotlabs/Module/Removeaccount.php:57
-msgid "Remove This Account"
-msgstr "Supprimer ce compte"
-
-#: ../../Zotlabs/Module/Removeaccount.php:58
-#: ../../Zotlabs/Module/Removeme.php:61
-msgid "WARNING: "
-msgstr "AVERTISSEMENT&nbsp;:"
-
-#: ../../Zotlabs/Module/Removeaccount.php:58
-msgid ""
-"This account and all its channels will be completely removed from the "
-"network. "
-msgstr "Ce compte et tous ses canaux seront entièrement supprimés du réseau."
-
-#: ../../Zotlabs/Module/Removeaccount.php:58
-#: ../../Zotlabs/Module/Removeme.php:61
-msgid "This action is permanent and can not be undone!"
-msgstr "Cette action est permanente et irréversible&nbsp;!"
-
-#: ../../Zotlabs/Module/Removeaccount.php:59
-#: ../../Zotlabs/Module/Removeme.php:62
-msgid "Please enter your password for verification:"
-msgstr "Merci de saisir votre mot de passe pour vérification&nbsp;:"
-
-#: ../../Zotlabs/Module/Removeaccount.php:60
-msgid ""
-"Remove this account, all its channels and all its channel clones from the "
-"network"
-msgstr "Supprimer du réseau ce compte, tous ses canaux et tous les clones de ses canaux."
-
-#: ../../Zotlabs/Module/Removeaccount.php:60
-msgid ""
-"By default only the instances of the channels located on this hub will be "
-"removed from the network"
-msgstr "Par défaut, seules les instances des canaux situés sur ce hub seront supprimées du réseau"
-
-#: ../../Zotlabs/Module/Removeaccount.php:61
-#: ../../Zotlabs/Module/Settings/Account.php:120
-msgid "Remove Account"
-msgstr "Supprimer le compte"
-
-#: ../../Zotlabs/Module/Pdledit.php:21
-msgid "Layout updated."
-msgstr "Mise en page mise à jour."
-
-#: ../../Zotlabs/Module/Pdledit.php:34 ../../Zotlabs/Module/Chat.php:218
-msgid "Feature disabled."
-msgstr "Fonctionnalité désactivée"
-
-#: ../../Zotlabs/Module/Pdledit.php:42 ../../Zotlabs/Module/Pdledit.php:69
-msgid "Edit System Page Description"
-msgstr "Modifier la description de la page du système"
-
-#: ../../Zotlabs/Module/Pdledit.php:64
-msgid "Layout not found."
-msgstr "Mise en page introuvable."
-
-#: ../../Zotlabs/Module/Pdledit.php:70
-msgid "Module Name:"
-msgstr "Nom du module&nbsp;:"
-
-#: ../../Zotlabs/Module/Pdledit.php:71
-msgid "Layout Help"
-msgstr "Aide à la mise en page"
-
-#: ../../Zotlabs/Module/Uexport.php:57 ../../Zotlabs/Module/Uexport.php:58
-msgid "Export Channel"
-msgstr "Exporter le canal"
-
-#: ../../Zotlabs/Module/Uexport.php:59
-msgid ""
-"Export your basic channel information to a file. This acts as a backup of "
-"your connections, permissions, profile and basic data, which can be used to "
-"import your data to a new server hub, but does not contain your content."
-msgstr "Exportez les principales informations de votre canal dans un fichier. Celui-ci pourra servir de sauvegarde de vos contacts, permissions, profils et données de base. Il pourra être importé sur un nouveau hub/serveur, mais n'embarquera pas vos contenus."
-
-#: ../../Zotlabs/Module/Uexport.php:60
-msgid "Export Content"
-msgstr "Exporter le contenu"
-
-#: ../../Zotlabs/Module/Uexport.php:61
-msgid ""
-"Export your channel information and recent content to a JSON backup that can"
-" be restored or imported to another server hub. This backs up all of your "
-"connections, permissions, profile data and several months of posts. This "
-"file may be VERY large. Please be patient - it may take several minutes for"
-" this download to begin."
-msgstr "Exportez les informations du canal et les contenus récents dans un fichier JSON. Celui-ci contiendra toutes vos relations, permissions, profils, et plusieurs mois de publications. Ce fichier peut être TRÈS gros. Armez-vous de patience - plusieurs minutes peuvent s'écouler avant que le téléchargement ne commence."
-
-#: ../../Zotlabs/Module/Uexport.php:63
-msgid "Export your posts from a given year."
-msgstr "Exporter vos publications d'une année en particulier"
-
-#: ../../Zotlabs/Module/Uexport.php:65
-msgid ""
-"You may also export your posts and conversations for a particular year or "
-"month. Adjust the date in your browser location bar to select other dates. "
-"If the export fails (possibly due to memory exhaustion on your server hub), "
-"please try again selecting a more limited date range."
-msgstr "Vous pouvez également exporter vos publications et conversations pour une année ou un mois particulier. Ajustez la date dans la barre de votre navigateur pour sélectionner d'autres dates. Si l'export échoue (possible en cas de pénurie de mémoire sur le serveur de votre hub), essayez à nouveau en sélectionnant un intervalle de dates plus petit."
+msgid "%1$s is not attending %2$s's %3$s"
+msgstr "%1$s ne participe pas à %3$s de %2$s"
-#: ../../Zotlabs/Module/Uexport.php:66
+#: ../../Zotlabs/Module/Like.php:433
#, php-format
-msgid ""
-"To select all posts for a given year, such as this year, visit <a "
-"href=\"%1$s\">%2$s</a>"
-msgstr "Pour sélectionner toutes les publications pour une année donnée, telle que cette année, visitez <a href=\"%1$s\">%2$s</a>"
+msgid "%1$s may attend %2$s's %3$s"
+msgstr "%1$s participe peut-être à %3$s de %2$s"
-#: ../../Zotlabs/Module/Uexport.php:67
-#, php-format
-msgid ""
-"To select all posts for a given month, such as January of this year, visit "
-"<a href=\"%1$s\">%2$s</a>"
-msgstr "Pour sélectionner toutes les publications pour un mois donné, par exemple janvier, visitez <a href=\"%1$s\">%2$s</a>"
+#: ../../Zotlabs/Module/Like.php:538
+msgid "Action completed."
+msgstr "Action terminée."
-#: ../../Zotlabs/Module/Uexport.php:68
-#, php-format
-msgid ""
-"These content files may be imported or restored by visiting <a "
-"href=\"%1$s\">%2$s</a> on any site containing your channel. For best results"
-" please import or restore these in date order (oldest first)."
-msgstr "Ces fichiers de contenu peuvent être importés ou restaurés en visitant <a href=\"%1$s\">%2$s</a> sur n'importe quel site hébergeant votre canal. Pour de meilleurs résultats merci de les importer par ordre chronologique (les plus anciens d'abord)."
+#: ../../Zotlabs/Module/Like.php:539
+msgid "Thank you."
+msgstr "Merci."
-#: ../../Zotlabs/Module/Directory.php:246
+#: ../../Zotlabs/Module/Directory.php:245
#, php-format
msgid "%d rating"
msgid_plural "%d ratings"
msgstr[0] "%d évaluation"
msgstr[1] "%d évaluations"
-#: ../../Zotlabs/Module/Directory.php:257
+#: ../../Zotlabs/Module/Directory.php:256
msgid "Gender: "
msgstr "Sexe/genre&nbsp;:"
-#: ../../Zotlabs/Module/Directory.php:259
+#: ../../Zotlabs/Module/Directory.php:258
msgid "Status: "
msgstr "État&nbsp;:"
-#: ../../Zotlabs/Module/Directory.php:261
+#: ../../Zotlabs/Module/Directory.php:260
msgid "Homepage: "
msgstr "Site web&nbsp;:"
-#: ../../Zotlabs/Module/Directory.php:310 ../../include/channel.php:1298
+#: ../../Zotlabs/Module/Directory.php:309 ../../include/channel.php:1291
msgid "Age:"
msgstr "Age&nbsp;:"
-#: ../../Zotlabs/Module/Directory.php:315 ../../include/markdown.php:561
-#: ../../include/channel.php:1134 ../../include/event.php:52
+#: ../../Zotlabs/Module/Directory.php:314 ../../include/markdown.php:560
+#: ../../include/channel.php:1132 ../../include/event.php:52
#: ../../include/event.php:84
msgid "Location:"
msgstr "Emplacement&nbsp;:"
-#: ../../Zotlabs/Module/Directory.php:321
+#: ../../Zotlabs/Module/Directory.php:320
msgid "Description:"
msgstr "Description&nbsp;:"
-#: ../../Zotlabs/Module/Directory.php:326 ../../include/channel.php:1314
+#: ../../Zotlabs/Module/Directory.php:325 ../../include/channel.php:1307
msgid "Hometown:"
msgstr "Ville natale&nbsp;:"
-#: ../../Zotlabs/Module/Directory.php:328 ../../include/channel.php:1322
+#: ../../Zotlabs/Module/Directory.php:327 ../../include/channel.php:1315
msgid "About:"
msgstr "À propos&nbsp;:"
-#: ../../Zotlabs/Module/Directory.php:329 ../../Zotlabs/Module/Suggest.php:56
-#: ../../include/connections.php:110 ../../include/conversation.php:938
-#: ../../include/conversation.php:1069 ../../include/widgets.php:148
-#: ../../include/widgets.php:185 ../../include/channel.php:1119
+#: ../../Zotlabs/Module/Directory.php:328 ../../Zotlabs/Module/Suggest.php:54
+#: ../../Zotlabs/Widget/Follow.php:32 ../../Zotlabs/Widget/Suggestions.php:44
+#: ../../include/conversation.php:1002 ../../include/channel.php:1117
+#: ../../include/connections.php:110
msgid "Connect"
msgstr "Ajouter/Suivre"
-#: ../../Zotlabs/Module/Directory.php:330
+#: ../../Zotlabs/Module/Directory.php:329
msgid "Public Forum:"
msgstr "Forum public&nbsp;:"
-#: ../../Zotlabs/Module/Directory.php:333
+#: ../../Zotlabs/Module/Directory.php:332
msgid "Keywords: "
msgstr "Mots-clefs&nbsp;:"
-#: ../../Zotlabs/Module/Directory.php:336
+#: ../../Zotlabs/Module/Directory.php:335
msgid "Don't suggest"
msgstr "Ne pas suggérer"
-#: ../../Zotlabs/Module/Directory.php:338
+#: ../../Zotlabs/Module/Directory.php:337
msgid "Common connections:"
msgstr "Contacts en commun&nbsp;:"
-#: ../../Zotlabs/Module/Directory.php:387
+#: ../../Zotlabs/Module/Directory.php:386
msgid "Global Directory"
msgstr "Annuaire global"
-#: ../../Zotlabs/Module/Directory.php:387
+#: ../../Zotlabs/Module/Directory.php:386
msgid "Local Directory"
msgstr "Annuaire local"
-#: ../../Zotlabs/Module/Directory.php:393
+#: ../../Zotlabs/Module/Directory.php:392
msgid "Finding:"
msgstr "Recherche&nbsp;:"
-#: ../../Zotlabs/Module/Directory.php:396 ../../Zotlabs/Module/Suggest.php:64
+#: ../../Zotlabs/Module/Directory.php:395 ../../Zotlabs/Module/Suggest.php:62
#: ../../include/contact_widgets.php:24
msgid "Channel Suggestions"
msgstr "Canaux suggérés"
-#: ../../Zotlabs/Module/Directory.php:398
+#: ../../Zotlabs/Module/Directory.php:397
msgid "next page"
msgstr "page suivante"
-#: ../../Zotlabs/Module/Directory.php:398
+#: ../../Zotlabs/Module/Directory.php:397
msgid "previous page"
msgstr "page précédente"
-#: ../../Zotlabs/Module/Directory.php:399
+#: ../../Zotlabs/Module/Directory.php:398
msgid "Sort options"
msgstr "Options de tri"
-#: ../../Zotlabs/Module/Directory.php:400
+#: ../../Zotlabs/Module/Directory.php:399
msgid "Alphabetic"
msgstr "Alphabétique"
-#: ../../Zotlabs/Module/Directory.php:401
+#: ../../Zotlabs/Module/Directory.php:400
msgid "Reverse Alphabetic"
msgstr "Alphabétique inversé"
-#: ../../Zotlabs/Module/Directory.php:402
+#: ../../Zotlabs/Module/Directory.php:401
msgid "Newest to Oldest"
msgstr "Du plus récent au moins récent"
-#: ../../Zotlabs/Module/Directory.php:403
+#: ../../Zotlabs/Module/Directory.php:402
msgid "Oldest to Newest"
msgstr "Du moins récent du plus récent"
-#: ../../Zotlabs/Module/Directory.php:420
+#: ../../Zotlabs/Module/Directory.php:419
msgid "No entries (some entries may be hidden)."
msgstr "Pas d'entrées (certaines peuvent être cachées)."
-#: ../../Zotlabs/Module/Chatsvc.php:131
-msgid "Away"
-msgstr "Absent"
-
-#: ../../Zotlabs/Module/Chatsvc.php:136
-msgid "Online"
-msgstr "En ligne"
-
-#: ../../Zotlabs/Module/Service_limits.php:23
-msgid "No service class restrictions found."
-msgstr "Aucune restriction de classe de service trouvée."
-
-#: ../../Zotlabs/Module/Webpages.php:52
-msgid "Import Webpage Elements"
-msgstr "Importer éléments de page web"
-
-#: ../../Zotlabs/Module/Webpages.php:53
-msgid "Import selected"
-msgstr "Importation sélectionnée"
-
-#: ../../Zotlabs/Module/Webpages.php:76
-msgid "Export Webpage Elements"
-msgstr "Exporter éléments de pages web"
-
-#: ../../Zotlabs/Module/Webpages.php:77
-msgid "Export selected"
-msgstr "Export sélectionné"
-
-#: ../../Zotlabs/Module/Webpages.php:241 ../../Zotlabs/Lib/Apps.php:225
-#: ../../include/conversation.php:1889
-msgid "Webpages"
-msgstr "Pages web"
-
-#: ../../Zotlabs/Module/Webpages.php:252 ../../include/page_widgets.php:44
-msgid "Actions"
-msgstr "Actions"
-
-#: ../../Zotlabs/Module/Webpages.php:253 ../../include/page_widgets.php:45
-msgid "Page Link"
-msgstr "Lien vers la page"
-
-#: ../../Zotlabs/Module/Webpages.php:254
-msgid "Page Title"
-msgstr "Titre de la page"
-
-#: ../../Zotlabs/Module/Webpages.php:284
-msgid "Invalid file type."
-msgstr "Type de fichier invalide"
-
-#: ../../Zotlabs/Module/Webpages.php:296
-msgid "Error opening zip file"
-msgstr "Erreur lors de l'ouverture du fichier zip"
-
-#: ../../Zotlabs/Module/Webpages.php:307
-msgid "Invalid folder path."
-msgstr "Chemin du dossier invalide"
-
-#: ../../Zotlabs/Module/Webpages.php:334
-msgid "No webpage elements detected."
-msgstr "Aucun élément de page Web détecté."
-
-#: ../../Zotlabs/Module/Webpages.php:409
-msgid "Import complete."
-msgstr "Importation terminée"
-
-#: ../../Zotlabs/Module/Removeme.php:35
-msgid ""
-"Channel removals are not allowed within 48 hours of changing the account "
-"password."
-msgstr "Il est impossible de supprimer un canal moins de 48 heures après avoir changé le mot de passe d'un compte."
-
-#: ../../Zotlabs/Module/Removeme.php:60
-msgid "Remove This Channel"
-msgstr "Supprimer ce canal"
-
-#: ../../Zotlabs/Module/Removeme.php:61
-msgid "This channel will be completely removed from the network. "
-msgstr "Ce canal sera complètement supprimé du réseau."
-
-#: ../../Zotlabs/Module/Removeme.php:63
-msgid "Remove this channel and all its clones from the network"
-msgstr "Supprimer ce canal ainsi que tous ses clones sur le réseau"
-
-#: ../../Zotlabs/Module/Removeme.php:63
-msgid ""
-"By default only the instance of the channel located on this hub will be "
-"removed from the network"
-msgstr "Par défaut, seule l'instance du canal présente sur ce hub sera supprimée du réseau"
-
-#: ../../Zotlabs/Module/Removeme.php:64
-#: ../../Zotlabs/Module/Settings/Channel.php:575
-msgid "Remove Channel"
-msgstr "Supprimer le canal"
-
-#: ../../Zotlabs/Module/Sharedwithme.php:98
-msgid "Files: shared with me"
-msgstr "Fichiers&nbsp;: partagés avec moi"
-
-#: ../../Zotlabs/Module/Sharedwithme.php:100
-msgid "NEW"
-msgstr "NOUVEAU"
-
-#: ../../Zotlabs/Module/Sharedwithme.php:103
-msgid "Remove all files"
-msgstr "Supprimer tous les fichiers"
-
-#: ../../Zotlabs/Module/Sharedwithme.php:104
-msgid "Remove this file"
-msgstr "Supprimer ce fichier"
-
-#: ../../Zotlabs/Module/Wiki.php:29
-msgid "Profile Unavailable."
-msgstr "Profil non disponible."
-
-#: ../../Zotlabs/Module/Wiki.php:43
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:40
-msgid "Not found"
-msgstr "Non trouvé"
-
-#: ../../Zotlabs/Module/Wiki.php:67
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:60
-msgid "Invalid channel"
-msgstr "Canal invalide."
-
-#: ../../Zotlabs/Module/Wiki.php:158
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:144
-#: ../../include/conversation.php:1900
-msgid "Wikis"
-msgstr "Wikis"
-
-#: ../../Zotlabs/Module/Wiki.php:164
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:150
-msgid "Download"
-msgstr "Téléchargement"
-
-#: ../../Zotlabs/Module/Wiki.php:168
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:154
-msgid "Wiki name"
-msgstr "Nom du wiki"
-
-#: ../../Zotlabs/Module/Wiki.php:169
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:155
-msgid "Content type"
-msgstr "Type de contenu"
-
-#: ../../Zotlabs/Module/Wiki.php:178
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:164
-msgid "Create a status post for this wiki"
-msgstr "Créer un statut de publication pour ce wiki"
-
-#: ../../Zotlabs/Module/Wiki.php:203
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:183
-msgid "Wiki not found"
-msgstr "Wiki introuvable"
-
-#: ../../Zotlabs/Module/Wiki.php:227
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:208
-msgid "Rename page"
-msgstr "Renommer la page"
-
-#: ../../Zotlabs/Module/Wiki.php:231
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:212
-msgid "Error retrieving page content"
-msgstr "Erreur lors de la récupération du contenu de la page"
-
-#: ../../Zotlabs/Module/Wiki.php:261
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:241
-msgid "Revision Comparison"
-msgstr "Comparaison des révisions"
-
-#: ../../Zotlabs/Module/Wiki.php:262
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:242
-msgid "Revert"
-msgstr "Revenir"
-
-#: ../../Zotlabs/Module/Wiki.php:266
-msgid "Short description of your changes (optional)"
-msgstr "Description courte de vos modifications (optionnel)"
-
-#: ../../Zotlabs/Module/Wiki.php:273
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:251
-msgid "Source"
-msgstr "Source"
-
-#: ../../Zotlabs/Module/Wiki.php:281
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:259
-msgid "New page name"
-msgstr "Nouveau nom de la page"
-
-#: ../../Zotlabs/Module/Wiki.php:286
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:264
-#: ../../include/conversation.php:1299
-msgid "Embed image from photo albums"
-msgstr "Intégrer une image d'un album photo"
-
-#: ../../Zotlabs/Module/Wiki.php:287
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:265
-#: ../../include/conversation.php:1393
-msgid "Embed an image from your albums"
-msgstr "Intégrer une image de votre album photo"
-
-#: ../../Zotlabs/Module/Wiki.php:289
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:267
-#: ../../include/conversation.php:1395 ../../include/conversation.php:1442
-msgid "OK"
-msgstr "OK"
-
-#: ../../Zotlabs/Module/Wiki.php:290
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:268
-#: ../../include/conversation.php:1335
-msgid "Choose images to embed"
-msgstr "Choisissez des images à intégrer"
-
-#: ../../Zotlabs/Module/Wiki.php:291
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:269
-#: ../../include/conversation.php:1336
-msgid "Choose an album"
-msgstr "Choisir un album"
-
-#: ../../Zotlabs/Module/Wiki.php:292
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:270
-msgid "Choose a different album"
-msgstr "Choisissez un autre album"
-
-#: ../../Zotlabs/Module/Wiki.php:293
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:271
-#: ../../include/conversation.php:1338
-msgid "Error getting album list"
-msgstr "Erreur venant de la liste de l'album"
-
-#: ../../Zotlabs/Module/Wiki.php:294
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:272
-#: ../../include/conversation.php:1339
-msgid "Error getting photo link"
-msgstr "Erreur provenant du lien de la photo"
-
-#: ../../Zotlabs/Module/Wiki.php:295
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:273
-#: ../../include/conversation.php:1340
-msgid "Error getting album"
-msgstr "Erreur venant de l'album"
-
-#: ../../Zotlabs/Module/Wiki.php:364
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:337
-msgid "Error creating wiki. Invalid name."
-msgstr "Erreur lors de la création du wiki. Nom invalide."
-
-#: ../../Zotlabs/Module/Wiki.php:376
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:348
-msgid "Wiki created, but error creating Home page."
-msgstr "Le wiki a été créé, mais une erreur est survenue lors de la création de sa page d'accueil."
-
-#: ../../Zotlabs/Module/Wiki.php:383
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:353
-msgid "Error creating wiki"
-msgstr "Erreur lors de la création du wiki."
-
-#: ../../Zotlabs/Module/Wiki.php:395
-msgid "Wiki delete permission denied."
-msgstr "Permission de supprimer le wiki refusée."
-
-#: ../../Zotlabs/Module/Wiki.php:405
-msgid "Error deleting wiki"
-msgstr "Erreur durant la suppression du wiki"
-
-#: ../../Zotlabs/Module/Wiki.php:431
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:400
-msgid "New page created"
-msgstr "Nouvelle page créée"
-
-#: ../../Zotlabs/Module/Wiki.php:546
-msgid "Cannot delete Home"
-msgstr "Impossible de supprimer la racine"
-
-#: ../../Zotlabs/Module/Wiki.php:610
-msgid "Current Revision"
-msgstr "Version actuelle"
-
-#: ../../Zotlabs/Module/Wiki.php:610
-msgid "Selected Revision"
-msgstr "Version sélectionnée"
-
-#: ../../Zotlabs/Module/Wiki.php:660
-msgid "You must be authenticated."
-msgstr "Vous devez être connecté."
-
-#: ../../Zotlabs/Module/Sources.php:37
-msgid "Failed to create source. No channel selected."
-msgstr "Impossible de créer la source. Aucun canal selectionné."
-
-#: ../../Zotlabs/Module/Sources.php:51
-msgid "Source created."
-msgstr "Source créée."
-
-#: ../../Zotlabs/Module/Sources.php:64
-msgid "Source updated."
-msgstr "Source mise à jour."
-
-#: ../../Zotlabs/Module/Sources.php:90
-msgid "*"
-msgstr "*"
-
-#: ../../Zotlabs/Module/Sources.php:96 ../../include/widgets.php:691
-#: ../../include/features.php:213
-msgid "Channel Sources"
-msgstr "Sources du canal"
-
-#: ../../Zotlabs/Module/Sources.php:97
-msgid "Manage remote sources of content for your channel."
-msgstr "Gérer les sources distantes de contenu pour votre canal."
-
-#: ../../Zotlabs/Module/Sources.php:98 ../../Zotlabs/Module/Sources.php:108
-msgid "New Source"
-msgstr "Nouvelle source"
-
-#: ../../Zotlabs/Module/Sources.php:109 ../../Zotlabs/Module/Sources.php:143
-msgid ""
-"Import all or selected content from the following channel into this channel "
-"and distribute it according to your channel settings."
-msgstr "Importer le contenu sélectionné ou tout le contenu du canal suivant vers ce canal et le distribuer selon vos paramètres de canal."
-
-#: ../../Zotlabs/Module/Sources.php:110 ../../Zotlabs/Module/Sources.php:144
-msgid "Only import content with these words (one per line)"
-msgstr "N'importer le contenu que s'il contient ces mots (un par ligne)"
-
-#: ../../Zotlabs/Module/Sources.php:110 ../../Zotlabs/Module/Sources.php:144
-msgid "Leave blank to import all public content"
-msgstr "Laissez vide pour importer tout le contenu public"
-
-#: ../../Zotlabs/Module/Sources.php:111 ../../Zotlabs/Module/Sources.php:148
-msgid "Channel Name"
-msgstr "Nom du canal"
-
-#: ../../Zotlabs/Module/Sources.php:112 ../../Zotlabs/Module/Sources.php:147
-msgid ""
-"Add the following categories to posts imported from this source (comma "
-"separated)"
-msgstr "Ajouter les catégories suivantes aux publications importées à partir de cette source (séparer par des virgules)"
-
-#: ../../Zotlabs/Module/Sources.php:112 ../../Zotlabs/Module/Sources.php:147
-#: ../../Zotlabs/Module/Settings/Oauth.php:93
-msgid "Optional"
-msgstr "Facultatif"
-
-#: ../../Zotlabs/Module/Sources.php:133 ../../Zotlabs/Module/Sources.php:161
-msgid "Source not found."
-msgstr "Source introuvable."
-
-#: ../../Zotlabs/Module/Sources.php:140
-msgid "Edit Source"
-msgstr "Modifier la source"
-
-#: ../../Zotlabs/Module/Sources.php:141
-msgid "Delete Source"
-msgstr "Supprimer la source"
-
-#: ../../Zotlabs/Module/Sources.php:169
-msgid "Source removed"
-msgstr "Source supprimée"
-
-#: ../../Zotlabs/Module/Sources.php:171
-msgid "Unable to remove source."
-msgstr "Impossible de supprimer la source."
-
-#: ../../Zotlabs/Module/Subthread.php:118
-#, php-format
-msgid "%1$s is following %2$s's %3$s"
-msgstr "%1$s suit %3$s de %2$s"
+#: ../../Zotlabs/Module/Xchan.php:10
+msgid "Xchan Lookup"
+msgstr "Recherche xchan"
-#: ../../Zotlabs/Module/Subthread.php:120
-#, php-format
-msgid "%1$s stopped following %2$s's %3$s"
-msgstr "%1$s ne suit plus %3$s de %2$s"
+#: ../../Zotlabs/Module/Xchan.php:13
+msgid "Lookup xchan beginning with (or webbie): "
+msgstr "Recherche xchan commençant par (ou adresse \"webbie\")&nbsp;:"
-#: ../../Zotlabs/Module/Suggest.php:39
+#: ../../Zotlabs/Module/Suggest.php:37
msgid ""
"No suggestions available. If this is a new site, please try again in 24 "
"hours."
msgstr "Aucune suggestion disponible. Si le site est récent, merci de re-tenter dans 24 heures."
-#: ../../Zotlabs/Module/Suggest.php:58 ../../include/widgets.php:150
+#: ../../Zotlabs/Module/Suggest.php:56 ../../Zotlabs/Widget/Suggestions.php:46
msgid "Ignore/Hide"
msgstr "Ignorer/Cacher"
-#: ../../Zotlabs/Module/Tagger.php:55 ../../include/bbcode.php:274
-msgid "post"
-msgstr "publication"
-
-#: ../../Zotlabs/Module/Tagger.php:57 ../../include/conversation.php:150
-#: ../../include/text.php:1961
-msgid "comment"
-msgstr "commentaire"
-
-#: ../../Zotlabs/Module/Tagger.php:95
-#, php-format
-msgid "%1$s tagged %2$s's %3$s with %4$s"
-msgstr "%1$s a étiqueté le %3$s de %2$s avec %4$s"
-
-#: ../../Zotlabs/Module/Settings/Features.php:45
-msgid "Additional Features"
-msgstr "Fonctionnalités additionnelles"
-
-#: ../../Zotlabs/Module/Settings/Oauth.php:34
-msgid "Name is required"
-msgstr "Le nom est requis"
-
-#: ../../Zotlabs/Module/Settings/Oauth.php:38
-msgid "Key and Secret are required"
-msgstr "Clef et secret sont requis"
-
-#: ../../Zotlabs/Module/Settings/Oauth.php:86
-#: ../../Zotlabs/Module/Settings/Oauth.php:112
-#: ../../Zotlabs/Module/Settings/Oauth.php:148
-msgid "Add application"
-msgstr "Ajouter une application"
-
-#: ../../Zotlabs/Module/Settings/Oauth.php:89
-msgid "Name of application"
-msgstr "Nom de l'application"
-
-#: ../../Zotlabs/Module/Settings/Oauth.php:90
-#: ../../Zotlabs/Module/Settings/Oauth.php:116
-#: ../../extend/addon/addon/statusnet/statusnet.php:893
-#: ../../extend/addon/addon/twitter/twitter.php:775
-msgid "Consumer Key"
-msgstr "Clef client"
-
-#: ../../Zotlabs/Module/Settings/Oauth.php:90
-#: ../../Zotlabs/Module/Settings/Oauth.php:91
-msgid "Automatically generated - change if desired. Max length 20"
-msgstr "Généré automatiquement - à changer si besoin. Longueur maximale 20 caractères."
-
-#: ../../Zotlabs/Module/Settings/Oauth.php:91
-#: ../../Zotlabs/Module/Settings/Oauth.php:117
-#: ../../extend/addon/addon/statusnet/statusnet.php:892
-#: ../../extend/addon/addon/twitter/twitter.php:776
-msgid "Consumer Secret"
-msgstr "Secret client"
-
-#: ../../Zotlabs/Module/Settings/Oauth.php:92
-#: ../../Zotlabs/Module/Settings/Oauth.php:118
-msgid "Redirect"
-msgstr "Redirection"
-
-#: ../../Zotlabs/Module/Settings/Oauth.php:92
-msgid ""
-"Redirect URI - leave blank unless your application specifically requires "
-"this"
-msgstr "URI de redirection - laissez vide, sauf si votre application le requiert spécifiquement"
-
-#: ../../Zotlabs/Module/Settings/Oauth.php:93
-#: ../../Zotlabs/Module/Settings/Oauth.php:119
-msgid "Icon url"
-msgstr "URL de l'icône"
+#: ../../Zotlabs/Module/Oexchange.php:27
+msgid "Unable to find your hub."
+msgstr "Impossible de trouver votre hub."
-#: ../../Zotlabs/Module/Settings/Oauth.php:104
-msgid "Application not found."
-msgstr "Application introuvable."
+#: ../../Zotlabs/Module/Oexchange.php:41
+msgid "Post successful."
+msgstr "Publication réussie."
-#: ../../Zotlabs/Module/Settings/Oauth.php:147
-msgid "Connected Apps"
-msgstr "Applications connectées"
+#: ../../Zotlabs/Module/Mail.php:65
+msgid "Unable to lookup recipient."
+msgstr "Impossible de localiser le destinataire."
-#: ../../Zotlabs/Module/Settings/Oauth.php:151
-msgid "Client key starts with"
-msgstr "La clef partagée commence par"
+#: ../../Zotlabs/Module/Mail.php:72
+msgid "Unable to communicate with requested channel."
+msgstr "Impossible de communiquer avec le canal demandé."
-#: ../../Zotlabs/Module/Settings/Oauth.php:152
-msgid "No name"
-msgstr "Sans nom"
+#: ../../Zotlabs/Module/Mail.php:79
+msgid "Cannot verify requested channel."
+msgstr "Impossible de vérifier le canal demandé."
-#: ../../Zotlabs/Module/Settings/Oauth.php:153
-msgid "Remove authorization"
-msgstr "Révoquer l'autorisation"
+#: ../../Zotlabs/Module/Mail.php:97
+msgid "Selected channel has private message restrictions. Send failed."
+msgstr "Le canal choisi a des restrictions quant aux messages privés. L'envoi a échoué."
-#: ../../Zotlabs/Module/Settings/Account.php:20
-msgid "Not valid email."
-msgstr "Adresse de courriel non valide."
+#: ../../Zotlabs/Module/Mail.php:178
+msgid "Messages"
+msgstr "Messages"
-#: ../../Zotlabs/Module/Settings/Account.php:23
-msgid "Protected email address. Cannot change to that email."
-msgstr "Adresse de courriel protégée. Impossible de l'utiliser."
+#: ../../Zotlabs/Module/Mail.php:213
+msgid "Message recalled."
+msgstr "Message rappelé."
-#: ../../Zotlabs/Module/Settings/Account.php:32
-msgid "System failure storing new email. Please try again."
-msgstr "Défaillance système lors du stockage de la nouvelle adresse de courriel. Merci d'essayer à nouveau."
+#: ../../Zotlabs/Module/Mail.php:226
+msgid "Conversation removed."
+msgstr "Conversation supprimée."
-#: ../../Zotlabs/Module/Settings/Account.php:40
-msgid "Technical skill level updated"
-msgstr "Niveau technique mis à jour"
+#: ../../Zotlabs/Module/Mail.php:241 ../../Zotlabs/Module/Mail.php:362
+msgid "Expires YYYY-MM-DD HH:MM"
+msgstr "Expire le YYYY-MM-DD à HH:MM"
-#: ../../Zotlabs/Module/Settings/Account.php:56
-msgid "Password verification failed."
-msgstr "La vérification du mot de passe a échoué."
+#: ../../Zotlabs/Module/Mail.php:269
+msgid "Requested channel is not in this network"
+msgstr "Le canal demandé n'est pas sur ce réseau"
-#: ../../Zotlabs/Module/Settings/Account.php:63
-msgid "Passwords do not match. Password unchanged."
-msgstr "Les deux saisies du mot de passe ne correspondent pas. Il n'a donc pas été changé."
+#: ../../Zotlabs/Module/Mail.php:277
+msgid "Send Private Message"
+msgstr "Envoyer un message privé"
-#: ../../Zotlabs/Module/Settings/Account.php:67
-msgid "Empty passwords are not allowed. Password unchanged."
-msgstr "Le mot de passe ne peut pas être vide. Il n'a donc pas été changé."
+#: ../../Zotlabs/Module/Mail.php:278 ../../Zotlabs/Module/Mail.php:415
+msgid "To:"
+msgstr "À&nbsp;:"
-#: ../../Zotlabs/Module/Settings/Account.php:81
-msgid "Password changed."
-msgstr "Le mot de passe a été changé."
+#: ../../Zotlabs/Module/Mail.php:281 ../../Zotlabs/Module/Mail.php:417
+msgid "Subject:"
+msgstr "Objet&nbsp;:"
-#: ../../Zotlabs/Module/Settings/Account.php:83
-msgid "Password update failed. Please try again."
-msgstr "La mise à jour du mot de passe a échoué. Merci d'essayer à nouveau."
+#: ../../Zotlabs/Module/Mail.php:286 ../../Zotlabs/Module/Mail.php:423
+#: ../../include/conversation.php:1323
+msgid "Attach file"
+msgstr "Joindre un fichier"
-#: ../../Zotlabs/Module/Settings/Account.php:112
-msgid "Account Settings"
-msgstr "Paramètres du compte"
+#: ../../Zotlabs/Module/Mail.php:288
+msgid "Send"
+msgstr "Envoyer"
-#: ../../Zotlabs/Module/Settings/Account.php:113
-msgid "Current Password"
-msgstr "Mot de passe actuel"
+#: ../../Zotlabs/Module/Mail.php:291 ../../Zotlabs/Module/Mail.php:428
+#: ../../include/conversation.php:1368
+msgid "Set expiration date"
+msgstr "Définir la date d'expiration"
-#: ../../Zotlabs/Module/Settings/Account.php:114
-msgid "Enter New Password"
-msgstr "Entrez votre nouveau mot de passe"
+#: ../../Zotlabs/Module/Mail.php:387
+msgid "Delete message"
+msgstr "Supprimer le message"
-#: ../../Zotlabs/Module/Settings/Account.php:115
-msgid "Confirm New Password"
-msgstr "Confirmez le nouveau mot de passe"
+#: ../../Zotlabs/Module/Mail.php:388
+msgid "Delivery report"
+msgstr "Rapport de distribution"
-#: ../../Zotlabs/Module/Settings/Account.php:115
-msgid "Leave password fields blank unless changing"
-msgstr "Laissez les mots de passe vides si vous ne voulez pas les modifier"
+#: ../../Zotlabs/Module/Mail.php:389
+msgid "Recall message"
+msgstr "Rappeler le message"
-#: ../../Zotlabs/Module/Settings/Account.php:116
-msgid "Your technical skill level"
-msgstr "Votre niveau technique"
+#: ../../Zotlabs/Module/Mail.php:391
+msgid "Message has been recalled."
+msgstr "Le message a été rappelé."
-#: ../../Zotlabs/Module/Settings/Account.php:116
-msgid "Used to provide a member experience matched to your comfort level"
-msgstr "Utilisé pour fournir une expérience utilisateur correspondant à votre niveau de confort"
+#: ../../Zotlabs/Module/Mail.php:408
+msgid "Delete Conversation"
+msgstr "Supprimer la conversation"
-#: ../../Zotlabs/Module/Settings/Account.php:119
-#: ../../Zotlabs/Module/Settings/Channel.php:483
-msgid "Email Address:"
-msgstr "Adresse de courriel&nbsp;:"
+#: ../../Zotlabs/Module/Mail.php:410
+msgid ""
+"No secure communications available. You <strong>may</strong> be able to "
+"respond from the sender's profile page."
+msgstr "Aucune communication sécurisée n'est possible. Vous pourrez <strong>peut-être</strong> répondre depuis la page de profil de l'émetteur."
-#: ../../Zotlabs/Module/Settings/Account.php:121
-msgid "Remove this account including all its channels"
-msgstr "Supprimer ce compte et tous ses canaux"
+#: ../../Zotlabs/Module/Mail.php:414
+msgid "Send Reply"
+msgstr "Envoyer la réponse"
-#: ../../Zotlabs/Module/Settings/Tokens.php:31
+#: ../../Zotlabs/Module/Mail.php:419
#, php-format
-msgid "This channel is limited to %d tokens"
-msgstr "Ce canal est limité à %d jetons"
-
-#: ../../Zotlabs/Module/Settings/Tokens.php:37
-msgid "Name and Password are required."
-msgstr "Le nom et le mot de passe sont requis"
-
-#: ../../Zotlabs/Module/Settings/Tokens.php:77
-msgid "Token saved."
-msgstr "Jeton sauvegardé"
+msgid "Your message for %s (%s):"
+msgstr "Votre message pour %s (%s)&nbsp;:"
-#: ../../Zotlabs/Module/Settings/Tokens.php:113
-msgid ""
-"Use this form to create temporary access identifiers to share things with "
-"non-members. These identities may be used in Access Control Lists and "
-"visitors may login using these credentials to access private content."
-msgstr "Utilisez ce formulaire pour créer des identifiants d'accès temporaires pour partager des informations avec des non-membres. Ces identités peuvent être utilisées dans les listes de contrôle d'accès et les visiteurs peuvent se connecter en utilisant ces certificats d'identification pour accéder au contenu privé."
+#: ../../Zotlabs/Module/Pubsites.php:24 ../../Zotlabs/Widget/Pubsites.php:12
+msgid "Public Hubs"
+msgstr "Instances publiques"
-#: ../../Zotlabs/Module/Settings/Tokens.php:115
+#: ../../Zotlabs/Module/Pubsites.php:27
msgid ""
-"You may also provide <em>dropbox</em> style access links to friends and "
-"associates by adding the Login Password to any specific site URL as shown. "
-"Examples:"
-msgstr "Vous pouvez également fournir des liens d'accès, style <em>dropbox</em>, aux amis et aux associés en ajoutant le mot de passe de connexion à l'URL d'un site spécifique, comme indiqué. Exemples:"
-
-#: ../../Zotlabs/Module/Settings/Tokens.php:150 ../../include/widgets.php:658
-msgid "Guest Access Tokens"
-msgstr "Jeton d'accès pour un invité"
-
-#: ../../Zotlabs/Module/Settings/Tokens.php:157
-msgid "Login Name"
-msgstr "Nom d'utilisateur"
+"The listed hubs allow public registration for the $Projectname network. All "
+"hubs in the network are interlinked so membership on any of them conveys "
+"membership in the network as a whole. Some hubs may require subscription or "
+"provide tiered service plans. The hub itself <strong>may</strong> provide "
+"additional details."
+msgstr "Les sites listés permettent l'enregistrement public de comptes pour le réseau $Projectname. Tous les sites du réseau sont reliés entre eux, être membre d'un site revient à être membre de tous. Certains sites peuvent demander une souscription ou proposer différents niveaux de service. Chaque site <strong>peut</strong> fournir des détails supplémentaires."
-#: ../../Zotlabs/Module/Settings/Tokens.php:158
-msgid "Login Password"
-msgstr "Mot de passe"
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Hub URL"
+msgstr "URL du site"
-#: ../../Zotlabs/Module/Settings/Tokens.php:159
-msgid "Expires (yyyy-mm-dd)"
-msgstr "Date d'expiration sous la forme année mois jour (AAAA-MM-JJ)"
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Access Type"
+msgstr "Type d'accès"
-#: ../../Zotlabs/Module/Settings/Featured.php:20
-msgid "Affinity Slider settings updated."
-msgstr "Paramètres de la réglette d'affinité mis à jour."
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Registration Policy"
+msgstr "Politique d'inscription"
-#: ../../Zotlabs/Module/Settings/Featured.php:34
-msgid "No feature settings configured"
-msgstr "Aucun paramètre de fonctionnalité configuré"
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Stats"
+msgstr "Statistiques"
-#: ../../Zotlabs/Module/Settings/Featured.php:41
-msgid "Default maximum affinity level"
-msgstr "Niveau d'affinité maximum par défaut"
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Software"
+msgstr "Logiciel"
-#: ../../Zotlabs/Module/Settings/Featured.php:46
-msgid "Default minimum affinity level"
-msgstr "Niveau d'affinité minimum par défaut"
+#: ../../Zotlabs/Module/Pubsites.php:48
+msgid "Rate"
+msgstr "Evaluer"
-#: ../../Zotlabs/Module/Settings/Featured.php:50
-msgid "Affinity Slider Settings"
-msgstr "Paramètres de la réglette d'affinité"
+#: ../../Zotlabs/Module/Impel.php:41 ../../include/bbcode.php:203
+msgid "webpage"
+msgstr "pages web"
-#: ../../Zotlabs/Module/Settings/Featured.php:60
-msgid "Feature/Addon Settings"
-msgstr "Paramètres des extensions/greffons"
+#: ../../Zotlabs/Module/Impel.php:46 ../../include/bbcode.php:209
+msgid "block"
+msgstr "bloquer"
-#: ../../Zotlabs/Module/Settings/Channel.php:251
-#: ../../extend/addon/addon/logrot/logrot.php:54
-#: ../../extend/addon/addon/msgfooter/msgfooter.php:54
-#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:184
-#: ../../extend/addon/addon/piwik/piwik.php:116
-#: ../../extend/addon/addon/twitter/twitter.php:766
-#: ../../extend/addon/addon/xmpp/xmpp.php:102
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:82
-msgid "Settings updated."
-msgstr "Paramètres mis à jour."
+#: ../../Zotlabs/Module/Impel.php:51 ../../include/bbcode.php:206
+msgid "layout"
+msgstr "mise en page"
-#: ../../Zotlabs/Module/Settings/Channel.php:312
-msgid "Nobody except yourself"
-msgstr "Personne sauf vous"
+#: ../../Zotlabs/Module/Impel.php:58 ../../include/bbcode.php:212
+msgid "menu"
+msgstr "menu"
-#: ../../Zotlabs/Module/Settings/Channel.php:313
-msgid "Only those you specifically allow"
-msgstr "Seulement ceux que vous autorisez spécifiquement"
+#: ../../Zotlabs/Module/Impel.php:181
+#, php-format
+msgid "%s element installed"
+msgstr "Elément %s installé"
-#: ../../Zotlabs/Module/Settings/Channel.php:314
-msgid "Approved connections"
-msgstr "Contacts approuvés"
+#: ../../Zotlabs/Module/Impel.php:184
+#, php-format
+msgid "%s element installation failed"
+msgstr "L'installation de l'élément %s a échoué"
-#: ../../Zotlabs/Module/Settings/Channel.php:315
-msgid "Any connections"
-msgstr "Tous les contacts"
+#: ../../Zotlabs/Module/Rbmark.php:94
+msgid "Select a bookmark folder"
+msgstr "Choisir un dossier de favoris"
-#: ../../Zotlabs/Module/Settings/Channel.php:316
-msgid "Anybody on this website"
-msgstr "Tous les utilisateurs du hub"
+#: ../../Zotlabs/Module/Rbmark.php:99
+msgid "Save Bookmark"
+msgstr "Enregistrer le favori"
-#: ../../Zotlabs/Module/Settings/Channel.php:317
-msgid "Anybody in this network"
-msgstr "Tous les utilisateurs sur ce réseau"
+#: ../../Zotlabs/Module/Rbmark.php:100
+msgid "URL of bookmark"
+msgstr "URL du favori"
-#: ../../Zotlabs/Module/Settings/Channel.php:318
-msgid "Anybody authenticated"
-msgstr "Tous les utilisateurs authentifiés"
+#: ../../Zotlabs/Module/Rbmark.php:105
+msgid "Or enter new bookmark folder name"
+msgstr "Ou entrez un nouveau nom de dossier de favoris"
-#: ../../Zotlabs/Module/Settings/Channel.php:319
-msgid "Anybody on the internet"
-msgstr "Tous les utilisateurs d'Internet"
+#: ../../Zotlabs/Module/Filer.php:52
+msgid "Enter a folder name"
+msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:395
-msgid "Publish your default profile in the network directory"
-msgstr "Publier votre profil par défaut dans l'annuaire du réseau"
+#: ../../Zotlabs/Module/Filer.php:52
+msgid "or select an existing folder (doubleclick)"
+msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:400
-msgid "Allow us to suggest you as a potential friend to new members?"
-msgstr "Nous autoriser à vous suggérer comme ami(e) potentiel(le) aux nouveaux membres?"
+#: ../../Zotlabs/Module/Filer.php:54 ../../Zotlabs/Lib/ThreadItem.php:137
+msgid "Save to Folder"
+msgstr "Enregistrer dans le dossier"
-#: ../../Zotlabs/Module/Settings/Channel.php:409
-msgid "Your channel address is"
-msgstr "L'adresse de votre canal est"
+#: ../../Zotlabs/Module/Probe.php:28 ../../Zotlabs/Module/Probe.php:32
+#, php-format
+msgid "Fetching URL returns error: %1$s"
+msgstr "Récupération d'URL échouée&nbsp;: %1$s"
-#: ../../Zotlabs/Module/Settings/Channel.php:412
-msgid "Your files/photos are accessible via WebDAV at"
-msgstr "Vos fichiers/photos sont accessibles via WebDAV à"
+#: ../../Zotlabs/Module/Register.php:49
+msgid "Maximum daily site registrations exceeded. Please try again tomorrow."
+msgstr "Nombre d'inscriptions quotidiennes dépassé. Merci d'essayer à nouveau demain."
-#: ../../Zotlabs/Module/Settings/Channel.php:474
-msgid "Channel Settings"
-msgstr "Paramètres du canal"
+#: ../../Zotlabs/Module/Register.php:55
+msgid ""
+"Please indicate acceptance of the Terms of Service. Registration failed."
+msgstr "Merci d'indiquer votre adhésion aux conditions de service. L'inscription a échoué."
-#: ../../Zotlabs/Module/Settings/Channel.php:481
-msgid "Basic Settings"
-msgstr "Paramètres standard"
+#: ../../Zotlabs/Module/Register.php:89
+msgid "Passwords do not match."
+msgstr "Les mots de passe ne concordent pas."
-#: ../../Zotlabs/Module/Settings/Channel.php:482
-#: ../../include/channel.php:1255
-msgid "Full Name:"
-msgstr "Nom complet&nbsp;:"
+#: ../../Zotlabs/Module/Register.php:131
+msgid ""
+"Registration successful. Please check your email for validation "
+"instructions."
+msgstr "Inscription réussie. Merci de vérifier vos courriels pour valider votre compte."
-#: ../../Zotlabs/Module/Settings/Channel.php:484
-msgid "Your Timezone:"
-msgstr "Votre fureau horaire&nbsp;:"
+#: ../../Zotlabs/Module/Register.php:137
+msgid "Your registration is pending approval by the site owner."
+msgstr "Votre inscription est en attente d'approbation par l'administrateur."
-#: ../../Zotlabs/Module/Settings/Channel.php:485
-msgid "Default Post Location:"
-msgstr "Emplacement de publication par défaut&nbsp;:"
+#: ../../Zotlabs/Module/Register.php:140
+msgid "Your registration can not be processed."
+msgstr "Votre inscription ne peut être traîtée."
-#: ../../Zotlabs/Module/Settings/Channel.php:485
-msgid "Geographical location to display on your posts"
-msgstr "Emplacement géographique à afficher sur vos publications"
+#: ../../Zotlabs/Module/Register.php:184
+msgid "Registration on this hub is disabled."
+msgstr "La création de nouveaux comptes est désactivée pour ce site."
-#: ../../Zotlabs/Module/Settings/Channel.php:486
-msgid "Use Browser Location:"
-msgstr "Utiliser la géolocalisation du navigateur&nbsp;:"
+#: ../../Zotlabs/Module/Register.php:193
+msgid "Registration on this hub is by approval only."
+msgstr "La création de compte sur ce site est soumise à approbation."
-#: ../../Zotlabs/Module/Settings/Channel.php:488
-msgid "Adult Content"
-msgstr "Contenu \"adulte\""
+#: ../../Zotlabs/Module/Register.php:194
+msgid "<a href=\"pubsites\">Register at another affiliated hub.</a>"
+msgstr "<a href=\"pubsites\">S'enregistrer sur un autre site du réseau.</a>"
-#: ../../Zotlabs/Module/Settings/Channel.php:488
+#: ../../Zotlabs/Module/Register.php:204
msgid ""
-"This channel frequently or regularly publishes adult content. (Please tag "
-"any adult material and/or nudity with #NSFW)"
-msgstr "Ce canal publie plus ou moins fréquemment du contenu pour adultes. (Merci d'indiquer tout contenu pour adulte ou potentiellement choquant avec l'étiquette <em>#NSFW</em> - Not Safe For Work)"
+"This site has exceeded the number of allowed daily account registrations. "
+"Please try again tomorrow."
+msgstr "Ce site a dépassé le nombre de création de comptes autorisé chaque jour. Merci d'essayer à nouveau demain."
-#: ../../Zotlabs/Module/Settings/Channel.php:490
-msgid "Security and Privacy Settings"
-msgstr "Paramètres de sécurité et de confidentialité"
+#: ../../Zotlabs/Module/Register.php:227
+#, php-format
+msgid "I accept the %s for this website"
+msgstr "J'accepte les %s de ce site"
-#: ../../Zotlabs/Module/Settings/Channel.php:493
-msgid "Your permissions are already configured. Click to view/adjust"
-msgstr "Vous permissions sont déjà paramétrées. Cliquer pour voir/ajuster"
+#: ../../Zotlabs/Module/Register.php:229
+#, php-format
+msgid "I am over 13 years of age and accept the %s for this website"
+msgstr "J'ai plus de 13 ans et j'accepte les %s de ce site"
-#: ../../Zotlabs/Module/Settings/Channel.php:495
-msgid "Hide my online presence"
-msgstr "Cacher ma présence en ligne"
+#: ../../Zotlabs/Module/Register.php:233
+msgid "Your email address"
+msgstr "Votre adresse de courriel"
-#: ../../Zotlabs/Module/Settings/Channel.php:495
-msgid "Prevents displaying in your profile that you are online"
-msgstr "Cacher votre statut (en ligne/hors ligne) sur votre profil"
+#: ../../Zotlabs/Module/Register.php:234
+msgid "Choose a password"
+msgstr "Choisissez un mot de passe"
-#: ../../Zotlabs/Module/Settings/Channel.php:497
-msgid "Simple Privacy Settings:"
-msgstr "Paramètres de confidentialité simplifiés&nbsp;:"
+#: ../../Zotlabs/Module/Register.php:235
+msgid "Please re-enter your password"
+msgstr "Merci de saisir à nouveau votre mot de passe"
-#: ../../Zotlabs/Module/Settings/Channel.php:498
-msgid ""
-"Very Public - <em>extremely permissive (should be used with caution)</em>"
-msgstr "Très public - <em>extrèmement permissif (à n'utiliser qu'en connaissance de cause)</em>"
+#: ../../Zotlabs/Module/Register.php:236
+msgid "Please enter your invitation code"
+msgstr "Merci de saisir votre code d'invitation"
-#: ../../Zotlabs/Module/Settings/Channel.php:499
-msgid ""
-"Typical - <em>default public, privacy when desired (similar to social "
-"network permissions but with improved privacy)</em>"
-msgstr "Classique - <em>public par défaut, privé en cas de besoin (comparable aux permissions type réseau social, avec une confidentialité améliorée)</em>"
+#: ../../Zotlabs/Module/Register.php:241
+msgid "no"
+msgstr "non"
-#: ../../Zotlabs/Module/Settings/Channel.php:500
-msgid "Private - <em>default private, never open or public</em>"
-msgstr "Privé - <em>privé par défaut, jamais ouvert ni public</em>"
+#: ../../Zotlabs/Module/Register.php:241
+msgid "yes"
+msgstr "oui"
-#: ../../Zotlabs/Module/Settings/Channel.php:501
-msgid "Blocked - <em>default blocked to/from everybody</em>"
-msgstr "Bloqué - <em>par défaut, bloqué de/vers tout le monde</em>"
+#: ../../Zotlabs/Module/Register.php:258
+msgid "Membership on this site is by invitation only."
+msgstr "L'inscription à ce site se fait uniquement sur invitation."
-#: ../../Zotlabs/Module/Settings/Channel.php:503
-msgid "Allow others to tag your posts"
-msgstr "Autoriser les autres à \"étiqueter\" vos publications"
+#: ../../Zotlabs/Module/Register.php:270 ../../boot.php:1612
+#: ../../include/nav.php:145
+msgid "Register"
+msgstr "S'inscrire"
-#: ../../Zotlabs/Module/Settings/Channel.php:503
+#: ../../Zotlabs/Module/Register.php:271
msgid ""
-"Often used by the community to retro-actively flag inappropriate content"
-msgstr "Souvent utilisé par la communauté pour identifier un contenu inapproprié a posteriori "
-
-#: ../../Zotlabs/Module/Settings/Channel.php:505
-msgid "Channel Permission Limits"
-msgstr "Limites des permissions du canal"
+"This site may require email verification after submitting this form. If you "
+"are returned to a login page, please check your email for instructions."
+msgstr "Ce site peut demander une validation de votre email. Si vous revenez sur le formulaire de connexion, vérifiez vos emails et suivez les instructions. Regardez aussi les spams."
-#: ../../Zotlabs/Module/Settings/Channel.php:507
-msgid "Expire other channel content after this many days"
-msgstr "Faire expirer le contenu des autres canaux après n jours"
+#: ../../Zotlabs/Module/Cover_photo.php:136
+#: ../../Zotlabs/Module/Cover_photo.php:186
+msgid "Cover Photos"
+msgstr "Photos de couverture"
-#: ../../Zotlabs/Module/Settings/Channel.php:507
-msgid "0 or blank to use the website limit."
-msgstr "0 ou vide pour utiliser la limite du site web"
+#: ../../Zotlabs/Module/Cover_photo.php:237 ../../include/items.php:4286
+msgid "female"
+msgstr "femme"
-#: ../../Zotlabs/Module/Settings/Channel.php:507
+#: ../../Zotlabs/Module/Cover_photo.php:238 ../../include/items.php:4287
#, php-format
-msgid "This website expires after %d days."
-msgstr "Ce site web expirera après %d jours."
-
-#: ../../Zotlabs/Module/Settings/Channel.php:507
-msgid "This website does not expire imported content."
-msgstr "Ce site web ne périme pas le contenu importé."
+msgid "%1$s updated her %2$s"
+msgstr "%1$s a mis à jour son %2$s"
-#: ../../Zotlabs/Module/Settings/Channel.php:507
-msgid "The website limit takes precedence if lower than your limit."
-msgstr "La limite du site Web a priorité si elle est inférieure à votre limite."
+#: ../../Zotlabs/Module/Cover_photo.php:239 ../../include/items.php:4288
+msgid "male"
+msgstr "homme"
-#: ../../Zotlabs/Module/Settings/Channel.php:508
-msgid "Maximum Friend Requests/Day:"
-msgstr "Nombre maximum de demandes de contact par jour&nbsp;:"
+#: ../../Zotlabs/Module/Cover_photo.php:240 ../../include/items.php:4289
+#, php-format
+msgid "%1$s updated his %2$s"
+msgstr "%1$s a mis à jour son %2$s"
-#: ../../Zotlabs/Module/Settings/Channel.php:508
-msgid "May reduce spam activity"
-msgstr "Contribue à réduire l'impact des indésirables"
+#: ../../Zotlabs/Module/Cover_photo.php:242 ../../include/items.php:4291
+#, php-format
+msgid "%1$s updated their %2$s"
+msgstr "%1$s a mis a jour sa %2$s"
-#: ../../Zotlabs/Module/Settings/Channel.php:509
-msgid "Default Access Control List (ACL)"
-msgstr "Default Access Control List (ACL)"
+#: ../../Zotlabs/Module/Cover_photo.php:244 ../../include/channel.php:1757
+msgid "cover photo"
+msgstr "Photo principale"
-#: ../../Zotlabs/Module/Settings/Channel.php:511
-msgid "Use my default audience setting for the type of object published"
-msgstr "Utiliser mon paramètre de publication par défaut pour le type d'objet publié"
+#: ../../Zotlabs/Module/Cover_photo.php:360
+msgid "Upload Cover Photo"
+msgstr "Téléverser une photo de couverture"
-#: ../../Zotlabs/Module/Settings/Channel.php:518
-msgid "Channel permissions category:"
-msgstr "Catégorie de permissions du canal&nbsp;:"
+#: ../../Zotlabs/Module/Help.php:23
+msgid "Documentation Search"
+msgstr "Chercher dans la documentation"
-#: ../../Zotlabs/Module/Settings/Channel.php:519
-msgid "Default Permissions Group"
-msgstr ""
+#: ../../Zotlabs/Module/Help.php:80 ../../include/conversation.php:1764
+msgid "About"
+msgstr "À propos"
-#: ../../Zotlabs/Module/Settings/Channel.php:525
-msgid "Maximum private messages per day from unknown people:"
-msgstr "Nombre maximum de messages privés émanant d'inconnus, par jour&nbsp;:"
+#: ../../Zotlabs/Module/Help.php:82
+msgid "Administrators"
+msgstr "Administrateurs"
-#: ../../Zotlabs/Module/Settings/Channel.php:525
-msgid "Useful to reduce spamming"
-msgstr "Utile pour réduire les indésirables"
+#: ../../Zotlabs/Module/Help.php:83
+msgid "Developers"
+msgstr "Développeurs"
-#: ../../Zotlabs/Module/Settings/Channel.php:528
-msgid "Notification Settings"
-msgstr "Paramètres de notification"
+#: ../../Zotlabs/Module/Help.php:84
+msgid "Tutorials"
+msgstr "Tutoriels"
-#: ../../Zotlabs/Module/Settings/Channel.php:529
-msgid "By default post a status message when:"
-msgstr "Par défaut, publier un statut quand&nbsp;:"
+#: ../../Zotlabs/Module/Help.php:93
+msgid "$Projectname Documentation"
+msgstr "Documentation $Projectname"
-#: ../../Zotlabs/Module/Settings/Channel.php:530
-msgid "accepting a friend request"
-msgstr "vous acceptez une demande de contact"
+#: ../../Zotlabs/Module/Help.php:94
+msgid "Contents"
+msgstr "Contenus"
-#: ../../Zotlabs/Module/Settings/Channel.php:531
-msgid "joining a forum/community"
-msgstr "vous rejoignez un forum ou une communauté"
+#: ../../Zotlabs/Module/Tagrm.php:48 ../../Zotlabs/Module/Tagrm.php:98
+msgid "Tag removed"
+msgstr "Étiquette retirée"
-#: ../../Zotlabs/Module/Settings/Channel.php:532
-msgid "making an <em>interesting</em> profile change"
-msgstr "vous faîtes une modification <em>intéressante</em> de votre profil"
+#: ../../Zotlabs/Module/Tagrm.php:123
+msgid "Remove Item Tag"
+msgstr "Retirer une étiquette à l'élément"
-#: ../../Zotlabs/Module/Settings/Channel.php:533
-msgid "Send a notification email when:"
-msgstr "Envoyer un courriel de notification quand&nbsp;:"
+#: ../../Zotlabs/Module/Tagrm.php:125
+msgid "Select a tag to remove: "
+msgstr "Étiquette à retirer&nbsp;:"
-#: ../../Zotlabs/Module/Settings/Channel.php:534
-msgid "You receive a connection request"
-msgstr "Vous recevez une demande de contact"
+#: ../../Zotlabs/Module/Network.php:96
+msgid "No such group"
+msgstr "Groupe introuvable"
-#: ../../Zotlabs/Module/Settings/Channel.php:535
-msgid "Your connections are confirmed"
-msgstr "Vos contacts sont confirmés"
+#: ../../Zotlabs/Module/Network.php:136
+msgid "No such channel"
+msgstr "Canal introuvable"
-#: ../../Zotlabs/Module/Settings/Channel.php:536
-msgid "Someone writes on your profile wall"
-msgstr "Quelqu'un a écrit sur votre mur"
+#: ../../Zotlabs/Module/Network.php:141
+msgid "forum"
+msgstr "forum"
-#: ../../Zotlabs/Module/Settings/Channel.php:537
-msgid "Someone writes a followup comment"
-msgstr "Quelqu'un a commenté vos publications"
+#: ../../Zotlabs/Module/Network.php:153
+msgid "Search Results For:"
+msgstr "Résultats de recherche pour&nbsp;:"
-#: ../../Zotlabs/Module/Settings/Channel.php:538
-msgid "You receive a private message"
-msgstr "Vous recevez un message privé"
+#: ../../Zotlabs/Module/Network.php:221
+msgid "Privacy group is empty"
+msgstr "Groupe de contacts vide"
-#: ../../Zotlabs/Module/Settings/Channel.php:539
-msgid "You receive a friend suggestion"
-msgstr "Vous recevez une suggestion d'amitié/contact"
+#: ../../Zotlabs/Module/Network.php:230
+msgid "Privacy group: "
+msgstr "Groupe de contacts&nbsp;:"
-#: ../../Zotlabs/Module/Settings/Channel.php:540
-msgid "You are tagged in a post"
-msgstr "Vous êtes étiqueté dans une publication"
+#: ../../Zotlabs/Module/Network.php:256
+msgid "Invalid connection."
+msgstr "Contact non valide."
-#: ../../Zotlabs/Module/Settings/Channel.php:541
-msgid "You are poked/prodded/etc. in a post"
-msgstr "Vous êtes tapoté/encouragé/etc. dans une publication"
+#: ../../Zotlabs/Module/Network.php:275 ../../addon/redred/redred.php:65
+msgid "Invalid channel."
+msgstr "Canal invalide."
-#: ../../Zotlabs/Module/Settings/Channel.php:543
-msgid "Someone likes your post/comment"
-msgstr "Quelqu'un aime votre publication/commentaire"
+#: ../../Zotlabs/Module/Acl.php:344
+msgid "network"
+msgstr "réseau"
-#: ../../Zotlabs/Module/Settings/Channel.php:546
-msgid "Show visual notifications including:"
-msgstr "Afficher des notifications visuelles y compris&nbsp;:"
+#: ../../Zotlabs/Module/Acl.php:354
+msgid "RSS"
+msgstr "RSS"
-#: ../../Zotlabs/Module/Settings/Channel.php:548
-msgid "Unseen grid activity"
-msgstr "Activité du réseau pas encore consultée"
+#: ../../Zotlabs/Module/Home.php:74 ../../Zotlabs/Module/Home.php:82
+#: ../../addon/opensearch/opensearch.php:42
+msgid "$Projectname"
+msgstr "$Projectname"
-#: ../../Zotlabs/Module/Settings/Channel.php:549
-msgid "Unseen channel activity"
-msgstr "Activité non vue sur le canal"
+#: ../../Zotlabs/Module/Home.php:92
+#, php-format
+msgid "Welcome to %s"
+msgstr "Bienvenue sur %s"
-#: ../../Zotlabs/Module/Settings/Channel.php:550
-msgid "Unseen private messages"
-msgstr "Messages privés non lus"
+#: ../../Zotlabs/Module/Filestorage.php:87
+msgid "Permission Denied."
+msgstr "Permission refusée."
-#: ../../Zotlabs/Module/Settings/Channel.php:550
-#: ../../Zotlabs/Module/Settings/Channel.php:555
-#: ../../Zotlabs/Module/Settings/Channel.php:556
-#: ../../Zotlabs/Module/Settings/Channel.php:557
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:343
-msgid "Recommended"
-msgstr "Recommandé"
+#: ../../Zotlabs/Module/Filestorage.php:103
+msgid "File not found."
+msgstr "Fichier introuvable."
-#: ../../Zotlabs/Module/Settings/Channel.php:551
-msgid "Upcoming events"
-msgstr "Événements à venir"
+#: ../../Zotlabs/Module/Filestorage.php:146
+msgid "Edit file permissions"
+msgstr "Modifier les autorisations d'accès au fichier"
-#: ../../Zotlabs/Module/Settings/Channel.php:552
-msgid "Events today"
-msgstr "Événements aujourd'hui"
+#: ../../Zotlabs/Module/Filestorage.php:159
+msgid "Set/edit permissions"
+msgstr "Définir/modifier les autorisations"
-#: ../../Zotlabs/Module/Settings/Channel.php:553
-msgid "Upcoming birthdays"
-msgstr "Anniversaires à venir"
+#: ../../Zotlabs/Module/Filestorage.php:160
+msgid "Include all files and sub folders"
+msgstr "Inclure tous fichiers et sous-répertoires"
-#: ../../Zotlabs/Module/Settings/Channel.php:553
-msgid "Not available in all themes"
-msgstr "Pas disponible dans tous les thèmes"
+#: ../../Zotlabs/Module/Filestorage.php:161
+msgid "Return to file list"
+msgstr "Retourner à la liste des fichiers"
-#: ../../Zotlabs/Module/Settings/Channel.php:554
-msgid "System (personal) notifications"
-msgstr "Notifications système (personnelles)"
+#: ../../Zotlabs/Module/Filestorage.php:163
+msgid "Copy/paste this code to attach file to a post"
+msgstr "Copiez/collez ce code pour joindre le fichier à une publication"
-#: ../../Zotlabs/Module/Settings/Channel.php:555
-msgid "System info messages"
-msgstr "Messages d'info système"
+#: ../../Zotlabs/Module/Filestorage.php:164
+msgid "Copy/paste this URL to link file from a web page"
+msgstr "Copiez/collez cette URL pour pointer vers ce fichier depuis une page web"
-#: ../../Zotlabs/Module/Settings/Channel.php:556
-msgid "System critical alerts"
-msgstr "Alertes critiques système"
+#: ../../Zotlabs/Module/Filestorage.php:166
+msgid "Share this file"
+msgstr "Partager ce fichier"
-#: ../../Zotlabs/Module/Settings/Channel.php:557
-msgid "New connections"
-msgstr "Nouveaux contacts"
+#: ../../Zotlabs/Module/Filestorage.php:167
+msgid "Show URL to this file"
+msgstr "Montrer l'URL de ce fichier"
-#: ../../Zotlabs/Module/Settings/Channel.php:558
-msgid "System Registrations"
-msgstr "Inscriptions système"
+#: ../../Zotlabs/Module/Filestorage.php:168
+msgid "Notify your contacts about this file"
+msgstr "Notifier vos contacts à propos de ce fichier"
-#: ../../Zotlabs/Module/Settings/Channel.php:559
-msgid ""
-"Also show new wall posts, private messages and connections under Notices"
-msgstr "Afficher également les nouvelles publications sur le mur, les messages privés et les contacts dans Notifications"
+#: ../../Zotlabs/Module/Common.php:14
+msgid "No channel."
+msgstr "Pas de canal."
-#: ../../Zotlabs/Module/Settings/Channel.php:561
-msgid "Notify me of events this many days in advance"
-msgstr "Me prévenir d’événements à venir tant de jours en avance"
+#: ../../Zotlabs/Module/Common.php:43
+msgid "Common connections"
+msgstr "Contacts en commun"
-#: ../../Zotlabs/Module/Settings/Channel.php:561
-msgid "Must be greater than 0"
-msgstr "Doit être supérieur à 0"
+#: ../../Zotlabs/Module/Common.php:48
+msgid "No connections in common."
+msgstr "Pas de contacts en commun."
-#: ../../Zotlabs/Module/Settings/Channel.php:567
-msgid "Advanced Account/Page Type Settings"
-msgstr "Paramètres avancés de compte/type de page"
+#: ../../Zotlabs/Module/Viewconnections.php:65
+msgid "No connections."
+msgstr "Aucun contact."
-#: ../../Zotlabs/Module/Settings/Channel.php:568
-msgid "Change the behaviour of this account for special situations"
-msgstr "Modifie le comportement de ce compte pour des situations particulières"
+#: ../../Zotlabs/Module/Viewconnections.php:78
+#, php-format
+msgid "Visit %s's profile [%s]"
+msgstr "Visiter le profil de %s [%s]"
-#: ../../Zotlabs/Module/Settings/Channel.php:570
-msgid "Miscellaneous Settings"
-msgstr "Paramètres divers"
+#: ../../Zotlabs/Module/Viewconnections.php:107
+msgid "View Connections"
+msgstr "Voir les contacts"
-#: ../../Zotlabs/Module/Settings/Channel.php:571
-msgid "Default photo upload folder"
-msgstr "Répertoire par défaut pour les photos téléversées"
+#: ../../Zotlabs/Module/Admin.php:94
+msgid "# Accounts"
+msgstr "# Comptes"
-#: ../../Zotlabs/Module/Settings/Channel.php:571
-#: ../../Zotlabs/Module/Settings/Channel.php:572
-msgid "%Y - current year, %m - current month"
-msgstr "%Y - année en cours, %m - mois en cours"
+#: ../../Zotlabs/Module/Admin.php:95
+msgid "# blocked accounts"
+msgstr "# comptes bloqués"
-#: ../../Zotlabs/Module/Settings/Channel.php:572
-msgid "Default file upload folder"
-msgstr "Répertoire par défaut pour les fichiers téléversés"
+#: ../../Zotlabs/Module/Admin.php:96
+msgid "# expired accounts"
+msgstr "# comptes expirés"
-#: ../../Zotlabs/Module/Settings/Channel.php:574
-msgid "Personal menu to display in your channel pages"
-msgstr "Menu personnel à afficher sur les pages de votre canal"
+#: ../../Zotlabs/Module/Admin.php:97
+msgid "# expiring accounts"
+msgstr "# comptes expirant"
-#: ../../Zotlabs/Module/Settings/Channel.php:576
-msgid "Remove this channel."
-msgstr "Supprimer ce canal"
+#: ../../Zotlabs/Module/Admin.php:108
+msgid "# Channels"
+msgstr "# Canaux"
-#: ../../Zotlabs/Module/Settings/Channel.php:577
-msgid "Firefox Share $Projectname provider"
-msgstr "Connecteur $Projectname pour Firefox Share"
+#: ../../Zotlabs/Module/Admin.php:109
+msgid "# primary"
+msgstr "# primaire"
-#: ../../Zotlabs/Module/Settings/Channel.php:578
-msgid "Start calendar week on monday"
-msgstr "Commencer la semaine du calendrier le lundi"
+#: ../../Zotlabs/Module/Admin.php:110
+msgid "# clones"
+msgstr "# clones"
-#: ../../Zotlabs/Module/Settings/Display.php:137
-msgid "No special theme for mobile devices"
-msgstr "Pas de thème spécifique aux mobiles"
+#: ../../Zotlabs/Module/Admin.php:116
+msgid "Message queues"
+msgstr "File des messages"
-#: ../../Zotlabs/Module/Settings/Display.php:140
-#, php-format
-msgid "%s - (Experimental)"
-msgstr "%s - (Expérimental)"
+#: ../../Zotlabs/Module/Admin.php:133
+msgid "Your software should be updated"
+msgstr "Votre logiciel doit d'être mis à jour"
-#: ../../Zotlabs/Module/Settings/Display.php:191
-msgid "Display Settings"
-msgstr "Afficher les paramètres"
+#: ../../Zotlabs/Module/Admin.php:138
+msgid "Summary"
+msgstr "Résumé"
-#: ../../Zotlabs/Module/Settings/Display.php:192
-msgid "Theme Settings"
-msgstr "Paramètres du thème"
+#: ../../Zotlabs/Module/Admin.php:141
+msgid "Registered accounts"
+msgstr "Comptes enregistrés"
-#: ../../Zotlabs/Module/Settings/Display.php:193
-msgid "Custom Theme Settings"
-msgstr "Paramètres personnels du thème"
+#: ../../Zotlabs/Module/Admin.php:142
+msgid "Pending registrations"
+msgstr "Inscriptions en attente"
-#: ../../Zotlabs/Module/Settings/Display.php:194
-msgid "Content Settings"
-msgstr "Paramètres liés au contenu"
+#: ../../Zotlabs/Module/Admin.php:143
+msgid "Registered channels"
+msgstr "Canaux enregistrés"
-#: ../../Zotlabs/Module/Settings/Display.php:200
-msgid "Display Theme:"
-msgstr "Afficher le thème&nbsp;:"
+#: ../../Zotlabs/Module/Admin.php:144
+msgid "Active plugins"
+msgstr "Greffons actifs"
-#: ../../Zotlabs/Module/Settings/Display.php:201
-msgid "Select scheme"
-msgstr "Définir la palette de couleurs"
+#: ../../Zotlabs/Module/Admin.php:145
+msgid "Version"
+msgstr "Version"
-#: ../../Zotlabs/Module/Settings/Display.php:203
-msgid "Mobile Theme:"
-msgstr "Thème mobile&nbsp;:"
+#: ../../Zotlabs/Module/Admin.php:146
+msgid "Repository version (master)"
+msgstr "Version du dépôt (maître)"
-#: ../../Zotlabs/Module/Settings/Display.php:204
-msgid "Preload images before rendering the page"
-msgstr "Pré-charger les images avant d'afficher la page"
+#: ../../Zotlabs/Module/Admin.php:147
+msgid "Repository version (dev)"
+msgstr "Version du dépôt (développeur)"
-#: ../../Zotlabs/Module/Settings/Display.php:204
-msgid ""
-"The subjective page load time will be longer but the page will be ready when"
-" displayed"
-msgstr "Le temps de charge perçu de la page sera plus long mais la page sera complète quand elle s'affichera"
+#: ../../Zotlabs/Module/Service_limits.php:23
+msgid "No service class restrictions found."
+msgstr "Aucune restriction de classe de service trouvée."
-#: ../../Zotlabs/Module/Settings/Display.php:205
-msgid "Enable user zoom on mobile devices"
-msgstr "Permettre à l'utilisateur d'un mobile d'agrandir le contenu"
+#: ../../Zotlabs/Module/Rate.php:156
+msgid "Website:"
+msgstr "Site web&nbsp;:"
-#: ../../Zotlabs/Module/Settings/Display.php:206
-msgid "Update browser every xx seconds"
-msgstr "Mettre à jour le navigateur toutes les xx secondes"
+#: ../../Zotlabs/Module/Rate.php:159
+#, php-format
+msgid "Remote Channel [%s] (not yet known on this site)"
+msgstr "Canal distant [%s] (encore inconnu sur ce site)"
-#: ../../Zotlabs/Module/Settings/Display.php:206
-msgid "Minimum of 10 seconds, no maximum"
-msgstr "Minimum 10 secondes, pas de maximum"
+#: ../../Zotlabs/Module/Rate.php:160
+msgid "Rating (this information is public)"
+msgstr "Evaluation (cette information est publique)"
-#: ../../Zotlabs/Module/Settings/Display.php:207
-msgid "Maximum number of conversations to load at any time:"
-msgstr "Nombre maximal de conversations pouvant être chargées en même temps&nbsp;:"
+#: ../../Zotlabs/Module/Rate.php:161
+msgid "Optionally explain your rating (this information is public)"
+msgstr "Explication facultative de votre évaluation (cette information est publique)"
-#: ../../Zotlabs/Module/Settings/Display.php:207
-msgid "Maximum of 100 items"
-msgstr "100 éléments au maximum"
+#: ../../Zotlabs/Module/Lostpass.php:19
+msgid "No valid account found."
+msgstr "Aucun compte valide trouvé."
-#: ../../Zotlabs/Module/Settings/Display.php:208
-msgid "Show emoticons (smilies) as images"
-msgstr "Remplacer les émoticônes (smileys) par des images"
+#: ../../Zotlabs/Module/Lostpass.php:33
+msgid "Password reset request issued. Check your email."
+msgstr "Demande de réinitialisation du mot de passe envoyée. Vérifiez vos courriels."
-#: ../../Zotlabs/Module/Settings/Display.php:209
-msgid "Manual conversation updates"
-msgstr "Manuel de mises à jour des conversations"
+#: ../../Zotlabs/Module/Lostpass.php:39 ../../Zotlabs/Module/Lostpass.php:108
+#, php-format
+msgid "Site Member (%s)"
+msgstr "Membre du site (%s)"
-#: ../../Zotlabs/Module/Settings/Display.php:209
-msgid "Default is on, turning this off may increase screen jumping"
-msgstr "Activé par défaut, le désactiver peut accroître les sauts d'écran"
+#: ../../Zotlabs/Module/Lostpass.php:44 ../../Zotlabs/Module/Lostpass.php:49
+#, php-format
+msgid "Password reset requested at %s"
+msgstr "Demande de réinitialisation du mot de passe sur %s"
-#: ../../Zotlabs/Module/Settings/Display.php:210
-msgid "Link post titles to source"
-msgstr "Lier les titres des publications à leur source"
+#: ../../Zotlabs/Module/Lostpass.php:68
+msgid ""
+"Request could not be verified. (You may have previously submitted it.) "
+"Password reset failed."
+msgstr "La demande n'a pas pu être vérifiée. (Peut-être l'avez vous déjà utilisée.) La réinitialisation a échoué."
-#: ../../Zotlabs/Module/Settings/Display.php:211
-msgid "System Page Layout Editor - (advanced)"
-msgstr "Editeur de mise en page des pages systèmes - (avancé)"
+#: ../../Zotlabs/Module/Lostpass.php:91 ../../boot.php:1639
+msgid "Password Reset"
+msgstr "Réinitialiser le mot de passe"
-#: ../../Zotlabs/Module/Settings/Display.php:214
-msgid "Use blog/list mode on channel page"
-msgstr "Utiliser le mode blog/liste sur la page du canal"
+#: ../../Zotlabs/Module/Lostpass.php:92
+msgid "Your password has been reset as requested."
+msgstr "Votre mot de passe a bien été réinitialisé."
-#: ../../Zotlabs/Module/Settings/Display.php:214
-#: ../../Zotlabs/Module/Settings/Display.php:215
-msgid "(comments displayed separately)"
-msgstr "(commentaires affichés séparément)"
+#: ../../Zotlabs/Module/Lostpass.php:93
+msgid "Your new password is"
+msgstr "Votre nouveau mot de passe est"
-#: ../../Zotlabs/Module/Settings/Display.php:215
-msgid "Use blog/list mode on grid page"
-msgstr "Utiliser le mode blog/liste sur la page du réseau"
+#: ../../Zotlabs/Module/Lostpass.php:94
+msgid "Save or copy your new password - and then"
+msgstr "Enregistrez ou copiez votre nouveau mot de passe, puis"
-#: ../../Zotlabs/Module/Settings/Display.php:216
-msgid "Channel page max height of content (in pixels)"
-msgstr "Hauteur maximale du contenu pour la page du canal (en pixels)"
+#: ../../Zotlabs/Module/Lostpass.php:95
+msgid "click here to login"
+msgstr "cliquez ici pour vous connecter"
-#: ../../Zotlabs/Module/Settings/Display.php:216
-#: ../../Zotlabs/Module/Settings/Display.php:217
-msgid "click to expand content exceeding this height"
-msgstr "cliquer pour dérouler le contenu dépassant cette limite"
+#: ../../Zotlabs/Module/Lostpass.php:96
+msgid ""
+"Your password may be changed from the <em>Settings</em> page after "
+"successful login."
+msgstr "Votre mot de passe peut être changé depuis la page des <em>Paramètres</em> une fois connecté."
-#: ../../Zotlabs/Module/Settings/Display.php:217
-msgid "Grid page max height of content (in pixels)"
-msgstr "Hauteur maximale du contenu sur la page du réseau (en pixels)"
+#: ../../Zotlabs/Module/Lostpass.php:117
+#, php-format
+msgid "Your password has changed at %s"
+msgstr "Votre mot de passe de %s a été changé"
-#: ../../Zotlabs/Module/Settings/Permcats.php:37
-msgid "Permission category saved."
-msgstr "Catégorie d'autorisation enregistrée."
+#: ../../Zotlabs/Module/Lostpass.php:130
+msgid "Forgot your Password?"
+msgstr "Mot de passe oublié&nbsp;?"
-#: ../../Zotlabs/Module/Settings/Permcats.php:63
+#: ../../Zotlabs/Module/Lostpass.php:131
msgid ""
-"Use this form to create permission rules for various classes of people or "
-"connections."
-msgstr "Utilisez ce formulaire pour créer des règles d'accès pour différentes catégories de personnes ou de contacts."
+"Enter your email address and submit to have your password reset. Then check "
+"your email for further instructions."
+msgstr "Saisissez votre adresse de courriel, et validez, pour réinitialiser votre mot de passe. Vérifiez ensuite votre boîte aux lettres pour la suite des instructions."
-#: ../../Zotlabs/Module/Settings/Permcats.php:96
-msgid "Permission Categories"
-msgstr "Catégories d'autorisation"
+#: ../../Zotlabs/Module/Lostpass.php:132
+msgid "Email Address"
+msgstr "Adresse de courriel"
-#: ../../Zotlabs/Module/Settings/Permcats.php:104
-msgid "Permission Name"
-msgstr "Nom de l'autorisation"
+#: ../../Zotlabs/Module/Lostpass.php:133
+msgid "Reset"
+msgstr "Réinitialiser"
-#: ../../Zotlabs/Module/Tagrm.php:48 ../../Zotlabs/Module/Tagrm.php:98
-msgid "Tag removed"
-msgstr "Étiquette retirée"
+#: ../../Zotlabs/Module/Notifications.php:43 ../../include/nav.php:186
+msgid "Mark all system notifications seen"
+msgstr "Marquer toutes les notifications système comme vues"
-#: ../../Zotlabs/Module/Tagrm.php:123
-msgid "Remove Item Tag"
-msgstr "Retirer une étiquette à l'élément"
+#: ../../Zotlabs/Lib/Apps.php:212
+msgid "Site Admin"
+msgstr "Administrateur"
-#: ../../Zotlabs/Module/Tagrm.php:125
-msgid "Select a tag to remove: "
-msgstr "Étiquette à retirer&nbsp;:"
+#: ../../Zotlabs/Lib/Apps.php:213 ../../addon/buglink/buglink.php:16
+msgid "Report Bug"
+msgstr "Reporter des bogues"
-#: ../../Zotlabs/Module/Thing.php:114
-msgid "Thing updated"
-msgstr "Elément mis à jour"
+#: ../../Zotlabs/Lib/Apps.php:214
+msgid "View Bookmarks"
+msgstr "Voir les marques-pages"
-#: ../../Zotlabs/Module/Thing.php:166
-msgid "Object store: failed"
-msgstr "Stockage de l'objet&nbsp;: échec"
+#: ../../Zotlabs/Lib/Apps.php:215
+msgid "My Chatrooms"
+msgstr "Mes salons de discussions"
-#: ../../Zotlabs/Module/Thing.php:170
-msgid "Thing added"
-msgstr "Elément ajouté"
+#: ../../Zotlabs/Lib/Apps.php:217
+msgid "Firefox Share"
+msgstr "Partager via Firefox"
-#: ../../Zotlabs/Module/Thing.php:196
-#, php-format
-msgid "OBJ: %1$s %2$s %3$s"
-msgstr "OBJ: %1$s %2$s %3$s"
+#: ../../Zotlabs/Lib/Apps.php:218
+msgid "Remote Diagnostics"
+msgstr "Diagnostiques à distance"
-#: ../../Zotlabs/Module/Thing.php:259
-msgid "Show Thing"
-msgstr "Montrer élément"
+#: ../../Zotlabs/Lib/Apps.php:219 ../../include/features.php:337
+msgid "Suggest Channels"
+msgstr "Suggérer des canaux"
-#: ../../Zotlabs/Module/Thing.php:266
-msgid "item not found."
-msgstr "élément introuvable."
+#: ../../Zotlabs/Lib/Apps.php:220 ../../boot.php:1631
+#: ../../include/nav.php:113
+msgid "Login"
+msgstr "Connexion"
-#: ../../Zotlabs/Module/Thing.php:299
-msgid "Edit Thing"
-msgstr "Modifier élément"
+#: ../../Zotlabs/Lib/Apps.php:222 ../../include/nav.php:172
+msgid "Grid"
+msgstr "Réseau"
-#: ../../Zotlabs/Module/Thing.php:301 ../../Zotlabs/Module/Thing.php:355
-msgid "Select a profile"
-msgstr "Choisissez un profil"
+#: ../../Zotlabs/Lib/Apps.php:226 ../../include/conversation.php:1848
+#: ../../include/features.php:99
+msgid "Wiki"
+msgstr "Wiki"
-#: ../../Zotlabs/Module/Thing.php:305 ../../Zotlabs/Module/Thing.php:358
-msgid "Post an activity"
-msgstr "Publier une activité"
+#: ../../Zotlabs/Lib/Apps.php:227 ../../include/nav.php:176
+msgid "Channel Home"
+msgstr "Mon canal"
-#: ../../Zotlabs/Module/Thing.php:305 ../../Zotlabs/Module/Thing.php:358
-msgid "Only sends to viewers of the applicable profile"
-msgstr "Envoie exclusivement aux visiteurs du profil concerné"
+#: ../../Zotlabs/Lib/Apps.php:230 ../../include/conversation.php:1793
+#: ../../include/conversation.php:1796 ../../include/nav.php:196
+msgid "Events"
+msgstr "Événements"
-#: ../../Zotlabs/Module/Thing.php:307 ../../Zotlabs/Module/Thing.php:360
-msgid "Name of thing e.g. something"
-msgstr "Nom de l'élément, p.ex. quelque-chose"
+#: ../../Zotlabs/Lib/Apps.php:231
+msgid "Directory"
+msgstr "Annuaire"
-#: ../../Zotlabs/Module/Thing.php:309 ../../Zotlabs/Module/Thing.php:361
-msgid "URL of thing (optional)"
-msgstr "URL de l'élément (facultatif)"
+#: ../../Zotlabs/Lib/Apps.php:233 ../../include/nav.php:188
+msgid "Mail"
+msgstr "Messages"
-#: ../../Zotlabs/Module/Thing.php:311 ../../Zotlabs/Module/Thing.php:362
-msgid "URL for photo of thing (optional)"
-msgstr "URL d'une photo de l'élément (facultatif)"
+#: ../../Zotlabs/Lib/Apps.php:236
+msgid "Chat"
+msgstr "Clavardage"
-#: ../../Zotlabs/Module/Thing.php:353
-msgid "Add Thing to your Profile"
-msgstr "Ajouter l'élément à votre profil"
+#: ../../Zotlabs/Lib/Apps.php:238
+msgid "Probe"
+msgstr "Sonder"
-#: ../../Zotlabs/Module/Mail.php:65
-msgid "Unable to lookup recipient."
-msgstr "Impossible de localiser le destinataire."
+#: ../../Zotlabs/Lib/Apps.php:239
+msgid "Suggest"
+msgstr "Suggérer"
-#: ../../Zotlabs/Module/Mail.php:72
-msgid "Unable to communicate with requested channel."
-msgstr "Impossible de communiquer avec le canal demandé."
+#: ../../Zotlabs/Lib/Apps.php:240
+msgid "Random Channel"
+msgstr "Un canal au hasard"
-#: ../../Zotlabs/Module/Mail.php:79
-msgid "Cannot verify requested channel."
-msgstr "Impossible de vérifier le canal demandé."
+#: ../../Zotlabs/Lib/Apps.php:241
+msgid "Invite"
+msgstr "Invitation"
-#: ../../Zotlabs/Module/Mail.php:97
-msgid "Selected channel has private message restrictions. Send failed."
-msgstr "Le canal choisi a des restrictions quant aux messages privés. L'envoi a échoué."
+#: ../../Zotlabs/Lib/Apps.php:242 ../../Zotlabs/Widget/Admin.php:26
+msgid "Features"
+msgstr "Fonctionalités"
-#: ../../Zotlabs/Module/Mail.php:178
-msgid "Messages"
-msgstr "Messages"
+#: ../../Zotlabs/Lib/Apps.php:243 ../../addon/openid/MysqlProvider.php:69
+msgid "Language"
+msgstr "Langue"
-#: ../../Zotlabs/Module/Mail.php:213
-msgid "Message recalled."
-msgstr "Message rappelé."
+#: ../../Zotlabs/Lib/Apps.php:244
+msgid "Post"
+msgstr "Envoyer"
-#: ../../Zotlabs/Module/Mail.php:226
-msgid "Conversation removed."
-msgstr "Conversation supprimée."
+#: ../../Zotlabs/Lib/Apps.php:245 ../../addon/openid/MysqlProvider.php:58
+#: ../../addon/openid/MysqlProvider.php:59
+#: ../../addon/openid/MysqlProvider.php:60
+msgid "Profile Photo"
+msgstr "Photo du Profil"
-#: ../../Zotlabs/Module/Mail.php:240 ../../Zotlabs/Module/Mail.php:349
-#: ../../Zotlabs/Module/Chat.php:205 ../../include/conversation.php:1330
-msgid "Please enter a link URL:"
-msgstr "Merci d'entrer l'URL d'un lien&nbsp;:"
+#: ../../Zotlabs/Lib/Apps.php:355
+msgid "Purchase"
+msgstr "Acheter"
-#: ../../Zotlabs/Module/Mail.php:241 ../../Zotlabs/Module/Mail.php:350
-msgid "Expires YYYY-MM-DD HH:MM"
-msgstr "Expire le YYYY-MM-DD à HH:MM"
+#: ../../Zotlabs/Lib/Apps.php:359
+msgid "Undelete"
+msgstr "Restaurer"
-#: ../../Zotlabs/Module/Mail.php:269
-msgid "Requested channel is not in this network"
-msgstr "Le canal demandé n'est pas sur ce réseau"
+#: ../../Zotlabs/Lib/Apps.php:364
+msgid "Add to app-tray"
+msgstr ""
-#: ../../Zotlabs/Module/Mail.php:277
-msgid "Send Private Message"
-msgstr "Envoyer un message privé"
+#: ../../Zotlabs/Lib/Apps.php:365
+msgid "Remove from app-tray"
+msgstr ""
-#: ../../Zotlabs/Module/Mail.php:278 ../../Zotlabs/Module/Mail.php:403
-msgid "To:"
-msgstr "À&nbsp;:"
+#: ../../Zotlabs/Lib/Permcat.php:58
+msgctxt "permcat"
+msgid "default"
+msgstr "défaut"
-#: ../../Zotlabs/Module/Mail.php:281 ../../Zotlabs/Module/Mail.php:405
-msgid "Subject:"
-msgstr "Objet&nbsp;:"
+#: ../../Zotlabs/Lib/Permcat.php:96
+msgctxt "permcat"
+msgid "follower"
+msgstr "abonné"
-#: ../../Zotlabs/Module/Mail.php:286 ../../Zotlabs/Module/Mail.php:411
-#: ../../include/conversation.php:1390
-msgid "Attach file"
-msgstr "Joindre un fichier"
+#: ../../Zotlabs/Lib/Permcat.php:100
+msgctxt "permcat"
+msgid "contributor"
+msgstr "contributeur"
-#: ../../Zotlabs/Module/Mail.php:288
-msgid "Send"
-msgstr "Envoyer"
+#: ../../Zotlabs/Lib/Permcat.php:104
+msgctxt "permcat"
+msgid "publisher"
+msgstr "rédacteur"
-#: ../../Zotlabs/Module/Mail.php:291 ../../Zotlabs/Module/Mail.php:416
-#: ../../include/conversation.php:1435
-msgid "Set expiration date"
-msgstr "Définir la date d'expiration"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:31
+#: ../../Zotlabs/Lib/NativeWikiPage.php:72
+msgid "(No Title)"
+msgstr "(Pas de titre)"
-#: ../../Zotlabs/Module/Mail.php:293 ../../Zotlabs/Module/Mail.php:418
-#: ../../Zotlabs/Module/Chat.php:206 ../../Zotlabs/Lib/ThreadItem.php:743
-#: ../../include/conversation.php:1440
-msgid "Encrypt text"
-msgstr "Chiffrer le texte"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:86
+msgid "Wiki page create failed."
+msgstr "Échec de création de la page wiki."
-#: ../../Zotlabs/Module/Mail.php:375
-msgid "Delete message"
-msgstr "Supprimer le message"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:99
+msgid "Wiki not found."
+msgstr "Wiki introuvable."
-#: ../../Zotlabs/Module/Mail.php:376
-msgid "Delivery report"
-msgstr "Rapport de distribution"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:110
+msgid "Destination name already exists"
+msgstr "Le nom de destination est déjà pris"
-#: ../../Zotlabs/Module/Mail.php:377
-msgid "Recall message"
-msgstr "Rappeler le message"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:136
+#: ../../Zotlabs/Lib/NativeWikiPage.php:331
+msgid "Page not found"
+msgstr "Page introuvable"
-#: ../../Zotlabs/Module/Mail.php:379
-msgid "Message has been recalled."
-msgstr "Le message a été rappelé."
+#: ../../Zotlabs/Lib/NativeWikiPage.php:166
+msgid "Error reading page content"
+msgstr "Erreur de lecture du contenu de la page"
-#: ../../Zotlabs/Module/Mail.php:396
-msgid "Delete Conversation"
-msgstr "Supprimer la conversation"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:322
+#: ../../Zotlabs/Lib/NativeWikiPage.php:370
+#: ../../Zotlabs/Lib/NativeWikiPage.php:437
+#: ../../Zotlabs/Lib/NativeWikiPage.php:478
+msgid "Error reading wiki"
+msgstr "Erreur de lecture du wiki"
-#: ../../Zotlabs/Module/Mail.php:398
-msgid ""
-"No secure communications available. You <strong>may</strong> be able to "
-"respond from the sender's profile page."
-msgstr "Aucune communication sécurisée n'est possible. Vous pourrez <strong>peut-être</strong> répondre depuis la page de profil de l'émetteur."
+#: ../../Zotlabs/Lib/NativeWikiPage.php:358
+msgid "Page update failed."
+msgstr "Echec de modification de la page."
-#: ../../Zotlabs/Module/Mail.php:402
-msgid "Send Reply"
-msgstr "Envoyer la réponse"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:392
+msgid "Nothing deleted"
+msgstr "Rien n'a été supprimé"
-#: ../../Zotlabs/Module/Mail.php:407
-#, php-format
-msgid "Your message for %s (%s):"
-msgstr "Votre message pour %s (%s)&nbsp;:"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:458
+msgid "Compare: object not found."
+msgstr "Comparaison&nbsp;: objet introuvable."
-#: ../../Zotlabs/Module/Viewconnections.php:65
-msgid "No connections."
-msgstr "Aucun contact."
+#: ../../Zotlabs/Lib/NativeWikiPage.php:464
+msgid "Page updated"
+msgstr "Page modifiée"
-#: ../../Zotlabs/Module/Viewconnections.php:78
-#, php-format
-msgid "Visit %s's profile [%s]"
-msgstr "Visiter le profil de %s [%s]"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:467
+msgid "Untitled"
+msgstr "Sans titre"
-#: ../../Zotlabs/Module/Viewconnections.php:107
-msgid "View Connections"
-msgstr "Voir les contacts"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:473
+msgid "Wiki resource_id required for git commit"
+msgstr "\"resource_id\" du wiki nécessaire pour l'enregistrement dans git."
-#: ../../Zotlabs/Module/Viewsrc.php:44
-msgid "Source of Item"
-msgstr "Source de l'élément"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:529
+#: ../../Zotlabs/Widget/Wiki_page_history.php:23
+msgctxt "wiki_history"
+msgid "Message"
+msgstr "Message"
-#: ../../Zotlabs/Module/Chat.php:181
-msgid "Room not found"
-msgstr "Salon introuvable"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:567
+#: ../../addon/gitwiki/gitwiki_backend.php:579 ../../include/bbcode.php:610
+#: ../../include/bbcode.php:756
+msgid "Different viewers will see this text differently"
+msgstr "Ce texte aura un rendu différent en fonction des utilisateurs"
-#: ../../Zotlabs/Module/Chat.php:197
-msgid "Leave Room"
-msgstr "Quitter le salon"
+#: ../../Zotlabs/Lib/PermissionDescription.php:34
+#: ../../include/acl_selectors.php:128
+msgid "Visible to your default audience"
+msgstr "Visible pour vos contacts seulement"
-#: ../../Zotlabs/Module/Chat.php:198
-msgid "Delete Room"
-msgstr "Supprimer le salon"
+#: ../../Zotlabs/Lib/PermissionDescription.php:107
+#: ../../include/acl_selectors.php:201
+msgid "Only me"
+msgstr "Seulement moi"
-#: ../../Zotlabs/Module/Chat.php:199
-msgid "I am away right now"
-msgstr "Je suis absent en ce moment"
+#: ../../Zotlabs/Lib/PermissionDescription.php:108
+msgid "Public"
+msgstr "Public"
-#: ../../Zotlabs/Module/Chat.php:200
-msgid "I am online"
-msgstr "Je suis en ligne"
+#: ../../Zotlabs/Lib/PermissionDescription.php:109
+msgid "Anybody in the $Projectname network"
+msgstr "N'importe qui dans le réseau de $Projectname"
-#: ../../Zotlabs/Module/Chat.php:202
-msgid "Bookmark this room"
-msgstr "Marquer ce salon comme favori"
+#: ../../Zotlabs/Lib/PermissionDescription.php:110
+#, php-format
+msgid "Any account on %s"
+msgstr "N'importe quel compte sur %s"
-#: ../../Zotlabs/Module/Chat.php:231
-msgid "New Chatroom"
-msgstr "Nouveau salon de discussion"
+#: ../../Zotlabs/Lib/PermissionDescription.php:111
+msgid "Any of my connections"
+msgstr "N'importe laquelle de mes connexions"
-#: ../../Zotlabs/Module/Chat.php:232
-msgid "Chatroom name"
-msgstr "Nom du salon de conversation"
+#: ../../Zotlabs/Lib/PermissionDescription.php:112
+msgid "Only connections I specifically allow"
+msgstr "Uniquement les connexions que j'ai expréssément autorisées"
-#: ../../Zotlabs/Module/Chat.php:233
-msgid "Expiration of chats (minutes)"
-msgstr "Expiration des discussions (en minutes)"
+#: ../../Zotlabs/Lib/PermissionDescription.php:113
+msgid "Anybody authenticated (could include visitors from other networks)"
+msgstr "N'importe qui d'authentifié (cela peut inclure des visiteurs d'autres réseaux)"
-#: ../../Zotlabs/Module/Chat.php:249
-#, php-format
-msgid "%1$s's Chatrooms"
-msgstr "Salons de %1$s"
+#: ../../Zotlabs/Lib/PermissionDescription.php:114
+msgid "Any connections including those who haven't yet been approved"
+msgstr "N'importe quelle connexions, y compris celles qui n'ont pas encore été approuvées"
-#: ../../Zotlabs/Module/Chat.php:254
-msgid "No chatrooms available"
-msgstr "Aucun salon de conversation disponible"
+#: ../../Zotlabs/Lib/PermissionDescription.php:150
+msgid ""
+"This is your default setting for the audience of your normal stream, and "
+"posts."
+msgstr "Ceci est votre réglage par défaut de l'audience de vos publications sur votre canal normal."
-#: ../../Zotlabs/Module/Chat.php:258
-msgid "Expiration"
-msgstr "Expiration"
+#: ../../Zotlabs/Lib/PermissionDescription.php:151
+msgid ""
+"This is your default setting for who can view your default channel profile"
+msgstr "Ceci est votre réglage par défaut à propos de qui peut voir votre canal de profil par défaut."
-#: ../../Zotlabs/Module/Chat.php:259
-msgid "min"
-msgstr "min"
+#: ../../Zotlabs/Lib/PermissionDescription.php:152
+msgid "This is your default setting for who can view your connections"
+msgstr "Ceci est votre réglage par défaut à propos de qui peut voir vos relations."
-#: ../../Zotlabs/Module/Xchan.php:10
-msgid "Xchan Lookup"
-msgstr "Recherche xchan"
+#: ../../Zotlabs/Lib/PermissionDescription.php:153
+msgid ""
+"This is your default setting for who can view your file storage and photos"
+msgstr "Ceci est votre réglage par défaut à propos de qui peut voir vos fichiers ou photos stocké(e)s"
-#: ../../Zotlabs/Module/Xchan.php:13
-msgid "Lookup xchan beginning with (or webbie): "
-msgstr "Recherche xchan commençant par (ou adresse \"webbie\")&nbsp;:"
+#: ../../Zotlabs/Lib/PermissionDescription.php:154
+msgid "This is your default setting for the audience of your webpages"
+msgstr "Ceci est votre réglage par défaut de l'audience de vos pages web."
#: ../../Zotlabs/Lib/Chatroom.php:27
msgid "Missing room name"
@@ -7216,22 +7323,21 @@ msgstr "Salon introuvable."
msgid "Room is full"
msgstr "Le salon est plein"
-#: ../../Zotlabs/Lib/Enotify.php:60 ../../include/network.php:1924
+#: ../../Zotlabs/Lib/Enotify.php:60 ../../include/network.php:1947
msgid "$Projectname Notification"
msgstr "Notification $Projectname"
-#: ../../Zotlabs/Lib/Enotify.php:61 ../../extend/addon/addon/diaspora/p.php:46
-#: ../../extend/addon/addon/diaspora/util.php:218
-#: ../../extend/addon/addon/diaspora/util.php:231
-#: ../../include/network.php:1925
+#: ../../Zotlabs/Lib/Enotify.php:61 ../../addon/diaspora/util.php:218
+#: ../../addon/diaspora/util.php:231 ../../addon/diaspora/p.php:46
+#: ../../include/network.php:1948
msgid "$projectname"
msgstr "$projectname"
-#: ../../Zotlabs/Lib/Enotify.php:63 ../../include/network.php:1927
+#: ../../Zotlabs/Lib/Enotify.php:63 ../../include/network.php:1950
msgid "Thank You,"
msgstr "Merci,"
-#: ../../Zotlabs/Lib/Enotify.php:65 ../../include/network.php:1929
+#: ../../Zotlabs/Lib/Enotify.php:65 ../../include/network.php:1952
#, php-format
msgid "%s Administrator"
msgstr "l'administrateur de %s"
@@ -7439,192 +7545,139 @@ msgstr "a publié un nouveau message"
msgid "commented on %s's post"
msgstr "a commenté la publication de %s"
-#: ../../Zotlabs/Lib/PermissionDescription.php:34
-#: ../../include/acl_selectors.php:128
-msgid "Visible to your default audience"
-msgstr "Visible pour vos contacts seulement"
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:107
-#: ../../include/acl_selectors.php:201
-msgid "Only me"
-msgstr "Seulement moi"
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:108
-msgid "Public"
-msgstr "Public"
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:109
-msgid "Anybody in the $Projectname network"
-msgstr "N'importe qui dans le réseau de $Projectname"
+#: ../../Zotlabs/Lib/NativeWiki.php:128
+msgid "Wiki files deleted successfully"
+msgstr "Fichiers du wiki supprimés avec succès"
-#: ../../Zotlabs/Lib/PermissionDescription.php:110
+#: ../../Zotlabs/Lib/DB_Upgrade.php:93
#, php-format
-msgid "Any account on %s"
-msgstr "N'importe quel compte sur %s"
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:111
-msgid "Any of my connections"
-msgstr "N'importe laquelle de mes connexions"
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:112
-msgid "Only connections I specifically allow"
-msgstr "Uniquement les connexions que j'ai expréssément autorisées"
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:113
-msgid "Anybody authenticated (could include visitors from other networks)"
-msgstr "N'importe qui d'authentifié (cela peut inclure des visiteurs d'autres réseaux)"
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:114
-msgid "Any connections including those who haven't yet been approved"
-msgstr "N'importe quelle connexions, y compris celles qui n'ont pas encore été approuvées"
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:150
-msgid ""
-"This is your default setting for the audience of your normal stream, and "
-"posts."
-msgstr "Ceci est votre réglage par défaut de l'audience de vos publications sur votre canal normal."
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:151
-msgid ""
-"This is your default setting for who can view your default channel profile"
-msgstr "Ceci est votre réglage par défaut à propos de qui peut voir votre canal de profil par défaut."
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:152
-msgid "This is your default setting for who can view your connections"
-msgstr "Ceci est votre réglage par défaut à propos de qui peut voir vos relations."
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:153
-msgid ""
-"This is your default setting for who can view your file storage and photos"
-msgstr "Ceci est votre réglage par défaut à propos de qui peut voir vos fichiers ou photos stocké(e)s"
+msgid "Update Error at %s"
+msgstr "Erreur de mise à jour sur %s"
-#: ../../Zotlabs/Lib/PermissionDescription.php:154
-msgid "This is your default setting for the audience of your webpages"
-msgstr "Ceci est votre réglage par défaut de l'audience de vos pages web."
+#: ../../Zotlabs/Lib/DB_Upgrade.php:99
+#, php-format
+msgid "Update %s failed. See error logs."
+msgstr "La mise-à-jour %s a échoué. Merci de consulter les journaux d'erreur."
-#: ../../Zotlabs/Lib/ThreadItem.php:95 ../../include/conversation.php:663
+#: ../../Zotlabs/Lib/ThreadItem.php:96 ../../include/conversation.php:661
msgid "Private Message"
msgstr "Message Privé"
-#: ../../Zotlabs/Lib/ThreadItem.php:132 ../../include/conversation.php:655
+#: ../../Zotlabs/Lib/ThreadItem.php:133 ../../include/conversation.php:653
msgid "Select"
msgstr "Sélectionner"
-#: ../../Zotlabs/Lib/ThreadItem.php:136
-msgid "Save to Folder"
-msgstr "Enregistrer dans le dossier"
-
-#: ../../Zotlabs/Lib/ThreadItem.php:157
+#: ../../Zotlabs/Lib/ThreadItem.php:158
msgid "I will attend"
msgstr "Je participerai"
-#: ../../Zotlabs/Lib/ThreadItem.php:157
+#: ../../Zotlabs/Lib/ThreadItem.php:158
msgid "I will not attend"
msgstr "Je ne participerai pas"
-#: ../../Zotlabs/Lib/ThreadItem.php:157
+#: ../../Zotlabs/Lib/ThreadItem.php:158
msgid "I might attend"
msgstr "Je participerai peut-être"
-#: ../../Zotlabs/Lib/ThreadItem.php:167
+#: ../../Zotlabs/Lib/ThreadItem.php:168
msgid "I agree"
msgstr "Je suis d'accord"
-#: ../../Zotlabs/Lib/ThreadItem.php:167
+#: ../../Zotlabs/Lib/ThreadItem.php:168
msgid "I disagree"
msgstr "Je ne suis pas d'accord"
-#: ../../Zotlabs/Lib/ThreadItem.php:167
+#: ../../Zotlabs/Lib/ThreadItem.php:168
msgid "I abstain"
msgstr "Je m'abstiens"
-#: ../../Zotlabs/Lib/ThreadItem.php:223
+#: ../../Zotlabs/Lib/ThreadItem.php:224
msgid "Add Star"
-msgstr "Mettre en avant (étoile)"
+msgstr "Mettre de côté (étoile)"
-#: ../../Zotlabs/Lib/ThreadItem.php:224
+#: ../../Zotlabs/Lib/ThreadItem.php:225
msgid "Remove Star"
-msgstr "Ne plus mettre en avant"
+msgstr "Ne plus mettre de côté"
-#: ../../Zotlabs/Lib/ThreadItem.php:225
+#: ../../Zotlabs/Lib/ThreadItem.php:226
msgid "Toggle Star Status"
msgstr "(Dés)activer l'étoile"
-#: ../../Zotlabs/Lib/ThreadItem.php:229
+#: ../../Zotlabs/Lib/ThreadItem.php:230
msgid "starred"
-msgstr "mis en avant"
+msgstr "mis de côté"
-#: ../../Zotlabs/Lib/ThreadItem.php:239 ../../include/conversation.php:670
+#: ../../Zotlabs/Lib/ThreadItem.php:240 ../../include/conversation.php:668
msgid "Message signature validated"
msgstr "Signature du message validée"
-#: ../../Zotlabs/Lib/ThreadItem.php:240 ../../include/conversation.php:671
+#: ../../Zotlabs/Lib/ThreadItem.php:241 ../../include/conversation.php:669
msgid "Message signature incorrect"
msgstr "Signature du message incorrecte"
-#: ../../Zotlabs/Lib/ThreadItem.php:248
+#: ../../Zotlabs/Lib/ThreadItem.php:249
msgid "Add Tag"
msgstr "Ajouter une étiquette"
-#: ../../Zotlabs/Lib/ThreadItem.php:268 ../../include/taxonomy.php:316
+#: ../../Zotlabs/Lib/ThreadItem.php:269 ../../include/taxonomy.php:316
msgid "like"
msgstr "aiment"
-#: ../../Zotlabs/Lib/ThreadItem.php:269 ../../include/taxonomy.php:317
+#: ../../Zotlabs/Lib/ThreadItem.php:270 ../../include/taxonomy.php:317
msgid "dislike"
msgstr "n'aiment pas"
-#: ../../Zotlabs/Lib/ThreadItem.php:273
+#: ../../Zotlabs/Lib/ThreadItem.php:274
msgid "Share This"
msgstr "Partager"
-#: ../../Zotlabs/Lib/ThreadItem.php:273
+#: ../../Zotlabs/Lib/ThreadItem.php:274
msgid "share"
msgstr "partager"
-#: ../../Zotlabs/Lib/ThreadItem.php:282
+#: ../../Zotlabs/Lib/ThreadItem.php:283
msgid "Delivery Report"
msgstr "Rapport de distribution"
-#: ../../Zotlabs/Lib/ThreadItem.php:300
+#: ../../Zotlabs/Lib/ThreadItem.php:301
#, php-format
msgid "%d comment"
msgid_plural "%d comments"
msgstr[0] "%d commentaire"
msgstr[1] "%d commentaires"
-#: ../../Zotlabs/Lib/ThreadItem.php:329 ../../Zotlabs/Lib/ThreadItem.php:330
+#: ../../Zotlabs/Lib/ThreadItem.php:330 ../../Zotlabs/Lib/ThreadItem.php:331
#, php-format
msgid "View %s's profile - %s"
msgstr "Voir le profil de %s - %s"
-#: ../../Zotlabs/Lib/ThreadItem.php:333
+#: ../../Zotlabs/Lib/ThreadItem.php:334
msgid "to"
msgstr "à"
-#: ../../Zotlabs/Lib/ThreadItem.php:334
+#: ../../Zotlabs/Lib/ThreadItem.php:335
msgid "via"
msgstr "via"
-#: ../../Zotlabs/Lib/ThreadItem.php:335
+#: ../../Zotlabs/Lib/ThreadItem.php:336
msgid "Wall-to-Wall"
msgstr "Mur-à-mur"
-#: ../../Zotlabs/Lib/ThreadItem.php:336
+#: ../../Zotlabs/Lib/ThreadItem.php:337
msgid "via Wall-To-Wall:"
msgstr "par Mur-à-mur&nbsp;:"
-#: ../../Zotlabs/Lib/ThreadItem.php:350 ../../include/conversation.php:717
+#: ../../Zotlabs/Lib/ThreadItem.php:350 ../../include/conversation.php:718
#, php-format
msgid "from %s"
msgstr "de %s"
-#: ../../Zotlabs/Lib/ThreadItem.php:353 ../../include/conversation.php:720
+#: ../../Zotlabs/Lib/ThreadItem.php:353 ../../include/conversation.php:721
#, php-format
msgid "last edited: %s"
msgstr "dernière modification&nbsp;: %s"
-#: ../../Zotlabs/Lib/ThreadItem.php:354 ../../include/conversation.php:721
+#: ../../Zotlabs/Lib/ThreadItem.php:354 ../../include/conversation.php:722
#, php-format
msgid "Expires: %s"
msgstr "Expire&nbsp;: %s"
@@ -7645,2021 +7698,2332 @@ msgstr "Vote"
msgid "Voting Options"
msgstr "Options de vote"
-#: ../../Zotlabs/Lib/ThreadItem.php:383
-#: ../../extend/addon/addon/bookmarker/bookmarker.php:38
+#: ../../Zotlabs/Lib/ThreadItem.php:384
+#: ../../addon/bookmarker/bookmarker.php:38
msgid "Save Bookmarks"
msgstr "Enregistrer les favoris"
-#: ../../Zotlabs/Lib/ThreadItem.php:384
+#: ../../Zotlabs/Lib/ThreadItem.php:385
msgid "Add to Calendar"
msgstr "Ajouter au Calendrier"
-#: ../../Zotlabs/Lib/ThreadItem.php:393
+#: ../../Zotlabs/Lib/ThreadItem.php:394
msgid "Mark all seen"
msgstr "Tout marquer comme vu"
-#: ../../Zotlabs/Lib/ThreadItem.php:442 ../../include/js_strings.php:7
+#: ../../Zotlabs/Lib/ThreadItem.php:443 ../../include/js_strings.php:7
#, php-format
msgid "%s show all"
msgstr "%s montre tout"
-#: ../../Zotlabs/Lib/ThreadItem.php:732 ../../include/conversation.php:1385
+#: ../../Zotlabs/Lib/ThreadItem.php:733 ../../include/conversation.php:1318
msgid "Bold"
msgstr "Gras"
-#: ../../Zotlabs/Lib/ThreadItem.php:733 ../../include/conversation.php:1386
+#: ../../Zotlabs/Lib/ThreadItem.php:734 ../../include/conversation.php:1319
msgid "Italic"
msgstr "Italique"
-#: ../../Zotlabs/Lib/ThreadItem.php:734 ../../include/conversation.php:1387
+#: ../../Zotlabs/Lib/ThreadItem.php:735 ../../include/conversation.php:1320
msgid "Underline"
msgstr "Souligné"
-#: ../../Zotlabs/Lib/ThreadItem.php:735 ../../include/conversation.php:1388
+#: ../../Zotlabs/Lib/ThreadItem.php:736 ../../include/conversation.php:1321
msgid "Quote"
msgstr "Citation"
-#: ../../Zotlabs/Lib/ThreadItem.php:736 ../../include/conversation.php:1389
+#: ../../Zotlabs/Lib/ThreadItem.php:737 ../../include/conversation.php:1322
msgid "Code"
msgstr "Code"
-#: ../../Zotlabs/Lib/ThreadItem.php:737
+#: ../../Zotlabs/Lib/ThreadItem.php:738
msgid "Image"
msgstr "Image"
-#: ../../Zotlabs/Lib/ThreadItem.php:738
+#: ../../Zotlabs/Lib/ThreadItem.php:739
msgid "Insert Link"
msgstr "Insérer un lien"
-#: ../../Zotlabs/Lib/ThreadItem.php:739
+#: ../../Zotlabs/Lib/ThreadItem.php:740
msgid "Video"
msgstr "Vidéo"
-#: ../../Zotlabs/Lib/Apps.php:212
-msgid "Site Admin"
-msgstr "Administrateur"
+#: ../../Zotlabs/Zot/Auth.php:138
+msgid ""
+"Remote authentication blocked. You are logged into this site locally. Please"
+" logout and retry."
+msgstr "Authentification distante bloquée. Vous êtes connecté(e) sur ce site localement. Merci de vous déconnecter et réessayer."
-#: ../../Zotlabs/Lib/Apps.php:213
-#: ../../extend/addon/addon/buglink/buglink.php:16
-msgid "Report Bug"
-msgstr "Reporter des bogues"
+#: ../../Zotlabs/Zot/Auth.php:250 ../../addon/openid/Mod_Openid.php:76
+#: ../../addon/openid/Mod_Openid.php:178
+#, php-format
+msgid "Welcome %s. Remote authentication successful."
+msgstr "Bienvenue %s. L'authentification distante a fonctionné."
-#: ../../Zotlabs/Lib/Apps.php:214
-msgid "View Bookmarks"
-msgstr "Voir les marques-pages"
+#: ../../Zotlabs/Storage/Browser.php:106 ../../Zotlabs/Storage/Browser.php:237
+msgid "parent"
+msgstr "retour"
-#: ../../Zotlabs/Lib/Apps.php:215
-msgid "My Chatrooms"
-msgstr "Mes salons de discussions"
+#: ../../Zotlabs/Storage/Browser.php:130 ../../include/text.php:2687
+msgid "Collection"
+msgstr "Groupe de contacts"
-#: ../../Zotlabs/Lib/Apps.php:217
-msgid "Firefox Share"
-msgstr "Partager via Firefox"
+#: ../../Zotlabs/Storage/Browser.php:133
+msgid "Principal"
+msgstr "Principal"
-#: ../../Zotlabs/Lib/Apps.php:218
-msgid "Remote Diagnostics"
-msgstr "Diagnostiques à distance"
+#: ../../Zotlabs/Storage/Browser.php:136
+msgid "Addressbook"
+msgstr "Carnet d'adresse"
-#: ../../Zotlabs/Lib/Apps.php:219 ../../include/features.php:337
-msgid "Suggest Channels"
-msgstr "Suggérer des canaux"
+#: ../../Zotlabs/Storage/Browser.php:139
+msgid "Calendar"
+msgstr "Calendrier"
-#: ../../Zotlabs/Lib/Apps.php:220 ../../include/nav.php:130
-#: ../../boot.php:1732
-msgid "Login"
-msgstr "Connexion"
+#: ../../Zotlabs/Storage/Browser.php:142
+msgid "Schedule Inbox"
+msgstr "Calendrier - Messages entrants"
-#: ../../Zotlabs/Lib/Apps.php:222 ../../include/nav.php:194
-msgid "Grid"
-msgstr "Réseau"
+#: ../../Zotlabs/Storage/Browser.php:145
+msgid "Schedule Outbox"
+msgstr "Calendrier - Messages sortants"
-#: ../../Zotlabs/Lib/Apps.php:226 ../../include/conversation.php:1903
-#: ../../include/features.php:99
-msgid "Wiki"
-msgstr "Wiki"
+#: ../../Zotlabs/Storage/Browser.php:225
+msgid "Total"
+msgstr "Total"
-#: ../../Zotlabs/Lib/Apps.php:227 ../../include/nav.php:198
-msgid "Channel Home"
-msgstr "Mon canal"
+#: ../../Zotlabs/Storage/Browser.php:227
+msgid "Shared"
+msgstr "Partagé"
-#: ../../Zotlabs/Lib/Apps.php:230 ../../include/conversation.php:1853
-#: ../../include/conversation.php:1856 ../../include/nav.php:218
-msgid "Events"
-msgstr "Événements"
+#: ../../Zotlabs/Storage/Browser.php:301
+#, php-format
+msgid "You are using %1$s of your available file storage."
+msgstr "Vous utilisez %1$s de votre espace de stockage."
-#: ../../Zotlabs/Lib/Apps.php:231 ../../include/nav.php:182
-msgid "Directory"
-msgstr "Annuaire"
+#: ../../Zotlabs/Storage/Browser.php:306
+#, php-format
+msgid "You are using %1$s of %2$s available file storage. (%3$s&#37;)"
+msgstr "Vous utilisez %1$s sur %2$s d'espace disponible. (%3$s&#37;)"
-#: ../../Zotlabs/Lib/Apps.php:233 ../../include/nav.php:210
-msgid "Mail"
-msgstr "Messages"
+#: ../../Zotlabs/Storage/Browser.php:317
+msgid "WARNING:"
+msgstr "AVERTISSEMENT&nbsp;:"
-#: ../../Zotlabs/Lib/Apps.php:236
-msgid "Chat"
-msgstr "Clavardage"
+#: ../../Zotlabs/Storage/Browser.php:327
+msgid ""
+"Please use DAV to upload large (video, audio) files.<br>See <a class=\"zrl\""
+" href=\"help/member/member_guide#Cloud_Desktop_Clients\">Cloud Desktop "
+"Clients</a>"
+msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:238
-msgid "Probe"
-msgstr "Sonder"
+#: ../../Zotlabs/Storage/Browser.php:331
+msgid "Create new folder"
+msgstr "Nouveau dossier"
-#: ../../Zotlabs/Lib/Apps.php:239
-msgid "Suggest"
-msgstr "Suggérer"
+#: ../../Zotlabs/Storage/Browser.php:333
+msgid "Upload file"
+msgstr "Téléverser un fichier"
-#: ../../Zotlabs/Lib/Apps.php:240
-msgid "Random Channel"
-msgstr "Un canal au hasard"
+#: ../../Zotlabs/Storage/Browser.php:347
+msgid "Drop files here to immediately upload"
+msgstr "Mettez un fichier ici pour le télécharger immédiatement"
-#: ../../Zotlabs/Lib/Apps.php:241
-msgid "Invite"
-msgstr "Invitation"
+#: ../../Zotlabs/Widget/Forums.php:85
+msgid "Forums"
+msgstr "Forums"
-#: ../../Zotlabs/Lib/Apps.php:242 ../../include/widgets.php:1595
-msgid "Features"
-msgstr "Fonctionalités"
+#: ../../Zotlabs/Widget/Appcategories.php:39
+#: ../../Zotlabs/Widget/Tagcloud.php:25 ../../include/contact_widgets.php:91
+#: ../../include/taxonomy.php:188 ../../include/taxonomy.php:270
+msgid "Categories"
+msgstr "Catégories"
-#: ../../Zotlabs/Lib/Apps.php:243
-#: ../../extend/addon/addon/openid/MysqlProvider.php:69
-msgid "Language"
-msgstr "Langue"
+#: ../../Zotlabs/Widget/Appcategories.php:42 ../../Zotlabs/Widget/Filer.php:31
+#: ../../include/contact_widgets.php:56 ../../include/contact_widgets.php:94
+msgid "Everything"
+msgstr "Tout"
-#: ../../Zotlabs/Lib/Apps.php:244
-msgid "Post"
-msgstr "Envoyer"
+#: ../../Zotlabs/Widget/Eventstools.php:13
+msgid "Events Tools"
+msgstr "Outils Evènements"
-#: ../../Zotlabs/Lib/Apps.php:245
-#: ../../extend/addon/addon/openid/MysqlProvider.php:58
-#: ../../extend/addon/addon/openid/MysqlProvider.php:59
-#: ../../extend/addon/addon/openid/MysqlProvider.php:60
-msgid "Profile Photo"
-msgstr "Photo du Profil"
+#: ../../Zotlabs/Widget/Eventstools.php:14
+msgid "Export Calendar"
+msgstr "Exporter le calendrier"
-#: ../../Zotlabs/Lib/Apps.php:355
-msgid "Purchase"
-msgstr "Acheter"
+#: ../../Zotlabs/Widget/Eventstools.php:15
+msgid "Import Calendar"
+msgstr "Importer un calendrier"
-#: ../../Zotlabs/Lib/Apps.php:359
-msgid "Undelete"
-msgstr "Restaurer"
+#: ../../Zotlabs/Widget/Suggestedchats.php:32
+msgid "Suggested Chatrooms"
+msgstr "Salons suggérés"
-#: ../../Zotlabs/Lib/NativeWiki.php:126
-msgid "Wiki files deleted successfully"
-msgstr "Fichiers du wiki supprimés avec succès"
+#: ../../Zotlabs/Widget/Mailmenu.php:13
+msgid "Private Mail Menu"
+msgstr "Menu des messages privés"
-#: ../../Zotlabs/Lib/Permcat.php:58
-msgctxt "permcat"
-msgid "default"
-msgstr "défaut"
+#: ../../Zotlabs/Widget/Mailmenu.php:15
+msgid "Combined View"
+msgstr "Vue combinée"
-#: ../../Zotlabs/Lib/Permcat.php:96
-msgctxt "permcat"
-msgid "follower"
-msgstr "abonné"
+#: ../../Zotlabs/Widget/Mailmenu.php:20 ../../include/nav.php:191
+msgid "Inbox"
+msgstr "Boîte de réception"
-#: ../../Zotlabs/Lib/Permcat.php:100
-msgctxt "permcat"
-msgid "contributor"
-msgstr "contributeur"
+#: ../../Zotlabs/Widget/Mailmenu.php:25 ../../include/nav.php:192
+msgid "Outbox"
+msgstr "Boîte d'envoi"
-#: ../../Zotlabs/Lib/Permcat.php:104
-msgctxt "permcat"
-msgid "publisher"
-msgstr "rédacteur"
+#: ../../Zotlabs/Widget/Mailmenu.php:30 ../../include/nav.php:193
+msgid "New Message"
+msgstr "Nouveau message"
-#: ../../Zotlabs/Lib/NativeWikiPage.php:31
-#: ../../Zotlabs/Lib/NativeWikiPage.php:62
-msgid "(No Title)"
-msgstr "(Pas de titre)"
+#: ../../Zotlabs/Widget/Chatroom_list.php:16
+#: ../../include/conversation.php:1807 ../../include/conversation.php:1810
+msgid "Chatrooms"
+msgstr "Salons de clavardage"
-#: ../../Zotlabs/Lib/NativeWikiPage.php:76
-msgid "Wiki page create failed."
-msgstr "Échec de création de la page wiki."
+#: ../../Zotlabs/Widget/Chatroom_list.php:20
+msgid "Overview"
+msgstr "Aperçu"
-#: ../../Zotlabs/Lib/NativeWikiPage.php:89
-msgid "Wiki not found."
-msgstr "Wiki introuvable."
+#: ../../Zotlabs/Widget/Rating.php:51
+msgid "Rating Tools"
+msgstr "Outils d'évaluation"
-#: ../../Zotlabs/Lib/NativeWikiPage.php:100
-msgid "Destination name already exists"
-msgstr "Le nom de destination est déjà pris"
+#: ../../Zotlabs/Widget/Rating.php:55 ../../Zotlabs/Widget/Rating.php:57
+msgid "Rate Me"
+msgstr "M'évaluer"
-#: ../../Zotlabs/Lib/NativeWikiPage.php:126
-#: ../../Zotlabs/Lib/NativeWikiPage.php:345
-msgid "Page not found"
-msgstr "Page introuvable"
+#: ../../Zotlabs/Widget/Rating.php:60
+msgid "View Ratings"
+msgstr "Voir mes évaluations"
-#: ../../Zotlabs/Lib/NativeWikiPage.php:156
-msgid "Error reading page content"
-msgstr "Erreur de lecture du contenu de la page"
+#: ../../Zotlabs/Widget/Activity.php:50
+msgctxt "widget"
+msgid "Activity"
+msgstr ""
-#: ../../Zotlabs/Lib/NativeWikiPage.php:338
-#: ../../Zotlabs/Lib/NativeWikiPage.php:383
-#: ../../Zotlabs/Lib/NativeWikiPage.php:450
-#: ../../Zotlabs/Lib/NativeWikiPage.php:491
-msgid "Error reading wiki"
-msgstr "Erreur de lecture du wiki"
+#: ../../Zotlabs/Widget/Follow.php:22
+#, php-format
+msgid "You have %1$.0f of %2$.0f allowed connections."
+msgstr "Vous avez %1$.0f sur %2$.0f contacts autorisés."
-#: ../../Zotlabs/Lib/NativeWikiPage.php:371
-msgid "Page update failed."
-msgstr "Echec de modification de la page."
+#: ../../Zotlabs/Widget/Follow.php:29
+msgid "Add New Connection"
+msgstr "Ajouter un nouveau contact"
-#: ../../Zotlabs/Lib/NativeWikiPage.php:405
-msgid "Nothing deleted"
-msgstr "Rien n'a été supprimé"
+#: ../../Zotlabs/Widget/Follow.php:30
+msgid "Enter channel address"
+msgstr "Saisissez l'adresse du canal"
-#: ../../Zotlabs/Lib/NativeWikiPage.php:471
-msgid "Compare: object not found."
-msgstr "Comparaison&nbsp;: objet introuvable."
+#: ../../Zotlabs/Widget/Follow.php:31
+msgid "Examples: bob@example.com, https://example.com/barbara"
+msgstr "Exemples&nbsp;: pierre@exemple.com, https://exemple.com/sophie"
-#: ../../Zotlabs/Lib/NativeWikiPage.php:477
-msgid "Page updated"
-msgstr "Page modifiée"
+#: ../../Zotlabs/Widget/Wiki_list.php:15 ../../addon/gitwiki/gitwiki.php:95
+msgid "Wiki List"
+msgstr "Liste de wikis"
-#: ../../Zotlabs/Lib/NativeWikiPage.php:480
-msgid "Untitled"
-msgstr "Sans titre"
+#: ../../Zotlabs/Widget/Archive.php:43
+msgid "Archives"
+msgstr "Archives"
-#: ../../Zotlabs/Lib/NativeWikiPage.php:486
-msgid "Wiki resource_id required for git commit"
-msgstr "\"resource_id\" du wiki nécessaire pour l'enregistrement dans git."
+#: ../../Zotlabs/Widget/Conversations.php:17
+#: ../../Zotlabs/Widget/Conversations.php:29
+msgid "Conversations"
+msgstr "Conversations"
-#: ../../Zotlabs/Lib/NativeWikiPage.php:557
-#: ../../extend/addon/addon/gitwiki/gitwiki_backend.php:579
-#: ../../include/bbcode.php:610 ../../include/bbcode.php:756
-msgid "Different viewers will see this text differently"
-msgstr "Ce texte aura un rendu différent en fonction des utilisateurs"
+#: ../../Zotlabs/Widget/Conversations.php:21
+msgid "Received Messages"
+msgstr "Messages reçus"
-#: ../../extend/addon/addon/adultphotoflag/adultphotoflag.php:24
-msgid "Flag Adult Photos"
-msgstr "Photo pour adulte"
+#: ../../Zotlabs/Widget/Conversations.php:25
+msgid "Sent Messages"
+msgstr "Messages envoyés"
-#: ../../extend/addon/addon/adultphotoflag/adultphotoflag.php:25
-msgid ""
-"Provide photo edit option to hide inappropriate photos from default album "
-"view"
-msgstr "Fourni l'option d'édition d'une photo afin de cacher des photos inappropriées de la vue d''album par défaut"
+#: ../../Zotlabs/Widget/Conversations.php:39
+msgid "No messages."
+msgstr "Pas de message."
-#: ../../extend/addon/addon/chords/Mod_Chords.php:44
-msgid ""
-"This is a fairly comprehensive and complete guitar chord dictionary which "
-"will list most of the available ways to play a certain chord, starting from "
-"the base of the fingerboard up to a few frets beyond the twelfth fret "
-"(beyond which everything repeats). A couple of non-standard tunings are "
-"provided for the benefit of slide players, etc."
-msgstr "Ceci est un dictionnaire d'accords de guitare assez complet et facile qui énumère la plupart des manières possibles de jouer un certain accord, à partir de la base de la touche jusqu'à quelques frettes au-delà de la douzième frette (au-delà de laquelle tout se répète). Un couple d'accordages non standard sont fournis au profit des joueurs de diapositives, etc."
+#: ../../Zotlabs/Widget/Conversations.php:57
+msgid "Delete conversation"
+msgstr "Supprimer la conversation"
-#: ../../extend/addon/addon/chords/Mod_Chords.php:46
-msgid ""
-"Chord names start with a root note (A-G) and may include sharps (#) and "
-"flats (b). This software will parse most of the standard naming conventions "
-"such as maj, min, dim, sus(2 or 4), aug, with optional repeating elements."
-msgstr "Les noms des accords commencent par une note racine (A-G) et peuvent inclure des dièses (#) et des bémols (b). Ce logiciel analysera la plupart des conventions de dénomination standard telles que maj, min, dim, sus (2 ou 4), aug, avec des éléments répétitifs facultatifs."
+#: ../../Zotlabs/Widget/Chatroom_members.php:11
+msgid "Chat Members"
+msgstr "Membres du salon de discussion"
-#: ../../extend/addon/addon/chords/Mod_Chords.php:48
-msgid ""
-"Valid examples include A, A7, Am7, Amaj7, Amaj9, Ammaj7, Aadd4, Asus2Add4, "
-"E7b13b11 ..."
-msgstr "Exemples valides comprennent A, A7, Am7, Amaj7, Amaj9, Ammaj7, Aadd4, Asus2Add4, E7b13b11 ..."
+#: ../../Zotlabs/Widget/Photo.php:48 ../../Zotlabs/Widget/Photo_rand.php:58
+msgid "photo/image"
+msgstr "photo/image"
-#: ../../extend/addon/addon/chords/Mod_Chords.php:51
-msgid "Guitar Chords"
-msgstr "Acords de guitar"
+#: ../../Zotlabs/Widget/Savedsearch.php:75
+msgid "Remove term"
+msgstr "Retirer le terme"
-#: ../../extend/addon/addon/chords/Mod_Chords.php:52
-msgid "The complete online chord dictionary"
-msgstr "Le dictionnaire en ligne complet des accords"
+#: ../../Zotlabs/Widget/Savedsearch.php:83 ../../include/features.php:301
+msgid "Saved Searches"
+msgstr "Recherches sauvegardées"
-#: ../../extend/addon/addon/chords/Mod_Chords.php:57
-msgid "Tuning"
-msgstr "Réglage"
+#: ../../Zotlabs/Widget/Savedsearch.php:84 ../../include/group.php:336
+msgid "add"
+msgstr "ajouter"
-#: ../../extend/addon/addon/chords/Mod_Chords.php:58
-msgid "Chord name: example: Em7"
-msgstr "Nom d'accord. Exemple : Em7."
+#: ../../Zotlabs/Widget/Notes.php:16
+msgid "Notes"
+msgstr "Notes"
-#: ../../extend/addon/addon/chords/Mod_Chords.php:59
-msgid "Show for left handed stringing"
-msgstr "Montrer pour les gauchers"
+#: ../../Zotlabs/Widget/Wiki_pages.php:54 ../../addon/gitwiki/gitwiki.php:76
+msgid "Wiki Pages"
+msgstr "Pages wiki"
-#: ../../extend/addon/addon/chords/chords.php:33
-msgid "Quick Reference"
-msgstr "Référence rapide"
+#: ../../Zotlabs/Widget/Wiki_pages.php:60 ../../addon/gitwiki/gitwiki.php:81
+msgid "Add new page"
+msgstr "Ajouter une nouvelle page"
-#: ../../extend/addon/addon/diaspora/import_diaspora.php:16
-msgid "No username found in import file."
-msgstr "Aucun nom d'utilisateur dans le fichier d'import."
+#: ../../Zotlabs/Widget/Wiki_pages.php:61 ../../addon/gitwiki/gitwiki.php:82
+msgid "Page name"
+msgstr "Nom de la page"
-#: ../../extend/addon/addon/diaspora/import_diaspora.php:41
-#: ../../include/import.php:51
-msgid "Unable to create a unique channel address. Import failed."
-msgstr "Impossible de créer une adresse de canal unique. Echec de l'import."
+#: ../../Zotlabs/Widget/Affinity.php:49
+msgid "Refresh"
+msgstr "Actualiser"
-#: ../../extend/addon/addon/diaspora/diaspora.php:677
-msgid "Diaspora Protocol Settings updated."
-msgstr "Les réglages du protocole Diaspora ont été mis à jour"
+#: ../../Zotlabs/Widget/Tasklist.php:23
+msgid "Tasks"
+msgstr "Tâches"
-#: ../../extend/addon/addon/diaspora/diaspora.php:696
-msgid "Enable the Diaspora protocol for this channel"
-msgstr "Activer le protocole Diaspora pour ce canal."
+#: ../../Zotlabs/Widget/Suggestions.php:51
+msgid "Suggestions"
+msgstr "Suggestions"
-#: ../../extend/addon/addon/diaspora/diaspora.php:700
-msgid "Allow any Diaspora member to comment on your public posts"
-msgstr "Autoriser n'importe quel membre de Diaspora à commenter vos messages publics"
+#: ../../Zotlabs/Widget/Suggestions.php:52
+msgid "See more..."
+msgstr "Voir plus..."
-#: ../../extend/addon/addon/diaspora/diaspora.php:704
-msgid "Prevent your hashtags from being redirected to other sites"
-msgstr "Empêche vos hashtags d'être redirigés vers d'autres sites"
+#: ../../Zotlabs/Widget/Filer.php:28 ../../include/contact_widgets.php:53
+#: ../../include/features.php:390
+msgid "Saved Folders"
+msgstr "Dossiers sauvegardés"
-#: ../../extend/addon/addon/diaspora/diaspora.php:709
-msgid "Followed hashtags (comma separated, do not include the #)"
-msgstr "Hashtags suivis (séparer par une virgule ; ne pas mettre le #)"
+#: ../../Zotlabs/Widget/Cover_photo.php:54
+msgid "Click to show more"
+msgstr "Cliquer pour voir plus"
-#: ../../extend/addon/addon/diaspora/diaspora.php:714
-msgid "Diaspora Protocol Settings"
-msgstr "Compatibilité avec Diaspora"
+#: ../../Zotlabs/Widget/Admin.php:23 ../../Zotlabs/Widget/Admin.php:60
+msgid "Member registrations waiting for confirmation"
+msgstr "Inscriptions en attente d'approbation"
-#: ../../extend/addon/addon/dirstats/dirstats.php:94
-msgid "Hubzilla Directory Stats"
-msgstr "Statistiques de l'annuaire Hubzilla"
+#: ../../Zotlabs/Widget/Admin.php:29
+msgid "Inspect queue"
+msgstr "Analyser la file d'attente"
-#: ../../extend/addon/addon/dirstats/dirstats.php:95
-msgid "Total Hubs"
-msgstr "Total de Hubs"
+#: ../../Zotlabs/Widget/Admin.php:31
+msgid "DB updates"
+msgstr "Mises à jour BDD"
-#: ../../extend/addon/addon/dirstats/dirstats.php:97
-msgid "Hubzilla Hubs"
-msgstr "Hubs Hubzilla"
+#: ../../Zotlabs/Widget/Admin.php:55 ../../include/nav.php:211
+msgid "Admin"
+msgstr "Administrateur"
-#: ../../extend/addon/addon/dirstats/dirstats.php:99
-msgid "Friendica Hubs"
-msgstr "Hubs Friendica"
+#: ../../Zotlabs/Widget/Admin.php:56
+msgid "Plugin Features"
+msgstr "Fonctionnalités des greffons"
-#: ../../extend/addon/addon/dirstats/dirstats.php:101
-msgid "Diaspora Pods"
-msgstr "Pods Diaspora"
+#: ../../Zotlabs/Widget/Settings_menu.php:35
+msgid "Account settings"
+msgstr "Paramètres du compte"
-#: ../../extend/addon/addon/dirstats/dirstats.php:103
-msgid "Hubzilla Channels"
-msgstr "Canaux Hubzilla"
+#: ../../Zotlabs/Widget/Settings_menu.php:41
+msgid "Channel settings"
+msgstr "Paramètres du canal"
-#: ../../extend/addon/addon/dirstats/dirstats.php:105
-msgid "Friendica Channels"
-msgstr "Canaux Friendica"
+#: ../../Zotlabs/Widget/Settings_menu.php:50
+msgid "Additional features"
+msgstr "Fonctionnalités supplémentaires"
-#: ../../extend/addon/addon/dirstats/dirstats.php:107
-msgid "Diaspora Channels"
-msgstr "Canaux Diaspora"
+#: ../../Zotlabs/Widget/Settings_menu.php:57
+msgid "Feature/Addon settings"
+msgstr "Paramètres des extensions/greffons"
-#: ../../extend/addon/addon/dirstats/dirstats.php:109
-msgid "Aged 35 and above"
-msgstr "Âgé de 35 ans et plus"
+#: ../../Zotlabs/Widget/Settings_menu.php:63
+msgid "Display settings"
+msgstr "Paramètres d'affichage"
-#: ../../extend/addon/addon/dirstats/dirstats.php:111
-msgid "Aged 34 and under"
-msgstr "Âgé de 34 et moins"
+#: ../../Zotlabs/Widget/Settings_menu.php:70
+msgid "Manage locations"
+msgstr "Gérer les emplacements"
-#: ../../extend/addon/addon/dirstats/dirstats.php:113
-msgid "Average Age"
-msgstr "Âge moyen"
+#: ../../Zotlabs/Widget/Settings_menu.php:77
+msgid "Export channel"
+msgstr "Exporter le canal"
-#: ../../extend/addon/addon/dirstats/dirstats.php:115
-msgid "Known Chatrooms"
-msgstr "Salons de discussion connus"
+#: ../../Zotlabs/Widget/Settings_menu.php:83
+msgid "Connected apps"
+msgstr "Applications connectées"
-#: ../../extend/addon/addon/dirstats/dirstats.php:117
-msgid "Known Tags"
-msgstr "Étiquettes connues"
+#: ../../Zotlabs/Widget/Settings_menu.php:98 ../../include/features.php:153
+msgid "Permission Groups"
+msgstr "Groupes d'autorisation"
-#: ../../extend/addon/addon/dirstats/dirstats.php:119
-msgid ""
-"Please note Diaspora and Friendica statistics are merely those **this "
-"directory** is aware of, and not all those known in the network. This also "
-"applies to chatrooms,"
-msgstr "Veuillez noter que les statistiques de Diaspora et Friendica sont simplement celles dont **ce répertoire** est au courant, et pas toutes celles connues dans le réseau. Cela s'applique également aux salles de discussion,"
+#: ../../Zotlabs/Widget/Settings_menu.php:115
+msgid "Premium Channel Settings"
+msgstr "Paramètres de canal VIP"
-#: ../../extend/addon/addon/donate/donate.php:21
-msgid "Project Servers and Resources"
-msgstr "Serveurs et ressources du projet"
+#: ../../Zotlabs/Widget/Bookmarkedchats.php:24
+msgid "Bookmarked Chatrooms"
+msgstr "Salons favoris"
-#: ../../extend/addon/addon/donate/donate.php:22
-msgid "Project Creator and Tech Lead"
-msgstr "Créateur et Responsable Technique du projet"
+#: ../../util/nconfig.php:34
+msgid "Source channel not found."
+msgstr "Source du canal introuvable."
-#: ../../extend/addon/addon/donate/donate.php:23
-msgid "Admin, developer, directorymin, support bloke"
-msgstr "Administrateur, développeur, responsable d'annuaire, équipe support"
+#: ../../boot.php:1164 ../../addon/opensearch/opensearch.php:26
+#, php-format
+msgctxt "opensearch"
+msgid "Search %1$s (%2$s)"
+msgstr "Recherche %1$s (%2$s)"
-#: ../../extend/addon/addon/donate/donate.php:50
-msgid ""
-"And the hundreds of other people and organisations who helped make the "
-"Hubzilla possible."
-msgstr "Et les centaines d'autres personnes et organisations qui ont contribué à rendre le Hubzilla possible."
+#: ../../boot.php:1164 ../../addon/opensearch/opensearch.php:28
+msgctxt "opensearch"
+msgid "$Projectname"
+msgstr "$Projectname"
+
+#: ../../boot.php:1611
+msgid "Create an account to access services and applications"
+msgstr "Créer un compte pour accéder aux services et applications"
+
+#: ../../boot.php:1630 ../../include/nav.php:99 ../../include/nav.php:123
+msgid "Logout"
+msgstr "Déconnexion"
+
+#: ../../boot.php:1633
+msgid "Login/Email"
+msgstr "pseudo / email"
+
+#: ../../boot.php:1634
+msgid "Password"
+msgstr "Mot de passe"
+
+#: ../../boot.php:1635
+msgid "Remember me"
+msgstr "Se souvenir de moi"
+
+#: ../../boot.php:1638
+msgid "Forgot your password?"
+msgstr "Mot de passe oublié&nbsp;?"
+
+#: ../../boot.php:2176
+msgid "toggle mobile"
+msgstr "(dés)activer mobile"
+
+#: ../../boot.php:2329
+#, php-format
+msgid "[$Projectname] Website SSL error for %s"
+msgstr ""
+
+#: ../../boot.php:2334
+msgid "Website SSL certificate is not valid. Please correct."
+msgstr "Le certificat SSL n'est pas valide. Corrigez le."
+
+#: ../../boot.php:2452
+#, php-format
+msgid "[$Projectname] Cron tasks not running on %s"
+msgstr ""
+
+#: ../../boot.php:2457
+msgid "Cron/Scheduled tasks not running."
+msgstr "Les taches planifiées ne tournent pas."
+
+#: ../../boot.php:2458 ../../include/datetime.php:286
+msgid "never"
+msgstr "jamais"
+
+#: ../../view/theme/redbasic/php/config.php:9
+msgid "Focus (Hubzilla default)"
+msgstr "Focus (par défaut pour Hubzilla)"
+
+#: ../../view/theme/redbasic/php/config.php:88
+msgid "Theme settings"
+msgstr "Paramètres du thème"
+
+#: ../../view/theme/redbasic/php/config.php:89
+msgid "Narrow navbar"
+msgstr "Barre de navigation fine"
+
+#: ../../view/theme/redbasic/php/config.php:90
+msgid "Navigation bar background color"
+msgstr "Couleur de fond de la barre de navigation"
+
+#: ../../view/theme/redbasic/php/config.php:91
+msgid "Navigation bar icon color "
+msgstr "Couleur des icônes de la barre de navigation"
+
+#: ../../view/theme/redbasic/php/config.php:92
+msgid "Navigation bar active icon color "
+msgstr "Couleur de l'icône active de la barre de navigation"
+
+#: ../../view/theme/redbasic/php/config.php:93
+msgid "Link color"
+msgstr ""
+
+#: ../../view/theme/redbasic/php/config.php:94
+msgid "Set font-color for banner"
+msgstr "Définir la couleur du texte de la bannière"
+
+#: ../../view/theme/redbasic/php/config.php:95
+msgid "Set the background color"
+msgstr "Définir la couleur d'arrière-plan"
+
+#: ../../view/theme/redbasic/php/config.php:96
+msgid "Set the background image"
+msgstr "Définir l'image d'arrière-plan"
+
+#: ../../view/theme/redbasic/php/config.php:97
+msgid "Set the background color of items"
+msgstr "Définir la couleur de fond des contributions"
+
+#: ../../view/theme/redbasic/php/config.php:98
+msgid "Set the background color of comments"
+msgstr "Couleur de fond des commentaires"
+
+#: ../../view/theme/redbasic/php/config.php:99
+msgid "Set font-size for the entire application"
+msgstr "Définir la taille de police pour l'application entière"
+
+#: ../../view/theme/redbasic/php/config.php:99
+msgid "Examples: 87.5%, 14px"
+msgstr ""
+
+#: ../../view/theme/redbasic/php/config.php:100
+msgid "Set font-color for posts and comments"
+msgstr "Définir la couleur de police pour les contributions et commentaires"
+
+#: ../../view/theme/redbasic/php/config.php:101
+msgid "Set radius of corners"
+msgstr "Définir le rayon des arrondis"
+
+#: ../../view/theme/redbasic/php/config.php:101
+msgid "Example: 4px"
+msgstr ""
+
+#: ../../view/theme/redbasic/php/config.php:102
+msgid "Set shadow depth of photos"
+msgstr "Définir la profondeur de l'ombre des photos"
-#: ../../extend/addon/addon/donate/donate.php:53
+#: ../../view/theme/redbasic/php/config.php:103
+msgid "Set maximum width of content region in pixel"
+msgstr "Définir la largeur maximale de la zone des contenus"
+
+#: ../../view/theme/redbasic/php/config.php:103
+msgid "Leave empty for default width"
+msgstr "Laissez vide pour avoir la largeur par défaut"
+
+#: ../../view/theme/redbasic/php/config.php:104
+msgid "Left align page content"
+msgstr "Aligner à gauche le contenu de la page"
+
+#: ../../view/theme/redbasic/php/config.php:105
+msgid "Set size of conversation author photo"
+msgstr "Définir la taille de la photo de l'auteur d'une conversation"
+
+#: ../../view/theme/redbasic/php/config.php:106
+msgid "Set size of followup author photos"
+msgstr "Définir la taille de la photo de l'auteur d'une réponse"
+
+#: ../../addon/rendezvous/rendezvous.php:57
+msgid "Errors encountered deleting database table "
+msgstr "Des erreurs ont eu lieu lors de la suppression de la table de la base de données."
+
+#: ../../addon/rendezvous/rendezvous.php:95
+#: ../../addon/twitter/twitter.php:773
+msgid "Submit Settings"
+msgstr "Emvoyer les paramètres"
+
+#: ../../addon/rendezvous/rendezvous.php:96
+msgid "Drop tables when uninstalling?"
+msgstr "Lors de la désinstallation, purger les tables?"
+
+#: ../../addon/rendezvous/rendezvous.php:96
msgid ""
-"The Redmatrix/Hubzilla projects are provided primarily by volunteers giving "
-"their time and expertise - and often paying out of pocket for services they "
-"share with others."
-msgstr "Les projets Redmatrix / Hubzilla sont fournis principalement par des bénévoles qui donnent de leur temps et de leur expertise - et paient souvent de leur poche pour des services qu'ils partagent avec d'autres."
+"If checked, the Rendezvous database tables will be deleted when the plugin "
+"is uninstalled."
+msgstr "Si cette case est cochée, les tables de la base Rendezvous seront supprimées lorsque le plugin sera désinstallé."
-#: ../../extend/addon/addon/donate/donate.php:54
+#: ../../addon/rendezvous/rendezvous.php:97
+msgid "Mapbox Access Token"
+msgstr "Jeton d'accès à la mapbox."
+
+#: ../../addon/rendezvous/rendezvous.php:97
msgid ""
-"There is no corporate funding and no ads, and we do not collect and sell "
-"your personal information. (We don't control your personal information - "
-"<strong>you do</strong>.)"
-msgstr "Il n'y a ni financement d'entreprise ni publicités, et nous ne recueillons ni ne vendons vos données personnelles. (Nous ne contrôlons pas vos informations personnelles - vous le faites !)"
+"If you enter a Mapbox access token, it will be used to retrieve map tiles "
+"from Mapbox instead of the default OpenStreetMap tile server."
+msgstr "Si vous entrez un jeton d'accès Mapbox, il doit être utilisé pour récupérer les cartes à partir de Mapbox au lieu du serveur par défaut OpenStreetMap."
+
+#: ../../addon/rendezvous/rendezvous.php:162
+msgid "Rendezvous"
+msgstr "Rendezvous"
-#: ../../extend/addon/addon/donate/donate.php:55
+#: ../../addon/rendezvous/rendezvous.php:167
msgid ""
-"Help support our ground-breaking work in decentralisation, web identity, and"
-" privacy."
-msgstr "Aider à soutenir notre travail novateur en matière de décentralisation, d'identité Web et de confidentialité."
+"This identity has been deleted by another member due to inactivity. Please "
+"press the \"New identity\" button or refresh the page to register a new "
+"identity. You may use the same name."
+msgstr "Cette identité a été supprimée par un autre membre en raison de l'inactivité. Appuyez sur le bouton \"Nouvelle identité\" ou actualisez la page pour enregistrer une nouvelle identité. Vous pouvez utiliser le même nom."
-#: ../../extend/addon/addon/donate/donate.php:57
+#: ../../addon/rendezvous/rendezvous.php:168
+msgid "Welcome to Rendezvous!"
+msgstr "Bienvenue dans Rendevzvous!"
+
+#: ../../addon/rendezvous/rendezvous.php:169
msgid ""
-"Your donations keep servers and services running and also helps us to "
-"provide innovative new features and continued development."
-msgstr "Vos dons maintiennent les serveurs et les services en marche et nous aident également à fournir de nouvelles fonctionnalités innovantes et un développement continu."
+"Enter your name to join this rendezvous. To begin sharing your location with"
+" the other members, tap the GPS control. When your location is discovered, a"
+" red dot will appear and others will be able to see you on the map."
+msgstr "Entrez votre nom pour rejoindre ce rendez-vous. Pour commencer à partager votre emplacement avec les autres membres, appuyez sur le contrôle GPS. Lorsque votre emplacement est découvert, un point rouge apparaîtra et les autres seront en mesure de vous voir sur la carte."
-#: ../../extend/addon/addon/donate/donate.php:60
-msgid "Donate"
-msgstr "Donner"
+#: ../../addon/rendezvous/rendezvous.php:171
+msgid "Let's meet here"
+msgstr "Rencontrez-vous ici"
+
+#: ../../addon/rendezvous/rendezvous.php:174
+msgid "New marker"
+msgstr "Nouveau marqueur"
+
+#: ../../addon/rendezvous/rendezvous.php:175
+msgid "Edit marker"
+msgstr "Éditer le marqueur"
+
+#: ../../addon/rendezvous/rendezvous.php:176
+msgid "New identity"
+msgstr "Nouvelle identité"
-#: ../../extend/addon/addon/donate/donate.php:62
+#: ../../addon/rendezvous/rendezvous.php:177
+msgid "Delete marker"
+msgstr "Supprimer le marqueur"
+
+#: ../../addon/rendezvous/rendezvous.php:178
+msgid "Delete member"
+msgstr "Supprimer le membre"
+
+#: ../../addon/rendezvous/rendezvous.php:179
+msgid "Edit proximity alert"
+msgstr "Éditer l'alerte de proximité"
+
+#: ../../addon/rendezvous/rendezvous.php:180
msgid ""
-"Choose a project, developer, or public hub to support with a one-time "
-"donation"
-msgstr "Choisissez un projet, un développeur ou un hub public à soutenir à l'aide d'un don unique"
+"A proximity alert will be issued when this member is within a certain radius"
+" of you.<br><br>Enter a radius in meters (0 to disable):"
+msgstr "Une alerte de proximité sera émise lorsque ce membre se trouve dans un certain périmètre autour de vous. Entrer un rayon en mètres (0 pour désactiver):"
-#: ../../extend/addon/addon/donate/donate.php:63
-msgid "Donate Now"
-msgstr "Donner maintenant"
+#: ../../addon/rendezvous/rendezvous.php:180
+#: ../../addon/rendezvous/rendezvous.php:185
+msgid "distance"
+msgstr "distance"
-#: ../../extend/addon/addon/donate/donate.php:64
+#: ../../addon/rendezvous/rendezvous.php:181
+msgid "Proximity alert distance (meters)"
+msgstr "Distance d'alerte de proximité (mètres)"
+
+#: ../../addon/rendezvous/rendezvous.php:182
+#: ../../addon/rendezvous/rendezvous.php:184
msgid ""
-"<strong><em>Or</em></strong> become a project sponsor (Hubzilla Project "
-"only)"
-msgstr "Or devenez un sponsor du projet (projet Hubzilla uniquement)"
+"A proximity alert will be issued when you are within a certain radius of the"
+" marker location.<br><br>Enter a radius in meters (0 to disable):"
+msgstr "Une alerte de proximité sera déclenchée quand vous serez à une certaine distance du marqueur d'emplacement.<br><br>Indiquez une distance en mètres (0 pour désactiver)&nbsp;:"
-#: ../../extend/addon/addon/donate/donate.php:65
+#: ../../addon/rendezvous/rendezvous.php:183
+msgid "Marker proximity alert"
+msgstr "Alerte de proximité de marqueur"
+
+#: ../../addon/rendezvous/rendezvous.php:186
+msgid "Reminder note"
+msgstr "Note de rappel"
+
+#: ../../addon/rendezvous/rendezvous.php:187
msgid ""
-"Please indicate if you would like your first name or full name (or nothing) "
-"to appear in our sponsor listing"
-msgstr "Veuillez indiquer si vous souhaitez que votre nom ou prénom (ou rien) apparaisse dans la liste de nos sponsors."
+"Enter a note to be displayed when you are within the specified proximity..."
+msgstr "Saisissez une note à afficher quand vous serez à la distance indiquée..."
-#: ../../extend/addon/addon/donate/donate.php:66
-msgid "Sponsor"
-msgstr "Sponsors"
+#: ../../addon/rendezvous/rendezvous.php:199
+msgid "Add new rendezvous"
+msgstr "Ajouter un nouveau rendezvous"
-#: ../../extend/addon/addon/donate/donate.php:69
-msgid "Special thanks to: "
-msgstr "Remerciements particuliers à :"
+#: ../../addon/rendezvous/rendezvous.php:200
+msgid ""
+"Create a new rendezvous and share the access link with those you wish to "
+"invite to the group. Those who open the link become members of the "
+"rendezvous. They can view other member locations, add markers to the map, or"
+" share their own locations with the group."
+msgstr "Créez un nouveau rendez-vous et partagez le lien d'accès avec les gens que vous souhaitez inviter au groupe. Ceux qui ouvrent le lien deviennent membres du rendez-vous. Ils peuvent afficher les emplacements des autres membres, ajouter des marqueurs à la carte ou partager leurs propres emplacements avec le groupe."
-#: ../../extend/addon/addon/dwpost/dwpost.php:42
-msgid "Post to Dreamwidth"
-msgstr "Publier sur Dreamwidth"
+#: ../../addon/skeleton/skeleton.php:59
+msgid "Some setting"
+msgstr "Un certain paramètre"
-#: ../../extend/addon/addon/dwpost/dwpost.php:73
-msgid "Enable Dreamwidth Post Plugin"
-msgstr "Activer le plugin de publication Dreamwidth"
+#: ../../addon/skeleton/skeleton.php:61
+msgid "A setting"
+msgstr "Un paramètre"
-#: ../../extend/addon/addon/dwpost/dwpost.php:77
-msgid "Dreamwidth username"
-msgstr "Nom d'utilisateur Dreamwidth"
+#: ../../addon/skeleton/skeleton.php:64
+msgid "Skeleton Settings"
+msgstr "Paramètres du squelette"
-#: ../../extend/addon/addon/dwpost/dwpost.php:81
-msgid "Dreamwidth password"
-msgstr "Mot de passe Dreamwidth"
+#: ../../addon/gnusoc/gnusoc.php:118
+msgid "GNU-Social Protocol Settings updated."
+msgstr ""
-#: ../../extend/addon/addon/dwpost/dwpost.php:85
-msgid "Post to Dreamwidth by default"
-msgstr "Publication avec Dreamwidth par défaut"
+#: ../../addon/gnusoc/gnusoc.php:129
+msgid "Enable the GNU-Social protocol for this channel"
+msgstr ""
-#: ../../extend/addon/addon/dwpost/dwpost.php:89
-msgid "Dreamwidth Post Settings"
-msgstr "Paramètres de publication Dreamwidth"
+#: ../../addon/gnusoc/gnusoc.php:133
+msgid "GNU-Social Protocol Settings"
+msgstr ""
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:45
-msgid "Flattr this!"
-msgstr "Flattr this!"
+#: ../../addon/gnusoc/gnusoc.php:323
+msgid "Follow"
+msgstr ""
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:83
-msgid "Flattr widget settings updated."
-msgstr "Les paramètres du widget Flattr ont été mis à jour"
+#: ../../addon/gnusoc/gnusoc.php:326
+#, php-format
+msgid "%1$s is now following %2$s"
+msgstr ""
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:100
-msgid "Flattr user"
-msgstr "Utilisateur de Flattr"
+#: ../../addon/cdav/Mod_Cdav.php:744
+msgid "INVALID EVENT DISMISSED!"
+msgstr "ÉVÉNEMENT INVALIDE REJETÉ!"
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:104
-msgid "URL of the Thing to flattr"
-msgstr "URL de ce que vous voulez flattr"
+#: ../../addon/cdav/Mod_Cdav.php:745
+msgid "Summary: "
+msgstr "Sommaire :"
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:104
-msgid "If empty channel URL is used"
-msgstr "Si une url vide est utilisée"
+#: ../../addon/cdav/Mod_Cdav.php:746
+msgid "Date: "
+msgstr "Date :"
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:108
-msgid "Title of the Thing to flattr"
-msgstr "Titre de ce que vous voulez flattr"
+#: ../../addon/cdav/Mod_Cdav.php:747 ../../addon/cdav/Mod_Cdav.php:754
+msgid "Reason: "
+msgstr "Raison :"
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:108
-msgid "If empty \"channel name on The Hubzilla\" will be used"
-msgstr "Si vide, \"nom du canal sur Hubzilla\" sera utilisé"
+#: ../../addon/cdav/Mod_Cdav.php:752
+msgid "INVALID CARD DISMISSED!"
+msgstr "ÉVÉNEMENT INVALIDE REJETÉ!"
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:112
-msgid "Static or dynamic flattr button"
-msgstr "Statique ou dynamique bouton Flattr"
+#: ../../addon/cdav/Mod_Cdav.php:753
+msgid "Name: "
+msgstr "Nom :"
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:112
-msgid "static"
-msgstr "statique"
+#: ../../addon/cdav/Mod_Cdav.php:770
+msgid ""
+"You have to enable this plugin in Feature/Addon Settings > CalDAV/CardDAV "
+"Settings before you can use it."
+msgstr "Vous avez activé ce plugin dans Fonctionalités/Paramètres des extensions > CalDAV/CardDAV Paramètres avant que vous puissiez l'utiliser."
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:112
-msgid "dynamic"
-msgstr "dynamique"
+#: ../../addon/cdav/Mod_Cdav.php:836 ../../addon/cdav/Mod_Cdav.php:837
+msgid "Example: YYYY-MM-DD HH:mm"
+msgstr "Exemple : YYYY-MM-DD HH:mm"
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:116
-msgid "Alignment of the widget"
-msgstr "Alignement du widget"
+#: ../../addon/cdav/Mod_Cdav.php:837
+msgid "End date and time"
+msgstr "Date et heure de fin"
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:116
-msgid "left"
-msgstr "gauche"
+#: ../../addon/cdav/Mod_Cdav.php:852
+msgid "List month"
+msgstr "Liste mois"
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:116
-msgid "right"
-msgstr "droite"
+#: ../../addon/cdav/Mod_Cdav.php:853
+msgid "List week"
+msgstr "Liste semaine"
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:120
-msgid "Enable Flattr widget"
-msgstr "Activer le widget Flattr"
+#: ../../addon/cdav/Mod_Cdav.php:854
+msgid "List day"
+msgstr "Liste jour"
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:124
-msgid "Flattr Widget Settings"
-msgstr "Paramètres du widget Flattr"
+#: ../../addon/cdav/Mod_Cdav.php:861
+msgid "More"
+msgstr "Plus"
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:118
-msgid "Contact not found."
-msgstr "Contact introuvable."
+#: ../../addon/cdav/Mod_Cdav.php:862
+msgid "Less"
+msgstr "Moins"
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:119
-msgid ""
-"This may occasionally happen if contact was requested by both persons and it"
-" has already been approved."
-msgstr "Ceci peut parfois se produire lorsque le contact a été demandé par les deux personnes à la fois et a déjà été approuvé."
+#: ../../addon/cdav/Mod_Cdav.php:863
+msgid "Select calendar"
+msgstr "Sélectionner un calendrier"
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:238
-msgid "Response from remote site was not understood."
-msgstr "La réponse du site de contrôle à distance n'a pas été comprise."
+#: ../../addon/cdav/Mod_Cdav.php:865
+msgid "Delete all"
+msgstr "Tout supprimer"
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:247
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:252
-msgid "Unexpected response from remote site: "
-msgstr "Réponse inattendue du site de contrôle à distance :"
+#: ../../addon/cdav/Mod_Cdav.php:867
+msgid "Sorry! Editing of recurrent events is not yet implemented."
+msgstr "Désolé ! L'édition d'événements récurrents n'est pas encore implémenté."
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:261
-msgid "Confirmation completed successfully."
-msgstr "Complété avec succès confirmé."
+#: ../../addon/cdav/cdav.php:36
+msgid "Errors encountered creating database table: "
+msgstr "Des erreurs se sont produites lors de la création de la table de la base de données :"
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:263
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:277
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:284
-msgid "Remote site reported: "
-msgstr "Contrôle à distance du site reporté :"
+#: ../../addon/cdav/cdav.php:197
+msgid "Default Calendar"
+msgstr "Agenda par défaut"
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:275
-msgid "Temporary failure. Please wait and try again."
-msgstr "Défaillance temporaire. Veuillez attendre et essayer à nouveau."
+#: ../../addon/cdav/cdav.php:206
+msgid "Default Addressbook"
+msgstr "Carnet d'adresses par défaut"
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:282
-msgid "Introduction failed or was revoked."
-msgstr "La demande de relation a échoué ou a été révoquée."
+#: ../../addon/cdav/cdav.php:215
+msgid "CalDAV/CardDAV Settings saved."
+msgstr "Les paramètres CalDAV/CardDAV ont été sauvegardés."
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:428
-msgid "Unable to set contact photo."
-msgstr "Impossible de définir la photo du contact."
+#: ../../addon/cdav/cdav.php:234
+msgid "Enable CalDAV/CardDAV Server for this channel"
+msgstr "Activer le serveur CalDAV/CardDAV pour ce canal"
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:485
+#: ../../addon/cdav/cdav.php:237
#, php-format
-msgid "%1$s is now friends with %2$s"
-msgstr "%1$s est maintenant ami avec %2$s"
+msgid "Your CalDAV resources are located at %s "
+msgstr "Vos ressources CalDAV sont situées à %s"
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:570
+#: ../../addon/cdav/cdav.php:240
#, php-format
-msgid "No user record found for '%s' "
-msgstr "Aucun utilisateur enregistré ne correspond à '%s' "
+msgid "Your CardDAV resources are located at %s "
+msgstr "Vos ressources CardDAV sont situées à %s"
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:580
-msgid "Our site encryption key is apparently messed up."
-msgstr "Notre clé de chiffrement du site est apparemment corrompue."
+#: ../../addon/cdav/cdav.php:246
+msgid "CalDAV/CardDAV Settings"
+msgstr "Paramètres CalDAV/CardDAV"
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:591
-msgid "Empty site URL was provided or URL could not be decrypted by us."
-msgstr "L'URL fournie est vide ou ne peut être déchiffrée par nous."
+#: ../../addon/cdav/cdav.php:272 ../../include/connections.php:670
+msgid "Home, Voice"
+msgstr "Domicile, Voix"
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:612
-msgid "Contact record was not found for you on our site."
-msgstr "Le contact enregistré n'a pas été trouvé sur notre site."
+#: ../../addon/cdav/cdav.php:273 ../../include/connections.php:671
+msgid "Home, Fax"
+msgstr "Domicile, Fax"
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:626
-#, php-format
-msgid "Site public key not available in contact record for URL %s."
-msgstr "La clé publique du site n'est pas disponible dans l'enregistrement de contact pour l'URL %s."
+#: ../../addon/cdav/cdav.php:275 ../../include/connections.php:673
+msgid "Work, Voice"
+msgstr "Travail, Voix"
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:646
-msgid ""
-"The ID provided by your system is a duplicate on our system. It should work "
-"if you try again."
-msgstr "L'ID fournie par votre système est un duplicata sur notre système. Cela devrait fonctionner si vous essayez à nouveau."
+#: ../../addon/cdav/cdav.php:276 ../../include/connections.php:674
+msgid "Work, Fax"
+msgstr "Travail, Fax"
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:657
-msgid "Unable to set your contact credentials on our system."
-msgstr "Impossible de définir vos informations de connexion sur notre système."
+#: ../../addon/cdav/include/widgets.php:37
+msgid "Select Channel"
+msgstr "Sélectionner un canal"
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:724
-msgid "Unable to update your contact profile details on our system"
-msgstr "Impossible de mettre à jour les détails de votre profil de contact sur notre système."
+#: ../../addon/cdav/include/widgets.php:42
+msgid "Read-write"
+msgstr "Lire et écrire"
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:751
-#: ../../extend/addon/addon/friendica/dfrn_request.php:749
-msgid "[Name Withheld]"
-msgstr "[Nom refusé]"
+#: ../../addon/cdav/include/widgets.php:43
+msgid "Read-only"
+msgstr "Lire uniquement"
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:796
-#, php-format
-msgid "%1$s has joined %2$s"
-msgstr "%1$s a rejoint %2$s"
+#: ../../addon/cdav/include/widgets.php:116
+msgid "My Calendars"
+msgstr "Mes agendas"
-#: ../../extend/addon/addon/friendica/dfrn_poll.php:103
-#: ../../extend/addon/addon/friendica/dfrn_poll.php:536
-#, php-format
-msgid "%1$s welcomes %2$s"
-msgstr "%1$s souhaite la bienvenue à %2$s"
+#: ../../addon/cdav/include/widgets.php:118
+msgid "Shared Calendars"
+msgstr "Agendas partagés"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:102
-msgid "This introduction has already been accepted."
-msgstr "Cette relation a déjà été acceptée."
+#: ../../addon/cdav/include/widgets.php:122
+msgid "Share this calendar"
+msgstr "Partager cet agenda"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:123
-#: ../../extend/addon/addon/friendica/dfrn_request.php:528
-msgid "Profile location is not valid or does not contain profile information."
-msgstr "L'emplacement de profil n'est pas valide ou ne contient pas d'informations sur le profil."
+#: ../../addon/cdav/include/widgets.php:124
+msgid "Calendar name and color"
+msgstr "Nom et couleur de l'agenda"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:128
-#: ../../extend/addon/addon/friendica/dfrn_request.php:533
-msgid "Warning: profile location has no identifiable owner name."
-msgstr "Attention : l'emplacement de profil n'a pas de nom de propriétaire identifiable."
+#: ../../addon/cdav/include/widgets.php:126
+msgid "Create new calendar"
+msgstr "Créer un nouvel agenda"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:130
-#: ../../extend/addon/addon/friendica/dfrn_request.php:535
-msgid "Warning: profile location has no profile photo."
-msgstr "Attention : l'emplacement de profil n'a pas de photo de profil."
+#: ../../addon/cdav/include/widgets.php:128
+msgid "Calendar Name"
+msgstr "Nom de l'agenda"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:133
-#: ../../extend/addon/addon/friendica/dfrn_request.php:538
-#, php-format
-msgid "%d required parameter was not found at the given location"
-msgid_plural "%d required parameters were not found at the given location"
-msgstr[0] "%d paramètre non trouvé à l'emplacement indiqué"
-msgstr[1] "%d paramètres non trouvés à l'emplacement indiqué"
+#: ../../addon/cdav/include/widgets.php:129
+msgid "Calendar Tools"
+msgstr "Outils pour les agendas"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:180
-msgid "Introduction complete."
-msgstr "Relation confirmée."
+#: ../../addon/cdav/include/widgets.php:130
+msgid "Import calendar"
+msgstr "Importer un agenda"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:224
-msgid "Unrecoverable protocol error."
-msgstr "Erreur de protocole irrécupérable."
+#: ../../addon/cdav/include/widgets.php:131
+msgid "Select a calendar to import to"
+msgstr "Sélectionner un agenda à importer dans"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:252
-msgid "Profile unavailable."
-msgstr "Profil indisponible."
+#: ../../addon/cdav/include/widgets.php:158
+msgid "Addressbooks"
+msgstr "Carnet d'adresses"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:277
-#, php-format
-msgid "%s has received too many connection requests today."
-msgstr "%s a reçu trop de demandes de connexion aujourd'hui."
+#: ../../addon/cdav/include/widgets.php:160
+msgid "Addressbook name"
+msgstr "Nom du carnet d'adresses"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:278
-msgid "Spam protection measures have been invoked."
-msgstr "Des mesures de protection anti-spam ont été mises en place."
+#: ../../addon/cdav/include/widgets.php:162
+msgid "Create new addressbook"
+msgstr "Créer un nouveau carnet d'adresses"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:279
-msgid "Friends are advised to please try again in 24 hours."
-msgstr "Les amis sont invités à essayer de nouveau dans 24 heures."
+#: ../../addon/cdav/include/widgets.php:163
+msgid "Addressbook Name"
+msgstr "Nom du carnet d'adresses"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:341
-msgid "Invalid locator"
-msgstr "Localisateur innvalide"
+#: ../../addon/cdav/include/widgets.php:165
+msgid "Addressbook Tools"
+msgstr "Outils pour les carnets d'adresses"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:350
-msgid "Invalid email address."
-msgstr "Adresse mail invalide."
+#: ../../addon/cdav/include/widgets.php:166
+msgid "Import addressbook"
+msgstr "Importer un carnet d'adresses"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:377
-msgid "This account has not been configured for email. Request failed."
-msgstr "Le mail de ce compte n'a pas été configuré. La requête a échouée."
+#: ../../addon/cdav/include/widgets.php:167
+msgid "Select an addressbook to import to"
+msgstr "Sélectionner un carnet d'adresses à importer dans"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:473
-msgid "Unable to resolve your name at the provided location."
-msgstr "Impossible de résoudre votre nom à l'emplacement spécifié."
+#: ../../addon/planets/planets.php:121
+msgid "Planets Settings updated."
+msgstr "Paramètres Planets mis à jour."
-#: ../../extend/addon/addon/friendica/dfrn_request.php:486
-msgid "You have already introduced yourself here."
-msgstr "Vous vous êtes déjà introduit ici."
+#: ../../addon/planets/planets.php:153
+msgid "Enable Planets Plugin"
+msgstr "Activer le plugin Planets"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:490
-#, php-format
-msgid "Apparently you are already friends with %s."
-msgstr "Apparemment vous êtes déjà ami avec %s."
+#: ../../addon/planets/planets.php:157
+msgid "Planets Settings"
+msgstr "Paramètres Planets"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:511
-msgid "Invalid profile URL."
-msgstr "Adresse de profil invalide."
+#: ../../addon/openclipatar/openclipatar.php:50
+#: ../../addon/openclipatar/openclipatar.php:128
+msgid "System defaults:"
+msgstr "Paramètres par défaut du système :"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:517
-msgid "Disallowed profile URL."
-msgstr "Adresse de profil non-autorisée."
+#: ../../addon/openclipatar/openclipatar.php:54
+msgid "Preferred Clipart IDs"
+msgstr "ID Clipart préférées"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:587
-msgid "Failed to update contact record."
-msgstr "Échec de la mise jour de l'enregistrement du contact."
+#: ../../addon/openclipatar/openclipatar.php:54
+msgid "List of preferred clipart ids. These will be shown first."
+msgstr "Liste des ids clipart préférése. Celles-ci seront montrées en premier."
-#: ../../extend/addon/addon/friendica/dfrn_request.php:608
-msgid "Your introduction has been sent."
-msgstr "Votre demande de relation a été envoyée."
+#: ../../addon/openclipatar/openclipatar.php:55
+msgid "Default Search Term"
+msgstr "Terme de recherche par défaut"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:662
-msgid "Please login to confirm introduction."
-msgstr "Veuillez vous connecter pour confirmer la relation."
+#: ../../addon/openclipatar/openclipatar.php:55
+msgid "The default search term. These will be shown second."
+msgstr "Le terme de recherche par défaut. Ceci sera affiché en second."
-#: ../../extend/addon/addon/friendica/dfrn_request.php:676
-msgid ""
-"Incorrect identity currently logged in. Please login to "
-"<strong>this</strong> profile."
-msgstr "L'identité de connexion actuelle est incorrecte. Veuillez vous connecter à <strong>ce</strong> profil."
+#: ../../addon/openclipatar/openclipatar.php:56
+msgid "Return After"
+msgstr "Retourner ensuite"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:690
-#: ../../extend/addon/addon/friendica/dfrn_request.php:707
-msgid "Confirm"
-msgstr "Confirmer"
+#: ../../addon/openclipatar/openclipatar.php:56
+msgid "Page to load after image selection."
+msgstr "Page à afficher après la sélection de l'image."
-#: ../../extend/addon/addon/friendica/dfrn_request.php:702
-msgid "Hide this contact"
-msgstr "Cacher ce contact"
+#: ../../addon/openclipatar/openclipatar.php:58 ../../include/channel.php:1046
+#: ../../include/nav.php:107
+msgid "Edit Profile"
+msgstr "Éditeur de profil"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:705
-#, php-format
-msgid "Welcome home %s."
-msgstr "Bienvenue %s."
+#: ../../addon/openclipatar/openclipatar.php:59
+msgid "Profile List"
+msgstr "Liste de profil"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:706
-#, php-format
-msgid "Please confirm your introduction/connection request to %s."
-msgstr "Veuillez confirmer votre demande de relation à %s."
+#: ../../addon/openclipatar/openclipatar.php:61
+msgid "Order of Preferred"
+msgstr "Tri selon les préférences"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:836
-msgid ""
-"Please enter your 'Identity Address' from one of the following supported "
-"communications networks:"
-msgstr "Veuillez entrer votre 'adresse d'identification' à partir de l'un des réseaux sociaux supportés suivants :"
+#: ../../addon/openclipatar/openclipatar.php:61
+msgid "Sort order of preferred clipart ids."
+msgstr "Ordre de tri des ids de clipart préférés."
-#: ../../extend/addon/addon/friendica/dfrn_request.php:857
-#, php-format
-msgid ""
-"If you are not yet a member of the free social web, <a "
-"href=\"%s/siteinfo\">follow this link to find a public Friendica site and "
-"join us today</a>."
-msgstr "Si vous n'êtes pas déjà membre d'un réseau social libre, <a href=\"%s/siteinfo\">suivre ce lien pour trouver un site public de Friendica et nous rejoindre dès maintenant</a>."
+#: ../../addon/openclipatar/openclipatar.php:62
+#: ../../addon/openclipatar/openclipatar.php:68
+msgid "Newest first"
+msgstr "Les plus récents en premier"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:862
-msgid "Friend/Connection Request"
-msgstr "Requête d'ami/connection"
+#: ../../addon/openclipatar/openclipatar.php:65
+msgid "As entered"
+msgstr "Comme entrés"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:863
-msgid ""
-"Examples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, "
-"testuser@identi.ca"
-msgstr "Exemples : jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, testuser@identi.ca"
+#: ../../addon/openclipatar/openclipatar.php:67
+msgid "Order of other"
+msgstr "Tri selon autre"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:864
-msgid "Please answer the following:"
-msgstr "Veuillez répondre aux questions suivantes :"
+#: ../../addon/openclipatar/openclipatar.php:67
+msgid "Sort order of other clipart ids."
+msgstr "Ordre de tri des autres clipart ids."
-#: ../../extend/addon/addon/friendica/dfrn_request.php:865
-#, php-format
-msgid "Does %s know you?"
-msgstr "Est-ce que %s vous connaît ?"
+#: ../../addon/openclipatar/openclipatar.php:69
+msgid "Most downloaded first"
+msgstr "Les plus téléchargés en premier"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:869
-msgid "Add a personal note:"
-msgstr "Ajouter une note personnelle :"
+#: ../../addon/openclipatar/openclipatar.php:70
+msgid "Most liked first"
+msgstr "Les plus aimés en premier"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:871
-#: ../../include/network.php:2242 ../../include/network.php:2243
-msgid "Friendica"
-msgstr "Friendica"
+#: ../../addon/openclipatar/openclipatar.php:72
+msgid "Preferred IDs Message"
+msgstr "IDs des messages préférés"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:872
-msgid "StatusNet/Federated Social Web"
-msgstr "StatusNet/Réseau Social Fédéré"
+#: ../../addon/openclipatar/openclipatar.php:72
+msgid "Message to display above preferred results."
+msgstr "Message à afficher au-dessus de la liste des résultats préférés."
-#: ../../extend/addon/addon/friendica/dfrn_request.php:873
-#: ../../include/network.php:2248
-msgid "Diaspora"
-msgstr "Diaspora"
+#: ../../addon/openclipatar/openclipatar.php:78
+msgid "Uploaded by: "
+msgstr "Téléversé par :"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:874
-#, php-format
+#: ../../addon/openclipatar/openclipatar.php:78
+msgid "Drawn by: "
+msgstr "Dessiné par :"
+
+#: ../../addon/openclipatar/openclipatar.php:192
+msgid "Or select from a free OpenClipart.org image:"
+msgstr "ou sélectionner une image libre d'OpenClipart.org :"
+
+#: ../../addon/openclipatar/openclipatar.php:195
+msgid "Search Term"
+msgstr "Terme de recherche"
+
+#: ../../addon/openclipatar/openclipatar.php:232
+msgid "Unknown error. Please try again later."
+msgstr "Erreur inconnue. Veuillez essayer à nouveau plus tard."
+
+#: ../../addon/openclipatar/openclipatar.php:308
+msgid "Profile photo updated successfully."
+msgstr "Photo de profil actualisée avec succès."
+
+#: ../../addon/adultphotoflag/adultphotoflag.php:24
+msgid "Flag Adult Photos"
+msgstr "Photo pour adulte"
+
+#: ../../addon/adultphotoflag/adultphotoflag.php:25
msgid ""
-" - please do not use this form. Instead, enter %s into your Diaspora search"
-" bar."
-msgstr "- veuillez ne pas utiliser ce formulaire. À la place, entrez %s dans la barre de recherche de Diaspora."
+"Provide photo edit option to hide inappropriate photos from default album "
+"view"
+msgstr "Fourni l'option d'édition d'une photo afin de cacher des photos inappropriées de la vue d''album par défaut"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:875
-msgid "Your Identity Address:"
-msgstr "Votre adresse d'identification :"
+#: ../../addon/wppost/wppost.php:45
+msgid "Post to WordPress"
+msgstr "Publier sur Wordpress"
-#: ../../extend/addon/addon/friendica/dfrn_request.php:878
-msgid "Submit Request"
-msgstr "Envoyer la demande"
+#: ../../addon/wppost/wppost.php:82
+msgid "Enable WordPress Post Plugin"
+msgstr "Activer l'extension de publication WordPress"
-#: ../../extend/addon/addon/friendica/friendica.php:113
-#: ../../extend/addon/addon/gnusoc/gnusoc.php:118
-msgid "GNU-Social Protocol Settings updated."
-msgstr "Les paramètres du protocole GNU-Social ont été mis à jour."
+#: ../../addon/wppost/wppost.php:86
+msgid "WordPress username"
+msgstr "Identifiant de connexion WordPress"
-#: ../../extend/addon/addon/friendica/friendica.php:124
-msgid "Enable the (experimental) GNU-Social protocol for this channel"
-msgstr "Activer la connexion (expérimentale) du protocole GNU-Social pour ce canal"
+#: ../../addon/wppost/wppost.php:90
+msgid "WordPress password"
+msgstr "Mot de passe de connexion WordPress"
-#: ../../extend/addon/addon/friendica/friendica.php:128
-#: ../../extend/addon/addon/gnusoc/gnusoc.php:133
-msgid "GNU-Social Protocol Settings"
-msgstr "Paramètres du protocole GNU-Social"
+#: ../../addon/wppost/wppost.php:94
+msgid "WordPress API URL"
+msgstr "URL de l'API WordPress"
-#: ../../extend/addon/addon/friendica/friendica.php:185
-#: ../../extend/addon/addon/gnusoc/gnusoc.php:323
-msgid "Follow"
-msgstr "S'abonner"
+#: ../../addon/wppost/wppost.php:95
+msgid "Typically https://your-blog.tld/xmlrpc.php"
+msgstr "Typiquement https://your-blog.tld/xmlrpc.php"
-#: ../../extend/addon/addon/friendica/friendica.php:188
-#: ../../extend/addon/addon/gnusoc/gnusoc.php:326
-#, php-format
-msgid "%1$s is now following %2$s"
-msgstr "%1$s est maintenant abonné à %2$s"
+#: ../../addon/wppost/wppost.php:98
+msgid "WordPress blogid"
+msgstr "ID de votre blog WordPress"
-#: ../../extend/addon/addon/frphotos/frphotos.php:91
-msgid "Friendica Photo Album Import"
-msgstr "Importation de l'album photo Friendica "
+#: ../../addon/wppost/wppost.php:99
+msgid "For multi-user sites such as wordpress.com, otherwise leave blank"
+msgstr "Pour les sites multi-utilisateurs comme wordpress.com, sinon laisser vide"
-#: ../../extend/addon/addon/frphotos/frphotos.php:92
-msgid "This will import all your Friendica photo albums to this Red channel."
-msgstr "Ceci importera toutes vos albums photos Friendica dans ce canal Hubzilla."
+#: ../../addon/wppost/wppost.php:105
+msgid "Post to WordPress by default"
+msgstr "Par défaut, publier sur WordPress"
-#: ../../extend/addon/addon/frphotos/frphotos.php:93
-msgid "Friendica Server base URL"
-msgstr "URL de base du serveur Friendica"
+#: ../../addon/wppost/wppost.php:109
+msgid "Forward comments (requires hubzilla_wp plugin)"
+msgstr "Transférer les commentaires (nécessite le plugin hubzila_wp)"
-#: ../../extend/addon/addon/frphotos/frphotos.php:94
-msgid "Friendica Login Username"
-msgstr "Identifiant de connexion Friendica"
+#: ../../addon/wppost/wppost.php:113
+msgid "WordPress Post Settings"
+msgstr "Paramètres de publications WordPress"
-#: ../../extend/addon/addon/frphotos/frphotos.php:95
-msgid "Friendica Login Password"
-msgstr "Mot de passe de connexion Friendica"
+#: ../../addon/wppost/wppost.php:129
+msgid "Wordpress Settings saved."
+msgstr "Les paramètres WordPress ont été sauvegardés."
-#: ../../extend/addon/addon/hubwall/hubwall.php:19
-msgid "Send email to all members"
-msgstr "Envoyer un mail à tous les membres"
+#: ../../addon/nsfw/nsfw.php:80
+msgid ""
+"This plugin looks in posts for the words/text you specify below, and "
+"collapses any content containing those keywords so it is not displayed at "
+"inappropriate times, such as sexual innuendo that may be improper in a work "
+"setting. It is polite and recommended to tag any content containing nudity "
+"with #NSFW. This filter can also match any other word/text you specify, and"
+" can thereby be used as a general purpose content filter."
+msgstr "Ce plugin cherche dans les publications les mots/textes que vous spécifiez ci-dessous, et réduit tout contenu contenant ces mots-clés afin qu'ils ne s'affichent pas à des moments inappropriés, tels que les insinuations sexuelles qui peuvent être inappropriées dans un contexte de travail. Il est poli et recommandé de marquer tout contenu contenant de la nudité avec #NSFW. Ce filtre peut également correspondre à tout autre mot/texte que vous spécifiez et peut ainsi être utilisé comme un filtre de contenu à usage général."
-#: ../../extend/addon/addon/hubwall/hubwall.php:33
-#, php-format
-msgid "$1%s Administrator"
-msgstr "$1%s administrateur"
+#: ../../addon/nsfw/nsfw.php:84
+msgid "Enable Content filter"
+msgstr "Activer le filtrage des contenus"
-#: ../../extend/addon/addon/hubwall/hubwall.php:50
-#: ../../extend/addon/addon/mailtest/mailtest.php:50
-msgid "No recipients found."
-msgstr "Aucun destinataire trouvé."
+#: ../../addon/nsfw/nsfw.php:88
+msgid "Comma separated list of keywords to hide"
+msgstr "Liste séparée par des virgules des mots-clés à cacher"
-#: ../../extend/addon/addon/hubwall/hubwall.php:73
-#, php-format
-msgid "%1$d of %2$d messages sent."
-msgstr "%1$d message(s) envoyés sur %2$d."
+#: ../../addon/nsfw/nsfw.php:88
+msgid "Word, /regular-expression/, lang=xx, lang!=xx"
+msgstr "Mot, /expression-régulière/, lang=xx, lang!=xx"
-#: ../../extend/addon/addon/hubwall/hubwall.php:81
-msgid "Send email to all hub members."
-msgstr "Envoyer un e-mail à tous les membres du hub."
+#: ../../addon/nsfw/nsfw.php:92
+msgid "Not Safe For Work Settings"
+msgstr "Paramètres NSFW (Not Safe For Work)"
-#: ../../extend/addon/addon/hubwall/hubwall.php:92
-#: ../../extend/addon/addon/mailtest/mailtest.php:96
-msgid "Message subject"
-msgstr "Objet du message"
+#: ../../addon/nsfw/nsfw.php:92
+msgid "General Purpose Content Filter"
+msgstr "Filtre de contenu sujet général"
-#: ../../extend/addon/addon/hubwall/hubwall.php:93
-msgid "Sender Email address"
-msgstr "Adresse mail de l'expéditeur"
+#: ../../addon/nsfw/nsfw.php:110
+msgid "NSFW Settings saved."
+msgstr "Paramètres NSFW sauvegardés."
-#: ../../extend/addon/addon/hubwall/hubwall.php:94
-msgid "Test mode (only send to hub administrator)"
-msgstr "Mode test (uniquement envoyé à l'administrateur du hub)"
+#: ../../addon/nsfw/nsfw.php:207
+msgid "Possible adult content"
+msgstr "Contenu pour adulte probable"
-#: ../../extend/addon/addon/ijpost/ijpost.php:42
+#: ../../addon/nsfw/nsfw.php:211
+#, php-format
+msgid "%s - view"
+msgstr ""
+
+#: ../../addon/ijpost/ijpost.php:42
msgid "Post to Insanejournal"
msgstr "Publier sur InsaneJournal"
-#: ../../extend/addon/addon/ijpost/ijpost.php:73
+#: ../../addon/ijpost/ijpost.php:73
msgid "Enable InsaneJournal Post Plugin"
msgstr "Activer le plugin de publication InsaneJournal"
-#: ../../extend/addon/addon/ijpost/ijpost.php:77
+#: ../../addon/ijpost/ijpost.php:77
msgid "InsaneJournal username"
msgstr "Identifiant InsaneJournal"
-#: ../../extend/addon/addon/ijpost/ijpost.php:81
+#: ../../addon/ijpost/ijpost.php:81
msgid "InsaneJournal password"
msgstr "Mot de passe InsaneJournal"
-#: ../../extend/addon/addon/ijpost/ijpost.php:85
+#: ../../addon/ijpost/ijpost.php:85
msgid "Post to InsaneJournal by default"
msgstr "Par défaut, publier dans InsaneJournal"
-#: ../../extend/addon/addon/ijpost/ijpost.php:89
+#: ../../addon/ijpost/ijpost.php:89
msgid "InsaneJournal Post Settings"
msgstr "Paramètres de publication de InsaneJournal"
-#: ../../extend/addon/addon/ijpost/ijpost.php:104
+#: ../../addon/ijpost/ijpost.php:104
msgid "Insane Journal Settings saved."
msgstr "Les paramètres d'InsaneJournal ont été sauvegardés"
-#: ../../extend/addon/addon/irc/irc.php:45
-msgid "Channels to auto connect"
-msgstr "Canaux à connecter automatiqument"
+#: ../../addon/js_upload/js_upload.php:44
+msgid "Upload a file"
+msgstr "Téléverser un fichier"
-#: ../../extend/addon/addon/irc/irc.php:45
-#: ../../extend/addon/addon/irc/irc.php:49
-msgid "Comma separated list"
-msgstr "Liste séparée par des virgules"
+#: ../../addon/js_upload/js_upload.php:45
+msgid "Drop files here to upload"
+msgstr "Glisser les fichiers ici pour téléversement"
-#: ../../extend/addon/addon/irc/irc.php:49
-#: ../../extend/addon/addon/irc/irc.php:96
-msgid "Popular Channels"
-msgstr "Canaux populaires"
+#: ../../addon/js_upload/js_upload.php:47
+msgid "Failed"
+msgstr "Échec"
-#: ../../extend/addon/addon/irc/irc.php:53
-msgid "IRC Settings"
-msgstr "Paramètres IRC"
+#: ../../addon/js_upload/js_upload.php:315
+msgid "No files were uploaded."
+msgstr "Aucun fichier n'a été téléversé."
-#: ../../extend/addon/addon/irc/irc.php:69
-msgid "IRC settings saved."
-msgstr "Paramètres IRC sauvegardés"
+#: ../../addon/js_upload/js_upload.php:322
+msgid "Uploaded file is empty"
+msgstr "Le fichier téléversé est vide"
-#: ../../extend/addon/addon/irc/irc.php:74
-msgid "IRC Chatroom"
-msgstr "Salon de discussion IRC"
+#: ../../addon/js_upload/js_upload.php:335
+msgid "Image exceeds size limit of "
+msgstr "L'image excède la taille limite de"
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:305
-#: ../../include/channel.php:1139 ../../include/channel.php:1301
-msgid "Status:"
-msgstr "État&nbsp;:"
+#: ../../addon/js_upload/js_upload.php:347
+msgid "File has an invalid extension, it should be one of "
+msgstr "L'extension du fichier est invalide, elle doit être l'une des suivantes"
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:309
-msgid "Activate addon"
-msgstr "Activer l'extension"
+#: ../../addon/js_upload/js_upload.php:359
+msgid "Upload was cancelled, or server error encountered"
+msgstr "Le téléversement a été annulé, ou le serveur a rencontré une erreur"
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:313
-msgid "Hide Jappixmini Chat-Widget from the webinterface"
-msgstr "Cacher le widget de chat Jappixmini de l'interface web"
+#: ../../addon/dwpost/dwpost.php:42
+msgid "Post to Dreamwidth"
+msgstr "Publier sur Dreamwidth"
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:318
-msgid "Jabber username"
-msgstr "Identifiant Jabber"
+#: ../../addon/dwpost/dwpost.php:73
+msgid "Enable Dreamwidth Post Plugin"
+msgstr "Activer le plugin de publication Dreamwidth"
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:324
-msgid "Jabber server"
-msgstr "Serveur Jabber"
+#: ../../addon/dwpost/dwpost.php:77
+msgid "Dreamwidth username"
+msgstr "Nom d'utilisateur Dreamwidth"
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:330
-msgid "Jabber BOSH host URL"
-msgstr "Adresse hôte pour Jabber BOSH"
+#: ../../addon/dwpost/dwpost.php:81
+msgid "Dreamwidth password"
+msgstr "Mot de passe Dreamwidth"
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:337
-msgid "Jabber password"
-msgstr "Mot de passe Jabber"
+#: ../../addon/dwpost/dwpost.php:85
+msgid "Post to Dreamwidth by default"
+msgstr "Publication avec Dreamwidth par défaut"
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:343
-msgid "Encrypt Jabber password with Hubzilla password"
-msgstr "Chiffrer le mot de passe Jabber avec le mot de passe Hubzilla"
+#: ../../addon/dwpost/dwpost.php:89
+msgid "Dreamwidth Post Settings"
+msgstr "Paramètres de publication Dreamwidth"
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:347
-#: ../../extend/addon/addon/redred/redred.php:115
-msgid "Hubzilla password"
-msgstr "Mot de passe Hubzilla"
+#: ../../addon/firefox/firefox.php:23
+msgid "Install Firefox Sharing Tools"
+msgstr "Installer Firefox Sharing Tools"
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:351
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:355
-msgid "Approve subscription requests from Hubzilla contacts automatically"
-msgstr "Approuver automatiquement les demandes de connexion des contacts Hubzilla"
+#: ../../addon/firefox/firefox.php:34
+msgid "Share content from Firefox to $Projectname"
+msgstr "Partager du contenu depuis Firefox avec $Projectname"
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:359
-msgid "Purge internal list of jabber addresses of contacts"
-msgstr "Purger la liste interne des adresses jabber des contacts"
+#: ../../addon/firefox/firefox.php:37
+msgid "Install Firefox Sharing Tools to this web browser"
+msgstr "Installer Firefox Sharing Tools sur ce navigateur"
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:364
-msgid "Configuration Help"
-msgstr "Aide pour la configuration"
+#: ../../addon/dirstats/dirstats.php:94
+msgid "Hubzilla Directory Stats"
+msgstr "Statistiques de l'annuaire Hubzilla"
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:371
-msgid "Jappix Mini Settings"
-msgstr "Paramètres de Jappix mini"
+#: ../../addon/dirstats/dirstats.php:95
+msgid "Total Hubs"
+msgstr "Total de Hubs"
-#: ../../extend/addon/addon/js_upload/js_upload.php:44
-msgid "Upload a file"
-msgstr "Téléverser un fichier"
+#: ../../addon/dirstats/dirstats.php:97
+msgid "Hubzilla Hubs"
+msgstr "Hubs Hubzilla"
-#: ../../extend/addon/addon/js_upload/js_upload.php:45
-msgid "Drop files here to upload"
-msgstr "Glisser les fichiers ici pour téléversement"
+#: ../../addon/dirstats/dirstats.php:99
+msgid "Friendica Hubs"
+msgstr "Hubs Friendica"
-#: ../../extend/addon/addon/js_upload/js_upload.php:47
-msgid "Failed"
-msgstr "Échec"
+#: ../../addon/dirstats/dirstats.php:101
+msgid "Diaspora Pods"
+msgstr "Pods Diaspora"
-#: ../../extend/addon/addon/js_upload/js_upload.php:315
-msgid "No files were uploaded."
-msgstr "Aucun fichier n'a été téléversé."
+#: ../../addon/dirstats/dirstats.php:103
+msgid "Hubzilla Channels"
+msgstr "Canaux Hubzilla"
-#: ../../extend/addon/addon/js_upload/js_upload.php:322
-msgid "Uploaded file is empty"
-msgstr "Le fichier téléversé est vide"
+#: ../../addon/dirstats/dirstats.php:105
+msgid "Friendica Channels"
+msgstr "Canaux Friendica"
-#: ../../extend/addon/addon/js_upload/js_upload.php:335
-msgid "Image exceeds size limit of "
-msgstr "L'image excède la taille limite de"
+#: ../../addon/dirstats/dirstats.php:107
+msgid "Diaspora Channels"
+msgstr "Canaux Diaspora"
-#: ../../extend/addon/addon/js_upload/js_upload.php:347
-msgid "File has an invalid extension, it should be one of "
-msgstr "L'extension du fichier est invalide, elle doit être l'une des suivantes"
+#: ../../addon/dirstats/dirstats.php:109
+msgid "Aged 35 and above"
+msgstr "Âgé de 35 ans et plus"
-#: ../../extend/addon/addon/js_upload/js_upload.php:359
-msgid "Upload was cancelled, or server error encountered"
-msgstr "Le téléversement a été annulé, ou le serveur a rencontré une erreur"
+#: ../../addon/dirstats/dirstats.php:111
+msgid "Aged 34 and under"
+msgstr "Âgé de 34 et moins"
-#: ../../extend/addon/addon/ldapauth/ldapauth.php:61
-msgid "An account has been created for you."
-msgstr "Un compte a été créé pour vous."
+#: ../../addon/dirstats/dirstats.php:113
+msgid "Average Age"
+msgstr "Âge moyen"
-#: ../../extend/addon/addon/ldapauth/ldapauth.php:68
-msgid "Authentication successful but rejected: account creation is disabled."
-msgstr "L'authentification a réussi mais a été rejetée : la création de comptes est désactivée."
+#: ../../addon/dirstats/dirstats.php:115
+msgid "Known Chatrooms"
+msgstr "Salons de discussion connus"
-#: ../../extend/addon/addon/libertree/libertree.php:38
-msgid "Post to Libertree"
-msgstr "Publier sur Libertree"
+#: ../../addon/dirstats/dirstats.php:117
+msgid "Known Tags"
+msgstr "Étiquettes connues"
-#: ../../extend/addon/addon/libertree/libertree.php:69
-msgid "Enable Libertree Post Plugin"
-msgstr "Activer le plugin de publication Libertree"
+#: ../../addon/dirstats/dirstats.php:119
+msgid ""
+"Please note Diaspora and Friendica statistics are merely those **this "
+"directory** is aware of, and not all those known in the network. This also "
+"applies to chatrooms,"
+msgstr "Veuillez noter que les statistiques de Diaspora et Friendica sont simplement celles dont **ce répertoire** est au courant, et pas toutes celles connues dans le réseau. Cela s'applique également aux salles de discussion,"
-#: ../../extend/addon/addon/libertree/libertree.php:73
-msgid "Libertree API token"
-msgstr "Jeton de l'API Libertree"
+#: ../../addon/mailhost/mailhost.php:36
+msgid "Email notification hub"
+msgstr "Notification par mail du hub"
-#: ../../extend/addon/addon/libertree/libertree.php:77
-msgid "Libertree site URL"
-msgstr "Adresse du site Libertree"
+#: ../../addon/mailhost/mailhost.php:36
+msgid "Hostname"
+msgstr "Nom d'hôte"
-#: ../../extend/addon/addon/libertree/libertree.php:81
-msgid "Post to Libertree by default"
-msgstr "Par défaut, publier sur Libertree"
+#: ../../addon/mailhost/mailhost.php:40
+msgid "Mailhost Settings"
+msgstr "Paramètres mail de l'hôte"
-#: ../../extend/addon/addon/libertree/libertree.php:85
-msgid "Libertree Post Settings"
-msgstr "Paramètres de publication pour Libertree"
+#: ../../addon/mailhost/mailhost.php:54
+msgid "MAILHOST Settings saved."
+msgstr "Paramètres mail de l'hôte sauvegardés."
-#: ../../extend/addon/addon/libertree/libertree.php:99
-msgid "Libertree Settings saved."
-msgstr "Paramètres de Libertree sauvegardés."
+#: ../../addon/likebanner/likebanner.php:51
+msgid "Your Webbie:"
+msgstr "Vous êtes Webbie :"
+
+#: ../../addon/likebanner/likebanner.php:54
+msgid "Fontsize (px):"
+msgstr "Taille de la police (px) :"
+
+#: ../../addon/likebanner/likebanner.php:68
+msgid "Link:"
+msgstr "Lien :"
+
+#: ../../addon/likebanner/likebanner.php:70
+msgid "Like us on Hubzilla"
+msgstr "Aimez-nous sur Hubzilla"
+
+#: ../../addon/likebanner/likebanner.php:72
+msgid "Embed:"
+msgstr "Embarqué :"
+
+#: ../../addon/redphotos/redphotos.php:106
+msgid "Photos imported"
+msgstr "Photos importées"
+
+#: ../../addon/redphotos/redphotos.php:129
+msgid "Redmatrix Photo Album Import"
+msgstr "Import de l'album photo Redmatrix"
+
+#: ../../addon/redphotos/redphotos.php:130
+msgid "This will import all your Redmatrix photo albums to this channel."
+msgstr "Ceci va importer l'intégralité de vos albums photos Redmatrix dans ce canal."
+
+#: ../../addon/redphotos/redphotos.php:131
+#: ../../addon/redfiles/redfiles.php:121
+msgid "Redmatrix Server base URL"
+msgstr "URL de base du serveur Redmatrix"
+
+#: ../../addon/redphotos/redphotos.php:132
+#: ../../addon/redfiles/redfiles.php:122
+msgid "Redmatrix Login Username"
+msgstr "Identifiant de connexion Redmatrix"
+
+#: ../../addon/redphotos/redphotos.php:133
+#: ../../addon/redfiles/redfiles.php:123
+msgid "Redmatrix Login Password"
+msgstr "Mot de passe de connexion Redmatrix"
+
+#: ../../addon/redphotos/redphotos.php:134
+msgid "Import just this album"
+msgstr "Importer uniquement cet album"
+
+#: ../../addon/redphotos/redphotos.php:134
+msgid "Leave blank to import all albums"
+msgstr "Laisser vide pour importer tous les albums"
+
+#: ../../addon/redphotos/redphotos.php:135
+msgid "Maximum count to import"
+msgstr "Nombre maximum de comptes à importer"
+
+#: ../../addon/redphotos/redphotos.php:135
+msgid "0 or blank to import all available"
+msgstr "0 ou vide pour importer tout ce qui est disponible"
+
+#: ../../addon/irc/irc.php:45
+msgid "Channels to auto connect"
+msgstr "Canaux à connecter automatiqument"
+
+#: ../../addon/irc/irc.php:45 ../../addon/irc/irc.php:49
+msgid "Comma separated list"
+msgstr "Liste séparée par des virgules"
-#: ../../extend/addon/addon/ljpost/ljpost.php:42
+#: ../../addon/irc/irc.php:49 ../../addon/irc/irc.php:96
+msgid "Popular Channels"
+msgstr "Canaux populaires"
+
+#: ../../addon/irc/irc.php:53
+msgid "IRC Settings"
+msgstr "Paramètres IRC"
+
+#: ../../addon/irc/irc.php:69
+msgid "IRC settings saved."
+msgstr "Paramètres IRC sauvegardés"
+
+#: ../../addon/irc/irc.php:74
+msgid "IRC Chatroom"
+msgstr "Salon de discussion IRC"
+
+#: ../../addon/ljpost/ljpost.php:42
msgid "Post to LiveJournal"
msgstr "Publier sur LiveJournal"
-#: ../../extend/addon/addon/ljpost/ljpost.php:70
+#: ../../addon/ljpost/ljpost.php:70
msgid "Enable LiveJournal Post Plugin"
msgstr "Activer le plugin de publication LiveJournal"
-#: ../../extend/addon/addon/ljpost/ljpost.php:74
+#: ../../addon/ljpost/ljpost.php:74
msgid "LiveJournal username"
msgstr "Identifiant LiveJournal"
-#: ../../extend/addon/addon/ljpost/ljpost.php:78
+#: ../../addon/ljpost/ljpost.php:78
msgid "LiveJournal password"
msgstr "Mot de passe LiveJournal"
-#: ../../extend/addon/addon/ljpost/ljpost.php:82
+#: ../../addon/ljpost/ljpost.php:82
msgid "Post to LiveJournal by default"
msgstr "Par défaut, publier sur LiveJournal"
-#: ../../extend/addon/addon/ljpost/ljpost.php:86
+#: ../../addon/ljpost/ljpost.php:86
msgid "LiveJournal Post Settings"
msgstr "Paramètres de publication LiveJournal"
-#: ../../extend/addon/addon/ljpost/ljpost.php:101
+#: ../../addon/ljpost/ljpost.php:101
msgid "LiveJournal Settings saved."
msgstr "Paramètres LiveJournal sauvegardés."
-#: ../../extend/addon/addon/logrot/logrot.php:36
-msgid "Logfile archive directory"
-msgstr "Répertoire d'archivage du fichier journal"
-
-#: ../../extend/addon/addon/logrot/logrot.php:36
-msgid "Directory to store rotated logs"
-msgstr "Répertoire où stocker les journaux de rotation"
-
-#: ../../extend/addon/addon/logrot/logrot.php:37
-msgid "Logfile size in bytes before rotating"
-msgstr "Taille du fichier journal en octets avant la rotation"
+#: ../../addon/openid/openid.php:49
+msgid ""
+"We encountered a problem while logging in with the OpenID you provided. "
+"Please check the correct spelling of the ID."
+msgstr "Nous avons rencontrons un problème lors de l'identification avec l'OpenID que vous avez fournie. Veuillez vérifier que vous avez correctement écrit votre ID."
-#: ../../extend/addon/addon/logrot/logrot.php:38
-msgid "Number of logfiles to retain"
-msgstr "Nombre de fichiers de journal à conserver"
+#: ../../addon/openid/openid.php:49
+msgid "The error message was:"
+msgstr "Le message d'erreur était :"
-#: ../../extend/addon/addon/mailhost/mailhost.php:36
-msgid "Email notification hub"
-msgstr "Notification par mail du hub"
+#: ../../addon/openid/MysqlProvider.php:52
+msgid "First Name"
+msgstr "Prénom"
-#: ../../extend/addon/addon/mailhost/mailhost.php:36
-msgid "Hostname"
-msgstr "Nom d'hôte"
+#: ../../addon/openid/MysqlProvider.php:53
+msgid "Last Name"
+msgstr "Nom"
-#: ../../extend/addon/addon/mailhost/mailhost.php:40
-msgid "Mailhost Settings"
-msgstr "Paramètres mail de l'hôte"
+#: ../../addon/openid/MysqlProvider.php:54 ../../addon/redred/redred.php:111
+msgid "Nickname"
+msgstr "Surnom"
-#: ../../extend/addon/addon/mailhost/mailhost.php:54
-msgid "MAILHOST Settings saved."
-msgstr "Paramètres mail de l'hôte sauvegardés."
+#: ../../addon/openid/MysqlProvider.php:55
+msgid "Full Name"
+msgstr "Nom complet"
-#: ../../extend/addon/addon/moremoods/moremoods.php:19
-msgid "lonely"
-msgstr "isolé"
+#: ../../addon/openid/MysqlProvider.php:61
+msgid "Profile Photo 16px"
+msgstr "Photo de profil 16px"
-#: ../../extend/addon/addon/moremoods/moremoods.php:20
-msgid "drunk"
-msgstr "saoul"
+#: ../../addon/openid/MysqlProvider.php:62
+msgid "Profile Photo 32px"
+msgstr "Photo de profil 32px"
-#: ../../extend/addon/addon/moremoods/moremoods.php:21
-msgid "horny"
-msgstr "libidineux"
+#: ../../addon/openid/MysqlProvider.php:63
+msgid "Profile Photo 48px"
+msgstr "Photo de profil 48px"
-#: ../../extend/addon/addon/moremoods/moremoods.php:22
-msgid "stoned"
-msgstr "défoncé"
+#: ../../addon/openid/MysqlProvider.php:64
+msgid "Profile Photo 64px"
+msgstr "Photo de profil 64px"
-#: ../../extend/addon/addon/moremoods/moremoods.php:23
-msgid "fucked up"
-msgstr "cramé"
+#: ../../addon/openid/MysqlProvider.php:65
+msgid "Profile Photo 80px"
+msgstr "Photo de profil 80px"
-#: ../../extend/addon/addon/moremoods/moremoods.php:24
-msgid "clusterfucked"
-msgstr "énervé"
+#: ../../addon/openid/MysqlProvider.php:66
+msgid "Profile Photo 128px"
+msgstr "Photo de profil 128px"
-#: ../../extend/addon/addon/moremoods/moremoods.php:25
-msgid "crazy"
-msgstr "cinglé"
+#: ../../addon/openid/MysqlProvider.php:67
+msgid "Timezone"
+msgstr "Fuseau horaire"
-#: ../../extend/addon/addon/moremoods/moremoods.php:26
-msgid "hurt"
-msgstr "dommage"
+#: ../../addon/openid/MysqlProvider.php:70
+msgid "Birth Year"
+msgstr "Années de naissance"
-#: ../../extend/addon/addon/moremoods/moremoods.php:27
-msgid "sleepy"
-msgstr "somnolent"
+#: ../../addon/openid/MysqlProvider.php:71
+msgid "Birth Month"
+msgstr "Mois de naissance"
-#: ../../extend/addon/addon/moremoods/moremoods.php:28
-msgid "grumpy"
-msgstr "grognon"
+#: ../../addon/openid/MysqlProvider.php:72
+msgid "Birth Day"
+msgstr "Jour de naissance"
-#: ../../extend/addon/addon/moremoods/moremoods.php:29
-msgid "high"
-msgstr "allumé"
+#: ../../addon/openid/MysqlProvider.php:73
+msgid "Birthdate"
+msgstr "Date de naissance"
-#: ../../extend/addon/addon/moremoods/moremoods.php:30
-msgid "semi-conscious"
-msgstr "à demi-conscient"
+#: ../../addon/openid/Mod_Openid.php:30
+msgid "OpenID protocol error. No ID returned."
+msgstr "Erreur du protocole OpenID. Aucune ID trouvée."
-#: ../../extend/addon/addon/moremoods/moremoods.php:31
-msgid "in love"
-msgstr "amoureux"
+#: ../../addon/openid/Mod_Openid.php:188 ../../include/auth.php:286
+msgid "Login failed."
+msgstr "Échec de la connexion."
-#: ../../extend/addon/addon/moremoods/moremoods.php:32
-msgid "in lust"
-msgstr "convoitise"
+#: ../../addon/openid/Mod_Id.php:85 ../../include/selectors.php:49
+#: ../../include/selectors.php:66
+msgid "Male"
+msgstr "Homme"
-#: ../../extend/addon/addon/moremoods/moremoods.php:33
-msgid "naked"
-msgstr "nu"
+#: ../../addon/openid/Mod_Id.php:87 ../../include/selectors.php:49
+#: ../../include/selectors.php:66
+msgid "Female"
+msgstr "Femme"
-#: ../../extend/addon/addon/moremoods/moremoods.php:34
-msgid "stinky"
-msgstr "puant"
+#: ../../addon/randpost/randpost.php:97
+msgid "You're welcome."
+msgstr "Bienvenue."
-#: ../../extend/addon/addon/moremoods/moremoods.php:35
-msgid "sweaty"
-msgstr "en sueur"
+#: ../../addon/randpost/randpost.php:98
+msgid "Ah shucks..."
+msgstr "Ah m…"
-#: ../../extend/addon/addon/moremoods/moremoods.php:36
-msgid "bleeding out"
-msgstr "en sang"
+#: ../../addon/randpost/randpost.php:99
+msgid "Don't mention it."
+msgstr "De rien."
-#: ../../extend/addon/addon/moremoods/moremoods.php:37
-msgid "victorious"
-msgstr "victorieux"
+#: ../../addon/randpost/randpost.php:100
+msgid "&lt;blush&gt;"
+msgstr "&lt;rougit&gt;"
-#: ../../extend/addon/addon/moremoods/moremoods.php:38
-msgid "defeated"
-msgstr "vaincu"
+#: ../../addon/startpage/startpage.php:109
+msgid "Page to load after login"
+msgstr "Page à charger après l'identification"
-#: ../../extend/addon/addon/moremoods/moremoods.php:39
-msgid "envious"
-msgstr "envieux"
+#: ../../addon/startpage/startpage.php:109
+msgid ""
+"Examples: &quot;apps&quot;, &quot;network?f=&gid=37&quot; (privacy "
+"collection), &quot;channel&quot; or &quot;notifications/system&quot; (leave "
+"blank for default network page (grid)."
+msgstr "Exemples: &quot;apps&quot;, &quot;network?f=&gid=37&quot; (privacy collection), &quot;channel&quot; or &quot;notifications/system&quot; (laisser vide pour la page par défaut du réseau (grille)."
-#: ../../extend/addon/addon/moremoods/moremoods.php:40
-msgid "jealous"
-msgstr "jaloux"
+#: ../../addon/startpage/startpage.php:113
+msgid "Startpage Settings"
+msgstr "Paramètres de la page de démarrage"
-#: ../../extend/addon/addon/morepokes/morepokes.php:19
+#: ../../addon/morepokes/morepokes.php:19
msgid "bitchslap"
msgstr "giffler"
-#: ../../extend/addon/addon/morepokes/morepokes.php:19
+#: ../../addon/morepokes/morepokes.php:19
msgid "bitchslapped"
msgstr "gifflé(e)"
-#: ../../extend/addon/addon/morepokes/morepokes.php:20
+#: ../../addon/morepokes/morepokes.php:20
msgid "shag"
msgstr "baiser"
-#: ../../extend/addon/addon/morepokes/morepokes.php:20
+#: ../../addon/morepokes/morepokes.php:20
msgid "shagged"
msgstr "baisé"
-#: ../../extend/addon/addon/morepokes/morepokes.php:21
+#: ../../addon/morepokes/morepokes.php:21
msgid "patent"
msgstr "breveté"
-#: ../../extend/addon/addon/morepokes/morepokes.php:21
+#: ../../addon/morepokes/morepokes.php:21
msgid "patented"
msgstr "être breveté"
-#: ../../extend/addon/addon/morepokes/morepokes.php:22
+#: ../../addon/morepokes/morepokes.php:22
msgid "hug"
msgstr "étreindre"
-#: ../../extend/addon/addon/morepokes/morepokes.php:22
+#: ../../addon/morepokes/morepokes.php:22
msgid "hugged"
msgstr "être étreint"
-#: ../../extend/addon/addon/morepokes/morepokes.php:23
+#: ../../addon/morepokes/morepokes.php:23
msgid "murder"
msgstr "assassiner"
-#: ../../extend/addon/addon/morepokes/morepokes.php:23
+#: ../../addon/morepokes/morepokes.php:23
msgid "murdered"
msgstr "être assassiné"
-#: ../../extend/addon/addon/morepokes/morepokes.php:24
+#: ../../addon/morepokes/morepokes.php:24
msgid "worship"
msgstr "vénérer"
-#: ../../extend/addon/addon/morepokes/morepokes.php:24
+#: ../../addon/morepokes/morepokes.php:24
msgid "worshipped"
msgstr "être vénéré"
-#: ../../extend/addon/addon/morepokes/morepokes.php:25
+#: ../../addon/morepokes/morepokes.php:25
msgid "kiss"
msgstr "embrasser"
-#: ../../extend/addon/addon/morepokes/morepokes.php:25
+#: ../../addon/morepokes/morepokes.php:25
msgid "kissed"
msgstr "embrassé"
-#: ../../extend/addon/addon/morepokes/morepokes.php:26
+#: ../../addon/morepokes/morepokes.php:26
msgid "tempt"
msgstr "tenter"
-#: ../../extend/addon/addon/morepokes/morepokes.php:26
+#: ../../addon/morepokes/morepokes.php:26
msgid "tempted"
msgstr "tenté"
-#: ../../extend/addon/addon/morepokes/morepokes.php:27
+#: ../../addon/morepokes/morepokes.php:27
msgid "raise eyebrows at"
msgstr "soulever les sourcils à la vue de"
-#: ../../extend/addon/addon/morepokes/morepokes.php:27
+#: ../../addon/morepokes/morepokes.php:27
msgid "raised their eyebrows at"
msgstr "sourcils soulevés à la vue de"
-#: ../../extend/addon/addon/morepokes/morepokes.php:28
+#: ../../addon/morepokes/morepokes.php:28
msgid "insult"
msgstr "insulter"
-#: ../../extend/addon/addon/morepokes/morepokes.php:28
+#: ../../addon/morepokes/morepokes.php:28
msgid "insulted"
msgstr "insulté"
-#: ../../extend/addon/addon/morepokes/morepokes.php:29
+#: ../../addon/morepokes/morepokes.php:29
msgid "praise"
msgstr "louer"
-#: ../../extend/addon/addon/morepokes/morepokes.php:29
+#: ../../addon/morepokes/morepokes.php:29
msgid "praised"
msgstr "loué"
-#: ../../extend/addon/addon/morepokes/morepokes.php:30
+#: ../../addon/morepokes/morepokes.php:30
msgid "be dubious of"
msgstr "douter de"
-#: ../../extend/addon/addon/morepokes/morepokes.php:30
+#: ../../addon/morepokes/morepokes.php:30
msgid "was dubious of"
msgstr "avoir douté de"
-#: ../../extend/addon/addon/morepokes/morepokes.php:31
+#: ../../addon/morepokes/morepokes.php:31
msgid "eat"
msgstr "manger"
-#: ../../extend/addon/addon/morepokes/morepokes.php:31
+#: ../../addon/morepokes/morepokes.php:31
msgid "ate"
msgstr "a mangé"
-#: ../../extend/addon/addon/morepokes/morepokes.php:32
+#: ../../addon/morepokes/morepokes.php:32
msgid "giggle and fawn at"
msgstr "séduire, charmer"
-#: ../../extend/addon/addon/morepokes/morepokes.php:32
+#: ../../addon/morepokes/morepokes.php:32
msgid "giggled and fawned at"
msgstr "séduit(e), charmé(e)"
-#: ../../extend/addon/addon/morepokes/morepokes.php:33
+#: ../../addon/morepokes/morepokes.php:33
msgid "doubt"
msgstr "doute"
-#: ../../extend/addon/addon/morepokes/morepokes.php:33
+#: ../../addon/morepokes/morepokes.php:33
msgid "doubted"
msgstr "a douté"
-#: ../../extend/addon/addon/morepokes/morepokes.php:34
+#: ../../addon/morepokes/morepokes.php:34
msgid "glare"
msgstr "jeter un regard"
-#: ../../extend/addon/addon/morepokes/morepokes.php:34
+#: ../../addon/morepokes/morepokes.php:34
msgid "glared at"
msgstr "a jeté un regard à "
-#: ../../extend/addon/addon/morepokes/morepokes.php:35
+#: ../../addon/morepokes/morepokes.php:35
msgid "fuck"
msgstr "baiser"
-#: ../../extend/addon/addon/morepokes/morepokes.php:35
+#: ../../addon/morepokes/morepokes.php:35
msgid "fucked"
msgstr "être baisé"
-#: ../../extend/addon/addon/morepokes/morepokes.php:36
+#: ../../addon/morepokes/morepokes.php:36
msgid "bonk"
msgstr "baiser"
-#: ../../extend/addon/addon/morepokes/morepokes.php:36
+#: ../../addon/morepokes/morepokes.php:36
msgid "bonked"
msgstr "baisé(e)"
-#: ../../extend/addon/addon/morepokes/morepokes.php:37
+#: ../../addon/morepokes/morepokes.php:37
msgid "declare undying love for"
msgstr "Déclarer un amour éternel pour"
-#: ../../extend/addon/addon/morepokes/morepokes.php:37
+#: ../../addon/morepokes/morepokes.php:37
msgid "declared undying love for"
msgstr "A déclaré l'amour éternel pour"
-#: ../../extend/addon/addon/msgfooter/msgfooter.php:46
-#: ../../extend/addon/addon/xmpp/xmpp.php:91
-msgid "Save Settings"
-msgstr "Sauvegarder les paramètres"
-
-#: ../../extend/addon/addon/msgfooter/msgfooter.php:47
-msgid "text to include in all outgoing posts from this site"
-msgstr "Texte à inclure dans tous les messages sortants de ce site"
-
-#: ../../extend/addon/addon/nofed/nofed.php:42
-msgid "Federate"
-msgstr "Fédérer"
-
-#: ../../extend/addon/addon/nofed/nofed.php:56
-msgid "nofed Settings saved."
-msgstr "Les paramètres nfed ont été enregistrés."
-
-#: ../../extend/addon/addon/nofed/nofed.php:72
-msgid "Allow Federation Toggle"
-msgstr "Autoriser la fédération avec Toggle"
+#: ../../addon/diaspora/diaspora.php:677
+msgid "Diaspora Protocol Settings updated."
+msgstr ""
-#: ../../extend/addon/addon/nofed/nofed.php:76
-msgid "Federate posts by default"
-msgstr "Par défaut, fédérer les publications."
+#: ../../addon/diaspora/diaspora.php:696
+msgid "Enable the Diaspora protocol for this channel"
+msgstr ""
-#: ../../extend/addon/addon/nofed/nofed.php:80
-msgid "NoFed Settings"
-msgstr "Paramètres NoFed"
+#: ../../addon/diaspora/diaspora.php:700
+msgid "Allow any Diaspora member to comment on your public posts"
+msgstr ""
-#: ../../extend/addon/addon/nsabait/nsabait.php:125
-msgid "Nsabait Settings updated."
-msgstr "Les paramètres Nsabait ont été enregistrés."
+#: ../../addon/diaspora/diaspora.php:704
+msgid "Prevent your hashtags from being redirected to other sites"
+msgstr ""
-#: ../../extend/addon/addon/nsabait/nsabait.php:157
-msgid "Enable NSAbait Plugin"
-msgstr "Activer le plugin NSAbait"
+#: ../../addon/diaspora/diaspora.php:709
+msgid "Followed hashtags (comma separated, do not include the #)"
+msgstr ""
-#: ../../extend/addon/addon/nsabait/nsabait.php:161
-msgid "NSAbait Settings"
-msgstr "Paramètres NSAbait"
+#: ../../addon/diaspora/diaspora.php:714
+msgid "Diaspora Protocol Settings"
+msgstr ""
-#: ../../extend/addon/addon/nsfw/nsfw.php:80
-msgid ""
-"This plugin looks in posts for the words/text you specify below, and "
-"collapses any content containing those keywords so it is not displayed at "
-"inappropriate times, such as sexual innuendo that may be improper in a work "
-"setting. It is polite and recommended to tag any content containing nudity "
-"with #NSFW. This filter can also match any other word/text you specify, and"
-" can thereby be used as a general purpose content filter."
-msgstr "Ce plugin cherche dans les publications les mots/textes que vous spécifiez ci-dessous, et réduit tout contenu contenant ces mots-clés afin qu'ils ne s'affichent pas à des moments inappropriés, tels que les insinuations sexuelles qui peuvent être inappropriées dans un contexte de travail. Il est poli et recommandé de marquer tout contenu contenant de la nudité avec #NSFW. Ce filtre peut également correspondre à tout autre mot/texte que vous spécifiez et peut ainsi être utilisé comme un filtre de contenu à usage général."
+#: ../../addon/diaspora/import_diaspora.php:16
+msgid "No username found in import file."
+msgstr ""
-#: ../../extend/addon/addon/nsfw/nsfw.php:84
-msgid "Enable Content filter"
-msgstr "Activer le filtrage des contenus"
+#: ../../addon/diaspora/import_diaspora.php:41 ../../include/import.php:62
+msgid "Unable to create a unique channel address. Import failed."
+msgstr "Impossible de créer une adresse de canal unique. Echec de l'import."
-#: ../../extend/addon/addon/nsfw/nsfw.php:88
-msgid "Comma separated list of keywords to hide"
-msgstr "Liste séparée par des virgules des mots-clés à cacher"
+#: ../../addon/gitwiki/Mod_Gitwiki.php:107
+msgid "Error retrieving wiki"
+msgstr "Erreur lors de la récupération du wiki"
-#: ../../extend/addon/addon/nsfw/nsfw.php:88
-msgid "Word, /regular-expression/, lang=xx, lang!=xx"
-msgstr "Mot, /expression-régulière/, lang=xx, lang!=xx"
+#: ../../addon/gitwiki/Mod_Gitwiki.php:114
+msgid "Error creating zip file export folder"
+msgstr "Erreur lors de la création du dossier d'exportation du fichier zip"
-#: ../../extend/addon/addon/nsfw/nsfw.php:92
-msgid "Not Safe For Work Settings"
-msgstr "Paramètres NSFW (Not Safe For Work)"
+#: ../../addon/gitwiki/Mod_Gitwiki.php:132
+msgid "Error downloading wiki: "
+msgstr "Erreur lors du téléchargement du wiki:"
-#: ../../extend/addon/addon/nsfw/nsfw.php:92
-msgid "General Purpose Content Filter"
-msgstr "Filtre de contenu sujet général"
+#: ../../addon/testdrive/testdrive.php:104
+#, php-format
+msgid "Your account on %s will expire in a few days."
+msgstr "Votre compte sur %s expirera dans quelques jours."
-#: ../../extend/addon/addon/nsfw/nsfw.php:110
-msgid "NSFW Settings saved."
-msgstr "Paramètres NSFW sauvegardés."
+#: ../../addon/testdrive/testdrive.php:105
+msgid "Your $Productname test account is about to expire."
+msgstr "Votre compte de test $NomDeProduit est sur le point d'expirer."
-#: ../../extend/addon/addon/nsfw/nsfw.php:207
-msgid "Possible adult content"
-msgstr "Contenu pour adulte probable"
+#: ../../addon/rainbowtag/rainbowtag.php:81
+msgid "Enable Rainbowtag"
+msgstr "Activer Rainbowtag"
-#: ../../extend/addon/addon/nsfw/nsfw.php:211
-#, php-format
-msgid "%s - view"
-msgstr ""
+#: ../../addon/rainbowtag/rainbowtag.php:85
+msgid "Rainbowtag Settings"
+msgstr "Paramètres Rainbowtag"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:50
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:128
-msgid "System defaults:"
-msgstr "Paramètres par défaut du système :"
+#: ../../addon/rainbowtag/rainbowtag.php:101
+msgid "Rainbowtag Settings saved."
+msgstr "Paramètres Rainbowtag sauvegardés."
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:54
-msgid "Preferred Clipart IDs"
-msgstr "ID Clipart préférées"
+#: ../../addon/upload_limits/upload_limits.php:25
+msgid "Show Upload Limits"
+msgstr "Afficher les limites de débit ascendant (upload)"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:54
-msgid "List of preferred clipart ids. These will be shown first."
-msgstr "Liste des ids clipart préférése. Celles-ci seront montrées en premier."
+#: ../../addon/upload_limits/upload_limits.php:27
+msgid "Hubzilla configured maximum size: "
+msgstr "Taille maximale configurée par Hubzilla:"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:55
-msgid "Default Search Term"
-msgstr "Terme de recherche par défaut"
+#: ../../addon/upload_limits/upload_limits.php:28
+msgid "PHP upload_max_filesize: "
+msgstr "PHP upload_max_filesize: "
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:55
-msgid "The default search term. These will be shown second."
-msgstr "Le terme de recherche par défaut. Ceci sera affiché en second."
+#: ../../addon/upload_limits/upload_limits.php:29
+msgid "PHP post_max_size (must be larger than upload_max_filesize): "
+msgstr "PHP post_max_size (must be larger than upload_max_filesize): "
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:56
-msgid "Return After"
-msgstr "Retourner ensuite"
+#: ../../addon/visage/visage.php:93
+msgid "Recent Channel/Profile Viewers"
+msgstr "Visiteurs récents du canal/profil"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:56
-msgid "Page to load after image selection."
-msgstr "Page à afficher après la sélection de l'image."
+#: ../../addon/visage/visage.php:98
+msgid "This plugin/addon has not been configured."
+msgstr "Cette extension n'a pas été configurée."
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:58
-#: ../../include/channel.php:1048 ../../include/nav.php:107
-msgid "Edit Profile"
-msgstr "Éditeur de profil"
+#: ../../addon/visage/visage.php:99
+#, php-format
+msgid "Please visit the Visage settings on %s"
+msgstr "Veuillez visiter les paramètres de Visage sur %s"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:59
-msgid "Profile List"
-msgstr "Liste de profil"
+#: ../../addon/visage/visage.php:99
+msgid "your feature settings page"
+msgstr "La page des paramètres de vos fonctionnalités"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:61
-msgid "Order of Preferred"
-msgstr "Tri selon les préférences"
+#: ../../addon/visage/visage.php:112
+msgid "No entries."
+msgstr "Aucune entrée."
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:61
-msgid "Sort order of preferred clipart ids."
-msgstr "Ordre de tri des ids de clipart préférés."
+#: ../../addon/visage/visage.php:166
+msgid "Enable Visage Visitor Logging"
+msgstr "Activer la connexion Visage Visitor"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:62
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:68
-msgid "Newest first"
-msgstr "Les plus récents en premier"
+#: ../../addon/visage/visage.php:170
+msgid "Visage Settings"
+msgstr "Paramètres Visage"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:65
-msgid "As entered"
-msgstr "Comme entrés"
+#: ../../addon/nsabait/nsabait.php:125
+msgid "Nsabait Settings updated."
+msgstr "Les paramètres Nsabait ont été enregistrés."
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:67
-msgid "Order of other"
-msgstr "Tri selon autre"
+#: ../../addon/nsabait/nsabait.php:157
+msgid "Enable NSAbait Plugin"
+msgstr "Activer le plugin NSAbait"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:67
-msgid "Sort order of other clipart ids."
-msgstr "Ordre de tri des autres clipart ids."
+#: ../../addon/nsabait/nsabait.php:161
+msgid "NSAbait Settings"
+msgstr "Paramètres NSAbait"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:69
-msgid "Most downloaded first"
-msgstr "Les plus téléchargés en premier"
+#: ../../addon/mailtest/mailtest.php:19
+msgid "Send test email"
+msgstr "Envoyer un mail de test"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:70
-msgid "Most liked first"
-msgstr "Les plus aimés en premier"
+#: ../../addon/mailtest/mailtest.php:50 ../../addon/hubwall/hubwall.php:50
+msgid "No recipients found."
+msgstr "Aucun destinataire trouvé."
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:72
-msgid "Preferred IDs Message"
-msgstr "IDs des messages préférés"
+#: ../../addon/mailtest/mailtest.php:66
+msgid "Mail sent."
+msgstr "Mail envoyé."
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:72
-msgid "Message to display above preferred results."
-msgstr "Message à afficher au-dessus de la liste des résultats préférés."
+#: ../../addon/mailtest/mailtest.php:68
+msgid "Sending of mail failed."
+msgstr "L'envoi du mail a échoué."
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:78
-msgid "Uploaded by: "
-msgstr "Téléversé par :"
+#: ../../addon/mailtest/mailtest.php:77
+msgid "Mail Test"
+msgstr "Test du mail"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:78
-msgid "Drawn by: "
-msgstr "Dessiné par :"
+#: ../../addon/mailtest/mailtest.php:96 ../../addon/hubwall/hubwall.php:92
+msgid "Message subject"
+msgstr "Objet du message"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:192
-msgid "Or select from a free OpenClipart.org image:"
-msgstr "ou sélectionner une image libre d'OpenClipart.org :"
+#: ../../addon/diaspora_reconnect/diaspora_reconnect.php:44
+#, php-format
+msgid "Reconnecting %d connections"
+msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:195
-msgid "Search Term"
-msgstr "Terme de recherche"
+#: ../../addon/diaspora_reconnect/diaspora_reconnect.php:63
+msgid "Diaspora Reconnect"
+msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:232
-msgid "Unknown error. Please try again later."
-msgstr "Erreur inconnue. Veuillez essayer à nouveau plus tard."
+#: ../../addon/diaspora_reconnect/diaspora_reconnect.php:65
+msgid ""
+"Use this form to re-establish Diaspora connections which were initially made"
+" from a different hub."
+msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:305
-msgid "Profile photo updated successfully."
-msgstr "Photo de profil actualisée avec succès."
+#: ../../addon/diaspora_reconnect/diaspora_reconnect.php:70
+msgid "Reconnect"
+msgstr ""
-#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:146
+#: ../../addon/openstreetmap/openstreetmap.php:146
msgid "View Larger"
msgstr "Afficher en plus grand"
-#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:169
+#: ../../addon/openstreetmap/openstreetmap.php:169
msgid "Tile Server URL"
msgstr "URL de la tuile du serveur"
-#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:169
+#: ../../addon/openstreetmap/openstreetmap.php:169
msgid ""
"A list of <a href=\"http://wiki.openstreetmap.org/wiki/TMS\" "
"target=\"_blank\">public tile servers</a>"
msgstr "Une liste de <a href=\"http://wiki.openstreetmap.org/wiki/TMS\" target=\"_blank\">serveurs de cartes publics</a>"
-#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:170
+#: ../../addon/openstreetmap/openstreetmap.php:170
msgid "Nominatim (reverse geocoding) Server URL"
msgstr "URL du serveur Nominatim (géocodage inversé)"
-#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:170
+#: ../../addon/openstreetmap/openstreetmap.php:170
msgid ""
"A list of <a href=\"http://wiki.openstreetmap.org/wiki/Nominatim\" "
"target=\"_blank\">Nominatim servers</a>"
msgstr "Une liste de <a href=\"http://wiki.openstreetmap.org/wiki/Nominatim\" target=\"_blank\">serveurs Nominatim</a>"
-#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:171
+#: ../../addon/openstreetmap/openstreetmap.php:171
msgid "Default zoom"
msgstr "Zoom par défaut"
-#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:171
+#: ../../addon/openstreetmap/openstreetmap.php:171
msgid ""
"The default zoom level. (1:world, 18:highest, also depends on tile server)"
msgstr "Le niveau de zoom par défaut. (1: monde, 18: plus élevé, dépend également du serveur de tuiles)"
-#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:172
+#: ../../addon/openstreetmap/openstreetmap.php:172
msgid "Include marker on map"
msgstr "Inclure le marqueur sur la carte"
-#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:172
+#: ../../addon/openstreetmap/openstreetmap.php:172
msgid "Include a marker on the map."
msgstr "Inclure un marqueur sur la carte."
-#: ../../extend/addon/addon/pageheader/pageheader.php:43
-msgid "Message to display on every page on this server"
-msgstr "Message à afficher sur chaque page de ce serveur"
-
-#: ../../extend/addon/addon/pageheader/pageheader.php:48
-msgid "Pageheader Settings"
-msgstr "Paramètres du haut de page"
-
-#: ../../extend/addon/addon/pageheader/pageheader.php:64
-msgid "pageheader Settings saved."
-msgstr "Paramètres du haut de page sauvegardés."
-
-#: ../../extend/addon/addon/piwik/piwik.php:85
-msgid ""
-"This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> "
-"analytics tool."
-msgstr "Ce site web est surveillé grâce à l'outil d'analyse <a href='http://www.piwik.org'>Piwik</a>."
-
-#: ../../extend/addon/addon/piwik/piwik.php:88
-#, php-format
-msgid ""
-"If you do not want that your visits are logged this way you <a href='%s'>can"
-" set a cookie to prevent Piwik from tracking further visits of the site</a> "
-"(opt-out)."
-msgstr "Si vous ne souhaitez pas que vos visites soient enregistrées de cette façon, <a href='%s'>vous pouvez\ndéfinir un cookie pour empêcher Piwik de suivre davantage de visites du site</a> (opt-out)."
-
-#: ../../extend/addon/addon/piwik/piwik.php:96
-msgid "Piwik Base URL"
-msgstr "URL de base Piwik"
-
-#: ../../extend/addon/addon/piwik/piwik.php:96
-msgid ""
-"Absolute path to your Piwik installation. (without protocol (http/s), with "
-"trailing slash)"
-msgstr "Chemin absolu vers votre installation Piwik. (sans le http/s, avec antislash)"
-
-#: ../../extend/addon/addon/piwik/piwik.php:97
-msgid "Site ID"
-msgstr "ID du site"
-
-#: ../../extend/addon/addon/piwik/piwik.php:98
-msgid "Show opt-out cookie link?"
-msgstr "Afficher le lien opt-out du cookie ?"
-
-#: ../../extend/addon/addon/piwik/piwik.php:99
-msgid "Asynchronous tracking"
-msgstr "Traqueur asynchrone"
-
-#: ../../extend/addon/addon/piwik/piwik.php:100
-msgid "Enable frontend JavaScript error tracking"
-msgstr "Activer le traqueur d'erreur du frontend JavaScript"
-
-#: ../../extend/addon/addon/piwik/piwik.php:100
-msgid "This feature requires Piwik >= 2.2.0"
-msgstr "Cette fonctionnalité requiert une version de Piwik >=2.2.0"
-
-#: ../../extend/addon/addon/planets/planets.php:121
-msgid "Planets Settings updated."
-msgstr "Paramètres Planets mis à jour."
-
-#: ../../extend/addon/addon/planets/planets.php:153
-msgid "Enable Planets Plugin"
-msgstr "Activer le plugin Planets"
-
-#: ../../extend/addon/addon/planets/planets.php:157
-msgid "Planets Settings"
-msgstr "Paramètres Planets"
-
-#: ../../extend/addon/addon/pumpio/pumpio.php:148
-msgid "You are now authenticated to pumpio."
-msgstr "Vous êtes maintenant connecté à pumpio."
-
-#: ../../extend/addon/addon/pumpio/pumpio.php:149
-msgid "return to the featured settings page"
-msgstr "retourner à la page des paramètres des fonctionnalités"
-
-#: ../../extend/addon/addon/pumpio/pumpio.php:163
-msgid "Post to Pump.io"
-msgstr "Publier sur Pump.io"
-
-#: ../../extend/addon/addon/pumpio/pumpio.php:198
-msgid "Pump.io servername"
-msgstr "Nom du serveur Pump.io"
-
-#: ../../extend/addon/addon/pumpio/pumpio.php:198
-msgid "Without \"http://\" or \"https://\""
-msgstr "Sans \"http://\" ou \"https://\""
+#: ../../addon/msgfooter/msgfooter.php:46 ../../addon/xmpp/xmpp.php:91
+msgid "Save Settings"
+msgstr "Sauvegarder les paramètres"
-#: ../../extend/addon/addon/pumpio/pumpio.php:202
-msgid "Pump.io username"
-msgstr "Identifiant Pump.io"
+#: ../../addon/msgfooter/msgfooter.php:47
+msgid "text to include in all outgoing posts from this site"
+msgstr "Texte à inclure dans tous les messages sortants de ce site"
-#: ../../extend/addon/addon/pumpio/pumpio.php:202
-msgid "Without the servername"
-msgstr "Sans le nom de serveur"
+#: ../../addon/rtof/rtof.php:45
+msgid "Post to Friendica"
+msgstr "Publier sur Friendica"
-#: ../../extend/addon/addon/pumpio/pumpio.php:213
-msgid "You are not authenticated to pumpio"
-msgstr "Vous n'êtes pas connecté à Pump.io"
+#: ../../addon/rtof/rtof.php:62
+msgid "rtof Settings saved."
+msgstr "Paramètres rtof sauvegardés."
-#: ../../extend/addon/addon/pumpio/pumpio.php:215
-msgid "(Re-)Authenticate your pump.io connection"
-msgstr "Authentifiez-vous à nouveau auprès de Pump.io"
+#: ../../addon/rtof/rtof.php:81
+msgid "Allow posting to Friendica"
+msgstr "Autoriser la publication sur Friendica"
-#: ../../extend/addon/addon/pumpio/pumpio.php:219
-msgid "Enable pump.io Post Plugin"
-msgstr "Activer le plugin de publication Pump.io"
+#: ../../addon/rtof/rtof.php:85
+msgid "Send public postings to Friendica by default"
+msgstr "Par défaut, envoyer les publications publiques sur Friendica"
-#: ../../extend/addon/addon/pumpio/pumpio.php:223
-msgid "Post to pump.io by default"
-msgstr "Par défaut, publier sur Pump.io"
+#: ../../addon/rtof/rtof.php:89
+msgid "Friendica API Path"
+msgstr "Chemin de l'API Friendica"
-#: ../../extend/addon/addon/pumpio/pumpio.php:227
-msgid "Should posts be public"
-msgstr "Les publications doivent-elles être publiques ?"
+#: ../../addon/rtof/rtof.php:89 ../../addon/redred/redred.php:103
+msgid "https://{sitename}/api"
+msgstr "https://{nomdusite}/api"
-#: ../../extend/addon/addon/pumpio/pumpio.php:231
-msgid "Mirror all public posts"
-msgstr "Créer une copie miroir de toutes les publications publiques"
+#: ../../addon/rtof/rtof.php:93
+msgid "Friendica login name"
+msgstr "Identifiant de connexion Friendica"
-#: ../../extend/addon/addon/pumpio/pumpio.php:237
-msgid "Pump.io Post Settings"
-msgstr "Paramètres de publication Pump.io"
+#: ../../addon/rtof/rtof.php:97
+msgid "Friendica password"
+msgstr "Mot de passe de connexion Friendica"
-#: ../../extend/addon/addon/pumpio/pumpio.php:266
-msgid "PumpIO Settings saved."
-msgstr "Paramètres Pump.io sauvegardés."
+#: ../../addon/rtof/rtof.php:101
+msgid "Hubzilla to Friendica Post Settings"
+msgstr "Paramètres de publication de Hubzilla vers Friendica"
-#: ../../extend/addon/addon/qrator/qrator.php:48
-msgid "QR code"
-msgstr "QR code"
+#: ../../addon/jappixmini/jappixmini.php:305 ../../include/channel.php:1137
+#: ../../include/channel.php:1294
+msgid "Status:"
+msgstr "État&nbsp;:"
-#: ../../extend/addon/addon/qrator/qrator.php:63
-msgid "QR Generator"
-msgstr "Générateur de QRcode"
+#: ../../addon/jappixmini/jappixmini.php:309
+msgid "Activate addon"
+msgstr "Activer l'extension"
-#: ../../extend/addon/addon/qrator/qrator.php:64
-msgid "Enter some text"
-msgstr "Entrer du texte"
+#: ../../addon/jappixmini/jappixmini.php:313
+msgid "Hide Jappixmini Chat-Widget from the webinterface"
+msgstr "Cacher le widget de chat Jappixmini de l'interface web"
-#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:81
-msgid "Enable Rainbowtag"
-msgstr "Activer Rainbowtag"
+#: ../../addon/jappixmini/jappixmini.php:318
+msgid "Jabber username"
+msgstr "Identifiant Jabber"
-#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:85
-msgid "Rainbowtag Settings"
-msgstr "Paramètres Rainbowtag"
+#: ../../addon/jappixmini/jappixmini.php:324
+msgid "Jabber server"
+msgstr "Serveur Jabber"
-#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:101
-msgid "Rainbowtag Settings saved."
-msgstr "Paramètres Rainbowtag sauvegardés."
+#: ../../addon/jappixmini/jappixmini.php:330
+msgid "Jabber BOSH host URL"
+msgstr "Adresse hôte pour Jabber BOSH"
-#: ../../extend/addon/addon/randpost/randpost.php:97
-msgid "You're welcome."
-msgstr "Bienvenue."
+#: ../../addon/jappixmini/jappixmini.php:337
+msgid "Jabber password"
+msgstr "Mot de passe Jabber"
-#: ../../extend/addon/addon/randpost/randpost.php:98
-msgid "Ah shucks..."
-msgstr "Ah m…"
+#: ../../addon/jappixmini/jappixmini.php:343
+msgid "Encrypt Jabber password with Hubzilla password"
+msgstr "Chiffrer le mot de passe Jabber avec le mot de passe Hubzilla"
-#: ../../extend/addon/addon/randpost/randpost.php:99
-msgid "Don't mention it."
-msgstr "De rien."
+#: ../../addon/jappixmini/jappixmini.php:347 ../../addon/redred/redred.php:115
+msgid "Hubzilla password"
+msgstr "Mot de passe Hubzilla"
-#: ../../extend/addon/addon/randpost/randpost.php:100
-msgid "&lt;blush&gt;"
-msgstr "&lt;rougit&gt;"
+#: ../../addon/jappixmini/jappixmini.php:351
+#: ../../addon/jappixmini/jappixmini.php:355
+msgid "Approve subscription requests from Hubzilla contacts automatically"
+msgstr "Approuver automatiquement les demandes de connexion des contacts Hubzilla"
-#: ../../extend/addon/addon/redfiles/redfiles.php:119
-msgid "Redmatrix File Storage Import"
-msgstr "Importation du fichier de stockage Redmatrix"
+#: ../../addon/jappixmini/jappixmini.php:359
+msgid "Purge internal list of jabber addresses of contacts"
+msgstr "Purger la liste interne des adresses jabber des contacts"
-#: ../../extend/addon/addon/redfiles/redfiles.php:120
-msgid "This will import all your Redmatrix cloud files to this channel."
-msgstr "Ceci importera tous vos fichiers Redmatrix dans ce canal."
+#: ../../addon/jappixmini/jappixmini.php:364
+msgid "Configuration Help"
+msgstr "Aide pour la configuration"
-#: ../../extend/addon/addon/redfiles/redfiles.php:121
-#: ../../extend/addon/addon/redphotos/redphotos.php:131
-msgid "Redmatrix Server base URL"
-msgstr "URL de base du serveur Redmatrix"
+#: ../../addon/jappixmini/jappixmini.php:371
+msgid "Jappix Mini Settings"
+msgstr "Paramètres de Jappix mini"
-#: ../../extend/addon/addon/redfiles/redfiles.php:122
-#: ../../extend/addon/addon/redphotos/redphotos.php:132
-msgid "Redmatrix Login Username"
-msgstr "Identifiant de connexion Redmatrix"
+#: ../../addon/superblock/superblock.php:112
+msgid "Currently blocked"
+msgstr "Actuellement bloqué"
-#: ../../extend/addon/addon/redfiles/redfiles.php:123
-#: ../../extend/addon/addon/redphotos/redphotos.php:133
-msgid "Redmatrix Login Password"
-msgstr "Mot de passe de connexion Redmatrix"
+#: ../../addon/superblock/superblock.php:114
+msgid "No channels currently blocked"
+msgstr "Aucun canal n'est actuellement bloqué"
-#: ../../extend/addon/addon/redfiles/redfilehelper.php:67
-msgid "file"
-msgstr "fichier"
+#: ../../addon/superblock/superblock.php:120
+msgid "\"Superblock\" Settings"
+msgstr "Paramètres \"Superblock\""
-#: ../../extend/addon/addon/redphotos/redphotos.php:106
-msgid "Photos imported"
-msgstr "Photos importées"
+#: ../../addon/superblock/superblock.php:345
+msgid "Block Completely"
+msgstr "Bloquer complètement"
-#: ../../extend/addon/addon/redphotos/redphotos.php:129
-msgid "Redmatrix Photo Album Import"
-msgstr "Import de l'album photo Redmatrix"
+#: ../../addon/superblock/superblock.php:394
+msgid "superblock settings updated"
+msgstr "Les paramètres du superblock ont été mis à jour"
-#: ../../extend/addon/addon/redphotos/redphotos.php:130
-msgid "This will import all your Redmatrix photo albums to this channel."
-msgstr "Ceci va importer l'intégralité de vos albums photos Redmatrix dans ce canal."
+#: ../../addon/nofed/nofed.php:42
+msgid "Federate"
+msgstr "Fédérer"
-#: ../../extend/addon/addon/redphotos/redphotos.php:134
-msgid "Import just this album"
-msgstr "Importer uniquement cet album"
+#: ../../addon/nofed/nofed.php:56
+msgid "nofed Settings saved."
+msgstr "Les paramètres nfed ont été enregistrés."
-#: ../../extend/addon/addon/redphotos/redphotos.php:134
-msgid "Leave blank to import all albums"
-msgstr "Laisser vide pour importer tous les albums"
+#: ../../addon/nofed/nofed.php:72
+msgid "Allow Federation Toggle"
+msgstr "Autoriser la fédération avec Toggle"
-#: ../../extend/addon/addon/redphotos/redphotos.php:135
-msgid "Maximum count to import"
-msgstr "Nombre maximum de comptes à importer"
+#: ../../addon/nofed/nofed.php:76
+msgid "Federate posts by default"
+msgstr "Par défaut, fédérer les publications."
-#: ../../extend/addon/addon/redphotos/redphotos.php:135
-msgid "0 or blank to import all available"
-msgstr "0 ou vide pour importer tout ce qui est disponible"
+#: ../../addon/nofed/nofed.php:80
+msgid "NoFed Settings"
+msgstr "Paramètres NoFed"
-#: ../../extend/addon/addon/redred/redred.php:45
+#: ../../addon/redred/redred.php:45
msgid "Post to Red"
msgstr "Publier sur Red"
-#: ../../extend/addon/addon/redred/redred.php:60
+#: ../../addon/redred/redred.php:60
msgid "Channel is required."
msgstr "Un canal est requis."
-#: ../../extend/addon/addon/redred/redred.php:65
-msgid "Invalid channel."
-msgstr "Canal invalide."
-
-#: ../../extend/addon/addon/redred/redred.php:76
+#: ../../addon/redred/redred.php:76
msgid "redred Settings saved."
msgstr "Paramètres redred sauvegardés."
-#: ../../extend/addon/addon/redred/redred.php:95
+#: ../../addon/redred/redred.php:95
msgid "Allow posting to another Hubzilla Channel"
msgstr "Autoriser la publication sur un autre canal Hubzilla"
-#: ../../extend/addon/addon/redred/redred.php:99
+#: ../../addon/redred/redred.php:99
msgid "Send public postings to Hubzilla channel by default"
msgstr "Par défaut, envoyer les publications publiques sur le canal Hubzilla"
-#: ../../extend/addon/addon/redred/redred.php:103
+#: ../../addon/redred/redred.php:103
msgid "Hubzilla API Path"
msgstr "Chemin de l'API Hubzilla"
-#: ../../extend/addon/addon/redred/redred.php:103
-#: ../../extend/addon/addon/rtof/rtof.php:89
-msgid "https://{sitename}/api"
-msgstr "https://{nomdusite}/api"
-
-#: ../../extend/addon/addon/redred/redred.php:107
+#: ../../addon/redred/redred.php:107
msgid "Hubzilla login name"
msgstr "Identifiant de connexion Hubzilla"
-#: ../../extend/addon/addon/redred/redred.php:111
+#: ../../addon/redred/redred.php:111
msgid "Hubzilla channel name"
msgstr "Nom du canal Hubzilla"
-#: ../../extend/addon/addon/redred/redred.php:111
-#: ../../extend/addon/addon/openid/MysqlProvider.php:54
-msgid "Nickname"
-msgstr "Surnom"
-
-#: ../../extend/addon/addon/redred/redred.php:119
+#: ../../addon/redred/redred.php:119
msgid "Hubzilla Crosspost Settings"
msgstr "Paramètres Crosspost Hubzilla"
-#: ../../extend/addon/addon/rtof/rtof.php:45
-msgid "Post to Friendica"
-msgstr "Publier sur Friendica"
+#: ../../addon/logrot/logrot.php:36
+msgid "Logfile archive directory"
+msgstr "Répertoire d'archivage du fichier journal"
-#: ../../extend/addon/addon/rtof/rtof.php:62
-msgid "rtof Settings saved."
-msgstr "Paramètres rtof sauvegardés."
+#: ../../addon/logrot/logrot.php:36
+msgid "Directory to store rotated logs"
+msgstr "Répertoire où stocker les journaux de rotation"
-#: ../../extend/addon/addon/rtof/rtof.php:81
-msgid "Allow posting to Friendica"
-msgstr "Autoriser la publication sur Friendica"
+#: ../../addon/logrot/logrot.php:37
+msgid "Logfile size in bytes before rotating"
+msgstr "Taille du fichier journal en octets avant la rotation"
-#: ../../extend/addon/addon/rtof/rtof.php:85
-msgid "Send public postings to Friendica by default"
-msgstr "Par défaut, envoyer les publications publiques sur Friendica"
+#: ../../addon/logrot/logrot.php:38
+msgid "Number of logfiles to retain"
+msgstr "Nombre de fichiers de journal à conserver"
-#: ../../extend/addon/addon/rtof/rtof.php:89
-msgid "Friendica API Path"
-msgstr "Chemin de l'API Friendica"
+#: ../../addon/frphotos/frphotos.php:91
+msgid "Friendica Photo Album Import"
+msgstr "Importation de l'album photo Friendica "
-#: ../../extend/addon/addon/rtof/rtof.php:93
-msgid "Friendica login name"
+#: ../../addon/frphotos/frphotos.php:92
+msgid "This will import all your Friendica photo albums to this Red channel."
+msgstr "Ceci importera toutes vos albums photos Friendica dans ce canal Hubzilla."
+
+#: ../../addon/frphotos/frphotos.php:93
+msgid "Friendica Server base URL"
+msgstr "URL de base du serveur Friendica"
+
+#: ../../addon/frphotos/frphotos.php:94
+msgid "Friendica Login Username"
msgstr "Identifiant de connexion Friendica"
-#: ../../extend/addon/addon/rtof/rtof.php:97
-msgid "Friendica password"
+#: ../../addon/frphotos/frphotos.php:95
+msgid "Friendica Login Password"
msgstr "Mot de passe de connexion Friendica"
-#: ../../extend/addon/addon/rtof/rtof.php:101
-msgid "Hubzilla to Friendica Post Settings"
-msgstr "Paramètres de publication de Hubzilla vers Friendica"
+#: ../../addon/donate/donate.php:21
+msgid "Project Servers and Resources"
+msgstr "Serveurs et ressources du projet"
-#: ../../extend/addon/addon/sendzid/sendzid.php:25
-msgid "Extended Identity Sharing"
-msgstr "Partage d'identification étendu"
+#: ../../addon/donate/donate.php:22
+msgid "Project Creator and Tech Lead"
+msgstr "Créateur et Responsable Technique du projet"
+
+#: ../../addon/donate/donate.php:23
+msgid "Admin, developer, directorymin, support bloke"
+msgstr "Administrateur, développeur, responsable d'annuaire, équipe support"
-#: ../../extend/addon/addon/sendzid/sendzid.php:26
+#: ../../addon/donate/donate.php:50
msgid ""
-"Share your identity with all websites on the internet. When disabled, "
-"identity is only shared with sites in the matrix."
-msgstr "Partagez votre identification avec tous les sites Web sur Internet. Lorsqu'elle est désactivée, l'identification n'est partagée qu'avec les sites de la matrice."
+"And the hundreds of other people and organisations who helped make the "
+"Hubzilla possible."
+msgstr "Et les centaines d'autres personnes et organisations qui ont contribué à rendre le Hubzilla possible."
-#: ../../extend/addon/addon/skeleton/skeleton.php:59
-msgid "Some setting"
-msgstr "Un certain paramètre"
+#: ../../addon/donate/donate.php:53
+msgid ""
+"The Redmatrix/Hubzilla projects are provided primarily by volunteers giving "
+"their time and expertise - and often paying out of pocket for services they "
+"share with others."
+msgstr "Les projets Redmatrix / Hubzilla sont fournis principalement par des bénévoles qui donnent de leur temps et de leur expertise - et paient souvent de leur poche pour des services qu'ils partagent avec d'autres."
-#: ../../extend/addon/addon/skeleton/skeleton.php:61
-msgid "A setting"
-msgstr "Un paramètre"
+#: ../../addon/donate/donate.php:54
+msgid ""
+"There is no corporate funding and no ads, and we do not collect and sell "
+"your personal information. (We don't control your personal information - "
+"<strong>you do</strong>.)"
+msgstr "Il n'y a ni financement d'entreprise ni publicités, et nous ne recueillons ni ne vendons vos données personnelles. (Nous ne contrôlons pas vos informations personnelles - vous le faites !)"
-#: ../../extend/addon/addon/skeleton/skeleton.php:64
-msgid "Skeleton Settings"
-msgstr "Paramètres du squelette"
+#: ../../addon/donate/donate.php:55
+msgid ""
+"Help support our ground-breaking work in decentralisation, web identity, and"
+" privacy."
+msgstr "Aider à soutenir notre travail novateur en matière de décentralisation, d'identité Web et de confidentialité."
-#: ../../extend/addon/addon/smileybutton/smileybutton.php:273
-msgid "Deactivate the feature"
-msgstr "Désactiver la fonctionnalité"
+#: ../../addon/donate/donate.php:57
+msgid ""
+"Your donations keep servers and services running and also helps us to "
+"provide innovative new features and continued development."
+msgstr "Vos dons maintiennent les serveurs et les services en marche et nous aident également à fournir de nouvelles fonctionnalités innovantes et un développement continu."
-#: ../../extend/addon/addon/smileybutton/smileybutton.php:277
-msgid "Hide the button and show the smilies directly."
-msgstr "Cacher le bouton et afficher les émoticônes directement."
+#: ../../addon/donate/donate.php:60
+msgid "Donate"
+msgstr "Donner"
-#: ../../extend/addon/addon/smileybutton/smileybutton.php:281
-msgid "Smileybutton Settings"
-msgstr "Paramètres du bouton des émoticônes"
+#: ../../addon/donate/donate.php:62
+msgid ""
+"Choose a project, developer, or public hub to support with a one-time "
+"donation"
+msgstr "Choisissez un projet, un développeur ou un hub public à soutenir à l'aide d'un don unique"
-#: ../../extend/addon/addon/startpage/startpage.php:109
-msgid "Page to load after login"
-msgstr "Page à charger après l'identification"
+#: ../../addon/donate/donate.php:63
+msgid "Donate Now"
+msgstr "Donner maintenant"
-#: ../../extend/addon/addon/startpage/startpage.php:109
+#: ../../addon/donate/donate.php:64
msgid ""
-"Examples: &quot;apps&quot;, &quot;network?f=&gid=37&quot; (privacy "
-"collection), &quot;channel&quot; or &quot;notifications/system&quot; (leave "
-"blank for default network page (grid)."
-msgstr "Exemples: &quot;apps&quot;, &quot;network?f=&gid=37&quot; (privacy collection), &quot;channel&quot; or &quot;notifications/system&quot; (laisser vide pour la page par défaut du réseau (grille)."
+"<strong><em>Or</em></strong> become a project sponsor (Hubzilla Project "
+"only)"
+msgstr "Or devenez un sponsor du projet (projet Hubzilla uniquement)"
-#: ../../extend/addon/addon/startpage/startpage.php:113
-msgid "Startpage Settings"
-msgstr "Paramètres de la page de démarrage"
+#: ../../addon/donate/donate.php:65
+msgid ""
+"Please indicate if you would like your first name or full name (or nothing) "
+"to appear in our sponsor listing"
+msgstr "Veuillez indiquer si vous souhaitez que votre nom ou prénom (ou rien) apparaisse dans la liste de nos sponsors."
+
+#: ../../addon/donate/donate.php:66
+msgid "Sponsor"
+msgstr "Sponsors"
+
+#: ../../addon/donate/donate.php:69
+msgid "Special thanks to: "
+msgstr "Remerciements particuliers à :"
+
+#: ../../addon/chords/Mod_Chords.php:44
+msgid ""
+"This is a fairly comprehensive and complete guitar chord dictionary which "
+"will list most of the available ways to play a certain chord, starting from "
+"the base of the fingerboard up to a few frets beyond the twelfth fret "
+"(beyond which everything repeats). A couple of non-standard tunings are "
+"provided for the benefit of slide players, etc."
+msgstr "Ceci est un dictionnaire d'accords de guitare assez complet et facile qui énumère la plupart des manières possibles de jouer un certain accord, à partir de la base de la touche jusqu'à quelques frettes au-delà de la douzième frette (au-delà de laquelle tout se répète). Un couple d'accordages non standard sont fournis au profit des joueurs de diapositives, etc."
+
+#: ../../addon/chords/Mod_Chords.php:46
+msgid ""
+"Chord names start with a root note (A-G) and may include sharps (#) and "
+"flats (b). This software will parse most of the standard naming conventions "
+"such as maj, min, dim, sus(2 or 4), aug, with optional repeating elements."
+msgstr "Les noms des accords commencent par une note racine (A-G) et peuvent inclure des dièses (#) et des bémols (b). Ce logiciel analysera la plupart des conventions de dénomination standard telles que maj, min, dim, sus (2 ou 4), aug, avec des éléments répétitifs facultatifs."
+
+#: ../../addon/chords/Mod_Chords.php:48
+msgid ""
+"Valid examples include A, A7, Am7, Amaj7, Amaj9, Ammaj7, Aadd4, Asus2Add4, "
+"E7b13b11 ..."
+msgstr "Exemples valides comprennent A, A7, Am7, Amaj7, Amaj9, Ammaj7, Aadd4, Asus2Add4, E7b13b11 ..."
+
+#: ../../addon/chords/Mod_Chords.php:51
+msgid "Guitar Chords"
+msgstr "Acords de guitar"
+
+#: ../../addon/chords/Mod_Chords.php:52
+msgid "The complete online chord dictionary"
+msgstr "Le dictionnaire en ligne complet des accords"
+
+#: ../../addon/chords/Mod_Chords.php:57
+msgid "Tuning"
+msgstr "Réglage"
+
+#: ../../addon/chords/Mod_Chords.php:58
+msgid "Chord name: example: Em7"
+msgstr "Nom d'accord. Exemple : Em7."
+
+#: ../../addon/chords/Mod_Chords.php:59
+msgid "Show for left handed stringing"
+msgstr "Montrer pour les gauchers"
+
+#: ../../addon/chords/chords.php:33
+msgid "Quick Reference"
+msgstr "Référence rapide"
+
+#: ../../addon/libertree/libertree.php:38
+msgid "Post to Libertree"
+msgstr "Publier sur Libertree"
-#: ../../extend/addon/addon/statusnet/statusnet.php:143
+#: ../../addon/libertree/libertree.php:69
+msgid "Enable Libertree Post Plugin"
+msgstr "Activer le plugin de publication Libertree"
+
+#: ../../addon/libertree/libertree.php:73
+msgid "Libertree API token"
+msgstr "Jeton de l'API Libertree"
+
+#: ../../addon/libertree/libertree.php:77
+msgid "Libertree site URL"
+msgstr "Adresse du site Libertree"
+
+#: ../../addon/libertree/libertree.php:81
+msgid "Post to Libertree by default"
+msgstr "Par défaut, publier sur Libertree"
+
+#: ../../addon/libertree/libertree.php:85
+msgid "Libertree Post Settings"
+msgstr "Paramètres de publication pour Libertree"
+
+#: ../../addon/libertree/libertree.php:99
+msgid "Libertree Settings saved."
+msgstr "Paramètres de Libertree sauvegardés."
+
+#: ../../addon/flattrwidget/flattrwidget.php:45
+msgid "Flattr this!"
+msgstr "Flattr this!"
+
+#: ../../addon/flattrwidget/flattrwidget.php:83
+msgid "Flattr widget settings updated."
+msgstr "Les paramètres du widget Flattr ont été mis à jour"
+
+#: ../../addon/flattrwidget/flattrwidget.php:100
+msgid "Flattr user"
+msgstr "Utilisateur de Flattr"
+
+#: ../../addon/flattrwidget/flattrwidget.php:104
+msgid "URL of the Thing to flattr"
+msgstr "URL de ce que vous voulez flattr"
+
+#: ../../addon/flattrwidget/flattrwidget.php:104
+msgid "If empty channel URL is used"
+msgstr "Si une url vide est utilisée"
+
+#: ../../addon/flattrwidget/flattrwidget.php:108
+msgid "Title of the Thing to flattr"
+msgstr "Titre de ce que vous voulez flattr"
+
+#: ../../addon/flattrwidget/flattrwidget.php:108
+msgid "If empty \"channel name on The Hubzilla\" will be used"
+msgstr "Si vide, \"nom du canal sur Hubzilla\" sera utilisé"
+
+#: ../../addon/flattrwidget/flattrwidget.php:112
+msgid "Static or dynamic flattr button"
+msgstr "Statique ou dynamique bouton Flattr"
+
+#: ../../addon/flattrwidget/flattrwidget.php:112
+msgid "static"
+msgstr "statique"
+
+#: ../../addon/flattrwidget/flattrwidget.php:112
+msgid "dynamic"
+msgstr "dynamique"
+
+#: ../../addon/flattrwidget/flattrwidget.php:116
+msgid "Alignment of the widget"
+msgstr "Alignement du widget"
+
+#: ../../addon/flattrwidget/flattrwidget.php:116
+msgid "left"
+msgstr "gauche"
+
+#: ../../addon/flattrwidget/flattrwidget.php:116
+msgid "right"
+msgstr "droite"
+
+#: ../../addon/flattrwidget/flattrwidget.php:120
+msgid "Enable Flattr widget"
+msgstr "Activer le widget Flattr"
+
+#: ../../addon/flattrwidget/flattrwidget.php:124
+msgid "Flattr Widget Settings"
+msgstr "Paramètres du widget Flattr"
+
+#: ../../addon/statusnet/statusnet.php:143
msgid "Post to GNU social"
msgstr "Publier sur GNU-social"
-#: ../../extend/addon/addon/statusnet/statusnet.php:195
+#: ../../addon/statusnet/statusnet.php:195
msgid ""
"Please contact your site administrator.<br />The provided API URL is not "
"valid."
msgstr "Veuillez contacter l'administrateur de votre site. L'URL de l'API n'est pas valide."
-#: ../../extend/addon/addon/statusnet/statusnet.php:232
+#: ../../addon/statusnet/statusnet.php:232
msgid "We could not contact the GNU social API with the Path you entered."
msgstr "Nous ne pouvons pas contacter l'API de GNU-social avec le chemin que vous avez entré."
-#: ../../extend/addon/addon/statusnet/statusnet.php:266
+#: ../../addon/statusnet/statusnet.php:266
msgid "GNU social settings updated."
msgstr "Les paramètres GNU-social ont été mis à jour."
-#: ../../extend/addon/addon/statusnet/statusnet.php:310
+#: ../../addon/statusnet/statusnet.php:310
msgid "Globally Available GNU social OAuthKeys"
msgstr "Les OAuthKeys GNU-social sont globalement disponibles."
-#: ../../extend/addon/addon/statusnet/statusnet.php:312
+#: ../../addon/statusnet/statusnet.php:312
msgid ""
"There are preconfigured OAuth key pairs for some GNU social servers "
"available. If you are using one of them, please use these credentials.<br "
"/>If not feel free to connect to any other GNU social instance (see below)."
msgstr "Il existe des paires de clés OAuth préconfigurées pour certains serveurs GNU-social disponibles. Si vous utilisez l'un d'eux, utilisez ces informations d'identification.\nSi vous ne voulez pas vous connecter à une autre instance GNU social (voir ci-dessous)."
-#: ../../extend/addon/addon/statusnet/statusnet.php:327
+#: ../../addon/statusnet/statusnet.php:327
msgid "Provide your own OAuth Credentials"
msgstr "Fournissez vos propres informations d'identification OAuth"
-#: ../../extend/addon/addon/statusnet/statusnet.php:329
+#: ../../addon/statusnet/statusnet.php:329
msgid ""
"No consumer key pair for GNU social found. Register your Hubzilla Account as"
" an desktop client on your GNU social account, copy the consumer key pair "
@@ -9668,27 +10032,27 @@ msgid ""
"Hubzilla installation at your favourite GNU social installation."
msgstr "Aucune paire de clés utilisateur n'a été trouvée pour GNU-social. Enregistrer votre compte Hubzilla en tant que client de bureau sur votre compte GNU-social, puis copier la paire de clés utilisateur ici et entrer la racine de base de l'API.\nAvant d'enregistrer votre propre paire de clés OAuth, demandez à l'administrateur s'il existe déjà une paire de clés pour cette installation de Hubzilla à votre installation GNU-social préférée."
-#: ../../extend/addon/addon/statusnet/statusnet.php:333
+#: ../../addon/statusnet/statusnet.php:333
msgid "OAuth Consumer Key"
msgstr "Clé d'utilisateur OAuth"
-#: ../../extend/addon/addon/statusnet/statusnet.php:337
+#: ../../addon/statusnet/statusnet.php:337
msgid "OAuth Consumer Secret"
msgstr "Secret d'utilisateur OAuth"
-#: ../../extend/addon/addon/statusnet/statusnet.php:341
+#: ../../addon/statusnet/statusnet.php:341
msgid "Base API Path"
msgstr "Chemin de l'API de base"
-#: ../../extend/addon/addon/statusnet/statusnet.php:341
+#: ../../addon/statusnet/statusnet.php:341
msgid "Remember the trailing /"
msgstr "N'oubliez pas le / final"
-#: ../../extend/addon/addon/statusnet/statusnet.php:345
+#: ../../addon/statusnet/statusnet.php:345
msgid "GNU social application name"
msgstr "Nom de l'application GNU-social"
-#: ../../extend/addon/addon/statusnet/statusnet.php:368
+#: ../../addon/statusnet/statusnet.php:368
msgid ""
"To connect to your GNU social account click the button below to get a "
"security code from GNU social which you have to copy into the input box "
@@ -9696,32 +10060,31 @@ msgid ""
"posted to GNU social."
msgstr "Pour vous connecter à votre compte GNU-social, cliquez sur le bouton ci-dessous pour obtenir un code de sécurité de GNU-social. Vous devez le copier dans la zone de saisie ci-dessous, puis soumettre le formulaire. Seuls vos messages publics seront visibles sur GNU-social."
-#: ../../extend/addon/addon/statusnet/statusnet.php:370
+#: ../../addon/statusnet/statusnet.php:370
msgid "Log in with GNU social"
msgstr "Vous connecter avec GNU-social"
-#: ../../extend/addon/addon/statusnet/statusnet.php:373
+#: ../../addon/statusnet/statusnet.php:373
msgid "Copy the security code from GNU social here"
msgstr "Copier ici le code de sécurité de GNU-social."
-#: ../../extend/addon/addon/statusnet/statusnet.php:383
+#: ../../addon/statusnet/statusnet.php:383
msgid "Cancel Connection Process"
msgstr "Annuler le processus de connexion"
-#: ../../extend/addon/addon/statusnet/statusnet.php:385
+#: ../../addon/statusnet/statusnet.php:385
msgid "Current GNU social API is"
msgstr "L'API GNU-social courante est"
-#: ../../extend/addon/addon/statusnet/statusnet.php:389
+#: ../../addon/statusnet/statusnet.php:389
msgid "Cancel GNU social Connection"
msgstr "Annuler la connexion GNU-social"
-#: ../../extend/addon/addon/statusnet/statusnet.php:401
-#: ../../extend/addon/addon/twitter/twitter.php:232
+#: ../../addon/statusnet/statusnet.php:401 ../../addon/twitter/twitter.php:232
msgid "Currently connected to: "
msgstr "Actuellement connecté à :"
-#: ../../extend/addon/addon/statusnet/statusnet.php:406
+#: ../../addon/statusnet/statusnet.php:406
msgid ""
"<strong>Note</strong>: Due your privacy settings (<em>Hide your profile "
"details from unknown viewers?</em>) the link potentially included in public "
@@ -9729,277 +10092,363 @@ msgid ""
"informing the visitor that the access to your profile has been restricted."
msgstr "Remarque : en raison de vos paramètres de confidentialité (masquer les détails de votre profil aux visiteurs inconnus? ), le lien potentiellement inclus dans les annonces publiques relayées sur GNU-social amènera le visiteur à une page vierge informant le visiteur que l'accès à votre profil a été restreint."
-#: ../../extend/addon/addon/statusnet/statusnet.php:411
+#: ../../addon/statusnet/statusnet.php:411
msgid "Allow posting to GNU social"
msgstr "Autoriser la publication sur GNU-social"
-#: ../../extend/addon/addon/statusnet/statusnet.php:411
+#: ../../addon/statusnet/statusnet.php:411
msgid ""
"If enabled your public postings can be posted to the associated GNU-social "
"account"
msgstr "Si cette option est activée, vos publications publiques peuvent être publiées sur le compte GNU-social associé."
-#: ../../extend/addon/addon/statusnet/statusnet.php:415
+#: ../../addon/statusnet/statusnet.php:415
msgid "Post to GNU social by default"
msgstr "Par défaut, publier sur GNU-social"
-#: ../../extend/addon/addon/statusnet/statusnet.php:415
+#: ../../addon/statusnet/statusnet.php:415
msgid ""
"If enabled your public postings will be posted to the associated GNU-social "
"account by default"
msgstr "Si cette option est activée, par défaut, vos publications publiques seront publiées sur le compte GNU-social associé"
-#: ../../extend/addon/addon/statusnet/statusnet.php:424
-#: ../../extend/addon/addon/twitter/twitter.php:255
+#: ../../addon/statusnet/statusnet.php:424 ../../addon/twitter/twitter.php:255
msgid "Clear OAuth configuration"
msgstr "Effacer la configuration OAuth"
-#: ../../extend/addon/addon/statusnet/statusnet.php:432
+#: ../../addon/statusnet/statusnet.php:432
msgid "GNU social Post Settings"
msgstr "Paramètres de publication GNU-social"
-#: ../../extend/addon/addon/statusnet/statusnet.php:891
+#: ../../addon/statusnet/statusnet.php:891
msgid "API URL"
msgstr "URL de l'API"
-#: ../../extend/addon/addon/statusnet/statusnet.php:894
+#: ../../addon/statusnet/statusnet.php:894
msgid "Application name"
msgstr "Nom de l'application"
-#: ../../extend/addon/addon/superblock/superblock.php:110
-msgid "Currently blocked"
-msgstr "Actuellement bloqué"
+#: ../../addon/qrator/qrator.php:48
+msgid "QR code"
+msgstr "QR code"
-#: ../../extend/addon/addon/superblock/superblock.php:112
-msgid "No channels currently blocked"
-msgstr "Aucun canal n'est actuellement bloqué"
+#: ../../addon/qrator/qrator.php:63
+msgid "QR Generator"
+msgstr "Générateur de QRcode"
-#: ../../extend/addon/addon/superblock/superblock.php:118
-msgid "\"Superblock\" Settings"
-msgstr "Paramètres \"Superblock\""
+#: ../../addon/qrator/qrator.php:64
+msgid "Enter some text"
+msgstr "Entrer du texte"
-#: ../../extend/addon/addon/superblock/superblock.php:322
-msgid "Block Completely"
-msgstr "Bloquer complètement"
+#: ../../addon/chess/chess.php:276 ../../addon/chess/chess.php:433
+msgid "Invalid game."
+msgstr "Jeu invalide"
-#: ../../extend/addon/addon/superblock/superblock.php:371
-msgid "superblock settings updated"
-msgstr "Les paramètres du superblock ont été mis à jour"
+#: ../../addon/chess/chess.php:282 ../../addon/chess/chess.php:439
+msgid "You are not a player in this game."
+msgstr "Vous n'êtes pas un joueur de ce jeu."
-#: ../../extend/addon/addon/testdrive/testdrive.php:104
-#, php-format
-msgid "Your account on %s will expire in a few days."
-msgstr "Votre compte sur %s expirera dans quelques jours."
+#: ../../addon/chess/chess.php:315
+msgid "You must be a local channel to create a game."
+msgstr "Vous devez être un canal local pour créer un jeu."
-#: ../../extend/addon/addon/testdrive/testdrive.php:105
-msgid "Your $Productname test account is about to expire."
-msgstr "Votre compte de test $NomDeProduit est sur le point d'expirer."
+#: ../../addon/chess/chess.php:333
+msgid "You must select one opponent that is not yourself."
+msgstr "Vous devez sélectionner un adversaire qui ne soit pas vous-même."
-#: ../../extend/addon/addon/tictac/tictac.php:21
-msgid "Three Dimensional Tic-Tac-Toe"
-msgstr "Tic-tac-toe en 3 dimensions"
+#: ../../addon/chess/chess.php:336
+msgid "Creating new game..."
+msgstr "en train de créer un nouveau jeu…"
-#: ../../extend/addon/addon/tictac/tictac.php:54
-msgid "3D Tic-Tac-Toe"
-msgstr "3D Tic-Tac-Toe"
+#: ../../addon/chess/chess.php:342
+msgid "You must select white or black."
+msgstr "Vous devez sélectionner les blancs ou les noirs."
-#: ../../extend/addon/addon/tictac/tictac.php:59
-msgid "New game"
-msgstr "Nouveau jeu"
+#: ../../addon/chess/chess.php:349
+msgid "Error creating new game."
+msgstr "Erreur lors de la création du nouveau jeu."
-#: ../../extend/addon/addon/tictac/tictac.php:60
-msgid "New game with handicap"
-msgstr "Nouveau jeu avec handicap"
+#: ../../addon/chess/chess.php:381 ../../include/channel.php:897
+msgid "Requested channel is not available."
+msgstr "Canal demandé non disponible."
+
+#: ../../addon/chess/chess.php:395
+msgid "You must select a local channel /chess/channelname"
+msgstr "Vous devez sélectionner un canal local /échecs/nomducanal"
-#: ../../extend/addon/addon/tictac/tictac.php:61
+#: ../../addon/chess/chess.php:923
+msgid "Enable notifications"
+msgstr "Activer les notifications"
+
+#: ../../addon/twitter/twitter.php:99
+msgid "Post to Twitter"
+msgstr "Publier sur Twitter"
+
+#: ../../addon/twitter/twitter.php:154
+msgid "Twitter settings updated."
+msgstr "Les paramètres de Twitter ont été mis à jour."
+
+#: ../../addon/twitter/twitter.php:183
msgid ""
-"Three dimensional tic-tac-toe is just like the traditional game except that "
-"it is played on multiple levels simultaneously. "
-msgstr "Trois dimensions tic-tac-toe est juste comme le jeu traditionnel, sauf qu'il est joué sur plusieurs niveaux simultanément."
+"No consumer key pair for Twitter found. Please contact your site "
+"administrator."
+msgstr "Aucune paire de clés d'utilisateur pour Twitter n'a été trouvée. Veuillez contacter l'administrateur de votre site."
-#: ../../extend/addon/addon/tictac/tictac.php:62
+#: ../../addon/twitter/twitter.php:205
msgid ""
-"In this case there are three levels. You win by getting three in a row on "
-"any level, as well as up, down, and diagonally across the different levels."
-msgstr "Dans ce cas, il y a trois niveaux. Vous gagnez en obtenant trois dans une rangée à n'importe quel niveau, que ce soit vers le haut, le bas, ou en diagonale à travers les différents niveaux."
+"At this Hubzilla instance the Twitter plugin was enabled but you have not "
+"yet connected your account to your Twitter account. To do so click the "
+"button below to get a PIN from Twitter which you have to copy into the input"
+" box below and submit the form. Only your <strong>public</strong> posts will"
+" be posted to Twitter."
+msgstr "Dans cette instance de Hubzilla, le plugin Twitter a été activé, mais vous n'avez pas encore connecté votre compte à votre compte Twitter. Pour ce faire, cliquez sur le bouton ci-dessous pour obtenir un code PIN de Twitter que vous devez copier dans la zone de saisie ci-dessous, puis soumettre le formulaire. Seuls vos messages publics seront publiés sur Twitter."
+
+#: ../../addon/twitter/twitter.php:207
+msgid "Log in with Twitter"
+msgstr "Connectez-vous avec votre compte Twitter"
-#: ../../extend/addon/addon/tictac/tictac.php:64
+#: ../../addon/twitter/twitter.php:210
+msgid "Copy the PIN from Twitter here"
+msgstr "Copier ici le PIN fourni par Twitter"
+
+#: ../../addon/twitter/twitter.php:237
msgid ""
-"The handicap game disables the center position on the middle level because "
-"the player claiming this square often has an unfair advantage."
-msgstr "Le jeu handicap désactive la position centrale au niveau intermédiaire, car le joueur qui revendique ce carré a souvent un avantage indu."
+"<strong>Note:</strong> Due your privacy settings (<em>Hide your profile "
+"details from unknown viewers?</em>) the link potentially included in public "
+"postings relayed to Twitter will lead the visitor to a blank page informing "
+"the visitor that the access to your profile has been restricted."
+msgstr "Note : En raison de vos paramètres de confidentialité (Masquer les détails de votre profil aux visiteurs inconnus?), le lien potentiellement inclus dans les annonces publiques relayées vers Twitter amènera le visiteur à une page vierge l'informant que l'accès à votre profil a été restreint."
-#: ../../extend/addon/addon/tictac/tictac.php:183
-msgid "You go first..."
-msgstr "Vous commencez…"
+#: ../../addon/twitter/twitter.php:242
+msgid "Allow posting to Twitter"
+msgstr "Autoriser la publication sur Twitter"
-#: ../../extend/addon/addon/tictac/tictac.php:188
-msgid "I'm going first this time..."
-msgstr "Cette fois, je commence…"
+#: ../../addon/twitter/twitter.php:242
+msgid ""
+"If enabled your public postings can be posted to the associated Twitter "
+"account"
+msgstr "Si cette option est activée, vos publications publiques peuvent être publiées sur le compte Twitter associé."
-#: ../../extend/addon/addon/tictac/tictac.php:194
-msgid "You won!"
-msgstr "Vous avez gagné !"
+#: ../../addon/twitter/twitter.php:246
+msgid "Send public postings to Twitter by default"
+msgstr "Par défaut, envoyer vos publications publiques sur Twitter."
-#: ../../extend/addon/addon/tictac/tictac.php:200
-#: ../../extend/addon/addon/tictac/tictac.php:225
-msgid "\"Cat\" game!"
-msgstr "Jeu de \"Chat\" !"
+#: ../../addon/twitter/twitter.php:246
+msgid ""
+"If enabled your public postings will be posted to the associated Twitter "
+"account by default"
+msgstr "Si cette option est activée, par défaut, vos publications publiques seront publiées sur le compte Twitter associé."
-#: ../../extend/addon/addon/tictac/tictac.php:223
-msgid "I won!"
-msgstr "J'ai gagné !"
+#: ../../addon/twitter/twitter.php:264
+msgid "Twitter Post Settings"
+msgstr "Paramètres des publications Twitter"
+
+#: ../../addon/smileybutton/smileybutton.php:273
+msgid "Deactivate the feature"
+msgstr "Désactiver la fonctionnalité"
+
+#: ../../addon/smileybutton/smileybutton.php:277
+msgid "Hide the button and show the smilies directly."
+msgstr "Cacher le bouton et afficher les émoticônes directement."
+
+#: ../../addon/smileybutton/smileybutton.php:281
+msgid "Smileybutton Settings"
+msgstr "Paramètres du bouton des émoticônes"
+
+#: ../../addon/piwik/piwik.php:85
+msgid ""
+"This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> "
+"analytics tool."
+msgstr "Ce site web est surveillé grâce à l'outil d'analyse <a href='http://www.piwik.org'>Piwik</a>."
+
+#: ../../addon/piwik/piwik.php:88
+#, php-format
+msgid ""
+"If you do not want that your visits are logged this way you <a href='%s'>can"
+" set a cookie to prevent Piwik from tracking further visits of the site</a> "
+"(opt-out)."
+msgstr "Si vous ne souhaitez pas que vos visites soient enregistrées de cette façon, <a href='%s'>vous pouvez\ndéfinir un cookie pour empêcher Piwik de suivre davantage de visites du site</a> (opt-out)."
+
+#: ../../addon/piwik/piwik.php:96
+msgid "Piwik Base URL"
+msgstr "URL de base Piwik"
+
+#: ../../addon/piwik/piwik.php:96
+msgid ""
+"Absolute path to your Piwik installation. (without protocol (http/s), with "
+"trailing slash)"
+msgstr "Chemin absolu vers votre installation Piwik. (sans le http/s, avec antislash)"
-#: ../../extend/addon/addon/tour/tour.php:75
+#: ../../addon/piwik/piwik.php:97
+msgid "Site ID"
+msgstr "ID du site"
+
+#: ../../addon/piwik/piwik.php:98
+msgid "Show opt-out cookie link?"
+msgstr "Afficher le lien opt-out du cookie ?"
+
+#: ../../addon/piwik/piwik.php:99
+msgid "Asynchronous tracking"
+msgstr "Traqueur asynchrone"
+
+#: ../../addon/piwik/piwik.php:100
+msgid "Enable frontend JavaScript error tracking"
+msgstr "Activer le traqueur d'erreur du frontend JavaScript"
+
+#: ../../addon/piwik/piwik.php:100
+msgid "This feature requires Piwik >= 2.2.0"
+msgstr "Cette fonctionnalité requiert une version de Piwik >=2.2.0"
+
+#: ../../addon/tour/tour.php:75
msgid "Edit your profile and change settings."
msgstr "Éditer votre profil et changer les paramètres."
-#: ../../extend/addon/addon/tour/tour.php:76
+#: ../../addon/tour/tour.php:76
msgid "Click here to see activity from your connections."
msgstr "Cliquer ici pour voir l'activité de vos connections."
-#: ../../extend/addon/addon/tour/tour.php:77
+#: ../../addon/tour/tour.php:77
msgid "Click here to see your channel home."
msgstr "Cliquer ici pour voir votre canal principal."
-#: ../../extend/addon/addon/tour/tour.php:78
+#: ../../addon/tour/tour.php:78
msgid "You can access your private messages from here."
msgstr "Vous pouvez accéder à vos messages privés à partir d'ici."
-#: ../../extend/addon/addon/tour/tour.php:79
+#: ../../addon/tour/tour.php:79
msgid "Create new events here."
msgstr "Créer de nouveaux événements ici."
-#: ../../extend/addon/addon/tour/tour.php:80
+#: ../../addon/tour/tour.php:80
msgid ""
"You can accept new connections and change permissions for existing ones "
"here. You can also e.g. create groups of contacts."
msgstr "Vous pouvez accepter de nouvelles connections et changer les permissions des connections existantes. Vous pouvez également créer des groupes de contacts."
-#: ../../extend/addon/addon/tour/tour.php:81
+#: ../../addon/tour/tour.php:81
msgid "System notifications will arrive here"
msgstr "Les notifications du système arriveront ici."
-#: ../../extend/addon/addon/tour/tour.php:82
+#: ../../addon/tour/tour.php:82
msgid "Search for content and users"
msgstr "Rechercher du contenu ou des utilisateurs"
-#: ../../extend/addon/addon/tour/tour.php:83
+#: ../../addon/tour/tour.php:83
msgid "Browse for new contacts"
msgstr "Rechercher de nouveaux contacts"
-#: ../../extend/addon/addon/tour/tour.php:84
+#: ../../addon/tour/tour.php:84
msgid "Launch installed apps"
msgstr "Démarrer des applications installées"
-#: ../../extend/addon/addon/tour/tour.php:85
+#: ../../addon/tour/tour.php:85
msgid "Looking for help? Click here."
msgstr "Un peu d'aide ? Cliquer ici."
-#: ../../extend/addon/addon/tour/tour.php:86
+#: ../../addon/tour/tour.php:86
msgid ""
"New events have occurred in your network. Click here to see what has "
"happened!"
msgstr "De nouveaux événement se sont produits dans votre réseau. Cliquer ici pour voir ce qui s'est passé !"
-#: ../../extend/addon/addon/tour/tour.php:87
+#: ../../addon/tour/tour.php:87
msgid "You have received a new private message. Click here to see from who!"
msgstr "Vous avez reçu un nouveau message privé. Cliquer ici pour voir qui vous écrit !"
-#: ../../extend/addon/addon/tour/tour.php:88
+#: ../../addon/tour/tour.php:88
msgid "There are events this week. Click here too see which!"
msgstr "Il y a des événements cette semaine. Cliquer ici pour voir lesquels !"
-#: ../../extend/addon/addon/tour/tour.php:89
+#: ../../addon/tour/tour.php:89
msgid "You have received a new introduction. Click here to see who!"
msgstr "Vous avez reçu une nouvelle demande de relation. Cliquer ici pour voir de qui !"
-#: ../../extend/addon/addon/tour/tour.php:90
+#: ../../addon/tour/tour.php:90
msgid ""
"There is a new system notification. Click here to see what has happened!"
msgstr "Vous avez reçu une notification du système. Cliquer ici pour voir ce qui se passe !"
-#: ../../extend/addon/addon/tour/tour.php:93
+#: ../../addon/tour/tour.php:93
msgid "Click here to share text, images, videos and sound."
msgstr "Cliquer ici pour partager du texte, des images, des vidéos ou du son."
-#: ../../extend/addon/addon/tour/tour.php:94
+#: ../../addon/tour/tour.php:94
msgid "You can write an optional title for your update (good for long posts)."
msgstr "Vous pouvez ajouter à votre mise à jour un titre facultatif (pratique pour de longues publications)."
-#: ../../extend/addon/addon/tour/tour.php:95
+#: ../../addon/tour/tour.php:95
msgid "Entering some categories here makes it easier to find your post later."
msgstr "Renseigner certaines catégories ici permet de retrouver plus facilement votre message plus tard."
-#: ../../extend/addon/addon/tour/tour.php:96
+#: ../../addon/tour/tour.php:96
msgid "Share photos, links, location, etc."
msgstr "Partager des photos, des liens, des localisations, etc."
-#: ../../extend/addon/addon/tour/tour.php:97
+#: ../../addon/tour/tour.php:97
msgid ""
"Only want to share content for a while? Make it expire at a certain date."
msgstr "Envie de partager un contenu pour une durée limitée ? Faites-le expirer à une certaine date."
-#: ../../extend/addon/addon/tour/tour.php:98
+#: ../../addon/tour/tour.php:98
msgid "You can password protect content."
msgstr "Vous pouvez protéger un contenu avec un mot de passe."
-#: ../../extend/addon/addon/tour/tour.php:99
+#: ../../addon/tour/tour.php:99
msgid "Choose who you share with."
msgstr "Choisir avec qui vous partagez."
-#: ../../extend/addon/addon/tour/tour.php:101
+#: ../../addon/tour/tour.php:101
msgid "Click here when you are done."
msgstr "Cliquer ici quand vous avez fini."
-#: ../../extend/addon/addon/tour/tour.php:104
+#: ../../addon/tour/tour.php:104
msgid "Adjust from which channels posts should be displayed."
msgstr "Préciser de quels canaux les publications seront affichées."
-#: ../../extend/addon/addon/tour/tour.php:105
+#: ../../addon/tour/tour.php:105
msgid "Only show posts from channels in the specified privacy group."
-msgstr "Afficher uniquement les messages des canaux du groupe de confidentialité spécifié."
+msgstr "Afficher uniquement les messages des canaux appartenant au groupe de contacts spécifié."
-#: ../../extend/addon/addon/tour/tour.php:109
+#: ../../addon/tour/tour.php:109
msgid "Easily find posts containing tags (keywords preceded by the \"#\" symbol)."
msgstr "Trouvez facilement des publications contenant des tags (mots-clés précédés du symbole \"#\")."
-#: ../../extend/addon/addon/tour/tour.php:110
+#: ../../addon/tour/tour.php:110
msgid "Easily find posts in given category."
msgstr "Trouvez facilement des publications dans une catégorie donnée."
-#: ../../extend/addon/addon/tour/tour.php:111
+#: ../../addon/tour/tour.php:111
msgid "Easily find posts by date."
msgstr "Trouvez facilement des publications en fonction de leur date."
-#: ../../extend/addon/addon/tour/tour.php:112
+#: ../../addon/tour/tour.php:112
msgid ""
"Suggested users who have volounteered to be shown as suggestions, and who we"
" think you might find interesting."
msgstr "Voici des utilisateurs que vous pourriez trouver intéressants. Ces utilisateurs se sont portés volontaires pour être affichés comme exemples."
-#: ../../extend/addon/addon/tour/tour.php:113
+#: ../../addon/tour/tour.php:113
msgid "Here you see channels you have connected to."
msgstr "Retrouvez ici les canaux auxquels vous vous êtes connectés."
-#: ../../extend/addon/addon/tour/tour.php:114
+#: ../../addon/tour/tour.php:114
msgid "Save your search so you can repeat it at a later date."
msgstr "Enregistrer votre recherche de façon à pouvoir la répéter plus tard."
-#: ../../extend/addon/addon/tour/tour.php:117
+#: ../../addon/tour/tour.php:117
msgid ""
"If you see this icon you can be sure that the sender is who it say it is. It"
" is normal that it is not always possible to verify the sender, so the icon "
"will be missing sometimes. There is usually no need to worry about that."
msgstr "Si vous voyez cette icône, vous pouvez être sûr que l'expéditeur est qui il dit qu'il est. Il est normal qu'il ne soit pas toujours possible de vérifier l'expéditeur, donc l'icône manquera parfois. Il n'est généralement pas nécessaire de s'inquiéter à ce sujet."
-#: ../../extend/addon/addon/tour/tour.php:118
+#: ../../addon/tour/tour.php:118
msgid ""
"Danger! It seems someone tried to forge a message! This message is not "
"necessarily from who it says it is from!"
msgstr "Attention ! Il semble que quelqu'un a essayé de contrefaire un message ! Ce message n'a pas nécessairement été envoyé par la personne annoncée !"
-#: ../../extend/addon/addon/tour/tour.php:125
+#: ../../addon/tour/tour.php:125
msgid ""
"Welcome to Hubzilla! Would you like to see a tour of the UI?</p> <p>You can "
"pause it at any time and continue where you left off by reloading the page, "
@@ -10007,1029 +10456,318 @@ msgid ""
"return key"
msgstr "Bienvenue sur Hubzilla! Voulez-vous faire un tour de l'interface utilisateur? Vous pouvez le mettre en pause à tout moment et continuer où vous l'avez laissé en rechargeant la page ou en naviguant vers une autre page. Vous pouvez également avancer en appuyant sur la touche de retour."
-#: ../../extend/addon/addon/twitter/twitter.php:99
-msgid "Post to Twitter"
-msgstr "Publier sur Twitter"
-
-#: ../../extend/addon/addon/twitter/twitter.php:154
-msgid "Twitter settings updated."
-msgstr "Les paramètres de Twitter ont été mis à jour."
+#: ../../addon/sendzid/sendzid.php:25
+msgid "Extended Identity Sharing"
+msgstr "Partage d'identification étendu"
-#: ../../extend/addon/addon/twitter/twitter.php:183
+#: ../../addon/sendzid/sendzid.php:26
msgid ""
-"No consumer key pair for Twitter found. Please contact your site "
-"administrator."
-msgstr "Aucune paire de clés d'utilisateur pour Twitter n'a été trouvée. Veuillez contacter l'administrateur de votre site."
+"Share your identity with all websites on the internet. When disabled, "
+"identity is only shared with sites in the matrix."
+msgstr "Partagez votre identification avec tous les sites Web sur Internet. Lorsqu'elle est désactivée, l'identification n'est partagée qu'avec les sites de la matrice."
-#: ../../extend/addon/addon/twitter/twitter.php:205
-msgid ""
-"At this Hubzilla instance the Twitter plugin was enabled but you have not "
-"yet connected your account to your Twitter account. To do so click the "
-"button below to get a PIN from Twitter which you have to copy into the input"
-" box below and submit the form. Only your <strong>public</strong> posts will"
-" be posted to Twitter."
-msgstr "Dans cette instance de Hubzilla, le plugin Twitter a été activé, mais vous n'avez pas encore connecté votre compte à votre compte Twitter. Pour ce faire, cliquez sur le bouton ci-dessous pour obtenir un code PIN de Twitter que vous devez copier dans la zone de saisie ci-dessous, puis soumettre le formulaire. Seuls vos messages publics seront publiés sur Twitter."
+#: ../../addon/tictac/tictac.php:21
+msgid "Three Dimensional Tic-Tac-Toe"
+msgstr "Tic-tac-toe en 3 dimensions"
-#: ../../extend/addon/addon/twitter/twitter.php:207
-msgid "Log in with Twitter"
-msgstr "Connectez-vous avec votre compte Twitter"
+#: ../../addon/tictac/tictac.php:54
+msgid "3D Tic-Tac-Toe"
+msgstr "3D Tic-Tac-Toe"
-#: ../../extend/addon/addon/twitter/twitter.php:210
-msgid "Copy the PIN from Twitter here"
-msgstr "Copier ici le PIN fourni par Twitter"
+#: ../../addon/tictac/tictac.php:59
+msgid "New game"
+msgstr "Nouveau jeu"
+
+#: ../../addon/tictac/tictac.php:60
+msgid "New game with handicap"
+msgstr "Nouveau jeu avec handicap"
-#: ../../extend/addon/addon/twitter/twitter.php:237
+#: ../../addon/tictac/tictac.php:61
msgid ""
-"<strong>Note:</strong> Due your privacy settings (<em>Hide your profile "
-"details from unknown viewers?</em>) the link potentially included in public "
-"postings relayed to Twitter will lead the visitor to a blank page informing "
-"the visitor that the access to your profile has been restricted."
-msgstr "Note : En raison de vos paramètres de confidentialité (Masquer les détails de votre profil aux visiteurs inconnus?), le lien potentiellement inclus dans les annonces publiques relayées vers Twitter amènera le visiteur à une page vierge l'informant que l'accès à votre profil a été restreint."
+"Three dimensional tic-tac-toe is just like the traditional game except that "
+"it is played on multiple levels simultaneously. "
+msgstr "Trois dimensions tic-tac-toe est juste comme le jeu traditionnel, sauf qu'il est joué sur plusieurs niveaux simultanément."
-#: ../../extend/addon/addon/twitter/twitter.php:242
-msgid "Allow posting to Twitter"
-msgstr "Autoriser la publication sur Twitter"
+#: ../../addon/tictac/tictac.php:62
+msgid ""
+"In this case there are three levels. You win by getting three in a row on "
+"any level, as well as up, down, and diagonally across the different levels."
+msgstr "Dans ce cas, il y a trois niveaux. Vous gagnez en obtenant trois dans une rangée à n'importe quel niveau, que ce soit vers le haut, le bas, ou en diagonale à travers les différents niveaux."
-#: ../../extend/addon/addon/twitter/twitter.php:242
+#: ../../addon/tictac/tictac.php:64
msgid ""
-"If enabled your public postings can be posted to the associated Twitter "
-"account"
-msgstr "Si cette option est activée, vos publications publiques peuvent être publiées sur le compte Twitter associé."
+"The handicap game disables the center position on the middle level because "
+"the player claiming this square often has an unfair advantage."
+msgstr "Le jeu handicap désactive la position centrale au niveau intermédiaire, car le joueur qui revendique ce carré a souvent un avantage indu."
-#: ../../extend/addon/addon/twitter/twitter.php:246
-msgid "Send public postings to Twitter by default"
-msgstr "Par défaut, envoyer vos publications publiques sur Twitter."
+#: ../../addon/tictac/tictac.php:183
+msgid "You go first..."
+msgstr "Vous commencez…"
-#: ../../extend/addon/addon/twitter/twitter.php:246
-msgid ""
-"If enabled your public postings will be posted to the associated Twitter "
-"account by default"
-msgstr "Si cette option est activée, par défaut, vos publications publiques seront publiées sur le compte Twitter associé."
+#: ../../addon/tictac/tictac.php:188
+msgid "I'm going first this time..."
+msgstr "Cette fois, je commence…"
-#: ../../extend/addon/addon/twitter/twitter.php:264
-msgid "Twitter Post Settings"
-msgstr "Paramètres des publications Twitter"
+#: ../../addon/tictac/tictac.php:194
+msgid "You won!"
+msgstr "Vous avez gagné !"
-#: ../../extend/addon/addon/twitter/twitter.php:773
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:95
-msgid "Submit Settings"
-msgstr "Emvoyer les paramètres"
+#: ../../addon/tictac/tictac.php:200 ../../addon/tictac/tictac.php:225
+msgid "\"Cat\" game!"
+msgstr "Jeu de \"Chat\" !"
-#: ../../extend/addon/addon/upload_limits/upload_limits.php:25
-msgid "Show Upload Limits"
-msgstr "Afficher les limites de débit ascendant (upload)"
+#: ../../addon/tictac/tictac.php:223
+msgid "I won!"
+msgstr "J'ai gagné !"
-#: ../../extend/addon/addon/upload_limits/upload_limits.php:27
-msgid "Hubzilla configured maximum size: "
-msgstr "Taille maximale configurée par Hubzilla:"
+#: ../../addon/pageheader/pageheader.php:43
+msgid "Message to display on every page on this server"
+msgstr "Message à afficher sur chaque page de ce serveur"
-#: ../../extend/addon/addon/upload_limits/upload_limits.php:28
-msgid "PHP upload_max_filesize: "
-msgstr "PHP upload_max_filesize: "
+#: ../../addon/pageheader/pageheader.php:48
+msgid "Pageheader Settings"
+msgstr "Paramètres du haut de page"
-#: ../../extend/addon/addon/upload_limits/upload_limits.php:29
-msgid "PHP post_max_size (must be larger than upload_max_filesize): "
-msgstr "PHP post_max_size (must be larger than upload_max_filesize): "
+#: ../../addon/pageheader/pageheader.php:64
+msgid "pageheader Settings saved."
+msgstr "Paramètres du haut de page sauvegardés."
-#: ../../extend/addon/addon/visage/visage.php:93
-msgid "Recent Channel/Profile Viewers"
-msgstr "Visiteurs récents du canal/profil"
+#: ../../addon/moremoods/moremoods.php:19
+msgid "lonely"
+msgstr "isolé"
-#: ../../extend/addon/addon/visage/visage.php:98
-msgid "This plugin/addon has not been configured."
-msgstr "Cette extension n'a pas été configurée."
+#: ../../addon/moremoods/moremoods.php:20
+msgid "drunk"
+msgstr "saoul"
-#: ../../extend/addon/addon/visage/visage.php:99
-#, php-format
-msgid "Please visit the Visage settings on %s"
-msgstr "Veuillez visiter les paramètres de Visage sur %s"
+#: ../../addon/moremoods/moremoods.php:21
+msgid "horny"
+msgstr "libidineux"
-#: ../../extend/addon/addon/visage/visage.php:99
-msgid "your feature settings page"
-msgstr "La page des paramètres de vos fonctionnalités"
+#: ../../addon/moremoods/moremoods.php:22
+msgid "stoned"
+msgstr "défoncé"
-#: ../../extend/addon/addon/visage/visage.php:112
-msgid "No entries."
-msgstr "Aucune entrée."
+#: ../../addon/moremoods/moremoods.php:23
+msgid "fucked up"
+msgstr "cramé"
-#: ../../extend/addon/addon/visage/visage.php:166
-msgid "Enable Visage Visitor Logging"
-msgstr "Activer la connexion Visage Visitor"
+#: ../../addon/moremoods/moremoods.php:24
+msgid "clusterfucked"
+msgstr "énervé"
-#: ../../extend/addon/addon/visage/visage.php:170
-msgid "Visage Settings"
-msgstr "Paramètres Visage"
+#: ../../addon/moremoods/moremoods.php:25
+msgid "crazy"
+msgstr "cinglé"
-#: ../../extend/addon/addon/wholikesme/wholikesme.php:29
-msgid "Who likes me?"
-msgstr "Qui m'aime?"
+#: ../../addon/moremoods/moremoods.php:26
+msgid "hurt"
+msgstr "dommage"
-#: ../../extend/addon/addon/wppost/wppost.php:45
-msgid "Post to WordPress"
-msgstr "Publier sur Wordpress"
+#: ../../addon/moremoods/moremoods.php:27
+msgid "sleepy"
+msgstr "somnolent"
-#: ../../extend/addon/addon/wppost/wppost.php:82
-msgid "Enable WordPress Post Plugin"
-msgstr "Activer l'extension de publication WordPress"
+#: ../../addon/moremoods/moremoods.php:28
+msgid "grumpy"
+msgstr "grognon"
-#: ../../extend/addon/addon/wppost/wppost.php:86
-msgid "WordPress username"
-msgstr "Identifiant de connexion WordPress"
+#: ../../addon/moremoods/moremoods.php:29
+msgid "high"
+msgstr "allumé"
-#: ../../extend/addon/addon/wppost/wppost.php:90
-msgid "WordPress password"
-msgstr "Mot de passe de connexion WordPress"
+#: ../../addon/moremoods/moremoods.php:30
+msgid "semi-conscious"
+msgstr "à demi-conscient"
-#: ../../extend/addon/addon/wppost/wppost.php:94
-msgid "WordPress API URL"
-msgstr "URL de l'API WordPress"
+#: ../../addon/moremoods/moremoods.php:31
+msgid "in love"
+msgstr "amoureux"
-#: ../../extend/addon/addon/wppost/wppost.php:95
-msgid "Typically https://your-blog.tld/xmlrpc.php"
-msgstr "Typiquement https://your-blog.tld/xmlrpc.php"
+#: ../../addon/moremoods/moremoods.php:32
+msgid "in lust"
+msgstr "convoitise"
-#: ../../extend/addon/addon/wppost/wppost.php:98
-msgid "WordPress blogid"
-msgstr "ID de votre blog WordPress"
+#: ../../addon/moremoods/moremoods.php:33
+msgid "naked"
+msgstr "nu"
-#: ../../extend/addon/addon/wppost/wppost.php:99
-msgid "For multi-user sites such as wordpress.com, otherwise leave blank"
-msgstr "Pour les sites multi-utilisateurs comme wordpress.com, sinon laisser vide"
+#: ../../addon/moremoods/moremoods.php:34
+msgid "stinky"
+msgstr "puant"
-#: ../../extend/addon/addon/wppost/wppost.php:105
-msgid "Post to WordPress by default"
-msgstr "Par défaut, publier sur WordPress"
+#: ../../addon/moremoods/moremoods.php:35
+msgid "sweaty"
+msgstr "en sueur"
-#: ../../extend/addon/addon/wppost/wppost.php:109
-msgid "Forward comments (requires hubzilla_wp plugin)"
-msgstr "Transférer les commentaires (nécessite le plugin hubzila_wp)"
+#: ../../addon/moremoods/moremoods.php:36
+msgid "bleeding out"
+msgstr "en sang"
-#: ../../extend/addon/addon/wppost/wppost.php:113
-msgid "WordPress Post Settings"
-msgstr "Paramètres de publications WordPress"
+#: ../../addon/moremoods/moremoods.php:37
+msgid "victorious"
+msgstr "victorieux"
-#: ../../extend/addon/addon/wppost/wppost.php:129
-msgid "Wordpress Settings saved."
-msgstr "Les paramètres WordPress ont été sauvegardés."
+#: ../../addon/moremoods/moremoods.php:38
+msgid "defeated"
+msgstr "vaincu"
+
+#: ../../addon/moremoods/moremoods.php:39
+msgid "envious"
+msgstr "envieux"
-#: ../../extend/addon/addon/xmpp/xmpp.php:31
+#: ../../addon/moremoods/moremoods.php:40
+msgid "jealous"
+msgstr "jaloux"
+
+#: ../../addon/xmpp/xmpp.php:31
msgid "XMPP settings updated."
msgstr "Les paramètres XMPP ont été mis à jour."
-#: ../../extend/addon/addon/xmpp/xmpp.php:53
+#: ../../addon/xmpp/xmpp.php:53
msgid "Enable Chat"
msgstr "Activer le Chat"
-#: ../../extend/addon/addon/xmpp/xmpp.php:58
+#: ../../addon/xmpp/xmpp.php:58
msgid "Individual credentials"
msgstr "Informations d'identifications individuelles"
-#: ../../extend/addon/addon/xmpp/xmpp.php:64
+#: ../../addon/xmpp/xmpp.php:64
msgid "Jabber BOSH server"
msgstr "serveur Jabber BOSH"
-#: ../../extend/addon/addon/xmpp/xmpp.php:69
+#: ../../addon/xmpp/xmpp.php:69
msgid "XMPP Settings"
msgstr "Paramètres XMPP"
-#: ../../extend/addon/addon/xmpp/xmpp.php:92
+#: ../../addon/xmpp/xmpp.php:92
msgid "Jabber BOSH host"
msgstr "Hôte Jabber BOSH"
-#: ../../extend/addon/addon/xmpp/xmpp.php:93
+#: ../../addon/xmpp/xmpp.php:93
msgid "Use central userbase"
msgstr "Utiliser la base d'utilisateurs centrale"
-#: ../../extend/addon/addon/xmpp/xmpp.php:93
+#: ../../addon/xmpp/xmpp.php:93
msgid ""
"If enabled, members will automatically login to an ejabberd server that has "
"to be installed on this machine with synchronized credentials via the "
"\"auth_ejabberd.php\" script."
msgstr "Si cette option est activée, les membres se connecteront automatiquement à un serveur ejabberd qui doit être installé sur cette machine avec des informations d'identification synchronisées via le script \"auth_ejabberd.php\"."
-#: ../../extend/addon/addon/cdav/include/widgets.php:37
-msgid "Select Channel"
-msgstr "Sélectionner un canal"
-
-#: ../../extend/addon/addon/cdav/include/widgets.php:42
-msgid "Read-write"
-msgstr "Lire et écrire"
-
-#: ../../extend/addon/addon/cdav/include/widgets.php:43
-msgid "Read-only"
-msgstr "Lire uniquement"
-
-#: ../../extend/addon/addon/cdav/include/widgets.php:116
-msgid "My Calendars"
-msgstr "Mes agendas"
-
-#: ../../extend/addon/addon/cdav/include/widgets.php:118
-msgid "Shared Calendars"
-msgstr "Agendas partagés"
-
-#: ../../extend/addon/addon/cdav/include/widgets.php:122
-msgid "Share this calendar"
-msgstr "Partager cet agenda"
-
-#: ../../extend/addon/addon/cdav/include/widgets.php:124
-msgid "Calendar name and color"
-msgstr "Nom et couleur de l'agenda"
-
-#: ../../extend/addon/addon/cdav/include/widgets.php:126
-msgid "Create new calendar"
-msgstr "Créer un nouvel agenda"
-
-#: ../../extend/addon/addon/cdav/include/widgets.php:128
-msgid "Calendar Name"
-msgstr "Nom de l'agenda"
-
-#: ../../extend/addon/addon/cdav/include/widgets.php:129
-msgid "Calendar Tools"
-msgstr "Outils pour les agendas"
-
-#: ../../extend/addon/addon/cdav/include/widgets.php:130
-msgid "Import calendar"
-msgstr "Importer un agenda"
-
-#: ../../extend/addon/addon/cdav/include/widgets.php:131
-msgid "Select a calendar to import to"
-msgstr "Sélectionner un agenda à importer dans"
-
-#: ../../extend/addon/addon/cdav/include/widgets.php:158
-msgid "Addressbooks"
-msgstr "Carnet d'adresses"
-
-#: ../../extend/addon/addon/cdav/include/widgets.php:160
-msgid "Addressbook name"
-msgstr "Nom du carnet d'adresses"
-
-#: ../../extend/addon/addon/cdav/include/widgets.php:162
-msgid "Create new addressbook"
-msgstr "Créer un nouveau carnet d'adresses"
-
-#: ../../extend/addon/addon/cdav/include/widgets.php:163
-msgid "Addressbook Name"
-msgstr "Nom du carnet d'adresses"
-
-#: ../../extend/addon/addon/cdav/include/widgets.php:165
-msgid "Addressbook Tools"
-msgstr "Outils pour les carnets d'adresses"
-
-#: ../../extend/addon/addon/cdav/include/widgets.php:166
-msgid "Import addressbook"
-msgstr "Importer un carnet d'adresses"
-
-#: ../../extend/addon/addon/cdav/include/widgets.php:167
-msgid "Select an addressbook to import to"
-msgstr "Sélectionner un carnet d'adresses à importer dans"
-
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:744
-msgid "INVALID EVENT DISMISSED!"
-msgstr "ÉVÉNEMENT INVALIDE REJETÉ!"
-
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:745
-msgid "Summary: "
-msgstr "Sommaire :"
-
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:746
-msgid "Date: "
-msgstr "Date :"
-
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:747
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:754
-msgid "Reason: "
-msgstr "Raison :"
-
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:752
-msgid "INVALID CARD DISMISSED!"
-msgstr "ÉVÉNEMENT INVALIDE REJETÉ!"
-
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:753
-msgid "Name: "
-msgstr "Nom :"
-
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:770
-msgid ""
-"You have to enable this plugin in Feature/Addon Settings > CalDAV/CardDAV "
-"Settings before you can use it."
-msgstr "Vous avez activé ce plugin dans Fonctionalités/Paramètres des extensions > CalDAV/CardDAV Paramètres avant que vous puissiez l'utiliser."
-
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:836
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:837
-msgid "Example: YYYY-MM-DD HH:mm"
-msgstr "Exemple : YYYY-MM-DD HH:mm"
-
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:837
-msgid "End date and time"
-msgstr "Date et heure de fin"
-
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:852
-msgid "List month"
-msgstr "Liste mois"
-
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:853
-msgid "List week"
-msgstr "Liste semaine"
-
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:854
-msgid "List day"
-msgstr "Liste jour"
-
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:861
-msgid "More"
-msgstr "Plus"
-
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:862
-msgid "Less"
-msgstr "Moins"
-
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:863
-msgid "Select calendar"
-msgstr "Sélectionner un calendrier"
-
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:865
-msgid "Delete all"
-msgstr "Tout supprimer"
-
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:867
-msgid "Sorry! Editing of recurrent events is not yet implemented."
-msgstr "Désolé ! L'édition d'événements récurrents n'est pas encore implémenté."
-
-#: ../../extend/addon/addon/cdav/cdav.php:36
-msgid "Errors encountered creating database table: "
-msgstr "Des erreurs se sont produites lors de la création de la table de la base de données :"
-
-#: ../../extend/addon/addon/cdav/cdav.php:197
-msgid "Default Calendar"
-msgstr "Agenda par défaut"
-
-#: ../../extend/addon/addon/cdav/cdav.php:206
-msgid "Default Addressbook"
-msgstr "Carnet d'adresses par défaut"
-
-#: ../../extend/addon/addon/cdav/cdav.php:215
-msgid "CalDAV/CardDAV Settings saved."
-msgstr "Les paramètres CalDAV/CardDAV ont été sauvegardés."
-
-#: ../../extend/addon/addon/cdav/cdav.php:234
-msgid "Enable CalDAV/CardDAV Server for this channel"
-msgstr "Activer le serveur CalDAV/CardDAV pour ce canal"
-
-#: ../../extend/addon/addon/cdav/cdav.php:237
-#, php-format
-msgid "Your CalDAV resources are located at %s "
-msgstr "Vos ressources CalDAV sont situées à %s"
-
-#: ../../extend/addon/addon/cdav/cdav.php:240
-#, php-format
-msgid "Your CardDAV resources are located at %s "
-msgstr "Vos ressources CardDAV sont situées à %s"
-
-#: ../../extend/addon/addon/cdav/cdav.php:246
-msgid "CalDAV/CardDAV Settings"
-msgstr "Paramètres CalDAV/CardDAV"
-
-#: ../../extend/addon/addon/cdav/cdav.php:272
-#: ../../include/connections.php:896
-msgid "Home, Voice"
-msgstr "Domicile, Voix"
-
-#: ../../extend/addon/addon/cdav/cdav.php:273
-#: ../../include/connections.php:897
-msgid "Home, Fax"
-msgstr "Domicile, Fax"
-
-#: ../../extend/addon/addon/cdav/cdav.php:275
-#: ../../include/connections.php:899
-msgid "Work, Voice"
-msgstr "Travail, Voix"
-
-#: ../../extend/addon/addon/cdav/cdav.php:276
-#: ../../include/connections.php:900
-msgid "Work, Fax"
-msgstr "Travail, Fax"
-
-#: ../../extend/addon/addon/chess/chess.php:276
-#: ../../extend/addon/addon/chess/chess.php:430
-msgid "Invalid game."
-msgstr "Jeu invalide"
-
-#: ../../extend/addon/addon/chess/chess.php:282
-#: ../../extend/addon/addon/chess/chess.php:436
-msgid "You are not a player in this game."
-msgstr "Vous n'êtes pas un joueur de ce jeu."
-
-#: ../../extend/addon/addon/chess/chess.php:315
-msgid "You must be a local channel to create a game."
-msgstr "Vous devez être un canal local pour créer un jeu."
-
-#: ../../extend/addon/addon/chess/chess.php:333
-msgid "You must select one opponent that is not yourself."
-msgstr "Vous devez sélectionner un adversaire qui ne soit pas vous-même."
-
-#: ../../extend/addon/addon/chess/chess.php:336
-msgid "Creating new game..."
-msgstr "en train de créer un nouveau jeu…"
-
-#: ../../extend/addon/addon/chess/chess.php:342
-msgid "You must select white or black."
-msgstr "Vous devez sélectionner les blancs ou les noirs."
-
-#: ../../extend/addon/addon/chess/chess.php:349
-msgid "Error creating new game."
-msgstr "Erreur lors de la création du nouveau jeu."
-
-#: ../../extend/addon/addon/chess/chess.php:379 ../../include/channel.php:899
-msgid "Requested channel is not available."
-msgstr "Canal demandé non disponible."
-
-#: ../../extend/addon/addon/chess/chess.php:392
-msgid "You must select a local channel /chess/channelname"
-msgstr "Vous devez sélectionner un canal local /échecs/nomducanal"
-
-#: ../../extend/addon/addon/chess/chess.php:920
-msgid "Enable notifications"
-msgstr "Activer les notifications"
-
-#: ../../extend/addon/addon/likebanner/likebanner.php:51
-msgid "Your Webbie:"
-msgstr "Vous êtes Webbie :"
-
-#: ../../extend/addon/addon/likebanner/likebanner.php:54
-msgid "Fontsize (px):"
-msgstr "Taille de la police (px) :"
-
-#: ../../extend/addon/addon/likebanner/likebanner.php:68
-msgid "Link:"
-msgstr "Lien :"
-
-#: ../../extend/addon/addon/likebanner/likebanner.php:70
-msgid "Like us on Hubzilla"
-msgstr "Aimez-nous sur Hubzilla"
-
-#: ../../extend/addon/addon/likebanner/likebanner.php:72
-msgid "Embed:"
-msgstr "Embarqué :"
-
-#: ../../extend/addon/addon/openid/Mod_Id.php:85
-#: ../../include/selectors.php:49 ../../include/selectors.php:66
-msgid "Male"
-msgstr "Homme"
-
-#: ../../extend/addon/addon/openid/Mod_Id.php:87
-#: ../../include/selectors.php:49 ../../include/selectors.php:66
-msgid "Female"
-msgstr "Femme"
-
-#: ../../extend/addon/addon/openid/MysqlProvider.php:52
-msgid "First Name"
-msgstr "Prénom"
-
-#: ../../extend/addon/addon/openid/MysqlProvider.php:53
-msgid "Last Name"
-msgstr "Nom"
-
-#: ../../extend/addon/addon/openid/MysqlProvider.php:55
-msgid "Full Name"
-msgstr "Nom complet"
-
-#: ../../extend/addon/addon/openid/MysqlProvider.php:61
-msgid "Profile Photo 16px"
-msgstr "Photo de profil 16px"
-
-#: ../../extend/addon/addon/openid/MysqlProvider.php:62
-msgid "Profile Photo 32px"
-msgstr "Photo de profil 32px"
-
-#: ../../extend/addon/addon/openid/MysqlProvider.php:63
-msgid "Profile Photo 48px"
-msgstr "Photo de profil 48px"
-
-#: ../../extend/addon/addon/openid/MysqlProvider.php:64
-msgid "Profile Photo 64px"
-msgstr "Photo de profil 64px"
-
-#: ../../extend/addon/addon/openid/MysqlProvider.php:65
-msgid "Profile Photo 80px"
-msgstr "Photo de profil 80px"
-
-#: ../../extend/addon/addon/openid/MysqlProvider.php:66
-msgid "Profile Photo 128px"
-msgstr "Photo de profil 128px"
-
-#: ../../extend/addon/addon/openid/MysqlProvider.php:67
-msgid "Timezone"
-msgstr "Fuseau horaire"
-
-#: ../../extend/addon/addon/openid/MysqlProvider.php:70
-msgid "Birth Year"
-msgstr "Années de naissance"
-
-#: ../../extend/addon/addon/openid/MysqlProvider.php:71
-msgid "Birth Month"
-msgstr "Mois de naissance"
-
-#: ../../extend/addon/addon/openid/MysqlProvider.php:72
-msgid "Birth Day"
-msgstr "Jour de naissance"
-
-#: ../../extend/addon/addon/openid/MysqlProvider.php:73
-msgid "Birthdate"
-msgstr "Date de naissance"
-
-#: ../../extend/addon/addon/openid/openid.php:49
-msgid ""
-"We encountered a problem while logging in with the OpenID you provided. "
-"Please check the correct spelling of the ID."
-msgstr "Nous avons rencontrons un problème lors de l'identification avec l'OpenID que vous avez fournie. Veuillez vérifier que vous avez correctement écrit votre ID."
-
-#: ../../extend/addon/addon/openid/openid.php:49
-msgid "The error message was:"
-msgstr "Le message d'erreur était :"
-
-#: ../../extend/addon/addon/openid/Mod_Openid.php:30
-msgid "OpenID protocol error. No ID returned."
-msgstr "Erreur du protocole OpenID. Aucune ID trouvée."
-
-#: ../../extend/addon/addon/openid/Mod_Openid.php:188
-#: ../../include/auth.php:286
-msgid "Login failed."
-msgstr "Échec de la connexion."
-
-#: ../../extend/addon/addon/diaspora_reconnect/diaspora_reconnect.php:44
-#, php-format
-msgid "Reconnecting %d connections"
-msgstr "Reconnection des relations de %d"
-
-#: ../../extend/addon/addon/diaspora_reconnect/diaspora_reconnect.php:63
-msgid "Diaspora Reconnect"
-msgstr "Reconnexion de Diaspora"
-
-#: ../../extend/addon/addon/diaspora_reconnect/diaspora_reconnect.php:65
-msgid ""
-"Use this form to re-establish Diaspora connections which were initially made"
-" from a different hub."
-msgstr "Utiliser ce formulaire pour établir à nouveau les connexions avec Diaspora qui avait été initialement créées sur un hub différent."
-
-#: ../../extend/addon/addon/diaspora_reconnect/diaspora_reconnect.php:70
-msgid "Reconnect"
-msgstr "Reconnecter"
-
-#: ../../extend/addon/addon/mailtest/mailtest.php:19
-msgid "Send test email"
-msgstr "Envoyer un mail de test"
-
-#: ../../extend/addon/addon/mailtest/mailtest.php:66
-msgid "Mail sent."
-msgstr "Mail envoyé."
-
-#: ../../extend/addon/addon/mailtest/mailtest.php:68
-msgid "Sending of mail failed."
-msgstr "L'envoi du mail a échoué."
-
-#: ../../extend/addon/addon/mailtest/mailtest.php:77
-msgid "Mail Test"
-msgstr "Test du mail"
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:57
-msgid "Errors encountered deleting database table "
-msgstr "Des erreurs ont eu lieu lors de la suppression de la table de la base de données."
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:96
-msgid "Drop tables when uninstalling?"
-msgstr "Lors de la désinstallation, purger les tables?"
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:96
-msgid ""
-"If checked, the Rendezvous database tables will be deleted when the plugin "
-"is uninstalled."
-msgstr "Si cette case est cochée, les tables de la base Rendezvous seront supprimées lorsque le plugin sera désinstallé."
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:97
-msgid "Mapbox Access Token"
-msgstr "Jeton d'accès à la mapbox."
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:97
-msgid ""
-"If you enter a Mapbox access token, it will be used to retrieve map tiles "
-"from Mapbox instead of the default OpenStreetMap tile server."
-msgstr "Si vous entrez un jeton d'accès Mapbox, il doit être utilisé pour récupérer les cartes à partir de Mapbox au lieu du serveur par défaut OpenStreetMap."
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:162
-msgid "Rendezvous"
-msgstr "Rendezvous"
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:167
-msgid ""
-"This identity has been deleted by another member due to inactivity. Please "
-"press the \"New identity\" button or refresh the page to register a new "
-"identity. You may use the same name."
-msgstr "Cette identité a été supprimée par un autre membre en raison de l'inactivité. Appuyez sur le bouton \"Nouvelle identité\" ou actualisez la page pour enregistrer une nouvelle identité. Vous pouvez utiliser le même nom."
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:168
-msgid "Welcome to Rendezvous!"
-msgstr "Bienvenue dans Rendevzvous!"
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:169
-msgid ""
-"Enter your name to join this rendezvous. To begin sharing your location with"
-" the other members, tap the GPS control. When your location is discovered, a"
-" red dot will appear and others will be able to see you on the map."
-msgstr "Entrez votre nom pour rejoindre ce rendez-vous. Pour commencer à partager votre emplacement avec les autres membres, appuyez sur le contrôle GPS. Lorsque votre emplacement est découvert, un point rouge apparaîtra et les autres seront en mesure de vous voir sur la carte."
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:171
-msgid "Let's meet here"
-msgstr "Rencontrez-vous ici"
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:174
-msgid "New marker"
-msgstr "Nouveau marqueur"
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:175
-msgid "Edit marker"
-msgstr "Éditer le marqueur"
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:176
-msgid "New identity"
-msgstr "Nouvelle identité"
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:177
-msgid "Delete marker"
-msgstr "Supprimer le marqueur"
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:178
-msgid "Delete member"
-msgstr "Supprimer le membre"
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:179
-msgid "Edit proximity alert"
-msgstr "Éditer l'alerte de proximité"
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:180
-msgid ""
-"A proximity alert will be issued when this member is within a certain radius"
-" of you.<br><br>Enter a radius in meters (0 to disable):"
-msgstr "Une alerte de proximité sera émise lorsque ce membre se trouve dans un certain périmètre autour de vous. Entrer un rayon en mètres (0 pour désactiver):"
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:180
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:185
-msgid "distance"
-msgstr "distance"
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:181
-msgid "Proximity alert distance (meters)"
-msgstr "Distance d'alerte de proximité (mètres)"
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:182
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:184
-msgid ""
-"A proximity alert will be issued when you are within a certain radius of the"
-" marker location.<br><br>Enter a radius in meters (0 to disable):"
-msgstr "Une alerte de proximité sera déclenchée quand vous serez à une certaine distance du marqueur d'emplacement.<br><br>Indiquez une distance en mètres (0 pour désactiver)&nbsp;:"
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:183
-msgid "Marker proximity alert"
-msgstr "Alerte de proximité de marqueur"
+#: ../../addon/wholikesme/wholikesme.php:29
+msgid "Who likes me?"
+msgstr "Qui m'aime?"
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:186
-msgid "Reminder note"
-msgstr "Note de rappel"
+#: ../../addon/pumpio/pumpio.php:148
+msgid "You are now authenticated to pumpio."
+msgstr "Vous êtes maintenant connecté à pumpio."
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:187
-msgid ""
-"Enter a note to be displayed when you are within the specified proximity..."
-msgstr "Saisissez une note à afficher quand vous serez à la distance indiquée..."
+#: ../../addon/pumpio/pumpio.php:149
+msgid "return to the featured settings page"
+msgstr "retourner à la page des paramètres des fonctionnalités"
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:199
-msgid "Add new rendezvous"
-msgstr "Ajouter un nouveau rendezvous"
+#: ../../addon/pumpio/pumpio.php:163
+msgid "Post to Pump.io"
+msgstr "Publier sur Pump.io"
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:200
-msgid ""
-"Create a new rendezvous and share the access link with those you wish to "
-"invite to the group. Those who open the link become members of the "
-"rendezvous. They can view other member locations, add markers to the map, or"
-" share their own locations with the group."
-msgstr "Créez un nouveau rendez-vous et partagez le lien d'accès avec les gens que vous souhaitez inviter au groupe. Ceux qui ouvrent le lien deviennent membres du rendez-vous. Ils peuvent afficher les emplacements des autres membres, ajouter des marqueurs à la carte ou partager leurs propres emplacements avec le groupe."
+#: ../../addon/pumpio/pumpio.php:198
+msgid "Pump.io servername"
+msgstr "Nom du serveur Pump.io"
-#: ../../extend/addon/addon/firefox/firefox.php:23
-msgid "Install Firefox Sharing Tools"
-msgstr "Installer Firefox Sharing Tools"
+#: ../../addon/pumpio/pumpio.php:198
+msgid "Without \"http://\" or \"https://\""
+msgstr "Sans \"http://\" ou \"https://\""
-#: ../../extend/addon/addon/firefox/firefox.php:34
-msgid "Share content from Firefox to $Projectname"
-msgstr "Partager du contenu depuis Firefox avec $Projectname"
+#: ../../addon/pumpio/pumpio.php:202
+msgid "Pump.io username"
+msgstr "Identifiant Pump.io"
-#: ../../extend/addon/addon/firefox/firefox.php:37
-msgid "Install Firefox Sharing Tools to this web browser"
-msgstr "Installer Firefox Sharing Tools sur ce navigateur"
+#: ../../addon/pumpio/pumpio.php:202
+msgid "Without the servername"
+msgstr "Sans le nom de serveur"
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:105
-msgid "Error retrieving wiki"
-msgstr "Erreur lors de la récupération du wiki"
+#: ../../addon/pumpio/pumpio.php:213
+msgid "You are not authenticated to pumpio"
+msgstr "Vous n'êtes pas connecté à Pump.io"
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:112
-msgid "Error creating zip file export folder"
-msgstr "Erreur lors de la création du dossier d'exportation du fichier zip"
+#: ../../addon/pumpio/pumpio.php:215
+msgid "(Re-)Authenticate your pump.io connection"
+msgstr "Authentifiez-vous à nouveau auprès de Pump.io"
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:130
-msgid "Error downloading wiki: "
-msgstr "Erreur lors du téléchargement du wiki:"
+#: ../../addon/pumpio/pumpio.php:219
+msgid "Enable pump.io Post Plugin"
+msgstr "Activer le plugin de publication Pump.io"
-#: ../../extend/addon/addon/gitwiki/gitwiki.php:76
-#: ../../include/widgets.php:970
-msgid "Wiki Pages"
-msgstr "Pages wiki"
+#: ../../addon/pumpio/pumpio.php:223
+msgid "Post to pump.io by default"
+msgstr "Par défaut, publier sur Pump.io"
-#: ../../extend/addon/addon/gitwiki/gitwiki.php:81
-#: ../../include/widgets.php:976
-msgid "Add new page"
-msgstr "Ajouter une nouvelle page"
+#: ../../addon/pumpio/pumpio.php:227
+msgid "Should posts be public"
+msgstr "Les publications doivent-elles être publiques ?"
-#: ../../extend/addon/addon/gitwiki/gitwiki.php:82
-#: ../../include/widgets.php:977
-msgid "Page name"
-msgstr "Nom de la page"
+#: ../../addon/pumpio/pumpio.php:231
+msgid "Mirror all public posts"
+msgstr "Créer une copie miroir de toutes les publications publiques"
-#: ../../extend/addon/addon/gitwiki/gitwiki.php:95
-#: ../../include/widgets.php:927
-msgid "Wiki List"
-msgstr "Liste de wikis"
+#: ../../addon/pumpio/pumpio.php:237
+msgid "Pump.io Post Settings"
+msgstr "Paramètres de publication Pump.io"
-#: ../../extend/addon/addon/gnusoc/gnusoc.php:129
-msgid "Enable the GNU-Social protocol for this channel"
-msgstr "Activer le protocole GNU-Social pour ce canal"
+#: ../../addon/pumpio/pumpio.php:266
+msgid "PumpIO Settings saved."
+msgstr "Paramètres Pump.io sauvegardés."
-#: ../../extend/addon/addon/opensearch/opensearch.php:26 ../../boot.php:1187
-#, php-format
-msgctxt "opensearch"
-msgid "Search %1$s (%2$s)"
-msgstr "Recherche %1$s (%2$s)"
+#: ../../addon/ldapauth/ldapauth.php:61
+msgid "An account has been created for you."
+msgstr "Un compte a été créé pour vous."
-#: ../../extend/addon/addon/opensearch/opensearch.php:28 ../../boot.php:1187
-msgctxt "opensearch"
-msgid "$Projectname"
-msgstr "$Projectname"
+#: ../../addon/ldapauth/ldapauth.php:68
+msgid "Authentication successful but rejected: account creation is disabled."
+msgstr "L'authentification a réussi mais a été rejetée : la création de comptes est désactivée."
-#: ../../extend/addon/addon/opensearch/opensearch.php:43
+#: ../../addon/opensearch/opensearch.php:43
msgid "Search $Projectname"
msgstr "Chercher dans $Projectname"
-#: ../../include/dba/dba_driver.php:187
-#, php-format
-msgid "Cannot locate DNS info for database server '%s'"
-msgstr "Impossible de trouver les infos DNS du serveur de BDD '%s'"
-
-#: ../../include/language.php:367 ../../include/text.php:1783
-msgid "default"
-msgstr "défaut"
-
-#: ../../include/language.php:380
-msgid "Select an alternate language"
-msgstr "Choisir une langue alternative"
-
-#: ../../include/account.php:35
-msgid "Not a valid email address"
-msgstr "Ce n'est pas une adresse de courriel valide"
-
-#: ../../include/account.php:37
-msgid "Your email domain is not among those allowed on this site"
-msgstr "Votre domaine de courriel ne fait pas partie de ceux autorisés par ce site"
-
-#: ../../include/account.php:43
-msgid "Your email address is already registered at this site."
-msgstr "Votre adresse de courriel est déjà inscrite sur ce site."
-
-#: ../../include/account.php:75
-msgid "An invitation is required."
-msgstr "Une invitation est requise."
-
-#: ../../include/account.php:79
-msgid "Invitation could not be verified."
-msgstr "Votre invitation n'a pas pu être vérifiée."
-
-#: ../../include/account.php:130
-msgid "Please enter the required information."
-msgstr "Merci d'entrer les informations requises."
-
-#: ../../include/account.php:198
-msgid "Failed to store account information."
-msgstr "Impossible de stocker les informations liées au compte."
-
-#: ../../include/account.php:263
-#, php-format
-msgid "Registration confirmation for %s"
-msgstr "Confirmation de l'inscription pour %s"
-
-#: ../../include/account.php:330
-#, php-format
-msgid "Registration request at %s"
-msgstr "Demande d'inscription sur %s"
-
-#: ../../include/account.php:352
-msgid "your registration password"
-msgstr "votre mot de passe d'inscription"
-
-#: ../../include/account.php:358 ../../include/account.php:420
-#, php-format
-msgid "Registration details for %s"
-msgstr "Détails de l'inscription pour %s"
-
-#: ../../include/account.php:431
-msgid "Account approved."
-msgstr "Compte approuvé."
-
-#: ../../include/account.php:471
-#, php-format
-msgid "Registration revoked for %s"
-msgstr "Inscription révoquée pour %s"
-
-#: ../../include/account.php:756 ../../include/account.php:758
-msgid "Click here to upgrade."
-msgstr "Cliquez ici pour mettre à jour."
-
-#: ../../include/account.php:764
-msgid "This action exceeds the limits set by your subscription plan."
-msgstr "Cette action outrepasserait les limites prévues par votre forfait."
-
-#: ../../include/account.php:769
-msgid "This action is not available under your subscription plan."
-msgstr "Cette action n'est pas disponible avec votre forfait."
-
-#: ../../include/acl_selectors.php:208
-msgid "Who can see this?"
-msgstr "Qui peut voir cela"
-
-#: ../../include/acl_selectors.php:209
-msgid "Custom selection"
-msgstr "Sélection personnalisée"
+#: ../../addon/redfiles/redfiles.php:119
+msgid "Redmatrix File Storage Import"
+msgstr "Importation du fichier de stockage Redmatrix"
-#: ../../include/acl_selectors.php:210
-msgid ""
-"Select \"Show\" to allow viewing. \"Don't show\" lets you override and limit"
-" the scope of \"Show\"."
-msgstr "Sélectionnez \"Afficher\" pour permettre l'affichage. \"Ne pas afficher\" vous permet de remplacer et de limiter la portée de \"Afficher\"."
+#: ../../addon/redfiles/redfiles.php:120
+msgid "This will import all your Redmatrix cloud files to this channel."
+msgstr "Ceci importera tous vos fichiers Redmatrix dans ce canal."
-#: ../../include/acl_selectors.php:211
-msgid "Show"
-msgstr "Montrer"
+#: ../../addon/redfiles/redfilehelper.php:67
+msgid "file"
+msgstr "fichier"
-#: ../../include/acl_selectors.php:212
-msgid "Don't show"
-msgstr "Cacher"
+#: ../../addon/hubwall/hubwall.php:19
+msgid "Send email to all members"
+msgstr "Envoyer un mail à tous les membres"
-#: ../../include/acl_selectors.php:245
+#: ../../addon/hubwall/hubwall.php:33
#, php-format
-msgid ""
-"Post permissions %s cannot be changed %s after a post is shared.</br />These"
-" permissions set who is allowed to view the post."
-msgstr "Les autorisations d'accès d'un message %s ne peuvent pas être modifiées %s une fois le message envoyé. Ces autorisations définissent qui est autorisé à afficher le message."
-
-#: ../../include/taxonomy.php:188 ../../include/taxonomy.php:270
-#: ../../include/widgets.php:46 ../../include/widgets.php:469
-#: ../../include/contact_widgets.php:91
-msgid "Categories"
-msgstr "Catégories"
-
-#: ../../include/taxonomy.php:228 ../../include/taxonomy.php:249
-msgid "Tags"
-msgstr "Étiquettes"
-
-#: ../../include/taxonomy.php:293
-msgid "Keywords"
-msgstr "Mots-clefs"
-
-#: ../../include/taxonomy.php:314
-msgid "have"
-msgstr "ont"
-
-#: ../../include/taxonomy.php:314
-msgid "has"
-msgstr "a"
-
-#: ../../include/taxonomy.php:315
-msgid "want"
-msgstr "veulent"
-
-#: ../../include/taxonomy.php:315
-msgid "wants"
-msgstr "veut"
-
-#: ../../include/taxonomy.php:316
-msgid "likes"
-msgstr "aime"
-
-#: ../../include/taxonomy.php:317
-msgid "dislikes"
-msgstr "n'aime pas"
-
-#: ../../include/markdown.php:444
-msgid "Attachments:"
-msgstr "Pièces jointes&nbsp;:"
-
-#: ../../include/markdown.php:539 ../../include/event.php:22
-#: ../../include/event.php:69
-msgid "l F d, Y \\@ g:i A"
-msgstr "l d F Y \\à G\\hi"
-
-#: ../../include/markdown.php:541
-msgid "$Projectname event notification:"
-msgstr "Notification d'événement de $Projectname&nbsp;:"
-
-#: ../../include/markdown.php:545 ../../include/event.php:30
-#: ../../include/event.php:73
-msgid "Starts:"
-msgstr "Début&nbsp;:"
-
-#: ../../include/markdown.php:553 ../../include/event.php:40
-#: ../../include/event.php:77
-msgid "Finishes:"
-msgstr "Fin&nbsp;:"
-
-#: ../../include/datetime.php:147
-msgid "Birthday"
-msgstr "Anniversaire"
-
-#: ../../include/datetime.php:149
-msgid "Age: "
-msgstr "Age&nbsp;:"
-
-#: ../../include/datetime.php:151
-msgid "YYYY-MM-DD or MM-DD"
-msgstr "AAAA-MM-JJ ou MM-JJ"
-
-#: ../../include/datetime.php:286 ../../boot.php:2578
-msgid "never"
-msgstr "jamais"
-
-#: ../../include/datetime.php:292
-msgid "less than a second ago"
-msgstr "à l'instant"
+msgid "$1%s Administrator"
+msgstr "$1%s administrateur"
-#: ../../include/datetime.php:310
+#: ../../addon/hubwall/hubwall.php:73
#, php-format
-msgctxt "e.g. 22 hours ago, 1 minute ago"
-msgid "%1$d %2$s ago"
-msgstr "il y a %1$d %2$s"
-
-#: ../../include/datetime.php:321
-msgctxt "relative_date"
-msgid "year"
-msgid_plural "years"
-msgstr[0] "an"
-msgstr[1] "ans"
-
-#: ../../include/datetime.php:324
-msgctxt "relative_date"
-msgid "month"
-msgid_plural "months"
-msgstr[0] "mois"
-msgstr[1] "mois"
-
-#: ../../include/datetime.php:327
-msgctxt "relative_date"
-msgid "week"
-msgid_plural "weeks"
-msgstr[0] "semaine"
-msgstr[1] "semaines"
-
-#: ../../include/datetime.php:330
-msgctxt "relative_date"
-msgid "day"
-msgid_plural "days"
-msgstr[0] "jour"
-msgstr[1] "jours"
-
-#: ../../include/datetime.php:333
-msgctxt "relative_date"
-msgid "hour"
-msgid_plural "hours"
-msgstr[0] "heure"
-msgstr[1] "heures"
-
-#: ../../include/datetime.php:336
-msgctxt "relative_date"
-msgid "minute"
-msgid_plural "minutes"
-msgstr[0] "minute"
-msgstr[1] "minutes"
+msgid "%1$d of %2$d messages sent."
+msgstr "%1$d message(s) envoyés sur %2$d."
-#: ../../include/datetime.php:339
-msgctxt "relative_date"
-msgid "second"
-msgid_plural "seconds"
-msgstr[0] "seconde"
-msgstr[1] "secondes"
+#: ../../addon/hubwall/hubwall.php:81
+msgid "Send email to all hub members."
+msgstr "Envoyer un e-mail à tous les membres du hub."
-#: ../../include/datetime.php:576
-#, php-format
-msgid "%1$s's birthday"
-msgstr "Anniversaire de %1$s"
+#: ../../addon/hubwall/hubwall.php:93
+msgid "Sender Email address"
+msgstr "Adresse mail de l'expéditeur"
-#: ../../include/datetime.php:577
-#, php-format
-msgid "Happy Birthday %1$s"
-msgstr "Joyeux Anniversaire %1$s"
+#: ../../addon/hubwall/hubwall.php:94
+msgid "Test mode (only send to hub administrator)"
+msgstr "Mode test (uniquement envoyé à l'administrateur du hub)"
#: ../../include/selectors.php:30
msgid "Frequently"
@@ -11271,739 +11009,720 @@ msgstr "S'en fiche"
msgid "Ask me"
msgstr "Me demander"
-#: ../../include/connections.php:127
-msgid "New window"
-msgstr "Nouvelle fenêtre"
-
-#: ../../include/connections.php:128
-msgid "Open the selected location in a different window or browser tab"
-msgstr "Ouvrir l'emplacement dans une fenêtre ou un onglet différent"
-
-#: ../../include/connections.php:246
-#, php-format
-msgid "User '%s' deleted"
-msgstr "Utilisateur '%s' supprimé"
-
-#: ../../include/conversation.php:204
+#: ../../include/conversation.php:200
#, php-format
msgid "%1$s is now connected with %2$s"
msgstr "%1$s ajoute %2$s à ses contacts"
-#: ../../include/conversation.php:239
+#: ../../include/conversation.php:235
#, php-format
msgid "%1$s poked %2$s"
msgstr "%1$s a tapoté %2$s"
-#: ../../include/conversation.php:243 ../../include/text.php:1092
-#: ../../include/text.php:1097
+#: ../../include/conversation.php:239 ../../include/text.php:1115
+#: ../../include/text.php:1120
msgid "poked"
msgstr "a tapoté"
-#: ../../include/conversation.php:690
+#: ../../include/conversation.php:691
#, php-format
msgid "View %s's profile @ %s"
msgstr "Voir le profil de %s @ %s"
-#: ../../include/conversation.php:710
+#: ../../include/conversation.php:711
msgid "Categories:"
msgstr "Catégories&nbsp;:"
-#: ../../include/conversation.php:711
+#: ../../include/conversation.php:712
msgid "Filed under:"
msgstr "Classé sous&nbsp;:"
-#: ../../include/conversation.php:736
+#: ../../include/conversation.php:737
msgid "View in context"
msgstr "Voir en contexte"
-#: ../../include/conversation.php:832
+#: ../../include/conversation.php:834
msgid "remove"
msgstr "supprimer"
-#: ../../include/conversation.php:836 ../../include/nav.php:292
+#: ../../include/conversation.php:838 ../../include/nav.php:268
msgid "Loading..."
msgstr "Chargement..."
-#: ../../include/conversation.php:837
+#: ../../include/conversation.php:839
msgid "Delete Selected Items"
msgstr "Supprimer les éléments selectionnés"
-#: ../../include/conversation.php:930 ../../include/conversation.php:972
+#: ../../include/conversation.php:882
msgid "View Source"
msgstr "Voir source"
-#: ../../include/conversation.php:931 ../../include/conversation.php:982
+#: ../../include/conversation.php:892
msgid "Follow Thread"
msgstr "Suivre la discussion"
-#: ../../include/conversation.php:932 ../../include/conversation.php:991
+#: ../../include/conversation.php:901
msgid "Unfollow Thread"
msgstr "Ne plus suivre la discussion"
-#: ../../include/conversation.php:937 ../../include/conversation.php:1059
+#: ../../include/conversation.php:992
msgid "Activity/Posts"
msgstr "Activité/Publications"
-#: ../../include/conversation.php:939 ../../include/conversation.php:1079
+#: ../../include/conversation.php:1012
msgid "Edit Connection"
msgstr "Modifier le contact"
-#: ../../include/conversation.php:940 ../../include/conversation.php:1089
+#: ../../include/conversation.php:1022
msgid "Message"
msgstr "Message"
-#: ../../include/conversation.php:1223
+#: ../../include/conversation.php:1156
#, php-format
msgid "%s likes this."
msgstr "%s aime ça."
-#: ../../include/conversation.php:1223
+#: ../../include/conversation.php:1156
#, php-format
msgid "%s doesn't like this."
msgstr "%s n'aime pas ça."
-#: ../../include/conversation.php:1227
+#: ../../include/conversation.php:1160
#, php-format
msgid "<span %1$s>%2$d people</span> like this."
msgid_plural "<span %1$s>%2$d people</span> like this."
msgstr[0] "<span %1$s>%2$d personne</span> aime ceci."
msgstr[1] "<span %1$s>%2$d personnes</span> aiment ceci."
-#: ../../include/conversation.php:1229
+#: ../../include/conversation.php:1162
#, php-format
msgid "<span %1$s>%2$d people</span> don't like this."
msgid_plural "<span %1$s>%2$d people</span> don't like this."
msgstr[0] "<span %1$s>%2$d personne</span> n'aime pas ça."
msgstr[1] "<span %1$s>%2$d personnes</span> n'aiment pas ça."
-#: ../../include/conversation.php:1235
+#: ../../include/conversation.php:1168
msgid "and"
msgstr "et"
-#: ../../include/conversation.php:1238
+#: ../../include/conversation.php:1171
#, php-format
msgid ", and %d other people"
msgid_plural ", and %d other people"
msgstr[0] ", et %d autre personne"
msgstr[1] ", et %d autres personnes"
-#: ../../include/conversation.php:1239
+#: ../../include/conversation.php:1172
#, php-format
msgid "%s like this."
msgstr "%s aime ça."
-#: ../../include/conversation.php:1239
+#: ../../include/conversation.php:1172
#, php-format
msgid "%s don't like this."
msgstr "%s n'aime pas ça."
-#: ../../include/conversation.php:1282
+#: ../../include/conversation.php:1215
msgid "Set your location"
msgstr "Spécifier votre emplacement géographique"
-#: ../../include/conversation.php:1283
+#: ../../include/conversation.php:1216
msgid "Clear browser location"
msgstr "Supprimer l'emplacement géographique du navigateur"
-#: ../../include/conversation.php:1331
+#: ../../include/conversation.php:1264
msgid "Tag term:"
msgstr "Étiquette&nbsp;:"
-#: ../../include/conversation.php:1332
+#: ../../include/conversation.php:1265
msgid "Where are you right now?"
msgstr "Où êtes-vous en ce moment&nbsp;?"
-#: ../../include/conversation.php:1337
+#: ../../include/conversation.php:1270
msgid "Choose a different album..."
msgstr "Choisissez un autre album"
-#: ../../include/conversation.php:1341
+#: ../../include/conversation.php:1274
msgid "Comments enabled"
msgstr "Commentaires activés"
-#: ../../include/conversation.php:1342
+#: ../../include/conversation.php:1275
msgid "Comments disabled"
msgstr "Commentaires désactivés"
-#: ../../include/conversation.php:1380
+#: ../../include/conversation.php:1313
msgid "Page link name"
msgstr "Nom du lien vers la page"
-#: ../../include/conversation.php:1383
+#: ../../include/conversation.php:1316
msgid "Post as"
msgstr "Publier en tant que"
-#: ../../include/conversation.php:1397
+#: ../../include/conversation.php:1330
msgid "Toggle voting"
msgstr "(Dés)activer le vote"
-#: ../../include/conversation.php:1400
+#: ../../include/conversation.php:1333
msgid "Disable comments"
msgstr "Désactiver les commentaires"
-#: ../../include/conversation.php:1401
+#: ../../include/conversation.php:1334
msgid "Toggle comments"
msgstr "Basculer les commentaires"
-#: ../../include/conversation.php:1409
+#: ../../include/conversation.php:1342
msgid "Categories (optional, comma-separated list)"
msgstr "Catégories (facultatives, séparées par des virgules)"
-#: ../../include/conversation.php:1432
+#: ../../include/conversation.php:1365
msgid "Other networks and post services"
msgstr "Autres réseaux et services de messagerie"
-#: ../../include/conversation.php:1438
+#: ../../include/conversation.php:1371
msgid "Set publish date"
msgstr "Définir la date de publication"
-#: ../../include/conversation.php:1692
+#: ../../include/conversation.php:1625
msgid "Discover"
msgstr "À découvrir"
-#: ../../include/conversation.php:1695
+#: ../../include/conversation.php:1628
msgid "Imported public streams"
msgstr "Flux publics importés"
-#: ../../include/conversation.php:1700
+#: ../../include/conversation.php:1633
msgid "Commented Order"
msgstr "Par date de commentaire"
-#: ../../include/conversation.php:1703
+#: ../../include/conversation.php:1636
msgid "Sort by Comment Date"
msgstr "Trier par date de dernier commentaire"
-#: ../../include/conversation.php:1707
+#: ../../include/conversation.php:1640
msgid "Posted Order"
msgstr "Par date de publication"
-#: ../../include/conversation.php:1710
+#: ../../include/conversation.php:1643
msgid "Sort by Post Date"
msgstr "Trier par date de publication"
-#: ../../include/conversation.php:1718
+#: ../../include/conversation.php:1651
msgid "Posts that mention or involve you"
msgstr "Publications qui vous mentionnent ou vous concernent d'une manière ou d'une autre"
-#: ../../include/conversation.php:1727
+#: ../../include/conversation.php:1660
msgid "Activity Stream - by date"
msgstr "Flux d'activité - par date"
-#: ../../include/conversation.php:1733
+#: ../../include/conversation.php:1666
msgid "Starred"
msgstr "Avec étoile"
-#: ../../include/conversation.php:1736
+#: ../../include/conversation.php:1669
msgid "Favourite Posts"
msgstr "Publications préférées"
-#: ../../include/conversation.php:1743
+#: ../../include/conversation.php:1676
msgid "Spam"
msgstr "Indésirable"
-#: ../../include/conversation.php:1746
+#: ../../include/conversation.php:1679
msgid "Posts flagged as SPAM"
msgstr "Publications marquées comme indésirables"
-#: ../../include/conversation.php:1818
+#: ../../include/conversation.php:1754
msgid "Status Messages and Posts"
msgstr "Messages d'état et contributions"
-#: ../../include/conversation.php:1830
+#: ../../include/conversation.php:1767
msgid "Profile Details"
msgstr "Détails du profil"
-#: ../../include/conversation.php:1839 ../../include/photos.php:515
+#: ../../include/conversation.php:1777 ../../include/photos.php:527
msgid "Photo Albums"
msgstr "Albums photo"
-#: ../../include/conversation.php:1846
+#: ../../include/conversation.php:1785
msgid "Files and Storage"
msgstr "Fichiers et Stockage"
-#: ../../include/conversation.php:1866 ../../include/conversation.php:1869
-#: ../../include/widgets.php:902
-msgid "Chatrooms"
-msgstr "Salons de clavardage"
-
-#: ../../include/conversation.php:1879
+#: ../../include/conversation.php:1821
msgid "Bookmarks"
msgstr "Favoris"
-#: ../../include/conversation.php:1882
+#: ../../include/conversation.php:1824
msgid "Saved Bookmarks"
msgstr "Favoris sauvegardés"
-#: ../../include/conversation.php:1892
+#: ../../include/conversation.php:1835
msgid "View Webpages"
msgstr "Voir les pages web"
-#: ../../include/conversation.php:1958
+#: ../../include/conversation.php:1904
msgctxt "noun"
msgid "Attending"
msgid_plural "Attending"
msgstr[0] "Participe"
msgstr[1] "Participent"
-#: ../../include/conversation.php:1961
+#: ../../include/conversation.php:1907
msgctxt "noun"
msgid "Not Attending"
msgid_plural "Not Attending"
msgstr[0] "Ne participe pas"
msgstr[1] "Ne participent pas"
-#: ../../include/conversation.php:1964
+#: ../../include/conversation.php:1910
msgctxt "noun"
msgid "Undecided"
msgid_plural "Undecided"
msgstr[0] "Indécis(e)"
msgstr[1] "Indécis(es)"
-#: ../../include/conversation.php:1967
+#: ../../include/conversation.php:1913
msgctxt "noun"
msgid "Agree"
msgid_plural "Agrees"
msgstr[0] "D'accord"
msgstr[1] "D'accord"
-#: ../../include/conversation.php:1970
+#: ../../include/conversation.php:1916
msgctxt "noun"
msgid "Disagree"
msgid_plural "Disagrees"
msgstr[0] "Pas d'accord"
msgstr[1] "Pas d'accord"
-#: ../../include/conversation.php:1973
+#: ../../include/conversation.php:1919
msgctxt "noun"
msgid "Abstain"
msgid_plural "Abstains"
msgstr[0] "S'abstient"
msgstr[1] "S'abstiennent"
-#: ../../include/message.php:32
-msgid "Unable to determine sender."
-msgstr "Impossible de déterminer l'émetteur."
+#: ../../include/permissions.php:35
+msgid "Can view my normal stream and posts"
+msgstr "Peut voir les publications ordinaires sur mon canal."
-#: ../../include/message.php:69
-msgid "No recipient provided."
-msgstr "Pas de destinataire."
+#: ../../include/permissions.php:39
+msgid "Can view my webpages"
+msgstr "Peut voir mes pages web"
-#: ../../include/message.php:74
-msgid "[no subject]"
-msgstr "[sans objet]"
+#: ../../include/permissions.php:43
+msgid "Can post on my channel page (\"wall\")"
+msgstr "Peuvent poster sur la page de mon canal (\"mur\")"
-#: ../../include/message.php:225
-msgid "Stored post could not be verified."
-msgstr "Le message stocké n'a pas pu être vérifié."
+#: ../../include/permissions.php:46
+msgid "Can like/dislike stuff"
+msgstr "Peuvent aimer/ne pas aimer"
-#: ../../include/security.php:117
-msgid "guest:"
-msgstr "Visiteur"
+#: ../../include/permissions.php:46
+msgid "Profiles and things other than posts/comments"
+msgstr "Profils et autres excluant les publications/commentaires."
-#: ../../include/security.php:532
-msgid ""
-"The form security token was not correct. This probably happened because the "
-"form has been opened for too long (>3 hours) before submitting it."
-msgstr "Le formulaire n'est plus sécurisé, probablement parce qu'il est ouvert depuis trop longtemps (plus de 3 heures)."
+#: ../../include/permissions.php:48
+msgid "Can forward to all my channel contacts via post @mentions"
+msgstr "Peut faire suivre à tous les contacts de mon canal via \"@mention\""
-#: ../../include/widgets.php:103
-msgid "System"
-msgstr "Système"
+#: ../../include/permissions.php:48
+msgid "Advanced - useful for creating group forum channels"
+msgstr "Avancé - utile pour les canaux de type \"forum/groupe\""
-#: ../../include/widgets.php:106
-msgid "New App"
-msgstr "Nouvelle application"
+#: ../../include/permissions.php:49
+msgid "Can chat with me (when available)"
+msgstr "Peut discuter avec moi (quand disponibie)"
-#: ../../include/widgets.php:107
-msgid "Edit Apps"
-msgstr "Modifier les apps"
+#: ../../include/permissions.php:50
+msgid "Can write to my file storage and photos"
+msgstr "Peut charger des fichiers et des photos dans mon canal"
-#: ../../include/widgets.php:155
-msgid "Suggestions"
-msgstr "Suggestions"
+#: ../../include/permissions.php:51
+msgid "Can edit my webpages"
+msgstr "Peut modifier mes pages web"
-#: ../../include/widgets.php:156
-msgid "See more..."
-msgstr "Voir plus..."
+#: ../../include/permissions.php:53
+msgid "Somewhat advanced - very useful in open communities"
+msgstr "Plutôt avancé - très utile dans les communautés ouvertes"
-#: ../../include/widgets.php:176
-#, php-format
-msgid "You have %1$.0f of %2$.0f allowed connections."
-msgstr "Vous avez %1$.0f sur %2$.0f contacts autorisés."
+#: ../../include/permissions.php:55
+msgid "Can administer my channel resources"
+msgstr "Peut administrer les ressources de mon canal"
-#: ../../include/widgets.php:182
-msgid "Add New Connection"
-msgstr "Ajouter un nouveau contact"
+#: ../../include/permissions.php:55
+msgid ""
+"Extremely advanced. Leave this alone unless you know what you are doing"
+msgstr "Très avancé. Ne pas toucher, sauf si vous savez ce que vous faîtes"
-#: ../../include/widgets.php:183
-msgid "Enter channel address"
-msgstr "Saisissez l'adresse du canal"
+#: ../../include/dir_fns.php:141
+msgid "Directory Options"
+msgstr "Options d'annuaire"
-#: ../../include/widgets.php:184
-msgid "Examples: bob@example.com, https://example.com/barbara"
-msgstr "Exemples&nbsp;: pierre@exemple.com, https://exemple.com/sophie"
+#: ../../include/dir_fns.php:143
+msgid "Safe Mode"
+msgstr "Mode sûr"
-#: ../../include/widgets.php:200
-msgid "Notes"
-msgstr "Notes"
+#: ../../include/dir_fns.php:144
+msgid "Public Forums Only"
+msgstr "Les forums publics uniquement"
-#: ../../include/widgets.php:276
-msgid "Remove term"
-msgstr "Retirer le terme"
+#: ../../include/dir_fns.php:145
+msgid "This Website Only"
+msgstr "Ce site uniquement"
-#: ../../include/widgets.php:284 ../../include/features.php:301
-msgid "Saved Searches"
-msgstr "Recherches sauvegardées"
+#: ../../include/bookmarks.php:34
+#, php-format
+msgid "%1$s's bookmarks"
+msgstr "Favoris de %1$s"
-#: ../../include/widgets.php:285 ../../include/group.php:336
-msgid "add"
-msgstr "ajouter"
+#: ../../include/import.php:41
+msgid ""
+"Cannot create a duplicate channel identifier on this system. Import failed."
+msgstr "L'import a échoué. Un canal existe déjà avec ce nom"
-#: ../../include/widgets.php:347 ../../include/contact_widgets.php:53
-#: ../../include/features.php:390
-msgid "Saved Folders"
-msgstr "Dossiers sauvegardés"
+#: ../../include/import.php:105
+msgid "Cloned channel not found. Import failed."
+msgstr "Canal cloné non trouvé. Echec de l'import."
-#: ../../include/widgets.php:350 ../../include/widgets.php:472
-#: ../../include/contact_widgets.php:56 ../../include/contact_widgets.php:94
-msgid "Everything"
-msgstr "Tout"
+#: ../../include/text.php:478
+msgid "prev"
+msgstr "préc."
-#: ../../include/widgets.php:391
-msgid "Archives"
-msgstr "Archives"
+#: ../../include/text.php:480
+msgid "first"
+msgstr "premier"
-#: ../../include/widgets.php:563
-msgid "Refresh"
-msgstr "Actualiser"
+#: ../../include/text.php:509
+msgid "last"
+msgstr "dernier"
-#: ../../include/widgets.php:603
-msgid "Account settings"
-msgstr "Paramètres du compte"
+#: ../../include/text.php:512
+msgid "next"
+msgstr "Suivant"
-#: ../../include/widgets.php:609
-msgid "Channel settings"
-msgstr "Paramètres du canal"
+#: ../../include/text.php:523
+msgid "older"
+msgstr "plus ancien"
-#: ../../include/widgets.php:618
-msgid "Additional features"
-msgstr "Fonctionnalités supplémentaires"
+#: ../../include/text.php:525
+msgid "newer"
+msgstr "plus récent"
-#: ../../include/widgets.php:625
-msgid "Feature/Addon settings"
-msgstr "Paramètres des extensions/greffons"
+#: ../../include/text.php:945
+msgid "No connections"
+msgstr "Pas de relations."
-#: ../../include/widgets.php:631
-msgid "Display settings"
-msgstr "Paramètres d'affichage"
+#: ../../include/text.php:970
+#, php-format
+msgid "View all %s connections"
+msgstr "Voir les %s contacts"
-#: ../../include/widgets.php:638
-msgid "Manage locations"
-msgstr "Gérer les emplacements"
+#: ../../include/text.php:1115 ../../include/text.php:1120
+msgid "poke"
+msgstr "tapoter"
-#: ../../include/widgets.php:645
-msgid "Export channel"
-msgstr "Exporter le canal"
+#: ../../include/text.php:1121
+msgid "ping"
+msgstr "ping"
-#: ../../include/widgets.php:651
-msgid "Connected apps"
-msgstr "Applications connectées"
+#: ../../include/text.php:1121
+msgid "pinged"
+msgstr "pingé"
-#: ../../include/widgets.php:666 ../../include/features.php:153
-msgid "Permission Groups"
-msgstr "Groupes d'autorisation"
+#: ../../include/text.php:1122
+msgid "prod"
+msgstr "encourager"
-#: ../../include/widgets.php:683
-msgid "Premium Channel Settings"
-msgstr "Paramètres de canal VIP"
+#: ../../include/text.php:1122
+msgid "prodded"
+msgstr "encouragé"
-#: ../../include/widgets.php:712
-msgid "Private Mail Menu"
-msgstr "Menu des messages privés"
+#: ../../include/text.php:1123
+msgid "slap"
+msgstr "giffler"
-#: ../../include/widgets.php:714
-msgid "Combined View"
-msgstr "Vue combinée"
+#: ../../include/text.php:1123
+msgid "slapped"
+msgstr "gifflé(e)"
-#: ../../include/widgets.php:719 ../../include/nav.php:213
-msgid "Inbox"
-msgstr "Boîte de réception"
+#: ../../include/text.php:1124
+msgid "finger"
+msgstr "pointer"
-#: ../../include/widgets.php:724 ../../include/nav.php:214
-msgid "Outbox"
-msgstr "Boîte d'envoi"
+#: ../../include/text.php:1124
+msgid "fingered"
+msgstr "pointé"
-#: ../../include/widgets.php:729 ../../include/nav.php:215
-msgid "New Message"
-msgstr "Nouveau message"
+#: ../../include/text.php:1125
+msgid "rebuff"
+msgstr "rejetter"
-#: ../../include/widgets.php:746 ../../include/widgets.php:758
-msgid "Conversations"
-msgstr "Conversations"
+#: ../../include/text.php:1125
+msgid "rebuffed"
+msgstr "rejeté"
-#: ../../include/widgets.php:750
-msgid "Received Messages"
-msgstr "Messages reçus"
+#: ../../include/text.php:1137
+msgid "happy"
+msgstr "heureux"
-#: ../../include/widgets.php:754
-msgid "Sent Messages"
-msgstr "Messages envoyés"
+#: ../../include/text.php:1138
+msgid "sad"
+msgstr "triste"
-#: ../../include/widgets.php:768
-msgid "No messages."
-msgstr "Pas de message."
+#: ../../include/text.php:1139
+msgid "mellow"
+msgstr "mélancolique"
-#: ../../include/widgets.php:786
-msgid "Delete conversation"
-msgstr "Supprimer la conversation"
+#: ../../include/text.php:1140
+msgid "tired"
+msgstr "fatigué"
-#: ../../include/widgets.php:812
-msgid "Events Tools"
-msgstr "Outils Evènements"
+#: ../../include/text.php:1141
+msgid "perky"
+msgstr "impertinent"
-#: ../../include/widgets.php:813
-msgid "Export Calendar"
-msgstr "Exporter le calendrier"
+#: ../../include/text.php:1142
+msgid "angry"
+msgstr "en colère"
-#: ../../include/widgets.php:814
-msgid "Import Calendar"
-msgstr "Importer un calendrier"
+#: ../../include/text.php:1143
+msgid "stupefied"
+msgstr "stupéfait"
-#: ../../include/widgets.php:906
-msgid "Overview"
-msgstr "Aperçu"
+#: ../../include/text.php:1144
+msgid "puzzled"
+msgstr "perplexe"
-#: ../../include/widgets.php:913
-msgid "Chat Members"
-msgstr "Membres du salon de discussion"
+#: ../../include/text.php:1145
+msgid "interested"
+msgstr "intéressé"
-#: ../../include/widgets.php:991
-msgctxt "wiki_history"
-msgid "Message"
-msgstr "Message"
+#: ../../include/text.php:1146
+msgid "bitter"
+msgstr "amer"
-#: ../../include/widgets.php:1013
-msgid "Bookmarked Chatrooms"
-msgstr "Salons favoris"
+#: ../../include/text.php:1147
+msgid "cheerful"
+msgstr "plein d'entrain"
-#: ../../include/widgets.php:1044
-msgid "Suggested Chatrooms"
-msgstr "Salons suggérés"
+#: ../../include/text.php:1148
+msgid "alive"
+msgstr "vivant"
-#: ../../include/widgets.php:1189 ../../include/widgets.php:1301
-msgid "photo/image"
-msgstr "photo/image"
+#: ../../include/text.php:1149
+msgid "annoyed"
+msgstr "agaçé"
-#: ../../include/widgets.php:1244
-msgid "Click to show more"
-msgstr "Cliquer pour voir plus"
+#: ../../include/text.php:1150
+msgid "anxious"
+msgstr "anxieux"
-#: ../../include/widgets.php:1395
-msgid "Rating Tools"
-msgstr "Outils d'évaluation"
+#: ../../include/text.php:1151
+msgid "cranky"
+msgstr "énervé"
-#: ../../include/widgets.php:1399 ../../include/widgets.php:1401
-msgid "Rate Me"
-msgstr "M'évaluer"
+#: ../../include/text.php:1152
+msgid "disturbed"
+msgstr "perturbé"
-#: ../../include/widgets.php:1404
-msgid "View Ratings"
-msgstr "Voir mes évaluations"
+#: ../../include/text.php:1153
+msgid "frustrated"
+msgstr "frustré"
-#: ../../include/widgets.php:1497
-msgid "Forums"
-msgstr "Forums"
+#: ../../include/text.php:1154
+msgid "depressed"
+msgstr "déprimé"
-#: ../../include/widgets.php:1526
-msgid "Tasks"
-msgstr "Tâches"
+#: ../../include/text.php:1155
+msgid "motivated"
+msgstr "motivé"
-#: ../../include/widgets.php:1592 ../../include/widgets.php:1630
-msgid "Member registrations waiting for confirmation"
-msgstr "Inscriptions en attente d'approbation"
+#: ../../include/text.php:1156
+msgid "relaxed"
+msgstr "détendu"
-#: ../../include/widgets.php:1598
-msgid "Inspect queue"
-msgstr "Analyser la file d'attente"
+#: ../../include/text.php:1157
+msgid "surprised"
+msgstr "surpris"
-#: ../../include/widgets.php:1600
-msgid "DB updates"
-msgstr "Mises à jour BDD"
+#: ../../include/text.php:1330 ../../include/js_strings.php:70
+msgid "Monday"
+msgstr "Lundi"
-#: ../../include/widgets.php:1625 ../../include/nav.php:233
-msgid "Admin"
-msgstr "Administrateur"
+#: ../../include/text.php:1330 ../../include/js_strings.php:71
+msgid "Tuesday"
+msgstr "Mardi"
-#: ../../include/widgets.php:1626
-msgid "Plugin Features"
-msgstr "Fonctionnalités des greffons"
+#: ../../include/text.php:1330 ../../include/js_strings.php:72
+msgid "Wednesday"
+msgstr "Mercredi"
-#: ../../include/zot.php:652
-msgid "Invalid data packet"
-msgstr "Paquet de données invalide"
+#: ../../include/text.php:1330 ../../include/js_strings.php:73
+msgid "Thursday"
+msgstr "Jeudi"
-#: ../../include/zot.php:668
-msgid "Unable to verify channel signature"
-msgstr "Impossible de vérifier la signature du canal"
+#: ../../include/text.php:1330 ../../include/js_strings.php:74
+msgid "Friday"
+msgstr "Vendredi"
-#: ../../include/zot.php:2319
-#, php-format
-msgid "Unable to verify site signature for %s"
-msgstr "Impossible de vérifier la signature de site pour %s"
+#: ../../include/text.php:1330 ../../include/js_strings.php:75
+msgid "Saturday"
+msgstr "Samedi"
-#: ../../include/zot.php:3725
-msgid "invalid target signature"
-msgstr "signature de la cible invalide"
+#: ../../include/text.php:1330 ../../include/js_strings.php:69
+msgid "Sunday"
+msgstr "Dimanche"
-#: ../../include/channel.php:33
-msgid "Unable to obtain identity information from database"
-msgstr "Impossible d'obtenir les données d'identité depuis la base de données"
+#: ../../include/text.php:1334 ../../include/js_strings.php:45
+msgid "January"
+msgstr "Janvier"
-#: ../../include/channel.php:67
-msgid "Empty name"
-msgstr "Nom vide"
+#: ../../include/text.php:1334 ../../include/js_strings.php:46
+msgid "February"
+msgstr "Février"
-#: ../../include/channel.php:70
-msgid "Name too long"
-msgstr "Nom trop long"
+#: ../../include/text.php:1334 ../../include/js_strings.php:47
+msgid "March"
+msgstr "Mars"
-#: ../../include/channel.php:181
-msgid "No account identifier"
-msgstr "Pas d'identifiant de compte"
+#: ../../include/text.php:1334 ../../include/js_strings.php:48
+msgid "April"
+msgstr "Avril"
-#: ../../include/channel.php:193
-msgid "Nickname is required."
-msgstr "Un surnom est requis."
+#: ../../include/text.php:1334
+msgid "May"
+msgstr "Mai"
-#: ../../include/channel.php:207
-msgid "Reserved nickname. Please choose another."
-msgstr "Surnom réservé. Merci d'en choisir un autre."
+#: ../../include/text.php:1334 ../../include/js_strings.php:50
+msgid "June"
+msgstr "Juin"
-#: ../../include/channel.php:212
-msgid ""
-"Nickname has unsupported characters or is already being used on this site."
-msgstr "Le surnom contient des caractères interdits ou est déjà pris sur ce site."
+#: ../../include/text.php:1334 ../../include/js_strings.php:51
+msgid "July"
+msgstr "Juillet"
-#: ../../include/channel.php:272
-msgid "Unable to retrieve created identity"
-msgstr "Impossible de récupérer l'identité créée"
+#: ../../include/text.php:1334 ../../include/js_strings.php:52
+msgid "August"
+msgstr "Août"
-#: ../../include/channel.php:344
-msgid "Default Profile"
-msgstr "Profil par défaut"
+#: ../../include/text.php:1334 ../../include/js_strings.php:53
+msgid "September"
+msgstr "Septembre"
-#: ../../include/channel.php:1045
-msgid "Create New Profile"
-msgstr "Créer un nouveau profil"
+#: ../../include/text.php:1334 ../../include/js_strings.php:54
+msgid "October"
+msgstr "Octobre"
-#: ../../include/channel.php:1065
-msgid "Visible to everybody"
-msgstr "Visible de tous"
+#: ../../include/text.php:1334 ../../include/js_strings.php:55
+msgid "November"
+msgstr "Novembre"
-#: ../../include/channel.php:1138 ../../include/channel.php:1257
-msgid "Gender:"
-msgstr "Sexe&nbsp;:"
+#: ../../include/text.php:1334 ../../include/js_strings.php:56
+msgid "December"
+msgstr "Décembre"
-#: ../../include/channel.php:1140 ../../include/channel.php:1312
-msgid "Homepage:"
-msgstr "Site Internet&nbsp;:"
+#: ../../include/text.php:1411 ../../include/text.php:1415
+msgid "Unknown Attachment"
+msgstr "Pièce jointe inconnue"
-#: ../../include/channel.php:1141
-msgid "Online Now"
-msgstr "Connecté"
+#: ../../include/text.php:1417
+msgid "unknown"
+msgstr "Inconnu"
-#: ../../include/channel.php:1262
-msgid "Like this channel"
-msgstr "J'aime ce canal"
+#: ../../include/text.php:1453
+msgid "remove category"
+msgstr "supprimer la catégorie"
-#: ../../include/channel.php:1286
-msgid "j F, Y"
-msgstr "j F, Y"
+#: ../../include/text.php:1527
+msgid "remove from file"
+msgstr "retirer du fichier"
-#: ../../include/channel.php:1287
-msgid "j F"
-msgstr "j F"
+#: ../../include/text.php:1789 ../../include/language.php:367
+msgid "default"
+msgstr "défaut"
-#: ../../include/channel.php:1294
-msgid "Birthday:"
-msgstr "Date de naissance&nbsp;:"
+#: ../../include/text.php:1797
+msgid "Page layout"
+msgstr "Mise en page"
-#: ../../include/channel.php:1307
-#, php-format
-msgid "for %1$d %2$s"
-msgstr "depuis %1$d %2$s"
+#: ../../include/text.php:1797
+msgid "You can create your own with the layouts tool"
+msgstr "Créez les vôtres avec les outils de mise en page"
-#: ../../include/channel.php:1310
-msgid "Sexual Preference:"
-msgstr "Orientation sexuelle&nbsp;:"
+#: ../../include/text.php:1825
+msgid "Page content type"
+msgstr "Type de contenu de la page"
-#: ../../include/channel.php:1316
-msgid "Tags:"
-msgstr "Étiquettes&nbsp;:"
+#: ../../include/text.php:1958
+msgid "activity"
+msgstr "activité"
-#: ../../include/channel.php:1318
-msgid "Political Views:"
-msgstr "Opinions politiques&nbsp;:"
+#: ../../include/text.php:2272
+msgid "Design Tools"
+msgstr "Outils de conception"
-#: ../../include/channel.php:1320
-msgid "Religion:"
-msgstr "Religion&nbsp;:"
+#: ../../include/text.php:2278
+msgid "Pages"
+msgstr "Pages"
-#: ../../include/channel.php:1324
-msgid "Hobbies/Interests:"
-msgstr "Occupations/Centres d'intérêt&nbsp;:"
+#: ../../include/text.php:2300
+msgid "Import website..."
+msgstr "Importer le site web…"
-#: ../../include/channel.php:1326
-msgid "Likes:"
-msgstr "Aime&nbsp;:"
+#: ../../include/text.php:2301
+msgid "Select folder to import"
+msgstr "Sélectionner le dossier à importer"
-#: ../../include/channel.php:1328
-msgid "Dislikes:"
-msgstr "N'aime pas&nbsp;:"
+#: ../../include/text.php:2302
+msgid "Import from a zipped folder:"
+msgstr "Importer à partir d'un dossier zippé :"
-#: ../../include/channel.php:1330
-msgid "Contact information and Social Networks:"
-msgstr "Coordonnées et réseaux sociaux&nbsp;:"
+#: ../../include/text.php:2303
+msgid "Import from cloud files:"
+msgstr "Importer à partir de fichiers dans le cloud :"
-#: ../../include/channel.php:1332
-msgid "My other channels:"
-msgstr "Mes autres canaux&nbsp;:"
+#: ../../include/text.php:2304
+msgid "/cloud/channel/path/to/folder"
+msgstr "/cloud/channel/chemain/du/repertoire"
-#: ../../include/channel.php:1334
-msgid "Musical interests:"
-msgstr "Goûts musicaux&nbsp;:"
+#: ../../include/text.php:2305
+msgid "Enter path to website files"
+msgstr "Entrer le chemin vers les fichiers du site web"
-#: ../../include/channel.php:1336
-msgid "Books, literature:"
-msgstr "Lectures, goûts littéraires&nbsp;:"
+#: ../../include/text.php:2306
+msgid "Select folder"
+msgstr "Sélectionner un répertoire"
-#: ../../include/channel.php:1338
-msgid "Television:"
-msgstr "Télévision&nbsp;:"
+#: ../../include/text.php:2307
+msgid "Export website..."
+msgstr "Exporter le site web…"
-#: ../../include/channel.php:1340
-msgid "Film/dance/culture/entertainment:"
-msgstr "Cinéma/danse/culture/divertissement&nsbp;:"
+#: ../../include/text.php:2308
+msgid "Export to a zip file"
+msgstr "Exporter dans un fichier zip"
-#: ../../include/channel.php:1342
-msgid "Love/Romance:"
-msgstr "Vie sentimentale/amoureuse&nbsp;:"
+#: ../../include/text.php:2309
+msgid "website.zip"
+msgstr "website.zip"
-#: ../../include/channel.php:1344
-msgid "Work/employment:"
-msgstr "Travail/Occupation&nbsp;"
+#: ../../include/text.php:2310
+msgid "Enter a name for the zip file."
+msgstr "Entrer un nom pour le fichier zip."
-#: ../../include/channel.php:1346
-msgid "School/education:"
-msgstr "Études&nbsp;"
+#: ../../include/text.php:2311
+msgid "Export to cloud files"
+msgstr "Exporter dans des fichiers sur le cloud"
-#: ../../include/channel.php:1369
-msgid "Like this thing"
-msgstr "J'aime ceci"
+#: ../../include/text.php:2312
+msgid "/path/to/export/folder"
+msgstr "/chemin/vers/le/dossier/d'export"
-#: ../../include/page_widgets.php:7
-msgid "New Page"
-msgstr "Nouvelle page"
+#: ../../include/text.php:2313
+msgid "Enter a path to a cloud files destination."
+msgstr "Entrer le chemin vers le cloud de fichiers"
+
+#: ../../include/text.php:2314
+msgid "Specify folder"
+msgstr "Spécifier un répertoire"
#: ../../include/contact_widgets.php:11
#, php-format
@@ -12051,6 +11770,57 @@ msgstr[1] "%d contacts en commun"
msgid "show more"
msgstr "montrer plus"
+#: ../../include/markdown.php:444
+msgid "Attachments:"
+msgstr ""
+
+#: ../../include/markdown.php:538 ../../include/event.php:22
+#: ../../include/event.php:69
+msgid "l F d, Y \\@ g:i A"
+msgstr "l d F Y \\à G\\hi"
+
+#: ../../include/markdown.php:540
+msgid "$Projectname event notification:"
+msgstr ""
+
+#: ../../include/markdown.php:544 ../../include/event.php:30
+#: ../../include/event.php:73
+msgid "Starts:"
+msgstr "Début&nbsp;:"
+
+#: ../../include/markdown.php:552 ../../include/event.php:40
+#: ../../include/event.php:77
+msgid "Finishes:"
+msgstr "Fin&nbsp;:"
+
+#: ../../include/follow.php:26
+msgid "Channel is blocked on this site."
+msgstr "Ce canal est bloqué sur ce site."
+
+#: ../../include/follow.php:31
+msgid "Channel location missing."
+msgstr "Emplacement du canal introuvable."
+
+#: ../../include/follow.php:73
+msgid "Response from remote channel was incomplete."
+msgstr "La réponse du canal distant était incomplète."
+
+#: ../../include/follow.php:90
+msgid "Channel was deleted and no longer exists."
+msgstr "Le canal a été supprimé et n'existe plus."
+
+#: ../../include/follow.php:140 ../../include/follow.php:175
+msgid "Protocol disabled."
+msgstr "Protocole désactivé."
+
+#: ../../include/follow.php:163
+msgid "Channel discovery failed."
+msgstr "La tentative d'accéder au canal a échoué."
+
+#: ../../include/follow.php:202
+msgid "Cannot connect to yourself."
+msgstr "Ne peut pas se connecter à vous."
+
#: ../../include/js_strings.php:5
msgid "Delete this item?"
msgstr "Supprimer cet élément?"
@@ -12191,55 +11961,11 @@ msgstr " "
msgid "timeago.numbers"
msgstr "timeago.numbers"
-#: ../../include/js_strings.php:45 ../../include/text.php:1325
-msgid "January"
-msgstr "Janvier"
-
-#: ../../include/js_strings.php:46 ../../include/text.php:1325
-msgid "February"
-msgstr "Février"
-
-#: ../../include/js_strings.php:47 ../../include/text.php:1325
-msgid "March"
-msgstr "Mars"
-
-#: ../../include/js_strings.php:48 ../../include/text.php:1325
-msgid "April"
-msgstr "Avril"
-
#: ../../include/js_strings.php:49
msgctxt "long"
msgid "May"
msgstr "Mai"
-#: ../../include/js_strings.php:50 ../../include/text.php:1325
-msgid "June"
-msgstr "Juin"
-
-#: ../../include/js_strings.php:51 ../../include/text.php:1325
-msgid "July"
-msgstr "Juillet"
-
-#: ../../include/js_strings.php:52 ../../include/text.php:1325
-msgid "August"
-msgstr "Août"
-
-#: ../../include/js_strings.php:53 ../../include/text.php:1325
-msgid "September"
-msgstr "Septembre"
-
-#: ../../include/js_strings.php:54 ../../include/text.php:1325
-msgid "October"
-msgstr "Octobre"
-
-#: ../../include/js_strings.php:55 ../../include/text.php:1325
-msgid "November"
-msgstr "Novembre"
-
-#: ../../include/js_strings.php:56 ../../include/text.php:1325
-msgid "December"
-msgstr "Décembre"
-
#: ../../include/js_strings.php:57
msgid "Jan"
msgstr "Jan"
@@ -12289,34 +12015,6 @@ msgstr "Nov"
msgid "Dec"
msgstr "Dec"
-#: ../../include/js_strings.php:69 ../../include/text.php:1321
-msgid "Sunday"
-msgstr "Dimanche"
-
-#: ../../include/js_strings.php:70 ../../include/text.php:1321
-msgid "Monday"
-msgstr "Lundi"
-
-#: ../../include/js_strings.php:71 ../../include/text.php:1321
-msgid "Tuesday"
-msgstr "Mardi"
-
-#: ../../include/js_strings.php:72 ../../include/text.php:1321
-msgid "Wednesday"
-msgstr "Mercredi"
-
-#: ../../include/js_strings.php:73 ../../include/text.php:1321
-msgid "Thursday"
-msgstr "Jeudi"
-
-#: ../../include/js_strings.php:74 ../../include/text.php:1321
-msgid "Friday"
-msgstr "Vendredi"
-
-#: ../../include/js_strings.php:75 ../../include/text.php:1321
-msgid "Saturday"
-msgstr "Samedi"
-
#: ../../include/js_strings.php:76
msgid "Sun"
msgstr "Dim"
@@ -12370,651 +12068,450 @@ msgctxt "calendar"
msgid "All day"
msgstr "Toute la journée"
-#: ../../include/dir_fns.php:141
-msgid "Directory Options"
-msgstr "Options d'annuaire"
+#: ../../include/message.php:30
+msgid "Unable to determine sender."
+msgstr "Impossible de déterminer l'émetteur."
-#: ../../include/dir_fns.php:143
-msgid "Safe Mode"
-msgstr "Mode sûr"
+#: ../../include/message.php:67
+msgid "No recipient provided."
+msgstr "Pas de destinataire."
-#: ../../include/dir_fns.php:144
-msgid "Public Forums Only"
-msgstr "Les forums publics uniquement"
+#: ../../include/message.php:72
+msgid "[no subject]"
+msgstr "[sans objet]"
-#: ../../include/dir_fns.php:145
-msgid "This Website Only"
-msgstr "Ce site uniquement"
+#: ../../include/message.php:223
+msgid "Stored post could not be verified."
+msgstr "Le message stocké n'a pas pu être vérifié."
+
+#: ../../include/activities.php:41
+msgid " and "
+msgstr "et"
+
+#: ../../include/activities.php:49
+msgid "public profile"
+msgstr "profil public"
+
+#: ../../include/activities.php:58
+#, php-format
+msgid "%1$s changed %2$s to &ldquo;%3$s&rdquo;"
+msgstr "%1$s a changé %2$s en &ldquo;%3$s&rdquo;"
+
+#: ../../include/activities.php:59
+#, php-format
+msgid "Visit %1$s's %2$s"
+msgstr "Visiter %2$s de %1$s"
-#: ../../include/attach.php:250 ../../include/attach.php:338
+#: ../../include/activities.php:62
+#, php-format
+msgid "%1$s has an updated %2$s, changing %3$s."
+msgstr "%1$s a mis à jour %2$s, modifiant %3$s."
+
+#: ../../include/attach.php:250 ../../include/attach.php:339
msgid "Item was not found."
msgstr "Élément introuvable."
-#: ../../include/attach.php:499
+#: ../../include/attach.php:500
msgid "No source file."
msgstr "Pas de fichier source."
-#: ../../include/attach.php:521
+#: ../../include/attach.php:522
msgid "Cannot locate file to replace"
msgstr "Impossible de trouver le fichier à remplacer."
-#: ../../include/attach.php:539
+#: ../../include/attach.php:540
msgid "Cannot locate file to revise/update"
msgstr "Impossible de trouver le fichier à corriger/mettre à jour"
-#: ../../include/attach.php:670
+#: ../../include/attach.php:671
#, php-format
msgid "File exceeds size limit of %d"
msgstr "Le fichier dépasse la taille limite de %d"
-#: ../../include/attach.php:684
+#: ../../include/attach.php:685
#, php-format
msgid "You have reached your limit of %1$.0f Mbytes attachment storage."
msgstr "Vous avez atteint votre limite de %1$.0f méga-octets autorisés pour le stockage des pièces-jointes."
-#: ../../include/attach.php:854
+#: ../../include/attach.php:855
msgid "File upload failed. Possible system limit or action terminated."
msgstr "Envoi du fichier impossible. Limite système ou action avortée."
-#: ../../include/attach.php:867
+#: ../../include/attach.php:868
msgid "Stored file could not be verified. Upload failed."
msgstr "Le fichier stocké n'a pu être vérifié. Echec de l'envoi."
-#: ../../include/attach.php:922 ../../include/attach.php:938
+#: ../../include/attach.php:923 ../../include/attach.php:939
msgid "Path not available."
msgstr "Chemin non disponible."
-#: ../../include/attach.php:984 ../../include/attach.php:1142
+#: ../../include/attach.php:988 ../../include/attach.php:1153
msgid "Empty pathname"
msgstr "Chemin vide"
-#: ../../include/attach.php:1010
+#: ../../include/attach.php:1014
msgid "duplicate filename or path"
msgstr "doublon de chemin ou de fichier"
-#: ../../include/attach.php:1032
+#: ../../include/attach.php:1039
msgid "Path not found."
msgstr "Chemin introuvable."
-#: ../../include/attach.php:1096
+#: ../../include/attach.php:1107
msgid "mkdir failed."
msgstr "mkdir a échoué."
-#: ../../include/attach.php:1100
+#: ../../include/attach.php:1111
msgid "database storage failed."
msgstr "l'écriture dans la base de données a échoué."
-#: ../../include/attach.php:1148
+#: ../../include/attach.php:1159
msgid "Empty path"
msgstr "Chemin vide"
-#: ../../include/network.php:733
-msgid "view full size"
-msgstr "voir en taille réelle"
-
-#: ../../include/network.php:1988
-msgid "No Subject"
-msgstr "Pas d'objet"
-
-#: ../../include/network.php:2244
-msgid "OStatus"
-msgstr "OStatus"
-
-#: ../../include/network.php:2245
-msgid "GNU-Social"
-msgstr "GNU-Social"
-
-#: ../../include/network.php:2246
-msgid "RSS/Atom"
-msgstr "RSS/Atom"
-
-#: ../../include/network.php:2249
-msgid "Facebook"
-msgstr "Facebook"
-
-#: ../../include/network.php:2250
-msgid "Zot"
-msgstr "Zot"
-
-#: ../../include/network.php:2251
-msgid "LinkedIn"
-msgstr "Linkedin"
-
-#: ../../include/network.php:2252
-msgid "XMPP/IM"
-msgstr "XMPP/IM"
-
-#: ../../include/network.php:2253
-msgid "MySpace"
-msgstr "MySpace"
-
-#: ../../include/oembed.php:308
-msgid " by "
-msgstr "par"
-
-#: ../../include/oembed.php:309
-msgid " on "
-msgstr "sur"
+#: ../../include/security.php:117
+msgid "guest:"
+msgstr "Visiteur"
-#: ../../include/oembed.php:338
-msgid "Embedded content"
-msgstr "Contenu imbriqué"
+#: ../../include/security.php:532
+msgid ""
+"The form security token was not correct. This probably happened because the "
+"form has been opened for too long (>3 hours) before submitting it."
+msgstr "Le formulaire n'est plus sécurisé, probablement parce qu'il est ouvert depuis trop longtemps (plus de 3 heures)."
-#: ../../include/oembed.php:347
-msgid "Embedding disabled"
-msgstr "Imbrication désactivée"
+#: ../../include/items.php:846 ../../include/items.php:893
+msgid "(Unknown)"
+msgstr "(Inconnu)"
-#: ../../include/photos.php:115
-#, php-format
-msgid "Image exceeds website size limit of %lu bytes"
-msgstr "L'image dépasse la taille limite de %lu octets"
+#: ../../include/items.php:1094
+msgid "Visible to anybody on the internet."
+msgstr "Visible pour tout le monde sur internet."
-#: ../../include/photos.php:122
-msgid "Image file is empty."
-msgstr "L'image est vide."
+#: ../../include/items.php:1096
+msgid "Visible to you only."
+msgstr "Visible pour vous seulement."
-#: ../../include/photos.php:260
-msgid "Photo storage failed."
-msgstr "Le stockage de l'image a échoué."
+#: ../../include/items.php:1098
+msgid "Visible to anybody in this network."
+msgstr "Visible pour tout le monde sur ce réseau."
-#: ../../include/photos.php:300
-msgid "a new photo"
-msgstr "une nouvelle photo"
+#: ../../include/items.php:1100
+msgid "Visible to anybody authenticated."
+msgstr "Visible aux utilisateurs authentifiés."
-#: ../../include/photos.php:304
+#: ../../include/items.php:1102
#, php-format
-msgctxt "photo_upload"
-msgid "%1$s posted %2$s to %3$s"
-msgstr "%1$s a publié %2$s pour %3$s"
-
-#: ../../include/photos.php:519
-msgid "Upload New Photos"
-msgstr "Ajouter des photos"
-
-#: ../../include/text.php:460
-msgid "prev"
-msgstr "préc."
-
-#: ../../include/text.php:462
-msgid "first"
-msgstr "premier"
-
-#: ../../include/text.php:491
-msgid "last"
-msgstr "dernier"
+msgid "Visible to anybody on %s."
+msgstr "Visible pour tous sur %s."
-#: ../../include/text.php:494
-msgid "next"
-msgstr "Suivant"
+#: ../../include/items.php:1104
+msgid "Visible to all connections."
+msgstr "Visible pour tous les contacts."
-#: ../../include/text.php:505
-msgid "older"
-msgstr "plus ancien"
+#: ../../include/items.php:1106
+msgid "Visible to approved connections."
+msgstr "Visible aux contacts approuvés."
-#: ../../include/text.php:507
-msgid "newer"
-msgstr "plus récent"
+#: ../../include/items.php:1108
+msgid "Visible to specific connections."
+msgstr "Visible pour certains contacts."
-#: ../../include/text.php:922
-msgid "No connections"
-msgstr "Pas de relations."
+#: ../../include/items.php:3925
+msgid "Privacy group is empty."
+msgstr "Groupe de contacts vide."
-#: ../../include/text.php:947
+#: ../../include/items.php:3932
#, php-format
-msgid "View all %s connections"
-msgstr "Voir les %s contacts"
-
-#: ../../include/text.php:1092 ../../include/text.php:1097
-msgid "poke"
-msgstr "tapoter"
-
-#: ../../include/text.php:1098
-msgid "ping"
-msgstr "ping"
-
-#: ../../include/text.php:1098
-msgid "pinged"
-msgstr "pingé"
-
-#: ../../include/text.php:1099
-msgid "prod"
-msgstr "encourager"
-
-#: ../../include/text.php:1099
-msgid "prodded"
-msgstr "encouragé"
-
-#: ../../include/text.php:1100
-msgid "slap"
-msgstr "giffler"
-
-#: ../../include/text.php:1100
-msgid "slapped"
-msgstr "gifflé(e)"
-
-#: ../../include/text.php:1101
-msgid "finger"
-msgstr "pointer"
-
-#: ../../include/text.php:1101
-msgid "fingered"
-msgstr "pointé"
-
-#: ../../include/text.php:1102
-msgid "rebuff"
-msgstr "rejetter"
-
-#: ../../include/text.php:1102
-msgid "rebuffed"
-msgstr "rejeté"
-
-#: ../../include/text.php:1114
-msgid "happy"
-msgstr "heureux"
-
-#: ../../include/text.php:1115
-msgid "sad"
-msgstr "triste"
-
-#: ../../include/text.php:1116
-msgid "mellow"
-msgstr "mélancolique"
-
-#: ../../include/text.php:1117
-msgid "tired"
-msgstr "fatigué"
-
-#: ../../include/text.php:1118
-msgid "perky"
-msgstr "impertinent"
-
-#: ../../include/text.php:1119
-msgid "angry"
-msgstr "en colère"
-
-#: ../../include/text.php:1120
-msgid "stupefied"
-msgstr "stupéfait"
-
-#: ../../include/text.php:1121
-msgid "puzzled"
-msgstr "perplexe"
-
-#: ../../include/text.php:1122
-msgid "interested"
-msgstr "intéressé"
-
-#: ../../include/text.php:1123
-msgid "bitter"
-msgstr "amer"
-
-#: ../../include/text.php:1124
-msgid "cheerful"
-msgstr "plein d'entrain"
-
-#: ../../include/text.php:1125
-msgid "alive"
-msgstr "vivant"
-
-#: ../../include/text.php:1126
-msgid "annoyed"
-msgstr "agaçé"
-
-#: ../../include/text.php:1127
-msgid "anxious"
-msgstr "anxieux"
-
-#: ../../include/text.php:1128
-msgid "cranky"
-msgstr "énervé"
-
-#: ../../include/text.php:1129
-msgid "disturbed"
-msgstr "perturbé"
-
-#: ../../include/text.php:1130
-msgid "frustrated"
-msgstr "frustré"
-
-#: ../../include/text.php:1131
-msgid "depressed"
-msgstr "déprimé"
-
-#: ../../include/text.php:1132
-msgid "motivated"
-msgstr "motivé"
+msgid "Privacy group: %s"
+msgstr "Groupe de contacts&nbsp;: %s"
-#: ../../include/text.php:1133
-msgid "relaxed"
-msgstr "détendu"
+#: ../../include/items.php:3944
+msgid "Connection not found."
+msgstr "Contact non trouvé."
-#: ../../include/text.php:1134
-msgid "surprised"
-msgstr "surpris"
+#: ../../include/items.php:4293
+msgid "profile photo"
+msgstr "photo de profil"
-#: ../../include/text.php:1325
-msgid "May"
-msgstr "Mai"
+#: ../../include/items.php:4489
+#, php-format
+msgid "[Edited %s]"
+msgstr "[%s édité]"
-#: ../../include/text.php:1402 ../../include/text.php:1406
-msgid "Unknown Attachment"
-msgstr "Pièce jointe inconnue"
+#: ../../include/items.php:4489
+msgctxt "edit_activity"
+msgid "Post"
+msgstr "Publier"
-#: ../../include/text.php:1408
-msgid "unknown"
-msgstr "Inconnu"
+#: ../../include/items.php:4489
+msgctxt "edit_activity"
+msgid "Comment"
+msgstr "Commenter"
-#: ../../include/text.php:1444
-msgid "remove category"
-msgstr "supprimer la catégorie"
+#: ../../include/channel.php:33
+msgid "Unable to obtain identity information from database"
+msgstr "Impossible d'obtenir les données d'identité depuis la base de données"
-#: ../../include/text.php:1521
-msgid "remove from file"
-msgstr "retirer du fichier"
+#: ../../include/channel.php:67
+msgid "Empty name"
+msgstr "Nom vide"
-#: ../../include/text.php:1791
-msgid "Page layout"
-msgstr "Mise en page"
+#: ../../include/channel.php:70
+msgid "Name too long"
+msgstr "Nom trop long"
-#: ../../include/text.php:1791
-msgid "You can create your own with the layouts tool"
-msgstr "Créez les vôtres avec les outils de mise en page"
+#: ../../include/channel.php:181
+msgid "No account identifier"
+msgstr "Pas d'identifiant de compte"
-#: ../../include/text.php:1833
-msgid "Page content type"
-msgstr "Type de contenu de la page"
+#: ../../include/channel.php:193
+msgid "Nickname is required."
+msgstr "Un surnom est requis."
-#: ../../include/text.php:1966
-msgid "activity"
-msgstr "activité"
+#: ../../include/channel.php:207
+msgid "Reserved nickname. Please choose another."
+msgstr "Surnom réservé. Merci d'en choisir un autre."
-#: ../../include/text.php:2280
-msgid "Design Tools"
-msgstr "Outils de conception"
+#: ../../include/channel.php:212
+msgid ""
+"Nickname has unsupported characters or is already being used on this site."
+msgstr "Le surnom contient des caractères interdits ou est déjà pris sur ce site."
-#: ../../include/text.php:2286
-msgid "Pages"
-msgstr "Pages"
+#: ../../include/channel.php:270
+msgid "Unable to retrieve created identity"
+msgstr "Impossible de récupérer l'identité créée"
-#: ../../include/text.php:2308
-msgid "Import website..."
-msgstr "Importer le site web…"
+#: ../../include/channel.php:342
+msgid "Default Profile"
+msgstr "Profil par défaut"
-#: ../../include/text.php:2309
-msgid "Select folder to import"
-msgstr "Sélectionner le dossier à importer"
+#: ../../include/channel.php:1043
+msgid "Create New Profile"
+msgstr "Créer un nouveau profil"
-#: ../../include/text.php:2310
-msgid "Import from a zipped folder:"
-msgstr "Importer à partir d'un dossier zippé :"
+#: ../../include/channel.php:1063
+msgid "Visible to everybody"
+msgstr "Visible de tous"
-#: ../../include/text.php:2311
-msgid "Import from cloud files:"
-msgstr "Importer à partir de fichiers dans le cloud :"
+#: ../../include/channel.php:1136 ../../include/channel.php:1250
+msgid "Gender:"
+msgstr "Sexe&nbsp;:"
-#: ../../include/text.php:2312
-msgid "/cloud/channel/path/to/folder"
-msgstr "/cloud/channel/chemain/du/repertoire"
+#: ../../include/channel.php:1138 ../../include/channel.php:1305
+msgid "Homepage:"
+msgstr "Site Internet&nbsp;:"
-#: ../../include/text.php:2313
-msgid "Enter path to website files"
-msgstr "Entrer le chemin vers les fichiers du site web"
+#: ../../include/channel.php:1139
+msgid "Online Now"
+msgstr "Connecté"
-#: ../../include/text.php:2314
-msgid "Select folder"
-msgstr "Sélectionner un répertoire"
+#: ../../include/channel.php:1255
+msgid "Like this channel"
+msgstr "J'aime ce canal"
-#: ../../include/text.php:2315
-msgid "Export website..."
-msgstr "Exporter le site web…"
+#: ../../include/channel.php:1279
+msgid "j F, Y"
+msgstr "j F, Y"
-#: ../../include/text.php:2316
-msgid "Export to a zip file"
-msgstr "Exporter dans un fichier zip"
+#: ../../include/channel.php:1280
+msgid "j F"
+msgstr "j F"
-#: ../../include/text.php:2317
-msgid "website.zip"
-msgstr "website.zip"
+#: ../../include/channel.php:1287
+msgid "Birthday:"
+msgstr "Date de naissance&nbsp;:"
-#: ../../include/text.php:2318
-msgid "Enter a name for the zip file."
-msgstr "Entrer un nom pour le fichier zip."
+#: ../../include/channel.php:1300
+#, php-format
+msgid "for %1$d %2$s"
+msgstr "depuis %1$d %2$s"
-#: ../../include/text.php:2319
-msgid "Export to cloud files"
-msgstr "Exporter dans des fichiers sur le cloud"
+#: ../../include/channel.php:1303
+msgid "Sexual Preference:"
+msgstr "Orientation sexuelle&nbsp;:"
-#: ../../include/text.php:2320
-msgid "/path/to/export/folder"
-msgstr "/chemin/vers/le/dossier/d'export"
+#: ../../include/channel.php:1309
+msgid "Tags:"
+msgstr "Étiquettes&nbsp;:"
-#: ../../include/text.php:2321
-msgid "Enter a path to a cloud files destination."
-msgstr "Entrer le chemin vers le cloud de fichiers"
+#: ../../include/channel.php:1311
+msgid "Political Views:"
+msgstr "Opinions politiques&nbsp;:"
-#: ../../include/text.php:2322
-msgid "Specify folder"
-msgstr "Spécifier un répertoire"
+#: ../../include/channel.php:1313
+msgid "Religion:"
+msgstr "Religion&nbsp;:"
-#: ../../include/nav.php:88
-msgid "Remote authentication"
-msgstr "Authentification distante"
+#: ../../include/channel.php:1317
+msgid "Hobbies/Interests:"
+msgstr "Occupations/Centres d'intérêt&nbsp;:"
-#: ../../include/nav.php:88
-msgid "Click to authenticate to your home hub"
-msgstr "S'authentifier auprès de votre hub principal"
+#: ../../include/channel.php:1319
+msgid "Likes:"
+msgstr "Aime&nbsp;:"
-#: ../../include/nav.php:99 ../../include/nav.php:140 ../../boot.php:1731
-msgid "Logout"
-msgstr "Déconnexion"
+#: ../../include/channel.php:1321
+msgid "Dislikes:"
+msgstr "N'aime pas&nbsp;:"
-#: ../../include/nav.php:99 ../../include/nav.php:140
-msgid "End this session"
-msgstr "Mettre fin à la session"
+#: ../../include/channel.php:1323
+msgid "Contact information and Social Networks:"
+msgstr "Coordonnées et réseaux sociaux&nbsp;:"
-#: ../../include/nav.php:103
-msgid "Your profile page"
-msgstr "Votre profil"
+#: ../../include/channel.php:1325
+msgid "My other channels:"
+msgstr "Mes autres canaux&nbsp;:"
-#: ../../include/nav.php:105
-msgid "Manage/Edit profiles"
-msgstr "Gérer/modifier vos profils"
+#: ../../include/channel.php:1327
+msgid "Musical interests:"
+msgstr "Goûts musicaux&nbsp;:"
-#: ../../include/nav.php:107
-msgid "Edit your profile"
-msgstr "Modifier votre profil"
+#: ../../include/channel.php:1329
+msgid "Books, literature:"
+msgstr "Lectures, goûts littéraires&nbsp;:"
-#: ../../include/nav.php:130
-msgid "Sign in"
-msgstr "Connexion"
+#: ../../include/channel.php:1331
+msgid "Television:"
+msgstr "Télévision&nbsp;:"
-#: ../../include/nav.php:155
-msgid "Get me home"
-msgstr "Rentrer chez moi"
+#: ../../include/channel.php:1333
+msgid "Film/dance/culture/entertainment:"
+msgstr "Cinéma/danse/culture/divertissement&nsbp;:"
-#: ../../include/nav.php:157
-msgid "Log me out of this site"
-msgstr "Déconnectez-moi de ce site"
+#: ../../include/channel.php:1335
+msgid "Love/Romance:"
+msgstr "Vie sentimentale/amoureuse&nbsp;:"
-#: ../../include/nav.php:162
-msgid "Create an account"
-msgstr "Créer un compte"
+#: ../../include/channel.php:1337
+msgid "Work/employment:"
+msgstr "Travail/Occupation&nbsp;"
-#: ../../include/nav.php:174
-msgid "Help and documentation"
-msgstr "Aide et documentation"
+#: ../../include/channel.php:1339
+msgid "School/education:"
+msgstr "Études&nbsp;"
-#: ../../include/nav.php:178
-msgid "Applications, utilities, links, games"
-msgstr "Applications, utilitaires, liens, jeux"
+#: ../../include/channel.php:1362
+msgid "Like this thing"
+msgstr "J'aime ceci"
-#: ../../include/nav.php:180
-msgid "Search site @name, #tag, ?docs, content"
-msgstr "Recherche @nom, #tag, contenu"
+#: ../../include/channel.php:2135
+#, php-format
+msgid "User '%s' deleted"
+msgstr "Utilisateur '%s' supprimé"
-#: ../../include/nav.php:182
-msgid "Channel Directory"
-msgstr "Annuaire des canaux"
+#: ../../include/event.php:1004
+msgid "This event has been added to your calendar."
+msgstr "Cet évènement a été ajouté dans votre calendrier."
-#: ../../include/nav.php:194
-msgid "Your grid"
-msgstr "Votre réseau"
+#: ../../include/event.php:1204
+msgid "Not specified"
+msgstr "Non spécifié"
-#: ../../include/nav.php:195
-msgid "View your network/grid"
-msgstr "Voir votre réseau"
+#: ../../include/event.php:1205
+msgid "Needs Action"
+msgstr "Besoin d'une action"
-#: ../../include/nav.php:196
-msgid "Mark all grid notifications seen"
-msgstr "Marquer toutes les notifications du réseau comme vues"
+#: ../../include/event.php:1206
+msgid "Completed"
+msgstr "Terminé"
-#: ../../include/nav.php:198
-msgid "Channel home"
-msgstr "Mon canal"
+#: ../../include/event.php:1207
+msgid "In Process"
+msgstr "En cours"
-#: ../../include/nav.php:199
-msgid "View your channel home"
-msgstr "Voir la page d'accueil de votre canal"
+#: ../../include/event.php:1208
+msgid "Cancelled"
+msgstr "Annulé"
-#: ../../include/nav.php:200
-msgid "Mark all channel notifications seen"
-msgstr "Marquer toutes les notifications du canal comme vues"
+#: ../../include/network.php:756
+msgid "view full size"
+msgstr "voir en taille réelle"
-#: ../../include/nav.php:206
-msgid "Notices"
-msgstr "Notifications"
+#: ../../include/network.php:2011
+msgid "No Subject"
+msgstr "Pas d'objet"
-#: ../../include/nav.php:206
-msgid "Notifications"
-msgstr "Notifications"
+#: ../../include/network.php:2265 ../../include/network.php:2266
+msgid "Friendica"
+msgstr "Friendica"
-#: ../../include/nav.php:207
-msgid "View all notifications"
-msgstr "Voir toutes les notifications"
+#: ../../include/network.php:2267
+msgid "OStatus"
+msgstr "OStatus"
-#: ../../include/nav.php:210
-msgid "Private mail"
-msgstr "Messages privés"
+#: ../../include/network.php:2268
+msgid "GNU-Social"
+msgstr "GNU-Social"
-#: ../../include/nav.php:211
-msgid "View your private messages"
-msgstr "Voir vos messages privés"
+#: ../../include/network.php:2269
+msgid "RSS/Atom"
+msgstr "RSS/Atom"
-#: ../../include/nav.php:212
-msgid "Mark all private messages seen"
-msgstr "Marquer tous les messages privés comme vus"
+#: ../../include/network.php:2271
+msgid "Diaspora"
+msgstr "Diaspora"
-#: ../../include/nav.php:218
-msgid "Event Calendar"
-msgstr "Calendrier des événements"
+#: ../../include/network.php:2272
+msgid "Facebook"
+msgstr "Facebook"
-#: ../../include/nav.php:219
-msgid "View events"
-msgstr "Voir les événements"
+#: ../../include/network.php:2273
+msgid "Zot"
+msgstr "Zot"
-#: ../../include/nav.php:220
-msgid "Mark all events seen"
-msgstr "Marquer tous les événements comme vus"
+#: ../../include/network.php:2274
+msgid "LinkedIn"
+msgstr "Linkedin"
-#: ../../include/nav.php:223
-msgid "Manage Your Channels"
-msgstr "Gérer vos canaux"
+#: ../../include/network.php:2275
+msgid "XMPP/IM"
+msgstr "XMPP/IM"
-#: ../../include/nav.php:225
-msgid "Account/Channel Settings"
-msgstr "Paramètres du Compte/Canal"
+#: ../../include/network.php:2276
+msgid "MySpace"
+msgstr "MySpace"
-#: ../../include/nav.php:233
-msgid "Site Setup and Configuration"
-msgstr "Configuration du site"
+#: ../../include/page_widgets.php:7
+msgid "New Page"
+msgstr "Nouvelle page"
-#: ../../include/nav.php:288
-msgid "Documentation"
-msgstr "Documentation"
+#: ../../include/language.php:380
+msgid "Select an alternate language"
+msgstr "Choisir une langue alternative"
-#: ../../include/nav.php:297
-msgid "@name, #tag, ?doc, content"
-msgstr "@nom, #étiquette, ?doc, contenu"
+#: ../../include/acl_selectors.php:208
+msgid "Who can see this?"
+msgstr "Qui peut voir cela"
-#: ../../include/nav.php:298
-msgid "Please wait..."
-msgstr "Merci de patienter..."
+#: ../../include/acl_selectors.php:209
+msgid "Custom selection"
+msgstr "Sélection personnalisée"
-#: ../../include/import.php:30
+#: ../../include/acl_selectors.php:210
msgid ""
-"Cannot create a duplicate channel identifier on this system. Import failed."
-msgstr "L'import a échoué. Un canal existe déjà avec ce nom"
-
-#: ../../include/import.php:90
-msgid "Channel clone failed. Import failed."
-msgstr "Echec du clonage du canal. Echec de l'impot."
-
-#: ../../include/import.php:100
-msgid "Cloned channel not found. Import failed."
-msgstr "Canal cloné non trouvé. Echec de l'import."
-
-#: ../../include/import.php:1373
-msgid "Unable to import element \""
-msgstr "Impossible d'importer l'élément \""
-
-#: ../../include/auth.php:148
-msgid "Logged out."
-msgstr "Deconnecté."
-
-#: ../../include/auth.php:275
-msgid "Failed authentication"
-msgstr "Échec de l'authentification"
-
-#: ../../include/follow.php:26
-msgid "Channel is blocked on this site."
-msgstr "Ce canal est bloqué sur ce site."
-
-#: ../../include/follow.php:31
-msgid "Channel location missing."
-msgstr "Emplacement du canal introuvable."
-
-#: ../../include/follow.php:73
-msgid "Response from remote channel was incomplete."
-msgstr "La réponse du canal distant était incomplète."
-
-#: ../../include/follow.php:90
-msgid "Channel was deleted and no longer exists."
-msgstr "Le canal a été supprimé et n'existe plus."
-
-#: ../../include/follow.php:140 ../../include/follow.php:175
-msgid "Protocol disabled."
-msgstr "Protocole désactivé."
-
-#: ../../include/follow.php:163
-msgid "Channel discovery failed."
-msgstr "La tentative d'accéder au canal a échoué."
-
-#: ../../include/follow.php:202
-msgid "Cannot connect to yourself."
-msgstr "Ne peut pas se connecter à vous."
-
-#: ../../include/activities.php:41
-msgid " and "
-msgstr "et"
+"Select \"Show\" to allow viewing. \"Don't show\" lets you override and limit"
+" the scope of \"Show\"."
+msgstr "Sélectionnez \"Afficher\" pour permettre l'affichage. \"Ne pas afficher\" vous permet de remplacer et de limiter la portée de \"Afficher\"."
-#: ../../include/activities.php:49
-msgid "public profile"
-msgstr "profil public"
+#: ../../include/acl_selectors.php:211
+msgid "Show"
+msgstr "Montrer"
-#: ../../include/activities.php:58
-#, php-format
-msgid "%1$s changed %2$s to &ldquo;%3$s&rdquo;"
-msgstr "%1$s a changé %2$s en &ldquo;%3$s&rdquo;"
+#: ../../include/acl_selectors.php:212
+msgid "Don't show"
+msgstr "Cacher"
-#: ../../include/activities.php:59
+#: ../../include/acl_selectors.php:245
#, php-format
-msgid "Visit %1$s's %2$s"
-msgstr "Visiter %2$s de %1$s"
+msgid ""
+"Post permissions %s cannot be changed %s after a post is shared.</br />These"
+" permissions set who is allowed to view the post."
+msgstr "Les autorisations d'accès d'un message %s ne peuvent pas être modifiées %s une fois le message envoyé. Ces autorisations définissent qui est autorisé à afficher le message."
-#: ../../include/activities.php:62
+#: ../../include/dba/dba_driver.php:189
#, php-format
-msgid "%1$s has an updated %2$s, changing %3$s."
-msgstr "%1$s a mis à jour %2$s, modifiant %3$s."
+msgid "Cannot locate DNS info for database server '%s'"
+msgstr "Impossible de trouver les infos DNS du serveur de BDD '%s'"
#: ../../include/bbcode.php:134 ../../include/bbcode.php:1040
#: ../../include/bbcode.php:1043 ../../include/bbcode.php:1048
@@ -13059,187 +12556,21 @@ msgstr "spoiler"
msgid "$1 wrote:"
msgstr "$1 a écrit&nbsp;:"
-#: ../../include/bookmarks.php:34
-#, php-format
-msgid "%1$s's bookmarks"
-msgstr "Favoris de %1$s"
-
-#: ../../include/group.php:26
-msgid ""
-"A deleted group with this name was revived. Existing item permissions "
-"<strong>may</strong> apply to this group and any future members. If this is "
-"not what you intended, please create another group with a different name."
-msgstr "Un groupe supprimé portant ce nom a été ressuscité. Les permissions liées aux éléments existants <strong>peuvent</strong> s'appliquer au groupe et aux membres futurs. Si ce n'est pas ce que vous attendiez, merci de créer un autre groupe avec un nom différent."
-
-#: ../../include/group.php:268
-msgid "Add new connections to this privacy group"
-msgstr "Ajouter de nouveaux contacts à ce groupe d'accès"
-
-#: ../../include/group.php:309
-msgid "edit"
-msgstr "modifier"
-
-#: ../../include/group.php:331 ../../include/features.php:292
-msgid "Privacy Groups"
-msgstr "Groupes d'accès"
-
-#: ../../include/group.php:332
-msgid "Edit group"
-msgstr "Modifier le groupe"
-
-#: ../../include/group.php:333
-msgid "Add privacy group"
-msgstr "Ajouter un groupe d'accès"
-
-#: ../../include/group.php:334
-msgid "Channels not in any privacy group"
-msgstr "Canaux n'étant dans aucun groupe d'accès"
-
-#: ../../include/event.php:863
-msgid "This event has been added to your calendar."
-msgstr "Cet évènement a été ajouté dans votre calendrier."
-
-#: ../../include/event.php:1063
-msgid "Not specified"
-msgstr "Non spécifié"
-
-#: ../../include/event.php:1064
-msgid "Needs Action"
-msgstr "Besoin d'une action"
-
-#: ../../include/event.php:1065
-msgid "Completed"
-msgstr "Terminé"
-
-#: ../../include/event.php:1066
-msgid "In Process"
-msgstr "En cours"
-
-#: ../../include/event.php:1067
-msgid "Cancelled"
-msgstr "Annulé"
-
-#: ../../include/items.php:841 ../../include/items.php:888
-msgid "(Unknown)"
-msgstr "(Inconnu)"
-
-#: ../../include/items.php:1089
-msgid "Visible to anybody on the internet."
-msgstr "Visible pour tout le monde sur internet."
-
-#: ../../include/items.php:1091
-msgid "Visible to you only."
-msgstr "Visible pour vous seulement."
-
-#: ../../include/items.php:1093
-msgid "Visible to anybody in this network."
-msgstr "Visible pour tout le monde sur ce réseau."
-
-#: ../../include/items.php:1095
-msgid "Visible to anybody authenticated."
-msgstr "Visible aux utilisateurs authentifiés."
-
-#: ../../include/items.php:1097
-#, php-format
-msgid "Visible to anybody on %s."
-msgstr "Visible pour tous sur %s."
-
-#: ../../include/items.php:1099
-msgid "Visible to all connections."
-msgstr "Visible pour tous les contacts."
-
-#: ../../include/items.php:1101
-msgid "Visible to approved connections."
-msgstr "Visible aux contacts approuvés."
-
-#: ../../include/items.php:1103
-msgid "Visible to specific connections."
-msgstr "Visible pour certains contacts."
-
-#: ../../include/items.php:3915
-msgid "Privacy group is empty."
-msgstr "Groupe d'accès vide."
-
-#: ../../include/items.php:3922
-#, php-format
-msgid "Privacy group: %s"
-msgstr "Groupe d'accès&nbsp;: %s"
-
-#: ../../include/items.php:3934
-msgid "Connection not found."
-msgstr "Contact non trouvé."
-
-#: ../../include/items.php:4283
-msgid "profile photo"
-msgstr "photo de profil"
-
-#: ../../include/items.php:4479
-#, php-format
-msgid "[Edited %s]"
-msgstr "[%s édité]"
-
-#: ../../include/items.php:4479
-msgctxt "edit_activity"
-msgid "Post"
-msgstr "Publier"
-
-#: ../../include/items.php:4479
-msgctxt "edit_activity"
-msgid "Comment"
-msgstr "Commenter"
-
-#: ../../include/permissions.php:35
-msgid "Can view my normal stream and posts"
-msgstr "Peut voir les publications ordinaires sur mon canal."
-
-#: ../../include/permissions.php:39
-msgid "Can view my webpages"
-msgstr "Peut voir mes pages web"
-
-#: ../../include/permissions.php:43
-msgid "Can post on my channel page (\"wall\")"
-msgstr "Peuvent poster sur la page de mon canal (\"mur\")"
-
-#: ../../include/permissions.php:46
-msgid "Can like/dislike stuff"
-msgstr "Peuvent aimer/ne pas aimer"
-
-#: ../../include/permissions.php:46
-msgid "Profiles and things other than posts/comments"
-msgstr "Profils et autres excluant les publications/commentaires."
-
-#: ../../include/permissions.php:48
-msgid "Can forward to all my channel contacts via post @mentions"
-msgstr "Peut faire suivre à tous les contacts de mon canal via \"@mention\""
-
-#: ../../include/permissions.php:48
-msgid "Advanced - useful for creating group forum channels"
-msgstr "Avancé - utile pour les canaux de type \"forum/groupe\""
-
-#: ../../include/permissions.php:49
-msgid "Can chat with me (when available)"
-msgstr "Peut discuter avec moi (quand disponibie)"
-
-#: ../../include/permissions.php:50
-msgid "Can write to my file storage and photos"
-msgstr "Peut charger des fichiers et des photos dans mon canal"
-
-#: ../../include/permissions.php:51
-msgid "Can edit my webpages"
-msgstr "Peut modifier mes pages web"
+#: ../../include/oembed.php:308
+msgid " by "
+msgstr "par"
-#: ../../include/permissions.php:53
-msgid "Somewhat advanced - very useful in open communities"
-msgstr "Plutôt avancé - très utile dans les communautés ouvertes"
+#: ../../include/oembed.php:309
+msgid " on "
+msgstr "sur"
-#: ../../include/permissions.php:55
-msgid "Can administer my channel resources"
-msgstr "Peut administrer les ressources de mon canal"
+#: ../../include/oembed.php:338
+msgid "Embedded content"
+msgstr "Contenu imbriqué"
-#: ../../include/permissions.php:55
-msgid ""
-"Extremely advanced. Leave this alone unless you know what you are doing"
-msgstr "Très avancé. Ne pas toucher, sauf si vous savez ce que vous faîtes"
+#: ../../include/oembed.php:347
+msgid "Embedding disabled"
+msgstr "Imbrication désactivée"
#: ../../include/features.php:58
msgid "General Features"
@@ -13432,9 +12763,13 @@ msgstr "Chercher par date"
msgid "Ability to select posts by date ranges"
msgstr "Pouvoir choisir des publications par date"
+#: ../../include/features.php:292 ../../include/group.php:331
+msgid "Privacy Groups"
+msgstr "Groupes de contacts"
+
#: ../../include/features.php:293
msgid "Enable management and selection of privacy groups"
-msgstr "Active la gestion et la sélection des groupes d'accès"
+msgstr "Active la gestion et la sélection des groupes de contacts"
#: ../../include/features.php:302
msgid "Save search terms for re-use"
@@ -13542,198 +12877,410 @@ msgid ""
"channel"
msgstr "Vous permet d'appliquer des règles et restrictions aux contacts de votre canal"
-#: ../../include/help.php:31
-msgid "Help:"
-msgstr "Aide&nbsp;:"
+#: ../../include/taxonomy.php:228 ../../include/taxonomy.php:249
+msgid "Tags"
+msgstr "Étiquettes"
-#: ../../include/help.php:63
-msgid "Not Found"
-msgstr "Introuvable"
+#: ../../include/taxonomy.php:293
+msgid "Keywords"
+msgstr "Mots-clefs"
-#: ../../util/nconfig.php:34
-msgid "Source channel not found."
-msgstr "Source du canal introuvable."
+#: ../../include/taxonomy.php:314
+msgid "have"
+msgstr "ont"
-#: ../../view/theme/redbasic/php/config.php:9
-msgid "Focus (Hubzilla default)"
-msgstr "Focus (par défaut pour Hubzilla)"
+#: ../../include/taxonomy.php:314
+msgid "has"
+msgstr "a"
-#: ../../view/theme/redbasic/php/config.php:110
-msgid "Theme settings"
-msgstr "Paramètres du thème"
+#: ../../include/taxonomy.php:315
+msgid "want"
+msgstr "veulent"
-#: ../../view/theme/redbasic/php/config.php:111
-msgid "Narrow navbar"
-msgstr "Barre de navigation fine"
+#: ../../include/taxonomy.php:315
+msgid "wants"
+msgstr "veut"
-#: ../../view/theme/redbasic/php/config.php:112
-msgid "Navigation bar background color"
-msgstr "Couleur de fond de la barre de navigation"
+#: ../../include/taxonomy.php:316
+msgid "likes"
+msgstr "aime"
-#: ../../view/theme/redbasic/php/config.php:113
-msgid "Navigation bar gradient top color"
-msgstr "Dégradé de la barre de navigation - couleur du haut"
+#: ../../include/taxonomy.php:317
+msgid "dislikes"
+msgstr "n'aime pas"
-#: ../../view/theme/redbasic/php/config.php:114
-msgid "Navigation bar gradient bottom color"
-msgstr "Dégradé de la barre de navigation - couleur du bas"
+#: ../../include/account.php:35
+msgid "Not a valid email address"
+msgstr "Ce n'est pas une adresse de courriel valide"
-#: ../../view/theme/redbasic/php/config.php:115
-msgid "Navigation active button gradient top color"
-msgstr "Dégradé du bouton de navigation actif - couleur du haut"
+#: ../../include/account.php:37
+msgid "Your email domain is not among those allowed on this site"
+msgstr "Votre domaine de courriel ne fait pas partie de ceux autorisés par ce site"
-#: ../../view/theme/redbasic/php/config.php:116
-msgid "Navigation active button gradient bottom color"
-msgstr "Dégradé du bouton de navigation actif - couleur du bas"
+#: ../../include/account.php:43
+msgid "Your email address is already registered at this site."
+msgstr "Votre adresse de courriel est déjà inscrite sur ce site."
-#: ../../view/theme/redbasic/php/config.php:117
-msgid "Navigation bar border color "
-msgstr "Couleur de la bordure de la barre de navigation"
+#: ../../include/account.php:75
+msgid "An invitation is required."
+msgstr "Une invitation est requise."
-#: ../../view/theme/redbasic/php/config.php:118
-msgid "Navigation bar icon color "
-msgstr "Couleur des icônes de la barre de navigation"
+#: ../../include/account.php:79
+msgid "Invitation could not be verified."
+msgstr "Votre invitation n'a pas pu être vérifiée."
-#: ../../view/theme/redbasic/php/config.php:119
-msgid "Navigation bar active icon color "
-msgstr "Couleur de l'icône active de la barre de navigation"
+#: ../../include/account.php:130
+msgid "Please enter the required information."
+msgstr "Merci d'entrer les informations requises."
-#: ../../view/theme/redbasic/php/config.php:120
-msgid "link color"
-msgstr "couleur des liens"
+#: ../../include/account.php:198
+msgid "Failed to store account information."
+msgstr "Impossible de stocker les informations liées au compte."
-#: ../../view/theme/redbasic/php/config.php:121
-msgid "Set font-color for banner"
-msgstr "Définir la couleur du texte de la bannière"
+#: ../../include/account.php:263
+#, php-format
+msgid "Registration confirmation for %s"
+msgstr "Confirmation de l'inscription pour %s"
-#: ../../view/theme/redbasic/php/config.php:122
-msgid "Set the background color"
-msgstr "Définir la couleur d'arrière-plan"
+#: ../../include/account.php:330
+#, php-format
+msgid "Registration request at %s"
+msgstr "Demande d'inscription sur %s"
-#: ../../view/theme/redbasic/php/config.php:123
-msgid "Set the background image"
-msgstr "Définir l'image d'arrière-plan"
+#: ../../include/account.php:352
+msgid "your registration password"
+msgstr "votre mot de passe d'inscription"
-#: ../../view/theme/redbasic/php/config.php:124
-msgid "Set the background color of items"
-msgstr "Définir la couleur de fond des contributions"
+#: ../../include/account.php:358 ../../include/account.php:420
+#, php-format
+msgid "Registration details for %s"
+msgstr "Détails de l'inscription pour %s"
-#: ../../view/theme/redbasic/php/config.php:125
-msgid "Set the background color of comments"
-msgstr "Couleur de fond des commentaires"
+#: ../../include/account.php:431
+msgid "Account approved."
+msgstr "Compte approuvé."
-#: ../../view/theme/redbasic/php/config.php:126
-msgid "Set the border color of comments"
-msgstr "Couleur de la bordure des commentaires"
+#: ../../include/account.php:471
+#, php-format
+msgid "Registration revoked for %s"
+msgstr "Inscription révoquée pour %s"
-#: ../../view/theme/redbasic/php/config.php:127
-msgid "Set the indent for comments"
-msgstr "Indentation des commentaires"
+#: ../../include/account.php:756 ../../include/account.php:758
+msgid "Click here to upgrade."
+msgstr "Cliquez ici pour mettre à jour."
-#: ../../view/theme/redbasic/php/config.php:128
-msgid "Set the basic color for item icons"
-msgstr "Définir la couleur de base pour les icônes des éléments"
+#: ../../include/account.php:764
+msgid "This action exceeds the limits set by your subscription plan."
+msgstr "Cette action outrepasserait les limites prévues par votre forfait."
-#: ../../view/theme/redbasic/php/config.php:129
-msgid "Set the hover color for item icons"
-msgstr "Définir la couleur de survol des icônes des éléments"
+#: ../../include/account.php:769
+msgid "This action is not available under your subscription plan."
+msgstr "Cette action n'est pas disponible avec votre forfait."
-#: ../../view/theme/redbasic/php/config.php:130
-msgid "Set font-size for the entire application"
-msgstr "Définir la taille de police pour l'application entière"
+#: ../../include/datetime.php:147
+msgid "Birthday"
+msgstr "Anniversaire"
-#: ../../view/theme/redbasic/php/config.php:130
-msgid "Example: 14px"
-msgstr "Exemple : 14px"
+#: ../../include/datetime.php:149
+msgid "Age: "
+msgstr "Age&nbsp;:"
-#: ../../view/theme/redbasic/php/config.php:131
-msgid "Set font-size for posts and comments"
-msgstr "Définir la taille de police pour les contributions et commentaires"
+#: ../../include/datetime.php:151
+msgid "YYYY-MM-DD or MM-DD"
+msgstr "AAAA-MM-JJ ou MM-JJ"
-#: ../../view/theme/redbasic/php/config.php:132
-msgid "Set font-color for posts and comments"
-msgstr "Définir la couleur de police pour les contributions et commentaires"
+#: ../../include/datetime.php:292
+msgid "less than a second ago"
+msgstr "à l'instant"
-#: ../../view/theme/redbasic/php/config.php:133
-msgid "Set radius of corners"
-msgstr "Définir le rayon des arrondis"
+#: ../../include/datetime.php:310
+#, php-format
+msgctxt "e.g. 22 hours ago, 1 minute ago"
+msgid "%1$d %2$s ago"
+msgstr "il y a %1$d %2$s"
-#: ../../view/theme/redbasic/php/config.php:134
-msgid "Set shadow depth of photos"
-msgstr "Définir la profondeur de l'ombre des photos"
+#: ../../include/datetime.php:321
+msgctxt "relative_date"
+msgid "year"
+msgid_plural "years"
+msgstr[0] "an"
+msgstr[1] "ans"
-#: ../../view/theme/redbasic/php/config.php:135
-msgid "Set maximum width of content region in pixel"
-msgstr "Définir la largeur maximale de la zone des contenus"
+#: ../../include/datetime.php:324
+msgctxt "relative_date"
+msgid "month"
+msgid_plural "months"
+msgstr[0] "mois"
+msgstr[1] "mois"
-#: ../../view/theme/redbasic/php/config.php:135
-msgid "Leave empty for default width"
-msgstr "Laissez vide pour avoir la largeur par défaut"
+#: ../../include/datetime.php:327
+msgctxt "relative_date"
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "semaine"
+msgstr[1] "semaines"
-#: ../../view/theme/redbasic/php/config.php:136
-msgid "Left align page content"
-msgstr "Aligner à gauche le contenu de la page"
+#: ../../include/datetime.php:330
+msgctxt "relative_date"
+msgid "day"
+msgid_plural "days"
+msgstr[0] "jour"
+msgstr[1] "jours"
-#: ../../view/theme/redbasic/php/config.php:137
-msgid "Set minimum opacity of nav bar - to hide it"
-msgstr "Définir l'opacité minimum du bandeau de navigation - pour le cacher"
+#: ../../include/datetime.php:333
+msgctxt "relative_date"
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "heure"
+msgstr[1] "heures"
-#: ../../view/theme/redbasic/php/config.php:138
-msgid "Set size of conversation author photo"
-msgstr "Définir la taille de la photo de l'auteur d'une conversation"
+#: ../../include/datetime.php:336
+msgctxt "relative_date"
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minute"
+msgstr[1] "minutes"
-#: ../../view/theme/redbasic/php/config.php:139
-msgid "Set size of followup author photos"
-msgstr "Définir la taille de la photo de l'auteur d'une réponse"
+#: ../../include/datetime.php:339
+msgctxt "relative_date"
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] "seconde"
+msgstr[1] "secondes"
-#: ../../boot.php:1505
+#: ../../include/datetime.php:576
#, php-format
-msgid "Update %s failed. See error logs."
-msgstr "La mise-à-jour %s a échoué. Merci de consulter les journaux d'erreur."
+msgid "%1$s's birthday"
+msgstr "Anniversaire de %1$s"
-#: ../../boot.php:1508
+#: ../../include/datetime.php:577
#, php-format
-msgid "Update Error at %s"
-msgstr "Erreur de mise à jour sur %s"
+msgid "Happy Birthday %1$s"
+msgstr "Joyeux Anniversaire %1$s"
-#: ../../boot.php:1712
-msgid "Create an account to access services and applications"
-msgstr "Créer un compte pour accéder aux services et applications"
+#: ../../include/nav.php:88
+msgid "Remote authentication"
+msgstr "Authentification distante"
-#: ../../boot.php:1734
-msgid "Login/Email"
-msgstr "pseudo / email"
+#: ../../include/nav.php:88
+msgid "Click to authenticate to your home hub"
+msgstr "S'authentifier auprès de votre hub principal"
-#: ../../boot.php:1735
-msgid "Password"
-msgstr "Mot de passe"
+#: ../../include/nav.php:99 ../../include/nav.php:123
+msgid "End this session"
+msgstr "Mettre fin à la session"
-#: ../../boot.php:1736
-msgid "Remember me"
-msgstr "Se souvenir de moi"
+#: ../../include/nav.php:102
+msgid "Your profile page"
+msgstr "Votre profil"
-#: ../../boot.php:1739
-msgid "Forgot your password?"
-msgstr "Mot de passe oublié&nbsp;?"
+#: ../../include/nav.php:105
+msgid "Manage/Edit profiles"
+msgstr "Gérer/modifier vos profils"
-#: ../../boot.php:2300
-msgid "toggle mobile"
-msgstr "(dés)activer mobile"
+#: ../../include/nav.php:107
+msgid "Edit your profile"
+msgstr "Modifier votre profil"
-#: ../../boot.php:2455
-msgid "Website SSL certificate is not valid. Please correct."
-msgstr "Le certificat SSL n'est pas valide. Corrigez le."
+#: ../../include/nav.php:113
+msgid "Sign in"
+msgstr "Connexion"
+
+#: ../../include/nav.php:138
+msgid "Take me home"
+msgstr ""
+
+#: ../../include/nav.php:140
+msgid "Log me out of this site"
+msgstr "Déconnectez-moi de ce site"
+
+#: ../../include/nav.php:145
+msgid "Create an account"
+msgstr "Créer un compte"
+
+#: ../../include/nav.php:157
+msgid "Help and documentation"
+msgstr "Aide et documentation"
+
+#: ../../include/nav.php:160
+msgid "Search site @name, #tag, ?docs, content"
+msgstr "Recherche @nom, #tag, contenu"
+
+#: ../../include/nav.php:172
+msgid "Your grid"
+msgstr "Votre réseau"
+
+#: ../../include/nav.php:173
+msgid "View your network/grid"
+msgstr "Voir votre réseau"
+
+#: ../../include/nav.php:174
+msgid "Mark all grid notifications seen"
+msgstr "Marquer toutes les notifications du réseau comme vues"
+
+#: ../../include/nav.php:176
+msgid "Channel home"
+msgstr "Mon canal"
+
+#: ../../include/nav.php:177
+msgid "View your channel home"
+msgstr "Voir la page d'accueil de votre canal"
+
+#: ../../include/nav.php:178
+msgid "Mark all channel notifications seen"
+msgstr "Marquer toutes les notifications du canal comme vues"
+
+#: ../../include/nav.php:184
+msgid "Notices"
+msgstr "Notifications"
+
+#: ../../include/nav.php:184
+msgid "Notifications"
+msgstr "Notifications"
+
+#: ../../include/nav.php:185
+msgid "View all notifications"
+msgstr "Voir toutes les notifications"
+
+#: ../../include/nav.php:188
+msgid "Private mail"
+msgstr "Messages privés"
+
+#: ../../include/nav.php:189
+msgid "View your private messages"
+msgstr "Voir vos messages privés"
+
+#: ../../include/nav.php:190
+msgid "Mark all private messages seen"
+msgstr "Marquer tous les messages privés comme vus"
+
+#: ../../include/nav.php:196
+msgid "Event Calendar"
+msgstr "Calendrier des événements"
+
+#: ../../include/nav.php:197
+msgid "View events"
+msgstr "Voir les événements"
+
+#: ../../include/nav.php:198
+msgid "Mark all events seen"
+msgstr "Marquer tous les événements comme vus"
+
+#: ../../include/nav.php:201
+msgid "Manage Your Channels"
+msgstr "Gérer vos canaux"
+
+#: ../../include/nav.php:203
+msgid "Account/Channel Settings"
+msgstr "Paramètres du Compte/Canal"
+
+#: ../../include/nav.php:211
+msgid "Site Setup and Configuration"
+msgstr "Configuration du site"
-#: ../../boot.php:2458
+#: ../../include/nav.php:273
+msgid "@name, #tag, ?doc, content"
+msgstr "@nom, #étiquette, ?doc, contenu"
+
+#: ../../include/nav.php:274
+msgid "Please wait..."
+msgstr "Merci de patienter..."
+
+#: ../../include/nav.php:276
+msgid "Add Apps"
+msgstr ""
+
+#: ../../include/photos.php:115
#, php-format
-msgid "[hubzilla] Website SSL error for %s"
-msgstr "[hubzilla] Erreur SSL pour %s"
+msgid "Image exceeds website size limit of %lu bytes"
+msgstr "L'image dépasse la taille limite de %lu octets"
-#: ../../boot.php:2577
-msgid "Cron/Scheduled tasks not running."
-msgstr "Les taches planifiées ne tournent pas."
+#: ../../include/photos.php:122
+msgid "Image file is empty."
+msgstr "L'image est vide."
+
+#: ../../include/photos.php:261
+msgid "Photo storage failed."
+msgstr "Le stockage de l'image a échoué."
-#: ../../boot.php:2581
+#: ../../include/photos.php:301
+msgid "a new photo"
+msgstr "une nouvelle photo"
+
+#: ../../include/photos.php:305
#, php-format
-msgid "[hubzilla] Cron tasks not running on %s"
-msgstr "[hubzilla] Les tâches planifiées ne tournent pas sur %s"
+msgctxt "photo_upload"
+msgid "%1$s posted %2$s to %3$s"
+msgstr "%1$s a publié %2$s pour %3$s"
+
+#: ../../include/photos.php:532
+msgid "Upload New Photos"
+msgstr "Ajouter des photos"
+
+#: ../../include/zot.php:649
+msgid "Invalid data packet"
+msgstr "Paquet de données invalide"
+
+#: ../../include/zot.php:665
+msgid "Unable to verify channel signature"
+msgstr "Impossible de vérifier la signature du canal"
+
+#: ../../include/zot.php:2316
+#, php-format
+msgid "Unable to verify site signature for %s"
+msgstr "Impossible de vérifier la signature de site pour %s"
+
+#: ../../include/zot.php:3722
+msgid "invalid target signature"
+msgstr "signature de la cible invalide"
+
+#: ../../include/group.php:26
+msgid ""
+"A deleted group with this name was revived. Existing item permissions "
+"<strong>may</strong> apply to this group and any future members. If this is "
+"not what you intended, please create another group with a different name."
+msgstr "Un groupe supprimé portant ce nom a été ressuscité. Les permissions liées aux éléments existants <strong>peuvent</strong> s'appliquer au groupe et aux membres futurs. Si ce n'est pas ce que vous attendiez, merci de créer un autre groupe avec un nom différent."
+
+#: ../../include/group.php:268
+msgid "Add new connections to this privacy group"
+msgstr "Ajouter de nouveaux contacts à ce groupe de contacts"
+
+#: ../../include/group.php:309
+msgid "edit"
+msgstr "modifier"
+
+#: ../../include/group.php:332
+msgid "Edit group"
+msgstr "Modifier le groupe"
+
+#: ../../include/group.php:333
+msgid "Add privacy group"
+msgstr "Créer un groupe de contacts"
+
+#: ../../include/group.php:334
+msgid "Channels not in any privacy group"
+msgstr "Contacts n'étant dans aucun groupe de contacts"
+
+#: ../../include/connections.php:127
+msgid "New window"
+msgstr "Nouvelle fenêtre"
+
+#: ../../include/connections.php:128
+msgid "Open the selected location in a different window or browser tab"
+msgstr "Ouvrir l'emplacement dans une fenêtre ou un onglet différent"
+
+#: ../../include/auth.php:148
+msgid "Logged out."
+msgstr "Deconnecté."
+
+#: ../../include/auth.php:275
+msgid "Failed authentication"
+msgstr "Échec de l'authentification"
+
+#: ../../include/help.php:33
+msgid "Help:"
+msgstr "Aide&nbsp;:"
+
+#: ../../include/help.php:65
+msgid "Not Found"
+msgstr "Introuvable"
diff --git a/view/fr/hstrings.php b/view/fr/hstrings.php
index e7ef0bbc8..d883cc240 100644
--- a/view/fr/hstrings.php
+++ b/view/fr/hstrings.php
@@ -5,22 +5,6 @@ function string_plural_select_fr($n){
return ($n > 1);;
}}
App::$rtl = 0;
-App::$strings["Social Networking"] = "Réseau social";
-App::$strings["Social - Mostly Public"] = "Social - principalement public";
-App::$strings["Social - Restricted"] = "Social - restreint";
-App::$strings["Social - Private"] = "Social - privé";
-App::$strings["Community Forum"] = "Forum communautaire";
-App::$strings["Forum - Mostly Public"] = "Forum - principalement public";
-App::$strings["Forum - Restricted"] = "Forum - restreint";
-App::$strings["Forum - Private"] = "Forum - privé";
-App::$strings["Feed Republish"] = "Republication de flux";
-App::$strings["Feed - Mostly Public"] = "Flux - principalement public";
-App::$strings["Feed - Restricted"] = "Flux - restreint";
-App::$strings["Special Purpose"] = "Utilisation spécifique";
-App::$strings["Special - Celebrity/Soapbox"] = "Spécial - célébrité/vitrine";
-App::$strings["Special - Group Repository"] = "Spécial - dépôt partagé";
-App::$strings["Other"] = "Autre";
-App::$strings["Custom/Expert Mode"] = "Mode expert/spécifique";
App::$strings["Can view my channel stream and posts"] = "Peut voir mon canal et mes publicatiosn";
App::$strings["Can send me their channel stream and posts"] = "Peuvent m'envoyer leur flux et les publications de leur canal";
App::$strings["Can view my default channel profile"] = "Peut voir le profil par défaut du canal.";
@@ -39,57 +23,201 @@ App::$strings["Can forward to all my channel connections via @+ mentions in post
App::$strings["Can chat with me"] = "Peut discuter avec moi";
App::$strings["Can source my public posts in derived channels"] = "Peut rediriger mes publications publiques vers des canaux dérivés";
App::$strings["Can administer my channel"] = "Peut administrer mon canal";
-App::$strings["parent"] = "retour";
-App::$strings["Collection"] = "Groupe de contacts";
-App::$strings["Principal"] = "Principal";
-App::$strings["Addressbook"] = "Carnet d'adresse";
-App::$strings["Calendar"] = "Calendrier";
-App::$strings["Schedule Inbox"] = "Calendrier - Messages entrants";
-App::$strings["Schedule Outbox"] = "Calendrier - Messages sortants";
-App::$strings["Unknown"] = "Inconnu";
-App::$strings["Files"] = "Fichiers";
-App::$strings["Total"] = "Total";
-App::$strings["Shared"] = "Partagé";
+App::$strings["Social Networking"] = "Réseau social";
+App::$strings["Social - Mostly Public"] = "Social - principalement public";
+App::$strings["Social - Restricted"] = "Social - restreint";
+App::$strings["Social - Private"] = "Social - privé";
+App::$strings["Community Forum"] = "Forum communautaire";
+App::$strings["Forum - Mostly Public"] = "Forum - principalement public";
+App::$strings["Forum - Restricted"] = "Forum - restreint";
+App::$strings["Forum - Private"] = "Forum - privé";
+App::$strings["Feed Republish"] = "Republication de flux";
+App::$strings["Feed - Mostly Public"] = "Flux - principalement public";
+App::$strings["Feed - Restricted"] = "Flux - restreint";
+App::$strings["Special Purpose"] = "Utilisation spécifique";
+App::$strings["Special - Celebrity/Soapbox"] = "Spécial - célébrité/vitrine";
+App::$strings["Special - Group Repository"] = "Spécial - dépôt partagé";
+App::$strings["Other"] = "Autre";
+App::$strings["Custom/Expert Mode"] = "Mode expert/spécifique";
+App::$strings["Requested profile is not available."] = "Profil demandé non disponible.";
+App::$strings["Permission denied."] = "Permission refusée.";
+App::$strings["Block Name"] = "Nom du Bloc";
+App::$strings["Blocks"] = "Blocs";
+App::$strings["Block Title"] = "Titre du bloc";
+App::$strings["Created"] = "Créé(e)";
+App::$strings["Edited"] = "Modifié(e)";
App::$strings["Create"] = "Créer";
-App::$strings["Upload"] = "Envoyer";
-App::$strings["Name"] = "Nom";
-App::$strings["Type"] = "Type";
-App::$strings["Size"] = "Taille";
-App::$strings["Last Modified"] = "Modifié le";
App::$strings["Edit"] = "Modifier";
+App::$strings["Share"] = "Partager";
App::$strings["Delete"] = "Supprimer";
-App::$strings["You are using %1\$s of your available file storage."] = "Vous utilisez %1\$s de votre espace de stockage.";
-App::$strings["You are using %1\$s of %2\$s available file storage. (%3\$s&#37;)"] = "Vous utilisez %1\$s sur %2\$s d'espace disponible. (%3\$s&#37;)";
-App::$strings["WARNING:"] = "AVERTISSEMENT&nbsp;:";
-App::$strings["Create new folder"] = "Nouveau dossier";
-App::$strings["Upload file"] = "Téléverser un fichier";
-App::$strings["Drop files here to immediately upload"] = "Mettez un fichier ici pour le télécharger immédiatement";
+App::$strings["View"] = "Voir";
+App::$strings["Total invitation limit exceeded."] = "Limite du nombre total d'invitation dépassée.";
+App::$strings["%s : Not a valid email address."] = "%s&nbsp;: adresse courriel invalide.";
+App::$strings["Please join us on \$Projectname"] = "Rejoignez-nous sur \$Projectname";
+App::$strings["Invitation limit exceeded. Please contact your site administrator."] = "Limite d'invitations dépassée. Merci de contacter l'administration de votre site.";
+App::$strings["%s : Message delivery failed."] = "%s&nbsp;: Échec de distribution du message.";
+App::$strings["%d message sent."] = array(
+ 0 => "%d message envoyé.",
+ 1 => "%d messages envoyés.",
+);
+App::$strings["You have no more invitations available"] = "Vous ne disposez plus d'aucune invitation";
+App::$strings["Send invitations"] = "Envoyer des invitations";
+App::$strings["Enter email addresses, one per line:"] = "Entrez les adresses de courriel, une par ligne&nbsp;:";
+App::$strings["Your message:"] = "Votre message&nbsp;:";
+App::$strings["Please join my community on \$Projectname."] = "Rejoignez ma communauté sur \$Projectname.";
+App::$strings["You will need to supply this invitation code:"] = "Vous devrez fournir le code suivant&nbsp;:";
+App::$strings["1. Register at any \$Projectname location (they are all inter-connected)"] = "1. Enregistrez-vous sur n'importe quel serveur \$Projectname (ils sont tous inter-connectés)";
+App::$strings["2. Enter my \$Projectname network address into the site searchbar."] = "2. Saisissez l'adresse de mon canal \$Projectname dans la barre de recherche du site.";
+App::$strings["or visit"] = "ou rendez-vous sur";
+App::$strings["3. Click [Connect]"] = "3. Cliquez sur [Ajouter]";
+App::$strings["Submit"] = "Envoyer";
+App::$strings["Item not found"] = "Élément introuvable";
+App::$strings["Layout Name"] = "Nom de la mise en page";
+App::$strings["Layout Description (Optional)"] = "Description de la mise en page (facultatif)";
+App::$strings["Edit Layout"] = "Modifier la mise en page";
App::$strings["Permission denied"] = "Accès refusé";
-App::$strings["Permission denied."] = "Permission refusée.";
-App::$strings["Page not found."] = "Page introuvable.";
-App::$strings["Remote authentication blocked. You are logged into this site locally. Please logout and retry."] = "Authentification distante bloquée. Vous êtes connecté(e) sur ce site localement. Merci de vous déconnecter et réessayer.";
-App::$strings["Welcome %s. Remote authentication successful."] = "Bienvenue %s. L'authentification distante a fonctionné.";
-App::$strings["Requested profile is not available."] = "Profil demandé non disponible.";
-App::$strings["Some blurb about what to do when you're new here"] = "Quelques mots sur quoi faire quand on est nouveau ici";
+App::$strings["Invalid profile identifier."] = "Identifiant de profil invalide.";
+App::$strings["Profile Visibility Editor"] = "Éditeur de visibilité de profil";
+App::$strings["Profile"] = "Profil";
+App::$strings["Click on a contact to add or remove."] = "Cliquer sur un contact pour l'ajouter ou le retirer.";
+App::$strings["Visible To"] = "Visible par";
+App::$strings["All Connections"] = "Tous les contacts";
+App::$strings["This site is not a directory server"] = "Ce site n'est pas un serveur d'annuaire";
+App::$strings["You must be logged in to see this page."] = "Vous devez vous connecter pour voir cette page.";
+App::$strings["Posts and comments"] = "Publications et commentaires";
+App::$strings["Only posts"] = "Seulement les publications";
+App::$strings["Insufficient permissions. Request redirected to profile page."] = "Permissions insuffisantes. Demande redirigée vers la page du profil.";
+App::$strings["Export Channel"] = "Exporter le canal";
+App::$strings["Export your basic channel information to a file. This acts as a backup of your connections, permissions, profile and basic data, which can be used to import your data to a new server hub, but does not contain your content."] = "Exportez les principales informations de votre canal dans un fichier. Celui-ci pourra servir de sauvegarde de vos contacts, permissions, profils et données de base. Il pourra être importé sur un nouveau hub/serveur, mais n'embarquera pas vos contenus.";
+App::$strings["Export Content"] = "Exporter le contenu";
+App::$strings["Export your channel information and recent content to a JSON backup that can be restored or imported to another server hub. This backs up all of your connections, permissions, profile data and several months of posts. This file may be VERY large. Please be patient - it may take several minutes for this download to begin."] = "Exportez les informations du canal et les contenus récents dans un fichier JSON. Celui-ci contiendra toutes vos relations, permissions, profils, et plusieurs mois de publications. Ce fichier peut être TRÈS gros. Armez-vous de patience - plusieurs minutes peuvent s'écouler avant que le téléchargement ne commence.";
+App::$strings["Export your posts from a given year."] = "Exporter vos publications d'une année en particulier";
+App::$strings["You may also export your posts and conversations for a particular year or month. Adjust the date in your browser location bar to select other dates. If the export fails (possibly due to memory exhaustion on your server hub), please try again selecting a more limited date range."] = "Vous pouvez également exporter vos publications et conversations pour une année ou un mois particulier. Ajustez la date dans la barre de votre navigateur pour sélectionner d'autres dates. Si l'export échoue (possible en cas de pénurie de mémoire sur le serveur de votre hub), essayez à nouveau en sélectionnant un intervalle de dates plus petit.";
+App::$strings["To select all posts for a given year, such as this year, visit <a href=\"%1\$s\">%2\$s</a>"] = "Pour sélectionner toutes les publications pour une année donnée, telle que cette année, visitez <a href=\"%1\$s\">%2\$s</a>";
+App::$strings["To select all posts for a given month, such as January of this year, visit <a href=\"%1\$s\">%2\$s</a>"] = "Pour sélectionner toutes les publications pour un mois donné, par exemple janvier, visitez <a href=\"%1\$s\">%2\$s</a>";
+App::$strings["These content files may be imported or restored by visiting <a href=\"%1\$s\">%2\$s</a> on any site containing your channel. For best results please import or restore these in date order (oldest first)."] = "Ces fichiers de contenu peuvent être importés ou restaurés en visitant <a href=\"%1\$s\">%2\$s</a> sur n'importe quel site hébergeant votre canal. Pour de meilleurs résultats merci de les importer par ordre chronologique (les plus anciens d'abord).";
App::$strings["Public access denied."] = "Accès public refusé.";
-App::$strings["Item not found."] = "Élément introuvable";
-App::$strings["Maximum daily site registrations exceeded. Please try again tomorrow."] = "Nombre d'inscriptions quotidiennes dépassé. Merci d'essayer à nouveau demain.";
-App::$strings["Please indicate acceptance of the Terms of Service. Registration failed."] = "Merci d'indiquer votre adhésion aux conditions de service. L'inscription a échoué.";
-App::$strings["Passwords do not match."] = "Les mots de passe ne concordent pas.";
-App::$strings["Registration successful. Please check your email for validation instructions."] = "Inscription réussie. Merci de vérifier vos courriels pour valider votre compte.";
-App::$strings["Your registration is pending approval by the site owner."] = "Votre inscription est en attente d'approbation par l'administrateur.";
-App::$strings["Your registration can not be processed."] = "Votre inscription ne peut être traîtée.";
-App::$strings["Registration on this hub is disabled."] = "La création de nouveaux comptes est désactivée pour ce site.";
-App::$strings["Registration on this hub is by approval only."] = "La création de compte sur ce site est soumise à approbation.";
-App::$strings["<a href=\"pubsites\">Register at another affiliated hub.</a>"] = "<a href=\"pubsites\">S'enregistrer sur un autre site du réseau.</a>";
-App::$strings["This site has exceeded the number of allowed daily account registrations. Please try again tomorrow."] = "Ce site a dépassé le nombre de création de comptes autorisé chaque jour. Merci d'essayer à nouveau demain.";
-App::$strings["Terms of Service"] = "Conditions de service";
-App::$strings["I accept the %s for this website"] = "J'accepte les %s de ce site";
-App::$strings["I am over 13 years of age and accept the %s for this website"] = "J'ai plus de 13 ans et j'accepte les %s de ce site";
-App::$strings["Your email address"] = "Votre adresse de courriel";
-App::$strings["Choose a password"] = "Choisissez un mot de passe";
-App::$strings["Please re-enter your password"] = "Merci de saisir à nouveau votre mot de passe";
-App::$strings["Please enter your invitation code"] = "Merci de saisir votre code d'invitation";
+App::$strings["Search"] = "Recherche";
+App::$strings["Items tagged with: %s"] = "Eléments étiquetés avec&nbsp;: %s";
+App::$strings["Search results for: %s"] = "Résultats de recherche pour&nbsp;: %s";
+App::$strings["Location not found."] = "Emplacement introuvable.";
+App::$strings["Location lookup failed."] = "Echec de la recherche de l'emplacement.";
+App::$strings["Please select another location to become primary before removing the primary location."] = "Merci de sélectionner un autre emplacement comme nouvel emplacement primaire avant de supprimer l'emplacement primaire actuel.";
+App::$strings["Syncing locations"] = "Synchronisation des emplacements";
+App::$strings["No locations found."] = "Emplacement(s) introuvable.";
+App::$strings["Manage Channel Locations"] = "Gérer les emplacements des canaux";
+App::$strings["Location"] = "Emplacement";
+App::$strings["Address"] = "Adresse";
+App::$strings["Primary"] = "Primaire";
+App::$strings["Drop"] = "Supprimer";
+App::$strings["Sync Now"] = "Synchronisez maintenant";
+App::$strings["Please wait several minutes between consecutive operations."] = "Merci d'attendre plusieurs minutes entre opérations successives.";
+App::$strings["When possible, drop a location by logging into that website/hub and removing your channel."] = "Quand c'est possible, abandonnez un emplacement en vous connectant sur le site/hub et en supprimant votre canal.";
+App::$strings["Use this form to drop the location if the hub is no longer operating."] = "Utilisez ce formulaire pour abandonner l'emplacement si le hub n'est plus actif.";
+App::$strings["Menu not found."] = "Menu introuvable.";
+App::$strings["Unable to create element."] = "Impossible de créer l'entrée.";
+App::$strings["Unable to update menu element."] = "Impossible de mettre à jour l'entrée de menu.";
+App::$strings["Unable to add menu element."] = "Impossible d'ajouter l'entrée de menu.";
+App::$strings["Not found."] = "Introuvable.";
+App::$strings["Menu Item Permissions"] = "Permissions de l'entrée de menu";
+App::$strings["(click to open/close)"] = "(cliquer pour ouvrir/fermer)";
+App::$strings["Link Name"] = "Nom du lien";
+App::$strings["Link or Submenu Target"] = "Lien ou sous-menu cible";
+App::$strings["Enter URL of the link or select a menu name to create a submenu"] = "Entrez l'URL du lien ou sélectionnez un nom de menu pour créer un sous-menu";
+App::$strings["Use magic-auth if available"] = "Utiliser l'authentification distante, quand disponible";
+App::$strings["No"] = "Non";
+App::$strings["Yes"] = "Oui";
+App::$strings["Open link in new window"] = "Ouvrir le lien dans une nouvelle fenêtre";
+App::$strings["Order in list"] = "Ordre dans la liste";
+App::$strings["Higher numbers will sink to bottom of listing"] = "Les nombres les plus élevés seront au bas de la liste";
+App::$strings["Submit and finish"] = "Vadiler et terminer";
+App::$strings["Submit and continue"] = "Valider et continuer";
+App::$strings["Menu:"] = "Menu&nbsp;:";
+App::$strings["Link Target"] = "Cible du lien";
+App::$strings["Edit menu"] = "Modifier le menu";
+App::$strings["Edit element"] = "Modifier l'entrée";
+App::$strings["Drop element"] = "Supprimer l'entrée";
+App::$strings["New element"] = "Nouvelle entrée";
+App::$strings["Edit this menu container"] = "Éditer ce bloc de menu";
+App::$strings["Add menu element"] = "Ajouter une entrée au menu";
+App::$strings["Delete this menu item"] = "Supprimer cette entrée du menu";
+App::$strings["Edit this menu item"] = "Modifier cette entrée du menu";
+App::$strings["Menu item not found."] = "Entrée de menu introuvable.";
+App::$strings["Menu item deleted."] = "Entrée de menu supprimée.";
+App::$strings["Menu item could not be deleted."] = "Impossible de supprimer l'entrée de menu.";
+App::$strings["Edit Menu Element"] = "Modifier l'entrée de menu";
+App::$strings["Link text"] = "Texte du lien";
+App::$strings["Calendar entries imported."] = "Entrées du calendrier importées.";
+App::$strings["No calendar entries found."] = "Aucune entrée du calendrier trouvée.";
+App::$strings["Event can not end before it has started."] = "La fin de l'événement ne peut être antérieure à son début.";
+App::$strings["Unable to generate preview."] = "Impossible de générer l'aperçu.";
+App::$strings["Event title and start time are required."] = "Un titre et une date de début sont requises pour l'événement.";
+App::$strings["Event not found."] = "Événement introuvable.";
+App::$strings["event"] = "événement";
+App::$strings["Edit event title"] = "Modifier le titre de l'événement";
+App::$strings["Event title"] = "Titre de l'événement";
+App::$strings["Required"] = "Requis";
+App::$strings["Categories (comma-separated list)"] = "Catégories (séparées par des virgules)";
+App::$strings["Edit Category"] = "Modifier la catégorie";
+App::$strings["Category"] = "Catégorie";
+App::$strings["Edit start date and time"] = "Modifier la date et l'heure de début";
+App::$strings["Start date and time"] = "Date et heure de début";
+App::$strings["Finish date and time are not known or not relevant"] = "Date et heure de fin inconnues ou sans objet";
+App::$strings["Edit finish date and time"] = "Modifier la date et l'heure de fin";
+App::$strings["Finish date and time"] = "Date et heure de fin";
+App::$strings["Adjust for viewer timezone"] = "Ajuster au fuseau horaire du visiteur";
+App::$strings["Important for events that happen in a particular place. Not practical for global holidays."] = "Important pour les événements se tenant en un lieu particulier. Pas pratique pour les vacances communes à de nombreux pays dans le monde.";
+App::$strings["Edit Description"] = "Modifier la description";
+App::$strings["Description"] = "Description";
+App::$strings["Edit Location"] = "Modifier l'emplacement";
+App::$strings["Preview"] = "Aperçu";
+App::$strings["Permission settings"] = "Gérer les autorisations";
+App::$strings["Timezone:"] = "Fuseau horaire&nbsp;:";
+App::$strings["Advanced Options"] = "Options avancées";
+App::$strings["l, F j"] = "l, F j";
+App::$strings["Edit event"] = "Modifier l'événement";
+App::$strings["Delete event"] = "Supprimer l'événement";
+App::$strings["Link to Source"] = "Lien vers la Source";
+App::$strings["calendar"] = "calendrier";
+App::$strings["Edit Event"] = "Modifier l'événement";
+App::$strings["Create Event"] = "Créer un événement";
+App::$strings["Previous"] = "Précédent";
+App::$strings["Next"] = "Suivant";
+App::$strings["Export"] = "Export";
+App::$strings["Month"] = "Mois";
+App::$strings["Week"] = "Semaine";
+App::$strings["Day"] = "Jour";
+App::$strings["Today"] = "Aujourd'hui";
+App::$strings["Event removed"] = "Événement supprimé";
+App::$strings["Failed to remove event"] = "Impossible de supprimer l'événement";
+App::$strings["App installed."] = "Application installée.";
+App::$strings["Malformed app."] = "Erreur de l'application - Malformée.";
+App::$strings["Embed code"] = "Imbriquer le code";
+App::$strings["Edit App"] = "Modifier l'application";
+App::$strings["Create App"] = "Créer une application";
+App::$strings["Name of app"] = "Nom de l'application";
+App::$strings["Location (URL) of app"] = "Emplacement (URL) de l'application";
+App::$strings["Photo icon URL"] = "URL de l'icône à utiliser pour cette photo";
+App::$strings["80 x 80 pixels - optional"] = "80 x 80 pixels - facultatif";
+App::$strings["Categories (optional, comma separated list)"] = "Catégories (séparées par des virgules)";
+App::$strings["Version ID"] = "Identifiant de version";
+App::$strings["Price of app"] = "Prix de l'application";
+App::$strings["Location (URL) to purchase app"] = "Emplacement (URL) pour l'achat de l'application";
+App::$strings["Please login."] = "Merci de vous connecter.";
+App::$strings["Hub not found."] = "Hub introuvable.";
+App::$strings["photo"] = "photo";
+App::$strings["status"] = "état";
+App::$strings["%1\$s is following %2\$s's %3\$s"] = "%1\$s suit %3\$s de %2\$s";
+App::$strings["%1\$s stopped following %2\$s's %3\$s"] = "%1\$s ne suit plus %3\$s de %2\$s";
+App::$strings["Nothing to import."] = "Rien à importer.";
+App::$strings["Unable to download data from old server"] = "Impossible de récupérer les données de l'ancien serveur";
+App::$strings["Imported file is empty."] = "Le fichier importé est vide.";
+App::$strings["Warning: Database versions differ by %1\$d updates."] = "Attention&nbsp;: les versions de bases de données diffèrent de %1\$d mises à jour.";
+App::$strings["Import completed"] = "L'import est terminé.";
+App::$strings["Import Items"] = "Importer";
+App::$strings["Use this form to import existing posts and content from an export file."] = "Utiliser ce formulaire pour importer des publications et du contenu existant d'un fichier d'export.";
+App::$strings["File to Upload"] = "Fichier à envoyer";
+App::$strings["You have created %1$.0f of %2$.0f allowed channels."] = "Vous avez créé %1$.0f des %2$.0f canaux autorisés.";
App::$strings["Name or caption"] = "Nom ou libellé";
App::$strings["Examples: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \"Aviation Group\""] = "Exemples&nbsp;: \"Jérôme Dutilleul\", \"Louise et ses chevaux\", \"Football\", \"Club d'aéromodélisme\"";
App::$strings["Choose a short nickname"] = "Choisissez un alias";
@@ -97,107 +225,117 @@ App::$strings["Your nickname will be used to create an easy to remember channel
App::$strings["Channel role and privacy"] = "Rôle et confidentialité du canal";
App::$strings["Select a channel role with your privacy requirements."] = "Sélectionner un rôle de canal adapté à vos besoins de confidentialité.";
App::$strings["Read more about roles"] = "En savoir plus sur les rôles";
-App::$strings["no"] = "non";
-App::$strings["yes"] = "oui";
-App::$strings["Registration"] = "Inscription";
-App::$strings["Membership on this site is by invitation only."] = "L'inscription à ce site se fait uniquement sur invitation.";
-App::$strings["Register"] = "S'inscrire";
-App::$strings["This site may require email verification after submitting this form. If you are returned to a login page, please check your email for instructions."] = "Ce site peut demander une validation de votre email. Si vous revenez sur le formulaire de connexion, vérifiez vos emails et suivez les instructions. Regardez aussi les spams.";
-App::$strings["Fetching URL returns error: %1\$s"] = "Récupération d'URL échouée&nbsp;: %1\$s";
-App::$strings["Page owner information could not be retrieved."] = "Impossible d'obtenir des informations sur le propriétaire de la page.";
-App::$strings["Profile Photos"] = "Photos du profil";
-App::$strings["Album not found."] = "Album introuvable.";
-App::$strings["Delete Album"] = "Supprimer l'album";
-App::$strings["Multiple storage folders exist with this album name, but within different directories. Please remove the desired folder or folders using the Files manager"] = "Plusieurs dossiers de stockage existent avec ce nom d'album, mais dans différents répertoires. Veuillez supprimer le ou les dossier(s) désiré(s) à l'aide du Gestionnaire de fichiers.";
-App::$strings["Delete Photo"] = "Supprimer la photo";
-App::$strings["No photos selected"] = "Aucune photo selectionnée";
-App::$strings["Access to this item is restricted."] = "L'accès à l'élément est restreint.";
-App::$strings["%1$.2f MB of %2$.2f MB photo storage used."] = "Vous avez utilisé %1$.2f mégaoctets sur les %2$.2f autorisés pour le stockage des photos.";
-App::$strings["%1$.2f MB photo storage used."] = "%1$.2f méga-octets utilisés pour le stockage des photos.";
-App::$strings["Upload Photos"] = "Téléverser des photos";
-App::$strings["Enter an album name"] = "Entrer un nom d'album";
-App::$strings["or select an existing album (doubleclick)"] = "ou sélectionner un album existant (double-clic)";
-App::$strings["Create a status post for this upload"] = "Créer une publication de statut pour cet envoi";
-App::$strings["No"] = "Non";
-App::$strings["Yes"] = "Oui";
-App::$strings["Caption (optional):"] = "Légende (facultative)";
-App::$strings["Description (optional):"] = "Description (facultative)";
-App::$strings["Permissions"] = "Autorisations";
-App::$strings["Submit"] = "Envoyer";
-App::$strings["Album name could not be decoded"] = "Le nom de l'Album n'a pu être décodé";
-App::$strings["Contact Photos"] = "Photos de contact";
-App::$strings["Show Newest First"] = "Les plus récent(e)s en premier";
-App::$strings["Show Oldest First"] = "Les moins récent(e)s en premier";
-App::$strings["View Photo"] = "Voir la photo";
-App::$strings["Edit Album"] = "Modifier l'album";
-App::$strings["Permission denied. Access to this item may be restricted."] = "Permission refusée. L'accès à cet élément peut avoir été restreint.";
-App::$strings["Photo not available"] = "Photo non disponible";
-App::$strings["Use as profile photo"] = "Utiliser comme photo du profil";
-App::$strings["Use as cover photo"] = "Utilisez comme bannière";
-App::$strings["Private Photo"] = "Photo privée";
-App::$strings["Previous"] = "Précédent";
-App::$strings["View Full Size"] = "Voir en taille réelle";
-App::$strings["Next"] = "Suivant";
-App::$strings["Remove"] = "Retirer";
-App::$strings["Edit photo"] = "Modifier la photo";
-App::$strings["Rotate CW (right)"] = "Rotation horaire (droite)";
-App::$strings["Rotate CCW (left)"] = "Rotation anti-horaire (gauche)";
-App::$strings["Move photo to album"] = "Déplacer la photo dans l'album";
-App::$strings["Enter a new album name"] = "Entrer un nouveau nom d'album";
-App::$strings["or select an existing one (doubleclick)"] = "ou en sélectionner un existant (double-clic)";
-App::$strings["Caption"] = "Titre/légende";
-App::$strings["Add a Tag"] = "Ajouter une étiquette";
-App::$strings["Example: @bob, @Barbara_Jensen, @jim@example.com"] = "Exemple&nbsp;: @marc, @Barbara_Jensen, @charles@exemple.com, #Ile_de_France, #marathon";
-App::$strings["Flag as adult in album view"] = "Marquer comme \"adulte\" dans l'affichage de l'album";
-App::$strings["I like this (toggle)"] = "J'aime (oui/non)";
-App::$strings["I don't like this (toggle)"] = "Je n'aime pas (oui/non)";
-App::$strings["Share"] = "Partager";
-App::$strings["Please wait"] = "Merci de patienter";
-App::$strings["This is you"] = "C'est vous";
-App::$strings["Comment"] = "Commenter";
-App::$strings["Preview"] = "Aperçu";
-App::$strings["__ctx:title__ Likes"] = "Aime";
-App::$strings["__ctx:title__ Dislikes"] = "N'aime pas";
-App::$strings["__ctx:title__ Agree"] = "D'accord";
-App::$strings["__ctx:title__ Disagree"] = "Pas d'accord";
-App::$strings["__ctx:title__ Abstain"] = "Abstention";
-App::$strings["__ctx:title__ Attending"] = "Participations";
-App::$strings["__ctx:title__ Not attending"] = "Non-participations";
-App::$strings["__ctx:title__ Might attend"] = "Participation possible";
-App::$strings["View all"] = "Voir tout";
-App::$strings["__ctx:noun__ Like"] = array(
- 0 => "Aime",
- 1 => "Aime",
-);
-App::$strings["__ctx:noun__ Dislike"] = array(
- 0 => "N'aime pas",
- 1 => "N'aime pas",
-);
-App::$strings["Photo Tools"] = "Ouitls pour photos";
-App::$strings["In This Photo:"] = "Dans cette photo&nbsp;:";
-App::$strings["Map"] = "Carte";
-App::$strings["__ctx:noun__ Likes"] = "Aime";
-App::$strings["__ctx:noun__ Dislikes"] = "N'aime pas";
-App::$strings["Close"] = "Fermer";
-App::$strings["View Album"] = "Voir l'album";
-App::$strings["Recent Photos"] = "Photos récentes";
-App::$strings["Item not found"] = "Élément introuvable";
-App::$strings["Item is not editable"] = "Elément non modifiable";
-App::$strings["Edit post"] = "Modifier la publication";
-App::$strings["__ctx:acl__ Profile"] = "";
-App::$strings["network"] = "réseau";
-App::$strings["RSS"] = "RSS";
-App::$strings["Documentation Search"] = "Chercher dans la documentation";
-App::$strings["About"] = "À propos";
-App::$strings["Members"] = "Membres";
-App::$strings["Administrators"] = "Administrateurs";
-App::$strings["Developers"] = "Développeurs";
-App::$strings["Tutorials"] = "Tutoriels";
-App::$strings["\$Projectname Documentation"] = "Documentation \$Projectname";
-App::$strings["Contents"] = "Contenus";
-App::$strings["Bookmark added"] = "Favori ajouté";
-App::$strings["My Bookmarks"] = "Mes Favoris";
-App::$strings["My Connections Bookmarks"] = "Favoris de mes contacts";
+App::$strings["Create Channel"] = "Créer le canal";
+App::$strings["A channel is your identity on this network. It can represent a person, a blog, or a forum to name a few. Channels can make connections with other channels to share information with highly detailed permissions."] = "Un canal est votre identité sur ce réseau. Il peut représenter une personne, un blog, ou un forum par exemple. Les canaux peuvent entrer en contact les uns avec les autres pour partager des informations avec des permissions d'accès très fines.";
+App::$strings["or <a href=\"import\">import an existing channel</a> from another location."] = "ou <a href=\"import\">importer un canal existant</a> d'un autre serveur.";
+App::$strings["Channel removals are not allowed within 48 hours of changing the account password."] = "Il est impossible de supprimer un canal moins de 48 heures après avoir changé le mot de passe d'un compte.";
+App::$strings["Remove This Channel"] = "Supprimer ce canal";
+App::$strings["WARNING: "] = "AVERTISSEMENT&nbsp;:";
+App::$strings["This channel will be completely removed from the network. "] = "Ce canal sera complètement supprimé du réseau.";
+App::$strings["This action is permanent and can not be undone!"] = "Cette action est permanente et irréversible&nbsp;!";
+App::$strings["Please enter your password for verification:"] = "Merci de saisir votre mot de passe pour vérification&nbsp;:";
+App::$strings["Remove this channel and all its clones from the network"] = "Supprimer ce canal ainsi que tous ses clones sur le réseau";
+App::$strings["By default only the instance of the channel located on this hub will be removed from the network"] = "Par défaut, seule l'instance du canal présente sur ce hub sera supprimée du réseau";
+App::$strings["Remove Channel"] = "Supprimer le canal";
+App::$strings["Files: shared with me"] = "Fichiers&nbsp;: partagés avec moi";
+App::$strings["Name"] = "Nom";
+App::$strings["NEW"] = "NOUVEAU";
+App::$strings["Size"] = "Taille";
+App::$strings["Last Modified"] = "Modifié le";
+App::$strings["Remove all files"] = "Supprimer tous les fichiers";
+App::$strings["Remove this file"] = "Supprimer ce fichier";
+App::$strings["\$Projectname Server - Setup"] = "Serveur \$Projectname - configuration";
+App::$strings["Could not connect to database."] = "Impossible de se connecter à la base de données.";
+App::$strings["Could not connect to specified site URL. Possible SSL certificate or DNS issue."] = "Impossible de se connecter à l'URL indiquée. Problème potentiel de certificat SSL/TLS ou de DNS.";
+App::$strings["Could not create table."] = "Impossible de créer la table.";
+App::$strings["Your site database has been installed."] = "La base de données de votre site a été installée.";
+App::$strings["You may need to import the file \"install/schema_xxx.sql\" manually using a database client."] = "Vous pourriez avoir besoin d'importer le fichier \"install/schema_xxx.sql\" manuellement via un client de base de données (ex: phpmyadmin).";
+App::$strings["Please see the file \"install/INSTALL.txt\"."] = "Merci de consulter le fichier \"install/INSTALL.txt\".";
+App::$strings["System check"] = "Vérification du système";
+App::$strings["Check again"] = "Re-vérifier";
+App::$strings["Database connection"] = "Connexion à la base de données";
+App::$strings["In order to install \$Projectname we need to know how to connect to your database."] = "Pour installer \$Projectname, nous avons besoin de savoir comment se connecter à votre base de données.";
+App::$strings["Please contact your hosting provider or site administrator if you have questions about these settings."] = "Merci de contacter votre prestataire d'hébergement ou votre administrateur de site si vous avez des questions à propos de ces paramètres.";
+App::$strings["The database you specify below should already exist. If it does not, please create it before continuing."] = "La base de données que vous allez spécifier doit exister. Si ce n'est pas déjà le cas, merci de la créer avant de continuer.";
+App::$strings["Database Server Name"] = "Nom du serveur de base de données";
+App::$strings["Default is 127.0.0.1"] = "Par défaut 127.0.0.1";
+App::$strings["Database Port"] = "Port de la base de données";
+App::$strings["Communication port number - use 0 for default"] = "Numéro TCP du port - utilisez 0 pour la valeur par défaut";
+App::$strings["Database Login Name"] = "Identifiant de connexion à la Base de Données";
+App::$strings["Database Login Password"] = "Mot de passe de connexion à la Base de Données";
+App::$strings["Database Name"] = "Nom de la Base de Données";
+App::$strings["Database Type"] = "Type de base de données";
+App::$strings["Site administrator email address"] = "Adresse de courriel de l'administrateur du site";
+App::$strings["Your account email address must match this in order to use the web admin panel."] = "Votre compte devra utiliser la même adresse de courriel pour pouvoir utiliser l'administration web.";
+App::$strings["Website URL"] = "URL du site web";
+App::$strings["Please use SSL (https) URL if available."] = "Veuillez utiliser SSL/TLS (https) si disponible.";
+App::$strings["Please select a default timezone for your website"] = "Veuillez choisir un fuseau horaire par défaut pour votre site";
+App::$strings["Basic/Minimal Social Networking"] = "Réseau social de base";
+App::$strings["Standard Configuration (default)"] = "Configuration standard par défaut";
+App::$strings["Professional"] = "Professionel";
+App::$strings["Site settings"] = "Paramètres du site";
+App::$strings["Server Configuration/Role"] = "Configuration du site.";
+App::$strings["PHP version 5.5 or greater is required."] = "PHP version 5.5 ou supérieur est requis";
+App::$strings["PHP version"] = "Version de PHP";
+App::$strings["Could not find a command line version of PHP in the web server PATH."] = "Impossible de trouver une version CLI de PHP dans le PATH du serveur web.";
+App::$strings["If you don't have a command line version of PHP installed on server, you will not be able to run background polling via cron."] = "En l'absence de version CLI de PHP sur votre serveur, vous ne pourrez pas utiliser la synchronisation en arrière-plan via cron.";
+App::$strings["PHP executable path"] = "Chemin vers l'éxecutable PHP";
+App::$strings["Enter full path to php executable. You can leave this blank to continue the installation."] = "Entrez le chemin complet vers l'exécutable php. Vous pouvez continuer l'installation sans.";
+App::$strings["Command line PHP"] = "PHP en ligne de commande (CLI)";
+App::$strings["Unable to check command line PHP, as shell_exec() is disabled. This is required."] = "Impossible de vérifier la ligne de commande PHP, car shell_exec () est désactivé. Ceci est nécessaire.";
+App::$strings["The command line version of PHP on your system does not have \"register_argc_argv\" enabled."] = "La version CLI de PHP sur votre système n'a pas l'option \"register_argc_argv\" activée.";
+App::$strings["This is required for message delivery to work."] = "Elle est nécessaire pour la distribution des messages.";
+App::$strings["PHP register_argc_argv"] = "PHP register_argc_argv";
+App::$strings["Your max allowed total upload size is set to %s. Maximum size of one file to upload is set to %s. You are allowed to upload up to %d files at once."] = "Votre taille de téléversement maximale totale autorisée est fixée à %s. La taille maximale d'un seul fichier à téléverser est fixée à %s. Vous pouvez téléverser jusqu'à %d fichier(s) à la fois.";
+App::$strings["You can adjust these settings in the server php.ini file."] = "Vous pouvez ajuster ces paramètres dans le fichier php.ini du serveur.";
+App::$strings["PHP upload limits"] = "Limites de téléversement de PHP";
+App::$strings["Error: the \"openssl_pkey_new\" function on this system is not able to generate encryption keys"] = "Erreur&nbsp;: la fonction \"openssl_pkey_new\" de ce système n'est pas capable de générer des clefs de chiffrement";
+App::$strings["If running under Windows, please see \"http://www.php.net/manual/en/openssl.installation.php\"."] = "Si vous êtes sur un serveur Windows, merci de consulter \"http://www.php.net/manual/fr/openssl.installation.php\".";
+App::$strings["Generate encryption keys"] = "Générer les clefs de chiffrement";
+App::$strings["libCurl PHP module"] = "module PHP libCurl";
+App::$strings["GD graphics PHP module"] = "module PHP GD graphics";
+App::$strings["OpenSSL PHP module"] = "module PHP OpenSSL";
+App::$strings["PDO database PHP module"] = "module PDO de la base de données PHP";
+App::$strings["mb_string PHP module"] = "module PHP mb_string";
+App::$strings["xml PHP module"] = "module PHP xml";
+App::$strings["Apache mod_rewrite module"] = "module Apache mod_rewrite";
+App::$strings["Error: Apache webserver mod-rewrite module is required but not installed."] = "Erreur&nbsp;: le module mod-rewrite du serveur web Apache est requis, mais pas installé.";
+App::$strings["exec"] = "exécuter";
+App::$strings["Error: exec is required but is either not installed or has been disabled in php.ini"] = "Erreur: exec est requis mais soit il n'est pas installé, soit il a été désactivé dans php.ini";
+App::$strings["shell_exec"] = "shell_exec";
+App::$strings["Error: shell_exec is required but is either not installed or has been disabled in php.ini"] = "Erreur: shell_exec est requis mais soit il n'est pas installé, soit il a été désactivé dans php.ini";
+App::$strings["Error: libCURL PHP module required but not installed."] = "Erreur&nbsp;: le module libCURL de PHP est requis, mais pas installé.";
+App::$strings["Error: GD graphics PHP module with JPEG support required but not installed."] = "Erreur&nbsp;: le module GD de PHP avec support JPEG est requis, mais pas installé.";
+App::$strings["Error: openssl PHP module required but not installed."] = "Erreur&nbsp;: le module openssl de PHP est requis, mais pas installé.";
+App::$strings["Error: PDO database PHP module required but not installed."] = "Erreur: le module PDO de base de données PHP est requis mais n'est pas installé.";
+App::$strings["Error: mb_string PHP module required but not installed."] = "Erreur&nbsp;: le module mb_string de PHP est requis, mais pas installé.";
+App::$strings["Error: xml PHP module required for DAV but not installed."] = "Erreur&nbsp;: le module xml de PHP est requis pour le DAV, mais pas installé.";
+App::$strings["The web installer needs to be able to create a file called \".htconfig.php\" in the top folder of your web server and it is unable to do so."] = "L'installeur web a besoin de créer un fichier \".htconfig.php\" à la racine de votre serveur web, mais en est incapable.";
+App::$strings["This is most often a permission setting, as the web server may not be able to write files in your folder - even if you can."] = "C'est généralement lié à un problème de droits, à cause duquel le serveur web est interdit d'écriture dans le répertoire concerné - alors que votre propre utilisateur a le droit.";
+App::$strings["At the end of this procedure, we will give you a text to save in a file named .htconfig.php in your Red top folder."] = "Au terme de cette procédure, nous vous transmettrons un texte à sauvegarder dans un fichier nommé .htconfig.php, à la racine de votre installation de \$Projectname.";
+App::$strings["You can alternatively skip this procedure and perform a manual installation. Please see the file \"install/INSTALL.txt\" for instructions."] = "Autrement, vous pouvez contourner toute cette procédure et réaliser l'installation manuellement. Merci de consulter le fichier \"install/INSTALL.txt\" pour les instructions détaillées.";
+App::$strings[".htconfig.php is writable"] = "Le fichier .htconfig.php est accessible en écriture";
+App::$strings["This software uses the Smarty3 template engine to render its web views. Smarty3 compiles templates to PHP to speed up rendering."] = "Ce logiciel utilise Smarty3 comme moteur de modèles pour afficher ses vues Web. Smarty3 compile ses modèles en PHP pour accélérer le rendu.";
+App::$strings["In order to store these compiled templates, the web server needs to have write access to the directory %s under the top level web folder."] = "Afin de stocker ces modèles compilés, le serveur Web doit disposer d'un accès en écriture au répertoire %s selon le dossier Web racine.";
+App::$strings["Please ensure that the user that your web server runs as (e.g. www-data) has write access to this folder."] = "Merci de vous assurer que l'utilisateur sous lequel le serveur web tourne (le plus souvent, www-data) a bien l'autorisation d'écrire dans ce répertoire.";
+App::$strings["Note: as a security measure, you should give the web server write access to %s only--not the template files (.tpl) that it contains."] = "Note: Comme mesure de sécurité, assurez vous de donner les droits d'écriture au serveur web sur %s uniquement, pas sur les fichiers individuels (.tpl) qu'il contient.";
+App::$strings["%s is writable"] = "Permission d'écriture sur %s activée";
+App::$strings["This software uses the store directory to save uploaded files. The web server needs to have write access to the store directory under the top level web folder"] = "Ce logiciel utilise le répertoire de stockage pour enregistrer les fichiers téléversés. Le serveur Web doit disposer d'un accès en écriture au répertoire de stockage selon le dossier web racine.";
+App::$strings["store is writable"] = "'store' est accessible en écriture";
+App::$strings["SSL certificate cannot be validated. Fix certificate or disable https access to this site."] = "Le certificat SSL/TLS n'a pas pu être validé. Merci de le corriger, ou de désactiver l'accès https à ce site (non recommandé).";
+App::$strings["If you have https access to your website or allow connections to TCP port 443 (the https: port), you MUST use a browser-valid certificate. You MUST NOT use self-signed certificates!"] = "Si votre serveur accepte les connexions https ou s'il permet les connexions sur le port TCP 443 (le port utilisé par le protocole https), vous DEVEZ utiliser un certificat valide. Vous ne DEVEZ PAS utiliser un certificat que vous avez vous-mêmes signé&nbsp;!";
+App::$strings["This restriction is incorporated because public posts from you may for example contain references to images on your own hub."] = "Nous avons ajouté cette contrainte pour éviter que vos publications publiques ne fassent référence par exemple à des images sur votre propre hub.";
+App::$strings["If your certificate is not recognized, members of other sites (who may themselves have valid certificates) will get a warning message on their own site complaining about security issues."] = "Si votre certificat n'est pas reconnu, les membres des autres sites (qui eux peuvent avoir des certificats valides) recevront des messages d'avertissement sur leur propre site se plaignant de problèmes de sécurité.";
+App::$strings["This can cause usability issues elsewhere (not just on your own site) so we must insist on this requirement."] = "Ceci peut causer des problèmes d'ergonomie ailleurs (pas seulement sur votre site), nous devons donc insister sur ce prérequis.";
+App::$strings["Providers are available that issue free certificates which are browser-valid."] = "Il existe des autorités de certification qui vous fourniront gratuitement un certificat valide.";
+App::$strings["If you are confident that the certificate is valid and signed by a trusted authority, check to see if you have failed to install an intermediate cert. These are not normally required by browsers, but are required for server-to-server communications."] = "Si vous êtes certain que le certificat est valide et signé par une autorité de confiance, vérifiez si l'installation d'un certificat intermédiaire aurait échoué. Ceux-ci ne sont normalement pas requis par les navigateurs, mais ils sont requis pour les communications entre serveurs.";
+App::$strings["SSL certificate validation"] = "Validation du certificat SSL/TLS";
+App::$strings["Url rewrite in .htaccess is not working. Check your server configuration.Test: "] = "La réécriture d'URL définie dans le .htaccess ne fonctionne pas. Vérifiez votre configuration serveur. Test&nbsp;:";
+App::$strings["Url rewrite is working"] = "La réécriture d'URL fonctionne";
+App::$strings["The database configuration file \".htconfig.php\" could not be written. Please use the enclosed text to create a configuration file in your web server root."] = "Le fichier de configuration de la base de données - \".htconfig.php\" - ne peut être écrit. Merci de copier le texte généré dans un fichier à ce nom, à la racine de votre serveur web.";
+App::$strings["Errors encountered creating database tables."] = "Erreurs rencontrées pendant la création de tables de BDD.";
+App::$strings["<h1>What next</h1>"] = "<h1>Et maintenant</h1>";
+App::$strings["IMPORTANT: You will need to [manually] setup a scheduled task for the poller."] = "IMPORTANT&nbsp;: Vous devez créer [manuellement] une tâche planifiée pour les mises à jour du réseau.";
App::$strings["Continue"] = "Continuer";
App::$strings["Premium Channel Setup"] = "Configuration du canal VIP";
App::$strings["Enable premium channel connection restrictions"] = "Activer les restrictions liées au canal VIP";
@@ -207,166 +345,57 @@ App::$strings["Potential connections will then see the following text before pro
App::$strings["By continuing, I certify that I have complied with any instructions provided on this page."] = "En continuant, je certifie que je me suis conformé à toutes les instructions indiquées sur cette page.";
App::$strings["(No specific instructions have been provided by the channel owner.)"] = "(Aucune instruction spécifique n'a été fournie par le propriétaire du canal.)";
App::$strings["Restricted or Premium Channel"] = "Canal VIP ou restreint";
-App::$strings["# Accounts"] = "# Comptes";
-App::$strings["# blocked accounts"] = "# comptes bloqués";
-App::$strings["# expired accounts"] = "# comptes expirés";
-App::$strings["# expiring accounts"] = "# comptes expirant";
-App::$strings["# Channels"] = "# Canaux";
-App::$strings["# primary"] = "# primaire";
-App::$strings["# clones"] = "# clones";
-App::$strings["Message queues"] = "File des messages";
-App::$strings["Your software should be updated"] = "Votre logiciel doit d'être mis à jour";
-App::$strings["Administration"] = "Administration";
-App::$strings["Summary"] = "Résumé";
-App::$strings["Registered accounts"] = "Comptes enregistrés";
-App::$strings["Pending registrations"] = "Inscriptions en attente";
-App::$strings["Registered channels"] = "Canaux enregistrés";
-App::$strings["Active plugins"] = "Greffons actifs";
-App::$strings["Version"] = "Version";
-App::$strings["Repository version (master)"] = "Version du dépôt (maître)";
-App::$strings["Repository version (dev)"] = "Version du dépôt (développeur)";
-App::$strings["Block Name"] = "Nom du Bloc";
-App::$strings["Insert web link"] = "Insérer lien web";
-App::$strings["Title (optional)"] = "Titre (facultatif)";
-App::$strings["Edit Block"] = "Modifier le bloc";
-App::$strings["Invalid item."] = "Élément invalide.";
-App::$strings["Channel not found."] = "Canal introuvable.";
-App::$strings["Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."] = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";
-App::$strings["Save to Folder:"] = "Classer dans le dossier&nbsp;:";
-App::$strings["- select -"] = "- choisir -";
-App::$strings["Save"] = "Enregistrer";
-App::$strings["sent you a private message"] = "vous a envoyé un message privé";
-App::$strings["added your channel"] = "a ajouté votre canal";
-App::$strings["g A l F d"] = "g A l F d";
-App::$strings["[today]"] = "[aujourd'hui]";
-App::$strings["posted an event"] = "a publié un événement";
-App::$strings["Blocked"] = "Bloqué(e)";
-App::$strings["Ignored"] = "Ignoré(e)";
-App::$strings["Hidden"] = "Caché";
-App::$strings["Archived"] = "Archivé";
-App::$strings["New"] = "Nouveautés";
-App::$strings["All"] = "Tous";
-App::$strings["New Connections"] = "Nouveaux contacts";
-App::$strings["Show pending (new) connections"] = "Voir les (nouveaux) contacts en attente";
-App::$strings["All Connections"] = "Tous les contacts";
-App::$strings["Show all connections"] = "Voir tous les contacts";
-App::$strings["Only show blocked connections"] = "Ne montrer que les contacts bloqués";
-App::$strings["Only show ignored connections"] = "Ne montrer que les contacts ignorés";
-App::$strings["Only show archived connections"] = "Ne montrer que les contacts archivés";
-App::$strings["Only show hidden connections"] = "Ne montrer que les contacts cachés";
-App::$strings["Pending approval"] = "En attente de validation";
-App::$strings["%1\$s [%2\$s]"] = "%1\$s [%2\$s]";
-App::$strings["Edit connection"] = "Modifier le contact";
-App::$strings["Delete connection"] = "Supprimer le contact";
-App::$strings["Channel address"] = "Adresse du canal";
-App::$strings["Network"] = "Réseau";
-App::$strings["Call"] = "Appeler";
-App::$strings["Status"] = "État";
-App::$strings["Connected"] = "Connecté";
-App::$strings["Approve connection"] = "Valider le contact";
-App::$strings["Approve"] = "Approuver";
-App::$strings["Ignore connection"] = "Ignorer le contact";
-App::$strings["Ignore"] = "Ignorer";
-App::$strings["Recent activity"] = "Activité récente";
-App::$strings["Connections"] = "Contacts";
-App::$strings["Search"] = "Recherche";
-App::$strings["Search your connections"] = "Chercher parmi vos contacts";
-App::$strings["Connections search"] = "Chercher des contacts";
-App::$strings["Find"] = "Trouver";
-App::$strings["Image uploaded but image cropping failed."] = "L'image a été téléversée, mais le recadrage a échoué.";
-App::$strings["Cover Photos"] = "Photos de couverture";
-App::$strings["Image resize failed."] = "Le redimensionnement de l'image a échoué.";
-App::$strings["Unable to process image"] = "Impossible de traiter l'image";
-App::$strings["Image upload failed."] = "Le téléversement de l'image a échoué.";
-App::$strings["Unable to process image."] = "Impossible de traîter l'image.";
-App::$strings["female"] = "femme";
-App::$strings["%1\$s updated her %2\$s"] = "%1\$s a mis à jour son %2\$s";
-App::$strings["male"] = "homme";
-App::$strings["%1\$s updated his %2\$s"] = "%1\$s a mis à jour son %2\$s";
-App::$strings["%1\$s updated their %2\$s"] = "%1\$s a mis a jour sa %2\$s";
-App::$strings["cover photo"] = "Photo principale";
-App::$strings["Photo not available."] = "Photo inaccessible.";
-App::$strings["Upload File:"] = "Téléverser fichier&nbsp;:";
-App::$strings["Select a profile:"] = "Choisir un profil&nbsp;:";
-App::$strings["Upload Cover Photo"] = "Téléverser une photo de couverture";
-App::$strings["or"] = "ou";
-App::$strings["skip this step"] = "passer cette étape";
-App::$strings["select a photo from your photo albums"] = "choisir une photo dans vos albums";
-App::$strings["Crop Image"] = "Recadrer l'image";
-App::$strings["Please adjust the image cropping for optimum viewing."] = "Merci d'ajuster le cadre pour une visualisation optimale.";
-App::$strings["Done Editing"] = "J'ai terminé";
+App::$strings["Queue Statistics"] = "Statistiques de file d'attente";
+App::$strings["Total Entries"] = "Nombre d'entrées total";
+App::$strings["Priority"] = "Priorité";
+App::$strings["Destination URL"] = "URL de destination";
+App::$strings["Mark hub permanently offline"] = "Marquer le hub comme étant hors ligne de manière permanente";
+App::$strings["Empty queue for this hub"] = "Vider la file d'attente pour ce hub";
+App::$strings["Last known contact"] = "Dernier contact connu";
App::$strings["Off"] = "Inactif";
App::$strings["On"] = "Actif";
App::$strings["Lock feature %s"] = "Verrouiller fonctionnalité %s";
App::$strings["Manage Additional Features"] = "Gérer les fonctionnalités additionnelles";
-App::$strings["Log settings updated."] = "Paramètres du journal mis à jour.";
-App::$strings["Logs"] = "Journaux";
-App::$strings["Clear"] = "Vider";
-App::$strings["Debugging"] = "Débogage";
-App::$strings["Log file"] = "Fichier du journal";
-App::$strings["Must be writable by web server. Relative to your top-level webserver directory."] = "Doit être permettre d'écrire par le serveur web. En relation avec le répertoire de votre site.";
-App::$strings["Log level"] = "Niveau de journalisation";
-App::$strings["New Profile Field"] = "Nouveau champ de profil";
-App::$strings["Field nickname"] = "Nom court du champ";
-App::$strings["System name of field"] = "Nom système du champ";
-App::$strings["Input type"] = "Type de champ";
-App::$strings["Field Name"] = "Nom du champ";
-App::$strings["Label on profile pages"] = "Étiquette sur les pages de profil";
-App::$strings["Help text"] = "Aide à la saisie";
-App::$strings["Additional info (optional)"] = "Informations additionnelles (facultatif)";
-App::$strings["Field definition not found"] = "Définition du champ introuvable";
-App::$strings["Edit Profile Field"] = "Modifier le champ de profil";
-App::$strings["Profile Fields"] = "Champs de profil";
-App::$strings["Basic Profile Fields"] = "Champs de profil de base";
-App::$strings["Advanced Profile Fields"] = "Champs de profil avancés";
-App::$strings["(In addition to basic fields)"] = "(en plus des champs de base)";
-App::$strings["All available fields"] = "Tous les champs disponibles";
-App::$strings["Custom Fields"] = "Champs personnalisés";
-App::$strings["Create Custom Field"] = "Créer un champ personnalisé";
-App::$strings["By default, unfiltered HTML is allowed in embedded media. This is inherently insecure."] = "Par défaut le code HTML est autorisé pour les média par exemple les vidéos embarquées. Cependant cela peut poser un faille de sécurité.";
-App::$strings["The recommended setting is to only allow unfiltered HTML from the following sites:"] = "Ce paramétrage autorisant le HTML pour les sites suivants.";
-App::$strings["https://youtube.com/<br />https://www.youtube.com/<br />https://youtu.be/<br />https://vimeo.com/<br />https://soundcloud.com/<br />"] = "https://youtube.com/<br />https://www.youtube.com/<br />https://youtu.be/<br />https://vimeo.com/<br />https://soundcloud.com/<br />";
-App::$strings["All other embedded content will be filtered, <strong>unless</strong> embedded content from that site is explicitly blocked."] = "Les contenus html seront filtrés <strong>sauf</strong> ceux des sites explicitement bloqués.";
-App::$strings["Security"] = "Sécurité";
-App::$strings["Block public"] = "Bloquer \"public\"";
-App::$strings["Check to block public access to all otherwise public personal pages on this site unless you are currently authenticated."] = "Sélectionner pour ne permettre l'accès aux pages personnelles \"publiques\" du site qu'aux personnes authentifiées, pas aux personnes anonymes du web.";
-App::$strings["Set \"Transport Security\" HTTP header"] = "Paramétrer \"Transport Security\" pour l'entête HTTP";
-App::$strings["Set \"Content Security Policy\" HTTP header"] = "Paramétrer \"Content Security Policy\" pour l'entête HTTP";
-App::$strings["Allowed email domains"] = "Domaines de courriels autorisés";
-App::$strings["Comma separated list of domains which are allowed in email addresses for registrations to this site. Wildcards are accepted. Empty to allow any domains"] = "Liste de noms de domaines séparés par des virgules dont les adresses de courriel seront autorisées lors de l'inscription à ce site. Les caractères génériques (*) sont acceptés. Laissez vide pour accepter tous les domaines.";
-App::$strings["Not allowed email domains"] = "Domaines de courriel non autorisés";
-App::$strings["Comma separated list of domains which are not allowed in email addresses for registrations to this site. Wildcards are accepted. Empty to allow any domains, unless allowed domains have been defined."] = "Liste de noms de domaines - séparés par des virgules - dont les adresses de courriel ne seront pas autorisées lors de l'inscription à ce site. Les caractères génériques (*) sont acceptés. Laissez vide pour accepter tous les domaines, sauf si des domaines autorisés ont été définis.";
-App::$strings["Allow communications only from these sites"] = "N'autorisez que les communications venant de ces sites";
-App::$strings["One site per line. Leave empty to allow communication from anywhere by default"] = "Un site par ligne. Laisser vide pour autoriser les communications de tous les sites, par défaut.";
-App::$strings["Block communications from these sites"] = "Bloquer les communications de ces sites";
-App::$strings["Allow communications only from these channels"] = "N'autoriser que les communications de ces canaux";
-App::$strings["One channel (hash) per line. Leave empty to allow from any channel by default"] = "Un canal (adresse) par ligne. Laisser vide pour autoriser les communications de tous les canaux, par défaut";
-App::$strings["Block communications from these channels"] = "Bloquer les communications de ces canaux";
-App::$strings["Only allow embeds from secure (SSL) websites and links."] = "Seuls les sites et liens sécurisés sont autorisé pour intégrer du code HTML";
-App::$strings["Allow unfiltered embedded HTML content only from these domains"] = "Autoriser le contenu HTML embarqué uniquement à partir de ces domaines";
-App::$strings["One site per line. By default embedded content is filtered."] = "Un site par ligne. Par défaut le contenu embarqué est filtré.";
-App::$strings["Block embedded HTML from these domains"] = "Bloquer le HTML embarqué à partir de ces domaines";
-App::$strings["Theme settings updated."] = "Paramètres du thème mis à jour.";
-App::$strings["No themes found."] = "Aucun thème trouvé.";
+App::$strings["Update has been marked successful"] = "La mise à jour a été marquée comme réussie";
+App::$strings["Executing %s failed. Check system logs."] = "L'éxecution de %s a échoué. Merci de vérifier les journaux du système.";
+App::$strings["Update %s was successfully applied."] = "La mise à jour %s a été appliquée avec succès.";
+App::$strings["Update %s did not return a status. Unknown if it succeeded."] = "La mise à jour %s n'a pas retourné d'information. Impossible de savoir si elle a réussi ou non.";
+App::$strings["Update function %s could not be found."] = "La fonction de mise à jour %s est introuvable.";
+App::$strings["No failed updates."] = "Aucune mise à jour défaillante.";
+App::$strings["Failed Updates"] = "Mises à jour défaillantes";
+App::$strings["Mark success (if update was manually applied)"] = "Marquer comme réussie (si la mise à jour a été réalisée manuellement)";
+App::$strings["Attempt to execute this update step automatically"] = "Tenter de réaliser cette étape de mise à jour automatiquement";
+App::$strings["Item not found."] = "Élément introuvable";
+App::$strings["Plugin %s disabled."] = "Greffon %s désactivé.";
+App::$strings["Plugin %s enabled."] = "Greffon %s activé.";
App::$strings["Disable"] = "Désactiver";
App::$strings["Enable"] = "Activer";
-App::$strings["Screenshot"] = "Capture d'écran";
-App::$strings["Themes"] = "Thèmes";
+App::$strings["Administration"] = "Administration";
+App::$strings["Plugins"] = "Greffons";
App::$strings["Toggle"] = "(Dés)activer";
App::$strings["Settings"] = "Paramètres";
App::$strings["Author: "] = "Auteur&nbsp;:";
App::$strings["Maintainer: "] = "Maintenu par&nbsp;:";
-App::$strings["[Experimental]"] = "[Expérimental]";
-App::$strings["[Unsupported]"] = "[Non maintenu]";
-App::$strings["Password changed for account %d."] = "Le mot de passe a été modifié pour le compte %d.";
-App::$strings["Account settings updated."] = "Paramétrage du compte mis à jour";
-App::$strings["Account not found."] = "Compte introuvable";
-App::$strings["Account Edit"] = "Modifier votre compte";
-App::$strings["New Password"] = "Nouveau mot de passe";
-App::$strings["New Password again"] = "Nouveau mot de passe (encore)";
-App::$strings["Technical skill level"] = "Niveau technique";
-App::$strings["Account language (for emails)"] = "Langue de votre compte (pour email)";
-App::$strings["Service class"] = "Classe de service";
+App::$strings["Minimum project version: "] = "Version minimum du projet&nbsp;:";
+App::$strings["Maximum project version: "] = "Version maximum du projet&nbsp;:";
+App::$strings["Minimum PHP version: "] = "Version minimum de PHP&nbsp;:";
+App::$strings["Compatible Server Roles: "] = "Rôles du serveur ";
+App::$strings["Requires: "] = "Requiert&nbsp;:";
+App::$strings["Disabled - version incompatibility"] = "Désactivé - version incompatible";
+App::$strings["Enter the public git repository URL of the plugin repo."] = "Entrer l'URL du dépôt git public pour les greffons";
+App::$strings["Plugin repo git URL"] = "URL du git pour les plugin";
+App::$strings["Custom repo name"] = "Nom du dépôt";
+App::$strings["(optional)"] = "(en option)";
+App::$strings["Download Plugin Repo"] = "Télécharger l'extension";
+App::$strings["Install new repo"] = "Installer un nouveau dépôt";
+App::$strings["Install"] = "Installer";
+App::$strings["Cancel"] = "Annuler";
+App::$strings["Manage Repos"] = "Gérer les dépôts";
+App::$strings["Installed Plugin Repositories"] = "Dépôt des extensions installées";
+App::$strings["Install a New Plugin Repository"] = "Installer un nouveau dépôt pour extensions";
+App::$strings["Update"] = "Mise à jour";
+App::$strings["Switch branch"] = "Changer de branche";
+App::$strings["Remove"] = "Retirer";
App::$strings["%s account blocked/unblocked"] = array(
0 => "%s compte bloqué/débloqué",
1 => "%s comptes bloqués/débloqués",
@@ -385,6 +414,7 @@ App::$strings["Registrations waiting for confirm"] = "Inscriptions en attente d'
App::$strings["Request date"] = "Date de la demande";
App::$strings["Email"] = "Courriel";
App::$strings["No registrations."] = "Pas d'inscriptions.";
+App::$strings["Approve"] = "Approuver";
App::$strings["Deny"] = "Refuser";
App::$strings["Block"] = "Bloquer";
App::$strings["Unblock"] = "Débloquer";
@@ -396,6 +426,13 @@ App::$strings["Expires"] = "Expire le";
App::$strings["Service Class"] = "Classe de service";
App::$strings["Selected accounts will be deleted!\\n\\nEverything these accounts had posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "Les comptes sélectionnés seront supprimés&nbsp;!\\n\\nTout ce que ces utilisateurs ont publié sur ce site sera détruit de manière définitive&nbsp;!\\n\\nÊtes-vous sûr&nbsp;?";
App::$strings["The account {0} will be deleted!\\n\\nEverything this account has posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "Le compte {0} sera supprimé&nbsp;!\\n\\nTout ce que cet utilisateur a publié sur ce site sera détruit de manière définitive&nbsp;!\\n\\nÊtes-vous sûr&nbsp;?";
+App::$strings["Log settings updated."] = "Paramètres du journal mis à jour.";
+App::$strings["Logs"] = "Journaux";
+App::$strings["Clear"] = "Vider";
+App::$strings["Debugging"] = "Débogage";
+App::$strings["Log file"] = "Fichier du journal";
+App::$strings["Must be writable by web server. Relative to your top-level webserver directory."] = "Doit être permettre d'écrire par le serveur web. En relation avec le répertoire de votre site.";
+App::$strings["Log level"] = "Niveau de journalisation";
App::$strings["%s channel censored/uncensored"] = array(
0 => "%s canal censuré/dé-censuré",
1 => "%s canaux censurés/dé-censurés",
@@ -421,20 +458,17 @@ App::$strings["Allow Code"] = "Autoriser le code";
App::$strings["Disallow Code"] = "Interdire le code";
App::$strings["Channel"] = "Canal";
App::$strings["UID"] = "UID";
-App::$strings["Address"] = "Adresse";
App::$strings["Selected channels will be deleted!\\n\\nEverything that was posted in these channels on this site will be permanently deleted!\\n\\nAre you sure?"] = "Les canaux sélectionnés seront supprimés&nbsp;!\\n\\nTout ce qui a été publié dans ces canaux sur ce site sera définitivement supprimé&nbsp;!\\n\\nÊtes-vous sûr&nbsp;?";
App::$strings["The channel {0} will be deleted!\\n\\nEverything that was posted in this channel on this site will be permanently deleted!\\n\\nAre you sure?"] = "Le canal {0} sera supprimé&nbsp;!\\n\\nTout ce qui a été publié sur ce canal sera définitivement supprimé&nbsp;!\\n\\nÊtes-vous sûr(e)&nbsp;?";
-App::$strings["Update has been marked successful"] = "La mise à jour a été marquée comme réussie";
-App::$strings["Executing %s failed. Check system logs."] = "L'éxecution de %s a échoué. Merci de vérifier les journaux du système.";
-App::$strings["Update %s was successfully applied."] = "La mise à jour %s a été appliquée avec succès.";
-App::$strings["Update %s did not return a status. Unknown if it succeeded."] = "La mise à jour %s n'a pas retourné d'information. Impossible de savoir si elle a réussi ou non.";
-App::$strings["Update function %s could not be found."] = "La fonction de mise à jour %s est introuvable.";
-App::$strings["No failed updates."] = "Aucune mise à jour défaillante.";
-App::$strings["Failed Updates"] = "Mises à jour défaillantes";
-App::$strings["Mark success (if update was manually applied)"] = "Marquer comme réussie (si la mise à jour a été réalisée manuellement)";
-App::$strings["Attempt to execute this update step automatically"] = "Tenter de réaliser cette étape de mise à jour automatiquement";
+App::$strings["Theme settings updated."] = "Paramètres du thème mis à jour.";
+App::$strings["No themes found."] = "Aucun thème trouvé.";
+App::$strings["Screenshot"] = "Capture d'écran";
+App::$strings["Themes"] = "Thèmes";
+App::$strings["[Experimental]"] = "[Expérimental]";
+App::$strings["[Unsupported]"] = "[Non maintenu]";
App::$strings["Site settings updated."] = "Paramètres du site sauvegardés.";
App::$strings["Default"] = "Défaut";
+App::$strings["%s - (Incompatible)"] = "";
App::$strings["mobile"] = "mobile";
App::$strings["experimental"] = "expérimental";
App::$strings["unsupported"] = "non maintenu";
@@ -443,9 +477,6 @@ App::$strings["My site is not a public server"] = "Mon site n'est pas un serveur
App::$strings["My site has paid access only"] = "Mon site est à accès payant uniquement";
App::$strings["My site has free access only"] = "Mon site est gratuit uniquement";
App::$strings["My site offers free accounts with optional paid upgrades"] = "Mon site offre des comptes gratuits avec des améliorations payantes facultatives";
-App::$strings["Basic/Minimal Social Networking"] = "Réseau social de base";
-App::$strings["Standard Configuration (default)"] = "Configuration standard par défaut";
-App::$strings["Professional"] = "Professionel";
App::$strings["Beginner/Basic"] = "Pour débutant/ de base";
App::$strings["Novice - not skilled but willing to learn"] = "Novice - pas qualifiés, mais prêt à apprendre";
App::$strings["Intermediate - somewhat comfortable"] = "Intermédiaire - assez confortable";
@@ -453,11 +484,11 @@ App::$strings["Advanced - very comfortable"] = "Niveau avancé - trés confortab
App::$strings["Expert - I can write computer code"] = "Niveau expert - Je peux programmer";
App::$strings["Wizard - I probably know more than you do"] = "Crack - J'en sais probablement plus que beaucoup";
App::$strings["Site"] = "Site";
+App::$strings["Registration"] = "Inscription";
App::$strings["File upload"] = "Envoi de fichier";
App::$strings["Policies"] = "Stratégies";
App::$strings["Advanced"] = "Avancé";
App::$strings["Site name"] = "Nom du site";
-App::$strings["Server Configuration/Role"] = "Configuration du site.";
App::$strings["Site default technical skill level"] = "Niveau technique par défaut pour le site";
App::$strings["Used to provide a member experience matched to technical comfort level"] = "Utilisé pour fournir une expérience utilisateur correspondant au niveau de confort technique";
App::$strings["Lock the technical skill level setting"] = "Bloque le niveau technique du paramétrage";
@@ -500,6 +531,9 @@ App::$strings["Login on Homepage"] = "Connexion sur la page d'accueil";
App::$strings["Present a login box to visitors on the home page if no other content has been configured."] = "Présenter une boîte de dialogue de connexion aux visiteurs sur la page d'accueil si aucun autre contenu n'a été configuré.";
App::$strings["Enable context help"] = "Permettre l'aide contextuelle";
App::$strings["Display contextual help for the current page when the help button is pressed."] = "Afficher l'aide contextuel en cliquant sur le bouton aide.";
+App::$strings["Reply-to email address for system generated email."] = "";
+App::$strings["Sender (From) email address for system generated email."] = "";
+App::$strings["Name of email sender for system generated email."] = "";
App::$strings["Directory Server URL"] = "URL du serveur d'annuaire";
App::$strings["Default directory server"] = "Serveur d'annuaire par défaut";
App::$strings["Proxy user"] = "Utilisateur du proxy";
@@ -516,121 +550,485 @@ App::$strings["Maximum Load Average"] = "Charge maximale moyenne";
App::$strings["Maximum system load before delivery and poll processes are deferred - default 50."] = "Charge système maximale au-delà de laquelle distribution et scrutation sont reportées - par défaut 50.";
App::$strings["Expiration period in days for imported (grid/network) content"] = "Délai d'expiration pour le contenu importé (réseau)";
App::$strings["0 for no expiration of imported content"] = "0 pour ne pas expirer le contenu importé";
-App::$strings["Plugin %s disabled."] = "Greffon %s désactivé.";
-App::$strings["Plugin %s enabled."] = "Greffon %s activé.";
-App::$strings["Plugins"] = "Greffons";
-App::$strings["Minimum project version: "] = "Version minimum du projet&nbsp;:";
-App::$strings["Maximum project version: "] = "Version maximum du projet&nbsp;:";
-App::$strings["Minimum PHP version: "] = "Version minimum de PHP&nbsp;:";
-App::$strings["Compatible Server Roles: "] = "Rôles du serveur ";
-App::$strings["Requires: "] = "Requiert&nbsp;:";
-App::$strings["Disabled - version incompatibility"] = "Désactivé - version incompatible";
-App::$strings["Enter the public git repository URL of the plugin repo."] = "Entrer l'URL du dépôt git public pour les greffons";
-App::$strings["Plugin repo git URL"] = "URL du git pour les plugin";
-App::$strings["Custom repo name"] = "Nom du dépôt";
-App::$strings["(optional)"] = "(en option)";
-App::$strings["Download Plugin Repo"] = "Télécharger l'extension";
-App::$strings["Install new repo"] = "Installer un nouveau dépôt";
-App::$strings["Install"] = "Installer";
-App::$strings["Cancel"] = "Annuler";
-App::$strings["Manage Repos"] = "Gérer les dépôts";
-App::$strings["Installed Plugin Repositories"] = "Dépôt des extensions installées";
-App::$strings["Install a New Plugin Repository"] = "Installer un nouveau dépôt pour extensions";
-App::$strings["Update"] = "Mise à jour";
-App::$strings["Switch branch"] = "Changer de branche";
-App::$strings["Queue Statistics"] = "Statistiques de file d'attente";
-App::$strings["Total Entries"] = "Nombre d'entrées total";
-App::$strings["Priority"] = "Priorité";
-App::$strings["Destination URL"] = "URL de destination";
-App::$strings["Mark hub permanently offline"] = "Marquer le hub comme étant hors ligne de manière permanente";
-App::$strings["Empty queue for this hub"] = "Vider la file d'attente pour ce hub";
-App::$strings["Last known contact"] = "Dernier contact connu";
-App::$strings["Items tagged with: %s"] = "Eléments étiquetés avec&nbsp;: %s";
-App::$strings["Search results for: %s"] = "Résultats de recherche pour&nbsp;: %s";
-App::$strings["Layout Name"] = "Nom de la mise en page";
-App::$strings["Layout Description (Optional)"] = "Description de la mise en page (facultatif)";
-App::$strings["Edit Layout"] = "Modifier la mise en page";
-App::$strings["Page link"] = "Lien";
-App::$strings["Edit Webpage"] = "Modifier la page web";
-App::$strings["Like/Dislike"] = "Aime/n'aime pas";
-App::$strings["This action is restricted to members."] = "Cette action est réservée aux membres.";
-App::$strings["Please <a href=\"rmagic\">login with your \$Projectname ID</a> or <a href=\"register\">register as a new \$Projectname member</a> to continue."] = "S'il vous plait, <a href=\"rmagic\">identifiez vous avec votre identifant de \$Projectname </a> ou <a href=\"register\">inscrivez vous comme nouveau membre de \$Projectname </a> pour continuer.";
-App::$strings["Invalid request."] = "Requête invalide.";
-App::$strings["channel"] = "canal";
-App::$strings["thing"] = "chose";
-App::$strings["Channel unavailable."] = "Canal indisponible.";
-App::$strings["Previous action reversed."] = "Action précédente annulée.";
-App::$strings["photo"] = "photo";
-App::$strings["status"] = "état";
-App::$strings["event"] = "événement";
-App::$strings["%1\$s likes %2\$s's %3\$s"] = "%1\$s aime %3\$s de %2\$s";
-App::$strings["%1\$s doesn't like %2\$s's %3\$s"] = "%1\$s n'aime pas %3\$s de %2\$s";
-App::$strings["%1\$s agrees with %2\$s's %3\$s"] = "%1\$s approuve %3\$s de %2\$s";
-App::$strings["%1\$s doesn't agree with %2\$s's %3\$s"] = "%1\$s n'est pas d'accord avec %3\$s de %2\$s";
-App::$strings["%1\$s abstains from a decision on %2\$s's %3\$s"] = "%1\$s s'abstient de toute décision sur le %3\$s de %2\$s";
-App::$strings["%1\$s is attending %2\$s's %3\$s"] = "%1\$s participe à %3\$s de %2\$s";
-App::$strings["%1\$s is not attending %2\$s's %3\$s"] = "%1\$s ne participe pas à %3\$s de %2\$s";
-App::$strings["%1\$s may attend %2\$s's %3\$s"] = "%1\$s participe peut-être à %3\$s de %2\$s";
-App::$strings["Action completed."] = "Action terminée.";
-App::$strings["Thank you."] = "Merci.";
-App::$strings["This site is not a directory server"] = "Ce site n'est pas un serveur d'annuaire";
-App::$strings["This directory server requires an access token"] = "Ce serveur d'annuaire requiert un jeton d'accès";
-App::$strings["No such group"] = "Groupe introuvable";
-App::$strings["No such channel"] = "Canal introuvable";
-App::$strings["forum"] = "forum";
-App::$strings["Search Results For:"] = "Résultats de recherche pour&nbsp;:";
-App::$strings["Privacy group is empty"] = "Groupe d'accès vide";
-App::$strings["Privacy group: "] = "Groupe d'accès&nbsp;:";
-App::$strings["Invalid connection."] = "Contact non valide.";
-App::$strings["Unable to update menu."] = "Impossible de mettre le menu à jour.";
-App::$strings["Unable to create menu."] = "Impossible de créer le menu.";
-App::$strings["Menu Name"] = "Nom du menu";
-App::$strings["Unique name (not visible on webpage) - required"] = "Nom unique (non visible sur la page web) - requis";
-App::$strings["Menu Title"] = "Titre du menu";
-App::$strings["Visible on webpage - leave empty for no title"] = "Visible pour la page web - laisser vide pour qu'il n'y ait pas de titre";
-App::$strings["Allow Bookmarks"] = "Autoriser l'usage de favoris";
-App::$strings["Menu may be used to store saved bookmarks"] = "Le menu pourra être utilisé pour stocker des favoris";
-App::$strings["Submit and proceed"] = "Valider et continuer";
-App::$strings["Menus"] = "Menus";
-App::$strings["Drop"] = "Supprimer";
-App::$strings["Created"] = "Créé(e)";
-App::$strings["Edited"] = "Modifié(e)";
-App::$strings["Bookmarks allowed"] = "Favoris autorisés";
-App::$strings["Delete this menu"] = "Supprimer ce menu";
-App::$strings["Edit menu contents"] = "Modifier le contenu du menu";
-App::$strings["Edit this menu"] = "Modifier ce menu";
-App::$strings["Menu could not be deleted."] = "Impossible de supprimer le menu.";
-App::$strings["Menu not found."] = "Menu introuvable.";
-App::$strings["Edit Menu"] = "Modifier le menu";
-App::$strings["Add or remove entries to this menu"] = "Ajouter/supprimer des entrées à ce menu";
-App::$strings["Menu name"] = "Nom du menu";
-App::$strings["Must be unique, only seen by you"] = "Doit être unique, ne sera vu que par vous";
-App::$strings["Menu title"] = "Titre du menu";
-App::$strings["Menu title as seen by others"] = "Titre du menu tel que vu par les visiteurs";
-App::$strings["Allow bookmarks"] = "Autoriser l'usage de favoris";
-App::$strings["Not found."] = "Introuvable.";
-App::$strings["Location not found."] = "Emplacement introuvable.";
-App::$strings["Location lookup failed."] = "Echec de la recherche de l'emplacement.";
-App::$strings["Please select another location to become primary before removing the primary location."] = "Merci de sélectionner un autre emplacement comme nouvel emplacement primaire avant de supprimer l'emplacement primaire actuel.";
-App::$strings["Syncing locations"] = "Synchronisation des emplacements";
-App::$strings["No locations found."] = "Emplacement(s) introuvable.";
-App::$strings["Manage Channel Locations"] = "Gérer les emplacements des canaux";
-App::$strings["Location"] = "Emplacement";
-App::$strings["Primary"] = "Primaire";
-App::$strings["Sync Now"] = "Synchronisez maintenant";
-App::$strings["Please wait several minutes between consecutive operations."] = "Merci d'attendre plusieurs minutes entre opérations successives.";
-App::$strings["When possible, drop a location by logging into that website/hub and removing your channel."] = "Quand c'est possible, abandonnez un emplacement en vous connectant sur le site/hub et en supprimant votre canal.";
-App::$strings["Use this form to drop the location if the hub is no longer operating."] = "Utilisez ce formulaire pour abandonner l'emplacement si le hub n'est plus actif.";
-App::$strings["Public Hubs"] = "Instances publiques";
-App::$strings["The listed hubs allow public registration for the \$Projectname network. All hubs in the network are interlinked so membership on any of them conveys membership in the network as a whole. Some hubs may require subscription or provide tiered service plans. The hub itself <strong>may</strong> provide additional details."] = "Les sites listés permettent l'enregistrement public de comptes pour le réseau \$Projectname. Tous les sites du réseau sont reliés entre eux, être membre d'un site revient à être membre de tous. Certains sites peuvent demander une souscription ou proposer différents niveaux de service. Chaque site <strong>peut</strong> fournir des détails supplémentaires.";
-App::$strings["Hub URL"] = "URL du site";
-App::$strings["Access Type"] = "Type d'accès";
-App::$strings["Registration Policy"] = "Politique d'inscription";
-App::$strings["Stats"] = "Statistiques";
-App::$strings["Software"] = "Logiciel";
-App::$strings["Ratings"] = "Evaluations";
-App::$strings["Rate"] = "Evaluer";
-App::$strings["View"] = "Voir";
+App::$strings["New Profile Field"] = "Nouveau champ de profil";
+App::$strings["Field nickname"] = "Nom court du champ";
+App::$strings["System name of field"] = "Nom système du champ";
+App::$strings["Input type"] = "Type de champ";
+App::$strings["Field Name"] = "Nom du champ";
+App::$strings["Label on profile pages"] = "Étiquette sur les pages de profil";
+App::$strings["Help text"] = "Aide à la saisie";
+App::$strings["Additional info (optional)"] = "Informations additionnelles (facultatif)";
+App::$strings["Save"] = "Enregistrer";
+App::$strings["Field definition not found"] = "Définition du champ introuvable";
+App::$strings["Edit Profile Field"] = "Modifier le champ de profil";
+App::$strings["Profile Fields"] = "Champs de profil";
+App::$strings["Basic Profile Fields"] = "Champs de profil de base";
+App::$strings["Advanced Profile Fields"] = "Champs de profil avancés";
+App::$strings["(In addition to basic fields)"] = "(en plus des champs de base)";
+App::$strings["All available fields"] = "Tous les champs disponibles";
+App::$strings["Custom Fields"] = "Champs personnalisés";
+App::$strings["Create Custom Field"] = "Créer un champ personnalisé";
+App::$strings["Password changed for account %d."] = "Le mot de passe a été modifié pour le compte %d.";
+App::$strings["Account settings updated."] = "Paramétrage du compte mis à jour";
+App::$strings["Account not found."] = "Compte introuvable";
+App::$strings["Account Edit"] = "Modifier votre compte";
+App::$strings["New Password"] = "Nouveau mot de passe";
+App::$strings["New Password again"] = "Nouveau mot de passe (encore)";
+App::$strings["Technical skill level"] = "Niveau technique";
+App::$strings["Account language (for emails)"] = "Langue de votre compte (pour email)";
+App::$strings["Service class"] = "Classe de service";
+App::$strings["By default, unfiltered HTML is allowed in embedded media. This is inherently insecure."] = "Par défaut le code HTML est autorisé pour les média par exemple les vidéos embarquées. Cependant cela peut poser un faille de sécurité.";
+App::$strings["The recommended setting is to only allow unfiltered HTML from the following sites:"] = "Ce paramétrage autorisant le HTML pour les sites suivants.";
+App::$strings["https://youtube.com/<br />https://www.youtube.com/<br />https://youtu.be/<br />https://vimeo.com/<br />https://soundcloud.com/<br />"] = "https://youtube.com/<br />https://www.youtube.com/<br />https://youtu.be/<br />https://vimeo.com/<br />https://soundcloud.com/<br />";
+App::$strings["All other embedded content will be filtered, <strong>unless</strong> embedded content from that site is explicitly blocked."] = "Les contenus html seront filtrés <strong>sauf</strong> ceux des sites explicitement bloqués.";
+App::$strings["Security"] = "Sécurité";
+App::$strings["Block public"] = "Bloquer \"public\"";
+App::$strings["Check to block public access to all otherwise public personal pages on this site unless you are currently authenticated."] = "Sélectionner pour ne permettre l'accès aux pages personnelles \"publiques\" du site qu'aux personnes authentifiées, pas aux personnes anonymes du web.";
+App::$strings["Set \"Transport Security\" HTTP header"] = "Paramétrer \"Transport Security\" pour l'entête HTTP";
+App::$strings["Set \"Content Security Policy\" HTTP header"] = "Paramétrer \"Content Security Policy\" pour l'entête HTTP";
+App::$strings["Allowed email domains"] = "Domaines de courriels autorisés";
+App::$strings["Comma separated list of domains which are allowed in email addresses for registrations to this site. Wildcards are accepted. Empty to allow any domains"] = "Liste de noms de domaines séparés par des virgules dont les adresses de courriel seront autorisées lors de l'inscription à ce site. Les caractères génériques (*) sont acceptés. Laissez vide pour accepter tous les domaines.";
+App::$strings["Not allowed email domains"] = "Domaines de courriel non autorisés";
+App::$strings["Comma separated list of domains which are not allowed in email addresses for registrations to this site. Wildcards are accepted. Empty to allow any domains, unless allowed domains have been defined."] = "Liste de noms de domaines - séparés par des virgules - dont les adresses de courriel ne seront pas autorisées lors de l'inscription à ce site. Les caractères génériques (*) sont acceptés. Laissez vide pour accepter tous les domaines, sauf si des domaines autorisés ont été définis.";
+App::$strings["Allow communications only from these sites"] = "N'autorisez que les communications venant de ces sites";
+App::$strings["One site per line. Leave empty to allow communication from anywhere by default"] = "Un site par ligne. Laisser vide pour autoriser les communications de tous les sites, par défaut.";
+App::$strings["Block communications from these sites"] = "Bloquer les communications de ces sites";
+App::$strings["Allow communications only from these channels"] = "N'autoriser que les communications de ces canaux";
+App::$strings["One channel (hash) per line. Leave empty to allow from any channel by default"] = "Un canal (adresse) par ligne. Laisser vide pour autoriser les communications de tous les canaux, par défaut";
+App::$strings["Block communications from these channels"] = "Bloquer les communications de ces canaux";
+App::$strings["Only allow embeds from secure (SSL) websites and links."] = "Seuls les sites et liens sécurisés sont autorisé pour intégrer du code HTML";
+App::$strings["Allow unfiltered embedded HTML content only from these domains"] = "Autoriser le contenu HTML embarqué uniquement à partir de ces domaines";
+App::$strings["One site per line. By default embedded content is filtered."] = "Un site par ligne. Par défaut le contenu embarqué est filtré.";
+App::$strings["Block embedded HTML from these domains"] = "Bloquer le HTML embarqué à partir de ces domaines";
+App::$strings["Remote privacy information not available."] = "Les informations distantes de confidentialité ne sont pas disponibles.";
+App::$strings["Visible to:"] = "Visible par&nbsp;:";
+App::$strings["__ctx:acl__ Profile"] = "";
+App::$strings["Permission category saved."] = "Catégorie d'autorisation enregistrée.";
+App::$strings["Use this form to create permission rules for various classes of people or connections."] = "Utilisez ce formulaire pour créer des règles d'accès pour différentes catégories de personnes ou de contacts.";
+App::$strings["Permission Categories"] = "Catégories d'autorisation";
+App::$strings["Permission Name"] = "Nom de l'autorisation";
+App::$strings["My Settings"] = "Mes paramètres";
+App::$strings["inherited"] = "héritée";
+App::$strings["Individual Permissions"] = "Permissions individuelles";
+App::$strings["Some permissions may be inherited from your channel's <a href=\"settings\"><strong>privacy settings</strong></a>, which have higher priority than individual settings. You can <strong>not</strong> change those settings here."] = "Certaines permissions peuvent être héritées de vos <a href=\"settings\">paramètres de confidentialité</a> de canal, lesquels sont prioritaires sur les réglages individuels. Vous pouvez modifier ces permissions ici mais cela n'aura aucun effet à moins de changer les paramètres hérités.";
+App::$strings["Friends"] = "Amis";
+App::$strings["Settings updated."] = "Paramètres mis à jour.";
+App::$strings["Nobody except yourself"] = "Personne sauf vous";
+App::$strings["Only those you specifically allow"] = "Seulement ceux que vous autorisez spécifiquement";
+App::$strings["Approved connections"] = "Contacts approuvés";
+App::$strings["Any connections"] = "Tous les contacts";
+App::$strings["Anybody on this website"] = "Tous les utilisateurs du hub";
+App::$strings["Anybody in this network"] = "Tous les utilisateurs sur ce réseau";
+App::$strings["Anybody authenticated"] = "Tous les utilisateurs authentifiés";
+App::$strings["Anybody on the internet"] = "Tous les utilisateurs d'Internet";
+App::$strings["Publish your default profile in the network directory"] = "Publier votre profil par défaut dans l'annuaire du réseau";
+App::$strings["Allow us to suggest you as a potential friend to new members?"] = "Nous autoriser à vous suggérer comme ami(e) potentiel(le) aux nouveaux membres?";
+App::$strings["or"] = "ou";
+App::$strings["Your channel address is"] = "L'adresse de votre canal est";
+App::$strings["Your files/photos are accessible via WebDAV at"] = "Vos fichiers/photos sont accessibles via WebDAV à";
+App::$strings["Channel Settings"] = "Paramètres du canal";
+App::$strings["Basic Settings"] = "Paramètres standard";
+App::$strings["Full Name:"] = "Nom complet&nbsp;:";
+App::$strings["Email Address:"] = "Adresse de courriel&nbsp;:";
+App::$strings["Your Timezone:"] = "Votre fureau horaire&nbsp;:";
+App::$strings["Default Post Location:"] = "Emplacement de publication par défaut&nbsp;:";
+App::$strings["Geographical location to display on your posts"] = "Emplacement géographique à afficher sur vos publications";
+App::$strings["Use Browser Location:"] = "Utiliser la géolocalisation du navigateur&nbsp;:";
+App::$strings["Adult Content"] = "Contenu \"adulte\"";
+App::$strings["This channel frequently or regularly publishes adult content. (Please tag any adult material and/or nudity with #NSFW)"] = "Ce canal publie plus ou moins fréquemment du contenu pour adultes. (Merci d'indiquer tout contenu pour adulte ou potentiellement choquant avec l'étiquette <em>#NSFW</em> - Not Safe For Work)";
+App::$strings["Security and Privacy Settings"] = "Paramètres de sécurité et de confidentialité";
+App::$strings["Your permissions are already configured. Click to view/adjust"] = "Vous permissions sont déjà paramétrées. Cliquer pour voir/ajuster";
+App::$strings["Hide my online presence"] = "Cacher ma présence en ligne";
+App::$strings["Prevents displaying in your profile that you are online"] = "Cacher votre statut (en ligne/hors ligne) sur votre profil";
+App::$strings["Simple Privacy Settings:"] = "Paramètres de confidentialité simplifiés&nbsp;:";
+App::$strings["Very Public - <em>extremely permissive (should be used with caution)</em>"] = "Très public - <em>extrèmement permissif (à n'utiliser qu'en connaissance de cause)</em>";
+App::$strings["Typical - <em>default public, privacy when desired (similar to social network permissions but with improved privacy)</em>"] = "Classique - <em>public par défaut, privé en cas de besoin (comparable aux permissions type réseau social, avec une confidentialité améliorée)</em>";
+App::$strings["Private - <em>default private, never open or public</em>"] = "Privé - <em>privé par défaut, jamais ouvert ni public</em>";
+App::$strings["Blocked - <em>default blocked to/from everybody</em>"] = "Bloqué - <em>par défaut, bloqué de/vers tout le monde</em>";
+App::$strings["Allow others to tag your posts"] = "Autoriser les autres à \"étiqueter\" vos publications";
+App::$strings["Often used by the community to retro-actively flag inappropriate content"] = "Souvent utilisé par la communauté pour identifier un contenu inapproprié a posteriori ";
+App::$strings["Channel Permission Limits"] = "Limites des permissions du canal";
+App::$strings["Expire other channel content after this many days"] = "Faire expirer le contenu des autres canaux après n jours";
+App::$strings["0 or blank to use the website limit."] = "0 ou vide pour utiliser la limite du site web";
+App::$strings["This website expires after %d days."] = "Ce site web expirera après %d jours.";
+App::$strings["This website does not expire imported content."] = "Ce site web ne périme pas le contenu importé.";
+App::$strings["The website limit takes precedence if lower than your limit."] = "La limite du site Web a priorité si elle est inférieure à votre limite.";
+App::$strings["Maximum Friend Requests/Day:"] = "Nombre maximum de demandes de contact par jour&nbsp;:";
+App::$strings["May reduce spam activity"] = "Contribue à réduire l'impact des indésirables";
+App::$strings["Default Access Control List (ACL)"] = "Default Access Control List (ACL)";
+App::$strings["Use my default audience setting for the type of object published"] = "Utiliser mon paramètre de publication par défaut pour le type d'objet publié";
+App::$strings["Channel permissions category:"] = "Catégorie de permissions du canal&nbsp;:";
+App::$strings["Default Permissions Group"] = "";
+App::$strings["Maximum private messages per day from unknown people:"] = "Nombre maximum de messages privés émanant d'inconnus, par jour&nbsp;:";
+App::$strings["Useful to reduce spamming"] = "Utile pour réduire les indésirables";
+App::$strings["Notification Settings"] = "Paramètres de notification";
+App::$strings["By default post a status message when:"] = "Par défaut, publier un statut quand&nbsp;:";
+App::$strings["accepting a friend request"] = "vous acceptez une demande de contact";
+App::$strings["joining a forum/community"] = "vous rejoignez un forum ou une communauté";
+App::$strings["making an <em>interesting</em> profile change"] = "vous faîtes une modification <em>intéressante</em> de votre profil";
+App::$strings["Send a notification email when:"] = "Envoyer un courriel de notification quand&nbsp;:";
+App::$strings["You receive a connection request"] = "Vous recevez une demande de contact";
+App::$strings["Your connections are confirmed"] = "Vos contacts sont confirmés";
+App::$strings["Someone writes on your profile wall"] = "Quelqu'un a écrit sur votre mur";
+App::$strings["Someone writes a followup comment"] = "Quelqu'un a commenté vos publications";
+App::$strings["You receive a private message"] = "Vous recevez un message privé";
+App::$strings["You receive a friend suggestion"] = "Vous recevez une suggestion d'amitié/contact";
+App::$strings["You are tagged in a post"] = "Vous êtes étiqueté dans une publication";
+App::$strings["You are poked/prodded/etc. in a post"] = "Vous êtes tapoté/encouragé/etc. dans une publication";
+App::$strings["Someone likes your post/comment"] = "Quelqu'un aime votre publication/commentaire";
+App::$strings["Show visual notifications including:"] = "Afficher des notifications visuelles y compris&nbsp;:";
+App::$strings["Unseen grid activity"] = "Activité du réseau pas encore consultée";
+App::$strings["Unseen channel activity"] = "Activité non vue sur le canal";
+App::$strings["Unseen private messages"] = "Messages privés non lus";
+App::$strings["Recommended"] = "Recommandé";
+App::$strings["Upcoming events"] = "Événements à venir";
+App::$strings["Events today"] = "Événements aujourd'hui";
+App::$strings["Upcoming birthdays"] = "Anniversaires à venir";
+App::$strings["Not available in all themes"] = "Pas disponible dans tous les thèmes";
+App::$strings["System (personal) notifications"] = "Notifications système (personnelles)";
+App::$strings["System info messages"] = "Messages d'info système";
+App::$strings["System critical alerts"] = "Alertes critiques système";
+App::$strings["New connections"] = "Nouveaux contacts";
+App::$strings["System Registrations"] = "Inscriptions système";
+App::$strings["Also show new wall posts, private messages and connections under Notices"] = "Afficher également les nouvelles publications sur le mur, les messages privés et les contacts dans Notifications";
+App::$strings["Notify me of events this many days in advance"] = "Me prévenir d’événements à venir tant de jours en avance";
+App::$strings["Must be greater than 0"] = "Doit être supérieur à 0";
+App::$strings["Advanced Account/Page Type Settings"] = "Paramètres avancés de compte/type de page";
+App::$strings["Change the behaviour of this account for special situations"] = "Modifie le comportement de ce compte pour des situations particulières";
+App::$strings["Miscellaneous Settings"] = "Paramètres divers";
+App::$strings["Default photo upload folder"] = "Répertoire par défaut pour les photos téléversées";
+App::$strings["%Y - current year, %m - current month"] = "%Y - année en cours, %m - mois en cours";
+App::$strings["Default file upload folder"] = "Répertoire par défaut pour les fichiers téléversés";
+App::$strings["Personal menu to display in your channel pages"] = "Menu personnel à afficher sur les pages de votre canal";
+App::$strings["Remove this channel."] = "Supprimer ce canal";
+App::$strings["Firefox Share \$Projectname provider"] = "Connecteur \$Projectname pour Firefox Share";
+App::$strings["Start calendar week on Monday"] = "";
+App::$strings["Additional Features"] = "Fonctionnalités additionnelles";
+App::$strings["This channel is limited to %d tokens"] = "Ce canal est limité à %d jetons";
+App::$strings["Name and Password are required."] = "Le nom et le mot de passe sont requis";
+App::$strings["Token saved."] = "Jeton sauvegardé";
+App::$strings["Use this form to create temporary access identifiers to share things with non-members. These identities may be used in Access Control Lists and visitors may login using these credentials to access private content."] = "Utilisez ce formulaire pour créer des identifiants d'accès temporaires pour partager des informations avec des non-membres. Ces identités peuvent être utilisées dans les listes de contrôle d'accès et les visiteurs peuvent se connecter en utilisant ces certificats d'identification pour accéder au contenu privé.";
+App::$strings["You may also provide <em>dropbox</em> style access links to friends and associates by adding the Login Password to any specific site URL as shown. Examples:"] = "Vous pouvez également fournir des liens d'accès, style <em>dropbox</em>, aux amis et aux associés en ajoutant le mot de passe de connexion à l'URL d'un site spécifique, comme indiqué. Exemples:";
+App::$strings["Guest Access Tokens"] = "Jeton d'accès pour un invité";
+App::$strings["Login Name"] = "Nom d'utilisateur";
+App::$strings["Login Password"] = "Mot de passe";
+App::$strings["Expires (yyyy-mm-dd)"] = "Date d'expiration sous la forme année mois jour (AAAA-MM-JJ)";
+App::$strings["Their Settings"] = "Leurs paramètres";
+App::$strings["Not valid email."] = "Adresse de courriel non valide.";
+App::$strings["Protected email address. Cannot change to that email."] = "Adresse de courriel protégée. Impossible de l'utiliser.";
+App::$strings["System failure storing new email. Please try again."] = "Défaillance système lors du stockage de la nouvelle adresse de courriel. Merci d'essayer à nouveau.";
+App::$strings["Technical skill level updated"] = "Niveau technique mis à jour";
+App::$strings["Password verification failed."] = "La vérification du mot de passe a échoué.";
+App::$strings["Passwords do not match. Password unchanged."] = "Les deux saisies du mot de passe ne correspondent pas. Il n'a donc pas été changé.";
+App::$strings["Empty passwords are not allowed. Password unchanged."] = "Le mot de passe ne peut pas être vide. Il n'a donc pas été changé.";
+App::$strings["Password changed."] = "Le mot de passe a été changé.";
+App::$strings["Password update failed. Please try again."] = "La mise à jour du mot de passe a échoué. Merci d'essayer à nouveau.";
+App::$strings["Account Settings"] = "Paramètres du compte";
+App::$strings["Current Password"] = "Mot de passe actuel";
+App::$strings["Enter New Password"] = "Entrez votre nouveau mot de passe";
+App::$strings["Confirm New Password"] = "Confirmez le nouveau mot de passe";
+App::$strings["Leave password fields blank unless changing"] = "Laissez les mots de passe vides si vous ne voulez pas les modifier";
+App::$strings["Your technical skill level"] = "Votre niveau technique";
+App::$strings["Used to provide a member experience matched to your comfort level"] = "Utilisé pour fournir une expérience utilisateur correspondant à votre niveau de confort";
+App::$strings["Remove Account"] = "Supprimer le compte";
+App::$strings["Remove this account including all its channels"] = "Supprimer ce compte et tous ses canaux";
+App::$strings["Affinity Slider settings updated."] = "Paramètres de la réglette d'affinité mis à jour.";
+App::$strings["No feature settings configured"] = "Aucun paramètre de fonctionnalité configuré";
+App::$strings["Default maximum affinity level"] = "Niveau d'affinité maximum par défaut";
+App::$strings["Default minimum affinity level"] = "Niveau d'affinité minimum par défaut";
+App::$strings["Affinity Slider Settings"] = "Paramètres de la réglette d'affinité";
+App::$strings["Feature/Addon Settings"] = "Paramètres des extensions/greffons";
+App::$strings["No special theme for mobile devices"] = "Pas de thème spécifique aux mobiles";
+App::$strings["%s - (Experimental)"] = "%s - (Expérimental)";
+App::$strings["Display Settings"] = "Afficher les paramètres";
+App::$strings["Theme Settings"] = "Paramètres du thème";
+App::$strings["Custom Theme Settings"] = "Paramètres personnels du thème";
+App::$strings["Content Settings"] = "Paramètres liés au contenu";
+App::$strings["Display Theme:"] = "Afficher le thème&nbsp;:";
+App::$strings["Select scheme"] = "Définir la palette de couleurs";
+App::$strings["Mobile Theme:"] = "Thème mobile&nbsp;:";
+App::$strings["Preload images before rendering the page"] = "Pré-charger les images avant d'afficher la page";
+App::$strings["The subjective page load time will be longer but the page will be ready when displayed"] = "Le temps de charge perçu de la page sera plus long mais la page sera complète quand elle s'affichera";
+App::$strings["Enable user zoom on mobile devices"] = "Permettre à l'utilisateur d'un mobile d'agrandir le contenu";
+App::$strings["Update browser every xx seconds"] = "Mettre à jour le navigateur toutes les xx secondes";
+App::$strings["Minimum of 10 seconds, no maximum"] = "Minimum 10 secondes, pas de maximum";
+App::$strings["Maximum number of conversations to load at any time:"] = "Nombre maximal de conversations pouvant être chargées en même temps&nbsp;:";
+App::$strings["Maximum of 100 items"] = "100 éléments au maximum";
+App::$strings["Show emoticons (smilies) as images"] = "Remplacer les émoticônes (smileys) par des images";
+App::$strings["Manual conversation updates"] = "Manuel de mises à jour des conversations";
+App::$strings["Default is on, turning this off may increase screen jumping"] = "Activé par défaut, le désactiver peut accroître les sauts d'écran";
+App::$strings["Link post titles to source"] = "Lier les titres des publications à leur source";
+App::$strings["System Page Layout Editor - (advanced)"] = "Editeur de mise en page des pages systèmes - (avancé)";
+App::$strings["Use blog/list mode on channel page"] = "Utiliser le mode blog/liste sur la page du canal";
+App::$strings["(comments displayed separately)"] = "(commentaires affichés séparément)";
+App::$strings["Use blog/list mode on grid page"] = "Utiliser le mode blog/liste sur la page du réseau";
+App::$strings["Channel page max height of content (in pixels)"] = "Hauteur maximale du contenu pour la page du canal (en pixels)";
+App::$strings["click to expand content exceeding this height"] = "cliquer pour dérouler le contenu dépassant cette limite";
+App::$strings["Grid page max height of content (in pixels)"] = "Hauteur maximale du contenu sur la page du réseau (en pixels)";
+App::$strings["Name is required"] = "Le nom est requis";
+App::$strings["Key and Secret are required"] = "Clef et secret sont requis";
+App::$strings["Add application"] = "Ajouter une application";
+App::$strings["Name of application"] = "Nom de l'application";
+App::$strings["Consumer Key"] = "Clef client";
+App::$strings["Automatically generated - change if desired. Max length 20"] = "Généré automatiquement - à changer si besoin. Longueur maximale 20 caractères.";
+App::$strings["Consumer Secret"] = "Secret client";
+App::$strings["Redirect"] = "Redirection";
+App::$strings["Redirect URI - leave blank unless your application specifically requires this"] = "URI de redirection - laissez vide, sauf si votre application le requiert spécifiquement";
+App::$strings["Icon url"] = "URL de l'icône";
+App::$strings["Optional"] = "Facultatif";
+App::$strings["Application not found."] = "Application introuvable.";
+App::$strings["Connected Apps"] = "Applications connectées";
+App::$strings["Client key starts with"] = "La clef partagée commence par";
+App::$strings["No name"] = "Sans nom";
+App::$strings["Remove authorization"] = "Révoquer l'autorisation";
+App::$strings["View Photo"] = "Voir la photo";
+App::$strings["Unknown"] = "Inconnu";
+App::$strings["Edit Album"] = "Modifier l'album";
+App::$strings["Upload"] = "Envoyer";
+App::$strings["Some blurb about what to do when you're new here"] = "Quelques mots sur quoi faire quand on est nouveau ici";
+App::$strings["Thing updated"] = "Elément mis à jour";
+App::$strings["Object store: failed"] = "Stockage de l'objet&nbsp;: échec";
+App::$strings["Thing added"] = "Elément ajouté";
+App::$strings["OBJ: %1\$s %2\$s %3\$s"] = "OBJ: %1\$s %2\$s %3\$s";
+App::$strings["Show Thing"] = "Montrer élément";
+App::$strings["item not found."] = "élément introuvable.";
+App::$strings["Edit Thing"] = "Modifier élément";
+App::$strings["Select a profile"] = "Choisissez un profil";
+App::$strings["Post an activity"] = "Publier une activité";
+App::$strings["Only sends to viewers of the applicable profile"] = "Envoie exclusivement aux visiteurs du profil concerné";
+App::$strings["Name of thing e.g. something"] = "Nom de l'élément, p.ex. quelque-chose";
+App::$strings["URL of thing (optional)"] = "URL de l'élément (facultatif)";
+App::$strings["URL for photo of thing (optional)"] = "URL d'une photo de l'élément (facultatif)";
+App::$strings["Permissions"] = "Autorisations";
+App::$strings["Add Thing to your Profile"] = "Ajouter l'élément à votre profil";
+App::$strings["No more system notifications."] = "Pas d'autre notification du système.";
+App::$strings["System Notifications"] = "Notifications du système";
+App::$strings["Channel added."] = "Canal ajouté.";
+App::$strings["Your service plan only allows %d channels."] = "Votre forfait n'autorise que %d canaux.";
+App::$strings["No channel. Import failed."] = "Pas de canal. Echec de l'import.";
+App::$strings["Import completed."] = "L'import est terminé.";
+App::$strings["You must be logged in to use this feature."] = "Vous devez vous connecter pour utiliser cette fonctionnalité.";
+App::$strings["Import Channel"] = "Importation de canal";
+App::$strings["Use this form to import an existing channel from a different server/hub. You may retrieve the channel identity from the old server/hub via the network or provide an export file."] = "Utilisez ce formulaire pour importer un canal existant sur un autre serveur. Vous pouvez récupérer l'identité du canal sur l'ancien serveur directement par le réseau, ou bien fournir un fichier d'export/import.";
+App::$strings["Or provide the old server/hub details"] = "Ou fournissez les détails de l'ancien serveur/hub";
+App::$strings["Your old identity address (xyz@example.com)"] = "Votre ancienne identité (zyx@exemple.com)";
+App::$strings["Your old login email address"] = "Votre ancienne adresse de courriel";
+App::$strings["Your old login password"] = "Votre ancien mot de passe";
+App::$strings["For either option, please choose whether to make this hub your new primary address, or whether your old location should continue this role. You will be able to post from either location, but only one can be marked as the primary location for files, photos, and media."] = "Quelle que soit l'option choisie, merci de décider si ce hub sera votre nouvelle adresse primaire, ou si votre ancien hub continuera à jouer ce rôle. Vous pourrez publier depuis l'emplacement de votre choix, mais une seule peut être déclarée comme stockage primaire de vos fichiers/photos/media.";
+App::$strings["Make this hub my primary location"] = "Faire de ce hub mon emplacement primaire";
+App::$strings["Move this channel (disable all previous locations)"] = "Déplacer ce canal (désactiver tous les emplacements précédents)";
+App::$strings["Import a few months of posts if possible (limited by available memory"] = "Importer plusieurs mois de messages si possible (limité par la mémoire disponible)";
+App::$strings["This process may take several minutes to complete. Please submit the form only once and leave this page open until finished."] = "Ce processus peut prendre plusieurs minutes. Merci de ne valider le formulaire qu'une seule fois et de laisser cette page ouverte jusqu'à la fin.";
+App::$strings["Authentication failed."] = "Échec de l'authentification.";
+App::$strings["Remote Authentication"] = "Authentification distante";
+App::$strings["Enter your channel address (e.g. channel@example.com)"] = "Entrez l'adresse de votre canal (par ex. moncanal@monsite.com)";
+App::$strings["Authenticate"] = "Authentifier";
+App::$strings["Channel not found."] = "Canal introuvable.";
+App::$strings["Permissions denied."] = "Permissions refusées.";
+App::$strings["Import"] = "Import";
+App::$strings["Authorize application connection"] = "Autoriser l'application à se connecter";
+App::$strings["Return to your app and insert this Security Code:"] = "Revenez dans votre application et mettez le code de sécurité";
+App::$strings["Please login to continue."] = "Merci de vous identifier pour continuer.";
+App::$strings["Do you want to authorize this application to access your posts and contacts, and/or create new posts for you?"] = "Voulez-vous autoriser cette application à accéder à vos publications et contacts, et/ou à publier en votre nom?";
+App::$strings["Item not available."] = "Élément indisponible.";
+App::$strings["Insert web link"] = "Insérer lien web";
+App::$strings["Title (optional)"] = "Titre (facultatif)";
+App::$strings["Edit Block"] = "Modifier le bloc";
+App::$strings["vcard"] = "vcard";
+App::$strings["Apps"] = "Applications";
+App::$strings["Manage apps"] = "";
+App::$strings["Create new app"] = "";
+App::$strings["__ctx:mood__ %1\$s is %2\$s"] = "%1\$s est %2\$s";
+App::$strings["Mood"] = "Humeur";
+App::$strings["Set your current mood and tell your friends"] = "Indiquez votre humeur du moment à vos amis";
+App::$strings["Blocked"] = "Bloqué(e)";
+App::$strings["Ignored"] = "Ignoré(e)";
+App::$strings["Hidden"] = "Caché";
+App::$strings["Archived"] = "Archivé";
+App::$strings["New"] = "Nouveautés";
+App::$strings["All"] = "Tous";
+App::$strings["New Connections"] = "Nouveaux contacts";
+App::$strings["Show pending (new) connections"] = "Voir les (nouveaux) contacts en attente";
+App::$strings["Show all connections"] = "Voir tous les contacts";
+App::$strings["Only show blocked connections"] = "Ne montrer que les contacts bloqués";
+App::$strings["Only show ignored connections"] = "Ne montrer que les contacts ignorés";
+App::$strings["Only show archived connections"] = "Ne montrer que les contacts archivés";
+App::$strings["Only show hidden connections"] = "Ne montrer que les contacts cachés";
+App::$strings["Pending approval"] = "En attente de validation";
+App::$strings["%1\$s [%2\$s]"] = "%1\$s [%2\$s]";
+App::$strings["Edit connection"] = "Modifier le contact";
+App::$strings["Delete connection"] = "Supprimer le contact";
+App::$strings["Channel address"] = "Adresse du canal";
+App::$strings["Network"] = "Réseau";
+App::$strings["Call"] = "Appeler";
+App::$strings["Status"] = "État";
+App::$strings["Connected"] = "Ami depuis";
+App::$strings["Approve connection"] = "Valider le contact";
+App::$strings["Ignore connection"] = "Ignorer le contact";
+App::$strings["Ignore"] = "Ignorer";
+App::$strings["Recent activity"] = "Activité récente";
+App::$strings["Connections"] = "Contacts";
+App::$strings["Search your connections"] = "Chercher parmi vos contacts";
+App::$strings["Connections search"] = "Chercher des contacts";
+App::$strings["Find"] = "Trouver";
+App::$strings["Source of Item"] = "Source de l'élément";
+App::$strings["Bookmark added"] = "Favori ajouté";
+App::$strings["My Bookmarks"] = "Mes Favoris";
+App::$strings["My Connections Bookmarks"] = "Favoris de mes contacts";
+App::$strings["Account removals are not allowed within 48 hours of changing the account password."] = "Il est impossible de supprimer un compte dans les 48 heures après avoir changé le mot de passe du compte.";
+App::$strings["Remove This Account"] = "Supprimer ce compte";
+App::$strings["This account and all its channels will be completely removed from the network. "] = "Ce compte et tous ses canaux seront entièrement supprimés du réseau.";
+App::$strings["Remove this account, all its channels and all its channel clones from the network"] = "Supprimer du réseau ce compte, tous ses canaux et tous les clones de ses canaux.";
+App::$strings["By default only the instances of the channels located on this hub will be removed from the network"] = "Par défaut, seules les instances des canaux situés sur ce hub seront supprimées du réseau";
+App::$strings["Page owner information could not be retrieved."] = "Impossible d'obtenir des informations sur le propriétaire de la page.";
+App::$strings["Album not found."] = "Album introuvable.";
+App::$strings["Delete Album"] = "Supprimer l'album";
+App::$strings["Delete Photo"] = "Supprimer la photo";
+App::$strings["No photos selected"] = "Aucune photo selectionnée";
+App::$strings["Access to this item is restricted."] = "L'accès à l'élément est restreint.";
+App::$strings["%1$.2f MB of %2$.2f MB photo storage used."] = "Vous avez utilisé %1$.2f mégaoctets sur les %2$.2f autorisés pour le stockage des photos.";
+App::$strings["%1$.2f MB photo storage used."] = "%1$.2f méga-octets utilisés pour le stockage des photos.";
+App::$strings["Upload Photos"] = "Téléverser des photos";
+App::$strings["Enter an album name"] = "Entrer un nom d'album";
+App::$strings["or select an existing album (doubleclick)"] = "ou sélectionner un album existant (double-clic)";
+App::$strings["Create a status post for this upload"] = "Créer une publication de statut pour cet envoi";
+App::$strings["Caption (optional):"] = "Légende (facultative)";
+App::$strings["Description (optional):"] = "Description (facultative)";
+App::$strings["Show Newest First"] = "Les plus récent(e)s en premier";
+App::$strings["Show Oldest First"] = "Les moins récent(e)s en premier";
+App::$strings["Permission denied. Access to this item may be restricted."] = "Permission refusée. L'accès à cet élément peut avoir été restreint.";
+App::$strings["Photo not available"] = "Photo non disponible";
+App::$strings["Use as profile photo"] = "Utiliser comme photo du profil";
+App::$strings["Use as cover photo"] = "Utilisez comme bannière";
+App::$strings["Private Photo"] = "Photo privée";
+App::$strings["View Full Size"] = "Voir en taille réelle";
+App::$strings["Edit photo"] = "Modifier la photo";
+App::$strings["Rotate CW (right)"] = "Rotation horaire (droite)";
+App::$strings["Rotate CCW (left)"] = "Rotation anti-horaire (gauche)";
+App::$strings["Move photo to album"] = "Déplacer la photo dans l'album";
+App::$strings["Enter a new album name"] = "Entrer un nouveau nom d'album";
+App::$strings["or select an existing one (doubleclick)"] = "ou en sélectionner un existant (double-clic)";
+App::$strings["Caption"] = "Titre/légende";
+App::$strings["Add a Tag"] = "Ajouter une étiquette";
+App::$strings["Example: @bob, @Barbara_Jensen, @jim@example.com"] = "Exemple&nbsp;: @marc, @Barbara_Jensen, @charles@exemple.com, #Ile_de_France, #marathon";
+App::$strings["Flag as adult in album view"] = "Marquer comme \"adulte\" dans l'affichage de l'album";
+App::$strings["I like this (toggle)"] = "J'aime (oui/non)";
+App::$strings["I don't like this (toggle)"] = "Je n'aime pas (oui/non)";
+App::$strings["Please wait"] = "Merci de patienter";
+App::$strings["This is you"] = "C'est vous";
+App::$strings["Comment"] = "Commenter";
+App::$strings["__ctx:title__ Likes"] = "Aime";
+App::$strings["__ctx:title__ Dislikes"] = "N'aime pas";
+App::$strings["__ctx:title__ Agree"] = "D'accord";
+App::$strings["__ctx:title__ Disagree"] = "Pas d'accord";
+App::$strings["__ctx:title__ Abstain"] = "Abstention";
+App::$strings["__ctx:title__ Attending"] = "Participations";
+App::$strings["__ctx:title__ Not attending"] = "Non-participations";
+App::$strings["__ctx:title__ Might attend"] = "Participation possible";
+App::$strings["View all"] = "Voir tout";
+App::$strings["__ctx:noun__ Like"] = array(
+ 0 => "Aime",
+ 1 => "Aime",
+);
+App::$strings["__ctx:noun__ Dislike"] = array(
+ 0 => "N'aime pas",
+ 1 => "N'aime pas",
+);
+App::$strings["Photo Tools"] = "Ouitls pour photos";
+App::$strings["In This Photo:"] = "Dans cette photo&nbsp;:";
+App::$strings["Map"] = "Carte";
+App::$strings["__ctx:noun__ Likes"] = "Aime";
+App::$strings["__ctx:noun__ Dislikes"] = "N'aime pas";
+App::$strings["Close"] = "Fermer";
+App::$strings["Recent Photos"] = "Photos récentes";
+App::$strings["Profile Unavailable."] = "Profil non disponible.";
+App::$strings["Not found"] = "Non trouvé";
+App::$strings["Invalid channel"] = "Canal invalide.";
+App::$strings["Wikis"] = "Wikis";
+App::$strings["Download"] = "Téléchargement";
+App::$strings["Create New"] = "Nouveau";
+App::$strings["Wiki name"] = "Nom du wiki";
+App::$strings["Content type"] = "Type de contenu";
+App::$strings["Type"] = "Type";
+App::$strings["Create a status post for this wiki"] = "Créer un statut de publication pour ce wiki";
+App::$strings["Wiki not found"] = "Wiki introuvable";
+App::$strings["Rename page"] = "Renommer la page";
+App::$strings["Error retrieving page content"] = "Erreur lors de la récupération du contenu de la page";
+App::$strings["New page"] = "";
+App::$strings["Revision Comparison"] = "Comparaison des révisions";
+App::$strings["Revert"] = "Revenir";
+App::$strings["Short description of your changes (optional)"] = "Description courte de vos modifications (optionnel)";
+App::$strings["Source"] = "Source";
+App::$strings["New page name"] = "Nouveau nom de la page";
+App::$strings["Embed image from photo albums"] = "Intégrer une image d'un album photo";
+App::$strings["Embed an image from your albums"] = "Intégrer une image de votre album photo";
+App::$strings["OK"] = "OK";
+App::$strings["Choose images to embed"] = "Choisissez des images à intégrer";
+App::$strings["Choose an album"] = "Choisir un album";
+App::$strings["Choose a different album"] = "Choisissez un autre album";
+App::$strings["Error getting album list"] = "Erreur venant de la liste de l'album";
+App::$strings["Error getting photo link"] = "Erreur provenant du lien de la photo";
+App::$strings["Error getting album"] = "Erreur venant de l'album";
+App::$strings["Error creating wiki. Invalid name."] = "Erreur lors de la création du wiki. Nom invalide.";
+App::$strings["A wiki with this name already exists."] = "";
+App::$strings["Wiki created, but error creating Home page."] = "Le wiki a été créé, mais une erreur est survenue lors de la création de sa page d'accueil.";
+App::$strings["Error creating wiki"] = "Erreur lors de la création du wiki.";
+App::$strings["Wiki delete permission denied."] = "Permission de supprimer le wiki refusée.";
+App::$strings["Error deleting wiki"] = "Erreur durant la suppression du wiki";
+App::$strings["New page created"] = "Nouvelle page créée";
+App::$strings["Cannot delete Home"] = "Impossible de supprimer la racine";
+App::$strings["Current Revision"] = "Version actuelle";
+App::$strings["Selected Revision"] = "Version sélectionnée";
+App::$strings["You must be authenticated."] = "Vous devez être connecté.";
+App::$strings["toggle full screen mode"] = "Basculer en mode plein écran.";
+App::$strings["Layout updated."] = "Mise en page mise à jour.";
+App::$strings["Feature disabled."] = "Fonctionnalité désactivée";
+App::$strings["Edit System Page Description"] = "Modifier la description de la page du système";
+App::$strings["Layout not found."] = "Mise en page introuvable.";
+App::$strings["Module Name:"] = "Nom du module&nbsp;:";
+App::$strings["Layout Help"] = "Aide à la mise en page";
+App::$strings["Poke"] = "Tapoter";
+App::$strings["Poke somebody"] = "Taquiner quelqu'un";
+App::$strings["Poke/Prod"] = "Tapoter/Encourager";
+App::$strings["Poke, prod or do other things to somebody"] = "Taquiner, pousser ou faire autre chose à quelqu'un";
+App::$strings["Recipient"] = "Destinataire";
+App::$strings["Choose what you wish to do to recipient"] = "Choisir ce que vous voulez faire au destinataire";
+App::$strings["Make this post private"] = "Rendre cette publication privée";
+App::$strings["Image uploaded but image cropping failed."] = "L'image a été téléversée, mais le recadrage a échoué.";
+App::$strings["Profile Photos"] = "Photos du profil";
+App::$strings["Image resize failed."] = "Le redimensionnement de l'image a échoué.";
+App::$strings["Shift-reload the page or clear browser cache if the new photo does not display immediately."] = "Shift-rechargez votre page, ou videz le cache du navigateur si la photo ne s'affiche pas immédiatement.";
+App::$strings["Unable to process image"] = "Impossible de traiter l'image";
+App::$strings["Image upload failed."] = "Le téléversement de l'image a échoué.";
+App::$strings["Unable to process image."] = "Impossible de traîter l'image.";
+App::$strings["Photo not available."] = "Photo inaccessible.";
+App::$strings["Upload File:"] = "Téléverser fichier&nbsp;:";
+App::$strings["Select a profile:"] = "Choisir un profil&nbsp;:";
+App::$strings["Use Photo for Profile"] = "Utiliser la photo pour le profil";
+App::$strings["Upload Profile Photo"] = "Téléverser une photo de profil";
+App::$strings["Use"] = "Utiliser";
+App::$strings["skip this step"] = "passer cette étape";
+App::$strings["select a photo from your photo albums"] = "choisir une photo dans vos albums";
+App::$strings["Crop Image"] = "Recadrer l'image";
+App::$strings["Please adjust the image cropping for optimum viewing."] = "Merci d'ajuster le cadre pour une visualisation optimale.";
+App::$strings["Done Editing"] = "J'ai terminé";
+App::$strings["Away"] = "Absent";
+App::$strings["Online"] = "En ligne";
+App::$strings["Unable to locate original post."] = "Impossible de localiser la publication initiale.";
+App::$strings["Empty post discarded."] = "Publication vide annulée.";
+App::$strings["Duplicate post suppressed."] = "Publication en doublon supprimée.";
+App::$strings["System error. Post not saved."] = "Erreur système. Publication non sauvegardée.";
+App::$strings["Unable to obtain post information from database."] = "Impossible d'obtenir les informations de publication depuis la base de données.";
+App::$strings["You have reached your limit of %1$.0f top level posts."] = "Vous avez atteint votre limite de %1$.0f contributions \"racines\".";
+App::$strings["You have reached your limit of %1$.0f webpages."] = "Vous avez atteint votre limite de %1$.0f pages web.";
+App::$strings["sent you a private message"] = "vous a envoyé un message privé";
+App::$strings["added your channel"] = "a ajouté votre canal";
+App::$strings["g A l F d"] = "g A l F d";
+App::$strings["[today]"] = "[aujourd'hui]";
+App::$strings["posted an event"] = "a publié un événement";
+App::$strings["Invalid item."] = "Élément invalide.";
+App::$strings["Page not found."] = "Page introuvable.";
+App::$strings["Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."] = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";
App::$strings["Could not access contact record."] = "Impossible d'accéder aux détails du contact.";
App::$strings["Could not locate selected profile."] = "Impossible de localiser le profil sélectionné.";
App::$strings["Connection updated."] = "Contact mis à jour.";
@@ -644,6 +1042,8 @@ App::$strings["View Profile"] = "Voir mon profil";
App::$strings["View %s's profile"] = "Voir le profil de %s";
App::$strings["Refresh Permissions"] = "Actualiser les autorisations";
App::$strings["Fetch updated permissions"] = "Récupérer les autorisations les plus récentes";
+App::$strings["Refresh Photo"] = "";
+App::$strings["Fetch updated photo"] = "";
App::$strings["Recent Activity"] = "Activité récente";
App::$strings["View recent posts and comments"] = "Voir les publications et commentaires récents";
App::$strings["Block (or Unblock) all communications with this connection"] = "Bloquer ou débloquer toute communication avec ce contact";
@@ -660,12 +1060,13 @@ App::$strings["Hide"] = "Cacher";
App::$strings["Hide or Unhide this connection from your other connections"] = "Cacher ou ne plus cacher ce contact vis-à-vis de vos autres contacts";
App::$strings["This connection is hidden!"] = "Ce contact est caché&nbsp;!";
App::$strings["Delete this connection"] = "Supprimer ce contact";
+App::$strings["Fetch Vcard"] = "";
+App::$strings["Fetch electronic calling card for this connection"] = "";
App::$strings["Open Individual Permissions section by default"] = "Ouvrir par défaut la section des autorisations individuelles";
App::$strings["Affinity"] = "Affinité";
App::$strings["Open Set Affinity section by default"] = "Ouvrir par défaut la section Définir le degré d'affinité";
App::$strings["Me"] = "Moi";
App::$strings["Family"] = "Famille";
-App::$strings["Friends"] = "Amis";
App::$strings["Acquaintances"] = "Connaissances";
App::$strings["Filter"] = "Filtrer";
App::$strings["Open Custom Filter section by default"] = "Ouvrir par défaut la section Filtre personnalisé";
@@ -684,7 +1085,7 @@ App::$strings["Add permission role"] = "Ajouter un rôle d'accès";
App::$strings["This connection's primary address is"] = "L'adresse principale de ce contact est";
App::$strings["Available locations:"] = "Emplacements disponibles&nbsp;:";
App::$strings["The permissions indicated on this page will be applied to all new connections."] = "Les permissions indiquées sur cette page seront appliquées à tous vos nouveaux contacts.";
-App::$strings["Connection Tools"] = "Outils de connexion";
+App::$strings["Connection Tools"] = "Actions du contact";
App::$strings["Slide to adjust your degree of friendship"] = "Faites glisser pour ajuster votre proximité avec le contact";
App::$strings["Rating"] = "Evaluation";
App::$strings["Slide to adjust your rating"] = "Faîtes glisser pour ajuster votre note";
@@ -695,12 +1096,7 @@ App::$strings["words one per line or #tags or /patterns/ or lang=xx, leave blank
App::$strings["Do not import posts with this text"] = "Ne pas importer les publications comprenant ce texte";
App::$strings["This information is public!"] = "Cette information est publique&nbsp;!";
App::$strings["Connection Pending Approval"] = "Contact en attente d'approbation";
-App::$strings["inherited"] = "héritée";
App::$strings["Please choose the profile you would like to display to %s when viewing your profile securely."] = "Merci de choisir le profil que vous souhaitez montrer quand %s visite votre profil de manière authentifiée.";
-App::$strings["Their Settings"] = "Leurs paramètres";
-App::$strings["My Settings"] = "Mes paramètres";
-App::$strings["Individual Permissions"] = "Permissions individuelles";
-App::$strings["Some permissions may be inherited from your channel's <a href=\"settings\"><strong>privacy settings</strong></a>, which have higher priority than individual settings. You can <strong>not</strong> change those settings here."] = "Certaines permissions peuvent être héritées de vos <a href=\"settings\">paramètres de confidentialité</a> de canal, lesquels sont prioritaires sur les réglages individuels. Vous pouvez modifier ces permissions ici mais cela n'aura aucun effet à moins de changer les paramètres hérités.";
App::$strings["Some permissions may be inherited from your channel's <a href=\"settings\"><strong>privacy settings</strong></a>, which have higher priority than individual settings. You can change those settings here but they wont have any impact unless the inherited setting changes."] = "Certaines permissions peuvent être héritées de vos <a href=\"settings\">paramètres de confidentialité</a> de canal, lesquels sont prioritaires sur les réglages individuels. Vous pouvez modifier ces permissions ici mais cela n'aura aucun effet à moins de changer les paramètres hérités.";
App::$strings["Last update:"] = "Dernière mise à jour&nbsp;:";
App::$strings["Details"] = "Détails";
@@ -722,154 +1118,69 @@ App::$strings["Locality"] = "Localité";
App::$strings["Region"] = "Région";
App::$strings["ZIP Code"] = "ZIP code";
App::$strings["Country"] = "Pays";
-App::$strings["\$Projectname"] = "\$Projectname";
-App::$strings["Welcome to %s"] = "Bienvenue sur %s";
-App::$strings["Permission Denied."] = "Permission refusée.";
-App::$strings["File not found."] = "Fichier introuvable.";
-App::$strings["Edit file permissions"] = "Modifier les autorisations d'accès au fichier";
-App::$strings["Set/edit permissions"] = "Définir/modifier les autorisations";
-App::$strings["Include all files and sub folders"] = "Inclure tous fichiers et sous-répertoires";
-App::$strings["Return to file list"] = "Retourner à la liste des fichiers";
-App::$strings["Copy/paste this code to attach file to a post"] = "Copiez/collez ce code pour joindre le fichier à une publication";
-App::$strings["Copy/paste this URL to link file from a web page"] = "Copiez/collez cette URL pour pointer vers ce fichier depuis une page web";
-App::$strings["Share this file"] = "Partager ce fichier";
-App::$strings["Show URL to this file"] = "Montrer l'URL de ce fichier";
-App::$strings["Notify your contacts about this file"] = "Notifier vos contacts à propos de ce fichier";
+App::$strings["Room not found"] = "Salon introuvable";
+App::$strings["Leave Room"] = "Quitter le salon";
+App::$strings["Delete Room"] = "Supprimer le salon";
+App::$strings["I am away right now"] = "Je suis absent en ce moment";
+App::$strings["I am online"] = "Je suis en ligne";
+App::$strings["Bookmark this room"] = "Marquer ce salon comme favori";
+App::$strings["Please enter a link URL:"] = "Merci d'entrer l'URL d'un lien&nbsp;:";
+App::$strings["Encrypt text"] = "Chiffrer le texte";
+App::$strings["New Chatroom"] = "Nouveau salon de discussion";
+App::$strings["Chatroom name"] = "Nom du salon de conversation";
+App::$strings["Expiration of chats (minutes)"] = "Expiration des discussions (en minutes)";
+App::$strings["%1\$s's Chatrooms"] = "Salons de %1\$s";
+App::$strings["No chatrooms available"] = "Aucun salon de conversation disponible";
+App::$strings["Expiration"] = "Expiration";
+App::$strings["min"] = "min";
App::$strings["Photos"] = "Photos";
-App::$strings["Apps"] = "Applications";
-App::$strings["Permissions denied."] = "Permissions refusées.";
-App::$strings["l, F j"] = "l, F j";
-App::$strings["Link to Source"] = "Lien vers la Source";
-App::$strings["Edit Event"] = "Modifier l'événement";
-App::$strings["Create Event"] = "Créer un événement";
-App::$strings["Export"] = "Export";
-App::$strings["Import"] = "Import";
-App::$strings["Today"] = "Aujourd'hui";
-App::$strings["Privacy group created."] = "Groupe d'accès créé.";
-App::$strings["Could not create privacy group."] = "Impossible de créer le groupe d'accès.";
-App::$strings["Privacy group not found."] = "Groupe d'accès introuvable.";
-App::$strings["Privacy group updated."] = "Groupe d'accès mis à jour.";
-App::$strings["Create a group of channels."] = "Créer un groupe de canaux.";
-App::$strings["Privacy group name: "] = "Nom du groupe d'accès&nbsp;:";
+App::$strings["Files"] = "Fichiers";
+App::$strings["Unable to update menu."] = "Impossible de mettre le menu à jour.";
+App::$strings["Unable to create menu."] = "Impossible de créer le menu.";
+App::$strings["Menu Name"] = "Nom du menu";
+App::$strings["Unique name (not visible on webpage) - required"] = "Nom unique (non visible sur la page web) - requis";
+App::$strings["Menu Title"] = "Titre du menu";
+App::$strings["Visible on webpage - leave empty for no title"] = "Visible pour la page web - laisser vide pour qu'il n'y ait pas de titre";
+App::$strings["Allow Bookmarks"] = "Autoriser l'usage de favoris";
+App::$strings["Menu may be used to store saved bookmarks"] = "Le menu pourra être utilisé pour stocker des favoris";
+App::$strings["Submit and proceed"] = "Valider et continuer";
+App::$strings["Menus"] = "Menus";
+App::$strings["Bookmarks allowed"] = "Favoris autorisés";
+App::$strings["Delete this menu"] = "Supprimer ce menu";
+App::$strings["Edit menu contents"] = "Modifier le contenu du menu";
+App::$strings["Edit this menu"] = "Modifier ce menu";
+App::$strings["Menu could not be deleted."] = "Impossible de supprimer le menu.";
+App::$strings["Edit Menu"] = "Modifier le menu";
+App::$strings["Add or remove entries to this menu"] = "Ajouter/supprimer des entrées à ce menu";
+App::$strings["Menu name"] = "Nom du menu";
+App::$strings["Must be unique, only seen by you"] = "Doit être unique, ne sera vu que par vous";
+App::$strings["Menu title"] = "Titre du menu";
+App::$strings["Menu title as seen by others"] = "Titre du menu tel que vu par les visiteurs";
+App::$strings["Allow bookmarks"] = "Autoriser l'usage de favoris";
+App::$strings["Layouts"] = "Mises-en-page";
+App::$strings["Help"] = "Aide";
+App::$strings["Comanche page description language help"] = "Aide sur le langage de description de page Comanche";
+App::$strings["Layout Description"] = "Description de la mise en page";
+App::$strings["Download PDL file"] = "Télécharger le fichier PDL";
+App::$strings["post"] = "publication";
+App::$strings["comment"] = "commentaire";
+App::$strings["%1\$s tagged %2\$s's %3\$s with %4\$s"] = "%1\$s a étiqueté le %3\$s de %2\$s avec %4\$s";
+App::$strings["This setting requires special processing and editing has been blocked."] = "Ce paramètre nécessité un traitement spécial, les modifications ont été bloquées.";
+App::$strings["Configuration Editor"] = "Editeur de configuration";
+App::$strings["Warning: Changing some settings could render your channel inoperable. Please leave this page unless you are comfortable with and knowledgeable about how to correctly use this feature."] = "Attention&nbsp;:modifier certains paramètres peut rendre votre canal inutilisable. Merci d'ignorer cette page à moins d'être suffisamment à l'aise de savoir comment utiliser correctement cette fonctionnalité.";
+App::$strings["Privacy group created."] = "Groupe de contacts créé.";
+App::$strings["Could not create privacy group."] = "Impossible de créer le groupe de contacts.";
+App::$strings["Privacy group not found."] = "Groupe de contacts introuvable.";
+App::$strings["Privacy group updated."] = "Groupe de contacts mis à jour.";
+App::$strings["Create a group of channels."] = "Créer un groupe de contacts.";
+App::$strings["Privacy group name: "] = "Nom du groupe de contacts&nbsp;:";
App::$strings["Members are visible to other channels"] = "Les membres sont visibles par les autres canaux";
-App::$strings["Privacy group removed."] = "Groupe d'accès supprimé.";
-App::$strings["Unable to remove privacy group."] = "Impossible de supprimer le groupe d'accès.";
-App::$strings["Privacy group editor"] = "Editeur de groupe d'accès.";
+App::$strings["Privacy group removed."] = "Groupe de contacts supprimé.";
+App::$strings["Unable to remove privacy group."] = "Impossible de supprimer le groupe de canaux.";
+App::$strings["Privacy group editor"] = "Editeur de groupe de contacts.";
+App::$strings["Members"] = "Membres";
App::$strings["All Connected Channels"] = "Tous les canaux connectés";
App::$strings["Click on a channel to add or remove."] = "Cliquer sur un canal pour l'ajouter ou le supprimer";
-App::$strings["Invalid message"] = "Message non valide";
-App::$strings["no results"] = "aucun résultat";
-App::$strings["channel sync processed"] = "Synchro de canal effectuée";
-App::$strings["queued"] = "mis dans la file d'attente";
-App::$strings["posted"] = "publié";
-App::$strings["accepted for delivery"] = "accepté pour la distribution";
-App::$strings["updated"] = "mis à jour";
-App::$strings["update ignored"] = "mise à jour ignorée";
-App::$strings["permission denied"] = "permission refusée";
-App::$strings["recipient not found"] = "destinataire introuvable";
-App::$strings["mail recalled"] = "courriel rappelé";
-App::$strings["duplicate mail received"] = "courriel reçu en double";
-App::$strings["mail delivered"] = "courriel distribué";
-App::$strings["Delivery report for %1\$s"] = "Rapport de distribution pour %1\$s";
-App::$strings["Options"] = "Options";
-App::$strings["Redeliver"] = "Transférer à nouveau";
-App::$strings["webpage"] = "pages web";
-App::$strings["block"] = "bloquer";
-App::$strings["layout"] = "mise en page";
-App::$strings["menu"] = "menu";
-App::$strings["%s element installed"] = "Elément %s installé";
-App::$strings["%s element installation failed"] = "L'installation de l'élément %s a échoué";
-App::$strings["Nothing to import."] = "Rien à importer.";
-App::$strings["Unable to download data from old server"] = "Impossible de récupérer les données de l'ancien serveur";
-App::$strings["Imported file is empty."] = "Le fichier importé est vide.";
-App::$strings["Warning: Database versions differ by %1\$d updates."] = "Attention&nbsp;: les versions de bases de données diffèrent de %1\$d mises à jour.";
-App::$strings["Import completed"] = "L'import est terminé.";
-App::$strings["Import Items"] = "Importer";
-App::$strings["Use this form to import existing posts and content from an export file."] = "Utiliser ce formulaire pour importer des publications et du contenu existant d'un fichier d'export.";
-App::$strings["File to Upload"] = "Fichier à envoyer";
-App::$strings["You have created %1$.0f of %2$.0f allowed channels."] = "Vous avez créé %1$.0f des %2$.0f canaux autorisés.";
-App::$strings["Create a new channel"] = "Créer un nouveau canal";
-App::$strings["Create New"] = "Nouveau";
-App::$strings["Channel Manager"] = "Gérer mes canaux";
-App::$strings["Current Channel"] = "Canal actif";
-App::$strings["Switch to one of your channels by selecting it."] = "Pour changer de canal, sélectionnez-en un";
-App::$strings["Default Channel"] = "Canal par défaut";
-App::$strings["Make Default"] = "Définir comme défaut";
-App::$strings["%d new messages"] = "%d nouveaux messages";
-App::$strings["%d new introductions"] = "%d nouvelles relations";
-App::$strings["Delegated Channel"] = "Canaux délégués";
-App::$strings["Your service plan only allows %d channels."] = "Votre forfait n'autorise que %d canaux.";
-App::$strings["No channel. Import failed."] = "Pas de canal. Echec de l'import.";
-App::$strings["Import completed."] = "L'import est terminé.";
-App::$strings["You must be logged in to use this feature."] = "Vous devez vous connecter pour utiliser cette fonctionnalité.";
-App::$strings["Import Channel"] = "Importation de canal";
-App::$strings["Use this form to import an existing channel from a different server/hub. You may retrieve the channel identity from the old server/hub via the network or provide an export file."] = "Utilisez ce formulaire pour importer un canal existant sur un autre serveur. Vous pouvez récupérer l'identité du canal sur l'ancien serveur directement par le réseau, ou bien fournir un fichier d'export/import.";
-App::$strings["Or provide the old server/hub details"] = "Ou fournissez les détails de l'ancien serveur/hub";
-App::$strings["Your old identity address (xyz@example.com)"] = "Votre ancienne identité (zyx@exemple.com)";
-App::$strings["Your old login email address"] = "Votre ancienne adresse de courriel";
-App::$strings["Your old login password"] = "Votre ancien mot de passe";
-App::$strings["For either option, please choose whether to make this hub your new primary address, or whether your old location should continue this role. You will be able to post from either location, but only one can be marked as the primary location for files, photos, and media."] = "Quelle que soit l'option choisie, merci de décider si ce hub sera votre nouvelle adresse primaire, ou si votre ancien hub continuera à jouer ce rôle. Vous pourrez publier depuis l'emplacement de votre choix, mais une seule peut être déclarée comme stockage primaire de vos fichiers/photos/media.";
-App::$strings["Make this hub my primary location"] = "Faire de ce hub mon emplacement primaire";
-App::$strings["Move this channel (disable all previous locations)"] = "Déplacer ce canal (désactiver tous les emplacements précédents)";
-App::$strings["Import a few months of posts if possible (limited by available memory"] = "Importer plusieurs mois de messages si possible (limité par la mémoire disponible)";
-App::$strings["This process may take several minutes to complete. Please submit the form only once and leave this page open until finished."] = "Ce processus peut prendre plusieurs minutes. Merci de ne valider le formulaire qu'une seule fois et de laisser cette page ouverte jusqu'à la fin.";
-App::$strings["Remote privacy information not available."] = "Les informations distantes de confidentialité ne sont pas disponibles.";
-App::$strings["Visible to:"] = "Visible par&nbsp;:";
-App::$strings["Hub not found."] = "Hub introuvable.";
-App::$strings["Unable to create element."] = "Impossible de créer l'entrée.";
-App::$strings["Unable to update menu element."] = "Impossible de mettre à jour l'entrée de menu.";
-App::$strings["Unable to add menu element."] = "Impossible d'ajouter l'entrée de menu.";
-App::$strings["Menu Item Permissions"] = "Permissions de l'entrée de menu";
-App::$strings["(click to open/close)"] = "(cliquer pour ouvrir/fermer)";
-App::$strings["Link Name"] = "Nom du lien";
-App::$strings["Link or Submenu Target"] = "Lien ou sous-menu cible";
-App::$strings["Enter URL of the link or select a menu name to create a submenu"] = "Entrez l'URL du lien ou sélectionnez un nom de menu pour créer un sous-menu";
-App::$strings["Use magic-auth if available"] = "Utiliser l'authentification distante, quand disponible";
-App::$strings["Open link in new window"] = "Ouvrir le lien dans une nouvelle fenêtre";
-App::$strings["Order in list"] = "Ordre dans la liste";
-App::$strings["Higher numbers will sink to bottom of listing"] = "Les nombres les plus élevés seront au bas de la liste";
-App::$strings["Submit and finish"] = "Vadiler et terminer";
-App::$strings["Submit and continue"] = "Valider et continuer";
-App::$strings["Menu:"] = "Menu&nbsp;:";
-App::$strings["Link Target"] = "Cible du lien";
-App::$strings["Edit menu"] = "Modifier le menu";
-App::$strings["Edit element"] = "Modifier l'entrée";
-App::$strings["Drop element"] = "Supprimer l'entrée";
-App::$strings["New element"] = "Nouvelle entrée";
-App::$strings["Edit this menu container"] = "Éditer ce bloc de menu";
-App::$strings["Add menu element"] = "Ajouter une entrée au menu";
-App::$strings["Delete this menu item"] = "Supprimer cette entrée du menu";
-App::$strings["Edit this menu item"] = "Modifier cette entrée du menu";
-App::$strings["Menu item not found."] = "Entrée de menu introuvable.";
-App::$strings["Menu item deleted."] = "Entrée de menu supprimée.";
-App::$strings["Menu item could not be deleted."] = "Impossible de supprimer l'entrée de menu.";
-App::$strings["Edit Menu Element"] = "Modifier l'entrée de menu";
-App::$strings["Link text"] = "Texte du lien";
-App::$strings["App installed."] = "Application installée.";
-App::$strings["Malformed app."] = "Erreur de l'application - Malformée.";
-App::$strings["Embed code"] = "Imbriquer le code";
-App::$strings["Edit App"] = "Modifier l'application";
-App::$strings["Create App"] = "Créer une application";
-App::$strings["Name of app"] = "Nom de l'application";
-App::$strings["Required"] = "Requis";
-App::$strings["Location (URL) of app"] = "Emplacement (URL) de l'application";
-App::$strings["Description"] = "Description";
-App::$strings["Photo icon URL"] = "URL de l'icône à utiliser pour cette photo";
-App::$strings["80 x 80 pixels - optional"] = "80 x 80 pixels - facultatif";
-App::$strings["Categories (optional, comma separated list)"] = "Catégories (séparées par des virgules)";
-App::$strings["Version ID"] = "Identifiant de version";
-App::$strings["Price of app"] = "Prix de l'application";
-App::$strings["Location (URL) to purchase app"] = "Emplacement (URL) pour l'achat de l'application";
-App::$strings["No ratings"] = "Pas de note";
-App::$strings["Rating: "] = "Evaluation&nbsp:";
-App::$strings["Website: "] = "Site web&nbsp;:";
-App::$strings["Description: "] = "Description&nbsp;:";
-App::$strings["Item not available."] = "Élément indisponible.";
-App::$strings["__ctx:mood__ %1\$s is %2\$s"] = "%1\$s est %2\$s";
-App::$strings["Mood"] = "Humeur";
-App::$strings["Set your current mood and tell your friends"] = "Indiquez votre humeur du moment à vos amis";
-App::$strings["No more system notifications."] = "Pas d'autre notification du système.";
-App::$strings["System Notifications"] = "Notifications du système";
App::$strings["Profile not found."] = "Profil introuvable.";
App::$strings["Profile deleted."] = "Profil supprimé.";
App::$strings["Profile-"] = "Profil-";
@@ -935,294 +1246,36 @@ App::$strings["Love/Romance"] = "Amour/Relation amoureuse";
App::$strings["School/Education"] = "Niveau d'étude";
App::$strings["Contact information and social networks"] = "Coordonnées et autres réseaux sociaux";
App::$strings["My other channels"] = "Mes autres canaux";
+App::$strings["Communications"] = "";
App::$strings["Profile Image"] = "Image du profil";
App::$strings["Edit Profiles"] = "Modifier mes profils";
-App::$strings["Authorize application connection"] = "Autoriser l'application à se connecter";
-App::$strings["Return to your app and insert this Security Code:"] = "Revenez dans votre application et mettez le code de sécurité";
-App::$strings["Please login to continue."] = "Merci de vous identifier pour continuer.";
-App::$strings["Do you want to authorize this application to access your posts and contacts, and/or create new posts for you?"] = "Voulez-vous autoriser cette application à accéder à vos publications et contacts, et/ou à publier en votre nom?";
-App::$strings["Total invitation limit exceeded."] = "Limite du nombre total d'invitation dépassée.";
-App::$strings["%s : Not a valid email address."] = "%s&nbsp;: adresse courriel invalide.";
-App::$strings["Please join us on \$Projectname"] = "Rejoignez-nous sur \$Projectname";
-App::$strings["Invitation limit exceeded. Please contact your site administrator."] = "Limite d'invitations dépassée. Merci de contacter l'administration de votre site.";
-App::$strings["%s : Message delivery failed."] = "%s&nbsp;: Échec de distribution du message.";
-App::$strings["%d message sent."] = array(
- 0 => "%d message envoyé.",
- 1 => "%d messages envoyés.",
-);
-App::$strings["You have no more invitations available"] = "Vous ne disposez plus d'aucune invitation";
-App::$strings["Send invitations"] = "Envoyer des invitations";
-App::$strings["Enter email addresses, one per line:"] = "Entrez les adresses de courriel, une par ligne&nbsp;:";
-App::$strings["Your message:"] = "Votre message&nbsp;:";
-App::$strings["Please join my community on \$Projectname."] = "Rejoignez ma communauté sur \$Projectname.";
-App::$strings["You will need to supply this invitation code:"] = "Vous devrez fournir le code suivant&nbsp;:";
-App::$strings["1. Register at any \$Projectname location (they are all inter-connected)"] = "1. Enregistrez-vous sur n'importe quel serveur \$Projectname (ils sont tous inter-connectés)";
-App::$strings["2. Enter my \$Projectname network address into the site searchbar."] = "2. Saisissez l'adresse de mon canal \$Projectname dans la barre de recherche du site.";
-App::$strings["or visit"] = "ou rendez-vous sur";
-App::$strings["3. Click [Connect]"] = "3. Cliquez sur [Ajouter]";
+App::$strings["Page link"] = "Lien";
+App::$strings["Edit Webpage"] = "Modifier la page web";
+App::$strings["Create a new channel"] = "Créer un nouveau canal";
+App::$strings["Channel Manager"] = "Gérer mes canaux";
+App::$strings["Current Channel"] = "Canal actif";
+App::$strings["Switch to one of your channels by selecting it."] = "Pour changer de canal, sélectionnez-en un";
+App::$strings["Default Channel"] = "Canal par défaut";
+App::$strings["Make Default"] = "Définir comme défaut";
+App::$strings["%d new messages"] = "%d nouveaux messages";
+App::$strings["%d new introductions"] = "%d nouvelles relations";
+App::$strings["Delegated Channel"] = "Canaux délégués";
+App::$strings["This directory server requires an access token"] = "Ce serveur d'annuaire requiert un jeton d'accès";
App::$strings["About this site"] = "À propos de ce site";
App::$strings["Site Name"] = "Nom du site";
App::$strings["Administrator"] = "Administrateur";
+App::$strings["Terms of Service"] = "Conditions de service";
App::$strings["Software and Project information"] = "Informations sur le logiciel et le projet";
App::$strings["This site is powered by \$Projectname"] = "Ce site est propulsé par ";
App::$strings["Federated and decentralised networking and identity services provided by Zot"] = "Réseau fédéré et décentralisé, et services d'identification fournies par Zot";
App::$strings["Version %s"] = "Version %s";
App::$strings["Project homepage"] = "Page d'accueil du projet";
App::$strings["Developer homepage"] = "Page d'accueil des développeurs";
-App::$strings["Create Channel"] = "Créer le canal";
-App::$strings["A channel is your identity on this network. It can represent a person, a blog, or a forum to name a few. Channels can make connections with other channels to share information with highly detailed permissions."] = "Un canal est votre identité sur ce réseau. Il peut représenter une personne, un blog, ou un forum par exemple. Les canaux peuvent entrer en contact les uns avec les autres pour partager des informations avec des permissions d'accès très fines.";
-App::$strings["or <a href=\"import\">import an existing channel</a> from another location."] = "ou <a href=\"import\">importer un canal existant</a> d'un autre serveur.";
-App::$strings["\$Projectname Server - Setup"] = "Serveur \$Projectname - configuration";
-App::$strings["Could not connect to database."] = "Impossible de se connecter à la base de données.";
-App::$strings["Could not connect to specified site URL. Possible SSL certificate or DNS issue."] = "Impossible de se connecter à l'URL indiquée. Problème potentiel de certificat SSL/TLS ou de DNS.";
-App::$strings["Could not create table."] = "Impossible de créer la table.";
-App::$strings["Your site database has been installed."] = "La base de données de votre site a été installée.";
-App::$strings["You may need to import the file \"install/schema_xxx.sql\" manually using a database client."] = "Vous pourriez avoir besoin d'importer le fichier \"install/schema_xxx.sql\" manuellement via un client de base de données (ex: phpmyadmin).";
-App::$strings["Please see the file \"install/INSTALL.txt\"."] = "Merci de consulter le fichier \"install/INSTALL.txt\".";
-App::$strings["System check"] = "Vérification du système";
-App::$strings["Check again"] = "Re-vérifier";
-App::$strings["Database connection"] = "Connexion à la base de données";
-App::$strings["In order to install \$Projectname we need to know how to connect to your database."] = "Pour installer \$Projectname, nous avons besoin de savoir comment se connecter à votre base de données.";
-App::$strings["Please contact your hosting provider or site administrator if you have questions about these settings."] = "Merci de contacter votre prestataire d'hébergement ou votre administrateur de site si vous avez des questions à propos de ces paramètres.";
-App::$strings["The database you specify below should already exist. If it does not, please create it before continuing."] = "La base de données que vous allez spécifier doit exister. Si ce n'est pas déjà le cas, merci de la créer avant de continuer.";
-App::$strings["Database Server Name"] = "Nom du serveur de base de données";
-App::$strings["Default is 127.0.0.1"] = "Par défaut 127.0.0.1";
-App::$strings["Database Port"] = "Port de la base de données";
-App::$strings["Communication port number - use 0 for default"] = "Numéro TCP du port - utilisez 0 pour la valeur par défaut";
-App::$strings["Database Login Name"] = "Identifiant de connexion à la Base de Données";
-App::$strings["Database Login Password"] = "Mot de passe de connexion à la Base de Données";
-App::$strings["Database Name"] = "Nom de la Base de Données";
-App::$strings["Database Type"] = "Type de base de données";
-App::$strings["Site administrator email address"] = "Adresse de courriel de l'administrateur du site";
-App::$strings["Your account email address must match this in order to use the web admin panel."] = "Votre compte devra utiliser la même adresse de courriel pour pouvoir utiliser l'administration web.";
-App::$strings["Website URL"] = "URL du site web";
-App::$strings["Please use SSL (https) URL if available."] = "Veuillez utiliser SSL/TLS (https) si disponible.";
-App::$strings["Please select a default timezone for your website"] = "Veuillez choisir un fuseau horaire par défaut pour votre site";
-App::$strings["Site settings"] = "Paramètres du site";
-App::$strings["PHP version 5.5 or greater is required."] = "PHP version 5.5 ou supérieur est requis";
-App::$strings["PHP version"] = "Version de PHP";
-App::$strings["Could not find a command line version of PHP in the web server PATH."] = "Impossible de trouver une version CLI de PHP dans le PATH du serveur web.";
-App::$strings["If you don't have a command line version of PHP installed on server, you will not be able to run background polling via cron."] = "En l'absence de version CLI de PHP sur votre serveur, vous ne pourrez pas utiliser la synchronisation en arrière-plan via cron.";
-App::$strings["PHP executable path"] = "Chemin vers l'éxecutable PHP";
-App::$strings["Enter full path to php executable. You can leave this blank to continue the installation."] = "Entrez le chemin complet vers l'exécutable php. Vous pouvez continuer l'installation sans.";
-App::$strings["Command line PHP"] = "PHP en ligne de commande (CLI)";
-App::$strings["Unable to check command line PHP, as shell_exec() is disabled. This is required."] = "Impossible de vérifier la ligne de commande PHP, car shell_exec () est désactivé. Ceci est nécessaire.";
-App::$strings["The command line version of PHP on your system does not have \"register_argc_argv\" enabled."] = "La version CLI de PHP sur votre système n'a pas l'option \"register_argc_argv\" activée.";
-App::$strings["This is required for message delivery to work."] = "Elle est nécessaire pour la distribution des messages.";
-App::$strings["PHP register_argc_argv"] = "PHP register_argc_argv";
-App::$strings["Your max allowed total upload size is set to %s. Maximum size of one file to upload is set to %s. You are allowed to upload up to %d files at once."] = "Votre taille de téléversement maximale totale autorisée est fixée à %s. La taille maximale d'un seul fichier à téléverser est fixée à %s. Vous pouvez téléverser jusqu'à %d fichier(s) à la fois.";
-App::$strings["You can adjust these settings in the server php.ini file."] = "Vous pouvez ajuster ces paramètres dans le fichier php.ini du serveur.";
-App::$strings["PHP upload limits"] = "Limites de téléversement de PHP";
-App::$strings["Error: the \"openssl_pkey_new\" function on this system is not able to generate encryption keys"] = "Erreur&nbsp;: la fonction \"openssl_pkey_new\" de ce système n'est pas capable de générer des clefs de chiffrement";
-App::$strings["If running under Windows, please see \"http://www.php.net/manual/en/openssl.installation.php\"."] = "Si vous êtes sur un serveur Windows, merci de consulter \"http://www.php.net/manual/fr/openssl.installation.php\".";
-App::$strings["Generate encryption keys"] = "Générer les clefs de chiffrement";
-App::$strings["libCurl PHP module"] = "module PHP libCurl";
-App::$strings["GD graphics PHP module"] = "module PHP GD graphics";
-App::$strings["OpenSSL PHP module"] = "module PHP OpenSSL";
-App::$strings["PDO database PHP module"] = "module PDO de la base de données PHP";
-App::$strings["mb_string PHP module"] = "module PHP mb_string";
-App::$strings["xml PHP module"] = "module PHP xml";
-App::$strings["Apache mod_rewrite module"] = "module Apache mod_rewrite";
-App::$strings["Error: Apache webserver mod-rewrite module is required but not installed."] = "Erreur&nbsp;: le module mod-rewrite du serveur web Apache est requis, mais pas installé.";
-App::$strings["exec"] = "exécuter";
-App::$strings["Error: exec is required but is either not installed or has been disabled in php.ini"] = "Erreur: exec est requis mais soit il n'est pas installé, soit il a été désactivé dans php.ini";
-App::$strings["shell_exec"] = "shell_exec";
-App::$strings["Error: shell_exec is required but is either not installed or has been disabled in php.ini"] = "Erreur: shell_exec est requis mais soit il n'est pas installé, soit il a été désactivé dans php.ini";
-App::$strings["Error: libCURL PHP module required but not installed."] = "Erreur&nbsp;: le module libCURL de PHP est requis, mais pas installé.";
-App::$strings["Error: GD graphics PHP module with JPEG support required but not installed."] = "Erreur&nbsp;: le module GD de PHP avec support JPEG est requis, mais pas installé.";
-App::$strings["Error: openssl PHP module required but not installed."] = "Erreur&nbsp;: le module openssl de PHP est requis, mais pas installé.";
-App::$strings["Error: PDO database PHP module required but not installed."] = "Erreur: le module PDO de base de données PHP est requis mais n'est pas installé.";
-App::$strings["Error: mb_string PHP module required but not installed."] = "Erreur&nbsp;: le module mb_string de PHP est requis, mais pas installé.";
-App::$strings["Error: xml PHP module required for DAV but not installed."] = "Erreur&nbsp;: le module xml de PHP est requis pour le DAV, mais pas installé.";
-App::$strings["The web installer needs to be able to create a file called \".htconfig.php\" in the top folder of your web server and it is unable to do so."] = "L'installeur web a besoin de créer un fichier \".htconfig.php\" à la racine de votre serveur web, mais en est incapable.";
-App::$strings["This is most often a permission setting, as the web server may not be able to write files in your folder - even if you can."] = "C'est généralement lié à un problème de droits, à cause duquel le serveur web est interdit d'écriture dans le répertoire concerné - alors que votre propre utilisateur a le droit.";
-App::$strings["At the end of this procedure, we will give you a text to save in a file named .htconfig.php in your Red top folder."] = "Au terme de cette procédure, nous vous transmettrons un texte à sauvegarder dans un fichier nommé .htconfig.php, à la racine de votre installation de \$Projectname.";
-App::$strings["You can alternatively skip this procedure and perform a manual installation. Please see the file \"install/INSTALL.txt\" for instructions."] = "Autrement, vous pouvez contourner toute cette procédure et réaliser l'installation manuellement. Merci de consulter le fichier \"install/INSTALL.txt\" pour les instructions détaillées.";
-App::$strings[".htconfig.php is writable"] = "Le fichier .htconfig.php est accessible en écriture";
-App::$strings["This software uses the Smarty3 template engine to render its web views. Smarty3 compiles templates to PHP to speed up rendering."] = "Ce logiciel utilise Smarty3 comme moteur de modèles pour afficher ses vues Web. Smarty3 compile ses modèles en PHP pour accélérer le rendu.";
-App::$strings["In order to store these compiled templates, the web server needs to have write access to the directory %s under the top level web folder."] = "Afin de stocker ces modèles compilés, le serveur Web doit disposer d'un accès en écriture au répertoire %s selon le dossier Web racine.";
-App::$strings["Please ensure that the user that your web server runs as (e.g. www-data) has write access to this folder."] = "Merci de vous assurer que l'utilisateur sous lequel le serveur web tourne (le plus souvent, www-data) a bien l'autorisation d'écrire dans ce répertoire.";
-App::$strings["Note: as a security measure, you should give the web server write access to %s only--not the template files (.tpl) that it contains."] = "Note: Comme mesure de sécurité, assurez vous de donner les droits d'écriture au serveur web sur %s uniquement, pas sur les fichiers individuels (.tpl) qu'il contient.";
-App::$strings["%s is writable"] = "Permission d'écriture sur %s activée";
-App::$strings["This software uses the store directory to save uploaded files. The web server needs to have write access to the store directory under the top level web folder"] = "Ce logiciel utilise le répertoire de stockage pour enregistrer les fichiers téléversés. Le serveur Web doit disposer d'un accès en écriture au répertoire de stockage selon le dossier web racine.";
-App::$strings["store is writable"] = "'store' est accessible en écriture";
-App::$strings["SSL certificate cannot be validated. Fix certificate or disable https access to this site."] = "Le certificat SSL/TLS n'a pas pu être validé. Merci de le corriger, ou de désactiver l'accès https à ce site (non recommandé).";
-App::$strings["If you have https access to your website or allow connections to TCP port 443 (the https: port), you MUST use a browser-valid certificate. You MUST NOT use self-signed certificates!"] = "Si votre serveur accepte les connexions https ou s'il permet les connexions sur le port TCP 443 (le port utilisé par le protocole https), vous DEVEZ utiliser un certificat valide. Vous ne DEVEZ PAS utiliser un certificat que vous avez vous-mêmes signé&nbsp;!";
-App::$strings["This restriction is incorporated because public posts from you may for example contain references to images on your own hub."] = "Nous avons ajouté cette contrainte pour éviter que vos publications publiques ne fassent référence par exemple à des images sur votre propre hub.";
-App::$strings["If your certificate is not recognized, members of other sites (who may themselves have valid certificates) will get a warning message on their own site complaining about security issues."] = "Si votre certificat n'est pas reconnu, les membres des autres sites (qui eux peuvent avoir des certificats valides) recevront des messages d'avertissement sur leur propre site se plaignant de problèmes de sécurité.";
-App::$strings["This can cause usability issues elsewhere (not just on your own site) so we must insist on this requirement."] = "Ceci peut causer des problèmes d'ergonomie ailleurs (pas seulement sur votre site), nous devons donc insister sur ce prérequis.";
-App::$strings["Providers are available that issue free certificates which are browser-valid."] = "Il existe des autorités de certification qui vous fourniront gratuitement un certificat valide.";
-App::$strings["If you are confident that the certificate is valid and signed by a trusted authority, check to see if you have failed to install an intermediate cert. These are not normally required by browsers, but are required for server-to-server communications."] = "Si vous êtes certain que le certificat est valide et signé par une autorité de confiance, vérifiez si l'installation d'un certificat intermédiaire aurait échoué. Ceux-ci ne sont normalement pas requis par les navigateurs, mais ils sont requis pour les communications entre serveurs.";
-App::$strings["SSL certificate validation"] = "Validation du certificat SSL/TLS";
-App::$strings["Url rewrite in .htaccess is not working. Check your server configuration.Test: "] = "La réécriture d'URL définie dans le .htaccess ne fonctionne pas. Vérifiez votre configuration serveur. Test&nbsp;:";
-App::$strings["Url rewrite is working"] = "La réécriture d'URL fonctionne";
-App::$strings["The database configuration file \".htconfig.php\" could not be written. Please use the enclosed text to create a configuration file in your web server root."] = "Le fichier de configuration de la base de données - \".htconfig.php\" - ne peut être écrit. Merci de copier le texte généré dans un fichier à ce nom, à la racine de votre serveur web.";
-App::$strings["Errors encountered creating database tables."] = "Erreurs rencontrées pendant la création de tables de BDD.";
-App::$strings["<h1>What next</h1>"] = "<h1>Et maintenant</h1>";
-App::$strings["IMPORTANT: You will need to [manually] setup a scheduled task for the poller."] = "IMPORTANT&nbsp;: Vous devez créer [manuellement] une tâche planifiée pour les mises à jour du réseau.";
-App::$strings["Mark all system notifications seen"] = "Marquer toutes les notifications système comme vues";
-App::$strings["Poke"] = "Tapoter";
-App::$strings["Poke somebody"] = "Taquiner quelqu'un";
-App::$strings["Poke/Prod"] = "Tapoter/Encourager";
-App::$strings["Poke, prod or do other things to somebody"] = "Taquiner, pousser ou faire autre chose à quelqu'un";
-App::$strings["Recipient"] = "Destinataire";
-App::$strings["Choose what you wish to do to recipient"] = "Choisir ce que vous voulez faire au destinataire";
-App::$strings["Make this post private"] = "Rendre cette publication privée";
-App::$strings["Unable to find your hub."] = "Impossible de trouver votre hub.";
-App::$strings["Post successful."] = "Publication réussie.";
-App::$strings["Unable to locate original post."] = "Impossible de localiser la publication initiale.";
-App::$strings["Empty post discarded."] = "Publication vide annulée.";
-App::$strings["Executable content type not permitted to this channel."] = "Les contenus de type 'exécutable' ne sont pas autorisés sur ce canal.";
-App::$strings["Duplicate post suppressed."] = "Publication en doublon supprimée.";
-App::$strings["System error. Post not saved."] = "Erreur système. Publication non sauvegardée.";
-App::$strings["Unable to obtain post information from database."] = "Impossible d'obtenir les informations de publication depuis la base de données.";
-App::$strings["You have reached your limit of %1$.0f top level posts."] = "Vous avez atteint votre limite de %1$.0f contributions \"racines\".";
-App::$strings["You have reached your limit of %1$.0f webpages."] = "Vous avez atteint votre limite de %1$.0f pages web.";
-App::$strings["This setting requires special processing and editing has been blocked."] = "Ce paramètre nécessité un traitement spécial, les modifications ont été bloquées.";
-App::$strings["Configuration Editor"] = "Editeur de configuration";
-App::$strings["Warning: Changing some settings could render your channel inoperable. Please leave this page unless you are comfortable with and knowledgeable about how to correctly use this feature."] = "Attention&nbsp;:modifier certains paramètres peut rendre votre canal inutilisable. Merci d'ignorer cette page à moins d'être suffisamment à l'aise de savoir comment utiliser correctement cette fonctionnalité.";
-App::$strings["vcard"] = "vcard";
-App::$strings["Blocks"] = "Blocs";
-App::$strings["Block Title"] = "Titre du bloc";
-App::$strings["Layouts"] = "Mises-en-page";
-App::$strings["Help"] = "Aide";
-App::$strings["Comanche page description language help"] = "Aide sur le langage de description de page Comanche";
-App::$strings["Layout Description"] = "Description de la mise en page";
-App::$strings["Download PDL file"] = "Télécharger le fichier PDL";
-App::$strings["Website:"] = "Site web&nbsp;:";
-App::$strings["Remote Channel [%s] (not yet known on this site)"] = "Canal distant [%s] (encore inconnu sur ce site)";
-App::$strings["Rating (this information is public)"] = "Evaluation (cette information est publique)";
-App::$strings["Optionally explain your rating (this information is public)"] = "Explication facultative de votre évaluation (cette information est publique)";
-App::$strings["Shift-reload the page or clear browser cache if the new photo does not display immediately."] = "Shift-rechargez votre page, ou videz le cache du navigateur si la photo ne s'affiche pas immédiatement.";
-App::$strings["Use Photo for Profile"] = "Utiliser la photo pour le profil";
-App::$strings["Upload Profile Photo"] = "Téléverser une photo de profil";
-App::$strings["Use"] = "Utiliser";
-App::$strings["Calendar entries imported."] = "Entrées du calendrier importées.";
-App::$strings["No calendar entries found."] = "Aucune entrée du calendrier trouvée.";
-App::$strings["Event can not end before it has started."] = "La fin de l'événement ne peut être antérieure à son début.";
-App::$strings["Unable to generate preview."] = "Impossible de générer l'aperçu.";
-App::$strings["Event title and start time are required."] = "Un titre et une date de début sont requises pour l'événement.";
-App::$strings["Event not found."] = "Événement introuvable.";
-App::$strings["Edit event title"] = "Modifier le titre de l'événement";
-App::$strings["Event title"] = "Titre de l'événement";
-App::$strings["Categories (comma-separated list)"] = "Catégories (séparées par des virgules)";
-App::$strings["Edit Category"] = "Modifier la catégorie";
-App::$strings["Category"] = "Catégorie";
-App::$strings["Edit start date and time"] = "Modifier la date et l'heure de début";
-App::$strings["Start date and time"] = "Date et heure de début";
-App::$strings["Finish date and time are not known or not relevant"] = "Date et heure de fin inconnues ou sans objet";
-App::$strings["Edit finish date and time"] = "Modifier la date et l'heure de fin";
-App::$strings["Finish date and time"] = "Date et heure de fin";
-App::$strings["Adjust for viewer timezone"] = "Ajuster au fuseau horaire du visiteur";
-App::$strings["Important for events that happen in a particular place. Not practical for global holidays."] = "Important pour les événements se tenant en un lieu particulier. Pas pratique pour les vacances communes à de nombreux pays dans le monde.";
-App::$strings["Edit Description"] = "Modifier la description";
-App::$strings["Edit Location"] = "Modifier l'emplacement";
-App::$strings["Permission settings"] = "Gérer les autorisations";
-App::$strings["Timezone:"] = "Fuseau horaire&nbsp;:";
-App::$strings["Advanced Options"] = "Options avancées";
-App::$strings["Edit event"] = "Modifier l'événement";
-App::$strings["Delete event"] = "Supprimer l'événement";
-App::$strings["calendar"] = "calendrier";
-App::$strings["Month"] = "Mois";
-App::$strings["Week"] = "Semaine";
-App::$strings["Day"] = "Jour";
-App::$strings["Event removed"] = "Événement supprimé";
-App::$strings["Failed to remove event"] = "Impossible de supprimer l'événement";
-App::$strings["No channel."] = "Pas de canal.";
-App::$strings["Common connections"] = "Contacts en commun";
-App::$strings["No connections in common."] = "Pas de contacts en commun.";
-App::$strings["toggle full screen mode"] = "Basculer en mode plein écran.";
-App::$strings["Invalid profile identifier."] = "Identifiant de profil invalide.";
-App::$strings["Profile Visibility Editor"] = "Éditeur de visibilité de profil";
-App::$strings["Profile"] = "Profil";
-App::$strings["Click on a contact to add or remove."] = "Cliquer sur un contact pour l'ajouter ou le retirer.";
-App::$strings["Visible To"] = "Visible par";
-App::$strings["You must be logged in to see this page."] = "Vous devez vous connecter pour voir cette page.";
-App::$strings["Posts and comments"] = "Publications et commentaires";
-App::$strings["Only posts"] = "Seulement les publications";
-App::$strings["Insufficient permissions. Request redirected to profile page."] = "Permissions insuffisantes. Demande redirigée vers la page du profil.";
-App::$strings["No valid account found."] = "Aucun compte valide trouvé.";
-App::$strings["Password reset request issued. Check your email."] = "Demande de réinitialisation du mot de passe envoyée. Vérifiez vos courriels.";
-App::$strings["Site Member (%s)"] = "Membre du site (%s)";
-App::$strings["Password reset requested at %s"] = "Demande de réinitialisation du mot de passe sur %s";
-App::$strings["Request could not be verified. (You may have previously submitted it.) Password reset failed."] = "La demande n'a pas pu être vérifiée. (Peut-être l'avez vous déjà utilisée.) La réinitialisation a échoué.";
-App::$strings["Password Reset"] = "Réinitialiser le mot de passe";
-App::$strings["Your password has been reset as requested."] = "Votre mot de passe a bien été réinitialisé.";
-App::$strings["Your new password is"] = "Votre nouveau mot de passe est";
-App::$strings["Save or copy your new password - and then"] = "Enregistrez ou copiez votre nouveau mot de passe, puis";
-App::$strings["click here to login"] = "cliquez ici pour vous connecter";
-App::$strings["Your password may be changed from the <em>Settings</em> page after successful login."] = "Votre mot de passe peut être changé depuis la page des <em>Paramètres</em> une fois connecté.";
-App::$strings["Your password has changed at %s"] = "Votre mot de passe de %s a été changé";
-App::$strings["Forgot your Password?"] = "Mot de passe oublié&nbsp;?";
-App::$strings["Enter your email address and submit to have your password reset. Then check your email for further instructions."] = "Saisissez votre adresse de courriel, et validez, pour réinitialiser votre mot de passe. Vérifiez ensuite votre boîte aux lettres pour la suite des instructions.";
-App::$strings["Email Address"] = "Adresse de courriel";
-App::$strings["Reset"] = "Réinitialiser";
-App::$strings["Select a bookmark folder"] = "Choisir un dossier de favoris";
-App::$strings["Save Bookmark"] = "Enregistrer le favori";
-App::$strings["URL of bookmark"] = "URL du favori";
-App::$strings["Or enter new bookmark folder name"] = "Ou entrez un nouveau nom de dossier de favoris";
-App::$strings["Channel added."] = "Canal ajouté.";
-App::$strings["Authentication failed."] = "Échec de l'authentification.";
-App::$strings["Remote Authentication"] = "Authentification distante";
-App::$strings["Enter your channel address (e.g. channel@example.com)"] = "Entrez l'adresse de votre canal (par ex. moncanal@monsite.com)";
-App::$strings["Authenticate"] = "Authentifier";
-App::$strings["Please login."] = "Merci de vous connecter.";
-App::$strings["Account removals are not allowed within 48 hours of changing the account password."] = "Il est impossible de supprimer un compte dans les 48 heures après avoir changé le mot de passe du compte.";
-App::$strings["Remove This Account"] = "Supprimer ce compte";
-App::$strings["WARNING: "] = "AVERTISSEMENT&nbsp;:";
-App::$strings["This account and all its channels will be completely removed from the network. "] = "Ce compte et tous ses canaux seront entièrement supprimés du réseau.";
-App::$strings["This action is permanent and can not be undone!"] = "Cette action est permanente et irréversible&nbsp;!";
-App::$strings["Please enter your password for verification:"] = "Merci de saisir votre mot de passe pour vérification&nbsp;:";
-App::$strings["Remove this account, all its channels and all its channel clones from the network"] = "Supprimer du réseau ce compte, tous ses canaux et tous les clones de ses canaux.";
-App::$strings["By default only the instances of the channels located on this hub will be removed from the network"] = "Par défaut, seules les instances des canaux situés sur ce hub seront supprimées du réseau";
-App::$strings["Remove Account"] = "Supprimer le compte";
-App::$strings["Layout updated."] = "Mise en page mise à jour.";
-App::$strings["Feature disabled."] = "Fonctionnalité désactivée";
-App::$strings["Edit System Page Description"] = "Modifier la description de la page du système";
-App::$strings["Layout not found."] = "Mise en page introuvable.";
-App::$strings["Module Name:"] = "Nom du module&nbsp;:";
-App::$strings["Layout Help"] = "Aide à la mise en page";
-App::$strings["Export Channel"] = "Exporter le canal";
-App::$strings["Export your basic channel information to a file. This acts as a backup of your connections, permissions, profile and basic data, which can be used to import your data to a new server hub, but does not contain your content."] = "Exportez les principales informations de votre canal dans un fichier. Celui-ci pourra servir de sauvegarde de vos contacts, permissions, profils et données de base. Il pourra être importé sur un nouveau hub/serveur, mais n'embarquera pas vos contenus.";
-App::$strings["Export Content"] = "Exporter le contenu";
-App::$strings["Export your channel information and recent content to a JSON backup that can be restored or imported to another server hub. This backs up all of your connections, permissions, profile data and several months of posts. This file may be VERY large. Please be patient - it may take several minutes for this download to begin."] = "Exportez les informations du canal et les contenus récents dans un fichier JSON. Celui-ci contiendra toutes vos relations, permissions, profils, et plusieurs mois de publications. Ce fichier peut être TRÈS gros. Armez-vous de patience - plusieurs minutes peuvent s'écouler avant que le téléchargement ne commence.";
-App::$strings["Export your posts from a given year."] = "Exporter vos publications d'une année en particulier";
-App::$strings["You may also export your posts and conversations for a particular year or month. Adjust the date in your browser location bar to select other dates. If the export fails (possibly due to memory exhaustion on your server hub), please try again selecting a more limited date range."] = "Vous pouvez également exporter vos publications et conversations pour une année ou un mois particulier. Ajustez la date dans la barre de votre navigateur pour sélectionner d'autres dates. Si l'export échoue (possible en cas de pénurie de mémoire sur le serveur de votre hub), essayez à nouveau en sélectionnant un intervalle de dates plus petit.";
-App::$strings["To select all posts for a given year, such as this year, visit <a href=\"%1\$s\">%2\$s</a>"] = "Pour sélectionner toutes les publications pour une année donnée, telle que cette année, visitez <a href=\"%1\$s\">%2\$s</a>";
-App::$strings["To select all posts for a given month, such as January of this year, visit <a href=\"%1\$s\">%2\$s</a>"] = "Pour sélectionner toutes les publications pour un mois donné, par exemple janvier, visitez <a href=\"%1\$s\">%2\$s</a>";
-App::$strings["These content files may be imported or restored by visiting <a href=\"%1\$s\">%2\$s</a> on any site containing your channel. For best results please import or restore these in date order (oldest first)."] = "Ces fichiers de contenu peuvent être importés ou restaurés en visitant <a href=\"%1\$s\">%2\$s</a> sur n'importe quel site hébergeant votre canal. Pour de meilleurs résultats merci de les importer par ordre chronologique (les plus anciens d'abord).";
-App::$strings["%d rating"] = array(
- 0 => "%d évaluation",
- 1 => "%d évaluations",
-);
-App::$strings["Gender: "] = "Sexe/genre&nbsp;:";
-App::$strings["Status: "] = "État&nbsp;:";
-App::$strings["Homepage: "] = "Site web&nbsp;:";
-App::$strings["Age:"] = "Age&nbsp;:";
-App::$strings["Location:"] = "Emplacement&nbsp;:";
-App::$strings["Description:"] = "Description&nbsp;:";
-App::$strings["Hometown:"] = "Ville natale&nbsp;:";
-App::$strings["About:"] = "À propos&nbsp;:";
-App::$strings["Connect"] = "Ajouter/Suivre";
-App::$strings["Public Forum:"] = "Forum public&nbsp;:";
-App::$strings["Keywords: "] = "Mots-clefs&nbsp;:";
-App::$strings["Don't suggest"] = "Ne pas suggérer";
-App::$strings["Common connections:"] = "Contacts en commun&nbsp;:";
-App::$strings["Global Directory"] = "Annuaire global";
-App::$strings["Local Directory"] = "Annuaire local";
-App::$strings["Finding:"] = "Recherche&nbsp;:";
-App::$strings["Channel Suggestions"] = "Canaux suggérés";
-App::$strings["next page"] = "page suivante";
-App::$strings["previous page"] = "page précédente";
-App::$strings["Sort options"] = "Options de tri";
-App::$strings["Alphabetic"] = "Alphabétique";
-App::$strings["Reverse Alphabetic"] = "Alphabétique inversé";
-App::$strings["Newest to Oldest"] = "Du plus récent au moins récent";
-App::$strings["Oldest to Newest"] = "Du moins récent du plus récent";
-App::$strings["No entries (some entries may be hidden)."] = "Pas d'entrées (certaines peuvent être cachées).";
-App::$strings["Away"] = "Absent";
-App::$strings["Online"] = "En ligne";
-App::$strings["No service class restrictions found."] = "Aucune restriction de classe de service trouvée.";
+App::$strings["No ratings"] = "Pas de note";
+App::$strings["Ratings"] = "Evaluations";
+App::$strings["Rating: "] = "Evaluation&nbsp:";
+App::$strings["Website: "] = "Site web&nbsp;:";
+App::$strings["Description: "] = "Description&nbsp;:";
App::$strings["Import Webpage Elements"] = "Importer éléments de page web";
App::$strings["Import selected"] = "Importation sélectionnée";
App::$strings["Export Webpage Elements"] = "Exporter éléments de pages web";
@@ -1236,51 +1289,24 @@ App::$strings["Error opening zip file"] = "Erreur lors de l'ouverture du fichier
App::$strings["Invalid folder path."] = "Chemin du dossier invalide";
App::$strings["No webpage elements detected."] = "Aucun élément de page Web détecté.";
App::$strings["Import complete."] = "Importation terminée";
-App::$strings["Channel removals are not allowed within 48 hours of changing the account password."] = "Il est impossible de supprimer un canal moins de 48 heures après avoir changé le mot de passe d'un compte.";
-App::$strings["Remove This Channel"] = "Supprimer ce canal";
-App::$strings["This channel will be completely removed from the network. "] = "Ce canal sera complètement supprimé du réseau.";
-App::$strings["Remove this channel and all its clones from the network"] = "Supprimer ce canal ainsi que tous ses clones sur le réseau";
-App::$strings["By default only the instance of the channel located on this hub will be removed from the network"] = "Par défaut, seule l'instance du canal présente sur ce hub sera supprimée du réseau";
-App::$strings["Remove Channel"] = "Supprimer le canal";
-App::$strings["Files: shared with me"] = "Fichiers&nbsp;: partagés avec moi";
-App::$strings["NEW"] = "NOUVEAU";
-App::$strings["Remove all files"] = "Supprimer tous les fichiers";
-App::$strings["Remove this file"] = "Supprimer ce fichier";
-App::$strings["Profile Unavailable."] = "Profil non disponible.";
-App::$strings["Not found"] = "Non trouvé";
-App::$strings["Invalid channel"] = "Canal invalide.";
-App::$strings["Wikis"] = "Wikis";
-App::$strings["Download"] = "Téléchargement";
-App::$strings["Wiki name"] = "Nom du wiki";
-App::$strings["Content type"] = "Type de contenu";
-App::$strings["Create a status post for this wiki"] = "Créer un statut de publication pour ce wiki";
-App::$strings["Wiki not found"] = "Wiki introuvable";
-App::$strings["Rename page"] = "Renommer la page";
-App::$strings["Error retrieving page content"] = "Erreur lors de la récupération du contenu de la page";
-App::$strings["Revision Comparison"] = "Comparaison des révisions";
-App::$strings["Revert"] = "Revenir";
-App::$strings["Short description of your changes (optional)"] = "Description courte de vos modifications (optionnel)";
-App::$strings["Source"] = "Source";
-App::$strings["New page name"] = "Nouveau nom de la page";
-App::$strings["Embed image from photo albums"] = "Intégrer une image d'un album photo";
-App::$strings["Embed an image from your albums"] = "Intégrer une image de votre album photo";
-App::$strings["OK"] = "OK";
-App::$strings["Choose images to embed"] = "Choisissez des images à intégrer";
-App::$strings["Choose an album"] = "Choisir un album";
-App::$strings["Choose a different album"] = "Choisissez un autre album";
-App::$strings["Error getting album list"] = "Erreur venant de la liste de l'album";
-App::$strings["Error getting photo link"] = "Erreur provenant du lien de la photo";
-App::$strings["Error getting album"] = "Erreur venant de l'album";
-App::$strings["Error creating wiki. Invalid name."] = "Erreur lors de la création du wiki. Nom invalide.";
-App::$strings["Wiki created, but error creating Home page."] = "Le wiki a été créé, mais une erreur est survenue lors de la création de sa page d'accueil.";
-App::$strings["Error creating wiki"] = "Erreur lors de la création du wiki.";
-App::$strings["Wiki delete permission denied."] = "Permission de supprimer le wiki refusée.";
-App::$strings["Error deleting wiki"] = "Erreur durant la suppression du wiki";
-App::$strings["New page created"] = "Nouvelle page créée";
-App::$strings["Cannot delete Home"] = "Impossible de supprimer la racine";
-App::$strings["Current Revision"] = "Version actuelle";
-App::$strings["Selected Revision"] = "Version sélectionnée";
-App::$strings["You must be authenticated."] = "Vous devez être connecté.";
+App::$strings["Item is not editable"] = "Elément non modifiable";
+App::$strings["Edit post"] = "Modifier la publication";
+App::$strings["Invalid message"] = "Message non valide";
+App::$strings["no results"] = "aucun résultat";
+App::$strings["channel sync processed"] = "Synchro de canal effectuée";
+App::$strings["queued"] = "mis dans la file d'attente";
+App::$strings["posted"] = "publié";
+App::$strings["accepted for delivery"] = "accepté pour la distribution";
+App::$strings["updated"] = "mis à jour";
+App::$strings["update ignored"] = "mise à jour ignorée";
+App::$strings["permission denied"] = "permission refusée";
+App::$strings["recipient not found"] = "destinataire introuvable";
+App::$strings["mail recalled"] = "courriel rappelé";
+App::$strings["duplicate mail received"] = "courriel reçu en double";
+App::$strings["mail delivered"] = "courriel distribué";
+App::$strings["Delivery report for %1\$s"] = "Rapport de distribution pour %1\$s";
+App::$strings["Options"] = "Options";
+App::$strings["Redeliver"] = "Transférer à nouveau";
App::$strings["Failed to create source. No channel selected."] = "Impossible de créer la source. Aucun canal selectionné.";
App::$strings["Source created."] = "Source créée.";
App::$strings["Source updated."] = "Source mise à jour.";
@@ -1293,205 +1319,64 @@ App::$strings["Only import content with these words (one per line)"] = "N'import
App::$strings["Leave blank to import all public content"] = "Laissez vide pour importer tout le contenu public";
App::$strings["Channel Name"] = "Nom du canal";
App::$strings["Add the following categories to posts imported from this source (comma separated)"] = "Ajouter les catégories suivantes aux publications importées à partir de cette source (séparer par des virgules)";
-App::$strings["Optional"] = "Facultatif";
App::$strings["Source not found."] = "Source introuvable.";
App::$strings["Edit Source"] = "Modifier la source";
App::$strings["Delete Source"] = "Supprimer la source";
App::$strings["Source removed"] = "Source supprimée";
App::$strings["Unable to remove source."] = "Impossible de supprimer la source.";
-App::$strings["%1\$s is following %2\$s's %3\$s"] = "%1\$s suit %3\$s de %2\$s";
-App::$strings["%1\$s stopped following %2\$s's %3\$s"] = "%1\$s ne suit plus %3\$s de %2\$s";
+App::$strings["Like/Dislike"] = "Aime/n'aime pas";
+App::$strings["This action is restricted to members."] = "Cette action est réservée aux membres.";
+App::$strings["Please <a href=\"rmagic\">login with your \$Projectname ID</a> or <a href=\"register\">register as a new \$Projectname member</a> to continue."] = "S'il vous plait, <a href=\"rmagic\">identifiez vous avec votre identifant de \$Projectname </a> ou <a href=\"register\">inscrivez vous comme nouveau membre de \$Projectname </a> pour continuer.";
+App::$strings["Invalid request."] = "Requête invalide.";
+App::$strings["channel"] = "canal";
+App::$strings["thing"] = "chose";
+App::$strings["Channel unavailable."] = "Canal indisponible.";
+App::$strings["Previous action reversed."] = "Action précédente annulée.";
+App::$strings["%1\$s likes %2\$s's %3\$s"] = "%1\$s aime %3\$s de %2\$s";
+App::$strings["%1\$s doesn't like %2\$s's %3\$s"] = "%1\$s n'aime pas %3\$s de %2\$s";
+App::$strings["%1\$s agrees with %2\$s's %3\$s"] = "%1\$s approuve %3\$s de %2\$s";
+App::$strings["%1\$s doesn't agree with %2\$s's %3\$s"] = "%1\$s n'est pas d'accord avec %3\$s de %2\$s";
+App::$strings["%1\$s abstains from a decision on %2\$s's %3\$s"] = "%1\$s s'abstient de toute décision sur le %3\$s de %2\$s";
+App::$strings["%1\$s is attending %2\$s's %3\$s"] = "%1\$s participe à %3\$s de %2\$s";
+App::$strings["%1\$s is not attending %2\$s's %3\$s"] = "%1\$s ne participe pas à %3\$s de %2\$s";
+App::$strings["%1\$s may attend %2\$s's %3\$s"] = "%1\$s participe peut-être à %3\$s de %2\$s";
+App::$strings["Action completed."] = "Action terminée.";
+App::$strings["Thank you."] = "Merci.";
+App::$strings["%d rating"] = array(
+ 0 => "%d évaluation",
+ 1 => "%d évaluations",
+);
+App::$strings["Gender: "] = "Sexe/genre&nbsp;:";
+App::$strings["Status: "] = "État&nbsp;:";
+App::$strings["Homepage: "] = "Site web&nbsp;:";
+App::$strings["Age:"] = "Age&nbsp;:";
+App::$strings["Location:"] = "Emplacement&nbsp;:";
+App::$strings["Description:"] = "Description&nbsp;:";
+App::$strings["Hometown:"] = "Ville natale&nbsp;:";
+App::$strings["About:"] = "À propos&nbsp;:";
+App::$strings["Connect"] = "Ajouter/Suivre";
+App::$strings["Public Forum:"] = "Forum public&nbsp;:";
+App::$strings["Keywords: "] = "Mots-clefs&nbsp;:";
+App::$strings["Don't suggest"] = "Ne pas suggérer";
+App::$strings["Common connections:"] = "Contacts en commun&nbsp;:";
+App::$strings["Global Directory"] = "Annuaire global";
+App::$strings["Local Directory"] = "Annuaire local";
+App::$strings["Finding:"] = "Recherche&nbsp;:";
+App::$strings["Channel Suggestions"] = "Canaux suggérés";
+App::$strings["next page"] = "page suivante";
+App::$strings["previous page"] = "page précédente";
+App::$strings["Sort options"] = "Options de tri";
+App::$strings["Alphabetic"] = "Alphabétique";
+App::$strings["Reverse Alphabetic"] = "Alphabétique inversé";
+App::$strings["Newest to Oldest"] = "Du plus récent au moins récent";
+App::$strings["Oldest to Newest"] = "Du moins récent du plus récent";
+App::$strings["No entries (some entries may be hidden)."] = "Pas d'entrées (certaines peuvent être cachées).";
+App::$strings["Xchan Lookup"] = "Recherche xchan";
+App::$strings["Lookup xchan beginning with (or webbie): "] = "Recherche xchan commençant par (ou adresse \"webbie\")&nbsp;:";
App::$strings["No suggestions available. If this is a new site, please try again in 24 hours."] = "Aucune suggestion disponible. Si le site est récent, merci de re-tenter dans 24 heures.";
App::$strings["Ignore/Hide"] = "Ignorer/Cacher";
-App::$strings["post"] = "publication";
-App::$strings["comment"] = "commentaire";
-App::$strings["%1\$s tagged %2\$s's %3\$s with %4\$s"] = "%1\$s a étiqueté le %3\$s de %2\$s avec %4\$s";
-App::$strings["Additional Features"] = "Fonctionnalités additionnelles";
-App::$strings["Name is required"] = "Le nom est requis";
-App::$strings["Key and Secret are required"] = "Clef et secret sont requis";
-App::$strings["Add application"] = "Ajouter une application";
-App::$strings["Name of application"] = "Nom de l'application";
-App::$strings["Consumer Key"] = "Clef client";
-App::$strings["Automatically generated - change if desired. Max length 20"] = "Généré automatiquement - à changer si besoin. Longueur maximale 20 caractères.";
-App::$strings["Consumer Secret"] = "Secret client";
-App::$strings["Redirect"] = "Redirection";
-App::$strings["Redirect URI - leave blank unless your application specifically requires this"] = "URI de redirection - laissez vide, sauf si votre application le requiert spécifiquement";
-App::$strings["Icon url"] = "URL de l'icône";
-App::$strings["Application not found."] = "Application introuvable.";
-App::$strings["Connected Apps"] = "Applications connectées";
-App::$strings["Client key starts with"] = "La clef partagée commence par";
-App::$strings["No name"] = "Sans nom";
-App::$strings["Remove authorization"] = "Révoquer l'autorisation";
-App::$strings["Not valid email."] = "Adresse de courriel non valide.";
-App::$strings["Protected email address. Cannot change to that email."] = "Adresse de courriel protégée. Impossible de l'utiliser.";
-App::$strings["System failure storing new email. Please try again."] = "Défaillance système lors du stockage de la nouvelle adresse de courriel. Merci d'essayer à nouveau.";
-App::$strings["Technical skill level updated"] = "Niveau technique mis à jour";
-App::$strings["Password verification failed."] = "La vérification du mot de passe a échoué.";
-App::$strings["Passwords do not match. Password unchanged."] = "Les deux saisies du mot de passe ne correspondent pas. Il n'a donc pas été changé.";
-App::$strings["Empty passwords are not allowed. Password unchanged."] = "Le mot de passe ne peut pas être vide. Il n'a donc pas été changé.";
-App::$strings["Password changed."] = "Le mot de passe a été changé.";
-App::$strings["Password update failed. Please try again."] = "La mise à jour du mot de passe a échoué. Merci d'essayer à nouveau.";
-App::$strings["Account Settings"] = "Paramètres du compte";
-App::$strings["Current Password"] = "Mot de passe actuel";
-App::$strings["Enter New Password"] = "Entrez votre nouveau mot de passe";
-App::$strings["Confirm New Password"] = "Confirmez le nouveau mot de passe";
-App::$strings["Leave password fields blank unless changing"] = "Laissez les mots de passe vides si vous ne voulez pas les modifier";
-App::$strings["Your technical skill level"] = "Votre niveau technique";
-App::$strings["Used to provide a member experience matched to your comfort level"] = "Utilisé pour fournir une expérience utilisateur correspondant à votre niveau de confort";
-App::$strings["Email Address:"] = "Adresse de courriel&nbsp;:";
-App::$strings["Remove this account including all its channels"] = "Supprimer ce compte et tous ses canaux";
-App::$strings["This channel is limited to %d tokens"] = "Ce canal est limité à %d jetons";
-App::$strings["Name and Password are required."] = "Le nom et le mot de passe sont requis";
-App::$strings["Token saved."] = "Jeton sauvegardé";
-App::$strings["Use this form to create temporary access identifiers to share things with non-members. These identities may be used in Access Control Lists and visitors may login using these credentials to access private content."] = "Utilisez ce formulaire pour créer des identifiants d'accès temporaires pour partager des informations avec des non-membres. Ces identités peuvent être utilisées dans les listes de contrôle d'accès et les visiteurs peuvent se connecter en utilisant ces certificats d'identification pour accéder au contenu privé.";
-App::$strings["You may also provide <em>dropbox</em> style access links to friends and associates by adding the Login Password to any specific site URL as shown. Examples:"] = "Vous pouvez également fournir des liens d'accès, style <em>dropbox</em>, aux amis et aux associés en ajoutant le mot de passe de connexion à l'URL d'un site spécifique, comme indiqué. Exemples:";
-App::$strings["Guest Access Tokens"] = "Jeton d'accès pour un invité";
-App::$strings["Login Name"] = "Nom d'utilisateur";
-App::$strings["Login Password"] = "Mot de passe";
-App::$strings["Expires (yyyy-mm-dd)"] = "Date d'expiration sous la forme année mois jour (AAAA-MM-JJ)";
-App::$strings["Affinity Slider settings updated."] = "Paramètres de la réglette d'affinité mis à jour.";
-App::$strings["No feature settings configured"] = "Aucun paramètre de fonctionnalité configuré";
-App::$strings["Default maximum affinity level"] = "Niveau d'affinité maximum par défaut";
-App::$strings["Default minimum affinity level"] = "Niveau d'affinité minimum par défaut";
-App::$strings["Affinity Slider Settings"] = "Paramètres de la réglette d'affinité";
-App::$strings["Feature/Addon Settings"] = "Paramètres des extensions/greffons";
-App::$strings["Settings updated."] = "Paramètres mis à jour.";
-App::$strings["Nobody except yourself"] = "Personne sauf vous";
-App::$strings["Only those you specifically allow"] = "Seulement ceux que vous autorisez spécifiquement";
-App::$strings["Approved connections"] = "Contacts approuvés";
-App::$strings["Any connections"] = "Tous les contacts";
-App::$strings["Anybody on this website"] = "Tous les utilisateurs du hub";
-App::$strings["Anybody in this network"] = "Tous les utilisateurs sur ce réseau";
-App::$strings["Anybody authenticated"] = "Tous les utilisateurs authentifiés";
-App::$strings["Anybody on the internet"] = "Tous les utilisateurs d'Internet";
-App::$strings["Publish your default profile in the network directory"] = "Publier votre profil par défaut dans l'annuaire du réseau";
-App::$strings["Allow us to suggest you as a potential friend to new members?"] = "Nous autoriser à vous suggérer comme ami(e) potentiel(le) aux nouveaux membres?";
-App::$strings["Your channel address is"] = "L'adresse de votre canal est";
-App::$strings["Your files/photos are accessible via WebDAV at"] = "Vos fichiers/photos sont accessibles via WebDAV à";
-App::$strings["Channel Settings"] = "Paramètres du canal";
-App::$strings["Basic Settings"] = "Paramètres standard";
-App::$strings["Full Name:"] = "Nom complet&nbsp;:";
-App::$strings["Your Timezone:"] = "Votre fureau horaire&nbsp;:";
-App::$strings["Default Post Location:"] = "Emplacement de publication par défaut&nbsp;:";
-App::$strings["Geographical location to display on your posts"] = "Emplacement géographique à afficher sur vos publications";
-App::$strings["Use Browser Location:"] = "Utiliser la géolocalisation du navigateur&nbsp;:";
-App::$strings["Adult Content"] = "Contenu \"adulte\"";
-App::$strings["This channel frequently or regularly publishes adult content. (Please tag any adult material and/or nudity with #NSFW)"] = "Ce canal publie plus ou moins fréquemment du contenu pour adultes. (Merci d'indiquer tout contenu pour adulte ou potentiellement choquant avec l'étiquette <em>#NSFW</em> - Not Safe For Work)";
-App::$strings["Security and Privacy Settings"] = "Paramètres de sécurité et de confidentialité";
-App::$strings["Your permissions are already configured. Click to view/adjust"] = "Vous permissions sont déjà paramétrées. Cliquer pour voir/ajuster";
-App::$strings["Hide my online presence"] = "Cacher ma présence en ligne";
-App::$strings["Prevents displaying in your profile that you are online"] = "Cacher votre statut (en ligne/hors ligne) sur votre profil";
-App::$strings["Simple Privacy Settings:"] = "Paramètres de confidentialité simplifiés&nbsp;:";
-App::$strings["Very Public - <em>extremely permissive (should be used with caution)</em>"] = "Très public - <em>extrèmement permissif (à n'utiliser qu'en connaissance de cause)</em>";
-App::$strings["Typical - <em>default public, privacy when desired (similar to social network permissions but with improved privacy)</em>"] = "Classique - <em>public par défaut, privé en cas de besoin (comparable aux permissions type réseau social, avec une confidentialité améliorée)</em>";
-App::$strings["Private - <em>default private, never open or public</em>"] = "Privé - <em>privé par défaut, jamais ouvert ni public</em>";
-App::$strings["Blocked - <em>default blocked to/from everybody</em>"] = "Bloqué - <em>par défaut, bloqué de/vers tout le monde</em>";
-App::$strings["Allow others to tag your posts"] = "Autoriser les autres à \"étiqueter\" vos publications";
-App::$strings["Often used by the community to retro-actively flag inappropriate content"] = "Souvent utilisé par la communauté pour identifier un contenu inapproprié a posteriori ";
-App::$strings["Channel Permission Limits"] = "Limites des permissions du canal";
-App::$strings["Expire other channel content after this many days"] = "Faire expirer le contenu des autres canaux après n jours";
-App::$strings["0 or blank to use the website limit."] = "0 ou vide pour utiliser la limite du site web";
-App::$strings["This website expires after %d days."] = "Ce site web expirera après %d jours.";
-App::$strings["This website does not expire imported content."] = "Ce site web ne périme pas le contenu importé.";
-App::$strings["The website limit takes precedence if lower than your limit."] = "La limite du site Web a priorité si elle est inférieure à votre limite.";
-App::$strings["Maximum Friend Requests/Day:"] = "Nombre maximum de demandes de contact par jour&nbsp;:";
-App::$strings["May reduce spam activity"] = "Contribue à réduire l'impact des indésirables";
-App::$strings["Default Access Control List (ACL)"] = "Default Access Control List (ACL)";
-App::$strings["Use my default audience setting for the type of object published"] = "Utiliser mon paramètre de publication par défaut pour le type d'objet publié";
-App::$strings["Channel permissions category:"] = "Catégorie de permissions du canal&nbsp;:";
-App::$strings["Default Permissions Group"] = "";
-App::$strings["Maximum private messages per day from unknown people:"] = "Nombre maximum de messages privés émanant d'inconnus, par jour&nbsp;:";
-App::$strings["Useful to reduce spamming"] = "Utile pour réduire les indésirables";
-App::$strings["Notification Settings"] = "Paramètres de notification";
-App::$strings["By default post a status message when:"] = "Par défaut, publier un statut quand&nbsp;:";
-App::$strings["accepting a friend request"] = "vous acceptez une demande de contact";
-App::$strings["joining a forum/community"] = "vous rejoignez un forum ou une communauté";
-App::$strings["making an <em>interesting</em> profile change"] = "vous faîtes une modification <em>intéressante</em> de votre profil";
-App::$strings["Send a notification email when:"] = "Envoyer un courriel de notification quand&nbsp;:";
-App::$strings["You receive a connection request"] = "Vous recevez une demande de contact";
-App::$strings["Your connections are confirmed"] = "Vos contacts sont confirmés";
-App::$strings["Someone writes on your profile wall"] = "Quelqu'un a écrit sur votre mur";
-App::$strings["Someone writes a followup comment"] = "Quelqu'un a commenté vos publications";
-App::$strings["You receive a private message"] = "Vous recevez un message privé";
-App::$strings["You receive a friend suggestion"] = "Vous recevez une suggestion d'amitié/contact";
-App::$strings["You are tagged in a post"] = "Vous êtes étiqueté dans une publication";
-App::$strings["You are poked/prodded/etc. in a post"] = "Vous êtes tapoté/encouragé/etc. dans une publication";
-App::$strings["Someone likes your post/comment"] = "Quelqu'un aime votre publication/commentaire";
-App::$strings["Show visual notifications including:"] = "Afficher des notifications visuelles y compris&nbsp;:";
-App::$strings["Unseen grid activity"] = "Activité du réseau pas encore consultée";
-App::$strings["Unseen channel activity"] = "Activité non vue sur le canal";
-App::$strings["Unseen private messages"] = "Messages privés non lus";
-App::$strings["Recommended"] = "Recommandé";
-App::$strings["Upcoming events"] = "Événements à venir";
-App::$strings["Events today"] = "Événements aujourd'hui";
-App::$strings["Upcoming birthdays"] = "Anniversaires à venir";
-App::$strings["Not available in all themes"] = "Pas disponible dans tous les thèmes";
-App::$strings["System (personal) notifications"] = "Notifications système (personnelles)";
-App::$strings["System info messages"] = "Messages d'info système";
-App::$strings["System critical alerts"] = "Alertes critiques système";
-App::$strings["New connections"] = "Nouveaux contacts";
-App::$strings["System Registrations"] = "Inscriptions système";
-App::$strings["Also show new wall posts, private messages and connections under Notices"] = "Afficher également les nouvelles publications sur le mur, les messages privés et les contacts dans Notifications";
-App::$strings["Notify me of events this many days in advance"] = "Me prévenir d’événements à venir tant de jours en avance";
-App::$strings["Must be greater than 0"] = "Doit être supérieur à 0";
-App::$strings["Advanced Account/Page Type Settings"] = "Paramètres avancés de compte/type de page";
-App::$strings["Change the behaviour of this account for special situations"] = "Modifie le comportement de ce compte pour des situations particulières";
-App::$strings["Miscellaneous Settings"] = "Paramètres divers";
-App::$strings["Default photo upload folder"] = "Répertoire par défaut pour les photos téléversées";
-App::$strings["%Y - current year, %m - current month"] = "%Y - année en cours, %m - mois en cours";
-App::$strings["Default file upload folder"] = "Répertoire par défaut pour les fichiers téléversés";
-App::$strings["Personal menu to display in your channel pages"] = "Menu personnel à afficher sur les pages de votre canal";
-App::$strings["Remove this channel."] = "Supprimer ce canal";
-App::$strings["Firefox Share \$Projectname provider"] = "Connecteur \$Projectname pour Firefox Share";
-App::$strings["Start calendar week on monday"] = "Commencer la semaine du calendrier le lundi";
-App::$strings["No special theme for mobile devices"] = "Pas de thème spécifique aux mobiles";
-App::$strings["%s - (Experimental)"] = "%s - (Expérimental)";
-App::$strings["Display Settings"] = "Afficher les paramètres";
-App::$strings["Theme Settings"] = "Paramètres du thème";
-App::$strings["Custom Theme Settings"] = "Paramètres personnels du thème";
-App::$strings["Content Settings"] = "Paramètres liés au contenu";
-App::$strings["Display Theme:"] = "Afficher le thème&nbsp;:";
-App::$strings["Select scheme"] = "Définir la palette de couleurs";
-App::$strings["Mobile Theme:"] = "Thème mobile&nbsp;:";
-App::$strings["Preload images before rendering the page"] = "Pré-charger les images avant d'afficher la page";
-App::$strings["The subjective page load time will be longer but the page will be ready when displayed"] = "Le temps de charge perçu de la page sera plus long mais la page sera complète quand elle s'affichera";
-App::$strings["Enable user zoom on mobile devices"] = "Permettre à l'utilisateur d'un mobile d'agrandir le contenu";
-App::$strings["Update browser every xx seconds"] = "Mettre à jour le navigateur toutes les xx secondes";
-App::$strings["Minimum of 10 seconds, no maximum"] = "Minimum 10 secondes, pas de maximum";
-App::$strings["Maximum number of conversations to load at any time:"] = "Nombre maximal de conversations pouvant être chargées en même temps&nbsp;:";
-App::$strings["Maximum of 100 items"] = "100 éléments au maximum";
-App::$strings["Show emoticons (smilies) as images"] = "Remplacer les émoticônes (smileys) par des images";
-App::$strings["Manual conversation updates"] = "Manuel de mises à jour des conversations";
-App::$strings["Default is on, turning this off may increase screen jumping"] = "Activé par défaut, le désactiver peut accroître les sauts d'écran";
-App::$strings["Link post titles to source"] = "Lier les titres des publications à leur source";
-App::$strings["System Page Layout Editor - (advanced)"] = "Editeur de mise en page des pages systèmes - (avancé)";
-App::$strings["Use blog/list mode on channel page"] = "Utiliser le mode blog/liste sur la page du canal";
-App::$strings["(comments displayed separately)"] = "(commentaires affichés séparément)";
-App::$strings["Use blog/list mode on grid page"] = "Utiliser le mode blog/liste sur la page du réseau";
-App::$strings["Channel page max height of content (in pixels)"] = "Hauteur maximale du contenu pour la page du canal (en pixels)";
-App::$strings["click to expand content exceeding this height"] = "cliquer pour dérouler le contenu dépassant cette limite";
-App::$strings["Grid page max height of content (in pixels)"] = "Hauteur maximale du contenu sur la page du réseau (en pixels)";
-App::$strings["Permission category saved."] = "Catégorie d'autorisation enregistrée.";
-App::$strings["Use this form to create permission rules for various classes of people or connections."] = "Utilisez ce formulaire pour créer des règles d'accès pour différentes catégories de personnes ou de contacts.";
-App::$strings["Permission Categories"] = "Catégories d'autorisation";
-App::$strings["Permission Name"] = "Nom de l'autorisation";
-App::$strings["Tag removed"] = "Étiquette retirée";
-App::$strings["Remove Item Tag"] = "Retirer une étiquette à l'élément";
-App::$strings["Select a tag to remove: "] = "Étiquette à retirer&nbsp;:";
-App::$strings["Thing updated"] = "Elément mis à jour";
-App::$strings["Object store: failed"] = "Stockage de l'objet&nbsp;: échec";
-App::$strings["Thing added"] = "Elément ajouté";
-App::$strings["OBJ: %1\$s %2\$s %3\$s"] = "OBJ: %1\$s %2\$s %3\$s";
-App::$strings["Show Thing"] = "Montrer élément";
-App::$strings["item not found."] = "élément introuvable.";
-App::$strings["Edit Thing"] = "Modifier élément";
-App::$strings["Select a profile"] = "Choisissez un profil";
-App::$strings["Post an activity"] = "Publier une activité";
-App::$strings["Only sends to viewers of the applicable profile"] = "Envoie exclusivement aux visiteurs du profil concerné";
-App::$strings["Name of thing e.g. something"] = "Nom de l'élément, p.ex. quelque-chose";
-App::$strings["URL of thing (optional)"] = "URL de l'élément (facultatif)";
-App::$strings["URL for photo of thing (optional)"] = "URL d'une photo de l'élément (facultatif)";
-App::$strings["Add Thing to your Profile"] = "Ajouter l'élément à votre profil";
+App::$strings["Unable to find your hub."] = "Impossible de trouver votre hub.";
+App::$strings["Post successful."] = "Publication réussie.";
App::$strings["Unable to lookup recipient."] = "Impossible de localiser le destinataire.";
App::$strings["Unable to communicate with requested channel."] = "Impossible de communiquer avec le canal demandé.";
App::$strings["Cannot verify requested channel."] = "Impossible de vérifier le canal demandé.";
@@ -1499,7 +1384,6 @@ App::$strings["Selected channel has private message restrictions. Send failed."]
App::$strings["Messages"] = "Messages";
App::$strings["Message recalled."] = "Message rappelé.";
App::$strings["Conversation removed."] = "Conversation supprimée.";
-App::$strings["Please enter a link URL:"] = "Merci d'entrer l'URL d'un lien&nbsp;:";
App::$strings["Expires YYYY-MM-DD HH:MM"] = "Expire le YYYY-MM-DD à HH:MM";
App::$strings["Requested channel is not in this network"] = "Le canal demandé n'est pas sur ce réseau";
App::$strings["Send Private Message"] = "Envoyer un message privé";
@@ -1508,7 +1392,6 @@ App::$strings["Subject:"] = "Objet&nbsp;:";
App::$strings["Attach file"] = "Joindre un fichier";
App::$strings["Send"] = "Envoyer";
App::$strings["Set expiration date"] = "Définir la date d'expiration";
-App::$strings["Encrypt text"] = "Chiffrer le texte";
App::$strings["Delete message"] = "Supprimer le message";
App::$strings["Delivery report"] = "Rapport de distribution";
App::$strings["Recall message"] = "Rappeler le message";
@@ -1517,25 +1400,195 @@ App::$strings["Delete Conversation"] = "Supprimer la conversation";
App::$strings["No secure communications available. You <strong>may</strong> be able to respond from the sender's profile page."] = "Aucune communication sécurisée n'est possible. Vous pourrez <strong>peut-être</strong> répondre depuis la page de profil de l'émetteur.";
App::$strings["Send Reply"] = "Envoyer la réponse";
App::$strings["Your message for %s (%s):"] = "Votre message pour %s (%s)&nbsp;:";
+App::$strings["Public Hubs"] = "Instances publiques";
+App::$strings["The listed hubs allow public registration for the \$Projectname network. All hubs in the network are interlinked so membership on any of them conveys membership in the network as a whole. Some hubs may require subscription or provide tiered service plans. The hub itself <strong>may</strong> provide additional details."] = "Les sites listés permettent l'enregistrement public de comptes pour le réseau \$Projectname. Tous les sites du réseau sont reliés entre eux, être membre d'un site revient à être membre de tous. Certains sites peuvent demander une souscription ou proposer différents niveaux de service. Chaque site <strong>peut</strong> fournir des détails supplémentaires.";
+App::$strings["Hub URL"] = "URL du site";
+App::$strings["Access Type"] = "Type d'accès";
+App::$strings["Registration Policy"] = "Politique d'inscription";
+App::$strings["Stats"] = "Statistiques";
+App::$strings["Software"] = "Logiciel";
+App::$strings["Rate"] = "Evaluer";
+App::$strings["webpage"] = "pages web";
+App::$strings["block"] = "bloquer";
+App::$strings["layout"] = "mise en page";
+App::$strings["menu"] = "menu";
+App::$strings["%s element installed"] = "Elément %s installé";
+App::$strings["%s element installation failed"] = "L'installation de l'élément %s a échoué";
+App::$strings["Select a bookmark folder"] = "Choisir un dossier de favoris";
+App::$strings["Save Bookmark"] = "Enregistrer le favori";
+App::$strings["URL of bookmark"] = "URL du favori";
+App::$strings["Or enter new bookmark folder name"] = "Ou entrez un nouveau nom de dossier de favoris";
+App::$strings["Enter a folder name"] = "";
+App::$strings["or select an existing folder (doubleclick)"] = "";
+App::$strings["Save to Folder"] = "Enregistrer dans le dossier";
+App::$strings["Fetching URL returns error: %1\$s"] = "Récupération d'URL échouée&nbsp;: %1\$s";
+App::$strings["Maximum daily site registrations exceeded. Please try again tomorrow."] = "Nombre d'inscriptions quotidiennes dépassé. Merci d'essayer à nouveau demain.";
+App::$strings["Please indicate acceptance of the Terms of Service. Registration failed."] = "Merci d'indiquer votre adhésion aux conditions de service. L'inscription a échoué.";
+App::$strings["Passwords do not match."] = "Les mots de passe ne concordent pas.";
+App::$strings["Registration successful. Please check your email for validation instructions."] = "Inscription réussie. Merci de vérifier vos courriels pour valider votre compte.";
+App::$strings["Your registration is pending approval by the site owner."] = "Votre inscription est en attente d'approbation par l'administrateur.";
+App::$strings["Your registration can not be processed."] = "Votre inscription ne peut être traîtée.";
+App::$strings["Registration on this hub is disabled."] = "La création de nouveaux comptes est désactivée pour ce site.";
+App::$strings["Registration on this hub is by approval only."] = "La création de compte sur ce site est soumise à approbation.";
+App::$strings["<a href=\"pubsites\">Register at another affiliated hub.</a>"] = "<a href=\"pubsites\">S'enregistrer sur un autre site du réseau.</a>";
+App::$strings["This site has exceeded the number of allowed daily account registrations. Please try again tomorrow."] = "Ce site a dépassé le nombre de création de comptes autorisé chaque jour. Merci d'essayer à nouveau demain.";
+App::$strings["I accept the %s for this website"] = "J'accepte les %s de ce site";
+App::$strings["I am over 13 years of age and accept the %s for this website"] = "J'ai plus de 13 ans et j'accepte les %s de ce site";
+App::$strings["Your email address"] = "Votre adresse de courriel";
+App::$strings["Choose a password"] = "Choisissez un mot de passe";
+App::$strings["Please re-enter your password"] = "Merci de saisir à nouveau votre mot de passe";
+App::$strings["Please enter your invitation code"] = "Merci de saisir votre code d'invitation";
+App::$strings["no"] = "non";
+App::$strings["yes"] = "oui";
+App::$strings["Membership on this site is by invitation only."] = "L'inscription à ce site se fait uniquement sur invitation.";
+App::$strings["Register"] = "S'inscrire";
+App::$strings["This site may require email verification after submitting this form. If you are returned to a login page, please check your email for instructions."] = "Ce site peut demander une validation de votre email. Si vous revenez sur le formulaire de connexion, vérifiez vos emails et suivez les instructions. Regardez aussi les spams.";
+App::$strings["Cover Photos"] = "Photos de couverture";
+App::$strings["female"] = "femme";
+App::$strings["%1\$s updated her %2\$s"] = "%1\$s a mis à jour son %2\$s";
+App::$strings["male"] = "homme";
+App::$strings["%1\$s updated his %2\$s"] = "%1\$s a mis à jour son %2\$s";
+App::$strings["%1\$s updated their %2\$s"] = "%1\$s a mis a jour sa %2\$s";
+App::$strings["cover photo"] = "Photo principale";
+App::$strings["Upload Cover Photo"] = "Téléverser une photo de couverture";
+App::$strings["Documentation Search"] = "Chercher dans la documentation";
+App::$strings["About"] = "À propos";
+App::$strings["Administrators"] = "Administrateurs";
+App::$strings["Developers"] = "Développeurs";
+App::$strings["Tutorials"] = "Tutoriels";
+App::$strings["\$Projectname Documentation"] = "Documentation \$Projectname";
+App::$strings["Contents"] = "Contenus";
+App::$strings["Tag removed"] = "Étiquette retirée";
+App::$strings["Remove Item Tag"] = "Retirer une étiquette à l'élément";
+App::$strings["Select a tag to remove: "] = "Étiquette à retirer&nbsp;:";
+App::$strings["No such group"] = "Groupe introuvable";
+App::$strings["No such channel"] = "Canal introuvable";
+App::$strings["forum"] = "forum";
+App::$strings["Search Results For:"] = "Résultats de recherche pour&nbsp;:";
+App::$strings["Privacy group is empty"] = "Groupe de contacts vide";
+App::$strings["Privacy group: "] = "Groupe de contacts&nbsp;:";
+App::$strings["Invalid connection."] = "Contact non valide.";
+App::$strings["Invalid channel."] = "Canal invalide.";
+App::$strings["network"] = "réseau";
+App::$strings["RSS"] = "RSS";
+App::$strings["\$Projectname"] = "\$Projectname";
+App::$strings["Welcome to %s"] = "Bienvenue sur %s";
+App::$strings["Permission Denied."] = "Permission refusée.";
+App::$strings["File not found."] = "Fichier introuvable.";
+App::$strings["Edit file permissions"] = "Modifier les autorisations d'accès au fichier";
+App::$strings["Set/edit permissions"] = "Définir/modifier les autorisations";
+App::$strings["Include all files and sub folders"] = "Inclure tous fichiers et sous-répertoires";
+App::$strings["Return to file list"] = "Retourner à la liste des fichiers";
+App::$strings["Copy/paste this code to attach file to a post"] = "Copiez/collez ce code pour joindre le fichier à une publication";
+App::$strings["Copy/paste this URL to link file from a web page"] = "Copiez/collez cette URL pour pointer vers ce fichier depuis une page web";
+App::$strings["Share this file"] = "Partager ce fichier";
+App::$strings["Show URL to this file"] = "Montrer l'URL de ce fichier";
+App::$strings["Notify your contacts about this file"] = "Notifier vos contacts à propos de ce fichier";
+App::$strings["No channel."] = "Pas de canal.";
+App::$strings["Common connections"] = "Contacts en commun";
+App::$strings["No connections in common."] = "Pas de contacts en commun.";
App::$strings["No connections."] = "Aucun contact.";
App::$strings["Visit %s's profile [%s]"] = "Visiter le profil de %s [%s]";
App::$strings["View Connections"] = "Voir les contacts";
-App::$strings["Source of Item"] = "Source de l'élément";
-App::$strings["Room not found"] = "Salon introuvable";
-App::$strings["Leave Room"] = "Quitter le salon";
-App::$strings["Delete Room"] = "Supprimer le salon";
-App::$strings["I am away right now"] = "Je suis absent en ce moment";
-App::$strings["I am online"] = "Je suis en ligne";
-App::$strings["Bookmark this room"] = "Marquer ce salon comme favori";
-App::$strings["New Chatroom"] = "Nouveau salon de discussion";
-App::$strings["Chatroom name"] = "Nom du salon de conversation";
-App::$strings["Expiration of chats (minutes)"] = "Expiration des discussions (en minutes)";
-App::$strings["%1\$s's Chatrooms"] = "Salons de %1\$s";
-App::$strings["No chatrooms available"] = "Aucun salon de conversation disponible";
-App::$strings["Expiration"] = "Expiration";
-App::$strings["min"] = "min";
-App::$strings["Xchan Lookup"] = "Recherche xchan";
-App::$strings["Lookup xchan beginning with (or webbie): "] = "Recherche xchan commençant par (ou adresse \"webbie\")&nbsp;:";
+App::$strings["# Accounts"] = "# Comptes";
+App::$strings["# blocked accounts"] = "# comptes bloqués";
+App::$strings["# expired accounts"] = "# comptes expirés";
+App::$strings["# expiring accounts"] = "# comptes expirant";
+App::$strings["# Channels"] = "# Canaux";
+App::$strings["# primary"] = "# primaire";
+App::$strings["# clones"] = "# clones";
+App::$strings["Message queues"] = "File des messages";
+App::$strings["Your software should be updated"] = "Votre logiciel doit d'être mis à jour";
+App::$strings["Summary"] = "Résumé";
+App::$strings["Registered accounts"] = "Comptes enregistrés";
+App::$strings["Pending registrations"] = "Inscriptions en attente";
+App::$strings["Registered channels"] = "Canaux enregistrés";
+App::$strings["Active plugins"] = "Greffons actifs";
+App::$strings["Version"] = "Version";
+App::$strings["Repository version (master)"] = "Version du dépôt (maître)";
+App::$strings["Repository version (dev)"] = "Version du dépôt (développeur)";
+App::$strings["No service class restrictions found."] = "Aucune restriction de classe de service trouvée.";
+App::$strings["Website:"] = "Site web&nbsp;:";
+App::$strings["Remote Channel [%s] (not yet known on this site)"] = "Canal distant [%s] (encore inconnu sur ce site)";
+App::$strings["Rating (this information is public)"] = "Evaluation (cette information est publique)";
+App::$strings["Optionally explain your rating (this information is public)"] = "Explication facultative de votre évaluation (cette information est publique)";
+App::$strings["No valid account found."] = "Aucun compte valide trouvé.";
+App::$strings["Password reset request issued. Check your email."] = "Demande de réinitialisation du mot de passe envoyée. Vérifiez vos courriels.";
+App::$strings["Site Member (%s)"] = "Membre du site (%s)";
+App::$strings["Password reset requested at %s"] = "Demande de réinitialisation du mot de passe sur %s";
+App::$strings["Request could not be verified. (You may have previously submitted it.) Password reset failed."] = "La demande n'a pas pu être vérifiée. (Peut-être l'avez vous déjà utilisée.) La réinitialisation a échoué.";
+App::$strings["Password Reset"] = "Réinitialiser le mot de passe";
+App::$strings["Your password has been reset as requested."] = "Votre mot de passe a bien été réinitialisé.";
+App::$strings["Your new password is"] = "Votre nouveau mot de passe est";
+App::$strings["Save or copy your new password - and then"] = "Enregistrez ou copiez votre nouveau mot de passe, puis";
+App::$strings["click here to login"] = "cliquez ici pour vous connecter";
+App::$strings["Your password may be changed from the <em>Settings</em> page after successful login."] = "Votre mot de passe peut être changé depuis la page des <em>Paramètres</em> une fois connecté.";
+App::$strings["Your password has changed at %s"] = "Votre mot de passe de %s a été changé";
+App::$strings["Forgot your Password?"] = "Mot de passe oublié&nbsp;?";
+App::$strings["Enter your email address and submit to have your password reset. Then check your email for further instructions."] = "Saisissez votre adresse de courriel, et validez, pour réinitialiser votre mot de passe. Vérifiez ensuite votre boîte aux lettres pour la suite des instructions.";
+App::$strings["Email Address"] = "Adresse de courriel";
+App::$strings["Reset"] = "Réinitialiser";
+App::$strings["Mark all system notifications seen"] = "Marquer toutes les notifications système comme vues";
+App::$strings["Site Admin"] = "Administrateur";
+App::$strings["Report Bug"] = "Reporter des bogues";
+App::$strings["View Bookmarks"] = "Voir les marques-pages";
+App::$strings["My Chatrooms"] = "Mes salons de discussions";
+App::$strings["Firefox Share"] = "Partager via Firefox";
+App::$strings["Remote Diagnostics"] = "Diagnostiques à distance";
+App::$strings["Suggest Channels"] = "Suggérer des canaux";
+App::$strings["Login"] = "Connexion";
+App::$strings["Grid"] = "Réseau";
+App::$strings["Wiki"] = "Wiki";
+App::$strings["Channel Home"] = "Mon canal";
+App::$strings["Events"] = "Événements";
+App::$strings["Directory"] = "Annuaire";
+App::$strings["Mail"] = "Messages";
+App::$strings["Chat"] = "Clavardage";
+App::$strings["Probe"] = "Sonder";
+App::$strings["Suggest"] = "Suggérer";
+App::$strings["Random Channel"] = "Un canal au hasard";
+App::$strings["Invite"] = "Invitation";
+App::$strings["Features"] = "Fonctionalités";
+App::$strings["Language"] = "Langue";
+App::$strings["Post"] = "Envoyer";
+App::$strings["Profile Photo"] = "Photo du Profil";
+App::$strings["Purchase"] = "Acheter";
+App::$strings["Undelete"] = "Restaurer";
+App::$strings["Add to app-tray"] = "";
+App::$strings["Remove from app-tray"] = "";
+App::$strings["__ctx:permcat__ default"] = "défaut";
+App::$strings["__ctx:permcat__ follower"] = "abonné";
+App::$strings["__ctx:permcat__ contributor"] = "contributeur";
+App::$strings["__ctx:permcat__ publisher"] = "rédacteur";
+App::$strings["(No Title)"] = "(Pas de titre)";
+App::$strings["Wiki page create failed."] = "Échec de création de la page wiki.";
+App::$strings["Wiki not found."] = "Wiki introuvable.";
+App::$strings["Destination name already exists"] = "Le nom de destination est déjà pris";
+App::$strings["Page not found"] = "Page introuvable";
+App::$strings["Error reading page content"] = "Erreur de lecture du contenu de la page";
+App::$strings["Error reading wiki"] = "Erreur de lecture du wiki";
+App::$strings["Page update failed."] = "Echec de modification de la page.";
+App::$strings["Nothing deleted"] = "Rien n'a été supprimé";
+App::$strings["Compare: object not found."] = "Comparaison&nbsp;: objet introuvable.";
+App::$strings["Page updated"] = "Page modifiée";
+App::$strings["Untitled"] = "Sans titre";
+App::$strings["Wiki resource_id required for git commit"] = "\"resource_id\" du wiki nécessaire pour l'enregistrement dans git.";
+App::$strings["__ctx:wiki_history__ Message"] = "Message";
+App::$strings["Different viewers will see this text differently"] = "Ce texte aura un rendu différent en fonction des utilisateurs";
+App::$strings["Visible to your default audience"] = "Visible pour vos contacts seulement";
+App::$strings["Only me"] = "Seulement moi";
+App::$strings["Public"] = "Public";
+App::$strings["Anybody in the \$Projectname network"] = "N'importe qui dans le réseau de \$Projectname";
+App::$strings["Any account on %s"] = "N'importe quel compte sur %s";
+App::$strings["Any of my connections"] = "N'importe laquelle de mes connexions";
+App::$strings["Only connections I specifically allow"] = "Uniquement les connexions que j'ai expréssément autorisées";
+App::$strings["Anybody authenticated (could include visitors from other networks)"] = "N'importe qui d'authentifié (cela peut inclure des visiteurs d'autres réseaux)";
+App::$strings["Any connections including those who haven't yet been approved"] = "N'importe quelle connexions, y compris celles qui n'ont pas encore été approuvées";
+App::$strings["This is your default setting for the audience of your normal stream, and posts."] = "Ceci est votre réglage par défaut de l'audience de vos publications sur votre canal normal.";
+App::$strings["This is your default setting for who can view your default channel profile"] = "Ceci est votre réglage par défaut à propos de qui peut voir votre canal de profil par défaut.";
+App::$strings["This is your default setting for who can view your connections"] = "Ceci est votre réglage par défaut à propos de qui peut voir vos relations.";
+App::$strings["This is your default setting for who can view your file storage and photos"] = "Ceci est votre réglage par défaut à propos de qui peut voir vos fichiers ou photos stocké(e)s";
+App::$strings["This is your default setting for the audience of your webpages"] = "Ceci est votre réglage par défaut de l'audience de vos pages web.";
App::$strings["Missing room name"] = "Il manque le nom du salon";
App::$strings["Duplicate room name"] = "Un salon avec ce nom existe déjà";
App::$strings["Invalid room specifier."] = "Identifiant de salon invalide.";
@@ -1586,33 +1639,21 @@ App::$strings["Please visit %s to approve or reject the suggestion."] = "Merci d
App::$strings["[\$Projectname:Notify]"] = "[\$Projectname:Notify]";
App::$strings["created a new post"] = "a publié un nouveau message";
App::$strings["commented on %s's post"] = "a commenté la publication de %s";
-App::$strings["Visible to your default audience"] = "Visible pour vos contacts seulement";
-App::$strings["Only me"] = "Seulement moi";
-App::$strings["Public"] = "Public";
-App::$strings["Anybody in the \$Projectname network"] = "N'importe qui dans le réseau de \$Projectname";
-App::$strings["Any account on %s"] = "N'importe quel compte sur %s";
-App::$strings["Any of my connections"] = "N'importe laquelle de mes connexions";
-App::$strings["Only connections I specifically allow"] = "Uniquement les connexions que j'ai expréssément autorisées";
-App::$strings["Anybody authenticated (could include visitors from other networks)"] = "N'importe qui d'authentifié (cela peut inclure des visiteurs d'autres réseaux)";
-App::$strings["Any connections including those who haven't yet been approved"] = "N'importe quelle connexions, y compris celles qui n'ont pas encore été approuvées";
-App::$strings["This is your default setting for the audience of your normal stream, and posts."] = "Ceci est votre réglage par défaut de l'audience de vos publications sur votre canal normal.";
-App::$strings["This is your default setting for who can view your default channel profile"] = "Ceci est votre réglage par défaut à propos de qui peut voir votre canal de profil par défaut.";
-App::$strings["This is your default setting for who can view your connections"] = "Ceci est votre réglage par défaut à propos de qui peut voir vos relations.";
-App::$strings["This is your default setting for who can view your file storage and photos"] = "Ceci est votre réglage par défaut à propos de qui peut voir vos fichiers ou photos stocké(e)s";
-App::$strings["This is your default setting for the audience of your webpages"] = "Ceci est votre réglage par défaut de l'audience de vos pages web.";
+App::$strings["Wiki files deleted successfully"] = "Fichiers du wiki supprimés avec succès";
+App::$strings["Update Error at %s"] = "Erreur de mise à jour sur %s";
+App::$strings["Update %s failed. See error logs."] = "La mise-à-jour %s a échoué. Merci de consulter les journaux d'erreur.";
App::$strings["Private Message"] = "Message Privé";
App::$strings["Select"] = "Sélectionner";
-App::$strings["Save to Folder"] = "Enregistrer dans le dossier";
App::$strings["I will attend"] = "Je participerai";
App::$strings["I will not attend"] = "Je ne participerai pas";
App::$strings["I might attend"] = "Je participerai peut-être";
App::$strings["I agree"] = "Je suis d'accord";
App::$strings["I disagree"] = "Je ne suis pas d'accord";
App::$strings["I abstain"] = "Je m'abstiens";
-App::$strings["Add Star"] = "Mettre en avant (étoile)";
-App::$strings["Remove Star"] = "Ne plus mettre en avant";
+App::$strings["Add Star"] = "Mettre de côté (étoile)";
+App::$strings["Remove Star"] = "Ne plus mettre de côté";
App::$strings["Toggle Star Status"] = "(Dés)activer l'étoile";
-App::$strings["starred"] = "mis en avant";
+App::$strings["starred"] = "mis de côté";
App::$strings["Message signature validated"] = "Signature du message validée";
App::$strings["Message signature incorrect"] = "Signature du message incorrecte";
App::$strings["Add Tag"] = "Ajouter une étiquette";
@@ -1649,69 +1690,279 @@ App::$strings["Code"] = "Code";
App::$strings["Image"] = "Image";
App::$strings["Insert Link"] = "Insérer un lien";
App::$strings["Video"] = "Vidéo";
-App::$strings["Site Admin"] = "Administrateur";
-App::$strings["Report Bug"] = "Reporter des bogues";
-App::$strings["View Bookmarks"] = "Voir les marques-pages";
-App::$strings["My Chatrooms"] = "Mes salons de discussions";
-App::$strings["Firefox Share"] = "Partager via Firefox";
-App::$strings["Remote Diagnostics"] = "Diagnostiques à distance";
-App::$strings["Suggest Channels"] = "Suggérer des canaux";
-App::$strings["Login"] = "Connexion";
-App::$strings["Grid"] = "Réseau";
-App::$strings["Wiki"] = "Wiki";
-App::$strings["Channel Home"] = "Mon canal";
-App::$strings["Events"] = "Événements";
-App::$strings["Directory"] = "Annuaire";
-App::$strings["Mail"] = "Messages";
-App::$strings["Chat"] = "Clavardage";
-App::$strings["Probe"] = "Sonder";
-App::$strings["Suggest"] = "Suggérer";
-App::$strings["Random Channel"] = "Un canal au hasard";
-App::$strings["Invite"] = "Invitation";
-App::$strings["Features"] = "Fonctionalités";
-App::$strings["Language"] = "Langue";
-App::$strings["Post"] = "Envoyer";
-App::$strings["Profile Photo"] = "Photo du Profil";
-App::$strings["Purchase"] = "Acheter";
-App::$strings["Undelete"] = "Restaurer";
-App::$strings["Wiki files deleted successfully"] = "Fichiers du wiki supprimés avec succès";
-App::$strings["__ctx:permcat__ default"] = "défaut";
-App::$strings["__ctx:permcat__ follower"] = "abonné";
-App::$strings["__ctx:permcat__ contributor"] = "contributeur";
-App::$strings["__ctx:permcat__ publisher"] = "rédacteur";
-App::$strings["(No Title)"] = "(Pas de titre)";
-App::$strings["Wiki page create failed."] = "Échec de création de la page wiki.";
-App::$strings["Wiki not found."] = "Wiki introuvable.";
-App::$strings["Destination name already exists"] = "Le nom de destination est déjà pris";
-App::$strings["Page not found"] = "Page introuvable";
-App::$strings["Error reading page content"] = "Erreur de lecture du contenu de la page";
-App::$strings["Error reading wiki"] = "Erreur de lecture du wiki";
-App::$strings["Page update failed."] = "Echec de modification de la page.";
-App::$strings["Nothing deleted"] = "Rien n'a été supprimé";
-App::$strings["Compare: object not found."] = "Comparaison&nbsp;: objet introuvable.";
-App::$strings["Page updated"] = "Page modifiée";
-App::$strings["Untitled"] = "Sans titre";
-App::$strings["Wiki resource_id required for git commit"] = "\"resource_id\" du wiki nécessaire pour l'enregistrement dans git.";
-App::$strings["Different viewers will see this text differently"] = "Ce texte aura un rendu différent en fonction des utilisateurs";
+App::$strings["Remote authentication blocked. You are logged into this site locally. Please logout and retry."] = "Authentification distante bloquée. Vous êtes connecté(e) sur ce site localement. Merci de vous déconnecter et réessayer.";
+App::$strings["Welcome %s. Remote authentication successful."] = "Bienvenue %s. L'authentification distante a fonctionné.";
+App::$strings["parent"] = "retour";
+App::$strings["Collection"] = "Groupe de contacts";
+App::$strings["Principal"] = "Principal";
+App::$strings["Addressbook"] = "Carnet d'adresse";
+App::$strings["Calendar"] = "Calendrier";
+App::$strings["Schedule Inbox"] = "Calendrier - Messages entrants";
+App::$strings["Schedule Outbox"] = "Calendrier - Messages sortants";
+App::$strings["Total"] = "Total";
+App::$strings["Shared"] = "Partagé";
+App::$strings["You are using %1\$s of your available file storage."] = "Vous utilisez %1\$s de votre espace de stockage.";
+App::$strings["You are using %1\$s of %2\$s available file storage. (%3\$s&#37;)"] = "Vous utilisez %1\$s sur %2\$s d'espace disponible. (%3\$s&#37;)";
+App::$strings["WARNING:"] = "AVERTISSEMENT&nbsp;:";
+App::$strings["Please use DAV to upload large (video, audio) files.<br>See <a class=\"zrl\" href=\"help/member/member_guide#Cloud_Desktop_Clients\">Cloud Desktop Clients</a>"] = "";
+App::$strings["Create new folder"] = "Nouveau dossier";
+App::$strings["Upload file"] = "Téléverser un fichier";
+App::$strings["Drop files here to immediately upload"] = "Mettez un fichier ici pour le télécharger immédiatement";
+App::$strings["Forums"] = "Forums";
+App::$strings["Categories"] = "Catégories";
+App::$strings["Everything"] = "Tout";
+App::$strings["Events Tools"] = "Outils Evènements";
+App::$strings["Export Calendar"] = "Exporter le calendrier";
+App::$strings["Import Calendar"] = "Importer un calendrier";
+App::$strings["Suggested Chatrooms"] = "Salons suggérés";
+App::$strings["Private Mail Menu"] = "Menu des messages privés";
+App::$strings["Combined View"] = "Vue combinée";
+App::$strings["Inbox"] = "Boîte de réception";
+App::$strings["Outbox"] = "Boîte d'envoi";
+App::$strings["New Message"] = "Nouveau message";
+App::$strings["Chatrooms"] = "Salons de clavardage";
+App::$strings["Overview"] = "Aperçu";
+App::$strings["Rating Tools"] = "Outils d'évaluation";
+App::$strings["Rate Me"] = "M'évaluer";
+App::$strings["View Ratings"] = "Voir mes évaluations";
+App::$strings["__ctx:widget__ Activity"] = "";
+App::$strings["You have %1$.0f of %2$.0f allowed connections."] = "Vous avez %1$.0f sur %2$.0f contacts autorisés.";
+App::$strings["Add New Connection"] = "Ajouter un nouveau contact";
+App::$strings["Enter channel address"] = "Saisissez l'adresse du canal";
+App::$strings["Examples: bob@example.com, https://example.com/barbara"] = "Exemples&nbsp;: pierre@exemple.com, https://exemple.com/sophie";
+App::$strings["Wiki List"] = "Liste de wikis";
+App::$strings["Archives"] = "Archives";
+App::$strings["Conversations"] = "Conversations";
+App::$strings["Received Messages"] = "Messages reçus";
+App::$strings["Sent Messages"] = "Messages envoyés";
+App::$strings["No messages."] = "Pas de message.";
+App::$strings["Delete conversation"] = "Supprimer la conversation";
+App::$strings["Chat Members"] = "Membres du salon de discussion";
+App::$strings["photo/image"] = "photo/image";
+App::$strings["Remove term"] = "Retirer le terme";
+App::$strings["Saved Searches"] = "Recherches sauvegardées";
+App::$strings["add"] = "ajouter";
+App::$strings["Notes"] = "Notes";
+App::$strings["Wiki Pages"] = "Pages wiki";
+App::$strings["Add new page"] = "Ajouter une nouvelle page";
+App::$strings["Page name"] = "Nom de la page";
+App::$strings["Refresh"] = "Actualiser";
+App::$strings["Tasks"] = "Tâches";
+App::$strings["Suggestions"] = "Suggestions";
+App::$strings["See more..."] = "Voir plus...";
+App::$strings["Saved Folders"] = "Dossiers sauvegardés";
+App::$strings["Click to show more"] = "Cliquer pour voir plus";
+App::$strings["Member registrations waiting for confirmation"] = "Inscriptions en attente d'approbation";
+App::$strings["Inspect queue"] = "Analyser la file d'attente";
+App::$strings["DB updates"] = "Mises à jour BDD";
+App::$strings["Admin"] = "Administrateur";
+App::$strings["Plugin Features"] = "Fonctionnalités des greffons";
+App::$strings["Account settings"] = "Paramètres du compte";
+App::$strings["Channel settings"] = "Paramètres du canal";
+App::$strings["Additional features"] = "Fonctionnalités supplémentaires";
+App::$strings["Feature/Addon settings"] = "Paramètres des extensions/greffons";
+App::$strings["Display settings"] = "Paramètres d'affichage";
+App::$strings["Manage locations"] = "Gérer les emplacements";
+App::$strings["Export channel"] = "Exporter le canal";
+App::$strings["Connected apps"] = "Applications connectées";
+App::$strings["Permission Groups"] = "Groupes d'autorisation";
+App::$strings["Premium Channel Settings"] = "Paramètres de canal VIP";
+App::$strings["Bookmarked Chatrooms"] = "Salons favoris";
+App::$strings["Source channel not found."] = "Source du canal introuvable.";
+App::$strings["__ctx:opensearch__ Search %1\$s (%2\$s)"] = "Recherche %1\$s (%2\$s)";
+App::$strings["__ctx:opensearch__ \$Projectname"] = "\$Projectname";
+App::$strings["Create an account to access services and applications"] = "Créer un compte pour accéder aux services et applications";
+App::$strings["Logout"] = "Déconnexion";
+App::$strings["Login/Email"] = "pseudo / email";
+App::$strings["Password"] = "Mot de passe";
+App::$strings["Remember me"] = "Se souvenir de moi";
+App::$strings["Forgot your password?"] = "Mot de passe oublié&nbsp;?";
+App::$strings["toggle mobile"] = "(dés)activer mobile";
+App::$strings["[\$Projectname] Website SSL error for %s"] = "";
+App::$strings["Website SSL certificate is not valid. Please correct."] = "Le certificat SSL n'est pas valide. Corrigez le.";
+App::$strings["[\$Projectname] Cron tasks not running on %s"] = "";
+App::$strings["Cron/Scheduled tasks not running."] = "Les taches planifiées ne tournent pas.";
+App::$strings["never"] = "jamais";
+App::$strings["Focus (Hubzilla default)"] = "Focus (par défaut pour Hubzilla)";
+App::$strings["Theme settings"] = "Paramètres du thème";
+App::$strings["Narrow navbar"] = "Barre de navigation fine";
+App::$strings["Navigation bar background color"] = "Couleur de fond de la barre de navigation";
+App::$strings["Navigation bar icon color "] = "Couleur des icônes de la barre de navigation";
+App::$strings["Navigation bar active icon color "] = "Couleur de l'icône active de la barre de navigation";
+App::$strings["Link color"] = "";
+App::$strings["Set font-color for banner"] = "Définir la couleur du texte de la bannière";
+App::$strings["Set the background color"] = "Définir la couleur d'arrière-plan";
+App::$strings["Set the background image"] = "Définir l'image d'arrière-plan";
+App::$strings["Set the background color of items"] = "Définir la couleur de fond des contributions";
+App::$strings["Set the background color of comments"] = "Couleur de fond des commentaires";
+App::$strings["Set font-size for the entire application"] = "Définir la taille de police pour l'application entière";
+App::$strings["Examples: 87.5%, 14px"] = "";
+App::$strings["Set font-color for posts and comments"] = "Définir la couleur de police pour les contributions et commentaires";
+App::$strings["Set radius of corners"] = "Définir le rayon des arrondis";
+App::$strings["Example: 4px"] = "";
+App::$strings["Set shadow depth of photos"] = "Définir la profondeur de l'ombre des photos";
+App::$strings["Set maximum width of content region in pixel"] = "Définir la largeur maximale de la zone des contenus";
+App::$strings["Leave empty for default width"] = "Laissez vide pour avoir la largeur par défaut";
+App::$strings["Left align page content"] = "Aligner à gauche le contenu de la page";
+App::$strings["Set size of conversation author photo"] = "Définir la taille de la photo de l'auteur d'une conversation";
+App::$strings["Set size of followup author photos"] = "Définir la taille de la photo de l'auteur d'une réponse";
+App::$strings["Errors encountered deleting database table "] = "Des erreurs ont eu lieu lors de la suppression de la table de la base de données.";
+App::$strings["Submit Settings"] = "Emvoyer les paramètres";
+App::$strings["Drop tables when uninstalling?"] = "Lors de la désinstallation, purger les tables?";
+App::$strings["If checked, the Rendezvous database tables will be deleted when the plugin is uninstalled."] = "Si cette case est cochée, les tables de la base Rendezvous seront supprimées lorsque le plugin sera désinstallé.";
+App::$strings["Mapbox Access Token"] = "Jeton d'accès à la mapbox.";
+App::$strings["If you enter a Mapbox access token, it will be used to retrieve map tiles from Mapbox instead of the default OpenStreetMap tile server."] = "Si vous entrez un jeton d'accès Mapbox, il doit être utilisé pour récupérer les cartes à partir de Mapbox au lieu du serveur par défaut OpenStreetMap.";
+App::$strings["Rendezvous"] = "Rendezvous";
+App::$strings["This identity has been deleted by another member due to inactivity. Please press the \"New identity\" button or refresh the page to register a new identity. You may use the same name."] = "Cette identité a été supprimée par un autre membre en raison de l'inactivité. Appuyez sur le bouton \"Nouvelle identité\" ou actualisez la page pour enregistrer une nouvelle identité. Vous pouvez utiliser le même nom.";
+App::$strings["Welcome to Rendezvous!"] = "Bienvenue dans Rendevzvous!";
+App::$strings["Enter your name to join this rendezvous. To begin sharing your location with the other members, tap the GPS control. When your location is discovered, a red dot will appear and others will be able to see you on the map."] = "Entrez votre nom pour rejoindre ce rendez-vous. Pour commencer à partager votre emplacement avec les autres membres, appuyez sur le contrôle GPS. Lorsque votre emplacement est découvert, un point rouge apparaîtra et les autres seront en mesure de vous voir sur la carte.";
+App::$strings["Let's meet here"] = "Rencontrez-vous ici";
+App::$strings["New marker"] = "Nouveau marqueur";
+App::$strings["Edit marker"] = "Éditer le marqueur";
+App::$strings["New identity"] = "Nouvelle identité";
+App::$strings["Delete marker"] = "Supprimer le marqueur";
+App::$strings["Delete member"] = "Supprimer le membre";
+App::$strings["Edit proximity alert"] = "Éditer l'alerte de proximité";
+App::$strings["A proximity alert will be issued when this member is within a certain radius of you.<br><br>Enter a radius in meters (0 to disable):"] = "Une alerte de proximité sera émise lorsque ce membre se trouve dans un certain périmètre autour de vous. Entrer un rayon en mètres (0 pour désactiver):";
+App::$strings["distance"] = "distance";
+App::$strings["Proximity alert distance (meters)"] = "Distance d'alerte de proximité (mètres)";
+App::$strings["A proximity alert will be issued when you are within a certain radius of the marker location.<br><br>Enter a radius in meters (0 to disable):"] = "Une alerte de proximité sera déclenchée quand vous serez à une certaine distance du marqueur d'emplacement.<br><br>Indiquez une distance en mètres (0 pour désactiver)&nbsp;:";
+App::$strings["Marker proximity alert"] = "Alerte de proximité de marqueur";
+App::$strings["Reminder note"] = "Note de rappel";
+App::$strings["Enter a note to be displayed when you are within the specified proximity..."] = "Saisissez une note à afficher quand vous serez à la distance indiquée...";
+App::$strings["Add new rendezvous"] = "Ajouter un nouveau rendezvous";
+App::$strings["Create a new rendezvous and share the access link with those you wish to invite to the group. Those who open the link become members of the rendezvous. They can view other member locations, add markers to the map, or share their own locations with the group."] = "Créez un nouveau rendez-vous et partagez le lien d'accès avec les gens que vous souhaitez inviter au groupe. Ceux qui ouvrent le lien deviennent membres du rendez-vous. Ils peuvent afficher les emplacements des autres membres, ajouter des marqueurs à la carte ou partager leurs propres emplacements avec le groupe.";
+App::$strings["Some setting"] = "Un certain paramètre";
+App::$strings["A setting"] = "Un paramètre";
+App::$strings["Skeleton Settings"] = "Paramètres du squelette";
+App::$strings["GNU-Social Protocol Settings updated."] = "";
+App::$strings["Enable the GNU-Social protocol for this channel"] = "";
+App::$strings["GNU-Social Protocol Settings"] = "";
+App::$strings["Follow"] = "";
+App::$strings["%1\$s is now following %2\$s"] = "";
+App::$strings["INVALID EVENT DISMISSED!"] = "ÉVÉNEMENT INVALIDE REJETÉ!";
+App::$strings["Summary: "] = "Sommaire :";
+App::$strings["Date: "] = "Date :";
+App::$strings["Reason: "] = "Raison :";
+App::$strings["INVALID CARD DISMISSED!"] = "ÉVÉNEMENT INVALIDE REJETÉ!";
+App::$strings["Name: "] = "Nom :";
+App::$strings["You have to enable this plugin in Feature/Addon Settings > CalDAV/CardDAV Settings before you can use it."] = "Vous avez activé ce plugin dans Fonctionalités/Paramètres des extensions > CalDAV/CardDAV Paramètres avant que vous puissiez l'utiliser.";
+App::$strings["Example: YYYY-MM-DD HH:mm"] = "Exemple : YYYY-MM-DD HH:mm";
+App::$strings["End date and time"] = "Date et heure de fin";
+App::$strings["List month"] = "Liste mois";
+App::$strings["List week"] = "Liste semaine";
+App::$strings["List day"] = "Liste jour";
+App::$strings["More"] = "Plus";
+App::$strings["Less"] = "Moins";
+App::$strings["Select calendar"] = "Sélectionner un calendrier";
+App::$strings["Delete all"] = "Tout supprimer";
+App::$strings["Sorry! Editing of recurrent events is not yet implemented."] = "Désolé ! L'édition d'événements récurrents n'est pas encore implémenté.";
+App::$strings["Errors encountered creating database table: "] = "Des erreurs se sont produites lors de la création de la table de la base de données :";
+App::$strings["Default Calendar"] = "Agenda par défaut";
+App::$strings["Default Addressbook"] = "Carnet d'adresses par défaut";
+App::$strings["CalDAV/CardDAV Settings saved."] = "Les paramètres CalDAV/CardDAV ont été sauvegardés.";
+App::$strings["Enable CalDAV/CardDAV Server for this channel"] = "Activer le serveur CalDAV/CardDAV pour ce canal";
+App::$strings["Your CalDAV resources are located at %s "] = "Vos ressources CalDAV sont situées à %s";
+App::$strings["Your CardDAV resources are located at %s "] = "Vos ressources CardDAV sont situées à %s";
+App::$strings["CalDAV/CardDAV Settings"] = "Paramètres CalDAV/CardDAV";
+App::$strings["Home, Voice"] = "Domicile, Voix";
+App::$strings["Home, Fax"] = "Domicile, Fax";
+App::$strings["Work, Voice"] = "Travail, Voix";
+App::$strings["Work, Fax"] = "Travail, Fax";
+App::$strings["Select Channel"] = "Sélectionner un canal";
+App::$strings["Read-write"] = "Lire et écrire";
+App::$strings["Read-only"] = "Lire uniquement";
+App::$strings["My Calendars"] = "Mes agendas";
+App::$strings["Shared Calendars"] = "Agendas partagés";
+App::$strings["Share this calendar"] = "Partager cet agenda";
+App::$strings["Calendar name and color"] = "Nom et couleur de l'agenda";
+App::$strings["Create new calendar"] = "Créer un nouvel agenda";
+App::$strings["Calendar Name"] = "Nom de l'agenda";
+App::$strings["Calendar Tools"] = "Outils pour les agendas";
+App::$strings["Import calendar"] = "Importer un agenda";
+App::$strings["Select a calendar to import to"] = "Sélectionner un agenda à importer dans";
+App::$strings["Addressbooks"] = "Carnet d'adresses";
+App::$strings["Addressbook name"] = "Nom du carnet d'adresses";
+App::$strings["Create new addressbook"] = "Créer un nouveau carnet d'adresses";
+App::$strings["Addressbook Name"] = "Nom du carnet d'adresses";
+App::$strings["Addressbook Tools"] = "Outils pour les carnets d'adresses";
+App::$strings["Import addressbook"] = "Importer un carnet d'adresses";
+App::$strings["Select an addressbook to import to"] = "Sélectionner un carnet d'adresses à importer dans";
+App::$strings["Planets Settings updated."] = "Paramètres Planets mis à jour.";
+App::$strings["Enable Planets Plugin"] = "Activer le plugin Planets";
+App::$strings["Planets Settings"] = "Paramètres Planets";
+App::$strings["System defaults:"] = "Paramètres par défaut du système :";
+App::$strings["Preferred Clipart IDs"] = "ID Clipart préférées";
+App::$strings["List of preferred clipart ids. These will be shown first."] = "Liste des ids clipart préférése. Celles-ci seront montrées en premier.";
+App::$strings["Default Search Term"] = "Terme de recherche par défaut";
+App::$strings["The default search term. These will be shown second."] = "Le terme de recherche par défaut. Ceci sera affiché en second.";
+App::$strings["Return After"] = "Retourner ensuite";
+App::$strings["Page to load after image selection."] = "Page à afficher après la sélection de l'image.";
+App::$strings["Edit Profile"] = "Éditeur de profil";
+App::$strings["Profile List"] = "Liste de profil";
+App::$strings["Order of Preferred"] = "Tri selon les préférences";
+App::$strings["Sort order of preferred clipart ids."] = "Ordre de tri des ids de clipart préférés.";
+App::$strings["Newest first"] = "Les plus récents en premier";
+App::$strings["As entered"] = "Comme entrés";
+App::$strings["Order of other"] = "Tri selon autre";
+App::$strings["Sort order of other clipart ids."] = "Ordre de tri des autres clipart ids.";
+App::$strings["Most downloaded first"] = "Les plus téléchargés en premier";
+App::$strings["Most liked first"] = "Les plus aimés en premier";
+App::$strings["Preferred IDs Message"] = "IDs des messages préférés";
+App::$strings["Message to display above preferred results."] = "Message à afficher au-dessus de la liste des résultats préférés.";
+App::$strings["Uploaded by: "] = "Téléversé par :";
+App::$strings["Drawn by: "] = "Dessiné par :";
+App::$strings["Or select from a free OpenClipart.org image:"] = "ou sélectionner une image libre d'OpenClipart.org :";
+App::$strings["Search Term"] = "Terme de recherche";
+App::$strings["Unknown error. Please try again later."] = "Erreur inconnue. Veuillez essayer à nouveau plus tard.";
+App::$strings["Profile photo updated successfully."] = "Photo de profil actualisée avec succès.";
App::$strings["Flag Adult Photos"] = "Photo pour adulte";
App::$strings["Provide photo edit option to hide inappropriate photos from default album view"] = "Fourni l'option d'édition d'une photo afin de cacher des photos inappropriées de la vue d''album par défaut";
-App::$strings["This is a fairly comprehensive and complete guitar chord dictionary which will list most of the available ways to play a certain chord, starting from the base of the fingerboard up to a few frets beyond the twelfth fret (beyond which everything repeats). A couple of non-standard tunings are provided for the benefit of slide players, etc."] = "Ceci est un dictionnaire d'accords de guitare assez complet et facile qui énumère la plupart des manières possibles de jouer un certain accord, à partir de la base de la touche jusqu'à quelques frettes au-delà de la douzième frette (au-delà de laquelle tout se répète). Un couple d'accordages non standard sont fournis au profit des joueurs de diapositives, etc.";
-App::$strings["Chord names start with a root note (A-G) and may include sharps (#) and flats (b). This software will parse most of the standard naming conventions such as maj, min, dim, sus(2 or 4), aug, with optional repeating elements."] = "Les noms des accords commencent par une note racine (A-G) et peuvent inclure des dièses (#) et des bémols (b). Ce logiciel analysera la plupart des conventions de dénomination standard telles que maj, min, dim, sus (2 ou 4), aug, avec des éléments répétitifs facultatifs.";
-App::$strings["Valid examples include A, A7, Am7, Amaj7, Amaj9, Ammaj7, Aadd4, Asus2Add4, E7b13b11 ..."] = "Exemples valides comprennent A, A7, Am7, Amaj7, Amaj9, Ammaj7, Aadd4, Asus2Add4, E7b13b11 ...";
-App::$strings["Guitar Chords"] = "Acords de guitar";
-App::$strings["The complete online chord dictionary"] = "Le dictionnaire en ligne complet des accords";
-App::$strings["Tuning"] = "Réglage";
-App::$strings["Chord name: example: Em7"] = "Nom d'accord. Exemple : Em7.";
-App::$strings["Show for left handed stringing"] = "Montrer pour les gauchers";
-App::$strings["Quick Reference"] = "Référence rapide";
-App::$strings["No username found in import file."] = "Aucun nom d'utilisateur dans le fichier d'import.";
-App::$strings["Unable to create a unique channel address. Import failed."] = "Impossible de créer une adresse de canal unique. Echec de l'import.";
-App::$strings["Diaspora Protocol Settings updated."] = "Les réglages du protocole Diaspora ont été mis à jour";
-App::$strings["Enable the Diaspora protocol for this channel"] = "Activer le protocole Diaspora pour ce canal.";
-App::$strings["Allow any Diaspora member to comment on your public posts"] = "Autoriser n'importe quel membre de Diaspora à commenter vos messages publics";
-App::$strings["Prevent your hashtags from being redirected to other sites"] = "Empêche vos hashtags d'être redirigés vers d'autres sites";
-App::$strings["Followed hashtags (comma separated, do not include the #)"] = "Hashtags suivis (séparer par une virgule ; ne pas mettre le #)";
-App::$strings["Diaspora Protocol Settings"] = "Compatibilité avec Diaspora";
+App::$strings["Post to WordPress"] = "Publier sur Wordpress";
+App::$strings["Enable WordPress Post Plugin"] = "Activer l'extension de publication WordPress";
+App::$strings["WordPress username"] = "Identifiant de connexion WordPress";
+App::$strings["WordPress password"] = "Mot de passe de connexion WordPress";
+App::$strings["WordPress API URL"] = "URL de l'API WordPress";
+App::$strings["Typically https://your-blog.tld/xmlrpc.php"] = "Typiquement https://your-blog.tld/xmlrpc.php";
+App::$strings["WordPress blogid"] = "ID de votre blog WordPress";
+App::$strings["For multi-user sites such as wordpress.com, otherwise leave blank"] = "Pour les sites multi-utilisateurs comme wordpress.com, sinon laisser vide";
+App::$strings["Post to WordPress by default"] = "Par défaut, publier sur WordPress";
+App::$strings["Forward comments (requires hubzilla_wp plugin)"] = "Transférer les commentaires (nécessite le plugin hubzila_wp)";
+App::$strings["WordPress Post Settings"] = "Paramètres de publications WordPress";
+App::$strings["Wordpress Settings saved."] = "Les paramètres WordPress ont été sauvegardés.";
+App::$strings["This plugin looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW. This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "Ce plugin cherche dans les publications les mots/textes que vous spécifiez ci-dessous, et réduit tout contenu contenant ces mots-clés afin qu'ils ne s'affichent pas à des moments inappropriés, tels que les insinuations sexuelles qui peuvent être inappropriées dans un contexte de travail. Il est poli et recommandé de marquer tout contenu contenant de la nudité avec #NSFW. Ce filtre peut également correspondre à tout autre mot/texte que vous spécifiez et peut ainsi être utilisé comme un filtre de contenu à usage général.";
+App::$strings["Enable Content filter"] = "Activer le filtrage des contenus";
+App::$strings["Comma separated list of keywords to hide"] = "Liste séparée par des virgules des mots-clés à cacher";
+App::$strings["Word, /regular-expression/, lang=xx, lang!=xx"] = "Mot, /expression-régulière/, lang=xx, lang!=xx";
+App::$strings["Not Safe For Work Settings"] = "Paramètres NSFW (Not Safe For Work)";
+App::$strings["General Purpose Content Filter"] = "Filtre de contenu sujet général";
+App::$strings["NSFW Settings saved."] = "Paramètres NSFW sauvegardés.";
+App::$strings["Possible adult content"] = "Contenu pour adulte probable";
+App::$strings["%s - view"] = "";
+App::$strings["Post to Insanejournal"] = "Publier sur InsaneJournal";
+App::$strings["Enable InsaneJournal Post Plugin"] = "Activer le plugin de publication InsaneJournal";
+App::$strings["InsaneJournal username"] = "Identifiant InsaneJournal";
+App::$strings["InsaneJournal password"] = "Mot de passe InsaneJournal";
+App::$strings["Post to InsaneJournal by default"] = "Par défaut, publier dans InsaneJournal";
+App::$strings["InsaneJournal Post Settings"] = "Paramètres de publication de InsaneJournal";
+App::$strings["Insane Journal Settings saved."] = "Les paramètres d'InsaneJournal ont été sauvegardés";
+App::$strings["Upload a file"] = "Téléverser un fichier";
+App::$strings["Drop files here to upload"] = "Glisser les fichiers ici pour téléversement";
+App::$strings["Failed"] = "Échec";
+App::$strings["No files were uploaded."] = "Aucun fichier n'a été téléversé.";
+App::$strings["Uploaded file is empty"] = "Le fichier téléversé est vide";
+App::$strings["Image exceeds size limit of "] = "L'image excède la taille limite de";
+App::$strings["File has an invalid extension, it should be one of "] = "L'extension du fichier est invalide, elle doit être l'une des suivantes";
+App::$strings["Upload was cancelled, or server error encountered"] = "Le téléversement a été annulé, ou le serveur a rencontré une erreur";
+App::$strings["Post to Dreamwidth"] = "Publier sur Dreamwidth";
+App::$strings["Enable Dreamwidth Post Plugin"] = "Activer le plugin de publication Dreamwidth";
+App::$strings["Dreamwidth username"] = "Nom d'utilisateur Dreamwidth";
+App::$strings["Dreamwidth password"] = "Mot de passe Dreamwidth";
+App::$strings["Post to Dreamwidth by default"] = "Publication avec Dreamwidth par défaut";
+App::$strings["Dreamwidth Post Settings"] = "Paramètres de publication Dreamwidth";
+App::$strings["Install Firefox Sharing Tools"] = "Installer Firefox Sharing Tools";
+App::$strings["Share content from Firefox to \$Projectname"] = "Partager du contenu depuis Firefox avec \$Projectname";
+App::$strings["Install Firefox Sharing Tools to this web browser"] = "Installer Firefox Sharing Tools sur ce navigateur";
App::$strings["Hubzilla Directory Stats"] = "Statistiques de l'annuaire Hubzilla";
App::$strings["Total Hubs"] = "Total de Hubs";
App::$strings["Hubzilla Hubs"] = "Hubs Hubzilla";
@@ -1726,167 +1977,31 @@ App::$strings["Average Age"] = "Âge moyen";
App::$strings["Known Chatrooms"] = "Salons de discussion connus";
App::$strings["Known Tags"] = "Étiquettes connues";
App::$strings["Please note Diaspora and Friendica statistics are merely those **this directory** is aware of, and not all those known in the network. This also applies to chatrooms,"] = "Veuillez noter que les statistiques de Diaspora et Friendica sont simplement celles dont **ce répertoire** est au courant, et pas toutes celles connues dans le réseau. Cela s'applique également aux salles de discussion,";
-App::$strings["Project Servers and Resources"] = "Serveurs et ressources du projet";
-App::$strings["Project Creator and Tech Lead"] = "Créateur et Responsable Technique du projet";
-App::$strings["Admin, developer, directorymin, support bloke"] = "Administrateur, développeur, responsable d'annuaire, équipe support";
-App::$strings["And the hundreds of other people and organisations who helped make the Hubzilla possible."] = "Et les centaines d'autres personnes et organisations qui ont contribué à rendre le Hubzilla possible.";
-App::$strings["The Redmatrix/Hubzilla projects are provided primarily by volunteers giving their time and expertise - and often paying out of pocket for services they share with others."] = "Les projets Redmatrix / Hubzilla sont fournis principalement par des bénévoles qui donnent de leur temps et de leur expertise - et paient souvent de leur poche pour des services qu'ils partagent avec d'autres.";
-App::$strings["There is no corporate funding and no ads, and we do not collect and sell your personal information. (We don't control your personal information - <strong>you do</strong>.)"] = "Il n'y a ni financement d'entreprise ni publicités, et nous ne recueillons ni ne vendons vos données personnelles. (Nous ne contrôlons pas vos informations personnelles - vous le faites !)";
-App::$strings["Help support our ground-breaking work in decentralisation, web identity, and privacy."] = "Aider à soutenir notre travail novateur en matière de décentralisation, d'identité Web et de confidentialité.";
-App::$strings["Your donations keep servers and services running and also helps us to provide innovative new features and continued development."] = "Vos dons maintiennent les serveurs et les services en marche et nous aident également à fournir de nouvelles fonctionnalités innovantes et un développement continu.";
-App::$strings["Donate"] = "Donner";
-App::$strings["Choose a project, developer, or public hub to support with a one-time donation"] = "Choisissez un projet, un développeur ou un hub public à soutenir à l'aide d'un don unique";
-App::$strings["Donate Now"] = "Donner maintenant";
-App::$strings["<strong><em>Or</em></strong> become a project sponsor (Hubzilla Project only)"] = "Or devenez un sponsor du projet (projet Hubzilla uniquement)";
-App::$strings["Please indicate if you would like your first name or full name (or nothing) to appear in our sponsor listing"] = "Veuillez indiquer si vous souhaitez que votre nom ou prénom (ou rien) apparaisse dans la liste de nos sponsors.";
-App::$strings["Sponsor"] = "Sponsors";
-App::$strings["Special thanks to: "] = "Remerciements particuliers à :";
-App::$strings["Post to Dreamwidth"] = "Publier sur Dreamwidth";
-App::$strings["Enable Dreamwidth Post Plugin"] = "Activer le plugin de publication Dreamwidth";
-App::$strings["Dreamwidth username"] = "Nom d'utilisateur Dreamwidth";
-App::$strings["Dreamwidth password"] = "Mot de passe Dreamwidth";
-App::$strings["Post to Dreamwidth by default"] = "Publication avec Dreamwidth par défaut";
-App::$strings["Dreamwidth Post Settings"] = "Paramètres de publication Dreamwidth";
-App::$strings["Flattr this!"] = "Flattr this!";
-App::$strings["Flattr widget settings updated."] = "Les paramètres du widget Flattr ont été mis à jour";
-App::$strings["Flattr user"] = "Utilisateur de Flattr";
-App::$strings["URL of the Thing to flattr"] = "URL de ce que vous voulez flattr";
-App::$strings["If empty channel URL is used"] = "Si une url vide est utilisée";
-App::$strings["Title of the Thing to flattr"] = "Titre de ce que vous voulez flattr";
-App::$strings["If empty \"channel name on The Hubzilla\" will be used"] = "Si vide, \"nom du canal sur Hubzilla\" sera utilisé";
-App::$strings["Static or dynamic flattr button"] = "Statique ou dynamique bouton Flattr";
-App::$strings["static"] = "statique";
-App::$strings["dynamic"] = "dynamique";
-App::$strings["Alignment of the widget"] = "Alignement du widget";
-App::$strings["left"] = "gauche";
-App::$strings["right"] = "droite";
-App::$strings["Enable Flattr widget"] = "Activer le widget Flattr";
-App::$strings["Flattr Widget Settings"] = "Paramètres du widget Flattr";
-App::$strings["Contact not found."] = "Contact introuvable.";
-App::$strings["This may occasionally happen if contact was requested by both persons and it has already been approved."] = "Ceci peut parfois se produire lorsque le contact a été demandé par les deux personnes à la fois et a déjà été approuvé.";
-App::$strings["Response from remote site was not understood."] = "La réponse du site de contrôle à distance n'a pas été comprise.";
-App::$strings["Unexpected response from remote site: "] = "Réponse inattendue du site de contrôle à distance :";
-App::$strings["Confirmation completed successfully."] = "Complété avec succès confirmé.";
-App::$strings["Remote site reported: "] = "Contrôle à distance du site reporté :";
-App::$strings["Temporary failure. Please wait and try again."] = "Défaillance temporaire. Veuillez attendre et essayer à nouveau.";
-App::$strings["Introduction failed or was revoked."] = "La demande de relation a échoué ou a été révoquée.";
-App::$strings["Unable to set contact photo."] = "Impossible de définir la photo du contact.";
-App::$strings["%1\$s is now friends with %2\$s"] = "%1\$s est maintenant ami avec %2\$s";
-App::$strings["No user record found for '%s' "] = "Aucun utilisateur enregistré ne correspond à '%s' ";
-App::$strings["Our site encryption key is apparently messed up."] = "Notre clé de chiffrement du site est apparemment corrompue.";
-App::$strings["Empty site URL was provided or URL could not be decrypted by us."] = "L'URL fournie est vide ou ne peut être déchiffrée par nous.";
-App::$strings["Contact record was not found for you on our site."] = "Le contact enregistré n'a pas été trouvé sur notre site.";
-App::$strings["Site public key not available in contact record for URL %s."] = "La clé publique du site n'est pas disponible dans l'enregistrement de contact pour l'URL %s.";
-App::$strings["The ID provided by your system is a duplicate on our system. It should work if you try again."] = "L'ID fournie par votre système est un duplicata sur notre système. Cela devrait fonctionner si vous essayez à nouveau.";
-App::$strings["Unable to set your contact credentials on our system."] = "Impossible de définir vos informations de connexion sur notre système.";
-App::$strings["Unable to update your contact profile details on our system"] = "Impossible de mettre à jour les détails de votre profil de contact sur notre système.";
-App::$strings["[Name Withheld]"] = "[Nom refusé]";
-App::$strings["%1\$s has joined %2\$s"] = "%1\$s a rejoint %2\$s";
-App::$strings["%1\$s welcomes %2\$s"] = "%1\$s souhaite la bienvenue à %2\$s";
-App::$strings["This introduction has already been accepted."] = "Cette relation a déjà été acceptée.";
-App::$strings["Profile location is not valid or does not contain profile information."] = "L'emplacement de profil n'est pas valide ou ne contient pas d'informations sur le profil.";
-App::$strings["Warning: profile location has no identifiable owner name."] = "Attention : l'emplacement de profil n'a pas de nom de propriétaire identifiable.";
-App::$strings["Warning: profile location has no profile photo."] = "Attention : l'emplacement de profil n'a pas de photo de profil.";
-App::$strings["%d required parameter was not found at the given location"] = array(
- 0 => "%d paramètre non trouvé à l'emplacement indiqué",
- 1 => "%d paramètres non trouvés à l'emplacement indiqué",
-);
-App::$strings["Introduction complete."] = "Relation confirmée.";
-App::$strings["Unrecoverable protocol error."] = "Erreur de protocole irrécupérable.";
-App::$strings["Profile unavailable."] = "Profil indisponible.";
-App::$strings["%s has received too many connection requests today."] = "%s a reçu trop de demandes de connexion aujourd'hui.";
-App::$strings["Spam protection measures have been invoked."] = "Des mesures de protection anti-spam ont été mises en place.";
-App::$strings["Friends are advised to please try again in 24 hours."] = "Les amis sont invités à essayer de nouveau dans 24 heures.";
-App::$strings["Invalid locator"] = "Localisateur innvalide";
-App::$strings["Invalid email address."] = "Adresse mail invalide.";
-App::$strings["This account has not been configured for email. Request failed."] = "Le mail de ce compte n'a pas été configuré. La requête a échouée.";
-App::$strings["Unable to resolve your name at the provided location."] = "Impossible de résoudre votre nom à l'emplacement spécifié.";
-App::$strings["You have already introduced yourself here."] = "Vous vous êtes déjà introduit ici.";
-App::$strings["Apparently you are already friends with %s."] = "Apparemment vous êtes déjà ami avec %s.";
-App::$strings["Invalid profile URL."] = "Adresse de profil invalide.";
-App::$strings["Disallowed profile URL."] = "Adresse de profil non-autorisée.";
-App::$strings["Failed to update contact record."] = "Échec de la mise jour de l'enregistrement du contact.";
-App::$strings["Your introduction has been sent."] = "Votre demande de relation a été envoyée.";
-App::$strings["Please login to confirm introduction."] = "Veuillez vous connecter pour confirmer la relation.";
-App::$strings["Incorrect identity currently logged in. Please login to <strong>this</strong> profile."] = "L'identité de connexion actuelle est incorrecte. Veuillez vous connecter à <strong>ce</strong> profil.";
-App::$strings["Confirm"] = "Confirmer";
-App::$strings["Hide this contact"] = "Cacher ce contact";
-App::$strings["Welcome home %s."] = "Bienvenue %s.";
-App::$strings["Please confirm your introduction/connection request to %s."] = "Veuillez confirmer votre demande de relation à %s.";
-App::$strings["Please enter your 'Identity Address' from one of the following supported communications networks:"] = "Veuillez entrer votre 'adresse d'identification' à partir de l'un des réseaux sociaux supportés suivants :";
-App::$strings["If you are not yet a member of the free social web, <a href=\"%s/siteinfo\">follow this link to find a public Friendica site and join us today</a>."] = "Si vous n'êtes pas déjà membre d'un réseau social libre, <a href=\"%s/siteinfo\">suivre ce lien pour trouver un site public de Friendica et nous rejoindre dès maintenant</a>.";
-App::$strings["Friend/Connection Request"] = "Requête d'ami/connection";
-App::$strings["Examples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, testuser@identi.ca"] = "Exemples : jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, testuser@identi.ca";
-App::$strings["Please answer the following:"] = "Veuillez répondre aux questions suivantes :";
-App::$strings["Does %s know you?"] = "Est-ce que %s vous connaît ?";
-App::$strings["Add a personal note:"] = "Ajouter une note personnelle :";
-App::$strings["Friendica"] = "Friendica";
-App::$strings["StatusNet/Federated Social Web"] = "StatusNet/Réseau Social Fédéré";
-App::$strings["Diaspora"] = "Diaspora";
-App::$strings[" - please do not use this form. Instead, enter %s into your Diaspora search bar."] = "- veuillez ne pas utiliser ce formulaire. À la place, entrez %s dans la barre de recherche de Diaspora.";
-App::$strings["Your Identity Address:"] = "Votre adresse d'identification :";
-App::$strings["Submit Request"] = "Envoyer la demande";
-App::$strings["GNU-Social Protocol Settings updated."] = "Les paramètres du protocole GNU-Social ont été mis à jour.";
-App::$strings["Enable the (experimental) GNU-Social protocol for this channel"] = "Activer la connexion (expérimentale) du protocole GNU-Social pour ce canal";
-App::$strings["GNU-Social Protocol Settings"] = "Paramètres du protocole GNU-Social";
-App::$strings["Follow"] = "S'abonner";
-App::$strings["%1\$s is now following %2\$s"] = "%1\$s est maintenant abonné à %2\$s";
-App::$strings["Friendica Photo Album Import"] = "Importation de l'album photo Friendica ";
-App::$strings["This will import all your Friendica photo albums to this Red channel."] = "Ceci importera toutes vos albums photos Friendica dans ce canal Hubzilla.";
-App::$strings["Friendica Server base URL"] = "URL de base du serveur Friendica";
-App::$strings["Friendica Login Username"] = "Identifiant de connexion Friendica";
-App::$strings["Friendica Login Password"] = "Mot de passe de connexion Friendica";
-App::$strings["Send email to all members"] = "Envoyer un mail à tous les membres";
-App::$strings["$1%s Administrator"] = "$1%s administrateur";
-App::$strings["No recipients found."] = "Aucun destinataire trouvé.";
-App::$strings["%1\$d of %2\$d messages sent."] = "%1\$d message(s) envoyés sur %2\$d.";
-App::$strings["Send email to all hub members."] = "Envoyer un e-mail à tous les membres du hub.";
-App::$strings["Message subject"] = "Objet du message";
-App::$strings["Sender Email address"] = "Adresse mail de l'expéditeur";
-App::$strings["Test mode (only send to hub administrator)"] = "Mode test (uniquement envoyé à l'administrateur du hub)";
-App::$strings["Post to Insanejournal"] = "Publier sur InsaneJournal";
-App::$strings["Enable InsaneJournal Post Plugin"] = "Activer le plugin de publication InsaneJournal";
-App::$strings["InsaneJournal username"] = "Identifiant InsaneJournal";
-App::$strings["InsaneJournal password"] = "Mot de passe InsaneJournal";
-App::$strings["Post to InsaneJournal by default"] = "Par défaut, publier dans InsaneJournal";
-App::$strings["InsaneJournal Post Settings"] = "Paramètres de publication de InsaneJournal";
-App::$strings["Insane Journal Settings saved."] = "Les paramètres d'InsaneJournal ont été sauvegardés";
+App::$strings["Email notification hub"] = "Notification par mail du hub";
+App::$strings["Hostname"] = "Nom d'hôte";
+App::$strings["Mailhost Settings"] = "Paramètres mail de l'hôte";
+App::$strings["MAILHOST Settings saved."] = "Paramètres mail de l'hôte sauvegardés.";
+App::$strings["Your Webbie:"] = "Vous êtes Webbie :";
+App::$strings["Fontsize (px):"] = "Taille de la police (px) :";
+App::$strings["Link:"] = "Lien :";
+App::$strings["Like us on Hubzilla"] = "Aimez-nous sur Hubzilla";
+App::$strings["Embed:"] = "Embarqué :";
+App::$strings["Photos imported"] = "Photos importées";
+App::$strings["Redmatrix Photo Album Import"] = "Import de l'album photo Redmatrix";
+App::$strings["This will import all your Redmatrix photo albums to this channel."] = "Ceci va importer l'intégralité de vos albums photos Redmatrix dans ce canal.";
+App::$strings["Redmatrix Server base URL"] = "URL de base du serveur Redmatrix";
+App::$strings["Redmatrix Login Username"] = "Identifiant de connexion Redmatrix";
+App::$strings["Redmatrix Login Password"] = "Mot de passe de connexion Redmatrix";
+App::$strings["Import just this album"] = "Importer uniquement cet album";
+App::$strings["Leave blank to import all albums"] = "Laisser vide pour importer tous les albums";
+App::$strings["Maximum count to import"] = "Nombre maximum de comptes à importer";
+App::$strings["0 or blank to import all available"] = "0 ou vide pour importer tout ce qui est disponible";
App::$strings["Channels to auto connect"] = "Canaux à connecter automatiqument";
App::$strings["Comma separated list"] = "Liste séparée par des virgules";
App::$strings["Popular Channels"] = "Canaux populaires";
App::$strings["IRC Settings"] = "Paramètres IRC";
App::$strings["IRC settings saved."] = "Paramètres IRC sauvegardés";
App::$strings["IRC Chatroom"] = "Salon de discussion IRC";
-App::$strings["Status:"] = "État&nbsp;:";
-App::$strings["Activate addon"] = "Activer l'extension";
-App::$strings["Hide Jappixmini Chat-Widget from the webinterface"] = "Cacher le widget de chat Jappixmini de l'interface web";
-App::$strings["Jabber username"] = "Identifiant Jabber";
-App::$strings["Jabber server"] = "Serveur Jabber";
-App::$strings["Jabber BOSH host URL"] = "Adresse hôte pour Jabber BOSH";
-App::$strings["Jabber password"] = "Mot de passe Jabber";
-App::$strings["Encrypt Jabber password with Hubzilla password"] = "Chiffrer le mot de passe Jabber avec le mot de passe Hubzilla";
-App::$strings["Hubzilla password"] = "Mot de passe Hubzilla";
-App::$strings["Approve subscription requests from Hubzilla contacts automatically"] = "Approuver automatiquement les demandes de connexion des contacts Hubzilla";
-App::$strings["Purge internal list of jabber addresses of contacts"] = "Purger la liste interne des adresses jabber des contacts";
-App::$strings["Configuration Help"] = "Aide pour la configuration";
-App::$strings["Jappix Mini Settings"] = "Paramètres de Jappix mini";
-App::$strings["Upload a file"] = "Téléverser un fichier";
-App::$strings["Drop files here to upload"] = "Glisser les fichiers ici pour téléversement";
-App::$strings["Failed"] = "Échec";
-App::$strings["No files were uploaded."] = "Aucun fichier n'a été téléversé.";
-App::$strings["Uploaded file is empty"] = "Le fichier téléversé est vide";
-App::$strings["Image exceeds size limit of "] = "L'image excède la taille limite de";
-App::$strings["File has an invalid extension, it should be one of "] = "L'extension du fichier est invalide, elle doit être l'une des suivantes";
-App::$strings["Upload was cancelled, or server error encountered"] = "Le téléversement a été annulé, ou le serveur a rencontré une erreur";
-App::$strings["An account has been created for you."] = "Un compte a été créé pour vous.";
-App::$strings["Authentication successful but rejected: account creation is disabled."] = "L'authentification a réussi mais a été rejetée : la création de comptes est désactivée.";
-App::$strings["Post to Libertree"] = "Publier sur Libertree";
-App::$strings["Enable Libertree Post Plugin"] = "Activer le plugin de publication Libertree";
-App::$strings["Libertree API token"] = "Jeton de l'API Libertree";
-App::$strings["Libertree site URL"] = "Adresse du site Libertree";
-App::$strings["Post to Libertree by default"] = "Par défaut, publier sur Libertree";
-App::$strings["Libertree Post Settings"] = "Paramètres de publication pour Libertree";
-App::$strings["Libertree Settings saved."] = "Paramètres de Libertree sauvegardés.";
App::$strings["Post to LiveJournal"] = "Publier sur LiveJournal";
App::$strings["Enable LiveJournal Post Plugin"] = "Activer le plugin de publication LiveJournal";
App::$strings["LiveJournal username"] = "Identifiant LiveJournal";
@@ -1894,36 +2009,34 @@ App::$strings["LiveJournal password"] = "Mot de passe LiveJournal";
App::$strings["Post to LiveJournal by default"] = "Par défaut, publier sur LiveJournal";
App::$strings["LiveJournal Post Settings"] = "Paramètres de publication LiveJournal";
App::$strings["LiveJournal Settings saved."] = "Paramètres LiveJournal sauvegardés.";
-App::$strings["Logfile archive directory"] = "Répertoire d'archivage du fichier journal";
-App::$strings["Directory to store rotated logs"] = "Répertoire où stocker les journaux de rotation";
-App::$strings["Logfile size in bytes before rotating"] = "Taille du fichier journal en octets avant la rotation";
-App::$strings["Number of logfiles to retain"] = "Nombre de fichiers de journal à conserver";
-App::$strings["Email notification hub"] = "Notification par mail du hub";
-App::$strings["Hostname"] = "Nom d'hôte";
-App::$strings["Mailhost Settings"] = "Paramètres mail de l'hôte";
-App::$strings["MAILHOST Settings saved."] = "Paramètres mail de l'hôte sauvegardés.";
-App::$strings["lonely"] = "isolé";
-App::$strings["drunk"] = "saoul";
-App::$strings["horny"] = "libidineux";
-App::$strings["stoned"] = "défoncé";
-App::$strings["fucked up"] = "cramé";
-App::$strings["clusterfucked"] = "énervé";
-App::$strings["crazy"] = "cinglé";
-App::$strings["hurt"] = "dommage";
-App::$strings["sleepy"] = "somnolent";
-App::$strings["grumpy"] = "grognon";
-App::$strings["high"] = "allumé";
-App::$strings["semi-conscious"] = "à demi-conscient";
-App::$strings["in love"] = "amoureux";
-App::$strings["in lust"] = "convoitise";
-App::$strings["naked"] = "nu";
-App::$strings["stinky"] = "puant";
-App::$strings["sweaty"] = "en sueur";
-App::$strings["bleeding out"] = "en sang";
-App::$strings["victorious"] = "victorieux";
-App::$strings["defeated"] = "vaincu";
-App::$strings["envious"] = "envieux";
-App::$strings["jealous"] = "jaloux";
+App::$strings["We encountered a problem while logging in with the OpenID you provided. Please check the correct spelling of the ID."] = "Nous avons rencontrons un problème lors de l'identification avec l'OpenID que vous avez fournie. Veuillez vérifier que vous avez correctement écrit votre ID.";
+App::$strings["The error message was:"] = "Le message d'erreur était :";
+App::$strings["First Name"] = "Prénom";
+App::$strings["Last Name"] = "Nom";
+App::$strings["Nickname"] = "Surnom";
+App::$strings["Full Name"] = "Nom complet";
+App::$strings["Profile Photo 16px"] = "Photo de profil 16px";
+App::$strings["Profile Photo 32px"] = "Photo de profil 32px";
+App::$strings["Profile Photo 48px"] = "Photo de profil 48px";
+App::$strings["Profile Photo 64px"] = "Photo de profil 64px";
+App::$strings["Profile Photo 80px"] = "Photo de profil 80px";
+App::$strings["Profile Photo 128px"] = "Photo de profil 128px";
+App::$strings["Timezone"] = "Fuseau horaire";
+App::$strings["Birth Year"] = "Années de naissance";
+App::$strings["Birth Month"] = "Mois de naissance";
+App::$strings["Birth Day"] = "Jour de naissance";
+App::$strings["Birthdate"] = "Date de naissance";
+App::$strings["OpenID protocol error. No ID returned."] = "Erreur du protocole OpenID. Aucune ID trouvée.";
+App::$strings["Login failed."] = "Échec de la connexion.";
+App::$strings["Male"] = "Homme";
+App::$strings["Female"] = "Femme";
+App::$strings["You're welcome."] = "Bienvenue.";
+App::$strings["Ah shucks..."] = "Ah m…";
+App::$strings["Don't mention it."] = "De rien.";
+App::$strings["&lt;blush&gt;"] = "&lt;rougit&gt;";
+App::$strings["Page to load after login"] = "Page à charger après l'identification";
+App::$strings["Examples: &quot;apps&quot;, &quot;network?f=&gid=37&quot; (privacy collection), &quot;channel&quot; or &quot;notifications/system&quot; (leave blank for default network page (grid)."] = "Exemples: &quot;apps&quot;, &quot;network?f=&gid=37&quot; (privacy collection), &quot;channel&quot; or &quot;notifications/system&quot; (laisser vide pour la page par défaut du réseau (grille).";
+App::$strings["Startpage Settings"] = "Paramètres de la page de démarrage";
App::$strings["bitchslap"] = "giffler";
App::$strings["bitchslapped"] = "gifflé(e)";
App::$strings["shag"] = "baiser";
@@ -1962,50 +2075,46 @@ App::$strings["bonk"] = "baiser";
App::$strings["bonked"] = "baisé(e)";
App::$strings["declare undying love for"] = "Déclarer un amour éternel pour";
App::$strings["declared undying love for"] = "A déclaré l'amour éternel pour";
-App::$strings["Save Settings"] = "Sauvegarder les paramètres";
-App::$strings["text to include in all outgoing posts from this site"] = "Texte à inclure dans tous les messages sortants de ce site";
-App::$strings["Federate"] = "Fédérer";
-App::$strings["nofed Settings saved."] = "Les paramètres nfed ont été enregistrés.";
-App::$strings["Allow Federation Toggle"] = "Autoriser la fédération avec Toggle";
-App::$strings["Federate posts by default"] = "Par défaut, fédérer les publications.";
-App::$strings["NoFed Settings"] = "Paramètres NoFed";
+App::$strings["Diaspora Protocol Settings updated."] = "";
+App::$strings["Enable the Diaspora protocol for this channel"] = "";
+App::$strings["Allow any Diaspora member to comment on your public posts"] = "";
+App::$strings["Prevent your hashtags from being redirected to other sites"] = "";
+App::$strings["Followed hashtags (comma separated, do not include the #)"] = "";
+App::$strings["Diaspora Protocol Settings"] = "";
+App::$strings["No username found in import file."] = "";
+App::$strings["Unable to create a unique channel address. Import failed."] = "Impossible de créer une adresse de canal unique. Echec de l'import.";
+App::$strings["Error retrieving wiki"] = "Erreur lors de la récupération du wiki";
+App::$strings["Error creating zip file export folder"] = "Erreur lors de la création du dossier d'exportation du fichier zip";
+App::$strings["Error downloading wiki: "] = "Erreur lors du téléchargement du wiki:";
+App::$strings["Your account on %s will expire in a few days."] = "Votre compte sur %s expirera dans quelques jours.";
+App::$strings["Your $Productname test account is about to expire."] = "Votre compte de test $NomDeProduit est sur le point d'expirer.";
+App::$strings["Enable Rainbowtag"] = "Activer Rainbowtag";
+App::$strings["Rainbowtag Settings"] = "Paramètres Rainbowtag";
+App::$strings["Rainbowtag Settings saved."] = "Paramètres Rainbowtag sauvegardés.";
+App::$strings["Show Upload Limits"] = "Afficher les limites de débit ascendant (upload)";
+App::$strings["Hubzilla configured maximum size: "] = "Taille maximale configurée par Hubzilla:";
+App::$strings["PHP upload_max_filesize: "] = "PHP upload_max_filesize: ";
+App::$strings["PHP post_max_size (must be larger than upload_max_filesize): "] = "PHP post_max_size (must be larger than upload_max_filesize): ";
+App::$strings["Recent Channel/Profile Viewers"] = "Visiteurs récents du canal/profil";
+App::$strings["This plugin/addon has not been configured."] = "Cette extension n'a pas été configurée.";
+App::$strings["Please visit the Visage settings on %s"] = "Veuillez visiter les paramètres de Visage sur %s";
+App::$strings["your feature settings page"] = "La page des paramètres de vos fonctionnalités";
+App::$strings["No entries."] = "Aucune entrée.";
+App::$strings["Enable Visage Visitor Logging"] = "Activer la connexion Visage Visitor";
+App::$strings["Visage Settings"] = "Paramètres Visage";
App::$strings["Nsabait Settings updated."] = "Les paramètres Nsabait ont été enregistrés.";
App::$strings["Enable NSAbait Plugin"] = "Activer le plugin NSAbait";
App::$strings["NSAbait Settings"] = "Paramètres NSAbait";
-App::$strings["This plugin looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW. This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "Ce plugin cherche dans les publications les mots/textes que vous spécifiez ci-dessous, et réduit tout contenu contenant ces mots-clés afin qu'ils ne s'affichent pas à des moments inappropriés, tels que les insinuations sexuelles qui peuvent être inappropriées dans un contexte de travail. Il est poli et recommandé de marquer tout contenu contenant de la nudité avec #NSFW. Ce filtre peut également correspondre à tout autre mot/texte que vous spécifiez et peut ainsi être utilisé comme un filtre de contenu à usage général.";
-App::$strings["Enable Content filter"] = "Activer le filtrage des contenus";
-App::$strings["Comma separated list of keywords to hide"] = "Liste séparée par des virgules des mots-clés à cacher";
-App::$strings["Word, /regular-expression/, lang=xx, lang!=xx"] = "Mot, /expression-régulière/, lang=xx, lang!=xx";
-App::$strings["Not Safe For Work Settings"] = "Paramètres NSFW (Not Safe For Work)";
-App::$strings["General Purpose Content Filter"] = "Filtre de contenu sujet général";
-App::$strings["NSFW Settings saved."] = "Paramètres NSFW sauvegardés.";
-App::$strings["Possible adult content"] = "Contenu pour adulte probable";
-App::$strings["%s - view"] = "";
-App::$strings["System defaults:"] = "Paramètres par défaut du système :";
-App::$strings["Preferred Clipart IDs"] = "ID Clipart préférées";
-App::$strings["List of preferred clipart ids. These will be shown first."] = "Liste des ids clipart préférése. Celles-ci seront montrées en premier.";
-App::$strings["Default Search Term"] = "Terme de recherche par défaut";
-App::$strings["The default search term. These will be shown second."] = "Le terme de recherche par défaut. Ceci sera affiché en second.";
-App::$strings["Return After"] = "Retourner ensuite";
-App::$strings["Page to load after image selection."] = "Page à afficher après la sélection de l'image.";
-App::$strings["Edit Profile"] = "Éditeur de profil";
-App::$strings["Profile List"] = "Liste de profil";
-App::$strings["Order of Preferred"] = "Tri selon les préférences";
-App::$strings["Sort order of preferred clipart ids."] = "Ordre de tri des ids de clipart préférés.";
-App::$strings["Newest first"] = "Les plus récents en premier";
-App::$strings["As entered"] = "Comme entrés";
-App::$strings["Order of other"] = "Tri selon autre";
-App::$strings["Sort order of other clipart ids."] = "Ordre de tri des autres clipart ids.";
-App::$strings["Most downloaded first"] = "Les plus téléchargés en premier";
-App::$strings["Most liked first"] = "Les plus aimés en premier";
-App::$strings["Preferred IDs Message"] = "IDs des messages préférés";
-App::$strings["Message to display above preferred results."] = "Message à afficher au-dessus de la liste des résultats préférés.";
-App::$strings["Uploaded by: "] = "Téléversé par :";
-App::$strings["Drawn by: "] = "Dessiné par :";
-App::$strings["Or select from a free OpenClipart.org image:"] = "ou sélectionner une image libre d'OpenClipart.org :";
-App::$strings["Search Term"] = "Terme de recherche";
-App::$strings["Unknown error. Please try again later."] = "Erreur inconnue. Veuillez essayer à nouveau plus tard.";
-App::$strings["Profile photo updated successfully."] = "Photo de profil actualisée avec succès.";
+App::$strings["Send test email"] = "Envoyer un mail de test";
+App::$strings["No recipients found."] = "Aucun destinataire trouvé.";
+App::$strings["Mail sent."] = "Mail envoyé.";
+App::$strings["Sending of mail failed."] = "L'envoi du mail a échoué.";
+App::$strings["Mail Test"] = "Test du mail";
+App::$strings["Message subject"] = "Objet du message";
+App::$strings["Reconnecting %d connections"] = "";
+App::$strings["Diaspora Reconnect"] = "";
+App::$strings["Use this form to re-establish Diaspora connections which were initially made from a different hub."] = "";
+App::$strings["Reconnect"] = "";
App::$strings["View Larger"] = "Afficher en plus grand";
App::$strings["Tile Server URL"] = "URL de la tuile du serveur";
App::$strings["A list of <a href=\"http://wiki.openstreetmap.org/wiki/TMS\" target=\"_blank\">public tile servers</a>"] = "Une liste de <a href=\"http://wiki.openstreetmap.org/wiki/TMS\" target=\"_blank\">serveurs de cartes publics</a>";
@@ -2015,90 +2124,104 @@ App::$strings["Default zoom"] = "Zoom par défaut";
App::$strings["The default zoom level. (1:world, 18:highest, also depends on tile server)"] = "Le niveau de zoom par défaut. (1: monde, 18: plus élevé, dépend également du serveur de tuiles)";
App::$strings["Include marker on map"] = "Inclure le marqueur sur la carte";
App::$strings["Include a marker on the map."] = "Inclure un marqueur sur la carte.";
-App::$strings["Message to display on every page on this server"] = "Message à afficher sur chaque page de ce serveur";
-App::$strings["Pageheader Settings"] = "Paramètres du haut de page";
-App::$strings["pageheader Settings saved."] = "Paramètres du haut de page sauvegardés.";
-App::$strings["This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> analytics tool."] = "Ce site web est surveillé grâce à l'outil d'analyse <a href='http://www.piwik.org'>Piwik</a>.";
-App::$strings["If you do not want that your visits are logged this way you <a href='%s'>can set a cookie to prevent Piwik from tracking further visits of the site</a> (opt-out)."] = "Si vous ne souhaitez pas que vos visites soient enregistrées de cette façon, <a href='%s'>vous pouvez\ndéfinir un cookie pour empêcher Piwik de suivre davantage de visites du site</a> (opt-out).";
-App::$strings["Piwik Base URL"] = "URL de base Piwik";
-App::$strings["Absolute path to your Piwik installation. (without protocol (http/s), with trailing slash)"] = "Chemin absolu vers votre installation Piwik. (sans le http/s, avec antislash)";
-App::$strings["Site ID"] = "ID du site";
-App::$strings["Show opt-out cookie link?"] = "Afficher le lien opt-out du cookie ?";
-App::$strings["Asynchronous tracking"] = "Traqueur asynchrone";
-App::$strings["Enable frontend JavaScript error tracking"] = "Activer le traqueur d'erreur du frontend JavaScript";
-App::$strings["This feature requires Piwik >= 2.2.0"] = "Cette fonctionnalité requiert une version de Piwik >=2.2.0";
-App::$strings["Planets Settings updated."] = "Paramètres Planets mis à jour.";
-App::$strings["Enable Planets Plugin"] = "Activer le plugin Planets";
-App::$strings["Planets Settings"] = "Paramètres Planets";
-App::$strings["You are now authenticated to pumpio."] = "Vous êtes maintenant connecté à pumpio.";
-App::$strings["return to the featured settings page"] = "retourner à la page des paramètres des fonctionnalités";
-App::$strings["Post to Pump.io"] = "Publier sur Pump.io";
-App::$strings["Pump.io servername"] = "Nom du serveur Pump.io";
-App::$strings["Without \"http://\" or \"https://\""] = "Sans \"http://\" ou \"https://\"";
-App::$strings["Pump.io username"] = "Identifiant Pump.io";
-App::$strings["Without the servername"] = "Sans le nom de serveur";
-App::$strings["You are not authenticated to pumpio"] = "Vous n'êtes pas connecté à Pump.io";
-App::$strings["(Re-)Authenticate your pump.io connection"] = "Authentifiez-vous à nouveau auprès de Pump.io";
-App::$strings["Enable pump.io Post Plugin"] = "Activer le plugin de publication Pump.io";
-App::$strings["Post to pump.io by default"] = "Par défaut, publier sur Pump.io";
-App::$strings["Should posts be public"] = "Les publications doivent-elles être publiques ?";
-App::$strings["Mirror all public posts"] = "Créer une copie miroir de toutes les publications publiques";
-App::$strings["Pump.io Post Settings"] = "Paramètres de publication Pump.io";
-App::$strings["PumpIO Settings saved."] = "Paramètres Pump.io sauvegardés.";
-App::$strings["QR code"] = "QR code";
-App::$strings["QR Generator"] = "Générateur de QRcode";
-App::$strings["Enter some text"] = "Entrer du texte";
-App::$strings["Enable Rainbowtag"] = "Activer Rainbowtag";
-App::$strings["Rainbowtag Settings"] = "Paramètres Rainbowtag";
-App::$strings["Rainbowtag Settings saved."] = "Paramètres Rainbowtag sauvegardés.";
-App::$strings["You're welcome."] = "Bienvenue.";
-App::$strings["Ah shucks..."] = "Ah m…";
-App::$strings["Don't mention it."] = "De rien.";
-App::$strings["&lt;blush&gt;"] = "&lt;rougit&gt;";
-App::$strings["Redmatrix File Storage Import"] = "Importation du fichier de stockage Redmatrix";
-App::$strings["This will import all your Redmatrix cloud files to this channel."] = "Ceci importera tous vos fichiers Redmatrix dans ce canal.";
-App::$strings["Redmatrix Server base URL"] = "URL de base du serveur Redmatrix";
-App::$strings["Redmatrix Login Username"] = "Identifiant de connexion Redmatrix";
-App::$strings["Redmatrix Login Password"] = "Mot de passe de connexion Redmatrix";
-App::$strings["file"] = "fichier";
-App::$strings["Photos imported"] = "Photos importées";
-App::$strings["Redmatrix Photo Album Import"] = "Import de l'album photo Redmatrix";
-App::$strings["This will import all your Redmatrix photo albums to this channel."] = "Ceci va importer l'intégralité de vos albums photos Redmatrix dans ce canal.";
-App::$strings["Import just this album"] = "Importer uniquement cet album";
-App::$strings["Leave blank to import all albums"] = "Laisser vide pour importer tous les albums";
-App::$strings["Maximum count to import"] = "Nombre maximum de comptes à importer";
-App::$strings["0 or blank to import all available"] = "0 ou vide pour importer tout ce qui est disponible";
+App::$strings["Save Settings"] = "Sauvegarder les paramètres";
+App::$strings["text to include in all outgoing posts from this site"] = "Texte à inclure dans tous les messages sortants de ce site";
+App::$strings["Post to Friendica"] = "Publier sur Friendica";
+App::$strings["rtof Settings saved."] = "Paramètres rtof sauvegardés.";
+App::$strings["Allow posting to Friendica"] = "Autoriser la publication sur Friendica";
+App::$strings["Send public postings to Friendica by default"] = "Par défaut, envoyer les publications publiques sur Friendica";
+App::$strings["Friendica API Path"] = "Chemin de l'API Friendica";
+App::$strings["https://{sitename}/api"] = "https://{nomdusite}/api";
+App::$strings["Friendica login name"] = "Identifiant de connexion Friendica";
+App::$strings["Friendica password"] = "Mot de passe de connexion Friendica";
+App::$strings["Hubzilla to Friendica Post Settings"] = "Paramètres de publication de Hubzilla vers Friendica";
+App::$strings["Status:"] = "État&nbsp;:";
+App::$strings["Activate addon"] = "Activer l'extension";
+App::$strings["Hide Jappixmini Chat-Widget from the webinterface"] = "Cacher le widget de chat Jappixmini de l'interface web";
+App::$strings["Jabber username"] = "Identifiant Jabber";
+App::$strings["Jabber server"] = "Serveur Jabber";
+App::$strings["Jabber BOSH host URL"] = "Adresse hôte pour Jabber BOSH";
+App::$strings["Jabber password"] = "Mot de passe Jabber";
+App::$strings["Encrypt Jabber password with Hubzilla password"] = "Chiffrer le mot de passe Jabber avec le mot de passe Hubzilla";
+App::$strings["Hubzilla password"] = "Mot de passe Hubzilla";
+App::$strings["Approve subscription requests from Hubzilla contacts automatically"] = "Approuver automatiquement les demandes de connexion des contacts Hubzilla";
+App::$strings["Purge internal list of jabber addresses of contacts"] = "Purger la liste interne des adresses jabber des contacts";
+App::$strings["Configuration Help"] = "Aide pour la configuration";
+App::$strings["Jappix Mini Settings"] = "Paramètres de Jappix mini";
+App::$strings["Currently blocked"] = "Actuellement bloqué";
+App::$strings["No channels currently blocked"] = "Aucun canal n'est actuellement bloqué";
+App::$strings["\"Superblock\" Settings"] = "Paramètres \"Superblock\"";
+App::$strings["Block Completely"] = "Bloquer complètement";
+App::$strings["superblock settings updated"] = "Les paramètres du superblock ont été mis à jour";
+App::$strings["Federate"] = "Fédérer";
+App::$strings["nofed Settings saved."] = "Les paramètres nfed ont été enregistrés.";
+App::$strings["Allow Federation Toggle"] = "Autoriser la fédération avec Toggle";
+App::$strings["Federate posts by default"] = "Par défaut, fédérer les publications.";
+App::$strings["NoFed Settings"] = "Paramètres NoFed";
App::$strings["Post to Red"] = "Publier sur Red";
App::$strings["Channel is required."] = "Un canal est requis.";
-App::$strings["Invalid channel."] = "Canal invalide.";
App::$strings["redred Settings saved."] = "Paramètres redred sauvegardés.";
App::$strings["Allow posting to another Hubzilla Channel"] = "Autoriser la publication sur un autre canal Hubzilla";
App::$strings["Send public postings to Hubzilla channel by default"] = "Par défaut, envoyer les publications publiques sur le canal Hubzilla";
App::$strings["Hubzilla API Path"] = "Chemin de l'API Hubzilla";
-App::$strings["https://{sitename}/api"] = "https://{nomdusite}/api";
App::$strings["Hubzilla login name"] = "Identifiant de connexion Hubzilla";
App::$strings["Hubzilla channel name"] = "Nom du canal Hubzilla";
-App::$strings["Nickname"] = "Surnom";
App::$strings["Hubzilla Crosspost Settings"] = "Paramètres Crosspost Hubzilla";
-App::$strings["Post to Friendica"] = "Publier sur Friendica";
-App::$strings["rtof Settings saved."] = "Paramètres rtof sauvegardés.";
-App::$strings["Allow posting to Friendica"] = "Autoriser la publication sur Friendica";
-App::$strings["Send public postings to Friendica by default"] = "Par défaut, envoyer les publications publiques sur Friendica";
-App::$strings["Friendica API Path"] = "Chemin de l'API Friendica";
-App::$strings["Friendica login name"] = "Identifiant de connexion Friendica";
-App::$strings["Friendica password"] = "Mot de passe de connexion Friendica";
-App::$strings["Hubzilla to Friendica Post Settings"] = "Paramètres de publication de Hubzilla vers Friendica";
-App::$strings["Extended Identity Sharing"] = "Partage d'identification étendu";
-App::$strings["Share your identity with all websites on the internet. When disabled, identity is only shared with sites in the matrix."] = "Partagez votre identification avec tous les sites Web sur Internet. Lorsqu'elle est désactivée, l'identification n'est partagée qu'avec les sites de la matrice.";
-App::$strings["Some setting"] = "Un certain paramètre";
-App::$strings["A setting"] = "Un paramètre";
-App::$strings["Skeleton Settings"] = "Paramètres du squelette";
-App::$strings["Deactivate the feature"] = "Désactiver la fonctionnalité";
-App::$strings["Hide the button and show the smilies directly."] = "Cacher le bouton et afficher les émoticônes directement.";
-App::$strings["Smileybutton Settings"] = "Paramètres du bouton des émoticônes";
-App::$strings["Page to load after login"] = "Page à charger après l'identification";
-App::$strings["Examples: &quot;apps&quot;, &quot;network?f=&gid=37&quot; (privacy collection), &quot;channel&quot; or &quot;notifications/system&quot; (leave blank for default network page (grid)."] = "Exemples: &quot;apps&quot;, &quot;network?f=&gid=37&quot; (privacy collection), &quot;channel&quot; or &quot;notifications/system&quot; (laisser vide pour la page par défaut du réseau (grille).";
-App::$strings["Startpage Settings"] = "Paramètres de la page de démarrage";
+App::$strings["Logfile archive directory"] = "Répertoire d'archivage du fichier journal";
+App::$strings["Directory to store rotated logs"] = "Répertoire où stocker les journaux de rotation";
+App::$strings["Logfile size in bytes before rotating"] = "Taille du fichier journal en octets avant la rotation";
+App::$strings["Number of logfiles to retain"] = "Nombre de fichiers de journal à conserver";
+App::$strings["Friendica Photo Album Import"] = "Importation de l'album photo Friendica ";
+App::$strings["This will import all your Friendica photo albums to this Red channel."] = "Ceci importera toutes vos albums photos Friendica dans ce canal Hubzilla.";
+App::$strings["Friendica Server base URL"] = "URL de base du serveur Friendica";
+App::$strings["Friendica Login Username"] = "Identifiant de connexion Friendica";
+App::$strings["Friendica Login Password"] = "Mot de passe de connexion Friendica";
+App::$strings["Project Servers and Resources"] = "Serveurs et ressources du projet";
+App::$strings["Project Creator and Tech Lead"] = "Créateur et Responsable Technique du projet";
+App::$strings["Admin, developer, directorymin, support bloke"] = "Administrateur, développeur, responsable d'annuaire, équipe support";
+App::$strings["And the hundreds of other people and organisations who helped make the Hubzilla possible."] = "Et les centaines d'autres personnes et organisations qui ont contribué à rendre le Hubzilla possible.";
+App::$strings["The Redmatrix/Hubzilla projects are provided primarily by volunteers giving their time and expertise - and often paying out of pocket for services they share with others."] = "Les projets Redmatrix / Hubzilla sont fournis principalement par des bénévoles qui donnent de leur temps et de leur expertise - et paient souvent de leur poche pour des services qu'ils partagent avec d'autres.";
+App::$strings["There is no corporate funding and no ads, and we do not collect and sell your personal information. (We don't control your personal information - <strong>you do</strong>.)"] = "Il n'y a ni financement d'entreprise ni publicités, et nous ne recueillons ni ne vendons vos données personnelles. (Nous ne contrôlons pas vos informations personnelles - vous le faites !)";
+App::$strings["Help support our ground-breaking work in decentralisation, web identity, and privacy."] = "Aider à soutenir notre travail novateur en matière de décentralisation, d'identité Web et de confidentialité.";
+App::$strings["Your donations keep servers and services running and also helps us to provide innovative new features and continued development."] = "Vos dons maintiennent les serveurs et les services en marche et nous aident également à fournir de nouvelles fonctionnalités innovantes et un développement continu.";
+App::$strings["Donate"] = "Donner";
+App::$strings["Choose a project, developer, or public hub to support with a one-time donation"] = "Choisissez un projet, un développeur ou un hub public à soutenir à l'aide d'un don unique";
+App::$strings["Donate Now"] = "Donner maintenant";
+App::$strings["<strong><em>Or</em></strong> become a project sponsor (Hubzilla Project only)"] = "Or devenez un sponsor du projet (projet Hubzilla uniquement)";
+App::$strings["Please indicate if you would like your first name or full name (or nothing) to appear in our sponsor listing"] = "Veuillez indiquer si vous souhaitez que votre nom ou prénom (ou rien) apparaisse dans la liste de nos sponsors.";
+App::$strings["Sponsor"] = "Sponsors";
+App::$strings["Special thanks to: "] = "Remerciements particuliers à :";
+App::$strings["This is a fairly comprehensive and complete guitar chord dictionary which will list most of the available ways to play a certain chord, starting from the base of the fingerboard up to a few frets beyond the twelfth fret (beyond which everything repeats). A couple of non-standard tunings are provided for the benefit of slide players, etc."] = "Ceci est un dictionnaire d'accords de guitare assez complet et facile qui énumère la plupart des manières possibles de jouer un certain accord, à partir de la base de la touche jusqu'à quelques frettes au-delà de la douzième frette (au-delà de laquelle tout se répète). Un couple d'accordages non standard sont fournis au profit des joueurs de diapositives, etc.";
+App::$strings["Chord names start with a root note (A-G) and may include sharps (#) and flats (b). This software will parse most of the standard naming conventions such as maj, min, dim, sus(2 or 4), aug, with optional repeating elements."] = "Les noms des accords commencent par une note racine (A-G) et peuvent inclure des dièses (#) et des bémols (b). Ce logiciel analysera la plupart des conventions de dénomination standard telles que maj, min, dim, sus (2 ou 4), aug, avec des éléments répétitifs facultatifs.";
+App::$strings["Valid examples include A, A7, Am7, Amaj7, Amaj9, Ammaj7, Aadd4, Asus2Add4, E7b13b11 ..."] = "Exemples valides comprennent A, A7, Am7, Amaj7, Amaj9, Ammaj7, Aadd4, Asus2Add4, E7b13b11 ...";
+App::$strings["Guitar Chords"] = "Acords de guitar";
+App::$strings["The complete online chord dictionary"] = "Le dictionnaire en ligne complet des accords";
+App::$strings["Tuning"] = "Réglage";
+App::$strings["Chord name: example: Em7"] = "Nom d'accord. Exemple : Em7.";
+App::$strings["Show for left handed stringing"] = "Montrer pour les gauchers";
+App::$strings["Quick Reference"] = "Référence rapide";
+App::$strings["Post to Libertree"] = "Publier sur Libertree";
+App::$strings["Enable Libertree Post Plugin"] = "Activer le plugin de publication Libertree";
+App::$strings["Libertree API token"] = "Jeton de l'API Libertree";
+App::$strings["Libertree site URL"] = "Adresse du site Libertree";
+App::$strings["Post to Libertree by default"] = "Par défaut, publier sur Libertree";
+App::$strings["Libertree Post Settings"] = "Paramètres de publication pour Libertree";
+App::$strings["Libertree Settings saved."] = "Paramètres de Libertree sauvegardés.";
+App::$strings["Flattr this!"] = "Flattr this!";
+App::$strings["Flattr widget settings updated."] = "Les paramètres du widget Flattr ont été mis à jour";
+App::$strings["Flattr user"] = "Utilisateur de Flattr";
+App::$strings["URL of the Thing to flattr"] = "URL de ce que vous voulez flattr";
+App::$strings["If empty channel URL is used"] = "Si une url vide est utilisée";
+App::$strings["Title of the Thing to flattr"] = "Titre de ce que vous voulez flattr";
+App::$strings["If empty \"channel name on The Hubzilla\" will be used"] = "Si vide, \"nom du canal sur Hubzilla\" sera utilisé";
+App::$strings["Static or dynamic flattr button"] = "Statique ou dynamique bouton Flattr";
+App::$strings["static"] = "statique";
+App::$strings["dynamic"] = "dynamique";
+App::$strings["Alignment of the widget"] = "Alignement du widget";
+App::$strings["left"] = "gauche";
+App::$strings["right"] = "droite";
+App::$strings["Enable Flattr widget"] = "Activer le widget Flattr";
+App::$strings["Flattr Widget Settings"] = "Paramètres du widget Flattr";
App::$strings["Post to GNU social"] = "Publier sur GNU-social";
App::$strings["Please contact your site administrator.<br />The provided API URL is not valid."] = "Veuillez contacter l'administrateur de votre site. L'URL de l'API n'est pas valide.";
App::$strings["We could not contact the GNU social API with the Path you entered."] = "Nous ne pouvons pas contacter l'API de GNU-social avec le chemin que vous avez entré.";
@@ -2128,25 +2251,43 @@ App::$strings["Clear OAuth configuration"] = "Effacer la configuration OAuth";
App::$strings["GNU social Post Settings"] = "Paramètres de publication GNU-social";
App::$strings["API URL"] = "URL de l'API";
App::$strings["Application name"] = "Nom de l'application";
-App::$strings["Currently blocked"] = "Actuellement bloqué";
-App::$strings["No channels currently blocked"] = "Aucun canal n'est actuellement bloqué";
-App::$strings["\"Superblock\" Settings"] = "Paramètres \"Superblock\"";
-App::$strings["Block Completely"] = "Bloquer complètement";
-App::$strings["superblock settings updated"] = "Les paramètres du superblock ont été mis à jour";
-App::$strings["Your account on %s will expire in a few days."] = "Votre compte sur %s expirera dans quelques jours.";
-App::$strings["Your $Productname test account is about to expire."] = "Votre compte de test $NomDeProduit est sur le point d'expirer.";
-App::$strings["Three Dimensional Tic-Tac-Toe"] = "Tic-tac-toe en 3 dimensions";
-App::$strings["3D Tic-Tac-Toe"] = "3D Tic-Tac-Toe";
-App::$strings["New game"] = "Nouveau jeu";
-App::$strings["New game with handicap"] = "Nouveau jeu avec handicap";
-App::$strings["Three dimensional tic-tac-toe is just like the traditional game except that it is played on multiple levels simultaneously. "] = "Trois dimensions tic-tac-toe est juste comme le jeu traditionnel, sauf qu'il est joué sur plusieurs niveaux simultanément.";
-App::$strings["In this case there are three levels. You win by getting three in a row on any level, as well as up, down, and diagonally across the different levels."] = "Dans ce cas, il y a trois niveaux. Vous gagnez en obtenant trois dans une rangée à n'importe quel niveau, que ce soit vers le haut, le bas, ou en diagonale à travers les différents niveaux.";
-App::$strings["The handicap game disables the center position on the middle level because the player claiming this square often has an unfair advantage."] = "Le jeu handicap désactive la position centrale au niveau intermédiaire, car le joueur qui revendique ce carré a souvent un avantage indu.";
-App::$strings["You go first..."] = "Vous commencez…";
-App::$strings["I'm going first this time..."] = "Cette fois, je commence…";
-App::$strings["You won!"] = "Vous avez gagné !";
-App::$strings["\"Cat\" game!"] = "Jeu de \"Chat\" !";
-App::$strings["I won!"] = "J'ai gagné !";
+App::$strings["QR code"] = "QR code";
+App::$strings["QR Generator"] = "Générateur de QRcode";
+App::$strings["Enter some text"] = "Entrer du texte";
+App::$strings["Invalid game."] = "Jeu invalide";
+App::$strings["You are not a player in this game."] = "Vous n'êtes pas un joueur de ce jeu.";
+App::$strings["You must be a local channel to create a game."] = "Vous devez être un canal local pour créer un jeu.";
+App::$strings["You must select one opponent that is not yourself."] = "Vous devez sélectionner un adversaire qui ne soit pas vous-même.";
+App::$strings["Creating new game..."] = "en train de créer un nouveau jeu…";
+App::$strings["You must select white or black."] = "Vous devez sélectionner les blancs ou les noirs.";
+App::$strings["Error creating new game."] = "Erreur lors de la création du nouveau jeu.";
+App::$strings["Requested channel is not available."] = "Canal demandé non disponible.";
+App::$strings["You must select a local channel /chess/channelname"] = "Vous devez sélectionner un canal local /échecs/nomducanal";
+App::$strings["Enable notifications"] = "Activer les notifications";
+App::$strings["Post to Twitter"] = "Publier sur Twitter";
+App::$strings["Twitter settings updated."] = "Les paramètres de Twitter ont été mis à jour.";
+App::$strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "Aucune paire de clés d'utilisateur pour Twitter n'a été trouvée. Veuillez contacter l'administrateur de votre site.";
+App::$strings["At this Hubzilla instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "Dans cette instance de Hubzilla, le plugin Twitter a été activé, mais vous n'avez pas encore connecté votre compte à votre compte Twitter. Pour ce faire, cliquez sur le bouton ci-dessous pour obtenir un code PIN de Twitter que vous devez copier dans la zone de saisie ci-dessous, puis soumettre le formulaire. Seuls vos messages publics seront publiés sur Twitter.";
+App::$strings["Log in with Twitter"] = "Connectez-vous avec votre compte Twitter";
+App::$strings["Copy the PIN from Twitter here"] = "Copier ici le PIN fourni par Twitter";
+App::$strings["<strong>Note:</strong> Due your privacy settings (<em>Hide your profile details from unknown viewers?</em>) the link potentially included in public postings relayed to Twitter will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted."] = "Note : En raison de vos paramètres de confidentialité (Masquer les détails de votre profil aux visiteurs inconnus?), le lien potentiellement inclus dans les annonces publiques relayées vers Twitter amènera le visiteur à une page vierge l'informant que l'accès à votre profil a été restreint.";
+App::$strings["Allow posting to Twitter"] = "Autoriser la publication sur Twitter";
+App::$strings["If enabled your public postings can be posted to the associated Twitter account"] = "Si cette option est activée, vos publications publiques peuvent être publiées sur le compte Twitter associé.";
+App::$strings["Send public postings to Twitter by default"] = "Par défaut, envoyer vos publications publiques sur Twitter.";
+App::$strings["If enabled your public postings will be posted to the associated Twitter account by default"] = "Si cette option est activée, par défaut, vos publications publiques seront publiées sur le compte Twitter associé.";
+App::$strings["Twitter Post Settings"] = "Paramètres des publications Twitter";
+App::$strings["Deactivate the feature"] = "Désactiver la fonctionnalité";
+App::$strings["Hide the button and show the smilies directly."] = "Cacher le bouton et afficher les émoticônes directement.";
+App::$strings["Smileybutton Settings"] = "Paramètres du bouton des émoticônes";
+App::$strings["This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> analytics tool."] = "Ce site web est surveillé grâce à l'outil d'analyse <a href='http://www.piwik.org'>Piwik</a>.";
+App::$strings["If you do not want that your visits are logged this way you <a href='%s'>can set a cookie to prevent Piwik from tracking further visits of the site</a> (opt-out)."] = "Si vous ne souhaitez pas que vos visites soient enregistrées de cette façon, <a href='%s'>vous pouvez\ndéfinir un cookie pour empêcher Piwik de suivre davantage de visites du site</a> (opt-out).";
+App::$strings["Piwik Base URL"] = "URL de base Piwik";
+App::$strings["Absolute path to your Piwik installation. (without protocol (http/s), with trailing slash)"] = "Chemin absolu vers votre installation Piwik. (sans le http/s, avec antislash)";
+App::$strings["Site ID"] = "ID du site";
+App::$strings["Show opt-out cookie link?"] = "Afficher le lien opt-out du cookie ?";
+App::$strings["Asynchronous tracking"] = "Traqueur asynchrone";
+App::$strings["Enable frontend JavaScript error tracking"] = "Activer le traqueur d'erreur du frontend JavaScript";
+App::$strings["This feature requires Piwik >= 2.2.0"] = "Cette fonctionnalité requiert une version de Piwik >=2.2.0";
App::$strings["Edit your profile and change settings."] = "Éditer votre profil et changer les paramètres.";
App::$strings["Click here to see activity from your connections."] = "Cliquer ici pour voir l'activité de vos connections.";
App::$strings["Click here to see your channel home."] = "Cliquer ici pour voir votre canal principal.";
@@ -2172,7 +2313,7 @@ App::$strings["You can password protect content."] = "Vous pouvez protéger un c
App::$strings["Choose who you share with."] = "Choisir avec qui vous partagez.";
App::$strings["Click here when you are done."] = "Cliquer ici quand vous avez fini.";
App::$strings["Adjust from which channels posts should be displayed."] = "Préciser de quels canaux les publications seront affichées.";
-App::$strings["Only show posts from channels in the specified privacy group."] = "Afficher uniquement les messages des canaux du groupe de confidentialité spécifié.";
+App::$strings["Only show posts from channels in the specified privacy group."] = "Afficher uniquement les messages des canaux appartenant au groupe de contacts spécifié.";
App::$strings["Easily find posts containing tags (keywords preceded by the \"#\" symbol)."] = "Trouvez facilement des publications contenant des tags (mots-clés précédés du symbole \"#\").";
App::$strings["Easily find posts in given category."] = "Trouvez facilement des publications dans une catégorie donnée.";
App::$strings["Easily find posts by date."] = "Trouvez facilement des publications en fonction de leur date.";
@@ -2182,43 +2323,45 @@ App::$strings["Save your search so you can repeat it at a later date."] = "Enreg
App::$strings["If you see this icon you can be sure that the sender is who it say it is. It is normal that it is not always possible to verify the sender, so the icon will be missing sometimes. There is usually no need to worry about that."] = "Si vous voyez cette icône, vous pouvez être sûr que l'expéditeur est qui il dit qu'il est. Il est normal qu'il ne soit pas toujours possible de vérifier l'expéditeur, donc l'icône manquera parfois. Il n'est généralement pas nécessaire de s'inquiéter à ce sujet.";
App::$strings["Danger! It seems someone tried to forge a message! This message is not necessarily from who it says it is from!"] = "Attention ! Il semble que quelqu'un a essayé de contrefaire un message ! Ce message n'a pas nécessairement été envoyé par la personne annoncée !";
App::$strings["Welcome to Hubzilla! Would you like to see a tour of the UI?</p> <p>You can pause it at any time and continue where you left off by reloading the page, or navigting to another page.</p><p>You can also advance by pressing the return key"] = "Bienvenue sur Hubzilla! Voulez-vous faire un tour de l'interface utilisateur? Vous pouvez le mettre en pause à tout moment et continuer où vous l'avez laissé en rechargeant la page ou en naviguant vers une autre page. Vous pouvez également avancer en appuyant sur la touche de retour.";
-App::$strings["Post to Twitter"] = "Publier sur Twitter";
-App::$strings["Twitter settings updated."] = "Les paramètres de Twitter ont été mis à jour.";
-App::$strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "Aucune paire de clés d'utilisateur pour Twitter n'a été trouvée. Veuillez contacter l'administrateur de votre site.";
-App::$strings["At this Hubzilla instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "Dans cette instance de Hubzilla, le plugin Twitter a été activé, mais vous n'avez pas encore connecté votre compte à votre compte Twitter. Pour ce faire, cliquez sur le bouton ci-dessous pour obtenir un code PIN de Twitter que vous devez copier dans la zone de saisie ci-dessous, puis soumettre le formulaire. Seuls vos messages publics seront publiés sur Twitter.";
-App::$strings["Log in with Twitter"] = "Connectez-vous avec votre compte Twitter";
-App::$strings["Copy the PIN from Twitter here"] = "Copier ici le PIN fourni par Twitter";
-App::$strings["<strong>Note:</strong> Due your privacy settings (<em>Hide your profile details from unknown viewers?</em>) the link potentially included in public postings relayed to Twitter will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted."] = "Note : En raison de vos paramètres de confidentialité (Masquer les détails de votre profil aux visiteurs inconnus?), le lien potentiellement inclus dans les annonces publiques relayées vers Twitter amènera le visiteur à une page vierge l'informant que l'accès à votre profil a été restreint.";
-App::$strings["Allow posting to Twitter"] = "Autoriser la publication sur Twitter";
-App::$strings["If enabled your public postings can be posted to the associated Twitter account"] = "Si cette option est activée, vos publications publiques peuvent être publiées sur le compte Twitter associé.";
-App::$strings["Send public postings to Twitter by default"] = "Par défaut, envoyer vos publications publiques sur Twitter.";
-App::$strings["If enabled your public postings will be posted to the associated Twitter account by default"] = "Si cette option est activée, par défaut, vos publications publiques seront publiées sur le compte Twitter associé.";
-App::$strings["Twitter Post Settings"] = "Paramètres des publications Twitter";
-App::$strings["Submit Settings"] = "Emvoyer les paramètres";
-App::$strings["Show Upload Limits"] = "Afficher les limites de débit ascendant (upload)";
-App::$strings["Hubzilla configured maximum size: "] = "Taille maximale configurée par Hubzilla:";
-App::$strings["PHP upload_max_filesize: "] = "PHP upload_max_filesize: ";
-App::$strings["PHP post_max_size (must be larger than upload_max_filesize): "] = "PHP post_max_size (must be larger than upload_max_filesize): ";
-App::$strings["Recent Channel/Profile Viewers"] = "Visiteurs récents du canal/profil";
-App::$strings["This plugin/addon has not been configured."] = "Cette extension n'a pas été configurée.";
-App::$strings["Please visit the Visage settings on %s"] = "Veuillez visiter les paramètres de Visage sur %s";
-App::$strings["your feature settings page"] = "La page des paramètres de vos fonctionnalités";
-App::$strings["No entries."] = "Aucune entrée.";
-App::$strings["Enable Visage Visitor Logging"] = "Activer la connexion Visage Visitor";
-App::$strings["Visage Settings"] = "Paramètres Visage";
-App::$strings["Who likes me?"] = "Qui m'aime?";
-App::$strings["Post to WordPress"] = "Publier sur Wordpress";
-App::$strings["Enable WordPress Post Plugin"] = "Activer l'extension de publication WordPress";
-App::$strings["WordPress username"] = "Identifiant de connexion WordPress";
-App::$strings["WordPress password"] = "Mot de passe de connexion WordPress";
-App::$strings["WordPress API URL"] = "URL de l'API WordPress";
-App::$strings["Typically https://your-blog.tld/xmlrpc.php"] = "Typiquement https://your-blog.tld/xmlrpc.php";
-App::$strings["WordPress blogid"] = "ID de votre blog WordPress";
-App::$strings["For multi-user sites such as wordpress.com, otherwise leave blank"] = "Pour les sites multi-utilisateurs comme wordpress.com, sinon laisser vide";
-App::$strings["Post to WordPress by default"] = "Par défaut, publier sur WordPress";
-App::$strings["Forward comments (requires hubzilla_wp plugin)"] = "Transférer les commentaires (nécessite le plugin hubzila_wp)";
-App::$strings["WordPress Post Settings"] = "Paramètres de publications WordPress";
-App::$strings["Wordpress Settings saved."] = "Les paramètres WordPress ont été sauvegardés.";
+App::$strings["Extended Identity Sharing"] = "Partage d'identification étendu";
+App::$strings["Share your identity with all websites on the internet. When disabled, identity is only shared with sites in the matrix."] = "Partagez votre identification avec tous les sites Web sur Internet. Lorsqu'elle est désactivée, l'identification n'est partagée qu'avec les sites de la matrice.";
+App::$strings["Three Dimensional Tic-Tac-Toe"] = "Tic-tac-toe en 3 dimensions";
+App::$strings["3D Tic-Tac-Toe"] = "3D Tic-Tac-Toe";
+App::$strings["New game"] = "Nouveau jeu";
+App::$strings["New game with handicap"] = "Nouveau jeu avec handicap";
+App::$strings["Three dimensional tic-tac-toe is just like the traditional game except that it is played on multiple levels simultaneously. "] = "Trois dimensions tic-tac-toe est juste comme le jeu traditionnel, sauf qu'il est joué sur plusieurs niveaux simultanément.";
+App::$strings["In this case there are three levels. You win by getting three in a row on any level, as well as up, down, and diagonally across the different levels."] = "Dans ce cas, il y a trois niveaux. Vous gagnez en obtenant trois dans une rangée à n'importe quel niveau, que ce soit vers le haut, le bas, ou en diagonale à travers les différents niveaux.";
+App::$strings["The handicap game disables the center position on the middle level because the player claiming this square often has an unfair advantage."] = "Le jeu handicap désactive la position centrale au niveau intermédiaire, car le joueur qui revendique ce carré a souvent un avantage indu.";
+App::$strings["You go first..."] = "Vous commencez…";
+App::$strings["I'm going first this time..."] = "Cette fois, je commence…";
+App::$strings["You won!"] = "Vous avez gagné !";
+App::$strings["\"Cat\" game!"] = "Jeu de \"Chat\" !";
+App::$strings["I won!"] = "J'ai gagné !";
+App::$strings["Message to display on every page on this server"] = "Message à afficher sur chaque page de ce serveur";
+App::$strings["Pageheader Settings"] = "Paramètres du haut de page";
+App::$strings["pageheader Settings saved."] = "Paramètres du haut de page sauvegardés.";
+App::$strings["lonely"] = "isolé";
+App::$strings["drunk"] = "saoul";
+App::$strings["horny"] = "libidineux";
+App::$strings["stoned"] = "défoncé";
+App::$strings["fucked up"] = "cramé";
+App::$strings["clusterfucked"] = "énervé";
+App::$strings["crazy"] = "cinglé";
+App::$strings["hurt"] = "dommage";
+App::$strings["sleepy"] = "somnolent";
+App::$strings["grumpy"] = "grognon";
+App::$strings["high"] = "allumé";
+App::$strings["semi-conscious"] = "à demi-conscient";
+App::$strings["in love"] = "amoureux";
+App::$strings["in lust"] = "convoitise";
+App::$strings["naked"] = "nu";
+App::$strings["stinky"] = "puant";
+App::$strings["sweaty"] = "en sueur";
+App::$strings["bleeding out"] = "en sang";
+App::$strings["victorious"] = "victorieux";
+App::$strings["defeated"] = "vaincu";
+App::$strings["envious"] = "envieux";
+App::$strings["jealous"] = "jaloux";
App::$strings["XMPP settings updated."] = "Les paramètres XMPP ont été mis à jour.";
App::$strings["Enable Chat"] = "Activer le Chat";
App::$strings["Individual credentials"] = "Informations d'identifications individuelles";
@@ -2227,211 +2370,34 @@ App::$strings["XMPP Settings"] = "Paramètres XMPP";
App::$strings["Jabber BOSH host"] = "Hôte Jabber BOSH";
App::$strings["Use central userbase"] = "Utiliser la base d'utilisateurs centrale";
App::$strings["If enabled, members will automatically login to an ejabberd server that has to be installed on this machine with synchronized credentials via the \"auth_ejabberd.php\" script."] = "Si cette option est activée, les membres se connecteront automatiquement à un serveur ejabberd qui doit être installé sur cette machine avec des informations d'identification synchronisées via le script \"auth_ejabberd.php\".";
-App::$strings["Select Channel"] = "Sélectionner un canal";
-App::$strings["Read-write"] = "Lire et écrire";
-App::$strings["Read-only"] = "Lire uniquement";
-App::$strings["My Calendars"] = "Mes agendas";
-App::$strings["Shared Calendars"] = "Agendas partagés";
-App::$strings["Share this calendar"] = "Partager cet agenda";
-App::$strings["Calendar name and color"] = "Nom et couleur de l'agenda";
-App::$strings["Create new calendar"] = "Créer un nouvel agenda";
-App::$strings["Calendar Name"] = "Nom de l'agenda";
-App::$strings["Calendar Tools"] = "Outils pour les agendas";
-App::$strings["Import calendar"] = "Importer un agenda";
-App::$strings["Select a calendar to import to"] = "Sélectionner un agenda à importer dans";
-App::$strings["Addressbooks"] = "Carnet d'adresses";
-App::$strings["Addressbook name"] = "Nom du carnet d'adresses";
-App::$strings["Create new addressbook"] = "Créer un nouveau carnet d'adresses";
-App::$strings["Addressbook Name"] = "Nom du carnet d'adresses";
-App::$strings["Addressbook Tools"] = "Outils pour les carnets d'adresses";
-App::$strings["Import addressbook"] = "Importer un carnet d'adresses";
-App::$strings["Select an addressbook to import to"] = "Sélectionner un carnet d'adresses à importer dans";
-App::$strings["INVALID EVENT DISMISSED!"] = "ÉVÉNEMENT INVALIDE REJETÉ!";
-App::$strings["Summary: "] = "Sommaire :";
-App::$strings["Date: "] = "Date :";
-App::$strings["Reason: "] = "Raison :";
-App::$strings["INVALID CARD DISMISSED!"] = "ÉVÉNEMENT INVALIDE REJETÉ!";
-App::$strings["Name: "] = "Nom :";
-App::$strings["You have to enable this plugin in Feature/Addon Settings > CalDAV/CardDAV Settings before you can use it."] = "Vous avez activé ce plugin dans Fonctionalités/Paramètres des extensions > CalDAV/CardDAV Paramètres avant que vous puissiez l'utiliser.";
-App::$strings["Example: YYYY-MM-DD HH:mm"] = "Exemple : YYYY-MM-DD HH:mm";
-App::$strings["End date and time"] = "Date et heure de fin";
-App::$strings["List month"] = "Liste mois";
-App::$strings["List week"] = "Liste semaine";
-App::$strings["List day"] = "Liste jour";
-App::$strings["More"] = "Plus";
-App::$strings["Less"] = "Moins";
-App::$strings["Select calendar"] = "Sélectionner un calendrier";
-App::$strings["Delete all"] = "Tout supprimer";
-App::$strings["Sorry! Editing of recurrent events is not yet implemented."] = "Désolé ! L'édition d'événements récurrents n'est pas encore implémenté.";
-App::$strings["Errors encountered creating database table: "] = "Des erreurs se sont produites lors de la création de la table de la base de données :";
-App::$strings["Default Calendar"] = "Agenda par défaut";
-App::$strings["Default Addressbook"] = "Carnet d'adresses par défaut";
-App::$strings["CalDAV/CardDAV Settings saved."] = "Les paramètres CalDAV/CardDAV ont été sauvegardés.";
-App::$strings["Enable CalDAV/CardDAV Server for this channel"] = "Activer le serveur CalDAV/CardDAV pour ce canal";
-App::$strings["Your CalDAV resources are located at %s "] = "Vos ressources CalDAV sont situées à %s";
-App::$strings["Your CardDAV resources are located at %s "] = "Vos ressources CardDAV sont situées à %s";
-App::$strings["CalDAV/CardDAV Settings"] = "Paramètres CalDAV/CardDAV";
-App::$strings["Home, Voice"] = "Domicile, Voix";
-App::$strings["Home, Fax"] = "Domicile, Fax";
-App::$strings["Work, Voice"] = "Travail, Voix";
-App::$strings["Work, Fax"] = "Travail, Fax";
-App::$strings["Invalid game."] = "Jeu invalide";
-App::$strings["You are not a player in this game."] = "Vous n'êtes pas un joueur de ce jeu.";
-App::$strings["You must be a local channel to create a game."] = "Vous devez être un canal local pour créer un jeu.";
-App::$strings["You must select one opponent that is not yourself."] = "Vous devez sélectionner un adversaire qui ne soit pas vous-même.";
-App::$strings["Creating new game..."] = "en train de créer un nouveau jeu…";
-App::$strings["You must select white or black."] = "Vous devez sélectionner les blancs ou les noirs.";
-App::$strings["Error creating new game."] = "Erreur lors de la création du nouveau jeu.";
-App::$strings["Requested channel is not available."] = "Canal demandé non disponible.";
-App::$strings["You must select a local channel /chess/channelname"] = "Vous devez sélectionner un canal local /échecs/nomducanal";
-App::$strings["Enable notifications"] = "Activer les notifications";
-App::$strings["Your Webbie:"] = "Vous êtes Webbie :";
-App::$strings["Fontsize (px):"] = "Taille de la police (px) :";
-App::$strings["Link:"] = "Lien :";
-App::$strings["Like us on Hubzilla"] = "Aimez-nous sur Hubzilla";
-App::$strings["Embed:"] = "Embarqué :";
-App::$strings["Male"] = "Homme";
-App::$strings["Female"] = "Femme";
-App::$strings["First Name"] = "Prénom";
-App::$strings["Last Name"] = "Nom";
-App::$strings["Full Name"] = "Nom complet";
-App::$strings["Profile Photo 16px"] = "Photo de profil 16px";
-App::$strings["Profile Photo 32px"] = "Photo de profil 32px";
-App::$strings["Profile Photo 48px"] = "Photo de profil 48px";
-App::$strings["Profile Photo 64px"] = "Photo de profil 64px";
-App::$strings["Profile Photo 80px"] = "Photo de profil 80px";
-App::$strings["Profile Photo 128px"] = "Photo de profil 128px";
-App::$strings["Timezone"] = "Fuseau horaire";
-App::$strings["Birth Year"] = "Années de naissance";
-App::$strings["Birth Month"] = "Mois de naissance";
-App::$strings["Birth Day"] = "Jour de naissance";
-App::$strings["Birthdate"] = "Date de naissance";
-App::$strings["We encountered a problem while logging in with the OpenID you provided. Please check the correct spelling of the ID."] = "Nous avons rencontrons un problème lors de l'identification avec l'OpenID que vous avez fournie. Veuillez vérifier que vous avez correctement écrit votre ID.";
-App::$strings["The error message was:"] = "Le message d'erreur était :";
-App::$strings["OpenID protocol error. No ID returned."] = "Erreur du protocole OpenID. Aucune ID trouvée.";
-App::$strings["Login failed."] = "Échec de la connexion.";
-App::$strings["Reconnecting %d connections"] = "Reconnection des relations de %d";
-App::$strings["Diaspora Reconnect"] = "Reconnexion de Diaspora";
-App::$strings["Use this form to re-establish Diaspora connections which were initially made from a different hub."] = "Utiliser ce formulaire pour établir à nouveau les connexions avec Diaspora qui avait été initialement créées sur un hub différent.";
-App::$strings["Reconnect"] = "Reconnecter";
-App::$strings["Send test email"] = "Envoyer un mail de test";
-App::$strings["Mail sent."] = "Mail envoyé.";
-App::$strings["Sending of mail failed."] = "L'envoi du mail a échoué.";
-App::$strings["Mail Test"] = "Test du mail";
-App::$strings["Errors encountered deleting database table "] = "Des erreurs ont eu lieu lors de la suppression de la table de la base de données.";
-App::$strings["Drop tables when uninstalling?"] = "Lors de la désinstallation, purger les tables?";
-App::$strings["If checked, the Rendezvous database tables will be deleted when the plugin is uninstalled."] = "Si cette case est cochée, les tables de la base Rendezvous seront supprimées lorsque le plugin sera désinstallé.";
-App::$strings["Mapbox Access Token"] = "Jeton d'accès à la mapbox.";
-App::$strings["If you enter a Mapbox access token, it will be used to retrieve map tiles from Mapbox instead of the default OpenStreetMap tile server."] = "Si vous entrez un jeton d'accès Mapbox, il doit être utilisé pour récupérer les cartes à partir de Mapbox au lieu du serveur par défaut OpenStreetMap.";
-App::$strings["Rendezvous"] = "Rendezvous";
-App::$strings["This identity has been deleted by another member due to inactivity. Please press the \"New identity\" button or refresh the page to register a new identity. You may use the same name."] = "Cette identité a été supprimée par un autre membre en raison de l'inactivité. Appuyez sur le bouton \"Nouvelle identité\" ou actualisez la page pour enregistrer une nouvelle identité. Vous pouvez utiliser le même nom.";
-App::$strings["Welcome to Rendezvous!"] = "Bienvenue dans Rendevzvous!";
-App::$strings["Enter your name to join this rendezvous. To begin sharing your location with the other members, tap the GPS control. When your location is discovered, a red dot will appear and others will be able to see you on the map."] = "Entrez votre nom pour rejoindre ce rendez-vous. Pour commencer à partager votre emplacement avec les autres membres, appuyez sur le contrôle GPS. Lorsque votre emplacement est découvert, un point rouge apparaîtra et les autres seront en mesure de vous voir sur la carte.";
-App::$strings["Let's meet here"] = "Rencontrez-vous ici";
-App::$strings["New marker"] = "Nouveau marqueur";
-App::$strings["Edit marker"] = "Éditer le marqueur";
-App::$strings["New identity"] = "Nouvelle identité";
-App::$strings["Delete marker"] = "Supprimer le marqueur";
-App::$strings["Delete member"] = "Supprimer le membre";
-App::$strings["Edit proximity alert"] = "Éditer l'alerte de proximité";
-App::$strings["A proximity alert will be issued when this member is within a certain radius of you.<br><br>Enter a radius in meters (0 to disable):"] = "Une alerte de proximité sera émise lorsque ce membre se trouve dans un certain périmètre autour de vous. Entrer un rayon en mètres (0 pour désactiver):";
-App::$strings["distance"] = "distance";
-App::$strings["Proximity alert distance (meters)"] = "Distance d'alerte de proximité (mètres)";
-App::$strings["A proximity alert will be issued when you are within a certain radius of the marker location.<br><br>Enter a radius in meters (0 to disable):"] = "Une alerte de proximité sera déclenchée quand vous serez à une certaine distance du marqueur d'emplacement.<br><br>Indiquez une distance en mètres (0 pour désactiver)&nbsp;:";
-App::$strings["Marker proximity alert"] = "Alerte de proximité de marqueur";
-App::$strings["Reminder note"] = "Note de rappel";
-App::$strings["Enter a note to be displayed when you are within the specified proximity..."] = "Saisissez une note à afficher quand vous serez à la distance indiquée...";
-App::$strings["Add new rendezvous"] = "Ajouter un nouveau rendezvous";
-App::$strings["Create a new rendezvous and share the access link with those you wish to invite to the group. Those who open the link become members of the rendezvous. They can view other member locations, add markers to the map, or share their own locations with the group."] = "Créez un nouveau rendez-vous et partagez le lien d'accès avec les gens que vous souhaitez inviter au groupe. Ceux qui ouvrent le lien deviennent membres du rendez-vous. Ils peuvent afficher les emplacements des autres membres, ajouter des marqueurs à la carte ou partager leurs propres emplacements avec le groupe.";
-App::$strings["Install Firefox Sharing Tools"] = "Installer Firefox Sharing Tools";
-App::$strings["Share content from Firefox to \$Projectname"] = "Partager du contenu depuis Firefox avec \$Projectname";
-App::$strings["Install Firefox Sharing Tools to this web browser"] = "Installer Firefox Sharing Tools sur ce navigateur";
-App::$strings["Error retrieving wiki"] = "Erreur lors de la récupération du wiki";
-App::$strings["Error creating zip file export folder"] = "Erreur lors de la création du dossier d'exportation du fichier zip";
-App::$strings["Error downloading wiki: "] = "Erreur lors du téléchargement du wiki:";
-App::$strings["Wiki Pages"] = "Pages wiki";
-App::$strings["Add new page"] = "Ajouter une nouvelle page";
-App::$strings["Page name"] = "Nom de la page";
-App::$strings["Wiki List"] = "Liste de wikis";
-App::$strings["Enable the GNU-Social protocol for this channel"] = "Activer le protocole GNU-Social pour ce canal";
-App::$strings["__ctx:opensearch__ Search %1\$s (%2\$s)"] = "Recherche %1\$s (%2\$s)";
-App::$strings["__ctx:opensearch__ \$Projectname"] = "\$Projectname";
+App::$strings["Who likes me?"] = "Qui m'aime?";
+App::$strings["You are now authenticated to pumpio."] = "Vous êtes maintenant connecté à pumpio.";
+App::$strings["return to the featured settings page"] = "retourner à la page des paramètres des fonctionnalités";
+App::$strings["Post to Pump.io"] = "Publier sur Pump.io";
+App::$strings["Pump.io servername"] = "Nom du serveur Pump.io";
+App::$strings["Without \"http://\" or \"https://\""] = "Sans \"http://\" ou \"https://\"";
+App::$strings["Pump.io username"] = "Identifiant Pump.io";
+App::$strings["Without the servername"] = "Sans le nom de serveur";
+App::$strings["You are not authenticated to pumpio"] = "Vous n'êtes pas connecté à Pump.io";
+App::$strings["(Re-)Authenticate your pump.io connection"] = "Authentifiez-vous à nouveau auprès de Pump.io";
+App::$strings["Enable pump.io Post Plugin"] = "Activer le plugin de publication Pump.io";
+App::$strings["Post to pump.io by default"] = "Par défaut, publier sur Pump.io";
+App::$strings["Should posts be public"] = "Les publications doivent-elles être publiques ?";
+App::$strings["Mirror all public posts"] = "Créer une copie miroir de toutes les publications publiques";
+App::$strings["Pump.io Post Settings"] = "Paramètres de publication Pump.io";
+App::$strings["PumpIO Settings saved."] = "Paramètres Pump.io sauvegardés.";
+App::$strings["An account has been created for you."] = "Un compte a été créé pour vous.";
+App::$strings["Authentication successful but rejected: account creation is disabled."] = "L'authentification a réussi mais a été rejetée : la création de comptes est désactivée.";
App::$strings["Search \$Projectname"] = "Chercher dans \$Projectname";
-App::$strings["Cannot locate DNS info for database server '%s'"] = "Impossible de trouver les infos DNS du serveur de BDD '%s'";
-App::$strings["default"] = "défaut";
-App::$strings["Select an alternate language"] = "Choisir une langue alternative";
-App::$strings["Not a valid email address"] = "Ce n'est pas une adresse de courriel valide";
-App::$strings["Your email domain is not among those allowed on this site"] = "Votre domaine de courriel ne fait pas partie de ceux autorisés par ce site";
-App::$strings["Your email address is already registered at this site."] = "Votre adresse de courriel est déjà inscrite sur ce site.";
-App::$strings["An invitation is required."] = "Une invitation est requise.";
-App::$strings["Invitation could not be verified."] = "Votre invitation n'a pas pu être vérifiée.";
-App::$strings["Please enter the required information."] = "Merci d'entrer les informations requises.";
-App::$strings["Failed to store account information."] = "Impossible de stocker les informations liées au compte.";
-App::$strings["Registration confirmation for %s"] = "Confirmation de l'inscription pour %s";
-App::$strings["Registration request at %s"] = "Demande d'inscription sur %s";
-App::$strings["your registration password"] = "votre mot de passe d'inscription";
-App::$strings["Registration details for %s"] = "Détails de l'inscription pour %s";
-App::$strings["Account approved."] = "Compte approuvé.";
-App::$strings["Registration revoked for %s"] = "Inscription révoquée pour %s";
-App::$strings["Click here to upgrade."] = "Cliquez ici pour mettre à jour.";
-App::$strings["This action exceeds the limits set by your subscription plan."] = "Cette action outrepasserait les limites prévues par votre forfait.";
-App::$strings["This action is not available under your subscription plan."] = "Cette action n'est pas disponible avec votre forfait.";
-App::$strings["Who can see this?"] = "Qui peut voir cela";
-App::$strings["Custom selection"] = "Sélection personnalisée";
-App::$strings["Select \"Show\" to allow viewing. \"Don't show\" lets you override and limit the scope of \"Show\"."] = "Sélectionnez \"Afficher\" pour permettre l'affichage. \"Ne pas afficher\" vous permet de remplacer et de limiter la portée de \"Afficher\".";
-App::$strings["Show"] = "Montrer";
-App::$strings["Don't show"] = "Cacher";
-App::$strings["Post permissions %s cannot be changed %s after a post is shared.</br />These permissions set who is allowed to view the post."] = "Les autorisations d'accès d'un message %s ne peuvent pas être modifiées %s une fois le message envoyé. Ces autorisations définissent qui est autorisé à afficher le message.";
-App::$strings["Categories"] = "Catégories";
-App::$strings["Tags"] = "Étiquettes";
-App::$strings["Keywords"] = "Mots-clefs";
-App::$strings["have"] = "ont";
-App::$strings["has"] = "a";
-App::$strings["want"] = "veulent";
-App::$strings["wants"] = "veut";
-App::$strings["likes"] = "aime";
-App::$strings["dislikes"] = "n'aime pas";
-App::$strings["Attachments:"] = "Pièces jointes&nbsp;:";
-App::$strings["l F d, Y \\@ g:i A"] = "l d F Y \\à G\\hi";
-App::$strings["\$Projectname event notification:"] = "Notification d'événement de \$Projectname&nbsp;:";
-App::$strings["Starts:"] = "Début&nbsp;:";
-App::$strings["Finishes:"] = "Fin&nbsp;:";
-App::$strings["Birthday"] = "Anniversaire";
-App::$strings["Age: "] = "Age&nbsp;:";
-App::$strings["YYYY-MM-DD or MM-DD"] = "AAAA-MM-JJ ou MM-JJ";
-App::$strings["never"] = "jamais";
-App::$strings["less than a second ago"] = "à l'instant";
-App::$strings["__ctx:e.g. 22 hours ago, 1 minute ago__ %1\$d %2\$s ago"] = "il y a %1\$d %2\$s";
-App::$strings["__ctx:relative_date__ year"] = array(
- 0 => "an",
- 1 => "ans",
-);
-App::$strings["__ctx:relative_date__ month"] = array(
- 0 => "mois",
- 1 => "mois",
-);
-App::$strings["__ctx:relative_date__ week"] = array(
- 0 => "semaine",
- 1 => "semaines",
-);
-App::$strings["__ctx:relative_date__ day"] = array(
- 0 => "jour",
- 1 => "jours",
-);
-App::$strings["__ctx:relative_date__ hour"] = array(
- 0 => "heure",
- 1 => "heures",
-);
-App::$strings["__ctx:relative_date__ minute"] = array(
- 0 => "minute",
- 1 => "minutes",
-);
-App::$strings["__ctx:relative_date__ second"] = array(
- 0 => "seconde",
- 1 => "secondes",
-);
-App::$strings["%1\$s's birthday"] = "Anniversaire de %1\$s";
-App::$strings["Happy Birthday %1\$s"] = "Joyeux Anniversaire %1\$s";
+App::$strings["Redmatrix File Storage Import"] = "Importation du fichier de stockage Redmatrix";
+App::$strings["This will import all your Redmatrix cloud files to this channel."] = "Ceci importera tous vos fichiers Redmatrix dans ce canal.";
+App::$strings["file"] = "fichier";
+App::$strings["Send email to all members"] = "Envoyer un mail à tous les membres";
+App::$strings["$1%s Administrator"] = "$1%s administrateur";
+App::$strings["%1\$d of %2\$d messages sent."] = "%1\$d message(s) envoyés sur %2\$d.";
+App::$strings["Send email to all hub members."] = "Envoyer un e-mail à tous les membres du hub.";
+App::$strings["Sender Email address"] = "Adresse mail de l'expéditeur";
+App::$strings["Test mode (only send to hub administrator)"] = "Mode test (uniquement envoyé à l'administrateur du hub)";
App::$strings["Frequently"] = "Fréquemment";
App::$strings["Hourly"] = "Toutes les heures";
App::$strings["Twice daily"] = "Deux fois par jour";
@@ -2492,9 +2458,6 @@ App::$strings["Uncertain"] = "Incertain";
App::$strings["It's complicated"] = "C'est compliqué";
App::$strings["Don't care"] = "S'en fiche";
App::$strings["Ask me"] = "Me demander";
-App::$strings["New window"] = "Nouvelle fenêtre";
-App::$strings["Open the selected location in a different window or browser tab"] = "Ouvrir l'emplacement dans une fenêtre ou un onglet différent";
-App::$strings["User '%s' deleted"] = "Utilisateur '%s' supprimé";
App::$strings["%1\$s is now connected with %2\$s"] = "%1\$s ajoute %2\$s à ses contacts";
App::$strings["%1\$s poked %2\$s"] = "%1\$s a tapoté %2\$s";
App::$strings["poked"] = "a tapoté";
@@ -2559,7 +2522,6 @@ App::$strings["Status Messages and Posts"] = "Messages d'état et contributions"
App::$strings["Profile Details"] = "Détails du profil";
App::$strings["Photo Albums"] = "Albums photo";
App::$strings["Files and Storage"] = "Fichiers et Stockage";
-App::$strings["Chatrooms"] = "Salons de clavardage";
App::$strings["Bookmarks"] = "Favoris";
App::$strings["Saved Bookmarks"] = "Favoris sauvegardés";
App::$strings["View Webpages"] = "Voir les pages web";
@@ -2587,110 +2549,111 @@ App::$strings["__ctx:noun__ Abstain"] = array(
0 => "S'abstient",
1 => "S'abstiennent",
);
-App::$strings["Unable to determine sender."] = "Impossible de déterminer l'émetteur.";
-App::$strings["No recipient provided."] = "Pas de destinataire.";
-App::$strings["[no subject]"] = "[sans objet]";
-App::$strings["Stored post could not be verified."] = "Le message stocké n'a pas pu être vérifié.";
-App::$strings["guest:"] = "Visiteur";
-App::$strings["The form security token was not correct. This probably happened because the form has been opened for too long (>3 hours) before submitting it."] = "Le formulaire n'est plus sécurisé, probablement parce qu'il est ouvert depuis trop longtemps (plus de 3 heures).";
-App::$strings["System"] = "Système";
-App::$strings["New App"] = "Nouvelle application";
-App::$strings["Edit Apps"] = "Modifier les apps";
-App::$strings["Suggestions"] = "Suggestions";
-App::$strings["See more..."] = "Voir plus...";
-App::$strings["You have %1$.0f of %2$.0f allowed connections."] = "Vous avez %1$.0f sur %2$.0f contacts autorisés.";
-App::$strings["Add New Connection"] = "Ajouter un nouveau contact";
-App::$strings["Enter channel address"] = "Saisissez l'adresse du canal";
-App::$strings["Examples: bob@example.com, https://example.com/barbara"] = "Exemples&nbsp;: pierre@exemple.com, https://exemple.com/sophie";
-App::$strings["Notes"] = "Notes";
-App::$strings["Remove term"] = "Retirer le terme";
-App::$strings["Saved Searches"] = "Recherches sauvegardées";
-App::$strings["add"] = "ajouter";
-App::$strings["Saved Folders"] = "Dossiers sauvegardés";
-App::$strings["Everything"] = "Tout";
-App::$strings["Archives"] = "Archives";
-App::$strings["Refresh"] = "Actualiser";
-App::$strings["Account settings"] = "Paramètres du compte";
-App::$strings["Channel settings"] = "Paramètres du canal";
-App::$strings["Additional features"] = "Fonctionnalités supplémentaires";
-App::$strings["Feature/Addon settings"] = "Paramètres des extensions/greffons";
-App::$strings["Display settings"] = "Paramètres d'affichage";
-App::$strings["Manage locations"] = "Gérer les emplacements";
-App::$strings["Export channel"] = "Exporter le canal";
-App::$strings["Connected apps"] = "Applications connectées";
-App::$strings["Permission Groups"] = "Groupes d'autorisation";
-App::$strings["Premium Channel Settings"] = "Paramètres de canal VIP";
-App::$strings["Private Mail Menu"] = "Menu des messages privés";
-App::$strings["Combined View"] = "Vue combinée";
-App::$strings["Inbox"] = "Boîte de réception";
-App::$strings["Outbox"] = "Boîte d'envoi";
-App::$strings["New Message"] = "Nouveau message";
-App::$strings["Conversations"] = "Conversations";
-App::$strings["Received Messages"] = "Messages reçus";
-App::$strings["Sent Messages"] = "Messages envoyés";
-App::$strings["No messages."] = "Pas de message.";
-App::$strings["Delete conversation"] = "Supprimer la conversation";
-App::$strings["Events Tools"] = "Outils Evènements";
-App::$strings["Export Calendar"] = "Exporter le calendrier";
-App::$strings["Import Calendar"] = "Importer un calendrier";
-App::$strings["Overview"] = "Aperçu";
-App::$strings["Chat Members"] = "Membres du salon de discussion";
-App::$strings["__ctx:wiki_history__ Message"] = "Message";
-App::$strings["Bookmarked Chatrooms"] = "Salons favoris";
-App::$strings["Suggested Chatrooms"] = "Salons suggérés";
-App::$strings["photo/image"] = "photo/image";
-App::$strings["Click to show more"] = "Cliquer pour voir plus";
-App::$strings["Rating Tools"] = "Outils d'évaluation";
-App::$strings["Rate Me"] = "M'évaluer";
-App::$strings["View Ratings"] = "Voir mes évaluations";
-App::$strings["Forums"] = "Forums";
-App::$strings["Tasks"] = "Tâches";
-App::$strings["Member registrations waiting for confirmation"] = "Inscriptions en attente d'approbation";
-App::$strings["Inspect queue"] = "Analyser la file d'attente";
-App::$strings["DB updates"] = "Mises à jour BDD";
-App::$strings["Admin"] = "Administrateur";
-App::$strings["Plugin Features"] = "Fonctionnalités des greffons";
-App::$strings["Invalid data packet"] = "Paquet de données invalide";
-App::$strings["Unable to verify channel signature"] = "Impossible de vérifier la signature du canal";
-App::$strings["Unable to verify site signature for %s"] = "Impossible de vérifier la signature de site pour %s";
-App::$strings["invalid target signature"] = "signature de la cible invalide";
-App::$strings["Unable to obtain identity information from database"] = "Impossible d'obtenir les données d'identité depuis la base de données";
-App::$strings["Empty name"] = "Nom vide";
-App::$strings["Name too long"] = "Nom trop long";
-App::$strings["No account identifier"] = "Pas d'identifiant de compte";
-App::$strings["Nickname is required."] = "Un surnom est requis.";
-App::$strings["Reserved nickname. Please choose another."] = "Surnom réservé. Merci d'en choisir un autre.";
-App::$strings["Nickname has unsupported characters or is already being used on this site."] = "Le surnom contient des caractères interdits ou est déjà pris sur ce site.";
-App::$strings["Unable to retrieve created identity"] = "Impossible de récupérer l'identité créée";
-App::$strings["Default Profile"] = "Profil par défaut";
-App::$strings["Create New Profile"] = "Créer un nouveau profil";
-App::$strings["Visible to everybody"] = "Visible de tous";
-App::$strings["Gender:"] = "Sexe&nbsp;:";
-App::$strings["Homepage:"] = "Site Internet&nbsp;:";
-App::$strings["Online Now"] = "Connecté";
-App::$strings["Like this channel"] = "J'aime ce canal";
-App::$strings["j F, Y"] = "j F, Y";
-App::$strings["j F"] = "j F";
-App::$strings["Birthday:"] = "Date de naissance&nbsp;:";
-App::$strings["for %1\$d %2\$s"] = "depuis %1\$d %2\$s";
-App::$strings["Sexual Preference:"] = "Orientation sexuelle&nbsp;:";
-App::$strings["Tags:"] = "Étiquettes&nbsp;:";
-App::$strings["Political Views:"] = "Opinions politiques&nbsp;:";
-App::$strings["Religion:"] = "Religion&nbsp;:";
-App::$strings["Hobbies/Interests:"] = "Occupations/Centres d'intérêt&nbsp;:";
-App::$strings["Likes:"] = "Aime&nbsp;:";
-App::$strings["Dislikes:"] = "N'aime pas&nbsp;:";
-App::$strings["Contact information and Social Networks:"] = "Coordonnées et réseaux sociaux&nbsp;:";
-App::$strings["My other channels:"] = "Mes autres canaux&nbsp;:";
-App::$strings["Musical interests:"] = "Goûts musicaux&nbsp;:";
-App::$strings["Books, literature:"] = "Lectures, goûts littéraires&nbsp;:";
-App::$strings["Television:"] = "Télévision&nbsp;:";
-App::$strings["Film/dance/culture/entertainment:"] = "Cinéma/danse/culture/divertissement&nsbp;:";
-App::$strings["Love/Romance:"] = "Vie sentimentale/amoureuse&nbsp;:";
-App::$strings["Work/employment:"] = "Travail/Occupation&nbsp;";
-App::$strings["School/education:"] = "Études&nbsp;";
-App::$strings["Like this thing"] = "J'aime ceci";
-App::$strings["New Page"] = "Nouvelle page";
+App::$strings["Can view my normal stream and posts"] = "Peut voir les publications ordinaires sur mon canal.";
+App::$strings["Can view my webpages"] = "Peut voir mes pages web";
+App::$strings["Can post on my channel page (\"wall\")"] = "Peuvent poster sur la page de mon canal (\"mur\")";
+App::$strings["Can like/dislike stuff"] = "Peuvent aimer/ne pas aimer";
+App::$strings["Profiles and things other than posts/comments"] = "Profils et autres excluant les publications/commentaires.";
+App::$strings["Can forward to all my channel contacts via post @mentions"] = "Peut faire suivre à tous les contacts de mon canal via \"@mention\"";
+App::$strings["Advanced - useful for creating group forum channels"] = "Avancé - utile pour les canaux de type \"forum/groupe\"";
+App::$strings["Can chat with me (when available)"] = "Peut discuter avec moi (quand disponibie)";
+App::$strings["Can write to my file storage and photos"] = "Peut charger des fichiers et des photos dans mon canal";
+App::$strings["Can edit my webpages"] = "Peut modifier mes pages web";
+App::$strings["Somewhat advanced - very useful in open communities"] = "Plutôt avancé - très utile dans les communautés ouvertes";
+App::$strings["Can administer my channel resources"] = "Peut administrer les ressources de mon canal";
+App::$strings["Extremely advanced. Leave this alone unless you know what you are doing"] = "Très avancé. Ne pas toucher, sauf si vous savez ce que vous faîtes";
+App::$strings["Directory Options"] = "Options d'annuaire";
+App::$strings["Safe Mode"] = "Mode sûr";
+App::$strings["Public Forums Only"] = "Les forums publics uniquement";
+App::$strings["This Website Only"] = "Ce site uniquement";
+App::$strings["%1\$s's bookmarks"] = "Favoris de %1\$s";
+App::$strings["Cannot create a duplicate channel identifier on this system. Import failed."] = "L'import a échoué. Un canal existe déjà avec ce nom";
+App::$strings["Cloned channel not found. Import failed."] = "Canal cloné non trouvé. Echec de l'import.";
+App::$strings["prev"] = "préc.";
+App::$strings["first"] = "premier";
+App::$strings["last"] = "dernier";
+App::$strings["next"] = "Suivant";
+App::$strings["older"] = "plus ancien";
+App::$strings["newer"] = "plus récent";
+App::$strings["No connections"] = "Pas de relations.";
+App::$strings["View all %s connections"] = "Voir les %s contacts";
+App::$strings["poke"] = "tapoter";
+App::$strings["ping"] = "ping";
+App::$strings["pinged"] = "pingé";
+App::$strings["prod"] = "encourager";
+App::$strings["prodded"] = "encouragé";
+App::$strings["slap"] = "giffler";
+App::$strings["slapped"] = "gifflé(e)";
+App::$strings["finger"] = "pointer";
+App::$strings["fingered"] = "pointé";
+App::$strings["rebuff"] = "rejetter";
+App::$strings["rebuffed"] = "rejeté";
+App::$strings["happy"] = "heureux";
+App::$strings["sad"] = "triste";
+App::$strings["mellow"] = "mélancolique";
+App::$strings["tired"] = "fatigué";
+App::$strings["perky"] = "impertinent";
+App::$strings["angry"] = "en colère";
+App::$strings["stupefied"] = "stupéfait";
+App::$strings["puzzled"] = "perplexe";
+App::$strings["interested"] = "intéressé";
+App::$strings["bitter"] = "amer";
+App::$strings["cheerful"] = "plein d'entrain";
+App::$strings["alive"] = "vivant";
+App::$strings["annoyed"] = "agaçé";
+App::$strings["anxious"] = "anxieux";
+App::$strings["cranky"] = "énervé";
+App::$strings["disturbed"] = "perturbé";
+App::$strings["frustrated"] = "frustré";
+App::$strings["depressed"] = "déprimé";
+App::$strings["motivated"] = "motivé";
+App::$strings["relaxed"] = "détendu";
+App::$strings["surprised"] = "surpris";
+App::$strings["Monday"] = "Lundi";
+App::$strings["Tuesday"] = "Mardi";
+App::$strings["Wednesday"] = "Mercredi";
+App::$strings["Thursday"] = "Jeudi";
+App::$strings["Friday"] = "Vendredi";
+App::$strings["Saturday"] = "Samedi";
+App::$strings["Sunday"] = "Dimanche";
+App::$strings["January"] = "Janvier";
+App::$strings["February"] = "Février";
+App::$strings["March"] = "Mars";
+App::$strings["April"] = "Avril";
+App::$strings["May"] = "Mai";
+App::$strings["June"] = "Juin";
+App::$strings["July"] = "Juillet";
+App::$strings["August"] = "Août";
+App::$strings["September"] = "Septembre";
+App::$strings["October"] = "Octobre";
+App::$strings["November"] = "Novembre";
+App::$strings["December"] = "Décembre";
+App::$strings["Unknown Attachment"] = "Pièce jointe inconnue";
+App::$strings["unknown"] = "Inconnu";
+App::$strings["remove category"] = "supprimer la catégorie";
+App::$strings["remove from file"] = "retirer du fichier";
+App::$strings["default"] = "défaut";
+App::$strings["Page layout"] = "Mise en page";
+App::$strings["You can create your own with the layouts tool"] = "Créez les vôtres avec les outils de mise en page";
+App::$strings["Page content type"] = "Type de contenu de la page";
+App::$strings["activity"] = "activité";
+App::$strings["Design Tools"] = "Outils de conception";
+App::$strings["Pages"] = "Pages";
+App::$strings["Import website..."] = "Importer le site web…";
+App::$strings["Select folder to import"] = "Sélectionner le dossier à importer";
+App::$strings["Import from a zipped folder:"] = "Importer à partir d'un dossier zippé :";
+App::$strings["Import from cloud files:"] = "Importer à partir de fichiers dans le cloud :";
+App::$strings["/cloud/channel/path/to/folder"] = "/cloud/channel/chemain/du/repertoire";
+App::$strings["Enter path to website files"] = "Entrer le chemin vers les fichiers du site web";
+App::$strings["Select folder"] = "Sélectionner un répertoire";
+App::$strings["Export website..."] = "Exporter le site web…";
+App::$strings["Export to a zip file"] = "Exporter dans un fichier zip";
+App::$strings["website.zip"] = "website.zip";
+App::$strings["Enter a name for the zip file."] = "Entrer un nom pour le fichier zip.";
+App::$strings["Export to cloud files"] = "Exporter dans des fichiers sur le cloud";
+App::$strings["/path/to/export/folder"] = "/chemin/vers/le/dossier/d'export";
+App::$strings["Enter a path to a cloud files destination."] = "Entrer le chemin vers le cloud de fichiers";
+App::$strings["Specify folder"] = "Spécifier un répertoire";
App::$strings["%d invitation available"] = array(
0 => "%d invitation disponible",
1 => "%d invitations disponibles",
@@ -2707,6 +2670,18 @@ App::$strings["%d connection in common"] = array(
1 => "%d contacts en commun",
);
App::$strings["show more"] = "montrer plus";
+App::$strings["Attachments:"] = "";
+App::$strings["l F d, Y \\@ g:i A"] = "l d F Y \\à G\\hi";
+App::$strings["\$Projectname event notification:"] = "";
+App::$strings["Starts:"] = "Début&nbsp;:";
+App::$strings["Finishes:"] = "Fin&nbsp;:";
+App::$strings["Channel is blocked on this site."] = "Ce canal est bloqué sur ce site.";
+App::$strings["Channel location missing."] = "Emplacement du canal introuvable.";
+App::$strings["Response from remote channel was incomplete."] = "La réponse du canal distant était incomplète.";
+App::$strings["Channel was deleted and no longer exists."] = "Le canal a été supprimé et n'existe plus.";
+App::$strings["Protocol disabled."] = "Protocole désactivé.";
+App::$strings["Channel discovery failed."] = "La tentative d'accéder au canal a échoué.";
+App::$strings["Cannot connect to yourself."] = "Ne peut pas se connecter à vous.";
App::$strings["Delete this item?"] = "Supprimer cet élément?";
App::$strings["%s show less"] = "%s afficher moins";
App::$strings["%s expand"] = "%s dérouler";
@@ -2740,18 +2715,7 @@ App::$strings["about a year"] = "environ un an";
App::$strings["%d years"] = "%d années";
App::$strings[" "] = " ";
App::$strings["timeago.numbers"] = "timeago.numbers";
-App::$strings["January"] = "Janvier";
-App::$strings["February"] = "Février";
-App::$strings["March"] = "Mars";
-App::$strings["April"] = "Avril";
App::$strings["__ctx:long__ May"] = "Mai";
-App::$strings["June"] = "Juin";
-App::$strings["July"] = "Juillet";
-App::$strings["August"] = "Août";
-App::$strings["September"] = "Septembre";
-App::$strings["October"] = "Octobre";
-App::$strings["November"] = "Novembre";
-App::$strings["December"] = "Décembre";
App::$strings["Jan"] = "Jan";
App::$strings["Feb"] = "Fev";
App::$strings["Mar"] = "Mar";
@@ -2764,13 +2728,6 @@ App::$strings["Sep"] = "Sep";
App::$strings["Oct"] = "Oct";
App::$strings["Nov"] = "Nov";
App::$strings["Dec"] = "Dec";
-App::$strings["Sunday"] = "Dimanche";
-App::$strings["Monday"] = "Lundi";
-App::$strings["Tuesday"] = "Mardi";
-App::$strings["Wednesday"] = "Mercredi";
-App::$strings["Thursday"] = "Jeudi";
-App::$strings["Friday"] = "Vendredi";
-App::$strings["Saturday"] = "Samedi";
App::$strings["Sun"] = "Dim";
App::$strings["Mon"] = "Lun";
App::$strings["Tue"] = "Mar";
@@ -2783,10 +2740,15 @@ App::$strings["__ctx:calendar__ month"] = "mois";
App::$strings["__ctx:calendar__ week"] = "semaine";
App::$strings["__ctx:calendar__ day"] = "jour";
App::$strings["__ctx:calendar__ All day"] = "Toute la journée";
-App::$strings["Directory Options"] = "Options d'annuaire";
-App::$strings["Safe Mode"] = "Mode sûr";
-App::$strings["Public Forums Only"] = "Les forums publics uniquement";
-App::$strings["This Website Only"] = "Ce site uniquement";
+App::$strings["Unable to determine sender."] = "Impossible de déterminer l'émetteur.";
+App::$strings["No recipient provided."] = "Pas de destinataire.";
+App::$strings["[no subject]"] = "[sans objet]";
+App::$strings["Stored post could not be verified."] = "Le message stocké n'a pas pu être vérifié.";
+App::$strings[" and "] = "et";
+App::$strings["public profile"] = "profil public";
+App::$strings["%1\$s changed %2\$s to &ldquo;%3\$s&rdquo;"] = "%1\$s a changé %2\$s en &ldquo;%3\$s&rdquo;";
+App::$strings["Visit %1\$s's %2\$s"] = "Visiter %2\$s de %1\$s";
+App::$strings["%1\$s has an updated %2\$s, changing %3\$s."] = "%1\$s a mis à jour %2\$s, modifiant %3\$s.";
App::$strings["Item was not found."] = "Élément introuvable.";
App::$strings["No source file."] = "Pas de fichier source.";
App::$strings["Cannot locate file to replace"] = "Impossible de trouver le fichier à remplacer.";
@@ -2802,146 +2764,88 @@ App::$strings["Path not found."] = "Chemin introuvable.";
App::$strings["mkdir failed."] = "mkdir a échoué.";
App::$strings["database storage failed."] = "l'écriture dans la base de données a échoué.";
App::$strings["Empty path"] = "Chemin vide";
+App::$strings["guest:"] = "Visiteur";
+App::$strings["The form security token was not correct. This probably happened because the form has been opened for too long (>3 hours) before submitting it."] = "Le formulaire n'est plus sécurisé, probablement parce qu'il est ouvert depuis trop longtemps (plus de 3 heures).";
+App::$strings["(Unknown)"] = "(Inconnu)";
+App::$strings["Visible to anybody on the internet."] = "Visible pour tout le monde sur internet.";
+App::$strings["Visible to you only."] = "Visible pour vous seulement.";
+App::$strings["Visible to anybody in this network."] = "Visible pour tout le monde sur ce réseau.";
+App::$strings["Visible to anybody authenticated."] = "Visible aux utilisateurs authentifiés.";
+App::$strings["Visible to anybody on %s."] = "Visible pour tous sur %s.";
+App::$strings["Visible to all connections."] = "Visible pour tous les contacts.";
+App::$strings["Visible to approved connections."] = "Visible aux contacts approuvés.";
+App::$strings["Visible to specific connections."] = "Visible pour certains contacts.";
+App::$strings["Privacy group is empty."] = "Groupe de contacts vide.";
+App::$strings["Privacy group: %s"] = "Groupe de contacts&nbsp;: %s";
+App::$strings["Connection not found."] = "Contact non trouvé.";
+App::$strings["profile photo"] = "photo de profil";
+App::$strings["[Edited %s]"] = "[%s édité]";
+App::$strings["__ctx:edit_activity__ Post"] = "Publier";
+App::$strings["__ctx:edit_activity__ Comment"] = "Commenter";
+App::$strings["Unable to obtain identity information from database"] = "Impossible d'obtenir les données d'identité depuis la base de données";
+App::$strings["Empty name"] = "Nom vide";
+App::$strings["Name too long"] = "Nom trop long";
+App::$strings["No account identifier"] = "Pas d'identifiant de compte";
+App::$strings["Nickname is required."] = "Un surnom est requis.";
+App::$strings["Reserved nickname. Please choose another."] = "Surnom réservé. Merci d'en choisir un autre.";
+App::$strings["Nickname has unsupported characters or is already being used on this site."] = "Le surnom contient des caractères interdits ou est déjà pris sur ce site.";
+App::$strings["Unable to retrieve created identity"] = "Impossible de récupérer l'identité créée";
+App::$strings["Default Profile"] = "Profil par défaut";
+App::$strings["Create New Profile"] = "Créer un nouveau profil";
+App::$strings["Visible to everybody"] = "Visible de tous";
+App::$strings["Gender:"] = "Sexe&nbsp;:";
+App::$strings["Homepage:"] = "Site Internet&nbsp;:";
+App::$strings["Online Now"] = "Connecté";
+App::$strings["Like this channel"] = "J'aime ce canal";
+App::$strings["j F, Y"] = "j F, Y";
+App::$strings["j F"] = "j F";
+App::$strings["Birthday:"] = "Date de naissance&nbsp;:";
+App::$strings["for %1\$d %2\$s"] = "depuis %1\$d %2\$s";
+App::$strings["Sexual Preference:"] = "Orientation sexuelle&nbsp;:";
+App::$strings["Tags:"] = "Étiquettes&nbsp;:";
+App::$strings["Political Views:"] = "Opinions politiques&nbsp;:";
+App::$strings["Religion:"] = "Religion&nbsp;:";
+App::$strings["Hobbies/Interests:"] = "Occupations/Centres d'intérêt&nbsp;:";
+App::$strings["Likes:"] = "Aime&nbsp;:";
+App::$strings["Dislikes:"] = "N'aime pas&nbsp;:";
+App::$strings["Contact information and Social Networks:"] = "Coordonnées et réseaux sociaux&nbsp;:";
+App::$strings["My other channels:"] = "Mes autres canaux&nbsp;:";
+App::$strings["Musical interests:"] = "Goûts musicaux&nbsp;:";
+App::$strings["Books, literature:"] = "Lectures, goûts littéraires&nbsp;:";
+App::$strings["Television:"] = "Télévision&nbsp;:";
+App::$strings["Film/dance/culture/entertainment:"] = "Cinéma/danse/culture/divertissement&nsbp;:";
+App::$strings["Love/Romance:"] = "Vie sentimentale/amoureuse&nbsp;:";
+App::$strings["Work/employment:"] = "Travail/Occupation&nbsp;";
+App::$strings["School/education:"] = "Études&nbsp;";
+App::$strings["Like this thing"] = "J'aime ceci";
+App::$strings["User '%s' deleted"] = "Utilisateur '%s' supprimé";
+App::$strings["This event has been added to your calendar."] = "Cet évènement a été ajouté dans votre calendrier.";
+App::$strings["Not specified"] = "Non spécifié";
+App::$strings["Needs Action"] = "Besoin d'une action";
+App::$strings["Completed"] = "Terminé";
+App::$strings["In Process"] = "En cours";
+App::$strings["Cancelled"] = "Annulé";
App::$strings["view full size"] = "voir en taille réelle";
App::$strings["No Subject"] = "Pas d'objet";
+App::$strings["Friendica"] = "Friendica";
App::$strings["OStatus"] = "OStatus";
App::$strings["GNU-Social"] = "GNU-Social";
App::$strings["RSS/Atom"] = "RSS/Atom";
+App::$strings["Diaspora"] = "Diaspora";
App::$strings["Facebook"] = "Facebook";
App::$strings["Zot"] = "Zot";
App::$strings["LinkedIn"] = "Linkedin";
App::$strings["XMPP/IM"] = "XMPP/IM";
App::$strings["MySpace"] = "MySpace";
-App::$strings[" by "] = "par";
-App::$strings[" on "] = "sur";
-App::$strings["Embedded content"] = "Contenu imbriqué";
-App::$strings["Embedding disabled"] = "Imbrication désactivée";
-App::$strings["Image exceeds website size limit of %lu bytes"] = "L'image dépasse la taille limite de %lu octets";
-App::$strings["Image file is empty."] = "L'image est vide.";
-App::$strings["Photo storage failed."] = "Le stockage de l'image a échoué.";
-App::$strings["a new photo"] = "une nouvelle photo";
-App::$strings["__ctx:photo_upload__ %1\$s posted %2\$s to %3\$s"] = "%1\$s a publié %2\$s pour %3\$s";
-App::$strings["Upload New Photos"] = "Ajouter des photos";
-App::$strings["prev"] = "préc.";
-App::$strings["first"] = "premier";
-App::$strings["last"] = "dernier";
-App::$strings["next"] = "Suivant";
-App::$strings["older"] = "plus ancien";
-App::$strings["newer"] = "plus récent";
-App::$strings["No connections"] = "Pas de relations.";
-App::$strings["View all %s connections"] = "Voir les %s contacts";
-App::$strings["poke"] = "tapoter";
-App::$strings["ping"] = "ping";
-App::$strings["pinged"] = "pingé";
-App::$strings["prod"] = "encourager";
-App::$strings["prodded"] = "encouragé";
-App::$strings["slap"] = "giffler";
-App::$strings["slapped"] = "gifflé(e)";
-App::$strings["finger"] = "pointer";
-App::$strings["fingered"] = "pointé";
-App::$strings["rebuff"] = "rejetter";
-App::$strings["rebuffed"] = "rejeté";
-App::$strings["happy"] = "heureux";
-App::$strings["sad"] = "triste";
-App::$strings["mellow"] = "mélancolique";
-App::$strings["tired"] = "fatigué";
-App::$strings["perky"] = "impertinent";
-App::$strings["angry"] = "en colère";
-App::$strings["stupefied"] = "stupéfait";
-App::$strings["puzzled"] = "perplexe";
-App::$strings["interested"] = "intéressé";
-App::$strings["bitter"] = "amer";
-App::$strings["cheerful"] = "plein d'entrain";
-App::$strings["alive"] = "vivant";
-App::$strings["annoyed"] = "agaçé";
-App::$strings["anxious"] = "anxieux";
-App::$strings["cranky"] = "énervé";
-App::$strings["disturbed"] = "perturbé";
-App::$strings["frustrated"] = "frustré";
-App::$strings["depressed"] = "déprimé";
-App::$strings["motivated"] = "motivé";
-App::$strings["relaxed"] = "détendu";
-App::$strings["surprised"] = "surpris";
-App::$strings["May"] = "Mai";
-App::$strings["Unknown Attachment"] = "Pièce jointe inconnue";
-App::$strings["unknown"] = "Inconnu";
-App::$strings["remove category"] = "supprimer la catégorie";
-App::$strings["remove from file"] = "retirer du fichier";
-App::$strings["Page layout"] = "Mise en page";
-App::$strings["You can create your own with the layouts tool"] = "Créez les vôtres avec les outils de mise en page";
-App::$strings["Page content type"] = "Type de contenu de la page";
-App::$strings["activity"] = "activité";
-App::$strings["Design Tools"] = "Outils de conception";
-App::$strings["Pages"] = "Pages";
-App::$strings["Import website..."] = "Importer le site web…";
-App::$strings["Select folder to import"] = "Sélectionner le dossier à importer";
-App::$strings["Import from a zipped folder:"] = "Importer à partir d'un dossier zippé :";
-App::$strings["Import from cloud files:"] = "Importer à partir de fichiers dans le cloud :";
-App::$strings["/cloud/channel/path/to/folder"] = "/cloud/channel/chemain/du/repertoire";
-App::$strings["Enter path to website files"] = "Entrer le chemin vers les fichiers du site web";
-App::$strings["Select folder"] = "Sélectionner un répertoire";
-App::$strings["Export website..."] = "Exporter le site web…";
-App::$strings["Export to a zip file"] = "Exporter dans un fichier zip";
-App::$strings["website.zip"] = "website.zip";
-App::$strings["Enter a name for the zip file."] = "Entrer un nom pour le fichier zip.";
-App::$strings["Export to cloud files"] = "Exporter dans des fichiers sur le cloud";
-App::$strings["/path/to/export/folder"] = "/chemin/vers/le/dossier/d'export";
-App::$strings["Enter a path to a cloud files destination."] = "Entrer le chemin vers le cloud de fichiers";
-App::$strings["Specify folder"] = "Spécifier un répertoire";
-App::$strings["Remote authentication"] = "Authentification distante";
-App::$strings["Click to authenticate to your home hub"] = "S'authentifier auprès de votre hub principal";
-App::$strings["Logout"] = "Déconnexion";
-App::$strings["End this session"] = "Mettre fin à la session";
-App::$strings["Your profile page"] = "Votre profil";
-App::$strings["Manage/Edit profiles"] = "Gérer/modifier vos profils";
-App::$strings["Edit your profile"] = "Modifier votre profil";
-App::$strings["Sign in"] = "Connexion";
-App::$strings["Get me home"] = "Rentrer chez moi";
-App::$strings["Log me out of this site"] = "Déconnectez-moi de ce site";
-App::$strings["Create an account"] = "Créer un compte";
-App::$strings["Help and documentation"] = "Aide et documentation";
-App::$strings["Applications, utilities, links, games"] = "Applications, utilitaires, liens, jeux";
-App::$strings["Search site @name, #tag, ?docs, content"] = "Recherche @nom, #tag, contenu";
-App::$strings["Channel Directory"] = "Annuaire des canaux";
-App::$strings["Your grid"] = "Votre réseau";
-App::$strings["View your network/grid"] = "Voir votre réseau";
-App::$strings["Mark all grid notifications seen"] = "Marquer toutes les notifications du réseau comme vues";
-App::$strings["Channel home"] = "Mon canal";
-App::$strings["View your channel home"] = "Voir la page d'accueil de votre canal";
-App::$strings["Mark all channel notifications seen"] = "Marquer toutes les notifications du canal comme vues";
-App::$strings["Notices"] = "Notifications";
-App::$strings["Notifications"] = "Notifications";
-App::$strings["View all notifications"] = "Voir toutes les notifications";
-App::$strings["Private mail"] = "Messages privés";
-App::$strings["View your private messages"] = "Voir vos messages privés";
-App::$strings["Mark all private messages seen"] = "Marquer tous les messages privés comme vus";
-App::$strings["Event Calendar"] = "Calendrier des événements";
-App::$strings["View events"] = "Voir les événements";
-App::$strings["Mark all events seen"] = "Marquer tous les événements comme vus";
-App::$strings["Manage Your Channels"] = "Gérer vos canaux";
-App::$strings["Account/Channel Settings"] = "Paramètres du Compte/Canal";
-App::$strings["Site Setup and Configuration"] = "Configuration du site";
-App::$strings["Documentation"] = "Documentation";
-App::$strings["@name, #tag, ?doc, content"] = "@nom, #étiquette, ?doc, contenu";
-App::$strings["Please wait..."] = "Merci de patienter...";
-App::$strings["Cannot create a duplicate channel identifier on this system. Import failed."] = "L'import a échoué. Un canal existe déjà avec ce nom";
-App::$strings["Channel clone failed. Import failed."] = "Echec du clonage du canal. Echec de l'impot.";
-App::$strings["Cloned channel not found. Import failed."] = "Canal cloné non trouvé. Echec de l'import.";
-App::$strings["Unable to import element \""] = "Impossible d'importer l'élément \"";
-App::$strings["Logged out."] = "Deconnecté.";
-App::$strings["Failed authentication"] = "Échec de l'authentification";
-App::$strings["Channel is blocked on this site."] = "Ce canal est bloqué sur ce site.";
-App::$strings["Channel location missing."] = "Emplacement du canal introuvable.";
-App::$strings["Response from remote channel was incomplete."] = "La réponse du canal distant était incomplète.";
-App::$strings["Channel was deleted and no longer exists."] = "Le canal a été supprimé et n'existe plus.";
-App::$strings["Protocol disabled."] = "Protocole désactivé.";
-App::$strings["Channel discovery failed."] = "La tentative d'accéder au canal a échoué.";
-App::$strings["Cannot connect to yourself."] = "Ne peut pas se connecter à vous.";
-App::$strings[" and "] = "et";
-App::$strings["public profile"] = "profil public";
-App::$strings["%1\$s changed %2\$s to &ldquo;%3\$s&rdquo;"] = "%1\$s a changé %2\$s en &ldquo;%3\$s&rdquo;";
-App::$strings["Visit %1\$s's %2\$s"] = "Visiter %2\$s de %1\$s";
-App::$strings["%1\$s has an updated %2\$s, changing %3\$s."] = "%1\$s a mis à jour %2\$s, modifiant %3\$s.";
+App::$strings["New Page"] = "Nouvelle page";
+App::$strings["Select an alternate language"] = "Choisir une langue alternative";
+App::$strings["Who can see this?"] = "Qui peut voir cela";
+App::$strings["Custom selection"] = "Sélection personnalisée";
+App::$strings["Select \"Show\" to allow viewing. \"Don't show\" lets you override and limit the scope of \"Show\"."] = "Sélectionnez \"Afficher\" pour permettre l'affichage. \"Ne pas afficher\" vous permet de remplacer et de limiter la portée de \"Afficher\".";
+App::$strings["Show"] = "Montrer";
+App::$strings["Don't show"] = "Cacher";
+App::$strings["Post permissions %s cannot be changed %s after a post is shared.</br />These permissions set who is allowed to view the post."] = "Les autorisations d'accès d'un message %s ne peuvent pas être modifiées %s une fois le message envoyé. Ces autorisations définissent qui est autorisé à afficher le message.";
+App::$strings["Cannot locate DNS info for database server '%s'"] = "Impossible de trouver les infos DNS du serveur de BDD '%s'";
App::$strings["Image/photo"] = "Image/photo";
App::$strings["Encrypted content"] = "Contenu chiffré";
App::$strings["Install %s element: "] = "Installer %s élément";
@@ -2950,49 +2854,10 @@ App::$strings["%1\$s wrote the following %2\$s %3\$s"] = "%1\$s a écrit %2\$s q
App::$strings["Click to open/close"] = "Cliquer pour ouvrir/fermer";
App::$strings["spoiler"] = "spoiler";
App::$strings["$1 wrote:"] = "$1 a écrit&nbsp;:";
-App::$strings["%1\$s's bookmarks"] = "Favoris de %1\$s";
-App::$strings["A deleted group with this name was revived. Existing item permissions <strong>may</strong> apply to this group and any future members. If this is not what you intended, please create another group with a different name."] = "Un groupe supprimé portant ce nom a été ressuscité. Les permissions liées aux éléments existants <strong>peuvent</strong> s'appliquer au groupe et aux membres futurs. Si ce n'est pas ce que vous attendiez, merci de créer un autre groupe avec un nom différent.";
-App::$strings["Add new connections to this privacy group"] = "Ajouter de nouveaux contacts à ce groupe d'accès";
-App::$strings["edit"] = "modifier";
-App::$strings["Privacy Groups"] = "Groupes d'accès";
-App::$strings["Edit group"] = "Modifier le groupe";
-App::$strings["Add privacy group"] = "Ajouter un groupe d'accès";
-App::$strings["Channels not in any privacy group"] = "Canaux n'étant dans aucun groupe d'accès";
-App::$strings["This event has been added to your calendar."] = "Cet évènement a été ajouté dans votre calendrier.";
-App::$strings["Not specified"] = "Non spécifié";
-App::$strings["Needs Action"] = "Besoin d'une action";
-App::$strings["Completed"] = "Terminé";
-App::$strings["In Process"] = "En cours";
-App::$strings["Cancelled"] = "Annulé";
-App::$strings["(Unknown)"] = "(Inconnu)";
-App::$strings["Visible to anybody on the internet."] = "Visible pour tout le monde sur internet.";
-App::$strings["Visible to you only."] = "Visible pour vous seulement.";
-App::$strings["Visible to anybody in this network."] = "Visible pour tout le monde sur ce réseau.";
-App::$strings["Visible to anybody authenticated."] = "Visible aux utilisateurs authentifiés.";
-App::$strings["Visible to anybody on %s."] = "Visible pour tous sur %s.";
-App::$strings["Visible to all connections."] = "Visible pour tous les contacts.";
-App::$strings["Visible to approved connections."] = "Visible aux contacts approuvés.";
-App::$strings["Visible to specific connections."] = "Visible pour certains contacts.";
-App::$strings["Privacy group is empty."] = "Groupe d'accès vide.";
-App::$strings["Privacy group: %s"] = "Groupe d'accès&nbsp;: %s";
-App::$strings["Connection not found."] = "Contact non trouvé.";
-App::$strings["profile photo"] = "photo de profil";
-App::$strings["[Edited %s]"] = "[%s édité]";
-App::$strings["__ctx:edit_activity__ Post"] = "Publier";
-App::$strings["__ctx:edit_activity__ Comment"] = "Commenter";
-App::$strings["Can view my normal stream and posts"] = "Peut voir les publications ordinaires sur mon canal.";
-App::$strings["Can view my webpages"] = "Peut voir mes pages web";
-App::$strings["Can post on my channel page (\"wall\")"] = "Peuvent poster sur la page de mon canal (\"mur\")";
-App::$strings["Can like/dislike stuff"] = "Peuvent aimer/ne pas aimer";
-App::$strings["Profiles and things other than posts/comments"] = "Profils et autres excluant les publications/commentaires.";
-App::$strings["Can forward to all my channel contacts via post @mentions"] = "Peut faire suivre à tous les contacts de mon canal via \"@mention\"";
-App::$strings["Advanced - useful for creating group forum channels"] = "Avancé - utile pour les canaux de type \"forum/groupe\"";
-App::$strings["Can chat with me (when available)"] = "Peut discuter avec moi (quand disponibie)";
-App::$strings["Can write to my file storage and photos"] = "Peut charger des fichiers et des photos dans mon canal";
-App::$strings["Can edit my webpages"] = "Peut modifier mes pages web";
-App::$strings["Somewhat advanced - very useful in open communities"] = "Plutôt avancé - très utile dans les communautés ouvertes";
-App::$strings["Can administer my channel resources"] = "Peut administrer les ressources de mon canal";
-App::$strings["Extremely advanced. Leave this alone unless you know what you are doing"] = "Très avancé. Ne pas toucher, sauf si vous savez ce que vous faîtes";
+App::$strings[" by "] = "par";
+App::$strings[" on "] = "sur";
+App::$strings["Embedded content"] = "Contenu imbriqué";
+App::$strings["Embedding disabled"] = "Imbrication désactivée";
App::$strings["General Features"] = "Fonctionnalités générales";
App::$strings["Multiple Profiles"] = "Profils multiples";
App::$strings["Ability to create multiple profiles"] = "Possibilité de créer plusieurs profils";
@@ -3039,7 +2904,8 @@ App::$strings["Prevent posts with identical content to be published with less th
App::$strings["Network and Stream Filtering"] = "Filtrage du réseau et des flux";
App::$strings["Search by Date"] = "Chercher par date";
App::$strings["Ability to select posts by date ranges"] = "Pouvoir choisir des publications par date";
-App::$strings["Enable management and selection of privacy groups"] = "Active la gestion et la sélection des groupes d'accès";
+App::$strings["Privacy Groups"] = "Groupes de contacts";
+App::$strings["Enable management and selection of privacy groups"] = "Active la gestion et la sélection des groupes de contacts";
App::$strings["Save search terms for re-use"] = "Sauvegarder des termes de recherche pour utilisation ultérieure";
App::$strings["Network Personal Tab"] = "Onglet \"Me concernant\"";
App::$strings["Enable tab to display only Network posts that you've interacted on"] = "Activer un onglet affichant seulement les publications du réseau sur lesquelles vous êtes intervenu";
@@ -3066,51 +2932,117 @@ App::$strings["Tag Cloud"] = "Nuage de tags";
App::$strings["Provide a personal tag cloud on your channel page"] = "Afficher un nuage de vos tags sur votre canal";
App::$strings["Premium Channel"] = "Canal VIP";
App::$strings["Allows you to set restrictions and terms on those that connect with your channel"] = "Vous permet d'appliquer des règles et restrictions aux contacts de votre canal";
+App::$strings["Tags"] = "Étiquettes";
+App::$strings["Keywords"] = "Mots-clefs";
+App::$strings["have"] = "ont";
+App::$strings["has"] = "a";
+App::$strings["want"] = "veulent";
+App::$strings["wants"] = "veut";
+App::$strings["likes"] = "aime";
+App::$strings["dislikes"] = "n'aime pas";
+App::$strings["Not a valid email address"] = "Ce n'est pas une adresse de courriel valide";
+App::$strings["Your email domain is not among those allowed on this site"] = "Votre domaine de courriel ne fait pas partie de ceux autorisés par ce site";
+App::$strings["Your email address is already registered at this site."] = "Votre adresse de courriel est déjà inscrite sur ce site.";
+App::$strings["An invitation is required."] = "Une invitation est requise.";
+App::$strings["Invitation could not be verified."] = "Votre invitation n'a pas pu être vérifiée.";
+App::$strings["Please enter the required information."] = "Merci d'entrer les informations requises.";
+App::$strings["Failed to store account information."] = "Impossible de stocker les informations liées au compte.";
+App::$strings["Registration confirmation for %s"] = "Confirmation de l'inscription pour %s";
+App::$strings["Registration request at %s"] = "Demande d'inscription sur %s";
+App::$strings["your registration password"] = "votre mot de passe d'inscription";
+App::$strings["Registration details for %s"] = "Détails de l'inscription pour %s";
+App::$strings["Account approved."] = "Compte approuvé.";
+App::$strings["Registration revoked for %s"] = "Inscription révoquée pour %s";
+App::$strings["Click here to upgrade."] = "Cliquez ici pour mettre à jour.";
+App::$strings["This action exceeds the limits set by your subscription plan."] = "Cette action outrepasserait les limites prévues par votre forfait.";
+App::$strings["This action is not available under your subscription plan."] = "Cette action n'est pas disponible avec votre forfait.";
+App::$strings["Birthday"] = "Anniversaire";
+App::$strings["Age: "] = "Age&nbsp;:";
+App::$strings["YYYY-MM-DD or MM-DD"] = "AAAA-MM-JJ ou MM-JJ";
+App::$strings["less than a second ago"] = "à l'instant";
+App::$strings["__ctx:e.g. 22 hours ago, 1 minute ago__ %1\$d %2\$s ago"] = "il y a %1\$d %2\$s";
+App::$strings["__ctx:relative_date__ year"] = array(
+ 0 => "an",
+ 1 => "ans",
+);
+App::$strings["__ctx:relative_date__ month"] = array(
+ 0 => "mois",
+ 1 => "mois",
+);
+App::$strings["__ctx:relative_date__ week"] = array(
+ 0 => "semaine",
+ 1 => "semaines",
+);
+App::$strings["__ctx:relative_date__ day"] = array(
+ 0 => "jour",
+ 1 => "jours",
+);
+App::$strings["__ctx:relative_date__ hour"] = array(
+ 0 => "heure",
+ 1 => "heures",
+);
+App::$strings["__ctx:relative_date__ minute"] = array(
+ 0 => "minute",
+ 1 => "minutes",
+);
+App::$strings["__ctx:relative_date__ second"] = array(
+ 0 => "seconde",
+ 1 => "secondes",
+);
+App::$strings["%1\$s's birthday"] = "Anniversaire de %1\$s";
+App::$strings["Happy Birthday %1\$s"] = "Joyeux Anniversaire %1\$s";
+App::$strings["Remote authentication"] = "Authentification distante";
+App::$strings["Click to authenticate to your home hub"] = "S'authentifier auprès de votre hub principal";
+App::$strings["End this session"] = "Mettre fin à la session";
+App::$strings["Your profile page"] = "Votre profil";
+App::$strings["Manage/Edit profiles"] = "Gérer/modifier vos profils";
+App::$strings["Edit your profile"] = "Modifier votre profil";
+App::$strings["Sign in"] = "Connexion";
+App::$strings["Take me home"] = "";
+App::$strings["Log me out of this site"] = "Déconnectez-moi de ce site";
+App::$strings["Create an account"] = "Créer un compte";
+App::$strings["Help and documentation"] = "Aide et documentation";
+App::$strings["Search site @name, #tag, ?docs, content"] = "Recherche @nom, #tag, contenu";
+App::$strings["Your grid"] = "Votre réseau";
+App::$strings["View your network/grid"] = "Voir votre réseau";
+App::$strings["Mark all grid notifications seen"] = "Marquer toutes les notifications du réseau comme vues";
+App::$strings["Channel home"] = "Mon canal";
+App::$strings["View your channel home"] = "Voir la page d'accueil de votre canal";
+App::$strings["Mark all channel notifications seen"] = "Marquer toutes les notifications du canal comme vues";
+App::$strings["Notices"] = "Notifications";
+App::$strings["Notifications"] = "Notifications";
+App::$strings["View all notifications"] = "Voir toutes les notifications";
+App::$strings["Private mail"] = "Messages privés";
+App::$strings["View your private messages"] = "Voir vos messages privés";
+App::$strings["Mark all private messages seen"] = "Marquer tous les messages privés comme vus";
+App::$strings["Event Calendar"] = "Calendrier des événements";
+App::$strings["View events"] = "Voir les événements";
+App::$strings["Mark all events seen"] = "Marquer tous les événements comme vus";
+App::$strings["Manage Your Channels"] = "Gérer vos canaux";
+App::$strings["Account/Channel Settings"] = "Paramètres du Compte/Canal";
+App::$strings["Site Setup and Configuration"] = "Configuration du site";
+App::$strings["@name, #tag, ?doc, content"] = "@nom, #étiquette, ?doc, contenu";
+App::$strings["Please wait..."] = "Merci de patienter...";
+App::$strings["Add Apps"] = "";
+App::$strings["Image exceeds website size limit of %lu bytes"] = "L'image dépasse la taille limite de %lu octets";
+App::$strings["Image file is empty."] = "L'image est vide.";
+App::$strings["Photo storage failed."] = "Le stockage de l'image a échoué.";
+App::$strings["a new photo"] = "une nouvelle photo";
+App::$strings["__ctx:photo_upload__ %1\$s posted %2\$s to %3\$s"] = "%1\$s a publié %2\$s pour %3\$s";
+App::$strings["Upload New Photos"] = "Ajouter des photos";
+App::$strings["Invalid data packet"] = "Paquet de données invalide";
+App::$strings["Unable to verify channel signature"] = "Impossible de vérifier la signature du canal";
+App::$strings["Unable to verify site signature for %s"] = "Impossible de vérifier la signature de site pour %s";
+App::$strings["invalid target signature"] = "signature de la cible invalide";
+App::$strings["A deleted group with this name was revived. Existing item permissions <strong>may</strong> apply to this group and any future members. If this is not what you intended, please create another group with a different name."] = "Un groupe supprimé portant ce nom a été ressuscité. Les permissions liées aux éléments existants <strong>peuvent</strong> s'appliquer au groupe et aux membres futurs. Si ce n'est pas ce que vous attendiez, merci de créer un autre groupe avec un nom différent.";
+App::$strings["Add new connections to this privacy group"] = "Ajouter de nouveaux contacts à ce groupe de contacts";
+App::$strings["edit"] = "modifier";
+App::$strings["Edit group"] = "Modifier le groupe";
+App::$strings["Add privacy group"] = "Créer un groupe de contacts";
+App::$strings["Channels not in any privacy group"] = "Contacts n'étant dans aucun groupe de contacts";
+App::$strings["New window"] = "Nouvelle fenêtre";
+App::$strings["Open the selected location in a different window or browser tab"] = "Ouvrir l'emplacement dans une fenêtre ou un onglet différent";
+App::$strings["Logged out."] = "Deconnecté.";
+App::$strings["Failed authentication"] = "Échec de l'authentification";
App::$strings["Help:"] = "Aide&nbsp;:";
App::$strings["Not Found"] = "Introuvable";
-App::$strings["Source channel not found."] = "Source du canal introuvable.";
-App::$strings["Focus (Hubzilla default)"] = "Focus (par défaut pour Hubzilla)";
-App::$strings["Theme settings"] = "Paramètres du thème";
-App::$strings["Narrow navbar"] = "Barre de navigation fine";
-App::$strings["Navigation bar background color"] = "Couleur de fond de la barre de navigation";
-App::$strings["Navigation bar gradient top color"] = "Dégradé de la barre de navigation - couleur du haut";
-App::$strings["Navigation bar gradient bottom color"] = "Dégradé de la barre de navigation - couleur du bas";
-App::$strings["Navigation active button gradient top color"] = "Dégradé du bouton de navigation actif - couleur du haut";
-App::$strings["Navigation active button gradient bottom color"] = "Dégradé du bouton de navigation actif - couleur du bas";
-App::$strings["Navigation bar border color "] = "Couleur de la bordure de la barre de navigation";
-App::$strings["Navigation bar icon color "] = "Couleur des icônes de la barre de navigation";
-App::$strings["Navigation bar active icon color "] = "Couleur de l'icône active de la barre de navigation";
-App::$strings["link color"] = "couleur des liens";
-App::$strings["Set font-color for banner"] = "Définir la couleur du texte de la bannière";
-App::$strings["Set the background color"] = "Définir la couleur d'arrière-plan";
-App::$strings["Set the background image"] = "Définir l'image d'arrière-plan";
-App::$strings["Set the background color of items"] = "Définir la couleur de fond des contributions";
-App::$strings["Set the background color of comments"] = "Couleur de fond des commentaires";
-App::$strings["Set the border color of comments"] = "Couleur de la bordure des commentaires";
-App::$strings["Set the indent for comments"] = "Indentation des commentaires";
-App::$strings["Set the basic color for item icons"] = "Définir la couleur de base pour les icônes des éléments";
-App::$strings["Set the hover color for item icons"] = "Définir la couleur de survol des icônes des éléments";
-App::$strings["Set font-size for the entire application"] = "Définir la taille de police pour l'application entière";
-App::$strings["Example: 14px"] = "Exemple : 14px";
-App::$strings["Set font-size for posts and comments"] = "Définir la taille de police pour les contributions et commentaires";
-App::$strings["Set font-color for posts and comments"] = "Définir la couleur de police pour les contributions et commentaires";
-App::$strings["Set radius of corners"] = "Définir le rayon des arrondis";
-App::$strings["Set shadow depth of photos"] = "Définir la profondeur de l'ombre des photos";
-App::$strings["Set maximum width of content region in pixel"] = "Définir la largeur maximale de la zone des contenus";
-App::$strings["Leave empty for default width"] = "Laissez vide pour avoir la largeur par défaut";
-App::$strings["Left align page content"] = "Aligner à gauche le contenu de la page";
-App::$strings["Set minimum opacity of nav bar - to hide it"] = "Définir l'opacité minimum du bandeau de navigation - pour le cacher";
-App::$strings["Set size of conversation author photo"] = "Définir la taille de la photo de l'auteur d'une conversation";
-App::$strings["Set size of followup author photos"] = "Définir la taille de la photo de l'auteur d'une réponse";
-App::$strings["Update %s failed. See error logs."] = "La mise-à-jour %s a échoué. Merci de consulter les journaux d'erreur.";
-App::$strings["Update Error at %s"] = "Erreur de mise à jour sur %s";
-App::$strings["Create an account to access services and applications"] = "Créer un compte pour accéder aux services et applications";
-App::$strings["Login/Email"] = "pseudo / email";
-App::$strings["Password"] = "Mot de passe";
-App::$strings["Remember me"] = "Se souvenir de moi";
-App::$strings["Forgot your password?"] = "Mot de passe oublié&nbsp;?";
-App::$strings["toggle mobile"] = "(dés)activer mobile";
-App::$strings["Website SSL certificate is not valid. Please correct."] = "Le certificat SSL n'est pas valide. Corrigez le.";
-App::$strings["[hubzilla] Website SSL error for %s"] = "[hubzilla] Erreur SSL pour %s";
-App::$strings["Cron/Scheduled tasks not running."] = "Les taches planifiées ne tournent pas.";
-App::$strings["[hubzilla] Cron tasks not running on %s"] = "[hubzilla] Les tâches planifiées ne tournent pas sur %s";
diff --git a/view/js/acl.js b/view/js/acl.js
index 4dd60d303..e016158e9 100644
--- a/view/js/acl.js
+++ b/view/js/acl.js
@@ -333,20 +333,20 @@ ACL.prototype.update_view = function(value) {
type = itemid[0];
id = itemid.substr(1);
- btshow = $(this).children(".acl-button-show").removeClass("btn-success").addClass("btn-default");
- bthide = $(this).children(".acl-button-hide").removeClass("btn-danger").addClass("btn-default");
+ btshow = $(this).children(".acl-button-show").removeClass("btn-success").addClass("btn-outline-success");
+ bthide = $(this).children(".acl-button-hide").removeClass("btn-danger").addClass("btn-outline-danger");
switch(type) {
case "g":
var uclass = "";
if (that.allow_gid.indexOf(id)>=0) {
- btshow.removeClass("btn-default").addClass("btn-success");
- bthide.removeClass("btn-danger").addClass("btn-default");
+ btshow.removeClass("btn-outline-success").addClass("btn-success");
+ bthide.removeClass("btn-danger").addClass("btn-outline-danger");
uclass="groupshow";
}
if (that.deny_gid.indexOf(id)>=0) {
- btshow.removeClass("btn-success").addClass("btn-default");
- bthide.removeClass("btn-default").addClass("btn-danger");
+ btshow.removeClass("btn-success").addClass("btn-outline-success");
+ bthide.removeClass("btn-outline-danger").addClass("btn-danger");
uclass = "grouphide";
}
$(that.group_uids[id]).each(function(i, v) {
@@ -366,13 +366,13 @@ ACL.prototype.update_view = function(value) {
case "c":
if (that.allow_cid.indexOf(id)>=0){
if(!$(this).hasClass("grouphide") ) {
- btshow.removeClass("btn-default").addClass("btn-success");
- bthide.removeClass("btn-danger").addClass("btn-default");
+ btshow.removeClass("btn-outline-success").addClass("btn-success");
+ bthide.removeClass("btn-danger").addClass("btn-outline-danger");
}
}
if (that.deny_cid.indexOf(id)>=0){
- btshow.removeClass("btn-success").addClass("btn-default");
- bthide.removeClass("btn-default").addClass("btn-danger");
+ btshow.removeClass("btn-success").addClass("btn-outline-success");
+ bthide.removeClass("btn-outline-danger").addClass("btn-danger");
$(this).removeClass("groupshow");
}
}
diff --git a/view/js/autocomplete.js b/view/js/autocomplete.js
index 5a616b6fc..313e501e2 100644
--- a/view/js/autocomplete.js
+++ b/view/js/autocomplete.js
@@ -60,12 +60,20 @@ function contact_format(item) {
var desc = ((item.label) ? item.nick + ' ' + item.label : item.nick);
if(typeof desc === 'undefined') desc = '';
if(desc) desc = ' ('+desc+')';
- return "<div class='{0}' title='{4}'><img class='dropdown-menu-img-sm' src='{1}'><span class='contactname'>{2}</span><span class='dropdown-sub-text'>{3}</span><div class='clear'></div></div>".format(item.taggable, item.photo, item.name, desc, item.link);
+ return "<div class='{0} dropdown-item dropdown-notification clearfix' title='{4}'><img class='menu-img-2' src='{1}'><span class='contactname'>{2}</span><span class='dropdown-sub-text'>{3}</span></div>".format(item.taggable, item.photo, item.name, desc, item.link);
}
else
return "<div>" + item.text + "</div>";
}
+function smiley_format(item) {
+ return "<div class='dropdown-item'>" + item.icon + ' ' + item.text + "</div>";
+}
+
+function bbco_format(item) {
+ return "<div class='dropdown-item'>" + item + "</div>";
+}
+
function editor_replace(item) {
if(typeof item.replace !== 'undefined') {
return '$1$2' + item.replace;
@@ -181,15 +189,16 @@ function string2bb(element) {
index: 3,
search: function(term, callback) { contact_search(term, callback, backend_url, 'c', extra_channels, spinelement=false); },
replace: editor_replace,
- template: contact_format,
+ template: contact_format
};
smilies = {
match: /(^|\s)(:[a-z_:]{2,})$/,
index: 2,
search: function(term, callback) { $.getJSON('/smilies/json').done(function(data) { callback($.map(data, function(entry) { return entry.text.indexOf(term) === 0 ? entry : null; })); }); },
- template: function(item) { return item.icon + item.text; },
+ //template: function(item) { return item.icon + item.text; },
replace: function(item) { return "$1" + item.text + ' '; },
+ template: smiley_format
};
this.attr('autocomplete','off');
this.textcomplete([contacts,smilies], {className:'acpopup', zIndex:1020});
@@ -321,7 +330,8 @@ function string2bb(element) {
else {
return '\[' + element + '\] ';
}
- }
+ },
+ template: bbco_format
};
this.attr('autocomplete','off');
diff --git a/view/js/main.js b/view/js/main.js
index db7ad110b..38b9754a1 100644
--- a/view/js/main.js
+++ b/view/js/main.js
@@ -369,10 +369,10 @@ function NavUpdate() {
updateCountsOnly = false;
if(data.network || data.home || data.intros || data.mail || data.all_events || data.notify) {
- $('#notifications-btn').css('color', 'white').prop('disabled', false);
+ $('#notifications-btn').css('opacity', 1);
}
else {
- $('#notifications-btn').css('color', 'grey').prop('disabled', true);
+ $('#notifications-btn').css('opacity', 0.5);
$('#navbar-collapse-1').removeClass('in');
}
@@ -939,6 +939,8 @@ function notify_popup_loader(notifyType) {
window.location.href=window.location.href;
}
+ console.log(data);
+
if(data.notify.length == 0){
$("#nav-" + notifyType + "-menu").html(aStr[nothingnew]);
} else {
diff --git a/view/js/mod_cloud.js b/view/js/mod_cloud.js
index 8b8a3ba3f..8af90863e 100644
--- a/view/js/mod_cloud.js
+++ b/view/js/mod_cloud.js
@@ -91,7 +91,7 @@ function prepareHtml(f, i) {
'<td><i class="fa ' + getIconFromType(f.type) + '" title="' + f.type + '"></i></td>' +
'<td>' + f.name + '</td>' +
'<td id="upload-progress-' + i + '"></td><td></td><td></td><td></td><td></td>' +
- '<td class="hidden-xs">' + formatSizeUnits(f.size) + '</td><td class="hidden-xs"></td>' +
+ '<td class="d-none d-md-table-cell">' + formatSizeUnits(f.size) + '</td><td class="d-none d-md-table-cell"></td>' +
'</tr>' +
'<tr id="new-upload-progress-bar-' + i + '" class="new-upload">' +
'<td id="upload-progress-bar-' + i + '" colspan="9" class="upload-progress-bar"></td>' +
diff --git a/view/js/mod_connedit.js b/view/js/mod_connedit.js
index 4739c490c..7100e0d07 100644
--- a/view/js/mod_connedit.js
+++ b/view/js/mod_connedit.js
@@ -82,7 +82,7 @@ $(document).ready(function() {
function doRemove() {
var what = $(this).data('remove');
var element = $(this).parents('div.form-' + what);
- var where = '#abook_edit_form' + $(this).data('id');
+ var where = '#abook-edit-form' + $(this).data('id');
if(what === 'vcard-org' || what === 'vcard-title' || what === 'vcard-note') {
$(where + ' .add-' + what).show()
diff --git a/view/js/mod_network.js b/view/js/mod_network.js
index cd36786df..2899bbacd 100644
--- a/view/js/mod_network.js
+++ b/view/js/mod_network.js
@@ -1,5 +1,4 @@
$(document).ready(function() {
$("#search-text").contact_autocomplete(baseurl + '/search_ac','',true);
- $('.jslider-scale ins').addClass('hidden-xs');
});
diff --git a/view/js/mod_profiles.js b/view/js/mod_profiles.js
index acc9f9953..784f64458 100644
--- a/view/js/mod_profiles.js
+++ b/view/js/mod_profiles.js
@@ -38,7 +38,7 @@ $(document).ready(function() {
var what = $(this).data('add');
var id = $(this).data('id');
var element = '#template-form-' + what;
- var where = '#abook-edit-form';
+ var where = '#profile-edit-form';
$(element + ' .remove-field').attr('data-id', id)
@@ -58,7 +58,7 @@ $(document).ready(function() {
function doRemove() {
var what = $(this).data('remove');
var element = $(this).parents('div.form-' + what);
- var where = '#abook_edit_form' + $(this).data('id');
+ var where = '#profile-edit-form' + $(this).data('id');
if(what === 'vcard-org' || what === 'vcard-title' || what === 'vcard-note') {
$(where + ' .add-' + what).show()
diff --git a/view/nl/hmessages.po b/view/nl/hmessages.po
index c24230de0..df00ee6b1 100644
--- a/view/nl/hmessages.po
+++ b/view/nl/hmessages.po
@@ -1601,54 +1601,60 @@ msgid ""
"domains"
msgstr "Door komma's gescheiden lijst met e-maildomeinen waarvan e-mailadressen op deze hub mogen registeren. Wildcards zijn toegestaan. Laat leeg om alle domeinen toe te laten."
-#: ../../Zotlabs/Module/Dreport.php:97
-msgid "queued"
-msgstr "in wachtrij"
+#: ../../Zotlabs/Module/Admin/Security.php:93
+msgid "Not allowed email domains"
+msgstr "Niet toegestane e-maildomeinen"
-#: ../../Zotlabs/Module/Dreport.php:101
-msgid "posted"
-msgstr "verstuurd"
+#: ../../Zotlabs/Module/Admin/Security.php:93
+msgid ""
+"Comma separated list of domains which are not allowed in email addresses for"
+" registrations to this site. Wildcards are accepted. Empty to allow any "
+"domains, unless allowed domains have been defined."
+msgstr "Door komma's gescheiden lijst met e-maildomeinen waarvan e-mailadressen niet op deze hub mogen registeren. Wildcards zijn toegestaan. Laat leeg om alle domeinen toe te staan, tenzij er toegestane domeinen zijn ingesteld. "
-#: ../../Zotlabs/Module/Dreport.php:105
-msgid "accepted for delivery"
-msgstr "geaccepteerd om afgeleverd te worden"
+#: ../../Zotlabs/Module/Admin/Security.php:94
+msgid "Allow communications only from these sites"
+msgstr "Alleen communicatie met deze hubs toestaan"
-#: ../../Zotlabs/Module/Dreport.php:109
-msgid "updated"
-msgstr "geüpdatet"
+#: ../../Zotlabs/Module/Admin/Security.php:94
+msgid ""
+"One site per line. Leave empty to allow communication from anywhere by "
+"default"
+msgstr "Eén hub per regel. Laat leeg om communicatie standaard met alle hubs toe te staan"
-#: ../../Zotlabs/Module/Dreport.php:112
-msgid "update ignored"
-msgstr "update genegeerd"
+#: ../../Zotlabs/Module/Admin/Security.php:95
+msgid "Block communications from these sites"
+msgstr "Communicatie met deze hubs blokkeren"
-#: ../../Zotlabs/Module/Dreport.php:115
-msgid "permission denied"
-msgstr "toegang geweigerd"
+#: ../../Zotlabs/Module/Admin/Security.php:96
+msgid "Allow communications only from these channels"
+msgstr "Sta alleen communicatie toe met deze kanalen"
-#: ../../Zotlabs/Module/Dreport.php:119
-msgid "recipient not found"
-msgstr "ontvanger niet gevonden"
+#: ../../Zotlabs/Module/Admin/Security.php:96
+msgid ""
+"One channel (hash) per line. Leave empty to allow from any channel by "
+"default"
+msgstr "Eén kanaal (hash) per regel. Laat leeg om communicatie standaard met alle kanalen toe te staan"
-#: ../../Zotlabs/Module/Dreport.php:122
-msgid "mail recalled"
-msgstr "Privébericht ingetrokken"
+#: ../../Zotlabs/Module/Admin/Security.php:97
+msgid "Block communications from these channels"
+msgstr "Communicatie met deze kanalen blokkeren"
-#: ../../Zotlabs/Module/Dreport.php:125
-msgid "duplicate mail received"
-msgstr "dubbel privébericht ontvangen"
+#: ../../Zotlabs/Module/Admin/Security.php:98
+msgid "Only allow embeds from secure (SSL) websites and links."
+msgstr "Alleen ingesloten (embedded) inhoud van veilige (SSL) websites en links toestaan."
-#: ../../Zotlabs/Module/Dreport.php:128
-msgid "mail delivered"
-msgstr "privébericht afgeleverd"
+#: ../../Zotlabs/Module/Admin/Security.php:99
+msgid "Allow unfiltered embedded HTML content only from these domains"
+msgstr "Alleen ongefilterde ingesloten (embedded) HTML van deze websites toestaan"
-#: ../../Zotlabs/Module/Dreport.php:148
-#, php-format
-msgid "Delivery report for %1$s"
-msgstr "Afleveringsrapport voor %1$s"
+#: ../../Zotlabs/Module/Admin/Security.php:99
+msgid "One site per line. By default embedded content is filtered."
+msgstr "Eén website per regel. Standaard wordt ingesloten (embedded) inhoud gefilterd."
-#: ../../Zotlabs/Module/Dreport.php:151
-msgid "Options"
-msgstr "Opties"
+#: ../../Zotlabs/Module/Admin/Security.php:100
+msgid "Block embedded HTML from these domains"
+msgstr "Ingesloten (embedded) HTML vanaf deze domeinen blokkeren"
#: ../../Zotlabs/Module/Admin/Account_edit.php:29
#, php-format
@@ -2705,30 +2711,27 @@ msgid ""
" please import or restore these in date order (oldest first)."
msgstr "Deze back-up-bestanden kunnen geïmporteerd of hersteld worden door op jouw hub en met jouw kanaal <a href=\"%1$s\">%2$s</a> te bezoeken. Voor het beste resultaat kan je de bestanden in chronologische volgorde importeren of herstellen."
-#: ../../Zotlabs/Module/Like.php:421 ../../include/conversation.php:167
-#, php-format
-msgid "%1$s doesn't like %2$s's %3$s"
-msgstr "%1$s vindt %3$s van %2$s niet leuk"
+#: ../../Zotlabs/Module/Editlayout.php:127
+#: ../../Zotlabs/Module/Layouts.php:128 ../../Zotlabs/Module/Layouts.php:188
+msgid "Layout Name"
+msgstr "Naam lay-out"
#: ../../Zotlabs/Module/Editlayout.php:128
#: ../../Zotlabs/Module/Layouts.php:131
msgid "Layout Description (Optional)"
msgstr "Lay-out-omschrijving (niet verplicht)"
-#: ../../Zotlabs/Module/Like.php:425
-#, php-format
-msgid "%1$s doesn't agree with %2$s's %3$s"
-msgstr "%1$s is het niet eens met %2$s's %3$s"
+#: ../../Zotlabs/Module/Editlayout.php:136
+msgid "Edit Layout"
+msgstr "Lay-out bewerken"
-#: ../../Zotlabs/Module/Like.php:427
-#, php-format
-msgid "%1$s abstains from a decision on %2$s's %3$s"
-msgstr "%1$s onthoudt zich van een besluit over %2$s's %3$s"
+#: ../../Zotlabs/Module/Editwebpage.php:142
+msgid "Page link"
+msgstr "Paginalink"
-#: ../../Zotlabs/Module/Like.php:429
-#, php-format
-msgid "%1$s is attending %2$s's %3$s"
-msgstr "%1$s is aanwezig op %2$s's %3$s"
+#: ../../Zotlabs/Module/Editwebpage.php:169
+msgid "Edit Webpage"
+msgstr "Webpagina bewerken"
#: ../../Zotlabs/Module/Apps.php:45 ../../include/nav.php:178
msgid "Apps"
@@ -2795,43 +2798,37 @@ msgstr "Niet in staat om menu aan te maken."
msgid "Menu Name"
msgstr "Menunaam"
-#: ../../Zotlabs/Module/Like.php:539
-msgid "Thank you."
-msgstr "Bedankt"
+#: ../../Zotlabs/Module/Menu.php:98
+msgid "Unique name (not visible on webpage) - required"
+msgstr "Unieke naam vereist (niet zichtbaar op webpagina)"
-#: ../../Zotlabs/Module/Profile_photo.php:186
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:293
-msgid ""
-"Shift-reload the page or clear browser cache if the new photo does not "
-"display immediately."
-msgstr "Vernieuw de pagina met shift+R of shift+F5, of leeg je browserbuffer, wanneer de nieuwe foto niet meteen wordt weergegeven."
+#: ../../Zotlabs/Module/Menu.php:99 ../../Zotlabs/Module/Menu.php:111
+msgid "Menu Title"
+msgstr "Menutitel"
-#: ../../Zotlabs/Module/Profile_photo.php:409
-msgid "Use Photo for Profile"
-msgstr "Als profielfoto gebruiken"
+#: ../../Zotlabs/Module/Menu.php:99
+msgid "Visible on webpage - leave empty for no title"
+msgstr "Zichtbaar op webpagina (leeg laten voor geen titel)"
-#: ../../Zotlabs/Module/Profile_photo.php:409
-msgid "Upload Profile Photo"
-msgstr "Profielfoto uploaden"
+#: ../../Zotlabs/Module/Menu.php:100
+msgid "Allow Bookmarks"
+msgstr "Bladwijzers toestaan"
-#: ../../Zotlabs/Module/Profile_photo.php:410
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:181
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:193
-msgid "Use"
-msgstr "Gebruiken"
+#: ../../Zotlabs/Module/Menu.php:100 ../../Zotlabs/Module/Menu.php:157
+msgid "Menu may be used to store saved bookmarks"
+msgstr "Menu kan gebruikt worden om bladwijzers in op te slaan"
-#: ../../Zotlabs/Module/Search.php:223
-#, php-format
-msgid "Items tagged with: %s"
-msgstr "Items getagd met %s"
+#: ../../Zotlabs/Module/Menu.php:101 ../../Zotlabs/Module/Menu.php:159
+msgid "Submit and proceed"
+msgstr "Opslaan en doorgaan"
#: ../../Zotlabs/Module/Menu.php:107 ../../include/text.php:2289
msgid "Menus"
msgstr "Menu's"
-#: ../../Zotlabs/Module/Common.php:14
-msgid "No channel."
-msgstr "Geen kanaal."
+#: ../../Zotlabs/Module/Menu.php:113 ../../Zotlabs/Module/Locs.php:120
+msgid "Drop"
+msgstr "Verwijderen"
#: ../../Zotlabs/Module/Menu.php:114 ../../Zotlabs/Module/Webpages.php:255
#: ../../Zotlabs/Module/Blocks.php:157 ../../Zotlabs/Module/Layouts.php:190
@@ -2845,63 +2842,62 @@ msgstr "Aangemaakt"
msgid "Edited"
msgstr "Bewerkt"
-#: ../../Zotlabs/Module/Api.php:72 ../../Zotlabs/Module/Api.php:93
-msgid "Authorize application connection"
-msgstr "Geef toestemming voor applicatiekoppeling"
+#: ../../Zotlabs/Module/Menu.php:117
+msgid "Bookmarks allowed"
+msgstr "Bladwijzers toegestaan"
-#: ../../Zotlabs/Module/Api.php:73
-msgid "Return to your app and insert this Security Code:"
-msgstr "Ga terug naar je app en voeg deze beveiligingscode in:"
+#: ../../Zotlabs/Module/Menu.php:119
+msgid "Delete this menu"
+msgstr "Menu verwijderen"
-#: ../../Zotlabs/Module/Api.php:83
-msgid "Please login to continue."
-msgstr "Inloggen om verder te kunnen gaan."
+#: ../../Zotlabs/Module/Menu.php:120 ../../Zotlabs/Module/Menu.php:154
+msgid "Edit menu contents"
+msgstr "Bewerk de inhoud van het menu"
-#: ../../Zotlabs/Module/Api.php:95
-msgid ""
-"Do you want to authorize this application to access your posts and contacts,"
-" and/or create new posts for you?"
-msgstr "Wil je deze applicatie toestemming geven om jouw berichten en connecties te zien, en/of nieuwe berichten voor jou te plaatsen?"
+#: ../../Zotlabs/Module/Menu.php:121
+msgid "Edit this menu"
+msgstr "Dit menu bewerken"
-#: ../../Zotlabs/Module/Ping.php:254
-msgid "sent you a private message"
-msgstr "stuurde jou een privébericht"
+#: ../../Zotlabs/Module/Menu.php:136
+msgid "Menu could not be deleted."
+msgstr "Menu kon niet verwijderd worden."
-#: ../../Zotlabs/Module/Ping.php:302
-msgid "added your channel"
-msgstr "voegde jouw kanaal toe"
+#: ../../Zotlabs/Module/Menu.php:144 ../../Zotlabs/Module/Mitem.php:28
+msgid "Menu not found."
+msgstr "Menu niet gevonden."
-#: ../../Zotlabs/Module/Ping.php:312
-msgid "g A l F d"
-msgstr "G:i, l d F"
+#: ../../Zotlabs/Module/Menu.php:149
+msgid "Edit Menu"
+msgstr "Menu bewerken"
-#: ../../Zotlabs/Module/Ping.php:330
-msgid "[today]"
-msgstr "[vandaag]"
+#: ../../Zotlabs/Module/Menu.php:153
+msgid "Add or remove entries to this menu"
+msgstr "Items aan dit menu toevoegen of verwijder"
-#: ../../Zotlabs/Module/Ping.php:339
-msgid "posted an event"
-msgstr "plaatste een gebeurtenis"
+#: ../../Zotlabs/Module/Menu.php:155
+msgid "Menu name"
+msgstr "Naam van menu"
-#: ../../Zotlabs/Module/Siteinfo.php:20
-msgid "About this site"
-msgstr "Over deze hub"
+#: ../../Zotlabs/Module/Menu.php:155
+msgid "Must be unique, only seen by you"
+msgstr "Moet uniek zijn en is alleen zichtbaar voor jou."
-#: ../../Zotlabs/Module/Siteinfo.php:21
-msgid "Site Name"
-msgstr "Hubnaam"
+#: ../../Zotlabs/Module/Menu.php:156
+msgid "Menu title"
+msgstr "Titel van menu"
-#: ../../Zotlabs/Module/Siteinfo.php:25 ../../include/network.php:1962
-msgid "Administrator"
-msgstr "Beheerder"
+#: ../../Zotlabs/Module/Menu.php:156
+msgid "Menu title as seen by others"
+msgstr "Titel van menu zoals anderen dat zien."
-#: ../../Zotlabs/Module/Siteinfo.php:28
-msgid "Software and Project information"
-msgstr "Software- en projectinformatie"
+#: ../../Zotlabs/Module/Menu.php:157
+msgid "Allow bookmarks"
+msgstr "Bladwijzers toestaan"
-#: ../../Zotlabs/Module/Siteinfo.php:29
-msgid "This site is powered by $Projectname"
-msgstr "Dit is een $Projectname-hub"
+#: ../../Zotlabs/Module/Menu.php:166 ../../Zotlabs/Module/Mitem.php:120
+#: ../../Zotlabs/Module/Xchan.php:41
+msgid "Not found."
+msgstr "Niet gevonden."
#: ../../Zotlabs/Module/Rpost.php:138 ../../Zotlabs/Module/Editpost.php:108
msgid "Edit post"
@@ -2967,44 +2963,43 @@ msgstr "Gebruik dit formulier om de locatie te verwijderen wanneer de hub van de
msgid "Public Hubs"
msgstr "Openbare hubs"
-#: ../../Zotlabs/Module/Lostpass.php:130
-msgid "Forgot your Password?"
-msgstr "Wachtwoord vergeten?"
-
-#: ../../Zotlabs/Module/Lostpass.php:131
+#: ../../Zotlabs/Module/Pubsites.php:27
msgid ""
-"Enter your email address and submit to have your password reset. Then check "
-"your email for further instructions."
-msgstr "Voer je e-mailadres in en verstuur deze om je wachtwoord opnieuw in te stellen. Controleer hierna hier je e-mail voor verdere instructies."
+"The listed hubs allow public registration for the $Projectname network. All "
+"hubs in the network are interlinked so membership on any of them conveys "
+"membership in the network as a whole. Some hubs may require subscription or "
+"provide tiered service plans. The hub itself <strong>may</strong> provide "
+"additional details."
+msgstr "Op de hier weergegeven hubs kan iedereen zich voor het $Projectname-netwerk aanmelden. Alle hubs in het netwerk zijn met elkaar verbonden, dus maakt het qua lidmaatschap niet uit waar je je aanmeldt. Op sommige hubs heb je eerst goedkeuring nodig en sommige hubs vereisen een financiële tegemoetkoming voor bepaalde uitbreidingen. <strong>Mogelijk</strong> wordt hierover op de hub zelf meer informatie gegeven."
-#: ../../Zotlabs/Module/Lostpass.php:132
-msgid "Email Address"
-msgstr "E-mailadres"
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Hub URL"
+msgstr "Hub-URL"
-#: ../../Zotlabs/Module/Lostpass.php:133
-msgid "Reset"
-msgstr "Opnieuw instellen"
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Access Type"
+msgstr "Toegangs-<br/>&nbsp;type"
-#: ../../Zotlabs/Module/Rbmark.php:94
-msgid "Select a bookmark folder"
-msgstr "Kies een bladwijzermap"
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Registration Policy"
+msgstr "Registratie-<br/>&nbsp;beleid"
-#: ../../Zotlabs/Module/Rbmark.php:99
-msgid "Save Bookmark"
-msgstr "Bladwijzer opslaan"
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Stats"
+msgstr "Stats"
-#: ../../Zotlabs/Module/Rbmark.php:100
-msgid "URL of bookmark"
-msgstr "URL van bladwijzer"
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Software"
+msgstr "Software"
#: ../../Zotlabs/Module/Pubsites.php:35 ../../Zotlabs/Module/Ratings.php:97
#: ../../include/conversation.php:941 ../../include/conversation.php:1099
msgid "Ratings"
msgstr "Beoordelingen"
-#: ../../Zotlabs/Module/Dirsearch.php:33
-msgid "This directory server requires an access token"
-msgstr "Deze kanalengidshub (directoryserver) heeft een toegangs-token nodig"
+#: ../../Zotlabs/Module/Pubsites.php:48
+msgid "Rate"
+msgstr "Beoordeel"
#: ../../Zotlabs/Module/Pubsites.php:59 ../../Zotlabs/Module/Events.php:694
#: ../../Zotlabs/Module/Webpages.php:250 ../../Zotlabs/Module/Blocks.php:166
diff --git a/view/nl/hstrings.php b/view/nl/hstrings.php
index 734ab7adb..c221f6670 100644
--- a/view/nl/hstrings.php
+++ b/view/nl/hstrings.php
@@ -867,10 +867,6 @@ App::$strings["layout"] = "lay-out";
App::$strings["menu"] = "menu";
App::$strings["%s element installed"] = "%s onderdeel geïnstalleerd";
App::$strings["%s element installation failed"] = "Installatie %s-element mislukt";
-App::$strings["Nothing to import."] = "Niets gevonden om te importeren";
-App::$strings["Unable to download data from old server"] = "Niet in staat om gegevens van de oude hub te downloaden";
-App::$strings["Imported file is empty."] = "Geïmporteerde bestand is leeg";
-App::$strings["Warning: Database versions differ by %1\$d updates."] = "Waarschuwing: database-versies lopen %1\$d updates achter.";
App::$strings["Import completed"] = "Importeren voltooid";
App::$strings["Import Items"] = "Importeer items";
App::$strings["Use this form to import existing posts and content from an export file."] = "Gebruik dit formulier om bestaande berichten en andere inhoud vanuit een exportbestand te importeren.";
diff --git a/view/php/default.php b/view/php/default.php
index 373fa2fd0..e4553a17f 100644
--- a/view/php/default.php
+++ b/view/php/default.php
@@ -8,14 +8,14 @@
<body <?php if($page['direction']) echo 'dir="rtl"' ?> >
<?php if(x($page,'banner')) echo $page['banner']; ?>
<header><?php if(x($page,'header')) echo $page['header']; ?></header>
- <nav class="navbar navbar-inverse navbar-fixed-top" role="navigation"><?php if(x($page,'nav')) echo $page['nav']; ?></nav>
+ <nav class="navbar fixed-top navbar-expand-md navbar-inverse bg-inverse"><?php if(x($page,'nav')) echo $page['nav']; ?></nav>
<main>
<aside id="region_1"><div id="left_aside_spacer"><div id="left_aside_wrapper"><?php if(x($page,'aside')) echo $page['aside']; ?></div></div></aside>
<section id="region_2"><?php if(x($page,'content')) echo $page['content']; ?>
<div id="page-footer"></div>
<div id="pause"></div>
</section>
- <aside id="region_3" class="hidden-sm hidden-xs hidden-md"><?php if(x($page,'right_aside')) echo $page['right_aside']; ?></aside>
+ <aside id="region_3" class="d-none d-xl-table-cell"><?php if(x($page,'right_aside')) echo $page['right_aside']; ?></aside>
</main>
<footer><?php if(x($page,'footer')) echo $page['footer']; ?></footer>
</body>
diff --git a/view/php/full.php b/view/php/full.php
index 9cf567a67..64e32c5bd 100644
--- a/view/php/full.php
+++ b/view/php/full.php
@@ -7,7 +7,7 @@
</head>
<body>
<header><?php if(x($page,'header')) echo $page['header']; ?></header>
- <nav class="navbar navbar-inverse navbar-fixed-top" role="navigation"><?php if(x($page,'nav')) echo $page['nav']; ?></nav>
+ <nav class="navbar fixed-top navbar-expand-md navbar-inverse bg-inverse"><?php if(x($page,'nav')) echo $page['nav']; ?></nav>
<section><?php if(x($page,'content')) echo $page['content']; ?>
<div id="page-footer"></div>
</section>
diff --git a/view/theme/redbasic/css/narrow_navbar.css b/view/theme/redbasic/css/narrow_navbar.css
index 689b67168..99f083638 100644
--- a/view/theme/redbasic/css/narrow_navbar.css
+++ b/view/theme/redbasic/css/narrow_navbar.css
@@ -1,64 +1,30 @@
-@media screen and (min-width: 760px) {
+@media screen and (min-width: 767px) {
- aside {
- padding-top: 52px;
- }
-
- section {
- padding-top: 52px;
- }
-
- .navbar-nav > li > a {
- padding-top:7px !important;
- padding-bottom:3px !important;
+ nav.navbar {
+ padding-top: 1px;
+ padding-bottom: 1px
}
- .navbar {
- min-height:25px !important;
+ nav .badge {
+ top: 0px;
+ left: -0.25rem;
}
- nav .navbar-header img {
- height: 29px;
- width: 29px;
- margin-top: 1px;
- border-radius: 4px;
- }
-
- .navbar-left {
- height: 29px;
- }
-
- .container-fluid {
- min-height:29px;
- }
-
- .collapse .navbar-collapse {
- min-height:29px;
- }
-
- #nav-search-text {
- margin:6px 15px 4px 15px;
- }
-
- #nav-search-spinner {
- margin: 16px 0px 0px 25px;
+ .contextual-help-content-open {
+ top: 2.5rem;
}
- header #banner {
- margin-top:5px;
+ aside {
+ padding-top: 3.5rem;
}
- nav .dropdown-menu,
- nav .acpopup {
- top: 30px !important;
+ section {
+ padding-top: 3.5rem;
}
#jGrowl.top-right {
- top: 30px;
+ top: 3.5rem;
right: 15px;
}
- .contextual-help-content-open {
- top: 31px;
- }
}
diff --git a/view/theme/redbasic/css/style.css b/view/theme/redbasic/css/style.css
index 1a38c7f01..faa292fe5 100644
--- a/view/theme/redbasic/css/style.css
+++ b/view/theme/redbasic/css/style.css
@@ -8,13 +8,11 @@
/* generals */
html {
- font-size: 100%;
- overflow-x: hidden;
+ font-size: $font_size;
}
body {
- font-family: sans-serif, arial, freesans;
- font-size: $body_font_size;
+ font-size: 0.9rem;
background-color: $bgcolour;
background-image: url('$background_image');
background-attachment: fixed;
@@ -55,30 +53,41 @@ main {
}
h1, .h1 {
- font-size: 2em;
+ font-size: 2rem;
}
h2, .h2 {
- font-size: 1.667em;
+ font-size: 1.6rem;
}
h3, .h3 {
- font-size: 1.334em;
+ font-size: 1.2rem;
}
h4, .h4 {
- font-size: 1em;
- font-weight: bold;
+ font-size: 1.05rem;
}
h5, .h5 {
- font-size: 1em;
+ font-size: 0.9rem;
}
h6, .h6 {
- font-size: 0.75em;
+ font-size: 0.75rem;
+}
+
+#banner {
+ color: $banner_colour;
+ font-weight: bold;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
}
+#banner img {
+ max-height: 1.35rem;
+ width: auto;
+}
.jslider {
font-family: sans-serif, arial, freesans;
@@ -89,10 +98,6 @@ abbr {
}
/* icons */
-.tool-icons,
-.cat-icons {
- color: $toolicon_colour;
-}
a,
.fakelink {
@@ -110,34 +115,8 @@ a:focus,
cursor: pointer;
}
-input[type="text"],
-input[type="password"],
-input[type="submit"],
-input[type="file"],
-select,
-textarea {
- font-family: sans-serif, arial, freesans;
- font-size: $body_font_size;
-}
-
-input {
- padding: 5px;
- line-height: 1.5;
- border: 1px solid #ccc;
- -moz-border-radius: $radiuspx;
- border-radius: $radiuspx;
-}
-
-input[type="submit"] {
- background-color: #F0F0F0;
- font-weight: bold;
- color: #0080FF;
- text-decoration: none;
- padding: 6px 12px;
-}
-
input, optgroup, select, textarea {
- color: #333;
+ font-size: 0.9rem !important;
resize: vertical;
}
@@ -174,8 +153,7 @@ pre {
color: #FF0000;
}
-nav,
-header {
+nav {
opacity: $nav_float_min_opacity;
filter:alpha(opacity=$nav_percent_min_opacity);
}
@@ -201,49 +179,8 @@ header {
padding: 10px;
}
-nav #banner #logo-text a {
- font-size: 40px;
- font-weight: bold;
- margin-left: 3px;
- color: #000000;
-
-}
-nav #banner #logo-text a:hover { text-decoration: none; }
-
.nav-channel-select { margin-left: 8px; }
-header #banner {
- z-index: 1040;
- margin-top: 14px;
- text-align: center;
- text-shadow: 1px 1px 2px rgba(0,0,0,.5);
- font-size: 14px;
- font-family: tahoma, "Lucida Sans", sans;
- color: $banner_colour;
- font-weight: bold;
- whitespace: nowrap;
-}
-
-header #banner a,
-header #banner a:active,
-header #banner a:visited,
-header #banner a:link,
-header #banner a:hover {
- color: $banner_colour;
- text-decoration: none;
- outline: none;
- vertical-align: bottom;
-}
-
-header #banner #logo-img {
- height: 22px;
- margin-top: 5px;
-}
-
-header #banner #logo-text {
- font-size: 22px;
-}
-
/* contextual help */
.contextual-help-content {
display: none;
@@ -253,12 +190,12 @@ header #banner #logo-text {
.contextual-help-content-open {
display: block;
position: fixed;
- top: 51px;
+ top: 3.35rem;
left: 0px;
width: 100%;
max-height: 50%;
background: $comment_item_colour;
- padding: 20px;
+ padding: 1rem;
border-bottom: #ccc 1px solid;
overflow: auto;
-moz-box-shadow: 0px 3px 3px rgba(0,0,0,0.2);
@@ -273,18 +210,18 @@ header #banner #logo-text {
.contextual-help-tool {
padding: 7px;
filter: alpha(opacity=20);
- opacity: .2;
+ opacity: .5;
}
.contextual-help-tool:hover {
filter: alpha(opacity=50);
- opacity: .5;
+ opacity: 1;
text-decoration: none;
}
.contextual-help-tool i {
- color: #000;
- font-size: 16px;
+ color: $font_colour;
+ font-size: 1.05rem;
}
/* contextual help end */
@@ -322,21 +259,6 @@ footer {
margin: 15px 0px;
}
-/*TODO: we should use one class for all this. */
-
-.group-selected,
-.fileas-selected,
-.categories-selected,
-.search-selected,
-.active,
-.group-selected:hover,
-.fileas-selected:hover,
-.categories-selected:hover,
-.search-selected:hover,
-.active:hover {
- color: $font_colour;
-}
-
#cropimage-wrapper, #cropimage-preview-wrapper {
float: left;
padding: 30px;
@@ -349,7 +271,7 @@ footer {
.fn {
font-weight: bold;
- font-size: 16px;
+ font-size: 1rem;
color: #444444;
}
@@ -358,9 +280,7 @@ footer {
padding: 0px 10px 10px 10px;
background-color: rgba(254,254,254,0.5);
border: 1px solid rgba(254,254,254,0.5);
- -moz-border-radius: $radiuspx;
- -webkit-border-radius: $radiuspx;
- border-radius: $radiuspx;
+ border-radius: $radius;
word-wrap: break-word;
}
@@ -387,10 +307,6 @@ footer {
filter:alpha(opacity=100);
}
-#view-contact-end {
- clear: both;
-}
-
#profile-photo-wrapper img {
width: 100%;
height: 100%;
@@ -402,7 +318,7 @@ footer {
width: 251px;
height: 251px;
margin-bottom: 10px;
- border-radius: $radiuspx;
+ border-radius: $radius;
}
#hide-friends-yes-label,
@@ -456,8 +372,7 @@ footer {
.photo,
.contact-block-img {
- border-radius: $radiuspx;
- -moz-border-radius: $radiuspx;
+ border-radius: $radius;
box-shadow: $shadowpx $shadowpx $shadowpx 0 #444444;
}
@@ -471,8 +386,7 @@ footer {
.profile-match-photo img,
.directory-photo-img {
- border-radius: $radiuspx;
- -moz-border-radius: $radiuspx;
+ border-radius: $radius;
box-shadow: $shadowpx $shadowpx $shadowpx 0 #444444;
}
@@ -531,10 +445,6 @@ footer {
height: 34px;
}
-#contact-block-end {
- clear: both;
-}
-
.contact-block-img {
width:47px;
height:47px;
@@ -558,47 +468,22 @@ footer {
}
.wall-item-conv {
- padding: 7px 10px;
background-color: $comment_item_colour;
}
-
-#conversation-end {
- clear: both;
-}
-
#nav-notifications-template {
display: none;
}
-#nav-searchbar {
- float: right;
- margin-top: 2px;
- margin-right: 10px;
-}
-
#nav-search-spinner {
- float: left;
- margin: 25px 0px 0px 25px;
- color: $nav_active_icon_colour;
+ float: right;
+ margin-top: -0.85rem;
+ margin-right: 1.6rem;
}
-#nav-search-text:hover,
-#nav-search-text:focus {
- background-color: #fff;
- color: #000;
-}
#nav-search-text {
- font-size: 12px;
- width: 200px;
- height: 20px;
- margin: 15px;
- padding: 0px 5px 0px 5px;
- border-radius: $radiuspx;
- border-color: $nav_bd;
- background-color: #eee;
- transition: background-color 300ms ease 0s;
+ width: 280px;
}
#nav-search-text::-webkit-input-placeholder {
@@ -610,7 +495,7 @@ footer {
}
nav .acpopup {
- top: 50px !important;
+ top: 46px !important;
margin-left: -35px;
width: 290px;
}
@@ -647,7 +532,7 @@ nav .acpopup {
#cboxContent {
padding: 3px;
border: 0px solid #fff;
- border-radius: $radiuspx;
+ border-radius: $radius;
background-color: #fff;
z-index: 1052;
}
@@ -670,11 +555,6 @@ nav .acpopup {
text-align: center;
}
-.profile-match-break,
-.profile-match-end {
- clear: both;
-}
-
.profile-match-connect {
text-align: center;
font-weight: bold;
@@ -693,9 +573,6 @@ nav .acpopup {
float: right;
}
-#profile-match-wrapper-end {
- clear: both;
-}
.side-link {
margin-bottom: 15px;
}
@@ -708,10 +585,6 @@ nav .acpopup {
border: 1px solid #ddd;
}
-#group-members-end {
- clear: both;
-}
-
#group-separator {
margin-top: 10px;
margin-bottom: 10px;
@@ -724,11 +597,6 @@ nav .acpopup {
border: 1px solid #ddd;
}
-#group-all-contacts-end {
- clear: both;
- margin-bottom: 10px;
-}
-
#group-edit-desc {
margin-top: 15px;
}
@@ -742,10 +610,6 @@ nav .acpopup {
border: 1px solid #ddd;
}
-#prof-members-end {
- clear: both;
-}
-
#prof-separator {
margin-top: 10px;
margin-bottom: 10px;
@@ -758,11 +622,6 @@ nav .acpopup {
border: 1px solid #ddd;
}
-#prof-all-contacts-end {
- clear: both;
- margin-bottom: 10px;
-}
-
#prof-edit-desc {
margin-top: 15px;
}
@@ -776,10 +635,6 @@ nav .acpopup {
width: 80px;
margin-right: 15px;
}
-.notification-listing-end {
- clear: both;
- margin-bottom: 15px;
-}
/**
* OAuth
@@ -829,7 +684,7 @@ div.jGrowl div.info {
padding-left: 58px;
}
#jGrowl.top-right {
- top: 65px;
+ top: 4.5rem;
right: 15px;
}
@@ -837,142 +692,38 @@ div.jGrowl div.jGrowl-notification {
min-height: 60px;
}
-#id_term_label {
- width:75px;
-}
-#id_term {
- width:100px;
-}
-
-#nav-search-text-ac .autocomplete {
- position: fixed;
- top: 51px;
- border: 1px solid $nav_bd;
- border-top: none;
-}
-
-#recip-ac .autocomplete,
-#poke-recip-ac .autocomplete,
-#id-name-ac .autocomplete,
-#contact-search-ac .autocomplete {
- margin-top: 2px;
- margin-left: $radiuspx;
- margin-right: $radiuspx;
- border: 1px solid #666;
- border-top: none;
-
-}
-
-.autocomplete {
- color: $font_colour;
- cursor: pointer;
- text-align: left;
- max-height: 350px;
- overflow: auto;
- border-bottom-left-radius: $radiuspx;
- border-bottom-right-radius: $radiuspx;
-}
-
-.autocomplete .selected {
- background: #eee;
-}
-
-.autocomplete div {
- padding: 2px 5px;
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
-}
-
.jslider .jslider-scale ins {
color: #333;
- font-size: $body_font_size;
+ font-size: 0.9rem;
width: 100px;
text-align: center;
}
-a.rconnect, a.rateme, div.rateme {
- color: $nav_active_icon_colour;
- text-decoration: none;
- font-weight: normal;
- outline: none;
-}
-
-a.rconnect:hover, a.rateme:hover, div.rateme:hover {
- color: #0080FF;
- text-decoration: none;
-}
-
-.widget.rateme {
- margin-top: 15px;
- padding: 0;
-}
-
-.widget .conv-participants {
+.conv-participants {
color: $font_colour;
}
-.notif-item a {
- color: #000;
-}
-
-.notif-item a:hover {
- text-decoration: underline;
- color: #000;
-}
-
-.notif-image {
- width: 32px;
- height: 32px;
- padding: 7px 7px 0px 0px;
-}
-
.contactname {
- padding-top: 2px;
font-weight: bold;
- line-height: 1em;
- white-space: nowrap;
+ display: block;
overflow: hidden;
text-overflow: ellipsis;
- display: block;
}
-.dropdown-sub-text {
- line-height: 1em;
+.dropdown-notification,
+.member-item {
+ line-height: 1.1em;
+ font-size: 0.75rem;
overflow: hidden;
text-overflow: ellipsis;
display: block;
}
-.notify-seen a {
- background: #ddd;
-}
-
#page-spinner {
color: #777;
margin: 24px;
}
-.tabs-end {
- clear: both;
-}
-
-.modal-header .contextual-help-tool {
- /* Mostly duplicating ".modal-header .close" and ".close" layout settings from bootstrap */
- float: right;
- font-size: 21px;
- padding: 0;
- margin-top: -4px;
- margin-right: 15px;
- line-height: 1;
-}
-
-#acl-search {
- padding: 4px;
- border: 1px solid #ccc;
- width: 100%;
-}
-
#acl-search::-webkit-input-placeholder {
/* non-fontawesome fonts set a fallback for text parts of the placeholder*/
font-family: FontAwesome, sans-serif, arial, freesans;
@@ -983,59 +734,17 @@ a.rconnect:hover, a.rateme:hover, div.rateme:hover {
font-family: FontAwesome, sans-serif, arial, freesans;
}
-#aclModal .modal-body {
- padding-top: 10px;
-}
-
-#acl-showlimited-description {
- font-size: 90%;
- color: #888;
- margin-left: 10px;
- margin-bottom: 4px;
-}
-
-#acl-list {
- border: 1px solid #ccc;
- -webkit-border-radius: $radiuspx ;
- -moz-border-radius: $radiuspx;
- border-radius: $radiuspx;
-}
-
-#acl-search-wrapper {
- padding: 7px 10px;
- background-color: $item_colour;
- border-top-left-radius: $radiuspx;
- border-top-right-radius: $radiuspx;
- border-bottom: 1px solid #ccc;
-}
-
-#acl-list-content-wrapper {
- display: block;
- overflow: auto;
- clear: both;
- min-height: 62px;
- padding: 10px 10px 0px 0px;
-
-}
-
-#jotnets-wrapper, #jotnets-collapse {
- margin-bottom: 18px;
-}
-
-#jot-preview-content {
- margin-top: 10px;
-}
.acl-list-item {
- width: 48%; /* fallback if browser does not support calc() */
- width: calc(50% - 10px);
+ width: 100%;
+ padding: 0.5rem;
+ margin-bottom: 0.5rem;
border: 1px solid #ccc;
- margin: 0px 0px 10px 10px;
- padding: 5px;
float: left;
- -webkit-border-radius: $radiuspx ;
- -moz-border-radius: $radiuspx;
- border-radius: $radiuspx;
- background-color: white;
+ border-radius: $radius;
+}
+
+.acl-item-header {
+ width: 100%;
}
.acl-list-item.grouphide {
@@ -1046,66 +755,20 @@ a.rconnect:hover, a.rateme:hover, div.rateme:hover {
border: 1px solid green;
}
-.acl-list-item img {
- width: 40px;
- height: 40px;
- float: left;
- margin-right: 5px;
- -webkit-border-radius: $radiuspx ;
- -moz-border-radius: $radiuspx;
- border-radius: $radiuspx;
-}
-
.acl-list-item.taggable {
background-color: #ddddff;
}
-.acl-list-item p {
- font-size: $font_size;
- margin: 0px;
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
-}
-
.acl-button-show,
.acl-button-hide {
float: right;
margin-left: 5px;
}
-#acl-showlimited-caption,
-#acl-showall-caption {
- font-size: 115%;
-}
-
-#acl-radiowrapper-showall {
- margin-top: 20px;
- margin-bottom: 20px;
-}
-#acl-radiowrapper-showlimited {
- margin-bottom: 0;
-}
-
-#acl-showall + i {
- font-size: 140%;
-}
-
-#acl-info-icon,
-#acl-info-icon:active {
- font-size: 110%;
- color: $link_colour;
- text-decoration: none;
-}
-
-#acl-showall-caption {
- margin-left: 0.35em;
-}
-
.contact-block-content {
margin-top: 10px;
}
-.contact-block-img.archived, .app-deleted {
+.contact-block-img.archived, .app-deleted, .dim {
opacity: 0.3;
filter:alpha(opacity=30);
}
@@ -1115,7 +778,7 @@ a.rconnect:hover, a.rateme:hover, div.rateme:hover {
.reshared-content { margin-left: 20px; }
.shared_header img {
- border-radius: $radiuspx;
+ border-radius: $radius;
margin-right: 10px;
}
@@ -1181,36 +844,39 @@ margin-right: 50px;
list-style-type: none;
}
-.generic-icons {
- font-size: 1.2em;
- color: $toolicon_colour;
- margin-right: 7px;
+.generic-icons,
+a .generic-icons {
+ font-size: 1rem;
+ margin-right: 0.5rem;
+ color: $font_colour;
}
-.generic-icons:hover {
- color: $toolicon_colour;
+.generic-icons:hover,
+a .generic-icons:hover {
+ color: $font_colour;
}
-.generic-icons-nav {
- font-size: 1.2em;
- margin-right: 7px;
+.generic-icons-right {
+ font-size: 1rem;
+ margin-left: 0.5rem;
+ color: $font_colour;
}
-nav .navbar-collapse.in .generic-icons,
-nav .navbar-collapse.collapsing .generic-icons {
- color: $nav_active_icon_colour;
+
+.generic-icons-nav {
+ font-size: 1rem;
+ margin-right: 7px;
}
.admin-icons {
font-size: 1.2em;
- color: $toolicon_colour;
margin-right: 7px;
}
.drop-icons,
a .drop-icons {
- color: $toolicon_colour;
- font-size: 1.2em;
+ font-size: 1rem;
+ color: $font_colour;
text-decoration: none;
cursor: pointer;
}
@@ -1220,7 +886,8 @@ a .drop-icons:hover {
color: #FF0000;
}
-.lockview {
+.lockview,
+.sys-apps-toggle {
cursor: pointer;
}
@@ -1255,8 +922,7 @@ th,td {
/* mail */
img.mail-conv-sender-photo {
- -moz-border-radius: $radiuspx;
- border-radius: $radiuspx;
+ border-radius: $radius;
}
/* jot */
@@ -1273,25 +939,23 @@ img.mail-conv-sender-photo {
font-weight: bold;
}
-
-
#profile-jot-wrapper {
background-color: rgba(254,254,254,1);
border: 1px solid #ccc;
- border-radius: $radiuspx;
+ border-radius: $radius;
}
#profile-jot-text {
- border-radius: $radiuspx;
+ border-radius: $radius;
}
#profile-jot-text::-webkit-input-placeholder {
- font-size: 16px;
+ font-size: 1.2rem;
}
#profile-jot-text::-moz-placeholder {
- font-size: 16px;
+ font-size: 1.2rem;
}
#profile-jot-text:focus::-webkit-input-placeholder {
@@ -1311,48 +975,41 @@ img.mail-conv-sender-photo {
color: #777;
}
-.jot-icons {
- color: $toolicon_colour;
-}
-
.jot-icons.jot-lock-warn {
color: darkorange;
}
/* conversation */
-.nsfw-wrap {
- text-align: center;
- font-size: $body_font_size;
+
+.top-radius {
+ border-top-right-radius: $radius;
+ border-top-left-radius: $radius;
}
.wall-event-item {
padding: 10px;
color: #fff;
background-color: #3A87AD; /* should reflect calendar color */
- border-top-left-radius: $radiuspx;
- border-top-right-radius: $radiuspx;
+ border-top-left-radius: $radius;
+ border-top-right-radius: $radius;
}
.wall-photo-item img {
max-width: 100% !important;
- border-top-right-radius: $radiuspx;
- border-top-left-radius: $radiuspx;
-}
-
-.wall-item-title {
- font-size: $font_size;
+ border-top-right-radius: $radius;
+ border-top-left-radius: $radius;
}
.wall-item-footer {
- font-size: $body_font_size;
+ font-size: 0.75rem;
margin-top: 2em;
}
.wall-item-content-wrapper {
background-color: $item_colour;
- border-top-right-radius: $radiuspx;
- border-top-left-radius: $radiuspx;
+ border-top-right-radius: $radius;
+ border-top-left-radius: $radius;
}
.wall-item-content-wrapper.comment {
@@ -1379,8 +1036,8 @@ img.mail-conv-sender-photo {
padding: 7px 10px;
background-color: $item_colour;
border-radius: 0px;
- border-bottom-right-radius: $radiuspx;
- border-bottom-left-radius: $radiuspx;
+ border-bottom-right-radius: $radius;
+ border-bottom-left-radius: $radius;
border-top: 3px solid $comment_item_colour;
}
@@ -1388,37 +1045,23 @@ img.mail-conv-sender-photo {
border-top: 0px solid $comment_item_colour;
}
-.wall-item-like,
-.wall-item-dislike {
- font-size: 11px;
-}
.wall-item-photo {
+ width: $top_photo;
+ height: $top_photo;
border: none;
- width: $top_photo !important;
- height: $top_photo !important;
-
+ border-radius: $radius;
+ box-shadow: $shadowpx $shadowpx $shadowpx 0 #444444;
}
.comment .wall-item-photo {
- width: $reply_photo !important;
- height: $reply_photo !important;
-}
-
-.wall-item-photo {
- border-radius: $radiuspx;
- -moz-border-radius: $radiuspx;
- box-shadow: $shadowpx $shadowpx $shadowpx 0 #444444;
+ width: $reply_photo;
+ height: $reply_photo;
}
.wall-item-ago,
.dropdown-sub-text {
color: #777;
- font-size: 0.833em;
-}
-
-.wall-item-ago i {
- font-size: 0.833em;
}
.wall-item-content,
@@ -1426,37 +1069,18 @@ img.mail-conv-sender-photo {
.page-body,
.chat-item-text,
.chat-item-text-self {
- font-size: $font_size;
- clear: both;
-}
-
-.item-tool {
- font-size: 1.2em;
- color: $toolicon_colour;
+ font-size: 1rem;
}
-.like-rotator {
- color: $toolicon_colour;
-}
-
-.comment-icon {
- font-size: 0.833em;
- color: $toolicon_colour;
-}
.comment-edit-text-empty,
.comment-edit-text-full {
border: 1px solid #ccc;
- border-radius: $radiuspx;
+ border-radius: $radius;
}
.comment-edit-text-empty {
color: gray;
- font-size: 12px;
-}
-
-.comment-edit-text-full {
- color: black;
}
.divgrow-showmore {
@@ -1478,19 +1102,12 @@ img.mail-conv-sender-photo {
.widget {
background-color: rgba(254,254,254,.5);
border: 1px solid rgba(254,254,254,.5);
- -moz-border-radius: $radiuspx;
- -webkit-border-radius: $radiuspx;
- border-radius: $radiuspx;
-}
-
-.widget h3 {
- color: $toolicon_colour;
+ border-radius: $radius;
}
#note-text {
border: 1px solid #ccc;
- border-radius: $radiuspx;
- -moz-border-radius: $radiuspx;
+ border-radius: $radius;
}
.fileas-ul {
@@ -1499,8 +1116,7 @@ img.mail-conv-sender-photo {
#datebrowse-sidebar select {
border: 1px solid #ccc;
- border-radius: $radiuspx;
- -moz-border-radius: $radiuspx;
+ border-radius: $radius;
}
.thing-show img {
@@ -1522,63 +1138,50 @@ img.mail-conv-sender-photo {
.chat-item-photo,
.chat-item-photo-self {
- border-radius: $radiuspx;
+ border-radius: $radius;
}
.chat-item-title,
.chat-item-title-self {
- border-radius: $radiuspx;
+ border-radius: $radius;
background-color: $item_colour;
}
#chatMembers img {
- border-radius: $radiuspx;
-}
-
-/* nav bootstrap */
-
-nav img {
- border-radius: $radiuspx;
+ border-radius: $radius;
}
-nav .dropdown-menu {
- font-size: $body_font_size;
- border-top-right-radius: 0px;
- border-top-left-radius: 0px;
- border-bottom-right-radius: $radiuspx;
- border-bottom-left-radius: $radiuspx;
-}
-
-.dropdown-menu > .active > a,
-.dropdown-menu > .active > a:focus,
-.dropdown-menu > .active > a:hover {
- color: #333;
- background-color: #f5f5f5;
-}
-
-.dropdown-menu-img-sm {
- float: left;
- width: 36px;
- height: 36px;
+.menu-img-3 {
+ width: 3.3em;
+ height: 3.3em;
margin-right: 5px;
+ border-radius: $radius;
+ float: left;
}
-.dropdown-menu-img-xs {
- height: 18px;
- width: 18px;
+.menu-img-2 {
+ height: 2.2em;
+ width: 2.2em;
margin-right: 5px;
+ border-radius: $radius;
+ float: left;
}
-#usermenu-caret {
- color: $nav_icon_colour;
+.menu-img-1 {
+ height: 1.5em;
+ width: 1.5em;
+ margin-right: 5px;
+ border-radius: $radius;
}
-.usermenu-head {
- float: left;
+.usermenu {
+ width: 3.75rem;
}
-.usermenu-head:hover #usermenu-caret {
- color: $nav_active_icon_colour;
+#avatar {
+ width: 2.35rem;
+ height: 2.35rem;
+ border-radius: $radius;
}
.page-title {
@@ -1588,20 +1191,20 @@ nav .dropdown-menu {
.generic-content-wrapper-styled {
background-color: $bgcolour;
padding: 10px;
- border-radius: $radiuspx;
+ border-radius: $radius;
}
.generic-content-wrapper {
border: 1px solid #ccc;
box-shadow: 0px 0px 5px 1px rgba(0,0,0,0.2);
- border-radius: $radiuspx;
+ border-radius: $radius;
}
.section-title-wrapper {
padding: 7px 10px;
background-color: $item_colour;
- border-top-left-radius: $radiuspx;
- border-top-right-radius: $radiuspx;
+ border-top-left-radius: $radius;
+ border-top-right-radius: $radius;
border-bottom: 3px solid $comment_item_colour;
}
@@ -1614,8 +1217,12 @@ nav .dropdown-menu {
text-overflow: ellipsis;
}
+.section-subtitle-wrapper h3 {
+ padding: 3px;
+}
+
.section-subtitle-wrapper {
- padding: 7px 10px;
+ padding: 4px 10px;
background-color: $item_colour;
border-bottom: 3px solid $comment_item_colour;
}
@@ -1658,22 +1265,22 @@ nav .dropdown-menu {
.section-content-wrapper .section-content-danger-wrapper {
margin-bottom: 10px;
border-bottom: none;
- border-radius: $radiuspx;
+ border-radius: $radius;
}
.section-content-wrapper {
padding: 7px 10px;
background-color: $comment_item_colour;
- border-bottom-left-radius: $radiuspx;
- border-bottom-right-radius: $radiuspx;
+ border-bottom-left-radius: $radius;
+ border-bottom-right-radius: $radius;
word-wrap: break-word;
}
.section-content-wrapper-np {
background-color: $comment_item_colour;
- border-bottom-left-radius: $radiuspx;
- border-bottom-right-radius: $radiuspx;
+ border-bottom-left-radius: $radius;
+ border-bottom-right-radius: $radius;
word-wrap: break-word;
}
@@ -1690,6 +1297,7 @@ main.fullscreen .generic-content-wrapper {
top: 0px;
left: 0px;
border-radius: 0px;
+ border-width: 0px;
}
main.fullscreen .section-title-wrapper {
@@ -1726,160 +1334,58 @@ main.fullscreen .section-content-wrapper-np {
background-color: $item_colour;
}
-nav ul li .undefined,
-nav ul li .notify-seen,
-nav ul li .notify-unseen
- {
- max-height: 3rem;
+.notify-seen {
+ background-color: $item_colour;
}
-
/* bootstrap overrides */
-.panel {
- background-color: transparent;
- border: 0px solid transparent;
- border-radius: 0px;
- -webkit-box-shadow: 0 0px 0px rgba(0, 0, 0, .0);
- box-shadow: 0 0px 0px rgba(0, 0, 0, .0);
-}
-
-.panel-group .panel + .panel {
- margin-top: 0px;
-}
-
blockquote {
- font-size: $font_size;
+ font-size: 1rem;
font-style: italic;
border-left: 3px solid #ccc;
padding: 1em 0px 1em 1.5em;
margin: 0px;
}
-.badge {
- border-radius: $radiuspx;
-}
-
-nav .badge.home-update,
-nav .badge.notify-update,
-nav .badge.intro-update,
-nav .badge.mail-update {
- background-color: #C9302C;
-}
-
.dropdown-menu {
- font-size: $body_font_size;
- border-radius: $radiuspx;
+ color: $font_colour;
+ font-size: 0.9rem;
+ border-radius: $radius;
}
.dropdown-menu img {
- border-radius: $radiuspx;
+ border-radius: $radius;
}
-.navbar-inverse {
- background-image: -webkit-linear-gradient(top, $nav_gradient_top 0%, $nav_gradient_bottom 100%);
- background-image: linear-gradient(to bottom, $nav_gradient_top 0%, $nav_gradient_bottom 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=$nav_gradient_top, endColorstr=$nav_gradient_bottom, GradientType=0);
- background-color: $nav_bg;
- border-color: $nav_bd;
+.dropdown-item {
+ color: $font_colour;
}
-.navbar-inverse .navbar-collapse {
- border-color: $nav_bd;
+.dropdown-item:active,
+.dropdown-item:focus,
+.dropdown-item:hover,
+.textcomplete-item:focus .dropdown-item,
+.textcomplete-item:hover .dropdown-item,
+.textcomplete-item.active .dropdown-item,
+.textcomplete-item:active .dropdown-item {
+ color: $font_colour;
+ background-color: $item_colour;
}
-.navbar-inverse .navbar-nav > .active > a {
- background-image: -webkit-linear-gradient(top, $nav_active_gradient_top 0%, $nav_active_gradient_bottom 100%);
- background-image: linear-gradient(to bottom, $nav_active_gradient_top 0%, $nav_active_gradient_bottom 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=$nav_active_gradient_top, endColorstr=$nav_active_gradient_bottom, GradientType=0);
+.bg-inverse {
+ background-color: $nav_bg !important;
}
-
-.navbar-inverse .navbar-nav > li > a {
+.navbar-inverse .navbar-nav .nav-link,
+.usermenu i {
color: $nav_icon_colour;
}
-.navbar-inverse .navbar-nav > li > a:hover,
-.navbar-inverse .navbar-nav > li > a:focus {
- color: $nav_active_icon_colour;
-}
-
-.navbar-inverse .navbar-nav > .active > a,
-.navbar-inverse .navbar-nav > .active > a:hover,
-.navbar-inverse .navbar-nav > .active > a:focus {
- color: $nav_active_icon_colour;
-}
-
-.navbar-inverse .navbar-nav > .open > a,
-.navbar-inverse .navbar-nav > .open > a:hover,
-.navbar-inverse .navbar-nav > .open > a:focus {
- background-color: $nav_bd;
- color: $nav_active_icon_colour;
-}
-
-.navbar-inverse .navbar-toggle {
- border-color: $nav_bd;
-}
-.navbar-inverse .navbar-toggle:hover,
-.navbar-inverse .navbar-toggle:focus {
- background-color: $nav_bg;
-}
-
-.navbar-inverse .navbar-toggle .icon-bar {
- background-color: $nav_active_icon_colour;
-}
-
-.navbar-toggle-extra {
- color: $nav_active_icon_colour;
- padding: 7px 10px;
-}
-
-.navbar-toggle-extra-left {
- float: left;
- margin-left: 15px;
- margin-right: 0px;
- color: $nav_active_icon_colour;
- padding: 7px 10px;
-}
-
-a.navbar-toggle-extra:hover,
-a.navbar-toggle-extra-left:hover {
+.navbar-inverse .navbar-nav .nav-link:focus,
+.navbar-inverse .navbar-nav .nav-link:hover,
+.usermenu:focus i,
+.usermenu:hover i {
color: $nav_active_icon_colour;
- text-decoration: none;
-}
-
-.nav-tabs.nav-justified {
- background-color: rgba(254,254,254,.5);
- border-top-left-radius: 4px;
- border-top-right-radius: 4px;
-}
-
-.nav-tabs.nav-justified > .active > a,
-.nav-tabs.nav-justified > .active > a:hover,
-.nav-tabs.nav-justified > .active > a:focus {
- border-bottom-color: transparent;
-}
-
-.nav-tabs > li.active > a,
-.nav-tabs > li.active > a:hover,
-.nav-tabs > li.active > a:focus {
- background-color: transparent;
-}
-
-#tabs-collapse-1 {
- padding: 0px;
- margin-bottom: 25px;
-}
-
-.btn {
- font-size: $body_font_size;
-}
-
-.btn-xs {
- font-size: 0.75rem;
-}
-
-.btn-default {
- background-color: transparent;
}
@media screen and (max-width: 767px) {
@@ -1897,33 +1403,6 @@ a.navbar-toggle-extra-left:hover {
left: 0px;
}
- .thread-wrapper.toplevel_item {
- width: 100%;
- border:1px;
- }
-
- .wall-item-photo {
- width: 48px !important;
- height: 48px !important;
- }
-
- .comment .wall-item-photo {
- width: 32px !important;
- height: 32px !important;
- }
-
- .acl-list-item {
- width: 98%; /* fallback if browser does not support calc() */
- width: calc(100% - 10px);
- }
-
-}
-
-/* release the navbar in landscape view on small devices */
-@media screen and (max-height: 320px) {
- .navbar-fixed-top {
- position: absolute;
- }
}
.shareable_element_text {
@@ -1972,7 +1451,7 @@ dl.bb-dl > dd > li {
font-weight: normal;
font-style: normal;
text-decoration: inherit;
- content:"\f069";
+ content:"\f069 ";
}
/* Modified original CSS to match input in Redbasic */
@@ -1981,7 +1460,7 @@ dl.bb-dl > dd > li {
margin-bottom: 0px;
box-shadow: none;
display: inline-block;
- border-radius: $radiuspx;
+ border-radius: $radius;
cursor: text;
padding: 0px 10px;
width: 100%;
@@ -1999,17 +1478,17 @@ dl.bb-dl > dd > li {
/* Turn checkboxes into switches */
-.field.checkbox > div {
+.form-group.checkbox > div {
position: relative; width: 60px;
-webkit-user-select:none; -moz-user-select:none; -ms-user-select: none;
display:inline-block;
}
-.field.checkbox input {
+.form-group.checkbox input {
display: none;
}
-.field.checkbox > div label {
+.form-group.checkbox > div label {
display: block; overflow: hidden; cursor: pointer;
border: 1px solid #ccc;
border-radius: 4px;
@@ -2019,11 +1498,11 @@ dl.bb-dl > dd > li {
transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
}
-.field.checkbox:hover label {
+.form-group.checkbox:hover label {
color: $link_colour;
}
-.field.checkbox:hover > div label {
+.form-group.checkbox:hover > div label {
border-color: $link_colour;
}
@@ -2062,13 +1541,13 @@ dl.bb-dl > dd > li {
-o-transition: all 0.3s ease-in 0s; transition: all 0.3s ease-in 0s;
}
-.field.checkbox > div > input:checked + label .onoffswitch-inner {
+.form-group.checkbox > div > input:checked + label .onoffswitch-inner {
margin-left: 0px;
}
-.field.checkbox > div > input:checked + label .onoffswitch-switch {
+.form-group.checkbox > div > input:checked + label .onoffswitch-switch {
right: 0px;
- background-color: #337AB7;
+ background-color: #0275d8;
}
.help-searchlist {
@@ -2091,30 +1570,25 @@ dl.bb-dl > dd > li {
#ace-editor,
#editor {
- border-bottom-left-radius: $radiuspx;
- border-bottom-right-radius: $radiuspx;
-}
-
-.sub-menu {
- margin-top: 10px;
- padding-left: 15px;
- border-left: 3px solid #eee;
+ border-bottom-left-radius: $radius;
+ border-bottom-right-radius: $radius;
}
-.nav-pills-stacked-icons {
- padding: 6px 10px;
- float: right;
- position: relative;
- z-index:1;
+.sub-menu-wrapper {
+ padding-left: 1rem;
+ display: none;
}
-.nav-pills-stacked-icons:hover + a {
- background-color: #eee;
+.sub-menu {
+ width: 100%;
+ margin-top: 0.5rem;
+ padding-left: 1rem;
+ border-left: 0.2rem solid #eee;
}
.app-icon {
+ color: #777;
font-size: 80px;
- color: $toolicon_colour;
text-shadow: 3px 3px 3px lightgrey;
}
@@ -2128,6 +1602,7 @@ dl.bb-dl > dd > li {
margin-left: auto;
margin-right: auto;
}
+
#permcat-index {
margin: 10px;
}
diff --git a/view/theme/redbasic/js/redbasic.js b/view/theme/redbasic/js/redbasic.js
index 81a95c68b..14b977b80 100644
--- a/view/theme/redbasic/js/redbasic.js
+++ b/view/theme/redbasic/js/redbasic.js
@@ -16,14 +16,21 @@ $(document).ready(function() {
}
$('#css3-calc').remove(); // Remove the test element
+
+
if($(window).width() > 767) {
$('#left_aside_wrapper').stick_in_parent({
- offset_top: $('nav').outerHeight(true),
+ offset_top: $('nav').outerHeight(true) + 10,
parent: '#region_1',
spacer: '#left_aside_spacer'
});
}
+ if(($(window).width() < 767) && ($('#left_aside_wrapper .widget, #left_aside_wrapper .vcard').length > 0))
+ $('#expand-aside').show();
+ else
+ $('#expand-aside').hide();
+
$('#expand-aside').on('click', toggleAside);
$('section').on('click', function() {
@@ -41,29 +48,14 @@ $(document).ready(function() {
}
});
- if($('#left_aside_wrapper').length && $('#left_aside_wrapper').html().length === 0) {
- $('#expand-aside').hide();
- }
-
- $('#expand-tabs').click(function() {
- if(!$('#tabs-collapse-1').hasClass('in')){
- $('html, body').animate({ scrollTop: 0 }, 'slow');
+ $('.usermenu').click(function() {
+ if($('#navbar-collapse-1, #navbar-collapse-2').hasClass('show')){
+ $('#navbar-collapse-1, #navbar-collapse-2').removeClass('show');
}
- $('#expand-tabs-icon').toggleClass('fa-arrow-circle-down').toggleClass('fa-arrow-circle-up');
});
- $('.usermenu-head').click(function() {
- if($('#navbar-collapse-1, #navbar-collapse-2').hasClass('in')){
- $('#navbar-collapse-1, #navbar-collapse-2').removeClass('in');
- }
- });
-
- if($('#tabs-collapse-1').length === 0) {
- $('#expand-tabs').hide();
- }
-
$("input[data-role=cat-tagsinput]").tagsinput({
- tagClass: 'label label-primary'
+ tagClass: 'badge badge-pill badge-warning'
});
var doctitle = document.title;
@@ -81,17 +73,14 @@ $(document).ready(function() {
function makeFullScreen(full) {
if(typeof full=='undefined' || full == true) {
- $('main').css({'transition': 'none'}).addClass('fullscreen');
- $('header, nav, aside, #fullscreen-btn').hide();
- $('#tabs-collapse-1').css({'visibility': 'hidden'});
+ $('main').addClass('fullscreen');
+ $('header, nav, aside, #fullscreen-btn').attr('style','display:none !important');
$('#inline-btn').show();
}
else {
$('main').removeClass('fullscreen');
$('header, nav, aside, #fullscreen-btn').show();
- $('#tabs-collapse-1').css({'visibility': ''});
$('#inline-btn').hide();
- $('main').css({'transition': ''});
$(document.body).trigger("sticky_kit:recalc");
}
}
@@ -109,7 +98,7 @@ function toggleAside() {
$('main').addClass('region_1-on')
$('<div id="overlay"></div>').appendTo('section');
$('#left_aside_wrapper').stick_in_parent({
- offset_top: $('nav').outerHeight(true) - 10,
+ offset_top: $('nav').outerHeight(true) + 10,
parent: '#region_1',
spacer: '#left_aside_spacer'
});
diff --git a/view/theme/redbasic/php/config.php b/view/theme/redbasic/php/config.php
index b03e94e46..752a02a6a 100644
--- a/view/theme/redbasic/php/config.php
+++ b/view/theme/redbasic/php/config.php
@@ -28,11 +28,6 @@ class RedbasicConfig {
$arr = array();
$arr['narrow_navbar'] = get_pconfig(local_channel(),'redbasic', 'narrow_navbar' );
$arr['nav_bg'] = get_pconfig(local_channel(),'redbasic', 'nav_bg' );
- $arr['nav_gradient_top'] = get_pconfig(local_channel(),'redbasic', 'nav_gradient_top' );
- $arr['nav_gradient_bottom'] = get_pconfig(local_channel(),'redbasic', 'nav_gradient_bottom' );
- $arr['nav_active_gradient_top'] = get_pconfig(local_channel(),'redbasic', 'nav_active_gradient_top' );
- $arr['nav_active_gradient_bottom'] = get_pconfig(local_channel(),'redbasic', 'nav_active_gradient_bottom' );
- $arr['nav_bd'] = get_pconfig(local_channel(),'redbasic', 'nav_bd' );
$arr['nav_icon_colour'] = get_pconfig(local_channel(),'redbasic', 'nav_icon_colour' );
$arr['nav_active_icon_colour'] = get_pconfig(local_channel(),'redbasic', 'nav_active_icon_colour' );
$arr['link_colour'] = get_pconfig(local_channel(),'redbasic', 'link_colour' );
@@ -41,18 +36,12 @@ class RedbasicConfig {
$arr['background_image'] = get_pconfig(local_channel(),'redbasic', 'background_image' );
$arr['item_colour'] = get_pconfig(local_channel(),'redbasic', 'item_colour' );
$arr['comment_item_colour'] = get_pconfig(local_channel(),'redbasic', 'comment_item_colour' );
- $arr['comment_border_colour'] = get_pconfig(local_channel(),'redbasic', 'comment_border_colour' );
- $arr['comment_indent'] = get_pconfig(local_channel(),'redbasic', 'comment_indent' );
- $arr['toolicon_colour'] = get_pconfig(local_channel(),'redbasic','toolicon_colour');
- $arr['toolicon_activecolour'] = get_pconfig(local_channel(),'redbasic','toolicon_activecolour');
$arr['font_size'] = get_pconfig(local_channel(),'redbasic', 'font_size' );
- $arr['body_font_size'] = get_pconfig(local_channel(),'redbasic', 'body_font_size' );
$arr['font_colour'] = get_pconfig(local_channel(),'redbasic', 'font_colour' );
$arr['radius'] = get_pconfig(local_channel(),'redbasic', 'radius' );
$arr['shadow'] = get_pconfig(local_channel(),'redbasic', 'photo_shadow' );
$arr['converse_width']=get_pconfig(local_channel(),"redbasic","converse_width");
$arr['align_left']=get_pconfig(local_channel(),"redbasic","align_left");
- $arr['nav_min_opacity']=get_pconfig(local_channel(),"redbasic","nav_min_opacity");
$arr['top_photo']=get_pconfig(local_channel(),"redbasic","top_photo");
$arr['reply_photo']=get_pconfig(local_channel(),"redbasic","reply_photo");
return $this->form($arr);
@@ -66,11 +55,6 @@ class RedbasicConfig {
if (isset($_POST['redbasic-settings-submit'])) {
set_pconfig(local_channel(), 'redbasic', 'narrow_navbar', $_POST['redbasic_narrow_navbar']);
set_pconfig(local_channel(), 'redbasic', 'nav_bg', $_POST['redbasic_nav_bg']);
- set_pconfig(local_channel(), 'redbasic', 'nav_gradient_top', $_POST['redbasic_nav_gradient_top']);
- set_pconfig(local_channel(), 'redbasic', 'nav_gradient_bottom', $_POST['redbasic_nav_gradient_bottom']);
- set_pconfig(local_channel(), 'redbasic', 'nav_active_gradient_top', $_POST['redbasic_nav_active_gradient_top']);
- set_pconfig(local_channel(), 'redbasic', 'nav_active_gradient_bottom', $_POST['redbasic_nav_active_gradient_bottom']);
- set_pconfig(local_channel(), 'redbasic', 'nav_bd', $_POST['redbasic_nav_bd']);
set_pconfig(local_channel(), 'redbasic', 'nav_icon_colour', $_POST['redbasic_nav_icon_colour']);
set_pconfig(local_channel(), 'redbasic', 'nav_active_icon_colour', $_POST['redbasic_nav_active_icon_colour']);
set_pconfig(local_channel(), 'redbasic', 'link_colour', $_POST['redbasic_link_colour']);
@@ -79,18 +63,12 @@ class RedbasicConfig {
set_pconfig(local_channel(), 'redbasic', 'background_image', $_POST['redbasic_background_image']);
set_pconfig(local_channel(), 'redbasic', 'item_colour', $_POST['redbasic_item_colour']);
set_pconfig(local_channel(), 'redbasic', 'comment_item_colour', $_POST['redbasic_comment_item_colour']);
- set_pconfig(local_channel(), 'redbasic', 'comment_border_colour', $_POST['redbasic_comment_border_colour']);
- set_pconfig(local_channel(), 'redbasic', 'comment_indent', $_POST['redbasic_comment_indent']);
- set_pconfig(local_channel(), 'redbasic', 'toolicon_colour', $_POST['redbasic_toolicon_colour']);
- set_pconfig(local_channel(), 'redbasic', 'toolicon_activecolour', $_POST['redbasic_toolicon_activecolour']);
set_pconfig(local_channel(), 'redbasic', 'font_size', $_POST['redbasic_font_size']);
- set_pconfig(local_channel(), 'redbasic', 'body_font_size', $_POST['redbasic_body_font_size']);
set_pconfig(local_channel(), 'redbasic', 'font_colour', $_POST['redbasic_font_colour']);
set_pconfig(local_channel(), 'redbasic', 'radius', $_POST['redbasic_radius']);
set_pconfig(local_channel(), 'redbasic', 'photo_shadow', $_POST['redbasic_shadow']);
set_pconfig(local_channel(), 'redbasic', 'converse_width', $_POST['redbasic_converse_width']);
set_pconfig(local_channel(), 'redbasic', 'align_left', $_POST['redbasic_align_left']);
- set_pconfig(local_channel(), 'redbasic', 'nav_min_opacity', $_POST['redbasic_nav_min_opacity']);
set_pconfig(local_channel(), 'redbasic', 'top_photo', $_POST['redbasic_top_photo']);
set_pconfig(local_channel(), 'redbasic', 'reply_photo', $_POST['redbasic_reply_photo']);
}
@@ -110,31 +88,20 @@ class RedbasicConfig {
'$title' => t("Theme settings"),
'$narrow_navbar' => array('redbasic_narrow_navbar',t('Narrow navbar'),$arr['narrow_navbar'], '', array(t('No'),t('Yes'))),
'$nav_bg' => array('redbasic_nav_bg', t('Navigation bar background color'), $arr['nav_bg']),
- '$nav_gradient_top' => array('redbasic_nav_gradient_top', t('Navigation bar gradient top color'), $arr['nav_gradient_top']),
- '$nav_gradient_bottom' => array('redbasic_nav_gradient_bottom', t('Navigation bar gradient bottom color'), $arr['nav_gradient_bottom']),
- '$nav_active_gradient_top' => array('redbasic_nav_active_gradient_top', t('Navigation active button gradient top color'), $arr['nav_active_gradient_top']),
- '$nav_active_gradient_bottom' => array('redbasic_nav_active_gradient_bottom', t('Navigation active button gradient bottom color'), $arr['nav_active_gradient_bottom']),
- '$nav_bd' => array('redbasic_nav_bd', t('Navigation bar border color '), $arr['nav_bd']),
'$nav_icon_colour' => array('redbasic_nav_icon_colour', t('Navigation bar icon color '), $arr['nav_icon_colour']),
'$nav_active_icon_colour' => array('redbasic_nav_active_icon_colour', t('Navigation bar active icon color '), $arr['nav_active_icon_colour']),
- '$link_colour' => array('redbasic_link_colour', t('link color'), $arr['link_colour'], '', $link_colours),
+ '$link_colour' => array('redbasic_link_colour', t('Link color'), $arr['link_colour'], '', $link_colours),
'$banner_colour' => array('redbasic_banner_colour', t('Set font-color for banner'), $arr['banner_colour']),
'$bgcolour' => array('redbasic_background_colour', t('Set the background color'), $arr['bgcolour']),
'$background_image' => array('redbasic_background_image', t('Set the background image'), $arr['background_image']),
'$item_colour' => array('redbasic_item_colour', t('Set the background color of items'), $arr['item_colour']),
'$comment_item_colour' => array('redbasic_comment_item_colour', t('Set the background color of comments'), $arr['comment_item_colour']),
- '$comment_border_colour' => array('redbasic_comment_border_colour', t('Set the border color of comments'), $arr['comment_border_colour']),
- '$comment_indent' => array('redbasic_comment_indent', t('Set the indent for comments'), $arr['comment_indent']),
- '$toolicon_colour' => array('redbasic_toolicon_colour',t('Set the basic color for item icons'),$arr['toolicon_colour']),
- '$toolicon_activecolour' => array('redbasic_toolicon_activecolour',t('Set the hover color for item icons'),$arr['toolicon_activecolour']),
- '$body_font_size' => array('redbasic_body_font_size', t('Set font-size for the entire application'), $arr['body_font_size'], t('Example: 14px')),
- '$font_size' => array('redbasic_font_size', t('Set font-size for posts and comments'), $arr['font_size']),
+ '$font_size' => array('redbasic_font_size', t('Set font-size for the entire application'), $arr['font_size'], t('Examples: 1rem, 100%, 16px')),
'$font_colour' => array('redbasic_font_colour', t('Set font-color for posts and comments'), $arr['font_colour']),
- '$radius' => array('redbasic_radius', t('Set radius of corners'), $arr['radius']),
+ '$radius' => array('redbasic_radius', t('Set radius of corners'), $arr['radius'], t('Example: 4px')),
'$shadow' => array('redbasic_shadow', t('Set shadow depth of photos'), $arr['shadow']),
'$converse_width' => array('redbasic_converse_width',t('Set maximum width of content region in pixel'),$arr['converse_width'], t('Leave empty for default width')),
'$align_left' => array('redbasic_align_left',t('Left align page content'),$arr['align_left'], '', array(t('No'),t('Yes'))),
- '$nav_min_opacity' => array('redbasic_nav_min_opacity',t('Set minimum opacity of nav bar - to hide it'),$arr['nav_min_opacity']),
'$top_photo' => array('redbasic_top_photo', t('Set size of conversation author photo'), $arr['top_photo']),
'$reply_photo' => array('redbasic_reply_photo', t('Set size of followup author photos'), $arr['reply_photo']),
));
diff --git a/view/theme/redbasic/php/style.php b/view/theme/redbasic/php/style.php
index 9b994ebdf..a666f96f2 100644
--- a/view/theme/redbasic/php/style.php
+++ b/view/theme/redbasic/php/style.php
@@ -10,34 +10,23 @@ if(! App::$install) {
}
// Load the owners pconfig
- $nav_bg = get_pconfig($uid, "redbasic", "nav_bg");
- $nav_gradient_top = get_pconfig($uid, "redbasic", "nav_gradient_top");
- $nav_gradient_bottom = get_pconfig($uid, "redbasic", "nav_gradient_bottom");
- $nav_active_gradient_top = get_pconfig($uid, "redbasic", "nav_active_gradient_top");
- $nav_active_gradient_bottom = get_pconfig($uid, "redbasic", "nav_active_gradient_bottom");
- $nav_bd = get_pconfig($uid, "redbasic", "nav_bd");
- $nav_icon_colour = get_pconfig($uid, "redbasic", "nav_icon_colour");
- $nav_active_icon_colour = get_pconfig($uid, "redbasic", "nav_active_icon_colour");
- $narrow_navbar = get_pconfig($uid,'redbasic','narrow_navbar');
+ $nav_bg = get_pconfig($uid, 'redbasic', 'nav_bg');
+ $nav_icon_colour = get_pconfig($uid, 'redbasic', 'nav_icon_colour');
+ $nav_active_icon_colour = get_pconfig($uid, 'redbasic', 'nav_active_icon_colour');
$banner_colour = get_pconfig($uid,'redbasic','banner_colour');
- $link_colour = get_pconfig($uid, "redbasic", "link_colour");
+ $narrow_navbar = get_pconfig($uid,'redbasic','narrow_navbar');
+ $link_colour = get_pconfig($uid, 'redbasic', 'link_colour');
$schema = get_pconfig($uid,'redbasic','schema');
- $bgcolour = get_pconfig($uid, "redbasic", "background_colour");
- $background_image = get_pconfig($uid, "redbasic", "background_image");
- $toolicon_colour = get_pconfig($uid,'redbasic','toolicon_colour');
- $toolicon_activecolour = get_pconfig($uid,'redbasic','toolicon_activecolour');
- $item_colour = get_pconfig($uid, "redbasic", "item_colour");
- $comment_item_colour = get_pconfig($uid, "redbasic", "comment_item_colour");
- $comment_border_colour = get_pconfig($uid, "redbasic", "comment_border_colour");
- $comment_indent = get_pconfig($uid, "redbasic", "comment_indent");
- $body_font_size = get_pconfig($uid, "redbasic", "body_font_size");
- $font_size = get_pconfig($uid, "redbasic", "font_size");
- $font_colour = get_pconfig($uid, "redbasic", "font_colour");
- $radius = get_pconfig($uid, "redbasic", "radius");
- $shadow = get_pconfig($uid,"redbasic","photo_shadow");
- $converse_width=get_pconfig($uid,"redbasic","converse_width");
- $align_left=get_pconfig($uid,"redbasic","align_left");
- $nav_min_opacity=get_pconfig($uid,'redbasic','nav_min_opacity');
+ $bgcolour = get_pconfig($uid, 'redbasic', 'background_colour');
+ $background_image = get_pconfig($uid, 'redbasic', 'background_image');
+ $item_colour = get_pconfig($uid, 'redbasic', 'item_colour');
+ $comment_item_colour = get_pconfig($uid, 'redbasic', 'comment_item_colour');
+ $font_size = get_pconfig($uid, 'redbasic', 'font_size');
+ $font_colour = get_pconfig($uid, 'redbasic', 'font_colour');
+ $radius = get_pconfig($uid, 'redbasic', 'radius');
+ $shadow = get_pconfig($uid,'redbasic','photo_shadow');
+ $converse_width=get_pconfig($uid,'redbasic','converse_width');
+ $align_left=get_pconfig($uid,'redbasic','align_left');
$top_photo=get_pconfig($uid,'redbasic','top_photo');
$reply_photo=get_pconfig($uid,'redbasic','reply_photo');
}
@@ -86,67 +75,39 @@ if (! $schema) {
//Set some defaults - we have to do this after pulling owner settings, and we have to check for each setting
//individually. If we don't, we'll have problems if a user has set one, but not all options.
if (! $nav_bg)
- $nav_bg = "#222";
-if (! $nav_gradient_top)
- $nav_gradient_top = "#3c3c3c";
-if (! $nav_gradient_bottom)
- $nav_gradient_bottom = "#222";
-if (! $nav_active_gradient_top)
- $nav_active_gradient_top = "#222";
-if (! $nav_active_gradient_bottom)
- $nav_active_gradient_bottom = "#282828";
-if (! $nav_bd)
- $nav_bd = "#222";
+ $nav_bg = '#222';
if (! $nav_icon_colour)
- $nav_icon_colour = "#999";
+ $nav_icon_colour = 'rgba(255, 255, 255, 0.5)';
if (! $nav_active_icon_colour)
- $nav_active_icon_colour = "#fff";
+ $nav_active_icon_colour = 'rgba(255, 255, 255, 0.75)';
if (! $link_colour)
- $link_colour = "#337AB7";
+ $link_colour = '#0275d8';
if (! $banner_colour)
- $banner_colour = "#fff";
+ $banner_colour = '#fff';
if (! $bgcolour)
- $bgcolour = "rgb(254,254,254)";
+ $bgcolour = 'rgb(254,254,254)';
if (! $background_image)
$background_image ='';
if (! $item_colour)
- $item_colour = "rgb(238,238,238)";
+ $item_colour = 'rgb(238,238,238)';
if (! $comment_item_colour)
- $comment_item_colour = "rgb(255,255,255)";
-if (! $comment_border_colour)
- $comment_border_colour = "rgb(255,255,255)";
-if (! $toolicon_colour)
- $toolicon_colour = '#777';
-if (! $toolicon_activecolour)
- $toolicon_activecolour = '#000';
+ $comment_item_colour = 'rgb(255,255,255)';
if (! $item_opacity)
- $item_opacity = "1";
+ $item_opacity = '1';
if (! $font_size)
- $font_size = "0.9rem";
-if (! $body_font_size)
- $body_font_size = "0.75rem";
+ $font_size = '0.875rem';
if (! $font_colour)
- $font_colour = "#4d4d4d";
+ $font_colour = '#4d4d4d';
if (! $radius)
- $radius = "4";
+ $radius = '0.25rem';
if (! $shadow)
- $shadow = "0";
+ $shadow = '0';
if (! $converse_width)
- $converse_width = "790";
+ $converse_width = '790';
if(! $top_photo)
- $top_photo = '48px';
-if(! $comment_indent)
- $comment_indent = '0px';
+ $top_photo = '2.3rem';
if(! $reply_photo)
- $reply_photo = '32px';
-if($nav_min_opacity === false || $nav_min_opacity === '') {
- $nav_float_min_opacity = 1.0;
- $nav_percent_min_opacity = 100;
-}
-else {
- $nav_float_min_opacity = (float) $nav_min_opacity;
- $nav_percent_min_opacity = (int) 100 * $nav_min_opacity;
-}
+ $reply_photo = '2.3rem';
// Apply the settings
if(file_exists('view/theme/redbasic/css/style.css')) {
@@ -179,11 +140,6 @@ if(file_exists('view/theme/redbasic/css/style.css')) {
$options = array (
'$nav_bg' => $nav_bg,
- '$nav_gradient_top' => $nav_gradient_top,
- '$nav_gradient_bottom' => $nav_gradient_bottom,
- '$nav_active_gradient_top' => $nav_active_gradient_top,
- '$nav_active_gradient_bottom' => $nav_active_gradient_bottom,
- '$nav_bd' => $nav_bd,
'$nav_icon_colour' => $nav_icon_colour,
'$nav_active_icon_colour' => $nav_active_icon_colour,
'$link_colour' => $link_colour,
@@ -192,12 +148,8 @@ if(file_exists('view/theme/redbasic/css/style.css')) {
'$background_image' => $background_image,
'$item_colour' => $item_colour,
'$comment_item_colour' => $comment_item_colour,
- '$comment_border_colour' => $comment_border_colour,
- '$toolicon_colour' => $toolicon_colour,
- '$toolicon_activecolour' => $toolicon_activecolour,
'$font_size' => $font_size,
'$font_colour' => $font_colour,
- '$body_font_size' => $body_font_size,
'$radius' => $radius,
'$shadow' => $shadow,
'$converse_width' => $converse_width,
@@ -207,7 +159,6 @@ if(file_exists('view/theme/redbasic/css/style.css')) {
'$reply_photo' => $reply_photo,
'$pmenu_top' => $pmenu_top,
'$pmenu_reply' => $pmenu_reply,
- '$comment_indent' => $comment_indent,
'$main_width' => $main_width,
'$aside_width' => $aside_width
);
diff --git a/view/theme/redbasic/php/theme.php b/view/theme/redbasic/php/theme.php
index 95d5a2001..a1147a5b4 100644
--- a/view/theme/redbasic/php/theme.php
+++ b/view/theme/redbasic/php/theme.php
@@ -3,8 +3,8 @@
/**
* * Name: Redbasic
* * Description: Hubzilla standard theme
- * * Version: 2.0
- * * MinVersion: 2.2RC
+ * * Version: 2.1
+ * * MinVersion: 2.3.1
* * MaxVersion: 3.0
* * Author: Fabrixxm
* * Maintainer: Mike Macgirvin
diff --git a/view/theme/redbasic/tpl/theme_settings.tpl b/view/theme/redbasic/tpl/theme_settings.tpl
index 9672d3d05..f90e37ac3 100644
--- a/view/theme/redbasic/tpl/theme_settings.tpl
+++ b/view/theme/redbasic/tpl/theme_settings.tpl
@@ -1,29 +1,20 @@
{{include file="field_checkbox.tpl" field=$align_left}}
{{include file="field_checkbox.tpl" field=$narrow_navbar}}
{{include file="field_input.tpl" field=$converse_width}}
+{{include file="field_input.tpl" field=$font_size}}
{{if $expert}}
{{include file="field_colorinput.tpl" field=$nav_bg}}
- {{include file="field_colorinput.tpl" field=$nav_gradient_top}}
- {{include file="field_colorinput.tpl" field=$nav_gradient_bottom}}
- {{include file="field_colorinput.tpl" field=$nav_active_gradient_top}}
- {{include file="field_colorinput.tpl" field=$nav_active_gradient_bottom}}
- {{include file="field_colorinput.tpl" field=$nav_bd}}
{{include file="field_colorinput.tpl" field=$nav_icon_colour}}
{{include file="field_colorinput.tpl" field=$nav_active_icon_colour}}
- {{include file="field_input.tpl" field=$nav_min_opacity}}
+ {{include file="field_colorinput.tpl" field=$banner_colour}}
{{include file="field_colorinput.tpl" field=$bgcolour}}
{{include file="field_colorinput.tpl" field=$background_image}}
{{include file="field_colorinput.tpl" field=$item_colour}}
{{include file="field_colorinput.tpl" field=$comment_item_colour}}
{{*include file="field_colorinput.tpl" field=$comment_border_colour*}}
{{*include file="field_input.tpl" field=$comment_indent*}}
- {{include file="field_input.tpl" field=$body_font_size}}
- {{include file="field_input.tpl" field=$font_size}}
{{include file="field_colorinput.tpl" field=$font_colour}}
{{include file="field_colorinput.tpl" field=$link_colour}}
- {{include file="field_colorinput.tpl" field=$banner_colour}}
- {{include file="field_colorinput.tpl" field=$toolicon_colour}}
- {{include file="field_colorinput.tpl" field=$toolicon_activecolour}}
{{include file="field_input.tpl" field=$radius}}
{{include file="field_input.tpl" field=$shadow}}
{{include file="field_input.tpl" field=$top_photo}}
@@ -31,8 +22,8 @@
<script>
$(function(){
- $('#id_redbasic_nav_bg,#id_redbasic_nav_gradient_top,#id_redbasic_nav_gradient_bottom,#id_redbasic_nav_active_gradient_top,#id_redbasic_nav_active_gradient_bottom').colorpicker({format: 'rgba'});
- $('#id_redbasic_nav_bd,#id_redbasic_nav_icon_colour ,#id_redbasic_nav_active_icon_colour,#id_redbasic_banner_colour,#id_redbasic_link_colour,#id_redbasic_background_colour').colorpicker();
+ $('#id_redbasic_nav_bg, #id_redbasic_nav_icon_colour, #id_redbasic_nav_active_icon_colour, #id_redbasic_banner_colour').colorpicker({format: 'rgba'});
+ $('#id_redbasic_link_colour,#id_redbasic_background_colour').colorpicker();
$('#id_redbasic_toolicon_colour,#id_redbasic_toolicon_activecolour,#id_redbasic_font_colour').colorpicker();
$('#id_redbasic_item_colour,#id_redbasic_comment_item_colour,#id_redbasic_comment_border_colour').colorpicker({format: 'rgba'});
});
diff --git a/view/tpl/abook_edit.tpl b/view/tpl/abook_edit.tpl
index ebc69c5f8..9fb5c4b18 100755
--- a/view/tpl/abook_edit.tpl
+++ b/view/tpl/abook_edit.tpl
@@ -3,31 +3,36 @@
{{if $notself}}
<div class="pull-right">
<div class="btn-group">
- <button id="connection-dropdown" class="btn btn-default btn-xs dropdown-toggle" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
- <i class="fa fa-caret-down"></i>&nbsp;{{$tools_label}}
+ <button id="connection-dropdown" class="btn btn-outline-secondary btn-sm dropdown-toggle" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+ <i class="fa fa-cog"></i>&nbsp;{{$tools_label}}
</button>
- <ul class="dropdown-menu dropdown-menu-right" aria-labelledby="dLabel">
- <li><a href="{{$tools.view.url}}" title="{{$tools.view.title}}">{{$tools.view.label}}</a></li>
- <li><a href="{{$tools.recent.url}}" title="{{$tools.recent.title}}">{{$tools.recent.label}}</a></li>
- <li class="divider"></li>
- <li><a href="#" title="{{$tools.refresh.title}}" onclick="window.location.href='{{$tools.refresh.url}}'; return false;">{{$tools.refresh.label}}</a></li>
- <li><a href="#" title="{{$tools.block.title}}" onclick="window.location.href='{{$tools.block.url}}'; return false;">{{$tools.block.label}}</a></li>
- <li><a href="#" title="{{$tools.ignore.title}}" onclick="window.location.href='{{$tools.ignore.url}}'; return false;">{{$tools.ignore.label}}</a></li>
- <li><a href="#" title="{{$tools.archive.title}}" onclick="window.location.href='{{$tools.archive.url}}'; return false;">{{$tools.archive.label}}</a></li>
- <li><a href="#" title="{{$tools.hide.title}}" onclick="window.location.href='{{$tools.hide.url}}'; return false;">{{$tools.hide.label}}</a></li>
- <li><a href="#" title="{{$tools.delete.title}}" onclick="window.location.href='{{$tools.delete.url}}'; return false;">{{$tools.delete.label}}</a></li>
- </ul>
+ <div class="dropdown-menu dropdown-menu-right" aria-labelledby="dLabel">
+ <a class="dropdown-item" href="{{$tools.view.url}}" title="{{$tools.view.title}}">{{$tools.view.label}}</a>
+ <a class="dropdown-item" href="{{$tools.recent.url}}" title="{{$tools.recent.title}}">{{$tools.recent.label}}</a>
+ {{if $tools.fetchvc}}
+ <a class="dropdown-item" href="{{$tools.fetchvc.url}}" title="{{$tools.fetchvc.title}}">{{$tools.fetchvc.label}}</a>
+ {{/if}}
+ <a class="dropdown-item" href="#" title="{{$tools.refresh.title}}" onclick="window.location.href='{{$tools.refresh.url}}'; return false;">{{$tools.refresh.label}}</a>
+ <a class="dropdown-item" href="#" title="{{$tools.rephoto.title}}" onclick="window.location.href='{{$tools.rephoto.url}}'; return false;">{{$tools.rephoto.label}}</a>
+ <div class="dropdown-divider"></div>
+ <a class="dropdown-item" href="#" title="{{$tools.block.title}}" onclick="window.location.href='{{$tools.block.url}}'; return false;">{{$tools.block.label}}</a>
+ <a class="dropdown-item" href="#" title="{{$tools.ignore.title}}" onclick="window.location.href='{{$tools.ignore.url}}'; return false;">{{$tools.ignore.label}}</a>
+ <a class="dropdown-item" href="#" title="{{$tools.archive.title}}" onclick="window.location.href='{{$tools.archive.url}}'; return false;">{{$tools.archive.label}}</a> <a class="dropdown-item" href="#" title="{{$tools.hide.title}}" onclick="window.location.href='{{$tools.hide.url}}'; return false;">{{$tools.hide.label}}</a>
+ <a class="dropdown-item" href="#" title="{{$tools.delete.title}}" onclick="window.location.href='{{$tools.delete.url}}'; return false;">{{$tools.delete.label}}</a>
+ </div>
</div>
{{if $abook_prev || $abook_next}}
<div class="btn-group">
- <a href="connedit/{{$abook_prev}}{{if $section}}?f=&section={{$section}}{{/if}}" class="btn btn-default btn-xs{{if ! $abook_prev}} disabled{{/if}}" ><i class="fa fa-backward"></i></a>
- <button class="btn btn-default btn-xs{{if $is_pending}} disabled{{/if}}" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><i class="fa fa-bars"></i></button>
- <a href="connedit/{{$abook_next}}{{if $section}}?f=&section={{$section}}{{/if}}" class="btn btn-default btn-xs{{if ! $abook_next}} disabled{{/if}}" ><i class="fa fa-forward"></i></a>
- <ul class="dropdown-menu dropdown-menu-right" aria-labelledby="dLabel">
- {{foreach $sections as $s}}
- <li><a href="{{$s.url}}" title="{{$s.title}}">{{$s.label}}</a></li>
- {{/foreach}}
- </ul>
+ <a href="connedit/{{$abook_prev}}{{if $section}}?f=&section={{$section}}{{/if}}" class="btn btn-outline-secondary btn-sm{{if ! $abook_prev}} disabled{{/if}}" ><i class="fa fa-backward"></i></a>
+ <div class="btn-group" >
+ <button class="btn btn-outline-secondary btn-sm{{if $is_pending}} disabled{{/if}}" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><i class="fa fa-bars"></i></button>
+ <div class="dropdown-menu dropdown-menu-right" aria-labelledby="dLabel">
+ {{foreach $sections as $s}}
+ <a class="dropdown-item" href="{{$s.url}}" title="{{$s.title}}">{{$s.label}}</a>
+ {{/foreach}}
+ </div>
+ </div>
+ <a href="connedit/{{$abook_next}}{{if $section}}?f=&section={{$section}}{{/if}}" class="btn btn-outline-secondary btn-sm{{if ! $abook_next}} disabled{{/if}}" ><i class="fa fa-forward"></i></a>
</div>
{{/if}}
</div>
@@ -79,7 +84,7 @@
</a>
</h3>
</div>
- <div id="pending-tool-collapse" class="panel-collapse collapse in" role="tabpanel" aria-labelledby="pending-tool">
+ <div id="pending-tool-collapse" class="panel-collapse collapse show" role="tabpanel" aria-labelledby="pending-tool">
<div class="section-content-tools-wrapper">
{{include file="field_checkbox.tpl" field=$unapproved}}
<div class="settings-submit-wrapper" >
@@ -187,7 +192,7 @@
<div class="section-content-wrapper-np">
<div id="vcard-cancel-{{$vcard.id}}" class="vcard-cancel vcard-cancel-btn" data-id="{{$vcard.id}}" data-action="cancel"><i class="fa fa-close"></i></div>
<div id="vcard-add-field-{{$vcard.id}}" class="dropdown pull-right vcard-add-field">
- <button data-toggle="dropdown" type="button" class="btn btn-default btn-sm dropdown-toggle"><i class="fa fa-plus"></i> {{$add_field}}</button>
+ <button data-toggle="dropdown" type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle"><i class="fa fa-plus"></i> {{$add_field}}</button>
<ul class="dropdown-menu">
<li class="add-vcard-org"{{if $vcard.org}} style="display: none"{{/if}}><a href="#" data-add="vcard-org" data-id="{{$vcard.id}}" class="add-field" onclick="return false;">{{$org_label}}</a></li>
<li class="add-vcard-title"{{if $vcard.title}} style="display: none"{{/if}}><a href="#" data-add="vcard-title" data-id="{{$vcard.id}}" class="add-field" onclick="return false;">{{$title_label}}</a></li>
@@ -203,8 +208,8 @@
<i class="vcard-fn-preview fa fa-address-card-o"></i>
<span id="vcard-preview-{{$vcard.id}}" class="vcard-preview">
{{if $vcard.fn}}<span class="vcard-fn-preview">{{$vcard.fn}}</span>{{/if}}
- {{if $vcard.emails.0.address}}<span class="vcard-email-preview hidden-xs"><a href="mailto:{{$vcard.emails.0.address}}">{{$vcard.emails.0.address}}</a></span>{{/if}}
- {{if $vcard.tels.0}}<span class="vcard-tel-preview hidden-xs">{{$vcard.tels.0.nr}}{{if $is_mobile}} <a class="btn btn-default btn-xs" href="tel:{{$vcard.tels.0.nr}}"><i class="fa fa-phone connphone"></i></a>{{/if}}</span>{{/if}}
+ {{if $vcard.emails.0.address}}<span class="vcard-email-preview d-none d-md-table-cell"><a href="mailto:{{$vcard.emails.0.address}}">{{$vcard.emails.0.address}}</a></span>{{/if}}
+ {{if $vcard.tels.0}}<span class="vcard-tel-preview d-none d-md-table-cell">{{$vcard.tels.0.nr}}{{if $is_mobile}} <a class="btn btn-outline-secondary btn-sm" href="tel:{{$vcard.tels.0.nr}}"><i class="fa fa-phone connphone"></i></a>{{/if}}</span>{{/if}}
</span>
<input id="vcard-fn-{{$vcard.id}}" class="vcard-fn" type="text" name="fn" value="{{$vcard.fn}}" size="{{$vcard.fn|count_characters:true}}" placeholder="{{$name_label}}">
</div>
@@ -381,7 +386,7 @@
</a>
</h3>
</div>
- <div id="affinity-tool-collapse" class="panel-collapse collapse{{if $section == 'affinity'}} in{{/if}}" role="tabpanel" aria-labelledby="affinity-tool">
+ <div id="affinity-tool-collapse" class="panel-collapse collapse{{if $section == 'affinity'}} show{{/if}}" role="tabpanel" aria-labelledby="affinity-tool">
<div class="section-content-tools-wrapper">
{{if $slide}}
<div class="form-group"><strong>{{$lbl_slider}}</strong></div>
@@ -412,7 +417,7 @@
</a>
</h3>
</div>
- <div id="fitert-tool-collapse" class="panel-collapse collapse{{if $section == 'filter' }} in{{/if}}" role="tabpanel" aria-labelledby="fitert-tool">
+ <div id="fitert-tool-collapse" class="panel-collapse collapse{{if $section == 'filter' }} show{{/if}}" role="tabpanel" aria-labelledby="fitert-tool">
<div class="section-content-tools-wrapper">
{{include file="field_textarea.tpl" field=$incl}}
{{include file="field_textarea.tpl" field=$excl}}
@@ -466,7 +471,7 @@
</h3>
</div>
{{/if}}
- <div id="perms-tool-collapse" class="panel-collapse collapse{{if $self || $section === 'perms'}} in{{/if}}" role="tabpanel" aria-labelledby="perms-tool">
+ <div id="perms-tool-collapse" class="panel-collapse collapse{{if $self || $section === 'perms'}} show{{/if}}" role="tabpanel" aria-labelledby="perms-tool">
<div class="section-content-tools-wrapper">
<div class="section-content-warning-wrapper">
{{if $notself}}{{$permnote}}{{/if}}
diff --git a/view/tpl/acl_selector.tpl b/view/tpl/acl_selector.tpl
index c23840c16..f4f851c8a 100755
--- a/view/tpl/acl_selector.tpl
+++ b/view/tpl/acl_selector.tpl
@@ -3,11 +3,13 @@
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
+ <h4 class="modal-title">
+ <i id="dialog-perms-icon" class="fa fa-fw"></i> {{$aclModalTitle}}
+ {{if $helpUrl}}
+ <a target="hubzilla-help" href="{{$helpUrl}}" class="contextual-help-tool" title="Help and documentation"><i class="fa fa-fw fa-question"></i></a>
+ {{/if}}
+ </h4>
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
- {{if $helpUrl}}
- <a type="button" target="hubzilla-help" href="{{$helpUrl}}" class="contextual-help-tool" title="Help and documentation"><i class="fa fa-question"></i></a>
- {{/if}}
- <h4 class="modal-title"><i id="dialog-perms-icon" class="fa fa-fw"></i> {{$aclModalTitle}}</h4>
</div>
<div class="section-content-wrapper">
{{if $aclModalDesc}}
@@ -29,32 +31,30 @@
<div id="acl-wrapper">
<div id="acl-list">
- <div id="acl-search-wrapper">
- <input type="text" id="acl-search" placeholder="&#xf002; {{$search}}">
- </div>
- <div id="acl-list-content-wrapper">
- <div id=acl-showlimited-description>{{$showlimitedDesc}}</div>
- <div id="acl-list-content"></div>
- </div>
+ <input class="form-control" type="text" id="acl-search" placeholder="&#xf002; {{$search}}">
+ <small class="text-muted">{{$showlimitedDesc}}</small>
+ <div id="acl-list-content"></div>
</div>
</div>
<div class="acl-list-item" rel="acl-template" style="display:none">
- <img data-src="{0}"><p>{1}</p>
- <button class="acl-button-hide btn btn-xs btn-default"><i class="fa fa-times"></i> {{$hide}}</button>
- <button class="acl-button-show btn btn-xs btn-default"><i class="fa fa-check"></i> {{$show}}</button>
+ <div class="acl-item-header">
+ <img class="menu-img-1" data-src="{0}"> {1}
+ </div>
+ <button class="acl-button-hide btn btn-sm btn-outline-danger"><i class="fa fa-times"></i> {{$hide}}</button>
+ <button class="acl-button-show btn btn-sm btn-outline-success"><i class="fa fa-check"></i> {{$show}}</button>
</div>
-
</div>
<div class="modal-footer clear">
- <button type="button" class="btn btn-default" data-dismiss="modal">{{$aclModalDismiss}}</button>
+ <button type="button" class="btn btn-outline-secondary" data-dismiss="modal">{{$aclModalDismiss}}</button>
</div>
</div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->
</div><!-- /.modal -->
</form>
<script>
- $('[data-toggle="popover"]').popover(); // Init the popover, if present
+ // compatibility issue with bootstrap v4
+ //$('[data-toggle="popover"]').popover(); // Init the popover, if present
if(typeof acl=="undefined"){
acl = new ACL(
diff --git a/view/tpl/admin_accounts.tpl b/view/tpl/admin_accounts.tpl
index c2a50e3ff..3535363a0 100755
--- a/view/tpl/admin_accounts.tpl
+++ b/view/tpl/admin_accounts.tpl
@@ -33,8 +33,8 @@
<td class="email">{{$u.account_email}}</td>
<td class="checkbox_bulkedit"><input type="checkbox" class="pending_ckbx" id="id_pending_{{$u.hash}}" name="pending[]" value="{{$u.hash}}"></td>
<td class="tools">
- <a href="{{$baseurl}}/regmod/allow/{{$u.hash}}" class="btn btn-default btn-xs" title="{{$approve}}"><i class="fa fa-thumbs-o-up admin-icons"></i></a>
- <a href="{{$baseurl}}/regmod/deny/{{$u.hash}}" class="btn btn-default btn-xs" title="{{$deny}}"><i class="fa fa-thumbs-o-down admin-icons"></i></a>
+ <a href="{{$baseurl}}/regmod/allow/{{$u.hash}}" class="btn btn-outline-secondary btn-sm" title="{{$approve}}"><i class="fa fa-thumbs-o-up admin-icons"></i></a>
+ <a href="{{$baseurl}}/regmod/deny/{{$u.hash}}" class="btn btn-outline-secondary btn-sm" title="{{$deny}}"><i class="fa fa-thumbs-o-down admin-icons"></i></a>
</td>
</tr>
{{/foreach}}
@@ -73,7 +73,7 @@
<td class="service_class">{{$u.account_service_class}}</td>
<td class="checkbox_bulkedit"><input type="checkbox" class="users_ckbx" id="id_user_{{$u.account_id}}" name="user[]" value="{{$u.account_id}}"><input type="hidden" name="blocked[]" value="{{$u.blocked}}"></td>
<td class="tools">
- <a href="{{$baseurl}}/admin/accounts/{{if ($u.blocked)}}un{{/if}}block/{{$u.account_id}}?t={{$form_security_token}}" class="btn btn-default btn-xs" title='{{if ($u.blocked)}}{{$unblock}}{{else}}{{$block}}{{/if}}'><i class="fa fa-ban admin-icons{{if ($u.blocked)}} dim{{/if}}"></i></a><a href="{{$baseurl}}/admin/accounts/delete/{{$u.account_id}}?t={{$form_security_token}}" class="btn btn-default btn-xs" title='{{$delete}}' onclick="return confirm_delete('{{$u.name}}')"><i class="fa fa-trash-o admin-icons"></i></a>
+ <a href="{{$baseurl}}/admin/accounts/{{if ($u.blocked)}}un{{/if}}block/{{$u.account_id}}?t={{$form_security_token}}" class="btn btn-outline-secondary btn-sm" title='{{if ($u.blocked)}}{{$unblock}}{{else}}{{$block}}{{/if}}'><i class="fa fa-ban admin-icons{{if ($u.blocked)}} dim{{/if}}"></i></a><a href="{{$baseurl}}/admin/accounts/delete/{{$u.account_id}}?t={{$form_security_token}}" class="btn btn-outline-secondary btn-sm" title='{{$delete}}' onclick="return confirm_delete('{{$u.name}}')"><i class="fa fa-trash-o admin-icons"></i></a>
</td>
</tr>
{{/foreach}}
diff --git a/view/tpl/admin_aside.tpl b/view/tpl/admin_aside.tpl
index 70e1677af..99f139e57 100755
--- a/view/tpl/admin_aside.tpl
+++ b/view/tpl/admin_aside.tpl
@@ -12,17 +12,17 @@
</script>
<div class="widget">
<h3>{{$admtxt}}</h3>
-<ul class="nav nav-pills nav-stacked">
+<ul class="nav nav-pills flex-column">
{{foreach $admin as $link}}
- <li><a href='{{$link.0}}'>{{$link.1}}{{if $link.3}}<span id='{{$link.3}}' title='{{$link.4}}'></span>{{/if}}</a></li>
+ <li class="nav-item"><a class="nav-link" href='{{$link.0}}'>{{$link.1}}{{if $link.3}}<span id='{{$link.3}}' title='{{$link.4}}'></span>{{/if}}</a></li>
{{/foreach}}
</ul>
</div>
{{if $admin.update}}
-<ul class="nav nav-pills nav-stacked">
- <li><a href='{{$admin.update.0}}'>{{$admin.update.1}}</a></li>
- <li><a href=''>Important Changes</a></li>
+<ul class="nav nav-pills flex-column">
+ <li class="nav-item"><a class="nav-link" href='{{$admin.update.0}}'>{{$admin.update.1}}</a></li>
+ <li class="nav-item"><a class="nav-link" href=''>Important Changes</a></li>
</ul>
{{/if}}
@@ -30,9 +30,9 @@
{{if $plugins}}
<div class="widget">
<h3>{{$plugadmtxt}}</h3>
-<ul class="nav nav-pills nav-stacked">
+<ul class="nav nav-pills flex-column">
{{foreach $plugins as $l}}
- <li><a href='{{$l.0}}'>{{$l.1}}</a></li>
+ <li class="nav-item"><a class="nav-link" href='{{$l.0}}'>{{$l.1}}</a></li>
{{/foreach}}
</ul>
</div>
@@ -40,7 +40,7 @@
<div class="widget">
<h3>{{$logtxt}}</h3>
-<ul class="nav nav-pills nav-stacked">
- <li><a href='{{$logs.0}}'>{{$logs.1}}</a></li>
+<ul class="nav nav-pills flex-column">
+ <li class="nav-item"><a class="nav-link" href='{{$logs.0}}'>{{$logs.1}}</a></li>
</ul>
</div>
diff --git a/view/tpl/admin_channels.tpl b/view/tpl/admin_channels.tpl
index f15742f78..452e0eeec 100755
--- a/view/tpl/admin_channels.tpl
+++ b/view/tpl/admin_channels.tpl
@@ -35,7 +35,7 @@
<td class="checkbox_bulkedit"><input type="checkbox" class="channels_ckbx" id="id_channel_{{$c.channel_id}}" name="channel[]" value="{{$c.channel_id}}"/></td>
<td class="tools">
<a href="{{$baseurl}}/admin/channels/block/{{$c.channel_id}}?t={{$form_security_token}}" class="btn btn-default btn-xs" title='{{if ($c.blocked)}}{{$unblock}}{{else}}{{$block}}{{/if}}'><i class='fa fa-ban admin-icons {{if ($c.blocked)}}dim{{/if}}'></i></a>
- <a href="{{$baseurl}}/admin/channels/code/{{$c.channel_id}}?t={{$form_security_token}}" class="btn btn-default btn-xs" title='{{if ($c.allowcode)}}{{$uncode}}{{else}}{{$code}}{{/if}}'><i class='fa fa-terminal admin-icons {{if ($c.allowcode)}}dim{{/if}}'></i></a>
+ <a href="{{$baseurl}}/admin/channels/code/{{$c.channel_id}}?t={{$form_security_token}}" class="btn btn-default btn-xs{{if ($c.allowcode)}} btn-danger{{/if}}" title='{{if ($c.allowcode)}}{{$uncode}}{{else}}{{$code}}{{/if}}'><i class='fa fa-terminal admin-icons {{if ($c.allowcode)}}dim{{/if}}'></i></a>
<a href="{{$baseurl}}/admin/channels/delete/{{$c.channel_id}}?t={{$form_security_token}}" class="btn btn-default btn-xs" title='{{$delete}}' onclick="return confirm_delete('{{$c.channel_name}}')"><i class='fa fa-trash-o admin-icons'></i></a>
</td>
</tr>
diff --git a/view/tpl/admin_plugins.tpl b/view/tpl/admin_plugins.tpl
index 4360aa30c..fd5ae7d5e 100755
--- a/view/tpl/admin_plugins.tpl
+++ b/view/tpl/admin_plugins.tpl
@@ -2,7 +2,7 @@
<div class="section-title-wrapper">
{{if $allowManageRepos}}
<div class="pull-right">
- <button class="btn btn-success btn-xs" onclick="openClose('form');">{{$managerepos}}</button>
+ <button class="btn btn-success btn-sm" onclick="openClose('form');">{{$managerepos}}</button>
</div>
{{/if}}
<h2 id="title">{{$title}} - {{$page}}</h2>
@@ -23,10 +23,10 @@
<span class="pull-left">{{$repo.name}}</span><span id="update-message-{{$repo.name}}" style="margin-left: 20px;"></span>
</td>
<td style="width: 15%;">
- <button class="btn btn-xs btn-primary pull-right" style="margin-left: 10px; margin-right: 10px;" onclick="updateAddonRepo('{{$repo.name}}'); return false;"><i class='fa fa-download'></i>&nbsp;{{$repoUpdateButton}}</button>
+ <button class="btn btn-sm btn-primary pull-right" style="margin-left: 10px; margin-right: 10px;" onclick="updateAddonRepo('{{$repo.name}}'); return false;"><i class='fa fa-download'></i>&nbsp;{{$repoUpdateButton}}</button>
</td>
<td style="width: 15%;">
- <button class="btn btn-xs btn-danger pull-right" style="margin-left: 10px; margin-right: 0px;" onclick="removeAddonRepo('{{$repo.name}}'); return false;"><i class='fa fa-trash-o'></i>&nbsp;{{$repoRemoveButton}}</button>
+ <button class="btn btn-sm btn-danger pull-right" style="margin-left: 10px; margin-right: 0px;" onclick="removeAddonRepo('{{$repo.name}}'); return false;"><i class='fa fa-trash-o'></i>&nbsp;{{$repoRemoveButton}}</button>
</td>
<div class="clear"></div>
</td></tr>
diff --git a/view/tpl/admin_profiles.tpl b/view/tpl/admin_profiles.tpl
index 35685505f..e3a08449c 100644
--- a/view/tpl/admin_profiles.tpl
+++ b/view/tpl/admin_profiles.tpl
@@ -1,5 +1,5 @@
<div class="generic-content-wrapper">
-<div class="section-title-wrapper"><a title="{{$new}}" class="btn btn-primary btn-xs pull-right" href="admin/profs/new"><i class="fa fa-plus-circle"></i>&nbsp;{{$new}}</a><h2>{{$title}}</h2>
+<div class="section-title-wrapper"><a title="{{$new}}" class="btn btn-primary btn-sm pull-right" href="admin/profs/new"><i class="fa fa-plus-circle"></i>&nbsp;{{$new}}</a><h2>{{$title}}</h2>
<div class="clear"></div>
</div>
@@ -28,7 +28,7 @@
<table width="100%">
{{foreach $cust_fields as $field}}
-<tr><td>{{$field.field_name}}</td><td>{{$field.field_desc}}</td><td><a class="btn btn-danger btn-xs" href="admin/profs/drop/{{$field.id}}" title="{{$drop}}"><i class="fa fa-trash-o"></i>&nbsp;{{$drop}}</a> <a class="btn btn-xs" title="{{$edit}}" href="admin/profs/{{$field.id}}" ><i class="fa fa-pencil"></i></a></td></tr>
+<tr><td>{{$field.field_name}}</td><td>{{$field.field_desc}}</td><td><a class="btn btn-danger btn-sm" href="admin/profs/drop/{{$field.id}}" title="{{$drop}}"><i class="fa fa-trash-o"></i>&nbsp;{{$drop}}</a> <a class="btn btn-sm" title="{{$edit}}" href="admin/profs/{{$field.id}}" ><i class="fa fa-pencil"></i></a></td></tr>
{{/foreach}}
</table>
{{/if}}
diff --git a/view/tpl/admin_queue.tpl b/view/tpl/admin_queue.tpl
index 35c2e644a..9d3d848c9 100644
--- a/view/tpl/admin_queue.tpl
+++ b/view/tpl/admin_queue.tpl
@@ -7,7 +7,7 @@
{{foreach $entries as $e}}
-<tr><td>{{$e.total}}</td><td>{{$e.outq_posturl}}</td><td>{{$e.priority}}</td>{{if $expert}}<td><a href="admin/queue?f=&drophub={{$e.eurl}}" title="{{$nukehub}}" class="btn btn-default"><i class="fa fa-times"></i><a></td><td><a href="admin/queue?f=&emptyhub={{$e.eurl}}" title="{{$empty}}" class="btn btn-default"><i class="fa fa-trash-o"></i></a></td>{{/if}}</tr>
+<tr><td>{{$e.total}}</td><td>{{$e.outq_posturl}}</td><td>{{$e.priority}}</td>{{if $expert}}<td><a href="admin/queue?f=&drophub={{$e.eurl}}" title="{{$nukehub}}" class="btn btn-outline-secondary"><i class="fa fa-times"></i><a></td><td><a href="admin/queue?f=&emptyhub={{$e.eurl}}" title="{{$empty}}" class="btn btn-outline-secondary"><i class="fa fa-trash-o"></i></a></td>{{/if}}</tr>
{{/foreach}}
</table>
diff --git a/view/tpl/admin_site.tpl b/view/tpl/admin_site.tpl
index 0bb3ceb15..6fd0fd9ce 100755
--- a/view/tpl/admin_site.tpl
+++ b/view/tpl/admin_site.tpl
@@ -51,6 +51,11 @@
{{include file="field_textarea.tpl" field=$banner}}
{{include file="field_textarea.tpl" field=$siteinfo}}
{{include file="field_textarea.tpl" field=$admininfo}}
+
+ {{include file="field_input.tpl" field=$reply_address}}
+ {{include file="field_input.tpl" field=$from_email}}
+ {{include file="field_input.tpl" field=$from_email_name}}
+
{{include file="field_select.tpl" field=$language}}
{{include file="field_select.tpl" field=$theme}}
{{include file="field_select.tpl" field=$theme_mobile}}
@@ -71,9 +76,6 @@
{{include file="field_select.tpl" field=$access_policy}}
<div class="submit"><input type="submit" name="page_site" value="{{$submit}}" /></div>
- <h3>{{$upload}}</h3>
- {{include file="field_input.tpl" field=$maximagesize}}
-
<h3>{{$corporate}}</h3>
{{include file="field_checkbox.tpl" field=$verify_email}}
{{include file="field_checkbox.tpl" field=$feed_contacts}}
diff --git a/view/tpl/app.tpl b/view/tpl/app.tpl
index 5ff205c53..28f28611e 100644
--- a/view/tpl/app.tpl
+++ b/view/tpl/app.tpl
@@ -8,23 +8,23 @@
{{if $app.type !== 'system'}}
{{if $purchase}}
<div class="app-purchase">
- <a href="{{$app.page}}" class="btn btn-default" title="{{$purchase}}" ><i class="fa fa-external"></i></a>
+ <a href="{{$app.page}}" class="btn btn-outline-secondary" title="{{$purchase}}" ><i class="fa fa-external"></i></a>
</div>
{{/if}}
{{if $install || $update || $delete || $feature}}
<div class="app-tools">
<form action="{{$hosturl}}appman" method="post">
<input type="hidden" name="papp" value="{{$app.papp}}" />
- {{if $install}}<button type="submit" name="install" value="{{$install}}" class="btn btn-default btn-xs" title="{{$install}}" ><i class="fa fa-arrow-circle-o-down" ></i></button>{{/if}}
- {{if $edit}}<input type="hidden" name="appid" value="{{$app.guid}}" /><button type="submit" name="edit" value="{{$edit}}" class="btn btn-default btn-xs" title="{{$edit}}" ><i class="fa fa-pencil" ></i></button>{{/if}}
- {{if $delete}}<button type="submit" name="delete" value="{{if $deleted}}{{$undelete}}{{else}}{{$delete}}{{/if}}" class="btn btn-default btn-xs" title="{{if $deleted}}{{$undelete}}{{else}}{{$delete}}{{/if}}" ><i class="fa fa-trash-o drop-icons"></i></button>{{/if}}
- {{if $feature}}<button type="submit" name="feature" value="feature" class="btn btn-default btn-xs" title="{{if $featured}}{{$remove}}{{else}}{{$add}}{{/if}}"><i class="fa fa-star"{{if $featured}} style="color: gold"{{/if}}></i></button>{{/if}}
+ {{if $install}}<button type="submit" name="install" value="{{$install}}" class="btn btn-outline-secondary btn-sm" title="{{$install}}" ><i class="fa fa-arrow-circle-o-down" ></i></button>{{/if}}
+ {{if $edit}}<input type="hidden" name="appid" value="{{$app.guid}}" /><button type="submit" name="edit" value="{{$edit}}" class="btn btn-outline-secondary btn-sm" title="{{$edit}}" ><i class="fa fa-pencil" ></i></button>{{/if}}
+ {{if $delete}}<button type="submit" name="delete" value="{{if $deleted}}{{$undelete}}{{else}}{{$delete}}{{/if}}" class="btn btn-outline-secondary btn-sm" title="{{if $deleted}}{{$undelete}}{{else}}{{$delete}}{{/if}}" ><i class="fa fa-trash-o drop-icons"></i></button>{{/if}}
+ {{if $feature}}<button type="submit" name="feature" value="feature" class="btn btn-outline-secondary btn-sm" title="{{if $featured}}{{$remove}}{{else}}{{$add}}{{/if}}"><i class="fa fa-star"{{if $featured}} style="color: gold"{{/if}}></i></button>{{/if}}
</form>
</div>
{{/if}}
{{/if}}
</div>
{{else}}
-<li><a href="{{$app.url}}">{{if $icon}}<i class="generic-icons-nav fa fa-fw fa-{{$icon}}"></i>{{else}}<img src="{{$app.photo}}" width="16" height="16" style="margin-right:9px;"/>{{/if}}{{$app.name}}</a></li>
+<a class="dropdown-item" href="{{$app.url}}">{{if $icon}}<i class="generic-icons-nav fa fa-fw fa-{{$icon}}"></i>{{else}}<img src="{{$app.photo}}" width="16" height="16" style="margin-right:9px;"/>{{/if}}{{$app.name}}</a>
{{/if}}
diff --git a/view/tpl/app_create.tpl b/view/tpl/app_create.tpl
index 7a0521436..5075ce5e2 100644
--- a/view/tpl/app_create.tpl
+++ b/view/tpl/app_create.tpl
@@ -3,7 +3,7 @@
<h2>{{$banner}}</h2>
</div>
- <div class="section-content-wrapper">
+ <div class="clearfix section-content-wrapper">
<form action="appman" method="post">
{{if $guid}}
<input type="hidden" name="guid" value="{{$guid}}" />
@@ -33,7 +33,7 @@
{{include file="field_textarea.tpl" field=$embed}}
{{/if}}
- <input type="submit" name="submit" value="{{$submit}}" />
+ <button class="btn btn-primary float-right" type="submit" name="submit" value="{{$submit}}">{{$submit}}</button>
</form>
</div>
diff --git a/view/tpl/atom_feed.tpl b/view/tpl/atom_feed.tpl
index 37eaf954a..ba50867ff 100755
--- a/view/tpl/atom_feed.tpl
+++ b/view/tpl/atom_feed.tpl
@@ -3,24 +3,21 @@
xmlns:thr="http://purl.org/syndication/thread/1.0"
xmlns:at="http://purl.org/atompub/tombstones/1.0"
xmlns:media="http://purl.org/syndication/atommedia"
- xmlns:dfrn="http://purl.org/macgirvin/dfrn/1.0"
+ xmlns:dfrn="http://purl.org/macgirvin/dfrn/1.0"
xmlns:zot="http://purl.org/zot"
xmlns:as="http://activitystrea.ms/spec/1.0/"
- xmlns:georss="http://www.georss.org/georss"
- xmlns:poco="http://portablecontacts.net/spec/1.0"
- xmlns:ostatus="http://ostatus.org/schema/1.0"
- xmlns:statusnet="http://status.net/schema/api/1/" >
+ xmlns:georss="http://www.georss.org/georss"
+ xmlns:poco="http://portablecontacts.net/spec/1.0"
+ xmlns:ostatus="http://ostatus.org/schema/1.0"
+ xmlns:statusnet="http://status.net/schema/api/1/" >
<id>{{$feed_id}}</id>
<title>{{$feed_title}}</title>
<generator uri="http://hubzilla.org" version="{{$version}}">{{$red}}</generator>
<link rel="license" href="http://creativecommons.org/licenses/by/3.0/" />
<link rel="alternate" type="text/html" href="{{$profile_page}}" />
-{{if $hub}}
- {{$hub}}
-{{/if}}
-{{if $salmon}}
- {{$salmon}}
+{{if $author}}
+{{$author}}
{{/if}}
<updated>{{$feed_updated}}</updated>
diff --git a/view/tpl/attach_edit.tpl b/view/tpl/attach_edit.tpl
index 1d58004e5..62442ff7a 100644
--- a/view/tpl/attach_edit.tpl
+++ b/view/tpl/attach_edit.tpl
@@ -7,19 +7,19 @@
{{if $isadir}}{{include file="field_checkbox.tpl" field=$recurse}}{{/if}}
<div id="attach-edit-tools-share" class="btn-group form-group">
{{if !$isadir}}
- <a href="/rpost?attachment=[attachment]{{$file.hash}},{{$file.revision}}[/attachment]" id="attach-btn" class="btn btn-default btn-xs" title="{{$attach_btn_title}}">
+ <a href="/rpost?attachment=[attachment]{{$file.hash}},{{$file.revision}}[/attachment]" id="attach-btn" class="btn btn-outline-secondary btn-sm" title="{{$attach_btn_title}}">
<i class="fa fa-share-square-o jot-icons"></i>
</a>
{{/if}}
- <button id="link-btn" class="btn btn-default btn-xs" type="button" onclick="openClose('link-code');" title="{{$link_btn_title}}">
+ <button id="link-btn" class="btn btn-outline-secondary btn-sm" type="button" onclick="openClose('link-code');" title="{{$link_btn_title}}">
<i class="fa fa-link jot-icons"></i>
</button>
</div>
<div id="attach-edit-perms" class="btn-group pull-right">
- <button id="dbtn-acl" class="btn btn-default btn-xs" data-toggle="modal" data-target="#aclModal" title="{{$permset}}" type="button">
+ <button id="dbtn-acl" class="btn btn-outline-secondary btn-sm" data-toggle="modal" data-target="#aclModal" title="{{$permset}}" type="button">
<i id="jot-perms-icon" class="fa fa-{{$lockstate}} jot-icons"></i>
</button>
- <button id="dbtn-submit" class="btn btn-primary btn-xs" type="submit" name="submit">
+ <button id="dbtn-submit" class="btn btn-primary btn-sm" type="submit" name="submit">
{{$submit}}
</button>
</div>
diff --git a/view/tpl/blocklist.tpl b/view/tpl/blocklist.tpl
index c88d91463..7f400bba2 100644
--- a/view/tpl/blocklist.tpl
+++ b/view/tpl/blocklist.tpl
@@ -2,7 +2,7 @@
<div class="section-title-wrapper">
{{if $editor}}
<div class="pull-right">
- <button id="webpage-create-btn" class="btn btn-xs btn-success" onclick="openClose('block-editor');"><i class="fa fa-pencil-square-o"></i>&nbsp;{{$create}}</button>
+ <button id="webpage-create-btn" class="btn btn-sm btn-success" onclick="openClose('block-editor');"><i class="fa fa-pencil-square-o"></i>&nbsp;{{$create}}</button>
</div>
{{/if}}
<h2>{{$title}}</h2>
@@ -22,8 +22,8 @@
<th width="1%"></th>
<th width="1%"></th>
<th width="1%"></th>
- <th width="1%" class="hidden-xs">{{$created}}</th>
- <th width="1%" class="hidden-xs">{{$edited}}</th>
+ <th width="1%" class="d-none d-md-table-cell">{{$created}}</th>
+ <th width="1%" class="d-none d-md-table-cell">{{$edited}}</th>
</tr>
{{foreach $pages as $key => $items}}
{{foreach $items as $item}}
@@ -53,10 +53,10 @@
<a href="#" title="{{$delete}}" onclick="dropItem('item/drop/{{$item.url}}', '#block-list-item-{{$item.url}}'); return false;"><i class="fa fa-trash-o drop-icons"></i></a>
{{/if}}
</td>
- <td class="hidden-xs">
+ <td class="d-none d-md-table-cell">
{{$item.created}}
</td>
- <td class="hidden-xs">
+ <td class="d-none d-md-table-cell">
{{$item.edited}}
</td>
</tr>
diff --git a/view/tpl/build_query.tpl b/view/tpl/build_query.tpl
index 91bb0bfc0..a76d4e549 100755
--- a/view/tpl/build_query.tpl
+++ b/view/tpl/build_query.tpl
@@ -20,6 +20,7 @@
var bParam_static = {{$static}};
var bParam_search = "{{$search}}";
+ var bParam_xchan = "{{$xchan}}";
var bParam_order = "{{$order}}";
var bParam_file = "{{$file}}";
var bParam_cats = "{{$cats}}";
@@ -47,6 +48,7 @@
if(bParam_list != 0) bCmd = bCmd + "&list=" + bParam_list;
if(bParam_fh != 0) bCmd = bCmd + "&fh=" + bParam_fh;
if(bParam_search != "") bCmd = bCmd + "&search=" + bParam_search;
+ if(bParam_xchan != "") bCmd = bCmd + "&xchan=" + bParam_xchan;
if(bParam_order != "") bCmd = bCmd + "&order=" + bParam_order;
if(bParam_file != "") bCmd = bCmd + "&file=" + bParam_file;
if(bParam_cats != "") bCmd = bCmd + "&cat=" + bParam_cats;
diff --git a/view/tpl/categories_widget.tpl b/view/tpl/categories_widget.tpl
index ea6d28dfc..72478aa3d 100755
--- a/view/tpl/categories_widget.tpl
+++ b/view/tpl/categories_widget.tpl
@@ -2,10 +2,10 @@
<h3>{{$title}}</h3>
<div id="categories-sidebar-desc">{{$desc}}</div>
- <ul class="nav nav-pills nav-stacked">
- <li><a href="{{$base}}"{{if $sel_all}} class="categories-selected"{{/if}}>{{$all}}</a></li>
+ <ul class="nav nav-pills flex-column">
+ <li class="nav-item"><a href="{{$base}}" class="nav-link{{if $sel_all}} active{{/if}}">{{$all}}</a></li>
{{foreach $terms as $term}}
- <li><a href="{{$base}}?f=&cat={{$term.name}}"{{if $term.selected}} class="categories-selected"{{/if}}>{{$term.name}}</a></li>
+ <li class="nav-item"><a href="{{$base}}?f=&cat={{$term.name}}" class="nav-link{{if $term.selected}} active{{/if}}">{{$term.name}}</a></li>
{{/foreach}}
</ul>
diff --git a/view/tpl/channel_import.tpl b/view/tpl/channel_import.tpl
index 2028d6181..baffe9b06 100755
--- a/view/tpl/channel_import.tpl
+++ b/view/tpl/channel_import.tpl
@@ -1,7 +1,7 @@
<h2>{{$title}}</h2>
<form action="import" method="post" enctype="multipart/form-data" id="import-channel-form">
-
+ <input type="hidden" name="form_security_token" value="{{$form_security_token}}">
<div id="import-desc" class="descriptive-paragraph">{{$desc}}</div>
<label for="import-filename" id="label-import-filename" class="import-label" >{{$label_filename}}</label>
@@ -40,7 +40,4 @@
<div id="import-submit-end" class="import-field-end"></div>
<div id="import-common-desc" class="descriptive-paragraph">{{$pleasewait}}</div>
-
-
</form>
-
diff --git a/view/tpl/channels.tpl b/view/tpl/channels.tpl
index 171f833ee..f484b49e5 100755
--- a/view/tpl/channels.tpl
+++ b/view/tpl/channels.tpl
@@ -1,6 +1,6 @@
<div class="generic-content-wrapper">
<div class="section-title-wrapper">
- <a class="btn btn-success btn-xs pull-right" href="{{$create.0}}" title="{{$create.1}}"><i class="fa fa-plus-circle"></i>&nbsp;{{$create.2}}</a>
+ <a class="btn btn-success btn-sm pull-right" href="{{$create.0}}" title="{{$create.1}}"><i class="fa fa-plus-circle"></i>&nbsp;{{$create.2}}</a>
<h2>{{$header}}</h2>
</div>
<div class="section-content-wrapper-np">
diff --git a/view/tpl/chat.tpl b/view/tpl/chat.tpl
index 31be4136f..22f3465bf 100644
--- a/view/tpl/chat.tpl
+++ b/view/tpl/chat.tpl
@@ -5,11 +5,11 @@
<form id="chat-destroy" method="post" action="chat">
<input type="hidden" name="room_name" value="{{$room_name}}" />
<input type="hidden" name="action" value="drop" />
- <button class="btn btn-danger btn-xs" type="submit" name="submit" value="{{$drop}}" onclick="return confirmDelete();"><i class="fa fa-trash-o"></i>&nbsp;{{$drop}}</button>
+ <button class="btn btn-danger btn-sm" type="submit" name="submit" value="{{$drop}}" onclick="return confirmDelete();"><i class="fa fa-trash-o"></i>&nbsp;{{$drop}}</button>
</form>
{{/if}}
- <button id="fullscreen-btn" type="button" class="btn btn-default btn-xs" onclick="makeFullScreen(); adjustFullscreenTopBarHeight();"><i class="fa fa-expand"></i></button>
- <button id="inline-btn" type="button" class="btn btn-default btn-xs" onclick="makeFullScreen(false); adjustInlineTopBarHeight();"><i class="fa fa-compress"></i></button>
+ <button id="fullscreen-btn" type="button" class="btn btn-outline-secondary btn-sm" onclick="makeFullScreen(); adjustFullscreenTopBarHeight();"><i class="fa fa-expand"></i></button>
+ <button id="inline-btn" type="button" class="btn btn-outline-secondary btn-sm" onclick="makeFullScreen(false); adjustInlineTopBarHeight();"><i class="fa fa-compress"></i></button>
</div>
<h2>{{$room_name}}</h2>
<div class="clear"></div>
@@ -27,62 +27,62 @@
</div>
<div id="chat-submit-wrapper">
<div id="chat-submit" class="dropup pull-right">
- <button class="btn btn-default btn-sm dropdown-toggle" type="button" data-toggle="dropdown"><i class="fa fa-caret-up"></i></button>
+ <button class="btn btn-outline-secondary btn-sm dropdown-toggle" type="button" data-toggle="dropdown"><i class="fa fa-cog"></i></button>
<button class="btn btn-primary btn-sm" type="submit" id="chat-submit" name="submit" value="{{$submit}}">{{$submit}}</button>
- <ul class="dropdown-menu">
- <li class="nav-item"><a class="nav-link" href="{{$baseurl}}/chatsvc?f=&room_id={{$room_id}}&status=online"><i class="fa fa-circle online"></i>&nbsp;{{$online}}</a></li>
- <li class="nav-item"><a class="nav-link" href="{{$baseurl}}/chatsvc?f=&room_id={{$room_id}}&status=away"><i class="fa fa-circle away"></i>&nbsp;{{$away}}</a></li>
- <li class="nav-item"><a class="nav-link" href="{{$baseurl}}/chat/{{$nickname}}/{{$room_id}}/leave"><i class="fa fa-circle leave"></i>&nbsp;{{$leave}}</a></li>
- <li class="divider"></li>
- <li class="nav-item" id="toggle-notifications"><a class="nav-link" href="" onclick="toggleChatNotifications(); return false;"><i id="toggle-notifications-icon" class="fa fa-bell-slash-o"></i>&nbsp;Toggle notifications</a></li>
- <li class="nav-item disabled" id="toggle-notifications-audio"><a class="nav-link" href="" onclick="toggleChatNotificationAudio(); return false;"><i id="toggle-notifications-audio-icon" class="fa fa-volume-off"></i>&nbsp;Toggle sound</a></li>
+ <div class="dropdown-menu dropdown-menu-right">
+ <a class="dropdown-item" href="{{$baseurl}}/chatsvc?f=&room_id={{$room_id}}&status=online"><i class="fa fa-circle online"></i>&nbsp;{{$online}}</a>
+ <a class="dropdown-item" href="{{$baseurl}}/chatsvc?f=&room_id={{$room_id}}&status=away"><i class="fa fa-circle away"></i>&nbsp;{{$away}}</a>
+ <a class="dropdown-item" href="{{$baseurl}}/chat/{{$nickname}}/{{$room_id}}/leave"><i class="fa fa-circle leave"></i>&nbsp;{{$leave}}</a>
+ <div class="dropdown-divider"></div>
+ <a id="toggle-notifications" class="dropdown-item" href="" onclick="toggleChatNotifications(); return false;"><i id="toggle-notifications-icon" class="fa fa-bell-slash-o"></i>&nbsp;Toggle notifications</a>
+ <a id="toggle-notifications-audio" class="dropdown-item disabled" href="" onclick="toggleChatNotificationAudio(); return false;"><i id="toggle-notifications-audio-icon" class="fa fa-volume-off"></i>&nbsp;Toggle sound</a>
{{if $bookmark_link}}
- <li class="divider"></li>
- <li class="nav-item"><a class="nav-link" href="{{$bookmark_link}}" target="_blank" ><i class="fa fa-bookmark"></i>&nbsp;{{$bookmark}}</a></li>
+ <div class="dropdown-divider"></div>
+ <a class="dropdown-item" href="{{$bookmark_link}}" target="_blank" ><i class="fa fa-bookmark"></i>&nbsp;{{$bookmark}}</a>
{{/if}}
- </ul>
+ </div>
</div>
<div id="chat-tools" class="btn-toolbar pull-left">
- <div class="btn-group">
- <button id="main-editor-bold" class="btn btn-default btn-sm" title="{{$bold}}" onclick="inserteditortag('b', 'chatText'); return false;">
+ <div class="btn-group mr-2">
+ <button id="main-editor-bold" class="btn btn-outline-secondary btn-sm" title="{{$bold}}" onclick="inserteditortag('b', 'chatText'); return false;">
<i class="fa fa-bold jot-icons"></i>
</button>
- <button id="main-editor-italic" class="btn btn-default btn-sm" title="{{$italic}}" onclick="inserteditortag('i', 'chatText'); return false;">
+ <button id="main-editor-italic" class="btn btn-outline-secondary btn-sm" title="{{$italic}}" onclick="inserteditortag('i', 'chatText'); return false;">
<i class="fa fa-italic jot-icons"></i>
</button>
- <button id="main-editor-underline" class="btn btn-default btn-sm" title="{{$underline}}" onclick="inserteditortag('u', 'chatText'); return false;">
+ <button id="main-editor-underline" class="btn btn-outline-secondary btn-sm" title="{{$underline}}" onclick="inserteditortag('u', 'chatText'); return false;">
<i class="fa fa-underline jot-icons"></i>
</button>
- <button id="main-editor-quote" class="btn btn-default btn-sm" title="{{$quote}}" onclick="inserteditortag('quote', 'chatText'); return false;">
+ <button id="main-editor-quote" class="btn btn-outline-secondary btn-sm" title="{{$quote}}" onclick="inserteditortag('quote', 'chatText'); return false;">
<i class="fa fa-quote-left jot-icons"></i>
</button>
- <button id="main-editor-code" class="btn btn-default btn-sm" title="{{$code}}" onclick="inserteditortag('code', 'chatText'); return false;">
+ <button id="main-editor-code" class="btn btn-outline-secondary btn-sm" title="{{$code}}" onclick="inserteditortag('code', 'chatText'); return false;">
<i class="fa fa-terminal jot-icons"></i>
</button>
</div>
- <div class="btn-group hidden-xs">
- <button id="chat-link-wrapper" class="btn btn-default btn-sm" onclick="chatJotGetLink(); return false;" >
+ <div class="btn-group mr-2 d-none d-md-flex">
+ <button id="chat-link-wrapper" class="btn btn-outline-secondary btn-sm" onclick="chatJotGetLink(); return false;" >
<i id="chat-link" class="fa fa-link jot-icons" title="{{$insert}}" ></i>
</button>
</div>
{{if $feature_encrypt}}
- <div class="btn-group hidden-xs">
- <button id="chat-encrypt-wrapper" class="btn btn-default btn-sm" onclick="red_encrypt('{{$cipher}}', '#chatText', $('#chatText').val()); return false;">
+ <div class="btn-group mr-2 d-none d-md-flex">
+ <button id="chat-encrypt-wrapper" class="btn btn-outline-secondary btn-sm" onclick="red_encrypt('{{$cipher}}', '#chatText', $('#chatText').val()); return false;">
<i id="chat-encrypt" class="fa fa-key jot-icons" title="{{$encrypt}}" ></i>
</button>
</div>
{{/if}}
- <div class="btn-group dropup visible-xs">
- <button type="button" id="more-tools" class="btn btn-default btn-sm dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
- <i id="more-tools-icon" class="fa fa-caret-up jot-icons"></i>
+ <div class="btn-group dropup d-md-none">
+ <button type="button" id="more-tools" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
+ <i id="more-tools-icon" class="fa fa-cog jot-icons"></i>
</button>
- <ul class="dropdown-menu dropdown-menu-right" role="menu">
- <li class="visible-xs"><a href="#" onclick="chatJotGetLink(); return false;" ><i class="fa fa-link"></i>&nbsp;{{$insert}}</a></li>
+ <div class="dropdown-menu">
+ <a class="dropdown-item" href="#" onclick="chatJotGetLink(); return false;" ><i class="fa fa-link"></i>&nbsp;{{$insert}}</a>
{{if $feature_encrypt}}
- <li class="divider"></li>
- <li class="visible-xs"><a href="#" onclick="red_encrypt('{{$cipher}}', '#chatText' ,$('#chatText').val()); return false;"><i class="fa fa-key"></i>&nbsp;{{$encrypt}}</a></li>
+ <div class="dropdown-divider"></div>
+ <a class="dropdown-item" href="#" onclick="red_encrypt('{{$cipher}}', '#chatText' ,$('#chatText').val()); return false;"><i class="fa fa-key"></i>&nbsp;{{$encrypt}}</a>
{{/if}}
- </ul>
+ </div>
</div>
</div>
<div id="chat-rotator-wrapper" class="pull-left">
@@ -150,7 +150,7 @@ function update_inroom(inroom) {
$.each( inroom, function(index, item) {
var newNode = document.createElement('div');
newNode.setAttribute('class', 'member-item');
- $(newNode).html('<img style="height: 32px; width: 32px;" src="' + item.img + '" alt="' + item.name + '" /> ' + '<span class="name">' + item.name + '</span><br /><span class="' + item.status_class + '">' + item.status + '</span>');
+ $(newNode).html('<img class="menu-img-2" src="' + item.img + '" alt="' + item.name + '" /> ' + '<span class="contactname">' + item.name + '</span><span class="' + item.status_class + '">' + item.status + '</span>');
html.appendChild(newNode);
});
memberChange = chatRoomMembersChange(inroom); // get list of arrivals and departures
diff --git a/view/tpl/chatroom_new.tpl b/view/tpl/chatroom_new.tpl
index 1b7e0501a..1497939f6 100644
--- a/view/tpl/chatroom_new.tpl
+++ b/view/tpl/chatroom_new.tpl
@@ -3,7 +3,7 @@
{{include file="field_input.tpl" field=$name}}
{{include file="field_input.tpl" field=$chat_expire}}
<div class="btn-group pull-right">
- <button id="dbtn-acl" class="btn btn-default" data-toggle="modal" data-target="#aclModal" title="{{$permissions}}" onclick="return false;" ><i id="jot-perms-icon" class="fa fa-{{$lockstate}}"></i></button>
+ <button id="dbtn-acl" class="btn btn-outline-secondary" data-toggle="modal" data-target="#aclModal" title="{{$permissions}}" onclick="return false;" ><i id="jot-perms-icon" class="fa fa-{{$lockstate}}"></i></button>
<button id="dbtn-submit" class="acl-submit btn btn-primary" type="submit" name="submit" value="{{$submit}}" data-formid="chatroom-new-form">{{$submit}}</button>
</div>
<div class="clear"></div>
diff --git a/view/tpl/chatroomlist.tpl b/view/tpl/chatroomlist.tpl
index ff4b79a4b..a81b8ec1e 100644
--- a/view/tpl/chatroomlist.tpl
+++ b/view/tpl/chatroomlist.tpl
@@ -1,9 +1,9 @@
<div id="chatroom_list" class="widget">
<h3>{{$header}}</h3>
- <ul class="nav nav-pills nav-stacked">
- <li><a href="{{$baseurl}}/chat/{{$nickname}}">{{$overview}}</a></li>
+ <ul class="nav nav-pills flex-column">
+ <li class="nav-item"><a class="nav-link" href="{{$baseurl}}/chat/{{$nickname}}">{{$overview}}</a></li>
{{foreach $items as $item}}
- <li><a href="{{$baseurl}}/chat/{{$nickname}}/{{$item.cr_id}}"><span class="badge pull-right">{{$item.cr_inroom}}</span>{{$item.cr_name}}</a></li>
+ <li class="nav-item"><a class="nav-link" href="{{$baseurl}}/chat/{{$nickname}}/{{$item.cr_id}}"><span class="badge pull-right">{{$item.cr_inroom}}</span>{{$item.cr_name}}</a></li>
{{/foreach}}
</ul>
</div>
diff --git a/view/tpl/chatrooms.tpl b/view/tpl/chatrooms.tpl
index 64f6e8d0f..d3eeed24f 100644
--- a/view/tpl/chatrooms.tpl
+++ b/view/tpl/chatrooms.tpl
@@ -1,7 +1,7 @@
<div class="generic-content-wrapper">
- <div class="section-title-wrapper">
+ <div class="section-title-wrapper clearfix">
{{if $is_owner}}
- <button type="button" class="btn btn-success btn-xs pull-right acl-form-trigger" onclick="openClose('chatroom-new');" data-form_id="chatroom-new-form"><i class="fa fa-plus-circle"></i>&nbsp;{{$newroom}}</button>
+ <button type="button" class="btn btn-success btn-sm pull-right acl-form-trigger" onclick="openClose('chatroom-new');" data-form_id="chatroom-new-form"><i class="fa fa-plus-circle"></i>&nbsp;{{$newroom}}</button>
{{/if}}
<h2>{{$header}}</h2>
</div>
@@ -21,13 +21,13 @@
<tr class="chatroom-index-row">
<td><a href="{{$baseurl}}/chat/{{$nickname}}/{{$room.cr_id}}">{{$room.cr_name}}</a></td>
<td>{{$room.cr_expire}}&nbsp;min</td>
- <td class="chatrooms-index-tool{{if $room.allow_cid || $room.allow_gid || $room.deny_cid || $room.deny_gid}} dropdown pull-right{{/if}}">
+ <td class="chatrooms-index-tool{{if $room.allow_cid || $room.allow_gid || $room.deny_cid || $room.deny_gid}} dropdown float-right{{/if}}">
{{if $room.allow_cid || $room.allow_gid || $room.deny_cid || $room.deny_gid}}
- <i class="fa fa-lock lockview dropdown-toggle" data-toggle="dropdown" onclick="lockview('chatroom',{{$room.cr_id}});"></i>
+ <i class="fa fa-lock lockview" data-toggle="dropdown" onclick="lockview('chatroom',{{$room.cr_id}});"></i>
<ul id="panel-{{$room.cr_id}}" class="lockview-panel dropdown-menu"></ul>
{{/if}}
</td>
- <td><span class="badge">{{$room.cr_inroom}}</span></td>
+ <td><span class="badge badge-default">{{$room.cr_inroom}}</span></td>
</tr>
{{/foreach}}
</table>
diff --git a/view/tpl/cloud_actionspanel.tpl b/view/tpl/cloud_actionspanel.tpl
index 36edc3b44..0ebecce29 100644
--- a/view/tpl/cloud_actionspanel.tpl
+++ b/view/tpl/cloud_actionspanel.tpl
@@ -8,7 +8,7 @@
<div class="pull-right btn-group">
<div class="btn-group">
{{if $lockstate}}
- <button class="btn btn-default btn-sm" data-toggle="modal" data-target="#aclModal" type="button">
+ <button class="btn btn-outline-secondary btn-sm" data-toggle="modal" data-target="#aclModal" type="button">
<i class="jot-perms-icon fa fa-{{$lockstate}}"></i>
</button>
{{/if}}
@@ -19,7 +19,7 @@
<div class="clear"></div>
</div>
<div id="files-upload-tools" class="section-content-tools-wrapper">
- {{if $quota.limit || $quota.used}}<div class="{{if $quota.warning}}section-content-danger-wrapper{{else}}section-content-info-wrapper{{/if}}">{{if $quota.warning}}<strong>{{$quota.warning}} </strong>{{/if}}{{$quota.desc}}</div>{{/if}}
+ {{if $quota.limit || $quota.used}}<div class="{{if $quota.warning}}section-content-danger-wrapper{{else}}section-content-info-wrapper{{/if}}">{{if $quota.warning}}<strong>{{$quota.warning}} </strong>{{/if}}{{if $quota.desc}}{{$quota.desc}}<br><br>{{/if}}{{$info}}</div>{{/if}}
<form id="ajax-upload-files" method="post" action="file_upload" enctype="multipart/form-data" class="acl-form" data-form_id="ajax-upload-files" data-allow_cid='{{$allow_cid}}' data-allow_gid='{{$allow_gid}}' data-deny_cid='{{$deny_cid}}' data-deny_gid='{{$deny_gid}}'>
<input type="hidden" name="directory" value="{{$path}}" />
<input type="hidden" name="channick" value="{{$channick}}" />
@@ -29,7 +29,7 @@
<div class="pull-right btn-group">
<div class="btn-group">
{{if $lockstate}}
- <button class="btn btn-default btn-sm" data-toggle="modal" data-target="#aclModal" type="button">
+ <button class="btn btn-outline-secondary btn-sm" data-toggle="modal" data-target="#aclModal" type="button">
<i class="jot-perms-icon fa fa-{{$lockstate}}"></i>
</button>
{{/if}}
diff --git a/view/tpl/cloud_directory.tpl b/view/tpl/cloud_directory.tpl
index 5a84028c1..adc8584c3 100644
--- a/view/tpl/cloud_directory.tpl
+++ b/view/tpl/cloud_directory.tpl
@@ -5,8 +5,8 @@
<th width="92%">{{$name}}</th>
<th width="1%"></th><th width="1%"></th><th width="1%"></th><th width="1%"></th>
<th width="1%">{{*{{$type}}*}}</th>
- <th width="1%" class="hidden-xs">{{$size}}</th>
- <th width="1%" class="hidden-xs">{{$lastmod}}</th>
+ <th width="1%" class="d-none d-md-table-cell">{{$size}}</th>
+ <th width="1%" class="d-none d-md-table-cell">{{$lastmod}}</th>
</tr>
{{if $parentpath}}
<tr>
@@ -14,8 +14,8 @@
<td><a href="{{$parentpath.path}}" title="{{$parent}}">..</a></td>
<td></td><td></td><td></td><td></td>
<td>{{*[{{$parent}}]*}}</td>
- <td class="hidden-xs"></td>
- <td class="hidden-xs"></td>
+ <td class="d-none d-md-table-cell"></td>
+ <td class="d-none d-md-table-cell"></td>
</tr>
{{/if}}
<tr id="new-upload-progress-bar--1"></tr> {{* this is needed to append the upload files in the right order *}}
@@ -33,8 +33,8 @@
<td></td><td></td><td></td><td></td>
{{/if}}
<td>{{*{{$item.type}}*}}</td>
- <td class="hidden-xs">{{$item.sizeFormatted}}</td>
- <td class="hidden-xs">{{$item.lastmodified}}</td>
+ <td class="d-none d-md-table-cell">{{$item.sizeFormatted}}</td>
+ <td class="d-none d-md-table-cell">{{$item.lastmodified}}</td>
</tr>
<tr id="cloud-tools-{{$item.attachId}}">
<td id="perms-panel-{{$item.attachId}}" colspan="9"></td>
diff --git a/view/tpl/cloud_header.tpl b/view/tpl/cloud_header.tpl
index d41cc9d67..c1e589341 100644
--- a/view/tpl/cloud_header.tpl
+++ b/view/tpl/cloud_header.tpl
@@ -2,10 +2,10 @@
{{if $actionspanel}}
<div class="pull-right">
{{if $is_owner}}
- <a href="/sharedwithme" class="btn btn-xs btn-default"><i class="fa fa-cloud-download"></i>&nbsp;{{$shared}}</a>
+ <a href="/sharedwithme" class="btn btn-sm btn-outline-secondary"><i class="fa fa-cloud-download"></i>&nbsp;{{$shared}}</a>
{{/if}}
- <button id="files-create-btn" class="btn btn-xs btn-primary" onclick="openClose('files-mkdir-tools'); closeMenu('files-upload-tools');"><i class="fa fa-folder-o"></i>&nbsp;{{$create}}</button>
- <button id="files-upload-btn" class="btn btn-xs btn-success" onclick="openClose('files-upload-tools'); closeMenu('files-mkdir-tools');"><i class="fa fa-arrow-circle-o-up"></i>&nbsp;{{$upload}}</button>
+ <button id="files-create-btn" class="btn btn-sm btn-primary" onclick="openClose('files-mkdir-tools'); closeMenu('files-upload-tools');"><i class="fa fa-folder-o"></i>&nbsp;{{$create}}</button>
+ <button id="files-upload-btn" class="btn btn-sm btn-success" onclick="openClose('files-upload-tools'); closeMenu('files-mkdir-tools');"><i class="fa fa-arrow-circle-o-up"></i>&nbsp;{{$upload}}</button>
</div>
{{/if}}
<h2>{{$header}}</h2>
diff --git a/view/tpl/comment_item.tpl b/view/tpl/comment_item.tpl
index a98b9e5eb..bd5176c83 100755
--- a/view/tpl/comment_item.tpl
+++ b/view/tpl/comment_item.tpl
@@ -19,56 +19,49 @@
{{/foreach}}
</select>
{{/if}}
- <div class="clear"></div>
- <div id="comment-tools-{{$id}}" class="comment-tools">
+ <div id="comment-tools-{{$id}}" class="pt-2 comment-tools">
<div id="comment-edit-bb-{{$id}}" class="btn-toolbar pull-left">
- <div class='btn-group'>
- <button class="btn btn-default btn-xs" title="{{$edbold}}" onclick="insertbbcomment('{{$comment}}','b', {{$id}}); return false;">
+ <div class="btn-group mr-2">
+ <button class="btn btn-outline-secondary btn-sm" title="{{$edbold}}" onclick="insertbbcomment('{{$comment}}','b', {{$id}}); return false;">
<i class="fa fa-bold comment-icon"></i>
</button>
- <button class="btn btn-default btn-xs" title="{{$editalic}}" onclick="insertbbcomment('{{$comment}}','i', {{$id}}); return false;">
+ <button class="btn btn-outline-secondary btn-sm" title="{{$editalic}}" onclick="insertbbcomment('{{$comment}}','i', {{$id}}); return false;">
<i class="fa fa-italic comment-icon"></i>
</button>
- <button class="btn btn-default btn-xs" title="{{$eduline}}" onclick="insertbbcomment('{{$comment}}','u', {{$id}}); return false;">
+ <button class="btn btn-outline-secondary btn-sm" title="{{$eduline}}" onclick="insertbbcomment('{{$comment}}','u', {{$id}}); return false;">
<i class="fa fa-underline comment-icon"></i>
</button>
- <button class="btn btn-default btn-xs" title="{{$edquote}}" onclick="insertbbcomment('{{$comment}}','quote', {{$id}}); return false;">
+ <button class="btn btn-outline-secondary btn-sm" title="{{$edquote}}" onclick="insertbbcomment('{{$comment}}','quote', {{$id}}); return false;">
<i class="fa fa-quote-left comment-icon"></i>
</button>
- <button class="btn btn-default btn-xs" title="{{$edcode}}" onclick="insertbbcomment('{{$comment}}','code', {{$id}}); return false;">
+ <button class="btn btn-outline-secondary btn-sm" title="{{$edcode}}" onclick="insertbbcomment('{{$comment}}','code', {{$id}}); return false;">
<i class="fa fa-terminal comment-icon"></i>
</button>
</div>
- <div class='btn-group'>
- <!--button class="btn btn-default btn-xs" title="{{$edimg}}" onclick="insertbbcomment('{{$comment}}','img', {{$id}}); return false;">
- <i class="fa fa-camera comment-icon"></i>
- </button-->
- <button class="btn btn-default btn-xs" title="{{$edurl}}" onclick="insertCommentURL('{{$comment}}',{{$id}}); return false;">
+ <div class="btn-group mr-2">
+ <button class="btn btn-outline-secondary btn-sm" title="{{$edurl}}" onclick="insertCommentURL('{{$comment}}',{{$id}}); return false;">
<i class="fa fa-link comment-icon"></i>
</button>
- <!--button class="btn btn-default btn-xs" title="{{$edvideo}}" onclick="insertbbcomment('{{$comment}}','video', {{$id}}); return false;">
- <i class="fa fa-video-camera comment-icon"></i>
- </button-->
</div>
{{if $feature_encrypt}}
- <div class='btn-group'>
- <button class="btn btn-default btn-xs" title="{{$encrypt}}" onclick="red_encrypt('{{$cipher}}','#comment-edit-text-' + '{{$id}}',''); return false;">
+ <div class="btn-group mr-2">
+ <button class="btn btn-outline-secondary btn-sm" title="{{$encrypt}}" onclick="red_encrypt('{{$cipher}}','#comment-edit-text-' + '{{$id}}',''); return false;">
<i class="fa fa-key comment-icon"></i>
</button>
</div>
{{/if}}
{{$comment_buttons}}
</div>
- <div class="btn-group pull-right" id="comment-edit-submit-wrapper-{{$id}}">
+ <div class="btn-group float-right" id="comment-edit-submit-wrapper-{{$id}}">
{{if $preview}}
- <button id="comment-edit-presubmit-{{$id}}" class="btn btn-default btn-xs" onclick="preview_comment({{$id}}); return false;" title="{{$preview}}">
+ <button id="comment-edit-presubmit-{{$id}}" class="btn btn-outline-secondary btn-sm" onclick="preview_comment({{$id}}); return false;" title="{{$preview}}">
<i class="fa fa-eye comment-icon" ></i>
</button>
{{/if}}
- <button id="comment-edit-submit-{{$id}}" class="btn btn-primary btn-xs" type="submit" name="button-submit" onclick="post_comment({{$id}}); return false;">{{$submit}}</button>
+ <button id="comment-edit-submit-{{$id}}" class="btn btn-primary btn-sm" type="submit" name="button-submit" onclick="post_comment({{$id}}); return false;">{{$submit}}</button>
</div>
</div>
<div class="clear"></div>
</form>
</div>
- <div id="comment-edit-preview-{{$id}}" class="comment-edit-preview"></div>
+ <div id="comment-edit-preview-{{$id}}" class="comment-edit-preview mt-4"></div>
diff --git a/view/tpl/common_tabs.tpl b/view/tpl/common_tabs.tpl
index fa6bfbdfa..29c46369b 100755
--- a/view/tpl/common_tabs.tpl
+++ b/view/tpl/common_tabs.tpl
@@ -1,8 +1,17 @@
-<div id="tabs-collapse-1" class="navbar-collapse collapse">
- <ul class="nav nav-tabs nav-justified">
+<div class="mb-4 d-none d-md-block">
+ <ul class="nav nav-tabs nav-fill">
{{foreach $tabs as $tab}}
- <li class="{{$tab.sel}}" {{if $tab.id}}id="{{$tab.id}}"{{/if}}><a href="{{$tab.url}}"{{if $tab.title}} title="{{$tab.title}}"{{/if}}>{{$tab.label}}</a></li>
+ <li class="nav-item"{{if $tab.id}} id="{{$tab.id}}"{{/if}}><a class="nav-link{{if $tab.sel}} {{$tab.sel}}{{/if}}" href="{{$tab.url}}"{{if $tab.title}} title="{{$tab.title}}"{{/if}}>{{$tab.label}}</a></li>
{{/foreach}}
</ul>
</div>
-<div class="tabs-end"></div>
+<div class="d-md-none dropdown clearfix" style="position:fixed; right:7px; top:4.5rem; z-index:1020">
+ <button type="button" class="btn btn-outline-secondary btn-sm float-right" data-toggle="dropdown">
+ <i class="fa fa-bars"></i>
+ </button>
+ <div class="dropdown-menu dropdown-menu-right">
+ {{foreach $tabs as $tab}}
+ <a class="dropdown-item{{if $tab.sel}} {{$tab.sel}}{{/if}}" href="{{$tab.url}}"{{if $tab.title}} title="{{$tab.title}}"{{/if}}>{{$tab.label}}</a>
+ {{/foreach}}
+ </div>
+</div>
diff --git a/view/tpl/connection_template.tpl b/view/tpl/connection_template.tpl
index 64d27e609..16915abda 100755
--- a/view/tpl/connection_template.tpl
+++ b/view/tpl/connection_template.tpl
@@ -1,20 +1,20 @@
<div id="contact-entry-wrapper-{{$contact.id}}">
- <div class="section-subtitle-wrapper">
+ <div class="section-subtitle-wrapper clearfix">
<div class="pull-right">
{{if $contact.approve && $contact.ignore}}
<form action="connedit/{{$contact.id}}" method="post" >
- <button type="submit" class="btn btn-success btn-xs" name="pending" value="1" title="{{$contact.approve_hover}}"><i class="fa fa-check"></i> {{$contact.approve}}</button>
+ <button type="submit" class="btn btn-success btn-sm" name="pending" value="1" title="{{$contact.approve_hover}}"><i class="fa fa-check"></i> {{$contact.approve}}</button>
- <a href="connedit/{{$contact.id}}/ignore" class="btn btn-warning btn-xs" title="{{$contact.ignore_hover}}"><i class="fa fa-ban"></i> {{$contact.ignore}}</a>
+ <a href="connedit/{{$contact.id}}/ignore" class="btn btn-warning btn-sm" title="{{$contact.ignore_hover}}"><i class="fa fa-ban"></i> {{$contact.ignore}}</a>
{{/if}}
- <a href="#" class="btn btn-danger btn-xs" title="{{$contact.delete_hover}}" onclick="dropItem('{{$contact.deletelink}}', '#contact-entry-wrapper-{{$contact.id}}'); return false;"><i class="fa fa-trash-o"></i> {{$contact.delete}}</a>
- <a href="{{$contact.link}}" class="btn btn-default btn-xs" title="{{$contact.edit_hover}}"><i class="fa fa-pencil"></i></a>
+ <a href="#" class="btn btn-danger btn-sm" title="{{$contact.delete_hover}}" onclick="dropItem('{{$contact.deletelink}}', '#contact-entry-wrapper-{{$contact.id}}'); return false;"><i class="fa fa-trash-o"></i> {{$contact.delete}}</a>
+ <a href="{{$contact.link}}" class="btn btn-outline-secondary btn-sm" title="{{$contact.edit_hover}}"><i class="fa fa-pencil"></i></a>
{{if $contact.approve}}
</form>
{{/if}}
</div>
- <h3>{{if $contact.public_forum}}<i class="fa fa-comments-o"></i>&nbsp;{{/if}}<a href="{{$contact.url}}" title="{{$contact.img_hover}}" >{{$contact.name}}</a>{{if $contact.phone}}&nbsp;<a class="btn btn-default btn-xs" href="tel:{{$contact.phone}}" title="{{$contact.call}}"><i class="fa fa-phone connphone"></i></a>{{/if}}</h3>
+ <h3>{{if $contact.public_forum}}<i class="fa fa-comments-o"></i>&nbsp;{{/if}}<a href="{{$contact.url}}" title="{{$contact.img_hover}}" >{{$contact.name}}</a>{{if $contact.phone}}&nbsp;<a class="btn btn-outline-secondary btn-sm" href="tel:{{$contact.phone}}" title="{{$contact.call}}"><i class="fa fa-phone connphone"></i></a>{{/if}}</h3>
</div>
<div class="section-content-tools-wrapper">
<div class="contact-photo-wrapper" >
diff --git a/view/tpl/connections.tpl b/view/tpl/connections.tpl
index f85adc592..13261965a 100755
--- a/view/tpl/connections.tpl
+++ b/view/tpl/connections.tpl
@@ -1,31 +1,31 @@
<div class="generic-content-wrapper">
- <div class="section-title-wrapper">
+ <div class="section-title-wrapper clearfix">
<div class="dropdown pull-right">
- <button type="button" class="btn btn-primary btn-xs" onclick="openClose('contacts-search-form');">
+ <button type="button" class="btn btn-primary btn-sm" onclick="openClose('contacts-search-form'); $('#contacts-search').focus()">
<i class="fa fa-search"></i>&nbsp;{{$label}}
</button>
- <button type="button" class="btn btn-default btn-xs dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" title="{{$sort}}">
+ <button type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" title="{{$sort}}">
<i class="fa fa-sort"></i>
</button>
- <ul class="dropdown-menu">
+ <div class="dropdown-menu dropdown-menu-right">
{{foreach $tabs as $menu}}
- <li><a href="{{$menu.url}}">{{$menu.label}}</a></li>
+ <a class="dropdown-item" href="{{$menu.url}}">{{$menu.label}}</a>
{{/foreach}}
- </ul>
+ </div>
</div>
{{if $finding}}<h2>{{$finding}}</h2>{{else}}<h2>{{$header}}{{if $total}} ({{$total}}){{/if}}</h2>{{/if}}
</div>
<div id="contacts-search-form" class="section-content-tools-wrapper">
<form action="{{$cmd}}" method="get" >
<div class="input-group form-group">
- <input type="text" name="search" id="contacts-search" class="form-control input-sm" onfocus="this.select();" value="{{$search}}" placeholder="{{$desc}}" />
+ <input type="text" name="search" id="contacts-search" class="form-control" onfocus="this.select();" value="{{$search}}" placeholder="{{$desc}}" />
<div class="input-group-btn">
- <button id="contacts-search-submit" class="btn btn-default btn-sm" type="submit" name="submit" value="{{$submit}}"><i class="fa fa-fw fa-search"></i></button>
+ <button id="contacts-search-submit" class="btn btn-outline-secondary" type="submit" name="submit" value="{{$submit}}"><i class="fa fa-fw fa-search"></i></button>
</div>
</div>
</form>
</div>
- <div id="connections-wrapper">
+ <div id="connections-wrapper clearfix">
{{foreach $contacts as $contact}}
{{include file="connection_template.tpl"}}
{{/foreach}}
diff --git a/view/tpl/conv_item.tpl b/view/tpl/conv_item.tpl
index e73ee7fb5..2d51af4ff 100755
--- a/view/tpl/conv_item.tpl
+++ b/view/tpl/conv_item.tpl
@@ -4,10 +4,10 @@
</div>
<div id="collapsed-comments-{{$item.id}}" class="collapsed-comments" style="display: none;">
{{/if}}
- <div id="thread-wrapper-{{$item.id}}" class="thread-wrapper{{if $item.toplevel}} {{$item.toplevel}} generic-content-wrapper h-entry {{else}} u-comment h-cite {{/if}} item_{{$item.submid}}">
+ <div id="thread-wrapper-{{$item.id}}" class="thread-wrapper{{if $item.toplevel}} {{$item.toplevel}} mb-4 generic-content-wrapper h-entry {{else}} u-comment h-cite {{/if}} item_{{$item.submid}}">
<a name="item_{{$item.id}}" ></a>
- <div class="wall-item-outside-wrapper {{$item.indent}}{{$item.previewing}}" id="wall-item-outside-wrapper-{{$item.id}}" >
- <div class="wall-item-content-wrapper {{$item.indent}}" id="wall-item-content-wrapper-{{$item.id}}" style="clear:both;">
+ <div class="wall-item-outside-wrapper{{if $item.is_comment}} comment{{/if}}{{if $item.previewing}} preview{{/if}}" id="wall-item-outside-wrapper-{{$item.id}}" >
+ <div class="clearfix wall-item-content-wrapper{{if $item.is_comment}} comment{{/if}}" id="wall-item-content-wrapper-{{$item.id}}">
{{if $item.photo}}
<div class="wall-photo-item" id="wall-photo-item-{{$item.id}}">
{{$item.photo}}
@@ -18,21 +18,24 @@
{{$item.event}}
</div>
{{/if}}
- <div class="wall-item-head">
+ {{if $item.title && !$item.event}}
+ <div class="p-2{{if $item.is_new}} bg-primary text-white{{/if}} wall-item-title h3{{if !$item.photo}} rounded-top{{/if}}" id="wall-item-title-{{$item.id}}">
+ {{if $item.title_tosource}}{{if $item.plink}}<a href="{{$item.plink.href}}" title="{{$item.title}} ({{$item.plink.title}})">{{/if}}{{/if}}{{$item.title}}{{if $item.title_tosource}}{{if $item.plink}}</a>{{/if}}{{/if}}
+ </div>
+ {{if ! $item.is_new}}
+ <hr class="m-0">
+ {{/if}}
+ {{/if}}
+ <div class="p-2 clearfix wall-item-head{{if $item.is_new && !$item.title && !$item.event && !$item.is_comment}} wall-item-head-new rounded-top{{/if}}">
<div class="wall-item-info" id="wall-item-info-{{$item.id}}" >
<div class="wall-item-photo-wrapper{{if $item.owner_url}} wwfrom{{/if}} h-card p-author" id="wall-item-photo-wrapper-{{$item.id}}">
<a href="{{$item.profile_url}}" title="{{$item.linktitle}}" class="wall-item-photo-link u-url" id="wall-item-photo-link-{{$item.id}}"><img src="{{$item.thumb}}" class="wall-item-photo{{$item.sparkle}} u-photo p-name" id="wall-item-photo-{{$item.id}}" alt="{{$item.name}}" /></a>
</div>
- <div class="wall-item-photo-end" style="clear:both"></div>
- </div>
- {{if $item.title}}
- <div class="wall-item-title" id="wall-item-title-{{$item.id}}" title="{{$item.title}}">
- <h3>{{if $item.title_tosource}}{{if $item.plink}}<a href="{{$item.plink.href}}" title="{{$item.title}} ({{$item.plink.title}})">{{/if}}{{/if}}{{$item.title}}{{if $item.title_tosource}}{{if $item.plink}}</a>{{/if}}{{/if}}</h3>
</div>
- {{/if}}
{{if $item.lock}}
<div class="wall-item-lock dropdown">
- <i class="fa fa-lock lockview dropdown-toggle" data-toggle="dropdown" title="{{$item.lock}}" onclick="lockview('item',{{$item.id}});" ></i><ul id="panel-{{$item.id}}" class="lockview-panel dropdown-menu"></ul>&nbsp;
+ <i class="fa fa-lock lockview" data-toggle="dropdown" title="{{$item.lock}}" onclick="lockview('item',{{$item.id}});" ></i>&nbsp;
+ <div id="panel-{{$item.id}}" class="dropdown-menu"></div>
</div>
{{/if}}
<div class="wall-item-author">
@@ -41,19 +44,22 @@
<div class="wall-item-ago" id="wall-item-ago-{{$item.id}}">
{{if $item.verified}}<i class="fa fa-check item-verified" title="{{$item.verified}}"></i>&nbsp;{{elseif $item.forged}}<i class="fa fa-exclamation item-forged" title="{{$item.forged}}"></i>&nbsp;{{/if}}{{if $item.location}}<span class="wall-item-location p-location" id="wall-item-location-{{$item.id}}">{{$item.location}},&nbsp;</span>{{/if}}<span class="autotime" title="{{$item.isotime}}"><time class="dt-published" datetime="{{$item.isotime}}">{{$item.localtime}}</time>{{if $item.editedtime}}&nbsp;{{$item.editedtime}}{{/if}}{{if $item.expiretime}}&nbsp;{{$item.expiretime}}{{/if}}</span>{{if $item.editedtime}}&nbsp;<i class="fa fa-pencil"></i>{{/if}}&nbsp;{{if $item.app}}<span class="item.app">{{$item.str_app}}</span>{{/if}}
</div>
- <div class="clear"></div>
</div>
{{if $item.body}}
- <div class="wall-item-content" id="wall-item-content-{{$item.id}}">
+ <div class="p-2 wall-item-content clearfix" id="wall-item-content-{{$item.id}}">
<div class="wall-item-body e-content" id="wall-item-body-{{$item.id}}" >
{{$item.body}}
</div>
- <div class="clear"></div>
</div>
{{/if}}
{{if $item.has_tags}}
- <div class="wall-item-tools">
+ <div class="p-2 wall-item-tools clearfix">
+
+ <div class="body-tags">
+ <span class="tag">{{$item.mentions}} {{$item.tags}} {{$item.categories}} {{$item.folders}}</span>
+ </div>
+ {{**
{{if $item.mentions}}
<div class="body-tags" id="item-mentions">
<span class="tag">{{$item.mentions}}</span>
@@ -74,120 +80,116 @@
<span class="tag">{{$item.folders}}</span>
</div>
{{/if}}
- <div class="clear"></div>
+ **}}
</div>
{{/if}}
- <div class="wall-item-tools">
+ <div class="p-2 clearfix wall-item-tools">
<div class="wall-item-tools-right pull-right">
{{if $item.toplevel && $item.emojis && $item.reactions}}
<div class="btn-group dropdown">
- <button type="button" class="btn btn-default btn-sm dropdown-toggle" data-toggle="dropdown" id="wall-item-react-{{$item.id}}">
+ <button type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown" id="wall-item-react-{{$item.id}}">
<i class="fa fa-smile-o"></i>
</button>
- <ul class="dropdown-menu dropdown-menu-left" role="menu" aria-labelledby="wall-item-react-{{$item.id}}">
+ <div class="dropdown-menu dropdown-menu-right">
{{foreach $item.reactions as $react}}
- <li role="presentation"><a role="menuitem" href="#" onclick="jotReact({{$item.id}},'{{$react}}'); return false;"><img class="dropdown-menu-img-sm" src="/images/emoji/{{$react}}.png" alt="{{$react}}" /></a></li>
+ <a class="dropdown-item clearfix" href="#" onclick="jotReact({{$item.id}},'{{$react}}'); return false;"><img class="menu-img-2" src="/images/emoji/{{$react}}.png" alt="{{$react}}" /></a>
{{/foreach}}
- </ul>
+ </div>
</div>
{{/if}}
<div class="btn-group dropdown">
{{if $item.like}}
- <button type="button" title="{{$item.like.0}}" class="btn btn-default btn-sm" onclick="dolike({{$item.id}},'like'); return false;">
+ <button type="button" title="{{$item.like.0}}" class="btn btn-outline-secondary btn-sm" onclick="dolike({{$item.id}},'like'); return false;">
<i class="fa fa-thumbs-o-up{{if $item.my_responses.like}} ivoted{{/if}}" ></i>
</button>
{{/if}}
{{if $item.dislike}}
- <button type="button" title="{{$item.dislike.0}}" class="btn btn-default btn-sm" onclick="dolike({{$item.id}},'dislike'); return false;">
+ <button type="button" title="{{$item.dislike.0}}" class="btn btn-outline-secondary btn-sm" onclick="dolike({{$item.id}},'dislike'); return false;">
<i class="fa fa-thumbs-o-down{{if $item.my_responses.dislike}} ivoted{{/if}}" ></i>
</button>
{{/if}}
{{if $item.isevent}}
<div class="btn-group dropdown">
- <button type="button" class="btn btn-default btn-sm dropdown-toggle" data-toggle="dropdown" id="wall-item-attend-menu-{{$item.id}}" title="{{$item.attend_title}}">
+ <button type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown" id="wall-item-attend-menu-{{$item.id}}" title="{{$item.attend_title}}">
<i class="fa fa-calendar-check-o"></i>
</button>
- <ul class="dropdown-menu" role="menu" aria-labelledby="wall-item-attend-menu-{{$item.id}}">
- <li role="presentation"><a class="menuitem" href="#" title="{{$item.attend.0}}" onclick="itemAddToCal({{$item.id}}); dolike({{$item.id}},'attendyes'); return false;">
- <i class="item-act-list fa fa-check{{if $item.my_responses.attend}} ivoted{{/if}}" ></i> {{$item.attend.0}}</a>
- </li>
- <li role="presentation"><a class="menuitem" href="#" title="{{$item.attend.1}}" onclick="itemAddToCal({{$item.id}}), dolike({{$item.id}},'attendno'); return false;">
- <i class="item-act-list fa fa-times{{if $item.my_responses.attendno}} ivoted{{/if}}" ></i> {{$item.attend.1}}</a>
- </li>
- <li role="presentation"><a class="menuitem" href="#" title="{{$item.attend.2}}" onclick="itemAddToCal({{$item.id}}); dolike({{$item.id}},'attendmaybe'); return false;">
- <i class="item-act-list fa fa-question{{if $item.my_responses.attendmaybe}} ivoted{{/if}}" ></i> {{$item.attend.2}}</a>
- </li>
- </ul>
+ <div class="dropdown-menu">
+ <a class="dropdown-item" href="#" title="{{$item.attend.0}}" onclick="itemAddToCal({{$item.id}}); dolike({{$item.id}},'attendyes'); return false;">
+ <i class="item-act-list fa fa-check{{if $item.my_responses.attend}} ivoted{{/if}}" ></i> {{$item.attend.0}}
+ </a>
+ <a class="dropdown-item" href="#" title="{{$item.attend.1}}" onclick="itemAddToCal({{$item.id}}), dolike({{$item.id}},'attendno'); return false;">
+ <i class="item-act-list fa fa-times{{if $item.my_responses.attendno}} ivoted{{/if}}" ></i> {{$item.attend.1}}
+ </a>
+ <a class="dropdown-item" href="#" title="{{$item.attend.2}}" onclick="itemAddToCal({{$item.id}}); dolike({{$item.id}},'attendmaybe'); return false;">
+ <i class="item-act-list fa fa-question{{if $item.my_responses.attendmaybe}} ivoted{{/if}}" ></i> {{$item.attend.2}}
+ </a>
+ </div>
</div>
{{/if}}
{{if $item.canvote}}
<div class="btn-group dropdown">
- <button type="button" class="btn btn-default btn-sm dropdown-toggle" data-toggle="dropdown" id="wall-item-consensus-menu-{{$item.id}}" title="{{$item.vote_title}}">
+ <button type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown" id="wall-item-consensus-menu-{{$item.id}}" title="{{$item.vote_title}}">
<i class="fa fa-check-square-o"></i>
</button>
- <ul class="dropdown-menu" role="menu" aria-labelledby="wall-item-consensus-menu-{{$item.id}}">
- <li role="presentation"><a class="menuitem" href="#" title="{{$item.conlabels.0}}" onclick="dolike({{$item.id}},'agree'); return false;">
- <i class="item-act-list fa fa-check{{if $item.my_responses.agree}} ivoted{{/if}}" ></i> {{$item.conlabels.0}}</a>
- </li>
- <li role="presentation"><a class="menuitem" href="#" title="{{$item.conlabels.1}}" onclick="dolike({{$item.id}},'disagree'); return false;">
- <i class="item-act-list fa fa-times{{if $item.my_responses.disagree}} ivoted{{/if}}" ></i> {{$item.conlabels.1}}</a>
- </li>
- <li role="presentation"><a class="menuitem" href="#" title="{{$item.conlabels.2}}" onclick="dolike({{$item.id}},'abstain'); return false;">
- <i class="item-act-list fa fa-question{{if $item.my_responses.abstain}} ivoted{{/if}}" ></i> {{$item.conlabels.2}}</a>
- </li>
- </ul>
+ <div class="dropdown-menu" role="menu" aria-labelledby="wall-item-consensus-menu-{{$item.id}}">
+ <a class="dropdown-item" href="#" title="{{$item.conlabels.0}}" onclick="dolike({{$item.id}},'agree'); return false;">
+ <i class="item-act-list fa fa-check{{if $item.my_responses.agree}} ivoted{{/if}}" ></i> {{$item.conlabels.0}}
+ </a>
+ <a class="dropdown-item" href="#" title="{{$item.conlabels.1}}" onclick="dolike({{$item.id}},'disagree'); return false;">
+ <i class="item-act-list fa fa-times{{if $item.my_responses.disagree}} ivoted{{/if}}" ></i> {{$item.conlabels.1}}
+ </a>
+ <a class="dropdown-item" href="#" title="{{$item.conlabels.2}}" onclick="dolike({{$item.id}},'abstain'); return false;">
+ <i class="item-act-list fa fa-question{{if $item.my_responses.abstain}} ivoted{{/if}}" ></i> {{$item.conlabels.2}}
+ </a>
+ </div>
</div>
{{/if}}
- <button type="button" class="btn btn-default btn-sm dropdown-toggle" data-toggle="dropdown" id="wall-item-menu-{{$item.id}}">
- <i class="fa fa-caret-down"></i>
+ <button type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown" id="wall-item-menu-{{$item.id}}">
+ <i class="fa fa-cog"></i>
</button>
- <ul class="dropdown-menu dropdown-menu-right" role="menu" aria-labelledby="wall-item-menu-{{$item.id}}">
+ <div class="dropdown-menu dropdown-menu-right" role="menu" aria-labelledby="wall-item-menu-{{$item.id}}">
{{if $item.share}}
- <li role="presentation"><a role="menuitem" href="#" onclick="jotShare({{$item.id}}); return false"><i class="generic-icons-nav fa fa-fw fa-retweet" title="{{$item.share.0}}"></i>{{$item.share.0}}</a></li>
+ <a class="dropdown-item" href="#" onclick="jotShare({{$item.id}}); return false"><i class="generic-icons-nav fa fa-fw fa-retweet" title="{{$item.share.0}}"></i>{{$item.share.0}}</a>
{{/if}}
{{if $item.plink}}
- <li role="presentation"><a role="menuitem" href="{{$item.plink.href}}" title="{{$item.plink.title}}" class="u-url"><i class="generic-icons-nav fa fa-fw fa-external-link"></i>{{$item.plink.title}}</a></li>
+ <a class="dropdown-item" href="{{$item.plink.href}}" title="{{$item.plink.title}}" class="u-url"><i class="generic-icons-nav fa fa-fw fa-external-link"></i>{{$item.plink.title}}</a>
{{/if}}
{{if $item.edpost}}
- <li role="presentation"><a role="menuitem" href="{{$item.edpost.0}}" title="{{$item.edpost.1}}"><i class="generic-icons-nav fa fa-fw fa-pencil"></i>{{$item.edpost.1}}</a></li>
+ <a class="dropdown-item" href="{{$item.edpost.0}}" title="{{$item.edpost.1}}"><i class="generic-icons-nav fa fa-fw fa-pencil"></i>{{$item.edpost.1}}</a>
{{/if}}
{{if $item.tagger}}
- <li role="presentation"><a role="menuitem" href="#" onclick="itemTag({{$item.id}}); return false;"><i id="tagger-{{$item.id}}" class="generic-icons-nav fa fa-fw fa-tag" title="{{$item.tagger.tagit}}"></i>{{$item.tagger.tagit}}</a></li>
+ <a class="dropdown-item" href="#" onclick="itemTag({{$item.id}}); return false;"><i id="tagger-{{$item.id}}" class="generic-icons-nav fa fa-fw fa-tag" title="{{$item.tagger.tagit}}"></i>{{$item.tagger.tagit}}</a>
{{/if}}
{{if $item.filer}}
- <li role="presentation"><a role="menuitem" href="#" onclick="itemFiler({{$item.id}}); return false;"><i id="filer-{{$item.id}}" class="generic-icons-nav fa fa-fw fa-folder-open" title="{{$item.filer}}"></i>{{$item.filer}}</a></li>
+ <a class="dropdown-item" href="#" onclick="itemFiler({{$item.id}}); return false;"><i id="filer-{{$item.id}}" class="generic-icons-nav fa fa-fw fa-folder-open" title="{{$item.filer}}"></i>{{$item.filer}}</a>
{{/if}}
{{if $item.bookmark}}
- <li role="presentation"><a role="menuitem" href="#" onclick="itemBookmark({{$item.id}}); return false;"><i id="bookmarker-{{$item.id}}" class="generic-icons-nav fa fa-fw fa-bookmark" title="{{$item.bookmark}}"></i>{{$item.bookmark}}</a></li>
+ <a class="dropdown-item" href="#" onclick="itemBookmark({{$item.id}}); return false;"><i id="bookmarker-{{$item.id}}" class="generic-icons-nav fa fa-fw fa-bookmark" title="{{$item.bookmark}}"></i>{{$item.bookmark}}</a>
{{/if}}
{{if $item.addtocal}}
- <li role="presentation"><a role="menuitem" href="#" onclick="itemAddToCal({{$item.id}}); return false;"><i id="addtocal-{{$item.id}}" class="generic-icons-nav fa fa-fw fa-calendar" title="{{$item.addtocal}}"></i>{{$item.addtocal}}</a></li>
+ <a class="dropdown-item" href="#" onclick="itemAddToCal({{$item.id}}); return false;"><i id="addtocal-{{$item.id}}" class="generic-icons-nav fa fa-fw fa-calendar" title="{{$item.addtocal}}"></i>{{$item.addtocal}}</a>
{{/if}}
{{if $item.star}}
- <li role="presentation"><a role="menuitem" href="#" onclick="dostar({{$item.id}}); return false;"><i id="starred-{{$item.id}}" class="generic-icons-nav fa fa-fw fa-star {{$item.star.isstarred}}" title="{{$item.star.toggle}}"></i>{{$item.star.toggle}}</a></li>
+ <a class="dropdown-item" href="#" onclick="dostar({{$item.id}}); return false;"><i id="starred-{{$item.id}}" class="generic-icons-nav fa fa-fw fa-star {{$item.star.isstarred}}" title="{{$item.star.toggle}}"></i>{{$item.star.toggle}}</a>
{{/if}}
-
{{if $item.thread_action_menu}}
{{foreach $item.thread_action_menu as $mitem}}
- <li role="presentation"><a role="menuitem" {{if $mitem.href}}href="{{$mitem.href}}"{{/if}} {{if $mitem.action}}onclick="{{$mitem.action}}"{{/if}} {{if $mitem.title}}title="{{$mitem.title}}"{{/if}} ><i class="generic-icons-nav fa fa-fw fa-{{$mitem.icon}}"></i>{{$mitem.title}}</a></li>
+ <a class="dropdown-item" {{if $mitem.href}}href="{{$mitem.href}}"{{/if}} {{if $mitem.action}}onclick="{{$mitem.action}}"{{/if}} {{if $mitem.title}}title="{{$mitem.title}}"{{/if}} ><i class="generic-icons-nav fa fa-fw fa-{{$mitem.icon}}"></i>{{$mitem.title}}</a>
{{/foreach}}
{{/if}}
-
{{if $item.drop.dropping}}
- <li role="presentation"><a role="menuitem" href="#" onclick="dropItem('item/drop/{{$item.id}}', '#thread-wrapper-{{$item.id}}'); return false;" title="{{$item.drop.delete}}" ><i class="generic-icons-nav fa fa-fw fa-trash-o"></i>{{$item.drop.delete}}</a></li>
+ <a class="dropdown-item" href="#" onclick="dropItem('item/drop/{{$item.id}}', '#thread-wrapper-{{$item.id}}'); return false;" title="{{$item.drop.delete}}" ><i class="generic-icons-nav fa fa-fw fa-trash-o"></i>{{$item.drop.delete}}</a>
{{/if}}
-
{{if $item.thread_author_menu}}
- <li role="presentation" class="divider"></li>
+ <div class="dropdown-divider"></div>
{{foreach $item.thread_author_menu as $mitem}}
- <li role="presentation"><a role="menuitem" {{if $mitem.href}}href="{{$mitem.href}}"{{/if}} {{if $mitem.action}}onclick="{{$mitem.action}}"{{/if}} {{if $mitem.title}}title="{{$mitem.title}}"{{/if}} >{{$mitem.title}}</a></li>
+ <a class="dropdown-item" {{if $mitem.href}}href="{{$mitem.href}}"{{/if}} {{if $mitem.action}}onclick="{{$mitem.action}}"{{/if}} {{if $mitem.title}}title="{{$mitem.title}}"{{/if}} >{{$mitem.title}}</a>
{{/foreach}}
{{/if}}
-
{{if $item.edpost && $item.dreport}}
- <li role="presentation"><a role="menuitem" href="dreport/{{$item.mid}}">{{$item.dreport}}</a></li>
+ <a class="dropdown-item" href="dreport/{{$item.mid}}">{{$item.dreport}}</a>
{{/if}}
- </ul>
+ </div>
</div>
</div>
<div id="like-rotator-{{$item.id}}" class="like-rotator"></div>
@@ -196,47 +198,41 @@
<div class="wall-item-tools-left{{if ($item.responses.count > 1) || ($item.responses.count && $item.attachments)}} btn-group{{/if}}">
{{if $item.attachments}}
<div class="btn-group">
- <button type="button" class="btn btn-default btn-sm wall-item-like dropdown-toggle" data-toggle="dropdown" id="attachment-menu-{{$item.id}}"><i class="fa fa-paperclip"></i></button>
- <ul class="dropdown-menu" role="menu" aria-labelledby="attachment-menu-{{$item.id}}">{{$item.attachments}}</ul>
+ <button type="button" class="btn btn-outline-secondary btn-sm wall-item-like dropdown-toggle" data-toggle="dropdown" id="attachment-menu-{{$item.id}}"><i class="fa fa-paperclip"></i></button>
+ <div class="dropdown-menu">{{$item.attachments}}</div>
</div>
{{/if}}
{{foreach $item.responses as $verb=>$response}}
{{if $response.count}}
<div class="btn-group">
- <button type="button" class="btn btn-default btn-sm wall-item-like dropdown-toggle" data-toggle="dropdown" id="wall-item-{{$verb}}-{{$item.id}}">{{$response.count}} {{$response.button}}</button>
- {{if $response.list_part}}
- <ul class="dropdown-menu" role="menu" aria-labelledby="wall-item-{{$verb}}-{{$item.id}}">{{foreach $response.list_part as $liker}}<li role="presentation">{{$liker}}</li>{{/foreach}}</ul>
- {{else}}
- <ul class="dropdown-menu" role="menu" aria-labelledby="wall-item-{{$verb}}-{{$item.id}}">{{foreach $response.list as $liker}}<li role="presentation">{{$liker}}</li>{{/foreach}}</ul>
- {{/if}}
- {{if $response.list_part}}
+ <button type="button" class="btn btn-outline-secondary btn-sm wall-item-like dropdown-toggle"{{if $response.modal}} data-toggle="modal" data-target="#{{$verb}}Modal-{{$item.id}}"{{else}} data-toggle="dropdown"{{/if}} id="wall-item-{{$verb}}-{{$item.id}}">{{$response.count}} {{$response.button}}</button>
+ {{if $response.modal}}
<div class="modal" id="{{$verb}}Modal-{{$item.id}}">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
+ <h4 class="modal-title">{{$response.count}} {{$response.button}}</h4>
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
- <h4 class="modal-title">{{$response.title}}</h4>
</div>
<div class="modal-body response-list">
- <ul class="nav nav-pills nav-stacked">{{foreach $response.list as $liker}}<li role="presentation">{{$liker}}</li>{{/foreach}}</ul>
+ <ul class="nav nav-pills flex-column">{{foreach $response.list as $liker}}<li class="nav-item">{{$liker}}</li>{{/foreach}}</ul>
</div>
<div class="modal-footer clear">
- <button type="button" class="btn btn-default" data-dismiss="modal">{{$item.modal_dismiss}}</button>
+ <button type="button" class="btn btn-outline-secondary" data-dismiss="modal">{{$item.modal_dismiss}}</button>
</div>
</div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->
</div><!-- /.modal -->
+ {{else}}
+ <div class="dropdown-menu">{{foreach $response.list as $liker}}{{$liker}}{{/foreach}}</div>
{{/if}}
</div>
{{/if}}
{{/foreach}}
</div>
{{/if}}
- <div class="clear"></div>
</div>
- <div class="clear"></div>
</div>
- <div class="clear{{if $indent}} {{$indent}}{{/if}}"></div>
</div>
{{if $item.toplevel}}
{{foreach $item.children as $child}}
@@ -244,10 +240,9 @@
{{/foreach}}
{{/if}}
{{if $item.comment}}
- <div class="wall-item-comment-wrapper{{if $item.children}} wall-item-comment-wrapper-wc{{/if}}" >
+ <div class="p-2 wall-item-comment-wrapper{{if $item.children}} wall-item-comment-wrapper-wc{{/if}}" >
{{$item.comment}}
</div>
- <div class="clear"></div>
{{/if}}
</div>
{{if $item.comment_lastcollapsed}}
diff --git a/view/tpl/conv_list.tpl b/view/tpl/conv_list.tpl
index b1080af34..59153e41f 100755
--- a/view/tpl/conv_list.tpl
+++ b/view/tpl/conv_list.tpl
@@ -4,10 +4,10 @@
</div>
<div id="collapsed-comments-{{$item.id}}" class="collapsed-comments" style="display: none;">
{{/if}}
- <div id="thread-wrapper-{{$item.id}}" class="thread-wrapper conv-list-mode{{if $item.toplevel}} {{$item.toplevel}} generic-content-wrapper{{/if}}">
- <a name="{{$item.id}}" ></a>
- <div class="wall-item-outside-wrapper {{$item.indent}}{{$item.previewing}}" id="wall-item-outside-wrapper-{{$item.id}}" >
- <div class="wall-item-content-wrapper {{$item.indent}}" id="wall-item-content-wrapper-{{$item.id}}" style="clear:both;">
+ <div id="thread-wrapper-{{$item.id}}" class="thread-wrapper{{if $item.toplevel}} {{$item.toplevel}} mb-4 generic-content-wrapper h-entry {{else}} u-comment h-cite {{/if}} item_{{$item.submid}}">
+ <a name="item_{{$item.id}}" ></a>
+ <div class="wall-item-outside-wrapper{{if $item.is_comment}} comment{{/if}}{{if $item.previewing}} preview{{/if}}" id="wall-item-outside-wrapper-{{$item.id}}" >
+ <div class="clearfix wall-item-content-wrapper{{if $item.is_comment}} comment{{/if}}" id="wall-item-content-wrapper-{{$item.id}}">
{{if $item.photo}}
<div class="wall-photo-item" id="wall-photo-item-{{$item.id}}">
{{$item.photo}}
@@ -18,39 +18,48 @@
{{$item.event}}
</div>
{{/if}}
- <div class="wall-item-head">
+ {{if $item.title && !$item.event}}
+ <div class="p-2{{if $item.is_new}} bg-primary text-white{{/if}} wall-item-title h3{{if !$item.photo}} rounded-top{{/if}}" id="wall-item-title-{{$item.id}}">
+ {{if $item.title_tosource}}{{if $item.plink}}<a href="{{$item.plink.href}}" title="{{$item.title}} ({{$item.plink.title}})">{{/if}}{{/if}}{{$item.title}}{{if $item.title_tosource}}{{if $item.plink}}</a>{{/if}}{{/if}}
+ </div>
+ {{if ! $item.is_new}}
+ <hr class="m-0">
+ {{/if}}
+ {{/if}}
+ <div class="p-2 clearfix wall-item-head{{if $item.is_new && !$item.title && !$item.event && !$item.is_comment}} wall-item-head-new rounded-top{{/if}}">
<div class="wall-item-info" id="wall-item-info-{{$item.id}}" >
- <div class="wall-item-photo-wrapper{{if $item.owner_url}} wwfrom{{/if}}" id="wall-item-photo-wrapper-{{$item.id}}">
- <a href="{{$item.profile_url}}" title="{{$item.linktitle}}" class="wall-item-photo-link" id="wall-item-photo-link-{{$item.id}}"><img src="{{$item.thumb}}" class="wall-item-photo{{$item.sparkle}}" id="wall-item-photo-{{$item.id}}" alt="{{$item.name}}" /></a>
+ <div class="wall-item-photo-wrapper{{if $item.owner_url}} wwfrom{{/if}} h-card p-author" id="wall-item-photo-wrapper-{{$item.id}}">
+ <a href="{{$item.profile_url}}" title="{{$item.linktitle}}" class="wall-item-photo-link u-url" id="wall-item-photo-link-{{$item.id}}"><img src="{{$item.thumb}}" class="wall-item-photo{{$item.sparkle}} u-photo p-name" id="wall-item-photo-{{$item.id}}" alt="{{$item.name}}" /></a>
</div>
- <div class="wall-item-photo-end" style="clear:both"></div>
</div>
- {{if $item.title}}
- <div class="wall-item-title" id="wall-item-title-{{$item.id}}" title="{{$item.title}}">
- <h3>{{if $item.title_tosource}}{{if $item.plink}}<a href="{{$item.plink.href}}" title="{{$item.title}} ({{$item.plink.title}})">{{/if}}{{/if}}{{$item.title}}{{if $item.title_tosource}}{{if $item.plink}}</a>{{/if}}{{/if}}</h3>
- </div>
- {{/if}}
{{if $item.lock}}
<div class="wall-item-lock dropdown">
- <i class="fa fa-lock lockview dropdown-toggle" data-toggle="dropdown" title="{{$item.lock}}" onclick="lockview('item',{{$item.id}});" ></i><ul id="panel-{{$item.id}}" class="lockview-panel dropdown-menu"></ul>&nbsp;
+ <i class="fa fa-lock lockview" data-toggle="dropdown" title="{{$item.lock}}" onclick="lockview('item',{{$item.id}});" ></i>&nbsp;
+ <div id="panel-{{$item.id}}" class="dropdown-menu"></div>
</div>
{{/if}}
<div class="wall-item-author">
<a href="{{$item.profile_url}}" title="{{$item.linktitle}}" class="wall-item-name-link"><span class="wall-item-name{{$item.sparkle}}" id="wall-item-name-{{$item.id}}" >{{$item.name}}</span></a>{{if $item.owner_url}}&nbsp;{{$item.via}}&nbsp;<a href="{{$item.owner_url}}" title="{{$item.olinktitle}}" class="wall-item-name-link"><span class="wall-item-name{{$item.osparkle}}" id="wall-item-ownername-{{$item.id}}">{{$item.owner_name}}</span></a>{{/if}}
</div>
<div class="wall-item-ago" id="wall-item-ago-{{$item.id}}">
- {{if $item.verified}}<i class="fa fa-check item-verified" title="{{$item.verified}}"></i>&nbsp;{{elseif $item.forged}}<i class="fa fa-exclamation item-forged" title="{{$item.forged}}"></i>&nbsp;{{/if}}{{if $item.location}}<span class="wall-item-location" id="wall-item-location-{{$item.id}}">{{$item.location}},&nbsp;</span>{{/if}}<span class="autotime" title="{{$item.isotime}}">{{$item.localtime}}{{if $item.editedtime}}&nbsp;{{$item.editedtime}}{{/if}}{{if $item.expiretime}}&nbsp;{{$item.expiretime}}{{/if}}</span>{{if $item.editedtime}}&nbsp;<i class="fa fa-pencil"></i>{{/if}}&nbsp;{{if $item.app}}<span class="item.app">{{$item.str_app}}</span>{{/if}}
+ {{if $item.verified}}<i class="fa fa-check item-verified" title="{{$item.verified}}"></i>&nbsp;{{elseif $item.forged}}<i class="fa fa-exclamation item-forged" title="{{$item.forged}}"></i>&nbsp;{{/if}}{{if $item.location}}<span class="wall-item-location p-location" id="wall-item-location-{{$item.id}}">{{$item.location}},&nbsp;</span>{{/if}}<span class="autotime" title="{{$item.isotime}}"><time class="dt-published" datetime="{{$item.isotime}}">{{$item.localtime}}</time>{{if $item.editedtime}}&nbsp;{{$item.editedtime}}{{/if}}{{if $item.expiretime}}&nbsp;{{$item.expiretime}}{{/if}}</span>{{if $item.editedtime}}&nbsp;<i class="fa fa-pencil"></i>{{/if}}&nbsp;{{if $item.app}}<span class="item.app">{{$item.str_app}}</span>{{/if}}
</div>
- <div class="clear"></div>
</div>
- <div class="{{if $item.is_photo}}wall-photo-item{{else}}wall-item-content{{/if}}" id="wall-item-content-{{$item.id}}">
- <div class="wall-item-body" id="wall-item-body-{{$item.id}}" >
+
+ {{if $item.body}}
+ <div class="p-2 wall-item-content clearfix" id="wall-item-content-{{$item.id}}">
+ <div class="wall-item-body e-content" id="wall-item-body-{{$item.id}}" >
{{$item.body}}
</div>
- <div class="clear"></div>
</div>
+ {{/if}}
{{if $item.has_tags}}
- <div class="wall-item-tools">
+ <div class="p-2 wall-item-tools clearfix">
+
+ <div class="body-tags">
+ <span class="tag">{{$item.mentions}} {{$item.tags}} {{$item.categories}} {{$item.folders}}</span>
+ </div>
+ {{**
{{if $item.mentions}}
<div class="body-tags" id="item-mentions">
<span class="tag">{{$item.mentions}}</span>
@@ -63,7 +72,7 @@
{{/if}}
{{if $item.categories}}
<div class="body-tags" id="item-categories">
- <span class="tag">{{$item.categories}}</span>
+ <span class="tag p-category">{{$item.categories}}</span>
</div>
{{/if}}
{{if $item.folders}}
@@ -71,101 +80,134 @@
<span class="tag">{{$item.folders}}</span>
</div>
{{/if}}
- <div class="clear"></div>
+ **}}
</div>
{{/if}}
-
- <div class="wall-item-tools">
- <div class="wall-item-tools-right btn-group pull-right">
- {{if $item.like}}
- <button type="button" class="btn btn-default btn-sm" onclick="dolike({{$item.id}},'like'); return false">
- <i class="fa fa-thumbs-o-up" title="{{$item.like.0}}"></i>
- </button>
- {{/if}}
- {{if $item.dislike}}
- <button type="button" class="btn btn-default btn-sm" onclick="dolike({{$item.id}},'dislike'); return false">
- <i class="fa fa-thumbs-o-down" title="{{$item.dislike.0}}"></i>
- </button>
- {{/if}}
-
- {{if $item.isevent}}
- <button type="button" title="{{$item.attend.0}}" class="btn btn-default btn-sm" onclick="itemAddToCal({{$item.id}}); dolike({{$item.id}},'attendyes'); return false;">
- <i class="fa fa-check" ></i>
- </button>
- <button type="button" title="{{$item.attend.1}}" class="btn btn-default btn-sm" onclick="itemAddToCal({{$item.id}}); dolike({{$item.id}},'attendno'); return false;">
- <i class="fa fa-times" ></i>
- </button>
- <button type="button" title="{{$item.attend.2}}" class="btn btn-default btn-sm" onclick="itemAddToCal({{$item.id}}); dolike({{$item.id}},'attendmaybe'); return false;">
- <i class="fa fa-question" ></i>
- </button>
- {{/if}}
-
- {{if $item.canvote}}
- <button type="button" title="{{$item.conlabels.0}}" class="btn btn-default btn-sm" onclick="dolike({{$item.id}},'agree'); return false;">
- <i class="fa fa-check" ></i>
- </button>
- <button type="button" title="{{$item.conlabels.1}}" class="btn btn-default btn-sm" onclick="dolike({{$item.id}},'disagree'); return false;">
- <i class="fa fa-times" ></i>
- </button>
- <button type="button" title="{{$item.conlabels.2}}" class="btn btn-default btn-sm" onclick="dolike({{$item.id}},'abstain'); return false;">
- <i class="fa fa-question" ></i>
- </button>
+ <div class="p-2 clearfix wall-item-tools">
+ <div class="wall-item-tools-right pull-right">
+ {{if $item.toplevel && $item.emojis && $item.reactions}}
+ <div class="btn-group dropdown">
+ <button type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown" id="wall-item-react-{{$item.id}}">
+ <i class="fa fa-smile-o"></i>
+ </button>
+ <div class="dropdown-menu dropdown-menu-right">
+ {{foreach $item.reactions as $react}}
+ <a class="dropdown-item clearfix" href="#" onclick="jotReact({{$item.id}},'{{$react}}'); return false;"><img class="menu-img-2" src="/images/emoji/{{$react}}.png" alt="{{$react}}" /></a>
+ {{/foreach}}
+ </div>
+ </div>
{{/if}}
-
- <button type="button" class="btn btn-default btn-sm dropdown-toggle" data-toggle="dropdown" id="wall-item-menu-{{$item.id}}">
- <i class="fa fa-caret-down"></i>
- </button>
- <ul class="dropdown-menu" role="menu" aria-labelledby="wall-item-menu-{{$item.id}}">
- {{if $item.share}}
- <li role="presentation"><a role="menuitem" href="#" onclick="jotShare({{$item.id}}); return false"><i class="fa fa-retweet" title="{{$item.share.0}}"></i> {{$item.share.0}}</a></li>
- {{/if}}
- {{if $item.plink}}
- <li role="presentation"><a role="menuitem" href="{{$item.plink.href}}" title="{{$item.plink.title}}" ><i class="fa fa-external-link"></i> {{$item.plink.title}}</a></li>
- {{/if}}
- {{if $item.edpost}}
- <li role="presentation"><a role="menuitem" href="{{$item.edpost.0}}" title="{{$item.edpost.1}}"><i class="editpost fa fa-pencil"></i> {{$item.edpost.1}}</a></li>
- {{/if}}
- {{if $item.tagger}}
- <li role="presentation"><a role="menuitem" href="#" onclick="itemTag({{$item.id}}); return false;"><i id="tagger-{{$item.id}}" class="fa fa-tag" title="{{$item.tagger.tagit}}"></i> {{$item.tagger.tagit}}</a></li>
- {{/if}}
- {{if $item.filer}}
- <li role="presentation"><a role="menuitem" href="#" onclick="itemFiler({{$item.id}}); return false;"><i id="filer-{{$item.id}}" class="fa fa-folder-open" title="{{$item.filer}}"></i> {{$item.filer}}</a></li>
- {{/if}}
- {{if $item.bookmark}}
- <li role="presentation"><a role="menuitem" href="#" onclick="itemBookmark({{$item.id}}); return false;"><i id="bookmarker-{{$item.id}}" class="fa fa-bookmark" title="{{$item.bookmark}}"></i> {{$item.bookmark}}</a></li>
- {{/if}}
- {{if $item.addtocal}}
- <li role="presentation"><a role="menuitem" href="#" onclick="itemAddToCal({{$item.id}}); return false;"><i id="addtocal-{{$item.id}}" class="fa fa-calendar" title="{{$item.addtocal}}"></i> {{$item.addtocal}}</a></li>
+ <div class="btn-group dropdown">
+ {{if $item.like}}
+ <button type="button" title="{{$item.like.0}}" class="btn btn-outline-secondary btn-sm" onclick="dolike({{$item.id}},'like'); return false;">
+ <i class="fa fa-thumbs-o-up{{if $item.my_responses.like}} ivoted{{/if}}" ></i>
+ </button>
{{/if}}
- {{if $item.star}}
- <li role="presentation"><a role="menuitem" href="#" onclick="dostar({{$item.id}}); return false;"><i id="starred-{{$item.id}}" class="fa fa-star {{$item.star.isstarred}}" title="{{$item.star.toggle}}"></i> {{$item.star.toggle}}</a></li>
+ {{if $item.dislike}}
+ <button type="button" title="{{$item.dislike.0}}" class="btn btn-outline-secondary btn-sm" onclick="dolike({{$item.id}},'dislike'); return false;">
+ <i class="fa fa-thumbs-o-down{{if $item.my_responses.dislike}} ivoted{{/if}}" ></i>
+ </button>
{{/if}}
- {{if $item.drop.dropping}}
- <li role="presentation"><a role="menuitem" href="#" onclick="dropItem('item/drop/{{$item.id}}', '#thread-wrapper-{{$item.id}}'); return false;" title="{{$item.drop.delete}}" ><i class="fa fa-trash-o"></i> {{$item.drop.delete}}</a></li>
+ {{if $item.isevent}}
+ <div class="btn-group dropdown">
+ <button type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown" id="wall-item-attend-menu-{{$item.id}}" title="{{$item.attend_title}}">
+ <i class="fa fa-calendar-check-o"></i>
+ </button>
+ <div class="dropdown-menu">
+ <a class="dropdown-item" href="#" title="{{$item.attend.0}}" onclick="itemAddToCal({{$item.id}}); dolike({{$item.id}},'attendyes'); return false;">
+ <i class="item-act-list fa fa-check{{if $item.my_responses.attend}} ivoted{{/if}}" ></i> {{$item.attend.0}}
+ </a>
+ <a class="dropdown-item" href="#" title="{{$item.attend.1}}" onclick="itemAddToCal({{$item.id}}), dolike({{$item.id}},'attendno'); return false;">
+ <i class="item-act-list fa fa-times{{if $item.my_responses.attendno}} ivoted{{/if}}" ></i> {{$item.attend.1}}
+ </a>
+ <a class="dropdown-item" href="#" title="{{$item.attend.2}}" onclick="itemAddToCal({{$item.id}}); dolike({{$item.id}},'attendmaybe'); return false;">
+ <i class="item-act-list fa fa-question{{if $item.my_responses.attendmaybe}} ivoted{{/if}}" ></i> {{$item.attend.2}}
+ </a>
+ </div>
+ </div>
{{/if}}
- {{if $item.item_photo_menu}}
- <li role="presentation" class="divider"></li>
- {{$item.item_photo_menu}}
+ {{if $item.canvote}}
+ <div class="btn-group dropdown">
+ <button type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown" id="wall-item-consensus-menu-{{$item.id}}" title="{{$item.vote_title}}">
+ <i class="fa fa-check-square-o"></i>
+ </button>
+ <div class="dropdown-menu" role="menu" aria-labelledby="wall-item-consensus-menu-{{$item.id}}">
+ <a class="dropdown-item" href="#" title="{{$item.conlabels.0}}" onclick="dolike({{$item.id}},'agree'); return false;">
+ <i class="item-act-list fa fa-check{{if $item.my_responses.agree}} ivoted{{/if}}" ></i> {{$item.conlabels.0}}
+ </a>
+ <a class="dropdown-item" href="#" title="{{$item.conlabels.1}}" onclick="dolike({{$item.id}},'disagree'); return false;">
+ <i class="item-act-list fa fa-times{{if $item.my_responses.disagree}} ivoted{{/if}}" ></i> {{$item.conlabels.1}}
+ </a>
+ <a class="dropdown-item" href="#" title="{{$item.conlabels.2}}" onclick="dolike({{$item.id}},'abstain'); return false;">
+ <i class="item-act-list fa fa-question{{if $item.my_responses.abstain}} ivoted{{/if}}" ></i> {{$item.conlabels.2}}
+ </a>
+ </div>
+ </div>
{{/if}}
-
- </ul>
+ <button type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown" id="wall-item-menu-{{$item.id}}">
+ <i class="fa fa-cog"></i>
+ </button>
+ <div class="dropdown-menu dropdown-menu-right" role="menu" aria-labelledby="wall-item-menu-{{$item.id}}">
+ {{if $item.share}}
+ <a class="dropdown-item" href="#" onclick="jotShare({{$item.id}}); return false"><i class="generic-icons-nav fa fa-fw fa-retweet" title="{{$item.share.0}}"></i>{{$item.share.0}}</a>
+ {{/if}}
+ {{if $item.plink}}
+ <a class="dropdown-item" href="{{$item.plink.href}}" title="{{$item.plink.title}}" class="u-url"><i class="generic-icons-nav fa fa-fw fa-external-link"></i>{{$item.plink.title}}</a>
+ {{/if}}
+ {{if $item.edpost}}
+ <a class="dropdown-item" href="{{$item.edpost.0}}" title="{{$item.edpost.1}}"><i class="generic-icons-nav fa fa-fw fa-pencil"></i>{{$item.edpost.1}}</a>
+ {{/if}}
+ {{if $item.tagger}}
+ <a class="dropdown-item" href="#" onclick="itemTag({{$item.id}}); return false;"><i id="tagger-{{$item.id}}" class="generic-icons-nav fa fa-fw fa-tag" title="{{$item.tagger.tagit}}"></i>{{$item.tagger.tagit}}</a>
+ {{/if}}
+ {{if $item.filer}}
+ <a class="dropdown-item" href="#" onclick="itemFiler({{$item.id}}); return false;"><i id="filer-{{$item.id}}" class="generic-icons-nav fa fa-fw fa-folder-open" title="{{$item.filer}}"></i>{{$item.filer}}</a>
+ {{/if}}
+ {{if $item.bookmark}}
+ <a class="dropdown-item" href="#" onclick="itemBookmark({{$item.id}}); return false;"><i id="bookmarker-{{$item.id}}" class="generic-icons-nav fa fa-fw fa-bookmark" title="{{$item.bookmark}}"></i>{{$item.bookmark}}</a>
+ {{/if}}
+ {{if $item.addtocal}}
+ <a class="dropdown-item" href="#" onclick="itemAddToCal({{$item.id}}); return false;"><i id="addtocal-{{$item.id}}" class="generic-icons-nav fa fa-fw fa-calendar" title="{{$item.addtocal}}"></i>{{$item.addtocal}}</a>
+ {{/if}}
+ {{if $item.star}}
+ <a class="dropdown-item" href="#" onclick="dostar({{$item.id}}); return false;"><i id="starred-{{$item.id}}" class="generic-icons-nav fa fa-fw fa-star {{$item.star.isstarred}}" title="{{$item.star.toggle}}"></i>{{$item.star.toggle}}</a>
+ {{/if}}
+ {{if $item.thread_action_menu}}
+ {{foreach $item.thread_action_menu as $mitem}}
+ <a class="dropdown-item" {{if $mitem.href}}href="{{$mitem.href}}"{{/if}} {{if $mitem.action}}onclick="{{$mitem.action}}"{{/if}} {{if $mitem.title}}title="{{$mitem.title}}"{{/if}} ><i class="generic-icons-nav fa fa-fw fa-{{$mitem.icon}}"></i>{{$mitem.title}}</a>
+ {{/foreach}}
+ {{/if}}
+ {{if $item.drop.dropping}}
+ <a class="dropdown-item" href="#" onclick="dropItem('item/drop/{{$item.id}}', '#thread-wrapper-{{$item.id}}'); return false;" title="{{$item.drop.delete}}" ><i class="generic-icons-nav fa fa-fw fa-trash-o"></i>{{$item.drop.delete}}</a>
+ {{/if}}
+ {{if $item.thread_author_menu}}
+ <div class="dropdown-divider"></div>
+ {{foreach $item.thread_author_menu as $mitem}}
+ <a class="dropdown-item" {{if $mitem.href}}href="{{$mitem.href}}"{{/if}} {{if $mitem.action}}onclick="{{$mitem.action}}"{{/if}} {{if $mitem.title}}title="{{$mitem.title}}"{{/if}} >{{$mitem.title}}</a>
+ {{/foreach}}
+ {{/if}}
+ {{if $item.edpost && $item.dreport}}
+ <a class="dropdown-item" href="dreport/{{$item.mid}}">{{$item.dreport}}</a>
+ {{/if}}
+ </div>
+ </div>
</div>
<div id="like-rotator-{{$item.id}}" class="like-rotator"></div>
<div class="wall-item-tools-left{{if $item.unseen_comments || $item.like_count || $item.dislike_count || $item.attachments}} btn-group{{/if}}">
{{if $item.attachments}}
<div class="btn-group">
- <button type="button" class="btn btn-default btn-sm wall-item-like dropdown-toggle" data-toggle="dropdown" id="attachment-menu-{{$item.id}}"><i class="fa fa-paperclip"></i></button>
+ <button type="button" class="btn btn-outline-secondary btn-sm wall-item-like dropdown-toggle" data-toggle="dropdown" id="attachment-menu-{{$item.id}}"><i class="fa fa-paperclip"></i></button>
<ul class="dropdown-menu" role="menu" aria-labelledby="attachment-menu-{{$item.id}}">{{$item.attachments}}</ul>
</div>
{{/if}}
<div class="wall-item-list-comments btn-group">
- <button class="btn btn-default btn-sm" onclick="window.location.href='{{$item.viewthread}}'; return false;">
+ <a class="btn btn-outline-secondary btn-sm" href="{{$item.viewthread}}">
{{$item.comment_count_txt}}{{if $item.unseen_comments}}<span class="unseen-wall-indicator-{{$item.id}}">, {{$item.list_unseen_txt}}</span>{{/if}}
- </button>
+ </a>
</div>
{{if $item.unseen_comments}}
<div class="unseen-wall-indicator-{{$item.id}} btn-group">
- <button class="btn btn-default btn-sm" title="{{$item.markseen}}" onclick="markItemRead({{$item.id}}); return false;">
+ <button class="btn btn-outline-secondary btn-sm" title="{{$item.markseen}}" onclick="markItemRead({{$item.id}}); return false;">
<i class="fa fa-check-square-o"></i>
</button>
</div>
@@ -174,40 +216,34 @@
{{foreach $item.responses as $verb=>$response}}
{{if $response.count}}
<div class="btn-group">
- <button type="button" class="btn btn-default btn-sm wall-item-like dropdown-toggle" data-toggle="dropdown" id="wall-item-{{$verb}}-{{$item.id}}">{{$response.count}} {{$response.button}}</button>
- {{if $response.list_part}}
- <ul class="dropdown-menu" role="menu" aria-labelledby="wall-item-{{$verb}}-{{$item.id}}">{{foreach $response.list_part as $liker}}<li role="presentation">{{$liker}}</li>{{/foreach}}</ul>
- {{else}}
- <ul class="dropdown-menu" role="menu" aria-labelledby="wall-item-{{$verb}}-{{$item.id}}">{{foreach $response.list as $liker}}<li role="presentation">{{$liker}}</li>{{/foreach}}</ul>
- {{/if}}
- {{if $response.list_part}}
+ <button type="button" class="btn btn-outline-secondary btn-sm wall-item-like dropdown-toggle"{{if $response.modal}} data-toggle="modal" data-target="#{{$verb}}Modal-{{$item.id}}"{{else}} data-toggle="dropdown"{{/if}} id="wall-item-{{$verb}}-{{$item.id}}">{{$response.count}} {{$response.button}}</button>
+ {{if $response.modal}}
<div class="modal" id="{{$verb}}Modal-{{$item.id}}">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
+ <h4 class="modal-title">{{$response.count}} {{$response.button}}</h4>
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
- <h4 class="modal-title">{{$response.title}}</h4>
</div>
- <div class="modal-body">
- <ul>{{foreach $response.list as $liker}}<li role="presentation">{{$liker}}</li>{{/foreach}}</ul>
+ <div class="modal-body response-list">
+ <ul class="nav nav-pills flex-column">{{foreach $response.list as $liker}}<li class="nav-item">{{$liker}}</li>{{/foreach}}</ul>
</div>
<div class="modal-footer clear">
- <button type="button" class="btn btn-default" data-dismiss="modal">{{$item.modal_dismiss}}</button>
+ <button type="button" class="btn btn-outline-secondary" data-dismiss="modal">{{$item.modal_dismiss}}</button>
</div>
</div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->
</div><!-- /.modal -->
+ {{else}}
+ <div class="dropdown-menu">{{foreach $response.list as $liker}}{{$liker}}{{/foreach}}</div>
{{/if}}
</div>
{{/if}}
{{/foreach}}
{{/if}}
</div>
- <div class="clear"></div>
</div>
- <div class="clear"></div>
</div>
- <div class="clear{{if $indent}} {{$indent}}{{/if}}"></div>
</div>
</div>
{{if $item.comment_lastcollapsed}}
diff --git a/view/tpl/cover_photo_widget.tpl b/view/tpl/cover_photo_widget.tpl
index bc1f421bd..a9c384d2f 100755
--- a/view/tpl/cover_photo_widget.tpl
+++ b/view/tpl/cover_photo_widget.tpl
@@ -12,12 +12,9 @@
if($('#cover-photo').length && $(window).width() > 755) {
if($(window).scrollTop() < $('#cover-photo').height()) {
+ $('.navbar').removeClass('fixed-top');
$('main').css('margin-top', - $('nav').outerHeight(true) + 'px');
- $('aside').css('padding-top', aside_padding_top - $('nav').outerHeight() + 'px');
- $('section').css('padding-top', section_padding_top - $('nav').outerHeight() + 'px');
- $('.navbar-fixed-top').css('position', 'relative');
$('main').css('opacity', 0);
- $('header').hide();
}
}
else {
@@ -28,12 +25,9 @@
$(window).scroll(function () {
if($('#cover-photo').length && $(window).width() > 755 && $(window).scrollTop() >= $('#cover-photo').height()) {
- $('header').fadeIn();
- $('main').css('opacity', 1);
- $('aside').css('padding-top', aside_padding_top + 'px');
- $('section').css('padding-top', section_padding_top + 'px');
- $('.navbar-fixed-top').css('position', '');
+ $('.navbar').addClass('fixed-top');
$('main').css('margin-top', '');
+ $('main').css('opacity', 1);
coverSlid = true;
}
else if ($('#cover-photo').length && $(window).width() > 755 && $(window).scrollTop() < $('#cover-photo').height()){
@@ -43,13 +37,9 @@
}
else {
if($(window).scrollTop() < $('#cover-photo').height()) {
+ $('.navbar').removeClass('fixed-top');
$('main').css('margin-top', - $('nav').outerHeight(true) + 'px');
- $('aside').css('padding-top', aside_padding_top - $('nav').outerHeight() + 'px');
- $('section').css('padding-top', section_padding_top - $('nav').outerHeight() + 'px');
-
- $('.navbar-fixed-top').css('position', 'relative');
$('main').css('opacity', 0);
- $('header').hide();
}
}
}
@@ -61,10 +51,8 @@
$(window).resize(function () {
if($('#cover-photo').length && $(window).width() < 755) {
$('#cover-photo').remove();
+ $('.navbar').addClass('fixed-top');
$('main').css('opacity', 1);
- $('aside').css('padding-top', aside_padding_top + 'px');
- $('section').css('padding-top', section_padding_top + 'px');
- $('.navbar-fixed-top').css('position', '');
coverSlid = true;
}
@@ -82,11 +70,7 @@
<div id="cover-photo" title="{{$hovertitle}}">
{{$photo_html}}
<div id="cover-photo-caption">
- <div class="cover-photo-title">
- {{$title}}
- </div>
- <div class="cover-photo-subtitle">
- {{$subtitle}}
- </div>
+ <h1>{{$title}}</h1>
+ <h3>{{$subtitle}}</h3>
</div>
</div>
diff --git a/view/tpl/design_tools.tpl b/view/tpl/design_tools.tpl
index dffeeafa0..bc7d46dc1 100644
--- a/view/tpl/design_tools.tpl
+++ b/view/tpl/design_tools.tpl
@@ -1,9 +1,9 @@
<div id="design-tools" class="widget design-tools">
-<h3>{{$title}}</h3>
-<ul class="nav nav-pills nav-stacked">
-<li><a href="blocks/{{$who}}">{{$blocks}}</a></li>
-<li><a href="menu{{if $sys}}?f=&sys=1{{/if}}">{{$menus}}</a></li>
-<li><a href="layouts/{{$who}}">{{$layout}}</a></li>
-<li><a href="webpages/{{$who}}">{{$pages}}</a></li>
-</ul>
+ <h3>{{$title}}</h3>
+ <div class="nav nav-pills flex-column">
+ <a class="nav-link" href="blocks/{{$who}}">{{$blocks}}</a>
+ <a class="nav-link" href="menu{{if $sys}}?f=&sys=1{{/if}}">{{$menus}}</a>
+ <a class="nav-link" href="layouts/{{$who}}">{{$layout}}</a>
+ <a class="nav-link" href="webpages/{{$who}}">{{$pages}}</a>
+ </div>
</div>
diff --git a/view/tpl/directory_header.tpl b/view/tpl/directory_header.tpl
index c82fada45..71e991f3a 100755
--- a/view/tpl/directory_header.tpl
+++ b/view/tpl/directory_header.tpl
@@ -1,24 +1,22 @@
<div class="generic-content-wrapper">
- <div class="section-title-wrapper">
+ <div class="section-title-wrapper clearfix">
<div class="btn-group pull-right">
- <button type="button" class="btn btn-default btn-xs dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" title="{{$sort}}">
+ <button type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" title="{{$sort}}">
<i class="fa fa-sort"></i>
</button>
- <ul class="dropdown-menu">
- <li><a href="directory?f=&order=date{{$suggest}}">{{$date}}</a></li>
- <li><a href="directory?f=&order=normal{{$suggest}}">{{$normal}}</a></li>
- <li><a href="directory?f=&order=reversedate{{$suggest}}">{{$reversedate}}</a></li>
- <li><a href="directory?f=&order=reverse{{$suggest}}">{{$reverse}}</a></li>
- </ul>
+ <div class="dropdown-menu dropdown-menu-right">
+ <a class="dropdown-item" href="directory?f=&order=date{{$suggest}}">{{$date}}</a>
+ <a class="dropdown-item" href="directory?f=&order=normal{{$suggest}}">{{$normal}}</a>
+ <a class="dropdown-item" href="directory?f=&order=reversedate{{$suggest}}">{{$reversedate}}</a>
+ <a class="dropdown-item" href="directory?f=&order=reverse{{$suggest}}">{{$reverse}}</a>
+ </div>
</div>
<h2>{{$dirlbl}}{{if $search}}:&nbsp;{{$safetxt}}{{/if}}</h2>
- <div class="clear"></div>
</div>
{{foreach $entries as $entry}}
{{include file="direntry.tpl"}}
{{/foreach}}
<div id="page-end"></div>
- <div class="clear"></div>
</div>
<script>$(document).ready(function() { loadingPage = false;});</script>
<div id="page-spinner"></div>
diff --git a/view/tpl/direntry.tpl b/view/tpl/direntry.tpl
index c9940a347..f7ec7db23 100755
--- a/view/tpl/direntry.tpl
+++ b/view/tpl/direntry.tpl
@@ -1,17 +1,17 @@
<div class="directory-item{{if $entry.safe}} safe{{/if}}" id="directory-item-{{$entry.hash}}" >
- <div class="section-subtitle-wrapper">
+ <div class="section-subtitle-wrapper clearfix">
<div class="pull-right">
{{if $entry.viewrate}}
- {{if $entry.total_ratings}}<a href="ratings/{{$entry.hash}}" id="dir-rating-{{$entry.hash}}" class="btn btn-default btn-xs">{{$entry.total_ratings}}</a>{{/if}}
+ {{if $entry.total_ratings}}<a href="ratings/{{$entry.hash}}" id="dir-rating-{{$entry.hash}}" class="btn btn-outline-secondary btn-sm">{{$entry.total_ratings}}</a>{{/if}}
{{/if}}
{{if $entry.ignlink}}
- <a class="directory-ignore btn btn-warning btn-xs" href="{{$entry.ignlink}}"> {{$entry.ignore_label}}</a>
+ <a class="directory-ignore btn btn-warning btn-sm" href="{{$entry.ignlink}}"> {{$entry.ignore_label}}</a>
{{/if}}
{{if $entry.connect}}
- <a class="btn btn-success btn-xs" href="{{$entry.connect}}"><i class="fa fa-plus connect-icon"></i> {{$entry.conn_label}}</a>
+ <a class="btn btn-success btn-sm" href="{{$entry.connect}}"><i class="fa fa-plus connect-icon"></i> {{$entry.conn_label}}</a>
{{/if}}
{{if $entry.viewrate}}
- {{if $entry.canrate}}<button class="btn btn-default btn-xs" onclick="doRatings('{{$entry.hash}}'); return false;" ><i class="fa fa-pencil"></i><span id="edited-{{$entry.hash}}" class="required" id="edited-{{$entry.hash}}" style="display: none;" >&nbsp;*</span></button>{{/if}}
+ {{if $entry.canrate}}<button class="btn btn-outline-secondary btn-sm" onclick="doRatings('{{$entry.hash}}'); return false;" ><i class="fa fa-pencil"></i><span id="edited-{{$entry.hash}}" class="required" id="edited-{{$entry.hash}}" style="display: none;" >&nbsp;*</span></button>{{/if}}
{{/if}}
</div>
<h3>{{if $entry.public_forum}}<i class="fa fa-comments-o" title="{{$entry.forum_label}} @{{$entry.nickname}}+"></i>&nbsp;{{/if}}<a href='{{$entry.profile_link}}' >{{$entry.name}}</a>{{if $entry.online}}&nbsp;<i class="fa fa-asterisk online-now" title="{{$entry.online}}"></i>{{/if}}</h3>
diff --git a/view/tpl/dreport.tpl b/view/tpl/dreport.tpl
index 8aa5e2cd1..1f5915609 100644
--- a/view/tpl/dreport.tpl
+++ b/view/tpl/dreport.tpl
@@ -2,7 +2,7 @@
<div class="section-title-wrapper">
{{if $table == 'item'}}
<div class="dropdown pull-right">
- <button type="button" class="btn btn-default btn-xs dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" title="{{$options}}">
+ <button type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" title="{{$options}}">
<i class="fa fa-sort-desc"></i>
</button>
<ul class="dropdown-menu">
diff --git a/view/tpl/edpost_head.tpl b/view/tpl/edpost_head.tpl
index 79a8f347f..b2ab5db4e 100755
--- a/view/tpl/edpost_head.tpl
+++ b/view/tpl/edpost_head.tpl
@@ -2,7 +2,7 @@
<div class="section-title-wrapper">
{{if $delete}}
<div class="pull-right">
- <a href="item/drop/{{$id}}" id="delete-btn" class="btn btn-xs btn-danger" onclick="return confirmDelete();"><i class="fa fa-trash-o"></i>&nbsp;{{$delete}}</a>
+ <a href="item/drop/{{$id}}" id="delete-btn" class="btn btn-sm btn-danger" onclick="return confirmDelete();"><i class="fa fa-trash-o"></i>&nbsp;{{$delete}}</a>
</div>
{{/if}}
<h2>{{$title}}</h2>
diff --git a/view/tpl/event.tpl b/view/tpl/event.tpl
index fe3cfc517..cc0bfc1c7 100755
--- a/view/tpl/event.tpl
+++ b/view/tpl/event.tpl
@@ -6,9 +6,9 @@
</div>
{{$event.html}}
<div class="event-buttons">
- {{if $event.item.plink}}<a href="{{$event.plink.0}}" title="{{$event.plink.1}}" class="plink-event-link"><i class="fa fa-external-link btn btn-default" ></i></a>{{/if}}
- {{if $event.edit}}<a href="{{$event.edit.0}}" title="{{$event.edit.1}}" class="edit-event-link"><i class="fa fa-pencil btn btn-default"></i></a>{{/if}}
- {{if $event.drop}}<a href="{{$event.drop.0}}" title="{{$event.drop.1}}" class="drop-event-link"><i class="fa fa-trash-o btn btn-default"></i></a>{{/if}}
+ {{if $event.item.plink}}<a href="{{$event.plink.0}}" title="{{$event.plink.1}}" class="plink-event-link"><i class="fa fa-external-link btn btn-outline-secondary" ></i></a>{{/if}}
+ {{if $event.edit}}<a href="{{$event.edit.0}}" title="{{$event.edit.1}}" class="edit-event-link"><i class="fa fa-pencil btn btn-outline-secondary"></i></a>{{/if}}
+ {{if $event.drop}}<a href="{{$event.drop.0}}" title="{{$event.drop.1}}" class="drop-event-link"><i class="fa fa-trash-o btn btn-outline-secondary"></i></a>{{/if}}
</div>
<div class="clear"></div>
</div>
diff --git a/view/tpl/event_cal.tpl b/view/tpl/event_cal.tpl
index a88df6d18..d7662786b 100755
--- a/view/tpl/event_cal.tpl
+++ b/view/tpl/event_cal.tpl
@@ -6,7 +6,7 @@
</div>
{{$event.html}}
<div class="event-buttons">
- {{if $event.item.plink}}<a href="{{$event.plink.0}}" title="{{$event.plink.1}}" class="plink-event-link"><i class="fa fa-external-link btn btn-default" ></i></a>{{/if}}
+ {{if $event.item.plink}}<a href="{{$event.plink.0}}" title="{{$event.plink.1}}" class="plink-event-link"><i class="fa fa-external-link btn btn-outline-secondary" ></i></a>{{/if}}
</div>
<div class="clear"></div>
</div>
diff --git a/view/tpl/event_form.tpl b/view/tpl/event_form.tpl
index 8a06567c1..d07a06b67 100755
--- a/view/tpl/event_form.tpl
+++ b/view/tpl/event_form.tpl
@@ -32,35 +32,37 @@
{{/if}}
<div class="form-group">
- <div id="event-desc-text"><b>{{$d_text}}</b></div>
- <textarea id="comment-edit-text-desc" class="form-control" name="desc" >{{$d_orig}}</textarea>
+ <div class="form-group">
+ <div id="event-desc-text"><b>{{$d_text}}</b></div>
+ <textarea id="comment-edit-text-desc" class="form-control" name="desc" >{{$d_orig}}</textarea>
+ </div>
<div id="comment-tools-desc" class="comment-tools" style="display: block;" >
<div id="comment-edit-bb-desc" class="btn-toolbar">
- <div class='btn-group'>
- <button type="button" class="btn btn-default btn-xs" title="{{$edbold}}" onclick="insertbbcomment('none','b', 'desc');">
+ <div class='btn-group mr-2'>
+ <button type="button" class="btn btn-outline-secondary btn-sm" title="{{$edbold}}" onclick="insertbbcomment('none','b', 'desc');">
<i class="fa fa-bold comment-icon"></i>
</button>
- <button type="button" class="btn btn-default btn-xs" title="{{$editalic}}" onclick="insertbbcomment('none','i', 'desc');">
+ <button type="button" class="btn btn-outline-secondary btn-sm" title="{{$editalic}}" onclick="insertbbcomment('none','i', 'desc');">
<i class="fa fa-italic comment-icon"></i>
</button>
- <button type="button" class="btn btn-default btn-xs" title="{{$eduline}}" onclick="insertbbcomment('none','u', 'desc');">
+ <button type="button" class="btn btn-outline-secondary btn-sm" title="{{$eduline}}" onclick="insertbbcomment('none','u', 'desc');">
<i class="fa fa-underline comment-icon"></i>
</button>
- <button type="button" class="btn btn-default btn-xs" title="{{$edquote}}" onclick="insertbbcomment('none','quote','desc');">
+ <button type="button" class="btn btn-outline-secondary btn-sm" title="{{$edquote}}" onclick="insertbbcomment('none','quote','desc');">
<i class="fa fa-quote-left comment-icon"></i>
</button>
- <button type="button" class="btn btn-default btn-xs" title="{{$edcode}}" onclick="insertbbcomment('none','code', 'desc');">
+ <button type="button" class="btn btn-outline-secondary btn-sm" title="{{$edcode}}" onclick="insertbbcomment('none','code', 'desc');">
<i class="fa fa-terminal comment-icon"></i>
</button>
</div>
<div class='btn-group'>
- <button type="button" class="btn btn-default btn-xs" title="{{$edimg}}" onclick="insertbbcomment('none','img', 'desc');">
+ <button type="button" class="btn btn-outline-secondary btn-sm" title="{{$edimg}}" onclick="insertbbcomment('none','img', 'desc');">
<i class="fa fa-camera comment-icon"></i>
</button>
- <button type="button" class="btn btn-default btn-xs" title="{{$edurl}}" onclick="insertbbcomment('none','url', 'desc');">
+ <button type="button" class="btn btn-outline-secondary btn-sm" title="{{$edurl}}" onclick="insertbbcomment('none','url', 'desc');">
<i class="fa fa-link comment-icon"></i>
</button>
- <button type="button" class="btn btn-default btn-xs" title="{{$edvideo}}" onclick="insertbbcomment('none','video', 'desc');">
+ <button type="button" class="btn btn-outline-secondary btn-sm" title="{{$edvideo}}" onclick="insertbbcomment('none','video', 'desc');">
<i class="fa fa-video-camera comment-icon"></i>
</button>
</div>
@@ -68,38 +70,40 @@
</div>
</div>
<div class="form-group">
- <div id="event-location-text"><b>{{$l_text}}</b></div>
- <textarea id="comment-edit-text-loc" class="form-control" name="location">{{$l_orig}}</textarea>
+ <div class="form-group">
+ <div id="event-location-text"><b>{{$l_text}}</b></div>
+ <textarea id="comment-edit-text-loc" class="form-control" name="location">{{$l_orig}}</textarea>
+ </div>
<div id="comment-tools-loc" class="comment-tools" style="display: block;" >
<div id="comment-edit-bb-loc" class="btn-toolbar">
- <div class='btn-group'>
- <button type="button" class="btn btn-default btn-xs" title="{{$edbold}}" onclick="insertbbcomment('none','b', 'loc');">
+ <div class='btn-group mr-2'>
+ <button type="button" class="btn btn-outline-secondary btn-sm" title="{{$edbold}}" onclick="insertbbcomment('none','b', 'loc');">
<i class="fa fa-bold comment-icon"></i>
</button>
- <button type="button" class="btn btn-default btn-xs" title="{{$editalic}}" onclick="insertbbcomment('none','i', 'loc');">
+ <button type="button" class="btn btn-outline-secondary btn-sm" title="{{$editalic}}" onclick="insertbbcomment('none','i', 'loc');">
<i class="fa fa-italic comment-icon"></i>
</button>
- <button type="button" class="btn btn-default btn-xs" title="{{$eduline}}" onclick="insertbbcomment('none','u', 'loc');">
+ <button type="button" class="btn btn-outline-secondary btn-sm" title="{{$eduline}}" onclick="insertbbcomment('none','u', 'loc');">
<i class="fa fa-underline comment-icon"></i>
</button>
- <button type="button" class="btn btn-default btn-xs" title="{{$edquote}}" onclick="insertbbcomment('none','quote','loc');">
+ <button type="button" class="btn btn-outline-secondary btn-sm" title="{{$edquote}}" onclick="insertbbcomment('none','quote','loc');">
<i class="fa fa-quote-left comment-icon"></i>
</button>
- <button type="button" class="btn btn-default btn-xs" title="{{$edcode}}" onclick="insertbbcomment('none','code', 'loc');">
+ <button type="button" class="btn btn-outline-secondary btn-sm" title="{{$edcode}}" onclick="insertbbcomment('none','code', 'loc');">
<i class="fa fa-terminal comment-icon"></i>
</button>
</div>
<div class='btn-group'>
- <button type="button" class="btn btn-default btn-xs" title="{{$edimg}}" onclick="insertbbcomment('none','img', 'loc');">
+ <button type="button" class="btn btn-outline-secondary btn-sm" title="{{$edimg}}" onclick="insertbbcomment('none','img', 'loc');">
<i class="fa fa-camera comment-icon"></i>
</button>
- <button type="button" class="btn btn-default btn-xs" title="{{$edurl}}" onclick="insertbbcomment('none','url', 'loc');">
+ <button type="button" class="btn btn-outline-secondary btn-sm" title="{{$edurl}}" onclick="insertbbcomment('none','url', 'loc');">
<i class="fa fa-link comment-icon"></i>
</button>
- <button type="button" class="btn btn-default btn-xs" title="{{$edvideo}}" onclick="insertbbcomment('none','video', 'loc');">
+ <button type="button" class="btn btn-outline-secondary btn-sm" title="{{$edvideo}}" onclick="insertbbcomment('none','video', 'loc');">
<i class="fa fa-video-camera comment-icon"></i>
</button>
- <button type="button" class="btn btn-default btn-xs" title="{{$mapper}}" onclick="insertbbcomment('none','map','loc');">
+ <button type="button" class="btn btn-outline-secondary btn-sm" title="{{$mapper}}" onclick="insertbbcomment('none','map','loc');">
<i class="fa fa-globe comment-icon"></i>
</button>
</div>
@@ -111,13 +115,13 @@
<div class="clear"></div>
- <button type="button" class="btn btn-default" onclick="openClose('advanced');">{{$advanced}}</button>
- <div class="btn-group pull-right">
- <button id="event-edit-preview-btn" class="btn btn-default" type="button" title="{{$preview}}" onclick="doEventPreview();"><i class="fa fa-eye" ></i></button>
+ <button type="button" class="btn btn-outline-secondary btn-sm" onclick="openClose('advanced');">{{$advanced}}</button>
+ <div class="btn-group float-right">
+ <button id="event-edit-preview-btn" class="btn btn-outline-secondary btn-sm" type="button" title="{{$preview}}" onclick="doEventPreview();"><i class="fa fa-eye" ></i></button>
{{if ! $eid}}
- <button id="dbtn-acl" class="btn btn-default" type="button" data-toggle="modal" data-target="#aclModal" title="{{$perms_label}}"><i id="jot-perms-icon" class="fa fa-{{$lockstate}}"></i></button>
+ <button id="dbtn-acl" class="btn btn-outline-secondary btn-sm" type="button" data-toggle="modal" data-target="#aclModal" title="{{$perms_label}}"><i id="jot-perms-icon" class="fa fa-{{$lockstate}}"></i></button>
{{/if}}
- <button id="event-submit" class="btn btn-primary" type="submit" name="submit">{{$submit}}</button>
+ <button id="event-submit" class="btn btn-primary btn-sm" type="submit" name="submit">{{$submit}}</button>
</div>
</form>
diff --git a/view/tpl/event_head.tpl b/view/tpl/event_head.tpl
index 1d1b6f15b..3b2cb5041 100755
--- a/view/tpl/event_head.tpl
+++ b/view/tpl/event_head.tpl
@@ -50,6 +50,7 @@
$('#events-calendar').fullCalendar({
events: '{{$baseurl}}{{$module_url}}/json',
header: false,
+ eventTextColor: 'white',
lang: '{{$lang}}',
firstDay: {{$first_day}},
diff --git a/view/tpl/events-js.tpl b/view/tpl/events-js.tpl
index 6299242ce..9d32c76be 100755
--- a/view/tpl/events-js.tpl
+++ b/view/tpl/events-js.tpl
@@ -2,20 +2,20 @@
<div class="section-title-wrapper">
<div class="pull-right">
<div class="dropdown">
- <button type="button" class="btn btn-default btn-xs dropdown-toggle" data-toggle="dropdown"><i class="fa fa-caret-down"></i>&nbsp;{{$view_label}}</button>
- <ul class="dropdown-menu">
- <li><a href="#" onclick="changeView('changeView', 'month'); return false;">{{$month}}</a></li>
- <li><a href="#" onclick="changeView('changeView', 'agendaWeek'); return false;">{{$week}}</a></li>
- <li><a href="#" onclick="changeView('changeView', 'agendaDay'); return false;">{{$day}}</a></li>
- </ul>
- <button class="btn btn-success btn-xs" onclick="openClose('form');">{{$new_event.1}}</button>
+ <button type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown"><i class="fa fa-cog"></i>&nbsp;{{$view_label}}</button>
+ <div class="dropdown-menu">
+ <a class="dropdown-item" href="#" onclick="changeView('changeView', 'month'); return false;">{{$month}}</a>
+ <a class="dropdown-item" href="#" onclick="changeView('changeView', 'agendaWeek'); return false;">{{$week}}</a>
+ <a class="dropdown-item" href="#" onclick="changeView('changeView', 'agendaDay'); return false;">{{$day}}</a>
+ </div>
+ <button class="btn btn-success btn-sm" onclick="openClose('form');">{{$new_event.1}}</button>
<div class="btn-group">
- <button class="btn btn-default btn-xs" onclick="changeView('prev', false);" title="{{$prev}}"><i class="fa fa-backward"></i></button>
- <button id="events-spinner" class="btn btn-default btn-xs" onclick="changeView('today', false);" title="{{$today}}"><i class="fa fa-bullseye"></i></button>
- <button class="btn btn-default btn-xs" onclick="changeView('next', false);" title="{{$next}}"><i class="fa fa-forward"></i></button>
+ <button class="btn btn-outline-secondary btn-sm" onclick="changeView('prev', false);" title="{{$prev}}"><i class="fa fa-backward"></i></button>
+ <button id="events-spinner" class="btn btn-outline-secondary btn-sm" onclick="changeView('today', false);" title="{{$today}}"><i class="fa fa-bullseye"></i></button>
+ <button class="btn btn-outline-secondary btn-sm" onclick="changeView('next', false);" title="{{$next}}"><i class="fa fa-forward"></i></button>
</div>
- <button id="fullscreen-btn" type="button" class="btn btn-default btn-xs" onclick="makeFullScreen();"><i class="fa fa-expand"></i></button>
- <button id="inline-btn" type="button" class="btn btn-default btn-xs" onclick="makeFullScreen(false);"><i class="fa fa-compress"></i></button>
+ <button id="fullscreen-btn" type="button" class="btn btn-outline-secondary btn-sm" onclick="makeFullScreen();"><i class="fa fa-expand"></i></button>
+ <button id="inline-btn" type="button" class="btn btn-outline-secondary btn-sm" onclick="makeFullScreen(false);"><i class="fa fa-compress"></i></button>
</div>
</div>
<h2 id="title"></h2>
diff --git a/view/tpl/events_cal-js.tpl b/view/tpl/events_cal-js.tpl
index b7836cfab..ba9e16dd6 100755
--- a/view/tpl/events_cal-js.tpl
+++ b/view/tpl/events_cal-js.tpl
@@ -3,12 +3,12 @@
<div class="section-title-wrapper">
<div class="pull-right">
<div class="btn-group">
- <button class="btn btn-default btn-xs" onclick="changeView('prev', false);" title="{{$prev}}"><i class="fa fa-backward"></i></button>
- <button id="events-spinner" class="btn btn-default btn-xs" onclick="changeView('today', false);" title="{{$today}}"><i class="fa fa-bullseye"></i></button>
- <button class="btn btn-default btn-xs" onclick="changeView('next', false);" title="{{$next}}"><i class="fa fa-forward"></i></button>
+ <button class="btn btn-outline-secondary btn-sm" onclick="changeView('prev', false);" title="{{$prev}}"><i class="fa fa-backward"></i></button>
+ <button id="events-spinner" class="btn btn-outline-secondary btn-sm" onclick="changeView('today', false);" title="{{$today}}"><i class="fa fa-bullseye"></i></button>
+ <button class="btn btn-outline-secondary btn-sm" onclick="changeView('next', false);" title="{{$next}}"><i class="fa fa-forward"></i></button>
</div>
- <button id="fullscreen-btn" type="button" class="btn btn-default btn-xs" onclick="makeFullScreen();"><i class="fa fa-expand"></i></button>
- <button id="inline-btn" type="button" class="btn btn-default btn-xs" onclick="makeFullScreen(false);"><i class="fa fa-compress"></i></button>
+ <button id="fullscreen-btn" type="button" class="btn btn-outline-secondary btn-sm" onclick="makeFullScreen();"><i class="fa fa-expand"></i></button>
+ <button id="inline-btn" type="button" class="btn btn-outline-secondary btn-sm" onclick="makeFullScreen(false);"><i class="fa fa-compress"></i></button>
</div>
<h2 id="title"></h2>
<div class="clear"></div>
diff --git a/view/tpl/events_tools_side.tpl b/view/tpl/events_tools_side.tpl
index 4f5ef2eb0..e22f95c1e 100755
--- a/view/tpl/events_tools_side.tpl
+++ b/view/tpl/events_tools_side.tpl
@@ -1,15 +1,17 @@
<div class="widget">
<h3>{{$title}}</h3>
- <ul class="nav nav-pills nav-stacked">
- <li><a href="#" onclick="exportDate(); return false;"><i class="fa fa-arrow-circle-o-down"></i>&nbsp;{{$export}}</a></li>
- <li><a href="#" onclick="openClose('event-upload-form'); return false;"><i class="fa fa-arrow-circle-o-up"></i>&nbsp;{{$import}}</a></li>
+ <ul class="nav nav-pills flex-column">
+ <li class="nav-item"><a class="nav-link" href="#" onclick="exportDate(); return false;"><i class="fa fa-arrow-circle-o-down"></i>&nbsp;{{$export}}</a></li>
+ <li class="nav-item"><a class="nav-link" href="#" onclick="openClose('event-upload-form'); return false;"><i class="fa fa-arrow-circle-o-up"></i>&nbsp;{{$import}}</a></li>
</ul>
- <div id="event-upload-form" style="display: none;">
- <form action="events" enctype="multipart/form-data" method="post" name="event-upload-form" id="event-upload-form">
- <div class="form-group">
- <input id="event-upload-choose" type="file" name="userfile" />
- </div>
- <button id="dbtn-submit" class="btn btn-primary btn-xs" type="submit" name="submit" >{{$submit}}</button>
- </form>
+ <div id="event-upload-form" class="sub-menu-wrapper">
+ <div class="sub-menu">
+ <form action="events" enctype="multipart/form-data" method="post" name="event-upload-form" id="event-upload-form">
+ <div class="form-group">
+ <input id="event-upload-choose" class="form-control-file w-100" type="file" name="userfile" />
+ </div>
+ <button id="dbtn-submit" class="btn btn-primary btn-sm" type="submit" name="submit" >{{$submit}}</button>
+ </form>
+ </div>
</div>
</div>
diff --git a/view/tpl/field_checkbox.tpl b/view/tpl/field_checkbox.tpl
index 6785e522a..f779f937c 100755
--- a/view/tpl/field_checkbox.tpl
+++ b/view/tpl/field_checkbox.tpl
@@ -1,6 +1,5 @@
- <div id="{{$field.0}}_container" class="form-group field checkbox">
+ <div id="{{$field.0}}_container" class="clearfix form-group checkbox">
<label for="id_{{$field.0}}">{{$field.1}}</label>
- <div class="pull-right"><input type="checkbox" name='{{$field.0}}' id='id_{{$field.0}}' value="1" {{if $field.2}}checked="checked"{{/if}} {{if $field.5}}{{$field.5}}{{/if}} /><label class="switchlabel" for='id_{{$field.0}}'> <span class="onoffswitch-inner" data-on='{{if $field.4}}{{$field.4.1}}{{/if}}' data-off='{{if $field.4}}{{$field.4.0}}{{/if}}'></span><span class="onoffswitch-switch"></span></label></div>
- <span class="help-block">{{$field.3}}</span>
+ <div class="float-right"><input type="checkbox" name='{{$field.0}}' id='id_{{$field.0}}' value="1" {{if $field.2}}checked="checked"{{/if}} {{if $field.5}}{{$field.5}}{{/if}} /><label class="switchlabel" for='id_{{$field.0}}'> <span class="onoffswitch-inner" data-on='{{if $field.4}}{{$field.4.1}}{{/if}}' data-off='{{if $field.4}}{{$field.4.0}}{{/if}}'></span><span class="onoffswitch-switch"></span></label></div>
+ <small class="form-text text-muted">{{$field.3}}</small>
</div>
- <div class="clear"></div>
diff --git a/view/tpl/field_combobox.tpl b/view/tpl/field_combobox.tpl
index 523595c0b..12d00a08d 100755
--- a/view/tpl/field_combobox.tpl
+++ b/view/tpl/field_combobox.tpl
@@ -1,17 +1,18 @@
- <div class='field combobox input form-group'>
- <label class="mainlabel" for='id_{{$field.0}}' id='id_{{$field.0}}_label'>{{$field.1}}</label>
- {{*
- <input id="id_{{$field.0}}" type="text" list="data_{{$field.0}}" >
- <datalist id="data_{{$field.0}}" >
- {{foreach $field.4 as $opt=>$val}}<option value="{{$val}}">{{/foreach}}
- </datalist>*}}
-
- <input id="id_{{$field.0}}" class="form-control" type="text" value="{{$field.2}}">
- <select id="select_{{$field.0}}" class="form-control" onChange="$('#id_{{$field.0}}').val($(this).val())">
- <option value="">{{$field.5}}</option>
- {{foreach $field.4 as $opt=>$val}}<option value="{{$val}}">{{$val}}</option>{{/foreach}}
- </select>
-
- <span class='field_help'>{{$field.3}}</span>
- </div>
+<div class="form-group">
+ <label class="" for='id_{{$field.0}}' id='id_{{$field.0}}_label'>{{$field.1}}</label>
+ <input class="form-control" id="id_{{$field.0}}" type="text" list="data_{{$field.0}}"{{if $field.5}} {{$field.5}}{{/if}}>
+ <datalist id="data_{{$field.0}}" >
+ {{foreach $field.4 as $opt=>$val}}
+ <option value="{{$val}}">
+ {{/foreach}}
+ </datalist>
+ {{**
+ <input id="id_{{$field.0}}" class="form-control" type="text" value="{{$field.2}}">
+ <select id="select_{{$field.0}}" class="form-control" onChange="$('#id_{{$field.0}}').val($(this).val())">
+ <option value="">{{$field.5}}</option>
+ {{foreach $field.4 as $opt=>$val}}<option value="{{$val}}">{{$val}}</option>{{/foreach}}
+ </select>
+ **}}
+ <span class='field_help'>{{$field.3}}</span>
+</div>
diff --git a/view/tpl/field_input.tpl b/view/tpl/field_input.tpl
index d6a7f56b2..65a837e5f 100755
--- a/view/tpl/field_input.tpl
+++ b/view/tpl/field_input.tpl
@@ -1,6 +1,5 @@
- <div id="id_{{$field.0}}_wrapper" class='form-group field input'>
- <label for='id_{{$field.0}}' id='label_{{$field.0}}'>{{$field.1}}{{if $field.4}}<span class="required"> {{$field.4}}</span>{{/if}}</label>
- <input class="form-control" name='{{$field.0}}' id='id_{{$field.0}}' type="text" value="{{$field.2}}"{{if $field.5}} {{$field.5}}{{/if}}>
- <span id='help_{{$field.0}}' class='help-block'>{{$field.3}}</span>
- <div class="clear"></div>
+ <div id="id_{{$field.0}}_wrapper" class="form-group">
+ <label for="id_{{$field.0}}" id="label_{{$field.0}}">{{$field.1}}{{if $field.4}}<span class="required"> {{$field.4}}</span>{{/if}}</label>
+ <input class="form-control" name="{{$field.0}}" id="id_{{$field.0}}" type="text" value="{{$field.2}}"{{if $field.5}} {{$field.5}}{{/if}}>
+ <small id="help_{{$field.0}}" class="form-text text-muted">{{$field.3}}</small>
</div>
diff --git a/view/tpl/field_intcheckbox.tpl b/view/tpl/field_intcheckbox.tpl
index 565f97760..abfe6e189 100755
--- a/view/tpl/field_intcheckbox.tpl
+++ b/view/tpl/field_intcheckbox.tpl
@@ -1,6 +1,5 @@
- <div class="form-group field checkbox">
- <label for='id_{{$field.0}}'>{{$field.1}}</label>
- <div class="pull-right"><input type="checkbox" name='{{$field.0}}' id='id_{{$field.0}}' value="{{$field.3}}" {{if $field.2}}checked="checked"{{/if}}><label class="switchlabel" for='id_{{$field.0}}'> <span class="onoffswitch-inner" data-on='{{if $field.5}}{{$field.5.1}}{{/if}}' data-off='{{if $field.5}}{{$field.5.0}}{{/if}}'></span><span class="onoffswitch-switch"></span> </label></div>
- <span class='help-block'>{{$field.4}}</span>
+ <div class="clearfix form-group checkbox">
+ <label for="id_{{$field.0}}">{{$field.1}}</label>
+ <div class="pull-right"><input type="checkbox" name="{{$field.0}}" id="id_{{$field.0}}" value="{{$field.3}}" {{if $field.2}}checked="checked"{{/if}}><label class="switchlabel" for="id_{{$field.0}}"> <span class="onoffswitch-inner" data-on="{{if $field.5}}{{$field.5.1}}{{/if}}" data-off="{{if $field.5}}{{$field.5.0}}{{/if}}"></span><span class="onoffswitch-switch"></span> </label></div>
+ <small class="form-text text-muted">{{$field.4}}</small>
</div>
- <div class="clear"></div>
diff --git a/view/tpl/field_password.tpl b/view/tpl/field_password.tpl
index 1643fa855..fa5e14582 100755
--- a/view/tpl/field_password.tpl
+++ b/view/tpl/field_password.tpl
@@ -1,5 +1,5 @@
- <div class='form-group field password'>
- <label for='id_{{$field.0}}'>{{$field.1}}</label>
- <input class="form-control" type='password' name='{{$field.0}}' id='id_{{$field.0}}' value="{{$field.2}}"{{if $field.5}} {{$field.5}}{{/if}}>{{if $field.4}} <span class="required">{{$field.4}}</span> {{/if}}
- <span id="help_{{$field.0}}" class="help-block">{{$field.3}}</span>
+ <div class="form-group">
+ <label for="id_{{$field.0}}">{{$field.1}}</label>
+ <input class="form-control" type="password" name="{{$field.0}}" id="id_{{$field.0}}" value="{{$field.2}}"{{if $field.5}} {{$field.5}}{{/if}}>{{if $field.4}} <span class="required">{{$field.4}}</span> {{/if}}
+ <small id="help_{{$field.0}}" class="form-text text-muted">{{$field.3}}</small>
</div>
diff --git a/view/tpl/field_select.tpl b/view/tpl/field_select.tpl
index 762447290..cda9a823a 100755
--- a/view/tpl/field_select.tpl
+++ b/view/tpl/field_select.tpl
@@ -1,7 +1,7 @@
- <div class='form-group field select'>
- <label for='id_{{$field.0}}'>{{$field.1}}</label>
- <select class="form-control" name='{{$field.0}}' id='id_{{$field.0}}'>
+ <div class="form-group">
+ <label for="id_{{$field.0}}">{{$field.1}}</label>
+ <select class="form-control" name="{{$field.0}}" id="id_{{$field.0}}">
{{foreach $field.4 as $opt=>$val}}<option value="{{$opt}}" {{if $opt==$field.2}}selected="selected"{{/if}}>{{$val}}</option>{{/foreach}}
</select>
- <span class='help-block'>{{$field.3}}</span>
+ <small class="form-text text-muted">{{$field.3}}</small>
</div>
diff --git a/view/tpl/field_textarea.tpl b/view/tpl/field_textarea.tpl
index 01fdc23f5..437dece93 100755
--- a/view/tpl/field_textarea.tpl
+++ b/view/tpl/field_textarea.tpl
@@ -1,5 +1,5 @@
- <div class='form-group field textarea'>
- <label for='id_{{$field.0}}'>{{$field.1}}</label>
- <textarea class="form-control" name='{{$field.0}}' id='id_{{$field.0}}' {{if $field.4}}{{$field.4}}{{/if}} >{{$field.2}}</textarea>
- <span class='help-block'>{{$field.3}}</span>
+ <div class="form-group">
+ <label for="id_{{$field.0}}">{{$field.1}}</label>
+ <textarea class="form-control" name="{{$field.0}}" id="id_{{$field.0}}" {{if $field.4}}{{$field.4}}{{/if}} >{{$field.2}}</textarea>
+ <small class="form-text text-muted">{{$field.3}}</small>
</div>
diff --git a/view/tpl/field_yesno.tpl b/view/tpl/field_yesno.tpl
index f5a909833..8a4cda55b 100755
--- a/view/tpl/field_yesno.tpl
+++ b/view/tpl/field_yesno.tpl
@@ -1,4 +1,4 @@
- <div class='field yesno'>
+ <div class='clearfix form-group'>
<label class="mainlabel" for='id_{{$field.0}}'>{{$field.1}}</label>
<div class='onoff' id="id_{{$field.0}}_onoff">
<input type="hidden" name='{{$field.0}}' id='id_{{$field.0}}' value="{{$field.2}}">
@@ -9,5 +9,5 @@
{{if $field.4}}{{$field.4.1}}{{else}}ON{{/if}}
</a>
</div>
- <span class='field_help'>{{$field.3}}</span>
+ <small class='form-text text-muted'>{{$field.3}}</small>
</div>
diff --git a/view/tpl/fileas_widget.tpl b/view/tpl/fileas_widget.tpl
index a92440cb0..a6a69b89c 100755
--- a/view/tpl/fileas_widget.tpl
+++ b/view/tpl/fileas_widget.tpl
@@ -2,10 +2,10 @@
<h3>{{$title}}</h3>
<div id="nets-desc">{{$desc}}</div>
- <ul class="nav nav-pills nav-stacked">
- <li><a href="{{$base}}"{{if $sel_all}} class="fileas-selected"{{/if}}>{{$all}}</a></li>
+ <ul class="nav nav-pills flex-column">
+ <li class="nav-item"><a class="nav-link{{if $sel_all}} active{{/if}}" href="{{$base}}">{{$all}}</a></li>
{{foreach $terms as $term}}
- <li><a href="{{$base}}?f=&file={{$term.name}}"{{if $term.selected}} class="fileas-selected"{{/if}}>{{$term.name}}</a></li>
+ <li class="nav-item"><a class="nav-link{{if $term.selected}} active{{/if}}" href="{{$base}}?f=&file={{$term.name}}">{{$term.name}}</a></li>
{{/foreach}}
</ul>
diff --git a/view/tpl/filer_dialog.tpl b/view/tpl/filer_dialog.tpl
index 71e075958..61860d10f 100755
--- a/view/tpl/filer_dialog.tpl
+++ b/view/tpl/filer_dialog.tpl
@@ -1,6 +1,19 @@
-<div class="item-filer-dialog">
-{{include file="field_combobox.tpl"}}
-<div class="settings-submit-wrapper" >
- <input id="filer_save" type="button" class="settings-submit" value="{{$submit}}" />
-</div>
+<div class="modal" id="item-filer-dialog">
+ <div class="modal-dialog" role="document">
+ <div class="modal-content">
+ <div class="modal-header">
+ <h4 class="modal-title">{{$title}}</h4>
+ <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+ <span aria-hidden="true">&times;</span>
+ </button>
+ </div>
+ <div class="modal-body">
+ {{include file="field_combobox.tpl"}}
+ </div>
+ <div class="modal-footer">
+ <button type="button" class="btn btn-secondary" data-dismiss="modal">{{$cancel}}</button>
+ <button id="filer_save" type="button" class="btn btn-primary">{{$submit}}</button>
+ </div>
+ </div>
+ </div>
</div>
diff --git a/view/tpl/follow.tpl b/view/tpl/follow.tpl
index a211a65b6..4def1415d 100755
--- a/view/tpl/follow.tpl
+++ b/view/tpl/follow.tpl
@@ -2,9 +2,9 @@
<h3>{{$connect}}</h3>
<form action="follow" method="post" />
<div class="input-group">
- <input class="form-control input-sm" type="text" name="url" title="{{$hint}}" placeholder="{{$desc}}" />
+ <input class="form-control form-control-sm" type="text" name="url" title="{{$hint}}" placeholder="{{$desc}}" />
<div class="input-group-btn">
- <button class="btn btn-success btn-sm" type="submit" name="submit" value="{{$follow}}" title="{{$follow}}"><i class="fa fa-fw fa-plus"></i></button>
+ <button class="btn btn-success" type="submit" name="submit" value="{{$follow}}" title="{{$follow}}"><i class="fa fa-fw fa-plus"></i></button>
</div>
</div>
</form>
diff --git a/view/tpl/generic_links_widget.tpl b/view/tpl/generic_links_widget.tpl
index d7c234a84..67801e666 100755
--- a/view/tpl/generic_links_widget.tpl
+++ b/view/tpl/generic_links_widget.tpl
@@ -2,9 +2,9 @@
{{if $title}}<h3>{{$title}}</h3>{{/if}}
{{if $desc}}<div class="desc">{{$desc}}</div>{{/if}}
- <ul class="nav nav-pills nav-stacked">
+ <ul class="nav nav-pills flex-column">
{{foreach $items as $item}}
- <li><a href="{{$item.url}}" class="{{if $item.selected}}active{{/if}}">{{$item.label}}</a></li>
+ <li class="nav-item"><a href="{{$item.url}}" class="nav-link{{if $item.selected}} active{{/if}}">{{$item.label}}</a></li>
{{/foreach}}
</ul>
diff --git a/view/tpl/generic_modal.tpl b/view/tpl/generic_modal.tpl
index 2bbea42b3..18279b6f7 100644
--- a/view/tpl/generic_modal.tpl
+++ b/view/tpl/generic_modal.tpl
@@ -2,12 +2,12 @@
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
- <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
<h4 class="modal-title" id="generic-modal-title-{{$id}}">{{$title}}</h4>
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
</div>
<div class="modal-body" id="generic-modal-body-{{$id}}"></div>
<div class="modal-footer">
- <button id="generic-modal-cancel-{{$id}}" type="button" class="btn btn-default" data-dismiss="modal">{{$cancel}}</button>
+ <button id="generic-modal-cancel-{{$id}}" type="button" class="btn btn-outline-secondary" data-dismiss="modal">{{$cancel}}</button>
{{if $ok}}
<button id="generic-modal-ok-{{$id}}" type="button" class="btn btn-primary">{{$ok}}</button>
{{/if}}
diff --git a/view/tpl/group_drop.tpl b/view/tpl/group_drop.tpl
index 34d0096e0..627debc80 100755
--- a/view/tpl/group_drop.tpl
+++ b/view/tpl/group_drop.tpl
@@ -2,6 +2,6 @@
<a href="group/drop/{{$id}}?t={{$form_security_token}}"
onclick="return confirmDelete();"
id="group-delete-icon-{{$id}}"
- class="group-delete-icon btn btn-default" title="{{$delete}}" ><i class="fa fa-trash-o drop-icons"></i></a>
+ class="group-delete-icon btn btn-outline-secondary" title="{{$delete}}" ><i class="fa fa-trash-o drop-icons"></i></a>
</div>
<div class="group-delete-end"></div>
diff --git a/view/tpl/group_side.tpl b/view/tpl/group_side.tpl
index 35f79a07e..14f714ae9 100755
--- a/view/tpl/group_side.tpl
+++ b/view/tpl/group_side.tpl
@@ -1,20 +1,20 @@
<div class="widget" id="group-sidebar">
<h3>{{$title}}</h3>
<div>
- <ul class="nav nav-pills nav-stacked">
+ <ul class="nav nav-pills flex-column">
{{foreach $groups as $group}}
- <li>
+ <li class="nav-item nav-item-hack">
{{if $group.cid}}
- <i id="group-{{$group.id}}" class="widget-nav-pills-checkbox fa {{if $group.ismember}}fa-check-square-o{{else}}fa-square-o{{/if}}" onclick="contactgroupChangeMember('{{$group.id}}','{{$group.enc_cid}}'); return true;"></i>
+ <i id="group-{{$group.id}}" class="widget-nav-pills-checkbox fa fa-fw {{if $group.ismember}}fa-check-square-o{{else}}fa-square-o{{/if}}" onclick="contactgroupChangeMember('{{$group.id}}','{{$group.enc_cid}}'); return true;"></i>
{{/if}}
{{if $group.edit}}
- <a href="{{$group.edit.href}}" class="widget-nav-pills-icons" title="{{$edittext}}"><i class="fa fa-pencil"></i></a>
+ <a href="{{$group.edit.href}}" class="nav-link{{if $group.selected}} active{{/if}} widget-nav-pills-icons" title="{{$edittext}}"><i class="fa fa-fw fa-pencil"></i></a>
{{/if}}
- <a{{if $group.selected}} class="group-selected"{{/if}} href="{{$group.href}}">{{$group.text}}</a>
+ <a class="nav-link{{if $group.selected}} active{{/if}}" href="{{$group.href}}">{{$group.text}}</a>
</li>
{{/foreach}}
- <li>
- <a href="group/new" title="{{$createtext}}" ><i class="fa fa-plus-circle"></i> {{$createtext}}</a>
+ <li class="nav-item">
+ <a class="nav-link" href="group/new" title="{{$createtext}}" ><i class="fa fa-plus-circle"></i> {{$createtext}}</a>
</li>
</ul>
diff --git a/view/tpl/hdr.tpl b/view/tpl/hdr.tpl
index 577269b6f..cccee2229 100644
--- a/view/tpl/hdr.tpl
+++ b/view/tpl/hdr.tpl
@@ -1,5 +1,3 @@
-<div id="banner" class="hidden-sm hidden-xs">{{$banner}}</div>
-
-<ul id="nav-notifications-template" rel="template">
- <li class="{5}"><a href="{0}" title="{2} {3}"><img class="dropdown-menu-img-sm" data-src="{1}"><span class="contactname">{2}</span><span class="dropdown-sub-text">{3}<br>{4}</span><div class="clear"></div></a></li>
-</ul>
+<div id="nav-notifications-template" rel="template">
+ <a class="dropdown-item clearfix dropdown-notification {5}" href="{0}" title="{2} {3}"><img class="menu-img-3" data-src="{1}"><span class="contactname">{2}</span><span class="dropdown-sub-text">{3}<br>{4}</span></a>
+</div>
diff --git a/view/tpl/help.tpl b/view/tpl/help.tpl
index 10e0a4957..43b061dcc 100644
--- a/view/tpl/help.tpl
+++ b/view/tpl/help.tpl
@@ -5,7 +5,7 @@
<div class="section-content-wrapper" id="doco-content">
<h3 id="doco-top-toc-heading">
<span class="fakelink" onclick="docoTocToggle(); return false;">
- <i class="fakelink fa fa-caret-right" id="doco-toc-toggle"></i>
+ <i class="fa fa-fw fa-caret-right fakelink" id="doco-toc-toggle"></i>
{{$tocHeading}}
</span>
</h3>
@@ -22,7 +22,7 @@
function docoTocToggle() {
if($('#doco-top-toc').is(':visible')) {
- $('#doco-toc-toggle').removeClass('fa-caret-down').addClass('fa-caret-right');
+ $('#doco-toc-toggle').removeClass('fa-cog').addClass('fa-caret-right');
} else {
$('#doco-toc-toggle').removeClass('fa-caret-right').addClass('fa-caret-down');
}
diff --git a/view/tpl/item_attach.tpl b/view/tpl/item_attach.tpl
index 83cc9a3cd..95e38c0bd 100644
--- a/view/tpl/item_attach.tpl
+++ b/view/tpl/item_attach.tpl
@@ -1,5 +1,5 @@
{{if $attaches}}
{{foreach $attaches as $a}}
-<li><a href="{{$a.url}}" title="{{$a.title}}"><i class="fa {{$a.icon}} attach-icons"></i>&nbsp;{{$a.label}}</a></li>
+<a class="dropdown-item" href="{{$a.url}}" title="{{$a.title}}"><i class="fa {{$a.icon}} attach-icons"></i>&nbsp;{{$a.label}}</a>
{{/foreach}}
{{/if}}
diff --git a/view/tpl/item_categories.tpl b/view/tpl/item_categories.tpl
index 9ff291747..e1b183c0d 100644
--- a/view/tpl/item_categories.tpl
+++ b/view/tpl/item_categories.tpl
@@ -1,8 +1,8 @@
{{if $categories}}
-<div class="categorytags">
+<!--div class="categorytags"-->
{{foreach $categories as $cat}}
-<span class="item-category"><i class="fa fa-asterisk cat-icons"></i>{{if $cat.url}}<a href="{{$cat.url}}">{{$cat.term}}</a>{{else}}{{$cat.term}}{{/if}}</span>
+<span class="item-category badge badge-pill badge-warning"><i class="fa fa-asterisk"></i>&nbsp;{{if $cat.url}}<a class="text-white" href="{{$cat.url}}">{{$cat.term}}</a>{{else}}{{$cat.term}}{{/if}}</span>
{{/foreach}}
-</div>
+<!--/div-->
{{/if}}
diff --git a/view/tpl/item_filer.tpl b/view/tpl/item_filer.tpl
index 0cde5caf7..4eb621f93 100644
--- a/view/tpl/item_filer.tpl
+++ b/view/tpl/item_filer.tpl
@@ -1,8 +1,8 @@
{{if $categories}}
-<div class="filesavetags">
+<!--div class="filesavetags"-->
{{foreach $categories as $cat}}
-<span class="item-category"><i class="fa fa-folder cat-icons"></i>&nbsp;{{$cat.term}}&nbsp;<a href="{{$cat.removelink}}" class="category-remove-link" title="{{$remove}}"><i class="fa fa-trash-o drop-icons"></i></a></span>
+<span class="item-category badge badge-pill badge-danger"><i class="fa fa-folder-o"></i>&nbsp;{{$cat.term}}&nbsp;<a href="{{$cat.removelink}}" class="text-white" title="{{$remove}}"><i class="fa fa-close"></i></a></span>
{{/foreach}}
-</div>
+<!--/div-->
{{/if}}
diff --git a/view/tpl/item_import.tpl b/view/tpl/item_import.tpl
index 65de7fcaf..e976417e1 100755
--- a/view/tpl/item_import.tpl
+++ b/view/tpl/item_import.tpl
@@ -1,7 +1,7 @@
<h2>{{$title}}</h2>
<form action="import_items" method="post" enctype="multipart/form-data" id="import-channel-form">
-
+ <input type="hidden" name="form_security_token" value="{{$form_security_token}}">
<div id="import-desc" class="descriptive-paragraph">{{$desc}}</div>
<label for="import-filename" id="label-import-filename" class="import-label" >{{$label_filename}}</label>
@@ -10,6 +10,4 @@
<input type="submit" name="submit" id="import-submit-button" value="{{$submit}}" />
<div id="import-submit-end" class="import-field-end"></div>
-
</form>
-
diff --git a/view/tpl/jot-header.tpl b/view/tpl/jot-header.tpl
index d846f3e34..1cc5a898a 100755
--- a/view/tpl/jot-header.tpl
+++ b/view/tpl/jot-header.tpl
@@ -10,7 +10,7 @@ function initEditor(cb){
{{$geotag}}
if(plaintext == 'none') {
$("#profile-jot-text-loading").spin(false).hide();
- $("#profile-jot-text").css({ 'height': 200, 'color': '#000', 'line-height': 'inherit' });
+ $("#profile-jot-text").css({ 'height': 200 });
{{if $bbco_autocomplete}}
$("#profile-jot-text").bbco_autocomplete('{{$bbco_autocomplete}}'); // autocomplete bbcode
{{/if}}
@@ -340,18 +340,12 @@ function enableOnUser(){
}
function itemFiler(id) {
-
- var bordercolor = $("input").css("border-color");
+ if($('#item-filer-dialog').length)
+ $('#item-filer-dialog').remove();
$.get('filer/', function(data){
- $.colorbox({html:data});
- $("#id_term").keypress(function(){
- $(this).css("border-color",bordercolor);
- })
- $("#select_term").change(function(){
- $("#id_term").css("border-color",bordercolor);
- })
-
+ $('body').append(data);
+ $('#item-filer-dialog').modal('show');
$("#filer_save").click(function(e){
e.preventDefault();
reply = $("#id_term").val();
@@ -362,9 +356,7 @@ function enableOnUser(){
// if(timer) clearTimeout(timer);
// timer = setTimeout(NavUpdate,3000);
liking = 1;
- $.colorbox.close();
- } else {
- $("#id_term").css("border-color","#FF0000");
+ $('#item-filer-dialog').modal('hide');
}
return false;
});
@@ -428,7 +420,7 @@ function enableOnUser(){
});
getPhotoAlbumList();
$('#embedPhotoModalBodyAlbumDialog').off('click');
- $('#embedPhotoModal').modal();
+ $('#embedPhotoModal').modal('show');
};
var choosePhotoFromAlbum = function (album) {
@@ -437,13 +429,13 @@ function enableOnUser(){
if (data['status']) {
$('#embedPhotoModalLabel').html("{{$modalchooseimages}}");
$('#embedPhotoModalBodyAlbumDialog').html('\
- <div><ul class="nav">\n\
- <li><a href="#" onclick="initializeEmbedPhotoDialog();return false;">\n\
+ <div><div class="nav nav-pills flex-column">\n\
+ <li class="nav-item"><a class="nav-link" href="#" onclick="initializeEmbedPhotoDialog();return false;">\n\
<i class="fa fa-chevron-left"></i>&nbsp\n\
{{$modaldiffalbum}}\n\
</a>\n\
</li>\n\
- </ul><br></div>')
+ </div><br></div>')
$('#embedPhotoModalBodyAlbumDialog').append(data['content']);
$('#embedPhotoModalBodyAlbumDialog').click(function (evt) {
evt.preventDefault();
@@ -453,8 +445,8 @@ function enableOnUser(){
$(imageparent).toggleClass('embed-photo-selected-photo');
}
});
- $('#embedPhotoModalBodyAlbumListDialog').addClass('hide');
- $('#embedPhotoModalBodyAlbumDialog').removeClass('hide');
+ $('#embedPhotoModalBodyAlbumListDialog').addClass('d-none');
+ $('#embedPhotoModalBodyAlbumDialog').removeClass('d-none');
$('#embed-photo-OKButton').click(function () {
$('.embed-photo-selected-photo').each(function (index) {
var href = $(this).attr('href');
@@ -487,17 +479,17 @@ function enableOnUser(){
if (data['status']) {
var albums = data['albumlist']; //JSON.parse(data['albumlist']);
$('#embedPhotoModalLabel').html("{{$modalchoosealbum}}");
- $('#embedPhotoModalBodyAlbumList').html('<ul class="nav"></ul>');
+ $('#embedPhotoModalBodyAlbumList').html('<ul class="nav nav-pills flex-column"></ul>');
for(var i=0; i<albums.length; i++) {
var albumName = albums[i].text;
var jsAlbumName = albums[i].jstext;
- var albumLink = '<li>';
- albumLink += '<a href="#" onclick="choosePhotoFromAlbum(\'' + jsAlbumName + '\'); return false;">' + albumName + '</a>';
+ var albumLink = '<li class="nav-item">';
+ albumLink += '<a class="nav-link" href="#" onclick="choosePhotoFromAlbum(\'' + jsAlbumName + '\'); return false;">' + albumName + '</a>';
albumLink += '</li>';
$('#embedPhotoModalBodyAlbumList').find('ul').append(albumLink);
}
- $('#embedPhotoModalBodyAlbumDialog').addClass('hide');
- $('#embedPhotoModalBodyAlbumListDialog').removeClass('hide');
+ $('#embedPhotoModalBodyAlbumDialog').addClass('d-none');
+ $('#embedPhotoModalBodyAlbumListDialog').removeClass('d-none');
} else {
window.console.log("{{$modalerrorlist}}" + ':' + data['errormsg']);
}
diff --git a/view/tpl/jot.tpl b/view/tpl/jot.tpl
index 991873daa..dbbb470c5 100755
--- a/view/tpl/jot.tpl
+++ b/view/tpl/jot.tpl
@@ -6,7 +6,7 @@
<span class="channel-id-select-desc">{{$id_seltext}}</span> {{$id_select}}
</div>
{{/if}}
- <div id="profile-jot-wrapper">
+ <div class="mb-4" id="profile-jot-wrapper">
{{if $parent}}
<input type="hidden" name="parent" value="{{$parent}}" />
{{/if}}
@@ -31,7 +31,7 @@
</div>
{{/if}}
<div id="jot-title-wrap" class="jothidden">
- <input name="title" id="jot-title" type="text" placeholder="{{$placeholdertitle}}" tabindex=1 value="{{$title}}">
+ <input name="title" id="jot-title" type="text" placeholder="{{$placeholdertitle}}" tabindex="1" value="{{$title}}">
</div>
{{if $catsenabled}}
<div id="jot-category-wrap" class="jothidden">
@@ -39,147 +39,150 @@
</div>
{{/if}}
<div id="jot-text-wrap">
- <textarea class="profile-jot-text" id="profile-jot-text" name="body" tabindex=2 placeholder="{{$share}}" ondragenter="linkdropper(event);" ondragover="linkdropper(event);" ondrop="linkdrop(event);" >{{$content}}</textarea>
+ <textarea class="profile-jot-text" id="profile-jot-text" name="body" tabindex="2" placeholder="{{$share}}" ondragenter="linkdropper(event);" ondragover="linkdropper(event);" ondrop="linkdrop(event);" >{{$content}}</textarea>
</div>
{{if $attachment}}
<div id="jot-attachment-wrap">
<input class="jot-attachment" name="attachment" id="jot-attachment" type="text" value="{{$attachment}}" readonly="readonly" onclick="this.select();">
</div>
{{/if}}
- <div id="profile-jot-submit-wrapper" class="jothidden">
- <div id="profile-jot-submit-left" class="btn-toolbar pull-left">
+ <div id="profile-jot-submit-wrapper" class="clearfix p-2 jothidden">
+ <div id="profile-jot-submit-left" class="btn-toolbar float-left">
{{if $bbcode}}
- <div class="btn-group">
- <button id="main-editor-bold" class="btn btn-default btn-sm" title="{{$bold}}" onclick="inserteditortag('b', 'profile-jot-text'); return false;">
+ <div class="btn-group mr-2">
+ <button id="main-editor-bold" class="btn btn-outline-secondary btn-sm" title="{{$bold}}" onclick="inserteditortag('b', 'profile-jot-text'); return false;">
<i class="fa fa-bold jot-icons"></i>
</button>
- <button id="main-editor-italic" class="btn btn-default btn-sm" title="{{$italic}}" onclick="inserteditortag('i', 'profile-jot-text'); return false;">
+ <button id="main-editor-italic" class="btn btn-outline-secondary btn-sm" title="{{$italic}}" onclick="inserteditortag('i', 'profile-jot-text'); return false;">
<i class="fa fa-italic jot-icons"></i>
</button>
- <button id="main-editor-underline" class="btn btn-default btn-sm" title="{{$underline}}" onclick="inserteditortag('u', 'profile-jot-text'); return false;">
+ <button id="main-editor-underline" class="btn btn-outline-secondary btn-sm" title="{{$underline}}" onclick="inserteditortag('u', 'profile-jot-text'); return false;">
<i class="fa fa-underline jot-icons"></i>
</button>
- <button id="main-editor-quote" class="btn btn-default btn-sm" title="{{$quote}}" onclick="inserteditortag('quote', 'profile-jot-text'); return false;">
+ <button id="main-editor-quote" class="btn btn-outline-secondary btn-sm" title="{{$quote}}" onclick="inserteditortag('quote', 'profile-jot-text'); return false;">
<i class="fa fa-quote-left jot-icons"></i>
</button>
- <button id="main-editor-code" class="btn btn-default btn-sm" title="{{$code}}" onclick="inserteditortag('code', 'profile-jot-text'); return false;">
+ <button id="main-editor-code" class="btn btn-outline-secondary btn-sm" title="{{$code}}" onclick="inserteditortag('code', 'profile-jot-text'); return false;">
<i class="fa fa-terminal jot-icons"></i>
</button>
</div>
{{/if}}
{{if $visitor}}
- <div class="btn-group hidden-xs hidden-sm">
+ <div class="btn-group mr-2 d-none d-lg-flex">
{{if $writefiles}}
- <button id="wall-file-upload" class="btn btn-default btn-sm" title="{{$attach}}" >
+ <button id="wall-file-upload" class="btn btn-outline-secondary btn-sm" title="{{$attach}}" >
<i id="wall-file-upload-icon" class="fa fa-paperclip jot-icons"></i>
</button>
{{/if}}
{{if $weblink}}
- <button id="profile-link-wrapper" class="btn btn-default btn-sm" title="{{$weblink}}" ondragenter="linkdropper(event);" ondragover="linkdropper(event);" ondrop="linkdrop(event);" onclick="jotGetLink(); return false;">
+ <button id="profile-link-wrapper" class="btn btn-outline-secondary btn-sm" title="{{$weblink}}" ondragenter="linkdropper(event);" ondragover="linkdropper(event);" ondrop="linkdrop(event);" onclick="jotGetLink(); return false;">
<i id="profile-link" class="fa fa-link jot-icons"></i>
</button>
{{/if}}
{{if $embedPhotos}}
- <button id="embed-photo-wrapper" class="btn btn-default btn-sm" title="{{$embedPhotos}}" onclick="initializeEmbedPhotoDialog();return false;">
+ <button id="embed-photo-wrapper" class="btn btn-outline-secondary btn-sm" title="{{$embedPhotos}}" onclick="initializeEmbedPhotoDialog();return false;">
<i id="embed-photo" class="fa fa-file-image-o jot-icons"></i>
</button>
{{/if}}
</div>
- <div class="btn-group hidden-xs hidden-sm">
+ <div class="btn-group mr-2 d-none d-lg-flex">
{{if $setloc}}
- <button id="profile-location-wrapper" class="btn btn-default btn-sm" title="{{$setloc}}" onclick="jotGetLocation();return false;">
+ <button id="profile-location-wrapper" class="btn btn-outline-secondary btn-sm" title="{{$setloc}}" onclick="jotGetLocation();return false;">
<i id="profile-location" class="fa fa-globe jot-icons"></i>
</button>
{{/if}}
{{if $clearloc}}
- <button id="profile-nolocation-wrapper" class="btn btn-default btn-sm" title="{{$clearloc}}" onclick="jotClearLocation();return false;" disabled="disabled">
+ <button id="profile-nolocation-wrapper" class="btn btn-outline-secondary btn-sm" title="{{$clearloc}}" onclick="jotClearLocation();return false;" disabled="disabled">
<i id="profile-nolocation" class="fa fa-circle-o jot-icons"></i>
</button>
{{/if}}
{{else}}
- <div class="btn-group hidden-xs hidden-sm">
+ <div class="btn-group d-none d-lg-flex">
{{/if}}
{{if $feature_expire}}
- <button id="profile-expire-wrapper" class="btn btn-default btn-sm" title="{{$expires}}" onclick="jotGetExpiry();return false;">
+ <button id="profile-expire-wrapper" class="btn btn-outline-secondary btn-sm" title="{{$expires}}" onclick="jotGetExpiry();return false;">
<i id="profile-expires" class="fa fa-eraser jot-icons"></i>
</button>
{{/if}}
{{if $feature_future}}
- <button id="profile-future-wrapper" class="btn btn-default btn-sm" title="{{$future_txt}}" onclick="jotGetPubDate();return false;">
+ <button id="profile-future-wrapper" class="btn btn-outline-secondary btn-sm" title="{{$future_txt}}" onclick="jotGetPubDate();return false;">
<i id="profile-future" class="fa fa-clock-o jot-icons"></i>
</button>
{{/if}}
{{if $feature_encrypt}}
- <button id="profile-encrypt-wrapper" class="btn btn-default btn-sm" title="{{$encrypt}}" onclick="red_encrypt('{{$cipher}}','#profile-jot-text',$('#profile-jot-text').val());return false;">
+ <button id="profile-encrypt-wrapper" class="btn btn-outline-secondary btn-sm" title="{{$encrypt}}" onclick="red_encrypt('{{$cipher}}','#profile-jot-text',$('#profile-jot-text').val());return false;">
<i id="profile-encrypt" class="fa fa-key jot-icons"></i>
</button>
{{/if}}
{{if $feature_voting}}
- <button id="profile-voting-wrapper" class="btn btn-default btn-sm" title="{{$voting}}" onclick="toggleVoting();return false;">
+ <button id="profile-voting-wrapper" class="btn btn-outline-secondary btn-sm" title="{{$voting}}" onclick="toggleVoting();return false;">
<i id="profile-voting" class="fa fa-square-o jot-icons"></i>
</button>
{{/if}}
{{if $feature_nocomment}}
- <button id="profile-nocomment-wrapper" class="btn btn-default btn-sm" title="{{$nocommenttitle}}" onclick="toggleNoComment();return false;">
+ <button id="profile-nocomment-wrapper" class="btn btn-outline-secondary btn-sm" title="{{$nocommenttitle}}" onclick="toggleNoComment();return false;">
<i id="profile-nocomment" class="fa fa-comments jot-icons"></i>
</button>
{{/if}}
</div>
{{if $writefiles || $weblink || $setloc || $clearloc || $feature_expire || $feature_encrypt || $feature_voting}}
- <div class="btn-group visible-xs visible-sm">
- <button type="button" id="more-tools" class="btn btn-default btn-sm dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
- <i id="more-tools-icon" class="fa fa-caret-down jot-icons"></i>
+ <div class="btn-group d-lg-none">
+ <button type="button" id="more-tools" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
+ <i id="more-tools-icon" class="fa fa-cog jot-icons"></i>
</button>
- <ul class="dropdown-menu" role="menu">
+ <div class="dropdown-menu">
{{if $visitor}}
{{if $writefiles}}
- <li><a id="wall-file-upload-sub" href="#" ><i class="fa fa-paperclip"></i>&nbsp;{{$attach}}</a></li>
+ <a class="dropdown-item" id="wall-file-upload-sub" href="#" ><i class="fa fa-paperclip"></i>&nbsp;{{$attach}}</a>
{{/if}}
{{if $weblink}}
- <li><a href="#" onclick="jotGetLink(); return false;"><i class="fa fa-link"></i>&nbsp;{{$weblink}}</a></li>
+ <a class="dropdown-item" href="#" onclick="jotGetLink(); return false;"><i class="fa fa-link"></i>&nbsp;{{$weblink}}</a>
+ {{/if}}
+ {{if $embedPhotos}}
+ <a class="dropdown-item" href="#" onclick="initializeEmbedPhotoDialog(); return false;"><i class="fa fa-file-image-o jot-icons"></i>&nbsp;{{$embedPhotos}}</a>
{{/if}}
{{if $setloc}}
- <li><a href="#" onclick="jotGetLocation(); return false;"><i class="fa fa-globe"></i>&nbsp;{{$setloc}}</a></li>
+ <a class="dropdown-item" href="#" onclick="jotGetLocation(); return false;"><i class="fa fa-globe"></i>&nbsp;{{$setloc}}</a>
{{/if}}
{{if $clearloc}}
- <li><a href="#" onclick="jotClearLocation(); return false;"><i class="fa fa-circle-o"></i>&nbsp;{{$clearloc}}</a></li>
+ <a class="dropdown-item" href="#" onclick="jotClearLocation(); return false;"><i class="fa fa-circle-o"></i>&nbsp;{{$clearloc}}</a>
{{/if}}
{{/if}}
{{if $feature_expire}}
- <li><a href="#" onclick="jotGetExpiry(); return false;"><i class="fa fa-eraser"></i>&nbsp;{{$expires}}</a></li>
+ <a class="dropdown-item" href="#" onclick="jotGetExpiry(); return false;"><i class="fa fa-eraser"></i>&nbsp;{{$expires}}</a>
{{/if}}
{{if $feature_future}}
- <li><a href="#" onclick="jotGetPubDate();return false;"><i class="fa fa-clock-o"></i>&nbsp;{{$future_txt}}</a></li>
+ <a class="dropdown-item" href="#" onclick="jotGetPubDate();return false;"><i class="fa fa-clock-o"></i>&nbsp;{{$future_txt}}</a>
{{/if}}
{{if $feature_encrypt}}
- <li><a href="#" onclick="red_encrypt('{{$cipher}}','#profile-jot-text',$('#profile-jot-text').val());return false;"><i class="fa fa-key"></i>&nbsp;{{$encrypt}}</a></li>
+ <a class="dropdown-item" href="#" onclick="red_encrypt('{{$cipher}}','#profile-jot-text',$('#profile-jot-text').val());return false;"><i class="fa fa-key"></i>&nbsp;{{$encrypt}}</a>
{{/if}}
{{if $feature_voting}}
- <li><a href="#" onclick="toggleVoting(); return false;"><i id="profile-voting-sub" class="fa fa-square-o"></i>&nbsp;{{$voting}}</a></li>
+ <a class="dropdown-item" href="#" onclick="toggleVoting(); return false;"><i id="profile-voting-sub" class="fa fa-square-o"></i>&nbsp;{{$voting}}</a>
{{/if}}
{{if $feature_nocomment}}
- <li><a href="#" onclick="toggleNoComment(); return false;"><i id="profile-nocomment-sub" class="fa fa-comments"></i>&nbsp;{{$nocommenttitlesub}}</a></li>
+ <a class="dropdown-item" href="#" onclick="toggleNoComment(); return false;"><i id="profile-nocomment-sub" class="fa fa-comments"></i>&nbsp;{{$nocommenttitlesub}}</a>
{{/if}}
- </ul>
+ </div>
</div>
{{/if}}
</div>
- <div id="profile-rotator-wrapper">
+ <div id="profile-rotator-wrapper" class="float-left">
<div id="profile-rotator"></div>
</div>
- <div id="profile-jot-submit-right" class="btn-group pull-right">
+ <div id="profile-jot-submit-right" class="btn-group float-right">
{{if $preview}}
- <button class="btn btn-default btn-sm" onclick="preview_post();return false;" title="{{$preview}}">
+ <button class="btn btn-outline-secondary btn-sm" onclick="preview_post();return false;" title="{{$preview}}">
<i class="fa fa-eye jot-icons" ></i>
</button>
{{/if}}
{{if $jotnets}}
- <button id="dbtn-jotnets" class="btn btn-default btn-sm" data-toggle="modal" data-target="#jotnetsModal" type="button" title="{{$jotnets_label}}" style="{{if $lockstate == 'lock'}}display: none;{{/if}}">
+ <button id="dbtn-jotnets" class="btn btn-outline-secondary btn-sm" data-toggle="modal" data-target="#jotnetsModal" type="button" title="{{$jotnets_label}}" style="{{if $lockstate == 'lock'}}display: none;{{/if}}">
<i class="fa fa-share-alt jot-icons"></i>
</button>
{{/if}}
{{if $showacl}}
- <button id="dbtn-acl" class="btn btn-default btn-sm" data-toggle="modal" data-target="#aclModal" title="{{$permset}}" type="button" data-form_id="profile-jot-form">
+ <button id="dbtn-acl" class="btn btn-outline-secondary btn-sm" data-toggle="modal" data-target="#aclModal" title="{{$permset}}" type="button" data-form_id="profile-jot-form">
<i id="jot-perms-icon" class="fa fa-{{$lockstate}} jot-icons{{if $bang}} jot-lock-warn{{/if}}"></i>
</button>
{{/if}}
@@ -187,7 +190,7 @@
</div>
<div class="clear"></div>
{{if $jotplugins}}
- <div id="profile-jot-plugin-wrapper">
+ <div id="profile-jot-plugin-wrapper" class="mt-2">
{{$jotplugins}}
</div>
{{/if}}
@@ -196,22 +199,20 @@
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
- <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
<h4 class="modal-title" id="expiryModalLabel">{{$jotnets_label}}</h4>
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
</div>
<div class="modal-body">
{{$jotnets}}
</div>
<div class="modal-footer">
- <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
+ <button type="button" class="btn btn-outline-secondary" data-dismiss="modal">Close</button>
</div>
</div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->
</div><!-- /.modal -->
{{/if}}
</div>
- <div id="profile-jot-text-loading"></div>
- <div id="profile-jot-end" class="clear"></div>
</div>
</form>
@@ -225,8 +226,8 @@
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
- <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
<h4 class="modal-title" id="expiryModalLabel">{{$expires}}</h4>
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
</div>
<div class="modal-body form-group" style="width:90%">
<div class="date">
@@ -239,7 +240,7 @@
</script>
</div>
<div class="modal-footer">
- <button type="button" class="btn btn-default" data-dismiss="modal">{{$expiryModalCANCEL}}</button>
+ <button type="button" class="btn btn-outline-secondary" data-dismiss="modal">{{$expiryModalCANCEL}}</button>
<button id="expiry-modal-OKButton" type="button" class="btn btn-primary">{{$expiryModalOK}}</button>
</div>
</div><!-- /.modal-content -->
@@ -252,8 +253,8 @@
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
- <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
<h4 class="modal-title" id="createdModalLabel">{{$future_txt}}</h4>
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
</div>
<div class="modal-body form-group" style="width:90%">
<div class="date">
@@ -266,7 +267,7 @@
</script>
</div>
<div class="modal-footer">
- <button type="button" class="btn btn-default" data-dismiss="modal">{{$expiryModalCANCEL}}</button>
+ <button type="button" class="btn btn-outline-secondary" data-dismiss="modal">{{$expiryModalCANCEL}}</button>
<button id="created-modal-OKButton" type="button" class="btn btn-primary">{{$expiryModalOK}}</button>
</div>
</div><!-- /.modal-content -->
@@ -279,17 +280,17 @@
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
- <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
<h4 class="modal-title" id="embedPhotoModalLabel">{{$embedPhotosModalTitle}}</h4>
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
</div>
<div class="modal-body" id="embedPhotoModalBody" >
- <div id="embedPhotoModalBodyAlbumListDialog" class="hide">
+ <div id="embedPhotoModalBodyAlbumListDialog" class="d-none">
<div id="embedPhotoModalBodyAlbumList"></div>
</div>
- <div id="embedPhotoModalBodyAlbumDialog" class="hide"></div>
+ <div id="embedPhotoModalBodyAlbumDialog" class="d-none"></div>
</div>
<div class="modal-footer">
- <button type="button" class="btn btn-default" data-dismiss="modal">{{$embedPhotosModalCancel}}</button>
+ <button type="button" class="btn btn-outline-secondary" data-dismiss="modal">{{$embedPhotosModalCancel}}</button>
<button id="embed-photo-OKButton" type="button" class="btn btn-primary">{{$embedPhotosModalOK}}</button>
</div>
</div><!-- /.modal-content -->
diff --git a/view/tpl/layoutlist.tpl b/view/tpl/layoutlist.tpl
index d0b81af0c..1bbe14893 100644
--- a/view/tpl/layoutlist.tpl
+++ b/view/tpl/layoutlist.tpl
@@ -2,8 +2,8 @@
<div class="section-title-wrapper">
{{if $editor}}
<div class="pull-right">
- <button id="webpage-create-btn" class="btn btn-xs btn-success" onclick="openClose('layout-editor');"><i class="fa fa-pencil-square-o"></i>&nbsp;{{$create}}</button>
- <a href="{{$help.url}}" target="_blank" class="btn btn-xs btn-warning" title="{{$help.title}}"><i class="fa fa-info"></i>&nbsp;{{$help.text}}</a>
+ <button id="webpage-create-btn" class="btn btn-sm btn-success" onclick="openClose('layout-editor');"><i class="fa fa-pencil-square-o"></i>&nbsp;{{$create}}</button>
+ <a href="{{$help.url}}" target="_blank" class="btn btn-sm btn-warning" title="{{$help.title}}"><i class="fa fa-info"></i>&nbsp;{{$help.text}}</a>
</div>
{{/if}}
<h2>{{$title}}</h2>
@@ -24,8 +24,8 @@
<th width="1%"></th>
<th width="1%"></th>
<th width="1%"></th>
- <th width="1%" class="hidden-xs">{{$created}}</th>
- <th width="1%" class="hidden-xs">{{$edited}}</th>
+ <th width="1%" class="d-none d-md-table-cell">{{$created}}</th>
+ <th width="1%" class="d-none d-md-table-cell">{{$edited}}</th>
</tr>
{{foreach $pages as $key => $items}}
{{foreach $items as $item}}
@@ -55,10 +55,10 @@
<a href="#" title="{{$delete}}" onclick="dropItem('item/drop/{{$item.url}}', '#layout-list-item-{{$item.url}}'); return false;"><i class="fa fa-trash-o drop-icons"></i></a>
{{/if}}
</td>
- <td class="hidden-xs">
+ <td class="d-none d-md-table-cell">
{{$item.created}}
</td>
- <td class="hidden-xs">
+ <td class="d-none d-md-table-cell">
{{$item.edited}}
</td>
</tr>
diff --git a/view/tpl/like_noshare.tpl b/view/tpl/like_noshare.tpl
index 67f5868cb..e83b885fe 100755
--- a/view/tpl/like_noshare.tpl
+++ b/view/tpl/like_noshare.tpl
@@ -1,5 +1,5 @@
<div class="wall-item-like-buttons" id="wall-item-like-buttons-{{$id}}">
- <i class="fa fa-thumbs-o-up item-tool btn btn-default" title="{{$likethis}}" onclick="dolike({{$id}},'like'); return false"></i>
- <i class="fa fa-thumbs-o-down item-tool btn btn-default" title="{{$nolike}}" onclick="dolike({{$id}},'dislike'); return false"></i>
+ <i class="fa fa-thumbs-o-up item-tool btn btn-outline-secondary" title="{{$likethis}}" onclick="dolike({{$id}},'like'); return false"></i>
+ <i class="fa fa-thumbs-o-down item-tool btn btn-outline-secondary" title="{{$nolike}}" onclick="dolike({{$id}},'dislike'); return false"></i>
<div id="like-rotator-{{$id}}" class="like-rotator"></div>
</div>
diff --git a/view/tpl/locmanage.tpl b/view/tpl/locmanage.tpl
index fe2d5ec84..a8c75b6a8 100644
--- a/view/tpl/locmanage.tpl
+++ b/view/tpl/locmanage.tpl
@@ -8,7 +8,7 @@
$.post(baseurl + '/locs','drop='+id,function(data) { window.location.href=window.location.href; });
}
</script>
- <button class="btn btn-success btn-xs pull-right" onclick="window.location.href='/locs/f=&sync=1'; return false;"><i class="fa fa-refresh"></i>&nbsp;{{$sync}}</button>
+ <button class="btn btn-success btn-sm pull-right" onclick="window.location.href='/locs/f=&sync=1'; return false;"><i class="fa fa-refresh"></i>&nbsp;{{$sync}}</button>
<h2>{{$header}}</h2>
</div>
<div class="section-content-wrapper-np">
@@ -22,7 +22,7 @@
<table id="locs-index">
<tr>
<th>{{$addr}}</th>
- <th class="hidden-xs hidden-sm">{{$loc}}</th>
+ <th class="d-none d-md-table-cell">{{$loc}}</th>
<th>{{$mkprm}}</th>
<th>{{$drop}}</th>
</tr>
@@ -30,7 +30,7 @@
{{if ! $hub.deleted }}
<tr class="locs-index-row">
<td>{{$hub.hubloc_addr}}</td>
- <td class="hidden-xs hidden-sm">{{$hub.hubloc_url}}</td>
+ <td class="d-none d-md-table-cell">{{$hub.hubloc_url}}</td>
<td>{{if $hub.primary}}<i class="fa fa-check-square-o"></i>{{else}}<i class="fa fa-square-o primehub" onclick="primehub({{$hub.hubloc_id}}); return false;"></i>{{/if}}</td>
<td><i class="fa fa-trash-o drophub" onclick="drophub({{$hub.hubloc_id}}); return false;"></i></td>
</tr>
diff --git a/view/tpl/mail_conv.tpl b/view/tpl/mail_conv.tpl
index 249e13a04..759517b7f 100755
--- a/view/tpl/mail_conv.tpl
+++ b/view/tpl/mail_conv.tpl
@@ -1,47 +1,38 @@
-<div id="mail-{{$mail.id}}" class="mail-conv-outside-wrapper">
- <div class="mail-conv-sender" >
- <a href="{{$mail.from_url}}"><img class="mail-conv-sender-photo" src="{{$mail.from_photo}}" alt="{{$mail.from_name}}" /></a>
- </div>
- <div class="mail-conv-detail">
- {{if $mail.is_recalled}}<strong>{{$mail.is_recalled}}</strong>{{/if}}
- <div class="mail-conv-sender-name"><a href="{{$mail.from_url}}">{{$mail.from_name}}</a></div>
- <div class="mail-conv-date autotime wall-item-ago" title="{{$mail.date}}">{{$mail.date}}</div>
+<div id="mail-{{$mail.id}}" class="mb-2 clearfix mail-conv-outside-wrapper">
+ <div class="mb-2 clearfix wall-item-head">
+ <div class="wall-item-info" >
+ <a href="{{$mail.from_url}}"><img class="wall-item-photo" src="{{$mail.from_photo}}" alt="{{$mail.from_name}}" /></a>
+ </div>
+ <div class="mail-conv-detail">
+ {{if $mail.is_recalled}}<strong>{{$mail.is_recalled}}</strong>{{/if}}
+ <div class="wall-item-name"><a class="wall-item-name-link" href="{{$mail.from_url}}">{{$mail.from_name}}</a></div>
+ <div class="autotime wall-item-ago" title="{{$mail.date}}">{{$mail.date}}</div>
+ </div>
</div>
- <div class="clear"></div>
- <div class="mail-conv-content">
- <div class="mail-conv-body">
+ <div class="clearfix mail-conv-content">
+ <div class="clearfix mail-conv-body">
{{$mail.body}}
- <div class="clear"></div>
</div>
{{if $mail.attachments}}
- <div class="dropdown pull-left">
- <button type="button" class="btn btn-default btn-sm wall-item-like dropdown-toggle" data-toggle="dropdown" id="attachment-menu-{{$item.id}}"><i class="fa fa-paperclip"></i></button>
- <ul class="dropdown-menu" role="menu" aria-labelledby="attachment-menu-{{$item.id}}">{{$mail.attachments}}</ul>
+ <div class="dropdown float-left">
+ <button type="button" class="btn btn-outline-secondary btn-sm wall-item-like dropdown-toggle" data-toggle="dropdown" id="attachment-menu-{{$item.id}}"><i class="fa fa-fw fa-paperclip"></i></button>
+ <div class="dropdown-menu" role="menu" aria-labelledby="attachment-menu-{{$item.id}}">{{$mail.attachments}}</div>
</div>
{{/if}}
- <div class="pull-right dropdown">
- <button type="button" class="btn btn-default btn-sm dropdown-toggle" data-toggle="dropdown" id="mail-item-menu-{{$mail.id}}">
- <i class="fa fa-caret-down"></i>
+ <div class="float-right dropdown">
+ <button type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown" id="mail-item-menu-{{$mail.id}}">
+ <i class="fa fa-cog"></i>
</button>
- <ul class="dropdown-menu" role="menu" aria-labelledby="mail-item-menu-{{$mail.id}}">
+ <div class="dropdown-menu dropdown-menu-right" role="menu" aria-labelledby="mail-item-menu-{{$mail.id}}">
{{if $mail.can_recall}}
- <li>
- <a href="mail/{{$mail.mailbox}}/recall/{{$mail.id}}" title="{{$mail.recall}}" id="mail-conv-recall-icon-{{$mail.id}}"><i class="fa fa-undo mail-icons"></i>&nbsp;{{$mail.recall}}</a>
- </li>
+ <a class="dropdown-item" href="mail/{{$mail.mailbox}}/recall/{{$mail.id}}" title="{{$mail.recall}}" id="mail-conv-recall-icon-{{$mail.id}}"><i class="fa fa-fw fa-undo"></i>&nbsp;{{$mail.recall}}</a>
{{/if}}
- <li>
- <a href="#" onclick="dropItem('mail/{{$mail.mailbox}}/drop/{{$mail.id}}', '#mail-{{$mail.id}}'); return false;" title="{{$mail.delete}}" id="mail-conv-delete-icon-{{$mail.id}}"><i class="fa fa-trash-o mail-icons"></i>&nbsp;{{$mail.delete}}</a>
- </li>
+ <a class="dropdown-item" href="#" onclick="dropItem('mail/{{$mail.mailbox}}/drop/{{$mail.id}}', '#mail-{{$mail.id}}'); return false;" title="{{$mail.delete}}" id="mail-conv-delete-icon-{{$mail.id}}"><i class="fa fa-fw fa-trash-o"></i>&nbsp;{{$mail.delete}}</a>
{{if $mail.can_recall}}
- <li class="divider"></li>
- <li>
- <a href="dreport/mail/{{$mail.mid}}" title="{{$mail.dreport}}" id="mail-conv-dreport-icon-{{$mail.id}}">{{$mail.dreport}}</a>
- </li>
+ <div class="dropdown-divider"></div>
+ <a class="dropdown-item" href="dreport/mail/{{$mail.mid}}" title="{{$mail.dreport}}" id="mail-conv-dreport-icon-{{$mail.id}}">{{$mail.dreport}}</a>
{{/if}}
- </ul>
-
+ </div>
</div>
- <div class="clear"></div>
</div>
- <div class="clear"></div>
</div>
diff --git a/view/tpl/mail_display.tpl b/view/tpl/mail_display.tpl
index 748c118ef..e8549a49b 100755
--- a/view/tpl/mail_display.tpl
+++ b/view/tpl/mail_display.tpl
@@ -1,10 +1,10 @@
<div class="generic-content-wrapper">
<div class="section-title-wrapper">
<div class="pull-right">
- <button id="fullscreen-btn" type="button" class="btn btn-default btn-xs" onclick="makeFullScreen();"><i class="fa fa-expand"></i></button>
- <button id="inline-btn" type="button" class="btn btn-default btn-xs" onclick="makeFullScreen(false);"><i class="fa fa-compress"></i></button>
+ <button id="fullscreen-btn" type="button" class="btn btn-outline-secondary btn-sm" onclick="makeFullScreen();"><i class="fa fa-expand"></i></button>
+ <button id="inline-btn" type="button" class="btn btn-outline-secondary btn-sm" onclick="makeFullScreen(false);"><i class="fa fa-compress"></i></button>
{{if $mailbox == 'combined'}}
- <a class="btn btn-xs btn-danger" href="mail/{{$mailbox}}/dropconv/{{$thread_id}}" onclick="return confirmDelete();"><i class="fa fa-trash-o"></i> {{$delete}}</a>
+ <a class="btn btn-sm btn-danger" href="mail/{{$mailbox}}/dropconv/{{$thread_id}}" onclick="return confirmDelete();"><i class="fa fa-trash-o"></i> {{$delete}}</a>
{{/if}}
</div>
<h2>{{$prvmsg_header}}</h2>
diff --git a/view/tpl/mail_head.tpl b/view/tpl/mail_head.tpl
index d52fa40e0..aac592a5f 100755
--- a/view/tpl/mail_head.tpl
+++ b/view/tpl/mail_head.tpl
@@ -1,6 +1,6 @@
<div class="widget">
<h3>{{$header}}</h3>
- <ul class="nav nav-pills nav-stacked">
+ <ul class="nav nav-pills flex-column">
{{foreach $messages as $message}}
{{include file="mail_list.tpl"}}
{{/foreach}}
diff --git a/view/tpl/mail_list.tpl b/view/tpl/mail_list.tpl
index fc9b5afa8..827c7628f 100755
--- a/view/tpl/mail_list.tpl
+++ b/view/tpl/mail_list.tpl
@@ -1,5 +1,5 @@
-<li>
- <a href="mail/{{$message.mailbox}}/{{$message.id}}" class="{{if $message.selected}}active{{/if}}">
+<li class="nav-item">
+ <a href="mail/{{$message.mailbox}}/{{$message.id}}" class="nav-link{{if $message.selected}} active{{/if}}">
<span class="{{if $message.seen}}seen{{else}}unseen{{/if}}">{{$message.subject}}</span><br>
<span class="conv-participants">{{$message.from_name}} > {{$message.to_name}}</span><br>
<span class="wall-item-ago autotime" title="{{$message.date}}">{{$message.date}}</span>
diff --git a/view/tpl/menuedit.tpl b/view/tpl/menuedit.tpl
index 28236ff15..84b16dc0b 100644
--- a/view/tpl/menuedit.tpl
+++ b/view/tpl/menuedit.tpl
@@ -3,7 +3,7 @@
<div class="section-title-wrapper">
{{if $menu_edit_link}}
<div class="pull-right">
- <a href="{{$menu_edit_link}}" title="{{$hintedit}}" class="btn btn-xs btn-success"><i class="fa fa-pencil-square-o"></i>&nbsp;{{$editcontents}}</a>
+ <a href="{{$menu_edit_link}}" title="{{$hintedit}}" class="btn btn-sm btn-success"><i class="fa fa-pencil-square-o"></i>&nbsp;{{$editcontents}}</a>
</div>
{{/if}}
<h2>{{$header}}</h2>
diff --git a/view/tpl/menulist.tpl b/view/tpl/menulist.tpl
index f38619923..e23035062 100644
--- a/view/tpl/menulist.tpl
+++ b/view/tpl/menulist.tpl
@@ -1,7 +1,7 @@
<div class="generic-content-wrapper">
<div class="section-title-wrapper">
<div class="pull-right">
- <button id="webpage-create-btn" class="btn btn-xs btn-success" onclick="openClose('menu-creator');"><i class="fa fa-pencil-square-o"></i>&nbsp;{{$hintnew}}</button>
+ <button id="webpage-create-btn" class="btn btn-sm btn-success" onclick="openClose('menu-creator');"><i class="fa fa-pencil-square-o"></i>&nbsp;{{$hintnew}}</button>
</div>
<h2>{{$title}}</h2>
<div class="clear"></div>
@@ -19,8 +19,8 @@
<th width="1%"></th>
<th width="1%"></th>
<th width="1%"></th>
- <th width="1%" class="hidden-xs">{{$created}}</th>
- <th width="1%" class="hidden-xs">{{$edited}}</th>
+ <th width="1%" class="d-none d-md-table-cell">{{$created}}</th>
+ <th width="1%" class="d-none d-md-table-cell">{{$edited}}</th>
</tr>
{{foreach $menus as $m }}
<tr id="menu-list-item-{{$m.menu_id}}">
@@ -30,8 +30,8 @@
<td class="menu-list-tool"><a href="menu/{{$m.menu_id}}{{if $sys}}?f=&sys=1{{/if}}" title="{{$hintedit}}"><i class="fa fa-pencil"></i></a></td>
<td class="menu-list-tool"><a href="rpost?attachment={{$m.element}}" title="{{$share}}"><i class="fa fa-share-square-o"></i></a></td>
<td class="menu-list-tool"><a href="#" title="{{$hintdrop}}" onclick="dropItem('menu/{{$m.menu_id}}/drop{{if $sys}}?f=&sys=1{{/if}}', '#menu-list-item-{{$m.menu_id}}'); return false;"><i class="fa fa-trash-o drop-icons"></i></a></td>
- <td class="hidden-xs">{{$m.menu_created}}</td>
- <td class="hidden-xs">{{$m.menu_edited}}</td>
+ <td class="d-none d-md-table-cell">{{$m.menu_created}}</td>
+ <td class="d-none d-md-table-cell">{{$m.menu_edited}}</td>
</tr>
{{/foreach}}
</table>
diff --git a/view/tpl/message_side.tpl b/view/tpl/message_side.tpl
index 6ea63c21e..2ac61bf76 100755
--- a/view/tpl/message_side.tpl
+++ b/view/tpl/message_side.tpl
@@ -1,9 +1,9 @@
<div class="widget">
<h3>{{$title}}</h3>
- <ul class="nav nav-pills nav-stacked">
- <li><a href="{{$combined.url}}"{{if $combined.sel}} class="active"{{/if}}>{{$combined.label}}</a></li>
- <li><a href="{{$inbox.url}}"{{if $inbox.sel}} class="active"{{/if}}>{{$inbox.label}}</a></li>
- <li><a href="{{$outbox.url}}"{{if $outbox.sel}} class="active"{{/if}}>{{$outbox.label}}</a></li>
- <li><a href="{{$new.url}}"{{if $new.sel}} class="active"{{/if}}>{{$new.label}}</a></li>
+ <ul class="nav nav-pills flex-column">
+ <li class="nav-item"><a href="{{$combined.url}}" class="nav-link{{if $combined.sel}} active{{/if}}">{{$combined.label}}</a></li>
+ <li class="nav-item"><a href="{{$inbox.url}}" class="nav-link{{if $inbox.sel}} active{{/if}}">{{$inbox.label}}</a></li>
+ <li class="nav-item"><a href="{{$outbox.url}}" class="nav-link{{if $outbox.sel}} active{{/if}}">{{$outbox.label}}</a></li>
+ <li class="nav-item"><a href="{{$new.url}}" class="nav-link{{if $new.sel}} active{{/if}}">{{$new.label}}</a></li>
</ul>
</div>
diff --git a/view/tpl/mitemedit.tpl b/view/tpl/mitemedit.tpl
index a06203244..9f696fc23 100644
--- a/view/tpl/mitemedit.tpl
+++ b/view/tpl/mitemedit.tpl
@@ -24,7 +24,7 @@
{{include file="field_checkbox.tpl" field=$newwin}}
<div class="pull-right form-group">
<div class="btn-group">
- <button id="dbtn-acl" class="btn btn-default btn-sm" data-toggle="modal" data-target="#aclModal" onclick="return false;">
+ <button id="dbtn-acl" class="btn btn-outline-secondary btn-sm" data-toggle="modal" data-target="#aclModal" onclick="return false;">
<i id="jot-perms-icon" class="fa fa-{{$lockstate}}"></i>
</button>
{{if $submit_more}}
diff --git a/view/tpl/mitemlist.tpl b/view/tpl/mitemlist.tpl
index 90388ece2..b28cdfc7e 100644
--- a/view/tpl/mitemlist.tpl
+++ b/view/tpl/mitemlist.tpl
@@ -1,7 +1,7 @@
<div class="generic-content-wrapper">
<div class="section-title-wrapper">
<div class="pull-right">
- <button id="webpage-create-btn" class="btn btn-xs btn-success" onclick="openClose('menu-element-creator');"><i class="fa fa-pencil-square-o"></i>&nbsp;{{$hintnew}}</button>
+ <button id="webpage-create-btn" class="btn btn-sm btn-success" onclick="openClose('menu-element-creator');"><i class="fa fa-pencil-square-o"></i>&nbsp;{{$hintnew}}</button>
</div>
<h2>{{$title}} {{if $menudesc}}{{$menudesc}}{{else}}{{$menuname}}{{/if}}</h2>
<div class="clear"></div>
@@ -23,7 +23,7 @@
<tr id="mitem-list-item-{{$m.mitem_id}}">
<td width="1%">{{$m.mitem_desc}}</td>
<td width="96%"><a href="{{$m.mitem_link}}">{{$m.mitem_link}}</a></td>
- <td width="1%" class="mitem-list-tool dropdown">{{if $m.allow_cid || $m.allow_gid || $m.deny_cid || $m.deny_gid}}<i class="fa fa-lock dropdown-toggle lockview" data-toggle="dropdown" onclick="lockview('menu_item',{{$m.mitem_id}});" ></i><ul id="panel-{{$m.mitem_id}}" class="lockview-panel dropdown-menu"></ul>{{/if}}</td>
+ <td width="1%" class="mitem-list-tool dropdown">{{if $m.allow_cid || $m.allow_gid || $m.deny_cid || $m.deny_gid}}<i class="fa fa-lock lockview" data-toggle="dropdown" onclick="lockview('menu_item',{{$m.mitem_id}});" ></i><ul id="panel-{{$m.mitem_id}}" class="lockview-panel dropdown-menu"></ul>{{/if}}</td>
<td width="1%" class="mitem-list-tool"><a href="mitem/{{$menu_id}}/{{$m.mitem_id}}" title="{{$hintedit}}"><i class="fa fa-pencil"></i></a></td>
<td width="1%" class="mitem-list-tool"><a href="#" title="{{$hintdrop}}" onclick="dropItem('mitem/{{$menu_id}}/{{$m.mitem_id}}/drop', '#mitem-list-item-{{$m.mitem_id}}, #pmenu-item-{{$m.mitem_id}}'); return false;"><i class="fa fa-trash-o drop-icons"></i></a></td>
</tr>
diff --git a/view/tpl/myapps.tpl b/view/tpl/myapps.tpl
index d0c741bf4..dd2a67a63 100755
--- a/view/tpl/myapps.tpl
+++ b/view/tpl/myapps.tpl
@@ -1,18 +1,17 @@
<div class="generic-content-wrapper">
- <div class="section-title-wrapper">
+ <div class="section-title-wrapper clearfix">
{{if $authed}}
{{if $create}}
- <a href="appman" class="pull-right btn btn-success btn-xs"><i class="fa fa-pencil-square-o"></i>&nbsp;{{$create}}</a>
+ <a href="appman" class="pull-right btn btn-success btn-sm"><i class="fa fa-pencil-square-o"></i>&nbsp;{{$create}}</a>
{{else}}
- <a href="apps/edit{{if $cat}}/?f=&cat={{$cat}}{{/if}}" class="pull-right btn btn-primary btn-xs">{{$manage}}</a>
+ <a href="apps/edit{{if $cat}}/?f=&cat={{$cat}}{{/if}}" class="pull-right btn btn-primary btn-sm">{{$manage}}</a>
{{/if}}
{{/if}}
<h2>{{$title}}{{if $cat}} - {{$cat}}{{/if}}</h2>
</div>
- <div class="section-content-wrapper">
+ <div class="clearfix section-content-wrapper">
{{foreach $apps as $ap}}
{{$ap}}
{{/foreach}}
- <div class="clear"></div>
</div>
</div>
diff --git a/view/tpl/nav.tpl b/view/tpl/nav.tpl
index 0581989ec..5c301b4d2 100755
--- a/view/tpl/nav.tpl
+++ b/view/tpl/nav.tpl
@@ -1,215 +1,246 @@
-<div class="container-fluid">
- <div class="navbar-header dropdown">
- <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#navbar-collapse-2">
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- </button>
+{{if $nav.login && !$userinfo}}
+<div class="d-md-none p-1">
+ <a class="btn btn-primary btn-sm text-white" href="#" title="{{$nav.loginmenu.1.3}}" id="{{$nav.loginmenu.1.4}}_collapse" data-toggle="modal" data-target="#nav-login">
+ {{$nav.loginmenu.1.1}}
+ </a>
+ {{if $nav.register}}
+ <a class="btn btn-warning btn-sm text-white" href="{{$nav.register.0}}" title="{{$nav.register.3}}" id="{{$nav.register.4}}" >
+ {{$nav.register.1}}
+ </a>
+ {{/if}}
+</div>
+{{/if}}
+{{if $userinfo}}
+<div class="dropdown usermenu">
+ <div class="fakelink" data-toggle="dropdown">
+ <img id="avatar" src="{{$userinfo.icon}}" alt="{{$userinfo.name}}">
+ <i class="fa fa-caret-down"></i>
+ </div>
+ {{if $localuser}}
+ <div class="dropdown-menu">
+ {{foreach $nav.usermenu as $usermenu}}
+ <a class="dropdown-item" href="{{$usermenu.0}}" title="{{$usermenu.3}}" role="menuitem" id="{{$usermenu.4}}">{{$usermenu.1}}</a>
+ {{/foreach}}
+ {{if $nav.manage}}
+ <a class="dropdown-item" href="{{$nav.manage.0}}" title="{{$nav.manage.3}}" role="menuitem" id="{{$nav.manage.4}}">{{$nav.manage.1}}</a>
+ {{/if}}
+ {{if $nav.channels}}
+ {{foreach $nav.channels as $chan}}
+ <a class="dropdown-item" href="manage/{{$chan.channel_id}}" title="{{$chan.channel_name}}" role="menuitem">{{$chan.channel_name}}</a>
+ {{/foreach}}
+ {{/if}}
+ {{if $nav.profiles}}
+ <a class="dropdown-item" href="{{$nav.profiles.0}}" title="{{$nav.profiles.3}}" role="menuitem" id="{{$nav.profiles.4}}">{{$nav.profiles.1}}</a>
+ {{/if}}
+ {{if $nav.settings}}
+ <div class="dropdown-divider"></div>
+ <a class="dropdown-item" href="{{$nav.settings.0}}" title="{{$nav.settings.3}}" role="menuitem" id="{{$nav.settings.4}}">{{$nav.settings.1}}</a>
+ {{/if}}
+ {{if $nav.admin}}
+ <div class="dropdown-divider"></div>
+ <a class="dropdown-item" href="{{$nav.admin.0}}" title="{{$nav.admin.3}}" role="menuitem" id="{{$nav.admin.4}}">{{$nav.admin.1}}</a>
+ {{/if}}
+ {{if $nav.logout}}
+ <div class="dropdown-divider"></div>
+ <a class="dropdown-item" href="{{$nav.logout.0}}" title="{{$nav.logout.3}}" role="menuitem" id="{{$nav.logout.4}}">{{$nav.logout.1}}</a>
+ {{/if}}
+ </div>
+ {{else}}
+ {{if $nav.rusermenu}}
+ <div class="dropdown-menu" role="menu" aria-labelledby="avatar">
+ <a class="dropdown-item" href="{{$nav.rusermenu.0}}" role="menuitem">{{$nav.rusermenu.1}}</a>
+ <a class="dropdown-item" href="{{$nav.rusermenu.2}}" role="menuitem">{{$nav.rusermenu.3}}</a>
+ </div>
+ {{/if}}
+ {{/if}}
+</div>
+{{/if}}
+<div class="navbar-toggler-right">
+ {{if $nav.help.6}}
+ <button id="context-help-btn" class="navbar-toggler border-0" type="button" onclick="contextualHelp(); return false;">
+ <i class="fa fa-question-circle"></i>
+ </button>
+ {{/if}}
+ <button id="expand-aside" type="button" class="navbar-toggler border-0" data-toggle="offcanvas" data-target="#region_1">
+ <i class="fa fa-arrow-circle-right" id="expand-aside-icon"></i>
+ </button>
+ {{if $localuser}}
+ <button id="notifications-btn" type="button" class="navbar-toggler border-0 text-white" data-toggle="collapse" data-target="#navbar-collapse-1">
+ <i class="fa fa-exclamation-circle"></i>
+ </button>
+ {{/if}}
+ <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbar-collapse-2">
+ <i class="fa fa-bars"></i>
+ </button>
+</div>
+<div class="collapse navbar-collapse" id="navbar-collapse-1">
+ <ul class="navbar-nav mr-auto">
+ {{if $nav.network}}
+ <li class="nav-item dropdown net-button" style="display: none;">
+ <a class="nav-link" href="#" title="{{$nav.network.3}}" id="{{$nav.network.4}}" data-toggle="dropdown" rel="#nav-network-menu">
+ <i class="fa fa-fw fa-th"></i>
+ <span class="badge badge-pill badge-default net-update"></span>
+ </a>
+ <div id="nav-network-menu" class="dropdown-menu" rel="network">
+ <a class="dropdown-item" id="nav-network-see-all" href="{{$nav.network.all.0}}">{{$nav.network.all.1}}</a>
+ <a class="dropdown-item" id="nav-network-mark-all"href="#" onclick="markRead('network'); return false;">{{$nav.network.mark.1}}</a>
+ {{$emptynotifications}}
+ </div>
+ </li>
+ {{/if}}
+ {{if $nav.home}}
+ <li class="nav-item dropdown home-button" style="display: none;">
+ <a class="nav-link" href="#" title="{{$nav.home.3}}" id="{{$nav.home.4}}" data-toggle="dropdown" rel="#nav-home-menu">
+ <i class="fa fa-fw fa-home"></i>
+ <span class="badge badge-pill badge-danger home-update"></span>
+ </a>
+ <div id="nav-home-menu" class="dropdown-menu" rel="home">
+ <a class="dropdown-item" id="nav-home-see-all" href="{{$nav.home.all.0}}">{{$nav.home.all.1}}</a>
+ <a class="dropdown-item" id="nav-home-mark-all" href="#" onclick="markRead('home'); return false;">{{$nav.home.mark.1}}</a>
+ {{$emptynotifications}}
+ </div>
+ </li>
+ {{/if}}
+ {{if $nav.messages}}
+ <li class="nav-item dropdown mail-button" style="display: none;">
+ <a class="nav-link" href="#" title="{{$nav.messages.3}}" id="{{$nav.messages.4}}" data-toggle="dropdown" rel="#nav-messages-menu">
+ <i class="fa fa-fw fa-envelope"></i>
+ <span class="badge badge-pill badge-danger mail-update"></span>
+ </a>
+ <div id="nav-messages-menu" class="dropdown-menu" rel="messages">
+ <a class="dropdown-item" id="nav-messages-see-all" href="{{$nav.messages.all.0}}">{{$nav.messages.all.1}}</a>
+ <a class="dropdown-item" id="nav-messages-mark-all" href="#" onclick="markRead('messages'); return false;">{{$nav.messages.mark.1}}</a>
+ {{$emptynotifications}}
+ </div>
+ </li>
+ {{/if}}
+ {{if $nav.all_events}}
+ <li class="nav-item dropdown all_events-button" style="display: none;">
+ <a class="nav-link" href="#" title="{{$nav.all_events.3}}" id="{{$nav.all_events.4}}" data-toggle="dropdown" rel="#nav-all_events-menu">
+ <i class="fa fa-fw fa-calendar"></i>
+ <span class="badge badge-pill badge-default all_events-update"></span>
+ </a>
+ <div id="nav-all_events-menu" class="dropdown-menu" rel="all_events">
+ <a class="dropdown-item" id="nav-all_events-see-all" href="{{$nav.all_events.all.0}}">{{$nav.all_events.all.1}}</a>
+ <a class="dropdown-item" id="nav-all_events-mark-all" href="#" onclick="markRead('all_events'); return false;">{{$nav.all_events.mark.1}}</a>
+ {{$emptynotifications}}
+ </div>
+ </li>
+ {{/if}}
+ {{if $nav.intros}}
+ <li class="nav-item dropdown intro-button" style="display: none;">
+ <a class="nav-link" href="{{$nav.intros.0}}" title="{{$nav.intros.3}}" id="{{$nav.intros.4}}" data-toggle="dropdown" rel="#nav-intros-menu">
+ <i class="fa fa-fw fa-users"></i>
+ <span class="badge badge-pill badge-danger intro-update"></span>
+ </a>
+ <div id="nav-intros-menu" class="dropdown-menu" rel="intros">
+ <a class="dropdown-item" id="nav-intros-see-all" href="{{$nav.intros.all.0}}">{{$nav.intros.all.1}}</a>
+ {{$emptynotifications}}
+ </div>
+ </li>
+ {{/if}}
+ {{if $nav.notifications}}
+ <li class="nav-item dropdown notify-button" style="display: none;">
+ <a class="nav-link" href="{{$nav.notifications.0}}" title="{{$nav.notifications.1}}" id="{{$nav.notifications.4}}" data-toggle="dropdown" rel="#nav-notify-menu">
+ <i class="fa fa-fw fa-exclamation"></i>
+ <span class="badge badge-pill badge-danger notify-update"></span>
+ </a>
+ <div id="nav-notify-menu" class="dropdown-menu" rel="notify">
+ <a class="dropdown-item" id="nav-notify-see-all" href="{{$nav.notifications.all.0}}">{{$nav.notifications.all.1}}</a>
+ <a class="dropdown-item" id="nav-notify-mark-all" href="#" onclick="markRead('notify'); return false;">{{$nav.notifications.mark.1}}</a>
+ {{$emptynotifications}}
+ </div>
+ </li>
+ {{/if}}
{{if $nav.login && !$userinfo}}
- <button type="button" class="navbar-toggle navbar-toggle-extra-left" title="{{$nav.loginmenu.1.3}}" id="{{$nav.loginmenu.1.4}}_collapse" data-toggle="modal" data-target="#nav-login">
- {{$nav.loginmenu.1.1}}
- </button>
+ <li class="nav-item">
+ <a class="nav-link" href="#" title="{{$nav.loginmenu.1.3}}" id="{{$nav.loginmenu.1.4}}" data-toggle="modal" data-target="#nav-login">{{$nav.loginmenu.1.1}}</a>
+ </li>
+ {{/if}}
{{if $nav.register}}
- <a href="{{$nav.register.0}}" title="{{$nav.register.3}}" id="{{$nav.register.4}}" class="navbar-toggle navbar-toggle-extra-left">
- {{$nav.register.1}}
- </a>
+ <li class="nav-item {{$nav.register.2}} d-none d-md-flex">
+ <a class="nav-link" href="{{$nav.register.0}}" title="{{$nav.register.3}}" id="{{$nav.register.4}}">{{$nav.register.1}}</a>
+ </li>
{{/if}}
+ {{if $nav.alogout}}
+ <li class="nav-item {{$nav.alogout.2}} d-none d-md-flex">
+ <a class="nav-link" href="{{$nav.alogout.0}}" title="{{$nav.alogout.3}}" id="{{$nav.alogout.4}}">{{$nav.alogout.1}}</a>
+ </li>
{{/if}}
- {{if $localuser}}
- <button id="notifications-btn" type="button" class="navbar-toggle navbar-toggle-extra" data-toggle="collapse" data-target="#navbar-collapse-1" style="color: grey;">
- <i class="fa fa-exclamation-circle"></i>
- </button>
- {{/if}}
- <button id="expand-tabs" type="button" class="navbar-toggle navbar-toggle-extra" data-toggle="collapse" data-target="#tabs-collapse-1">
- <i class="fa fa-arrow-circle-down" id="expand-tabs-icon"></i>
- </button>
- <button id="expand-aside" type="button" class="navbar-toggle navbar-toggle-extra" data-toggle="offcanvas" data-target="#region_1">
- <i class="fa fa-arrow-circle-right" id="expand-aside-icon"></i>
- </button>
+ </ul>
+
+ <div id="banner" class="navbar-text d-none d-md-flex">{{$banner}}</div>
+
+ <ul id="nav-right" class="navbar-nav ml-auto d-none d-md-flex">
+ <li class="nav-item collapse clearfix" id="nav-search">
+ <form class="form-inline" method="get" action="search" role="search">
+ <input class="form-control form-control-sm mt-1 mr-2" id="nav-search-text" type="text" value="" placeholder="&#xf002; {{$help}}" name="search" title="{{$nav.search.3}}" onclick="this.submit();" onblur="closeMenu('nav-search'); openMenu('nav-search-btn');"/>
+ </form>
+ <div id="nav-search-spinner"></div>
+ </li>
+ <li class="nav-item" id="nav-search-btn">
+ <a class="nav-link" href="#nav-search" title="{{$nav.search.3}}" onclick="openMenu('nav-search'); closeMenu('nav-search-btn'); $('#nav-search-text').focus(); return false;"><i class="fa fa-fw fa-search"></i></a>
+ </li>
{{if $nav.help.6}}
- <button id="context-help-btn" class="navbar-toggle navbar-toggle-extra" type="button" onclick="contextualHelp(); return false;">
- <i class="fa fa-question-circle"></i>
- </button>
- {{/if}}
- {{if $userinfo}}
- <div class="usermenu-head dropdown-toggle fakelink" data-toggle="dropdown">
- <img id="avatar" src="{{$userinfo.icon}}" alt="{{$userinfo.name}}">
- <span class="caret" id="usermenu-caret"></span>
+ <li class="nav-item dropdown {{$sel.help}}">
+ <a class="nav-link {{$nav.help.2}}" target="hubzilla-help" href="{{$nav.help.0}}" title="{{$nav.help.3}}" id="{{$nav.help.4}}" onclick="contextualHelp(); return false;"><i class="fa fa-fw fa-question-circle"></i></a>
+ </li>
+ {{/if}}
+ <li class="nav-item dropdown" id="app-menu">
+ <a class="nav-link" href="#" data-toggle="dropdown"><i class="fa fa-fw fa-bars"></i></a>
+ <div id="dropdown-menu" class="dropdown-menu dropdown-menu-right">
+ {{if $channel_apps.0}}
+ {{foreach $channel_apps as $channel_app}}
+ {{$channel_app}}
+ {{/foreach}}
+ <div class="dropdown-header sys-apps-toggle" onclick="$('#dropdown-menu').click(function(e) { e.stopPropagation(); }); openClose('sys_apps');">
+ {{$sysapps_toggle}}
+ </div>
+ <div id="sys_apps" style="display:none;">
+ {{/if}}
+ {{foreach $nav_apps as $nav_app}}
+ {{$nav_app}}
+ {{/foreach}}
+ {{if $channel_apps.0}}
+ </div>
+ {{/if}}
+ {{if $localuser}}
+ <div class="dropdown-divider"></div>
+ <a class="dropdown-item" href="/apps"><i class="generic-icons-nav fa fa-fw fa-plus-circle"></i>{{$addapps}}</a>
+ {{/if}}
+ </div>
+ </li>
+ </ul>
+</div>
+<div class="collapse d-md-none" id="navbar-collapse-2">
+ <div class="navbar-nav mr-auto">
+ {{if $channel_apps.0}}
+ {{foreach $channel_apps as $channel_app}}
+ {{$channel_app|replace:'dropdown-item':'nav-link'}}
+ {{/foreach}}
+ <div class="dropdown-header sys-apps-toggle" onclick="openClose('sys-apps-collapsed');">
+ {{$sysapps_toggle}}
</div>
- {{if $localuser}}
- <ul class="dropdown-menu" role="menu" aria-labelledby="avatar">
- {{foreach $nav.usermenu as $usermenu}}
- <li role="presentation"><a href="{{$usermenu.0}}" title="{{$usermenu.3}}" role="menuitem" id="{{$usermenu.4}}">{{$usermenu.1}}</a></li>
- {{/foreach}}
- {{if $nav.manage}}
- <li role="presentation"><a href="{{$nav.manage.0}}" title="{{$nav.manage.3}}" role="menuitem" id="{{$nav.manage.4}}">{{$nav.manage.1}}</a></li>
- {{/if}}
- {{if $nav.channels}}
- {{foreach $nav.channels as $chan}}
- <li role="presentation" class="nav-channel-select"><a href="manage/{{$chan.channel_id}}" title="{{$chan.channel_name}}" role="menuitem">{{$chan.channel_name}}</a></li>
- {{/foreach}}
- {{/if}}
- <li role="presentation" class="divider"></li>
- {{if $nav.profiles}}
- <li role="presentation"><a href="{{$nav.profiles.0}}" title="{{$nav.profiles.3}}" role="menuitem" id="{{$nav.profiles.4}}">{{$nav.profiles.1}}</a></li>
- {{/if}}
- {{if $nav.settings}}
- <li role="presentation"><a href="{{$nav.settings.0}}" title="{{$nav.settings.3}}" role="menuitem" id="{{$nav.settings.4}}">{{$nav.settings.1}}</a></li>
- {{/if}}
- {{if $nav.admin}}
- <li role="presentation" class="divider"></li>
- <li role="presentation"><a href="{{$nav.admin.0}}" title="{{$nav.admin.3}}" role="menuitem" id="{{$nav.admin.4}}">{{$nav.admin.1}}</a></li>
- {{/if}}
- {{if $nav.logout}}
- <li role="presentation" class="divider"></li>
- <li role="presentation"><a href="{{$nav.logout.0}}" title="{{$nav.logout.3}}" role="menuitem" id="{{$nav.logout.4}}">{{$nav.logout.1}}</a></li>
- {{/if}}
- </ul>
- {{else}}
- {{if $nav.rusermenu}}
- <ul class="dropdown-menu" role="menu" aria-labelledby="avatar">
- <li role="presentation"><a href="{{$nav.rusermenu.0}}" role="menuitem">{{$nav.rusermenu.1}}</a></li>
- <li role="presentation"><a href="{{$nav.rusermenu.2}}" role="menuitem">{{$nav.rusermenu.3}}</a></li>
- </ul>
+ <div id="sys-apps-collapsed" style="display:none;">
{{/if}}
+ {{foreach $nav_apps as $nav_app}}
+ {{$nav_app|replace:'dropdown-item':'nav-link'}}
+ {{/foreach}}
+ {{if $channel_apps.0}}
+ </div>
{{/if}}
+ {{if $localuser}}
+ <div class="dropdown-divider"></div>
+ <a class="nav-link" href="/apps"><i class="generic-icons-nav fa fa-fw fa-plus-circle"></i>{{$addapps}}</a>
{{/if}}
</div>
- <div class="collapse navbar-collapse" id="navbar-collapse-1">
- <ul class="nav navbar-nav navbar-left">
- {{if $nav.network}}
- <li class="{{$sel.network}} net-button" style="display: none;">
- <a href="#" title="{{$nav.network.3}}" id="{{$nav.network.4}}" data-toggle="dropdown" rel="#nav-network-menu">
- <i class="fa fa-fw fa-th"></i>
- <span class="net-update badge"></span>
- </a>
- <ul id="nav-network-menu" role="menu" class="dropdown-menu" rel="network">
- <li id="nav-network-see-all"><a href="{{$nav.network.all.0}}">{{$nav.network.all.1}}</a></li>
- <li id="nav-network-mark-all"><a href="#" onclick="markRead('network'); return false;">{{$nav.network.mark.1}}</a></li>
- <li class="empty">{{$emptynotifications}}</li>
- </ul>
- </li>
- {{/if}}
- {{if $nav.home}}
- <li class="{{$sel.home}} home-button" style="display: none;">
- <a class="{{$nav.home.2}}" href="#" title="{{$nav.home.3}}" id="{{$nav.home.4}}" data-toggle="dropdown" rel="#nav-home-menu">
- <i class="fa fa-fw fa-home"></i>
- <span class="home-update badge"></span>
- </a>
- <ul id="nav-home-menu" class="dropdown-menu" rel="home">
- <li id="nav-home-see-all"><a href="{{$nav.home.all.0}}">{{$nav.home.all.1}}</a></li>
- <li id="nav-home-mark-all"><a href="#" onclick="markRead('home'); return false;">{{$nav.home.mark.1}}</a></li>
- <li class="empty">{{$emptynotifications}}</li>
- </ul>
- </li>
- {{/if}}
- {{if $nav.messages}}
- <li class="{{$sel.messages}} mail-button" style="display: none;">
- <a class="{{$nav.messages.2}}" href="#" title="{{$nav.messages.3}}" id="{{$nav.messages.4}}" data-toggle="dropdown" rel="#nav-messages-menu">
- <i class="fa fa-fw fa-envelope"></i>
- <span class="mail-update badge"></span>
- </a>
- <ul id="nav-messages-menu" class="dropdown-menu" rel="messages">
- <li id="nav-messages-see-all"><a href="{{$nav.messages.all.0}}">{{$nav.messages.all.1}}</a></li>
- <li id="nav-messages-mark-all"><a href="#" onclick="markRead('messages'); return false;">{{$nav.messages.mark.1}}</a></li>
- <li class="empty">{{$emptynotifications}}</li>
- </ul>
- </li>
- {{/if}}
- {{if $nav.all_events}}
- <li class="{{$sel.all_events}} all_events-button" style="display: none;">
- <a class="{{$nav.all_events.2}}" href="#" title="{{$nav.all_events.3}}" id="{{$nav.all_events.4}}" data-toggle="dropdown" rel="#nav-all_events-menu">
- <i class="fa fa-fw fa-calendar"></i>
- <span class="all_events-update badge"></span>
- </a>
- <ul id="nav-all_events-menu" class="dropdown-menu" rel="all_events">
- <li id="nav-all_events-see-all"><a href="{{$nav.all_events.all.0}}">{{$nav.all_events.all.1}}</a></li>
- <li id="nav-all_events-mark-all"><a href="#" onclick="markRead('all_events'); return false;">{{$nav.all_events.mark.1}}</a></li>
- <li class="empty">{{$emptynotifications}}</li>
- </ul>
- </li>
- {{/if}}
- {{if $nav.intros}}
- <li class="{{$sel.intros}} intro-button" style="display: none;">
- <a class="{{$nav.intros.2}}" href="{{$nav.intros.0}}" title="{{$nav.intros.3}}" id="{{$nav.intros.4}}" data-toggle="dropdown" rel="#nav-intros-menu">
- <i class="fa fa-fw fa-users"></i>
- <span class="intro-update badge"></span>
- </a>
- <ul id="nav-intros-menu" class="dropdown-menu" rel="intros">
- <li id="nav-intros-see-all"><a href="{{$nav.intros.all.0}}">{{$nav.intros.all.1}}</a></li>
- <li class="empty">{{$emptynotifications}}</li>
- </ul>
- </li>
- {{/if}}
- {{if $nav.notifications}}
- <li class="{{$sel.notifications}} notify-button" style="display: none;">
- <a href="{{$nav.notifications.0}}" title="{{$nav.notifications.1}}" id="{{$nav.notifications.4}}" data-toggle="dropdown" rel="#nav-notify-menu">
- <i class="fa fa-fw fa-exclamation"></i>
- <span class="notify-update badge"></span>
- </a>
- <ul id="nav-notify-menu" class="dropdown-menu" rel="notify">
- <li id="nav-notify-see-all"><a href="{{$nav.notifications.all.0}}">{{$nav.notifications.all.1}}</a></li>
- <li id="nav-notify-mark-all"><a href="#" onclick="markRead('notify'); return false;">{{$nav.notifications.mark.1}}</a></li>
- <li class="empty">{{$emptynotifications}}</li>
- </ul>
- </li>
- {{/if}}
- {{if $nav.login && !$userinfo}}
- <li class="">
- <a href="#" title="{{$nav.loginmenu.1.3}}" id="{{$nav.loginmenu.1.4}}" data-toggle="modal" data-target="#nav-login">{{$nav.loginmenu.1.1}}</a>
- </li>
- {{/if}}
- {{if $nav.register}}
- <li class="{{$nav.register.2}} hidden-xs"><a href="{{$nav.register.0}}" title="{{$nav.register.3}}" id="{{$nav.register.4}}">{{$nav.register.1}}</a></li>
- {{/if}}
- {{if $nav.alogout}}
- <li class="{{$nav}}-alogout.2 hidden-xs"><a href="{{$nav.alogout.0}}" title="{{$nav.alogout.3}}" id="{{$nav.alogout.4}}">{{$nav.alogout.1}}</a></li>
- {{/if}}
- </ul>
- <ul class="nav navbar-nav navbar-right hidden-xs">
- <li class="">
- <form method="get" action="search" role="search">
- <div id="nav-search-spinner"></div><input class="fa-search" id="nav-search-text" type="text" value="" placeholder="&#xf002; {{$help}}" name="search" title="{{$nav.search.3}}" onclick="this.submit();"/>
- </form>
- </li>
- {{if $nav.help.6}}
- <li class="{{$sel.help}}">
- <a class="{{$nav.help.2}}" target="hubzilla-help" href="{{$nav.help.0}}" title="{{$nav.help.3}}" id="{{$nav.help.4}}" onclick="contextualHelp(); return false;"><i class="fa fa-question-circle"></i></a>
- </li>
- {{/if}}
- <li class="">
- <a href="#" data-toggle="dropdown"><i class="fa fa-bars"></i></a>
- <ul class="dropdown-menu">
- {{foreach $navapps as $navapp}}
- {{$navapp}}
- {{/foreach}}
- {{if $localuser}}
- <li class="divider"></li>
- <li><a href="/apps"><i class="generic-icons-nav fa fa-fw fa-plus-circle"></i>{{$addapps}}</a></li>
- {{/if}}
- </ul>
- </li>
- </ul>
- </div>
- <div class="collapse navbar-collapse" id="navbar-collapse-2">
- <ul class="nav navbar-nav navbar-left hidden-sm hidden-md hidden-lg">
- {{foreach $navapps as $navapp}}
- {{$navapp}}
- {{/foreach}}
- {{if $localuser}}
- <li class="divider"></li>
- <li><a href="/apps"><i class="generic-icons-nav fa fa-fw fa-plus-circle"></i>{{$addapps}}</a></li>
- {{/if}}
- </ul>
- </div>
-
- {{if $nav.help.6}}
- <div id="contextual-help-content" class="contextual-help-content">
- {{$nav.help.5}}
- <div class="pull-right">
- <a class="btn btn-primary btn-xs" target="hubzilla-help" href="{{$nav.help.0}}" title="{{$nav.help.3}}"><i class="fa fa-fw fa-question"></i>&nbsp;{{$fulldocs}}</a>
- <a class="contextual-help-tool" href="#" onclick="contextualHelp(); return false;"><i class="fa fa-fw fa-times"></i></a>
- </div>
+</div>
+{{if $nav.help.6}}
+<div id="contextual-help-content" class="contextual-help-content">
+ {{$nav.help.5}}
+ <div class="float-right">
+ <a class="btn btn-primary btn-sm" target="hubzilla-help" href="{{$nav.help.0}}" title="{{$nav.help.3}}"><i class="fa fa-question"></i>&nbsp;{{$fulldocs}}</a>
+ <a class="contextual-help-tool" href="#" onclick="contextualHelp(); return false;"><i class="fa fa-times"></i></a>
</div>
- {{/if}}
</div>
+{{/if}}
diff --git a/view/tpl/nav_login.tpl b/view/tpl/nav_login.tpl
index 8f106b41c..b361b1a14 100644
--- a/view/tpl/nav_login.tpl
+++ b/view/tpl/nav_login.tpl
@@ -3,8 +3,8 @@
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
+ <h4 class="modal-title">{{$nav.loginmenu.1.1}}</h4>
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
- <h3 class="modal-title">{{$nav.loginmenu.1.1}}</h3>
</div>
<div class="modal-body">
<div class="form-group">
diff --git a/view/tpl/notifications.tpl b/view/tpl/notifications.tpl
index 0b24da7c3..53ff8de52 100755
--- a/view/tpl/notifications.tpl
+++ b/view/tpl/notifications.tpl
@@ -1,11 +1,11 @@
-<div class="generic-content-wrapper-styled">
-
-<h1>{{$notif_header}}</h1>
-
-{{if $notifications_available}}
-<a href="#" onclick="markRead('notify'); setTimeout(function() { window.location.href=window.location.href; },1500); return false;">{{$notif_link_mark_seen}}</a>
-{{/if}}
-<div class="notif-network-wrapper">
- {{$notif_content}}
-</div>
+<div class="generic-content-wrapper">
+ <div class="section-title-wrapper clearfix">
+ {{if $notifications_available}}
+ <a href="#" class="btn btn-outline-secondary btn-sm float-right" onclick="markRead('notify'); setTimeout(function() { window.location.href=window.location.href; },1500); return false;">{{$notif_link_mark_seen}}</a>
+ {{/if}}
+ <h2>{{$notif_header}}</h2>
+ </div>
+ <div class="section-content-wrapper">
+ {{$notif_content}}
+ </div>
</div>
diff --git a/view/tpl/notify.tpl b/view/tpl/notify.tpl
index d3c79be82..ae6e160b1 100755
--- a/view/tpl/notify.tpl
+++ b/view/tpl/notify.tpl
@@ -1,3 +1,3 @@
-<div class="notif-item">
- <a href="{{$item_link}}"><img src="{{$item_image}}" class="notif-image">{{$item_text}} <span class="notif-when">{{$item_when}}</span></a>
+<div class="mb-2 notif-item">
+ <a href="{{$item_link}}"><img src="{{$item_image}}" class="menu-img-1">{{$item_text}} <span class="notif-when">{{$item_when}}</span></a>
</div>
diff --git a/view/tpl/nwiki_page_history.tpl b/view/tpl/nwiki_page_history.tpl
index d99f83863..b1c6c9284 100644
--- a/view/tpl/nwiki_page_history.tpl
+++ b/view/tpl/nwiki_page_history.tpl
@@ -39,17 +39,17 @@
background:rgb(224,255,224);
}
</style>
-<table class="table-striped table-responsive table-hover" style="width: 100%;">
+<table class="" style="width: 100%;">
{{foreach $pageHistory as $commit}}
- <tr><td>
- <table id="rev-{{$commit.revision}}" onclick="$('#details-{{$commit.revision}}').show()" width="100%">
+ <tr class="wikis-index-row"><td>
+ <table id="rev-{{$commit.revision}}" onclick="$('#details-{{$commit.revision}}').show()" style="width: 100%;">
<tr><td width="10%">Date</td><td width="70%">{{$commit.date}}</td>
<td rowspan="3" width="20%" align="right">
{{if $permsWrite}}
- <button id="revert-{{$commit.revision}}" class="btn btn-danger btn-xs" onclick="wiki_revert_page('{{$commit.revision}}')">Revert</button>
+ <button id="revert-{{$commit.revision}}" class="btn btn-danger btn-sm" onclick="wiki_revert_page('{{$commit.revision}}')">Revert</button>
<br><br>
{{/if}}
- <button id="compare-{{$commit.revision}}" class="btn btn-warning btn-xs" onclick="wiki_compare_page('{{$commit.revision}}')">Compare</button>
+ <button id="compare-{{$commit.revision}}" class="btn btn-warning btn-sm" onclick="wiki_compare_page('{{$commit.revision}}')">Compare</button>
</td></tr>
<tr><td>{{$name_lbl}}</td><td>{{$commit.name}}</td></tr>
<tr><td>{{$msg_label}}</td><td>{{$commit.title}}</td></tr>
diff --git a/view/tpl/page_display_empty.tpl b/view/tpl/page_display_empty.tpl
new file mode 100644
index 000000000..9f000dee8
--- /dev/null
+++ b/view/tpl/page_display_empty.tpl
@@ -0,0 +1 @@
+{{$body}} \ No newline at end of file
diff --git a/view/tpl/peoplefind.tpl b/view/tpl/peoplefind.tpl
index 8318f050d..2ecfbaff9 100755
--- a/view/tpl/peoplefind.tpl
+++ b/view/tpl/peoplefind.tpl
@@ -2,16 +2,16 @@
<h3>{{$findpeople}}</h3>
<form action="directory" method="post" />
<div class="input-group form-group">
- <input class="form-control input-sm" type="text" name="search" title="{{$hint}}{{if $advanced_search}}{{$advanced_hint}}{{/if}}" placeholder="{{$desc}}" />
+ <input class="form-control form-control-sm" type="text" name="search" title="{{$hint}}{{if $advanced_search}}{{$advanced_hint}}{{/if}}" placeholder="{{$desc}}" />
<div class="input-group-btn">
- <button class="btn btn-default btn-sm" type="submit" name="submit"><i class="fa fa-fw fa-search"></i></button>
+ <button class="btn btn-outline-secondary" type="submit" name="submit"><i class="fa fa-fw fa-search"></i></button>
</div>
</div>
</form>
- <ul class="nav nav-pills nav-stacked">
- {{if $similar}}<li><a href="match" >{{$similar}}</a></li>{{/if}}
- {{if $loggedin}}<li><a href="directory?suggest=1" >{{$suggest}}</a></li>{{/if}}
- <li><a href="randprof" >{{$random}}</a></li>
- {{if $loggedin}}{{if $inv}}<li><a href="invite" >{{$inv}}</a></li>{{/if}}{{/if}}
+ <ul class="nav nav-pills flex-column">
+ {{if $similar}}<li class="nav-item"><a class="nav-link" href="match" >{{$similar}}</a></li>{{/if}}
+ {{if $loggedin}}<li class="nav-item"><a class="nav-link" href="directory?suggest=1" >{{$suggest}}</a></li>{{/if}}
+ <li class="nav-item"><a class="nav-link" href="randprof" >{{$random}}</a></li>
+ {{if $loggedin}}{{if $inv}}<li class="nav-item"><a class="nav-link" href="invite" >{{$inv}}</a></li>{{/if}}{{/if}}
</ul>
</div>
diff --git a/view/tpl/photo_album.tpl b/view/tpl/photo_album.tpl
index 6289f5321..8bacb1575 100755
--- a/view/tpl/photo_album.tpl
+++ b/view/tpl/photo_album.tpl
@@ -2,14 +2,14 @@
<div class="section-title-wrapper">
<div class="pull-right">
{{if $order}}
- <a class="btn btn-default btn-xs" href="{{$order.1}}" title="{{$order.0}}"><i class="fa fa-sort"></i></a>
+ <a class="btn btn-outline-secondary btn-sm" href="{{$order.1}}" title="{{$order.0}}"><i class="fa fa-sort"></i></a>
{{/if}}
<div class="btn-group btn-group">
{{if $album_edit.1}}
- <i class="fa fa-pencil btn btn-default btn-xs" title="{{$album_edit.0}}" onclick="openClose('photo-album-edit-wrapper'); closeMenu('photo-upload-form');"></i>
+ <i class="fa fa-pencil btn btn-outline-secondary btn-sm" title="{{$album_edit.0}}" onclick="openClose('photo-album-edit-wrapper'); closeMenu('photo-upload-form');"></i>
{{/if}}
{{if $can_post}}
- <button class="btn btn-xs btn-success btn-xs" title="{{$usage}}" onclick="openClose('photo-upload-form'); closeMenu('photo-album-edit-wrapper');"><i class="fa fa-arrow-circle-o-up"></i>&nbsp;{{$upload.0}}</button>
+ <button class="btn btn-sm btn-success btn-sm" title="{{$usage}}" onclick="openClose('photo-upload-form'); closeMenu('photo-album-edit-wrapper');"><i class="fa fa-arrow-circle-o-up"></i>&nbsp;{{$upload.0}}</button>
{{/if}}
</div>
</div>
diff --git a/view/tpl/photo_albums.tpl b/view/tpl/photo_albums.tpl
index de1105bbc..a238e61bc 100755
--- a/view/tpl/photo_albums.tpl
+++ b/view/tpl/photo_albums.tpl
@@ -1,11 +1,11 @@
<div id="side-bar-photos-albums" class="widget">
<h3>{{$title}}</h3>
- <ul class="nav nav-pills nav-stacked">
- <li><a href="{{$baseurl}}/photos/{{$nick}}" title="{{$title}}" >Recent Photos</a></li>
+ <ul class="nav nav-pills flex-column">
+ <li class="nav-item"><a class="nav-link" href="{{$baseurl}}/photos/{{$nick}}" title="{{$title}}" >{{$recent}}</a></li>
{{if $albums}}
{{foreach $albums as $al}}
- {{if $al.text}}
- <li><a href="{{$baseurl}}/photos/{{$nick}}/album/{{$al.bin2hex}}"><span class="badge pull-right">{{$al.total}}</span>{{$al.text}}</a></li>
+ {{if $al.shorttext}}
+ <li class="nav-item"><a class="nav-link" href="{{$baseurl}}/photos/{{$nick}}/album/{{$al.bin2hex}}"><span class="badge badge-default float-right">{{$al.total}}</span>{{$al.shorttext}}</a></li>
{{/if}}
{{/foreach}}
{{/if}}
diff --git a/view/tpl/photo_drop.tpl b/view/tpl/photo_drop.tpl
index 9c0a65d1c..664e5338c 100755
--- a/view/tpl/photo_drop.tpl
+++ b/view/tpl/photo_drop.tpl
@@ -1,3 +1,3 @@
<div class="wall-item-delete-wrapper" id="wall-item-delete-wrapper-{{$id}}" >
- <a class="btn btn-default btn-sm" href="#" onclick="dropItem('item/drop/{{$id}}', '#wall-item-outside-wrapper-{{$id}}'); return false;" title="{{$delete}}" ><i class="fa fa-trash-o"></i></a>
+ <a class="btn btn-outline-secondary btn-sm" href="#" onclick="dropItem('item/drop/{{$id}}', '#wall-item-outside-wrapper-{{$id}}'); return false;" title="{{$delete}}" ><i class="fa fa-trash-o"></i></a>
</div>
diff --git a/view/tpl/photo_view.tpl b/view/tpl/photo_view.tpl
index 967abea71..2431329ec 100755
--- a/view/tpl/photo_view.tpl
+++ b/view/tpl/photo_view.tpl
@@ -4,44 +4,36 @@
<div class="pull-right">
{{if $tools || $map || $edit}}
<div class="btn-group">
- <button type="button" class="btn btn-default btn-xs dropdown-toggle" data-toggle="dropdown">
- <i class="fa fa-caret-down"></i>&nbsp;{{$tools_label}}
+ <button type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown">
+ <i class="fa fa-cog"></i>&nbsp;{{$tools_label}}
</button>
- <ul class="dropdown-menu dropdown-menu-right">
+ <div class="dropdown-menu dropdown-menu-right flex-column">
{{if $tools}}
- <li class="nav-item">
- <a class="nav-link" href="{{$tools.profile.0}}"><i class="fa fa-user"></i>&nbsp;{{$tools.profile.1}}</a>
- </li>
- <li class="nav-item">
- <a class="nav-link" href="{{$tools.cover.0}}"><i class="fa fa-picture-o"></i>&nbsp;{{$tools.cover.1}}</a>
- </li>
+ <a class="dropdown-item" href="{{$tools.profile.0}}"><i class="fa fa-user"></i>&nbsp;{{$tools.profile.1}}</a>
+ <a class="dropdown-item" href="{{$tools.cover.0}}"><i class="fa fa-picture-o"></i>&nbsp;{{$tools.cover.1}}</a>
{{/if}}
{{if $map}}
- <li class="nav-item">
- <a class="nav-link" href="#" onclick="var pos = $('#photo-map').css('position'); if(pos === 'absolute') { $('#photo-map').css( { position: 'relative', left: 'auto', top: 'auto' }); } else { $('#photo-map').css( { position: 'absolute', left: '-9999px', top: '-9999px' }); } return false; " ><i class="fa fa-globe"></i>&nbsp;{{$map_text}}</a>
- </li>
+ <a class="dropdown-item" href="#" onclick="var pos = $('#photo-map').css('position'); if(pos === 'absolute') { $('#photo-map').css( { position: 'relative', left: 'auto', top: 'auto' }); } else { $('#photo-map').css( { position: 'absolute', left: '-9999px', top: '-9999px' }); } return false; " ><i class="fa fa-globe"></i>&nbsp;{{$map_text}}</a>
{{/if}}
{{if $edit}}
- <li class="nav-item">
- <a class="nav-link acl-form-trigger" href="#" title="" onclick="openClose('photo-edit'); return false;" data-form_id="photo_edit_form"><i class="fa fa-pencil"></i>&nbsp;{{$edit.edit}}</a>
- </li>
+ <a class="dropdown-item acl-form-trigger" href="#" title="" onclick="openClose('photo-edit'); return false;" data-form_id="photo_edit_form"><i class="fa fa-pencil"></i>&nbsp;{{$edit.edit}}</a>
{{/if}}
- </ul>
+ </div>
</div>
{{/if}}
{{if $lock}}
<div class="btn-group">
- <button id="lockview" class="btn btn-default btn-xs dropdown-toggle" data-toggle="dropdown" title="{{$lock}}" onclick="lockview('photo',{{$id}});" ><i class="fa fa-lock"></i></button>
+ <button id="lockview" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown" title="{{$lock}}" onclick="lockview('photo',{{$id}});" ><i class="fa fa-lock"></i></button>
<ul id="panel-{{$id}}" class="lockview-panel dropdown-menu dropdown-menu-right"></ul>
</div>
{{/if}}
{{if $prevlink || $nextlink}}
<div class="btn-group">
{{if $prevlink}}
- <a href="{{$prevlink.0}}" class="btn btn-default btn-xs" title="{{$prevlink.1}}"><i class="fa fa-backward"></i></a>
+ <a href="{{$prevlink.0}}" class="btn btn-outline-secondary btn-sm" title="{{$prevlink.1}}"><i class="fa fa-backward"></i></a>
{{/if}}
{{if $nextlink}}
- <a href="{{$nextlink.0}}" class="btn btn-default btn-xs" title="{{$nextlink.1}}"><i class="fa fa-forward"></i></a>
+ <a href="{{$nextlink.0}}" class="btn btn-outline-secondary btn-sm" title="{{$nextlink.1}}"><i class="fa fa-forward"></i></a>
{{/if}}
</div>
{{/if}}
@@ -96,7 +88,7 @@
</div>
<div class="form-group btn-group pull-right">
{{if $edit.aclselect}}
- <button id="dbtn-acl" class="btn btn-default btn-sm" data-toggle="modal" data-target="#aclModal" onclick="return false;">
+ <button id="dbtn-acl" class="btn btn-outline-secondary btn-sm" data-toggle="modal" data-target="#aclModal" onclick="return false;">
<i id="jot-perms-icon" class="fa fa-{{$edit.lockstate}}"></i>
</button>
{{/if}}
@@ -124,7 +116,7 @@
{{foreach $responses as $verb=>$response}}
{{if $response.count}}
<div class="btn-group">
- <button type="button" class="btn btn-default btn-sm wall-item-like dropdown-toggle" data-toggle="dropdown" id="wall-item-{{$verb}}-{{$id}}">{{$response.count}} {{$response.button}}</button>
+ <button type="button" class="btn btn-outline-secondary btn-sm wall-item-like dropdown-toggle" data-toggle="dropdown" id="wall-item-{{$verb}}-{{$id}}">{{$response.count}} {{$response.button}}</button>
{{if $response.list_part}}
<ul class="dropdown-menu" role="menu" aria-labelledby="wall-item-{{$verb}}-{{$id}}">{{foreach $response.list_part as $liker}}<li role="presentation">{{$liker}}</li>{{/foreach}}</ul>
{{else}}
@@ -142,7 +134,7 @@
<ul>{{foreach $response.list as $liker}}<li role="presentation">{{$liker}}</li>{{/foreach}}</ul>
</div>
<div class="modal-footer clear">
- <button type="button" class="btn btn-default" data-dismiss="modal">{{$modal_dismiss}}</button>
+ <button type="button" class="btn btn-outline-secondary" data-dismiss="modal">{{$modal_dismiss}}</button>
</div>
</div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->
@@ -156,10 +148,10 @@
{{/if}}
{{if $likebuttons}}
<div class="photo-item-tools-right btn-group pull-right">
- <button type="button" class="btn btn-default btn-sm" onclick="dolike({{$likebuttons.id}},'like'); return false">
+ <button type="button" class="btn btn-outline-secondary btn-sm" onclick="dolike({{$likebuttons.id}},'like'); return false">
<i class="fa fa-thumbs-o-up" title="{{$likebuttons.likethis}}"></i>
</button>
- <button type="button" class="btn btn-default btn-sm" onclick="dolike({{$likebuttons.id}},'dislike'); return false">
+ <button type="button" class="btn btn-outline-secondary btn-sm" onclick="dolike({{$likebuttons.id}},'dislike'); return false">
<i class="fa fa-thumbs-o-down" title="{{$likebuttons.nolike}}"></i>
</button>
</div>
diff --git a/view/tpl/photos_recent.tpl b/view/tpl/photos_recent.tpl
index 92e70692f..8fe631ca6 100755
--- a/view/tpl/photos_recent.tpl
+++ b/view/tpl/photos_recent.tpl
@@ -2,7 +2,7 @@
<div class="section-title-wrapper">
<div class="pull-right">
{{if $can_post}}
- <button class="btn btn-xs btn-success acl-form-trigger" title="{{$usage}}" onclick="openClose('photo-upload-form');" data-form_id="photos-upload-form"><i class="fa fa-arrow-circle-o-up"></i>&nbsp;{{$upload.0}}</button>
+ <button class="btn btn-sm btn-success acl-form-trigger" title="{{$usage}}" onclick="openClose('photo-upload-form');" data-form_id="photos-upload-form"><i class="fa fa-arrow-circle-o-up"></i>&nbsp;{{$upload.0}}</button>
{{/if}}
</div>
<h2>{{$title}}</h2>
diff --git a/view/tpl/photos_upload.tpl b/view/tpl/photos_upload.tpl
index 90cd0e84a..d52bad5a2 100755
--- a/view/tpl/photos_upload.tpl
+++ b/view/tpl/photos_upload.tpl
@@ -26,7 +26,7 @@
<div class="pull-right btn-group">
<div class="btn-group">
{{if $lockstate}}
- <button id="dbtn-acl" class="btn btn-default btn-sm" data-toggle="modal" data-target="#aclModal" onclick="return false;">
+ <button id="dbtn-acl" class="btn btn-outline-secondary btn-sm" data-toggle="modal" data-target="#aclModal" onclick="return false;">
<i id="jot-perms-icon" class="fa fa-{{$lockstate}}"></i>
</button>
{{/if}}
@@ -45,7 +45,7 @@
</div>
<div id="photos-upload-perms" class="btn-group pull-right">
{{if $lockstate}}
- <button class="btn btn-default btn-sm" data-toggle="modal" data-target="#aclModal" onclick="return false;">
+ <button class="btn btn-outline-secondary btn-sm" data-toggle="modal" data-target="#aclModal" onclick="return false;">
<i id="jot-perms-icon" class="fa fa-{{$lockstate}}"></i>
</button>
{{/if}}
diff --git a/view/tpl/posted_date_widget.tpl b/view/tpl/posted_date_widget.tpl
index 8b442e4b9..fb43c744b 100755
--- a/view/tpl/posted_date_widget.tpl
+++ b/view/tpl/posted_date_widget.tpl
@@ -3,12 +3,12 @@
function toggle_posted_date_button() {
if($('#posted-date-dropdown').is(':visible')) {
$('#posted-date-icon').removeClass('fa-caret-up');
- $('#posted-date-icon').addClass('fa-caret-down');
+ $('#posted-date-icon').addClass('fa-cog');
$('#posted-date-dropdown').hide();
}
else {
$('#posted-date-icon').addClass('fa-caret-up');
- $('#posted-date-icon').removeClass('fa-caret-down');
+ $('#posted-date-icon').removeClass('fa-cog');
$('#posted-date-dropdown').show();
}
}
@@ -18,21 +18,21 @@ function toggle_posted_date_button() {
<div id="datebrowse-sidebar" class="widget">
<h3>{{$title}}</h3>
<script>function dateSubmit(dateurl) { window.location.href = dateurl; } </script>
- <ul id="posted-date-selector" class="nav nav-pills nav-stacked">
+ <ul id="posted-date-selector" class="nav nav-pills flex-column">
{{foreach $dates as $y => $arr}}
{{if $y == $cutoff_year}}
</ul>
<div id="posted-date-dropdown" style="display: none;">
- <ul id="posted-date-selector-drop" class="nav nav-pills nav-stacked">
+ <ul id="posted-date-selector-drop" class="nav nav-pills flex-column">
{{/if}}
- <li id="posted-date-selector-year-{{$y}}">
- <a href="#" onclick="openClose('posted-date-selector-{{$y}}'); return false;">{{$y}}</a>
+ <li class="nav-item" id="posted-date-selector-year-{{$y}}">
+ <a class="nav-link" href="#" onclick="openClose('posted-date-selector-{{$y}}'); return false;">{{$y}}</a>
</li>
<div id="posted-date-selector-{{$y}}" style="display: none;">
- <ul class="posted-date-selector-months nav nav-pills nav-stacked">
+ <ul class="posted-date-selector-months nav nav-pills flex-column">
{{foreach $arr as $d}}
- <li>
- <a href="#" onclick="dateSubmit('{{$url}}?f=&dend={{$d.1}}{{if $showend}}&dbegin={{$d.2}}{{/if}}'); return false;">{{$d.0}}</a>
+ <li class="nav-item">
+ <a class="nav-link" href="#" onclick="dateSubmit('{{$url}}?f=&dend={{$d.1}}{{if $showend}}&dbegin={{$d.2}}{{/if}}'); return false;">{{$d.0}}</a>
</li>
{{/foreach}}
</ul>
@@ -40,7 +40,7 @@ function toggle_posted_date_button() {
{{/foreach}}
{{if $cutoff}}
</div>
- <button class="btn btn-default btn-sm" onclick="toggle_posted_date_button(); return false;"><i id="posted-date-icon" class="fa fa-caret-down"></i></button>
+ <button class="btn btn-outline-secondary btn-sm" onclick="toggle_posted_date_button(); return false;"><i id="posted-date-icon" class="fa fa-cog"></i></button>
{{/if}}
</ul>
</div>
diff --git a/view/tpl/profile_advanced.tpl b/view/tpl/profile_advanced.tpl
index 4000f39d6..c56062459 100755
--- a/view/tpl/profile_advanced.tpl
+++ b/view/tpl/profile_advanced.tpl
@@ -1,9 +1,9 @@
<div id="profile-content-wrapper" class="generic-content-wrapper">
<div class="section-title-wrapper">
- <div class="pull-right">
+ <div class="float-right">
{{if $profile.like_count}}
<div class="btn-group">
- <button type="button" class="btn btn-default btn-xs dropdown-toggle" data-toggle="dropdown" id="profile-like">{{$profile.like_count}} {{$profile.like_button_label}}</button>
+ <button type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown" id="profile-like">{{$profile.like_count}} {{$profile.like_button_label}}</button>
{{if $profile.likers}}
<ul class="dropdown-menu dropdown-menu-right" role="menu" aria-labelledby="profile-like">{{foreach $profile.likers as $liker}}<li role="presentation"><a href="{{$liker.url}}"><img class="dropdown-menu-img-xs" src="{{$liker.photo}}" alt="{{$liker.name}}" /> {{$liker.name}}</a></li>{{/foreach}}</ul>
{{/if}}
@@ -11,32 +11,32 @@
{{/if}}
{{if $profile.canlike}}
<div class="btn-group">
- <button type="button" class="btn btn-success btn-xs" onclick="doprofilelike('profile/' + '{{$profile.profile_guid}}','like'); return false;" title="{{$profile.likethis}}" >
+ <button type="button" class="btn btn-success btn-sm" onclick="doprofilelike('profile/' + '{{$profile.profile_guid}}','like'); return false;" title="{{$profile.likethis}}" >
<i class="fa fa-thumbs-o-up" title="{{$profile.likethis}}"></i>
</button>
</div>
{{/if}}
{{if $editmenu.multi}}
<div class="btn-group">
- <a class="btn btn-primary btn-xs dropdown-toggle" data-toggle="dropdown" href="#" ><i class="fa fa-pencil"></i>&nbsp;{{$editmenu.edit.3}}</a>
- <ul class="dropdown-menu dropdown-menu-right" role="menu">
+ <a class="btn btn-primary btn-sm dropdown-toggle" data-toggle="dropdown" href="#" ><i class="fa fa-pencil"></i>&nbsp;{{$editmenu.edit.3}}</a>
+ <div class="dropdown-menu dropdown-menu-right">
{{foreach $editmenu.menu.entries as $e}}
- <li>
- <a href="profiles/{{$e.id}}"><img class="dropdown-menu-img-xs" src='{{$e.photo}}'>{{$e.profile_name}}<div class='clear'></div></a>
- </li>
+ <a class="dropdown-item" href="profiles/{{$e.id}}"><img class="dropdown-menu-img-xs" src='{{$e.photo}}'> {{$e.profile_name}}</a>
{{/foreach}}
- <li><a href="profile_photo" >{{$editmenu.menu.chg_photo}}</a></li>
- {{if $editmenu.menu.cr_new}}<li><a href="profiles/new" id="profile-listing-new-link">{{$editmenu.menu.cr_new}}</a></li>{{/if}}
- </ul>
+ <a class="dropdown-item" href="profile_photo" >{{$editmenu.menu.chg_photo}}</a>
+ {{if $editmenu.menu.cr_new}}
+ <a class="dropdown-item" href="profiles/new" id="profile-listing-new-link">{{$editmenu.menu.cr_new}}</a>
+ {{/if}}
+ </div>
</div>
{{elseif $editmenu}}
<div class="btn-group">
- <a class="btn btn-primary btn-xs" href="{{$editmenu.edit.0}}" ><i class="fa fa-pencil"></i>&nbsp;{{$editmenu.edit.3}}</a>
+ <a class="btn btn-primary btn-sm" href="{{$editmenu.edit.0}}" ><i class="fa fa-pencil"></i>&nbsp;{{$editmenu.edit.3}}</a>
</div>
{{/if}}
{{if $exportlink}}
<div class="btn-group">
- <a class="btn btn-default btn-xs" href="{{$exportlink}}" ><i class="fa fa-vcard"></i>&nbsp;{{$export}}</a>
+ <a class="btn btn-outline-secondary btn-sm" href="{{$exportlink}}" ><i class="fa fa-vcard"></i>&nbsp;{{$export}}</a>
</div>
{{/if}}
</div>
@@ -47,6 +47,28 @@
{{foreach $fields as $f}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{if $f == 'name'}}
<dl id="aprofile-fullname" class="aprofile">
<dt>{{$profile.fullname.0}}</dt>
@@ -297,13 +319,13 @@
<li>{{if $item.img}}<a href="{{$item.url}}" ><img src="{{$item.img}}" class="profile-thing-img" width="100" height="100" alt="{{$item.term}}" /></a>{{/if}}
<a href="{{$item.editurl}}" >{{$item.term}}</a>
{{if $profile.canlike}}<br />
- <button type="button" class="btn btn-default btn-sm" onclick="doprofilelike('thing/' + '{{$item.term_hash}}','like'); return false;" title="{{$likethis}}" >
+ <button type="button" class="btn btn-outline-secondary btn-sm" onclick="doprofilelike('thing/' + '{{$item.term_hash}}','like'); return false;" title="{{$likethis}}" >
<i class="fa fa-thumbs-o-up" title="{{$likethis}}"></i>
</button>
{{/if}}
{{if $item.like_count}}
<div class="btn-group">
- <button type="button" class="btn btn-default btn-sm dropdown-toggle" data-toggle="dropdown" id="thing-like-{{$item.term_hash}}">{{$item.like_count}} {{$item.like_label}}</button>
+ <button type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown" id="thing-like-{{$item.term_hash}}">{{$item.like_count}} {{$item.like_label}}</button>
{{if $item.likes}}
<ul class="dropdown-menu" role="menu" aria-labelledby="thing-like-{{$item.term_hash}}">{{foreach $item.likes as $liker}}<li role="presentation"><a href="{{$liker.xchan_url}}"><img class="dropdown-menu-img-xs" src="{{$liker.xchan_photo_s}}" alt="{{$liker.name}}" /> {{$liker.xchan_name}}</a></li>{{/foreach}}</ul>
{{/if}}
diff --git a/view/tpl/profile_edit.tpl b/view/tpl/profile_edit.tpl
index b0211d697..05137479f 100755
--- a/view/tpl/profile_edit.tpl
+++ b/view/tpl/profile_edit.tpl
@@ -1,53 +1,34 @@
<div class="generic-content-wrapper">
<div class="section-title-wrapper">
- <div class="dropdown pull-right" id="profile-edit-links">
- <button type="button" class="btn btn-default btn-xs dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
- <i class="fa fa-caret-down"></i>&nbsp;{{$tools_label}}
+ <div class="dropdown float-right" id="profile-edit-links">
+ <button type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+ <i class="fa fa-cog"></i>&nbsp;{{$tools_label}}
</button>
- <ul class="dropdown-menu">
- <li class="nav-item">
- <a class="nav-link" href="profile_photo" id="profile-photo_upload-link" title="{{$profpic}}"><i class="fa fa-user"></i>&nbsp;{{$profpic}}</a>
- </li>
+ <div class="dropdown-menu">
+ <a class="dropdown-item" href="profile_photo" id="profile-photo_upload-link" title="{{$profpic}}"><i class="fa fa-fw fa-user"></i>&nbsp;{{$profpic}}</a>
{{if $is_default}}
- <li class="nav-item">
- <a href="cover_photo" id="cover-photo_upload-link" title="{{$coverpic}}"><i class="fa fa-picture-o"></i>&nbsp;{{$coverpic}}</a>
- </li>
+ <a class="dropdown-item" href="cover_photo" id="cover-photo_upload-link" title="{{$coverpic}}"><i class="fa fa-fw fa-picture-o"></i>&nbsp;{{$coverpic}}</a>
{{/if}}
{{if ! $is_default}}
- <li class="nav-item">
- <a href="profperm/{{$profile_id}}" id="profile-edit-visibility-link" title="{{$editvis}}"><i class="fa fa-pencil"></i>&nbsp;{{$editvis}}</a>
- </li>
+ <a class="dropdown-item" href="profperm/{{$profile_id}}" id="profile-edit-visibility-link" title="{{$editvis}}"><i class="fa fa-fw fa-pencil"></i>&nbsp;{{$editvis}}</a>
{{/if}}
- <li class="nav-item">
- <a href="thing" id="profile-edit-thing-link" title="{{$addthing}}"><i class="fa fa-plus-circle"></i>&nbsp;{{$addthing}}</a>
- </li>
- <li class="divider"></li>
- <li class="nav-item">
- <a href="profile/{{$profile_id}}/view" id="profile-edit-view-link" title="{{$viewprof}}">{{$viewprof}}</a>
- </li>
-
+ <a class="dropdown-item" href="thing" id="profile-edit-thing-link" title="{{$addthing}}"><i class="fa fa-fw fa-plus-circle"></i>&nbsp;{{$addthing}}</a>
+ <div class="dropdown-divider"></div>
+ <a class="dropdown-item" href="profile/{{$profile_id}}/view" id="profile-edit-view-link" title="{{$viewprof}}">{{$viewprof}}</a>
{{if $profile_clone_link}}
- <li class="divider"></li>
- <li class="nav-item">
- <a href="{{$profile_clone_link}}" id="profile-edit-clone-link" title="{{$cr_prof}}">{{$cl_prof}}</a>
- </li>
+ <div class="dropdown-divider"></div>
+ <a class="dropdown-item" href="{{$profile_clone_link}}" id="profile-edit-clone-link" title="{{$cr_prof}}">{{$cl_prof}}</a>
{{/if}}
{{if $exportable}}
- <li class="divider"></li>
- <li class="nav-item">
- <a href="profiles/export/{{$profile_id}}">{{$lbl_export}}</a>
- </li>
- <li class="nav-item">
- <a href="#" onClick="openClose('profile-upload-form'); return false;">{{$lbl_import}}</a>
- </li>
+ <div class="dropdown-divider"></div>
+ <a class="dropdown-item" href="profiles/export/{{$profile_id}}">{{$lbl_export}}</a>
+ <a class="dropdown-item" href="#" onClick="openClose('profile-upload-form'); return false;">{{$lbl_import}}</a>
{{/if}}
{{if ! $is_default}}
- <li class="divider"></li>
- <li class="nav-item">
- <a href="{{$profile_drop_link}}" id="profile-edit-drop-link" title="{{$del_prof}}" onclick="return confirmDelete();"><i class="fa fa-trash-o"></i>&nbsp;{{$del_prof}}</a>
- </li>
+ <div class="dropdown-divider"></div>
+ <a class="dropdown-item" href="{{$profile_drop_link}}" id="profile-edit-drop-link" title="{{$del_prof}}" onclick="return confirmDelete();"><i class="fa fa-trash-o"></i>&nbsp;{{$del_prof}}</a>
{{/if}}
- <ul>
+ </div>
</div>
<h2>{{$banner}}</h2>
<div class="clear"></div>
@@ -108,6 +89,128 @@
</div>
</div>
</div>
+
+ {{if $fields.comms }}
+
+ <div id="template-form-vcard-tel" class="form-group form-vcard-tel">
+ <select name="tel_type[]">
+ <option value="CELL">{{$mobile}}</option>
+ <option value="HOME">{{$home}}</option>
+ <option value="WORK">{{$work}}</option>
+ <option value="OTHER">{{$other}}</option>
+ </select>
+ <input type="text" name="tel[]" value="" placeholder="{{$tel_label}}">
+ <i data-remove="vcard-tel" data-id="" class="fa fa-trash-o remove-field drop-icons fakelink"></i>
+ </div>
+
+ <div id="template-form-vcard-email" class="form-group form-vcard-email">
+ <select name="email_type[]">
+ <option value="HOME">{{$home}}</option>
+ <option value="WORK">{{$work}}</option>
+ <option value="OTHER">{{$other}}</option>
+ </select>
+ <input type="text" name="email[]" value="" placeholder="{{$email_label}}">
+ <i data-remove="vcard-email" data-id="" class="fa fa-trash-o remove-field drop-icons fakelink"></i>
+ </div>
+
+ <div id="template-form-vcard-impp" class="form-group form-vcard-impp">
+ <select name="impp_type[]">
+ <option value="HOME">{{$home}}</option>
+ <option value="WORK">{{$work}}</option>
+ <option value="OTHER">{{$other}}</option>
+ </select>
+ <input type="text" name="impp[]" value="" placeholder="{{$impp_label}}">
+ <i data-remove="vcard-impp" data-id="" class="fa fa-trash-o remove-field drop-icons fakelink"></i>
+ </div>
+
+ <div class="section-content-wrapper-np">
+ <div id="vcard-cancel-{{$vcard.id}}" class="vcard-cancel vcard-cancel-btn" data-id="{{$vcard.id}}" data-action="cancel"><i class="fa fa-close"></i></div>
+ <div id="vcard-add-field-{{$vcard.id}}" class="dropdown pull-right vcard-add-field">
+ <button data-toggle="dropdown" type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle"><i class="fa fa-plus"></i> {{$add_field}}</button>
+ <ul class="dropdown-menu">
+ <li class="add-vcard-tel"><a href="#" data-add="vcard-tel" data-id="{{$vcard.id}}" class="add-field" onclick="return false;">{{$tel_label}}</a></li>
+ <li class="add-vcard-email"><a href="#" data-add="vcard-email" data-id="{{$vcard.id}}" class="add-field" onclick="return false;">{{$email_label}}</a></li>
+ <li class="add-vcard-impp"><a href="#" data-add="vcard-impp" data-id="{{$vcard.id}}" class="add-field" onclick="return false;">{{$impp_label}}</a></li>
+ </ul>
+ </div>
+ <div id="vcard-header-{{$vcard.id}}" class="vcard-header" data-id="{{$vcard.id}}" data-action="open">
+ <i class="vcard-fn-preview fa fa-address-card-o"></i>
+ <span id="vcard-preview-{{$vcard.id}}" class="vcard-preview">
+ {{if $vcard.fn}}<span class="vcard-fn-preview">{{$vcard.fn}}</span>{{/if}}
+ {{if $vcard.emails.0.address}}<span class="vcard-email-preview hidden-xs"><a href="mailto:{{$vcard.emails.0.address}}">{{$vcard.emails.0.address}}</a></span>{{/if}}
+ {{if $vcard.tels.0}}<span class="vcard-tel-preview hidden-xs">{{$vcard.tels.0.nr}}{{if $is_mobile}} <a class="btn btn-outline-secondary btn-sm" href="tel:{{$vcard.tels.0.nr}}"><i class="fa fa-phone connphone"></i></a>{{/if}}</span>{{/if}}
+ </span>
+ <input id="vcard-fn-{{$vcard.id}}" class="vcard-fn" type="text" name="fn" value="{{$vcard.fn}}" size="{{$vcard.fn|count_characters:true}}" placeholder="{{$name_label}}">
+ </div>
+ </div>
+ <div id="vcard-info-{{$vcard.id}}" class="vcard-info section-content-wrapper">
+
+ <div class="vcard-tel form-group">
+ <div class="form-vcard-tel-wrapper">
+ {{if $vcard.tels}}
+ {{foreach $vcard.tels as $tel}}
+ <div class="form-group form-vcard-tel">
+ <select name="tel_type[]">
+ <option value=""{{if $tel.type.0 != 'CELL' && $tel.type.0 != 'HOME' && $tel.type.0 != 'WORK' && $tel.type.0 != 'OTHER'}} selected="selected"{{/if}}>{{$tel.type.1}}</option>
+ <option value="CELL"{{if $tel.type.0 == 'CELL'}} selected="selected"{{/if}}>{{$mobile}}</option>
+ <option value="HOME"{{if $tel.type.0 == 'HOME'}} selected="selected"{{/if}}>{{$home}}</option>
+ <option value="WORK"{{if $tel.type.0 == 'WORK'}} selected="selected"{{/if}}>{{$work}}</option>
+ <option value="OTHER"{{if $tel.type.0 == 'OTHER'}} selected="selected"{{/if}}>{{$other}}</option>
+ </select>
+ <input type="text" name="tel[]" value="{{$tel.nr}}" size="{{$tel.nr|count_characters:true}}" placeholder="{{$tel_label}}">
+ <i data-remove="vcard-tel" data-id="{{$vcard.id}}" class="fa fa-trash-o remove-field drop-icons fakelink"></i>
+ </div>
+ {{/foreach}}
+ {{/if}}
+ </div>
+ </div>
+
+
+ <div class="vcard-email form-group">
+ <div class="form-vcard-email-wrapper">
+ {{if $vcard.emails}}
+ {{foreach $vcard.emails as $email}}
+ <div class="form-group form-vcard-email">
+ <select name="email_type[]">
+ <option value=""{{if $email.type.0 != 'HOME' && $email.type.0 != 'WORK' && $email.type.0 != 'OTHER'}} selected="selected"{{/if}}>{{$email.type.1}}</option>
+ <option value="HOME"{{if $email.type.0 == 'HOME'}} selected="selected"{{/if}}>{{$home}}</option>
+ <option value="WORK"{{if $email.type.0 == 'WORK'}} selected="selected"{{/if}}>{{$work}}</option>
+ <option value="OTHER"{{if $email.type.0 == 'OTHER'}} selected="selected"{{/if}}>{{$other}}</option>
+ </select>
+ <input type="text" name="email[]" value="{{$email.address}}" size="{{$email.address|count_characters:true}}" placeholder="{{$email_label}}">
+ <i data-remove="vcard-email" data-id="{{$vcard.id}}" class="fa fa-trash-o remove-field drop-icons fakelink"></i>
+ </div>
+ {{/foreach}}
+ {{/if}}
+ </div>
+ </div>
+
+ <div class="vcard-impp form-group">
+ <div class="form-vcard-impp-wrapper">
+ {{if $vcard.impps}}
+ {{foreach $vcard.impps as $impp}}
+ <div class="form-group form-vcard-impp">
+ <select name="impp_type[]">
+ <option value=""{{if $impp.type.0 != 'HOME' && $impp.type.0 != 'WORK' && $impp.type.0 != 'OTHER'}} selected="selected"{{/if}}>{{$impp.type.1}}</option>
+ <option value="HOME"{{if $impp.type.0 == 'HOME'}} selected="selected"{{/if}}>{{$home}}</option>
+ <option value="WORK"{{if $impp.type.0 == 'WORK'}} selected="selected"{{/if}}>{{$work}}</option>
+ <option value="OTHER"{{if $impp.type.0 == 'OTHER'}} selected="selected"{{/if}}>{{$other}}</option>
+ </select>
+ <input type="text" name="impp[]" value="{{$impp.address}}" size="{{$impp.address|count_characters:true}}" placeholder="{{$impp_label}}">
+ <i data-remove="vcard-impp" data-id="{{$vcard.id}}" class="fa fa-trash-o remove-field drop-icons fakelink"></i>
+ </div>
+ {{/foreach}}
+ {{/if}}
+ </div>
+ </div>
+
+ <div class="settings-submit-wrapper" >
+ <button type="submit" name="done" value="{{$submit}}" class="btn btn-primary">{{$submit}}</button>
+ </div>
+ </div>
+ {{/if}}
+
+
{{if $fields.address || $fields.locality || $fields.postal_code || $fields.region || $fields.country_name || $fields.hometown}}
<div class="panel">
<div class="section-subtitle-wrapper" role="tab" id="location">
@@ -150,7 +253,9 @@
</div>
</div>
</div>
+
{{/if}}
+
{{if $fields.marital || $fields.sexual}}
<div class="panel">
<div class="section-subtitle-wrapper" role="tab" id="relation">
@@ -270,7 +375,7 @@
{{/if}}
{{if $fields.employment}}
- {{include file="field_textarea.tpl" field=$work}}
+ {{include file="field_textarea.tpl" field=$employ}}
{{/if}}
{{if $fields.education}}
diff --git a/view/tpl/profile_listing_header.tpl b/view/tpl/profile_listing_header.tpl
index fade7be7c..42abf2735 100755
--- a/view/tpl/profile_listing_header.tpl
+++ b/view/tpl/profile_listing_header.tpl
@@ -1,6 +1,6 @@
<div class="generic-content-wrapper">
<div class="section-title-wrapper">
- <a class="btn btn-success btn-xs pull-right" href="{{$cr_new_link}}" id="profile-listing-new-link" title="{{$cr_new}}" ><i class="fa fa-plus-circle"></i>&nbsp;{{$cr_new}}</a>
+ <a class="btn btn-success btn-sm pull-right" href="{{$cr_new_link}}" id="profile-listing-new-link" title="{{$cr_new}}" ><i class="fa fa-plus-circle"></i>&nbsp;{{$cr_new}}</a>
<h2>{{$header}}</h2>
</div>
<div class="section-content-wrapper">
diff --git a/view/tpl/profile_tabs.tpl b/view/tpl/profile_tabs.tpl
new file mode 100644
index 000000000..49b74bb8f
--- /dev/null
+++ b/view/tpl/profile_tabs.tpl
@@ -0,0 +1,5 @@
+<div class="dropdown-header"><img src="{{$thumb}}" class="menu-img-1">{{$name}}:</div>
+{{foreach $tabs as $tab}}
+<a class="dropdown-item{{if $tab.sel}} {{$tab.sel}}{{/if}}" href="{{$tab.url}}"{{if $tab.title}} title="{{$tab.title}}"{{/if}}><i class="fa fa-fw fa-{{$tab.icon}} generic-icons-nav"></i>{{$tab.label}}</a>
+{{/foreach}}
+<div class="dropdown-divider"></div>
diff --git a/view/tpl/prv_message.tpl b/view/tpl/prv_message.tpl
index e4e923ddb..925447ff2 100755
--- a/view/tpl/prv_message.tpl
+++ b/view/tpl/prv_message.tpl
@@ -28,69 +28,69 @@
{{/if}}
<div class="form-group">
<label for="prvmail-text">{{$yourmessage}}</label>
- <textarea class="form-control" id="prvmail-text" name="body">{{$text}}</textarea>
+ <textarea class="form-control" id="prvmail-text" name="body"{{if $new}} style="height: 10em;"{{/if}}>{{$text}}</textarea>
</div>
<div id="prvmail-submit-wrapper" class="form-group">
- <div id="prvmail-submit" class="pull-right btn-group">
- <button class="btn btn-default btn-sm" id="prvmail-preview" title="{{$preview}}" onclick="preview_mail(); return false;"><i class="fa fa-eye"></i></button>
+ <div id="prvmail-submit" class="float-right btn-group">
+ <button class="btn btn-outline-secondary btn-sm" id="prvmail-preview" title="{{$preview}}" onclick="preview_mail(); return false;"><i class="fa fa-eye"></i></button>
<button class="btn btn-primary btn-sm" type="submit" id="prvmail-submit" name="submit" value="{{$submit}}">{{$submit}}</button>
</div>
- <div id="prvmail-tools" class="btn-toolbar pull-left">
- <div class="btn-group">
- <button id="main-editor-bold" class="btn btn-default btn-sm" title="{{$bold}}" onclick="inserteditortag('b', 'prvmail-text'); return false;">
+ <div id="prvmail-tools" class="btn-toolbar float-left">
+ <div class="btn-group mr-2">
+ <button id="main-editor-bold" class="btn btn-outline-secondary btn-sm" title="{{$bold}}" onclick="inserteditortag('b', 'prvmail-text'); return false;">
<i class="fa fa-bold jot-icons"></i>
</button>
- <button id="main-editor-italic" class="btn btn-default btn-sm" title="{{$italic}}" onclick="inserteditortag('i', 'prvmail-text'); return false;">
+ <button id="main-editor-italic" class="btn btn-outline-secondary btn-sm" title="{{$italic}}" onclick="inserteditortag('i', 'prvmail-text'); return false;">
<i class="fa fa-italic jot-icons"></i>
</button>
- <button id="main-editor-underline" class="btn btn-default btn-sm" title="{{$underline}}" onclick="inserteditortag('u', 'prvmail-text'); return false;">
+ <button id="main-editor-underline" class="btn btn-outline-secondary btn-sm" title="{{$underline}}" onclick="inserteditortag('u', 'prvmail-text'); return false;">
<i class="fa fa-underline jot-icons"></i>
</button>
- <button id="main-editor-quote" class="btn btn-default btn-sm" title="{{$quote}}" onclick="inserteditortag('quote', 'prvmail-text'); return false;">
+ <button id="main-editor-quote" class="btn btn-outline-secondary btn-sm" title="{{$quote}}" onclick="inserteditortag('quote', 'prvmail-text'); return false;">
<i class="fa fa-quote-left jot-icons"></i>
</button>
- <button id="main-editor-code" class="btn btn-default btn-sm" title="{{$code}}" onclick="inserteditortag('code', 'prvmail-text'); return false;">
+ <button id="main-editor-code" class="btn btn-outline-secondary btn-sm" title="{{$code}}" onclick="inserteditortag('code', 'prvmail-text'); return false;">
<i class="fa fa-terminal jot-icons"></i>
</button>
</div>
- <div class="btn-group hidden-xs">
- <button id="prvmail-attach-wrapper" class="btn btn-default btn-sm" >
+ <div class="btn-group d-none d-lg-flex mr-2">
+ <button id="prvmail-attach-wrapper" class="btn btn-outline-secondary btn-sm" >
<i id="prvmail-attach" class="fa fa-paperclip jot-icons" title="{{$attach}}"></i>
</button>
- <button id="prvmail-link-wrapper" class="btn btn-default btn-sm" onclick="prvmailJotGetLink(); return false;" >
+ <button id="prvmail-link-wrapper" class="btn btn-outline-secondary btn-sm" onclick="prvmailJotGetLink(); return false;" >
<i id="prvmail-link" class="fa fa-link jot-icons" title="{{$insert}}" ></i>
</button>
</div>
{{if $feature_expire || $feature_encrypt}}
- <div class="btn-group hidden-sm hidden-xs">
+ <div class="btn-group d-none d-lg-flex mr-2">
{{if $feature_expire}}
- <button id="prvmail-expire-wrapper" class="btn btn-default btn-sm" onclick="prvmailGetExpiry();return false;" >
+ <button id="prvmail-expire-wrapper" class="btn btn-outline-secondary btn-sm" onclick="prvmailGetExpiry();return false;" >
<i id="prvmail-expires" class="fa fa-eraser jot-icons" title="{{$expires}}" ></i>
</button>
{{/if}}
{{if $feature_encrypt}}
- <button id="prvmail-encrypt-wrapper" class="btn btn-default btn-sm" onclick="red_encrypt('{{$cipher}}','#prvmail-text',$('#prvmail-text').val());return false;">
+ <button id="prvmail-encrypt-wrapper" class="btn btn-outline-secondary btn-sm" onclick="red_encrypt('{{$cipher}}','#prvmail-text',$('#prvmail-text').val());return false;">
<i id="prvmail-encrypt" class="fa fa-key jot-icons" title="{{$encrypt}}" ></i>
</button>
{{/if}}
</div>
{{/if}}
- <div class="btn-group visible-xs visible-sm">
- <button type="button" id="more-tools" class="btn btn-default btn-sm dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
- <i id="more-tools-icon" class="fa fa-caret-down jot-icons"></i>
+ <div class="btn-group d-lg-none">
+ <button type="button" id="more-tools" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
+ <i id="more-tools-icon" class="fa fa-cog jot-icons"></i>
</button>
- <ul class="dropdown-menu dropdown-menu-right" role="menu">
- <li class="visible-xs"><a href="#" id="prvmail-attach-sub"><i class="fa fa-paperclip"></i>&nbsp;{{$attach}}</a></li>
- <li class="visible-xs"><a href="#" onclick="prvmailJotGetLink(); return false;" ><i class="fa fa-link"></i>&nbsp;{{$insert}}</a></li>
+ <div class="dropdown-menu dropdown-menu-right" role="menu">
+ <a class="dropdown-item" href="#" id="prvmail-attach-sub"><i class="fa fa-paperclip"></i>&nbsp;{{$attach}}</a>
+ <a class="dropdown-item" href="#" onclick="prvmailJotGetLink(); return false;" ><i class="fa fa-link"></i>&nbsp;{{$insert}}</a>
{{if $feature_expire || $feature_encrypt}}
- <li class="divider visible-xs"></li>
- <li class="visible-sm visible-xs"><a href="#" onclick="prvmailGetExpiry(); return false;"><i id="prvmail-expires" class="fa fa-eraser"></i>&nbsp;{{$expires}}</a></li>
- <li class="visible-sm visible-xs"><a href="#" onclick="red_encrypt('{{$cipher}}','#prvmail-text',$('#prvmail-text').val()); return false;"><i class="fa fa-key"></i>&nbsp;{{$encrypt}}</a></li>
+ <div class="dropdown-divider"></div>
+ <a class="dropdown-item" href="#" onclick="prvmailGetExpiry(); return false;"><i id="prvmail-expires" class="fa fa-eraser"></i>&nbsp;{{$expires}}</a>
+ <a class="dropdown-item" href="#" onclick="red_encrypt('{{$cipher}}','#prvmail-text',$('#prvmail-text').val()); return false;"><i class="fa fa-key"></i>&nbsp;{{$encrypt}}</a>
{{/if}}
- </ul>
+ </div>
</div>
</div>
- <div id="prvmail-rotator-wrapper" class="pull-left">
+ <div id="prvmail-rotator-wrapper" class="float-left">
<div id="prvmail-rotator"></div>
</div>
<div class="clear"></div>
diff --git a/view/tpl/saved_searches.tpl b/view/tpl/saved_searches.tpl
index 2065cd714..ff2d044ef 100644
--- a/view/tpl/saved_searches.tpl
+++ b/view/tpl/saved_searches.tpl
@@ -1,14 +1,12 @@
-<div class="widget saved-search-widget">
+<div class="widget saved-search-widget clearfix">
<h3 id="search">{{$title}}</h3>
{{$searchbox}}
-
- <ul id="saved-search-list" class="nav nav-pills nav-stacked">
+ <ul id="saved-search-list" class="nav nav-pills flex-column">
{{foreach $saved as $search}}
- <li id="search-term-{{$search.id}}">
- <a class="pull-right group-edit-tool" title="{{$search.delete}}" onclick="return confirmDelete();" id="drop-saved-search-term-{{$search.id}}" href="{{$search.dellink}}"><i id="dropfa-floppy-od-search-term-{{$search.id}}" class="group-edit-icon fa fa-trash-o" ></i></a>
- <a id="saved-search-term-{{$search.id}}"{{if $search.selected}} class="search-selected"{{/if}} href="{{$search.srchlink}}">{{$search.displayterm}}</a>
+ <li class="nav-item nav-item-hack" id="search-term-{{$search.id}}">
+ <a class="nav-link widget-nav-pills-icons" title="{{$search.delete}}" onclick="return confirmDelete();" id="drop-saved-search-term-{{$search.id}}" href="{{$search.dellink}}"><i id="dropfa-floppy-od-search-term-{{$search.id}}" class="fa fa-trash-o drop-icons" ></i></a>
+ <a id="saved-search-term-{{$search.id}}" class="nav-link{{if $search.selected}} active{{/if}}" href="{{$search.srchlink}}">{{$search.displayterm}}</a>
</li>
{{/foreach}}
</ul>
- <div class="clear"></div>
</div>
diff --git a/view/tpl/search_item.tpl b/view/tpl/search_item.tpl
index a490cb473..66618a216 100755
--- a/view/tpl/search_item.tpl
+++ b/view/tpl/search_item.tpl
@@ -1,7 +1,7 @@
-<div id="thread-wrapper-{{$item.id}}" class="thread-wrapper{{if $item.toplevel}} {{$item.toplevel}} generic-content-wrapper{{/if}}">
+<div id="thread-wrapper-{{$item.id}}" class="thread-wrapper{{if $item.toplevel}} {{$item.toplevel}} mb-4 clearfix generic-content-wrapper{{/if}}">
<a name="{{$item.id}}" ></a>
- <div class="wall-item-outside-wrapper {{$item.indent}}{{$item.previewing}}{{if $item.owner_url}} wallwall{{/if}}" id="wall-item-outside-wrapper-{{$item.id}}" >
- <div class="wall-item-content-wrapper {{$item.indent}}" id="wall-item-content-wrapper-{{$item.id}}" style="clear:both;">
+ <div class="clearfix wall-item-outside-wrapper {{$item.indent}}{{$item.previewing}}{{if $item.owner_url}} wallwall{{/if}}" id="wall-item-outside-wrapper-{{$item.id}}" >
+ <div class="wall-item-content-wrapper {{$item.indent}}" id="wall-item-content-wrapper-{{$item.id}}">
{{if $item.photo}}
<div class="wall-photo-item" id="wall-photo-item-{{$item.id}}">
{{$item.photo}}
@@ -12,21 +12,23 @@
{{$item.event}}
</div>
{{/if}}
- <div class="wall-item-head">
+ {{if $item.title && !$item.event}}
+ <div class="p-2{{if $item.is_new}} bg-primary text-white{{/if}} wall-item-title h3{{if !$item.photo}} rounded-top{{/if}}" id="wall-item-title-{{$item.id}}">
+ {{if $item.title_tosource}}{{if $item.plink}}<a href="{{$item.plink.href}}" title="{{$item.title}} ({{$item.plink.title}})">{{/if}}{{/if}}{{$item.title}}{{if $item.title_tosource}}{{if $item.plink}}</a>{{/if}}{{/if}}
+ </div>
+ {{if ! $item.is_new}}
+ <hr class="m-0">
+ {{/if}}
+ {{/if}}
+ <div class="p-2 clearfix wall-item-head{{if $item.is_new && !$item.title && !$item.event && !$item.is_comment}} wall-item-head-new rounded-top{{/if}}">
<div class="wall-item-info" id="wall-item-info-{{$item.id}}" >
<div class="wall-item-photo-wrapper{{if $item.owner_url}} wwfrom{{/if}}" id="wall-item-photo-wrapper-{{$item.id}}">
<a href="{{$item.profile_url}}" title="{{$item.linktitle}}" class="wall-item-photo-link" id="wall-item-photo-link-{{$item.id}}"><img src="{{$item.thumb}}" class="wall-item-photo{{$item.sparkle}}" id="wall-item-photo-{{$item.id}}" alt="{{$item.name}}" /></a>
</div>
- <div class="wall-item-photo-end" style="clear:both"></div>
- </div>
- {{if $item.title}}
- <div class="wall-item-title" id="wall-item-title-{{$item.id}}" title="{{$item.title}}">
- <h3>{{if $item.title_tosource}}{{if $item.plink}}<a href="{{$item.plink.href}}" title="{{$item.title}} ({{$item.plink.title}})">{{/if}}{{/if}}{{$item.title}}{{if $item.title_tosource}}{{if $item.plink}}</a>{{/if}}{{/if}}</h3>
</div>
- {{/if}}
{{if $item.lock}}
<div class="wall-item-lock dropdown">
- <i class="fa fa-lock lockview dropdown-toggle" data-toggle="dropdown" title="{{$item.lock}}" onclick="lockview('item',{{$item.id}});" ></i><ul id="panel-{{$item.id}}" class="lockview-panel dropdown-menu"></ul>&nbsp;
+ <i class="fa fa-lock lockview" data-toggle="dropdown" title="{{$item.lock}}" onclick="lockview('item',{{$item.id}});" ></i><ul id="panel-{{$item.id}}" class="lockview-panel dropdown-menu"></ul>&nbsp;
</div>
{{/if}}
<div class="wall-item-author">
@@ -35,16 +37,20 @@
<div class="wall-item-ago" id="wall-item-ago-{{$item.id}}">
{{if $item.verified}}<i class="fa fa-check item-verified" title="{{$item.verified}}"></i>&nbsp;{{elseif $item.forged}}<i class="fa fa-exclamation item-forged" title="{{$item.forged}}"></i>&nbsp;{{/if}}{{if $item.location}}<span class="wall-item-location" id="wall-item-location-{{$item.id}}">{{$item.location}},&nbsp;</span>{{/if}}<span class="autotime" title="{{$item.isotime}}">{{$item.localtime}}{{if $item.editedtime}}&nbsp;{{$item.editedtime}}{{/if}}{{if $item.expiretime}}&nbsp;{{$item.expiretime}}{{/if}}</span>{{if $item.editedtime}}&nbsp;<i class="fa fa-pencil"></i>{{/if}}&nbsp;{{if $item.app}}<span class="item.app">{{$item.str_app}}</span>{{/if}}
</div>
- <div class="clear"></div>
</div>
- <div class="{{if $item.is_photo}}wall-photo-item{{else}}wall-item-content{{/if}}" id="wall-item-content-{{$item.id}}">
+ {{if $item.body}}
+ <div class="p-2 clrearfix {{if $item.is_photo}} wall-photo-item{{else}} wall-item-content{{/if}}" id="wall-item-content-{{$item.id}}">
<div class="wall-item-body" id="wall-item-body-{{$item.id}}" >
{{$item.body}}
</div>
- <div class="clear"></div>
</div>
+ {{/if}}
{{if $item.has_tags}}
- <div class="wall-item-tools">
+ <div class="p-2 wall-item-tools clearfix">
+ <div class="body-tags">
+ <span class="tag">{{$item.mentions}} {{$item.tags}} {{$item.categories}} {{$item.folders}}</span>
+ </div>
+ {{**
{{if $item.mentions}}
<div class="body-tags" id="item-mentions">
<span class="tag">{{$item.mentions}}</span>
@@ -65,48 +71,44 @@
<span class="tag">{{$item.folders}}</span>
</div>
{{/if}}
- <div class="clear"></div>
+ **}}
</div>
{{/if}}
- <div class="wall-item-tools">
+ <div class="p-2 clearfix wall-item-tools">
<div class="wall-item-tools-right btn-group pull-right">
- <button type="button" class="btn btn-default btn-sm dropdown-toggle" data-toggle="dropdown">
- <i class="fa fa-caret-down"></i>
+ <button type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown">
+ <i class="fa fa-cog"></i>
</button>
- <ul class="dropdown-menu">
+ <div class="dropdown-menu dropdown-menu-right">
{{if $item.thread_action_menu}}
{{foreach $item.thread_action_menu as $mitem}}
- <li role="presentation"><a role="menuitem" {{if $mitem.href}}href="{{$mitem.href}}"{{/if}} {{if $mitem.action}}onclick="{{$mitem.action}}"{{/if}} {{if $mitem.title}}title="{{$mitem.title}}"{{/if}} ><i class="fa fa-{{$mitem.icon}}"></i> {{$mitem.title}}</a></li>
+ <a class="dropdown-item" {{if $mitem.href}}href="{{$mitem.href}}"{{/if}} {{if $mitem.action}}onclick="{{$mitem.action}}"{{/if}} {{if $mitem.title}}title="{{$mitem.title}}"{{/if}} ><i class="fa fa-{{$mitem.icon}}"></i> {{$mitem.title}}</a></li>
{{/foreach}}
{{/if}}
{{if $item.drop.dropping}}
- <li><a href="item/drop/{{$item.id}}" onclick="return confirmDelete();" title="{{$item.drop.delete}}" ><i class="fa fa-trash-o"></i> {{$item.drop.delete}}</a></li>
+ <a class="dropdown-item" href="item/drop/{{$item.id}}" onclick="return confirmDelete();" title="{{$item.drop.delete}}" ><i class="fa fa-trash-o"></i> {{$item.drop.delete}}</a></li>
{{/if}}
{{if $item.thread_author_menu}}
- <li role="presentation" class="divider"></li>
+ <div class="dropdown-divider"></div>
{{foreach $item.thread_author_menu as $mitem}}
- <li role="presentation"><a role="menuitem" {{if $mitem.href}}href="{{$mitem.href}}"{{/if}} {{if $mitem.action}}onclick="{{$mitem.action}}"{{/if}} {{if $mitem.title}}title="{{$mitem.title}}"{{/if}} >{{$mitem.title}}</a></li>
+ <a class="dropdown-item" {{if $mitem.href}}href="{{$mitem.href}}"{{/if}} {{if $mitem.action}}onclick="{{$mitem.action}}"{{/if}} {{if $mitem.title}}title="{{$mitem.title}}"{{/if}} >{{$mitem.title}}</a></li>
{{/foreach}}
{{/if}}
- </ul>
+ </div>
</div>
{{if $item.attachments}}
<div class="wall-item-tools-left btn-group">
- <button type="button" class="btn btn-default btn-sm wall-item-like dropdown-toggle" data-toggle="dropdown" id="attachment-menu-{{$item.id}}"><i class="fa fa-paperclip"></i></button>
- <ul class="dropdown-menu" role="menu" aria-labelledby="attachment-menu-{{$item.id}}">{{$item.attachments}}</ul>
+ <button type="button" class="btn btn-outline-secondary btn-sm wall-item-like dropdown-toggle" data-toggle="dropdown" id="attachment-menu-{{$item.id}}"><i class="fa fa-paperclip"></i></button>
+ <div class="dropdown-menu">{{$item.attachments}}</div>
</div>
{{/if}}
- <div class="clear"></div>
</div>
- <div class="clear"></div>
</div>
- <div class="wall-item-wrapper-end"></div>
{{if $item.conv}}
- <div class="wall-item-conv" id="wall-item-conv-{{$item.id}}" >
+ <div class="p-2 wall-item-conv" id="wall-item-conv-{{$item.id}}" >
<a href='{{$item.conv.href}}' id='context-{{$item.id}}' title='{{$item.conv.title}}'>{{$item.conv.title}}</a>
</div>
{{/if}}
- <div class="clear{{if $indent}} {{$indent}}{{/if}}"></div>
</div>
</div>
diff --git a/view/tpl/searchbox.tpl b/view/tpl/searchbox.tpl
index 8eb169b4a..8f7ac5162 100644
--- a/view/tpl/searchbox.tpl
+++ b/view/tpl/searchbox.tpl
@@ -1,11 +1,11 @@
<form action="{{$action_url}}" method="get" >
<input type="hidden" name="f" value="" />
<div id="{{$id}}" class="input-group">
- <input class="widget-input" type="text" name="search" id="search-text" value="{{$s}}" onclick="this.submit();" />
+ <input class="form-control form-control-sm" type="text" name="search" id="search-text" value="{{$s}}" onclick="this.submit();" />
<div class="input-group-btn">
- <button type="submit" name="submit" class="btn btn-default btn-sm" id="search-submit" value="{{$search_label}}"><i class="fa fa-search"></i></button>
+ <button type="submit" name="submit" class="btn btn-outline-secondary" id="search-submit" value="{{$search_label}}"><i class="fa fa-search"></i></button>
{{if $savedsearch}}
- <button type="submit" name="searchsave" class="btn btn-default btn-sm" id="search-save" value="{{$save_label}}"><i class="fa fa-floppy-o"></i></button>
+ <button type="submit" name="searchsave" class="btn btn-outline-secondary" id="search-save" value="{{$save_label}}"><i class="fa fa-floppy-o"></i></button>
{{/if}}
</div>
</div>
diff --git a/view/tpl/settings.tpl b/view/tpl/settings.tpl
index 19c2b42d5..dd5fecb43 100755
--- a/view/tpl/settings.tpl
+++ b/view/tpl/settings.tpl
@@ -1,6 +1,6 @@
<div class="generic-content-wrapper">
<div class="section-title-wrapper">
- {{if $server_role != 'basic'}}<a title="{{$removechannel}}" class="btn btn-danger btn-xs pull-right" href="removeme"><i class="fa fa-trash-o"></i>&nbsp;{{$removeme}}</a>{{/if}}
+ {{if $server_role != 'basic'}}<a title="{{$removechannel}}" class="btn btn-danger btn-sm pull-right" href="removeme"><i class="fa fa-trash-o"></i>&nbsp;{{$removeme}}</a>{{/if}}
<h2>{{$ptitle}}</h2>
<div class="clear"></div>
</div>
@@ -11,12 +11,12 @@
<div class="panel">
<div class="section-subtitle-wrapper" role="tab" id="basic-settings">
<h3>
- <a data-toggle="collapse" data-parent="#settings" href="#basic-settings-collapse" aria-expanded="true" aria-controls="basic-settings-collapse">
+ <a data-toggle="collapse" data-parent="#settings" href="#basic-settings-collapse">
{{$h_basic}}
</a>
</h3>
</div>
- <div id="basic-settings-collapse" class="panel-collapse collapse in" role="tabpanel" aria-labelledby="basic-settings">
+ <div id="basic-settings-collapse" class="collapse show" role="tabpanel" aria-labelledby="basic-settings">
<div class="section-content-tools-wrapper">
{{include file="field_input.tpl" field=$username}}
{{include file="field_select_grouped.tpl" field=$timezone}}
@@ -37,12 +37,12 @@
<div class="panel">
<div class="section-subtitle-wrapper" role="tab" id="privacy-settings">
<h3>
- <a data-toggle="collapse" data-parent="#settings" href="#privacy-settings-collapse" aria-expanded="true" aria-controls="privacy-settings-collapse">
+ <a data-toggle="collapse" data-parent="#settings" href="#privacy-settings-collapse">
{{$h_prv}}
</a>
</h3>
</div>
- <div id="privacy-settings-collapse" class="panel-collapse collapse" role="tabpanel" aria-labelledby="privacy-settings">
+ <div id="privacy-settings-collapse" class="collapse" role="tabpanel" aria-labelledby="privacy-settings">
<div class="section-content-tools-wrapper">
{{if $server_role != 'basic'}}
{{include file="field_select_grouped.tpl" field=$role}}
@@ -51,7 +51,7 @@
{{if $server_role != 'basic'}}
<div class="form-group">
- <button type="button" class="btn btn-default" data-toggle="modal" data-target="#apsModal">{{$lbl_p2macro}}</button>
+ <button type="button" class="btn btn-outline-secondary" data-toggle="modal" data-target="#apsModal">{{$lbl_p2macro}}</button>
</div>
<div class="modal" id="apsModal">
<div class="modal-dialog">
@@ -66,14 +66,14 @@
{{/foreach}}
</div>
<div class="modal-footer">
- <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
+ <button type="button" class="btn btn-outline-secondary" data-dismiss="modal">Close</button>
</div>
</div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->
</div><!-- /.modal -->
{{/if}}
<div id="settings-default-perms" class="form-group" >
- <button type="button" class="btn btn-default" data-toggle="modal" data-target="#aclModal"><i id="jot-perms-icon" class="fa"></i>&nbsp;{{$permissions}}</button>
+ <button type="button" class="btn btn-outline-secondary" data-toggle="modal" data-target="#aclModal"><i id="jot-perms-icon" class="fa"></i>&nbsp;{{$permissions}}</button>
</div>
{{$group_select}}
{{include file="field_checkbox.tpl" field=$hide_presence}}
@@ -100,12 +100,12 @@
<div class="panel">
<div class="section-subtitle-wrapper" role="tab" id="notification-settings">
<h3>
- <a data-toggle="collapse" data-parent="#settings" href="#notification-settings-collapse" aria-expanded="true" aria-controls="notification-settings-collapse">
+ <a data-toggle="collapse" data-parent="#settings" href="#notification-settings-collapse">
{{$h_not}}
</a>
</h3>
</div>
- <div id="notification-settings-collapse" class="panel-collapse collapse" role="tabpanel" aria-labelledby="notification-settings">
+ <div id="notification-settings-collapse" class="collapse" role="tabpanel" aria-labelledby="notification-settings">
<div class="section-content-tools-wrapper">
<div id="settings-notifications">
<h3>{{$activity_options}}</h3>
@@ -162,7 +162,7 @@
</a>
</h3>
</div>
- <div id="miscellaneous-settings-collapse" class="panel-collapse collapse" role="tabpanel" aria-labelledby="miscellaneous-settings">
+ <div id="miscellaneous-settings-collapse" class="collapse" role="tabpanel" aria-labelledby="miscellaneous-settings">
<div class="section-content-tools-wrapper">
{{if $menus}}
<div class="form-group channel-menu">
diff --git a/view/tpl/settings_account.tpl b/view/tpl/settings_account.tpl
index 8ff846518..b7fdfb9a9 100755
--- a/view/tpl/settings_account.tpl
+++ b/view/tpl/settings_account.tpl
@@ -1,6 +1,6 @@
<div class="generic-content-wrapper">
<div class="section-title-wrapper">
- <a title="{{$removeaccount}}" class="btn btn-danger btn-xs pull-right" href="removeaccount"><i class="fa fa-trash-o"></i>&nbsp;{{$removeme}}</a>
+ <a title="{{$removeaccount}}" class="btn btn-danger btn-sm pull-right" href="removeaccount"><i class="fa fa-trash-o"></i>&nbsp;{{$removeme}}</a>
<h2>{{$title}}</h2>
<div class="clear"></div>
</div>
diff --git a/view/tpl/settings_display.tpl b/view/tpl/settings_display.tpl
index a85a067be..d8c1ac7aa 100755
--- a/view/tpl/settings_display.tpl
+++ b/view/tpl/settings_display.tpl
@@ -15,7 +15,7 @@
</a>
</h3>
</div>
- <div id="theme-settings-content" class="panel-collapse collapse in" role="tabpanel" aria-labelledby="theme-settings">
+ <div id="theme-settings-content" class="collapse show" role="tabpanel" aria-labelledby="theme-settings">
<div class="section-content-tools-wrapper">
{{if $theme}}
{{include file="field_themeselect.tpl" field=$theme}}
@@ -41,7 +41,7 @@
</a>
</h3>
</div>
- <div id="custom-settings-content" class="panel-collapse collapse{{if !$theme && !$mobile_theme}} in{{/if}}" role="tabpanel" aria-labelledby="custom-settings">
+ <div id="custom-settings-content" class="collapse{{if !$theme && !$mobile_theme}} in{{/if}}" role="tabpanel" aria-labelledby="custom-settings">
<div class="section-content-tools-wrapper">
{{if $theme_config}}
{{$theme_config}}
@@ -57,7 +57,7 @@
</a>
</h3>
</div>
- <div id="content-settings-content" class="panel-collapse collapse{{if !$theme && !$mobile_theme && !$theme_config}} in{{/if}}" role="tabpanel" aria-labelledby="content-settings">
+ <div id="content-settings-content" class="collapse{{if !$theme && !$mobile_theme && !$theme_config}} in{{/if}}" role="tabpanel" aria-labelledby="content-settings">
<div class="section-content-wrapper">
{{include file="field_input.tpl" field=$ajaxint}}
{{include file="field_input.tpl" field=$itemspage}}
@@ -72,7 +72,7 @@
{{include file="field_checkbox.tpl" field=$manual_update}}
{{if $expert}}
<div class="form-group">
- <a class="btn btn-default "href="pdledit">{{$layout_editor}}</a>
+ <a class="btn btn-outline-secondary "href="pdledit">{{$layout_editor}}</a>
</div>
{{/if}}
<div class="settings-submit-wrapper" >
diff --git a/view/tpl/settings_features.tpl b/view/tpl/settings_features.tpl
index 75eb34fb9..dfe049a7a 100755
--- a/view/tpl/settings_features.tpl
+++ b/view/tpl/settings_features.tpl
@@ -14,7 +14,7 @@
</a>
</h3>
</div>
- <div id="{{$g}}-settings-content" class="panel-collapse collapse{{if $g == 'general'}} in{{/if}}" role="tabpanel" aria-labelledby="{{$g}}-settings-title">
+ <div id="{{$g}}-settings-content" class="collapse{{if $g == 'general'}} show{{/if}}" role="tabpanel" aria-labelledby="{{$g}}-settings-title">
<div class="section-content-tools-wrapper">
{{foreach $f.1 as $fcat}}
{{include file="field_checkbox.tpl" field=$fcat}}
diff --git a/view/tpl/settings_oauth.tpl b/view/tpl/settings_oauth.tpl
index 9582ef52d..811cfcec5 100755
--- a/view/tpl/settings_oauth.tpl
+++ b/view/tpl/settings_oauth.tpl
@@ -25,8 +25,8 @@
{{/if}}
{{/if}}
{{if $app.my}}
- <a href="{{$baseurl}}/settings/oauth/edit/{{$app.client_id}}" title="{{$edit}}"><i class="fa fa-pencil btn btn-default"></i></a>
- <a href="{{$baseurl}}/settings/oauth/delete/{{$app.client_id}}?t={{$form_security_token}}" title="{{$delete}}"><i class="fa fa-trash-o btn btn-default"></i></a>
+ <a href="{{$baseurl}}/settings/oauth/edit/{{$app.client_id}}" title="{{$edit}}"><i class="fa fa-pencil btn btn-outline-secondary"></i></a>
+ <a href="{{$baseurl}}/settings/oauth/delete/{{$app.client_id}}?t={{$form_security_token}}" title="{{$delete}}"><i class="fa fa-trash-o btn btn-outline-secondary"></i></a>
{{/if}}
</div>
{{/foreach}}
diff --git a/view/tpl/sharedwithme.tpl b/view/tpl/sharedwithme.tpl
index c764dc4f0..68bdd6faa 100644
--- a/view/tpl/sharedwithme.tpl
+++ b/view/tpl/sharedwithme.tpl
@@ -1,6 +1,6 @@
<div class="generic-content-wrapper">
<div class="section-title-wrapper">
- <a href="/sharedwithme/dropall" onclick="return confirmDelete();" class="btn btn-xs btn-default pull-right"><i class="fa fa-trash-o"></i>&nbsp;{{$dropall}}</a>
+ <a href="/sharedwithme/dropall" onclick="return confirmDelete();" class="btn btn-sm btn-outline-secondary pull-right"><i class="fa fa-trash-o"></i>&nbsp;{{$dropall}}</a>
<h2>{{$header}}</h2>
</div>
<div class="section-content-wrapper-np">
@@ -9,16 +9,16 @@
<th width="1%"></th>
<th width="92%">{{$name}}</th>
<th width="1%"></th>
- <th width="1%" class="hidden-xs">{{$size}}</th>
- <th width="1%" class="hidden-xs">{{$lastmod}}</th>
+ <th width="1%" class="d-none d-md-table-cell">{{$size}}</th>
+ <th width="1%" class="d-none d-md-table-cell">{{$lastmod}}</th>
</tr>
{{foreach $items as $item}}
<tr id="cloud-index-{{$item.id}}">
<td><i class="fa {{$item.objfiletypeclass}}" title="{{$item.objfiletype}}"></i></td>
<td><a href="{{$item.objurl}}">{{$item.objfilename}}</a>{{if $item.unseen}}&nbsp;<span class="label label-success">{{$label_new}}</span>{{/if}}</td>
<td class="cloud-index-tool"><a href="#" title="{{$drop}}" onclick="dropItem('/sharedwithme/{{$item.id}}/drop', '#cloud-index-{{$item.id}}'); return false;"><i class="fa fa-trash-o drop-icons"></i></a></td>
- <td class="hidden-xs">{{$item.objfilesize}}</td>
- <td class="hidden-xs">{{$item.objedited}}</td>
+ <td class="d-none d-md-table-cell">{{$item.objfilesize}}</td>
+ <td class="d-none d-md-table-cell">{{$item.objedited}}</td>
</tr>
{{/foreach}}
</table>
diff --git a/view/tpl/show_thing.tpl b/view/tpl/show_thing.tpl
index 85d7934b5..d738c9fc9 100644
--- a/view/tpl/show_thing.tpl
+++ b/view/tpl/show_thing.tpl
@@ -6,8 +6,8 @@
</div>
{{if $canedit}}
<div class="thing-edit-links">
-<a href="thing/edit/{{$thing.obj_obj}}" title="{{$edit}}" class="btn btn-default" ><i class="fa fa-pencil thing-edit-icon"></i></a>
-<a href="thing/drop/{{$thing.obj_obj}}" onclick="return confirmDelete();" title="{{$delete}}" class="btn btn-default" ><i class="fa fa-trash-o drop-icons"></i></a>
+<a href="thing/edit/{{$thing.obj_obj}}" title="{{$edit}}" class="btn btn-outline-secondary" ><i class="fa fa-pencil thing-edit-icon"></i></a>
+<a href="thing/drop/{{$thing.obj_obj}}" onclick="return confirmDelete();" title="{{$delete}}" class="btn btn-outline-secondary" ><i class="fa fa-trash-o drop-icons"></i></a>
</div>
<div class="thing-edit-links-end"></div>
{{/if}}
diff --git a/view/tpl/suggest_friends.tpl b/view/tpl/suggest_friends.tpl
index 26d9da7ce..95f24cd63 100755
--- a/view/tpl/suggest_friends.tpl
+++ b/view/tpl/suggest_friends.tpl
@@ -4,13 +4,13 @@
<img src="{{$entry.photo}}" alt="{{$entry.name}}" width="80" height="80" title="{{$entry.name}} [{{$entry.profile}}]" />
</a>
</div>
- <a href="{{$entry.ignlnk}}" title="{{$entry.ignore}}" class="profile-match-ignore" onclick="return confirmDelete();" ><i class="fa fa-times drop-icons btn btn-default"></i></a>
+ <a href="{{$entry.ignlnk}}" title="{{$entry.ignore}}" class="profile-match-ignore" onclick="return confirmDelete();" ><i class="fa fa-times drop-icons btn btn-outline-secondary"></i></a>
<div class="profile-match-break"></div>
<div class="profile-match-name">
<a href="{{$entry.url}}" title="{{$entry.name}}">{{$entry.name}}</a>
</div>
<div class="profile-match-end"></div>
{{if $entry.connlnk}}
- <div class="profile-match-connect btn btn-default"><a href="{{$entry.connlnk}}" title="{{$entry.conntxt}}"><i class="fa fa-plus connect-icon"></i> {{$entry.conntxt}}</a></div>
+ <div class="profile-match-connect btn btn-outline-secondary"><a href="{{$entry.connlnk}}" title="{{$entry.conntxt}}"><i class="fa fa-plus connect-icon"></i> {{$entry.conntxt}}</a></div>
{{/if}}
</div>
diff --git a/view/tpl/thing_edit.tpl b/view/tpl/thing_edit.tpl
index b23584fe1..62a7c02c8 100644
--- a/view/tpl/thing_edit.tpl
+++ b/view/tpl/thing_edit.tpl
@@ -30,7 +30,7 @@
<div class="thing-end"></div>
{{if $lockstate}}
- <button id="dbtn-acl" class="btn btn-default btn-sm" data-toggle="modal" data-target="#aclModal" onclick="return false;">
+ <button id="dbtn-acl" class="btn btn-outline-secondary btn-sm" data-toggle="modal" data-target="#aclModal" onclick="return false;">
<i id="jot-perms-icon" class="fa fa-{{$lockstate}}"></i>
</button>
{{/if}}
diff --git a/view/tpl/thing_input.tpl b/view/tpl/thing_input.tpl
index 3e178925c..90fb093e4 100644
--- a/view/tpl/thing_input.tpl
+++ b/view/tpl/thing_input.tpl
@@ -30,7 +30,7 @@
<div class="thing-end"></div>
{{if $lockstate}}
- <button id="dbtn-acl" class="btn btn-default btn-sm" data-toggle="modal" data-target="#aclModal" onclick="return false;">
+ <button id="dbtn-acl" class="btn btn-outline-secondary btn-sm" data-toggle="modal" data-target="#aclModal" onclick="return false;">
<i id="jot-perms-icon" class="fa fa-{{$lockstate}}"></i>
</button>
{{/if}}
diff --git a/view/tpl/usermenu.tpl b/view/tpl/usermenu.tpl
index 547c5f308..c51728c34 100644
--- a/view/tpl/usermenu.tpl
+++ b/view/tpl/usermenu.tpl
@@ -5,10 +5,10 @@
<h3 class="pmenu-title">{{$menu.menu_desc}}{{if $edit}} <a href="mitem/{{$menu.menu_id}}" title="{{$edit}}"><i class="fa fa-pencil fakelink" title="{{$edit}}"></i></a>{{/if}}</h3>
{{/if}}
{{if $items}}
- <ul class="pmenu-body{{if $wrap || !$class}} nav nav-pills nav-stacked{{elseif !$wrap || $class}} {{$class}}{{/if}}">
+ <ul class="pmenu-body{{if $wrap || !$class}} nav nav-pills flex-column{{elseif !$wrap || $class}} {{$class}}{{/if}}">
{{foreach $items as $mitem }}
- <li id="pmenu-item-{{$mitem.mitem_id}}" class="pmenu-item{{if $mitem.submenu}} dropdown{{/if}}">
- <a href="{{if $mitem.submenu}}#{{else}}{{$mitem.mitem_link}}{{/if}}"{{if $mitem.submenu}} class="dropdown-toggle" data-toggle="dropdown"{{/if}}{{if $mitem.newwin}}target="_blank"{{/if}}>{{$mitem.mitem_desc}}{{if $mitem.submenu}}<span class="caret"></span>{{/if}}</a>
+ <li id="pmenu-item-{{$mitem.mitem_id}}" class="nav-item pmenu-item{{if $mitem.submenu}} dropdown{{/if}}">
+ <a href="{{if $mitem.submenu}}#{{else}}{{$mitem.mitem_link}}{{/if}}" class="nav-link {{if $mitem.submenu}} dropdown-toggle{{/if}}"{{if $mitem.submenu}} data-toggle="dropdown"{{/if}}{{if $mitem.newwin}}target="_blank"{{/if}}>{{$mitem.mitem_desc}}{{if $mitem.submenu}}<span class="caret"></span>{{/if}}</a>
{{if $mitem.submenu}}{{$mitem.submenu}}{{/if}}
</li>
{{/foreach }}
diff --git a/view/tpl/viewcontact_template.tpl b/view/tpl/viewcontact_template.tpl
index 83cd80959..2b7144450 100755
--- a/view/tpl/viewcontact_template.tpl
+++ b/view/tpl/viewcontact_template.tpl
@@ -1,15 +1,13 @@
-<div class="generic-content-wrapper generic-content-wrapper-styled">
-<h3>{{$title}}</h3>
-
-
-<div id="connections-wrapper">
-{{foreach $contacts as $contact}}
- {{include file="contact_template.tpl"}}
-{{/foreach}}
-<div id="page-end"></div>
-</div>
-<div id="view-contact-end"></div>
-{{$paginate}}
+<div class="generic-content-wrapper">
+ <div class="section-title-wrapper">
+ <h2>{{$title}}</h2>
+ </div>
+ <div class="section-content-wrapper clearfix">
+ {{foreach $contacts as $contact}}
+ {{include file="contact_template.tpl"}}
+ {{/foreach}}
+ <div id="page-end"></div>
+ </div>
</div>
<script>$(document).ready(function() { loadingPage = false;});</script>
<div id="page-spinner"></div>
diff --git a/view/tpl/webpage_export_list.tpl b/view/tpl/webpage_export_list.tpl
index 1d28f62df..b22b3818a 100644
--- a/view/tpl/webpage_export_list.tpl
+++ b/view/tpl/webpage_export_list.tpl
@@ -10,7 +10,7 @@
</div>
<div id="import-website-content-wrapper" class="section-content-wrapper">
<div class="pull-left">
- <button id="toggle-select-all" class="btn btn-xs btn-primary" onclick="checkedAll(window.isChecked); return false;"><i class="fa fa-check"></i>&nbsp;Toggle Select All</button>
+ <button id="toggle-select-all" class="btn btn-sm btn-primary" onclick="checkedAll(window.isChecked); return false;"><i class="fa fa-check"></i>&nbsp;Toggle Select All</button>
</div>
<div class="clear"></div>
<hr>
diff --git a/view/tpl/webpage_import.tpl b/view/tpl/webpage_import.tpl
index fdc983932..955288c1e 100644
--- a/view/tpl/webpage_import.tpl
+++ b/view/tpl/webpage_import.tpl
@@ -10,7 +10,7 @@
</div>
<div id="import-website-content-wrapper" class="section-content-wrapper">
<div class="pull-left">
- <button id="toggle-select-all" class="btn btn-xs btn-primary" onclick="checkedAll(window.isChecked); return false;"><i class="fa fa-check"></i>&nbsp;Toggle Select All</button>
+ <button id="toggle-select-all" class="btn btn-sm btn-primary" onclick="checkedAll(window.isChecked); return false;"><i class="fa fa-check"></i>&nbsp;Toggle Select All</button>
</div>
<div class="clear"></div>
<h4>Scanned Pages</h4>
diff --git a/view/tpl/webpagelist.tpl b/view/tpl/webpagelist.tpl
index 4dec7518f..fcf9de75a 100644
--- a/view/tpl/webpagelist.tpl
+++ b/view/tpl/webpagelist.tpl
@@ -2,7 +2,7 @@
<div class="section-title-wrapper">
{{if $editor}}
<div class="pull-right">
- <button id="webpage-create-btn" class="btn btn-xs btn-success acl-form-trigger" onclick="openClose('webpage-editor');" data-form_id="profile-jot-form"><i class="fa fa-pencil-square-o"></i>&nbsp;{{$create}}</button>
+ <button id="webpage-create-btn" class="btn btn-sm btn-success acl-form-trigger" onclick="openClose('webpage-editor');" data-form_id="profile-jot-form"><i class="fa fa-pencil-square-o"></i>&nbsp;{{$create}}</button>
</div>
{{/if}}
<h2>{{$listtitle}}</h2>
@@ -23,8 +23,8 @@
<th width="1%"></th>
<th width="1%"></th>
<th width="1%"></th>
- <th width="1%" class="hidden-xs">{{$created_txt}}</th>
- <th width="1%" class="hidden-xs">{{$edited_txt}}</th>
+ <th width="1%" class="d-none d-md-table-cell">{{$created_txt}}</th>
+ <th width="1%" class="d-none d-md-table-cell">{{$edited_txt}}</th>
</tr>
{{foreach $pages as $key => $items}}
{{foreach $items as $item}}
@@ -41,7 +41,7 @@
</td>
<td class="webpage-list-tool dropdown">
{{if $item.lockstate=='lock'}}
- <i class="fa fa-lock dropdown-toggle lockview" data-toggle="dropdown" onclick="lockview('item',{{$item.url}});" ></i>
+ <i class="fa fa-lock lockview" data-toggle="dropdown" onclick="lockview('item',{{$item.url}});" ></i>
<ul id="panel-{{$item.url}}" class="lockview-panel dropdown-menu"></ul>
{{/if}}
</td>
@@ -60,10 +60,10 @@
<a href="#" title="{{$delete}}" onclick="dropItem('item/drop/{{$item.url}}', '#webpage-list-item-{{$item.url}}'); return false;"><i class="fa fa-trash-o drop-icons"></i></a>
{{/if}}
</td>
- <td class="hidden-xs">
+ <td class="d-none d-md-table-cell">
{{$item.created}}
</td>
- <td class="hidden-xs">
+ <td class="d-none d-md-table-cell">
{{$item.edited}}
</td>
</tr>
diff --git a/view/tpl/website_portation_tools.tpl b/view/tpl/website_portation_tools.tpl
index 10468b64e..0d131cb17 100644
--- a/view/tpl/website_portation_tools.tpl
+++ b/view/tpl/website_portation_tools.tpl
@@ -1,72 +1,60 @@
<div id="website-portation-tools" class="widget">
- <ul class="nav nav-pills nav-stacked">
- <li>
- <a href="#" onclick="openClose('import-form');
- return false;"><i class="fa fa-cloud-upload generic-icons"></i> {{$import_label}}</a>
- </li>
- <li style="margin-left: 12px;" >
- <form id="import-form" enctype="multipart/form-data" method="post" action="" style="display: none;" class="sub-menu">
-
- <input type="hidden" name="action" value="scan">
-
- <p style="margin-top: 10px;" class="descriptive-text">{{$file_import_text}}</p>
- <div class="form-group">
- <div class="input-group">
- <input class="widget-input" type="text" name="path" title="{{$hint}}" placeholder="{{$desc}}" />
- <div class="input-group-btn">
- <button class="btn btn-default btn-sm" type="submit" name="cloudsubmit" value="{{$select}}"><i class="fa fa-folder-open generic-icons"></i></button>
- </div>
- </div>
- </div>
-
- <!-- Or upload a zipped file containing the website -->
- <p class="descriptive-text">{{$file_upload_text}}</p>
- <div class="form-group">
-
- <div class="input-group">
- <input class="widget-input" type="file" name="zip_file" />
- <div class="input-group-btn">
- <button class="btn btn-default btn-sm" type="submit" name="w_upload" value="w_upload"><i class="fa fa-file-archive-o generic-icons"></i></button>
- </div>
- </div>
- </div>
- </form>
- </li>
- </ul>
- <ul class="nav nav-pills nav-stacked">
- <li>
- <a href="#" onclick="openClose('export-form'); openClose('export-cloud-form');
- return false;"><i class="fa fa-share-square-o generic-icons"></i> {{$export_label}}</a>
- </li>
- <li style="margin-left: 12px;" >
- <form id="export-form" enctype="multipart/form-data" method="post" action="" style="display: none;" class="sub-menu">
- <input type="hidden" name="action" value="exportzipfile">
- <!-- Or download a zipped file containing the website -->
- <p style="margin-top: 10px;" class="descriptive-text">{{$file_download_text}}</p>
- <div class="form-group">
-
- <div class="input-group">
- <input class="widget-input" type="text" name="zipfilename" title="{{$filename_hint}}" placeholder="{{$filename_desc}}" value="" />
- <div class="input-group-btn">
- <button class="btn btn-default btn-sm" type="submit" name="w_download" value="w_download"><i class="fa fa-download generic-icons"></i></button>
- </div>
- </div>
- </div>
- </form>
- <form id="export-cloud-form" enctype="multipart/form-data" method="post" action="" style="display: none;" class="sub-menu">
- <input type="hidden" name="action" value="exportcloud">
- <!-- Or export the website elements to a cloud files folder -->
- <p style="margin-top: 10px;" class="descriptive-text">{{$cloud_export_text}}</p>
- <div class="form-group">
-
- <div class="input-group">
- <input class="widget-input" type="text" name="exportcloudpath" title="{{$cloud_export_hint}}" placeholder="{{$cloud_export_desc}}" />
- <div class="input-group-btn">
- <button class="btn btn-default btn-sm" type="submit" name="exportcloudsubmit" value="{{$cloud_export_select}}"><i class="fa fa-folder-open generic-icons"></i></button>
- </div>
- </div>
- </div>
- </form>
- </li>
- </ul>
+ <div class="nav nav-pills flex-column">
+ <a class="nav-link" href="#" onclick="openClose('import-form'); return false;"><i class="fa fa-cloud-upload generic-icons"></i> {{$import_label}}</a>
+ <div id="import-form" class="sub-menu-wrapper">
+ <div class="sub-menu">
+ <form enctype="multipart/form-data" method="post" action="">
+ <input type="hidden" name="action" value="scan">
+ <p class="descriptive-text">{{$file_import_text}}</p>
+ <div class="form-group">
+ <input class="form-control" type="text" name="path" title="{{$hint}}" placeholder="{{$desc}}" />
+ </div>
+ <div class="form-group">
+ <button class="btn btn-primary btn-sm" type="submit" name="cloudsubmit" value="{{$select}}">Submit</button>
+ </div>
+ <!-- Or upload a zipped file containing the website -->
+ <p class="descriptive-text">{{$file_upload_text}}</p>
+ <div class="form-group">
+ <input class="form-control-file w-100" type="file" name="zip_file" />
+ </div>
+ <div class="form-group">
+ <button class="btn btn-primary btn-sm" type="submit" name="w_upload" value="w_upload">Submit</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+ <div class="nav nav-pills flex-column">
+ <a class="nav-link" href="#" onclick="openClose('export-form'); openClose('export-cloud-form'); return false;"><i class="fa fa-share-square-o generic-icons"></i> {{$export_label}}</a>
+ <div id="export-form" class="sub-menu-wrapper">
+ <div class="sub-menu">
+ <form enctype="multipart/form-data" method="post" action="">
+ <input type="hidden" name="action" value="exportzipfile">
+ <!-- Or download a zipped file containing the website -->
+ <p class="descriptive-text">{{$file_download_text}}</p>
+ <div class="form-group">
+ <input class="form-control" type="text" name="zipfilename" title="{{$filename_hint}}" placeholder="{{$filename_desc}}" value="" />
+ </div>
+ <div class="form-group">
+ <button class="btn btn-primary btn-sm" type="submit" name="w_download" value="w_download">Submit</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ <div id="export-cloud-form" class="sub-menu-wrapper">
+ <div class="sub-menu">
+ <form enctype="multipart/form-data" method="post" action="">
+ <input type="hidden" name="action" value="exportcloud">
+ <!-- Or export the website elements to a cloud files folder -->
+ <p style="margin-top: 10px;" class="descriptive-text">{{$cloud_export_text}}</p>
+ <div class="form-group">
+ <input class="form-control" type="text" name="exportcloudpath" title="{{$cloud_export_hint}}" placeholder="{{$cloud_export_desc}}" />
+ </div>
+ <div class="form-group">
+ <button class="btn btn-primary btn-sm" type="submit" name="exportcloudsubmit" value="{{$cloud_export_select}}">Submit</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
</div>
diff --git a/view/tpl/wiki.tpl b/view/tpl/wiki.tpl
index ea31c23a3..564db3324 100644
--- a/view/tpl/wiki.tpl
+++ b/view/tpl/wiki.tpl
@@ -3,23 +3,19 @@
<div class="pull-right">
{{if $showPageControls}}
<div id="page-tools" class="btn-group" style="display: none;">
- <button type="button" class="btn btn-default btn-xs dropdown-toggle" data-toggle="dropdown">
- <i class="fa fa-caret-down"></i>&nbsp;{{$tools_label}}
+ <button type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown">
+ <i class="fa fa-cog"></i>&nbsp;{{$tools_label}}
</button>
- <ul class="dropdown-menu dropdown-menu-right">
+ <div class="dropdown-menu dropdown-menu-right">
{{if $renamePage}}
- <li class="nav-item">
- <a class="nav-link rename-page" href="#"><i class="fa fa-edit"></i>&nbsp;{{$renamePage}}</a>
- </li>
+ <a class="dropdown-item rename-page" href="#"><i class="fa fa-fw fa-edit"></i>&nbsp;{{$renamePage}}</a>
{{/if}}
- <li class="nav-item">
- <a id="embed-image" class="nav-link" href="#"><i class="fa fa-picture-o"></i>&nbsp;Embed Image</a>
- </li>
- </ul>
+ <a id="embed-image" class="dropdown-item" href="#"><i class="fa fa-fw fa-picture-o"></i>&nbsp;Embed Image</a>
+ </div>
</div>
{{/if}}
- <button id="fullscreen-btn" type="button" class="btn btn-default btn-xs" onclick="makeFullScreen(); adjustFullscreenEditorHeight();"><i class="fa fa-expand"></i></button>
- <button id="inline-btn" type="button" class="btn btn-default btn-xs" onclick="makeFullScreen(false); adjustInlineEditorHeight()"><i class="fa fa-compress"></i></button>
+ <button id="fullscreen-btn" type="button" class="btn btn-outline-secondary btn-sm" onclick="makeFullScreen(); adjustFullscreenEditorHeight();"><i class="fa fa-expand"></i></button>
+ <button id="inline-btn" type="button" class="btn btn-outline-secondary btn-sm" onclick="makeFullScreen(false); adjustInlineEditorHeight()"><i class="fa fa-compress"></i></button>
</div>
<h2>
<span id="wiki-header-name">{{$wikiheaderName}}</span>:
@@ -35,7 +31,7 @@
<button id="rename-page-submit" class="btn btn-primary" type="submit" name="submit">Submit</button>
</div>
<div>
- <button class="btn btn-default rename-page" type="button">Cancel</button>
+ <button class="btn btn-outline-secondary rename-page" type="button">Cancel</button>
</div>
<div class="clear"></div>
</div>
@@ -43,12 +39,12 @@
</div>
<div id="wiki-content-container" class="section-content-wrapper">
<ul class="nav nav-tabs" id="wiki-nav-tabs">
- <li id="edit-pane-tab"><a data-toggle="tab" href="#edit-pane">{{$editOrSourceLabel}}</a></li>
- <li class="active"><a data-toggle="tab" href="#preview-pane" id="wiki-get-preview">View</a></li>
- <li><a data-toggle="tab" href="#page-history-pane" id="wiki-get-history">History</a></li>
+ <li class="nav-item" id="edit-pane-tab"><a class="nav-link" data-toggle="tab" href="#edit-pane">{{$editOrSourceLabel}}</a></li>
+ <li class="nav-item"><a class="nav-link active" data-toggle="tab" href="#preview-pane" id="wiki-get-preview">View</a></li>
+ <li class="nav-item"><a class="nav-link" data-toggle="tab" href="#page-history-pane" id="wiki-get-history">History</a></li>
</ul>
<div class="tab-content" id="wiki-page-tabs">
- <div id="edit-pane" class="tab-pane fade">
+ <div id="edit-pane" class="tab-pane">
{{if !$mimeType || $mimeType == 'text/markdown'}}
<div id="ace-editor"></div>
{{else}}
@@ -60,21 +56,21 @@
<div>
<div id="id_{{$commitMsg.0}}_wrapper" class="field input">
<div class="input-group">
- <input class="widget-input" name="{{$commitMsg.0}}" id="id_{{$commitMsg.0}}" type="text" value="{{$commitMsg.2}}"{{if $commitMsg.5}} {{$commitMsg.5}}{{/if}}>
+ <input class="form-control form-control-sm" name="{{$commitMsg.0}}" id="id_{{$commitMsg.0}}" type="text" value="{{$commitMsg.2}}"{{if $commitMsg.5}} {{$commitMsg.5}}{{/if}}>
<div class="input-group-btn">
- <button id="save-page" type="button" class="btn btn-primary btn-sm disabled">Save</button>
+ <button id="save-page" type="button" class="btn btn-primary disabled">Save</button>
</div>
</div>
</div>
</div>
{{/if}}
</div>
- <div id="preview-pane" class="tab-pane fade in active">
+ <div id="preview-pane" class="tab-pane active">
<div id="wiki-preview">
{{$renderedContent}}
</div>
</div>
- <div id="page-history-pane" class="tab-pane fade">
+ <div id="page-history-pane" class="tab-pane">
<div id="page-history-list"></div>
</div>
</div>
@@ -87,17 +83,17 @@
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
- <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
<h4 class="modal-title" id="embedPhotoModalLabel">{{$embedPhotosModalTitle}}</h4>
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
</div>
<div class="modal-body" id="embedPhotoModalBody" >
- <div id="embedPhotoModalBodyAlbumListDialog" class="hide">
+ <div id="embedPhotoModalBodyAlbumListDialog" class="d-none">
<div id="embedPhotoModalBodyAlbumList"></div>
</div>
- <div id="embedPhotoModalBodyAlbumDialog" class="hide"></div>
+ <div id="embedPhotoModalBodyAlbumDialog" class="d-none"></div>
</div>
<div class="modal-footer">
- <button type="button" class="btn btn-default" data-dismiss="modal">{{$embedPhotosModalCancel}}</button>
+ <button type="button" class="btn btn-outline-secondary" data-dismiss="modal">{{$embedPhotosModalCancel}}</button>
<button id="embed-photo-OKButton" type="button" class="btn btn-primary">{{$embedPhotosModalOK}}</button>
</div>
</div><!-- /.modal-content -->
@@ -107,7 +103,7 @@
<script>
window.wiki_resource_id = '{{$resource_id}}';
window.wiki_page_name = '{{$page}}';
- window.wiki_page_content = `{{$content}}`;
+ window.wiki_page_content = '{{$content|escape:'javascript'}}';
window.wiki_page_commit = '{{$commit}}';
$("#generic-modal-ok-{{$wikiModalID}}").removeClass('btn-primary');
@@ -370,8 +366,8 @@
if (data['status']) {
$('#embedPhotoModalLabel').html("{{$modalchooseimages}}");
$('#embedPhotoModalBodyAlbumDialog').html('\
- <div><ul class="nav">\n\
- <li><a href="#" onclick="initializeEmbedPhotoDialog();return false;">\n\
+ <div><ul class="nav nav-pills flex-column">\n\
+ <li class="nav-item"><a class="nav-link" href="#" onclick="initializeEmbedPhotoDialog();return false;">\n\
<i class="fa fa-chevron-left"></i>&nbsp;\n\
{{$modaldiffalbum}}\n\
</a>\n\
@@ -386,8 +382,8 @@
$(imageparent).toggleClass('embed-photo-selected-photo');
}
});
- $('#embedPhotoModalBodyAlbumListDialog').addClass('hide');
- $('#embedPhotoModalBodyAlbumDialog').removeClass('hide');
+ $('#embedPhotoModalBodyAlbumListDialog').addClass('d-none');
+ $('#embedPhotoModalBodyAlbumDialog').removeClass('d-none');
$('#embed-photo-OKButton').click(function () {
$('.embed-photo-selected-photo').each(function (index) {
var href = $(this).attr('href');
@@ -426,17 +422,17 @@
if (data['status']) {
var albums = data['albumlist']; //JSON.parse(data['albumlist']);
$('#embedPhotoModalLabel').html("{{$modalchoosealbum}}");
- $('#embedPhotoModalBodyAlbumList').html('<ul class="nav"></ul>');
+ $('#embedPhotoModalBodyAlbumList').html('<ul class="nav nav-pills flex-column"></ul>');
for(var i = 0; i < albums.length; i++) {
var albumName = albums[i].text;
var jsAlbumName = albums[i].jstext;
- var albumLink = '<li>';
- albumLink += '<a href="#" onclick="choosePhotoFromAlbum(\'' + jsAlbumName + '\'); return false;">' + albumName + '</a>';
+ var albumLink = '<li class="nav-item">';
+ albumLink += '<a class="nav-link" href="#" onclick="choosePhotoFromAlbum(\'' + jsAlbumName + '\'); return false;">' + albumName + '</a>';
albumLink += '</li>';
$('#embedPhotoModalBodyAlbumList').find('ul').append(albumLink);
}
- $('#embedPhotoModalBodyAlbumDialog').addClass('hide');
- $('#embedPhotoModalBodyAlbumListDialog').removeClass('hide');
+ $('#embedPhotoModalBodyAlbumDialog').addClass('d-none');
+ $('#embedPhotoModalBodyAlbumListDialog').removeClass('d-none');
} else {
window.console.log("{{$modalerrorlist}}" + ':' + data['errormsg']);
}
diff --git a/view/tpl/wiki_page_history.tpl b/view/tpl/wiki_page_history.tpl
index ca16e8333..9e5ba0f9c 100644
--- a/view/tpl/wiki_page_history.tpl
+++ b/view/tpl/wiki_page_history.tpl
@@ -46,10 +46,10 @@
<tr><td width="10%">Date</td><td width="70%">{{$commit.date}}</td>
<td rowspan="3" width="20%" align="right">
{{if $permsWrite}}
- <button id="revert-{{$commit.hash}}" class="btn btn-danger btn-xs" onclick="wiki_revert_page('{{$commit.hash}}')">Revert</button>
+ <button id="revert-{{$commit.hash}}" class="btn btn-danger btn-sm" onclick="wiki_revert_page('{{$commit.hash}}')">Revert</button>
<br><br>
{{/if}}
- <button id="compare-{{$commit.hash}}" class="btn btn-warning btn-xs" onclick="wiki_compare_page('{{$commit.hash}}')">Compare</button>
+ <button id="compare-{{$commit.hash}}" class="btn btn-warning btn-sm" onclick="wiki_compare_page('{{$commit.hash}}')">Compare</button>
</td></tr>
<tr><td>Name</td><td>{{$commit.name}} &lt;{{$commit.email}}&gt;</td></tr>
<tr><td>Message</td><td>{{$commit.title}}</td></tr>
diff --git a/view/tpl/wiki_page_list.tpl b/view/tpl/wiki_page_list.tpl
index 78657ec10..44fba15cc 100644
--- a/view/tpl/wiki_page_list.tpl
+++ b/view/tpl/wiki_page_list.tpl
@@ -1,19 +1,19 @@
{{if $not_refresh}}<div id="wiki_page_list_container" {{if $hide}} style="display: none;" {{/if}}>{{/if}}
<div id="wiki_page_list" class="widget" >
<h3>{{$header}}</h3>
- <ul class="nav nav-pills nav-stacked">
+ <ul class="nav nav-pills flex-column">
{{if $pages}}
{{foreach $pages as $page}}
- <li id="{{$page.link_id}}">
+ <li class="nav-item nav-item-hack" id="{{$page.link_id}}">
{{if $page.resource_id && $candel}}
- <i class="widget-nav-pills-icons fa fa-trash-o drop-icons" onclick="wiki_delete_page('{{$page.title}}', '{{$page.url}}', '{{$page.resource_id}}', '{{$page.link_id}}')"></i>
+ <i class="nav-link widget-nav-pills-icons fa fa-trash-o drop-icons" onclick="wiki_delete_page('{{$page.title}}', '{{$page.url}}', '{{$page.resource_id}}', '{{$page.link_id}}')"></i>
{{/if}}
- <a href="/wiki/{{$channel}}/{{$wikiname}}/{{$page.url}}">{{$page.title}}</a>
+ <a class="nav-link" href="/wiki/{{$channel}}/{{$wikiname}}/{{$page.url}}">{{$page.title}}</a>
</li>
{{/foreach}}
{{/if}}
{{if $canadd}}
- <li><a href="#" onclick="wiki_show_new_page_form(); return false;"><i class="fa fa-plus-circle"></i>&nbsp;{{$addnew}}</a></li>
+ <li class="nav-item"><a class="nav-link" href="#" onclick="wiki_show_new_page_form(); return false;"><i class="fa fa-plus-circle"></i>&nbsp;{{$addnew}}</a></li>
{{/if}}
</ul>
{{if $canadd}}
diff --git a/view/tpl/wikilist.tpl b/view/tpl/wikilist.tpl
index 916552e03..2deec76c0 100644
--- a/view/tpl/wikilist.tpl
+++ b/view/tpl/wikilist.tpl
@@ -1,7 +1,7 @@
<div class="generic-content-wrapper">
- <div class="section-title-wrapper">
+ <div class="section-title-wrapper clearfix">
{{if $owner}}
- <button type="button" class="btn btn-success btn-xs pull-right acl-form-trigger" onclick="openClose('new-wiki-form-wrapper');" data-form_id="new-wiki-form"><i class="fa fa-plus-circle"></i>&nbsp;{{$create}}</button>
+ <button type="button" class="btn btn-success btn-sm pull-right acl-form-trigger" onclick="openClose('new-wiki-form-wrapper');" data-form_id="new-wiki-form"><i class="fa fa-plus-circle"></i>&nbsp;{{$create}}</button>
{{/if}}
<h2>{{$header}}</h2>
</div>
@@ -13,7 +13,7 @@
{{include file="field_checkbox.tpl" field=$notify}}
<div>
<div class="btn-group pull-right">
- <button id="dbtn-acl" class="btn btn-default btn-sm" data-toggle="modal" data-target="#aclModal" title="Permission settings" onclick="return false;">
+ <button id="dbtn-acl" class="btn btn-outline-secondary btn-sm" data-toggle="modal" data-target="#aclModal" title="Permission settings" onclick="return false;">
<i id="jot-perms-icon" class="fa fa-{{$lockstate}} jot-icons"></i>
</button>
<button id="new-wiki-submit" class="btn btn-primary btn-sm" type="submit" name="submit" >{{$submit}}</button>
@@ -41,7 +41,7 @@
<td>{{$wiki.mimeType}}</td>
<td class="wiki-index-tool dropdown">
{{if $wiki.lock}}
- <i class="fa fa-lock dropdown-toggle lockview" data-toggle="dropdown" onclick="lockview('item',{{$wiki.id}});"></i></button>
+ <i class="fa fa-lock lockview" data-toggle="dropdown" onclick="lockview('item',{{$wiki.id}});"></i></button>
<ul id="panel-{{$wiki.id}}" class="lockview-panel dropdown-menu dropdown-menu-right"></ul>
{{/if}}
</td>
diff --git a/view/tpl/wikilist_widget.tpl b/view/tpl/wikilist_widget.tpl
index 1f92b5807..9853f9850 100644
--- a/view/tpl/wikilist_widget.tpl
+++ b/view/tpl/wikilist_widget.tpl
@@ -1,8 +1,8 @@
<div id="wiki_list" class="widget">
<h3>{{$header}}</h3>
- <ul class="nav nav-pills nav-stacked">
+ <ul class="nav nav-pills flex-column">
{{foreach $wikis as $wiki}}
- <li><a href="/wiki/{{$channel}}/{{$wiki.urlName}}/Home" title="{{$view}}">{{$wiki.title}}</a></li>
+ <li class="nav-item"><a class="nav-link" href="/wiki/{{$channel}}/{{$wiki.urlName}}/Home" title="{{$view}}">{{$wiki.title}}</a></li>
{{/foreach}}
</ul>
</div>